mirror of
https://github.com/advplyr/audiobookshelf-app.git
synced 2025-06-20 20:05:44 +02:00
224 lines
7.3 KiB
JavaScript
224 lines
7.3 KiB
JavaScript
export const state = () => ({
|
|
isModalOpen: false,
|
|
itemDownloads: [],
|
|
bookshelfListView: false,
|
|
series: null,
|
|
localMediaProgress: [],
|
|
lastSearch: null,
|
|
jumpForwardItems: [
|
|
{
|
|
icon: 'forward_5',
|
|
value: 5
|
|
},
|
|
{
|
|
icon: 'forward_10',
|
|
value: 10
|
|
},
|
|
{
|
|
icon: 'forward_30',
|
|
value: 30
|
|
}
|
|
],
|
|
jumpBackwardsItems: [
|
|
{
|
|
icon: 'replay_5',
|
|
value: 5
|
|
},
|
|
{
|
|
icon: 'replay_10',
|
|
value: 10
|
|
},
|
|
{
|
|
icon: 'replay_30',
|
|
value: 30
|
|
}
|
|
],
|
|
libraryIcons: ['database', 'audiobookshelf', 'books-1', 'books-2', 'book-1', 'microphone-1', 'microphone-3', 'radio', 'podcast', 'rss', 'headphones', 'music', 'file-picture', 'rocket', 'power', 'star', 'heart'],
|
|
selectedPlaylistItems: [],
|
|
showPlaylistsAddCreateModal: false,
|
|
showSelectLocalFolderModal: false,
|
|
localFolderSelectData: null,
|
|
hapticFeedback: 'LIGHT',
|
|
showRSSFeedOpenCloseModal: false,
|
|
rssFeedEntity: null
|
|
})
|
|
|
|
export const getters = {
|
|
getDownloadItem:
|
|
(state) =>
|
|
(libraryItemId, episodeId = null) => {
|
|
return state.itemDownloads.find((i) => {
|
|
// if (episodeId && !i.episodes.some(e => e.id == episodeId)) return false
|
|
if (episodeId && i.episodeId !== episodeId) return false
|
|
return i.libraryItemId == libraryItemId
|
|
})
|
|
},
|
|
getLibraryItemCoverSrc:
|
|
(state, getters, rootState, rootGetters) =>
|
|
(libraryItem, placeholder, raw = false) => {
|
|
if (!libraryItem) return placeholder
|
|
const media = libraryItem.media
|
|
if (!media || !media.coverPath || media.coverPath === placeholder) return placeholder
|
|
|
|
// Absolute URL covers (should no longer be used)
|
|
if (media.coverPath.startsWith('http:') || media.coverPath.startsWith('https:')) return media.coverPath
|
|
|
|
const serverAddress = rootGetters['user/getServerAddress']
|
|
if (!serverAddress) return placeholder
|
|
|
|
const lastUpdate = libraryItem.updatedAt || Date.now()
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
// Testing
|
|
// return `http://localhost:3333/api/items/${libraryItem.id}/cover?ts=${lastUpdate}`
|
|
}
|
|
|
|
const url = new URL(`${serverAddress}/api/items/${libraryItem.id}/cover`)
|
|
const urlQuery = new URLSearchParams()
|
|
urlQuery.append('ts', lastUpdate)
|
|
if (raw) urlQuery.append('raw', '1')
|
|
if (rootGetters.getDoesServerImagesRequireToken) {
|
|
urlQuery.append('token', rootGetters['user/getToken'])
|
|
}
|
|
return `${url}?${urlQuery}`
|
|
},
|
|
getLibraryItemCoverSrcById:
|
|
(state, getters, rootState, rootGetters) =>
|
|
(libraryItemId, placeholder = null) => {
|
|
if (!placeholder) placeholder = `${rootState.routerBasePath}/book_placeholder.jpg`
|
|
if (!libraryItemId) return placeholder
|
|
const serverAddress = rootGetters['user/getServerAddress']
|
|
if (!serverAddress) return placeholder
|
|
|
|
const url = new URL(`${serverAddress}/api/items/${libraryItemId}/cover`)
|
|
if (rootGetters.getDoesServerImagesRequireToken) {
|
|
return `${url}?token=${rootGetters['user/getToken']}`
|
|
}
|
|
return url.toString()
|
|
},
|
|
getLocalMediaProgressById:
|
|
(state) =>
|
|
(localLibraryItemId, episodeId = null) => {
|
|
return state.localMediaProgress.find((lmp) => {
|
|
if (episodeId != null && lmp.localEpisodeId != episodeId) return false
|
|
return lmp.localLibraryItemId == localLibraryItemId
|
|
})
|
|
},
|
|
getLocalMediaProgressByServerItemId:
|
|
(state) =>
|
|
(libraryItemId, episodeId = null) => {
|
|
return state.localMediaProgress.find((lmp) => {
|
|
if (episodeId != null && lmp.episodeId != episodeId) return false
|
|
return lmp.libraryItemId == libraryItemId
|
|
})
|
|
},
|
|
getJumpForwardIcon: (state) => (jumpForwardTime) => {
|
|
const item = state.jumpForwardItems.find((i) => i.value == jumpForwardTime)
|
|
return item ? item.icon : 'forward_10'
|
|
},
|
|
getJumpBackwardsIcon: (state) => (jumpBackwardsTime) => {
|
|
const item = state.jumpBackwardsItems.find((i) => i.value == jumpBackwardsTime)
|
|
return item ? item.icon : 'replay_10'
|
|
}
|
|
}
|
|
|
|
export const actions = {
|
|
async loadLocalMediaProgress({ state, commit }) {
|
|
const mediaProgress = await this.$db.getAllLocalMediaProgress()
|
|
commit('setLocalMediaProgress', mediaProgress)
|
|
}
|
|
}
|
|
|
|
export const mutations = {
|
|
setIsModalOpen(state, val) {
|
|
state.isModalOpen = val
|
|
},
|
|
addUpdateItemDownload(state, downloadItem) {
|
|
var index = state.itemDownloads.findIndex((i) => i.id == downloadItem.id)
|
|
if (index >= 0) {
|
|
state.itemDownloads.splice(index, 1, downloadItem)
|
|
} else {
|
|
state.itemDownloads.push(downloadItem)
|
|
}
|
|
},
|
|
updateDownloadItemPart(state, downloadItemPart) {
|
|
const downloadItem = state.itemDownloads.find((i) => i.id == downloadItemPart.downloadItemId)
|
|
if (!downloadItem) {
|
|
console.error('updateDownloadItemPart: Download item not found for itemPart', JSON.stringify(downloadItemPart))
|
|
return
|
|
}
|
|
|
|
let totalBytes = 0
|
|
let totalBytesDownloaded = 0
|
|
downloadItem.downloadItemParts = downloadItem.downloadItemParts.map((dip) => {
|
|
let newDip = dip.id == downloadItemPart.id ? downloadItemPart : dip
|
|
|
|
totalBytes += newDip.completed ? Number(newDip.bytesDownloaded) : Number(newDip.fileSize)
|
|
totalBytesDownloaded += Number(newDip.bytesDownloaded)
|
|
|
|
return newDip
|
|
})
|
|
|
|
if (totalBytes > 0) {
|
|
downloadItem.itemProgress = Math.min(1, totalBytesDownloaded / totalBytes)
|
|
console.log(`updateDownloadItemPart: filename=${downloadItemPart.filename}, totalBytes=${totalBytes}, downloaded=${totalBytesDownloaded}, itemProgress=${downloadItem.itemProgress}`)
|
|
} else {
|
|
downloadItem.itemProgress = 0
|
|
}
|
|
},
|
|
removeItemDownload(state, id) {
|
|
state.itemDownloads = state.itemDownloads.filter((i) => i.id != id)
|
|
},
|
|
setBookshelfListView(state, val) {
|
|
state.bookshelfListView = val
|
|
},
|
|
setSeries(state, val) {
|
|
state.series = val
|
|
},
|
|
setLocalMediaProgress(state, val) {
|
|
state.localMediaProgress = val
|
|
},
|
|
updateLocalMediaProgress(state, prog) {
|
|
if (!prog || !prog.id) {
|
|
return
|
|
}
|
|
var index = state.localMediaProgress.findIndex((lmp) => lmp.id == prog.id)
|
|
if (index >= 0) {
|
|
state.localMediaProgress.splice(index, 1, prog)
|
|
} else {
|
|
state.localMediaProgress.push(prog)
|
|
}
|
|
},
|
|
removeLocalMediaProgress(state, id) {
|
|
state.localMediaProgress = state.localMediaProgress.filter((lmp) => lmp.id != id)
|
|
},
|
|
removeLocalMediaProgressForItem(state, llid) {
|
|
state.localMediaProgress = state.localMediaProgress.filter((lmp) => lmp.localLibraryItemId !== llid)
|
|
},
|
|
setLastSearch(state, val) {
|
|
state.lastSearch = val
|
|
},
|
|
setSelectedPlaylistItems(state, items) {
|
|
state.selectedPlaylistItems = items
|
|
},
|
|
setShowPlaylistsAddCreateModal(state, val) {
|
|
state.showPlaylistsAddCreateModal = val
|
|
},
|
|
showSelectLocalFolderModal(state, data) {
|
|
state.localFolderSelectData = data
|
|
state.showSelectLocalFolderModal = true
|
|
},
|
|
setShowSelectLocalFolderModal(state, val) {
|
|
state.showSelectLocalFolderModal = val
|
|
},
|
|
setHapticFeedback(state, val) {
|
|
state.hapticFeedback = val || 'LIGHT'
|
|
},
|
|
setShowRSSFeedOpenCloseModal(state, val) {
|
|
state.showRSSFeedOpenCloseModal = val
|
|
},
|
|
setRSSFeedOpenCloseModal(state, entity) {
|
|
state.rssFeedEntity = entity
|
|
state.showRSSFeedOpenCloseModal = true
|
|
}
|
|
}
|