pifi 0.4.0 → 0.4.5.pre.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/INSTALL.md +10 -9
  3. data/README.md +46 -28
  4. data/bin/pifi +3 -1
  5. data/lib/pifi/controllers/application_controller.rb +0 -4
  6. data/lib/pifi/lib/config_getter.rb +1 -1
  7. data/lib/pifi/lib/player.rb +4 -3
  8. data/lib/pifi/public/asset-manifest.json +18 -18
  9. data/lib/pifi/public/assets/logo80.png +0 -0
  10. data/lib/pifi/public/index.html +1 -1
  11. data/lib/pifi/public/locales/en/translation.json +18 -16
  12. data/lib/pifi/public/locales/fr-FR/translation.json +23 -2
  13. data/lib/pifi/public/locales/nl-NL/translation.json +23 -2
  14. data/lib/pifi/public/locales/pl-PL/translation.json +28 -0
  15. data/lib/pifi/public/locales/pt-BR/translation.json +17 -15
  16. data/lib/pifi/public/precache-manifest.2861d7ff1c094f4f7704d9f5f30ff5e9.js +34 -0
  17. data/lib/pifi/public/service-worker.js +1 -1
  18. data/lib/pifi/public/static/css/2.d34346ea.chunk.css +2 -0
  19. data/lib/pifi/public/static/css/2.d34346ea.chunk.css.map +1 -0
  20. data/lib/pifi/public/static/css/main.221e80d3.chunk.css +2 -0
  21. data/lib/pifi/public/static/css/main.221e80d3.chunk.css.map +1 -0
  22. data/lib/pifi/public/static/js/2.2b05662c.chunk.js +3 -0
  23. data/lib/pifi/public/static/js/{2.df3b2c7e.chunk.js.LICENSE → 2.2b05662c.chunk.js.LICENSE.txt} +44 -51
  24. data/lib/pifi/public/static/js/2.2b05662c.chunk.js.map +1 -0
  25. data/lib/pifi/public/static/js/main.6b4db225.chunk.js +2 -0
  26. data/lib/pifi/public/static/js/main.6b4db225.chunk.js.map +1 -0
  27. data/lib/pifi/public/static/js/{runtime-main.f04a0f25.js → runtime-main.5aae5a31.js} +1 -1
  28. data/lib/pifi/public/static/js/{runtime-main.f04a0f25.js.map → runtime-main.5aae5a31.js.map} +1 -1
  29. data/lib/pifi/version.rb +1 -1
  30. metadata +20 -18
  31. data/lib/pifi/public/precache-manifest.3ca9784793937217e35f314e19179939.js +0 -34
  32. data/lib/pifi/public/static/css/2.5dbdccff.chunk.css +0 -2
  33. data/lib/pifi/public/static/css/2.5dbdccff.chunk.css.map +0 -1
  34. data/lib/pifi/public/static/css/main.58eef733.chunk.css +0 -2
  35. data/lib/pifi/public/static/css/main.58eef733.chunk.css.map +0 -1
  36. data/lib/pifi/public/static/js/2.df3b2c7e.chunk.js +0 -3
  37. data/lib/pifi/public/static/js/2.df3b2c7e.chunk.js.map +0 -1
  38. data/lib/pifi/public/static/js/main.58e602f6.chunk.js +0 -2
  39. data/lib/pifi/public/static/js/main.58e602f6.chunk.js.map +0 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 48502aa7e4e58ec66c3d6d7199785ff677f4095832c862be9fdf864251ba36b7
4
- data.tar.gz: ffbda48822f41aae2d0b7fd2397c7e25ef42beeb605d854e0eb09f8efda0762b
3
+ metadata.gz: c1586e58b5e0def063d3df99eab16a5946ec861cd366116094695c6f03f161c8
4
+ data.tar.gz: fc3c345f44d062e8874c48b2b394308d3820c4b5a6840301d1d6751bebf4fde3
5
5
  SHA512:
6
- metadata.gz: 28ca836a002b6f9430e1aafb2f86a8de95889ceb4d57ddab2bee4497bef447661d93a7d6aa57681e63a0fdf323536a6944d26fc040355098d6b3c04e976eeafc
7
- data.tar.gz: 121c9a81d1632971aa14b02e6a84e7511979936984c5e7f88b7365d7517de2fd06b100762c826890c0ec4e438442cd52602a177b5f4d2030be84eb68cda8a94f
6
+ metadata.gz: dade51eab47a8e6f2a14c937540328b73b559739b4d1e6079738edbdb1d7013bdd70cda5a965916b921b3759db5cc2b1ee6de7aa1b54fb6eeab5d62f30109d18
7
+ data.tar.gz: 810150856ea5eacfa3792b6da7c1bba3e4a41db26ef770b94bedd22939d023325d010b0a802bc9e4b992dfa06d8d3ccf91fb74e7fa576d8549985f323fb25164
data/INSTALL.md CHANGED
@@ -8,29 +8,30 @@ On Raspbian:
8
8
  $ sudo apt install ruby-full mpd
9
9
  ```
10
10
 
11
- 2. _If you haven't yet,_ configure MPD, start and enable it:
11
+ 2. Start and enable MPD:
12
12
 
13
13
  ```
14
- $ sudo -e /etc/mpd.conf
15
- $ sudo systemctl start mpd && sudo systemctl enable mpd
14
+ $ sudo systemctl enable --now mpd
16
15
  ```
17
16
 
17
+ _In the case you need to configure MPD, [check its documentation](https://www.musicpd.org/doc/html/user.html#configuration)._
18
+
18
19
  3. Install PiFi:
19
20
 
20
21
  ```
21
22
  $ sudo gem install pifi --no-document
22
23
  ```
23
24
 
24
- 4. To run PiFi, you'll need a list of radios at `/etc/pifi/streams.json`. Paste this for now:
25
+ 4. You'll need a list of radios at `/etc/pifi/streams.json`. Paste this for now:
25
26
 
26
27
  ```
27
28
  $ sudo mkdir -p /etc/pifi
28
29
  $ sudo wget https://raw.githubusercontent.com/rccavalcanti/pifi-radio/master/docs/streams.json.sample -O /etc/pifi/streams.json
29
30
  ```
30
31
 
31
- Later, you can edit that JSON file [as described here](README.md#list-of-streams).
32
+ _Later, you can edit that list [as described here](README.md#list-of-streams)._
32
33
 
33
- 5. If the MPD server is on another host or a non-default port, you'll need to place a configuration file.
34
+ 5. If the MPD server is on another host or a non-default port, you'll need a configuration file.
34
35
 
35
36
  Download a sample and edit [following the documentation](README.md#pifi-configuration):
36
37
 
@@ -39,13 +40,13 @@ $ sudo wget https://raw.githubusercontent.com/rccavalcanti/pifi-radio/master/doc
39
40
  $ sudo -e /etc/pifi/config.json
40
41
  ```
41
42
 
42
- **Done!** You can now run PiFi with `pifi` and reach it at `http://DEVICE_IP:3000`. Type `pifi -h` to check the options available.
43
+ **Done!** You can now run PiFi with `pifi` and reach it at `http://DEVICE_IP:3000`.
43
44
 
44
45
  ## Running at system boot and as other user
45
46
 
46
- It makes sense to run PiFi as a less-privileged user (such as `www-data`). You may also want it to autostart on boot. For that:
47
+ It makes sense to run PiFi as a different user, such as `www-data`. You may also want it to autostart on boot. For that you can use a systemd service.
47
48
 
48
- 1. Download the systemd service.
49
+ 1. Download the service sample.
49
50
 
50
51
  ```
51
52
  $ sudo wget https://raw.githubusercontent.com/rccavalcanti/pifi-radio/master/docs/pifi.service.sample -O /etc/systemd/system/pifi.service
data/README.md CHANGED
@@ -11,10 +11,14 @@
11
11
  - [Some features](#some-features)
12
12
  - [Demo](#demo)
13
13
  - [Installation](#installation)
14
+ - [Updating](#updating)
14
15
  - [Configuration](#configuration)
15
16
  - [List of streams](#list-of-streams)
16
17
  - [PiFi configuration](#pifi-configuration)
18
+ - [Usage](#usage)
19
+ - [Help me translate](#help-me-translate)
17
20
  - [Credits](#credits)
21
+ - [Buy me a coffee](#buy-me-a-coffee)
18
22
  - [License](#license)
19
23
 
20
24
  ## Meet PiFi Radio
@@ -31,7 +35,7 @@ PiFi is an interface for MPD, so it has some advantages compared to other soluti
31
35
 
32
36
  - Responsive interface for phones, tablets and desktops.
33
37
  - Display stations clearly. No URLs or weird names.
34
- - Themes, dark and light.
38
+ - Dark and light themes.
35
39
  - Easily search your radios.
36
40
  - Centralized list of stations. You get the same radios on every device.
37
41
  - Make some radios to be offered only to certain IPs. A use case for this is if there are tons of stations that only you listen and you don't want to pollute everyone else's list.
@@ -52,28 +56,16 @@ PiFi is an interface for MPD, so it has some advantages compared to other soluti
52
56
 
53
57
  While PiFi was imagined for the Pi, it should run on any computer with Ruby and MPD.
54
58
 
55
- Install it with:
59
+ [Check the installation guide](INSTALL.md).
56
60
 
57
- ```
58
- $ sudo gem install pifi --no-document
59
- ```
60
-
61
- Place a list of streams at `/etc/pifi/streams.json`:
62
-
63
- ```
64
- $ sudo mkdir -p /etc/pifi
65
- $ sudo wget https://raw.githubusercontent.com/rccavalcanti/pifi-radio/master/docs/streams.json.sample -O /etc/pifi/streams.json
66
- ```
61
+ ## Updating
67
62
 
68
- Make sure MPD is running and start PiFi:
63
+ Run:
69
64
 
70
65
  ```
71
- $ sudo systemctl start mpd
72
- $ pifi
66
+ $ sudo gem update pifi --no-document
73
67
  ```
74
68
 
75
- For more detailed steps, [check the installation guide](INSTALL.md).
76
-
77
69
  ## Configuration
78
70
 
79
71
  ### List of streams
@@ -109,13 +101,13 @@ The path is `/etc/pifi/config.json` and these are the options:
109
101
 
110
102
  | Key | Default | Description |
111
103
  | ------------------- | ------------------------ | ----------------------------------------------------------------------------------------------------------------- |
112
- | `mpd_host` | `127.0.0.1` | MPD host. |
113
- | `mpd_port` | `6600` | MPD port. |
114
- | `mpd_password` | `""` (none) | MPD password. |
115
- | `streams_path` | `/etc/pifi/streams.json` | Path to the JSON file containing the streams. |
116
- | `streams_path_priv` | `""` (none) | Path to JSON file containing additional streams. These will be shown only to the devices listed on `special_ips`. |
117
- | `special_ips` | `""` (none) | The IPs of the devices to show additional streams. |
118
- | `serve_static` | `true` | If we should serve static resources. Set it to `false` if your web server is already doing it. |
104
+ | `mpd_host` | `"127.0.0.1"` | MPD host. |
105
+ | `mpd_port` | `6600` | MPD port. |
106
+ | `mpd_password` | `""` (none) | MPD password. |
107
+ | `streams_path` | `"/etc/pifi/streams.json"` | Path to the JSON file containing the streams. |
108
+ | `streams_path_priv` | `""` (none) | Path to JSON file containing additional streams. These will be shown only to the devices listed on `special_ips`. |
109
+ | `special_ips` | `[]` (none) | The IPs of the devices to show additional streams. Example: `["10.0.0.1", "10.0.0.2"]` |
110
+ | `serve_static` | `true` | If we should serve static resources. Set it to `false` if your web server is already doing it. |
119
111
 
120
112
  If you want to change any of these options, download the sample file and edit it to your needs:
121
113
 
@@ -135,14 +127,40 @@ PiFi can be run:
135
127
 
136
128
  On your mobile browser, I suggest you add PiFi Radio to your home screen, for easier access.
137
129
 
130
+ ## Help me translate
131
+
132
+ You can help me adding a new language to PiFi or improving an existing translation. [The translation files are placed here.](https://github.com/rccavalcanti/pifi-radio/tree/master/frontend/public/locales)
133
+
134
+ ### Improving an existing translation
135
+
136
+ The default language for PiFi is English, so you should use it as a reference.
137
+
138
+ 1. Open [the translation file](https://github.com/rccavalcanti/pifi-radio/tree/master/frontend/public/locales) and [the English file](https://github.com/rccavalcanti/pifi-radio/blob/master/frontend/public/locales/en/translation.json).
139
+ 2. Fill empty strings and fix any bad translations.
140
+ 3. Send a pull request.
141
+
142
+ ### Adding a new language
143
+
144
+ 1. Copy the `en` folder, renaming it to the new language code (e.g. `es-ES`).
145
+ 2. On `translation.json`, translate the strings. If you aren't sure of some, please make them empty.
146
+ 3. Send a pull request.
147
+
138
148
  ## Credits
139
149
 
140
- - Translation fr-fr: Francis Chavanon "rimeno"
141
- - Translation nl-nl: Heimen Stoffels "Vistaus"
150
+ - fr-fr: Francis Chavanon "rimeno"
151
+ - pl-pl: "Struart88"
152
+ - nl-nl: Heimen Stoffels "Vistaus"
153
+
142
154
  - Icon made by [iconixar](https://www.flaticon.com/authors/iconixar) from [www.flaticon.com](https://www.flaticon.com/), licensed by [Flaticon Basic License](docs/icon/license.pdf).
143
155
 
156
+ ## Buy me a coffee
157
+
158
+ If you find PiFi useful, you can show your support here:
159
+
160
+ <a href="https://www.buymeacoffee.com/rafaelc" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/default-orange.png" alt="Buy Me A Coffee" width="200" ></a>
161
+
144
162
  ## License
145
163
 
146
- Released under [GNU GPL v3](LICENSE).
164
+ Licensed under [GPLv3](LICENSE)
147
165
 
148
- Copyright 2017-2020 Rafael Cavalcanti <hi@rafaelc.org>
166
+ Copyright (C) 2017-2020 [Rafael Cavalcanti](https://rafaelc.org/)
data/bin/pifi CHANGED
@@ -1,5 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
+ # The supported, safe way
4
+ ENV["APP_ENV"] = "production" if ENV["APP_ENV"].nil?
5
+
3
6
  require "pifi"
4
7
  require "optimist"
5
8
 
@@ -22,5 +25,4 @@ rack_opts = {
22
25
  daemonize: cli_opts.daemonize
23
26
  }
24
27
 
25
- PiFi::ApplicationController.set :environment, :production
26
28
  Rack::Server.new(rack_opts).start
@@ -5,10 +5,6 @@ require "sinatra/base"
5
5
  module PiFi
6
6
  class ApplicationController < Sinatra::Base
7
7
  set :static, false
8
- configure :development do
9
- before { response.headers["Access-Control-Allow-Origin"] = "*" }
10
- end
11
-
12
8
  set ConfigGetter.new.config
13
9
  set :streams, Streams.new(settings.streams_path, settings.streams_path_priv)
14
10
  end
@@ -11,7 +11,7 @@ module PiFi
11
11
  "mpd_password" => "",
12
12
  "streams_path" => "/etc/pifi/streams.json",
13
13
  "streams_path_priv" => "",
14
- "special_ips" => "",
14
+ "special_ips" => [],
15
15
  "play_local" => false,
16
16
  "serve_static" => true
17
17
  }
@@ -46,8 +46,7 @@ module PiFi
46
46
 
47
47
  def change_vol(delta)
48
48
  raise ArgumentError, "Invalid argument" unless delta =~ /^[+-]\d{1,2}$/
49
- # We get @vol=-1 when PulseAudio sink is closed
50
- raise VolNaError if @vol < 0
49
+ raise VolNaError if @vol.nil?
51
50
 
52
51
  @mpd.send_command("volume", delta);
53
52
  # This is more up-to-date than @vol
@@ -146,7 +145,9 @@ module PiFi
146
145
  end
147
146
 
148
147
  def set_vol(vol)
149
- @vol = vol
148
+ # We get @vol=-1 when PulseAudio sink is closed and @vol=nil when MPD output
149
+ # is misconfigured. Let's make it all nil.
150
+ @vol = vol < 0 ? nil : vol
150
151
  end
151
152
 
152
153
  def set_con_mpd(con_mpd)
@@ -1,26 +1,26 @@
1
1
  {
2
2
  "files": {
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
- "runtime-main.js": "/static/js/runtime-main.f04a0f25.js",
7
- "runtime-main.js.map": "/static/js/runtime-main.f04a0f25.js.map",
8
- "static/css/2.5dbdccff.chunk.css": "/static/css/2.5dbdccff.chunk.css",
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",
3
+ "main.css": "/static/css/main.221e80d3.chunk.css",
4
+ "main.js": "/static/js/main.6b4db225.chunk.js",
5
+ "main.js.map": "/static/js/main.6b4db225.chunk.js.map",
6
+ "runtime-main.js": "/static/js/runtime-main.5aae5a31.js",
7
+ "runtime-main.js.map": "/static/js/runtime-main.5aae5a31.js.map",
8
+ "static/css/2.d34346ea.chunk.css": "/static/css/2.d34346ea.chunk.css",
9
+ "static/js/2.2b05662c.chunk.js": "/static/js/2.2b05662c.chunk.js",
10
+ "static/js/2.2b05662c.chunk.js.map": "/static/js/2.2b05662c.chunk.js.map",
11
11
  "index.html": "/index.html",
12
- "precache-manifest.3ca9784793937217e35f314e19179939.js": "/precache-manifest.3ca9784793937217e35f314e19179939.js",
12
+ "precache-manifest.2861d7ff1c094f4f7704d9f5f30ff5e9.js": "/precache-manifest.2861d7ff1c094f4f7704d9f5f30ff5e9.js",
13
13
  "service-worker.js": "/service-worker.js",
14
- "static/css/2.5dbdccff.chunk.css.map": "/static/css/2.5dbdccff.chunk.css.map",
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
- "static/media/player.scss": "/static/media/logo.91554ce9.svg"
14
+ "static/css/2.d34346ea.chunk.css.map": "/static/css/2.d34346ea.chunk.css.map",
15
+ "static/css/main.221e80d3.chunk.css.map": "/static/css/main.221e80d3.chunk.css.map",
16
+ "static/js/2.2b05662c.chunk.js.LICENSE.txt": "/static/js/2.2b05662c.chunk.js.LICENSE.txt",
17
+ "static/media/logo.svg": "/static/media/logo.91554ce9.svg"
18
18
  },
19
19
  "entrypoints": [
20
- "static/js/runtime-main.f04a0f25.js",
21
- "static/css/2.5dbdccff.chunk.css",
22
- "static/js/2.df3b2c7e.chunk.js",
23
- "static/css/main.58eef733.chunk.css",
24
- "static/js/main.58e602f6.chunk.js"
20
+ "static/js/runtime-main.5aae5a31.js",
21
+ "static/css/2.d34346ea.chunk.css",
22
+ "static/js/2.2b05662c.chunk.js",
23
+ "static/css/main.221e80d3.chunk.css",
24
+ "static/js/main.6b4db225.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.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>
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.d34346ea.chunk.css" rel="stylesheet"><link href="/static/css/main.221e80d3.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script>var isIE=window.document.documentMode,unsupportedMsg='<img src="/assets/logo80.png" class="mx-auto d-block my-5">';if(unsupportedMsg+='<h5 class="text-center my-5">This browser is not supported</h5>',isIE){var root=document.getElementById("root");root.innerHTML=unsupportedMsg,root.setAttribute("id","")}</script><script>!function(e){function r(r){for(var n,f,i=r[0],l=r[1],p=r[2],c=0,s=[];c<i.length;c++)f=i[c],Object.prototype.hasOwnProperty.call(o,f)&&o[f]&&s.push(o[f][0]),o[f]=0;for(n in l)Object.prototype.hasOwnProperty.call(l,n)&&(e[n]=l[n]);for(a&&a(r);s.length;)s.shift()();return u.push.apply(u,p||[]),t()}function t(){for(var e,r=0;r<u.length;r++){for(var t=u[r],n=!0,i=1;i<t.length;i++){var l=t[i];0!==o[l]&&(n=!1)}n&&(u.splice(r--,1),e=f(f.s=t[0]))}return e}var n={},o={1:0},u=[];function f(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,f),t.l=!0,t.exports}f.m=e,f.c=n,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(e,r){if(1&r&&(e=f(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(f.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)f.d(t,n,function(r){return e[r]}.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 i=this.webpackJsonppifi_frontend=this.webpackJsonppifi_frontend||[],l=i.push.bind(i);i.push=r,i=i.slice();for(var p=0;p<i.length;p++)r(i[p]);var a=l;t()}([])</script><script src="/static/js/2.2b05662c.chunk.js"></script><script src="/static/js/main.6b4db225.chunk.js"></script></body></html>
@@ -1,26 +1,28 @@
1
1
  {
2
+ "about": "About",
3
+ "cancel": "Cancel",
4
+ "close": "Close",
5
+ "coffee": "If you like PiFi Radio, you can show your support buying me a coffee.",
6
+ "disconnectedMPD": "Not connected to MPD",
7
+ "environment": "Environment",
8
+ "errorForbidden": "Forbidden request. Check MPD password and permissions.",
2
9
  "errorNetwork": "Not connected to PiFi server",
3
- "errorUnexpected": "An unexpected error occurred.",
4
10
  "errorNotFound": "The stream was not found.",
5
- "errorForbidden": "Forbidden request. Check MPD password and permissions.",
6
- "disconnectedMPD": "Not connected to MPD",
7
- "close": "Close",
8
- "ok": "OK",
9
- "cancel": "Cancel",
10
- "search": "Search...",
11
- "playing": "Playing",
12
- "stopped": "Stopped",
13
- "tunning": "Tunning...",
14
- "noStreams": "No stations available.",
15
- "settings": "Settings",
16
- "theme": "Theme",
11
+ "errorUnexpected": "An unexpected error occurred.",
12
+ "goToDocs": "Go to documentation",
17
13
  "language": "Language",
18
- "about": "About",
19
14
  "mpdHost": "MPD host",
20
15
  "mpdPort": "MPD port",
21
- "environment": "Environment",
22
- "version": "Version",
16
+ "noStreams": "No stations available.",
17
+ "ok": "OK",
18
+ "playing": "Playing",
23
19
  "playURL": "Play URL",
20
+ "search": "Search...",
21
+ "settings": "Settings",
22
+ "stopped": "Stopped",
23
+ "theme": "Theme",
24
24
  "tryingURL": "Trying to play URL...",
25
+ "tunning": "Tunning...",
26
+ "version": "Version",
25
27
  "volume": "Volume"
26
28
  }
@@ -1,7 +1,28 @@
1
1
  {
2
- "errorNetwork": "Pas de connexion",
2
+ "about": "",
3
+ "cancel": "",
4
+ "close": "",
5
+ "coffee": "",
3
6
  "disconnectedMPD": "Déconnecté de MPD",
7
+ "environment": "",
8
+ "errorForbidden": "",
9
+ "errorNetwork": "Pas de connexion",
10
+ "errorNotFound": "",
11
+ "errorUnexpected": "",
12
+ "goToDocs": "",
13
+ "language": "",
14
+ "mpdHost": "",
15
+ "mpdPort": "",
16
+ "noStreams": "",
17
+ "ok": "",
4
18
  "playing": "Lecture",
19
+ "playURL": "",
20
+ "search": "",
21
+ "settings": "",
5
22
  "stopped": "Arrêté",
6
- "tunning": "Mise en tampon…"
23
+ "theme": "",
24
+ "tryingURL": "",
25
+ "tunning": "Mise en tampon…",
26
+ "version": "",
27
+ "volume": ""
7
28
  }
@@ -1,7 +1,28 @@
1
1
  {
2
- "errorNetwork": "Geen verbinding",
2
+ "about": "",
3
+ "cancel": "",
4
+ "close": "",
5
+ "coffee": "",
3
6
  "disconnectedMPD": "Niet verbonden met MPD",
7
+ "environment": "",
8
+ "errorForbidden": "",
9
+ "errorNetwork": "Geen verbinding",
10
+ "errorNotFound": "",
11
+ "errorUnexpected": "",
12
+ "goToDocs": "",
13
+ "language": "",
14
+ "mpdHost": "",
15
+ "mpdPort": "",
16
+ "noStreams": "",
17
+ "ok": "",
4
18
  "playing": "Aan het afspelen",
19
+ "playURL": "",
20
+ "search": "",
21
+ "settings": "",
5
22
  "stopped": "Gestopt",
6
- "tunning": "Bezig met verbinden..."
23
+ "theme": "",
24
+ "tryingURL": "",
25
+ "tunning": "Bezig met verbinden...",
26
+ "version": "",
27
+ "volume": ""
7
28
  }
@@ -0,0 +1,28 @@
1
+ {
2
+ "about": "O projekcie",
3
+ "cancel": "Anuluj",
4
+ "close": "Zamknij",
5
+ "coffee": "",
6
+ "disconnectedMPD": "Nie połączono z MPD",
7
+ "environment": "Środowisko",
8
+ "errorForbidden": "Niedozwolone żądanie. Sprawdź hasło i uprawnienia MPD.",
9
+ "errorNetwork": "Nie połączono z serwerem PiFi",
10
+ "errorNotFound": "Strumień nie znaleziony.",
11
+ "errorUnexpected": "Nieoczekiwany błąd.",
12
+ "goToDocs": "",
13
+ "language": "Język",
14
+ "mpdHost": "MPD host",
15
+ "mpdPort": "MPD port",
16
+ "noStreams": "Brak dostępnych stacji.",
17
+ "ok": "OK",
18
+ "playing": "Odtwarzanie",
19
+ "playURL": "Odtwórz URL",
20
+ "search": "Szukaj...",
21
+ "settings": "Ustawienia",
22
+ "stopped": "Zatrzymano",
23
+ "theme": "Motyw",
24
+ "tryingURL": "Próba odtworzenia URL...",
25
+ "tunning": "Strojenie...",
26
+ "version": "Wersja",
27
+ "volume": "Głośność"
28
+ }
@@ -1,26 +1,28 @@
1
1
  {
2
+ "about": "Sobre",
3
+ "cancel": "Cancelar",
4
+ "close": "Fechar",
5
+ "coffee": "Se você gosta do PiFi Radio, pode mostrar seu apoio comprando-me um café.",
6
+ "disconnectedMPD": "Sem conexão ao MPD",
7
+ "environment": "Ambiente",
8
+ "errorForbidden": "Requisição não permitida. Verifique a senha do MPD e permissões.",
2
9
  "errorNetwork": "Sem conexão ao servidor PiFi",
3
- "errorUnexpected": "Um erro inesperado ocorreu.",
4
10
  "errorNotFound": "Não foi possível encontrar o stream.",
5
- "errorForbidden": "Requisição não permitida. Verifique a senha do MPD e permissões.",
6
- "disconnectedMPD": "Sem conexão ao MPD",
7
- "close": "Fechar",
11
+ "errorUnexpected": "Um erro inesperado ocorreu.",
12
+ "goToDocs": "Ver documentação",
13
+ "language": "Idioma",
14
+ "mpdHost": "Host do MPD",
15
+ "mpdPort": "Porta do MPD",
16
+ "noStreams": "Não há rádios disponíveis.",
8
17
  "ok": "OK",
9
- "cancel": "Cancelar",
10
- "search": "Buscar...",
11
18
  "playing": "Tocando",
12
- "stopped": "Parado",
13
- "tunning": "Sintonizando...",
14
- "noStreams": "Não há rádios disponíveis.",
15
19
  "playURL": "Tocar URL",
16
- "tryingURL": "Tentando tocar URL...",
20
+ "search": "Buscar...",
17
21
  "settings": "Ajustes",
22
+ "stopped": "Parado",
18
23
  "theme": "Tema",
19
- "language": "Idioma",
20
- "about": "Sobre",
21
- "mpdHost": "Host do MPD",
22
- "mpdPort": "Porta do MPD",
23
- "environment": "Ambiente",
24
+ "tryingURL": "Tentando tocar URL...",
25
+ "tunning": "Sintonizando...",
24
26
  "version": "Versão",
25
27
  "volume": "Volume"
26
28
  }