update privacy

This commit is contained in:
2026-09-27 18:31:10 +02:00
parent c7fceee11f
commit e0ac481e7a
2 changed files with 341 additions and 61 deletions
+340 -60
View File
@@ -5,7 +5,7 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Privacy Policy | RadioPlayer</title>
<meta name="description" content="Privacy policy for the RadioPlayer web app.">
<meta name="description" content="Privacy policy for the RadioPlayer native Android application.">
<meta name="theme-color" content="#111318">
<link rel="manifest" href="manifest.json?v=__BUILD_STAMP__">
<link rel="icon" type="image/png" sizes="192x192" href="assets/radioplayer-logo-192.png">
@@ -107,23 +107,47 @@
font-weight: 700;
}
.back-link {
padding: 0.7rem 1rem;
.language-switch {
display: inline-flex;
gap: 4px;
padding: 4px;
border: 1px solid var(--border);
border-radius: 999px;
background: rgba(255, 255, 255, 0.06);
color: var(--text-main);
text-decoration: none;
font-size: 0.92rem;
font-weight: 700;
}
.back-link:hover,
.back-link:focus-visible {
border-color: rgba(77, 215, 200, 0.45);
.language-button {
min-width: 48px;
min-height: 40px;
padding: 0.55rem 0.85rem;
border: 0;
border-radius: 999px;
background: transparent;
color: var(--text-main);
font-size: 0.92rem;
font-weight: 700;
cursor: pointer;
}
.language-button:hover,
.language-button:focus-visible {
background: rgba(255, 255, 255, 0.1);
}
.language-button[aria-pressed="true"] {
background: var(--accent);
color: #071412;
}
.language-button:focus-visible {
outline: 2px solid var(--accent-3);
outline-offset: 2px;
}
.language-panel[hidden] {
display: none;
}
.privacy-card {
padding: clamp(24px, 4vw, 42px);
border: 1px solid var(--border);
@@ -225,8 +249,8 @@
align-items: stretch;
}
.back-link {
text-align: center;
.language-switch {
align-self: flex-end;
}
.privacy-card {
@@ -248,106 +272,362 @@
<img src="assets/radioplayer-logo-192.png" alt="RadioPlayer">
<span>
<span class="brand-title">RadioPlayer</span>
<span class="brand-subtitle">Web radio player</span>
<span class="brand-subtitle">Native Android radio player</span>
</span>
</a>
<a class="back-link" href="./">Back to the app</a>
<div class="language-switch" role="group" aria-label="Language / Jezik">
<button class="language-button" id="language-en" type="button" aria-pressed="true" lang="en">EN</button>
<button class="language-button" id="language-sl" type="button" aria-pressed="false" lang="sl">SL</button>
</div>
</div>
<main class="privacy-card">
<div class="language-panel" id="content-en" lang="en">
<p class="eyebrow">Policy</p>
<h1>Privacy Policy</h1>
<p class="lead">
This page explains which data RadioPlayer stores only in your browser, why it uses that data, and how you
can remove it. This text applies to the web version of the app and to its PWA installation.
This policy explains how the native RadioPlayer application for Android (<strong>net.klevze.radio</strong>)
handles information when you listen to radio stations, use Android Auto or Google Cast, and configure app
features. RadioPlayer does not require an account and does not contain advertising or analytics SDKs.
</p>
<div class="meta">Effective date: April 29, 2026</div>
<div class="meta">Effective date: September 3, 2026</div>
<div class="sections">
<section>
<h2>What data is created during use</h2>
<h2>Information stored on your device</h2>
<p>
RadioPlayer does not require registration or a user account. The app may, however, store settings and
lists that you create locally in your browser so they are available again the next time you visit.
RadioPlayer stores app settings and operational data locally in Android DataStore and app-private cache
files. This lets the app restore your choices without creating an online account.
</p>
<ul>
<li>playback volume, the last selected station, and the last selected country filter,</li>
<li>your list of favorite stations and local playback statistics used to show recently played stations,</li>
<li>stations that you add manually in the editor,</li>
<li>the selected audio casting mode for a Google Cast connection.</li>
<li>favorite and recently played station identifiers;</li>
<li>the last selected station, without automatically starting playback after a normal app restart;</li>
<li>country, category, language and sorting filters, app language and visualizer preference;</li>
<li>an optional sleep-timer deadline;</li>
<li>an optional wake-alarm schedule and the station information needed to run it;</li>
<li>a local list of up to 50 recently played track titles and artists, shown on the "Recently played" screen and cleared from Settings;</li>
<li>a cached station catalog and cached station artwork needed for reliable operation.</li>
</ul>
<p>Station search text is used only for the current session and is not kept as a search history.</p>
</section>
<section>
<h2>Where the data is stored</h2>
<h2>Network connections and radio streams</h2>
<p>
The data listed above is stored locally in your browser or in this website's data on your device. For
more persistent storage of settings and stations, the app uses the browser's local IndexedDB database.
When you use a new version for the first time, it may also migrate older local settings from previous
local storage so your data is preserved. RadioPlayer does not send these settings to its own server and
does not share them with other users without your action.
The app uses HTTPS to retrieve station-catalog updates from <strong>radio.76bit.net</strong>. When you
select a station, audio and artwork are requested directly from that station's or content provider's
server. A small fixed allowlist of HTTP audio hosts may be used only when a stream does not support HTTPS.
RadioPlayer does not disable or bypass TLS certificate validation.
</p>
<p>
The app also uses cached application files for faster startup and operation without downloading all static
files again. You can clear this cache at any time in your browser settings.
Those third-party servers may receive technical information required to deliver the request, such as your
IP address, device or network information, requested URL and request time. Their own privacy policies and
retention practices apply. RadioPlayer does not control the availability or logging practices of
third-party stations.
</p>
</section>
<section>
<h2>External providers and streaming</h2>
<h2>Background playback and notifications</h2>
<p>
When you start a radio stream, your browser connects directly to the radio station's server or another
stream provider. These external providers typically receive the technical data required to deliver the
stream, such as your IP address, browser details, and the time of the request.
</p>
<p>
If you use Google Cast, the Google Cast Web Sender SDK is used to establish and manage casting. In that
case, Google or the playback device may process data required for the casting session and media routing.
</p>
<p>
On Apple devices, the app may also offer AirPlay output selection. In that case, the media stream is
routed to the selected AirPlay device through your browser and operating system capabilities, so the
external device or Apple may process data required to establish and manage playback.
While audio is playing, Android may display a media notification and MediaSession controls in the
notification area, on the lock screen, on Bluetooth devices or in other compatible system surfaces. On
Android 13 and later, the app may request notification permission for these controls. Notifications are
used only for playback and alarm-related functionality, not for advertising.
</p>
</section>
<section>
<h2>Cookies and analytics</h2>
<h2>Sleep timer and wake alarm</h2>
<p>
The current version of the app does not use analytics scripts for user profiling and does not set its own
advertising cookies. To store settings, the app uses the browser's local storage and IndexedDB rather
than traditional cookies.
The sleep timer stores an on-device deadline. If you enable the wake alarm, RadioPlayer uses Android's
exact-alarm capability so playback can start at the time you selected. Android may ask you to grant
Alarms &amp; reminders access. After a reboot, time-zone change or relevant system event, the app only
reschedules an enabled alarm; receiving the boot event does not itself start playback. Exact timing may
still be affected by device-manufacturer battery policies.
</p>
</section>
<section>
<h2>Hosting logs</h2>
<h2>Android Auto</h2>
<p>
The website host may automatically keep basic technical access logs for security, stability, or debugging
purposes. The scope of these logs depends on the hosting provider and is not part of the settings managed
by the RadioPlayer user interface.
When connected to Android Auto, the vehicle interface can browse the on-device station catalog,
favorites and recent stations, display station artwork, search for stations and control the same playback
session used by the phone. RadioPlayer does not create a separate car account, and connecting Android
Auto does not by itself start playback. Android Auto and Google may process technical information needed
to provide the connection and voice features under their own terms.
</p>
</section>
<section>
<h2>How to delete local data</h2>
<h2>Google Cast</h2>
<p>
If you want to remove saved favorite stations, custom stations, or other settings, delete this website's
data in your browser. This removes local settings and cached application files from this device.
Google Cast is optional and starts only when you choose a compatible receiver. Google Cast and Android's
Media Router discover receivers on your local network. RadioPlayer sends the selected station's public
stream URL and basic metadata, such as its name and artwork URL, to the selected receiver using the
Default Media Receiver. Google and the receiver may process technical information required to establish
and operate that session. RadioPlayer does not add a separate Cast analytics account.
</p>
</section>
<section>
<h2>Policy updates</h2>
<h2>Audio visualizer</h2>
<p>
This policy may be updated if the app's behavior, hosting setup, or external providers change. The
current version of the text will always be published on this page.
The optional 32-band visualizer analyzes audio samples already being decoded for playback inside the app.
The analysis is used only to draw the on-screen animation. It does not use the microphone, does not
require the <strong>RECORD_AUDIO</strong> permission, is not saved as an audio recording and is not sent
to the developer.
</p>
</section>
<section>
<h2>Album / track cover art</h2>
<p>
RadioPlayer does <strong>not</strong> contact any external album-art or music-metadata service. The
artwork shown in the player, the media notification, on the lock screen and in Android Auto is the
<strong>logo or image supplied by the radio station</strong> (or the app's own placeholder when a
station provides none). The current song's artist and title, when a station broadcasts them, are shown
as text only and are never sent anywhere for an artwork lookup.
</p>
</section>
<section>
<h2>Information not collected by the developer</h2>
<p>RadioPlayer 2.0.0 does not include developer-operated:</p>
<ul>
<li>user accounts or cloud synchronization of favorites and settings;</li>
<li>advertising or user-profiling SDKs;</li>
<li>analytics SDKs;</li>
<li>sale of personal information;</li>
<li>access to your location, microphone, contacts, photos or files;</li>
<li>upload of your listening or track history to the developer &mdash; the bounded list of recently played tracks is kept only on your device.</li>
</ul>
<p>
This statement does not cover technical data processed independently by Android, Google Play, Android
Auto, Google Cast, radio stations, stream hosts or artwork providers under their own policies.
</p>
</section>
<section>
<h2>Deleting your data</h2>
<p>
RadioPlayer has no online account to delete. You can remove locally stored favorites, recent stations,
preferences, timers, alarms and cached data by opening Android Settings, selecting Apps, RadioPlayer,
Storage, and clearing the app's storage. Uninstalling the app also removes its local app data, subject to
Android or Google backup and restore settings controlled by you. You can revoke notification, alarm and
other granted app access at any time in Android Settings.
</p>
</section>
<section>
<h2>Android TV</h2>
<p>
RadioPlayer 2.0.0 does not provide a separately installable native Android TV application. You may cast
from the phone app to a compatible Google TV or Cast receiver.
</p>
</section>
<section>
<h2>Changes and contact</h2>
<p>
This policy may be updated when RadioPlayer's behavior, dependencies or external services change. The
effective date above identifies the current version. For privacy questions, use the developer contact
information published with RadioPlayer on its Google Play listing.
</p>
</section>
</div>
</div>
<div class="language-panel" id="content-sl" lang="sl" hidden>
<p class="eyebrow">Pravilnik</p>
<h1>Pravilnik o zasebnosti</h1>
<p class="lead">
Ta pravilnik pojasnjuje, kako nativna aplikacija RadioPlayer za Android
(<strong>net.klevze.radio</strong>) ravna s podatki med poslušanjem radijskih postaj, uporabo Android Auto ali
Google Cast ter nastavljanjem funkcij. RadioPlayer ne zahteva uporabniškega računa ter ne vsebuje oglaševalskih
ali analitičnih SDK-jev.
</p>
<div class="meta">Datum začetka veljavnosti: 3. september 2026</div>
<div class="sections">
<section>
<h2>Podatki, shranjeni v napravi</h2>
<p>
RadioPlayer lokalno uporablja Android DataStore in zasebni predpomnilnik aplikacije. Tako lahko obnovi
vaše izbire, ne da bi ustvaril spletni uporabniški račun.
</p>
<ul>
<li>identifikatorje priljubljenih in nedavno predvajanih postaj;</li>
<li>nazadnje izbrano postajo, brez samodejnega predvajanja po običajnem ponovnem zagonu aplikacije;</li>
<li>filtre države, kategorije, jezika in razvrščanja, jezik aplikacije ter nastavitev vizualizatorja;</li>
<li>morebitni rok časovnika spanja;</li>
<li>morebitni urnik budilnega alarma in podatke postaje, potrebne za njegovo izvedbo;</li>
<li>lokalni seznam do 50 nedavno predvajanih skladb (izvajalec in naslov), prikazan na zaslonu »Nedavno predvajano« in izbrisljiv v nastavitvah;</li>
<li>predpomnjeni katalog postaj in predpomnjene logotipe postaj za zanesljivo delovanje.</li>
</ul>
<p>Besedilo iskanja postaj se uporablja le v trenutni seji in se ne hrani kot zgodovina iskanja.</p>
</section>
<section>
<h2>Omrežne povezave in radijski pretoki</h2>
<p>
Aplikacija prek HTTPS pridobiva posodobitve kataloga z <strong>radio.76bit.net</strong>. Ob izbiri postaje
pridobiva zvok in slike neposredno s strežnika postaje oziroma ponudnika vsebine. Majhen nespremenljiv
seznam HTTP gostiteljev je dovoljen le za zvočne pretoke, ki ne podpirajo HTTPS. RadioPlayer ne izklaplja
in ne zaobide preverjanja potrdil TLS.
</p>
<p>
Zunanji strežniki lahko prejmejo tehnične podatke, potrebne za izvedbo zahteve, na primer naslov IP,
podatke o napravi ali omrežju, zahtevani URL in čas zahteve. Zanje veljajo njihovi pravilniki o zasebnosti
in roki hrambe. RadioPlayer ne nadzira razpoložljivosti ali beleženja pri zunanjih postajah.
</p>
</section>
<section>
<h2>Predvajanje v ozadju in obvestila</h2>
<p>
Med predvajanjem lahko Android prikaže medijsko obvestilo in kontrole MediaSession v obvestilih, na
zaklenjenem zaslonu, napravah Bluetooth ali drugih združljivih sistemskih površinah. Na Androidu 13 in
novejšem lahko aplikacija zahteva dovoljenje za obvestila. Obvestila se uporabljajo le za predvajanje in
funkcije alarma, ne za oglaševanje.
</p>
</section>
<section>
<h2>Časovnik spanja in budilni alarm</h2>
<p>
Časovnik spanja lokalno shrani rok. Če omogočite budilni alarm, RadioPlayer uporabi zmožnost točnega alarma
Androida, da se predvajanje lahko začne ob izbranem času. Android lahko zahteva dostop do Alarmov in
opomnikov. Po ponovnem zagonu naprave, spremembi časovnega pasu ali ustreznem sistemskem dogodku aplikacija
omogočeni alarm samo ponovno razporedi; sam prejem dogodka ob zagonu ne začne predvajanja. Na točnost lahko
vplivajo pravila proizvajalca naprave glede varčevanja z baterijo.
</p>
</section>
<section>
<h2>Android Auto</h2>
<p>
Ob povezavi z Android Auto lahko vmesnik vozila brska po lokalnem katalogu, priljubljenih in nedavnih
postajah, prikazuje logotipe, išče postaje ter upravlja isto sejo predvajanja kot telefon. RadioPlayer ne
ustvari ločenega avtomobilskega računa in povezava sama ne začne predvajanja. Android Auto in Google lahko
po svojih pravilih obdelata tehnične podatke, potrebne za povezavo in glasovne funkcije.
</p>
</section>
<section>
<h2>Google Cast</h2>
<p>
Google Cast je neobvezen in se začne le, ko izberete združljiv sprejemnik. Google Cast in Android Media
Router odkrivata sprejemnike v lokalnem omrežju. RadioPlayer izbranemu sprejemniku prek privzetega
medijskega sprejemnika pošlje javni URL pretoka ter osnovne metapodatke, kot sta ime postaje in URL slike.
Google in sprejemnik lahko obdelata tehnične podatke, potrebne za vzpostavitev in izvajanje seje.
RadioPlayer ne dodaja ločenega analitičnega računa Cast.
</p>
</section>
<section>
<h2>Zvočni vizualizator</h2>
<p>
Neobvezni 32-pasovni vizualizator analizira zvočne vzorce, ki se znotraj aplikacije že dekodirajo za
predvajanje. Analiza se uporablja le za risanje animacije na zaslonu. Ne uporablja mikrofona, ne zahteva
dovoljenja <strong>RECORD_AUDIO</strong>, se ne shranjuje kot zvočni posnetek in se ne pošilja razvijalcu.
</p>
</section>
<section>
<h2>Naslovnice albumov / skladb</h2>
<p>
RadioPlayer se <strong>ne</strong> povezuje z nobeno zunanjo storitvijo za naslovnice ali glasbene
metapodatke. Naslovnica, prikazana v predvajalniku, medijskem obvestilu, na zaklenjenem zaslonu in v
Android Auto, je <strong>logotip oziroma slika, ki jo posreduje radijska postaja</strong> (ali lastni
nadomestni znak aplikacije, kadar je postaja ne ponudi). Izvajalec in naslov trenutne skladbe, kadar
ju postaja oddaja, sta prikazana le kot besedilo in nista nikamor poslana za iskanje naslovnice.
</p>
</section>
<section>
<h2>Česa razvijalec ne zbira</h2>
<p>RadioPlayer 2.0.0 ne vključuje:</p>
<ul>
<li>uporabniških računov ali sinhronizacije priljubljenih in nastavitev v oblaku;</li>
<li>oglaševalskih SDK-jev ali profiliranja uporabnikov;</li>
<li>analitičnih SDK-jev;</li>
<li>prodaje osebnih podatkov;</li>
<li>dostopa do lokacije, mikrofona, stikov, fotografij ali datotek;</li>
<li>pošiljanja zgodovine poslušanja ali skladb razvijalcu &mdash; omejen seznam nedavno predvajanih skladb se hrani samo v napravi.</li>
</ul>
<p>
Ta navedba ne zajema tehničnih podatkov, ki jih Android, Google Play, Android Auto, Google Cast, radijske
postaje, gostitelji pretokov ali ponudniki slik samostojno obdelujejo po svojih pravilnikih.
</p>
</section>
<section>
<h2>Brisanje podatkov</h2>
<p>
RadioPlayer nima spletnega računa, ki bi ga bilo treba izbrisati. Lokalno shranjene priljubljene, nedavne
postaje, nastavitve, časovnike, alarme in predpomnilnik odstranite v nastavitvah Androida: Aplikacije,
RadioPlayer, Shramba, nato izbrišite podatke aplikacije. Odstranitev aplikacije prav tako izbriše njene
lokalne podatke, ob upoštevanju nastavitev Android oziroma Google varnostnega kopiranja in obnovitve, ki
jih upravljate sami. Dovoljenja za obvestila, alarme in druge dostope lahko kadar koli prekličete v
nastavitvah Androida.
</p>
</section>
<section>
<h2>Android TV</h2>
<p>
RadioPlayer 2.0.0 nima ločene nativne aplikacije za namestitev na Android TV. Iz telefonske aplikacije
lahko predvajate na združljiv sprejemnik Google TV ali Cast.
</p>
</section>
<section>
<h2>Spremembe in stik</h2>
<p>
Ta pravilnik se lahko posodobi, če se spremenijo delovanje, odvisnosti ali zunanje storitve RadioPlayerja.
Datum začetka veljavnosti zgoraj označuje trenutno različico. Za vprašanja o zasebnosti uporabite kontaktne
podatke razvijalca, objavljene ob aplikaciji RadioPlayer v trgovini Google Play.
</p>
</section>
</div>
</div>
</main>
</div>
<script>
(() => {
const panels = {
en: document.getElementById("content-en"),
sl: document.getElementById("content-sl")
};
const buttons = {
en: document.getElementById("language-en"),
sl: document.getElementById("language-sl")
};
function setLanguage(language) {
const selected = language === "sl" ? "sl" : "en";
Object.keys(panels).forEach((key) => {
panels[key].hidden = key !== selected;
buttons[key].setAttribute("aria-pressed", String(key === selected));
});
document.documentElement.lang = selected;
document.title = selected === "sl"
? "Pravilnik o zasebnosti | RadioPlayer"
: "Privacy Policy | RadioPlayer";
}
buttons.en.addEventListener("click", () => setLanguage("en"));
buttons.sl.addEventListener("click", () => setLanguage("sl"));
const browserLanguage = (navigator.languages && navigator.languages[0]) || navigator.language || "en";
setLanguage(browserLanguage.toLowerCase().startsWith("sl") ? "sl" : "en");
})();
</script>
</body>
</html>
</html>
+1 -1
View File
@@ -5,7 +5,7 @@ set -euo pipefail
repoRoot='/mnt/d/Sites/RadioPlayer/web'
localDistFolder="$repoRoot/dist/."
remoteFolder='/opt/www/virtual/RadioPlayer/'
remoteServer='[email protected]'
remoteServer='klevze@server4.klevze.si'
run_build() {
if grep -qi microsoft /proc/version 2>/dev/null && command -v powershell.exe >/dev/null 2>&1; then