mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-27 11:18:14 +01:00 
			
		
		
		
	Change:Server setting for coverDestination to storeCoverWithBook boolean, Add:abmetadata generator
This commit is contained in:
		
							parent
							
								
									4e7d2ddc58
								
							
						
					
					
						commit
						eb109c398f
					
				| @ -57,16 +57,6 @@ export default { | ||||
|       this.$store.commit('setDeveloperMode', value) | ||||
|       this.$toast.info(`Developer Mode ${value ? 'Enabled' : 'Disabled'}`) | ||||
|     } | ||||
|     // saveMetadataComplete(result) { | ||||
|     //   this.savingMetadata = false | ||||
|     //   if (!result) return | ||||
|     //   this.$toast.success(`Metadata saved for ${result.success} audiobooks`) | ||||
|     // }, | ||||
|     // saveMetadataFiles() { | ||||
|     //   this.savingMetadata = true | ||||
|     //   this.$root.socket.once('save_metadata_complete', this.saveMetadataComplete) | ||||
|     //   this.$root.socket.emit('save_metadata') | ||||
|     // } | ||||
|   }, | ||||
|   mounted() {} | ||||
| } | ||||
|  | ||||
| @ -8,8 +8,8 @@ | ||||
|       </div> | ||||
| 
 | ||||
|       <div class="flex items-center py-2"> | ||||
|         <ui-toggle-switch v-model="storeCoversInAudiobookDir" :disabled="updatingServerSettings" @input="updateCoverStorageDestination" /> | ||||
|         <ui-tooltip :text="tooltips.coverDestination"> | ||||
|         <ui-toggle-switch v-model="newServerSettings.storeCoverWithBook" :disabled="updatingServerSettings" @input="(val) => updateSettingsKey('storeCoverWithBook', val)" /> | ||||
|         <ui-tooltip :text="tooltips.storeCoverWithBook"> | ||||
|           <p class="pl-4 text-lg"> | ||||
|             Store covers with audiobook | ||||
|             <span class="material-icons icon-text">info_outlined</span> | ||||
| @ -172,7 +172,6 @@ export default { | ||||
|   data() { | ||||
|     return { | ||||
|       isResettingAudiobooks: false, | ||||
|       storeCoversInAudiobookDir: false, | ||||
|       updatingServerSettings: false, | ||||
|       useSquareBookCovers: false, | ||||
|       useAlternativeBookshelfView: false, | ||||
| @ -185,7 +184,7 @@ export default { | ||||
|         scannerParseSubtitle: 'Extract subtitles from audiobook directory names.<br>Subtitle must be seperated by " - "<br>i.e. "Book Title - A Subtitle Here" has the subtitle "A Subtitle Here"', | ||||
|         scannerFindCovers: 'If your audiobook does not have an embedded cover or a cover image inside the folder, the scanner will attempt to find a cover.<br>Note: This will extend scan time', | ||||
|         bookshelfView: 'Alternative bookshelf view that shows title & author under book covers', | ||||
|         coverDestination: 'By default covers are stored in /metadata/books, enabling this setting will store covers inside your audiobooks directory. Only one file named "cover" will be kept.', | ||||
|         storeCoverWithBook: 'By default covers are stored in /metadata/books, enabling this setting will store covers inside your audiobooks directory. Only one file named "cover" will be kept.', | ||||
|         coverAspectRatio: 'Prefer to use square covers over standard 1.6:1 book covers' | ||||
|       } | ||||
|     } | ||||
| @ -226,12 +225,6 @@ export default { | ||||
|         scannerCoverProvider: val | ||||
|       }) | ||||
|     }, | ||||
|     updateCoverStorageDestination(val) { | ||||
|       this.newServerSettings.coverDestination = val ? this.$constants.CoverDestination.AUDIOBOOK : this.$constants.CoverDestination.METADATA | ||||
|       this.updateServerSettings({ | ||||
|         coverDestination: this.newServerSettings.coverDestination | ||||
|       }) | ||||
|     }, | ||||
|     updateBookCoverAspectRatio(val) { | ||||
|       this.updateServerSettings({ | ||||
|         coverAspectRatio: val ? this.$constants.BookCoverAspectRatio.SQUARE : this.$constants.BookCoverAspectRatio.STANDARD | ||||
| @ -263,8 +256,6 @@ export default { | ||||
|     initServerSettings() { | ||||
|       this.newServerSettings = this.serverSettings ? { ...this.serverSettings } : {} | ||||
| 
 | ||||
|       this.storeCoversInAudiobookDir = this.newServerSettings.coverDestination === this.$constants.CoverDestination.AUDIOBOOK | ||||
| 
 | ||||
|       this.useSquareBookCovers = this.newServerSettings.coverAspectRatio === this.$constants.BookCoverAspectRatio.SQUARE | ||||
| 
 | ||||
|       this.useAlternativeBookshelfView = this.newServerSettings.bookshelfView === this.$constants.BookshelfView.TITLES | ||||
|  | ||||
| @ -14,11 +14,6 @@ const DownloadStatus = { | ||||
|   FAILED: 3 | ||||
| } | ||||
| 
 | ||||
| const CoverDestination = { | ||||
|   METADATA: 0, | ||||
|   AUDIOBOOK: 1 | ||||
| } | ||||
| 
 | ||||
| const BookCoverAspectRatio = { | ||||
|   STANDARD: 0, | ||||
|   SQUARE: 1 | ||||
| @ -32,7 +27,6 @@ const BookshelfView = { | ||||
| const Constants = { | ||||
|   SupportedFileTypes, | ||||
|   DownloadStatus, | ||||
|   CoverDestination, | ||||
|   BookCoverAspectRatio, | ||||
|   BookshelfView | ||||
| } | ||||
|  | ||||
| @ -6,7 +6,6 @@ const readChunk = require('read-chunk') | ||||
| const imageType = require('image-type') | ||||
| 
 | ||||
| const globals = require('./utils/globals') | ||||
| const { CoverDestination } = require('./utils/constants') | ||||
| const { downloadFile } = require('./utils/fileUtils') | ||||
| 
 | ||||
| class CoverController { | ||||
| @ -20,7 +19,7 @@ class CoverController { | ||||
|   } | ||||
| 
 | ||||
|   getCoverDirectory(audiobook) { | ||||
|     if (this.db.serverSettings.coverDestination === CoverDestination.AUDIOBOOK) { | ||||
|     if (this.db.serverSettings.storeCoverWithBook) { | ||||
|       return { | ||||
|         fullPath: audiobook.fullPath, | ||||
|         relPath: '/s/book/' + audiobook.id | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| const { CoverDestination, BookCoverAspectRatio, BookshelfView } = require('../utils/constants') | ||||
| const { BookCoverAspectRatio, BookshelfView } = require('../utils/constants') | ||||
| const Logger = require('../Logger') | ||||
| 
 | ||||
| class ServerSettings { | ||||
| @ -18,8 +18,8 @@ class ServerSettings { | ||||
|     this.scannerDisableWatcher = false | ||||
| 
 | ||||
|     // Metadata
 | ||||
|     this.coverDestination = CoverDestination.METADATA | ||||
|     this.saveMetadataFile = false | ||||
|     this.storeCoverWithBook = false | ||||
|     this.storeMetadataWithBook = false | ||||
| 
 | ||||
|     // Security/Rate limits
 | ||||
|     this.rateLimitLoginRequests = 10 | ||||
| @ -59,8 +59,12 @@ class ServerSettings { | ||||
|     this.scannerPreferOpfMetadata = !!settings.scannerPreferOpfMetadata | ||||
|     this.scannerDisableWatcher = !!settings.scannerDisableWatcher | ||||
| 
 | ||||
|     this.coverDestination = settings.coverDestination || CoverDestination.METADATA | ||||
|     this.saveMetadataFile = !!settings.saveMetadataFile | ||||
|     this.storeCoverWithBook = settings.storeCoverWithBook | ||||
|     if (this.storeCoverWithBook == undefined) { // storeCoverWithBook added in 1.7.1 to replace coverDestination
 | ||||
|       this.storeCoverWithBook = !!settings.coverDestination | ||||
|     } | ||||
|     this.storeMetadataWithBook = !!settings.storeCoverWithBook | ||||
| 
 | ||||
|     this.rateLimitLoginRequests = !isNaN(settings.rateLimitLoginRequests) ? Number(settings.rateLimitLoginRequests) : 10 | ||||
|     this.rateLimitLoginWindow = !isNaN(settings.rateLimitLoginWindow) ? Number(settings.rateLimitLoginWindow) : 10 * 60 * 1000 // 10 Minutes
 | ||||
| 
 | ||||
| @ -95,8 +99,8 @@ class ServerSettings { | ||||
|       scannerPreferAudioMetadata: this.scannerPreferAudioMetadata, | ||||
|       scannerPreferOpfMetadata: this.scannerPreferOpfMetadata, | ||||
|       scannerDisableWatcher: this.scannerDisableWatcher, | ||||
|       coverDestination: this.coverDestination, | ||||
|       saveMetadataFile: !!this.saveMetadataFile, | ||||
|       storeCoverWithBook: this.storeCoverWithBook, | ||||
|       storeMetadataWithBook: this.storeMetadataWithBook, | ||||
|       rateLimitLoginRequests: this.rateLimitLoginRequests, | ||||
|       rateLimitLoginWindow: this.rateLimitLoginWindow, | ||||
|       backupSchedule: this.backupSchedule, | ||||
|  | ||||
| @ -1,5 +1,3 @@ | ||||
| const { CoverDestination } = require('../utils/constants') | ||||
| 
 | ||||
| class ScanOptions { | ||||
|   constructor(options) { | ||||
|     this.forceRescan = false | ||||
| @ -7,7 +5,7 @@ class ScanOptions { | ||||
|     // Server settings
 | ||||
|     this.parseSubtitles = false | ||||
|     this.findCovers = false | ||||
|     this.coverDestination = CoverDestination.METADATA | ||||
|     this.storeCoverWithBook = false | ||||
|     this.preferAudioMetadata = false | ||||
|     this.preferOpfMetadata = false | ||||
| 
 | ||||
| @ -32,7 +30,7 @@ class ScanOptions { | ||||
|       metadataPrecedence: this.metadataPrecedence, | ||||
|       parseSubtitles: this.parseSubtitles, | ||||
|       findCovers: this.findCovers, | ||||
|       coverDestination: this.coverDestination, | ||||
|       storeCoverWithBook: this.storeCoverWithBook, | ||||
|       preferAudioMetadata: this.preferAudioMetadata, | ||||
|       preferOpfMetadata: this.preferOpfMetadata | ||||
|     } | ||||
| @ -43,7 +41,7 @@ class ScanOptions { | ||||
| 
 | ||||
|     this.parseSubtitles = !!serverSettings.scannerParseSubtitle | ||||
|     this.findCovers = !!serverSettings.scannerFindCovers | ||||
|     this.coverDestination = serverSettings.coverDestination | ||||
|     this.storeCoverWithBook = serverSettings.storeCoverWithBook | ||||
|     this.preferAudioMetadata = serverSettings.scannerPreferAudioMetadata | ||||
|     this.preferOpfMetadata = serverSettings.scannerPreferOpfMetadata | ||||
|   } | ||||
|  | ||||
| @ -5,8 +5,8 @@ const Path = require('path') | ||||
| const Logger = require('../Logger') | ||||
| const { version } = require('../../package.json') | ||||
| const { groupFilesIntoAudiobookPaths, getAudiobookFileData, scanRootDir } = require('../utils/scandir') | ||||
| const { comparePaths, getIno, getId, msToTimestamp } = require('../utils/index') | ||||
| const { ScanResult, CoverDestination, LogLevel } = require('../utils/constants') | ||||
| const { comparePaths, getId } = require('../utils/index') | ||||
| const { ScanResult, LogLevel } = require('../utils/constants') | ||||
| 
 | ||||
| const AudioFileScanner = require('./AudioFileScanner') | ||||
| const BookFinder = require('../BookFinder') | ||||
| @ -33,7 +33,7 @@ class Scanner { | ||||
|   } | ||||
| 
 | ||||
|   getCoverDirectory(audiobook) { | ||||
|     if (this.db.serverSettings.coverDestination === CoverDestination.AUDIOBOOK) { | ||||
|     if (this.db.serverSettings.storeCoverWithBook) { | ||||
|       return { | ||||
|         fullPath: audiobook.fullPath, | ||||
|         relPath: '/s/book/' + audiobook.id | ||||
|  | ||||
| @ -20,13 +20,24 @@ const bookKeyMap = { | ||||
| } | ||||
| 
 | ||||
| function generate(audiobook, outputPath, uid, gid) { | ||||
|   var fileString = `[audiobookshelf v${package.version}]\n` | ||||
|   var fileString = ';ABMETADATA1\n' | ||||
|   fileString += `#audiobookshelf v${package.version}\n\n` | ||||
| 
 | ||||
|   for (const key in bookKeyMap) { | ||||
|     const value = audiobook.book[bookKeyMap[key]] || '' | ||||
|     fileString += `${key}=${value}\n` | ||||
|   } | ||||
| 
 | ||||
|   if (audiobook.chapters.length) { | ||||
|     fileString += '\n' | ||||
|     audiobook.chapters.forEach((chapter) => { | ||||
|       fileString += `[CHAPTER]\n` | ||||
|       fileString += `start=${chapter.start}\n` | ||||
|       fileString += `end=${chapter.end}\n` | ||||
|       fileString += `title=${chapter.title}\n` | ||||
|     }) | ||||
|   } | ||||
| 
 | ||||
|   return fs.writeFile(outputPath, fileString).then(() => { | ||||
|     return filePerms(outputPath, 0o774, uid, gid).then(() => true) | ||||
|   }).catch((error) => { | ||||
| @ -6,11 +6,6 @@ module.exports.ScanResult = { | ||||
|   UPTODATE: 4 | ||||
| } | ||||
| 
 | ||||
| module.exports.CoverDestination = { | ||||
|   METADATA: 0, | ||||
|   AUDIOBOOK: 1 | ||||
| } | ||||
| 
 | ||||
| module.exports.BookCoverAspectRatio = { | ||||
|   STANDARD: 0, // 1.6:1
 | ||||
|   SQUARE: 1 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user