diff --git a/generate.js b/generate.js index 0f3982f..0fa173a 100755 --- a/generate.js +++ b/generate.js @@ -30,6 +30,7 @@ const notNullElse = (a, fallback) => a != null && a != undefined ? a : fallback const RadioItem = function (id) { this.id = id this.metadata = undefined + this.info = undefined this.tags = undefined this.sources = [] return this @@ -57,6 +58,18 @@ RadioItem.prototype.setMetadata = function (title, artist, href, extra) { return this } +/** + * @public + * @params {RadioMetadata} metadata + * @returns {RadioItem} + */ +RadioItem.prototype.addTrackInfo = function (metadata) { + if (!this.info) + this.info = [] + this.info.push(metadata) + return this +} + /** * @public * @params {string[]} tags @@ -99,12 +112,18 @@ RadioItem.prototype.setNiggadata = function (nigid, nigkey) { * @deprecated * @returns {Object} */ -RadioItem.prototype.serialize = function () { +RadioItem.prototype.serialize = function (index) { + const self = this return objSerialize(this, [ "id", "tags", "metadata" - ], obj => ({ ...obj, "sources": this.sources.map(source => source.serialize()) })) + ], obj => ({ + index, + ...obj, + "info": self.info?.length ? self.info.map(info => info.serialize()) : undefined, + "sources": self.sources.map(source => source.serialize()) + })) } /** @@ -295,10 +314,115 @@ RadioPreview.prototype.serialize = function (radioSource) { * @returns {RadioMetadata} */ const RadioMetadata = function (title, artist, href, extra) { - this.title = title - this.artist = artist - this.href = href - this.extra = extra + this.info = undefined + this.title = title || undefined + this.artist = artist || undefined + this.href = href || undefined + this.extra = extra || undefined + return this +} + +/** + * @public + * @params {string} watch_id + * @returns {RadioMetadata} + */ +RadioMetadata.createYouTubeURI = id => `x-yt://${id}` + +/** + * @public + * @params {string} id + * @returns {RadioMetadata} + */ +RadioMetadata.createNicoNicoURI = id => `x-nn://${id}` + +/** + * @public + * @params {string} id + * @returns {RadioMetadata} + */ +RadioMetadata.createInternetArchiveURI = id => `x-ia://${id}` + +/** + * @public + * @params {bigint|string} post_id + * @params {string} username + * @returns {RadioMetadata} + */ +RadioMetadata.createTikTokURI = (post_id, username) => `x-tt://${username}/${post_id}` + +/** + * @public + * @params {string} track + * @params {string} artist + * @returns {RadioMetadata} + */ +RadioMetadata.createBandcampURI = (track, artist) => `x-bc://${artist}/${track}` + +/** + * @public + * @params {string} track + * @params {string} artist + * @returns {RadioMetadata} + */ +RadioMetadata.createSoundcloudURI = (track, artist) => `x-sc://${artist}/${track}` + +/** + * @public + * @params {number} post_id + * @returns {RadioMetadata} + */ +RadioMetadata.createBooruSoyURI = id => `x-bs://${id}` + +/** + * @public + * @params {number} track_id + * @params {number|undefined} album_id + * @returns {RadioMetadata} + */ +RadioMetadata.createAppleMusicURI = (track_id, album_id) => `x-am://${track_id}${album_id ? '/' + album_id : ''}` + +/** + * @public + * @params {string} id + * @returns {RadioMetadata} + */ +RadioMetadata.createWikipediaURI = id => `x-wp://${id}` + +/** + * @public + * @params {number} string + * @returns {RadioMetadata} + */ +RadioMetadata.createWikimediaCommonsURI = id => `x-wc://${id}` + +/** + * @public + * @readonly + */ +const BMetadataType = { + "AUDIO": 0b1, + "VIDEO": 0b10, + "ORIGINAL": 0b100, + "ALT": 0b1000, + "OFFICIAL": 0b10000 +} + +for (const key in BMetadataType) { + RadioMetadata.prototype[`b${key[0]}${key.slice(1).toLowerCase()}`] = function () { + this.info = (this.info || 0) | BMetadataType[key] + return this + } +} + +/** + * Used to differentiate identical info bits for different info items + * @public + * @params {string} key + * @returns {RadioMetadata} + */ +RadioMetadata.prototype.setFor = function (key) { + this.for = key return this } @@ -312,6 +436,40 @@ const RadioMetadata = function (title, artist, href, extra) { */ RadioMetadata.new = (title, artist, href, extra) => new RadioMetadata(title, artist, href, extra) +/** + * Alias for new(...).bVideo().bAudio() + * @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 {RadioMetadata} + */ +RadioMetadata.newLAV = (title, artist, href, extra) => (new RadioMetadata(title, artist, href, extra)).bVideo().bAudio() + +/** + * Alias for new(...).bVideo() + * @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 {RadioMetadata} + */ +RadioMetadata.newLV = (title, artist, href, extra) => (new RadioMetadata(title, artist, href, extra)).bVideo() + + +/** + * Alias for new(...).bAudio() + * @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 {RadioMetadata} + */ +RadioMetadata.newLA = (title, artist, href, extra) => (new RadioMetadata(title, artist, href, extra)).bAudio() + /** * @deprecated * @params {RadioSource} radioSource @@ -319,6 +477,8 @@ RadioMetadata.new = (title, artist, href, extra) => new RadioMetadata(title, art */ RadioMetadata.prototype.serialize = function () { return objSerialize(this, [ + "info", + "for", "title", "artist", "href", @@ -432,13 +592,18 @@ const mediaItems = [ .addPreview("mxc://glowers.club/FJfFhscJavurBvoEuRbykpmM", "image/jpg", "500x500")), RadioItem.new("dobson") + .addTrackInfo(RadioMetadata.newLA("Without Me", "Eminem", RadioMetadata.createYouTubeURI("YVkUvmDQ3HY")).bOriginal().bOfficial()) + .addTrackInfo(RadioMetadata.newLA(null, null, RadioMetadata.createAppleMusicURI(15477279)).bOriginal().bOfficial().bAlt()) .addSource(RadioSource.new("video/mp4", [ "avc1.64000D", "mp4a.40.2" ]) .setURI("mxc://glowers.club/mRtnfcoHYkyAOXSkYvrnbZgX") .addPreview("mxc://glowers.club/eHKVfIITgdRKERhVOPSTDQAc", "image/jpg", "432x426")), // FIXME: Original audio source found, not remix source or video source RadioItem.new("poljacked") - .setMetadata("BLACK BLADE", "Seyit Akbas", "https://youtu.be/6RnNXLZ2rfw", "1.15%, pitched up") + //.setMetadata("BLACK BLADE", "Seyit Akbas", "https://youtu.be/6RnNXLZ2rfw", "1.15%, pitched up") + .addTrackInfo(RadioMetadata.newLV(null, null, RadioMetadata.createBooruSoyURI(23224))) + .addTrackInfo(RadioMetadata.newLA("NEON BLADE", "MoonDeity", RadioMetadata.createYouTubeURI("Mu965dWgMMQ"), "1.315%, pitched up, bass boosted").bOriginal().bOfficial()) + .addTrackInfo(RadioMetadata.newLA(null, null, RadioMetadata.createAppleMusicURI(1627535463)).bOriginal().bOfficial().bAlt()) .addSource(RadioSource.new("video/mp4", [ "avc1.64001E", "mp4a.40.2" ]) .setURI("mxc://glowers.club/stlNnyEIUVGluyhpPSGhtjJg") .addPreview("mxc://glowers.club/BczfFtojBhwMxTNjoZfhemam", "image/jpg", "638x360") @@ -469,7 +634,9 @@ const mediaItems = [ .addPreview("mxc://glowers.club/esDPBgpoTvTtqekHAQJRwqtK", "image/jpg", "480x272")), RadioItem.new("ifuckinglovescience") - .setMetadata("I FUCKING LOVE SCIENCE", "Hank Green", "https://booru.soy/post/view/20571") + .addTrackInfo(RadioMetadata.newLV(null, null, RadioMetadata.createBooruSoyURI(20571))) + .addTrackInfo(RadioMetadata.newLA("I FUCKING LOVE SCIENCE", "Hank Green", RadioMetadata.createYouTubeURI("RECuQaaGGfA")).bOfficial()) + .addTrackInfo(RadioMetadata.newLA(null, null, RadioMetadata.createAppleMusicURI(868150396)).bOfficial().bAlt()) .addSource(RadioSource.new("video/mp4", [ "avc1.4D4029", "mp4a.40.2" ]) .setURI("mxc://glowers.club/tLnDwRvJDckOIopncgUfodAn") .addPreview("mxc://glowers.club/burAaUYSveyoVMHrijAsAxlL", "image/jpg", "768x432")) @@ -918,7 +1085,9 @@ const mediaItems = [ .addPreview("mxc://glowers.club/qnAjqhGYzBLrEmlhzbxreoUC", "image/jpg", "500x500")), RadioItem.new("piebotnik") - .setMetadata("dr robotnik bakes a pie", "KnightOfGames", "https://youtu.be/jqKVLZ9wA24") + .addTrackInfo(RadioMetadata.newLAV("dr robotnik bakes a pie", "KnightOfGames", RadioMetadata.createYouTubeURI("jqKVLZ9wA24")).bOfficial()) + .addTrackInfo(RadioMetadata.newLAV("In HoNoR oF oUr MoSt FuNnY tIkToK", "jaydencroes", RadioMetadata.createTikTokURI("6803451075920776454", "jaydencroes")).setFor(0).bOriginal().bOfficial()) + .addTrackInfo(RadioMetadata.newLA("Dr. Robotnik's Theme", "中村正人", RadioMetadata.createYouTubeURI("KbhX7XKgkDU")).setFor(1).bOriginal()) .addTags([ "ylyl" ]) .addSource(RadioSource.new("video/mp4", [ "avc1.4D4028", "mp4a.40.2" ]) .setURI("mxc://glowers.club/YUjleEpsnUnjnQPscgAzVPzX") @@ -989,7 +1158,7 @@ const mediaItems = [ .addPreview("mxc://glowers.club/gGvSqctfUJWHEYxYfbZEwQpn", "image/jpg", "416x416")), RadioItem.new("wiphop") - .setMetadata("[SP] WIP HOP", "CodeZombie", "https://soundcloud.com/codezombie/wip-hop") + .addTrackInfo(RadioMetadata.newLA("[SP] WIP HOP", "CodeZombie", RadioMetadata.createSoundcloudURI("wip-hop", "codezombie")).bOfficial()) .addTags([ "splash-song" ]) .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/CCsidQsdYksctdyCnlvfTDxx") @@ -1024,38 +1193,60 @@ const mediaItems = [ // TODO: album art edit sucks lol RadioItem.new("partyrockapple") - .setMetadata("Party Rock Apple!!", "Triple-Q", "https://triple-q.bandcamp.com/track/party-rock-apple") + .addTrackInfo(RadioMetadata.newLA("Party Rock Apple!!", "Triple-Q", RadioMetadata.createBandcampURI("party-rock-apple", "triple-q")).bOfficial()) + .addTrackInfo(RadioMetadata.newLA("Party Rock Anthem", "LMFAO", RadioMetadata.createYouTubeURI("KQ6zr6kCPj8")).setFor(0).bOriginal().bOfficial()) + .addTrackInfo(RadioMetadata.newLA(null, null, RadioMetadata.createAppleMusicURI(1440636627)).setFor(0).bOriginal().bOfficial().bAlt()) + .addTrackInfo(RadioMetadata.newLA("Bad Apple!!", "nomico", RadioMetadata.createNicoNicoURI("sm8628149")).setFor(1).bOriginal()) + .addTrackInfo(RadioMetadata.newLA(null, null, RadioMetadata.createAppleMusicURI(1440636627)).setFor(1).bOriginal().bOfficial().bAlt()) .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/ngNYSFAkLNDIMwlGsnVmwDpS") .addPreview("mxc://glowers.club/QemTpdTrUYfKEoaWgrkUChIz", "image/jpg", "500x500")), RadioItem.new("fnaf") .setMetadata("gangnam style joke", "Kirino Kōsaka", "https://soundcloud.com/kirinokosaka/gangnam-style-joke-1") + .addTrackInfo(RadioMetadata.newLA("gangnam style joke", "Kirino Kōsaka", RadioMetadata.createSoundcloudURI("gangnam-style-joke-1", "kirinokosaka")).bOfficial()) + .addTrackInfo(RadioMetadata.newLA("Les Toreadors Carmen", "Scott Cawthon", RadioMetadata.createYouTubeURI("GZOOx40rE3k")).setFor(0).bOriginal()) + .addTrackInfo(RadioMetadata.newLA("Gas Pedal (feat. Iamsu!)", "Sage The Gemini", RadioMetadata.createYouTubeURI("X8LUd51IuiA")).setFor(1).bOriginal().bOfficial()) + .addTrackInfo(RadioMetadata.newLA(null, null, RadioMetadata.createAppleMusicURI(1434900852)).setFor(1).bOriginal().bOfficial().bAlt()) .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/bmzxkzwFHChruYIjszvDrdRj") .addPreview("mxc://glowers.club/TkvoCbwQQQAwOzKwaFARDmRH", "image/jpg", "500x500")), RadioItem.new("mail") - .setMetadata("AOLNATION - Mail", "Personal Pong", "https://soundcloud.com/personalpong/aolnation-mail") + .addTrackInfo(RadioMetadata.newLA("AOLNATION - Mail", "Personal Pong", RadioMetadata.createSoundcloudURI("aolnation-mail", "personalpong")).bOfficial()) + .addTrackInfo(RadioMetadata.newLA("Sail", "AWOLNATION", RadioMetadata.createYouTubeURI("tgIqecROs5M")).bOriginal().bOfficial()) + .addTrackInfo(RadioMetadata.newLA(null, null, RadioMetadata.createAppleMusicURI(422478211)).bOriginal().bOfficial().bAlt()) .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/HEDaNdMsVFzIgYDkymkxnhob") .setPlaybackInfo(RadioPlaybackInfo.new().setPlaybackVolume(.4)) .addPreview("mxc://glowers.club/vBvnVioYcHeIGtvHRAaWWCab", "image/jpg", "500x500")), RadioItem.new("thisislazytown") - .setMetadata("This Is Lazy Town", "Soundclown Crimes Against Humanity", "https://soundcloud.com/thesoundclowncriminal/this-is-lazy-town") + .addTrackInfo(RadioMetadata.newLA("This Is Lazy Town", "Soundclown Crimes Against Humanity", RadioMetadata.createSoundcloudURI("this-is-lazy-town", "thesoundclowncriminal"))) + .addTrackInfo(RadioMetadata.newLA("We Are Number One", "Stefán Karl Stefánsson", RadioMetadata.createYouTubeURI("PfYnvDL0Qcw")).setFor(0).bOriginal().bOfficial()) + .addTrackInfo(RadioMetadata.newLA(null, null, RadioMetadata.createAppleMusicURI(1650060971)).setFor(0).bOriginal().bOfficial().bAlt()) + .addTrackInfo(RadioMetadata.newLA("This Is America", "Childish Gambino", RadioMetadata.createYouTubeURI("VYOjWnS4cMY")).setFor(1).bOriginal().bOfficial()) + .addTrackInfo(RadioMetadata.newLA(null, null, RadioMetadata.createAppleMusicURI(1379046390)).setFor(1).bOriginal().bOfficial().bAlt()) .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) - .setURI("mxc://glowers.club/XKaBjJLglqeAgkkPgEclMBIS") - .addPreview("mxc://glowers.club/KcFqpISqthZSOFhntXAhkWIr", "image/jpg", "500x500")), + .setURI("mxc://glowers.club/XKaBjJLglqeAgkkPgEclMBIS") + .addPreview("mxc://glowers.club/KcFqpISqthZSOFhntXAhkWIr", "image/jpg", "500x500")), + // FIXME: No official source for Al-Sawarim. Artist listed on Apple Music but songs are unavailable in Europe RadioItem.new("isisman") - .setMetadata("ISISman", "Triple-Q", "https://triple-q.bandcamp.com/track/isisman") + .addTrackInfo(RadioMetadata.newLA("ISISman", "Triple-Q", RadioMetadata.createBandcampURI("isisman", "triple-q")).bOfficial()) + .addTrackInfo(RadioMetadata.newLA("Gentleman", "PSY", RadioMetadata.createYouTubeURI("ASO_zypdnsQ")).setFor(0).bOriginal().bOfficial()) + .addTrackInfo(RadioMetadata.newLA(null, null, RadioMetadata.createAppleMusicURI(1452841625)).setFor(0).bOriginal().bOfficial().bAlt()) + .addTrackInfo(RadioMetadata.newLA("Saleel al-Sawarim", "Abu Yasir", RadioMetadata.createInternetArchiveURI("saleel_al-sawarim")).setFor(1).bOriginal()) .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/pvVRMPsnBzCadKCSaZdMmluy") .addPreview("mxc://glowers.club/zYqsUaZgAmqNDWymTPhdGJRi", "image/jpg", "500x500")), RadioItem.new("takyonmachine") - .setMetadata("Wintergrips - Takyon Machine (music instrument using a very angry man)", "Uncle Ned", "https://youtu.be/gSQyPdYz4f4") + .addTrackInfo(RadioMetadata.newLAV("Wintergrips - Takyon Machine (music instrument using a very angry man)", "Uncle Ned", RadioMetadata.createYouTubeURI("gSQyPdYz4f4")).bOfficial()) + .addTrackInfo(RadioMetadata.newLA("Marble Machine", "Wintergatan", RadioMetadata.createYouTubeURI("IvUU8joBb1Q")).setFor(0).bOriginal().bOfficial()) + .addTrackInfo(RadioMetadata.newLA(null, null, RadioMetadata.createAppleMusicURI(1319433713)).setFor(0).bOriginal().bOfficial().bAlt()) + .addTrackInfo(RadioMetadata.newLA("Takyon (Death Yon)", "Death Grips", RadioMetadata.createYouTubeURI("Htl3XWUhUOM")).setFor(1).bOriginal().bOfficial()) + .addTrackInfo(RadioMetadata.newLA(null, null, RadioMetadata.createInternetArchiveURI("DeathGrips-ExMilitaryMixtape")).setFor(1).bOriginal().bOfficial().bAlt()) .addTags([ "metadata-prefer-id" ]) .addSource(RadioSource.new("video/mp4", [ "avc1.4D4029", "mp4a.40.2" ]) .setURI("mxc://glowers.club/khtMKBJAxrJgOQclpdzHDTzp") @@ -1065,7 +1256,10 @@ const mediaItems = [ .addPreview("mxc://glowers.club/VcwimKRasxlYLJMqYtJpOJGi", "image/jpg", "500x500")), RadioItem.new("ghostpieght") - .setMetadata("Ghost Pieght", "uncrumpled", "https://youtu.be/SDQ-Vvdqa3s") + .addTrackInfo(RadioMetadata.newLAV("Ghost Pieght", "uncrumpled", RadioMetadata.createYouTubeURI("SDQ-Vvdqa3s")).bOfficial()) + .addTrackInfo(RadioMetadata.newLAV("In HoNoR oF oUr MoSt FuNnY tIkToK", "jaydencroes", RadioMetadata.createTikTokURI("6803451075920776454", "jaydencroes")).setFor(0).bOriginal().bOfficial()) + .addTrackInfo(RadioMetadata.newLA("Ghost Fight", "Toby Fox", RadioMetadata.createBandcampURI("ghost-fight-2", "tobyfox")).setFor(1).bOriginal().bOfficial()) + .addTrackInfo(RadioMetadata.newLA(null, null, RadioMetadata.createAppleMusicURI(1119807147)).setFor(1).bOriginal().bOfficial().bAlt()) .addTags([ "ylyl" ]) .addSource(RadioSource.new("video/mp4", [ "avc1.4D4029", "mp4a.40.2" ]) .setURI("mxc://glowers.club/bVJrnYxFEUzZnebnClncWYxK") @@ -1075,18 +1269,65 @@ const mediaItems = [ .addPreview("mxc://glowers.club/OcyarqkcuWucgkXOGtcgpJAa", "image/jpg", "250x250")), RadioItem.new("moonbase") - .setMetadata("MOONBASE BABY (ft. Hatsune Miku)", "KnightOfGames", "https://youtu.be/MIxowl5YuaQ") + .addTrackInfo(RadioMetadata.newLA("MOONBASE BABY (ft. Hatsune Miku)", "KnightOfGames", RadioMetadata.createYouTubeURI("MIxowl5YuaQ")).bOfficial()) + .addTrackInfo(RadioMetadata.newLA("INDUSTRY BABY", "Lil Nas X", RadioMetadata.createYouTubeURI("UTHLKHL_whs")).bOriginal().bOfficial()) + .addTrackInfo(RadioMetadata.newLA(null, null, RadioMetadata.createAppleMusicURI(1576552565)).bOriginal().bOfficial().bAlt()) .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/AybVVfwhrAOCWTkGtMeIxkdB") .addPreview("mxc://glowers.club/NuOKRVCYsxywWAsmRdoSVJfX", "image/jpg", "500x500")), RadioItem.new("blsdm") - .setMetadata("Black Lives (Still Don't) Matter", "Moonman") + .addTrackInfo(RadioMetadata.newLA("Black Lives (Still Don't) Matter", "Moonman")) .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/GfcCntGLSZsYkkzzkaoJrUWx") .addPreview("mxc://glowers.club/yyWJVkClXhWIFqgayFFtZZDJ", "image/jpg", "500x500")), -].filter(Boolean).map(a => a.serialize()).sort((a,b) => a.id.localeCompare(b.id)) + RadioItem.new("stronger") + .addTrackInfo(RadioMetadata.newLA("♂ Stonebank - How strong you are ♂", "duyui", RadioMetadata.createYouTubeURI("MIxowl5YuaQ")).bOfficial()) + .addTrackInfo(RadioMetadata.newLA("Stronger", "Stonebank", RadioMetadata.createYouTubeURI("I1NuCWfYeYc")).bOriginal().bOfficial()) + .addTrackInfo(RadioMetadata.newLA(null, null, RadioMetadata.createAppleMusicURI(951790852)).bOriginal().bOfficial().bAlt()) + .addTags([ "gachi" ]) + .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) + .setURI("mxc://glowers.club/COBFDSucwknvESlGcXQthuMN") + .addPreview("mxc://glowers.club/QnxgSLfTrHUJLeqreUVmCQhO", "image/jpg", "500x500")), + + RadioItem.new("cbt") + .addTrackInfo(RadioMetadata.newLA("unfinished/abandoned ytpmv projects 2 (feb 2020 - dec 2022)", "KnightOfGames", RadioMetadata.createYouTubeURI("d8FT7CpYMgQ"), "0:00 to 1:59").bOfficial()) + .addTrackInfo(RadioMetadata.newLA("One-Winged Angel (Final Fantasy VII)", "Nobuo Uematsu", RadioMetadata.createYouTubeURI("zkZGFNCS6iQ")).setFor(0).bOriginal().bOfficial()) + .addTrackInfo(RadioMetadata.newLA(null, null, RadioMetadata.createAppleMusicURI(1439125559)).setFor(0).bOriginal().bOfficial().bAlt()) + .addTrackInfo(RadioMetadata.newLA("CocknBallTorture.ogg", "Alabaster Constantine III", RadioMetadata.createWikipediaURI("File:CocknBallTorture.ogg")).setFor(1).bOriginal().bOfficial()) + .addTags([ "metadata-prefer-id" ]) + .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) + .setURI("mxc://glowers.club/wkZaRVKkHqBCHpjYVQzKvsZs") + .addPreview("mxc://glowers.club/KgrZIZJKvEnWPWnDukTKaRqR", "image/jpg", "500x500")), + + RadioItem.new("fu") + .addTrackInfo(RadioMetadata.newLAV("unfinished/abandoned ytpmv projects 2 (feb 2020 - dec 2022)", "KnightOfGames", RadioMetadata.createYouTubeURI("d8FT7CpYMgQ"), "3:07 to 3:27").bOfficial()) + .addTrackInfo(RadioMetadata.newLAV("Darkwing Duck (Turbografx 16) - Angry Video Game Nerd (AVGN)", "Cinemassacre", RadioMetadata.createYouTubeURI("x3cewR_sMYI"), "10:40 to 10:54").setFor(0).bOriginal().bOfficial()) + .addTrackInfo(RadioMetadata.newLA("Mtc", "S3RL", RadioMetadata.createYouTubeURI("bO-NaEj2dQ0")).setFor(1).bOriginal().bOfficial()) + .addTrackInfo(RadioMetadata.newLA(null, null, RadioMetadata.createAppleMusicURI(500173662)).setFor(1).bOriginal().bOfficial().bAlt()) + .addTags([ "metadata-prefer-id" ]) + .addSource(RadioSource.new("video/mp4", [ "avc1.4D4029", "mp4a.40.2" ]) + .setURI("mxc://glowers.club/BAGYQxmJGQdjKYnUfufHnvDc") + .addPreview("mxc://glowers.club/fBUMGKYdJHmjSvPkCLiWSAEG", "image/jpg", "800x450")) + .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) + .setURI("mxc://glowers.club/PRaJyCRuCnseFufeIlFeherJ") + .addPreview("mxc://glowers.club/skHzOJjiHKtFrzeBeVUZnsfh", "image/jpg", "500x500")), + + RadioItem.new("diamondsword") + .addTrackInfo(RadioMetadata.newLAV("unfinished/abandoned ytpmv projects 2 (feb 2020 - dec 2022)", "KnightOfGames", RadioMetadata.createYouTubeURI("d8FT7CpYMgQ"), "3:30 to 3:57").bOfficial()) + .addTrackInfo(RadioMetadata.newLAV("I Can Swing My Sword! (feat. Terabrite)", "Tobuscus", RadioMetadata.createYouTubeURI("eN7dYDYfvVg")).setFor(0).bOriginal().bOfficial()) + .addTrackInfo(RadioMetadata.newLA(null, null, RadioMetadata.createAppleMusicURI(518379277)).setFor(0).bOriginal().bOfficial().bAlt()) + .addTrackInfo(RadioMetadata.newLA("Track 26 (Plantation)", "天谷大輔", RadioMetadata.createYouTubeURI("aHtWKbR_P-c")).setFor(1).bOriginal()) + .addTags([ "metadata-prefer-id" ]) + .addSource(RadioSource.new("video/mp4", [ "avc1.4D4029", "mp4a.40.2" ]) + .setURI("mxc://glowers.club/LpzkeoSVxfFBPYCcVIRawREk") + .addPreview("mxc://glowers.club/XBVPXnaargixijAaKLxFWKEc", "image/jpg", "800x454")) + .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) + .setURI("mxc://glowers.club/qsxMSogWbxDJOTpWetgcyqfs") + .addPreview("mxc://glowers.club/vmwNdqdALTzZlcZgpgXzoBmN", "image/jpg", "500x500")), + +].filter(Boolean).map((a,i) => a.serialize(i)).sort((a,b) => a.id.localeCompare(b.id)) const lintCodecWarnings = { "video/mp4": [ @@ -1132,7 +1373,7 @@ for (const item of mediaItems) { } const radioObj = { - "version": 5, + "version": 6, "songs": mediaItems }