pifi 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +24 -47
- data/config.ru +1 -0
- data/lib/pifi.rb +1 -0
- data/lib/pifi/controllers/application_controller.rb +5 -3
- data/lib/pifi/controllers/index_controller.rb +1 -16
- data/lib/pifi/controllers/player_controller.rb +1 -1
- data/lib/pifi/controllers/streams_controller.rb +20 -0
- data/lib/pifi/lib/{streams_getter.rb → streams.rb} +8 -9
- data/lib/pifi/public/android-chrome-192x192.png +0 -0
- data/lib/pifi/public/android-chrome-512x512.png +0 -0
- data/lib/pifi/public/apple-touch-icon.png +0 -0
- data/lib/pifi/public/asset-manifest.json +26 -0
- data/lib/pifi/public/browserconfig.xml +1 -1
- data/lib/pifi/public/favicon-16x16.png +0 -0
- data/lib/pifi/public/favicon-32x32.png +0 -0
- data/lib/pifi/public/index.html +1 -0
- data/lib/pifi/public/locales/en/translation.json +19 -0
- data/lib/pifi/public/locales/fr-FR/translation.json +7 -0
- data/lib/pifi/public/locales/nl-NL/translation.json +7 -0
- data/lib/pifi/public/locales/pt-BR/translation.json +19 -0
- data/lib/pifi/public/manifest.json +19 -0
- data/lib/pifi/public/mstile-144x144.png +0 -0
- data/lib/pifi/public/mstile-150x150.png +0 -0
- data/lib/pifi/public/mstile-310x150.png +0 -0
- data/lib/pifi/public/mstile-310x310.png +0 -0
- data/lib/pifi/public/mstile-70x70.png +0 -0
- data/lib/pifi/public/precache-manifest.c6c8e4145c1ed2fcfcefd9d025331f85.js +34 -0
- data/lib/pifi/public/robots.txt +2 -0
- data/lib/pifi/public/service-worker.js +39 -0
- data/lib/pifi/public/static/css/2.5dbdccff.chunk.css +2 -0
- data/lib/pifi/public/static/css/2.5dbdccff.chunk.css.map +1 -0
- data/lib/pifi/public/static/css/main.a50e54d2.chunk.css +2 -0
- data/lib/pifi/public/static/css/main.a50e54d2.chunk.css.map +1 -0
- data/lib/pifi/public/static/js/2.2b057ab5.chunk.js +3 -0
- data/lib/pifi/public/static/js/2.2b057ab5.chunk.js.LICENSE +103 -0
- data/lib/pifi/public/static/js/2.2b057ab5.chunk.js.map +1 -0
- data/lib/pifi/public/static/js/main.54482466.chunk.js +2 -0
- data/lib/pifi/public/static/js/main.54482466.chunk.js.map +1 -0
- data/lib/pifi/public/static/js/runtime-main.f04a0f25.js +2 -0
- data/lib/pifi/public/static/js/runtime-main.f04a0f25.js.map +1 -0
- data/lib/pifi/public/static/media/logo.91554ce9.svg +1 -0
- data/lib/pifi/version.rb +3 -0
- metadata +28 -29
- data/lib/pifi/lib/lang_chooser.rb +0 -27
- data/lib/pifi/public/android-chrome-384x384.png +0 -0
- data/lib/pifi/public/css/app.css +0 -143
- data/lib/pifi/public/js/app.js +0 -298
- data/lib/pifi/public/js/lang/en-us.js +0 -19
- data/lib/pifi/public/js/lang/fr-fr.js +0 -19
- data/lib/pifi/public/js/lang/nl-nl.js +0 -19
- data/lib/pifi/public/js/lang/pt-br.js +0 -19
- data/lib/pifi/public/site.webmanifest +0 -19
- data/lib/pifi/public/vendor/css/bootstrap-theme.css +0 -587
- data/lib/pifi/public/vendor/css/bootstrap-theme.css.map +0 -1
- data/lib/pifi/public/vendor/css/bootstrap-theme.min.css +0 -6
- data/lib/pifi/public/vendor/css/bootstrap-theme.min.css.map +0 -1
- data/lib/pifi/public/vendor/css/bootstrap.css +0 -6757
- data/lib/pifi/public/vendor/css/bootstrap.css.map +0 -1
- data/lib/pifi/public/vendor/css/bootstrap.min.css +0 -6
- data/lib/pifi/public/vendor/css/bootstrap.min.css.map +0 -1
- data/lib/pifi/public/vendor/fonts/glyphicons-halflings-regular.eot +0 -0
- data/lib/pifi/public/vendor/fonts/glyphicons-halflings-regular.svg +0 -288
- data/lib/pifi/public/vendor/fonts/glyphicons-halflings-regular.ttf +0 -0
- data/lib/pifi/public/vendor/fonts/glyphicons-halflings-regular.woff +0 -0
- data/lib/pifi/public/vendor/fonts/glyphicons-halflings-regular.woff2 +0 -0
- data/lib/pifi/public/vendor/js/bootstrap.js +0 -2377
- data/lib/pifi/public/vendor/js/bootstrap.min.js +0 -7
- data/lib/pifi/public/vendor/js/jquery.min.js +0 -4
- 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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d5f23359fd7fec0b731f4bcfa9ae43aa2b9beadf4285a0f9712669d467c228bb
|
4
|
+
data.tar.gz: 0f538b70d4ca73e0e4fc0cb311606771619f479e5b9808ff0856f91ad11a88c8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
|
19
|
+
PiFi Radio is a MPD web client to listen to radio.
|
21
20
|
|
22
|
-
|
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
|
-
|
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
|
-
|
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
|
-
-
|
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
|
-
|
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-
|
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
|
128
|
-
|
|
129
|
-
| `mpd_host`
|
130
|
-
| `mpd_port`
|
131
|
-
| `mpd_password`
|
132
|
-
| `streams_path`
|
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`
|
135
|
-
| `
|
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
data/lib/pifi.rb
CHANGED
@@ -1,16 +1,18 @@
|
|
1
1
|
require "pifi/lib/config_getter"
|
2
|
-
require "pifi/lib/
|
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,
|
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
|
-
|
15
|
+
send_file File.join(settings.public_folder, 'index.html')
|
31
16
|
end
|
32
17
|
end
|
33
18
|
end
|
@@ -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
|
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
|
14
|
-
@
|
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
|
21
|
-
|
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
|
Binary file
|
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
|
+
}
|
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,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
|
+
]);
|