#!/usr/bin/env node "use-strict"; const fs = require("fs") const objSerialize = (obj, keys, cb) => { let a = Object.create(null) for (const key of keys) a[key] = obj[key] if (cb) return cb(a) return a } const objBulkSet = (obj, target, pairs) => { if (typeof obj[target] != "object") obj[target] = Object.create(null) for (const key in pairs) if (pairs[key] != undefined) obj[target][key] = pairs[key] } const notNullElse = (a, fallback) => a != null && a != undefined ? a : fallback const RadioItem = function (id) { this.id = id this.metadata = undefined this.tags = undefined this.sources = [] return this } RadioItem.new = id => new RadioItem(id) RadioItem.prototype.setMetadata = function (title, artist, href, extra) { objBulkSet(this, "metadata", { title, artist, href, extra }); return this } RadioItem.prototype.addTags = function (tags) { this.tags = this.tags ? [ ...(this.tags), ...tags ] : tags; return this } RadioItem.prototype.addStyleTags = function (tags) { return this.addTags(tags.map(a => `radio-media-style-${a}`)); return this } RadioItem.prototype.addSource = function (source) { this.sources.push(source); return this } RadioItem.prototype.setNiggadata = function (nigid, nigkey) { this.setMetadata() this.metadata._nigid = nigid this.metadata._nigkey = nigkey this.addTags([ "niggers" ]) return this } RadioItem.prototype.serialize = function () { return objSerialize(this, [ "id", "tags", "metadata" ], obj => ({ ...obj, "sources": this.sources.map(source => source.serialize()) })) } const EDisplayType = { "NATIVE": -1, "LANDSCAPE": 0, "SQUARE": 1, "STRETCH": 2 } const RadioSource = function (type, codecs) { this.type = type this.uri = null this.previews = [] this.setTypeWCodec(type, codecs) return this } RadioSource.new = (type, codecs) => new RadioSource(type, codecs) RadioSource.prototype.setURI = function (uri) { this.uri = uri; return this } RadioSource.prototype.setTypeWCodec = function (type, codecs) { this.type = type this.codecs = codecs?.length ? codecs : undefined return this } // LLL[], LLL RadioSource.prototype.addPreview = function () { let uri, type, codecs, size, displayType if (typeof arguments[0] == "string" && typeof arguments[1] == "string" && arguments[2] instanceof Array) { uri = arguments[0] type = arguments[1] codecs = arguments[2] size = arguments[3] displayType = arguments[4] } else if (typeof arguments[0] == "string" && typeof arguments[1] == "string" && typeof arguments[2] == "string") { uri = arguments[0] type = arguments[1] size = arguments[2] displayType = arguments[3] } else throw new TypeError("Could not recognize arguments. Expecting [ LString, LString, LString, ...?] or [ LString, LString, LString[], ...?]") this.previews.push(RadioPreview.new(uri, type, codecs, size, displayType)) return this } RadioSource.prototype.serialize = function () { return objSerialize(this, [ "type", "codecs", "uri" ], obj => ({ ...obj, "previews": this.previews.map(preview => preview.serialize(obj)) })) } const RadioPreview = function (uri, type, codecs, size, displayType=null) { this.uri = uri this.type = type this.codecs = codecs?.length ? codecs : undefined this.size = size.replace(/x/g, "×") this.display_type = displayType return this } RadioPreview.new = (uri, type, codecs, size, displayType) => new RadioPreview(uri, type, codecs, size, displayType) RadioPreview.prototype.serialize = function (radioSource) { this.display_type = notNullElse(this.display_type, radioSource.type.startsWith("video/") ? EDisplayType.NATIVE : EDisplayType.SQUARE) return objSerialize(this, [ "display_type", "type", "codecs", "size", "uri" ]) } const mediaItems = [ RadioItem.new("nightinjunitaki") .setMetadata("Night In Junitaki", "Wünsche") .addTags([ "splash-song" ]) .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("x-gwm://wiki/night_in_junitaki_-_waves.mp3") .addPreview("mxc://glowers.club/HCiiIVMOekjPZtiEaexDdUsD", "image/jpg", "400x400")), RadioItem.new("goodbyeautumn") .setMetadata("Goodbye Autumn", "Tomppabeats") .addTags([ "splash-song" ]) .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("x-gwm://wiki/goodbye_autumn.mp3") .addPreview("mxc://glowers.club/HCiiIVMOekjPZtiEaexDdUsD", "image/jpg", "400x400")), RadioItem.new("balmy") .setMetadata("Balmy", "90sFlav") .addTags([ "splash-song" ]) .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("x-gwm://wiki/balmy90sblav.mp3") .addPreview("mxc://glowers.club/kDNCBjvQxfPvtJVmfEMmcdov", "image/jpg", "999x999")), RadioItem.new("springletter") .setMetadata("Spring Letter", "90sFlav") .addTags([ "splash-song" ]) .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("x-gwm://wiki/spring_letter.mp3") .addPreview("mxc://glowers.club/wTLwzrymoDeNGdJLEpDoEBtZ", "image/jpg", "500x500")), RadioItem.new("weep") .setMetadata("Weep", "90sFlav") .addTags([ "splash-song" ]) .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("x-gwm://wiki/weep.mp3") .addPreview("mxc://glowers.club/jIkXGOSECsPPyJTvgrxPhRoq", "image/jpg", "500x500")), RadioItem.new("whenimetyou") .setMetadata("When I Met You", "90sFlav") .addTags([ "splash-song" ]) .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("x-gwm://wiki/when_i_met_you.mp3") .addPreview("mxc://glowers.club/ntDKDFtqeQCmIVoRtzRQdvEC", "image/jpg", "500x500")), RadioItem.new("sevenofnine") .setMetadata("Seven of Nine", "90sFlav") .addTags([ "splash-song" ]) .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("x-gwm://wiki/seven_of_nine.mp3") .addPreview("mxc://glowers.club/kDNCBjvQxfPvtJVmfEMmcdov", "image/jpg", "999x999")), RadioItem.new("callme") .setMetadata("Call Me", "90sFlav") .addTags([ "splash-song" ]) .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("x-gwm://wiki/call_me.mp3") .addPreview("mxc://glowers.club/kDNCBjvQxfPvtJVmfEMmcdov", "image/jpg", "999x999")), RadioItem.new("midnightsession") .setMetadata("Midnight Session", "90sFlav") .addTags([ "splash-song" ]) .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("x-gwm://wiki/полуночная_сессия.mp3") .addPreview("mxc://glowers.club/pLexnITqTOhJUXBOKtDAiZzv", "image/jpg", "288x288")), RadioItem.new("southdakota") .setMetadata("South Dakota", "Keeloh", "https://soundcloud.com/keelohproducer/southdakota") .addTags([ "splash-song" ]) .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("x-gwm://wiki/southdakota.mp3") .addPreview("mxc://glowers.club/FJfFhscJavurBvoEuRbykpmM", "image/jpg", "500x500")), RadioItem.new("dobson") .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") .addSource(RadioSource.new("video/mp4", [ "avc1.64001E", "mp4a.40.2" ]) .setURI("mxc://glowers.club/stlNnyEIUVGluyhpPSGhtjJg") .addPreview("mxc://glowers.club/BczfFtojBhwMxTNjoZfhemam", "image/jpg", "638x360") .addPreview("mxc://glowers.club/wVLvTOIodRqOcasDAFxkqHaG", "video/mp4", [ "avc1.4D401F" ], "358x360", EDisplayType.SQUARE) .addPreview("mxc://glowers.club/EBQRprvJmkNfsZTzCzDkPVTv", "image/gif", "320x320", EDisplayType.SQUARE)) .addSource(RadioSource.new("video/webm", [ "vp8", "vorbis" ]) .setURI("mxc://glowers.club/xnYQdrroEheIZBfigHGZferu") .addPreview("mxc://glowers.club/BczfFtojBhwMxTNjoZfhemam", "image/jpg", "638x360") .addPreview("mxc://glowers.club/wVLvTOIodRqOcasDAFxkqHaG", "video/mp4", [ "avc1.4D401F" ], "358x360", EDisplayType.SQUARE) .addPreview("mxc://glowers.club/EBQRprvJmkNfsZTzCzDkPVTv", "image/gif", "320x320", EDisplayType.SQUARE)), RadioItem.new("femalecops") .addTags([ "misc" ]) .addSource(RadioSource.new("video/mp4", [ "avc1.64001F", "mp4a.40.2" ]) .setURI("mxc://glowers.club/ZSyUyEGvOLOoUaqFVoCYPTif") .addPreview("mxc://glowers.club/BVQhXkWSYbvFcSerzVZFgfrn", "image/jpg", "600x600")) .addSource(RadioSource.new("video/webm", [ "vp9", "opus" ]) .setURI("mxc://glowers.club/RYjIfTiZKSKBdYBvjGtyBILa") .addPreview("mxc://glowers.club/BVQhXkWSYbvFcSerzVZFgfrn", "image/jpg", "600x600")), RadioItem.new("autisticclowns") .addTags([ "misc" ]) .addSource(RadioSource.new("video/mp4", [ "avc1.640015", "mp4a.40.2" ]) .setURI("mxc://glowers.club/fGszYTUkpyWsKuxphzJSfAZk") .addPreview("mxc://glowers.club/esDPBgpoTvTtqekHAQJRwqtK", "image/jpg", "480x272")) .addSource(RadioSource.new("video/quicktime", [ "avc1.4D0015", "mp4a.40.2" ]) .setURI("mxc://glowers.club/WqYtubpqVplLjSxxmaxNeQir") .addPreview("mxc://glowers.club/esDPBgpoTvTtqekHAQJRwqtK", "image/jpg", "480x272")), RadioItem.new("ifuckinglovescience") .setMetadata("I FUCKING LOVE SCIENCE", "Hank Green") .addSource(RadioSource.new("video/webm", [ "vp9", "opus" ]) .setURI("mxc://glowers.club/abgQasVrghOSkpRZTIfHMFyF") .addPreview("mxc://glowers.club/IhivpcDssjnjSDHBdMEGGwVp", "image/jpg", "320x180")) .addSource(RadioSource.new("video/mp4", [ "avc1.4D401F", "mp4a.40.2" ]) .setURI("mxc://glowers.club/ieQlfAlPPGeXLsvevolcQKqO") .addPreview("mxc://glowers.club/IhivpcDssjnjSDHBdMEGGwVp", "image/jpg", "320x180")), RadioItem.new("dootnukem") .setMetadata("Doot Nukem", "Sylva", "https://youtu.be/cHJQ6LqZ4ks") .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/xsuBJwyAUwuDoASbmqjZWrLO") .addPreview("mxc://glowers.club/ymWgXucYRzhsgdiecjBkFvmz", "image/jpg", "1600x1800", EDisplayType.STRETCH)), RadioItem.new("hyperborea") .setMetadata("Somebody That I Used to Know", "VelvetCasca") .addSource(RadioSource.new("video/mp4", [ "avc1.4D401F", "mp4a.40.2" ]) .setURI("mxc://glowers.club/egAyPBuGNFPYyvnMWMxySLiX") .addPreview("mxc://glowers.club/dOxJvUWRlGqRRxJdpDRZyeko", "image/jpg", "640x360")), RadioItem.new("feizhou") .setMetadata("Without the Communist Party, There Would Be No New China", "Brother Hao", "https://youtu.be/5tCMI0uKbBE") .addSource(RadioSource.new("video/mp4", [ "avc1.42C015", "mp4a.40.2" ]) .setURI("mxc://glowers.club/fVKJZgWpIHRmilhZLboFXOIK") .addPreview("mxc://glowers.club/EuYQZnqLjRGPMocgqGqtKFpJ", "image/jpg", "366x240")) .addSource(RadioSource.new("video/webm", [ "vp8", "vorbis" ]) .setURI("mxc://glowers.club/EVRGpqeefZdsjVawOvSkOdvZ") .addPreview("mxc://glowers.club/GywrCPMpcpsLFJQAuYoZRuzq", "image/jpg", "366x240")), RadioItem.new("breathe") .setMetadata("Breathe (in the Air)", "Pink Floyd") .addSource(RadioSource.new("video/mp4", [ "avc1.64001E", "mp4a.40.2" ]) .setURI("mxc://glowers.club/MOyzIHtapiyrpxaYRoiQqMqf") .addPreview("mxc://glowers.club/KytvUDmLWCFKQWwHemdDTksd", "image/jpg", "640x360")) .addSource(RadioSource.new("video/webm", [ "vp8", "vorbis" ]) .setURI("mxc://glowers.club/HAGTNySLRemaDfjZMSmpktDj") .addPreview("mxc://glowers.club/KytvUDmLWCFKQWwHemdDTksd", "image/jpg", "640x360")), RadioItem.new("fuckjuice") .setMetadata("Fuck Jannies and Fuck Juice", "The Crystal Crypt") .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/bxMoRJmYFteVNNntNhqrniNJ") .addPreview("mxc://glowers.club/YgeFvRPLguZOCGtUJFJednNj", "image/jpg", "276x240")), RadioItem.new("onegame") .setMetadata("ONE GAME", "Chris Voiceman") .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/iejQiyaVtnqhuSSCuXqviAIN") .addPreview("mxc://glowers.club/bZonXMZjhadXyazpKscvRBiP", "image/jpg", "255x255")), RadioItem.new("imaginebeingdruckmann") .setMetadata("Imagine Being Druckmann", "Chris Voiceman") .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/wRsCVvtUiLzFnDjwwgkCnXzN") .addPreview("mxc://glowers.club/ipWDVreHeWKOqefUBuvyFxjj", "image/jpg", "255x255")), RadioItem.new("copeacabana") .setMetadata("Cope-a-Cabana", "Chris Voiceman") .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/zEmMFUyaIBmuqAeogVZAMrmO") .addPreview("mxc://glowers.club/WBhXYzFgTyMVTTEWKwzDfsgF", "image/jpg", "512x512")), RadioItem.new("jihad") .setMetadata("Heyaw Rijal Al Qassam", "Inshad Ensemble") .addStyleTags([ "artwork-box-no-shadow" ]) .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("x-gwm://gnujihad.mp3") .addPreview("x-gwm://chromiumjihad.gif", "image/gif", "420x236")), RadioItem.new("thisistheinfowar") .setMetadata("In the House, In a Heartbeat", "John Murphy") .addTags([ "metadata-prefer-id" ]) .addSource(RadioSource.new("video/mp4", [ "avc1.64001E", "mp4a.40.2" ]) .setURI("mxc://glowers.club/HVZUugkUhbJEPDncuTpAnOfh") .addPreview("mxc://glowers.club/klXuXEwYNmYvsZhNOaXsDGJq", "image/jpg", "640x360")) .addSource(RadioSource.new("video/webm", [ "vp8", "vorbis" ]) .setURI("mxc://glowers.club/znoCPlczXEXaEAVaiKHopnAV") .addPreview("mxc://glowers.club/klXuXEwYNmYvsZhNOaXsDGJq", "image/jpg", "640x360")), RadioItem.new("floyd") .setMetadata("Paralyzer", "Finger Seven") .addTags([ "misc" ]) .addSource(RadioSource.new("video/mp4", [ "avc1.640020", "mp4a.40.2" ]) .setURI("mxc://glowers.club/qtBuqQBqBrpyusCsWYXlgmtE") .addPreview("mxc://glowers.club/JjsGuJkEGAbudLaYvbAcxryQ", "image/jpg", "600x600")) .addSource(RadioSource.new("video/quicktime", [ "avc1.640020", "mp4a.40.2" ]) .setURI("mxc://glowers.club/IusHmBCOyJZFGHxsGjRkYqXf") .addPreview("mxc://glowers.club/JjsGuJkEGAbudLaYvbAcxryQ", "image/jpg", "600x600")), RadioItem.new("amd") .setMetadata("Svetovid", "Jan Janko Močnik") .addTags([ "misc" ]) .addSource(RadioSource.new("video/mp4", [ "avc1.64001F", "mp4a.40.2" ]) .setURI("mxc://glowers.club/wgQPrdTCUUTnKgpnwDVlEakc") .addPreview("mxc://glowers.club/GccquMupQGvDXYNeifUbxfuy", "image/jpg", "800x450")) .addSource(RadioSource.new("video/webm", [ "vp8", "vorbis" ]) .setURI("mxc://glowers.club/RBvSWrEWiFtIuDUCoxZbCDTW") .addPreview("mxc://glowers.club/GccquMupQGvDXYNeifUbxfuy", "image/jpg", "800x450")), // TODO: Add thumbnail RadioItem.new("israel") .setMetadata("Shake Israel's Security", "National Radio") .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/cJMVPnPpkSZFHIRHtzXRrvna")), RadioItem.new("honorary") .setMetadata("Erika", "Major Han Friess") .addTags([ "metadata-prefer-id" ]) .addSource(RadioSource.new("video/mp4", [ "avc1.64001E", "mp4a.40.2" ]) .setURI("mxc://glowers.club/cQgzwWXtxDSqqOlwGZYShVXS") .addPreview("mxc://glowers.club/aENkwWEKXIztqyBTJrBHCmRQ", "image/jpg", "800x450")) .addSource(RadioSource.new("video/webm", [ "vp8", "vorbis" ]) .setURI("mxc://glowers.club/qMkbHHunSgPzkFpcoOuYeIuE") .addPreview("mxc://glowers.club/aENkwWEKXIztqyBTJrBHCmRQ", "image/jpg", "800x450")), RadioItem.new("bashar") .setMetadata("God, Syria, and Bashar", "Rami Kazour") .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/egmaXMIHsNmblfDjyTGHdyas") .addPreview("mxc://glowers.club/wpwHKoSFsxkNttaNyaNFzhMk", "image/jpg", "794x582")), RadioItem.new("hatethem") .setMetadata("Niggerz Bop", "Mike David", "https://youtu.be/VkcAXS9IKdc") .setNiggadata("hatethem", "585a286c042231244a73b19e") .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/kYKpgAelvgRjDOVHJYKIYwdS") .addPreview("mxc://glowers.club/IbShqtSWZksFbnOdFiVDFwqD", "image/jpg", "609x600")) .addSource(RadioSource.new("audio/ogg", [ "opus" ]) .setURI("mxc://glowers.club/wdflEjUfqAkoyOyCDBXebDkw") .addPreview("mxc://glowers.club/IbShqtSWZksFbnOdFiVDFwqD", "image/jpg", "609x600")), RadioItem.new("wishmaster") .setMetadata("Wishmaster", "Van Canto", "https://youtu.be/XCGQiGEYl4Y") .setNiggadata("wishmaster", "570550d318f3c6dc5677b9f6") .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/TWmjcXRxqaVOfYnWPItiPAcd") .addPreview("mxc://glowers.club/OKTbfAlagYXulaeBmgwkNwii", "image/jpg", "352x288", EDisplayType.STRETCH)) .addSource(RadioSource.new("audio/ogg", [ "vorbis" ]) .setURI("mxc://glowers.club/uaxDKxCUtRVXMWAJgoKeiNcJ") .addPreview("mxc://glowers.club/OKTbfAlagYXulaeBmgwkNwii", "image/jpg", "352x288", EDisplayType.STRETCH)), RadioItem.new("negromancy") .setMetadata(undefined, undefined, "https://youtu.be/PxjA-jq1e7E") .addTags([ "misc" ]) .addSource(RadioSource.new("video/mp4", [ "avc1.64001E", "mp4a.40.2" ]) .setURI("mxc://glowers.club/kYDmqwhymAidlTbdFHHliXrk") .addPreview("mxc://glowers.club/qAtvGoVERlYfFnNWeizoYiGP", "image/jpg", "640x360")) .addSource(RadioSource.new("video/webm", [ "vp9", "opus" ]) .setURI("mxc://glowers.club/hRDjowdyaPRkdrRkHtCeqGug") .addPreview("mxc://glowers.club/qAtvGoVERlYfFnNWeizoYiGP", "image/jpg", "640x360")), RadioItem.new("crocodilechop") .setMetadata("Crocodile Chop", "Neil Cicierega", "https://soundcloud.com/neilcic/crocodile-chop") .setNiggadata("crocodilechop", "570550d318f3c6dc5677b9d1") .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/CIwbaGcPmsbqvZtdILxJxdHN") .addPreview("mxc://glowers.club/ITHVCToEENFZhXGKaYuHplFV", "image/jpg", "500x500")), RadioItem.new("tapeworms") .setMetadata("I Staple Tapeworms on my Penis", "SillyJenny9000", "https://youtu.be/v21iDJeWfVE") .setNiggadata("tapeworms", "570550d318f3c6dc5677b9b0") .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/NnrVJeWXXzqEUDhDQazMDYrr") .addPreview("mxc://glowers.club/jKmUwOLJMGPAhdJGusuWCJgQ", "image/jpg", "652x619")), RadioItem.new("withoutcosby") .setMetadata("without cosby", "bong iguana", "https://soundcloud.com/bong-iguana/without-cosby") .setNiggadata("withoutcosby", "570550d318f3c6dc5677b9e9") .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/ERjkVBvKLvTIBEhOsEkWHENM") .addPreview("mxc://glowers.club/xgoxdfvMRtmobnPMTrdqsQic", "image/jpg", "500x500")), RadioItem.new("niggatorial") .setMetadata("I'm The 2007 YouTube Tutorial", "▲A▲", "https://soundcloud.com/kraiqyttyj/im-the-2007-youtube-tutorial") .setNiggadata("tutorial", "570550d318f3c6dc5677b9d7") .addTags([ "metadata-prefer-id" ]) .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/XZGliHHOkhcxCSUxKoIkgUlI") .addPreview("mxc://glowers.club/nAaKRXuNBjltAYJbsLnjGusH", "image/jpg", "899x715")), RadioItem.new("imposterd") .setMetadata("Among Us Eurobeat Remix", "maki ligon", "https://soundcloud.com/maki-ligon-deez-nutz/among-us-drip-eurobeat-remix") .addTags([ "splash-song", "sus" ]) .addStyleTags([ "background-noblur-nobgsize", "artwork-nobox", "artwork-box-no-shadow" ]) .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("x-gwm://include/imposterd.mp3") .addPreview("x-gwm://include/crewmate.gif", "image/gif", "128x108")), RadioItem.new("dripmachine") .setMetadata("Amogus Drip Machine", "maki ligon", "https://soundcloud.com/maki-ligon-deez-nutz/amogus-drip-machine") .addTags([ "splash-song", "sus" ]) .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/DyboACFryZTCDeIgHtcRaBpL") .addPreview("mxc://glowers.club/VFehbVZaCVcNhQTYWuWRYTiM", "image/jpg", "500x500")), RadioItem.new("loneimposter") .setMetadata("Lone Impostor", "maki ligon", "https://youtu.be/QbIckU4sXBM") .addTags([ "splash-song", "sus" ]) .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/oswdiINtTUUbQYEMEKpVmsHN") .addPreview("mxc://glowers.club/jYlptPwURJXVMBNivxlBFPuP", "image/jpg", "1440x1440")), RadioItem.new("amogusdrip") .setMetadata("Among Us Drip Theme Song", "Leonz", "https://youtu.be/grd-K33tOSM") .addTags([ "splash-song", "sus" ]) .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/xQHxUgpRUMtIkiBaszXiGAvh") .addPreview("mxc://glowers.club/erMHzidVOoqoWFXIxXAcozqW", "image/jpg", "512x512")), RadioItem.new("crewmate") .setMetadata("Among Us (Lofi Hip Hop Remix)", "Leonz", "https://youtu.be/gU39w8s54_Q") .addTags([ "splash-song", "sus" ]) .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/txMHzslGxRyDmNVsUCObJRzc") .addPreview("mxc://glowers.club/PfEBpatFHatQubohkgQThOor", "image/jpg", "632x632")), RadioItem.new("GETOUTOFMYHEAD") .setMetadata("GETOUTOFMYHEAD", "placeboing", "https://youtu.be/Xnv38FnLkbM") .addTags([ "splash-song", "sus" ]) .addSource(RadioSource.new("video/mp4", [ "avc1.4D401F", "mp4a.40.2" ]) .setURI("mxc://glowers.club/sEtheeOyZlztUtQuHOzOJpOk") .addPreview("mxc://glowers.club/bJveZSEIXFsnEKdjDvwmmENo", "image/jpg", "800x450")), RadioItem.new("gay") .setMetadata("I Am Gay", "Holland Boys", "https://youtu.be/cZs_nP1WufE") .addTags([ "gay" ]) .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/FAaatrvlEjJFljvNHhDhcNGl") .addPreview("mxc://glowers.club/KrefLQCybeCNwLIFZwzWVolF", "image/png", "489x512")), RadioItem.new("floydtrix") .setMetadata("Clubbed to Death", "Rob Dougan", "https://youtu.be/pFS4zYWxzNA") .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/YUqRzRddNWuXQaAlPPMpwvse") .addPreview("mxc://glowers.club/mFyOeCDaBRhxZCXeeMxDmZhD", "image/jpg", "588x634")), RadioItem.new("hotline") .setMetadata("Gangster Party Line", "Brent Weinbach", "https://youtu.be/Cx1J2CzNnS8") .setNiggadata("hotline", undefined) .addTags([ "misc" ]) .addSource(RadioSource.new("video/mp4", [ "avc1.4D401F", "mp4a.40.2" ]) .setURI("mxc://glowers.club/gnZElBwskTnBXkeZPiINVtSB") .addPreview("mxc://glowers.club/iPoGcvVbhmElZgaZuEdNQDBJ", "image/jpg", "480x356")), RadioItem.new("bldm") .setMetadata("Black Lives (Don't) Matter", "Moonman") .addTags([ "moonman" ]) .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/OXoYKzSBuKWHXcHDzZIaMfja") .addPreview("mxc://glowers.club/SYLXjGHjuXzBnReqrfoRnuhg", "image/jpg", "1024x966")), RadioItem.new("amogusfloyd") .setMetadata(undefined, undefined, "https://www.bitchute.com/video/PJXAu4xA4SUt/") .addTags([ "misc" ]) .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/SzqNmhQOxaReaTmOegUItcHY") .addPreview("mxc://glowers.club/aHWNIqMTUjXZRGZUqZCuOgbi", "image/jpg", "898x480", EDisplayType.LANDSCAPE)), RadioItem.new("whenblackissus") .setMetadata("Among Us theme song but it's in the style of Metallica's Black Album", "rex", "https://youtu.be/tA2Sr6GgbWo") .addTags([ "sus", "metadata-prefer-id" ]) .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/VDXDeYltzQOhTChQtmsZaybu") .addPreview("mxc://glowers.club/JAWtHKTIefGJzYadLOUofaWl", "image/jpg", "1080x1080")), RadioItem.new("doot") .setMetadata("Knee Deep in the Doot", "Nick Ino", "https://youtu.be/hzPpWInAiOg") .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/HvYByMgvFKONqIPmujCGaIIp") .addPreview("mxc://glowers.club/dXELpQnsrrcwHuElSQHEPaRn", "image/jpg", "512x512")), RadioItem.new("ywnbaw") .setMetadata("Professor proves SICKS are the best weapons", "Shadiversity", "https://youtu.be/mPnscZFUuog") .addTags([ "misc", "metadata-prefer-id" ]) .addSource(RadioSource.new("video/mp4", [ "avc1.4D401F", "mp4a.40.2" ]) .setURI("mxc://glowers.club/qYCbeFblMeBUMDZEiuBWuFnX") .addPreview("mxc://glowers.club/dDbuzhpAoewNQoKHCejeQqdk", "image/jpg", "800x450")), RadioItem.new("feedandseed") .addTags([ "misc" ]) .addSource(RadioSource.new("video/mp4", [ "avc1.64001E", "mp4a.40.2" ]) .setURI("mxc://glowers.club/vsMepElCpNKFgLltczQRjxfJ") .addPreview("mxc://glowers.club/zUXbbLOCCxZoZDRIwVCzHFYC", "image/jpg", "654x480")), RadioItem.new("yatta") .setMetadata("YATTA!", "HAPPATAI!", "https://youtu.be/rW6M8D41ZWU") .setNiggadata("yatta", "570550d318f3c6dc5677b9bc") .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/oKXrDvGUNQJWzBsmwYwjsCZs") .addPreview("mxc://glowers.club/dBJtIlaEcsZoflXYqPnihooO", "image/jpg", "374x374")), RadioItem.new("alexjones") .setMetadata("Alex Jones Remix: Renai Circulation", "Triple-Q", "https://youtu.be/ODZE5peUfWQ") .setNiggadata("alexjones", "5796ca3646f17bf005a01be3") .addTags([ "metadata-prefer-id" ]) .addSource(RadioSource.new("video/mp4", [ "avc1.4D401F", "mp4a.40.2" ]) .setURI("mxc://glowers.club/vADMHcSVAzikHdjSRXKsmllx") .addPreview("mxc://glowers.club/igLcLQjIYWSzTCRAPDMxSAmh", "image/jpg", "853x480") .addPreview("mxc://glowers.club/dcqgSxtEyYBQNpYLfpXkxADL", "image/jpg", "500x500", EDisplayType.SQUARE)), RadioItem.new("avemaria") .setMetadata("Ave Maria", "Daniel Perret", "https://youtu.be/4swAeQGBvAs") .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("x-gwm://wiki/avemaria.mp3") .addPreview("mxc://glowers.club/UvQPlQTYoDjufDtdjZnPShmm", "image/png", "546x546")), RadioItem.new("thelinuxexperience") .addTags([ "misc" ]) .addSource(RadioSource.new("video/mp4", [ "avc1.64001F", "mp4a.40.2" ]) .setURI("mxc://glowers.club/kzIdHQbGtQIdEitOruQHrXnM") .addPreview("mxc://glowers.club/wKPEYlKdaZiSdCDbImBInvxm", "image/jpg", "936x558")), RadioItem.new("mywifesblackson") .setMetadata("My Wife's Black Son", "Morrakiu", "https://youtu.be/7NpfbX5coqA") .addSource(RadioSource.new("video/mp4", [ "avc1.4D401F", "mp4a.40.2" ]) .setURI("mxc://glowers.club/aJsmUUQuUDQMVbtKfagCjFQi") .addPreview("mxc://glowers.club/JbyoUSTYQcQaLbEspdRcDhpM", "image/jpg", "936x558")) .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/aQgNmIbxNluQUxtMXBHMScQK") .addPreview("mxc://glowers.club/yTuLtqURfBNcQdUOzDYrndAa", "image/jpg", "720x720", EDisplayType.SQUARE)), RadioItem.new("papermoms") .setMetadata("paper moms", "DOGGIFY", "https://youtu.be/J1rREd1Mx30") .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/roFLNfJtjRcySTTKorwTnUXE") .addPreview("mxc://glowers.club/YOWZcLaAVpfhvbJWkPIviEJG", "image/jpg", "500x500")), RadioItem.new("dngyamom") .setMetadata("Dynamite by BTS but it's Doin' Your Mom", "DOGGIFY", "https://youtu.be/P5UHstVXfTo") .addTags([ "metadata-prefer-id" ]) .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/hYvOhMKYzPMDsFuxLAmRzgyt") .addPreview("mxc://glowers.club/jJdYBFoiPzJIApBvxsPtgkiy", "image/jpg", "500x500")), RadioItem.new("doinurmom") .setMetadata("around your mom", "DOGGIFY", "https://youtu.be/HOZaPGzUVfE") .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/IDOxAAnfqKDqaPwRRHTOCfiG") .addPreview("mxc://glowers.club/TrqWMwgxFtAZYkwmwzzAQzwa", "image/jpg", "500x500")), RadioItem.new("morshufugue") .setMetadata("Morshu Fugue", "DOGGIFY", "https://youtu.be/jxEA1rdQacQ") .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/zPHRyVPopUarJWZrZVdKRZfu") .addPreview("mxc://glowers.club/aaRfbfVYHCmYGzGIGMpGOFvJ", "image/jpg", "500x500")), RadioItem.new("letsgetittoya") .setMetadata("Let's Get It To Ya", "DOGGIFY", "https://youtu.be/04f5Kb2iznA") .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/rWlzEKkPIxxpkRPDnouLijPm") .addPreview("mxc://glowers.club/WFtHpbtgVSNjqnfwZpvwaPgo", "image/jpg", "500x500")), RadioItem.new("indialexjones") .setMetadata("INDIALEX JONES", "LENNOZ", "https://youtu.be/Vhzzt4SK7zw") .addSource(RadioSource.new("video/mp4", [ "avc1.4D401F", "mp4a.40.2" ]) .setURI("mxc://glowers.club/abqGBuacMfwsfTBBONIyPpGt") .addPreview("mxc://glowers.club/ScZuHjnVjYmIWYTuoTMsYnPh", "image/jpg", "853x480") .addPreview("mxc://glowers.club/GiGkhVoVXtPHWYXrTICNDOho", "image/jpg", "500x500", EDisplayType.SQUARE)) .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/xYyAOUmNYGLmLQGtLalyaawr") .addPreview("mxc://glowers.club/GiGkhVoVXtPHWYXrTICNDOho", "image/jpg", "500x500", EDisplayType.SQUARE)), RadioItem.new("nothinwrongwithme") .setMetadata("nothin wrong with me", "LENNOZ", "https://soundcloud.com/mistalenoz/nothin-wrong-with-me") .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/wCaKTMGjInkxJZlDHOvmVvQj") .addPreview("mxc://glowers.club/LyHkbBYYHEfWZaDqDSLcJhFG", "image/jpg", "500x500")), RadioItem.new("cutecute") .setMetadata("cutecute", "LENNOZ", "https://soundcloud.com/mistalenoz/cutecute") .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/yBTztNIxTznUNQiXyNlVEOwW") .addPreview("mxc://glowers.club/QtptSXlBkUgsKYIhcksFFZwn", "image/jpg", "500x500")), RadioItem.new("humbletower") .setMetadata("Humble Tower", "LENNOZ", "https://soundcloud.com/mistalenoz/humble-tower") .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/hovFlQXesRfzhwuvXauxuvYj") .addPreview("mxc://glowers.club/hRwuxtUsNhXPuQLITioKvbTt", "image/jpg", "500x500")), // FIXME: Dead source, highest quality was nigge.rs RadioItem.new("lowbrawl") .setMetadata("How Low Can You Brawl", "DatNiggaOvaDer", "https://soundcloud.com/datniggaovader/how-low-can-you-brawl") .setNiggadata("lowbrawl", "570550d318f3c6dc5677b9c7") .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/JInznJPrTfiXUvQflZYAjsEt") .addPreview("mxc://glowers.club/mieZMZQsCToujzcFnnsRMnfP", "image/jpg", "500x500")), RadioItem.new("smokeonme") .setMetadata("Smoke On Me", "RedScreen", "https://soundcloud.com/alexmashup/smoke-on-me") .setNiggadata("smokeonme", "570550d318f3c6dc5677b9c1") .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/YknxSPlNxSIoyAdRPhtxoJpM") .addPreview("mxc://glowers.club/yjsnEeACeyLtDPiGNgVYEoKS", "image/jpg", "500x500")), RadioItem.new("slamtris") .setMetadata("Slamtris - Quad City DJs vs Hirokazu Tanaka", "comeonandslam", "https://youtu.be/TZv71qYVoJM") .setNiggadata("slamtris", "570550d318f3c6dc5677b9a6") .addTags([ "metadata-prefer-id" ]) .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/bFBMRKTVpzrscifHWtiEIEQO") .addPreview("mxc://glowers.club/SNTFtMEjYkqarTVlZYRxvFUn", "image/jpg", "500x500")), // TODO: Better artwork RadioItem.new("selonlud") .setMetadata("It's My Life", "Село і Люди", "https://youtu.be/d-VVnhwB4Gw") .setNiggadata("selonlud", "570550d318f3c6dc5677b9a2") .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/QbPYwLTBToYdNySFTWqlPcYA") .addPreview("mxc://glowers.club/leiVVHimwUdzqExdgGAenVjH", "image/jpg", "480x480")), RadioItem.new("hymn") .setMetadata("TempleOS Hymn Risen (Remix)", "Dave Eddy", "https://youtu.be/IdYMA6hY_74") .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/xEceAHSVDIhMgZMEIOhJZlmS") .addPreview("mxc://glowers.club/IQiMcCemNZIvtlbXIkxPyXty", "image/jpg", "720x720")), RadioItem.new("smokezelda") .setMetadata("Play Zelda Everyday", "MC Fresh Dawg 3000", "https://soundcloud.com/mcfreshdawg3000/play-zelda-everyday") .setNiggadata("smokezelda", "570550d318f3c6dc5677b9c2") .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/nGtHiLaIQgTLsmSGFqsuqkST") .addPreview("mxc://glowers.club/BmEUsNOXaNKSrXdLRcVaLqoa", "image/jpg", "500x500")), RadioItem.new("katyusha") .setMetadata("カチューシャ", "浜口史郎", "https://youtu.be/NGkXEGH0V1Y") .setNiggadata("panzer", "570550d318f3c6dc5677b99a") .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/aJJKZCrBvRDcbrUQXoWiSLfL") .addPreview("mxc://glowers.club/KGlWUXAnjOQOfnaGGaGMbdnz", "image/jpg", "500x500")), RadioItem.new("ohshitimfeelingit") .setMetadata("OH SHIT I'M FEELING IT", "yung wenli", "https://soundcloud.com/yung_wenli/oh-shit-im-feeling-it") .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/OoDDxMutNpVzlTMbPiBfIvSp") .addPreview("mxc://glowers.club/VrEtpPvDRBhlrxevPuIMAQLp", "image/jpg", "500x500")), RadioItem.new("killallthe") .setMetadata("KILL ALL THE GAYS AND THE FAGGOTS", "Mike David", "https://archive.org/details/killallthegaysandthefaggots451904565") .setNiggadata("killallthe", "570550d318f3c6dc5677ba01") .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/CbLUdYNkCDzYrgwzszgfQBsk") .addPreview("mxc://glowers.club/qnAjqhGYzBLrEmlhzbxreoUC", "image/jpg", "500x500")), RadioItem.new("piebotnik") .setMetadata("dr robotnik bakes a pie", "KnightOfGames", "https://youtu.be/jqKVLZ9wA24") .addSource(RadioSource.new("video/mp4", [ "avc1.4D4028", "mp4a.40.2" ]) .setURI("mxc://glowers.club/YUjleEpsnUnjnQPscgAzVPzX") .addPreview("mxc://glowers.club/jJqCgRDjBVfCHfWzkNnFXuyF", "image/jpg", "800x450") .addPreview("mxc://glowers.club/ZGGXHgsznHoqVrHotiPzpoGq", "image/jpg", "500x500", EDisplayType.SQUARE)) .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/JzNiDnSObgTxugOfEJOpHVHH") .addPreview("mxc://glowers.club/ZGGXHgsznHoqVrHotiPzpoGq", "image/jpg", "500x500", EDisplayType.SQUARE)), RadioItem.new("donarudo") .setMetadata("【ドナルド】もうランランルーしか聞こえない【東方】※立体視可能", "Hoshi-Kun", "https://www.nicovideo.jp/watch/sm3179171") .addSource(RadioSource.new("video/mp4", [ "avc1.4D4029", "mp4a.40.2" ]) .setURI("mxc://glowers.club/XNhgwibiPmHJARjWafsNhSlq", "v") .addPreview("mxc://glowers.club/XwEnNcCEcufMhpmDzxJARYgY", "image/jpg", "853x480") .addPreview("mxc://glowers.club/NBCRNrPnlJmUwiyCTAvKKkzd", "video/mp4", [ "avc1.4D4029" ], "384x384", EDisplayType.SQUARE) .addPreview("mxc://glowers.club/WBuCuaxhOHahCzgSHrDBnyrV", "image/gif", "384x384", EDisplayType.SQUARE)) .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/CIfeVQBVYpBqZRxdVVJWfNJf") .addPreview("mxc://glowers.club/NBCRNrPnlJmUwiyCTAvKKkzd", "video/mp4", [ "avc1.4D4029" ], "384x384", EDisplayType.SQUARE) .addPreview("mxc://glowers.club/WBuCuaxhOHahCzgSHrDBnyrV", "image/gif", "384x384", EDisplayType.SQUARE)), RadioItem.new("elonmusk") .setMetadata("Elon Musk", "Kirino Kōsaka", "https://soundcloud.com/kirinokosaka/elon-musk") .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/UeZJLHulmquZpzVMDLZJVEHu") .addPreview("mxc://glowers.club/BCMoaoUANfsbKttHbjbKxHyS", "image/jpg", "500x500")), // TODO: Artwork could be better RadioItem.new("greenday") .setMetadata("That Hip New Meme Those Boys Are Talking About Today", "Dabunky", "https://soundcloud.com/dabunky/that-hip-new-meme-those-boys-are-talking-about-today") .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/ADNlzFLkpvlfUmGULvOfwVLH") .addPreview("mxc://glowers.club/RhnfTvhvuQNqbqQSZDCYDhOf", "image/jpg", "500x500")), RadioItem.new("heavengrips") .setMetadata("Rhythm Heaven Grips", "Kirino Kōsaka", "https://soundcloud.com/kirinokosaka/rhythm-heaven-grips") .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/fDmHjgmrYQcYjIiMIwAjUelF") .addPreview("mxc://glowers.club/KIqvgGfUnrjGhhapMEWahlHM", "image/jpg", "500x500")), // TODO: Artwork could be better. White bordering RadioItem.new("gangnam") .setMetadata("now thats what i call murder", "Kirino Kōsaka", "https://soundcloud.com/kirinokosaka/ok-pls-stop") .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/qfHznoOiNjEfBjwWzgZJarGL") .addPreview("mxc://glowers.club/msHrqYpLIReBYqWtcGrizMZy", "image/jpg", "500x500")), // TODO: Artwork could be better. White bordering RadioItem.new("wearheadphones") .setMetadata("I made this 2 months too late", "~Equalizee", "https://soundcloud.com/djequalizee/i-made-this-2-months-too-late") .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/WAPutdfyEeQWvgumweMUMkmx") .addPreview("mxc://glowers.club/BqLFkwPPXOmpuGapmwBKQYWx", "image/jpg", "500x500")), // FIXME: Source is reupload, not original RadioItem.new("gnuquest") .setMetadata("GNU/STALLMAN QUEST", undefined, "https://youtu.be/Dn8gealMDsg") .addSource(RadioSource.new("video/webm", [ "vp9", "vorbis" ]) .setURI("mxc://glowers.club/PDbLjvNYeRTEpHMnYiGNFNBu") .addPreview("mxc://glowers.club/BTiOylzdZcWrrxLGuCpQYcMK", "image/jpg", "562x312")) .addSource(RadioSource.new("video/mp4", [ "avc1.4D4029", "mp4a.40.2" ]) .setURI("mxc://glowers.club/yVvqUBGrZPxzIylwGXBsZtlw") .addPreview("mxc://glowers.club/BTiOylzdZcWrrxLGuCpQYcMK", "image/jpg", "562x312")) .addSource(RadioSource.new("audio/ogg", [ "vorbis" ]) .setURI("mxc://glowers.club/hsjIhOxVpcHwlaHbmfSKmmrI") .addPreview("mxc://glowers.club/gGvSqctfUJWHEYxYfbZEwQpn", "image/jpg", "416x416")) .addSource(RadioSource.new("audio/mp3", [ "mp3" ]) .setURI("mxc://glowers.club/fJQxNXitNpwnFpnLRWoVBoFN") .addPreview("mxc://glowers.club/gGvSqctfUJWHEYxYfbZEwQpn", "image/jpg", "416x416")), ].filter(Boolean).map(a => a.serialize()).sort((a,b) => a.id.localeCompare(b.id)) const lintCodecWarnings = { "video/mp4": [ [ "warn", "avc1", "vague, however browsers will accept it. See MDN for format details" ], [ "error", "mp4a", "too vague; Browsers will not accept it! See MDN for format details" ], [ "error", "aac", "invalid! The correct codec is mp4a. See MDN for format details" ] ] } const lintLikelyCodecs = { "video/mp4": 'codecs may be "avc1" with "mp4a.40.2" (AAC-LC)', "audio/mp3": 'codec is probably "mp3"' } for (const item of mediaItems) { const hasAudioSource = item.sources.some(a => a.type.startsWith("audio/")) for (const index in item.sources) { const source = item.sources[index] if (!hasAudioSource && source.type.startsWith("video/") && !source.previews.some(item => item.display_type != EDisplayType.NATIVE)) { const logType = item.tags?.includes("misc") ? "warn" :"error" console.warn(`${logType[0].toUpperCase()}: [previews] [${item.id}:${index}] No audio fallback preview set!`) } if (source.codecs?.length) for (const [ logType, codec, reason ] of (Object.hasOwn(lintCodecWarnings, source.type) ? lintCodecWarnings[source.type] : [])) { if (!source.codecs.includes(codec)) continue const msg = `${logType[0].toUpperCase()}: [codecs] [${item.id}:${index}] The declaration "${codec}" is ${reason}` console[logType](msg) } else console.warn(`W: [codecs] [${item.id}:${index}] No codec declarations are set!${Object.hasOwn(lintLikelyCodecs, source.type)?` The ${lintLikelyCodecs[source.type]}, check with ffprobe.`:''}`) for (const p_index in source.previews) { const preview = item.sources[index].previews[p_index] if (!preview.type) console.warn(`W: [previews] [${item.id}:${index}] No type set for preview ${p_index} source ${index} of ${item.id}`) if (!preview.size) console.warn(`W: [previews] [${item.id}:${index}] No size set for preview ${p_index} source ${index} of ${item.id}`) } } } const radioObj = { "version": 5, "songs": mediaItems } console.info(`I: Version ${radioObj.version} with ${radioObj.songs.length} entries`) //console.info(require("util").inspect(mediaItems[0], { colors: true, depth: Infinity })) fs.writeFileSync("./data/songs.json", JSON.stringify(radioObj)) //fs.writeFileSync("./data/songs.js", `glowersRadioSongsCallback(${JSON.stringify(radioObj)})`) //fs.writeFileSync("./data/songs.html", ``)