audiobookshelf-atv/store/downloads.js

124 lines
No EOL
3.7 KiB
JavaScript

import { Capacitor } from '@capacitor/core'
export const state = () => ({
downloads: [],
showModal: false,
mediaScanResults: {},
})
export const getters = {
getDownload: (state) => id => {
return state.downloads.find(d => d.id === id)
},
getDownloads: state => {
return state.downloads
},
getDownloadIfReady: (state) => id => {
var download = state.downloads.find(d => d.id === id)
return !!download && !download.isDownloading && !download.isPreparing ? download : null
},
getAudiobooks: (state) => {
return state.downloads.map(dl => dl.audiobook)
}
}
export const actions = {
async loadFromStorage({ commit, state }) {
var downloads = await this.$sqlStore.getAllDownloads()
console.log('Load downloads from storage', downloads.length)
downloads.forEach(ab => {
if (ab.isDownloading || ab.isPreparing) {
ab.isIncomplete = true
}
ab.isDownloading = false
ab.isPreparing = false
commit('setDownload', ab)
})
return state.downloads
},
async linkOrphanDownloads({ state, commit, rootState }) {
if (!state.mediaScanResults || !state.mediaScanResults.folders) {
return
}
for (let i = 0; i < state.mediaScanResults.folders.length; i++) {
var folder = state.mediaScanResults.folders[i]
if (!folder.files || !folder.files.length) return
var download = state.downloads.find(dl => dl.folderName === folder.name)
if (!download) {
var results = await this.$axios.$get(`/api/libraries/${rootState.libraries.currentLibraryId}/search?q=${folder.name}`)
var matchingAb = null
if (results && results.audiobooks) {
matchingAb = results.audiobooks.find(ab => {
return ab.audiobook.book.title === folder.name
})
}
if (matchingAb) {
matchingAb = matchingAb.audiobook
// Found matching download for ab
var audioFile = folder.files.find(f => f.isAudio)
if (!audioFile) {
return
}
var coverImg = folder.files.find(f => !f.isAudio)
const downloadObj = {
id: matchingAb.id,
audiobook: { ...matchingAb },
contentUrl: audioFile.uri,
simplePath: audioFile.simplePath,
folderUrl: folder.uri,
folderName: folder.name,
storageType: '',
storageId: '',
basePath: '',
size: audioFile.size,
coverUrl: coverImg ? coverImg.uri : null,
cover: coverImg ? Capacitor.convertFileSrc(coverImg.uri) : null,
coverSize: coverImg ? coverImg.size : 0,
coverBasePath: ''
}
commit('addUpdateDownload', downloadObj)
}
}
}
}
}
export const mutations = {
setShowModal(state, val) {
state.showModal = val
},
setDownload(state, download) {
if (!download || !download.id) {
return
}
var index = state.downloads.findIndex(d => d.id === download.id)
if (index >= 0) {
state.downloads.splice(index, 1, download)
} else {
state.downloads.push(download)
}
},
addUpdateDownload(state, download) {
if (!download || !download.id) {
console.error('Orphan invalid download ' + download.id)
return
}
var index = state.downloads.findIndex(d => d.id === download.id)
if (index >= 0) {
state.downloads.splice(index, 1, download)
} else {
state.downloads.push(download)
}
this.$sqlStore.setDownload(download)
},
removeDownload(state, download) {
state.downloads = state.downloads.filter(d => d.id !== download.id)
this.$sqlStore.removeDownload(download.id)
},
setMediaScanResults(state, val) {
state.mediaScanResults = val
}
}