mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-27 11:18:14 +01:00 
			
		
		
		
	Merge pull request #3329 from mikiher/embed-single-file
Fix embed and convert for single file library items
This commit is contained in:
		
						commit
						e0de59a4b6
					
				@ -53,20 +53,21 @@ class AbMergeManager {
 | 
			
		||||
  async startAudiobookMerge(userId, libraryItem, options = {}) {
 | 
			
		||||
    const task = new Task()
 | 
			
		||||
 | 
			
		||||
    const audiobookDirname = Path.basename(libraryItem.path)
 | 
			
		||||
    const targetFilename = audiobookDirname + '.m4b'
 | 
			
		||||
    const audiobookBaseName = libraryItem.isFile ? Path.basename(libraryItem.path, Path.extname(libraryItem.path)) : Path.basename(libraryItem.path)
 | 
			
		||||
    const targetFilename = audiobookBaseName + '.m4b'
 | 
			
		||||
    const itemCachePath = Path.join(this.itemsCacheDir, libraryItem.id)
 | 
			
		||||
    const tempFilepath = Path.join(itemCachePath, targetFilename)
 | 
			
		||||
    const ffmetadataPath = Path.join(itemCachePath, 'ffmetadata.txt')
 | 
			
		||||
    const libraryItemDir = libraryItem.isFile ? Path.dirname(libraryItem.path) : libraryItem.path
 | 
			
		||||
    const taskData = {
 | 
			
		||||
      libraryItemId: libraryItem.id,
 | 
			
		||||
      libraryItemPath: libraryItem.path,
 | 
			
		||||
      libraryItemDir,
 | 
			
		||||
      userId,
 | 
			
		||||
      originalTrackPaths: libraryItem.media.tracks.map((t) => t.metadata.path),
 | 
			
		||||
      inos: libraryItem.media.includedAudioFiles.map((f) => f.ino),
 | 
			
		||||
      tempFilepath,
 | 
			
		||||
      targetFilename,
 | 
			
		||||
      targetFilepath: Path.join(libraryItem.path, targetFilename),
 | 
			
		||||
      targetFilepath: Path.join(libraryItemDir, targetFilename),
 | 
			
		||||
      itemCachePath,
 | 
			
		||||
      ffmetadataObject: ffmpegHelpers.getFFMetadataObject(libraryItem, 1),
 | 
			
		||||
      chapters: libraryItem.media.chapters?.map((c) => ({ ...c })),
 | 
			
		||||
@ -95,8 +96,8 @@ class AbMergeManager {
 | 
			
		||||
   */
 | 
			
		||||
  async runAudiobookMerge(libraryItem, task, encodingOptions) {
 | 
			
		||||
    // Make sure the target directory is writable
 | 
			
		||||
    if (!(await isWritable(libraryItem.path))) {
 | 
			
		||||
      Logger.error(`[AbMergeManager] Target directory is not writable: ${libraryItem.path}`)
 | 
			
		||||
    if (!(await isWritable(task.data.libraryItemDir))) {
 | 
			
		||||
      Logger.error(`[AbMergeManager] Target directory is not writable: ${task.data.libraryItemDir}`)
 | 
			
		||||
      task.setFailed('Target directory is not writable')
 | 
			
		||||
      this.removeTask(task, true)
 | 
			
		||||
      return
 | 
			
		||||
 | 
			
		||||
@ -7,6 +7,12 @@ const TaskManager = require('./TaskManager')
 | 
			
		||||
const Task = require('../objects/Task')
 | 
			
		||||
const fileUtils = require('../utils/fileUtils')
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @typedef UpdateMetadataOptions
 | 
			
		||||
 * @property {boolean} [forceEmbedChapters=false] - Whether to force embed chapters.
 | 
			
		||||
 * @property {boolean} [backup=false] - Whether to backup the files.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
class AudioMetadataMangaer {
 | 
			
		||||
  constructor() {
 | 
			
		||||
    this.itemsCacheDir = Path.join(global.MetadataPath, 'cache/items')
 | 
			
		||||
@ -47,8 +53,8 @@ class AudioMetadataMangaer {
 | 
			
		||||
  /**
 | 
			
		||||
   *
 | 
			
		||||
   * @param {string} userId
 | 
			
		||||
   * @param {*} libraryItem
 | 
			
		||||
   * @param {*} options
 | 
			
		||||
   * @param {import('../objects/LibraryItem')} libraryItem
 | 
			
		||||
   * @param {UpdateMetadataOptions} [options={}]
 | 
			
		||||
   */
 | 
			
		||||
  async updateMetadataForItem(userId, libraryItem, options = {}) {
 | 
			
		||||
    const forceEmbedChapters = !!options.forceEmbedChapters
 | 
			
		||||
@ -67,9 +73,10 @@ class AudioMetadataMangaer {
 | 
			
		||||
    if (audioFiles.some((a) => a.mimeType !== mimeType)) mimeType = null
 | 
			
		||||
 | 
			
		||||
    // Create task
 | 
			
		||||
    const libraryItemDir = libraryItem.isFile ? Path.dirname(libraryItem.path) : libraryItem.path
 | 
			
		||||
    const taskData = {
 | 
			
		||||
      libraryItemId: libraryItem.id,
 | 
			
		||||
      libraryItemPath: libraryItem.path,
 | 
			
		||||
      libraryItemDir,
 | 
			
		||||
      userId,
 | 
			
		||||
      audioFiles: audioFiles.map((af) => ({
 | 
			
		||||
        index: af.index,
 | 
			
		||||
@ -112,10 +119,10 @@ class AudioMetadataMangaer {
 | 
			
		||||
    Logger.info(`[AudioMetadataManager] Starting metadata embed task`, task.description)
 | 
			
		||||
 | 
			
		||||
    // Ensure target directory is writable
 | 
			
		||||
    const targetDirWritable = await fileUtils.isWritable(task.data.libraryItemPath)
 | 
			
		||||
    Logger.debug(`[AudioMetadataManager] Target directory ${task.data.libraryItemPath} writable: ${targetDirWritable}`)
 | 
			
		||||
    const targetDirWritable = await fileUtils.isWritable(task.data.libraryItemDir)
 | 
			
		||||
    Logger.debug(`[AudioMetadataManager] Target directory ${task.data.libraryItemDir} writable: ${targetDirWritable}`)
 | 
			
		||||
    if (!targetDirWritable) {
 | 
			
		||||
      Logger.error(`[AudioMetadataManager] Target directory is not writable: ${task.data.libraryItemPath}`)
 | 
			
		||||
      Logger.error(`[AudioMetadataManager] Target directory is not writable: ${task.data.libraryItemDir}`)
 | 
			
		||||
      task.setFailed('Target directory is not writable')
 | 
			
		||||
      this.handleTaskFinished(task)
 | 
			
		||||
      return
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user