mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-27 11:18:14 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			164 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			164 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
const Path = require('path')
 | 
						|
const { getId } = require('../../utils/index')
 | 
						|
const AudioFile = require('../files/AudioFile')
 | 
						|
const AudioTrack = require('../files/AudioTrack')
 | 
						|
 | 
						|
class PodcastEpisode {
 | 
						|
  constructor(episode) {
 | 
						|
    this.libraryItemId = null
 | 
						|
    this.id = null
 | 
						|
    this.index = null
 | 
						|
 | 
						|
    this.season = null
 | 
						|
    this.episode = null
 | 
						|
    this.episodeType = null
 | 
						|
    this.title = null
 | 
						|
    this.subtitle = null
 | 
						|
    this.description = null
 | 
						|
    this.enclosure = null
 | 
						|
    this.pubDate = null
 | 
						|
 | 
						|
    this.audioFile = null
 | 
						|
    this.publishedAt = null
 | 
						|
    this.addedAt = null
 | 
						|
    this.updatedAt = null
 | 
						|
 | 
						|
    if (episode) {
 | 
						|
      this.construct(episode)
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  construct(episode) {
 | 
						|
    this.libraryItemId = episode.libraryItemId
 | 
						|
    this.id = episode.id
 | 
						|
    this.index = episode.index
 | 
						|
    this.season = episode.season
 | 
						|
    this.episode = episode.episode
 | 
						|
    this.episodeType = episode.episodeType
 | 
						|
    this.title = episode.title
 | 
						|
    this.subtitle = episode.subtitle
 | 
						|
    this.description = episode.description
 | 
						|
    this.enclosure = episode.enclosure ? { ...episode.enclosure } : null
 | 
						|
    this.pubDate = episode.pubDate
 | 
						|
    this.audioFile = new AudioFile(episode.audioFile)
 | 
						|
    this.publishedAt = episode.publishedAt
 | 
						|
    this.addedAt = episode.addedAt
 | 
						|
    this.updatedAt = episode.updatedAt
 | 
						|
 | 
						|
    this.audioFile.index = 1 // Only 1 audio file per episode
 | 
						|
  }
 | 
						|
 | 
						|
  toJSON() {
 | 
						|
    return {
 | 
						|
      libraryItemId: this.libraryItemId,
 | 
						|
      id: this.id,
 | 
						|
      index: this.index,
 | 
						|
      season: this.season,
 | 
						|
      episode: this.episode,
 | 
						|
      episodeType: this.episodeType,
 | 
						|
      title: this.title,
 | 
						|
      subtitle: this.subtitle,
 | 
						|
      description: this.description,
 | 
						|
      enclosure: this.enclosure ? { ...this.enclosure } : null,
 | 
						|
      pubDate: this.pubDate,
 | 
						|
      audioFile: this.audioFile.toJSON(),
 | 
						|
      publishedAt: this.publishedAt,
 | 
						|
      addedAt: this.addedAt,
 | 
						|
      updatedAt: this.updatedAt
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  toJSONExpanded() {
 | 
						|
    return {
 | 
						|
      libraryItemId: this.libraryItemId,
 | 
						|
      id: this.id,
 | 
						|
      index: this.index,
 | 
						|
      season: this.season,
 | 
						|
      episode: this.episode,
 | 
						|
      episodeType: this.episodeType,
 | 
						|
      title: this.title,
 | 
						|
      subtitle: this.subtitle,
 | 
						|
      description: this.description,
 | 
						|
      enclosure: this.enclosure ? { ...this.enclosure } : null,
 | 
						|
      pubDate: this.pubDate,
 | 
						|
      audioFile: this.audioFile.toJSON(),
 | 
						|
      audioTrack: this.audioTrack.toJSON(),
 | 
						|
      publishedAt: this.publishedAt,
 | 
						|
      addedAt: this.addedAt,
 | 
						|
      updatedAt: this.updatedAt,
 | 
						|
      duration: this.duration,
 | 
						|
      size: this.size
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  get audioTrack() {
 | 
						|
    var audioTrack = new AudioTrack()
 | 
						|
    audioTrack.setData(this.libraryItemId, this.audioFile, 0)
 | 
						|
    return audioTrack
 | 
						|
  }
 | 
						|
  get tracks() {
 | 
						|
    return [this.audioTrack]
 | 
						|
  }
 | 
						|
  get duration() {
 | 
						|
    return this.audioFile.duration
 | 
						|
  }
 | 
						|
  get size() { return this.audioFile.metadata.size }
 | 
						|
  get enclosureUrl() {
 | 
						|
    return this.enclosure ? this.enclosure.url : null
 | 
						|
  }
 | 
						|
 | 
						|
  setData(data, index = 1) {
 | 
						|
    this.id = getId('ep')
 | 
						|
    this.index = index
 | 
						|
    this.title = data.title
 | 
						|
    this.subtitle = data.subtitle || ''
 | 
						|
    this.pubDate = data.pubDate || ''
 | 
						|
    this.description = data.description || ''
 | 
						|
    this.enclosure = data.enclosure ? { ...data.enclosure } : null
 | 
						|
    this.season = data.season || ''
 | 
						|
    this.episode = data.episode || ''
 | 
						|
    this.episodeType = data.episodeType || ''
 | 
						|
    this.publishedAt = data.publishedAt || 0
 | 
						|
    this.addedAt = Date.now()
 | 
						|
    this.updatedAt = Date.now()
 | 
						|
  }
 | 
						|
 | 
						|
  setDataFromAudioFile(audioFile, index) {
 | 
						|
    this.id = getId('ep')
 | 
						|
    this.audioFile = audioFile
 | 
						|
    this.title = Path.basename(audioFile.metadata.filename, Path.extname(audioFile.metadata.filename))
 | 
						|
    this.index = index
 | 
						|
    this.addedAt = Date.now()
 | 
						|
    this.updatedAt = Date.now()
 | 
						|
  }
 | 
						|
 | 
						|
  update(payload) {
 | 
						|
    var hasUpdates = false
 | 
						|
    for (const key in this.toJSON()) {
 | 
						|
      if (payload[key] != undefined && payload[key] != this[key]) {
 | 
						|
        this[key] = payload[key]
 | 
						|
        hasUpdates = true
 | 
						|
      }
 | 
						|
    }
 | 
						|
    if (hasUpdates) {
 | 
						|
      this.updatedAt = Date.now()
 | 
						|
    }
 | 
						|
    return hasUpdates
 | 
						|
  }
 | 
						|
 | 
						|
  // Only checks container format
 | 
						|
  checkCanDirectPlay(payload) {
 | 
						|
    var supportedMimeTypes = payload.supportedMimeTypes || []
 | 
						|
    return supportedMimeTypes.includes(this.audioFile.mimeType)
 | 
						|
  }
 | 
						|
 | 
						|
  getDirectPlayTracklist() {
 | 
						|
    return this.tracks
 | 
						|
  }
 | 
						|
 | 
						|
  checkEqualsEnclosureUrl(url) {
 | 
						|
    if (!this.enclosure || !this.enclosure.url) return false
 | 
						|
    return this.enclosure.url == url
 | 
						|
  }
 | 
						|
}
 | 
						|
module.exports = PodcastEpisode |