Skip to content

Commit 9ba7966

Browse files
committed
Merge branch 'develop' for release v3.62.1
2 parents fcc5798 + 2899db7 commit 9ba7966

17 files changed

Lines changed: 103 additions & 49 deletions

README.md

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,21 @@ _LMS_ is a self-hosted music streaming software: access your music collection fr
77
A [demo instance](http://lms-demo.poupon.dev) is available. Note the administration settings are not available.
88

99
## Main features
10-
* Recommendation engine
10+
* [Subsonic/OpenSubsonic API](SUBSONIC.md) support
1111
* Multi-valued tags: `genre`, `mood`, `artists`, ...
1212
* Artist relationships: `composer`, `conductor`, `lyricist`, `mixer`, `performer`, `producer`, `remixer`
1313
* [Release types](https://musicbrainz.org/doc/Release_Group/Type): `album`, `single`, `EP`, `compilation`, `live`, ...
1414
* [MusicBrainz Identifier](https://musicbrainz.org/doc/MusicBrainz_Identifier) support to handle duplicated artist and release names
1515
* [ListenBrainz](https://listenbrainz.org) support for:
1616
* Scrobbling and synchronizing listens
1717
* Synchronizing 'love' feedbacks
18-
* Audio transcoding for maximum interoperability and reduced bandwith requirements
18+
* Recommendation engine
1919
* Multi-library support
2020
* ReplayGain support
21+
* Audio transcoding for compatibility and reduced bandwidth
2122
* User management, with several [authentication backends](INSTALL.md#authentication-backend)
22-
* [Subsonic/OpenSubsonic API](SUBSONIC.md) support
23+
* Playlists support
24+
* Lyrics support
2325

2426
## Music discovery
2527
_LMS_ provides several ways to help you find the music you like:
@@ -57,6 +59,12 @@ $setmulti(albumartists,%_albumartists%)
5759
$setmulti(albumartistssort,%_albumartists_sort%)
5860
```
5961

62+
## Playlist support
63+
_LMS_ supports playlist files in `m3u` and `m3u8` formats. These playlists are synced during the scan process and are available as public shared playlists.
64+
65+
## Lyrics support
66+
_LMS_ supports lyrics in `lrc` files and embedded track metadata. Both synchronized and unsynchronized lyrics are supported.
67+
6068
## Keyboard shortcuts
6169
* Play/pause: <kbd>Space</kbd>
6270
* Previous track: <kbd>Ctrl</kbd> + <kbd>Left</kbd>

src/libs/database/impl/Track.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ namespace lms::db
195195
break;
196196
case TrackSortMethod::TrackList:
197197
assert(params.trackList.isValid());
198-
query.orderBy("t_l.id");
198+
query.orderBy("t_l_e.id");
199199
}
200200

201201
return query;

src/libs/metadata/impl/PlayList.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ namespace lms::metadata
2828
{
2929
std::span<const std::filesystem::path> getSupportedPlayListFileExtensions()
3030
{
31-
static const std::array<std::filesystem::path, 2> fileExtensions{ ".m3u", "m3u8" };
31+
static const std::array<std::filesystem::path, 2> fileExtensions{ ".m3u", ".m3u8" };
3232
return fileExtensions;
3333
}
3434

src/libs/services/scanner/impl/scanners/AudioFileScanner.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,7 @@ namespace lms::scanner
325325
AudioFileScanOperation& operator=(const AudioFileScanOperation&) = delete;
326326

327327
private:
328+
const std::filesystem::path& getFile() const override { return _file; };
328329
core::LiteralString getName() const override { return "ScanAudioFile"; }
329330
void scan() override;
330331
void processResult(ScanContext& context) override;
@@ -603,6 +604,11 @@ namespace lms::scanner
603604

604605
AudioFileScanner::~AudioFileScanner() = default;
605606

607+
core::LiteralString AudioFileScanner::getName() const
608+
{
609+
return "Audio scanner";
610+
}
611+
606612
std::span<const std::filesystem::path> AudioFileScanner::getSupportedExtensions() const
607613
{
608614
return _metadataParser->getSupportedExtensions();

src/libs/services/scanner/impl/scanners/AudioFileScanner.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ namespace lms::scanner
5050
AudioFileScanner& operator=(const AudioFileScanner&) = delete;
5151

5252
private:
53+
core::LiteralString getName() const override;
5354
std::span<const std::filesystem::path> getSupportedExtensions() const override;
5455
bool needsScan(ScanContext& context, const FileToScan& file) const override;
5556
std::unique_ptr<IFileScanOperation> createScanOperation(const FileToScan& fileToScan) const override;

src/libs/services/scanner/impl/scanners/IFileScanOperation.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919

2020
#pragma once
2121

22+
#include <filesystem>
23+
2224
#include "core/LiteralString.hpp"
2325

2426
namespace lms::scanner
@@ -31,6 +33,8 @@ namespace lms::scanner
3133
virtual ~IFileScanOperation() = default;
3234

3335
virtual core::LiteralString getName() const = 0;
36+
37+
virtual const std::filesystem::path& getFile() const = 0;
3438
virtual void scan() = 0;
3539
virtual void processResult(ScanContext& context) = 0;
3640
};

src/libs/services/scanner/impl/scanners/IFileScanner.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
#include <filesystem>
2323
#include <span>
2424

25+
#include "core/LiteralString.hpp"
26+
2527
#include "MediaLibraryInfo.hpp"
2628

2729
namespace lms::scanner
@@ -41,6 +43,7 @@ namespace lms::scanner
4143
public:
4244
virtual ~IFileScanner() = default;
4345

46+
virtual core::LiteralString getName() const = 0;
4447
virtual std::span<const std::filesystem::path> getSupportedExtensions() const = 0;
4548
virtual bool needsScan(ScanContext& context, const FileToScan& file) const = 0;
4649
virtual std::unique_ptr<IFileScanOperation> createScanOperation(const FileToScan& fileToScan) const = 0;

src/libs/services/scanner/impl/scanners/ImageFileScanner.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ namespace lms::scanner
4646
, _db{ db } {}
4747

4848
private:
49+
const std::filesystem::path& getFile() const override { return _file; };
4950
core::LiteralString getName() const override { return "ScanImageFile"; }
5051
void scan() override;
5152
void processResult(ScanContext& context) override;
@@ -134,6 +135,11 @@ namespace lms::scanner
134135
{
135136
}
136137

138+
core::LiteralString ImageFileScanner::getName() const
139+
{
140+
return "Image scanner";
141+
}
142+
137143
std::span<const std::filesystem::path> ImageFileScanner::getSupportedExtensions() const
138144
{
139145
return image::getSupportedFileExtensions();

src/libs/services/scanner/impl/scanners/ImageFileScanner.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ namespace lms::scanner
4242
ImageFileScanner& operator=(const ImageFileScanner&) = delete;
4343

4444
private:
45+
core::LiteralString getName() const override;
4546
std::span<const std::filesystem::path> getSupportedExtensions() const override;
4647
bool needsScan(ScanContext& context, const FileToScan& file) const override;
4748
std::unique_ptr<IFileScanOperation> createScanOperation(const FileToScan& fileToScan) const override;

src/libs/services/scanner/impl/scanners/LyricsFileScanner.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ namespace lms::scanner
4646
, _db{ db } {}
4747

4848
private:
49+
const std::filesystem::path& getFile() const override { return _file; };
4950
core::LiteralString getName() const override { return "ScanLyricsFile"; }
5051
void scan() override;
5152
void processResult(ScanContext& context) override;
@@ -137,6 +138,11 @@ namespace lms::scanner
137138
{
138139
}
139140

141+
core::LiteralString LyricsFileScanner::getName() const
142+
{
143+
return "Lyrics scanner";
144+
}
145+
140146
std::span<const std::filesystem::path> LyricsFileScanner::getSupportedExtensions() const
141147
{
142148
return metadata::getSupportedLyricsFileExtensions();

0 commit comments

Comments
 (0)