Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -708,6 +708,7 @@ set(SOURCES
src/settings/coverssettingspage.cpp
src/settings/lyricssettingspage.cpp
src/settings/networkproxysettingspage.cpp
src/settings/radiosettingspage.cpp
src/settings/appearancesettingspage.cpp
src/settings/contextsettingspage.cpp
src/settings/notificationssettingspage.cpp
Expand Down Expand Up @@ -780,6 +781,9 @@ set(SOURCES
src/radios/radiochannel.cpp
src/radios/somafmservice.cpp
src/radios/radioparadiseservice.cpp
src/radios/radiobrowserservice.cpp
src/radios/radiobrowsersearchview.cpp
src/radios/radiobrowsersearchmodel.cpp
src/radios/radiomimedata.cpp

src/scrobbler/audioscrobbler.cpp
Expand Down Expand Up @@ -1007,6 +1011,7 @@ set(HEADERS
src/settings/coverssettingspage.h
src/settings/lyricssettingspage.h
src/settings/networkproxysettingspage.h
src/settings/radiosettingspage.h
src/settings/appearancesettingspage.h
src/settings/contextsettingspage.h
src/settings/notificationssettingspage.h
Expand Down Expand Up @@ -1077,6 +1082,9 @@ set(HEADERS
src/radios/radiomimedata.h
src/radios/somafmservice.h
src/radios/radioparadiseservice.h
src/radios/radiobrowserservice.h
src/radios/radiobrowsersearchview.h
src/radios/radiobrowsersearchmodel.h

src/scrobbler/audioscrobbler.h
src/scrobbler/scrobblersettingsservice.h
Expand Down Expand Up @@ -1161,6 +1169,7 @@ set(UI
src/settings/coverssettingspage.ui
src/settings/lyricssettingspage.ui
src/settings/networkproxysettingspage.ui
src/settings/radiosettingspage.ui
src/settings/appearancesettingspage.ui
src/settings/notificationssettingspage.ui
src/settings/transcodersettingspage.ui
Expand Down Expand Up @@ -1189,6 +1198,7 @@ set(UI
src/streaming/streamingsearchview.ui

src/radios/radioviewcontainer.ui
src/radios/radiobrowsersearchview.ui

src/organize/organizedialog.ui
src/organize/organizeerrordialog.ui
Expand Down
5 changes: 5 additions & 0 deletions data/icons.qrc
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@
<file>icons/128x128/radio.png</file>
<file>icons/128x128/somafm.png</file>
<file>icons/128x128/radioparadise.png</file>
<file>icons/128x128/radiobrowser.png</file>
<file>icons/128x128/musicbrainz.png</file>
<file>icons/64x64/albums.png</file>
<file>icons/64x64/alsa.png</file>
Expand Down Expand Up @@ -196,6 +197,7 @@
<file>icons/64x64/radio.png</file>
<file>icons/64x64/somafm.png</file>
<file>icons/64x64/radioparadise.png</file>
<file>icons/64x64/radiobrowser.png</file>
<file>icons/64x64/musicbrainz.png</file>
<file>icons/48x48/albums.png</file>
<file>icons/48x48/alsa.png</file>
Expand Down Expand Up @@ -299,6 +301,7 @@
<file>icons/48x48/radio.png</file>
<file>icons/48x48/somafm.png</file>
<file>icons/48x48/radioparadise.png</file>
<file>icons/48x48/radiobrowser.png</file>
<file>icons/48x48/musicbrainz.png</file>
<file>icons/32x32/albums.png</file>
<file>icons/32x32/alsa.png</file>
Expand Down Expand Up @@ -402,6 +405,7 @@
<file>icons/32x32/radio.png</file>
<file>icons/32x32/somafm.png</file>
<file>icons/32x32/radioparadise.png</file>
<file>icons/32x32/radiobrowser.png</file>
<file>icons/32x32/musicbrainz.png</file>
<file>icons/22x22/albums.png</file>
<file>icons/22x22/alsa.png</file>
Expand Down Expand Up @@ -505,6 +509,7 @@
<file>icons/22x22/radio.png</file>
<file>icons/22x22/somafm.png</file>
<file>icons/22x22/radioparadise.png</file>
<file>icons/22x22/radiobrowser.png</file>
<file>icons/22x22/musicbrainz.png</file>
</qresource>
</RCC>
Binary file added data/icons/128x128/radiobrowser.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added data/icons/22x22/radiobrowser.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added data/icons/32x32/radiobrowser.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added data/icons/48x48/radiobrowser.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added data/icons/64x64/radiobrowser.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added data/icons/full/radiobrowser.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
34 changes: 34 additions & 0 deletions src/constants/radiobrowsersettings.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/*
* Strawberry Music Player
* Copyright 2026, Malte Zilinski <malte@zilinski.eu>
*
* Strawberry is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Strawberry is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Strawberry. If not, see <http://www.gnu.org/licenses/>.
*
*/

#ifndef RADIOBROWSERSETTINGS_H
#define RADIOBROWSERSETTINGS_H

namespace RadioBrowserSettings {

constexpr char kSettingsGroup[] = "RadioBrowser";
constexpr char kServerUrl[] = "server_url";
constexpr char kSearchLimit[] = "search_limit";
constexpr int kSearchLimitDefault = 100;
constexpr char kHideBroken[] = "hide_broken";
constexpr bool kHideBrokenDefault = true;

} // namespace RadioBrowserSettings

#endif // RADIOBROWSERSETTINGS_H
29 changes: 29 additions & 0 deletions src/constants/radioparadisesettings.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
/*
* Strawberry Music Player
* Copyright 2026, Malte Zilinski <malte@zilinski.eu>
*
* Strawberry is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Strawberry is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Strawberry. If not, see <http://www.gnu.org/licenses/>.
*
*/

#ifndef RADIOPARADISESETTINGS_H
#define RADIOPARADISESETTINGS_H

namespace RadioParadiseSettings {

constexpr char kSettingsGroup[] = "RadioParadise";

} // namespace RadioParadiseSettings

#endif // RADIOPARADISESETTINGS_H
31 changes: 31 additions & 0 deletions src/constants/somafmsettings.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/*
* Strawberry Music Player
* Copyright 2026, Malte Zilinski <malte@zilinski.eu>
*
* Strawberry is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Strawberry is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Strawberry. If not, see <http://www.gnu.org/licenses/>.
*
*/

#ifndef SOMAFMSETTINGS_H
#define SOMAFMSETTINGS_H

namespace SomaFMSettings {

constexpr char kSettingsGroup[] = "SomaFM";
constexpr char kQuality[] = "quality";
constexpr char kQualityDefault[] = "highest";

} // namespace SomaFMSettings

#endif // SOMAFMSETTINGS_H
8 changes: 8 additions & 0 deletions src/core/mainwindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,8 @@

#include "radios/radioservices.h"
#include "radios/radioviewcontainer.h"
#include "radios/radiobrowserservice.h"
#include "radios/radiobrowsersearchview.h"

#include "scrobbler/audioscrobbler.h"
#include "scrobbler/lastfmimport.h"
Expand Down Expand Up @@ -492,6 +494,11 @@ MainWindow::MainWindow(Application *app,

radio_view_->view()->setModel(app_->radio_services()->sort_model());

RadioBrowserService *radio_browser_service = qobject_cast<RadioBrowserService*>(app_->radio_services()->ServiceBySource(Song::Source::RadioBrowser));
if (radio_browser_service) {
radio_view_->search_view()->Init(radio_browser_service);
}

// Icons
qLog(Debug) << "Creating UI";

Expand Down Expand Up @@ -794,6 +801,7 @@ MainWindow::MainWindow(Application *app,
QObject::connect(radio_view_, &RadioViewContainer::Refresh, &*app_->radio_services(), &RadioServices::RefreshChannels);
QObject::connect(radio_view_->view(), &RadioView::GetChannels, &*app_->radio_services(), &RadioServices::GetChannels);
QObject::connect(radio_view_->view(), &RadioView::AddToPlaylistSignal, this, &MainWindow::AddToPlaylist);
QObject::connect(radio_view_->search_view(), &RadioBrowserSearchView::AddToPlaylist, this, &MainWindow::AddToPlaylist);

// Playlist menu
QObject::connect(playlist_menu_, &QMenu::aboutToHide, this, &MainWindow::PlaylistMenuHidden);
Expand Down
12 changes: 9 additions & 3 deletions src/core/song.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -686,7 +686,7 @@ const QString &Song::playlist_effective_albumartistsort() const { return is_comp
bool Song::is_metadata_good() const { return !d->url_.isEmpty() && !d->artist_.isEmpty() && !d->title_.isEmpty(); }
bool Song::is_local_collection_song() const { return d->source_ == Source::Collection; }
bool Song::is_linked_collection_song() const { return IsLinkedCollectionSource(d->source_); }
bool Song::is_radio() const { return d->source_ == Source::Stream || d->source_ == Source::SomaFM || d->source_ == Source::RadioParadise; }
bool Song::is_radio() const { return d->source_ == Source::Stream || d->source_ == Source::SomaFM || d->source_ == Source::RadioParadise || d->source_ == Source::RadioBrowser; }
bool Song::is_stream_service() const { return d->source_ == Source::Subsonic || d->source_ == Source::Tidal || d->source_ == Source::Qobuz || d->source_ == Source::Spotify; }
bool Song::is_stream() const { return is_radio() || is_stream_service(); }
bool Song::is_cdda() const { return d->source_ == Source::CDDA; }
Expand Down Expand Up @@ -1164,6 +1164,7 @@ QString Song::TextForSource(const Source source) {
case Source::Qobuz: return u"qobuz"_s;
case Source::SomaFM: return u"somafm"_s;
case Source::RadioParadise: return u"radioparadise"_s;
case Source::RadioBrowser: return u"radiobrowser"_s;
case Source::Unknown: return u"unknown"_s;
}
return u"unknown"_s;
Expand All @@ -1184,6 +1185,7 @@ QString Song::DescriptionForSource(const Source source) {
case Source::Qobuz: return u"Qobuz"_s;
case Source::SomaFM: return u"SomaFM"_s;
case Source::RadioParadise: return u"Radio Paradise"_s;
case Source::RadioBrowser: return u"Radio Browser"_s;
case Source::Unknown: return u"Unknown"_s;
}
return u"unknown"_s;
Expand All @@ -1203,7 +1205,7 @@ Song::Source Song::SourceFromText(const QString &source) {
if (source.compare("qobuz"_L1, Qt::CaseInsensitive) == 0) return Source::Qobuz;
if (source.compare("somafm"_L1, Qt::CaseInsensitive) == 0) return Source::SomaFM;
if (source.compare("radioparadise"_L1, Qt::CaseInsensitive) == 0) return Source::RadioParadise;

if (source.compare("radiobrowser"_L1, Qt::CaseInsensitive) == 0) return Source::RadioBrowser;
return Source::Unknown;

}
Expand All @@ -1222,6 +1224,7 @@ QIcon Song::IconForSource(const Source source) {
case Source::Qobuz: return IconLoader::Load(u"qobuz"_s);
case Source::SomaFM: return IconLoader::Load(u"somafm"_s);
case Source::RadioParadise: return IconLoader::Load(u"radioparadise"_s);
case Source::RadioBrowser: return IconLoader::Load(u"radiobrowser"_s);
case Source::Unknown: return IconLoader::Load(u"edit-delete"_s);
}
return IconLoader::Load(u"edit-delete"_s);
Expand All @@ -1238,6 +1241,7 @@ QString Song::DomainForSource(const Source source) {
case Song::Source::Qobuz: return u"qobuz.com"_s;
case Song::Source::SomaFM: return u"somafm.com"_s;
case Song::Source::RadioParadise: return u"radioparadise.com"_s;
case Song::Source::RadioBrowser: return u"radio-browser.info"_s;
case Song::Source::Spotify: return u"spotify.com"_s;
default: return QString();
}
Expand Down Expand Up @@ -1352,7 +1356,8 @@ QString Song::ShareURL() const {

switch (source()) {
case Song::Source::Stream:
case Song::Source::SomaFM: return url().toString();
case Song::Source::SomaFM:
case Song::Source::RadioBrowser: return url().toString();
case Song::Source::Tidal: return "https://tidal.com/track/%1"_L1.arg(song_id());
case Song::Source::Qobuz: return "https://open.qobuz.com/track/%1"_L1.arg(song_id());
case Song::Source::Spotify: return "https://open.spotify.com/track/%1"_L1.arg(song_id());
Expand Down Expand Up @@ -1495,6 +1500,7 @@ QString Song::ImageCacheDir(const Source source) {
case Source::Stream:
case Source::SomaFM:
case Source::RadioParadise:
case Source::RadioBrowser:
case Source::Unknown:
return StandardPaths::WritableLocation(StandardPaths::StandardLocation::AppLocalDataLocation) + u"/albumcovers"_s;
}
Expand Down
3 changes: 2 additions & 1 deletion src/core/song.h
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,8 @@ class Song {
Qobuz = 8,
SomaFM = 9,
RadioParadise = 10,
Spotify = 11
Spotify = 11,
RadioBrowser = 12
};
static const int kSourceCount = 16;

Expand Down
1 change: 1 addition & 0 deletions src/covermanager/albumcoverchoicecontroller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -583,6 +583,7 @@ void AlbumCoverChoiceController::SaveArtManualToSong(Song *song, const QUrl &art
case Song::Source::Stream:
case Song::Source::RadioParadise:
case Song::Source::SomaFM:
case Song::Source::RadioBrowser:
case Song::Source::Unknown:
break;
case Song::Source::Subsonic:
Expand Down
2 changes: 2 additions & 0 deletions src/playlist/playlistitem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ PlaylistItemPtr PlaylistItem::NewFromSource(const Song::Source source, const QUu
case Song::Source::Stream:
case Song::Source::RadioParadise:
case Song::Source::SomaFM:
case Song::Source::RadioBrowser:
return make_shared<RadioStreamPlaylistItem>(source, uuid);
case Song::Source::LocalFile:
case Song::Source::CDDA:
Expand All @@ -82,6 +83,7 @@ PlaylistItemPtr PlaylistItem::NewFromSong(const Song &song) {
case Song::Source::Stream:
case Song::Source::RadioParadise:
case Song::Source::SomaFM:
case Song::Source::RadioBrowser:
return make_shared<RadioStreamPlaylistItem>(song);
case Song::Source::LocalFile:
case Song::Source::CDDA:
Expand Down
Loading
Loading