Compare commits

..

80 Commits

Author SHA1 Message Date
Jonas Kvinge
ac31d79294 Release 1.2.16 2025-12-17 00:08:06 +01:00
Jonas Kvinge
4ffebd77b1 Update Changelog 2025-12-17 00:07:41 +01:00
Strawberry Bot
6682efae2f New translations 2025-12-16 22:41:10 +01:00
Jonas Kvinge
480161c6b7 Update Changelog 2025-12-16 22:38:55 +01:00
Jonas Kvinge
a8ba420d72 ErrorDialog: Use QApplication::activeWindow 2025-12-16 22:32:11 +01:00
dependabot[bot]
fc0ec91652 Bump actions/download-artifact from 6 to 7
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 6 to 7.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v6...v7)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-15 18:15:02 +01:00
dependabot[bot]
0701b97324 Bump actions/upload-artifact from 5 to 6
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 5 to 6.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-15 18:14:44 +01:00
Jonas Kvinge
3867932e1e PlaylistView: Don't automatically scroll on dynamic playlists
Fixes #1427
2025-12-14 04:55:20 +01:00
Jonas Kvinge
e2907f6051 PlaylistView: Use Qt::CopyAction for drag
Fixes #1815
2025-12-14 04:41:58 +01:00
Jonas Kvinge
0827ec7f16 PlaylistSequence: Fix icon size
Fixes #1838
2025-12-14 04:28:25 +01:00
Jonas Kvinge
24d2adf363 PlaylistView: Set current index when automatically selecting track
Fixes #1825
2025-12-14 04:02:40 +01:00
Jonas Kvinge
592729d00b SliderSlider: Use SC_SliderGroove
Fixes #1675
2025-12-14 01:57:47 +01:00
Jonas Kvinge
c4a564bb56 NetworkAccessManager: Use full application name for user agent 2025-12-14 01:36:53 +01:00
Jonas Kvinge
812a02a3a1 Update Changelog 2025-12-14 01:04:45 +01:00
Strawberry Bot
944936914b New translations 2025-12-14 01:01:06 +01:00
Jonas Kvinge
e7c901d4f3 Update Changelog 2025-12-14 00:59:42 +01:00
Jonas Kvinge
8e996119af Make using sort tags optional 2025-12-14 00:52:19 +01:00
Jonas Kvinge
4348a654ca TagReaderResult: Fix file save error message 2025-12-14 00:52:19 +01:00
dependabot[bot]
f0be1c782a Bump vmactions/openbsd-vm from 1.2.4 to 1.2.5
Bumps [vmactions/openbsd-vm](https://github.com/vmactions/openbsd-vm) from 1.2.4 to 1.2.5.
- [Release notes](https://github.com/vmactions/openbsd-vm/releases)
- [Commits](https://github.com/vmactions/openbsd-vm/compare/v1.2.4...v1.2.5)

---
updated-dependencies:
- dependency-name: vmactions/openbsd-vm
  dependency-version: 1.2.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-11 00:36:57 +01:00
dependabot[bot]
e9898d08bc Bump vmactions/freebsd-vm from 1.2.9 to 1.3.0
Bumps [vmactions/freebsd-vm](https://github.com/vmactions/freebsd-vm) from 1.2.9 to 1.3.0.
- [Release notes](https://github.com/vmactions/freebsd-vm/releases)
- [Commits](https://github.com/vmactions/freebsd-vm/compare/v1.2.9...v1.3.0)

---
updated-dependencies:
- dependency-name: vmactions/freebsd-vm
  dependency-version: 1.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-11 00:36:24 +01:00
Jonas Kvinge
1ad13cd3b0 Add lyrics from lrclib.net 2025-12-09 18:45:57 +01:00
Jonas Kvinge
5c640e0e36 LyricsFetcherSearch: Improve handling timeout 2025-12-09 18:41:55 +01:00
Jonas Kvinge
059def8d0c Add duration to lyrics search request 2025-12-09 18:40:45 +01:00
Jonas Kvinge
cf15a1f423 CDDALister: Add Q_UNUSED 2025-12-09 01:33:13 +01:00
Jonas Kvinge
5d35b0eedd BlockAnalyzer: Formatting 2025-12-09 01:19:02 +01:00
Jonas Kvinge
5fcb71d08f Formatting 2025-12-09 01:16:41 +01:00
Jonas Kvinge
15c2237d4a AlbumCoverChoiceController: Fix incorrectly formatted switch 2025-12-08 23:55:13 +01:00
Jonas Kvinge
93af866185 Formatting 2025-12-08 23:49:48 +01:00
dependabot[bot]
109ff90401 Bump vmactions/freebsd-vm from 1.2.8 to 1.2.9
Bumps [vmactions/freebsd-vm](https://github.com/vmactions/freebsd-vm) from 1.2.8 to 1.2.9.
- [Release notes](https://github.com/vmactions/freebsd-vm/releases)
- [Commits](https://github.com/vmactions/freebsd-vm/compare/v1.2.8...v1.2.9)

---
updated-dependencies:
- dependency-name: vmactions/freebsd-vm
  dependency-version: 1.2.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-08 17:11:17 +01:00
Jonas Kvinge
d4b06289c3 clang-format: Add new KeepEmptyLines option 2025-12-07 01:20:39 +01:00
dependabot[bot]
4351c555a0 Bump apple-actions/import-codesign-certs from 5 to 6
Bumps [apple-actions/import-codesign-certs](https://github.com/apple-actions/import-codesign-certs) from 5 to 6.
- [Release notes](https://github.com/apple-actions/import-codesign-certs/releases)
- [Commits](https://github.com/apple-actions/import-codesign-certs/compare/v5...v6)

---
updated-dependencies:
- dependency-name: apple-actions/import-codesign-certs
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-07 00:51:50 +01:00
Strawberry Bot
ce4db40983 New translations 2025-12-07 00:06:44 +01:00
Jonas Kvinge
d37fb7410c ResizableTextEdit: Set word wrap 2025-12-01 23:23:23 +01:00
Jonas Kvinge
f1cdd71494 ResizableTextEdit: Move updateGeometry after resize 2025-12-01 23:23:05 +01:00
Jonas Kvinge
000ba997fb Playlist: Preserve track order in album shuffle mode
Fixes #1623
2025-12-01 22:47:12 +01:00
dependabot[bot]
579efffd14 Bump vmactions/openbsd-vm from 1.2.3 to 1.2.4
Bumps [vmactions/openbsd-vm](https://github.com/vmactions/openbsd-vm) from 1.2.3 to 1.2.4.
- [Release notes](https://github.com/vmactions/openbsd-vm/releases)
- [Commits](https://github.com/vmactions/openbsd-vm/compare/v1.2.3...v1.2.4)

---
updated-dependencies:
- dependency-name: vmactions/openbsd-vm
  dependency-version: 1.2.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-01 19:47:08 +01:00
dependabot[bot]
3a098c8a0c Bump vmactions/freebsd-vm from 1.2.7 to 1.2.8
Bumps [vmactions/freebsd-vm](https://github.com/vmactions/freebsd-vm) from 1.2.7 to 1.2.8.
- [Release notes](https://github.com/vmactions/freebsd-vm/releases)
- [Commits](https://github.com/vmactions/freebsd-vm/compare/v1.2.7...v1.2.8)

---
updated-dependencies:
- dependency-name: vmactions/freebsd-vm
  dependency-version: 1.2.8
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-01 18:46:03 +01:00
bastimeyer
5bce0ae87f GlobalShortcutsBackendKGlobalAccel: Add globalShortcutRepeated signal 2025-11-30 18:25:26 +01:00
Jonas Kvinge
afe6967c46 GstEnginePipeline: Handle "missing-plugin" messages 2025-11-30 18:13:30 +01:00
Jonas Kvinge
e91bab6d42 GstEngine: Only emit error for debugstr if it's set 2025-11-30 18:13:30 +01:00
Jonas Kvinge
5a64247761 PlaylistView: Use lamda in sort 2025-11-30 16:58:08 +01:00
Jonas Kvinge
9ed89afdb2 SpotifyService: Use 127.0.0.1 in redirect URL 2025-11-30 16:32:56 +01:00
Jonas Kvinge
0ac338026c About: Update sponsor info 2025-11-30 02:47:39 +01:00
Jonas Kvinge
4e5f84a7b7 RichPresence: Use pretty title 2025-11-26 19:14:16 +01:00
Jonas Kvinge
320a3c6815 RichPresence: Add copyright 2025-11-26 19:14:05 +01:00
Jonas Kvinge
72dd1d783a Turn on git revision 2025-11-25 21:13:00 +01:00
Jonas Kvinge
d2205cfe81 Release 1.2.15 2025-11-25 02:50:34 +01:00
Jonas Kvinge
5830f247f6 Update Changelog 2025-11-25 02:05:26 +01:00
Jonas Kvinge
8b4c57d933 GroupedIconView: Remove deprecated QStyle::State_Editing 2025-11-23 03:14:57 +01:00
Jonas Kvinge
67cec09176 gitignore: Add .qtcreator 2025-11-23 03:14:24 +01:00
Jonas Kvinge
2df658e1f3 ListenBrainzScrobbler: Ignore connection closed 2025-11-23 01:11:59 +01:00
Jonas Kvinge
f3bc9b151c README: Update OBS URL's 2025-11-23 00:47:56 +01:00
Jonas Kvinge
b06b59d0c5 nsi: Bump ffmpeg for msvc x86_64 2025-11-22 14:20:40 +01:00
Jonas Kvinge
99d75ade06 CI: Bump MSVC SDK version 2025-11-22 02:15:20 +01:00
Jonas Kvinge
3f63246068 Add macos-15-intel runner 2025-11-22 00:47:30 +01:00
dependabot[bot]
b205a5f964 Bump actions/checkout from 5 to 6
Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-21 19:46:25 +01:00
dependabot[bot]
aeaef12dd4 Bump vmactions/freebsd-vm from 1.2.6 to 1.2.7
Bumps [vmactions/freebsd-vm](https://github.com/vmactions/freebsd-vm) from 1.2.6 to 1.2.7.
- [Release notes](https://github.com/vmactions/freebsd-vm/releases)
- [Commits](https://github.com/vmactions/freebsd-vm/compare/v1.2.6...v1.2.7)

---
updated-dependencies:
- dependency-name: vmactions/freebsd-vm
  dependency-version: 1.2.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-21 19:45:43 +01:00
Jonas Kvinge
02d76f17f7 CollectionModel: Make SortText static 2025-11-15 22:10:55 +01:00
Strawberry Bot
e4e12c6fa6 New translations 2025-11-13 23:25:27 +01:00
uninstall-your-browser
270ae6085b FilterParser: Convert number to nanoseconds for length filter 2025-11-13 23:23:19 +01:00
Jonas Kvinge
7065a405a5 CI: Remove macos-13 2025-11-12 01:10:19 +01:00
Jonas Kvinge
d8c72c3dd9 ParserBase: Remove use of QString::removeFirst 2025-11-11 21:37:19 +01:00
Jonas Kvinge
b65502e167 XSPFParser: Handle platform and url 2025-11-11 00:56:36 +01:00
Jonas Kvinge
132f8df853 ParserBase: Convert spotify URLs 2025-11-11 00:56:13 +01:00
Jonas Kvinge
12e3cffe63 CI: Fix ssh command 2025-11-10 20:43:09 +01:00
dependabot[bot]
56a637682d Bump vmactions/freebsd-vm from 1.2.5 to 1.2.6
Bumps [vmactions/freebsd-vm](https://github.com/vmactions/freebsd-vm) from 1.2.5 to 1.2.6.
- [Release notes](https://github.com/vmactions/freebsd-vm/releases)
- [Commits](https://github.com/vmactions/freebsd-vm/compare/v1.2.5...v1.2.6)

---
updated-dependencies:
- dependency-name: vmactions/freebsd-vm
  dependency-version: 1.2.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-10 20:01:38 +01:00
dependabot[bot]
d9b105f89e Bump vmactions/openbsd-vm from 1.2.2 to 1.2.3
Bumps [vmactions/openbsd-vm](https://github.com/vmactions/openbsd-vm) from 1.2.2 to 1.2.3.
- [Release notes](https://github.com/vmactions/openbsd-vm/releases)
- [Commits](https://github.com/vmactions/openbsd-vm/compare/v1.2.2...v1.2.3)

---
updated-dependencies:
- dependency-name: vmactions/openbsd-vm
  dependency-version: 1.2.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-10 17:26:57 +01:00
dependabot[bot]
bd6b45e43f Bump vmactions/freebsd-vm from 1.2.4 to 1.2.5
Bumps [vmactions/freebsd-vm](https://github.com/vmactions/freebsd-vm) from 1.2.4 to 1.2.5.
- [Release notes](https://github.com/vmactions/freebsd-vm/releases)
- [Commits](https://github.com/vmactions/freebsd-vm/compare/v1.2.4...v1.2.5)

---
updated-dependencies:
- dependency-name: vmactions/freebsd-vm
  dependency-version: 1.2.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-03 18:54:16 +01:00
dependabot[bot]
539172fb70 Bump vmactions/openbsd-vm from 1.2.1 to 1.2.2
Bumps [vmactions/openbsd-vm](https://github.com/vmactions/openbsd-vm) from 1.2.1 to 1.2.2.
- [Release notes](https://github.com/vmactions/openbsd-vm/releases)
- [Commits](https://github.com/vmactions/openbsd-vm/compare/v1.2.1...v1.2.2)

---
updated-dependencies:
- dependency-name: vmactions/openbsd-vm
  dependency-version: 1.2.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-03 18:11:33 +01:00
Jonas Kvinge
ebd92b3a7f nsi: Bump ffmpeg 2025-11-01 12:22:43 +01:00
Jonas Kvinge
b00ae5b210 nsi: Bump icu 2025-10-31 23:47:49 +01:00
Jonas Kvinge
c8e3cf981b main: Try different language codes for QtSparkle 2025-10-31 23:06:00 +01:00
Jonas Kvinge
038f69779f CI: Manually codesign libbrotli 2025-10-30 23:56:17 +01:00
Jonas Kvinge
a4de7559ac Fix loading language from system UI languages
Fixes #1847
2025-10-30 23:54:42 +01:00
dependabot[bot]
0537b072fe Bump actions/download-artifact from 5 to 6
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 5 to 6.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-30 01:36:11 +01:00
dependabot[bot]
2657c9f96a Bump actions/upload-artifact from 4 to 5
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 5.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-30 01:35:56 +01:00
Jonas Kvinge
7e178b1f1a PlaylistView: Always keep EditKeyPressed 2025-10-30 01:35:30 +01:00
Jonas Kvinge
dd8513d02c PlaylistView: Disable EditKeyPressed when inline metadata editing is disabled 2025-10-27 20:19:50 +01:00
Andrew Tribick
5f0175094b Support unofficial::getopt-win32::getopt as a getopt library target
Handles the vcpkg case
2025-10-26 13:06:11 +01:00
Jonas Kvinge
b4c5b9e1e1 Turn on git revision 2025-10-26 13:05:56 +01:00
343 changed files with 10014 additions and 2112 deletions

View File

@@ -130,7 +130,10 @@ InsertBraces: false
InsertTrailingCommas: None InsertTrailingCommas: None
JavaScriptQuotes: Leave JavaScriptQuotes: Leave
JavaScriptWrapImports: true JavaScriptWrapImports: true
KeepEmptyLinesAtTheStartOfBlocks: true KeepEmptyLines:
AtEndOfFile: true
AtStartOfBlock: true
AtStartOfFile: true
LambdaBodyIndentation: Signature LambdaBodyIndentation: Signature
MacroBlockBegin: '' MacroBlockBegin: ''
MacroBlockEnd: '' MacroBlockEnd: ''

View File

@@ -97,7 +97,7 @@ jobs:
cmake --build build --config Release --parallel 4 cmake --build build --config Release --parallel 4
cmake --install build cmake --install build
- name: Checkout - name: Checkout
uses: actions/checkout@v5 uses: actions/checkout@v6
with: with:
fetch-depth: 0 fetch-depth: 0
submodules: recursive submodules: recursive
@@ -134,14 +134,14 @@ jobs:
run: echo "subdir=$(echo ${{matrix.opensuse_version}} | sed 's/leap:/lp/g' | sed 's/\.//g')" > $GITHUB_OUTPUT run: echo "subdir=$(echo ${{matrix.opensuse_version}} | sed 's/leap:/lp/g' | sed 's/\.//g')" > $GITHUB_OUTPUT
- name: Upload source - name: Upload source
if: matrix.opensuse_version == 'tumbleweed' if: matrix.opensuse_version == 'tumbleweed'
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v6
with: with:
name: source name: source
path: | path: |
/usr/src/packages/SOURCES/*.xz /usr/src/packages/SOURCES/*.xz
- name: Upload rpm - name: Upload rpm
if: matrix.opensuse_version != 'tumbleweed' if: matrix.opensuse_version != 'tumbleweed'
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v6
with: with:
name: opensuse-${{steps.set-subdir.outputs.subdir}} name: opensuse-${{steps.set-subdir.outputs.subdir}}
path: | path: |
@@ -209,7 +209,7 @@ jobs:
sparsehash-devel sparsehash-devel
rapidjson-devel rapidjson-devel
- name: Checkout - name: Checkout
uses: actions/checkout@v5 uses: actions/checkout@v6
with: with:
fetch-depth: 0 fetch-depth: 0
submodules: recursive submodules: recursive
@@ -234,7 +234,7 @@ jobs:
working-directory: build working-directory: build
run: rpmbuild -ba strawberry.spec run: rpmbuild -ba strawberry.spec
- name: Upload artifacts - name: Upload artifacts
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v6
with: with:
name: fedora-${{matrix.fedora_version}} name: fedora-${{matrix.fedora_version}}
path: | path: |
@@ -307,7 +307,7 @@ jobs:
- name: Remove files - name: Remove files
run: rm -rf /usr/lib64/qt6/lib/cmake/Qt6Sql/{Qt6QMYSQL*,Qt6QODBCD*,Qt6QPSQL*,Qt6QIBase*} run: rm -rf /usr/lib64/qt6/lib/cmake/Qt6Sql/{Qt6QMYSQL*,Qt6QODBCD*,Qt6QPSQL*,Qt6QIBase*}
- name: Checkout - name: Checkout
uses: actions/checkout@v5 uses: actions/checkout@v6
with: with:
fetch-depth: 0 fetch-depth: 0
submodules: recursive submodules: recursive
@@ -333,7 +333,7 @@ jobs:
run: rpmbuild -ba strawberry.spec run: rpmbuild -ba strawberry.spec
- name: Upload artifacts - name: Upload artifacts
if: matrix.openmandriva_version != 'cooker' if: matrix.openmandriva_version != 'cooker'
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v6
with: with:
name: openmandriva-${{matrix.openmandriva_version}} name: openmandriva-${{matrix.openmandriva_version}}
path: | path: |
@@ -409,7 +409,7 @@ jobs:
cmake --build build --config Release --parallel 4 cmake --build build --config Release --parallel 4
cmake --install build cmake --install build
- name: Checkout - name: Checkout
uses: actions/checkout@v5 uses: actions/checkout@v6
with: with:
fetch-depth: 0 fetch-depth: 0
submodules: recursive submodules: recursive
@@ -434,7 +434,7 @@ jobs:
working-directory: build working-directory: build
run: rpmbuild -ba strawberry.spec run: rpmbuild -ba strawberry.spec
- name: Upload artifacts - name: Upload artifacts
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v6
with: with:
name: mageia-${{matrix.mageia_version}} name: mageia-${{matrix.mageia_version}}
path: | path: |
@@ -511,7 +511,7 @@ jobs:
cmake --build build --config Release --parallel 4 cmake --build build --config Release --parallel 4
cmake --install build cmake --install build
- name: Checkout - name: Checkout
uses: actions/checkout@v5 uses: actions/checkout@v6
with: with:
fetch-depth: 0 fetch-depth: 0
submodules: recursive submodules: recursive
@@ -528,7 +528,7 @@ jobs:
- name: Copy deb - name: Copy deb
run: cp ../*.deb . run: cp ../*.deb .
- name: Upload artifacts - name: Upload artifacts
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v6
with: with:
name: debian-${{matrix.debian_version}} name: debian-${{matrix.debian_version}}
path: | path: |
@@ -607,7 +607,7 @@ jobs:
cmake --build build --config Release --parallel 4 cmake --build build --config Release --parallel 4
cmake --install build cmake --install build
- name: Checkout - name: Checkout
uses: actions/checkout@v5 uses: actions/checkout@v6
with: with:
fetch-depth: 0 fetch-depth: 0
submodules: recursive submodules: recursive
@@ -624,7 +624,7 @@ jobs:
- name: Copy deb - name: Copy deb
run: cp ../*.deb ../*.ddeb . run: cp ../*.deb ../*.ddeb .
- name: Upload artifacts - name: Upload artifacts
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v6
with: with:
name: ubuntu-${{matrix.ubuntu_version}} name: ubuntu-${{matrix.ubuntu_version}}
path: | path: |
@@ -699,7 +699,7 @@ jobs:
DEBIAN_FRONTEND: noninteractive DEBIAN_FRONTEND: noninteractive
run: apt install -y keyboxd run: apt install -y keyboxd
- name: Checkout - name: Checkout
uses: actions/checkout@v5 uses: actions/checkout@v6
with: with:
fetch-depth: 0 fetch-depth: 0
submodules: recursive submodules: recursive
@@ -735,13 +735,13 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v5 uses: actions/checkout@v6
with: with:
fetch-depth: 0 fetch-depth: 0
submodules: recursive submodules: recursive
- name: Build FreeBSD - name: Build FreeBSD
id: build-freebsd id: build-freebsd
uses: vmactions/freebsd-vm@v1.2.4 uses: vmactions/freebsd-vm@v1.3.0
with: with:
usesh: true usesh: true
mem: 4096 mem: 4096
@@ -760,13 +760,13 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v5 uses: actions/checkout@v6
with: with:
fetch-depth: 0 fetch-depth: 0
submodules: recursive submodules: recursive
- name: Build OpenBSD - name: Build OpenBSD
id: build-openbsd id: build-openbsd
uses: vmactions/openbsd-vm@v1.2.1 uses: vmactions/openbsd-vm@v1.2.5
with: with:
usesh: true usesh: true
mem: 4096 mem: 4096
@@ -787,7 +787,7 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
runner: [ 'macos-13', 'macos-15' ] runner: [ 'macos-15-intel', 'macos-15' ]
buildtype: [ 'release' ] buildtype: [ 'release' ]
runs-on: ${{ matrix.runner }} runs-on: ${{ matrix.runner }}
@@ -826,20 +826,20 @@ jobs:
rm -f uninstall.sh rm -f uninstall.sh
- name: Checkout - name: Checkout
uses: actions/checkout@v5 uses: actions/checkout@v6
with: with:
fetch-depth: 0 fetch-depth: 0
submodules: recursive submodules: recursive
- name: Import certificate file - name: Import certificate file
if: github.repository == 'strawberrymusicplayer/strawberry' && github.event.pull_request.head.repo.fork == false if: github.repository == 'strawberrymusicplayer/strawberry' && github.event.pull_request.head.repo.fork == false
uses: apple-actions/import-codesign-certs@v5 uses: apple-actions/import-codesign-certs@v6
with: with:
p12-file-base64: ${{ secrets.APPLE_DEVELOPER_ID_CERTIFICATE }} p12-file-base64: ${{ secrets.APPLE_DEVELOPER_ID_CERTIFICATE }}
p12-password: ${{ secrets.APPLE_DEVELOPER_ID_CERTIFICATE_PASSWORD }} p12-password: ${{ secrets.APPLE_DEVELOPER_ID_CERTIFICATE_PASSWORD }}
- name: Download macOS dependencies - name: Download macOS dependencies
run: curl -f -O -L https://github.com/strawberrymusicplayer/strawberry-macos-dependencies/releases/latest/download/strawberry-macos-${{env.arch}}-${{env.buildtype}}.tar.xz run: curl -f -O -L https://github.com/strawberrymusicplayer/strawberry-macos-dependencies$(test "${{env.arch}}" = "x86_64" && echo "-intel" || echo "")/releases/latest/download/strawberry-macos-${{env.arch}}-${{env.buildtype}}.tar.xz
- name: Extract macOS dependencies - name: Extract macOS dependencies
run: sudo tar -C / -xf strawberry-macos-${{env.arch}}-${{env.buildtype}}.tar.xz run: sudo tar -C / -xf strawberry-macos-${{env.arch}}-${{env.buildtype}}.tar.xz
@@ -890,9 +890,9 @@ jobs:
run: make deploy run: make deploy
- name: Manually Codesign - name: Manually Codesign
if: github.repository == 'strawberrymusicplayer/strawberry' && github.event.pull_request.head.repo.fork == false && matrix.runner == 'macos-13' if: github.repository == 'strawberrymusicplayer/strawberry' && github.event.pull_request.head.repo.fork == false && matrix.runner == 'macos-15-intel'
working-directory: build working-directory: build
run: codesign -s 383J84DVB6 -f strawberry.app/Contents/Frameworks/{libpcre2-8.0.dylib,libpcre2-16.0.dylib,libpng16.16.dylib,libfreetype.6.dylib,libzstd.1.dylib} strawberry.app/Contents/Frameworks/png.framework/png strawberry.app run: codesign -s 383J84DVB6 -f strawberry.app/Contents/Frameworks/{libpcre2-8.0.dylib,libpcre2-16.0.dylib,libpng16.16.dylib,libfreetype.6.dylib,libzstd.1.dylib,libbrotlicommon.1.dylib,libbrotlienc.1.dylib} strawberry.app/Contents/Frameworks/png.framework/png strawberry.app
- name: Manually Codesign - name: Manually Codesign
if: github.repository == 'strawberrymusicplayer/strawberry' && github.event.pull_request.head.repo.fork == false && matrix.runner == 'macos-15' if: github.repository == 'strawberrymusicplayer/strawberry' && github.event.pull_request.head.repo.fork == false && matrix.runner == 'macos-15'
@@ -977,7 +977,7 @@ jobs:
run: echo "cmake_buildtype=$(echo ${{env.buildtype}} | awk '{print toupper(substr($0,0,1))tolower(substr($0,2))}')" >> $GITHUB_ENV run: echo "cmake_buildtype=$(echo ${{env.buildtype}} | awk '{print toupper(substr($0,0,1))tolower(substr($0,2))}')" >> $GITHUB_ENV
- name: Checkout - name: Checkout
uses: actions/checkout@v5 uses: actions/checkout@v6
with: with:
fetch-depth: 0 fetch-depth: 0
submodules: recursive submodules: recursive
@@ -1080,7 +1080,7 @@ jobs:
run: echo "cmake_buildtype=$(echo ${{matrix.buildtype}} | sed 's/.*/\u&/')" >> $GITHUB_ENV run: echo "cmake_buildtype=$(echo ${{matrix.buildtype}} | sed 's/.*/\u&/')" >> $GITHUB_ENV
- name: Checkout - name: Checkout
uses: actions/checkout@v5 uses: actions/checkout@v6
with: with:
fetch-depth: 0 fetch-depth: 0
submodules: recursive submodules: recursive
@@ -1310,7 +1310,7 @@ jobs:
- name: Set SDK version - name: Set SDK version
if: matrix.arch != 'arm64' if: matrix.arch != 'arm64'
shell: bash shell: bash
run: echo "sdk_version=10.0.19041.0" >> $GITHUB_ENV run: echo "sdk_version=10.0.22621.0" >> $GITHUB_ENV
- name: Set SDK version - name: Set SDK version
if: matrix.arch == 'arm64' if: matrix.arch == 'arm64'
@@ -1321,10 +1321,6 @@ jobs:
shell: cmd shell: cmd
run: choco install --no-progress rsync run: choco install --no-progress rsync
- name: Set SSH command
shell: bash
run: echo "ssh_command=/c/ProgramData/chocolatey/lib/rsync/tools/$(ls -1 /c/ProgramData/chocolatey/lib/rsync/tools/ | grep -v '\.zip$' | grep '^cwrsync' | tail -1)/bin/ssh.exe" >> $GITHUB_ENV
- name: Cleanup PATH - name: Cleanup PATH
uses: egor-tensin/cleanup-path@v4 uses: egor-tensin/cleanup-path@v4
with: with:
@@ -1409,7 +1405,7 @@ jobs:
vsversion: 2022 vsversion: 2022
- name: Checkout - name: Checkout
uses: actions/checkout@v5 uses: actions/checkout@v6
with: with:
fetch-depth: 0 fetch-depth: 0
submodules: recursive submodules: recursive
@@ -1623,7 +1619,7 @@ jobs:
- name: rsync - name: rsync
if: steps.set-upload-path.outputs.upload_path != '' if: steps.set-upload-path.outputs.upload_path != ''
shell: bash shell: bash
run: rsync -e "${{env.ssh_command}} -p ${{secrets.SSH_PORT}} -o StrictHostKeyChecking=no" -var build/StrawberrySetup*.exe ${{secrets.SSH_USER}}@${{secrets.SSH_HOST}}:${{steps.set-upload-path.outputs.upload_path}}/ run: rsync -e "/c/ProgramData/chocolatey/lib/rsync/tools/bin/ssh.exe -p ${{secrets.SSH_PORT}} -o StrictHostKeyChecking=no" -var build/StrawberrySetup*.exe ${{secrets.SSH_USER}}@${{secrets.SSH_HOST}}:${{steps.set-upload-path.outputs.upload_path}}/
upload: upload:
@@ -1642,11 +1638,11 @@ jobs:
DEBIAN_FRONTEND: noninteractive DEBIAN_FRONTEND: noninteractive
run: sudo apt install -y git rsync run: sudo apt install -y git rsync
- name: Checkout - name: Checkout
uses: actions/checkout@v5 uses: actions/checkout@v6
with: with:
fetch-depth: 0 fetch-depth: 0
- name: Download artifacts - name: Download artifacts
uses: actions/download-artifact@v5 uses: actions/download-artifact@v7
with: with:
path: artifacts path: artifacts
- name: SSH Setup - name: SSH Setup
@@ -1690,7 +1686,7 @@ jobs:
DEBIAN_FRONTEND: noninteractive DEBIAN_FRONTEND: noninteractive
run: sudo apt install -y git jq gh run: sudo apt install -y git jq gh
- name: Checkout - name: Checkout
uses: actions/checkout@v5 uses: actions/checkout@v6
with: with:
fetch-depth: 0 fetch-depth: 0
- name: Show release assets - name: Show release assets
@@ -1698,7 +1694,7 @@ jobs:
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
run: gh release view "${{github.event.release.tag_name}}" --json assets | jq -r '.assets[].name' run: gh release view "${{github.event.release.tag_name}}" --json assets | jq -r '.assets[].name'
- name: Download artifacts - name: Download artifacts
uses: actions/download-artifact@v5 uses: actions/download-artifact@v7
with: with:
path: artifacts path: artifacts
- name: Add artifacts to release - name: Add artifacts to release

1
.gitignore vendored
View File

@@ -1,6 +1,7 @@
/build /build
/bin /bin
/CMakeLists.txt.user /CMakeLists.txt.user
/.qtcreator
/.kdev4 /.kdev4
/strawberry.kdev4 /strawberry.kdev4
/.vscode /.vscode

View File

@@ -163,4 +163,3 @@ extern "C" void Discord_Register(const char *applicationId, const char *command)
Discord_RegisterW(appId, wcommand); Discord_RegisterW(appId, wcommand);
} }

View File

@@ -266,6 +266,8 @@ if(WIN32)
set(GETOPT_LIBRARIES getopt-win::getopt) set(GETOPT_LIBRARIES getopt-win::getopt)
elseif(TARGET getopt::getopt_shared) elseif(TARGET getopt::getopt_shared)
set(GETOPT_LIBRARIES getopt::getopt_shared) set(GETOPT_LIBRARIES getopt::getopt_shared)
elseif(TARGET unofficial::getopt-win32::getopt)
set(GETOPT_LIBRARIES unofficial::getopt-win32::getopt)
else() else()
message(FATAL_ERROR "Missing getopt") message(FATAL_ERROR "Missing getopt")
endif() endif()
@@ -699,6 +701,7 @@ set(SOURCES
src/lyrics/elyricsnetlyricsprovider.cpp src/lyrics/elyricsnetlyricsprovider.cpp
src/lyrics/letraslyricsprovider.cpp src/lyrics/letraslyricsprovider.cpp
src/lyrics/lyricfindlyricsprovider.cpp src/lyrics/lyricfindlyricsprovider.cpp
src/lyrics/lrcliblyricsprovider.cpp
src/settings/settingsdialog.cpp src/settings/settingsdialog.cpp
src/settings/settingspage.cpp src/settings/settingspage.cpp
@@ -995,6 +998,7 @@ set(HEADERS
src/lyrics/elyricsnetlyricsprovider.h src/lyrics/elyricsnetlyricsprovider.h
src/lyrics/letraslyricsprovider.h src/lyrics/letraslyricsprovider.h
src/lyrics/lyricfindlyricsprovider.h src/lyrics/lyricfindlyricsprovider.h
src/lyrics/lrcliblyricsprovider.h
src/settings/settingsdialog.h src/settings/settingsdialog.h
src/settings/settingspage.h src/settings/settingspage.h

View File

@@ -2,6 +2,31 @@ Strawberry Music Player
======================= =======================
ChangeLog ChangeLog
Version 1.2.16 (2025.12.16):
* Make Discord Rich presence use filename if song title is missing
* Added better error message when a GStreamer plugin is missing
* Preserve track order in album shuffle mode when restarting playback (#1623)
* Possible fixes for context word wrap
* Added lyrics from lrclib.net
* Added option to turn off the use of sort tags for the collection
* Fixed Spotify login
* Fixed error dialog shown minimized if another Strawberry window than the mainwindow was active
* Fixed seeking to the end of the track and back causing seeking to stop working (#1675)
* Set current index when automatically selecting track (#1825)
* Make icon size for shuffle and repeat buttons adjust to screen resolution (#1838)
* Fixed song being removed from playlist when dragging to another application (#1815)
* Don't automatically scroll on dynamic playlists (#1427)
Version 1.2.15 (2025.11.25):
* Fixed system default language not respected
* Fixed length filter search
* Fixed playlist parser converting Spotify URL's
* Removed use of deprecated QStyle::State_Editing
* Ignore connection closed errors for ListenBrainz
* (Windows) Support building with vcpkg unofficial::getopt-win32::getopt
Version 1.2.14 (2025.10.25): Version 1.2.14 (2025.10.25):
Bugfixes: Bugfixes:

View File

@@ -17,7 +17,9 @@ Its written in **C++ using the Qt framework**, designed for **audiophiles and
- **Forum:** https://forum.strawberrymusicplayer.org - **Forum:** https://forum.strawberrymusicplayer.org
- **GitHub:** https://github.com/strawberrymusicplayer/strawberry - **GitHub:** https://github.com/strawberrymusicplayer/strawberry
- **Latest builds:** https://builds.strawberrymusicplayer.org - **Latest builds:** https://builds.strawberrymusicplayer.org
- **openSUSE Build Service:** https://build.opensuse.org/package/show/home:jonaski:audio/strawberry - **openSUSE Build Service:**
- Stable: https://build.opensuse.org/package/show/home:jonaski:strawberry/strawberry
- Unstable: https://build.opensuse.org/package/show/home:jonaski:strawberry-dev/strawberry
- **Ubuntu PPAs:** - **Ubuntu PPAs:**
- Stable: https://launchpad.net/~jonaski/+archive/ubuntu/strawberry - Stable: https://launchpad.net/~jonaski/+archive/ubuntu/strawberry
- Unstable: https://launchpad.net/~jonaski/+archive/ubuntu/strawberry-unstable - Unstable: https://launchpad.net/~jonaski/+archive/ubuntu/strawberry-unstable
@@ -64,7 +66,7 @@ Supporting open-source developers helps ensure continued maintenance and improve
- Loudness analysis and EBU R128 normalization - Loudness analysis and EBU R128 normalization
- Editing tags and fetching missing tags via [MusicBrainz](https://musicbrainz.org/) - Editing tags and fetching missing tags via [MusicBrainz](https://musicbrainz.org/)
- Album art from: [Last.fm](https://www.last.fm/), [MusicBrainz](https://musicbrainz.org/), [Discogs](https://www.discogs.com/), [Musixmatch](https://www.musixmatch.com/), [Deezer](https://www.deezer.com/), [Tidal](https://www.tidal.com/), [Qobuz](https://www.qobuz.com/), [Spotify](https://www.spotify.com/) - Album art from: [Last.fm](https://www.last.fm/), [MusicBrainz](https://musicbrainz.org/), [Discogs](https://www.discogs.com/), [Musixmatch](https://www.musixmatch.com/), [Deezer](https://www.deezer.com/), [Tidal](https://www.tidal.com/), [Qobuz](https://www.qobuz.com/), [Spotify](https://www.spotify.com/)
- Lyrics from: [Genius](https://genius.com/), [Musixmatch](https://www.musixmatch.com/), [ChartLyrics](http://www.chartlyrics.com/), [lyrics.ovh](https://lyrics.ovh/), [lololyrics](https://www.lololyrics.com/), [songlyrics](https://www.songlyrics.com/), [azlyrics](https://www.azlyrics.com/), [elyrics](https://www.elyrics.net/), [letras](https://www.letras.mus.br), [LyricFind](https://lyrics.lyricfind.com) - Lyrics from: [Genius](https://genius.com/), [Musixmatch](https://www.musixmatch.com/), [ChartLyrics](http://www.chartlyrics.com/), [lyrics.ovh](https://lyrics.ovh/), [lololyrics](https://www.lololyrics.com/), [songlyrics](https://www.songlyrics.com/), [azlyrics](https://www.azlyrics.com/), [elyrics](https://www.elyrics.net/), [letras](https://www.letras.mus.br), [LyricFind](https://lyrics.lyricfind.com) and [lrclib.net](https://lrclib.net/)
- Audio analyzer and equalizer - Audio analyzer and equalizer
- Transfer music to USB, MTP and iPod devices - Transfer music to USB, MTP and iPod devices
- Scrobbling to [Last.fm](https://www.last.fm/) and [ListenBrainz](https://listenbrainz.org/) - Scrobbling to [Last.fm](https://www.last.fm/) and [ListenBrainz](https://listenbrainz.org/)

View File

@@ -1,6 +1,6 @@
set(STRAWBERRY_VERSION_MAJOR 1) set(STRAWBERRY_VERSION_MAJOR 1)
set(STRAWBERRY_VERSION_MINOR 2) set(STRAWBERRY_VERSION_MINOR 2)
set(STRAWBERRY_VERSION_PATCH 14) set(STRAWBERRY_VERSION_PATCH 16)
#set(STRAWBERRY_VERSION_PRERELEASE rc1) #set(STRAWBERRY_VERSION_PRERELEASE rc1)
set(INCLUDE_GIT_REVISION OFF) set(INCLUDE_GIT_REVISION OFF)

2
debian/control vendored
View File

@@ -60,7 +60,7 @@ Description: music player and music collection organizer
- Edit tags on audio files - Edit tags on audio files
- Automatically retrieve tags from MusicBrainz - Automatically retrieve tags from MusicBrainz
- Album cover art from Last.fm, Musicbrainz, Discogs, Musixmatch, Deezer, Tidal, Qobuz and Spotify - Album cover art from Last.fm, Musicbrainz, Discogs, Musixmatch, Deezer, Tidal, Qobuz and Spotify
- Song lyrics from Genius, Musixmatch, ChartLyrics, lyrics.ovh, lololyrics.com, songlyrics.com, azlyrics.com, elyrics.net, letras.mus.br and LyricFind - Lyrics from multiple sources
- Audio analyzer - Audio analyzer
- Audio equalizer - Audio equalizer
- Transfer music to mass-storage USB players, MTP compatible devices and iPod Nano/Classic - Transfer music to mass-storage USB players, MTP compatible devices and iPod Nano/Classic

View File

@@ -31,7 +31,7 @@
<li>Edit tags on audio files</li> <li>Edit tags on audio files</li>
<li>Automatically retrieve tags from MusicBrainz</li> <li>Automatically retrieve tags from MusicBrainz</li>
<li>Album cover art from Last.fm, Musicbrainz, Discogs, Musixmatch, Deezer, Tidal, Qobuz and Spotify</li> <li>Album cover art from Last.fm, Musicbrainz, Discogs, Musixmatch, Deezer, Tidal, Qobuz and Spotify</li>
<li>Song lyrics from Genius, Musixmatch, ChartLyrics, lyrics.ovh, lololyrics.com, songlyrics.com, azlyrics.com, elyrics.net, letras.mus.br and LyricFind</li> <li>Lyrics from multiple sources</li>
<li>Audio analyzer and equalizer</li> <li>Audio analyzer and equalizer</li>
<li>Transfer music to mass-storage USB players, MTP compatible devices and iPod Nano/Classic</li> <li>Transfer music to mass-storage USB players, MTP compatible devices and iPod Nano/Classic</li>
<li>Scrobbler with support for Last.fm and ListenBrainz</li> <li>Scrobbler with support for Last.fm and ListenBrainz</li>
@@ -51,6 +51,8 @@
</screenshots> </screenshots>
<update_contact>eclipseo@fedoraproject.org</update_contact> <update_contact>eclipseo@fedoraproject.org</update_contact>
<releases> <releases>
<release version="1.2.16" date="2025-12-16"/>
<release version="1.2.15" date="2025-11-25"/>
<release version="1.2.14" date="2025-10-25"/> <release version="1.2.14" date="2025-10-25"/>
<release version="1.2.13" date="2025-08-31"/> <release version="1.2.13" date="2025-08-31"/>
<release version="1.2.12" date="2025-08-12"/> <release version="1.2.12" date="2025-08-12"/>

View File

@@ -29,9 +29,7 @@ Features:
.br .br
- Album cover art from Last.fm, Musicbrainz, Discogs, Musixmatch, Deezer, Tidal, Qobuz and Spotify - Album cover art from Last.fm, Musicbrainz, Discogs, Musixmatch, Deezer, Tidal, Qobuz and Spotify
.br .br
- Song lyrics from Genius, Musixmatch, ChartLyrics, lyrics.ovh, lololyrics.com, songlyrics.com, azlyrics.com, elyrics.net, letras.mus.br and LyricFind - Lyrics from multiple sources
.br
- Support for multiple backends
.br .br
- Audio analyzer - Audio analyzer
.br .br

View File

@@ -93,8 +93,7 @@ Features:
- Edit tags on audio files - Edit tags on audio files
- Automatically retrieve tags from MusicBrainz - Automatically retrieve tags from MusicBrainz
- Album cover art from Last.fm, Musicbrainz, Discogs, Musixmatch, Deezer, Tidal, Qobuz and Spotify - Album cover art from Last.fm, Musicbrainz, Discogs, Musixmatch, Deezer, Tidal, Qobuz and Spotify
- Song lyrics from Genius, Musixmatch, ChartLyrics, lyrics.ovh, lololyrics.com, songlyrics.com, azlyrics.com, elyrics.net, letras.mus.br and LyricFind - Lyrics from multiple sources
- Support for multiple backends
- Audio analyzer - Audio analyzer
- Audio equalizer - Audio equalizer
- Scrobbler with support for Last.fm and ListenBrainz - Scrobbler with support for Last.fm and ListenBrainz

View File

@@ -477,15 +477,15 @@ Section "Strawberry" Strawberry
; Common files ; Common files
File "icudt77.dll" File "icudt78.dll"
!ifdef msvc && arch_arm64 !ifdef msvc && arch_arm64
File "fftw3.dll" File "fftw3.dll"
!else !else
File "libfftw3-3.dll" File "libfftw3-3.dll"
!endif !endif
!ifdef msvc && debug !ifdef msvc && debug
File "icuin77d.dll" File "icuin78d.dll"
File "icuuc77d.dll" File "icuuc78d.dll"
File "libxml2d.dll" File "libxml2d.dll"
File "Qt6Concurrentd.dll" File "Qt6Concurrentd.dll"
File "Qt6Cored.dll" File "Qt6Cored.dll"
@@ -494,8 +494,8 @@ Section "Strawberry" Strawberry
File "Qt6Sqld.dll" File "Qt6Sqld.dll"
File "Qt6Widgetsd.dll" File "Qt6Widgetsd.dll"
!else !else
File "icuin77.dll" File "icuin78.dll"
File "icuuc77.dll" File "icuuc78.dll"
File "libxml2.dll" File "libxml2.dll"
File "Qt6Concurrent.dll" File "Qt6Concurrent.dll"
File "Qt6Core.dll" File "Qt6Core.dll"
@@ -505,6 +505,7 @@ Section "Strawberry" Strawberry
File "Qt6Widgets.dll" File "Qt6Widgets.dll"
!endif !endif
!ifdef msvc && arch_x86
File "avcodec-61.dll" File "avcodec-61.dll"
File "avfilter-10.dll" File "avfilter-10.dll"
File "avformat-61.dll" File "avformat-61.dll"
@@ -512,6 +513,14 @@ Section "Strawberry" Strawberry
File "postproc-58.dll" File "postproc-58.dll"
File "swresample-5.dll" File "swresample-5.dll"
File "swscale-8.dll" File "swscale-8.dll"
!else
File "avcodec-62.dll"
File "avfilter-11.dll"
File "avformat-62.dll"
File "avutil-60.dll"
File "swresample-6.dll"
File "swscale-9.dll"
!endif
; Register Strawberry with Default Programs ; Register Strawberry with Default Programs
Var /GLOBAL AppIcon Var /GLOBAL AppIcon
@@ -1019,15 +1028,15 @@ Section "Uninstall"
; Common files ; Common files
Delete "$INSTDIR\icudt77.dll" Delete "$INSTDIR\icudt78.dll"
!ifdef msvc && arch_arm64 !ifdef msvc && arch_arm64
Delete "$INSTDIR\fftw3.dll" Delete "$INSTDIR\fftw3.dll"
!else !else
Delete "$INSTDIR\libfftw3-3.dll" Delete "$INSTDIR\libfftw3-3.dll"
!endif !endif
!ifdef msvc && debug !ifdef msvc && debug
Delete "$INSTDIR\icuin77d.dll" Delete "$INSTDIR\icuin78d.dll"
Delete "$INSTDIR\icuuc77d.dll" Delete "$INSTDIR\icuuc78d.dll"
Delete "$INSTDIR\libxml2d.dll" Delete "$INSTDIR\libxml2d.dll"
Delete "$INSTDIR\Qt6Concurrentd.dll" Delete "$INSTDIR\Qt6Concurrentd.dll"
Delete "$INSTDIR\Qt6Cored.dll" Delete "$INSTDIR\Qt6Cored.dll"
@@ -1036,8 +1045,8 @@ Section "Uninstall"
Delete "$INSTDIR\Qt6Sqld.dll" Delete "$INSTDIR\Qt6Sqld.dll"
Delete "$INSTDIR\Qt6Widgetsd.dll" Delete "$INSTDIR\Qt6Widgetsd.dll"
!else !else
Delete "$INSTDIR\icuin77.dll" Delete "$INSTDIR\icuin78.dll"
Delete "$INSTDIR\icuuc77.dll" Delete "$INSTDIR\icuuc78.dll"
Delete "$INSTDIR\libxml2.dll" Delete "$INSTDIR\libxml2.dll"
Delete "$INSTDIR\Qt6Concurrent.dll" Delete "$INSTDIR\Qt6Concurrent.dll"
Delete "$INSTDIR\Qt6Core.dll" Delete "$INSTDIR\Qt6Core.dll"
@@ -1047,6 +1056,7 @@ Section "Uninstall"
Delete "$INSTDIR\Qt6Widgets.dll" Delete "$INSTDIR\Qt6Widgets.dll"
!endif !endif
!ifdef msvc && arch_x86
Delete "$INSTDIR\avcodec-61.dll" Delete "$INSTDIR\avcodec-61.dll"
Delete "$INSTDIR\avfilter-10.dll" Delete "$INSTDIR\avfilter-10.dll"
Delete "$INSTDIR\avformat-61.dll" Delete "$INSTDIR\avformat-61.dll"
@@ -1054,6 +1064,14 @@ Section "Uninstall"
Delete "$INSTDIR\postproc-58.dll" Delete "$INSTDIR\postproc-58.dll"
Delete "$INSTDIR\swresample-5.dll" Delete "$INSTDIR\swresample-5.dll"
Delete "$INSTDIR\swscale-8.dll" Delete "$INSTDIR\swscale-8.dll"
!else
Delete "$INSTDIR\avcodec-62.dll"
Delete "$INSTDIR\avfilter-11.dll"
Delete "$INSTDIR\avformat-62.dll"
Delete "$INSTDIR\avutil-60.dll"
Delete "$INSTDIR\swresample-6.dll"
Delete "$INSTDIR\swscale-9.dll"
!endif
!ifdef mingw !ifdef mingw
Delete "$INSTDIR\gio-modules\libgiognutls.dll" Delete "$INSTDIR\gio-modules\libgiognutls.dll"

View File

@@ -90,4 +90,3 @@ class AnalyzerBase : public QWidget {
}; };
#endif // ANALYZERBASE_H #endif // ANALYZERBASE_H

View File

@@ -102,7 +102,6 @@ void AnalyzerContainer::AddAnalyzerType() {
action->setCheckable(true); action->setCheckable(true);
actions_ << action; actions_ << action;
QObject::connect(action, &QAction::triggered, [this, id]() { ChangeAnalyzer(id); }); QObject::connect(action, &QAction::triggered, [this, id]() { ChangeAnalyzer(id); });
} }
#endif // ANALYZERCONTAINER_H #endif // ANALYZERCONTAINER_H

View File

@@ -66,6 +66,7 @@ BlockAnalyzer::BlockAnalyzer(QWidget *parent)
// mxcl says null pixmaps cause crashes, so let's play it safe // mxcl says null pixmaps cause crashes, so let's play it safe
std::fill(fade_bars_.begin(), fade_bars_.end(), QPixmap(1, 1)); std::fill(fade_bars_.begin(), fade_bars_.end(), QPixmap(1, 1));
} }
void BlockAnalyzer::resizeEvent(QResizeEvent *e) { void BlockAnalyzer::resizeEvent(QResizeEvent *e) {

View File

@@ -41,14 +41,14 @@ class BlockAnalyzer : public AnalyzerBase {
Q_OBJECT Q_OBJECT
public: public:
Q_INVOKABLE explicit BlockAnalyzer(QWidget*); Q_INVOKABLE explicit BlockAnalyzer(QWidget *parent);
static const char *kName; static const char *kName;
protected: protected:
void transform(Scope&) override; void transform(Scope &s) override;
void analyze(QPainter &p, const Scope &s, const bool new_frame) override; void analyze(QPainter &p, const Scope &s, const bool new_frame) override;
void resizeEvent(QResizeEvent*) override; void resizeEvent(QResizeEvent *e) override;
virtual void paletteChange(const QPalette &_palette); virtual void paletteChange(const QPalette &_palette);
void framerateChanged() override; void framerateChanged() override;

View File

@@ -40,7 +40,7 @@ class BoomAnalyzer : public AnalyzerBase {
Q_OBJECT Q_OBJECT
public: public:
Q_INVOKABLE explicit BoomAnalyzer(QWidget*); Q_INVOKABLE explicit BoomAnalyzer(QWidget *parent);
static const char *kName; static const char *kName;
@@ -70,7 +70,6 @@ class BoomAnalyzer : public AnalyzerBase {
QPixmap barPixmap_; QPixmap barPixmap_;
QPixmap canvas_; QPixmap canvas_;
}; };
#endif // BOOMANALYZER_H #endif // BOOMANALYZER_H

View File

@@ -55,7 +55,7 @@ class FHT {
/** /**
* Recursive in-place Hartley transform. For internal use only! * Recursive in-place Hartley transform. For internal use only!
*/ */
void _transform(float*, int, int); void _transform(float *p, int n, int k);
public: public:
/** /**
@@ -68,7 +68,7 @@ class FHT {
~FHT(); ~FHT();
int sizeExp() const; int sizeExp() const;
int size() const; int size() const;
void scale(float*, float) const; void scale(float *p, float d) const;
/** /**
* Exponentially Weighted Moving Average (EWMA) filter. * Exponentially Weighted Moving Average (EWMA) filter.
@@ -90,12 +90,12 @@ class FHT {
/** /**
* Semi-logarithmic audio spectrum. * Semi-logarithmic audio spectrum.
*/ */
void semiLogSpectrum(float*); void semiLogSpectrum(float *p);
/** /**
* Fourier spectrum. * Fourier spectrum.
*/ */
void spectrum(float*); void spectrum(float *p);
/** /**
* Calculates a mathematically correct FFT power spectrum. * Calculates a mathematically correct FFT power spectrum.
@@ -103,7 +103,7 @@ class FHT {
* and factor the 0.5 in the final scaling factor. * and factor the 0.5 in the final scaling factor.
* @see FHT::power2() * @see FHT::power2()
*/ */
void power(float*); void power(float *p);
/** /**
* Calculates an FFT power spectrum with doubled values as a * Calculates an FFT power spectrum with doubled values as a
@@ -112,14 +112,14 @@ class FHT {
* of @f$2^n@f$ input values. This is the fastest transform. * of @f$2^n@f$ input values. This is the fastest transform.
* @see FHT::power() * @see FHT::power()
*/ */
void power2(float*); void power2(float *p);
/** /**
* Discrete Hartley transform of data sets with 8 values. * Discrete Hartley transform of data sets with 8 values.
*/ */
static void transform8(float*); static void transform8(float *p);
void transform(float*); void transform(float *p);
}; };
#endif // FHT_H #endif // FHT_H

View File

@@ -140,7 +140,6 @@ class CollectionBackend : public CollectionBackendInterface {
Q_OBJECT Q_OBJECT
public: public:
Q_INVOKABLE explicit CollectionBackend(QObject *parent = nullptr); Q_INVOKABLE explicit CollectionBackend(QObject *parent = nullptr);
~CollectionBackend(); ~CollectionBackend();
@@ -331,4 +330,3 @@ class CollectionBackend : public CollectionBackendInterface {
}; };
#endif // COLLECTIONBACKEND_H #endif // COLLECTIONBACKEND_H

View File

@@ -26,7 +26,6 @@
class CollectionFilterOptions { class CollectionFilterOptions {
public: public:
explicit CollectionFilterOptions(); explicit CollectionFilterOptions();
// Filter mode: // Filter mode:

View File

@@ -135,4 +135,3 @@ class CollectionFilterWidget : public QWidget {
}; };
#endif // COLLECTIONFILTERWIDGET_H #endif // COLLECTIONFILTERWIDGET_H

View File

@@ -212,6 +212,7 @@ void CollectionModel::ReloadSettings() {
const bool show_various_artists = settings.value(CollectionSettings::kVariousArtists, true).toBool(); const bool show_various_artists = settings.value(CollectionSettings::kVariousArtists, true).toBool();
const bool sort_skip_articles_for_artists = settings.value(CollectionSettings::kSkipArticlesForArtists, true).toBool(); const bool sort_skip_articles_for_artists = settings.value(CollectionSettings::kSkipArticlesForArtists, true).toBool();
const bool sort_skip_articles_for_albums = settings.value(CollectionSettings::kSkipArticlesForAlbums, false).toBool(); const bool sort_skip_articles_for_albums = settings.value(CollectionSettings::kSkipArticlesForAlbums, false).toBool();
const bool use_sort_tags = settings.value(CollectionSettings::kUseSortTags, true).toBool();
use_disk_cache_ = settings.value(CollectionSettings::kSettingsDiskCacheEnable, false).toBool(); use_disk_cache_ = settings.value(CollectionSettings::kSettingsDiskCacheEnable, false).toBool();
QPixmapCache::setCacheLimit(static_cast<int>(MaximumCacheSize(&settings, CollectionSettings::kSettingsCacheSize, CollectionSettings::kSettingsCacheSizeUnit, CollectionSettings::kSettingsCacheSizeDefault) / 1024)); QPixmapCache::setCacheLimit(static_cast<int>(MaximumCacheSize(&settings, CollectionSettings::kSettingsCacheSize, CollectionSettings::kSettingsCacheSizeUnit, CollectionSettings::kSettingsCacheSizeDefault) / 1024));
@@ -227,12 +228,14 @@ void CollectionModel::ReloadSettings() {
show_dividers != options_current_.show_dividers || show_dividers != options_current_.show_dividers ||
show_various_artists != options_current_.show_various_artists || show_various_artists != options_current_.show_various_artists ||
sort_skip_articles_for_artists != options_current_.sort_skip_articles_for_artists || sort_skip_articles_for_artists != options_current_.sort_skip_articles_for_artists ||
sort_skip_articles_for_albums != options_current_.sort_skip_articles_for_albums) { sort_skip_articles_for_albums != options_current_.sort_skip_articles_for_albums ||
use_sort_tags != options_current_.use_sort_tags) {
options_current_.show_pretty_covers = show_pretty_covers; options_current_.show_pretty_covers = show_pretty_covers;
options_current_.show_dividers = show_dividers; options_current_.show_dividers = show_dividers;
options_current_.show_various_artists = show_various_artists; options_current_.show_various_artists = show_various_artists;
options_current_.sort_skip_articles_for_artists = sort_skip_articles_for_artists; options_current_.sort_skip_articles_for_artists = sort_skip_articles_for_artists;
options_current_.sort_skip_articles_for_albums = sort_skip_articles_for_albums; options_current_.sort_skip_articles_for_albums = sort_skip_articles_for_albums;
options_current_.use_sort_tags = use_sort_tags;
ScheduleReset(); ScheduleReset();
} }
@@ -705,7 +708,7 @@ CollectionItem *CollectionModel::CreateContainerItem(const GroupBy group_by, con
QString divider_key; QString divider_key;
if (options_active_.show_dividers && container_level == 0) { if (options_active_.show_dividers && container_level == 0) {
divider_key = DividerKey(group_by, song, SortText(group_by, song, options_active_.sort_skip_articles_for_artists, options_active_.sort_skip_articles_for_albums)); divider_key = DividerKey(group_by, song, SortText(group_by, song, options_active_.sort_skip_articles_for_artists, options_active_.sort_skip_articles_for_albums, options_active_.use_sort_tags));
if (!divider_key.isEmpty()) { if (!divider_key.isEmpty()) {
if (!divider_nodes_.contains(divider_key)) { if (!divider_nodes_.contains(divider_key)) {
CreateDividerItem(divider_key, DividerDisplayText(group_by, divider_key), parent); CreateDividerItem(divider_key, DividerDisplayText(group_by, divider_key), parent);
@@ -719,7 +722,7 @@ CollectionItem *CollectionModel::CreateContainerItem(const GroupBy group_by, con
item->container_level = container_level; item->container_level = container_level;
item->container_key = container_key; item->container_key = container_key;
item->display_text = DisplayText(group_by, song); item->display_text = DisplayText(group_by, song);
item->sort_text = SortText(group_by, song, options_active_.sort_skip_articles_for_artists, options_active_.sort_skip_articles_for_albums); item->sort_text = SortText(group_by, song, options_active_.sort_skip_articles_for_artists, options_active_.sort_skip_articles_for_albums, options_active_.use_sort_tags);
if (!divider_key.isEmpty()) { if (!divider_key.isEmpty()) {
item->sort_text.prepend(divider_key + QLatin1Char(' ')); item->sort_text.prepend(divider_key + QLatin1Char(' '));
} }
@@ -1074,37 +1077,37 @@ QString CollectionModel::PrettyFormat(const Song &song) {
} }
QString CollectionModel::SortText(const GroupBy group_by, const Song &song, const bool sort_skip_articles_for_artists, const bool sort_skip_articles_for_albums) { QString CollectionModel::SortText(const GroupBy group_by, const Song &song, const bool sort_skip_articles_for_artists, const bool sort_skip_articles_for_albums, const bool use_sort_tags) {
switch (group_by) { switch (group_by) {
case GroupBy::AlbumArtist: case GroupBy::AlbumArtist:
return SortTextForName(song.effective_albumartistsort(), sort_skip_articles_for_artists); return SortTextForName(use_sort_tags ? song.effective_albumartistsort() : song.effective_albumartist(), sort_skip_articles_for_artists);
case GroupBy::Artist: case GroupBy::Artist:
return SortTextForName(song.effective_artistsort(), sort_skip_articles_for_artists); return SortTextForName(use_sort_tags ? song.effective_artistsort() : song.artist(), sort_skip_articles_for_artists);
case GroupBy::Album: case GroupBy::Album:
return SortTextForName(song.effective_albumsort(), sort_skip_articles_for_albums); return SortTextForName(use_sort_tags ? song.effective_albumsort() : song.album(), sort_skip_articles_for_albums);
case GroupBy::AlbumDisc: case GroupBy::AlbumDisc:
return SortTextForName(song.effective_albumsort(), sort_skip_articles_for_albums) + SortTextForNumber(std::max(0, song.disc())); return SortTextForName(use_sort_tags ? song.effective_albumsort() : song.album(), sort_skip_articles_for_albums) + SortTextForNumber(std::max(0, song.disc()));
case GroupBy::YearAlbum: case GroupBy::YearAlbum:
return SortTextForNumber(std::max(0, song.year())) + song.grouping() + SortTextForName(song.effective_albumsort(), sort_skip_articles_for_albums); return SortTextForYear(song.year()) + song.grouping() + SortTextForName(use_sort_tags ? song.effective_albumsort() : song.album(), sort_skip_articles_for_albums);
case GroupBy::YearAlbumDisc: case GroupBy::YearAlbumDisc:
return SortTextForNumber(std::max(0, song.year())) + SortTextForName(song.effective_albumsort(), sort_skip_articles_for_albums) + SortTextForNumber(std::max(0, song.disc())); return SortTextForYear(song.year()) + SortTextForName(use_sort_tags ? song.effective_albumsort() : song.album(), sort_skip_articles_for_albums) + SortTextForNumber(std::max(0, song.disc()));
case GroupBy::OriginalYearAlbum: case GroupBy::OriginalYearAlbum:
return SortTextForNumber(std::max(0, song.effective_originalyear())) + song.grouping() + SortTextForName(song.effective_albumsort(), sort_skip_articles_for_albums); return SortTextForYear(song.effective_originalyear()) + song.grouping() + SortTextForName(use_sort_tags ? song.effective_albumsort() : song.album(), sort_skip_articles_for_albums);
case GroupBy::OriginalYearAlbumDisc: case GroupBy::OriginalYearAlbumDisc:
return SortTextForNumber(std::max(0, song.effective_originalyear())) + SortTextForName(song.effective_albumsort(), sort_skip_articles_for_albums) + SortTextForNumber(std::max(0, song.disc())); return SortTextForYear(song.effective_originalyear()) + SortTextForName(use_sort_tags ? song.effective_albumsort() : song.album(), sort_skip_articles_for_albums) + SortTextForNumber(std::max(0, song.disc()));
case GroupBy::Disc: case GroupBy::Disc:
return SortTextForNumber(std::max(0, song.disc())); return SortTextForNumber(std::max(0, song.disc()));
case GroupBy::Year: case GroupBy::Year:
return SortTextForNumber(std::max(0, song.year())) + QLatin1Char(' '); return SortTextForYear(song.year()) + QLatin1Char(' ');
case GroupBy::OriginalYear: case GroupBy::OriginalYear:
return SortTextForNumber(std::max(0, song.effective_originalyear())) + QLatin1Char(' '); return SortTextForYear(song.effective_originalyear()) + QLatin1Char(' ');
case GroupBy::Genre: case GroupBy::Genre:
return SortText(song.genre()); return SortText(song.genre());
case GroupBy::Composer: case GroupBy::Composer:
return SortTextForName(song.effective_composersort(), sort_skip_articles_for_artists); return SortTextForName(use_sort_tags ? song.effective_composersort() : song.composer(), sort_skip_articles_for_artists);
case GroupBy::Performer: case GroupBy::Performer:
return SortTextForName(song.effective_performersort(), sort_skip_articles_for_artists); return SortTextForName(use_sort_tags ? song.effective_performersort() : song.performer(), sort_skip_articles_for_artists);
case GroupBy::Grouping: case GroupBy::Grouping:
return SortText(song.grouping()); return SortText(song.grouping());
case GroupBy::FileType: case GroupBy::FileType:
@@ -1162,14 +1165,14 @@ QString CollectionModel::SortTextForSong(const Song &song) {
QString CollectionModel::SortTextForYear(const int year) { QString CollectionModel::SortTextForYear(const int year) {
QString str = QString::number(year); const QString str = QString::number(std::max(year, 0));
return QStringLiteral("0").repeated(qMax(0, 4 - str.length())) + str; return QStringLiteral("0").repeated(qMax(0, 4 - str.length())) + str;
} }
QString CollectionModel::SortTextForBitrate(const int bitrate) { QString CollectionModel::SortTextForBitrate(const int bitrate) {
QString str = QString::number(bitrate); const QString str = QString::number(bitrate);
return QStringLiteral("0").repeated(qMax(0, 3 - str.length())) + str; return QStringLiteral("0").repeated(qMax(0, 3 - str.length())) + str;
} }
@@ -1206,39 +1209,50 @@ QString CollectionModel::ContainerKey(const GroupBy group_by, const Song &song,
switch (group_by) { switch (group_by) {
case GroupBy::AlbumArtist: case GroupBy::AlbumArtist:
key = TextOrUnknown(song.effective_albumartist()); key = TextOrUnknown(song.effective_albumartist());
if (!song.effective_albumartistsort().isEmpty() && song.effective_albumartistsort() != song.effective_albumartist()) key.append(QLatin1Char('-') + TextOrUnknown(song.effective_albumartistsort()));
has_unique_album_identifier = true; has_unique_album_identifier = true;
break; break;
case GroupBy::Artist: case GroupBy::Artist:
key = TextOrUnknown(song.artist()); key = TextOrUnknown(song.artist());
if (!song.artistsort().isEmpty() && song.artistsort() != song.artist()) key.append(QLatin1Char('-') + TextOrUnknown(song.artistsort()));
has_unique_album_identifier = true; has_unique_album_identifier = true;
break; break;
case GroupBy::Album: case GroupBy::Album:
key = TextOrUnknown(song.album()); key = TextOrUnknown(song.album());
if (!song.albumsort().isEmpty() && song.albumsort() != song.album()) key.append(QLatin1Char('-') + TextOrUnknown(song.albumsort()));
if (!song.album_id().isEmpty()) key.append(QLatin1Char('-') + song.album_id()); if (!song.album_id().isEmpty()) key.append(QLatin1Char('-') + song.album_id());
if (options_active_.separate_albums_by_grouping && !song.grouping().isEmpty()) key.append(QLatin1Char('-') + song.grouping()); if (options_active_.separate_albums_by_grouping && !song.grouping().isEmpty()) key.append(QLatin1Char('-') + song.grouping());
break; break;
case GroupBy::AlbumDisc: case GroupBy::AlbumDisc:
key = PrettyAlbumDisc(song.album(), song.disc()); key = TextOrUnknown(song.album());
if (!song.albumsort().isEmpty() && song.albumsort() != song.album()) key.append(QLatin1Char('-') + TextOrUnknown(song.albumsort()));
key.append(QLatin1Char('-') + SortTextForNumber(song.disc()));
if (!song.album_id().isEmpty()) key.append(QLatin1Char('-') + song.album_id()); if (!song.album_id().isEmpty()) key.append(QLatin1Char('-') + song.album_id());
if (options_active_.separate_albums_by_grouping && !song.grouping().isEmpty()) key.append(QLatin1Char('-') + song.grouping()); if (options_active_.separate_albums_by_grouping && !song.grouping().isEmpty()) key.append(QLatin1Char('-') + song.grouping());
break; break;
case GroupBy::YearAlbum: case GroupBy::YearAlbum:
key = PrettyYearAlbum(song.year(), song.album()); key = SortTextForYear(song.year()) + QLatin1Char('-') + TextOrUnknown(song.album());
if (!song.albumsort().isEmpty() && song.albumsort() != song.album()) key.append(QLatin1Char('-') + TextOrUnknown(song.albumsort()));
if (!song.album_id().isEmpty()) key.append(QLatin1Char('-') + song.album_id()); if (!song.album_id().isEmpty()) key.append(QLatin1Char('-') + song.album_id());
if (options_active_.separate_albums_by_grouping && !song.grouping().isEmpty()) key.append(QLatin1Char('-') + song.grouping()); if (options_active_.separate_albums_by_grouping && !song.grouping().isEmpty()) key.append(QLatin1Char('-') + song.grouping());
break; break;
case GroupBy::YearAlbumDisc: case GroupBy::YearAlbumDisc:
key = PrettyYearAlbumDisc(song.year(), song.album(), song.disc()); key = SortTextForYear(song.year()) + QLatin1Char('-') + TextOrUnknown(song.album());
if (!song.albumsort().isEmpty() && song.albumsort() != song.album()) key.append(QLatin1Char('-') + TextOrUnknown(song.albumsort()));
key.append(QLatin1Char('-') + SortTextForNumber(song.disc()));
if (!song.album_id().isEmpty()) key.append(QLatin1Char('-') + song.album_id()); if (!song.album_id().isEmpty()) key.append(QLatin1Char('-') + song.album_id());
if (options_active_.separate_albums_by_grouping && !song.grouping().isEmpty()) key.append(QLatin1Char('-') + song.grouping()); if (options_active_.separate_albums_by_grouping && !song.grouping().isEmpty()) key.append(QLatin1Char('-') + song.grouping());
break; break;
case GroupBy::OriginalYearAlbum: case GroupBy::OriginalYearAlbum:
key = PrettyYearAlbum(song.effective_originalyear(), song.album()); key = SortTextForYear(song.effective_originalyear()) + QLatin1Char('-') + TextOrUnknown(song.album());
if (!song.albumsort().isEmpty() && song.albumsort() != song.album()) key.append(QLatin1Char('-') + TextOrUnknown(song.albumsort()));
if (!song.album_id().isEmpty()) key.append(QLatin1Char('-') + song.album_id()); if (!song.album_id().isEmpty()) key.append(QLatin1Char('-') + song.album_id());
if (options_active_.separate_albums_by_grouping && !song.grouping().isEmpty()) key.append(QLatin1Char('-') + song.grouping()); if (options_active_.separate_albums_by_grouping && !song.grouping().isEmpty()) key.append(QLatin1Char('-') + song.grouping());
break; break;
case GroupBy::OriginalYearAlbumDisc: case GroupBy::OriginalYearAlbumDisc:
key = PrettyYearAlbumDisc(song.effective_originalyear(), song.album(), song.disc()); key = SortTextForYear(song.effective_originalyear()) + QLatin1Char('-') + TextOrUnknown(song.album());
if (!song.albumsort().isEmpty() && song.albumsort() != song.album()) key.append(QLatin1Char('-') + TextOrUnknown(song.albumsort()));
key.append(QLatin1Char('-') + SortTextForNumber(song.disc()));
if (!song.album_id().isEmpty()) key.append(QLatin1Char('-') + song.album_id()); if (!song.album_id().isEmpty()) key.append(QLatin1Char('-') + song.album_id());
if (options_active_.separate_albums_by_grouping && !song.grouping().isEmpty()) key.append(QLatin1Char('-') + song.grouping()); if (options_active_.separate_albums_by_grouping && !song.grouping().isEmpty()) key.append(QLatin1Char('-') + song.grouping());
break; break;
@@ -1246,20 +1260,22 @@ QString CollectionModel::ContainerKey(const GroupBy group_by, const Song &song,
key = PrettyDisc(song.disc()); key = PrettyDisc(song.disc());
break; break;
case GroupBy::Year: case GroupBy::Year:
key = QString::number(std::max(0, song.year())); key = SortTextForYear(song.year());
break; break;
case GroupBy::OriginalYear: case GroupBy::OriginalYear:
key = QString::number(std::max(0, song.effective_originalyear())); key = SortTextForYear(song.effective_originalyear());
break; break;
case GroupBy::Genre: case GroupBy::Genre:
key = TextOrUnknown(song.genre()); key = TextOrUnknown(song.genre());
break; break;
case GroupBy::Composer: case GroupBy::Composer:
key = TextOrUnknown(song.composer()); key = TextOrUnknown(song.composer());
if (!song.composersort().isEmpty() && song.composersort() != song.composer()) key.append(QLatin1Char('-') + song.composersort());
has_unique_album_identifier = true; has_unique_album_identifier = true;
break; break;
case GroupBy::Performer: case GroupBy::Performer:
key = TextOrUnknown(song.performer()); key = TextOrUnknown(song.performer());
if (!song.performersort().isEmpty() && song.performersort() != song.performer()) key.append(QLatin1Char('-') + song.performersort());
has_unique_album_identifier = true; has_unique_album_identifier = true;
break; break;
case GroupBy::Grouping: case GroupBy::Grouping:
@@ -1341,7 +1357,7 @@ QString CollectionModel::DividerKey(const GroupBy group_by, const Song &song, co
case GroupBy::Bitdepth: case GroupBy::Bitdepth:
return SortTextForNumber(song.bitdepth()); return SortTextForNumber(song.bitdepth());
case GroupBy::Bitrate: case GroupBy::Bitrate:
return SortTextForNumber(song.bitrate()); return SortTextForBitrate(song.bitrate());
case GroupBy::None: case GroupBy::None:
case GroupBy::GroupByCount: case GroupBy::GroupByCount:
return QString(); return QString();

View File

@@ -131,6 +131,7 @@ class CollectionModel : public SimpleTreeModel<CollectionItem> {
show_various_artists(true), show_various_artists(true),
sort_skip_articles_for_artists(false), sort_skip_articles_for_artists(false),
sort_skip_articles_for_albums(false), sort_skip_articles_for_albums(false),
use_sort_tags(true),
separate_albums_by_grouping(false) {} separate_albums_by_grouping(false) {}
Grouping group_by; Grouping group_by;
@@ -139,6 +140,7 @@ class CollectionModel : public SimpleTreeModel<CollectionItem> {
bool show_various_artists; bool show_various_artists;
bool sort_skip_articles_for_artists; bool sort_skip_articles_for_artists;
bool sort_skip_articles_for_albums; bool sort_skip_articles_for_albums;
bool use_sort_tags;
bool separate_albums_by_grouping; bool separate_albums_by_grouping;
CollectionFilterOptions filter_options; CollectionFilterOptions filter_options;
}; };
@@ -178,14 +180,14 @@ class CollectionModel : public SimpleTreeModel<CollectionItem> {
QMimeData *mimeData(const QModelIndexList &indexes) const override; QMimeData *mimeData(const QModelIndexList &indexes) const override;
// Utility functions for manipulating text // Utility functions for manipulating text
QString DisplayText(const GroupBy group_by, const Song &song); static QString DisplayText(const GroupBy group_by, const Song &song);
static QString TextOrUnknown(const QString &text); static QString TextOrUnknown(const QString &text);
static QString PrettyYearAlbum(const int year, const QString &album); static QString PrettyYearAlbum(const int year, const QString &album);
static QString PrettyAlbumDisc(const QString &album, const int disc); static QString PrettyAlbumDisc(const QString &album, const int disc);
static QString PrettyYearAlbumDisc(const int year, const QString &album, const int disc); static QString PrettyYearAlbumDisc(const int year, const QString &album, const int disc);
static QString PrettyDisc(const int disc); static QString PrettyDisc(const int disc);
static QString PrettyFormat(const Song &song); static QString PrettyFormat(const Song &song);
QString SortText(const GroupBy group_by, const Song &song, const bool sort_skip_articles_for_artists, const bool sort_skip_articles_for_albums); static QString SortText(const GroupBy group_by, const Song &song, const bool sort_skip_articles_for_artists, const bool sort_skip_articles_for_albums, const bool use_sort_tags);
static QString SortText(QString text); static QString SortText(QString text);
static QString SortTextForName(const QString &name, const bool sort_skip_articles); static QString SortTextForName(const QString &name, const bool sort_skip_articles);
static QString SortTextForNumber(const int number); static QString SortTextForNumber(const int number);

View File

@@ -58,4 +58,3 @@ class CollectionPlaylistItem : public PlaylistItem {
}; };
#endif // COLLECTIONPLAYLISTITEM_H #endif // COLLECTIONPLAYLISTITEM_H

View File

@@ -137,7 +137,7 @@ class CollectionWatcher : public QObject {
QStringList files_changed_path_; QStringList files_changed_path_;
private: private:
ScanTransaction &operator=(const ScanTransaction&) { return *this; } ScanTransaction &operator=(const ScanTransaction &transaction) { Q_UNUSED(transaction); return *this; }
int task_id_; int task_id_;
quint64 progress_; quint64 progress_;
@@ -261,7 +261,6 @@ class CollectionWatcher : public QObject {
static QStringList sValidImages; static QStringList sValidImages;
qint64 last_scan_time_; qint64 last_scan_time_;
}; };
inline QString CollectionWatcher::NoExtensionPart(const QString &fileName) { inline QString CollectionWatcher::NoExtensionPart(const QString &fileName) {

View File

@@ -70,6 +70,6 @@ enum class BackgroundImagePosition {
BottomRight = 5 BottomRight = 5
}; };
} // namespace } // namespace AppearanceSettings
#endif // APPEARANCESETTINGS_H #endif // APPEARANCESETTINGS_H

View File

@@ -63,6 +63,6 @@ constexpr qint64 kDefaultBufferDuration = 4000;
constexpr double kDefaultBufferLowWatermark = 0.33; constexpr double kDefaultBufferLowWatermark = 0.33;
constexpr double kDefaultBufferHighWatermark = 0.99; constexpr double kDefaultBufferHighWatermark = 0.99;
} // namespace } // namespace BackendSettings
#endif // BACKENDSETTINGS_H #endif // BACKENDSETTINGS_H

View File

@@ -71,6 +71,6 @@ constexpr char kDoubleClickPlaylistAddMode[] = "doubleclick_playlist_addmode";
constexpr char kSeekStepSec[] = "seek_step_sec"; constexpr char kSeekStepSec[] = "seek_step_sec";
constexpr char kVolumeIncrement[] = "volume_increment"; constexpr char kVolumeIncrement[] = "volume_increment";
} // namespace } // namespace BehaviourSettings
#endif // BEHAVIOURSETTINGS_H #endif // BEHAVIOURSETTINGS_H

View File

@@ -37,7 +37,7 @@ constexpr char kPrettyCovers[] = "pretty_covers";
constexpr char kVariousArtists[] = "various_artists"; constexpr char kVariousArtists[] = "various_artists";
constexpr char kSkipArticlesForArtists[] = "skip_articles_for_artists"; constexpr char kSkipArticlesForArtists[] = "skip_articles_for_artists";
constexpr char kSkipArticlesForAlbums[] = "skip_articles_for_albums"; constexpr char kSkipArticlesForAlbums[] = "skip_articles_for_albums";
constexpr char kShowSortText[] = "show_sort_text"; constexpr char kUseSortTags[] = "use_short_tags";
constexpr char kSettingsCacheSize[] = "cache_size"; constexpr char kSettingsCacheSize[] = "cache_size";
constexpr char kSettingsCacheSizeUnit[] = "cache_size_unit"; constexpr char kSettingsCacheSizeUnit[] = "cache_size_unit";
constexpr char kSettingsDiskCacheEnable[] = "disk_cache_enable"; constexpr char kSettingsDiskCacheEnable[] = "disk_cache_enable";
@@ -59,6 +59,6 @@ enum class CacheSizeUnit {
TB TB
}; };
} // namespace } // namespace CollectionSettings
#endif // COLLECTIONSETTINGS_H #endif // COLLECTIONSETTINGS_H

View File

@@ -43,6 +43,6 @@ constexpr char kSettingsSummaryFmt[] = "SummaryFmt";
constexpr char kDefaultFontFamily[] = "Noto Sans"; constexpr char kDefaultFontFamily[] = "Noto Sans";
constexpr qreal kDefaultFontSizeHeadline = 11; constexpr qreal kDefaultFontSizeHeadline = 11;
} // namespace } // namespace ContextSettings
#endif // CONTEXTSETTINGS_H #endif // CONTEXTSETTINGS_H

View File

@@ -32,6 +32,6 @@ constexpr char kSaveOverwrite[] = "save_overwrite";
constexpr char kSaveLowercase[] = "save_lowercase"; constexpr char kSaveLowercase[] = "save_lowercase";
constexpr char kSaveReplaceSpaces[] = "save_replace_spaces"; constexpr char kSaveReplaceSpaces[] = "save_replace_spaces";
} // namespace } // namespace CoversSettings
#endif // COVERSSETTINGS_H #endif // COVERSSETTINGS_H

View File

@@ -26,6 +26,6 @@ constexpr char kSettingsGroup[] = "GlobalShortcuts";
constexpr char kUseKGlobalAccel[] = "use_kglobalaccel"; constexpr char kUseKGlobalAccel[] = "use_kglobalaccel";
constexpr char kUseX11[] = "use_x11"; constexpr char kUseX11[] = "use_x11";
} // namespace } // namespace GlobalShortcutsSettings
#endif // GLOBALSHORTCUTSSETTINGS_H #endif // GLOBALSHORTCUTSSETTINGS_H

View File

@@ -25,6 +25,6 @@ namespace LyricsSettings {
constexpr char kSettingsGroup[] = "Lyrics"; constexpr char kSettingsGroup[] = "Lyrics";
constexpr char kProviders[] = "providers"; constexpr char kProviders[] = "providers";
} // namespace } // namespace LyricsSettings
#endif // LYRICSSETTINGS_H #endif // LYRICSSETTINGS_H

View File

@@ -32,6 +32,6 @@ constexpr char kGeometry[] = "geometry";
constexpr char kSplitterState[] = "splitter_state"; constexpr char kSplitterState[] = "splitter_state";
constexpr char kDoNotShowSponsorMessage[] = "do_not_show_sponsor_message"; constexpr char kDoNotShowSponsorMessage[] = "do_not_show_sponsor_message";
} // namespace } // namespace MainWindowSettings
#endif // MAINWINDOWSETTINGS_H #endif // MAINWINDOWSETTINGS_H

View File

@@ -38,6 +38,6 @@ constexpr char kShow[] = "show";
constexpr char kStyle[] = "style"; constexpr char kStyle[] = "style";
constexpr char kSave[] = "save"; constexpr char kSave[] = "save";
} // namespace } // namespace MoodbarSettings
#endif // MOODBARSETTINGS_H #endif // MOODBARSETTINGS_H

View File

@@ -32,6 +32,6 @@ constexpr char kUsername[] = "username";
constexpr char kPassword[] = "password"; constexpr char kPassword[] = "password";
constexpr char kEngine[] = "engine"; constexpr char kEngine[] = "engine";
} // namespace } // namespace NetworkProxySettings
#endif // NETWORKPROXYSETTINGS_H #endif // NETWORKPROXYSETTINGS_H

View File

@@ -45,7 +45,7 @@ constexpr char kCustomTextEnabled[] = "CustomTextEnabled";
constexpr char kCustomText1[] = "CustomText1"; constexpr char kCustomText1[] = "CustomText1";
constexpr char kCustomText2[] = "CustomText2"; constexpr char kCustomText2[] = "CustomText2";
} // namespace } // namespace OSDSettings
namespace OSDPrettySettings { namespace OSDPrettySettings {
@@ -63,7 +63,7 @@ constexpr char kFading[] = "fading";
constexpr QRgb kPresetBlue = qRgb(102, 150, 227); constexpr QRgb kPresetBlue = qRgb(102, 150, 227);
constexpr QRgb kPresetRed = qRgb(202, 22, 16); constexpr QRgb kPresetRed = qRgb(202, 22, 16);
} // namespace } // namespace OSDPrettySettings
namespace DiscordRPCSettings { namespace DiscordRPCSettings {
@@ -79,6 +79,6 @@ enum class StatusDisplayType {
Song Song
}; };
} // namespace } // namespace DiscordRPCSettings
#endif // NOTIFICATIONSSETTINGS_H #endif // NOTIFICATIONSSETTINGS_H

View File

@@ -63,7 +63,7 @@ constexpr char kLastSaveExtension[] = "last_save_extension";
constexpr char kLastSaveAllPath[] = "last_save_all_path"; constexpr char kLastSaveAllPath[] = "last_save_all_path";
constexpr char kLastSaveAllExtension[] = "last_save_all_extension"; constexpr char kLastSaveAllExtension[] = "last_save_all_extension";
} // namespace } // namespace PlaylistSettings
Q_DECLARE_METATYPE(PlaylistSettings::PathType) Q_DECLARE_METATYPE(PlaylistSettings::PathType)

View File

@@ -43,6 +43,6 @@ constexpr char kCredentialsId[] = "credentials_id";
constexpr char kDeviceId[] = "device_id"; constexpr char kDeviceId[] = "device_id";
constexpr char kUserAuthToken[] = "user_auth_token"; constexpr char kUserAuthToken[] = "user_auth_token";
} // namespace } // namespace QobuzSettings
#endif // QOBUZSETTINGS_H #endif // QOBUZSETTINGS_H

View File

@@ -35,6 +35,6 @@ constexpr char kStripRemastered[] = "strip_remastered";
constexpr char kSources[] = "sources"; constexpr char kSources[] = "sources";
constexpr char kUserToken[] = "user_token"; constexpr char kUserToken[] = "user_token";
} // namespace } // namespace ScrobblerSettings
#endif // SCROBBLERSETTINGS_H #endif // SCROBBLERSETTINGS_H

View File

@@ -38,6 +38,6 @@ constexpr char kRefreshToken[] = "refresh_token";
constexpr char kExpiresIn[] = "expires_in"; constexpr char kExpiresIn[] = "expires_in";
constexpr char kLoginTime[] = "login_time"; constexpr char kLoginTime[] = "login_time";
} // namespace } // namespace SpotifySettings
#endif // SPOTIFYSETTINGS_H #endif // SPOTIFYSETTINGS_H

View File

@@ -41,6 +41,6 @@ constexpr char kUseAlbumIdForAlbumCovers[] = "usealbumidforalbumcovers";
constexpr char kServerSideScrobbling[] = "serversidescrobbling"; constexpr char kServerSideScrobbling[] = "serversidescrobbling";
constexpr char kAuthMethod[] = "authmethod"; constexpr char kAuthMethod[] = "authmethod";
} // namespace } // namespace SubsonicSettings
#endif // SUBSONICETTINGS_H #endif // SUBSONICETTINGS_H

View File

@@ -48,6 +48,6 @@ enum class StreamUrlMethod {
PlaybackInfoPostPaywall PlaybackInfoPostPaywall
}; };
} } // namespace TidalSettings
#endif // TIDALSETTINGS_H #endif // TIDALSETTINGS_H

View File

@@ -26,4 +26,3 @@ constexpr char kSettingsGroup[] = "Transcoder";
} }
#endif // TRANSCODERSETTINGS_H #endif // TRANSCODERSETTINGS_H

View File

@@ -61,7 +61,6 @@ class ContextAlbum : public QWidget {
void contextMenuEvent(QContextMenuEvent *e) override; void contextMenuEvent(QContextMenuEvent *e) override;
private: private:
struct PreviousCover { struct PreviousCover {
explicit PreviousCover() : opacity(0.0) {} explicit PreviousCover() : opacity(0.0) {}
QImage image; QImage image;

View File

@@ -59,6 +59,7 @@
#include "covermanager/albumcoverchoicecontroller.h" #include "covermanager/albumcoverchoicecontroller.h"
#include "lyrics/lyricsfetcher.h" #include "lyrics/lyricsfetcher.h"
#include "constants/contextsettings.h" #include "constants/contextsettings.h"
#include "constants/timeconstants.h"
#include "contextview.h" #include "contextview.h"
#include "contextalbum.h" #include "contextalbum.h"
@@ -353,7 +354,7 @@ void ContextView::SearchLyrics() {
if (lyrics_.isEmpty() && action_show_lyrics_->isChecked() && action_search_lyrics_->isChecked() && !song_playing_.artist().isEmpty() && !song_playing_.title().isEmpty() && !lyrics_tried_ && lyrics_id_ == -1) { if (lyrics_.isEmpty() && action_show_lyrics_->isChecked() && action_search_lyrics_->isChecked() && !song_playing_.artist().isEmpty() && !song_playing_.title().isEmpty() && !lyrics_tried_ && lyrics_id_ == -1) {
lyrics_fetcher_->Clear(); lyrics_fetcher_->Clear();
lyrics_tried_ = true; lyrics_tried_ = true;
lyrics_id_ = static_cast<qint64>(lyrics_fetcher_->Search(song_playing_.effective_albumartist(), song_playing_.artist(), song_playing_.album(), song_playing_.title())); lyrics_id_ = static_cast<qint64>(lyrics_fetcher_->Search(song_playing_.effective_albumartist(), song_playing_.artist(), song_playing_.album(), song_playing_.title(), song_playing_.length_nanosec() / kNsecPerSec));
} }
} }

View File

@@ -65,9 +65,9 @@ class ContextView : public QWidget {
protected: protected:
void resizeEvent(QResizeEvent *e) override; void resizeEvent(QResizeEvent *e) override;
void contextMenuEvent(QContextMenuEvent*) override; void contextMenuEvent(QContextMenuEvent *e) override;
void dragEnterEvent(QDragEnterEvent*) override; void dragEnterEvent(QDragEnterEvent *e) override;
void dropEvent(QDropEvent*) override; void dropEvent(QDropEvent *e) override;
private: private:
void AddActions(); void AddActions();

View File

@@ -74,6 +74,7 @@
#include "lyrics/elyricsnetlyricsprovider.h" #include "lyrics/elyricsnetlyricsprovider.h"
#include "lyrics/letraslyricsprovider.h" #include "lyrics/letraslyricsprovider.h"
#include "lyrics/lyricfindlyricsprovider.h" #include "lyrics/lyricfindlyricsprovider.h"
#include "lyrics/lrcliblyricsprovider.h"
#include "scrobbler/audioscrobbler.h" #include "scrobbler/audioscrobbler.h"
#include "scrobbler/lastfmscrobbler.h" #include "scrobbler/lastfmscrobbler.h"
@@ -117,8 +118,8 @@ using namespace std::chrono_literals;
class ApplicationImpl { class ApplicationImpl {
public: public:
explicit ApplicationImpl(Application *app) : explicit ApplicationImpl(Application *app)
tagreader_client_([app](){ : tagreader_client_([app]() {
TagReaderClient *client = new TagReaderClient(); TagReaderClient *client = new TagReaderClient();
app->MoveToNewThread(client); app->MoveToNewThread(client);
return client; return client;
@@ -182,6 +183,7 @@ class ApplicationImpl {
lyrics_providers->AddProvider(new ElyricsNetLyricsProvider(lyrics_providers->network())); lyrics_providers->AddProvider(new ElyricsNetLyricsProvider(lyrics_providers->network()));
lyrics_providers->AddProvider(new LetrasLyricsProvider(lyrics_providers->network())); lyrics_providers->AddProvider(new LetrasLyricsProvider(lyrics_providers->network()));
lyrics_providers->AddProvider(new LyricFindLyricsProvider(lyrics_providers->network())); lyrics_providers->AddProvider(new LyricFindLyricsProvider(lyrics_providers->network()));
lyrics_providers->AddProvider(new LrcLibLyricsProvider(lyrics_providers->network()));
lyrics_providers->ReloadSettings(); lyrics_providers->ReloadSettings();
return lyrics_providers; return lyrics_providers;
}), }),

View File

@@ -61,8 +61,8 @@ constexpr char kMagicAllSongsTables[] = "%allsongstables";
int Database::sNextConnectionId = 1; int Database::sNextConnectionId = 1;
QMutex Database::sNextConnectionIdMutex; QMutex Database::sNextConnectionIdMutex;
Database::Database(SharedPtr<TaskManager> task_manager, QObject *parent, const QString &database_name) : Database::Database(SharedPtr<TaskManager> task_manager, QObject *parent, const QString &database_name)
QObject(parent), : QObject(parent),
task_manager_(task_manager), task_manager_(task_manager),
injected_database_name_(database_name), injected_database_name_(database_name),
query_hash_(0), query_hash_(0),
@@ -503,7 +503,9 @@ bool Database::IntegrityCheck(const QSqlDatabase &db) {
break; break;
} }
else { else {
if (!error_reported) { Q_EMIT Error(tr("Database corruption detected.")); } if (!error_reported) {
Q_EMIT Error(tr("Database corruption detected."));
}
Q_EMIT Error(u"Database: "_s + message); Q_EMIT Error(u"Database: "_s + message);
error_reported = true; error_reported = true;
} }
@@ -594,8 +596,7 @@ void Database::BackupFile(const QString &filename) {
ret = sqlite3_backup_step(backup, 16); ret = sqlite3_backup_step(backup, 16);
const int page_count = sqlite3_backup_pagecount(backup); const int page_count = sqlite3_backup_pagecount(backup);
task_manager_->SetTaskProgress(task_id, static_cast<quint64>(page_count - sqlite3_backup_remaining(backup)), static_cast<quint64>(page_count)); task_manager_->SetTaskProgress(task_id, static_cast<quint64>(page_count - sqlite3_backup_remaining(backup)), static_cast<quint64>(page_count));
} } while (ret == SQLITE_OK);
while (ret == SQLITE_OK);
if (ret != SQLITE_DONE) { if (ret != SQLITE_DONE) {
qLog(Error) << "Database backup failed"; qLog(Error) << "Database backup failed";

View File

@@ -128,7 +128,6 @@ class Database : public QObject {
int startup_schema_version_; int startup_schema_version_;
QThread *original_thread_; QThread *original_thread_;
}; };
#endif // DATABASE_H #endif // DATABASE_H

View File

@@ -27,6 +27,7 @@ class IconLoader {
public: public:
static void Init(); static void Init();
static QIcon Load(const QString &name, const bool system_icon = true, const int fixed_size = 0, const int min_size = 0, const int max_size = 0); static QIcon Load(const QString &name, const bool system_icon = true, const int fixed_size = 0, const int min_size = 0, const int max_size = 0);
private: private:
explicit IconLoader() {} explicit IconLoader() {}
static bool system_icons_; static bool system_icons_;

View File

@@ -155,11 +155,7 @@ void LocalRedirectServer::WriteTemplate() const {
QBuffer image_buffer; QBuffer image_buffer;
if (image_buffer.open(QIODevice::ReadWrite)) { if (image_buffer.open(QIODevice::ReadWrite)) {
QApplication::style() QApplication::style()->standardIcon(QStyle::SP_DialogOkButton).pixmap(16).toImage().save(&image_buffer, "PNG");
->standardIcon(QStyle::SP_DialogOkButton)
.pixmap(16)
.toImage()
.save(&image_buffer, "PNG");
page_data.replace("@IMAGE_DATA@"_L1, QString::fromUtf8(image_buffer.data().toBase64())); page_data.replace("@IMAGE_DATA@"_L1, QString::fromUtf8(image_buffer.data().toBase64()));
image_buffer.close(); image_buffer.close();
} }

View File

@@ -296,9 +296,6 @@ MainWindow::MainWindow(Application *app,
#ifdef HAVE_DISCORD_RPC #ifdef HAVE_DISCORD_RPC
discord_rich_presence_(discord_rich_presence), discord_rich_presence_(discord_rich_presence),
#endif #endif
error_dialog_([this]() {
return new ErrorDialog(this);
}),
console_([app, this]() { console_([app, this]() {
Console *console = new Console(app->database()); Console *console = new Console(app->database());
QObject::connect(console, &Console::Error, this, &MainWindow::ShowErrorDialog); QObject::connect(console, &Console::Error, this, &MainWindow::ShowErrorDialog);

View File

@@ -285,7 +285,6 @@ class MainWindow : public QMainWindow, public PlatformInterface {
void Raise(); void Raise();
private: private:
void SaveSettings(); void SaveSettings();
static void ApplyAddBehaviour(const BehaviourSettings::AddBehaviour b, MimeData *mimedata); static void ApplyAddBehaviour(const BehaviourSettings::AddBehaviour b, MimeData *mimedata);
@@ -415,7 +414,6 @@ class MainWindow : public QMainWindow, public PlatformInterface {
bool playlists_loaded_; bool playlists_loaded_;
bool delete_files_; bool delete_files_;
std::optional<CommandlineOptions> options_; std::optional<CommandlineOptions> options_;
}; };
#endif // MAINWINDOW_H #endif // MAINWINDOW_H

View File

@@ -50,7 +50,7 @@ QNetworkReply *NetworkAccessManager::createRequest(Operation op, const QNetworkR
user_agent = network_request.header(QNetworkRequest::UserAgentHeader).toByteArray(); user_agent = network_request.header(QNetworkRequest::UserAgentHeader).toByteArray();
} }
else { else {
user_agent = QStringLiteral("%1 %2").arg(QCoreApplication::applicationName(), QCoreApplication::applicationVersion()).toUtf8(); user_agent = "Strawberry Music Player";
} }
QNetworkRequest new_network_request(network_request); QNetworkRequest new_network_request(network_request);

View File

@@ -121,8 +121,8 @@ class Player : public PlayerInterface {
void PlayPlaylistInternal(const EngineBase::TrackChangeFlags, const Playlist::AutoScroll autoscroll, const QString &playlist_name); void PlayPlaylistInternal(const EngineBase::TrackChangeFlags, const Playlist::AutoScroll autoscroll, const QString &playlist_name);
void FatalError(); void FatalError();
void ValidSongRequested(const QUrl&); void ValidSongRequested(const QUrl &url);
void InvalidSongRequested(const QUrl&); void InvalidSongRequested(const QUrl &url);
void HandleLoadResult(const UrlHandler::LoadResult &result); void HandleLoadResult(const UrlHandler::LoadResult &result);

View File

@@ -40,7 +40,6 @@ class QtFSListener : public FileSystemWatcherInterface {
private: private:
QFileSystemWatcher watcher_; QFileSystemWatcher watcher_;
}; };
#endif // QTFSLISTENER_H #endif // QTFSLISTENER_H

View File

@@ -28,6 +28,7 @@ class ScopedNSAutoreleasePool {
// Only use then when you're certain the items currently in the pool are // Only use then when you're certain the items currently in the pool are
// no longer needed. // no longer needed.
void Recycle(); void Recycle();
private: private:
NSAutoreleasePool *autorelease_pool_; NSAutoreleasePool *autorelease_pool_;

View File

@@ -2150,4 +2150,3 @@ QString Song::GetNameForNewPlaylist(const SongList &songs) {
return result; return result;
} }

View File

@@ -784,4 +784,3 @@ void SongLoader::CleanupPipeline() {
state_ = State::Finished; state_ = State::Finished;
} }

View File

@@ -171,7 +171,6 @@ class SongLoader : public QObject {
QStringList errors_; QStringList errors_;
bool success_; bool success_;
}; };
#endif // SONGLOADER_H #endif // SONGLOADER_H

View File

@@ -41,4 +41,3 @@ class SongMimeData : public MimeData {
}; };
#endif // SONGMIMEDATA_H #endif // SONGMIMEDATA_H

View File

@@ -41,17 +41,19 @@ Translations::~Translations() {
} }
void Translations::LoadTranslation(const QString &prefix, const QString &path, const QString &language) { bool Translations::LoadTranslation(const QString &prefix, const QString &path, const QString &language) {
const QString basefilename = prefix + u'_' + language; const QString basefilename = prefix + u'_' + language;
QTranslator *t = new QTranslator; QTranslator *t = new QTranslator;
if (t->load(basefilename, path)) { if (!t->load(basefilename, path)) {
delete t;
return false;
}
qLog(Debug) << "Tranlations loaded from" << basefilename; qLog(Debug) << "Tranlations loaded from" << basefilename;
QCoreApplication::installTranslator(t); QCoreApplication::installTranslator(t);
translations_ << t; translations_ << t;
}
else { return true;
delete t;
}
} }

View File

@@ -31,7 +31,7 @@ class Translations {
public: public:
explicit Translations(); explicit Translations();
~Translations(); ~Translations();
void LoadTranslation(const QString &prefix, const QString &path, const QString &language); bool LoadTranslation(const QString &prefix, const QString &path, const QString &language);
private: private:
QList<QTranslator*> translations_; QList<QTranslator*> translations_;

View File

@@ -53,4 +53,3 @@ UrlHandler::LoadResult::LoadResult(const QUrl &media_url, const Type type, const
bit_depth_(-1), bit_depth_(-1),
length_nanosec_(-1), length_nanosec_(-1),
error_(error) {} error_(error) {}

View File

@@ -89,7 +89,6 @@ class UrlHandler : public QObject {
Q_SIGNALS: Q_SIGNALS:
void AsyncLoadComplete(const UrlHandler::LoadResult &result); void AsyncLoadComplete(const UrlHandler::LoadResult &result);
}; };
#endif // URLHANDLER_H #endif // URLHANDLER_H

View File

@@ -812,8 +812,8 @@ QUrl AlbumCoverChoiceController::SaveCoverAutomatic(Song *song, const AlbumCover
SaveCoverEmbeddedToCollectionSongs(*song, result); SaveCoverEmbeddedToCollectionSongs(*song, result);
break; break;
} }
}
[[fallthrough]]; [[fallthrough]];
}
case CoverOptions::CoverType::Cache: case CoverOptions::CoverType::Cache:
case CoverOptions::CoverType::Album:{ case CoverOptions::CoverType::Album:{
cover_url = SaveCoverToFileAutomatic(song, result); cover_url = SaveCoverToFileAutomatic(song, result);

View File

@@ -75,4 +75,3 @@ class AlbumCoverExporter : public QObject {
}; };
#endif // ALBUMCOVEREXPORTER_H #endif // ALBUMCOVEREXPORTER_H

View File

@@ -113,7 +113,6 @@ class AlbumCoverFetcherSearch : public QObject {
SharedPtr<NetworkAccessManager> network_; SharedPtr<NetworkAccessManager> network_;
bool cancel_requested_; bool cancel_requested_;
}; };
#endif // ALBUMCOVERFETCHERSEARCH_H #endif // ALBUMCOVERFETCHERSEARCH_H

View File

@@ -58,5 +58,4 @@ AlbumCoverLoaderOptions::Types AlbumCoverLoaderOptions::LoadTypes() {
s.endGroup(); s.endGroup();
return cover_types; return cover_types;
} }

View File

@@ -44,8 +44,8 @@ class AlbumCoverLoaderResult {
const AlbumCoverImageResult &_album_cover = AlbumCoverImageResult(), const AlbumCoverImageResult &_album_cover = AlbumCoverImageResult(),
const QImage &_image_scaled = QImage(), const QImage &_image_scaled = QImage(),
const QUrl &_art_manual_updated = QUrl(), const QUrl &_art_manual_updated = QUrl(),
const QUrl &_art_automatic_updated = QUrl()) : const QUrl &_art_automatic_updated = QUrl())
success(_success), : success(_success),
type(_type), type(_type),
album_cover(_album_cover), album_cover(_album_cover),
image_scaled(_image_scaled), image_scaled(_image_scaled),

View File

@@ -102,7 +102,7 @@ using std::make_shared;
namespace { namespace {
constexpr char kSettingsGroup[] = "CoverManager"; constexpr char kSettingsGroup[] = "CoverManager";
constexpr int kThumbnailSize = 120; constexpr int kThumbnailSize = 120;
} } // namespace
AlbumCoverManager::AlbumCoverManager(const SharedPtr<NetworkAccessManager> network, AlbumCoverManager::AlbumCoverManager(const SharedPtr<NetworkAccessManager> network,
const SharedPtr<CollectionBackend> collection_backend, const SharedPtr<CollectionBackend> collection_backend,
@@ -604,10 +604,7 @@ void AlbumCoverManager::AlbumCoverFetched(const quint64 id, const AlbumCoverImag
void AlbumCoverManager::UpdateStatusText() { void AlbumCoverManager::UpdateStatusText() {
QString message = tr("Got %1 covers out of %2 (%3 failed)") QString message = tr("Got %1 covers out of %2 (%3 failed)").arg(fetch_statistics_.chosen_images_).arg(jobs_).arg(fetch_statistics_.missing_images_);
.arg(fetch_statistics_.chosen_images_)
.arg(jobs_)
.arg(fetch_statistics_.missing_images_);
if (fetch_statistics_.bytes_transferred_ > 0) { if (fetch_statistics_.bytes_transferred_ > 0) {
message += ", "_L1 + tr("%1 transferred").arg(Utilities::PrettySize(fetch_statistics_.bytes_transferred_)); message += ", "_L1 + tr("%1 transferred").arg(Utilities::PrettySize(fetch_statistics_.bytes_transferred_));
@@ -1083,10 +1080,7 @@ void AlbumCoverManager::UpdateExportStatus(const int exported, const int skipped
progress_bar_->setValue(exported); progress_bar_->setValue(exported);
QString message = tr("Exported %1 covers out of %2 (%3 skipped)") QString message = tr("Exported %1 covers out of %2 (%3 skipped)").arg(exported).arg(max).arg(skipped);
.arg(exported)
.arg(max)
.arg(skipped);
statusBar()->showMessage(message); statusBar()->showMessage(message);
// End of the current process // End of the current process
@@ -1131,4 +1125,3 @@ void AlbumCoverManager::SaveEmbeddedCoverFinished(TagReaderReplyPtr reply, Album
LoadAlbumCoverAsync(album_item); LoadAlbumCoverAsync(album_item);
} }

View File

@@ -83,7 +83,7 @@ class AlbumCoverSearcher : public QDialog {
AlbumCoverImageResult Exec(const QString &artist, const QString &album); AlbumCoverImageResult Exec(const QString &artist, const QString &album);
protected: protected:
void keyPressEvent(QKeyEvent*) override; void keyPressEvent(QKeyEvent *e) override;
private Q_SLOTS: private Q_SLOTS:
void Search(); void Search();

View File

@@ -45,8 +45,7 @@ CoverSearchStatisticsDialog::CoverSearchStatisticsDialog(QWidget *parent)
details_layout_ = new QVBoxLayout(ui_->details); details_layout_ = new QVBoxLayout(ui_->details);
details_layout_->setSpacing(0); details_layout_->setSpacing(0);
setStyleSheet( setStyleSheet(u"#details {"
u"#details {"
" background-color: palette(base);" " background-color: palette(base);"
"}" "}"
"#details QLabel[type=\"label\"] {" "#details QLabel[type=\"label\"] {"
@@ -67,10 +66,7 @@ void CoverSearchStatisticsDialog::Show(const CoverSearchStatistics &statistics)
QStringList providers(statistics.total_images_by_provider_.keys()); QStringList providers(statistics.total_images_by_provider_.keys());
std::sort(providers.begin(), providers.end()); std::sort(providers.begin(), providers.end());
ui_->summary->setText(tr("Got %1 covers out of %2 (%3 failed)") ui_->summary->setText(tr("Got %1 covers out of %2 (%3 failed)").arg(statistics.chosen_images_).arg(statistics.chosen_images_ + statistics.missing_images_).arg(statistics.missing_images_));
.arg(statistics.chosen_images_)
.arg(statistics.chosen_images_ + statistics.missing_images_)
.arg(statistics.missing_images_));
for (const QString &provider : std::as_const(providers)) { for (const QString &provider : std::as_const(providers)) {
AddLine(tr("Covers from %1").arg(provider), QString::number(statistics.chosen_images_by_provider_[provider])); AddLine(tr("Covers from %1").arg(provider), QString::number(statistics.chosen_images_by_provider_[provider]));

View File

@@ -138,4 +138,3 @@ void CDDADevice::SongLoadingFinished() {
WatchForDiscChanges(true); WatchForDiscChanges(true);
} }

View File

@@ -159,3 +159,11 @@ bool CDDALister::Init() {
return true; return true;
} }
bool CDDALister::AskForScan(const QString &id) const {
Q_UNUSED(id)
return false;
}

View File

@@ -47,11 +47,11 @@ class CDDALister : public DeviceLister {
quint64 DeviceCapacity(const QString &id) override; quint64 DeviceCapacity(const QString &id) override;
quint64 DeviceFreeSpace(const QString &id) override; quint64 DeviceFreeSpace(const QString &id) override;
QVariantMap DeviceHardwareInfo(const QString &id) override; QVariantMap DeviceHardwareInfo(const QString &id) override;
bool AskForScan(const QString&) const override { return false; } bool AskForScan(const QString &id) const override;
QString MakeFriendlyName(const QString&) override; QString MakeFriendlyName(const QString &id) override;
QList<QUrl> MakeDeviceUrls(const QString&) override; QList<QUrl> MakeDeviceUrls(const QString &id) override;
void UnmountDevice(const QString&) override; void UnmountDevice(const QString &id) override;
void UpdateDeviceFreeSpace(const QString&) override; void UpdateDeviceFreeSpace(const QString &id) override;
bool Init() override; bool Init() override;
bool CopyMusic() override { return false; } bool CopyMusic() override { return false; }

View File

@@ -227,8 +227,7 @@ void DeviceDatabaseBackend::SetDeviceOptions(const int id, const QString &friend
QSqlDatabase db(db_->Connect()); QSqlDatabase db(db_->Connect());
SqlQuery q(db); SqlQuery q(db);
q.prepare(QStringLiteral( q.prepare(QStringLiteral("UPDATE devices"
"UPDATE devices"
" SET friendly_name=:friendly_name," " SET friendly_name=:friendly_name,"
" icon=:icon_name," " icon=:icon_name,"
" transcode_mode=:transcode_mode," " transcode_mode=:transcode_mode,"

View File

@@ -77,7 +77,6 @@ class DeviceDatabaseBackend : public QObject {
private: private:
SharedPtr<Database> db_; SharedPtr<Database> db_;
QThread *original_thread_; QThread *original_thread_;
}; };
#endif // DEVICEDATABASEBACKEND_H #endif // DEVICEDATABASEBACKEND_H

View File

@@ -61,7 +61,6 @@ class DeviceItemDelegate : public CollectionItemDelegate {
static const int kIconPadding; static const int kIconPadding;
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &idx) const override; void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &idx) const override;
}; };
class DeviceView : public AutoExpandingTreeView { class DeviceView : public AutoExpandingTreeView {
@@ -80,7 +79,7 @@ class DeviceView : public AutoExpandingTreeView {
bool CanRecursivelyExpand(const QModelIndex &idx) const override; bool CanRecursivelyExpand(const QModelIndex &idx) const override;
protected: protected:
void contextMenuEvent(QContextMenuEvent*) override; void contextMenuEvent(QContextMenuEvent *e) override;
void mouseDoubleClickEvent(QMouseEvent *e) override; void mouseDoubleClickEvent(QMouseEvent *e) override;
private Q_SLOTS: private Q_SLOTS:

View File

@@ -160,7 +160,10 @@ QVariantList GioLister::DeviceIcons(const QString &id) {
} }
QString GioLister::DeviceManufacturer(const QString &id) { Q_UNUSED(id); return QString(); } QString GioLister::DeviceManufacturer(const QString &id) {
Q_UNUSED(id);
return QString();
}
QString GioLister::DeviceModel(const QString &id) { QString GioLister::DeviceModel(const QString &id) {

View File

@@ -119,8 +119,8 @@ class GioLister : public DeviceLister {
static void VolumeAddedCallback(GVolumeMonitor *volume_monitor, GVolume *volume, gpointer instance); static void VolumeAddedCallback(GVolumeMonitor *volume_monitor, GVolume *volume, gpointer instance);
static void VolumeRemovedCallback(GVolumeMonitor *volume_monitor, GVolume *volume, gpointer instance); static void VolumeRemovedCallback(GVolumeMonitor *volume_monitor, GVolume *volume, gpointer instance);
static void MountAddedCallback(GVolumeMonitor *volume_monitor, GMount*, gpointer instance); static void MountAddedCallback(GVolumeMonitor *volume_monitor, GMount *mount, gpointer instance);
static void MountChangedCallback(GVolumeMonitor *volume_monitor, GMount*, gpointer instance); static void MountChangedCallback(GVolumeMonitor *volume_monitor, GMount *mount, gpointer instance);
static void MountRemovedCallback(GVolumeMonitor *volume_monitor, GMount *mount, gpointer instance); static void MountRemovedCallback(GVolumeMonitor *volume_monitor, GMount *mount, gpointer instance);
static void VolumeMountFinished(GObject *object, GAsyncResult *result, gpointer instance); static void VolumeMountFinished(GObject *object, GAsyncResult *result, gpointer instance);

View File

@@ -64,7 +64,6 @@ class MtpLoader : public QObject {
ScopedPtr<MtpConnection> connection_; ScopedPtr<MtpConnection> connection_;
QThread *original_thread_; QThread *original_thread_;
bool abort_; bool abort_;
}; };
#endif // MTPLOADER_H #endif // MTPLOADER_H

View File

@@ -411,10 +411,7 @@ Udisks2Lister::PartitionData Udisks2Lister::ReadPartitionData(const QDBusObjectP
} }
QString Udisks2Lister::PartitionData::unique_id() const { QString Udisks2Lister::PartitionData::unique_id() const {
return u"Udisks2/%1/%2/%3/%4/%5"_s return u"Udisks2/%1/%2/%3/%4/%5"_s.arg(serial, vendor, model).arg(capacity).arg(uuid);
.arg(serial, vendor, model)
.arg(capacity)
.arg(uuid);
} }
Udisks2Lister::Udisks2Job::Udisks2Job() : is_mount(true) {} Udisks2Lister::Udisks2Job::Udisks2Job() : is_mount(true) {}

View File

@@ -127,8 +127,9 @@ QString About::MainHtml() const {
ret += "<p>"_L1; ret += "<p>"_L1;
ret += tr("If you like Strawberry and can make use of it, consider sponsoring or donating."); ret += tr("If you like Strawberry and can make use of it, consider sponsoring or donating.");
ret += "<br />"_L1; ret += "<br />"_L1;
ret += tr("You can sponsor the author on %1. You can also make a one-time payment through %2.").arg( ret += tr("You can sponsor the author on %1 or %2. You can also make a one-time payment through %3.").arg(
QStringLiteral("<a style=\"color:%1;\" href=\"https://github.com/sponsors/jonaski\">GitHub sponsors</a>").arg(palette().text().color().name()), QStringLiteral("<a style=\"color:%1;\" href=\"https://www.patreon.com/jonaskvinge\">Patreon</a>").arg(palette().text().color().name()),
QStringLiteral("<a style=\"color:%1;\" href=\"https://github.com/sponsors/jonaski\">GitHub</a>").arg(palette().text().color().name()),
QStringLiteral("<a style=\"color:%1;\" href=\"https://paypal.me/jonaskvinge\">paypal.me/jonaskvinge</a>").arg(palette().text().color().name()) QStringLiteral("<a style=\"color:%1;\" href=\"https://paypal.me/jonaskvinge\">paypal.me/jonaskvinge</a>").arg(palette().text().color().name())
); );

View File

@@ -71,6 +71,7 @@
#include <QSettings> #include <QSettings>
#include <QMimeData> #include <QMimeData>
#include "constants/timeconstants.h"
#include "core/iconloader.h" #include "core/iconloader.h"
#include "core/logging.h" #include "core/logging.h"
#include "core/settings.h" #include "core/settings.h"
@@ -1520,7 +1521,7 @@ void EditTagDialog::FetchLyrics() {
const Song song = data_.value(ui_->song_list->selectionModel()->selectedIndexes().first().row()).current_; const Song song = data_.value(ui_->song_list->selectionModel()->selectedIndexes().first().row()).current_;
lyrics_fetcher_->Clear(); lyrics_fetcher_->Clear();
ui_->lyrics->setPlainText(tr("loading...")); ui_->lyrics->setPlainText(tr("loading..."));
lyrics_id_ = static_cast<qint64>(lyrics_fetcher_->Search(song.effective_albumartist(), song.artist(), song.album(), song.title())); lyrics_id_ = static_cast<qint64>(lyrics_fetcher_->Search(song.effective_albumartist(), song.artist(), song.album(), song.title(), song.length_nanosec() / kNsecPerSec));
} }

View File

@@ -24,6 +24,7 @@
#include <utility> #include <utility>
#include <QWidget> #include <QWidget>
#include <QApplication>
#include <QString> #include <QString>
#include <QIcon> #include <QIcon>
#include <QPalette> #include <QPalette>
@@ -40,9 +41,8 @@
using namespace Qt::Literals::StringLiterals; using namespace Qt::Literals::StringLiterals;
ErrorDialog::ErrorDialog(QWidget *mainwindow, QWidget *parent) ErrorDialog::ErrorDialog(QWidget *parent)
: QDialog(parent), : QDialog(parent),
mainwindow_(mainwindow),
ui_(new Ui_ErrorDialog) { ui_(new Ui_ErrorDialog) {
ui_->setupUi(this); ui_->setupUi(this);
@@ -64,8 +64,9 @@ ErrorDialog::~ErrorDialog() {
void ErrorDialog::ShowDialog() { void ErrorDialog::ShowDialog() {
if (screen() && mainwindow_->screen() && screen() != mainwindow_->screen()) { QWidget *active_window = QApplication::activeWindow();
Utilities::CenterWidgetOnScreen(mainwindow_->screen(), this); if (active_window && screen() && active_window->screen() && screen() != active_window->screen()) {
Utilities::CenterWidgetOnScreen(active_window->screen(), this);
} }
setWindowState((windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); setWindowState((windowState() & ~Qt::WindowMinimized) | Qt::WindowActive);
show(); show();
@@ -81,7 +82,7 @@ void ErrorDialog::ShowMessage(const QString &message) {
current_messages_ << message; current_messages_ << message;
UpdateContent(); UpdateContent();
if (mainwindow_->isActiveWindow()) { if (QApplication::activeWindow()) {
ShowDialog(); ShowDialog();
} }
else if (!isVisible()) { else if (!isVisible()) {

View File

@@ -37,7 +37,7 @@ class ErrorDialog : public QDialog {
Q_OBJECT Q_OBJECT
public: public:
explicit ErrorDialog(QWidget *mainwindow, QWidget *parent = nullptr); explicit ErrorDialog(QWidget *parent = nullptr);
~ErrorDialog() override; ~ErrorDialog() override;
public Q_SLOTS: public Q_SLOTS:
@@ -50,7 +50,6 @@ class ErrorDialog : public QDialog {
private: private:
void UpdateContent(); void UpdateContent();
QWidget *mainwindow_;
Ui_ErrorDialog *ui_; Ui_ErrorDialog *ui_;
QStringList current_messages_; QStringList current_messages_;

View File

@@ -1,5 +1,6 @@
/* /*
* Strawberry Music Player * Strawberry Music Player
* Copyright 2025, Jonas Kvinge <jonas@jkvinge.net>
* *
* Strawberry is free software: you can redistribute it and/or modify * Strawberry is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@@ -105,7 +106,7 @@ void RichPresence::CurrentSongChanged(const Song &song) {
SetTimestamp(0LL); SetTimestamp(0LL);
activity_.length_secs = song.length_nanosec() / kNsecPerSec; activity_.length_secs = song.length_nanosec() / kNsecPerSec;
activity_.title = song.title(); activity_.title = song.PrettyTitle();
activity_.artist = song.artist(); activity_.artist = song.artist();
activity_.album = song.album(); activity_.album = song.album();

View File

@@ -1,5 +1,6 @@
/* /*
* Strawberry Music Player * Strawberry Music Player
* Copyright 2025, Jonas Kvinge <jonas@jkvinge.net>
* *
* Strawberry is free software: you can redistribute it and/or modify * Strawberry is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by

View File

@@ -419,8 +419,7 @@ std::optional<EBUR128Measures> EBUR128AnalysisImpl::Compute(const Song &song) {
// Connect the elements // Connect the elements
gst_element_link_many(src, decode, nullptr); gst_element_link_many(src, decode, nullptr);
GstStaticCaps static_caps = GST_STATIC_CAPS( GstStaticCaps static_caps = GST_STATIC_CAPS("audio/x-raw,"
"audio/x-raw,"
"format = (string) { S16LE, S32LE, F32LE, F64LE }," "format = (string) { S16LE, S32LE, F32LE, F64LE },"
"layout = (string) interleaved"); "layout = (string) interleaved");

View File

@@ -632,7 +632,10 @@ void GstEngine::HandlePipelineError(const int pipeline_id, const int domain, con
qLog(Error) << "GStreamer error:" << domain << error_code << message; qLog(Error) << "GStreamer error:" << domain << error_code << message;
Q_EMIT Error(message); Q_EMIT Error(message);
if (!debugstr.isEmpty()) {
Q_EMIT Error(debugstr); Q_EMIT Error(debugstr);
}
if (fadeout_pause_pipeline_ && pipeline_id == fadeout_pause_pipeline_->id()) { if (fadeout_pause_pipeline_ && pipeline_id == fadeout_pause_pipeline_->id()) {
StopFadeoutPause(); StopFadeoutPause();
@@ -1061,8 +1064,7 @@ void GstEngine::UpdateScope(const int chunk_length) {
buffer_format_.startsWith("S24LE"_L1) || buffer_format_.startsWith("S24LE"_L1) ||
buffer_format_.startsWith("S24_32LE"_L1) || buffer_format_.startsWith("S24_32LE"_L1) ||
buffer_format_.startsWith("S32LE"_L1) || buffer_format_.startsWith("S32LE"_L1) ||
buffer_format_.startsWith("F32LE"_L1) buffer_format_.startsWith("F32LE"_L1)) {
) {
memcpy(dest, source, bytes); memcpy(dest, source, bytes);
} }
else { else {

View File

@@ -1525,7 +1525,15 @@ void GstEnginePipeline::ElementMessageReceived(GstMessage *msg) {
const GstStructure *structure = gst_message_get_structure(msg); const GstStructure *structure = gst_message_get_structure(msg);
if (gst_structure_has_name(structure, "redirect")) { if (gst_structure_has_name(structure, "missing-plugin")) {
gchar *description = gst_missing_plugin_message_get_description(msg);
gchar *detail = gst_missing_plugin_message_get_installer_detail(msg);
const QString message = QLatin1String("Missing GStreamer plugin for %1 (%2)").arg(QString::fromLocal8Bit(description)).arg(QString::fromLocal8Bit(detail));
g_free(description);
g_free(detail);
Q_EMIT Error(id(), static_cast<int>(GST_LIBRARY_ERROR), GST_CORE_ERROR_MISSING_PLUGIN, message, QString());
}
else if (gst_structure_has_name(structure, "redirect")) {
const char *uri = gst_structure_get_string(structure, "new-location"); const char *uri = gst_structure_get_string(structure, "new-location");
// Set the redirect URL. In mmssrc redirect messages come during the initial state change to PLAYING, so callers can pick up this URL after the state change has failed. // Set the redirect URL. In mmssrc redirect messages come during the initial state change to PLAYING, so callers can pick up this URL after the state change has failed.

View File

@@ -23,6 +23,6 @@
namespace GstStartup { namespace GstStartup {
void Initialize(); void Initialize();
void SetEnvironment(); void SetEnvironment();
} // namespace } // namespace GstStartup
#endif // GSTSTARTUP_H #endif // GSTSTARTUP_H

View File

@@ -147,4 +147,3 @@ PulseDeviceFinder::~PulseDeviceFinder() {
pa_mainloop_free(mainloop_); pa_mainloop_free(mainloop_);
} }
} }

View File

@@ -68,4 +68,3 @@ int EqualizerSlider::value() const {
void EqualizerSlider::set_value(const int value) { void EqualizerSlider::set_value(const int value) {
ui_->slider->setValue(value); ui_->slider->setValue(value);
} }

View File

@@ -58,7 +58,7 @@ class FileView : public QWidget {
void SetTaskManager(SharedPtr<TaskManager> task_manager); void SetTaskManager(SharedPtr<TaskManager> task_manager);
protected: protected:
void showEvent(QShowEvent*) override; void showEvent(QShowEvent *e) override;
void keyPressEvent(QKeyEvent *e) override; void keyPressEvent(QKeyEvent *e) override;
Q_SIGNALS: Q_SIGNALS:

View File

@@ -22,6 +22,7 @@
#include <QString> #include <QString>
#include "constants/timeconstants.h"
#include "filterparser.h" #include "filterparser.h"
#include "filtertreenop.h" #include "filtertreenop.h"
#include "filtertreeand.h" #include "filtertreeand.h"
@@ -322,7 +323,7 @@ FilterTree *FilterParser::createSearchTermTreeNode(const QString &column, const
else if (Song::kInt64SearchColumns.contains(column, Qt::CaseInsensitive)) { else if (Song::kInt64SearchColumns.contains(column, Qt::CaseInsensitive)) {
qint64 number = 0; qint64 number = 0;
if (column == "length"_L1) { if (column == "length"_L1) {
number = ParseTime(value); number = ParseTime(value) * kNsecPerSec;
} }
else { else {
number = value.toLongLong(); number = value.toLongLong();

View File

@@ -28,6 +28,7 @@ class FilterParserFloatEqComparator : public FilterParserSearchTermComparator {
public: public:
explicit FilterParserFloatEqComparator(const float search_term); explicit FilterParserFloatEqComparator(const float search_term);
bool Matches(const QVariant &value) const override; bool Matches(const QVariant &value) const override;
private: private:
float search_term_; float search_term_;
Q_DISABLE_COPY(FilterParserFloatEqComparator) Q_DISABLE_COPY(FilterParserFloatEqComparator)

Some files were not shown because too many files have changed in this diff Show More