summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--community/oath-toolkit/PKGBUILD13
-rw-r--r--community/opendkim/PKGBUILD13
-rw-r--r--community/python2-simplejson/PKGBUILD9
-rw-r--r--community/slock/PKGBUILD6
-rw-r--r--community/spacefm/PKGBUILD8
-rw-r--r--community/vdrift/PKGBUILD15
-rw-r--r--community/vdrift/vdrift-2012-07-22c_bullet281_patch.diff898
-rw-r--r--core/bison/PKGBUILD8
-rw-r--r--core/coreutils/PKGBUILD8
-rw-r--r--core/cryptsetup/PKGBUILD14
-rw-r--r--core/cryptsetup/encrypt_hook5
-rw-r--r--core/libusb-compat/PKGBUILD10
-rw-r--r--core/nss-myhostname/PKGBUILD30
-rw-r--r--core/systemd/PKGBUILD12
-rw-r--r--core/systemd/systemd.install24
-rw-r--r--extra/physfs/PKGBUILD12
-rw-r--r--extra/xf86-video-nouveau/PKGBUILD10
-rw-r--r--libre/clementine-libre/PKGBUILD47
-rw-r--r--libre/clementine-libre/remove-and-disable-spotify.patch3117
-rw-r--r--libre/filesystem/PKGBUILD12
-rw-r--r--libre/filesystem/nsswitch.conf2
-rw-r--r--libre/filesystem/parabola.7.txt29
-rw-r--r--libre/filesystem/shadow1
-rw-r--r--libre/linux-libre-api-headers/PKGBUILD10
-rw-r--r--libre/lirc-libre/PKGBUILD2
-rw-r--r--social/babeld/PKGBUILD32
-rw-r--r--social/babeld/babeld.install18
27 files changed, 1357 insertions, 3008 deletions
diff --git a/community/oath-toolkit/PKGBUILD b/community/oath-toolkit/PKGBUILD
index 7e4fcd265..d0d225d75 100644
--- a/community/oath-toolkit/PKGBUILD
+++ b/community/oath-toolkit/PKGBUILD
@@ -1,19 +1,19 @@
-# $Id: PKGBUILD 77539 2012-10-11 23:18:29Z seblu $
+# $Id: PKGBUILD 78852 2012-10-25 22:57:45Z seblu $
# Maintainer: Sébastien Luttringer <seblu@aur.archlinux.org>
# Contributor: Christian Hesse <mail@eworm.de>
# Contributor: L42y <423300@gmail.com>
pkgname=oath-toolkit
-pkgver=2.0.0
+pkgver=2.0.1
pkgrel=1
pkgdesc='OATH one-time password toolkit'
arch=('i686' 'x86_64')
url='http://www.nongnu.org/oath-toolkit/'
license=('GPL3')
-depends=('glibc' 'pam' 'libxml2')
+depends=('glibc' 'pam' 'xmlsec')
options=('!libtool')
source=("http://download.savannah.nongnu.org/releases/$pkgname/$pkgname-$pkgver.tar.gz")
-md5sums=('2da5d9211062dfd746539c783185fae1')
+md5sums=('529e5995ae0d95a94daa16f9b9c25e3c')
build() {
cd $pkgname-$pkgver
@@ -21,6 +21,11 @@ build() {
make
}
+check() {
+ cd $pkgname-$pkgver
+ make check
+}
+
package() {
cd $pkgname-$pkgver
make DESTDIR="$pkgdir" install
diff --git a/community/opendkim/PKGBUILD b/community/opendkim/PKGBUILD
index 8bfab528d..6e11bf0f4 100644
--- a/community/opendkim/PKGBUILD
+++ b/community/opendkim/PKGBUILD
@@ -1,24 +1,24 @@
-# $Id: PKGBUILD 78344 2012-10-17 14:52:24Z spupykin $
+# $Id: PKGBUILD 78840 2012-10-25 13:10:38Z spupykin $
# Maintainer: Sergej Pupykin <pupykin.s+arch@gmail.com>
# Maintainer: Thomas Jost <schnouki@schnouki.net>
pkgname=opendkim
-pkgver=2.6.7
-pkgrel=2
+pkgver=2.7.0
+pkgrel=1
pkgdesc="An open source implementation of the DKIM sender authentication system. Based on a fork of dkim-milter."
arch=(i686 x86_64)
url="http://www.opendkim.org/"
license=('BSD' 'custom:Sendmail')
depends=("db" "openssl")
makedepends=("libmilter")
-options=(!libtool)
+options=(!libtool !emptydirs)
backup=(etc/conf.d/opendkim)
install=opendkim.install
source=(http://downloads.sourceforge.net/project/$pkgname/$pkgname-$pkgver.tar.gz
opendkim.conf
opendkim.rc
opendkim.service)
-md5sums=('8dd327c1c3f3ffdbc436ef7df877940e'
+md5sums=('ec3f38e6b612c58cd3b4dabfd923274a'
'3e2bb1058ac0662f01e675aa6ac7ee8f'
'093f5c098a45cc68753f97e45a5b374c'
'bc1b73856bc1941faaa4842e00437cb5')
@@ -49,9 +49,6 @@ package() {
install -Dm644 "$srcdir/opendkim.conf" "$pkgdir/etc/conf.d/opendkim"
install -Dm755 "$srcdir/opendkim.rc" "$pkgdir/etc/rc.d/opendkim"
- # Remove empty dirs
- rmdir "$pkgdir/usr/share/man/man1" "$pkgdir/usr/share/man/man3"
-
# License
mkdir -p "$pkgdir/usr/share/licenses/opendkim"
for f in LICENSE LICENSE.Sendmail; do
diff --git a/community/python2-simplejson/PKGBUILD b/community/python2-simplejson/PKGBUILD
index 1ec0a97b5..d300ee192 100644
--- a/community/python2-simplejson/PKGBUILD
+++ b/community/python2-simplejson/PKGBUILD
@@ -4,8 +4,8 @@
# Contributor: David Moore <davidm@sjsoft.com>
pkgname=python2-simplejson
-pkgver=2.6.1
-pkgrel=3
+pkgver=2.6.2
+pkgrel=1
pkgdesc="Simple, fast, extensible JSON encoder/decoder for Python"
license=('MIT')
arch=('i686' 'x86_64')
@@ -18,13 +18,16 @@ replaces=('python-simplejson')
changelog=$pkgname.changelog
source=($pkgname-$pkgver.tar.gz::https://github.com/simplejson/simplejson/tarball/v${pkgver})
sha256sums=('484b4cf0a545fc59a19ea8eed3a957919a89be116804b53712ec63466d7c3a31')
+sha256sums=('c57ecbcbaf7013df2d555436838acd78c9bb05c3e34ebe3d4de4d8102a0ac2a5')
+sha256sums=('c57ecbcbaf7013df2d555436838acd78c9bb05c3e34ebe3d4de4d8102a0ac2a5')
+sha256sums=('c57ecbcbaf7013df2d555436838acd78c9bb05c3e34ebe3d4de4d8102a0ac2a5')
build() {
cd ${srcdir}/simplejson-simplejson-*
python2 setup.py install --root=${pkgdir}
-# License
+ # License
install -Dm644 ${srcdir}/simplejson-simplejson-*/LICENSE.txt \
${pkgdir}/usr/share/licenses/$pkgname/LICENSE
}
diff --git a/community/slock/PKGBUILD b/community/slock/PKGBUILD
index b297f6690..b6fbb2ebe 100644
--- a/community/slock/PKGBUILD
+++ b/community/slock/PKGBUILD
@@ -1,9 +1,9 @@
-# $Id: PKGBUILD 64276 2012-02-11 10:23:57Z bluewind $
+# $Id: PKGBUILD 78848 2012-10-25 20:30:11Z spupykin $
# Maintainer: Sergej Pupykin <pupykin.s+arch@gmail.com>
# Contributor: Sebastian A. Liem <sebastian at liem dot se>
pkgname=slock
-pkgver=1.0
+pkgver=1.1
pkgrel=1
pkgdesc="A simple screen locker for X"
arch=('i686' 'x86_64')
@@ -12,7 +12,7 @@ license=('MIT')
depends=('libxext')
source=("http://dl.suckless.org/tools/$pkgname-$pkgver.tar.gz")
#source=("slock-$pkgver.tar.bz2::http://hg.suckless.org/slock/archive/$_pkgver.tar.gz")
-md5sums=('98503f0dae5acc15c90b81ffd423f987')
+md5sums=('e3b25abdfd54c81562de4d63d3565be7')
build() {
cd "$srcdir/slock-$pkgver"
diff --git a/community/spacefm/PKGBUILD b/community/spacefm/PKGBUILD
index 6b51e42a0..561b2ef5b 100644
--- a/community/spacefm/PKGBUILD
+++ b/community/spacefm/PKGBUILD
@@ -1,15 +1,15 @@
-# $Id: PKGBUILD 78679 2012-10-22 19:59:29Z bpiotrowski $
+# $Id: PKGBUILD 78846 2012-10-25 18:08:49Z bpiotrowski $
# Maintainer: Bartłomiej Piotrowski <nospam@bpiotrowski.pl>
# Contributor: IgnorantGuru http://igurublog.wordpress.com/contact-ignorantguru/
# Contributor: ridikulus_rat <the.ridikulus.rat@gmail.com>
pkgname=spacefm
-pkgver=0.8.1
+pkgver=0.8.2
pkgrel=1
pkgdesc='A multi-panel tabbed file manager'
arch=('i686' 'x86_64')
url='http://ignorantguru.github.com/spacefm/'
-license=('GPL2')
+license=('GPL3')
install=$pkgname.install
depends=('gtk2' 'shared-mime-info' 'desktop-file-utils' 'startup-notification' 'udev')
makedepends=('intltool' 'gettext')
@@ -22,7 +22,7 @@ optdepends=('lsof: device processes'
'udisks: mount as non-root user'
'udisks2: mount as non-root user')
source=(https://raw.github.com/IgnorantGuru/spacefm/master/packages/${pkgver}/spacefm-${pkgver}.tar.xz)
-md5sums=('4120611f138b3dd530d8f65319366ba1')
+md5sums=('fbae23404d44a7eea5453217f0102eb7')
build() {
cd $srcdir/$pkgname-$pkgver
diff --git a/community/vdrift/PKGBUILD b/community/vdrift/PKGBUILD
index a5369d307..f30ed8bdb 100644
--- a/community/vdrift/PKGBUILD
+++ b/community/vdrift/PKGBUILD
@@ -1,22 +1,23 @@
-# $Id: PKGBUILD 75820 2012-09-01 20:39:43Z heftig $
+# $Id: PKGBUILD 78854 2012-10-26 01:19:11Z ebelanger $
# Maintainer: Sven-Hendrik Haase <sh@lutzhaase.com>
# Contributor: Anton Bazhenov <anton.bazhenov at gmail>
# Contributor: Lone_Wolf lonewolf@xs4all.nl
pkgname=vdrift
pkgver=2012.07.22
-pkgrel=1
+pkgrel=2
pkgdesc="Open source driving simulation made with drift racing in mind"
arch=('i686' 'x86_64')
url="http://vdrift.net/"
license=('GPL')
-depends=('bullet' 'curl' 'sdl_gfx' 'sdl_image' 'glew' 'libvorbis' 'vdrift-data'
+depends=('bullet' 'curl' 'sdl_gfx' 'sdl_image' 'glew' 'libvorbis' "vdrift-data=2:$pkgver"
'gtk-update-icon-cache' 'hicolor-icon-theme' 'libarchive')
-makedepends=('scons' 'boost' 'asio')
+makedepends=('scons' 'boost' 'asio' 'mesa')
+install=vdrift.install
source=(http://downloads.sourceforge.net/sourceforge/$pkgname/$pkgname-${pkgver//./-}.tar.bz2
- http://downloads.sourceforge.net/sourceforge/$pkgname/$pkgname-${pkgver//./-}c_patch.diff)
+ vdrift-2012-07-22c_bullet281_patch.diff)
md5sums=('fcfd6b65724d32dfe383df216d7afb74'
- '981cd26709f97cdf85100b720290177f')
+ '67ff3037575c3aa74393971d1475ef54')
build() {
cd VDrift
@@ -28,7 +29,7 @@ build() {
_sconsarch="686"
fi
- patch -Np0 < $srcdir/$pkgname-${pkgver//./-}c_patch.diff
+ patch -Np0 < "$srcdir"/vdrift-2012-07-22c_bullet281_patch.diff
# build and install
scons $MAKEFLAGS \
diff --git a/community/vdrift/vdrift-2012-07-22c_bullet281_patch.diff b/community/vdrift/vdrift-2012-07-22c_bullet281_patch.diff
new file mode 100644
index 000000000..c8509ff1b
--- /dev/null
+++ b/community/vdrift/vdrift-2012-07-22c_bullet281_patch.diff
@@ -0,0 +1,898 @@
+--- data/skins/simple/menus/AssignControl Mon Jan 19 23:26:36 1970
++++ data/skins/simple/menus/AssignControl Mon Jan 19 23:26:36 1970
+@@ -46,7 +46,7 @@
+ image = white.png
+ color = 0.172, 0.161, 0.169
+ alpha = 0.7
+-left = 0.2
+-right = 0.2
++left = 0.1
++right = 0.1
+ top = 0.48
+ height = 0.04
+--- data/skins/simple/menus/GuiControls Mon Jan 19 23:26:36 1970
++++ data/skins/simple/menus/GuiControls Mon Jan 19 23:26:36 1970
+@@ -82,7 +82,7 @@
+ onselect = controledit.string:gui_select:0
+ onmoveleft = widget-01d
+ onmoveright = widget-01c
+-onmoveup = widget-13b
++onmoveup = widget-08b
+ onmovedown = widget-02b
+ onfocus = widget-01b.sat:0.56
+ onblur = widget-01b.sat:0.0
+@@ -101,7 +101,7 @@
+ onselect = controledit.string:gui_select:1
+ onmoveleft = widget-01b
+ onmoveright = widget-01d
+-onmoveup = widget-13b
++onmoveup = widget-08b
+ onmovedown = widget-02c
+ onfocus = widget-01c.sat:0.56
+ onblur = widget-01c.sat:0.0
+@@ -120,7 +120,7 @@
+ onselect = controledit.string:gui_select:2
+ onmoveleft = widget-01c
+ onmoveright = widget-01b
+-onmoveup = widget-13b
++onmoveup = widget-08b
+ onmovedown = widget-02d
+ onfocus = widget-01d.sat:0.56
+ onblur = widget-01d.sat:0.0
+--- data/skins/simple/menus/InGameMain Mon Jan 19 23:26:36 1970
++++ data/skins/simple/menus/InGameMain Mon Jan 19 23:26:36 1970
+@@ -44,10 +44,10 @@
+
+
+ [ widget-01 ]
+-text = Return to Game
++text = Continue
+ fontsize = 0.035
+ align = left
+-tip = Leave the menu and unpause the game.
++tip = Leave the menu and continue the game.
+ onselect = ReturnToGame
+ onmoveup = widget-05
+ onmovedown = widget-02
+@@ -72,7 +72,7 @@
+
+
+ [ widget-02 ]
+-text = Restart Game
++text = Restart
+ fontsize = 0.035
+ align = left
+ tip = Restart this game using the same car and track settings.
+@@ -100,7 +100,7 @@
+
+
+ [ widget-03 ]
+-text = Leave Game
++text = Abort
+ fontsize = 0.035
+ align = left
+ tip = Leave game and return to the Main menu.
+--- data/skins/simple/menus/InputDevice Mon Jan 19 23:26:36 1970
++++ data/skins/simple/menus/InputDevice Mon Jan 19 23:26:36 1970
+@@ -82,7 +82,7 @@
+ onselect = joystick.type.prev
+ onmoveleft = joystick.type.prev
+ onmoveright = joystick.type.next
+-onmoveup = widget-13b
++onmoveup = widget-11b
+ onmovedown = widget-02b
+ onfocus = widget-01b.alpha:1 widget-01c.alpha:1 widget-01d.sat:0.56
+ onblur = widget-01b.alpha:0 widget-01c.alpha:0 widget-01d.sat:0.0
+@@ -102,7 +102,7 @@
+ onselect = joystick.type.next
+ onmoveleft = joystick.type.prev
+ onmoveright = joystick.type.next
+-onmoveup = widget-13b
++onmoveup = widget-11b
+ onmovedown = widget-02b
+ onfocus = widget-01b.alpha:1 widget-01c.alpha:1 widget-01d.sat:0.56
+ onblur = widget-01b.alpha:0 widget-01c.alpha:0 widget-01d.sat:0.0
+--- data/skins/simple/menus/SingleRace Mon Jan 19 23:26:36 1970
++++ data/skins/simple/menus/SingleRace Mon Jan 19 23:26:36 1970
+@@ -860,7 +860,7 @@
+ onmoveleft = game.vehicle_damage.prev
+ onmoveright = game.vehicle_damage.next
+ onmoveup = widget-14b
+-onmovedown = widget-16
++onmovedown = widget-16b
+ onfocus = widget-15b.alpha:1 widget-15c.alpha:1 widget-15d.sat:0.56
+ onblur = widget-15b.alpha:0 widget-15c.alpha:0 widget-15d.sat:0.0
+ focus = false
+--- src/camera.h Mon Jan 19 23:26:36 1970
++++ src/camera.h Mon Jan 19 23:26:36 1970
+@@ -16,7 +16,7 @@
+
+ const std::string & GetName() const { return name; }
+
+- void SetFOV(float value) { fov = std::max(40.0f, std::min(160.0f, value)); }
++ void SetFOV(float value) { fov = std::max(0.0f, std::min(120.0f, value)); }
+
+ float GetFOV() const { return fov; }
+
+--- src/carcontrolmap_local.cpp Mon Jan 19 23:26:36 1970
++++ src/carcontrolmap_local.cpp Mon Jan 19 23:26:36 1970
+@@ -830,16 +830,6 @@
+ keycodes["y"] = SDLK_y;
+ keycodes["z"] = SDLK_z;
+ keycodes["DELETE"] = SDLK_DELETE;
+- keycodes["KP0"] = SDLK_KP_0;
+- keycodes["KP1"] = SDLK_KP_1;
+- keycodes["KP2"] = SDLK_KP_2;
+- keycodes["KP3"] = SDLK_KP_3;
+- keycodes["KP4"] = SDLK_KP_4;
+- keycodes["KP5"] = SDLK_KP_5;
+- keycodes["KP6"] = SDLK_KP_6;
+- keycodes["KP7"] = SDLK_KP_7;
+- keycodes["KP8"] = SDLK_KP_8;
+- keycodes["KP9"] = SDLK_KP_9;
+ keycodes["KP_PERIOD"] = SDLK_KP_PERIOD;
+ keycodes["KP_DIVIDE"] = SDLK_KP_DIVIDE;
+ keycodes["KP_MULTIPLY"] = SDLK_KP_MULTIPLY;
+@@ -872,20 +862,50 @@
+ keycodes["F14"] = SDLK_F14;
+ keycodes["F15"] = SDLK_F15;
+ keycodes["MENU"] = SDLK_MENU;
+- keycodes["APPLICATION"] = SDLK_APPLICATION;
+- keycodes["NUMLOCK"] = SDLK_NUMLOCKCLEAR;
+ keycodes["CAPSLOCK"] = SDLK_CAPSLOCK;
+- keycodes["SCROLLLOCK"] = SDLK_SCROLLLOCK;
+ keycodes["RSHIFT"] = SDLK_RSHIFT;
+ keycodes["LSHIFT"] = SDLK_LSHIFT;
+ keycodes["RCTRL"] = SDLK_RCTRL;
+ keycodes["LCTRL"] = SDLK_LCTRL;
+ keycodes["RALT"] = SDLK_RALT;
+ keycodes["LALT"] = SDLK_LALT;
++#if SDL_VERSION_ATLEAST(2,0,0)
++ keycodes["KP0"] = SDLK_KP_0;
++ keycodes["KP1"] = SDLK_KP_1;
++ keycodes["KP2"] = SDLK_KP_2;
++ keycodes["KP3"] = SDLK_KP_3;
++ keycodes["KP4"] = SDLK_KP_4;
++ keycodes["KP5"] = SDLK_KP_5;
++ keycodes["KP6"] = SDLK_KP_6;
++ keycodes["KP7"] = SDLK_KP_7;
++ keycodes["KP8"] = SDLK_KP_8;
++ keycodes["KP9"] = SDLK_KP_9;
++ keycodes["COMPOSE"] = SDLK_APPLICATION;
++ keycodes["NUMLOCK"] = SDLK_NUMLOCKCLEAR;
++ keycodes["SCROLLLOCK"] = SDLK_SCROLLLOCK;
+ keycodes["RMETA"] = SDLK_RGUI;
+ keycodes["LMETA"] = SDLK_LGUI;
+ keycodes["LSUPER"] = SDLK_LGUI;
+ keycodes["RSUPER"] = SDLK_RGUI;
++#else
++ keycodes["KP0"] = SDLK_KP0;
++ keycodes["KP1"] = SDLK_KP1;
++ keycodes["KP2"] = SDLK_KP2;
++ keycodes["KP3"] = SDLK_KP3;
++ keycodes["KP4"] = SDLK_KP4;
++ keycodes["KP5"] = SDLK_KP5;
++ keycodes["KP6"] = SDLK_KP6;
++ keycodes["KP7"] = SDLK_KP7;
++ keycodes["KP8"] = SDLK_KP8;
++ keycodes["KP9"] = SDLK_KP9;
++ keycodes["COMPOSE"] = SDLK_COMPOSE;
++ keycodes["NUMLOCK"] = SDLK_NUMLOCK;
++ keycodes["SCROLLLOCK"] = SDLK_SCROLLOCK;
++ keycodes["LMETA"] = SDLK_LMETA;
++ keycodes["RMETA"] = SDLK_RMETA;
++ keycodes["LSUPER"] = SDLK_LSUPER;
++ keycodes["RSUPER"] = SDLK_RSUPER;
++#endif
+ return keycodes;
+ }
+
+--- src/game.cpp Mon Jan 19 23:26:36 1970
++++ src/game.cpp Mon Jan 19 23:26:36 1970
+@@ -324,10 +324,6 @@
+
+ info_output << "Shutting down..." << std::endl;
+
+- // Stop the sound thread.
+- if (sound.Enabled())
+- sound.Pause(true);
+-
+ LeaveGame();
+
+ // Save settings first incase later deinits cause crashes.
+@@ -499,16 +495,7 @@
+ }
+
+ // Connect game actions to gui options
+- set_car_name.connect(gui.GetOption("game.car").signal_val);
+- set_car_paint.connect(gui.GetOption("game.car_paint").signal_val);
+- set_car_color_hue.connect(gui.GetOption("game.car_color_hue").signal_val);
+- set_car_color_sat.connect(gui.GetOption("game.car_color_sat").signal_val);
+- set_car_color_val.connect(gui.GetOption("game.car_color_val").signal_val);
+- set_car_ai_type.connect(gui.GetOption("game.ai_type").signal_val);
+- set_car_ai_level.connect(gui.GetOption("game.ai_level").signal_val);
+- set_cars_num.connect(gui.GetOption("game.cars_num").signal_val);
+- set_track_image.connect(gui.GetOption("game.track").signal_val);
+- set_control.connect(gui.GetOption("controledit.string").signal_val);
++ BindActionsToGUI();
+
+ // Set options from game settings.
+ std::map<std::string, std::string> optionmap;
+@@ -531,7 +518,6 @@
+ if (sound.Init(2048, info_output, error_output))
+ {
+ sound.SetVolume(settings.GetSoundVolume());
+- //sound.Pause(false);
+ content.setSound(sound.GetDeviceInfo());
+ }
+ else
+@@ -932,22 +918,18 @@
+ if (sound.Enabled())
+ {
+ bool pause_sound = pause || gui.Active();
+- sound.Pause(pause_sound);
+- if (!pause_sound)
+- {
+- PROFILER.beginBlock("sound");
+- MATHVECTOR <float, 3> pos;
+- QUATERNION <float> rot;
+- if (active_camera)
+- {
+- pos = active_camera->GetPosition();
+- rot = active_camera->GetOrientation();
+- }
+- sound.SetListenerPosition(pos[0], pos[1], pos[2]);
+- sound.SetListenerRotation(rot[0], rot[1], rot[2], rot[3]);
+- sound.Update();
+- PROFILER.endBlock("sound");
+- }
++ PROFILER.beginBlock("sound");
++ MATHVECTOR <float, 3> pos;
++ QUATERNION <float> rot;
++ if (active_camera)
++ {
++ pos = active_camera->GetPosition();
++ rot = active_camera->GetOrientation();
++ }
++ sound.SetListenerPosition(pos[0], pos[1], pos[2]);
++ sound.SetListenerRotation(rot[0], rot[1], rot[2], rot[3]);
++ sound.Update(pause_sound);
++ PROFILER.endBlock("sound");
+ }
+
+ //PROFILER.beginBlock("force-feedback");
+@@ -1798,9 +1780,12 @@
+ // get car start position marker for camera setup
+ MATHVECTOR<float, 3> car_pos = track.GetStart(0).first;
+
+- // car setup
++ // clear previous car
+ cars.clear();
+
++ // remove previous car sounds
++ sound.Update(true);
++
+ if (LoadCar(
+ cars_name[car_edit_id],
+ cars_paint[car_edit_id],
+@@ -1808,14 +1793,13 @@
+ car_pos, track.GetStart(0).second,
+ true, false))
+ {
+- // update car
++ // set car
+ CAR & car = cars.back();
+ dynamics.update(timestep);
+ car.Update(timestep);
+
+- // process car sound sources
+- // should they be loaded for garage car in the first place?
+- sound.Update();
++ // add car sounds
++ sound.Update(true);
+
+ // use car shape center for camera setup
+ car_pos = car.GetPosition();
+@@ -1958,7 +1942,7 @@
+ }
+
+ if (numreplays == 0)
+- replaylist.push_back(std::make_pair("", "None"));
++ replaylist.push_back(std::make_pair("none", "None"));
+
+ settings.SetSelectedReplay(replaylist.begin()->first);
+ }
+@@ -2411,6 +2395,7 @@
+
+ track.Clear();
+ cars.clear();
++ sound.Update(true);
+ hud.SetVisible(false);
+ inputgraph.Hide();
+ trackmap.Unload();
+@@ -2419,7 +2404,6 @@
+ pause = false;
+ race_laps = 0;
+ tire_smoke.Clear();
+- sound.Update();
+ }
+
+ void GAME::StartPractice()
+@@ -2473,7 +2457,7 @@
+
+ void GAME::StartReplay()
+ {
+- if (!settings.GetSelectedReplay().empty() && !NewGame(true))
++ if (settings.GetSelectedReplay() != "none" && !NewGame(true))
+ {
+ gui.ActivatePage("ReplayStartError", 0.25, error_output);
+ }
+@@ -2855,6 +2839,19 @@
+ EditControl();
+ }
+
++void GAME::BindActionsToGUI()
++{
++ set_car_name.connect(gui.GetOption("game.car").signal_val);
++ set_car_paint.connect(gui.GetOption("game.car_paint").signal_val);
++ set_car_color_hue.connect(gui.GetOption("game.car_color_hue").signal_val);
++ set_car_color_sat.connect(gui.GetOption("game.car_color_sat").signal_val);
++ set_car_color_val.connect(gui.GetOption("game.car_color_val").signal_val);
++ set_car_ai_type.connect(gui.GetOption("game.ai_type").signal_val);
++ set_car_ai_level.connect(gui.GetOption("game.ai_level").signal_val);
++ set_cars_num.connect(gui.GetOption("game.cars_num").signal_val);
++ set_track_image.connect(gui.GetOption("game.track").signal_val);
++ set_control.connect(gui.GetOption("controledit.string").signal_val);
++}
+
+ void GAME::RegisterActions()
+ {
+--- src/game.h Mon Jan 19 23:26:36 1970
++++ src/game.h Mon Jan 19 23:26:36 1970
+@@ -201,6 +201,7 @@
+ void SetTrackImage(const std::string & value);
+ void SetControl(const std::string & value);
+
++ void BindActionsToGUI();
+ void RegisterActions();
+ void InitActionMap(std::map<std::string, Slot0*> & actionmap);
+
+--- src/sound.cpp Mon Jan 19 23:26:36 1970
++++ src/sound.cpp Mon Jan 19 23:26:36 1970
+@@ -30,17 +30,20 @@
+ }
+
+ SOUND::SOUND() :
++ log_error(0),
+ deviceinfo(0, 0, 0, 0),
++ sound_volume(0),
+ initdone(false),
+ disable(false),
+- paused(true),
+ sampler_lock(0),
+ source_lock(0),
++ set_pause(true),
+ max_active_sources(64),
+ sources_num(0),
+- samplers_num(0)
++ sources_pause(true),
++ samplers_num(0),
++ samplers_pause(true)
+ {
+- volume_filter.SetFilterOrder0(1.0);
+ sources.reserve(64);
+ samplers.reserve(64);
+ }
+@@ -115,11 +118,13 @@
+ }
+
+ deviceinfo = SOUNDINFO(samples, frequency, channels, bytespersample);
+-
++ log_error = &error_output;
+ initdone = true;
+-
+ SetVolume(1.0);
+
++ // enable sound, run callback
++ SDL_PauseAudio(false);
++
+ return true;
+ }
+
+@@ -138,46 +143,21 @@
+ disable = true;
+ }
+
+-void SOUND::Pause(bool value)
+-{
+- if (paused != value)
+- {
+- SDL_PauseAudio(value);
+- paused = value;
+- }
+-}
+-
+-void SOUND::Update()
++void SOUND::Update(bool pause)
+ {
+ if (disable) return;
+
++ set_pause = pause;
++
+ GetSourceChanges();
+
+ ProcessSourceStop();
+
+- ProcessSourceRemove();
+-
+ ProcessSources();
+
+- SetSamplerChanges();
+-
+- // short circuit if paused(sound thread blocked)
+- if (paused)
+- {
+- GetSamplerChanges();
+-
+- ProcessSamplerAdd();
+-
+- ProcessSamplerRemove();
+-
+- SetSourceChanges();
+-
+- GetSourceChanges();
+-
+- ProcessSourceStop();
++ ProcessSourceRemove();
+
+- ProcessSourceRemove();
+- }
++ SetSamplerChanges();
+ }
+
+ void SOUND::SetMaxActiveSources(size_t value)
+@@ -192,18 +172,24 @@
+ size_t id = item_num;
+ if (id < items.size())
+ {
++ // reuse free slot
+ size_t idn = items[id].id;
+ if (idn != id)
+ {
+- // swap back redirected item
++ // free slot is redirecting to other item
+ assert(idn < id);
++
++ // swap redirected item back
+ items[id] = items[idn];
++
++ // use now free slot
+ id = idn;
+ }
+ items[id] = item;
+ }
+ else
+ {
++ // add item to new slot
+ items.push_back(item);
+ }
+ items[id].id = id;
+@@ -217,9 +203,14 @@
+ inline void RemoveItem(size_t id, std::vector<T> & items, size_t & item_num)
+ {
+ assert(id < items.size());
++
++ // get item true id
+ size_t idn = items[id].id;
+ assert(idn < item_num);
++
++ // pop last item
+ --item_num;
++
+ // swap last item with current
+ size_t idl = items[item_num].id;
+ if (idl != item_num)
+@@ -270,14 +261,13 @@
+ ns.id = -1;
+ sampler_add.getFirst().push_back(ns);
+
+- //std::cout << "Add sound source: " << id << " " << buffer->GetName() << std::endl;
++ //*log_error << "Add sound source: " << id << " " << buffer->GetName() << std::endl;
+ return id;
+ }
+
+ void SOUND::RemoveSource(size_t id)
+ {
+- // notify sound thread, it will notify main thread to remove the source
+- //std::cout << "To be removed source: " << id << " " << sources[sources[id].id].buffer->GetName() << std::endl;
++ // notify sound and main thread to remove the source/sampler
+ sampler_remove.getFirst().push_back(id);
+ }
+
+@@ -343,14 +333,13 @@
+
+ void SOUND::SetVolume(float value)
+ {
+- volume_filter.SetFilterOrder0(clamp(value, 0.f, 1.f));
++ sound_volume = value;
+ }
+
+ void SOUND::GetSourceChanges()
+ {
+ Lock(source_lock);
+ source_stop.swapFirst();
+- source_remove.swapFirst();
+ Unlock(source_lock);
+ }
+
+@@ -368,17 +357,18 @@
+
+ void SOUND::ProcessSourceRemove()
+ {
+- std::vector<size_t> & sremove = source_remove.getFirst();
++ std::vector<size_t> & sremove = sampler_remove.getFirst();
+ for (size_t i = 0; i < sremove.size(); ++i)
+ {
+ size_t id = sremove[i];
+ assert(id < sources.size());
++
+ size_t idn = sources[id].id;
+ assert(idn < sources_num);
+- //std::cout << "Remove sound source: " << id << " " << sources[idn].buffer->GetName() << std::endl;
++ //*log_error << "Remove sound source: " << id << " " << sources[idn].buffer->GetName() << std::endl;
++
+ RemoveItem(id, sources, sources_num);
+ }
+- sremove.clear();
+ }
+
+ void SOUND::ProcessSources()
+@@ -436,8 +426,11 @@
+ }
+ }
+
+- supdate[i].gain1 = gain1 * Sampler::denom;
+- supdate[i].gain2 = gain2 * Sampler::denom;
++ // fade sound volume
++ float volume = set_pause ? 0 : sound_volume;
++
++ supdate[i].gain1 = volume * gain1 * Sampler::denom;
++ supdate[i].gain2 = volume * gain2 * Sampler::denom;
+ supdate[i].pitch = src.pitch * Sampler::denom;
+ }
+
+@@ -471,6 +464,7 @@
+ if (sampler_update.getFirst().size()) sampler_update.swapFirst();
+ if (sampler_add.getFirst().size()) sampler_add.swapFirst();
+ if (sampler_remove.getFirst().size()) sampler_remove.swapFirst();
++ sources_pause = set_pause;
+ Unlock(sampler_lock);
+ }
+
+@@ -478,33 +472,41 @@
+ {
+ Lock(sampler_lock);
+ sampler_update.swapLast();
+- sampler_remove.swapLast();
+ sampler_add.swapLast();
++ sampler_remove.swapLast();
++ samplers_fade = samplers_pause != sources_pause;
++ samplers_pause = sources_pause;
+ Unlock(sampler_lock);
+ }
+
+ void SOUND::ProcessSamplerUpdate()
+ {
+ std::vector<SamplerUpdate> & supdate = sampler_update.getLast();
+- if (samplers_num == supdate.size())
++ if (supdate.empty()) return;
++
++ assert(samplers_num == supdate.size());
++ for (size_t i = 0; i < samplers_num; ++i)
+ {
+- for (size_t i = 0; i < samplers_num; ++i)
+- {
+- samplers[i].gain1 = supdate[i].gain1;
+- samplers[i].gain2 = supdate[i].gain2;
+- samplers[i].pitch = supdate[i].pitch;
+- }
++ samplers[i].gain1 = supdate[i].gain1;
++ samplers[i].gain2 = supdate[i].gain2;
++ samplers[i].pitch = supdate[i].pitch;
+ }
+ supdate.clear();
+ }
+
+ void SOUND::ProcessSamplers(unsigned char *stream, int len)
+ {
+- // set buffers and clear stream
++ // clear stream
++ memset(stream, 0, len);
++
++ // pause sampling
++ if (samplers_pause && !samplers_fade)
++ return;
++
++ // init sampling buffers
+ int len4 = len / 4;
+ buffer1.resize(len4);
+ buffer2.resize(len4);
+- memset(stream, 0, len);
+
+ // run samplers
+ short * sstream = (short*)stream;
+@@ -519,13 +521,17 @@
+ {
+ SampleAndAdvanceWithPitch16bit(smp, &buffer1[0], &buffer2[0], len4);
+
+- volume_filter.Filter(&buffer1[0], &buffer2[0], len4);
+-
+ for (int n = 0; n < len4; ++n)
+ {
+ int pos = n * 2;
+- sstream[pos] = clamp(sstream[pos] + buffer1[n], -32768, 32767);
+- sstream[pos + 1] = clamp(sstream[pos + 1] + buffer2[n], -32768, 32767);
++ int val1 = sstream[pos] + buffer1[n];
++ int val2 = sstream[pos + 1] + buffer2[n];
++
++ val1 = clamp(val1, -32768, 32767);
++ val2 = clamp(val2, -32768, 32767);
++
++ sstream[pos] = val1;
++ sstream[pos + 1] = val2;
+ }
+ }
+ else
+@@ -541,17 +547,13 @@
+ void SOUND::ProcessSamplerRemove()
+ {
+ std::vector<size_t> & sremove = sampler_remove.getLast();
+- if (!sremove.empty())
++ for (size_t i = 0; i < sremove.size(); ++i)
+ {
+- for (size_t i = 0; i < sremove.size(); ++i)
+- {
+- size_t id = sremove[i];
+- assert(id < samplers.size());
+- RemoveItem(id, samplers, samplers_num);
+- }
+- source_remove.getLast() = sremove;
+- sremove.clear();
++ size_t id = sremove[i];
++ assert(id < samplers.size());
++ RemoveItem(id, samplers, samplers_num);
+ }
++ sremove.clear();
+ }
+
+ void SOUND::ProcessSamplerAdd()
+@@ -589,7 +591,6 @@
+ {
+ Lock(source_lock);
+ if (source_stop.getLast().size()) source_stop.swapLast();
+- if (source_remove.getLast().size()) source_remove.swapLast();
+ Unlock(source_lock);
+ }
+
+@@ -600,12 +601,12 @@
+
+ GetSamplerChanges();
+
++ ProcessSamplerAdd();
++
+ ProcessSamplerUpdate();
+
+ ProcessSamplers(stream, len);
+
+- ProcessSamplerAdd();
+-
+ ProcessSamplerRemove();
+
+ SetSourceChanges();
+@@ -622,9 +623,10 @@
+ assert(len > 0);
+ assert(sampler.buffer);
+
+- // if not playing, fill output buffers with silence, should not happen
++ // if not playing, fill output buffers with silence
+ if (!sampler.playing)
+ {
++ // should be dealt with before getting here
+ assert(0);
+ for (int i = 0; i < len; ++i)
+ {
+--- src/sound.h Mon Jan 19 23:26:36 1970
++++ src/sound.h Mon Jan 19 23:26:36 1970
+@@ -33,11 +33,8 @@
+ // disable sound
+ void Disable();
+
+- // pause sound
+- void Pause(bool value);
+-
+ // commit state changes
+- void Update();
++ void Update(bool pause);
+
+ // active sources limit can be adjusted at runtime
+ void SetMaxActiveSources(size_t value);
+@@ -69,14 +66,14 @@
+ void SetVolume(float value);
+
+ private:
++ std::ostream * log_error;
+ SOUNDINFO deviceinfo;
+- SOUNDFILTER volume_filter;
+ MATHVECTOR<float, 3> listener_pos;
+ MATHVECTOR<float, 3> listener_vel;
+ QUATERNION<float> listener_rot;
++ float sound_volume;
+ bool initdone;
+ bool disable;
+- bool paused;
+
+ // state structs
+ struct Source
+@@ -95,8 +92,8 @@
+
+ struct Sampler
+ {
+- static const int denom = 1 << 15;
+- static const int max_gain_delta = (denom * 100) / 44100;
++ static const int denom = 32768;
++ static const int max_gain_delta = (denom * 173) / 44100; // 256 samples from min to max gain
+ const SOUNDBUFFER * buffer;
+ int samples_per_channel;
+ int sample_pos;
+@@ -135,21 +132,24 @@
+ TrippleBuffer<SamplerUpdate> sampler_update;
+ TrippleBuffer<SamplerAdd> sampler_add;
+ TrippleBuffer<size_t> sampler_remove;
+- TrippleBuffer<size_t> source_remove;
+ TrippleBuffer<size_t> source_stop;
+ SDL_mutex * sampler_lock;
+ SDL_mutex * source_lock;
++ bool set_pause;
+
+ // sound sources state
+ std::vector<SourceActive> sources_active;
+ std::vector<Source> sources;
+ size_t max_active_sources;
+ size_t sources_num;
++ bool sources_pause;
+
+ // sound thread state
+ std::vector<int> buffer1, buffer2;
+ std::vector<Sampler> samplers;
+ size_t samplers_num;
++ bool samplers_pause;
++ bool samplers_fade;
+
+ // main thread methods
+ void GetSourceChanges();
+--- src/texture.cpp Mon Jan 19 23:26:36 1970
++++ src/texture.cpp Mon Jan 19 23:26:36 1970
+@@ -179,6 +179,7 @@
+ else
+ {
+ error << "Error loading texture file: " + path << std::endl;
++ error << IMG_GetError();
+ return false;
+ }
+
+@@ -303,6 +304,7 @@
+ else
+ {
+ error << "Error loading texture file: " + path + " (" + cubefiles[i] + ")" << std::endl;
++ error << IMG_GetError();
+ return false;
+ }
+
+@@ -477,6 +479,7 @@
+ if (!orig_surface)
+ {
+ error << "Error loading texture file: " << path << std::endl;
++ error << IMG_GetError();
+ return false;
+ }
+ }
+--- src/cardynamics.cpp Mon Jan 19 23:26:36 1970
++++ src/cardynamics.cpp Mon Jan 19 23:26:36 1970
+@@ -1791,23 +1791,29 @@
+
+ bool CARDYNAMICS::WheelContactCallback(
+ btManifoldPoint& cp,
+- const btCollisionObject* colObj0,
+- int partId0,
++ const btCollisionObjectWrapper* col0,
++ int part0,
+ int index0,
+- const btCollisionObject* colObj1,
+- int partId1,
++ const btCollisionObjectWrapper* col1,
++ int part1,
+ int index1)
+ {
+- // cars are fracture bodies, wheel is a cylinder shape
+- const btCollisionShape* shape = colObj0->getCollisionShape();
+- if ((colObj0->getInternalType() & CO_FRACTURE_TYPE) &&
++#if (BT_BULLET_VERSION < 281)
++ const btCollisionObject* obj = col0;
++ const btCollisionShape* shape = obj->getCollisionShape();
++ const btCollisionShape* rootshape = obj->getRootCollisionShape();
++#else
++ const btCollisionObject* obj = col0->getCollisionObject();
++ const btCollisionShape* shape = col0->getCollisionShape();
++ const btCollisionShape* rootshape = obj->getCollisionShape();
++#endif
++ if ((obj->getInternalType() & CO_FRACTURE_TYPE) &&
+ (shape->getShapeType() == CYLINDER_SHAPE_PROXYTYPE))
+ {
+- // is contact within contact patch?
+- const btCompoundShape* car = static_cast<const btCompoundShape*>(colObj0->getRootCollisionShape());
+- const btCylinderShapeX* wheel = static_cast<const btCylinderShapeX*>(shape);
+- btVector3 contactPoint = cp.m_localPointA - car->getChildTransform(cp.m_index0).getOrigin();
+- if (-direction::up.dot(contactPoint) > 0.5 * wheel->getRadius())
++ const btCompoundShape* carshape = static_cast<const btCompoundShape*>(rootshape);
++ const btCylinderShapeX* wheelshape = static_cast<const btCylinderShapeX*>(shape);
++ btVector3 contactPoint = cp.m_localPointA - carshape->getChildTransform(cp.m_index0).getOrigin();
++ if (-direction::up.dot(contactPoint) > 0.5 * wheelshape->getRadius())
+ {
+ // break contact (hack)
+ cp.m_normalWorldOnB = btVector3(0, 0, 0);
+--- src/cardynamics.h Mon Jan 19 23:26:36 1970
++++ src/cardynamics.h Mon Jan 19 23:26:36 1970
+@@ -25,6 +25,12 @@
+ class FractureBody;
+ class PTree;
+
++#if (BT_BULLET_VERSION < 281)
++#define btCollisionObjectWrapper btCollisionObject
++#else
++struct btCollisionObjectWrapper;
++#endif
++
+ class CARDYNAMICS : public btActionInterface
+ {
+ friend class PERFORMANCE_TESTING;
+@@ -151,11 +157,11 @@
+
+ static bool WheelContactCallback(
+ btManifoldPoint& cp,
+- const btCollisionObject* colObj0,
+- int partId0,
++ const btCollisionObjectWrapper* col0,
++ int part0,
+ int index0,
+- const btCollisionObject* colObj1,
+- int partId1,
++ const btCollisionObjectWrapper* col1,
++ int part1,
+ int index1);
+
+ protected:
+--- src/dynamicsworld.cpp Mon Jan 19 23:26:36 1970
++++ src/dynamicsworld.cpp Mon Jan 19 23:26:36 1970
+@@ -105,7 +105,7 @@
+ int patch_id = -1;
+ const BEZIER * b = 0;
+ const TRACKSURFACE * s = TRACKSURFACE::None();
+- btCollisionObject * c = 0;
++ const btCollisionObject * c = 0;
+
+ MyRayResultCallback ray(origin, p, caster);
+ rayTest(origin, p, ray);
+@@ -221,6 +221,7 @@
+
+ void DynamicsWorld::fractureCallback()
+ {
++#if (BT_BULLET_VERSION < 281)
+ m_activeConnections.resize(0);
+
+ int numManifolds = getDispatcher()->getNumManifolds();
+@@ -268,4 +269,5 @@
+ btRigidBody* child = body->updateConnection(con_id);
+ if (child) addRigidBody(child);
+ }
++#endif
+ }
diff --git a/core/bison/PKGBUILD b/core/bison/PKGBUILD
index 0294d30f4..df8dad3df 100644
--- a/core/bison/PKGBUILD
+++ b/core/bison/PKGBUILD
@@ -1,9 +1,9 @@
-# $Id: PKGBUILD 164809 2012-08-06 13:29:10Z allan $
+# $Id: PKGBUILD 169690 2012-10-26 01:40:06Z allan $
# Maintainer: Allan McRae <allan@archlinux.org>
# Contributor: Eric Belanger <eric@archlinux.org>
pkgname=bison
-pkgver=2.6.2
+pkgver=2.6.4
pkgrel=1
pkgdesc="The GNU general-purpose parser generator"
arch=('i686' 'x86_64')
@@ -13,8 +13,8 @@ depends=('glibc' 'm4' 'sh')
groups=('base-devel')
install=bison.install
source=(ftp://ftp.gnu.org/gnu/bison/${pkgname}-${pkgver}.tar.xz{,.sig})
-md5sums=('dea291996f98c34c3fd8e389a9cf6ea1'
- 'e6d78e6423e9e29f3b6c5deee839b41c')
+md5sums=('8b2dc57eb9d2d6de4715d30de6b2ee07'
+ '89b9f75a9aa1b02418fef0e685bd44f2')
build() {
cd ${srcdir}/${pkgname}-${pkgver}
diff --git a/core/coreutils/PKGBUILD b/core/coreutils/PKGBUILD
index 58454c747..82fb6beb8 100644
--- a/core/coreutils/PKGBUILD
+++ b/core/coreutils/PKGBUILD
@@ -1,9 +1,9 @@
-# $Id: PKGBUILD 166962 2012-09-23 12:22:15Z tomegun $
+# $Id: PKGBUILD 169689 2012-10-26 01:40:04Z allan $
# Maintainer: Allan McRae <allan@archlinux.org>
# Contributor: judd <jvinet@zeroflux.org>
pkgname=coreutils
-pkgver=8.19
+pkgver=8.20
pkgrel=1
pkgdesc="The basic file, shell and text manipulation utilities of the GNU operating system"
arch=('i686' 'x86_64')
@@ -13,8 +13,8 @@ groups=('base')
depends=('glibc' 'pam' 'acl' 'gmp' 'libcap')
install=${pkgname}.install
source=(ftp://ftp.gnu.org/gnu/$pkgname/$pkgname-$pkgver.tar.xz{,.sig})
-md5sums=('1a01231a2f3ed37c0efc073ccdda9375'
- '7f564749d834397aa67f0f05bacb62d5')
+md5sums=('3d69af8f561fce512538a9fe85f147ff'
+ '7e6076e4e0961d24c38cf8685efca35b')
build() {
cd ${srcdir}/${pkgname}-${pkgver}
diff --git a/core/cryptsetup/PKGBUILD b/core/cryptsetup/PKGBUILD
index 27c7591c2..b1623ed81 100644
--- a/core/cryptsetup/PKGBUILD
+++ b/core/cryptsetup/PKGBUILD
@@ -1,8 +1,8 @@
-# $Id: PKGBUILD 165243 2012-08-14 08:44:57Z thomas $
+# $Id: PKGBUILD 169687 2012-10-26 01:36:12Z dreisner $
# Maintainer: Thomas Bächler <thomas@archlinux.org>
pkgname=cryptsetup
-pkgver=1.5.0
-pkgrel=2
+pkgver=1.5.1
+pkgrel=1
pkgdesc="Userspace setup tool for transparent encryption of block devices using dm-crypt"
arch=(i686 x86_64)
license=('GPL')
@@ -14,6 +14,10 @@ source=(http://cryptsetup.googlecode.com/files/${pkgname}-${pkgver}.tar.bz2
http://cryptsetup.googlecode.com/files/${pkgname}-${pkgver}.tar.bz2.asc
encrypt_hook
encrypt_install)
+md5sums=('87cc018c0c65f36043f38ceb8ffd4d81'
+ '5f711687f453f4d5a38596f60df5247a'
+ 'c970831d733ca42e20415005967e7843'
+ '21c45f9cab3e0b5165f68358884fbd0f')
build() {
cd "${srcdir}"/$pkgname-${pkgver}
@@ -28,7 +32,3 @@ package() {
install -D -m644 "${srcdir}"/encrypt_hook "${pkgdir}"/usr/lib/initcpio/hooks/encrypt
install -D -m644 "${srcdir}"/encrypt_install "${pkgdir}"/usr/lib/initcpio/install/encrypt
}
-md5sums=('0fa7ba8923b0ce8eed2aa65f2cb9950c'
- 'efe1b74dfadf37726397fd27ad0df965'
- '4dab1b0e23d81907b79b49c2d8d719b5'
- '21c45f9cab3e0b5165f68358884fbd0f')
diff --git a/core/cryptsetup/encrypt_hook b/core/cryptsetup/encrypt_hook
index 372b7ba57..11db3443a 100644
--- a/core/cryptsetup/encrypt_hook
+++ b/core/cryptsetup/encrypt_hook
@@ -11,7 +11,9 @@ run_hook() {
$cryptkey
EOF
- if resolved=$(resolve_device "${ckdev}" ${rootdelay}); then
+ if [ "$ckdev" = "rootfs" ]; then
+ ckeyfile=$ckarg1
+ elif resolved=$(resolve_device "${ckdev}" ${rootdelay}); then
case ${ckarg1} in
*[!0-9]*)
# Use a file on the device
@@ -50,7 +52,6 @@ EOF
for cryptopt in ${cryptoptions//,/ }; do
case ${cryptopt} in
allow-discards)
- echo "Enabling TRIM/discard support."
cryptargs="${cryptargs} --allow-discards"
;;
*)
diff --git a/core/libusb-compat/PKGBUILD b/core/libusb-compat/PKGBUILD
index 76b8f05a0..3e6e5f39b 100644
--- a/core/libusb-compat/PKGBUILD
+++ b/core/libusb-compat/PKGBUILD
@@ -1,4 +1,4 @@
-# $Id: PKGBUILD 162998 2012-07-05 06:50:21Z tpowa $
+# $Id: PKGBUILD 169660 2012-10-25 08:23:04Z eric $
# Maintainer:
# Contributor: Tobias Powalowski <tpowa@archlinux.org>
# Contributor: arjan <arjan@archlinux.org>
@@ -12,15 +12,11 @@ url="http://libusb.sourceforge.net/"
license=('LGPL')
depends=('libusb' 'sh')
options=('!libtool')
-source=("http://downloads.sourceforge.net/${pkgname%-*}/${pkgname}-${pkgver%.*}/$pkgname-$pkgver/${pkgname}-${pkgver}.tar.bz2"
- "libusb-0.1-libusbx.patch")
-md5sums=('2ca521fffadd0c28fdf174e6ec73865b'
- '1612c3982f307da1332d6db57b16742b')
+source=("http://downloads.sourceforge.net/${pkgname%-*}/${pkgname}-${pkgver%.*}/$pkgname-$pkgver/${pkgname}-${pkgver}.tar.bz2")
+md5sums=('2ca521fffadd0c28fdf174e6ec73865b')
build() {
cd "${srcdir}/${pkgname}-${pkgver}"
- # http://libusb.org/ticket/138 can be removed with libusbx 1.0.13
- patch -Np0 -i ../libusb-0.1-libusbx.patch
./configure --prefix=/usr --disable-static
make
}
diff --git a/core/nss-myhostname/PKGBUILD b/core/nss-myhostname/PKGBUILD
new file mode 100644
index 000000000..b07e30808
--- /dev/null
+++ b/core/nss-myhostname/PKGBUILD
@@ -0,0 +1,30 @@
+# $Id: PKGBUILD 169661 2012-10-25 10:06:26Z tomegun $
+# Maintainer: Tom Gundersen <teg@jklm.no>
+# Contributor: Mantas M. <grawity@gmail.com>
+pkgname="nss-myhostname"
+pkgver=0.3
+pkgrel=3
+pkgdesc="NSS plugin providing host name resolution for the locally configured system hostname"
+arch=(i686 x86_64)
+url="http://0pointer.de/lennart/projects/nss-myhostname/"
+license=('LGPL2.1')
+depends=('glibc')
+groups=('base')
+source=("http://0pointer.de/lennart/projects/${pkgname}/${pkgname}-${pkgver}.tar.gz")
+
+build() {
+ cd "${srcdir}/${pkgname}-${pkgver}"
+ ./configure \
+ --prefix=/usr \
+ --sysconfdir=/etc \
+ --localstatedir=/var \
+ --disable-lynx
+ make
+}
+
+package() {
+ cd "$srcdir/${pkgname}-${pkgver}"
+ make DESTDIR="${pkgdir}" install
+}
+
+md5sums=('d4ab9ac36c053ab8fb836db1cbd4a48f')
diff --git a/core/systemd/PKGBUILD b/core/systemd/PKGBUILD
index 073d99b15..cce4b8e44 100644
--- a/core/systemd/PKGBUILD
+++ b/core/systemd/PKGBUILD
@@ -3,8 +3,8 @@
pkgbase=systemd
pkgname=('systemd' 'systemd-sysvcompat')
-pkgver=194
-pkgrel=4
+pkgver=195
+pkgrel=2
arch=('i686' 'x86_64')
url="http://www.freedesktop.org/wiki/Software/systemd"
license=('GPL2' 'LGPL2.1' 'MIT')
@@ -18,7 +18,7 @@ source=("http://www.freedesktop.org/software/$pkgname/$pkgname-$pkgver.tar.xz"
'initcpio-install-timestamp'
'0001-Reinstate-TIMEOUT-handling.patch'
'use-split-usr-path.patch')
-md5sums=('0ebb73aea444693b9b86f7a76f5df23c'
+md5sums=('38e8c8144e7e6e5bc3ce32eb4260e680'
'e99e9189aa2f6084ac28b8ddf605aeb8'
'fb37e34ea006c79be1c54cbb0f803414'
'df69615503ad293c9ddf9d8b7755282d'
@@ -86,10 +86,12 @@ package_systemd() {
install -dm755 "$pkgdir/bin"
ln -s ../usr/lib/systemd/systemd "$pkgdir/bin/systemd"
- # move bash-completion and symlink for loginctl
+ # move bash-completion and symlink for *ctl's
install -Dm644 "$pkgdir/etc/bash_completion.d/systemd-bash-completion.sh" \
"$pkgdir/usr/share/bash-completion/completions/systemctl"
- ln -s systemctl "$pkgdir/usr/share/bash-completion/completions/loginctl"
+ for ctl in {login,journal,timedate,locale,hostname}ctl; do
+ ln -s systemctl "$pkgdir/usr/share/bash-completion/completions/$ctl"
+ done
rm -rf "$pkgdir/etc/bash_completion.d"
# don't write units to /etc by default -- we'll enable this on post_install
diff --git a/core/systemd/systemd.install b/core/systemd/systemd.install
index fa3e8f29a..aad9691b0 100644
--- a/core/systemd/systemd.install
+++ b/core/systemd/systemd.install
@@ -4,18 +4,28 @@ sd_booted() {
[ -e sys/fs/cgroup/systemd ]
}
+post_common() {
+ systemd-machine-id-setup
+
+ setcap cap_dac_override,cap_sys_ptrace+ep usr/bin/systemd-detect-virt
+
+ if sd_booted; then
+ systemctl --system daemon-reexec
+ fi
+}
+
post_install() {
+ post_common
+
# enable getty@tty1 by default, but don't track the file
systemctl enable getty@.service
- systemd-machine-id-setup
-
echo ":: Append 'init=/bin/systemd' to your kernel command line in your"
echo " bootloader to replace sysvinit with systemd"
}
post_upgrade() {
- systemd-machine-id-setup
+ post_common
# getty@tty1.service is no longer enabled by default, but we don't want to break
# existing setups.
@@ -29,6 +39,14 @@ post_upgrade() {
printf '==> journald now writes to /var/log/journal by default. This can be\n'
printf ' controlled with the Storage setting in /etc/systemd/journald.conf\n'
fi
+
+ # logind's protocol changed. kindly restart the daemon to avoid locking
+ # out further logins.
+ if [ "$(vercmp 195 "$2")" -eq 1 ]; then
+ if sd_booted; then
+ systemctl restart systemd-logind.service
+ fi
+ fi
}
# vim:set ts=2 sw=2 et:
diff --git a/extra/physfs/PKGBUILD b/extra/physfs/PKGBUILD
index e6c9575c6..85cbf0fcf 100644
--- a/extra/physfs/PKGBUILD
+++ b/extra/physfs/PKGBUILD
@@ -2,23 +2,19 @@
# Maintainer: Eric Bélanger <eric@archlinux.org>
pkgname=physfs
-pkgver=2.0.2
-pkgrel=2
+pkgver=2.0.3
+pkgrel=1
pkgdesc="A library to provide abstract access to various archives"
arch=('i686' 'x86_64')
url="http://icculus.org/physfs/"
license=('ZLIB')
depends=('zlib')
makedepends=('cmake' 'doxygen')
-options=('!makeflags')
-source=(http://icculus.org/physfs/downloads/${pkgname}-${pkgver}.tar.gz)
-sha1sums=('2d3d3cc819ad26542d34451f44050b85635344d0')
+source=(http://icculus.org/physfs/downloads/${pkgname}-${pkgver}.tar.bz2)
+sha1sums=('327308c777009a41bbabb9159b18c4c0ac069537')
build() {
cd "${srcdir}/${pkgname}-${pkgver}"
- sed -i 's/-Werror//' CMakeLists.txt
- export CFLAGS="$CFLAGS -fno-strict-aliasing"
- export CXXFLAGS="$CXXFLAGS -fno-strict-aliasing"
cmake . -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr \
-DPHYSFS_BUILD_TEST=OFF -DPHYSFS_BUILD_WX_TEST=OFF
diff --git a/extra/xf86-video-nouveau/PKGBUILD b/extra/xf86-video-nouveau/PKGBUILD
index 7d947570c..fced03774 100644
--- a/extra/xf86-video-nouveau/PKGBUILD
+++ b/extra/xf86-video-nouveau/PKGBUILD
@@ -1,10 +1,10 @@
-# $Id: PKGBUILD 168580 2012-10-13 11:45:21Z andyrtr $
+# $Id: PKGBUILD 169655 2012-10-25 05:32:33Z ibiru $
# Maintainer: Andreas Radke <andyrtr@archlinux.org>
# Contributor: buddabrod <buddabrod@gmail.com>
pkgname=xf86-video-nouveau
-pkgver=1.0.2
-pkgrel=2
+pkgver=1.0.3
+pkgrel=1
pkgdesc="Open Source 2D acceleration driver for nVidia cards"
arch=('i686' 'x86_64')
url="http://nouveau.freedesktop.org/"
@@ -14,8 +14,8 @@ makedepends=('xorg-server-devel' 'X-ABI-VIDEODRV_VERSION=13' 'resourceproto' 'sc
conflicts=('xorg-server<1.13.0' 'X-ABI-VIDEODRV_VERSION<13' 'X-ABI-VIDEODRV_VERSION>=14')
options=('!libtool')
install=$pkgname.install
-source=($url/release/$pkgname-$pkgver.tar.bz2)
-sha256sums=('765731c2a91d434d4360517a128d18af70b158f727e49813f1a42e26cccbc45d')
+source=(http://xorg.freedesktop.org/archive/individual/driver/$pkgname-$pkgver.tar.bz2)
+sha256sums=('a2ae34046324e1ec620f5a8dee3c8fe5a295acbb5d51825604c8ad28fb75a559')
build() {
cd $pkgname-$pkgver
diff --git a/libre/clementine-libre/PKGBUILD b/libre/clementine-libre/PKGBUILD
index 473fd3cce..c0a063e95 100644
--- a/libre/clementine-libre/PKGBUILD
+++ b/libre/clementine-libre/PKGBUILD
@@ -2,13 +2,13 @@
#Maintainer: Stéphane Gaudreault <stephane@archlinux.org>
#Contributor: BlackEagle <ike.devolder@gmail.com>
#Contributor: Dany Martineau <dany.luc.martineau@gmail.com>
-#Maintainer (Parabola): Kete <kete@ninthfloor.org>
-#Contributor (Parabola): André Silva <emulatorman@lavabit.com>
+#Maintainer (Parabola): André Silva <emulatorman@lavabit.com>
+#Contributor (Parabola): Kete <kete@ninthfloor.org>
_pkgname=clementine
pkgname=clementine-libre
-pkgver=1.0.1
-pkgrel=7
+pkgver=1.1.0
+pkgrel=2
pkgdesc="A music player and library organizer, without spotify support"
url="http://www.clementine-player.org/"
license=('GPL')
@@ -16,7 +16,7 @@ arch=('i686' 'x86_64')
depends=('gstreamer0.10-base' 'taglib' 'glew' 'liblastfm' 'libgpod'
'libmtp' 'libplist' 'hicolor-icon-theme' 'qt' 'libimobiledevice'
'qjson' 'libcdio' 'protobuf' 'qca' 'qca-ossl' 'gvfs')
-makedepends=('cmake' 'boost')
+makedepends=('cmake' 'boost' 'mesa')
optdepends=('gstreamer0.10-base-plugins: for more open formats'
'gstreamer0.10-good-plugins: for use with "Good" plugin libraries'
'gstreamer0.10-bad-libre-plugins: for use with "Bad" plugin libraries'
@@ -25,37 +25,26 @@ replaces=('clementine')
conflicts=('clementine')
provides=("clementine=$pkgver")
source=(http://clementine-player.googlecode.com/files/${_pkgname}-${pkgver}.tar.gz
- clementine-fix-albumcoverfetch-crash.patch
- clementine-fresh-start.patch
- imobiledevice.patch
- remove-and-disable-spotify.patch
- remove-nonfree-references-on-translations.patch)
-sha1sums=('e05320da689e2fad744fd3e68518bc4103ecf0fd'
- 'fddd2e784181ce1dcc7809e7122cbade0af7b01f'
- 'd8abab4b8fb2d5284a2f43107505325e62d4af5f'
- 'a04cec00e38651de78bfaa6b6d73532c3786de11'
- '2fef46eaffa7b5cd61afbf19b1dc909d11972a34'
- '745bc4fd639d7ef3230592c6275fb43b8956f3d5')
+ remove-and-disable-spotify.patch)
+sha1sums=('af446aba5ca89edd1541871969b3b6738ffbd05f'
+ '3980a00c02e406226f0d08ae9b7e581702c89838')
install=clementine.install
build() {
cd "${srcdir}/${_pkgname}-${pkgver}"
- # https://bugs.gentoo.org/401713?id=401713
- patch -Np1 -i ../clementine-fresh-start.patch
-
- # http://code.google.com/p/clementine-player/issues/detail?id=2752
- patch -Np1 -i ../clementine-fix-albumcoverfetch-crash.patch
-
- # Use libimobiledevice new "udid" field instead of "uuid".
- patch -Np1 -i ../imobiledevice.patch
-
- # https://labs.parabola.nu/issues/99
+ # Remove nonfree spotify references on files
patch -Np1 -i ../remove-and-disable-spotify.patch
- patch -Np1 -i ../remove-nonfree-references-on-translations.patch
- # Remove nonfree spotifyblob folder
- rm -Rf "./spotifyblob"
+ # Remove nonfree spotifyblob folders
+ rm -rv ext/{clementine-spotifyblob,libclementine-spotifyblob}
+
+ # Remove nonfree spotify files
+ rm -v cmake/SpotifyVersion.cmake
+ rm -v data/icons/svg/spotify.svg
+ 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}}}
+
cmake . -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release
make
diff --git a/libre/clementine-libre/remove-and-disable-spotify.patch b/libre/clementine-libre/remove-and-disable-spotify.patch
index 9cfc3092a..e006e14c5 100644
--- a/libre/clementine-libre/remove-and-disable-spotify.patch
+++ b/libre/clementine-libre/remove-and-disable-spotify.patch
@@ -9,46 +9,28 @@ diff -rauN clementine-1.0.1/3rdparty/SPMediaKeyTap/SPMediaKeyTap.m clementine-li
@"com.apple.iTunes",
@"com.apple.QuickTimePlayerX",
@"com.apple.quicktimeplayer",
-diff -rauN clementine-1.0.1/Changelog clementine-libre-1.0.1/Changelog
---- clementine-1.0.1/Changelog 2012-01-22 10:43:26.000000000 -0200
-+++ clementine-libre-1.0.1/Changelog 2012-05-28 13:50:10.422664725 -0300
-@@ -1,3 +1,7 @@
-+Version 1.0.1 (libre version):
-+ Major features:
-+ * Disabled and removed Spotify.
-+
- Version 1.0.1:
- Bugfixes:
- * Use Chromaprinter and Acoustid instead of Echoprint and MusicDNS.
-diff -rauN clementine-1.0.1/cmake/SpotifyVersion.cmake /dev/null
---- clementine-1.0.1/cmake/SpotifyVersion.cmake 2011-12-02 19:24:43.000000000 -0200
-+++ /dev/null 2012-05-28 12:50:04.796939473 -0300
-@@ -1,3 +0,0 @@
--# Increment this whenever the user needs to download a new blob
--# Remember to upload and sign the new version of the blob.
--set(SPOTIFY_BLOB_VERSION 11)
-diff -rauN clementine-1.0.1/CMakeLists.txt clementine-libre-1.0.1/CMakeLists.txt
---- clementine-1.0.1/CMakeLists.txt 2012-01-22 10:43:26.000000000 -0200
-+++ clementine-libre-1.0.1/CMakeLists.txt 2012-05-28 17:32:48.690568781 -0300
-@@ -6,7 +6,6 @@
+diff -rauN clementine-1.1.0/CMakeLists.txt clementine-libre-1.1.0/CMakeLists.txt
+--- clementine-1.1.0/CMakeLists.txt 2012-10-22 04:24:28.000000000 -0200
++++ clementine-libre-1.1.0/CMakeLists.txt 2012-10-26 01:58:08.725496264 -0200
+@@ -7,7 +7,6 @@
include(cmake/Version.cmake)
include(cmake/Deb.cmake)
include(cmake/Rpm.cmake)
-include(cmake/SpotifyVersion.cmake)
include(cmake/OptionalSource.cmake)
+ set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
- if (UNIX AND NOT APPLE)
-@@ -66,7 +65,6 @@
+@@ -55,7 +54,6 @@
pkg_check_modules(USBMUXD libusbmuxd)
pkg_check_modules(LIBMTP libmtp>=1.0)
pkg_check_modules(INDICATEQT indicate-qt)
--pkg_check_modules(SPOTIFY libspotify>=10.1.16)
+-pkg_check_modules(SPOTIFY libspotify>=12.1.45)
pkg_check_modules(CDIO libcdio)
pkg_check_modules(QCA qca2)
pkg_check_modules(CHROMAPRINT libchromaprint)
-@@ -90,13 +88,6 @@
- set(HAVE_SPARKLE ON)
- endif (ENABLE_SPARKLE AND SPARKLE)
+@@ -81,13 +79,6 @@
+ find_library(GROWL Growl)
+ find_library(SPARKLE Sparkle)
- find_library(SPOTIFY libspotify)
- if (SPOTIFY)
@@ -60,468 +42,137 @@ diff -rauN clementine-1.0.1/CMakeLists.txt clementine-libre-1.0.1/CMakeLists.txt
add_subdirectory(3rdparty/SPMediaKeyTap)
set(SPMEDIAKEYTAP_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/SPMediaKeyTap)
set(SPMEDIAKEYTAP_LIBRARIES SPMediaKeyTap)
-@@ -191,8 +182,8 @@
- option(ENABLE_LIBLASTFM "Use liblastfm for fetching song info, scrobbling and radio streams" ON)
- option(ENABLE_REMOTE "Enable support for using remote controls with Clementine" OFF)
- option(ENABLE_BREAKPAD "Enable crash reporting" OFF)
--option(ENABLE_SPOTIFY_BLOB "Build the spotify non-GPL binary" ON)
--option(ENABLE_SPOTIFY "Enable spotify support" ON)
-+option(ENABLE_SPOTIFY_BLOB "Build the spotify non-GPL binary" OFF)
-+option(ENABLE_SPOTIFY "Enable spotify support" OFF)
- option(ENABLE_PLASMARUNNER "Enable plasma krunner global search" OFF)
+@@ -224,26 +215,16 @@
+ DEPENDS "D-Bus support" HAVE_DBUS
+ )
- if(WIN32)
-@@ -235,24 +226,6 @@
- set(HAVE_BREAKPAD ON)
- endif(ENABLE_BREAKPAD)
+-optional_component(SPOTIFY ON "Spotify support: core code"
++optional_component(SPOTIFY OFF "Spotify support: core code"
+ DEPENDS "protobuf" PROTOBUF_FOUND PROTOBUF_PROTOC_EXECUTABLE
+ )
--if(ENABLE_SPOTIFY AND PROTOBUF_FOUND AND PROTOBUF_PROTOC_EXECUTABLE)
-- set(HAVE_SPOTIFY ON)
--endif(ENABLE_SPOTIFY AND PROTOBUF_FOUND AND PROTOBUF_PROTOC_EXECUTABLE)
--
--if(ENABLE_SPOTIFY_BLOB AND PROTOBUF_FOUND AND PROTOBUF_PROTOC_EXECUTABLE AND SPOTIFY_FOUND)
-- set(HAVE_SPOTIFY_BLOB ON)
--endif(ENABLE_SPOTIFY_BLOB AND PROTOBUF_FOUND AND PROTOBUF_PROTOC_EXECUTABLE AND SPOTIFY_FOUND)
--
--if((NOT HAVE_SPOTIFY_BLOB) AND (NOT QCA_FOUND))
-- # If we're not bundling the spotify blob then we must ensure QCA is available
-- # so we can verify the blob we download at runtime.
-- unset(HAVE_SPOTIFY)
--endif((NOT HAVE_SPOTIFY_BLOB) AND (NOT QCA_FOUND))
+-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 "Spotify support: core code" HAVE_SPOTIFY
+ )
+
+-set(NEED_SPOTIFY_DOWNLOADER OFF)
+-if(HAVE_SPOTIFY AND NOT HAVE_SPOTIFY_BLOB)
+- set(NEED_SPOTIFY_DOWNLOADER ON)
+-endif()
-
--if(QCA_FOUND AND HAVE_SPOTIFY)
-- set(HAVE_QCA ON)
--endif(QCA_FOUND AND HAVE_SPOTIFY)
+-optional_component(SPOTIFY_DOWNLOADER
+- ${NEED_SPOTIFY_DOWNLOADER} "Spotify support: blob downloader"
+- DEPENDS "qca2" QCA_FOUND
+-)
-
-
- if(ENABLE_VISUALISATIONS)
- # When/if upstream accepts our patches then these options can be used to link
-@@ -391,14 +364,6 @@
+ optional_component(MOODBAR ON "Moodbar support"
+ DEPENDS "fftw3" FFTW3_FOUND
+ )
+@@ -411,14 +392,6 @@
add_subdirectory(3rdparty/google-breakpad)
endif(HAVE_BREAKPAD)
-if(HAVE_SPOTIFY)
-- add_subdirectory(spotifyblob/common)
+- add_subdirectory(ext/libclementine-spotifyblob)
-endif(HAVE_SPOTIFY)
-
-if(HAVE_SPOTIFY_BLOB)
-- add_subdirectory(spotifyblob/blob)
+- add_subdirectory(ext/clementine-spotifyblob)
-endif(HAVE_SPOTIFY_BLOB)
-
- # This goes after everything else because KDE fucks everything else up with its
- # cmake includes.
- find_package(KDE4 4.3.60)
-@@ -430,8 +395,6 @@
- summary_add("Devices: GIO backend" HAVE_GIO)
- summary_add("Gnome sound menu integration" HAVE_LIBINDICATE)
- summary_add("Last.fm support" HAVE_LIBLASTFM)
--summary_add("Spotify support: core code" HAVE_SPOTIFY)
--summary_add("Spotify support: non-GPL binary helper" HAVE_SPOTIFY_BLOB)
- summary_add("Visualisations" ENABLE_VISUALISATIONS)
- summary_add("Wiimote support" HAVE_WIIMOTEDEV)
- summary_add("(KDE) Plasma global search" HAVE_PLASMARUNNER)
-diff -rauN clementine-1.0.1/data/data.qrc clementine-libre-1.0.1/data/data.qrc
---- clementine-1.0.1/data/data.qrc 2012-01-22 10:43:26.000000000 -0200
-+++ clementine-libre-1.0.1/data/data.qrc 2012-05-28 17:50:22.768352061 -0300
-@@ -49,9 +49,6 @@
- <file>providers/magnatune.png</file>
- <file>schema/schema-8.sql</file>
- <file>schema/schema-9.sql</file>
+ if(HAVE_MOODBAR)
+ add_subdirectory(gst/moodbar)
+ endif()
+diff -rauN clementine-1.1.0/data/data.qrc clementine-libre-1.1.0/data/data.qrc
+--- clementine-1.1.0/data/data.qrc 2012-10-22 04:24:28.000000000 -0200
++++ clementine-libre-1.1.0/data/data.qrc 2012-10-26 01:59:52.333078474 -0200
+@@ -1,7 +1,6 @@
+ <RCC>
+ <qresource prefix="/">
+ <file>blank.ttf</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>
+@@ -76,7 +75,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>
+@@ -153,7 +151,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>
+@@ -229,7 +226,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/22x22/application-exit.png</file>
- <file>icons/22x22/applications-internet.png</file>
- <file>icons/22x22/configure.png</file>
-@@ -320,7 +317,6 @@
- <file>icons/32x32/edit-find.png</file>
- <file>icons/48x48/edit-find.png</file>
+ <file>icons/48x48/view-choose.png</file>
+ <file>icons/48x48/view-fullscreen.png</file>
+ <file>icons/48x48/view-media-equalizer.png</file>
+@@ -318,7 +314,6 @@
+ <file>schema/schema-28.sql</file>
+ <file>schema/schema-29.sql</file>
+ <file>schema/schema-2.sql</file>
+- <file>schema/schema-30.sql</file>
+ <file>schema/schema-31.sql</file>
+ <file>schema/schema-32.sql</file>
<file>schema/schema-33.sql</file>
+@@ -339,7 +334,6 @@
+ <file>smartplaylistsearchterm.css</file>
+ <file>songinfo.css</file>
+ <file>spinner.gif</file>
- <file>spotify-core-logo-128x128.png</file>
- <file>icons/22x22/dialog-warning.png</file>
- <file>icons/22x22/dialog-ok-apply.png</file>
- <file>schema/schema-34.sql</file>
-@@ -331,7 +327,6 @@
- <file>providers/grooveshark.png</file>
- <file>allthethings.png</file>
- <file>globalsearch.css</file>
-- <file>clementine-spotify-public.pem</file>
- <file>icons/22x22/user-away.png</file>
- <file>icons/32x32/search.png</file>
- <file>schema/schema-35.sql</file>
-diff -rauN clementine-1.0.1/data/icons/svg/spotify.svg /dev/null
---- clementine-1.0.1/data/icons/svg/spotify.svg 2011-12-02 19:24:43.000000000 -0200
-+++ /dev/null 2012-05-28 12:50:04.796939473 -0300
-@@ -1,285 +0,0 @@
--<?xml version="1.0" encoding="UTF-8" standalone="no"?>
--<!-- Created with Inkscape (http://www.inkscape.org/) -->
--<svg
-- xmlns:dc="http://purl.org/dc/elements/1.1/"
-- xmlns:cc="http://creativecommons.org/ns#"
-- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-- xmlns:svg="http://www.w3.org/2000/svg"
-- xmlns="http://www.w3.org/2000/svg"
-- xmlns:xlink="http://www.w3.org/1999/xlink"
-- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-- width="48"
-- height="48"
-- id="svg2"
-- sodipodi:version="0.32"
-- inkscape:version="0.46"
-- version="1.0"
-- sodipodi:docname="spotify.svg"
-- inkscape:output_extension="org.inkscape.output.svg.inkscape">
-- <defs
-- id="defs4">
-- <linearGradient
-- inkscape:collect="always"
-- id="linearGradient7729">
-- <stop
-- style="stop-color:#467700;stop-opacity:1"
-- offset="0"
-- id="stop7731" />
-- <stop
-- style="stop-color:#518900;stop-opacity:1"
-- offset="1"
-- id="stop7733" />
-- </linearGradient>
-- <linearGradient
-- inkscape:collect="always"
-- id="linearGradient7721">
-- <stop
-- style="stop-color:#1a4300;stop-opacity:1"
-- offset="0"
-- id="stop7723" />
-- <stop
-- style="stop-color:#215300;stop-opacity:1"
-- offset="1"
-- id="stop7725" />
-- </linearGradient>
-- <linearGradient
-- inkscape:collect="always"
-- id="linearGradient7713">
-- <stop
-- style="stop-color:#193d00;stop-opacity:1"
-- offset="0"
-- id="stop7715" />
-- <stop
-- style="stop-color:#1f4b00;stop-opacity:1"
-- offset="1"
-- id="stop7717" />
-- </linearGradient>
-- <linearGradient
-- inkscape:collect="always"
-- id="linearGradient6355">
-- <stop
-- style="stop-color:#23371c;stop-opacity:1"
-- offset="0"
-- id="stop6357" />
-- <stop
-- style="stop-color:#004100;stop-opacity:1"
-- offset="1"
-- id="stop6359" />
-- </linearGradient>
-- <linearGradient
-- inkscape:collect="always"
-- id="linearGradient6347">
-- <stop
-- style="stop-color:#abd033;stop-opacity:1"
-- offset="0"
-- id="stop6349" />
-- <stop
-- style="stop-color:#9ec02d;stop-opacity:0;"
-- offset="1"
-- id="stop6351" />
-- </linearGradient>
-- <linearGradient
-- id="linearGradient5519">
-- <stop
-- style="stop-color:#88ae04;stop-opacity:1"
-- offset="0"
-- id="stop5521" />
-- <stop
-- style="stop-color:#73a400;stop-opacity:1"
-- offset="1"
-- id="stop5523" />
-- </linearGradient>
-- <inkscape:perspective
-- sodipodi:type="inkscape:persp3d"
-- inkscape:vp_x="0 : 526.18109 : 1"
-- inkscape:vp_y="0 : 1000 : 0"
-- inkscape:vp_z="744.09448 : 526.18109 : 1"
-- inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
-- id="perspective10" />
-- <inkscape:perspective
-- id="perspective5505"
-- inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
-- inkscape:vp_z="744.09448 : 526.18109 : 1"
-- inkscape:vp_y="0 : 1000 : 0"
-- inkscape:vp_x="0 : 526.18109 : 1"
-- sodipodi:type="inkscape:persp3d" />
-- <linearGradient
-- inkscape:collect="always"
-- xlink:href="#linearGradient5519"
-- id="linearGradient6853"
-- gradientUnits="userSpaceOnUse"
-- x1="119.5"
-- y1="91.362183"
-- x2="102.5"
-- y2="128.36218" />
-- <radialGradient
-- inkscape:collect="always"
-- xlink:href="#linearGradient6355"
-- id="radialGradient6855"
-- gradientUnits="userSpaceOnUse"
-- gradientTransform="matrix(1.1318093,0.197699,-0.1703116,0.9750189,-125.44033,-100.50883)"
-- cx="147.76869"
-- cy="120.16964"
-- fx="147.76869"
-- fy="120.16964"
-- r="14.451495" />
-- <linearGradient
-- inkscape:collect="always"
-- xlink:href="#linearGradient6347"
-- id="linearGradient6857"
-- gradientUnits="userSpaceOnUse"
-- gradientTransform="translate(-125.45979,-77.491488)"
-- x1="149.09062"
-- y1="85.104187"
-- x2="139.1649"
-- y2="106.61218" />
-- <filter
-- inkscape:collect="always"
-- id="filter7655"
-- x="-1.0712544"
-- width="3.1425087"
-- y="-1.0712544"
-- height="3.1425087">
-- <feGaussianBlur
-- inkscape:collect="always"
-- stdDeviation="20.086019"
-- id="feGaussianBlur7657" />
-- </filter>
-- <linearGradient
-- inkscape:collect="always"
-- xlink:href="#linearGradient7713"
-- id="linearGradient7719"
-- x1="38.714096"
-- y1="17.417631"
-- x2="31.1127"
-- y2="15.165503"
-- gradientUnits="userSpaceOnUse"
-- gradientTransform="matrix(0.999924,1.232938e-2,-1.232938e-2,0.999924,0.2587749,-0.2864042)" />
-- <linearGradient
-- inkscape:collect="always"
-- xlink:href="#linearGradient7721"
-- id="linearGradient7727"
-- x1="35.708893"
-- y1="25.90625"
-- x2="27.400389"
-- y2="22.312458"
-- gradientUnits="userSpaceOnUse"
-- gradientTransform="matrix(0.965063,1.1899533e-2,-1.232938e-2,0.999924,1.1112913,-0.2758924)" />
-- <linearGradient
-- inkscape:collect="always"
-- xlink:href="#linearGradient7729"
-- id="linearGradient7735"
-- x1="35.607697"
-- y1="31.414557"
-- x2="23.13369"
-- y2="26.433243"
-- gradientUnits="userSpaceOnUse"
-- gradientTransform="matrix(0.8596429,1.059967e-2,-1.232938e-2,0.999924,3.5039934,-0.2463897)" />
-- <filter
-- inkscape:collect="always"
-- id="filter7785"
-- x="-0.089479765"
-- width="1.1789595"
-- y="-0.14834692"
-- height="1.2966938">
-- <feGaussianBlur
-- inkscape:collect="always"
-- stdDeviation="1.5684595"
-- id="feGaussianBlur7787" />
-- </filter>
-- </defs>
-- <sodipodi:namedview
-- id="base"
-- pagecolor="#ffffff"
-- bordercolor="#666666"
-- borderopacity="1.0"
-- gridtolerance="10000"
-- guidetolerance="10"
-- objecttolerance="10"
-- inkscape:pageopacity="0.0"
-- inkscape:pageshadow="2"
-- inkscape:zoom="5.6568542"
-- inkscape:cx="-0.10040691"
-- inkscape:cy="47.355194"
-- inkscape:document-units="px"
-- inkscape:current-layer="layer1"
-- showgrid="false"
-- inkscape:snap-bbox="true"
-- inkscape:snap-nodes="false"
-- inkscape:window-width="1440"
-- inkscape:window-height="853"
-- inkscape:window-x="0"
-- inkscape:window-y="25">
-- <inkscape:grid
-- type="xygrid"
-- id="grid5511"
-- visible="true"
-- enabled="true" />
-- </sodipodi:namedview>
-- <metadata
-- id="metadata7">
-- <rdf:RDF>
-- <cc:Work
-- rdf:about="">
-- <dc:format>image/svg+xml</dc:format>
-- <dc:type
-- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-- </cc:Work>
-- </rdf:RDF>
-- </metadata>
-- <g
-- inkscape:label="Layer 1"
-- inkscape:groupmode="layer"
-- id="layer1">
-- <g
-- id="g6847"
-- transform="translate(-0.29021,-0.7456946)">
-- <path
-- sodipodi:type="arc"
-- style="opacity:0.64566926;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter7655);enable-background:accumulate"
-- id="path6363"
-- sodipodi:cx="112.5"
-- sodipodi:cy="109.86218"
-- sodipodi:rx="22.5"
-- sodipodi:ry="22.5"
-- d="M 135,109.86218 A 22.5,22.5 0 1 1 90,109.86218 A 22.5,22.5 0 1 1 135,109.86218 z"
-- transform="matrix(0.4666666,0,0,0.111111,-28.709782,33.038802)" />
-- <path
-- transform="translate(-88.70979,-85.616488)"
-- d="M 135,109.86218 A 22.5,22.5 0 1 1 90,109.86218 A 22.5,22.5 0 1 1 135,109.86218 z"
-- sodipodi:ry="22.5"
-- sodipodi:rx="22.5"
-- sodipodi:cy="109.86218"
-- sodipodi:cx="112.5"
-- id="path5513"
-- style="opacity:1;fill:url(#linearGradient6853);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-- sodipodi:type="arc" />
-- <path
-- sodipodi:nodetypes="csccscc"
-- id="path5529"
-- d="M 7.6378996,39.420202 C 8.1682296,39.420202 11.29843,32.092852 23.23086,33.507062 C 35.16329,34.921272 36.54089,42.778952 36.54089,42.778952 C 34.49039,44.179572 32.3092,45.405922 29.55821,45.872552 C 29.55821,45.872552 26.55929,40.325532 21.1676,40.679082 C 15.77591,41.032632 13.91347,44.193172 13.91347,44.193172 C 11.14188,43.198092 8.9957096,41.593432 7.6378996,39.420202 z"
-- style="fill:url(#radialGradient6855);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-- <path
-- sodipodi:nodetypes="cccc"
-- id="path5531"
-- d="M 2.6652096,29.120692 C 35.315841,10.631207 30.66521,27.370692 44.66521,26.495692 C 44.14296,15.562843 35.20292,3.7456934 23.66521,3.7456934 C 6.6997296,4.3119254 1.9479196,20.58416 2.6652096,29.120692 z"
-- style="fill:url(#linearGradient6857);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter7785)" />
-- </g>
-- <path
-- style="opacity:1;fill:url(#linearGradient7719);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-- d="M 10.300245,11.619555 C 8.241027,12.012805 7.9425774,15.355405 10.765465,15.313073 C 21.977063,13.20149 31.048724,15.49889 39.670046,19.826041 C 40.808245,20.378971 42.647611,18.028703 41.02047,16.758511 C 31.316836,11.614062 19.960975,9.8780472 10.300245,11.619555 z"
-- id="path7661"
-- sodipodi:nodetypes="ccccc" />
-- <path
-- style="opacity:1;fill:url(#linearGradient7727);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-- d="M 12.303532,19.144827 C 10.172718,19.381037 9.829391,22.969311 12.56196,22.64828 C 21.903655,21.50982 27.85363,22.62879 35.683323,25.808592 C 37.647192,26.873264 38.724998,23.482585 36.929338,22.604961 C 28.133565,18.889799 21.412131,18.726151 12.303532,19.144827 z"
-- id="path7666"
-- sodipodi:nodetypes="ccccc" />
-- <path
-- style="opacity:1;fill:url(#linearGradient7735);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-- d="M 14.447653,25.703011 C 12.75416,26.30833 13.053805,29.148649 14.863112,29.052139 C 17.870832,28.722372 20.153948,28.706138 23.615532,29.097554 C 27.126432,29.494545 29.233258,30.435974 32.157356,31.453048 C 33.350406,31.961876 34.447173,29.764482 33.187538,28.528027 C 29.966426,27.274723 27.415802,26.174879 23.388506,25.719498 C 20.084015,25.348048 17.755584,25.371512 14.447653,25.703011 z"
-- id="path7668"
-- sodipodi:nodetypes="ccscccc" />
-- </g>
--</svg>
-diff -rauN clementine-1.0.1/data/schema/schema-30.sql clementine-libre-1.0.1/data/schema/schema-30.sql
---- clementine-1.0.1/data/schema/schema-30.sql 2011-12-02 19:24:43.000000000 -0200
-+++ clementine-libre-1.0.1/data/schema/schema-30.sql 2012-05-28 17:55:40.840489308 -0300
-@@ -1,45 +1 @@
--CREATE TABLE spotify_search_songs (
-- title TEXT,
-- album TEXT,
-- artist TEXT,
-- albumartist TEXT,
-- composer TEXT,
-- track INTEGER,
-- disc INTEGER,
-- bpm REAL,
-- year INTEGER,
-- genre TEXT,
-- comment TEXT,
-- compilation INTEGER,
--
-- length INTEGER,
-- bitrate INTEGER,
-- samplerate INTEGER,
--
-- directory INTEGER NOT NULL,
-- filename TEXT NOT NULL,
-- mtime INTEGER NOT NULL,
-- ctime INTEGER NOT NULL,
-- filesize INTEGER NOT NULL,
-- sampler INTEGER NOT NULL DEFAULT 0,
-- art_automatic TEXT,
-- art_manual TEXT,
-- filetype INTEGER NOT NULL DEFAULT 0,
-- playcount INTEGER NOT NULL DEFAULT 0,
-- lastplayed INTEGER,
-- rating INTEGER,
-- forced_compilation_on INTEGER NOT NULL DEFAULT 0,
-- forced_compilation_off INTEGER NOT NULL DEFAULT 0,
-- effective_compilation NOT NULL DEFAULT 0,
-- skipcount INTEGER NOT NULL DEFAULT 0,
-- score INTEGER NOT NULL DEFAULT 0,
-- beginning INTEGER NOT NULL DEFAULT 0,
-- cue_path TEXT
--);
--
--CREATE VIRTUAL TABLE spotify_search_songs_fts USING fts3 (
-- ftstitle, ftsalbum, ftsartist, ftsalbumartist, ftscomposer, ftsgenre, ftscomment,
-- tokenize=unicode
--);
--
- UPDATE schema_version SET version=30;
-diff -rauN clementine-1.0.1/dist/macdeploy.py clementine-libre-1.0.1/dist/macdeploy.py
---- clementine-1.0.1/dist/macdeploy.py 2012-01-22 10:43:26.000000000 -0200
-+++ clementine-libre-1.0.1/dist/macdeploy.py 2012-05-28 17:58:29.937662793 -0300
-@@ -367,11 +367,6 @@
-
- FixPlugin(FindGstreamerPlugin('gst-plugin-scanner'), '.')
-
--try:
+ <file>star-off.png</file>
+ <file>star-on.png</file>
+ <file>tiny-pause.png</file>
+diff -rauN clementine-1.1.0/dist/macdeploy.py clementine-libre-1.1.0/dist/macdeploy.py
+--- clementine-1.1.0/dist/macdeploy.py 2012-10-11 09:16:39.000000000 -0200
++++ clementine-libre-1.1.0/dist/macdeploy.py 2012-10-26 02:06:12.781965350 -0200
+@@ -387,10 +387,7 @@
+ FixPlugin(FindGioModule('libgiolibproxy.so'), 'gio-modules')
+
+ try:
- FixPlugin('clementine-spotifyblob', '.')
+ FixPlugin('clementine-tagreader', '.')
-except:
-- print 'Failed to find spotify blob'
--
+- print 'Failed to find blob: %s' % traceback.format_exc()
+
for plugin in QT_PLUGINS:
FixPlugin(FindQtPlugin(plugin), os.path.dirname(plugin))
-
-diff -rauN clementine-1.0.1/dist/windows/clementine.nsi clementine-libre-1.0.1/dist/windows/clementine.nsi
---- clementine-1.0.1/dist/windows/clementine.nsi 2012-01-22 10:43:46.000000000 -0200
-+++ clementine-libre-1.0.1/dist/windows/clementine.nsi 2012-05-28 18:06:56.812551755 -0300
-@@ -95,7 +95,6 @@
+diff -rauN clementine-1.1.0/dist/windows/clementine.nsi clementine-libre-1.1.0/dist/windows/clementine.nsi
+--- clementine-1.1.0/dist/windows/clementine.nsi 2012-10-22 04:27:00.000000000 -0200
++++ clementine-libre-1.1.0/dist/windows/clementine.nsi 2012-10-26 02:07:20.551540003 -0200
+@@ -94,9 +94,6 @@
+ Delete "$INSTDIR\gstreamer-plugins\libgstqueue2.dll"
Delete "$INSTDIR\gstreamer-plugins\libgstsoup.dll"
- ; 1.0 prerelease
+- ; 1.0 prerelease
- Delete "$INSTDIR\spotify.dll"
-
+-
; 1.0
Delete "$INSTDIR\libofa.dll"
-@@ -109,7 +108,6 @@
- File "avformat-52.dll"
+ Delete "$INSTDIR\gstreamer-plugins\libgstofa.dll"
+@@ -110,7 +107,6 @@
File "avutil-50.dll"
File "clementine.exe"
+ File "clementine-tagreader.exe"
- File "clementine-spotifyblob.exe"
File "clementine.ico"
File "glew32.dll"
File "intl.dll"
-@@ -163,7 +161,6 @@
+@@ -164,7 +160,6 @@
File "libqjson.dll"
File "libsoup-2.4-1.dll"
File "libspeex-1.dll"
@@ -529,15 +180,15 @@ diff -rauN clementine-1.0.1/dist/windows/clementine.nsi clementine-libre-1.0.1/d
File "libtag.dll"
File "libtasn1-3.dll"
File "libusbmuxd.dll"
-@@ -949,7 +946,6 @@
- Delete "$INSTDIR\avutil-50.dll"
+@@ -957,7 +952,6 @@
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-12.dll"
-@@ -1002,7 +998,6 @@
+@@ -1010,7 +1004,6 @@
Delete "$INSTDIR\libqjson.dll"
Delete "$INSTDIR\libsoup-2.4-1.dll"
Delete "$INSTDIR\libspeex-1.dll"
@@ -545,26 +196,28 @@ diff -rauN clementine-1.0.1/dist/windows/clementine.nsi clementine-libre-1.0.1/d
Delete "$INSTDIR\libtag.dll"
Delete "$INSTDIR\libtasn1-3.dll"
Delete "$INSTDIR\libusbmuxd.dll"
-diff -rauN clementine-1.0.1/dist/windows/clementine.nsi.in clementine-libre-1.0.1/dist/windows/clementine.nsi.in
---- clementine-1.0.1/dist/windows/clementine.nsi.in 2012-01-22 10:43:26.000000000 -0200
-+++ clementine-libre-1.0.1/dist/windows/clementine.nsi.in 2012-05-28 18:09:14.664818947 -0300
-@@ -95,7 +95,6 @@
+diff -rauN clementine-1.1.0/dist/windows/clementine.nsi.in clementine-libre-1.1.0/dist/windows/clementine.nsi.in
+--- clementine-1.1.0/dist/windows/clementine.nsi.in 2012-10-11 09:16:39.000000000 -0200
++++ clementine-libre-1.1.0/dist/windows/clementine.nsi.in 2012-10-26 02:08:02.052572234 -0200
+@@ -94,9 +94,6 @@
+ Delete "$INSTDIR\gstreamer-plugins\libgstqueue2.dll"
Delete "$INSTDIR\gstreamer-plugins\libgstsoup.dll"
- ; 1.0 prerelease
+- ; 1.0 prerelease
- Delete "$INSTDIR\spotify.dll"
-
+-
; 1.0
Delete "$INSTDIR\libofa.dll"
-@@ -109,7 +108,6 @@
- File "avformat-52.dll"
+ Delete "$INSTDIR\gstreamer-plugins\libgstofa.dll"
+@@ -110,7 +107,6 @@
File "avutil-50.dll"
File "clementine.exe"
+ File "clementine-tagreader.exe"
- File "clementine-spotifyblob.exe"
File "clementine.ico"
File "glew32.dll"
File "intl.dll"
-@@ -163,7 +161,6 @@
+@@ -164,7 +160,6 @@
File "libqjson.dll"
File "libsoup-2.4-1.dll"
File "libspeex-1.dll"
@@ -572,15 +225,15 @@ diff -rauN clementine-1.0.1/dist/windows/clementine.nsi.in clementine-libre-1.0.
File "libtag.dll"
File "libtasn1-3.dll"
File "libusbmuxd.dll"
-@@ -949,7 +946,6 @@
- Delete "$INSTDIR\avutil-50.dll"
+@@ -957,7 +952,6 @@
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-12.dll"
-@@ -1002,7 +998,6 @@
+@@ -1010,7 +1004,6 @@
Delete "$INSTDIR\libqjson.dll"
Delete "$INSTDIR\libsoup-2.4-1.dll"
Delete "$INSTDIR\libspeex-1.dll"
@@ -588,18 +241,18 @@ diff -rauN clementine-1.0.1/dist/windows/clementine.nsi.in clementine-libre-1.0.
Delete "$INSTDIR\libtag.dll"
Delete "$INSTDIR\libtasn1-3.dll"
Delete "$INSTDIR\libusbmuxd.dll"
-diff -rauN clementine-1.0.1/src/CMakeLists.txt clementine-libre-1.0.1/src/CMakeLists.txt
---- clementine-1.0.1/src/CMakeLists.txt 2012-01-22 10:43:26.000000000 -0200
-+++ clementine-libre-1.0.1/src/CMakeLists.txt 2012-05-30 02:50:15.725755468 -0300
-@@ -552,7 +552,6 @@
- internet/internetviewcontainer.ui
+diff -rauN clementine-1.1.0/src/CMakeLists.txt clementine-libre-1.1.0/src/CMakeLists.txt
+--- clementine-1.1.0/src/CMakeLists.txt 2012-10-22 04:24:28.000000000 -0200
++++ clementine-libre-1.1.0/src/CMakeLists.txt 2012-10-26 02:09:29.994361873 -0200
+@@ -630,7 +630,6 @@
internet/magnatunedownloaddialog.ui
internet/magnatunesettingspage.ui
+ internet/searchboxwidget.ui
- internet/spotifysettingspage.ui
library/groupbydialog.ui
library/libraryfilterwidget.ui
-@@ -690,23 +689,6 @@
+@@ -774,32 +773,6 @@
internet/lastfmstationdialog.ui
)
@@ -607,38 +260,52 @@ diff -rauN clementine-1.0.1/src/CMakeLists.txt clementine-libre-1.0.1/src/CMakeL
-optional_source(HAVE_SPOTIFY
- SOURCES
- globalsearch/spotifysearchprovider.cpp
-- internet/spotifyblobdownloader.cpp
-- internet/spotifysearchplaylisttype.cpp
- internet/spotifyserver.cpp
- internet/spotifyservice.cpp
- internet/spotifysettingspage.cpp
- HEADERS
- globalsearch/spotifysearchprovider.h
-- internet/spotifyblobdownloader.h
- internet/spotifyserver.h
- internet/spotifyservice.h
- internet/spotifysettingspage.h
+- INCLUDE_DIRECTORIES
+- ${CMAKE_SOURCE_DIR}/ext/libclementine-spotifyblob
+- ${CMAKE_BINARY_DIR}/ext/libclementine-spotifyblob
+-)
+-
+-optional_source(HAVE_SPOTIFY_DOWNLOADER
+- SOURCES
+- internet/spotifyblobdownloader.cpp
+- HEADERS
+- internet/spotifyblobdownloader.h
+- INCLUDE_DIRECTORIES
+- ${QCA_INCLUDE_DIRS}
-)
-
- optional_source(HAVE_QCA INCLUDE_DIRECTORIES ${QCA_INCLUDE_DIRS})
-
# Platform specific - OS X
-@@ -1037,14 +1019,6 @@
+ optional_source(APPLE
+ INCLUDE_DIRECTORIES
+@@ -1141,19 +1114,6 @@
endif (LINUX)
endif(HAVE_BREAKPAD)
-if(HAVE_SPOTIFY)
- target_link_libraries(clementine_lib
- clementine-spotifyblob-messages
+- )
+-endif(HAVE_SPOTIFY)
+-
+-if(HAVE_SPOTIFY_DOWNLOADER)
+- target_link_libraries(clementine_lib
- ${QCA_LIBRARIES}
- )
- link_directories(${QCA_LIBRARY_DIRS})
--endif(HAVE_SPOTIFY)
+-endif(HAVE_SPOTIFY_DOWNLOADER)
-
if (APPLE)
target_link_libraries(clementine_lib
${GROWL}
-@@ -1118,11 +1092,6 @@
+@@ -1231,16 +1191,6 @@
clementine_lib
)
@@ -646,25 +313,31 @@ diff -rauN clementine-1.0.1/src/CMakeLists.txt clementine-libre-1.0.1/src/CMakeL
-if(HAVE_SPOTIFY_BLOB)
- add_dependencies(clementine clementine-spotifyblob)
-endif(HAVE_SPOTIFY_BLOB)
+-add_dependencies(clementine clementine-tagreader)
-
- set_target_properties(clementine PROPERTIES
- MACOSX_BUNDLE_INFO_PLIST "../dist/Info.plist"
- )
-diff -rauN clementine-1.0.1/src/config.h.in clementine-libre-1.0.1/src/config.h.in
---- clementine-1.0.1/src/config.h.in 2011-12-02 19:24:43.000000000 -0200
-+++ clementine-libre-1.0.1/src/config.h.in 2012-05-28 18:17:13.027993639 -0300
-@@ -35,7 +35,6 @@
+-set_target_properties(clementine PROPERTIES
+- MACOSX_BUNDLE_INFO_PLIST "../dist/Info.plist"
+-)
+-
+ if (APPLE)
+ install(FILES ../dist/clementine.icns
+ DESTINATION "${CMAKE_BINARY_DIR}/clementine.app/Contents/Resources")
+diff -rauN clementine-1.1.0/src/config.h.in clementine-libre-1.1.0/src/config.h.in
+--- clementine-1.1.0/src/config.h.in 2012-10-22 04:24:28.000000000 -0200
++++ clementine-libre-1.1.0/src/config.h.in 2012-10-26 02:10:01.735935822 -0200
+@@ -38,8 +38,6 @@
#cmakedefine HAVE_QCA
- #cmakedefine HAVE_REMOTE
+ #cmakedefine HAVE_SAC
#cmakedefine HAVE_SPARKLE
-#cmakedefine HAVE_SPOTIFY
+-#cmakedefine HAVE_SPOTIFY_DOWNLOADER
#cmakedefine HAVE_STATIC_SQLITE
#cmakedefine HAVE_WIIMOTEDEV
- #cmakedefine LEOPARD
-diff -rauN clementine-1.0.1/src/core/utilities.cpp clementine-libre-1.0.1/src/core/utilities.cpp
---- clementine-1.0.1/src/core/utilities.cpp 2012-01-22 10:43:26.000000000 -0200
-+++ clementine-libre-1.0.1/src/core/utilities.cpp 2012-05-28 18:25:43.252728803 -0300
-@@ -277,9 +277,6 @@
+ #cmakedefine IMOBILEDEVICE_USES_UDIDS
+diff -rauN clementine-1.1.0/src/core/utilities.cpp clementine-libre-1.1.0/src/core/utilities.cpp
+--- clementine-1.1.0/src/core/utilities.cpp 2012-10-11 09:16:39.000000000 -0200
++++ clementine-libre-1.1.0/src/core/utilities.cpp 2012-10-26 02:10:38.303908540 -0200
+@@ -310,9 +310,6 @@
return QDir::homePath();
#endif
@@ -674,21 +347,21 @@ diff -rauN clementine-1.0.1/src/core/utilities.cpp clementine-libre-1.0.1/src/co
default:
qFatal("%s", Q_FUNC_INFO);
return QString::null;
-diff -rauN clementine-1.0.1/src/core/utilities.h clementine-libre-1.0.1/src/core/utilities.h
---- clementine-1.0.1/src/core/utilities.h 2012-01-22 10:43:26.000000000 -0200
-+++ clementine-libre-1.0.1/src/core/utilities.h 2012-05-28 18:27:31.686659381 -0300
-@@ -88,7 +88,6 @@
+diff -rauN clementine-1.1.0/src/core/utilities.h clementine-libre-1.1.0/src/core/utilities.h
+--- clementine-1.1.0/src/core/utilities.h 2012-10-11 09:16:39.000000000 -0200
++++ clementine-libre-1.1.0/src/core/utilities.h 2012-10-26 02:11:04.965764358 -0200
+@@ -108,7 +108,6 @@
Path_NetworkCache,
Path_GstreamerRegistry,
Path_DefaultMusicLibrary,
- Path_LocalSpotifyBlob,
+ Path_MoodbarCache,
};
QString GetConfigPath(ConfigPath config);
-
-diff -rauN clementine-1.0.1/src/covers/albumcoverloader.cpp clementine-libre-1.0.1/src/covers/albumcoverloader.cpp
---- clementine-1.0.1/src/covers/albumcoverloader.cpp 2011-12-02 19:24:44.000000000 -0200
-+++ clementine-libre-1.0.1/src/covers/albumcoverloader.cpp 2012-05-28 18:34:26.543457483 -0300
-@@ -28,10 +28,6 @@
+diff -rauN clementine-1.1.0/src/covers/albumcoverloader.cpp clementine-libre-1.1.0/src/covers/albumcoverloader.cpp
+--- clementine-1.1.0/src/covers/albumcoverloader.cpp 2012-10-22 04:24:28.000000000 -0200
++++ clementine-libre-1.1.0/src/covers/albumcoverloader.cpp 2012-10-26 03:59:14.488394050 -0200
+@@ -29,17 +29,12 @@
#include <QUrl>
#include <QNetworkReply>
@@ -699,17 +372,15 @@ diff -rauN clementine-1.0.1/src/covers/albumcoverloader.cpp clementine-libre-1.0
AlbumCoverLoader::AlbumCoverLoader(QObject* parent)
: QObject(parent),
-@@ -40,8 +36,7 @@
- scale_(true),
- padding_(true),
- next_id_(0),
+ stop_requested_(false),
+ next_id_(1),
- network_(new NetworkAccessManager(this)),
- connected_spotify_(false)
+ network_(new NetworkAccessManager(this))
{
}
-@@ -148,46 +143,12 @@
+@@ -167,30 +162,6 @@
remote_tasks_.insert(reply, task);
return TryLoadResult(true, false, QImage());
@@ -740,7 +411,8 @@ diff -rauN clementine-1.0.1/src/covers/albumcoverloader.cpp clementine-libre-1.0
}
QImage image(filename);
- return TryLoadResult(false, !image.isNull(), image.isNull() ? default_ : image);
+@@ -198,16 +169,6 @@
+ image.isNull() ? task.options.default_output_image_: image);
}
-void AlbumCoverLoader::SpotifyImageLoaded(const QString& id, const QImage& image) {
@@ -748,7 +420,7 @@ diff -rauN clementine-1.0.1/src/covers/albumcoverloader.cpp clementine-libre-1.0
- return;
-
- Task task = remote_spotify_tasks_.take(id);
-- QImage scaled = ScaleAndPad(image);
+- QImage scaled = ScaleAndPad(task.options, image);
- emit ImageLoaded(task.id, scaled);
- emit ImageLoaded(task.id, scaled, image);
-}
@@ -756,10 +428,10 @@ diff -rauN clementine-1.0.1/src/covers/albumcoverloader.cpp clementine-libre-1.0
void AlbumCoverLoader::RemoteFetchFinished() {
QNetworkReply* reply = qobject_cast<QNetworkReply*>(sender());
if (!reply)
-diff -rauN clementine-1.0.1/src/covers/albumcoverloader.h clementine-libre-1.0.1/src/covers/albumcoverloader.h
---- clementine-1.0.1/src/covers/albumcoverloader.h 2011-12-02 19:24:44.000000000 -0200
-+++ clementine-libre-1.0.1/src/covers/albumcoverloader.h 2012-05-28 18:38:03.228006474 -0300
-@@ -65,7 +65,6 @@
+diff -rauN clementine-1.1.0/src/covers/albumcoverloader.h clementine-libre-1.1.0/src/covers/albumcoverloader.h
+--- clementine-1.1.0/src/covers/albumcoverloader.h 2012-10-22 04:24:28.000000000 -0200
++++ clementine-libre-1.1.0/src/covers/albumcoverloader.h 2012-10-26 02:13:19.304984280 -0200
+@@ -62,7 +62,6 @@
protected slots:
void ProcessTasks();
void RemoteFetchFinished();
@@ -767,7 +439,7 @@ diff -rauN clementine-1.0.1/src/covers/albumcoverloader.h clementine-libre-1.0.1
protected:
enum State {
-@@ -108,13 +107,10 @@
+@@ -102,13 +101,10 @@
QMutex mutex_;
QQueue<Task> tasks_;
QMap<QNetworkReply*, Task> remote_tasks_;
@@ -781,10 +453,10 @@ diff -rauN clementine-1.0.1/src/covers/albumcoverloader.h clementine-libre-1.0.1
static const int kMaxRedirects = 3;
};
-diff -rauN clementine-1.0.1/src/engines/gstenginepipeline.cpp clementine-libre-1.0.1/src/engines/gstenginepipeline.cpp
---- clementine-1.0.1/src/engines/gstenginepipeline.cpp 2011-12-02 19:24:44.000000000 -0200
-+++ clementine-libre-1.0.1/src/engines/gstenginepipeline.cpp 2012-05-28 18:51:35.779395089 -0300
-@@ -26,11 +26,6 @@
+diff -rauN clementine-1.1.0/src/engines/gstenginepipeline.cpp clementine-libre-1.1.0/src/engines/gstenginepipeline.cpp
+--- clementine-1.1.0/src/engines/gstenginepipeline.cpp 2012-10-25 03:04:21.000000000 -0200
++++ clementine-libre-1.1.0/src/engines/gstenginepipeline.cpp 2012-10-26 02:14:35.834075631 -0200
+@@ -30,11 +30,6 @@
#include "core/utilities.h"
#include "internet/internetmodel.h"
@@ -793,10 +465,10 @@ diff -rauN clementine-1.0.1/src/engines/gstenginepipeline.cpp clementine-libre-1
-# include "internet/spotifyservice.h"
-#endif
-
- #include <QtConcurrentRun>
-
const int GstEnginePipeline::kGstStateTimeoutNanosecs = 10000000;
-@@ -131,36 +126,6 @@
+ const int GstEnginePipeline::kFaderFudgeMsec = 2000;
+
+@@ -139,42 +134,11 @@
bool GstEnginePipeline::ReplaceDecodeBin(const QUrl& url) {
GstElement* new_bin = NULL;
@@ -832,2349 +504,36 @@ diff -rauN clementine-1.0.1/src/engines/gstenginepipeline.cpp clementine-libre-1
- } else {
new_bin = engine_->CreateElement("uridecodebin");
g_object_set(G_OBJECT(new_bin), "uri", url.toEncoded().constData(), NULL);
- g_object_set(G_OBJECT(new_bin), "buffer-duration", buffer_duration_nanosec_, NULL);
-@@ -169,7 +134,6 @@
- g_signal_connect(G_OBJECT(new_bin), "drained", G_CALLBACK(SourceDrainedCallback), this);
- g_signal_connect(G_OBJECT(new_bin), "pad-added", G_CALLBACK(NewPadCallback), this);
- g_signal_connect(G_OBJECT(new_bin), "notify::source", G_CALLBACK(SourceSetupCallback), this);
+ 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 -rauN clementine-1.0.1/src/globalsearch/spotifysearchprovider.cpp /dev/null
---- clementine-1.0.1/src/globalsearch/spotifysearchprovider.cpp 2011-12-02 19:24:44.000000000 -0200
-+++ /dev/null 2012-05-28 12:50:04.796939473 -0300
-@@ -1,208 +0,0 @@
--/* This file is part of Clementine.
-- Copyright 2010, David Sansome <me@davidsansome.com>
--
-- Clementine is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
--
-- Clementine is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with Clementine. If not, see <http://www.gnu.org/licenses/>.
--*/
--
--#include "spotifysearchprovider.h"
--#include "core/logging.h"
--#include "internet/internetmodel.h"
--#include "internet/spotifyserver.h"
--#include "internet/spotifyservice.h"
--#include "playlist/songmimedata.h"
--#include "spotifyblob/common/spotifymessagehandler.h"
--
--SpotifySearchProvider::SpotifySearchProvider(QObject* parent)
-- : SearchProvider(parent),
-- server_(NULL),
-- service_(NULL)
--{
-- Init("Spotify", "spotify", QIcon(":icons/32x32/spotify.png"),
-- WantsDelayedQueries | WantsSerialisedArtQueries | ArtIsProbablyRemote |
-- CanShowConfig);
--}
--
--SpotifyServer* SpotifySearchProvider::server() {
-- if (server_)
-- return server_;
--
-- if (!service_)
-- service_ = InternetModel::Service<SpotifyService>();
--
-- if (service_->login_state() != SpotifyService::LoginState_LoggedIn)
-- return NULL;
--
-- server_ = service_->server();
-- connect(server_, SIGNAL(SearchResults(spotify_pb::SearchResponse)),
-- SLOT(SearchFinishedSlot(spotify_pb::SearchResponse)));
-- connect(server_, SIGNAL(ImageLoaded(QString,QImage)),
-- SLOT(ArtLoadedSlot(QString,QImage)));
-- connect(server_, SIGNAL(AlbumBrowseResults(spotify_pb::BrowseAlbumResponse)),
-- SLOT(AlbumBrowseResponse(spotify_pb::BrowseAlbumResponse)));
-- connect(server_, SIGNAL(destroyed()), SLOT(ServerDestroyed()));
--
-- return server_;
--}
--
--void SpotifySearchProvider::ServerDestroyed() {
-- server_ = NULL;
--}
--
--void SpotifySearchProvider::SearchAsync(int id, const QString& query) {
-- SpotifyServer* s = server();
-- if (!s) {
-- emit SearchFinished(id);
-- return;
-- }
--
-- PendingState state;
-- state.orig_id_ = id;
-- state.tokens_ = TokenizeQuery(query);
--
-- const QString query_string = state.tokens_.join(" ");
-- s->Search(query_string, 5, 5);
-- queries_[query_string] = state;
--}
--
--void SpotifySearchProvider::SearchFinishedSlot(const spotify_pb::SearchResponse& response) {
-- QString query_string = QString::fromUtf8(response.request().query().c_str());
-- QMap<QString, PendingState>::iterator it = queries_.find(query_string);
-- if (it == queries_.end())
-- return;
--
-- PendingState state = it.value();
-- queries_.erase(it);
--
-- ResultList ret;
-- for (int i=0; i < response.result_size() ; ++i) {
-- const spotify_pb::Track& track = response.result(i);
--
-- Result result(this);
-- result.type_ = globalsearch::Type_Track;
-- SpotifyService::SongFromProtobuf(track, &result.metadata_);
-- result.match_quality_ = MatchQuality(state.tokens_, result.metadata_.title());
--
-- ret << result;
-- }
--
-- for (int i=0 ; i<response.album_size() ; ++i) {
-- const spotify_pb::Album& album = response.album(i);
--
-- Result result(this);
-- result.type_ = globalsearch::Type_Album;
-- SpotifyService::SongFromProtobuf(album.metadata(), &result.metadata_);
-- result.match_quality_ =
-- qMin(MatchQuality(state.tokens_, result.metadata_.album()),
-- MatchQuality(state.tokens_, result.metadata_.artist()));
-- result.album_size_ = album.metadata().track();
--
-- for (int j=0; j < album.track_size() ; ++j) {
-- Song track_song;
-- SpotifyService::SongFromProtobuf(album.track(j), &track_song);
-- result.album_songs_ << track_song;
-- }
--
-- ret << result;
-- }
--
-- emit ResultsAvailable(state.orig_id_, ret);
-- emit SearchFinished(state.orig_id_);
--}
--
--void SpotifySearchProvider::LoadArtAsync(int id, const Result& result) {
-- SpotifyServer* s = server();
-- if (!s) {
-- emit ArtLoaded(id, QImage());
-- return;
-- }
--
-- QString image_id = QUrl(result.metadata_.art_automatic()).path();
-- if (image_id.startsWith('/'))
-- image_id.remove(0, 1);
--
-- pending_art_[image_id] = id;
-- s->LoadImage(image_id);
--}
--
--void SpotifySearchProvider::ArtLoadedSlot(const QString& id, const QImage& image) {
-- QMap<QString, int>::iterator it = pending_art_.find(id);
-- if (it == pending_art_.end())
-- return;
--
-- const int orig_id = it.value();
-- pending_art_.erase(it);
--
-- emit ArtLoaded(orig_id, ScaleAndPad(image));
--}
--
--void SpotifySearchProvider::LoadTracksAsync(int id, const Result& result) {
-- switch (result.type_) {
-- case globalsearch::Type_Track: {
-- SongMimeData* mime_data = new SongMimeData;
-- mime_data->songs = SongList() << result.metadata_;
-- emit TracksLoaded(id, mime_data);
-- break;
-- }
--
-- case globalsearch::Type_Album: {
-- SpotifyServer* s = server();
-- if (!s) {
-- emit TracksLoaded(id, NULL);
-- return;
-- }
--
-- QString uri = result.metadata_.url().toString();
--
-- pending_tracks_[uri] = id;
-- s->AlbumBrowse(uri);
-- break;
-- }
--
-- default:
-- break;
-- }
--}
--
--void SpotifySearchProvider::AlbumBrowseResponse(const spotify_pb::BrowseAlbumResponse& response) {
-- QString uri = QStringFromStdString(response.uri());
-- QMap<QString, int>::iterator it = pending_tracks_.find(uri);
-- if (it == pending_tracks_.end())
-- return;
--
-- const int orig_id = it.value();
-- pending_tracks_.erase(it);
--
-- SongMimeData* mime_data = new SongMimeData;
--
-- for (int i=0 ; i<response.track_size() ; ++i) {
-- Song song;
-- SpotifyService::SongFromProtobuf(response.track(i), &song);
-- mime_data->songs << song;
-- }
--
-- emit TracksLoaded(orig_id, mime_data);
--}
--
--bool SpotifySearchProvider::IsLoggedIn() {
-- if (server()) {
-- return service_->IsLoggedIn();
-- }
-- return false;
--}
--
--void SpotifySearchProvider::ShowConfig() {
-- if (service_) {
-- return service_->ShowConfig();
-- }
--}
-diff -rauN clementine-1.0.1/src/globalsearch/spotifysearchprovider.h /dev/null
---- clementine-1.0.1/src/globalsearch/spotifysearchprovider.h 2011-12-02 19:24:44.000000000 -0200
-+++ /dev/null 2012-05-28 12:50:04.796939473 -0300
-@@ -1,60 +0,0 @@
--/* This file is part of Clementine.
-- Copyright 2010, David Sansome <me@davidsansome.com>
--
-- Clementine is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
--
-- Clementine is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with Clementine. If not, see <http://www.gnu.org/licenses/>.
--*/
--
--#ifndef SPOTIFYSEARCHPROVIDER_H
--#define SPOTIFYSEARCHPROVIDER_H
--
--#include "searchprovider.h"
--#include "spotifyblob/common/spotifymessages.pb.h"
--
--class SpotifyServer;
--class SpotifyService;
--
--
--class SpotifySearchProvider : public SearchProvider {
-- Q_OBJECT
--
--public:
-- SpotifySearchProvider(QObject* parent = 0);
--
-- void SearchAsync(int id, const QString& query);
-- void LoadArtAsync(int id, const Result& result);
-- void LoadTracksAsync(int id, const Result& result);
--
-- bool IsLoggedIn();
-- void ShowConfig();
--
--private slots:
-- void ServerDestroyed();
-- void SearchFinishedSlot(const spotify_pb::SearchResponse& response);
-- void ArtLoadedSlot(const QString& id, const QImage& image);
--
-- void AlbumBrowseResponse(const spotify_pb::BrowseAlbumResponse& response);
--
--private:
-- SpotifyServer* server();
--
--private:
-- SpotifyServer* server_;
-- SpotifyService* service_;
--
-- QMap<QString, PendingState> queries_;
-- QMap<QString, int> pending_art_;
-- QMap<QString, int> pending_tracks_;
--};
--
--#endif // SPOTIFYSEARCHPROVIDER_H
-diff -rauN clementine-1.0.1/src/internet/internetmodel.cpp clementine-libre-1.0.1/src/internet/internetmodel.cpp
---- clementine-1.0.1/src/internet/internetmodel.cpp 2011-12-02 19:24:44.000000000 -0200
-+++ clementine-libre-1.0.1/src/internet/internetmodel.cpp 2012-05-28 18:56:58.934758916 -0300
-@@ -32,9 +32,6 @@
+diff -rauN clementine-1.1.0/src/internet/internetmodel.cpp clementine-libre-1.1.0/src/internet/internetmodel.cpp
+--- clementine-1.1.0/src/internet/internetmodel.cpp 2012-10-22 04:24:28.000000000 -0200
++++ clementine-libre-1.1.0/src/internet/internetmodel.cpp 2012-10-26 02:15:18.005072563 -0200
+@@ -34,9 +34,6 @@
#ifdef HAVE_LIBLASTFM
#include "lastfmservice.h"
#endif
-#ifdef HAVE_SPOTIFY
- #include "spotifyservice.h"
-#endif
-
- #include <QMimeData>
- #include <QtDebug>
-@@ -75,9 +72,6 @@
- AddService(new SavedRadio(this));
- AddService(new SkyFmService(this));
- AddService(new SomaFMService(this));
+ #ifdef HAVE_GOOGLE_DRIVE
+ #include "googledriveservice.h"
+ #endif
+@@ -79,9 +76,6 @@
+ AddService(new SkyFmService(app, this));
+ AddService(new SomaFMService(app, this));
+ AddService(new SoundCloudService(app, this));
-#ifdef HAVE_SPOTIFY
-- AddService(new SpotifyService(this));
+- AddService(new SpotifyService(app, this));
-#endif
}
void InternetModel::AddService(InternetService *service) {
-diff -rauN clementine-1.0.1/src/internet/spotifyblobdownloader.cpp /dev/null
---- clementine-1.0.1/src/internet/spotifyblobdownloader.cpp 2011-12-02 19:24:44.000000000 -0200
-+++ /dev/null 2012-05-28 12:50:04.796939473 -0300
-@@ -1,222 +0,0 @@
--/* This file is part of Clementine.
-- Copyright 2010, David Sansome <me@davidsansome.com>
--
-- Clementine is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
--
-- Clementine is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with Clementine. If not, see <http://www.gnu.org/licenses/>.
--*/
--
--#include "config.h"
--#include "spotifyblobdownloader.h"
--#include "spotifyservice.h"
--#include "core/logging.h"
--#include "core/network.h"
--#include "core/utilities.h"
--
--#include <QDir>
--#include <QMessageBox>
--#include <QNetworkReply>
--#include <QProgressDialog>
--
--#ifdef HAVE_QCA
-- #include <QtCrypto>
--#endif // HAVE_QCA
--
--const char* SpotifyBlobDownloader::kSignatureSuffix = ".sha1";
--
--
--SpotifyBlobDownloader::SpotifyBlobDownloader(
-- const QString& version, const QString& path, QObject* parent)
-- : QObject(parent),
-- version_(version),
-- path_(path),
-- network_(new NetworkAccessManager(this)),
-- progress_(new QProgressDialog(tr("Downloading Spotify plugin"), tr("Cancel"), 0, 0))
--{
-- progress_->setWindowTitle(QCoreApplication::applicationName());
-- connect(progress_, SIGNAL(canceled()), SLOT(Cancel()));
--}
--
--SpotifyBlobDownloader::~SpotifyBlobDownloader() {
-- qDeleteAll(replies_);
-- replies_.clear();
--
-- delete progress_;
--}
--
--bool SpotifyBlobDownloader::Prompt() {
-- QMessageBox::StandardButton ret = QMessageBox::question(NULL,
-- tr("Spotify plugin not installed"),
-- tr("An additional plugin is required to use Spotify in Clementine. Would you like to download and install it now?"),
-- QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
-- return ret == QMessageBox::Yes;
--}
--
--void SpotifyBlobDownloader::Start() {
-- qDeleteAll(replies_);
-- replies_.clear();
--
-- const QStringList filenames = QStringList()
-- << "blob"
-- << "blob" + QString(kSignatureSuffix)
-- << "libspotify.so.10.1.16"
-- << "libspotify.so.10.1.16" + QString(kSignatureSuffix);
--
-- foreach (const QString& filename, filenames) {
-- const QUrl url(SpotifyService::kBlobDownloadUrl + version_ + "/" + filename);
-- qLog(Info) << "Downloading" << url;
--
-- QNetworkReply* reply = network_->get(QNetworkRequest(url));
-- connect(reply, SIGNAL(finished()), SLOT(ReplyFinished()));
-- connect(reply, SIGNAL(downloadProgress(qint64,qint64)), SLOT(ReplyProgress()));
--
-- replies_ << reply;
-- }
--
-- progress_->show();
--}
--
--void SpotifyBlobDownloader::ReplyFinished() {
-- QNetworkReply* reply = qobject_cast<QNetworkReply*>(sender());
-- if (reply->error() != QNetworkReply::NoError) {
-- // Handle network errors
-- ShowError(reply->errorString());
-- return;
-- }
--
-- // Is everything finished?
-- foreach (QNetworkReply* reply, replies_) {
-- if (!reply->isFinished()) {
-- return;
-- }
-- }
--
-- // Read files into memory first.
-- QMap<QString, QByteArray> file_data;
-- QStringList signature_filenames;
--
-- foreach (QNetworkReply* reply, replies_) {
-- const QString filename = reply->url().path().section('/', -1, -1);
--
-- if (filename.endsWith(kSignatureSuffix)) {
-- signature_filenames << filename;
-- }
--
-- file_data[filename] = reply->readAll();
-- }
--
--#ifdef HAVE_QCA
-- // Load the public key
-- QCA::ConvertResult conversion_result;
-- QCA::PublicKey key = QCA::PublicKey::fromPEMFile(":/clementine-spotify-public.pem",
-- &conversion_result);
-- if (QCA::ConvertGood != conversion_result) {
-- ShowError("Failed to load Spotify public key");
-- return;
-- }
--
-- // Verify signatures
-- foreach (const QString& signature_filename, signature_filenames) {
-- QString actual_filename = signature_filename;
-- actual_filename.remove(kSignatureSuffix);
--
-- qLog(Debug) << "Verifying" << actual_filename << "against" << signature_filename;
--
-- if (!key.verifyMessage(file_data[actual_filename],
-- file_data[signature_filename],
-- QCA::EMSA3_SHA1)) {
-- ShowError("Invalid signature: " + actual_filename);
-- return;
-- }
-- }
--#endif // HAVE_QCA
--
-- // Make the destination directory and write the files into it
-- QDir().mkpath(path_);
--
-- foreach (const QString& filename, file_data.keys()) {
-- const QString dest_path = path_ + "/" + filename;
--
-- if (filename.endsWith(kSignatureSuffix))
-- continue;
--
-- qLog(Info) << "Writing" << dest_path;
--
-- QFile file(dest_path);
-- if (!file.open(QIODevice::WriteOnly)) {
-- ShowError("Failed to open " + dest_path + " for writing");
-- return;
-- }
--
-- file.write(file_data[filename]);
-- file.close();
-- file.setPermissions(QFile::Permissions(0x7755));
--
--#ifdef Q_OS_UNIX
-- const int so_pos = filename.lastIndexOf(".so.");
-- if (so_pos != -1) {
-- QString link_path = path_ + "/" + filename.left(so_pos + 3);
-- QStringList version_parts = filename.mid(so_pos + 4).split('.');
--
-- while (!version_parts.isEmpty()) {
-- qLog(Debug) << "Linking" << dest_path << "to" << link_path;
-- int ret = symlink(dest_path.toLocal8Bit().constData(),
-- link_path.toLocal8Bit().constData());
--
-- if (ret != 0) {
-- qLog(Warning) << "Creating symlink failed with return code" << ret;
-- }
--
-- link_path += "." + version_parts.takeFirst();
-- }
-- }
--#endif // Q_OS_UNIX
-- }
--
-- EmitFinished();
--}
--
--void SpotifyBlobDownloader::ReplyProgress() {
-- int progress = 0;
-- int total = 0;
--
-- foreach (QNetworkReply* reply, replies_) {
-- progress += reply->bytesAvailable();
-- total += reply->rawHeader("Content-Length").toInt();
-- }
--
-- progress_->setMaximum(total);
-- progress_->setValue(progress);
--}
--
--void SpotifyBlobDownloader::Cancel() {
-- deleteLater();
--}
--
--void SpotifyBlobDownloader::ShowError(const QString& message) {
-- // Stop any remaining replies before showing the dialog so they don't
-- // carry on in the background
-- foreach (QNetworkReply* reply, replies_) {
-- disconnect(reply, 0, this, 0);
-- reply->abort();
-- }
--
-- qLog(Warning) << message;
-- QMessageBox::warning(NULL, tr("Error downloading Spotify plugin"), message,
-- QMessageBox::Close);
-- deleteLater();
--}
--
--void SpotifyBlobDownloader::EmitFinished() {
-- emit Finished();
-- deleteLater();
--}
-diff -rauN clementine-1.0.1/src/internet/spotifyblobdownloader.h /dev/null
---- clementine-1.0.1/src/internet/spotifyblobdownloader.h 2011-12-02 19:24:44.000000000 -0200
-+++ /dev/null 2012-05-28 12:50:04.796939473 -0300
-@@ -1,63 +0,0 @@
--/* This file is part of Clementine.
-- Copyright 2010, David Sansome <me@davidsansome.com>
--
-- Clementine is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
--
-- Clementine is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with Clementine. If not, see <http://www.gnu.org/licenses/>.
--*/
--
--#ifndef SPOTIFYBLOBDOWNLOADER_H
--#define SPOTIFYBLOBDOWNLOADER_H
--
--#include <QObject>
--
--class QNetworkAccessManager;
--class QNetworkReply;
--class QProgressDialog;
--
--class SpotifyBlobDownloader : public QObject {
-- Q_OBJECT
--
--public:
-- SpotifyBlobDownloader(const QString& version, const QString& path,
-- QObject* parent = 0);
-- ~SpotifyBlobDownloader();
--
-- static const char* kSignatureSuffix;
--
-- static bool Prompt();
--
-- void Start();
--
--signals:
-- void Finished();
--
--private slots:
-- void ReplyFinished();
-- void ReplyProgress();
-- void Cancel();
--
--private:
-- void ShowError(const QString& message);
-- void EmitFinished();
--
--private:
-- QString version_;
-- QString path_;
--
-- QNetworkAccessManager* network_;
-- QList<QNetworkReply*> replies_;
--
-- QProgressDialog* progress_;
--};
--
--#endif // SPOTIFYBLOBDOWNLOADER_H
-diff -rauN clementine-1.0.1/src/internet/spotifysearchplaylisttype.cpp /dev/null
---- clementine-1.0.1/src/internet/spotifysearchplaylisttype.cpp 2011-12-02 19:24:44.000000000 -0200
-+++ /dev/null 2012-05-28 12:50:04.796939473 -0300
-@@ -1,49 +0,0 @@
--/* This file is part of Clementine.
-- Copyright 2010, David Sansome <me@davidsansome.com>
--
-- Clementine is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
--
-- Clementine is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with Clementine. If not, see <http://www.gnu.org/licenses/>.
--*/
--
--#include "spotifysearchplaylisttype.h"
--#include "spotifyservice.h"
--
--const char* SpotifySearchPlaylistType::kName = "spotify-search";
--
--SpotifySearchPlaylistType::SpotifySearchPlaylistType(SpotifyService* service)
-- : service_(service) {
--}
--
--QIcon SpotifySearchPlaylistType::icon(Playlist* playlist) const {
-- return QIcon(":icons/32x32/spotify.png");
--}
--
--QString SpotifySearchPlaylistType::search_hint_text(Playlist* playlist) const {
-- return QObject::tr("Search Spotify");
--}
--
--QString SpotifySearchPlaylistType::empty_playlist_text(Playlist* playlist) const {
-- return QObject::tr("Start typing in the search box above to find music on %1.").arg("Spotify");
--}
--
--bool SpotifySearchPlaylistType::has_special_search_behaviour(Playlist* playlist) const {
-- return true;
--}
--
--void SpotifySearchPlaylistType::Search(const QString& text, Playlist* playlist) {
-- service_->Search(text, playlist);
--}
--
--void SpotifySearchPlaylistType::DidYouMeanClicked(const QString& text, Playlist* playlist) {
-- service_->Search(text, playlist, true);
--}
-diff -rauN clementine-1.0.1/src/internet/spotifysearchplaylisttype.h /dev/null
---- clementine-1.0.1/src/internet/spotifysearchplaylisttype.h 2011-12-02 19:24:44.000000000 -0200
-+++ /dev/null 2012-05-28 12:50:04.796939473 -0300
-@@ -1,44 +0,0 @@
--/* This file is part of Clementine.
-- Copyright 2010, David Sansome <me@davidsansome.com>
--
-- Clementine is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
--
-- Clementine is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with Clementine. If not, see <http://www.gnu.org/licenses/>.
--*/
--
--#ifndef SPOTIFYSEARCHPLAYLISTTYPE_H
--#define SPOTIFYSEARCHPLAYLISTTYPE_H
--
--#include "playlist/specialplaylisttype.h"
--
--class SpotifyService;
--
--class SpotifySearchPlaylistType : public SpecialPlaylistType {
--public:
-- SpotifySearchPlaylistType(SpotifyService* service);
--
-- static const char* kName;
-- virtual QString name() const { return kName; }
--
-- virtual QIcon icon(Playlist* playlist) const;
-- virtual QString search_hint_text(Playlist* playlist) const;
-- virtual QString empty_playlist_text(Playlist* playlist) const;
--
-- virtual bool has_special_search_behaviour(Playlist* playlist) const;
-- virtual void Search(const QString& text, Playlist* playlist);
-- virtual void DidYouMeanClicked(const QString& text, Playlist* playlist);
--
--private:
-- SpotifyService* service_;
--};
--
--#endif // SPOTIFYSEARCHPLAYLISTTYPE_H
-diff -rauN clementine-1.0.1/src/internet/spotifyserver.cpp /dev/null
---- clementine-1.0.1/src/internet/spotifyserver.cpp 2011-12-02 19:24:44.000000000 -0200
-+++ /dev/null 2012-05-28 12:50:04.796939473 -0300
-@@ -1,261 +0,0 @@
--/* This file is part of Clementine.
-- Copyright 2010, David Sansome <me@davidsansome.com>
--
-- Clementine is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
--
-- Clementine is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with Clementine. If not, see <http://www.gnu.org/licenses/>.
--*/
--
--#include "spotifyserver.h"
--#include "core/closure.h"
--#include "core/logging.h"
--
--#include "spotifyblob/common/spotifymessages.pb.h"
--#include "spotifyblob/common/spotifymessagehandler.h"
--
--#include <QTcpServer>
--#include <QTcpSocket>
--#include <QTimer>
--
--SpotifyServer::SpotifyServer(QObject* parent)
-- : QObject(parent),
-- server_(new QTcpServer(this)),
-- protocol_socket_(NULL),
-- handler_(NULL),
-- logged_in_(false)
--{
-- connect(server_, SIGNAL(newConnection()), SLOT(NewConnection()));
--}
--
--void SpotifyServer::Init() {
-- if (!server_->listen(QHostAddress::LocalHost)) {
-- qLog(Error) << "Couldn't open server socket" << server_->errorString();
-- }
--}
--
--int SpotifyServer::server_port() const {
-- return server_->serverPort();
--}
--
--void SpotifyServer::NewConnection() {
-- delete protocol_socket_;
-- delete handler_;
--
-- protocol_socket_ = server_->nextPendingConnection();
-- handler_ = new SpotifyMessageHandler(protocol_socket_, this);
-- connect(handler_, SIGNAL(MessageArrived(spotify_pb::SpotifyMessage)),
-- SLOT(HandleMessage(spotify_pb::SpotifyMessage)));
--
-- qLog(Info) << "Connection from port" << protocol_socket_->peerPort();
--
-- // Send any login messages that were queued before the client connected
-- foreach (const spotify_pb::SpotifyMessage& message, queued_login_messages_) {
-- SendMessage(message);
-- }
-- queued_login_messages_.clear();
--}
--
--void SpotifyServer::SendMessage(const spotify_pb::SpotifyMessage& message) {
-- const bool is_login_message = message.has_login_request();
--
-- QList<spotify_pb::SpotifyMessage>* queue =
-- is_login_message ? &queued_login_messages_ : &queued_messages_;
--
-- if (!protocol_socket_ || (!is_login_message && !logged_in_)) {
-- queue->append(message);
-- } else {
-- handler_->SendMessage(message);
-- }
--}
--
--void SpotifyServer::Login(const QString& username, const QString& password,
-- spotify_pb::Bitrate bitrate, bool volume_normalisation) {
-- spotify_pb::SpotifyMessage message;
--
-- spotify_pb::LoginRequest* request = message.mutable_login_request();
-- request->set_username(DataCommaSizeFromQString(username));
-- if (!password.isEmpty()) {
-- request->set_password(DataCommaSizeFromQString(password));
-- }
-- request->mutable_playback_settings()->set_bitrate(bitrate);
-- request->mutable_playback_settings()->set_volume_normalisation(volume_normalisation);
--
-- SendMessage(message);
--}
--
--void SpotifyServer::SetPlaybackSettings(spotify_pb::Bitrate bitrate, bool volume_normalisation) {
-- spotify_pb::SpotifyMessage message;
--
-- spotify_pb::PlaybackSettings* request = message.mutable_set_playback_settings_request();
-- request->set_bitrate(bitrate);
-- request->set_volume_normalisation(volume_normalisation);
--
-- SendMessage(message);
--}
--
--void SpotifyServer::HandleMessage(const spotify_pb::SpotifyMessage& message) {
-- if (message.has_login_response()) {
-- const spotify_pb::LoginResponse& response = message.login_response();
-- logged_in_ = response.success();
--
-- if (response.success()) {
-- // Send any messages that were queued before the client logged in
-- foreach (const spotify_pb::SpotifyMessage& message, queued_messages_) {
-- SendMessage(message);
-- }
-- queued_messages_.clear();
-- }
--
-- emit LoginCompleted(response.success(), QStringFromStdString(response.error()),
-- response.error_code());
-- } else if (message.has_playlists_updated()) {
-- emit PlaylistsUpdated(message.playlists_updated());
-- } else if (message.has_load_playlist_response()) {
-- const spotify_pb::LoadPlaylistResponse& response = message.load_playlist_response();
--
-- switch (response.request().type()) {
-- case spotify_pb::Inbox:
-- emit InboxLoaded(response);
-- break;
--
-- case spotify_pb::Starred:
-- emit StarredLoaded(response);
-- break;
--
-- case spotify_pb::UserPlaylist:
-- emit UserPlaylistLoaded(response);
-- break;
-- }
-- } else if (message.has_playback_error()) {
-- emit PlaybackError(QStringFromStdString(message.playback_error().error()));
-- } else if (message.has_search_response()) {
-- emit SearchResults(message.search_response());
-- } else if (message.has_image_response()) {
-- const spotify_pb::ImageResponse& response = message.image_response();
-- const QString id = QStringFromStdString(response.id());
--
-- if (response.has_data()) {
-- emit ImageLoaded(id, QImage::fromData(QByteArray(
-- response.data().data(), response.data().size())));
-- } else {
-- emit ImageLoaded(id, QImage());
-- }
-- } else if (message.has_sync_playlist_progress()) {
-- emit SyncPlaylistProgress(message.sync_playlist_progress());
-- } else if (message.has_browse_album_response()) {
-- emit AlbumBrowseResults(message.browse_album_response());
-- }
--}
--
--void SpotifyServer::LoadPlaylist(spotify_pb::PlaylistType type, int index) {
-- spotify_pb::SpotifyMessage message;
-- spotify_pb::LoadPlaylistRequest* req = message.mutable_load_playlist_request();
--
-- req->set_type(type);
-- if (index != -1) {
-- req->set_user_playlist_index(index);
-- }
--
-- SendMessage(message);
--}
--
--void SpotifyServer::SyncPlaylist(
-- spotify_pb::PlaylistType type, int index, bool offline) {
-- spotify_pb::SpotifyMessage message;
-- spotify_pb::SyncPlaylistRequest* req = message.mutable_sync_playlist_request();
-- req->mutable_request()->set_type(type);
-- if (index != -1) {
-- req->mutable_request()->set_user_playlist_index(index);
-- }
-- req->set_offline_sync(offline);
--
-- SendMessage(message);
--}
--
--void SpotifyServer::SyncInbox() {
-- SyncPlaylist(spotify_pb::Inbox, -1, true);
--}
--
--void SpotifyServer::SyncStarred() {
-- SyncPlaylist(spotify_pb::Starred, -1, true);
--}
--
--void SpotifyServer::SyncUserPlaylist(int index) {
-- Q_ASSERT(index >= 0);
-- SyncPlaylist(spotify_pb::UserPlaylist, index, true);
--}
--
--void SpotifyServer::LoadInbox() {
-- LoadPlaylist(spotify_pb::Inbox);
--}
--
--void SpotifyServer::LoadStarred() {
-- LoadPlaylist(spotify_pb::Starred);
--}
--
--void SpotifyServer::LoadUserPlaylist(int index) {
-- Q_ASSERT(index >= 0);
-- LoadPlaylist(spotify_pb::UserPlaylist, index);
--}
--
--void SpotifyServer::StartPlaybackLater(const QString& uri, quint16 port) {
-- QTimer* timer = new QTimer(this);
-- connect(timer, SIGNAL(timeout()), timer, SLOT(deleteLater()));
--
-- timer->start(100); // lol
-- NewClosure(timer, SIGNAL(timeout()),
-- this, SLOT(StartPlayback(QString,quint16)),
-- uri, port);
--}
--
--void SpotifyServer::StartPlayback(const QString& uri, quint16 port) {
-- spotify_pb::SpotifyMessage message;
-- spotify_pb::PlaybackRequest* req = message.mutable_playback_request();
--
-- req->set_track_uri(DataCommaSizeFromQString(uri));
-- req->set_media_port(port);
-- SendMessage(message);
--}
--
--void SpotifyServer::Seek(qint64 offset_bytes) {
-- spotify_pb::SpotifyMessage message;
-- spotify_pb::SeekRequest* req = message.mutable_seek_request();
--
-- req->set_offset_bytes(offset_bytes);
-- SendMessage(message);
--}
--
--void SpotifyServer::Search(const QString& text, int limit, int limit_album) {
-- spotify_pb::SpotifyMessage message;
-- spotify_pb::SearchRequest* req = message.mutable_search_request();
--
-- req->set_query(DataCommaSizeFromQString(text));
-- req->set_limit(limit);
-- req->set_limit_album(limit_album);
-- SendMessage(message);
--}
--
--void SpotifyServer::LoadImage(const QString& id) {
-- spotify_pb::SpotifyMessage message;
-- spotify_pb::ImageRequest* req = message.mutable_image_request();
--
-- req->set_id(DataCommaSizeFromQString(id));
-- SendMessage(message);
--}
--
--void SpotifyServer::AlbumBrowse(const QString& uri) {
-- spotify_pb::SpotifyMessage message;
-- spotify_pb::BrowseAlbumRequest* req = message.mutable_browse_album_request();
--
-- req->set_uri(DataCommaSizeFromQString(uri));
-- SendMessage(message);
--}
-diff -rauN clementine-1.0.1/src/internet/spotifyserver.h /dev/null
---- clementine-1.0.1/src/internet/spotifyserver.h 2011-12-02 19:24:44.000000000 -0200
-+++ /dev/null 2012-05-28 12:50:04.796939473 -0300
-@@ -1,91 +0,0 @@
--/* This file is part of Clementine.
-- Copyright 2010, David Sansome <me@davidsansome.com>
--
-- Clementine is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
--
-- Clementine is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with Clementine. If not, see <http://www.gnu.org/licenses/>.
--*/
--
--#ifndef SPOTIFYSERVER_H
--#define SPOTIFYSERVER_H
--
--#include "spotifyblob/common/spotifymessages.pb.h"
--
--#include <QImage>
--#include <QObject>
--
--class SpotifyMessageHandler;
--
--class QTcpServer;
--class QTcpSocket;
--
--class SpotifyServer : public QObject {
-- Q_OBJECT
--
--public:
-- SpotifyServer(QObject* parent = 0);
--
-- void Init();
-- void Login(const QString& username, const QString& password,
-- spotify_pb::Bitrate bitrate, bool volume_normalisation);
--
-- void LoadStarred();
-- void SyncStarred();
-- void LoadInbox();
-- void SyncInbox();
-- void LoadUserPlaylist(int index);
-- void SyncUserPlaylist(int index);
-- void StartPlaybackLater(const QString& uri, quint16 port);
-- void Search(const QString& text, int limit, int limit_album = 0);
-- void LoadImage(const QString& id);
-- void AlbumBrowse(const QString& uri);
-- void SetPlaybackSettings(spotify_pb::Bitrate bitrate, bool volume_normalisation);
--
-- int server_port() const;
--
--public slots:
-- void StartPlayback(const QString& uri, quint16 port);
-- void Seek(qint64 offset_bytes);
--
--signals:
-- void LoginCompleted(bool success, const QString& error,
-- spotify_pb::LoginResponse_Error error_code);
-- void PlaylistsUpdated(const spotify_pb::Playlists& playlists);
--
-- void StarredLoaded(const spotify_pb::LoadPlaylistResponse& response);
-- void InboxLoaded(const spotify_pb::LoadPlaylistResponse& response);
-- void UserPlaylistLoaded(const spotify_pb::LoadPlaylistResponse& response);
-- void PlaybackError(const QString& message);
-- void SearchResults(const spotify_pb::SearchResponse& response);
-- void ImageLoaded(const QString& id, const QImage& image);
-- void SyncPlaylistProgress(const spotify_pb::SyncPlaylistProgress& progress);
-- void AlbumBrowseResults(const spotify_pb::BrowseAlbumResponse& response);
--
--private slots:
-- void NewConnection();
-- void HandleMessage(const spotify_pb::SpotifyMessage& message);
--
--private:
-- void LoadPlaylist(spotify_pb::PlaylistType type, int index = -1);
-- void SyncPlaylist(spotify_pb::PlaylistType type, int index, bool offline);
-- void SendMessage(const spotify_pb::SpotifyMessage& message);
--
-- QTcpServer* server_;
-- QTcpSocket* protocol_socket_;
-- SpotifyMessageHandler* handler_;
-- bool logged_in_;
--
-- QList<spotify_pb::SpotifyMessage> queued_login_messages_;
-- QList<spotify_pb::SpotifyMessage> queued_messages_;
--};
--
--#endif // SPOTIFYSERVER_H
-diff -rauN clementine-1.0.1/src/internet/spotifyservice.cpp /dev/null
---- clementine-1.0.1/src/internet/spotifyservice.cpp 2011-12-02 19:24:44.000000000 -0200
-+++ /dev/null 2012-05-28 12:50:04.796939473 -0300
-@@ -1,669 +0,0 @@
--#include "config.h"
--#include "internetmodel.h"
--#include "spotifyblobdownloader.h"
--#include "spotifyserver.h"
--#include "spotifyservice.h"
--#include "spotifysearchplaylisttype.h"
--#include "core/database.h"
--#include "core/logging.h"
--#include "core/player.h"
--#include "core/taskmanager.h"
--#include "core/timeconstants.h"
--#include "core/utilities.h"
--#include "globalsearch/globalsearch.h"
--#include "globalsearch/spotifysearchprovider.h"
--#include "playlist/playlist.h"
--#include "playlist/playlistcontainer.h"
--#include "playlist/playlistmanager.h"
--#include "spotifyblob/common/blobversion.h"
--#include "spotifyblob/common/spotifymessagehandler.h"
--#include "widgets/didyoumean.h"
--#include "ui/iconloader.h"
--
--#include <QCoreApplication>
--#include <QFile>
--#include <QFileInfo>
--#include <QMenu>
--#include <QMessageBox>
--#include <QProcess>
--#include <QSettings>
--#include <QVariant>
--
--Q_DECLARE_METATYPE(QStandardItem*);
--
--const char* SpotifyService::kServiceName = "Spotify";
--const char* SpotifyService::kSettingsGroup = "Spotify";
--const char* SpotifyService::kBlobDownloadUrl = "http://spotify.clementine-player.org/";
--const int SpotifyService::kSearchDelayMsec = 400;
--
--SpotifyService::SpotifyService(InternetModel* parent)
-- : InternetService(kServiceName, parent, parent),
-- server_(NULL),
-- blob_process_(NULL),
-- root_(NULL),
-- search_(NULL),
-- starred_(NULL),
-- inbox_(NULL),
-- login_task_id_(0),
-- pending_search_playlist_(NULL),
-- context_menu_(NULL),
-- search_delay_(new QTimer(this)),
-- login_state_(LoginState_OtherError),
-- bitrate_(spotify_pb::Bitrate320k),
-- volume_normalisation_(false)
--{
-- // Build the search path for the binary blob.
-- // Look for one distributed alongside clementine first, then check in the
-- // user's home directory for any that have been downloaded.
--#ifdef Q_OS_MAC
-- system_blob_path_ = QCoreApplication::applicationDirPath() +
-- "/../PlugIns/clementine-spotifyblob";
--#else
-- system_blob_path_ = QCoreApplication::applicationDirPath() +
-- "/clementine-spotifyblob" CMAKE_EXECUTABLE_SUFFIX;
--#endif
--
-- local_blob_version_ = QString("version%1-%2bit").arg(SPOTIFY_BLOB_VERSION).arg(sizeof(void*) * 8);
-- local_blob_path_ = Utilities::GetConfigPath(Utilities::Path_LocalSpotifyBlob) +
-- "/" + local_blob_version_ + "/blob";
--
-- qLog(Debug) << "Spotify system blob path:" << system_blob_path_;
-- qLog(Debug) << "Spotify local blob path:" << local_blob_path_;
--
-- model()->player()->playlists()->RegisterSpecialPlaylistType(
-- new SpotifySearchPlaylistType(this));
--
-- model()->global_search()->AddProvider(new SpotifySearchProvider(this));
--
-- search_delay_->setInterval(kSearchDelayMsec);
-- search_delay_->setSingleShot(true);
-- connect(search_delay_, SIGNAL(timeout()), SLOT(DoSearch()));
--}
--
--SpotifyService::~SpotifyService() {
-- if (blob_process_ && blob_process_->state() == QProcess::Running) {
-- qLog(Info) << "Terminating blob process...";
-- blob_process_->terminate();
-- blob_process_->waitForFinished(1000);
-- }
--}
--
--QStandardItem* SpotifyService::CreateRootItem() {
-- root_ = new QStandardItem(QIcon(":icons/22x22/spotify.png"), kServiceName);
-- root_->setData(true, InternetModel::Role_CanLazyLoad);
-- return root_;
--}
--
--void SpotifyService::LazyPopulate(QStandardItem* item) {
-- switch (item->data(InternetModel::Role_Type).toInt()) {
-- case InternetModel::Type_Service:
-- EnsureServerCreated();
-- break;
--
-- case Type_SearchResults:
-- break;
--
-- case Type_InboxPlaylist:
-- EnsureServerCreated();
-- server_->LoadInbox();
-- break;
--
-- case Type_StarredPlaylist:
-- EnsureServerCreated();
-- server_->LoadStarred();
-- break;
--
-- case InternetModel::Type_UserPlaylist:
-- EnsureServerCreated();
-- server_->LoadUserPlaylist(item->data(Role_UserPlaylistIndex).toInt());
-- break;
--
-- default:
-- break;
-- }
--
-- return;
--}
--
--QModelIndex SpotifyService::GetCurrentIndex() {
-- return QModelIndex();
--}
--
--void SpotifyService::Login(const QString& username, const QString& password) {
-- Logout();
-- EnsureServerCreated(username, password);
--}
--
--void SpotifyService::LoginCompleted(bool success, const QString& error,
-- spotify_pb::LoginResponse_Error error_code) {
-- if (login_task_id_) {
-- model()->task_manager()->SetTaskFinished(login_task_id_);
-- login_task_id_ = 0;
-- }
--
-- if (!success) {
-- bool show_error_dialog = true;
-- QString error_copy(error);
--
-- switch (error_code) {
-- case spotify_pb::LoginResponse_Error_BadUsernameOrPassword:
-- login_state_ = LoginState_BadCredentials;
-- break;
--
-- case spotify_pb::LoginResponse_Error_UserBanned:
-- login_state_ = LoginState_Banned;
-- break;
--
-- case spotify_pb::LoginResponse_Error_UserNeedsPremium:
-- login_state_ = LoginState_NoPremium;
-- break;
--
-- case spotify_pb::LoginResponse_Error_ReloginFailed:
-- if (login_state_ == LoginState_LoggedIn) {
-- // This is the first time the relogin has failed - show a message this
-- // time only.
-- error_copy = tr("You have been logged out of Spotify, please re-enter your password in the Settings dialog.");
-- } else {
-- show_error_dialog = false;
-- }
--
-- login_state_ = LoginState_ReloginFailed;
-- break;
--
-- default:
-- login_state_ = LoginState_OtherError;
-- break;
-- }
--
-- if (show_error_dialog) {
-- QMessageBox::warning(NULL, tr("Spotify login error"), error_copy, QMessageBox::Close);
-- }
-- } else {
-- login_state_ = LoginState_LoggedIn;
-- }
--
-- QSettings s;
-- s.beginGroup(kSettingsGroup);
-- s.setValue("login_state", login_state_);
--
-- emit LoginFinished(success);
--}
--
--void SpotifyService::BlobProcessError(QProcess::ProcessError error) {
-- qLog(Error) << "Spotify blob process failed:" << error;
-- blob_process_->deleteLater();
-- blob_process_ = NULL;
--
-- if (login_task_id_) {
-- model()->task_manager()->SetTaskFinished(login_task_id_);
-- }
--}
--
--void SpotifyService::ReloadSettings() {
-- QSettings s;
-- s.beginGroup(kSettingsGroup);
--
-- login_state_ = LoginState(s.value("login_state", LoginState_OtherError).toInt());
-- bitrate_ = static_cast<spotify_pb::Bitrate>(
-- s.value("bitrate", spotify_pb::Bitrate320k).toInt());
-- volume_normalisation_ = s.value("volume_normalisation", false).toBool();
--
-- if (server_ && blob_process_) {
-- server_->SetPlaybackSettings(bitrate_, volume_normalisation_);
-- }
--}
--
--void SpotifyService::EnsureServerCreated(const QString& username,
-- const QString& password) {
-- if (server_ && blob_process_) {
-- return;
-- }
--
-- delete server_;
-- server_ = new SpotifyServer(this);
--
-- connect(server_, SIGNAL(LoginCompleted(bool,QString,spotify_pb::LoginResponse_Error)),
-- SLOT(LoginCompleted(bool,QString,spotify_pb::LoginResponse_Error)));
-- connect(server_, SIGNAL(PlaylistsUpdated(spotify_pb::Playlists)),
-- SLOT(PlaylistsUpdated(spotify_pb::Playlists)));
-- connect(server_, SIGNAL(InboxLoaded(spotify_pb::LoadPlaylistResponse)),
-- SLOT(InboxLoaded(spotify_pb::LoadPlaylistResponse)));
-- connect(server_, SIGNAL(StarredLoaded(spotify_pb::LoadPlaylistResponse)),
-- SLOT(StarredLoaded(spotify_pb::LoadPlaylistResponse)));
-- connect(server_, SIGNAL(UserPlaylistLoaded(spotify_pb::LoadPlaylistResponse)),
-- SLOT(UserPlaylistLoaded(spotify_pb::LoadPlaylistResponse)));
-- connect(server_, SIGNAL(PlaybackError(QString)),
-- SIGNAL(StreamError(QString)));
-- connect(server_, SIGNAL(SearchResults(spotify_pb::SearchResponse)),
-- SLOT(SearchResults(spotify_pb::SearchResponse)));
-- connect(server_, SIGNAL(ImageLoaded(QString,QImage)),
-- SIGNAL(ImageLoaded(QString,QImage)));
-- connect(server_, SIGNAL(SyncPlaylistProgress(spotify_pb::SyncPlaylistProgress)),
-- SLOT(SyncPlaylistProgress(spotify_pb::SyncPlaylistProgress)));
--
-- server_->Init();
--
-- login_task_id_ = model()->task_manager()->StartTask(tr("Connecting to Spotify"));
--
-- QString login_username = username;
-- QString login_password = password;
--
-- if (username.isEmpty()) {
-- QSettings s;
-- s.beginGroup(kSettingsGroup);
--
-- login_username = s.value("username").toString();
-- login_password = QString();
-- }
--
-- server_->Login(login_username, login_password, bitrate_, volume_normalisation_);
--
-- StartBlobProcess();
--}
--
--void SpotifyService::StartBlobProcess() {
-- // Try to find an executable to run
-- QString blob_path;
-- QProcessEnvironment env(QProcessEnvironment::systemEnvironment());
--
-- // Look in the system search path first
-- if (QFile::exists(system_blob_path_)) {
-- blob_path = system_blob_path_;
-- }
--
-- // Next look in the local path
-- if (blob_path.isEmpty()) {
-- if (QFile::exists(local_blob_path_)) {
-- blob_path = local_blob_path_;
-- env.insert("LD_LIBRARY_PATH", QFileInfo(local_blob_path_).path());
-- }
-- }
--
-- if (blob_path.isEmpty()) {
-- // If the blob still wasn't found then we'll prompt the user to download one
-- if (login_task_id_) {
-- model()->task_manager()->SetTaskFinished(login_task_id_);
-- }
--
-- #ifdef Q_OS_LINUX
-- if (SpotifyBlobDownloader::Prompt()) {
-- InstallBlob();
-- }
-- #endif
--
-- return;
-- }
--
-- delete blob_process_;
-- blob_process_ = new QProcess(this);
-- blob_process_->setProcessChannelMode(QProcess::ForwardedChannels);
-- blob_process_->setProcessEnvironment(env);
--
-- connect(blob_process_,
-- SIGNAL(error(QProcess::ProcessError)),
-- SLOT(BlobProcessError(QProcess::ProcessError)));
--
-- qLog(Info) << "Starting" << blob_path;
-- blob_process_->start(
-- blob_path, QStringList() << QString::number(server_->server_port()));
--}
--
--bool SpotifyService::IsBlobInstalled() const {
-- return QFile::exists(system_blob_path_) ||
-- QFile::exists(local_blob_path_);
--}
--
--void SpotifyService::InstallBlob() {
-- // The downloader deletes itself when it finishes
-- SpotifyBlobDownloader* downloader = new SpotifyBlobDownloader(
-- local_blob_version_, QFileInfo(local_blob_path_).path(), this);
-- connect(downloader, SIGNAL(Finished()), SLOT(BlobDownloadFinished()));
-- connect(downloader, SIGNAL(Finished()), SIGNAL(BlobStateChanged()));
-- downloader->Start();
--}
--
--void SpotifyService::BlobDownloadFinished() {
-- EnsureServerCreated();
--}
--
--void SpotifyService::PlaylistsUpdated(const spotify_pb::Playlists& response) {
-- if (login_task_id_) {
-- model()->task_manager()->SetTaskFinished(login_task_id_);
-- login_task_id_ = 0;
-- }
--
-- // Create starred and inbox playlists if they're not here already
-- if (!search_) {
-- search_ = new QStandardItem(IconLoader::Load("edit-find"),
-- tr("Search Spotify (opens a new tab)"));
-- search_->setData(Type_SearchResults, InternetModel::Role_Type);
-- search_->setData(InternetModel::PlayBehaviour_DoubleClickAction,
-- InternetModel::Role_PlayBehaviour);
--
-- starred_ = new QStandardItem(QIcon(":/star-on.png"), tr("Starred"));
-- starred_->setData(Type_StarredPlaylist, InternetModel::Role_Type);
-- starred_->setData(true, InternetModel::Role_CanLazyLoad);
--
-- inbox_ = new QStandardItem(IconLoader::Load("mail-message"), tr("Inbox"));
-- inbox_->setData(Type_InboxPlaylist, InternetModel::Role_Type);
-- inbox_->setData(true, InternetModel::Role_CanLazyLoad);
--
-- root_->appendRow(search_);
-- root_->appendRow(starred_);
-- root_->appendRow(inbox_);
-- }
--
-- // Don't do anything if the playlists haven't changed since last time.
-- if (!DoPlaylistsDiffer(response)) {
-- qLog(Debug) << "Playlists haven't changed - not updating";
-- return;
-- }
--
-- // Remove and recreate the other playlists
-- foreach (QStandardItem* item, playlists_) {
-- item->parent()->removeRow(item->row());
-- }
-- playlists_.clear();
--
-- for (int i=0 ; i<response.playlist_size() ; ++i) {
-- const spotify_pb::Playlists::Playlist& msg = response.playlist(i);
--
-- QStandardItem* item = new QStandardItem(QStringFromStdString(msg.name()));
-- item->setData(InternetModel::Type_UserPlaylist, InternetModel::Role_Type);
-- item->setData(true, InternetModel::Role_CanLazyLoad);
-- item->setData(msg.index(), Role_UserPlaylistIndex);
-- item->setData(InternetModel::PlayBehaviour_SingleItem, InternetModel::Role_PlayBehaviour);
--
-- root_->appendRow(item);
-- playlists_ << item;
--
-- // Preload the playlist items so that drag & drop works immediately.
-- LazyPopulate(item);
-- }
--}
--
--bool SpotifyService::DoPlaylistsDiffer(const spotify_pb::Playlists& response) const {
-- if (playlists_.count() != response.playlist_size()) {
-- return true;
-- }
--
-- for (int i=0 ; i<response.playlist_size() ; ++i) {
-- const spotify_pb::Playlists::Playlist& msg = response.playlist(i);
-- const QStandardItem* item = PlaylistBySpotifyIndex(msg.index());
--
-- if (!item) {
-- return true;
-- }
--
-- if (QStringFromStdString(msg.name()) != item->text()) {
-- return true;
-- }
-- }
--
-- return false;
--}
--
--void SpotifyService::InboxLoaded(const spotify_pb::LoadPlaylistResponse& response) {
-- FillPlaylist(inbox_, response);
--}
--
--void SpotifyService::StarredLoaded(const spotify_pb::LoadPlaylistResponse& response) {
-- FillPlaylist(starred_, response);
--}
--
--QStandardItem* SpotifyService::PlaylistBySpotifyIndex(int index) const {
-- foreach (QStandardItem* item, playlists_) {
-- if (item->data(Role_UserPlaylistIndex).toInt() == index) {
-- return item;
-- }
-- }
-- return NULL;
--}
--
--void SpotifyService::UserPlaylistLoaded(const spotify_pb::LoadPlaylistResponse& response) {
-- // Find a playlist with this index
-- QStandardItem* item = PlaylistBySpotifyIndex(response.request().user_playlist_index());
-- if (item) {
-- FillPlaylist(item, response);
-- }
--}
--
--void SpotifyService::FillPlaylist(QStandardItem* item, const spotify_pb::LoadPlaylistResponse& response) {
-- qLog(Debug) << "Filling playlist:" << item->text();
-- if (item->hasChildren())
-- item->removeRows(0, item->rowCount());
--
-- for (int i=0 ; i<response.track_size() ; ++i) {
-- Song song;
-- SongFromProtobuf(response.track(i), &song);
--
-- QStandardItem* child = new QStandardItem(song.PrettyTitleWithArtist());
-- child->setData(Type_Track, InternetModel::Role_Type);
-- child->setData(QVariant::fromValue(song), InternetModel::Role_SongMetadata);
-- child->setData(InternetModel::PlayBehaviour_SingleItem, InternetModel::Role_PlayBehaviour);
-- child->setData(song.url(), InternetModel::Role_Url);
--
-- item->appendRow(child);
-- }
--}
--
--void SpotifyService::SongFromProtobuf(const spotify_pb::Track& track, Song* song) {
-- song->set_rating(track.starred() ? 1.0 : 0.0);
-- song->set_title(QStringFromStdString(track.title()));
-- song->set_album(QStringFromStdString(track.album()));
-- song->set_length_nanosec(track.duration_msec() * kNsecPerMsec);
-- song->set_score(track.popularity());
-- song->set_disc(track.disc());
-- song->set_track(track.track());
-- song->set_year(track.year());
-- song->set_url(QUrl(QStringFromStdString(track.uri())));
-- song->set_art_automatic("spotify://image/" + QStringFromStdString(track.album_art_id()));
--
-- QStringList artists;
-- for (int i=0 ; i<track.artist_size() ; ++i) {
-- artists << QStringFromStdString(track.artist(i));
-- }
--
-- song->set_artist(artists.join(", "));
--
-- song->set_filetype(Song::Type_Stream);
-- song->set_valid(true);
-- song->set_directory_id(0);
-- song->set_mtime(0);
-- song->set_ctime(0);
-- song->set_filesize(0);
--}
--
--PlaylistItem::Options SpotifyService::playlistitem_options() const {
-- return PlaylistItem::PauseDisabled | PlaylistItem::SeekDisabled;
--}
--
--void SpotifyService::EnsureMenuCreated() {
-- if (context_menu_)
-- return;
--
-- context_menu_ = new QMenu;
--
-- context_menu_->addActions(GetPlaylistActions());
-- context_menu_->addSeparator();
-- context_menu_->addAction(IconLoader::Load("edit-find"), tr("Search Spotify (opens a new tab)..."), this, SLOT(OpenSearchTab()));
-- context_menu_->addSeparator();
-- context_menu_->addAction(IconLoader::Load("configure"), tr("Configure Spotify..."), this, SLOT(ShowConfig()));
--
-- playlist_context_menu_ = new QMenu;
-- playlist_sync_action_ = playlist_context_menu_->addAction(
-- IconLoader::Load("view-refresh"),
-- tr("Make playlist available offline"),
-- this,
-- SLOT(SyncPlaylist()));
--}
--
--void SpotifyService::SyncPlaylist() {
-- QStandardItem* item = playlist_sync_action_->data().value<QStandardItem*>();
-- Q_ASSERT(item);
--
-- switch (item->data(InternetModel::Role_Type).toInt()) {
-- case InternetModel::Type_UserPlaylist: {
-- int index = item->data(Role_UserPlaylistIndex).toInt();
-- server_->SyncUserPlaylist(index);
-- playlist_sync_ids_[index] =
-- model()->task_manager()->StartTask(tr("Syncing Spotify playlist"));
-- break;
-- }
-- case Type_InboxPlaylist:
-- server_->SyncInbox();
-- inbox_sync_id_ = model()->task_manager()->StartTask(tr("Syncing Spotify inbox"));
-- break;
-- case Type_StarredPlaylist:
-- server_->SyncStarred();
-- starred_sync_id_ = model()->task_manager()->StartTask(tr("Syncing Spotify starred tracks"));
-- break;
-- default:
-- break;
-- }
--}
--
--void SpotifyService::Search(const QString& text, Playlist* playlist, bool now) {
-- EnsureServerCreated();
--
-- pending_search_ = text;
-- pending_search_playlist_ = playlist;
--
-- if (now) {
-- search_delay_->stop();
-- DoSearch();
-- } else {
-- search_delay_->start();
-- }
--}
--
--void SpotifyService::DoSearch() {
-- if (!pending_search_.isEmpty()) {
-- server_->Search(pending_search_, 200);
-- }
--}
--
--void SpotifyService::SearchResults(const spotify_pb::SearchResponse& response) {
-- if (QStringFromStdString(response.request().query()) != pending_search_) {
-- qLog(Debug) << "Old search result for"
-- << QStringFromStdString(response.request().query())
-- << "expecting" << pending_search_;
-- return;
-- }
-- pending_search_.clear();
--
-- SongList songs;
-- for (int i=0 ; i<response.result_size() ; ++i) {
-- Song song;
-- SongFromProtobuf(response.result(i), &song);
-- songs << song;
-- }
--
-- qLog(Debug) << "Got" << songs.count() << "results";
--
-- pending_search_playlist_->Clear();
-- pending_search_playlist_->InsertSongs(songs);
--
-- const QString did_you_mean = QStringFromStdString(response.did_you_mean());
-- if (!did_you_mean.isEmpty()) {
-- model()->player()->playlists()->playlist_container()->did_you_mean()->Show(did_you_mean);
-- }
--}
--
--SpotifyServer* SpotifyService::server() const {
-- SpotifyService* nonconst_this = const_cast<SpotifyService*>(this);
--
-- if (QThread::currentThread() != thread()) {
-- metaObject()->invokeMethod(nonconst_this, "EnsureServerCreated",
-- Qt::BlockingQueuedConnection);
-- } else {
-- nonconst_this->EnsureServerCreated();
-- }
--
-- return server_;
--}
--
--void SpotifyService::ShowContextMenu(const QModelIndex& index, const QPoint& global_pos) {
-- EnsureMenuCreated();
-- QStandardItem* item = model()->itemFromIndex(index);
-- if (item) {
-- int type = item->data(InternetModel::Role_Type).toInt();
-- if (type == Type_InboxPlaylist ||
-- type == Type_StarredPlaylist ||
-- type == InternetModel::Type_UserPlaylist) {
-- playlist_sync_action_->setData(qVariantFromValue(item));
-- playlist_context_menu_->popup(global_pos);
-- return;
-- }
-- }
--
-- context_menu_->popup(global_pos);
--}
--
--void SpotifyService::OpenSearchTab() {
-- model()->player()->playlists()->New(tr("Search Spotify"), SongList(),
-- SpotifySearchPlaylistType::kName);
--}
--
--void SpotifyService::ItemDoubleClicked(QStandardItem* item) {
-- if (item == search_) {
-- OpenSearchTab();
-- }
--}
--
--void SpotifyService::LoadImage(const QString& id) {
-- EnsureServerCreated();
-- server_->LoadImage(id);
--}
--
--void SpotifyService::SyncPlaylistProgress(
-- const spotify_pb::SyncPlaylistProgress& progress) {
-- qLog(Debug) << "Sync progress:" << progress.sync_progress();
-- int task_id = -1;
-- switch (progress.request().type()) {
-- case spotify_pb::Inbox:
-- task_id = inbox_sync_id_;
-- break;
-- case spotify_pb::Starred:
-- task_id = starred_sync_id_;
-- break;
-- case spotify_pb::UserPlaylist: {
-- QMap<int, int>::const_iterator it = playlist_sync_ids_.constFind(
-- progress.request().user_playlist_index());
-- if (it != playlist_sync_ids_.constEnd()) {
-- task_id = it.value();
-- }
-- break;
-- }
-- default:
-- break;
-- }
-- if (task_id == -1) {
-- qLog(Warning) << "Received sync progress for unknown playlist";
-- return;
-- }
-- model()->task_manager()->SetTaskProgress(task_id, progress.sync_progress(), 100);
-- if (progress.sync_progress() == 100) {
-- model()->task_manager()->SetTaskFinished(task_id);
-- if (progress.request().type() == spotify_pb::UserPlaylist) {
-- playlist_sync_ids_.remove(task_id);
-- }
-- }
--}
--
--void SpotifyService::ShowConfig() {
-- emit OpenSettingsAtPage(SettingsDialog::Page_Spotify);
--}
--
--void SpotifyService::Logout() {
-- delete server_;
-- delete blob_process_;
-- server_ = NULL;
-- blob_process_ = NULL;
--
-- login_state_ = LoginState_OtherError;
--
-- QSettings s;
-- s.beginGroup(kSettingsGroup);
-- s.setValue("login_state", login_state_);
--}
-diff -rauN clementine-1.0.1/src/internet/spotifyservice.h /dev/null
---- clementine-1.0.1/src/internet/spotifyservice.h 2011-12-02 19:24:44.000000000 -0200
-+++ /dev/null 2012-05-28 12:50:04.796939473 -0300
-@@ -1,147 +0,0 @@
--#ifndef SPOTIFYSERVICE_H
--#define SPOTIFYSERVICE_H
--
--#include "internetmodel.h"
--#include "internetservice.h"
--#include "spotifyblob/common/spotifymessages.pb.h"
--
--#include <QProcess>
--#include <QTimer>
--
--#include <boost/shared_ptr.hpp>
--
--class Playlist;
--class SpotifyServer;
--
--class QMenu;
--
--class SpotifyService : public InternetService {
-- Q_OBJECT
--
--public:
-- SpotifyService(InternetModel* parent);
-- ~SpotifyService();
--
-- enum Type {
-- Type_SearchResults = InternetModel::TypeCount,
-- Type_StarredPlaylist,
-- Type_InboxPlaylist,
-- Type_Track,
-- };
--
-- enum Role {
-- Role_UserPlaylistIndex = InternetModel::RoleCount,
-- };
--
-- // Values are persisted - don't change.
-- enum LoginState {
-- LoginState_LoggedIn = 1,
-- LoginState_Banned = 2,
-- LoginState_BadCredentials = 3,
-- LoginState_NoPremium = 4,
-- LoginState_OtherError = 5,
-- LoginState_ReloginFailed = 6
-- };
--
-- static const char* kServiceName;
-- static const char* kSettingsGroup;
-- static const char* kBlobDownloadUrl;
-- static const int kSearchDelayMsec;
--
-- void ReloadSettings();
--
-- QStandardItem* CreateRootItem();
-- void LazyPopulate(QStandardItem* parent);
-- void ShowContextMenu(const QModelIndex& index, const QPoint& global_pos);
-- void ItemDoubleClicked(QStandardItem* item);
-- PlaylistItem::Options playlistitem_options() const;
--
-- void Logout();
-- void Login(const QString& username, const QString& password);
-- void Search(const QString& text, Playlist* playlist, bool now = false);
-- Q_INVOKABLE void LoadImage(const QString& id);
--
-- SpotifyServer* server() const;
--
-- bool IsBlobInstalled() const;
-- void InstallBlob();
--
-- // Persisted in the settings and updated on each Login().
-- LoginState login_state() const { return login_state_; }
-- bool IsLoggedIn() const { return login_state_ == LoginState_LoggedIn; }
--
-- static void SongFromProtobuf(const spotify_pb::Track& track, Song* song);
--
--signals:
-- void BlobStateChanged();
-- void LoginFinished(bool success);
-- void ImageLoaded(const QString& id, const QImage& image);
--
--public slots:
-- void ShowConfig();
--
--protected:
-- virtual QModelIndex GetCurrentIndex();
--
--private:
-- void StartBlobProcess();
-- void FillPlaylist(QStandardItem* item, const spotify_pb::LoadPlaylistResponse& response);
-- void EnsureMenuCreated();
--
-- QStandardItem* PlaylistBySpotifyIndex(int index) const;
-- bool DoPlaylistsDiffer(const spotify_pb::Playlists& response) const;
--
--private slots:
-- void EnsureServerCreated(const QString& username = QString(),
-- const QString& password = QString());
-- void BlobProcessError(QProcess::ProcessError error);
-- void LoginCompleted(bool success, const QString& error,
-- spotify_pb::LoginResponse_Error error_code);
-- void PlaylistsUpdated(const spotify_pb::Playlists& response);
-- void InboxLoaded(const spotify_pb::LoadPlaylistResponse& response);
-- void StarredLoaded(const spotify_pb::LoadPlaylistResponse& response);
-- void UserPlaylistLoaded(const spotify_pb::LoadPlaylistResponse& response);
-- void SearchResults(const spotify_pb::SearchResponse& response);
-- void SyncPlaylistProgress(const spotify_pb::SyncPlaylistProgress& progress);
--
-- void OpenSearchTab();
-- void DoSearch();
--
-- void SyncPlaylist();
-- void BlobDownloadFinished();
--
--private:
-- SpotifyServer* server_;
--
-- QString system_blob_path_;
-- QString local_blob_version_;
-- QString local_blob_path_;
-- QProcess* blob_process_;
--
-- QStandardItem* root_;
-- QStandardItem* search_;
-- QStandardItem* starred_;
-- QStandardItem* inbox_;
-- QList<QStandardItem*> playlists_;
--
-- int login_task_id_;
-- QString pending_search_;
-- Playlist* pending_search_playlist_;
--
-- QMenu* context_menu_;
-- QMenu* playlist_context_menu_;
-- QAction* playlist_sync_action_;
-- QModelIndex context_item_;
--
-- QTimer* search_delay_;
--
-- int inbox_sync_id_;
-- int starred_sync_id_;
-- QMap<int, int> playlist_sync_ids_;
--
-- LoginState login_state_;
-- spotify_pb::Bitrate bitrate_;
-- bool volume_normalisation_;
--};
--
--#endif
-diff -rauN clementine-1.0.1/src/internet/spotifysettingspage.cpp /dev/null
---- clementine-1.0.1/src/internet/spotifysettingspage.cpp 2011-12-02 19:24:44.000000000 -0200
-+++ /dev/null 2012-05-28 12:50:04.796939473 -0300
-@@ -1,172 +0,0 @@
--/* This file is part of Clementine.
-- Copyright 2010, David Sansome <me@davidsansome.com>
--
-- Clementine is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
--
-- Clementine is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with Clementine. If not, see <http://www.gnu.org/licenses/>.
--*/
--
--#include "spotifysettingspage.h"
--
--#include "spotifyservice.h"
--#include "internetmodel.h"
--#include "ui_spotifysettingspage.h"
--#include "core/network.h"
--#include "spotifyblob/common/spotifymessages.pb.h"
--#include "ui/iconloader.h"
--
--#include <QMessageBox>
--#include <QNetworkReply>
--#include <QNetworkRequest>
--#include <QSettings>
--#include <QtDebug>
--
--SpotifySettingsPage::SpotifySettingsPage(SettingsDialog* dialog)
-- : SettingsPage(dialog),
-- network_(new NetworkAccessManager(this)),
-- ui_(new Ui_SpotifySettingsPage),
-- service_(InternetModel::Service<SpotifyService>()),
-- validated_(false)
--{
-- ui_->setupUi(this);
--
-- setWindowIcon(QIcon(":/icons/48x48/spotify.png"));
--
-- QFont bold_font(font());
-- bold_font.setBold(true);
-- ui_->blob_status->setFont(bold_font);
--
-- connect(ui_->download_blob, SIGNAL(clicked()), SLOT(DownloadBlob()));
-- connect(ui_->login, SIGNAL(clicked()), SLOT(Login()));
-- connect(ui_->login_state, SIGNAL(LogoutClicked()), SLOT(Logout()));
-- connect(ui_->login_state, SIGNAL(LoginClicked()), SLOT(Login()));
--
-- connect(service_, SIGNAL(LoginFinished(bool)), SLOT(LoginFinished(bool)));
-- connect(service_, SIGNAL(BlobStateChanged()), SLOT(BlobStateChanged()));
--
-- ui_->login_state->AddCredentialField(ui_->username);
-- ui_->login_state->AddCredentialField(ui_->password);
-- ui_->login_state->AddCredentialGroup(ui_->account_group);
--
-- ui_->bitrate->addItem("96 " + tr("kbps"), spotify_pb::Bitrate96k);
-- ui_->bitrate->addItem("160 " + tr("kbps"), spotify_pb::Bitrate160k);
-- ui_->bitrate->addItem("320 " + tr("kbps"), spotify_pb::Bitrate320k);
--
-- BlobStateChanged();
--}
--
--SpotifySettingsPage::~SpotifySettingsPage() {
-- delete ui_;
--}
--
--void SpotifySettingsPage::BlobStateChanged() {
-- const bool installed = service_->IsBlobInstalled();
--
-- ui_->account_group->setEnabled(installed);
-- ui_->blob_status->setText(installed ? tr("Installed") : tr("Not installed"));
--
--#ifdef Q_OS_LINUX
-- ui_->download_blob->setEnabled(!installed);
--#else
-- ui_->download_blob->setEnabled(false);
--#endif
--}
--
--void SpotifySettingsPage::DownloadBlob() {
-- service_->InstallBlob();
--}
--
--void SpotifySettingsPage::Login() {
-- if (!service_->IsBlobInstalled()) {
-- return;
-- }
--
-- if (ui_->username->text() == original_username_ &&
-- ui_->password->text() == original_password_ &&
-- service_->login_state() == SpotifyService::LoginState_LoggedIn) {
-- return;
-- }
--
-- ui_->login_state->SetLoggedIn(LoginStateWidget::LoginInProgress);
-- service_->Login(ui_->username->text(), ui_->password->text());
--}
--
--void SpotifySettingsPage::Load() {
-- QSettings s;
-- s.beginGroup(SpotifyService::kSettingsGroup);
--
-- original_username_ = s.value("username").toString();
--
-- ui_->username->setText(original_username_);
-- validated_ = false;
--
-- ui_->bitrate->setCurrentIndex(ui_->bitrate->findData(
-- s.value("bitrate", spotify_pb::Bitrate320k).toInt()));
-- ui_->volume_normalisation->setChecked(
-- s.value("volume_normalisation", false).toBool());
--
-- UpdateLoginState();
--}
--
--void SpotifySettingsPage::Save() {
-- QSettings s;
-- s.beginGroup(SpotifyService::kSettingsGroup);
--
-- s.setValue("username", ui_->username->text());
-- s.setValue("password", ui_->password->text());
--
-- s.setValue("bitrate", ui_->bitrate->itemData(ui_->bitrate->currentIndex()).toInt());
-- s.setValue("volume_normalisation", ui_->volume_normalisation->isChecked());
--}
--
--void SpotifySettingsPage::LoginFinished(bool success) {
-- validated_ = success;
--
-- Save();
-- UpdateLoginState();
--}
--
--void SpotifySettingsPage::UpdateLoginState() {
-- const bool logged_in =
-- service_->login_state() == SpotifyService::LoginState_LoggedIn;
--
-- ui_->login_state->SetLoggedIn(logged_in ? LoginStateWidget::LoggedIn
-- : LoginStateWidget::LoggedOut,
-- ui_->username->text());
-- ui_->login_state->SetAccountTypeVisible(!logged_in);
--
-- switch (service_->login_state()) {
-- case SpotifyService::LoginState_NoPremium:
-- ui_->login_state->SetAccountTypeText(tr("You do not have a Spotify Premium account."));
-- break;
--
-- case SpotifyService::LoginState_Banned:
-- case SpotifyService::LoginState_BadCredentials:
-- ui_->login_state->SetAccountTypeText(tr("Your username or password was incorrect."));
-- break;
--
-- case SpotifyService::LoginState_ReloginFailed:
-- ui_->login_state->SetAccountTypeText(tr("You have been logged out of Spotify, please re-enter your password."));
-- break;
--
-- default:
-- ui_->login_state->SetAccountTypeText(tr("A Spotify Premium account is required."));
-- break;
-- }
--}
--
--void SpotifySettingsPage::Logout() {
-- service_->Logout();
-- UpdateLoginState();
--
-- ui_->username->clear();
--}
-diff -rauN clementine-1.0.1/src/internet/spotifysettingspage.h /dev/null
---- clementine-1.0.1/src/internet/spotifysettingspage.h 2011-12-02 19:24:44.000000000 -0200
-+++ /dev/null 2012-05-28 12:50:04.796939473 -0300
-@@ -1,59 +0,0 @@
--/* This file is part of Clementine.
-- Copyright 2010, David Sansome <me@davidsansome.com>
--
-- Clementine is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
--
-- Clementine is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with Clementine. If not, see <http://www.gnu.org/licenses/>.
--*/
--
--#ifndef SPOTIFYSETTINGSPAGE_H
--#define SPOTIFYSETTINGSPAGE_H
--
--#include "ui/settingspage.h"
--
--class NetworkAccessManager;
--class Ui_SpotifySettingsPage;
--class SpotifyService;
--
--class SpotifySettingsPage : public SettingsPage {
-- Q_OBJECT
--
--public:
-- SpotifySettingsPage(SettingsDialog* dialog);
-- ~SpotifySettingsPage();
--
-- void Load();
-- void Save();
--
--public slots:
-- void BlobStateChanged();
-- void DownloadBlob();
--
--private slots:
-- void Login();
-- void LoginFinished(bool success);
-- void Logout();
--
--private:
-- void UpdateLoginState();
--
--private:
-- NetworkAccessManager* network_;
-- Ui_SpotifySettingsPage* ui_;
-- SpotifyService* service_;
--
-- bool validated_;
-- QString original_username_;
-- QString original_password_;
--};
--
--#endif // SPOTIFYSETTINGSPAGE_H
-diff -rauN clementine-1.0.1/src/internet/spotifysettingspage.ui /dev/null
---- clementine-1.0.1/src/internet/spotifysettingspage.ui 2011-12-02 19:24:44.000000000 -0200
-+++ /dev/null 2012-05-28 12:50:04.796939473 -0300
-@@ -1,214 +0,0 @@
--<?xml version="1.0" encoding="UTF-8"?>
--<ui version="4.0">
-- <class>SpotifySettingsPage</class>
-- <widget class="QWidget" name="SpotifySettingsPage">
-- <property name="geometry">
-- <rect>
-- <x>0</x>
-- <y>0</y>
-- <width>545</width>
-- <height>458</height>
-- </rect>
-- </property>
-- <property name="windowTitle">
-- <string>Spotify</string>
-- </property>
-- <layout class="QVBoxLayout" name="verticalLayout_2">
-- <item>
-- <widget class="LoginStateWidget" name="login_state" native="true"/>
-- </item>
-- <item>
-- <widget class="QGroupBox" name="account_group">
-- <property name="title">
-- <string>Account details</string>
-- </property>
-- <layout class="QVBoxLayout" name="verticalLayout_3">
-- <item>
-- <widget class="QWidget" name="login_container" native="true">
-- <property name="enabled">
-- <bool>true</bool>
-- </property>
-- <layout class="QGridLayout" name="gridLayout">
-- <property name="margin">
-- <number>0</number>
-- </property>
-- <item row="1" column="0">
-- <widget class="QLabel" name="username_label">
-- <property name="text">
-- <string>Username</string>
-- </property>
-- </widget>
-- </item>
-- <item row="1" column="1">
-- <widget class="QLineEdit" name="username"/>
-- </item>
-- <item row="2" column="0">
-- <widget class="QLabel" name="password_label">
-- <property name="text">
-- <string>Password</string>
-- </property>
-- </widget>
-- </item>
-- <item row="2" column="1" colspan="2">
-- <widget class="QLineEdit" name="password">
-- <property name="echoMode">
-- <enum>QLineEdit::Password</enum>
-- </property>
-- </widget>
-- </item>
-- <item row="1" column="2">
-- <widget class="QPushButton" name="login">
-- <property name="text">
-- <string>Login</string>
-- </property>
-- </widget>
-- </item>
-- </layout>
-- </widget>
-- </item>
-- </layout>
-- </widget>
-- </item>
-- <item>
-- <widget class="QGroupBox" name="groupBox_2">
-- <property name="title">
-- <string>Spotify plugin</string>
-- </property>
-- <layout class="QVBoxLayout" name="verticalLayout">
-- <item>
-- <widget class="QLabel" name="label">
-- <property name="text">
-- <string>For licensing reasons Spotify support is in a separate plugin.</string>
-- </property>
-- </widget>
-- </item>
-- <item>
-- <layout class="QHBoxLayout" name="horizontalLayout_2">
-- <item>
-- <widget class="QLabel" name="label_2">
-- <property name="text">
-- <string>Plugin status:</string>
-- </property>
-- </widget>
-- </item>
-- <item>
-- <widget class="QLabel" name="blob_status"/>
-- </item>
-- <item>
-- <spacer name="horizontalSpacer">
-- <property name="orientation">
-- <enum>Qt::Horizontal</enum>
-- </property>
-- <property name="sizeHint" stdset="0">
-- <size>
-- <width>40</width>
-- <height>20</height>
-- </size>
-- </property>
-- </spacer>
-- </item>
-- <item>
-- <widget class="QPushButton" name="download_blob">
-- <property name="text">
-- <string>Download...</string>
-- </property>
-- </widget>
-- </item>
-- </layout>
-- </item>
-- </layout>
-- </widget>
-- </item>
-- <item>
-- <widget class="QGroupBox" name="groupBox">
-- <property name="title">
-- <string>Preferences</string>
-- </property>
-- <layout class="QFormLayout" name="formLayout">
-- <item row="0" column="0">
-- <widget class="QLabel" name="label_4">
-- <property name="text">
-- <string>Preferred bitrate</string>
-- </property>
-- </widget>
-- </item>
-- <item row="0" column="1">
-- <widget class="QComboBox" name="bitrate"/>
-- </item>
-- <item row="1" column="0" colspan="2">
-- <widget class="QCheckBox" name="volume_normalisation">
-- <property name="text">
-- <string>Use volume normalisation</string>
-- </property>
-- </widget>
-- </item>
-- </layout>
-- </widget>
-- </item>
-- <item>
-- <spacer name="verticalSpacer">
-- <property name="orientation">
-- <enum>Qt::Vertical</enum>
-- </property>
-- <property name="sizeHint" stdset="0">
-- <size>
-- <width>20</width>
-- <height>30</height>
-- </size>
-- </property>
-- </spacer>
-- </item>
-- <item>
-- <layout class="QHBoxLayout" name="horizontalLayout_3">
-- <item>
-- <spacer name="horizontalSpacer_2">
-- <property name="orientation">
-- <enum>Qt::Horizontal</enum>
-- </property>
-- <property name="sizeHint" stdset="0">
-- <size>
-- <width>40</width>
-- <height>20</height>
-- </size>
-- </property>
-- </spacer>
-- </item>
-- <item>
-- <widget class="QLabel" name="label_3">
-- <property name="minimumSize">
-- <size>
-- <width>64</width>
-- <height>64</height>
-- </size>
-- </property>
-- <property name="maximumSize">
-- <size>
-- <width>64</width>
-- <height>64</height>
-- </size>
-- </property>
-- <property name="pixmap">
-- <pixmap resource="../../data/data.qrc">:/spotify-core-logo-128x128.png</pixmap>
-- </property>
-- <property name="scaledContents">
-- <bool>true</bool>
-- </property>
-- </widget>
-- </item>
-- </layout>
-- </item>
-- </layout>
-- </widget>
-- <customwidgets>
-- <customwidget>
-- <class>LoginStateWidget</class>
-- <extends>QWidget</extends>
-- <header>widgets/loginstatewidget.h</header>
-- <container>1</container>
-- </customwidget>
-- </customwidgets>
-- <resources>
-- <include location="../../data/data.qrc"/>
-- </resources>
-- <connections/>
--</ui>
diff -rauN clementine-1.0.1/src/ui/about.cpp clementine-libre-1.0.1/src/ui/about.cpp
--- clementine-1.0.1/src/ui/about.cpp 2012-01-22 10:43:26.000000000 -0200
+++ clementine-libre-1.0.1/src/ui/about.cpp 2012-05-28 19:44:38.760244927 -0300
@@ -3191,23 +550,23 @@ diff -rauN clementine-1.0.1/src/ui/about.cpp clementine-libre-1.0.1/src/ui/about
return ret;
}
-diff -rauN clementine-1.0.1/src/ui/settingsdialog.cpp clementine-libre-1.0.1/src/ui/settingsdialog.cpp
---- clementine-1.0.1/src/ui/settingsdialog.cpp 2011-12-02 19:24:44.000000000 -0200
-+++ clementine-libre-1.0.1/src/ui/settingsdialog.cpp 2012-05-28 19:46:49.506369764 -0300
+diff -rauN clementine-1.1.0/src/ui/settingsdialog.cpp clementine-libre-1.1.0/src/ui/settingsdialog.cpp
+--- clementine-1.1.0/src/ui/settingsdialog.cpp 2012-10-11 09:16:40.000000000 -0200
++++ clementine-libre-1.1.0/src/ui/settingsdialog.cpp 2012-10-26 02:16:32.400950434 -0200
@@ -55,10 +55,6 @@
- # include "remote/remotesettingspage.h"
+ # include "wiimotedev/wiimotesettingspage.h"
#endif
-#ifdef HAVE_SPOTIFY
-# include "internet/spotifysettingspage.h"
-#endif
-
- #include <QDesktopWidget>
- #include <QPainter>
- #include <QPushButton>
-@@ -140,10 +136,6 @@
-
- AddPage(Page_Grooveshark, new GroovesharkSettingsPage(this), providers);
+ #ifdef HAVE_GOOGLE_DRIVE
+ # include "internet/googledrivesettingspage.h"
+ #endif
+@@ -147,10 +143,6 @@
+ AddPage(Page_GoogleDrive, new GoogleDriveSettingsPage(this), providers);
+ #endif
-#ifdef HAVE_SPOTIFY
- AddPage(Page_Spotify, new SpotifySettingsPage(this), providers);
@@ -3216,10 +575,10 @@ diff -rauN clementine-1.0.1/src/ui/settingsdialog.cpp clementine-libre-1.0.1/src
AddPage(Page_Magnatune, new MagnatuneSettingsPage(this), providers);
AddPage(Page_DigitallyImported, new DigitallyImportedSettingsPage(this), providers);
AddPage(Page_BackgroundStreams, new BackgroundStreamsSettingsPage(this), providers);
-diff -rauN clementine-1.0.1/src/ui/settingsdialog.h clementine-libre-1.0.1/src/ui/settingsdialog.h
---- clementine-1.0.1/src/ui/settingsdialog.h 2011-12-02 19:24:44.000000000 -0200
-+++ clementine-libre-1.0.1/src/ui/settingsdialog.h 2012-05-28 19:48:55.399426104 -0300
-@@ -65,7 +65,6 @@
+diff -rauN clementine-1.1.0/src/ui/settingsdialog.h clementine-libre-1.1.0/src/ui/settingsdialog.h
+--- clementine-1.1.0/src/ui/settingsdialog.h 2012-10-11 09:16:40.000000000 -0200
++++ clementine-libre-1.1.0/src/ui/settingsdialog.h 2012-10-26 02:16:56.596276994 -0200
+@@ -67,7 +67,6 @@
Page_Library,
Page_Lastfm,
Page_Grooveshark,
@@ -3227,8 +586,9 @@ diff -rauN clementine-1.0.1/src/ui/settingsdialog.h clementine-libre-1.0.1/src/u
Page_Magnatune,
Page_DigitallyImported,
Page_BackgroundStreams,
---- clementine-1.0.1/src/core/logging.cpp 2011-12-02 19:24:43.000000000 -0200
-+++ clementine-libre-1.0.1/src/core/logging.cpp 2012-05-30 03:09:25.554790760 -0300
+diff -rauN clementine-1.1.0/ext/libclementine-common/core/logging.cpp clementine-libre-1.1.0/ext/libclementine-common/core/logging.cpp
+--- clementine-1.1.0/ext/libclementine-common/core/logging.cpp 2012-10-11 09:16:39.000000000 -0200
++++ clementine-libre-1.1.0/ext/libclementine-common/core/logging.cpp 2012-10-26 02:20:08.682299778 -0200
@@ -14,10 +14,6 @@
limitations under the License.
*/
@@ -3237,12 +597,13 @@ diff -rauN clementine-1.0.1/src/ui/settingsdialog.h clementine-libre-1.0.1/src/u
-// it is used by the Spotify blob which links against libspotify and is not GPL
-// compatible.
-
+ #include <QtGlobal>
- #include <QCoreApplication>
- #include <QDateTime>
---- clementine-1.0.1/src/core/logging.h 2011-12-02 19:24:43.000000000 -0200
-+++ clementine-libre-1.0.1/src/core/logging.h 2012-05-30 03:09:44.390404481 -0300
-@@ -14,10 +14,6 @@
+ #include <cxxabi.h>
+diff -rauN clementine-1.1.0/ext/libclementine-common/core/logging.h clementine-libre-1.1.0/ext/libclementine-common/core/logging.h
+--- clementine-1.1.0/ext/libclementine-common/core/logging.h 2012-10-11 09:16:39.000000000 -0200
++++ clementine-libre-1.1.0/ext/libclementine-common/core/logging.h 2012-10-26 02:20:34.937511945 -0200
+@@ -14,11 +14,6 @@
limitations under the License.
*/
@@ -3250,9 +611,11 @@ diff -rauN clementine-1.0.1/src/ui/settingsdialog.h clementine-libre-1.0.1/src/u
-// it is used by the Spotify blob which links against libspotify and is not GPL
-// compatible.
-
-
+-
#ifndef LOGGING_H
#define LOGGING_H
+
+diff -rauN clementine-1.0.1/src/core/timeconstants.h clementine-libre-1.0.1/src/core/timeconstants.h
--- clementine-1.0.1/src/core/timeconstants.h 2011-12-02 19:24:44.000000000 -0200
+++ clementine-libre-1.0.1/src/core/timeconstants.h 2012-05-30 03:10:10.338953893 -0300
@@ -14,10 +14,6 @@
diff --git a/libre/filesystem/PKGBUILD b/libre/filesystem/PKGBUILD
index 32be5dd3c..6fc74fe5a 100644
--- a/libre/filesystem/PKGBUILD
+++ b/libre/filesystem/PKGBUILD
@@ -1,11 +1,11 @@
-# $Id: PKGBUILD 167924 2012-10-03 20:35:33Z tomegun $
+# $Id: PKGBUILD 169557 2012-10-23 14:38:06Z tomegun $
# Maintainer: Tom Gundersen <teg@jklm.no>
# Maintainer (Parabola): Nicolás Reynolds <fauno@kiwwwi.com.ar>
# Maintainer (Parabola): André Silva <emulatorman@lavabit.com>
pkgname=filesystem
pkgver=2012.10
-pkgrel=1
+pkgrel=2
pkgdesc='Base filesystem for Parabola'
arch=('any')
license=('GPL')
@@ -13,7 +13,7 @@ url='https://parabolagnulinux.org'
groups=('base')
install='filesystem.install'
makedepends=('asciidoc')
-depends=('iana-etc' 'bash' 'coreutils')
+depends=('iana-etc' 'bash' 'coreutils' 'nss-myhostname')
backup=('etc/fstab' 'etc/crypttab' 'etc/group' 'etc/hosts' 'etc/ld.so.conf' 'etc/passwd'
'etc/shadow' 'etc/gshadow' 'etc/resolv.conf' 'etc/motd' 'etc/nsswitch.conf'
'etc/shells' 'etc/host.conf' 'etc/securetty' 'etc/profile' 'etc/issue')
@@ -92,12 +92,12 @@ package() {
}
md5sums=('004013ac940ef3d3cdd8c596e7accfe1'
'6be47d893fd49b2e4a8c0e811b350861'
- '13753e4e0964f3652b0cc60a28528bdf'
+ '9e4533df61f0c82d6b2e2371f7376282'
'4c4540eeb748bf1f71d631b8c1dcf0b3'
'f28150d4c0b22a017be51b9f7f9977ed'
'6e488ffecc8ba142c0cf7e2d7aeb832e'
'455b78cada80f40b6f6968f5cbd97a2e'
- 'b8355d9d2782f424f4cedcf682651be0'
+ '01249bb0ba4468f95e2cc3a627f5e6e3'
'ca716f853860199c1286e7939b2f2666'
'1745349eb24ed21b4cfaa6f423bddb76'
'7bc65f234dfb6abf24e7c3b03e86f4ff'
@@ -108,5 +108,5 @@ md5sums=('004013ac940ef3d3cdd8c596e7accfe1'
'677523dbe94b79299aa91b35ed8203b6'
'f3b6ae7db8adffaaa4bffc6099dcbd50'
'a8a962370cd0128465d514e6a1f74130'
- '3674fcb22044d2946934e7826aa0c632'
+ '9f445ef4f7785d04504886fb223ee401'
'3807d07215d9116331fe1cf8feeaa0f8')
diff --git a/libre/filesystem/nsswitch.conf b/libre/filesystem/nsswitch.conf
index 6e459adb6..4a4f5770d 100644
--- a/libre/filesystem/nsswitch.conf
+++ b/libre/filesystem/nsswitch.conf
@@ -6,7 +6,7 @@ shadow: files
publickey: files
-hosts: files dns
+hosts: files dns myhostname
networks: files
protocols: files
diff --git a/libre/filesystem/parabola.7.txt b/libre/filesystem/parabola.7.txt
index f7da03147..23a44bb22 100644
--- a/libre/filesystem/parabola.7.txt
+++ b/libre/filesystem/parabola.7.txt
@@ -17,22 +17,21 @@ DESCRIPTION
Parabola exposes the user to the system without hiding any details. This manpage gives a
brief overview of the configuration files that should be set up on a fresh install.
-INITSCRIPTS[[I]]
-----------------
-The initscripts are configured in rc.conf. Here you configure what daemons to start on boot, what storage
-technologies should be enabled and, optionally, a basic network setup.
+SYSTEM SERVICES[[S]]
+--------------------
+System services to be started at boot can be enabled using 'systemctl enable <name>.service'. To view
+available services use 'systemctl list-unit-files'.
HOSTNAME[[H]]
-------------
-The hostname of the machine should be set in /etc/hostname. Additionally, either /etc/hosts should be
-configured accordingly, or nss-myhostname should be used. This is needed so the hostname can always
-be resolved to the current machine, which is required by some programs.
+The hostname of the machine can be set using 'hostnamectl set-hostname <hostname>'. It will then be
+written to /etc/hostname.
LOCALIZATION[[L]]
-----------------
Various locales may be enabled in /etc/locale.gen, and generated by locale-gen. The system-wide locale to be used
-can be configured in /etc/locale.conf. These settings can be overridden on a par-user basis by keeping a
-user-spcefic locale.conf in $HOME/.config/locale.conf. The user-specific file will take precedence if it exists.
+can be configured in /etc/locale.conf. These settings can be overridden on a per-user basis by keeping a
+user-specific locale.conf in $HOME/.config/locale.conf. The user-specific file will take precedence if it exists.
VIRTUAL CONSOLE[[V]]
--------------------
@@ -41,13 +40,13 @@ other things. Note that these settings only apply to the console, and not if you
TIME[[T]]
---------
-The local timezone is configured by *symlinking* /etc/localtime to the correct zoneinfo file under
-/usr/share/zoneinfo/. E.g.,
+The local timezone is configured by calling 'timedatectl set-timezone <Region/City>'. A *symlink* is then created
+from /etc/localtime to the correct zoneinfo file under /usr/share/zoneinfo/. E.g.,
- /etc/localtime -> /usr/share/zoneinfo/Europe/Paris
+ /etc/localtime -> ../usr/share/zoneinfo/Europe/Paris
The real-time clock, which keeps track of time when the computer is off, can be configured to either
-be in UTC or in localtime in /etc/adjtime. The default is UTC.
+be in UTC or in localtime by calling 'timedatectl set-local-rtc <false|true>'. The default is UTC.
FILESYSTEMS[[F]]
----------------
@@ -73,8 +72,8 @@ and modules to be blacklisted from auto-loading can be configured in /etc/modpro
SEE ALSO
--------
-rc.conf(5), hostname(5), hosts(5), nsswitch.conf(5), locale.conf(5), vconsole.conf(5), timezone(3), hwclock(8), fstab(5), crypttab(5),
-mkinitcpio(8), pacman(8), pacman.conf(5), grub-mkconfig(8), syslinux(1), modules-load.d(5), modprobe.d(5)
+systemctl(1), hostnamectl(1), hostname(5), locale.conf(5), vconsole.conf(5), timedatectl(1), timezone(3), hwclock(8), fstab(5),
+crypttab(5), mkinitcpio(8), pacman(8), pacman.conf(5), grub-mkconfig(8), syslinux(1), modules-load.d(5), modprobe.d(5)
AUTHORS
-------
diff --git a/libre/filesystem/shadow b/libre/filesystem/shadow
index ccab68d33..5eff4935c 100644
--- a/libre/filesystem/shadow
+++ b/libre/filesystem/shadow
@@ -4,4 +4,5 @@ daemon:x:14871::::::
mail:x:14871::::::
ftp:x:14871::::::
http:x:14871::::::
+uuidd:x:14871::::::
nobody:x:14871::::::
diff --git a/libre/linux-libre-api-headers/PKGBUILD b/libre/linux-libre-api-headers/PKGBUILD
index 2aaf0e3fc..c420c2070 100644
--- a/libre/linux-libre-api-headers/PKGBUILD
+++ b/libre/linux-libre-api-headers/PKGBUILD
@@ -5,8 +5,8 @@
# toolchain build order: linux-libre-api-headers->glibc->binutils->gcc->binutils->glibc
pkgname=linux-libre-api-headers
-_basekernel=3.5
-_sublevel=5
+_basekernel=3.6
+_sublevel=3
pkgver=${_basekernel}.${_sublevel}
pkgrel=1
pkgdesc="Kernel libre headers sanitized for use in userspace"
@@ -18,8 +18,8 @@ conflicts=('linux-api-headers')
replaces=('linux-api-headers')
source=("http://linux-libre.fsfla.org/pub/linux-libre/releases/${_basekernel}-gnu/linux-libre-${_basekernel}-gnu.tar.xz"
"http://linux-libre.fsfla.org/pub/linux-libre/releases/${pkgver}-gnu/patch-${_basekernel}-gnu-${pkgver}-gnu.xz")
-md5sums=('2407fc9563a74acaf38aa0c06516eb1c'
- '2e138b46c5855fff8e0d7afe760a4150')
+md5sums=('a2312edd0265b5b07bd4b50afae2b380'
+ '844bd14e9f58225274e096c31bbb8a8f')
build() {
cd ${srcdir}/linux-${_basekernel}
@@ -37,7 +37,7 @@ package() {
make INSTALL_HDR_PATH=${pkgdir}/usr headers_install
# use headers from libdrm
- rm -rf ${pkgdir}/usr/include/drm
+ rm -r ${pkgdir}/usr/include/drm
# clean-up unnecessary files generated during install
find ${pkgdir} \( -name .install -o -name ..install.cmd \) -delete
diff --git a/libre/lirc-libre/PKGBUILD b/libre/lirc-libre/PKGBUILD
index fe03ab28d..2eb06442a 100644
--- a/libre/lirc-libre/PKGBUILD
+++ b/libre/lirc-libre/PKGBUILD
@@ -6,7 +6,7 @@ _pkgbase=lirc
pkgbase=lirc-libre
pkgname=('lirc-libre' 'lirc-utils-libre')
pkgver=0.9.0
-pkgrel=32
+pkgrel=33
epoch=1
_extramodules=extramodules-3.6-LIBRE
arch=('i686' 'x86_64' 'mips64el')
diff --git a/social/babeld/PKGBUILD b/social/babeld/PKGBUILD
new file mode 100644
index 000000000..5aa25f07f
--- /dev/null
+++ b/social/babeld/PKGBUILD
@@ -0,0 +1,32 @@
+# Maintainer (AUR): Yann Lopez <arch at lonewulf dot net>
+# Maintainer (Parabola): fauno <fauno@parabola.nu>
+pkgname=babeld
+pkgver=1.3.4
+pkgrel=1
+pkgdesc="Loop-free distance-vector routing protocol"
+arch=(i686 x86_64 mips64el)
+url="http://www.pps.jussieu.fr/~jch/software/babel/"
+license=('custom')
+depends=(glibc)
+source=(http://www.pps.jussieu.fr/~jch/software/files/$pkgname-$pkgver.tar.gz{,.asc})
+install=babeld.install
+md5sums=('37be1cbcc23cd00ee47efc9157c58795'
+ 'e2dfae49b497ba70c0c1014feae80f3a')
+
+build() {
+ cd "$srcdir/$pkgname-$pkgver"
+
+ sed -e "s,/man/,/share&,g" -i Makefile
+
+ make PREFIX=/usr CFLAGS="$CFLAGS"
+}
+
+package() {
+ cd "$srcdir/$pkgname-$pkgver"
+
+ make PREFIX=/usr TARGET=$pkgdir install
+
+ gzip -f $pkgdir/usr/share/man/man8/$pkgname.8
+
+ install -Dm 644 LICENCE $pkgdir/usr/share/licenses/$pkgname/LICENCE
+}
diff --git a/social/babeld/babeld.install b/social/babeld/babeld.install
new file mode 100644
index 000000000..686153617
--- /dev/null
+++ b/social/babeld/babeld.install
@@ -0,0 +1,18 @@
+compatibility_warning() {
+ echo "PLEASE NOTE:"
+ echo " "
+ echo "-------------------------------------------------------------"
+ echo " This version uses the IANA-allocated UDP port and multicast"
+ echo " group and is therefore incompatible with older versions."
+ echo "-------------------------------------------------------------"
+}
+
+post_upgrade() {
+ major=$(echo $2 | cut -d '.' -f1)
+ minor=$(echo $2 | cut -d '.' -f2)
+ if [ $major -lt 1 ]; then
+ compatibility_warning
+ elif [ $major -eq 1 -a $minor -lt 1 ]; then
+ compatibility_warning
+ fi
+}