glowers-radio/lib/RadioItem.js

133 lines
3.2 KiB
JavaScript
Raw Permalink Normal View History

"use-strict";
const { objSerialize, objBulkSet } = require("./util.js")
const { RadioMetadata } = require("./RadioMetadata.js")
const { RadioMiscInfo } = require("./RadioMiscInfo.js")
/**
* @public
* @constructor
* @params {string} id
* @returns {RadioItem}
*/
const RadioItem = function (id, miscInfo) {
this.id = id
this.metadata = undefined
this.info = undefined
this.misc = miscInfo || undefined
this.tags = undefined
this.sources = []
return this
}
/**
* @public
* @params {string} id
* @returns {RadioItem}
*/
RadioItem.new = id => new RadioItem(id)
/**
* @public
* @params {string|undefined} title
* @params {string|undefined} artist
* @params {URL|string|undefined} [href] href
* @params {string} [extra] extra Playback effects. i.e: Pitch, speed
* @returns {RadioItem}
*/
RadioItem.prototype.setMetadata = function (title, artist, href, extra) {
if (!this.metadata)
this.metadata = RadioMetadata.new()
objBulkSet(this, "metadata", { title, artist, href, extra });
return this
}
/**
* @public
* @params {RadioMetadata} metadata
* @returns {RadioItem}
*/
RadioItem.prototype.addItemInfo = function (metadata) {
if (!this.info)
this.info = []
this.info.push(metadata)
return this
}
/**
* @public
* @params {RadioMiscInfo} miscInfo
* @returns {RadioItem}
*/
RadioItem.prototype.setMiscInfo = function (miscInfo) {
this.misc = miscInfo
return this
}
/**
* @public
* @returns {RadioItem}
*/
RadioItem.prototype.hoistMiscInfo = function () {
return this.misc ? this.misc : this.misc = RadioMiscInfo.new()
}
/**
* @public
* @params {string[]} tags
* @returns {RadioItem}
*/
RadioItem.prototype.addTags = function (tags) { this.tags = this.tags ? [ ...(this.tags), ...tags ] : tags; return this }
/**
* Alias for addTags; prefixes all items with "radio-media-style-"
* @public
* @params {string[]} tags
* @returns {RadioItem}
* @see RadioItem.prototype.addTags
*/
RadioItem.prototype.addStyleTags = function (tags) { return this.addTags(tags.map(a => `radio-media-style-${a}`)); return this }
/**
* @public
* @params {RadioSource} source
* @returns {RadioItem}
*/
RadioItem.prototype.addSource = function (source) { this.sources.push(source); return this }
/**
* Set metadata for songs that were previously on nigge.rs; adds the "niggers" tag.
* @public
* @params {string|undefined} nigid
* @params {string|undefined} nigkey
* @returns {RadioItem}
*/
RadioItem.prototype.setNiggadata = function (nigid, nigkey) {
this.setMetadata()
this.metadata._nigid = nigid
this.metadata._nigkey = nigkey
//this.addTags([ "niggers" ])
this.hoistMiscInfo().bNiggersSong()
return this
}
/**
* @deprecated
* @returns {Object}
*/
RadioItem.prototype.serialize = function (index) {
const self = this
return objSerialize(this, [
"id",
"tags",
"metadata"
], obj => ({
index,
...obj,
"misc": self.misc ? self.misc.serialize() : undefined,
"info": self.info?.length ? self.info.map(info => info.serialize()) : undefined,
"sources": self.sources.map(source => source.serialize())
}))
}
module.exports = { RadioItem }