Compare commits
34 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d2205cfe81 | ||
|
|
5830f247f6 | ||
|
|
8b4c57d933 | ||
|
|
67cec09176 | ||
|
|
2df658e1f3 | ||
|
|
f3bc9b151c | ||
|
|
b06b59d0c5 | ||
|
|
99d75ade06 | ||
|
|
3f63246068 | ||
|
|
b205a5f964 | ||
|
|
aeaef12dd4 | ||
|
|
02d76f17f7 | ||
|
|
e4e12c6fa6 | ||
|
|
270ae6085b | ||
|
|
7065a405a5 | ||
|
|
d8c72c3dd9 | ||
|
|
b65502e167 | ||
|
|
132f8df853 | ||
|
|
12e3cffe63 | ||
|
|
56a637682d | ||
|
|
d9b105f89e | ||
|
|
bd6b45e43f | ||
|
|
539172fb70 | ||
|
|
ebd92b3a7f | ||
|
|
b00ae5b210 | ||
|
|
c8e3cf981b | ||
|
|
038f69779f | ||
|
|
a4de7559ac | ||
|
|
0537b072fe | ||
|
|
2657c9f96a | ||
|
|
7e178b1f1a | ||
|
|
dd8513d02c | ||
|
|
5f0175094b | ||
|
|
b4c5b9e1e1 |
68
.github/workflows/build.yml
vendored
68
.github/workflows/build.yml
vendored
@@ -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
1
.gitignore
vendored
@@ -1,6 +1,7 @@
|
||||
/build
|
||||
/bin
|
||||
/CMakeLists.txt.user
|
||||
/.qtcreator
|
||||
/.kdev4
|
||||
/strawberry.kdev4
|
||||
/.vscode
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -17,7 +17,9 @@ It’s 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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
38
dist/windows/strawberry.nsi.in
vendored
38
dist/windows/strawberry.nsi.in
vendored
@@ -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"
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
|
||||
@@ -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_;
|
||||
|
||||
@@ -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();
|
||||
|
||||
86
src/main.cpp
86
src/main.cpp
@@ -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;
|
||||
|
||||
|
||||
@@ -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_);
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
@@ -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&lughw</source>
|
||||
<translation type="unfinished">p&lughw</translation>
|
||||
<translation>p&ghoul</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>pcm</source>
|
||||
@@ -3056,7 +3056,7 @@ S'il n'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>&Music</source>
|
||||
|
||||
@@ -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 ("the", "a", "an") when sorting artist names</source>
|
||||
|
||||
@@ -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 &CD...</source>
|
||||
<translation>Ses CDsi aç</translation>
|
||||
<translation>Ses CD'si aç...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&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'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>
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user