85 lines
1.7 KiB
JavaScript
85 lines
1.7 KiB
JavaScript
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(?<season>\d+)e(?<episode>\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)
|
|
} |