mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-11-04 03:17:00 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			103 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
const AudioFileMetadata = require('../objects/metadata/AudioMetaTags')
 | 
						|
 | 
						|
class MediaProbeData {
 | 
						|
  constructor(probeData) {
 | 
						|
    this.embeddedCoverArt = null
 | 
						|
    this.format = null
 | 
						|
    this.duration = null
 | 
						|
    this.size = null
 | 
						|
 | 
						|
    this.audioStream = null
 | 
						|
    this.videoStream = null
 | 
						|
 | 
						|
    this.bitRate = null
 | 
						|
    this.codec = null
 | 
						|
    this.timeBase = null
 | 
						|
    this.language = null
 | 
						|
    this.channelLayout = null
 | 
						|
    this.channels = null
 | 
						|
    this.sampleRate = null
 | 
						|
    this.chapters = []
 | 
						|
 | 
						|
    this.audioFileMetadata = null
 | 
						|
 | 
						|
    this.trackNumber = null
 | 
						|
    this.trackTotal = null
 | 
						|
 | 
						|
    this.discNumber = null
 | 
						|
    this.discTotal = null
 | 
						|
 | 
						|
    if (probeData) {
 | 
						|
      this.construct(probeData)
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  construct(probeData) {
 | 
						|
    for (const key in probeData) {
 | 
						|
      if (key === 'audioFileMetadata' && probeData[key]) {
 | 
						|
        this[key] = new AudioFileMetadata(probeData[key])
 | 
						|
      } else if (this[key] !== undefined) {
 | 
						|
        this[key] = probeData[key]
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  getEmbeddedCoverArt(videoStream) {
 | 
						|
    const ImageCodecs = ['mjpeg', 'jpeg', 'png']
 | 
						|
    return ImageCodecs.includes(videoStream.codec) ? videoStream.codec : null
 | 
						|
  }
 | 
						|
 | 
						|
  setData(data) {
 | 
						|
    var audioStream = data.audio_stream
 | 
						|
    this.embeddedCoverArt = data.video_stream ? this.getEmbeddedCoverArt(data.video_stream) : null
 | 
						|
    this.format = data.format
 | 
						|
    this.duration = data.duration
 | 
						|
    this.size = data.size
 | 
						|
 | 
						|
    this.audioStream = audioStream
 | 
						|
    this.videoStream = this.embeddedCoverArt ? null : data.video_stream || null
 | 
						|
 | 
						|
    this.bitRate = audioStream.bit_rate || data.bit_rate
 | 
						|
    this.codec = audioStream.codec
 | 
						|
    this.timeBase = audioStream.time_base
 | 
						|
    this.language = audioStream.language
 | 
						|
    this.channelLayout = audioStream.channel_layout
 | 
						|
    this.channels = audioStream.channels
 | 
						|
    this.sampleRate = audioStream.sample_rate
 | 
						|
    this.chapters = data.chapters || []
 | 
						|
 | 
						|
    var metatags = {}
 | 
						|
    for (const key in data) {
 | 
						|
      if (data[key] && key.startsWith('file_tag')) {
 | 
						|
        metatags[key] = data[key]
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    this.audioFileMetadata = new AudioFileMetadata()
 | 
						|
    this.audioFileMetadata.setData(metatags)
 | 
						|
 | 
						|
    // Track ID3 tag might be "3/10" or just "3"
 | 
						|
    if (this.audioFileMetadata.tagTrack) {
 | 
						|
      var trackParts = this.audioFileMetadata.tagTrack.split('/').map(part => Number(part))
 | 
						|
      if (trackParts.length > 0) {
 | 
						|
        // Fractional track numbers not supported
 | 
						|
        this.trackNumber = !isNaN(trackParts[0]) ? Math.trunc(trackParts[0]) : null
 | 
						|
      }
 | 
						|
      if (trackParts.length > 1) {
 | 
						|
        this.trackTotal = !isNaN(trackParts[1]) ? trackParts[1] : null
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    // Parse disc tag
 | 
						|
    if (this.audioFileMetadata.tagDisc) {
 | 
						|
      var discParts = this.audioFileMetadata.tagDisc.split('/').map(p => Number(p))
 | 
						|
      if (discParts.length > 0) {
 | 
						|
        this.discNumber = !isNaN(discParts[0]) ? Math.trunc(discParts[0]) : null
 | 
						|
      }
 | 
						|
      if (discParts.length > 1) {
 | 
						|
        this.discTotal = !isNaN(discParts[1]) ? discParts[1] : null
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
module.exports = MediaProbeData |