nixamp 0.27.2 → 0.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +39 -16
- package/backtoschool/dist/assets/ar-DK3LI2hP.js +1 -0
- package/backtoschool/dist/assets/cs-C9cckHFh.js +1 -0
- package/backtoschool/dist/assets/da-BpNIZAZo.js +1 -0
- package/backtoschool/dist/assets/de-C1DX_kDk.js +1 -0
- package/backtoschool/dist/assets/es-bymdOEnB.js +1 -0
- package/backtoschool/dist/assets/fi-p1DAJXf3.js +1 -0
- package/backtoschool/dist/assets/fr-w1qH9bbD.js +1 -0
- package/backtoschool/dist/assets/hi-DnZJakpY.js +1 -0
- package/backtoschool/dist/assets/hu-N7uSyLAk.js +1 -0
- package/backtoschool/dist/assets/id-CX3MVU3E.js +1 -0
- package/backtoschool/dist/assets/index-4LdMSur6.js +93 -0
- package/backtoschool/dist/assets/{index-OE2xWZUH.css → index-D06NfY1L.css} +1 -1
- package/backtoschool/dist/assets/it-CQ0H28FI.js +1 -0
- package/backtoschool/dist/assets/nl-DJqCLHMq.js +1 -0
- package/backtoschool/dist/assets/ru-Rk2yagke.js +1 -0
- package/backtoschool/dist/assets/sv-1r9eOl4-.js +1 -0
- package/backtoschool/dist/assets/uk-CrRsLNHV.js +1 -0
- package/backtoschool/dist/assets/vi-B5kxrjP7.js +1 -0
- package/backtoschool/dist/assets/zh-BB_S8QpG.js +1 -0
- package/backtoschool/dist/index.html +50 -38
- package/dist/admin.js +5 -4
- package/dist/event-writer.d.ts +39 -0
- package/dist/event-writer.js +139 -0
- package/dist/i18n.d.ts +26 -0
- package/dist/i18n.js +81 -0
- package/dist/live-api.d.ts +2 -0
- package/dist/live-api.js +37 -2
- package/dist/live-interpreter.d.ts +3 -1
- package/dist/live-interpreter.js +109 -83
- package/dist/live-recovery.d.ts +6 -0
- package/dist/live-recovery.js +11 -0
- package/dist/locales/ar.d.ts +201 -0
- package/dist/locales/ar.js +200 -0
- package/dist/locales/cs.d.ts +201 -0
- package/dist/locales/cs.js +200 -0
- package/dist/locales/da.d.ts +201 -0
- package/dist/locales/da.js +200 -0
- package/dist/locales/de.d.ts +201 -0
- package/dist/locales/de.js +200 -0
- package/dist/locales/en.d.ts +201 -0
- package/dist/locales/en.js +201 -0
- package/dist/locales/es.d.ts +201 -0
- package/dist/locales/es.js +200 -0
- package/dist/locales/fi.d.ts +201 -0
- package/dist/locales/fi.js +200 -0
- package/dist/locales/fr.d.ts +201 -0
- package/dist/locales/fr.js +200 -0
- package/dist/locales/hi.d.ts +201 -0
- package/dist/locales/hi.js +200 -0
- package/dist/locales/hu.d.ts +201 -0
- package/dist/locales/hu.js +200 -0
- package/dist/locales/id.d.ts +201 -0
- package/dist/locales/id.js +200 -0
- package/dist/locales/it.d.ts +201 -0
- package/dist/locales/it.js +200 -0
- package/dist/locales/nl.d.ts +201 -0
- package/dist/locales/nl.js +200 -0
- package/dist/locales/ru.d.ts +201 -0
- package/dist/locales/ru.js +200 -0
- package/dist/locales/sv.d.ts +201 -0
- package/dist/locales/sv.js +200 -0
- package/dist/locales/uk.d.ts +201 -0
- package/dist/locales/uk.js +200 -0
- package/dist/locales/vi.d.ts +201 -0
- package/dist/locales/vi.js +200 -0
- package/dist/locales/zh.d.ts +201 -0
- package/dist/locales/zh.js +200 -0
- package/dist/mail-sender.d.ts +9 -0
- package/dist/mail-sender.js +11 -0
- package/dist/main.js +26 -12
- package/dist/notify.d.ts +3 -3
- package/dist/notify.js +8 -5
- package/dist/password-reset.d.ts +2 -3
- package/dist/password-reset.js +4 -2
- package/dist/server.d.ts +2 -0
- package/dist/server.js +13 -1
- package/dist/shared-translation.d.ts +1 -0
- package/dist/shared-translation.js +32 -23
- package/dist/ui-aliases.d.ts +4 -0
- package/dist/ui-aliases.js +41 -0
- package/dist/ui-languages.d.ts +62 -0
- package/dist/ui-languages.js +32 -0
- package/package.json +1 -1
- package/src/admin.ts +5 -4
- package/src/event-writer.ts +126 -0
- package/src/i18n.ts +74 -0
- package/src/live-api.ts +26 -2
- package/src/live-interpreter.ts +87 -68
- package/src/live-recovery.ts +10 -0
- package/src/locales/ar.ts +201 -0
- package/src/locales/cs.ts +201 -0
- package/src/locales/da.ts +201 -0
- package/src/locales/de.ts +201 -0
- package/src/locales/en.ts +201 -0
- package/src/locales/es.ts +201 -0
- package/src/locales/fi.ts +201 -0
- package/src/locales/fr.ts +201 -0
- package/src/locales/hi.ts +201 -0
- package/src/locales/hu.ts +201 -0
- package/src/locales/id.ts +201 -0
- package/src/locales/it.ts +201 -0
- package/src/locales/nl.ts +201 -0
- package/src/locales/ru.ts +201 -0
- package/src/locales/sv.ts +201 -0
- package/src/locales/uk.ts +201 -0
- package/src/locales/vi.ts +201 -0
- package/src/locales/zh.ts +201 -0
- package/src/mail-sender.ts +12 -0
- package/src/main.ts +25 -12
- package/src/notify.ts +10 -7
- package/src/password-reset.ts +5 -5
- package/src/server.ts +14 -1
- package/src/shared-translation.ts +27 -19
- package/src/ui-aliases.ts +42 -0
- package/src/ui-languages.ts +31 -0
- package/web/dist/assets/ar-DK3LI2hP.js +1 -0
- package/web/dist/assets/background.worker-Hz7oaQ8X.js +547 -0
- package/web/dist/assets/cs-C9cckHFh.js +1 -0
- package/web/dist/assets/da-BpNIZAZo.js +1 -0
- package/web/dist/assets/de-C1DX_kDk.js +1 -0
- package/web/dist/assets/es-bymdOEnB.js +1 -0
- package/web/dist/assets/fi-p1DAJXf3.js +1 -0
- package/web/dist/assets/fr-w1qH9bbD.js +1 -0
- package/web/dist/assets/hi-DnZJakpY.js +1 -0
- package/web/dist/assets/{hls-3VKVEQE3-CAL4qBEq.js → hls-3VKVEQE3-DURNoQ5W.js} +1 -1
- package/web/dist/assets/hu-N7uSyLAk.js +1 -0
- package/web/dist/assets/id-CX3MVU3E.js +1 -0
- package/web/dist/assets/index-BXJlt2r6.js +3 -0
- package/web/dist/assets/index-Brm9OAsr.css +1 -0
- package/web/dist/assets/it-CQ0H28FI.js +1 -0
- package/web/dist/assets/{mpegts-H9oC2fAK.js → mpegts-BdyqUrVC.js} +1 -1
- package/web/dist/assets/{mpegts-LO6RVLD6-Bkd9Sqr6.js → mpegts-LO6RVLD6-yGogIzG9.js} +1 -1
- package/web/dist/assets/nl-DJqCLHMq.js +1 -0
- package/web/dist/assets/ru-Rk2yagke.js +1 -0
- package/web/dist/assets/sv-1r9eOl4-.js +1 -0
- package/web/dist/assets/uk-CrRsLNHV.js +1 -0
- package/web/dist/assets/vi-B5kxrjP7.js +1 -0
- package/web/dist/assets/zh-BB_S8QpG.js +1 -0
- package/web/dist/index.html +132 -131
- package/web/dist/sw.js +24 -7
- package/backtoschool/dist/assets/index-pQ_uH4bZ.js +0 -93
- package/web/dist/assets/background.worker-DH8ag5Q4.js +0 -547
- package/web/dist/assets/index-CLeEWlms.js +0 -3
- package/web/dist/assets/index-D34dTY18.css +0 -1
package/web/dist/index.html
CHANGED
|
@@ -17,22 +17,22 @@
|
|
|
17
17
|
<meta property="og:title" content="nixamp: broadcast live radio, TV and film from your own machine" />
|
|
18
18
|
<meta property="og:description" content="Launch your own live radio, TV and film network from your machine. Listen free, go live in one command, get paid with x402." />
|
|
19
19
|
<meta property="og:type" content="website" />
|
|
20
|
-
<script type="module" crossorigin src="/assets/index-
|
|
21
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
20
|
+
<script type="module" crossorigin src="/assets/index-BXJlt2r6.js"></script>
|
|
21
|
+
<link rel="stylesheet" crossorigin href="/assets/index-Brm9OAsr.css">
|
|
22
22
|
</head>
|
|
23
23
|
<body>
|
|
24
|
-
<nav class="skip-links" aria-label="Skip to a section">
|
|
25
|
-
<a href="#transport">Skip to playback controls</a>
|
|
26
|
-
<a href="#playlist-panel">Skip to playlist</a>
|
|
27
|
-
<a href="#transcript-panel">Skip to transcript and translated audio</a>
|
|
24
|
+
<nav class="skip-links" aria-label="Skip to a section" data-i18n-aria-label="Skip to a section">
|
|
25
|
+
<a href="#transport" data-i18n="Skip to playback controls">Skip to playback controls</a>
|
|
26
|
+
<a href="#playlist-panel" data-i18n="Skip to playlist">Skip to playlist</a>
|
|
27
|
+
<a href="#transcript-panel" data-i18n="Skip to transcript and translated audio">Skip to transcript and translated audio</a>
|
|
28
28
|
</nav>
|
|
29
29
|
<div id="sr-status" class="sr-only" role="status" aria-live="polite" aria-atomic="true"></div>
|
|
30
|
-
<main id="app" aria-label="Nixamp player">
|
|
31
|
-
<h1 class="sr-only">Nixamp audio and video player</h1>
|
|
30
|
+
<main id="app" aria-label="Nixamp player" data-i18n-aria-label="Nixamp player">
|
|
31
|
+
<h1 class="sr-only" data-i18n="Nixamp audio and video player">Nixamp audio and video player</h1>
|
|
32
32
|
<header class="bar">
|
|
33
33
|
<span class="brand"><img class="brand-mark" src="/logo.png" alt="" width="20" height="20" decoding="async" />NIXAMP</span>
|
|
34
|
-
<span id="status" class="status" data-playing="false">■ STOPPED</span>
|
|
35
|
-
<span id="source" class="chip">no source</span>
|
|
34
|
+
<span id="status" class="status" data-playing="false" data-i18n="■ STOPPED">■ STOPPED</span>
|
|
35
|
+
<span id="source" class="chip" data-i18n="no source">no source</span>
|
|
36
36
|
<!-- The eye or the gear for the server you are on: step down to
|
|
37
37
|
viewing, or up to driving, without finding it in a list again. -->
|
|
38
38
|
<span id="way-in-here" class="way-in-here" hidden></span>
|
|
@@ -41,15 +41,16 @@
|
|
|
41
41
|
<!-- The panels themselves: which are on screen and in what order.
|
|
42
42
|
Winamp's windows were dragged about and snapped into place; the
|
|
43
43
|
grip on each panel does that here, and this lists them all. -->
|
|
44
|
-
<button id="panels-toggle" type="button" class="ghost" aria-controls="panels-panel" aria-expanded="false" title="Panels: show, hide, and reorder the panels on this page">Panels</button>
|
|
45
|
-
<
|
|
44
|
+
<button id="panels-toggle" type="button" class="ghost" aria-controls="panels-panel" aria-expanded="false" title="Panels: show, hide, and reorder the panels on this page" data-i18n="Panels">Panels</button>
|
|
45
|
+
<label class="ui-language"><span data-i18n="Interface language">Interface language</span> <select data-ui-language class="transcript-language" aria-label="Interface language" data-i18n-aria-label="Interface language"></select></label>
|
|
46
|
+
<button id="install" type="button" class="ghost" hidden data-i18n="Install">Install</button>
|
|
46
47
|
</header>
|
|
47
48
|
|
|
48
49
|
<!-- The pitch, for somebody who has never seen this before. In the shell
|
|
49
50
|
so a crawler and a link preview read it; shown by app.ts only where
|
|
50
51
|
accounts live (nixamp.com), only signed out, and only until hidden.
|
|
51
52
|
On your own server you already know what this is. -->
|
|
52
|
-
<section class="panel welcome player-only" data-title="What this is" id="welcome" hidden>
|
|
53
|
+
<section class="panel welcome player-only" data-title="What this is" data-i18n-data-title="What this is" id="welcome" hidden>
|
|
53
54
|
<h2 class="welcome-title">Launch your own live radio, TV and film network in one command.</h2>
|
|
54
55
|
<p class="welcome-lead">
|
|
55
56
|
nixamp is the open source streaming platform that turns a folder on your
|
|
@@ -60,12 +61,12 @@
|
|
|
60
61
|
</p>
|
|
61
62
|
<div class="welcome-grid">
|
|
62
63
|
<div>
|
|
63
|
-
<h2>Listen</h2>
|
|
64
|
+
<h2 data-i18n="Listen">Listen</h2>
|
|
64
65
|
<p>See what is on the air right now and press play. No account needed. Every
|
|
65
66
|
live stream has a room code you can dial from any phone.</p>
|
|
66
67
|
</div>
|
|
67
68
|
<div>
|
|
68
|
-
<h2>Publish</h2>
|
|
69
|
+
<h2 data-i18n="Publish">Publish</h2>
|
|
69
70
|
<p><code>nixamp serve ~/Music</code> and you are live with a link, a room code
|
|
70
71
|
and a phone number. Your recordings, a lecture, a podcast, or a link you paste.</p>
|
|
71
72
|
</div>
|
|
@@ -76,15 +77,15 @@
|
|
|
76
77
|
</div>
|
|
77
78
|
</div>
|
|
78
79
|
<div class="picker welcome-actions">
|
|
79
|
-
<button id="welcome-create" type="button" class="button primary">Create a free account</button>
|
|
80
|
-
<button id="welcome-browse" type="button" class="button">See what is live</button>
|
|
80
|
+
<button id="welcome-create" type="button" class="button primary" data-i18n="Create a free account">Create a free account</button>
|
|
81
|
+
<button id="welcome-browse" type="button" class="button" data-i18n="See what is live">See what is live</button>
|
|
81
82
|
<code class="welcome-install">curl -fsSL https://nixamp.com/install.sh | sh</code>
|
|
82
|
-
<button id="welcome-hide" type="button" class="ghost" title="Hide this, on this device">Hide this</button>
|
|
83
|
+
<button id="welcome-hide" type="button" class="ghost" title="Hide this, on this device" data-i18n="Hide this">Hide this</button>
|
|
83
84
|
</div>
|
|
84
85
|
</section>
|
|
85
86
|
|
|
86
|
-
<section class="panel player-only classroom-player" data-title="Now Playing" aria-label="Now Playing">
|
|
87
|
-
<h2 class="panel-heading">Now Playing</h2>
|
|
87
|
+
<section class="panel player-only classroom-player" data-title="Now Playing" data-i18n-data-title="Now Playing" aria-label="Now Playing" data-i18n-aria-label="Now Playing">
|
|
88
|
+
<h2 class="panel-heading" data-i18n="Now Playing">Now Playing</h2>
|
|
88
89
|
<span class="panel-tools" id="translation-buy-tools"></span>
|
|
89
90
|
<video id="video" playsinline hidden></video>
|
|
90
91
|
<!-- What the picture is saying, on the picture: the current caption
|
|
@@ -98,7 +99,7 @@
|
|
|
98
99
|
allowfullscreen referrerpolicy="strict-origin-when-cross-origin"></iframe>
|
|
99
100
|
</div>
|
|
100
101
|
<audio id="audio"></audio>
|
|
101
|
-
<div id="title-line" class="track-title">Nothing loaded.</div>
|
|
102
|
+
<div id="title-line" class="track-title" data-i18n="Nothing loaded.">Nothing loaded.</div>
|
|
102
103
|
<div id="album-line" class="track-sub">—</div>
|
|
103
104
|
<!-- What is known about what is playing: live or on demand, the
|
|
104
105
|
picture's size, who else is watching, where in a catalog it came
|
|
@@ -114,27 +115,27 @@
|
|
|
114
115
|
<p id="meta-blurb" class="track-blurb" hidden></p>
|
|
115
116
|
<div class="scrub">
|
|
116
117
|
<span id="elapsed" class="time">00:00</span>
|
|
117
|
-
<input id="seek" type="range" min="0" max="1000" value="0" step="1" aria-label="Seek" disabled />
|
|
118
|
+
<input id="seek" type="range" min="0" max="1000" value="0" step="1" aria-label="Seek" data-i18n-aria-label="Seek" disabled />
|
|
118
119
|
<span id="total" class="time muted">--:--</span>
|
|
119
120
|
<button id="copy-now" type="button" class="icon" hidden
|
|
120
121
|
title="Copy this stream's URL, to play it in VLC or another player"
|
|
121
|
-
aria-label="Copy this stream's URL">⧉</button>
|
|
122
|
+
aria-label="Copy this stream's URL" data-i18n-aria-label="Copy this stream's URL">⧉</button>
|
|
122
123
|
<button id="fullscreen" type="button" class="ghost" hidden
|
|
123
|
-
title="Full screen" aria-label="Full screen">⛶</button>
|
|
124
|
+
title="Full screen" data-i18n-title="Full screen" aria-label="Full screen" data-i18n-aria-label="Full screen">⛶</button>
|
|
124
125
|
<button id="download-now" type="button" class="ghost" hidden
|
|
125
|
-
title="Download now: the server fetches the whole thing with yt-dlp and hands it to this device">⤓ Download</button>
|
|
126
|
+
title="Download now: the server fetches the whole thing with yt-dlp and hands it to this device" data-i18n="⤓ Download">⤓ Download</button>
|
|
126
127
|
</div>
|
|
127
|
-
<div class="audio-translation" role="group" aria-label="Audio language">
|
|
128
|
-
<label class="transcript-switch"><input type="checkbox" id="transcript-audio" disabled
|
|
129
|
-
<label class="audio-language">Language
|
|
130
|
-
<p class="hint" id="transcript-audio-note">Original audio.</p>
|
|
128
|
+
<div class="audio-translation" role="group" aria-label="Audio language" data-i18n-aria-label="Audio language">
|
|
129
|
+
<label class="transcript-switch"><input type="checkbox" id="transcript-audio" disabled /><span data-i18n="Translate audio"> Translate audio</span></label>
|
|
130
|
+
<label class="audio-language"><span data-i18n="Language">Language </span><select id="transcript-language" class="transcript-language" aria-label="Translation language" data-i18n-aria-label="Translation language"></select></label>
|
|
131
|
+
<p class="hint" id="transcript-audio-note" data-i18n="Original audio.">Original audio.</p>
|
|
131
132
|
<p class="hint" id="translation-balance"></p>
|
|
132
133
|
<details id="transcript-voice-settings" hidden>
|
|
133
|
-
<summary>Audio options</summary>
|
|
134
|
-
<label class="transcript-switch"><input type="checkbox" id="transcript-background" checked
|
|
135
|
-
<label class="background-level">Background level
|
|
134
|
+
<summary data-i18n="Audio options">Audio options</summary>
|
|
135
|
+
<label class="transcript-switch"><input type="checkbox" id="transcript-background" checked /><span data-i18n="Keep background sound"> Keep background sound</span></label>
|
|
136
|
+
<label class="background-level"><span data-i18n="Background level">Background level </span><input id="transcript-background-level" type="range" min="0" max="200" step="5" value="100" aria-valuetext="100 percent" /> <output id="transcript-background-value" for="transcript-background-level">100%</output></label>
|
|
136
137
|
<p class="hint">Speech removal is approximate; turn this off if original voices bleed through.</p>
|
|
137
|
-
<div id="transcript-speakers" role="group" aria-label="Speaker voices"></div>
|
|
138
|
+
<div id="transcript-speakers" role="group" aria-label="Speaker voices" data-i18n-aria-label="Speaker voices"></div>
|
|
138
139
|
</details>
|
|
139
140
|
</div>
|
|
140
141
|
|
|
@@ -147,15 +148,15 @@
|
|
|
147
148
|
the directory. -->
|
|
148
149
|
<form id="link-form" class="picker link-form">
|
|
149
150
|
<input id="link-url" type="url" inputmode="url" placeholder="Paste a link: an audio or video file, an .m3u playlist, an IPTV feed, YouTube…"
|
|
150
|
-
aria-label="A link to play" />
|
|
151
|
+
aria-label="A link to play" data-i18n-aria-label="A link to play" />
|
|
151
152
|
<select id="link-server" aria-label="Which server goes live with it" title="Which server goes live with it" hidden></select>
|
|
152
|
-
<button type="submit" class="button" title="Play it here, in this browser, where the browser can">Play link</button>
|
|
153
|
+
<button type="submit" class="button" title="Play it here, in this browser, where the browser can" data-i18n="Play link">Play link</button>
|
|
153
154
|
<!-- The one Go live for a link: the server fetches it and puts it on
|
|
154
155
|
the air for everyone, listed with Join party. A file, an .m3u
|
|
155
156
|
playlist played entry by entry, an IPTV feed, a page yt-dlp
|
|
156
157
|
reads. -->
|
|
157
158
|
<button id="link-go-live" type="button" class="button golive"
|
|
158
|
-
title="Go live with this link: the server fetches it and puts it on the air for everyone, listed in the directory">● Go live</button>
|
|
159
|
+
title="Go live with this link: the server fetches it and puts it on the air for everyone, listed in the directory" data-i18n="● Go live">● Go live</button>
|
|
159
160
|
</form>
|
|
160
161
|
<!-- What just happened, where it happened: the same message as the
|
|
161
162
|
Status line at the foot of the page, but under the box the
|
|
@@ -165,7 +166,7 @@
|
|
|
165
166
|
</section>
|
|
166
167
|
|
|
167
168
|
<div class="split" id="zone-top">
|
|
168
|
-
<section class="panel player-only" data-title="Spectrum Analyser" id="spectrum-panel">
|
|
169
|
+
<section class="panel player-only" data-title="Spectrum Analyser" data-i18n-data-title="Spectrum Analyser" id="spectrum-panel">
|
|
169
170
|
<canvas id="spectrum" aria-hidden="true"></canvas>
|
|
170
171
|
<div class="meters" aria-hidden="true">
|
|
171
172
|
<span id="glyphs" class="glyphs"></span>
|
|
@@ -176,22 +177,22 @@
|
|
|
176
177
|
<!-- Connected to a server: its files to browse, and what is live on
|
|
177
178
|
it. The two things a visitor came for, beside the analyser,
|
|
178
179
|
before anything about accounts or sharing. -->
|
|
179
|
-
<section class="panel" id="playlist-panel" data-title="Playlist (0)" tabindex="-1">
|
|
180
|
-
<input id="filter" type="search" class="filter" placeholder="Filter these files"
|
|
181
|
-
aria-label="Filter the playlist" />
|
|
182
|
-
<nav id="crumbs" class="crumbs" aria-label="Playlist folders" hidden></nav>
|
|
183
|
-
<ol id="playlist" class="playlist" aria-label="Tracks and folders"></ol>
|
|
180
|
+
<section class="panel" id="playlist-panel" data-title="Playlist (0)" data-i18n-data-title="Playlist (0)" tabindex="-1">
|
|
181
|
+
<input id="filter" type="search" class="filter" placeholder="Filter these files" data-i18n-placeholder="Filter these files"
|
|
182
|
+
aria-label="Filter the playlist" data-i18n-aria-label="Filter the playlist" />
|
|
183
|
+
<nav id="crumbs" class="crumbs" aria-label="Playlist folders" data-i18n-aria-label="Playlist folders" hidden></nav>
|
|
184
|
+
<ol id="playlist" class="playlist" aria-label="Tracks and folders" data-i18n-aria-label="Tracks and folders"></ol>
|
|
184
185
|
<!-- A page at a time. A television cannot scroll a box inside the
|
|
185
186
|
page, and a folder of two hundred files is a list nobody
|
|
186
187
|
wants in one go anyway. -->
|
|
187
|
-
<nav id="playlist-pager" class="pager" aria-label="Playlist pages" hidden></nav>
|
|
188
|
+
<nav id="playlist-pager" class="pager" aria-label="Playlist pages" data-i18n-aria-label="Playlist pages" hidden></nav>
|
|
188
189
|
</section>
|
|
189
190
|
|
|
190
191
|
<!-- What is on, on the server you are connected to: its own stream,
|
|
191
192
|
and anybody publishing into it. Two different things that were
|
|
192
193
|
only ever visible in two different places, so "what is on here?"
|
|
193
194
|
had no answer. -->
|
|
194
|
-
<section class="panel player-only" data-title="Parties on this server" id="onair-panel" hidden>
|
|
195
|
+
<section class="panel player-only" data-title="Parties on this server" data-i18n-data-title="Parties on this server" id="onair-panel" hidden>
|
|
195
196
|
<p class="hint" id="onair-note"></p>
|
|
196
197
|
<ul id="onair-list" class="directory-list"></ul>
|
|
197
198
|
</section>
|
|
@@ -200,114 +201,114 @@
|
|
|
200
201
|
lists of things on demand, browsed by group rather than dumped
|
|
201
202
|
as three thousand rows. Anyone with the link may browse and
|
|
202
203
|
play; adding and removing one is administering the server. -->
|
|
203
|
-
<section class="panel player-only" data-title="Catalogs on this server" id="catalogs-panel" hidden>
|
|
204
|
+
<section class="panel player-only" data-title="Catalogs on this server" data-i18n-data-title="Catalogs on this server" id="catalogs-panel" hidden>
|
|
204
205
|
<p class="hint" id="catalogs-note"></p>
|
|
205
206
|
<form id="catalogs-form" class="picker" hidden>
|
|
206
207
|
<input id="catalog-source" type="text" inputmode="url"
|
|
207
208
|
placeholder="https://…/list.m3u or a path on the server"
|
|
208
|
-
aria-label="An m3u catalog to add" />
|
|
209
|
-
<input id="catalog-name" type="text" placeholder="call it something"
|
|
210
|
-
aria-label="What to call it" />
|
|
211
|
-
<button type="submit" class="button">Add catalog</button>
|
|
209
|
+
aria-label="An m3u catalog to add" data-i18n-aria-label="An m3u catalog to add" />
|
|
210
|
+
<input id="catalog-name" type="text" placeholder="call it something" data-i18n-placeholder="call it something"
|
|
211
|
+
aria-label="What to call it" data-i18n-aria-label="What to call it" />
|
|
212
|
+
<button type="submit" class="button" data-i18n="Add catalog">Add catalog</button>
|
|
212
213
|
</form>
|
|
213
|
-
<nav id="catalogs-crumbs" class="crumbs" aria-label="Catalog folders" hidden></nav>
|
|
214
|
+
<nav id="catalogs-crumbs" class="crumbs" aria-label="Catalog folders" data-i18n-aria-label="Catalog folders" hidden></nav>
|
|
214
215
|
<ul id="catalogs-list" class="directory-list"></ul>
|
|
215
|
-
<input id="catalogs-filter" type="search" class="filter" placeholder="Filter these entries"
|
|
216
|
-
aria-label="Filter the entries" hidden />
|
|
216
|
+
<input id="catalogs-filter" type="search" class="filter" placeholder="Filter these entries" data-i18n-placeholder="Filter these entries"
|
|
217
|
+
aria-label="Filter the entries" data-i18n-aria-label="Filter the entries" hidden />
|
|
217
218
|
<ol id="catalogs-entries" class="playlist" hidden></ol>
|
|
218
219
|
</section>
|
|
219
220
|
</div>
|
|
220
221
|
|
|
221
|
-
<section class="transport" id="transport" role="group" aria-label="Playback controls" aria-describedby="keyboard-help" tabindex="0">
|
|
222
|
-
<button id="prev" type="button" aria-label="Previous">|◀◀</button>
|
|
223
|
-
<button id="play-pause" type="button" class="primary" aria-label="Play">▶</button>
|
|
222
|
+
<section class="transport" id="transport" role="group" aria-label="Playback controls" data-i18n-aria-label="Playback controls" aria-describedby="keyboard-help" tabindex="0">
|
|
223
|
+
<button id="prev" type="button" aria-label="Previous" data-i18n-aria-label="Previous">|◀◀</button>
|
|
224
|
+
<button id="play-pause" type="button" class="primary" aria-label="Play" data-i18n-aria-label="Play">▶</button>
|
|
224
225
|
<!-- For whoever administers the server: Play plays it for you; this
|
|
225
226
|
puts it on the air for everybody, lists it, and copies the link. -->
|
|
226
227
|
<button id="go-live-now" type="button" class="golive" hidden
|
|
227
|
-
title="Go live: put this on the air for everyone, list it in the directory with a phone code, and copy the link to share">● GO LIVE</button>
|
|
228
|
-
<button id="stop" type="button" aria-label="Stop">■</button>
|
|
229
|
-
<button id="next" type="button" aria-label="Next">▶▶|</button>
|
|
228
|
+
title="Go live: put this on the air for everyone, list it in the directory with a phone code, and copy the link to share" data-i18n="● GO LIVE">● GO LIVE</button>
|
|
229
|
+
<button id="stop" type="button" aria-label="Stop" data-i18n-aria-label="Stop">■</button>
|
|
230
|
+
<button id="next" type="button" aria-label="Next" data-i18n-aria-label="Next">▶▶|</button>
|
|
230
231
|
<!-- A link to what is playing, for anybody: nixamp.com/?play=<the
|
|
231
232
|
stream's own address>, which plays in VLC as it is and which
|
|
232
233
|
nixamp.com opens as a viewer. The device's share sheet where
|
|
233
234
|
there is one; copied otherwise. Only when there is something
|
|
234
235
|
safe to hand out: a viewing address, never the driving one. -->
|
|
235
236
|
<button id="share-now" type="button" class="share" hidden
|
|
236
|
-
title="Share: a nixamp.com link that plays this" aria-label="Share what is playing">Share</button>
|
|
237
|
+
title="Share: a nixamp.com link that plays this" aria-label="Share what is playing" data-i18n-aria-label="Share what is playing" data-i18n="Share">Share</button>
|
|
237
238
|
<label class="volume">
|
|
238
239
|
<span aria-hidden="true" class="vol">VOL</span>
|
|
239
|
-
<input id="volume" type="range" min="0" max="100" value="100" aria-label="Volume" />
|
|
240
|
+
<input id="volume" type="range" min="0" max="100" value="100" aria-label="Volume" data-i18n-aria-label="Volume" />
|
|
240
241
|
</label>
|
|
241
242
|
</section>
|
|
242
243
|
|
|
243
244
|
<div class="split" id="zone-main">
|
|
244
|
-
<section class="panel player-only col-a" data-title="Files" id="files-panel">
|
|
245
|
+
<section class="panel player-only col-a" data-title="Files" data-i18n-data-title="Files" id="files-panel">
|
|
245
246
|
<p class="hint">Files play on this device. Live captions and translated audio send short audio clips only after you enable them.</p>
|
|
246
247
|
<div class="picker">
|
|
247
|
-
<label class="button">
|
|
248
|
+
<label class="button"><span data-i18n="Open files">
|
|
248
249
|
Open files
|
|
249
|
-
|
|
250
|
+
</span><input id="files" type="file" multiple accept="audio/*,video/*" />
|
|
250
251
|
</label>
|
|
251
|
-
<label class="button">
|
|
252
|
+
<label class="button"><span data-i18n="Open folder">
|
|
252
253
|
Open folder
|
|
253
|
-
|
|
254
|
+
</span><input id="folder" type="file" multiple webkitdirectory directory />
|
|
254
255
|
</label>
|
|
255
256
|
</div>
|
|
256
257
|
</section>
|
|
257
258
|
|
|
258
|
-
<section class="panel col-b" data-title="Servers streaming now" id="directory" hidden>
|
|
259
|
-
<p class="hint" id="directory-note">Looking for servers…</p>
|
|
259
|
+
<section class="panel col-b" data-title="Servers streaming now" data-i18n-data-title="Servers streaming now" id="directory" hidden>
|
|
260
|
+
<p class="hint" id="directory-note" data-i18n="Looking for servers…">Looking for servers…</p>
|
|
260
261
|
<ul id="directory-list" class="directory-list"></ul>
|
|
261
262
|
<p class="hint" id="recent-note" hidden>Recently live — follow them to hear next time:</p>
|
|
262
263
|
<ul id="recent-list" class="directory-list"></ul>
|
|
263
|
-
<p class="hint"><a href="/" id="directory-back" hidden>Back to the player</a></p>
|
|
264
|
+
<p class="hint"><a href="/" id="directory-back" hidden data-i18n="Back to the player">Back to the player</a></p>
|
|
264
265
|
</section>
|
|
265
266
|
|
|
266
|
-
<section class="panel player-only col-a" data-title="Favourites" id="favorites-panel" hidden>
|
|
267
|
+
<section class="panel player-only col-a" data-title="Favourites" data-i18n-data-title="Favourites" id="favorites-panel" hidden>
|
|
267
268
|
<p class="hint" id="favorites-note">Servers you hearted. Connect to one, or let it go.</p>
|
|
268
269
|
<ul id="favorites-list" class="directory-list"></ul>
|
|
269
270
|
</section>
|
|
270
271
|
|
|
271
|
-
<section class="panel col-b" data-title="Parties" id="parties-panel" hidden>
|
|
272
|
+
<section class="panel col-b" data-title="Parties" data-i18n-data-title="Parties" id="parties-panel" hidden>
|
|
272
273
|
<p class="hint" id="parties-note">Join a party, or enter an invite code.</p>
|
|
273
274
|
<ul id="parties-list" class="directory-list"></ul>
|
|
274
275
|
<form id="party-form" class="picker">
|
|
275
|
-
<label for="party-code">Invite code</label>
|
|
276
|
+
<label for="party-code" data-i18n="Invite code">Invite code</label>
|
|
276
277
|
<input id="party-code" type="text" inputmode="latin" autocomplete="off"
|
|
277
278
|
autocapitalize="characters" spellcheck="false"
|
|
278
279
|
placeholder="ABC123" />
|
|
279
|
-
<button id="party-join" type="submit" class="button" title="Join live">Join party</button>
|
|
280
|
+
<button id="party-join" type="submit" class="button" title="Join live" data-i18n-title="Join live" data-i18n="Join party">Join party</button>
|
|
280
281
|
</form>
|
|
281
282
|
</section>
|
|
282
283
|
|
|
283
|
-
<section class="panel player-only col-a" data-title="Account" id="account-panel">
|
|
284
|
+
<section class="panel player-only col-a" data-title="Account" data-i18n-data-title="Account" id="account-panel">
|
|
284
285
|
<p class="hint" id="account-note">Listening needs no account. Sign in to keep favourites, follow people, and publish.</p>
|
|
285
286
|
<div id="account-providers" class="picker" hidden></div>
|
|
286
287
|
<form id="account-form" class="picker">
|
|
287
288
|
<input id="account-email" type="email" autocomplete="email"
|
|
288
|
-
placeholder="you@example.com" aria-label="Email" />
|
|
289
|
+
placeholder="you@example.com" aria-label="Email" data-i18n-aria-label="Email" />
|
|
289
290
|
<input id="account-password" type="password" autocomplete="current-password"
|
|
290
|
-
placeholder="password" aria-label="Password" />
|
|
291
|
-
<button type="submit" class="button" id="account-submit">Sign in</button>
|
|
292
|
-
<button id="account-toggle" type="button" class="ghost">Create one</button>
|
|
291
|
+
placeholder="password" data-i18n-placeholder="password" aria-label="Password" data-i18n-aria-label="Password" />
|
|
292
|
+
<button type="submit" class="button" id="account-submit" data-i18n="Sign in">Sign in</button>
|
|
293
|
+
<button id="account-toggle" type="button" class="ghost" data-i18n="Create one">Create one</button>
|
|
293
294
|
</form>
|
|
294
295
|
<!-- Outside the form, because signing out is the one thing you can do
|
|
295
296
|
once the form is gone. -->
|
|
296
|
-
<button id="account-signout" type="button" class="ghost" hidden>Sign out</button>
|
|
297
|
+
<button id="account-signout" type="button" class="ghost" hidden data-i18n="Sign out">Sign out</button>
|
|
297
298
|
<!-- Who the rooms know you as: the handle on every line, the voice
|
|
298
299
|
your lines are read in on the phone, and the OpenProfile the
|
|
299
300
|
voice may be read from. Only once signed in. -->
|
|
300
301
|
<form id="persona-form" class="picker" hidden>
|
|
301
302
|
<input id="persona-handle" type="text" maxlength="30" autocomplete="nickname"
|
|
302
|
-
placeholder="handle" aria-label="Your public handle" />
|
|
303
|
+
placeholder="handle" data-i18n-placeholder="handle" aria-label="Your public handle" data-i18n-aria-label="Your public handle" />
|
|
303
304
|
<select id="persona-voice" aria-label="The voice your lines are read in on the phone">
|
|
304
|
-
<option value="">Any voice</option>
|
|
305
|
-
<option value="female">A woman's voice</option>
|
|
306
|
-
<option value="male">A man's voice</option>
|
|
305
|
+
<option value="" data-i18n="Any voice">Any voice</option>
|
|
306
|
+
<option value="female" data-i18n="A woman's voice">A woman's voice</option>
|
|
307
|
+
<option value="male" data-i18n="A man's voice">A man's voice</option>
|
|
307
308
|
</select>
|
|
308
309
|
<input id="persona-profile" type="url" autocomplete="url"
|
|
309
310
|
placeholder="https://you.example/.well-known/openprofile.md" aria-label="Your OpenProfile URL" />
|
|
310
|
-
<button type="submit" class="button">Save</button>
|
|
311
|
+
<button type="submit" class="button" data-i18n="Save">Save</button>
|
|
311
312
|
</form>
|
|
312
313
|
<p class="hint" id="persona-note" hidden></p>
|
|
313
314
|
<!-- The sites that hold a token for this account. Nothing is shown
|
|
@@ -322,12 +323,12 @@
|
|
|
322
323
|
Accounts live at <a href="https://nixamp.com">nixamp.com</a>.
|
|
323
324
|
</p>
|
|
324
325
|
|
|
325
|
-
<section class="panel player-only col-b" data-title="Notifications" id="notify-panel" hidden>
|
|
326
|
+
<section class="panel player-only col-b" data-title="Notifications" data-i18n-data-title="Notifications" id="notify-panel" hidden>
|
|
326
327
|
<p class="hint" id="notify-note">Get told when someone you follow goes live.</p>
|
|
327
328
|
<div class="picker">
|
|
328
329
|
<label class="toggle">
|
|
329
|
-
<input id="notify-web" type="checkbox"
|
|
330
|
-
</label>
|
|
330
|
+
<input id="notify-web" type="checkbox" /><span data-i18n="On this device"> On this device
|
|
331
|
+
</span></label>
|
|
331
332
|
<label class="toggle">
|
|
332
333
|
<input id="notify-email" type="checkbox" /> By email
|
|
333
334
|
</label>
|
|
@@ -337,15 +338,15 @@
|
|
|
337
338
|
</div>
|
|
338
339
|
<form id="notify-phone-form" class="picker">
|
|
339
340
|
<input id="notify-phone" type="tel" autocomplete="tel"
|
|
340
|
-
placeholder="+1 555 555 0123" aria-label="Phone number for texts" />
|
|
341
|
-
<button type="submit" class="button">Save number</button>
|
|
341
|
+
placeholder="+1 555 555 0123" aria-label="Phone number for texts" data-i18n-aria-label="Phone number for texts" />
|
|
342
|
+
<button type="submit" class="button" data-i18n="Save number">Save number</button>
|
|
342
343
|
</form>
|
|
343
344
|
<p class="hint" id="notify-phone-note"></p>
|
|
344
345
|
<p class="hint" id="following-note" hidden>You follow:</p>
|
|
345
346
|
<ul id="following-list" class="directory-list"></ul>
|
|
346
347
|
</section>
|
|
347
348
|
|
|
348
|
-
<section class="panel player-only col-a" data-title="Your servers" id="servers-panel" hidden>
|
|
349
|
+
<section class="panel player-only col-a" data-title="Your servers" data-i18n-data-title="Your servers" id="servers-panel" hidden>
|
|
349
350
|
<p class="hint" id="servers-note">The machines on your account. Open one, or forget it.</p>
|
|
350
351
|
<ul id="servers-list" class="directory-list"></ul>
|
|
351
352
|
</section>
|
|
@@ -357,24 +358,24 @@
|
|
|
357
358
|
<!-- Every message the page has shown, newest first, with the time:
|
|
358
359
|
what went wrong and when, in words, for whoever missed it as it
|
|
359
360
|
went by. Hide it from the Panels list if it is noise. -->
|
|
360
|
-
<section class="panel col-b" data-title="Log" id="log-panel">
|
|
361
|
+
<section class="panel col-b" data-title="Log" data-i18n-data-title="Log" id="log-panel">
|
|
361
362
|
<p class="hint">What this page has said, newest first.</p>
|
|
362
|
-
<ul id="log-list" tabindex="0" aria-label="Activity log" class="log-list" aria-live="off"></ul>
|
|
363
|
+
<ul id="log-list" tabindex="0" aria-label="Activity log" data-i18n-aria-label="Activity log" class="log-list" aria-live="off"></ul>
|
|
363
364
|
</section>
|
|
364
365
|
|
|
365
|
-
<section class="panel col-b" data-title="Trollbox" id="trollbox-panel" hidden>
|
|
366
|
+
<section class="panel col-b" data-title="Trollbox" data-i18n-data-title="Trollbox" id="trollbox-panel" hidden>
|
|
366
367
|
<p class="hint" id="trollbox-note">Join a live and the room's chat is here.</p>
|
|
367
|
-
<ul id="trollbox-list" tabindex="0" class="trollbox-list" aria-live="off" aria-label="The room's chat"></ul>
|
|
368
|
+
<ul id="trollbox-list" tabindex="0" class="trollbox-list" aria-live="off" aria-label="The room's chat" data-i18n-aria-label="The room's chat"></ul>
|
|
368
369
|
<form id="trollbox-form" class="picker" hidden>
|
|
369
370
|
<input id="trollbox-input" type="text" maxlength="500" autocomplete="off"
|
|
370
|
-
placeholder="Say something to the room…" aria-label="A line for the trollbox" />
|
|
371
|
+
placeholder="Say something to the room…" data-i18n-placeholder="Say something to the room…" aria-label="A line for the trollbox" data-i18n-aria-label="A line for the trollbox" />
|
|
371
372
|
<!-- Tap, talk, tap: the words are posted to the room as you said
|
|
372
373
|
them, no Send to click. Heard by nixamp.com's own ear (Whisper),
|
|
373
374
|
so it only appears where a line can be sent from: signed in, on
|
|
374
375
|
nixamp.com. -->
|
|
375
376
|
<button type="button" class="button mic" id="trollbox-mic" hidden aria-pressed="false"
|
|
376
377
|
title="Say it instead: tap, talk, tap again, and it is sent">🎤</button>
|
|
377
|
-
<button type="submit" class="button">Send</button>
|
|
378
|
+
<button type="submit" class="button" data-i18n="Send">Send</button>
|
|
378
379
|
</form>
|
|
379
380
|
<!-- Edit mode: a dictated line waits in the box for Send instead of
|
|
380
381
|
going straight to the room. Off unless this device turned it on. -->
|
|
@@ -388,21 +389,21 @@
|
|
|
388
389
|
held here until your own sound gets there. On by default; the
|
|
389
390
|
switch turns it off for this device, and the Panels list hides the
|
|
390
391
|
panel. -->
|
|
391
|
-
<section class="panel col-b" data-title="Transcript" id="transcript-panel" tabindex="-1" hidden>
|
|
392
|
-
<label class="transcript-switch"><input type="checkbox" id="transcript-on" checked
|
|
393
|
-
<p class="hint" id="transcript-note">Original-language captions.</p>
|
|
394
|
-
<ul id="transcript-list" tabindex="0" class="transcript-list" aria-live="off" aria-label="What is being said"></ul>
|
|
392
|
+
<section class="panel col-b" data-title="Transcript" data-i18n-data-title="Transcript" id="transcript-panel" tabindex="-1" hidden>
|
|
393
|
+
<label class="transcript-switch"><input type="checkbox" id="transcript-on" checked /><span data-i18n="Captions"> Captions</span></label>
|
|
394
|
+
<p class="hint" id="transcript-note" data-i18n="Original-language captions.">Original-language captions.</p>
|
|
395
|
+
<ul id="transcript-list" tabindex="0" class="transcript-list" aria-live="off" aria-label="What is being said" data-i18n-aria-label="What is being said"></ul>
|
|
395
396
|
</section>
|
|
396
397
|
|
|
397
398
|
<!-- What to send somebody who is not technical: one link, one number,
|
|
398
399
|
one code. Everything else about this page assumes you know what a
|
|
399
400
|
server is; this part must not. -->
|
|
400
|
-
<section class="panel player-only col-b" data-title="Share this stream" id="share-panel" hidden>
|
|
401
|
-
<p class="hint" id="share-note">Checking…</p>
|
|
401
|
+
<section class="panel player-only col-b" data-title="Share this stream" data-i18n-data-title="Share this stream" id="share-panel" hidden>
|
|
402
|
+
<p class="hint" id="share-note" data-i18n="Checking…">Checking…</p>
|
|
402
403
|
<label class="share-line">
|
|
403
|
-
<span class="share-what">Link</span>
|
|
404
|
-
<input id="share-link" type="text" readonly aria-label="Link to this stream" />
|
|
405
|
-
<button id="share-copy" type="button" class="ghost">Copy</button>
|
|
404
|
+
<span class="share-what" data-i18n="Link">Link</span>
|
|
405
|
+
<input id="share-link" type="text" readonly aria-label="Link to this stream" data-i18n-aria-label="Link to this stream" />
|
|
406
|
+
<button id="share-copy" type="button" class="ghost" data-i18n="Copy">Copy</button>
|
|
406
407
|
</label>
|
|
407
408
|
<p class="hint" id="share-phone" hidden></p>
|
|
408
409
|
<div class="picker" id="live-controls" hidden>
|
|
@@ -412,21 +413,21 @@
|
|
|
412
413
|
<form id="share-send" class="picker" hidden>
|
|
413
414
|
<input id="share-to" type="text" inputmode="email"
|
|
414
415
|
placeholder="a phone number or an email" aria-label="Who to send it to" />
|
|
415
|
-
<button type="submit" class="button">Send it</button>
|
|
416
|
+
<button type="submit" class="button" data-i18n="Send it">Send it</button>
|
|
416
417
|
</form>
|
|
417
418
|
</section>
|
|
418
419
|
|
|
419
|
-
<section class="panel player-only col-a" data-title="Admin" id="admin-panel" hidden>
|
|
420
|
-
<p class="hint" id="admin-note">Checking…</p>
|
|
420
|
+
<section class="panel player-only col-a" data-title="Admin" data-i18n-data-title="Admin" id="admin-panel" hidden>
|
|
421
|
+
<p class="hint" id="admin-note" data-i18n="Checking…">Checking…</p>
|
|
421
422
|
<p class="said" id="admin-said" hidden></p>
|
|
422
423
|
<table class="admin-table" id="admin-connections"></table>
|
|
423
424
|
<form id="admin-restream" class="picker">
|
|
424
425
|
<input id="admin-source" type="text" placeholder="a folder, an album URL, a channel"
|
|
425
|
-
aria-label="Something to add" />
|
|
426
|
+
aria-label="Something to add" data-i18n-aria-label="Something to add" />
|
|
426
427
|
<input id="admin-name" type="text" placeholder="call it something (MLB Network)"
|
|
427
|
-
aria-label="What to call it" />
|
|
428
|
-
<button type="submit" class="button">Go live</button>
|
|
429
|
-
<button type="button" id="admin-add" class="ghost">Add to library</button>
|
|
428
|
+
aria-label="What to call it" data-i18n-aria-label="What to call it" />
|
|
429
|
+
<button type="submit" class="button" data-i18n="Go live">Go live</button>
|
|
430
|
+
<button type="button" id="admin-add" class="ghost" data-i18n="Add to library">Add to library</button>
|
|
430
431
|
</form>
|
|
431
432
|
<label class="check">
|
|
432
433
|
<input id="admin-replace" type="checkbox" />
|
|
@@ -443,11 +444,11 @@
|
|
|
443
444
|
|
|
444
445
|
<!-- The panels: shown, hidden, reordered, from a list, for a keyboard,
|
|
445
446
|
a phone, or putting everything back where it started. -->
|
|
446
|
-
<section class="panel col-b" data-title="Panels" id="panels-panel" hidden>
|
|
447
|
+
<section class="panel col-b" data-title="Panels" data-i18n-data-title="Panels" id="panels-panel" hidden>
|
|
447
448
|
<p class="hint">Every panel, on or off. Move a panel by dragging its ≡ handle, or focus that handle and press Alt + Up or Down. ▁ shades it to its title bar; ✕ hides it.</p>
|
|
448
449
|
<ul id="panels-list" class="directory-list panels-list"></ul>
|
|
449
450
|
<div class="picker">
|
|
450
|
-
<button id="panels-reset" type="button" class="ghost" title="Every panel back where the page puts it">Reset layout</button>
|
|
451
|
+
<button id="panels-reset" type="button" class="ghost" title="Every panel back where the page puts it" data-i18n="Reset layout">Reset layout</button>
|
|
451
452
|
</div>
|
|
452
453
|
</section>
|
|
453
454
|
|
|
@@ -457,28 +458,28 @@
|
|
|
457
458
|
into the directory: one command, a sign-in, and it names and
|
|
458
459
|
lists itself. A host flag and an IP were how it worked before
|
|
459
460
|
nixamp.com knew about servers at all. -->
|
|
460
|
-
<section class="panel player-only col-a" data-title="Server" id="remote-panel">
|
|
461
|
+
<section class="panel player-only col-a" data-title="Server" data-i18n-data-title="Server" id="remote-panel">
|
|
461
462
|
<p class="hint">
|
|
462
463
|
Pick a server in the directory, or paste a server's link here. To run your own:
|
|
463
464
|
<code>curl -fsSL https://nixamp.com/install.sh | sh</code>, then <code>nixamp login</code>
|
|
464
465
|
and <code>nixamp serve ~/Music</code>. It lists itself in the directory and on your account.
|
|
465
466
|
</p>
|
|
466
467
|
<form id="remote-form" class="picker">
|
|
467
|
-
<input id="remote-url" type="text" inputmode="url" placeholder="a server's link, https://…:4321/view/…" aria-label="A server's link" />
|
|
468
|
-
<button type="submit" class="button">Connect</button>
|
|
469
|
-
<button id="disconnect" type="button" class="ghost" hidden>Disconnect</button>
|
|
470
|
-
<button id="browse" type="button" class="ghost">Browse the directory</button>
|
|
468
|
+
<input id="remote-url" type="text" inputmode="url" placeholder="a server's link, https://…:4321/view/…" aria-label="A server's link" data-i18n-aria-label="A server's link" />
|
|
469
|
+
<button type="submit" class="button" data-i18n="Connect">Connect</button>
|
|
470
|
+
<button id="disconnect" type="button" class="ghost" hidden data-i18n="Disconnect">Disconnect</button>
|
|
471
|
+
<button id="browse" type="button" class="ghost" data-i18n="Browse the directory">Browse the directory</button>
|
|
471
472
|
</form>
|
|
472
473
|
|
|
473
474
|
<label class="check">
|
|
474
|
-
<input id="listen-here" type="checkbox" checked
|
|
475
|
+
<input id="listen-here" type="checkbox" checked /><span data-i18n="Play on this device">
|
|
475
476
|
Play on this device
|
|
476
|
-
</label>
|
|
477
|
+
</span></label>
|
|
477
478
|
<p class="hint">
|
|
478
479
|
Off means the server plays through its own speakers and this is only a
|
|
479
480
|
remote control for it.
|
|
480
481
|
</p>
|
|
481
|
-
<p class="hint">Status:
|
|
482
|
+
<p class="hint"><span data-i18n="Status:">Status: </span><span id="remote-state" data-status="idle" data-i18n="not connected">not connected</span></p>
|
|
482
483
|
<p class="hint" id="listen-only" hidden></p>
|
|
483
484
|
</section>
|
|
484
485
|
</div>
|
|
@@ -486,14 +487,14 @@
|
|
|
486
487
|
<p id="note" class="note" hidden></p>
|
|
487
488
|
|
|
488
489
|
<footer class="statusbar">
|
|
489
|
-
<span id="keyboard-help">With playback controls focused: <b>Space</b> Play</span>
|
|
490
|
-
<span><b>↑↓</b> Select</span>
|
|
491
|
-
<span><b>n/p</b> Next/Prev</span>
|
|
492
|
-
<span><b>s</b> Stop</span>
|
|
490
|
+
<span id="keyboard-help">With playback controls focused: <b>Space</b><span data-i18n="Play"> Play</span></span>
|
|
491
|
+
<span><b>↑↓</b><span data-i18n="Select"> Select</span></span>
|
|
492
|
+
<span><b>n/p</b><span data-i18n="Next/Prev"> Next/Prev</span></span>
|
|
493
|
+
<span><b>s</b><span data-i18n="Stop"> Stop</span></span>
|
|
493
494
|
<span class="spacer"></span>
|
|
494
495
|
<!-- For a set whose browser does not say what it is: one press, and
|
|
495
496
|
the page is laid out for a remote and a sofa. -->
|
|
496
|
-
<button id="tv-toggle" type="button" class="ghost tv-toggle">TV mode</button>
|
|
497
|
+
<button id="tv-toggle" type="button" class="ghost tv-toggle" data-i18n="TV mode">TV mode</button>
|
|
497
498
|
<span class="muted"> · </span>
|
|
498
499
|
<a href="https://github.com/profullstack/nixamp">github.com/profullstack/nixamp</a>
|
|
499
500
|
<span class="muted"> · </span>
|
|
@@ -501,17 +502,17 @@
|
|
|
501
502
|
</footer>
|
|
502
503
|
</main>
|
|
503
504
|
<dialog id="translation-purchase" aria-labelledby="translation-purchase-title" aria-describedby="translation-purchase-summary">
|
|
504
|
-
<div class="purchase-heading"><h2 id="translation-purchase-title">Buy translated audio</h2><button type="button" id="translation-purchase-close" aria-label="Close translated audio purchase">✕</button></div>
|
|
505
|
+
<div class="purchase-heading"><h2 id="translation-purchase-title" data-i18n="Buy translated audio">Buy translated audio</h2><button type="button" id="translation-purchase-close" aria-label="Close translated audio purchase" data-i18n-aria-label="Close translated audio purchase">✕</button></div>
|
|
505
506
|
<p id="translation-purchase-summary">Prepaid translation for live channels, video and audio.</p>
|
|
506
507
|
<p id="translation-purchase-balance"></p>
|
|
507
508
|
<p class="hint" id="translation-free-description"></p>
|
|
508
|
-
<label for="translation-plan">Pass</label><select id="translation-plan"></select>
|
|
509
|
+
<label for="translation-plan" data-i18n="Pass">Pass</label><select id="translation-plan"></select>
|
|
509
510
|
<p class="hint" id="translation-plan-description"></p>
|
|
510
|
-
<label for="translation-coin">Pay with</label><select id="translation-coin"></select>
|
|
511
|
+
<label for="translation-coin" data-i18n="Pay with">Pay with</label><select id="translation-coin"></select>
|
|
511
512
|
<p class="hint">Crypto checkout through CoinPay. Any network fees are shown at checkout.</p>
|
|
512
513
|
<a href="#account-panel" id="translation-sign-in">Sign in for free sessions or to purchase</a>
|
|
513
|
-
<div class="purchase-actions"><button type="button" class="button" id="translation-checkout" disabled>Buy pass</button><a id="translation-checkout-link" target="_blank" rel="noopener noreferrer" hidden>Open secure checkout ↗ (new tab)</a><button type="button" id="translation-check-payment" hidden>Check payment</button></div>
|
|
514
|
-
<details class="purchase-terms"><summary>Usage rates and expiry</summary>
|
|
514
|
+
<div class="purchase-actions"><button type="button" class="button" id="translation-checkout" disabled data-i18n="Buy pass">Buy pass</button><a id="translation-checkout-link" target="_blank" rel="noopener noreferrer" hidden data-i18n="Open secure checkout ↗ (new tab)">Open secure checkout ↗ (new tab)</a><button type="button" id="translation-check-payment" hidden data-i18n="Check payment">Check payment</button></div>
|
|
515
|
+
<details class="purchase-terms"><summary data-i18n="Usage rates and expiry">Usage rates and expiry</summary>
|
|
515
516
|
<p class="hint">After the five free sessions, new sessions draw from purchased credit at 5× the base speech API rates: $0.25 per 1,000 voice characters plus $1.10 per submitted audio hour. Live recognition includes repeated context, usually three submitted hours per listening hour. Shared live audio has the same paid access price for every listener.</p>
|
|
516
517
|
<p class="hint">Unused credit expires. Buying before expiry adds credit and keeps the later expiry date. Your pass works across players on this account.</p>
|
|
517
518
|
</details>
|