mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2025-02-14 09:19:57 +01:00
Fix:Cleanup media progress when deleting podcasts, remove usage of old user model
This commit is contained in:
parent
642cf232ba
commit
a55c167dde
@ -469,11 +469,6 @@ class Database {
|
|||||||
return updated
|
return updated
|
||||||
}
|
}
|
||||||
|
|
||||||
async removeLibraryItem(libraryItemId) {
|
|
||||||
if (!this.sequelize) return false
|
|
||||||
await this.models.libraryItem.removeById(libraryItemId)
|
|
||||||
}
|
|
||||||
|
|
||||||
async createFeed(oldFeed) {
|
async createFeed(oldFeed) {
|
||||||
if (!this.sequelize) return false
|
if (!this.sequelize) return false
|
||||||
await this.models.feed.fullCreateFromOld(oldFeed)
|
await this.models.feed.fullCreateFromOld(oldFeed)
|
||||||
|
@ -76,10 +76,21 @@ class LibraryItemController {
|
|||||||
res.json(libraryItem.toJSON())
|
res.json(libraryItem.toJSON())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DELETE: /api/items/:id
|
||||||
|
* Delete library item. Will delete from database and file system if hard delete is requested.
|
||||||
|
* Optional query params:
|
||||||
|
* ?hard=1
|
||||||
|
*
|
||||||
|
* @param {import('express').Request} req
|
||||||
|
* @param {import('express').Response} res
|
||||||
|
*/
|
||||||
async delete(req, res) {
|
async delete(req, res) {
|
||||||
const hardDelete = req.query.hard == 1 // Delete from file system
|
const hardDelete = req.query.hard == 1 // Delete from file system
|
||||||
const libraryItemPath = req.libraryItem.path
|
const libraryItemPath = req.libraryItem.path
|
||||||
await this.handleDeleteLibraryItem(req.libraryItem.mediaType, req.libraryItem.id, [req.libraryItem.media.id])
|
|
||||||
|
const mediaItemIds = req.libraryItem.mediaType === 'podcast' ? req.libraryItem.media.episodes.map((ep) => ep.id) : [req.libraryItem.media.id]
|
||||||
|
await this.handleDeleteLibraryItem(req.libraryItem.mediaType, req.libraryItem.id, mediaItemIds)
|
||||||
if (hardDelete) {
|
if (hardDelete) {
|
||||||
Logger.info(`[LibraryItemController] Deleting library item from file system at "${libraryItemPath}"`)
|
Logger.info(`[LibraryItemController] Deleting library item from file system at "${libraryItemPath}"`)
|
||||||
await fs.remove(libraryItemPath).catch((error) => {
|
await fs.remove(libraryItemPath).catch((error) => {
|
||||||
@ -366,7 +377,15 @@ class LibraryItemController {
|
|||||||
res.json(matchResult)
|
res.json(matchResult)
|
||||||
}
|
}
|
||||||
|
|
||||||
// POST: api/items/batch/delete
|
/**
|
||||||
|
* POST: /api/items/batch/delete
|
||||||
|
* Batch delete library items. Will delete from database and file system if hard delete is requested.
|
||||||
|
* Optional query params:
|
||||||
|
* ?hard=1
|
||||||
|
*
|
||||||
|
* @param {import('express').Request} req
|
||||||
|
* @param {import('express').Response} res
|
||||||
|
*/
|
||||||
async batchDelete(req, res) {
|
async batchDelete(req, res) {
|
||||||
if (!req.user.canDelete) {
|
if (!req.user.canDelete) {
|
||||||
Logger.warn(`[LibraryItemController] User attempted to delete without permission`, req.user)
|
Logger.warn(`[LibraryItemController] User attempted to delete without permission`, req.user)
|
||||||
@ -391,7 +410,8 @@ class LibraryItemController {
|
|||||||
for (const libraryItem of itemsToDelete) {
|
for (const libraryItem of itemsToDelete) {
|
||||||
const libraryItemPath = libraryItem.path
|
const libraryItemPath = libraryItem.path
|
||||||
Logger.info(`[LibraryItemController] Deleting Library Item "${libraryItem.media.metadata.title}"`)
|
Logger.info(`[LibraryItemController] Deleting Library Item "${libraryItem.media.metadata.title}"`)
|
||||||
await this.handleDeleteLibraryItem(libraryItem.mediaType, libraryItem.id, [libraryItem.media.id])
|
const mediaItemIds = libraryItem.mediaType === 'podcast' ? libraryItem.media.episodes.map((ep) => ep.id) : [libraryItem.media.id]
|
||||||
|
await this.handleDeleteLibraryItem(libraryItem.mediaType, libraryItem.id, mediaItemIds)
|
||||||
if (hardDelete) {
|
if (hardDelete) {
|
||||||
Logger.info(`[LibraryItemController] Deleting library item from file system at "${libraryItemPath}"`)
|
Logger.info(`[LibraryItemController] Deleting library item from file system at "${libraryItemPath}"`)
|
||||||
await fs.remove(libraryItemPath).catch((error) => {
|
await fs.remove(libraryItemPath).catch((error) => {
|
||||||
@ -738,7 +758,7 @@ class LibraryItemController {
|
|||||||
return res.sendStatus(404)
|
return res.sendStatus(404)
|
||||||
}
|
}
|
||||||
const ebookFilePath = ebookFile.metadata.path
|
const ebookFilePath = ebookFile.metadata.path
|
||||||
|
|
||||||
Logger.info(`[LibraryItemController] User "${req.user.username}" requested download for item "${req.libraryItem.media.metadata.title}" ebook at "${ebookFilePath}"`)
|
Logger.info(`[LibraryItemController] User "${req.user.username}" requested download for item "${req.libraryItem.media.metadata.title}" ebook at "${ebookFilePath}"`)
|
||||||
|
|
||||||
if (global.XAccel) {
|
if (global.XAccel) {
|
||||||
@ -781,6 +801,12 @@ class LibraryItemController {
|
|||||||
res.sendStatus(200)
|
res.sendStatus(200)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {import('express').Request} req
|
||||||
|
* @param {import('express').Response} res
|
||||||
|
* @param {import('express').NextFunction} next
|
||||||
|
*/
|
||||||
async middleware(req, res, next) {
|
async middleware(req, res, next) {
|
||||||
req.libraryItem = await Database.libraryItemModel.getOldById(req.params.id)
|
req.libraryItem = await Database.libraryItemModel.getOldById(req.params.id)
|
||||||
if (!req.libraryItem?.media) return res.sendStatus(404)
|
if (!req.libraryItem?.media) return res.sendStatus(404)
|
||||||
|
@ -427,6 +427,12 @@ class LibraryItem extends Model {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove library item by id
|
||||||
|
*
|
||||||
|
* @param {string} libraryItemId
|
||||||
|
* @returns {Promise<number>} The number of destroyed rows
|
||||||
|
*/
|
||||||
static removeById(libraryItemId) {
|
static removeById(libraryItemId) {
|
||||||
return this.destroy({
|
return this.destroy({
|
||||||
where: {
|
where: {
|
||||||
|
@ -353,12 +353,13 @@ class ApiRouter {
|
|||||||
* @param {string[]} mediaItemIds array of bookId or podcastEpisodeId
|
* @param {string[]} mediaItemIds array of bookId or podcastEpisodeId
|
||||||
*/
|
*/
|
||||||
async handleDeleteLibraryItem(mediaType, libraryItemId, mediaItemIds) {
|
async handleDeleteLibraryItem(mediaType, libraryItemId, mediaItemIds) {
|
||||||
// Remove media progress for this library item from all users
|
const numProgressRemoved = await Database.mediaProgressModel.destroy({
|
||||||
const users = await Database.userModel.getOldUsers()
|
where: {
|
||||||
for (const user of users) {
|
mediaItemId: mediaItemIds
|
||||||
for (const mediaProgress of user.getAllMediaProgressForLibraryItem(libraryItemId)) {
|
|
||||||
await Database.removeMediaProgress(mediaProgress.id)
|
|
||||||
}
|
}
|
||||||
|
})
|
||||||
|
if (numProgressRemoved > 0) {
|
||||||
|
Logger.info(`[ApiRouter] Removed ${numProgressRemoved} media progress entries for library item "${libraryItemId}"`)
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Remove open sessions for library item
|
// TODO: Remove open sessions for library item
|
||||||
@ -424,11 +425,11 @@ class ApiRouter {
|
|||||||
|
|
||||||
const itemMetadataPath = Path.join(global.MetadataPath, 'items', libraryItemId)
|
const itemMetadataPath = Path.join(global.MetadataPath, 'items', libraryItemId)
|
||||||
if (await fs.pathExists(itemMetadataPath)) {
|
if (await fs.pathExists(itemMetadataPath)) {
|
||||||
Logger.debug(`[ApiRouter] Removing item metadata path "${itemMetadataPath}"`)
|
Logger.info(`[ApiRouter] Removing item metadata at "${itemMetadataPath}"`)
|
||||||
await fs.remove(itemMetadataPath)
|
await fs.remove(itemMetadataPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
await Database.removeLibraryItem(libraryItemId)
|
await Database.libraryItemModel.removeById(libraryItemId)
|
||||||
|
|
||||||
SocketAuthority.emitter('item_removed', {
|
SocketAuthority.emitter('item_removed', {
|
||||||
id: libraryItemId
|
id: libraryItemId
|
||||||
|
Loading…
Reference in New Issue
Block a user