From 0c6cfbce75f356006ca44e2a095664c8be0a39c7 Mon Sep 17 00:00:00 2001 From: Sebastian Palencsar Date: Sat, 30 May 2026 10:11:36 +0200 Subject: [PATCH] Release 1.0.3: World Categories dashboard and localization --- CHANGELOG.md | 12 +- CMakeLists.txt | 2 +- README.md | 4 +- de.nerdbear.bearwave.metainfo.xml | 10 + screenshots/screen05.png | Bin 0 -> 96682 bytes src/main.cpp | 2 +- src/qml/Main.qml | 718 +++++++++++++++++++++--------- src/radiobackend.cpp | 124 ++++++ src/radiobackend.h | 8 + src/radiobrowser.cpp | 78 +++- src/radiobrowser.h | 4 + translations/bearwave_de.ts | 44 ++ 12 files changed, 784 insertions(+), 222 deletions(-) create mode 100644 screenshots/screen05.png diff --git a/CHANGELOG.md b/CHANGELOG.md index ec1245c..6ebf6be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,17 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased] +## [1.0.3] - 2026-05-30 + +### Added + +- Dynamic World Categories dashboard showing country flags and popular genre tags. +- Dynamic country name localization mapping for German translation support. +- Local JSON caching for countries retrieved from the Radio Browser API. + +### Changed + +- Optimized Categories view layout to prevent text clipping (dynamic grid columns and scroll margins). ## [1.0.2] - 2026-05-28 diff --git a/CMakeLists.txt b/CMakeLists.txt index a3e3071..8d03160 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.16) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) -project(bearwave VERSION 1.0.2 LANGUAGES CXX) +project(bearwave VERSION 1.0.3 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) diff --git a/README.md b/README.md index a499a83..57c0149 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@ BearWave is designed for fast station browsing, simple playback controls, favori | --- | --- | | ![Main Window](screenshots/screen01.png) | ![Station Browser](screenshots/screen02.png) | | ![About Dialog](screenshots/screen03.png) | ![Additional View](screenshots/screen04.png) | +| ![World View](screenshots/screen05.png) | | Screenshots: KDE Plasma on Linux. @@ -71,7 +72,8 @@ BearWave intentionally does not aim to be: ## Features - internet radio via the Radio Browser API with local JSON caching -- station pages for Top, Germany, Netherlands, and quick world/genre filters +- station pages for Top, Germany, Netherlands, and a dynamic World Categories dashboard +- interactive World View to search/browse stations by country flags and popular genre tags - local search and filtering by name, genre, and country - sorting by name, bitrate, and votes - favorites with persistent local storage diff --git a/de.nerdbear.bearwave.metainfo.xml b/de.nerdbear.bearwave.metainfo.xml index e68e593..5708bac 100644 --- a/de.nerdbear.bearwave.metainfo.xml +++ b/de.nerdbear.bearwave.metainfo.xml @@ -59,6 +59,16 @@ + + +
    +
  • Added dynamic World Categories dashboard showing country flags and popular genre tags
  • +
  • Added country name localization support for German systems
  • +
  • Added local API caching for countries retrieved from Radio Browser
  • +
  • Optimized Categories view layout to prevent text clipping
  • +
+
+
    diff --git a/screenshots/screen05.png b/screenshots/screen05.png new file mode 100644 index 0000000000000000000000000000000000000000..4f7b1b8b7df808f20b62a59f09c37abb6d0d7c1e GIT binary patch literal 96682 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≪ZBpKoaY+ESYUQpl+dcMV1GYrorC~zKEf{k1 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 GKKu`z=#i5E literal 0 HcmV?d00001 diff --git a/src/main.cpp b/src/main.cpp index 0a5f968..c8b6753 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -22,7 +22,7 @@ int main(int argc, char *argv[]) QApplication::setApplicationName(QStringLiteral("BearWave")); QApplication::setDesktopFileName(QStringLiteral("de.nerdbear.bearwave")); QApplication::setOrganizationName(QStringLiteral("BearWave")); - QApplication::setApplicationVersion(QStringLiteral("1.0.2")); + QApplication::setApplicationVersion(QStringLiteral("1.0.3")); QApplication app(argc, argv); diff --git a/src/qml/Main.qml b/src/qml/Main.qml index 326b0c4..6de13e8 100644 --- a/src/qml/Main.qml +++ b/src/qml/Main.qml @@ -81,6 +81,9 @@ ApplicationWindow { property bool compactMode: width < 780 property real contentOpacity: 1.0 property string activeQuickFilter: "" + property string selectedWorldCategory: "" + property string selectedWorldType: "" + property string countrySearchText: "" readonly property color bgA: "#0f141b" readonly property color bgB: "#131b25" @@ -93,11 +96,52 @@ ApplicationWindow { readonly property color textMuted: "#9eb1c9" readonly property color warn: "#ff8b8b" + readonly property var worldTags: [ + { name: qsTr("Pop"), tag: "pop", icon: "🎵" }, + { name: qsTr("Rock"), tag: "rock", icon: "🎸" }, + { name: qsTr("Electronic"), tag: "electronic", icon: "🎹" }, + { name: qsTr("Classical"), tag: "classical", icon: "🎻" }, + { name: qsTr("Jazz"), tag: "jazz", icon: "🎷" }, + { name: qsTr("Metal"), tag: "metal", icon: "🤘" }, + { name: qsTr("Hip Hop"), tag: "hiphop", icon: "🎤" }, + { name: qsTr("Chillout"), tag: "chillout", icon: "🌴" }, + { name: qsTr("News / Talk"), tag: "news", icon: "📻" }, + { name: qsTr("Soundtracks"), tag: "soundtrack", icon: "🎬" }, + { name: qsTr("Ambient"), tag: "ambient", icon: "🌌" }, + { name: qsTr("Blues / Soul"), tag: "blues", icon: "🎺" } + ] + function toast(message) { toastLabel.text = message toastPopup.open() } + function getFilteredCountries() { + if (!backend || !backend.countries) return []; + var query = countrySearchText.toLowerCase().trim(); + var list = []; + if (query === "") { + list.push({ name: qsTr("Top Global"), code: "GLOBAL" }); + } + for (var i = 0; i < backend.countries.length; i++) { + var c = backend.countries[i]; + if (query === "" || c.name.toLowerCase().indexOf(query) !== -1 || c.code.toLowerCase().indexOf(query) !== -1) { + list.push(c); + } + } + return list; + } + + function getFlagEmoji(countryCode) { + if (!countryCode || countryCode.length !== 2) return "🌎"; + var codeUpper = countryCode.toUpperCase(); + var codePoints = []; + for (var i = 0; i < codeUpper.length; i++) { + codePoints.push(127397 + codeUpper.charCodeAt(i)); + } + return String.fromCodePoint.apply(null, codePoints); + } + function activeModel() { if (!backend) { return [] @@ -106,6 +150,8 @@ ApplicationWindow { return backend.favoriteStations } else if (currentPage === "history") { return backend.recentStations + } else if (currentPage === "world" && selectedWorldCategory === "") { + return [] } else { return backend.stations } @@ -114,6 +160,11 @@ ApplicationWindow { onCurrentPageChanged: { contentOpacity = 0.85 contentFadeRestart.restart() + if (currentPage !== "world") { + selectedWorldCategory = "" + selectedWorldType = "" + countrySearchText = "" + } } Shortcut { @@ -596,7 +647,11 @@ ApplicationWindow { if (!backend) return currentPage = "world" activeQuickFilter = "world" - backend.loadWorldStations() + selectedWorldCategory = "" + selectedWorldType = "" + if (backend.countries.length === 0) { + backend.loadCountries() + } } } @@ -714,7 +769,11 @@ ApplicationWindow { if (!backend) return currentPage = "world" activeQuickFilter = "world" - backend.loadWorldStations() + selectedWorldCategory = "" + selectedWorldType = "" + if (backend.countries.length === 0) { + backend.loadCountries() + } } } } @@ -744,217 +803,84 @@ ApplicationWindow { NumberAnimation { duration: 180; easing.type: Easing.OutCubic } } - ScrollView { - id: stationScrollView + ColumnLayout { anchors.fill: parent anchors.margins: 10 - clip: true - ScrollBar.vertical.policy: ScrollBar.AlwaysOn + spacing: 10 - ListView { - id: stationList - width: stationScrollView.availableWidth - spacing: 8 - model: activeModel() - visible: count > 0 + RowLayout { + id: worldHeader + Layout.fillWidth: true + visible: currentPage === "world" && selectedWorldCategory !== "" + spacing: 12 - delegate: Rectangle { - id: stationCard - required property int index - required property var modelData + Button { + text: qsTr("← Back to Categories") + onClicked: { + selectedWorldCategory = "" + selectedWorldType = "" + } + } + + Label { + text: selectedWorldType === "country" + ? (qsTr("World > Country: ") + selectedWorldCategory) + : (qsTr("World > Genre: ") + selectedWorldCategory) + color: textMain + font.bold: true + font.pixelSize: 13 + Layout.fillWidth: true + elide: Text.ElideRight + } + } + + ScrollView { + id: stationScrollView + Layout.fillWidth: true + Layout.fillHeight: true + visible: !(currentPage === "world" && selectedWorldCategory === "") + clip: true + ScrollBar.vertical.policy: ScrollBar.AlwaysOn + + ListView { + id: stationList width: stationScrollView.availableWidth - height: compactMode ? 72 : 78 - radius: 10 + spacing: 8 + model: activeModel() + visible: count > 0 - readonly property bool isCurrent: { - if (!backend || !modelData) return false; - var currentUuid = backend.currentStationUuid; - var currentUrl = backend.currentStationUrl; - var cardUuid = modelData.uuid || ""; - var cardUrl = modelData.urlResolved || modelData.url || ""; - if (currentUuid !== "" && cardUuid !== "") { - return currentUuid === cardUuid; + delegate: Rectangle { + id: stationCard + required property int index + required property var modelData + width: stationScrollView.availableWidth + height: compactMode ? 72 : 78 + radius: 10 + + readonly property bool isCurrent: { + if (!backend || !modelData) return false; + var currentUuid = backend.currentStationUuid; + var currentUrl = backend.currentStationUrl; + var cardUuid = modelData.uuid || ""; + var cardUrl = modelData.urlResolved || modelData.url || ""; + if (currentUuid !== "" && cardUuid !== "") { + return currentUuid === cardUuid; + } + return currentUrl !== "" && currentUrl === cardUrl; } - return currentUrl !== "" && currentUrl === cardUrl; - } - readonly property bool isPlaying: isCurrent && backend && backend.player && backend.player.playing + readonly property bool isPlaying: isCurrent && backend && backend.player && backend.player.playing - color: stationCard.isCurrent - ? (cardMouse.containsMouse ? "#1d3350" : "#16283e") - : (cardMouse.containsMouse ? cardHover : card) - border.color: stationCard.isCurrent ? accent : cardBorder - border.width: stationCard.isCurrent ? 2 : 1 + color: stationCard.isCurrent + ? (cardMouse.containsMouse ? "#1d3350" : "#16283e") + : (cardMouse.containsMouse ? cardHover : card) + border.color: stationCard.isCurrent ? accent : cardBorder + border.width: stationCard.isCurrent ? 2 : 1 - MouseArea { - id: cardMouse - anchors.fill: parent - hoverEnabled: true - acceptedButtons: Qt.LeftButton - onClicked: { - if (!backend) return - if (stationCard.isCurrent) { - backend.player.togglePlayPause() - } else { - if (currentPage === "favorites") { - backend.playFavoriteStation(index) - } else if (currentPage === "history") { - backend.playRecentByUuid(modelData.uuid, modelData.urlResolved) - } else { - backend.playStation(index) - } - } - } - } - - RowLayout { - anchors.fill: parent - anchors.margins: 10 - spacing: 10 - - Rectangle { - Layout.preferredWidth: 44 - Layout.preferredHeight: 44 - radius: 8 - color: "#123154" - border.color: accent - - Image { - id: stationFavicon - anchors.fill: parent - anchors.margins: 3 - source: (stationCard.modelData.favicon && stationCard.modelData.favicon.startsWith("https://")) - ? stationCard.modelData.favicon - : "" - fillMode: Image.PreserveAspectFit - asynchronous: true - cache: true - visible: source !== "" && status === Image.Ready - } - - Image { - anchors.fill: parent - anchors.margins: 6 - source: "qrc:/assets/app/bearwave.png" - fillMode: Image.PreserveAspectFit - smooth: true - visible: !stationFavicon.visible - } - } - - ColumnLayout { - Layout.fillWidth: true - spacing: 2 - - RowLayout { - Layout.fillWidth: true - spacing: 6 - - Label { - Layout.fillWidth: true - text: stationCard.modelData.name - color: stationCard.isCurrent ? accent : textMain - font.bold: true - font.pixelSize: compactMode ? 13 : 14 - elide: Text.ElideRight - } - - Row { - id: eqAnimation - spacing: 2 - Layout.alignment: Qt.AlignVCenter - visible: stationCard.isPlaying - - Rectangle { - id: bar1 - width: 2 - height: 12 - color: accent - radius: 1 - Behavior on height { - NumberAnimation { duration: 120 } - } - } - Rectangle { - id: bar2 - width: 2 - height: 12 - color: accent - radius: 1 - Behavior on height { - NumberAnimation { duration: 120 } - } - } - Rectangle { - id: bar3 - width: 2 - height: 12 - color: accent - radius: 1 - Behavior on height { - NumberAnimation { duration: 120 } - } - } - - Timer { - interval: 150 - running: stationCard.isPlaying - repeat: true - onTriggered: { - bar1.height = Math.floor(Math.random() * 11) + 3 - bar2.height = Math.floor(Math.random() * 11) + 3 - bar3.height = Math.floor(Math.random() * 11) + 3 - } - } - - onVisibleChanged: { - if (!visible) { - bar1.height = 12 - bar2.height = 12 - bar3.height = 12 - } - } - } - } - - Label { - Layout.fillWidth: true - text: stationCard.modelData.country + " • " - + (stationCard.modelData.codec && stationCard.modelData.codec !== "unknown" && stationCard.modelData.codec !== "" ? stationCard.modelData.codec.toUpperCase() + " • " : "") - + (stationCard.modelData.bitrate > 0 ? stationCard.modelData.bitrate + " kbps" : qsTr("Stream")) - color: textMuted - font.pixelSize: 11 - elide: Text.ElideRight - } - } - - Button { - visible: !stationCard.modelData.uuid - Layout.preferredWidth: compactMode ? 34 : 40 - Layout.preferredHeight: 40 - text: "✏" - ToolTip.visible: hovered - ToolTip.text: qsTr("Edit Station") - onClicked: { - editDialog.stationObject = stationCard.modelData - editDialog.setupAndOpen() - } - } - - Button { - Layout.preferredWidth: compactMode ? 34 : 40 - Layout.preferredHeight: 40 - text: stationCard.modelData.isFavorite ? "★" : "☆" - onClicked: { - if (!backend) return - backend.toggleFavoriteById(stationCard.modelData.uuid, stationCard.modelData.urlResolved) - toast(stationCard.modelData.isFavorite ? qsTr("Removed from favorites") : qsTr("Added to favorites")) - } - } - - Button { - Layout.preferredWidth: compactMode ? 34 : 40 - Layout.preferredHeight: 40 - text: (stationCard.isCurrent && backend && backend.player && backend.player.playing) ? "⏸" : "▶" + MouseArea { + id: cardMouse + anchors.fill: parent + hoverEnabled: true + acceptedButtons: Qt.LeftButton onClicked: { if (!backend) return if (stationCard.isCurrent) { @@ -970,15 +896,395 @@ ApplicationWindow { } } } + + RowLayout { + anchors.fill: parent + anchors.margins: 10 + spacing: 10 + + Rectangle { + Layout.preferredWidth: 44 + Layout.preferredHeight: 44 + radius: 8 + color: "#123154" + border.color: accent + + Image { + id: stationFavicon + anchors.fill: parent + anchors.margins: 3 + source: (stationCard.modelData.favicon && stationCard.modelData.favicon.startsWith("https://")) + ? stationCard.modelData.favicon + : "" + fillMode: Image.PreserveAspectFit + asynchronous: true + cache: true + visible: source !== "" && status === Image.Ready + } + + Image { + anchors.fill: parent + anchors.margins: 6 + source: "qrc:/assets/app/bearwave.png" + fillMode: Image.PreserveAspectFit + smooth: true + visible: !stationFavicon.visible + } + } + + ColumnLayout { + Layout.fillWidth: true + spacing: 2 + + RowLayout { + Layout.fillWidth: true + spacing: 6 + + Label { + Layout.fillWidth: true + text: stationCard.modelData.name + color: stationCard.isCurrent ? accent : textMain + font.bold: true + font.pixelSize: compactMode ? 13 : 14 + elide: Text.ElideRight + } + + Row { + id: eqAnimation + spacing: 2 + Layout.alignment: Qt.AlignVCenter + visible: stationCard.isPlaying + + Rectangle { + id: bar1 + width: 2 + height: 12 + color: accent + radius: 1 + Behavior on height { + NumberAnimation { duration: 120 } + } + } + Rectangle { + id: bar2 + width: 2 + height: 12 + color: accent + radius: 1 + Behavior on height { + NumberAnimation { duration: 120 } + } + } + Rectangle { + id: bar3 + width: 2 + height: 12 + color: accent + radius: 1 + Behavior on height { + NumberAnimation { duration: 120 } + } + } + + Timer { + interval: 150 + running: stationCard.isPlaying + repeat: true + onTriggered: { + bar1.height = Math.floor(Math.random() * 11) + 3 + bar2.height = Math.floor(Math.random() * 11) + 3 + bar3.height = Math.floor(Math.random() * 11) + 3 + } + } + + onVisibleChanged: { + if (!visible) { + bar1.height = 12 + bar2.height = 12 + bar3.height = 12 + } + } + } + } + + Label { + Layout.fillWidth: true + text: stationCard.modelData.country + " • " + + (stationCard.modelData.codec && stationCard.modelData.codec !== "unknown" && stationCard.modelData.codec !== "" ? stationCard.modelData.codec.toUpperCase() + " • " : "") + + (stationCard.modelData.bitrate > 0 ? stationCard.modelData.bitrate + " kbps" : qsTr("Stream")) + color: textMuted + font.pixelSize: 11 + elide: Text.ElideRight + } + } + + Button { + visible: !stationCard.modelData.uuid + Layout.preferredWidth: compactMode ? 34 : 40 + Layout.preferredHeight: 40 + text: "✏" + ToolTip.visible: hovered + ToolTip.text: qsTr("Edit Station") + onClicked: { + editDialog.stationObject = stationCard.modelData + editDialog.setupAndOpen() + } + } + + Button { + Layout.preferredWidth: compactMode ? 34 : 40 + Layout.preferredHeight: 40 + text: stationCard.modelData.isFavorite ? "★" : "☆" + onClicked: { + if (!backend) return + backend.toggleFavoriteById(stationCard.modelData.uuid, stationCard.modelData.urlResolved) + toast(stationCard.modelData.isFavorite ? qsTr("Removed from favorites") : qsTr("Added to favorites")) + } + } + + Button { + Layout.preferredWidth: compactMode ? 34 : 40 + Layout.preferredHeight: 40 + text: (stationCard.isCurrent && backend && backend.player && backend.player.playing) ? "⏸" : "▶" + onClicked: { + if (!backend) return + if (stationCard.isCurrent) { + backend.player.togglePlayPause() + } else { + if (currentPage === "favorites") { + backend.playFavoriteStation(index) + } else if (currentPage === "history") { + backend.playRecentByUuid(modelData.uuid, modelData.urlResolved) + } else { + backend.playStation(index) + } + } + } + } + } } } - } + } + + ScrollView { + id: categoriesScrollView + Layout.fillWidth: true + Layout.fillHeight: true + visible: currentPage === "world" && selectedWorldCategory === "" + clip: true + ScrollBar.vertical.policy: ScrollBar.AsNeeded + + Column { + width: categoriesScrollView.availableWidth - 12 + spacing: 16 + + RowLayout { + width: parent.width + spacing: 10 + + Label { + text: qsTr("Explore World Stations") + font.bold: true + font.pixelSize: 16 + color: textMain + Layout.fillWidth: true + } + + TextField { + id: countryFilterInput + placeholderText: qsTr("Filter countries...") + font.pixelSize: 11 + Layout.preferredWidth: compactMode ? 140 : 200 + text: countrySearchText + onTextChanged: countrySearchText = text + } + } + + Label { + text: qsTr("Choose a country or music style to find radio stations from all over the world.") + font.pixelSize: 11 + color: textMuted + wrapMode: Text.WordWrap + width: parent.width + visible: countrySearchText === "" + } + + Rectangle { + width: parent.width + height: 1 + color: cardBorder + opacity: 0.4 + visible: countrySearchText === "" + } + + Label { + text: countrySearchText === "" ? qsTr("Countries") : qsTr("Filtered Countries") + font.bold: true + font.pixelSize: 13 + color: accent + } + + Flow { + id: countryFlow + width: parent.width + spacing: 8 + + Repeater { + model: getFilteredCountries() + delegate: Rectangle { + id: countryCard + width: compactMode ? (countryFlow.width - 8) / 2 : (countryFlow.width - 16) / 3 + height: 62 + radius: 8 + color: countryMouse.containsMouse ? cardHover : card + border.color: countryMouse.containsMouse ? accent : cardBorder + border.width: 1 + scale: countryMouse.containsMouse ? 1.02 : 1.0 + + Behavior on color { ColorAnimation { duration: 100 } } + Behavior on border.color { ColorAnimation { duration: 100 } } + Behavior on scale { NumberAnimation { duration: 100; easing.type: Easing.OutQuad } } + + MouseArea { + id: countryMouse + anchors.fill: parent + hoverEnabled: true + onClicked: { + selectedWorldCategory = modelData.name + selectedWorldType = "country" + if (modelData.code === "GLOBAL") { + backend.loadWorldStations() + } else { + backend.loadByCountryCode(modelData.code) + } + } + } + + Row { + anchors.fill: parent + anchors.leftMargin: 12 + anchors.rightMargin: 12 + spacing: 12 + + Label { + text: modelData.code === "GLOBAL" ? "🌎" : getFlagEmoji(modelData.code) + font.pixelSize: 26 + anchors.verticalCenter: parent.verticalCenter + } + + Column { + width: parent.width - 38 // 26 (emoji) + 12 (spacing) + anchors.verticalCenter: parent.verticalCenter + spacing: 2 + + Label { + width: parent.width + text: modelData.name + color: textMain + font.bold: true + font.pixelSize: 13 + elide: Text.ElideRight + } + + Label { + width: parent.width + text: modelData.code === "GLOBAL" ? qsTr("Top 200") : + (modelData.count ? modelData.count + " " + qsTr("stations") : modelData.code) + color: textMuted + font.pixelSize: 10 + elide: Text.ElideRight + } + } + } + } + } + } + + Column { + width: parent.width + spacing: 16 + visible: countrySearchText === "" + + Rectangle { + width: parent.width + height: 1 + color: cardBorder + opacity: 0.4 + } + + Label { + text: qsTr("Popular Music Styles") + font.bold: true + font.pixelSize: 13 + color: accent + } + + Flow { + id: tagFlow + width: parent.width + spacing: 8 + + Repeater { + model: worldTags + delegate: Rectangle { + id: tagCard + width: compactMode ? (tagFlow.width - 8) / 2 : (tagFlow.width - 16) / 3 + height: 54 + radius: 8 + color: tagMouse.containsMouse ? cardHover : card + border.color: tagMouse.containsMouse ? accent : cardBorder + border.width: 1 + scale: tagMouse.containsMouse ? 1.02 : 1.0 + + Behavior on color { ColorAnimation { duration: 100 } } + Behavior on border.color { ColorAnimation { duration: 100 } } + Behavior on scale { NumberAnimation { duration: 100; easing.type: Easing.OutQuad } } + + MouseArea { + id: tagMouse + anchors.fill: parent + hoverEnabled: true + onClicked: { + selectedWorldCategory = modelData.name + selectedWorldType = "tag" + backend.loadByTag(modelData.tag) + } + } + + Row { + anchors.fill: parent + anchors.leftMargin: 12 + anchors.rightMargin: 12 + spacing: 12 + + Label { + text: modelData.icon + font.pixelSize: 22 + anchors.verticalCenter: parent.verticalCenter + } + + Label { + width: parent.width - 34 // 22 (icon) + 12 (spacing) + text: modelData.name + color: textMain + font.bold: true + font.pixelSize: 13 + elide: Text.ElideRight + anchors.verticalCenter: parent.verticalCenter + } + } + } + } + } + } + } + } } Column { anchors.centerIn: parent spacing: 8 - visible: stationList.count === 0 + visible: stationList.count === 0 && !(currentPage === "world" && selectedWorldCategory === "") Label { text: currentPage === "history" ? qsTr("No playback history") : qsTr("No stations loaded yet") diff --git a/src/radiobackend.cpp b/src/radiobackend.cpp index 96f0331..9a7b6bf 100644 --- a/src/radiobackend.cpp +++ b/src/radiobackend.cpp @@ -11,6 +11,7 @@ #include #include #include +#include namespace { constexpr int kRecentLimit = 20; @@ -53,6 +54,8 @@ void RadioBackend::setupConnections() { connect(m_radioBrowser, &RadioBrowser::stationsLoaded, this, &RadioBackend::onStationsLoaded); + connect(m_radioBrowser, &RadioBrowser::countriesLoaded, + this, &RadioBackend::onCountriesLoaded); connect(m_radioBrowser, &RadioBrowser::error, this, [this](const QString &error) { qWarning() << "RadioBrowser error:" << error; @@ -128,6 +131,30 @@ void RadioBackend::loadWorldStations() m_radioBrowser->getWorldStations(200); } +void RadioBackend::loadCountries() +{ + setLoading(true); + m_radioBrowser->getCountries(); +} + +void RadioBackend::onCountriesLoaded(const QVariantList &countries) +{ + m_countries.clear(); + for (const QVariant &item : countries) { + QVariantMap map = item.toMap(); + QString code = map["code"].toString(); + QString englishName = map["name"].toString(); + map["name"] = localizeCountry(code, englishName); + m_countries.append(map); + } + + std::sort(m_countries.begin(), m_countries.end(), [](const QVariant &a, const QVariant &b) { + return QString::localeAwareCompare(a.toMap()["name"].toString(), b.toMap()["name"].toString()) < 0; + }); + emit countriesChanged(); + setLoading(false); +} + void RadioBackend::loadByTag(const QString &tag) { if (tag.trimmed().isEmpty()) { @@ -794,3 +821,100 @@ bool RadioBackend::matchesStation(const RadioStation *station, const QString &uu } return false; } + +QString RadioBackend::localizeCountry(const QString &code, const QString &englishName) +{ + QLocale locale; + if (locale.language() != QLocale::German) { + return englishName; + } + + static const QHash germanCountries = { + {"AD", "Andorra"}, {"AE", "Vereinigte Arabische Emirate"}, {"AF", "Afghanistan"}, + {"AG", "Antigua und Barbuda"}, {"AI", "Anguilla"}, {"AL", "Albanien"}, + {"AM", "Armenien"}, {"AO", "Angola"}, {"AQ", "Antarktis"}, {"AR", "Argentinien"}, + {"AS", "Amerikanisch-Samoa"}, {"AT", "Österreich"}, {"AU", "Australien"}, + {"AW", "Aruba"}, {"AX", "Åland-Inseln"}, {"AZ", "Aserbaidschan"}, + {"BA", "Bosnien und Herzegowina"}, {"BB", "Barbados"}, {"BD", "Bangladesch"}, + {"BE", "Belgien"}, {"BF", "Burkina Faso"}, {"BG", "Bulgarien"}, + {"BH", "Bahrain"}, {"BI", "Burundi"}, {"BJ", "Benin"}, + {"BL", "St. Bartholomäus"}, {"BM", "Bermuda"}, {"BN", "Brunei"}, + {"BO", "Bolivien"}, {"BQ", "Bonaire"}, {"BR", "Brasilien"}, + {"BS", "Bahamas"}, {"BT", "Bhutan"}, {"BV", "Bouvetinsel"}, + {"BW", "Botswana"}, {"BY", "Belarus"}, {"BZ", "Belize"}, + {"CA", "Kanada"}, {"CC", "Kokosinseln"}, {"CD", "Kongo-Kinshasa"}, + {"CF", "Zentralafrikanische Republik"}, {"CG", "Kongo-Brazzaville"}, {"CH", "Schweiz"}, + {"CI", "Elfenbeinküste"}, {"CK", "Cookinseln"}, {"CL", "Chile"}, + {"CM", "Kamerun"}, {"CN", "China"}, {"CO", "Kolumbien"}, + {"CR", "Costa Rica"}, {"CU", "Kuba"}, {"CV", "Cabo Verde"}, + {"CW", "Curaçao"}, {"CX", "Weihnachtsinsel"}, {"CY", "Zypern"}, + {"CZ", "Tschechien"}, {"DE", "Deutschland"}, {"DJ", "Dschibuti"}, + {"DK", "Dänemark"}, {"DM", "Dominica"}, {"DO", "Dominikanische Republik"}, + {"DZ", "Algerien"}, {"EC", "Ecuador"}, {"EE", "Estland"}, + {"EG", "Ägypten"}, {"EH", "Westsahara"}, {"ER", "Eritrea"}, + {"ES", "Spanien"}, {"ET", "Äthiopien"}, {"FI", "Finnland"}, + {"FJ", "Fidschi"}, {"FK", "Falklandinseln"}, {"FM", "Mikronesien"}, + {"FO", "Färöer"}, {"FR", "Frankreich"}, {"GA", "Gabun"}, + {"GB", "Großbritannien"}, {"GD", "Grenada"}, {"GE", "Georgien"}, + {"GF", "Französisch-Guayana"}, {"GG", "Guernsey"}, {"GH", "Ghana"}, + {"GI", "Gibraltar"}, {"GL", "Grönland"}, {"GM", "Gambia"}, + {"GN", "Guinea"}, {"GP", "Guadeloupe"}, {"GQ", "Äquatorialguinea"}, + {"GR", "Griechenland"}, {"GS", "Südgeorgien"}, {"GT", "Guatemala"}, + {"GU", "Guam"}, {"GW", "Guinea-Bissau"}, {"GY", "Guyana"}, + {"HK", "Hongkong"}, {"HM", "Heard und McDonaldinseln"}, {"HN", "Honduras"}, + {"HR", "Kroatien"}, {"HT", "Haiti"}, {"HU", "Ungarn"}, + {"ID", "Indonesien"}, {"IE", "Irland"}, {"IL", "Israel"}, + {"IM", "Isle of Man"}, {"IN", "Indien"}, {"IO", "Britisches Territorium im Indischen Ozean"}, + {"IQ", "Irak"}, {"IR", "Iran"}, {"IS", "Island"}, + {"IT", "Italien"}, {"JE", "Jersey"}, {"JM", "Jamaika"}, + {"JO", "Jordanien"}, {"JP", "Japan"}, {"KE", "Kenia"}, + {"KG", "Kirgisistan"}, {"KH", "Kambodscha"}, {"KI", "Kiribati"}, + {"KM", "Komoren"}, {"KN", "St. Kitts und Nevis"}, {"KP", "Nordkorea"}, + {"KR", "Südkorea"}, {"KW", "Kuwait"}, {"KY", "Kaimaninseln"}, + {"KZ", "Kasachstan"}, {"LA", "Laos"}, {"LB", "Libanon"}, + {"LC", "St. Lucia"}, {"LI", "Liechtenstein"}, {"LK", "Sri Lanka"}, + {"LR", "Liberia"}, {"LS", "Lesotho"}, {"LT", "Litauen"}, + {"LU", "Luxemburg"}, {"LV", "Lettland"}, {"LY", "Libyen"}, + {"MA", "Marokko"}, {"MC", "Monaco"}, {"MD", "Moldawien"}, + {"ME", "Montenegro"}, {"MF", "St. Martin"}, {"MG", "Madagaskar"}, + {"MH", "Marshallinseln"}, {"MK", "Nordmazedonien"}, {"ML", "Mali"}, + {"MM", "Myanmar"}, {"MN", "Mongolei"}, {"MO", "Macau"}, + {"MP", "Nördliche Marianen"}, {"MQ", "Martinique"}, {"MR", "Mauretanien"}, + {"MS", "Montserrat"}, {"MT", "Malta"}, {"MU", "Mauritius"}, + {"MV", "Malediven"}, {"MW", "Malawi"}, {"MX", "Mexiko"}, + {"MY", "Malaysia"}, {"MZ", "Mosambik"}, {"NA", "Namibia"}, + {"NC", "Neukaledonien"}, {"NE", "Niger"}, {"NF", "Norfolkinsel"}, + {"NG", "Nigeria"}, {"NI", "Nicaragua"}, {"NL", "Niederlande"}, + {"NO", "Norwegen"}, {"NP", "Nepal"}, {"NR", "Nauru"}, + {"NU", "Niue"}, {"NZ", "Neuseeland"}, {"OM", "Oman"}, + {"PA", "Panama"}, {"PE", "Peru"}, {"PF", "Französisch-Polynesien"}, + {"PG", "Papua-Neuguinea"}, {"PH", "Philippinen"}, {"PK", "Pakistan"}, + {"PL", "Polen"}, {"PM", "St. Pierre und Miquelon"}, {"PN", "Pitcairninseln"}, + {"PR", "Puerto Rico"}, {"PS", "Palästina"}, {"PT", "Portugal"}, + {"PW", "Palau"}, {"PY", "Paraguay"}, {"QA", "Katar"}, + {"RE", "Réunion"}, {"RO", "Rumänien"}, {"RS", "Serbien"}, + {"RU", "Russland"}, {"RW", "Ruanda"}, {"SA", "Saudi-Arabien"}, + {"SB", "Salomonen"}, {"SC", "Seychellen"}, {"SD", "Sudan"}, + {"SE", "Schweden"}, {"SG", "Singapur"}, {"SH", "St. Helena"}, + {"SI", "Slowenien"}, {"SJ", "Svalbard und Jan Mayen"}, {"SK", "Slowakei"}, + {"SL", "Sierra Leone"}, {"SM", "San Marino"}, {"SN", "Senegal"}, + {"SO", "Somalia"}, {"SR", "Suriname"}, {"SS", "Südsudan"}, + {"ST", "São Tomé und Príncipe"}, {"SV", "El Salvador"}, {"SX", "Sint Maarten"}, + {"SY", "Syrien"}, {"SZ", "Eswatini"}, {"TC", "Turks- und Caicosinseln"}, + {"TD", "Tschad"}, {"TF", "Französische Süd- und Antarktisgebiete"}, {"TG", "Togo"}, + {"TH", "Thailand"}, {"TJ", "Tadschikistan"}, {"TK", "Tokelau"}, + {"TL", "Osttimor"}, {"TM", "Turkmenistan"}, {"TN", "Tunesien"}, + {"TO", "Tonga"}, {"TR", "Türkei"}, {"TT", "Trinidad und Tobago"}, + {"TV", "Tuvalu"}, {"TW", "Taiwan"}, {"TZ", "Tansania"}, + {"UA", "Ukraine"}, {"UG", "Uganda"}, {"UM", "Amerikanische Überseeinseln"}, + {"US", "Vereinigte Staaten"}, {"UY", "Uruguay"}, {"UZ", "Usbekistan"}, + {"VA", "Vatikanstadt"}, {"VC", "St. Vincent und die Grenadinen"}, {"VE", "Venezuela"}, + {"VG", "Britische Jungferninseln"}, {"VI", "Amerikanische Jungferninseln"}, {"VN", "Vietnam"}, + {"VU", "Vanuatu"}, {"WF", "Wallis und Futuna"}, {"WS", "Samoa"}, + {"YE", "Jemen"}, {"YT", "Mayotte"}, {"ZA", "Südafrika"}, + {"ZM", "Sambia"}, {"ZW", "Simbabwe"} + }; + + QString result = germanCountries.value(code.toUpper()); + return result.isEmpty() ? englishName : result; +} diff --git a/src/radiobackend.h b/src/radiobackend.h index 12b01f1..1455d01 100644 --- a/src/radiobackend.h +++ b/src/radiobackend.h @@ -31,6 +31,7 @@ class RadioBackend : public QObject Q_PROPERTY(QString currentStationUuid READ currentStationUuid NOTIFY currentStationChanged) Q_PROPERTY(QString currentStationUrl READ currentStationUrl NOTIFY currentStationChanged) Q_PROPERTY(QObject* currentStation READ currentStation NOTIFY currentStationChanged) + Q_PROPERTY(QVariantList countries READ countries NOTIFY countriesChanged) public: explicit RadioBackend(QObject *parent = nullptr); @@ -54,6 +55,7 @@ public: Q_INVOKABLE void loadDutchStations(); Q_INVOKABLE void loadTopStations(); Q_INVOKABLE void loadWorldStations(); + Q_INVOKABLE void loadCountries(); Q_INVOKABLE void loadByTag(const QString &tag); Q_INVOKABLE void loadByCountryCode(const QString &countryCode); Q_INVOKABLE void searchStations(const QString &query); @@ -74,6 +76,8 @@ public: Q_INVOKABLE bool playFavoriteByUuid(const QString &uuid, const QString &urlResolved = QString()); Q_INVOKABLE void resumeLastStation(); + QVariantList countries() const { return m_countries; } + signals: void stationsChanged(); void favoritesChanged(); @@ -84,9 +88,11 @@ signals: void filterQueryChanged(); void currentStationChanged(); void raiseRequested(); + void countriesChanged(); private slots: void onStationsLoaded(const QList &stations); + void onCountriesLoaded(const QVariantList &countries); private: RadioBrowser *m_radioBrowser = nullptr; @@ -104,6 +110,7 @@ private: QVariantList m_recentStations; QString m_currentStationUuid; QString m_currentStationUrl; + QVariantList m_countries; void setupConnections(); void loadFavorites(); @@ -119,6 +126,7 @@ private: void playCurrentSelection(); static QVariantMap toVariantMap(const RadioStation *station); static bool matchesStation(const RadioStation *station, const QString &uuid, const QString &urlResolved); + static QString localizeCountry(const QString &code, const QString &englishName); }; #endif diff --git a/src/radiobrowser.cpp b/src/radiobrowser.cpp index 6b6361e..8e77d37 100644 --- a/src/radiobrowser.cpp +++ b/src/radiobrowser.cpp @@ -77,6 +77,11 @@ void RadioBrowser::getDutchStations() makeRequest(endpoint); } +void RadioBrowser::getCountries() +{ + makeRequest("/countries"); +} + void RadioBrowser::makeRequest(const QString &endpoint) { const QString cacheDir = apiCacheDir(); @@ -87,9 +92,16 @@ void RadioBrowser::makeRequest(const QString &endpoint) QFile cacheFile(cachePath); if (cacheFile.exists() && cacheFile.open(QIODevice::ReadOnly)) { QByteArray cachedData = cacheFile.readAll(); - QList stations = parseJsonResponse(cachedData); - if (!stations.isEmpty()) { - emit stationsLoaded(stations); + if (endpoint == "/countries") { + QVariantList list = parseCountriesJson(cachedData); + if (!list.isEmpty()) { + emit countriesLoaded(list); + } + } else { + QList stations = parseJsonResponse(cachedData); + if (!stations.isEmpty()) { + emit stationsLoaded(stations); + } } cacheFile.close(); } @@ -122,19 +134,61 @@ void RadioBrowser::onReplyFinished() } QByteArray data = reply->readAll(); - QList stations = parseJsonResponse(data); - QString cachePath = reply->property("cachePath").toString(); - if (!cachePath.isEmpty() && !stations.isEmpty()) { - QFile file(cachePath); - if (file.open(QIODevice::WriteOnly)) { - file.write(data); - file.close(); + + if (reply->url().path().endsWith("/countries")) { + QVariantList list = parseCountriesJson(data); + if (!cachePath.isEmpty() && !list.isEmpty()) { + QFile file(cachePath); + if (file.open(QIODevice::WriteOnly)) { + file.write(data); + file.close(); + } + } + emit countriesLoaded(list); + } else { + QList stations = parseJsonResponse(data); + if (!cachePath.isEmpty() && !stations.isEmpty()) { + QFile file(cachePath); + if (file.open(QIODevice::WriteOnly)) { + file.write(data); + file.close(); + } + } + emit stationsLoaded(stations); + } + reply->deleteLater(); +} + +QVariantList RadioBrowser::parseCountriesJson(const QByteArray &jsonData) +{ + QVariantList countries; + QJsonDocument doc = QJsonDocument::fromJson(jsonData); + if (!doc.isArray()) { + return countries; + } + + QJsonArray array = doc.array(); + for (const QJsonValue &value : array) { + if (value.isObject()) { + QJsonObject obj = value.toObject(); + QString name = obj.value("name").toString(); + QString code = obj.value("iso_3166_1").toString(); + int count = obj.value("stationcount").toInt(); + + if (name.isEmpty() || code.isEmpty() || count <= 0) { + continue; + } + + QVariantMap map; + map["name"] = name; + map["code"] = code; + map["count"] = count; + countries.append(map); } } - emit stationsLoaded(stations); - reply->deleteLater(); + return countries; } QList RadioBrowser::parseJsonResponse(const QByteArray &jsonData) diff --git a/src/radiobrowser.h b/src/radiobrowser.h index dfdadfe..520c2f4 100644 --- a/src/radiobrowser.h +++ b/src/radiobrowser.h @@ -8,6 +8,7 @@ #include #include #include +#include #include "radiostation.h" @@ -25,9 +26,11 @@ public: void getWorldStations(int count = 200); void getGermanStations(); void getDutchStations(); + void getCountries(); signals: void stationsLoaded(const QList &stations); + void countriesLoaded(const QVariantList &countries); void error(const QString &message); private slots: @@ -39,6 +42,7 @@ private: void makeRequest(const QString &endpoint); QList parseJsonResponse(const QByteArray &jsonData); + QVariantList parseCountriesJson(const QByteArray &jsonData); }; #endif diff --git a/translations/bearwave_de.ts b/translations/bearwave_de.ts index 4929b4c..771af49 100644 --- a/translations/bearwave_de.ts +++ b/translations/bearwave_de.ts @@ -223,6 +223,50 @@ Play some stations to build history Spiele Sender ab, um einen Verlauf aufzubauen + + ← Back to Categories + ← Zurück zu den Kategorien + + + World > Country: + Welt > Land: + + + World > Genre: + Welt > Genre: + + + Explore World Stations + Weltweite Sender entdecken + + + Filter countries... + Länder filtern... + + + Choose a country or music style to find radio stations from all over the world. + Wähle ein Land oder eine Musikrichtung, um Radiosender aus der ganzen Welt zu finden. + + + Countries + Länder + + + Filtered Countries + Gefilterte Länder + + + Popular Music Styles + Beliebte Musikrichtungen + + + Top Global + Weltweite Top-Sender + + + stations + Sender + RadioBackend