From bb780ded9cc7d9602d4aa67c8faab8bbeae3dc11 Mon Sep 17 00:00:00 2001
From: Jon <haddock.05.roast@icloud.com>
Date: Thu, 8 Dec 2022 00:29:36 +0000
Subject: [PATCH] generate.js: add alexjones, refactor, add previews to replace
 thumbs

---
 generate.js | 327 +++++++++++++++++++++++++++++-----------------------
 1 file changed, 180 insertions(+), 147 deletions(-)

diff --git a/generate.js b/generate.js
index 45b333e..07f71d7 100755
--- a/generate.js
+++ b/generate.js
@@ -19,6 +19,8 @@ const objBulkSet = (obj, target, pairs) => {
             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
@@ -58,435 +60,466 @@ const EDisplayType = {
 
 const RadioSource = function (type) {
     this.type = type
-    this.url = null
+    this.uri = null
     this.display_type = type.startsWith("video/") ? EDisplayType.NATIVE : EDisplayType.SQUARE
-    this.thumbnail_url = undefined
+    this.previews = []
     return this
 }
 
 RadioSource.new = type => new RadioSource(type)
 RadioSource.prototype.setDisplayType = function (display_type) { this.display_type = display_type; return this }
-RadioSource.prototype.setURL = function (uri) { this.url = uri; return this }
-RadioSource.prototype.setThumbnailURL = function (uri, type, size) {
-    this.thumbnail_url = uri
-    this.thumbnail_type = type
-    this.thumbnail_size = size ? size.replace(/x/g, "×") : undefined
+RadioSource.prototype.setURI = function (uri) { this.uri = uri; return this }
+RadioSource.prototype.addPreview = function (uri, type, size, displayType=null) {
+    this.previews.push(RadioPreview.new(uri, type, size, notNullElse(displayType, this.display_type)))
     return this
 }
 
 RadioSource.prototype.serialize = function () {
     return objSerialize(this, [
         "type",
-        "url",
+        "uri"
+    ], obj => ({ ...obj, "previews": this.previews.map(preview => preview.serialize()) }))
+}
+
+const RadioPreview = function (uri, type, size, displayType=null) {
+    this.uri = uri
+    this.type = type
+    this.size = size.replace(/x/g, "×")
+    this.display_type = notNullElse(displayType, EDisplayType.SQUARE)
+    return this
+}
+
+RadioPreview.new = (uri, type, size, displayType) => new RadioPreview(uri, type, size, displayType)
+RadioPreview.prototype.serialize = function () {
+    return objSerialize(this, [
         "display_type",
-        "thumbnail_url",
-        "thumbnail_type",
-        "thumbnail_size"
+        "uri",
+        "type",
+        "size"
     ])
 }
 
+
 const mediaItems = [
 
     RadioItem.new("nightinjunitaki")
       .setMetadata("Night In Junitaki", "Wünsche")
       .addSource(RadioSource.new("audio/mp3")
-        .setURL("x-gwm://wiki/night_in_junitaki_-_waves.mp3")
-        .setThumbnailURL("mxc://glowers.club/HCiiIVMOekjPZtiEaexDdUsD", "image/jpg", "400x400")),
+        .setURI("x-gwm://wiki/night_in_junitaki_-_waves.mp3")
+        .addPreview("mxc://glowers.club/HCiiIVMOekjPZtiEaexDdUsD", "image/jpg", "400x400")),
 
     RadioItem.new("goodbyeautumn")
       .setMetadata("Goodbye Autumn", "Tomppabeats")
       .addSource(RadioSource.new("audio/mp3")
-        .setURL("x-gwm://wiki/goodbye_autumn.mp3")
-        .setThumbnailURL("mxc://glowers.club/HCiiIVMOekjPZtiEaexDdUsD", "image/jpg", "400x400")),
+        .setURI("x-gwm://wiki/goodbye_autumn.mp3")
+        .addPreview("mxc://glowers.club/HCiiIVMOekjPZtiEaexDdUsD", "image/jpg", "400x400")),
 
     RadioItem.new("balmy")
       .setMetadata("Balmy", "90sFlav")
       .addSource(RadioSource.new("audio/mp3")
-        .setURL("x-gwm://wiki/balmy90sblav.mp3")
-        .setThumbnailURL("mxc://glowers.club/kDNCBjvQxfPvtJVmfEMmcdov", "image/jpg", "999x999")),
+        .setURI("x-gwm://wiki/balmy90sblav.mp3")
+        .addPreview("mxc://glowers.club/kDNCBjvQxfPvtJVmfEMmcdov", "image/jpg", "999x999")),
 
     RadioItem.new("springletter")
       .setMetadata("Spring Letter", "90sFlav")
       .addSource(RadioSource.new("audio/mp3")
-        .setURL("x-gwm://wiki/spring_letter.mp3")
-        .setThumbnailURL("mxc://glowers.club/wTLwzrymoDeNGdJLEpDoEBtZ", "image/jpg", "500x500")),
+        .setURI("x-gwm://wiki/spring_letter.mp3")
+        .addPreview("mxc://glowers.club/wTLwzrymoDeNGdJLEpDoEBtZ", "image/jpg", "500x500")),
 
     RadioItem.new("weep")
       .setMetadata("Weep", "90sFlav")
       .addSource(RadioSource.new("audio/mp3")
-        .setURL("x-gwm://wiki/weep.mp3")
-        .setThumbnailURL("mxc://glowers.club/jIkXGOSECsPPyJTvgrxPhRoq", "image/jpg", "500x500")),
+        .setURI("x-gwm://wiki/weep.mp3")
+        .addPreview("mxc://glowers.club/jIkXGOSECsPPyJTvgrxPhRoq", "image/jpg", "500x500")),
 
     RadioItem.new("whenimetyou")
       .setMetadata("When I Met You", "90sFlav")
       .addSource(RadioSource.new("audio/mp3")
-        .setURL("x-gwm://wiki/when_i_met_you.mp3")
-        .setThumbnailURL("mxc://glowers.club/ntDKDFtqeQCmIVoRtzRQdvEC", "image/jpg", "500x500")),
+        .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")
       .addSource(RadioSource.new("audio/mp3")
-        .setURL("x-gwm://wiki/seven_of_nine.mp3")
-        .setThumbnailURL("mxc://glowers.club/kDNCBjvQxfPvtJVmfEMmcdov", "image/jpg", "999x999")),
+        .setURI("x-gwm://wiki/seven_of_nine.mp3")
+        .addPreview("mxc://glowers.club/kDNCBjvQxfPvtJVmfEMmcdov", "image/jpg", "999x999")),
 
     RadioItem.new("callme")
       .setMetadata("Call Me", "90sFlav")
       .addSource(RadioSource.new("audio/mp3")
-        .setURL("x-gwm://wiki/call_me.mp3")
-        .setThumbnailURL("mxc://glowers.club/kDNCBjvQxfPvtJVmfEMmcdov", "image/jpg", "999x999")),
+        .setURI("x-gwm://wiki/call_me.mp3")
+        .addPreview("mxc://glowers.club/kDNCBjvQxfPvtJVmfEMmcdov", "image/jpg", "999x999")),
 
     RadioItem.new("midnightsession")
       .setMetadata("Midnight Session", "90sFlav")
       .addSource(RadioSource.new("audio/mp3")
-        .setURL("x-gwm://wiki/полуночная_сессия.mp3")
-        .setThumbnailURL("mxc://glowers.club/pLexnITqTOhJUXBOKtDAiZzv", "image/jpg", "288x288")),
+        .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")
       .addSource(RadioSource.new("audio/mp3")
-        .setURL("x-gwm://wiki/southdakota.mp3")
-        .setThumbnailURL("mxc://glowers.club/FJfFhscJavurBvoEuRbykpmM", "image/jpg", "500x500")),
+        .setURI("x-gwm://wiki/southdakota.mp3")
+        .addPreview("mxc://glowers.club/FJfFhscJavurBvoEuRbykpmM", "image/jpg", "500x500")),
 
     RadioItem.new("dobson")
       .addSource(RadioSource.new("video/mp4")
-        .setURL("mxc://glowers.club/mRtnfcoHYkyAOXSkYvrnbZgX")
-        .setThumbnailURL("mxc://glowers.club/eHKVfIITgdRKERhVOPSTDQAc", "image/jpg", "432x426")),
+        .setURI("mxc://glowers.club/mRtnfcoHYkyAOXSkYvrnbZgX")
+        .addPreview("mxc://glowers.club/eHKVfIITgdRKERhVOPSTDQAc", "image/jpg", "432x426")),
 
     RadioItem.new("poljacked")
       .addSource(RadioSource.new("video/mp4")
-        .setURL("mxc://glowers.club/stlNnyEIUVGluyhpPSGhtjJg")
-        .setThumbnailURL("mxc://glowers.club/BczfFtojBhwMxTNjoZfhemam", "image/jpg", "638x360"))
+        .setURI("mxc://glowers.club/stlNnyEIUVGluyhpPSGhtjJg")
+        .addPreview("mxc://glowers.club/BczfFtojBhwMxTNjoZfhemam", "image/jpg", "638x360"))
       .addSource(RadioSource.new("video/webm")
-        .setURL("mxc://glowers.club/xnYQdrroEheIZBfigHGZferu")
-        .setThumbnailURL("mxc://glowers.club/BczfFtojBhwMxTNjoZfhemam", "image/jpg", "638x360")),
+        .setURI("mxc://glowers.club/xnYQdrroEheIZBfigHGZferu")
+        .addPreview("mxc://glowers.club/BczfFtojBhwMxTNjoZfhemam", "image/jpg", "638x360")),
 
     RadioItem.new("femalecops")
       .setTags([ "misc" ])
       .addSource(RadioSource.new("video/mp4")
-        .setURL("mxc://glowers.club/ZSyUyEGvOLOoUaqFVoCYPTif")
-        .setThumbnailURL("mxc://glowers.club/BVQhXkWSYbvFcSerzVZFgfrn", "image/jpg", "600x600"))
+        .setURI("mxc://glowers.club/ZSyUyEGvOLOoUaqFVoCYPTif")
+        .addPreview("mxc://glowers.club/BVQhXkWSYbvFcSerzVZFgfrn", "image/jpg", "600x600"))
       .addSource(RadioSource.new("video/webm")
-        .setURL("mxc://glowers.club/RYjIfTiZKSKBdYBvjGtyBILa")
-        .setThumbnailURL("mxc://glowers.club/BVQhXkWSYbvFcSerzVZFgfrn", "image/jpg", "600x600")),
+        .setURI("mxc://glowers.club/RYjIfTiZKSKBdYBvjGtyBILa")
+        .addPreview("mxc://glowers.club/BVQhXkWSYbvFcSerzVZFgfrn", "image/jpg", "600x600")),
 
     RadioItem.new("autisticclowns")
       .setTags([ "misc" ])
       .addSource(RadioSource.new("video/mp4")
-        .setURL("mxc://glowers.club/fGszYTUkpyWsKuxphzJSfAZk")
-        .setThumbnailURL("mxc://glowers.club/esDPBgpoTvTtqekHAQJRwqtK", "image/jpg", "480x272"))
+        .setURI("mxc://glowers.club/fGszYTUkpyWsKuxphzJSfAZk")
+        .addPreview("mxc://glowers.club/esDPBgpoTvTtqekHAQJRwqtK", "image/jpg", "480x272"))
       .addSource(RadioSource.new("video/webm")
-        .setURL("mxc://glowers.club/WqYtubpqVplLjSxxmaxNeQir")
-        .setThumbnailURL("mxc://glowers.club/esDPBgpoTvTtqekHAQJRwqtK", "image/jpg", "480x272")),
+        .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")
-        .setURL("mxc://glowers.club/abgQasVrghOSkpRZTIfHMFyF")
-        .setThumbnailURL("mxc://glowers.club/IhivpcDssjnjSDHBdMEGGwVp", "image/jpg", "320x180"))
+        .setURI("mxc://glowers.club/abgQasVrghOSkpRZTIfHMFyF")
+        .addPreview("mxc://glowers.club/IhivpcDssjnjSDHBdMEGGwVp", "image/jpg", "320x180"))
       .addSource(RadioSource.new("video/mp4")
-        .setURL("mxc://glowers.club/ieQlfAlPPGeXLsvevolcQKqO")
-        .setThumbnailURL("mxc://glowers.club/IhivpcDssjnjSDHBdMEGGwVp", "image/jpg", "320x180")),
+        .setURI("mxc://glowers.club/ieQlfAlPPGeXLsvevolcQKqO")
+        .addPreview("mxc://glowers.club/IhivpcDssjnjSDHBdMEGGwVp", "image/jpg", "320x180")),
 
     RadioItem.new("dootnukem")
       .setMetadata("Grabbag", "Lee Jackson")
       .addSource(RadioSource.new("audio/mp3")
-        .setURL("mxc://glowers.club/xsuBJwyAUwuDoASbmqjZWrLO")
-        .setThumbnailURL("mxc://glowers.club/ymWgXucYRzhsgdiecjBkFvmz", "image/jpg", "1600x1800")
+        .setURI("mxc://glowers.club/xsuBJwyAUwuDoASbmqjZWrLO")
+        .addPreview("mxc://glowers.club/ymWgXucYRzhsgdiecjBkFvmz", "image/jpg", "1600x1800")
         .setDisplayType(EDisplayType.STRETCH)),
 
     RadioItem.new("hyperborea")
       .setMetadata("Somebody That I Used to Know", "VelvetCasca")
       .addSource(RadioSource.new("video/mp4")
-        .setURL("mxc://glowers.club/egAyPBuGNFPYyvnMWMxySLiX")
-        .setThumbnailURL("mxc://glowers.club/dOxJvUWRlGqRRxJdpDRZyeko", "image/jpg", "640x360")),
+        .setURI("mxc://glowers.club/egAyPBuGNFPYyvnMWMxySLiX")
+        .addPreview("mxc://glowers.club/dOxJvUWRlGqRRxJdpDRZyeko", "image/jpg", "640x360")),
 
     // TODO: Add metadata
     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")
-        .setURL("mxc://glowers.club/fVKJZgWpIHRmilhZLboFXOIK")
-        .setThumbnailURL("mxc://glowers.club/EuYQZnqLjRGPMocgqGqtKFpJ", "image/jpg", "366x240"))
+        .setURI("mxc://glowers.club/fVKJZgWpIHRmilhZLboFXOIK")
+        .addPreview("mxc://glowers.club/EuYQZnqLjRGPMocgqGqtKFpJ", "image/jpg", "366x240"))
       .addSource(RadioSource.new("video/webm")
-        .setURL("mxc://glowers.club/EVRGpqeefZdsjVawOvSkOdvZ")
-        .setThumbnailURL("mxc://glowers.club/GywrCPMpcpsLFJQAuYoZRuzq", "image/jpg", "366x240")),
+        .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")
-        .setURL("mxc://glowers.club/MOyzIHtapiyrpxaYRoiQqMqf")
-        .setThumbnailURL("mxc://glowers.club/KytvUDmLWCFKQWwHemdDTksd", "image/jpg", "640x360"))
+        .setURI("mxc://glowers.club/MOyzIHtapiyrpxaYRoiQqMqf")
+        .addPreview("mxc://glowers.club/KytvUDmLWCFKQWwHemdDTksd", "image/jpg", "640x360"))
       .addSource(RadioSource.new("video/webm")
-        .setURL("mxc://glowers.club/HAGTNySLRemaDfjZMSmpktDj")
-        .setThumbnailURL("mxc://glowers.club/KytvUDmLWCFKQWwHemdDTksd", "image/jpg", "640x360")),
+        .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")
-        .setURL("mxc://glowers.club/bxMoRJmYFteVNNntNhqrniNJ")
-        .setThumbnailURL("mxc://glowers.club/YgeFvRPLguZOCGtUJFJednNj", "image/jpg", "276x240")),
+        .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")
-        .setURL("mxc://glowers.club/iejQiyaVtnqhuSSCuXqviAIN")
-        .setThumbnailURL("mxc://glowers.club/bZonXMZjhadXyazpKscvRBiP", "image/jpg", "255x255")),
+        .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")
-        .setURL("mxc://glowers.club/wRsCVvtUiLzFnDjwwgkCnXzN")
-        .setThumbnailURL("mxc://glowers.club/ipWDVreHeWKOqefUBuvyFxjj", "image/jpg", "255x255")),
+        .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")
-        .setURL("mxc://glowers.club/zEmMFUyaIBmuqAeogVZAMrmO")
-        .setThumbnailURL("mxc://glowers.club/WBhXYzFgTyMVTTEWKwzDfsgF", "image/jpg", "512x512")),
+        .setURI("mxc://glowers.club/zEmMFUyaIBmuqAeogVZAMrmO")
+        .addPreview("mxc://glowers.club/WBhXYzFgTyMVTTEWKwzDfsgF", "image/jpg", "512x512")),
 
     RadioItem.new("jihad")
       .setMetadata("Heyaw Rijal Al Qassam", "Inshad Ensemble")
       .addSource(RadioSource.new("audio/mp3")
-        .setURL("x-gwm://gnujihad.mp3")
-        .setThumbnailURL("x-gwm://chromiumjihad.gif", "image/gif", "420x236")),
+        .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")
       .addSource(RadioSource.new("video/mp4")
-        .setURL("mxc://glowers.club/HVZUugkUhbJEPDncuTpAnOfh")
-        .setThumbnailURL("mxc://glowers.club/klXuXEwYNmYvsZhNOaXsDGJq", "image/jpg", "640x360"))
+        .setURI("mxc://glowers.club/HVZUugkUhbJEPDncuTpAnOfh")
+        .addPreview("mxc://glowers.club/klXuXEwYNmYvsZhNOaXsDGJq", "image/jpg", "640x360"))
       .addSource(RadioSource.new("video/webm")
-        .setURL("mxc://glowers.club/znoCPlczXEXaEAVaiKHopnAV")
-        .setThumbnailURL("mxc://glowers.club/klXuXEwYNmYvsZhNOaXsDGJq", "image/jpg", "640x360")),
+        .setURI("mxc://glowers.club/znoCPlczXEXaEAVaiKHopnAV")
+        .addPreview("mxc://glowers.club/klXuXEwYNmYvsZhNOaXsDGJq", "image/jpg", "640x360")),
 
     RadioItem.new("floyd")
       .setMetadata("Paralyzer", "Finger Seven")
       .setTags([ "misc" ])
       .addSource(RadioSource.new("video/mp4")
-        .setURL("mxc://glowers.club/qtBuqQBqBrpyusCsWYXlgmtE")
-        .setThumbnailURL("mxc://glowers.club/JjsGuJkEGAbudLaYvbAcxryQ", "image/jpg", "600x600"))
+        .setURI("mxc://glowers.club/qtBuqQBqBrpyusCsWYXlgmtE")
+        .addPreview("mxc://glowers.club/JjsGuJkEGAbudLaYvbAcxryQ", "image/jpg", "600x600"))
       .addSource(RadioSource.new("video/webm")
-        .setURL("mxc://glowers.club/IusHmBCOyJZFGHxsGjRkYqXf")
-        .setThumbnailURL("mxc://glowers.club/JjsGuJkEGAbudLaYvbAcxryQ", "image/jpg", "600x600")),
+        .setURI("mxc://glowers.club/IusHmBCOyJZFGHxsGjRkYqXf")
+        .addPreview("mxc://glowers.club/JjsGuJkEGAbudLaYvbAcxryQ", "image/jpg", "600x600")),
 
     RadioItem.new("amd")
       .setMetadata("Svetovid", "Jan Janko Močnik")
       .setTags([ "misc" ])
       .addSource(RadioSource.new("video/mp4")
-        .setURL("mxc://glowers.club/wgQPrdTCUUTnKgpnwDVlEakc")
-        .setThumbnailURL("mxc://glowers.club/GccquMupQGvDXYNeifUbxfuy", "image/jpg", "800x450"))
+        .setURI("mxc://glowers.club/wgQPrdTCUUTnKgpnwDVlEakc")
+        .addPreview("mxc://glowers.club/GccquMupQGvDXYNeifUbxfuy", "image/jpg", "800x450"))
       .addSource(RadioSource.new("video/webm")
-        .setURL("mxc://glowers.club/RBvSWrEWiFtIuDUCoxZbCDTW")
-        .setThumbnailURL("mxc://glowers.club/GccquMupQGvDXYNeifUbxfuy", "image/jpg", "800x450")),
+        .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")
       .setTags([ "misc" ])
       .addSource(RadioSource.new("audio/mp3")
-        .setURL("mxc://glowers.club/cJMVPnPpkSZFHIRHtzXRrvna")),
+        .setURI("mxc://glowers.club/cJMVPnPpkSZFHIRHtzXRrvna")),
 
     RadioItem.new("honorary")
       .setMetadata("Erika", "Major Han Friess")
       .addSource(RadioSource.new("video/mp4")
-        .setURL("mxc://glowers.club/cQgzwWXtxDSqqOlwGZYShVXS")
-        .setThumbnailURL("mxc://glowers.club/aENkwWEKXIztqyBTJrBHCmRQ", "image/jpg", "800x450"))
+        .setURI("mxc://glowers.club/cQgzwWXtxDSqqOlwGZYShVXS")
+        .addPreview("mxc://glowers.club/aENkwWEKXIztqyBTJrBHCmRQ", "image/jpg", "800x450"))
       .addSource(RadioSource.new("video/webm")
-        .setURL("mxc://glowers.club/qMkbHHunSgPzkFpcoOuYeIuE")
-        .setThumbnailURL("mxc://glowers.club/aENkwWEKXIztqyBTJrBHCmRQ", "image/jpg", "800x450")),
+        .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")
-        .setURL("mxc://glowers.club/egmaXMIHsNmblfDjyTGHdyas")
-        .setThumbnailURL("mxc://glowers.club/wpwHKoSFsxkNttaNyaNFzhMk", "image/jpg", "794x582")),
+        .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")
-        .setURL("mxc://glowers.club/kYKpgAelvgRjDOVHJYKIYwdS")
-        .setThumbnailURL("mxc://glowers.club/IbShqtSWZksFbnOdFiVDFwqD", "image/jpg", "609x600"))
+        .setURI("mxc://glowers.club/kYKpgAelvgRjDOVHJYKIYwdS")
+        .addPreview("mxc://glowers.club/IbShqtSWZksFbnOdFiVDFwqD", "image/jpg", "609x600"))
       .addSource(RadioSource.new("audio/ogg")
-        .setURL("mxc://glowers.club/wdflEjUfqAkoyOyCDBXebDkw")
-        .setThumbnailURL("mxc://glowers.club/IbShqtSWZksFbnOdFiVDFwqD", "image/jpg", "609x600")),
+        .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")
-        .setURL("mxc://glowers.club/TWmjcXRxqaVOfYnWPItiPAcd")
-        .setThumbnailURL("mxc://glowers.club/OKTbfAlagYXulaeBmgwkNwii", "image/jpg", "352x288")
+        .setURI("mxc://glowers.club/TWmjcXRxqaVOfYnWPItiPAcd")
+        .addPreview("mxc://glowers.club/OKTbfAlagYXulaeBmgwkNwii", "image/jpg", "352x288")
         .setDisplayType(EDisplayType.STRETCH))
       .addSource(RadioSource.new("audio/ogg")
-        .setURL("mxc://glowers.club/uaxDKxCUtRVXMWAJgoKeiNcJ")
-        .setThumbnailURL("mxc://glowers.club/OKTbfAlagYXulaeBmgwkNwii", "image/jpg", "352x288")
+        .setURI("mxc://glowers.club/uaxDKxCUtRVXMWAJgoKeiNcJ")
+        .addPreview("mxc://glowers.club/OKTbfAlagYXulaeBmgwkNwii", "image/jpg", "352x288")
         .setDisplayType(EDisplayType.STRETCH)),
 
     RadioItem.new("negromancy")
       .setMetadata(undefined, undefined, "https://youtu.be/PxjA-jq1e7E")
       .setTags([ "misc" ])
       .addSource(RadioSource.new("video/mp4")
-        .setURL("mxc://glowers.club/kYDmqwhymAidlTbdFHHliXrk")
-        .setThumbnailURL("mxc://glowers.club/qAtvGoVERlYfFnNWeizoYiGP", "image/jpg", "640x360"))
+        .setURI("mxc://glowers.club/kYDmqwhymAidlTbdFHHliXrk")
+        .addPreview("mxc://glowers.club/qAtvGoVERlYfFnNWeizoYiGP", "image/jpg", "640x360"))
       .addSource(RadioSource.new("video/webm")
-        .setURL("mxc://glowers.club/hRDjowdyaPRkdrRkHtCeqGug")
-        .setThumbnailURL("mxc://glowers.club/qAtvGoVERlYfFnNWeizoYiGP", "image/jpg", "640x360")),
+        .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")
-        .setURL("mxc://glowers.club/CIwbaGcPmsbqvZtdILxJxdHN")
-        .setThumbnailURL("mxc://glowers.club/ITHVCToEENFZhXGKaYuHplFV", "image/jpg", "500x500")),
+        .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")
-        .setURL("mxc://glowers.club/NnrVJeWXXzqEUDhDQazMDYrr")
-        .setThumbnailURL("mxc://glowers.club/jKmUwOLJMGPAhdJGusuWCJgQ", "image/jpg", "652x619")),
+        .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")
-        .setURL("mxc://glowers.club/ERjkVBvKLvTIBEhOsEkWHENM")
-        .setThumbnailURL("mxc://glowers.club/xgoxdfvMRtmobnPMTrdqsQic", "image/jpg", "500x500")),
+        .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")
       .addSource(RadioSource.new("audio/mp3")
-        .setURL("mxc://glowers.club/XZGliHHOkhcxCSUxKoIkgUlI")
-        .setThumbnailURL("mxc://glowers.club/nAaKRXuNBjltAYJbsLnjGusH", "image/jpg", "899x715")),
+        .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")
       .setTags([ "sus" ])
       .addSource(RadioSource.new("audio/mp3")
-        .setURL("x-gwm://include/imposterd.mp3")
-        .setThumbnailURL("x-gwm://include/crewmate.gif", "image/gif", "128x108")),
+        .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")
       .setTags([ "sus" ])
       .addSource(RadioSource.new("audio/mp3")
-        .setURL("mxc://glowers.club/DyboACFryZTCDeIgHtcRaBpL")
-        .setThumbnailURL("mxc://glowers.club/VFehbVZaCVcNhQTYWuWRYTiM", "image/jpg", "500x500")),
+        .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")
       .setTags([ "sus" ])
       .addSource(RadioSource.new("audio/mp3")
-        .setURL("mxc://glowers.club/oswdiINtTUUbQYEMEKpVmsHN")
-        .setThumbnailURL("mxc://glowers.club/jYlptPwURJXVMBNivxlBFPuP", "image/jpg", "1440x1440")),
+        .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")
       .setTags([ "sus" ])
       .addSource(RadioSource.new("audio/mp3")
-        .setURL("mxc://glowers.club/xQHxUgpRUMtIkiBaszXiGAvh")
-        .setThumbnailURL("mxc://glowers.club/erMHzidVOoqoWFXIxXAcozqW", "image/jpg", "512x512")),
+        .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")
       .setTags([ "sus" ])
       .addSource(RadioSource.new("audio/mp3")
-        .setURL("mxc://glowers.club/txMHzslGxRyDmNVsUCObJRzc")
-        .setThumbnailURL("mxc://glowers.club/PfEBpatFHatQubohkgQThOor", "image/jpg", "632x632")),
+        .setURI("mxc://glowers.club/txMHzslGxRyDmNVsUCObJRzc")
+        .addPreview("mxc://glowers.club/PfEBpatFHatQubohkgQThOor", "image/jpg", "632x632")),
 
     RadioItem.new("GETOUTOFMYHEAD")
       .setMetadata("GETOUTOFMYHEAD", "placeboing", "https://youtu.be/Xnv38FnLkbM")
       .setTags([ "sus" ])
       .addSource(RadioSource.new("video/mp4")
-        .setURL("mxc://glowers.club/sEtheeOyZlztUtQuHOzOJpOk")
-        .setThumbnailURL("mxc://glowers.club/bJveZSEIXFsnEKdjDvwmmENo", "image/jpg", "800x450")),
+        .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")
       .setTags([ "gay" ])
       .addSource(RadioSource.new("audio/mp3")
-        .setURL("mxc://glowers.club/FAaatrvlEjJFljvNHhDhcNGl")
-        .setThumbnailURL("mxc://glowers.club/KrefLQCybeCNwLIFZwzWVolF", "image/png", "489x512")),
+        .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")
-        .setURL("mxc://glowers.club/YUqRzRddNWuXQaAlPPMpwvse")
-        .setThumbnailURL("mxc://glowers.club/mFyOeCDaBRhxZCXeeMxDmZhD", "image/jpg", "588x634")),
+        .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")
-        .setURL("mxc://glowers.club/gnZElBwskTnBXkeZPiINVtSB")
-        .setThumbnailURL("mxc://glowers.club/iPoGcvVbhmElZgaZuEdNQDBJ", "image/jpg", "480x356")),
+        .setURI("mxc://glowers.club/gnZElBwskTnBXkeZPiINVtSB")
+        .addPreview("mxc://glowers.club/iPoGcvVbhmElZgaZuEdNQDBJ", "image/jpg", "480x356")),
 
     RadioItem.new("bldm")
       .setMetadata("Black Lives (Don't) Matter", "Moonman")
       .setTags([ "moonman" ])
       .addSource(RadioSource.new("audio/mp3")
-        .setURL("mxc://glowers.club/OXoYKzSBuKWHXcHDzZIaMfja")
-        .setThumbnailURL("mxc://glowers.club/SYLXjGHjuXzBnReqrfoRnuhg", "image/jpg", "1024x966")),
+        .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/")
       .setTags([ "misc" ])
       .addSource(RadioSource.new("audio/mp3")
-        .setURL("mxc://glowers.club/SzqNmhQOxaReaTmOegUItcHY")
-        .setThumbnailURL("mxc://glowers.club/aHWNIqMTUjXZRGZUqZCuOgbi", "image/jpg", "898x480")
+        .setURI("mxc://glowers.club/SzqNmhQOxaReaTmOegUItcHY")
+        .addPreview("mxc://glowers.club/aHWNIqMTUjXZRGZUqZCuOgbi", "image/jpg", "898x480")
         .setDisplayType(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")
       .setTags([ "sus" ])
       .addSource(RadioSource.new("audio/mp3")
-        .setURL("mxc://glowers.club/VDXDeYltzQOhTChQtmsZaybu")
-        .setThumbnailURL("mxc://glowers.club/JAWtHKTIefGJzYadLOUofaWl", "image/jpg", "1080x1080")),
+        .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")
-        .setURL("mxc://glowers.club/HvYByMgvFKONqIPmujCGaIIp")
-        .setThumbnailURL("mxc://glowers.club/dXELpQnsrrcwHuElSQHEPaRn", "image/jpg", "512x512")),
+        .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" ])
       .addSource(RadioSource.new("video/mp4")
-        .setURL("mxc://glowers.club/qYCbeFblMeBUMDZEiuBWuFnX")
-        .setThumbnailURL("mxc://glowers.club/dDbuzhpAoewNQoKHCejeQqdk", "image/jpg", "800x450")),
+        .setURI("mxc://glowers.club/qYCbeFblMeBUMDZEiuBWuFnX")
+        .addPreview("mxc://glowers.club/dDbuzhpAoewNQoKHCejeQqdk", "image/jpg", "800x450")),
 
     RadioItem.new("feedandseed")
       .addTags([ "misc" ])
       .addSource(RadioSource.new("video/mp4")
-        .setURL("mxc://glowers.club/vsMepElCpNKFgLltczQRjxfJ")
-        .setThumbnailURL("mxc://glowers.club/zUXbbLOCCxZoZDRIwVCzHFYC", "image/jpg", "654x480")),
+        .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")
-        .setURL("mxc://glowers.club/oKXrDvGUNQJWzBsmwYwjsCZs")
-        .setThumbnailURL("mxc://glowers.club/dBJtIlaEcsZoflXYqPnihooO", "image/jpg", "374x374"))
+        .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")
+      .addSource(RadioSource.new("video/mp4")
+        .setURI("mxc://glowers.club/vADMHcSVAzikHdjSRXKsmllx")
+        .addPreview("mxc://glowers.club/igLcLQjIYWSzTCRAPDMxSAmh", "image/jpg", "853x480")
+        .addPreview("mxc://glowers.club/dcqgSxtEyYBQNpYLfpXkxADL", "image/jpg", "500x500", EDisplayType.SQUARE))
 
 ].filter(Boolean).map(a => a.serialize()).sort((a,b) => a.id.localeCompare(b.id))
 
 for (const item of mediaItems) {
     for (const index in item.sources) {
-        if (!item.sources[index].thumbnail_type)
-            console.warn(`W: No thumbnail type set for source ${index} of ${item.id}`)
-        if (!item.sources[index].thumbnail_size)
-            console.warn(`W: No thumbnail size set for source ${index} of ${item.id}`)
+        const source = item.sources[index]
+
+        if (source.type.startsWith("video/") && !source.previews.some(item => item.display_type != EDisplayType.NATIVE))
+            console.warn(`${item.tags?.includes("misc") ? "BAD" : "ERR"}: No audio fallback preview set for source ${index} of ${item.id}`)
+
+        for (const p_index in source.previews) {
+            const preview = item.sources[index].previews[p_index]
+            if (!preview.type)
+                console.warn(`W: No type set for preview ${p_index} source ${index} of ${item.id}`)
+            if (!preview.size)
+                console.warn(`W: No size set for preview ${p_index} source ${index} of ${item.id}`)
+        }
     }
 }
 
 const radioObj = {
-    "version": 4,
+    "version": 5,
     "songs": mediaItems
 }
 
+//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", `<html><script>glowersRadioSongsCallback(${JSON.stringify(radioObj)})</script></html>`)