No description
- Kotlin 100%
| app | ||
| gradle | ||
| .gitignore | ||
| build.gradle.kts | ||
| COPYRIGHT | ||
| gradle.properties | ||
| gradlew | ||
| gradlew.bat | ||
| LICENSE | ||
| README.md | ||
| settings.gradle.kts | ||
ByteFM
Native Android-App für den Radiosender ByteFM (Hamburg) — ein Tipp bis zur Musik. Kein WebView, kein Login, keine Werbung. Aufgebaut wie die Schwester-App für FIP.
Funktionen
- Alle drei Streams in einer Spalte: Web, Hamburg und „Nur Musik".
- Homescreen-Widget, das mitwächst: schmal nur der Knopf, größer mit Bild, Titel, Interpret und Sendung. Anmutung je Kachel wählbar (Gedämpft/Glas/Voll/Systemfarben).
- Sperrbildschirm- und Bluetooth-Steuerung über Media3
MediaSessionService, inkl. Bild als echte Bilddaten (für AVRCP/Autoradio). Die Sendung reist im Album-Feld mit, weil weder AVRCP noch der Sperrbildschirm ein eigenes Feld dafür kennen. - Live-Vorschau ohne Play: beim Öffnen zeigt die App tonlos, was gerade läuft.
- Verlauf der ausgespielten Titel (füllt sich, während die App läuft).
- Merken: Favoriten rein lokal, mit Herz auch vom Sperrbildschirm aus.
- Titelangaben herausgeben: langer Druck auf eine Zeile (oder auf die Titelangaben im
Hauptfenster) legt einen Titel in die Zwischenablage; der Knopf oben in Verlauf und
Merkliste gibt die ganze Liste heraus – als CSV in eine selbst gewählte Datei
(
ACTION_CREATE_DOCUMENT, keine Speicherberechtigung nötig) oder komplett in die Zwischenablage. Die Zeitspalte heißt je nach Liste „Gehört um" bzw. „Gemerkt am"; wo ByteFM keine Sendezeit hergibt, bleibt sie leer statt erfunden. - Und zwar so, wie man will: welche Angaben in welcher Reihenfolge herauskommen, stellt man selbst ein → Titelangaben.
Titelangaben einstellen
Erreichbar über den Schieberegler-Knopf in der Kopfzeile des Hauptfensters, außerdem als Eintrag „Angaben einstellen …" im Herausgeben-Dialog und als Aktion in der Meldung nach dem Kopieren.
- Sechs Felder – Interpret, Titel, Sendung, Stream, Datum, Uhrzeit – einzeln an- und abwählbar und mit ▲▼ umsortierbar. Album und Jahr fehlen nicht aus Versehen: ByteFM gibt beides nicht heraus, die Sendung ist hier die zweite einordnende Angabe.
- Zwei getrennte Einstellungen (
Kopierformat.Zweck): eine für die Zwischenablage, eine für die CSV-Tabelle. Die eine Zeile zum Weiterschicken verträgt weniger als eine Tabellenspalte, deshalb ist das nicht eine Einstellung mit zwei Anwendungen. - Trennzeichen für die Zwischenablage:
·,–,,oder Zeilenumbruch. Bei Umbruch trennt die Liste mit einer Leerzeile, sonst liefe sie zu einem Block zusammen. - Vorschau an einem erfundenen Beispieltitel, die bei jedem Haken sofort mitzieht. Bewusst nicht der laufende Titel: der kann leer sein, und man will die Wirkung aller Felder sehen.
- Zwei Zusammenziehregeln, damit das Ergebnis lesbar bleibt: Interpret und Titel nebeneinander werden zu „Interpret – Titel" (außer bei Trenner = Umbruch), Datum und Uhrzeit nebeneinander ergeben in der Tabelle eine Spalte mit dem Kopf „Gehört um"/„Gemerkt am" – genau die Fassung, die es vor der Einstellbarkeit gab.
- Die Vorgaben bilden den Stand v1.1.1 ab: wer nichts einstellt, merkt vom Umbau nichts.
- Gespeichert wird die ganze Reihenfolge samt abgewählter Felder (
-uhrzeit), damit ein Feld beim Abwählen seinen Platz behält; beim Einlesen werden unbekannte Einträge verworfen und später hinzugekommene Felder hinten angehängt – eine alte Einstellung überlebt also ein Update, das ein Feld dazustellt.
Woher die Angaben kommen
| Stream | Mount bei uplink.byte.fm |
Titel |
|---|---|---|
| Web | bytefm-main/mp3-128 |
Website |
| Hamburg | bytefm-hamburg/mp3-128 |
Website |
| Nur Musik | bytefm-nurmusikhq/mp3-192 |
Tonstrom (ICY) |
https://www.byte.fm/ajax/song-history/liefert die letzten fünf Titel (neueste zuerst, als HTML-Zeichenketten „Interpret – Titel"), ein Künstlerbild zum laufenden Titel sowie Sendung, Untertitel, Sendezeit, Moderation und die nächste Sendung. Vor byte.fm sitzt Cloudflare — ohne Browser-Kennzeichen kommt eine Rätselseite zurück.- Es gibt keine Sendezeiten je Titel und keine Plattencover. Deshalb bekommen nachgetragene ältere Titel im Verlauf keine erfundene Uhrzeit, sondern „vorher"; als Bild dient das Künstlerfoto aus dem Discogs-Zwischenspeicher der Website.
- „Nur Musik" ist ein eigenes Programm (
icy-name: ByteFM Nur Musik HQ). Über 20 Minuten parallel mitgeschnitten: kein einziger gemeinsamer Titel mit dem Hauptprogramm, auch nicht zeitversetzt; während dort zur vollen Stunde „ByteFM – Nachrichten" lief, spielte es einfach weiter Musik. Die Website kennt es nicht, seine Titel stehen nur im Tonstrom — dort also erst beim Hören. - Nicht jeder Eintrag der Titelliste ist ein Stück: ByteFM stellt dort auch Moderationsansagen („Korridor – mit Lars Florian Walklang") und die Nachrichten („ByteFM – Nachrichten") ein. Die App zeigt sie an — es läuft ja gerade —, nimmt sie aber nicht in den Verlauf auf. Erkannt am Interpretenfeld (Sendername bzw. „ByteFM").
- Bei Web und Hamburg wird der
StreamTitleaus dem Tonstrom nicht angezeigt, sondern nur als Uhr benutzt: er stößt sofort einen Abruf an. Anzeige und Verlauf kommen so immer aus derselben Quelle.
Technik
- Media3/ExoPlayer als
MediaSessionService, plain Views + Material 3 (kein Compose). - Alle Kopfzeilen-Knöpfe tragen beim langen Druck ihren Namen (
TooltipCompat, wirkt anders alsandroid:tooltipTextauch unter Android 8). Anlass: der Pfeil des Herausgeben-Knopfes wurde für „Hochladen" gehalten — Symbole allein tragen nicht. minSdk 24,target/compile 35.- Build mit JDK 21 (Gradle 8.13):
JAVA_HOME=/usr/lib/jvm/java-21-temurin-jdk ./gradlew assembleRelease
Verteilung
Ausgeliefert über ein eigenes F-Droid-Repo, signiert mit einem gemeinsamen Release-Key. Der Debug-Keystore in build.gradle.kts dient nur dem Testen;
das echte Signieren übernimmt apk-publish.sh.