diff --git a/CHANGELOG.md b/CHANGELOG.md index 1404ea4..91355ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # 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 + ## v0.12 ## - Added: compatiblity with Alfred Remote diff --git a/README.md b/README.md index c4c6b59..52a17c0 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ 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) 1. [Download](https://github.com/citelao/Spotify-for-Alfred/archive/master.zip) this repository. @@ -90,6 +90,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. @@ -106,6 +107,7 @@ Oh, and thanks for reading this whole README. I hope you enjoy Spotifious! See `CHANGELOG.md` for more detailed information. +- v0.13: Preliminary Web API; toggle track notifications - v0.12: Compatible with Alfred Remote - v0.11.2: Location opt-out and tutorial - v0.11.1: Fixed response freezing 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..f79d66c --- /dev/null +++ b/callback.php @@ -0,0 +1,40 @@ +options('spotify_client_id'), $alfred->options('spotify_secret'), 'http://localhost:11114/callback.php'); + +// Request a access token using the code from Spotify +$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()); + +?> + + + Spotifious Setup + + + + + + +
+
+

Spotifious should be setup :)

+

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

+ +

(enjoy)

+
+
+ \ No newline at end of file diff --git a/composer.json b/composer.json index 5a0d8a4..ce9f558 100644 --- a/composer.json +++ b/composer.json @@ -4,5 +4,8 @@ "OhAlfred\\": "src/citelao/OhAlfred/", "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/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/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/setup/client_submit.php b/include/setup/client_submit.php new file mode 100644 index 0000000..4335964 --- /dev/null +++ b/include/setup/client_submit.php @@ -0,0 +1,87 @@ + + + + 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', ''); + +$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..fcf31eb --- /dev/null +++ b/include/setup/link.php @@ -0,0 +1,22 @@ +options('spotify_client_id'), $alfred->options('spotify_secret'), 'http://localhost:11114/callback.php'); + +$scopes = array( + 'playlist-read-private', + 'user-read-private' +); + +$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..ec168a4 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,13 +193,13 @@ keyword spotifious queuedelaycustom - 1 + 3 queuedelayimmediatelyinitially - + queuedelaymode - 0 - queuemode 1 + queuemode + 2 runningsubtext Getting Spotifious data... script @@ -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. @@ -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/spotifious.sublime-project b/spotifious.sublime-project index 24db303..7cc9479 100644 --- a/spotifious.sublime-project +++ b/spotifious.sublime-project @@ -2,7 +2,7 @@ "folders": [ { - "path": "." + "path": "/Users/citelao/Dropbox/Alfred/Alfred.alfredpreferences/workflows/spotifious" } ] } diff --git a/spotifious.sublime-workspace b/spotifious.sublime-workspace new file mode 100644 index 0000000..7ab0892 --- /dev/null +++ b/spotifious.sublime-workspace @@ -0,0 +1,1552 @@ +{ + "auto_complete": + { + "selected_items": + [ + [ + "content", + "content_scripts" + ], + [ + "outpu", + "outputId" + ], + [ + "output", + "outputElement" + ], + [ + "curre", + "currentPotential" + ], + [ + "conte", + "contextPotentials" + ], + [ + "getIn", + "getInheritedRules" + ], + [ + "cont", + "contentBefore" + ], + [ + "contentAnce", + "contentAncestorBefore" + ], + [ + "buildCon", + "buildContentBefore" + ], + [ + "contentAnces", + "contentAncestorAfter" + ], + [ + "buildConte", + "buildContentAfter" + ], + [ + "getInher", + "getInheritedBeforeParents" + ], + [ + "context", + "contextPotentials" + ], + [ + "for", + "for for (…) {…} (Improved Native For-Loop)" + ], + [ + "after", + "aftersElement" + ], + [ + "old", + "oldParents" + ], + [ + "getInhe", + "getInheritedBeforeRules" + ], + [ + "before", + "beforeRules" + ], + [ + "befor", + "beforesString" + ], + [ + "afters", + "aftersString" + ], + [ + "bef", + "beforesString" + ], + [ + "inher", + "inheriteds" + ], + [ + "chil", + "children" + ], + [ + "parent", + "parentLocations" + ], + [ + "pare", + "parentRules" + ], + [ + "inh", + "inheriteds" + ], + [ + "error", + "errorElement" + ], + [ + "erro", + "errorElement" + ], + [ + "audio", + "audioElement" + ], + [ + "focus", + "focussed_parent" + ], + [ + "paren", + "parentNode" + ], + [ + "matched", + "matchedContext" + ], + [ + "matc", + "matchedContext" + ], + [ + "getma", + "getMatchedContextNumber" + ], + [ + "getm", + "getMatchedContext" + ], + [ + "matche", + "matchedRule" + ], + [ + "getCell", + "getCellRow" + ], + [ + "col", + "column" + ], + [ + "getce", + "getCellColumn" + ], + [ + "header", + "headerRow" + ], + [ + "conten", + "content_before" + ], + [ + "rule", + "ruleSet" + ], + [ + "rul", + "ruleSet" + ], + [ + "split", + "splitRule" + ], + [ + "prefix", + "_prefix_usable" + ], + [ + "inhe", + "inheritedRule" + ], + [ + "getCe", + "getCells" + ], + [ + "match", + "matchedLocation" + ], + [ + "last", + "lastChild" + ], + [ + "add", + "addClasses" + ], + [ + "is", + "isPositional" + ], + [ + "tab", + "tabbable2" + ], + [ + "forced", + "forcedTabbable" + ], + [ + "tabbable", + "tabbable" + ], + [ + "tabba", + "tabbable" + ], + [ + "matchedRu", + "matchedRuleNumber" + ], + [ + "injec", + "injectClasses" + ], + [ + "ele", + "element" + ], + [ + "inje", + "injectClasses" + ], + [ + "matchedR", + "matchedRuleNumber" + ], + [ + "getElem", + "getElementTable" + ], + [ + "sibl", + "siblingTable" + ], + [ + "elem", + "elementTable" + ], + [ + "sib", + "siblingCell" + ], + [ + "find", + "findHierarchicNeighbor" + ], + [ + "getTabl", + "getTableWidth" + ], + [ + "eleme", + "elementCell" + ], + [ + "siblin", + "siblingCell" + ], + [ + "nei", + "neighborParent" + ], + [ + "newn", + "newNeighbor" + ], + [ + "neig", + "neighbor" + ], + [ + "neigh", + "neighborParent" + ], + [ + "n", + "newNeighbor" + ], + [ + "newne", + "newNeighborParent" + ], + [ + "en", + "entabler" + ], + [ + "ista", + "isTableCell" + ], + [ + "getp", + "getParent" + ], + [ + "getR", + "getRule" + ], + [ + "get", + "getMatchedRuleNumber" + ], + [ + "stop", + "stopCallback" + ], + [ + "mat", + "matches" + ], + [ + "app", + "appendChild" + ], + [ + "lagger", + "laggerNode" + ], + [ + "la", + "laggerNode" + ], + [ + "current", + "currentNode" + ], + [ + "curren", + "currentNode" + ], + [ + "childn", + "childNodes" + ], + [ + "end", + "endNode" + ], + [ + "p", + "p Tag" + ], + [ + "bac", + "background" + ], + [ + "forc", + "forcedTabbable" + ], + [ + "selec", + "selector" + ], + [ + "child", + "childNodesLength" + ], + [ + "fore", + "forcedTabbable" + ], + [ + "class", + "classList" + ], + [ + "children", + "childrenLength" + ], + [ + "inject", + "injectTabbableClasses" + ], + [ + "ta", + "tabbable" + ], + [ + "spe", + "specificity" + ], + [ + "rules", + "rulesFile" + ], + [ + "loca", + "localRules" + ], + [ + "lo", + "log" + ], + [ + "fin", + "findNeighbor" + ], + [ + "fu", + "function" + ], + [ + "node", + "nodeType" + ], + [ + "con", + "console" + ], + [ + "chilren", + "childrenLength" + ], + [ + "inj", + "injectClassesAtLevel" + ], + [ + "isTab", + "isTableCell" + ], + [ + "isTa", + "isTableRow" + ], + [ + "getC", + "getCell" + ], + [ + "getCel", + "getCellX" + ], + [ + "quni", + "QUnit" + ], + [ + "regi", + "registerFocusChangeListener" + ], + [ + "gete", + "getElementsByClassName" + ], + [ + "input", + "inputMessage" + ], + [ + "price", + "priceForCrate" + ], + [ + "Input", + "inputMessage" + ], + [ + "pric", + "priceForKey" + ], + [ + "rep", + "respond" + ], + [ + "el", + "element" + ], + [ + "pre", + "previousSibling" + ], + [ + "Ta", + "TabbableElementList" + ], + [ + "entabl", + "entablerUtil" + ], + [ + "text", + "textContent" + ], + [ + "clas", + "classList" + ], + [ + "ne", + "newNeighbor" + ], + [ + "cla", + "classList" + ] + ] + }, + "buffers": + [ + { + "file": "composer.json", + "settings": + { + "buffer_size": 193, + "line_ending": "Unix" + } + } + ], + "build_system": "", + "command_palette": + { + "height": 400.0, + "selected_items": + [ + [ + "rein", + "Indentation: Reindent Lines" + ], + [ + "rei", + "Indentation: Reindent Lines" + ], + [ + "re", + "Indentation: Reindent Lines" + ], + [ + "reinde", + "Indentation: Reindent Lines" + ], + [ + "set sy: js", + "Set Syntax: JavaScript" + ], + [ + "p", + "Package Control: List Packages" + ], + [ + "syntax co", + "Set Syntax: CoffeeScript" + ], + [ + "instal", + "Package Control: Install Package" + ], + [ + "package", + "Package Control: Remove Package" + ], + [ + "coffee", + "Format: CoffeeScript" + ], + [ + "ssht", + "Set Syntax: HTML" + ], + [ + "jshi", + "JSHint: Set Plugin Options" + ], + [ + "jsh", + "JSHint: Set Linting Preferences" + ], + [ + "js", + "JSHint" + ], + [ + "packa", + "Package Control: Install Package" + ], + [ + "save", + "Project: Save As" + ], + [ + "indent", + "Indentation: Reindent Lines" + ], + [ + "tab", + "Indentation: Convert to Tabs" + ], + [ + "tabs", + "Indentation: Convert to Tabs" + ], + [ + "status", + "View: Toggle Status Bar" + ], + [ + "view", + "View: Toggle Status Bar" + ], + [ + "install", + "Package Control: Install Package" + ], + [ + "lint", + "SublimeLinter: Background Linting" + ], + [ + "ruby", + "Set Syntax: Ruby" + ] + ], + "width": 610.0 + }, + "console": + { + "height": 0.0 + }, + "distraction_free": + { + "menu_visible": true, + "show_minimap": false, + "show_open_files": false, + "show_tabs": false, + "side_bar_visible": false, + "status_bar_visible": false + }, + "file_history": + [ + "/Users/citelao/Projects/Accessible Tables/speaker/content_script.js", + "/Users/citelao/Projects/Accessible Tables/content_script.js", + "/Users/citelao/Projects/Accessible Tables/js/phenidate/rules/rules.json", + "/Users/citelao/Projects/Accessible Tables/js/phenidate/phenidate.dom.js", + "/Users/citelao/Projects/Accessible Tables/js/phenidate/phenidate.builder.js", + "/Users/citelao/Projects/Accessible Tables/table.htm", + "/Users/citelao/Projects/Accessible Tables/example.htm", + "/Users/citelao/Projects/Accessible Tables/largeTest.htm", + "/Users/citelao/Projects/Accessible Tables/largeTable.htm", + "/Users/citelao/Projects/Accessible Tables/js/phenidate/phenidate.focus.js", + "/Users/citelao/Projects/Accessible Tables/js/entabler/entabler.js", + "/Users/citelao/Projects/Accessible Tables/speaker/manifest.json", + "/Users/citelao/Projects/Accessible Tables/manifest.json", + "/Users/citelao/Projects/Accessible Tables/index.htm", + "/Users/citelao/Projects/Accessible Tables/js/phenidate/phenidate.js", + "/Users/citelao/Projects/Accessible Tables/manyElements.htm", + "/Users/citelao/Projects/Accessible Tables/pcgamer.htm", + "/Users/citelao/Projects/Accessible Tables/whitehouse.htm", + "/Users/citelao/Projects/Accessible Tables/test.htm", + "/Users/citelao/Projects/Accessible Tables/zen.htm", + "/Users/citelao/Projects/Accessible Tables/js/phenidate/phenidate.rules.js", + "/Users/citelao/Projects/Accessible Tables/doc/RULES", + "/Users/citelao/Projects/Accessible Tables/speaker/background.js", + "/Users/citelao/Projects/Accessible Tables/js/phenidate/test/phenidate.test.focus.js", + "/Users/citelao/Projects/Accessible Tables/js/phenidate/phenidate.navigator.js", + "/Users/citelao/Projects/Accessible Tables/doc/spec.md", + "/Users/citelao/Documents/School/441 Algorithms/HW4.md", + "/Users/citelao/Dropbox/Resume/style.css", + "/Users/citelao/Dropbox/Resume/work_resume.htm", + "/Users/citelao/Dropbox/Interim Note-Changes", + "/Users/citelao/Projects/Accessible Tables/# 441 — HW4", + "/Users/citelao/Projects/- Wash U/Arduino/README.md", + "/Users/citelao/Projects/Accessible Tables/math.htm", + "/Users/citelao/Projects/Accessible Tables/js/entabler/util.js", + "/Users/citelao/Projects/Accessible Tables/js/app.js", + "/Users/citelao/Projects/yum-lemonade/settings.csv", + "/Users/citelao/Projects/Accessible Tables/js/phenidate/rules/rules.min.json", + "/Users/citelao/Projects/Accessible Tables/js/phenidate/test/phenidate.test.js", + "/Users/citelao/Projects/Accessible Tables/speaker/options.html", + "/Users/citelao/Projects/Accessible Tables/README.md", + "/Users/citelao/Dropbox/Alfred/Alfred.alfredpreferences/workflows/spotifious/composer.json", + "/Users/citelao/Downloads/DC_MasterFile_912110.mvl", + "/Users/citelao/Documents/School/Animation/another head.mud", + "/Users/citelao/Projects/Accessible Tables/lib/mousetrap.min.js", + "/Users/citelao/Projects/133/Papers/why no threading.md", + "/Users/citelao/Projects/133/Papers/why no gui.md", + "/Users/citelao/Downloads/mace-code-v1_11_2/Mace/Code/Make/Buildings.cs", + "/Users/citelao/Projects/Accessible Tables/js/phenidate/build.sh", + "/Users/citelao/Projects/Accessible Tables/js/phenidate/phenidate.nav.js", + "/Users/citelao/Projects/Accessible Tables/css/style.css", + "/Users/citelao/Projects/Accessible Tables/test/customCSS.htm", + "/Users/citelao/Projects/Accessible Tables/css/high-contrast.css", + "/Users/citelao/Library/Application Support/Sublime Text 2/Packages/User/Preferences.sublime-settings", + "/Users/citelao/Library/Application Support/Übersicht/widgets/clock.coffee", + "/Users/citelao/Library/Application Support/Übersicht/widgets/getting-started.coffee", + "/Users/citelao/Projects/Accessible Tables/doc/TODO", + "/Users/citelao/Projects/Accessible Tables/html/pcgamer.htm", + "/Users/citelao/Projects/Accessible Tables/htmls/pcgamer.htm", + "/Users/citelao/Projects/Accessible Tables/css/debug.css", + "/Users/citelao/Projects/Accessible Tables/js/phenidate/rules/main.json", + "/Users/citelao/Projects/Accessible Tables/build.sh", + "/Users/citelao/Projects/yum-lemonade/export.xml", + "/Users/citelao/Projects/yum-lemonade/lib/shell/run.command", + "/Users/citelao/Projects/Accessible Tables/js/phenidate/rules/table.json", + "/Users/citelao/Projects/Accessible Tables/js/test.js", + "/Users/citelao/Projects/Accessible Tables/js/phenidate/test/phenidate.test.nav.js", + "/Users/citelao/Projects/Accessible Tables/lib/qunit.js", + "/Users/citelao/Library/Application Support/Sublime Text 2/Packages/JSHint Gutter/JSHint.sublime-settings", + "/Users/citelao/Library/Application Support/Sublime Text 2/Packages/JSHint Gutter/.jshintrc", + "/Users/citelao/Projects/Accessible Tables/accessible-tables.sublime-project", + "/Users/citelao/Projects/Accessible Tables/accessible-tables.sublime-workspace", + "/Users/citelao/Projects/- GT/Fantasy_Football/trunk/speak_tables/content_script.js", + "/Users/citelao/Projects/Accessible Tables/speaker/tabs.js", + "/Users/citelao/Projects/Emergent/engine.rb", + "/Users/citelao/Projects/Emergent/engine_spec.rb", + "/Users/citelao/Projects/Emergent/main.rb", + "/Users/citelao/Projects/Emergent/Gemfile", + "/Users/citelao/Desktop/marytts-master/download/marytts-components.xml", + "/Users/citelao/Projects/yum-lemonade/pom.xml", + "/Users/citelao/Projects/Accessible Tables/js/entabler.main.js", + "/Users/citelao/Projects/Accessible Tables/package.json", + "/Users/citelao/Projects/Accessible Tables/test/buster.js", + "/Users/citelao/Projects/Accessible Tables/test/entabler.navigation.test.js", + "/Users/citelao/Projects/Accessible Tables/spec/EntablerNavigationSpec.js", + "/Users/citelao/Projects/Accessible Tables/karma.conf.js", + "/Users/citelao/Projects/- GT/Fantasy_Football/trunk/Webpage/team.php", + "/Users/citelao/Projects/Accessible Tables/js/entabler.navigation.js", + "/Users/citelao/Projects/- scratch/simple-server/Server.java", + "/private/var/run/resolv.conf", + "/private/etc/hosts", + "/Applications/XAMPP/xamppfiles/etc/httpd.conf", + "/Applications/XAMPP/xamppfiles/logs/error_log", + "/Users/citelao/Downloads/marytts-master/marytts-client/pom.xml", + "/Users/citelao/.Trash/yum-lemonade-fat/META-INF/MANIFEST.MF", + "/Users/citelao/Desktop/yum-v0.7/META-INF/MANIFEST.MF", + "/Users/citelao/Downloads/Jtok/jtok/release_1.9.2/target/jtok-core-1.9.2.redux.jar/log4j.properties", + "/Users/citelao/Downloads/Jtok/jtok/release_1.9.2/target/jtok-core-1.9.2.redux.jar/jtok/jtok.cfg", + "/Users/citelao/Projects/133/threading/out.txt", + "/Users/citelao/Documents/My Games/Fallout3/FALLOUT.INI", + "/Users/citelao/Desktop/Fallout_3/Fallout_3.app/Contents/Resources/drive_c/Program Files/Bethesda Softworks/Fallout 3/Data/Data/FOSE/Plugins/sr_Fallout_Stutter_Remover.ini", + "/Users/citelao/Downloads/ppt-f317-1/prophet.nfo", + "/Users/citelao/Projects/yum-lemonade/src/yum/sound/player/OrderedSoundPlayer.java", + "/Users/citelao/Projects/SFML/lib/unix/ResourcePath.cpp", + "/Users/citelao/Projects/SFML/lib/mac/ResourcePath.mm", + "/Users/citelao/Projects/SFML/src/main.cpp", + "/Users/citelao/Projects/SFML/lib/win/ResourcePath.cpp", + "/Users/citelao/Projects/SFML/cmake/modules/FindSFML.cmake", + "/Users/citelao/Projects/SFML/cmake/build_files/mac/ResourcePath.hpp", + "/Users/citelao/Projects/SFML/cmake/build_files/unix/ResourcePath.cpp", + "/Users/citelao/Projects/SFML/cmake/build_files/unix/ResourcePath.h", + "/Users/citelao/Projects/SFML/.gitignore", + "/Users/citelao/Projects/SFML/test.txt", + "/Users/citelao/Projects/SFML/build.sh", + "/Users/citelao/Projects/SFML/cmake/build_files/unix/run.sh", + "/Users/citelao/Projects/SFML/run.sh", + "/Users/citelao/Desktop/segments.csv", + "/Users/citelao/Projects/yum-lemonade/resource/text/segments.csv", + "/Users/citelao/Projects/yum-lemonade/resource/text/hooks.csv", + "/Users/citelao/Projects/yum-lemonade/src/yum/helper/InputHelper.java", + "/Users/citelao/Projects/yum-lemonade/resource/sfx/speech/autogen/README", + "/Users/citelao/Projects/yum-lemonade/resource/text/headlines.csv", + "/Users/citelao/Library/Application Support/KeyRemap4MacBook/private.xml", + "/Users/citelao/Projects/yum-lemonade/resource/text/headlines.txt", + "/Users/citelao/Dropbox/Alfred/Alfred.alfredpreferences/workflows/spotifious/src/citelao/Spotifious/Menus/Search.php", + "/Users/citelao/Projects/test/CardLayoutDemo2.java", + "/Users/citelao/Projects/241/lab3/src/PriorityQueue.java", + "/Users/citelao/Projects/241/lab3/src/PQNode.java", + "/Users/citelao/Projects/241/lab3/src/Handle.java" + ], + "find": + { + "height": 35.0 + }, + "find_in_files": + { + "height": 0.0, + "where_history": + [ + "/Users/citelao/Projects/Accessible Tables/js/phenidate" + ] + }, + "find_state": + { + "case_sensitive": false, + "find_history": + [ + "requirejs", + "ouptut", + "before", + "parentString", + "undefined", + "content_before", + "contentBefore", + "befores", + "active", + "Active", + "active", + "element", + "Element", + "element", + "content_After", + "before", + "Before", + "before", + "Before", + "before", + "Before", + "active", + "element", + "oldParents", + "element", + "_contexts", + "Befores", + "after", + "After", + "after", + "After", + "befores", + "-1", + "_contexts", + "Before", + "before", + "matchedParent", + "context", + "getInheritedRule", + "getInheritedRules", + "getinheri", + "getInher", + "dom", + "get", + "getInheritedRule", + "getInheritedRuleState", + "getInheritedRule", + "stopElement", + "audioElement", + "stopElement", + "audioElement", + "context", + "parent", + "console.log", + "math", + "child", + "entabler", + " \n", + "old", + "console.", + "rulecompare", + "onkey", + "onup", + "focused", + "table", + "header", + "context", + "j", + "i", + "rule", + "before", + "getmatched", + "p", + "text", + "p", + "img", + "tabbable", + "getrule", + "compare", + "phenidatefocuscha", + "phenidatefocusch", + "phenidate", + "onfocuschange", + "getcellrow", + "getcelll", + "row", + "column", + "row", + "column", + "_dom", + "i", + "Things", + "split", + "rules", + "column", + "doc", + "documentdoc", + "doc", + "output", + "args", + "css", + "speaksel", + "pill19", + "SpeakSel", + "tabbableRegex", + "rule", + "args", + "dom", + "_dom", + "dom", + "DOM", + "dom", + "tabbable", + "rules", + "nav", + "never", + "buildspan", + "builder", + "DomBuilder", + "Dom", + "defaults", + "table", + "content", + "neighbor", + "input", + " {text}", + "matchedRule", + "content" + ], + "highlight": true, + "in_selection": false, + "preserve_case": false, + "regex": false, + "replace_history": + [ + "\"http://whitehouse.gov/" + ], + "reverse": false, + "show_context": true, + "use_buffer2": true, + "whole_word": false, + "wrap": true + }, + "groups": + [ + { + "selected": 0, + "sheets": + [ + { + "buffer": 0, + "file": "composer.json", + "settings": + { + "buffer_size": 193, + "regions": + { + }, + "selection": + [ + [ + 187, + 187 + ] + ], + "settings": + { + "annotations": + [ + "TODO", + "README", + "FIXME" + ], + "codeintel": true, + "codeintel_config": + { + "JavaScript": + { + "codeintel_max_recursive_dir_depth": 2.0, + "codeintel_scan_files_in_project": false, + "javascriptExtraPaths": + [ + ] + }, + "PHP": + { + "codeintel_max_recursive_dir_depth": 5.0, + "codeintel_scan_files_in_project": false, + "phpExtraPaths": + [ + ] + }, + "Python": + { + "env": + { + } + } + }, + "codeintel_database_dir": "~/.codeintel", + "codeintel_enabled_languages": + [ + "JavaScript", + "SCSS", + "Python", + "HTML", + "Ruby", + "Python3", + "XML", + "Sass", + "HTML5", + "Perl", + "CSS", + "Twig", + "Less", + "Node.js", + "TemplateToolkit", + "PHP" + ], + "codeintel_exclude_scopes_from_complete_triggers": + [ + "comment" + ], + "codeintel_language_settings": + { + "JavaScript": + { + "codeintel_max_recursive_dir_depth": 2.0, + "codeintel_scan_exclude_dir": + [ + "/build/", + "/min/" + ], + "codeintel_scan_extra_dir": + [ + ], + "codeintel_scan_files_in_project": false, + "codeintel_selected_catalogs": + [ + "jQuery" + ] + }, + "PHP": + { + "codeintel_max_recursive_dir_depth": 15.0, + "codeintel_scan_exclude_dir": + [ + "/Applications/MAMP/bin/php/php5.5.3/" + ], + "codeintel_scan_extra_dir": + [ + ], + "codeintel_scan_files_in_project": true, + "php": "/Applications/MAMP/bin/php/php5.5.3/bin/php" + }, + "Python3": + { + "codeintel_scan_extra_dir": + [ + "/Applications/Sublime Text.app/Contents/MacOS", + "~/Library/Application Support/Sublime Text 3/Packages/SublimeCodeIntel/arch", + "~/Library/Application Support/Sublime Text 3/Packages/SublimeCodeIntel/libs" + ], + "codeintel_scan_files_in_project": true, + "codeintel_selected_catalogs": + [ + ], + "python3": "/usr/local/bin/python3.3" + } + }, + "codeintel_live": true, + "codeintel_live_enabled_languages": + [ + "JavaScript", + "Mason", + "XBL", + "XUL", + "RHTML", + "SCSS", + "Python", + "HTML", + "Ruby", + "Python3", + "XML", + "Sass", + "XSLT", + "Django", + "HTML5", + "Perl", + "CSS", + "Twig", + "Less", + "Smarty", + "Node.js", + "Tcl", + "TemplateToolkit", + "PHP" + ], + "codeintel_max_recursive_dir_depth": 10.0, + "codeintel_scan_exclude_dir": + [ + ], + "codeintel_scan_files_in_project": true, + "codeintel_selected_catalogs": + [ + ], + "codeintel_snippets": false, + "codeintel_syntax_map": + { + "Python Django": "Python" + }, + "codeintel_tooltips": "popup", + "codeintel_word_completions": "buffer", + "color_scheme": "Packages/User/Color Highlighter/themes/base16-eighties.dark.tmTheme", + "csslint_options": + { + "adjoining-classes": "warning", + "box-model": true, + "box-sizing": "warning", + "compatible-vendor-prefixes": "warning", + "display-property-grouping": true, + "duplicate-background-images": "warning", + "duplicate-properties": true, + "empty-rules": true, + "errors": true, + "fallback-colors": "warning", + "floats": "warning", + "font-faces": "warning", + "font-sizes": "warning", + "gradients": "warning", + "ids": "warning", + "import": "warning", + "important": "warning", + "known-properties": true, + "outline-none": "warning", + "overqualified-elements": "warning", + "qualified-headings": "warning", + "regex-selectors": "warning", + "rules-count": "warning", + "shorthand": "warning", + "star-property-hack": "warning", + "text-indent": "warning", + "underscore-property-hack": "warning", + "unique-headings": "warning", + "universal-selector": "warning", + "vendor-prefix": true, + "zero-units": "warning" + }, + "gjslint_ignore": + [ + 110.0 + ], + "gjslint_options": + [ + ], + "javascript_linter": "jshint", + "jshint_options": + { + "browser": true, + "evil": true, + "regexdash": true, + "sub": true, + "trailing": true, + "wsh": true + }, + "pep8": true, + "pep8_ignore": + [ + "E501" + ], + "perl_linter": "perlcritic", + "pyflakes_ignore": + [ + ], + "pyflakes_ignore_import_*": true, + "sublime_auto_complete": true, + "sublimelinter": true, + "sublimelinter_delay": 2.0, + "sublimelinter_disable": + [ + ], + "sublimelinter_executable_map": + { + }, + "sublimelinter_fill_outlines": false, + "sublimelinter_gutter_marks": true, + "sublimelinter_gutter_marks_theme": "simple", + "sublimelinter_mark_style": "none", + "sublimelinter_notes": false, + "sublimelinter_objj_check_ascii": false, + "sublimelinter_popup_errors_on_save": false, + "sublimelinter_syntax_map": + { + "C++": "c", + "Python Django": "python", + "Ruby on Rails": "ruby" + }, + "sublimelinter_wrap_find": true, + "syntax": "Packages/JavaScript/JSON.tmLanguage" + }, + "translation.x": 0.0, + "translation.y": 0.0, + "zoom_level": 1.0 + }, + "type": "text" + } + ] + } + ], + "incremental_find": + { + "height": 45.0 + }, + "input": + { + "height": 45.0 + }, + "layout": + { + "cells": + [ + [ + 0, + 0, + 1, + 1 + ] + ], + "cols": + [ + 0.0, + 1.0 + ], + "rows": + [ + 0.0, + 1.0 + ] + }, + "menu_visible": true, + "output.exec": + { + "height": 170.0 + }, + "replace": + { + "height": 86.0 + }, + "save_all_on_build": true, + "select_file": + { + "height": 0.0, + "selected_items": + [ + [ + "rules.j", + "js/phenidate/phenidate.rules.js" + ], + [ + "cs.", + "lib/require-cs.js" + ], + [ + "mani", + "speaker/manifest.json" + ], + [ + "app.", + "js/app.js" + ], + [ + "conte", + "speaker/content_script.js" + ], + [ + "index", + "index.htm" + ], + [ + "manif", + "speaker/manifest.json" + ], + [ + "entable", + "js/entabler/entabler.js" + ], + [ + ".htm", + "manyElements.htm" + ], + [ + ".ht", + "pcgamer.htm" + ], + [ + "inde", + "index.htm" + ], + [ + "rules", + "js/phenidate/phenidate.rules.js" + ], + [ + "rule", + "js/phenidate/rules/rules.json" + ], + [ + "dom", + "js/phenidate/phenidate.dom.js" + ], + [ + "buil", + "js/phenidate/phenidate.builder.js" + ], + [ + "bac", + "speaker/background.js" + ], + [ + "con", + "speaker/content_script.js" + ], + [ + "foc", + "js/phenidate/phenidate.focus.js" + ], + [ + "hf", + "js/phenidate/test/phenidate.test.focus.js" + ], + [ + "henid", + "js/phenidate/phenidate.js" + ], + [ + "spec", + "doc/spec.md" + ], + [ + "builde", + "js/phenidate/phenidate.builder.js" + ], + [ + "phe", + "js/phenidate/phenidate.navigator.js" + ], + [ + "phenidate.", + "js/phenidate/phenidate.focus.js" + ], + [ + "builder", + "js/phenidate/phenidate.builder.js" + ], + [ + "ruels", + "js/phenidate/rules/rules.json" + ], + [ + "enta", + "js/entabler/util.js" + ], + [ + "focus", + "js/phenidate/phenidate.focus.js" + ], + [ + "pj", + "js/phenidate/phenidate.js" + ], + [ + "app", + "js/app.js" + ], + [ + "navi", + "js/phenidate/phenidate.navigator.js" + ], + [ + "lart", + "largeTable.htm" + ], + [ + "r", + "js/phenidate/rules/rules.min.json" + ], + [ + "ind", + "index.htm" + ], + [ + "ex", + "example.htm" + ], + [ + "rul", + "js/phenidate/rules/rules.json" + ], + [ + "phenidate", + "js/phenidate/test/phenidate.test.js" + ], + [ + "opt", + "speaker/options.html" + ], + [ + "cont", + "speaker/content_script.js" + ], + [ + "manife", + "speaker/manifest.json" + ], + [ + "mou", + "lib/mousetrap.min.js" + ], + [ + "i", + "index.htm" + ], + [ + "largetes", + "largeTest.htm" + ], + [ + "util", + "js/entabler/util.js" + ], + [ + "focu", + "js/phenidate/phenidate.focus.js" + ], + [ + "build", + "js/phenidate/build.sh" + ], + [ + "ent", + "js/entabler/entabler.js" + ], + [ + "entab", + "js/entabler/entabler.js" + ], + [ + "enet", + "js/entabler/entabler.js" + ], + [ + "exa", + "example.htm" + ], + [ + "large", + "largeTest.htm" + ], + [ + "sty", + "css/style.css" + ], + [ + "", + "js/phenidate/phenidate.dom.js" + ], + [ + "rules.js", + "js/phenidate/phenidate.rules.js" + ], + [ + "nav", + "js/phenidate/phenidate.nav.js" + ], + [ + "phen", + "js/phenidate/phenidate.js" + ], + [ + ".css", + "css/style.css" + ], + [ + "lar", + "largeTable.htm" + ], + [ + "css", + "css/style.css" + ], + [ + "speaker.js", + "speaker/background.js" + ], + [ + "content", + "speaker/content_script.js" + ], + [ + "bi", + "js/phenidate/build.sh" + ], + [ + "htm", + "manyElements.htm" + ], + [ + "pheni", + "js/phenidate/phenidate.dom.js" + ], + [ + "read", + "README.md" + ], + [ + "change", + "CHANGELOG.md" + ], + [ + "se", + "src/citelao/Spotifious/Menus/Search.php" + ], + [ + "oh", + "src/citelao/OhAlfred/OhAlfred.php" + ], + [ + "search", + "src/citelao/Spotifious/Menus/Search.php" + ], + [ + "helper", + "src/citelao/Spotifious/Helper.php" + ], + [ + ".js", + "include/spotifious-helper/js/response.js" + ] + ], + "width": 0.0 + }, + "select_project": + { + "height": 0.0, + "selected_items": + [ + ], + "width": 0.0 + }, + "show_minimap": true, + "show_open_files": false, + "show_tabs": true, + "side_bar_visible": true, + "side_bar_width": 177.0, + "status_bar_visible": true +} 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..1948f81 100644 --- a/src/citelao/OhAlfred/OhAlfred.php +++ b/src/citelao/OhAlfred/OhAlfred.php @@ -23,7 +23,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. @@ -74,8 +74,8 @@ public function storage() { **/ // Read an arbitrary plist setting. - public function plist($plist, $setting, $value = '') { - if ($value == '') { + public function plist($plist, $setting, $value = -1) { + if ($value === -1) { return exec("defaults read '$plist' '$setting'"); } @@ -83,12 +83,12 @@ public function plist($plist, $setting, $value = '') { } // Read the workflow .plist file. - public function defaults($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 = '') { + public function options($setting, $value = -1) { $options = $this->storage() . "/settings"; $optionsFile = $options . ".plist"; @@ -222,6 +222,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..e73b690 100644 --- a/src/citelao/Spotifious/Menus/Control.php +++ b/src/citelao/Spotifious/Menus/Control.php @@ -13,14 +13,14 @@ 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' ) ); diff --git a/src/citelao/Spotifious/Menus/Settings.php b/src/citelao/Spotifious/Menus/Settings.php new file mode 100644 index 0000000..ba3d520 --- /dev/null +++ b/src/citelao/Spotifious/Menus/Settings.php @@ -0,0 +1,67 @@ +alfred = new OhAlfred(); + + $this->trackNotificationsEnabled = ($this->alfred->options('track_notifications') == 'true'); + $this->countryCode = $this->alfred->options('country'); + } + + 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' => 'Change my linked Spotify application', + 'subtitle' => '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' + ); + + $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..ce3c043 100644 --- a/src/citelao/Spotifious/Menus/Setup.php +++ b/src/citelao/Spotifious/Menus/Setup.php @@ -7,33 +7,23 @@ class Setup implements Menu { protected $alfred; - protected $userTriggered; protected $countryCodeConfigured; 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') == ''); } 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 +33,21 @@ 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⟩' + ); + + $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 2d9a6cd..4549b3a 100644 --- a/src/citelao/Spotifious/Spotifious.php +++ b/src/citelao/Spotifious/Spotifious.php @@ -1,14 +1,20 @@ alfred->options('track_notifications') == '') { + $this->alfred->options('track_notifications', 'true'); + } + // 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->alfred->options('spotify_access_token') == '' || + $this->alfred->options('spotify_access_token_expires') == '' || + $this->alfred->options('spotify_refresh_token') == '' || $this->contains($query, "Country Code ⟩")) { // If we are trying to configure country code @@ -36,10 +52,18 @@ public function run($query) { return $menu->output(); } + $api = $this->getSpotifyApi(); + // 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 +126,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,23 +185,19 @@ 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"); @@ -166,6 +211,16 @@ public function process($action) { $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!"; } @@ -209,4 +264,21 @@ protected function respondingSpotifyQuery($query) { return $data; } + + protected function getSpotifyApi() { + $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->refreshAccessToken(); + + $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; + } } \ No newline at end of file diff --git a/testoauth.php b/testoauth.php new file mode 100644 index 0000000..0ddfe13 --- /dev/null +++ b/testoauth.php @@ -0,0 +1,29 @@ +requestCredentialsToken($scopes); +} catch(SpotifyWebAPI\SpotifyWebAPIException $e) { + print 'hi' . $e->getMessage(); +} + +$authorizeUrl = $session->getAuthorizeUrl(array( + 'scope' => $scopes +)); + +$ch = curl_init(); +curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); +curl_setopt($ch, CURLOPT_URL, $authorizeUrl); +$contents = curl_exec ($ch); + + +echo 'here'; +die(); \ No newline at end of file diff --git a/testresponse.php b/testresponse.php new file mode 100644 index 0000000..e69de29 diff --git a/vendor/autoload.php b/vendor/autoload.php index 6c35dd2..17ca895 100644 --- a/vendor/autoload.php +++ b/vendor/autoload.php @@ -4,4 +4,4 @@ require_once __DIR__ . '/composer' . '/autoload_real.php'; -return ComposerAutoloaderInitd31d8dd13b7849ffc0c1be9abe3d270d::getLoader(); +return ComposerAutoloaderInit76049c9ae64eb3029e1fc6a281e88caf::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..fad1aef 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 ComposerAutoloaderInit76049c9ae64eb3029e1fc6a281e88caf { 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('ComposerAutoloaderInit76049c9ae64eb3029e1fc6a281e88caf', '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('ComposerAutoloaderInit76049c9ae64eb3029e1fc6a281e88caf', 'loadClassLoader')); $map = require __DIR__ . '/autoload_namespaces.php'; foreach ($map as $namespace => $path) { @@ -46,3 +43,8 @@ public static function getLoader() return $loader; } } + +function composerRequire76049c9ae64eb3029e1fc6a281e88caf($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" +}