Merge lp:~pete-woods/unity-scope-soundcloud/native-rewrite into lp:unity-scope-soundcloud/legacy

Proposed by Pete Woods
Status: Needs review
Proposed branch: lp:~pete-woods/unity-scope-soundcloud/native-rewrite
Merge into: lp:unity-scope-soundcloud/legacy
Diff against target: 4128 lines (+3511/-375)
40 files modified
CMakeLists.txt (+78/-0)
MANIFEST.in (+0/-4)
build.sh (+70/-0)
cmake/COPYING-CMAKE-SCRIPTS (+22/-0)
cmake/Coverage.cmake (+37/-0)
cmake/FindGMock.cmake (+11/-0)
cmake/FindValgrind.cmake (+28/-0)
data/CMakeLists.txt (+38/-0)
data/soundcloud.scope.in (+6/-6)
data/unity-scope-soundcloud.service (+0/-3)
data/unity-scope-soundcloud.service.in (+3/-0)
debian/changelog (+6/-0)
debian/control (+9/-16)
debian/rules (+8/-13)
po/POTFILES.in (+5/-0)
setup.cfg (+0/-6)
setup.py (+0/-17)
src/CMakeLists.txt (+53/-0)
src/Curl.cpp (+45/-0)
src/Curl.h (+34/-0)
src/Localisation.h (+28/-0)
src/SoundCloud.cpp (+255/-0)
src/SoundCloud.h (+47/-0)
src/SoundCloudParser.cpp (+212/-0)
src/SoundCloudParser.h (+62/-0)
src/SoundCloudResult.cpp (+115/-0)
src/SoundCloudResult.h (+98/-0)
src/config.h.in (+31/-0)
src/main.cpp (+41/-0)
src/unity_soundcloud_daemon.py (+0/-245)
tests/CMakeLists.txt (+43/-0)
tests/TestCurl.cpp (+50/-0)
tests/TestSoundCloudParser.cpp (+158/-0)
tests/data/curl_data_hello (+1/-0)
tests/data/mock_soundcloud_fail (+2/-1)
tests/data/mock_soundcloud_malformed (+177/-0)
tests/data/mock_soundcloud_pass (+1639/-1)
tests/data/valgrind.suppression (+61/-0)
tests/main.cpp (+38/-0)
tests/test_soundcloud.py (+0/-63)
To merge this branch: bzr merge lp:~pete-woods/unity-scope-soundcloud/native-rewrite
Reviewer Review Type Date Requested Status
Michal Hruby (community) Needs Fixing
PS Jenkins bot (community) continuous-integration Approve
Review via email: mp+174535@code.launchpad.net

Commit message

Native re-write in C++

Description of the change

Native re-write in C++

Note: This branch is not finished yet, I just want to get Jenkins working with it.

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
46. By Pete Woods

Set album metadata

47. By Pete Woods

Add more metadata to the preview

48. By Pete Woods

Add track artwork

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
49. By Pete Woods

Remove traces of libcurl

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
50. By Pete Woods

Add missing libunity-dev dependency

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
51. By Pete Woods

New tests cases

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Michal Hruby (mhr3) wrote :

Could we make this a proper module instead of yet another daemon? I know the tutorial now shows how to do a daemon, but modules are the way forward.

review: Needs Fixing
Revision history for this message
Pete Woods (pete-woods) wrote :

> Could we make this a proper module instead of yet another daemon? I know the
> tutorial now shows how to do a daemon, but modules are the way forward.

I only had a single day available to work on this, so I don't know if I'm supposed to make any more changes, but never mind that.

Have you got a good example of a module I could refer to?

Also, I couldn't get the track preview working with this. It just appears as a generic preview, with just a button (action?) that loads the SoundCloud website, there's no "play" button or anything like that.

Do you have any suggestions about what I've done wrong with the preview?

Revision history for this message
Michal Hruby (mhr3) wrote :

923 + artist ? g_variant_get_string(artist, NULL) : "",
924 + album ? g_variant_get_string(artist, NULL) : "",

I suppose the latter should be g_variant_get_string(album, NULL) :)

Revision history for this message
Michal Hruby (mhr3) wrote :

Tested the previews in real dash, and they work fine, it's just:

897 + addPreviewData(previewer, preview, "artist", _("Artist"));
898 + addPreviewData(previewer, preview, "album", _("Album"));
899 + addPreviewData(previewer, preview, "genre", _("Genre"));
900 + addPreviewData(previewer, preview, "label", _("Label"));
901 + addPreviewData(previewer, preview, "license", _("License"));
902 + addPreviewData(previewer, preview, "creation_date", _("Creation Date"));

The music preview renderer doesn't handle this correctly, pls remove.

921 + g_variant_get_string(stream, NULL), 1,

The stream URI isn't correct, it's missing the API key, and therefore it can't be played.

Perhaps the best solution would be to use GenericPreview if the stream URI isn't defined (plus keep all the metadata) and if it is present, use MusicPreview.

I also noticed a few:
QSocketNotifier: Can only be used with threads started with QThread

Is that something to be worried about? FWIW if you provide preview_async_func, you can spawn a QThread there and invoke the callback once the thread finishes.

review: Needs Fixing

Unmerged revisions

51. By Pete Woods

New tests cases

50. By Pete Woods

Add missing libunity-dev dependency

49. By Pete Woods

Remove traces of libcurl

48. By Pete Woods

Add track artwork

47. By Pete Woods

Add more metadata to the preview

46. By Pete Woods

Set album metadata

45. By Pete Woods

Put the scope into the music category

44. By Pete Woods

Sort out the preview

43. By Pete Woods

Some more translated strings

42. By Pete Woods

Update translations index

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== added file 'CMakeLists.txt'
2--- CMakeLists.txt 1970-01-01 00:00:00 +0000
3+++ CMakeLists.txt 2013-07-14 08:39:27 +0000
4@@ -0,0 +1,78 @@
5+project(unity-scope-soundcloud CXX)
6+cmake_minimum_required(VERSION 2.8.9)
7+
8+set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake" "${CMAKE_MODULE_PATH}")
9+
10+find_package(PkgConfig REQUIRED)
11+
12+pkg_check_modules(UNITY REQUIRED unity REQUIRED)
13+include_directories(${UNITY_INCLUDE_DIRS})
14+
15+find_package(Qt5Core REQUIRED)
16+include_directories(${Qt5Core_INCLUDE_DIRS})
17+
18+find_package(Qt5Network REQUIRED)
19+include_directories(${Qt5Network_INCLUDE_DIRS})
20+
21+set(DATA_DIR "${CMAKE_CURRENT_SOURCE_DIR}/data")
22+
23+set(CMAKE_AUTOMOC ON)
24+set(CMAKE_INCLUDE_CURRENT_DIR ON)
25+
26+set(SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src")
27+set(SOURCE_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/src")
28+include_directories(${SOURCE_DIR})
29+include_directories(${SOURCE_BINARY_DIR})
30+
31+include(GNUInstallDirs)
32+include(Coverage)
33+
34+# Workaround for libexecdir on debian
35+if (EXISTS "/etc/debian_version")
36+ set(CMAKE_INSTALL_LIBEXECDIR ${CMAKE_INSTALL_LIBDIR})
37+ set(CMAKE_INSTALL_FULL_LIBEXECDIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBEXECDIR}")
38+endif()
39+
40+set(LOCALE_DIR "${CMAKE_INSTALL_FULL_DATADIR}/locale")
41+
42+add_definitions(
43+ -std=c++11
44+ -pedantic
45+ -Wall
46+ -Wextra
47+)
48+
49+################
50+# Definitions
51+################
52+
53+set(GETTEXT_PACKAGE unity-scope-soundcloud)
54+
55+set(GROUP_NAME "com.canonical.Unity.Scope.Music.Soundcloud")
56+set(UNIQUE_NAME "/com/canonical/unity/scope/music/soundcloud")
57+
58+set(ICON_DIR "${CMAKE_INSTALL_FULL_DATADIR}/icons/unity-icon-theme/places/svg")
59+set(ICON_PATH "${ICON_DIR}/service-soundcloud.svg")
60+set(CATEGORY_ICON_PATH "${ICON_DIR}/service-soundcloud.svg")
61+set(DEFAULT_ICON_PATH "${ICON_DIR}/result-music.svg")
62+
63+##################
64+# End defnitions
65+##################
66+
67+configure_file(
68+ "${SOURCE_DIR}/config.h.in"
69+ "${SOURCE_BINARY_DIR}/config.h"
70+)
71+
72+add_subdirectory("data")
73+#add_subdirectory("po")
74+add_subdirectory("src")
75+
76+enable_testing()
77+add_subdirectory(tests)
78+
79+ADD_CUSTOM_TARGET(
80+ check
81+ ${CMAKE_CTEST_COMMAND} --force-new-ctest-process --output-on-failure
82+)
83
84=== removed file 'MANIFEST.in'
85--- MANIFEST.in 2013-02-13 14:31:48 +0000
86+++ MANIFEST.in 1970-01-01 00:00:00 +0000
87@@ -1,4 +0,0 @@
88-include MANIFEST.in
89-include src/*
90-include data/*
91-include po/*
92
93=== added file 'build.sh'
94--- build.sh 1970-01-01 00:00:00 +0000
95+++ build.sh 2013-07-14 08:39:27 +0000
96@@ -0,0 +1,70 @@
97+#! /bin/bash
98+set -e
99+
100+ECLIPSE=false
101+CLEAN=false
102+SOURCEDIR="$PWD"
103+BRANCHNAME=`basename $SOURCEDIR`
104+BUILDDIR="$SOURCEDIR/../$BRANCHNAME-build"
105+
106+usage() {
107+ echo "usage: $0 [OPTIONS] [BUILD_TYPE]\n" >&2
108+ echo "Script to build unity-scope-soundcloud. If BUILD_TYPE is not specified, it defaults to \"Debug\".\n" >&2
109+ echo "OPTIONS:" >&2
110+ echo " -e, --eclipse Generate Eclipse projects" >&2
111+ echo " -c, --clean Clean the build tree before building" >&2
112+ echo >&2
113+ exit 1
114+}
115+
116+ARGS=`getopt -n$0 -u -a --longoptions="eclipse,clean,help" -o "sch" -- "$@"`
117+[ $? -ne 0 ] && usage
118+eval set -- "$ARGS"
119+
120+while [ $# -gt 0 ]
121+do
122+ case "$1" in
123+ -e|--eclipse) ECLIPSE=true;;
124+ -c|--clean) CLEAN=true;;
125+ -h|--help) usage;;
126+ --) shift;break;;
127+ esac
128+ shift
129+done
130+
131+[ $# -gt 1 ] && usage
132+
133+BUILD_TYPE="Debug"
134+[ $# -eq 1 ] && BUILD_TYPE="$1"
135+
136+if [ -f "/usr/bin/ninja" ] ; then
137+ if $ECLIPSE; then
138+ GENERATOR="Eclipse CDT4 - Ninja"
139+ else
140+ GENERATOR="Ninja"
141+ fi
142+ BUILD_COMMAND="ninja"
143+else
144+ if $ECLIPSE; then
145+ GENERATOR="Eclipse CDT4 - Unix Makefiles"
146+ else
147+ GENERATOR="Unix Makefiles"
148+ fi
149+ BUILD_COMMAND="make"
150+fi
151+
152+echo "Using $BUILD_COMMAND to build"
153+
154+if $CLEAN; then
155+ rm -rf $BUILDDIR
156+fi
157+
158+mkdir -p $BUILDDIR
159+(
160+ cd $BUILDDIR
161+ cmake "$SOURCEDIR" -G "$GENERATOR" \
162+ -DCMAKE_BUILD_TYPE=$BUILD_TYPE \
163+ -DENABLE_MEMCHECK_OPTION=YES \
164+ -DCMAKE_INSTALL_PREFIX="$SOURCEDIR/../$BRANCHNAME-install"
165+ $BUILD_COMMAND
166+)
167
168=== added directory 'cmake'
169=== added file 'cmake/COPYING-CMAKE-SCRIPTS'
170--- cmake/COPYING-CMAKE-SCRIPTS 1970-01-01 00:00:00 +0000
171+++ cmake/COPYING-CMAKE-SCRIPTS 2013-07-14 08:39:27 +0000
172@@ -0,0 +1,22 @@
173+Redistribution and use in source and binary forms, with or without
174+modification, are permitted provided that the following conditions
175+are met:
176+
177+1. Redistributions of source code must retain the copyright
178+ notice, this list of conditions and the following disclaimer.
179+2. Redistributions in binary form must reproduce the copyright
180+ notice, this list of conditions and the following disclaimer in the
181+ documentation and/or other materials provided with the distribution.
182+3. The name of the author may not be used to endorse or promote products
183+ derived from this software without specific prior written permission.
184+
185+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
186+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
187+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
188+IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
189+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
190+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
191+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
192+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
193+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
194+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
195
196=== added file 'cmake/Coverage.cmake'
197--- cmake/Coverage.cmake 1970-01-01 00:00:00 +0000
198+++ cmake/Coverage.cmake 2013-07-14 08:39:27 +0000
199@@ -0,0 +1,37 @@
200+if (CMAKE_BUILD_TYPE MATCHES coverage)
201+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --coverage")
202+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --coverage")
203+ set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} --coverage")
204+ set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} --coverage")
205+
206+ find_program(GCOVR_EXECUTABLE gcovr HINTS ${GCOVR_ROOT} "${GCOVR_ROOT}/bin")
207+ if (NOT GCOVR_EXECUTABLE)
208+ message(STATUS "Gcovr binary was not found, can not generate XML coverage info.")
209+ else ()
210+ message(STATUS "Gcovr found, can generate XML coverage info.")
211+ add_custom_target (coverage-xml
212+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
213+ COMMAND "${GCOVR_EXECUTABLE}" --exclude="test.*" --exclude="obj.*" -x -r "${CMAKE_SOURCE_DIR}"
214+ --object-directory=${CMAKE_BINARY_DIR} -o coverage.xml)
215+ endif()
216+
217+ find_program(LCOV_EXECUTABLE lcov HINTS ${LCOV_ROOT} "${GCOVR_ROOT}/bin")
218+ find_program(GENHTML_EXECUTABLE genhtml HINTS ${GENHTML_ROOT})
219+ if (NOT LCOV_EXECUTABLE)
220+ message(STATUS "Lcov binary was not found, can not generate HTML coverage info.")
221+ else ()
222+ if(NOT GENHTML_EXECUTABLE)
223+ message(STATUS "Genthml binary not found, can not generate HTML coverage info.")
224+ else()
225+ message(STATUS "Lcov and genhtml found, can generate HTML coverage info.")
226+ add_custom_target (coverage-html
227+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
228+ COMMAND "${LCOV_EXECUTABLE}" --capture --output-file "${CMAKE_BINARY_DIR}/coverage.info" --no-checksum --directory "${CMAKE_BINARY_DIR}"
229+ COMMAND "${LCOV_EXECUTABLE}" --remove "${CMAKE_BINARY_DIR}/coverage.info" '/usr/*' --output-file "${CMAKE_BINARY_DIR}/coverage.info"
230+ COMMAND "${LCOV_EXECUTABLE}" --remove "${CMAKE_BINARY_DIR}/coverage.info" '${CMAKE_BINARY_DIR}/*' --output-file "${CMAKE_BINARY_DIR}/coverage.info"
231+ COMMAND "${LCOV_EXECUTABLE}" --remove "${CMAKE_BINARY_DIR}/coverage.info" '${CMAKE_SOURCE_DIR}/tests/*' --output-file "${CMAKE_BINARY_DIR}/coverage.info"
232+ COMMAND "${GENHTML_EXECUTABLE}" --prefix "${CMAKE_BINARY_DIR}" --output-directory coveragereport --title "Code Coverage" --legend --show-details coverage.info
233+ )
234+ endif()
235+ endif()
236+endif()
237
238=== added file 'cmake/FindGMock.cmake'
239--- cmake/FindGMock.cmake 1970-01-01 00:00:00 +0000
240+++ cmake/FindGMock.cmake 2013-07-14 08:39:27 +0000
241@@ -0,0 +1,11 @@
242+# Build with system gmock and embedded gtest
243+set (GMOCK_INCLUDE_DIRS "/usr/include/gmock/include" CACHE PATH "gmock source include directory")
244+set (GMOCK_SOURCE_DIR "/usr/src/gmock" CACHE PATH "gmock source directory")
245+set (GTEST_INCLUDE_DIRS "${GMOCK_SOURCE_DIR}/gtest/include" CACHE PATH "gtest source include directory")
246+
247+add_subdirectory(${GMOCK_SOURCE_DIR} "${CMAKE_CURRENT_BINARY_DIR}/gmock")
248+
249+set(GTEST_LIBRARIES gtest)
250+set(GTEST_MAIN_LIBRARIES gtest_main)
251+set(GMOCK_LIBRARIES gmock)
252+set(GMOCK_BOTH_LIBRARIES gmock gmock_main)
253
254=== added file 'cmake/FindValgrind.cmake'
255--- cmake/FindValgrind.cmake 1970-01-01 00:00:00 +0000
256+++ cmake/FindValgrind.cmake 2013-07-14 08:39:27 +0000
257@@ -0,0 +1,28 @@
258+
259+option(
260+ ENABLE_MEMCHECK_OPTION
261+ "If set to ON, enables automatic creation of memcheck targets"
262+ OFF
263+)
264+
265+find_program(
266+ VALGRIND_PROGRAM
267+ NAMES valgrind
268+)
269+
270+if(VALGRIND_PROGRAM)
271+ set(VALGRIND_PROGRAM_OPTIONS "--suppressions=${CMAKE_SOURCE_DIR}/tests/data/valgrind.suppression" "--gen-suppressions=all" "--error-exitcode=1" "--leak-check=full" "--quiet")
272+endif()
273+
274+find_package_handle_standard_args(
275+ VALGRIND DEFAULT_MSG
276+ VALGRIND_PROGRAM
277+)
278+
279+function(add_valgrind_test NAME EXECUTABLE)
280+ if(ENABLE_MEMCHECK_OPTION)
281+ add_test(${NAME} ${VALGRIND_PROGRAM} ${VALGRIND_PROGRAM_OPTIONS} "${CMAKE_CURRENT_BINARY_DIR}/${EXECUTABLE}")
282+ else()
283+ add_test(${NAME} ${EXECUTABLE})
284+ endif()
285+endfunction()
286
287=== added file 'data/CMakeLists.txt'
288--- data/CMakeLists.txt 1970-01-01 00:00:00 +0000
289+++ data/CMakeLists.txt 2013-07-14 08:39:27 +0000
290@@ -0,0 +1,38 @@
291+
292+############################
293+# DBus service definition
294+############################
295+
296+configure_file(
297+ unity-scope-soundcloud.service.in
298+ unity-scope-soundcloud.service
299+)
300+
301+install(
302+ FILES "${CMAKE_CURRENT_BINARY_DIR}/unity-scope-soundcloud.service"
303+ DESTINATION "${CMAKE_INSTALL_FULL_DATADIR}/dbus-1/services/"
304+)
305+
306+############################
307+# Scope definition
308+############################
309+
310+configure_file(
311+ soundcloud.scope.in
312+ soundcloud.scope
313+)
314+
315+install(
316+ FILES "${CMAKE_CURRENT_BINARY_DIR}/soundcloud.scope"
317+ DESTINATION "${CMAKE_INSTALL_FULL_DATADIR}/unity/scopes/music/"
318+)
319+
320+############################
321+# Icons
322+############################
323+
324+# TODO: Why is this file already provided?
325+#install(
326+# FILES "icons/service-soundcloud.svg"
327+# DESTINATION "${ICON_DIR}"
328+#)
329
330=== modified file 'data/soundcloud.scope.in'
331--- data/soundcloud.scope.in 2013-07-08 07:47:59 +0000
332+++ data/soundcloud.scope.in 2013-07-14 08:39:27 +0000
333@@ -1,18 +1,18 @@
334 [Scope]
335-DBusName=com.canonical.Unity.Scope.Music.Soundcloud
336-DBusPath=/com/canonical/unity/scope/music/soundcloud
337-Icon=/usr/share/icons/unity-icon-theme/places/svg/service-soundcloud.svg
338+DBusName=@GROUP_NAME@
339+DBusPath=@UNIQUE_NAME@
340+Icon=@ICON_PATH@
341+QueryBinary=
342 _Keywords=soundcloud;music;track;sound;listen;
343 RequiredMetadata=album[s];artist[s];
344 OptionalMetadata=genre[s];label[s];license[s];stream[s];
345-Loader=/usr/share/unity-scopes/soundcloud/unity_soundcloud_daemon.py
346-Module=soundcloud.unity_soundcloud_daemon
347-ModuleType=python3
348+Loader=
349 RemoteContent=true
350 Type=music
351 _Name=SoundCloud
352 _Description=This is an Ubuntu search plugin that enables information from SoundCloud to be searched and displayed in the Dash underneath the Music header. If you do not wish to search this content source, you can disable this search plugin.
353 _SearchHint=Search SoundCloud
354+CategoryIcon=@CATEGORY_ICON_PATH@
355
356 [Desktop Entry]
357 X-Ubuntu-Gettext-Domain=unity-scope-soundcloud
358
359=== removed file 'data/unity-scope-soundcloud.service'
360--- data/unity-scope-soundcloud.service 2013-07-08 07:47:59 +0000
361+++ data/unity-scope-soundcloud.service 1970-01-01 00:00:00 +0000
362@@ -1,3 +0,0 @@
363-[D-BUS Service]
364-Name=com.canonical.Unity.Scope.Music.Soundcloud
365-Exec=/usr/bin/python3 /usr/share/unity-scopes/scope-runner-dbus.py -s music/soundcloud.scope
366
367=== added file 'data/unity-scope-soundcloud.service.in'
368--- data/unity-scope-soundcloud.service.in 1970-01-01 00:00:00 +0000
369+++ data/unity-scope-soundcloud.service.in 2013-07-14 08:39:27 +0000
370@@ -0,0 +1,3 @@
371+[D-BUS Service]
372+Name=@GROUP_NAME@
373+Exec=@CMAKE_INSTALL_FULL_LIBEXECDIR@/unity-scope-soundcloud/unity-scope-soundcloud
374
375=== modified file 'debian/changelog'
376--- debian/changelog 2013-06-05 06:18:56 +0000
377+++ debian/changelog 2013-07-14 08:39:27 +0000
378@@ -1,3 +1,9 @@
379+unity-scope-soundcloud (0.2-0ubuntu1) UNRELEASED; urgency=low
380+
381+ * Re-write in C++.
382+
383+ -- Pete Woods <pete.woods@canonical.com> Fri, 12 Jul 2013 16:43:17 +0100
384+
385 unity-scope-soundcloud (0.1daily13.06.05-0ubuntu1) saucy; urgency=low
386
387 [ Michael Terry ]
388
389=== modified file 'debian/control'
390--- debian/control 2013-05-17 13:04:12 +0000
391+++ debian/control 2013-07-14 08:39:27 +0000
392@@ -3,14 +3,13 @@
393 Priority: optional
394 Maintainer: David Callé <davidc@framli.eu>
395 Build-Depends: debhelper (>= 9),
396- python3,
397- python3-distutils-extra,
398- python3-gi,
399+ cmake,
400 pkg-config,
401- python3-nose,
402- gir1.2-unity-5.0 (>= 7),
403- gir1.2-dee-1.0 (>= 1.2.5),
404- gir1.2-glib-2.0,
405+ google-mock (>= 1.6.0+svn437),
406+ qtbase5-dev,
407+ libunity-dev (>= 7.0.6),
408+ valgrind,
409+ gettext,
410 Standards-Version: 3.9.4
411 Homepage: https://launchpad.net/unity-scope-soundcloud
412 # If you aren't a member of ~submarine but need to upload packaging changes,
413@@ -18,15 +17,9 @@
414 Vcs-Bzr: https://code.launchpad.net/~submarine/unity-scope-soundcloud/trunk
415
416 Package: unity-scope-soundcloud
417-Architecture: all
418-Depends: ${misc:Depends},
419- ${python3:Depends},
420- python3,
421- python3-gi,
422- gir1.2-unity-5.0 (>= 7),
423- gir1.2-dee-1.0 (>= 1.2.5),
424- unity-scopes-runner,
425- gir1.2-glib-2.0
426+Architecture: any
427+Depends: ${misc:Depends},
428+ ${shlibs:Depends}
429 Description: SoundCloud scope for Unity
430 This package contains the "soundcloud" scope which allows Unity
431 to search for SoundCloud content.
432
433=== modified file 'debian/rules'
434--- debian/rules 2013-03-21 19:23:19 +0000
435+++ debian/rules 2013-07-14 08:39:27 +0000
436@@ -1,18 +1,13 @@
437 #!/usr/bin/make -f
438 # -*- makefile -*-
439
440+export DPKG_GENSYMBOLS_CHECK_LEVEL=4
441
442 %:
443- dh $@ --with python3
444-
445-override_dh_auto_clean:
446- python3 setup.py clean -a
447-
448-override_dh_auto_build:
449- python3 setup.py build
450-
451-override_dh_auto_test:
452- nosetests3
453-
454-override_dh_auto_install:
455- python3 setup.py install --root=$(CURDIR)/debian/unity-scope-soundcloud --install-layout=deb
456+ dh $@ --parallel --fail-missing
457+
458+override_dh_auto_configure:
459+ dh_auto_configure -- -DENABLE_MEMCHECK_OPTION=YES
460+
461+override_dh_makeshlibs:
462+ dh_makeshlibs -V
463
464=== added directory 'include'
465=== modified file 'po/POTFILES.in'
466--- po/POTFILES.in 2013-01-20 02:51:48 +0000
467+++ po/POTFILES.in 2013-07-14 08:39:27 +0000
468@@ -1,3 +1,8 @@
469 [encoding: UTF-8]
470+src/Curl.cpp
471+src/SoundCloud.cpp
472+src/SoundCloudParser.cpp
473+src/SoundCloudResult.cpp
474+src/unity_soundcloud_daemon.py
475 src/unity_soundcloud_daemon.py
476 [type: gettext/ini]data/soundcloud.scope.in
477
478=== removed file 'setup.cfg'
479--- setup.cfg 2013-03-13 19:44:26 +0000
480+++ setup.cfg 1970-01-01 00:00:00 +0000
481@@ -1,6 +0,0 @@
482-[build]
483-i18n=True
484-
485-[build_i18n]
486-domain=unity-scope-soundcloud
487-desktop_files=[('share/unity/scopes/music', ('data/soundcloud.scope.in',))]
488
489=== removed file 'setup.py'
490--- setup.py 2013-03-20 20:25:24 +0000
491+++ setup.py 1970-01-01 00:00:00 +0000
492@@ -1,17 +0,0 @@
493-#!/usr/bin/env python3
494-# -*- coding: utf-8 -*-
495-from distutils.core import setup
496-from DistUtilsExtra.command import *
497-
498-setup(name='unity-scope-soundcloud',
499- version='0.1',
500- author='David Callé',
501- author_email='davidc@framli.eu',
502- url='http://launchpad.net/ubuntu-scopes',
503- license='GNU General Public License (GPL)',
504- data_files=[
505- ('share/dbus-1/services', ['data/unity-scope-soundcloud.service']),
506- ('share/unity-scopes/soundcloud', ['src/unity_soundcloud_daemon.py']),
507- ('share/unity-scopes/soundcloud', ['src/__init__.py']),
508- ], cmdclass={'build': build_extra.build_extra,
509- 'build_i18n': build_i18n.build_i18n,})
510
511=== added file 'src/CMakeLists.txt'
512--- src/CMakeLists.txt 1970-01-01 00:00:00 +0000
513+++ src/CMakeLists.txt 2013-07-14 08:39:27 +0000
514@@ -0,0 +1,53 @@
515+
516+########################################
517+# SoundCloud static library for testing
518+########################################
519+
520+set(
521+ SOUNDCLOUD_SOURCES
522+ Curl.cpp
523+ SoundCloud.cpp
524+ SoundCloudParser.cpp
525+ SoundCloudResult.cpp
526+)
527+
528+add_library(
529+ soundcloud
530+ STATIC
531+ ${SOUNDCLOUD_SOURCES}
532+)
533+
534+target_link_libraries(
535+ soundcloud
536+ ${UNITY_LIBRARIES}
537+)
538+
539+qt5_use_modules(
540+ soundcloud
541+ Core
542+ Network
543+)
544+
545+#########################################
546+# SoundCloud executable for installation
547+#########################################
548+
549+add_executable(
550+ unity-scope-soundcloud
551+ main.cpp
552+)
553+
554+target_link_libraries(
555+ unity-scope-soundcloud
556+ soundcloud
557+)
558+
559+qt5_use_modules(
560+ unity-scope-soundcloud
561+ Core
562+)
563+
564+install(
565+ TARGETS unity-scope-soundcloud
566+ RUNTIME DESTINATION "${CMAKE_INSTALL_FULL_LIBEXECDIR}/unity-scope-soundcloud/"
567+)
568
569=== added file 'src/Curl.cpp'
570--- src/Curl.cpp 1970-01-01 00:00:00 +0000
571+++ src/Curl.cpp 2013-07-14 08:39:27 +0000
572@@ -0,0 +1,45 @@
573+/*
574+ * Copyright (C) 2013 Canonical, Ltd.
575+ *
576+ * This program is free software: you can redistribute it and/or modify it
577+ * under the terms of the GNU General Public License version 3, as published
578+ * by the Free Software Foundation.
579+ *
580+ * This program is distributed in the hope that it will be useful, but
581+ * WITHOUT ANY WARRANTY; without even the implied warranties of
582+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
583+ * PURPOSE. See the GNU General Public License for more details.
584+ *
585+ * You should have received a copy of the GNU General Public License along
586+ * with this program. If not, see <http://www.gnu.org/licenses/>.
587+ *
588+ * Author: Pete Woods <pete.woods@canonical.com>
589+ */
590+
591+#include <Curl.h>
592+#include <QtCore/QObject>
593+#include <QtCore/QUrl>
594+#include <QtCore/QEventLoop>
595+#include <QtNetwork/QNetworkAccessManager>
596+#include <QtNetwork/QNetworkRequest>
597+#include <QtNetwork/QNetworkReply>
598+
599+using namespace std;
600+
601+Curl::Curl() {
602+}
603+
604+Curl::~Curl() {
605+}
606+
607+QByteArray Curl::read(const string& url) const {
608+ QNetworkAccessManager manager;
609+ QNetworkReply *reply = manager.get(
610+ QNetworkRequest(QUrl(QString::fromStdString(url))));
611+
612+ QEventLoop loop;
613+ QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
614+ loop.exec();
615+
616+ return reply->readAll();
617+}
618
619=== added file 'src/Curl.h'
620--- src/Curl.h 1970-01-01 00:00:00 +0000
621+++ src/Curl.h 2013-07-14 08:39:27 +0000
622@@ -0,0 +1,34 @@
623+/*
624+ * Copyright (C) 2013 Canonical, Ltd.
625+ *
626+ * This program is free software: you can redistribute it and/or modify it
627+ * under the terms of the GNU General Public License version 3, as published
628+ * by the Free Software Foundation.
629+ *
630+ * This program is distributed in the hope that it will be useful, but
631+ * WITHOUT ANY WARRANTY; without even the implied warranties of
632+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
633+ * PURPOSE. See the GNU General Public License for more details.
634+ *
635+ * You should have received a copy of the GNU General Public License along
636+ * with this program. If not, see <http://www.gnu.org/licenses/>.
637+ *
638+ * Author: Pete Woods <pete.woods@canonical.com>
639+ */
640+
641+#ifndef SOUNDCLOUD_CURL_H_
642+#define SOUNDCLOUD_CURL_H_
643+
644+#include <QtCore/QByteArray>
645+#include <string>
646+
647+class Curl {
648+public:
649+ explicit Curl();
650+
651+ virtual ~Curl();
652+
653+ virtual QByteArray read(const std::string& url) const;
654+};
655+
656+#endif // SOUNDCLOUD_CURL_H_
657
658=== added file 'src/Localisation.h'
659--- src/Localisation.h 1970-01-01 00:00:00 +0000
660+++ src/Localisation.h 2013-07-14 08:39:27 +0000
661@@ -0,0 +1,28 @@
662+/*
663+ * Copyright (C) 2013 Canonical, Ltd.
664+ *
665+ * This program is free software: you can redistribute it and/or modify it
666+ * under the terms of the GNU General Public License version 3, as published
667+ * by the Free Software Foundation.
668+ *
669+ * This program is distributed in the hope that it will be useful, but
670+ * WITHOUT ANY WARRANTY; without even the implied warranties of
671+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
672+ * PURPOSE. See the GNU General Public License for more details.
673+ *
674+ * You should have received a copy of the GNU General Public License along
675+ * with this program. If not, see <http://www.gnu.org/licenses/>.
676+ *
677+ * Author: Pete Woods <pete.woods@canonical.com>
678+ */
679+
680+#ifndef SOUNDCLOUD_LOCALISATION_H_
681+#define SOUNDCLOUD_LOCALISATION_H_
682+
683+#include <libintl.h>
684+
685+inline char* _(const char *__msgid) {
686+ return gettext(__msgid);
687+}
688+
689+#endif // SOUNDCLOUD_LOCALISATION_H_
690
691=== added file 'src/SoundCloud.cpp'
692--- src/SoundCloud.cpp 1970-01-01 00:00:00 +0000
693+++ src/SoundCloud.cpp 2013-07-14 08:39:27 +0000
694@@ -0,0 +1,255 @@
695+/*
696+ * Copyright (C) 2013 Canonical, Ltd.
697+ *
698+ * This program is free software: you can redistribute it and/or modify it
699+ * under the terms of the GNU General Public License version 3, as published
700+ * by the Free Software Foundation.
701+ *
702+ * This program is distributed in the hope that it will be useful, but
703+ * WITHOUT ANY WARRANTY; without even the implied warranties of
704+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
705+ * PURPOSE. See the GNU General Public License for more details.
706+ *
707+ * You should have received a copy of the GNU General Public License along
708+ * with this program. If not, see <http://www.gnu.org/licenses/>.
709+ *
710+ * Author: Pete Woods <pete.woods@canonical.com>
711+ */
712+
713+#include <config.h>
714+#include <SoundCloud.h>
715+#include <SoundCloudParser.h>
716+#include <Localisation.h>
717+
718+#include <string>
719+#include <iostream>
720+
721+using namespace std;
722+
723+/**
724+ * This is the main function: the scope is defined and exported, a DBUS
725+ * connector is created and the main loop is run
726+ */
727+SoundCloud::SoundCloud(shared_ptr<Curl> curl) :
728+ m_curl(curl) {
729+ UnitySimpleScope *scope = NULL;
730+ UnityScopeDBusConnector *connector = NULL;
731+ UnityCategorySet *cats = NULL;
732+ UnityCategory *cat = NULL;
733+ GIcon *icon = NULL;
734+
735+ /* Create and set a category for the scope, including an icon */
736+ icon = g_themed_icon_new(CATEGORY_ICON_PATH);
737+
738+ cat = unity_category_new("songs", _("Songs"), icon,
739+ UNITY_CATEGORY_RENDERER_VERTICAL_TILE);
740+ cats = unity_category_set_new();
741+ unity_category_set_add(cats, cat);
742+
743+ // Create and set up the scope
744+ scope = unity_simple_scope_new();
745+ unity_simple_scope_set_group_name(scope, GROUP_NAME);
746+ unity_simple_scope_set_unique_name(scope, UNIQUE_NAME);
747+ unity_simple_scope_set_search_func(scope, search_func,
748+ reinterpret_cast<void *>(this), NULL);
749+ unity_simple_scope_set_preview_func(scope, preview_func,
750+ reinterpret_cast<void *>(this), NULL);
751+ unity_simple_scope_set_category_set(scope, cats);
752+
753+ // Set up schema
754+ UnitySchema* schema = unity_schema_new();
755+ for (const string &field : vector<string>( { "artist", "album" })) {
756+ unity_schema_add_field(schema, field.data(), "s",
757+ UNITY_SCHEMA_FIELD_TYPE_REQUIRED);
758+ }
759+ for (const string &field : vector<string>( { "genre", "label", "license",
760+ "stream", "duration", "provider_credits" })) {
761+ unity_schema_add_field(schema, field.data(), "s",
762+ UNITY_SCHEMA_FIELD_TYPE_OPTIONAL);
763+ }
764+ unity_simple_scope_set_schema(scope, schema);
765+ unity_object_unref(schema);
766+
767+ g_object_unref(icon);
768+ unity_object_unref(cat);
769+ unity_object_unref(cats);
770+
771+ /*
772+ * Setting up the connector is an action that will not be required
773+ * in future revisions of the API. In particular, we only need it here
774+ * since the scope is running locally on the device as opposed to
775+ * running on the Smart Scopes server
776+ */
777+ connector = unity_scope_dbus_connector_new(UNITY_ABSTRACT_SCOPE(scope) );
778+ unity_scope_dbus_connector_export(connector, NULL);
779+ unity_scope_dbus_connector_run();
780+}
781+
782+SoundCloud::~SoundCloud() {
783+}
784+
785+static inline void addMetadata(UnityScopeResult &scope_result, const gchar *id,
786+ const string &value) {
787+ if (!value.empty()) {
788+ g_hash_table_insert(scope_result.metadata, (gpointer) id,
789+ g_variant_new_string(value.data()));
790+ }
791+}
792+
793+/**
794+ * In this function the results from the backend are obtained and
795+ * added to the search results in the Dash
796+ *
797+ * @brief Search function
798+ * @param search Search term
799+ * @param user_data Additional user data
800+ */
801+void SoundCloud::searchFunc(UnityScopeSearchBase* search) {
802+ UnityScopeResult scope_result = { 0, 0, 0, UNITY_RESULT_TYPE_DEFAULT,
803+ (gchar *) "text/html", 0, 0, 0, 0 };
804+
805+ SoundCloudParser parser(m_curl);
806+
807+ /* Fetch the results from the backend */
808+ deque<SoundCloudResult> results(
809+ parser.getResults(search->search_context->search_query));
810+
811+ /* Iterate through the returned results and add them to the
812+ * Unity's result set
813+ */
814+ for (const SoundCloudResult &result : results) {
815+ /* Build and populate a scope result from the source data */
816+ scope_result.uri = const_cast<char *>(result.uri().data());
817+ scope_result.title = const_cast<char *>(result.title().data());
818+ scope_result.icon_hint = const_cast<char *>(result.icon().data());
819+ scope_result.comment = const_cast<char *>(result.comment().data());
820+ scope_result.dnd_uri = const_cast<char *>(result.uri().data());
821+
822+ /* Insert the metadata, if available */
823+ scope_result.metadata = g_hash_table_new(g_str_hash, g_str_equal);
824+ g_hash_table_insert(scope_result.metadata, (gpointer) "artist",
825+ g_variant_new_string(result.artist().data()));
826+ g_hash_table_insert(scope_result.metadata, (gpointer) "album",
827+ g_variant_new_string("album"));
828+
829+ addMetadata(scope_result, "genre", result.genre());
830+ addMetadata(scope_result, "label", result.label());
831+ addMetadata(scope_result, "license", result.license());
832+ addMetadata(scope_result, "stream", result.stream());
833+ addMetadata(scope_result, "duration", result.duration());
834+ addMetadata(scope_result, "creation_date", result.creationDate());
835+
836+ /*
837+ * Add the returned result to the search results list, taking a
838+ * copy of the data passed in via scope_result
839+ */
840+ unity_result_set_add_result(search->search_context->result_set,
841+ &scope_result);
842+
843+ g_hash_table_unref(scope_result.metadata);
844+ }
845+
846+}
847+
848+static void addPreviewData(UnityResultPreviewer *previewer,
849+ UnityPreview *preview, const char *id, const char *display_name) {
850+ GVariant *variant = (GVariant *) g_hash_table_lookup(
851+ previewer->result.metadata, id);
852+
853+ /* There are 2 ways to do this, the first method just directly
854+ * uses the GVariant from the hash. The second extracts the string
855+ * first, which might be useful for debugging. */
856+ if (variant) {
857+ UnityInfoHint *hint = unity_info_hint_new_with_variant(id, display_name,
858+ NULL, variant);
859+ /* The ref call here and unref below are to work-around a bug in
860+ * libunity, see:
861+ * http://code.launchpad.net/~mhr3/libunity/floating-fixes */
862+ g_object_ref(hint);
863+ unity_preview_add_info(preview, hint);
864+ g_object_unref(hint);
865+ }
866+}
867+
868+/**
869+ * This function will be invoked when the user clicks on the result and
870+ * its preview is shown in the Dash.
871+ * There are a set of predefined preview types: simply pick one, instantiate
872+ * it, add metadata to it if available, and return it.
873+ *
874+ * @brief Dash preview function
875+ * @param previewer Result previewer
876+ * @param user_data Additional user data
877+ * @return Preview populated with the result's data
878+ */
879+UnityAbstractPreview * SoundCloud::previewFunc(
880+ UnityResultPreviewer *previewer) {
881+ UnityPreview *preview = NULL;
882+ UnityPreviewAction *action = NULL;
883+
884+ /* Create a music preview */
885+ preview =
886+ UNITY_PREVIEW(unity_music_preview_new(previewer->result.title,
887+ previewer->result.comment, g_icon_new_for_string(previewer->result.icon_hint, NULL)));
888+
889+ /* Set up the preview's action */
890+ action = unity_preview_action_new_with_uri(previewer->result.uri,
891+ _("SoundCloud"), g_icon_new_for_string(CATEGORY_ICON_PATH, NULL));
892+ unity_preview_add_action(preview, action);
893+ unity_object_unref(action);
894+
895+ /* If the result contains metadata, add it to the preview */
896+ if (previewer->result.metadata) {
897+ addPreviewData(previewer, preview, "artist", _("Artist"));
898+ addPreviewData(previewer, preview, "album", _("Album"));
899+ addPreviewData(previewer, preview, "genre", _("Genre"));
900+ addPreviewData(previewer, preview, "label", _("Label"));
901+ addPreviewData(previewer, preview, "license", _("License"));
902+ addPreviewData(previewer, preview, "creation_date", _("Creation Date"));
903+
904+ {
905+ GVariant *stream = (GVariant *) g_hash_table_lookup(
906+ previewer->result.metadata, "stream");
907+
908+ if (stream) {
909+ GVariant *artist = (GVariant *) g_hash_table_lookup(
910+ previewer->result.metadata, "artist");
911+ GVariant *album = (GVariant *) g_hash_table_lookup(
912+ previewer->result.metadata, "album");
913+ GVariant *duration = (GVariant *) g_hash_table_lookup(
914+ previewer->result.metadata, "duration");
915+ guint length = 0;
916+ if (duration) {
917+ length = stoi(string(g_variant_get_string(duration, NULL)))
918+ / 1000;
919+ }
920+ UnityTrackMetadata *track = unity_track_metadata_new_full(
921+ g_variant_get_string(stream, NULL), 1,
922+ previewer->result.title,
923+ artist ? g_variant_get_string(artist, NULL) : "",
924+ album ? g_variant_get_string(artist, NULL) : "",
925+ length);
926+
927+ unity_music_preview_add_track(UNITY_MUSIC_PREVIEW(preview),
928+ track);
929+ unity_track_metadata_set_art_icon(track,
930+ g_icon_new_for_string(previewer->result.icon_hint,
931+ NULL));
932+ unity_object_unref(track);
933+ }
934+ }
935+ }
936+
937+ return UNITY_ABSTRACT_PREVIEW(preview) ;
938+}
939+
940+void SoundCloud::search_func(UnityScopeSearchBase* search, void* user_data) {
941+ SoundCloud *soundCloud(reinterpret_cast<SoundCloud *>(user_data));
942+ soundCloud->searchFunc(search);
943+}
944+
945+UnityAbstractPreview *
946+SoundCloud::preview_func(UnityResultPreviewer *previewer, void *user_data) {
947+ SoundCloud *soundCloud(reinterpret_cast<SoundCloud *>(user_data));
948+ return soundCloud->previewFunc(previewer);
949+}
950
951=== added file 'src/SoundCloud.h'
952--- src/SoundCloud.h 1970-01-01 00:00:00 +0000
953+++ src/SoundCloud.h 2013-07-14 08:39:27 +0000
954@@ -0,0 +1,47 @@
955+/*
956+ * Copyright (C) 2013 Canonical, Ltd.
957+ *
958+ * This program is free software: you can redistribute it and/or modify it
959+ * under the terms of the GNU General Public License version 3, as published
960+ * by the Free Software Foundation.
961+ *
962+ * This program is distributed in the hope that it will be useful, but
963+ * WITHOUT ANY WARRANTY; without even the implied warranties of
964+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
965+ * PURPOSE. See the GNU General Public License for more details.
966+ *
967+ * You should have received a copy of the GNU General Public License along
968+ * with this program. If not, see <http://www.gnu.org/licenses/>.
969+ *
970+ * Author: Pete Woods <pete.woods@canonical.com>
971+ */
972+
973+#ifndef SOUNDCLOUD_H_
974+#define SOUNDCLOUD_H_
975+
976+#include <Curl.h>
977+
978+#include <memory>
979+#include <unity.h>
980+
981+class SoundCloud {
982+public:
983+ explicit SoundCloud(std::shared_ptr<Curl> curl);
984+
985+ virtual ~SoundCloud();
986+
987+protected:
988+ static UnityAbstractPreview * preview_func(UnityResultPreviewer *previewer,
989+ void *user_data);
990+
991+ static void search_func(UnityScopeSearchBase* search, void* user_data);
992+
993+ UnityAbstractPreview * previewFunc(UnityResultPreviewer *previewer);
994+
995+ void searchFunc(UnityScopeSearchBase* search);
996+
997+ std::shared_ptr<Curl> m_curl;
998+
999+};
1000+
1001+#endif // SOUNDCLOUD_H_
1002
1003=== added file 'src/SoundCloudParser.cpp'
1004--- src/SoundCloudParser.cpp 1970-01-01 00:00:00 +0000
1005+++ src/SoundCloudParser.cpp 2013-07-14 08:39:27 +0000
1006@@ -0,0 +1,212 @@
1007+/*
1008+ * Copyright (C) 2013 Canonical, Ltd.
1009+ *
1010+ * This program is free software: you can redistribute it and/or modify it
1011+ * under the terms of the GNU General Public License version 3, as published
1012+ * by the Free Software Foundation.
1013+ *
1014+ * This program is distributed in the hope that it will be useful, but
1015+ * WITHOUT ANY WARRANTY; without even the implied warranties of
1016+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
1017+ * PURPOSE. See the GNU General Public License for more details.
1018+ *
1019+ * You should have received a copy of the GNU General Public License along
1020+ * with this program. If not, see <http://www.gnu.org/licenses/>.
1021+ *
1022+ * Author: Pete Woods <pete.woods@canonical.com>
1023+ */
1024+
1025+#include <SoundCloudParser.h>
1026+#include <Localisation.h>
1027+#include <Curl.h>
1028+
1029+#include <iostream>
1030+#include <sstream>
1031+#include <stdexcept>
1032+
1033+#include <QtCore/QXmlStreamReader>
1034+
1035+using namespace std;
1036+
1037+const string SoundCloudParser::SEARCH_URI = "https://api.soundcloud.com/";
1038+
1039+const string SoundCloudParser::API_KEY = "398e83f17ec3c5cf945f04772de9f400";
1040+
1041+SoundCloudParser::SoundCloudParser(std::shared_ptr<Curl> curl) :
1042+ m_curl(curl) {
1043+}
1044+
1045+SoundCloudParser::~SoundCloudParser() {
1046+}
1047+
1048+deque<SoundCloudResult> SoundCloudParser::getResults(const string &searchTerm) {
1049+ deque<SoundCloudResult> results;
1050+
1051+ /* Check if an actual search term was submitted, return otherwise */
1052+ if (searchTerm.empty()) {
1053+ cerr << _("SearchTerm cannot be empty");
1054+ return results;
1055+ }
1056+
1057+ /* Construct the full search query */
1058+ ostringstream urlStream;
1059+ urlStream << SEARCH_URI << "tracks?consumer_key=" << API_KEY << "&q="
1060+ << searchTerm << "&order=hotness&limit=30";
1061+
1062+ /*
1063+ * Submit the query to the source, parse the results and populate
1064+ * the results list here.
1065+ */
1066+ QXmlStreamReader xml(m_curl->read(urlStream.str()));
1067+
1068+ try {
1069+ while (!xml.atEnd()) {
1070+ QXmlStreamReader::TokenType token = xml.readNext();
1071+ if (xml.error() != QXmlStreamReader::NoError) {
1072+ throw logic_error(_("XML not well formed"));
1073+ }
1074+
1075+ /* If token is just StartDocument, we'll go to next.*/
1076+ if (token == QXmlStreamReader::StartDocument) {
1077+ continue;
1078+ }
1079+
1080+ /* If token is StartElement, we'll see if we can read it.*/
1081+ if (token == QXmlStreamReader::StartElement) {
1082+ /* If it's named tracks, we'll go to the next.*/
1083+ if (xml.name() == "tracks") {
1084+ continue;
1085+ }
1086+ /* If it's named track, we'll dig the information from there.*/
1087+ if (xml.name() == "track") {
1088+ parseTrack(xml, results);
1089+ }
1090+ }
1091+ }
1092+ } catch (logic_error &e) {
1093+ cerr << e.what() << endl;
1094+ results.pop_back();
1095+ }
1096+
1097+ return results;
1098+}
1099+
1100+void SoundCloudParser::parseTrack(QXmlStreamReader& xml,
1101+ deque<SoundCloudResult> &results) {
1102+ /* Let's check that we're really getting a track. */
1103+ if (xml.tokenType() != QXmlStreamReader::StartElement
1104+ && xml.name() == "track") {
1105+ cerr << _("Not a track") << endl;
1106+ return;
1107+ }
1108+
1109+ results.push_back(SoundCloudResult());
1110+ SoundCloudResult &track(results.back());
1111+
1112+ /* Next element... */
1113+ xml.readNext();
1114+ if (xml.error() != QXmlStreamReader::NoError) {
1115+ throw logic_error(_("XML not well formed"));
1116+ }
1117+
1118+ /*
1119+ * We're going to loop over the things because the order might change.
1120+ * We'll continue the loop until we hit an EndElement named track.
1121+ */
1122+ while (!(xml.tokenType() == QXmlStreamReader::EndElement
1123+ && xml.name() == "track")) {
1124+ if (xml.tokenType() == QXmlStreamReader::StartElement) {
1125+ if (xml.name() == "permalink-url") {
1126+ track.setUri(readCharacterData(xml));
1127+ } else if (xml.name() == "artwork-url") {
1128+ track.setIcon(readCharacterData(xml));
1129+ } else if (xml.name() == "title") {
1130+ track.setTitle(readCharacterData(xml));
1131+ } else if (xml.name() == "description") {
1132+ track.setComment(readCharacterData(xml));
1133+ } else if (xml.name() == "genre") {
1134+ track.setGenre(readCharacterData(xml));
1135+ } else if (xml.name() == "label-name") {
1136+ track.setLabel(readCharacterData(xml));
1137+ } else if (xml.name() == "license") {
1138+ track.setLicense(readCharacterData(xml));
1139+ } else if (xml.name() == "stream-url") {
1140+ track.setStream(readCharacterData(xml));
1141+ } else if (xml.name() == "created-at") {
1142+ track.setCreationDate(readCharacterData(xml));
1143+ } else if (xml.name() == "duration") {
1144+ track.setDuration(readCharacterData(xml));
1145+ } else if (xml.name() == "user") {
1146+ track.setArtist(readUserName(xml));
1147+ } else if (xml.name() == "created-with") {
1148+ xml.skipCurrentElement();
1149+ }
1150+ }
1151+
1152+ /* ...and next... */
1153+ xml.readNext();
1154+ if (xml.error() != QXmlStreamReader::NoError) {
1155+ throw logic_error(_("XML not well formed"));
1156+ }
1157+ }
1158+}
1159+
1160+string SoundCloudParser::readUserName(QXmlStreamReader& xml) const {
1161+ /* Let's check that we're really getting a user. */
1162+ if (xml.tokenType() != QXmlStreamReader::StartElement
1163+ && xml.name() == "user") {
1164+ cerr << _("Not a user") << endl;
1165+ return "";
1166+ }
1167+
1168+ /* Next element... */
1169+ xml.readNext();
1170+ if (xml.error() != QXmlStreamReader::NoError) {
1171+ throw logic_error(_("XML not well formed"));
1172+ }
1173+
1174+ string result("");
1175+
1176+ /*
1177+ * We're going to loop over the things because the order might change.
1178+ * We'll continue the loop until we hit an EndElement named user.
1179+ */
1180+ while (!(xml.tokenType() == QXmlStreamReader::EndElement
1181+ && xml.name() == "user")) {
1182+ if (xml.tokenType() == QXmlStreamReader::StartElement) {
1183+ if (xml.name() == "username") {
1184+ result = readCharacterData(xml);
1185+ }
1186+ }
1187+
1188+ /* ...and next... */
1189+ xml.readNext();
1190+ if (xml.error() != QXmlStreamReader::NoError) {
1191+ throw logic_error(_("XML not well formed"));
1192+ }
1193+ }
1194+
1195+ return result;
1196+}
1197+
1198+string SoundCloudParser::readCharacterData(QXmlStreamReader& xml) const {
1199+ /* We need a start element, like <foo> */
1200+ if (xml.tokenType() != QXmlStreamReader::StartElement) {
1201+ return "";
1202+ }
1203+
1204+ xml.readNext();
1205+ if (xml.error() != QXmlStreamReader::NoError) {
1206+ throw logic_error(_("XML not well formed"));
1207+ }
1208+ /*
1209+ * This elements needs to contain Characters so we know it's
1210+ * actually data, if it's not we'll leave.
1211+ */
1212+ if (xml.tokenType() != QXmlStreamReader::Characters) {
1213+ return "";
1214+ }
1215+
1216+ /* Now we can get the data*/
1217+ return xml.text().toString().toStdString();
1218+}
1219
1220=== added file 'src/SoundCloudParser.h'
1221--- src/SoundCloudParser.h 1970-01-01 00:00:00 +0000
1222+++ src/SoundCloudParser.h 2013-07-14 08:39:27 +0000
1223@@ -0,0 +1,62 @@
1224+/*
1225+ * Copyright (C) 2013 Canonical, Ltd.
1226+ *
1227+ * This program is free software: you can redistribute it and/or modify it
1228+ * under the terms of the GNU General Public License version 3, as published
1229+ * by the Free Software Foundation.
1230+ *
1231+ * This program is distributed in the hope that it will be useful, but
1232+ * WITHOUT ANY WARRANTY; without even the implied warranties of
1233+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
1234+ * PURPOSE. See the GNU General Public License for more details.
1235+ *
1236+ * You should have received a copy of the GNU General Public License along
1237+ * with this program. If not, see <http://www.gnu.org/licenses/>.
1238+ *
1239+ * Author: Pete Woods <pete.woods@canonical.com>
1240+ */
1241+
1242+#ifndef SOUNDCLOUD_PARSER_H_
1243+#define SOUNDCLOUD_PARSER_H_
1244+
1245+#include <SoundCloudResult.h>
1246+#include <Curl.h>
1247+
1248+#include <string>
1249+#include <deque>
1250+#include <memory>
1251+
1252+QT_BEGIN_NAMESPACE
1253+class QXmlStreamReader;
1254+QT_END_NAMESPACE
1255+
1256+class SoundCloudParser {
1257+public:
1258+ static const std::string SEARCH_URI;
1259+
1260+ static const std::string API_KEY;
1261+
1262+ explicit SoundCloudParser(std::shared_ptr<Curl> curl);
1263+
1264+ virtual ~SoundCloudParser();
1265+
1266+ /**
1267+ * @brief Get and parse the results from a search query
1268+ * @param searchTerm String submitted as the search term
1269+ *
1270+ * @return Search results
1271+ */
1272+ std::deque<SoundCloudResult> getResults(const std::string &searchTerm);
1273+
1274+protected:
1275+ void parseTrack(QXmlStreamReader& xml,
1276+ std::deque<SoundCloudResult> &results);
1277+
1278+ std::string readCharacterData(QXmlStreamReader& xml) const;
1279+
1280+ std::string readUserName(QXmlStreamReader& xml) const;
1281+
1282+ std::shared_ptr<Curl> m_curl;
1283+};
1284+
1285+#endif // SOUNDCLOUD_PARSER_H_
1286
1287=== added file 'src/SoundCloudResult.cpp'
1288--- src/SoundCloudResult.cpp 1970-01-01 00:00:00 +0000
1289+++ src/SoundCloudResult.cpp 2013-07-14 08:39:27 +0000
1290@@ -0,0 +1,115 @@
1291+/*
1292+ * Copyright (C) 2013 Canonical, Ltd.
1293+ *
1294+ * This program is free software: you can redistribute it and/or modify it
1295+ * under the terms of the GNU General Public License version 3, as published
1296+ * by the Free Software Foundation.
1297+ *
1298+ * This program is distributed in the hope that it will be useful, but
1299+ * WITHOUT ANY WARRANTY{} without even the implied warranties of
1300+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
1301+ * PURPOSE. See the GNU General Public License for more details.
1302+ *
1303+ * You should have received a copy of the GNU General Public License along
1304+ * with this program. If not, see <http://www.gnu.org/licenses/>.
1305+ *
1306+ * Author: Pete Woods <pete.woods@canonical.com>
1307+ */
1308+
1309+#include <SoundCloudResult.h>
1310+#include <config.h>
1311+
1312+SoundCloudResult::SoundCloudResult() :
1313+ m_icon(DEFAULT_ICON_PATH) {
1314+}
1315+
1316+SoundCloudResult::~SoundCloudResult() {
1317+}
1318+
1319+void SoundCloudResult::setUri(const std::string &uri) {
1320+ m_uri = uri;
1321+}
1322+
1323+const std::string & SoundCloudResult::uri() const {
1324+ return m_uri;
1325+}
1326+
1327+void SoundCloudResult::setIcon(const std::string &icon) {
1328+ m_icon = icon;
1329+}
1330+
1331+const std::string & SoundCloudResult::icon() const {
1332+ return m_icon;
1333+}
1334+
1335+void SoundCloudResult::setTitle(const std::string &title) {
1336+ m_title = title;
1337+}
1338+
1339+const std::string & SoundCloudResult::title() const {
1340+ return m_title;
1341+}
1342+
1343+void SoundCloudResult::setComment(const std::string &comment) {
1344+ m_comment = comment;
1345+}
1346+
1347+const std::string & SoundCloudResult::comment() const {
1348+ return m_comment;
1349+}
1350+
1351+void SoundCloudResult::setGenre(const std::string &genre) {
1352+ m_genre = genre;
1353+}
1354+
1355+const std::string & SoundCloudResult::genre() const {
1356+ return m_genre;
1357+}
1358+
1359+void SoundCloudResult::setLabel(const std::string &label) {
1360+ m_label = label;
1361+}
1362+
1363+const std::string & SoundCloudResult::label() const {
1364+ return m_label;
1365+}
1366+
1367+void SoundCloudResult::setLicense(const std::string &license) {
1368+ m_license = license;
1369+}
1370+
1371+const std::string & SoundCloudResult::license() const {
1372+ return m_license;
1373+}
1374+
1375+void SoundCloudResult::setStream(const std::string &stream) {
1376+ m_stream = stream;
1377+}
1378+
1379+const std::string & SoundCloudResult::stream() const {
1380+ return m_stream;
1381+}
1382+
1383+void SoundCloudResult::setDuration(const std::string &duration) {
1384+ m_duration = duration;
1385+}
1386+
1387+const std::string & SoundCloudResult::duration() const {
1388+ return m_duration;
1389+}
1390+
1391+void SoundCloudResult::setArtist(const std::string &artist) {
1392+ m_artist = artist;
1393+}
1394+
1395+const std::string & SoundCloudResult::artist() const {
1396+ return m_artist;
1397+}
1398+
1399+void SoundCloudResult::setCreationDate(const std::string &creationDate) {
1400+ m_creationDate = creationDate;
1401+}
1402+
1403+const std::string & SoundCloudResult::creationDate() const {
1404+ return m_creationDate;
1405+}
1406
1407=== added file 'src/SoundCloudResult.h'
1408--- src/SoundCloudResult.h 1970-01-01 00:00:00 +0000
1409+++ src/SoundCloudResult.h 2013-07-14 08:39:27 +0000
1410@@ -0,0 +1,98 @@
1411+/*
1412+ * Copyright (C) 2013 Canonical, Ltd.
1413+ *
1414+ * This program is free software: you can redistribute it and/or modify it
1415+ * under the terms of the GNU General Public License version 3, as published
1416+ * by the Free Software Foundation.
1417+ *
1418+ * This program is distributed in the hope that it will be useful, but
1419+ * WITHOUT ANY WARRANTY; without even the implied warranties of
1420+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
1421+ * PURPOSE. See the GNU General Public License for more details.
1422+ *
1423+ * You should have received a copy of the GNU General Public License along
1424+ * with this program. If not, see <http://www.gnu.org/licenses/>.
1425+ *
1426+ * Author: Pete Woods <pete.woods@canonical.com>
1427+ */
1428+
1429+#ifndef SOUNDCLOUDRESULT_H_
1430+#define SOUNDCLOUDRESULT_H_
1431+
1432+#include <string>
1433+
1434+class SoundCloudResult {
1435+public:
1436+ explicit SoundCloudResult();
1437+
1438+ virtual ~SoundCloudResult();
1439+
1440+ void setUri(const std::string &uri);
1441+
1442+ const std::string & uri() const;
1443+
1444+ void setIcon(const std::string &icon);
1445+
1446+ const std::string & icon() const;
1447+
1448+ void setTitle(const std::string &title);
1449+
1450+ const std::string & title() const;
1451+
1452+ void setComment(const std::string &comment);
1453+
1454+ const std::string & comment() const;
1455+
1456+ void setGenre(const std::string &genre);
1457+
1458+ const std::string & genre() const;
1459+
1460+ void setLabel(const std::string &label);
1461+
1462+ const std::string & label() const;
1463+
1464+ void setLicense(const std::string &license);
1465+
1466+ const std::string & license() const;
1467+
1468+ void setStream(const std::string &stream);
1469+
1470+ const std::string & stream() const;
1471+
1472+ void setDuration(const std::string &duration);
1473+
1474+ const std::string & duration() const;
1475+
1476+ void setArtist(const std::string &artist);
1477+
1478+ const std::string & artist() const;
1479+
1480+ void setCreationDate(const std::string &creationDate);
1481+
1482+ const std::string & creationDate() const;
1483+
1484+protected:
1485+ std::string m_uri;
1486+
1487+ std::string m_icon;
1488+
1489+ std::string m_title;
1490+
1491+ std::string m_comment;
1492+
1493+ std::string m_genre;
1494+
1495+ std::string m_label;
1496+
1497+ std::string m_license;
1498+
1499+ std::string m_stream;
1500+
1501+ std::string m_duration;
1502+
1503+ std::string m_artist;
1504+
1505+ std::string m_creationDate;
1506+};
1507+
1508+#endif // SOUNDCLOUDRESULT_H_
1509
1510=== removed file 'src/__init__.py'
1511=== added file 'src/config.h.in'
1512--- src/config.h.in 1970-01-01 00:00:00 +0000
1513+++ src/config.h.in 2013-07-14 08:39:27 +0000
1514@@ -0,0 +1,31 @@
1515+/*
1516+ * Copyright (C) 2013 Canonical, Ltd.
1517+ *
1518+ * This program is free software: you can redistribute it and/or modify it
1519+ * under the terms of the GNU General Public License version 3, as published
1520+ * by the Free Software Foundation.
1521+ *
1522+ * This program is distributed in the hope that it will be useful, but
1523+ * WITHOUT ANY WARRANTY; without even the implied warranties of
1524+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
1525+ * PURPOSE. See the GNU General Public License for more details.
1526+ *
1527+ * You should have received a copy of the GNU General Public License along
1528+ * with this program. If not, see <http://www.gnu.org/licenses/>.
1529+ *
1530+ * Author: Pete Woods <pete.woods@canonical.com>
1531+ */
1532+
1533+#ifndef __CONFIG_H__
1534+#define __CONFIG_H__
1535+
1536+#define GROUP_NAME "@GROUP_NAME@"
1537+#define UNIQUE_NAME "@UNIQUE_NAME@"
1538+
1539+#define CATEGORY_ICON_PATH "@CATEGORY_ICON_PATH@"
1540+#define DEFAULT_ICON_PATH "@DEFAULT_ICON_PATH@"
1541+
1542+#define GETTEXT_PACKAGE "@GETTEXT_PACKAGE@"
1543+#define LOCALE_DIR "@LOCALE_DIR@"
1544+
1545+#endif /* __CONFIG_H__ */
1546
1547=== added file 'src/main.cpp'
1548--- src/main.cpp 1970-01-01 00:00:00 +0000
1549+++ src/main.cpp 2013-07-14 08:39:27 +0000
1550@@ -0,0 +1,41 @@
1551+/*
1552+ * Copyright (C) 2013 Canonical, Ltd.
1553+ *
1554+ * This program is free software: you can redistribute it and/or modify it
1555+ * under the terms of the GNU General Public License version 3, as published
1556+ * by the Free Software Foundation.
1557+ *
1558+ * This program is distributed in the hope that it will be useful, but
1559+ * WITHOUT ANY WARRANTY; without even the implied warranties of
1560+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
1561+ * PURPOSE. See the GNU General Public License for more details.
1562+ *
1563+ * You should have received a copy of the GNU General Public License along
1564+ * with this program. If not, see <http://www.gnu.org/licenses/>.
1565+ *
1566+ * Author: Pete Woods <pete.woods@canonical.com>
1567+ */
1568+
1569+#include <SoundCloud.h>
1570+#include <config.h>
1571+
1572+#include <libintl.h>
1573+#include <locale.h>
1574+#include <memory>
1575+
1576+#include <QtCore/QCoreApplication>
1577+
1578+using namespace std;
1579+
1580+int main(int argc, char **argv) {
1581+ QCoreApplication application(argc, argv);
1582+
1583+ setlocale(LC_ALL, "");
1584+ bindtextdomain(GETTEXT_PACKAGE, LOCALE_DIR);
1585+ textdomain(GETTEXT_PACKAGE);
1586+
1587+ shared_ptr<Curl> curl(new Curl());
1588+ SoundCloud soundCloud(curl);
1589+
1590+ return 0;
1591+}
1592
1593=== removed file 'src/unity_soundcloud_daemon.py'
1594--- src/unity_soundcloud_daemon.py 2013-04-26 12:48:36 +0000
1595+++ src/unity_soundcloud_daemon.py 1970-01-01 00:00:00 +0000
1596@@ -1,245 +0,0 @@
1597-#! /usr/bin/python3
1598-# -*- coding: utf-8 -*-
1599-
1600-# Copyright (C) 2013 David Callé <davidc@framli.eu>
1601-# This program is free software: you can redistribute it and/or modify it
1602-# under the terms of the GNU General Public License version 3, as published
1603-# by the Free Software Foundation.
1604-#
1605-# This program is distributed in the hope that it will be useful, but
1606-# WITHOUT ANY WARRANTY; without even the implied warranties of
1607-# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
1608-# PURPOSE. See the GNU General Public License for more details.
1609-#
1610-# You should have received a copy of the GNU General Public License along
1611-# with this program. If not, see <http://www.gnu.org/licenses/>.
1612-
1613-from gi.repository import Unity, UnityExtras
1614-from gi.repository import Gio, GLib
1615-import urllib.parse
1616-import urllib.request
1617-import json
1618-import gettext
1619-
1620-APP_NAME = 'unity-scope-soundcloud'
1621-LOCAL_PATH = '/usr/share/locale/'
1622-gettext.bindtextdomain(APP_NAME, LOCAL_PATH)
1623-gettext.textdomain(APP_NAME)
1624-_ = gettext.gettext
1625-
1626-GROUP_NAME = 'com.canonical.Unity.Scope.Music.Soundcloud'
1627-UNIQUE_PATH = '/com/canonical/unity/scope/music/soundcloud'
1628-SEARCH_URI = 'https://api.soundcloud.com/'
1629-SEARCH_HINT = _('Search SoundCloud')
1630-API_KEY = '398e83f17ec3c5cf945f04772de9f400'
1631-NO_RESULTS_HINT = _('Sorry, there are no SoundCloud tracks that match your search.')
1632-PROVIDER_CREDITS = _('Powered by SoundCloud')
1633-SVG_DIR = '/usr/share/icons/unity-icon-theme/places/svg/'
1634-PROVIDER_ICON = SVG_DIR+'service-soundcloud.svg'
1635-DEFAULT_RESULT_ICON = SVG_DIR+'result-music.svg'
1636-DEFAULT_RESULT_MIMETYPE = 'text/html'
1637-DEFAULT_RESULT_TYPE = Unity.ResultType.DEFAULT
1638-
1639-c1 = {'id' :'songs',
1640- 'name' :_('Songs'),
1641- 'icon' :SVG_DIR+'group-songs.svg',
1642- 'renderer':Unity.CategoryRenderer.VERTICAL_TILE}
1643-CATEGORIES = [c1]
1644-
1645-FILTERS = []
1646-
1647-m1 = {'id' :'album',
1648- 'type' :'s',
1649- 'field':Unity.SchemaFieldType.REQUIRED}
1650-m2 = {'id' :'artist',
1651- 'type' :'s',
1652- 'field':Unity.SchemaFieldType.REQUIRED}
1653-m3 = {'id' :'genre',
1654- 'type' :'s',
1655- 'field':Unity.SchemaFieldType.OPTIONAL}
1656-m4 = {'id' :'label',
1657- 'type' :'s',
1658- 'field':Unity.SchemaFieldType.OPTIONAL}
1659-m5 = {'id' :'license',
1660- 'type' :'s',
1661- 'field':Unity.SchemaFieldType.OPTIONAL}
1662-m6 = {'id' :'stream',
1663- 'type' :'s',
1664- 'field':Unity.SchemaFieldType.OPTIONAL}
1665-m7 = {'id' :'duration',
1666- 'type' :'s',
1667- 'field':Unity.SchemaFieldType.OPTIONAL}
1668-EXTRA_METADATA = [m1, m2, m3, m4, m5, m6, m7]
1669-
1670-def search(search, filters):
1671- '''
1672- Any search method returning results as a list of tuples.
1673- Available tuple fields:
1674- uri (string)
1675- icon (string)
1676- title (string)
1677- comment (string)
1678- dnd_uri (string)
1679- mimetype (string)
1680- category (int)
1681- result_type (Unity ResultType)
1682- extras metadata fields (variant)
1683- '''
1684- results = []
1685- if not search:
1686- return results
1687- search = urllib.parse.quote(search)
1688- uri = "%stracks.json?consumer_key=%s&q=%s&order=hotness&limit=30" % (SEARCH_URI, API_KEY, search)
1689- print(uri)
1690- data = []
1691- try:
1692- response = urllib.request.urlopen(uri).read()
1693- data = json.loads(response.decode('utf8'))
1694- except Exception as error:
1695- print(error)
1696- checks = ['permalink_url', 'artwork_url',
1697- 'title', 'description', 'stream_url',
1698- 'genre', 'label_name', 'license',
1699- 'user', 'duration']
1700- for r in data:
1701- for c in checks:
1702- if not c in r or not r[c]:
1703- if c == 'artwork_url':
1704- r[c] = r['user']['avatar_url']
1705- elif c == 'user':
1706- if not r[c]['username']:
1707- r[c]['username'] = ''
1708- else:
1709- r[c] = ''
1710- if 'stream_url' in r and r['stream_url'] != '':
1711- r['stream_url'] = r['stream_url'] + '?consumer_key=%s' % API_KEY
1712- results.append({'uri':r['permalink_url'],
1713- 'icon':r['artwork_url'],
1714- 'title':r['title'],
1715- 'comment':r['description'],
1716- 'album':GLib.Variant('s',''),
1717- 'artist':GLib.Variant('s',r['user']['username']),
1718- 'genre':GLib.Variant('s',r['genre']),
1719- 'label':GLib.Variant('s',r['label_name']),
1720- 'license':GLib.Variant('s',r['license']),
1721- 'stream':GLib.Variant('s',r['stream_url']),
1722- 'duration':GLib.Variant('s',str(r['duration']))})
1723- return results
1724-
1725-
1726-# Classes below this point establish communication
1727-# with Unity, you probably shouldn't modify them.
1728-
1729-
1730-class MySearch (Unity.ScopeSearchBase):
1731- def __init__(self, search_context):
1732- super (MySearch, self).__init__()
1733- self.set_search_context (search_context)
1734-
1735- def do_run (self):
1736- '''
1737- Adds results to the model
1738- '''
1739- try:
1740- result_set = self.search_context.result_set
1741- for i in search(self.search_context.search_query,
1742- self.search_context.filter_state):
1743- if not 'uri' in i or not i['uri'] or i['uri'] == '':
1744- continue
1745- if not 'icon' in i or not i['icon'] or i['icon'] == '':
1746- i['icon'] = DEFAULT_RESULT_ICON
1747- if not 'mimetype' in i or not i['mimetype'] or i['mimetype'] == '':
1748- i['mimetype'] = DEFAULT_RESULT_MIMETYPE
1749- if not 'result_type' in i or not i['result_type'] or i['result_type'] == '':
1750- i['result_type'] = DEFAULT_RESULT_TYPE
1751- if not 'category' in i or not i['category'] or i['category'] == '':
1752- i['category'] = 0
1753- if not 'title' in i or not i['title']:
1754- i['title'] = ''
1755- if not 'comment' in i or not i['comment']:
1756- i['comment'] = ''
1757- if not 'dnd_uri' in i or not i['dnd_uri'] or i['dnd_uri'] == '':
1758- i['dnd_uri'] = i['uri']
1759- result_set.add_result(**i)
1760- except Exception as error:
1761- print (error)
1762-
1763-class Preview (Unity.ResultPreviewer):
1764-
1765- def do_run(self):
1766- title = self.result.title.strip()
1767- stream = self.result.metadata['stream'].get_string()
1768- duration = int(self.result.metadata['duration'].get_string())
1769- author = self.result.metadata['artist'].get_string()
1770- description = self.result.comment.strip()
1771- image = self.result.icon_hint.replace('large.jpg', 'original.jpg')
1772- preview = Unity.MusicPreview.new(title, description, None)
1773- if stream != '':
1774- t = Unity.TrackMetadata.full(stream, 1, title, author, '', duration / 1000)
1775- preview.add_track(t)
1776- preview.props.subtitle = author
1777- preview.props.image_source_uri = image
1778- icon = Gio.FileIcon.new (Gio.file_new_for_path(PROVIDER_ICON))
1779- view_action = Unity.PreviewAction.new("view", _("SoundCloud"), icon)
1780- preview.add_action(view_action)
1781- return preview
1782-
1783-class Scope (Unity.AbstractScope):
1784- def __init__(self):
1785- Unity.AbstractScope.__init__(self)
1786-
1787- def do_get_search_hint (self):
1788- return SEARCH_HINT
1789-
1790- def do_get_schema (self):
1791- '''
1792- Adds specific metadata fields
1793- '''
1794- schema = Unity.Schema.new ()
1795- if EXTRA_METADATA:
1796- for m in EXTRA_METADATA:
1797- schema.add_field(m['id'], m['type'], m['field'])
1798- #FIXME should be REQUIRED for credits
1799- schema.add_field('provider_credits', 's', Unity.SchemaFieldType.OPTIONAL)
1800- return schema
1801-
1802- def do_get_categories (self):
1803- '''
1804- Adds categories
1805- '''
1806- cs = Unity.CategorySet.new ()
1807- if CATEGORIES:
1808- for c in CATEGORIES:
1809- cat = Unity.Category.new (c['id'], c['name'],
1810- Gio.ThemedIcon.new(c['icon']),
1811- c['renderer'])
1812- cs.add (cat)
1813- return cs
1814-
1815- def do_get_filters (self):
1816- '''
1817- Adds filters
1818- '''
1819- fs = Unity.FilterSet.new ()
1820-# if FILTERS:
1821-#
1822- return fs
1823-
1824- def do_get_group_name (self):
1825- return GROUP_NAME
1826-
1827- def do_get_unique_name (self):
1828- return UNIQUE_PATH
1829-
1830- def do_create_search_for_query (self, search_context):
1831- se = MySearch (search_context)
1832- return se
1833-
1834- def do_create_previewer(self, result, metadata):
1835- rp = Preview()
1836- rp.set_scope_result(result)
1837- rp.set_search_metadata(metadata)
1838- return rp
1839-
1840-def load_scope():
1841- return Scope()
1842
1843=== added file 'tests/CMakeLists.txt'
1844--- tests/CMakeLists.txt 1970-01-01 00:00:00 +0000
1845+++ tests/CMakeLists.txt 2013-07-14 08:39:27 +0000
1846@@ -0,0 +1,43 @@
1847+
1848+include(FindGMock)
1849+include_directories(${GMOCK_INCLUDE_DIRS})
1850+include_directories(${GTEST_INCLUDE_DIRS})
1851+
1852+find_package("Valgrind" REQUIRED)
1853+
1854+add_definitions(
1855+ -DCURL_DATA_HELLO="${CMAKE_CURRENT_SOURCE_DIR}/data/curl_data_hello"
1856+ -DMOCK_SOUNDCLOUD_FAIL="${CMAKE_CURRENT_SOURCE_DIR}/data/mock_soundcloud_fail"
1857+ -DMOCK_SOUNDCLOUD_MALFORMED="${CMAKE_CURRENT_SOURCE_DIR}/data/mock_soundcloud_malformed"
1858+ -DMOCK_SOUNDCLOUD_PASS="${CMAKE_CURRENT_SOURCE_DIR}/data/mock_soundcloud_pass"
1859+)
1860+
1861+set(
1862+ TEST_SOUNDCLOUD_SOURCES
1863+ main.cpp
1864+ TestCurl.cpp
1865+ TestSoundCloudParser.cpp
1866+)
1867+
1868+add_executable(
1869+ test-soundcloud
1870+ ${TEST_SOUNDCLOUD_SOURCES}
1871+)
1872+
1873+target_link_libraries(
1874+ test-soundcloud
1875+ soundcloud
1876+ ${UNITY_LIBRARIES}
1877+ ${GTEST_LIBRARIES}
1878+ ${GMOCK_LIBRARIES}
1879+)
1880+
1881+qt5_use_modules(
1882+ test-soundcloud
1883+ Core
1884+)
1885+
1886+add_valgrind_test(
1887+ test-soundcloud
1888+ test-soundcloud
1889+)
1890\ No newline at end of file
1891
1892=== added file 'tests/TestCurl.cpp'
1893--- tests/TestCurl.cpp 1970-01-01 00:00:00 +0000
1894+++ tests/TestCurl.cpp 2013-07-14 08:39:27 +0000
1895@@ -0,0 +1,50 @@
1896+/*
1897+ * Copyright (C) 2013 Canonical, Ltd.
1898+ *
1899+ * This program is free software: you can redistribute it and/or modify it
1900+ * under the terms of the GNU General Public License version 3, as published
1901+ * by the Free Software Foundation.
1902+ *
1903+ * This program is distributed in the hope that it will be useful, but
1904+ * WITHOUT ANY WARRANTY; without even the implied warranties of
1905+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
1906+ * PURPOSE. See the GNU General Public License for more details.
1907+ *
1908+ * You should have received a copy of the GNU General Public License along
1909+ * with this program. If not, see <http://www.gnu.org/licenses/>.
1910+ *
1911+ * Author: Pete Woods <pete.woods@canonical.com>
1912+ */
1913+
1914+#include <SoundCloudParser.h>
1915+
1916+#include <QtCore/QFile>
1917+
1918+#include <gmock/gmock.h>
1919+#include <gtest/gtest.h>
1920+
1921+using namespace std;
1922+using namespace testing;
1923+
1924+namespace {
1925+
1926+class TestCurl: public Test {
1927+protected:
1928+ TestCurl() {
1929+ }
1930+
1931+ virtual ~TestCurl() {
1932+ }
1933+};
1934+
1935+TEST_F(TestCurl, DownloadsFile) {
1936+ ostringstream urlStream;
1937+ urlStream << "file://" << CURL_DATA_HELLO;
1938+
1939+ Curl curl;
1940+ QByteArray ba(curl.read(urlStream.str()));
1941+
1942+ EXPECT_EQ("Hello!", QString(ba).toStdString());
1943+}
1944+
1945+} // namespace
1946
1947=== added file 'tests/TestSoundCloudParser.cpp'
1948--- tests/TestSoundCloudParser.cpp 1970-01-01 00:00:00 +0000
1949+++ tests/TestSoundCloudParser.cpp 2013-07-14 08:39:27 +0000
1950@@ -0,0 +1,158 @@
1951+/*
1952+ * Copyright (C) 2013 Canonical, Ltd.
1953+ *
1954+ * This program is free software: you can redistribute it and/or modify it
1955+ * under the terms of the GNU General Public License version 3, as published
1956+ * by the Free Software Foundation.
1957+ *
1958+ * This program is distributed in the hope that it will be useful, but
1959+ * WITHOUT ANY WARRANTY; without even the implied warranties of
1960+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
1961+ * PURPOSE. See the GNU General Public License for more details.
1962+ *
1963+ * You should have received a copy of the GNU General Public License along
1964+ * with this program. If not, see <http://www.gnu.org/licenses/>.
1965+ *
1966+ * Author: Pete Woods <pete.woods@canonical.com>
1967+ */
1968+
1969+#include <SoundCloudParser.h>
1970+#include <config.h>
1971+
1972+#include <QtCore/QFile>
1973+
1974+#include <gmock/gmock.h>
1975+#include <gtest/gtest.h>
1976+
1977+using namespace std;
1978+using namespace testing;
1979+
1980+namespace {
1981+
1982+class MockCurl: public Curl {
1983+public:
1984+ MOCK_CONST_METHOD1(read, QByteArray(const string &url));
1985+};
1986+
1987+class TestSoundCloudParser: public Test {
1988+protected:
1989+ TestSoundCloudParser() {
1990+ }
1991+
1992+ virtual ~TestSoundCloudParser() {
1993+ }
1994+};
1995+
1996+TEST_F(TestSoundCloudParser, CanReadEmptyXml) {
1997+ QFile file(MOCK_SOUNDCLOUD_FAIL);
1998+ ASSERT_TRUE(file.open(QIODevice::ReadOnly));
1999+ QByteArray soundCloudFail(file.readAll());
2000+
2001+ shared_ptr<MockCurl> curl(new NiceMock<MockCurl>());
2002+ string expectedUrl(
2003+ "https://api.soundcloud.com/tracks?consumer_key=398e83f17ec3c5cf945f04772de9f400&q=non-existing-thing&order=hotness&limit=30");
2004+ EXPECT_CALL(*curl, read(StrEq(expectedUrl))).Times(1).WillOnce(
2005+ Return(soundCloudFail));
2006+
2007+ SoundCloudParser parser(curl);
2008+ deque<SoundCloudResult> results(parser.getResults("non-existing-thing"));
2009+
2010+ ASSERT_EQ(0, results.size());
2011+}
2012+
2013+TEST_F(TestSoundCloudParser, CanReadWellFormattedXml) {
2014+ QFile file(MOCK_SOUNDCLOUD_PASS);
2015+ ASSERT_TRUE(file.open(QIODevice::ReadOnly));
2016+ QByteArray soundCloudPass(file.readAll());
2017+
2018+ shared_ptr<MockCurl> curl(new NiceMock<MockCurl>());
2019+ string expectedUrl(
2020+ "https://api.soundcloud.com/tracks?consumer_key=398e83f17ec3c5cf945f04772de9f400&q=submarine&order=hotness&limit=30");
2021+ EXPECT_CALL(*curl, read(StrEq(expectedUrl))).Times(1).WillOnce(
2022+ Return(soundCloudPass));
2023+
2024+ SoundCloudParser parser(curl);
2025+ deque<SoundCloudResult> results(parser.getResults("submarine"));
2026+
2027+ ASSERT_EQ(30, results.size());
2028+
2029+ // check a basic node
2030+ {
2031+ SoundCloudResult &result(results[0]);
2032+ EXPECT_EQ("johnmayer", result.artist());
2033+ EXPECT_EQ("", result.comment());
2034+ EXPECT_EQ("2012-05-15T20:39:54Z", result.creationDate());
2035+ EXPECT_EQ("308230", result.duration());
2036+ EXPECT_EQ("", result.genre());
2037+ EXPECT_EQ("", result.icon());
2038+ EXPECT_EQ("", result.label());
2039+ EXPECT_EQ("all-rights-reserved", result.license());
2040+ EXPECT_EQ("https://api.soundcloud.com/tracks/46495820/stream",
2041+ result.stream());
2042+ EXPECT_EQ("Walt Grace's Submarine Test, January 1967", result.title());
2043+ EXPECT_EQ("http://soundcloud.com/johnmayer/walt-graces-submarine-test",
2044+ result.uri());
2045+ }
2046+
2047+ // this one has a created-with subnode - check we skip it
2048+ {
2049+ SoundCloudResult &result(results[3]);
2050+ EXPECT_EQ("joesallesdrums", result.artist());
2051+ EXPECT_EQ("", result.comment());
2052+ EXPECT_EQ("2013-07-11T19:18:55Z", result.creationDate());
2053+ EXPECT_EQ("248263", result.duration());
2054+ EXPECT_EQ("", result.genre());
2055+ EXPECT_EQ("", result.icon());
2056+ EXPECT_EQ("", result.label());
2057+ EXPECT_EQ("all-rights-reserved", result.license());
2058+ EXPECT_EQ("https://api.soundcloud.com/tracks/100646268/stream",
2059+ result.stream());
2060+ EXPECT_EQ("Submarine IDGAF version", result.title());
2061+ EXPECT_EQ(
2062+ "http://soundcloud.com/joesallesdrums/submarine-idgaf-version",
2063+ result.uri());
2064+ }
2065+
2066+ // this one has a created-with subnode - check we skip it
2067+ {
2068+ SoundCloudResult &result(results[28]);
2069+ EXPECT_EQ("submarine", result.artist());
2070+ EXPECT_EQ(
2071+ "Den hemliga trädgården in Stockholm with Wikicong/Tikicong and Dj Rupture on squeky island",
2072+ result.comment());
2073+ EXPECT_EQ("2010-08-15T18:47:22Z", result.creationDate());
2074+ EXPECT_EQ("1148179", result.duration());
2075+ EXPECT_EQ("tropical", result.genre());
2076+ EXPECT_EQ(
2077+ "https://i1.sndcdn.com/artworks-000002102568-87lu6v-large.jpg?cc07a88",
2078+ result.icon());
2079+ EXPECT_EQ("KIM", result.label());
2080+ EXPECT_EQ("no-rights-reserved", result.license());
2081+ EXPECT_EQ("https://api.soundcloud.com/tracks/4627335/stream",
2082+ result.stream());
2083+ EXPECT_EQ("KAPITAL.IDENTITĂ„T.MACKT.VIER", result.title());
2084+ EXPECT_EQ(
2085+ "http://soundcloud.com/submarine/kapital-identitat-mackt-vier",
2086+ result.uri());
2087+ }
2088+}
2089+
2090+TEST_F(TestSoundCloudParser, HandlesMalformedXml) {
2091+ QFile file(MOCK_SOUNDCLOUD_MALFORMED);
2092+ ASSERT_TRUE(file.open(QIODevice::ReadOnly));
2093+ QByteArray soundCloudMalformed(file.readAll());
2094+
2095+ shared_ptr<MockCurl> curl(new NiceMock<MockCurl>());
2096+ string expectedUrl(
2097+ "https://api.soundcloud.com/tracks?consumer_key=398e83f17ec3c5cf945f04772de9f400&q=malformed&order=hotness&limit=30");
2098+ EXPECT_CALL(*curl, read(StrEq(expectedUrl))).Times(1).WillOnce(
2099+ Return(soundCloudMalformed));
2100+
2101+ SoundCloudParser parser(curl);
2102+ deque<SoundCloudResult> results(parser.getResults("malformed"));
2103+
2104+ // The parser should have dropped the 4th result
2105+ ASSERT_EQ(3, results.size());
2106+}
2107+
2108+} // namespace
2109
2110=== added file 'tests/data/curl_data_hello'
2111--- tests/data/curl_data_hello 1970-01-01 00:00:00 +0000
2112+++ tests/data/curl_data_hello 2013-07-14 08:39:27 +0000
2113@@ -0,0 +1,1 @@
2114+Hello!
2115\ No newline at end of file
2116
2117=== modified file 'tests/data/mock_soundcloud_fail'
2118--- tests/data/mock_soundcloud_fail 2013-01-16 18:29:15 +0000
2119+++ tests/data/mock_soundcloud_fail 2013-07-14 08:39:27 +0000
2120@@ -1,1 +1,2 @@
2121-<o_o>
2122+<?xml version="1.0" encoding="UTF-8"?>
2123+<tracks type="array"/>
2124
2125=== added file 'tests/data/mock_soundcloud_malformed'
2126--- tests/data/mock_soundcloud_malformed 1970-01-01 00:00:00 +0000
2127+++ tests/data/mock_soundcloud_malformed 2013-07-14 08:39:27 +0000
2128@@ -0,0 +1,177 @@
2129+<?xml version="1.0" encoding="UTF-8"?>
2130+<tracks next-href="https://api.soundcloud.com/tracks?consumer_key=398e83f17ec3c5cf945f04772de9f400&amp;limit=30&amp;offset=30&amp;order=hotness&amp;q=submarine" type="array">
2131+ <track>
2132+ <kind>track</kind>
2133+ <id type="integer">46495820</id>
2134+ <created-at type="datetime">2012-05-15T20:39:54Z</created-at>
2135+ <user-id type="integer">2303663</user-id>
2136+ <duration type="integer">308230</duration>
2137+ <commentable type="boolean">false</commentable>
2138+ <state>finished</state>
2139+ <original-content-size type="integer">12322884</original-content-size>
2140+ <sharing>public</sharing>
2141+ <tag-list></tag-list>
2142+ <permalink>walt-graces-submarine-test</permalink>
2143+ <streamable type="boolean">true</streamable>
2144+ <embeddable-by>all</embeddable-by>
2145+ <downloadable type="boolean">false</downloadable>
2146+ <purchase-url nil="true"></purchase-url>
2147+ <label-id nil="true"></label-id>
2148+ <purchase-title nil="true"></purchase-title>
2149+ <genre></genre>
2150+ <title>Walt Grace's Submarine Test, January 1967</title>
2151+ <description></description>
2152+ <label-name></label-name>
2153+ <release></release>
2154+ <track-type></track-type>
2155+ <key-signature></key-signature>
2156+ <isrc></isrc>
2157+ <video-url nil="true"></video-url>
2158+ <bpm nil="true"></bpm>
2159+ <release-year nil="true"></release-year>
2160+ <release-month nil="true"></release-month>
2161+ <release-day nil="true"></release-day>
2162+ <original-format>mp3</original-format>
2163+ <license>all-rights-reserved</license>
2164+ <uri>https://api.soundcloud.com/tracks/46495820</uri>
2165+ <user>
2166+ <id type="integer">2303663</id>
2167+ <kind>user</kind>
2168+ <permalink>johnmayer</permalink>
2169+ <username>johnmayer</username>
2170+ <uri>https://api.soundcloud.com/users/2303663</uri>
2171+ <permalink-url>http://soundcloud.com/johnmayer</permalink-url>
2172+ <avatar-url>https://i1.sndcdn.com/avatars-000015302931-dlue9y-large.jpg?cc07a88</avatar-url>
2173+ </user>
2174+ <permalink-url>http://soundcloud.com/johnmayer/walt-graces-submarine-test</permalink-url>
2175+ <artwork-url nil="true"></artwork-url>
2176+ <waveform-url>https://w1.sndcdn.com/P5WJmgx408ju_m.png</waveform-url>
2177+ <stream-url>https://api.soundcloud.com/tracks/46495820/stream</stream-url>
2178+ <attachments-uri>https://api.soundcloud.com/tracks/46495820/attachments</attachments-uri>
2179+ </track>
2180+ <track>
2181+ <kind>track</kind>
2182+ <id type="integer">99743581</id>
2183+ <created-at type="datetime">2013-07-05T03:24:05Z</created-at>
2184+ <user-id type="integer">50203203</user-id>
2185+ <duration type="integer">223550</duration>
2186+ <commentable type="boolean">true</commentable>
2187+ <state>finished</state>
2188+ <original-content-size type="integer">8950433</original-content-size>
2189+ <sharing>public</sharing>
2190+ <tag-list></tag-list>
2191+ <permalink>submarine</permalink>
2192+ <streamable type="boolean">true</streamable>
2193+ <embeddable-by>all</embeddable-by>
2194+ <downloadable type="boolean">false</downloadable>
2195+ <purchase-url nil="true"></purchase-url>
2196+ <label-id nil="true"></label-id>
2197+ <purchase-title nil="true"></purchase-title>
2198+ <genre>Underwater</genre>
2199+ <title>Submarine - Submarines</title>
2200+ <description>DEMO recording from our fourth rehersal. Recorded at Irene studios June 2013.
2201+http://www.facebook.com/pages/Submarines/613462528665489</description>
2202+ <label-name></label-name>
2203+ <release></release>
2204+ <track-type>demo</track-type>
2205+ <key-signature></key-signature>
2206+ <isrc></isrc>
2207+ <video-url nil="true"></video-url>
2208+ <bpm nil="true"></bpm>
2209+ <release-year nil="true"></release-year>
2210+ <release-month nil="true"></release-month>
2211+ <release-day nil="true"></release-day>
2212+ <original-format>mp3</original-format>
2213+ <license>all-rights-reserved</license>
2214+ <uri>https://api.soundcloud.com/tracks/99743581</uri>
2215+ <user>
2216+ <id type="integer">50203203</id>
2217+ <kind>user</kind>
2218+ <permalink>submarinesband</permalink>
2219+ <username>SubmarinesBand</username>
2220+ <uri>https://api.soundcloud.com/users/50203203</uri>
2221+ <permalink-url>http://soundcloud.com/submarinesband</permalink-url>
2222+ <avatar-url>https://i1.sndcdn.com/avatars-000046620261-yfvce6-large.jpg?cc07a88</avatar-url>
2223+ </user>
2224+ <permalink-url>http://soundcloud.com/submarinesband/submarine</permalink-url>
2225+ <artwork-url>https://i1.sndcdn.com/artworks-000052204608-okdvk3-large.jpg?cc07a88</artwork-url>
2226+ <waveform-url>https://w1.sndcdn.com/p0vnPSt9Kcbe_m.png</waveform-url>
2227+ <stream-url>https://api.soundcloud.com/tracks/99743581/stream</stream-url>
2228+ <playback-count type="integer">110</playback-count>
2229+ <download-count type="integer">0</download-count>
2230+ <favoritings-count type="integer">3</favoritings-count>
2231+ <comment-count type="integer">1</comment-count>
2232+ <attachments-uri>https://api.soundcloud.com/tracks/99743581/attachments</attachments-uri>
2233+ </track>
2234+ <track>
2235+ <kind>track</kind>
2236+ <id type="integer">98612674</id>
2237+ <created-at type="datetime">2013-06-27T00:31:34Z</created-at>
2238+ <user-id type="integer">4311696</user-id>
2239+ <duration type="integer">302081</duration>
2240+ <commentable type="boolean">true</commentable>
2241+ <state>finished</state>
2242+ <original-content-size type="integer">53277180</original-content-size>
2243+ <sharing>public</sharing>
2244+ <tag-list>"bad taste records" "the nameless city" "dusted wax kingdom"</tag-list>
2245+ <permalink>submarine-city</permalink>
2246+ <streamable type="boolean">true</streamable>
2247+ <embeddable-by>all</embeddable-by>
2248+ <downloadable type="boolean">false</downloadable>
2249+ <purchase-url nil="true"></purchase-url>
2250+ <label-id nil="true"></label-id>
2251+ <purchase-title nil="true"></purchase-title>
2252+ <genre>Instrumental Hiphop</genre>
2253+ <title>Submarine City</title>
2254+ <description>http://thirdpersonlurkin.bandcamp.com/</description>
2255+ <label-name></label-name>
2256+ <release></release>
2257+ <track-type></track-type>
2258+ <key-signature></key-signature>
2259+ <isrc></isrc>
2260+ <video-url nil="true"></video-url>
2261+ <bpm nil="true"></bpm>
2262+ <release-year nil="true"></release-year>
2263+ <release-month nil="true"></release-month>
2264+ <release-day nil="true"></release-day>
2265+ <original-format>wav</original-format>
2266+ <license>all-rights-reserved</license>
2267+ <uri>https://api.soundcloud.com/tracks/98612674</uri>
2268+ <user>
2269+ <id type="integer">4311696</id>
2270+ <kind>user</kind>
2271+ <permalink>thirdpersonlurkin</permalink>
2272+ <username>Third Person Lurkin</username>
2273+ <uri>https://api.soundcloud.com/users/4311696</uri>
2274+ <permalink-url>http://soundcloud.com/thirdpersonlurkin</permalink-url>
2275+ <avatar-url>https://i1.sndcdn.com/avatars-000046311415-gugiy8-large.jpg?cc07a88</avatar-url>
2276+ </user>
2277+ <permalink-url>http://soundcloud.com/thirdpersonlurkin/submarine-city</permalink-url>
2278+ <artwork-url>https://i1.sndcdn.com/artworks-000051575400-x2qtba-large.jpg?cc07a88</artwork-url>
2279+ <waveform-url>https://w1.sndcdn.com/Go6PTpPCGu1x_m.png</waveform-url>
2280+ <stream-url>https://api.soundcloud.com/tracks/98612674/stream</stream-url>
2281+ <playback-count type="integer">217</playback-count>
2282+ <download-count type="integer">0</download-count>
2283+ <favoritings-count type="integer">18</favoritings-count>
2284+ <comment-count type="integer">4</comment-count>
2285+ <attachments-uri>https://api.soundcloud.com/tracks/98612674/attachments</attachments-uri>
2286+ </track>
2287+ <track>
2288+ <kind>track</kind>
2289+ <id type="integer">100646268</id>
2290+ <created-at type="datetime">2013-07-11T19:18:55Z</created-at>
2291+ <user-id type="integer">26044098</user-id>
2292+ <duration type="integer">248263</duration>
2293+ <commentable type="boolean">true</commentable>
2294+ <state>finished</state>
2295+ <original-content-size type="integer">43778092</original-content-size>
2296+ <sharing>public</sharing>
2297+ <tag-list>soundcloud:source=android-3rdparty-upload</tag-list>
2298+ <permalink>submarine-idgaf-version</permalink>
2299+ <streamable type="boolean">true</streamable>
2300+ <embeddable-by>all</embeddable-by>
2301+ <downloadable type="boolean">false</downloadable>
2302+ <purchase-url nil="true"></purchase-url>
2303+ <label-id nil="true"></label-id>
2304+ <purchase-title nil="true"></purchase-title>
2305+ <genre nil="true"></genre>
2306\ No newline at end of file
2307
2308=== modified file 'tests/data/mock_soundcloud_pass'
2309--- tests/data/mock_soundcloud_pass 2013-01-16 18:29:15 +0000
2310+++ tests/data/mock_soundcloud_pass 2013-07-14 08:39:27 +0000
2311@@ -1,1 +1,1639 @@
2312-[{"kind":"track","id":74814003,"created_at":"2013/01/13 21:25:23 +0000","user_id":1197717,"duration":211846,"commentable":true,"state":"finished","original_content_size":37355340,"sharing":"public","tag_list":"","permalink":"echos","streamable":true,"embeddable_by":"all","downloadable":false,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"","title":"Echos","description":"","label_name":"","release":"","track_type":"","key_signature":"","isrc":"","video_url":null,"bpm":null,"release_year":null,"release_month":null,"release_day":null,"original_format":"wav","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/74814003","user":{"id":1197717,"kind":"user","permalink":"vibecatt","username":"SUBMARINE","uri":"https://api.soundcloud.com/users/1197717","permalink_url":"http://soundcloud.com/vibecatt","avatar_url":"https://i1.sndcdn.com/avatars-000009396694-nye554-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/vibecatt/echos","artwork_url":null,"waveform_url":"https://w1.sndcdn.com/GuF1Nt5BZaJn_m.png","stream_url":"https://api.soundcloud.com/tracks/74814003/stream","playback_count":42,"download_count":0,"favoritings_count":4,"comment_count":4,"attachments_uri":"https://api.soundcloud.com/tracks/74814003/attachments"},{"kind":"track","id":57857175,"created_at":"2012/08/28 12:51:07 +0000","user_id":1197717,"duration":260748,"commentable":true,"state":"finished","original_content_size":45964844,"sharing":"public","tag_list":"","permalink":"ganymede","streamable":true,"embeddable_by":"all","downloadable":false,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"dubstep","title":"Ganymede","description":"","label_name":"","release":"","track_type":"original","key_signature":"","isrc":"","video_url":null,"bpm":null,"release_year":null,"release_month":null,"release_day":null,"original_format":"wav","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/57857175","user":{"id":1197717,"kind":"user","permalink":"vibecatt","username":"SUBMARINE","uri":"https://api.soundcloud.com/users/1197717","permalink_url":"http://soundcloud.com/vibecatt","avatar_url":"https://i1.sndcdn.com/avatars-000009396694-nye554-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/vibecatt/ganymede","artwork_url":null,"waveform_url":"https://w1.sndcdn.com/iGmBZLPye5Ww_m.png","stream_url":"https://api.soundcloud.com/tracks/57857175/stream","playback_count":125,"download_count":0,"favoritings_count":8,"comment_count":8,"attachments_uri":"https://api.soundcloud.com/tracks/57857175/attachments"},{"kind":"track","id":34649100,"created_at":"2012/01/26 23:46:38 +0000","user_id":1197717,"duration":284763,"commentable":true,"state":"finished","original_content_size":50198444,"sharing":"public","tag_list":"","permalink":"europa","streamable":true,"embeddable_by":"all","downloadable":true,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"spacy/dubstep","title":"Europa","description":"","label_name":"","release":"","track_type":"original","key_signature":"","isrc":"","video_url":null,"bpm":null,"release_year":null,"release_month":null,"release_day":null,"original_format":"wav","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/34649100","user":{"id":1197717,"kind":"user","permalink":"vibecatt","username":"SUBMARINE","uri":"https://api.soundcloud.com/users/1197717","permalink_url":"http://soundcloud.com/vibecatt","avatar_url":"https://i1.sndcdn.com/avatars-000009396694-nye554-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/vibecatt/europa","artwork_url":"https://i1.sndcdn.com/artworks-000017390975-hr2uvg-large.jpg?923db0b","waveform_url":"https://w1.sndcdn.com/yADh0ritdoKv_m.png","stream_url":"https://api.soundcloud.com/tracks/34649100/stream","download_url":"https://api.soundcloud.com/tracks/34649100/download","playback_count":336,"download_count":9,"favoritings_count":5,"comment_count":15,"attachments_uri":"https://api.soundcloud.com/tracks/34649100/attachments"},{"kind":"track","id":19273510,"created_at":"2011/07/18 14:03:53 +0000","user_id":1197717,"duration":68675,"commentable":true,"state":"finished","original_content_size":18144044,"sharing":"public","tag_list":"","permalink":"love-preview","streamable":true,"embeddable_by":"all","downloadable":false,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"","title":"Love (preview)","description":"","label_name":"","release":"","track_type":"original","key_signature":"","isrc":"","video_url":null,"bpm":null,"release_year":null,"release_month":null,"release_day":null,"original_format":"wav","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/19273510","user":{"id":1197717,"kind":"user","permalink":"vibecatt","username":"SUBMARINE","uri":"https://api.soundcloud.com/users/1197717","permalink_url":"http://soundcloud.com/vibecatt","avatar_url":"https://i1.sndcdn.com/avatars-000009396694-nye554-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/vibecatt/love-preview","artwork_url":"https://i1.sndcdn.com/artworks-000017277283-w1npy2-large.jpg?923db0b","waveform_url":"https://w1.sndcdn.com/cQaVh8HRfUyl_m.png","stream_url":"https://api.soundcloud.com/tracks/19273510/stream","playback_count":129,"download_count":0,"favoritings_count":0,"comment_count":1,"attachments_uri":"https://api.soundcloud.com/tracks/19273510/attachments"},{"kind":"track","id":46609027,"created_at":"2012/05/16 20:45:01 +0000","user_id":1197717,"duration":66559,"commentable":true,"state":"finished","original_content_size":11723860,"sharing":"public","tag_list":"","permalink":"nostalgia-preview","streamable":true,"embeddable_by":"all","downloadable":false,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"","title":"Nostalgia preview","description":"","label_name":"","release":"","track_type":"","key_signature":"","isrc":"","video_url":null,"bpm":null,"release_year":null,"release_month":null,"release_day":null,"original_format":"wav","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/46609027","user":{"id":1197717,"kind":"user","permalink":"vibecatt","username":"SUBMARINE","uri":"https://api.soundcloud.com/users/1197717","permalink_url":"http://soundcloud.com/vibecatt","avatar_url":"https://i1.sndcdn.com/avatars-000009396694-nye554-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/vibecatt/nostalgia-preview","artwork_url":null,"waveform_url":"https://w1.sndcdn.com/SaG4ip9IxDCF_m.png","stream_url":"https://api.soundcloud.com/tracks/46609027/stream","playback_count":113,"download_count":0,"favoritings_count":2,"comment_count":4,"attachments_uri":"https://api.soundcloud.com/tracks/46609027/attachments"},{"kind":"track","id":37394615,"created_at":"2012/02/21 21:59:47 +0000","user_id":1197717,"duration":164711,"commentable":true,"state":"finished","original_content_size":29030444,"sharing":"public","tag_list":"","permalink":"creation-preview","streamable":true,"embeddable_by":"all","downloadable":false,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"dubstep/electronic ","title":"Creation preview","description":"","label_name":"","release":"","track_type":"original","key_signature":"","isrc":"","video_url":null,"bpm":null,"release_year":null,"release_month":null,"release_day":null,"original_format":"wav","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/37394615","user":{"id":1197717,"kind":"user","permalink":"vibecatt","username":"SUBMARINE","uri":"https://api.soundcloud.com/users/1197717","permalink_url":"http://soundcloud.com/vibecatt","avatar_url":"https://i1.sndcdn.com/avatars-000009396694-nye554-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/vibecatt/creation-preview","artwork_url":null,"waveform_url":"https://w1.sndcdn.com/dUeQXtJwGInY_m.png","stream_url":"https://api.soundcloud.com/tracks/37394615/stream","playback_count":178,"download_count":0,"favoritings_count":5,"comment_count":10,"attachments_uri":"https://api.soundcloud.com/tracks/37394615/attachments"},{"kind":"track","id":27745819,"created_at":"2011/11/11 14:00:12 +0000","user_id":1197717,"duration":72099,"commentable":true,"state":"finished","original_content_size":12700844,"sharing":"public","tag_list":"","permalink":"click-clip","streamable":true,"embeddable_by":"all","downloadable":false,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"Dubstep","title":"click (clip)","description":"","label_name":"","release":"","track_type":"original","key_signature":"","isrc":"","video_url":null,"bpm":null,"release_year":null,"release_month":null,"release_day":null,"original_format":"wav","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/27745819","user":{"id":1197717,"kind":"user","permalink":"vibecatt","username":"SUBMARINE","uri":"https://api.soundcloud.com/users/1197717","permalink_url":"http://soundcloud.com/vibecatt","avatar_url":"https://i1.sndcdn.com/avatars-000009396694-nye554-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/vibecatt/click-clip","artwork_url":"https://i1.sndcdn.com/artworks-000017277180-0i48xv-large.jpg?923db0b","waveform_url":"https://w1.sndcdn.com/ie3yyCdzg1e0_m.png","stream_url":"https://api.soundcloud.com/tracks/27745819/stream","playback_count":195,"download_count":0,"favoritings_count":4,"comment_count":4,"attachments_uri":"https://api.soundcloud.com/tracks/27745819/attachments"},{"kind":"track","id":11148780,"created_at":"2011/02/26 16:56:23 +0000","user_id":1197717,"duration":271253,"commentable":true,"state":"finished","original_content_size":71722616,"sharing":"public","tag_list":"","permalink":"deep-sleep","streamable":true,"embeddable_by":"all","downloadable":false,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"Ambient/garage","title":"DEEP SLEEP","description":"","label_name":"","release":"","track_type":"original","key_signature":"","isrc":"","video_url":null,"bpm":134.0,"release_year":null,"release_month":null,"release_day":null,"original_format":"wav","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/11148780","user":{"id":1197717,"kind":"user","permalink":"vibecatt","username":"SUBMARINE","uri":"https://api.soundcloud.com/users/1197717","permalink_url":"http://soundcloud.com/vibecatt","avatar_url":"https://i1.sndcdn.com/avatars-000009396694-nye554-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/vibecatt/deep-sleep","artwork_url":null,"waveform_url":"https://w1.sndcdn.com/XmYxE13Bba37_m.png","stream_url":"https://api.soundcloud.com/tracks/11148780/stream","playback_count":740,"download_count":0,"favoritings_count":6,"comment_count":13,"attachments_uri":"https://api.soundcloud.com/tracks/11148780/attachments"},{"kind":"track","id":6689725,"created_at":"2010/11/04 13:34:55 +0000","user_id":1197717,"duration":256175,"commentable":true,"state":"finished","original_content_size":67737644,"sharing":"public","tag_list":"garage","permalink":"future-dreams","streamable":true,"embeddable_by":"all","downloadable":true,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"Garage","title":"Future dreams","description":"","label_name":"","release":"","track_type":"original","key_signature":"","isrc":"","video_url":null,"bpm":135.0,"release_year":null,"release_month":null,"release_day":null,"original_format":"wav","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/6689725","user":{"id":1197717,"kind":"user","permalink":"vibecatt","username":"SUBMARINE","uri":"https://api.soundcloud.com/users/1197717","permalink_url":"http://soundcloud.com/vibecatt","avatar_url":"https://i1.sndcdn.com/avatars-000009396694-nye554-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/vibecatt/future-dreams","artwork_url":"https://i1.sndcdn.com/artworks-000003021489-r99g97-large.jpg?923db0b","waveform_url":"https://w1.sndcdn.com/uxFURVwPXyG4_m.png","stream_url":"https://api.soundcloud.com/tracks/6689725/stream","download_url":"https://api.soundcloud.com/tracks/6689725/download","playback_count":437,"download_count":24,"favoritings_count":9,"comment_count":13,"attachments_uri":"https://api.soundcloud.com/tracks/6689725/attachments"},{"kind":"track","id":28347812,"created_at":"2011/11/18 16:19:51 +0000","user_id":1197717,"duration":238405,"commentable":true,"state":"finished","original_content_size":42027024,"sharing":"public","tag_list":"dreamsound sub pads deep new dubstep dubby bright tribal winter","permalink":"blue-moon","streamable":true,"embeddable_by":"all","downloadable":true,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"dubstep/tribal/space","title":"Blue moon","description":"","label_name":"","release":"","track_type":"original","key_signature":"","isrc":"","video_url":null,"bpm":null,"release_year":null,"release_month":null,"release_day":null,"original_format":"wav","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/28347812","user":{"id":1197717,"kind":"user","permalink":"vibecatt","username":"SUBMARINE","uri":"https://api.soundcloud.com/users/1197717","permalink_url":"http://soundcloud.com/vibecatt","avatar_url":"https://i1.sndcdn.com/avatars-000009396694-nye554-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/vibecatt/blue-moon","artwork_url":"https://i1.sndcdn.com/artworks-000017277156-d680ii-large.jpg?923db0b","waveform_url":"https://w1.sndcdn.com/jLHOHyWmFSwv_m.png","stream_url":"https://api.soundcloud.com/tracks/28347812/stream","download_url":"https://api.soundcloud.com/tracks/28347812/download","playback_count":429,"download_count":22,"favoritings_count":10,"comment_count":24,"attachments_uri":"https://api.soundcloud.com/tracks/28347812/attachments"},{"kind":"track","id":24857671,"created_at":"2011/10/06 00:23:07 +0000","user_id":1197717,"duration":150991,"commentable":true,"state":"finished","original_content_size":26611248,"sharing":"public","tag_list":"","permalink":"long-winter-1","streamable":true,"embeddable_by":"all","downloadable":false,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"","title":"LONG winter","description":"","label_name":"","release":"","track_type":"","key_signature":"","isrc":"","video_url":null,"bpm":null,"release_year":null,"release_month":null,"release_day":null,"original_format":"wav","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/24857671","user":{"id":1197717,"kind":"user","permalink":"vibecatt","username":"SUBMARINE","uri":"https://api.soundcloud.com/users/1197717","permalink_url":"http://soundcloud.com/vibecatt","avatar_url":"https://i1.sndcdn.com/avatars-000009396694-nye554-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/vibecatt/long-winter-1","artwork_url":"https://i1.sndcdn.com/artworks-000017277235-fqm6cu-large.jpg?923db0b","waveform_url":"https://w1.sndcdn.com/WzBgLB4Ma2cD_m.png","stream_url":"https://api.soundcloud.com/tracks/24857671/stream","playback_count":144,"download_count":0,"favoritings_count":4,"comment_count":3,"attachments_uri":"https://api.soundcloud.com/tracks/24857671/attachments"},{"kind":"track","id":6486500,"created_at":"2010/10/28 12:06:14 +0000","user_id":1197717,"duration":233100,"commentable":true,"state":"finished","original_content_size":61636280,"sharing":"public","tag_list":"","permalink":"the-pattern","streamable":true,"embeddable_by":"all","downloadable":true,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"ambient/garage","title":"The DREAM pattern","description":"","label_name":"","release":"","track_type":"original","key_signature":"","isrc":"","video_url":null,"bpm":136.0,"release_year":null,"release_month":null,"release_day":null,"original_format":"wav","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/6486500","user":{"id":1197717,"kind":"user","permalink":"vibecatt","username":"SUBMARINE","uri":"https://api.soundcloud.com/users/1197717","permalink_url":"http://soundcloud.com/vibecatt","avatar_url":"https://i1.sndcdn.com/avatars-000009396694-nye554-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/vibecatt/the-pattern","artwork_url":"https://i1.sndcdn.com/artworks-000003021497-vfp002-large.jpg?923db0b","waveform_url":"https://w1.sndcdn.com/NOMmwfTvJ2Eb_m.png","stream_url":"https://api.soundcloud.com/tracks/6486500/stream","download_url":"https://api.soundcloud.com/tracks/6486500/download","playback_count":400,"download_count":15,"favoritings_count":4,"comment_count":3,"attachments_uri":"https://api.soundcloud.com/tracks/6486500/attachments"},{"kind":"track","id":61638090,"created_at":"2012/09/29 22:06:42 +0000","user_id":25157649,"duration":281782,"commentable":true,"state":"finished","original_content_size":11423654,"sharing":"public","tag_list":"Submarine Mombahouse Origional Remix Alkatraz","permalink":"tormenta-las-trompa-llegadas","streamable":true,"embeddable_by":"all","downloadable":false,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"Mombahouse","title":"Tormenta - Las Trompa Llegadas (Submarine Remix)","description":"This is a remix of another one of my projects - Tormenta. A project I share with Calgary's Kousk, in the search to make world music to stimulate the mind. \r\n\r\nThis is my remix of our original. \r\n\r\nI hope you enjoy.\r\n\r\nSubmarine.\r\n\r\nDownload will be made available when this track reaches 100 listens. ","label_name":"","release":"","track_type":"original","key_signature":"","isrc":"","video_url":null,"bpm":null,"release_year":null,"release_month":null,"release_day":null,"original_format":"mp3","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/61638090","user":{"id":25157649,"kind":"user","permalink":"submarine-5","username":"SUBmarine","uri":"https://api.soundcloud.com/users/25157649","permalink_url":"http://soundcloud.com/submarine-5","avatar_url":"https://i1.sndcdn.com/avatars-000023509019-umhpcf-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/submarine-5/tormenta-las-trompa-llegadas","artwork_url":"https://i1.sndcdn.com/artworks-000031256378-n3d3fg-large.jpg?923db0b","waveform_url":"https://w1.sndcdn.com/C0prIOi6Pq6p_m.png","stream_url":"https://api.soundcloud.com/tracks/61638090/stream","playback_count":68,"download_count":0,"favoritings_count":0,"comment_count":1,"attachments_uri":"https://api.soundcloud.com/tracks/61638090/attachments"},{"kind":"track","id":7976882,"created_at":"2010/12/12 18:33:07 +0000","user_id":2393625,"duration":50749,"commentable":true,"state":"finished","original_content_size":1218386,"sharing":"public","tag_list":"","permalink":"the-edittttt","streamable":true,"embeddable_by":"all","downloadable":false,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"","title":"THE EDITTTTT","description":"","label_name":"","release":"","track_type":"","key_signature":"","isrc":"","video_url":null,"bpm":null,"release_year":null,"release_month":null,"release_day":null,"original_format":"mp3","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/7976882","user":{"id":2393625,"kind":"user","permalink":"submarine-1","username":"Submarine","uri":"https://api.soundcloud.com/users/2393625","permalink_url":"http://soundcloud.com/submarine-1","avatar_url":"https://i1.sndcdn.com/avatars-000002220972-lnqvui-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/submarine-1/the-edittttt","artwork_url":null,"waveform_url":"https://w1.sndcdn.com/fKZgRN1JNlEw_m.png","stream_url":"https://api.soundcloud.com/tracks/7976882/stream","playback_count":42,"download_count":0,"favoritings_count":0,"comment_count":0,"attachments_uri":"https://api.soundcloud.com/tracks/7976882/attachments"},{"kind":"track","id":19272956,"created_at":"2011/07/18 13:50:57 +0000","user_id":1197717,"duration":288188,"commentable":true,"state":"finished","original_content_size":50803244,"sharing":"public","tag_list":"","permalink":"stelliferous-era-preview","streamable":true,"embeddable_by":"all","downloadable":true,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"","title":"Stelliferous Era (preview/unmixed)","description":"","label_name":"","release":"","track_type":"original","key_signature":"","isrc":"","video_url":null,"bpm":null,"release_year":null,"release_month":null,"release_day":null,"original_format":"wav","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/19272956","user":{"id":1197717,"kind":"user","permalink":"vibecatt","username":"SUBMARINE","uri":"https://api.soundcloud.com/users/1197717","permalink_url":"http://soundcloud.com/vibecatt","avatar_url":"https://i1.sndcdn.com/avatars-000009396694-nye554-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/vibecatt/stelliferous-era-preview","artwork_url":"https://i1.sndcdn.com/artworks-000009425676-5nj0vx-large.jpg?923db0b","waveform_url":"https://w1.sndcdn.com/Ux3ASQ4wKaD0_m.png","stream_url":"https://api.soundcloud.com/tracks/19272956/stream","download_url":"https://api.soundcloud.com/tracks/19272956/download","playback_count":133,"download_count":7,"favoritings_count":3,"comment_count":7,"attachments_uri":"https://api.soundcloud.com/tracks/19272956/attachments"},{"kind":"track","id":7323275,"created_at":"2010/11/23 20:29:21 +0000","user_id":1197717,"duration":259441,"commentable":true,"state":"finished","original_content_size":68602916,"sharing":"public","tag_list":"","permalink":"into-the-future","streamable":true,"embeddable_by":"all","downloadable":true,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"Garage","title":"INTO THE FUTURE","description":"","label_name":"none : (","release":"","track_type":"original","key_signature":"","isrc":"","video_url":null,"bpm":null,"release_year":null,"release_month":null,"release_day":null,"original_format":"wav","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/7323275","user":{"id":1197717,"kind":"user","permalink":"vibecatt","username":"SUBMARINE","uri":"https://api.soundcloud.com/users/1197717","permalink_url":"http://soundcloud.com/vibecatt","avatar_url":"https://i1.sndcdn.com/avatars-000009396694-nye554-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/vibecatt/into-the-future","artwork_url":"https://i1.sndcdn.com/artworks-000003216522-dv0ekw-large.jpg?923db0b","waveform_url":"https://w1.sndcdn.com/68in91FGBiec_m.png","stream_url":"https://api.soundcloud.com/tracks/7323275/stream","download_url":"https://api.soundcloud.com/tracks/7323275/download","playback_count":484,"download_count":16,"favoritings_count":5,"comment_count":8,"attachments_uri":"https://api.soundcloud.com/tracks/7323275/attachments"},{"kind":"track","id":34419620,"created_at":"2012/01/24 20:37:11 +0000","user_id":1197717,"duration":48109,"commentable":true,"state":"finished","original_content_size":8467244,"sharing":"public","tag_list":"","permalink":"pre-e-p-preview","streamable":true,"embeddable_by":"all","downloadable":true,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"","title":"PRE E.P Preview","description":"","label_name":"","release":"","track_type":"","key_signature":"","isrc":"","video_url":null,"bpm":null,"release_year":null,"release_month":null,"release_day":null,"original_format":"wav","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/34419620","user":{"id":1197717,"kind":"user","permalink":"vibecatt","username":"SUBMARINE","uri":"https://api.soundcloud.com/users/1197717","permalink_url":"http://soundcloud.com/vibecatt","avatar_url":"https://i1.sndcdn.com/avatars-000009396694-nye554-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/vibecatt/pre-e-p-preview","artwork_url":"https://i1.sndcdn.com/artworks-000017277699-dp23ij-large.jpg?923db0b","waveform_url":"https://w1.sndcdn.com/Hsguzq7DU1Ow_m.png","stream_url":"https://api.soundcloud.com/tracks/34419620/stream","download_url":"https://api.soundcloud.com/tracks/34419620/download","playback_count":108,"download_count":6,"favoritings_count":3,"comment_count":7,"attachments_uri":"https://api.soundcloud.com/tracks/34419620/attachments"},{"kind":"track","id":3591672,"created_at":"2010/06/22 20:48:10 +0000","user_id":1197717,"duration":370242,"commentable":true,"state":"finished","original_content_size":12492933,"sharing":"public","tag_list":"","permalink":"rollin-down-paradise-drive","streamable":true,"embeddable_by":"all","downloadable":false,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"unfinished","title":"rollin down paradise drive","description":"http://www.youtube.com/watch?v=RdD6L4cKKU8","label_name":"","release":"","track_type":"","key_signature":"","isrc":"","video_url":null,"bpm":150.0,"release_year":null,"release_month":null,"release_day":null,"original_format":"m4a","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/3591672","user":{"id":1197717,"kind":"user","permalink":"vibecatt","username":"SUBMARINE","uri":"https://api.soundcloud.com/users/1197717","permalink_url":"http://soundcloud.com/vibecatt","avatar_url":"https://i1.sndcdn.com/avatars-000009396694-nye554-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/vibecatt/rollin-down-paradise-drive","artwork_url":null,"waveform_url":"https://w1.sndcdn.com/VciyI1oB6Uey_m.png","stream_url":"https://api.soundcloud.com/tracks/3591672/stream","playback_count":322,"download_count":0,"favoritings_count":3,"comment_count":5,"attachments_uri":"https://api.soundcloud.com/tracks/3591672/attachments"},{"kind":"track","id":4627335,"created_at":"2010/08/15 18:47:22 +0000","user_id":1397546,"duration":1148179,"commentable":true,"state":"finished","original_content_size":14217533,"sharing":"public","tag_list":"","permalink":"kapital-identitat-mackt-vier","streamable":true,"embeddable_by":"all","downloadable":true,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"tropical","title":"KAPITAL.IDENTIT\u00c4T.MACKT.VIER","description":"Den hemliga tr\u00e4dg\u00e5rden in Stockholm with Wikicong/Tikicong and Dj Rupture on squeky island","label_name":"KIM","release":"4","track_type":"remix","key_signature":"D","isrc":"12-345-67-89900","video_url":null,"bpm":85.0,"release_year":2010,"release_month":8,"release_day":15,"original_format":"mp3","license":"no-rights-reserved","uri":"https://api.soundcloud.com/tracks/4627335","user":{"id":1397546,"kind":"user","permalink":"submarine","username":"submarine","uri":"https://api.soundcloud.com/users/1397546","permalink_url":"http://soundcloud.com/submarine","avatar_url":"https://i1.sndcdn.com/avatars-000001518209-313nsa-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/submarine/kapital-identitat-mackt-vier","artwork_url":"https://i1.sndcdn.com/artworks-000002102568-87lu6v-large.jpg?923db0b","waveform_url":"https://w1.sndcdn.com/vzioG2Vsf9hN_m.png","stream_url":"https://api.soundcloud.com/tracks/4627335/stream","download_url":"https://api.soundcloud.com/tracks/4627335/download","playback_count":401,"download_count":41,"favoritings_count":0,"comment_count":4,"attachments_uri":"https://api.soundcloud.com/tracks/4627335/attachments"},{"kind":"track","id":4822078,"created_at":"2010/08/24 16:42:57 +0000","user_id":1397546,"duration":5157046,"commentable":true,"state":"finished","original_content_size":67789022,"sharing":"public","tag_list":"wikicong delanda oo xo redundancy wikileaks","permalink":"kapital-identitat-mackt-fem","streamable":true,"embeddable_by":"all","downloadable":true,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"zef","title":"KAPITAL.IDENTIT\u00c4T.MACKT.FEM","description":"Chris, Karl and Magnus meet in a bar to talk about the Wikicong, redudancy in societies, Flows, OO (object Oriented Philosphy) and XO (X oriented Philosophy) , Wikileaks and distributed action and entities. ","label_name":"KIM","release":"","track_type":"podcast","key_signature":"","isrc":"","video_url":null,"bpm":null,"release_year":2010,"release_month":8,"release_day":23,"original_format":"mp3","license":"no-rights-reserved","uri":"https://api.soundcloud.com/tracks/4822078","user":{"id":1397546,"kind":"user","permalink":"submarine","username":"submarine","uri":"https://api.soundcloud.com/users/1397546","permalink_url":"http://soundcloud.com/submarine","avatar_url":"https://i1.sndcdn.com/avatars-000001518209-313nsa-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/submarine/kapital-identitat-mackt-fem","artwork_url":"https://i1.sndcdn.com/artworks-000002170048-ahtea3-large.jpg?923db0b","waveform_url":"https://w1.sndcdn.com/pMuTPNymGQ2c_m.png","stream_url":"https://api.soundcloud.com/tracks/4822078/stream","download_url":"https://api.soundcloud.com/tracks/4822078/download","playback_count":81,"download_count":3,"favoritings_count":0,"comment_count":0,"attachments_uri":"https://api.soundcloud.com/tracks/4822078/attachments"},{"kind":"track","id":8241719,"created_at":"2010/12/20 11:35:25 +0000","user_id":2393625,"duration":270782,"commentable":true,"state":"finished","original_content_size":6497220,"sharing":"public","tag_list":"","permalink":"la-move-for-repulica","streamable":true,"embeddable_by":"all","downloadable":true,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"","title":"LA - Move for Repulica","description":"Cheesey but musically it works...","label_name":"","release":"","track_type":"","key_signature":"","isrc":"","video_url":null,"bpm":null,"release_year":null,"release_month":null,"release_day":null,"original_format":"mp3","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/8241719","user":{"id":2393625,"kind":"user","permalink":"submarine-1","username":"Submarine","uri":"https://api.soundcloud.com/users/2393625","permalink_url":"http://soundcloud.com/submarine-1","avatar_url":"https://i1.sndcdn.com/avatars-000002220972-lnqvui-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/submarine-1/la-move-for-repulica","artwork_url":null,"waveform_url":"https://w1.sndcdn.com/bdEHCyvZZpJ6_m.png","stream_url":"https://api.soundcloud.com/tracks/8241719/stream","download_url":"https://api.soundcloud.com/tracks/8241719/download","playback_count":22,"download_count":3,"favoritings_count":0,"comment_count":0,"attachments_uri":"https://api.soundcloud.com/tracks/8241719/attachments"},{"kind":"track","id":8241760,"created_at":"2010/12/20 11:37:56 +0000","user_id":2393625,"duration":407481,"commentable":true,"state":"finished","original_content_size":9777360,"sharing":"public","tag_list":"","permalink":"la-prayin-gospel","streamable":true,"embeddable_by":"all","downloadable":true,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"","title":"LA - Prayin Gospel","description":"Again bootlegs are meant to be cheesy...","label_name":"","release":"","track_type":"","key_signature":"","isrc":"","video_url":null,"bpm":null,"release_year":null,"release_month":null,"release_day":null,"original_format":"mp3","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/8241760","user":{"id":2393625,"kind":"user","permalink":"submarine-1","username":"Submarine","uri":"https://api.soundcloud.com/users/2393625","permalink_url":"http://soundcloud.com/submarine-1","avatar_url":"https://i1.sndcdn.com/avatars-000002220972-lnqvui-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/submarine-1/la-prayin-gospel","artwork_url":null,"waveform_url":"https://w1.sndcdn.com/vsPZW6qU7p8V_m.png","stream_url":"https://api.soundcloud.com/tracks/8241760/stream","download_url":"https://api.soundcloud.com/tracks/8241760/download","playback_count":16,"download_count":4,"favoritings_count":0,"comment_count":0,"attachments_uri":"https://api.soundcloud.com/tracks/8241760/attachments"},{"kind":"track","id":8681118,"created_at":"2011/01/03 15:19:36 +0000","user_id":1197717,"duration":247029,"commentable":true,"state":"finished","original_content_size":65318444,"sharing":"public","tag_list":"","permalink":"slow-motion-in-the-morphine-ocean","streamable":true,"embeddable_by":"all","downloadable":false,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"dubstep/ambient","title":"Slow motion in the morphine ocean","description":"","label_name":"","release":"","track_type":"original","key_signature":"","isrc":"","video_url":null,"bpm":140.0,"release_year":null,"release_month":null,"release_day":null,"original_format":"wav","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/8681118","user":{"id":1197717,"kind":"user","permalink":"vibecatt","username":"SUBMARINE","uri":"https://api.soundcloud.com/users/1197717","permalink_url":"http://soundcloud.com/vibecatt","avatar_url":"https://i1.sndcdn.com/avatars-000009396694-nye554-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/vibecatt/slow-motion-in-the-morphine-ocean","artwork_url":null,"waveform_url":"https://w1.sndcdn.com/JSrnocmPsjOi_m.png","stream_url":"https://api.soundcloud.com/tracks/8681118/stream","playback_count":451,"download_count":0,"favoritings_count":6,"comment_count":12,"attachments_uri":"https://api.soundcloud.com/tracks/8681118/attachments"},{"kind":"track","id":3703311,"created_at":"2010/06/29 14:24:27 +0000","user_id":1197717,"duration":240181,"commentable":true,"state":"finished","original_content_size":42336044,"sharing":"public","tag_list":"","permalink":"oh-you-just-wouldnt-let-it-lie","streamable":true,"embeddable_by":"all","downloadable":true,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"unfineshed","title":"Oh you just wouldnt let it lie","description":"","label_name":"","release":"","track_type":"","key_signature":"","isrc":"","video_url":null,"bpm":136.0,"release_year":null,"release_month":null,"release_day":null,"original_format":"wav","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/3703311","user":{"id":1197717,"kind":"user","permalink":"vibecatt","username":"SUBMARINE","uri":"https://api.soundcloud.com/users/1197717","permalink_url":"http://soundcloud.com/vibecatt","avatar_url":"https://i1.sndcdn.com/avatars-000009396694-nye554-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/vibecatt/oh-you-just-wouldnt-let-it-lie","artwork_url":null,"waveform_url":"https://w1.sndcdn.com/bOpMn5TCVSwk_m.png","stream_url":"https://api.soundcloud.com/tracks/3703311/stream","download_url":"https://api.soundcloud.com/tracks/3703311/download","playback_count":258,"download_count":6,"favoritings_count":4,"comment_count":3,"attachments_uri":"https://api.soundcloud.com/tracks/3703311/attachments"},{"kind":"track","id":5614024,"created_at":"2010/09/27 14:49:35 +0000","user_id":1197717,"duration":210418,"commentable":true,"state":"finished","original_content_size":6754931,"sharing":"public","tag_list":"","permalink":"silent-h-bleep-bleep-jungle-boogie-remix","streamable":true,"embeddable_by":"all","downloadable":false,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"Dubstep","title":"silent H Bleep Bleep (jungle boogie remix)","description":"","label_name":"","release":"","track_type":"remix","key_signature":"","isrc":"","video_url":null,"bpm":137.0,"release_year":null,"release_month":null,"release_day":null,"original_format":"m4a","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/5614024","user":{"id":1197717,"kind":"user","permalink":"vibecatt","username":"SUBMARINE","uri":"https://api.soundcloud.com/users/1197717","permalink_url":"http://soundcloud.com/vibecatt","avatar_url":"https://i1.sndcdn.com/avatars-000009396694-nye554-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/vibecatt/silent-h-bleep-bleep-jungle-boogie-remix","artwork_url":null,"waveform_url":"https://w1.sndcdn.com/CDaZ3aqNQrAL_m.png","stream_url":"https://api.soundcloud.com/tracks/5614024/stream","playback_count":355,"download_count":4,"favoritings_count":3,"comment_count":11,"attachments_uri":"https://api.soundcloud.com/tracks/5614024/attachments"},{"kind":"track","id":61643102,"created_at":"2012/09/29 23:09:05 +0000","user_id":25157649,"duration":1691325,"commentable":true,"state":"finished","original_content_size":67763578,"sharing":"public","tag_list":"Submarine Deep House Tech Mix Alkatraz","permalink":"0-below-1","streamable":true,"embeddable_by":"all","downloadable":true,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"Deep","title":"!0 Below #1","description":"This is the first in my !0 Below series. Nothing but deep, dark, sub bass that can only be reached by traveling with Submarine into the depths. \r\n\r\nThis series will consist of my favourite 10 Tech House and Deep House tracks I find as I travel this world.\r\n\r\nEnjoy!\r\n\r\n!0 Below #1\r\n\r\nTormenta - Las Trompa Llegadas (Submarine Remix)\r\nKolombo - Stop ou encore\r\nJustin Martin, Christian Martin - Riding Spaceships (Justin Martin Vs. Leroy Peppers - DJ Version)\r\nSepehr - Apple Bottoms (Original Mix)\r\nClaude VonStroke - Chimps - Re-Edit\r\nMojo Filter ft Mighty Boosh - Oaky Timbre (Loose Cannons Re-Flik)\r\nTyrek - Charlie's Soap Box (Original Mix)\r\nJustin Martin, Ardalan - Lezgo VIP (Justin Martin Vs. Ardalan - DJ Version)\r\nKill Frenzy - Titsss\r\nKolombo - Busta Ass (Original Mix)\r\n\r\n","label_name":"","release":"","track_type":"live","key_signature":"","isrc":"","video_url":null,"bpm":null,"release_year":null,"release_month":null,"release_day":null,"original_format":"mp3","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/61643102","user":{"id":25157649,"kind":"user","permalink":"submarine-5","username":"SUBmarine","uri":"https://api.soundcloud.com/users/25157649","permalink_url":"http://soundcloud.com/submarine-5","avatar_url":"https://i1.sndcdn.com/avatars-000023509019-umhpcf-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/submarine-5/0-below-1","artwork_url":"https://i1.sndcdn.com/artworks-000031257163-w2f5u5-large.jpg?923db0b","waveform_url":"https://w1.sndcdn.com/iWUZQHgatzSu_m.png","stream_url":"https://api.soundcloud.com/tracks/61643102/stream","download_url":"https://api.soundcloud.com/tracks/61643102/download","playback_count":80,"download_count":6,"favoritings_count":3,"comment_count":4,"attachments_uri":"https://api.soundcloud.com/tracks/61643102/attachments"},{"kind":"track","id":38896423,"created_at":"2012/03/06 16:34:19 +0000","user_id":1197717,"duration":151019,"commentable":true,"state":"finished","original_content_size":4974103,"sharing":"public","tag_list":"","permalink":"work-in-progress-dunno-what-to","streamable":true,"embeddable_by":"all","downloadable":false,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"dubstep/Egyptian ","title":"work in progress dunno what to call it really?","description":"","label_name":"","release":"","track_type":"original","key_signature":"","isrc":"","video_url":null,"bpm":null,"release_year":null,"release_month":null,"release_day":null,"original_format":"m4a","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/38896423","user":{"id":1197717,"kind":"user","permalink":"vibecatt","username":"SUBMARINE","uri":"https://api.soundcloud.com/users/1197717","permalink_url":"http://soundcloud.com/vibecatt","avatar_url":"https://i1.sndcdn.com/avatars-000009396694-nye554-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/vibecatt/work-in-progress-dunno-what-to","artwork_url":null,"waveform_url":"https://w1.sndcdn.com/ZigYRiuqWMZL_m.png","stream_url":"https://api.soundcloud.com/tracks/38896423/stream","playback_count":201,"download_count":0,"favoritings_count":5,"comment_count":12,"attachments_uri":"https://api.soundcloud.com/tracks/38896423/attachments"},{"kind":"track","id":8241747,"created_at":"2010/12/20 11:37:03 +0000","user_id":2393625,"duration":400242,"commentable":true,"state":"finished","original_content_size":9603713,"sharing":"public","tag_list":"","permalink":"la-i-found-air-through-polotics","streamable":true,"embeddable_by":"all","downloadable":true,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"","title":"LA - I Found Air through polotics","description":"Quality instrumental and bit of a get out of jail bootleg... one when you don't know what else will get F**king people to interact","label_name":"","release":"","track_type":"","key_signature":"","isrc":"","video_url":null,"bpm":null,"release_year":null,"release_month":null,"release_day":null,"original_format":"mp3","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/8241747","user":{"id":2393625,"kind":"user","permalink":"submarine-1","username":"Submarine","uri":"https://api.soundcloud.com/users/2393625","permalink_url":"http://soundcloud.com/submarine-1","avatar_url":"https://i1.sndcdn.com/avatars-000002220972-lnqvui-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/submarine-1/la-i-found-air-through-polotics","artwork_url":null,"waveform_url":"https://w1.sndcdn.com/KIpkSVViTYms_m.png","stream_url":"https://api.soundcloud.com/tracks/8241747/stream","download_url":"https://api.soundcloud.com/tracks/8241747/download","playback_count":16,"download_count":3,"favoritings_count":0,"comment_count":0,"attachments_uri":"https://api.soundcloud.com/tracks/8241747/attachments"},{"kind":"track","id":5613923,"created_at":"2010/09/27 14:44:45 +0000","user_id":1197717,"duration":318030,"commentable":true,"state":"finished","original_content_size":10069025,"sharing":"public","tag_list":"","permalink":"if-you-loved-me-you-would-ft-lucien-the-beat","streamable":true,"embeddable_by":"all","downloadable":false,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"Dubstep","title":"If you loved me,you would. ft Lucien \u0026 the Beat","description":"","label_name":"","release":"","track_type":"original","key_signature":"","isrc":"","video_url":null,"bpm":145.0,"release_year":null,"release_month":null,"release_day":null,"original_format":"m4a","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/5613923","user":{"id":1197717,"kind":"user","permalink":"vibecatt","username":"SUBMARINE","uri":"https://api.soundcloud.com/users/1197717","permalink_url":"http://soundcloud.com/vibecatt","avatar_url":"https://i1.sndcdn.com/avatars-000009396694-nye554-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/vibecatt/if-you-loved-me-you-would-ft-lucien-the-beat","artwork_url":null,"waveform_url":"https://w1.sndcdn.com/kQmXBCvVRp49_m.png","stream_url":"https://api.soundcloud.com/tracks/5613923/stream","playback_count":268,"download_count":0,"favoritings_count":2,"comment_count":2,"attachments_uri":"https://api.soundcloud.com/tracks/5613923/attachments"},{"kind":"track","id":37219984,"created_at":"2012/02/20 11:01:57 +0000","user_id":12013031,"duration":232472,"commentable":true,"state":"finished","original_content_size":9293392,"sharing":"public","tag_list":"dubstep","permalink":"seniter-my-mind","streamable":true,"embeddable_by":"all","downloadable":true,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"dubstep","title":"Seniter - My Mind","description":"dubstep","label_name":"","release":"","track_type":"demo","key_signature":"","isrc":"","video_url":null,"bpm":null,"release_year":null,"release_month":null,"release_day":null,"original_format":"mp3","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/37219984","user":{"id":12013031,"kind":"user","permalink":"submarine-3","username":"SubMarine","uri":"https://api.soundcloud.com/users/12013031","permalink_url":"http://soundcloud.com/submarine-3","avatar_url":"https://a1.sndcdn.com/images/default_avatar_large.png?923db0b"},"permalink_url":"http://soundcloud.com/submarine-3/seniter-my-mind","artwork_url":null,"waveform_url":"https://w1.sndcdn.com/FGhiJn68bxbs_m.png","stream_url":"https://api.soundcloud.com/tracks/37219984/stream","download_url":"https://api.soundcloud.com/tracks/37219984/download","playback_count":5,"download_count":0,"favoritings_count":0,"comment_count":0,"attachments_uri":"https://api.soundcloud.com/tracks/37219984/attachments"},{"kind":"track","id":37252163,"created_at":"2012/02/20 18:02:27 +0000","user_id":12013031,"duration":232472,"commentable":true,"state":"finished","original_content_size":9293392,"sharing":"public","tag_list":"dubstep","permalink":"seniter-my-mind-2","streamable":true,"embeddable_by":"all","downloadable":true,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"Dubstep","title":"Seniter - My Mind","description":"dubstep","label_name":"","release":"","track_type":"demo","key_signature":"","isrc":"","video_url":null,"bpm":null,"release_year":null,"release_month":null,"release_day":null,"original_format":"mp3","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/37252163","user":{"id":12013031,"kind":"user","permalink":"submarine-3","username":"SubMarine","uri":"https://api.soundcloud.com/users/12013031","permalink_url":"http://soundcloud.com/submarine-3","avatar_url":"https://a1.sndcdn.com/images/default_avatar_large.png?923db0b"},"permalink_url":"http://soundcloud.com/submarine-3/seniter-my-mind-2","artwork_url":null,"waveform_url":"https://w1.sndcdn.com/FKIkC9Ix4RVc_m.png","stream_url":"https://api.soundcloud.com/tracks/37252163/stream","download_url":"https://api.soundcloud.com/tracks/37252163/download","playback_count":8,"download_count":0,"favoritings_count":0,"comment_count":1,"attachments_uri":"https://api.soundcloud.com/tracks/37252163/attachments"},{"kind":"track","id":39749779,"created_at":"2012/03/14 16:41:27 +0000","user_id":13617184,"duration":211985,"commentable":true,"state":"finished","original_content_size":4237131,"sharing":"public","tag_list":"","permalink":"submarine","streamable":true,"embeddable_by":"all","downloadable":true,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"","title":"Submarine","description":"","label_name":"","release":"","track_type":"original","key_signature":"","isrc":"","video_url":null,"bpm":102.2,"release_year":null,"release_month":null,"release_day":null,"original_format":"mp3","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/39749779","user":{"id":13617184,"kind":"user","permalink":"kaosuhm","username":"kaosuhm","uri":"https://api.soundcloud.com/users/13617184","permalink_url":"http://soundcloud.com/kaosuhm","avatar_url":"https://i1.sndcdn.com/avatars-000011829266-wb0him-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/kaosuhm/submarine","artwork_url":null,"waveform_url":"https://w1.sndcdn.com/tu07uop0v64d_m.png","stream_url":"https://api.soundcloud.com/tracks/39749779/stream","download_url":"https://api.soundcloud.com/tracks/39749779/download","playback_count":8,"download_count":1,"favoritings_count":0,"comment_count":0,"attachments_uri":"https://api.soundcloud.com/tracks/39749779/attachments"},{"kind":"track","id":17190701,"created_at":"2011/06/15 13:46:31 +0000","user_id":2711254,"duration":296550,"commentable":true,"state":"finished","original_content_size":11855481,"sharing":"public","tag_list":"","permalink":"submarine","streamable":true,"embeddable_by":"all","downloadable":true,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"Dubstep","title":"Submarine","description":"","label_name":"","release":"","track_type":"original","key_signature":"","isrc":"","video_url":null,"bpm":0.0,"release_year":null,"release_month":null,"release_day":null,"original_format":"mp3","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/17190701","user":{"id":2711254,"kind":"user","permalink":"dendrido","username":"dendrido","uri":"https://api.soundcloud.com/users/2711254","permalink_url":"http://soundcloud.com/dendrido","avatar_url":"https://a1.sndcdn.com/images/default_avatar_large.png?923db0b"},"permalink_url":"http://soundcloud.com/dendrido/submarine","artwork_url":null,"waveform_url":"https://w1.sndcdn.com/hkQN0LhPNjqz_m.png","stream_url":"https://api.soundcloud.com/tracks/17190701/stream","download_url":"https://api.soundcloud.com/tracks/17190701/download","playback_count":72,"download_count":4,"favoritings_count":0,"comment_count":0,"attachments_uri":"https://api.soundcloud.com/tracks/17190701/attachments"},{"kind":"track","id":40419474,"created_at":"2012/03/20 22:27:01 +0000","user_id":4659673,"duration":199650,"commentable":true,"state":"finished","original_content_size":7978296,"sharing":"public","tag_list":"","permalink":"submarine","streamable":true,"embeddable_by":"all","downloadable":false,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"","title":"Submarine","description":"","label_name":"","release":"","track_type":"","key_signature":"","isrc":"","video_url":null,"bpm":null,"release_year":null,"release_month":null,"release_day":null,"original_format":"mp3","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/40419474","user":{"id":4659673,"kind":"user","permalink":"tscap","username":"tscap","uri":"https://api.soundcloud.com/users/4659673","permalink_url":"http://soundcloud.com/tscap","avatar_url":"https://a1.sndcdn.com/images/default_avatar_large.png?923db0b"},"permalink_url":"http://soundcloud.com/tscap/submarine","artwork_url":"https://i1.sndcdn.com/artworks-000020274637-ck6oy9-large.jpg?923db0b","waveform_url":"https://w1.sndcdn.com/3X3508xFUIZR_m.png","stream_url":"https://api.soundcloud.com/tracks/40419474/stream","playback_count":164,"download_count":0,"favoritings_count":0,"comment_count":0,"attachments_uri":"https://api.soundcloud.com/tracks/40419474/attachments"},{"kind":"track","id":51292639,"created_at":"2012/06/29 21:09:31 +0000","user_id":19499856,"duration":259207,"commentable":true,"state":"finished","original_content_size":6208042,"sharing":"public","tag_list":"","permalink":"submarine","streamable":true,"embeddable_by":"all","downloadable":false,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"German Pop","title":"Submarine","description":"","label_name":"","release":"","track_type":"remix","key_signature":"","isrc":"","video_url":null,"bpm":null,"release_year":null,"release_month":null,"release_day":null,"original_format":"mp3","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/51292639","user":{"id":19499856,"kind":"user","permalink":"diesonauten","username":"Diesonauten","uri":"https://api.soundcloud.com/users/19499856","permalink_url":"http://soundcloud.com/diesonauten","avatar_url":"https://i1.sndcdn.com/avatars-000017797144-zuhuyl-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/diesonauten/submarine","artwork_url":null,"waveform_url":"https://w1.sndcdn.com/S5IIOhTVBk7Z_m.png","stream_url":"https://api.soundcloud.com/tracks/51292639/stream","playback_count":7,"download_count":0,"favoritings_count":0,"comment_count":0,"attachments_uri":"https://api.soundcloud.com/tracks/51292639/attachments"},{"kind":"track","id":53118076,"created_at":"2012/07/17 06:09:31 +0000","user_id":20415464,"duration":160242,"commentable":true,"state":"finished","original_content_size":6405292,"sharing":"public","tag_list":"","permalink":"submarine","streamable":true,"embeddable_by":"all","downloadable":false,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"Ambient Electronic","title":"Submarine","description":"","label_name":"","release":"","track_type":"demo","key_signature":"","isrc":"","video_url":null,"bpm":null,"release_year":null,"release_month":null,"release_day":null,"original_format":"mp3","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/53118076","user":{"id":20415464,"kind":"user","permalink":"madfortune","username":"madfortune","uri":"https://api.soundcloud.com/users/20415464","permalink_url":"http://soundcloud.com/madfortune","avatar_url":"https://i1.sndcdn.com/avatars-000022913180-m3smv4-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/madfortune/submarine","artwork_url":null,"waveform_url":"https://w1.sndcdn.com/1fvPc3TAuocs_m.png","stream_url":"https://api.soundcloud.com/tracks/53118076/stream","playback_count":32,"download_count":0,"favoritings_count":0,"comment_count":0,"attachments_uri":"https://api.soundcloud.com/tracks/53118076/attachments"},{"kind":"track","id":71549416,"created_at":"2012/12/17 09:42:02 +0000","user_id":30649068,"duration":12775,"commentable":true,"state":"finished","original_content_size":265286,"sharing":"public","tag_list":"","permalink":"submarine","streamable":true,"embeddable_by":"all","downloadable":false,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":" COMPUTER ","title":"Submarine","description":"","label_name":"","release":"","track_type":null,"key_signature":null,"isrc":null,"video_url":null,"bpm":null,"release_year":null,"release_month":null,"release_day":null,"original_format":"mp3","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/71549416","user":{"id":30649068,"kind":"user","permalink":"ogn-2","username":"OGn","uri":"https://api.soundcloud.com/users/30649068","permalink_url":"http://soundcloud.com/ogn-2","avatar_url":"https://a1.sndcdn.com/images/default_avatar_large.png?923db0b"},"permalink_url":"http://soundcloud.com/ogn-2/submarine","artwork_url":null,"waveform_url":"https://w1.sndcdn.com/yys5pyVqN3N4_m.png","stream_url":"https://api.soundcloud.com/tracks/71549416/stream","playback_count":0,"download_count":0,"favoritings_count":0,"comment_count":0,"attachments_uri":"https://api.soundcloud.com/tracks/71549416/attachments"},{"kind":"track","id":28558390,"created_at":"2011/11/21 03:46:15 +0000","user_id":9115258,"duration":279250,"commentable":true,"state":"finished","original_content_size":9362480,"sharing":"public","tag_list":"","permalink":"submarine","streamable":true,"embeddable_by":"all","downloadable":false,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"Rock","title":"Submarine","description":"","label_name":"","release":"","track_type":"recording","key_signature":"","isrc":"","video_url":null,"bpm":null,"release_year":null,"release_month":null,"release_day":null,"original_format":"m4a","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/28558390","user":{"id":9115258,"kind":"user","permalink":"gymnasium-1","username":"GYMNASIUM","uri":"https://api.soundcloud.com/users/9115258","permalink_url":"http://soundcloud.com/gymnasium-1","avatar_url":"https://i1.sndcdn.com/avatars-000007549143-zvzvxp-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/gymnasium-1/submarine","artwork_url":"https://i1.sndcdn.com/artworks-000014289839-wiykjz-large.jpg?923db0b","waveform_url":"https://w1.sndcdn.com/s5KnrKvOymiS_m.png","stream_url":"https://api.soundcloud.com/tracks/28558390/stream","playback_count":40,"download_count":0,"favoritings_count":0,"comment_count":0,"attachments_uri":"https://api.soundcloud.com/tracks/28558390/attachments"},{"kind":"track","id":28867279,"created_at":"2011/11/24 15:46:53 +0000","user_id":2629105,"duration":1236585,"commentable":true,"state":"finished","original_content_size":24723440,"sharing":"public","tag_list":"","permalink":"submarine","streamable":true,"embeddable_by":"all","downloadable":false,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"","title":"submarine","description":"Submarine-Track for the Game Sea Level","label_name":"","release":"","track_type":"","key_signature":"","isrc":"","video_url":null,"bpm":null,"release_year":null,"release_month":null,"release_day":null,"original_format":"mp3","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/28867279","user":{"id":2629105,"kind":"user","permalink":"yosev","username":"yosev","uri":"https://api.soundcloud.com/users/2629105","permalink_url":"http://soundcloud.com/yosev","avatar_url":"https://a1.sndcdn.com/images/default_avatar_large.png?923db0b"},"permalink_url":"http://soundcloud.com/yosev/submarine","artwork_url":null,"waveform_url":"https://w1.sndcdn.com/14gsGyQlFfTS_m.png","stream_url":"https://api.soundcloud.com/tracks/28867279/stream","playback_count":11,"download_count":0,"favoritings_count":0,"comment_count":0,"attachments_uri":"https://api.soundcloud.com/tracks/28867279/attachments"},{"kind":"track","id":1820751,"created_at":"2010/02/28 14:53:47 +0000","user_id":360053,"duration":420260,"commentable":true,"state":"finished","original_content_size":74089920,"sharing":"public","tag_list":"","permalink":"submarine","streamable":true,"embeddable_by":"all","downloadable":false,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"","title":"Submarine","description":"jon hurst \"98\"","label_name":"","release":"","track_type":"","key_signature":"","isrc":"","video_url":null,"bpm":null,"release_year":null,"release_month":null,"release_day":null,"original_format":"aiff","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/1820751","user":{"id":360053,"kind":"user","permalink":"blacktruck","username":"Blacktruck","uri":"https://api.soundcloud.com/users/360053","permalink_url":"http://soundcloud.com/blacktruck","avatar_url":"https://i1.sndcdn.com/avatars-000001709104-msbwu1-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/blacktruck/submarine","artwork_url":null,"waveform_url":"https://w1.sndcdn.com/8UppVwvKXySo_m.png","stream_url":"https://api.soundcloud.com/tracks/1820751/stream","playback_count":82,"download_count":0,"favoritings_count":0,"comment_count":0,"attachments_uri":"https://api.soundcloud.com/tracks/1820751/attachments"},{"kind":"track","id":62370919,"created_at":"2012/10/05 23:48:57 +0000","user_id":5677944,"duration":137102,"commentable":true,"state":"finished","original_content_size":5482648,"sharing":"public","tag_list":"yonz yonzworth","permalink":"submarine","streamable":true,"embeddable_by":"all","downloadable":true,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"","title":"Submarine","description":"Yonz","label_name":"","release":"","track_type":"","key_signature":"","isrc":"","video_url":null,"bpm":null,"release_year":null,"release_month":null,"release_day":null,"original_format":"mp3","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/62370919","user":{"id":5677944,"kind":"user","permalink":"yonzworth","username":"YONZ.","uri":"https://api.soundcloud.com/users/5677944","permalink_url":"http://soundcloud.com/yonzworth","avatar_url":"https://i1.sndcdn.com/avatars-000023633772-akic5i-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/yonzworth/submarine","artwork_url":"https://i1.sndcdn.com/artworks-000031637328-php1z4-large.jpg?923db0b","waveform_url":"https://w1.sndcdn.com/yCSC15xa89sQ_m.png","stream_url":"https://api.soundcloud.com/tracks/62370919/stream","download_url":"https://api.soundcloud.com/tracks/62370919/download","playback_count":23,"download_count":1,"favoritings_count":0,"comment_count":1,"attachments_uri":"https://api.soundcloud.com/tracks/62370919/attachments"},{"kind":"track","id":33069285,"created_at":"2012/01/11 14:55:25 +0000","user_id":2392717,"duration":362639,"commentable":true,"state":"finished","original_content_size":12699248,"sharing":"public","tag_list":"Kenworthy Jack EP Doors Leicester","permalink":"submarine","streamable":true,"embeddable_by":"all","downloadable":false,"purchase_url":"https://itunes.apple.com/gb/album/doors-ep/id510972490","label_id":7338466,"purchase_title":null,"genre":"","title":"Submarine","description":"","label_name":"Flat Five Records","release":"","track_type":"recording","key_signature":"","isrc":"","video_url":null,"bpm":null,"release_year":null,"release_month":null,"release_day":null,"original_format":"m4a","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/33069285","user":{"id":2392717,"kind":"user","permalink":"kenworthymusic","username":"KENWORTHY","uri":"https://api.soundcloud.com/users/2392717","permalink_url":"http://soundcloud.com/kenworthymusic","avatar_url":"https://i1.sndcdn.com/avatars-000008980061-b44qs6-large.jpg?923db0b"},"label":{"id":7338466,"kind":"user","permalink":"flatfiverecords","username":"Flat Five Records","uri":"https://api.soundcloud.com/users/7338466","permalink_url":"http://soundcloud.com/flatfiverecords","avatar_url":"https://i1.sndcdn.com/avatars-000030448905-fwbm4z-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/kenworthymusic/submarine","artwork_url":"https://i1.sndcdn.com/artworks-000016606280-14kjii-large.jpg?923db0b","waveform_url":"https://w1.sndcdn.com/wLD3ZEwWRfw5_m.png","stream_url":"https://api.soundcloud.com/tracks/33069285/stream","playback_count":305,"download_count":0,"favoritings_count":2,"comment_count":0,"attachments_uri":"https://api.soundcloud.com/tracks/33069285/attachments"},{"kind":"track","id":16486990,"created_at":"2011/06/04 00:24:58 +0000","user_id":4747253,"duration":320069,"commentable":true,"state":"finished","original_content_size":28212068,"sharing":"public","tag_list":"","permalink":"submarine","streamable":true,"embeddable_by":"all","downloadable":false,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"","title":"Submarine","description":"submarine written on SuperCollider and edited on Audacity. ","label_name":"","release":"","track_type":"","key_signature":"","isrc":"","video_url":null,"bpm":null,"release_year":null,"release_month":null,"release_day":null,"original_format":"wav","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/16486990","user":{"id":4747253,"kind":"user","permalink":"raulislas","username":"raulislas","uri":"https://api.soundcloud.com/users/4747253","permalink_url":"http://soundcloud.com/raulislas","avatar_url":"https://i1.sndcdn.com/avatars-000003926030-xmig3q-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/raulislas/submarine","artwork_url":null,"waveform_url":"https://w1.sndcdn.com/NTTYjaUa7vPg_m.png","stream_url":"https://api.soundcloud.com/tracks/16486990/stream","playback_count":26,"download_count":0,"favoritings_count":0,"comment_count":0,"attachments_uri":"https://api.soundcloud.com/tracks/16486990/attachments"},{"kind":"track","id":73551373,"created_at":"2013/01/04 01:26:00 +0000","user_id":31879579,"duration":295080,"commentable":true,"state":"finished","original_content_size":9711446,"sharing":"public","tag_list":"critical bass submarine geneva youth dub chmouel robard","permalink":"submarine","streamable":true,"embeddable_by":"all","downloadable":false,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"Dub","title":"Submarine","description":"","label_name":"","release":"","track_type":"original","key_signature":"","isrc":"","video_url":null,"bpm":null,"release_year":null,"release_month":null,"release_day":null,"original_format":"m4a","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/73551373","user":{"id":31879579,"kind":"user","permalink":"chmouel-1","username":"Chmouel","uri":"https://api.soundcloud.com/users/31879579","permalink_url":"http://soundcloud.com/chmouel-1","avatar_url":"https://i1.sndcdn.com/avatars-000030145044-3w8j8t-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/chmouel-1/submarine","artwork_url":null,"waveform_url":"https://w1.sndcdn.com/nqOvtX1UTmqJ_m.png","stream_url":"https://api.soundcloud.com/tracks/73551373/stream","playback_count":52,"download_count":0,"favoritings_count":0,"comment_count":1,"attachments_uri":"https://api.soundcloud.com/tracks/73551373/attachments"},{"kind":"track","id":6342020,"created_at":"2010/10/23 20:44:41 +0000","user_id":1977285,"duration":295190,"commentable":true,"state":"finished","original_content_size":11851426,"sharing":"public","tag_list":"","permalink":"submarine","streamable":true,"embeddable_by":"all","downloadable":false,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"Alternative","title":"Submarine","description":"Song about exploring...inner space.\r\n\r\nGuest Drummer:Jonathon Chaffee of the Weeds","label_name":"","release":"","track_type":"demo","key_signature":"","isrc":"","video_url":null,"bpm":null,"release_year":null,"release_month":null,"release_day":null,"original_format":"mp3","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/6342020","user":{"id":1977285,"kind":"user","permalink":"niht","username":"NIHT","uri":"https://api.soundcloud.com/users/1977285","permalink_url":"http://soundcloud.com/niht","avatar_url":"https://i1.sndcdn.com/avatars-000001926282-51o35t-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/niht/submarine","artwork_url":"https://i1.sndcdn.com/artworks-000002724657-cwias9-large.jpg?923db0b","waveform_url":"https://w1.sndcdn.com/IomxkgsLmr4Q_m.png","stream_url":"https://api.soundcloud.com/tracks/6342020/stream","playback_count":106,"download_count":0,"favoritings_count":1,"comment_count":8,"attachments_uri":"https://api.soundcloud.com/tracks/6342020/attachments"},{"kind":"track","id":41730121,"created_at":"2012/04/02 03:21:19 +0000","user_id":14554162,"duration":178719,"commentable":true,"state":"finished","original_content_size":5821467,"sharing":"public","tag_list":"","permalink":"submarine","streamable":true,"embeddable_by":"all","downloadable":true,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"Piano/alternative","title":"Submarine","description":"Track 3 off Snacktime's 'A Snack To Remember' EP ","label_name":"","release":"","track_type":"demo","key_signature":"","isrc":"","video_url":null,"bpm":null,"release_year":null,"release_month":null,"release_day":null,"original_format":"m4a","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/41730121","user":{"id":14554162,"kind":"user","permalink":"snacktimelive","username":"Snacktimelive","uri":"https://api.soundcloud.com/users/14554162","permalink_url":"http://soundcloud.com/snacktimelive","avatar_url":"https://i1.sndcdn.com/avatars-000012769026-1uwvhh-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/snacktimelive/submarine","artwork_url":"https://i1.sndcdn.com/artworks-000020930107-68z9nf-large.jpg?923db0b","waveform_url":"https://w1.sndcdn.com/gHXwJG5NZXpu_m.png","stream_url":"https://api.soundcloud.com/tracks/41730121/stream","download_url":"https://api.soundcloud.com/tracks/41730121/download","playback_count":40,"download_count":8,"favoritings_count":0,"comment_count":0,"attachments_uri":"https://api.soundcloud.com/tracks/41730121/attachments"},{"kind":"track","id":57026982,"created_at":"2012/08/21 06:15:25 +0000","user_id":20863050,"duration":79546,"commentable":true,"state":"finished","original_content_size":3179859,"sharing":"public","tag_list":"triptronic","permalink":"submarine","streamable":true,"embeddable_by":"all","downloadable":false,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"Electronic","title":"Submarine","description":"Work en progress. Whistles are fun","label_name":"","release":"","track_type":"original","key_signature":"","isrc":"","video_url":null,"bpm":null,"release_year":null,"release_month":null,"release_day":null,"original_format":"mp3","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/57026982","user":{"id":20863050,"kind":"user","permalink":"1mouth","username":"_Mouth","uri":"https://api.soundcloud.com/users/20863050","permalink_url":"http://soundcloud.com/1mouth","avatar_url":"https://i1.sndcdn.com/avatars-000021518451-kxshue-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/1mouth/submarine","artwork_url":null,"waveform_url":"https://w1.sndcdn.com/kGOGc5wE62s6_m.png","stream_url":"https://api.soundcloud.com/tracks/57026982/stream","playback_count":24,"download_count":0,"favoritings_count":2,"comment_count":0,"attachments_uri":"https://api.soundcloud.com/tracks/57026982/attachments"},{"kind":"track","id":71471429,"created_at":"2012/12/16 18:28:09 +0000","user_id":18318316,"duration":305163,"commentable":true,"state":"finished","original_content_size":5082557,"sharing":"public","tag_list":"acoustic melodic unsigned thebedroomhour dynamic","permalink":"submarine","streamable":true,"embeddable_by":"all","downloadable":false,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"Alternative","title":"Submarine","description":"","label_name":"","release":"","track_type":"recording","key_signature":"","isrc":"","video_url":null,"bpm":null,"release_year":null,"release_month":null,"release_day":null,"original_format":"m4a","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/71471429","user":{"id":18318316,"kind":"user","permalink":"thebedroomhour","username":"thebedroomhour","uri":"https://api.soundcloud.com/users/18318316","permalink_url":"http://soundcloud.com/thebedroomhour","avatar_url":"https://i1.sndcdn.com/avatars-000016630904-haxh0v-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/thebedroomhour/submarine","artwork_url":null,"waveform_url":"https://w1.sndcdn.com/XmAVEiklNT3L_m.png","stream_url":"https://api.soundcloud.com/tracks/71471429/stream","playback_count":221,"download_count":0,"favoritings_count":12,"comment_count":4,"attachments_uri":"https://api.soundcloud.com/tracks/71471429/attachments"},{"kind":"track","id":9437798,"created_at":"2011/01/21 17:49:37 +0000","user_id":620091,"duration":156950,"commentable":true,"state":"finished","original_content_size":2509426,"sharing":"public","tag_list":"","permalink":"submarine","streamable":true,"embeddable_by":"all","downloadable":false,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"","title":"Submarine","description":"Songs about poetry, childhood, dreams, pain, lonelyness, memories, religion and cruelty.\r\nRecorded in Lastadia Studio, Gdansk, Poland, 2011","label_name":"","release":"","track_type":null,"key_signature":null,"isrc":null,"video_url":null,"bpm":null,"release_year":null,"release_month":null,"release_day":null,"original_format":"mp3","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/9437798","user":{"id":620091,"kind":"user","permalink":"komarski","username":"Komarski","uri":"https://api.soundcloud.com/users/620091","permalink_url":"http://soundcloud.com/komarski","avatar_url":"https://i1.sndcdn.com/avatars-000000932536-kfqtaw-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/komarski/submarine","artwork_url":"https://i1.sndcdn.com/artworks-000004289455-lzyqc7-large.jpg?923db0b","waveform_url":"https://w1.sndcdn.com/AJiASXLZ2rcO_m.png","stream_url":"https://api.soundcloud.com/tracks/9437798/stream","playback_count":35,"download_count":0,"favoritings_count":0,"comment_count":0,"attachments_uri":"https://api.soundcloud.com/tracks/9437798/attachments"},{"kind":"track","id":53265032,"created_at":"2012/07/18 13:28:10 +0000","user_id":19916258,"duration":294799,"commentable":true,"state":"finished","original_content_size":51967484,"sharing":"public","tag_list":"mpc mpc2500 hiphop inst sp-303 sampling DRS ballhead breakbeat","permalink":"submarine","streamable":true,"embeddable_by":"all","downloadable":false,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"Hiphopinstrumentals","title":"Submarine","description":"","label_name":"","release":"","track_type":"original","key_signature":"","isrc":"","video_url":null,"bpm":null,"release_year":null,"release_month":null,"release_day":null,"original_format":"wav","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/53265032","user":{"id":19916258,"kind":"user","permalink":"ballhead1216-1","username":"Ballhead","uri":"https://api.soundcloud.com/users/19916258","permalink_url":"http://soundcloud.com/ballhead1216-1","avatar_url":"https://i1.sndcdn.com/avatars-000018297535-kz8v8d-large.jpg?923db0b"},"permalink_url":"http://soundcloud.com/ballhead1216-1/submarine","artwork_url":null,"waveform_url":"https://w1.sndcdn.com/03W5PjTE04hR_m.png","stream_url":"https://api.soundcloud.com/tracks/53265032/stream","playback_count":77,"download_count":0,"favoritings_count":6,"comment_count":0,"attachments_uri":"https://api.soundcloud.com/tracks/53265032/attachments"}]
2313+<?xml version="1.0" encoding="UTF-8"?>
2314+<tracks next-href="https://api.soundcloud.com/tracks?consumer_key=398e83f17ec3c5cf945f04772de9f400&amp;limit=30&amp;offset=30&amp;order=hotness&amp;q=submarine" type="array">
2315+ <track>
2316+ <kind>track</kind>
2317+ <id type="integer">46495820</id>
2318+ <created-at type="datetime">2012-05-15T20:39:54Z</created-at>
2319+ <user-id type="integer">2303663</user-id>
2320+ <duration type="integer">308230</duration>
2321+ <commentable type="boolean">false</commentable>
2322+ <state>finished</state>
2323+ <original-content-size type="integer">12322884</original-content-size>
2324+ <sharing>public</sharing>
2325+ <tag-list></tag-list>
2326+ <permalink>walt-graces-submarine-test</permalink>
2327+ <streamable type="boolean">true</streamable>
2328+ <embeddable-by>all</embeddable-by>
2329+ <downloadable type="boolean">false</downloadable>
2330+ <purchase-url nil="true"></purchase-url>
2331+ <label-id nil="true"></label-id>
2332+ <purchase-title nil="true"></purchase-title>
2333+ <genre></genre>
2334+ <title>Walt Grace's Submarine Test, January 1967</title>
2335+ <description></description>
2336+ <label-name></label-name>
2337+ <release></release>
2338+ <track-type></track-type>
2339+ <key-signature></key-signature>
2340+ <isrc></isrc>
2341+ <video-url nil="true"></video-url>
2342+ <bpm nil="true"></bpm>
2343+ <release-year nil="true"></release-year>
2344+ <release-month nil="true"></release-month>
2345+ <release-day nil="true"></release-day>
2346+ <original-format>mp3</original-format>
2347+ <license>all-rights-reserved</license>
2348+ <uri>https://api.soundcloud.com/tracks/46495820</uri>
2349+ <user>
2350+ <id type="integer">2303663</id>
2351+ <kind>user</kind>
2352+ <permalink>johnmayer</permalink>
2353+ <username>johnmayer</username>
2354+ <uri>https://api.soundcloud.com/users/2303663</uri>
2355+ <permalink-url>http://soundcloud.com/johnmayer</permalink-url>
2356+ <avatar-url>https://i1.sndcdn.com/avatars-000015302931-dlue9y-large.jpg?cc07a88</avatar-url>
2357+ </user>
2358+ <permalink-url>http://soundcloud.com/johnmayer/walt-graces-submarine-test</permalink-url>
2359+ <artwork-url nil="true"></artwork-url>
2360+ <waveform-url>https://w1.sndcdn.com/P5WJmgx408ju_m.png</waveform-url>
2361+ <stream-url>https://api.soundcloud.com/tracks/46495820/stream</stream-url>
2362+ <attachments-uri>https://api.soundcloud.com/tracks/46495820/attachments</attachments-uri>
2363+ </track>
2364+ <track>
2365+ <kind>track</kind>
2366+ <id type="integer">99743581</id>
2367+ <created-at type="datetime">2013-07-05T03:24:05Z</created-at>
2368+ <user-id type="integer">50203203</user-id>
2369+ <duration type="integer">223550</duration>
2370+ <commentable type="boolean">true</commentable>
2371+ <state>finished</state>
2372+ <original-content-size type="integer">8950433</original-content-size>
2373+ <sharing>public</sharing>
2374+ <tag-list></tag-list>
2375+ <permalink>submarine</permalink>
2376+ <streamable type="boolean">true</streamable>
2377+ <embeddable-by>all</embeddable-by>
2378+ <downloadable type="boolean">false</downloadable>
2379+ <purchase-url nil="true"></purchase-url>
2380+ <label-id nil="true"></label-id>
2381+ <purchase-title nil="true"></purchase-title>
2382+ <genre>Underwater</genre>
2383+ <title>Submarine - Submarines</title>
2384+ <description>DEMO recording from our fourth rehersal. Recorded at Irene studios June 2013.
2385+http://www.facebook.com/pages/Submarines/613462528665489</description>
2386+ <label-name></label-name>
2387+ <release></release>
2388+ <track-type>demo</track-type>
2389+ <key-signature></key-signature>
2390+ <isrc></isrc>
2391+ <video-url nil="true"></video-url>
2392+ <bpm nil="true"></bpm>
2393+ <release-year nil="true"></release-year>
2394+ <release-month nil="true"></release-month>
2395+ <release-day nil="true"></release-day>
2396+ <original-format>mp3</original-format>
2397+ <license>all-rights-reserved</license>
2398+ <uri>https://api.soundcloud.com/tracks/99743581</uri>
2399+ <user>
2400+ <id type="integer">50203203</id>
2401+ <kind>user</kind>
2402+ <permalink>submarinesband</permalink>
2403+ <username>SubmarinesBand</username>
2404+ <uri>https://api.soundcloud.com/users/50203203</uri>
2405+ <permalink-url>http://soundcloud.com/submarinesband</permalink-url>
2406+ <avatar-url>https://i1.sndcdn.com/avatars-000046620261-yfvce6-large.jpg?cc07a88</avatar-url>
2407+ </user>
2408+ <permalink-url>http://soundcloud.com/submarinesband/submarine</permalink-url>
2409+ <artwork-url>https://i1.sndcdn.com/artworks-000052204608-okdvk3-large.jpg?cc07a88</artwork-url>
2410+ <waveform-url>https://w1.sndcdn.com/p0vnPSt9Kcbe_m.png</waveform-url>
2411+ <stream-url>https://api.soundcloud.com/tracks/99743581/stream</stream-url>
2412+ <playback-count type="integer">110</playback-count>
2413+ <download-count type="integer">0</download-count>
2414+ <favoritings-count type="integer">3</favoritings-count>
2415+ <comment-count type="integer">1</comment-count>
2416+ <attachments-uri>https://api.soundcloud.com/tracks/99743581/attachments</attachments-uri>
2417+ </track>
2418+ <track>
2419+ <kind>track</kind>
2420+ <id type="integer">98612674</id>
2421+ <created-at type="datetime">2013-06-27T00:31:34Z</created-at>
2422+ <user-id type="integer">4311696</user-id>
2423+ <duration type="integer">302081</duration>
2424+ <commentable type="boolean">true</commentable>
2425+ <state>finished</state>
2426+ <original-content-size type="integer">53277180</original-content-size>
2427+ <sharing>public</sharing>
2428+ <tag-list>"bad taste records" "the nameless city" "dusted wax kingdom"</tag-list>
2429+ <permalink>submarine-city</permalink>
2430+ <streamable type="boolean">true</streamable>
2431+ <embeddable-by>all</embeddable-by>
2432+ <downloadable type="boolean">false</downloadable>
2433+ <purchase-url nil="true"></purchase-url>
2434+ <label-id nil="true"></label-id>
2435+ <purchase-title nil="true"></purchase-title>
2436+ <genre>Instrumental Hiphop</genre>
2437+ <title>Submarine City</title>
2438+ <description>http://thirdpersonlurkin.bandcamp.com/</description>
2439+ <label-name></label-name>
2440+ <release></release>
2441+ <track-type></track-type>
2442+ <key-signature></key-signature>
2443+ <isrc></isrc>
2444+ <video-url nil="true"></video-url>
2445+ <bpm nil="true"></bpm>
2446+ <release-year nil="true"></release-year>
2447+ <release-month nil="true"></release-month>
2448+ <release-day nil="true"></release-day>
2449+ <original-format>wav</original-format>
2450+ <license>all-rights-reserved</license>
2451+ <uri>https://api.soundcloud.com/tracks/98612674</uri>
2452+ <user>
2453+ <id type="integer">4311696</id>
2454+ <kind>user</kind>
2455+ <permalink>thirdpersonlurkin</permalink>
2456+ <username>Third Person Lurkin</username>
2457+ <uri>https://api.soundcloud.com/users/4311696</uri>
2458+ <permalink-url>http://soundcloud.com/thirdpersonlurkin</permalink-url>
2459+ <avatar-url>https://i1.sndcdn.com/avatars-000046311415-gugiy8-large.jpg?cc07a88</avatar-url>
2460+ </user>
2461+ <permalink-url>http://soundcloud.com/thirdpersonlurkin/submarine-city</permalink-url>
2462+ <artwork-url>https://i1.sndcdn.com/artworks-000051575400-x2qtba-large.jpg?cc07a88</artwork-url>
2463+ <waveform-url>https://w1.sndcdn.com/Go6PTpPCGu1x_m.png</waveform-url>
2464+ <stream-url>https://api.soundcloud.com/tracks/98612674/stream</stream-url>
2465+ <playback-count type="integer">217</playback-count>
2466+ <download-count type="integer">0</download-count>
2467+ <favoritings-count type="integer">18</favoritings-count>
2468+ <comment-count type="integer">4</comment-count>
2469+ <attachments-uri>https://api.soundcloud.com/tracks/98612674/attachments</attachments-uri>
2470+ </track>
2471+ <track>
2472+ <kind>track</kind>
2473+ <id type="integer">100646268</id>
2474+ <created-at type="datetime">2013-07-11T19:18:55Z</created-at>
2475+ <user-id type="integer">26044098</user-id>
2476+ <duration type="integer">248263</duration>
2477+ <commentable type="boolean">true</commentable>
2478+ <state>finished</state>
2479+ <original-content-size type="integer">43778092</original-content-size>
2480+ <sharing>public</sharing>
2481+ <tag-list>soundcloud:source=android-3rdparty-upload</tag-list>
2482+ <permalink>submarine-idgaf-version</permalink>
2483+ <streamable type="boolean">true</streamable>
2484+ <embeddable-by>all</embeddable-by>
2485+ <downloadable type="boolean">false</downloadable>
2486+ <purchase-url nil="true"></purchase-url>
2487+ <label-id nil="true"></label-id>
2488+ <purchase-title nil="true"></purchase-title>
2489+ <genre nil="true"></genre>
2490+ <title>Submarine IDGAF version</title>
2491+ <description nil="true"></description>
2492+ <label-name nil="true"></label-name>
2493+ <release nil="true"></release>
2494+ <track-type>recording</track-type>
2495+ <key-signature nil="true"></key-signature>
2496+ <isrc nil="true"></isrc>
2497+ <video-url nil="true"></video-url>
2498+ <bpm nil="true"></bpm>
2499+ <release-year nil="true"></release-year>
2500+ <release-month nil="true"></release-month>
2501+ <release-day nil="true"></release-day>
2502+ <original-format>wav</original-format>
2503+ <license>all-rights-reserved</license>
2504+ <uri>https://api.soundcloud.com/tracks/100646268</uri>
2505+ <user>
2506+ <id type="integer">26044098</id>
2507+ <kind>user</kind>
2508+ <permalink>joesallesdrums</permalink>
2509+ <username>joesallesdrums</username>
2510+ <uri>https://api.soundcloud.com/users/26044098</uri>
2511+ <permalink-url>http://soundcloud.com/joesallesdrums</permalink-url>
2512+ <avatar-url>https://i1.sndcdn.com/avatars-000038450579-izkkv4-large.jpg?cc07a88</avatar-url>
2513+ </user>
2514+ <created-with>
2515+ <id type="integer">3152</id>
2516+ <kind>app</kind>
2517+ <name>SoundCloud Android</name>
2518+ <uri>https://api.soundcloud.com/apps/3152</uri>
2519+ <permalink-url>http://soundcloud.com/apps/android</permalink-url>
2520+ <external-url>https://market.android.com/details?id=com.soundcloud.android</external-url>
2521+ </created-with>
2522+ <permalink-url>http://soundcloud.com/joesallesdrums/submarine-idgaf-version</permalink-url>
2523+ <artwork-url nil="true"></artwork-url>
2524+ <waveform-url>https://w1.sndcdn.com/1o8Qqh6PbBmW_m.png</waveform-url>
2525+ <stream-url>https://api.soundcloud.com/tracks/100646268/stream</stream-url>
2526+ <playback-count type="integer">8</playback-count>
2527+ <download-count type="integer">0</download-count>
2528+ <favoritings-count type="integer">1</favoritings-count>
2529+ <comment-count type="integer">0</comment-count>
2530+ <attachments-uri>https://api.soundcloud.com/tracks/100646268/attachments</attachments-uri>
2531+ </track>
2532+ <track>
2533+ <kind>track</kind>
2534+ <id type="integer">8241719</id>
2535+ <created-at type="datetime">2010-12-20T11:35:25Z</created-at>
2536+ <user-id type="integer">2393625</user-id>
2537+ <duration type="integer">270782</duration>
2538+ <commentable type="boolean">true</commentable>
2539+ <state>finished</state>
2540+ <original-content-size type="integer">6497220</original-content-size>
2541+ <sharing>public</sharing>
2542+ <tag-list></tag-list>
2543+ <permalink>la-move-for-repulica</permalink>
2544+ <streamable type="boolean">true</streamable>
2545+ <embeddable-by>all</embeddable-by>
2546+ <downloadable type="boolean">true</downloadable>
2547+ <purchase-url nil="true"></purchase-url>
2548+ <label-id nil="true"></label-id>
2549+ <purchase-title nil="true"></purchase-title>
2550+ <genre></genre>
2551+ <title>LA - Move for Repulica</title>
2552+ <description>Cheesey but musically it works...</description>
2553+ <label-name></label-name>
2554+ <release></release>
2555+ <track-type></track-type>
2556+ <key-signature></key-signature>
2557+ <isrc></isrc>
2558+ <video-url nil="true"></video-url>
2559+ <bpm nil="true"></bpm>
2560+ <release-year nil="true"></release-year>
2561+ <release-month nil="true"></release-month>
2562+ <release-day nil="true"></release-day>
2563+ <original-format>mp3</original-format>
2564+ <license>all-rights-reserved</license>
2565+ <uri>https://api.soundcloud.com/tracks/8241719</uri>
2566+ <user>
2567+ <id type="integer">2393625</id>
2568+ <kind>user</kind>
2569+ <permalink>submarine-1</permalink>
2570+ <username>Submarine</username>
2571+ <uri>https://api.soundcloud.com/users/2393625</uri>
2572+ <permalink-url>http://soundcloud.com/submarine-1</permalink-url>
2573+ <avatar-url>https://i1.sndcdn.com/avatars-000002220972-lnqvui-large.jpg?cc07a88</avatar-url>
2574+ </user>
2575+ <permalink-url>http://soundcloud.com/submarine-1/la-move-for-repulica</permalink-url>
2576+ <artwork-url nil="true"></artwork-url>
2577+ <waveform-url>https://w1.sndcdn.com/bdEHCyvZZpJ6_m.png</waveform-url>
2578+ <stream-url>https://api.soundcloud.com/tracks/8241719/stream</stream-url>
2579+ <download-url>https://api.soundcloud.com/tracks/8241719/download</download-url>
2580+ <playback-count type="integer">23</playback-count>
2581+ <download-count type="integer">3</download-count>
2582+ <favoritings-count type="integer">0</favoritings-count>
2583+ <comment-count type="integer">0</comment-count>
2584+ <attachments-uri>https://api.soundcloud.com/tracks/8241719/attachments</attachments-uri>
2585+ </track>
2586+ <track>
2587+ <kind>track</kind>
2588+ <id type="integer">97175058</id>
2589+ <created-at type="datetime">2013-06-16T21:50:00Z</created-at>
2590+ <user-id type="integer">1397546</user-id>
2591+ <duration type="integer">54339</duration>
2592+ <commentable type="boolean">true</commentable>
2593+ <state>finished</state>
2594+ <original-content-size type="integer">19143776</original-content-size>
2595+ <sharing>public</sharing>
2596+ <tag-list></tag-list>
2597+ <permalink>fc2</permalink>
2598+ <streamable type="boolean">true</streamable>
2599+ <embeddable-by>all</embeddable-by>
2600+ <downloadable type="boolean">false</downloadable>
2601+ <purchase-url nil="true"></purchase-url>
2602+ <label-id nil="true"></label-id>
2603+ <purchase-title nil="true"></purchase-title>
2604+ <genre></genre>
2605+ <title>Fc2</title>
2606+ <description></description>
2607+ <label-name></label-name>
2608+ <release></release>
2609+ <track-type></track-type>
2610+ <key-signature></key-signature>
2611+ <isrc></isrc>
2612+ <video-url nil="true"></video-url>
2613+ <bpm nil="true"></bpm>
2614+ <release-year nil="true"></release-year>
2615+ <release-month nil="true"></release-month>
2616+ <release-day nil="true"></release-day>
2617+ <original-format>wav</original-format>
2618+ <license>cc-by</license>
2619+ <uri>https://api.soundcloud.com/tracks/97175058</uri>
2620+ <user>
2621+ <id type="integer">1397546</id>
2622+ <kind>user</kind>
2623+ <permalink>submarine</permalink>
2624+ <username>submarine</username>
2625+ <uri>https://api.soundcloud.com/users/1397546</uri>
2626+ <permalink-url>http://soundcloud.com/submarine</permalink-url>
2627+ <avatar-url>https://i1.sndcdn.com/avatars-000001518209-313nsa-large.jpg?cc07a88</avatar-url>
2628+ </user>
2629+ <permalink-url>http://soundcloud.com/submarine/fc2</permalink-url>
2630+ <artwork-url nil="true"></artwork-url>
2631+ <waveform-url>https://w1.sndcdn.com/p2dDB46hkNGP_m.png</waveform-url>
2632+ <stream-url>https://api.soundcloud.com/tracks/97175058/stream</stream-url>
2633+ <playback-count type="integer">6</playback-count>
2634+ <download-count type="integer">0</download-count>
2635+ <favoritings-count type="integer">0</favoritings-count>
2636+ <comment-count type="integer">0</comment-count>
2637+ <attachments-uri>https://api.soundcloud.com/tracks/97175058/attachments</attachments-uri>
2638+ </track>
2639+ <track>
2640+ <kind>track</kind>
2641+ <id type="integer">37219984</id>
2642+ <created-at type="datetime">2012-02-20T11:01:57Z</created-at>
2643+ <user-id type="integer">12013031</user-id>
2644+ <duration type="integer">232472</duration>
2645+ <commentable type="boolean">true</commentable>
2646+ <state>finished</state>
2647+ <original-content-size type="integer">9293392</original-content-size>
2648+ <sharing>public</sharing>
2649+ <tag-list>dubstep</tag-list>
2650+ <permalink>seniter-my-mind</permalink>
2651+ <streamable type="boolean">true</streamable>
2652+ <embeddable-by>all</embeddable-by>
2653+ <downloadable type="boolean">true</downloadable>
2654+ <purchase-url nil="true"></purchase-url>
2655+ <label-id nil="true"></label-id>
2656+ <purchase-title nil="true"></purchase-title>
2657+ <genre>dubstep</genre>
2658+ <title>Seniter - My Mind</title>
2659+ <description>dubstep</description>
2660+ <label-name></label-name>
2661+ <release></release>
2662+ <track-type>demo</track-type>
2663+ <key-signature></key-signature>
2664+ <isrc></isrc>
2665+ <video-url nil="true"></video-url>
2666+ <bpm nil="true"></bpm>
2667+ <release-year nil="true"></release-year>
2668+ <release-month nil="true"></release-month>
2669+ <release-day nil="true"></release-day>
2670+ <original-format>mp3</original-format>
2671+ <license>all-rights-reserved</license>
2672+ <uri>https://api.soundcloud.com/tracks/37219984</uri>
2673+ <user>
2674+ <id type="integer">12013031</id>
2675+ <kind>user</kind>
2676+ <permalink>submarine-3</permalink>
2677+ <username>SubMarine</username>
2678+ <uri>https://api.soundcloud.com/users/12013031</uri>
2679+ <permalink-url>http://soundcloud.com/submarine-3</permalink-url>
2680+ <avatar-url>https://a1.sndcdn.com/images/default_avatar_large.png?cc07a88</avatar-url>
2681+ </user>
2682+ <permalink-url>http://soundcloud.com/submarine-3/seniter-my-mind</permalink-url>
2683+ <artwork-url nil="true"></artwork-url>
2684+ <waveform-url>https://w1.sndcdn.com/FGhiJn68bxbs_m.png</waveform-url>
2685+ <stream-url>https://api.soundcloud.com/tracks/37219984/stream</stream-url>
2686+ <download-url>https://api.soundcloud.com/tracks/37219984/download</download-url>
2687+ <playback-count type="integer">13</playback-count>
2688+ <download-count type="integer">0</download-count>
2689+ <favoritings-count type="integer">0</favoritings-count>
2690+ <comment-count type="integer">0</comment-count>
2691+ <attachments-uri>https://api.soundcloud.com/tracks/37219984/attachments</attachments-uri>
2692+ </track>
2693+ <track>
2694+ <kind>track</kind>
2695+ <id type="integer">8241747</id>
2696+ <created-at type="datetime">2010-12-20T11:37:03Z</created-at>
2697+ <user-id type="integer">2393625</user-id>
2698+ <duration type="integer">400242</duration>
2699+ <commentable type="boolean">true</commentable>
2700+ <state>finished</state>
2701+ <original-content-size type="integer">9603713</original-content-size>
2702+ <sharing>public</sharing>
2703+ <tag-list></tag-list>
2704+ <permalink>la-i-found-air-through-polotics</permalink>
2705+ <streamable type="boolean">true</streamable>
2706+ <embeddable-by>all</embeddable-by>
2707+ <downloadable type="boolean">true</downloadable>
2708+ <purchase-url nil="true"></purchase-url>
2709+ <label-id nil="true"></label-id>
2710+ <purchase-title nil="true"></purchase-title>
2711+ <genre></genre>
2712+ <title>LA - I Found Air through polotics</title>
2713+ <description>Quality instrumental and bit of a get out of jail bootleg... one when you don't know what else will get F**king people to interact</description>
2714+ <label-name></label-name>
2715+ <release></release>
2716+ <track-type></track-type>
2717+ <key-signature></key-signature>
2718+ <isrc></isrc>
2719+ <video-url nil="true"></video-url>
2720+ <bpm nil="true"></bpm>
2721+ <release-year nil="true"></release-year>
2722+ <release-month nil="true"></release-month>
2723+ <release-day nil="true"></release-day>
2724+ <original-format>mp3</original-format>
2725+ <license>all-rights-reserved</license>
2726+ <uri>https://api.soundcloud.com/tracks/8241747</uri>
2727+ <user>
2728+ <id type="integer">2393625</id>
2729+ <kind>user</kind>
2730+ <permalink>submarine-1</permalink>
2731+ <username>Submarine</username>
2732+ <uri>https://api.soundcloud.com/users/2393625</uri>
2733+ <permalink-url>http://soundcloud.com/submarine-1</permalink-url>
2734+ <avatar-url>https://i1.sndcdn.com/avatars-000002220972-lnqvui-large.jpg?cc07a88</avatar-url>
2735+ </user>
2736+ <permalink-url>http://soundcloud.com/submarine-1/la-i-found-air-through-polotics</permalink-url>
2737+ <artwork-url nil="true"></artwork-url>
2738+ <waveform-url>https://w1.sndcdn.com/KIpkSVViTYms_m.png</waveform-url>
2739+ <stream-url>https://api.soundcloud.com/tracks/8241747/stream</stream-url>
2740+ <download-url>https://api.soundcloud.com/tracks/8241747/download</download-url>
2741+ <playback-count type="integer">16</playback-count>
2742+ <download-count type="integer">3</download-count>
2743+ <favoritings-count type="integer">0</favoritings-count>
2744+ <comment-count type="integer">0</comment-count>
2745+ <attachments-uri>https://api.soundcloud.com/tracks/8241747/attachments</attachments-uri>
2746+ </track>
2747+ <track>
2748+ <kind>track</kind>
2749+ <id type="integer">61638090</id>
2750+ <created-at type="datetime">2012-09-29T22:06:42Z</created-at>
2751+ <user-id type="integer">25157649</user-id>
2752+ <duration type="integer">281782</duration>
2753+ <commentable type="boolean">true</commentable>
2754+ <state>finished</state>
2755+ <original-content-size type="integer">11423654</original-content-size>
2756+ <sharing>public</sharing>
2757+ <tag-list>Submarine Mombahouse Origional Remix Alkatraz</tag-list>
2758+ <permalink>tormenta-las-trompa-llegadas</permalink>
2759+ <streamable type="boolean">true</streamable>
2760+ <embeddable-by>all</embeddable-by>
2761+ <downloadable type="boolean">false</downloadable>
2762+ <purchase-url nil="true"></purchase-url>
2763+ <label-id nil="true"></label-id>
2764+ <purchase-title nil="true"></purchase-title>
2765+ <genre>Mombahouse</genre>
2766+ <title>Tormenta - Las Trompa Llegadas (Submarine Remix)</title>
2767+ <description>This is a remix of another one of my projects - Tormenta. A project I share with Calgary's Kousk, in the search to make world music to stimulate the mind.
2768+
2769+This is my remix of our original.
2770+
2771+I hope you enjoy.
2772+
2773+Submarine.
2774+
2775+Download will be made available when this track reaches 100 listens. </description>
2776+ <label-name></label-name>
2777+ <release></release>
2778+ <track-type>original</track-type>
2779+ <key-signature></key-signature>
2780+ <isrc></isrc>
2781+ <video-url nil="true"></video-url>
2782+ <bpm nil="true"></bpm>
2783+ <release-year nil="true"></release-year>
2784+ <release-month nil="true"></release-month>
2785+ <release-day nil="true"></release-day>
2786+ <original-format>mp3</original-format>
2787+ <license>all-rights-reserved</license>
2788+ <uri>https://api.soundcloud.com/tracks/61638090</uri>
2789+ <user>
2790+ <id type="integer">25157649</id>
2791+ <kind>user</kind>
2792+ <permalink>submarine-5</permalink>
2793+ <username>SUBmarine</username>
2794+ <uri>https://api.soundcloud.com/users/25157649</uri>
2795+ <permalink-url>http://soundcloud.com/submarine-5</permalink-url>
2796+ <avatar-url>https://i1.sndcdn.com/avatars-000023509019-umhpcf-large.jpg?cc07a88</avatar-url>
2797+ </user>
2798+ <permalink-url>http://soundcloud.com/submarine-5/tormenta-las-trompa-llegadas</permalink-url>
2799+ <artwork-url>https://i1.sndcdn.com/artworks-000031256378-n3d3fg-large.jpg?cc07a88</artwork-url>
2800+ <waveform-url>https://w1.sndcdn.com/C0prIOi6Pq6p_m.png</waveform-url>
2801+ <stream-url>https://api.soundcloud.com/tracks/61638090/stream</stream-url>
2802+ <playback-count type="integer">83</playback-count>
2803+ <download-count type="integer">0</download-count>
2804+ <favoritings-count type="integer">0</favoritings-count>
2805+ <comment-count type="integer">1</comment-count>
2806+ <attachments-uri>https://api.soundcloud.com/tracks/61638090/attachments</attachments-uri>
2807+ </track>
2808+ <track>
2809+ <kind>track</kind>
2810+ <id type="integer">7976882</id>
2811+ <created-at type="datetime">2010-12-12T18:33:07Z</created-at>
2812+ <user-id type="integer">2393625</user-id>
2813+ <duration type="integer">50749</duration>
2814+ <commentable type="boolean">true</commentable>
2815+ <state>finished</state>
2816+ <original-content-size type="integer">1218386</original-content-size>
2817+ <sharing>public</sharing>
2818+ <tag-list></tag-list>
2819+ <permalink>the-edittttt</permalink>
2820+ <streamable type="boolean">true</streamable>
2821+ <embeddable-by>all</embeddable-by>
2822+ <downloadable type="boolean">false</downloadable>
2823+ <purchase-url nil="true"></purchase-url>
2824+ <label-id nil="true"></label-id>
2825+ <purchase-title nil="true"></purchase-title>
2826+ <genre></genre>
2827+ <title>THE EDITTTTT</title>
2828+ <description></description>
2829+ <label-name></label-name>
2830+ <release></release>
2831+ <track-type></track-type>
2832+ <key-signature></key-signature>
2833+ <isrc></isrc>
2834+ <video-url nil="true"></video-url>
2835+ <bpm nil="true"></bpm>
2836+ <release-year nil="true"></release-year>
2837+ <release-month nil="true"></release-month>
2838+ <release-day nil="true"></release-day>
2839+ <original-format>mp3</original-format>
2840+ <license>all-rights-reserved</license>
2841+ <uri>https://api.soundcloud.com/tracks/7976882</uri>
2842+ <user>
2843+ <id type="integer">2393625</id>
2844+ <kind>user</kind>
2845+ <permalink>submarine-1</permalink>
2846+ <username>Submarine</username>
2847+ <uri>https://api.soundcloud.com/users/2393625</uri>
2848+ <permalink-url>http://soundcloud.com/submarine-1</permalink-url>
2849+ <avatar-url>https://i1.sndcdn.com/avatars-000002220972-lnqvui-large.jpg?cc07a88</avatar-url>
2850+ </user>
2851+ <permalink-url>http://soundcloud.com/submarine-1/the-edittttt</permalink-url>
2852+ <artwork-url nil="true"></artwork-url>
2853+ <waveform-url>https://w1.sndcdn.com/fKZgRN1JNlEw_m.png</waveform-url>
2854+ <stream-url>https://api.soundcloud.com/tracks/7976882/stream</stream-url>
2855+ <playback-count type="integer">45</playback-count>
2856+ <download-count type="integer">0</download-count>
2857+ <favoritings-count type="integer">0</favoritings-count>
2858+ <comment-count type="integer">0</comment-count>
2859+ <attachments-uri>https://api.soundcloud.com/tracks/7976882/attachments</attachments-uri>
2860+ </track>
2861+ <track>
2862+ <kind>track</kind>
2863+ <id type="integer">37252163</id>
2864+ <created-at type="datetime">2012-02-20T18:02:27Z</created-at>
2865+ <user-id type="integer">12013031</user-id>
2866+ <duration type="integer">232472</duration>
2867+ <commentable type="boolean">true</commentable>
2868+ <state>finished</state>
2869+ <original-content-size type="integer">9293392</original-content-size>
2870+ <sharing>public</sharing>
2871+ <tag-list>dubstep</tag-list>
2872+ <permalink>seniter-my-mind-2</permalink>
2873+ <streamable type="boolean">true</streamable>
2874+ <embeddable-by>all</embeddable-by>
2875+ <downloadable type="boolean">true</downloadable>
2876+ <purchase-url nil="true"></purchase-url>
2877+ <label-id nil="true"></label-id>
2878+ <purchase-title nil="true"></purchase-title>
2879+ <genre>Dubstep</genre>
2880+ <title>Seniter - My Mind</title>
2881+ <description>dubstep</description>
2882+ <label-name></label-name>
2883+ <release></release>
2884+ <track-type>demo</track-type>
2885+ <key-signature></key-signature>
2886+ <isrc></isrc>
2887+ <video-url nil="true"></video-url>
2888+ <bpm nil="true"></bpm>
2889+ <release-year nil="true"></release-year>
2890+ <release-month nil="true"></release-month>
2891+ <release-day nil="true"></release-day>
2892+ <original-format>mp3</original-format>
2893+ <license>all-rights-reserved</license>
2894+ <uri>https://api.soundcloud.com/tracks/37252163</uri>
2895+ <user>
2896+ <id type="integer">12013031</id>
2897+ <kind>user</kind>
2898+ <permalink>submarine-3</permalink>
2899+ <username>SubMarine</username>
2900+ <uri>https://api.soundcloud.com/users/12013031</uri>
2901+ <permalink-url>http://soundcloud.com/submarine-3</permalink-url>
2902+ <avatar-url>https://a1.sndcdn.com/images/default_avatar_large.png?cc07a88</avatar-url>
2903+ </user>
2904+ <permalink-url>http://soundcloud.com/submarine-3/seniter-my-mind-2</permalink-url>
2905+ <artwork-url nil="true"></artwork-url>
2906+ <waveform-url>https://w1.sndcdn.com/FKIkC9Ix4RVc_m.png</waveform-url>
2907+ <stream-url>https://api.soundcloud.com/tracks/37252163/stream</stream-url>
2908+ <download-url>https://api.soundcloud.com/tracks/37252163/download</download-url>
2909+ <playback-count type="integer">15</playback-count>
2910+ <download-count type="integer">0</download-count>
2911+ <favoritings-count type="integer">0</favoritings-count>
2912+ <comment-count type="integer">1</comment-count>
2913+ <attachments-uri>https://api.soundcloud.com/tracks/37252163/attachments</attachments-uri>
2914+ </track>
2915+ <track>
2916+ <kind>track</kind>
2917+ <id type="integer">7323275</id>
2918+ <created-at type="datetime">2010-11-23T20:29:21Z</created-at>
2919+ <user-id type="integer">1197717</user-id>
2920+ <duration type="integer">259441</duration>
2921+ <commentable type="boolean">true</commentable>
2922+ <state>finished</state>
2923+ <original-content-size type="integer">68602916</original-content-size>
2924+ <sharing>public</sharing>
2925+ <tag-list></tag-list>
2926+ <permalink>into-the-future</permalink>
2927+ <streamable type="boolean">true</streamable>
2928+ <embeddable-by>all</embeddable-by>
2929+ <downloadable type="boolean">true</downloadable>
2930+ <purchase-url nil="true"></purchase-url>
2931+ <label-id nil="true"></label-id>
2932+ <purchase-title nil="true"></purchase-title>
2933+ <genre>Garage</genre>
2934+ <title>INTO THE FUTURE</title>
2935+ <description></description>
2936+ <label-name>none : (</label-name>
2937+ <release></release>
2938+ <track-type>original</track-type>
2939+ <key-signature></key-signature>
2940+ <isrc></isrc>
2941+ <video-url nil="true"></video-url>
2942+ <bpm nil="true"></bpm>
2943+ <release-year nil="true"></release-year>
2944+ <release-month nil="true"></release-month>
2945+ <release-day nil="true"></release-day>
2946+ <original-format>wav</original-format>
2947+ <license>all-rights-reserved</license>
2948+ <uri>https://api.soundcloud.com/tracks/7323275</uri>
2949+ <user>
2950+ <id type="integer">1197717</id>
2951+ <kind>user</kind>
2952+ <permalink>vibecatt</permalink>
2953+ <username>SUBMARINE</username>
2954+ <uri>https://api.soundcloud.com/users/1197717</uri>
2955+ <permalink-url>http://soundcloud.com/vibecatt</permalink-url>
2956+ <avatar-url>https://i1.sndcdn.com/avatars-000009396694-nye554-large.jpg?cc07a88</avatar-url>
2957+ </user>
2958+ <permalink-url>http://soundcloud.com/vibecatt/into-the-future</permalink-url>
2959+ <artwork-url>https://i1.sndcdn.com/artworks-000003216522-dv0ekw-large.jpg?cc07a88</artwork-url>
2960+ <waveform-url>https://w1.sndcdn.com/68in91FGBiec_m.png</waveform-url>
2961+ <stream-url>https://api.soundcloud.com/tracks/7323275/stream</stream-url>
2962+ <download-url>https://api.soundcloud.com/tracks/7323275/download</download-url>
2963+ <playback-count type="integer">509</playback-count>
2964+ <download-count type="integer">16</download-count>
2965+ <favoritings-count type="integer">5</favoritings-count>
2966+ <comment-count type="integer">8</comment-count>
2967+ <attachments-uri>https://api.soundcloud.com/tracks/7323275/attachments</attachments-uri>
2968+ </track>
2969+ <track>
2970+ <kind>track</kind>
2971+ <id type="integer">28347812</id>
2972+ <created-at type="datetime">2011-11-18T16:19:51Z</created-at>
2973+ <user-id type="integer">1197717</user-id>
2974+ <duration type="integer">238405</duration>
2975+ <commentable type="boolean">true</commentable>
2976+ <state>finished</state>
2977+ <original-content-size type="integer">42027024</original-content-size>
2978+ <sharing>public</sharing>
2979+ <tag-list>dreamsound sub pads deep new dubstep dubby bright tribal winter</tag-list>
2980+ <permalink>blue-moon</permalink>
2981+ <streamable type="boolean">true</streamable>
2982+ <embeddable-by>all</embeddable-by>
2983+ <downloadable type="boolean">true</downloadable>
2984+ <purchase-url nil="true"></purchase-url>
2985+ <label-id nil="true"></label-id>
2986+ <purchase-title nil="true"></purchase-title>
2987+ <genre>dubstep/tribal/space</genre>
2988+ <title>Blue moon</title>
2989+ <description></description>
2990+ <label-name></label-name>
2991+ <release></release>
2992+ <track-type>original</track-type>
2993+ <key-signature></key-signature>
2994+ <isrc></isrc>
2995+ <video-url nil="true"></video-url>
2996+ <bpm nil="true"></bpm>
2997+ <release-year nil="true"></release-year>
2998+ <release-month nil="true"></release-month>
2999+ <release-day nil="true"></release-day>
3000+ <original-format>wav</original-format>
3001+ <license>all-rights-reserved</license>
3002+ <uri>https://api.soundcloud.com/tracks/28347812</uri>
3003+ <user>
3004+ <id type="integer">1197717</id>
3005+ <kind>user</kind>
3006+ <permalink>vibecatt</permalink>
3007+ <username>SUBMARINE</username>
3008+ <uri>https://api.soundcloud.com/users/1197717</uri>
3009+ <permalink-url>http://soundcloud.com/vibecatt</permalink-url>
3010+ <avatar-url>https://i1.sndcdn.com/avatars-000009396694-nye554-large.jpg?cc07a88</avatar-url>
3011+ </user>
3012+ <permalink-url>http://soundcloud.com/vibecatt/blue-moon</permalink-url>
3013+ <artwork-url>https://i1.sndcdn.com/artworks-000017277156-d680ii-large.jpg?cc07a88</artwork-url>
3014+ <waveform-url>https://w1.sndcdn.com/jLHOHyWmFSwv_m.png</waveform-url>
3015+ <stream-url>https://api.soundcloud.com/tracks/28347812/stream</stream-url>
3016+ <download-url>https://api.soundcloud.com/tracks/28347812/download</download-url>
3017+ <playback-count type="integer">454</playback-count>
3018+ <download-count type="integer">26</download-count>
3019+ <favoritings-count type="integer">10</favoritings-count>
3020+ <comment-count type="integer">24</comment-count>
3021+ <attachments-uri>https://api.soundcloud.com/tracks/28347812/attachments</attachments-uri>
3022+ </track>
3023+ <track>
3024+ <kind>track</kind>
3025+ <id type="integer">24857671</id>
3026+ <created-at type="datetime">2011-10-06T00:23:07Z</created-at>
3027+ <user-id type="integer">1197717</user-id>
3028+ <duration type="integer">150991</duration>
3029+ <commentable type="boolean">true</commentable>
3030+ <state>finished</state>
3031+ <original-content-size type="integer">26611248</original-content-size>
3032+ <sharing>public</sharing>
3033+ <tag-list></tag-list>
3034+ <permalink>long-winter-1</permalink>
3035+ <streamable type="boolean">true</streamable>
3036+ <embeddable-by>all</embeddable-by>
3037+ <downloadable type="boolean">false</downloadable>
3038+ <purchase-url nil="true"></purchase-url>
3039+ <label-id nil="true"></label-id>
3040+ <purchase-title nil="true"></purchase-title>
3041+ <genre></genre>
3042+ <title>LONG winter</title>
3043+ <description></description>
3044+ <label-name></label-name>
3045+ <release></release>
3046+ <track-type></track-type>
3047+ <key-signature></key-signature>
3048+ <isrc></isrc>
3049+ <video-url nil="true"></video-url>
3050+ <bpm nil="true"></bpm>
3051+ <release-year nil="true"></release-year>
3052+ <release-month nil="true"></release-month>
3053+ <release-day nil="true"></release-day>
3054+ <original-format>wav</original-format>
3055+ <license>all-rights-reserved</license>
3056+ <uri>https://api.soundcloud.com/tracks/24857671</uri>
3057+ <user>
3058+ <id type="integer">1197717</id>
3059+ <kind>user</kind>
3060+ <permalink>vibecatt</permalink>
3061+ <username>SUBMARINE</username>
3062+ <uri>https://api.soundcloud.com/users/1197717</uri>
3063+ <permalink-url>http://soundcloud.com/vibecatt</permalink-url>
3064+ <avatar-url>https://i1.sndcdn.com/avatars-000009396694-nye554-large.jpg?cc07a88</avatar-url>
3065+ </user>
3066+ <permalink-url>http://soundcloud.com/vibecatt/long-winter-1</permalink-url>
3067+ <artwork-url>https://i1.sndcdn.com/artworks-000017277235-fqm6cu-large.jpg?cc07a88</artwork-url>
3068+ <waveform-url>https://w1.sndcdn.com/WzBgLB4Ma2cD_m.png</waveform-url>
3069+ <stream-url>https://api.soundcloud.com/tracks/24857671/stream</stream-url>
3070+ <playback-count type="integer">149</playback-count>
3071+ <download-count type="integer">0</download-count>
3072+ <favoritings-count type="integer">4</favoritings-count>
3073+ <comment-count type="integer">3</comment-count>
3074+ <attachments-uri>https://api.soundcloud.com/tracks/24857671/attachments</attachments-uri>
3075+ </track>
3076+ <track>
3077+ <kind>track</kind>
3078+ <id type="integer">8241760</id>
3079+ <created-at type="datetime">2010-12-20T11:37:56Z</created-at>
3080+ <user-id type="integer">2393625</user-id>
3081+ <duration type="integer">407481</duration>
3082+ <commentable type="boolean">true</commentable>
3083+ <state>finished</state>
3084+ <original-content-size type="integer">9777360</original-content-size>
3085+ <sharing>public</sharing>
3086+ <tag-list></tag-list>
3087+ <permalink>la-prayin-gospel</permalink>
3088+ <streamable type="boolean">true</streamable>
3089+ <embeddable-by>all</embeddable-by>
3090+ <downloadable type="boolean">true</downloadable>
3091+ <purchase-url nil="true"></purchase-url>
3092+ <label-id nil="true"></label-id>
3093+ <purchase-title nil="true"></purchase-title>
3094+ <genre></genre>
3095+ <title>LA - Prayin Gospel</title>
3096+ <description>Again bootlegs are meant to be cheesy...</description>
3097+ <label-name></label-name>
3098+ <release></release>
3099+ <track-type></track-type>
3100+ <key-signature></key-signature>
3101+ <isrc></isrc>
3102+ <video-url nil="true"></video-url>
3103+ <bpm nil="true"></bpm>
3104+ <release-year nil="true"></release-year>
3105+ <release-month nil="true"></release-month>
3106+ <release-day nil="true"></release-day>
3107+ <original-format>mp3</original-format>
3108+ <license>all-rights-reserved</license>
3109+ <uri>https://api.soundcloud.com/tracks/8241760</uri>
3110+ <user>
3111+ <id type="integer">2393625</id>
3112+ <kind>user</kind>
3113+ <permalink>submarine-1</permalink>
3114+ <username>Submarine</username>
3115+ <uri>https://api.soundcloud.com/users/2393625</uri>
3116+ <permalink-url>http://soundcloud.com/submarine-1</permalink-url>
3117+ <avatar-url>https://i1.sndcdn.com/avatars-000002220972-lnqvui-large.jpg?cc07a88</avatar-url>
3118+ </user>
3119+ <permalink-url>http://soundcloud.com/submarine-1/la-prayin-gospel</permalink-url>
3120+ <artwork-url nil="true"></artwork-url>
3121+ <waveform-url>https://w1.sndcdn.com/vsPZW6qU7p8V_m.png</waveform-url>
3122+ <stream-url>https://api.soundcloud.com/tracks/8241760/stream</stream-url>
3123+ <download-url>https://api.soundcloud.com/tracks/8241760/download</download-url>
3124+ <playback-count type="integer">17</playback-count>
3125+ <download-count type="integer">4</download-count>
3126+ <favoritings-count type="integer">0</favoritings-count>
3127+ <comment-count type="integer">0</comment-count>
3128+ <attachments-uri>https://api.soundcloud.com/tracks/8241760/attachments</attachments-uri>
3129+ </track>
3130+ <track>
3131+ <kind>track</kind>
3132+ <id type="integer">11148780</id>
3133+ <created-at type="datetime">2011-02-26T16:56:23Z</created-at>
3134+ <user-id type="integer">1197717</user-id>
3135+ <duration type="integer">271253</duration>
3136+ <commentable type="boolean">true</commentable>
3137+ <state>finished</state>
3138+ <original-content-size type="integer">71722616</original-content-size>
3139+ <sharing>public</sharing>
3140+ <tag-list></tag-list>
3141+ <permalink>deep-sleep</permalink>
3142+ <streamable type="boolean">true</streamable>
3143+ <embeddable-by>all</embeddable-by>
3144+ <downloadable type="boolean">false</downloadable>
3145+ <purchase-url nil="true"></purchase-url>
3146+ <label-id nil="true"></label-id>
3147+ <purchase-title nil="true"></purchase-title>
3148+ <genre>Ambient/garage</genre>
3149+ <title>DEEP SLEEP</title>
3150+ <description></description>
3151+ <label-name></label-name>
3152+ <release></release>
3153+ <track-type>original</track-type>
3154+ <key-signature></key-signature>
3155+ <isrc></isrc>
3156+ <video-url nil="true"></video-url>
3157+ <bpm type="float">134.0</bpm>
3158+ <release-year nil="true"></release-year>
3159+ <release-month nil="true"></release-month>
3160+ <release-day nil="true"></release-day>
3161+ <original-format>wav</original-format>
3162+ <license>all-rights-reserved</license>
3163+ <uri>https://api.soundcloud.com/tracks/11148780</uri>
3164+ <user>
3165+ <id type="integer">1197717</id>
3166+ <kind>user</kind>
3167+ <permalink>vibecatt</permalink>
3168+ <username>SUBMARINE</username>
3169+ <uri>https://api.soundcloud.com/users/1197717</uri>
3170+ <permalink-url>http://soundcloud.com/vibecatt</permalink-url>
3171+ <avatar-url>https://i1.sndcdn.com/avatars-000009396694-nye554-large.jpg?cc07a88</avatar-url>
3172+ </user>
3173+ <permalink-url>http://soundcloud.com/vibecatt/deep-sleep</permalink-url>
3174+ <artwork-url nil="true"></artwork-url>
3175+ <waveform-url>https://w1.sndcdn.com/XmYxE13Bba37_m.png</waveform-url>
3176+ <stream-url>https://api.soundcloud.com/tracks/11148780/stream</stream-url>
3177+ <playback-count type="integer">768</playback-count>
3178+ <download-count type="integer">0</download-count>
3179+ <favoritings-count type="integer">7</favoritings-count>
3180+ <comment-count type="integer">14</comment-count>
3181+ <attachments-uri>https://api.soundcloud.com/tracks/11148780/attachments</attachments-uri>
3182+ </track>
3183+ <track>
3184+ <kind>track</kind>
3185+ <id type="integer">3703311</id>
3186+ <created-at type="datetime">2010-06-29T14:24:27Z</created-at>
3187+ <user-id type="integer">1197717</user-id>
3188+ <duration type="integer">240181</duration>
3189+ <commentable type="boolean">true</commentable>
3190+ <state>finished</state>
3191+ <original-content-size type="integer">42336044</original-content-size>
3192+ <sharing>public</sharing>
3193+ <tag-list></tag-list>
3194+ <permalink>oh-you-just-wouldnt-let-it-lie</permalink>
3195+ <streamable type="boolean">true</streamable>
3196+ <embeddable-by>all</embeddable-by>
3197+ <downloadable type="boolean">true</downloadable>
3198+ <purchase-url nil="true"></purchase-url>
3199+ <label-id nil="true"></label-id>
3200+ <purchase-title nil="true"></purchase-title>
3201+ <genre>unfineshed</genre>
3202+ <title>Oh you just wouldnt let it lie</title>
3203+ <description></description>
3204+ <label-name></label-name>
3205+ <release></release>
3206+ <track-type></track-type>
3207+ <key-signature></key-signature>
3208+ <isrc></isrc>
3209+ <video-url nil="true"></video-url>
3210+ <bpm type="float">136.0</bpm>
3211+ <release-year nil="true"></release-year>
3212+ <release-month nil="true"></release-month>
3213+ <release-day nil="true"></release-day>
3214+ <original-format>wav</original-format>
3215+ <license>all-rights-reserved</license>
3216+ <uri>https://api.soundcloud.com/tracks/3703311</uri>
3217+ <user>
3218+ <id type="integer">1197717</id>
3219+ <kind>user</kind>
3220+ <permalink>vibecatt</permalink>
3221+ <username>SUBMARINE</username>
3222+ <uri>https://api.soundcloud.com/users/1197717</uri>
3223+ <permalink-url>http://soundcloud.com/vibecatt</permalink-url>
3224+ <avatar-url>https://i1.sndcdn.com/avatars-000009396694-nye554-large.jpg?cc07a88</avatar-url>
3225+ </user>
3226+ <permalink-url>http://soundcloud.com/vibecatt/oh-you-just-wouldnt-let-it-lie</permalink-url>
3227+ <artwork-url nil="true"></artwork-url>
3228+ <waveform-url>https://w1.sndcdn.com/bOpMn5TCVSwk_m.png</waveform-url>
3229+ <stream-url>https://api.soundcloud.com/tracks/3703311/stream</stream-url>
3230+ <download-url>https://api.soundcloud.com/tracks/3703311/download</download-url>
3231+ <playback-count type="integer">272</playback-count>
3232+ <download-count type="integer">7</download-count>
3233+ <favoritings-count type="integer">4</favoritings-count>
3234+ <comment-count type="integer">3</comment-count>
3235+ <attachments-uri>https://api.soundcloud.com/tracks/3703311/attachments</attachments-uri>
3236+ </track>
3237+ <track>
3238+ <kind>track</kind>
3239+ <id type="integer">6486500</id>
3240+ <created-at type="datetime">2010-10-28T12:06:14Z</created-at>
3241+ <user-id type="integer">1197717</user-id>
3242+ <duration type="integer">233100</duration>
3243+ <commentable type="boolean">true</commentable>
3244+ <state>finished</state>
3245+ <original-content-size type="integer">61636280</original-content-size>
3246+ <sharing>public</sharing>
3247+ <tag-list></tag-list>
3248+ <permalink>the-pattern</permalink>
3249+ <streamable type="boolean">true</streamable>
3250+ <embeddable-by>all</embeddable-by>
3251+ <downloadable type="boolean">true</downloadable>
3252+ <purchase-url nil="true"></purchase-url>
3253+ <label-id nil="true"></label-id>
3254+ <purchase-title nil="true"></purchase-title>
3255+ <genre>ambient/garage</genre>
3256+ <title>The DREAM pattern</title>
3257+ <description></description>
3258+ <label-name></label-name>
3259+ <release></release>
3260+ <track-type>original</track-type>
3261+ <key-signature></key-signature>
3262+ <isrc></isrc>
3263+ <video-url nil="true"></video-url>
3264+ <bpm type="float">136.0</bpm>
3265+ <release-year nil="true"></release-year>
3266+ <release-month nil="true"></release-month>
3267+ <release-day nil="true"></release-day>
3268+ <original-format>wav</original-format>
3269+ <license>all-rights-reserved</license>
3270+ <uri>https://api.soundcloud.com/tracks/6486500</uri>
3271+ <user>
3272+ <id type="integer">1197717</id>
3273+ <kind>user</kind>
3274+ <permalink>vibecatt</permalink>
3275+ <username>SUBMARINE</username>
3276+ <uri>https://api.soundcloud.com/users/1197717</uri>
3277+ <permalink-url>http://soundcloud.com/vibecatt</permalink-url>
3278+ <avatar-url>https://i1.sndcdn.com/avatars-000009396694-nye554-large.jpg?cc07a88</avatar-url>
3279+ </user>
3280+ <permalink-url>http://soundcloud.com/vibecatt/the-pattern</permalink-url>
3281+ <artwork-url>https://i1.sndcdn.com/artworks-000003021497-vfp002-large.jpg?cc07a88</artwork-url>
3282+ <waveform-url>https://w1.sndcdn.com/NOMmwfTvJ2Eb_m.png</waveform-url>
3283+ <stream-url>https://api.soundcloud.com/tracks/6486500/stream</stream-url>
3284+ <download-url>https://api.soundcloud.com/tracks/6486500/download</download-url>
3285+ <playback-count type="integer">416</playback-count>
3286+ <download-count type="integer">16</download-count>
3287+ <favoritings-count type="integer">4</favoritings-count>
3288+ <comment-count type="integer">3</comment-count>
3289+ <attachments-uri>https://api.soundcloud.com/tracks/6486500/attachments</attachments-uri>
3290+ </track>
3291+ <track>
3292+ <kind>track</kind>
3293+ <id type="integer">3591672</id>
3294+ <created-at type="datetime">2010-06-22T20:48:10Z</created-at>
3295+ <user-id type="integer">1197717</user-id>
3296+ <duration type="integer">370242</duration>
3297+ <commentable type="boolean">true</commentable>
3298+ <state>finished</state>
3299+ <original-content-size type="integer">12492933</original-content-size>
3300+ <sharing>public</sharing>
3301+ <tag-list></tag-list>
3302+ <permalink>rollin-down-paradise-drive</permalink>
3303+ <streamable type="boolean">true</streamable>
3304+ <embeddable-by>all</embeddable-by>
3305+ <downloadable type="boolean">false</downloadable>
3306+ <purchase-url nil="true"></purchase-url>
3307+ <label-id nil="true"></label-id>
3308+ <purchase-title nil="true"></purchase-title>
3309+ <genre>unfinished</genre>
3310+ <title>rollin down paradise drive</title>
3311+ <description>http://www.youtube.com/watch?v=RdD6L4cKKU8</description>
3312+ <label-name></label-name>
3313+ <release></release>
3314+ <track-type></track-type>
3315+ <key-signature></key-signature>
3316+ <isrc></isrc>
3317+ <video-url nil="true"></video-url>
3318+ <bpm type="float">150.0</bpm>
3319+ <release-year nil="true"></release-year>
3320+ <release-month nil="true"></release-month>
3321+ <release-day nil="true"></release-day>
3322+ <original-format>m4a</original-format>
3323+ <license>all-rights-reserved</license>
3324+ <uri>https://api.soundcloud.com/tracks/3591672</uri>
3325+ <user>
3326+ <id type="integer">1197717</id>
3327+ <kind>user</kind>
3328+ <permalink>vibecatt</permalink>
3329+ <username>SUBMARINE</username>
3330+ <uri>https://api.soundcloud.com/users/1197717</uri>
3331+ <permalink-url>http://soundcloud.com/vibecatt</permalink-url>
3332+ <avatar-url>https://i1.sndcdn.com/avatars-000009396694-nye554-large.jpg?cc07a88</avatar-url>
3333+ </user>
3334+ <permalink-url>http://soundcloud.com/vibecatt/rollin-down-paradise-drive</permalink-url>
3335+ <artwork-url nil="true"></artwork-url>
3336+ <waveform-url>https://w1.sndcdn.com/VciyI1oB6Uey_m.png</waveform-url>
3337+ <stream-url>https://api.soundcloud.com/tracks/3591672/stream</stream-url>
3338+ <playback-count type="integer">341</playback-count>
3339+ <download-count type="integer">0</download-count>
3340+ <favoritings-count type="integer">3</favoritings-count>
3341+ <comment-count type="integer">5</comment-count>
3342+ <attachments-uri>https://api.soundcloud.com/tracks/3591672/attachments</attachments-uri>
3343+ </track>
3344+ <track>
3345+ <kind>track</kind>
3346+ <id type="integer">5613923</id>
3347+ <created-at type="datetime">2010-09-27T14:44:45Z</created-at>
3348+ <user-id type="integer">1197717</user-id>
3349+ <duration type="integer">318030</duration>
3350+ <commentable type="boolean">true</commentable>
3351+ <state>finished</state>
3352+ <original-content-size type="integer">10069025</original-content-size>
3353+ <sharing>public</sharing>
3354+ <tag-list></tag-list>
3355+ <permalink>if-you-loved-me-you-would-ft-lucien-the-beat</permalink>
3356+ <streamable type="boolean">true</streamable>
3357+ <embeddable-by>all</embeddable-by>
3358+ <downloadable type="boolean">false</downloadable>
3359+ <purchase-url nil="true"></purchase-url>
3360+ <label-id nil="true"></label-id>
3361+ <purchase-title nil="true"></purchase-title>
3362+ <genre>Dubstep</genre>
3363+ <title>If you loved me,you would. ft Lucien &amp; the Beat</title>
3364+ <description></description>
3365+ <label-name></label-name>
3366+ <release></release>
3367+ <track-type>original</track-type>
3368+ <key-signature></key-signature>
3369+ <isrc></isrc>
3370+ <video-url nil="true"></video-url>
3371+ <bpm type="float">145.0</bpm>
3372+ <release-year nil="true"></release-year>
3373+ <release-month nil="true"></release-month>
3374+ <release-day nil="true"></release-day>
3375+ <original-format>m4a</original-format>
3376+ <license>all-rights-reserved</license>
3377+ <uri>https://api.soundcloud.com/tracks/5613923</uri>
3378+ <user>
3379+ <id type="integer">1197717</id>
3380+ <kind>user</kind>
3381+ <permalink>vibecatt</permalink>
3382+ <username>SUBMARINE</username>
3383+ <uri>https://api.soundcloud.com/users/1197717</uri>
3384+ <permalink-url>http://soundcloud.com/vibecatt</permalink-url>
3385+ <avatar-url>https://i1.sndcdn.com/avatars-000009396694-nye554-large.jpg?cc07a88</avatar-url>
3386+ </user>
3387+ <permalink-url>http://soundcloud.com/vibecatt/if-you-loved-me-you-would-ft-lucien-the-beat</permalink-url>
3388+ <artwork-url nil="true"></artwork-url>
3389+ <waveform-url>https://w1.sndcdn.com/kQmXBCvVRp49_m.png</waveform-url>
3390+ <stream-url>https://api.soundcloud.com/tracks/5613923/stream</stream-url>
3391+ <playback-count type="integer">271</playback-count>
3392+ <download-count type="integer">0</download-count>
3393+ <favoritings-count type="integer">2</favoritings-count>
3394+ <comment-count type="integer">2</comment-count>
3395+ <attachments-uri>https://api.soundcloud.com/tracks/5613923/attachments</attachments-uri>
3396+ </track>
3397+ <track>
3398+ <kind>track</kind>
3399+ <id type="integer">5614024</id>
3400+ <created-at type="datetime">2010-09-27T14:49:35Z</created-at>
3401+ <user-id type="integer">1197717</user-id>
3402+ <duration type="integer">210418</duration>
3403+ <commentable type="boolean">true</commentable>
3404+ <state>finished</state>
3405+ <original-content-size type="integer">6754931</original-content-size>
3406+ <sharing>public</sharing>
3407+ <tag-list></tag-list>
3408+ <permalink>silent-h-bleep-bleep-jungle-boogie-remix</permalink>
3409+ <streamable type="boolean">true</streamable>
3410+ <embeddable-by>all</embeddable-by>
3411+ <downloadable type="boolean">false</downloadable>
3412+ <purchase-url nil="true"></purchase-url>
3413+ <label-id nil="true"></label-id>
3414+ <purchase-title nil="true"></purchase-title>
3415+ <genre>Dubstep</genre>
3416+ <title>silent H Bleep Bleep (jungle boogie remix)</title>
3417+ <description></description>
3418+ <label-name></label-name>
3419+ <release></release>
3420+ <track-type>remix</track-type>
3421+ <key-signature></key-signature>
3422+ <isrc></isrc>
3423+ <video-url nil="true"></video-url>
3424+ <bpm type="float">137.0</bpm>
3425+ <release-year nil="true"></release-year>
3426+ <release-month nil="true"></release-month>
3427+ <release-day nil="true"></release-day>
3428+ <original-format>m4a</original-format>
3429+ <license>all-rights-reserved</license>
3430+ <uri>https://api.soundcloud.com/tracks/5614024</uri>
3431+ <user>
3432+ <id type="integer">1197717</id>
3433+ <kind>user</kind>
3434+ <permalink>vibecatt</permalink>
3435+ <username>SUBMARINE</username>
3436+ <uri>https://api.soundcloud.com/users/1197717</uri>
3437+ <permalink-url>http://soundcloud.com/vibecatt</permalink-url>
3438+ <avatar-url>https://i1.sndcdn.com/avatars-000009396694-nye554-large.jpg?cc07a88</avatar-url>
3439+ </user>
3440+ <permalink-url>http://soundcloud.com/vibecatt/silent-h-bleep-bleep-jungle-boogie-remix</permalink-url>
3441+ <artwork-url nil="true"></artwork-url>
3442+ <waveform-url>https://w1.sndcdn.com/CDaZ3aqNQrAL_m.png</waveform-url>
3443+ <stream-url>https://api.soundcloud.com/tracks/5614024/stream</stream-url>
3444+ <playback-count type="integer">375</playback-count>
3445+ <download-count type="integer">4</download-count>
3446+ <favoritings-count type="integer">4</favoritings-count>
3447+ <comment-count type="integer">11</comment-count>
3448+ <attachments-uri>https://api.soundcloud.com/tracks/5614024/attachments</attachments-uri>
3449+ </track>
3450+ <track>
3451+ <kind>track</kind>
3452+ <id type="integer">4822078</id>
3453+ <created-at type="datetime">2010-08-24T16:42:57Z</created-at>
3454+ <user-id type="integer">1397546</user-id>
3455+ <duration type="integer">5157046</duration>
3456+ <commentable type="boolean">true</commentable>
3457+ <state>finished</state>
3458+ <original-content-size type="integer">67789022</original-content-size>
3459+ <sharing>public</sharing>
3460+ <tag-list>wikicong delanda oo xo redundancy wikileaks</tag-list>
3461+ <permalink>kapital-identitat-mackt-fem</permalink>
3462+ <streamable type="boolean">true</streamable>
3463+ <embeddable-by>all</embeddable-by>
3464+ <downloadable type="boolean">true</downloadable>
3465+ <purchase-url nil="true"></purchase-url>
3466+ <label-id nil="true"></label-id>
3467+ <purchase-title nil="true"></purchase-title>
3468+ <genre>zef</genre>
3469+ <title>KAPITAL.IDENTIT&#196;T.MACKT.FEM</title>
3470+ <description>Chris, Karl and Magnus meet in a bar to talk about the Wikicong, redudancy in societies, Flows, OO (object Oriented Philosphy) and XO (X oriented Philosophy) , Wikileaks and distributed action and entities. </description>
3471+ <label-name>KIM</label-name>
3472+ <release></release>
3473+ <track-type>podcast</track-type>
3474+ <key-signature></key-signature>
3475+ <isrc></isrc>
3476+ <video-url nil="true"></video-url>
3477+ <bpm nil="true"></bpm>
3478+ <release-year type="integer">2010</release-year>
3479+ <release-month type="integer">8</release-month>
3480+ <release-day type="integer">23</release-day>
3481+ <original-format>mp3</original-format>
3482+ <license>no-rights-reserved</license>
3483+ <uri>https://api.soundcloud.com/tracks/4822078</uri>
3484+ <user>
3485+ <id type="integer">1397546</id>
3486+ <kind>user</kind>
3487+ <permalink>submarine</permalink>
3488+ <username>submarine</username>
3489+ <uri>https://api.soundcloud.com/users/1397546</uri>
3490+ <permalink-url>http://soundcloud.com/submarine</permalink-url>
3491+ <avatar-url>https://i1.sndcdn.com/avatars-000001518209-313nsa-large.jpg?cc07a88</avatar-url>
3492+ </user>
3493+ <permalink-url>http://soundcloud.com/submarine/kapital-identitat-mackt-fem</permalink-url>
3494+ <artwork-url>https://i1.sndcdn.com/artworks-000002170048-ahtea3-large.jpg?cc07a88</artwork-url>
3495+ <waveform-url>https://w1.sndcdn.com/pMuTPNymGQ2c_m.png</waveform-url>
3496+ <stream-url>https://api.soundcloud.com/tracks/4822078/stream</stream-url>
3497+ <download-url>https://api.soundcloud.com/tracks/4822078/download</download-url>
3498+ <playback-count type="integer">90</playback-count>
3499+ <download-count type="integer">3</download-count>
3500+ <favoritings-count type="integer">0</favoritings-count>
3501+ <comment-count type="integer">0</comment-count>
3502+ <attachments-uri>https://api.soundcloud.com/tracks/4822078/attachments</attachments-uri>
3503+ </track>
3504+ <track>
3505+ <kind>track</kind>
3506+ <id type="integer">74814003</id>
3507+ <created-at type="datetime">2013-01-13T21:25:23Z</created-at>
3508+ <user-id type="integer">1197717</user-id>
3509+ <duration type="integer">211846</duration>
3510+ <commentable type="boolean">true</commentable>
3511+ <state>finished</state>
3512+ <original-content-size type="integer">37355340</original-content-size>
3513+ <sharing>public</sharing>
3514+ <tag-list></tag-list>
3515+ <permalink>echos</permalink>
3516+ <streamable type="boolean">true</streamable>
3517+ <embeddable-by>all</embeddable-by>
3518+ <downloadable type="boolean">false</downloadable>
3519+ <purchase-url nil="true"></purchase-url>
3520+ <label-id nil="true"></label-id>
3521+ <purchase-title nil="true"></purchase-title>
3522+ <genre></genre>
3523+ <title>Echos</title>
3524+ <description></description>
3525+ <label-name></label-name>
3526+ <release></release>
3527+ <track-type></track-type>
3528+ <key-signature></key-signature>
3529+ <isrc></isrc>
3530+ <video-url nil="true"></video-url>
3531+ <bpm nil="true"></bpm>
3532+ <release-year nil="true"></release-year>
3533+ <release-month nil="true"></release-month>
3534+ <release-day nil="true"></release-day>
3535+ <original-format>wav</original-format>
3536+ <license>all-rights-reserved</license>
3537+ <uri>https://api.soundcloud.com/tracks/74814003</uri>
3538+ <user>
3539+ <id type="integer">1197717</id>
3540+ <kind>user</kind>
3541+ <permalink>vibecatt</permalink>
3542+ <username>SUBMARINE</username>
3543+ <uri>https://api.soundcloud.com/users/1197717</uri>
3544+ <permalink-url>http://soundcloud.com/vibecatt</permalink-url>
3545+ <avatar-url>https://i1.sndcdn.com/avatars-000009396694-nye554-large.jpg?cc07a88</avatar-url>
3546+ </user>
3547+ <permalink-url>http://soundcloud.com/vibecatt/echos</permalink-url>
3548+ <artwork-url nil="true"></artwork-url>
3549+ <waveform-url>https://w1.sndcdn.com/GuF1Nt5BZaJn_m.png</waveform-url>
3550+ <stream-url>https://api.soundcloud.com/tracks/74814003/stream</stream-url>
3551+ <playback-count type="integer">148</playback-count>
3552+ <download-count type="integer">0</download-count>
3553+ <favoritings-count type="integer">5</favoritings-count>
3554+ <comment-count type="integer">5</comment-count>
3555+ <attachments-uri>https://api.soundcloud.com/tracks/74814003/attachments</attachments-uri>
3556+ </track>
3557+ <track>
3558+ <kind>track</kind>
3559+ <id type="integer">38896423</id>
3560+ <created-at type="datetime">2012-03-06T16:34:19Z</created-at>
3561+ <user-id type="integer">1197717</user-id>
3562+ <duration type="integer">151019</duration>
3563+ <commentable type="boolean">true</commentable>
3564+ <state>finished</state>
3565+ <original-content-size type="integer">4974103</original-content-size>
3566+ <sharing>public</sharing>
3567+ <tag-list></tag-list>
3568+ <permalink>work-in-progress-dunno-what-to</permalink>
3569+ <streamable type="boolean">true</streamable>
3570+ <embeddable-by>all</embeddable-by>
3571+ <downloadable type="boolean">false</downloadable>
3572+ <purchase-url nil="true"></purchase-url>
3573+ <label-id nil="true"></label-id>
3574+ <purchase-title nil="true"></purchase-title>
3575+ <genre>dubstep/Egyptian </genre>
3576+ <title>work in progress dunno what to call it really?</title>
3577+ <description></description>
3578+ <label-name></label-name>
3579+ <release></release>
3580+ <track-type>original</track-type>
3581+ <key-signature></key-signature>
3582+ <isrc></isrc>
3583+ <video-url nil="true"></video-url>
3584+ <bpm nil="true"></bpm>
3585+ <release-year nil="true"></release-year>
3586+ <release-month nil="true"></release-month>
3587+ <release-day nil="true"></release-day>
3588+ <original-format>m4a</original-format>
3589+ <license>all-rights-reserved</license>
3590+ <uri>https://api.soundcloud.com/tracks/38896423</uri>
3591+ <user>
3592+ <id type="integer">1197717</id>
3593+ <kind>user</kind>
3594+ <permalink>vibecatt</permalink>
3595+ <username>SUBMARINE</username>
3596+ <uri>https://api.soundcloud.com/users/1197717</uri>
3597+ <permalink-url>http://soundcloud.com/vibecatt</permalink-url>
3598+ <avatar-url>https://i1.sndcdn.com/avatars-000009396694-nye554-large.jpg?cc07a88</avatar-url>
3599+ </user>
3600+ <permalink-url>http://soundcloud.com/vibecatt/work-in-progress-dunno-what-to</permalink-url>
3601+ <artwork-url nil="true"></artwork-url>
3602+ <waveform-url>https://w1.sndcdn.com/ZigYRiuqWMZL_m.png</waveform-url>
3603+ <stream-url>https://api.soundcloud.com/tracks/38896423/stream</stream-url>
3604+ <playback-count type="integer">223</playback-count>
3605+ <download-count type="integer">0</download-count>
3606+ <favoritings-count type="integer">5</favoritings-count>
3607+ <comment-count type="integer">12</comment-count>
3608+ <attachments-uri>https://api.soundcloud.com/tracks/38896423/attachments</attachments-uri>
3609+ </track>
3610+ <track>
3611+ <kind>track</kind>
3612+ <id type="integer">27745819</id>
3613+ <created-at type="datetime">2011-11-11T14:00:12Z</created-at>
3614+ <user-id type="integer">1197717</user-id>
3615+ <duration type="integer">72099</duration>
3616+ <commentable type="boolean">true</commentable>
3617+ <state>finished</state>
3618+ <original-content-size type="integer">12700844</original-content-size>
3619+ <sharing>public</sharing>
3620+ <tag-list></tag-list>
3621+ <permalink>click-clip</permalink>
3622+ <streamable type="boolean">true</streamable>
3623+ <embeddable-by>all</embeddable-by>
3624+ <downloadable type="boolean">false</downloadable>
3625+ <purchase-url nil="true"></purchase-url>
3626+ <label-id nil="true"></label-id>
3627+ <purchase-title nil="true"></purchase-title>
3628+ <genre>Dubstep</genre>
3629+ <title>click (clip)</title>
3630+ <description></description>
3631+ <label-name></label-name>
3632+ <release></release>
3633+ <track-type>original</track-type>
3634+ <key-signature></key-signature>
3635+ <isrc></isrc>
3636+ <video-url nil="true"></video-url>
3637+ <bpm nil="true"></bpm>
3638+ <release-year nil="true"></release-year>
3639+ <release-month nil="true"></release-month>
3640+ <release-day nil="true"></release-day>
3641+ <original-format>wav</original-format>
3642+ <license>all-rights-reserved</license>
3643+ <uri>https://api.soundcloud.com/tracks/27745819</uri>
3644+ <user>
3645+ <id type="integer">1197717</id>
3646+ <kind>user</kind>
3647+ <permalink>vibecatt</permalink>
3648+ <username>SUBMARINE</username>
3649+ <uri>https://api.soundcloud.com/users/1197717</uri>
3650+ <permalink-url>http://soundcloud.com/vibecatt</permalink-url>
3651+ <avatar-url>https://i1.sndcdn.com/avatars-000009396694-nye554-large.jpg?cc07a88</avatar-url>
3652+ </user>
3653+ <permalink-url>http://soundcloud.com/vibecatt/click-clip</permalink-url>
3654+ <artwork-url>https://i1.sndcdn.com/artworks-000017277180-0i48xv-large.jpg?cc07a88</artwork-url>
3655+ <waveform-url>https://w1.sndcdn.com/ie3yyCdzg1e0_m.png</waveform-url>
3656+ <stream-url>https://api.soundcloud.com/tracks/27745819/stream</stream-url>
3657+ <playback-count type="integer">202</playback-count>
3658+ <download-count type="integer">0</download-count>
3659+ <favoritings-count type="integer">5</favoritings-count>
3660+ <comment-count type="integer">4</comment-count>
3661+ <attachments-uri>https://api.soundcloud.com/tracks/27745819/attachments</attachments-uri>
3662+ </track>
3663+ <track>
3664+ <kind>track</kind>
3665+ <id type="integer">19273510</id>
3666+ <created-at type="datetime">2011-07-18T14:03:53Z</created-at>
3667+ <user-id type="integer">1197717</user-id>
3668+ <duration type="integer">68675</duration>
3669+ <commentable type="boolean">true</commentable>
3670+ <state>finished</state>
3671+ <original-content-size type="integer">18144044</original-content-size>
3672+ <sharing>public</sharing>
3673+ <tag-list></tag-list>
3674+ <permalink>love-preview</permalink>
3675+ <streamable type="boolean">true</streamable>
3676+ <embeddable-by>all</embeddable-by>
3677+ <downloadable type="boolean">false</downloadable>
3678+ <purchase-url nil="true"></purchase-url>
3679+ <label-id nil="true"></label-id>
3680+ <purchase-title nil="true"></purchase-title>
3681+ <genre></genre>
3682+ <title>Love (preview)</title>
3683+ <description></description>
3684+ <label-name></label-name>
3685+ <release></release>
3686+ <track-type>original</track-type>
3687+ <key-signature></key-signature>
3688+ <isrc></isrc>
3689+ <video-url nil="true"></video-url>
3690+ <bpm nil="true"></bpm>
3691+ <release-year nil="true"></release-year>
3692+ <release-month nil="true"></release-month>
3693+ <release-day nil="true"></release-day>
3694+ <original-format>wav</original-format>
3695+ <license>all-rights-reserved</license>
3696+ <uri>https://api.soundcloud.com/tracks/19273510</uri>
3697+ <user>
3698+ <id type="integer">1197717</id>
3699+ <kind>user</kind>
3700+ <permalink>vibecatt</permalink>
3701+ <username>SUBMARINE</username>
3702+ <uri>https://api.soundcloud.com/users/1197717</uri>
3703+ <permalink-url>http://soundcloud.com/vibecatt</permalink-url>
3704+ <avatar-url>https://i1.sndcdn.com/avatars-000009396694-nye554-large.jpg?cc07a88</avatar-url>
3705+ </user>
3706+ <permalink-url>http://soundcloud.com/vibecatt/love-preview</permalink-url>
3707+ <artwork-url>https://i1.sndcdn.com/artworks-000017277283-w1npy2-large.jpg?cc07a88</artwork-url>
3708+ <waveform-url>https://w1.sndcdn.com/cQaVh8HRfUyl_m.png</waveform-url>
3709+ <stream-url>https://api.soundcloud.com/tracks/19273510/stream</stream-url>
3710+ <playback-count type="integer">135</playback-count>
3711+ <download-count type="integer">0</download-count>
3712+ <favoritings-count type="integer">0</favoritings-count>
3713+ <comment-count type="integer">1</comment-count>
3714+ <attachments-uri>https://api.soundcloud.com/tracks/19273510/attachments</attachments-uri>
3715+ </track>
3716+ <track>
3717+ <kind>track</kind>
3718+ <id type="integer">19272956</id>
3719+ <created-at type="datetime">2011-07-18T13:50:57Z</created-at>
3720+ <user-id type="integer">1197717</user-id>
3721+ <duration type="integer">288188</duration>
3722+ <commentable type="boolean">true</commentable>
3723+ <state>finished</state>
3724+ <original-content-size type="integer">50803244</original-content-size>
3725+ <sharing>public</sharing>
3726+ <tag-list></tag-list>
3727+ <permalink>stelliferous-era-preview</permalink>
3728+ <streamable type="boolean">true</streamable>
3729+ <embeddable-by>all</embeddable-by>
3730+ <downloadable type="boolean">true</downloadable>
3731+ <purchase-url nil="true"></purchase-url>
3732+ <label-id nil="true"></label-id>
3733+ <purchase-title nil="true"></purchase-title>
3734+ <genre></genre>
3735+ <title>Stelliferous Era (preview/unmixed)</title>
3736+ <description></description>
3737+ <label-name></label-name>
3738+ <release></release>
3739+ <track-type>original</track-type>
3740+ <key-signature></key-signature>
3741+ <isrc></isrc>
3742+ <video-url nil="true"></video-url>
3743+ <bpm nil="true"></bpm>
3744+ <release-year nil="true"></release-year>
3745+ <release-month nil="true"></release-month>
3746+ <release-day nil="true"></release-day>
3747+ <original-format>wav</original-format>
3748+ <license>all-rights-reserved</license>
3749+ <uri>https://api.soundcloud.com/tracks/19272956</uri>
3750+ <user>
3751+ <id type="integer">1197717</id>
3752+ <kind>user</kind>
3753+ <permalink>vibecatt</permalink>
3754+ <username>SUBMARINE</username>
3755+ <uri>https://api.soundcloud.com/users/1197717</uri>
3756+ <permalink-url>http://soundcloud.com/vibecatt</permalink-url>
3757+ <avatar-url>https://i1.sndcdn.com/avatars-000009396694-nye554-large.jpg?cc07a88</avatar-url>
3758+ </user>
3759+ <permalink-url>http://soundcloud.com/vibecatt/stelliferous-era-preview</permalink-url>
3760+ <artwork-url>https://i1.sndcdn.com/artworks-000009425676-5nj0vx-large.jpg?cc07a88</artwork-url>
3761+ <waveform-url>https://w1.sndcdn.com/Ux3ASQ4wKaD0_m.png</waveform-url>
3762+ <stream-url>https://api.soundcloud.com/tracks/19272956/stream</stream-url>
3763+ <download-url>https://api.soundcloud.com/tracks/19272956/download</download-url>
3764+ <playback-count type="integer">141</playback-count>
3765+ <download-count type="integer">7</download-count>
3766+ <favoritings-count type="integer">3</favoritings-count>
3767+ <comment-count type="integer">7</comment-count>
3768+ <attachments-uri>https://api.soundcloud.com/tracks/19272956/attachments</attachments-uri>
3769+ </track>
3770+ <track>
3771+ <kind>track</kind>
3772+ <id type="integer">61643102</id>
3773+ <created-at type="datetime">2012-09-29T23:09:05Z</created-at>
3774+ <user-id type="integer">25157649</user-id>
3775+ <duration type="integer">1691325</duration>
3776+ <commentable type="boolean">true</commentable>
3777+ <state>finished</state>
3778+ <original-content-size type="integer">67763578</original-content-size>
3779+ <sharing>public</sharing>
3780+ <tag-list>Submarine Deep House Tech Mix Alkatraz</tag-list>
3781+ <permalink>0-below-1</permalink>
3782+ <streamable type="boolean">true</streamable>
3783+ <embeddable-by>all</embeddable-by>
3784+ <downloadable type="boolean">true</downloadable>
3785+ <purchase-url nil="true"></purchase-url>
3786+ <label-id nil="true"></label-id>
3787+ <purchase-title nil="true"></purchase-title>
3788+ <genre>Deep</genre>
3789+ <title>!0 Below #1</title>
3790+ <description>This is the first in my !0 Below series. Nothing but deep, dark, sub bass that can only be reached by traveling with Submarine into the depths.
3791+
3792+This series will consist of my favourite 10 Tech House and Deep House tracks I find as I travel this world.
3793+
3794+Enjoy!
3795+
3796+!0 Below #1
3797+
3798+Tormenta - Las Trompa Llegadas (Submarine Remix)
3799+Kolombo - Stop ou encore
3800+Justin Martin, Christian Martin - Riding Spaceships (Justin Martin Vs. Leroy Peppers - DJ Version)
3801+Sepehr - Apple Bottoms (Original Mix)
3802+Claude VonStroke - Chimps - Re-Edit
3803+Mojo Filter ft Mighty Boosh - Oaky Timbre (Loose Cannons Re-Flik)
3804+Tyrek - Charlie's Soap Box (Original Mix)
3805+Justin Martin, Ardalan - Lezgo VIP (Justin Martin Vs. Ardalan - DJ Version)
3806+Kill Frenzy - Titsss
3807+Kolombo - Busta Ass (Original Mix)
3808+
3809+</description>
3810+ <label-name></label-name>
3811+ <release></release>
3812+ <track-type>live</track-type>
3813+ <key-signature></key-signature>
3814+ <isrc></isrc>
3815+ <video-url nil="true"></video-url>
3816+ <bpm nil="true"></bpm>
3817+ <release-year nil="true"></release-year>
3818+ <release-month nil="true"></release-month>
3819+ <release-day nil="true"></release-day>
3820+ <original-format>mp3</original-format>
3821+ <license>all-rights-reserved</license>
3822+ <uri>https://api.soundcloud.com/tracks/61643102</uri>
3823+ <user>
3824+ <id type="integer">25157649</id>
3825+ <kind>user</kind>
3826+ <permalink>submarine-5</permalink>
3827+ <username>SUBmarine</username>
3828+ <uri>https://api.soundcloud.com/users/25157649</uri>
3829+ <permalink-url>http://soundcloud.com/submarine-5</permalink-url>
3830+ <avatar-url>https://i1.sndcdn.com/avatars-000023509019-umhpcf-large.jpg?cc07a88</avatar-url>
3831+ </user>
3832+ <permalink-url>http://soundcloud.com/submarine-5/0-below-1</permalink-url>
3833+ <artwork-url>https://i1.sndcdn.com/artworks-000031257163-w2f5u5-large.jpg?cc07a88</artwork-url>
3834+ <waveform-url>https://w1.sndcdn.com/iWUZQHgatzSu_m.png</waveform-url>
3835+ <stream-url>https://api.soundcloud.com/tracks/61643102/stream</stream-url>
3836+ <download-url>https://api.soundcloud.com/tracks/61643102/download</download-url>
3837+ <playback-count type="integer">106</playback-count>
3838+ <download-count type="integer">6</download-count>
3839+ <favoritings-count type="integer">2</favoritings-count>
3840+ <comment-count type="integer">4</comment-count>
3841+ <attachments-uri>https://api.soundcloud.com/tracks/61643102/attachments</attachments-uri>
3842+ </track>
3843+ <track>
3844+ <kind>track</kind>
3845+ <id type="integer">4627335</id>
3846+ <created-at type="datetime">2010-08-15T18:47:22Z</created-at>
3847+ <user-id type="integer">1397546</user-id>
3848+ <duration type="integer">1148179</duration>
3849+ <commentable type="boolean">true</commentable>
3850+ <state>finished</state>
3851+ <original-content-size type="integer">14217533</original-content-size>
3852+ <sharing>public</sharing>
3853+ <tag-list></tag-list>
3854+ <permalink>kapital-identitat-mackt-vier</permalink>
3855+ <streamable type="boolean">true</streamable>
3856+ <embeddable-by>all</embeddable-by>
3857+ <downloadable type="boolean">true</downloadable>
3858+ <purchase-url nil="true"></purchase-url>
3859+ <label-id nil="true"></label-id>
3860+ <purchase-title nil="true"></purchase-title>
3861+ <genre>tropical</genre>
3862+ <title>KAPITAL.IDENTIT&#196;T.MACKT.VIER</title>
3863+ <description>Den hemliga tr&#228;dg&#229;rden in Stockholm with Wikicong/Tikicong and Dj Rupture on squeky island</description>
3864+ <label-name>KIM</label-name>
3865+ <release>4</release>
3866+ <track-type>remix</track-type>
3867+ <key-signature>D</key-signature>
3868+ <isrc>12-345-67-89900</isrc>
3869+ <video-url nil="true"></video-url>
3870+ <bpm type="float">85.0</bpm>
3871+ <release-year type="integer">2010</release-year>
3872+ <release-month type="integer">8</release-month>
3873+ <release-day type="integer">15</release-day>
3874+ <original-format>mp3</original-format>
3875+ <license>no-rights-reserved</license>
3876+ <uri>https://api.soundcloud.com/tracks/4627335</uri>
3877+ <user>
3878+ <id type="integer">1397546</id>
3879+ <kind>user</kind>
3880+ <permalink>submarine</permalink>
3881+ <username>submarine</username>
3882+ <uri>https://api.soundcloud.com/users/1397546</uri>
3883+ <permalink-url>http://soundcloud.com/submarine</permalink-url>
3884+ <avatar-url>https://i1.sndcdn.com/avatars-000001518209-313nsa-large.jpg?cc07a88</avatar-url>
3885+ </user>
3886+ <permalink-url>http://soundcloud.com/submarine/kapital-identitat-mackt-vier</permalink-url>
3887+ <artwork-url>https://i1.sndcdn.com/artworks-000002102568-87lu6v-large.jpg?cc07a88</artwork-url>
3888+ <waveform-url>https://w1.sndcdn.com/vzioG2Vsf9hN_m.png</waveform-url>
3889+ <stream-url>https://api.soundcloud.com/tracks/4627335/stream</stream-url>
3890+ <download-url>https://api.soundcloud.com/tracks/4627335/download</download-url>
3891+ <playback-count type="integer">404</playback-count>
3892+ <download-count type="integer">42</download-count>
3893+ <favoritings-count type="integer">0</favoritings-count>
3894+ <comment-count type="integer">4</comment-count>
3895+ <attachments-uri>https://api.soundcloud.com/tracks/4627335/attachments</attachments-uri>
3896+ </track>
3897+ <track>
3898+ <kind>track</kind>
3899+ <id type="integer">34649100</id>
3900+ <created-at type="datetime">2012-01-26T23:46:38Z</created-at>
3901+ <user-id type="integer">1197717</user-id>
3902+ <duration type="integer">284763</duration>
3903+ <commentable type="boolean">true</commentable>
3904+ <state>finished</state>
3905+ <original-content-size type="integer">50198444</original-content-size>
3906+ <sharing>public</sharing>
3907+ <tag-list></tag-list>
3908+ <permalink>europa</permalink>
3909+ <streamable type="boolean">true</streamable>
3910+ <embeddable-by>all</embeddable-by>
3911+ <downloadable type="boolean">true</downloadable>
3912+ <purchase-url nil="true"></purchase-url>
3913+ <label-id nil="true"></label-id>
3914+ <purchase-title nil="true"></purchase-title>
3915+ <genre>spacy/dubstep</genre>
3916+ <title>Europa</title>
3917+ <description></description>
3918+ <label-name></label-name>
3919+ <release></release>
3920+ <track-type>original</track-type>
3921+ <key-signature></key-signature>
3922+ <isrc></isrc>
3923+ <video-url nil="true"></video-url>
3924+ <bpm nil="true"></bpm>
3925+ <release-year nil="true"></release-year>
3926+ <release-month nil="true"></release-month>
3927+ <release-day nil="true"></release-day>
3928+ <original-format>wav</original-format>
3929+ <license>all-rights-reserved</license>
3930+ <uri>https://api.soundcloud.com/tracks/34649100</uri>
3931+ <user>
3932+ <id type="integer">1197717</id>
3933+ <kind>user</kind>
3934+ <permalink>vibecatt</permalink>
3935+ <username>SUBMARINE</username>
3936+ <uri>https://api.soundcloud.com/users/1197717</uri>
3937+ <permalink-url>http://soundcloud.com/vibecatt</permalink-url>
3938+ <avatar-url>https://i1.sndcdn.com/avatars-000009396694-nye554-large.jpg?cc07a88</avatar-url>
3939+ </user>
3940+ <permalink-url>http://soundcloud.com/vibecatt/europa</permalink-url>
3941+ <artwork-url>https://i1.sndcdn.com/artworks-000017390975-hr2uvg-large.jpg?cc07a88</artwork-url>
3942+ <waveform-url>https://w1.sndcdn.com/yADh0ritdoKv_m.png</waveform-url>
3943+ <stream-url>https://api.soundcloud.com/tracks/34649100/stream</stream-url>
3944+ <download-url>https://api.soundcloud.com/tracks/34649100/download</download-url>
3945+ <playback-count type="integer">381</playback-count>
3946+ <download-count type="integer">14</download-count>
3947+ <favoritings-count type="integer">6</favoritings-count>
3948+ <comment-count type="integer">15</comment-count>
3949+ <attachments-uri>https://api.soundcloud.com/tracks/34649100/attachments</attachments-uri>
3950+ </track>
3951+</tracks>
3952
3953=== added file 'tests/data/valgrind.suppression'
3954--- tests/data/valgrind.suppression 1970-01-01 00:00:00 +0000
3955+++ tests/data/valgrind.suppression 2013-07-14 08:39:27 +0000
3956@@ -0,0 +1,61 @@
3957+
3958+###############################
3959+# GObject rules
3960+###############################
3961+
3962+{
3963+ <insert_a_suppression_name_here>
3964+ Memcheck:Leak
3965+ ...
3966+ fun:g_type_register_static
3967+}
3968+
3969+{
3970+ <insert_a_suppression_name_here>
3971+ Memcheck:Leak
3972+ ...
3973+ fun:g_type_register_fundamental
3974+}
3975+
3976+{
3977+ <insert_a_suppression_name_here>
3978+ Memcheck:Leak
3979+ ...
3980+ fun:type_node_fundamental_new_W
3981+}
3982+
3983+{
3984+ <insert_a_suppression_name_here>
3985+ Memcheck:Leak
3986+ ...
3987+ fun:type_data_make_W
3988+}
3989+
3990+{
3991+ <insert_a_suppression_name_here>
3992+ Memcheck:Leak
3993+ ...
3994+ fun:g_type_add_interface_static
3995+}
3996+
3997+{
3998+ <insert_a_suppression_name_here>
3999+ Memcheck:Leak
4000+ ...
4001+ fun:type_iface_vtable_base_init_Wm
4002+}
4003+
4004+{
4005+ <insert_a_suppression_name_here>
4006+ Memcheck:Leak
4007+ ...
4008+ fun:g_dbus_interface_skeleton_class_intern_init
4009+}
4010+
4011+{
4012+ <insert_a_suppression_name_here>
4013+ Memcheck:Leak
4014+ ...
4015+ fun:g_signal_type_cclosure_new
4016+}
4017+
4018
4019=== added file 'tests/main.cpp'
4020--- tests/main.cpp 1970-01-01 00:00:00 +0000
4021+++ tests/main.cpp 2013-07-14 08:39:27 +0000
4022@@ -0,0 +1,38 @@
4023+/*
4024+ * Copyright (C) 2013 Canonical, Ltd.
4025+ *
4026+ * This program is free software; you can redistribute it and/or modify
4027+ * it under the terms of the GNU General Public License as published by
4028+ * the Free Software Foundation; version 3.
4029+ *
4030+ * This program is distributed in the hope that it will be useful,
4031+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
4032+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4033+ * GNU General Public License for more details.
4034+ *
4035+ * You should have received a copy of the GNU General Public License
4036+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
4037+ *
4038+ * Author: Pete Woods <pete.woods@canonical.com>
4039+ */
4040+
4041+#include <config.h>
4042+#include <cstdlib>
4043+#include <gtest/gtest.h>
4044+#include <QtCore/QCoreApplication>
4045+
4046+int main(int argc, char **argv) {
4047+ QCoreApplication application(argc, argv);
4048+
4049+ setenv("LANG", "C.UTF-8", true);
4050+ unsetenv("LC_ALL");
4051+
4052+ setlocale(LC_ALL, "");
4053+ bindtextdomain(GETTEXT_PACKAGE, LOCALE_DIR);
4054+ textdomain(GETTEXT_PACKAGE);
4055+
4056+ ::testing::InitGoogleTest(&argc, argv);
4057+ int result(RUN_ALL_TESTS());
4058+
4059+ return result;
4060+}
4061
4062=== removed file 'tests/test_soundcloud.py'
4063--- tests/test_soundcloud.py 2013-02-13 14:31:12 +0000
4064+++ tests/test_soundcloud.py 1970-01-01 00:00:00 +0000
4065@@ -1,63 +0,0 @@
4066-#! /usr/bin/python3
4067-# -*- coding: utf-8 -*-
4068-from gi.repository import Unity
4069-from unittest import TestCase
4070-import imp
4071-
4072-class ResultSet(Unity.ResultSet):
4073- def __init__(self):
4074- Unity.ResultSet.__init__(self)
4075- self.results = []
4076-
4077- def do_add_result(self, result):
4078- self.results.append({'uri':result.uri,
4079- 'title':result.title,
4080- 'comment':result.comment,
4081- 'icon':result.icon_hint})
4082-
4083-
4084-class ScopeTestCase(TestCase):
4085- def init_scope(self, scope_path):
4086- self.scope_module = imp.load_source('scope', scope_path)
4087- self.scope = self.scope_module.load_scope()
4088-
4089- def perform_query(self, query, filter_set = Unity.FilterSet.new()):
4090- result_set = ResultSet()
4091- ctx = Unity.SearchContext.create(query, 0, filter_set,
4092- None, result_set, None)
4093- s = self.scope.create_search_for_query(ctx)
4094- s.run()
4095- return result_set
4096-
4097-
4098-class TestSoundcloud(ScopeTestCase):
4099- def setUp(self):
4100- self.init_scope('src/unity_soundcloud_daemon.py')
4101-
4102- def tearDown(self):
4103- self.scope = None
4104- self.scope_module = None
4105-
4106- def test_valid_searches(self):
4107- self.scope_module.SEARCH_URI = 'file:tests/data/mock_soundcloud_pass#'
4108- expected_results = ['http://soundcloud.com/vibecatt/echos', 'Echos',
4109- 'http://soundcloud.com/vibecatt/ganymede', 'Ganymede']
4110- results = []
4111- for s in ['submarine']:
4112- result_set = self.perform_query(s)
4113- results.append(result_set.results[0]['uri'])
4114- results.append(result_set.results[0]['title'])
4115- results.append(result_set.results[1]['uri'])
4116- results.append(result_set.results[1]['title'])
4117-
4118- self.assertEqual(results, expected_results)
4119-
4120- def test_failing_search(self):
4121- self.scope_module.SEARCH_URI = 'file:tests/data/mock_soundcloud_fail#'
4122- for s in ['submarine']:
4123- result_set = self.perform_query(s)
4124- self.assertEqual(len(result_set.results), 0)
4125-
4126-
4127-if __name__ == '__main__':
4128- unittest.main()

Subscribers

People subscribed via source and target branches

to all changes: