pifi 0.3.7 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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"]}