Compare commits

...

90 Commits

Author SHA1 Message Date
Clementine Buildbot
69ba3e85f0 Automatic merge of translations from Transifex 2025-02-02 02:40:07 +00:00
Clementine Buildbot
a05464b421 Automatic merge of translations from Transifex 2025-01-21 02:38:49 +00:00
Clementine Buildbot
a843e1ebaf Automatic merge of translations from Transifex 2025-01-16 02:38:23 +00:00
Boyuan Yang
41e2a07b3e Fix build failure on 32-bit with taglib 2
This commit fixes: #7375.
2025-01-13 15:49:23 +00:00
Nicolas PARLANT
658f34ec40 Support both taglib-1 and taglib-2
Patch from #7314

Fixes #7313
Close #7314
2025-01-09 10:43:40 +00:00
Marius Lindvall
9549e2b79e Fix usage of deprecated TagLib functions 2025-01-09 10:43:40 +00:00
Alexey Sokolov
c3daf0a772 Apply clang-format patch manually, add comment
My local clang-format doesn't like this change, but I obey the CI
2025-01-08 00:53:34 +00:00
Alexey Sokolov
54ad1c8ebf Run clang-format 2025-01-08 00:53:34 +00:00
Alexey Sokolov
10feee4bac Read system projectm presets from subdirs
Fix #7151

Note that this requires C++17 patches from #7272 because I don't want to
bother backporting the fix to syntax available in C++11
2025-01-08 00:53:34 +00:00
Alexey Sokolov
fe3599cdd8 Bump cmake version requirement and simplify C++ standard flags
FindProtobuf.cmake's protobuf_generate() requires 3.13
2025-01-07 23:40:52 +00:00
Alexey Sokolov
e1d7f20116 Still use FindProtobuf.cmake if one installed by protobuf is not found
This is for older protobuf library
2025-01-07 23:40:52 +00:00
Alexey Sokolov
1a251ad727 Depend on protobuf using its cmake config
FindProtobuf provided by CMake forgets that it should depend on libabsl,
and link fails.

This change makes it to use files provided by Protobuf library, which
don't miss that important detail. That also required switch from
protobuf_generate_cpp() to protobuf_generate() because that's the
function which it has. FindProtobuf.cmake also provides
protobuf_generate() but only since CMake 3.13.

Fix #7272
2025-01-07 23:40:52 +00:00
TheGag96
d99e1c9ab3 Use C++17
Patch from #7272
2025-01-07 23:40:52 +00:00
Clementine Buildbot
4ab6f35ec0 Automatic merge of translations from Transifex 2024-12-23 02:42:57 +00:00
Clementine Buildbot
4ea9d473a6 Automatic merge of translations from Transifex 2024-12-02 02:51:06 +00:00
Clementine Buildbot
fa35e229fb Automatic merge of translations from Transifex 2024-11-27 03:10:38 +00:00
Clementine Buildbot
d41684b280 Automatic merge of translations from Transifex 2024-11-24 02:50:34 +00:00
Clementine Buildbot
39130c036b Automatic merge of translations from Transifex 2024-11-22 02:48:18 +00:00
Robert Scheck
ce9c26972d Remove unused build-time requirement to sha2-devel 2024-11-08 18:13:38 +00:00
Clementine Buildbot
6d2b35a5e5 Automatic merge of translations from Transifex 2024-11-06 02:39:49 +00:00
Clementine Buildbot
cecc1c1b57 Automatic merge of translations from Transifex 2024-10-25 02:44:00 +00:00
John Maguire
efe886e0ae Rolling releases 2024-10-14 23:25:01 +01:00
John Maguire
5c61371f8f Update pkgconfig name for FC cryptopp 2024-10-14 17:40:43 +01:00
John Maguire
7ab9afffd4 Add explicit cryptopp FC dependency 2024-10-14 17:40:43 +01:00
John Maguire
89ec83c3f1 Bump FC versions 2024-10-14 17:40:43 +01:00
John Maguire
552e19a9b9 Use action-gh-release 2024-10-14 15:56:35 +01:00
John Maguire
f636992801 Add build for Ubuntu Noble 2024-10-14 14:47:01 +01:00
John Maguire
53c015f712 Run tx push from Ubuntu Noble 2024-10-14 13:52:10 +01:00
John Maguire
c482d81ce3 Remove bionic build
Too painful to make this work with more recent github actions
2024-10-14 13:24:22 +01:00
John Maguire
fc48517d63 Bump runners to Ubuntu 24.04
Due to github actions requiring new node versions which require new glibc
2024-10-14 13:24:22 +01:00
John Maguire
0729998979 Bump artifact actions to v4 2024-10-14 13:24:22 +01:00
Clementine Buildbot
a809096a98 Automatic merge of translations from Transifex 2024-10-10 02:42:33 +00:00
Clementine Buildbot
bd22ace4ec Automatic merge of translations from Transifex 2024-09-15 02:44:16 +00:00
Clementine Buildbot
4597dc16b3 Automatic merge of translations from Transifex 2024-09-02 02:38:58 +00:00
Clementine Buildbot
49b5f1cb51 Automatic merge of translations from Transifex 2024-08-25 02:38:00 +00:00
Clementine Buildbot
154f09853e Automatic merge of translations from Transifex 2024-08-22 02:36:11 +00:00
Sergey Fedorov
43826d9277 CMakeLists: use --stdlib=libc++ on macOS only with clang 2024-07-22 11:42:43 +01:00
Clementine Buildbot
1506c27696 Automatic merge of translations from Transifex 2024-05-25 02:32:20 +00:00
Clementine Buildbot
d99cbb269b Automatic merge of translations from Transifex 2024-05-21 02:33:03 +00:00
Clementine Buildbot
3cca9bb98a Automatic merge of translations from Transifex 2024-05-20 02:34:10 +00:00
Clementine Buildbot
650bd81508 Automatic merge of translations from Transifex 2024-05-17 02:32:22 +00:00
Clementine Buildbot
7607ddcb96 Automatic merge of translations from Transifex 2024-05-12 02:33:06 +00:00
Clementine Buildbot
e249911937 Automatic merge of translations from Transifex 2024-05-05 02:32:03 +00:00
Clementine Buildbot
4ae57a4b5d Automatic merge of translations from Transifex 2024-05-03 02:32:14 +00:00
Clementine Buildbot
2f3464403b Automatic merge of translations from Transifex 2024-04-25 02:31:15 +00:00
Clementine Buildbot
f76dbffa6b Automatic merge of translations from Transifex 2024-03-24 02:30:19 +00:00
Clementine Buildbot
fbb266adc2 Automatic merge of translations from Transifex 2024-03-15 02:29:14 +00:00
Clementine Buildbot
9638ac70b3 Automatic merge of translations from Transifex 2024-03-13 02:29:55 +00:00
Clementine Buildbot
c93b4e1149 Automatic merge of translations from Transifex 2024-02-27 02:27:58 +00:00
Clementine Buildbot
d014a315c9 Automatic merge of translations from Transifex 2024-02-23 02:28:36 +00:00
Isaiah W
df4181940d oops (:
this is what I meant lol
2024-02-08 14:04:03 +00:00
Isaiah W
ebe3c45476 Fix Instructions™
uses all of your cores if you have more than 8, or doesn't try to use more than you have if you have less (:
2024-02-08 14:04:03 +00:00
Clementine Buildbot
634910238d Automatic merge of translations from Transifex 2024-01-03 02:31:14 +00:00
Clementine Buildbot
62ed69fa3d Automatic merge of translations from Transifex 2023-12-19 02:32:39 +00:00
Clementine Buildbot
dd0a94e8a6 Automatic merge of translations from Transifex 2023-12-09 02:30:35 +00:00
Clementine Buildbot
1566148c50 Automatic merge of translations from Transifex 2023-11-29 02:32:39 +00:00
Clementine Buildbot
98a520552b Automatic merge of translations from Transifex 2023-11-26 02:32:33 +00:00
Clementine Buildbot
5968648aa1 Automatic merge of translations from Transifex 2023-11-01 02:31:10 +00:00
Clementine Buildbot
f3ddd7eee4 Automatic merge of translations from Transifex 2023-10-22 02:30:09 +00:00
Clementine Buildbot
19b44fb831 Automatic merge of translations from Transifex 2023-10-16 02:30:12 +00:00
Robert-André Mauchin
994d16effa Fix missing QTSINGLECOREAPPLICATION_LIBRARIES
In f3837f95db61a8d79c40c8da8467c7e502fc2156, QTSINGLECOREAPPLICATION_LIBRARIES was mistakenly removed, which prevents building with USE_SYSTEM_QTSINGLEAPPLICATION enabled.
2023-10-15 13:40:14 +01:00
xoza
4768cb9efb Skip subsonic multi-genre tags 2023-10-12 12:27:43 +01:00
Clementine Buildbot
7b678f26e0 Automatic merge of translations from Transifex 2023-10-02 02:29:29 +00:00
Marcus Müller
3f572a4139 RPM & CI: Build rpm packages against native qtsingleapplication
Signed-off-by: Marcus Müller <marcus_clementine@baseband.digital>
2023-09-20 17:52:55 +01:00
Marcus Müller
f3837f95db CMake: Re-enable usability of system QtSingleApplication
This seem to have gone broken over time.
As far as I can tell, upstream QtSingleApplication works fine!

Signed-off-by: Marcus Müller <marcus_clementine@baseband.digital>
2023-09-20 17:52:55 +01:00
Marcus Müller
6820a0a58d 3rdparty: remove unused libmygpo-qt
The -qt5 library is still there, and seems to be used.

Signed-off-by: Marcus Müller <marcus_clementine@baseband.digital>
2023-09-17 16:41:15 +01:00
Marcus Müller
cfcddf7c0f src: remove unused variable
Signed-off-by: Marcus Müller <marcus_clementine@baseband.digital>
2023-09-17 12:43:13 +01:00
Marcus Müller
98e24f626b library: use boolean, not bitwise, operator on bools
Signed-off-by: Marcus Müller <marcus_clementine@baseband.digital>
2023-09-17 12:43:13 +01:00
Marcus Müller
8e47ab59e5 internet services: consistently use 'override'
Signed-off-by: Marcus Müller <marcus_clementine@baseband.digital>
2023-09-17 12:43:13 +01:00
Marcus Müller
63208b4e1f core/organisefmt: use same visibility for fwd decl as in def
Signed-off-by: Marcus Müller <marcus_clementine@baseband.digital>
2023-09-17 12:43:13 +01:00
Marcus Müller
20773dee29 CMake: Check for minimum version before setting the project name
Signed-off-by: Marcus Müller <marcus_clementine@baseband.digital>
2023-09-17 12:43:13 +01:00
John Maguire
c2a5b9b07e Remove Kinetic build 2023-09-14 14:51:42 +01:00
Quentin Snow
de7455eebd Adjusted MainWindow::TrackSkipped to only count song skips if listened to for 5 seconds. 2023-09-13 11:53:37 +01:00
Marcus Müller
2a14ec9d4d Lyrics Providers: Remove unreachable ones
This was determined programmatically by means of trying to do a simple
HTTP request to / of any of the URLs given:

```python
from lxml import etree
from urllib import parse
import requests
doc = etree.parse("ultimate_providers.xml")
root = doc.getroot()
for provider in root:
    parsed_url = parse.urlparse(provider.get("url"))
    url = f"{parsed_url.scheme}://{parsed_url.netloc}/"
    try:
        requests.head(url, timeout=5)
    except Exception as e:
        print(parsed_url.netloc)
```

Note that these were also removed from songinfoview as present, and from
outgoingdatacreator. The two lists there were found to be inconsistent,
but this isn't subject of this PR.

Signed-off-by: Marcus Müller <marcus_clementine@baseband.digital>
2023-09-12 13:33:01 +01:00
Clementine Buildbot
86e81cea05 Automatic merge of translations from Transifex 2023-08-26 02:27:18 +00:00
Clementine Buildbot
10570316dd Automatic merge of translations from Transifex 2023-07-22 02:34:48 +00:00
Clementine Buildbot
ad8fd81ba9 Automatic merge of translations from Transifex 2023-07-18 02:50:36 +00:00
Clementine Buildbot
6ff5768634 Automatic merge of translations from Transifex 2023-07-15 02:51:38 +00:00
Clementine Buildbot
08bfb88912 Automatic merge of translations from Transifex 2023-07-14 02:50:44 +00:00
Clementine Buildbot
d3108b32e8 Automatic merge of translations from Transifex 2023-07-13 02:50:56 +00:00
Clementine Buildbot
0701bef103 Automatic merge of translations from Transifex 2023-07-12 02:49:20 +00:00
Clementine Buildbot
bf4ac0cb46 Automatic merge of translations from Transifex 2023-07-11 02:44:50 +00:00
John Maguire
baf05335f9 Only push translations from master 2023-07-11 01:22:17 +01:00
John Maguire
d21e9697d0 Disable mac builds temporarily 2023-07-10 23:42:29 +01:00
John Maguire
ab057f8275 Migrate tx pull to new CLI 2023-07-10 20:52:39 +01:00
John Maguire
58325e45a7 Migrate tx push to new CLI 2023-07-10 20:52:29 +01:00
John Maguire
1d0cbc0ebb Remove support for Debian Stretch 2023-07-10 19:25:22 +01:00
Clementine Buildbot
c83a0ac25f Automatic merge of translations from Transifex 2023-07-10 17:53:14 +00:00
John Maguire
351a5e2547 Build for Fedora 38 2023-04-07 11:59:53 +01:00
John Maguire
8773e8fe0a Bump runner for translations 2023-04-07 11:59:45 +01:00
105 changed files with 35451 additions and 222090 deletions

View File

@ -10,7 +10,7 @@ on:
jobs:
lint:
name: Lint
runs-on: ubuntu-22.04
runs-on: ubuntu-24.04
steps:
- name: Checkout
uses: actions/checkout@v2
@ -25,10 +25,15 @@ jobs:
push_translations:
name: Push translation sources to Transifex
if: github.ref == 'refs/heads/master'
runs-on: ubuntu-22.04
runs-on: ubuntu-24.04
container:
image: ubuntu:bionic
image: ubuntu:noble
steps:
- uses: supplypike/setup-bin@v3
with:
uri: https://github.com/transifex/cli/releases/download/v1.6.17/tx-linux-amd64.tar.gz
name: tx
version: 1.6.17
- name: Install dependencies
env:
DEBIAN_FRONTEND: noninteractive
@ -44,7 +49,7 @@ jobs:
libchromaprint-dev
libdbus-1-dev
libfftw3-dev
libglew1.5-dev
libglew-dev
libglib2.0-dev
libgpod-dev
libgstreamer-plugins-base1.0-dev
@ -64,8 +69,6 @@ jobs:
qttools5-dev
libsparsehash-dev
ssh
- name: Install tx
run: pip3 install transifex-client==0.13.9
- name: Checkout
uses: actions/checkout@v1.2.0
- name: git hackery
@ -73,7 +76,7 @@ jobs:
- name: tx init
env:
TX_TOKEN: ${{ secrets.TX_TOKEN }}
run: tx init --no-interactive --force
run: tx init
- name: cmake
working-directory: bin
run: cmake ..
@ -83,7 +86,7 @@ jobs:
- name: tx config
env:
TX_TOKEN: ${{ secrets.TX_TOKEN }}
run: tx config mapping --execute -r clementine.clementineplayer -f src/translations/translations.pot -s en -t PO --expression 'src/translations/<lang>.po'
run: tx add --organization davidsansome --project clementine --resource clementineplayer --file-filter 'src/translations/<lang>.po' --type PO src/translations/en.po
- name: tx push
env:
TX_TOKEN: ${{ secrets.TX_TOKEN }}
@ -91,43 +94,50 @@ jobs:
create_release:
name: Create GitHub Release
runs-on: ubuntu-22.04
runs-on: ubuntu-24.04
if: github.ref == 'refs/heads/master'
needs:
- build_bionic_64
- build_bullseye_64
- build_buster_64
- build_fedora_36
- build_fedora_37
- build_fedora_39
- build_fedora_40
- build_focal_64
- build_jammy_64
- build_kinetic_64
- build_mac
- build_noble_64
# - build_mac
- build_mingw
- build_source
- build_stretch_64
permissions:
contents: write
steps:
- uses: actions/checkout@v1.2.0
- uses: actions/download-artifact@v2
- uses: actions/download-artifact@v4
with:
path: release_artifacts
- name: Create draft pre-release
id: tag_name
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
set -x
VERSION=$(echo release_artifacts/**/*.tar.xz | sed -e 's/.*clementine-\(.*\).tar.xz/\1/')
echo "Version: ${VERSION}"
assets=()
for asset in $(find release_artifacts -type f); do
echo "Adding asset: ${asset}"
assets+=("-a" "$asset")
done
hub release create -p "${assets[@]}" -m "$VERSION" -t "$GITHUB_SHA" "$VERSION"
echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
- name: Create draft pre-release
uses: softprops/action-gh-release@v2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
name: ${{ steps.tag_name.outputs.version }}
tag_name: ${{ steps.tag_name.outputs.version }}
files: "release_artifacts/**/*"
fail_on_unmatched_files: true
draft: false
prerelease: false
build_source:
name: Build source tarball
runs-on: ubuntu-22.04
runs-on: ubuntu-24.04
container:
image: ubuntu:focal
steps:
@ -180,16 +190,16 @@ jobs:
- name: Build source tarball
working-directory: bin
run: ../dist/maketarball.sh
- uses: actions/upload-artifact@v2
- uses: actions/upload-artifact@v4
with:
name: release_source
path: bin/clementine-*.tar.xz
build_fedora_36:
name: Build Fedora 36 RPM
runs-on: ubuntu-22.04
build_fedora_39:
name: Build Fedora 39 RPM
runs-on: ubuntu-24.04
container:
image: fedora:36
image: fedora:39
env:
RPM_BUILD_NCPUS: "2"
steps:
@ -200,6 +210,7 @@ jobs:
alsa-lib-devel
boost-devel
cmake
cryptopp
cryptopp-devel
dbus-devel
desktop-file-utils
@ -229,8 +240,9 @@ jobs:
qt5-qtbase-devel
qt5-qtx11extras-devel
qt5-rpm-macros
qtsingleapplication-qt5-devel
qtsinglecoreapplication-qt5-devel
rpmdevtools
sha2-devel
sparsehash-devel
sqlite-devel
taglib-devel
@ -240,7 +252,7 @@ jobs:
run: git config --global --add safe.directory ${GITHUB_WORKSPACE}
- name: cmake
working-directory: bin
run: cmake ..
run: cmake -DUSE_SYSTEM_QTSINGLEAPPLICATION=On ..
- name: Build source tarball
working-directory: bin
run: ../dist/maketarball.sh
@ -252,16 +264,16 @@ jobs:
- name: Build RPM
working-directory: bin
run: rpmbuild -ba ../dist/clementine.spec
- uses: actions/upload-artifact@v2
- uses: actions/upload-artifact@v4
with:
name: release_fedora_36
name: release_fedora_39
path: ~/rpmbuild/RPMS/*/clementine-*.rpm
build_fedora_37:
name: Build Fedora 37 RPM
runs-on: ubuntu-22.04
build_fedora_40:
name: Build Fedora 40 RPM
runs-on: ubuntu-24.04
container:
image: fedora:37
image: fedora:40
env:
RPM_BUILD_NCPUS: "2"
steps:
@ -272,6 +284,7 @@ jobs:
alsa-lib-devel
boost-devel
cmake
cryptopp
cryptopp-devel
dbus-devel
desktop-file-utils
@ -301,8 +314,9 @@ jobs:
qt5-qtbase-devel
qt5-qtx11extras-devel
qt5-rpm-macros
qtsingleapplication-qt5-devel
qtsinglecoreapplication-qt5-devel
rpmdevtools
sha2-devel
sparsehash-devel
sqlite-devel
taglib-devel
@ -312,7 +326,7 @@ jobs:
run: git config --global --add safe.directory ${GITHUB_WORKSPACE}
- name: cmake
working-directory: bin
run: cmake ..
run: cmake -DUSE_SYSTEM_QTSINGLEAPPLICATION=On ..
- name: Build source tarball
working-directory: bin
run: ../dist/maketarball.sh
@ -324,14 +338,14 @@ jobs:
- name: Build RPM
working-directory: bin
run: rpmbuild -ba ../dist/clementine.spec
- uses: actions/upload-artifact@v2
- uses: actions/upload-artifact@v4
with:
name: release_fedora_37
name: release_fedora_40
path: ~/rpmbuild/RPMS/*/clementine-*.rpm
build_mingw:
name: Build Windows Installer
runs-on: ubuntu-22.04
runs-on: ubuntu-24.04
container:
image: eu.gcr.io/clementine-data/mingw-w64:latest
env:
@ -517,132 +531,14 @@ jobs:
- name: Build Windows installer
working-directory: dist/windows
run: makensis clementine.nsi
- uses: actions/upload-artifact@v2
- uses: actions/upload-artifact@v4
with:
name: release_mingw
path: dist/windows/ClementineSetup*.exe
build_stretch_64:
name: Build Debian Stretch 64-bit deb
runs-on: ubuntu-22.04
container:
image: debian:stretch
steps:
- name: Install dependencies
run: >
apt-get update && apt-get install -y
build-essential
cmake
gettext
git
libasound2-dev
libboost-dev
libcdio-dev
libchromaprint-dev
libcrypto++-dev
libdbus-1-dev
libfftw3-dev
libglew1.5-dev
libglib2.0-dev
libgpod-dev
libgstreamer-plugins-base1.0-dev
libgstreamer1.0-dev
liblastfm5-dev
libmtp-dev
libmygpo-qt-dev
libprotobuf-dev
libpulse-dev
libqt5x11extras5-dev
libsparsehash-dev
libsqlite3-dev
libtag1-dev
pkg-config
protobuf-compiler
qtbase5-dev
qttools5-dev-tools
qttools5-dev
ssh
- uses: actions/checkout@v1.2.0
- name: git hackery
run: git config --global --add safe.directory ${GITHUB_WORKSPACE}
- name: cmake
working-directory: bin
run: >
cmake ..
-DWITH_DEBIAN=ON
-DDEB_ARCH=amd64
-DDEB_DIST=stretch
-DENABLE_SPOTIFY_BLOB=OFF
- name: make
working-directory: bin
run : make -j2 deb
- uses: actions/upload-artifact@v2
with:
name: release_stretch_64
path: bin/clementine_*.deb
build_bionic_64:
name: Build Ubuntu Bionic 64-bit deb
runs-on: ubuntu-22.04
container:
image: ubuntu:bionic
steps:
- name: Install dependencies
env:
DEBIAN_FRONTEND: noninteractive
run: >
apt-get update && apt-get install -y
build-essential
cmake
gettext
git
libasound2-dev
libboost-dev
libcdio-dev
libchromaprint-dev
libdbus-1-dev
libfftw3-dev
libglew1.5-dev
libglib2.0-dev
libgpod-dev
libgstreamer-plugins-base1.0-dev
libgstreamer1.0-dev
liblastfm5-dev
libmtp-dev
libprotobuf-dev
libpulse-dev
libqt5x11extras5-dev
libsqlite3-dev
libtag1-dev
pkg-config
protobuf-compiler
qtbase5-dev
qttools5-dev-tools
qttools5-dev
libsparsehash-dev
ssh
- uses: actions/checkout@v1.2.0
- name: git hackery
run: git config --global --add safe.directory ${GITHUB_WORKSPACE}
- name: cmake
working-directory: bin
run: >
cmake ..
-DWITH_DEBIAN=ON
-DDEB_ARCH=amd64
-DDEB_DIST=bionic
-DENABLE_SPOTIFY_BLOB=OFF
- name: make
working-directory: bin
run : make -j2 deb
- uses: actions/upload-artifact@v2
with:
name: release_bionic_64
path: bin/clementine_*.deb
build_bullseye_64:
name: Build Debian Bullseye 64-bit deb
runs-on: ubuntu-22.04
runs-on: ubuntu-24.04
container:
image: debian:bullseye
steps:
@ -695,14 +591,14 @@ jobs:
- name: make
working-directory: bin
run : make -j2 deb
- uses: actions/upload-artifact@v2
- uses: actions/upload-artifact@v4
with:
name: release_bullseye_64
path: bin/clementine_*.deb
build_buster_64:
name: Build Debian Buster 64-bit deb
runs-on: ubuntu-22.04
runs-on: ubuntu-24.04
container:
image: debian:buster
steps:
@ -754,14 +650,14 @@ jobs:
- name: make
working-directory: bin
run : make -j2 deb
- uses: actions/upload-artifact@v2
- uses: actions/upload-artifact@v4
with:
name: release_buster_64
path: bin/clementine_*.deb
build_focal_64:
name: Build Ubuntu Focal 64-bit deb
runs-on: ubuntu-22.04
runs-on: ubuntu-24.04
container:
image: ubuntu:focal
steps:
@ -819,14 +715,14 @@ jobs:
- name: make
working-directory: bin
run : make -j2 deb
- uses: actions/upload-artifact@v2
- uses: actions/upload-artifact@v4
with:
name: release_focal_64
path: bin/clementine_*.deb
build_jammy_64:
name: Build Ubuntu Jammy 64-bit deb
runs-on: ubuntu-22.04
runs-on: ubuntu-24.04
container:
image: ubuntu:jammy
steps:
@ -887,16 +783,16 @@ jobs:
- name: make
working-directory: bin
run : make -j2 deb
- uses: actions/upload-artifact@v2
- uses: actions/upload-artifact@v4
with:
name: release_jammy_64
path: bin/clementine_*.deb
build_kinetic_64:
name: Build Ubuntu Kinetic 64-bit deb
runs-on: ubuntu-22.04
build_noble_64:
name: Build Ubuntu Noble 64-bit deb
runs-on: ubuntu-24.04
container:
image: ubuntu:kinetic
image: ubuntu:noble
steps:
- name: Install dependencies
env:
@ -950,17 +846,18 @@ jobs:
cmake ..
-DWITH_DEBIAN=ON
-DDEB_ARCH=amd64
-DDEB_DIST=kinetic
-DDEB_DIST=noble
-DENABLE_SPOTIFY_BLOB=OFF
- name: make
working-directory: bin
run : make -j2 deb
- uses: actions/upload-artifact@v2
- uses: actions/upload-artifact@v4
with:
name: release_kinetic_64
name: release_noble_64
path: bin/clementine_*.deb
build_mac:
if: false
name: Build Mac DMG
runs-on: macos-10.15
steps:
@ -1021,7 +918,7 @@ jobs:
- name: Build DMG
working-directory: bin
run: make dmg
- uses: actions/upload-artifact@v2
- uses: actions/upload-artifact@v4
with:
name: release_mac
path: bin/clementine-*.dmg

View File

@ -6,20 +6,22 @@ on:
jobs:
pull_translations:
name: Pull translations from Transifex
runs-on: ubuntu-18.04
runs-on: ubuntu-22.04
container:
image: ubuntu:bionic
image: ubuntu:jammy
steps:
- uses: supplypike/setup-bin@v3
with:
uri: https://github.com/transifex/cli/releases/download/v1.6.7/tx-linux-amd64.tar.gz
name: tx
version: 1.6.7
- name: Install dependencies
env:
DEBIAN_FRONTEND: noninteractive
run: >
apt-get update && apt-get install -y
git
python3-pip
ssh
- name: Install tx
run: pip3 install transifex-client==0.13.9
- name: Checkout
uses: actions/checkout@v1.2.0
- name: git hackery
@ -29,15 +31,15 @@ jobs:
- name: tx init
env:
TX_TOKEN: ${{ secrets.TX_TOKEN }}
run: tx init --no-interactive --force
run: tx init
- name: tx config
env:
TX_TOKEN: ${{ secrets.TX_TOKEN }}
run: tx config mapping --execute -r clementine.clementineplayer -s en -t PO --expression 'src/translations/<lang>.po'
run: tx add --organization davidsansome --project clementine --resource clementineplayer --file-filter 'src/translations/<lang>.po' --type PO src/translations/en.po
- name: tx pull
env:
TX_TOKEN: ${{ secrets.TX_TOKEN }}
run: tx pull --all -f --no-interactive
run: tx pull -f -a
- name: Setup git SSH
uses: webfactory/ssh-agent@v0.4.1
with:

View File

@ -1,128 +0,0 @@
/* Copyright 2014, Uwe L. Korn <uwelk@xhochy.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#include "Json.h"
// Qt version specific includes
#if QT_VERSION >= QT_VERSION_CHECK( 5, 0, 0 )
#include <QJsonDocument>
#include <QMetaProperty>
#else
#include <qjson/parser.h>
#include <qjson/qobjecthelper.h>
#include <qjson/serializer.h>
#endif
namespace QJsonWrapper
{
QVariantMap
qobject2qvariant( const QObject* object )
{
#if QT_VERSION >= QT_VERSION_CHECK( 5, 0, 0 )
QVariantMap map;
if ( object == NULL )
{
return map;
}
const QMetaObject* metaObject = object->metaObject();
for ( int i = 0; i < metaObject->propertyCount(); ++i )
{
QMetaProperty metaproperty = metaObject->property( i );
if ( metaproperty.isReadable() )
{
map[ QLatin1String( metaproperty.name() ) ] = object->property( metaproperty.name() );
}
}
return map;
#else
return QJson::QObjectHelper::qobject2qvariant( object );
#endif
}
void
qvariant2qobject( const QVariantMap& variant, QObject* object )
{
#if QT_VERSION >= QT_VERSION_CHECK( 5, 0, 0 )
for ( QVariantMap::const_iterator iter = variant.begin(); iter != variant.end(); ++iter )
{
QVariant property = object->property( iter.key().toLatin1() );
Q_ASSERT( property.isValid() );
if ( property.isValid() )
{
QVariant value = iter.value();
if ( value.canConvert( property.type() ) )
{
value.convert( property.type() );
object->setProperty( iter.key().toLatin1(), value );
} else if ( QString( QLatin1String("QVariant") ).compare( QLatin1String( property.typeName() ) ) == 0 ) {
object->setProperty( iter.key().toLatin1(), value );
}
}
}
#else
QJson::QObjectHelper::qvariant2qobject( variant, object );
#endif
}
QVariant
parseJson( const QByteArray& jsonData, bool* ok )
{
#if QT_VERSION >= QT_VERSION_CHECK( 5, 0, 0 )
QJsonParseError error;
QJsonDocument doc = QJsonDocument::fromJson( jsonData, &error );
if ( ok != NULL )
{
*ok = ( error.error == QJsonParseError::NoError );
}
return doc.toVariant();
#else
QJson::Parser p;
return p.parse( jsonData, ok );
#endif
}
QByteArray
toJson( const QVariant &variant, bool* ok )
{
#if QT_VERSION >= QT_VERSION_CHECK( 5, 0, 0 )
QJsonDocument doc = QJsonDocument::fromVariant( variant );
if ( ok != NULL )
{
*ok = !doc.isNull();
}
return doc.toJson( QJsonDocument::Compact );
#else
QJson::Serializer serializer;
QByteArray ret = serializer.serialize(variant);
if ( ok != NULL )
{
*ok = !ret.isNull();
}
return ret;
#endif
}
}

View File

@ -1,36 +0,0 @@
/* Copyright 2014, Uwe L. Korn <uwelk@xhochy.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#pragma once
#ifndef QJSONWRAPPER_JSON_H
#define QJSONWRAPPER_JSON_H
#include <QVariant>
namespace QJsonWrapper
{
QVariantMap qobject2qvariant( const QObject* object );
void qvariant2qobject( const QVariantMap& variant, QObject* object );
QVariant parseJson( const QByteArray& jsonData, bool* ok = 0 );
QByteArray toJson( const QVariant &variant, bool* ok = 0 );
}
#endif // QJSONWRAPPER_JSON_H

View File

@ -24,8 +24,6 @@ set(BUILD_PROJECTM_STATIC ON)
set(DISABLE_NATIVE_PRESETS ON)
set(DISABLE_MILKDROP_PRESETS OFF)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
pkg_check_modules(GLEW glew)
if(DISABLE_NATIVE_PRESETS)

View File

@ -1,5 +1,4 @@
cmake_minimum_required(VERSION 3.0.0)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --std=c++0x")
set(SINGLEAPP-SOURCES
qtlocalpeer.cpp

View File

@ -1,6 +1,6 @@
cmake_minimum_required(VERSION 3.13.0)
project(clementine)
cmake_minimum_required(VERSION 3.0.0)
cmake_policy(SET CMP0053 OLD)
include(CheckCXXCompilerFlag)
@ -15,13 +15,14 @@ include(cmake/Format.cmake)
set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON CACHE INTERNAL "")
set(CMAKE_CXX_STANDARD 17)
if (CMAKE_CXX_COMPILER MATCHES ".*clang")
set(CMAKE_COMPILER_IS_CLANGXX 1)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-uninitialized")
endif ()
if (APPLE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --stdlib=libc++")
if (APPLE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --stdlib=libc++")
endif ()
endif ()
find_program(CCACHE_EXECUTABLE NAMES ccache)
@ -46,7 +47,10 @@ endif(OPENGL_FOUND)
find_package(Boost REQUIRED)
find_package(Gettext REQUIRED)
find_package(PkgConfig REQUIRED)
find_package(Protobuf REQUIRED)
find_package(protobuf)
if(NOT protobuf_FOUND)
find_package(Protobuf REQUIRED)
endif()
find_package(FFTW3)
find_package(ALSA)
if (NOT APPLE)
@ -347,11 +351,18 @@ include_directories("3rdparty/qsqlite")
# When/if upstream accepts our patches then these options can be used to link
# to system installed qtsingleapplication instead.
option(USE_SYSTEM_QTSINGLEAPPLICATION "Don't set this option unless your system QtSingleApplication library has been compiled with the Clementine patches in 3rdparty" OFF)
option(USE_SYSTEM_QTSINGLEAPPLICATION "Use the system-provided QtSingleApplication library (needs to have clementine patches, but these seem to be in Qt5)" OFF)
if(USE_SYSTEM_QTSINGLEAPPLICATION)
find_path(QTSINGLEAPPLICATION_INCLUDE_DIRS qtsingleapplication.h PATH_SUFFIXES qt5/QtSolutions)
find_library(QTSINGLEAPPLICATION_LIBRARIES Qt5Solutions_SingleApplication-2.6)
find_library(QTSINGLECOREAPPLICATION_LIBRARIES Qt5Solutions_SingleCoreApplication-2.6)
find_path(QTSINGLEAPPLICATION_INCLUDE_DIRS qtsingleapplication.h PATH_SUFFIXES qt5/QtSolutions REQUIRED)
find_library(QTSINGLEAPPLICATION_LIBRARIES Qt5Solutions_SingleApplication-2.6 REQUIRED)
add_library(qtsingleapplication INTERFACE)
target_link_libraries(qtsingleapplication INTERFACE QTSINGLEAPPLICATION_LIBRARIES)
target_include_directories(qtsingleapplication INTERFACE QTSINGLEAPPLICATION_INCLUDE_DIRS)
find_path(QTSINGLECOREAPPLICATION_INCLUDE_DIRS qtsinglecoreapplication.h PATH_SUFFIXES qt5/QtSolutions REQUIRED)
find_library(QTSINGLECOREAPPLICATION_LIBRARIES Qt5Solutions_SingleCoreApplication-2.6 REQUIRED)
add_library(qtsinglecoreapplication INTERFACE)
target_link_libraries(qtsinglecoreapplication INTERFACE QTSINGLECOREAPPLICATION_LIBRARIES)
target_include_directories(qtsinglecoreapplication INTERFACE QTSINGLECOREAPPLICATION_INCLUDE_DIRS)
else(USE_SYSTEM_QTSINGLEAPPLICATION)
add_subdirectory(3rdparty/qtsingleapplication)
set(QTSINGLEAPPLICATION_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/qtsingleapplication)

View File

@ -41,7 +41,7 @@ Compile and install:
cd bin
cmake ..
make -j8
make -j$(nproc)
sudo make install
See the Wiki for more instructions and a list of dependencies:

View File

@ -88,17 +88,6 @@
<item begin="&lt;/a" end="&gt;"/>
</exclude>
</provider>
<provider name="hindilyrics.net (Bollywood songs)" title="{title} ({album})" charset="utf-8" url="http://www.hindilyrics.net/lyrics/of-{Title}.html">
<urlFormat replace=" _@;\/&quot;'()[]" with="%20"/>
<urlFormat replace="?" with=""/>
<extract>
<item begin="&lt;div class=nm&gt;Movie&lt;/div&gt;:" end="&lt;/pre&gt;"/>
</extract>
<exclude>
<item begin="&lt;span class=" end="&quot;&gt;"/>
</exclude>
<invalidIndicator value="Couldn't find that page."/>
</provider>
<provider name="letras.mus.br" title="" charset="utf-8" url="https://www.letras.mus.br/winamp.php?musica={title}&amp;artista={artist}">
<urlFormat replace="_@,;&amp;\/&quot;" with="_"/>
<urlFormat replace=" " with="+"/>
@ -114,13 +103,6 @@
</extract>
<invalidIndicator value="ERROR"/>
</provider>
<provider name="loudson.gs" title="" charset="utf-8" url="http://www.loudson.gs/{a}/{artist}/{album}/{title}">
<urlFormat replace=" _@,;&amp;\/&quot;" with="-"/>
<urlFormat replace="." with=""/>
<extract>
<item tag="&lt;div class=&quot;middle_col_TracksLyrics &quot;&gt;"/>
</extract>
</provider>
<provider name="lyrics.com" title="{artist} - {title} Lyrics" charset="utf-8" url="http://www.lyrics.com/lyrics/{artist}/{title}.html">
<urlFormat replace=" _@,;&amp;\/&quot;" with="-"/>
<urlFormat replace="'." with=""/>
@ -194,14 +176,6 @@
</extract>
<invalidIndicator value="Page not Found"/>
</provider>
<provider name="lyricstime.com" title="{artist} - {title} Lyrics" charset="iso-8859-1" url="http://www.lyricstime.com/{artist}-{title}-lyrics.html">
<urlFormat replace=" _@,;&amp;\/&quot;'" with="-"/>
<urlFormat replace="." with=""/>
<extract>
<item tag="&lt;div id=&quot;songlyrics&quot; &gt;"/>
<item tag="&lt;p&gt;"/>
</extract>
</provider>
<provider name="lyriki.com" title="" charset="utf-8" url="http://www.lyriki.com/{artist}:{title}">
<urlFormat replace=" _@,;&amp;\/&quot;" with="_"/>
<urlFormat replace="." with=""/>
@ -210,20 +184,6 @@
<item tag="&lt;p&gt;"/>
</extract>
</provider>
<provider name="metrolyrics.com" title="{artist} - {title} LYRICS" charset="utf-8" url="http://www.metrolyrics.com/{title}-lyrics-{artist}.html">
<urlFormat replace=" _@,;&amp;\/&quot;" with="-"/>
<urlFormat replace="'." with=""/>
<extract>
<item tag="&lt;span id=&quot;lyrics&quot;&gt;"/>
</extract>
<extract>
<item tag="&lt;div id=&quot;lyrics&quot;&gt;"/>
</extract>
<exclude>
<item tag="&lt;h5&gt;"/>
</exclude>
<invalidIndicator value="These lyrics are missing"/>
</provider>
<provider name="mp3lyrics.org" title="{artist} &amp;quot;{title}&amp;quot; Lyrics" charset="utf-8" url="http://www.mp3lyrics.org/{a}/{artist}/{title}/">
<urlFormat replace=" _@,;&amp;\/&quot;" with="-"/>
<urlFormat replace="'." with=""/>
@ -251,13 +211,6 @@
</exclude>
<invalidIndicator value="We couldn't find that page."/>
</provider>
<provider name="seeklyrics.com" title="{artist} - {title} Lyrics" charset="iso-8859-1" url="http://www.seeklyrics.com/lyrics/{Artist}/{Title}.html">
<urlFormat replace=" _@,;&amp;\/'&quot;" with="-"/>
<urlFormat replace="." with=""/>
<extract>
<item tag="&lt;div id=&quot;songlyrics&quot;&gt;"/>
</extract>
</provider>
<provider name="songlyrics.com" title="{title} LYRICS - {artist}" charset="utf-8" url="http://www.songlyrics.com/{artist}/{title}-lyrics/">
<urlFormat replace=" ._@,;&amp;\/&quot;" with="-"/>
<urlFormat replace="'" with="_"/>

View File

@ -18,6 +18,7 @@ BuildRequires: liblastfm-qt5-devel
BuildRequires: desktop-file-utils
BuildRequires: hicolor-icon-theme
BuildRequires: libappstream-glib
BuildRequires: qtsingleapplication-qt5-devel
BuildRequires: pkgconfig
BuildRequires: pkgconfig(glib-2.0)
BuildRequires: pkgconfig(gio-2.0)
@ -29,7 +30,6 @@ BuildRequires: pkgconfig(protobuf)
BuildRequires: pkgconfig(sqlite3) >= 3.7
BuildRequires: pkgconfig(taglib) >= 1.11
BuildRequires: pkgconfig(glew)
BuildRequires: pkgconfig(cryptopp)
BuildRequires: pkgconfig(Qt5Core)
BuildRequires: pkgconfig(Qt5Gui)
BuildRequires: pkgconfig(Qt5Widgets)
@ -46,12 +46,13 @@ BuildRequires: pkgconfig(gstreamer-app-1.0)
BuildRequires: pkgconfig(gstreamer-audio-1.0)
BuildRequires: pkgconfig(gstreamer-base-1.0)
BuildRequires: pkgconfig(gstreamer-tag-1.0)
BuildRequires: pkgconfig(libpulse)
BuildRequires: pkgconfig(libcdio)
BuildRequires: pkgconfig(libchromaprint)
BuildRequires: pkgconfig(libcryptopp)
BuildRequires: pkgconfig(libgpod-1.0)
BuildRequires: pkgconfig(libmtp)
BuildRequires: pkgconfig(libnotify)
BuildRequires: pkgconfig(libpulse)
BuildRequires: pkgconfig(libudf)
# GStreamer codec dependencies

View File

@ -2,8 +2,6 @@ include_directories(${PROTOBUF_INCLUDE_DIRS})
include_directories(${CMAKE_CURRENT_BINARY_DIR})
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --std=c++0x")
set(SOURCES
core/closure.cpp
core/latch.cpp

View File

@ -1,19 +1,17 @@
include_directories(${PROTOBUF_INCLUDE_DIRS})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --std=c++0x")
set(MESSAGES
remotecontrolmessages.proto
)
protobuf_generate_cpp(PROTO_SOURCES PROTO_HEADERS ${MESSAGES})
add_library(libclementine-remote STATIC
${PROTO_SOURCES}
${MESSAGES}
)
protobuf_generate(TARGET libclementine-remote LANGUAGE cpp)
target_link_libraries(libclementine-remote
${PROTOBUF_LIBRARY}
libclementine-common
protobuf::libprotobuf
)

View File

@ -3,8 +3,6 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR})
include_directories(${CMAKE_CURRENT_BINARY_DIR})
include_directories(${CMAKE_SOURCE_DIR}/ext/libclementine-common)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --std=c++0x")
set(MESSAGES
tagreadermessages.proto
)
@ -28,16 +26,16 @@ optional_source(HAVE_GOOGLE_DRIVE
qt5_wrap_cpp(MOC ${HEADERS})
protobuf_generate_cpp(PROTO_SOURCES PROTO_HEADERS ${MESSAGES})
add_library(libclementine-tagreader STATIC
${PROTO_SOURCES}
${MESSAGES}
${SOURCES}
${MOC}
)
protobuf_generate(TARGET libclementine-tagreader LANGUAGE cpp)
target_link_libraries(libclementine-tagreader
${PROTOBUF_LIBRARY}
libclementine-common
protobuf::libprotobuf
)

View File

@ -91,9 +91,13 @@ void CloudStream::Precache() {
clear();
}
#if (TAGLIB_MAJOR_VERSION == 2)
TagLib::ByteVector CloudStream::readBlock(size_t length) {
#else
TagLib::ByteVector CloudStream::readBlock(ulong length) {
#endif
const uint start = cursor_;
const uint end = qMin(cursor_ + length - 1, length_ - 1);
const uint end = qMin((size_t)(cursor_ + length - 1), (size_t)(length_ - 1));
if (end < start) {
return TagLib::ByteVector();
@ -144,11 +148,19 @@ void CloudStream::writeBlock(const TagLib::ByteVector&) {
qLog(Debug) << Q_FUNC_INFO << "not implemented";
}
#if (TAGLIB_MAJOR_VERSION == 2)
void CloudStream::insert(const TagLib::ByteVector&, TagLib::offset_t, size_t) {
#else
void CloudStream::insert(const TagLib::ByteVector&, ulong, ulong) {
#endif
qLog(Debug) << Q_FUNC_INFO << "not implemented";
}
#if (TAGLIB_MAJOR_VERSION == 2)
void CloudStream::removeBlock(TagLib::offset_t, size_t) {
#else
void CloudStream::removeBlock(ulong, ulong) {
#endif
qLog(Debug) << Q_FUNC_INFO << "not implemented";
}
@ -159,7 +171,11 @@ bool CloudStream::readOnly() const {
bool CloudStream::isOpen() const { return true; }
#if (TAGLIB_MAJOR_VERSION == 2)
void CloudStream::seek(TagLib::offset_t offset, TagLib::IOStream::Position p) {
#else
void CloudStream::seek(long offset, TagLib::IOStream::Position p) {
#endif
switch (p) {
case TagLib::IOStream::Beginning:
cursor_ = offset;
@ -171,18 +187,26 @@ void CloudStream::seek(long offset, TagLib::IOStream::Position p) {
case TagLib::IOStream::End:
// This should really not have qAbs(), but OGG reading needs it.
cursor_ = qMax(0UL, length_ - qAbs(offset));
cursor_ = qMax(0UL, (unsigned long)(length_ - qAbs(offset)));
break;
}
}
void CloudStream::clear() { cursor_ = 0; }
#if (TAGLIB_MAJOR_VERSION == 2)
TagLib::offset_t CloudStream::tell() const { return cursor_; }
TagLib::offset_t CloudStream::length() { return length_; }
void CloudStream::truncate(TagLib::offset_t) {
#else
long CloudStream::tell() const { return cursor_; }
long CloudStream::length() { return length_; }
void CloudStream::truncate(long) {
#endif
qLog(Debug) << Q_FUNC_INFO << "not implemented";
}

View File

@ -35,6 +35,19 @@ class CloudStream : public QObject, public TagLib::IOStream {
// Taglib::IOStream
virtual TagLib::FileName name() const;
#if (TAGLIB_MAJOR_VERSION == 2)
virtual TagLib::ByteVector readBlock(size_t length);
virtual void writeBlock(const TagLib::ByteVector&);
virtual void insert(const TagLib::ByteVector&, TagLib::offset_t, size_t);
virtual void removeBlock(TagLib::offset_t, size_t);
virtual bool readOnly() const;
virtual bool isOpen() const;
virtual void seek(TagLib::offset_t offset, TagLib::IOStream::Position p);
virtual void clear();
virtual TagLib::offset_t tell() const;
virtual TagLib::offset_t length();
virtual void truncate(TagLib::offset_t);
#else
virtual TagLib::ByteVector readBlock(ulong length);
virtual void writeBlock(const TagLib::ByteVector&);
virtual void insert(const TagLib::ByteVector&, ulong, ulong);
@ -46,6 +59,7 @@ class CloudStream : public QObject, public TagLib::IOStream {
virtual long tell() const;
virtual long length();
virtual void truncate(long);
#endif
google::sparsetable<char>::size_type cached_bytes() const {
return cache_.num_nonempty();

View File

@ -198,7 +198,7 @@ void TagReader::ReadFile(const QString& filename,
// Find album artists
TagLib::APE::ItemListMap::ConstIterator it = items.find("ALBUM ARTIST");
if (it != items.end()) {
TagLib::StringList album_artists = it->second.toStringList();
TagLib::StringList album_artists = it->second.values();
if (!album_artists.isEmpty()) {
Decode(album_artists.front(), nullptr, song->mutable_albumartist());
}
@ -243,22 +243,22 @@ void TagReader::ReadFile(const QString& filename,
}
if (items.contains("BPM")) {
Decode(items["BPM"].toStringList().toString(", "), nullptr,
Decode(items["BPM"].values().toString(", "), nullptr,
song->mutable_performer());
}
if (items.contains("PERFORMER")) {
Decode(items["PERFORMER"].toStringList().toString(", "), nullptr,
Decode(items["PERFORMER"].values().toString(", "), nullptr,
song->mutable_performer());
}
if (items.contains("COMPOSER")) {
Decode(items["COMPOSER"].toStringList().toString(", "), nullptr,
Decode(items["COMPOSER"].values().toString(", "), nullptr,
song->mutable_composer());
}
if (items.contains("GROUPING")) {
Decode(items["GROUPING"].toStringList().toString(" "), nullptr,
Decode(items["GROUPING"].values().toString(" "), nullptr,
song->mutable_grouping());
}
@ -565,8 +565,8 @@ void TagReader::ReadFile(const QString& filename,
if (fileref->audioProperties()) {
song->set_bitrate(fileref->audioProperties()->bitrate());
song->set_samplerate(fileref->audioProperties()->sampleRate());
song->set_length_nanosec(fileref->audioProperties()->length() *
kNsecPerSec);
song->set_length_nanosec(fileref->audioProperties()->lengthInMilliseconds() *
kNsecPerMsec);
}
// Get the filetype if we can
@ -1376,9 +1376,15 @@ bool TagReader::ReadCloudFile(const QUrl& download_url, const QString& title,
std::unique_ptr<TagLib::File> tag;
if (mime_type == "audio/mpeg" &&
title.endsWith(".mp3", Qt::CaseInsensitive)) {
#if (TAGLIB_MAJOR_VERSION == 2)
tag.reset(new TagLib::MPEG::File(stream.get(), true,
TagLib::AudioProperties::Accurate,
TagLib::ID3v2::FrameFactory::instance()));
#else
tag.reset(new TagLib::MPEG::File(stream.get(),
TagLib::ID3v2::FrameFactory::instance(),
TagLib::AudioProperties::Accurate));
#endif
} else if (mime_type == "audio/mp4" ||
(mime_type == "audio/mpeg" &&
title.endsWith(".m4a", Qt::CaseInsensitive))) {
@ -1398,9 +1404,15 @@ bool TagReader::ReadCloudFile(const QUrl& download_url, const QString& title,
TagLib::AudioProperties::Accurate));
} else if (mime_type == "application/x-flac" || mime_type == "audio/flac" ||
mime_type == "audio/x-flac") {
#if (TAGLIB_MAJOR_VERSION == 2)
tag.reset(new TagLib::FLAC::File(stream.get(), true,
TagLib::AudioProperties::Accurate,
TagLib::ID3v2::FrameFactory::instance()));
#else
tag.reset(new TagLib::FLAC::File(stream.get(),
TagLib::ID3v2::FrameFactory::instance(),
true, TagLib::AudioProperties::Accurate));
#endif
} else if (mime_type == "audio/x-ms-wma") {
tag.reset(new TagLib::ASF::File(stream.get(), true,
TagLib::AudioProperties::Accurate));
@ -1431,7 +1443,7 @@ bool TagReader::ReadCloudFile(const QUrl& download_url, const QString& title,
song->set_type(cpb::tagreader::SongMetadata_Type_STREAM);
if (tag->audioProperties()) {
song->set_length_nanosec(tag->audioProperties()->length() * kNsecPerSec);
song->set_length_nanosec(tag->audioProperties()->lengthInMilliseconds() * kNsecPerMsec);
}
return true;
}

View File

@ -1,7 +1,7 @@
cmake_minimum_required(VERSION 3.0.0)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Woverloaded-virtual -Wall --std=c++0x")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Woverloaded-virtual -Wall")
include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})

View File

@ -27,7 +27,7 @@
#include "core/song.h"
class TranscoderPreset;
struct TranscoderPreset;
class OrganiseFormat {
public:

View File

@ -41,16 +41,16 @@ class DigitallyImportedServiceBase : public InternetService {
const QString& api_service_name,
Application* app, InternetModel* model,
bool has_premium, QObject* parent = nullptr);
~DigitallyImportedServiceBase();
~DigitallyImportedServiceBase() override;
static const char* kSettingsGroup;
static const int kStreamsCacheDurationSecs;
QStandardItem* CreateRootItem();
void LazyPopulate(QStandardItem* parent);
void ShowContextMenu(const QPoint& global_pos);
QStandardItem* CreateRootItem() override;
void LazyPopulate(QStandardItem* parent) override;
void ShowContextMenu(const QPoint& global_pos) override;
void ReloadSettings();
void ReloadSettings() override;
bool is_premium_account() const;

View File

@ -40,7 +40,7 @@ class IcecastService : public InternetService {
public:
IcecastService(Application* app, InternetModel* parent);
~IcecastService();
~IcecastService() override;
static const char* kServiceName;
static const char* kDirectoryUrl;
@ -51,12 +51,12 @@ class IcecastService : public InternetService {
Type_Genre,
};
QStandardItem* CreateRootItem();
void LazyPopulate(QStandardItem* item);
QStandardItem* CreateRootItem() override;
void LazyPopulate(QStandardItem* item) override;
void ShowContextMenu(const QPoint& global_pos);
void ShowContextMenu(const QPoint& global_pos) override;
QWidget* HeaderWidget() const;
QWidget* HeaderWidget() const override;
private slots:
void LoadDirectory();

View File

@ -39,7 +39,7 @@ class IntergalacticFMServiceBase : public InternetService {
const QString& name, const QUrl& channel_list_url,
const QUrl& homepage_url,
const QUrl& donate_page_url, const QIcon& icon);
~IntergalacticFMServiceBase();
~IntergalacticFMServiceBase() override;
enum ItemType {
Type_Stream = 2000,
@ -59,14 +59,14 @@ class IntergalacticFMServiceBase : public InternetService {
const QString& url_scheme() const { return url_scheme_; }
const QIcon& icon() const { return icon_; }
QStandardItem* CreateRootItem();
void LazyPopulate(QStandardItem* item);
void ShowContextMenu(const QPoint& global_pos);
QStandardItem* CreateRootItem() override;
void LazyPopulate(QStandardItem* item) override;
void ShowContextMenu(const QPoint& global_pos) override;
PlaylistItem::Options playlistitem_options() const;
PlaylistItem::Options playlistitem_options() const override;
QNetworkAccessManager* network() const { return network_; }
void ReloadSettings();
void ReloadSettings() override;
bool IsStreamListStale() const { return streams_.IsStale(); }
StreamList Streams();

View File

@ -34,7 +34,7 @@ class SavedRadio : public InternetService {
public:
SavedRadio(Application* app, InternetModel* parent);
~SavedRadio();
~SavedRadio() override;
enum ItemType {
Type_Stream = 2000,
@ -57,10 +57,10 @@ class SavedRadio : public InternetService {
static const char* kServiceName;
static const char* kSettingsGroup;
QStandardItem* CreateRootItem();
void LazyPopulate(QStandardItem* item);
QStandardItem* CreateRootItem() override;
void LazyPopulate(QStandardItem* item) override;
void ShowContextMenu(const QPoint& global_pos);
void ShowContextMenu(const QPoint& global_pos) override;
void Add(const QUrl& url, const QString& name = QString(),
const QUrl& url_logo = QUrl());

View File

@ -43,14 +43,14 @@ class JamendoService : public InternetService {
public:
JamendoService(Application* app, InternetModel* parent);
~JamendoService();
~JamendoService() override;
QStandardItem* CreateRootItem();
void LazyPopulate(QStandardItem* item);
QStandardItem* CreateRootItem() override;
void LazyPopulate(QStandardItem* item) override;
void ShowContextMenu(const QPoint& global_pos);
void ShowContextMenu(const QPoint& global_pos) override;
QWidget* HeaderWidget() const;
QWidget* HeaderWidget() const override;
LibraryBackend* library_backend() const { return library_backend_.get(); }

View File

@ -38,7 +38,7 @@ class MagnatuneService : public InternetService {
public:
MagnatuneService(Application* app, InternetModel* parent);
~MagnatuneService();
~MagnatuneService() override;
// Values are saved in QSettings and are indices into the combo box in
// MagnatuneConfig
@ -71,14 +71,14 @@ class MagnatuneService : public InternetService {
static QString ReadElementText(QXmlStreamReader& reader);
QStandardItem* CreateRootItem();
void LazyPopulate(QStandardItem* item);
QStandardItem* CreateRootItem() override;
void LazyPopulate(QStandardItem* item) override;
void ShowContextMenu(const QPoint& global_pos);
void ShowContextMenu(const QPoint& global_pos) override;
QWidget* HeaderWidget() const;
QWidget* HeaderWidget() const override;
void ReloadSettings();
void ReloadSettings() override;
// Magnatune specific stuff
MembershipType membership_type() const { return membership_; }
@ -99,7 +99,7 @@ class MagnatuneService : public InternetService {
void Download();
void Homepage();
void ShowConfig();
void ShowConfig() override;
private:
void EnsureMenuCreated();

View File

@ -44,7 +44,7 @@ class PodcastService : public InternetService {
public:
PodcastService(Application* app, InternetModel* parent);
~PodcastService();
~PodcastService() override;
static const char* kServiceName;
static const char* kSettingsGroup;
@ -57,12 +57,12 @@ class PodcastService : public InternetService {
enum Role { Role_Podcast = InternetModel::RoleCount, Role_Episode };
QStandardItem* CreateRootItem();
void LazyPopulate(QStandardItem* parent);
bool has_initial_load_settings() const { return true; }
void ShowContextMenu(const QPoint& global_pos);
void ReloadSettings();
void InitialLoadSettings();
QStandardItem* CreateRootItem() override;
void LazyPopulate(QStandardItem* parent) override;
bool has_initial_load_settings() const override { return true; }
void ShowContextMenu(const QPoint& global_pos) override;
void ReloadSettings() override;
void InitialLoadSettings() override;
// Called by SongLoader when the user adds a Podcast URL directly. Adds a
// subscription to the podcast and displays it in the UI. If the QVariant
// contains an OPML file then this displays it in the Add Podcast dialog.
@ -81,7 +81,7 @@ class PodcastService : public InternetService {
void DeleteDownloadedData();
void SetNew();
void SetListened();
void ShowConfig();
void ShowConfig() override;
void SubscriptionAdded(const Podcast& podcast);
void SubscriptionRemoved(const Podcast& podcast);

View File

@ -35,7 +35,7 @@ class RadioBrowserService : public InternetService {
public:
RadioBrowserService(Application* app, InternetModel* parent);
~RadioBrowserService(){};
~RadioBrowserService() override{};
enum ItemType {
Type_Stream = 2000,

View File

@ -39,7 +39,7 @@ class SomaFMServiceBase : public InternetService {
const QString& name, const QUrl& channel_list_url,
const QUrl& homepage_url, const QUrl& donate_page_url,
const QIcon& icon);
~SomaFMServiceBase();
~SomaFMServiceBase() override;
enum ItemType {
Type_Stream = 2000,
@ -59,14 +59,14 @@ class SomaFMServiceBase : public InternetService {
const QString& url_scheme() const { return url_scheme_; }
const QIcon& icon() const { return icon_; }
QStandardItem* CreateRootItem();
void LazyPopulate(QStandardItem* item);
void ShowContextMenu(const QPoint& global_pos);
QStandardItem* CreateRootItem() override;
void LazyPopulate(QStandardItem* item) override;
void ShowContextMenu(const QPoint& global_pos) override;
PlaylistItem::Options playlistitem_options() const;
PlaylistItem::Options playlistitem_options() const override;
QNetworkAccessManager* network() const { return network_; }
void ReloadSettings();
void ReloadSettings() override;
bool IsStreamListStale() const { return streams_.IsStale(); }
StreamList Streams();

View File

@ -530,6 +530,11 @@ void SubsonicLibraryScanner::OnGetAlbumFinished(QNetworkReply* reply) {
// Read song information
while (reader.readNextStartElement()) {
// skip multi-artist and multi-genre tags
if ((reader.name() == "artists") || (reader.name() == "genres")) {
reader.skipCurrentElement();
continue;
}
if (reader.name() != "song") {
ParsingError("song tag expected. Aborting scan.");
return;

View File

@ -42,7 +42,7 @@ class SubsonicService : public InternetService {
public:
SubsonicService(Application* app, InternetModel* parent);
~SubsonicService();
~SubsonicService() override;
enum LoginState {
LoginState_Loggedin,
@ -90,11 +90,11 @@ class SubsonicService : public InternetService {
bool IsConfigured() const;
bool IsAmpache() const;
QStandardItem* CreateRootItem();
void LazyPopulate(QStandardItem* item);
void ShowContextMenu(const QPoint& global_pos);
QWidget* HeaderWidget() const;
void ReloadSettings();
QStandardItem* CreateRootItem() override;
void LazyPopulate(QStandardItem* item) override;
void ShowContextMenu(const QPoint& global_pos) override;
QWidget* HeaderWidget() const override;
void ReloadSettings() override;
void Login();
void Login(const QString& server, const QString& username,
@ -175,7 +175,7 @@ class SubsonicService : public InternetService {
void OnLoginStateChanged(SubsonicService::LoginState newstate);
void OnPingFinished(QNetworkReply* reply);
void ShowConfig();
void ShowConfig() override;
};
class SubsonicLibraryScanner : public QObject {
@ -184,7 +184,7 @@ class SubsonicLibraryScanner : public QObject {
public:
explicit SubsonicLibraryScanner(SubsonicService* service,
QObject* parent = nullptr);
~SubsonicLibraryScanner();
~SubsonicLibraryScanner() override;
void Scan();
const SongList& GetSongs() const { return songs_; }

View File

@ -896,7 +896,7 @@ LibraryBackend::AlbumList LibraryBackend::GetAlbums(const QString& artist,
QString last_artist;
QString last_album_artist;
while (query.Next()) {
bool compilation = query.Value(3).toBool() | query.Value(4).toBool();
bool compilation = query.Value(3).toBool() || query.Value(4).toBool();
Album info;
info.artist = compilation ? QString() : query.Value(1).toString();

View File

@ -92,12 +92,10 @@ void MoodbarBuilder::Normalize(QList<Rgb>* vals, double Rgb::*member) {
}
double avg = 0;
int t = 0;
for (const Rgb& rgb : *vals) {
const double value = rgb.*member;
if (value != mini && value != maxi) {
avg += value / vals->count();
t++;
}
}

View File

@ -98,7 +98,6 @@ void OutgoingDataCreator::CheckEnabledProviders() {
<< "lyricstime.com"
<< "lyricsreg.com"
<< "lyricsmania.com"
<< "metrolyrics.com"
<< "azlyrics.com"
<< "songlyrics.com"
<< "elyrics.net"
@ -106,7 +105,6 @@ void OutgoingDataCreator::CheckEnabledProviders() {
<< "lyrics.com"
<< "lyricsbay.com"
<< "directlyrics.com"
<< "loudson.gs"
<< "teksty.org"
<< "tekstowo.pl (Polish translations)"
<< "vagalume.uol.com.br"

View File

@ -1729,13 +1729,11 @@ PlaylistItemList Playlist::RemoveItemsWithoutUndo(int row, int count) {
endRemoveRows();
QList<int>::iterator it = virtual_items_.begin();
int i = 0;
while (it != virtual_items_.end()) {
if (*it >= items_.count())
it = virtual_items_.erase(it);
else
++it;
++i;
}
// Reset current_virtual_index_

View File

@ -34,12 +34,6 @@
#undef AddJob
#endif
namespace {
const char kWavHeaderRiffMarker[] = "RIFF";
const char kWavFileTypeFormatChunk[] = "WAVEfmt ";
const char kWavDataString[] = "data";
} // namespace
Ripper::Ripper(int track_count, QObject* parent)
: QObject(parent),
track_count_(track_count),

View File

@ -90,10 +90,8 @@ void SongInfoView::ReloadSettings() {
QVariantList default_order;
default_order << "lyrics.wikia.com"
<< "lyricstime.com"
<< "lyricsreg.com"
<< "lyricsmania.com"
<< "metrolyrics.com"
<< "azlyrics.com"
<< "songlyrics.com"
<< "elyrics.net"
@ -101,7 +99,6 @@ void SongInfoView::ReloadSettings() {
<< "lyrics.com"
<< "lyricsbay.com"
<< "directlyrics.com"
<< "loudson.gs"
<< "teksty.org"
<< "tekstowo.pl (Polish translations)"
<< "vagalume.uol.com.br"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

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