mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-31 02:17:01 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			91 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| const fs = require('fs-extra')
 | |
| const Path = require('path')
 | |
| const { bytesPretty } = require('./fileUtils')
 | |
| const Logger = require('../Logger')
 | |
| 
 | |
| const LEFT_COL_LEN = 25
 | |
| 
 | |
| function sectionHeaderLines(title) {
 | |
|   return [title, ''.padEnd(10, '=')]
 | |
| }
 | |
| 
 | |
| function generateSection(sectionTitle, sectionData) {
 | |
|   var lines = sectionHeaderLines(sectionTitle)
 | |
|   for (const key in sectionData) {
 | |
|     var line = key.padEnd(LEFT_COL_LEN) + (sectionData[key] || '')
 | |
|     lines.push(line)
 | |
|   }
 | |
|   return lines
 | |
| }
 | |
| 
 | |
| async function generate(audiobook, nfoFilename = 'metadata.nfo') {
 | |
|   var jsonObj = audiobook.toJSON()
 | |
|   var book = jsonObj.book
 | |
| 
 | |
|   var generalSectionData = {
 | |
|     'Title': book.title,
 | |
|     'Subtitle': book.subtitle,
 | |
|     'Author': book.author,
 | |
|     'Narrator': book.narrator,
 | |
|     'Series': book.series,
 | |
|     'Volume Number': book.volumeNumber,
 | |
|     'Publish Year': book.publishYear,
 | |
|     'Genre': book.genres ? book.genres.join(', ') : '',
 | |
|     'Duration': audiobook.durationPretty,
 | |
|     'Chapters': jsonObj.chapters.length
 | |
|   }
 | |
| 
 | |
|   if (!book.subtitle) {
 | |
|     delete generalSectionData['Subtitle']
 | |
|   }
 | |
| 
 | |
|   if (!book.series) {
 | |
|     delete generalSectionData['Series']
 | |
|     delete generalSectionData['Volume Number']
 | |
|   }
 | |
| 
 | |
|   var tracks = audiobook.tracks
 | |
|   var audioTrack = tracks.length ? audiobook.tracks[0] : {}
 | |
| 
 | |
|   var totalBitrate = 0
 | |
|   var numBitrates = 0
 | |
|   for (let i = 0; i < tracks.length; i++) {
 | |
|     if (tracks[i].bitRate) {
 | |
|       totalBitrate += tracks[i].bitRate
 | |
|       numBitrates++
 | |
|     }
 | |
|   }
 | |
|   var averageBitrate = numBitrates ? totalBitrate / numBitrates : 0
 | |
| 
 | |
|   var mediaSectionData = {
 | |
|     'Tracks': jsonObj.tracks.length,
 | |
|     'Size': audiobook.sizePretty,
 | |
|     'Codec': audioTrack.codec,
 | |
|     'Ext': audioTrack.ext,
 | |
|     'Channels': audioTrack.channels,
 | |
|     'Channel Layout': audioTrack.channelLayout,
 | |
|     'Average Bitrate': bytesPretty(averageBitrate)
 | |
|   }
 | |
| 
 | |
|   var bookSection = generateSection('Book Info', generalSectionData)
 | |
| 
 | |
|   var descriptionSection = null
 | |
|   if (book.description) {
 | |
|     descriptionSection = sectionHeaderLines('Book Description')
 | |
|     descriptionSection.push(book.description)
 | |
|   }
 | |
| 
 | |
|   var mediaSection = generateSection('Media Info', mediaSectionData)
 | |
| 
 | |
|   var fullFile = bookSection.join('\n') + '\n\n'
 | |
|   if (descriptionSection) fullFile += descriptionSection.join('\n') + '\n\n'
 | |
|   fullFile += mediaSection.join('\n')
 | |
| 
 | |
|   var nfoPath = Path.join(audiobook.fullPath, nfoFilename)
 | |
|   var relativePath = Path.join(audiobook.path, nfoFilename)
 | |
|   return fs.writeFile(nfoPath, fullFile).then(() => relativePath).catch((error) => {
 | |
|     Logger.error(`Failed to write nfo file ${error}`)
 | |
|     return false
 | |
|   })
 | |
| }
 | |
| module.exports = generate |