Compare commits

..

34 Commits

Author SHA1 Message Date
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
22 changed files with 383 additions and 295 deletions

View File

@@ -97,7 +97,7 @@ jobs:
cmake --build build --config Release --parallel 4
cmake --install build
- name: Checkout
uses: actions/checkout@v5
uses: actions/checkout@v6
with:
fetch-depth: 0
submodules: recursive
@@ -134,14 +134,14 @@ jobs:
run: echo "subdir=$(echo ${{matrix.opensuse_version}} | sed 's/leap:/lp/g' | sed 's/\.//g')" > $GITHUB_OUTPUT
- name: Upload source
if: matrix.opensuse_version == 'tumbleweed'
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v5
with:
name: source
path: |
/usr/src/packages/SOURCES/*.xz
- name: Upload rpm
if: matrix.opensuse_version != 'tumbleweed'
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v5
with:
name: opensuse-${{steps.set-subdir.outputs.subdir}}
path: |
@@ -209,7 +209,7 @@ jobs:
sparsehash-devel
rapidjson-devel
- name: Checkout
uses: actions/checkout@v5
uses: actions/checkout@v6
with:
fetch-depth: 0
submodules: recursive
@@ -234,7 +234,7 @@ jobs:
working-directory: build
run: rpmbuild -ba strawberry.spec
- name: Upload artifacts
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v5
with:
name: fedora-${{matrix.fedora_version}}
path: |
@@ -307,7 +307,7 @@ jobs:
- name: Remove files
run: rm -rf /usr/lib64/qt6/lib/cmake/Qt6Sql/{Qt6QMYSQL*,Qt6QODBCD*,Qt6QPSQL*,Qt6QIBase*}
- name: Checkout
uses: actions/checkout@v5
uses: actions/checkout@v6
with:
fetch-depth: 0
submodules: recursive
@@ -333,7 +333,7 @@ jobs:
run: rpmbuild -ba strawberry.spec
- name: Upload artifacts
if: matrix.openmandriva_version != 'cooker'
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v5
with:
name: openmandriva-${{matrix.openmandriva_version}}
path: |
@@ -409,7 +409,7 @@ jobs:
cmake --build build --config Release --parallel 4
cmake --install build
- name: Checkout
uses: actions/checkout@v5
uses: actions/checkout@v6
with:
fetch-depth: 0
submodules: recursive
@@ -434,7 +434,7 @@ jobs:
working-directory: build
run: rpmbuild -ba strawberry.spec
- name: Upload artifacts
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v5
with:
name: mageia-${{matrix.mageia_version}}
path: |
@@ -511,7 +511,7 @@ jobs:
cmake --build build --config Release --parallel 4
cmake --install build
- name: Checkout
uses: actions/checkout@v5
uses: actions/checkout@v6
with:
fetch-depth: 0
submodules: recursive
@@ -528,7 +528,7 @@ jobs:
- name: Copy deb
run: cp ../*.deb .
- name: Upload artifacts
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v5
with:
name: debian-${{matrix.debian_version}}
path: |
@@ -607,7 +607,7 @@ jobs:
cmake --build build --config Release --parallel 4
cmake --install build
- name: Checkout
uses: actions/checkout@v5
uses: actions/checkout@v6
with:
fetch-depth: 0
submodules: recursive
@@ -624,7 +624,7 @@ jobs:
- name: Copy deb
run: cp ../*.deb ../*.ddeb .
- name: Upload artifacts
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v5
with:
name: ubuntu-${{matrix.ubuntu_version}}
path: |
@@ -699,7 +699,7 @@ jobs:
DEBIAN_FRONTEND: noninteractive
run: apt install -y keyboxd
- name: Checkout
uses: actions/checkout@v5
uses: actions/checkout@v6
with:
fetch-depth: 0
submodules: recursive
@@ -735,13 +735,13 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v5
uses: actions/checkout@v6
with:
fetch-depth: 0
submodules: recursive
- name: Build FreeBSD
id: build-freebsd
uses: vmactions/freebsd-vm@v1.2.4
uses: vmactions/freebsd-vm@v1.2.7
with:
usesh: true
mem: 4096
@@ -760,13 +760,13 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v5
uses: actions/checkout@v6
with:
fetch-depth: 0
submodules: recursive
- name: Build OpenBSD
id: build-openbsd
uses: vmactions/openbsd-vm@v1.2.1
uses: vmactions/openbsd-vm@v1.2.3
with:
usesh: true
mem: 4096
@@ -787,7 +787,7 @@ jobs:
strategy:
fail-fast: false
matrix:
runner: [ 'macos-13', 'macos-15' ]
runner: [ 'macos-15-intel', 'macos-15' ]
buildtype: [ 'release' ]
runs-on: ${{ matrix.runner }}
@@ -826,7 +826,7 @@ jobs:
rm -f uninstall.sh
- name: Checkout
uses: actions/checkout@v5
uses: actions/checkout@v6
with:
fetch-depth: 0
submodules: recursive
@@ -839,7 +839,7 @@ jobs:
p12-password: ${{ secrets.APPLE_DEVELOPER_ID_CERTIFICATE_PASSWORD }}
- 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
run: sudo tar -C / -xf strawberry-macos-${{env.arch}}-${{env.buildtype}}.tar.xz
@@ -890,9 +890,9 @@ jobs:
run: make deploy
- 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
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
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
- name: Checkout
uses: actions/checkout@v5
uses: actions/checkout@v6
with:
fetch-depth: 0
submodules: recursive
@@ -1080,7 +1080,7 @@ jobs:
run: echo "cmake_buildtype=$(echo ${{matrix.buildtype}} | sed 's/.*/\u&/')" >> $GITHUB_ENV
- name: Checkout
uses: actions/checkout@v5
uses: actions/checkout@v6
with:
fetch-depth: 0
submodules: recursive
@@ -1310,7 +1310,7 @@ jobs:
- name: Set SDK version
if: matrix.arch != 'arm64'
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
if: matrix.arch == 'arm64'
@@ -1321,10 +1321,6 @@ jobs:
shell: cmd
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
uses: egor-tensin/cleanup-path@v4
with:
@@ -1409,7 +1405,7 @@ jobs:
vsversion: 2022
- name: Checkout
uses: actions/checkout@v5
uses: actions/checkout@v6
with:
fetch-depth: 0
submodules: recursive
@@ -1623,7 +1619,7 @@ jobs:
- name: rsync
if: steps.set-upload-path.outputs.upload_path != ''
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:
@@ -1642,11 +1638,11 @@ jobs:
DEBIAN_FRONTEND: noninteractive
run: sudo apt install -y git rsync
- name: Checkout
uses: actions/checkout@v5
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Download artifacts
uses: actions/download-artifact@v5
uses: actions/download-artifact@v6
with:
path: artifacts
- name: SSH Setup
@@ -1690,7 +1686,7 @@ jobs:
DEBIAN_FRONTEND: noninteractive
run: sudo apt install -y git jq gh
- name: Checkout
uses: actions/checkout@v5
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Show release assets
@@ -1698,7 +1694,7 @@ jobs:
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
run: gh release view "${{github.event.release.tag_name}}" --json assets | jq -r '.assets[].name'
- name: Download artifacts
uses: actions/download-artifact@v5
uses: actions/download-artifact@v6
with:
path: artifacts
- name: Add artifacts to release

1
.gitignore vendored
View File

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

View File

@@ -266,6 +266,8 @@ if(WIN32)
set(GETOPT_LIBRARIES getopt-win::getopt)
elseif(TARGET getopt::getopt_shared)
set(GETOPT_LIBRARIES getopt::getopt_shared)
elseif(TARGET unofficial::getopt-win32::getopt)
set(GETOPT_LIBRARIES unofficial::getopt-win32::getopt)
else()
message(FATAL_ERROR "Missing getopt")
endif()

View File

@@ -2,6 +2,15 @@ Strawberry Music Player
=======================
ChangeLog
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):
Bugfixes:

View File

@@ -17,7 +17,9 @@ Its written in **C++ using the Qt framework**, designed for **audiophiles and
- **Forum:** https://forum.strawberrymusicplayer.org
- **GitHub:** https://github.com/strawberrymusicplayer/strawberry
- **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:**
- Stable: https://launchpad.net/~jonaski/+archive/ubuntu/strawberry
- Unstable: https://launchpad.net/~jonaski/+archive/ubuntu/strawberry-unstable

View File

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

View File

@@ -51,6 +51,7 @@
</screenshots>
<update_contact>eclipseo@fedoraproject.org</update_contact>
<releases>
<release version="1.2.15" date="2025-11-25"/>
<release version="1.2.14" date="2025-10-25"/>
<release version="1.2.13" date="2025-08-31"/>
<release version="1.2.12" date="2025-08-12"/>

View File

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

View File

@@ -185,7 +185,7 @@ class CollectionModel : public SimpleTreeModel<CollectionItem> {
static QString PrettyYearAlbumDisc(const int year, const QString &album, const int disc);
static QString PrettyDisc(const int disc);
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);
static QString SortText(QString text);
static QString SortTextForName(const QString &name, const bool sort_skip_articles);
static QString SortTextForNumber(const int number);

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;
QTranslator *t = new QTranslator;
if (t->load(basefilename, path)) {
qLog(Debug) << "Tranlations loaded from" << basefilename;
QCoreApplication::installTranslator(t);
translations_ << t;
}
else {
if (!t->load(basefilename, path)) {
delete t;
return false;
}
qLog(Debug) << "Tranlations loaded from" << basefilename;
QCoreApplication::installTranslator(t);
translations_ << t;
return true;
}

View File

@@ -31,7 +31,7 @@ class Translations {
public:
explicit 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:
QList<QTranslator*> translations_;

View File

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

View File

@@ -260,46 +260,78 @@ int main(int argc, char *argv[]) {
IconLoader::Init();
#ifdef HAVE_TRANSLATIONS
QString language = options.language();
if (language.isEmpty()) {
Settings s;
s.beginGroup(BehaviourSettings::kSettingsGroup);
language = s.value(BehaviourSettings::kLanguage).toString();
s.endGroup();
QStringList languages;
// Load language from command line options
if (!options.language().isEmpty()) {
languages << options.language();
}
if (language.isEmpty()) {
// Load language from settings
if (languages.isEmpty()) {
Settings s;
s.beginGroup(BehaviourSettings::kSettingsGroup);
const QString language = s.value(BehaviourSettings::kLanguage).toString();
s.endGroup();
if (!language.isEmpty()) {
languages << language;
}
}
// Use system UI languages
if (languages.isEmpty()) {
#if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)
const QStringList system_languages = QLocale::system().uiLanguages(QLocale::TagSeparator::Underscore);
languages = QLocale::system().uiLanguages(QLocale::TagSeparator::Underscore);
#else
const QStringList system_languages = QLocale::system().uiLanguages();
#endif
if (system_languages.isEmpty()) {
language = QLocale::system().name();
for (const QString &language : system_languages) {
QString language_underscore = language;
language_underscore = language_underscore.replace(u'-', u'_');
languages << language_underscore;
}
else {
#if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)
language = system_languages.first();
#else
language = system_languages.first();
language = language.replace(u'-', u'_');
#endif
}
}
if (languages.isEmpty()) {
languages << QLocale::system().name();
}
ScopedPtr<Translations> translations(new Translations);
translations->LoadTranslation(u"qt"_s, QLibraryInfo::path(QLibraryInfo::TranslationsPath), language);
translations->LoadTranslation(u"strawberry"_s, u":/i18n"_s, language);
translations->LoadTranslation(u"strawberry"_s, QStringLiteral(TRANSLATIONS_DIR), language);
translations->LoadTranslation(u"strawberry"_s, QCoreApplication::applicationDirPath(), language);
translations->LoadTranslation(u"strawberry"_s, QDir::currentPath(), language);
for (const QString &language : std::as_const(languages)) {
if (translations->LoadTranslation(u"qt"_s, QLibraryInfo::path(QLibraryInfo::TranslationsPath), language)) {
break;
}
}
# ifdef HAVE_QTSPARKLE
qtsparkle::LoadTranslations(language);
# endif
static const QStringList language_paths = QStringList() << u":/i18n"_s
<< QStringLiteral(TRANSLATIONS_DIR)
<< QCoreApplication::applicationDirPath()
<< QDir::currentPath();
#endif
for (const QString &language : std::as_const(languages)) {
bool language_loaded = false;
for (const QString &language_path : language_paths) {
if (translations->LoadTranslation(u"strawberry"_s, language_path, language)) {
language_loaded = true;
break;
}
}
if (language_loaded) {
break;
}
}
#ifdef HAVE_QTSPARKLE
for (const QString &language : std::as_const(languages)) {
if (qtsparkle::LoadTranslations(language)) {
break;
}
}
#endif // HAVE_QTSPARKLE
#endif // HAVE_TRANSLATIONS
Application app;

View File

@@ -1315,10 +1315,14 @@ void PlaylistView::ReloadSettings() {
force_background_redraw_ = true;
}
if (editmetadatainline)
setEditTriggers(editTriggers() | QAbstractItemView::SelectedClicked);
else
setEditTriggers(editTriggers() & ~QAbstractItemView::SelectedClicked);
EditTriggers edit_triggers = editTriggers();
if (editmetadatainline) {
edit_triggers |= QAbstractItemView::SelectedClicked;
}
else {
edit_triggers &= ~QAbstractItemView::SelectedClicked;
}
setEditTriggers(edit_triggers);
if (playlist_) playlist_->set_auto_sort(auto_sort_);

View File

@@ -55,7 +55,14 @@ void ParserBase::LoadSong(const QString &filename_or_url, const qint64 beginning
filename = url.toLocalFile();
}
else if (song->is_stream()) {
song->set_url(QUrl::fromUserInput(filename_or_url));
url = QUrl::fromUserInput(filename_or_url);
if (url.host() == "open.spotify.com"_L1 && url.path().startsWith("/track/"_L1)) {
song->set_source(Song::Source::Spotify);
url.setScheme("spotify"_L1);
url.setHost(QString());
url.setPath(url.path().remove(0, 1).replace(u'/', u':'));
}
song->set_url(url);
song->set_filetype(Song::FileType::Stream);
song->set_valid(true);
return;

View File

@@ -78,7 +78,7 @@ ParserBase::LoadResult XSPFParser::Load(QIODevice *device, const QString &playli
Song XSPFParser::ParseTrack(QXmlStreamReader *reader, const QDir &dir, const bool collection_lookup) const {
QString title, artist, album, location, art;
QString platform, location, title, artist, album, art;
qint64 nanosec = -1;
int track_num = -1;
@@ -87,7 +87,10 @@ Song XSPFParser::ParseTrack(QXmlStreamReader *reader, const QDir &dir, const boo
QString name = reader->name().toString();
switch (type) {
case QXmlStreamReader::StartElement:{
if (name == "location"_L1) {
if (name == "platform"_L1) {
platform = reader->readElementText().toLower();
}
else if (name == "location"_L1 || name == "url"_L1) {
location = QUrl::fromPercentEncoding(reader->readElementText().toUtf8());
}
else if (name == "title"_L1) {

View File

@@ -346,6 +346,12 @@ void ListenBrainzScrobbler::UpdateNowPlayingRequestFinished(QNetworkReply *reply
QObject::disconnect(reply, nullptr, this, nullptr);
reply->deleteLater();
// ListenBrainz frequently close the connection, ignore any connection closed errors to avoid error popups
if (reply->error() == QNetworkReply::NetworkError::RemoteHostClosedError) {
JsonBaseRequest::Error(QStringLiteral("%1 (%2)").arg(reply->errorString()).arg(reply->error()));
return;
}
const JsonObjectResult json_object_result = ParseJsonObject(reply);
if (!json_object_result.success()) {
Error(json_object_result.error_message);
@@ -451,6 +457,14 @@ void ListenBrainzScrobbler::ScrobbleRequestFinished(QNetworkReply *reply, Scrobb
submitted_ = false;
// ListenBrainz frequently close the connection, ignore any connection closed errors to avoid error popups
if (reply->error() == QNetworkReply::NetworkError::RemoteHostClosedError) {
JsonBaseRequest::Error(QStringLiteral("%1 (%2)").arg(reply->errorString()).arg(reply->error()));
cache_->ClearSent(cache_items);
submit_error_ = true;
return;
}
const JsonObjectResult json_object_result = ParseJsonObject(reply);
if (json_object_result.success()) {
const QJsonObject &json_object = json_object_result.json_object;

File diff suppressed because it is too large Load Diff

View File

@@ -347,7 +347,7 @@
</message>
<message>
<source>WaveRubber</source>
<translation type="unfinished">WaveRubber</translation>
<translation/>
</message>
</context>
<context>
@@ -549,7 +549,7 @@
</message>
<message>
<source>p&amp;lughw</source>
<translation type="unfinished">p&amp;lughw</translation>
<translation>p&amp;ghoul</translation>
</message>
<message>
<source>pcm</source>
@@ -3056,7 +3056,7 @@ S&apos;il n&apos;en existe pas alors Strawberry utilisera la plus grande image d
</message>
<message>
<source>MenuPopupToolButton</source>
<translation type="unfinished">MenuPopupToolButton</translation>
<translation/>
</message>
<message>
<source>&amp;Music</source>

View File

@@ -1088,7 +1088,7 @@ Se não houver resultados, ele usará a maior imagem no diretório.</translation
</message>
<message>
<source>Use various artists for compilation albums</source>
<translation type="unfinished">Use various artists for compilation albums</translation>
<translation>Use vários artistas para álbuns de coletâneas</translation>
</message>
<message>
<source>Skip leading articles (&quot;the&quot;, &quot;a&quot;, &quot;an&quot;) when sorting artist names</source>

View File

@@ -3196,7 +3196,7 @@ If there are no matches then it will use the largest image in the directory.</tr
</message>
<message>
<source>Open audio &amp;CD...</source>
<translation>Ses CDsi aç</translation>
<translation>Ses CD'si ...</translation>
</message>
<message>
<source>&amp;Cover Manager</source>
@@ -3575,7 +3575,7 @@ If there are no matches then it will use the largest image in the directory.</tr
</message>
<message>
<source>Do not show this message again.</source>
<translation type="unfinished">Do not show this message again.</translation>
<translation>Bu mesajı bir daha gösterme.</translation>
</message>
</context>
<context>
@@ -3737,7 +3737,7 @@ If there are no matches then it will use the largest image in the directory.</tr
</message>
<message>
<source>Popup duration</source>
<translation type="unfinished">Popup duration</translation>
<translation>Açılır pencere süresi</translation>
</message>
<message>
<source> seconds</source>
@@ -3745,19 +3745,19 @@ If there are no matches then it will use the largest image in the directory.</tr
</message>
<message>
<source>Disable duration</source>
<translation type="unfinished">Disable duration</translation>
<translation>Süreyi devre dışı bırak</translation>
</message>
<message>
<source>Show a notification when I change the volume</source>
<translation type="unfinished">Show a notification when I change the volume</translation>
<translation>Ses seviyesini değiştirdiğimde bir bildirim göster</translation>
</message>
<message>
<source>Show a notification when I change the repeat/shuffle mode</source>
<translation type="unfinished">Show a notification when I change the repeat/shuffle mode</translation>
<translation>Yinele/karıştır modunu değiştirdiğimde bir bildirim göster</translation>
</message>
<message>
<source>Show a notification when I pause playback</source>
<translation type="unfinished">Show a notification when I pause playback</translation>
<translation>Oynatmayı durdurduğumda bir bildirim göster</translation>
</message>
<message>
<source>Show a notification when I resume playback</source>
@@ -3769,11 +3769,11 @@ If there are no matches then it will use the largest image in the directory.</tr
</message>
<message>
<source>Custom message settings</source>
<translation type="unfinished">Custom message settings</translation>
<translation>Özel mesaj ayarları</translation>
</message>
<message>
<source>Use a custom message for notifications</source>
<translation type="unfinished">Use a custom message for notifications</translation>
<translation>Bildirimler için özel bir mesaj kullan</translation>
</message>
<message>
<source>Preview</source>
@@ -3801,7 +3801,7 @@ If there are no matches then it will use the largest image in the directory.</tr
</message>
<message>
<source>Text options</source>
<translation type="unfinished">Text options</translation>
<translation>Yazı seçenekleri</translation>
</message>
<message>
<source>Choose font...</source>
@@ -4167,7 +4167,7 @@ If there are no matches then it will use the largest image in the directory.</tr
</message>
<message>
<source>File extension</source>
<translation type="unfinished">File extension</translation>
<translation>Dosya uzantısı</translation>
</message>
</context>
<context>
@@ -6231,7 +6231,7 @@ Devam etmek istediğinizden emin misiniz?</translation>
<name>SongLoaderInserter</name>
<message>
<source>Error while loading audio CD.</source>
<translation>Ses CD&apos;si yüklenirken hata.</translation>
<translation>Ses CD'si yüklenirken hata.</translation>
</message>
<message>
<source>Loading tracks</source>
@@ -7226,7 +7226,7 @@ Devam etmek istediğinizden emin misiniz?</translation>
<name>TranscoderOptionsASF</name>
<message>
<source>Form</source>
<translation type="unfinished">Form</translation>
<translation>Biçim</translation>
</message>
<message>
<source>Bitrate</source>
@@ -7320,7 +7320,7 @@ Devam etmek istediğinizden emin misiniz?</translation>
<name>TranscoderOptionsOpus</name>
<message>
<source>Form</source>
<translation type="unfinished">Form</translation>
<translation>Biçim</translation>
</message>
<message>
<source>Bitrate</source>
@@ -7328,19 +7328,19 @@ Devam etmek istediğinizden emin misiniz?</translation>
</message>
<message>
<source> kbps</source>
<translation type="unfinished"> kbps</translation>
<translation> kbps</translation>
</message>
</context>
<context>
<name>TranscoderOptionsSpeex</name>
<message>
<source>Form</source>
<translation type="unfinished">Form</translation>
<translation>Biçim</translation>
</message>
<message>
<source>Quality</source>
<comment>Sound quality</comment>
<translation type="unfinished">Quality</translation>
<translation>Kalite</translation>
</message>
<message>
<source>Bitrate</source>
@@ -7348,11 +7348,11 @@ Devam etmek istediğinizden emin misiniz?</translation>
</message>
<message>
<source>automatic</source>
<translation type="unfinished">automatic</translation>
<translation>otomatik</translation>
</message>
<message>
<source> kbps</source>
<translation type="unfinished"> kbps</translation>
<translation> kbps</translation>
</message>
<message>
<source>Average bitrate</source>
@@ -7360,15 +7360,15 @@ Devam etmek istediğinizden emin misiniz?</translation>
</message>
<message>
<source>disabled</source>
<translation type="unfinished">disabled</translation>
<translation>devre dışı</translation>
</message>
<message>
<source>Encoding mode</source>
<translation type="unfinished">Encoding mode</translation>
<translation>Kodlama modu</translation>
</message>
<message>
<source>Auto</source>
<translation type="unfinished">Auto</translation>
<translation>Otomatik</translation>
</message>
<message>
<source>Ultra wide band (UWB)</source>

View File

@@ -265,7 +265,6 @@ void GroupedIconView::paintEvent(QPaintEvent *e) {
const QItemSelectionModel *selections = selectionModel();
const bool focus = (hasFocus() || viewport()->hasFocus()) && current.isValid();
const QStyle::State opt_state = option.state;
const QAbstractItemView::State viewState = state();
const bool enabled = (opt_state & QStyle::State_Enabled) != 0;
int maxSize = (flow() == TopToBottom) ? viewport()->size().width() - 2 * spacing() : viewport()->size().height() - 2 * spacing();
@@ -301,9 +300,6 @@ void GroupedIconView::paintEvent(QPaintEvent *e) {
}
if (focus && current == *it) {
option.state |= QStyle::State_HasFocus;
if (viewState == EditingState) {
option.state |= QStyle::State_Editing;
}
}
itemDelegate()->paint(&painter, option, *it);