diff --git a/configs/mpd.nix b/configs/mpd.nix index 211efd7..8037756 100644 --- a/configs/mpd.nix +++ b/configs/mpd.nix @@ -1,38 +1,74 @@ { config, pkgs, lib, ... }: let - playlists = import ; - playlistFiles = lib.mapAttrs (name: {tracks, ...}: pkgs.writeText "${name}.m3u" (builtins.concatStringsSep "\n" (map ({url, ...}: url) tracks))) playlists; - linkPlaylist = name: file: '' - ln -sfn "${toString file}" "/var/lib/mpd/playlists/${name}.m3u" - ''; - linkPlaylists = lib.concatStringsSep "\n" (lib.mapAttrsToList linkPlaylist playlistFiles); + streams = import { inherit lib; }; in { - system.activationScripts.mpd-playlists = '' - rm -rf /var/lib/mpd/playlists - install -d /var/lib/mpd/playlists - ${linkPlaylists} - ''; + imports = [ ]; environment.systemPackages = [ pkgs.ncmpcpp pkgs.mpc_cli ]; - services.mpd.enable = true; - services.ympd.enable = true; + services.mpd-fm = { + enable = true; + stationsFile = "/etc/mpd-fm/stations.json"; + webPort = 8080; + }; - services.nginx.virtualHosts.default = { - locations."^~ /ympd/" = { - proxyPass = "http://127.0.0.1:${config.services.ympd.webPort}/"; + systemd.services.antenne-asb = + let + stations = lib.lists.imap0 (id: {desc ? "", logo ? "https://picsum.photos/seed/${builtins.hashString "md5" stream}/300", stream, station}: { inherit id desc logo stream station; }) streams; + stationsJson = pkgs.writeText "stations.json" (builtins.toJSON stations); + in { + wantedBy = [ "mpd-fm.service" ]; + startAt = "hourly"; + script = '' + mkdir -p /etc/mpd-fm + antenne_asb_url=$( + ${pkgs.curl}/bin/curl -sS 'https://www.caster.fm/widgets/em_player.php?jsinit=true&uid=529295&t=blue&c=' \ + | grep streamUrl \ + | sed ${lib.escapeShellArg "s/^.*'\\([^']*\\)'.*/\\1/"} + ) + ${pkgs.jq}/bin/jq "map(if .station == \"Antenne ASB\" then .stream |= \"$antenne_asb_url\" else . end)" < ${stationsJson} > /etc/mpd-fm/stations.json + ''; + }; + + services.mpd.enable = true; + + services.nginx = { + upstreams."mpd-fm-socket" = { extraConfig = '' - auth_basic "Restricted Content"; - auth_basic_user_file ${pkgs.writeText "ympd-password" "dj:$apr1$1ogLNSki$37uGV8iqjWEYEwtY4iq3F1"}; - ''; # generate password hash with `openssl passwd -apr1` + server 127.0.0.1:${toString config.services.mpd-fm.webPort}; + ''; + }; + appendHttpConfig = '' + map $http_upgrade $connection_upgrade { + default upgrade; + ''' close; + } + ''; + virtualHosts.default = { + basicAuth.dj = lib.strings.fileContents ; + locations."/" = { + proxyPass = "http://mpd-fm-socket"; + extraConfig = '' + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; + proxy_set_header Host $host; + ''; # generate password hash with `openssl passwd -apr1` + }; }; }; + /* # dont let anyone outside localhost or local network in - networking.firewall.extraCommands = let ympdPort = config.services.ympd.webPort; in '' - ${pkgs.iptables}/bin/iptables -A INPUT -p tcp --dport ${ympdPort} -s 192.168.0.0/16 -j ACCEPT - ${pkgs.iptables}/bin/iptables -A INPUT -p tcp --dport ${ympdPort} -s 127.0.0.0/8 -j ACCEPT - ${pkgs.iptables}/bin/iptables -A INPUT -p tcp --dport ${ympdPort} -j DROP + networking.firewall.extraCommands = + let + mpd-fm-port = toString config.services.mpd-fm.webPort; + in '' + ${pkgs.iptables}/bin/iptables -A INPUT -p tcp --dport ${mpd-fm-port} -s 192.168.0.0/16 -j ACCEPT + ${pkgs.iptables}/bin/iptables -A INPUT -p tcp --dport ${mpd-fm-port} -s 10.243.2.4 -j ACCEPT + ${pkgs.iptables}/bin/iptables -A INPUT -p tcp --dport ${mpd-fm-port} -s 127.0.0.0/8 -j ACCEPT + ${pkgs.iptables}/bin/iptables -A INPUT -p tcp --dport ${mpd-fm-port} -j DROP ''; + */ } diff --git a/configs/tuner.nix b/configs/tuner.nix index cbd4067..df19642 100644 --- a/configs/tuner.nix +++ b/configs/tuner.nix @@ -1,7 +1,7 @@ { pkgs, config, lib, ... }: let tunerHTML = pkgs.callPackage { - playlists = import ; + playlists = import { inherit lib; }; }; in { diff --git a/lib/playlists.nix b/lib/playlists.nix index 5d2455b..b8e21ed 100644 --- a/lib/playlists.nix +++ b/lib/playlists.nix @@ -1,5 +1,6 @@ +{ lib }: let - di-fm-key = builtins.readFile ; + di-fm-key = lib.strings.fileContents ; soma-fm = name: { url = "http://ice1.somafm.com/${name}-128-aac"; @@ -57,13 +58,15 @@ in provider = "lassulus"; } { - url = "https://streamer.radio.co/s2c3cc784b/listen"; - name = "Radio"; - provider = "electroswing-radio.com"; + url = "http://1.ice1.firststreaming.com/kkjz_fm.aac"; + name = "KJazz 88.1"; + provider = "California State University"; + } + { + url = "http://162.244.80.20:6948"; + name = "Cool Jazz Florida"; + provider = "cooljazzflorida.com"; } - (rautemusik "study") - (big-fm "reggaevibes") - (big-fm "sunsetlounge") (di-fm "ambient") (di-fm "chilledm") (di-fm "chillhop") @@ -100,6 +103,8 @@ in (soma-fm "sf1033") # Ambient music mixed with the sounds of San Francisco public safety radio traffic. (caster-fm "TODO" "noasrv" 10182) # https://github.com/cccruzr/albumsyoumusthear/blob/7e00baf575e4d357cd275d54d1aeb717321141a8/HLS/IBERO_90_1.m3u (caster-fm "TODO" "shaincast" 20866) # https://github.com/cccruzr/albumsyoumusthear/blob/7e00baf575e4d357cd275d54d1aeb717321141a8/HLS/IBERO_90_1.m3u + (big-fm "reggaevibes") + (big-fm "sunsetlounge") ]; }; @@ -276,6 +281,11 @@ in name = "Hindustani"; url = "http://94.23.148.11:8058/"; } + { + url = "http://188.247.86.67:8008"; + name = "Jordanian"; + provider = "Rotana Tarab"; + } (caster-fm "Sitha FM" "shaincast" 48148) (radiosai "Asia" 8002) (radiosai "Ameri" 8006) @@ -304,6 +314,11 @@ in name = "Klassikradio"; provider = "Klassik Radio GmbH & Co. KG"; } + { + url = "http://www.beatlesradio.com:8000/stream"; + name = "Beatles"; + provider = "beatlesradio.com"; + } (caster-fm "Antenne-ASB.ga" "shaincast" 17656) # "http://stream.klassikradio.de/live/mp3-192/stream.klassikradio.de" # (soma-fm "scanner") # San Francisco Public Safety Scanner Feed @@ -359,6 +374,11 @@ in tracks = [ (rte "radio1") (rte "radio1extra") + { + url = "http://server25531.streamplus.de/;stream.mp3"; + provider = "DWG Radio"; + name = "Bibelradio"; + } ]; }; } diff --git a/lib/streams.nix b/lib/streams.nix new file mode 100644 index 0000000..ce9ce86 --- /dev/null +++ b/lib/streams.nix @@ -0,0 +1,1312 @@ +{ lib }: +# DI generated via: cat /tmp/di-fm.html| pup '.channel-tile-component json{}' | jq 'map({logo: .children[0].children[1].children[1].src | sub("^"; "http:"), station: .children[3].children[0].children[0].text, desc: .children[3].children[1].text | gsub("\\s+"; " ")})' > /tmp/di-fm.json +# soma.fm generated via: curl https://somafm.com/ | pup '.cbshort json{}' | jq 'map({logo:.children[0].children[0].src|sub("^"; "http://soma.fm"), desc: .children[2].text, station: .children[1].text})' +let + di-fm-key = lib.strings.fileContents ; + di-fm-name = name: "${name} | DI.FM"; + di-fm = name: "http://prem2.di.fm/${name}_hi?${di-fm-key}"; + + soma-fm-name = name: "${name} | soma.fm"; + soma-fm = name: "http://ice1.somafm.com/${name}-128-aac"; + + we-are-one-name = name: "${name} | We aRe oNe"; + we-are-one = name: "http://listen.${name}.fm/tunein-aac-hd-pls"; + + big-fm-name = name: "${name} | bigFM"; + big-fm = name: "https://streams.bigfm.de/bigfm-${name}-128-aac"; + + rautemusik-name = name: "${name} | rm.fm"; + rautemusik = name: "http://${name}-high.rautemusik.fm/"; + + rte-name = name: "RTÉ ${name}"; + rte = name: "https://www.rte.ie/manifests/${name}.m3u8"; + + radiosai-name = name: "${name} | Radiosai"; + radiosai = name: "https://stream.sssmediacentre.org/${name}"; + + caster-fm = subdomain: port: "http://${subdomain}.caster.fm:${toString port}/listen.mp3?authn0b0236758bd0e178156d0787327a055d"; +in [ + { + stream = "https://radio.lassul.us/radio.ogg"; + station = "Radio lassulus"; + logo = "http://lassul.us/art/portraits/selbstportrait.jpg"; + desc = "Diminutive from lassus (“weary, faint, tired”). A programming human. Doing superior professional art."; + } + { + stream = "ANTENNE_ASB_URL"; + station = "Antenne ASB"; + logo = "https://antenne-asb.ga/logo.png"; + desc = "Nonstop Drachenlord Radio – Hier wird nicht nur, aber auch Meddl gespielt."; + } + { + stream = "http://1.ice1.firststreaming.com/kkjz_fm.aac"; + station = "KJazz 88.1"; + logo = "https://cdn-radiotime-logos.tunein.com/s37062q.png"; + desc = "KKJZ 88.1 FM offers the full spectrum of jazz music, from bop to cool, Latin to straight-ahead, swing to big band, and most everything in between."; + } + { + stream = "http://162.244.80.20:6948"; + station = "Cool Jazz Florida"; + logo = "https://d3kle7qwymxpcy.cloudfront.net/images/broadcasts/d1/30/24209/c300.png"; + desc = "Sit Back and Relax and Enjoy the Sophisticated Cool Jazz on Cool Jazz Florida!"; + } + { + desc = "Your favorite dance tunes from the start of the decade. Familiar hits and overlooked classics in abundance."; + logo = "http://cdn-images.audioaddict.com/1/4/0/3/5/b/14035b0944a3c2e77852b6d0944f381e.jpg?size=180x180"; + station = di-fm-name "00s Club Hits"; + stream = di-fm "00sclubhits"; + } + { + desc = "Electronic sounds and atmospheric textures create a genre to enhance your state of mind and take you deeper."; + logo = "http://cdn-images.audioaddict.com/a/9/4/6/2/f/a9462ff46233f40fe0aa306379ae7cd8.jpg?size=180x180"; + station = di-fm-name "Ambient"; + stream = di-fm "ambient"; + } + { + desc = "Spaced out, melodic and full of warmth – these broken beat dance tunes will keep you dazed and amused."; + logo = "http://cdn-images.audioaddict.com/3/9/7/3/4/3/397343ffcf5543b60bba72f393e1c3c0.jpg?size=180x180"; + station = di-fm-name "Atmospheric Breaks"; + stream = di-fm "atmosphericbreaks"; + } + { + desc = "From the funkiest grooves to the dirtiest beats. Hard-hitting, high energy 4/4 club cuts to move the masses."; + logo = "http://cdn-images.audioaddict.com/4/f/e/d/8/9/4fed8974f4cfbbd0712baa8ae2cc2ed2.jpg?size=180x180"; + station = di-fm-name "Bass & Jackin' House"; + stream = di-fm "bassnjackinhouse"; + } + { + desc = "Blending together elements of house music, speed garage, and techno – it's all about the low end frequencies."; + logo = "http://cdn-images.audioaddict.com/9/1/9/9/6/d/91996d1fed5b9607c625069bcb8d3b52.jpg?size=180x180"; + station = di-fm-name "Bassline"; + stream = di-fm "bassline"; + } + { + desc = "Heavily focused on breakbeats and dusty samples. A defining 90s musical movement still going strong today."; + logo = "http://cdn-images.audioaddict.com/6/f/4/3/2/4/6f4324c4a776101fd91008d739ac3020.jpg?size=180x180"; + station = di-fm-name "Big Beat"; + stream = di-fm "bigbeat"; + } + { + desc = "Fusing together house elements from the past and the present – prime time music full of uplifting high energy."; + logo = "http://cdn-images.audioaddict.com/0/4/1/2/5/7/0412578b5e31cf1b68f23c3cb5377139.jpg?size=180x180"; + station = di-fm-name "Big Room House"; + stream = di-fm "bigroomhouse"; + } + { + desc = "Inspired by hip hop and UK rave music, breaks features broken up drum loops and creative samples, synths and fx."; + logo = "http://cdn-images.audioaddict.com/2/1/b/1/2/9/21b12909a0618017285f62a5af4b2ce5.jpg?size=180x180"; + station = di-fm-name "Breaks"; + stream = di-fm "breaks"; + } + { + desc = "The sounds of Chill & Tropical House are expertly made for lounging and dancing alike with its deeper house vibes."; + logo = "http://cdn-images.audioaddict.com/2/9/0/1/e/f/2901ef5c923bb0f9ff856ac4007975f0.jpg?size=180x180"; + station = di-fm-name "Chill & Tropical House"; + stream = di-fm "chillntropicalhouse"; + } + { + desc = "Good EDM doesn't have to blow out your speakers and our curated selection of Chill EDM is a testament to the strength of mellow, chilled out electronic music."; + logo = "http://cdn-images.audioaddict.com/f/0/7/5/2/e/f0752e6df86dc7a0f3ffd7a63497df4e.jpg?size=180x180"; + station = di-fm-name "Chill EDM"; + stream = di-fm "chilledm"; + } + { + desc = "Mellow chill beats, lofi hip-hop, trip hop, downtempo beats and jazz, blended together in a laid back style for perfect listening."; + logo = "http://cdn-images.audioaddict.com/f/2/3/8/8/b/f2388be364717a3aa33f62411d9e3585.jpg?size=180x180"; + station = di-fm-name "ChillHop"; + stream = di-fm "chillhop"; + } + { + desc = "Electronic sounds, mellow mid-tempo rhythms, and a groove meant to calm the senses and ease the mind."; + logo = "http://cdn-images.audioaddict.com/f/d/9/6/c/a/fd96ca5c52508a2755a266ebf506f162.jpg?size=180x180"; + station = di-fm-name "Chillout"; + stream = di-fm "chillout"; + } + { + desc = "The perfect musical soundtrack for when you want to close your eyes, get truly comfortable, and drift away."; + logo = "http://cdn-images.audioaddict.com/1/d/4/f/3/3/1d4f3310f94769b4e2f55ee0887eead3.jpg?size=180x180"; + station = di-fm-name "Chillout Dreams"; + stream = di-fm "chilloutdreams"; + } + { + desc = "The brilliant combination of dubstep rhythms with the mellow grooves of chillout. A unique sound all its own."; + logo = "http://cdn-images.audioaddict.com/c/e/9/b/d/1/ce9bd1666b49921b440ec796653b24f0.jpg?size=180x180"; + station = di-fm-name "Chillstep"; + stream = di-fm "chillstep"; + } + { + desc = "European pop music born in the 90s full of high energy sounds and big hooks – now heard in gyms and malls worldwide."; + logo = "http://cdn-images.audioaddict.com/a/9/8/1/5/3/a98153e6c9fcee321fd6dff0c8a6d0ba.jpg?size=180x180"; + station = di-fm-name "Classic EuroDance"; + stream = di-fm "classiceurodance"; + } + { + desc = "Conceived in the European discos in the 70s, evolving through the decades into modern electronic masterpieces."; + logo = "http://cdn-images.audioaddict.com/0/1/0/a/6/6/010a6648f8afc52654b07c07c68e9cad.jpg?size=180x180"; + station = di-fm-name "Classic EuroDisco"; + stream = di-fm "classiceurodisco"; + } + { + desc = "The classic melodies, the epic breakdowns and gigantic builds. Re-experience Trance music in her prime."; + logo = "http://cdn-images.audioaddict.com/4/6/8/0/a/3/4680a3fd0e35f0b2f9bf60c9889d4343.jpg?size=180x180"; + station = di-fm-name "Classic Trance"; + stream = di-fm "classictrance"; + } + { + desc = "Classic sounds of Vocal Trance"; + logo = "http://cdn-images.audioaddict.com/1/e/1/8/1/a/1e181a502369be86e3f2e696723c26fe.jpg?size=180x180"; + station = di-fm-name "Classic Vocal Trance"; + stream = di-fm "classicvocaltrance"; + } + { + desc = "The bassbin rattling, speaker-freaking hits of Dubstep – all tried, tested and approved to work in the clubs."; + logo = "http://cdn-images.audioaddict.com/3/6/b/5/e/7/36b5e73f328251b20120a6bc5365777f.jpg?size=180x180"; + station = di-fm-name "Club Dubstep"; + stream = di-fm "clubdubstep"; + } + { + desc = "The music heard in the biggest venues worldwide. From prime time pushers to deeper house shakers – the sounds of now."; + logo = "http://cdn-images.audioaddict.com/2/e/e/f/9/8/2eef98b26e5490acc78ff6ab22e04827.jpg?size=180x180"; + station = di-fm-name "Club Sounds"; + stream = di-fm "club"; + } + { + desc = "From techno, deep house, progressive and trance – check out the sounds of the DJ deep in the mix."; + logo = "http://cdn-images.audioaddict.com/1/3/a/a/0/8/13aa08b5dce2525029c6ddfb8e286dc2.jpg?size=180x180"; + station = di-fm-name "DJ Mixes"; + stream = di-fm "djmixes"; + } + { + desc = "Evil, gritty and twisted DnB / Drum & Bass. at 160+ BPM, hear the darkest basslines and the hardest hitting percussion."; + logo = "http://cdn-images.audioaddict.com/6/e/4/7/c/1/6e47c1d85f09957d568c9535dda75e58.jpg?size=180x180"; + station = di-fm-name "Dark DnB"; + stream = di-fm "darkdnb"; + } + { + desc = "The darker form of PsyTrance, which is a sound all its own – direct from Goa to your headphones."; + logo = "http://cdn-images.audioaddict.com/0/e/1/0/b/9/0e10b950ca2f3e828becbe3dd3c2d0b3.jpg?size=180x180"; + station = di-fm-name "Dark PsyTrance"; + stream = di-fm "darkpsytrance"; + } + { + desc = "House music crafted for the smaller and mid-sized rooms – deeper tracks full of silky, smooth grooves."; + logo = "http://cdn-images.audioaddict.com/9/a/1/b/4/6/9a1b469ae251c084465096038312d506.jpg?size=180x180"; + station = di-fm-name "Deep House"; + stream = di-fm "deephouse"; + } + { + desc = "Elements of house, funk, and disco. Mid-tempo beats, soulful grooves and head nodding selections."; + logo = "http://cdn-images.audioaddict.com/b/2/a/7/1/5/b2a715bb711ab06822bcaf07fde74d51.jpg?size=180x180"; + station = di-fm-name "Deep Nu-Disco"; + stream = di-fm "deepnudisco"; + } + { + desc = "This smooth, groove-heavy selection of deep progressive house tracks is the perfect soundtrack for smaller and mid-sized rooms."; + logo = "http://cdn-images.audioaddict.com/b/0/e/1/9/0/b0e19018c34150a07d76224e5fcdbeda.jpg?size=180x180"; + station = di-fm-name "Deep Progressive House"; + stream = di-fm "deepprogressivehouse"; + } + { + desc = "A fusion of deep house & techno. Punchy grooves, spaced out sounds and forward thinking productions."; + logo = "http://cdn-images.audioaddict.com/d/3/2/1/7/5/d32175a432f823ce84261c01d4b53f57.jpg?size=180x180"; + station = di-fm-name "Deep Tech"; + stream = di-fm "deeptech"; + } + { + desc = "Where would dance music be without Detroit? The city that started it all continues to inspire and educate."; + logo = "http://cdn-images.audioaddict.com/d/7/b/3/1/d/d7b31d5973593af0043fed3f180df702.jpg?size=180x180"; + station = di-fm-name "Detroit House & Techno"; + stream = di-fm "detroithousentechno"; + } + { + desc = "The feel good sound inspired from 70s disco combined with the warm kick drum of modern house music."; + logo = "http://cdn-images.audioaddict.com/2/7/9/7/0/5/279705ae85a4e0f529f6f7fbaa47a646.jpg?size=180x180"; + station = di-fm-name "Disco House"; + stream = di-fm "discohouse"; + } + { + desc = "Head nodding beats, chilled vocals, and lush soundscapes to bring down the sun and start the night."; + logo = "http://cdn-images.audioaddict.com/f/8/3/3/6/f/f8336fff9bcb4b01a36f2684ecd150c6.jpg?size=180x180"; + station = di-fm-name "Downtempo Lounge"; + stream = di-fm "downtempolounge"; + } + { + desc = "Born in the mid 90s, Drum and Bass / DnB is all about fast breakbeats, urban vibes, and rib rattling basslines."; + logo = "http://cdn-images.audioaddict.com/1/9/8/1/3/f/19813f3ba29ad66caa06bbee4aba558a.jpg?size=180x180"; + station = di-fm-name "Drum and Bass"; + stream = di-fm "drumandbass"; + } + { + desc = "A hybrid of half-time Dubstep and intense Drum and Bass / DnB."; + logo = "http://cdn-images.audioaddict.com/1/c/6/0/b/9/1c60b9976b4d861ddc90d668f749fe6f.jpg?size=180x180"; + station = di-fm-name "Drumstep"; + stream = di-fm "drumstep"; + } + { + desc = "An emphasis on the bass and drums / DnB, delayed effects, sampled vocals and smokey Reggae inspired vibes."; + logo = "http://cdn-images.audioaddict.com/e/2/c/8/6/5/e2c865e92c65cfb91ad0e2d3933234e0.jpg?size=180x180"; + station = di-fm-name "Dub"; + stream = di-fm "dub"; + } + { + desc = "The beloved sounds of deep techno saturated with tape delays, heavy reverb and ice cold atmospherics."; + logo = "http://cdn-images.audioaddict.com/1/9/d/6/1/0/19d61084830ef94886b32d847fc5d29e.jpg?size=180x180"; + station = di-fm-name "Dub Techno"; + stream = di-fm "dubtechno"; + } + { + desc = "The wobbles of the bass, the party rocking beats, and the biggest crowd destroying drops."; + logo = "http://cdn-images.audioaddict.com/7/7/c/1/a/e/77c1aec493eeb9e2a5d22951447fbd48.jpg?size=180x180"; + station = di-fm-name "Dubstep"; + stream = di-fm "dubstep"; + } + { + desc = "The sound of the largest events. From the gargantuan festivals, the huge main rooms and the biggest DJs."; + logo = "http://cdn-images.audioaddict.com/d/d/1/1/8/f/dd118f5fe9befc191907a32d0877a13d.jpg?size=180x180"; + station = di-fm-name "EDM Festival"; + stream = di-fm "edmfestival"; + } + { + desc = "Where dance meets pop. Crossover favorites, stadium-sized anthems and the biggest electronic tunes in existence."; + logo = "http://cdn-images.audioaddict.com/6/9/b/2/c/c/69b2cc01d4cbcb5a813ee6428bc4e455.jpg?size=180x180"; + station = di-fm-name "EDM Hits"; + stream = di-fm "edm"; + } + { + desc = "Buzzing basslines, huge kicks, party rocking drops. House music packed full of gigantic bass and massive synths."; + logo = "http://cdn-images.audioaddict.com/7/4/2/3/8/0/742380673147770eef642532828dbc6c.jpg?size=180x180"; + station = di-fm-name "Electro House"; + stream = di-fm "electrohouse"; + } + { + desc = "The combination of 1920s-1940s jazz and swing music, big band horns and modern day electro house."; + logo = "http://cdn-images.audioaddict.com/3/3/e/6/0/9/33e609d64ca20b0719d28d2193eece31.jpg?size=180x180"; + station = di-fm-name "Electro Swing"; + stream = di-fm "electroswing"; + } + { + desc = "The trailblazers, the renegades and the experimental musicians who gave early inspiration with electronic instruments."; + logo = "http://cdn-images.audioaddict.com/5/7/4/a/3/3/574a3373b242bed1018c5c99e5021c3f.jpg?size=180x180"; + station = di-fm-name "Electronic Pioneers"; + stream = di-fm "electronicpioneers"; + } + { + desc = "Catchy pop music blended together with vintage synthesizers and electronic instrumentation."; + logo = "http://cdn-images.audioaddict.com/2/8/c/1/e/8/28c1e8587ae6e0b2589b4d66ccd99324.jpg?size=180x180"; + station = di-fm-name "Electropop"; + stream = di-fm "electropop"; + } + { + desc = "Trance in its most boisterous form. Uplifting melodies on top of high energy beats create these euphoric anthems."; + logo = "http://cdn-images.audioaddict.com/f/1/f/d/f/e/f1fdfea9ba9622ecdee020cc53126e60.jpg?size=180x180"; + station = di-fm-name "Epic Trance"; + stream = di-fm "epictrance"; + } + { + desc = "Pop music infused with a high energy 4/4 pulse. Heavy on the synthesizers, the melodies and the vocals."; + logo = "http://cdn-images.audioaddict.com/4/b/b/2/7/5/4bb2756bcacce0a2bf44ebaaf743f2ab.jpg?size=180x180"; + station = di-fm-name "EuroDance"; + stream = di-fm "eurodance"; + } + { + desc = "Focused on the funkiest grooves, with plenty of the guitar licks and clever samples placed around a 4/4 swing."; + logo = "http://cdn-images.audioaddict.com/3/3/7/0/b/a/3370baa3700e4578558dff57c6443a0f.jpg?size=180x180"; + station = di-fm-name "Funky House"; + stream = di-fm "funkyhouse"; + } + { + desc = "Hard basslines, booming beats and insatiable grooves. Inspired by Trap, Juke and Garage – molded together into a unique booming style."; + logo = "http://cdn-images.audioaddict.com/3/9/e/5/8/b/39e58b7b675d6ec353582cd5e9f38dbe.jpg?size=180x180"; + station = di-fm-name "Future Bass"; + stream = di-fm "futurebass"; + } + { + desc = "2step Garage rhythms, chunky bass line driven grooves and plenty of forward thinking innovation."; + logo = "http://cdn-images.audioaddict.com/0/e/9/0/4/2/0e904268ec98b8c0521c30da4ac321bb.jpg?size=180x180"; + station = di-fm-name "Future Garage"; + stream = di-fm "futuregarage"; + } + { + desc = "Finest selection of futurepop and synthpop."; + logo = "http://cdn-images.audioaddict.com/e/e/8/5/2/3/ee8523a0d6165465961cb2d0445c4f27.jpg?size=180x180"; + station = di-fm-name "Future Synthpop"; + stream = di-fm "futuresynthpop"; + } + { + desc = "The hardest form of techno with punishing tracks designed to drive the crowds into a sweaty frenzy."; + logo = "http://cdn-images.audioaddict.com/d/a/f/c/e/d/dafced37829e69724be99dc375bc5713.jpg?size=180x180"; + station = di-fm-name "Gabber"; + stream = di-fm "gabber"; + } + { + desc = "The sound of digital malfunctions, electric hum and bit rate distortions perfectly placed alongside laid-back hip hop beats."; + logo = "http://cdn-images.audioaddict.com/7/3/5/a/b/b/735abb160f950c98e2bd7caf6843e255.jpg?size=180x180"; + station = di-fm-name "Glitch Hop"; + stream = di-fm "glitchhop"; + } + { + desc = "A very psychedelic form of trance, Goa-Psy Trance is a sound full of arpeggiated synths and trippy effects."; + logo = "http://cdn-images.audioaddict.com/4/e/e/e/4/4/4eee448424df2768055ee7503f0251e9.jpg?size=180x180"; + station = di-fm-name "Goa-Psy Trance"; + stream = di-fm "goapsy"; + } + { + desc = "A channel showcasing everything from hard dance, trance and happy hardcore to lift the spirits (and the arms)."; + logo = "http://cdn-images.audioaddict.com/d/f/7/7/8/e/df778eed294536f4e858093124aa2be5.jpg?size=180x180"; + station = di-fm-name "Hands Up"; + stream = di-fm "handsup"; + } + { + desc = "Concrete kicks and punching rhythms, hard dance is a tougher side of music with sharp edges and aggressive power."; + logo = "http://cdn-images.audioaddict.com/5/9/d/a/e/5/59dae529a51feb3f90b542f3d33808ec.jpg?size=180x180"; + station = di-fm-name "Hard Dance"; + stream = di-fm "harddance"; + } + { + desc = "Tough as nails warehouse jams full of cold aggression, sinister structures and pounding rhythms that hit hard."; + logo = "http://cdn-images.audioaddict.com/5/e/5/1/1/d/5e511d67198b404149e7eaed9858e5d4.jpg?size=180x180"; + station = di-fm-name "Hard Techno"; + stream = di-fm "hardtechno"; + } + { + desc = "Strictly for the hardcore. These are the biggest and boldest bangers, and the hardest hitting tracks."; + logo = "http://cdn-images.audioaddict.com/e/0/5/3/8/5/e05385cf844ef4884a26c19ed254efbf.jpg?size=180x180"; + station = di-fm-name "Hardcore"; + stream = di-fm "hardcore"; + } + { + desc = "Hard techno & hardcore. A global phenomenon with powerful kicks, distorted effects and infectious melodies."; + logo = "http://cdn-images.audioaddict.com/8/b/1/0/3/c/8b103c03fbf78becf042085552e9ef41.jpg?size=180x180"; + station = di-fm-name "Hardstyle"; + stream = di-fm "hardstyle"; + } + { + desc = "Born in Chicago and now global, house music is always evolving but remains true to its pure 4/4 structure."; + logo = "http://cdn-images.audioaddict.com/5/3/0/b/6/9/530b699645ddff8d66a2333ae09bb06a.jpg?size=180x180"; + station = di-fm-name "House"; + stream = di-fm "house"; + } + { + desc = "Smooth, groovy and full of cutting-edge, fresh ideas – beats to kick back and enjoy far from the club setting."; + logo = "http://cdn-images.audioaddict.com/9/1/8/4/2/b/91842b0ec15b8b69e50315dbd3afe03e.jpg?size=180x180"; + station = di-fm-name "Indie Beats"; + stream = di-fm "indiebeats"; + } + { + desc = "The spirit of Rock & Roll with an electronic soul. Club culture and live music combined."; + logo = "http://cdn-images.audioaddict.com/9/f/7/0/a/d/9f70ad76ec13a6123405c6d7a03325f3.jpg?size=180x180"; + station = di-fm-name "Indie Dance"; + stream = di-fm "indiedance"; + } + { + desc = "One of the biggest cultural soundtracks with the infectious thump of house music. Expect sultry saxophones, trumpets, and finger snapping grooves."; + logo = "http://cdn-images.audioaddict.com/f/4/b/3/3/e/f4b33e8cbd9f0b1776e64f17b9c35abd.jpg?size=180x180"; + station = di-fm-name "Jazz House"; + stream = di-fm "jazzhouse"; + } + { + desc = "Jungle keeps the breakbeat tempos high and celebrates the diverse ideas found within urban and rave music."; + logo = "http://cdn-images.audioaddict.com/4/1/e/d/e/7/41ede7b8b43cffcc42876e6e319b7ef3.jpg?size=180x180"; + station = di-fm-name "Jungle"; + stream = di-fm "jungle"; + } + { + desc = "The sounds of Salsa, Brazilian beats and Latin Jazz with the steady grooves of modern East Coast dance music."; + logo = "http://cdn-images.audioaddict.com/6/0/1/7/6/e/60176ec05138ad9b621cb92de7f0c8c8.jpg?size=180x180"; + station = di-fm-name "Latin House"; + stream = di-fm "latinhouse"; + } + { + desc = "Smooth as water, with the fast paced rhythms, Liquid DNB / Drum and Bass flows with rolling ease without losing momentum."; + logo = "http://cdn-images.audioaddict.com/6/7/5/9/9/a/67599a0b4f3575ea5f6a74fe633899d7.jpg?size=180x180"; + station = di-fm-name "Liquid DnB"; + stream = di-fm "liquiddnb"; + } + { + desc = "Smooth, rolling and steady – this fresh formation of Dubstep keeps the sounds you love with a flowing Drum and Bass groove."; + logo = "http://cdn-images.audioaddict.com/6/e/f/6/c/e/6ef6ced4249faec61c8fbc58b10b6343.jpg?size=180x180"; + station = di-fm-name "Liquid Dubstep"; + stream = di-fm "liquiddubstep"; + } + { + desc = "The smoother side of Trap but still packed with mechanical grooves and hip hop moods."; + logo = "http://cdn-images.audioaddict.com/6/b/5/b/d/6/6b5bd66a99e46fa1258cb565d988ea7c.jpg?size=180x180"; + station = di-fm-name "Liquid Trap"; + stream = di-fm "liquidtrap"; + } + { + desc = "Tastefully selected LoFi Hip-Hop tunes with textured atmospheres & laid back beats – with a dash of chillhop and perfectly designed to chill your ears."; + logo = "http://cdn-images.audioaddict.com/c/f/7/0/d/a/cf70daf883c01687f321d72376227493.jpg?size=180x180"; + station = di-fm-name "LoFi Hip-Hop"; + stream = di-fm "lofihiphop"; + } + { + desc = "Punch your one-way ticket to peace of mind and mental clarity with this curated selection of LoFi Lounge & Chill tracks today."; + logo = "http://cdn-images.audioaddict.com/0/2/7/2/1/f/02721f4098dbeae07a8956d832f59cd8.jpg?size=180x180"; + station = di-fm-name "LoFi Lounge & Chill"; + stream = di-fm "lofiloungenchill"; + } + { + desc = "Music to chill to. Music made for when it's all about kicking off your shoes, laying back, and totally relaxing."; + logo = "http://cdn-images.audioaddict.com/f/7/a/5/f/b/f7a5fbb67a1a0f0992f131506917c2e6.jpg?size=180x180"; + station = di-fm-name "Lounge"; + stream = di-fm "lounge"; + } + { + desc = "The melodic side of progressive house, packed with driving rhythms and forward thinking sounds."; + logo = "http://cdn-images.audioaddict.com/4/4/8/c/f/6/448cf62c2d3c68ede713008015da9bfc.jpg?size=180x180"; + station = di-fm-name "Melodic Progressive"; + stream = di-fm "melodicprogressive"; + } + { + desc = "Minimal fuses elements of house, techno and electronica and strips it back to focus on the spaces between the sound."; + logo = "http://cdn-images.audioaddict.com/a/9/1/b/1/4/a91b1414a8712794672e3ea1324ffe92.jpg?size=180x180"; + station = di-fm-name "Minimal"; + stream = di-fm "minimal"; + } + { + desc = "Pitched up vocals, happy hardcore beats, and high energy music non-stop."; + logo = "http://cdn-images.audioaddict.com/e/f/8/f/b/e/ef8fbe63f86e496f0ce514ee2e85c30a.jpg?size=180x180"; + station = di-fm-name "Nightcore"; + stream = di-fm "nightcore"; + } + { + desc = "Modern disco music blending the familiar funk of the 70s and 80s with futuristic beats and up to date grooves."; + logo = "http://cdn-images.audioaddict.com/f/2/3/7/8/a/f2378a19d61a3063a2a6271a29fb1595.jpg?size=180x180"; + station = di-fm-name "Nu Disco"; + stream = di-fm "nudisco"; + } + { + desc = "Acid, one of the characteristics of the TB-303, is celebrated here with the best tracks from house, techno and trance."; + logo = "http://cdn-images.audioaddict.com/7/0/a/7/8/3/70a7830bce8d22eb1a7c868773f443e8.jpg?size=180x180"; + station = di-fm-name "Oldschool Acid"; + stream = di-fm "oldschoolacid"; + } + { + desc = "The biggest classics and secret weapons – this is a true treasure chest of house tracks from back in the day."; + logo = "http://cdn-images.audioaddict.com/7/d/0/c/e/f/7d0cefbcb479ce257b24471f3d600eba.jpg?size=180x180"; + station = di-fm-name "Oldschool House"; + stream = di-fm "oldschoolhouse"; + } + { + desc = "Grab your whistles, white gloves and reach for the laser beams. This is the sound of raving when raving was new."; + logo = "http://cdn-images.audioaddict.com/b/1/0/c/2/6/b10c2672a6a54a8ae5356f3ddb49b4c1.jpg?size=180x180"; + station = di-fm-name "Oldschool Rave"; + stream = di-fm "oldschoolrave"; + } + { + desc = "Go back in time and hear the biggest and best tracks within techno and trance that defined a decade of dance culture."; + logo = "http://cdn-images.audioaddict.com/2/4/9/d/1/8/249d182058ac9e5631557eb309efe80f.jpg?size=180x180"; + station = di-fm-name "Oldschool Techno & Trance"; + stream = di-fm "oldschool"; + } + { + desc = "Always moving forward, progressive continues to reinvent itself into new sounds and styles made for the floor."; + logo = "http://cdn-images.audioaddict.com/3/3/5/5/3/1/3355314492d633a5330c659cfe98fc1b.jpg?size=180x180"; + station = di-fm-name "Progressive"; + stream = di-fm "progressive"; + } + { + desc = "Progress your mind to undiscovered psychedelic dimensions."; + logo = "http://cdn-images.audioaddict.com/5/f/a/5/6/5/5fa5659badbaf1a4ff817323ee5e998a.jpg?size=180x180"; + station = di-fm-name "Progressive Psy"; + stream = di-fm "progressivepsy"; + } + { + desc = "Downtempo psychedelic dub grooves, goa ambient, and world beats."; + logo = "http://cdn-images.audioaddict.com/4/5/2/d/1/4/452d14ab72381941b1bd5f94af15678b.jpg?size=180x180"; + station = di-fm-name "PsyChill"; + stream = di-fm "psychill"; + } + { + desc = "Dub, ambient, and psychedelic trance, fused together in atmospheric harmony."; + logo = "http://cdn-images.audioaddict.com/4/0/0/d/5/3/400d53d541322f0883a807c9b79d5540.jpg?size=180x180"; + station = di-fm-name "PsyDub"; + stream = di-fm "psydub"; + } + { + desc = "The psychedelic side of ambient."; + logo = "http://cdn-images.audioaddict.com/a/7/b/0/d/c/a7b0dcee2110e6d01fec96758a639ea3.jpg?size=180x180"; + station = di-fm-name "Psybient"; + stream = di-fm "psybient"; + } + { + desc = "Russia's hottest club hits."; + logo = "http://cdn-images.audioaddict.com/5/8/2/6/2/e/58262e338e405ab82ab92aa55f719f86.jpg?size=180x180"; + station = di-fm-name "Russian Club Hits"; + stream = di-fm "russianclubhits"; + } + { + desc = "House music saturated with feeling – full of melodies, vocals and true soul. Steady warm 4/4 vibes."; + logo = "http://cdn-images.audioaddict.com/e/6/5/5/c/d/e655cd614bd4a1c981273a555081c309.jpg?size=180x180"; + station = di-fm-name "Soulful House"; + stream = di-fm "soulfulhouse"; + } + { + desc = "Ambient space music for expanding minds."; + logo = "http://cdn-images.audioaddict.com/b/e/c/b/e/0/becbe0cb9c3002fc21f97f9e65cf9da1.jpg?size=180x180"; + station = di-fm-name "Space Dreams"; + stream = di-fm "spacemusic"; + } + { + desc = "This selection of summer chill house classics has been handpicked to elicit that special summer feeling year-round."; + logo = "http://cdn-images.audioaddict.com/3/d/8/b/6/1/3d8b619652faa1969274e0d51c8bd59d.jpg?size=180x180"; + station = di-fm-name "Summer Chill House"; + stream = di-fm "summerchillhouse"; + } + { + desc = "Influenced by video games and movie soundtracks of the 80s, Synthwave's mission continues today with great new music keeping things future retro."; + logo = "http://cdn-images.audioaddict.com/d/8/e/a/6/4/d8ea647113c8cdec87b4751f20b3360b.jpg?size=180x180"; + station = di-fm-name "Synthwave"; + stream = di-fm "synthwave"; + } + { + desc = "Blending the warmth of house music with the cold structural precision of techno, tech house bridges the divide."; + logo = "http://cdn-images.audioaddict.com/2/7/b/a/7/0/27ba70234566a810d9dd33745195f088.jpg?size=180x180"; + station = di-fm-name "Tech House"; + stream = di-fm "techhouse"; + } + { + desc = "Techno is a true musical force full of structure and style. Robotic, mechanical and full of soul, always facing the future."; + logo = "http://cdn-images.audioaddict.com/7/a/3/1/4/a/7a314a3ff87e31013172e9099d9aa843.jpg?size=180x180"; + station = di-fm-name "Techno"; + stream = di-fm "techno"; + } + { + desc = "Emotive dance music which embraces incredible melodies, future-facing production and energetic anthems heard worldwide."; + logo = "http://cdn-images.audioaddict.com/b/1/0/5/6/7/b10567777ad265dcc63816fa32396654.jpg?size=180x180"; + station = di-fm-name "Trance"; + stream = di-fm "trance"; + } + { + desc = "Born out of Southern Hip-Hop and influenced by techno, trap is analog drum machines / DnB & with hip-hop aesthetics."; + logo = "http://cdn-images.audioaddict.com/8/8/6/e/b/2/886eb22e09893237ff5a851991543e4b.jpg?size=180x180"; + station = di-fm-name "Trap"; + stream = di-fm "trap"; + } + { + desc = "The percussive side of the house and tech house scene, tribal house takes drums and puts them in the forefront."; + logo = "http://cdn-images.audioaddict.com/5/9/d/5/b/0/59d5b064c1bc9e165850a8d9371d32a5.jpg?size=180x180"; + station = di-fm-name "Tribal House"; + stream = di-fm "tribalhouse"; + } + { + desc = "UMF Radio 24/7"; + logo = "http://cdn-images.audioaddict.com/b/4/5/7/b/9/b457b9fe45596e28a7c4b7b004c82ce4.jpg?size=180x180"; + station = di-fm-name "UMF Radio"; + stream = di-fm "umfradio"; + } + { + desc = "From gritty Berlin streets to dark corners of Brooklyn, this is techno made by artists pushing the genre further."; + logo = "http://cdn-images.audioaddict.com/9/f/7/1/0/f/9f710f7f4c2a663bab3ff5551f8669eb.jpg?size=180x180"; + station = di-fm-name "Underground Techno"; + stream = di-fm "undergroundtechno"; + } + { + desc = "Relaxing vibes and a collection of vocal songs providing the laid back soundtrack to your day."; + logo = "http://cdn-images.audioaddict.com/5/7/4/8/8/c/57488ced7c732709c72764636b0065dc.jpg?size=180x180"; + station = di-fm-name "Vocal Chillout"; + stream = di-fm "vocalchillout"; + } + { + desc = "The glorious 4/4 thump of House music paired perfectly with the human voice. Sultry, soulful, sexy sounds."; + logo = "http://cdn-images.audioaddict.com/8/5/a/1/3/b/85a13bb220281bf22bf04d4f1f778b59.jpg?size=180x180"; + station = di-fm-name "Vocal House"; + stream = di-fm "vocalhouse"; + } + { + desc = "Laid back grooves and a collection of smooth vocals soothe the ears and relax the mind."; + logo = "http://cdn-images.audioaddict.com/8/4/3/6/f/9/8436f9d3338ba7c8de0e88dbe45ea4d5.jpg?size=180x180"; + station = di-fm-name "Vocal Lounge"; + stream = di-fm "vocallounge"; + } + { + desc = "Lush vocals paired together with emotive dance music. Beautiful melodies and endless energy."; + logo = "http://cdn-images.audioaddict.com/3/0/9/f/2/4/309f243a8a181ad83e8c5e15cd4b24c3.jpg?size=180x180"; + station = di-fm-name "Vocal Trance"; + stream = di-fm "vocaltrance"; + } + { + desc = "All Vaporwave. All the time."; + logo = "http://soma.fm/img/vaporwaves120.jpg"; + station = soma-fm-name "Vaporwaves"; + stream = soma-fm "vaporwaves"; + } + { + desc = "Emotional Experiments in Music: Ambient, modern composition, post-rock, & experimental electronic music"; + logo = "http://soma.fm/img/n5md120.png"; + station = soma-fm-name "n5MD Radio"; + stream = soma-fm "n5md"; + } + { + desc = "A nicely chilled plate of ambient/downtempo beats and grooves."; + logo = "http://soma.fm/img/groovesalad120.png"; + station = soma-fm-name "Groove Salad"; + stream = soma-fm "groovesalad"; + } + { + desc = "The classic (early 2000s) version of a nicely chilled plate of ambient/downtempo beats and grooves."; + logo = "http://soma.fm/img3/gsclassic120.jpg"; + station = soma-fm-name "Groove Salad Classic"; + stream = soma-fm "gsclassic"; + } + { + desc = "Deep ambient electronic, experimental and space music. For inner and outer space exploration."; + logo = "http://soma.fm/img/deepspaceone120.gif"; + station = soma-fm-name "Deep Space One"; + stream = soma-fm "deepspaceone"; + } + { + desc = "Tune in, turn on, space out. Spaced-out ambient and mid-tempo electronica."; + logo = "http://soma.fm/img/sss.jpg"; + station = soma-fm-name "Space Station Soma"; + stream = soma-fm "spacestation"; + } + { + desc = "Served best chilled, safe with most medications. Atmospheric textures with minimal beats."; + logo = "http://soma.fm/img/dronezone120.jpg"; + station = soma-fm-name "Drone Zone"; + stream = soma-fm "dronezone"; + } + { + desc = "Progressive house / trance. Tip top tunes."; + logo = "http://soma.fm/img/thetrip120.jpg"; + station = soma-fm-name "The Trip"; + stream = soma-fm "thetrip"; + } + { + desc = "Music for Hacking. The DEF CON Year-Round Channel."; + logo = "http://soma.fm/img/defcon120.png"; + station = soma-fm-name "DEF CON Radio"; + stream = soma-fm "defcon"; + } + { + desc = "Transcending the world of jazz with eclectic, avant-garde takes on tradition."; + logo = "http://soma.fm/img/sonicuniverse120.jpg"; + station = soma-fm-name "Sonic Universe"; + stream = soma-fm "sonicuniverse"; + } + { + desc = "NEW! Reggae, Ska, Rocksteady classic and deep tracks."; + logo = "http://soma.fm/img3/reggae120.png"; + station = soma-fm-name "Heavyweight Reggae"; + stream = soma-fm "reggae"; + } + { + desc = "Vintage soul tracks from the original 45 RPM vinyl."; + logo = "http://soma.fm/img/7soul120.png"; + station = soma-fm-name "Seven Inch Soul"; + stream = soma-fm "7soul"; + } + { + desc = "Mellow album rock from the Seventies. Yacht not required."; + logo = "http://soma.fm/img/seventies120.jpg"; + station = soma-fm-name "Left Coast 70s"; + stream = soma-fm "seventies"; + } + { + desc = "Early 80s UK Synthpop and a bit of New Wave."; + logo = "http://soma.fm/img/u80s-120.png"; + station = soma-fm-name "Underground 80s"; + stream = soma-fm "u80s"; + } + { + desc = "The soundtrack for your stylish, mysterious, dangerous life. For Spies and PIs too!"; + logo = "http://soma.fm/img/secretagent120.jpg"; + station = soma-fm-name "Secret Agent"; + stream = soma-fm "secretagent"; + } + { + desc = "Sensuous and mellow vocals, mostly female, with an electronic influence."; + logo = "http://soma.fm/img/lush120.jpg"; + station = soma-fm-name "Lush"; + stream = soma-fm "lush"; + } + { + desc = "Exploring music from Celtic roots and branches"; + logo = "http://soma.fm/img/thistle120.png"; + station = soma-fm-name "ThistleRadio"; + stream = soma-fm "thistle"; + } + { + desc = "Drown in the electronic sound of instrumental hiphop, future soul and liquid trap."; + logo = "http://soma.fm/img/fluid120.jpg"; + station = soma-fm-name "Fluid"; + stream = soma-fm "fluid"; + } + { + desc = "Electropop and indie dance rock with sparkle and pop."; + logo = "http://soma.fm/img/poptron120.png"; + station = soma-fm-name "PopTron"; + stream = soma-fm "poptron"; + } + { + desc = "A late night blend of deep-house and downtempo chill."; + logo = "http://soma.fm/img/blender120.png"; + station = soma-fm-name "Beat Blender"; + stream = soma-fm "beatblender"; + } + { + desc = "Americana Roots music for Cowhands, Cowpokes and Cowtippers"; + logo = "http://soma.fm/img/bootliquor120.jpg"; + station = soma-fm-name "Boot Liquor"; + stream = soma-fm "bootliquor"; + } + { + desc = "Classic bachelor pad, playful exotica and vintage music of tomorrow."; + logo = "http://soma.fm/img/illstreet.jpg"; + station = soma-fm-name "Illinois Street Lounge"; + stream = soma-fm "illstreet"; + } + { + desc = "What alternative rock radio should sound like. [explicit]"; + logo = "http://soma.fm/img/bagel120.png"; + station = soma-fm-name "BAGeL Radio"; + stream = soma-fm "bagel"; + } + { + desc = "New and classic favorite indie pop tracks."; + logo = "http://soma.fm/img/indychick.jpg"; + station = soma-fm-name "Indie Pop Rocks!"; + stream = soma-fm "indiepop"; + } + { + desc = "Digitally affected analog rock to calm the agitated heart."; + logo = "http://soma.fm/img/digitalis120.png"; + station = soma-fm-name "Digitalis"; + stream = soma-fm "digitalis"; + } + { + desc = "Indie Folk, Alt-folk and the occasional folk classics."; + logo = "http://soma.fm/img/folkfwd120.jpg"; + station = soma-fm-name "Folk Forward"; + stream = soma-fm "folkfwd"; + } + { + desc = "Blips'n'beeps backed mostly w/beats. Intelligent Dance Music."; + logo = "http://soma.fm/img/cliqhop120.png"; + station = soma-fm-name "cliqhop idm"; + stream = soma-fm "cliqhop"; + } + { + desc = "Dubstep, Dub and Deep Bass. May damage speakers at high volume."; + logo = "http://soma.fm/img/dubstep120.png"; + station = soma-fm-name "Dub Step Beyond"; + stream = soma-fm "dubstep"; + } + { + desc = "Desi-influenced Asian world beats and beyond."; + logo = "http://soma.fm/img/sog120.jpg"; + station = soma-fm-name "Suburbs of Goa"; + stream = soma-fm "suburbsofgoa"; + } + { + desc = "Ambient music mixed with the sounds of San Francisco public safety radio traffic."; + logo = "http://soma.fm/img/sf1033120.png"; + station = soma-fm-name "SF 10-33"; + stream = soma-fm "sf1033"; + } + { + desc = "San Francisco Public Safety Scanner Feed"; + logo = "http://soma.fm/img/sf1033120.png"; + station = soma-fm-name "SF Police Scanner"; + stream = soma-fm "scanner"; + } + { + desc = "Celebrating NASA and Space Explorers everywhere."; + logo = "http://soma.fm/img/missioncontrol120.jpg"; + station = soma-fm-name "Mission Control"; + stream = soma-fm "missioncontrol"; + } + { + desc = "From black to doom, prog to sludge, thrash to post, stoner to crossover, punk to industrial."; + logo = "http://soma.fm/img3/metal120.png"; + station = soma-fm-name "Metal Detector"; + stream = soma-fm "metal"; + } + { + desc = "Just covers. Songs you know by artists you don't. We've got you covered."; + logo = "http://soma.fm/img/covers120.jpg"; + station = soma-fm-name "Covers"; + stream = soma-fm "covers"; + } + { + desc = "From the Playa to the world, for the annual Burning Man festival."; + logo = "http://soma.fm/img/1023brc.jpg"; + station = soma-fm-name "Black Rock FM"; + stream = soma-fm "brfm"; + } + { + desc = "Special Live Events and rebroadcasts of past live events"; + logo = "http://soma.fm/img/SomaFMDJSquare120.jpg"; + station = soma-fm-name "SomaFM Live"; + stream = soma-fm "live"; + } + { + desc = "SomaFM's wacky and eclectic holiday mix. Not for the easily offended."; + logo = "http://soma.fm/img/xmasinfrisco120.jpg"; + station = soma-fm-name "Xmas in Frisko"; + stream = soma-fm "xmasinfrisko"; + } + { + desc = "Chilled holiday grooves and classic winter lounge tracks. (Kid and Parent safe!)"; + logo = "http://soma.fm/img/christmaslounge120.png"; + station = soma-fm-name "Christmas Lounge"; + stream = soma-fm "christmas"; + } + { + desc = "Have your self an indie/alternative holiday season!"; + logo = "http://soma.fm/img/xmasrocks120.png"; + station = soma-fm-name "Christmas Rocks!"; + stream = soma-fm "xmasrocks"; + } + { + desc = "Where we cut right to the soul of the season."; + logo = "http://soma.fm/img/jollysoul120.png"; + station = soma-fm-name "Jolly Ol' Soul"; + stream = soma-fm "jollysoul"; + } + { + desc = "Department Store Christmas (extended through Jan 31)"; + logo = "http://soma.fm/img/SomaFMDJSquare120.jpg"; + station = soma-fm-name "SomaFM Specials"; + stream = soma-fm "specials"; + } + { + desc = "HandsUp / Dance"; + logo = "https://www.technobase.fm/content/images/site/logo-technobase.fm.png"; + station = we-are-one-name "TechnoBase.FM"; + stream = we-are-one "technobase"; + } + { + desc = "Dance & Pop"; + logo = "https://www.housetime.fm/content/images/site/logo-housetime.fm.png"; + station = we-are-one-name "HousTime.FM"; + stream = we-are-one "housetime"; + } + { + desc = "Hardstyle"; + logo = "https://www.hardbase.fm/content/images/site/logo-hardbase.fm.png"; + station = we-are-one-name "HardBase.FM"; + stream = we-are-one "hardbase"; + } + { + desc = "Vocal & Uplifting Trance"; + logo = "https://www.trancebase.fm/content/images/site/logo-trancebase.fm.png"; + station = we-are-one-name "TranceBase.FM"; + stream = we-are-one "trancebase"; + } + { + desc = "Hardcore"; + logo = "https://www.coretime.fm/content/images/site/logo-coretime.fm.png"; + station = we-are-one-name "CoreTime.FM"; + stream = we-are-one "coretime"; + } + { + desc = "Techno / Minimal"; + logo = "https://www.clubtime.fm/content/images/site/logo-clubtime.fm.png"; + station = we-are-one-name "ClubTime.FM"; + stream = we-are-one "clubtime"; + } + { + desc = "Happy Hardcore / DnB"; + logo = "https://www.teatime.fm/content/images/site/logo-teatime.fm.png"; + station = we-are-one-name "TeaTime.FM"; + stream = we-are-one "teatime"; + } + { + desc = "90s / 00s"; + logo = "https://www.replay.fm/content/images/site/logo-replay.fm.png"; + station = we-are-one-name "Replay.FM"; + stream = we-are-one "replay"; + } + { + logo = "https://cdn.bigfm.de/sites/default/files/styles/small_webstream_200/public/Bigg-G-Quadrat-Webstream-final-klein.jpg"; + station = big-fm-name "Dancehall – Reggae – Afrobeat"; + stream = big-fm "reggaevibes"; + } + { + logo = "https://cdn.bigfm.de/sites/default/files/styles/small_webstream_200/public/bigBALKAN_0.jpg"; + station = big-fm-name "bigBALKAN"; + stream = big-fm "balkan"; + } + { + logo = "https://cdn.bigfm.de/sites/default/files/styles/small_webstream_200/public/bigSES_0.jpg"; + station = big-fm-name "bigSES (Türkei)"; + stream = big-fm "turkey"; + } + { + logo = "https://cdn.bigfm.de/sites/default/files/styles/small_webstream_200/public/bigRUSSIA_0.jpg"; + station = big-fm-name "bigRUSSIA"; + stream = big-fm "russia"; + } + { + logo = "https://cdn.bigfm.de/sites/default/files/styles/small_webstream_200/public/I_love_bigFM_CHARTS.jpg"; + station = big-fm-name "Charts"; + stream = big-fm "charts"; + } + { + logo = "https://cdn.bigfm.de/sites/default/files/styles/small_webstream_200/public/Rock_am_Ring_720_Webradio_Crowd_2.jpg"; + station = big-fm-name "Rock am Ring"; + stream = big-fm "rockamring"; + } + { + logo = "https://cdn.bigfm.de/sites/default/files/styles/small_webstream_200/public/I_love_bigFM_MASHUP_0.jpg"; + station = big-fm-name "Mashup"; + stream = big-fm "mashup"; + } + { + logo = "https://cdn.bigfm.de/sites/default/files/styles/small_webstream_200/public/bigFM_US_Rap_Hip-Hop.jpg"; + station = big-fm-name "US Rap & Hip Hop"; + stream = big-fm "usrap"; + } + { + logo = "https://cdn.bigfm.de/sites/default/files/styles/small_webstream_200/public/I_love_bigFM_HIP-HOP_0.jpg"; + station = big-fm-name "Hip-Hop"; + stream = big-fm "hiphop"; + } + { + logo = "https://cdn.bigfm.de/sites/default/files/styles/small_webstream_200/public/Oldschool_Rap_Hip_Hop_720x720.jpg"; + station = big-fm-name "Oldschool Rap & Hip Hop"; + stream = big-fm "oldschool"; + } + { + logo = "https://cdn.bigfm.de/sites/default/files/styles/small_webstream_200/public/Hip_Hop_Charts_DJ_blau.jpg"; + station = big-fm-name "Deutscher Hip-Hop Charts"; + stream = big-fm "dhiphopcharts"; + } + { + logo = "https://cdn.bigfm.de/sites/default/files/styles/small_webstream_200/public/bigFM_DEUTSCHRAP.jpg"; + station = big-fm-name "Deutschrap"; + stream = big-fm "deutschrap"; + } + { + logo = "https://cdn.bigfm.de/sites/default/files/styles/small_webstream_200/public/Markus-Spiske-unsplash-quadrat-berlin.jpg"; + station = big-fm-name "Neu Berlin Deutschrap"; + stream = big-fm "rapfeature"; + } + { + logo = "https://cdn.bigfm.de/sites/default/files/styles/small_webstream_200/public/Oldschool_Deutsch_720x720.jpeg"; + station = big-fm-name "Oldschool Deutschrap"; + stream = big-fm "oldschooldeutsch"; + } + { + logo = "https://cdn.bigfm.de/sites/default/files/styles/small_webstream_200/public/I_love_bigFM_MASHUP_0.jpg"; + station = big-fm-name "Mashup"; + stream = big-fm "mashup"; + } + { + station = rautemusik-name "Workout"; + stream = rautemusik "workout"; + desc = "Dance, HipHop, Pop"; + } + { + station = rautemusik-name "Wacken Radio"; + desc = "Metal, Heavy MetaL"; + stream = rautemusik "wackenradio"; + } + { + station = rautemusik-name "Volksmusik"; + desc = "Volksmusik, Blasmusik, Schlager"; + stream = rautemusik "volksmusik"; + } + { + station = rautemusik-name "Trance"; + stream = rautemusik "trance"; + desc = "Trance, Vocal Trance, Uplifting"; + } + { + station = rautemusik-name "Study"; + stream = rautemusik "study"; + desc = "Lo-Fi, Chillout, Easy Listening"; + } + { + station = rautemusik-name "TechHouse"; + stream = rautemusik "techhouse"; + desc = "Techhouse, Deephouse, Techno, Minimal"; + } + { + station = rautemusik-name "Goldies"; + stream = rautemusik "goldies"; + desc = "Oldies, 60s, 70s, 80s"; + } + { + station = rautemusik-name "90s"; + stream = rautemusik "90s"; + desc = "90s, Eurodance, Pop, HipHop"; + } + { + station = rautemusik-name "Schlager"; + stream = rautemusik "schlager"; + desc = "Schlager, Discofox, Deutsch, Pop"; + } + { + station = rautemusik-name "Country"; + stream = rautemusik "country"; + desc = "Country, Western, Americana"; + } + { + station = rautemusik-name "Sex"; + stream = rautemusik "sex"; + desc = "RnB, Pop, Easy Listening"; + } + { + station = rautemusik-name "LoveHits"; + stream = rautemusik "lovehits"; + desc = "Lovesongs, Balladen, RnB, Pop"; + } + { + station = rautemusik-name "Klassik"; + stream = rautemusik "klassik"; + desc = "Symphonie, Orchester, Klassik"; + } + { + station = rautemusik-name "Traurig"; + stream = rautemusik "traurig"; + desc = "Balladen, Pop, Easy Listening"; + } + { + station = rautemusik-name "Happy"; + stream = rautemusik "happy"; + desc = "Pop, Dance, Charts"; + } + { + station = rautemusik-name "Solo Piano"; + stream = rautemusik "solopiano"; + desc = "Klavier, Instrumental, Easy Listening"; + } + { + station = rautemusik-name "HappyHardcore"; + stream = rautemusik "happyhardcore"; + desc = "UK Core, Happy Hardcore, Dance"; + } + { + station = rautemusik-name "HardeR"; + stream = rautemusik "harder"; + desc = "Hardstyle, Hardcore, Jumpstyle"; + } + { + station = rautemusik-name "BigCityBeats"; + stream = rautemusik "bigcitybeats"; + desc = "EDM, Dance, House, Electro, Star DJs"; + } + { + station = rautemusik-name "Lounge"; + stream = rautemusik "lounge"; + desc = "Ambient, Jazz, Chillout, Easy Listening"; + } + { + station = rautemusik-name "Oriental"; + stream = rautemusik "oriental"; + desc = "Arabisch, Oriental, HipHop"; + } + { + station = rautemusik-name "Salsa"; + stream = rautemusik "salsa"; + desc = "Salsa, Latina, Tropical"; + } + { + station = rautemusik-name "Christmas"; + stream = rautemusik "christmas"; + desc = "Weihnachtslieder, Balladen, Schlager"; + } + { + station = rautemusik-name "Christmas Chor"; + stream = rautemusik "christmas-chor"; + desc = "Chor, Weihnachtslieder, Gesang"; + } + { + station = rautemusik-name "Christmas Schlager"; + stream = rautemusik "christmas-schlager"; + desc = "Schlager, Weihnachtslieder"; + } + { + station = rautemusik-name "Weihnachten.FM"; + stream = rautemusik "weihnachten"; + desc = "Weihnachtslieder, Pop"; + } + { + station = rautemusik-name "Top40"; + stream = rautemusik "top40"; + desc = "Charts, Top40, Dance, Hiphop"; + } + { + station = rautemusik-name "Rock"; + desc = "Rock, Alternative, Punk"; + stream = rautemusik "rock"; + } + { + station = rautemusik-name "PartyHits"; + desc = "Karneval, Mallorca, Après Ski, Schlager"; + stream = rautemusik "partyhits"; + } + { + station = rautemusik-name "Main"; + stream = rautemusik "main"; + desc = "Pop, Rock, Charts, 80s"; + } + { + station = rautemusik-name "JaM"; + stream = rautemusik "jam"; + desc = "HipHop, RnB, Rap, Soul, Urban"; + } + { + station = rautemusik-name "House"; + stream = rautemusik "house"; + desc = "House, Dance, Electro, EDM"; + } + { + station = rautemusik-name "Deutschrap Charts"; + stream = rautemusik "deutschrap-charts"; + desc = "Deutschrap, HipHop, Rap, Charts"; + } + { + station = rautemusik-name "Deutschrap Classic"; + stream = rautemusik "deutschrap-classic"; + desc = "Oldschool, Rap, HipHop, Deutschrap"; + } + { + station = rautemusik-name "Club"; + stream = rautemusik "club"; + desc = "HandsUp, Dance, Hard Dance"; + } + { + station = rautemusik-name "charthits"; + stream = rautemusik "ChartHits"; + desc = "House, RnB, Dance, Electro"; + } + { + station = rautemusik-name "BreakZ.FM"; + stream = rautemusik "breakz"; + desc = "RnB, House, HipHop, Dance, Mixtapes"; + } + { + station = rautemusik-name "Bass"; + stream = rautemusik "bass"; + desc = "DnB, Dubstep, Trap & Bass House"; + } + { + station = rautemusik-name "12punks"; + stream = rautemusik "12punks"; + desc = "Punk, Punk Rock, Ska, Hardcore"; + } + { + logo = "https://d3kle7qwymxpcy.cloudfront.net/images/broadcasts/77/a4/13931/1/c175.png"; + station = "Raidió Rírá"; + stream = "http://185.80.220.12:8166/stream"; + desc = "Is cairt-staisiún ceoil é Raidió Rí-Rá a bhíonn ag craoladh go hiomlán trí Ghaeilge! Bíonn an ceol ar fad ó na cairteacha le cloisteáil ar an stáisiún, mar aon leis an bpopnuacht, an nuacht spóirt agus an nuacht scannánaíochta is déanaí!"; + } + { + stream = "http://188.247.86.67:8008"; + station = "Rotana Tarab"; + logo = "https://liveonlineradio.net/wp-content/uploads/2017/11/Rotana-Tarab-100x47.jpg"; + } + { + stream = "http://iphone.live24.gr/derty1000"; + station = "Derti FM"; + desc = "Μόνο λαϊκά"; + logo = "https://cdn-radiotime-logos.tunein.com/s87063q.png"; + } + { + stream = "http://62.210.24.124:8379/;stream.mp3"; + station = "Gjirokastër Albania"; + logo = "https://cdn-radiotime-logos.tunein.com/s151734q.png"; + } + { + station = "Vahon Hindustani Radio"; + stream = "http://94.23.148.11:8058/"; + } + { + logo = "https://www.liveradio.ie/files/images/115732/resized/180x172c/rte_raidio_na_gaeltachta.jpg"; + station = rte-name "Raidió Na Gaeltachta"; + desc = "Stáisiún Náisiúnta na Gaeltachta agus na Gaeilge, ag craoladh as Gaeilge."; + stream = rte "rnag"; + } + { + logo = "https://www.liveradio.ie/files/images/114812/resized/180x172c/rte_2fm.jpg"; + station = rte-name "2fm"; + stream = rte "2fm"; + desc = "RTÉ 2fm is a music and entertainment service for 25-44's. 2fm is the national platform for new Irish talent, great festivals and live music."; + } + { + logo = "https://www.liveradio.ie/files/images/115626/resized/180x172c/rte_2xm.jpg"; + stream = rte "2xm"; + station = rte-name "2XM"; + desc = "The station plays a broad range of music from rock, indie, metal, electronica, alternative and nu metal and also selection of live music with a particular focus on music content from festivals across Europe."; + } + { + logo = "https://www.liveradio.ie/files/images/115762/resized/180x172c/rte_gold.jpg"; + stream = rte "gold"; + station = rte-name "Gold"; + desc = "RTÉ Gold is a play list service offering a carefully chosen selection of classic hits as well as album tracks from top selling artists spanning the '50s, '60s, ‘70s and ‘80s."; + } + { + logo = "https://www.liveradio.ie/files/images/101096/resized/180x172c/rte_lyric_fm.png"; + stream = rte "lyric"; + station = rte-name "Lyric FM"; + desc = "“Without doubt RTÉ lyric fm is for listeners that are looking for a real alternative. With an increase in people tuning to the station ‘where life sounds better’ across weekends, there is something to satisfy everyone’s taste for specialist or more mainstream music.”"; + } + { + logo = "https://www.liveradio.ie/files/images/329303/resized/180x172c/rte_pulse.jpg"; + station = rte-name "Pulse"; + stream = rte "pulse"; + desc = "RTÉ Pulse is an electronic dance music station from Raidió Teilifís Éireann (RTÉ), Ireland's national broadcaster."; + } + { + logo = "https://www.liveradio.ie/files/images/338090/resized/180x172c/rte_radio_1.jpg"; + station = rte-name "Radio 1"; + stream = rte "radio1"; + desc = "RTÉ Radio 1 is the principal radio channel of Irish public-service broadcaster Raidió Teilifís Éireann. The station is a rare modern example of a mixed radio network, broadcasting a mixture of music and speech programming."; + } + { + logo = "https://www.liveradio.ie/files/images/115731/resized/180x172c/rte_radio_1_extra.jpg"; + station = rte-name "Radio 1 Extra"; + stream = rte "radio1extra"; + desc = "RTE Radio 1 Extra (aka RTE Radio 1xtra) - Quality speech radio from home and abroad."; + } + { + logo = "https://cdn-profiles.tunein.com/s96877/images/logoq.png"; + station = "DWG Radio"; + desc = "Bibeltreues Radio im Internet"; + stream = "http://server25531.streamplus.de/;stream.mp3"; + } + { + logo = "http://www.beatlesradio.com/content/images/thumbs/0000587.gif"; + station = "Beatles Radio"; + stream = "http://www.beatlesradio.com:8000/stream"; + desc = ""; + } + { + logo = "https://knr.gl/sites/knr/themes/knr/gfx/sprite.png"; + station = "Kalaallit Nunaata Radioa"; + stream = "https://knr.gl/radiolivestream"; + } + { + logo = "http://sithafm.lk/sithafm.jpg"; + station = "Sitha.FM"; + stream = caster-fm "shaincast" 48148; + } + { + logo = "https://media.radiosai.org/journals/vol_18/01JAN20/images/11_h2h_special/95th-Birthday-Logo-for-White-Background.jpg"; + station = radiosai-name "Bhajan Stream"; + stream = radiosai "bhajan"; + desc = "The voice of pure love."; + } + { + logo = "https://media.radiosai.org/journals/vol_18/01JAN20/images/11_h2h_special/95th-Birthday-Logo-for-White-Background.jpg"; + station = radiosai-name "Asia Stream"; + stream = radiosai "asia"; + desc = "The voice of pure love."; + } + { + logo = "https://media.radiosai.org/journals/vol_18/01JAN20/images/11_h2h_special/95th-Birthday-Logo-for-White-Background.jpg"; + station = radiosai-name "Ameri Stream"; + stream = radiosai "ameri"; + desc = "The voice of pure love."; + } +] +/* + (caster-fm "Antenne-ASB.ga" "shaincast" 17656) + (caster-fm "TODO" "noasrv" 10182) # https://github.com/cccruzr/albumsyoumusthear/blob/7e00baf575e4d357cd275d54d1aeb717321141a8/HLS/IBERO_90_1.m3u + (caster-fm "TODO" "shaincast" 20866) # https://github.com/cccruzr/albumsyoumusthear/blob/7e00baf575e4d357cd275d54d1aeb717321141a8/HLS/IBERO_90_1.m3u +*/ diff --git a/modules/mpd-fm.nix b/modules/mpd-fm.nix new file mode 100644 index 0000000..e95c2ba --- /dev/null +++ b/modules/mpd-fm.nix @@ -0,0 +1,96 @@ +{ config, lib, pkgs, ... }: +with lib; +let + mpd-fm = pkgs.callPackage {}; + cfg = config.services.mpd-fm; +in { + imports = []; + + options.services.mpd-fm = { + enable = mkEnableOption "MPD.FM, an MPD web UI for radio streams"; + + webPort = mkOption { + type = types.port; + default = 4200; + }; + + stations = mkOption { + default = []; + type = types.listOf (types.submodule { + options = { + id = mkOption { + type = types.int; + description = "A unique identifier of the station"; + }; + station = mkOption { + type = types.str; + description = "Name of the station that should be displayed"; + }; + desc = mkOption { + type = types.nullOr types.str; + description = "Short description of the station (optional)"; + }; + logo = mkOption { + type = types.str; + description = "URL to a logo of the station (any size)"; + }; + stream = mkOption { + type = types.str; + description = "URL to the stream of the radio station (in a format supported by MPD such as MP3, OGG, ...)"; + }; + }; + }); + }; + + stationsFile = mkOption { + type = types.path; + default = pkgs.writeText "stations.json" (builtins.toJSON cfg.stations); + }; + + package = mkOption { + type = types.package; + default = mpd-fm; + }; + + mpd = { + host = mkOption { + type = types.str; + default = "localhost"; + description = "The host where MPD is listening."; + example = "localhost"; + }; + + port = mkOption { + type = types.port; + default = config.services.mpd.network.port; + description = "The port where MPD is listening."; + example = 6600; + }; + }; + }; + + config = mkIf cfg.enable { + users.extraUsers.mpd-fm.isSystemUser = true; + # ref https://github.com/florianheinemann/MPD.FM/blob/9d037cf87597b26ae2f10ba9feea48946ad6cc68/service/MPD.FM.service + systemd.services.mpd-fm = { + wantedBy = [ "multi-user.target" ]; + after = [ "mpd.service" ]; + description = "MPD.FM – an MPD web radio player web GUI"; + script = "${cfg.package}/libexec/mpd.fm/deps/mpd.fm/bin/www"; + environment = { + NODE_ENV = "production"; + MPD_HOST = cfg.mpd.host; + MPD_PORT = toString cfg.mpd.port; + PORT = toString cfg.webPort; + STATION_FILE = cfg.stationsFile; + }; + serviceConfig = { + Restart = "always"; + StandardOutput = "syslog"; + StandardError = "syslog"; + SyslogIdentifier = "mpd-fm"; + User = "mpd-fm"; + }; + }; + }; +} diff --git a/packages/MPD.FM/default.nix b/packages/MPD.FM/default.nix new file mode 100644 index 0000000..b97c4fd --- /dev/null +++ b/packages/MPD.FM/default.nix @@ -0,0 +1,13 @@ +{ mkYarnPackage, fetchFromGitHub }: +mkYarnPackage rec { + name = "MPD.FM"; + src = fetchFromGitHub { + owner = "kmein"; + repo = "MPD.FM"; + rev = "c7cbaa4ce3b350f26cad54378db22c8ec58d987b"; + sha256 = "1iklzbaji7ls01jfi1r0frhjq2i1w29kmar7vgw32f5mgj19cyvd"; + }; + packageJSON = "${src}/package.json"; + yarnLock = ./yarn.lock; + yarnNix = ./yarn.nix; +} diff --git a/packages/MPD.FM/yarn.lock b/packages/MPD.FM/yarn.lock new file mode 100644 index 0000000..42e13a9 --- /dev/null +++ b/packages/MPD.FM/yarn.lock @@ -0,0 +1,422 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +accepts@~1.3.3: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +basic-auth@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" + integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== + dependencies: + safe-buffer "5.1.2" + +body-parser@~1.18.2: + version "1.18.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" + integrity sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ= + dependencies: + bytes "3.0.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "~1.6.3" + iconv-lite "0.4.23" + on-finished "~2.3.0" + qs "6.5.2" + raw-body "2.3.3" + type-is "~1.6.16" + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= + +content-type@~1.0.2, content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +cookie-parser@~1.4.3: + version "1.4.5" + resolved "https://registry.yarnpkg.com/cookie-parser/-/cookie-parser-1.4.5.tgz#3e572d4b7c0c80f9c61daf604e4336831b5d1d49" + integrity sha512-f13bPUj/gG/5mDr+xLmSxxDsB9DQiTIfhJS/sqjrmfAWiAN+x2O4i/XguTL9yDZ+/IFDanJ+5x7hC4CXT9Tdzw== + dependencies: + cookie "0.4.0" + cookie-signature "1.0.6" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +debug@2.6.9, debug@~2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +depd@~1.1.1, depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +encodeurl@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +etag@~1.8.0, etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +express@~4.15.5: + version "4.15.5" + resolved "https://registry.yarnpkg.com/express/-/express-4.15.5.tgz#670235ca9598890a5ae8170b83db722b842ed927" + integrity sha1-ZwI1ypWYiQpa6BcLg9tyK4Qu2Sc= + dependencies: + accepts "~1.3.3" + array-flatten "1.1.1" + content-disposition "0.5.2" + content-type "~1.0.2" + cookie "0.3.1" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.1" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.8.0" + finalhandler "~1.0.6" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.1" + path-to-regexp "0.1.7" + proxy-addr "~1.1.5" + qs "6.5.0" + range-parser "~1.2.0" + send "0.15.6" + serve-static "1.12.6" + setprototypeof "1.0.3" + statuses "~1.3.1" + type-is "~1.6.15" + utils-merge "1.0.0" + vary "~1.1.1" + +finalhandler@~1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.6.tgz#007aea33d1a4d3e42017f624848ad58d212f814f" + integrity sha1-AHrqM9Gk0+QgF/YkhIrVjSEvgU8= + dependencies: + debug "2.6.9" + encodeurl "~1.0.1" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.2" + statuses "~1.3.1" + unpipe "~1.0.0" + +forwarded@~0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +iconv-lite@0.4.23: + version "0.4.23" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" + integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ipaddr.js@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.4.0.tgz#296aca878a821816e5b85d0a285a99bcff4582f0" + integrity sha1-KWrKh4qCGBbluF0KKFqZvP9FgvA= + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +mime-db@1.45.0: + version "1.45.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea" + integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w== + +mime-types@~2.1.24: + version "2.1.28" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.28.tgz#1160c4757eab2c5363888e005273ecf79d2a0ecd" + integrity sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ== + dependencies: + mime-db "1.45.0" + +mime@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" + integrity sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM= + +morgan@~1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.1.tgz#0a8d16734a1d9afbc824b99df87e738e58e2da59" + integrity sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA== + dependencies: + basic-auth "~2.0.0" + debug "2.6.9" + depd "~1.1.2" + on-finished "~2.3.0" + on-headers "~1.0.1" + +mpd@~1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/mpd/-/mpd-1.3.0.tgz#a9a0e028f6808e5594f76fa9f0c574ad86f0c0dd" + integrity sha1-qaDgKPaAjlWU92+p8MV0rYbwwN0= + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +parseurl@~1.3.1, parseurl@~1.3.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +proxy-addr@~1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.5.tgz#71c0ee3b102de3f202f3b64f608d173fcba1a918" + integrity sha1-ccDuOxAt4/IC87ZPYI0XP8uhqRg= + dependencies: + forwarded "~0.1.0" + ipaddr.js "1.4.0" + +qs@6.5.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.0.tgz#8d04954d364def3efc55b5a0793e1e2c8b1e6e49" + integrity sha512-fjVFjW9yhqMhVGwRExCXLhJKrLlkYSaxNWdyc9rmHlrVZbk35YHH312dFd7191uQeXkI3mKLZTIbSvIeFwFemg== + +qs@6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +range-parser@~1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" + integrity sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw== + dependencies: + bytes "3.0.0" + http-errors "1.6.3" + iconv-lite "0.4.23" + unpipe "1.0.0" + +safe-buffer@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + integrity sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg== + +safe-buffer@5.1.2, safe-buffer@~5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +send@0.15.6: + version "0.15.6" + resolved "https://registry.yarnpkg.com/send/-/send-0.15.6.tgz#20f23a9c925b762ab82705fe2f9db252ace47e34" + integrity sha1-IPI6nJJbdiq4JwX+L52yUqzkfjQ= + dependencies: + debug "2.6.9" + depd "~1.1.1" + destroy "~1.0.4" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.6.2" + mime "1.3.4" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.3.1" + +serve-favicon@~2.4.5: + version "2.4.5" + resolved "https://registry.yarnpkg.com/serve-favicon/-/serve-favicon-2.4.5.tgz#49d9a46863153a9240691c893d2b0e7d85d6d436" + integrity sha512-s7F8h2NrslMkG50KxvlGdj+ApSwaLex0vexuJ9iFf3GLTIp1ph/l1qZvRe9T9TJEYZgmq72ZwJ2VYiAEtChknw== + dependencies: + etag "~1.8.1" + fresh "0.5.2" + ms "2.0.0" + parseurl "~1.3.2" + safe-buffer "5.1.1" + +serve-static@1.12.6: + version "1.12.6" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.12.6.tgz#b973773f63449934da54e5beba5e31d9f4211577" + integrity sha1-uXN3P2NEmTTaVOW+ul4x2fQhFXc= + dependencies: + encodeurl "~1.0.1" + escape-html "~1.0.3" + parseurl "~1.3.2" + send "0.15.6" + +setprototypeof@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" + integrity sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ= + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +statuses@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + integrity sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4= + +type-is@~1.6.15, type-is@~1.6.16: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +utils-merge@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" + integrity sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg= + +vary@~1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +ws@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-4.1.0.tgz#a979b5d7d4da68bf54efe0408967c324869a7289" + integrity sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA== + dependencies: + async-limiter "~1.0.0" + safe-buffer "~5.1.0" diff --git a/packages/MPD.FM/yarn.nix b/packages/MPD.FM/yarn.nix new file mode 100644 index 0000000..50f0c65 --- /dev/null +++ b/packages/MPD.FM/yarn.nix @@ -0,0 +1,493 @@ +{ fetchurl, fetchgit, linkFarm, runCommandNoCC, gnutar }: rec { + offline_cache = linkFarm "offline" packages; + packages = [ + { + name = "accepts___accepts_1.3.7.tgz"; + path = fetchurl { + name = "accepts___accepts_1.3.7.tgz"; + url = "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz"; + sha1 = "531bc726517a3b2b41f850021c6cc15eaab507cd"; + }; + } + { + name = "array_flatten___array_flatten_1.1.1.tgz"; + path = fetchurl { + name = "array_flatten___array_flatten_1.1.1.tgz"; + url = "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz"; + sha1 = "9a5f699051b1e7073328f2a008968b64ea2955d2"; + }; + } + { + name = "async_limiter___async_limiter_1.0.1.tgz"; + path = fetchurl { + name = "async_limiter___async_limiter_1.0.1.tgz"; + url = "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz"; + sha1 = "dd379e94f0db8310b08291f9d64c3209766617fd"; + }; + } + { + name = "basic_auth___basic_auth_2.0.1.tgz"; + path = fetchurl { + name = "basic_auth___basic_auth_2.0.1.tgz"; + url = "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz"; + sha1 = "b998279bf47ce38344b4f3cf916d4679bbf51e3a"; + }; + } + { + name = "body_parser___body_parser_1.18.3.tgz"; + path = fetchurl { + name = "body_parser___body_parser_1.18.3.tgz"; + url = "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz"; + sha1 = "5b292198ffdd553b3a0f20ded0592b956955c8b4"; + }; + } + { + name = "bytes___bytes_3.0.0.tgz"; + path = fetchurl { + name = "bytes___bytes_3.0.0.tgz"; + url = "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz"; + sha1 = "d32815404d689699f85a4ea4fa8755dd13a96048"; + }; + } + { + name = "content_disposition___content_disposition_0.5.2.tgz"; + path = fetchurl { + name = "content_disposition___content_disposition_0.5.2.tgz"; + url = "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz"; + sha1 = "0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4"; + }; + } + { + name = "content_type___content_type_1.0.4.tgz"; + path = fetchurl { + name = "content_type___content_type_1.0.4.tgz"; + url = "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz"; + sha1 = "e138cc75e040c727b1966fe5e5f8c9aee256fe3b"; + }; + } + { + name = "cookie_parser___cookie_parser_1.4.5.tgz"; + path = fetchurl { + name = "cookie_parser___cookie_parser_1.4.5.tgz"; + url = "https://registry.yarnpkg.com/cookie-parser/-/cookie-parser-1.4.5.tgz"; + sha1 = "3e572d4b7c0c80f9c61daf604e4336831b5d1d49"; + }; + } + { + name = "cookie_signature___cookie_signature_1.0.6.tgz"; + path = fetchurl { + name = "cookie_signature___cookie_signature_1.0.6.tgz"; + url = "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz"; + sha1 = "e303a882b342cc3ee8ca513a79999734dab3ae2c"; + }; + } + { + name = "cookie___cookie_0.3.1.tgz"; + path = fetchurl { + name = "cookie___cookie_0.3.1.tgz"; + url = "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz"; + sha1 = "e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"; + }; + } + { + name = "cookie___cookie_0.4.0.tgz"; + path = fetchurl { + name = "cookie___cookie_0.4.0.tgz"; + url = "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz"; + sha1 = "beb437e7022b3b6d49019d088665303ebe9c14ba"; + }; + } + { + name = "debug___debug_2.6.9.tgz"; + path = fetchurl { + name = "debug___debug_2.6.9.tgz"; + url = "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz"; + sha1 = "5d128515df134ff327e90a4c93f4e077a536341f"; + }; + } + { + name = "depd___depd_1.1.2.tgz"; + path = fetchurl { + name = "depd___depd_1.1.2.tgz"; + url = "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz"; + sha1 = "9bcd52e14c097763e749b274c4346ed2e560b5a9"; + }; + } + { + name = "destroy___destroy_1.0.4.tgz"; + path = fetchurl { + name = "destroy___destroy_1.0.4.tgz"; + url = "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz"; + sha1 = "978857442c44749e4206613e37946205826abd80"; + }; + } + { + name = "ee_first___ee_first_1.1.1.tgz"; + path = fetchurl { + name = "ee_first___ee_first_1.1.1.tgz"; + url = "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz"; + sha1 = "590c61156b0ae2f4f0255732a158b266bc56b21d"; + }; + } + { + name = "encodeurl___encodeurl_1.0.2.tgz"; + path = fetchurl { + name = "encodeurl___encodeurl_1.0.2.tgz"; + url = "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz"; + sha1 = "ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"; + }; + } + { + name = "escape_html___escape_html_1.0.3.tgz"; + path = fetchurl { + name = "escape_html___escape_html_1.0.3.tgz"; + url = "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz"; + sha1 = "0258eae4d3d0c0974de1c169188ef0051d1d1988"; + }; + } + { + name = "etag___etag_1.8.1.tgz"; + path = fetchurl { + name = "etag___etag_1.8.1.tgz"; + url = "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz"; + sha1 = "41ae2eeb65efa62268aebfea83ac7d79299b0887"; + }; + } + { + name = "express___express_4.15.5.tgz"; + path = fetchurl { + name = "express___express_4.15.5.tgz"; + url = "https://registry.yarnpkg.com/express/-/express-4.15.5.tgz"; + sha1 = "670235ca9598890a5ae8170b83db722b842ed927"; + }; + } + { + name = "finalhandler___finalhandler_1.0.6.tgz"; + path = fetchurl { + name = "finalhandler___finalhandler_1.0.6.tgz"; + url = "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.6.tgz"; + sha1 = "007aea33d1a4d3e42017f624848ad58d212f814f"; + }; + } + { + name = "forwarded___forwarded_0.1.2.tgz"; + path = fetchurl { + name = "forwarded___forwarded_0.1.2.tgz"; + url = "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz"; + sha1 = "98c23dab1175657b8c0573e8ceccd91b0ff18c84"; + }; + } + { + name = "fresh___fresh_0.5.2.tgz"; + path = fetchurl { + name = "fresh___fresh_0.5.2.tgz"; + url = "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz"; + sha1 = "3d8cadd90d976569fa835ab1f8e4b23a105605a7"; + }; + } + { + name = "http_errors___http_errors_1.6.3.tgz"; + path = fetchurl { + name = "http_errors___http_errors_1.6.3.tgz"; + url = "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz"; + sha1 = "8b55680bb4be283a0b5bf4ea2e38580be1d9320d"; + }; + } + { + name = "iconv_lite___iconv_lite_0.4.23.tgz"; + path = fetchurl { + name = "iconv_lite___iconv_lite_0.4.23.tgz"; + url = "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz"; + sha1 = "297871f63be507adcfbfca715d0cd0eed84e9a63"; + }; + } + { + name = "inherits___inherits_2.0.3.tgz"; + path = fetchurl { + name = "inherits___inherits_2.0.3.tgz"; + url = "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz"; + sha1 = "633c2c83e3da42a502f52466022480f4208261de"; + }; + } + { + name = "ipaddr.js___ipaddr.js_1.4.0.tgz"; + path = fetchurl { + name = "ipaddr.js___ipaddr.js_1.4.0.tgz"; + url = "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.4.0.tgz"; + sha1 = "296aca878a821816e5b85d0a285a99bcff4582f0"; + }; + } + { + name = "media_typer___media_typer_0.3.0.tgz"; + path = fetchurl { + name = "media_typer___media_typer_0.3.0.tgz"; + url = "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz"; + sha1 = "8710d7af0aa626f8fffa1ce00168545263255748"; + }; + } + { + name = "merge_descriptors___merge_descriptors_1.0.1.tgz"; + path = fetchurl { + name = "merge_descriptors___merge_descriptors_1.0.1.tgz"; + url = "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz"; + sha1 = "b00aaa556dd8b44568150ec9d1b953f3f90cbb61"; + }; + } + { + name = "methods___methods_1.1.2.tgz"; + path = fetchurl { + name = "methods___methods_1.1.2.tgz"; + url = "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz"; + sha1 = "5529a4d67654134edcc5266656835b0f851afcee"; + }; + } + { + name = "mime_db___mime_db_1.45.0.tgz"; + path = fetchurl { + name = "mime_db___mime_db_1.45.0.tgz"; + url = "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz"; + sha1 = "cceeda21ccd7c3a745eba2decd55d4b73e7879ea"; + }; + } + { + name = "mime_types___mime_types_2.1.28.tgz"; + path = fetchurl { + name = "mime_types___mime_types_2.1.28.tgz"; + url = "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.28.tgz"; + sha1 = "1160c4757eab2c5363888e005273ecf79d2a0ecd"; + }; + } + { + name = "mime___mime_1.3.4.tgz"; + path = fetchurl { + name = "mime___mime_1.3.4.tgz"; + url = "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz"; + sha1 = "115f9e3b6b3daf2959983cb38f149a2d40eb5d53"; + }; + } + { + name = "morgan___morgan_1.9.1.tgz"; + path = fetchurl { + name = "morgan___morgan_1.9.1.tgz"; + url = "https://registry.yarnpkg.com/morgan/-/morgan-1.9.1.tgz"; + sha1 = "0a8d16734a1d9afbc824b99df87e738e58e2da59"; + }; + } + { + name = "mpd___mpd_1.3.0.tgz"; + path = fetchurl { + name = "mpd___mpd_1.3.0.tgz"; + url = "https://registry.yarnpkg.com/mpd/-/mpd-1.3.0.tgz"; + sha1 = "a9a0e028f6808e5594f76fa9f0c574ad86f0c0dd"; + }; + } + { + name = "ms___ms_2.0.0.tgz"; + path = fetchurl { + name = "ms___ms_2.0.0.tgz"; + url = "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz"; + sha1 = "5608aeadfc00be6c2901df5f9861788de0d597c8"; + }; + } + { + name = "negotiator___negotiator_0.6.2.tgz"; + path = fetchurl { + name = "negotiator___negotiator_0.6.2.tgz"; + url = "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz"; + sha1 = "feacf7ccf525a77ae9634436a64883ffeca346fb"; + }; + } + { + name = "on_finished___on_finished_2.3.0.tgz"; + path = fetchurl { + name = "on_finished___on_finished_2.3.0.tgz"; + url = "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz"; + sha1 = "20f1336481b083cd75337992a16971aa2d906947"; + }; + } + { + name = "on_headers___on_headers_1.0.2.tgz"; + path = fetchurl { + name = "on_headers___on_headers_1.0.2.tgz"; + url = "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz"; + sha1 = "772b0ae6aaa525c399e489adfad90c403eb3c28f"; + }; + } + { + name = "parseurl___parseurl_1.3.3.tgz"; + path = fetchurl { + name = "parseurl___parseurl_1.3.3.tgz"; + url = "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz"; + sha1 = "9da19e7bee8d12dff0513ed5b76957793bc2e8d4"; + }; + } + { + name = "path_to_regexp___path_to_regexp_0.1.7.tgz"; + path = fetchurl { + name = "path_to_regexp___path_to_regexp_0.1.7.tgz"; + url = "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz"; + sha1 = "df604178005f522f15eb4490e7247a1bfaa67f8c"; + }; + } + { + name = "proxy_addr___proxy_addr_1.1.5.tgz"; + path = fetchurl { + name = "proxy_addr___proxy_addr_1.1.5.tgz"; + url = "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.5.tgz"; + sha1 = "71c0ee3b102de3f202f3b64f608d173fcba1a918"; + }; + } + { + name = "qs___qs_6.5.0.tgz"; + path = fetchurl { + name = "qs___qs_6.5.0.tgz"; + url = "https://registry.yarnpkg.com/qs/-/qs-6.5.0.tgz"; + sha1 = "8d04954d364def3efc55b5a0793e1e2c8b1e6e49"; + }; + } + { + name = "qs___qs_6.5.2.tgz"; + path = fetchurl { + name = "qs___qs_6.5.2.tgz"; + url = "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz"; + sha1 = "cb3ae806e8740444584ef154ce8ee98d403f3e36"; + }; + } + { + name = "range_parser___range_parser_1.2.1.tgz"; + path = fetchurl { + name = "range_parser___range_parser_1.2.1.tgz"; + url = "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz"; + sha1 = "3cf37023d199e1c24d1a55b84800c2f3e6468031"; + }; + } + { + name = "raw_body___raw_body_2.3.3.tgz"; + path = fetchurl { + name = "raw_body___raw_body_2.3.3.tgz"; + url = "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz"; + sha1 = "1b324ece6b5706e153855bc1148c65bb7f6ea0c3"; + }; + } + { + name = "safe_buffer___safe_buffer_5.1.1.tgz"; + path = fetchurl { + name = "safe_buffer___safe_buffer_5.1.1.tgz"; + url = "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz"; + sha1 = "893312af69b2123def71f57889001671eeb2c853"; + }; + } + { + name = "safe_buffer___safe_buffer_5.1.2.tgz"; + path = fetchurl { + name = "safe_buffer___safe_buffer_5.1.2.tgz"; + url = "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz"; + sha1 = "991ec69d296e0313747d59bdfd2b745c35f8828d"; + }; + } + { + name = "safer_buffer___safer_buffer_2.1.2.tgz"; + path = fetchurl { + name = "safer_buffer___safer_buffer_2.1.2.tgz"; + url = "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz"; + sha1 = "44fa161b0187b9549dd84bb91802f9bd8385cd6a"; + }; + } + { + name = "send___send_0.15.6.tgz"; + path = fetchurl { + name = "send___send_0.15.6.tgz"; + url = "https://registry.yarnpkg.com/send/-/send-0.15.6.tgz"; + sha1 = "20f23a9c925b762ab82705fe2f9db252ace47e34"; + }; + } + { + name = "serve_favicon___serve_favicon_2.4.5.tgz"; + path = fetchurl { + name = "serve_favicon___serve_favicon_2.4.5.tgz"; + url = "https://registry.yarnpkg.com/serve-favicon/-/serve-favicon-2.4.5.tgz"; + sha1 = "49d9a46863153a9240691c893d2b0e7d85d6d436"; + }; + } + { + name = "serve_static___serve_static_1.12.6.tgz"; + path = fetchurl { + name = "serve_static___serve_static_1.12.6.tgz"; + url = "https://registry.yarnpkg.com/serve-static/-/serve-static-1.12.6.tgz"; + sha1 = "b973773f63449934da54e5beba5e31d9f4211577"; + }; + } + { + name = "setprototypeof___setprototypeof_1.0.3.tgz"; + path = fetchurl { + name = "setprototypeof___setprototypeof_1.0.3.tgz"; + url = "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz"; + sha1 = "66567e37043eeb4f04d91bd658c0cbefb55b8e04"; + }; + } + { + name = "setprototypeof___setprototypeof_1.1.0.tgz"; + path = fetchurl { + name = "setprototypeof___setprototypeof_1.1.0.tgz"; + url = "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz"; + sha1 = "d0bd85536887b6fe7c0d818cb962d9d91c54e656"; + }; + } + { + name = "statuses___statuses_1.5.0.tgz"; + path = fetchurl { + name = "statuses___statuses_1.5.0.tgz"; + url = "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz"; + sha1 = "161c7dac177659fd9811f43771fa99381478628c"; + }; + } + { + name = "statuses___statuses_1.3.1.tgz"; + path = fetchurl { + name = "statuses___statuses_1.3.1.tgz"; + url = "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz"; + sha1 = "faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e"; + }; + } + { + name = "type_is___type_is_1.6.18.tgz"; + path = fetchurl { + name = "type_is___type_is_1.6.18.tgz"; + url = "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz"; + sha1 = "4e552cd05df09467dcbc4ef739de89f2cf37c131"; + }; + } + { + name = "unpipe___unpipe_1.0.0.tgz"; + path = fetchurl { + name = "unpipe___unpipe_1.0.0.tgz"; + url = "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz"; + sha1 = "b2bf4ee8514aae6165b4817829d21b2ef49904ec"; + }; + } + { + name = "utils_merge___utils_merge_1.0.0.tgz"; + path = fetchurl { + name = "utils_merge___utils_merge_1.0.0.tgz"; + url = "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz"; + sha1 = "0294fb922bb9375153541c4f7096231f287c8af8"; + }; + } + { + name = "vary___vary_1.1.2.tgz"; + path = fetchurl { + name = "vary___vary_1.1.2.tgz"; + url = "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz"; + sha1 = "2299f02c6ded30d4a5961b0b9f74524a18f634fc"; + }; + } + { + name = "ws___ws_4.1.0.tgz"; + path = fetchurl { + name = "ws___ws_4.1.0.tgz"; + url = "https://registry.yarnpkg.com/ws/-/ws-4.1.0.tgz"; + sha1 = "a979b5d7d4da68bf54efe0408967c324869a7289"; + }; + } + ]; +}