diff --git a/client/components/cards/ItemTaskRunningCard.vue b/client/components/cards/ItemTaskRunningCard.vue index 63a3644d..c9de1a87 100644 --- a/client/components/cards/ItemTaskRunningCard.vue +++ b/client/components/cards/ItemTaskRunningCard.vue @@ -1,10 +1,8 @@ @@ -25,9 +25,14 @@ export default { } }, data() { - return {} + return { + cancelingScan: false + } }, computed: { + userIsAdminOrUp() { + return this.$store.getters['user/getIsAdminOrUp'] + }, title() { return this.task.title || 'No Title' }, @@ -78,7 +83,17 @@ export default { 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() {} } diff --git a/client/layouts/default.vue b/client/layouts/default.vue index 2817f23f..5ff34439 100644 --- a/client/layouts/default.vue +++ b/client/layouts/default.vue @@ -123,13 +123,6 @@ export default { init(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 var currentScans = [...this.$store.state.scanners.libraryScans] currentScans.forEach((ls) => { diff --git a/server/managers/PodcastManager.js b/server/managers/PodcastManager.js index 7b6ff845..6e91a0aa 100644 --- a/server/managers/PodcastManager.js +++ b/server/managers/PodcastManager.js @@ -18,7 +18,6 @@ const LibraryFile = require('../objects/files/LibraryFile') const PodcastEpisodeDownload = require('../objects/PodcastEpisodeDownload') const PodcastEpisode = require('../objects/entities/PodcastEpisode') const AudioFile = require('../objects/files/AudioFile') -const Task = require("../objects/Task") class PodcastManager { constructor(watcher, notificationManager) { @@ -70,14 +69,12 @@ class PodcastManager { return } - const task = new Task() const taskDescription = `Downloading episode "${podcastEpisodeDownload.podcastEpisode.title}".` const taskData = { libraryId: podcastEpisodeDownload.libraryId, libraryItemId: podcastEpisodeDownload.libraryItemId, } - task.setData('download-podcast-episode', 'Downloading Episode', taskDescription, false, taskData) - TaskManager.addTask(task) + const task = TaskManager.createAndAddTask('download-podcast-episode', 'Downloading Episode', taskDescription, false, taskData) SocketAuthority.emitter('episode_download_started', podcastEpisodeDownload.toJSONForClient()) this.currentDownload = podcastEpisodeDownload diff --git a/server/managers/TaskManager.js b/server/managers/TaskManager.js index 747ded08..31cf06a1 100644 --- a/server/managers/TaskManager.js +++ b/server/managers/TaskManager.js @@ -28,5 +28,21 @@ class TaskManager { 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() \ No newline at end of file diff --git a/server/scanner/LibraryScan.js b/server/scanner/LibraryScan.js index 88562e2c..1dc945fb 100644 --- a/server/scanner/LibraryScan.js +++ b/server/scanner/LibraryScan.js @@ -6,7 +6,7 @@ const date = require('../libs/dateAndTime') const Logger = require('../Logger') const Library = require('../objects/Library') const { LogLevel } = require('../utils/constants') -const { secondsToTimestamp } = require('../utils/index') +const { secondsToTimestamp, elapsedPretty } = require('../utils/index') class LibraryScan { constructor() { @@ -67,6 +67,15 @@ class LibraryScan { get logFilename() { 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() { return { diff --git a/server/scanner/LibraryScanner.js b/server/scanner/LibraryScanner.js index 44ccdd05..b7f9093e 100644 --- a/server/scanner/LibraryScanner.js +++ b/server/scanner/LibraryScanner.js @@ -9,6 +9,7 @@ const fileUtils = require('../utils/fileUtils') const scanUtils = require('../utils/scandir') const { LogLevel, ScanResult } = require('../utils/constants') const libraryFilters = require('../utils/queries/libraryFilters') +const TaskManager = require('../managers/TaskManager') const LibraryItemScanner = require('./LibraryItemScanner') const LibraryScan = require('./LibraryScan') const LibraryItemScanData = require('./LibraryItemScanData') @@ -68,7 +69,12 @@ class LibraryScanner { libraryScan.verbose = true 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}`) @@ -85,9 +91,11 @@ class LibraryScanner { this.librariesScanning = this.librariesScanning.filter(ls => ls.id !== library.id) if (canceled && !libraryScan.totalResults) { + task.setFinished('Scan canceled') + TaskManager.taskFinished(task) + const emitData = libraryScan.getScanEmitData emitData.results = null - SocketAuthority.emitter('scan_complete', emitData) return } @@ -98,7 +106,8 @@ class LibraryScanner { } await Database.libraryModel.updateFromOld(library) - SocketAuthority.emitter('scan_complete', libraryScan.getScanEmitData) + task.setFinished(libraryScan.scanResultsString) + TaskManager.taskFinished(task) if (libraryScan.totalResults) { libraryScan.saveLog() diff --git a/server/utils/index.js b/server/utils/index.js index abcc626c..84167229 100644 --- a/server/utils/index.js +++ b/server/utils/index.js @@ -65,6 +65,9 @@ module.exports.getId = (prepend = '') => { } function elapsedPretty(seconds) { + if (seconds > 0 && seconds < 1) { + return `${Math.floor(seconds * 1000)} ms` + } if (seconds < 60) { return `${Math.floor(seconds)} sec` }