From 39cd3e4cfeab7379af5a5c882910b1607e8e9457 Mon Sep 17 00:00:00 2001 From: Owen Rummage Date: Wed, 29 Jul 2026 03:49:50 -0500 Subject: [PATCH] add lots of features --- approot/admin-db.xml | 5 + approot/admin-internet-radio.xml | 49 +++ approot/admin-podcasts.xml | 66 ++++ approot/admin-user.xml | 13 + approot/admin-users.xml | 14 + approot/main.xml | 5 + approot/mediaplayer.xml | 5 + approot/messages.xml | 58 ++++ approot/playqueue.xml | 3 +- approot/podcasts.xml | 56 ++++ approot/release.xml | 2 + approot/releases.xml | 1 + approot/tracks.xml | 1 + conf/lms.conf | 8 +- docroot/js/mediaplayer.js | 30 +- src/libs/database/CMakeLists.txt | 2 + src/libs/database/impl/Migration.cpp | 76 ++++- src/libs/database/impl/Session.cpp | 6 + src/libs/database/impl/objects/Artist.cpp | 19 ++ .../impl/objects/InternetRadioStation.cpp | 35 +++ .../database/impl/objects/MediaLibrary.cpp | 3 + src/libs/database/impl/objects/Release.cpp | 16 + src/libs/database/impl/objects/Share.cpp | 48 +++ src/libs/database/impl/objects/Track.cpp | 15 + src/libs/database/impl/objects/TrackList.cpp | 14 + src/libs/database/impl/objects/User.cpp | 28 ++ .../include/database/objects/Filters.hpp | 8 +- .../database/objects/InternetRadioStation.hpp | 49 +++ .../objects/InternetRadioStationId.hpp | 5 + .../include/database/objects/MediaLibrary.hpp | 4 + .../include/database/objects/Share.hpp | 70 +++++ .../include/database/objects/ShareId.hpp | 5 + .../include/database/objects/TrackList.hpp | 8 + .../include/database/objects/User.hpp | 12 + src/libs/database/test/ScanSettings.cpp | 2 +- src/libs/database/test/Track.cpp | 28 +- src/libs/database/test/TrackList.cpp | 29 +- src/libs/database/test/User.cpp | 59 +++- src/libs/image/CMakeLists.txt | 2 + src/libs/image/impl/stb/Image.cpp | 28 +- src/libs/image/impl/stb/RawImage.cpp | 35 ++- .../services/podcast/impl/PodcastParsing.cpp | 9 +- .../services/podcast/impl/PodcastService.cpp | 2 +- .../impl/steps/RefreshPodcastsStep.cpp | 4 +- .../services/podcast/test/PodcastParser.cpp | 4 +- .../audiofile/TrackMetadataParser.cpp | 11 +- .../scanner/test/TrackMetadataParser.cpp | 12 + src/libs/subsonic/CMakeLists.txt | 5 +- .../impl/MusicBrainzArtistMetadata.cpp | 253 ++++++++++++++++ src/libs/subsonic/impl/RequestContext.cpp | 40 +++ src/libs/subsonic/impl/RequestContext.hpp | 4 + src/libs/subsonic/impl/SubsonicResource.cpp | 24 +- .../subsonic/impl/SubsonicResourceConfig.cpp | 3 +- .../subsonic/impl/SubsonicResourceConfig.hpp | 3 +- .../impl/endpoints/AlbumSongLists.cpp | 26 +- src/libs/subsonic/impl/endpoints/Browsing.cpp | 122 +++----- src/libs/subsonic/impl/endpoints/Browsing.hpp | 1 - .../subsonic/impl/endpoints/InternetRadio.cpp | 101 +++++++ .../subsonic/impl/endpoints/InternetRadio.hpp | 12 + .../impl/endpoints/MediaRetrieval.cpp | 13 + src/libs/subsonic/impl/endpoints/Podcast.cpp | 5 +- .../subsonic/impl/endpoints/Searching.cpp | 8 +- src/libs/subsonic/impl/endpoints/Sharing.cpp | 183 +++++++++++ src/libs/subsonic/impl/endpoints/Sharing.hpp | 12 + src/libs/subsonic/impl/responses/Podcast.cpp | 6 +- src/libs/subsonic/impl/responses/Song.cpp | 6 +- src/libs/subsonic/impl/responses/User.cpp | 12 +- .../subsonic/MusicBrainzArtistMetadata.hpp | 31 ++ src/lms/CMakeLists.txt | 5 + src/lms/PublicShareResource.cpp | 284 ++++++++++++++++++ src/lms/PublicShareResource.hpp | 19 ++ src/lms/main.cpp | 5 + src/lms/ui/LmsApplication.cpp | 13 +- src/lms/ui/MediaPlayer.cpp | 84 ++++++ src/lms/ui/MediaPlayer.hpp | 4 + src/lms/ui/PlayQueue.cpp | 190 ++++++++++-- src/lms/ui/PlayQueue.hpp | 8 +- src/lms/ui/PodcastsView.cpp | 179 +++++++++++ src/lms/ui/PodcastsView.hpp | 32 ++ src/lms/ui/ShareUtils.cpp | 106 +++++++ src/lms/ui/ShareUtils.hpp | 14 + src/lms/ui/Utils.cpp | 20 +- src/lms/ui/admin/AdminView.cpp | 4 + src/lms/ui/admin/InternetRadioView.cpp | 155 ++++++++++ src/lms/ui/admin/InternetRadioView.hpp | 31 ++ src/lms/ui/admin/PodcastsView.cpp | 218 ++++++++++++++ src/lms/ui/admin/PodcastsView.hpp | 36 +++ src/lms/ui/admin/UserView.cpp | 108 ++++++- src/lms/ui/admin/UserView.hpp | 11 + src/lms/ui/admin/UsersView.cpp | 25 +- src/lms/ui/admin/debug/Database.cpp | 23 ++ src/lms/ui/admin/debug/Database.hpp | 9 + src/lms/ui/explore/ArtistView.cpp | 3 +- src/lms/ui/explore/Filters.cpp | 58 +++- src/lms/ui/explore/Filters.hpp | 7 + src/lms/ui/explore/ReleaseHelpers.cpp | 7 + src/lms/ui/explore/ReleaseView.cpp | 10 +- src/lms/ui/explore/ReleaseView.hpp | 6 +- src/lms/ui/explore/TrackListHelpers.cpp | 6 +- src/lms/ui/resource/AudioFileResource.cpp | 28 ++ src/lms/ui/resource/AudioFileResource.hpp | 2 + 101 files changed, 3320 insertions(+), 224 deletions(-) create mode 100644 approot/admin-internet-radio.xml create mode 100644 approot/admin-podcasts.xml create mode 100644 approot/podcasts.xml create mode 100644 src/libs/database/impl/objects/InternetRadioStation.cpp create mode 100644 src/libs/database/impl/objects/Share.cpp create mode 100644 src/libs/database/include/database/objects/InternetRadioStation.hpp create mode 100644 src/libs/database/include/database/objects/InternetRadioStationId.hpp create mode 100644 src/libs/database/include/database/objects/Share.hpp create mode 100644 src/libs/database/include/database/objects/ShareId.hpp create mode 100644 src/libs/subsonic/impl/MusicBrainzArtistMetadata.cpp create mode 100644 src/libs/subsonic/impl/endpoints/InternetRadio.cpp create mode 100644 src/libs/subsonic/impl/endpoints/InternetRadio.hpp create mode 100644 src/libs/subsonic/impl/endpoints/Sharing.cpp create mode 100644 src/libs/subsonic/impl/endpoints/Sharing.hpp create mode 100644 src/libs/subsonic/include/subsonic/MusicBrainzArtistMetadata.hpp create mode 100644 src/lms/PublicShareResource.cpp create mode 100644 src/lms/PublicShareResource.hpp create mode 100644 src/lms/ui/PodcastsView.cpp create mode 100644 src/lms/ui/PodcastsView.hpp create mode 100644 src/lms/ui/ShareUtils.cpp create mode 100644 src/lms/ui/ShareUtils.hpp create mode 100644 src/lms/ui/admin/InternetRadioView.cpp create mode 100644 src/lms/ui/admin/InternetRadioView.hpp create mode 100644 src/lms/ui/admin/PodcastsView.cpp create mode 100644 src/lms/ui/admin/PodcastsView.hpp diff --git a/approot/admin-db.xml b/approot/admin-db.xml index dfba59bf..5be74893 100644 --- a/approot/admin-db.xml +++ b/approot/admin-db.xml @@ -7,6 +7,11 @@
${export-query-profiling-btn class="btn btn-primary"}
+
+ ${musicbrainz-resync-btn class="btn btn-warning"} + ${musicbrainz-resync-status} +
${tr:Lms.Admin.DebugTools.Db.musicbrainz-resync-help}
+
diff --git a/approot/admin-internet-radio.xml b/approot/admin-internet-radio.xml new file mode 100644 index 00000000..8e2e0946 --- /dev/null +++ b/approot/admin-internet-radio.xml @@ -0,0 +1,49 @@ + + + + + ${tr:Lms.Admin.InternetRadio.title} +

${tr:Lms.Admin.InternetRadio.help}

+
+
+
${name class="form-control"}
+
${stream-url class="form-control"}
+
${homepage-url class="form-control"}
+
${add-btn class="btn btn-primary"}
+
+
+ ${stations class="d-grid gap-1 mb-3 Lms-row-container"} +
+ + +
+
+
${name}
+
${stream-url}
+
${homepage-url}
+
+
${edit-btn class="btn btn-sm btn-outline-secondary border-0"}${delete-btn class="btn btn-sm btn-outline-danger border-0"}
+
+
+ + + + + + + + + +
diff --git a/approot/admin-podcasts.xml b/approot/admin-podcasts.xml new file mode 100644 index 00000000..022084f8 --- /dev/null +++ b/approot/admin-podcasts.xml @@ -0,0 +1,66 @@ + + + + + ${tr:Lms.Admin.Podcasts.podcasts} +

${tr:Lms.Admin.Podcasts.help}

+
+ ${url class="form-control"} + ${add-btn class="btn btn-primary"} +
+
+ ${refresh-btn class="btn btn-secondary"} +
+ ${podcasts class="d-grid gap-1 mb-3 Lms-row-container"} +
+ + +
+
+
${title class="d-block text-truncate"}
+
${url class="d-block text-truncate"}
+
+
${delete-btn class="btn btn-sm btn-outline-danger border-0"}
+
+
+ + + + + + + + + + +
+
+
${title}
+ ${date} +
+ ${status} + ${download-btn class="btn btn-sm btn-outline-primary"} +
+
+ +
diff --git a/approot/admin-user.xml b/approot/admin-user.xml index cb22ee10..814d0cf7 100644 --- a/approot/admin-user.xml +++ b/approot/admin-user.xml @@ -23,6 +23,15 @@ ${} +
+ + ${display-name class="form-control"} +
+ ${display-name-info} +
+
${}
${} +
+ + ${media-libraries class="d-grid gap-1"} +
${save-btn class="btn btn-primary"}
diff --git a/approot/admin-users.xml b/approot/admin-users.xml index a746adc4..0e2bd452 100644 --- a/approot/admin-users.xml +++ b/approot/admin-users.xml @@ -23,6 +23,20 @@ + + + + @@ -56,4 +57,8 @@ + + + + diff --git a/approot/messages.xml b/approot/messages.xml index 81819ddc..cc86b666 100644 --- a/approot/messages.xml +++ b/approot/messages.xml @@ -170,6 +170,9 @@ Export query profiling data Database +Resync albums from MusicBrainz +Updates MusicBrainz-tagged albums at one request per second. Albums without a MusicBrainz release ID are skipped. +{1} / {2} processed — {3} updated, {4} skipped, {5} failed PCM decoding stats @@ -187,12 +190,15 @@ Admin Delete user? Demo +Edit user Users Demo account Demo account already exists! +Display name Last login +Visible libraries User already exists! New user New user created! @@ -363,7 +369,59 @@ Play History + +Podcasts +No podcast feeds have been added yet. +← All podcasts +No episodes have been discovered yet. + Play + Download +Episode download requested. +Downloaded +Downloading +Deleting +Not downloaded + + Podcasts +Podcasts +Add an RSS feed to check it daily and automatically download new episodes. Podcast clients can manage the same feeds through the Subsonic podcast API. +https://example.com/podcast.rss +Add RSS feed +Scan for new episodes +Podcast scan started. +Enter a valid HTTP or HTTPS RSS feed URL. +Podcast feed added. Its episodes are being refreshed. +Podcast feed deleted. +Waiting for feed metadata… +Podcast episodes +Download all +All available podcast episodes were queued for download. +Close +Delete podcast feed? +The feed, downloaded episodes, and cached artwork will be removed. + + + Internet radio +Internet radio +Add live audio streams here to make them available to Subsonic-compatible players, including Supersonic. +Station name +Stream URL +Homepage URL (optional) +Station name +https://radio.example.com/live.mp3 +https://radio.example.com +Add +Radio station added. +Radio station saved. +Radio station deleted. +Edit radio station +No internet radio stations have been added yet. +No homepage +Enter a station name. +Enter valid HTTP or HTTPS URLs. +Delete radio station? +The station will no longer appear in connected Subsonic players. Method to sort artist's albums Audio These audio settings are local to your browser diff --git a/approot/playqueue.xml b/approot/playqueue.xml index 468c1c72..7400e9d1 100644 --- a/approot/playqueue.xml +++ b/approot/playqueue.xml @@ -65,7 +65,8 @@ ${more-btn data-bs-toggle="dropdown" aria-expanded="false" class="btn btn-sm btn-outline-secondary border-0"}