summaryrefslogtreecommitdiff
path: root/libre/clementine
diff options
context:
space:
mode:
authorAndré Fabian Silva Delgado <emulatorman@parabola.nu>2016-04-17 15:27:04 -0300
committerAndré Fabian Silva Delgado <emulatorman@parabola.nu>2016-04-17 15:54:47 -0300
commit364e28c52afd90b1a4c618040680ce002ce520a6 (patch)
tree1827fc1718a25e5b1be9476430ad580993769e58 /libre/clementine
parenta56439c69533fb2c7a803f998326ac146ed7499a (diff)
clementine-1.3-1.parabola1: updating version
Diffstat (limited to 'libre/clementine')
-rw-r--r--libre/clementine/PKGBUILD57
-rw-r--r--libre/clementine/clementine-gcc5.1.patch23
-rw-r--r--libre/clementine/clementine-udisks-namespace.patch38
-rw-r--r--libre/clementine/remove-nonfree-artwork-and-spotify.patch757
4 files changed, 546 insertions, 329 deletions
diff --git a/libre/clementine/PKGBUILD b/libre/clementine/PKGBUILD
index 68db00139..1082bbbb9 100644
--- a/libre/clementine/PKGBUILD
+++ b/libre/clementine/PKGBUILD
@@ -1,4 +1,4 @@
-# $Id: PKGBUILD 163295 2016-02-24 12:02:19Z alucryd $
+# $Id: PKGBUILD 171170 2016-04-16 09:31:33Z alucryd $
# Maintainer (Arch): Maxime Gauduin <alucryd@archlinux.org>
# Contributor (Arch): Stéphane Gaudreault <stephane@archlinux.org>
# Contributor (Arch): BlackEagle <ike.devolder@gmail.com>
@@ -9,36 +9,34 @@
pkgname=clementine
_pkgname=$pkgname-libre
-pkgver=1.2.3
-pkgrel=10.parabola1
+pkgver=1.3
+pkgrel=1.parabola1
pkgdesc='A modern music player and library organizer, without nonfree artwork and Spotify support'
url="http://www.$pkgname-player.org/"
license=('GPL')
arch=('i686' 'x86_64')
replaces=("$_pkgname")
conflicts=("$_pkgname")
-depends=('chromaprint' 'glew' 'gstreamer0.10-base' 'libcdio' 'libgpod'
- 'liblastfm' 'libmtp' 'libmygpo-qt' 'protobuf' 'qca-qt4' 'taglib')
-makedepends=('cmake' 'boost' 'mesa' 'sparsehash')
-optdepends=('gstreamer0.10-base-plugins: "Base" plugin libraries'
- 'gstreamer0.10-good-plugins: "Good" plugin libraries'
- 'gstreamer0.10-bad-plugins: "Bad" plugin libraries'
- 'gstreamer0.10-ugly-plugins: "Ugly" plugin libraries'
- 'gstreamer0.10-ffmpeg: FFmpeg plugin'
+depends=('chromaprint' 'crypto++' 'fftw' 'gcc-libs' 'glew' 'glib2' 'glibc'
+ 'gst-plugins-base-libs' 'gstreamer' 'libcdio' 'libechonest' 'libgl'
+ 'libgpod' 'liblastfm' 'libmtp' 'libpulse' 'libx11' 'protobuf' 'qjson'
+ 'qt4' 'sqlite' 'taglib' 'zlib')
+makedepends=('boost' 'cmake' 'mesa' 'sparsehash')
+optdepends=('gst-plugins-base: "Base" plugin libraries'
+ 'gst-plugins-good: "Good" plugin libraries'
+ 'gst-plugins-bad: "Bad" plugin libraries'
+ 'gst-plugins-ugly: "Ugly" plugin libraries'
+ 'gst-libav: Libav plugin'
'gvfs: Various devices support')
install="${pkgname}.install"
mksource=("${pkgname}-${pkgver}.tar.gz::https://github.com/$pkgname-player/${pkgname^}/archive/${pkgver}.tar.gz")
source=("https://repo.parabola.nu/other/${_pkgname}/${_pkgname}-${pkgver}.tar.gz"
'remove-nonfree-artwork-and-spotify.patch'
- 'moognu.png'
- "${pkgname}-gcc5.1.patch"
- "${pkgname}-udisks-namespace.patch")
-mksha256sums=('7df5650445a005c09f5f0e1a1b0d077037c37ecbe4ee77baf9d45f121308a1bf')
-sha256sums=('30fde23dde610b610d2172e94e4bd87f4a86afaeb4d9b6c8a5be8cbab0502eea'
- '48bfbf42c84ac1891021638627c10780194fcc59eda1c69e157be3aebe8ee10b'
- 'c6918617769152f3617c61f721819e69d03f671b85760b11cfe45abd53955bc4'
- 'b03c190b881520c3233ed8f5804b518e9e699c6f773ab227f36133f422b786e1'
- 'a7c2764576cee303a57e4efe6a5dbd583a66de8a15aee738bd92d4bb21786008')
+ 'moognu.png')
+mksha256sums=('55e8d283ed02e3f2376a88b012cd2003e00fef95a98b6a919d67cb57e96b8617')
+sha256sums=('d036d4ff71bff71baf941e5f3302a5a72a2665a04252d02f2ded5b1ecd0bb880'
+ '8df85540364e62b1b12c818958e83eb079bc203f9ab2a542c97410c7a74aa360'
+ 'c6918617769152f3617c61f721819e69d03f671b85760b11cfe45abd53955bc4')
mksource() {
cd ${pkgname^}-${pkgver}
@@ -58,9 +56,11 @@ prepare() {
rm -rv ext/{$pkgname-spotifyblob,lib${pkgname}-spotifyblob}
# remove Spotify files
- rm -v cmake/SpotifyVersion.cmake
- rm -v data/spotify-attribution.png
rm -v data/icons/svg/spotify.svg
+ rm -v data/providers/{22x22,32x32,48x48}/spotify.png
+ rm -v data/spotify-attribution.png
+ rm -v data/clementine-spotify-public.pem
+ rm -v cmake/SpotifyVersion.cmake
rm -v data/schema/schema-30.sql
rm -v src/{globalsearch/spotifysearchprovider.{cpp,h},internet/spotify{blobdownloader.{cpp,h},server.{cpp,h},service.{cpp,h},settingspage.{cpp,h,ui}}}
@@ -71,17 +71,14 @@ prepare() {
# create a blank file because it's a dependency for Clementine
touch data/schema/schema-30.sql
- patch -Np1 -i ../clementine-gcc5.1.patch
- patch -Np1 -i ../clementine-udisks-namespace.patch
-}
-
-build() {
- cd ${pkgname^}-${pkgver}
-
if [[ -d build ]]; then
rm -rf build
fi
- mkdir build && cd build
+ mkdir build
+}
+
+build() {
+ cd ${pkgname^}-${pkgver}/build
cmake .. \
-DCMAKE_BUILD_TYPE='Release' \
diff --git a/libre/clementine/clementine-gcc5.1.patch b/libre/clementine/clementine-gcc5.1.patch
deleted file mode 100644
index 4fff0f704..000000000
--- a/libre/clementine/clementine-gcc5.1.patch
+++ /dev/null
@@ -1,23 +0,0 @@
-diff -rupN Clementine-1.2.3.orig/src/CMakeLists.txt Clementine-1.2.3/src/CMakeLists.txt
---- Clementine-1.2.3.orig/src/CMakeLists.txt 2015-05-30 11:15:10.903093300 +0200
-+++ Clementine-1.2.3/src/CMakeLists.txt 2015-05-30 11:15:34.801955100 +0200
-@@ -1,6 +1,6 @@
-
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
--set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Woverloaded-virtual -Wall -Wno-sign-compare -Wno-deprecated-declarations -Wno-unused-local-typedefs -Wno-unused-private-field -Wno-unknown-warning-option --std=c++0x -U__STRICT_ANSI__")
-+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Woverloaded-virtual -Wall -Wno-sign-compare -Wno-deprecated-declarations -Wno-unused-local-typedefs --std=c++0x -U__STRICT_ANSI__")
-
- option(BUILD_WERROR "Build with -Werror" ON)
-
-diff -rupN Clementine-1.2.3.orig/src/ui/mainwindow.cpp Clementine-1.2.3/src/ui/mainwindow.cpp
---- Clementine-1.2.3.orig/src/ui/mainwindow.cpp 2015-05-30 11:15:10.867894300 +0200
-+++ Clementine-1.2.3/src/ui/mainwindow.cpp 2015-05-30 11:15:54.578517000 +0200
-@@ -911,7 +911,7 @@ void MainWindow::ScrobblingEnabledChange
- if (ui_->action_toggle_scrobbling->isVisible())
- SetToggleScrobblingIcon(value);
-
-- if (!app_->player()->GetState() == Engine::Idle) {
-+ if (app_->player()->GetState() != Engine::Idle) {
- return;
- }
- else {
diff --git a/libre/clementine/clementine-udisks-namespace.patch b/libre/clementine/clementine-udisks-namespace.patch
deleted file mode 100644
index e74889e78..000000000
--- a/libre/clementine/clementine-udisks-namespace.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-From ec580cb815c16ec1ab43a469d5af7d51d8d03082 Mon Sep 17 00:00:00 2001
-From: Chocobozzz <florian.chocobo@gmail.com>
-Date: Wed, 16 Jul 2014 15:57:25 +0200
-Subject: [PATCH] No namespaces for DBus interfaces. Fixes #4401
-
----
- src/CMakeLists.txt | 9 ++++-----
- 1 file changed, 4 insertions(+), 5 deletions(-)
-
-diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
-index 650fa74..775b0a5 100644
---- a/src/CMakeLists.txt
-+++ b/src/CMakeLists.txt
-@@ -892,11 +892,6 @@ optional_source(LINUX SOURCES widgets/osd_x11.cpp)
- if(HAVE_DBUS)
- file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/dbus)
-
-- # Hack to get it to generate interfaces without namespaces - required
-- # because otherwise org::freedesktop::UDisks and
-- # org::freedesktop::UDisks::Device conflict.
-- list(APPEND QT_DBUSXML2CPP_EXECUTABLE -N)
--
- # MPRIS DBUS interfaces
- qt4_add_dbus_adaptor(SOURCES
- dbus/org.freedesktop.MediaPlayer.player.xml
-@@ -964,6 +959,10 @@ if(HAVE_DBUS)
-
- # DeviceKit DBUS interfaces
- if(HAVE_DEVICEKIT)
-+ set_source_files_properties(dbus/org.freedesktop.UDisks.xml
-+ PROPERTIES NO_NAMESPACE dbus/udisks)
-+ set_source_files_properties(dbus/org.freedesktop.UDisks.Device.xml
-+ PROPERTIES NO_NAMESPACE dbus/udisksdevice)
- qt4_add_dbus_interface(SOURCES
- dbus/org.freedesktop.UDisks.xml
- dbus/udisks)
---
-2.0.3
diff --git a/libre/clementine/remove-nonfree-artwork-and-spotify.patch b/libre/clementine/remove-nonfree-artwork-and-spotify.patch
index 8c1b9aafd..76b875e11 100644
--- a/libre/clementine/remove-nonfree-artwork-and-spotify.patch
+++ b/libre/clementine/remove-nonfree-artwork-and-spotify.patch
@@ -11,27 +11,27 @@ index a349f59..c418e0b 100644
@"com.apple.QuickTimePlayerX",
@"com.apple.quicktimeplayer",
diff --git a/CMakeLists.txt b/CMakeLists.txt
-index 47f1693..986351b 100644
+index 23070d9..f2c8b72 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
-@@ -7,7 +7,6 @@ include(cmake/Summary.cmake)
+@@ -7,7 +7,6 @@ include(cmake/C++11Compat.cmake)
+ include(cmake/Summary.cmake)
include(cmake/Version.cmake)
include(cmake/Deb.cmake)
- include(cmake/Rpm.cmake)
-include(cmake/SpotifyVersion.cmake)
include(cmake/OptionalSource.cmake)
+ include(cmake/Format.cmake)
set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
-
-@@ -78,7 +77,6 @@ pkg_check_modules(LIBMYGPO_QT libmygpo-qt>=1.0.7)
+@@ -74,7 +73,6 @@ pkg_check_modules(LIBMYGPO_QT libmygpo-qt>=1.0.9)
+ pkg_check_modules(LIBPULSE libpulse)
pkg_check_modules(LIBXML libxml-2.0)
- pkg_check_modules(QCA qca2)
pkg_check_modules(QJSON REQUIRED QJson)
-pkg_check_modules(SPOTIFY libspotify>=12.1.45)
pkg_check_modules(TAGLIB REQUIRED taglib>=1.6)
if (WIN32)
-@@ -124,13 +122,6 @@ if (APPLE)
- find_library(GROWL Growl)
+@@ -117,13 +115,6 @@ endif()
+ if (APPLE)
find_library(SPARKLE Sparkle)
- find_library(SPOTIFY libspotify)
@@ -44,30 +44,34 @@ index 47f1693..986351b 100644
add_subdirectory(3rdparty/SPMediaKeyTap)
set(SPMEDIAKEYTAP_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/SPMediaKeyTap)
set(SPMEDIAKEYTAP_LIBRARIES SPMediaKeyTap)
-@@ -254,7 +245,7 @@ optional_component(DEVICEKIT ON "Devices: DeviceKit backend"
+@@ -254,11 +245,6 @@ optional_component(DEVICEKIT ON "Devices: DeviceKit backend"
DEPENDS "D-Bus support" HAVE_DBUS
)
-optional_component(SPOTIFY_BLOB ON "Spotify support: non-GPL binary helper"
-+optional_component(SPOTIFY_BLOB OFF "Spotify support: non-GPL binary helper"
- DEPENDS "protobuf" PROTOBUF_FOUND PROTOBUF_PROTOC_EXECUTABLE
- DEPENDS "libspotify" SPOTIFY_FOUND
+- DEPENDS "protobuf" PROTOBUF_FOUND PROTOBUF_PROTOC_EXECUTABLE
+- DEPENDS "libspotify" SPOTIFY_FOUND
+-)
+-
+ optional_component(MOODBAR ON "Moodbar support"
+ DEPENDS "fftw3" FFTW3_FOUND
)
-@@ -270,13 +261,6 @@ optional_component(SPARKLE ON "Sparkle integration"
+@@ -274,14 +260,6 @@ optional_component(LIBPULSE ON "Pulse audio integration"
optional_component(VISUALISATIONS ON "Visualisations")
--if(NOT HAVE_SPOTIFY_BLOB AND NOT QCA_FOUND)
-- message(FATAL_ERROR "Either QCA must be available or the non-GPL Spotify "
+-if(NOT HAVE_SPOTIFY_BLOB AND NOT CRYPTOPP_FOUND)
+- message(FATAL_ERROR "Either crypto++ must be available or the non-GPL Spotify "
- "code must be compiled in")
--elseif(QCA_FOUND)
+-elseif(CRYPTOPP_FOUND)
+- set(HAVE_CRYPTOPP ON)
- set(HAVE_SPOTIFY_DOWNLOADER ON)
-endif()
-
# Find DBus if it's enabled
if (HAVE_DBUS)
find_package(Qt4 REQUIRED QtDbus)
-@@ -440,7 +424,6 @@ add_subdirectory(ext/libclementine-common)
+@@ -422,7 +400,6 @@ add_subdirectory(ext/libclementine-common)
add_subdirectory(ext/libclementine-tagreader)
add_subdirectory(ext/clementine-tagreader)
add_subdirectory(ext/libclementine-remote)
@@ -75,7 +79,7 @@ index 47f1693..986351b 100644
option(WITH_DEBIAN OFF)
if(WITH_DEBIAN)
-@@ -451,10 +434,6 @@ if(HAVE_BREAKPAD)
+@@ -433,10 +410,6 @@ if(HAVE_BREAKPAD)
add_subdirectory(3rdparty/google-breakpad)
endif(HAVE_BREAKPAD)
@@ -87,42 +91,18 @@ index 47f1693..986351b 100644
add_subdirectory(gst/moodbar)
endif()
diff --git a/data/data.qrc b/data/data.qrc
-index 4c5473f..bd5fe2d 100644
+index 694eaad..caecc30 100644
--- a/data/data.qrc
+++ b/data/data.qrc
-@@ -2,7 +2,6 @@
- <qresource prefix="/">
+@@ -3,7 +3,6 @@
+ <file>Equifax_Secure_Certificate_Authority.pem</file>
<file>blank.ttf</file>
<file>clementine_remote_qr.png</file>
- <file>clementine-spotify-public.pem</file>
<file>currenttrack_bar_left.png</file>
<file>currenttrack_bar_mid.png</file>
<file>currenttrack_bar_right.png</file>
-@@ -77,7 +76,6 @@
- <file>icons/22x22/phone-nokia-n900.png</file>
- <file>icons/22x22/phone-palm-pre.png</file>
- <file>icons/22x22/phone.png</file>
-- <file>icons/22x22/spotify.png</file>
- <file>icons/22x22/user-away.png</file>
- <file>icons/22x22/view-choose.png</file>
- <file>icons/22x22/view-fullscreen.png</file>
-@@ -154,7 +152,6 @@
- <file>icons/32x32/phone-palm-pre.png</file>
- <file>icons/32x32/phone.png</file>
- <file>icons/32x32/search.png</file>
-- <file>icons/32x32/spotify.png</file>
- <file>icons/32x32/tools-wizard.png</file>
- <file>icons/32x32/view-choose.png</file>
- <file>icons/32x32/view-fullscreen.png</file>
-@@ -230,7 +227,6 @@
- <file>icons/48x48/phone-nokia-n900.png</file>
- <file>icons/48x48/phone-palm-pre.png</file>
- <file>icons/48x48/phone.png</file>
-- <file>icons/48x48/spotify.png</file>
- <file>icons/48x48/view-choose.png</file>
- <file>icons/48x48/view-fullscreen.png</file>
- <file>icons/48x48/view-media-equalizer.png</file>
-@@ -262,10 +258,10 @@
+@@ -280,10 +279,10 @@
<file>lumberjacksong.txt</file>
<file>lyrics/ultimate_providers.xml</file>
<file>mainwindow.css</file>
@@ -134,19 +114,56 @@ index 4c5473f..bd5fe2d 100644
<file>oauthsuccess.html</file>
<file>osd_background.png</file>
<file>osd_shadow_corner.png</file>
-@@ -391,7 +387,6 @@
- <file>smartplaylistsearchterm.css</file>
+@@ -350,7 +349,6 @@
+ <file>providers/22x22/somafm.png</file>
+ <file>providers/22x22/songkick.png</file>
+ <file>providers/22x22/soundcloud.png</file>
+- <file>providers/22x22/spotify.png</file>
+ <file>providers/22x22/subsonic.png</file>
+ <file>providers/22x22/vk.png</file>
+ <file>providers/22x22/wikipedia.png</file>
+@@ -382,7 +380,6 @@
+ <file>providers/32x32/somafm.png</file>
+ <file>providers/32x32/songkick.png</file>
+ <file>providers/32x32/soundcloud.png</file>
+- <file>providers/32x32/spotify.png</file>
+ <file>providers/32x32/subsonic.png</file>
+ <file>providers/32x32/vk.png</file>
+ <file>providers/32x32/wikipedia.png</file>
+@@ -414,7 +411,6 @@
+ <file>providers/48x48/somafm.png</file>
+ <file>providers/48x48/songkick.png</file>
+ <file>providers/48x48/soundcloud.png</file>
+- <file>providers/48x48/spotify.png</file>
+ <file>providers/48x48/subsonic.png</file>
+ <file>providers/48x48/vk.png</file>
+ <file>providers/48x48/wikipedia.png</file>
+@@ -478,7 +474,6 @@
<file>songinfo.css</file>
+ <file>soundcloud-ca.pem</file>
<file>spinner.gif</file>
- <file>spotify-attribution.png</file>
<file>star-off.png</file>
<file>star-on.png</file>
<file>tiny-pause.png</file>
+diff --git a/dist/codesign.py b/dist/codesign.py
+index 7c111fd..fee7345 100755
+--- a/dist/codesign.py
++++ b/dist/codesign.py
+@@ -33,7 +33,7 @@ def main():
+ for file in files:
+ if re.search(r'\.(dylib|so)$', file):
+ SignPath(os.path.join(root, file), developer_id)
+- elif re.match(r'(clementine-spotifyblob|clementine-tagreader|gst-plugin-scanner)', file):
++ elif re.match(r'(clementine-tagreader|gst-plugin-scanner)', file):
+ SignPath(os.path.join(root, file), developer_id)
+
+ SignPath(app_bundle, developer_id, deep=False)
diff --git a/dist/macdeploy.py b/dist/macdeploy.py
-index e054619..3568a6f 100755
+index 5d83c2e..f4d7d33 100755
--- a/dist/macdeploy.py
+++ b/dist/macdeploy.py
-@@ -398,10 +398,7 @@ def main():
+@@ -435,10 +435,7 @@ def main():
FixPlugin(FindGioModule('libgiolibproxy.so'), 'gio-modules')
try:
@@ -158,10 +175,10 @@ index e054619..3568a6f 100755
for plugin in QT_PLUGINS:
FixPlugin(FindQtPlugin(plugin), os.path.dirname(plugin))
diff --git a/dist/windows/clementine.nsi.in b/dist/windows/clementine.nsi.in
-index 750b332..6bf47ff 100644
+index 10ba0ff..2e1eba6 100644
--- a/dist/windows/clementine.nsi.in
+++ b/dist/windows/clementine.nsi.in
-@@ -97,9 +97,6 @@ Section "Delete old files" oldfiles
+@@ -187,9 +187,6 @@ Section "Delete old files" oldfiles
Delete "$INSTDIR\gstreamer-plugins\libgstqueue2.dll"
Delete "$INSTDIR\gstreamer-plugins\libgstsoup.dll"
@@ -171,40 +188,40 @@ index 750b332..6bf47ff 100644
; 1.0
Delete "$INSTDIR\libofa.dll"
Delete "$INSTDIR\gstreamer-plugins\libgstofa.dll"
-@@ -128,7 +125,6 @@ Section "Clementine" Clementine
- File "avutil-51.dll"
+@@ -260,7 +257,6 @@ Section "Clementine" Clementine
+
File "clementine.exe"
File "clementine-tagreader.exe"
- File "clementine-spotifyblob.exe"
File "clementine.ico"
File "glew32.dll"
- File "intl.dll"
-@@ -181,7 +177,6 @@ Section "Clementine" Clementine
+ File "libcdio-16.dll"
+@@ -314,7 +310,6 @@ Section "Clementine" Clementine
+ File "libprotobuf-8.dll"
File "libqjson.dll"
- File "libsoup-2.4-1.dll"
File "libspeex-1.dll"
- File "libspotify.dll"
+ File "libsqlite3-0.dll"
File "libstdc++-6.dll"
File "libtag.dll"
- File "libtasn1-3.dll"
-@@ -939,7 +934,6 @@ Section "Uninstall"
+@@ -1073,7 +1068,6 @@ Section "Uninstall"
Delete "$INSTDIR\clementine.ico"
Delete "$INSTDIR\clementine.exe"
Delete "$INSTDIR\clementine-tagreader.exe"
- Delete "$INSTDIR\clementine-spotifyblob.exe"
Delete "$INSTDIR\glew32.dll"
- Delete "$INSTDIR\intl.dll"
- Delete "$INSTDIR\libcdio-14.dll"
-@@ -992,7 +986,6 @@ Section "Uninstall"
+ Delete "$INSTDIR\libcdio-16.dll"
+ Delete "$INSTDIR\libchromaprint.dll"
+@@ -1126,7 +1120,6 @@ Section "Uninstall"
+ Delete "$INSTDIR\libprotobuf-8.dll"
Delete "$INSTDIR\libqjson.dll"
- Delete "$INSTDIR\libsoup-2.4-1.dll"
Delete "$INSTDIR\libspeex-1.dll"
- Delete "$INSTDIR\libspotify.dll"
Delete "$INSTDIR\libstdc++-6.dll"
Delete "$INSTDIR\libtag.dll"
- Delete "$INSTDIR\libtasn1-3.dll"
+ Delete "$INSTDIR\libtasn1-6.dll"
diff --git a/ext/libclementine-common/core/logging.cpp b/ext/libclementine-common/core/logging.cpp
-index 3c53d7a..49dd8cf 100644
+index ec8faa2..f76f034 100644
--- a/ext/libclementine-common/core/logging.cpp
+++ b/ext/libclementine-common/core/logging.cpp
@@ -14,10 +14,6 @@
@@ -219,10 +236,10 @@ index 3c53d7a..49dd8cf 100644
#include <cxxabi.h>
diff --git a/ext/libclementine-common/core/logging.h b/ext/libclementine-common/core/logging.h
-index 3c582cf..4a3cea8 100644
+index 21eebdf..68232ca 100644
--- a/ext/libclementine-common/core/logging.h
+++ b/ext/libclementine-common/core/logging.h
-@@ -14,11 +14,6 @@
+@@ -14,10 +14,6 @@
limitations under the License.
*/
@@ -230,15 +247,59 @@ index 3c582cf..4a3cea8 100644
-// it is used by the Spotify blob which links against libspotify and is not GPL
-// compatible.
-
--
#ifndef LOGGING_H
#define LOGGING_H
+diff --git a/ext/libclementine-common/core/messagehandler.cpp b/ext/libclementine-common/core/messagehandler.cpp
+index 1ea6492..5c4e79a 100644
+--- a/ext/libclementine-common/core/messagehandler.cpp
++++ b/ext/libclementine-common/core/messagehandler.cpp
+@@ -14,10 +14,6 @@
+ limitations under the License.
+ */
+
+-// Note: this file is licensed under the Apache License instead of GPL because
+-// it is used by the Spotify blob which links against libspotify and is not GPL
+-// compatible.
+-
+ #include "messagehandler.h"
+ #include "core/logging.h"
+
+diff --git a/ext/libclementine-common/core/messagehandler.h b/ext/libclementine-common/core/messagehandler.h
+index 5a7f8f2..7df58df 100644
+--- a/ext/libclementine-common/core/messagehandler.h
++++ b/ext/libclementine-common/core/messagehandler.h
+@@ -14,10 +14,6 @@
+ limitations under the License.
+ */
+
+-// Note: this file is licensed under the Apache License instead of GPL because
+-// it is used by the Spotify blob which links against libspotify and is not GPL
+-// compatible.
+-
+ #ifndef MESSAGEHANDLER_H
+ #define MESSAGEHANDLER_H
+
+diff --git a/ext/libclementine-common/core/override.h b/ext/libclementine-common/core/override.h
+index 98c2764..ca37137 100644
+--- a/ext/libclementine-common/core/override.h
++++ b/ext/libclementine-common/core/override.h
+@@ -14,10 +14,6 @@
+ limitations under the License.
+ */
+
+-// Note: this file is licensed under the Apache License instead of GPL because
+-// it is used by the Spotify blob which links against libspotify and is not GPL
+-// compatible.
+-
+ #ifndef OVERRIDE_H
+ #define OVERRIDE_H
+
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
-index 1104542..e7a8032 100644
+index afe58b9..125dd75 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
-@@ -60,8 +60,6 @@ include_directories(${CMAKE_SOURCE_DIR}/ext/libclementine-tagreader)
+@@ -56,8 +56,6 @@ include_directories(${CMAKE_SOURCE_DIR}/ext/libclementine-tagreader)
include_directories(${CMAKE_BINARY_DIR}/ext/libclementine-tagreader)
include_directories(${CMAKE_SOURCE_DIR}/ext/libclementine-remote)
include_directories(${CMAKE_BINARY_DIR}/ext/libclementine-remote)
@@ -247,7 +308,7 @@ index 1104542..e7a8032 100644
cmake_policy(SET CMP0011 NEW)
include(../cmake/ParseArguments.cmake)
-@@ -157,7 +155,6 @@ set(SOURCES
+@@ -154,7 +152,6 @@ set(SOURCES
globalsearch/simplesearchprovider.cpp
globalsearch/somafmsearchprovider.cpp
globalsearch/soundcloudsearchprovider.cpp
@@ -255,16 +316,16 @@ index 1104542..e7a8032 100644
globalsearch/suggestionwidget.cpp
globalsearch/urlsearchprovider.cpp
-@@ -195,9 +192,6 @@ set(SOURCES
- internet/somafmservice.cpp
- internet/somafmurlhandler.cpp
- internet/soundcloudservice.cpp
-- internet/spotifyserver.cpp
-- internet/spotifyservice.cpp
-- internet/spotifysettingspage.cpp
- internet/subsonicservice.cpp
- internet/subsonicsettingspage.cpp
- internet/subsonicurlhandler.cpp
+@@ -191,9 +188,6 @@ set(SOURCES
+ internet/somafm/somafmurlhandler.cpp
+ internet/soundcloud/soundcloudservice.cpp
+ internet/soundcloud/soundcloudsettingspage.cpp
+- internet/spotify/spotifyserver.cpp
+- internet/spotify/spotifyservice.cpp
+- internet/spotify/spotifysettingspage.cpp
+ internet/subsonic/subsonicservice.cpp
+ internet/subsonic/subsonicsettingspage.cpp
+ internet/subsonic/subsonicurlhandler.cpp
@@ -461,7 +455,6 @@ set(HEADERS
globalsearch/searchprovider.h
globalsearch/simplesearchprovider.h
@@ -272,42 +333,42 @@ index 1104542..e7a8032 100644
- globalsearch/spotifysearchprovider.h
globalsearch/suggestionwidget.h
- internet/cloudfileservice.h
+ internet/core/cloudfileservice.h
@@ -494,9 +487,6 @@ set(HEADERS
- internet/somafmservice.h
- internet/somafmurlhandler.h
- internet/soundcloudservice.h
-- internet/spotifyserver.h
-- internet/spotifyservice.h
-- internet/spotifysettingspage.h
- internet/subsonicservice.h
- internet/subsonicsettingspage.h
- internet/subsonicurlhandler.h
-@@ -685,7 +675,6 @@ set(UI
- internet/magnatunedownloaddialog.ui
- internet/magnatunesettingspage.ui
- internet/searchboxwidget.ui
-- internet/spotifysettingspage.ui
- internet/subsonicsettingspage.ui
+ internet/somafm/somafmurlhandler.h
+ internet/soundcloud/soundcloudservice.h
+ internet/soundcloud/soundcloudsettingspage.h
+- internet/spotify/spotifyserver.h
+- internet/spotify/spotifyservice.h
+- internet/spotify/spotifysettingspage.h
+ internet/subsonic/subsonicservice.h
+ internet/subsonic/subsonicsettingspage.h
+ internet/subsonic/subsonicurlhandler.h
+@@ -692,7 +682,6 @@ set(UI
+ internet/magnatune/magnatunesettingspage.ui
+ internet/core/searchboxwidget.ui
+ internet/soundcloud/soundcloudsettingspage.ui
+- internet/spotify/spotifysettingspage.ui
+ internet/subsonic/subsonicsettingspage.ui
library/groupbydialog.ui
-@@ -836,15 +825,6 @@ optional_source(HAVE_LIBLASTFM
+@@ -839,15 +828,6 @@ optional_source(HAVE_LIBLASTFM
)
-optional_source(HAVE_SPOTIFY_DOWNLOADER
- SOURCES
-- internet/spotifyblobdownloader.cpp
+- internet/spotify/spotifyblobdownloader.cpp
- HEADERS
-- internet/spotifyblobdownloader.h
+- internet/spotify/spotifyblobdownloader.h
- INCLUDE_DIRECTORIES
-- ${QCA_INCLUDE_DIRS}
+- ${CRYPTOPP_INCLUDE_DIRS}
-)
-
# Platform specific - OS X
optional_source(APPLE
INCLUDE_DIRECTORIES
-@@ -1171,7 +1151,6 @@ add_dependencies(clementine_lib pot)
+@@ -1233,7 +1213,6 @@ add_dependencies(clementine_lib pot)
target_link_libraries(clementine_lib
@@ -315,21 +376,21 @@ index 1104542..e7a8032 100644
libclementine-common
libclementine-tagreader
libclementine-remote
-@@ -1240,13 +1219,6 @@ if(HAVE_BREAKPAD)
+@@ -1303,13 +1282,6 @@ if(HAVE_BREAKPAD)
endif (LINUX)
endif(HAVE_BREAKPAD)
-if(HAVE_SPOTIFY_DOWNLOADER)
- target_link_libraries(clementine_lib
-- ${QCA_LIBRARIES}
+- ${CRYPTOPP_LIBRARIES}
- )
-- link_directories(${QCA_LIBRARY_DIRS})
+- link_directories(${CRYPTOPP_LIBRARY_DIRS})
-endif(HAVE_SPOTIFY_DOWNLOADER)
-
- if (APPLE)
- target_link_libraries(clementine_lib
- ${GROWL}
-@@ -1328,16 +1300,6 @@ target_link_libraries(clementine
+ if(HAVE_LIBPULSE)
+ target_link_libraries(clementine_lib ${LIBPULSE_LIBRARIES})
+ endif()
+@@ -1394,16 +1366,6 @@ target_link_libraries(clementine
clementine_lib
)
@@ -346,51 +407,65 @@ index 1104542..e7a8032 100644
if (APPLE)
install(FILES ../dist/clementine.icns
DESTINATION "${CMAKE_BINARY_DIR}/clementine.app/Contents/Resources")
-diff --git a/src/analyzers/nyancatanalyzer.cpp b/src/analyzers/nyancatanalyzer.cpp
-index 39ea101..ab19341 100644
---- a/src/analyzers/nyancatanalyzer.cpp
-+++ b/src/analyzers/nyancatanalyzer.cpp
-@@ -23,13 +23,13 @@
- #include <QTimerEvent>
- #include <QBrush>
-
--const char* NyanCatAnalyzer::kName = "Nyanalyzer cat";
-+const char* NyanCatAnalyzer::kName = "MooGNU";
- const float NyanCatAnalyzer::kPixelScale = 0.02f;
-
-
- NyanCatAnalyzer::NyanCatAnalyzer(QWidget* parent)
- : Analyzer::Base(parent, 9),
-- cat_(":/nyancat.png"),
-+ cat_(":/moognu.png"),
- timer_id_(startTimer(kFrameIntervalMs)),
- frame_(0),
- current_buffer_(0),
+diff --git a/src/analyzers/rainbowanalyzer.cpp b/src/analyzers/rainbowanalyzer.cpp
+index c8aa0cf..e8eec8b 100644
+--- a/src/analyzers/rainbowanalyzer.cpp
++++ b/src/analyzers/rainbowanalyzer.cpp
+@@ -40,7 +40,7 @@ const int Rainbow::RainbowAnalyzer::kRainbowHeight[] = { 21, 16 };
+ const int Rainbow::RainbowAnalyzer::kRainbowOverlap[] = { 13, 15 };
+ const int Rainbow::RainbowAnalyzer::kSleepingHeight[] = { 24, 33 };
+
+-const char* Rainbow::NyanCatAnalyzer::kName = "Nyanalyzer Cat";
++const char* Rainbow::NyanCatAnalyzer::kName = "MooGNU";
+ const char* Rainbow::RainbowDashAnalyzer::kName = "Rainbow Dash";
+ const float Rainbow::RainbowAnalyzer::kPixelScale = 0.02f;
+
+@@ -56,7 +56,7 @@ Rainbow::RainbowAnalyzer::RainbowAnalyzer(const RainbowType& rbtype, QWidget* pa
+ x_offset_(0),
+ background_brush_(QColor(0x0f, 0x43, 0x73)) {
+ rainbowtype = rbtype;
+- cat_dash_[0] = QPixmap(":/nyancat.png");
++ cat_dash_[0] = QPixmap(":/moognu.png");
+ cat_dash_[1] = QPixmap(":/rainbowdash.png");
+ memset(history_, 0, sizeof(history_));
+
+@@ -192,8 +192,8 @@ void Rainbow::RainbowAnalyzer::analyze(QPainter& p, const Analyzer::Scope& s,
+ // Draw the buffer on to the widget
+ p.drawPixmap(0, 0, buffer_[current_buffer_], x_offset_, 0, 0, 0);
+
+- // Draw rainbow analyzer (nyan cat or rainbowdash)
+- // Nyan nyan nyan nyan dash dash dash dash.
++ // Draw rainbow analyzer (moo gnu or rainbowdash)
++ // Moo moo moo moo dash dash dash dash.
+ if (!is_playing_) {
+ // Ssshhh!
+ p.drawPixmap(SleepingDestRect(rainbowtype), cat_dash_[rainbowtype],
diff --git a/src/config.h.in b/src/config.h.in
-index 6cac97e..90e4ee2 100644
+index f22fe9b..92124f5 100644
--- a/src/config.h.in
+++ b/src/config.h.in
-@@ -39,7 +39,6 @@
- #cmakedefine HAVE_QCA
+@@ -40,7 +40,6 @@
+ #cmakedefine HAVE_SEAFILE
#cmakedefine HAVE_SKYDRIVE
#cmakedefine HAVE_SPARKLE
-#cmakedefine HAVE_SPOTIFY_DOWNLOADER
- #cmakedefine HAVE_STATIC_SQLITE
- #cmakedefine HAVE_UBUNTU_ONE
+ #cmakedefine HAVE_VK
#cmakedefine HAVE_WIIMOTEDEV
+ #cmakedefine TAGLIB_HAS_OPUS
diff --git a/src/core/backgroundstreams.cpp b/src/core/backgroundstreams.cpp
-index 347b959..b00cb87 100644
+index 2e6ac60..e62504c 100644
--- a/src/core/backgroundstreams.cpp
+++ b/src/core/backgroundstreams.cpp
-@@ -9,7 +9,6 @@
+@@ -28,8 +28,6 @@
const char* BackgroundStreams::kSettingsGroup = "BackgroundStreams";
const char* BackgroundStreams::kHypnotoadUrl = "hypnotoad:///";
--const char* BackgroundStreams::kRainUrl = "http://data.clementine-player.org/rainymood";
+-const char* BackgroundStreams::kRainUrl =
+- "http://data.clementine-player.org/rainymood";
const char* BackgroundStreams::kEnterpriseUrl = "enterprise:///";
BackgroundStreams::BackgroundStreams(EngineBase* engine, QObject* parent)
-@@ -28,7 +27,6 @@ void BackgroundStreams::LoadStreams() {
+@@ -44,7 +42,6 @@ void BackgroundStreams::LoadStreams() {
int version = s.value("version", 0).toInt();
if (version < 1) {
AddStream(QT_TR_NOOP("Hypnotoad"), QUrl(kHypnotoadUrl));
@@ -399,10 +474,10 @@ index 347b959..b00cb87 100644
if (version < kVersion) {
diff --git a/src/core/timeconstants.h b/src/core/timeconstants.h
-index 96242d6..69196bd 100644
+index 67d0227..49020d8 100644
--- a/src/core/timeconstants.h
+++ b/src/core/timeconstants.h
-@@ -14,10 +14,6 @@
+@@ -16,10 +16,6 @@
limitations under the License.
*/
@@ -410,16 +485,16 @@ index 96242d6..69196bd 100644
-// it is used by the Spotify blob which links against libspotify and is not GPL
-// compatible.
-
- #ifndef TIMECONSTANTS_H
- #define TIMECONSTANTS_H
+ #ifndef CORE_TIMECONSTANTS_H_
+ #define CORE_TIMECONSTANTS_H_
diff --git a/src/core/utilities.cpp b/src/core/utilities.cpp
-index 3fdc6be..e6a109f 100644
+index 739cadb..a022a47 100644
--- a/src/core/utilities.cpp
+++ b/src/core/utilities.cpp
-@@ -340,9 +340,6 @@ QString GetConfigPath(ConfigPath config) {
- return QDir::homePath();
- #endif
+@@ -368,9 +368,6 @@ QString GetConfigPath(ConfigPath config) {
+ return QDir::homePath();
+ #endif
- case Path_LocalSpotifyBlob:
- return GetConfigPath(Path_Root) + "/spotifyblob";
@@ -428,40 +503,38 @@ index 3fdc6be..e6a109f 100644
qFatal("%s", Q_FUNC_INFO);
return QString::null;
diff --git a/src/core/utilities.h b/src/core/utilities.h
-index edaa545..ad2138c 100644
+index 5fd8fc1..36ddefe 100644
--- a/src/core/utilities.h
+++ b/src/core/utilities.h
-@@ -111,7 +111,6 @@ namespace Utilities {
- Path_NetworkCache,
- Path_GstreamerRegistry,
- Path_DefaultMusicLibrary,
-- Path_LocalSpotifyBlob,
- Path_MoodbarCache,
- Path_CacheRoot,
- };
+@@ -129,7 +129,6 @@ enum ConfigPath {
+ Path_NetworkCache,
+ Path_GstreamerRegistry,
+ Path_DefaultMusicLibrary,
+- Path_LocalSpotifyBlob,
+ Path_MoodbarCache,
+ Path_CacheRoot,
+ };
diff --git a/src/covers/albumcoverloader.cpp b/src/covers/albumcoverloader.cpp
-index a4c4241..39dd101 100644
+index 8ebf51c..b4d646b 100644
--- a/src/covers/albumcoverloader.cpp
+++ b/src/covers/albumcoverloader.cpp
-@@ -30,7 +30,6 @@
+@@ -34,14 +34,12 @@
#include "core/tagreaderclient.h"
#include "core/utilities.h"
- #include "internet/internetmodel.h"
--#include "internet/spotifyservice.h"
+ #include "internet/core/internetmodel.h"
+-#include "internet/spotify/spotifyservice.h"
+ AlbumCoverLoader::AlbumCoverLoader(QObject* parent)
+ : QObject(parent),
+ stop_requested_(false),
+ next_id_(1),
+- network_(new NetworkAccessManager(this)),
+- connected_spotify_(false) {}
++ network_(new NetworkAccessManager(this))
-
-@@ -38,8 +37,7 @@ AlbumCoverLoader::AlbumCoverLoader(QObject* parent)
- : QObject(parent),
- stop_requested_(false),
- next_id_(1),
-- network_(new NetworkAccessManager(this)),
-- connected_spotify_(false)
-+ network_(new NetworkAccessManager(this))
- {
- }
-
-@@ -169,26 +167,6 @@ AlbumCoverLoader::TryLoadResult AlbumCoverLoader::TryLoadImage(
+ QString AlbumCoverLoader::ImageCacheDir() {
+ return Utilities::GetConfigPath(Utilities::Path_AlbumCovers);
+@@ -176,26 +174,6 @@ AlbumCoverLoader::TryLoadResult AlbumCoverLoader::TryLoadImage(
remote_tasks_.insert(reply, task);
return TryLoadResult(true, false, QImage());
@@ -470,8 +543,8 @@ index a4c4241..39dd101 100644
- SpotifyService* spotify = InternetModel::Service<SpotifyService>();
-
- if (!connected_spotify_) {
-- connect(spotify, SIGNAL(ImageLoaded(QString,QImage)),
-- SLOT(SpotifyImageLoaded(QString,QImage)));
+- connect(spotify, SIGNAL(ImageLoaded(QString, QImage)),
+- SLOT(SpotifyImageLoaded(QString, QImage)));
- connected_spotify_ = true;
- }
-
@@ -488,13 +561,13 @@ index a4c4241..39dd101 100644
}
QImage image(filename);
-@@ -196,16 +174,6 @@ AlbumCoverLoader::TryLoadResult AlbumCoverLoader::TryLoadImage(
- image.isNull() ? task.options.default_output_image_: image);
+@@ -204,16 +182,6 @@ AlbumCoverLoader::TryLoadResult AlbumCoverLoader::TryLoadImage(
+ image.isNull() ? task.options.default_output_image_ : image);
}
--void AlbumCoverLoader::SpotifyImageLoaded(const QString& id, const QImage& image) {
-- if (!remote_spotify_tasks_.contains(id))
-- return;
+-void AlbumCoverLoader::SpotifyImageLoaded(const QString& id,
+- const QImage& image) {
+- if (!remote_spotify_tasks_.contains(id)) return;
-
- Task task = remote_spotify_tasks_.take(id);
- QImage scaled = ScaleAndPad(task.options, image);
@@ -506,18 +579,18 @@ index a4c4241..39dd101 100644
reply->deleteLater();
diff --git a/src/covers/albumcoverloader.h b/src/covers/albumcoverloader.h
-index 987be66..5214e14 100644
+index 4d3e4d5..5de0663 100644
--- a/src/covers/albumcoverloader.h
+++ b/src/covers/albumcoverloader.h
-@@ -62,7 +62,6 @@ class AlbumCoverLoader : public QObject {
+@@ -66,7 +66,6 @@ class AlbumCoverLoader : public QObject {
protected slots:
void ProcessTasks();
void RemoteFetchFinished(QNetworkReply* reply);
- void SpotifyImageLoaded(const QString& url, const QImage& image);
protected:
- enum State {
-@@ -102,13 +101,10 @@ class AlbumCoverLoader : public QObject {
+ enum State { State_TryingManual, State_TryingAuto, };
+@@ -103,13 +102,10 @@ class AlbumCoverLoader : public QObject {
QMutex mutex_;
QQueue<Task> tasks_;
QMap<QNetworkReply*, Task> remote_tasks_;
@@ -532,21 +605,21 @@ index 987be66..5214e14 100644
};
diff --git a/src/engines/gstenginepipeline.cpp b/src/engines/gstenginepipeline.cpp
-index 94f77a3..37c1cdf 100644
+index c3fde67..cae00d4 100644
--- a/src/engines/gstenginepipeline.cpp
+++ b/src/engines/gstenginepipeline.cpp
-@@ -29,8 +29,6 @@
+@@ -34,8 +34,6 @@
#include "core/signalchecker.h"
#include "core/utilities.h"
- #include "internet/internetmodel.h"
--#include "internet/spotifyserver.h"
--#include "internet/spotifyservice.h"
-
+ #include "internet/core/internetmodel.h"
+-#include "internet/spotify/spotifyserver.h"
+-#include "internet/spotify/spotifyservice.h"
const int GstEnginePipeline::kGstStateTimeoutNanosecs = 10000000;
-@@ -141,37 +139,11 @@ bool GstEnginePipeline::ReplaceDecodeBin(GstElement* new_bin) {
+ const int GstEnginePipeline::kFaderFudgeMsec = 2000;
+@@ -152,44 +150,14 @@ bool GstEnginePipeline::ReplaceDecodeBin(GstElement* new_bin) {
bool GstEnginePipeline::ReplaceDecodeBin(const QUrl& url) {
- GstElement* new_bin = NULL;
+ GstElement* new_bin = nullptr;
- if (url.scheme() == "spotify") {
- new_bin = gst_bin_new("spotify_bin");
@@ -554,13 +627,12 @@ index 94f77a3..37c1cdf 100644
- // Create elements
- GstElement* src = engine_->CreateElement("tcpserversrc", new_bin);
- GstElement* gdp = engine_->CreateElement("gdpdepay", new_bin);
-- if (!src || !gdp)
-- return false;
+- if (!src || !gdp) return false;
-
- // Pick a port number
- const int port = Utilities::PickUnusedPort();
-- g_object_set(G_OBJECT(src), "host", "127.0.0.1", NULL);
-- g_object_set(G_OBJECT(src), "port", port, NULL);
+- g_object_set(G_OBJECT(src), "host", "127.0.0.1", nullptr);
+- g_object_set(G_OBJECT(src), "port", port, nullptr);
-
- // Link the elements
- gst_element_link(src, gdp);
@@ -571,84 +643,293 @@ index 94f77a3..37c1cdf 100644
- gst_object_unref(GST_OBJECT(pad));
-
- // Tell spotify to start sending data to us.
-- InternetModel::Service<SpotifyService>()->server()->StartPlaybackLater(url.toString(), port);
+- SpotifyServer* spotify_server = InternetModel::Service<SpotifyService>()->server();
+- // Need to schedule this in the spotify server's thread
+- QMetaObject::invokeMethod(spotify_server, "StartPlayback",
+- Qt::QueuedConnection,
+- Q_ARG(QString, url.toString()),
+- Q_ARG(quint16, port));
- } else {
- new_bin = engine_->CreateElement("uridecodebin");
- g_object_set(G_OBJECT(new_bin), "uri", url.toEncoded().constData(), NULL);
- CHECKED_GCONNECT(G_OBJECT(new_bin), "drained", &SourceDrainedCallback, this);
- CHECKED_GCONNECT(G_OBJECT(new_bin), "pad-added", &NewPadCallback, this);
- CHECKED_GCONNECT(G_OBJECT(new_bin), "notify::source", &SourceSetupCallback, this);
+- new_bin = engine_->CreateElement("uridecodebin");
+- g_object_set(G_OBJECT(new_bin), "uri", url.toEncoded().constData(),
+- nullptr);
+- CHECKED_GCONNECT(G_OBJECT(new_bin), "drained", &SourceDrainedCallback,
+- this);
+- CHECKED_GCONNECT(G_OBJECT(new_bin), "pad-added", &NewPadCallback, this);
+- CHECKED_GCONNECT(G_OBJECT(new_bin), "notify::source", &SourceSetupCallback,
+- this);
- }
++ new_bin = engine_->CreateElement("uridecodebin");
++ g_object_set(G_OBJECT(new_bin), "uri", url.toEncoded().constData(),
++ nullptr);
++ CHECKED_GCONNECT(G_OBJECT(new_bin), "drained", &SourceDrainedCallback,
++ this);
++ CHECKED_GCONNECT(G_OBJECT(new_bin), "pad-added", &NewPadCallback, this);
++ CHECKED_GCONNECT(G_OBJECT(new_bin), "notify::source", &SourceSetupCallback,
++ this);
return ReplaceDecodeBin(new_bin);
}
-diff --git a/src/internet/internetmodel.cpp b/src/internet/internetmodel.cpp
-index 289f591..ac9e3e0 100644
---- a/src/internet/internetmodel.cpp
-+++ b/src/internet/internetmodel.cpp
-@@ -30,7 +30,6 @@
- #include "savedradio.h"
- #include "somafmservice.h"
- #include "soundcloudservice.h"
--#include "spotifyservice.h"
- #include "subsonicservice.h"
+@@ -923,17 +891,6 @@ GstPadProbeReturn GstEnginePipeline::EventHandoffCallback(GstPad*,
+ void GstEnginePipeline::SourceDrainedCallback(GstURIDecodeBin* bin,
+ gpointer self) {
+ GstEnginePipeline* instance = reinterpret_cast<GstEnginePipeline*>(self);
+-
+- if (instance->has_next_valid_url() &&
+- // I'm not sure why, but calling this when previous track is a local song
+- // and the next track is a Spotify song is buggy: the Spotify song will
+- // not start or with some offset. So just do nothing here: when the song
+- // finished, EndOfStreamReached/TrackEnded will be emitted anyway so
+- // NextItem will be called.
+- !(instance->url_.scheme() != "spotify" &&
+- instance->next_url_.scheme() == "spotify")) {
+- instance->TransitionToNext();
+- }
+ }
+
+ void GstEnginePipeline::SourceSetupCallback(GstURIDecodeBin* bin,
+@@ -1032,24 +989,6 @@ GstState GstEnginePipeline::state() const {
+ }
+
+ QFuture<GstStateChangeReturn> GstEnginePipeline::SetState(GstState state) {
+- if (url_.scheme() == "spotify" && !buffering_) {
+- const GstState current_state = this->state();
+-
+- if (state == GST_STATE_PAUSED && current_state == GST_STATE_PLAYING) {
+- SpotifyService* spotify = InternetModel::Service<SpotifyService>();
+-
+- // Need to schedule this in the spotify service's thread
+- QMetaObject::invokeMethod(spotify, "SetPaused", Qt::QueuedConnection,
+- Q_ARG(bool, true));
+- } else if (state == GST_STATE_PLAYING &&
+- current_state == GST_STATE_PAUSED) {
+- SpotifyService* spotify = InternetModel::Service<SpotifyService>();
+-
+- // Need to schedule this in the spotify service's thread
+- QMetaObject::invokeMethod(spotify, "SetPaused", Qt::QueuedConnection,
+- Q_ARG(bool, false));
+- }
+- }
+ return ConcurrentRun::Run<GstStateChangeReturn, GstElement*, GstState>(
+ &set_state_threadpool_, &gst_element_set_state, pipeline_, state);
+ }
+diff --git a/src/internet/core/internetmodel.cpp b/src/internet/core/internetmodel.cpp
+index 597d904..a769489 100644
+--- a/src/internet/core/internetmodel.cpp
++++ b/src/internet/core/internetmodel.cpp
+@@ -37,7 +37,6 @@
+ #include "internet/internetradio/savedradio.h"
+ #include "internet/somafm/somafmservice.h"
+ #include "internet/soundcloud/soundcloudservice.h"
+-#include "internet/spotify/spotifyservice.h"
+ #include "internet/subsonic/subsonicservice.h"
#include "core/closure.h"
#include "core/logging.h"
-@@ -94,7 +93,6 @@ InternetModel::InternetModel(Application* app, QObject* parent)
- AddService(new SkyFmService(app, this));
+@@ -97,7 +96,6 @@ InternetModel::InternetModel(Application* app, QObject* parent)
+ AddService(new RadioTunesService(app, this));
AddService(new SomaFMService(app, this));
AddService(new SoundCloudService(app, this));
- AddService(new SpotifyService(app, this));
AddService(new SubsonicService(app, this));
- #ifdef HAVE_UBUNTU_ONE
- AddService(new UbuntuOneService(app, this));
+ #ifdef HAVE_BOX
+ AddService(new BoxService(app, this));
+diff --git a/src/main.cpp b/src/main.cpp
+index 1a961c8..515630e 100644
+--- a/src/main.cpp
++++ b/src/main.cpp
+@@ -159,13 +159,6 @@ void SetEnv(const char* key, const QString& value) {
+ #endif
+ }
+
+-// This must be done early so that the spotify blob process also picks up
+-// these environment variables.
+-void SetGstreamerEnvironment() {
+- QString scanner_path;
+- QString plugin_path;
+- QString registry_filename;
+-
+ // On windows and mac we bundle the gstreamer plugins with clementine
+ #if defined(Q_OS_DARWIN)
+ scanner_path =
+diff --git a/src/playlist/playlistbackend.h b/src/playlist/playlistbackend.h
+index f9d347c..320c0fb 100644
+--- a/src/playlist/playlistbackend.h
++++ b/src/playlist/playlistbackend.h
+@@ -47,8 +47,6 @@ class PlaylistBackend : public QObject {
+ QString dynamic_backend;
+ QByteArray dynamic_data;
+
+- // Special playlists have different behaviour, eg. the "spotify-search"
+- // type has a spotify search box at the top, replacing the ordinary filter.
+ QString special_type;
+ };
+ typedef QList<Playlist> PlaylistList;
+diff --git a/src/playlist/playlistdelegates.cpp b/src/playlist/playlistdelegates.cpp
+index 11ffa42..649976a 100644
+--- a/src/playlist/playlistdelegates.cpp
++++ b/src/playlist/playlistdelegates.cpp
+@@ -458,9 +458,7 @@ QPixmap SongSourceDelegate::LookupPixmap(const QUrl& url,
+ if (handler) {
+ icon = handler->icon();
+ } else {
+- if (url.scheme() == "spotify") {
+- icon = IconLoader::Load("spotify", IconLoader::Provider);
+- } else if (url.scheme() == "file") {
++ if (url.scheme() == "file") {
+ icon = IconLoader::Load("folder-sound", IconLoader::Base);
+ } else if (url.host() == "api.jamendo.com") {
+ icon = IconLoader::Load("jamendo", IconLoader::Provider);
+diff --git a/src/songinfo/echonestimages.cpp b/src/songinfo/echonestimages.cpp
+index ce13645..c3e7e0e 100644
+--- a/src/songinfo/echonestimages.cpp
++++ b/src/songinfo/echonestimages.cpp
+@@ -27,11 +27,6 @@
+ #include "core/logging.h"
+ #include "core/network.h"
+
+-namespace {
+-static const char* kSpotifyBucket = "spotify";
+-static const char* kSpotifyArtistUrl = "https://api.spotify.com/v1/artists/%1";
+-}
+-
+ EchoNestImages::EchoNestImages() : network_(new NetworkAccessManager) {}
+
+ EchoNestImages::~EchoNestImages() {}
+@@ -48,19 +43,6 @@ void EchoNestImages::FetchInfo(int id, const Song& metadata) {
+ NewClosure(reply, SIGNAL(finished()), this,
+ SLOT(RequestFinished(QNetworkReply*, int, Echonest::Artist)),
+ reply, id, artist);
+-
+- // Also look up the artist id for the spotify API so we can directly request
+- // images from there too.
+- Echonest::Artist::SearchParams params;
+- params.push_back(
+- qMakePair(Echonest::Artist::Name, QVariant(metadata.artist())));
+- QNetworkReply* rosetta_reply = Echonest::Artist::search(
+- params,
+- Echonest::ArtistInformation(Echonest::ArtistInformation::NoInformation,
+- QStringList() << kSpotifyBucket));
+- RegisterReply(rosetta_reply, id);
+- NewClosure(rosetta_reply, SIGNAL(finished()), this,
+- SLOT(IdsFound(QNetworkReply*, int)), rosetta_reply, id);
+ }
+
+ void EchoNestImages::RequestFinished(QNetworkReply* reply, int id,
+@@ -88,49 +70,12 @@ void EchoNestImages::IdsFound(QNetworkReply* reply, int request_id) {
+ if (artists.isEmpty()) {
+ return;
+ }
+- const Echonest::ForeignIds& foreign_ids = artists.first().foreignIds();
+- for (const Echonest::ForeignId& id : foreign_ids) {
+- if (id.catalog.contains("spotify")) {
+- DoSpotifyImageRequest(id.foreign_id, request_id);
+- }
+- }
+ } catch (Echonest::ParseError e) {
+ qLog(Warning) << "Error parsing echonest reply:" << e.errorType()
+ << e.what();
+ }
+ }
+
+-void EchoNestImages::DoSpotifyImageRequest(const QString& id, int request_id) {
+- QString artist_id = id.split(":").last();
+- QUrl url(QString(kSpotifyArtistUrl).arg(artist_id));
+- QNetworkReply* reply = network_->get(QNetworkRequest(url));
+- RegisterReply(reply, request_id);
+- NewClosure(reply, SIGNAL(finished()), [this, reply, request_id]() {
+- reply->deleteLater();
+- QJson::Parser parser;
+- QVariantMap result = parser.parse(reply).toMap();
+- QVariantList images = result["images"].toList();
+- QList<QPair<QUrl, QSize>> image_urls;
+- for (const QVariant& image : images) {
+- QVariantMap image_result = image.toMap();
+- image_urls.append(qMakePair(image_result["url"].toUrl(),
+- QSize(image_result["width"].toInt(),
+- image_result["height"].toInt())));
+- }
+- // All the images are the same just different sizes; just pick the largest.
+- std::sort(image_urls.begin(), image_urls.end(),
+- [](const QPair<QUrl, QSize>& a,
+- const QPair<QUrl, QSize>& b) {
+- // Sorted by area ascending.
+- return (a.second.height() * a.second.width()) <
+- (b.second.height() * b.second.width());
+- });
+- if (!image_urls.isEmpty()) {
+- emit ImageReady(request_id, image_urls.last().first);
+- }
+- });
+-}
+-
+ // Keeps track of replies and emits Finished() when all replies associated with
+ // a request are finished with.
+ void EchoNestImages::RegisterReply(QNetworkReply* reply, int id) {
+diff --git a/src/songinfo/echonestimages.h b/src/songinfo/echonestimages.h
+index 6e67e87..8cd71e4 100644
+--- a/src/songinfo/echonestimages.h
++++ b/src/songinfo/echonestimages.h
+@@ -42,8 +42,6 @@ class EchoNestImages : public SongInfoProvider {
+ void IdsFound(QNetworkReply* reply, int id);
+
+ private:
+- void DoSpotifyImageRequest(const QString& id, int request_id);
+-
+ void RegisterReply(QNetworkReply* reply, int id);
+ QMultiMap<int, QNetworkReply*> replies_;
+ std::unique_ptr<NetworkAccessManager> network_;
diff --git a/src/ui/about.cpp b/src/ui/about.cpp
-index 53e42bd..49e7714 100644
+index 77a05d1..a43ae4f 100644
--- a/src/ui/about.cpp
+++ b/src/ui/about.cpp
-@@ -76,14 +76,9 @@ QString About::MakeHtml() const {
+@@ -83,7 +83,6 @@ QString About::MakeHtml() const {
ret += QString("<br />%1</p>").arg(tr("...and all the Amarok contributors"));
ret += QString("<p><b>%1</b>").arg(tr("And:"));
- ret += QString("<br /><a href=\"http://rainymood.com\">Rainy Mood</a>");
- ret += QString("<br /><a href=\"http://www.smitelli.com/?page=blog&p=54\">Scott Smitelli</a>");
- ret += QString("<br /><a href=\"http://hyperboleandahalf.blogspot.com\">Allie Brosh</a></p>");
-
-- ret += "<p>This product uses Music by Spotify but is not endorsed, certified "
-- "or otherwise approved in any way by Spotify. Spotify is the registered "
-- "trade mark of the Spotify Group.</p>";
+ ret += QString(
+ "<br /><a href=\"http://www.smitelli.com/?page=blog&p=54\">Scott "
+ "Smitelli</a>");
+@@ -91,11 +90,6 @@ QString About::MakeHtml() const {
+ "<br /><a href=\"http://hyperboleandahalf.blogspot.com\">Allie "
+ "Brosh</a></p>");
+
+- ret +=
+- "<p>This product uses Music by Spotify but is not endorsed, certified "
+- "or otherwise approved in any way by Spotify. Spotify is the registered "
+- "trade mark of the Spotify Group.</p>";
-
return ret;
}
diff --git a/src/ui/settingsdialog.cpp b/src/ui/settingsdialog.cpp
-index dc0d84f..4a9335d 100644
+index 2cb7e1b..8cb60e7 100644
--- a/src/ui/settingsdialog.cpp
+++ b/src/ui/settingsdialog.cpp
-@@ -38,7 +38,6 @@
- #include "internet/digitallyimportedsettingspage.h"
- #include "internet/groovesharksettingspage.h"
- #include "internet/magnatunesettingspage.h"
--#include "internet/spotifysettingspage.h"
- #include "internet/subsonicsettingspage.h"
- #include "internet/ubuntuonesettingspage.h"
+@@ -39,7 +39,6 @@
+ #include "internet/core/internetshowsettingspage.h"
+ #include "internet/magnatune/magnatunesettingspage.h"
+ #include "internet/soundcloud/soundcloudsettingspage.h"
+-#include "internet/spotify/spotifysettingspage.h"
+ #include "internet/subsonic/subsonicsettingspage.h"
#include "library/librarysettingspage.h"
-@@ -174,7 +173,6 @@ SettingsDialog::SettingsDialog(Application* app, BackgroundStreams* streams, QWi
- AddPage(Page_Box, new BoxSettingsPage(this), providers);
+ #include "playlist/playlistview.h"
+@@ -184,7 +183,6 @@ SettingsDialog::SettingsDialog(Application* app, BackgroundStreams* streams,
#endif
+ AddPage(Page_SoundCloud, new SoundCloudSettingsPage(this), providers);
- AddPage(Page_Spotify, new SpotifySettingsPage(this), providers);
- AddPage(Page_Magnatune, new MagnatuneSettingsPage(this), providers);
- AddPage(Page_DigitallyImported, new DigitallyImportedSettingsPage(this), providers);
- AddPage(Page_BackgroundStreams, new BackgroundStreamsSettingsPage(this), providers);
+
+ #ifdef HAVE_VK
+ AddPage(Page_Vk, new VkSettingsPage(this), providers);
diff --git a/src/ui/settingsdialog.h b/src/ui/settingsdialog.h
-index e9e709a..5485a37 100644
+index 14bb976..b543cc9 100644
--- a/src/ui/settingsdialog.h
+++ b/src/ui/settingsdialog.h
-@@ -69,7 +69,6 @@ public:
+@@ -69,7 +69,6 @@ class SettingsDialog : public QDialog {
Page_Library,
Page_Lastfm,
- Page_Grooveshark,
+ Page_SoundCloud,
- Page_Spotify,
Page_Magnatune,
Page_DigitallyImported,