pifi 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +24 -47
  3. data/config.ru +1 -0
  4. data/lib/pifi.rb +1 -0
  5. data/lib/pifi/controllers/application_controller.rb +5 -3
  6. data/lib/pifi/controllers/index_controller.rb +1 -16
  7. data/lib/pifi/controllers/player_controller.rb +1 -1
  8. data/lib/pifi/controllers/streams_controller.rb +20 -0
  9. data/lib/pifi/lib/{streams_getter.rb → streams.rb} +8 -9
  10. data/lib/pifi/public/android-chrome-192x192.png +0 -0
  11. data/lib/pifi/public/android-chrome-512x512.png +0 -0
  12. data/lib/pifi/public/apple-touch-icon.png +0 -0
  13. data/lib/pifi/public/asset-manifest.json +26 -0
  14. data/lib/pifi/public/browserconfig.xml +1 -1
  15. data/lib/pifi/public/favicon-16x16.png +0 -0
  16. data/lib/pifi/public/favicon-32x32.png +0 -0
  17. data/lib/pifi/public/index.html +1 -0
  18. data/lib/pifi/public/locales/en/translation.json +19 -0
  19. data/lib/pifi/public/locales/fr-FR/translation.json +7 -0
  20. data/lib/pifi/public/locales/nl-NL/translation.json +7 -0
  21. data/lib/pifi/public/locales/pt-BR/translation.json +19 -0
  22. data/lib/pifi/public/manifest.json +19 -0
  23. data/lib/pifi/public/mstile-144x144.png +0 -0
  24. data/lib/pifi/public/mstile-150x150.png +0 -0
  25. data/lib/pifi/public/mstile-310x150.png +0 -0
  26. data/lib/pifi/public/mstile-310x310.png +0 -0
  27. data/lib/pifi/public/mstile-70x70.png +0 -0
  28. data/lib/pifi/public/precache-manifest.c6c8e4145c1ed2fcfcefd9d025331f85.js +34 -0
  29. data/lib/pifi/public/robots.txt +2 -0
  30. data/lib/pifi/public/service-worker.js +39 -0
  31. data/lib/pifi/public/static/css/2.5dbdccff.chunk.css +2 -0
  32. data/lib/pifi/public/static/css/2.5dbdccff.chunk.css.map +1 -0
  33. data/lib/pifi/public/static/css/main.a50e54d2.chunk.css +2 -0
  34. data/lib/pifi/public/static/css/main.a50e54d2.chunk.css.map +1 -0
  35. data/lib/pifi/public/static/js/2.2b057ab5.chunk.js +3 -0
  36. data/lib/pifi/public/static/js/2.2b057ab5.chunk.js.LICENSE +103 -0
  37. data/lib/pifi/public/static/js/2.2b057ab5.chunk.js.map +1 -0
  38. data/lib/pifi/public/static/js/main.54482466.chunk.js +2 -0
  39. data/lib/pifi/public/static/js/main.54482466.chunk.js.map +1 -0
  40. data/lib/pifi/public/static/js/runtime-main.f04a0f25.js +2 -0
  41. data/lib/pifi/public/static/js/runtime-main.f04a0f25.js.map +1 -0
  42. data/lib/pifi/public/static/media/logo.91554ce9.svg +1 -0
  43. data/lib/pifi/version.rb +3 -0
  44. metadata +28 -29
  45. data/lib/pifi/lib/lang_chooser.rb +0 -27
  46. data/lib/pifi/public/android-chrome-384x384.png +0 -0
  47. data/lib/pifi/public/css/app.css +0 -143
  48. data/lib/pifi/public/js/app.js +0 -298
  49. data/lib/pifi/public/js/lang/en-us.js +0 -19
  50. data/lib/pifi/public/js/lang/fr-fr.js +0 -19
  51. data/lib/pifi/public/js/lang/nl-nl.js +0 -19
  52. data/lib/pifi/public/js/lang/pt-br.js +0 -19
  53. data/lib/pifi/public/site.webmanifest +0 -19
  54. data/lib/pifi/public/vendor/css/bootstrap-theme.css +0 -587
  55. data/lib/pifi/public/vendor/css/bootstrap-theme.css.map +0 -1
  56. data/lib/pifi/public/vendor/css/bootstrap-theme.min.css +0 -6
  57. data/lib/pifi/public/vendor/css/bootstrap-theme.min.css.map +0 -1
  58. data/lib/pifi/public/vendor/css/bootstrap.css +0 -6757
  59. data/lib/pifi/public/vendor/css/bootstrap.css.map +0 -1
  60. data/lib/pifi/public/vendor/css/bootstrap.min.css +0 -6
  61. data/lib/pifi/public/vendor/css/bootstrap.min.css.map +0 -1
  62. data/lib/pifi/public/vendor/fonts/glyphicons-halflings-regular.eot +0 -0
  63. data/lib/pifi/public/vendor/fonts/glyphicons-halflings-regular.svg +0 -288
  64. data/lib/pifi/public/vendor/fonts/glyphicons-halflings-regular.ttf +0 -0
  65. data/lib/pifi/public/vendor/fonts/glyphicons-halflings-regular.woff +0 -0
  66. data/lib/pifi/public/vendor/fonts/glyphicons-halflings-regular.woff2 +0 -0
  67. data/lib/pifi/public/vendor/js/bootstrap.js +0 -2377
  68. data/lib/pifi/public/vendor/js/bootstrap.min.js +0 -7
  69. data/lib/pifi/public/vendor/js/jquery.min.js +0 -4
  70. data/lib/pifi/public/vendor/js/npm.js +0 -13
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9e438554830dd34a08a8bbd6c1b50147bd3a57fcd83375ff650ac2e250d13af5
4
- data.tar.gz: 5994a88287ab9c58f799cec839f7a2d84d5f2ba849002faba2475769176c6fe0
3
+ metadata.gz: d5f23359fd7fec0b731f4bcfa9ae43aa2b9beadf4285a0f9712669d467c228bb
4
+ data.tar.gz: 0f538b70d4ca73e0e4fc0cb311606771619f479e5b9808ff0856f91ad11a88c8
5
5
  SHA512:
6
- metadata.gz: fcdd705b344569802b03a03cc0447c8c0b2b6b1dbf2256ba01cf659f46ed2efc901537ea02cf02841610d613e584442c047589fc2a2609bb1fb3bd53327ee0ec
7
- data.tar.gz: 843cc7461a81904893dfc052451849eedf3aa36197ede2b2f6cc0dba60b97e6df3f697e9941f6b5f2088af3b14bfd0cf5c30f7f434ed5366a764dcfc4c3411a8
6
+ metadata.gz: 8eef993856b6ed226b168f64b5ec7a630ff64891d8870be6904637280fc1821bda4cd2169fe0822c35f52cf3655881d3e760039a3940b0482a7713499f22333b
7
+ data.tar.gz: 9ded257c363d169983a99eaa66d500aed7e8daead81af1d96a7f6c406fe024e0c89cd4475f062221b78c3beb607f9404d64186addba7e6fbd7cd83cb16df3dd5
data/README.md CHANGED
@@ -5,7 +5,6 @@ PiFi Radio: A MPD web client to listen to radio
5
5
  ## Table of contents
6
6
 
7
7
  - [Meet PiFi Radio](#meet-pifi-radio)
8
- - [What is PiFi Radio](#what-is-pifi-radio)
9
8
  - [Some features](#some-features)
10
9
  - [Demo](#demo)
11
10
  - [Installation](#installation)
@@ -17,53 +16,32 @@ PiFi Radio: A MPD web client to listen to radio
17
16
 
18
17
  ## Meet PiFi Radio
19
18
 
20
- ### What is PiFi Radio
19
+ PiFi Radio is a MPD web client to listen to radio.
21
20
 
22
- PiFi Radio is a minimalist MPD web client to listen to radio. In other words, it makes your Raspberry Pi play Internet radio, while you control from any device, such as your phone.
21
+ If you have no idea what this means... You install it on a device such as the Raspberry Pi or even your computer. Actually anything with a speaker. Then, you open your browser from anywhere (e.g. your phone) and it will play your favorite radio stations.
23
22
 
24
- As PiFi is just an interface for MPD, it has some advantages compared to other solutions, e.g. bluetooth or AirPlay. For example, the radio playback is completely independent from your phone. You can take calls, play videos, go to an area with poor WiFi signal, or even turn off your phone. Your Pi will still continue to play the radio you picked.
23
+ PiFi is an interface for MPD, so it has some advantages compared to other solutions, e.g. bluetooth or AirPlay. One of them is that the playback is completely independent from your phone. So you can continue to use it normally, play a video, lose connection or even turn it off, and your Pi will still continue to play the radio.
25
24
 
26
25
  [I started this project in early 2017. At that time, I wanted to configure Raspbian so my parents could listen to radio with ease, but couldn't find any good solution to it.](https://rafaelc.org/blog/the-motivation-for-pifi-radio/)
27
26
 
28
- Some of the goals of PiFi Radio were the following:
29
27
 
30
- - Easy for my parents to use.
31
-
32
- - Simple, straight-forward interface. Do the few things they need and in a clear way.
33
-
34
- - As fool-proof as possible. Don't show unnecessary options, minimize user interaction and try to predict what they want.
35
-
36
- - Display both available and current stations clearly. No URLs or weird names.
37
-
38
- - Multi-platform, targeting primarily mobile phones.
39
-
40
- - In local language.
41
-
42
- ### Some features
43
-
44
- Although PiFi tries to be minimal, there are some neat features, such as:
45
-
46
- - Radios can be organized in categories, if you wish.
47
-
48
- - You can select 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.
28
+ ## Some features
49
29
 
30
+ - Responsive interface for phones, tablets and desktops.
31
+ - Display stations clearly. No URLs or weird names.
32
+ - Easily search your radios.
33
+ - Themes.
34
+ - Straight-forward beautiful interface. Minimalist yet taking advantage of screen space for important information and controls.
35
+ - Centralized list of stations. You get the same radios on every device.
36
+ - 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.
37
+ - Organize your radios by categories.
50
38
  - Streaming URLs can be pasted directly from your web browser. Useful if you want to listen to a radio that was not previously added to the list.
51
-
52
- - If by mistake you choose the same station that is currently playing, the playback just continues normally.
53
-
54
- - Multiple people can use it at the same time.
55
-
56
- - It can be conveniently added to your phone home screen.
57
-
58
- - The app has two views [(playback controls and stations list)](#demo), and tries to show each one smartly so you tap less. For example, when you open PiFi and MPD is idle, the list of radios is shown, because you probably want to pick a station.
59
-
60
- - Besides radio, it has the "Random" button, that I added by request. Tapping it plays all the music in your MPD library in shuffle mode. To skip the current song, just press it again. That's the only library function available on the app. Think of that as a bonus, as library support is an after-thought on PiFi, and not its main purpose. [You can disable this button in the configuration.](#pifi-configuration)
61
-
62
- - PiFi is currently available in a few languages, and it's easy to translate to more.
39
+ - Multi-language.
40
+ - Usable by multiple people at the same time.
63
41
 
64
42
  ## Demo
65
43
 
66
- ![Video demo](docs/demo.gif)
44
+ Coming soon.
67
45
 
68
46
  ## Installation
69
47
 
@@ -72,7 +50,7 @@ While PiFi was imagined for the Pi, it should run on any computer with Ruby and
72
50
  Install it with:
73
51
 
74
52
  ```
75
- $ sudo gem install pifi --no-ri --no-rdoc
53
+ $ sudo gem install pifi --no-document
76
54
  ```
77
55
 
78
56
  Place a list of streams at `/etc/pifi/streams.json`:
@@ -124,16 +102,15 @@ It's now completely optional to have a configuration file for PiFi. You only nee
124
102
 
125
103
  The path is `/etc/pifi/config.json` and these are the options:
126
104
 
127
- | Key | Default | Description |
128
- | --------------- | ------------------------ | ----------------------------------------------------------------------------------------------------------------- |
129
- | `mpd_host` | `127.0.0.1` | MPD host. |
130
- | `mpd_port` | `6600` | MPD port. |
131
- | `mpd_password` | `""` (none) | MPD password. |
132
- | `streams_path` | `/etc/pifi/streams.json` | Path to the JSON file containing the streams. |
105
+ | Key | Default | Description |
106
+ | ------------------- | ------------------------ | ----------------------------------------------------------------------------------------------------------------- |
107
+ | `mpd_host` | `127.0.0.1` | MPD host. |
108
+ | `mpd_port` | `6600` | MPD port. |
109
+ | `mpd_password` | `""` (none) | MPD password. |
110
+ | `streams_path` | `/etc/pifi/streams.json` | Path to the JSON file containing the streams. |
133
111
  | `streams_path_priv` | `""` (none) | Path to JSON file containing additional streams. These will be shown only to the devices listed on `special_ips`. |
134
- | `special_ips` | `""` (none) | The IPs of the devices to show additional streams. |
135
- | `play_local` | `false` | Set it to `true` if you want PiFi to play songs from your local library. This shows the "Random" button. |
136
- | `serve_static` | `true` | If we should serve static resources. Set it to `false` if your web server is already doing it. |
112
+ | `special_ips` | `""` (none) | The IPs of the devices to show additional streams. |
113
+ | `serve_static` | `true` | If we should serve static resources. Set it to `false` if your web server is already doing it. |
137
114
 
138
115
  If you want to change any of these options, download the sample file and edit it to your needs:
139
116
 
data/config.ru CHANGED
@@ -2,3 +2,4 @@ require "pifi"
2
2
 
3
3
  map("/") { run PiFi::IndexController }
4
4
  map("/api/player") { run PiFi::PlayerController }
5
+ map("/api/streams") { run PiFi::StreamsController }
data/lib/pifi.rb CHANGED
@@ -1,2 +1,3 @@
1
1
  require "pifi/controllers/index_controller"
2
2
  require "pifi/controllers/player_controller"
3
+ require "pifi/controllers/streams_controller"
@@ -1,16 +1,18 @@
1
1
  require "pifi/lib/config_getter"
2
- require "pifi/lib/streams_getter"
2
+ require "pifi/lib/streams"
3
3
  require "sinatra/base"
4
4
 
5
5
  module PiFi
6
6
  class ApplicationController < Sinatra::Base
7
7
  set ConfigGetter.new.config
8
- set :streams, StreamsGetter.new(settings.streams_path, settings.streams_path_priv).streams
9
-
8
+ set :streams, Streams.new(settings.streams_path, settings.streams_path_priv)
10
9
  set :root, File.expand_path("../../", __FILE__)
11
10
 
12
11
  configure :production do
13
12
  set :static, settings.serve_static
14
13
  end
14
+ configure :development do
15
+ before { response.headers["Access-Control-Allow-Origin"] = "*" }
16
+ end
15
17
  end
16
18
  end
@@ -1,5 +1,4 @@
1
1
  require "pifi/controllers/application_controller"
2
- require "pifi/lib/lang_chooser"
3
2
 
4
3
  module PiFi
5
4
  class IndexController < ApplicationController
@@ -8,26 +7,12 @@ module PiFi
8
7
  settings.production? ? title : "[#{settings.environment.capitalize}] #{title}"
9
8
  end
10
9
 
11
- def special_ip?
12
- # Try to get remote IP if behind reverse-proxy
13
- ip = env["HTTP_X_FORWARDED_FOR"] || request.ip
14
- settings.special_ips.include?(ip)
15
- end
16
-
17
- def streams_set
18
- special_ip? ? settings.streams[:all] : settings.streams[:pub]
19
- end
20
-
21
- def lang
22
- LangChooser.new(env["HTTP_ACCEPT_LANGUAGE"]).lang
23
- end
24
-
25
10
  def play_local?
26
11
  settings.play_local
27
12
  end
28
13
 
29
14
  get "/" do
30
- erb :index
15
+ send_file File.join(settings.public_folder, 'index.html')
31
16
  end
32
17
  end
33
18
  end
@@ -9,7 +9,7 @@ module PiFi
9
9
  @@player
10
10
  end
11
11
 
12
- @@player = Player.new(settings.streams[:all],
12
+ @@player = Player.new(settings.streams.all,
13
13
  host = settings.mpd_host,
14
14
  port = settings.mpd_port,
15
15
  password = settings.mpd_password)
@@ -0,0 +1,20 @@
1
+ require "pifi/controllers/application_controller"
2
+
3
+ module PiFi
4
+ class StreamsController < ApplicationController
5
+ get "/" do
6
+ content_type :json
7
+ streams_set.transform_values { |v| v.empty? }.to_json
8
+ end
9
+
10
+ def special_ip?
11
+ # Try to get remote IP if behind reverse-proxy
12
+ ip = env["HTTP_X_FORWARDED_FOR"] || request.ip
13
+ settings.special_ips.include?(ip)
14
+ end
15
+
16
+ def streams_set
17
+ special_ip? ? settings.streams.all : settings.streams.pub
18
+ end
19
+ end
20
+ end
@@ -1,7 +1,7 @@
1
1
  require "pifi/lib/utils"
2
2
 
3
3
  module PiFi
4
- class StreamsGetter
4
+ class Streams
5
5
  include Utils
6
6
 
7
7
  def initialize(path_pub, path_priv="")
@@ -10,19 +10,18 @@ module PiFi
10
10
  check_paths
11
11
  end
12
12
 
13
- def streams
14
- @streams ||= parse_streams
13
+ def all
14
+ @all ||= pub.merge(priv)
15
15
  end
16
16
 
17
+ def pub
18
+ @pub ||= file_to_hash(@path_pub)
19
+ end
17
20
 
18
21
  private
19
22
 
20
- def parse_streams
21
- pub = file_to_hash(@path_pub)
22
- priv = @path_priv.empty? ? {} : file_to_hash(@path_priv)
23
- all = pub.merge(priv)
24
-
25
- {pub: pub, all: all}
23
+ def priv
24
+ @priv ||= @path_priv.empty? ? {} : file_to_hash(@path_priv)
26
25
  end
27
26
 
28
27
  def check_paths
Binary file
@@ -0,0 +1,26 @@
1
+ {
2
+ "files": {
3
+ "main.css": "/static/css/main.a50e54d2.chunk.css",
4
+ "main.js": "/static/js/main.54482466.chunk.js",
5
+ "main.js.map": "/static/js/main.54482466.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.2b057ab5.chunk.js": "/static/js/2.2b057ab5.chunk.js",
10
+ "static/js/2.2b057ab5.chunk.js.map": "/static/js/2.2b057ab5.chunk.js.map",
11
+ "index.html": "/index.html",
12
+ "precache-manifest.c6c8e4145c1ed2fcfcefd9d025331f85.js": "/precache-manifest.c6c8e4145c1ed2fcfcefd9d025331f85.js",
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.a50e54d2.chunk.css.map": "/static/css/main.a50e54d2.chunk.css.map",
16
+ "static/js/2.2b057ab5.chunk.js.LICENSE": "/static/js/2.2b057ab5.chunk.js.LICENSE",
17
+ "static/media/player.scss": "/static/media/logo.91554ce9.svg"
18
+ },
19
+ "entrypoints": [
20
+ "static/js/runtime-main.f04a0f25.js",
21
+ "static/css/2.5dbdccff.chunk.css",
22
+ "static/js/2.2b057ab5.chunk.js",
23
+ "static/css/main.a50e54d2.chunk.css",
24
+ "static/js/main.54482466.chunk.js"
25
+ ]
26
+ }
@@ -3,7 +3,7 @@
3
3
  <msapplication>
4
4
  <tile>
5
5
  <square150x150logo src="/mstile-150x150.png"/>
6
- <TileColor>#da532c</TileColor>
6
+ <TileColor>#2b5797</TileColor>
7
7
  </tile>
8
8
  </msapplication>
9
9
  </browserconfig>
Binary file
Binary file
@@ -0,0 +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,initial-scale=1"/><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 href="" rel="stylesheet" title="theme"><link href="/static/css/2.5dbdccff.chunk.css" rel="stylesheet"><link href="/static/css/main.a50e54d2.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.2b057ab5.chunk.js"></script><script src="/static/js/main.54482466.chunk.js"></script></body></html>
@@ -0,0 +1,19 @@
1
+ {
2
+ "errorNetwork": "Not connected to PiFi server",
3
+ "errorUnexpected": "An unexpected error occurred.",
4
+ "errorNotFound": "The stream was not found.",
5
+ "errorForbidden": "Error. Check your MPD password.",
6
+ "disconnectedMPD": "Not connected to MPD",
7
+ "close": "Close",
8
+ "search": "Search...",
9
+ "playing": "Playing",
10
+ "stopped": "Stopped",
11
+ "tunning": "Tunning...",
12
+ "noStreams": "No stations available.",
13
+ "language": "Language",
14
+ "theme": "Theme",
15
+ "settings": "Settings",
16
+ "playURL": "Play URL",
17
+ "tryingURL": "Trying to play URL...",
18
+ "volume": "Volume"
19
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "errorNetwork": "Pas de connexion",
3
+ "disconnectedMPD": "Déconnecté de MPD",
4
+ "playing": "Lecture",
5
+ "stopped": "Arrêté",
6
+ "tunning": "Mise en tampon…"
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "errorNetwork": "Geen verbinding",
3
+ "disconnectedMPD": "Niet verbonden met MPD",
4
+ "playing": "Aan het afspelen",
5
+ "stopped": "Gestopt",
6
+ "tunning": "Bezig met verbinden..."
7
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "errorNetwork": "Sem conexão ao servidor PiFi",
3
+ "errorUnexpected": "Um erro inesperado ocorreu.",
4
+ "errorNotFound": "Não foi possível encontrar o stream.",
5
+ "errorForbidden": "Erro. Verifique sua senha do MPD.",
6
+ "disconnectedMPD": "Sem conexão ao MPD",
7
+ "close": "Fechar",
8
+ "search": "Buscar...",
9
+ "playing": "Tocando",
10
+ "stopped": "Parado",
11
+ "tunning": "Sintonizando...",
12
+ "noStreams": "Não há rádios disponíveis.",
13
+ "language": "Idioma",
14
+ "theme": "Tema",
15
+ "settings": "Ajustes",
16
+ "playURL": "Tocar URL",
17
+ "tryingURL": "Tentando tocar URL...",
18
+ "volume": "Volume"
19
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "PiFi Radio",
3
+ "short_name": "PiFi Radio",
4
+ "icons": [
5
+ {
6
+ "src": "/android-chrome-192x192.png",
7
+ "sizes": "192x192",
8
+ "type": "image/png"
9
+ },
10
+ {
11
+ "src": "/android-chrome-512x512.png",
12
+ "sizes": "512x512",
13
+ "type": "image/png"
14
+ }
15
+ ],
16
+ "theme_color": "#375a7f",
17
+ "background_color": "#222222",
18
+ "display": "standalone"
19
+ }
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,34 @@
1
+ self.__precacheManifest = (self.__precacheManifest || []).concat([
2
+ {
3
+ "revision": "ddb46863b2b7f72ccfb1c141a6f582f6",
4
+ "url": "/index.html"
5
+ },
6
+ {
7
+ "revision": "f14520e468b4efcc311e",
8
+ "url": "/static/css/2.5dbdccff.chunk.css"
9
+ },
10
+ {
11
+ "revision": "5923c39aa02f7c4872e0",
12
+ "url": "/static/css/main.a50e54d2.chunk.css"
13
+ },
14
+ {
15
+ "revision": "f14520e468b4efcc311e",
16
+ "url": "/static/js/2.2b057ab5.chunk.js"
17
+ },
18
+ {
19
+ "revision": "19a6755ca1e5087f391e80db627b30f5",
20
+ "url": "/static/js/2.2b057ab5.chunk.js.LICENSE"
21
+ },
22
+ {
23
+ "revision": "5923c39aa02f7c4872e0",
24
+ "url": "/static/js/main.54482466.chunk.js"
25
+ },
26
+ {
27
+ "revision": "92793784c9eb98d269de",
28
+ "url": "/static/js/runtime-main.f04a0f25.js"
29
+ },
30
+ {
31
+ "revision": "91554ce9192c677ea07ca4d90d14ff42",
32
+ "url": "/static/media/logo.91554ce9.svg"
33
+ }
34
+ ]);
@@ -0,0 +1,2 @@
1
+ # https://www.robotstxt.org/robotstxt.html
2
+ User-agent: *