diff --git a/.gitignore b/.gitignore index a424412..a90f13e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ -artwork/*.png -output.html +# my private data +*.sublime-workspace diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..0e6b559 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,15 @@ +language: php +php: +- 5.4 +- 5.5 +- 5.6 +install: make clean init +script: make build +deploy: + provider: releases + api_key: + secure: jeJ1Dw4sMhttDclMPJ7bzWgVhn8NPF8QdGS2b85RICTU8+Z6rDsN9xwwhzbfyHVT16cmlB6GSPkX8Vhxw6BM8IiFFxN07S3uK6wNvzunUKkZqAh/o3hvpniRmmOmmTZfOCFhEZRuyYeng+NnNaHAU3bvH3tnRMuJUq9tKUqusw7Vbp7driQu2J5hvr7rgIu/mw+4SI16q6jshx6Vsc4owAyFGjt3vtTf+jke8aEqZOiweeRYJY7lDTf3jlSHiqeOOZm204M6v3FY32TIOIX3NQEFqjmAyGcSBXN89n31ufLAKOageTZOEqdffiPXgYfO8YAT5n/FupFcW6MaAH55PQUHVWhccYsRL80ix7h/xQ+PUFXS55AZR4B1AGVzkTZhrn5eJTtMyP+JevKX3SgjmK0uxfV4ckEEPSNPHIHpImP6gkUts3JlcxKhWH3htN7dh8XEfhQ4fK3zvhxVk/syS8QQ5eXOHrhkcjsnmx0BhlNyjLEeO0bxa0AvQOltEfsrNbicEr9z5i+GcI98HJeVWWUE4ZncLKK8wQffs3ONtrZVcCcLNhvIJrhjg27/Jr953DMi1SexgFyrDax0gOAmjwU3J4XhmNSKgNNxZlpZE5OcVSO5wKz7aZUTbOSfp6JcfpsU/uX+P+348Ve2X68gQWvrZPU/Wwuu7JB/w43+aeI= + file: dist/Spotifious.alfredworkflow + skip_cleanup: true + on: + branch: master \ No newline at end of file diff --git a/4BB22960-369A-4674-AF29-00CCE1603B53.png b/4BB22960-369A-4674-AF29-00CCE1603B53.png deleted file mode 100644 index 012810c..0000000 Binary files a/4BB22960-369A-4674-AF29-00CCE1603B53.png and /dev/null differ diff --git a/8020A500-17C9-43BA-B17A-00D35E460EB6.png b/8020A500-17C9-43BA-B17A-00D35E460EB6.png deleted file mode 100644 index 0e33a4c..0000000 Binary files a/8020A500-17C9-43BA-B17A-00D35E460EB6.png and /dev/null differ diff --git a/86EAA0E6-6086-4BC4-8CE7-0673F392C77F.png b/86EAA0E6-6086-4BC4-8CE7-0673F392C77F.png deleted file mode 100644 index 7c4e43d..0000000 Binary files a/86EAA0E6-6086-4BC4-8CE7-0673F392C77F.png and /dev/null differ diff --git a/B02E0659-E11A-4746-ADB7-2C2C0A8BD8BB.png b/B02E0659-E11A-4746-ADB7-2C2C0A8BD8BB.png deleted file mode 100644 index b649856..0000000 Binary files a/B02E0659-E11A-4746-ADB7-2C2C0A8BD8BB.png and /dev/null differ diff --git a/C5E43F66-AD1D-4D8D-9E4A-D7855C8F5AE2.png b/C5E43F66-AD1D-4D8D-9E4A-D7855C8F5AE2.png deleted file mode 100644 index ebca3e1..0000000 Binary files a/C5E43F66-AD1D-4D8D-9E4A-D7855C8F5AE2.png and /dev/null differ diff --git a/CHANGELOG.md b/CHANGELOG.md index 1404ea4..ca1ba12 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog # +## v0.13 ## +- Added: preliminary scaffolding for web API (playlists, starring, all of it is coming) +- Added: new settings menu. +- Added: you can now *disable* track notifications +- Fixed: track notifications say the right thing in Spotify 1.0 +- Fixed: control panel stays open properly +- Fixed: weird looping volume changes + ## v0.12 ## - Added: compatiblity with Alfred Remote diff --git a/F1B61D14-D686-468D-9373-AB4FC3EEE3C8.png b/F1B61D14-D686-468D-9373-AB4FC3EEE3C8.png deleted file mode 100644 index e35aea4..0000000 Binary files a/F1B61D14-D686-468D-9373-AB4FC3EEE3C8.png and /dev/null differ diff --git a/LICENSE.md b/LICENSE.md index 78eb876..15aa6d4 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -9,6 +9,8 @@ You may do what you want with this program and its source subject to these restr - You MUST respect the licenses for the software below - You MUST NOT misrepresent this software as yours. +Furthermore, I am not responsible or liable for any problems that might occur from you using this software. I provide no warranty or guarantee on this software, and I am not liable for any damages, claims, or liabilities of *any* sort that might arise from this software in any way. + ## Entypo Entypo pictograms by Daniel Bruce — www.entypo.com diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..2efc39d --- /dev/null +++ b/Makefile @@ -0,0 +1,13 @@ +.PHONY = all init clean build + +all: clean build + +init: + composer install + +clean: + -rm -r dist/ + +build: + mkdir dist/ + zip -x '*.git*' '*include/images/psd*' '*.psd' -r dist/Spotifious.alfredworkflow ./ \ No newline at end of file diff --git a/README.md b/README.md index c4c6b59..0d9db74 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,9 @@ Spotifious uses Packal to make sure you always have the latest version. It gives ## Download & Install ## -Latest version: [v0.11.2](https://github.com/citelao/Spotify-for-Alfred/archive/master.zip) | Latest dev build: [v0.11.2](https://github.com/citelao/Spotify-for-Alfred/archive/dev.zip) +Latest version: [v0.13](https://github.com/citelao/Spotify-for-Alfred/archive/master.zip) | Latest dev build: [v0.13](https://github.com/citelao/Spotify-for-Alfred/archive/dev.zip) + +An in-depth [installation guide](http://ben.stolovitz.com/Spotify-for-Alfred/download/) is available on the Spotifious website. 1. [Download](https://github.com/citelao/Spotify-for-Alfred/archive/master.zip) this repository. @@ -43,11 +45,10 @@ Alfred. 5. Click `Save` to store the binding. 6. Bind the other hotkeys as you wish. Their actions are visible in the `Text` field, under `Argument`. 7. Pop up Spotifious with the key command you set— I would have `^⌘⏎`. -8. Follow the instructions on the settings menu. -9. You'll be asked to type in your country. - - Type it in, if you'd like. This option is recommmended. - - Choose `I'd rather not give a country!`. The country is stored locally and only sent to Spotify to narrow results, with no other identifying information, but Spotifious can avoid that if you'd prefer. Choosing this option will noticeably degrade your search results. - - You can always change your settings by typing `s` at the main menu. +8. Follow the instructions on the set-up menu. + 1. You'll be asked to choose your country (for better search results— you can opt out). + 2. You'll create a Spotify application (or not, you can opt out). + 3. You'll link the new app to Spotifious. 10. Continue on with your merry day— but now with Spotifious. ![A visual install guide](include/screenshots/install.png) @@ -90,6 +91,7 @@ A lot of people helped out on this: - **vdesabou** and I trade ideas a ton - **PHPfunk** and his PHP Alfred workflow inspired much of `OhAlfred` - **David Ferguson** helped with some iffy Alfred glitches +- **jwilsson**'s [Spotify PHP web API](http://jwilsson.github.io/spotify-web-api-php/). - a slightly modified version of [Entypo](http://www.entypo.com/) icon font face for icons. - and many other people mentioned in the code. @@ -104,22 +106,10 @@ Oh, and thanks for reading this whole README. I hope you enjoy Spotifious! ## Changelog ## -See `CHANGELOG.md` for more detailed information. - -- v0.12: Compatible with Alfred Remote -- v0.11.2: Location opt-out and tutorial -- v0.11.1: Fixed response freezing -- v0.11: New API, hotkeys, and notifications -- v0.10: Location-based filtering -- v0.9.4: Actually implemented the aforementioned changes -- v0.9.3: More compatibility changes for PHP v5.3 -- v0.9.2: Compatibility changes for PHP v5.3 -- v0.9.1: Fixed "no track" bug. -- v0.9: Added error reporting and context-based searching; restructrued app. -- v0.8: Added new icons; set them as default -- v0.7: General clean-up; added artist- and album-specific menus -- v0.6: Added Alleyoop support -- v0.5: Added a menu system -- v0.1: Inital search system - -This code is MIT Licensed. +This project uses pseudo-SemVer. It will use SemVer when we hit v1.0.0. + +See `CHANGELOG.md`. + +## License ## + +This code is licensed as written in the LICENSE.md file. \ No newline at end of file diff --git a/Spotifious.alfredworkflow b/Spotifious.alfredworkflow deleted file mode 100644 index 61a9ee7..0000000 Binary files a/Spotifious.alfredworkflow and /dev/null differ diff --git a/callback.php b/callback.php new file mode 100644 index 0000000..506bfbb --- /dev/null +++ b/callback.php @@ -0,0 +1,57 @@ +options('spotify_client_id'), $alfred->options('spotify_secret'), 'http://localhost:11114/callback.php'); + +// Request a access token using the code from Spotify +$success = !array_key_exists('error', $_GET); + +if($success) { + $session->requestToken($_GET['code']); + + // Save the tokens + $alfred->options("spotify_access_token", $session->getAccessToken()); + $alfred->options("spotify_refresh_token", $session->getRefreshToken()); + $alfred->options("spotify_access_token_expires", time() + $session->getExpires()); + + $alfred->options('registered_scopes', $alfred->options('desired_scopes')); +} + +?> + + + Spotifious Setup + + + + + + +
+ +
+

Spotifious should be setup :)

+

+ You should be able to start using Spotifious now! +

+ +

(enjoy)

+
+ +
+

Spotifious didn't setup correctly.

+

+ Error: +

+ +

You'll need to try logging in again.

+
+ +
+ \ No newline at end of file diff --git a/composer.json b/composer.json index 5a0d8a4..c7f4e46 100644 --- a/composer.json +++ b/composer.json @@ -2,7 +2,10 @@ "autoload": { "psr-4": { "OhAlfred\\": "src/citelao/OhAlfred/", - "Spotifious\\": "src/citelao/Spotifious/" + "Spotifious\\": "src/citelao/Spotifious/" } + }, + "require": { + "jwilsson/spotify-web-api-php": "0.6.*" } } diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..af3408c --- /dev/null +++ b/composer.lock @@ -0,0 +1,62 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "This file is @generated automatically" + ], + "hash": "45586bdb80f81335b8366a45bdf833f6", + "packages": [ + { + "name": "jwilsson/spotify-web-api-php", + "version": "0.6.0", + "source": { + "type": "git", + "url": "https://github.com/jwilsson/spotify-web-api-php.git", + "reference": "0d9ea746aa942d215301fe463611ef1a3d4b9b93" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jwilsson/spotify-web-api-php/zipball/0d9ea746aa942d215301fe463611ef1a3d4b9b93", + "reference": "0d9ea746aa942d215301fe463611ef1a3d4b9b93", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "4.*", + "satooshi/php-coveralls": "dev-master", + "vlucas/phpdotenv": "1.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "SpotifyWebAPI\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Wilsson", + "email": "jonathan.wilsson@gmail.com" + } + ], + "description": "PHP implementation of Spotify's Web API.", + "homepage": "https://github.com/jwilsson/spotify-web-api-php", + "keywords": [ + "spotify" + ], + "time": "2014-10-26 16:23:57" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "platform": [], + "platform-dev": [] +} diff --git a/dist/Spotifious.alfredworkflow b/dist/Spotifious.alfredworkflow new file mode 100644 index 0000000..01886e5 Binary files /dev/null and b/dist/Spotifious.alfredworkflow differ diff --git a/doc/spec.md b/doc/spec.md index 298e787..3337154 100644 --- a/doc/spec.md +++ b/doc/spec.md @@ -1,8 +1,9 @@ # How Spotifious should work # -There are three specific types of output: +There are four specific types of output: 1. Main Menu — first activation +4. Generic Menu — list of options, used for settings menu. 2. Search Menu — user typing 3. Detail Menu — autocompleted text with Spotify URL @@ -10,6 +11,8 @@ There are three specific types of output: `^⌘⏎` should show the main menu. +It should check for updates every so often and display an update bar occasionally. + 1. ► Crooked Teeth ⏎ `playpause` - ??? 2. Plans ⏎ album detail @@ -19,9 +22,33 @@ There are three specific types of output: 4. Search for music... - Begin typing to search +## Generic Menu ## + +We use this for the settings & setup menus. + +### Setup menu ### + +These are the options required for initial operation. + +- Country Code + - should trigger a list of countries. +- Create a Spotify application + - should trigger the application-creation web server. +- Link Spotify application + - should open the Spotify login page for the new app. + +### Settings Menu ### + +These are all the original setup options, plus some additional ones. + +- Track Notifications + - toggle notifications of next playing tracks + ## Search Menu ## -After activation, any typing at all should show the search menu, unless the query requires a detail menu (see below). The results should be weighted so artists>albums>songs— but only if the query is completely contained by the result. `Lady Danv` should return Lady Danville, then Lady Danville EP, then songs. Otherwise sort by popularity; use a unique id for each query so popular searches follow Alfred's smart order. +After activation, any typing (3+ chars should work) should show the search menu, unless the query requires a detail menu (see below). The results should be weighted so artists>albums>songs— but only if the query is completely contained by the result. `Lady Danv` should return Lady Danville, then Lady Danville EP, then songs. Otherwise sort by popularity; use a unique id for each query so popular searches follow Alfred's smart order. + +If the query starts with a `c`, include control items, like play, pause, shuffle, etc. 1. Lady Danville ⏎ artist detail - ★★★★☆ Artist @@ -32,9 +59,22 @@ After activation, any typing at all should show the search menu, unless the quer ## Detail Menu ## -I want to maintain easily navigable menus, but need to provide the Spotify URL in order to perform an artist or album lookup. To that end, the detail menu uses the syntax `spotify URL ► inital search request ►`. The script should use its smartness to detect a backspace (ie if the final triangle is missing) and provide a search menu with the initial search request. That way, a user can easily back up a level. +I want to maintain easily navigable menus & submenus, but need to provide the Spotify URL in order to perform an artist or album lookup. To that end, the detail menu uses a smart syntax, separated by some unicode glyphs (`►` & `⟩` maybe). + +The query should have all URLs in hierarchical order, than all the queries in hierarchical order, followed by a closing separator: + +`a menu url⟩a submenu url⟩another submenu url►query used in menu⟩query used in submenu⟩query used in final submenu⟩` + +The different separator should be a sign that the query is parsable. If it isn't present, ignore the query. + +This syntax will not be compatible with the old syntax. + +### Playlist Detail ### -**Note**: Transferring from an artist detail menu to an album detail menu should add an additional spotify URL and an extra `►`; ie `artist URL ► album URL ► initial search request ►►`. +1. Liked from Radio ⏎ view in Spotify + - View playlist in Spotify +2. Sticking it to Myself ⏎ `open location <song>` + - Jonathan Coulton - Artificial Heart 2:20 ★★★☆☆ ### Artist Detail ### diff --git a/include/images/commands/playpause.png b/include/images/commands/playpause.png new file mode 100644 index 0000000..e2ffd83 Binary files /dev/null and b/include/images/commands/playpause.png differ diff --git a/include/images/dash.png b/include/images/dash.png new file mode 100644 index 0000000..ced246d Binary files /dev/null and b/include/images/dash.png differ diff --git a/include/images/disabled.png b/include/images/disabled.png new file mode 100644 index 0000000..52cf6d8 Binary files /dev/null and b/include/images/disabled.png differ diff --git a/include/images/psd/controls/playpause.psd b/include/images/psd/controls/playpause.psd new file mode 100644 index 0000000..55cec6e Binary files /dev/null and b/include/images/psd/controls/playpause.psd differ diff --git a/include/images/psd/dash.psd b/include/images/psd/dash.psd new file mode 100644 index 0000000..97cf0ad Binary files /dev/null and b/include/images/psd/dash.psd differ diff --git a/include/images/psd/disabled.psd b/include/images/psd/disabled.psd new file mode 100644 index 0000000..e72116e Binary files /dev/null and b/include/images/psd/disabled.psd differ diff --git a/include/screenshots/settings.png b/include/screenshots/settings.png index 2ad5848..d111122 100644 Binary files a/include/screenshots/settings.png and b/include/screenshots/settings.png differ diff --git a/include/setup/client_submit.php b/include/setup/client_submit.php new file mode 100644 index 0000000..1ada148 --- /dev/null +++ b/include/setup/client_submit.php @@ -0,0 +1,90 @@ +options('spotify_app_opt_out', 'true'); + + ?> + + + Spotifious Setup + + + + + + +
+
+

Setup complete!

+

You've successfully opted out of using a Spotify app.

+

+ You can always opt back in using the settings menu in + Spotifious. Just type s in Spotifious. +

+

You can now reopen Spotifious to continue setup.

+
+
+ + + + requestCredentialsToken($scopes); +} catch(SpotifyWebAPI\SpotifyWebAPIException $e) { + $response["status"] = "error"; + + $response["message"] = "Invalid data - "; + if ($e->getMessage() == "Invalid client") { + $response["message"] .= "invalid ID"; + } elseif($e->getMessage() == "Invalid client secret") { + $response["message"] .= "incorrect secret"; + } else { + $response["message"] .= $e->getMessage(); + } + + echo json_encode($response); + exit(); +} + +// Save data +$alfred->options('spotify_client_id', $_GET["id"]); +$alfred->options('spotify_secret', $_GET["secret"]); +$alfred->options('spotify_access_token', ''); +$alfred->options('spotify_access_token_expires', ''); +$alfred->options('spotify_refresh_token', ''); +$alfred->options('spotify_app_opt_out', 'false'); + +$response["status"] = "success"; +$response["message"] = "Saved your information! Make sure to do step 8 :)"; +echo json_encode($response); +exit(); \ No newline at end of file diff --git a/include/setup/img/client_info.png b/include/setup/img/client_info.png new file mode 100644 index 0000000..47b4b51 Binary files /dev/null and b/include/setup/img/client_info.png differ diff --git a/include/setup/img/create_an_app_button.png b/include/setup/img/create_an_app_button.png new file mode 100644 index 0000000..8805826 Binary files /dev/null and b/include/setup/img/create_an_app_button.png differ diff --git a/include/setup/img/create_an_app_name.png b/include/setup/img/create_an_app_name.png new file mode 100644 index 0000000..c4a9a4f Binary files /dev/null and b/include/setup/img/create_an_app_name.png differ diff --git a/include/setup/img/redirect.png b/include/setup/img/redirect.png new file mode 100644 index 0000000..f93cc2b Binary files /dev/null and b/include/setup/img/redirect.png differ diff --git a/include/setup/img/save.png b/include/setup/img/save.png new file mode 100644 index 0000000..77aeb2f Binary files /dev/null and b/include/setup/img/save.png differ diff --git a/include/setup/index.php b/include/setup/index.php new file mode 100644 index 0000000..16d72f9 --- /dev/null +++ b/include/setup/index.php @@ -0,0 +1,180 @@ + + + Spotifious Setup + + + + + + +
+
+

Spotifious Setup

+

+ Hi! In order to fully use Spotifious (search playlists, star + tracks, etc.), you need to generate a Spotify API key by + creating a Spotify app. +

+

+ NOTE: this server will automatically close in 5 + minutes. If you get errors like "page not found," just reopen + Spotifious. +

+
+ +
+

Instructions

+

+ Setting up the app is not very hard, but it has a couple + specific steps. Just follow these instructions, and you'll be + fine! +

+

+ If you're worried about privacy, + here’s what I have to say. +

+

+ If you already know how to make a Spotify app, you can enter the + ID and secret here. Please set the callback + URL correctly, though (step 8). +

+ +
    +
  1. Open up the Spotify application manager page.
  2. +
  3. Login, if prompted.
  4. +
  5. + Click "Create an app." +
    + A screenshot of the Spotify Developer website, focusesed on the 'Create an app button' +
    The 'Create an app' button
    +
    +
  6. +
  7. + Enter an application name and description. They can be anything you want. +
    + A screenshot of the Spotify Developer application creation page, with example data entered in the 'Application Name' and 'Application Description' fields. +
    This data will do nicely.
    +
    +
  8. +
  9. Click "Create"!
  10. +
  11. + Note the "Client ID" and "Client Secret." You'll enter them + later. +
  12. +
  13. Click the "Add URI" button to add a new Redirect URI.
  14. +
  15. + Type http://localhost:11114/callback.php and click "Add" +
    + A screenshot of the Spotify Developer application data page, with our redirect page ready to be submitted. +
    Just type it in!
    +
    +
  16. +
  17. + Save those changes! +
    + A screenshot of the Spotify Developer application data page showing the save button. +
    The green one, please.
    +
    +
  18. +
  19. Copy and paste your Client ID and Client Secret below: +
    + + + + + + + + + + + + +
    Response here
    + + + privacy notice +
    +
    +
    + A screenshot of the Spotify Developer application data page showing the locations of the client ID and secret. +
    This will not be a blur on your screen.
    +
    +
  20. +
  21. Go back to Spotifious and finish your setup!
  22. +
+
+ +
+

Privacy

+

+ Spotifious merely reads and writes your keys from and to your + hard drive. They are never used in a way that could compromise + their integrity other than in the Spotify query, as required by + the API. Spotifious itself never sends the data + anywhere else, for any reason, at any time. +

+

+ You do not need to set up a Spotify app to use + Spotifious, but you lose a lot of functionality. If you would + prefer not to use this part of Spotify, + click here. +

+
+
+ + + + + \ No newline at end of file diff --git a/include/setup/link.php b/include/setup/link.php new file mode 100644 index 0000000..2046f23 --- /dev/null +++ b/include/setup/link.php @@ -0,0 +1,19 @@ +options('spotify_client_id'), $alfred->options('spotify_secret'), 'http://localhost:11114/callback.php'); + +$scopes = explode(', ', $alfred->options('desired_scopes')); + +$authorizeUrl = $session->getAuthorizeUrl(array( + 'scope' => $scopes +)); + +header('Location: ' . $authorizeUrl); +die(); \ No newline at end of file diff --git a/include/setup/style/normalize.css b/include/setup/style/normalize.css new file mode 100644 index 0000000..81c6f31 --- /dev/null +++ b/include/setup/style/normalize.css @@ -0,0 +1,427 @@ +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ + +/** + * 1. Set default font family to sans-serif. + * 2. Prevent iOS text size adjust after orientation change, without disabling + * user zoom. + */ + +html { + font-family: sans-serif; /* 1 */ + -ms-text-size-adjust: 100%; /* 2 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/** + * Remove default margin. + */ + +body { + margin: 0; +} + +/* HTML5 display definitions + ========================================================================== */ + +/** + * Correct `block` display not defined for any HTML5 element in IE 8/9. + * Correct `block` display not defined for `details` or `summary` in IE 10/11 + * and Firefox. + * Correct `block` display not defined for `main` in IE 11. + */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} + +/** + * 1. Correct `inline-block` display not defined in IE 8/9. + * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. + */ + +audio, +canvas, +progress, +video { + display: inline-block; /* 1 */ + vertical-align: baseline; /* 2 */ +} + +/** + * Prevent modern browsers from displaying `audio` without controls. + * Remove excess height in iOS 5 devices. + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Address `[hidden]` styling not present in IE 8/9/10. + * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22. + */ + +[hidden], +template { + display: none; +} + +/* Links + ========================================================================== */ + +/** + * Remove the gray background color from active links in IE 10. + */ + +a { + background-color: transparent; +} + +/** + * Improve readability when focused and also mouse hovered in all browsers. + */ + +a:active, +a:hover { + outline: 0; +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Address styling not present in IE 8/9/10/11, Safari, and Chrome. + */ + +abbr[title] { + border-bottom: 1px dotted; +} + +/** + * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. + */ + +b, +strong { + font-weight: bold; +} + +/** + * Address styling not present in Safari and Chrome. + */ + +dfn { + font-style: italic; +} + +/** + * Address variable `h1` font-size and margin within `section` and `article` + * contexts in Firefox 4+, Safari, and Chrome. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/** + * Address styling not present in IE 8/9. + */ + +mark { + background: #ff0; + color: #000; +} + +/** + * Address inconsistent and variable font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` affecting `line-height` in all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove border when inside `a` element in IE 8/9/10. + */ + +img { + border: 0; +} + +/** + * Correct overflow not hidden in IE 9/10/11. + */ + +svg:not(:root) { + overflow: hidden; +} + +/* Grouping content + ========================================================================== */ + +/** + * Address margin not present in IE 8/9 and Safari. + */ + +figure { + margin: 1em 40px; +} + +/** + * Address differences between Firefox and other browsers. + */ + +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} + +/** + * Contain overflow in all browsers. + */ + +pre { + overflow: auto; +} + +/** + * Address odd `em`-unit font size rendering in all browsers. + */ + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} + +/* Forms + ========================================================================== */ + +/** + * Known limitation: by default, Chrome and Safari on OS X allow very limited + * styling of `select`, unless a `border` property is set. + */ + +/** + * 1. Correct color not being inherited. + * Known issue: affects color of disabled elements. + * 2. Correct font properties not being inherited. + * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. + */ + +button, +input, +optgroup, +select, +textarea { + color: inherit; /* 1 */ + font: inherit; /* 2 */ + margin: 0; /* 3 */ +} + +/** + * Address `overflow` set to `hidden` in IE 8/9/10/11. + */ + +button { + overflow: visible; +} + +/** + * Address inconsistent `text-transform` inheritance for `button` and `select`. + * All other form control elements do not inherit `text-transform` values. + * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. + * Correct `select` style inheritance in Firefox. + */ + +button, +select { + text-transform: none; +} + +/** + * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` + * and `video` controls. + * 2. Correct inability to style clickable `input` types in iOS. + * 3. Improve usability and consistency of cursor style between image-type + * `input` and others. + */ + +button, +html input[type="button"], /* 1 */ +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; /* 2 */ + cursor: pointer; /* 3 */ +} + +/** + * Re-set default cursor for disabled elements. + */ + +button[disabled], +html input[disabled] { + cursor: default; +} + +/** + * Remove inner padding and border in Firefox 4+. + */ + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +/** + * Address Firefox 4+ setting `line-height` on `input` using `!important` in + * the UA stylesheet. + */ + +input { + line-height: normal; +} + +/** + * It's recommended that you don't attempt to style these elements. + * Firefox's implementation doesn't respect box-sizing, padding, or width. + * + * 1. Address box sizing set to `content-box` in IE 8/9/10. + * 2. Remove excess padding in IE 8/9/10. + */ + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Fix the cursor style for Chrome's increment/decrement buttons. For certain + * `font-size` values of the `input`, it causes the cursor style of the + * decrement button to change from `default` to `text`. + */ + +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Address `appearance` set to `searchfield` in Safari and Chrome. + * 2. Address `box-sizing` set to `border-box` in Safari and Chrome + * (include `-moz` to future-proof). + */ + +input[type="search"] { + -webkit-appearance: textfield; /* 1 */ + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; /* 2 */ + box-sizing: content-box; +} + +/** + * Remove inner padding and search cancel button in Safari and Chrome on OS X. + * Safari (but not Chrome) clips the cancel button when the search input has + * padding (and `textfield` appearance). + */ + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * Define consistent border, margin, and padding. + */ + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +/** + * 1. Correct `color` not being inherited in IE 8/9/10/11. + * 2. Remove padding so people aren't caught out if they zero out fieldsets. + */ + +legend { + border: 0; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Remove default vertical scrollbar in IE 8/9/10/11. + */ + +textarea { + overflow: auto; +} + +/** + * Don't inherit the `font-weight` (applied by a rule above). + * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. + */ + +optgroup { + font-weight: bold; +} + +/* Tables + ========================================================================== */ + +/** + * Remove most spacing between table cells. + */ + +table { + border-collapse: collapse; + border-spacing: 0; +} + +td, +th { + padding: 0; +} \ No newline at end of file diff --git a/include/setup/style/style.css b/include/setup/style/style.css new file mode 100644 index 0000000..d49c8d8 --- /dev/null +++ b/include/setup/style/style.css @@ -0,0 +1,168 @@ +* { + box-sizing: border-box; +} + +*:focus { + -webkit-animation: bounce 0.25s 0s; + -moz-animation: bounce 0.25s 0s; + -o-animation: bounce 0.25s 0s; + animation: bounce 0.25s 0s; +} + +*:target { + background: #93FF74; + -webkit-animation: bounce 0.25s 0s; + -moz-animation: bounce 0.25s 0s; + -o-animation: bounce 0.25s 0s; + animation: bounce 0.25s 0s; +} + +a, +input[type=submit] { + position: relative; + bottom: 0; + -webkit-transition: all 0.1s ease-in; +} + +a:hover, +input[type=submit]:hover { + position: relative; + bottom: .1em; + -webkit-transition: none; +} + +body { + color: #333; + line-height: 1.5; +} + +.clear { + clear: both; +} + +.wrapper { + width: 40em; + margin: 0 auto; +} + +code, kbd { + background: #ddd; + padding: .5em; + + border: .1em solid #999; + border-radius: .5em; +} + +figure { + margin: 1em 0; + padding: 0; +} + +figcaption { + text-align: center; + padding: .5em; + + background: #333; + color: #fff; +} + +img { + max-width: 100%; + border: .5em solid #333; +} + +table { + width: 100%; +} + +td + td { + padding-left: .5em; +} + +label { + color: #999; +} + +input { + padding: .5em; + width: 100%; + border: .1em solid #999; +} + + input[type=submit] { + width: auto; + float: right; + margin: .5em 0; + padding: .5em 2em; + + background: rgb(81, 37, 132); + color: #fff; + border: 0; + border-radius: 1em; + } + + input[disabled] { + color: #999; + } + +.cancel { + float: right; + display: inline-block; + margin: .5rem 2rem; + + color: #627699; + font-size: 0.75em; +} + +.response, .info { + text-align: center; + padding: 1em 0; +} + .response { + display: none; + } + + .error { + background: #E52C48; + color: #fff; + } + + .success { + background: #6CD19B; + } + + .note { + background: #80A0FF; + } + + .warning { + background: #93FF74; + } + +@-webkit-keyframes bounce { + 0% { -webkit-transform: scale(1); transform: scale(1);} + 60% { -webkit-transform: scale(1.4); transform: scale(1.4); } + 90% { -webkit-transform: scale(0.95); transform: scale(0.95); } + 100% { -webkit-transform: scale(1); transform: scale(1); } +} + +@-moz-keyframes bounce { + 0% { -moz-transform: scale(1); transform: scale(1);} + 60% { -moz-transform: scale(1.4); transform: scale(1.4); } + 90% { -moz-transform: scale(0.95); transform: scale(0.95); } + 100% { -moz-transform: scale(1); transform: scale(1); } +} + +@-o-keyframes bounce { + 0% { -o-transform: scale(1); transform: scale(1);} + 60% { -o-transform: scale(1.4); transform: scale(1.4); } + 90% { -o-transform: scale(0.95); transform: scale(0.95); } + 100% { -o-transform: scale(1); transform: scale(1); } +} + +@keyframes bounce { + 0% { transform: scale(1); } + 60% { transform: scale(1.4); } + 90% { transform: scale(0.95); } + 100% { transform: scale(1); } +} \ No newline at end of file diff --git a/info.plist b/info.plist index f514632..178b824 100644 --- a/info.plist +++ b/info.plist @@ -161,6 +161,17 @@ + F4A2A879-4C5A-4532-BF35-02BAAD863581 + + + destinationuid + 18496AC4-EA42-444C-A906-642E38259C96 + modifiers + 0 + modifiersubtext + + + createdby Ben Stolovitz @@ -182,17 +193,17 @@ keyword spotifious queuedelaycustom - 1 + 3 queuedelayimmediatelyinitially - + queuedelaymode - 0 - queuemode 1 + queuemode + 2 runningsubtext Getting Spotifious data... script - php -f main.php -- "{query}" + php -d display_errors='stderr' -f main.php -- "{query}" # In case you are experiencing unsolveable issues, # you can generate a log file to help me. Modify the @@ -273,6 +284,8 @@ config + concurrently + escaping 4 script @@ -292,6 +305,19 @@ version 0 + + config + + triggerid + search + + type + alfred.workflow.trigger.external + uid + F4A2A879-4C5A-4532-BF35-02BAAD863581 + version + 0 + config @@ -321,7 +347,7 @@ argument 3 argumenttext - playpause⟩output + playpause⟩ hotkey 49 hotmod @@ -371,7 +397,7 @@ argument 3 argumenttext - next⟩output + next⟩ hotkey 124 hotmod @@ -421,7 +447,7 @@ argument 3 argumenttext - previous⟩output + previous⟩ hotkey 123 hotmod @@ -545,7 +571,7 @@ readme # Spotifious -# v0.11.2 +# v0.13 I’ve worked a long time on it to make it as good as it can be, and if you have any ideas to make it better or if you need to complain, leave me a note on my GitHub page or on the forum threads, linked below. @@ -560,7 +586,7 @@ Thank you everyone! Y’all made Spotifious as awesome as it is. Also thank you for using Spotifious and reading the README; I hope you enjoy it. -This code is MIT Licensed. +This code’s license can be found in LICENSE.md uidata 18496AC4-EA42-444C-A906-642E38259C96 @@ -571,17 +597,17 @@ This code is MIT Licensed. 30E2AA18-937F-4B5D-B685-7852B9717F34 ypos - 830 + 990 4BB22960-369A-4674-AF29-00CCE1603B53 ypos - 490 + 620 5610E60C-68BF-4445-BAE3-CB55DEA70D99 ypos - 600 + 730 6B1397DB-E737-4607-8181-27D9DFE70E2C @@ -591,17 +617,17 @@ This code is MIT Licensed. 73FAFE96-4B16-4AB5-B181-229B4BB79E25 ypos - 1310 + 1470 7858554D-2173-462A-B03D-1078EC7059D6 ypos - 360 + 490 8020A500-17C9-43BA-B17A-00D35E460EB6 ypos - 250 + 380 86EAA0E6-6086-4BC4-8CE7-0673F392C77F @@ -616,17 +642,17 @@ This code is MIT Licensed. B02E0659-E11A-4746-ADB7-2C2C0A8BD8BB ypos - 960 + 1120 BFFC58C1-626F-4091-A0A4-61034DDD10D0 ypos - 1070 + 1230 C5E43F66-AD1D-4D8D-9E4A-D7855C8F5AE2 ypos - 720 + 880 C8A768AF-C5D9-47A1-B499-8B0D3C844A99 @@ -636,7 +662,12 @@ This code is MIT Licensed. F1B61D14-D686-468D-9373-AB4FC3EEE3C8 ypos - 1200 + 1360 + + F4A2A879-4C5A-4532-BF35-02BAAD863581 + + ypos + 230 webaddress diff --git a/main.php b/main.php index 033fd5a..cd732d4 100644 --- a/main.php +++ b/main.php @@ -8,7 +8,7 @@ require 'vendor/autoload.php'; /** - * Spotifious (v0.10) + * Spotifious * a natural Spotify controller for Alfred * an Alfred extension by Ben Stolovitz **/ diff --git a/spotifious.sublime-project b/spotifious.sublime-project new file mode 100644 index 0000000..7cc9479 --- /dev/null +++ b/spotifious.sublime-project @@ -0,0 +1,8 @@ +{ + "folders": + [ + { + "path": "/Users/citelao/Dropbox/Alfred/Alfred.alfredpreferences/workflows/spotifious" + } + ] +} diff --git a/src/citelao/OhAlfred/Command/Command.php b/src/citelao/OhAlfred/Command/Command.php new file mode 100644 index 0000000..e8011ee --- /dev/null +++ b/src/citelao/OhAlfred/Command/Command.php @@ -0,0 +1,14 @@ +script = $command; + } + + public function run() { + return exec($this->script); + } +} \ No newline at end of file diff --git a/src/citelao/OhAlfred/Command/Timeout.php b/src/citelao/OhAlfred/Command/Timeout.php new file mode 100644 index 0000000..6967f67 --- /dev/null +++ b/src/citelao/OhAlfred/Command/Timeout.php @@ -0,0 +1,25 @@ + /dev/null 2>/dev/null &"; + + echo($script); + + $this->script = $script; + } + + public function run() { + return exec($this->script); + } +} \ No newline at end of file diff --git a/src/citelao/OhAlfred/OhAlfred.php b/src/citelao/OhAlfred/OhAlfred.php index d509c13..118c210 100644 --- a/src/citelao/OhAlfred/OhAlfred.php +++ b/src/citelao/OhAlfred/OhAlfred.php @@ -11,6 +11,8 @@ class OhAlfred { protected $cache; protected $storage; + protected $plists = array(); + // Set the exception handlers public function __construct() { set_exception_handler(array($this, 'exceptionify')); @@ -23,7 +25,7 @@ public function name() if($this->name == null) $this->name = $this->defaults('bundleid'); - return $this->name; + return $this->name; } // Get the user's home directory. @@ -39,7 +41,7 @@ public function home() public function workflow() { if($this->workflow == null) - $this->workflow = dirname(dirname(dirname(__DIR__))); // Because I keep OhAlfred in the src/citelao/OhAlfred directory. + $this->workflow = dirname(dirname(dirname(__DIR__))) . '/'; // Because I keep OhAlfred in the src/citelao/OhAlfred directory. // TODO make portable return $this->workflow; @@ -74,22 +76,40 @@ public function storage() { **/ // Read an arbitrary plist setting. - public function plist($plist, $setting, $value = '') { - if ($value == '') { - return exec("defaults read '$plist' '$setting'"); + public function plist($plist, $setting, $value = -1) { + if ($value === -1) { + if(!array_key_exists($plist, $this->plists)) { + $json = exec("plutil -convert json -o - '{$plist}.plist'"); + $decoded = json_decode($json); + + if(json_last_error() !== JSON_ERROR_NONE) { + return false; + } + + $this->plists[$plist] = $decoded; + } + + if(!property_exists($this->plists[$plist], $setting)) { + return false; + } + + return $this->plists[$plist]->{$setting}; } + // Uncache plist on write + unset($this->plists[$plist]); + return exec("defaults write '$plist' '$setting' '$value'"); } // Read the workflow .plist file. - public function defaults($setting, $value = '') { - return $this->plist($this->workflow() . "/info", $setting, $value); + public function defaults($setting, $value = -1) { + return $this->plist($this->workflow() . "info", $setting, $value); } // Read a custom workflow options .plist file. - public function options($setting, $value = '') { - $options = $this->storage() . "/settings"; + public function options($setting, $value = -1) { + $options = $this->storage() . "settings"; $optionsFile = $options . ".plist"; if(!file_exists($optionsFile)) @@ -193,7 +213,7 @@ public function errorify($number, $message, $file, $line, $context) { ); $this->alfredify($results); - return true; + die(); } // Write a log file of an error. @@ -222,6 +242,10 @@ protected function loggifyError($number, $message, $file, $line, $context) { } public function notify($message, $title = '', $subtitle = '', $appIcon = '', $contentImage = '', $open = '') { + if($this->options('track_notifications') != 'true') { + return; + } + $command = "include/terminal-notifier.app/Contents/MacOS/terminal-notifier "; $command .= "-message " . $this->escapeNotify($message) . " "; diff --git a/src/citelao/Spotifious/Menus/Control.php b/src/citelao/Spotifious/Menus/Control.php index 7d1e91f..baff540 100644 --- a/src/citelao/Spotifious/Menus/Control.php +++ b/src/citelao/Spotifious/Menus/Control.php @@ -6,6 +6,7 @@ class Control implements Menu { + protected $query; protected $search; protected $commands = array( @@ -13,18 +14,26 @@ class Control implements Menu { 'name' => 'Next track', 'keys' => 'skip', 'icon' => 'include/images/commands/next.png', - 'action' => 'next⟩output' + 'action' => 'next⟩returnControls' ), array( 'name' => 'Previous track', 'keys' => 'back', 'icon' => 'include/images/commands/previous.png', - 'action' => 'previous⟩output' + 'action' => 'previous⟩returnControls' + ), + + array( + 'name' => 'Play/pause', + 'keys' => 'playpause', + 'icon' => 'include/images/commands/playpause.png', + 'action' => 'playpause⟩returnControls' ) ); public function __construct($query) { + $this->query = $query; $this->search = mb_substr($query, 1); } @@ -46,6 +55,8 @@ public function output() { 'title' => 'Controls', 'subtitle' => 'Access this menu at any time by typing `c`', 'icon' => 'include/images/info.png', + 'valid' => 'no', + 'autocomplete' => $this->query ); return $results; diff --git a/src/citelao/Spotifious/Menus/Settings.php b/src/citelao/Spotifious/Menus/Settings.php new file mode 100644 index 0000000..019e0e1 --- /dev/null +++ b/src/citelao/Spotifious/Menus/Settings.php @@ -0,0 +1,74 @@ +alfred = new OhAlfred(); + + $this->trackNotificationsEnabled = ($this->alfred->options('track_notifications') == 'true'); + $this->countryCode = $this->alfred->options('country'); + $this->optedOut = ($this->alfred->options('spotify_app_opt_out') == 'true'); + } + + public function output() { + $results[] = array( + 'title' => 'Settings', + 'subtitle' => 'Here you can configure any options you want.', + 'icon' => 'include/images/configuration.png', + 'valid' => 'no' + ); + + $results[] = array( + 'title' => 'Track Notifications', + 'subtitle' => "Check this if you'd like to enable track change notifications.", + 'icon' => $this->trackNotificationsEnabled ? 'include/images/checked.png' : 'include/images/unchecked.png', + 'arg' => 'togglenotifications⟩' + ); + + $results[] = array( + 'title' => 'Configure country code', + 'subtitle' => 'Currently set to "' . $this->countryCode . '."', + 'autocomplete' => 'Country Code ⟩', + 'valid' => 'no', + 'icon' => 'include/images/dash.png' + ); + + $results[] = array( + 'title' => ($this->optedOut) ? + 'Link a Spotify app' : + 'Change my linked Spotify application', + 'subtitle' => ($this->optedOut) ? + "Opt-in to using a Spotify app. The dark side's not so bad!" : + 'If you want to link a new Spotify app or update key information. You will need to login again.', + 'arg' => 'appsetup⟩', + 'icon' => 'include/images/dash.png' + ); + + if(!$this->optedOut) { + $results[] = array( + 'title' => 'Login again to my Spotify application', + 'subtitle' => 'If you want to login again, do it!', + 'arg' => 'applink⟩', + 'icon' => 'include/images/dash.png' + ); + } + + $results[] = array( + 'title' => 'You can access settings easily.', + 'subtitle' => 'Type `s` from the main menu.', + 'icon' => 'include/images/info.png', + 'valid' => 'no' + ); + + return $results; + } +} \ No newline at end of file diff --git a/src/citelao/Spotifious/Menus/Setup.php b/src/citelao/Spotifious/Menus/Setup.php index 6449cf8..2df4c57 100644 --- a/src/citelao/Spotifious/Menus/Setup.php +++ b/src/citelao/Spotifious/Menus/Setup.php @@ -7,33 +7,31 @@ class Setup implements Menu { protected $alfred; - protected $userTriggered; protected $countryCodeConfigured; + protected $applicationCreated; + protected $applicationLinked; + protected $applicationPreviouslyLinked; public function __construct($query) { $this->alfred = new OhAlfred(); - $this->userTriggered = ($query == "s" || $query == "S"); - $this->countryCodeConfigured = !($this->alfred->options('country') == ''); + $this->applicationCreated = !($this->alfred->options('spotify_client_id') == '' || $this->alfred->options('spotify_secret') == ''); + $this->applicationLinked = !($this->alfred->options('spotify_access_token') == '' || + $this->alfred->options('spotify_refresh_token') == '' || + $this->alfred->options('spotify_access_token_expires') == '' || + $this->alfred->options('desired_scopes') != $this->alfred->options('registered_scopes')); + + $this->applicationPreviouslyLinked = !($this->alfred->options('spotify_access_token') == ''); } public function output() { - if($this->userTriggered) { - $results[] = array( - 'title' => 'Settings', - 'subtitle' => 'Here you can configure any options you want.', - 'icon' => 'include/images/configuration.png', - 'valid' => 'no' - ); - } else { - $results[] = array( - 'title' => 'Welcome to Spotifious!', - 'subtitle' => 'You need to configure a few more things before you can use Spotifious.', - 'icon' => 'include/images/configuration.png', - 'valid' => 'no' - ); - } + $results[] = array( + 'title' => 'Welcome to Spotifious!', + 'subtitle' => 'You need to configure a few more things before you can use Spotifious.', + 'icon' => 'include/images/configuration.png', + 'valid' => 'no' + ); $results[] = array( 'title' => '1. Set your country code', @@ -43,6 +41,32 @@ public function output() { 'valid' => 'no' ); + $results[] = array( + 'title' => '2. Create a Spotify application', + 'subtitle' => 'Set up a Spotify application so you can search playlists!', + 'icon' => $this->applicationCreated ? 'include/images/checked.png' : 'include/images/unchecked.png', + 'arg' => 'appsetup⟩' + ); + + if($this->applicationPreviouslyLinked) { + $results[] = array( + 'title' => '3. Relink your Spotify application', + 'subtitle' => "We've added new features to Spotifious, but you need to login to your Spotify app again.", + 'icon' => $this->applicationCreated ? $this->applicationLinked ? 'include/images/checked.png' : 'include/images/unchecked.png' : 'include/images/disabled.png', + 'arg' => 'applink⟩', + 'valid' => $this->applicationCreated ? 'yes' : 'no' + ); + + } else { + $results[] = array( + 'title' => '3. Link your Spotify application', + 'subtitle' => 'Connect your Spotify application to Spotifious to search your playlists.', + 'icon' => $this->applicationCreated ? $this->applicationLinked ? 'include/images/checked.png' : 'include/images/unchecked.png' : 'include/images/disabled.png', + 'arg' => 'applink⟩', + 'valid' => $this->applicationCreated ? 'yes' : 'no' + ); + } + $results[] = array( 'title' => 'You can access settings easily.', 'subtitle' => 'Type `s` from the main menu.', diff --git a/src/citelao/Spotifious/Menus/SetupCountryCode.php b/src/citelao/Spotifious/Menus/SetupCountryCode.php index 55c4964..dd2243e 100644 --- a/src/citelao/Spotifious/Menus/SetupCountryCode.php +++ b/src/citelao/Spotifious/Menus/SetupCountryCode.php @@ -44,7 +44,8 @@ public function output() { 'title' => $country['name'], 'subtitle' => "Set your country to “{$country['code']}.”", 'arg' => 'country⟩' . $country['code'], - 'autocomplete' => 'Country Code ⟩' . $country['name'] + 'autocomplete' => 'Country Code ⟩' . $country['name'], + 'icon' => 'include/images/dash.png' ); $results[] = $currentResult; diff --git a/src/citelao/Spotifious/Spotifious.php b/src/citelao/Spotifious/Spotifious.php index 7008bbd..18be105 100644 --- a/src/citelao/Spotifious/Spotifious.php +++ b/src/citelao/Spotifious/Spotifious.php @@ -1,14 +1,21 @@ alfred->options('track_notifications') == '') { + $this->alfred->options('track_notifications', 'true'); + } + + if($this->alfred->options('desired_scopes') != '') { + $this->alfred->options('desired_scopes', ''); + } + // Display the setup menu if the app isn't setup. + // Or the "options" menu if the S key is pressed if($this->alfred->options('country') == '' || - $query == "s" || $query == "S" || + $this->alfred->options('spotify_client_id') == '' || + $this->alfred->options('spotify_secret') == '' || + !$this->optedOut() && ( + $this->alfred->options('spotify_access_token') == '' || + $this->alfred->options('spotify_access_token_expires') == '' || + $this->alfred->options('spotify_refresh_token') == '' || + $this->alfred->options('desired_scopes') != $this->alfred->options('registered_scopes') + ) || $this->contains($query, "Country Code ⟩")) { // If we are trying to configure country code @@ -36,10 +60,23 @@ public function run($query) { return $menu->output(); } + // Don't bother connecting if we've opted out :). + $api = null; + if(!$this->optedOut()) { + $api = $this->getSpotifyApi(); + } + // TODO + // if expired + // attempt refresh + // if failed, prompt for relogin + if (mb_strlen($query) <= 3) { if(mb_strlen($query) > 0 && ($query[0] == "c" || $query[0] == "C")) { $menu = new Control($query); return $menu->output(); + } elseif(mb_strlen($query) > 0 && ($query[0] == "s" || $query[0] == "S")) { + $menu = new Settings($query); + return $menu->output(); } else { $menu = new Main($query); return $menu->output(); @@ -102,33 +139,58 @@ public function run($query) { } public function process($action) { + // TODO refresh token + // this is identical code to run() + // if expired + // attempt refresh + // if failed, prompt for relogin + + if($this->contains($action, '⟩')) { $splitAction = explode('⟩', $action); $command = array_shift($splitAction); if($command == 'country') { $this->alfred->options('country', $splitAction[0]); - } else if($command == 'next') { - $song = $this->respondingSpotifyQuery('next track'); - if($splitAction[0] && $splitAction[0] == 'output') { + $as = new ApplicationApplescript("Alfred 2", 'run trigger "search" in workflow "com.citelao.spotifious"'); + $as->run(); - $this->alfred->notify( - $song['album'] . " — " . $song['artist'], - $song['title'], - // $song['url'], - "", - "", - "", - $song['url']); + } else if($command == 'appsetup') { + // Autokill server in 10 minutes + $server = new Timeout(10 * 60, "php -S localhost:11114 & open 'http://localhost:11114/include/setup/index.php'"); + $server->run(); + + } else if($command == 'applink') { + // Autokill server in 10 minutes + $server = new Timeout(10 * 60, "php -S localhost:11114 & open 'http://localhost:11114/include/setup/link.php'"); + $server->run(); + + } else if($command == 'togglenotifications') { + $current = $this->alfred->options('track_notifications'); + + if($current == 'true') { + $this->alfred->options('track_notifications', 'false'); + } else { + $this->alfred->options('track_notifications', 'true'); } + } else if($command == 'next') { + $song = $this->respondingSpotifyQuery('next track'); + + $this->alfred->notify( + $song['album'] . " — " . $song['artist'], + $song['title'], + // $song['url'], + "", + "", + "", + $song['url']); + } else if($command == 'previous') { $song = $this->respondingSpotifyQuery('previous track'); - if($splitAction[0] && $splitAction[0] == 'output') { - - $this->alfred->notify( + $this->alfred->notify( $song['album'] . " — " . $song['artist'], $song['title'], // $song['url'], @@ -136,36 +198,42 @@ public function process($action) { "", "", $song['url']); - } } else if($command == 'playpause') { $song = $this->respondingSpotifyQuery('playpause'); - if($splitAction[0] && $splitAction[0] == 'output') { - $icon = ($song['state'] == "playing") ? "▶" : "‖"; - - $this->alfred->notify( - $song['album'] . " — " . $song['artist'], - $icon . " " . $song['title'], - // $song['url'], - "", - "", - "", - $song['url']); - } + $icon = ($song['state'] == "playing") ? "▶" : "‖"; + $this->alfred->notify( + $song['album'] . " — " . $song['artist'], + $icon . " " . $song['title'], + // $song['url'], + "", + "", + "", + $song['url']); } else if($command == 'volup') { - $as = new ApplicationApplescript("Spotify", "set sound volume to sound volume + 10"); + $as = new ApplicationApplescript("Spotify", "if sound volume < 90 then \n set sound volume to sound volume + 10 \n else \n set sound volume to 100 \n end if"); $as->run(); } else if($command == 'voldown') { - $as = new ApplicationApplescript("Spotify", "set sound volume to sound volume - 10"); + $as = new ApplicationApplescript("Spotify", "if sound volume > 10 then \n set sound volume to sound volume - 10 \n else \n set sound volume to 0 \n end if"); $as->run(); } else if($command == 'spotify') { $as = new ApplicationApplescript("Spotify", $splitAction[0]); $as->run(); } + + + if($splitAction[0] && $splitAction[0] == 'return') { + $as = new ApplicationApplescript("Alfred 2", 'run trigger "search" in workflow "com.citelao.spotifious"'); + $as->run(); + } elseif($splitAction[0] && $splitAction[0] == 'returnControls') { + $as = new ApplicationApplescript("Alfred 2", 'run trigger "search" in workflow "com.citelao.spotifious" with argument "c"'); + $as->run(); + + } } else { return "Could not process command!"; } @@ -187,7 +255,7 @@ protected function is_spotify_uri($item) { } protected function respondingSpotifyQuery($query) { - $as = new ApplicationApplescript("Spotify", $query . " \n return name of current track & \"✂\" & album of current track & \"✂\" & artist of current track & \"✂\" & spotify url of current track & \"✂\" & player state"); + $as = new ApplicationApplescript("Spotify", $query . " \n delay 0.1 \n return name of current track & \"✂\" & album of current track & \"✂\" & artist of current track & \"✂\" & spotify url of current track & \"✂\" & player state"); $result = $as->run(); $array = explode("✂", $result); @@ -209,4 +277,30 @@ protected function respondingSpotifyQuery($query) { return $data; } + + protected function getSpotifyApi() { + if($this->optedOut()) { + throw new StatefulException("Trying to get API for opted out user. My bad."); + } + + $api = new SpotifyWebAPI(); + + // If the access token has expired :( + if ($this->alfred->options('spotify_access_token_expires') < time()) { + $session = new Session($this->alfred->options('spotify_client_id'), $this->alfred->options('spotify_secret'), 'http://localhost:11114/callback.php'); + $session->setRefreshToken($this->alfred->options('spotify_refresh_token')); + $session->refreshToken(); + + $this->alfred->options('spotify_access_token_expires', time() + $session->getExpires()); + $this->alfred->options('spotify_access_token', $session->getAccessToken()); + } + + $api->setAccessToken($this->alfred->options('spotify_access_token')); + + return $api; + } + + protected function optedOut() { + return $this->alfred->options('spotify_app_opt_out') == 'true'; + } } \ No newline at end of file diff --git a/vendor/autoload.php b/vendor/autoload.php index 6c35dd2..fd9d093 100644 --- a/vendor/autoload.php +++ b/vendor/autoload.php @@ -4,4 +4,4 @@ require_once __DIR__ . '/composer' . '/autoload_real.php'; -return ComposerAutoloaderInitd31d8dd13b7849ffc0c1be9abe3d270d::getLoader(); +return ComposerAutoloaderInitd7270918ba4f2fa5e6e70be71bc482ee::getLoader(); diff --git a/vendor/composer/ClassLoader.php b/vendor/composer/ClassLoader.php index f438e31..70d78bc 100644 --- a/vendor/composer/ClassLoader.php +++ b/vendor/composer/ClassLoader.php @@ -56,7 +56,11 @@ class ClassLoader public function getPrefixes() { - return call_user_func_array('array_merge', $this->prefixesPsr0); + if (!empty($this->prefixesPsr0)) { + return call_user_func_array('array_merge', $this->prefixesPsr0); + } + + return array(); } public function getPrefixesPsr4() @@ -143,6 +147,8 @@ public function add($prefix, $paths, $prepend = false) * @param string $prefix The prefix/namespace, with trailing '\\' * @param array|string $paths The PSR-0 base directories * @param bool $prepend Whether to prepend the directories + * + * @throws \InvalidArgumentException */ public function addPsr4($prefix, $paths, $prepend = false) { @@ -202,10 +208,13 @@ public function set($prefix, $paths) * Registers a set of PSR-4 directories for a given namespace, * replacing any others previously set for this namespace. * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param array|string $paths The PSR-4 base directories + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-4 base directories + * + * @throws \InvalidArgumentException */ - public function setPsr4($prefix, $paths) { + public function setPsr4($prefix, $paths) + { if (!$prefix) { $this->fallbackDirsPsr4 = (array) $paths; } else { @@ -266,7 +275,7 @@ public function unregister() public function loadClass($class) { if ($file = $this->findFile($class)) { - include $file; + includeFile($file); return true; } @@ -291,8 +300,25 @@ public function findFile($class) return $this->classMap[$class]; } + $file = $this->findFileWithExtension($class, '.php'); + + // Search for Hack files if we are running on HHVM + if ($file === null && defined('HHVM_VERSION')) { + $file = $this->findFileWithExtension($class, '.hh'); + } + + if ($file === null) { + // Remember that this class does not exist. + return $this->classMap[$class] = false; + } + + return $file; + } + + private function findFileWithExtension($class, $ext) + { // PSR-4 lookup - $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . '.php'; + $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; $first = $class[0]; if (isset($this->prefixLengthsPsr4[$first])) { @@ -321,7 +347,7 @@ public function findFile($class) . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); } else { // PEAR-like class name - $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . '.php'; + $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; } if (isset($this->prefixesPsr0[$first])) { @@ -347,8 +373,15 @@ public function findFile($class) if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { return $file; } - - // Remember that this class does not exist. - return $this->classMap[$class] = false; } } + +/** + * Scope isolated include. + * + * Prevents access to $this/self from included files. + */ +function includeFile($file) +{ + include $file; +} diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php index 3f11dd4..368046a 100644 --- a/vendor/composer/autoload_psr4.php +++ b/vendor/composer/autoload_psr4.php @@ -6,6 +6,7 @@ $baseDir = dirname($vendorDir); return array( + 'SpotifyWebAPI\\' => array($vendorDir . '/jwilsson/spotify-web-api-php/src'), 'Spotifious\\' => array($baseDir . '/src/citelao/Spotifious'), 'OhAlfred\\' => array($baseDir . '/src/citelao/OhAlfred'), ); diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php index a9fbc91..3197df9 100644 --- a/vendor/composer/autoload_real.php +++ b/vendor/composer/autoload_real.php @@ -2,7 +2,7 @@ // autoload_real.php @generated by Composer -class ComposerAutoloaderInitd31d8dd13b7849ffc0c1be9abe3d270d +class ComposerAutoloaderInitd7270918ba4f2fa5e6e70be71bc482ee { private static $loader; @@ -19,12 +19,9 @@ public static function getLoader() return self::$loader; } - spl_autoload_register(array('ComposerAutoloaderInitd31d8dd13b7849ffc0c1be9abe3d270d', 'loadClassLoader'), true, true); + spl_autoload_register(array('ComposerAutoloaderInitd7270918ba4f2fa5e6e70be71bc482ee', 'loadClassLoader'), true, true); self::$loader = $loader = new \Composer\Autoload\ClassLoader(); - spl_autoload_unregister(array('ComposerAutoloaderInitd31d8dd13b7849ffc0c1be9abe3d270d', 'loadClassLoader')); - - $vendorDir = dirname(__DIR__); - $baseDir = dirname($vendorDir); + spl_autoload_unregister(array('ComposerAutoloaderInitd7270918ba4f2fa5e6e70be71bc482ee', 'loadClassLoader')); $map = require __DIR__ . '/autoload_namespaces.php'; foreach ($map as $namespace => $path) { @@ -46,3 +43,8 @@ public static function getLoader() return $loader; } } + +function composerRequired7270918ba4f2fa5e6e70be71bc482ee($file) +{ + require $file; +} diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json new file mode 100644 index 0000000..3979ec4 --- /dev/null +++ b/vendor/composer/installed.json @@ -0,0 +1,49 @@ +[ + { + "name": "jwilsson/spotify-web-api-php", + "version": "0.6.0", + "version_normalized": "0.6.0.0", + "source": { + "type": "git", + "url": "https://github.com/jwilsson/spotify-web-api-php.git", + "reference": "0d9ea746aa942d215301fe463611ef1a3d4b9b93" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jwilsson/spotify-web-api-php/zipball/0d9ea746aa942d215301fe463611ef1a3d4b9b93", + "reference": "0d9ea746aa942d215301fe463611ef1a3d4b9b93", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "4.*", + "satooshi/php-coveralls": "dev-master", + "vlucas/phpdotenv": "1.*" + }, + "time": "2014-10-26 16:23:57", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "SpotifyWebAPI\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Wilsson", + "email": "jonathan.wilsson@gmail.com" + } + ], + "description": "PHP implementation of Spotify's Web API.", + "homepage": "https://github.com/jwilsson/spotify-web-api-php", + "keywords": [ + "spotify" + ] + } +] diff --git a/vendor/jwilsson/spotify-web-api-php/.editorconfig b/vendor/jwilsson/spotify-web-api-php/.editorconfig new file mode 100644 index 0000000..7eeada8 --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/.editorconfig @@ -0,0 +1,19 @@ +# This file is for unifying the coding style for different editors and IDEs +# More info at http://editorconfig.org + +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_style = space +indent_size = 4 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.yml] +indent_style = space +indent_size = 2 diff --git a/vendor/jwilsson/spotify-web-api-php/.env.dist b/vendor/jwilsson/spotify-web-api-php/.env.dist new file mode 100644 index 0000000..82b2478 --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/.env.dist @@ -0,0 +1,4 @@ +SPOTIFY_CLIENT_ID= +SPOTIFY_CLIENT_SECRET= +SPOTIFY_REDIRECT_URI= +SPOTIFY_REFRESH_TOKEN= diff --git a/vendor/jwilsson/spotify-web-api-php/.env.enc b/vendor/jwilsson/spotify-web-api-php/.env.enc new file mode 100644 index 0000000..65d7cd3 Binary files /dev/null and b/vendor/jwilsson/spotify-web-api-php/.env.enc differ diff --git a/vendor/jwilsson/spotify-web-api-php/.gitattributes b/vendor/jwilsson/spotify-web-api-php/.gitattributes new file mode 100644 index 0000000..176a458 --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/.gitattributes @@ -0,0 +1 @@ +* text=auto diff --git a/vendor/jwilsson/spotify-web-api-php/.gitignore b/vendor/jwilsson/spotify-web-api-php/.gitignore new file mode 100644 index 0000000..13c60bb --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/.gitignore @@ -0,0 +1,5 @@ +/vendor +.DS_Store +composer.lock +Thumbs.db +.env diff --git a/vendor/jwilsson/spotify-web-api-php/.travis.yml b/vendor/jwilsson/spotify-web-api-php/.travis.yml new file mode 100644 index 0000000..78b3243 --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/.travis.yml @@ -0,0 +1,25 @@ +language: php + +php: + - 5.3 + - 5.4 + - 5.5 + - 5.6 + - hhvm + +matrix: + fast_finish: true + +before_install: + - openssl aes-256-cbc -K $encrypted_02ebdc0031ce_key -iv $encrypted_02ebdc0031ce_iv -in .env.enc -out .env -d + +before_script: + - travis_retry composer self-update + - travis_retry composer install --prefer-dist --no-interaction + +script: + - mkdir -p build/logs + - vendor/bin/phpunit --verbose --coverage-clover build/logs/clover.xml + +after_script: + - php vendor/bin/coveralls -v diff --git a/vendor/jwilsson/spotify-web-api-php/CHANGELOG.md b/vendor/jwilsson/spotify-web-api-php/CHANGELOG.md new file mode 100644 index 0000000..28d29af --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/CHANGELOG.md @@ -0,0 +1,55 @@ +# Changelog +## 0.6.0 +* **This release contains breaking changes, read through this list before updating.** +* All static methods on `Request` have been removed. `Request` now needs to be instantiated before using. +* All methods that accepted the `limit` option now uses the correct Spotify default value if nothing has been specified. +* It's now possible to specify your own `Request` object in `SpotifyWebAPI` and `Session` constructors. +* `SpotifyWebAPI::getArtistAlbums()` now supports the `album_type` option. +* `Request::send()` will only modify URLs when needed. + +## 0.5.0 +* The following methods has been added + * `Session::getExpires()` + * `Session::getRefreshToken()` + * `Session::setRefreshToken()` + * `SpotifyWebAPI::getFeaturedPlaylists()` + * `SpotifyWebAPI::getNewReleases()` +* The following options has been added + * `offset` and `limit` to `SpotifyWebAPI::getUserPlaylists()` + * `offset` and `limit` to `SpotifyWebAPI::getUserPlaylistTracks()` + * `fields` to `SpotifyWebAPI::getUserPlaylistTracks()` + * `market` to `SpotifyWebAPI::getArtistAlbums()` + * `market` to `SpotifyWebAPI::search()` +* Better handling of HTTP response codes in `Request::send()`. +* Fixed a bug where `SpotifyWebAPIException` messages weren't correctly set. +* Fixed various issues related to user playlists. + +## 0.4.0 +* **This release contains lots of breaking changes, read through this list before updating.** +* All methods which previously required a Spotify URI now just needs an ID. +* `deletePlaylistTrack()` has been renamed to `deletePlaylistTracks()`. +* When something goes wrong, a `SpotifyWebAPIException` is thrown. +* The `SpotifyWebAPI` methods are no longer static, you'll need to instantiate the class now. + +## 0.3.0 +* Added new methods to + * Get Current User’s Saved Tracks. + * Check Current User’s Saved Tracks. + * Save Tracks for Current User. + * Remove Tracks for Current User. + * Change a Playlist’s Details. + * Remove Tracks from a Playlist. + * Replace a Playlist’s Tracks. +* Added support for the Client Credentials Authorization Flow. +* Added support for more HTTP methods in `Request::send()`. + +## 0.2.0 +* Added Artist’s Related Artists endpoint. +* Added `offset` and `limit` options for `SpotifyWebAPI::getAlbumTracks()` and `SpotifyWebAPI::getArtistAlbums()`. +* Replaced PSR-0 autoloading with PSR-4 autoloading. +* Changed method signature of `Session::getAuthorizeUrl()` and added `show_dialog` option. +* Added missing returns for `SpotifyWebAPI::getUserPlaylist()` and `SpotifyWebAPI::getUserPlaylistTracks()`. +* Fixed a bug where search terms were double encoded. + +## 0.1.0 +* Initial release diff --git a/vendor/jwilsson/spotify-web-api-php/CONTRIBUTING.md b/vendor/jwilsson/spotify-web-api-php/CONTRIBUTING.md new file mode 100644 index 0000000..3c2cb13 --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/CONTRIBUTING.md @@ -0,0 +1,17 @@ +# Contribution Guide + +## Issues +Please submit all your bug reports, feature requests and pull requests here but note that this isn't the place for support requests. Please use [Stack Overflow](http://stackoverflow.com/) for this. + +## Bug reports +1. Search the issues, have it already been reported? +2. Download the latest source, did this solve the problem? +4. If the answer to all of the above questions are "No" then open a bug report and include the following: + * A short, descriptive title. + * A summary of the problem. + * The steps to reproduce the problem. + * Possible solutions or other relevant information/suggestions. + +## Coding Guidelines +We follow the coding standards outlined in [PSR-1](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-1-basic-coding-standard.md) and [PSR-2](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md). Please follow these guidelines when commiting new code. +Fixes for existing code which doesn't follow these standards are highly appreciated! diff --git a/vendor/jwilsson/spotify-web-api-php/LICENSE.md b/vendor/jwilsson/spotify-web-api-php/LICENSE.md new file mode 100644 index 0000000..acee26b --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/LICENSE.md @@ -0,0 +1,19 @@ +Copyright (c) Jonathan Wilsson + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/jwilsson/spotify-web-api-php/README.md b/vendor/jwilsson/spotify-web-api-php/README.md new file mode 100644 index 0000000..6f5ed0c --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/README.md @@ -0,0 +1,323 @@ +# Spotify Web API PHP + +[![Build Status](https://travis-ci.org/jwilsson/spotify-web-api-php.svg?branch=master)](https://travis-ci.org/jwilsson/spotify-web-api-php) +[![Coverage Status](https://img.shields.io/coveralls/jwilsson/spotify-web-api-php.svg)](https://coveralls.io/r/jwilsson/spotify-web-api-php?branch=master) +[![Latest Stable Version](https://poser.pugx.org/jwilsson/spotify-web-api-php/v/stable.svg)](https://packagist.org/packages/jwilsson/spotify-web-api-php) + +This is a PHP implementation of the [Spotify Web API](https://developer.spotify.com/web-api/). It includes the following: + +* Helper methods for all API methods (Information about artists, albums and tracks). +* Search the Spotify catalog. +* Get information about users and their music library. +* Manage playlists for users. +* Authorization flow helpers. +* PSR-4 autoloading support. + +## Requirements +PHP 5.3 or greater. + +## Installation +1. If you're already using [Composer](https://getcomposer.org/) then you'll just need to include `jwilsson/spotify-web-api-php` as a dependency. Otherwise, download the library and include the files. +2. Create a new app at https://developer.spotify.com/ +3. Enter your app credentials. +4. Call the API! + +## Usage +Depending on the API methods you're planning on using you can choose between authenticating the user or just go. + +### Authenticating a user + +#### Using Authorization Code Flow + +```php +require 'vendor/autoload.php'; + +$session = new SpotifyWebAPI\Session('CLIENT_ID', 'CLIENT_SECRET', 'REDIRECT_URI'); + +// Get the authorization URL and send the user there +header('Location: ' . $session->getAuthorizeUrl(array('scope' => array('scope-1', 'scope-2')))); +``` + +When receiving a request back to your redirect URI: + +```php +require 'vendor/autoload.php'; + +$session = new SpotifyWebAPI\Session('CLIENT_ID', 'CLIENT_SECRET', 'REDIRECT_URI'); +$api = new SpotifyWebAPI\SpotifyWebAPI(); + +// Request a access token using the code from Spotify +$session->requestToken($_GET['code']); +$accessToken = $session->getAccessToken(); // We're good to go! + +// Set the code on the API wrapper +$api->setAccessToken($accessToken); +``` + +#### Using Client Credentials Flow +```php +require 'vendor/autoload.php'; + +$session = new SpotifyWebAPI\Session('CLIENT_ID', 'CLIENT_SECRET', 'REDIRECT_URI'); + +// Request a access token with optional scopes +$session->requestCredentialsToken(array('scope-1', 'scope-2')); +$accessToken = $session->getAccessToken(); // We're good to go! + +// Set the code on the API wrapper +$api->setAccessToken($accessToken); +``` + +### Making API calls + +```php +$track = $api->getTrack('7EjyzZcbLxW7PaaLua9Ksb'); + +print_r($track); +``` + +## More examples + +Add tracks to a user's library + +```php +$api->addMyTracks(array('1oR3KrPIp4CbagPa3PhtPp', '6lPb7Eoon6QPbscWbMsk6a')); +``` + +Add tracks to a user's playlist + +```php +$api->addUserPlaylistTracks('username', 'playlist_id', array('1oR3KrPIp4CbagPa3PhtPp', '6lPb7Eoon6QPbscWbMsk6a')); +``` + +Create a new playlist for a user + +```php +$api->createUserPlaylist('username', array('name' => 'My shiny playlist')); +``` + +Delete tracks from a user's library + +```php +$api->deleteMyTracks(array('1oR3KrPIp4CbagPa3PhtPp', '6lPb7Eoon6QPbscWbMsk6a')); +``` + +Delete tracks from a user's playlist + +```php +$tracks = array( + array('id' => '1oR3KrPIp4CbagPa3PhtPp'), + array('id' => '6lPb7Eoon6QPbscWbMsk6a') +); + +$api->deletePlaylistTracks('username', 'playlist_id', $tracks, 'snapshot_id'); +``` + +Get a album + +```php +$album = $api->getAlbum('7u6zL7kqpgLPISZYXNTgYk'); + +print_r($album); +``` + +Get multiple albums + +```php +$albums = $api->getAlbums(array('1oR3KrPIp4CbagPa3PhtPp', '6lPb7Eoon6QPbscWbMsk6a')); + +print_r($albums); +``` + +Get all tracks from an album + +```php +$tracks = $api->getAlbumTracks('1oR3KrPIp4CbagPa3PhtPp'); + +print_r($tracks); +``` + +Get an artist + +```php +$artist = $api->getArtist('36QJpDe2go2KgaRleHCDTp'); + +print_r($artist); +``` + +Get an artist's related artists + +```php +$artists = $api->getArtistRelatedArtists('36QJpDe2go2KgaRleHCDTp'); + +print_r($artists); +``` + +Get multiple artists + +```php +$artists = $api->getArtists(array('6v8FB84lnmJs434UJf2Mrm', '6olE6TJLqED3rqDCT0FyPh')); + +print_r($artists); +``` + +Get all albums by an artist + +```php +$albums = $api->getArtistAlbums('6v8FB84lnmJs434UJf2Mrm'); + +print_r($albums); +``` + +Get an artist's top tracks in a country + +```php +$tracks = $api->getArtistTopTracks('6v8FB84lnmJs434UJf2Mrm', 'se'); + +print_r($tracks); +``` + +Get Spotify featured playlists +```php +$playlists = $api->getFeaturedPlaylists(); + +print_r($playlists); +``` + +Get new releases +```php +$items = $api->getNewReleases(array( + 'country' => 'se' +)); + +print_r($items); +``` + +Get a user's saved tracks +```php +$tracks = $api->getMySavedTracks(); + +print_r($tracks); +``` + +Get a track + +```php +$track = $api->getTrack('7EjyzZcbLxW7PaaLua9Ksb'); + +print_r($track); +``` + +Get multiple tracks + +```php +$tracks = $api->getTracks(array('0eGsygTp906u18L0Oimnem', '1lDWb6b6ieDQ2xT7ewTC3G')); + +print_r($tracks); +``` + +Get a user + +```php +$user = $api->getUser('username'); + +print_r($user); +``` + +Get a user's playlists + +```php +$playlists = $api->getUserPlaylists('username'); + +print_r($playlists); +``` + +Get a specific playlist + +```php +$playlist = $api->getUserPlaylist('username', '606nLQuR41ZaA2vEZ4Ofb8'); + +print_r($playlist); +``` + +Get all tracks in a user's playlist + +```php +$tracks = $api->getUserPlaylistTracks('username', '606nLQuR41ZaA2vEZ4Ofb8'); + +print_r($tracks); +``` + +Get the currently authenticated user + +```php +$user = $api->me(); + +print_r($user); +``` + +See if a user's tracks contains the specified tracks + +```php +$contains = $api->myTracksContains(array('0eGsygTp906u18L0Oimnem', '1lDWb6b6ieDQ2xT7ewTC3G')); + +var_dump($contains); +``` + +Replace all tracks in a user's playlist with new ones + +```php +$api->replacePlaylistTracks('username', 'playlist_id', array('0eGsygTp906u18L0Oimnem', '1lDWb6b6ieDQ2xT7ewTC3G')); +``` + +Search for an album + +```php +$albums = $api->search('blur', 'album'); + +print_r($albums); +``` + +Search for an artist + +```php +$artists = $api->search('blur', 'artist'); + +print_r($artists); +``` + +Search for a track + +```php +$tracks = $api->search('song 2', 'track'); + +print_r($tracks); +``` + +Search with a limit + +```php +$tracks = $api->search('song 2', 'track', array( + 'limit' => 5 +)); + +print_r($tracks); +``` + +Search for tracks in a specific market + +```php +$tracks = $api->search('song 2', 'track', array( + 'market' => 'se' +)); + +print_r($tracks); +``` + +Update a user's playlist + +```php +$api->updateUserPlaylist('username', 'playlist_id', array('name' => 'New name')); +``` + +Browse through `src/spotifywebapi.php` and look at the tests for more methods and examples. diff --git a/vendor/jwilsson/spotify-web-api-php/composer.json b/vendor/jwilsson/spotify-web-api-php/composer.json new file mode 100644 index 0000000..96a3a18 --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/composer.json @@ -0,0 +1,27 @@ +{ + "name": "jwilsson/spotify-web-api-php", + "description": "PHP implementation of Spotify's Web API.", + "type": "library", + "license": "MIT", + "keywords": ["spotify"], + "homepage": "https://github.com/jwilsson/spotify-web-api-php", + "authors": [ + { + "name": "Jonathan Wilsson", + "email": "jonathan.wilsson@gmail.com" + } + ], + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "4.*", + "satooshi/php-coveralls": "dev-master", + "vlucas/phpdotenv": "1.*" + }, + "autoload": { + "psr-4": { + "SpotifyWebAPI\\": "src/" + } + } +} diff --git a/vendor/jwilsson/spotify-web-api-php/demo.php b/vendor/jwilsson/spotify-web-api-php/demo.php new file mode 100644 index 0000000..a87da48 --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/demo.php @@ -0,0 +1,21 @@ +requestToken($_GET['code']); + $api->setAccessToken($session->getAccessToken()); + + print_r($api->me()); +} else { + header('Location: ' . $session->getAuthorizeUrl(array( + 'scope' => array('user-read-email') + ))); +} diff --git a/vendor/jwilsson/spotify-web-api-php/phpunit.php b/vendor/jwilsson/spotify-web-api-php/phpunit.php new file mode 100644 index 0000000..a09cd45 --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/phpunit.php @@ -0,0 +1,9 @@ + + + + + + ./tests/ + + + + diff --git a/vendor/jwilsson/spotify-web-api-php/src/Request.php b/vendor/jwilsson/spotify-web-api-php/src/Request.php new file mode 100644 index 0000000..64eded3 --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/src/Request.php @@ -0,0 +1,133 @@ +send($method, self::ACCOUNT_URL . $uri, $parameters, $headers); + } + + /** + * Make a request to the "api" endpoint. + * + * @param string $method The HTTP method to use. + * @param string $uri The URI to request. + * @param array $parameters Optional. Query parameters. + * @param array $headers Optional. HTTP headers. + * + * @return array + */ + public function api($method, $uri, $parameters = array(), $headers = array()) + { + return $this->send($method, self::API_URL . $uri, $parameters, $headers); + } + + /** + * Make a request to Spotify. + * You'll probably want to use one of the convenience methods instead. + * + * @param string $method The HTTP method to use. + * @param string $url The URL to request. + * @param array $parameters Optional. Query parameters. + * @param array $headers Optional. HTTP headers. + * + * @return array + */ + public function send($method, $url, $parameters = array(), $headers = array()) + { + // Sometimes a JSON object is passed + if (is_array($parameters) || is_object($parameters)) { + $parameters = http_build_query($parameters); + } + + $mergedHeaders = array(); + foreach ($headers as $key => $val) { + $mergedHeaders[] = "$key: $val"; + } + + $options = array( + CURLOPT_HEADER => true, + CURLOPT_HTTPHEADER => $mergedHeaders, + CURLOPT_RETURNTRANSFER => true + ); + + $url = rtrim($url, '/'); + $method = strtoupper($method); + + switch ($method) { + case 'DELETE': + $options[CURLOPT_CUSTOMREQUEST] = $method; + $options[CURLOPT_POSTFIELDS] = $parameters; + + break; + case 'POST': + $options[CURLOPT_POST] = true; + $options[CURLOPT_POSTFIELDS] = $parameters; + + break; + case 'PUT': + $options[CURLOPT_CUSTOMREQUEST] = 'PUT'; + $options[CURLOPT_POSTFIELDS] = $parameters; + + break; + default: + $options[CURLOPT_CUSTOMREQUEST] = $method; + + if ($parameters) { + $url .= '/?' . $parameters; + } + + break; + } + + $options[CURLOPT_URL] = $url; + + $ch = curl_init(); + curl_setopt_array($ch, $options); + + $response = curl_exec($ch); + $status = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE); + curl_close($ch); + + list($headers, $body) = explode("\r\n\r\n", $response, 2); + + $body = json_decode($body); + + if ($status < 200 || $status > 299) { + if (isset($body->error)) { + $error = $body->error; + + // These properties only exist on API calls, not auth calls + if (isset($error->message) && isset($error->status)) { + throw new SpotifyWebAPIException($error->message, $error->status); + } elseif (isset($body->error_description)) { + throw new SpotifyWebAPIException($body->error_description, $status); + } else { + throw new SpotifyWebAPIException($error, $status); + } + } else { + throw new SpotifyWebAPIException('No \'error\' provided in response body', $status); + } + } + + return array( + 'body' => $body, + 'headers' => $headers, + 'status' => $status + ); + } +} diff --git a/vendor/jwilsson/spotify-web-api-php/src/Session.php b/vendor/jwilsson/spotify-web-api-php/src/Session.php new file mode 100644 index 0000000..ec15d3d --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/src/Session.php @@ -0,0 +1,272 @@ +setClientId($clientId); + $this->setClientSecret($clientSecret); + $this->setRedirectUri($redirectUri); + + if (is_null($request)) { + $request = new Request(); + } + + $this->request = $request; + } + + /** + * Get the authorization URL. + * + * @param array|object $options Optional. Options for the authorization URL. + * - array scope Optional. Scope(s) to request from the user. + * - boolean show_dialog Optional. Whether or not to force the user to always approve the app. Default is false. + * - string state Optional. A CSRF token. + * + * @return string + */ + public function getAuthorizeUrl($options = array()) + { + $defaults = array( + 'scope' => array(), + 'show_dialog' => false, + 'state' => '' + ); + + $options = array_merge($defaults, (array) $options); + $parameters = array( + 'client_id' => $this->getClientId(), + 'redirect_uri' => $this->getRedirectUri(), + 'response_type' => 'code', + 'scope' => implode(' ', $options['scope']), + 'show_dialog' => $options['show_dialog'] ? 'true' : 'false', + 'state' => $options['state'] + ); + + return Request::ACCOUNT_URL . '/authorize/?' . http_build_query($parameters); + } + + /** + * Get the access token. + * + * @return string + */ + public function getAccessToken() + { + return $this->accessToken; + } + + /** + * Get the client ID. + * + * @return string + */ + public function getClientId() + { + return $this->clientId; + } + + /** + * Get the client secret. + * + * @return string + */ + public function getClientSecret() + { + return $this->clientSecret; + } + + /** + * Get the number of seconds before the access token expires. + * + * @return int + */ + public function getExpires() + { + return $this->expires; + } + + /** + * Get the client's redirect URI. + * + * @return string + */ + public function getRedirectUri() + { + return $this->redirectUri; + } + + /** + * Get the refresh token. + * + * @return string + */ + public function getRefreshToken() + { + return $this->refreshToken; + } + + /** + * Refresh a access token. + * + * @return bool + */ + public function refreshToken() + { + $payload = base64_encode($this->getClientId() . ':' . $this->getClientSecret()); + + $parameters = array( + 'grant_type' => 'refresh_token', + 'refresh_token' => $this->refreshToken + ); + + $headers = array( + 'Authorization' => 'Basic ' . $payload + ); + + $response = $this->request->account('POST', '/api/token', $parameters, $headers); + $response = $response['body']; + + if (isset($response->access_token)) { + $this->accessToken = $response->access_token; + $this->expires = $response->expires_in; + + return true; + } + + return false; + } + + /** + * Request a access token using the Client Credentials Flow. + * + * @param array $scope Optional. Scope(s) to request from the user. + * + * @return bool + */ + public function requestCredentialsToken($scope = array()) + { + $payload = base64_encode($this->getClientId() . ':' . $this->getClientSecret()); + + $parameters = array( + 'grant_type' => 'client_credentials', + 'scope' => implode(' ', $scope) + ); + + $headers = array( + 'Authorization' => 'Basic ' . $payload + ); + + $response = $this->request->account('POST', '/api/token', $parameters, $headers); + $response = $response['body']; + + if (isset($response->access_token)) { + $this->accessToken = $response->access_token; + $this->expires = $response->expires_in; + + return true; + } + + return false; + } + + /** + * Request a access token. + * + * @param string $code The authorization code from Spotify. + * + * @return bool + */ + public function requestToken($code) + { + $parameters = array( + 'client_id' => $this->getClientId(), + 'client_secret' => $this->getClientSecret(), + 'code' => $code, + 'grant_type' => 'authorization_code', + 'redirect_uri' => $this->getRedirectUri() + ); + + $response = $this->request->account('POST', '/api/token', $parameters); + $response = $response['body']; + + if (isset($response->access_token)) { + $this->accessToken = $response->access_token; + $this->expires = $response->expires_in; + $this->refreshToken = $response->refresh_token; + + return true; + } + + return false; + } + + /** + * Set the client ID. + * + * @param string $clientId The client ID. + * + * @return void + */ + public function setClientId($clientId) + { + $this->clientId = $clientId; + } + + /** + * Set the client secret. + * + * @param string $clientSecret The client secret. + * + * @return void + */ + public function setClientSecret($clientSecret) + { + $this->clientSecret = $clientSecret; + } + + /** + * Set the client's redirect URI. + * + * @param string $redirectUri The redirect URI. + * + * @return void + */ + public function setRedirectUri($redirectUri) + { + $this->redirectUri = $redirectUri; + } + + /** + * Set the refresh token. + * + * @param string $refreshToken The refresh token. + * + * @return void + */ + public function setRefreshToken($refreshToken) + { + $this->refreshToken = $refreshToken; + } +} diff --git a/vendor/jwilsson/spotify-web-api-php/src/SpotifyWebAPI.php b/vendor/jwilsson/spotify-web-api-php/src/SpotifyWebAPI.php new file mode 100755 index 0000000..0dfec31 --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/src/SpotifyWebAPI.php @@ -0,0 +1,707 @@ +request = $request; + } + + /** + * Convert Spotify object IDs to Spotify URIs. + * + * @param array|string $ids ID(s) to convert. + * + * @return array|string + */ + protected function idToUri($ids) + { + $ids = (array) $ids; + + for ($i = 0; $i < count($ids); $i++) { + if (strpos($ids[$i], 'spotify:track:') !== false) { + continue; + } + + $ids[$i] = 'spotify:track:' . $ids[$i]; + } + + return (count($ids) == 1) ? $ids[0] : $ids; + } + + /** + * Add track(s) to the current user's Spotify library. + * Requires a valid access token. + * https://developer.spotify.com/web-api/save-tracks-user/ + * + * @param string|array ID of the track(s) to add. + * + * @return bool + */ + public function addMyTracks($tracks) + { + $tracks = json_encode((array) $tracks); + + $response = $this->request->api('PUT', '/v1/me/tracks', $tracks, array( + 'Authorization' => 'Bearer ' . $this->accessToken, + 'Content-Type' => 'application/json' + )); + + return $response['status'] == 200; + } + + /** + * Add track(s) to a user's playlist. + * Requires a valid access token. + * https://developer.spotify.com/web-api/add-tracks-to-playlist/ + * + * @param string $userId ID of the user who owns the playlist. + * @param string $playlistId ID of the playlist to add tracks to. + * @param string|array $tracks ID of the track(s) to add. + * @param array|object $options Optional. Options for the new tracks. + * - int position Optional. Zero-based position of where in the playlist to add the tracks. Tracks will be appened if omitted or false. + * + * @return bool + */ + public function addUserPlaylistTracks($userId, $playlistId, $tracks, $options = array()) + { + $defaults = array( + 'position' => false + ); + + $options = array_merge($defaults, (array) $options); + $options = array_filter($options, function ($value) { + return $value !== false; + }); + + $options = http_build_query($options); + $tracks = $this->idToUri($tracks); + $tracks = json_encode((array) $tracks); + + // We need to manually append data to the URI since it's a POST request + $response = $this->request->api('POST', '/v1/users/' . $userId . '/playlists/' . $playlistId . '/tracks?' . $options, $tracks, array( + 'Authorization' => 'Bearer ' . $this->accessToken, + 'Content-Type' => 'application/json' + )); + + return $response['status'] == 201; + } + + /** + * Create a new playlist for a user. + * Requires a valid access token. + * https://developer.spotify.com/web-api/create-playlist/ + * + * @param string $userId ID of the user to create the playlist for. + * @param array|object $data Data for the new playlist. + * - name string Required. Name of the playlist. + * - public bool Optional. Whether the playlist should be public or not. + * + * @return object + */ + public function createUserPlaylist($userId, $data) + { + $defaults = array( + 'name' => '', + 'public' => true + ); + + $data = array_merge($defaults, (array) $data); + $data = json_encode($data); + + $response = $this->request->api('POST', '/v1/users/' . $userId . '/playlists', $data, array( + 'Authorization' => 'Bearer ' . $this->accessToken, + 'Content-Type' => 'application/json' + )); + + return $response['body']; + } + + /** + * Delete track(s) from current user's Spotify library. + * Requires a valid access token. + * https://developer.spotify.com/web-api/remove-tracks-user/ + * + * @param string|array ID of the track(s) to delete. + * + * @return bool + */ + public function deleteMyTracks($tracks) + { + $tracks = implode(',', (array) $tracks); + $tracks = urlencode($tracks); + + $response = $this->request->api('DELETE', '/v1/me/tracks?ids=' . $tracks, array(), array( + 'Authorization' => 'Bearer ' . $this->accessToken + )); + + return $response['status'] == 200; + } + + /** + * Delete tracks from a playlist and retrieve a new snapshot ID. + * Requires a valid access token. + * https://developer.spotify.com/web-api/remove-tracks-playlist/ + * + * @param string $userId ID of the user who owns the playlist. + * @param string $playlistId ID of the playlist to delete tracks from. + * @param array $tracks Tracks to delete and optional position in the playlist where the track is located. + * - id string Required. Spotify track ID. + * - position array Optional. Position of the track in the playlist. + * @param string $snapshotId Optional. The playlist's snapshot ID. + * + * @return string|bool + */ + public function deletePlaylistTracks($userId, $playlistId, $tracks, $snapshotId = '') + { + $data = array(); + if ($snapshotId) { + $data['snapshot_id'] = $snapshotId; + } + + for ($i = 0; $i < count($tracks); $i++) { + $tracks[$i] = (array) $tracks[$i]; + $tracks[$i]['uri'] = $this->idToUri($tracks[$i]['id']); + } + + $data['tracks'] = $tracks; + $data = json_encode($data); + + $response = $this->request->api('DELETE', '/v1/users/' . $userId . '/playlists/' . $playlistId . '/tracks', $data, array( + 'Authorization' => 'Bearer ' . $this->accessToken + )); + $response = $response['body']; + + if (isset($response->snapshot_id)) { + return $response->snapshot_id; + } + + return false; + } + + /** + * Get a album. + * https://developer.spotify.com/web-api/get-album/ + * + * @param string $albumId ID of the album. + * + * @return object + */ + public function getAlbum($albumId) + { + $response = $this->request->api('GET', '/v1/albums/' . $albumId); + + return $response['body']; + } + + /** + * Get multiple albums. + * + * @param array $albumIds ID of the albums. + * + * @return object + */ + public function getAlbums($albumIds) + { + $albumIds = implode(',', $albumIds); + $response = $this->request->api('GET', '/v1/albums/', array('ids' => $albumIds)); + + return $response['body']; + } + + /** + * Get a album's tracks. + * https://developer.spotify.com/web-api/get-several-albums/ + * + * @param string $albumId ID of the album. + * @param array|object $options Optional. Options for the tracks. + * - int limit Optional. Limit the number of tracks. + * - int offset Optional. Number of tracks to skip. + * + * @return object + */ + public function getAlbumTracks($albumId, $options = array()) + { + $defaults = array( + 'limit' => 0, + 'offset' => 0 + ); + + $options = array_merge($defaults, (array) $options); + $options = array_filter($options); + + $response = $this->request->api('GET', '/v1/albums/' . $albumId . '/tracks', $options); + + return $response['body']; + } + + /** + * Get a artist. + * https://developer.spotify.com/web-api/get-artist/ + * + * @param string $artistId ID of the artist. + * + * @return object + */ + public function getArtist($artistId) + { + $response = $this->request->api('GET', '/v1/artists/' . $artistId); + + return $response['body']; + } + + /** + * Get multiple artists. + * https://developer.spotify.com/web-api/get-several-artists/ + * + * @param array $artistIds ID of the artists. + * + * @return object + */ + public function getArtists($artistIds) + { + $artistIds = implode(',', $artistIds); + $response = $this->request->api('GET', '/v1/artists/', array('ids' => $artistIds)); + + return $response['body']; + } + + /** + * Get an artist's related artists. + * https://developer.spotify.com/web-api/get-related-artists/ + * + * @param string $artistId ID of the artist. + * + * @return object + */ + public function getArtistRelatedArtists($artistId) + { + $response = $this->request->api('GET', '/v1/artists/' . $artistId . '/related-artists'); + + return $response['body']; + } + + /** + * Get a artist's albums. + * https://developer.spotify.com/web-api/get-artists-albums/ + * + * @param string $artistId ID of the artist. + * @param array|object $options Optional. Options for the albums. + * - array album_type Optional. Album types to return. If omitted, all album types will be returned. + * - string market Optional. A ISO 3166-1 alpha-2 country code. Limit the results to tracks that are playable in this market. + * - int limit Optional. Limit the number of albums. + * - int offset Optional. Number of albums to skip. + * + * @return object + */ + public function getArtistAlbums($artistId, $options = array()) + { + $defaults = array( + 'album_type' => array(), + 'market' => '', + 'limit' => 0, + 'offset' => 0 + ); + + $options = array_merge($defaults, (array) $options); + $options['album_type'] = implode(',', $options['album_type']); + $options = array_filter($options); + + $response = $this->request->api('GET', '/v1/artists/' . $artistId . '/albums', $options); + + return $response['body']; + } + + /** + * Get a artist's top tracks in a country. + * https://developer.spotify.com/web-api/get-artists-top-tracks/ + * + * @param string $artistId ID of the artist. + * @param string $country An ISO 3166-1 alpha-2 country code specifying the country to get the top tracks for. + * + * @return object + */ + public function getArtistTopTracks($artistId, $country) + { + $response = $this->request->api('GET', '/v1/artists/' . $artistId . '/top-tracks', array('country' => $country)); + + return $response['body']; + } + + /** + * Get Spotify featured playlists. + * Requires a valid access token. + * https://developer.spotify.com/web-api/get-list-featured-playlists/ + * + * @param array|object $options Optional. Options for the playlists. + * - string locale Optional. An lowercase ISO 639 language code and an uppercase ISO 3166-1 alpha-2 country code. Show playlists in this language. + * - string country Optional. An ISO 3166-1 alpha-2 country code. Show playlists from this country. + * - string timestamp Optional. A ISO 8601 timestamp. Show playlists relevant to this date and time. + * - int limit Optional. Limit the number of playlists. + * - int offset Optional. Number of playlists to skip. + * + * @return object + */ + public function getFeaturedPlaylists($options = array()) + { + $defaults = array( + 'country' => '', + 'limit' => 0, + 'locale' => '', + 'offset' => 0, + 'timestamp' => '' + ); + + $options = array_merge($defaults, (array) $options); + $options = array_filter($options); + + $response = $this->request->api('GET', '/v1/browse/featured-playlists', $options, array( + 'Authorization' => 'Bearer ' . $this->accessToken + )); + + return $response['body']; + } + + /** + * Get new releases. + * Requires a valid access token. + * https://developer.spotify.com/web-api/get-list-new-releases/ + * + * @param array|object $options Optional. Options for the items. + * - string country Optional. An ISO 3166-1 alpha-2 country code. Show items relevant to this country. + * - int limit Optional. Limit the number of items. + * - int offset Optional. Number of items to skip. + * + * @return object + */ + public function getNewReleases($options = array()) + { + $defaults = array( + 'country' => '', + 'limit' => 0, + 'offset' => 0 + ); + + $options = array_merge($defaults, (array) $options); + $options = array_filter($options); + + $response = $this->request->api('GET', '/v1/browse/new-releases', $options, array( + 'Authorization' => 'Bearer ' . $this->accessToken + )); + + return $response['body']; + } + + /** + * Get the current user’s saved tracks. + * Requires a valid access token. + * https://developer.spotify.com/web-api/get-users-saved-tracks/ + * + * @param array|object $options Optional. Options for the tracks. + * - int limit Optional. Limit the number of tracks. + * - int offset Optional. Number of tracks to skip. + * + * @return array + */ + public function getMySavedTracks($options = array()) + { + $defaults = array( + 'limit' => 0, + 'offset' => 0 + ); + + $options = array_merge($defaults, (array) $options); + $options = array_filter($options); + + $response = $this->request->api('GET', '/v1/me/tracks', $options, array( + 'Authorization' => 'Bearer ' . $this->accessToken + )); + + return $response['body']; + } + + /** + * Get a track. + * https://developer.spotify.com/web-api/get-track/ + * + * @param string $trackId ID of the track. + * + * @return object + */ + public function getTrack($trackId) + { + $response = $this->request->api('GET', '/v1/tracks/' . $trackId); + + return $response['body']; + } + + /** + * Get multiple tracks. + * https://developer.spotify.com/web-api/get-several-tracks/ + * + * @param array $trackIds ID of the tracks. + * + * @return object + */ + public function getTracks($trackIds) + { + $trackIds = implode(',', $trackIds); + $response = $this->request->api('GET', '/v1/tracks/', array('ids' => $trackIds)); + + return $response['body']; + } + + /** + * Get a user. + * https://developer.spotify.com/web-api/get-users-profile/ + * + * @param string $userId ID of the user. + * + * @return object + */ + public function getUser($userId) + { + $response = $this->request->api('GET', '/v1/users/' . $userId); + + return $response['body']; + } + + /** + * Get a user's playlists. + * Requires a valid access token. + * https://developer.spotify.com/web-api/get-list-users-playlists/ + * + * @param string $userId ID of the user. + * @param array|object $options Optional. Options for the tracks. + * - int limit Optional. Limit the number of tracks. + * - int offset Optional. Number of tracks to skip. + * + * @return object + */ + public function getUserPlaylists($userId, $options = array()) + { + $defaults = array( + 'limit' => 0, + 'offset' => 0 + ); + + $options = array_merge($defaults, (array) $options); + $options = array_filter($options); + + $response = $this->request->api('GET', '/v1/users/' . $userId . '/playlists', $options, array( + 'Authorization' => 'Bearer ' . $this->accessToken + )); + + return $response['body']; + } + + /** + * Get a user's specific playlist. + * Requires a valid access token. + * https://developer.spotify.com/web-api/get-playlist/ + * + * @param string $userId ID of the user. + * @param string $playlistId ID of the playlist. + * + * @return object + */ + public function getUserPlaylist($userId, $playlistId) + { + $response = $this->request->api('GET', '/v1/users/' . $userId . '/playlists/' . $playlistId, array(), array( + 'Authorization' => 'Bearer ' . $this->accessToken + )); + + return $response['body']; + } + + /** + * Get the tracks in a user's playlist. + * Requires a valid access token. + * https://developer.spotify.com/web-api/get-playlists-tracks/ + * + * @param string $userId ID of the user. + * @param string $playlistId ID of the playlist. + * @param array|object $options Optional. Options for the tracks. + * - array fields Optional. A list of fields to return. See Spotify docs for more info. + * - int limit Optional. Limit the number of tracks. + * - int offset Optional. Number of tracks to skip. + * + * @return object + */ + public function getUserPlaylistTracks($userId, $playlistId, $options = array()) + { + $defaults = array( + 'fields' => array(), + 'limit' => 0, + 'offset' => 0 + ); + + $options = array_merge($defaults, (array) $options); + $options['fields'] = implode(',', $options['fields']); + $options = array_filter($options); + + $response = $this->request->api('GET', '/v1/users/' . $userId . '/playlists/' . $playlistId . '/tracks', $options, array( + 'Authorization' => 'Bearer ' . $this->accessToken + )); + + return $response['body']; + } + + /** + * Get the currently authenticated user. + * Requires a valid access token. + * https://developer.spotify.com/web-api/get-current-users-profile/ + * + * @return object + */ + public function me() + { + $response = $this->request->api('GET', '/v1/me', array(), array( + 'Authorization' => 'Bearer ' . $this->accessToken + )); + + return $response['body']; + } + + /** + * Check if the track(s) is saved in the current user's Spotify library. + * Requires a valid access token. + * https://developer.spotify.com/web-api/check-users-saved-tracks/ + * + * @param string|array $tracks ID of the track(s) to check for. + * + * @return array + */ + public function myTracksContains($tracks) + { + $tracks = implode(',', (array) $tracks); + + $response = $this->request->api('GET', '/v1/me/tracks/contains', array('ids' => $tracks), array( + 'Authorization' => 'Bearer ' . $this->accessToken + )); + + return $response['body']; + } + + /** + * Replace all tracks in a user's playlist with new ones. + * Requires a valid access token. + * https://developer.spotify.com/web-api/replace-playlists-tracks/ + * + * @param string $userId ID of the user. + * @param string $playlistId ID of the playlist. + * @param string|array $tracks ID of the track(s) to add. + * + * @return bool + */ + public function replacePlaylistTracks($userId, $playlistId, $tracks) + { + $tracks = $this->idToUri($tracks); + $tracks = array('uris' => (array) $tracks); + $tracks = json_encode($tracks); + + $response = $this->request->api('PUT', '/v1/users/' . $userId . '/playlists/' . $playlistId . '/tracks', $tracks, array( + 'Authorization' => 'Bearer ' . $this->accessToken + )); + + return $response['status'] == 201; + } + + /** + * Search for an item. + * Requires a valid access token if market=from_token is used. + * https://developer.spotify.com/web-api/search-item/ + * + * @param string $query The term to search for. + * @param string|array $type The type of item to search for; "album", "artist", or "track". + * @param array|object $options Optional. Options for the search. + * - string market Optional. A ISO 3166-1 alpha-2 country code. Limit the results to items that are playable in this market. + * - int limit Optional. Limit the number of items. + * - int offset Optional. Number of items to skip. + * + * @return array + */ + public function search($query, $type, $options = array()) + { + $defaults = array( + 'market' => '', + 'limit' => 0, + 'offset' => 0 + ); + + $type = implode(',', (array) $type); + + $options = array_merge($defaults, (array) $options); + $options = array_filter($options); + $options = array_merge($options, array( + 'query' => $query, + 'type' => $type + )); + + $headers = array(); + if (isset($options['market']) && $options['market'] == 'from_token') { + $headers['Authorization'] = 'Bearer ' . $this->accessToken; + } + + $response = $this->request->api('GET', '/v1/search', $options, $headers); + + return $response['body']; + } + + /** + * Set the access token to use. + * + * @param string $accessToken The access token. + * + * @return void + */ + public function setAccessToken($accessToken) + { + $this->accessToken = $accessToken; + } + + /** + * Update the details of a user's playlist. + * Requires a valid access token. + * https://developer.spotify.com/web-api/change-playlist-details/ + * + * @param array|object $data Data for the new playlist. + * - name string Required. Name of the playlist. + * - public bool Optional. Whether the playlist should be public or not. + * + * @return bool + */ + public function updateUserPlaylist($userId, $playlistId, $data) + { + $defaults = array( + 'name' => '', + 'public' => true + ); + + $data = array_merge($defaults, (array) $data); + $data = json_encode($data); + + $response = $this->request->api('PUT', '/v1/users/' . $userId . '/playlists/' . $playlistId, $data, array( + 'Authorization' => 'Bearer ' . $this->accessToken, + 'Content-Type' => 'application/json' + )); + + return $response['status'] == 200; + } +} diff --git a/vendor/jwilsson/spotify-web-api-php/src/SpotifyWebAPIException.php b/vendor/jwilsson/spotify-web-api-php/src/SpotifyWebAPIException.php new file mode 100644 index 0000000..78510a3 --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/src/SpotifyWebAPIException.php @@ -0,0 +1,7 @@ +request = new SpotifyWebAPI\Request(); + } + + public function testApi() + { + $response = $this->request->api('GET', '/v1/albums/7u6zL7kqpgLPISZYXNTgYk'); + + $this->assertObjectHasAttribute('id', $response['body']); + } + + public function testApiParameters() + { + $response = $this->request->api('GET', '/v1/albums', array( + 'ids' => '1oR3KrPIp4CbagPa3PhtPp,6lPb7Eoon6QPbscWbMsk6a' + )); + + $this->assertObjectHasAttribute('id', $response['body']->albums[0]); + $this->assertObjectHasAttribute('id', $response['body']->albums[1]); + } + + public function testSend() + { + $response = $this->request->send('GET', 'https://api.spotify.com/v1/albums/7u6zL7kqpgLPISZYXNTgYk'); + + $this->assertObjectHasAttribute('id', $response['body']); + } + + public function testSendParameters() + { + $response = $this->request->send('GET', 'https://api.spotify.com/v1/albums', array( + 'ids' => '1oR3KrPIp4CbagPa3PhtPp,6lPb7Eoon6QPbscWbMsk6a' + )); + + $this->assertObjectHasAttribute('id', $response['body']->albums[0]); + $this->assertObjectHasAttribute('id', $response['body']->albums[1]); + } + + public function testSendHeaders() + { + $response = $this->request->send('GET', 'https://api.spotify.com/v1/albums/7u6zL7kqpgLPISZYXNTgYk'); + + $this->assertInternalType('string', $response['headers']); + } + + public function testSendStatus() + { + $response = $this->request->send('GET', 'https://api.spotify.com/v1/albums/7u6zL7kqpgLPISZYXNTgYk'); + + $this->assertEquals(200, $response['status']); + } + + public function testSendMalformed() + { + $this->setExpectedException('SpotifyWebAPI\SpotifyWebAPIException'); + + $response = $this->request->send('GET', 'https://api.spotify.com/v1/albums/NON_EXISTING_ALBUM'); + } +} diff --git a/vendor/jwilsson/spotify-web-api-php/tests/SessionTest.php b/vendor/jwilsson/spotify-web-api-php/tests/SessionTest.php new file mode 100644 index 0000000..d019077 --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/tests/SessionTest.php @@ -0,0 +1,183 @@ +session = new SpotifyWebAPI\Session(getenv('SPOTIFY_CLIENT_ID'), getenv('SPOTIFY_CLIENT_SECRET'), getenv('SPOTIFY_REDIRECT_URI')); + } + + public function testGetAuthorizeUrl() + { + $clientID = getenv('SPOTIFY_CLIENT_ID'); + $redirectUri = urlencode(getenv('SPOTIFY_REDIRECT_URI')); + + $expected = "https://accounts.spotify.com/authorize/?client_id=$clientID&redirect_uri=$redirectUri&response_type=code&scope=&show_dialog=false&state="; + $url = $this->session->getAuthorizeUrl(); + + $this->assertEquals($expected, $url); + } + + public function testGetAuthorizeUrlScope() + { + $clientID = getenv('SPOTIFY_CLIENT_ID'); + $redirectUri = urlencode(getenv('SPOTIFY_REDIRECT_URI')); + $scope = array('user-read-email'); + $scopeOut = urlencode(implode(' ', $scope)); + + $expected = "https://accounts.spotify.com/authorize/?client_id=$clientID&redirect_uri=$redirectUri&response_type=code&scope=$scopeOut&show_dialog=false&state="; + $url = $this->session->getAuthorizeUrl(array( + 'scope' => $scope + )); + + $this->assertEquals($expected, $url); + } + + public function testGetAuthorizeUrlMultipleScope() + { + $clientID = getenv('SPOTIFY_CLIENT_ID'); + $redirectUri = urlencode(getenv('SPOTIFY_REDIRECT_URI')); + $scope = array('user-read-email', 'playlist-modify-public'); + $scopeOut = urlencode(implode(' ', $scope)); + + $expected = "https://accounts.spotify.com/authorize/?client_id=$clientID&redirect_uri=$redirectUri&response_type=code&scope=$scopeOut&show_dialog=false&state="; + $url = $this->session->getAuthorizeUrl(array( + 'scope' => $scope + )); + + $this->assertEquals($expected, $url); + } + + public function testGetAuthorizeUrlDefaultShowDialog() + { + $clientID = getenv('SPOTIFY_CLIENT_ID'); + $redirectUri = urlencode(getenv('SPOTIFY_REDIRECT_URI')); + + $expected = "https://accounts.spotify.com/authorize/?client_id=$clientID&redirect_uri=$redirectUri&response_type=code&scope=&show_dialog=false&state="; + $url = $this->session->getAuthorizeUrl(); + + $this->assertEquals($expected, $url); + } + + public function testGetAuthorizeUrlShowDialog() + { + $clientID = getenv('SPOTIFY_CLIENT_ID'); + $redirectUri = urlencode(getenv('SPOTIFY_REDIRECT_URI')); + + $expected = "https://accounts.spotify.com/authorize/?client_id=$clientID&redirect_uri=$redirectUri&response_type=code&scope=&show_dialog=true&state="; + $url = $this->session->getAuthorizeUrl(array( + 'show_dialog' => true + )); + + $this->assertEquals($expected, $url); + } + + public function testGetAuthorizeUrlState() + { + $clientID = getenv('SPOTIFY_CLIENT_ID'); + $redirectUri = urlencode(getenv('SPOTIFY_REDIRECT_URI')); + $state = 'foobar'; + + $expected = "https://accounts.spotify.com/authorize/?client_id=$clientID&redirect_uri=$redirectUri&response_type=code&scope=&show_dialog=false&state=$state"; + $url = $this->session->getAuthorizeUrl(array( + 'state' => $state + )); + + $this->assertEquals($expected, $url); + } + + public function testGetAuthorizeUrlScopeAndState() + { + $clientID = getenv('SPOTIFY_CLIENT_ID'); + $redirectUri = urlencode(getenv('SPOTIFY_REDIRECT_URI')); + $scope = array('user-read-email'); + $scopeOut = urlencode(implode(' ', $scope)); + $state = 'foobar'; + + $expected = "https://accounts.spotify.com/authorize/?client_id=$clientID&redirect_uri=$redirectUri&response_type=code&scope=$scopeOut&show_dialog=false&state=$state"; + $url = $this->session->getAuthorizeUrl(array( + 'scope' => $scope, + 'state' => $state + )); + + $this->assertEquals($expected, $url); + } + + public function testGetAuthorizeUrlOptions() + { + $clientID = getenv('SPOTIFY_CLIENT_ID'); + $redirectUri = urlencode(getenv('SPOTIFY_REDIRECT_URI')); + $scope = array('user-read-email'); + $scopeOut = urlencode(implode(' ', $scope)); + $state = 'foobar'; + + $expected = "https://accounts.spotify.com/authorize/?client_id=$clientID&redirect_uri=$redirectUri&response_type=code&scope=$scopeOut&show_dialog=true&state=$state"; + $url = $this->session->getAuthorizeUrl(array( + 'scope' => $scope, + 'show_dialog' => true, + 'state' => $state + )); + + $this->assertEquals($expected, $url); + } + + public function testGetAuthorizeUrlMultipleScopeAndState() + { + $clientID = getenv('SPOTIFY_CLIENT_ID'); + $redirectUri = urlencode(getenv('SPOTIFY_REDIRECT_URI')); + $scope = array('user-read-email', 'playlist-modify-public'); + $scopeOut = urlencode(implode(' ', $scope)); + $state = 'foobar'; + + $expected = "https://accounts.spotify.com/authorize/?client_id=$clientID&redirect_uri=$redirectUri&response_type=code&scope=$scopeOut&show_dialog=false&state=$state"; + $url = $this->session->getAuthorizeUrl(array( + 'scope' => $scope, + 'state' => $state + )); + + $this->assertEquals($expected, $url); + } + + public function testGetClientId() + { + $expected = getenv('SPOTIFY_CLIENT_ID'); + $clientID = $this->session->getClientId(); + + $this->assertEquals($expected, $clientID); + } + + public function testGetClientSecret() + { + $expected = getenv('SPOTIFY_CLIENT_SECRET'); + $clientSecret = $this->session->getClientSecret(); + + $this->assertEquals($expected, $clientSecret); + } + + public function testGetRedirectUri() + { + $expected = getenv('SPOTIFY_REDIRECT_URI'); + $redirectUri = $this->session->getRedirectUri(); + + $this->assertEquals($expected, $redirectUri); + } + + public function testRequestCredentialsToken() + { + $this->session = new SpotifyWebAPI\Session(getenv('SPOTIFY_CLIENT_ID'), getenv('SPOTIFY_CLIENT_SECRET'), getenv('SPOTIFY_REDIRECT_URI')); + $this->session->requestCredentialsToken(); + + $this->assertNotEmpty($this->session->getAccessToken()); + } + + public function testRequestCredentialsTokenScope() + { + $this->session = new SpotifyWebAPI\Session(getenv('SPOTIFY_CLIENT_ID'), getenv('SPOTIFY_CLIENT_SECRET'), getenv('SPOTIFY_REDIRECT_URI')); + $this->session->requestCredentialsToken(array('user-read-email')); + + $this->assertNotEmpty($this->session->getAccessToken()); + } +} diff --git a/vendor/jwilsson/spotify-web-api-php/tests/SpotifyWebAPITest.php b/vendor/jwilsson/spotify-web-api-php/tests/SpotifyWebAPITest.php new file mode 100644 index 0000000..039f96f --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/tests/SpotifyWebAPITest.php @@ -0,0 +1,370 @@ + $fixture + ); + } else { + $fixture = __DIR__ . '/fixtures/' . $fixture . '.json'; + $fixture = file_get_contents($fixture); + + $response = json_decode($fixture); + $return = array( + 'body' => $response + ); + } + + $request = $this->getMock('SpotifyWebAPI\Request'); + $request->method('api') + ->willReturn($return); + + $api = new SpotifyWebAPI\SpotifyWebAPI($request); + return $api; + } + + public function testAddMyTracksSingle() + { + $api = $this->setupMock(); + $response = $api->addMyTracks('7EjyzZcbLxW7PaaLua9Ksb'); + + $this->assertTrue($response); + } + + public function testAddMyTracksMultiple() + { + $api = $this->setupMock(); + $response = $api->addMyTracks(array( + '1id6H6vcwSB9GGv9NXh5cl', + '3mqRLlD9j92BBv1ueFhJ1l' + )); + + $this->assertTrue($response); + } + + public function testAddUserPlaylistTracksSingle() + { + $api = $this->setupMock(201); + $response = $api->addUserPlaylistTracks('mcgurk', $this->playlistID, '7EjyzZcbLxW7PaaLua9Ksb'); + + $this->assertTrue($response); + } + + public function testAddUserPlaylistTracksMultiple() + { + $api = $this->setupMock(201); + $response = $api->addUserPlaylistTracks('mcgurk', $this->playlistID, array( + '1id6H6vcwSB9GGv9NXh5cl', + '3mqRLlD9j92BBv1ueFhJ1l' + )); + + $this->assertTrue($response); + } + + public function testCreateUserPlaylist() + { + $api = $this->setupMock('user-playlist'); + $response = $api->createUserPlaylist('mcgurk', array( + 'name' => 'Test playlist', + 'public' => false + )); + + $this->assertObjectHasAttribute('id', $response); + } + + public function testCreateUserPlaylistPublic() + { + $api = $this->setupMock('user-playlist-public'); + $response = $api->createUserPlaylist('mcgurk', array( + 'name' => 'Test playlist' + )); + + $this->assertTrue($response->public); + } + + public function testDeleteMyTracksSingle() + { + $api = $this->setupMock(); + $response = $api->deleteMyTracks('7EjyzZcbLxW7PaaLua9Ksb'); + + $this->assertTrue($response); + } + + public function testDeleteMyTracksMultiple() + { + $api = $this->setupMock(); + $response = $api->deleteMyTracks(array( + '1id6H6vcwSB9GGv9NXh5cl', + '3mqRLlD9j92BBv1ueFhJ1l' + )); + + $this->assertTrue($response); + } + + public function testDeletePlaylistTracksSingle() + { + $api = $this->setupMock('user-playlist-snapshot-id'); + $response = $api->deletePlaylistTracks('mcgurk', $this->playlistID, array( + array( + 'id' => '7EjyzZcbLxW7PaaLua9Ksb' + ) + )); + + $this->assertNotFalse($response); + } + + public function testDeletePlaylistTracksMultiple() + { + $api = $this->setupMock('user-playlist-snapshot-id'); + $response = $api->deletePlaylistTracks('mcgurk', $this->playlistID, array( + array( + 'id' => '1id6H6vcwSB9GGv9NXh5cl' + ), + array( + 'id' => '3mqRLlD9j92BBv1ueFhJ1l' + ) + )); + + $this->assertNotFalse($response); + } + + public function testGetAlbum() + { + $api = $this->setupMock('album'); + $response = $api->getAlbum('7u6zL7kqpgLPISZYXNTgYk'); + + $this->assertObjectHasAttribute('id', $response); + } + + public function testGetAlbums() + { + $api = $this->setupMock('albums'); + $response = $api->getAlbums(array( + '1oR3KrPIp4CbagPa3PhtPp', + '6lPb7Eoon6QPbscWbMsk6a' + )); + + $this->assertObjectHasAttribute('id', $response->albums[0]); + $this->assertObjectHasAttribute('id', $response->albums[1]); + } + + public function testGetAlbumTracks() + { + $api = $this->setupMock('album-tracks'); + $response = $api->getAlbumTracks('1oR3KrPIp4CbagPa3PhtPp'); + + $this->assertObjectHasAttribute('items', $response); + } + + public function testGetArtist() + { + $api = $this->setupMock('artist'); + $response = $api->getArtist('36QJpDe2go2KgaRleHCDTp'); + + $this->assertObjectHasAttribute('id', $response); + } + + public function testGetArtistRelatedArtists() + { + $api = $this->setupMock('artist-related-artists'); + $response = $api->getArtistRelatedArtists('36QJpDe2go2KgaRleHCDTp'); + + $this->assertNotEmpty($response->artists); + } + + public function testGetArtists() + { + $api = $this->setupMock('artists'); + $response = $api->getArtists(array( + '6v8FB84lnmJs434UJf2Mrm', + '6olE6TJLqED3rqDCT0FyPh' + )); + + $this->assertObjectHasAttribute('id', $response->artists[0]); + $this->assertObjectHasAttribute('id', $response->artists[1]); + } + + public function testGetArtistAlbums() + { + $api = $this->setupMock('artist-albums'); + $response = $api->getArtistAlbums('6v8FB84lnmJs434UJf2Mrm'); + + $this->assertObjectHasAttribute('items', $response); + } + + public function testGetArtistTopTracks() + { + $api = $this->setupMock('artist-top-tracks'); + $response = $api->getArtistTopTracks('6v8FB84lnmJs434UJf2Mrm', 'se'); + + $this->assertObjectHasAttribute('tracks', $response); + } + + public function testGetFeaturedPlaylists() + { + $api = $this->setupMock('featured-playlists'); + $response = $api->getFeaturedPlaylists(array( + 'timestamp' => '2014-10-25T21:00:00' // Saturday night + )); + + $this->assertObjectHasAttribute('playlists', $response); + } + + public function testGetNewReleases() + { + $api = $this->setupMock('albums'); + $response = $api->getNewReleases(array( + 'country' => 'se', + )); + + $this->assertObjectHasAttribute('albums', $response); + } + + public function testGetMySavedTracks() + { + $api = $this->setupMock('user-tracks'); + $response = $api->getMySavedTracks(); + + $this->assertNotEmpty($response->items); + } + + public function testGetTrack() + { + $api = $this->setupMock('track'); + $response = $api->getTrack('7EjyzZcbLxW7PaaLua9Ksb'); + + $this->assertObjectHasAttribute('id', $response); + } + + public function testGetTracks() + { + $api = $this->setupMock('tracks'); + $response = $api->getTracks(array( + '0eGsygTp906u18L0Oimnem', + '1lDWb6b6ieDQ2xT7ewTC3G' + )); + + $this->assertObjectHasAttribute('id', $response->tracks[0]); + $this->assertObjectHasAttribute('id', $response->tracks[1]); + } + + public function testGetUser() + { + $api = $this->setupMock('user'); + $response = $api->getUser('mcgurk'); + + $this->assertObjectHasAttribute('id', $response); + } + + public function testGetUserPlaylists() + { + $api = $this->setupMock('user-playlists'); + $response = $api->getUserPlaylists('mcgurk'); + + $this->assertNotEmpty($response->items); + } + + public function testGetUserPlaylist() + { + $api = $this->setupMock('user-playlist'); + $response = $api->getUserPlaylist('mcgurk', $this->playlistID); + + $this->assertObjectHasAttribute('id', $response); + } + + public function testGetUserPlaylistTracks() + { + $api = $this->setupMock('user-playlist-tracks'); + $response = $api->getUserPlaylistTracks('mcgurk', $this->playlistID); + + $this->assertObjectHasAttribute('track', $response->items[0]); + $this->assertObjectHasAttribute('track', $response->items[1]); + } + + public function testMe() + { + $api = $this->setupMock('user'); + $response = $api->me(); + + $this->assertObjectHasAttribute('id', $response); + } + + public function testMyTracksContainsSingle() + { + $api = $this->setupMock('user-tracks-contain'); + $response = $api->myTracksContains('0oks4FnzhNp5QPTZtoet7c'); + + $this->assertTrue($response[0]); + } + + public function testMyTracksContainsMultiple() + { + $api = $this->setupMock('user-tracks-contains'); + $response = $api->myTracksContains(array( + '0oks4FnzhNp5QPTZtoet7c', + '69kOkLUCkxIZYexIgSG8rq' + )); + + $this->assertTrue($response[0]); + $this->assertTrue($response[1]); + } + + public function testReplacePlaylistTracksSingle() + { + $api = $this->setupMock(201); + $response = $api->replacePlaylistTracks('mcgurk', $this->playlistID, '7eEfbAG7wgV4AgkdTakVFT'); + + $this->assertTrue($response); + } + + public function testReplacePlaylistTracksMultiple() + { + $api = $this->setupMock(201); + $response = $api->replacePlaylistTracks('mcgurk', $this->playlistID, array( + '7kz6GbFr2MCI7PgXJOdq8c', + '6HM9UgDB38hLDFm7e1RF6W' + )); + + $this->assertTrue($response); + } + + public function testSearchAlbum() + { + $api = $this->setupMock('search-album'); + $response = $api->search('blur', 'album'); + + $this->assertNotEmpty($response->albums->items); + } + + public function testSearchArtist() + { + $api = $this->setupMock('search-artist'); + $response = $api->search('blur', 'artist'); + + $this->assertNotEmpty($response->artists->items); + } + + public function testSearchTrack() + { + $api = $this->setupMock('search-track'); + $response = $api->search('song 2', 'track'); + + $this->assertNotEmpty($response->tracks->items); + } + + public function testUpdateUserPlaylist() + { + $api = $this->setupMock(); + $response = $api->updateUserPlaylist('mcgurk', $this->playlistID, array( + 'public' => false + )); + + $this->assertTrue($response); + } +} diff --git a/vendor/jwilsson/spotify-web-api-php/tests/fixtures/album-tracks.json b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/album-tracks.json new file mode 100644 index 0000000..169412e --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/album-tracks.json @@ -0,0 +1,134 @@ +{ + "href" : "https://api.spotify.com/v1/albums/1oR3KrPIp4CbagPa3PhtPp/tracks?offset=0&limit=5", + "items" : [ { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/3qm84nBOXUEQ2vnTfUTTFC" + }, + "href" : "https://api.spotify.com/v1/artists/3qm84nBOXUEQ2vnTfUTTFC", + "id" : "3qm84nBOXUEQ2vnTfUTTFC", + "name" : "Guns N' Roses", + "type" : "artist", + "uri" : "spotify:artist:3qm84nBOXUEQ2vnTfUTTFC" + } ], + "available_markets" : [ "CR", "DO", "GT", "HN", "NI", "PA", "SV" ], + "disc_number" : 1, + "duration_ms" : 273600, + "explicit" : false, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/0oWHLtxWeMJhmwxtrxhNK0" + }, + "href" : "https://api.spotify.com/v1/tracks/0oWHLtxWeMJhmwxtrxhNK0", + "id" : "0oWHLtxWeMJhmwxtrxhNK0", + "name" : "Welcome To The Jungle", + "preview_url" : "https://p.scdn.co/mp3-preview/6ac585f7791a2ec0a60c17e04846345ed7671d0b", + "track_number" : 1, + "type" : "track", + "uri" : "spotify:track:0oWHLtxWeMJhmwxtrxhNK0" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/3qm84nBOXUEQ2vnTfUTTFC" + }, + "href" : "https://api.spotify.com/v1/artists/3qm84nBOXUEQ2vnTfUTTFC", + "id" : "3qm84nBOXUEQ2vnTfUTTFC", + "name" : "Guns N' Roses", + "type" : "artist", + "uri" : "spotify:artist:3qm84nBOXUEQ2vnTfUTTFC" + } ], + "available_markets" : [ "CR", "DO", "GT", "HN", "NI", "PA", "SV" ], + "disc_number" : 1, + "duration_ms" : 202893, + "explicit" : true, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/0fu0HHl1yVC2iCUuyBT144" + }, + "href" : "https://api.spotify.com/v1/tracks/0fu0HHl1yVC2iCUuyBT144", + "id" : "0fu0HHl1yVC2iCUuyBT144", + "name" : "It's So Easy", + "preview_url" : "https://p.scdn.co/mp3-preview/ee696163ab8f41d9bee0b44f6d2c49ab8b28e490", + "track_number" : 2, + "type" : "track", + "uri" : "spotify:track:0fu0HHl1yVC2iCUuyBT144" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/3qm84nBOXUEQ2vnTfUTTFC" + }, + "href" : "https://api.spotify.com/v1/artists/3qm84nBOXUEQ2vnTfUTTFC", + "id" : "3qm84nBOXUEQ2vnTfUTTFC", + "name" : "Guns N' Roses", + "type" : "artist", + "uri" : "spotify:artist:3qm84nBOXUEQ2vnTfUTTFC" + } ], + "available_markets" : [ "CR", "DO", "GT", "HN", "NI", "PA", "SV" ], + "disc_number" : 1, + "duration_ms" : 268506, + "explicit" : false, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/23ZdycsvnFHK9NF1X2V7bc" + }, + "href" : "https://api.spotify.com/v1/tracks/23ZdycsvnFHK9NF1X2V7bc", + "id" : "23ZdycsvnFHK9NF1X2V7bc", + "name" : "Nightrain", + "preview_url" : "https://p.scdn.co/mp3-preview/30e5ca88cae78b02dea6a718b73b7db5e8ddcac6", + "track_number" : 3, + "type" : "track", + "uri" : "spotify:track:23ZdycsvnFHK9NF1X2V7bc" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/3qm84nBOXUEQ2vnTfUTTFC" + }, + "href" : "https://api.spotify.com/v1/artists/3qm84nBOXUEQ2vnTfUTTFC", + "id" : "3qm84nBOXUEQ2vnTfUTTFC", + "name" : "Guns N' Roses", + "type" : "artist", + "uri" : "spotify:artist:3qm84nBOXUEQ2vnTfUTTFC" + } ], + "available_markets" : [ "CR", "DO", "GT", "HN", "NI", "PA", "SV" ], + "disc_number" : 1, + "duration_ms" : 263866, + "explicit" : true, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/0DEGMFohkJUQprEG1wU4SN" + }, + "href" : "https://api.spotify.com/v1/tracks/0DEGMFohkJUQprEG1wU4SN", + "id" : "0DEGMFohkJUQprEG1wU4SN", + "name" : "Out Ta Get Me", + "preview_url" : "https://p.scdn.co/mp3-preview/dc59755154bb63036390eba86ce774db660e1740", + "track_number" : 4, + "type" : "track", + "uri" : "spotify:track:0DEGMFohkJUQprEG1wU4SN" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/3qm84nBOXUEQ2vnTfUTTFC" + }, + "href" : "https://api.spotify.com/v1/artists/3qm84nBOXUEQ2vnTfUTTFC", + "id" : "3qm84nBOXUEQ2vnTfUTTFC", + "name" : "Guns N' Roses", + "type" : "artist", + "uri" : "spotify:artist:3qm84nBOXUEQ2vnTfUTTFC" + } ], + "available_markets" : [ "CR", "DO", "GT", "HN", "NI", "PA", "SV" ], + "disc_number" : 1, + "duration_ms" : 228893, + "explicit" : true, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/0waeZEK1KpCuUvXkXCTOM2" + }, + "href" : "https://api.spotify.com/v1/tracks/0waeZEK1KpCuUvXkXCTOM2", + "id" : "0waeZEK1KpCuUvXkXCTOM2", + "name" : "Mr. Brownstone", + "preview_url" : "https://p.scdn.co/mp3-preview/7ef4ea55e9a9183f9ca504ee532b23ad90b944b3", + "track_number" : 5, + "type" : "track", + "uri" : "spotify:track:0waeZEK1KpCuUvXkXCTOM2" + } ], + "limit" : 5, + "next" : "https://api.spotify.com/v1/albums/1oR3KrPIp4CbagPa3PhtPp/tracks?offset=5&limit=5", + "offset" : 0, + "previous" : null, + "total" : 12 +} diff --git a/vendor/jwilsson/spotify-web-api-php/tests/fixtures/album.json b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/album.json new file mode 100644 index 0000000..802e8c8 --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/album.json @@ -0,0 +1,376 @@ +{ + "album_type" : "album", + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/4tZwfgrHOc3mvqYlEYSvVi" + }, + "href" : "https://api.spotify.com/v1/artists/4tZwfgrHOc3mvqYlEYSvVi", + "id" : "4tZwfgrHOc3mvqYlEYSvVi", + "name" : "Daft Punk", + "type" : "artist", + "uri" : "spotify:artist:4tZwfgrHOc3mvqYlEYSvVi" + } ], + "available_markets" : [ "AD", "AR", "AU", "BE", "BG", "BO", "BR", "CA", "CL", "CO", "CR", "CY", "CZ", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_ids" : { + "upc" : "5099951165857" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/album/7u6zL7kqpgLPISZYXNTgYk" + }, + "genres" : [ ], + "href" : "https://api.spotify.com/v1/albums/7u6zL7kqpgLPISZYXNTgYk", + "id" : "7u6zL7kqpgLPISZYXNTgYk", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/caede1fa7bfa10efabdfbb35bd826803751330a2", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/cb29ff884a77f2d6b91455f52776e4f31691d872", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/151b6ea0f60d613b0cf4c74b6ced40adbd49a771", + "width" : 64 + } ], + "name" : "Alive 2007", + "popularity" : 66, + "release_date" : "2007-11-16", + "release_date_precision" : "day", + "tracks" : { + "href" : "https://api.spotify.com/v1/albums/7u6zL7kqpgLPISZYXNTgYk/tracks?offset=0&limit=50", + "items" : [ { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/4tZwfgrHOc3mvqYlEYSvVi" + }, + "href" : "https://api.spotify.com/v1/artists/4tZwfgrHOc3mvqYlEYSvVi", + "id" : "4tZwfgrHOc3mvqYlEYSvVi", + "name" : "Daft Punk", + "type" : "artist", + "uri" : "spotify:artist:4tZwfgrHOc3mvqYlEYSvVi" + } ], + "available_markets" : [ "AD", "AR", "AU", "BE", "BG", "BO", "BR", "CA", "CL", "CO", "CR", "CY", "CZ", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 387506, + "explicit" : false, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/5eS6pTvDNOvh2kyxeZtK3r" + }, + "href" : "https://api.spotify.com/v1/tracks/5eS6pTvDNOvh2kyxeZtK3r", + "id" : "5eS6pTvDNOvh2kyxeZtK3r", + "name" : "Robot Rock / Oh Yeah", + "preview_url" : "https://p.scdn.co/mp3-preview/a3e3771fb66277739d1e5d931daf63fe49d5f904", + "track_number" : 1, + "type" : "track", + "uri" : "spotify:track:5eS6pTvDNOvh2kyxeZtK3r" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/4tZwfgrHOc3mvqYlEYSvVi" + }, + "href" : "https://api.spotify.com/v1/artists/4tZwfgrHOc3mvqYlEYSvVi", + "id" : "4tZwfgrHOc3mvqYlEYSvVi", + "name" : "Daft Punk", + "type" : "artist", + "uri" : "spotify:artist:4tZwfgrHOc3mvqYlEYSvVi" + } ], + "available_markets" : [ "AD", "AR", "AU", "BE", "BG", "BO", "BR", "CA", "CL", "CO", "CR", "CY", "CZ", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 329653, + "explicit" : false, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/4IdiGMOzEYXOh2897XOV8i" + }, + "href" : "https://api.spotify.com/v1/tracks/4IdiGMOzEYXOh2897XOV8i", + "id" : "4IdiGMOzEYXOh2897XOV8i", + "name" : "Touch It / Technologic", + "preview_url" : "https://p.scdn.co/mp3-preview/30bfcdca7501304bf2ad2d896407fe4e43bcba22", + "track_number" : 2, + "type" : "track", + "uri" : "spotify:track:4IdiGMOzEYXOh2897XOV8i" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/4tZwfgrHOc3mvqYlEYSvVi" + }, + "href" : "https://api.spotify.com/v1/artists/4tZwfgrHOc3mvqYlEYSvVi", + "id" : "4tZwfgrHOc3mvqYlEYSvVi", + "name" : "Daft Punk", + "type" : "artist", + "uri" : "spotify:artist:4tZwfgrHOc3mvqYlEYSvVi" + } ], + "available_markets" : [ "AD", "AR", "AU", "BE", "BG", "BO", "BR", "CA", "CL", "CO", "CR", "CY", "CZ", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 290840, + "explicit" : false, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/1E8S3CSv20KrKT0C1yAjkO" + }, + "href" : "https://api.spotify.com/v1/tracks/1E8S3CSv20KrKT0C1yAjkO", + "id" : "1E8S3CSv20KrKT0C1yAjkO", + "name" : "Television Rules The Nation / Crescendolls", + "preview_url" : "https://p.scdn.co/mp3-preview/035dd1ef6d29dbbd3388852f76e52024c6f8d417", + "track_number" : 3, + "type" : "track", + "uri" : "spotify:track:1E8S3CSv20KrKT0C1yAjkO" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/4tZwfgrHOc3mvqYlEYSvVi" + }, + "href" : "https://api.spotify.com/v1/artists/4tZwfgrHOc3mvqYlEYSvVi", + "id" : "4tZwfgrHOc3mvqYlEYSvVi", + "name" : "Daft Punk", + "type" : "artist", + "uri" : "spotify:artist:4tZwfgrHOc3mvqYlEYSvVi" + } ], + "available_markets" : [ "AD", "AR", "AU", "BE", "BG", "BO", "BR", "CA", "CL", "CO", "CR", "CY", "CZ", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 421600, + "explicit" : false, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/3n4ow4XGzwSIPxA3JHLF9p" + }, + "href" : "https://api.spotify.com/v1/tracks/3n4ow4XGzwSIPxA3JHLF9p", + "id" : "3n4ow4XGzwSIPxA3JHLF9p", + "name" : "Too Long / Steam Machine", + "preview_url" : "https://p.scdn.co/mp3-preview/33820c3932a69292ec77de62417f60cc4f4da79e", + "track_number" : 4, + "type" : "track", + "uri" : "spotify:track:3n4ow4XGzwSIPxA3JHLF9p" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/4tZwfgrHOc3mvqYlEYSvVi" + }, + "href" : "https://api.spotify.com/v1/artists/4tZwfgrHOc3mvqYlEYSvVi", + "id" : "4tZwfgrHOc3mvqYlEYSvVi", + "name" : "Daft Punk", + "type" : "artist", + "uri" : "spotify:artist:4tZwfgrHOc3mvqYlEYSvVi" + } ], + "available_markets" : [ "AD", "AR", "AU", "BE", "BG", "BO", "BR", "CA", "CL", "CO", "CR", "CY", "CZ", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 342626, + "explicit" : false, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/5RByQFt9Mlo8hDYJ921tCv" + }, + "href" : "https://api.spotify.com/v1/tracks/5RByQFt9Mlo8hDYJ921tCv", + "id" : "5RByQFt9Mlo8hDYJ921tCv", + "name" : "Around The World / Harder Better Faster Stronger", + "preview_url" : "https://p.scdn.co/mp3-preview/45a4603cb95901c3fc7aa5b9073f1187f0dc62e9", + "track_number" : 5, + "type" : "track", + "uri" : "spotify:track:5RByQFt9Mlo8hDYJ921tCv" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/4tZwfgrHOc3mvqYlEYSvVi" + }, + "href" : "https://api.spotify.com/v1/artists/4tZwfgrHOc3mvqYlEYSvVi", + "id" : "4tZwfgrHOc3mvqYlEYSvVi", + "name" : "Daft Punk", + "type" : "artist", + "uri" : "spotify:artist:4tZwfgrHOc3mvqYlEYSvVi" + } ], + "available_markets" : [ "AD", "AR", "AU", "BE", "BG", "BO", "BR", "CA", "CL", "CO", "CR", "CY", "CZ", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 431506, + "explicit" : false, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/3Ons6C3wXBMi8nYpLBMlVe" + }, + "href" : "https://api.spotify.com/v1/tracks/3Ons6C3wXBMi8nYpLBMlVe", + "id" : "3Ons6C3wXBMi8nYpLBMlVe", + "name" : "Burnin' / Too Long", + "preview_url" : "https://p.scdn.co/mp3-preview/636c0ed471ad077b6a665b21fcc8f1fbb35c5d1e", + "track_number" : 6, + "type" : "track", + "uri" : "spotify:track:3Ons6C3wXBMi8nYpLBMlVe" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/4tZwfgrHOc3mvqYlEYSvVi" + }, + "href" : "https://api.spotify.com/v1/artists/4tZwfgrHOc3mvqYlEYSvVi", + "id" : "4tZwfgrHOc3mvqYlEYSvVi", + "name" : "Daft Punk", + "type" : "artist", + "uri" : "spotify:artist:4tZwfgrHOc3mvqYlEYSvVi" + } ], + "available_markets" : [ "AD", "AR", "AU", "BE", "BG", "BO", "BR", "CA", "CL", "CO", "CR", "CY", "CZ", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 295226, + "explicit" : false, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/5XzGyYZemDuCG3OdbhVFvh" + }, + "href" : "https://api.spotify.com/v1/tracks/5XzGyYZemDuCG3OdbhVFvh", + "id" : "5XzGyYZemDuCG3OdbhVFvh", + "name" : "Face To Face / Short Circuit", + "preview_url" : "https://p.scdn.co/mp3-preview/424ce948a9063b5d7a20eb1d60e3be1f7e6e60bd", + "track_number" : 7, + "type" : "track", + "uri" : "spotify:track:5XzGyYZemDuCG3OdbhVFvh" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/4tZwfgrHOc3mvqYlEYSvVi" + }, + "href" : "https://api.spotify.com/v1/artists/4tZwfgrHOc3mvqYlEYSvVi", + "id" : "4tZwfgrHOc3mvqYlEYSvVi", + "name" : "Daft Punk", + "type" : "artist", + "uri" : "spotify:artist:4tZwfgrHOc3mvqYlEYSvVi" + } ], + "available_markets" : [ "AD", "AR", "AU", "BE", "BG", "BO", "BR", "CA", "CL", "CO", "CR", "CY", "CZ", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 370533, + "explicit" : false, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/1H1d4dr7Hk5Rrd8Tb5y5yr" + }, + "href" : "https://api.spotify.com/v1/tracks/1H1d4dr7Hk5Rrd8Tb5y5yr", + "id" : "1H1d4dr7Hk5Rrd8Tb5y5yr", + "name" : "One More Time / Aerodynamic", + "preview_url" : "https://p.scdn.co/mp3-preview/5e17eb92e1d0f88345dfbe6f2eb23241277df156", + "track_number" : 8, + "type" : "track", + "uri" : "spotify:track:1H1d4dr7Hk5Rrd8Tb5y5yr" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/4tZwfgrHOc3mvqYlEYSvVi" + }, + "href" : "https://api.spotify.com/v1/artists/4tZwfgrHOc3mvqYlEYSvVi", + "id" : "4tZwfgrHOc3mvqYlEYSvVi", + "name" : "Daft Punk", + "type" : "artist", + "uri" : "spotify:artist:4tZwfgrHOc3mvqYlEYSvVi" + } ], + "available_markets" : [ "AD", "AR", "AU", "BE", "BG", "BO", "BR", "CA", "CL", "CO", "CR", "CY", "CZ", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 211760, + "explicit" : false, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/0rFTPTXuVFIOYGnqXbWm3X" + }, + "href" : "https://api.spotify.com/v1/tracks/0rFTPTXuVFIOYGnqXbWm3X", + "id" : "0rFTPTXuVFIOYGnqXbWm3X", + "name" : "Aerodynamic Beats / Gabrielle , Forget About The World", + "preview_url" : "https://p.scdn.co/mp3-preview/9925ccb0764bc6b0aca8282c3abd17fe1dc5c8d0", + "track_number" : 9, + "type" : "track", + "uri" : "spotify:track:0rFTPTXuVFIOYGnqXbWm3X" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/4tZwfgrHOc3mvqYlEYSvVi" + }, + "href" : "https://api.spotify.com/v1/artists/4tZwfgrHOc3mvqYlEYSvVi", + "id" : "4tZwfgrHOc3mvqYlEYSvVi", + "name" : "Daft Punk", + "type" : "artist", + "uri" : "spotify:artist:4tZwfgrHOc3mvqYlEYSvVi" + } ], + "available_markets" : [ "AD", "AR", "AU", "BE", "BG", "BO", "BR", "CA", "CL", "CO", "CR", "CY", "CZ", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 622480, + "explicit" : false, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/3qVD67mL0JxgU0VQVKR52G" + }, + "href" : "https://api.spotify.com/v1/tracks/3qVD67mL0JxgU0VQVKR52G", + "id" : "3qVD67mL0JxgU0VQVKR52G", + "name" : "Prime Time Of Your Life / Brainwasher /Rollin 'and Scratchin' / Alive", + "preview_url" : "https://p.scdn.co/mp3-preview/8243dd4c8dfd01886c6ec3698c1e8d61bc4d6690", + "track_number" : 10, + "type" : "track", + "uri" : "spotify:track:3qVD67mL0JxgU0VQVKR52G" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/4tZwfgrHOc3mvqYlEYSvVi" + }, + "href" : "https://api.spotify.com/v1/artists/4tZwfgrHOc3mvqYlEYSvVi", + "id" : "4tZwfgrHOc3mvqYlEYSvVi", + "name" : "Daft Punk", + "type" : "artist", + "uri" : "spotify:artist:4tZwfgrHOc3mvqYlEYSvVi" + } ], + "available_markets" : [ "AD", "AR", "AU", "BE", "BG", "BO", "BR", "CA", "CL", "CO", "CR", "CY", "CZ", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 396973, + "explicit" : false, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/5OWhFeNXZ2RGbsGpl3rIc3" + }, + "href" : "https://api.spotify.com/v1/tracks/5OWhFeNXZ2RGbsGpl3rIc3", + "id" : "5OWhFeNXZ2RGbsGpl3rIc3", + "name" : "Da Funk / Dadftendirekt", + "preview_url" : "https://p.scdn.co/mp3-preview/f6593f9c5b6365004b8ec182bf26c4baabffe358", + "track_number" : 11, + "type" : "track", + "uri" : "spotify:track:5OWhFeNXZ2RGbsGpl3rIc3" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/4tZwfgrHOc3mvqYlEYSvVi" + }, + "href" : "https://api.spotify.com/v1/artists/4tZwfgrHOc3mvqYlEYSvVi", + "id" : "4tZwfgrHOc3mvqYlEYSvVi", + "name" : "Daft Punk", + "type" : "artist", + "uri" : "spotify:artist:4tZwfgrHOc3mvqYlEYSvVi" + } ], + "available_markets" : [ "AD", "AR", "AU", "BE", "BG", "BO", "BR", "CA", "CL", "CO", "CR", "CY", "CZ", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 341106, + "explicit" : false, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/029O4HWI1pVXLfFdfQd1Jb" + }, + "href" : "https://api.spotify.com/v1/tracks/029O4HWI1pVXLfFdfQd1Jb", + "id" : "029O4HWI1pVXLfFdfQd1Jb", + "name" : "Superheroes / Human After All / Rock'n Roll", + "preview_url" : "https://p.scdn.co/mp3-preview/533dc9813b1ea762b1a2d1df1c69a29f75b3202a", + "track_number" : 12, + "type" : "track", + "uri" : "spotify:track:029O4HWI1pVXLfFdfQd1Jb" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/2KSssk4CH6yZFWMBqzfC8k" + }, + "href" : "https://api.spotify.com/v1/artists/2KSssk4CH6yZFWMBqzfC8k", + "id" : "2KSssk4CH6yZFWMBqzfC8k", + "name" : "Daft Punk - Stardust", + "type" : "artist", + "uri" : "spotify:artist:2KSssk4CH6yZFWMBqzfC8k" + } ], + "available_markets" : [ "AD", "AR", "AU", "BE", "BG", "BO", "BR", "CA", "CL", "CO", "CR", "CY", "CZ", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 598666, + "explicit" : false, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/5q2KGgJV5l4MAnnGIrvKSK" + }, + "href" : "https://api.spotify.com/v1/tracks/5q2KGgJV5l4MAnnGIrvKSK", + "id" : "5q2KGgJV5l4MAnnGIrvKSK", + "name" : "Human After All/Together/One More Time/Music Sounds Better With You", + "preview_url" : "https://p.scdn.co/mp3-preview/d2844ad5f21012d2f56f5cbf0caee51600e07baf", + "track_number" : 13, + "type" : "track", + "uri" : "spotify:track:5q2KGgJV5l4MAnnGIrvKSK" + } ], + "limit" : 50, + "next" : null, + "offset" : 0, + "previous" : null, + "total" : 13 + }, + "type" : "album", + "uri" : "spotify:album:7u6zL7kqpgLPISZYXNTgYk" +} diff --git a/vendor/jwilsson/spotify-web-api-php/tests/fixtures/albums.json b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/albums.json new file mode 100644 index 0000000..2dae20b --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/albums.json @@ -0,0 +1,828 @@ +{ + "albums" : [ { + "album_type" : "album", + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/3qm84nBOXUEQ2vnTfUTTFC" + }, + "href" : "https://api.spotify.com/v1/artists/3qm84nBOXUEQ2vnTfUTTFC", + "id" : "3qm84nBOXUEQ2vnTfUTTFC", + "name" : "Guns N' Roses", + "type" : "artist", + "uri" : "spotify:artist:3qm84nBOXUEQ2vnTfUTTFC" + } ], + "available_markets" : [ "CR", "DO", "GT", "HN", "NI", "PA", "SV" ], + "external_ids" : { + "upc" : "00720642414828" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/album/1oR3KrPIp4CbagPa3PhtPp" + }, + "genres" : [ ], + "href" : "https://api.spotify.com/v1/albums/1oR3KrPIp4CbagPa3PhtPp", + "id" : "1oR3KrPIp4CbagPa3PhtPp", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/69cd6069536547d074727886fc33fb3b77dabbea", + "width" : 639 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/d2fdd37fa854fce9e14744ca41c8e149dc612564", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/04f56ac62c83ad6e596062be61c1a334808f2b8b", + "width" : 64 + } ], + "name" : "Appetite For Destruction", + "popularity" : 28, + "release_date" : "1987", + "release_date_precision" : "year", + "tracks" : { + "href" : "https://api.spotify.com/v1/albums/1oR3KrPIp4CbagPa3PhtPp/tracks?offset=0&limit=50", + "items" : [ { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/3qm84nBOXUEQ2vnTfUTTFC" + }, + "href" : "https://api.spotify.com/v1/artists/3qm84nBOXUEQ2vnTfUTTFC", + "id" : "3qm84nBOXUEQ2vnTfUTTFC", + "name" : "Guns N' Roses", + "type" : "artist", + "uri" : "spotify:artist:3qm84nBOXUEQ2vnTfUTTFC" + } ], + "available_markets" : [ "CR", "DO", "GT", "HN", "NI", "PA", "SV" ], + "disc_number" : 1, + "duration_ms" : 273600, + "explicit" : false, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/0oWHLtxWeMJhmwxtrxhNK0" + }, + "href" : "https://api.spotify.com/v1/tracks/0oWHLtxWeMJhmwxtrxhNK0", + "id" : "0oWHLtxWeMJhmwxtrxhNK0", + "name" : "Welcome To The Jungle", + "preview_url" : "https://p.scdn.co/mp3-preview/6ac585f7791a2ec0a60c17e04846345ed7671d0b", + "track_number" : 1, + "type" : "track", + "uri" : "spotify:track:0oWHLtxWeMJhmwxtrxhNK0" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/3qm84nBOXUEQ2vnTfUTTFC" + }, + "href" : "https://api.spotify.com/v1/artists/3qm84nBOXUEQ2vnTfUTTFC", + "id" : "3qm84nBOXUEQ2vnTfUTTFC", + "name" : "Guns N' Roses", + "type" : "artist", + "uri" : "spotify:artist:3qm84nBOXUEQ2vnTfUTTFC" + } ], + "available_markets" : [ "CR", "DO", "GT", "HN", "NI", "PA", "SV" ], + "disc_number" : 1, + "duration_ms" : 202893, + "explicit" : true, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/0fu0HHl1yVC2iCUuyBT144" + }, + "href" : "https://api.spotify.com/v1/tracks/0fu0HHl1yVC2iCUuyBT144", + "id" : "0fu0HHl1yVC2iCUuyBT144", + "name" : "It's So Easy", + "preview_url" : "https://p.scdn.co/mp3-preview/ee696163ab8f41d9bee0b44f6d2c49ab8b28e490", + "track_number" : 2, + "type" : "track", + "uri" : "spotify:track:0fu0HHl1yVC2iCUuyBT144" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/3qm84nBOXUEQ2vnTfUTTFC" + }, + "href" : "https://api.spotify.com/v1/artists/3qm84nBOXUEQ2vnTfUTTFC", + "id" : "3qm84nBOXUEQ2vnTfUTTFC", + "name" : "Guns N' Roses", + "type" : "artist", + "uri" : "spotify:artist:3qm84nBOXUEQ2vnTfUTTFC" + } ], + "available_markets" : [ "CR", "DO", "GT", "HN", "NI", "PA", "SV" ], + "disc_number" : 1, + "duration_ms" : 268506, + "explicit" : false, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/23ZdycsvnFHK9NF1X2V7bc" + }, + "href" : "https://api.spotify.com/v1/tracks/23ZdycsvnFHK9NF1X2V7bc", + "id" : "23ZdycsvnFHK9NF1X2V7bc", + "name" : "Nightrain", + "preview_url" : "https://p.scdn.co/mp3-preview/30e5ca88cae78b02dea6a718b73b7db5e8ddcac6", + "track_number" : 3, + "type" : "track", + "uri" : "spotify:track:23ZdycsvnFHK9NF1X2V7bc" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/3qm84nBOXUEQ2vnTfUTTFC" + }, + "href" : "https://api.spotify.com/v1/artists/3qm84nBOXUEQ2vnTfUTTFC", + "id" : "3qm84nBOXUEQ2vnTfUTTFC", + "name" : "Guns N' Roses", + "type" : "artist", + "uri" : "spotify:artist:3qm84nBOXUEQ2vnTfUTTFC" + } ], + "available_markets" : [ "CR", "DO", "GT", "HN", "NI", "PA", "SV" ], + "disc_number" : 1, + "duration_ms" : 263866, + "explicit" : true, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/0DEGMFohkJUQprEG1wU4SN" + }, + "href" : "https://api.spotify.com/v1/tracks/0DEGMFohkJUQprEG1wU4SN", + "id" : "0DEGMFohkJUQprEG1wU4SN", + "name" : "Out Ta Get Me", + "preview_url" : "https://p.scdn.co/mp3-preview/dc59755154bb63036390eba86ce774db660e1740", + "track_number" : 4, + "type" : "track", + "uri" : "spotify:track:0DEGMFohkJUQprEG1wU4SN" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/3qm84nBOXUEQ2vnTfUTTFC" + }, + "href" : "https://api.spotify.com/v1/artists/3qm84nBOXUEQ2vnTfUTTFC", + "id" : "3qm84nBOXUEQ2vnTfUTTFC", + "name" : "Guns N' Roses", + "type" : "artist", + "uri" : "spotify:artist:3qm84nBOXUEQ2vnTfUTTFC" + } ], + "available_markets" : [ "CR", "DO", "GT", "HN", "NI", "PA", "SV" ], + "disc_number" : 1, + "duration_ms" : 228893, + "explicit" : true, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/0waeZEK1KpCuUvXkXCTOM2" + }, + "href" : "https://api.spotify.com/v1/tracks/0waeZEK1KpCuUvXkXCTOM2", + "id" : "0waeZEK1KpCuUvXkXCTOM2", + "name" : "Mr. Brownstone", + "preview_url" : "https://p.scdn.co/mp3-preview/7ef4ea55e9a9183f9ca504ee532b23ad90b944b3", + "track_number" : 5, + "type" : "track", + "uri" : "spotify:track:0waeZEK1KpCuUvXkXCTOM2" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/3qm84nBOXUEQ2vnTfUTTFC" + }, + "href" : "https://api.spotify.com/v1/artists/3qm84nBOXUEQ2vnTfUTTFC", + "id" : "3qm84nBOXUEQ2vnTfUTTFC", + "name" : "Guns N' Roses", + "type" : "artist", + "uri" : "spotify:artist:3qm84nBOXUEQ2vnTfUTTFC" + } ], + "available_markets" : [ "CR", "DO", "GT", "HN", "NI", "PA", "SV" ], + "disc_number" : 1, + "duration_ms" : 406306, + "explicit" : false, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/2pDPnlF496mf3EBwrTCHN2" + }, + "href" : "https://api.spotify.com/v1/tracks/2pDPnlF496mf3EBwrTCHN2", + "id" : "2pDPnlF496mf3EBwrTCHN2", + "name" : "Paradise City", + "preview_url" : "https://p.scdn.co/mp3-preview/8f2880010d7b8205ee0272bef424ccee6cb0e15e", + "track_number" : 6, + "type" : "track", + "uri" : "spotify:track:2pDPnlF496mf3EBwrTCHN2" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/3qm84nBOXUEQ2vnTfUTTFC" + }, + "href" : "https://api.spotify.com/v1/artists/3qm84nBOXUEQ2vnTfUTTFC", + "id" : "3qm84nBOXUEQ2vnTfUTTFC", + "name" : "Guns N' Roses", + "type" : "artist", + "uri" : "spotify:artist:3qm84nBOXUEQ2vnTfUTTFC" + } ], + "available_markets" : [ "CR", "DO", "GT", "HN", "NI", "PA", "SV" ], + "disc_number" : 1, + "duration_ms" : 219933, + "explicit" : true, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/2ybmxruJ8jlFtlb9Ui3kju" + }, + "href" : "https://api.spotify.com/v1/tracks/2ybmxruJ8jlFtlb9Ui3kju", + "id" : "2ybmxruJ8jlFtlb9Ui3kju", + "name" : "My Michelle", + "preview_url" : "https://p.scdn.co/mp3-preview/afc8032449ed88c7bf06f6182e8300a985a5f691", + "track_number" : 7, + "type" : "track", + "uri" : "spotify:track:2ybmxruJ8jlFtlb9Ui3kju" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/3qm84nBOXUEQ2vnTfUTTFC" + }, + "href" : "https://api.spotify.com/v1/artists/3qm84nBOXUEQ2vnTfUTTFC", + "id" : "3qm84nBOXUEQ2vnTfUTTFC", + "name" : "Guns N' Roses", + "type" : "artist", + "uri" : "spotify:artist:3qm84nBOXUEQ2vnTfUTTFC" + } ], + "available_markets" : [ "CR", "DO", "GT", "HN", "NI", "PA", "SV" ], + "disc_number" : 1, + "duration_ms" : 229041, + "explicit" : true, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/2DshFvtiZTTuuLPWi2m2am" + }, + "href" : "https://api.spotify.com/v1/tracks/2DshFvtiZTTuuLPWi2m2am", + "id" : "2DshFvtiZTTuuLPWi2m2am", + "name" : "Think About You", + "preview_url" : "https://p.scdn.co/mp3-preview/d8a34af92c695c6e6a56b0a792913c5e49e36392", + "track_number" : 8, + "type" : "track", + "uri" : "spotify:track:2DshFvtiZTTuuLPWi2m2am" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/3qm84nBOXUEQ2vnTfUTTFC" + }, + "href" : "https://api.spotify.com/v1/artists/3qm84nBOXUEQ2vnTfUTTFC", + "id" : "3qm84nBOXUEQ2vnTfUTTFC", + "name" : "Guns N' Roses", + "type" : "artist", + "uri" : "spotify:artist:3qm84nBOXUEQ2vnTfUTTFC" + } ], + "available_markets" : [ "CR", "DO", "GT", "HN", "NI", "PA", "SV" ], + "disc_number" : 1, + "duration_ms" : 356400, + "explicit" : false, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/1kDYCn9VIDmOIbLZ2Xc7OO" + }, + "href" : "https://api.spotify.com/v1/tracks/1kDYCn9VIDmOIbLZ2Xc7OO", + "id" : "1kDYCn9VIDmOIbLZ2Xc7OO", + "name" : "Sweet Child O' Mine", + "preview_url" : "https://p.scdn.co/mp3-preview/6af5e89d4007d378eab8322d10c38de1b8264a92", + "track_number" : 9, + "type" : "track", + "uri" : "spotify:track:1kDYCn9VIDmOIbLZ2Xc7OO" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/3qm84nBOXUEQ2vnTfUTTFC" + }, + "href" : "https://api.spotify.com/v1/artists/3qm84nBOXUEQ2vnTfUTTFC", + "id" : "3qm84nBOXUEQ2vnTfUTTFC", + "name" : "Guns N' Roses", + "type" : "artist", + "uri" : "spotify:artist:3qm84nBOXUEQ2vnTfUTTFC" + } ], + "available_markets" : [ "CR", "DO", "GT", "HN", "NI", "PA", "SV" ], + "disc_number" : 1, + "duration_ms" : 197200, + "explicit" : true, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/2xVRxDQUXxWwpfyCg0fGTB" + }, + "href" : "https://api.spotify.com/v1/tracks/2xVRxDQUXxWwpfyCg0fGTB", + "id" : "2xVRxDQUXxWwpfyCg0fGTB", + "name" : "You're Crazy", + "preview_url" : "https://p.scdn.co/mp3-preview/5ba00454804e8c20e49856c75d97e02b252f3dd7", + "track_number" : 10, + "type" : "track", + "uri" : "spotify:track:2xVRxDQUXxWwpfyCg0fGTB" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/3qm84nBOXUEQ2vnTfUTTFC" + }, + "href" : "https://api.spotify.com/v1/artists/3qm84nBOXUEQ2vnTfUTTFC", + "id" : "3qm84nBOXUEQ2vnTfUTTFC", + "name" : "Guns N' Roses", + "type" : "artist", + "uri" : "spotify:artist:3qm84nBOXUEQ2vnTfUTTFC" + } ], + "available_markets" : [ "CR", "DO", "GT", "HN", "NI", "PA", "SV" ], + "disc_number" : 1, + "duration_ms" : 206360, + "explicit" : true, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/1vcOLpfd7yeBpD5Fo2ouAJ" + }, + "href" : "https://api.spotify.com/v1/tracks/1vcOLpfd7yeBpD5Fo2ouAJ", + "id" : "1vcOLpfd7yeBpD5Fo2ouAJ", + "name" : "Anything Goes", + "preview_url" : "https://p.scdn.co/mp3-preview/40e5f1572e5e04f969457aeb9aa4878132765a26", + "track_number" : 11, + "type" : "track", + "uri" : "spotify:track:1vcOLpfd7yeBpD5Fo2ouAJ" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/3qm84nBOXUEQ2vnTfUTTFC" + }, + "href" : "https://api.spotify.com/v1/artists/3qm84nBOXUEQ2vnTfUTTFC", + "id" : "3qm84nBOXUEQ2vnTfUTTFC", + "name" : "Guns N' Roses", + "type" : "artist", + "uri" : "spotify:artist:3qm84nBOXUEQ2vnTfUTTFC" + } ], + "available_markets" : [ "CR", "DO", "GT", "HN", "NI", "PA", "SV" ], + "disc_number" : 1, + "duration_ms" : 375306, + "explicit" : false, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/0PdQL1PzkOA3SUqhedZ0KL" + }, + "href" : "https://api.spotify.com/v1/tracks/0PdQL1PzkOA3SUqhedZ0KL", + "id" : "0PdQL1PzkOA3SUqhedZ0KL", + "name" : "Rocket Queen", + "preview_url" : "https://p.scdn.co/mp3-preview/668753daeda148ef310f00f979f68fcb27874760", + "track_number" : 12, + "type" : "track", + "uri" : "spotify:track:0PdQL1PzkOA3SUqhedZ0KL" + } ], + "limit" : 50, + "next" : null, + "offset" : 0, + "previous" : null, + "total" : 12 + }, + "type" : "album", + "uri" : "spotify:album:1oR3KrPIp4CbagPa3PhtPp" + }, { + "album_type" : "album", + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/2qFr8w5sWUITRlzZ9kZotF" + }, + "href" : "https://api.spotify.com/v1/artists/2qFr8w5sWUITRlzZ9kZotF", + "id" : "2qFr8w5sWUITRlzZ9kZotF", + "name" : "Jefferson Airplane", + "type" : "artist", + "uri" : "spotify:artist:2qFr8w5sWUITRlzZ9kZotF" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TW", "US", "UY" ], + "external_ids" : { + "upc" : "828765035125" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/album/6lPb7Eoon6QPbscWbMsk6a" + }, + "genres" : [ ], + "href" : "https://api.spotify.com/v1/albums/6lPb7Eoon6QPbscWbMsk6a", + "id" : "6lPb7Eoon6QPbscWbMsk6a", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/cca72254d6884450ac4dd999ed9bf42aad7220b7", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/5dd256412a8fc02cdfd8f7bcc014d6ca0a4ed75d", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/cc4b7add5be5bfa66559aed0f7a02c72cf881f81", + "width" : 64 + } ], + "name" : "Surrealistic Pillow", + "popularity" : 57, + "release_date" : "1967", + "release_date_precision" : "year", + "tracks" : { + "href" : "https://api.spotify.com/v1/albums/6lPb7Eoon6QPbscWbMsk6a/tracks?offset=0&limit=50", + "items" : [ { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/2qFr8w5sWUITRlzZ9kZotF" + }, + "href" : "https://api.spotify.com/v1/artists/2qFr8w5sWUITRlzZ9kZotF", + "id" : "2qFr8w5sWUITRlzZ9kZotF", + "name" : "Jefferson Airplane", + "type" : "artist", + "uri" : "spotify:artist:2qFr8w5sWUITRlzZ9kZotF" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 188080, + "explicit" : false, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/7GeQk8PqG5NAENxCRLcw0B" + }, + "href" : "https://api.spotify.com/v1/tracks/7GeQk8PqG5NAENxCRLcw0B", + "id" : "7GeQk8PqG5NAENxCRLcw0B", + "name" : "She Has Funny Cars", + "preview_url" : "https://p.scdn.co/mp3-preview/87e9cc26016df6ab9647bece02051ba78e52ee23", + "track_number" : 1, + "type" : "track", + "uri" : "spotify:track:7GeQk8PqG5NAENxCRLcw0B" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/2qFr8w5sWUITRlzZ9kZotF" + }, + "href" : "https://api.spotify.com/v1/artists/2qFr8w5sWUITRlzZ9kZotF", + "id" : "2qFr8w5sWUITRlzZ9kZotF", + "name" : "Jefferson Airplane", + "type" : "artist", + "uri" : "spotify:artist:2qFr8w5sWUITRlzZ9kZotF" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 174840, + "explicit" : false, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/4uGIJG1jYFonGc4LGp5uQL" + }, + "href" : "https://api.spotify.com/v1/tracks/4uGIJG1jYFonGc4LGp5uQL", + "id" : "4uGIJG1jYFonGc4LGp5uQL", + "name" : "Somebody to Love - Pop #5/chart debut: 4/1/67", + "preview_url" : "https://p.scdn.co/mp3-preview/fa1211bd72d399d5c19724a623cd5e59c4bd7339", + "track_number" : 2, + "type" : "track", + "uri" : "spotify:track:4uGIJG1jYFonGc4LGp5uQL" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/2qFr8w5sWUITRlzZ9kZotF" + }, + "href" : "https://api.spotify.com/v1/artists/2qFr8w5sWUITRlzZ9kZotF", + "id" : "2qFr8w5sWUITRlzZ9kZotF", + "name" : "Jefferson Airplane", + "type" : "artist", + "uri" : "spotify:artist:2qFr8w5sWUITRlzZ9kZotF" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 179720, + "explicit" : false, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/6V1f1eJ6MPNfLQXPmzqXja" + }, + "href" : "https://api.spotify.com/v1/tracks/6V1f1eJ6MPNfLQXPmzqXja", + "id" : "6V1f1eJ6MPNfLQXPmzqXja", + "name" : "My Best Friend", + "preview_url" : "https://p.scdn.co/mp3-preview/a6bcedd49f87ec32eec5a2eb69c62bf3c73c36e1", + "track_number" : 3, + "type" : "track", + "uri" : "spotify:track:6V1f1eJ6MPNfLQXPmzqXja" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/2qFr8w5sWUITRlzZ9kZotF" + }, + "href" : "https://api.spotify.com/v1/artists/2qFr8w5sWUITRlzZ9kZotF", + "id" : "2qFr8w5sWUITRlzZ9kZotF", + "name" : "Jefferson Airplane", + "type" : "artist", + "uri" : "spotify:artist:2qFr8w5sWUITRlzZ9kZotF" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 177546, + "explicit" : false, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/0yLfXULLuRtVj2L4DIrwO7" + }, + "href" : "https://api.spotify.com/v1/tracks/0yLfXULLuRtVj2L4DIrwO7", + "id" : "0yLfXULLuRtVj2L4DIrwO7", + "name" : "Today", + "preview_url" : "https://p.scdn.co/mp3-preview/42f77400609ccdf9acf893da3df8328f919e894b", + "track_number" : 4, + "type" : "track", + "uri" : "spotify:track:0yLfXULLuRtVj2L4DIrwO7" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/2qFr8w5sWUITRlzZ9kZotF" + }, + "href" : "https://api.spotify.com/v1/artists/2qFr8w5sWUITRlzZ9kZotF", + "id" : "2qFr8w5sWUITRlzZ9kZotF", + "name" : "Jefferson Airplane", + "type" : "artist", + "uri" : "spotify:artist:2qFr8w5sWUITRlzZ9kZotF" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 315040, + "explicit" : false, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/0TBntp6t4oS6UXjxikO5n7" + }, + "href" : "https://api.spotify.com/v1/tracks/0TBntp6t4oS6UXjxikO5n7", + "id" : "0TBntp6t4oS6UXjxikO5n7", + "name" : "Comin' Back To Me", + "preview_url" : "https://p.scdn.co/mp3-preview/46878b59f747755f85edbfce9e20b695f407a79e", + "track_number" : 5, + "type" : "track", + "uri" : "spotify:track:0TBntp6t4oS6UXjxikO5n7" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/2qFr8w5sWUITRlzZ9kZotF" + }, + "href" : "https://api.spotify.com/v1/artists/2qFr8w5sWUITRlzZ9kZotF", + "id" : "2qFr8w5sWUITRlzZ9kZotF", + "name" : "Jefferson Airplane", + "type" : "artist", + "uri" : "spotify:artist:2qFr8w5sWUITRlzZ9kZotF" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 220186, + "explicit" : false, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/5uZD2015uZBis6B2VwRYUZ" + }, + "href" : "https://api.spotify.com/v1/tracks/5uZD2015uZBis6B2VwRYUZ", + "id" : "5uZD2015uZBis6B2VwRYUZ", + "name" : "3/5 of a Mile in 10 Seconds", + "preview_url" : "https://p.scdn.co/mp3-preview/cb6a731353b8a8185d43922b6a0525f8fd97111a", + "track_number" : 6, + "type" : "track", + "uri" : "spotify:track:5uZD2015uZBis6B2VwRYUZ" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/2qFr8w5sWUITRlzZ9kZotF" + }, + "href" : "https://api.spotify.com/v1/artists/2qFr8w5sWUITRlzZ9kZotF", + "id" : "2qFr8w5sWUITRlzZ9kZotF", + "name" : "Jefferson Airplane", + "type" : "artist", + "uri" : "spotify:artist:2qFr8w5sWUITRlzZ9kZotF" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 155586, + "explicit" : false, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/2tjzfZvZjWbnmEqdzY8VTe" + }, + "href" : "https://api.spotify.com/v1/tracks/2tjzfZvZjWbnmEqdzY8VTe", + "id" : "2tjzfZvZjWbnmEqdzY8VTe", + "name" : "D. C. B. A.-25", + "preview_url" : "https://p.scdn.co/mp3-preview/67425b0cc835cc9c04a086b652920d8332f6aab8", + "track_number" : 7, + "type" : "track", + "uri" : "spotify:track:2tjzfZvZjWbnmEqdzY8VTe" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/2qFr8w5sWUITRlzZ9kZotF" + }, + "href" : "https://api.spotify.com/v1/artists/2qFr8w5sWUITRlzZ9kZotF", + "id" : "2qFr8w5sWUITRlzZ9kZotF", + "name" : "Jefferson Airplane", + "type" : "artist", + "uri" : "spotify:artist:2qFr8w5sWUITRlzZ9kZotF" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 208520, + "explicit" : false, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/0diWyRPKZD0nswFui9KTIf" + }, + "href" : "https://api.spotify.com/v1/tracks/0diWyRPKZD0nswFui9KTIf", + "id" : "0diWyRPKZD0nswFui9KTIf", + "name" : "How Do You Feel", + "preview_url" : "https://p.scdn.co/mp3-preview/f3eb36322aea0b6326948040cf0bd80e87e96c01", + "track_number" : 8, + "type" : "track", + "uri" : "spotify:track:0diWyRPKZD0nswFui9KTIf" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/2qFr8w5sWUITRlzZ9kZotF" + }, + "href" : "https://api.spotify.com/v1/artists/2qFr8w5sWUITRlzZ9kZotF", + "id" : "2qFr8w5sWUITRlzZ9kZotF", + "name" : "Jefferson Airplane", + "type" : "artist", + "uri" : "spotify:artist:2qFr8w5sWUITRlzZ9kZotF" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 112093, + "explicit" : false, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/2zbGXr2XCcRR40R7ymEENc" + }, + "href" : "https://api.spotify.com/v1/tracks/2zbGXr2XCcRR40R7ymEENc", + "id" : "2zbGXr2XCcRR40R7ymEENc", + "name" : "Embryonic Journey", + "preview_url" : "https://p.scdn.co/mp3-preview/8232954035c08ee357078c264ab51e735aad82ac", + "track_number" : 9, + "type" : "track", + "uri" : "spotify:track:2zbGXr2XCcRR40R7ymEENc" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/2qFr8w5sWUITRlzZ9kZotF" + }, + "href" : "https://api.spotify.com/v1/artists/2qFr8w5sWUITRlzZ9kZotF", + "id" : "2qFr8w5sWUITRlzZ9kZotF", + "name" : "Jefferson Airplane", + "type" : "artist", + "uri" : "spotify:artist:2qFr8w5sWUITRlzZ9kZotF" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 150640, + "explicit" : false, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/4vpeKl0vMGdAXpZiQB2Dtd" + }, + "href" : "https://api.spotify.com/v1/tracks/4vpeKl0vMGdAXpZiQB2Dtd", + "id" : "4vpeKl0vMGdAXpZiQB2Dtd", + "name" : "White Rabbit", + "preview_url" : "https://p.scdn.co/mp3-preview/edb9c04ef6ea5d6cd6d8efc06fc8fbf63f16fd95", + "track_number" : 10, + "type" : "track", + "uri" : "spotify:track:4vpeKl0vMGdAXpZiQB2Dtd" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/2qFr8w5sWUITRlzZ9kZotF" + }, + "href" : "https://api.spotify.com/v1/artists/2qFr8w5sWUITRlzZ9kZotF", + "id" : "2qFr8w5sWUITRlzZ9kZotF", + "name" : "Jefferson Airplane", + "type" : "artist", + "uri" : "spotify:artist:2qFr8w5sWUITRlzZ9kZotF" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 153400, + "explicit" : false, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/3fNvTmIR68qzusVAUhSwk3" + }, + "href" : "https://api.spotify.com/v1/tracks/3fNvTmIR68qzusVAUhSwk3", + "id" : "3fNvTmIR68qzusVAUhSwk3", + "name" : "Plastic Fantastic Lover", + "preview_url" : "https://p.scdn.co/mp3-preview/51d3d2f617c9ef97bc9e719d9490ab7655acb1ab", + "track_number" : 11, + "type" : "track", + "uri" : "spotify:track:3fNvTmIR68qzusVAUhSwk3" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/2qFr8w5sWUITRlzZ9kZotF" + }, + "href" : "https://api.spotify.com/v1/artists/2qFr8w5sWUITRlzZ9kZotF", + "id" : "2qFr8w5sWUITRlzZ9kZotF", + "name" : "Jefferson Airplane", + "type" : "artist", + "uri" : "spotify:artist:2qFr8w5sWUITRlzZ9kZotF" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 380213, + "explicit" : false, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/1FCzqMyUdl2YW1JGU2ungx" + }, + "href" : "https://api.spotify.com/v1/tracks/1FCzqMyUdl2YW1JGU2ungx", + "id" : "1FCzqMyUdl2YW1JGU2ungx", + "name" : "In The Morning", + "preview_url" : "https://p.scdn.co/mp3-preview/e47b8eea4f796cfbd044e0bbcbec46f6c6dd7eb9", + "track_number" : 12, + "type" : "track", + "uri" : "spotify:track:1FCzqMyUdl2YW1JGU2ungx" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/2qFr8w5sWUITRlzZ9kZotF" + }, + "href" : "https://api.spotify.com/v1/artists/2qFr8w5sWUITRlzZ9kZotF", + "id" : "2qFr8w5sWUITRlzZ9kZotF", + "name" : "Jefferson Airplane", + "type" : "artist", + "uri" : "spotify:artist:2qFr8w5sWUITRlzZ9kZotF" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 156213, + "explicit" : false, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/0zxQ5lejOpU0P1gcX44jVS" + }, + "href" : "https://api.spotify.com/v1/tracks/0zxQ5lejOpU0P1gcX44jVS", + "id" : "0zxQ5lejOpU0P1gcX44jVS", + "name" : "J. P. P. Mc Step B. Blues", + "preview_url" : "https://p.scdn.co/mp3-preview/8cd6733471c114ce0a1374c921a0308890f2a08c", + "track_number" : 13, + "type" : "track", + "uri" : "spotify:track:0zxQ5lejOpU0P1gcX44jVS" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/2qFr8w5sWUITRlzZ9kZotF" + }, + "href" : "https://api.spotify.com/v1/artists/2qFr8w5sWUITRlzZ9kZotF", + "id" : "2qFr8w5sWUITRlzZ9kZotF", + "name" : "Jefferson Airplane", + "type" : "artist", + "uri" : "spotify:artist:2qFr8w5sWUITRlzZ9kZotF" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 241666, + "explicit" : false, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/3tOeWyjnn2iACoR8NQHwmx" + }, + "href" : "https://api.spotify.com/v1/tracks/3tOeWyjnn2iACoR8NQHwmx", + "id" : "3tOeWyjnn2iACoR8NQHwmx", + "name" : "Go To Her", + "preview_url" : "https://p.scdn.co/mp3-preview/ee1b0fd3475734f01b06b6e5e0a50fedd3eaf841", + "track_number" : 14, + "type" : "track", + "uri" : "spotify:track:3tOeWyjnn2iACoR8NQHwmx" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/2qFr8w5sWUITRlzZ9kZotF" + }, + "href" : "https://api.spotify.com/v1/artists/2qFr8w5sWUITRlzZ9kZotF", + "id" : "2qFr8w5sWUITRlzZ9kZotF", + "name" : "Jefferson Airplane", + "type" : "artist", + "uri" : "spotify:artist:2qFr8w5sWUITRlzZ9kZotF" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 175506, + "explicit" : false, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/6cKd2jJKrDLxhy7s3o4QKY" + }, + "href" : "https://api.spotify.com/v1/tracks/6cKd2jJKrDLxhy7s3o4QKY", + "id" : "6cKd2jJKrDLxhy7s3o4QKY", + "name" : "Come Back Baby", + "preview_url" : "https://p.scdn.co/mp3-preview/f8b557c323f6e46046b87f102f0038152122e03e", + "track_number" : 15, + "type" : "track", + "uri" : "spotify:track:6cKd2jJKrDLxhy7s3o4QKY" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/2qFr8w5sWUITRlzZ9kZotF" + }, + "href" : "https://api.spotify.com/v1/artists/2qFr8w5sWUITRlzZ9kZotF", + "id" : "2qFr8w5sWUITRlzZ9kZotF", + "name" : "Jefferson Airplane", + "type" : "artist", + "uri" : "spotify:artist:2qFr8w5sWUITRlzZ9kZotF" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 178520, + "explicit" : false, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/45QH00VIZ4NMOYu6GkUMNt" + }, + "href" : "https://api.spotify.com/v1/tracks/45QH00VIZ4NMOYu6GkUMNt", + "id" : "45QH00VIZ4NMOYu6GkUMNt", + "name" : "Somebody To Love - mono single version", + "preview_url" : "https://p.scdn.co/mp3-preview/e6f3175724959bd7e3647fd804eea93aaef206c2", + "track_number" : 16, + "type" : "track", + "uri" : "spotify:track:45QH00VIZ4NMOYu6GkUMNt" + }, { + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/2qFr8w5sWUITRlzZ9kZotF" + }, + "href" : "https://api.spotify.com/v1/artists/2qFr8w5sWUITRlzZ9kZotF", + "id" : "2qFr8w5sWUITRlzZ9kZotF", + "name" : "Jefferson Airplane", + "type" : "artist", + "uri" : "spotify:artist:2qFr8w5sWUITRlzZ9kZotF" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 320813, + "explicit" : false, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/0B06qo77UwovqxOY3Mwcw4" + }, + "href" : "https://api.spotify.com/v1/tracks/0B06qo77UwovqxOY3Mwcw4", + "id" : "0B06qo77UwovqxOY3Mwcw4", + "name" : "White Rabbit - mono single version", + "preview_url" : "https://p.scdn.co/mp3-preview/818c2357ede0ad3dab75914e7b8dc8695c0c3812", + "track_number" : 17, + "type" : "track", + "uri" : "spotify:track:0B06qo77UwovqxOY3Mwcw4" + } ], + "limit" : 50, + "next" : null, + "offset" : 0, + "previous" : null, + "total" : 17 + }, + "type" : "album", + "uri" : "spotify:album:6lPb7Eoon6QPbscWbMsk6a" + } ] +} diff --git a/vendor/jwilsson/spotify-web-api-php/tests/fixtures/artist-albums.json b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/artist-albums.json new file mode 100644 index 0000000..9c1c4b1 --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/artist-albums.json @@ -0,0 +1,129 @@ +{ + "href" : "https://api.spotify.com/v1/artists/6v8FB84lnmJs434UJf2Mrm/albums?offset=0&limit=5&album_type=single,album,compilation,appears_on", + "items" : [ { + "album_type" : "album", + "available_markets" : [ "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IT", "LT", "LU", "LV", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/361dgrFRURo9gwWnSQG6Uu" + }, + "href" : "https://api.spotify.com/v1/albums/361dgrFRURo9gwWnSQG6Uu", + "id" : "361dgrFRURo9gwWnSQG6Uu", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/e052cc9842df2738bf2c3368bafa49c43fad83a4", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/4996a3b2db84b5d121b54e457d8b173d7162f917", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/db0c983e1171f03186b61213ce9fe1f718b56ed1", + "width" : 64 + } ], + "name" : "Storytone", + "type" : "album", + "uri" : "spotify:album:361dgrFRURo9gwWnSQG6Uu" + }, { + "album_type" : "album", + "available_markets" : [ "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IT", "LT", "LU", "LV", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/1HhdHx1asrL4Uf6rlQxCx1" + }, + "href" : "https://api.spotify.com/v1/albums/1HhdHx1asrL4Uf6rlQxCx1", + "id" : "1HhdHx1asrL4Uf6rlQxCx1", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/709702b800b5239e4bf345dbeb4fe78cd8e068b1", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/637262e8c1c45457ec8773ecd08eef81f9cdb41d", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/976b30553009b1866368a2afd01b336a2a36f180", + "width" : 64 + } ], + "name" : "Storytone (Deluxe Version)", + "type" : "album", + "uri" : "spotify:album:1HhdHx1asrL4Uf6rlQxCx1" + }, { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/0qeBoQjqVd5L0T93Pf7Vwm" + }, + "href" : "https://api.spotify.com/v1/albums/0qeBoQjqVd5L0T93Pf7Vwm", + "id" : "0qeBoQjqVd5L0T93Pf7Vwm", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/aef94edcf57574157875dd9b7d496656b25d4aec", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/6bac516642b884fb5661fa0c109bd3a5933d2b51", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/2cc77e54f4519bfa72566fa293fbbd912c33d0bc", + "width" : 64 + } ], + "name" : "A Letter Home", + "type" : "album", + "uri" : "spotify:album:0qeBoQjqVd5L0T93Pf7Vwm" + }, { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/2h2zv7tulv5460Ijs1tpxs" + }, + "href" : "https://api.spotify.com/v1/albums/2h2zv7tulv5460Ijs1tpxs", + "id" : "2h2zv7tulv5460Ijs1tpxs", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/a042e0e50696368635ba9df8c598f79d856e4b92", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/adf120673a98a0dec42bb9cde4b8a437ec60ec97", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/e2ee2d191ca0b30e417a1ae0d8889a0f365b8d37", + "width" : 64 + } ], + "name" : "Live At The Cellar Door", + "type" : "album", + "uri" : "spotify:album:2h2zv7tulv5460Ijs1tpxs" + }, { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/4j9JVeEgEEiwYyYMiueTvG" + }, + "href" : "https://api.spotify.com/v1/albums/4j9JVeEgEEiwYyYMiueTvG", + "id" : "4j9JVeEgEEiwYyYMiueTvG", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/65d3f76280a7dd0344e26529792711c42c182d01", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/48faa882bceddcf24bc9c867ec600ccb3a6f250f", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/94f0b553fd359907deb913aa4ffdeaad9cf09148", + "width" : 64 + } ], + "name" : "Le Noise", + "type" : "album", + "uri" : "spotify:album:4j9JVeEgEEiwYyYMiueTvG" + } ], + "limit" : 5, + "next" : "https://api.spotify.com/v1/artists/6v8FB84lnmJs434UJf2Mrm/albums?offset=5&limit=5&album_type=single,album,compilation,appears_on", + "offset" : 0, + "previous" : null, + "total" : 113 +} diff --git a/vendor/jwilsson/spotify-web-api-php/tests/fixtures/artist-related-artists.json b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/artist-related-artists.json new file mode 100644 index 0000000..c8bfc59 --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/artist-related-artists.json @@ -0,0 +1,631 @@ +{ + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/1dfeR4HaWDbWqFHLkxsg1d" + }, + "followers" : { + "href" : null, + "total" : 1315842 + }, + "genres" : [ "album rock", "glam rock", "rock" ], + "href" : "https://api.spotify.com/v1/artists/1dfeR4HaWDbWqFHLkxsg1d", + "id" : "1dfeR4HaWDbWqFHLkxsg1d", + "images" : [ { + "height" : 806, + "url" : "https://i.scdn.co/image/f439465a43dd0e4d1aed1df5b0e3243eda49a403", + "width" : 999 + }, { + "height" : 516, + "url" : "https://i.scdn.co/image/d654d928182fd66c75fb3b9a74b427317f5584c7", + "width" : 640 + }, { + "height" : 161, + "url" : "https://i.scdn.co/image/19d06fdae9eeeef540a6e1b2f5cf43815512398b", + "width" : 200 + }, { + "height" : 52, + "url" : "https://i.scdn.co/image/106f04597938cf8892c969fe187c2ddddc665094", + "width" : 64 + } ], + "name" : "Queen", + "popularity" : 76, + "type" : "artist", + "uri" : "spotify:artist:1dfeR4HaWDbWqFHLkxsg1d" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/3qm84nBOXUEQ2vnTfUTTFC" + }, + "followers" : { + "href" : null, + "total" : 746900 + }, + "genres" : [ "hard rock", "rock" ], + "href" : "https://api.spotify.com/v1/artists/3qm84nBOXUEQ2vnTfUTTFC", + "id" : "3qm84nBOXUEQ2vnTfUTTFC", + "images" : [ { + "height" : 1196, + "url" : "https://i.scdn.co/image/e5febc8c36b50a0aad9b75b44340b2c7daaf7304", + "width" : 1000 + }, { + "height" : 765, + "url" : "https://i.scdn.co/image/e710440d0d23f6d2045edf7c48e189c32775df1e", + "width" : 640 + }, { + "height" : 239, + "url" : "https://i.scdn.co/image/d9f697b417282c3f77cd88cb7d1241f95b5e3482", + "width" : 200 + }, { + "height" : 77, + "url" : "https://i.scdn.co/image/31568da0f5b7aa7794df7c99a67d7211198e49a1", + "width" : 64 + } ], + "name" : "Guns N' Roses", + "popularity" : 65, + "type" : "artist", + "uri" : "spotify:artist:3qm84nBOXUEQ2vnTfUTTFC" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/5hW4L92KnC6dX9t7tYM4Ve" + }, + "followers" : { + "href" : null, + "total" : 98837 + }, + "genres" : [ "folk rock", "folk-pop", "singer-songwriter" ], + "href" : "https://api.spotify.com/v1/artists/5hW4L92KnC6dX9t7tYM4Ve", + "id" : "5hW4L92KnC6dX9t7tYM4Ve", + "images" : [ { + "height" : 784, + "url" : "https://i.scdn.co/image/091b12a139f5b6748389b906a7c3370256458163", + "width" : 1000 + }, { + "height" : 502, + "url" : "https://i.scdn.co/image/c790fa02e5a862c89e7c2847f4ebef8b87c02f25", + "width" : 640 + }, { + "height" : 157, + "url" : "https://i.scdn.co/image/6efcbe8a3af0a8191ae7b83547b3363ce34ef51f", + "width" : 200 + }, { + "height" : 50, + "url" : "https://i.scdn.co/image/0b1efcf69be53242fbaab33752e937c335d4c690", + "width" : 64 + } ], + "name" : "Joni Mitchell", + "popularity" : 60, + "type" : "artist", + "uri" : "spotify:artist:5hW4L92KnC6dX9t7tYM4Ve" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/5a2EaR3hamoenG9rDuVn8j" + }, + "followers" : { + "href" : null, + "total" : 230869 + }, + "genres" : [ "classic funk rock", "funk rock" ], + "href" : "https://api.spotify.com/v1/artists/5a2EaR3hamoenG9rDuVn8j", + "id" : "5a2EaR3hamoenG9rDuVn8j", + "images" : [ { + "height" : 585, + "url" : "https://i.scdn.co/image/6c02aa8bba022a4317b1535ed66e675d350607b4", + "width" : 720 + }, { + "height" : 520, + "url" : "https://i.scdn.co/image/0dd5b7997516744e8883aadc15ba18ba05cb8e67", + "width" : 640 + }, { + "height" : 163, + "url" : "https://i.scdn.co/image/f0b041537109596173216eb5cd253e1e1ce4f27d", + "width" : 200 + }, { + "height" : 52, + "url" : "https://i.scdn.co/image/5d082cd14be566e41681853667ef8fc0ab2cbd32", + "width" : 64 + } ], + "name" : "Prince", + "popularity" : 72, + "type" : "artist", + "uri" : "spotify:artist:5a2EaR3hamoenG9rDuVn8j" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/67ea9eGLXYMsO2eYQRui3w" + }, + "followers" : { + "href" : null, + "total" : 315351 + }, + "genres" : [ "rock" ], + "href" : "https://api.spotify.com/v1/artists/67ea9eGLXYMsO2eYQRui3w", + "id" : "67ea9eGLXYMsO2eYQRui3w", + "images" : [ { + "height" : 1296, + "url" : "https://i.scdn.co/image/5304476e4596646d98a8f556d4d4ed19983c419e", + "width" : 1000 + }, { + "height" : 829, + "url" : "https://i.scdn.co/image/045087373e3a23d49371d39a2d2b6d08906046af", + "width" : 640 + }, { + "height" : 259, + "url" : "https://i.scdn.co/image/e6d4c88c2d2d73d0dac733e3ba6ca8b61aec1154", + "width" : 200 + }, { + "height" : 83, + "url" : "https://i.scdn.co/image/9f2fcb9407b9be5eebfd40c0096c268f86f0e615", + "width" : 64 + } ], + "name" : "The Who", + "popularity" : 65, + "type" : "artist", + "uri" : "spotify:artist:67ea9eGLXYMsO2eYQRui3w" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/776Uo845nYHJpNaStv1Ds4" + }, + "followers" : { + "href" : null, + "total" : 366092 + }, + "genres" : [ "blues-rock", "classic rock" ], + "href" : "https://api.spotify.com/v1/artists/776Uo845nYHJpNaStv1Ds4", + "id" : "776Uo845nYHJpNaStv1Ds4", + "images" : [ { + "height" : 1500, + "url" : "https://i.scdn.co/image/080183498389e920416d15d00b34f4c5dc4bbd0b", + "width" : 1000 + }, { + "height" : 960, + "url" : "https://i.scdn.co/image/ac83b1e22aa158ce554f27b26751354c8b525dee", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/a5f86ee01b063916de2b636f44f1dfccd540a786", + "width" : 200 + }, { + "height" : 96, + "url" : "https://i.scdn.co/image/577c11dbd9c88cf8872c938d2ce85d0a699a7c02", + "width" : 64 + } ], + "name" : "Jimi Hendrix", + "popularity" : 67, + "type" : "artist", + "uri" : "spotify:artist:776Uo845nYHJpNaStv1Ds4" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/1SQRv42e4PjEYfPhS0Tk9E" + }, + "followers" : { + "href" : null, + "total" : 172330 + }, + "genres" : [ "british invasion", "glam rock" ], + "href" : "https://api.spotify.com/v1/artists/1SQRv42e4PjEYfPhS0Tk9E", + "id" : "1SQRv42e4PjEYfPhS0Tk9E", + "images" : [ { + "height" : 1203, + "url" : "https://i.scdn.co/image/2d5581f6949dda0687df4fee5ec990a216a182f9", + "width" : 1000 + }, { + "height" : 770, + "url" : "https://i.scdn.co/image/d401f647a39eeeb589d1fb6fcb3ef2905f774dd0", + "width" : 640 + }, { + "height" : 241, + "url" : "https://i.scdn.co/image/8594e0c7fff54add04aa56467cc5030b7422d519", + "width" : 200 + }, { + "height" : 77, + "url" : "https://i.scdn.co/image/46376c0868912939513116b021b129ac69fca016", + "width" : 64 + } ], + "name" : "The Kinks", + "popularity" : 60, + "type" : "artist", + "uri" : "spotify:artist:1SQRv42e4PjEYfPhS0Tk9E" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/0f8MDDzIc6M4uH1xH0o0gy" + }, + "followers" : { + "href" : null, + "total" : 45434 + }, + "genres" : [ "acoustic blues", "blues", "delta blues", "traditional blues" ], + "href" : "https://api.spotify.com/v1/artists/0f8MDDzIc6M4uH1xH0o0gy", + "id" : "0f8MDDzIc6M4uH1xH0o0gy", + "images" : [ { + "height" : 1268, + "url" : "https://i.scdn.co/image/8cc55abbc1ed7527d40903f9d4a4dcbe51f514f3", + "width" : 968 + }, { + "height" : 838, + "url" : "https://i.scdn.co/image/c71361d94ef194e26c432887b2295fdec78f2043", + "width" : 640 + }, { + "height" : 262, + "url" : "https://i.scdn.co/image/8b2fc1fb2070a5437d518e4ff6b7946e5d410d9e", + "width" : 200 + }, { + "height" : 84, + "url" : "https://i.scdn.co/image/ec4640d494630c33ca6f14e0e711c91a7461c3fd", + "width" : 64 + } ], + "name" : "Robert Johnson", + "popularity" : 60, + "type" : "artist", + "uri" : "spotify:artist:0f8MDDzIc6M4uH1xH0o0gy" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/43ZHCT0cAZBISjO8DG9PnE" + }, + "followers" : { + "href" : null, + "total" : 640755 + }, + "genres" : [ "rock-and-roll", "rockabilly" ], + "href" : "https://api.spotify.com/v1/artists/43ZHCT0cAZBISjO8DG9PnE", + "id" : "43ZHCT0cAZBISjO8DG9PnE", + "images" : [ { + "height" : 1296, + "url" : "https://i.scdn.co/image/c7b8708eab6d0f0902908c1b9f9ba1daaeed06af", + "width" : 1000 + }, { + "height" : 829, + "url" : "https://i.scdn.co/image/e25cb372ca9a5317c17d5f62b3556f76ce2edde8", + "width" : 640 + }, { + "height" : 259, + "url" : "https://i.scdn.co/image/7d0e683d6bb4cbb384586cd6d9007f5a40928251", + "width" : 200 + }, { + "height" : 83, + "url" : "https://i.scdn.co/image/16045a251c9e9f5772d4aeb3f6fa23fe4fdeb54a", + "width" : 64 + } ], + "name" : "Elvis Presley", + "popularity" : 94, + "type" : "artist", + "uri" : "spotify:artist:43ZHCT0cAZBISjO8DG9PnE" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/7Ey4PD4MYsKc5I2dolUwbH" + }, + "followers" : { + "href" : null, + "total" : 416034 + }, + "genres" : [ "album rock", "hard rock", "rock" ], + "href" : "https://api.spotify.com/v1/artists/7Ey4PD4MYsKc5I2dolUwbH", + "id" : "7Ey4PD4MYsKc5I2dolUwbH", + "images" : [ { + "height" : 665, + "url" : "https://i.scdn.co/image/e0ea6225a3f89374d53ba1344c73ae2819cd2020", + "width" : 999 + }, { + "height" : 426, + "url" : "https://i.scdn.co/image/58a89627ce645efd86a2d8b8140e9bc1378bdaca", + "width" : 640 + }, { + "height" : 133, + "url" : "https://i.scdn.co/image/c26e4282a450cc2d85c2d8f28b7859a14b541f81", + "width" : 200 + }, { + "height" : 43, + "url" : "https://i.scdn.co/image/3a98016f33459c8ac23333787a24a0e0b124170a", + "width" : 64 + } ], + "name" : "Aerosmith", + "popularity" : 69, + "type" : "artist", + "uri" : "spotify:artist:7Ey4PD4MYsKc5I2dolUwbH" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/2ye2Wgw4gimLv2eAKyk1NB" + }, + "followers" : { + "href" : null, + "total" : 854158 + }, + "genres" : [ "metal" ], + "href" : "https://api.spotify.com/v1/artists/2ye2Wgw4gimLv2eAKyk1NB", + "id" : "2ye2Wgw4gimLv2eAKyk1NB", + "images" : [ { + "height" : 960, + "url" : "https://i.scdn.co/image/3e77faaefed7e976999d5d40b02c2d0cae173a5a", + "width" : 960 + }, { + "height" : 640, + "url" : "https://i.scdn.co/image/2cfbc8c8e6af445b4323a3eda3ae97fe1bba8935", + "width" : 640 + }, { + "height" : 200, + "url" : "https://i.scdn.co/image/15d9ccb37a96d49f69f44f999fb1e9e46f9b3ccd", + "width" : 200 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/412a8f3a40f44fcfadb53bcecef2434f45fdd015", + "width" : 64 + } ], + "name" : "Metallica", + "popularity" : 63, + "type" : "artist", + "uri" : "spotify:artist:2ye2Wgw4gimLv2eAKyk1NB" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/4pejUc4iciQfgdX6OKulQn" + }, + "followers" : { + "href" : null, + "total" : 357259 + }, + "genres" : [ ], + "href" : "https://api.spotify.com/v1/artists/4pejUc4iciQfgdX6OKulQn", + "id" : "4pejUc4iciQfgdX6OKulQn", + "images" : [ { + "height" : 792, + "url" : "https://i.scdn.co/image/02b4438a838006c6f99602728675b9b4954e8782", + "width" : 1000 + }, { + "height" : 507, + "url" : "https://i.scdn.co/image/fbdc1b85274ac5b7dc3b1f03576080dc220c7484", + "width" : 640 + }, { + "height" : 158, + "url" : "https://i.scdn.co/image/18acb48c4a8e43883ace161d1a774745fbe7401b", + "width" : 199 + }, { + "height" : 51, + "url" : "https://i.scdn.co/image/101bfa10aae7177f78b128640cda367ab9943c62", + "width" : 64 + } ], + "name" : "Queens Of The Stone Age", + "popularity" : 67, + "type" : "artist", + "uri" : "spotify:artist:4pejUc4iciQfgdX6OKulQn" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/74oJ4qxwOZvX6oSsu1DGnw" + }, + "followers" : { + "href" : null, + "total" : 94659 + }, + "genres" : [ "blues-rock", "british blues", "classic rock", "psychedelic rock" ], + "href" : "https://api.spotify.com/v1/artists/74oJ4qxwOZvX6oSsu1DGnw", + "id" : "74oJ4qxwOZvX6oSsu1DGnw", + "images" : [ { + "height" : 792, + "url" : "https://i.scdn.co/image/a791d69ef7b3de518520a210acc349ea638ba3c7", + "width" : 999 + }, { + "height" : 507, + "url" : "https://i.scdn.co/image/c9f01ba48dd7696fa5182154671c7cf33b740e7a", + "width" : 640 + }, { + "height" : 158, + "url" : "https://i.scdn.co/image/6f78a9dbe221c14610b32829c8d5f550049c898d", + "width" : 199 + }, { + "height" : 51, + "url" : "https://i.scdn.co/image/3e68373fb30b02cf7b80d7617b2663d406209a0c", + "width" : 64 + } ], + "name" : "Cream", + "popularity" : 54, + "type" : "artist", + "uri" : "spotify:artist:74oJ4qxwOZvX6oSsu1DGnw" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/3kQzSlXUpRIJtIG0IVQp7S" + }, + "followers" : { + "href" : null, + "total" : 191 + }, + "genres" : [ ], + "href" : "https://api.spotify.com/v1/artists/3kQzSlXUpRIJtIG0IVQp7S", + "id" : "3kQzSlXUpRIJtIG0IVQp7S", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/581341b83669793a4722070bd63d16b0f800fdcb", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/cba9176381b827d4125b53e925765404e72a4ad7", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/2ddf6a3aa2a5ebb01e1002542e9614535f7a6f43", + "width" : 64 + } ], + "name" : "The Master Musicians of Joujouka", + "popularity" : 0, + "type" : "artist", + "uri" : "spotify:artist:3kQzSlXUpRIJtIG0IVQp7S" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/6olE6TJLqED3rqDCT0FyPh" + }, + "followers" : { + "href" : null, + "total" : 962886 + }, + "genres" : [ "alternative rock", "grunge", "permanent wave" ], + "href" : "https://api.spotify.com/v1/artists/6olE6TJLqED3rqDCT0FyPh", + "id" : "6olE6TJLqED3rqDCT0FyPh", + "images" : [ { + "height" : 1057, + "url" : "https://i.scdn.co/image/5d66307bbf73337bb073bfb2bf242e099a47e219", + "width" : 1000 + }, { + "height" : 677, + "url" : "https://i.scdn.co/image/695867a7c6a0df25c5bddf0b00cc2cfde35b3ffc", + "width" : 640 + }, { + "height" : 211, + "url" : "https://i.scdn.co/image/3a9c12e86ad8e2bbecb0e919b80bb5ece6f1dbe3", + "width" : 200 + }, { + "height" : 68, + "url" : "https://i.scdn.co/image/5ae6f10633adc53210cd18a4f216f27de330f19d", + "width" : 64 + } ], + "name" : "Nirvana", + "popularity" : 67, + "type" : "artist", + "uri" : "spotify:artist:6olE6TJLqED3rqDCT0FyPh" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/5M52tdBnJaKSvOpJGz8mfZ" + }, + "followers" : { + "href" : null, + "total" : 316643 + }, + "genres" : [ ], + "href" : "https://api.spotify.com/v1/artists/5M52tdBnJaKSvOpJGz8mfZ", + "id" : "5M52tdBnJaKSvOpJGz8mfZ", + "images" : [ { + "height" : 1059, + "url" : "https://i.scdn.co/image/c9d282ee411315454e6533474bf6bc6e2306c093", + "width" : 1000 + }, { + "height" : 678, + "url" : "https://i.scdn.co/image/fb7ab8ca0d767e1b919acf1371cdc8719f72cedc", + "width" : 640 + }, { + "height" : 212, + "url" : "https://i.scdn.co/image/7ff395e1ee99bcec086b7cc7164de410a13cfb3c", + "width" : 200 + }, { + "height" : 68, + "url" : "https://i.scdn.co/image/a4dbc85fb3d2fe694d1de5119c44a514ede6fd1d", + "width" : 64 + } ], + "name" : "Black Sabbath", + "popularity" : 62, + "type" : "artist", + "uri" : "spotify:artist:5M52tdBnJaKSvOpJGz8mfZ" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/0k17h0D3J5VfsdmQ1iZtE9" + }, + "followers" : { + "href" : null, + "total" : 579320 + }, + "genres" : [ "art rock" ], + "href" : "https://api.spotify.com/v1/artists/0k17h0D3J5VfsdmQ1iZtE9", + "id" : "0k17h0D3J5VfsdmQ1iZtE9", + "images" : [ { + "height" : 977, + "url" : "https://i.scdn.co/image/b954149fed21dcbafe1cee4c30454eb934c384ee", + "width" : 1000 + }, { + "height" : 625, + "url" : "https://i.scdn.co/image/63562bf58a1af52f9800c3ae225d49a476af212f", + "width" : 640 + }, { + "height" : 195, + "url" : "https://i.scdn.co/image/792a417e8500405180a7746908afd7d5e3a30585", + "width" : 200 + }, { + "height" : 63, + "url" : "https://i.scdn.co/image/a9b0636c32bb27f0590dbb283019614e861b2ed2", + "width" : 64 + } ], + "name" : "Pink Floyd", + "popularity" : 61, + "type" : "artist", + "uri" : "spotify:artist:0k17h0D3J5VfsdmQ1iZtE9" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/4xls23Ye9WR9yy3yYMpAMm" + }, + "followers" : { + "href" : null, + "total" : 40749 + }, + "genres" : [ "rock-and-roll", "rockabilly" ], + "href" : "https://api.spotify.com/v1/artists/4xls23Ye9WR9yy3yYMpAMm", + "id" : "4xls23Ye9WR9yy3yYMpAMm", + "images" : [ { + "height" : 596, + "url" : "https://i.scdn.co/image/225b21b951a28509cc944ddc3ff046a6dadfc58d", + "width" : 477 + }, { + "height" : 250, + "url" : "https://i.scdn.co/image/10f5e668f76ad7e313ad1c523f6a67ee6f5dd9fc", + "width" : 200 + }, { + "height" : 80, + "url" : "https://i.scdn.co/image/cfcab8b4b9caa4a8f05ebcc9e98d4f3d3ac4640b", + "width" : 64 + } ], + "name" : "Little Richard", + "popularity" : 69, + "type" : "artist", + "uri" : "spotify:artist:4xls23Ye9WR9yy3yYMpAMm" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/7jy3rLJdDQY21OgRLCZ9sD" + }, + "followers" : { + "href" : null, + "total" : 1002790 + }, + "genres" : [ "alternative rock", "permanent wave", "post-grunge" ], + "href" : "https://api.spotify.com/v1/artists/7jy3rLJdDQY21OgRLCZ9sD", + "id" : "7jy3rLJdDQY21OgRLCZ9sD", + "images" : [ { + "height" : 467, + "url" : "https://i.scdn.co/image/7415991bc4549837fe56506389396ecc23209fda", + "width" : 583 + }, { + "height" : 160, + "url" : "https://i.scdn.co/image/5ce1d91816f8c7b2b4ac70cacc25c73ba330ab79", + "width" : 200 + }, { + "height" : 51, + "url" : "https://i.scdn.co/image/2a65e02dc861340635db8edcb28c052bc2a5614b", + "width" : 64 + } ], + "name" : "Foo Fighters", + "popularity" : 65, + "type" : "artist", + "uri" : "spotify:artist:7jy3rLJdDQY21OgRLCZ9sD" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/22bE4uQ6baNwSHPVcDxLCe" + }, + "followers" : { + "href" : null, + "total" : 931999 + }, + "genres" : [ "blues-rock", "british blues", "classic rock" ], + "href" : "https://api.spotify.com/v1/artists/22bE4uQ6baNwSHPVcDxLCe", + "id" : "22bE4uQ6baNwSHPVcDxLCe", + "images" : [ { + "height" : 783, + "url" : "https://i.scdn.co/image/2b3993e967c42310876f226e5c380896e861ae8d", + "width" : 1000 + }, { + "height" : 501, + "url" : "https://i.scdn.co/image/cbd1ad72d24348463379c726a65f7495c6a8c169", + "width" : 640 + }, { + "height" : 157, + "url" : "https://i.scdn.co/image/839c66ae04452921f1a212823c3888a5beadac08", + "width" : 200 + }, { + "height" : 50, + "url" : "https://i.scdn.co/image/2668b52807aad539039b27f69a267eb490f37ee1", + "width" : 64 + } ], + "name" : "The Rolling Stones", + "popularity" : 75, + "type" : "artist", + "uri" : "spotify:artist:22bE4uQ6baNwSHPVcDxLCe" + } ] +} diff --git a/vendor/jwilsson/spotify-web-api-php/tests/fixtures/artist-top-tracks.json b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/artist-top-tracks.json new file mode 100644 index 0000000..797f6e4 --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/artist-top-tracks.json @@ -0,0 +1,543 @@ +{ + "tracks" : [ { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/6chUA3fW0UUhceTPOYHvtQ" + }, + "href" : "https://api.spotify.com/v1/albums/6chUA3fW0UUhceTPOYHvtQ", + "id" : "6chUA3fW0UUhceTPOYHvtQ", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/4ce59b41704d58fe340d1e52468607576c852fe3", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/458bc51b2bc2c9691ed80e1f7e0d4b2fdab4b23e", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/820a112e3d188eb9a028c0329041394f70d67a83", + "width" : 64 + } ], + "name" : "Decade", + "type" : "album", + "uri" : "spotify:album:6chUA3fW0UUhceTPOYHvtQ" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/6v8FB84lnmJs434UJf2Mrm" + }, + "href" : "https://api.spotify.com/v1/artists/6v8FB84lnmJs434UJf2Mrm", + "id" : "6v8FB84lnmJs434UJf2Mrm", + "name" : "Neil Young", + "type" : "artist", + "uri" : "spotify:artist:6v8FB84lnmJs434UJf2Mrm" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 187280, + "explicit" : false, + "external_ids" : { + "isrc" : "USRE19900182" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/6XDdmCAuodZfXtEgJcxpS2" + }, + "href" : "https://api.spotify.com/v1/tracks/6XDdmCAuodZfXtEgJcxpS2", + "id" : "6XDdmCAuodZfXtEgJcxpS2", + "name" : "Heart Of Gold", + "popularity" : 72, + "preview_url" : "https://p.scdn.co/mp3-preview/074749894abde037d1f256d8b2e5e642f0994224", + "track_number" : 22, + "type" : "track", + "uri" : "spotify:track:6XDdmCAuodZfXtEgJcxpS2" + }, { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/6chUA3fW0UUhceTPOYHvtQ" + }, + "href" : "https://api.spotify.com/v1/albums/6chUA3fW0UUhceTPOYHvtQ", + "id" : "6chUA3fW0UUhceTPOYHvtQ", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/4ce59b41704d58fe340d1e52468607576c852fe3", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/458bc51b2bc2c9691ed80e1f7e0d4b2fdab4b23e", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/820a112e3d188eb9a028c0329041394f70d67a83", + "width" : 64 + } ], + "name" : "Decade", + "type" : "album", + "uri" : "spotify:album:6chUA3fW0UUhceTPOYHvtQ" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/6v8FB84lnmJs434UJf2Mrm" + }, + "href" : "https://api.spotify.com/v1/artists/6v8FB84lnmJs434UJf2Mrm", + "id" : "6v8FB84lnmJs434UJf2Mrm", + "name" : "Neil Young", + "type" : "artist", + "uri" : "spotify:artist:6v8FB84lnmJs434UJf2Mrm" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 202693, + "explicit" : false, + "external_ids" : { + "isrc" : "USRE19900185" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/4M13hC6sdFmvKCJ2MhKEbi" + }, + "href" : "https://api.spotify.com/v1/tracks/4M13hC6sdFmvKCJ2MhKEbi", + "id" : "4M13hC6sdFmvKCJ2MhKEbi", + "name" : "Old Man", + "popularity" : 67, + "preview_url" : "https://p.scdn.co/mp3-preview/ef5ba7e2d5e77979cca3a25655fee035f600cac0", + "track_number" : 19, + "type" : "track", + "uri" : "spotify:track:4M13hC6sdFmvKCJ2MhKEbi" + }, { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/5m2MQk77aAXPhwI6Ges8X5" + }, + "href" : "https://api.spotify.com/v1/albums/5m2MQk77aAXPhwI6Ges8X5", + "id" : "5m2MQk77aAXPhwI6Ges8X5", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/0cda30e673dafdebb42793f18fa3ea112fd6b57c", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/01244d847df2e994a5474a2a8979715cc8d77a7a", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/234dec285c40e65f01f48539ead4d6bf748d8df2", + "width" : 64 + } ], + "name" : "Rust Never Sleeps", + "type" : "album", + "uri" : "spotify:album:5m2MQk77aAXPhwI6Ges8X5" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/6v8FB84lnmJs434UJf2Mrm" + }, + "href" : "https://api.spotify.com/v1/artists/6v8FB84lnmJs434UJf2Mrm", + "id" : "6v8FB84lnmJs434UJf2Mrm", + "name" : "Neil Young", + "type" : "artist", + "uri" : "spotify:artist:6v8FB84lnmJs434UJf2Mrm" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 227840, + "explicit" : false, + "external_ids" : { + "isrc" : "USRE19901377" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/4DFMZUoz6TBh8JVqmw6Drv" + }, + "href" : "https://api.spotify.com/v1/tracks/4DFMZUoz6TBh8JVqmw6Drv", + "id" : "4DFMZUoz6TBh8JVqmw6Drv", + "name" : "My My, Hey Hey - Out Of The Blue", + "popularity" : 67, + "preview_url" : "https://p.scdn.co/mp3-preview/38720c71629ab201090f08e502cb3186e16047e9", + "track_number" : 1, + "type" : "track", + "uri" : "spotify:track:4DFMZUoz6TBh8JVqmw6Drv" + }, { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/0tdm853TNWjVVChbJRbu3Q" + }, + "href" : "https://api.spotify.com/v1/albums/0tdm853TNWjVVChbJRbu3Q", + "id" : "0tdm853TNWjVVChbJRbu3Q", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/d3d2d6c3f473c407b1f1295008cd3615b5a68512", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/793a9f37677c0605b74b9b5524fdcbb0f89880b5", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/74acd7cc2d4b81ce2627f94f8093322c811c61c9", + "width" : 64 + } ], + "name" : "Harvest Moon", + "type" : "album", + "uri" : "spotify:album:0tdm853TNWjVVChbJRbu3Q" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/6v8FB84lnmJs434UJf2Mrm" + }, + "href" : "https://api.spotify.com/v1/artists/6v8FB84lnmJs434UJf2Mrm", + "id" : "6v8FB84lnmJs434UJf2Mrm", + "name" : "Neil Young", + "type" : "artist", + "uri" : "spotify:artist:6v8FB84lnmJs434UJf2Mrm" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 303213, + "explicit" : false, + "external_ids" : { + "isrc" : "USRE19900694" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/5l9c6bJmzvftumhz4TMPgk" + }, + "href" : "https://api.spotify.com/v1/tracks/5l9c6bJmzvftumhz4TMPgk", + "id" : "5l9c6bJmzvftumhz4TMPgk", + "name" : "Harvest Moon", + "popularity" : 67, + "preview_url" : "https://p.scdn.co/mp3-preview/7d47afa21ca9792ef670595afb150d77405782ec", + "track_number" : 4, + "type" : "track", + "uri" : "spotify:track:5l9c6bJmzvftumhz4TMPgk" + }, { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/3uOOKcr91I3Br0Rtmu4zdT" + }, + "href" : "https://api.spotify.com/v1/albums/3uOOKcr91I3Br0Rtmu4zdT", + "id" : "3uOOKcr91I3Br0Rtmu4zdT", + "images" : [ { + "height" : 626, + "url" : "https://i.scdn.co/image/39be268126fcc5d8a79b733c49ff86d05d6df341", + "width" : 640 + }, { + "height" : 293, + "url" : "https://i.scdn.co/image/33a2ae3b6c6e50f5ca32784db473d8df93fb1666", + "width" : 300 + }, { + "height" : 63, + "url" : "https://i.scdn.co/image/f1205ef7007b3c0065f1eabce1d550381a3ade93", + "width" : 64 + } ], + "name" : "Freedom", + "type" : "album", + "uri" : "spotify:album:3uOOKcr91I3Br0Rtmu4zdT" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/6v8FB84lnmJs434UJf2Mrm" + }, + "href" : "https://api.spotify.com/v1/artists/6v8FB84lnmJs434UJf2Mrm", + "id" : "6v8FB84lnmJs434UJf2Mrm", + "name" : "Neil Young", + "type" : "artist", + "uri" : "spotify:artist:6v8FB84lnmJs434UJf2Mrm" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 281853, + "explicit" : false, + "external_ids" : { + "isrc" : "USRE19900712" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/4Y7fEQ4PAzhlLnLviRw2P4" + }, + "href" : "https://api.spotify.com/v1/tracks/4Y7fEQ4PAzhlLnLviRw2P4", + "id" : "4Y7fEQ4PAzhlLnLviRw2P4", + "name" : "Rockin' In The Free World", + "popularity" : 62, + "preview_url" : "https://p.scdn.co/mp3-preview/b91632db351a630b6377fd272038737d285945fd", + "track_number" : 12, + "type" : "track", + "uri" : "spotify:track:4Y7fEQ4PAzhlLnLviRw2P4" + }, { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/6chUA3fW0UUhceTPOYHvtQ" + }, + "href" : "https://api.spotify.com/v1/albums/6chUA3fW0UUhceTPOYHvtQ", + "id" : "6chUA3fW0UUhceTPOYHvtQ", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/4ce59b41704d58fe340d1e52468607576c852fe3", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/458bc51b2bc2c9691ed80e1f7e0d4b2fdab4b23e", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/820a112e3d188eb9a028c0329041394f70d67a83", + "width" : 64 + } ], + "name" : "Decade", + "type" : "album", + "uri" : "spotify:album:6chUA3fW0UUhceTPOYHvtQ" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/6v8FB84lnmJs434UJf2Mrm" + }, + "href" : "https://api.spotify.com/v1/artists/6v8FB84lnmJs434UJf2Mrm", + "id" : "6v8FB84lnmJs434UJf2Mrm", + "name" : "Neil Young", + "type" : "artist", + "uri" : "spotify:artist:6v8FB84lnmJs434UJf2Mrm" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 130520, + "explicit" : false, + "external_ids" : { + "isrc" : "USRE19900188" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/3eKXd8eSlzMbvg94EPVmQE" + }, + "href" : "https://api.spotify.com/v1/tracks/3eKXd8eSlzMbvg94EPVmQE", + "id" : "3eKXd8eSlzMbvg94EPVmQE", + "name" : "The Needle And The Damage Done", + "popularity" : 57, + "preview_url" : "https://p.scdn.co/mp3-preview/f75f4db293854486af458de190b55be8790c1f36", + "track_number" : 24, + "type" : "track", + "uri" : "spotify:track:3eKXd8eSlzMbvg94EPVmQE" + }, { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/5wIp9G5YVsq4rqWFJINFfs" + }, + "href" : "https://api.spotify.com/v1/albums/5wIp9G5YVsq4rqWFJINFfs", + "id" : "5wIp9G5YVsq4rqWFJINFfs", + "images" : [ { + "height" : 630, + "url" : "https://i.scdn.co/image/79d96dadf85600e8186d24b6ccc709920f8b87ff", + "width" : 640 + }, { + "height" : 295, + "url" : "https://i.scdn.co/image/4add7ba4dd1c9bba6da343ed9a22bd20123fb1ef", + "width" : 300 + }, { + "height" : 63, + "url" : "https://i.scdn.co/image/6e612ae63a4b33cd0c5e699d2a73bcb052c99384", + "width" : 64 + } ], + "name" : "Greatest Hits", + "type" : "album", + "uri" : "spotify:album:5wIp9G5YVsq4rqWFJINFfs" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/6v8FB84lnmJs434UJf2Mrm" + }, + "href" : "https://api.spotify.com/v1/artists/6v8FB84lnmJs434UJf2Mrm", + "id" : "6v8FB84lnmJs434UJf2Mrm", + "name" : "Neil Young", + "type" : "artist", + "uri" : "spotify:artist:6v8FB84lnmJs434UJf2Mrm" + } ], + "available_markets" : [ "AD", "AR", "AT", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 557466, + "explicit" : false, + "external_ids" : { + "isrc" : "USRE19900417" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/0uPBPvGoNFm8V7zB0QwywJ" + }, + "href" : "https://api.spotify.com/v1/tracks/0uPBPvGoNFm8V7zB0QwywJ", + "id" : "0uPBPvGoNFm8V7zB0QwywJ", + "name" : "Down By The River", + "popularity" : 56, + "preview_url" : "https://p.scdn.co/mp3-preview/db003befb35087a3a573dcbc77da1a2e6ca8901d", + "track_number" : 1, + "type" : "track", + "uri" : "spotify:track:0uPBPvGoNFm8V7zB0QwywJ" + }, { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/2h2zv7tulv5460Ijs1tpxs" + }, + "href" : "https://api.spotify.com/v1/albums/2h2zv7tulv5460Ijs1tpxs", + "id" : "2h2zv7tulv5460Ijs1tpxs", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/a042e0e50696368635ba9df8c598f79d856e4b92", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/adf120673a98a0dec42bb9cde4b8a437ec60ec97", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/e2ee2d191ca0b30e417a1ae0d8889a0f365b8d37", + "width" : 64 + } ], + "name" : "Live At The Cellar Door", + "type" : "album", + "uri" : "spotify:album:2h2zv7tulv5460Ijs1tpxs" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/6v8FB84lnmJs434UJf2Mrm" + }, + "href" : "https://api.spotify.com/v1/artists/6v8FB84lnmJs434UJf2Mrm", + "id" : "6v8FB84lnmJs434UJf2Mrm", + "name" : "Neil Young", + "type" : "artist", + "uri" : "spotify:artist:6v8FB84lnmJs434UJf2Mrm" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 172200, + "explicit" : false, + "external_ids" : { + "isrc" : "USRE11300417" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/0qS52mdiqMsoVvGy0E7EZ5" + }, + "href" : "https://api.spotify.com/v1/tracks/0qS52mdiqMsoVvGy0E7EZ5", + "id" : "0qS52mdiqMsoVvGy0E7EZ5", + "name" : "Tell Me Why - Live At The Cellar Door", + "popularity" : 55, + "preview_url" : "https://p.scdn.co/mp3-preview/c04e67f32c7bf2b840d22397b2b88d32e33ba3e1", + "track_number" : 1, + "type" : "track", + "uri" : "spotify:track:0qS52mdiqMsoVvGy0E7EZ5" + }, { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/5EVlXlHbRQI8ybuNt4ArXI" + }, + "href" : "https://api.spotify.com/v1/albums/5EVlXlHbRQI8ybuNt4ArXI", + "id" : "5EVlXlHbRQI8ybuNt4ArXI", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/a1d7dd6197a4a67cef6ac3e3f4ae50142862afff", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/8cf882c756e208465a4192ea61fb2a27675dfdc3", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/399f01efb1ebfed45a67035bc4477b175aff912e", + "width" : 64 + } ], + "name" : "After The Gold Rush (Remastered Version)", + "type" : "album", + "uri" : "spotify:album:5EVlXlHbRQI8ybuNt4ArXI" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/6v8FB84lnmJs434UJf2Mrm" + }, + "href" : "https://api.spotify.com/v1/artists/6v8FB84lnmJs434UJf2Mrm", + "id" : "6v8FB84lnmJs434UJf2Mrm", + "name" : "Neil Young", + "type" : "artist", + "uri" : "spotify:artist:6v8FB84lnmJs434UJf2Mrm" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 225973, + "explicit" : false, + "external_ids" : { + "isrc" : "USRE10900209" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/2anPa0qaFG1Nf0swkpfOQd" + }, + "href" : "https://api.spotify.com/v1/tracks/2anPa0qaFG1Nf0swkpfOQd", + "id" : "2anPa0qaFG1Nf0swkpfOQd", + "name" : "After The Gold Rush - Remastered", + "popularity" : 54, + "preview_url" : "https://p.scdn.co/mp3-preview/40947fc42cdc9b6f746c6442f617a2a1303cd81f", + "track_number" : 2, + "type" : "track", + "uri" : "spotify:track:2anPa0qaFG1Nf0swkpfOQd" + }, { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/5wIp9G5YVsq4rqWFJINFfs" + }, + "href" : "https://api.spotify.com/v1/albums/5wIp9G5YVsq4rqWFJINFfs", + "id" : "5wIp9G5YVsq4rqWFJINFfs", + "images" : [ { + "height" : 630, + "url" : "https://i.scdn.co/image/79d96dadf85600e8186d24b6ccc709920f8b87ff", + "width" : 640 + }, { + "height" : 295, + "url" : "https://i.scdn.co/image/4add7ba4dd1c9bba6da343ed9a22bd20123fb1ef", + "width" : 300 + }, { + "height" : 63, + "url" : "https://i.scdn.co/image/6e612ae63a4b33cd0c5e699d2a73bcb052c99384", + "width" : 64 + } ], + "name" : "Greatest Hits", + "type" : "album", + "uri" : "spotify:album:5wIp9G5YVsq4rqWFJINFfs" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/6v8FB84lnmJs434UJf2Mrm" + }, + "href" : "https://api.spotify.com/v1/artists/6v8FB84lnmJs434UJf2Mrm", + "id" : "6v8FB84lnmJs434UJf2Mrm", + "name" : "Neil Young", + "type" : "artist", + "uri" : "spotify:artist:6v8FB84lnmJs434UJf2Mrm" + } ], + "available_markets" : [ "AD", "AR", "AT", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 179960, + "explicit" : false, + "external_ids" : { + "isrc" : "USRE19900416" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/0vJcPfC5wHCul3w5ozg5nx" + }, + "href" : "https://api.spotify.com/v1/tracks/0vJcPfC5wHCul3w5ozg5nx", + "id" : "0vJcPfC5wHCul3w5ozg5nx", + "name" : "Cinnamon Girl", + "popularity" : 54, + "preview_url" : "https://p.scdn.co/mp3-preview/e22fcbc61f3776f14375582c526f143052ecc182", + "track_number" : 3, + "type" : "track", + "uri" : "spotify:track:0vJcPfC5wHCul3w5ozg5nx" + } ] +} diff --git a/vendor/jwilsson/spotify-web-api-php/tests/fixtures/artist.json b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/artist.json new file mode 100644 index 0000000..ee6a245 --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/artist.json @@ -0,0 +1,29 @@ +{ + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/36QJpDe2go2KgaRleHCDTp" + }, + "followers" : { + "href" : null, + "total" : 499010 + }, + "genres" : [ "album rock", "blues-rock", "classic rock", "rock" ], + "href" : "https://api.spotify.com/v1/artists/36QJpDe2go2KgaRleHCDTp", + "id" : "36QJpDe2go2KgaRleHCDTp", + "images" : [ { + "height" : 600, + "url" : "https://i.scdn.co/image/f66bcaf9b7d00b6bd5dafa1d99586390a23f4935", + "width" : 600 + }, { + "height" : 200, + "url" : "https://i.scdn.co/image/89f85b03f128056ea2d0ca941be999853bea3d7c", + "width" : 200 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/f0959931aeb8aa174ef264d0b1ab7dd99cd22c03", + "width" : 64 + } ], + "name" : "Led Zeppelin", + "popularity" : 56, + "type" : "artist", + "uri" : "spotify:artist:36QJpDe2go2KgaRleHCDTp" +} diff --git a/vendor/jwilsson/spotify-web-api-php/tests/fixtures/artists.json b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/artists.json new file mode 100644 index 0000000..b1e21d5 --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/artists.json @@ -0,0 +1,67 @@ +{ + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/6v8FB84lnmJs434UJf2Mrm" + }, + "followers" : { + "href" : null, + "total" : 353848 + }, + "genres" : [ "country rock", "folk rock", "roots rock", "singer-songwriter" ], + "href" : "https://api.spotify.com/v1/artists/6v8FB84lnmJs434UJf2Mrm", + "id" : "6v8FB84lnmJs434UJf2Mrm", + "images" : [ { + "height" : 667, + "url" : "https://i.scdn.co/image/9cf3c4417d299cd974c156636aed25cf776cc588", + "width" : 1000 + }, { + "height" : 427, + "url" : "https://i.scdn.co/image/28056039df6056d8cadc9f10a6bf407af316bf32", + "width" : 640 + }, { + "height" : 133, + "url" : "https://i.scdn.co/image/fe3f3cc057d65f0a3425f1b95f589f0a894bac56", + "width" : 200 + }, { + "height" : 43, + "url" : "https://i.scdn.co/image/fe257b86f46d004487856f413d4e1e8f505986de", + "width" : 64 + } ], + "name" : "Neil Young", + "popularity" : 65, + "type" : "artist", + "uri" : "spotify:artist:6v8FB84lnmJs434UJf2Mrm" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/6olE6TJLqED3rqDCT0FyPh" + }, + "followers" : { + "href" : null, + "total" : 962884 + }, + "genres" : [ "alternative rock", "grunge", "permanent wave" ], + "href" : "https://api.spotify.com/v1/artists/6olE6TJLqED3rqDCT0FyPh", + "id" : "6olE6TJLqED3rqDCT0FyPh", + "images" : [ { + "height" : 1057, + "url" : "https://i.scdn.co/image/5d66307bbf73337bb073bfb2bf242e099a47e219", + "width" : 1000 + }, { + "height" : 677, + "url" : "https://i.scdn.co/image/695867a7c6a0df25c5bddf0b00cc2cfde35b3ffc", + "width" : 640 + }, { + "height" : 211, + "url" : "https://i.scdn.co/image/3a9c12e86ad8e2bbecb0e919b80bb5ece6f1dbe3", + "width" : 200 + }, { + "height" : 68, + "url" : "https://i.scdn.co/image/5ae6f10633adc53210cd18a4f216f27de330f19d", + "width" : 64 + } ], + "name" : "Nirvana", + "popularity" : 67, + "type" : "artist", + "uri" : "spotify:artist:6olE6TJLqED3rqDCT0FyPh" + } ] +} diff --git a/vendor/jwilsson/spotify-web-api-php/tests/fixtures/featured-playlists.json b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/featured-playlists.json new file mode 100644 index 0000000..6b111c4 --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/featured-playlists.json @@ -0,0 +1,147 @@ +{ + "message" : "Your Saturday night just got so much better...", + "playlists" : { + "href" : "https://api.spotify.com/v1/browse/featured-playlists?country=SE&locale=sv_SE×tamp=2014-10-25T21:00:00&offset=0&limit=5", + "items" : [ { + "collaborative" : false, + "external_urls" : { + "spotify" : "http://open.spotify.com/user/spotify/playlist/5Oo5QuAOjjXMMXphFqC6eo" + }, + "href" : "https://api.spotify.com/v1/users/spotify/playlists/5Oo5QuAOjjXMMXphFqC6eo", + "id" : "5Oo5QuAOjjXMMXphFqC6eo", + "images" : [ { + "url" : "https://i.scdn.co/image/48294c9d3d171ac4c5b6400e0d8f2c357569ce75" + } ], + "name" : "Weekend Hangouts", + "owner" : { + "external_urls" : { + "spotify" : "http://open.spotify.com/user/spotify" + }, + "href" : "https://api.spotify.com/v1/users/spotify", + "id" : "spotify", + "type" : "user", + "uri" : "spotify:user:spotify" + }, + "public" : null, + "tracks" : { + "href" : "https://api.spotify.com/v1/users/spotify/playlists/5Oo5QuAOjjXMMXphFqC6eo/tracks", + "total" : 223 + }, + "type" : "playlist", + "uri" : "spotify:user:spotify:playlist:5Oo5QuAOjjXMMXphFqC6eo" + }, { + "collaborative" : false, + "external_urls" : { + "spotify" : "http://open.spotify.com/user/tv4se/playlist/6gI54Ois1dlCKZJqrLyVKN" + }, + "href" : "https://api.spotify.com/v1/users/tv4se/playlists/6gI54Ois1dlCKZJqrLyVKN", + "id" : "6gI54Ois1dlCKZJqrLyVKN", + "images" : [ { + "url" : "https://i.scdn.co/image/3be6c5a5879dc630c7136a63e30ad61f55c64ec6" + } ], + "name" : "SÅ MYCKET BÄTTRE 2014", + "owner" : { + "external_urls" : { + "spotify" : "http://open.spotify.com/user/tv4se" + }, + "href" : "https://api.spotify.com/v1/users/tv4se", + "id" : "tv4se", + "type" : "user", + "uri" : "spotify:user:tv4se" + }, + "public" : null, + "tracks" : { + "href" : "https://api.spotify.com/v1/users/tv4se/playlists/6gI54Ois1dlCKZJqrLyVKN/tracks", + "total" : 12 + }, + "type" : "playlist", + "uri" : "spotify:user:tv4se:playlist:6gI54Ois1dlCKZJqrLyVKN" + }, { + "collaborative" : false, + "external_urls" : { + "spotify" : "http://open.spotify.com/user/spotify/playlist/63UdjnaWDFp0VNrwQ28qUw" + }, + "href" : "https://api.spotify.com/v1/users/spotify/playlists/63UdjnaWDFp0VNrwQ28qUw", + "id" : "63UdjnaWDFp0VNrwQ28qUw", + "images" : [ { + "url" : "https://i.scdn.co/image/68dc8102daec4e47d501f5f83f0ed7c59e14ab23" + } ], + "name" : "Dinner Party", + "owner" : { + "external_urls" : { + "spotify" : "http://open.spotify.com/user/spotify" + }, + "href" : "https://api.spotify.com/v1/users/spotify", + "id" : "spotify", + "type" : "user", + "uri" : "spotify:user:spotify" + }, + "public" : null, + "tracks" : { + "href" : "https://api.spotify.com/v1/users/spotify/playlists/63UdjnaWDFp0VNrwQ28qUw/tracks", + "total" : 121 + }, + "type" : "playlist", + "uri" : "spotify:user:spotify:playlist:63UdjnaWDFp0VNrwQ28qUw" + }, { + "collaborative" : false, + "external_urls" : { + "spotify" : "http://open.spotify.com/user/spotify/playlist/5ILSWr90l2Bgk89xuhsysy" + }, + "href" : "https://api.spotify.com/v1/users/spotify/playlists/5ILSWr90l2Bgk89xuhsysy", + "id" : "5ILSWr90l2Bgk89xuhsysy", + "images" : [ { + "url" : "https://i.scdn.co/image/b15df0f45ccf5b0b4ac97674658de5b42c342df1" + } ], + "name" : "Pre-Party", + "owner" : { + "external_urls" : { + "spotify" : "http://open.spotify.com/user/spotify" + }, + "href" : "https://api.spotify.com/v1/users/spotify", + "id" : "spotify", + "type" : "user", + "uri" : "spotify:user:spotify" + }, + "public" : null, + "tracks" : { + "href" : "https://api.spotify.com/v1/users/spotify/playlists/5ILSWr90l2Bgk89xuhsysy/tracks", + "total" : 106 + }, + "type" : "playlist", + "uri" : "spotify:user:spotify:playlist:5ILSWr90l2Bgk89xuhsysy" + }, { + "collaborative" : false, + "external_urls" : { + "spotify" : "http://open.spotify.com/user/spotify/playlist/7BixMZxL4bhgULJQ5wPbUz" + }, + "href" : "https://api.spotify.com/v1/users/spotify/playlists/7BixMZxL4bhgULJQ5wPbUz", + "id" : "7BixMZxL4bhgULJQ5wPbUz", + "images" : [ { + "url" : "https://i.scdn.co/image/202df3b14174a06f1cd9541302d51c291eed8bee" + } ], + "name" : "Chillax", + "owner" : { + "external_urls" : { + "spotify" : "http://open.spotify.com/user/spotify" + }, + "href" : "https://api.spotify.com/v1/users/spotify", + "id" : "spotify", + "type" : "user", + "uri" : "spotify:user:spotify" + }, + "public" : null, + "tracks" : { + "href" : "https://api.spotify.com/v1/users/spotify/playlists/7BixMZxL4bhgULJQ5wPbUz/tracks", + "total" : 102 + }, + "type" : "playlist", + "uri" : "spotify:user:spotify:playlist:7BixMZxL4bhgULJQ5wPbUz" + } ], + "limit" : 5, + "next" : "https://api.spotify.com/v1/browse/featured-playlists?country=SE&locale=sv_SE×tamp=2014-10-25T21:00:00&offset=5&limit=5", + "offset" : 0, + "previous" : null, + "total" : 12 + } +} diff --git a/vendor/jwilsson/spotify-web-api-php/tests/fixtures/new-releases.json b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/new-releases.json new file mode 100644 index 0000000..bbb2419 --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/new-releases.json @@ -0,0 +1,131 @@ +{ + "albums" : { + "href" : "https://api.spotify.com/v1/browse/new-releases?country=SE&offset=0&limit=5", + "items" : [ { + "album_type" : "album", + "available_markets" : [ "AT", "AU", "CH", "CZ", "DE", "FI", "IE", "NL", "NZ", "SI", "SK", "HK", "MY", "PH", "SG", "TW", "BG", "CY", "EE", "GR", "LT", "LV", "RO", "TR", "AD", "BE", "DK", "ES", "FR", "HU", "IT", "LI", "LU", "MC", "MT", "NO", "PL", "SE", "GB", "PT", "IS", "UY", "AR", "CL", "PY", "BO", "BR", "DO", "CO", "EC", "PA", "PE", "CR", "GT", "HN", "NI", "SV" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/59Mjf7KcSU7niudeL4JsmQ" + }, + "href" : "https://api.spotify.com/v1/albums/59Mjf7KcSU7niudeL4JsmQ", + "id" : "59Mjf7KcSU7niudeL4JsmQ", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/34ad44065027a8e99b5fc071b09b8109928a1e59", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/b9fc808bcf4a9e1d9576489e3f90ec6bfbf762df", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/7319c88ba4e6c9a091dd62a1bfbc1f72fe68e779", + "width" : 64 + } ], + "name" : "Feels So Good", + "type" : "album", + "uri" : "spotify:album:59Mjf7KcSU7niudeL4JsmQ" + }, { + "album_type" : "album", + "available_markets" : [ "AT", "BE", "CH", "CZ", "DE", "EE", "FI", "IE", "LI", "LT", "LU", "LV", "NL", "SE", "SK", "TR" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/4KyyjcX6N1xcxTqdOTOghN" + }, + "href" : "https://api.spotify.com/v1/albums/4KyyjcX6N1xcxTqdOTOghN", + "id" : "4KyyjcX6N1xcxTqdOTOghN", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/4b12129e2b6630cab568c2941835d0e28f85840b", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/c9ed2290296aa4038139f708ff7b6cefa65b98af", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/e8dd9b7e27363122b27eb99e63bf274a0849bd5f", + "width" : 64 + } ], + "name" : "Back to Earth", + "type" : "album", + "uri" : "spotify:album:4KyyjcX6N1xcxTqdOTOghN" + }, { + "album_type" : "album", + "available_markets" : [ "AT", "CH", "CZ", "DE", "FI", "NL", "NZ", "SE", "SI", "SK" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/7yYva2MJYef1aOFVBtlA8I" + }, + "href" : "https://api.spotify.com/v1/albums/7yYva2MJYef1aOFVBtlA8I", + "id" : "7yYva2MJYef1aOFVBtlA8I", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/a904eaf3c6440542493b10ef552cd955a8b1515a", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/c9bbdc3adc7a8a2f159f31da13a989457572353d", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/fdaa69c01adb12a603a7af8f4bfbce39a413ef21", + "width" : 64 + } ], + "name" : "Nostalgia", + "type" : "album", + "uri" : "spotify:album:7yYva2MJYef1aOFVBtlA8I" + }, { + "album_type" : "album", + "available_markets" : [ "SE" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/517pAxOuxIz2HyltDuBWYf" + }, + "href" : "https://api.spotify.com/v1/albums/517pAxOuxIz2HyltDuBWYf", + "id" : "517pAxOuxIz2HyltDuBWYf", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/8db1fb7e5589d4d98022f3cc4ec0175a8bbc9b0e", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/1342d206b6f1191c7b900878e1b2d1f147215d9d", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/091236fc857a1c13a84319e614a0611d6829324f", + "width" : 64 + } ], + "name" : "Så mycket bättre 5 - Orups dag", + "type" : "album", + "uri" : "spotify:album:517pAxOuxIz2HyltDuBWYf" + }, { + "album_type" : "single", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/50nrlTw0DWxBBvjNh1aiaq" + }, + "href" : "https://api.spotify.com/v1/albums/50nrlTw0DWxBBvjNh1aiaq", + "id" : "50nrlTw0DWxBBvjNh1aiaq", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/e351bd24bd85140f3558022a101363bfc61c7e30", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/159230ff048626f793c86c7763c2dc782430d95e", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/8118a38f53efeb1dc9049d673851ed0ae3b6ac08", + "width" : 64 + } ], + "name" : "Skuggor från Karelen", + "type" : "album", + "uri" : "spotify:album:50nrlTw0DWxBBvjNh1aiaq" + } ], + "limit" : 5, + "next" : "https://api.spotify.com/v1/browse/new-releases?country=SE&offset=5&limit=5", + "offset" : 0, + "previous" : null, + "total" : 500 + } +} diff --git a/vendor/jwilsson/spotify-web-api-php/tests/fixtures/search-album.json b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/search-album.json new file mode 100644 index 0000000..6fb4cf7 --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/search-album.json @@ -0,0 +1,491 @@ +{ + "albums" : { + "href" : "https://api.spotify.com/v1/search?query=blur&offset=0&limit=20&type=album", + "items" : [ { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/1bgkxe4t0HNeLn9rhrx79x" + }, + "href" : "https://api.spotify.com/v1/albums/1bgkxe4t0HNeLn9rhrx79x", + "id" : "1bgkxe4t0HNeLn9rhrx79x", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/64d37b4adad0bad4c31ef0de9d499d94596a2060", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/1590a83b6e1ec12478a2fe8e993a4eecc261605e", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/77203b4469cb6dba1710c44f838ff6ab3a0433b7", + "width" : 64 + } ], + "name" : "Blur: The Best Of", + "type" : "album", + "uri" : "spotify:album:1bgkxe4t0HNeLn9rhrx79x" + }, { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/7HvIrSkKGJCzd8AKyjTJ6Q" + }, + "href" : "https://api.spotify.com/v1/albums/7HvIrSkKGJCzd8AKyjTJ6Q", + "id" : "7HvIrSkKGJCzd8AKyjTJ6Q", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/f701e71cd440d0c39e78ae84b11b521c151ca952", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/2f86cc9cd03fd681f0047e325538204913133de9", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/266f1a256cd75a954f5490dfb6455ae5e3c75cff", + "width" : 64 + } ], + "name" : "Blur [Special Edition]", + "type" : "album", + "uri" : "spotify:album:7HvIrSkKGJCzd8AKyjTJ6Q" + }, { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/0DBkFC6739trhCoVreZyds" + }, + "href" : "https://api.spotify.com/v1/albums/0DBkFC6739trhCoVreZyds", + "id" : "0DBkFC6739trhCoVreZyds", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/03c8065209537b0ac1c57c1ba9699b0220a4d4b8", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/ff643365919768d1d742a8cd7e7e199e401169df", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/eeaa64d81f9cbe8e30671a392bba2c78de766067", + "width" : 64 + } ], + "name" : "Parklife [Special Edition]", + "type" : "album", + "uri" : "spotify:album:0DBkFC6739trhCoVreZyds" + }, { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/7BiMMjtvTX0OiB8Yi7CFB1" + }, + "href" : "https://api.spotify.com/v1/albums/7BiMMjtvTX0OiB8Yi7CFB1", + "id" : "7BiMMjtvTX0OiB8Yi7CFB1", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/6fa8258b54a9be6d7a9f06814ff2c92514a1f873", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/b1174cbd3654639a2ac5831b2341f3a361cc568e", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/8caf4cb98b75f9adc9f172c21c5b66dbcbefaee7", + "width" : 64 + } ], + "name" : "The Great Escape [Special Edition]", + "type" : "album", + "uri" : "spotify:album:7BiMMjtvTX0OiB8Yi7CFB1" + }, { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/6P3DICUiFYGBz5Ptdn57sG" + }, + "href" : "https://api.spotify.com/v1/albums/6P3DICUiFYGBz5Ptdn57sG", + "id" : "6P3DICUiFYGBz5Ptdn57sG", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/19363cb2140fd4e8e6dd6f028d614465ac610ec0", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/007bc152e0b27a55a488954c74498ab8d4e4f1e1", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/0fde777508651ce4d71d49da8e1f1d2f09be64cf", + "width" : 64 + } ], + "name" : "Midlife: A Beginner's Guide To Blur", + "type" : "album", + "uri" : "spotify:album:6P3DICUiFYGBz5Ptdn57sG" + }, { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/3VyHgnHE4cp7YuU7skzuJ2" + }, + "href" : "https://api.spotify.com/v1/albums/3VyHgnHE4cp7YuU7skzuJ2", + "id" : "3VyHgnHE4cp7YuU7skzuJ2", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/39f5e076950b20d1410b95932bf6f7b62e6024f4", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/ab4864c47847f5b7623197d7b13475629630b466", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/1b5c8fd40c1d7371d928ad2a99aa77fa4e34c112", + "width" : 64 + } ], + "name" : "Blur", + "type" : "album", + "uri" : "spotify:album:3VyHgnHE4cp7YuU7skzuJ2" + }, { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/5YuZ4DjvtZBywtIbHIqtGJ" + }, + "href" : "https://api.spotify.com/v1/albums/5YuZ4DjvtZBywtIbHIqtGJ", + "id" : "5YuZ4DjvtZBywtIbHIqtGJ", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/bc4775423b7fcb1020df3bf7ca7d8eb1b17b5212", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/c3f1e7ac6a7dbcfb24bf8a34aee5e7e03520fe2f", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/c91d9f258227bc071370208cd1fc01340f524489", + "width" : 64 + } ], + "name" : "13", + "type" : "album", + "uri" : "spotify:album:5YuZ4DjvtZBywtIbHIqtGJ" + }, { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/2gu1tAkUSoe5zTJNM0qU3g" + }, + "href" : "https://api.spotify.com/v1/albums/2gu1tAkUSoe5zTJNM0qU3g", + "id" : "2gu1tAkUSoe5zTJNM0qU3g", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/c2eeefac6a0d26abbd03fbb0754ae9e5cce0ff68", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/6c11873c57173ec992aca45083c60ae1e5c5f685", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/95b6bd634795d9a8d6577e97c5a38be68d2345d2", + "width" : 64 + } ], + "name" : "Modern Life Is Rubbish [Special Edition]", + "type" : "album", + "uri" : "spotify:album:2gu1tAkUSoe5zTJNM0qU3g" + }, { + "album_type" : "single", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/4KGXsaL5QHwStv15Mf7CHa" + }, + "href" : "https://api.spotify.com/v1/albums/4KGXsaL5QHwStv15Mf7CHa", + "id" : "4KGXsaL5QHwStv15Mf7CHa", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/dc023f2adab949f4aba8bd40334492ef92de229f", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/47f06310b20144fba6168039f0ec7b1b718110c0", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/195b6f14876082aeee6a73bc24b8bd0658c9c7fd", + "width" : 64 + } ], + "name" : "Blur", + "type" : "album", + "uri" : "spotify:album:4KGXsaL5QHwStv15Mf7CHa" + }, { + "album_type" : "single", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/17uiLcsHcK3RcSWS8XO54y" + }, + "href" : "https://api.spotify.com/v1/albums/17uiLcsHcK3RcSWS8XO54y", + "id" : "17uiLcsHcK3RcSWS8XO54y", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/802ccdc98212db212e8a81f12470ecacf02995a7", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/02e59e28f4cd0f2bed98478faf3ffbff7894378d", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/e9764842d735334d4da8c4a939721804684bb4d6", + "width" : 64 + } ], + "name" : "Under the Westway - Single", + "type" : "album", + "uri" : "spotify:album:17uiLcsHcK3RcSWS8XO54y" + }, { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/0egRXi9lcYlIGJZ01SpYM3" + }, + "href" : "https://api.spotify.com/v1/albums/0egRXi9lcYlIGJZ01SpYM3", + "id" : "0egRXi9lcYlIGJZ01SpYM3", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/12e72e3e7fc9d644927bcf8bf49587a19f64f346", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/f3b3878e86ebf0a1681ccd054f89fa2c754d64bb", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/bdb16f332b3fbae09d86cafd84a86e845d82ef7f", + "width" : 64 + } ], + "name" : "Think Tank", + "type" : "album", + "uri" : "spotify:album:0egRXi9lcYlIGJZ01SpYM3" + }, { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/0cTdvscLZjCTEKxYUlJFwa" + }, + "href" : "https://api.spotify.com/v1/albums/0cTdvscLZjCTEKxYUlJFwa", + "id" : "0cTdvscLZjCTEKxYUlJFwa", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/2a81e7aee9b439086505f04e0ea8aefa128a3979", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/cd4834221762cb4be6b4f176dba94b72d54a23bd", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/4038f8a3a836dd63eace9b9bdf3b86ff1b85ae55", + "width" : 64 + } ], + "name" : "Leisure [Special Edition]", + "type" : "album", + "uri" : "spotify:album:0cTdvscLZjCTEKxYUlJFwa" + }, { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/7xxg6PunBVeuTliClh4H5p" + }, + "href" : "https://api.spotify.com/v1/albums/7xxg6PunBVeuTliClh4H5p", + "id" : "7xxg6PunBVeuTliClh4H5p", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/0b9bcd0fec270a14e10c513336feca6f0311425e", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/6d3e4992a8d29e8744c76e3b788ff5581925f316", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/451d3e26a2fda68790164d546a8aa31bfcf5e12d", + "width" : 64 + } ], + "name" : "Parklive", + "type" : "album", + "uri" : "spotify:album:7xxg6PunBVeuTliClh4H5p" + }, { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/0YS25Dr3hMtMFlVTfuvzl4" + }, + "href" : "https://api.spotify.com/v1/albums/0YS25Dr3hMtMFlVTfuvzl4", + "id" : "0YS25Dr3hMtMFlVTfuvzl4", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/03c8065209537b0ac1c57c1ba9699b0220a4d4b8", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/ff643365919768d1d742a8cd7e7e199e401169df", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/eeaa64d81f9cbe8e30671a392bba2c78de766067", + "width" : 64 + } ], + "name" : "Parklife", + "type" : "album", + "uri" : "spotify:album:0YS25Dr3hMtMFlVTfuvzl4" + }, { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/1uF9iZYiDY2p5yhRFNJzjW" + }, + "href" : "https://api.spotify.com/v1/albums/1uF9iZYiDY2p5yhRFNJzjW", + "id" : "1uF9iZYiDY2p5yhRFNJzjW", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/1bcea0cb3c994418cc5a5937337b06bf35cd96c2", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/49114f3245eaa8028a193085bf6a2177f41e12cf", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/99bf65de703ff621a24affe84483ff1a042f7627", + "width" : 64 + } ], + "name" : "13 [Special Edition]", + "type" : "album", + "uri" : "spotify:album:1uF9iZYiDY2p5yhRFNJzjW" + }, { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/4s4QIAQ1gpnuGWT5KZKjtr" + }, + "href" : "https://api.spotify.com/v1/albums/4s4QIAQ1gpnuGWT5KZKjtr", + "id" : "4s4QIAQ1gpnuGWT5KZKjtr", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/ffeafc4bbf32b429983b18e6fefae3e8627156e2", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/b6fdcc68c0b7e4b3f2284993e5537b6b911ebf5a", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/e9fb4c60c04fd64342b616656c1e6f1fd919a502", + "width" : 64 + } ], + "name" : "All The People... Blur Live At Hyde Park 02/07/2009", + "type" : "album", + "uri" : "spotify:album:4s4QIAQ1gpnuGWT5KZKjtr" + }, { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/68P7oIUK327pt5tDIZJd63" + }, + "href" : "https://api.spotify.com/v1/albums/68P7oIUK327pt5tDIZJd63", + "id" : "68P7oIUK327pt5tDIZJd63", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/12e72e3e7fc9d644927bcf8bf49587a19f64f346", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/f3b3878e86ebf0a1681ccd054f89fa2c754d64bb", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/bdb16f332b3fbae09d86cafd84a86e845d82ef7f", + "width" : 64 + } ], + "name" : "Think Tank [Special Edition]", + "type" : "album", + "uri" : "spotify:album:68P7oIUK327pt5tDIZJd63" + }, { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/3rXnMAuqzR6UQl6gBlJrDL" + }, + "href" : "https://api.spotify.com/v1/albums/3rXnMAuqzR6UQl6gBlJrDL", + "id" : "3rXnMAuqzR6UQl6gBlJrDL", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/ece34ad19a2dcb5e1376026bf329bc875fef4f99", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/0eb45530a7e13aef826c7c7acbec7233d5ed8b2a", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/0fdc38bd236f028f7a6fde5ba152779a90031d46", + "width" : 64 + } ], + "name" : "The Great Escape", + "type" : "album", + "uri" : "spotify:album:3rXnMAuqzR6UQl6gBlJrDL" + }, { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/2AAx5D9aJnP6XK859Q1Pyl" + }, + "href" : "https://api.spotify.com/v1/albums/2AAx5D9aJnP6XK859Q1Pyl", + "id" : "2AAx5D9aJnP6XK859Q1Pyl", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/731f004ddd99490e1e5b30de9f14a21a3ca7d212", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/1f504d0cfdf0454b616046f7d00d40540f70791f", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/7cb6254c5ec1e25eb71789966b7a0d5ab8f7dd3d", + "width" : 64 + } ], + "name" : "Leisure", + "type" : "album", + "uri" : "spotify:album:2AAx5D9aJnP6XK859Q1Pyl" + }, { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/23mDNB6otna4M0e8MORCsZ" + }, + "href" : "https://api.spotify.com/v1/albums/23mDNB6otna4M0e8MORCsZ", + "id" : "23mDNB6otna4M0e8MORCsZ", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/c2eeefac6a0d26abbd03fbb0754ae9e5cce0ff68", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/6c11873c57173ec992aca45083c60ae1e5c5f685", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/95b6bd634795d9a8d6577e97c5a38be68d2345d2", + "width" : 64 + } ], + "name" : "Modern Life Is Rubbish", + "type" : "album", + "uri" : "spotify:album:23mDNB6otna4M0e8MORCsZ" + } ], + "limit" : 20, + "next" : "https://api.spotify.com/v1/search?query=blur&offset=20&limit=20&type=album", + "offset" : 0, + "previous" : null, + "total" : 251 + } +} diff --git a/vendor/jwilsson/spotify-web-api-php/tests/fixtures/search-artist.json b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/search-artist.json new file mode 100644 index 0000000..90dec1a --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/search-artist.json @@ -0,0 +1,291 @@ +{ + "artists" : { + "href" : "https://api.spotify.com/v1/search?query=blur&offset=0&limit=20&type=artist", + "items" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/7MhMgCo0Bl0Kukl93PZbYS" + }, + "genres" : [ "britpop", "madchester" ], + "href" : "https://api.spotify.com/v1/artists/7MhMgCo0Bl0Kukl93PZbYS", + "id" : "7MhMgCo0Bl0Kukl93PZbYS", + "images" : [ { + "height" : 806, + "url" : "https://i.scdn.co/image/c43243b291c54f379219c7db655701ad0396286f", + "width" : 1000 + }, { + "height" : 516, + "url" : "https://i.scdn.co/image/e8e3ab8e998f360896e4989b915521364b90736e", + "width" : 640 + }, { + "height" : 161, + "url" : "https://i.scdn.co/image/01f9e2c5f17994d358ac111e48ddc10d74cbddee", + "width" : 200 + }, { + "height" : 52, + "url" : "https://i.scdn.co/image/cb0a151b66831ff9ee61798916152a3f6c84f972", + "width" : 64 + } ], + "name" : "Blur", + "popularity" : 56, + "type" : "artist", + "uri" : "spotify:artist:7MhMgCo0Bl0Kukl93PZbYS" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/7g62VYILD5ObgKWKJRI6vY" + }, + "genres" : [ ], + "href" : "https://api.spotify.com/v1/artists/7g62VYILD5ObgKWKJRI6vY", + "id" : "7g62VYILD5ObgKWKJRI6vY", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/1457be1091909a1dca1bd7b0115e7ea05a64542a", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/185f51bab69869e58901bf2283ae4b420674b6c0", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/3e9f39440d58fcbcf160c3f1d0f6739185ebe764", + "width" : 64 + } ], + "name" : "Moorea Blur", + "popularity" : 0, + "type" : "artist", + "uri" : "spotify:artist:7g62VYILD5ObgKWKJRI6vY" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/1lRAJ76z6bvECSpTHYQoyO" + }, + "genres" : [ ], + "href" : "https://api.spotify.com/v1/artists/1lRAJ76z6bvECSpTHYQoyO", + "id" : "1lRAJ76z6bvECSpTHYQoyO", + "images" : [ ], + "name" : "Motion Blur", + "popularity" : 0, + "type" : "artist", + "uri" : "spotify:artist:1lRAJ76z6bvECSpTHYQoyO" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/3OrIWUPgp8rHYNQjB0AmVc" + }, + "genres" : [ ], + "href" : "https://api.spotify.com/v1/artists/3OrIWUPgp8rHYNQjB0AmVc", + "id" : "3OrIWUPgp8rHYNQjB0AmVc", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/01385c6ea7ef8289d53f396e6f3095f045f632b8", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/b5e9e8eee10456d321f9285c8a186a9eee43401d", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/fa0848c15a8100c8deb6c6896015d6f7f5dc7e52", + "width" : 64 + } ], + "name" : "Calico Blur", + "popularity" : 0, + "type" : "artist", + "uri" : "spotify:artist:3OrIWUPgp8rHYNQjB0AmVc" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/6S1jz3WtJuzBIwjzdsi91n" + }, + "genres" : [ ], + "href" : "https://api.spotify.com/v1/artists/6S1jz3WtJuzBIwjzdsi91n", + "id" : "6S1jz3WtJuzBIwjzdsi91n", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/4d45f4b75e331c65582731f68b3c138c8b9a0f02", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/f93a0a46e72e4263952e13ee17a5126d3bf36d84", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/0fbba00c47168d68c95e725396c3fc61cd69895c", + "width" : 64 + } ], + "name" : "Psycho Blur", + "popularity" : 0, + "type" : "artist", + "uri" : "spotify:artist:6S1jz3WtJuzBIwjzdsi91n" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/3BanK4yL2jhgf1N3VPKlTU" + }, + "genres" : [ ], + "href" : "https://api.spotify.com/v1/artists/3BanK4yL2jhgf1N3VPKlTU", + "id" : "3BanK4yL2jhgf1N3VPKlTU", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/df0af1fb0192e09e4f01ff85fbc4b0e741c7cf7f", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/f7f42fc3040c70a9bd0c4963463d76110607d98d", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/a52a625da8acb49b0f33041ce06bef5c04ecda96", + "width" : 64 + } ], + "name" : "Panoramic Blur", + "popularity" : 0, + "type" : "artist", + "uri" : "spotify:artist:3BanK4yL2jhgf1N3VPKlTU" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/098K5q2u4YiyW97bvKbfd1" + }, + "genres" : [ ], + "href" : "https://api.spotify.com/v1/artists/098K5q2u4YiyW97bvKbfd1", + "id" : "098K5q2u4YiyW97bvKbfd1", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/9dfb5cb66a6bf952026d78916e1c9c3361a51fd8", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/0696b1896ab9cc776d04b2053415d80dca66bbc4", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/ba8d3bfaf54efe0c4702670dd3a89cb17fbbc288", + "width" : 64 + } ], + "name" : "Blur Project", + "popularity" : 1, + "type" : "artist", + "uri" : "spotify:artist:098K5q2u4YiyW97bvKbfd1" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/6AK6IQ7fC1GA3c81ISZAsQ" + }, + "genres" : [ ], + "href" : "https://api.spotify.com/v1/artists/6AK6IQ7fC1GA3c81ISZAsQ", + "id" : "6AK6IQ7fC1GA3c81ISZAsQ", + "images" : [ ], + "name" : "Nico Blur", + "popularity" : 0, + "type" : "artist", + "uri" : "spotify:artist:6AK6IQ7fC1GA3c81ISZAsQ" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/6anoYwcV8b2qTgLwrNyipq" + }, + "genres" : [ ], + "href" : "https://api.spotify.com/v1/artists/6anoYwcV8b2qTgLwrNyipq", + "id" : "6anoYwcV8b2qTgLwrNyipq", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/e1c898f55ee4d13e79052bd9cb35e01fd894241f", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/59a5158e9eb073097c09324dd679fff4291df012", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/8ca1232fe5f43c894af1f4d65b63a1f1f72d69a8", + "width" : 64 + } ], + "name" : "Point Blur", + "popularity" : 0, + "type" : "artist", + "uri" : "spotify:artist:6anoYwcV8b2qTgLwrNyipq" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/12UnqjmImdCGDS3bSH1dOe" + }, + "genres" : [ ], + "href" : "https://api.spotify.com/v1/artists/12UnqjmImdCGDS3bSH1dOe", + "id" : "12UnqjmImdCGDS3bSH1dOe", + "images" : [ ], + "name" : "Blur The Technicolor", + "popularity" : 0, + "type" : "artist", + "uri" : "spotify:artist:12UnqjmImdCGDS3bSH1dOe" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/5FbqP1p0vA6kT5sF3jr4Ur" + }, + "genres" : [ ], + "href" : "https://api.spotify.com/v1/artists/5FbqP1p0vA6kT5sF3jr4Ur", + "id" : "5FbqP1p0vA6kT5sF3jr4Ur", + "images" : [ ], + "name" : "Seymour AKA Blur", + "popularity" : 0, + "type" : "artist", + "uri" : "spotify:artist:5FbqP1p0vA6kT5sF3jr4Ur" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/4jGzAmE1ci50TbOgS0EGM5" + }, + "genres" : [ ], + "href" : "https://api.spotify.com/v1/artists/4jGzAmE1ci50TbOgS0EGM5", + "id" : "4jGzAmE1ci50TbOgS0EGM5", + "images" : [ ], + "name" : "Moment Sound Blur", + "popularity" : 0, + "type" : "artist", + "uri" : "spotify:artist:4jGzAmE1ci50TbOgS0EGM5" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/3FQlTlZ1Q94zxU2B5Vk8ib" + }, + "genres" : [ ], + "href" : "https://api.spotify.com/v1/artists/3FQlTlZ1Q94zxU2B5Vk8ib", + "id" : "3FQlTlZ1Q94zxU2B5Vk8ib", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/8ed651ddd4c6e7a4024b554a341d9b63e6b6976d", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/114039e3b7f365671f07a338271324e3c14c6cd8", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/f368a0479a6bb984a3304a30f30a8b258c26c0aa", + "width" : 64 + } ], + "name" : "Paul Miller presents: Motion Blur", + "popularity" : 0, + "type" : "artist", + "uri" : "spotify:artist:3FQlTlZ1Q94zxU2B5Vk8ib" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/0aPUx2j1RCs6iJFuhA9Goe" + }, + "genres" : [ ], + "href" : "https://api.spotify.com/v1/artists/0aPUx2j1RCs6iJFuhA9Goe", + "id" : "0aPUx2j1RCs6iJFuhA9Goe", + "images" : [ ], + "name" : "Paul Miller Presents Motion Blur", + "popularity" : 0, + "type" : "artist", + "uri" : "spotify:artist:0aPUx2j1RCs6iJFuhA9Goe" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/2vtVMKkCCkgTouX0RDZirb" + }, + "genres" : [ ], + "href" : "https://api.spotify.com/v1/artists/2vtVMKkCCkgTouX0RDZirb", + "id" : "2vtVMKkCCkgTouX0RDZirb", + "images" : [ ], + "name" : "Karaoke - Blur", + "popularity" : 0, + "type" : "artist", + "uri" : "spotify:artist:2vtVMKkCCkgTouX0RDZirb" + } ], + "limit" : 20, + "next" : null, + "offset" : 0, + "previous" : null, + "total" : 15 + } +} diff --git a/vendor/jwilsson/spotify-web-api-php/tests/fixtures/search-track.json b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/search-track.json new file mode 100644 index 0000000..0bf1518 --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/search-track.json @@ -0,0 +1,1181 @@ +{ + "tracks" : { + "href" : "https://api.spotify.com/v1/search?query=song+2&offset=0&limit=20&type=track", + "items" : [ { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/3oVGphWQJKx9bGmAgcsJEz" + }, + "href" : "https://api.spotify.com/v1/albums/3oVGphWQJKx9bGmAgcsJEz", + "id" : "3oVGphWQJKx9bGmAgcsJEz", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/10a3f52647fa90ce34092ab33335ba52632f9b20", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/9eced5939ce0959017f9447c6bbf8f2e55411d19", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/b3dbd6fa39737fde7f2643576dfd6fb4b90612ab", + "width" : 64 + } ], + "name" : "Classical Music You'll Know, Vol. 2", + "type" : "album", + "uri" : "spotify:album:3oVGphWQJKx9bGmAgcsJEz" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/5wTAi7QkpP6kp8a54lmTOq" + }, + "href" : "https://api.spotify.com/v1/artists/5wTAi7QkpP6kp8a54lmTOq", + "id" : "5wTAi7QkpP6kp8a54lmTOq", + "name" : "Johannes Brahms", + "type" : "artist", + "uri" : "spotify:artist:5wTAi7QkpP6kp8a54lmTOq" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/2cnyJZ5ThoBGnPsXFvnwYG" + }, + "href" : "https://api.spotify.com/v1/artists/2cnyJZ5ThoBGnPsXFvnwYG", + "id" : "2cnyJZ5ThoBGnPsXFvnwYG", + "name" : "Capital City Symphony", + "type" : "artist", + "uri" : "spotify:artist:2cnyJZ5ThoBGnPsXFvnwYG" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/27Q9cug2S8OLaUxnqDbnJ4" + }, + "href" : "https://api.spotify.com/v1/artists/27Q9cug2S8OLaUxnqDbnJ4", + "id" : "27Q9cug2S8OLaUxnqDbnJ4", + "name" : "Carmen Dragon", + "type" : "artist", + "uri" : "spotify:artist:27Q9cug2S8OLaUxnqDbnJ4" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 139346, + "explicit" : false, + "external_ids" : { + "isrc" : "USV291499678" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/3f00opLou6rzQCkgM5Qhpk" + }, + "href" : "https://api.spotify.com/v1/tracks/3f00opLou6rzQCkgM5Qhpk", + "id" : "3f00opLou6rzQCkgM5Qhpk", + "name" : "Cradle Song, Op. 49, No. 4", + "popularity" : 0, + "preview_url" : "https://p.scdn.co/mp3-preview/b319ac172ee420dda0278a0af5d2994197171381", + "track_number" : 44, + "type" : "track", + "uri" : "spotify:track:3f00opLou6rzQCkgM5Qhpk" + }, { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/1bgkxe4t0HNeLn9rhrx79x" + }, + "href" : "https://api.spotify.com/v1/albums/1bgkxe4t0HNeLn9rhrx79x", + "id" : "1bgkxe4t0HNeLn9rhrx79x", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/64d37b4adad0bad4c31ef0de9d499d94596a2060", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/1590a83b6e1ec12478a2fe8e993a4eecc261605e", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/77203b4469cb6dba1710c44f838ff6ab3a0433b7", + "width" : 64 + } ], + "name" : "Blur: The Best Of", + "type" : "album", + "uri" : "spotify:album:1bgkxe4t0HNeLn9rhrx79x" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/7MhMgCo0Bl0Kukl93PZbYS" + }, + "href" : "https://api.spotify.com/v1/artists/7MhMgCo0Bl0Kukl93PZbYS", + "id" : "7MhMgCo0Bl0Kukl93PZbYS", + "name" : "Blur", + "type" : "artist", + "uri" : "spotify:artist:7MhMgCo0Bl0Kukl93PZbYS" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 121880, + "explicit" : false, + "external_ids" : { + "isrc" : "GBAYE9600015" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/3GfOAdcoc3X5GPiiXmpBjK" + }, + "href" : "https://api.spotify.com/v1/tracks/3GfOAdcoc3X5GPiiXmpBjK", + "id" : "3GfOAdcoc3X5GPiiXmpBjK", + "name" : "Song 2", + "popularity" : 74, + "preview_url" : "https://p.scdn.co/mp3-preview/2ef05c62aab0a17fc676ffa8a92398b2d3af0ce6", + "track_number" : 2, + "type" : "track", + "uri" : "spotify:track:3GfOAdcoc3X5GPiiXmpBjK" + }, { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/7HvIrSkKGJCzd8AKyjTJ6Q" + }, + "href" : "https://api.spotify.com/v1/albums/7HvIrSkKGJCzd8AKyjTJ6Q", + "id" : "7HvIrSkKGJCzd8AKyjTJ6Q", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/f701e71cd440d0c39e78ae84b11b521c151ca952", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/2f86cc9cd03fd681f0047e325538204913133de9", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/266f1a256cd75a954f5490dfb6455ae5e3c75cff", + "width" : 64 + } ], + "name" : "Blur [Special Edition]", + "type" : "album", + "uri" : "spotify:album:7HvIrSkKGJCzd8AKyjTJ6Q" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/7MhMgCo0Bl0Kukl93PZbYS" + }, + "href" : "https://api.spotify.com/v1/artists/7MhMgCo0Bl0Kukl93PZbYS", + "id" : "7MhMgCo0Bl0Kukl93PZbYS", + "name" : "Blur", + "type" : "artist", + "uri" : "spotify:artist:7MhMgCo0Bl0Kukl93PZbYS" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 121160, + "explicit" : false, + "external_ids" : { + "isrc" : "GBAYE1200348" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/1FTSo4v6BOZH9QxKc3MbVM" + }, + "href" : "https://api.spotify.com/v1/tracks/1FTSo4v6BOZH9QxKc3MbVM", + "id" : "1FTSo4v6BOZH9QxKc3MbVM", + "name" : "Song 2 - 2012 Remastered Version", + "popularity" : 68, + "preview_url" : "https://p.scdn.co/mp3-preview/f3fc66e8c2711d4739131432594b01c9bd786b71", + "track_number" : 2, + "type" : "track", + "uri" : "spotify:track:1FTSo4v6BOZH9QxKc3MbVM" + }, { + "album" : { + "album_type" : "album", + "available_markets" : [ "AR", "AT", "AU", "BE", "BR", "CH", "CL", "CO", "CY", "CZ", "DE", "DK", "EE", "ES", "FI", "GB", "GR", "HK", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MY", "NL", "NO", "NZ", "PH", "PL", "PT", "RO", "SE", "SG", "SI", "SK", "TR", "TW" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/2l8AfaaUCWRasDQJMEmc5J" + }, + "href" : "https://api.spotify.com/v1/albums/2l8AfaaUCWRasDQJMEmc5J", + "id" : "2l8AfaaUCWRasDQJMEmc5J", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/2eed6216863940b6a2acc269e56ecc4d9971d073", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/184c4a16ea42cfee76640df0be900771d3ed7c1c", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/b5518d0f963f9e4ac480507681eb389fb3e4476b", + "width" : 64 + } ], + "name" : "Going Down To The River", + "type" : "album", + "uri" : "spotify:album:2l8AfaaUCWRasDQJMEmc5J" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/2WO6GcXH1rWwzge9wOnuxm" + }, + "href" : "https://api.spotify.com/v1/artists/2WO6GcXH1rWwzge9wOnuxm", + "id" : "2WO6GcXH1rWwzge9wOnuxm", + "name" : "Doug Seegers", + "type" : "artist", + "uri" : "spotify:artist:2WO6GcXH1rWwzge9wOnuxm" + } ], + "available_markets" : [ "AR", "AT", "AU", "BE", "BR", "CH", "CL", "CO", "CY", "CZ", "DE", "DK", "EE", "ES", "FI", "GB", "GR", "HK", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MY", "NL", "NO", "NZ", "PH", "PL", "PT", "RO", "SE", "SG", "SI", "SK", "TR", "TW" ], + "disc_number" : 1, + "duration_ms" : 209933, + "explicit" : false, + "external_ids" : { + "isrc" : "SEPEL1402301" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/3iFEYyvJcdEDqUMHUwlu6Y" + }, + "href" : "https://api.spotify.com/v1/tracks/3iFEYyvJcdEDqUMHUwlu6Y", + "id" : "3iFEYyvJcdEDqUMHUwlu6Y", + "name" : "Angie's Song", + "popularity" : 51, + "preview_url" : "https://p.scdn.co/mp3-preview/038e7d671a1cb55102b38e49c4944c14583942d3", + "track_number" : 1, + "type" : "track", + "uri" : "spotify:track:3iFEYyvJcdEDqUMHUwlu6Y" + }, { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/2qXCZn0iGL41LxeMBN7FPe" + }, + "href" : "https://api.spotify.com/v1/albums/2qXCZn0iGL41LxeMBN7FPe", + "id" : "2qXCZn0iGL41LxeMBN7FPe", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/8207d123804333af9f3d3955c4e3ffb3dbc3525e", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/e90c175e0beab07dcf78b6771ef53c49849b296a", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/32361242a1ced28ebcd35bb83c40c11a9ea7d10a", + "width" : 64 + } ], + "name" : "A Love Song to Finance", + "type" : "album", + "uri" : "spotify:album:2qXCZn0iGL41LxeMBN7FPe" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/6ApQXwvnRk07rZvtCVlZDs" + }, + "href" : "https://api.spotify.com/v1/artists/6ApQXwvnRk07rZvtCVlZDs", + "id" : "6ApQXwvnRk07rZvtCVlZDs", + "name" : "Jasmine Kennedy", + "type" : "artist", + "uri" : "spotify:artist:6ApQXwvnRk07rZvtCVlZDs" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 213000, + "explicit" : false, + "external_ids" : { + "isrc" : "UK4RA1300004" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/3BV9lwVoZ6iwCIQrpNM9KN" + }, + "href" : "https://api.spotify.com/v1/tracks/3BV9lwVoZ6iwCIQrpNM9KN", + "id" : "3BV9lwVoZ6iwCIQrpNM9KN", + "name" : "Percy Anderson", + "popularity" : 59, + "preview_url" : "https://p.scdn.co/mp3-preview/4f83b633ccf4071f215e326a55308b27d74241f2", + "track_number" : 4, + "type" : "track", + "uri" : "spotify:track:3BV9lwVoZ6iwCIQrpNM9KN" + }, { + "album" : { + "album_type" : "album", + "available_markets" : [ "AT", "AU", "BG", "CA", "CH", "CY", "DE", "ES", "GR", "HK", "LI", "MX", "MY", "NZ", "PH", "PT", "RO", "SE", "SG", "SI", "TW", "US" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/1VM5qKftnTKFU9rthvEgYx" + }, + "href" : "https://api.spotify.com/v1/albums/1VM5qKftnTKFU9rthvEgYx", + "id" : "1VM5qKftnTKFU9rthvEgYx", + "images" : [ { + "height" : 637, + "url" : "https://i.scdn.co/image/ee6d18ccc9e1efbef13b4259063e1d2ecb763f47", + "width" : 640 + }, { + "height" : 298, + "url" : "https://i.scdn.co/image/edc37bd681fce0d91e6bf3a2788b47fac14d93ea", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/fc3988c6745dd2eaab19c4519d3347ce0197b53a", + "width" : 64 + } ], + "name" : "Victorious: Music From The Hit TV Show", + "type" : "album", + "uri" : "spotify:album:1VM5qKftnTKFU9rthvEgYx" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/1KYszkVzlhV3rAqmAcYIgd" + }, + "href" : "https://api.spotify.com/v1/artists/1KYszkVzlhV3rAqmAcYIgd", + "id" : "1KYszkVzlhV3rAqmAcYIgd", + "name" : "Victorious Cast", + "type" : "artist", + "uri" : "spotify:artist:1KYszkVzlhV3rAqmAcYIgd" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/1b8ktET4P814G5Mnhw0Y27" + }, + "href" : "https://api.spotify.com/v1/artists/1b8ktET4P814G5Mnhw0Y27", + "id" : "1b8ktET4P814G5Mnhw0Y27", + "name" : "Leon Thomas, III", + "type" : "artist", + "uri" : "spotify:artist:1b8ktET4P814G5Mnhw0Y27" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/2OTfr6S2kuHRYStjt1IkY6" + }, + "href" : "https://api.spotify.com/v1/artists/2OTfr6S2kuHRYStjt1IkY6", + "id" : "2OTfr6S2kuHRYStjt1IkY6", + "name" : "Victoria Justice", + "type" : "artist", + "uri" : "spotify:artist:2OTfr6S2kuHRYStjt1IkY6" + } ], + "available_markets" : [ "AT", "AU", "BG", "CA", "CH", "CY", "DE", "ES", "GR", "HK", "LI", "MX", "MY", "NZ", "PH", "PT", "RO", "SE", "SG", "SI", "TW", "US" ], + "disc_number" : 1, + "duration_ms" : 218373, + "explicit" : false, + "external_ids" : { + "isrc" : "USSM11101547" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/0UwsTR4qFd0kjJviMtVBIs" + }, + "href" : "https://api.spotify.com/v1/tracks/0UwsTR4qFd0kjJviMtVBIs", + "id" : "0UwsTR4qFd0kjJviMtVBIs", + "name" : "Song 2 You", + "popularity" : 52, + "preview_url" : "https://p.scdn.co/mp3-preview/16ddb7948fa2e69c73ddb6edfe0211860cb60599", + "track_number" : 9, + "type" : "track", + "uri" : "spotify:track:0UwsTR4qFd0kjJviMtVBIs" + }, { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/5hjlzVCJCePW4DmMJVryla" + }, + "href" : "https://api.spotify.com/v1/albums/5hjlzVCJCePW4DmMJVryla", + "id" : "5hjlzVCJCePW4DmMJVryla", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/bf4c7c3a63b9398dc86b18ca03affb87098d7a9b", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/ae5c1e45cee082dfb43b1b1a51d3732c0c093743", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/9918c8edc9a2677dcbfa33de950cf9b28ac02a3e", + "width" : 64 + } ], + "name" : "Put Your Back N 2 It", + "type" : "album", + "uri" : "spotify:album:5hjlzVCJCePW4DmMJVryla" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/2ueoLVCXQ948OfhVvAy3Nn" + }, + "href" : "https://api.spotify.com/v1/artists/2ueoLVCXQ948OfhVvAy3Nn", + "id" : "2ueoLVCXQ948OfhVvAy3Nn", + "name" : "Perfume Genius", + "type" : "artist", + "uri" : "spotify:artist:2ueoLVCXQ948OfhVvAy3Nn" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 193306, + "explicit" : false, + "external_ids" : { + "isrc" : "GB7TY1102002" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/7eqvBMxS4zAunq8DlI4Jij" + }, + "href" : "https://api.spotify.com/v1/tracks/7eqvBMxS4zAunq8DlI4Jij", + "id" : "7eqvBMxS4zAunq8DlI4Jij", + "name" : "Normal Song", + "popularity" : 55, + "preview_url" : "https://p.scdn.co/mp3-preview/83add024673fc93a390c49d15320bae927eb3417", + "track_number" : 2, + "type" : "track", + "uri" : "spotify:track:7eqvBMxS4zAunq8DlI4Jij" + }, { + "album" : { + "album_type" : "single", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/13OkOMXSrWYIbw6scZSzif" + }, + "href" : "https://api.spotify.com/v1/albums/13OkOMXSrWYIbw6scZSzif", + "id" : "13OkOMXSrWYIbw6scZSzif", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/a493f6dcd829b7cd8ae13b884231187da64075a6", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/63e94b1ec3a1974f31674ff6bf597837aada5333", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/d06a79e52a80005a8dd5aad1fe335e29664d7eb3", + "width" : 64 + } ], + "name" : "The Walking Dead: AMC Original Soundtrack, Vol. 2", + "type" : "album", + "uri" : "spotify:album:13OkOMXSrWYIbw6scZSzif" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/1KNNZV9twnpQBqyUoGvWA6" + }, + "href" : "https://api.spotify.com/v1/artists/1KNNZV9twnpQBqyUoGvWA6", + "id" : "1KNNZV9twnpQBqyUoGvWA6", + "name" : "Lee DeWyze", + "type" : "artist", + "uri" : "spotify:artist:1KNNZV9twnpQBqyUoGvWA6" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "disc_number" : 1, + "duration_ms" : 254706, + "explicit" : false, + "external_ids" : { + "isrc" : "USVG21403526" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/4cXh7tIzWUlSse7qSoyTN6" + }, + "href" : "https://api.spotify.com/v1/tracks/4cXh7tIzWUlSse7qSoyTN6", + "id" : "4cXh7tIzWUlSse7qSoyTN6", + "name" : "Blackbird Song", + "popularity" : 50, + "preview_url" : "https://p.scdn.co/mp3-preview/07e62684dadcc1c378cf0a5f09647a51c4a3fe56", + "track_number" : 3, + "type" : "track", + "uri" : "spotify:track:4cXh7tIzWUlSse7qSoyTN6" + }, { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/3p6wrYqeSr2KPNzJpxNWSc" + }, + "href" : "https://api.spotify.com/v1/albums/3p6wrYqeSr2KPNzJpxNWSc", + "id" : "3p6wrYqeSr2KPNzJpxNWSc", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/ef05b97985627bbdf11ea3b84e5c4fa0017ec69e", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/d188abbdc4ed7ff06cbc1431b471091f21b61919", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/b22d5cb9dfe80203ce142c806469abcca8f158e8", + "width" : 64 + } ], + "name" : "Based On A T.R.U. Story", + "type" : "album", + "uri" : "spotify:album:3p6wrYqeSr2KPNzJpxNWSc" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/17lzZA2AlOHwCwFALHttmp" + }, + "href" : "https://api.spotify.com/v1/artists/17lzZA2AlOHwCwFALHttmp", + "id" : "17lzZA2AlOHwCwFALHttmp", + "name" : "2 Chainz", + "type" : "artist", + "uri" : "spotify:artist:17lzZA2AlOHwCwFALHttmp" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/5K4W6rqBFWDnAN6FQUkS6x" + }, + "href" : "https://api.spotify.com/v1/artists/5K4W6rqBFWDnAN6FQUkS6x", + "id" : "5K4W6rqBFWDnAN6FQUkS6x", + "name" : "Kanye West", + "type" : "artist", + "uri" : "spotify:artist:5K4W6rqBFWDnAN6FQUkS6x" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW" ], + "disc_number" : 1, + "duration_ms" : 306626, + "explicit" : true, + "external_ids" : { + "isrc" : "USUM71207262" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/7mtuFTyxaUE2UF5Wxb6c38" + }, + "href" : "https://api.spotify.com/v1/tracks/7mtuFTyxaUE2UF5Wxb6c38", + "id" : "7mtuFTyxaUE2UF5Wxb6c38", + "name" : "Birthday Song", + "popularity" : 57, + "preview_url" : "https://p.scdn.co/mp3-preview/8f2a032ccae620be964ced13514c9615a01e696c", + "track_number" : 5, + "type" : "track", + "uri" : "spotify:track:7mtuFTyxaUE2UF5Wxb6c38" + }, { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/2ChBXM2MXu0Kvmkq9gAbXm" + }, + "href" : "https://api.spotify.com/v1/albums/2ChBXM2MXu0Kvmkq9gAbXm", + "id" : "2ChBXM2MXu0Kvmkq9gAbXm", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/81cc6904fbfa5281e62bf2efe998f0fb6dcfd1b2", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/74b41c98793dd55d4bb9cf650ebadc3d2f8d8abf", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/1f4d6ce1044eaa7aeacdb43ae7719aaffc9feff9", + "width" : 64 + } ], + "name" : "Eurovision Song Contest 2014 Copenhagen", + "type" : "album", + "uri" : "spotify:album:2ChBXM2MXu0Kvmkq9gAbXm" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/62emvbuTFQdMRR5sVbVScY" + }, + "href" : "https://api.spotify.com/v1/artists/62emvbuTFQdMRR5sVbVScY", + "id" : "62emvbuTFQdMRR5sVbVScY", + "name" : "Aarzemnieki", + "type" : "artist", + "uri" : "spotify:artist:62emvbuTFQdMRR5sVbVScY" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "disc_number" : 2, + "duration_ms" : 181386, + "explicit" : false, + "external_ids" : { + "isrc" : "DK2DY1400046" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/5Qd68IgarqOFsNiLoKudmu" + }, + "href" : "https://api.spotify.com/v1/tracks/5Qd68IgarqOFsNiLoKudmu", + "id" : "5Qd68IgarqOFsNiLoKudmu", + "name" : "Cake To Bake - Eurovision 2014 - Latvia", + "popularity" : 45, + "preview_url" : "https://p.scdn.co/mp3-preview/3b5cd2837c0c642d6d1f700f072468c3934ddb73", + "track_number" : 4, + "type" : "track", + "uri" : "spotify:track:5Qd68IgarqOFsNiLoKudmu" + }, { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/5By3QnrtdJkkEZmK8qQgl5" + }, + "href" : "https://api.spotify.com/v1/albums/5By3QnrtdJkkEZmK8qQgl5", + "id" : "5By3QnrtdJkkEZmK8qQgl5", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/a25528002462710401e179a5bb6748e1038bc9e2", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/8c3dbbca98b392ee9ad9f8007029c2103eebca8d", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/e2eaf35d7c4ebd5eb2205a2437993d7be19f630a", + "width" : 64 + } ], + "name" : "Back to 6", + "type" : "album", + "uri" : "spotify:album:5By3QnrtdJkkEZmK8qQgl5" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/6fNmOWQzfOVyHLQ2UqUQew" + }, + "href" : "https://api.spotify.com/v1/artists/6fNmOWQzfOVyHLQ2UqUQew", + "id" : "6fNmOWQzfOVyHLQ2UqUQew", + "name" : "Eva Cassidy", + "type" : "artist", + "uri" : "spotify:artist:6fNmOWQzfOVyHLQ2UqUQew" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 215066, + "explicit" : false, + "external_ids" : { + "isrc" : "ES8301026803" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/3CzIMP0Yq2t7w1NZF83xxp" + }, + "href" : "https://api.spotify.com/v1/tracks/3CzIMP0Yq2t7w1NZF83xxp", + "id" : "3CzIMP0Yq2t7w1NZF83xxp", + "name" : "Song Bird", + "popularity" : 50, + "preview_url" : "https://p.scdn.co/mp3-preview/01c65373b994ac89153fe9243fe69f51aae89f99", + "track_number" : 3, + "type" : "track", + "uri" : "spotify:track:3CzIMP0Yq2t7w1NZF83xxp" + }, { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AT", "BE", "BG", "CH", "CY", "CZ", "DE", "DK", "EE", "ES", "FI", "FR", "GR", "HU", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "NL", "NO", "PL", "PT", "RO", "SE", "SI", "SK", "TR" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/0w57XnlENgJWxQmK2iiKKa" + }, + "href" : "https://api.spotify.com/v1/albums/0w57XnlENgJWxQmK2iiKKa", + "id" : "0w57XnlENgJWxQmK2iiKKa", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/f67703ae72b5057f6b9942a67476b30f9777f3f0", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/1d31e9a4ca514adc4a839eb2158e29e3062cc175", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/7c217a075fb4f2935ec855ffeed7cb51b4fbd312", + "width" : 64 + } ], + "name" : "Camp Rock 2: The Final Jam", + "type" : "album", + "uri" : "spotify:album:0w57XnlENgJWxQmK2iiKKa" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/5ZuWrQzWBgJXbAfcLx2WTL" + }, + "href" : "https://api.spotify.com/v1/artists/5ZuWrQzWBgJXbAfcLx2WTL", + "id" : "5ZuWrQzWBgJXbAfcLx2WTL", + "name" : "Alyson Stoner", + "type" : "artist", + "uri" : "spotify:artist:5ZuWrQzWBgJXbAfcLx2WTL" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/6S2OmqARrzebs0tKUEyXyp" + }, + "href" : "https://api.spotify.com/v1/artists/6S2OmqARrzebs0tKUEyXyp", + "id" : "6S2OmqARrzebs0tKUEyXyp", + "name" : "Demi Lovato", + "type" : "artist", + "uri" : "spotify:artist:6S2OmqARrzebs0tKUEyXyp" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/4Rxn7Im3LGfyRkY2FlHhWi" + }, + "href" : "https://api.spotify.com/v1/artists/4Rxn7Im3LGfyRkY2FlHhWi", + "id" : "4Rxn7Im3LGfyRkY2FlHhWi", + "name" : "Nick Jonas", + "type" : "artist", + "uri" : "spotify:artist:4Rxn7Im3LGfyRkY2FlHhWi" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/7gbmX8SsfjEjxDMzBi1ZOL" + }, + "href" : "https://api.spotify.com/v1/artists/7gbmX8SsfjEjxDMzBi1ZOL", + "id" : "7gbmX8SsfjEjxDMzBi1ZOL", + "name" : "Joe Jonas", + "type" : "artist", + "uri" : "spotify:artist:7gbmX8SsfjEjxDMzBi1ZOL" + } ], + "available_markets" : [ "AD", "AT", "BE", "BG", "CH", "CY", "CZ", "DE", "DK", "EE", "ES", "FI", "FR", "GR", "HU", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "NL", "NO", "PL", "PT", "RO", "SE", "SI", "SK", "TR" ], + "disc_number" : 1, + "duration_ms" : 178333, + "explicit" : false, + "external_ids" : { + "isrc" : "USWD11038149" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/0q6ku8ljaOYoxs80gYrW8r" + }, + "href" : "https://api.spotify.com/v1/tracks/0q6ku8ljaOYoxs80gYrW8r", + "id" : "0q6ku8ljaOYoxs80gYrW8r", + "name" : "This Is Our Song", + "popularity" : 48, + "preview_url" : "https://p.scdn.co/mp3-preview/86f457e0553b94fdbde0c6f57fe9d9e26b65da3c", + "track_number" : 11, + "type" : "track", + "uri" : "spotify:track:0q6ku8ljaOYoxs80gYrW8r" + }, { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/3cVNp1AXxdzoKIs9r6keWU" + }, + "href" : "https://api.spotify.com/v1/albums/3cVNp1AXxdzoKIs9r6keWU", + "id" : "3cVNp1AXxdzoKIs9r6keWU", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/3e43b7cd2ccc9ec5f7b8c9f5e5f825c0d79f28cd", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/dfc4e6140ad802bc0835329d5cb61aa6d41bc678", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/394e6ede0e3978d675b4506c3dbb64cbf05ae92f", + "width" : 64 + } ], + "name" : "Between Two Lungs", + "type" : "album", + "uri" : "spotify:album:3cVNp1AXxdzoKIs9r6keWU" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/1moxjboGR7GNWYIMWsRjgG" + }, + "href" : "https://api.spotify.com/v1/artists/1moxjboGR7GNWYIMWsRjgG", + "id" : "1moxjboGR7GNWYIMWsRjgG", + "name" : "Florence + The Machine", + "type" : "artist", + "uri" : "spotify:artist:1moxjboGR7GNWYIMWsRjgG" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "disc_number" : 1, + "duration_ms" : 223826, + "explicit" : false, + "external_ids" : { + "isrc" : "GBUM70904756" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/6SkxGjgzMbD4cBtRpF6AAm" + }, + "href" : "https://api.spotify.com/v1/tracks/6SkxGjgzMbD4cBtRpF6AAm", + "id" : "6SkxGjgzMbD4cBtRpF6AAm", + "name" : "Drumming Song", + "popularity" : 52, + "preview_url" : "https://p.scdn.co/mp3-preview/68496fc230c215e4dfa666b4aba97b517f0bbbf5", + "track_number" : 7, + "type" : "track", + "uri" : "spotify:track:6SkxGjgzMbD4cBtRpF6AAm" + }, { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/1KZGuujnfwHjZ48hxCbhHk" + }, + "href" : "https://api.spotify.com/v1/albums/1KZGuujnfwHjZ48hxCbhHk", + "id" : "1KZGuujnfwHjZ48hxCbhHk", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/180e509f77068a1708da01aec2b02628e736ecef", + "width" : 639 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/9ddbc136e4c446a7c80e85de86dbd94058e6cd09", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/78d01d60502e9accf2981d7153ae690ca654a9aa", + "width" : 64 + } ], + "name" : "Siren Song Of The Counter-Culture", + "type" : "album", + "uri" : "spotify:album:1KZGuujnfwHjZ48hxCbhHk" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/6Wr3hh341P84m3EI8qdn9O" + }, + "href" : "https://api.spotify.com/v1/artists/6Wr3hh341P84m3EI8qdn9O", + "id" : "6Wr3hh341P84m3EI8qdn9O", + "name" : "Rise Against", + "type" : "artist", + "uri" : "spotify:artist:6Wr3hh341P84m3EI8qdn9O" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "disc_number" : 1, + "duration_ms" : 228205, + "explicit" : false, + "external_ids" : { + "isrc" : "USDW10400790" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/5kagLFYUXfUYnaJmmr83Ai" + }, + "href" : "https://api.spotify.com/v1/tracks/5kagLFYUXfUYnaJmmr83Ai", + "id" : "5kagLFYUXfUYnaJmmr83Ai", + "name" : "Blood To Bleed", + "popularity" : 48, + "preview_url" : "https://p.scdn.co/mp3-preview/684758000eeeb38d123c73a8862be976e159c0a9", + "track_number" : 5, + "type" : "track", + "uri" : "spotify:track:5kagLFYUXfUYnaJmmr83Ai" + }, { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/0ssMZRCnobXKQXjQ2R5A5a" + }, + "href" : "https://api.spotify.com/v1/albums/0ssMZRCnobXKQXjQ2R5A5a", + "id" : "0ssMZRCnobXKQXjQ2R5A5a", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/242f984b3e816c575868829c3fe50addfb204707", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/61179887979282254ac7d6dd0f2f44b7eeabfac2", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/963a6d5b05be22f0165ca6cbdf98c41f944d2c54", + "width" : 64 + } ], + "name" : "Begin To Hope (Special Edition)", + "type" : "album", + "uri" : "spotify:album:0ssMZRCnobXKQXjQ2R5A5a" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/3z6Gk257P9jNcZbBXJNX5i" + }, + "href" : "https://api.spotify.com/v1/artists/3z6Gk257P9jNcZbBXJNX5i", + "id" : "3z6Gk257P9jNcZbBXJNX5i", + "name" : "Regina Spektor", + "type" : "artist", + "uri" : "spotify:artist:3z6Gk257P9jNcZbBXJNX5i" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 207725, + "explicit" : false, + "external_ids" : { + "isrc" : "USWB10600590" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/3hMeLjX7z3VCZVsJYJ9Ar8" + }, + "href" : "https://api.spotify.com/v1/tracks/3hMeLjX7z3VCZVsJYJ9Ar8", + "id" : "3hMeLjX7z3VCZVsJYJ9Ar8", + "name" : "Hotel Song", + "popularity" : 49, + "preview_url" : "https://p.scdn.co/mp3-preview/2683df3348c10e59654787d96e4eaad1da969252", + "track_number" : 6, + "type" : "track", + "uri" : "spotify:track:3hMeLjX7z3VCZVsJYJ9Ar8" + }, { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/5k63xxy9YcKM0H9GS3vP1K" + }, + "href" : "https://api.spotify.com/v1/albums/5k63xxy9YcKM0H9GS3vP1K", + "id" : "5k63xxy9YcKM0H9GS3vP1K", + "images" : [ { + "height" : 636, + "url" : "https://i.scdn.co/image/e76791de0ebed752cac6430f8c9a623c87b59b07", + "width" : 640 + }, { + "height" : 298, + "url" : "https://i.scdn.co/image/414f881e5ef31cb1d8bb9fa6aa624b442b388103", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/4ae8d0506fc2a04f8356fc7328a5f2f7aca731d1", + "width" : 64 + } ], + "name" : "Bob Dylan", + "type" : "album", + "uri" : "spotify:album:5k63xxy9YcKM0H9GS3vP1K" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/74ASZWbe4lXaubB36ztrGX" + }, + "href" : "https://api.spotify.com/v1/artists/74ASZWbe4lXaubB36ztrGX", + "id" : "74ASZWbe4lXaubB36ztrGX", + "name" : "Bob Dylan", + "type" : "artist", + "uri" : "spotify:artist:74ASZWbe4lXaubB36ztrGX" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 160000, + "explicit" : false, + "external_ids" : { + "isrc" : "USSM16101371" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/0dfdXhBg11XA16XgAEtFcN" + }, + "href" : "https://api.spotify.com/v1/tracks/0dfdXhBg11XA16XgAEtFcN", + "id" : "0dfdXhBg11XA16XgAEtFcN", + "name" : "Song to Woody", + "popularity" : 48, + "preview_url" : "https://p.scdn.co/mp3-preview/dcd44e959468cba708a4dfe4e0f141bb3c922998", + "track_number" : 12, + "type" : "track", + "uri" : "spotify:track:0dfdXhBg11XA16XgAEtFcN" + }, { + "album" : { + "album_type" : "compilation", + "available_markets" : [ "AD", "AU", "BE", "BG", "CH", "CY", "CZ", "DK", "DO", "EE", "ES", "FI", "GR", "HK", "HU", "IS", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NO", "NZ", "PH", "PL", "PT", "RO", "SE", "SG", "SI", "SK", "TR", "TW" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/4FoJzaRTuSq4HWYQVUHkY5" + }, + "href" : "https://api.spotify.com/v1/albums/4FoJzaRTuSq4HWYQVUHkY5", + "id" : "4FoJzaRTuSq4HWYQVUHkY5", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/9c9494400ce5dce6924dfcb7b4306a836e4d3b70", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/8909489dcbee342b55b36c552d9e79abf74c7675", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/6e0315ded3ad60e52edec36564c12329f589d827", + "width" : 64 + } ], + "name" : "2011 (Continous DJ-Mix)", + "type" : "album", + "uri" : "spotify:album:4FoJzaRTuSq4HWYQVUHkY5" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/6yTYR09WCvsgdnurDW4WQo" + }, + "href" : "https://api.spotify.com/v1/artists/6yTYR09WCvsgdnurDW4WQo", + "id" : "6yTYR09WCvsgdnurDW4WQo", + "name" : "DJ Antoine", + "type" : "artist", + "uri" : "spotify:artist:6yTYR09WCvsgdnurDW4WQo" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/3yBEHAINorE3uSvsCmyCwQ" + }, + "href" : "https://api.spotify.com/v1/artists/3yBEHAINorE3uSvsCmyCwQ", + "id" : "3yBEHAINorE3uSvsCmyCwQ", + "name" : "Mad Mark", + "type" : "artist", + "uri" : "spotify:artist:3yBEHAINorE3uSvsCmyCwQ" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/3vyUTiW9vClzOUXCHVNWsy" + }, + "href" : "https://api.spotify.com/v1/artists/3vyUTiW9vClzOUXCHVNWsy", + "id" : "3vyUTiW9vClzOUXCHVNWsy", + "name" : "James Gruntz", + "type" : "artist", + "uri" : "spotify:artist:3vyUTiW9vClzOUXCHVNWsy" + } ], + "available_markets" : [ "AD", "AU", "BE", "BG", "CH", "CY", "CZ", "DK", "DO", "EE", "ES", "FI", "GR", "HK", "HU", "IS", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NO", "NZ", "PH", "PL", "PT", "RO", "SE", "SG", "SI", "SK", "TR", "TW" ], + "disc_number" : 1, + "duration_ms" : 267656, + "explicit" : false, + "external_ids" : { + "isrc" : "CH4881100504" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/5cLJsdgvsndmtsWie12xFE" + }, + "href" : "https://api.spotify.com/v1/tracks/5cLJsdgvsndmtsWie12xFE", + "id" : "5cLJsdgvsndmtsWie12xFE", + "name" : "Song To The Sea - DJ Antoine vs Mad Mark Re-Construction", + "popularity" : 48, + "preview_url" : "https://p.scdn.co/mp3-preview/aa6e966d1dad90f2b36bb6f109d1ef4f59018612", + "track_number" : 4, + "type" : "track", + "uri" : "spotify:track:5cLJsdgvsndmtsWie12xFE" + }, { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/2d3wa6DNw6HEdrKf6VmW4O" + }, + "href" : "https://api.spotify.com/v1/albums/2d3wa6DNw6HEdrKf6VmW4O", + "id" : "2d3wa6DNw6HEdrKf6VmW4O", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/0fef47f22b90c4ff9263660e109d2dd20e5fe3eb", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/f33aa61e1f7b9e87cfc16e1d77378ef854015f51", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/9687d92df8f7e056104de07f2b61c9e183efc9c3", + "width" : 64 + } ], + "name" : "The Christmas Song", + "type" : "album", + "uri" : "spotify:album:2d3wa6DNw6HEdrKf6VmW4O" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/7v4imS0moSyGdXyLgVTIV7" + }, + "href" : "https://api.spotify.com/v1/artists/7v4imS0moSyGdXyLgVTIV7", + "id" : "7v4imS0moSyGdXyLgVTIV7", + "name" : "Nat King Cole", + "type" : "artist", + "uri" : "spotify:artist:7v4imS0moSyGdXyLgVTIV7" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "disc_number" : 1, + "duration_ms" : 191640, + "explicit" : false, + "external_ids" : { + "isrc" : "USCA29900551" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/4cqLCCMzG6GQ9Bch2PBzFp" + }, + "href" : "https://api.spotify.com/v1/tracks/4cqLCCMzG6GQ9Bch2PBzFp", + "id" : "4cqLCCMzG6GQ9Bch2PBzFp", + "name" : "The Christmas Song (Merry Christmas To You)", + "popularity" : 43, + "preview_url" : "https://p.scdn.co/mp3-preview/df19489b1d92b6bd8495fce1b4b35cd937b04880", + "track_number" : 2, + "type" : "track", + "uri" : "spotify:track:4cqLCCMzG6GQ9Bch2PBzFp" + }, { + "album" : { + "album_type" : "album", + "available_markets" : [ "AU", "BE", "BG", "BR", "CH", "CY", "CZ", "DE", "DK", "EE", "ES", "FI", "FR", "GB", "GR", "HK", "HU", "IE", "IS", "LT", "LU", "LV", "MT", "MY", "NL", "NO", "NZ", "PH", "PT", "SE", "SG", "SK", "TR", "TW" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/5SwpV7g0iey70Ux6xeHKw0" + }, + "href" : "https://api.spotify.com/v1/albums/5SwpV7g0iey70Ux6xeHKw0", + "id" : "5SwpV7g0iey70Ux6xeHKw0", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/4ae9930edae15390fb6ee5b67d4d095a5fcae945", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/32222229de2db05bc1ede324f914728650c13bd1", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/4423395ffb7215f34c9ab9414a6bebc28ec7836e", + "width" : 64 + } ], + "name" : "Hits For Børn 2", + "type" : "album", + "uri" : "spotify:album:5SwpV7g0iey70Ux6xeHKw0" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/2UOx6w3eHpPKc3RBnNV3Rl" + }, + "href" : "https://api.spotify.com/v1/artists/2UOx6w3eHpPKc3RBnNV3Rl", + "id" : "2UOx6w3eHpPKc3RBnNV3Rl", + "name" : "Safri Duo", + "type" : "artist", + "uri" : "spotify:artist:2UOx6w3eHpPKc3RBnNV3Rl" + } ], + "available_markets" : [ "AU", "BE", "BG", "BR", "CH", "CY", "CZ", "DE", "DK", "EE", "ES", "FI", "FR", "GB", "GR", "HK", "HU", "IE", "IS", "LT", "LU", "LV", "MT", "MY", "NL", "NO", "NZ", "PH", "PT", "SE", "SG", "SK", "TR", "TW" ], + "disc_number" : 1, + "duration_ms" : 196560, + "explicit" : false, + "external_ids" : { + "isrc" : "DKBKA0001601" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/2MDdh4rbNNBiy8l6XgI6E9" + }, + "href" : "https://api.spotify.com/v1/tracks/2MDdh4rbNNBiy8l6XgI6E9", + "id" : "2MDdh4rbNNBiy8l6XgI6E9", + "name" : "Played-A-Live (The Bongo Song) - Radio Cut", + "popularity" : 49, + "preview_url" : "https://p.scdn.co/mp3-preview/077d052e72dba1184d03a75a723a99df5dc811ad", + "track_number" : 1, + "type" : "track", + "uri" : "spotify:track:2MDdh4rbNNBiy8l6XgI6E9" + }, { + "album" : { + "album_type" : "single", + "available_markets" : [ "SE" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/1lyU2F80dCrewThtCuHhnm" + }, + "href" : "https://api.spotify.com/v1/albums/1lyU2F80dCrewThtCuHhnm", + "id" : "1lyU2F80dCrewThtCuHhnm", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/d0bc11c250e63fd2771a3f1aa4d4dfb8f8428a4a", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/f7057bc72a17434884396c5dfc2b68d3db3ef1d3", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/d239f9c7e3227a396af3d878ebe0048f4339b102", + "width" : 64 + } ], + "name" : "It's Time to Make a Wish (Christmas Song)", + "type" : "album", + "uri" : "spotify:album:1lyU2F80dCrewThtCuHhnm" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/5PldDs8KtXMy0KZ6due44x" + }, + "href" : "https://api.spotify.com/v1/artists/5PldDs8KtXMy0KZ6due44x", + "id" : "5PldDs8KtXMy0KZ6due44x", + "name" : "The Fooo Conspiracy", + "type" : "artist", + "uri" : "spotify:artist:5PldDs8KtXMy0KZ6due44x" + } ], + "available_markets" : [ "SE" ], + "disc_number" : 1, + "duration_ms" : 196733, + "explicit" : false, + "external_ids" : { + "isrc" : "SEBGA1300910" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/7N2tW22daw8VBWuxuO6u6m" + }, + "href" : "https://api.spotify.com/v1/tracks/7N2tW22daw8VBWuxuO6u6m", + "id" : "7N2tW22daw8VBWuxuO6u6m", + "name" : "It's Time to Make a Wish (Christmas Song)", + "popularity" : 46, + "preview_url" : "https://p.scdn.co/mp3-preview/9fbadb13dfd1c997dd3ceb5ec917f3644e0db2e4", + "track_number" : 1, + "type" : "track", + "uri" : "spotify:track:7N2tW22daw8VBWuxuO6u6m" + } ], + "limit" : 20, + "next" : "https://api.spotify.com/v1/search?query=song+2&offset=20&limit=20&type=track", + "offset" : 0, + "previous" : null, + "total" : 43246 + } +} diff --git a/vendor/jwilsson/spotify-web-api-php/tests/fixtures/track.json b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/track.json new file mode 100644 index 0000000..a7ab4ab --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/track.json @@ -0,0 +1,55 @@ +{ + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/3tpJtzZm4Urb0n2ITN5mwF" + }, + "href" : "https://api.spotify.com/v1/albums/3tpJtzZm4Urb0n2ITN5mwF", + "id" : "3tpJtzZm4Urb0n2ITN5mwF", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/42f1407919f09c53af5cac7290f5224cc098b6cc", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/1844e9ff8ea90e78e62ca892900c1c36e98a58ee", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/7c5288b11adf33302a5eef5a722372494335114a", + "width" : 64 + } ], + "name" : "Original Motion Picture Soundtrack - Full Metal Jacket", + "type" : "album", + "uri" : "spotify:album:3tpJtzZm4Urb0n2ITN5mwF" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/5QEA3sofVt5QckQA6QX2nN" + }, + "href" : "https://api.spotify.com/v1/artists/5QEA3sofVt5QckQA6QX2nN", + "id" : "5QEA3sofVt5QckQA6QX2nN", + "name" : "The Trashmen", + "type" : "artist", + "uri" : "spotify:artist:5QEA3sofVt5QckQA6QX2nN" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 137133, + "explicit" : false, + "external_ids" : { + "isrc" : "USWB10102873" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/7EjyzZcbLxW7PaaLua9Ksb" + }, + "href" : "https://api.spotify.com/v1/tracks/7EjyzZcbLxW7PaaLua9Ksb", + "id" : "7EjyzZcbLxW7PaaLua9Ksb", + "name" : "Surfin' Bird", + "popularity" : 53, + "preview_url" : "https://p.scdn.co/mp3-preview/c1a3f50a46ad126ec97442119bf912fc4017c2a5", + "track_number" : 7, + "type" : "track", + "uri" : "spotify:track:7EjyzZcbLxW7PaaLua9Ksb" +} diff --git a/vendor/jwilsson/spotify-web-api-php/tests/fixtures/tracks.json b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/tracks.json new file mode 100644 index 0000000..4330cad --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/tracks.json @@ -0,0 +1,111 @@ +{ + "tracks" : [ { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/6TJmQnO44YE5BtTxH8pop1" + }, + "href" : "https://api.spotify.com/v1/albums/6TJmQnO44YE5BtTxH8pop1", + "id" : "6TJmQnO44YE5BtTxH8pop1", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/8e13218039f81b000553e25522a7f0d7a0600f2e", + "width" : 629 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/8c1e066b5d1045038437d92815d49987f519e44f", + "width" : 295 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/d49268a8fc0768084f4750cf1647709e89a27172", + "width" : 63 + } ], + "name" : "Hot Fuss", + "type" : "album", + "uri" : "spotify:album:6TJmQnO44YE5BtTxH8pop1" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/0C0XlULifJtAgn6ZNCW2eu" + }, + "href" : "https://api.spotify.com/v1/artists/0C0XlULifJtAgn6ZNCW2eu", + "id" : "0C0XlULifJtAgn6ZNCW2eu", + "name" : "The Killers", + "type" : "artist", + "uri" : "spotify:artist:0C0XlULifJtAgn6ZNCW2eu" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "disc_number" : 1, + "duration_ms" : 222075, + "explicit" : false, + "external_ids" : { + "isrc" : "USIR20400274" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/0eGsygTp906u18L0Oimnem" + }, + "href" : "https://api.spotify.com/v1/tracks/0eGsygTp906u18L0Oimnem", + "id" : "0eGsygTp906u18L0Oimnem", + "name" : "Mr. Brightside", + "popularity" : 75, + "preview_url" : "https://p.scdn.co/mp3-preview/f454c8224828e21fa146af84916fd22cb89cedc6", + "track_number" : 2, + "type" : "track", + "uri" : "spotify:track:0eGsygTp906u18L0Oimnem" + }, { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/6TJmQnO44YE5BtTxH8pop1" + }, + "href" : "https://api.spotify.com/v1/albums/6TJmQnO44YE5BtTxH8pop1", + "id" : "6TJmQnO44YE5BtTxH8pop1", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/8e13218039f81b000553e25522a7f0d7a0600f2e", + "width" : 629 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/8c1e066b5d1045038437d92815d49987f519e44f", + "width" : 295 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/d49268a8fc0768084f4750cf1647709e89a27172", + "width" : 63 + } ], + "name" : "Hot Fuss", + "type" : "album", + "uri" : "spotify:album:6TJmQnO44YE5BtTxH8pop1" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/0C0XlULifJtAgn6ZNCW2eu" + }, + "href" : "https://api.spotify.com/v1/artists/0C0XlULifJtAgn6ZNCW2eu", + "id" : "0C0XlULifJtAgn6ZNCW2eu", + "name" : "The Killers", + "type" : "artist", + "uri" : "spotify:artist:0C0XlULifJtAgn6ZNCW2eu" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "disc_number" : 1, + "duration_ms" : 197160, + "explicit" : false, + "external_ids" : { + "isrc" : "USIR20400195" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/1lDWb6b6ieDQ2xT7ewTC3G" + }, + "href" : "https://api.spotify.com/v1/tracks/1lDWb6b6ieDQ2xT7ewTC3G", + "id" : "1lDWb6b6ieDQ2xT7ewTC3G", + "name" : "Somebody Told Me", + "popularity" : 71, + "preview_url" : "https://p.scdn.co/mp3-preview/4c63a3d4eaf7f8f86cfdb8bf46ef3974f4092357", + "track_number" : 4, + "type" : "track", + "uri" : "spotify:track:1lDWb6b6ieDQ2xT7ewTC3G" + } ] +} diff --git a/vendor/jwilsson/spotify-web-api-php/tests/fixtures/user-playlist-public.json b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/user-playlist-public.json new file mode 100644 index 0000000..098d35d --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/user-playlist-public.json @@ -0,0 +1,1075 @@ +{ + "collaborative" : false, + "description" : null, + "external_urls" : { + "spotify" : "http://open.spotify.com/user/mcgurk/playlist/0UZ0Ll4HJHR7yvURYbHJe9" + }, + "followers" : { + "href" : null, + "total" : 0 + }, + "href" : "https://api.spotify.com/v1/users/mcgurk/playlists/0UZ0Ll4HJHR7yvURYbHJe9", + "id" : "0UZ0Ll4HJHR7yvURYbHJe9", + "images" : [ ], + "name" : "PARTY", + "owner" : { + "external_urls" : { + "spotify" : "http://open.spotify.com/user/mcgurk" + }, + "href" : "https://api.spotify.com/v1/users/mcgurk", + "id" : "mcgurk", + "type" : "user", + "uri" : "spotify:user:mcgurk" + }, + "public" : true, + "snapshot_id" : "bKMQr5cpdBKJCat1G4h4C2VinMLjIX7C1b1FEs1OWp2+e0cSd9ilKN5G1K0R+fpr", + "tracks" : { + "href" : "https://api.spotify.com/v1/users/mcgurk/playlists/0UZ0Ll4HJHR7yvURYbHJe9/tracks", + "items" : [ { + "added_at" : "2010-05-03T10:49:43Z", + "added_by" : null, + "track" : { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/1qwlxZTNLe1jq3b0iidlue" + }, + "href" : "https://api.spotify.com/v1/albums/1qwlxZTNLe1jq3b0iidlue", + "id" : "1qwlxZTNLe1jq3b0iidlue", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/9643ed59c59a044b817482a51e67377971ad7469", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/a51c3a507f52a0cc798d29e7a2d8d6e1adace445", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/a06ede8283b1ce28b70aaf7e500edf4e409b50e0", + "width" : 64 + } ], + "name" : "The Fame", + "type" : "album", + "uri" : "spotify:album:1qwlxZTNLe1jq3b0iidlue" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/1HY2Jd0NmPuamShAr6KMms" + }, + "href" : "https://api.spotify.com/v1/artists/1HY2Jd0NmPuamShAr6KMms", + "id" : "1HY2Jd0NmPuamShAr6KMms", + "name" : "Lady Gaga", + "type" : "artist", + "uri" : "spotify:artist:1HY2Jd0NmPuamShAr6KMms" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/7fObcBw9VM3x7ntWKCYl0z" + }, + "href" : "https://api.spotify.com/v1/artists/7fObcBw9VM3x7ntWKCYl0z", + "id" : "7fObcBw9VM3x7ntWKCYl0z", + "name" : "Colby O'Donis", + "type" : "artist", + "uri" : "spotify:artist:7fObcBw9VM3x7ntWKCYl0z" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "disc_number" : 1, + "duration_ms" : 241933, + "explicit" : false, + "external_ids" : { + "isrc" : "USUM70807646" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/1dzQoRqT5ucxXVaAhTcT0J" + }, + "href" : "https://api.spotify.com/v1/tracks/1dzQoRqT5ucxXVaAhTcT0J", + "id" : "1dzQoRqT5ucxXVaAhTcT0J", + "name" : "Just Dance", + "popularity" : 66, + "preview_url" : "https://p.scdn.co/mp3-preview/3dbcc47a8bcbeefeb4a0e68db1d6937b7dee4980", + "track_number" : 1, + "type" : "track", + "uri" : "spotify:track:1dzQoRqT5ucxXVaAhTcT0J" + } + }, { + "added_at" : "2010-05-03T10:49:46Z", + "added_by" : null, + "track" : { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/1qwlxZTNLe1jq3b0iidlue" + }, + "href" : "https://api.spotify.com/v1/albums/1qwlxZTNLe1jq3b0iidlue", + "id" : "1qwlxZTNLe1jq3b0iidlue", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/9643ed59c59a044b817482a51e67377971ad7469", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/a51c3a507f52a0cc798d29e7a2d8d6e1adace445", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/a06ede8283b1ce28b70aaf7e500edf4e409b50e0", + "width" : 64 + } ], + "name" : "The Fame", + "type" : "album", + "uri" : "spotify:album:1qwlxZTNLe1jq3b0iidlue" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/1HY2Jd0NmPuamShAr6KMms" + }, + "href" : "https://api.spotify.com/v1/artists/1HY2Jd0NmPuamShAr6KMms", + "id" : "1HY2Jd0NmPuamShAr6KMms", + "name" : "Lady Gaga", + "type" : "artist", + "uri" : "spotify:artist:1HY2Jd0NmPuamShAr6KMms" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "disc_number" : 1, + "duration_ms" : 208306, + "explicit" : false, + "external_ids" : { + "isrc" : "USUM70824408" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/02XnQdf7sipaKBBHixz3Zp" + }, + "href" : "https://api.spotify.com/v1/tracks/02XnQdf7sipaKBBHixz3Zp", + "id" : "02XnQdf7sipaKBBHixz3Zp", + "name" : "Paparazzi", + "popularity" : 58, + "preview_url" : "https://p.scdn.co/mp3-preview/ac27854ae09b2d4bce83c712af1eacb3071a96dc", + "track_number" : 3, + "type" : "track", + "uri" : "spotify:track:02XnQdf7sipaKBBHixz3Zp" + } + }, { + "added_at" : "2010-05-03T10:49:47Z", + "added_by" : null, + "track" : { + "album" : { + "album_type" : "single", + "available_markets" : [ "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LT", "LU", "LV", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SG", "SI", "SK", "SV", "TR", "TW" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/482HqzMMfrkFXAGujtwFrm" + }, + "href" : "https://api.spotify.com/v1/albums/482HqzMMfrkFXAGujtwFrm", + "id" : "482HqzMMfrkFXAGujtwFrm", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/bb8d1b26591b8187455990b6c37efee9e325b6cd", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/e8e0c44240138a62ea6d89f814774ce5ef62fe79", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/03b69cdc8ed6725e199571bce6aa583daf0ec4cd", + "width" : 64 + } ], + "name" : "Poker Face", + "type" : "album", + "uri" : "spotify:album:482HqzMMfrkFXAGujtwFrm" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/1HY2Jd0NmPuamShAr6KMms" + }, + "href" : "https://api.spotify.com/v1/artists/1HY2Jd0NmPuamShAr6KMms", + "id" : "1HY2Jd0NmPuamShAr6KMms", + "name" : "Lady Gaga", + "type" : "artist", + "uri" : "spotify:artist:1HY2Jd0NmPuamShAr6KMms" + } ], + "available_markets" : [ "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LT", "LU", "LV", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SG", "SI", "SK", "SV", "TR", "TW" ], + "disc_number" : 1, + "duration_ms" : 237400, + "explicit" : false, + "external_ids" : { + "isrc" : "USUM70824409" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/6w1hZMlo2SVuq29liebhb8" + }, + "href" : "https://api.spotify.com/v1/tracks/6w1hZMlo2SVuq29liebhb8", + "id" : "6w1hZMlo2SVuq29liebhb8", + "name" : "Poker Face", + "popularity" : 64, + "preview_url" : "https://p.scdn.co/mp3-preview/ae1b1b93c2288d3363b9a46c51bcca39abd99779", + "track_number" : 1, + "type" : "track", + "uri" : "spotify:track:6w1hZMlo2SVuq29liebhb8" + } + }, { + "added_at" : "2010-05-03T10:49:49Z", + "added_by" : null, + "track" : { + "album" : { + "album_type" : "single", + "available_markets" : [ "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LT", "LU", "LV", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SG", "SI", "SK", "SV", "TR", "TW" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/1Ot9FUXNmehWsLMmrYUt3F" + }, + "href" : "https://api.spotify.com/v1/albums/1Ot9FUXNmehWsLMmrYUt3F", + "id" : "1Ot9FUXNmehWsLMmrYUt3F", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/0401ab7daff118586b6ca67eea6fa92af97aa36d", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/6c21051a71d8ac9fe061a4b0063537da0893f55c", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/48d4ebd64a44f4c256f27fa6042fe015f4d0740b", + "width" : 64 + } ], + "name" : "Bad Romance", + "type" : "album", + "uri" : "spotify:album:1Ot9FUXNmehWsLMmrYUt3F" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/1HY2Jd0NmPuamShAr6KMms" + }, + "href" : "https://api.spotify.com/v1/artists/1HY2Jd0NmPuamShAr6KMms", + "id" : "1HY2Jd0NmPuamShAr6KMms", + "name" : "Lady Gaga", + "type" : "artist", + "uri" : "spotify:artist:1HY2Jd0NmPuamShAr6KMms" + } ], + "available_markets" : [ "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LT", "LU", "LV", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SG", "SI", "SK", "SV", "TR", "TW" ], + "disc_number" : 1, + "duration_ms" : 294640, + "explicit" : false, + "external_ids" : { + "isrc" : "USUM70903859" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/6MjiVEJy1YVuJNFu72OH61" + }, + "href" : "https://api.spotify.com/v1/tracks/6MjiVEJy1YVuJNFu72OH61", + "id" : "6MjiVEJy1YVuJNFu72OH61", + "name" : "Bad Romance", + "popularity" : 67, + "preview_url" : "https://p.scdn.co/mp3-preview/4ddf5c8885830a3e1e7d05ebeb9170b850d27e9e", + "track_number" : 1, + "type" : "track", + "uri" : "spotify:track:6MjiVEJy1YVuJNFu72OH61" + } + }, { + "added_at" : "2010-05-03T10:51:44Z", + "added_by" : null, + "track" : { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/67j3NJodNRI8USUwKwTZA6" + }, + "href" : "https://api.spotify.com/v1/albums/67j3NJodNRI8USUwKwTZA6", + "id" : "67j3NJodNRI8USUwKwTZA6", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/88300dc6d25e9c6d110db6cd7a206bf590412f9d", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/5850cd38f30cf5c6bc2846fc7bbba1d72313324f", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/15e1da0a85e6d1fad488172e3be7d9fd1b97fa73", + "width" : 64 + } ], + "name" : "The Fame Monster (International Deluxe)", + "type" : "album", + "uri" : "spotify:album:67j3NJodNRI8USUwKwTZA6" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/1HY2Jd0NmPuamShAr6KMms" + }, + "href" : "https://api.spotify.com/v1/artists/1HY2Jd0NmPuamShAr6KMms", + "id" : "1HY2Jd0NmPuamShAr6KMms", + "name" : "Lady Gaga", + "type" : "artist", + "uri" : "spotify:artist:1HY2Jd0NmPuamShAr6KMms" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "disc_number" : 2, + "duration_ms" : 175346, + "explicit" : false, + "external_ids" : { + "isrc" : "USUM70824406" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/6z7HmyQFiVBJm1OzBknw38" + }, + "href" : "https://api.spotify.com/v1/tracks/6z7HmyQFiVBJm1OzBknw38", + "id" : "6z7HmyQFiVBJm1OzBknw38", + "name" : "Eh, Eh (Nothing Else I Can Say)", + "popularity" : 48, + "preview_url" : "https://p.scdn.co/mp3-preview/a2ee2124a43f27cdf71bfee176013d67451c7942", + "track_number" : 6, + "type" : "track", + "uri" : "spotify:track:6z7HmyQFiVBJm1OzBknw38" + } + }, { + "added_at" : "2010-06-02T13:33:34Z", + "added_by" : null, + "track" : { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/67j3NJodNRI8USUwKwTZA6" + }, + "href" : "https://api.spotify.com/v1/albums/67j3NJodNRI8USUwKwTZA6", + "id" : "67j3NJodNRI8USUwKwTZA6", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/88300dc6d25e9c6d110db6cd7a206bf590412f9d", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/5850cd38f30cf5c6bc2846fc7bbba1d72313324f", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/15e1da0a85e6d1fad488172e3be7d9fd1b97fa73", + "width" : 64 + } ], + "name" : "The Fame Monster (International Deluxe)", + "type" : "album", + "uri" : "spotify:album:67j3NJodNRI8USUwKwTZA6" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/1HY2Jd0NmPuamShAr6KMms" + }, + "href" : "https://api.spotify.com/v1/artists/1HY2Jd0NmPuamShAr6KMms", + "id" : "1HY2Jd0NmPuamShAr6KMms", + "name" : "Lady Gaga", + "type" : "artist", + "uri" : "spotify:artist:1HY2Jd0NmPuamShAr6KMms" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/6vWDO969PvNqNYHIOW5v0m" + }, + "href" : "https://api.spotify.com/v1/artists/6vWDO969PvNqNYHIOW5v0m", + "id" : "6vWDO969PvNqNYHIOW5v0m", + "name" : "Beyoncé", + "type" : "artist", + "uri" : "spotify:artist:6vWDO969PvNqNYHIOW5v0m" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "disc_number" : 1, + "duration_ms" : 220626, + "explicit" : false, + "external_ids" : { + "isrc" : "USUM70905541" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/00BuKLSAFkaEkaVAgIMbeA" + }, + "href" : "https://api.spotify.com/v1/tracks/00BuKLSAFkaEkaVAgIMbeA", + "id" : "00BuKLSAFkaEkaVAgIMbeA", + "name" : "Telephone", + "popularity" : 67, + "preview_url" : "https://p.scdn.co/mp3-preview/20a9177d56bb05bbccf7c5fe82058e74edd328a2", + "track_number" : 6, + "type" : "track", + "uri" : "spotify:track:00BuKLSAFkaEkaVAgIMbeA" + } + }, { + "added_at" : "2011-09-09T19:52:27Z", + "added_by" : null, + "track" : { + "album" : { + "album_type" : "single", + "available_markets" : [ "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LT", "LU", "LV", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SG", "SI", "SK", "SV", "TR", "TW" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/6brEmLzLxjAOB0KcXdT7ye" + }, + "href" : "https://api.spotify.com/v1/albums/6brEmLzLxjAOB0KcXdT7ye", + "id" : "6brEmLzLxjAOB0KcXdT7ye", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/fce70d4c29071b363425bd2fa8072ee54e6eb16b", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/b59f854ec0e0c317cb0d367ea91a0e64d4a0c009", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/e5a400bd412f77c2c6870903eee86083851aa842", + "width" : 64 + } ], + "name" : "Born This Way", + "type" : "album", + "uri" : "spotify:album:6brEmLzLxjAOB0KcXdT7ye" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/1HY2Jd0NmPuamShAr6KMms" + }, + "href" : "https://api.spotify.com/v1/artists/1HY2Jd0NmPuamShAr6KMms", + "id" : "1HY2Jd0NmPuamShAr6KMms", + "name" : "Lady Gaga", + "type" : "artist", + "uri" : "spotify:artist:1HY2Jd0NmPuamShAr6KMms" + } ], + "available_markets" : [ "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LT", "LU", "LV", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SG", "SI", "SK", "SV", "TR", "TW" ], + "disc_number" : 1, + "duration_ms" : 260466, + "explicit" : false, + "external_ids" : { + "isrc" : "USUM71100638" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/6wAdqKcL7uESrsekjLTKod" + }, + "href" : "https://api.spotify.com/v1/tracks/6wAdqKcL7uESrsekjLTKod", + "id" : "6wAdqKcL7uESrsekjLTKod", + "name" : "Born This Way", + "popularity" : 55, + "preview_url" : "https://p.scdn.co/mp3-preview/c4b51e0193335f61306f0bd6f5868c7e801df525", + "track_number" : 1, + "type" : "track", + "uri" : "spotify:track:6wAdqKcL7uESrsekjLTKod" + } + }, { + "added_at" : "2011-09-09T19:52:25Z", + "added_by" : null, + "track" : { + "album" : { + "album_type" : "single", + "available_markets" : [ "AR", "AU", "BE", "BR", "CH", "CL", "CO", "CY", "DK", "EE", "ES", "FI", "FR", "GB", "GR", "HK", "HU", "IE", "IS", "IT", "LT", "LU", "LV", "MT", "MY", "NL", "NO", "NZ", "PH", "PT", "PY", "RO", "SI", "TW" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/48JuX7nVVKCBIZbHJG6azi" + }, + "href" : "https://api.spotify.com/v1/albums/48JuX7nVVKCBIZbHJG6azi", + "id" : "48JuX7nVVKCBIZbHJG6azi", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/7d5c94043c997d08123cdedc5f3e7729641ce84a", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/c5082b33a66bcd4a83537e07ece345a373751ab7", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/4eaa61afcc38dd30272f82f14b7f05473436b785", + "width" : 64 + } ], + "name" : "The Edge Of Glory", + "type" : "album", + "uri" : "spotify:album:48JuX7nVVKCBIZbHJG6azi" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/1HY2Jd0NmPuamShAr6KMms" + }, + "href" : "https://api.spotify.com/v1/artists/1HY2Jd0NmPuamShAr6KMms", + "id" : "1HY2Jd0NmPuamShAr6KMms", + "name" : "Lady Gaga", + "type" : "artist", + "uri" : "spotify:artist:1HY2Jd0NmPuamShAr6KMms" + } ], + "available_markets" : [ "AR", "AU", "BE", "BR", "CH", "CL", "CO", "CY", "DK", "EE", "ES", "FI", "FR", "GB", "GR", "HK", "HU", "IE", "IS", "IT", "LT", "LU", "LV", "MT", "MY", "NL", "NO", "NZ", "PH", "PT", "PY", "RO", "SI", "TW" ], + "disc_number" : 1, + "duration_ms" : 320626, + "explicit" : false, + "external_ids" : { + "isrc" : "USUM71106458" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/1VpoMzYjmoQMOflZMGTZN3" + }, + "href" : "https://api.spotify.com/v1/tracks/1VpoMzYjmoQMOflZMGTZN3", + "id" : "1VpoMzYjmoQMOflZMGTZN3", + "name" : "The Edge Of Glory", + "popularity" : 57, + "preview_url" : "https://p.scdn.co/mp3-preview/b8fa0035a66a73b3fd934c65073eaca1576ba3c0", + "track_number" : 1, + "type" : "track", + "uri" : "spotify:track:1VpoMzYjmoQMOflZMGTZN3" + } + }, { + "added_at" : "2011-12-02T09:24:16Z", + "added_by" : null, + "track" : { + "album" : { + "album_type" : "single", + "available_markets" : [ "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LT", "LU", "LV", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SG", "SI", "SK", "SV", "TR", "TW" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/49ZMLWbQzziuxH2vHUjOX9" + }, + "href" : "https://api.spotify.com/v1/albums/49ZMLWbQzziuxH2vHUjOX9", + "id" : "49ZMLWbQzziuxH2vHUjOX9", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/33e47286f2b359aee82fdb3b1cf8a509812b8432", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/8efa8470652e6b2f5adf2575d447b5809be3148a", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/a1547b43572ab7e05b9a5929ae826045b473bf38", + "width" : 64 + } ], + "name" : "Judas", + "type" : "album", + "uri" : "spotify:album:49ZMLWbQzziuxH2vHUjOX9" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/1HY2Jd0NmPuamShAr6KMms" + }, + "href" : "https://api.spotify.com/v1/artists/1HY2Jd0NmPuamShAr6KMms", + "id" : "1HY2Jd0NmPuamShAr6KMms", + "name" : "Lady Gaga", + "type" : "artist", + "uri" : "spotify:artist:1HY2Jd0NmPuamShAr6KMms" + } ], + "available_markets" : [ "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LT", "LU", "LV", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SG", "SI", "SK", "SV", "TR", "TW" ], + "disc_number" : 1, + "duration_ms" : 250053, + "explicit" : false, + "external_ids" : { + "isrc" : "USUM71104998" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/1BrydEwIuNpfeCXBjKWpAu" + }, + "href" : "https://api.spotify.com/v1/tracks/1BrydEwIuNpfeCXBjKWpAu", + "id" : "1BrydEwIuNpfeCXBjKWpAu", + "name" : "Judas", + "popularity" : 50, + "preview_url" : "https://p.scdn.co/mp3-preview/7bf43c58ccd93e9fcd28ab4849c13ba6529d1fe2", + "track_number" : 1, + "type" : "track", + "uri" : "spotify:track:1BrydEwIuNpfeCXBjKWpAu" + } + }, { + "added_at" : "2010-05-06T09:16:55Z", + "added_by" : null, + "track" : { + "album" : { + "album_type" : "single", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/1yKCNIVac6PKISJ5u6IO1T" + }, + "href" : "https://api.spotify.com/v1/albums/1yKCNIVac6PKISJ5u6IO1T", + "id" : "1yKCNIVac6PKISJ5u6IO1T", + "images" : [ { + "height" : 600, + "url" : "https://i.scdn.co/image/bae487ab75f6a199e6663a38b10cb662c95e0a7a", + "width" : 600 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/1f55ace17bf6d814b89a9638fb05dbf03bd072bf", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/774cf32f107964a86177d8504a863a7bbac676fe", + "width" : 64 + } ], + "name" : "Hot N Cold", + "type" : "album", + "uri" : "spotify:album:1yKCNIVac6PKISJ5u6IO1T" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/6jJ0s89eD6GaHleKKya26X" + }, + "href" : "https://api.spotify.com/v1/artists/6jJ0s89eD6GaHleKKya26X", + "id" : "6jJ0s89eD6GaHleKKya26X", + "name" : "Katy Perry", + "type" : "artist", + "uri" : "spotify:artist:6jJ0s89eD6GaHleKKya26X" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "disc_number" : 1, + "duration_ms" : 223226, + "explicit" : false, + "external_ids" : { + "isrc" : "USCA20802544" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/0IZM2onaTBMRTEIcc5oIi9" + }, + "href" : "https://api.spotify.com/v1/tracks/0IZM2onaTBMRTEIcc5oIi9", + "id" : "0IZM2onaTBMRTEIcc5oIi9", + "name" : "Hot N Cold", + "popularity" : 61, + "preview_url" : "https://p.scdn.co/mp3-preview/5de67261e77d6807a541d369451cbd5e028072b4", + "track_number" : 1, + "type" : "track", + "uri" : "spotify:track:0IZM2onaTBMRTEIcc5oIi9" + } + }, { + "added_at" : "2010-05-08T06:23:31Z", + "added_by" : null, + "track" : { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/7MsL9vKLZM44fxTHlosW9b" + }, + "href" : "https://api.spotify.com/v1/albums/7MsL9vKLZM44fxTHlosW9b", + "id" : "7MsL9vKLZM44fxTHlosW9b", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/8a95bb3db01f311de33568ac076adca94c12f287", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/71c12c4519ece2c7cccd33f04436cceac5a45852", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/d263e6d6e4a5e95bb6f48c7c9cc3211d6df833e5", + "width" : 64 + } ], + "name" : "Latino Disco", + "type" : "album", + "uri" : "spotify:album:7MsL9vKLZM44fxTHlosW9b" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/2HcpPno2Aejd2XpN0nDxV9" + }, + "href" : "https://api.spotify.com/v1/artists/2HcpPno2Aejd2XpN0nDxV9", + "id" : "2HcpPno2Aejd2XpN0nDxV9", + "name" : "Studio 99", + "type" : "artist", + "uri" : "spotify:artist:2HcpPno2Aejd2XpN0nDxV9" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 278058, + "explicit" : false, + "external_ids" : { + "isrc" : "USA370550563" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/6HM9UgDB38hLDFm7e1RF6W" + }, + "href" : "https://api.spotify.com/v1/tracks/6HM9UgDB38hLDFm7e1RF6W", + "id" : "6HM9UgDB38hLDFm7e1RF6W", + "name" : "Bailando", + "popularity" : 37, + "preview_url" : "https://p.scdn.co/mp3-preview/6a1791d436ed587afb091d9efb05f4589b25b08b", + "track_number" : 7, + "type" : "track", + "uri" : "spotify:track:6HM9UgDB38hLDFm7e1RF6W" + } + }, { + "added_at" : "2010-05-08T06:24:31Z", + "added_by" : null, + "track" : { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "NI", "NL", "NO", "PA", "PE", "PL", "PT", "PY", "RO", "SE", "SI", "SK", "SV", "TR", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/08gFKsqvthQiLDTilR43SI" + }, + "href" : "https://api.spotify.com/v1/albums/08gFKsqvthQiLDTilR43SI", + "id" : "08gFKsqvthQiLDTilR43SI", + "images" : [ { + "height" : 558, + "url" : "https://i.scdn.co/image/593292023494ae286bc3d48b3e64b3a520bb6dd1", + "width" : 640 + }, { + "height" : 262, + "url" : "https://i.scdn.co/image/b6983937b248111714ce55073c9e3da2e16862ef", + "width" : 300 + }, { + "height" : 56, + "url" : "https://i.scdn.co/image/f38a2b8359591634647863f944d58ed68311d26c", + "width" : 64 + } ], + "name" : "Come Get It: The Very Best Of Aaron Carter", + "type" : "album", + "uri" : "spotify:album:08gFKsqvthQiLDTilR43SI" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/5338fdSzGNOFD4cxAxDTeq" + }, + "href" : "https://api.spotify.com/v1/artists/5338fdSzGNOFD4cxAxDTeq", + "id" : "5338fdSzGNOFD4cxAxDTeq", + "name" : "Aaron Carter", + "type" : "artist", + "uri" : "spotify:artist:5338fdSzGNOFD4cxAxDTeq" + } ], + "available_markets" : [ "AD", "AR", "AT", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "NI", "NL", "NO", "PA", "PE", "PL", "PT", "PY", "RO", "SE", "SI", "SK", "SV", "TR", "UY" ], + "disc_number" : 1, + "duration_ms" : 194253, + "explicit" : false, + "external_ids" : { + "isrc" : "USJI10000281" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/2cnZuQpDprgZB7jzdmBBCK" + }, + "href" : "https://api.spotify.com/v1/tracks/2cnZuQpDprgZB7jzdmBBCK", + "id" : "2cnZuQpDprgZB7jzdmBBCK", + "name" : "I Want Candy", + "popularity" : 12, + "preview_url" : "https://p.scdn.co/mp3-preview/beb1759bd33c368b3d9a321086a16a999f095a97", + "track_number" : 5, + "type" : "track", + "uri" : "spotify:track:2cnZuQpDprgZB7jzdmBBCK" + } + }, { + "added_at" : "2010-05-14T12:51:26Z", + "added_by" : null, + "track" : { + "album" : { + "album_type" : "album", + "available_markets" : [ "AR", "AT", "AU", "BE", "BG", "BR", "CH", "CL", "CO", "CR", "CZ", "DE", "DK", "EE", "ES", "FI", "FR", "GB", "GR", "HK", "HU", "IE", "IS", "IT", "LT", "LU", "LV", "MT", "MY", "NL", "NZ", "PH", "PL", "PT", "RO", "SE", "SG", "SI", "SK", "TR", "TW" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/3vkxgQhR4QsgozSDmGoAvY" + }, + "href" : "https://api.spotify.com/v1/albums/3vkxgQhR4QsgozSDmGoAvY", + "id" : "3vkxgQhR4QsgozSDmGoAvY", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/566ee4034e25c779bb522a2297112e68bfc23b06", + "width" : 638 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/015d40395c05b2e88a65c6e96e9415327e163dea", + "width" : 299 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/a28506fbf3b80f1a94c514f20005832bbb78bf96", + "width" : 64 + } ], + "name" : "Pop Party", + "type" : "album", + "uri" : "spotify:album:3vkxgQhR4QsgozSDmGoAvY" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/6kBjAFKyd0he7LiA5GQ3Gz" + }, + "href" : "https://api.spotify.com/v1/artists/6kBjAFKyd0he7LiA5GQ3Gz", + "id" : "6kBjAFKyd0he7LiA5GQ3Gz", + "name" : "Aqua", + "type" : "artist", + "uri" : "spotify:artist:6kBjAFKyd0he7LiA5GQ3Gz" + } ], + "available_markets" : [ "AR", "AT", "AU", "BE", "BG", "BR", "CH", "CL", "CO", "CR", "CZ", "DE", "DK", "EE", "ES", "FI", "FR", "GB", "GR", "HK", "HU", "IE", "IS", "IT", "LT", "LU", "LV", "MT", "MY", "NL", "NZ", "PH", "PL", "PT", "RO", "SE", "SG", "SI", "SK", "TR", "TW" ], + "disc_number" : 1, + "duration_ms" : 194040, + "explicit" : false, + "external_ids" : { + "isrc" : "DKBKA9700403" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/7kz6GbFr2MCI7PgXJOdq8c" + }, + "href" : "https://api.spotify.com/v1/tracks/7kz6GbFr2MCI7PgXJOdq8c", + "id" : "7kz6GbFr2MCI7PgXJOdq8c", + "name" : "Barbie Girl", + "popularity" : 64, + "preview_url" : "https://p.scdn.co/mp3-preview/31c02df23f26b7ece015b96b1b6baaf8f97f0273", + "track_number" : 3, + "type" : "track", + "uri" : "spotify:track:7kz6GbFr2MCI7PgXJOdq8c" + } + }, { + "added_at" : "2011-12-15T15:02:58Z", + "added_by" : null, + "track" : { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/06SY6Ke6mXzZHhURLVU57R" + }, + "href" : "https://api.spotify.com/v1/albums/06SY6Ke6mXzZHhURLVU57R", + "id" : "06SY6Ke6mXzZHhURLVU57R", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/ce8f207440681b989f02c20129b0b627036fd71c", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/409c641ca368b7b9c589103bb9ca8a5914c640dc", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/28bab516d29947e363b6c169100f2efbad6b84e2", + "width" : 64 + } ], + "name" : "Teenage Dream", + "type" : "album", + "uri" : "spotify:album:06SY6Ke6mXzZHhURLVU57R" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/6jJ0s89eD6GaHleKKya26X" + }, + "href" : "https://api.spotify.com/v1/artists/6jJ0s89eD6GaHleKKya26X", + "id" : "6jJ0s89eD6GaHleKKya26X", + "name" : "Katy Perry", + "type" : "artist", + "uri" : "spotify:artist:6jJ0s89eD6GaHleKKya26X" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "disc_number" : 1, + "duration_ms" : 230733, + "explicit" : false, + "external_ids" : { + "isrc" : "USCA21001264" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/3oHNJECGN3bBoGXejlw2b1" + }, + "href" : "https://api.spotify.com/v1/tracks/3oHNJECGN3bBoGXejlw2b1", + "id" : "3oHNJECGN3bBoGXejlw2b1", + "name" : "Last Friday Night (T.G.I.F.)", + "popularity" : 62, + "preview_url" : "https://p.scdn.co/mp3-preview/6b419ceb20e3ca3ea800832b1ab3010d744b2c26", + "track_number" : 2, + "type" : "track", + "uri" : "spotify:track:3oHNJECGN3bBoGXejlw2b1" + } + }, { + "added_at" : "2012-06-26T18:53:34Z", + "added_by" : null, + "track" : { + "album" : { + "album_type" : "single", + "available_markets" : [ ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/2zjaqU3EvxkxbYObOJOWPc" + }, + "href" : "https://api.spotify.com/v1/albums/2zjaqU3EvxkxbYObOJOWPc", + "id" : "2zjaqU3EvxkxbYObOJOWPc", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/7a5ea8d84dfd79d66ed3b771f0fa27d95e77f8c6", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/f1c2fdb993cfeafe149ad1d8c81290c85b175076", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/b9867d389ff8158f3b6d4963064e84738ec3db04", + "width" : 64 + } ], + "name" : "Get Free", + "type" : "album", + "uri" : "spotify:album:2zjaqU3EvxkxbYObOJOWPc" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/738wLrAtLtCtFOLvQBXOXp" + }, + "href" : "https://api.spotify.com/v1/artists/738wLrAtLtCtFOLvQBXOXp", + "id" : "738wLrAtLtCtFOLvQBXOXp", + "name" : "Major Lazer", + "type" : "artist", + "uri" : "spotify:artist:738wLrAtLtCtFOLvQBXOXp" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/50n0lOYeD5omHicMWhTJ4W" + }, + "href" : "https://api.spotify.com/v1/artists/50n0lOYeD5omHicMWhTJ4W", + "id" : "50n0lOYeD5omHicMWhTJ4W", + "name" : "Amber of the Dirty Projectors", + "type" : "artist", + "uri" : "spotify:artist:50n0lOYeD5omHicMWhTJ4W" + } ], + "available_markets" : [ ], + "disc_number" : 1, + "duration_ms" : 223299, + "explicit" : false, + "external_ids" : { + "isrc" : "USCJ81200812" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/1H5vt0uSkg4Pz2aLgTFs14" + }, + "href" : "https://api.spotify.com/v1/tracks/1H5vt0uSkg4Pz2aLgTFs14", + "id" : "1H5vt0uSkg4Pz2aLgTFs14", + "name" : "Get Free - Bonde Do Role Remix", + "popularity" : 0, + "preview_url" : "https://p.scdn.co/mp3-preview/25503f61c5d0527aa6428f648906e2f8d3f72a64", + "track_number" : 2, + "type" : "track", + "uri" : "spotify:track:1H5vt0uSkg4Pz2aLgTFs14" + } + }, { + "added_at" : "2013-06-03T18:00:50Z", + "added_by" : { + "external_urls" : { + "spotify" : "http://open.spotify.com/user/mcgurk" + }, + "href" : "https://api.spotify.com/v1/users/mcgurk", + "id" : "mcgurk", + "type" : "user", + "uri" : "spotify:user:mcgurk" + }, + "track" : { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/2Sscsd9Fo1Fa4VZC26k5jl" + }, + "href" : "https://api.spotify.com/v1/albums/2Sscsd9Fo1Fa4VZC26k5jl", + "id" : "2Sscsd9Fo1Fa4VZC26k5jl", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/155cc4ef02624c248644651bfe3c0c67339aa35e", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/79c0b56d99777ff45adda02a492b7be1001049ee", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/08c6f092971d2e57a99b76eac230aaf95e976a62", + "width" : 64 + } ], + "name" : "The Safety Dance – The Collection", + "type" : "album", + "uri" : "spotify:album:2Sscsd9Fo1Fa4VZC26k5jl" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/34PLzyi7CdXUekiLHYyqXq" + }, + "href" : "https://api.spotify.com/v1/artists/34PLzyi7CdXUekiLHYyqXq", + "id" : "34PLzyi7CdXUekiLHYyqXq", + "name" : "Men Without Hats", + "type" : "artist", + "uri" : "spotify:artist:34PLzyi7CdXUekiLHYyqXq" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "disc_number" : 1, + "duration_ms" : 164866, + "explicit" : false, + "external_ids" : { + "isrc" : "GBBLG0200043" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/7eEfbAG7wgV4AgkdTakVFT" + }, + "href" : "https://api.spotify.com/v1/tracks/7eEfbAG7wgV4AgkdTakVFT", + "id" : "7eEfbAG7wgV4AgkdTakVFT", + "name" : "The Safety Dance", + "popularity" : 42, + "preview_url" : "https://p.scdn.co/mp3-preview/05676ec46121522e9f0fc658c9d43ed924a6e65c", + "track_number" : 1, + "type" : "track", + "uri" : "spotify:track:7eEfbAG7wgV4AgkdTakVFT" + } + }, { + "added_at" : "2013-12-24T23:52:57Z", + "added_by" : { + "external_urls" : { + "spotify" : "http://open.spotify.com/user/mcgurk" + }, + "href" : "https://api.spotify.com/v1/users/mcgurk", + "id" : "mcgurk", + "type" : "user", + "uri" : "spotify:user:mcgurk" + }, + "track" : { + "album" : { + "album_type" : "single", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/7nvaG92AQuoXY8uWJDMpXW" + }, + "href" : "https://api.spotify.com/v1/albums/7nvaG92AQuoXY8uWJDMpXW", + "id" : "7nvaG92AQuoXY8uWJDMpXW", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/42826eb468e063e241212770a870d8599cc75d59", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/12f05f4aad5e40624162c5a27616709172153760", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/e5f79913e60b158757ed1a197231a41612eb32cc", + "width" : 64 + } ], + "name" : "Perfect (Exceeder)", + "type" : "album", + "uri" : "spotify:album:7nvaG92AQuoXY8uWJDMpXW" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/307erl4VjT1dZDMYpneZqd" + }, + "href" : "https://api.spotify.com/v1/artists/307erl4VjT1dZDMYpneZqd", + "id" : "307erl4VjT1dZDMYpneZqd", + "name" : "Mason", + "type" : "artist", + "uri" : "spotify:artist:307erl4VjT1dZDMYpneZqd" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/7JQn9DfFTtsFTg2dFc75jM" + }, + "href" : "https://api.spotify.com/v1/artists/7JQn9DfFTtsFTg2dFc75jM", + "id" : "7JQn9DfFTtsFTg2dFc75jM", + "name" : "Princess Superstar", + "type" : "artist", + "uri" : "spotify:artist:7JQn9DfFTtsFTg2dFc75jM" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 161250, + "explicit" : false, + "external_ids" : { + "isrc" : "NLF711312388" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/2nyBqOKARcKxrJaPyXRNx3" + }, + "href" : "https://api.spotify.com/v1/tracks/2nyBqOKARcKxrJaPyXRNx3", + "id" : "2nyBqOKARcKxrJaPyXRNx3", + "name" : "Perfect (Exceeder) - Radio Edit", + "popularity" : 46, + "preview_url" : "https://p.scdn.co/mp3-preview/b7c76d0b50d90e50f3d1cdfb4f8df91ebfe55848", + "track_number" : 1, + "type" : "track", + "uri" : "spotify:track:2nyBqOKARcKxrJaPyXRNx3" + } + } ], + "limit" : 100, + "next" : null, + "offset" : 0, + "previous" : null, + "total" : 17 + }, + "type" : "playlist", + "uri" : "spotify:user:mcgurk:playlist:0UZ0Ll4HJHR7yvURYbHJe9" +} diff --git a/vendor/jwilsson/spotify-web-api-php/tests/fixtures/user-playlist-snapshot-id.json b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/user-playlist-snapshot-id.json new file mode 100644 index 0000000..cb6bf72 --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/user-playlist-snapshot-id.json @@ -0,0 +1 @@ +{ "snapshot_id" : "JbtmHBDBAYu3/bt8BOXKjzKx3i0b6LCa/wVjyl6qQ2Yf6nFXkbmzuEa+ZI/U1yF+" } diff --git a/vendor/jwilsson/spotify-web-api-php/tests/fixtures/user-playlist-tracks.json b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/user-playlist-tracks.json new file mode 100644 index 0000000..02bbb41 --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/user-playlist-tracks.json @@ -0,0 +1,308 @@ +{ + "href" : "https://api.spotify.com/v1/users/mcgurk/playlists/0UZ0Ll4HJHR7yvURYbHJe9/tracks", + "items" : [ { + "added_at" : "2010-05-03T10:49:43Z", + "added_by" : null, + "track" : { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/1qwlxZTNLe1jq3b0iidlue" + }, + "href" : "https://api.spotify.com/v1/albums/1qwlxZTNLe1jq3b0iidlue", + "id" : "1qwlxZTNLe1jq3b0iidlue", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/9643ed59c59a044b817482a51e67377971ad7469", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/a51c3a507f52a0cc798d29e7a2d8d6e1adace445", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/a06ede8283b1ce28b70aaf7e500edf4e409b50e0", + "width" : 64 + } ], + "name" : "The Fame", + "type" : "album", + "uri" : "spotify:album:1qwlxZTNLe1jq3b0iidlue" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/1HY2Jd0NmPuamShAr6KMms" + }, + "href" : "https://api.spotify.com/v1/artists/1HY2Jd0NmPuamShAr6KMms", + "id" : "1HY2Jd0NmPuamShAr6KMms", + "name" : "Lady Gaga", + "type" : "artist", + "uri" : "spotify:artist:1HY2Jd0NmPuamShAr6KMms" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/7fObcBw9VM3x7ntWKCYl0z" + }, + "href" : "https://api.spotify.com/v1/artists/7fObcBw9VM3x7ntWKCYl0z", + "id" : "7fObcBw9VM3x7ntWKCYl0z", + "name" : "Colby O'Donis", + "type" : "artist", + "uri" : "spotify:artist:7fObcBw9VM3x7ntWKCYl0z" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "disc_number" : 1, + "duration_ms" : 241933, + "explicit" : false, + "external_ids" : { + "isrc" : "USUM70807646" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/1dzQoRqT5ucxXVaAhTcT0J" + }, + "href" : "https://api.spotify.com/v1/tracks/1dzQoRqT5ucxXVaAhTcT0J", + "id" : "1dzQoRqT5ucxXVaAhTcT0J", + "name" : "Just Dance", + "popularity" : 66, + "preview_url" : "https://p.scdn.co/mp3-preview/3dbcc47a8bcbeefeb4a0e68db1d6937b7dee4980", + "track_number" : 1, + "type" : "track", + "uri" : "spotify:track:1dzQoRqT5ucxXVaAhTcT0J" + } + }, { + "added_at" : "2010-05-03T10:49:46Z", + "added_by" : null, + "track" : { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/1qwlxZTNLe1jq3b0iidlue" + }, + "href" : "https://api.spotify.com/v1/albums/1qwlxZTNLe1jq3b0iidlue", + "id" : "1qwlxZTNLe1jq3b0iidlue", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/9643ed59c59a044b817482a51e67377971ad7469", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/a51c3a507f52a0cc798d29e7a2d8d6e1adace445", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/a06ede8283b1ce28b70aaf7e500edf4e409b50e0", + "width" : 64 + } ], + "name" : "The Fame", + "type" : "album", + "uri" : "spotify:album:1qwlxZTNLe1jq3b0iidlue" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/1HY2Jd0NmPuamShAr6KMms" + }, + "href" : "https://api.spotify.com/v1/artists/1HY2Jd0NmPuamShAr6KMms", + "id" : "1HY2Jd0NmPuamShAr6KMms", + "name" : "Lady Gaga", + "type" : "artist", + "uri" : "spotify:artist:1HY2Jd0NmPuamShAr6KMms" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "disc_number" : 1, + "duration_ms" : 208306, + "explicit" : false, + "external_ids" : { + "isrc" : "USUM70824408" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/02XnQdf7sipaKBBHixz3Zp" + }, + "href" : "https://api.spotify.com/v1/tracks/02XnQdf7sipaKBBHixz3Zp", + "id" : "02XnQdf7sipaKBBHixz3Zp", + "name" : "Paparazzi", + "popularity" : 58, + "preview_url" : "https://p.scdn.co/mp3-preview/ac27854ae09b2d4bce83c712af1eacb3071a96dc", + "track_number" : 3, + "type" : "track", + "uri" : "spotify:track:02XnQdf7sipaKBBHixz3Zp" + } + }, { + "added_at" : "2010-05-03T10:49:47Z", + "added_by" : null, + "track" : { + "album" : { + "album_type" : "single", + "available_markets" : [ "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LT", "LU", "LV", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SG", "SI", "SK", "SV", "TR", "TW" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/482HqzMMfrkFXAGujtwFrm" + }, + "href" : "https://api.spotify.com/v1/albums/482HqzMMfrkFXAGujtwFrm", + "id" : "482HqzMMfrkFXAGujtwFrm", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/bb8d1b26591b8187455990b6c37efee9e325b6cd", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/e8e0c44240138a62ea6d89f814774ce5ef62fe79", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/03b69cdc8ed6725e199571bce6aa583daf0ec4cd", + "width" : 64 + } ], + "name" : "Poker Face", + "type" : "album", + "uri" : "spotify:album:482HqzMMfrkFXAGujtwFrm" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/1HY2Jd0NmPuamShAr6KMms" + }, + "href" : "https://api.spotify.com/v1/artists/1HY2Jd0NmPuamShAr6KMms", + "id" : "1HY2Jd0NmPuamShAr6KMms", + "name" : "Lady Gaga", + "type" : "artist", + "uri" : "spotify:artist:1HY2Jd0NmPuamShAr6KMms" + } ], + "available_markets" : [ "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LT", "LU", "LV", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SG", "SI", "SK", "SV", "TR", "TW" ], + "disc_number" : 1, + "duration_ms" : 237400, + "explicit" : false, + "external_ids" : { + "isrc" : "USUM70824409" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/6w1hZMlo2SVuq29liebhb8" + }, + "href" : "https://api.spotify.com/v1/tracks/6w1hZMlo2SVuq29liebhb8", + "id" : "6w1hZMlo2SVuq29liebhb8", + "name" : "Poker Face", + "popularity" : 64, + "preview_url" : "https://p.scdn.co/mp3-preview/ae1b1b93c2288d3363b9a46c51bcca39abd99779", + "track_number" : 1, + "type" : "track", + "uri" : "spotify:track:6w1hZMlo2SVuq29liebhb8" + } + }, { + "added_at" : "2010-05-03T10:49:49Z", + "added_by" : null, + "track" : { + "album" : { + "album_type" : "single", + "available_markets" : [ "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LT", "LU", "LV", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SG", "SI", "SK", "SV", "TR", "TW" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/1Ot9FUXNmehWsLMmrYUt3F" + }, + "href" : "https://api.spotify.com/v1/albums/1Ot9FUXNmehWsLMmrYUt3F", + "id" : "1Ot9FUXNmehWsLMmrYUt3F", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/0401ab7daff118586b6ca67eea6fa92af97aa36d", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/6c21051a71d8ac9fe061a4b0063537da0893f55c", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/48d4ebd64a44f4c256f27fa6042fe015f4d0740b", + "width" : 64 + } ], + "name" : "Bad Romance", + "type" : "album", + "uri" : "spotify:album:1Ot9FUXNmehWsLMmrYUt3F" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/1HY2Jd0NmPuamShAr6KMms" + }, + "href" : "https://api.spotify.com/v1/artists/1HY2Jd0NmPuamShAr6KMms", + "id" : "1HY2Jd0NmPuamShAr6KMms", + "name" : "Lady Gaga", + "type" : "artist", + "uri" : "spotify:artist:1HY2Jd0NmPuamShAr6KMms" + } ], + "available_markets" : [ "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LT", "LU", "LV", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SG", "SI", "SK", "SV", "TR", "TW" ], + "disc_number" : 1, + "duration_ms" : 294640, + "explicit" : false, + "external_ids" : { + "isrc" : "USUM70903859" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/6MjiVEJy1YVuJNFu72OH61" + }, + "href" : "https://api.spotify.com/v1/tracks/6MjiVEJy1YVuJNFu72OH61", + "id" : "6MjiVEJy1YVuJNFu72OH61", + "name" : "Bad Romance", + "popularity" : 67, + "preview_url" : "https://p.scdn.co/mp3-preview/4ddf5c8885830a3e1e7d05ebeb9170b850d27e9e", + "track_number" : 1, + "type" : "track", + "uri" : "spotify:track:6MjiVEJy1YVuJNFu72OH61" + } + }, { + "added_at" : "2010-05-03T10:51:44Z", + "added_by" : null, + "track" : { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/67j3NJodNRI8USUwKwTZA6" + }, + "href" : "https://api.spotify.com/v1/albums/67j3NJodNRI8USUwKwTZA6", + "id" : "67j3NJodNRI8USUwKwTZA6", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/88300dc6d25e9c6d110db6cd7a206bf590412f9d", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/5850cd38f30cf5c6bc2846fc7bbba1d72313324f", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/15e1da0a85e6d1fad488172e3be7d9fd1b97fa73", + "width" : 64 + } ], + "name" : "The Fame Monster (International Deluxe)", + "type" : "album", + "uri" : "spotify:album:67j3NJodNRI8USUwKwTZA6" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/1HY2Jd0NmPuamShAr6KMms" + }, + "href" : "https://api.spotify.com/v1/artists/1HY2Jd0NmPuamShAr6KMms", + "id" : "1HY2Jd0NmPuamShAr6KMms", + "name" : "Lady Gaga", + "type" : "artist", + "uri" : "spotify:artist:1HY2Jd0NmPuamShAr6KMms" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "disc_number" : 2, + "duration_ms" : 175346, + "explicit" : false, + "external_ids" : { + "isrc" : "USUM70824406" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/6z7HmyQFiVBJm1OzBknw38" + }, + "href" : "https://api.spotify.com/v1/tracks/6z7HmyQFiVBJm1OzBknw38", + "id" : "6z7HmyQFiVBJm1OzBknw38", + "name" : "Eh, Eh (Nothing Else I Can Say)", + "popularity" : 48, + "preview_url" : "https://p.scdn.co/mp3-preview/a2ee2124a43f27cdf71bfee176013d67451c7942", + "track_number" : 6, + "type" : "track", + "uri" : "spotify:track:6z7HmyQFiVBJm1OzBknw38" + } + } ], + "limit" : 5, + "next" : "https://api.spotify.com/v1/users/mcgurk/playlists/0UZ0Ll4HJHR7yvURYbHJe9/tracks?offset=5&limit=5", + "offset" : 0, + "previous" : null, + "total" : 17 +} diff --git a/vendor/jwilsson/spotify-web-api-php/tests/fixtures/user-playlist.json b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/user-playlist.json new file mode 100644 index 0000000..49c78a9 --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/user-playlist.json @@ -0,0 +1,1075 @@ +{ + "collaborative" : false, + "description" : null, + "external_urls" : { + "spotify" : "http://open.spotify.com/user/mcgurk/playlist/0UZ0Ll4HJHR7yvURYbHJe9" + }, + "followers" : { + "href" : null, + "total" : 0 + }, + "href" : "https://api.spotify.com/v1/users/mcgurk/playlists/0UZ0Ll4HJHR7yvURYbHJe9", + "id" : "0UZ0Ll4HJHR7yvURYbHJe9", + "images" : [ ], + "name" : "PARTY", + "owner" : { + "external_urls" : { + "spotify" : "http://open.spotify.com/user/mcgurk" + }, + "href" : "https://api.spotify.com/v1/users/mcgurk", + "id" : "mcgurk", + "type" : "user", + "uri" : "spotify:user:mcgurk" + }, + "public" : false, + "snapshot_id" : "bKMQr5cpdBKJCat1G4h4C2VinMLjIX7C1b1FEs1OWp2+e0cSd9ilKN5G1K0R+fpr", + "tracks" : { + "href" : "https://api.spotify.com/v1/users/mcgurk/playlists/0UZ0Ll4HJHR7yvURYbHJe9/tracks", + "items" : [ { + "added_at" : "2010-05-03T10:49:43Z", + "added_by" : null, + "track" : { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/1qwlxZTNLe1jq3b0iidlue" + }, + "href" : "https://api.spotify.com/v1/albums/1qwlxZTNLe1jq3b0iidlue", + "id" : "1qwlxZTNLe1jq3b0iidlue", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/9643ed59c59a044b817482a51e67377971ad7469", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/a51c3a507f52a0cc798d29e7a2d8d6e1adace445", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/a06ede8283b1ce28b70aaf7e500edf4e409b50e0", + "width" : 64 + } ], + "name" : "The Fame", + "type" : "album", + "uri" : "spotify:album:1qwlxZTNLe1jq3b0iidlue" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/1HY2Jd0NmPuamShAr6KMms" + }, + "href" : "https://api.spotify.com/v1/artists/1HY2Jd0NmPuamShAr6KMms", + "id" : "1HY2Jd0NmPuamShAr6KMms", + "name" : "Lady Gaga", + "type" : "artist", + "uri" : "spotify:artist:1HY2Jd0NmPuamShAr6KMms" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/7fObcBw9VM3x7ntWKCYl0z" + }, + "href" : "https://api.spotify.com/v1/artists/7fObcBw9VM3x7ntWKCYl0z", + "id" : "7fObcBw9VM3x7ntWKCYl0z", + "name" : "Colby O'Donis", + "type" : "artist", + "uri" : "spotify:artist:7fObcBw9VM3x7ntWKCYl0z" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "disc_number" : 1, + "duration_ms" : 241933, + "explicit" : false, + "external_ids" : { + "isrc" : "USUM70807646" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/1dzQoRqT5ucxXVaAhTcT0J" + }, + "href" : "https://api.spotify.com/v1/tracks/1dzQoRqT5ucxXVaAhTcT0J", + "id" : "1dzQoRqT5ucxXVaAhTcT0J", + "name" : "Just Dance", + "popularity" : 66, + "preview_url" : "https://p.scdn.co/mp3-preview/3dbcc47a8bcbeefeb4a0e68db1d6937b7dee4980", + "track_number" : 1, + "type" : "track", + "uri" : "spotify:track:1dzQoRqT5ucxXVaAhTcT0J" + } + }, { + "added_at" : "2010-05-03T10:49:46Z", + "added_by" : null, + "track" : { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/1qwlxZTNLe1jq3b0iidlue" + }, + "href" : "https://api.spotify.com/v1/albums/1qwlxZTNLe1jq3b0iidlue", + "id" : "1qwlxZTNLe1jq3b0iidlue", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/9643ed59c59a044b817482a51e67377971ad7469", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/a51c3a507f52a0cc798d29e7a2d8d6e1adace445", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/a06ede8283b1ce28b70aaf7e500edf4e409b50e0", + "width" : 64 + } ], + "name" : "The Fame", + "type" : "album", + "uri" : "spotify:album:1qwlxZTNLe1jq3b0iidlue" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/1HY2Jd0NmPuamShAr6KMms" + }, + "href" : "https://api.spotify.com/v1/artists/1HY2Jd0NmPuamShAr6KMms", + "id" : "1HY2Jd0NmPuamShAr6KMms", + "name" : "Lady Gaga", + "type" : "artist", + "uri" : "spotify:artist:1HY2Jd0NmPuamShAr6KMms" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "disc_number" : 1, + "duration_ms" : 208306, + "explicit" : false, + "external_ids" : { + "isrc" : "USUM70824408" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/02XnQdf7sipaKBBHixz3Zp" + }, + "href" : "https://api.spotify.com/v1/tracks/02XnQdf7sipaKBBHixz3Zp", + "id" : "02XnQdf7sipaKBBHixz3Zp", + "name" : "Paparazzi", + "popularity" : 58, + "preview_url" : "https://p.scdn.co/mp3-preview/ac27854ae09b2d4bce83c712af1eacb3071a96dc", + "track_number" : 3, + "type" : "track", + "uri" : "spotify:track:02XnQdf7sipaKBBHixz3Zp" + } + }, { + "added_at" : "2010-05-03T10:49:47Z", + "added_by" : null, + "track" : { + "album" : { + "album_type" : "single", + "available_markets" : [ "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LT", "LU", "LV", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SG", "SI", "SK", "SV", "TR", "TW" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/482HqzMMfrkFXAGujtwFrm" + }, + "href" : "https://api.spotify.com/v1/albums/482HqzMMfrkFXAGujtwFrm", + "id" : "482HqzMMfrkFXAGujtwFrm", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/bb8d1b26591b8187455990b6c37efee9e325b6cd", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/e8e0c44240138a62ea6d89f814774ce5ef62fe79", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/03b69cdc8ed6725e199571bce6aa583daf0ec4cd", + "width" : 64 + } ], + "name" : "Poker Face", + "type" : "album", + "uri" : "spotify:album:482HqzMMfrkFXAGujtwFrm" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/1HY2Jd0NmPuamShAr6KMms" + }, + "href" : "https://api.spotify.com/v1/artists/1HY2Jd0NmPuamShAr6KMms", + "id" : "1HY2Jd0NmPuamShAr6KMms", + "name" : "Lady Gaga", + "type" : "artist", + "uri" : "spotify:artist:1HY2Jd0NmPuamShAr6KMms" + } ], + "available_markets" : [ "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LT", "LU", "LV", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SG", "SI", "SK", "SV", "TR", "TW" ], + "disc_number" : 1, + "duration_ms" : 237400, + "explicit" : false, + "external_ids" : { + "isrc" : "USUM70824409" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/6w1hZMlo2SVuq29liebhb8" + }, + "href" : "https://api.spotify.com/v1/tracks/6w1hZMlo2SVuq29liebhb8", + "id" : "6w1hZMlo2SVuq29liebhb8", + "name" : "Poker Face", + "popularity" : 64, + "preview_url" : "https://p.scdn.co/mp3-preview/ae1b1b93c2288d3363b9a46c51bcca39abd99779", + "track_number" : 1, + "type" : "track", + "uri" : "spotify:track:6w1hZMlo2SVuq29liebhb8" + } + }, { + "added_at" : "2010-05-03T10:49:49Z", + "added_by" : null, + "track" : { + "album" : { + "album_type" : "single", + "available_markets" : [ "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LT", "LU", "LV", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SG", "SI", "SK", "SV", "TR", "TW" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/1Ot9FUXNmehWsLMmrYUt3F" + }, + "href" : "https://api.spotify.com/v1/albums/1Ot9FUXNmehWsLMmrYUt3F", + "id" : "1Ot9FUXNmehWsLMmrYUt3F", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/0401ab7daff118586b6ca67eea6fa92af97aa36d", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/6c21051a71d8ac9fe061a4b0063537da0893f55c", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/48d4ebd64a44f4c256f27fa6042fe015f4d0740b", + "width" : 64 + } ], + "name" : "Bad Romance", + "type" : "album", + "uri" : "spotify:album:1Ot9FUXNmehWsLMmrYUt3F" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/1HY2Jd0NmPuamShAr6KMms" + }, + "href" : "https://api.spotify.com/v1/artists/1HY2Jd0NmPuamShAr6KMms", + "id" : "1HY2Jd0NmPuamShAr6KMms", + "name" : "Lady Gaga", + "type" : "artist", + "uri" : "spotify:artist:1HY2Jd0NmPuamShAr6KMms" + } ], + "available_markets" : [ "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LT", "LU", "LV", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SG", "SI", "SK", "SV", "TR", "TW" ], + "disc_number" : 1, + "duration_ms" : 294640, + "explicit" : false, + "external_ids" : { + "isrc" : "USUM70903859" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/6MjiVEJy1YVuJNFu72OH61" + }, + "href" : "https://api.spotify.com/v1/tracks/6MjiVEJy1YVuJNFu72OH61", + "id" : "6MjiVEJy1YVuJNFu72OH61", + "name" : "Bad Romance", + "popularity" : 67, + "preview_url" : "https://p.scdn.co/mp3-preview/4ddf5c8885830a3e1e7d05ebeb9170b850d27e9e", + "track_number" : 1, + "type" : "track", + "uri" : "spotify:track:6MjiVEJy1YVuJNFu72OH61" + } + }, { + "added_at" : "2010-05-03T10:51:44Z", + "added_by" : null, + "track" : { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/67j3NJodNRI8USUwKwTZA6" + }, + "href" : "https://api.spotify.com/v1/albums/67j3NJodNRI8USUwKwTZA6", + "id" : "67j3NJodNRI8USUwKwTZA6", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/88300dc6d25e9c6d110db6cd7a206bf590412f9d", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/5850cd38f30cf5c6bc2846fc7bbba1d72313324f", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/15e1da0a85e6d1fad488172e3be7d9fd1b97fa73", + "width" : 64 + } ], + "name" : "The Fame Monster (International Deluxe)", + "type" : "album", + "uri" : "spotify:album:67j3NJodNRI8USUwKwTZA6" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/1HY2Jd0NmPuamShAr6KMms" + }, + "href" : "https://api.spotify.com/v1/artists/1HY2Jd0NmPuamShAr6KMms", + "id" : "1HY2Jd0NmPuamShAr6KMms", + "name" : "Lady Gaga", + "type" : "artist", + "uri" : "spotify:artist:1HY2Jd0NmPuamShAr6KMms" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "disc_number" : 2, + "duration_ms" : 175346, + "explicit" : false, + "external_ids" : { + "isrc" : "USUM70824406" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/6z7HmyQFiVBJm1OzBknw38" + }, + "href" : "https://api.spotify.com/v1/tracks/6z7HmyQFiVBJm1OzBknw38", + "id" : "6z7HmyQFiVBJm1OzBknw38", + "name" : "Eh, Eh (Nothing Else I Can Say)", + "popularity" : 48, + "preview_url" : "https://p.scdn.co/mp3-preview/a2ee2124a43f27cdf71bfee176013d67451c7942", + "track_number" : 6, + "type" : "track", + "uri" : "spotify:track:6z7HmyQFiVBJm1OzBknw38" + } + }, { + "added_at" : "2010-06-02T13:33:34Z", + "added_by" : null, + "track" : { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/67j3NJodNRI8USUwKwTZA6" + }, + "href" : "https://api.spotify.com/v1/albums/67j3NJodNRI8USUwKwTZA6", + "id" : "67j3NJodNRI8USUwKwTZA6", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/88300dc6d25e9c6d110db6cd7a206bf590412f9d", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/5850cd38f30cf5c6bc2846fc7bbba1d72313324f", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/15e1da0a85e6d1fad488172e3be7d9fd1b97fa73", + "width" : 64 + } ], + "name" : "The Fame Monster (International Deluxe)", + "type" : "album", + "uri" : "spotify:album:67j3NJodNRI8USUwKwTZA6" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/1HY2Jd0NmPuamShAr6KMms" + }, + "href" : "https://api.spotify.com/v1/artists/1HY2Jd0NmPuamShAr6KMms", + "id" : "1HY2Jd0NmPuamShAr6KMms", + "name" : "Lady Gaga", + "type" : "artist", + "uri" : "spotify:artist:1HY2Jd0NmPuamShAr6KMms" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/6vWDO969PvNqNYHIOW5v0m" + }, + "href" : "https://api.spotify.com/v1/artists/6vWDO969PvNqNYHIOW5v0m", + "id" : "6vWDO969PvNqNYHIOW5v0m", + "name" : "Beyoncé", + "type" : "artist", + "uri" : "spotify:artist:6vWDO969PvNqNYHIOW5v0m" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "disc_number" : 1, + "duration_ms" : 220626, + "explicit" : false, + "external_ids" : { + "isrc" : "USUM70905541" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/00BuKLSAFkaEkaVAgIMbeA" + }, + "href" : "https://api.spotify.com/v1/tracks/00BuKLSAFkaEkaVAgIMbeA", + "id" : "00BuKLSAFkaEkaVAgIMbeA", + "name" : "Telephone", + "popularity" : 67, + "preview_url" : "https://p.scdn.co/mp3-preview/20a9177d56bb05bbccf7c5fe82058e74edd328a2", + "track_number" : 6, + "type" : "track", + "uri" : "spotify:track:00BuKLSAFkaEkaVAgIMbeA" + } + }, { + "added_at" : "2011-09-09T19:52:27Z", + "added_by" : null, + "track" : { + "album" : { + "album_type" : "single", + "available_markets" : [ "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LT", "LU", "LV", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SG", "SI", "SK", "SV", "TR", "TW" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/6brEmLzLxjAOB0KcXdT7ye" + }, + "href" : "https://api.spotify.com/v1/albums/6brEmLzLxjAOB0KcXdT7ye", + "id" : "6brEmLzLxjAOB0KcXdT7ye", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/fce70d4c29071b363425bd2fa8072ee54e6eb16b", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/b59f854ec0e0c317cb0d367ea91a0e64d4a0c009", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/e5a400bd412f77c2c6870903eee86083851aa842", + "width" : 64 + } ], + "name" : "Born This Way", + "type" : "album", + "uri" : "spotify:album:6brEmLzLxjAOB0KcXdT7ye" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/1HY2Jd0NmPuamShAr6KMms" + }, + "href" : "https://api.spotify.com/v1/artists/1HY2Jd0NmPuamShAr6KMms", + "id" : "1HY2Jd0NmPuamShAr6KMms", + "name" : "Lady Gaga", + "type" : "artist", + "uri" : "spotify:artist:1HY2Jd0NmPuamShAr6KMms" + } ], + "available_markets" : [ "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LT", "LU", "LV", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SG", "SI", "SK", "SV", "TR", "TW" ], + "disc_number" : 1, + "duration_ms" : 260466, + "explicit" : false, + "external_ids" : { + "isrc" : "USUM71100638" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/6wAdqKcL7uESrsekjLTKod" + }, + "href" : "https://api.spotify.com/v1/tracks/6wAdqKcL7uESrsekjLTKod", + "id" : "6wAdqKcL7uESrsekjLTKod", + "name" : "Born This Way", + "popularity" : 55, + "preview_url" : "https://p.scdn.co/mp3-preview/c4b51e0193335f61306f0bd6f5868c7e801df525", + "track_number" : 1, + "type" : "track", + "uri" : "spotify:track:6wAdqKcL7uESrsekjLTKod" + } + }, { + "added_at" : "2011-09-09T19:52:25Z", + "added_by" : null, + "track" : { + "album" : { + "album_type" : "single", + "available_markets" : [ "AR", "AU", "BE", "BR", "CH", "CL", "CO", "CY", "DK", "EE", "ES", "FI", "FR", "GB", "GR", "HK", "HU", "IE", "IS", "IT", "LT", "LU", "LV", "MT", "MY", "NL", "NO", "NZ", "PH", "PT", "PY", "RO", "SI", "TW" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/48JuX7nVVKCBIZbHJG6azi" + }, + "href" : "https://api.spotify.com/v1/albums/48JuX7nVVKCBIZbHJG6azi", + "id" : "48JuX7nVVKCBIZbHJG6azi", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/7d5c94043c997d08123cdedc5f3e7729641ce84a", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/c5082b33a66bcd4a83537e07ece345a373751ab7", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/4eaa61afcc38dd30272f82f14b7f05473436b785", + "width" : 64 + } ], + "name" : "The Edge Of Glory", + "type" : "album", + "uri" : "spotify:album:48JuX7nVVKCBIZbHJG6azi" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/1HY2Jd0NmPuamShAr6KMms" + }, + "href" : "https://api.spotify.com/v1/artists/1HY2Jd0NmPuamShAr6KMms", + "id" : "1HY2Jd0NmPuamShAr6KMms", + "name" : "Lady Gaga", + "type" : "artist", + "uri" : "spotify:artist:1HY2Jd0NmPuamShAr6KMms" + } ], + "available_markets" : [ "AR", "AU", "BE", "BR", "CH", "CL", "CO", "CY", "DK", "EE", "ES", "FI", "FR", "GB", "GR", "HK", "HU", "IE", "IS", "IT", "LT", "LU", "LV", "MT", "MY", "NL", "NO", "NZ", "PH", "PT", "PY", "RO", "SI", "TW" ], + "disc_number" : 1, + "duration_ms" : 320626, + "explicit" : false, + "external_ids" : { + "isrc" : "USUM71106458" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/1VpoMzYjmoQMOflZMGTZN3" + }, + "href" : "https://api.spotify.com/v1/tracks/1VpoMzYjmoQMOflZMGTZN3", + "id" : "1VpoMzYjmoQMOflZMGTZN3", + "name" : "The Edge Of Glory", + "popularity" : 57, + "preview_url" : "https://p.scdn.co/mp3-preview/b8fa0035a66a73b3fd934c65073eaca1576ba3c0", + "track_number" : 1, + "type" : "track", + "uri" : "spotify:track:1VpoMzYjmoQMOflZMGTZN3" + } + }, { + "added_at" : "2011-12-02T09:24:16Z", + "added_by" : null, + "track" : { + "album" : { + "album_type" : "single", + "available_markets" : [ "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LT", "LU", "LV", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SG", "SI", "SK", "SV", "TR", "TW" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/49ZMLWbQzziuxH2vHUjOX9" + }, + "href" : "https://api.spotify.com/v1/albums/49ZMLWbQzziuxH2vHUjOX9", + "id" : "49ZMLWbQzziuxH2vHUjOX9", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/33e47286f2b359aee82fdb3b1cf8a509812b8432", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/8efa8470652e6b2f5adf2575d447b5809be3148a", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/a1547b43572ab7e05b9a5929ae826045b473bf38", + "width" : 64 + } ], + "name" : "Judas", + "type" : "album", + "uri" : "spotify:album:49ZMLWbQzziuxH2vHUjOX9" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/1HY2Jd0NmPuamShAr6KMms" + }, + "href" : "https://api.spotify.com/v1/artists/1HY2Jd0NmPuamShAr6KMms", + "id" : "1HY2Jd0NmPuamShAr6KMms", + "name" : "Lady Gaga", + "type" : "artist", + "uri" : "spotify:artist:1HY2Jd0NmPuamShAr6KMms" + } ], + "available_markets" : [ "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LT", "LU", "LV", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SG", "SI", "SK", "SV", "TR", "TW" ], + "disc_number" : 1, + "duration_ms" : 250053, + "explicit" : false, + "external_ids" : { + "isrc" : "USUM71104998" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/1BrydEwIuNpfeCXBjKWpAu" + }, + "href" : "https://api.spotify.com/v1/tracks/1BrydEwIuNpfeCXBjKWpAu", + "id" : "1BrydEwIuNpfeCXBjKWpAu", + "name" : "Judas", + "popularity" : 50, + "preview_url" : "https://p.scdn.co/mp3-preview/7bf43c58ccd93e9fcd28ab4849c13ba6529d1fe2", + "track_number" : 1, + "type" : "track", + "uri" : "spotify:track:1BrydEwIuNpfeCXBjKWpAu" + } + }, { + "added_at" : "2010-05-06T09:16:55Z", + "added_by" : null, + "track" : { + "album" : { + "album_type" : "single", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/1yKCNIVac6PKISJ5u6IO1T" + }, + "href" : "https://api.spotify.com/v1/albums/1yKCNIVac6PKISJ5u6IO1T", + "id" : "1yKCNIVac6PKISJ5u6IO1T", + "images" : [ { + "height" : 600, + "url" : "https://i.scdn.co/image/bae487ab75f6a199e6663a38b10cb662c95e0a7a", + "width" : 600 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/1f55ace17bf6d814b89a9638fb05dbf03bd072bf", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/774cf32f107964a86177d8504a863a7bbac676fe", + "width" : 64 + } ], + "name" : "Hot N Cold", + "type" : "album", + "uri" : "spotify:album:1yKCNIVac6PKISJ5u6IO1T" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/6jJ0s89eD6GaHleKKya26X" + }, + "href" : "https://api.spotify.com/v1/artists/6jJ0s89eD6GaHleKKya26X", + "id" : "6jJ0s89eD6GaHleKKya26X", + "name" : "Katy Perry", + "type" : "artist", + "uri" : "spotify:artist:6jJ0s89eD6GaHleKKya26X" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GR", "GT", "HK", "HN", "HU", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "disc_number" : 1, + "duration_ms" : 223226, + "explicit" : false, + "external_ids" : { + "isrc" : "USCA20802544" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/0IZM2onaTBMRTEIcc5oIi9" + }, + "href" : "https://api.spotify.com/v1/tracks/0IZM2onaTBMRTEIcc5oIi9", + "id" : "0IZM2onaTBMRTEIcc5oIi9", + "name" : "Hot N Cold", + "popularity" : 61, + "preview_url" : "https://p.scdn.co/mp3-preview/5de67261e77d6807a541d369451cbd5e028072b4", + "track_number" : 1, + "type" : "track", + "uri" : "spotify:track:0IZM2onaTBMRTEIcc5oIi9" + } + }, { + "added_at" : "2010-05-08T06:23:31Z", + "added_by" : null, + "track" : { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/7MsL9vKLZM44fxTHlosW9b" + }, + "href" : "https://api.spotify.com/v1/albums/7MsL9vKLZM44fxTHlosW9b", + "id" : "7MsL9vKLZM44fxTHlosW9b", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/8a95bb3db01f311de33568ac076adca94c12f287", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/71c12c4519ece2c7cccd33f04436cceac5a45852", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/d263e6d6e4a5e95bb6f48c7c9cc3211d6df833e5", + "width" : 64 + } ], + "name" : "Latino Disco", + "type" : "album", + "uri" : "spotify:album:7MsL9vKLZM44fxTHlosW9b" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/2HcpPno2Aejd2XpN0nDxV9" + }, + "href" : "https://api.spotify.com/v1/artists/2HcpPno2Aejd2XpN0nDxV9", + "id" : "2HcpPno2Aejd2XpN0nDxV9", + "name" : "Studio 99", + "type" : "artist", + "uri" : "spotify:artist:2HcpPno2Aejd2XpN0nDxV9" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 278058, + "explicit" : false, + "external_ids" : { + "isrc" : "USA370550563" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/6HM9UgDB38hLDFm7e1RF6W" + }, + "href" : "https://api.spotify.com/v1/tracks/6HM9UgDB38hLDFm7e1RF6W", + "id" : "6HM9UgDB38hLDFm7e1RF6W", + "name" : "Bailando", + "popularity" : 37, + "preview_url" : "https://p.scdn.co/mp3-preview/6a1791d436ed587afb091d9efb05f4589b25b08b", + "track_number" : 7, + "type" : "track", + "uri" : "spotify:track:6HM9UgDB38hLDFm7e1RF6W" + } + }, { + "added_at" : "2010-05-08T06:24:31Z", + "added_by" : null, + "track" : { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "NI", "NL", "NO", "PA", "PE", "PL", "PT", "PY", "RO", "SE", "SI", "SK", "SV", "TR", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/08gFKsqvthQiLDTilR43SI" + }, + "href" : "https://api.spotify.com/v1/albums/08gFKsqvthQiLDTilR43SI", + "id" : "08gFKsqvthQiLDTilR43SI", + "images" : [ { + "height" : 558, + "url" : "https://i.scdn.co/image/593292023494ae286bc3d48b3e64b3a520bb6dd1", + "width" : 640 + }, { + "height" : 262, + "url" : "https://i.scdn.co/image/b6983937b248111714ce55073c9e3da2e16862ef", + "width" : 300 + }, { + "height" : 56, + "url" : "https://i.scdn.co/image/f38a2b8359591634647863f944d58ed68311d26c", + "width" : 64 + } ], + "name" : "Come Get It: The Very Best Of Aaron Carter", + "type" : "album", + "uri" : "spotify:album:08gFKsqvthQiLDTilR43SI" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/5338fdSzGNOFD4cxAxDTeq" + }, + "href" : "https://api.spotify.com/v1/artists/5338fdSzGNOFD4cxAxDTeq", + "id" : "5338fdSzGNOFD4cxAxDTeq", + "name" : "Aaron Carter", + "type" : "artist", + "uri" : "spotify:artist:5338fdSzGNOFD4cxAxDTeq" + } ], + "available_markets" : [ "AD", "AR", "AT", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "NI", "NL", "NO", "PA", "PE", "PL", "PT", "PY", "RO", "SE", "SI", "SK", "SV", "TR", "UY" ], + "disc_number" : 1, + "duration_ms" : 194253, + "explicit" : false, + "external_ids" : { + "isrc" : "USJI10000281" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/2cnZuQpDprgZB7jzdmBBCK" + }, + "href" : "https://api.spotify.com/v1/tracks/2cnZuQpDprgZB7jzdmBBCK", + "id" : "2cnZuQpDprgZB7jzdmBBCK", + "name" : "I Want Candy", + "popularity" : 12, + "preview_url" : "https://p.scdn.co/mp3-preview/beb1759bd33c368b3d9a321086a16a999f095a97", + "track_number" : 5, + "type" : "track", + "uri" : "spotify:track:2cnZuQpDprgZB7jzdmBBCK" + } + }, { + "added_at" : "2010-05-14T12:51:26Z", + "added_by" : null, + "track" : { + "album" : { + "album_type" : "album", + "available_markets" : [ "AR", "AT", "AU", "BE", "BG", "BR", "CH", "CL", "CO", "CR", "CZ", "DE", "DK", "EE", "ES", "FI", "FR", "GB", "GR", "HK", "HU", "IE", "IS", "IT", "LT", "LU", "LV", "MT", "MY", "NL", "NZ", "PH", "PL", "PT", "RO", "SE", "SG", "SI", "SK", "TR", "TW" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/3vkxgQhR4QsgozSDmGoAvY" + }, + "href" : "https://api.spotify.com/v1/albums/3vkxgQhR4QsgozSDmGoAvY", + "id" : "3vkxgQhR4QsgozSDmGoAvY", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/566ee4034e25c779bb522a2297112e68bfc23b06", + "width" : 638 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/015d40395c05b2e88a65c6e96e9415327e163dea", + "width" : 299 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/a28506fbf3b80f1a94c514f20005832bbb78bf96", + "width" : 64 + } ], + "name" : "Pop Party", + "type" : "album", + "uri" : "spotify:album:3vkxgQhR4QsgozSDmGoAvY" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/6kBjAFKyd0he7LiA5GQ3Gz" + }, + "href" : "https://api.spotify.com/v1/artists/6kBjAFKyd0he7LiA5GQ3Gz", + "id" : "6kBjAFKyd0he7LiA5GQ3Gz", + "name" : "Aqua", + "type" : "artist", + "uri" : "spotify:artist:6kBjAFKyd0he7LiA5GQ3Gz" + } ], + "available_markets" : [ "AR", "AT", "AU", "BE", "BG", "BR", "CH", "CL", "CO", "CR", "CZ", "DE", "DK", "EE", "ES", "FI", "FR", "GB", "GR", "HK", "HU", "IE", "IS", "IT", "LT", "LU", "LV", "MT", "MY", "NL", "NZ", "PH", "PL", "PT", "RO", "SE", "SG", "SI", "SK", "TR", "TW" ], + "disc_number" : 1, + "duration_ms" : 194040, + "explicit" : false, + "external_ids" : { + "isrc" : "DKBKA9700403" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/7kz6GbFr2MCI7PgXJOdq8c" + }, + "href" : "https://api.spotify.com/v1/tracks/7kz6GbFr2MCI7PgXJOdq8c", + "id" : "7kz6GbFr2MCI7PgXJOdq8c", + "name" : "Barbie Girl", + "popularity" : 64, + "preview_url" : "https://p.scdn.co/mp3-preview/31c02df23f26b7ece015b96b1b6baaf8f97f0273", + "track_number" : 3, + "type" : "track", + "uri" : "spotify:track:7kz6GbFr2MCI7PgXJOdq8c" + } + }, { + "added_at" : "2011-12-15T15:02:58Z", + "added_by" : null, + "track" : { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/06SY6Ke6mXzZHhURLVU57R" + }, + "href" : "https://api.spotify.com/v1/albums/06SY6Ke6mXzZHhURLVU57R", + "id" : "06SY6Ke6mXzZHhURLVU57R", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/ce8f207440681b989f02c20129b0b627036fd71c", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/409c641ca368b7b9c589103bb9ca8a5914c640dc", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/28bab516d29947e363b6c169100f2efbad6b84e2", + "width" : 64 + } ], + "name" : "Teenage Dream", + "type" : "album", + "uri" : "spotify:album:06SY6Ke6mXzZHhURLVU57R" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/6jJ0s89eD6GaHleKKya26X" + }, + "href" : "https://api.spotify.com/v1/artists/6jJ0s89eD6GaHleKKya26X", + "id" : "6jJ0s89eD6GaHleKKya26X", + "name" : "Katy Perry", + "type" : "artist", + "uri" : "spotify:artist:6jJ0s89eD6GaHleKKya26X" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "disc_number" : 1, + "duration_ms" : 230733, + "explicit" : false, + "external_ids" : { + "isrc" : "USCA21001264" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/3oHNJECGN3bBoGXejlw2b1" + }, + "href" : "https://api.spotify.com/v1/tracks/3oHNJECGN3bBoGXejlw2b1", + "id" : "3oHNJECGN3bBoGXejlw2b1", + "name" : "Last Friday Night (T.G.I.F.)", + "popularity" : 62, + "preview_url" : "https://p.scdn.co/mp3-preview/6b419ceb20e3ca3ea800832b1ab3010d744b2c26", + "track_number" : 2, + "type" : "track", + "uri" : "spotify:track:3oHNJECGN3bBoGXejlw2b1" + } + }, { + "added_at" : "2012-06-26T18:53:34Z", + "added_by" : null, + "track" : { + "album" : { + "album_type" : "single", + "available_markets" : [ ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/2zjaqU3EvxkxbYObOJOWPc" + }, + "href" : "https://api.spotify.com/v1/albums/2zjaqU3EvxkxbYObOJOWPc", + "id" : "2zjaqU3EvxkxbYObOJOWPc", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/7a5ea8d84dfd79d66ed3b771f0fa27d95e77f8c6", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/f1c2fdb993cfeafe149ad1d8c81290c85b175076", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/b9867d389ff8158f3b6d4963064e84738ec3db04", + "width" : 64 + } ], + "name" : "Get Free", + "type" : "album", + "uri" : "spotify:album:2zjaqU3EvxkxbYObOJOWPc" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/738wLrAtLtCtFOLvQBXOXp" + }, + "href" : "https://api.spotify.com/v1/artists/738wLrAtLtCtFOLvQBXOXp", + "id" : "738wLrAtLtCtFOLvQBXOXp", + "name" : "Major Lazer", + "type" : "artist", + "uri" : "spotify:artist:738wLrAtLtCtFOLvQBXOXp" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/50n0lOYeD5omHicMWhTJ4W" + }, + "href" : "https://api.spotify.com/v1/artists/50n0lOYeD5omHicMWhTJ4W", + "id" : "50n0lOYeD5omHicMWhTJ4W", + "name" : "Amber of the Dirty Projectors", + "type" : "artist", + "uri" : "spotify:artist:50n0lOYeD5omHicMWhTJ4W" + } ], + "available_markets" : [ ], + "disc_number" : 1, + "duration_ms" : 223299, + "explicit" : false, + "external_ids" : { + "isrc" : "USCJ81200812" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/1H5vt0uSkg4Pz2aLgTFs14" + }, + "href" : "https://api.spotify.com/v1/tracks/1H5vt0uSkg4Pz2aLgTFs14", + "id" : "1H5vt0uSkg4Pz2aLgTFs14", + "name" : "Get Free - Bonde Do Role Remix", + "popularity" : 0, + "preview_url" : "https://p.scdn.co/mp3-preview/25503f61c5d0527aa6428f648906e2f8d3f72a64", + "track_number" : 2, + "type" : "track", + "uri" : "spotify:track:1H5vt0uSkg4Pz2aLgTFs14" + } + }, { + "added_at" : "2013-06-03T18:00:50Z", + "added_by" : { + "external_urls" : { + "spotify" : "http://open.spotify.com/user/mcgurk" + }, + "href" : "https://api.spotify.com/v1/users/mcgurk", + "id" : "mcgurk", + "type" : "user", + "uri" : "spotify:user:mcgurk" + }, + "track" : { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/2Sscsd9Fo1Fa4VZC26k5jl" + }, + "href" : "https://api.spotify.com/v1/albums/2Sscsd9Fo1Fa4VZC26k5jl", + "id" : "2Sscsd9Fo1Fa4VZC26k5jl", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/155cc4ef02624c248644651bfe3c0c67339aa35e", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/79c0b56d99777ff45adda02a492b7be1001049ee", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/08c6f092971d2e57a99b76eac230aaf95e976a62", + "width" : 64 + } ], + "name" : "The Safety Dance – The Collection", + "type" : "album", + "uri" : "spotify:album:2Sscsd9Fo1Fa4VZC26k5jl" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/34PLzyi7CdXUekiLHYyqXq" + }, + "href" : "https://api.spotify.com/v1/artists/34PLzyi7CdXUekiLHYyqXq", + "id" : "34PLzyi7CdXUekiLHYyqXq", + "name" : "Men Without Hats", + "type" : "artist", + "uri" : "spotify:artist:34PLzyi7CdXUekiLHYyqXq" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "UY" ], + "disc_number" : 1, + "duration_ms" : 164866, + "explicit" : false, + "external_ids" : { + "isrc" : "GBBLG0200043" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/7eEfbAG7wgV4AgkdTakVFT" + }, + "href" : "https://api.spotify.com/v1/tracks/7eEfbAG7wgV4AgkdTakVFT", + "id" : "7eEfbAG7wgV4AgkdTakVFT", + "name" : "The Safety Dance", + "popularity" : 42, + "preview_url" : "https://p.scdn.co/mp3-preview/05676ec46121522e9f0fc658c9d43ed924a6e65c", + "track_number" : 1, + "type" : "track", + "uri" : "spotify:track:7eEfbAG7wgV4AgkdTakVFT" + } + }, { + "added_at" : "2013-12-24T23:52:57Z", + "added_by" : { + "external_urls" : { + "spotify" : "http://open.spotify.com/user/mcgurk" + }, + "href" : "https://api.spotify.com/v1/users/mcgurk", + "id" : "mcgurk", + "type" : "user", + "uri" : "spotify:user:mcgurk" + }, + "track" : { + "album" : { + "album_type" : "single", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/7nvaG92AQuoXY8uWJDMpXW" + }, + "href" : "https://api.spotify.com/v1/albums/7nvaG92AQuoXY8uWJDMpXW", + "id" : "7nvaG92AQuoXY8uWJDMpXW", + "images" : [ { + "height" : 640, + "url" : "https://i.scdn.co/image/42826eb468e063e241212770a870d8599cc75d59", + "width" : 640 + }, { + "height" : 300, + "url" : "https://i.scdn.co/image/12f05f4aad5e40624162c5a27616709172153760", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/e5f79913e60b158757ed1a197231a41612eb32cc", + "width" : 64 + } ], + "name" : "Perfect (Exceeder)", + "type" : "album", + "uri" : "spotify:album:7nvaG92AQuoXY8uWJDMpXW" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/307erl4VjT1dZDMYpneZqd" + }, + "href" : "https://api.spotify.com/v1/artists/307erl4VjT1dZDMYpneZqd", + "id" : "307erl4VjT1dZDMYpneZqd", + "name" : "Mason", + "type" : "artist", + "uri" : "spotify:artist:307erl4VjT1dZDMYpneZqd" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/7JQn9DfFTtsFTg2dFc75jM" + }, + "href" : "https://api.spotify.com/v1/artists/7JQn9DfFTtsFTg2dFc75jM", + "id" : "7JQn9DfFTtsFTg2dFc75jM", + "name" : "Princess Superstar", + "type" : "artist", + "uri" : "spotify:artist:7JQn9DfFTtsFTg2dFc75jM" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 161250, + "explicit" : false, + "external_ids" : { + "isrc" : "NLF711312388" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/2nyBqOKARcKxrJaPyXRNx3" + }, + "href" : "https://api.spotify.com/v1/tracks/2nyBqOKARcKxrJaPyXRNx3", + "id" : "2nyBqOKARcKxrJaPyXRNx3", + "name" : "Perfect (Exceeder) - Radio Edit", + "popularity" : 46, + "preview_url" : "https://p.scdn.co/mp3-preview/b7c76d0b50d90e50f3d1cdfb4f8df91ebfe55848", + "track_number" : 1, + "type" : "track", + "uri" : "spotify:track:2nyBqOKARcKxrJaPyXRNx3" + } + } ], + "limit" : 100, + "next" : null, + "offset" : 0, + "previous" : null, + "total" : 17 + }, + "type" : "playlist", + "uri" : "spotify:user:mcgurk:playlist:0UZ0Ll4HJHR7yvURYbHJe9" +} diff --git a/vendor/jwilsson/spotify-web-api-php/tests/fixtures/user-playlists.json b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/user-playlists.json new file mode 100644 index 0000000..0114e2a --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/user-playlists.json @@ -0,0 +1,134 @@ +{ + "href" : "https://api.spotify.com/v1/users/mcgurk/playlists?offset=0&limit=5", + "items" : [ { + "collaborative" : false, + "external_urls" : { + "spotify" : "http://open.spotify.com/user/mcgurk/playlist/4YOPp7RlelOVGJ1d4CZBqW" + }, + "href" : "https://api.spotify.com/v1/users/mcgurk/playlists/4YOPp7RlelOVGJ1d4CZBqW", + "id" : "4YOPp7RlelOVGJ1d4CZBqW", + "images" : [ ], + "name" : "Soft chill", + "owner" : { + "external_urls" : { + "spotify" : "http://open.spotify.com/user/mcgurk" + }, + "href" : "https://api.spotify.com/v1/users/mcgurk", + "id" : "mcgurk", + "type" : "user", + "uri" : "spotify:user:mcgurk" + }, + "public" : false, + "tracks" : { + "href" : "https://api.spotify.com/v1/users/mcgurk/playlists/4YOPp7RlelOVGJ1d4CZBqW/tracks", + "total" : 7 + }, + "type" : "playlist", + "uri" : "spotify:user:mcgurk:playlist:4YOPp7RlelOVGJ1d4CZBqW" + }, { + "collaborative" : false, + "external_urls" : { + "spotify" : "http://open.spotify.com/user/mcgurk/playlist/2zNRHPRBynwGI2qIZZ2EGp" + }, + "href" : "https://api.spotify.com/v1/users/mcgurk/playlists/2zNRHPRBynwGI2qIZZ2EGp", + "id" : "2zNRHPRBynwGI2qIZZ2EGp", + "images" : [ ], + "name" : "Liked from Radio", + "owner" : { + "external_urls" : { + "spotify" : "http://open.spotify.com/user/mcgurk" + }, + "href" : "https://api.spotify.com/v1/users/mcgurk", + "id" : "mcgurk", + "type" : "user", + "uri" : "spotify:user:mcgurk" + }, + "public" : false, + "tracks" : { + "href" : "https://api.spotify.com/v1/users/mcgurk/playlists/2zNRHPRBynwGI2qIZZ2EGp/tracks", + "total" : 66 + }, + "type" : "playlist", + "uri" : "spotify:user:mcgurk:playlist:2zNRHPRBynwGI2qIZZ2EGp" + }, { + "collaborative" : false, + "external_urls" : { + "spotify" : "http://open.spotify.com/user/mcgurk/playlist/0CQyRJcgAUtu3HXedHTukP" + }, + "href" : "https://api.spotify.com/v1/users/mcgurk/playlists/0CQyRJcgAUtu3HXedHTukP", + "id" : "0CQyRJcgAUtu3HXedHTukP", + "images" : [ ], + "name" : "Musica", + "owner" : { + "external_urls" : { + "spotify" : "http://open.spotify.com/user/mcgurk" + }, + "href" : "https://api.spotify.com/v1/users/mcgurk", + "id" : "mcgurk", + "type" : "user", + "uri" : "spotify:user:mcgurk" + }, + "public" : false, + "tracks" : { + "href" : "https://api.spotify.com/v1/users/mcgurk/playlists/0CQyRJcgAUtu3HXedHTukP/tracks", + "total" : 774 + }, + "type" : "playlist", + "uri" : "spotify:user:mcgurk:playlist:0CQyRJcgAUtu3HXedHTukP" + }, { + "collaborative" : false, + "external_urls" : { + "spotify" : "http://open.spotify.com/user/mcgurk/playlist/0dWICxwZcXNTxavch2ViJl" + }, + "href" : "https://api.spotify.com/v1/users/mcgurk/playlists/0dWICxwZcXNTxavch2ViJl", + "id" : "0dWICxwZcXNTxavch2ViJl", + "images" : [ ], + "name" : "Mmmh marabou", + "owner" : { + "external_urls" : { + "spotify" : "http://open.spotify.com/user/mcgurk" + }, + "href" : "https://api.spotify.com/v1/users/mcgurk", + "id" : "mcgurk", + "type" : "user", + "uri" : "spotify:user:mcgurk" + }, + "public" : false, + "tracks" : { + "href" : "https://api.spotify.com/v1/users/mcgurk/playlists/0dWICxwZcXNTxavch2ViJl/tracks", + "total" : 58 + }, + "type" : "playlist", + "uri" : "spotify:user:mcgurk:playlist:0dWICxwZcXNTxavch2ViJl" + }, { + "collaborative" : false, + "external_urls" : { + "spotify" : "http://open.spotify.com/user/mcgurk/playlist/1f1zO9SrQXk9X0bY59HS5r" + }, + "href" : "https://api.spotify.com/v1/users/mcgurk/playlists/1f1zO9SrQXk9X0bY59HS5r", + "id" : "1f1zO9SrQXk9X0bY59HS5r", + "images" : [ ], + "name" : "Mys", + "owner" : { + "external_urls" : { + "spotify" : "http://open.spotify.com/user/mcgurk" + }, + "href" : "https://api.spotify.com/v1/users/mcgurk", + "id" : "mcgurk", + "type" : "user", + "uri" : "spotify:user:mcgurk" + }, + "public" : false, + "tracks" : { + "href" : "https://api.spotify.com/v1/users/mcgurk/playlists/1f1zO9SrQXk9X0bY59HS5r/tracks", + "total" : 4 + }, + "type" : "playlist", + "uri" : "spotify:user:mcgurk:playlist:1f1zO9SrQXk9X0bY59HS5r" + } ], + "limit" : 5, + "next" : "https://api.spotify.com/v1/users/mcgurk/playlists?offset=5&limit=5", + "offset" : 0, + "previous" : null, + "total" : 8 +} diff --git a/vendor/jwilsson/spotify-web-api-php/tests/fixtures/user-tracks-contain.json b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/user-tracks-contain.json new file mode 100644 index 0000000..29513c4 --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/user-tracks-contain.json @@ -0,0 +1 @@ +[true] diff --git a/vendor/jwilsson/spotify-web-api-php/tests/fixtures/user-tracks-contains.json b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/user-tracks-contains.json new file mode 100644 index 0000000..ae6199a --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/user-tracks-contains.json @@ -0,0 +1 @@ +[true, true] diff --git a/vendor/jwilsson/spotify-web-api-php/tests/fixtures/user-tracks.json b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/user-tracks.json new file mode 100644 index 0000000..3e8bd90 --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/user-tracks.json @@ -0,0 +1,141 @@ +{ + "href" : "https://api.spotify.com/v1/me/tracks?offset=0&limit=5", + "items" : [ { + "added_at" : "2014-10-26T14:22:34Z", + "track" : { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/4m2880jivSbbyEGAKfITCa" + }, + "href" : "https://api.spotify.com/v1/albums/4m2880jivSbbyEGAKfITCa", + "id" : "4m2880jivSbbyEGAKfITCa", + "images" : [ { + "height" : 636, + "url" : "https://i.scdn.co/image/6710552422788861893233437ad9f0830b95c07c", + "width" : 640 + }, { + "height" : 298, + "url" : "https://i.scdn.co/image/4df66c8b705efa6dd3be4e884fe2ca8779fd4fc9", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/a3d945a1c9de931ed6eeb3dbca90579f6a6388c8", + "width" : 64 + } ], + "name" : "Random Access Memories", + "type" : "album", + "uri" : "spotify:album:4m2880jivSbbyEGAKfITCa" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/4tZwfgrHOc3mvqYlEYSvVi" + }, + "href" : "https://api.spotify.com/v1/artists/4tZwfgrHOc3mvqYlEYSvVi", + "id" : "4tZwfgrHOc3mvqYlEYSvVi", + "name" : "Daft Punk", + "type" : "artist", + "uri" : "spotify:artist:4tZwfgrHOc3mvqYlEYSvVi" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 544626, + "explicit" : false, + "external_ids" : { + "isrc" : "USQX91300103" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/0oks4FnzhNp5QPTZtoet7c" + }, + "href" : "https://api.spotify.com/v1/tracks/0oks4FnzhNp5QPTZtoet7c", + "id" : "0oks4FnzhNp5QPTZtoet7c", + "name" : "Giorgio by Moroder", + "popularity" : 68, + "preview_url" : "https://p.scdn.co/mp3-preview/9f30c1ab377fab3d5fba3c376ce32174f70d5546", + "track_number" : 3, + "type" : "track", + "uri" : "spotify:track:0oks4FnzhNp5QPTZtoet7c" + } + }, { + "added_at" : "2014-10-26T14:22:29Z", + "track" : { + "album" : { + "album_type" : "album", + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "external_urls" : { + "spotify" : "https://open.spotify.com/album/4m2880jivSbbyEGAKfITCa" + }, + "href" : "https://api.spotify.com/v1/albums/4m2880jivSbbyEGAKfITCa", + "id" : "4m2880jivSbbyEGAKfITCa", + "images" : [ { + "height" : 636, + "url" : "https://i.scdn.co/image/6710552422788861893233437ad9f0830b95c07c", + "width" : 640 + }, { + "height" : 298, + "url" : "https://i.scdn.co/image/4df66c8b705efa6dd3be4e884fe2ca8779fd4fc9", + "width" : 300 + }, { + "height" : 64, + "url" : "https://i.scdn.co/image/a3d945a1c9de931ed6eeb3dbca90579f6a6388c8", + "width" : 64 + } ], + "name" : "Random Access Memories", + "type" : "album", + "uri" : "spotify:album:4m2880jivSbbyEGAKfITCa" + }, + "artists" : [ { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/4tZwfgrHOc3mvqYlEYSvVi" + }, + "href" : "https://api.spotify.com/v1/artists/4tZwfgrHOc3mvqYlEYSvVi", + "id" : "4tZwfgrHOc3mvqYlEYSvVi", + "name" : "Daft Punk", + "type" : "artist", + "uri" : "spotify:artist:4tZwfgrHOc3mvqYlEYSvVi" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/2RdwBSPQiwcmiDo9kixcl8" + }, + "href" : "https://api.spotify.com/v1/artists/2RdwBSPQiwcmiDo9kixcl8", + "id" : "2RdwBSPQiwcmiDo9kixcl8", + "name" : "Pharrell Williams", + "type" : "artist", + "uri" : "spotify:artist:2RdwBSPQiwcmiDo9kixcl8" + }, { + "external_urls" : { + "spotify" : "https://open.spotify.com/artist/3yDIp0kaq9EFKe07X1X2rz" + }, + "href" : "https://api.spotify.com/v1/artists/3yDIp0kaq9EFKe07X1X2rz", + "id" : "3yDIp0kaq9EFKe07X1X2rz", + "name" : "Nile Rodgers", + "type" : "artist", + "uri" : "spotify:artist:3yDIp0kaq9EFKe07X1X2rz" + } ], + "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], + "disc_number" : 1, + "duration_ms" : 369626, + "explicit" : false, + "external_ids" : { + "isrc" : "USQX91300108" + }, + "external_urls" : { + "spotify" : "https://open.spotify.com/track/69kOkLUCkxIZYexIgSG8rq" + }, + "href" : "https://api.spotify.com/v1/tracks/69kOkLUCkxIZYexIgSG8rq", + "id" : "69kOkLUCkxIZYexIgSG8rq", + "name" : "Get Lucky", + "popularity" : 78, + "preview_url" : "https://p.scdn.co/mp3-preview/31208a018b7ab55969b945200901b7ef371c3a72", + "track_number" : 8, + "type" : "track", + "uri" : "spotify:track:69kOkLUCkxIZYexIgSG8rq" + } + } ], + "limit" : 5, + "next" : null, + "offset" : 0, + "previous" : null, + "total" : 2 +} diff --git a/vendor/jwilsson/spotify-web-api-php/tests/fixtures/user.json b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/user.json new file mode 100644 index 0000000..231a445 --- /dev/null +++ b/vendor/jwilsson/spotify-web-api-php/tests/fixtures/user.json @@ -0,0 +1,15 @@ +{ + "display_name" : null, + "external_urls" : { + "spotify" : "https://open.spotify.com/user/mcgurk" + }, + "followers" : { + "href" : null, + "total" : 1 + }, + "href" : "https://api.spotify.com/v1/users/mcgurk", + "id" : "mcgurk", + "images" : [ ], + "type" : "user", + "uri" : "spotify:user:mcgurk" +}