mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2025-02-01 00:18:14 +01:00
Update:Replace library scan toast with task manager #1279
This commit is contained in:
parent
6f65350269
commit
bef6549805
@ -1,10 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="flex items-center px-1 overflow-hidden">
|
<div class="flex items-center px-1 overflow-hidden">
|
||||||
<div class="w-8 flex items-center justify-center">
|
<div class="w-8 flex items-center justify-center">
|
||||||
<!-- <div class="text-lg"> -->
|
|
||||||
<span v-if="isFinished" :class="taskIconStatus" class="material-icons text-base">{{ actionIcon }}</span>
|
<span v-if="isFinished" :class="taskIconStatus" class="material-icons text-base">{{ actionIcon }}</span>
|
||||||
<widgets-loading-spinner v-else />
|
<widgets-loading-spinner v-else />
|
||||||
<!-- </div> -->
|
|
||||||
</div>
|
</div>
|
||||||
<div class="flex-grow px-2 taskRunningCardContent">
|
<div class="flex-grow px-2 taskRunningCardContent">
|
||||||
<p class="truncate text-sm">{{ title }}</p>
|
<p class="truncate text-sm">{{ title }}</p>
|
||||||
@ -12,7 +10,9 @@
|
|||||||
<p class="truncate text-xs text-gray-300">{{ description }}</p>
|
<p class="truncate text-xs text-gray-300">{{ description }}</p>
|
||||||
|
|
||||||
<p v-if="isFailed && failedMessage" class="text-xs truncate text-red-500">{{ failedMessage }}</p>
|
<p v-if="isFailed && failedMessage" class="text-xs truncate text-red-500">{{ failedMessage }}</p>
|
||||||
|
<p v-else-if="!isFinished && cancelingScan" class="text-xs truncate">Canceling...</p>
|
||||||
</div>
|
</div>
|
||||||
|
<ui-btn v-if="userIsAdminOrUp && !isFinished && action === 'library-scan' && !cancelingScan" color="primary" :padding-y="1" :padding-x="1" class="text-xs w-16 max-w-16 truncate mr-1" @click.stop="cancelScan">{{ this.$strings.ButtonCancel }}</ui-btn>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -25,9 +25,14 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {}
|
return {
|
||||||
|
cancelingScan: false
|
||||||
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
userIsAdminOrUp() {
|
||||||
|
return this.$store.getters['user/getIsAdminOrUp']
|
||||||
|
},
|
||||||
title() {
|
title() {
|
||||||
return this.task.title || 'No Title'
|
return this.task.title || 'No Title'
|
||||||
},
|
},
|
||||||
@ -78,7 +83,17 @@ export default {
|
|||||||
return ''
|
return ''
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {},
|
methods: {
|
||||||
|
cancelScan() {
|
||||||
|
const libraryId = this.task?.data?.libraryId
|
||||||
|
if (!libraryId) {
|
||||||
|
console.error('No library id in library-scan task', this.task)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.cancelingScan = true
|
||||||
|
this.$root.socket.emit('cancel_scan', libraryId)
|
||||||
|
}
|
||||||
|
},
|
||||||
mounted() {}
|
mounted() {}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
@ -123,13 +123,6 @@ export default {
|
|||||||
init(payload) {
|
init(payload) {
|
||||||
console.log('Init Payload', payload)
|
console.log('Init Payload', payload)
|
||||||
|
|
||||||
// Start scans currently running
|
|
||||||
if (payload.librariesScanning) {
|
|
||||||
payload.librariesScanning.forEach((libraryScan) => {
|
|
||||||
this.scanStart(libraryScan)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove any current scans that are no longer running
|
// Remove any current scans that are no longer running
|
||||||
var currentScans = [...this.$store.state.scanners.libraryScans]
|
var currentScans = [...this.$store.state.scanners.libraryScans]
|
||||||
currentScans.forEach((ls) => {
|
currentScans.forEach((ls) => {
|
||||||
|
@ -18,7 +18,6 @@ const LibraryFile = require('../objects/files/LibraryFile')
|
|||||||
const PodcastEpisodeDownload = require('../objects/PodcastEpisodeDownload')
|
const PodcastEpisodeDownload = require('../objects/PodcastEpisodeDownload')
|
||||||
const PodcastEpisode = require('../objects/entities/PodcastEpisode')
|
const PodcastEpisode = require('../objects/entities/PodcastEpisode')
|
||||||
const AudioFile = require('../objects/files/AudioFile')
|
const AudioFile = require('../objects/files/AudioFile')
|
||||||
const Task = require("../objects/Task")
|
|
||||||
|
|
||||||
class PodcastManager {
|
class PodcastManager {
|
||||||
constructor(watcher, notificationManager) {
|
constructor(watcher, notificationManager) {
|
||||||
@ -70,14 +69,12 @@ class PodcastManager {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const task = new Task()
|
|
||||||
const taskDescription = `Downloading episode "${podcastEpisodeDownload.podcastEpisode.title}".`
|
const taskDescription = `Downloading episode "${podcastEpisodeDownload.podcastEpisode.title}".`
|
||||||
const taskData = {
|
const taskData = {
|
||||||
libraryId: podcastEpisodeDownload.libraryId,
|
libraryId: podcastEpisodeDownload.libraryId,
|
||||||
libraryItemId: podcastEpisodeDownload.libraryItemId,
|
libraryItemId: podcastEpisodeDownload.libraryItemId,
|
||||||
}
|
}
|
||||||
task.setData('download-podcast-episode', 'Downloading Episode', taskDescription, false, taskData)
|
const task = TaskManager.createAndAddTask('download-podcast-episode', 'Downloading Episode', taskDescription, false, taskData)
|
||||||
TaskManager.addTask(task)
|
|
||||||
|
|
||||||
SocketAuthority.emitter('episode_download_started', podcastEpisodeDownload.toJSONForClient())
|
SocketAuthority.emitter('episode_download_started', podcastEpisodeDownload.toJSONForClient())
|
||||||
this.currentDownload = podcastEpisodeDownload
|
this.currentDownload = podcastEpisodeDownload
|
||||||
|
@ -28,5 +28,21 @@ class TaskManager {
|
|||||||
SocketAuthority.emitter('task_finished', task.toJSON())
|
SocketAuthority.emitter('task_finished', task.toJSON())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create new task and add
|
||||||
|
*
|
||||||
|
* @param {string} action
|
||||||
|
* @param {string} title
|
||||||
|
* @param {string} description
|
||||||
|
* @param {boolean} showSuccess
|
||||||
|
* @param {Object} [data]
|
||||||
|
*/
|
||||||
|
createAndAddTask(action, title, description, showSuccess, data = {}) {
|
||||||
|
const task = new Task()
|
||||||
|
task.setData(action, title, description, showSuccess, data)
|
||||||
|
this.addTask(task)
|
||||||
|
return task
|
||||||
|
}
|
||||||
}
|
}
|
||||||
module.exports = new TaskManager()
|
module.exports = new TaskManager()
|
@ -6,7 +6,7 @@ const date = require('../libs/dateAndTime')
|
|||||||
const Logger = require('../Logger')
|
const Logger = require('../Logger')
|
||||||
const Library = require('../objects/Library')
|
const Library = require('../objects/Library')
|
||||||
const { LogLevel } = require('../utils/constants')
|
const { LogLevel } = require('../utils/constants')
|
||||||
const { secondsToTimestamp } = require('../utils/index')
|
const { secondsToTimestamp, elapsedPretty } = require('../utils/index')
|
||||||
|
|
||||||
class LibraryScan {
|
class LibraryScan {
|
||||||
constructor() {
|
constructor() {
|
||||||
@ -67,6 +67,15 @@ class LibraryScan {
|
|||||||
get logFilename() {
|
get logFilename() {
|
||||||
return date.format(new Date(), 'YYYY-MM-DD') + '_' + this.id + '.txt'
|
return date.format(new Date(), 'YYYY-MM-DD') + '_' + this.id + '.txt'
|
||||||
}
|
}
|
||||||
|
get scanResultsString() {
|
||||||
|
if (this.error) return this.error
|
||||||
|
const strs = []
|
||||||
|
if (this.resultsAdded) strs.push(`${this.resultsAdded} added`)
|
||||||
|
if (this.resultsUpdated) strs.push(`${this.resultsUpdated} updated`)
|
||||||
|
if (this.resultsMissing) strs.push(`${this.resultsMissing} missing`)
|
||||||
|
if (!strs.length) return `Everything was up to date (${elapsedPretty(this.elapsed / 1000)})`
|
||||||
|
return strs.join(', ') + ` (${elapsedPretty(this.elapsed / 1000)})`
|
||||||
|
}
|
||||||
|
|
||||||
toJSON() {
|
toJSON() {
|
||||||
return {
|
return {
|
||||||
|
@ -9,6 +9,7 @@ const fileUtils = require('../utils/fileUtils')
|
|||||||
const scanUtils = require('../utils/scandir')
|
const scanUtils = require('../utils/scandir')
|
||||||
const { LogLevel, ScanResult } = require('../utils/constants')
|
const { LogLevel, ScanResult } = require('../utils/constants')
|
||||||
const libraryFilters = require('../utils/queries/libraryFilters')
|
const libraryFilters = require('../utils/queries/libraryFilters')
|
||||||
|
const TaskManager = require('../managers/TaskManager')
|
||||||
const LibraryItemScanner = require('./LibraryItemScanner')
|
const LibraryItemScanner = require('./LibraryItemScanner')
|
||||||
const LibraryScan = require('./LibraryScan')
|
const LibraryScan = require('./LibraryScan')
|
||||||
const LibraryItemScanData = require('./LibraryItemScanData')
|
const LibraryItemScanData = require('./LibraryItemScanData')
|
||||||
@ -68,7 +69,12 @@ class LibraryScanner {
|
|||||||
libraryScan.verbose = true
|
libraryScan.verbose = true
|
||||||
this.librariesScanning.push(libraryScan.getScanEmitData)
|
this.librariesScanning.push(libraryScan.getScanEmitData)
|
||||||
|
|
||||||
SocketAuthority.emitter('scan_start', libraryScan.getScanEmitData)
|
const taskData = {
|
||||||
|
libraryId: library.id,
|
||||||
|
libraryName: library.name,
|
||||||
|
libraryMediaType: library.mediaType
|
||||||
|
}
|
||||||
|
const task = TaskManager.createAndAddTask('library-scan', `Scanning "${library.name}" library`, null, true, taskData)
|
||||||
|
|
||||||
Logger.info(`[LibraryScanner] Starting${forceRescan ? ' (forced)' : ''} library scan ${libraryScan.id} for ${libraryScan.libraryName}`)
|
Logger.info(`[LibraryScanner] Starting${forceRescan ? ' (forced)' : ''} library scan ${libraryScan.id} for ${libraryScan.libraryName}`)
|
||||||
|
|
||||||
@ -85,9 +91,11 @@ class LibraryScanner {
|
|||||||
this.librariesScanning = this.librariesScanning.filter(ls => ls.id !== library.id)
|
this.librariesScanning = this.librariesScanning.filter(ls => ls.id !== library.id)
|
||||||
|
|
||||||
if (canceled && !libraryScan.totalResults) {
|
if (canceled && !libraryScan.totalResults) {
|
||||||
|
task.setFinished('Scan canceled')
|
||||||
|
TaskManager.taskFinished(task)
|
||||||
|
|
||||||
const emitData = libraryScan.getScanEmitData
|
const emitData = libraryScan.getScanEmitData
|
||||||
emitData.results = null
|
emitData.results = null
|
||||||
SocketAuthority.emitter('scan_complete', emitData)
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -98,7 +106,8 @@ class LibraryScanner {
|
|||||||
}
|
}
|
||||||
await Database.libraryModel.updateFromOld(library)
|
await Database.libraryModel.updateFromOld(library)
|
||||||
|
|
||||||
SocketAuthority.emitter('scan_complete', libraryScan.getScanEmitData)
|
task.setFinished(libraryScan.scanResultsString)
|
||||||
|
TaskManager.taskFinished(task)
|
||||||
|
|
||||||
if (libraryScan.totalResults) {
|
if (libraryScan.totalResults) {
|
||||||
libraryScan.saveLog()
|
libraryScan.saveLog()
|
||||||
|
@ -65,6 +65,9 @@ module.exports.getId = (prepend = '') => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function elapsedPretty(seconds) {
|
function elapsedPretty(seconds) {
|
||||||
|
if (seconds > 0 && seconds < 1) {
|
||||||
|
return `${Math.floor(seconds * 1000)} ms`
|
||||||
|
}
|
||||||
if (seconds < 60) {
|
if (seconds < 60) {
|
||||||
return `${Math.floor(seconds)} sec`
|
return `${Math.floor(seconds)} sec`
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user