pifi 0.3.7 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/bin/pifi +3 -1
  4. data/config.ru +2 -1
  5. data/docs/install_tips.md +3 -3
  6. data/lib/pifi/controllers/application_controller.rb +4 -7
  7. data/lib/pifi/controllers/config_controller.rb +14 -0
  8. data/lib/pifi/controllers/static_controller.rb +15 -0
  9. data/lib/pifi/public/asset-manifest.json +11 -11
  10. data/lib/pifi/public/index.html +1 -1
  11. data/lib/pifi/public/locales/en/translation.json +10 -3
  12. data/lib/pifi/public/locales/pt-BR/translation.json +11 -4
  13. data/lib/pifi/public/{precache-manifest.d32d22242489630d8a8e892a5024d8f2.js → precache-manifest.3ca9784793937217e35f314e19179939.js} +9 -9
  14. data/lib/pifi/public/service-worker.js +1 -1
  15. data/lib/pifi/public/static/css/{main.6b591eab.chunk.css → main.58eef733.chunk.css} +1 -1
  16. data/lib/pifi/public/static/css/{main.6b591eab.chunk.css.map → main.58eef733.chunk.css.map} +1 -1
  17. data/lib/pifi/public/static/js/{2.f1675576.chunk.js → 2.df3b2c7e.chunk.js} +3 -3
  18. data/lib/pifi/public/static/js/{2.f1675576.chunk.js.LICENSE → 2.df3b2c7e.chunk.js.LICENSE} +0 -0
  19. data/lib/pifi/public/static/js/2.df3b2c7e.chunk.js.map +1 -0
  20. data/lib/pifi/public/static/js/main.58e602f6.chunk.js +2 -0
  21. data/lib/pifi/public/static/js/main.58e602f6.chunk.js.map +1 -0
  22. data/lib/pifi/version.rb +1 -1
  23. data/lib/pifi.rb +3 -1
  24. metadata +12 -11
  25. data/lib/pifi/controllers/index_controller.rb +0 -9
  26. data/lib/pifi/public/static/js/2.f1675576.chunk.js.map +0 -1
  27. data/lib/pifi/public/static/js/main.72828fad.chunk.js +0 -2
  28. data/lib/pifi/public/static/js/main.72828fad.chunk.js.map +0 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 163bd12b78b5a3e95dde3c14cbb407346d093a5df3530133e640877e9afc8dc4
4
- data.tar.gz: 58a2f0febe03b682b5b8bca794d6258783efdeaba8b4d0bc69a0fc56718ca216
3
+ metadata.gz: 48502aa7e4e58ec66c3d6d7199785ff677f4095832c862be9fdf864251ba36b7
4
+ data.tar.gz: ffbda48822f41aae2d0b7fd2397c7e25ef42beeb605d854e0eb09f8efda0762b
5
5
  SHA512:
6
- metadata.gz: f36c4c686445e5410e7b18da069443a234aa5e3e167524bfc783cdce39e77346bbdbe912378e44e23484f47ad1d2deeeb1b562d7416adcdbfc8da205b701ec5c
7
- data.tar.gz: b6563fa148a3c9ff26871750d27f0b53100cd6ab2b2d76a7e8a1baa2a7839104032bbfd92149545eb6035cdf06aa58415f8f067c30ab853d0169e8c5e47b5c86
6
+ metadata.gz: 28ca836a002b6f9430e1aafb2f86a8de95889ceb4d57ddab2bee4497bef447661d93a7d6aa57681e63a0fdf323536a6944d26fc040355098d6b3c04e976eeafc
7
+ data.tar.gz: 121c9a81d1632971aa14b02e6a84e7511979936984c5e7f88b7365d7517de2fd06b100762c826890c0ec4e438442cd52602a177b5f4d2030be84eb68cda8a94f
data/README.md CHANGED
@@ -89,7 +89,7 @@ To keep it simple, the list of streams is just a JSON file with key-value pairs,
89
89
  "Radio 2": "https://example.com/radio"
90
90
  }
91
91
 
92
- If you want to arrange the stations in categories, add a pair with the category name as the key and empty value, as shown below. This will add the headers "Talk radio" and "Classical" above each group of stations, [such as "España" in the demo](#demo).
92
+ If you want to arrange the stations in categories, add a pair with the category name as the key and empty value, as shown below. This will add the headers "Talk radio" and "Classical" above each group of stations, [such as "Spain" and "Christmas" in the demo](#demo).
93
93
 
94
94
  {
95
95
  "Talk radio": "",
data/bin/pifi CHANGED
@@ -4,7 +4,9 @@ require "pifi"
4
4
  require "optimist"
5
5
 
6
6
  cli_opts = Optimist::options do
7
- synopsis "PiFi Radio"
7
+ version "PiFi Radio v#{PiFi::VERSION}"
8
+ banner "PiFi - MPD web client to listen to radio"
9
+
8
10
  opt :port, "Define port", :default => 3000
9
11
  opt :host, "Define host", :default => "0.0.0.0"
10
12
  opt :daemonize, "Daemonize", :default => false
data/config.ru CHANGED
@@ -1,5 +1,6 @@
1
1
  require "pifi"
2
2
 
3
- map("/") { run PiFi::IndexController }
3
+ map("/") { run PiFi::StaticController }
4
4
  map("/api/player") { run PiFi::PlayerController }
5
5
  map("/api/streams") { run PiFi::StreamsController }
6
+ map("/api/config") { run PiFi::ConfigController }
data/docs/install_tips.md CHANGED
@@ -10,11 +10,11 @@ For this, you can install a web server, such as Nginx, Apache or Lighttpd, and s
10
10
 
11
11
  ## Serving static resources from your web server
12
12
 
13
- If you set your web server to reverse proxy PiFi, you may also use it to serve PiFi static assets. This possibly brings performance gains.
13
+ If your web server is reverse proxying PiFi, you may also use it to serve PiFi static assets. This can bring performance gains.
14
14
 
15
15
  On PiFi configuration, set `serve_static` to false.
16
16
 
17
- On your web server, the exact steps depend on your configuration. You will probably need to set the root of the virtual server to PiFi's static assets directory. This is `${PIFI_DIR}/lib/pifi/public`. Refer to the next section for tips on how to find your `${PIFI_DIR}` and to the documentation of your web server for details.
17
+ For configuring your web server, please refer to their documentation. In a nutshell, you'll make it look for the requested files in PiFi's public directory. This is `${PIFI_DIR}/lib/pifi/public`. The next section describes how to find `${PIFI_DIR}`.
18
18
 
19
19
  ## Finding PiFi directory
20
20
 
@@ -30,7 +30,7 @@ Note that the path contains both the Ruby version and the PiFi version. Thus, it
30
30
 
31
31
  The `pifi` command exposes most Rack CLI options, but you may want to access more advanced configurations from Thin (the application server PiFi uses).
32
32
 
33
- To achieve this, instead of invoking `pifi`, run `thin` and pass PiFi's `config.ru` and the `-e production` flag. The former is located at `${PIFI_DIR}/config.ru`.
33
+ To do this, instead of invoking `pifi`, run `thin` and pass PiFi's `config.ru` and the `-e production` flag. The former is located at `${PIFI_DIR}/config.ru`.
34
34
 
35
35
  For example, if you want to run PiFi on a socket instead of a port:
36
36
 
@@ -4,15 +4,12 @@ require "sinatra/base"
4
4
 
5
5
  module PiFi
6
6
  class ApplicationController < Sinatra::Base
7
- set ConfigGetter.new.config
8
- set :streams, Streams.new(settings.streams_path, settings.streams_path_priv)
9
- set :root, File.expand_path("../../", __FILE__)
10
-
11
- configure :production do
12
- set :static, settings.serve_static
13
- end
7
+ set :static, false
14
8
  configure :development do
15
9
  before { response.headers["Access-Control-Allow-Origin"] = "*" }
16
10
  end
11
+
12
+ set ConfigGetter.new.config
13
+ set :streams, Streams.new(settings.streams_path, settings.streams_path_priv)
17
14
  end
18
15
  end
@@ -0,0 +1,14 @@
1
+ require "pifi/controllers/application_controller"
2
+
3
+ module PiFi
4
+ class ConfigController < ApplicationController
5
+ get "/" do
6
+ content_type :json
7
+ { "mpd_host": settings.mpd_host,
8
+ "mpd_port": settings.mpd_port,
9
+ "environment": settings.environment,
10
+ "version": VERSION
11
+ }.to_json
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,15 @@
1
+ require "pifi/controllers/application_controller"
2
+
3
+ module PiFi
4
+ class StaticController < ApplicationController
5
+ set :root, File.expand_path("../../", __FILE__)
6
+ set :static, true
7
+ configure :production do
8
+ set :static, settings.serve_static
9
+ end
10
+
11
+ get "/" do
12
+ send_file File.join(settings.public_folder, 'index.html')
13
+ end
14
+ end
15
+ end
@@ -1,26 +1,26 @@
1
1
  {
2
2
  "files": {
3
- "main.css": "/static/css/main.6b591eab.chunk.css",
4
- "main.js": "/static/js/main.72828fad.chunk.js",
5
- "main.js.map": "/static/js/main.72828fad.chunk.js.map",
3
+ "main.css": "/static/css/main.58eef733.chunk.css",
4
+ "main.js": "/static/js/main.58e602f6.chunk.js",
5
+ "main.js.map": "/static/js/main.58e602f6.chunk.js.map",
6
6
  "runtime-main.js": "/static/js/runtime-main.f04a0f25.js",
7
7
  "runtime-main.js.map": "/static/js/runtime-main.f04a0f25.js.map",
8
8
  "static/css/2.5dbdccff.chunk.css": "/static/css/2.5dbdccff.chunk.css",
9
- "static/js/2.f1675576.chunk.js": "/static/js/2.f1675576.chunk.js",
10
- "static/js/2.f1675576.chunk.js.map": "/static/js/2.f1675576.chunk.js.map",
9
+ "static/js/2.df3b2c7e.chunk.js": "/static/js/2.df3b2c7e.chunk.js",
10
+ "static/js/2.df3b2c7e.chunk.js.map": "/static/js/2.df3b2c7e.chunk.js.map",
11
11
  "index.html": "/index.html",
12
- "precache-manifest.d32d22242489630d8a8e892a5024d8f2.js": "/precache-manifest.d32d22242489630d8a8e892a5024d8f2.js",
12
+ "precache-manifest.3ca9784793937217e35f314e19179939.js": "/precache-manifest.3ca9784793937217e35f314e19179939.js",
13
13
  "service-worker.js": "/service-worker.js",
14
14
  "static/css/2.5dbdccff.chunk.css.map": "/static/css/2.5dbdccff.chunk.css.map",
15
- "static/css/main.6b591eab.chunk.css.map": "/static/css/main.6b591eab.chunk.css.map",
16
- "static/js/2.f1675576.chunk.js.LICENSE": "/static/js/2.f1675576.chunk.js.LICENSE",
15
+ "static/css/main.58eef733.chunk.css.map": "/static/css/main.58eef733.chunk.css.map",
16
+ "static/js/2.df3b2c7e.chunk.js.LICENSE": "/static/js/2.df3b2c7e.chunk.js.LICENSE",
17
17
  "static/media/player.scss": "/static/media/logo.91554ce9.svg"
18
18
  },
19
19
  "entrypoints": [
20
20
  "static/js/runtime-main.f04a0f25.js",
21
21
  "static/css/2.5dbdccff.chunk.css",
22
- "static/js/2.f1675576.chunk.js",
23
- "static/css/main.6b591eab.chunk.css",
24
- "static/js/main.72828fad.chunk.js"
22
+ "static/js/2.df3b2c7e.chunk.js",
23
+ "static/css/main.58eef733.chunk.css",
24
+ "static/js/main.58e602f6.chunk.js"
25
25
  ]
26
26
  }
@@ -1 +1 @@
1
- <!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,user-scalable=no"/><meta name="description" content="MPD web client to listen to radio"/><link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"><link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png"><link rel="manifest" href="/manifest.json"><link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5"><meta name="apple-mobile-web-app-title" content="PiFi Radio"><meta name="application-name" content="PiFi Radio"><meta name="msapplication-TileColor" content="#2b5797"><meta name="theme-color" content="#375a7f"><title>PiFi Radio</title><link rel="preload" href="https://stackpath.bootstrapcdn.com/bootswatch/4.4.1/darkly/bootstrap.min.css" as="style"><link href="https://stackpath.bootstrapcdn.com/bootswatch/4.4.1/darkly/bootstrap.min.css" rel="stylesheet" title="theme"><link href="/static/css/2.5dbdccff.chunk.css" rel="stylesheet"><link href="/static/css/main.6b591eab.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script>!function(l){function e(e){for(var r,t,n=e[0],o=e[1],u=e[2],f=0,i=[];f<n.length;f++)t=n[f],Object.prototype.hasOwnProperty.call(a,t)&&a[t]&&i.push(a[t][0]),a[t]=0;for(r in o)Object.prototype.hasOwnProperty.call(o,r)&&(l[r]=o[r]);for(s&&s(e);i.length;)i.shift()();return c.push.apply(c,u||[]),p()}function p(){for(var e,r=0;r<c.length;r++){for(var t=c[r],n=!0,o=1;o<t.length;o++){var u=t[o];0!==a[u]&&(n=!1)}n&&(c.splice(r--,1),e=f(f.s=t[0]))}return e}var t={},a={1:0},c=[];function f(e){if(t[e])return t[e].exports;var r=t[e]={i:e,l:!1,exports:{}};return l[e].call(r.exports,r,r.exports,f),r.l=!0,r.exports}f.m=l,f.c=t,f.d=function(e,r,t){f.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},f.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},f.t=function(r,e){if(1&e&&(r=f(r)),8&e)return r;if(4&e&&"object"==typeof r&&r&&r.__esModule)return r;var t=Object.create(null);if(f.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:r}),2&e&&"string"!=typeof r)for(var n in r)f.d(t,n,function(e){return r[e]}.bind(null,n));return t},f.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return f.d(r,"a",r),r},f.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},f.p="/";var r=this.webpackJsonppifi_frontend=this.webpackJsonppifi_frontend||[],n=r.push.bind(r);r.push=e,r=r.slice();for(var o=0;o<r.length;o++)e(r[o]);var s=n;p()}([])</script><script src="/static/js/2.f1675576.chunk.js"></script><script src="/static/js/main.72828fad.chunk.js"></script></body></html>
1
+ <!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,user-scalable=no"/><meta name="description" content="MPD web client to listen to radio"/><link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"><link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png"><link rel="manifest" href="/manifest.json"><link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5"><meta name="apple-mobile-web-app-title" content="PiFi Radio"><meta name="application-name" content="PiFi Radio"><meta name="msapplication-TileColor" content="#2b5797"><meta name="theme-color" content="#375a7f"><title>PiFi Radio</title><link rel="preload" href="https://stackpath.bootstrapcdn.com/bootswatch/4.4.1/darkly/bootstrap.min.css" as="style"><link href="https://stackpath.bootstrapcdn.com/bootswatch/4.4.1/darkly/bootstrap.min.css" rel="stylesheet" title="theme"><link href="/static/css/2.5dbdccff.chunk.css" rel="stylesheet"><link href="/static/css/main.58eef733.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script>!function(l){function e(e){for(var r,t,n=e[0],o=e[1],u=e[2],f=0,i=[];f<n.length;f++)t=n[f],Object.prototype.hasOwnProperty.call(a,t)&&a[t]&&i.push(a[t][0]),a[t]=0;for(r in o)Object.prototype.hasOwnProperty.call(o,r)&&(l[r]=o[r]);for(s&&s(e);i.length;)i.shift()();return c.push.apply(c,u||[]),p()}function p(){for(var e,r=0;r<c.length;r++){for(var t=c[r],n=!0,o=1;o<t.length;o++){var u=t[o];0!==a[u]&&(n=!1)}n&&(c.splice(r--,1),e=f(f.s=t[0]))}return e}var t={},a={1:0},c=[];function f(e){if(t[e])return t[e].exports;var r=t[e]={i:e,l:!1,exports:{}};return l[e].call(r.exports,r,r.exports,f),r.l=!0,r.exports}f.m=l,f.c=t,f.d=function(e,r,t){f.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},f.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},f.t=function(r,e){if(1&e&&(r=f(r)),8&e)return r;if(4&e&&"object"==typeof r&&r&&r.__esModule)return r;var t=Object.create(null);if(f.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:r}),2&e&&"string"!=typeof r)for(var n in r)f.d(t,n,function(e){return r[e]}.bind(null,n));return t},f.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return f.d(r,"a",r),r},f.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},f.p="/";var r=this.webpackJsonppifi_frontend=this.webpackJsonppifi_frontend||[],n=r.push.bind(r);r.push=e,r=r.slice();for(var o=0;o<r.length;o++)e(r[o]);var s=n;p()}([])</script><script src="/static/js/2.df3b2c7e.chunk.js"></script><script src="/static/js/main.58e602f6.chunk.js"></script></body></html>
@@ -2,17 +2,24 @@
2
2
  "errorNetwork": "Not connected to PiFi server",
3
3
  "errorUnexpected": "An unexpected error occurred.",
4
4
  "errorNotFound": "The stream was not found.",
5
- "errorForbidden": "Error. Check your MPD password.",
5
+ "errorForbidden": "Forbidden request. Check MPD password and permissions.",
6
6
  "disconnectedMPD": "Not connected to MPD",
7
7
  "close": "Close",
8
+ "ok": "OK",
9
+ "cancel": "Cancel",
8
10
  "search": "Search...",
9
11
  "playing": "Playing",
10
12
  "stopped": "Stopped",
11
13
  "tunning": "Tunning...",
12
14
  "noStreams": "No stations available.",
13
- "language": "Language",
14
- "theme": "Theme",
15
15
  "settings": "Settings",
16
+ "theme": "Theme",
17
+ "language": "Language",
18
+ "about": "About",
19
+ "mpdHost": "MPD host",
20
+ "mpdPort": "MPD port",
21
+ "environment": "Environment",
22
+ "version": "Version",
16
23
  "playURL": "Play URL",
17
24
  "tryingURL": "Trying to play URL...",
18
25
  "volume": "Volume"
@@ -2,18 +2,25 @@
2
2
  "errorNetwork": "Sem conexão ao servidor PiFi",
3
3
  "errorUnexpected": "Um erro inesperado ocorreu.",
4
4
  "errorNotFound": "Não foi possível encontrar o stream.",
5
- "errorForbidden": "Erro. Verifique sua senha do MPD.",
5
+ "errorForbidden": "Requisição não permitida. Verifique a senha do MPD e permissões.",
6
6
  "disconnectedMPD": "Sem conexão ao MPD",
7
7
  "close": "Fechar",
8
+ "ok": "OK",
9
+ "cancel": "Cancelar",
8
10
  "search": "Buscar...",
9
11
  "playing": "Tocando",
10
12
  "stopped": "Parado",
11
13
  "tunning": "Sintonizando...",
12
14
  "noStreams": "Não há rádios disponíveis.",
13
- "language": "Idioma",
14
- "theme": "Tema",
15
- "settings": "Ajustes",
16
15
  "playURL": "Tocar URL",
17
16
  "tryingURL": "Tentando tocar URL...",
17
+ "settings": "Ajustes",
18
+ "theme": "Tema",
19
+ "language": "Idioma",
20
+ "about": "Sobre",
21
+ "mpdHost": "Host do MPD",
22
+ "mpdPort": "Porta do MPD",
23
+ "environment": "Ambiente",
24
+ "version": "Versão",
18
25
  "volume": "Volume"
19
26
  }
@@ -1,27 +1,27 @@
1
1
  self.__precacheManifest = (self.__precacheManifest || []).concat([
2
2
  {
3
- "revision": "bc20dda425f9e9dd18e6e1bb89604b85",
3
+ "revision": "81ebc5bb774faaae7d17591b69952587",
4
4
  "url": "/index.html"
5
5
  },
6
6
  {
7
- "revision": "4598f504823608b18ca4",
7
+ "revision": "4dec7de3ea193a3a008a",
8
8
  "url": "/static/css/2.5dbdccff.chunk.css"
9
9
  },
10
10
  {
11
- "revision": "fea01f458331dd1e0a08",
12
- "url": "/static/css/main.6b591eab.chunk.css"
11
+ "revision": "a2478e76e291814855e7",
12
+ "url": "/static/css/main.58eef733.chunk.css"
13
13
  },
14
14
  {
15
- "revision": "4598f504823608b18ca4",
16
- "url": "/static/js/2.f1675576.chunk.js"
15
+ "revision": "4dec7de3ea193a3a008a",
16
+ "url": "/static/js/2.df3b2c7e.chunk.js"
17
17
  },
18
18
  {
19
19
  "revision": "19a6755ca1e5087f391e80db627b30f5",
20
- "url": "/static/js/2.f1675576.chunk.js.LICENSE"
20
+ "url": "/static/js/2.df3b2c7e.chunk.js.LICENSE"
21
21
  },
22
22
  {
23
- "revision": "fea01f458331dd1e0a08",
24
- "url": "/static/js/main.72828fad.chunk.js"
23
+ "revision": "a2478e76e291814855e7",
24
+ "url": "/static/js/main.58e602f6.chunk.js"
25
25
  },
26
26
  {
27
27
  "revision": "92793784c9eb98d269de",
@@ -14,7 +14,7 @@
14
14
  importScripts("https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-sw.js");
15
15
 
16
16
  importScripts(
17
- "/precache-manifest.d32d22242489630d8a8e892a5024d8f2.js"
17
+ "/precache-manifest.3ca9784793937217e35f314e19179939.js"
18
18
  );
19
19
 
20
20
  self.addEventListener('message', (event) => {
@@ -1,2 +1,2 @@
1
1
  .navbar{position:-webkit-sticky!important;position:sticky!important;top:0;z-index:5}.player-controls{position:absolute!important;bottom:0;right:0;padding:2rem}.player{height:70vh;min-height:500px;width:400px;min-width:300px;background:url(/static/media/logo.91554ce9.svg) 50% no-repeat;background-size:120px}.loader{z-index:10;display:flex;justify-content:center;align-items:center;height:100vh}.streams{min-width:300px;width:450px}.streams__item{cursor:pointer}.streams__item.active{cursor:default}.streams__header{font-size:1.3rem;margin-top:1em;padding:.5rem 1.25rem}.list-group{margin-bottom:1rem!important}@media (max-width:750px){.list-group{margin-bottom:6rem!important}}.mini-player{max-width:600px;margin:auto;display:flex;align-items:center;justify-content:space-between;height:100%}.drawer{z-index:5!important;height:5rem;cursor:pointer;touch-action:none;-webkit-transition:all .25s ease-out;transition:all .25s ease-out}.drawer--open{height:100%;display:flex;justify-content:space-evenly;flex-direction:column;align-items:center}@media (max-width:750px){.body--drawer{overflow:hidden}}.backdrop{z-index:10;position:fixed;width:100%;height:100%;background-color:#222;opacity:0;visibility:hidden;-webkit-transition:all .2s ease;transition:all .2s ease;cursor:default;display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center}.backdrop--visible{opacity:.94;visibility:visible}.body--backdrop{overflow:hidden}.app-main{display:flex;justify-content:space-evenly}.app-main>.player{position:-webkit-sticky;position:sticky;top:4rem}.drawer{visibility:hidden}@media (max-width:750px){.drawer{visibility:visible}}@media (max-width:750px){.app-main>.player{display:none}}body{overflow-y:scroll}button[disabled]{cursor:default}.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
2
- /*# sourceMappingURL=main.6b591eab.chunk.css.map */
2
+ /*# sourceMappingURL=main.58eef733.chunk.css.map */
@@ -1 +1 @@
1
- {"version":3,"sources":["navBar.scss","playerControls.scss","player.scss","loader.scss","streams.scss","miniPlayer.scss","drawer.scss","../variables.scss","backdrop.scss","App.scss","index.scss"],"names":[],"mappings":"AAAA,QACE,iCAA2B,CAA3B,yBAA2B,CAC3B,KAAM,CACN,SAAU,CCHZ,iBACE,2BAA6B,CAC7B,QAAY,CACZ,OAAW,CACX,YAAa,CCJf,QACE,WAAY,CACZ,gBAAiB,CACjB,WAAY,CACZ,eAAgB,CAChB,6DACA,CAAA,qBAAsB,CCNxB,QACE,UAAW,CACX,YAAa,CACb,sBAAuB,CACvB,kBAAmB,CACnB,YAAa,CCHf,SACE,eAAgB,CAChB,WAAY,CACb,eAGC,cAAe,CADjB,sBAII,cAAe,CAChB,iBAID,gBAAiB,CACjB,cAAe,CACf,qBAAuB,CACxB,YAGC,4BAA8B,CAE9B,yBAHF,YAII,4BAA+C,CAElD,CC3BD,aACE,eAAgB,CAChB,WAAY,CACZ,YAAa,CACb,kBAAmB,CACnB,6BAA8B,CAC9B,WAAY,CCJd,QACE,mBAAqB,CACrB,WCHkB,CDIlB,cAAe,CACf,iBAAkB,CAClB,oCAAA,CAAA,4BAA8B,CAE9B,cACE,WAAY,CACZ,YAAa,CACb,4BAA6B,CAC7B,qBAAsB,CACtB,kBAAmB,CACpB,yBAKH,cAEI,eAAgB,CAEnB,CExBD,UACE,UAAW,CACX,cAAe,CACf,UAAW,CACX,WAAY,CACZ,qBAAyB,CACzB,SAAU,CACV,iBAAkB,CAClB,+BAAyB,CAAzB,uBAAyB,CACzB,cAAe,CACf,YAAa,CACb,qBAAsB,CACtB,sBAAuB,CACvB,kBAAmB,CACnB,iBAAkB,CAElB,mBACE,WAAa,CACb,kBAAmB,CACpB,gBAID,eAAgB,CCrBlB,UACE,YAAa,CACb,4BAA6B,CAC9B,kBAGC,uBAAgB,CAAhB,eAAgB,CAChB,QAAS,CACV,QAGC,iBAAkB,CAElB,yBAHF,QAII,kBAAmB,CAEtB,CAGC,yBADF,kBAEI,YAAa,CAEhB,CCxBD,KACE,iBAAkB,CACnB,iBAGC,cAAe,CAChB,UAGC,kBAAmB,CACnB,eAAgB,CAChB,sBAAuB","file":"main.6b591eab.chunk.css","sourcesContent":[".navbar {\n position: sticky !important;\n top: 0;\n z-index: 5;\n}\n",".player-controls {\n position: absolute !important;\n bottom: 0rem;\n right: 0rem;\n padding: 2rem;\n}\n",".player {\n height: 70vh;\n min-height: 500px;\n width: 400px;\n min-width: 300px;\n background: url('../logo.svg') center no-repeat;\n background-size: 120px;\n}\n",".loader {\n z-index: 10;\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100vh;\n}\n","@import '../variables.scss';\n\n.streams {\n min-width: 300px;\n width: 450px;\n}\n\n.streams__item {\n cursor: pointer;\n\n &.active {\n cursor: default;\n }\n}\n\n.streams__header {\n font-size: 1.3rem;\n margin-top: 1em;\n padding: 0.5rem 1.25rem;\n}\n\n.list-group {\n margin-bottom: 1rem !important;\n\n @media (max-width: $mobile-width) {\n margin-bottom: 1rem + $drawer-height !important; /* drawer */\n }\n}\n",".mini-player {\n max-width: 600px;\n margin: auto;\n display: flex;\n align-items: center;\n justify-content: space-between;\n height: 100%;\n}\n","@import '../variables.scss';\n\n.drawer {\n z-index: 5 !important;\n height: $drawer-height;\n cursor: pointer;\n touch-action: none; // don't scroll on touch\n transition: all 0.25s ease-out;\n\n &--open {\n height: 100%;\n display: flex;\n justify-content: space-evenly;\n flex-direction: column;\n align-items: center;\n }\n}\n\n// The media query is for the edge case of an open drawer and the\n// window resized past the breakpoint. This brings the scrollbar back.\n.body--drawer {\n @media (max-width: $mobile-width) {\n overflow: hidden;\n }\n}\n","$mobile-width: 750px;\n$drawer-height: 5rem;\n",".backdrop {\n z-index: 10;\n position: fixed;\n width: 100%;\n height: 100%;\n background-color: #222222;\n opacity: 0;\n visibility: hidden;\n transition: all 0.2s ease;\n cursor: default;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n text-align: center;\n\n &--visible {\n opacity: 0.94;\n visibility: visible;\n }\n}\n\n.body--backdrop {\n overflow: hidden;\n}\n","@import './variables.scss';\n\n.app-main {\n display: flex;\n justify-content: space-evenly;\n}\n\n.app-main > .player {\n position: sticky;\n top: 4rem; // we set this dinamically\n}\n\n.drawer {\n visibility: hidden;\n\n @media (max-width: $mobile-width) {\n visibility: visible;\n }\n}\n\n.app-main > .player {\n @media (max-width: $mobile-width) {\n display: none;\n }\n}\n","body {\n overflow-y: scroll; // so elements don't move if page fits view\n}\n\nbutton[disabled] {\n cursor: default;\n}\n\n.ellipsis {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n"]}
1
+ {"version":3,"sources":["navBar.scss","playerControls.scss","player.scss","loader.scss","streams.scss","miniPlayer.scss","drawer.scss","../variables.scss","backdrop.scss","App.scss","index.scss"],"names":[],"mappings":"AAAA,QACE,iCAA2B,CAA3B,yBAA2B,CAC3B,KAAM,CACN,SAAU,CCHZ,iBACE,2BAA6B,CAC7B,QAAY,CACZ,OAAW,CACX,YAAa,CCJf,QACE,WAAY,CACZ,gBAAiB,CACjB,WAAY,CACZ,eAAgB,CAChB,6DACA,CAAA,qBAAsB,CCNxB,QACE,UAAW,CACX,YAAa,CACb,sBAAuB,CACvB,kBAAmB,CACnB,YAAa,CCHf,SACE,eAAgB,CAChB,WAAY,CACb,eAGC,cAAe,CADjB,sBAII,cAAe,CAChB,iBAID,gBAAiB,CACjB,cAAe,CACf,qBAAuB,CACxB,YAGC,4BAA8B,CAE9B,yBAHF,YAII,4BAA+C,CAElD,CC3BD,aACE,eAAgB,CAChB,WAAY,CACZ,YAAa,CACb,kBAAmB,CACnB,6BAA8B,CAC9B,WAAY,CCJd,QACE,mBAAqB,CACrB,WCHkB,CDIlB,cAAe,CACf,iBAAkB,CAClB,oCAAA,CAAA,4BAA8B,CAE9B,cACE,WAAY,CACZ,YAAa,CACb,4BAA6B,CAC7B,qBAAsB,CACtB,kBAAmB,CACpB,yBAKH,cAEI,eAAgB,CAEnB,CExBD,UACE,UAAW,CACX,cAAe,CACf,UAAW,CACX,WAAY,CACZ,qBAAyB,CACzB,SAAU,CACV,iBAAkB,CAClB,+BAAyB,CAAzB,uBAAyB,CACzB,cAAe,CACf,YAAa,CACb,qBAAsB,CACtB,sBAAuB,CACvB,kBAAmB,CACnB,iBAAkB,CAElB,mBACE,WAAa,CACb,kBAAmB,CACpB,gBAID,eAAgB,CCrBlB,UACE,YAAa,CACb,4BAA6B,CAC9B,kBAGC,uBAAgB,CAAhB,eAAgB,CAChB,QAAS,CACV,QAGC,iBAAkB,CAElB,yBAHF,QAII,kBAAmB,CAEtB,CAGC,yBADF,kBAEI,YAAa,CAEhB,CCxBD,KACE,iBAAkB,CACnB,iBAGC,cAAe,CAChB,UAGC,kBAAmB,CACnB,eAAgB,CAChB,sBAAuB","file":"main.58eef733.chunk.css","sourcesContent":[".navbar {\n position: sticky !important;\n top: 0;\n z-index: 5;\n}\n",".player-controls {\n position: absolute !important;\n bottom: 0rem;\n right: 0rem;\n padding: 2rem;\n}\n",".player {\n height: 70vh;\n min-height: 500px;\n width: 400px;\n min-width: 300px;\n background: url('../logo.svg') center no-repeat;\n background-size: 120px;\n}\n",".loader {\n z-index: 10;\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100vh;\n}\n","@import '../variables.scss';\n\n.streams {\n min-width: 300px;\n width: 450px;\n}\n\n.streams__item {\n cursor: pointer;\n\n &.active {\n cursor: default;\n }\n}\n\n.streams__header {\n font-size: 1.3rem;\n margin-top: 1em;\n padding: 0.5rem 1.25rem;\n}\n\n.list-group {\n margin-bottom: 1rem !important;\n\n @media (max-width: $mobile-width) {\n margin-bottom: 1rem + $drawer-height !important; /* drawer */\n }\n}\n",".mini-player {\n max-width: 600px;\n margin: auto;\n display: flex;\n align-items: center;\n justify-content: space-between;\n height: 100%;\n}\n","@import '../variables.scss';\n\n.drawer {\n z-index: 5 !important;\n height: $drawer-height;\n cursor: pointer;\n touch-action: none; // don't scroll on touch\n transition: all 0.25s ease-out;\n\n &--open {\n height: 100%;\n display: flex;\n justify-content: space-evenly;\n flex-direction: column;\n align-items: center;\n }\n}\n\n// The media query is for the edge case of an open drawer and the\n// window resized past the breakpoint. This brings the scrollbar back.\n.body--drawer {\n @media (max-width: $mobile-width) {\n overflow: hidden;\n }\n}\n","$mobile-width: 750px;\n$drawer-height: 5rem;\n",".backdrop {\n z-index: 10;\n position: fixed;\n width: 100%;\n height: 100%;\n background-color: #222222;\n opacity: 0;\n visibility: hidden;\n transition: all 0.2s ease;\n cursor: default;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n text-align: center;\n\n &--visible {\n opacity: 0.94;\n visibility: visible;\n }\n}\n\n.body--backdrop {\n overflow: hidden;\n}\n","@import './variables.scss';\n\n.app-main {\n display: flex;\n justify-content: space-evenly;\n}\n\n.app-main > .player {\n position: sticky;\n top: 4rem; // we set this dynamically\n}\n\n.drawer {\n visibility: hidden;\n\n @media (max-width: $mobile-width) {\n visibility: visible;\n }\n}\n\n.app-main > .player {\n @media (max-width: $mobile-width) {\n display: none;\n }\n}\n","body {\n overflow-y: scroll; // so elements don't move if page fits view\n}\n\nbutton[disabled] {\n cursor: default;\n}\n\n.ellipsis {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n"]}