export default class Metadata { constructor(data) { this.data = data } getData() { return this.data } } export class MediaMetadata extends Metadata { constructor(data) { super(data) } } export class EpisodeMetadata extends MediaMetadata { REGEXP = /s(?\d+)e(?\d+)/i /** * * @param {object} data * @param {string} episodeKey */ constructor(data, episodeKey) { super(data) this.key = episodeKey let m = this.key.match(this.REGEXP) ?? this.data.filename.match(this.REGEXP) this.season = "xx" this.episode = "xx" if (m) { this.season = m.groups.season this.episode = m.groups.episode } } } export class SeriesMetadata extends Metadata { constructor(data) { super(data) const episodeKeys = Object.keys(data).sort() this.episodes = episodeKeys.map(key => { return new EpisodeMetadata(data[key], key) }) this.episodeIdx = 0 } getCurrentEpisode() { return this.episodes[this.episodeIdx] } getData() { return this.getCurrentEpisode().getData() } prev() { if (this.episodeIdx === 0) { return false } this.episodeIdx -= 1 return true } next() { if (this.episodeIdx === this.episodes.length - 1) { return false } this.episodeIdx += 1 return true } } /** * * @param {object} data * @returns {Metadata} */ export function loadMetadata(data) { if ("filename" in data) { return new MediaMetadata(data) } return new SeriesMetadata(data) }