const AudioFileMetadata = require('../objects/metadata/AudioMetaTags') class MediaProbeData { constructor() { 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 } 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