diff --git a/.env b/.env deleted file mode 100644 index 473f4a3..0000000 --- a/.env +++ /dev/null @@ -1 +0,0 @@ -RAPID_SPOTIFY_API=a0dbb83576mshf14f95d278ccb62p160b08jsn3a23196bcf06 \ No newline at end of file diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 0000000..4ea0a83 --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,77 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL" + +on: + push: + branches: [ "master" ] + pull_request: + # The branches below must be a subset of the branches above + branches: [ "master" ] + schedule: + - cron: '23 12 * * 4' + +jobs: + analyze: + name: Analyze + runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }} + timeout-minutes: ${{ (matrix.language == 'swift' && 120) || 360 }} + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: [ 'javascript' ] + # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby', 'swift' ] + # Use only 'java' to analyze code written in Java, Kotlin or both + # Use only 'javascript' to analyze code written in JavaScript, TypeScript or both + # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + + # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs + # queries: security-extended,security-and-quality + + + # Autobuild attempts to build any compiled languages (C/C++, C#, Go, Java, or Swift). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v2 + + # ℹ️ Command-line programs to run using the OS shell. + # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun + + # If the Autobuild fails above, remove it and uncomment the following three lines. + # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. + + # - run: | + # echo "Run, Build Application using script" + # ./location_of_script_within_repo/buildscript.sh + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v2 + with: + category: "/language:${{matrix.language}}" diff --git a/.gitignore b/.gitignore index a547bf3..7a5f42c 100644 --- a/.gitignore +++ b/.gitignore @@ -11,7 +11,8 @@ node_modules dist dist-ssr *.local - +*.env +.env # Editor directories and files .vscode/* !.vscode/extensions.json diff --git a/.prettierrc b/.prettierrc index 9d32b44..0425198 100644 --- a/.prettierrc +++ b/.prettierrc @@ -6,7 +6,7 @@ "htmlWhitespaceSensitivity": "css", "insertPragma": false, "jsxSingleQuote": false, - "printWidth": 75, + "printWidth": 90, "proseWrap": "preserve", "quoteProps": "as-needed", "requirePragma": false, diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d383450 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Tuấn Đặng + +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/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..034e848 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,21 @@ +# Security Policy + +## Supported Versions + +Use this section to tell people about which versions of your project are +currently being supported with security updates. + +| Version | Supported | +| ------- | ------------------ | +| 5.1.x | :white_check_mark: | +| 5.0.x | :x: | +| 4.0.x | :white_check_mark: | +| < 4.0 | :x: | + +## Reporting a Vulnerability + +Use this section to tell people how to report a vulnerability. + +Tell them where to go, how often they can expect to get an update on a +reported vulnerability, what to expect if the vulnerability is accepted or +declined, etc. diff --git a/index.html b/index.html index 9701c1a..f147852 100644 --- a/index.html +++ b/index.html @@ -1,11 +1,13 @@ - + - - Vite + React + TS + + + + Spotify - Clone
diff --git a/package-lock.json b/package-lock.json index 8382bb4..152ba9c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,22 +7,37 @@ "": { "name": "spotify-react", "version": "0.0.0", + "license": "MIT", "dependencies": { "@types/node": "^20.2.5", + "antd": "^5.7.1", "axios": "^1.4.0", "classnames": "^2.3.2", + "color-thief-react": "^2.1.0", "colorthief": "^2.4.0", + "he": "^1.2.0", "normalize.css": "^8.0.1", + "query-string": "^8.1.0", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-error-boundary": "^4.0.10", + "react-fast-marquee": "^1.6.0", "react-icons": "^4.9.0", + "react-intersection-observer": "^9.5.1", + "react-lazy-load-image-component": "^1.6.0", + "react-loading-skeleton": "^3.3.1", "react-router-dom": "^6.11.2", + "react-spinners-kit": "^1.9.1", "react-split": "^2.0.14", - "sass": "^1.62.1" + "usehooks-ts": "^2.9.1" }, "devDependencies": { + "@types/he": "^1.2.0", + "@types/jsdom": "^21.1.1", "@types/react": "^18.0.37", "@types/react-dom": "^18.0.11", + "@types/react-lazy-load-image-component": "^1.5.3", + "@types/react-modal": "^3.16.0", "@typescript-eslint/eslint-plugin": "^5.59.0", "@typescript-eslint/parser": "^5.59.0", "@vitejs/plugin-react": "^4.0.0", @@ -37,7 +52,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -46,11 +60,80 @@ "node": ">=6.0.0" } }, + "node_modules/@ant-design/colors": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-7.0.0.tgz", + "integrity": "sha512-iVm/9PfGCbC0dSMBrz7oiEXZaaGH7ceU40OJEfKmyuzR9R5CRimJYPlRiFtMQGQcbNMea/ePcoIebi4ASGYXtg==", + "dependencies": { + "@ctrl/tinycolor": "^3.4.0" + } + }, + "node_modules/@ant-design/cssinjs": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-1.12.0.tgz", + "integrity": "sha512-59ZifzlQxVsHSf+n1/Zc+lB7nnxSymwdtuN1biZ5V8mRql9LBbuAyN3TX5/sKWvntBZrDb/yAB6bHgD5JW48ag==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "@emotion/hash": "^0.8.0", + "@emotion/unitless": "^0.7.5", + "classnames": "^2.3.1", + "csstype": "^3.0.10", + "rc-util": "^5.34.1", + "stylis": "^4.0.13" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/cssinjs/node_modules/stylis": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.0.tgz", + "integrity": "sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==" + }, + "node_modules/@ant-design/icons": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-5.1.4.tgz", + "integrity": "sha512-YHKL7Jx3bM12OxvtiYDon04BsBT/6LGitYEqar3GljzWaAyMOAD8i/uF1Rsi5Us/YNdWWXBGSvZV2OZWMpJlcA==", + "dependencies": { + "@ant-design/colors": "^7.0.0", + "@ant-design/icons-svg": "^4.2.1", + "@babel/runtime": "^7.11.2", + "classnames": "^2.2.6", + "rc-util": "^5.31.1" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/icons-svg": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.2.1.tgz", + "integrity": "sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw==" + }, + "node_modules/@ant-design/react-slick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-1.0.1.tgz", + "integrity": "sha512-ARM0TmpGdDuUVE10NwUCENQlJSInNKo5NiBjL5szu5BxWNEHNwQMcDrlVCqFbkvFLy+2CvywW8Y59QJtC0YDag==", + "dependencies": { + "@babel/runtime": "^7.10.4", + "classnames": "^2.2.5", + "json2mq": "^0.2.0", + "resize-observer-polyfill": "^1.5.1", + "throttle-debounce": "^5.0.0" + }, + "peerDependencies": { + "react": ">=16.9.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.21.4", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", - "dev": true, "dependencies": { "@babel/highlight": "^7.18.6" }, @@ -62,7 +145,6 @@ "version": "7.22.3", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.3.tgz", "integrity": "sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -71,7 +153,6 @@ "version": "7.22.1", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.1.tgz", "integrity": "sha512-Hkqu7J4ynysSXxmAahpN1jjRwVJ+NdpraFLIWflgjpVob3KNyK3/tIUc7Q7szed8WMp0JNa7Qtd1E9Oo22F9gA==", - "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.21.4", @@ -101,7 +182,6 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, "bin": { "semver": "bin/semver.js" } @@ -110,7 +190,6 @@ "version": "7.22.3", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.3.tgz", "integrity": "sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A==", - "dev": true, "dependencies": { "@babel/types": "^7.22.3", "@jridgewell/gen-mapping": "^0.3.2", @@ -121,11 +200,21 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-compilation-targets": { "version": "7.22.1", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.1.tgz", "integrity": "sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ==", - "dev": true, "dependencies": { "@babel/compat-data": "^7.22.0", "@babel/helper-validator-option": "^7.21.0", @@ -144,7 +233,6 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, "bin": { "semver": "bin/semver.js" } @@ -153,7 +241,6 @@ "version": "7.22.1", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.1.tgz", "integrity": "sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -162,7 +249,6 @@ "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", - "dev": true, "dependencies": { "@babel/template": "^7.20.7", "@babel/types": "^7.21.0" @@ -175,7 +261,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, "dependencies": { "@babel/types": "^7.18.6" }, @@ -184,12 +269,11 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", - "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", - "dev": true, + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", "dependencies": { - "@babel/types": "^7.21.4" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -199,7 +283,6 @@ "version": "7.22.1", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.1.tgz", "integrity": "sha512-dxAe9E7ySDGbQdCVOY/4+UcD8M9ZFqZcZhSPsPacvCG4M+9lwtDDQfI2EoaSvmf7W/8yCBkGU0m7Pvt1ru3UZw==", - "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.1", "@babel/helper-module-imports": "^7.21.4", @@ -215,10 +298,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz", - "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==", - "dev": true, + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "engines": { "node": ">=6.9.0" } @@ -227,7 +309,6 @@ "version": "7.21.5", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", - "dev": true, "dependencies": { "@babel/types": "^7.21.5" }, @@ -239,7 +320,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, "dependencies": { "@babel/types": "^7.18.6" }, @@ -248,19 +328,17 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", - "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", - "dev": true, + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true, + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", "engines": { "node": ">=6.9.0" } @@ -269,7 +347,6 @@ "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -278,7 +355,6 @@ "version": "7.22.3", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.3.tgz", "integrity": "sha512-jBJ7jWblbgr7r6wYZHMdIqKc73ycaTcCaWRq4/2LpuPHcx7xMlZvpGQkOYc9HeSjn6rcx15CPlgVcBtZ4WZJ2w==", - "dev": true, "dependencies": { "@babel/template": "^7.21.9", "@babel/traverse": "^7.22.1", @@ -292,7 +368,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", @@ -306,7 +381,6 @@ "version": "7.22.4", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.4.tgz", "integrity": "sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA==", - "dev": true, "bin": { "parser": "bin/babel-parser.js" }, @@ -314,6 +388,20 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-react-jsx-self": { "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.21.0.tgz", @@ -344,11 +432,21 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/runtime": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/template": { "version": "7.21.9", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.21.9.tgz", "integrity": "sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.21.4", "@babel/parser": "^7.21.9", @@ -362,7 +460,6 @@ "version": "7.22.4", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.4.tgz", "integrity": "sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.21.4", "@babel/generator": "^7.22.3", @@ -380,19 +477,49 @@ } }, "node_modules/@babel/types": { - "version": "7.22.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.4.tgz", - "integrity": "sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA==", - "dev": true, + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", "dependencies": { - "@babel/helper-string-parser": "^7.21.5", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.0.tgz", + "integrity": "sha512-/Z3l6pXthq0JvMYdUFyX9j0MaCltlIn6mfh9jLyQwg5aPKxkyNa0PTHtU1AlFXLNk55ZuAeJRcpvq+tmLfKmaQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "dependencies": { + "@emotion/memoize": "0.7.4" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" + }, + "node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, "node_modules/@esbuild/android-arm": { "version": "0.17.19", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", @@ -853,7 +980,6 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -867,7 +993,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -876,7 +1001,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -884,14 +1008,12 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.18", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", - "dev": true, "dependencies": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" @@ -900,8 +1022,7 @@ "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, "node_modules/@lokesh.dhakar/quantize": { "version": "1.3.0", @@ -943,6 +1064,119 @@ "node": ">= 8" } }, + "node_modules/@rc-component/color-picker": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-1.4.1.tgz", + "integrity": "sha512-vh5EWqnsayZa/JwUznqDaPJz39jznx/YDbyBuVJntv735tKXKwEUZZb2jYEldOg+NKWZwtALjGMrNeGBmqFoEw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@ctrl/tinycolor": "^3.6.0", + "classnames": "^2.2.6", + "rc-util": "^5.30.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/context": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@rc-component/context/-/context-1.3.0.tgz", + "integrity": "sha512-6QdaCJ7Wn5UZLJs15IEfqy4Ru3OaL5ctqpQYWd5rlfV9wwzrzdt6+kgAQZV/qdB0MUPN4nhyBfRembQCIvBf+w==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/mini-decimal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz", + "integrity": "sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==", + "dependencies": { + "@babel/runtime": "^7.18.0" + }, + "engines": { + "node": ">=8.x" + } + }, + "node_modules/@rc-component/mutate-observer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rc-component/mutate-observer/-/mutate-observer-1.0.0.tgz", + "integrity": "sha512-okqRJSfNisXdI6CUeOLZC5ukBW/8kir2Ii4PJiKpUt+3+uS7dxwJUMxsUZquxA1rQuL8YcEmKVp/TCnR+yUdZA==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/portal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.2.tgz", + "integrity": "sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/tour": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-1.8.0.tgz", + "integrity": "sha512-rrRGioHTLQlGca27G2+lw7QpRb3uuMYCUIJjj31/B44VCJS0P2tqYhOgtzvWQmaLMlWH3ZlpzotkKX13NT4XEA==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "@rc-component/portal": "^1.0.0-9", + "@rc-component/trigger": "^1.3.6", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/trigger": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-1.14.2.tgz", + "integrity": "sha512-hQtC/HfSL6zsY4w0b3YtWgXf4TpYLvjbQIW8ohdVwJ8OScL3piVtt3SCTS+AMSwjQu4C+XGioFXK98UGR6ookg==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@rc-component/portal": "^1.1.0", + "classnames": "^2.3.2", + "rc-align": "^4.0.0", + "rc-motion": "^2.0.0", + "rc-resize-observer": "^1.3.1", + "rc-util": "^5.33.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, "node_modules/@remix-run/router": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.6.2.tgz", @@ -951,6 +1185,23 @@ "node": ">=14" } }, + "node_modules/@types/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/he/-/he-1.2.0.tgz", + "integrity": "sha512-uH2smqTN4uGReAiKedIVzoLUAXIYLBTbSofhx3hbNqj74Ua6KqFsLYszduTrLCMEAEAozF73DbGi/SC1bzQq4g==", + "dev": true + }, + "node_modules/@types/jsdom": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-21.1.1.tgz", + "integrity": "sha512-cZFuoVLtzKP3gmq9eNosUL1R50U+USkbLtUQ1bYVgl/lKp0FZM7Cq4aIHAL8oIvQ17uSHi7jXPtfDOdjPwBE7A==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" + } + }, "node_modules/@types/json-schema": { "version": "7.0.12", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", @@ -988,6 +1239,25 @@ "@types/react": "*" } }, + "node_modules/@types/react-lazy-load-image-component": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@types/react-lazy-load-image-component/-/react-lazy-load-image-component-1.5.3.tgz", + "integrity": "sha512-hTzsQQ64mmPR6W03DQr6zhzeBGn17ExnVd7sLHqTQZQVd9Oi0Dy7tfSPgK0+AZV5YNC+e8Jw7oq9kzYfDkCDCA==", + "dev": true, + "dependencies": { + "@types/react": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-modal": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/@types/react-modal/-/react-modal-3.16.0.tgz", + "integrity": "sha512-iphdqXAyUfByLbxJn5j6d+yh93dbMgshqGP0IuBeaKbZXx0aO+OXsvEkt6QctRdxjeM9/bR+Gp3h9F9djVWTQQ==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/scheduler": { "version": "0.16.3", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", @@ -1000,6 +1270,12 @@ "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", "dev": true }, + "node_modules/@types/tough-cookie": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", + "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==", + "dev": true + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.59.8", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.8.tgz", @@ -1255,7 +1531,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -1263,10 +1538,76 @@ "node": ">=4" } }, + "node_modules/antd": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/antd/-/antd-5.7.1.tgz", + "integrity": "sha512-25L9lbIQMctQVeZq+IdZ0RfYvlrlUkfSsx7JFnFYnqqnhizZXmyV+Vd2nUleJYeFU7pBKfy394I0F/FcHaeKEg==", + "dependencies": { + "@ant-design/colors": "^7.0.0", + "@ant-design/cssinjs": "^1.10.1", + "@ant-design/icons": "^5.1.0", + "@ant-design/react-slick": "~1.0.0", + "@babel/runtime": "^7.18.3", + "@ctrl/tinycolor": "^3.6.0", + "@rc-component/color-picker": "~1.4.0", + "@rc-component/mutate-observer": "^1.0.0", + "@rc-component/tour": "~1.8.0", + "@rc-component/trigger": "^1.13.0", + "classnames": "^2.2.6", + "copy-to-clipboard": "^3.2.0", + "dayjs": "^1.11.1", + "qrcode.react": "^3.1.0", + "rc-cascader": "~3.12.0", + "rc-checkbox": "~3.1.0", + "rc-collapse": "~3.7.0", + "rc-dialog": "~9.1.0", + "rc-drawer": "~6.2.0", + "rc-dropdown": "~4.1.0", + "rc-field-form": "~1.34.0", + "rc-image": "~7.0.0", + "rc-input": "~1.1.0", + "rc-input-number": "~8.0.2", + "rc-mentions": "~2.5.0", + "rc-menu": "~9.10.0", + "rc-motion": "^2.7.3", + "rc-notification": "~5.0.4", + "rc-pagination": "~3.5.0", + "rc-picker": "~3.10.0", + "rc-progress": "~3.4.1", + "rc-rate": "~2.12.0", + "rc-resize-observer": "^1.2.0", + "rc-segmented": "~2.2.0", + "rc-select": "~14.5.0", + "rc-slider": "~10.1.0", + "rc-steps": "~6.0.0", + "rc-switch": "~4.1.0", + "rc-table": "~7.32.1", + "rc-tabs": "~12.9.0", + "rc-textarea": "~1.3.2", + "rc-tooltip": "~6.0.0", + "rc-tree": "~5.7.6", + "rc-tree-select": "~5.9.0", + "rc-upload": "~4.3.0", + "rc-util": "^5.32.0", + "scroll-into-view-if-needed": "^3.0.3", + "throttle-debounce": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ant-design" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "optional": true, + "peer": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -1281,6 +1622,11 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "node_modules/array-tree-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz", + "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==" + }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -1306,6 +1652,11 @@ "node": ">=0.8" } }, + "node_modules/async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -1334,6 +1685,21 @@ "proxy-from-env": "^1.1.0" } }, + "node_modules/babel-plugin-styled-components": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.4.tgz", + "integrity": "sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "lodash": "^4.17.21", + "picomatch": "^2.3.1" + }, + "peerDependencies": { + "styled-components": ">= 2" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -1352,6 +1718,9 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=8" } @@ -1370,6 +1739,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -1381,7 +1751,6 @@ "version": "4.21.7", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.7.tgz", "integrity": "sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==", - "dev": true, "funding": [ { "type": "opencollective", @@ -1418,11 +1787,18 @@ "node": ">=6" } }, + "node_modules/camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001494", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001494.tgz", "integrity": "sha512-sY2B5Qyl46ZzfYDegrl8GBCzdawSLT4ThM9b9F+aDYUrAG2zCOyMbd2Tq34mS1g4ZKBfjRlzOohQMxx28x6wJg==", - "dev": true, "funding": [ { "type": "opencollective", @@ -1447,7 +1823,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -1461,12 +1836,15 @@ "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, "funding": [ { "type": "individual", "url": "https://paulmillr.com/funding/" } ], + "optional": true, + "peer": true, "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -1487,6 +1865,9 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "optional": true, + "peer": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -1503,7 +1884,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -1511,8 +1891,71 @@ "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/color-thief-react": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/color-thief-react/-/color-thief-react-2.1.0.tgz", + "integrity": "sha512-2Vr8XnxzoSEz2nUswROWIrxI6joMom4S9TZ5RC69/FR2K87BuXUZk5C4qn6g/rq5bYKx9m+HNjwlCOWIYMAv2A==", + "dependencies": { + "color-convert": "^2.0.1", + "colorthief": "2.3.2", + "prop-types": "15.7.2", + "tslib": "2.3.0", + "use-current-effect": "2.1.0" + }, + "peerDependencies": { + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0" + } + }, + "node_modules/color-thief-react/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-thief-react/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-thief-react/node_modules/colorthief": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/colorthief/-/colorthief-2.3.2.tgz", + "integrity": "sha512-1r4nPW553JviRcFRvN3fS2V9nUSQGjRIws8UfEeFLIxk8j1tvtaX+AAYTkH3A4B5Muiys8SA1WJxf+00xVTXyg==", + "dependencies": { + "get-pixels": "^3.3.2", + "quantize": "github:lokesh/quantize" + } + }, + "node_modules/color-thief-react/node_modules/prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "node_modules/color-thief-react/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "node_modules/color-thief-react/node_modules/use-current-effect": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/use-current-effect/-/use-current-effect-2.1.0.tgz", + "integrity": "sha512-yxSWZsBfohTulb+HyLdSIcUoG5UnSbgNl5SAEtFhzq1yqTeJAa32dZhhO5ACYn7Lc2IGt03pUOkUZZQQX/ReXg==", + "peerDependencies": { + "react": "^16.8.0" + } }, "node_modules/colorthief": { "version": "2.4.0", @@ -1534,6 +1977,11 @@ "node": ">= 0.8" } }, + "node_modules/compute-scroll-into-view": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.0.3.tgz", + "integrity": "sha512-nadqwNxghAGTamwIqQSG433W6OADZx2vCo3UXHNrzTRHK/htu+7+L0zhjEoaeaQVNAi3YgqWDv8+tzf0hRfR+A==" + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1543,8 +1991,15 @@ "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/copy-to-clipboard": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "dependencies": { + "toggle-selection": "^1.0.6" + } }, "node_modules/core-util-is": { "version": "1.0.2", @@ -1565,11 +2020,28 @@ "node": ">= 8" } }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/css-to-react-native": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-2.3.2.tgz", + "integrity": "sha512-VOFaeZA053BqvvvqIA8c9n0+9vFppVBAHCp6JgFTtTMU3Mzi+XnelJ9XC9ul3BqFzZyQ5N+H0SnwsWT2Ebchxw==", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^3.3.0" + } + }, "node_modules/csstype": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", - "dev": true + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" }, "node_modules/cwise-compiler": { "version": "1.1.3", @@ -1595,11 +2067,15 @@ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-0.0.3.tgz", "integrity": "sha512-Cp+jOa8QJef5nXS5hU7M1DWzXPEIoVR3kbV0dQuVGwROZg8bGf1DcCnkmajBTnvghTtSNMUdRrPjgaT6ZQucbw==" }, + "node_modules/dayjs": { + "version": "1.11.9", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.9.tgz", + "integrity": "sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==" + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -1612,8 +2088,16 @@ } } }, - "node_modules/deep-is": { - "version": "0.1.4", + "node_modules/decode-uri-component": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.4.1.tgz", + "integrity": "sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true @@ -1650,6 +2134,11 @@ "node": ">=6.0.0" } }, + "node_modules/dom-align": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.4.tgz", + "integrity": "sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==" + }, "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -1662,8 +2151,19 @@ "node_modules/electron-to-chromium": { "version": "1.4.419", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.419.tgz", - "integrity": "sha512-jdie3RiEgygvDTyS2sgjq71B36q2cDSBfPlwzUyuOrfYTNoYWyBxxjGJV/HAu3A2hB0Y+HesvCVkVAFoCKwCSw==", - "dev": true + "integrity": "sha512-jdie3RiEgygvDTyS2sgjq71B36q2cDSBfPlwzUyuOrfYTNoYWyBxxjGJV/HAu3A2hB0Y+HesvCVkVAFoCKwCSw==" + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } }, "node_modules/esbuild": { "version": "0.17.19", @@ -1706,7 +2206,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, "engines": { "node": ">=6" } @@ -1715,7 +2214,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, "engines": { "node": ">=0.8.0" } @@ -2103,6 +2601,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -2110,6 +2609,17 @@ "node": ">=8" } }, + "node_modules/filter-obj": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-5.1.0.tgz", + "integrity": "sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -2195,6 +2705,7 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -2208,7 +2719,6 @@ "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -2275,7 +2785,6 @@ "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, "engines": { "node": ">=4" } @@ -2337,11 +2846,18 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, "engines": { "node": ">=4" } }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "bin": { + "he": "bin/he" + } + }, "node_modules/http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -2368,7 +2884,10 @@ "node_modules/immutable": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", - "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==" + "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==", + "dev": true, + "optional": true, + "peer": true }, "node_modules/import-fresh": { "version": "3.3.0", @@ -2420,6 +2939,9 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "optional": true, + "peer": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -2436,6 +2958,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -2444,6 +2967,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -2455,6 +2979,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, "engines": { "node": ">=0.12.0" } @@ -2473,6 +2998,11 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, + "node_modules/is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==" + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -2515,7 +3045,6 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, "bin": { "jsesc": "bin/jsesc" }, @@ -2544,11 +3073,18 @@ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, + "node_modules/json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", + "dependencies": { + "string-convert": "^0.2.0" + } + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, "bin": { "json5": "lib/cli.js" }, @@ -2598,12 +3134,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -2619,11 +3170,23 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, "dependencies": { "yallist": "^3.0.2" } }, + "node_modules/memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" + }, + "node_modules/merge-anything": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/merge-anything/-/merge-anything-2.4.4.tgz", + "integrity": "sha512-l5XlriUDJKQT12bH+rVhAHjwIuXWdAIecGwsYjv2LJo+dA1AeRTmeQS+3QBpO6lEthBMDi2IUMpLC1yyRvGlwQ==", + "dependencies": { + "is-what": "^3.3.1" + } + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -2680,8 +3243,7 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/nanoid": { "version": "3.3.6", @@ -2742,13 +3304,15 @@ "node_modules/node-releases": { "version": "2.0.12", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", - "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", - "dev": true + "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==" }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -2855,6 +3419,18 @@ "data-uri-to-buffer": "0.0.3" } }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -2899,8 +3475,7 @@ "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -2921,6 +3496,12 @@ "node": ">=4.0.0" } }, + "node_modules/polished": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/polished/-/polished-1.9.3.tgz", + "integrity": "sha512-4NmSD7fMFlM8roNxs7YXPv7UFRbYzb0gufR5zBxJLRzY54+zFsavxBo6zsQzP9ep6Hh3pC2pTyrpSTBEaB6IkQ==", + "deprecated": "polished@2.X is no longer supported. Please upgrade to @latest for important bug and security fixes." + }, "node_modules/postcss": { "version": "8.4.24", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", @@ -2949,6 +3530,11 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -2986,6 +3572,14 @@ "node": ">=6" } }, + "node_modules/qrcode.react": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/qrcode.react/-/qrcode.react-3.1.0.tgz", + "integrity": "sha512-oyF+Urr3oAMUG/OiOuONL3HXM+53wvuH3mtIWQrYmsXoAq0DkvZp2RYUWFSMFtbdOpuS++9v+WAkzNVkMlNW6Q==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/qs": { "version": "6.5.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", @@ -2994,6 +3588,28 @@ "node": ">=0.6" } }, + "node_modules/quantize": { + "name": "@lokesh.dhakar/quantize", + "version": "1.3.0", + "resolved": "git+ssh://git@github.com/lokesh/quantize.git#05ebca18518f8833c7de764c5b35c443834c3226", + "license": "MIT" + }, + "node_modules/query-string": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-8.1.0.tgz", + "integrity": "sha512-BFQeWxJOZxZGix7y+SByG3F36dA0AbTy9o6pSmKFcFz7DAj0re9Frkty3saBn3nHo3D0oZJ/+rx3r8H8r8Jbpw==", + "dependencies": { + "decode-uri-component": "^0.4.1", + "filter-obj": "^5.1.0", + "split-on-first": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -3014,6 +3630,591 @@ } ] }, + "node_modules/rc-align": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-4.0.15.tgz", + "integrity": "sha512-wqJtVH60pka/nOX7/IspElA8gjPNQKIx/ZqJ6heATCkXpe1Zg4cPVrMD2vC96wjsFFL8WsmhPbx9tdMo1qqlIA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "dom-align": "^1.7.0", + "rc-util": "^5.26.0", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-cascader": { + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.12.1.tgz", + "integrity": "sha512-g6In2y6eudHXS/Fs9dKFhp9acvHRUPqem/7xReR9ng8M1pNAE137uGBOt9WNpgsKT/cDGudXZQVehaBwAKg6hQ==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "array-tree-filter": "^2.1.0", + "classnames": "^2.3.1", + "rc-select": "~14.5.0", + "rc-tree": "~5.7.0", + "rc-util": "^5.6.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-checkbox": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-3.1.0.tgz", + "integrity": "sha512-PAwpJFnBa3Ei+5pyqMMXdcKYKNBMS+TvSDiLdDnARnMJHC8ESxwPfm4Ao1gJiKtWLdmGfigascnCpwrHFgoOBQ==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.3.2", + "rc-util": "^5.25.2" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-collapse": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.7.0.tgz", + "integrity": "sha512-Cir1c89cENiK5wryd9ut+XltrIfx/+KH1/63uJIVjuXkgfrIvIy6W1fYGgEYtttbHW2fEfxg1s31W+Vm98fSRw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.3.4", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dialog": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.1.0.tgz", + "integrity": "sha512-5ry+JABAWEbaKyYsmITtrJbZbJys8CtMyzV8Xn4LYuXMeUx5XVHNyJRoqLFE4AzBuXXzOWeaC49cg+XkxK6kHA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/portal": "^1.0.0-8", + "classnames": "^2.2.6", + "rc-motion": "^2.3.0", + "rc-util": "^5.21.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-drawer": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-6.2.0.tgz", + "integrity": "sha512-spPkZ3WvP0U0vy5dyzSwlUJ/+vLFtjP/cTwSwejhQRoDBaexSZHsBhELoCZcEggI7LQ7typmtG30lAue2HEhvA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/portal": "^1.1.1", + "classnames": "^2.2.6", + "rc-motion": "^2.6.1", + "rc-util": "^5.21.2" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dropdown": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.1.0.tgz", + "integrity": "sha512-VZjMunpBdlVzYpEdJSaV7WM7O0jf8uyDjirxXLZRNZ+tAC+NzD3PXPEtliFwGzVwBBdCmGuSqiS9DWcOLxQ9tw==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@rc-component/trigger": "^1.7.0", + "classnames": "^2.2.6", + "rc-util": "^5.17.0" + }, + "peerDependencies": { + "react": ">=16.11.0", + "react-dom": ">=16.11.0" + } + }, + "node_modules/rc-field-form": { + "version": "1.34.2", + "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-1.34.2.tgz", + "integrity": "sha512-BdciU5C7dBO51/9ZKcMvK2f8zaaO12Lt1eBhlAo8nNv+6htlNcgY9DAkUlZ7gfyWjnCc1Oo4hHIXau1m6tLw1A==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "async-validator": "^4.1.0", + "rc-util": "^5.32.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-image": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-7.0.0.tgz", + "integrity": "sha512-pOr/LYthg5a+R2LDlFPv8u2ndX4aJQNghWCiWxflmLglC3p0uts/NIWLAituQOKvV1wO1aFI1CZtLMT7jrU3vA==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@rc-component/portal": "^1.0.2", + "classnames": "^2.2.6", + "rc-dialog": "~9.1.0", + "rc-motion": "^2.6.2", + "rc-util": "^5.34.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-input": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-1.1.0.tgz", + "integrity": "sha512-izuNXPABQPh4KD7ANFcTrIGp9EZU0FkjTw6AvwCQ/rGPrdDsUTHLsp/Wju/kzGMLJFJWKNF3smbmXRNO23DtXA==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.18.1" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-input-number": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-8.0.3.tgz", + "integrity": "sha512-GHfWvufXEmwF/wtR8oPZNTuMdFb/rvx/+Sp2bZfaPftM+LFFdO8o3/PaeTk8DKt0Tv+u5Zuf68lqLdGCkmAXRg==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/mini-decimal": "^1.0.1", + "classnames": "^2.2.5", + "rc-input": "~1.1.0", + "rc-util": "^5.28.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-mentions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.5.0.tgz", + "integrity": "sha512-rERXsbUTNVrb5T/iDC0ki/SRGWJnOVraDy6O25Us3FSpuUZ3uq2TPZB4fRk0Hss5kyiEPzz2sprhkI4b+F4jUw==", + "dependencies": { + "@babel/runtime": "^7.22.5", + "@rc-component/trigger": "^1.5.0", + "classnames": "^2.2.6", + "rc-input": "~1.1.0", + "rc-menu": "~9.10.0", + "rc-textarea": "~1.3.0", + "rc-util": "^5.22.5" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-menu": { + "version": "9.10.0", + "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.10.0.tgz", + "integrity": "sha512-g27kpXaAoJh/fkPZF65/d4V+w4DhDeqomBdPcGnkFAcJnEM4o21TnVccrBUoDedLKzC7wJRw1Q7VTqEsfEufmw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^1.6.2", + "classnames": "2.x", + "rc-motion": "^2.4.3", + "rc-overflow": "^1.3.1", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-motion": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.7.3.tgz", + "integrity": "sha512-2xUvo8yGHdOHeQbdI8BtBsCIrWKchEmFEIskf0nmHtJsou+meLd/JE+vnvSX2JxcBrJtXY2LuBpxAOxrbY/wMQ==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.21.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-notification": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-5.0.4.tgz", + "integrity": "sha512-3535oellIRlt1LspERfK8yvCqb8Gio3R02rULciaSc1xe3H7ArTU/khlUTv1ddGzua4HhmF4D4Rwz/+mBxETvg==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.6.0", + "rc-util": "^5.20.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-overflow": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.3.1.tgz", + "integrity": "sha512-RY0nVBlfP9CkxrpgaLlGzkSoh9JhjJLu6Icqs9E7CW6Ewh9s0peF9OHIex4OhfoPsR92LR0fN6BlCY9Z4VoUtA==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.19.2" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-pagination": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-3.5.0.tgz", + "integrity": "sha512-lUBVtVVUn7gGsq4mTyVpcZQr+AMcljbMiL/HcCmSdFrcsK0iZVKwwbXDxhz2IV0JXUs9Hzepr5sQFaF+9ad/pQ==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-util": "^5.32.2" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-picker": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-3.10.0.tgz", + "integrity": "sha512-Euki50qtEct6ByOeYlnA4TLs/LcXz7BAYS4cmCTKJ3dWg2sNTVtredLdbS9aJ/9fhMacxGAYAlcQJpQx+av43A==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^1.5.0", + "classnames": "^2.2.1", + "rc-util": "^5.30.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "date-fns": ">= 2.x", + "dayjs": ">= 1.x", + "luxon": ">= 3.x", + "moment": ">= 2.x", + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + }, + "peerDependenciesMeta": { + "date-fns": { + "optional": true + }, + "dayjs": { + "optional": true + }, + "luxon": { + "optional": true + }, + "moment": { + "optional": true + } + } + }, + "node_modules/rc-progress": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-3.4.2.tgz", + "integrity": "sha512-iAGhwWU+tsayP+Jkl9T4+6rHeQTG9kDz8JAHZk4XtQOcYN5fj9H34NXNEdRdZx94VUDHMqCb1yOIvi8eJRh67w==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-util": "^5.16.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-rate": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.12.0.tgz", + "integrity": "sha512-g092v5iZCdVzbjdn28FzvWebK2IutoVoiTeqoLTj9WM7SjA/gOJIw5/JFZMRyJYYVe1jLAU2UhAfstIpCNRozg==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.0.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-resize-observer": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.3.1.tgz", + "integrity": "sha512-iFUdt3NNhflbY3mwySv5CA1TC06zdJ+pfo0oc27xpf4PIOvfZwZGtD9Kz41wGYqC4SLio93RVAirSSpYlV/uYg==", + "dependencies": { + "@babel/runtime": "^7.20.7", + "classnames": "^2.2.1", + "rc-util": "^5.27.0", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-segmented": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.2.2.tgz", + "integrity": "sha512-Mq52M96QdHMsNdE/042ibT5vkcGcD5jxKp7HgPC2SRofpia99P5fkfHy1pEaajLMF/kj0+2Lkq1UZRvqzo9mSA==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-motion": "^2.4.4", + "rc-util": "^5.17.0" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-select": { + "version": "14.5.2", + "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.5.2.tgz", + "integrity": "sha512-Np/lDHvxCnVhVsheQjSV1I/OMJTWJf1n10wq8q1AGy3ytyYLfjNpi6uaz/pmjsbbiSddSWzJnNZCli9LmgBZsA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^1.5.0", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-overflow": "^1.0.0", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.5.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-slider": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-10.1.1.tgz", + "integrity": "sha512-gn8oXazZISEhnmRinI89Z/JD/joAaM35jp+gDtIVSTD/JJMCCBqThqLk1SVJmvtfeiEF/kKaFY0+qt4SDHFUDw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.27.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-steps": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-6.0.1.tgz", + "integrity": "sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g==", + "dependencies": { + "@babel/runtime": "^7.16.7", + "classnames": "^2.2.3", + "rc-util": "^5.16.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-switch": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-4.1.0.tgz", + "integrity": "sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "classnames": "^2.2.1", + "rc-util": "^5.30.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-table": { + "version": "7.32.1", + "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.32.1.tgz", + "integrity": "sha512-fHMQteKMocUC9I9Vex3eBLH7QsiaMR/qtzh3B1Ty2PoNGwVTwVdDFyRL05zch+JU3KnNNczgQeVvtf/p//gdrQ==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/context": "^1.3.0", + "classnames": "^2.2.5", + "rc-resize-observer": "^1.1.0", + "rc-util": "^5.27.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tabs": { + "version": "12.9.0", + "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-12.9.0.tgz", + "integrity": "sha512-2HnVowgMVrq0DfQtyu4mCd9E6pXlWNdM6VaDvOOHMsLYqPmpY+7zBqUC6YrrQ9xYXHciTS0e7TtjOHIvpVCHLQ==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "classnames": "2.x", + "rc-dropdown": "~4.1.0", + "rc-menu": "~9.10.0", + "rc-motion": "^2.6.2", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.16.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-textarea": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-1.3.3.tgz", + "integrity": "sha512-846kjD/RYZx/th32FW4T80IrRTt2dT7+kxdToI7pwzJPlsfmZyo8e2F2m0FLcvriv6rtAUMSqQRH1HC3i+sAbw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-input": "~1.1.0", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tooltip": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-6.0.1.tgz", + "integrity": "sha512-MdvPlsD1fDSxKp9+HjXrc/CxLmA/s11QYIh1R7aExxfodKP7CZA++DG1AjrW80F8IUdHYcR43HAm0Y2BYPelHA==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@rc-component/trigger": "^1.0.4", + "classnames": "^2.3.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tree": { + "version": "5.7.9", + "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.7.9.tgz", + "integrity": "sha512-1hKkToz/EVjJlMVwmZnpXeLXt/1iQMsaAq9m+GNkUbK746gkc7QpJXSN/TzjhTI5Hi+LOSlrMaXLMT0bHPqILQ==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.5.1" + }, + "engines": { + "node": ">=10.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-tree-select": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.9.0.tgz", + "integrity": "sha512-oh3blESzLfLCBPSiVDtZ2irzrWWZUMeHvnSwRvFo79br8Z+K/1OhXhXBZmROvfKwaH8YUugAQy8B2j5EGQbdyA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-select": "~14.5.0", + "rc-tree": "~5.7.0", + "rc-util": "^5.16.1" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-upload": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.3.4.tgz", + "integrity": "sha512-uVbtHFGNjHG/RyAfm9fluXB6pvArAGyAx8z7XzXXyorEgVIWj6mOlriuDm0XowDHYz4ycNK0nE0oP3cbFnzxiQ==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.5", + "rc-util": "^5.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-util": { + "version": "5.34.1", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.34.1.tgz", + "integrity": "sha512-SqiUT8Ssgh5C+hu4y887xwCrMNcxLm6ScOo8AFlWYYF3z9uNNiPpwwSjvicqOlWd79rNw1g44rnP7tz9MrO1ZQ==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "react-is": "^16.12.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-virtual-list": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.5.3.tgz", + "integrity": "sha512-rG6IuD4EYM8K6oZ8Shu2BC/CmcTdqng4yBWkc/5fjWhB20bl6QwR2Upyt7+MxvfscoVm8zOQY+tcpEO5cu4GaQ==", + "dependencies": { + "@babel/runtime": "^7.20.0", + "classnames": "^2.2.6", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.15.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, "node_modules/react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -3037,6 +4238,26 @@ "react": "^18.2.0" } }, + "node_modules/react-error-boundary": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-4.0.10.tgz", + "integrity": "sha512-pvVKdi77j2OoPHo+p3rorgE43OjDWiqFkaqkJz8sJKK6uf/u8xtzuaVfj5qJ2JnDLIgF1De3zY5AJDijp+LVPA==", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "peerDependencies": { + "react": ">=16.13.1" + } + }, + "node_modules/react-fast-marquee": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/react-fast-marquee/-/react-fast-marquee-1.6.0.tgz", + "integrity": "sha512-jtuwT9SNjrqxnE7lGZ8mTL1I8Q4+9G4aBta2p+y2Pa3SjR17QROblwrLICyM8rbjQFHgHawTHcaH9HvoVO2NOA==", + "peerDependencies": { + "react": ">= 16.8.0 || 18.0.0", + "react-dom": ">= 16.8.0 || 18.0.0" + } + }, "node_modules/react-icons": { "version": "4.9.0", "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.9.0.tgz", @@ -3045,11 +4266,40 @@ "react": "*" } }, + "node_modules/react-intersection-observer": { + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-9.5.1.tgz", + "integrity": "sha512-YwcNF/4WsMAG1rLVDQHSbpdEW9vDaIl4QW88d+vqeXNUewFV4AJDQB14oHpAJ3rRCnKRmwu3nqfwwYe6wioNIg==", + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, + "node_modules/react-lazy-load-image-component": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/react-lazy-load-image-component/-/react-lazy-load-image-component-1.6.0.tgz", + "integrity": "sha512-8KFkDTgjh+0+PVbH+cx0AgxLGbdTsxWMnxXzU5HEUztqewk9ufQAu8cstjZhyvtMIPsdMcPZfA0WAa7HtjQbBQ==", + "dependencies": { + "lodash.debounce": "^4.0.8", + "lodash.throttle": "^4.1.1" + }, + "peerDependencies": { + "react": "^15.x.x || ^16.x.x || ^17.x.x || ^18.x.x", + "react-dom": "^15.x.x || ^16.x.x || ^17.x.x || ^18.x.x" + } + }, + "node_modules/react-loading-skeleton": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/react-loading-skeleton/-/react-loading-skeleton-3.3.1.tgz", + "integrity": "sha512-NilqqwMh2v9omN7LteiDloEVpFyMIa0VGqF+ukqp0ncVlYu1sKYbYGX9JEl+GtOT9TKsh04zCHAbavnQ2USldA==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, "node_modules/react-refresh": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", @@ -3089,6 +4339,57 @@ "react-dom": ">=16.8" } }, + "node_modules/react-spinners-kit": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/react-spinners-kit/-/react-spinners-kit-1.9.1.tgz", + "integrity": "sha512-QtAvSD7b1WkThY3pRKu6Sr+DZafnEufoOvug/uHprkKyZK6bg6TG5LC3Sy3JaRh6A/HACIcTNEWG+Ls0YDoSHg==", + "dependencies": { + "polished": "^1.9.3", + "prop-types": "^15.6.2", + "react": "^16.12.0", + "react-dom": "^16.12.0", + "styled-components": "^4.4.1" + }, + "peerDependencies": { + "styled-components": ">=2.0.0" + } + }, + "node_modules/react-spinners-kit/node_modules/react": { + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", + "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-spinners-kit/node_modules/react-dom": { + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", + "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.19.1" + }, + "peerDependencies": { + "react": "^16.14.0" + } + }, + "node_modules/react-spinners-kit/node_modules/scheduler": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", + "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, "node_modules/react-split": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/react-split/-/react-split-2.0.14.tgz", @@ -3105,6 +4406,9 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "optional": true, + "peer": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -3112,6 +4416,11 @@ "node": ">=8.10.0" } }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, "node_modules/request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -3156,6 +4465,11 @@ "node": ">= 0.12" } }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -3257,6 +4571,9 @@ "version": "1.62.1", "resolved": "https://registry.npmjs.org/sass/-/sass-1.62.1.tgz", "integrity": "sha512-NHpxIzN29MXvWiuswfc1W3I0N8SXBd8UR26WntmDlRYf0bSADnwnOjsyMZ3lMezSlArD33Vs3YFhp7dWvL770A==", + "dev": true, + "optional": true, + "peer": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -3277,6 +4594,14 @@ "loose-envify": "^1.1.0" } }, + "node_modules/scroll-into-view-if-needed": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.0.10.tgz", + "integrity": "sha512-t44QCeDKAPf1mtQH3fYpWz8IM/DyvHLjs8wUvvwMYxk5moOqCzrMSxK6HQVD0QVmVjXFavoFIPRVrMuJPKAvtg==", + "dependencies": { + "compute-scroll-into-view": "^3.0.2" + } + }, "node_modules/semver": { "version": "7.5.1", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", @@ -3344,10 +4669,22 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, "engines": { "node": ">=0.10.0" } }, + "node_modules/split-on-first": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-3.0.0.tgz", + "integrity": "sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/split.js": { "version": "1.6.5", "resolved": "https://registry.npmjs.org/split.js/-/split.js-1.6.5.tgz", @@ -3377,6 +4714,11 @@ "node": ">=0.10.0" } }, + "node_modules/string-convert": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", + "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==" + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -3401,11 +4743,48 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/styled-components": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-4.4.1.tgz", + "integrity": "sha512-RNqj14kYzw++6Sr38n7197xG33ipEOktGElty4I70IKzQF1jzaD1U4xQ+Ny/i03UUhHlC5NWEO+d8olRCDji6g==", + "hasInstallScript": true, + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@emotion/is-prop-valid": "^0.8.1", + "@emotion/unitless": "^0.7.0", + "babel-plugin-styled-components": ">= 1", + "css-to-react-native": "^2.2.2", + "memoize-one": "^5.0.0", + "merge-anything": "^2.2.4", + "prop-types": "^15.5.4", + "react-is": "^16.6.0", + "stylis": "^3.5.0", + "stylis-rule-sheet": "^0.0.10", + "supports-color": "^5.5.0" + }, + "peerDependencies": { + "react": ">= 16.3.0", + "react-dom": ">= 16.3.0" + } + }, + "node_modules/stylis": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.4.tgz", + "integrity": "sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q==" + }, + "node_modules/stylis-rule-sheet": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz", + "integrity": "sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw==", + "peerDependencies": { + "stylis": "^3.5.0" + } + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -3419,6 +4798,14 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "node_modules/throttle-debounce": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.0.tgz", + "integrity": "sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==", + "engines": { + "node": ">=12.22" + } + }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -3428,7 +4815,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, "engines": { "node": ">=4" } @@ -3437,6 +4823,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -3444,6 +4831,11 @@ "node": ">=8.0" } }, + "node_modules/toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" + }, "node_modules/tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -3539,7 +4931,6 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", - "dev": true, "funding": [ { "type": "opencollective", @@ -3573,6 +4964,19 @@ "punycode": "^2.1.0" } }, + "node_modules/usehooks-ts": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/usehooks-ts/-/usehooks-ts-2.9.1.tgz", + "integrity": "sha512-2FAuSIGHlY+apM9FVlj8/oNhd+1y+Uwv5QNkMQz1oSfdHk4PXo1qoCw9I5M7j0vpH8CSWFJwXbVPeYDjLCx9PA==", + "engines": { + "node": ">=16.15.0", + "npm": ">=8" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", @@ -3676,8 +5080,7 @@ "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "node_modules/yocto-queue": { "version": "0.1.0", diff --git a/package.json b/package.json index 04f0206..b58c572 100644 --- a/package.json +++ b/package.json @@ -1,30 +1,51 @@ { + "author": { + "name": "Tuan Dang", + "email": "tuandangit2004@gmail.com", + "url": "https://github.com/tuan204-dev" + }, "name": "spotify-react", + "description": "Spotify clone with React - TS", "private": true, "version": "0.0.0", "type": "module", + "license": "MIT", "scripts": { - "dev": "vite --port 5000", + "dev": "vite --port 5000 --host", "build": "tsc && vite build", "lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0", - "preview": "vite preview" + "preview": "vite preview --port 5001 --host" }, "dependencies": { "@types/node": "^20.2.5", + "antd": "^5.7.1", "axios": "^1.4.0", "classnames": "^2.3.2", + "color-thief-react": "^2.1.0", "colorthief": "^2.4.0", + "he": "^1.2.0", "normalize.css": "^8.0.1", + "query-string": "^8.1.0", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-error-boundary": "^4.0.10", + "react-fast-marquee": "^1.6.0", "react-icons": "^4.9.0", + "react-intersection-observer": "^9.5.1", + "react-lazy-load-image-component": "^1.6.0", + "react-loading-skeleton": "^3.3.1", "react-router-dom": "^6.11.2", + "react-spinners-kit": "^1.9.1", "react-split": "^2.0.14", - "sass": "^1.62.1" + "usehooks-ts": "^2.9.1" }, "devDependencies": { + "@types/he": "^1.2.0", + "@types/jsdom": "^21.1.1", "@types/react": "^18.0.37", "@types/react-dom": "^18.0.11", + "@types/react-lazy-load-image-component": "^1.5.3", + "@types/react-modal": "^3.16.0", "@typescript-eslint/eslint-plugin": "^5.59.0", "@typescript-eslint/parser": "^5.59.0", "@vitejs/plugin-react": "^4.0.0", @@ -33,5 +54,9 @@ "eslint-plugin-react-refresh": "^0.3.4", "typescript": "^5.0.2", "vite": "^4.3.9" + }, + "repository": { + "type": "github", + "url": "https://github.com/tuan204-dev/spotify-react-typescript" } } diff --git a/public/data/00001.json b/public/data/00001.json new file mode 100644 index 0000000..ca09572 --- /dev/null +++ b/public/data/00001.json @@ -0,0 +1,57 @@ +{ + "title": "Trending now", + "id": "00001", + "dataType": "album", + "data": [ + { + "title": "The Idol Episode 4 (Music from the HBO Original Series) by The Weeknd, JENNIE, Lily-Rose Depp", + "imageUrl": "https://i.scdn.co/image/ab67616d00001e02b0dd6a5cd1dec96c4119c262", + "id": "7tzVd1fwkxsorytCBjEJkU" + }, + { + "title": "Cái Đầu Tiên by Thắng", + "imageUrl": "https://i.scdn.co/image/ab67616d00001e02fa201fc6fbffdd089791821a", + "id": "5jDZKqgoVRbob6A3omYTG5" + }, + { + "title": "Rap Việt Mùa 3 (2023) - Tập 4 by RAP VIỆT\"", + "imageUrl": "https://i.scdn.co/image/ab67616d00001e02796df877653ca8f3b5f7cf87", + "id": "5L4uvdh4HyCTBVK6z11jpp" + }, + { + "title": "Over The Moon by MONSTAR", + "imageUrl": "https://i.scdn.co/image/ab67616d00001e0299276d38ab4b2720f14d1c69", + "id": "4bC0p7T5Wy2kqCuQ0uK4D7" + }, + { + "title": "Chơi Như Tụi Mỹ by Andree Right Hand\"", + "imageUrl": "https://i.scdn.co/image/ab67616d00001e02001da1cf1c6860392a1380af", + "id": "7qPMuPHg2shbQIGyxOd09A" + }, + { + "title": "Đi Về Nhà by Đen, JustaTee\"", + "imageUrl": "https://i.scdn.co/image/ab67616d00001e022a8efe3bfa6a605fcf863237", + "id": "7C3WHnNZ5zcUutPtsB7KjD" + }, + { + "title": "Mở Mắt by Lil Wuyn, Đen", + "imageUrl": "https://i.scdn.co/image/ab67616d00001e027d1cdf26b5a2b32cebc58673", + "id": "3cOInDOxGhxcFM4fqbQjXb" + }, + { + "title": "BADBYE by WEAN", + "imageUrl": "https://i.scdn.co/image/ab67616d00001e023554301cfe1463752565a605", + "id": "32QMQlxOQ5tzhUflb30ATX" + }, + { + "title": "Melo-Đi EP.04 by CARA, JSOL, Hoàng Duyên\"", + "imageUrl": "https://i.scdn.co/image/ab67616d00001e02041ed75f9d22673c5c23e436", + "id": "0PXT06Gj4tM6wFGJbijhNX" + }, + { + "title": "Đợi (2023 Version) by Vũ.\"", + "imageUrl": "https://i.scdn.co/image/ab67616d00001e02385416f19c7245e71d058a7a", + "id": "2vTdOr9up0LbB9pIoa70Dm" + } + ] +} diff --git a/public/data/00002.json b/public/data/00002.json new file mode 100644 index 0000000..088ea6c --- /dev/null +++ b/public/data/00002.json @@ -0,0 +1,57 @@ +{ + "title": "Top mixes", + "id": "00002", + "dataType": "playlist", + "data": [ + { + "title": "Pop Mix", + "imageUrl": "https://seed-mix-image.spotifycdn.com/v6/img/pop/4xnihxcoXWK3UqryOSnbw5/en/default", + "id": "37i9dQZF1EQncLwOalG3K7" + }, + { + "title": "R&B Mix", + "imageUrl": "https://seed-mix-image.spotifycdn.com/v6/img/r_and_b/7tYKF4w9nC0nq9CsPZTHyP/en/default", + "id": "37i9dQZF1EQoqCH7BwIYb7" + }, + { + "title": "RPT MCK Mix", + "imageUrl": "https://seed-mix-image.spotifycdn.com/v6/img/artist/1zSv9qZANOWB4HRE8sxeTL/vi/default", + "id": "37i9dQZF1EIYlLpgHrOJax" + }, + { + "title": "2010s Mix", + "imageUrl": "https://seed-mix-image.spotifycdn.com/v6/img/twenty_tens/5IH6FPUwQTxPSXurCrcIov/en/default", + "id": "37i9dQZF1EQqedj0y9Uwvu" + }, + { + "title": "Chill Mix", + "imageUrl": "https://seed-mix-image.spotifycdn.com/v6/img/chill/0wJWawRvX8K9joiK9QqkX5/en/default", + "id": "37i9dQZF1EVHGWrwldPRtj" + }, + { + "title": "K-Pop Mix", + "imageUrl": "https://seed-mix-image.spotifycdn.com/v6/img/k_pop/2AfmfGFbe0A0WsTYm0SDTx/en/default", + "id": "37i9dQZF1EQpesGsmIyqcW" + }, + { + "title": "Sơn Tùng M-TP Mix", + "imageUrl": "https://seed-mix-image.spotifycdn.com/v6/img/artist/5dfZ5uSmzR7VQK0udbAVpf/vi/default", + "id": "37i9dQZF1EIYVFZyV5RRx0" + }, + { + "title": "2000s Mix", + "imageUrl": "https://seed-mix-image.spotifycdn.com/v6/img/two_thousands/04gDigrS5kc9YWfZHwBETP/en/default", + "id": "37i9dQZF1EQn4jwNIohw50" + }, + { + "title": "Moody Mix", + "imageUrl": "https://seed-mix-image.spotifycdn.com/v6/img/moody/5IH6FPUwQTxPSXurCrcIov/en/default", + "id": "37i9dQZF1EVKuMoAJjoTIw" + }, + { + "title": "Hip Hop Mix", + "imageUrl": "https://seed-mix-image.spotifycdn.com/v6/img/hip_hop/4grjJqg7iwQ8RKHs8d9Snh/en/default", + "id": "37i9dQZF1EQnqst5TRi17F" + } + ] +} diff --git a/public/data/00003.json b/public/data/00003.json new file mode 100644 index 0000000..480fd52 --- /dev/null +++ b/public/data/00003.json @@ -0,0 +1,475 @@ +{ + "title": "Playlists", + "href": "/section/00003", + "dataType": "playlist", + "data": [ + { + "collaborative": false, + "description": "Khám phá 🎶 đáng nghe từ những 🎼 có thể bạn chưa biết. Ảnh bìa: Juliet; thiết kế: Isu Kim", + "external_urls": { + "spotify": "https://open.spotify.com/playlist/37i9dQZF1DX34s4fg4Zx3Z" + }, + "href": "https://api.spotify.com/v1/playlists/37i9dQZF1DX34s4fg4Zx3Z", + "id": "37i9dQZF1DX34s4fg4Zx3Z", + "images": [ + { + "height": null, + "url": "https://i.scdn.co/image/ab67706f000000039575ee708249f9226995af2e", + "width": null + } + ], + "name": "Fresh Finds Vietnam", + "owner": { + "display_name": "Spotify", + "external_urls": { + "spotify": "https://open.spotify.com/user/spotify" + }, + "href": "https://api.spotify.com/v1/users/spotify", + "id": "spotify", + "type": "user", + "uri": "spotify:user:spotify" + }, + "primary_color": null, + "public": null, + "snapshot_id": "MTY4Nzc0MDgwMywwMDAwMDAwMDQ0NGNlYTUxODFkYzFmZmFjZDE3MjYzNjg3MjFkMTdl", + "tracks": { + "href": "https://api.spotify.com/v1/playlists/37i9dQZF1DX34s4fg4Zx3Z/tracks", + "total": 101 + }, + "type": "playlist", + "uri": "spotify:playlist:37i9dQZF1DX34s4fg4Zx3Z" + }, + { + "collaborative": false, + "description": "Nhịp sống sôi động của đường phố. Ảnh bìa: Hoàng Yến Chibi", + "external_urls": { + "spotify": "https://open.spotify.com/playlist/37i9dQZF1DX3pJ8DlmnZlN" + }, + "href": "https://api.spotify.com/v1/playlists/37i9dQZF1DX3pJ8DlmnZlN", + "id": "37i9dQZF1DX3pJ8DlmnZlN", + "images": [ + { + "height": null, + "url": "https://i.scdn.co/image/ab67706f000000035c46984cb6a999df82193de7", + "width": null + } + ], + "name": "Phố Xá Xôn Xao", + "owner": { + "display_name": "Spotify", + "external_urls": { + "spotify": "https://open.spotify.com/user/spotify" + }, + "href": "https://api.spotify.com/v1/users/spotify", + "id": "spotify", + "type": "user", + "uri": "spotify:user:spotify" + }, + "primary_color": null, + "public": null, + "snapshot_id": "MTY4Nzk0NDI0MiwwMDAwMDAwMDZiNTJiNTkyMDc3NGVkZWYwOTc5MjkwYTQ5MWJlYjc4", + "tracks": { + "href": "https://api.spotify.com/v1/playlists/37i9dQZF1DX3pJ8DlmnZlN/tracks", + "total": 75 + }, + "type": "playlist", + "uri": "spotify:playlist:37i9dQZF1DX3pJ8DlmnZlN" + }, + { + "collaborative": false, + "description": "Everyday should be a happy day when you listen to this fun K-Pop playlist.", + "external_urls": { + "spotify": "https://open.spotify.com/playlist/37i9dQZF1DX1uG5byNIgDA" + }, + "href": "https://api.spotify.com/v1/playlists/37i9dQZF1DX1uG5byNIgDA", + "id": "37i9dQZF1DX1uG5byNIgDA", + "images": [ + { + "height": null, + "url": "https://i.scdn.co/image/ab67706f00000003f3b6bb29b26d52b3ec5dc3b1", + "width": null + } + ], + "name": "Morning K-Pop!", + "owner": { + "display_name": "Spotify", + "external_urls": { + "spotify": "https://open.spotify.com/user/spotify" + }, + "href": "https://api.spotify.com/v1/users/spotify", + "id": "spotify", + "type": "user", + "uri": "spotify:user:spotify" + }, + "primary_color": null, + "public": null, + "snapshot_id": "MTY4Njg0MTEyOSwwMDAwMDAwMGYyYWU0MTI1Njg4NTQxMjczMGYyMDViYzk5ZTUxYTdj", + "tracks": { + "href": "https://api.spotify.com/v1/playlists/37i9dQZF1DX1uG5byNIgDA/tracks", + "total": 50 + }, + "type": "playlist", + "uri": "spotify:playlist:37i9dQZF1DX1uG5byNIgDA" + }, + { + "collaborative": false, + "description": "\u001dNhững gì mà người bên cạnh bạn đang nghe. Ảnh bìa: Lil Wuyn, Đen", + "external_urls": { + "spotify": "https://open.spotify.com/playlist/37i9dQZF1DWVOaOWiVD1Lf" + }, + "href": "https://api.spotify.com/v1/playlists/37i9dQZF1DWVOaOWiVD1Lf", + "id": "37i9dQZF1DWVOaOWiVD1Lf", + "images": [ + { + "height": null, + "url": "https://i.scdn.co/image/ab67706f00000003938c6b8a394ddd001d108ea9", + "width": null + } + ], + "name": "Thiên Hạ Nghe Gì", + "owner": { + "display_name": "Spotify", + "external_urls": { + "spotify": "https://open.spotify.com/user/spotify" + }, + "href": "https://api.spotify.com/v1/users/spotify", + "id": "spotify", + "type": "user", + "uri": "spotify:user:spotify" + }, + "primary_color": null, + "public": null, + "snapshot_id": "MTY4NzkzOTMwNSwwMDAwMDAwMDUyMGY3OTY2OTBhOTg0OGU1YzYwMTZjMjZiMzFlMzQ1", + "tracks": { + "href": "https://api.spotify.com/v1/playlists/37i9dQZF1DWVOaOWiVD1Lf/tracks", + "total": 100 + }, + "type": "playlist", + "uri": "spotify:playlist:37i9dQZF1DWVOaOWiVD1Lf" + }, + { + "collaborative": false, + "description": "Mấy bài này chill phết", + "external_urls": { + "spotify": "https://open.spotify.com/playlist/37i9dQZF1DX35zmlYTBMjk" + }, + "href": "https://api.spotify.com/v1/playlists/37i9dQZF1DX35zmlYTBMjk", + "id": "37i9dQZF1DX35zmlYTBMjk", + "images": [ + { + "height": null, + "url": "https://i.scdn.co/image/ab67706f0000000311454569fd4ff378b24d6beb", + "width": null + } + ], + "name": "Lofi Chill Để Thư Giãn", + "owner": { + "display_name": "Spotify", + "external_urls": { + "spotify": "https://open.spotify.com/user/spotify" + }, + "href": "https://api.spotify.com/v1/users/spotify", + "id": "spotify", + "type": "user", + "uri": "spotify:user:spotify" + }, + "primary_color": null, + "public": null, + "snapshot_id": "MTY4NjgzNjU5MywwMDAwMDAwMDVlZjNiYjA4NmYzNmE2YTk2ZDY2ZTJlMTVjYjM3ODc1", + "tracks": { + "href": "https://api.spotify.com/v1/playlists/37i9dQZF1DX35zmlYTBMjk/tracks", + "total": 147 + }, + "type": "playlist", + "uri": "spotify:playlist:37i9dQZF1DX35zmlYTBMjk" + }, + { + "collaborative": false, + "description": "Những ca khúc để đời của dòng nhạc vàng. Ảnh bìa: Như Quỳnh", + "external_urls": { + "spotify": "https://open.spotify.com/playlist/37i9dQZF1DWWdlSG3xntgM" + }, + "href": "https://api.spotify.com/v1/playlists/37i9dQZF1DWWdlSG3xntgM", + "id": "37i9dQZF1DWWdlSG3xntgM", + "images": [ + { + "height": null, + "url": "https://i.scdn.co/image/ab67706f0000000399d28c7a1209378936cb560a", + "width": null + } + ], + "name": "Bolero Tuyệt Phẩm", + "owner": { + "display_name": "Spotify", + "external_urls": { + "spotify": "https://open.spotify.com/user/spotify" + }, + "href": "https://api.spotify.com/v1/users/spotify", + "id": "spotify", + "type": "user", + "uri": "spotify:user:spotify" + }, + "primary_color": null, + "public": null, + "snapshot_id": "MTY4NjkyMTE5OCwwMDAwMDAwMDFiMTdiMTU1ZjEwNDZlODg1ZTA0NTNjNWJjYjExZmMy", + "tracks": { + "href": "https://api.spotify.com/v1/playlists/37i9dQZF1DWWdlSG3xntgM/tracks", + "total": 50 + }, + "type": "playlist", + "uri": "spotify:playlist:37i9dQZF1DWWdlSG3xntgM" + }, + { + "collaborative": false, + "description": "Beautiful songs to give you that warm, fuzzy feeling.", + "external_urls": { + "spotify": "https://open.spotify.com/playlist/37i9dQZF1DX5IDTimEWoTd" + }, + "href": "https://api.spotify.com/v1/playlists/37i9dQZF1DX5IDTimEWoTd", + "id": "37i9dQZF1DX5IDTimEWoTd", + "images": [ + { + "height": null, + "url": "https://i.scdn.co/image/ab67706f00000003fd5512c007a869c4c8a9bca6", + "width": null + } + ], + "name": "Warm Fuzzy Feeling", + "owner": { + "display_name": "Spotify", + "external_urls": { + "spotify": "https://open.spotify.com/user/spotify" + }, + "href": "https://api.spotify.com/v1/users/spotify", + "id": "spotify", + "type": "user", + "uri": "spotify:user:spotify" + }, + "primary_color": null, + "public": null, + "snapshot_id": "MTY4NzQ5MjgwMCwwMDAwMDAwMDJmNDMzOTRiZmRlNDliMTg1YjdhZWMxYzVmOTRhY2Rm", + "tracks": { + "href": "https://api.spotify.com/v1/playlists/37i9dQZF1DX5IDTimEWoTd/tracks", + "total": 100 + }, + "type": "playlist", + "uri": "spotify:playlist:37i9dQZF1DX5IDTimEWoTd" + }, + { + "collaborative": false, + "description": "Cười như mọi ngày, cày như mọi người. Ảnh bìa: Phương Mỹ Chi", + "external_urls": { + "spotify": "https://open.spotify.com/playlist/37i9dQZF1DX0PE4eN3rxsW" + }, + "href": "https://api.spotify.com/v1/playlists/37i9dQZF1DX0PE4eN3rxsW", + "id": "37i9dQZF1DX0PE4eN3rxsW", + "images": [ + { + "height": null, + "url": "https://i.scdn.co/image/ab67706f000000039ec5d912c2810324789355ae", + "width": null + } + ], + "name": "Ta Nói Nó Dzui", + "owner": { + "display_name": "Spotify", + "external_urls": { + "spotify": "https://open.spotify.com/user/spotify" + }, + "href": "https://api.spotify.com/v1/users/spotify", + "id": "spotify", + "type": "user", + "uri": "spotify:user:spotify" + }, + "primary_color": null, + "public": null, + "snapshot_id": "MTY4NzkxMzQ1MywwMDAwMDAwMDQyM2UxZTljNjMzYjc5YjgyN2NkYWUzMDg0NThhODc0", + "tracks": { + "href": "https://api.spotify.com/v1/playlists/37i9dQZF1DX0PE4eN3rxsW/tracks", + "total": 57 + }, + "type": "playlist", + "uri": "spotify:playlist:37i9dQZF1DX0PE4eN3rxsW" + }, + { + "collaborative": false, + "description": "Listen to all the tracks you've been missing. Cover: Katy Perry", + "external_urls": { + "spotify": "https://open.spotify.com/playlist/37i9dQZF1DX0s5kDXi1oC5" + }, + "href": "https://api.spotify.com/v1/playlists/37i9dQZF1DX0s5kDXi1oC5", + "id": "37i9dQZF1DX0s5kDXi1oC5", + "images": [ + { + "height": null, + "url": "https://i.scdn.co/image/ab67706f000000034477d03df61b0379b33f8e4f", + "width": null + } + ], + "name": "Hit Rewind", + "owner": { + "display_name": "Spotify", + "external_urls": { + "spotify": "https://open.spotify.com/user/spotify" + }, + "href": "https://api.spotify.com/v1/users/spotify", + "id": "spotify", + "type": "user", + "uri": "spotify:user:spotify" + }, + "primary_color": null, + "public": null, + "snapshot_id": "MTY4NjkyMDU3MSwwMDAwMDAwMDBiMjQwYTNhYjc2NjU0YTE2MmJhYTc2YTE1MTNkMWY5", + "tracks": { + "href": "https://api.spotify.com/v1/playlists/37i9dQZF1DX0s5kDXi1oC5/tracks", + "total": 100 + }, + "type": "playlist", + "uri": "spotify:playlist:37i9dQZF1DX0s5kDXi1oC5" + }, + { + "collaborative": false, + "description": "Feel great with these timelessly fun songs!", + "external_urls": { + "spotify": "https://open.spotify.com/playlist/37i9dQZF1DX7KNKjOK0o75" + }, + "href": "https://api.spotify.com/v1/playlists/37i9dQZF1DX7KNKjOK0o75", + "id": "37i9dQZF1DX7KNKjOK0o75", + "images": [ + { + "height": null, + "url": "https://i.scdn.co/image/ab67706f0000000386e40f3121af6df6566051c9", + "width": null + } + ], + "name": "Have a Great Day!", + "owner": { + "display_name": "Spotify", + "external_urls": { + "spotify": "https://open.spotify.com/user/spotify" + }, + "href": "https://api.spotify.com/v1/users/spotify", + "id": "spotify", + "type": "user", + "uri": "spotify:user:spotify" + }, + "primary_color": null, + "public": null, + "snapshot_id": "MTY4NjkyMDM3MiwwMDAwMDAwMGRjYTI5MjdjNDlmZDBlMjE1ZDY2ZDViNjQ2MzI3ZjBi", + "tracks": { + "href": "https://api.spotify.com/v1/playlists/37i9dQZF1DX7KNKjOK0o75/tracks", + "total": 80 + }, + "type": "playlist", + "uri": "spotify:playlist:37i9dQZF1DX7KNKjOK0o75" + }, + { + "collaborative": false, + "description": "A selection of new, quality electro sounds from your favorite EDM acts! Cover: Two Friends x Loud Luxury x Bebe Rexha", + "external_urls": { + "spotify": "https://open.spotify.com/playlist/37i9dQZF1DWW668oFRU96k" + }, + "href": "https://api.spotify.com/v1/playlists/37i9dQZF1DWW668oFRU96k", + "id": "37i9dQZF1DWW668oFRU96k", + "images": [ + { + "height": null, + "url": "https://i.scdn.co/image/ab67706f00000003ad52ef9870dd102ab97dc0d3", + "width": null + } + ], + "name": "Electro Mix", + "owner": { + "display_name": "Spotify", + "external_urls": { + "spotify": "https://open.spotify.com/user/spotify" + }, + "href": "https://api.spotify.com/v1/users/spotify", + "id": "spotify", + "type": "user", + "uri": "spotify:user:spotify" + }, + "primary_color": null, + "public": null, + "snapshot_id": "MTY4NzQ4ODI4OSwwMDAwMDAwMDY5N2EyNDQxMWE3NzlhYjZhZWUwMzA5NTdjODU5YjU2", + "tracks": { + "href": "https://api.spotify.com/v1/playlists/37i9dQZF1DWW668oFRU96k/tracks", + "total": 62 + }, + "type": "playlist", + "uri": "spotify:playlist:37i9dQZF1DWW668oFRU96k" + }, + { + "collaborative": false, + "description": "V-Pop nở hoa trên những ca khúc này. Ảnh bìa: GREY D", + "external_urls": { + "spotify": "https://open.spotify.com/playlist/37i9dQZF1DX4g8Gs5nUhpp" + }, + "href": "https://api.spotify.com/v1/playlists/37i9dQZF1DX4g8Gs5nUhpp", + "id": "37i9dQZF1DX4g8Gs5nUhpp", + "images": [ + { + "height": null, + "url": "https://i.scdn.co/image/ab67706f000000030c49671f948cc64e836b05f6", + "width": null + } + ], + "name": "V-Pop Không Thể Thiếu", + "owner": { + "display_name": "Spotify", + "external_urls": { + "spotify": "https://open.spotify.com/user/spotify" + }, + "href": "https://api.spotify.com/v1/users/spotify", + "id": "spotify", + "type": "user", + "uri": "spotify:user:spotify" + }, + "primary_color": null, + "public": null, + "snapshot_id": "MTY4NzQ1MzIwMCwwMDAwMDAwMDZmMjlhMDBkNWYwZGExNDMwYzFmNGI5NGE4ODQ0YjYz", + "tracks": { + "href": "https://api.spotify.com/v1/playlists/37i9dQZF1DX4g8Gs5nUhpp/tracks", + "total": 56 + }, + "type": "playlist", + "uri": "spotify:playlist:37i9dQZF1DX4g8Gs5nUhpp" + }, + { + "collaborative": false, + "description": "The biggest songs of the 2000s. ", + "external_urls": { + "spotify": "https://open.spotify.com/playlist/37i9dQZF1DX4o1oenSJRJd" + }, + "href": "https://api.spotify.com/v1/playlists/37i9dQZF1DX4o1oenSJRJd", + "id": "37i9dQZF1DX4o1oenSJRJd", + "images": [ + { + "height": null, + "url": "https://i.scdn.co/image/ab67706f0000000360db6e919db3da9638b4ab00", + "width": null + } + ], + "name": "All Out 2000s", + "owner": { + "display_name": "Spotify", + "external_urls": { + "spotify": "https://open.spotify.com/user/spotify" + }, + "href": "https://api.spotify.com/v1/users/spotify", + "id": "spotify", + "type": "user", + "uri": "spotify:user:spotify" + }, + "primary_color": null, + "public": null, + "snapshot_id": "MTY4NzIzNTk0NSwwMDAwMDAwMDljYmVhYjQwZDk3NzlkNTBlMDhlMGRjYmEwYmJmZDZk", + "tracks": { + "href": "https://api.spotify.com/v1/playlists/37i9dQZF1DX4o1oenSJRJd/tracks", + "total": 150 + }, + "type": "playlist", + "uri": "spotify:playlist:37i9dQZF1DX4o1oenSJRJd" + } + ] +} diff --git a/public/data/00004.json b/public/data/00004.json new file mode 100644 index 0000000..d4b0c87 --- /dev/null +++ b/public/data/00004.json @@ -0,0 +1,1002 @@ +{ + "title": "Artists", + "href": "/section/00004", + "dataType": "artist", + "data": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1Xyo4u8uXC1ZmMpatF05PJ" + }, + "followers": { + "href": null, + "total": 66997867 + }, + "genres": ["canadian contemporary r&b", "canadian pop", "pop"], + "href": "https://api.spotify.com/v1/artists/1Xyo4u8uXC1ZmMpatF05PJ", + "id": "1Xyo4u8uXC1ZmMpatF05PJ", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab6761610000e5eb01b9b4ec2a05d0805428acfa", + "width": 640 + }, + { + "height": 320, + "url": "https://i.scdn.co/image/ab6761610000517401b9b4ec2a05d0805428acfa", + "width": 320 + }, + { + "height": 160, + "url": "https://i.scdn.co/image/ab6761610000f17801b9b4ec2a05d0805428acfa", + "width": 160 + } + ], + "name": "The Weeknd", + "popularity": 95, + "type": "artist", + "uri": "spotify:artist:1Xyo4u8uXC1ZmMpatF05PJ" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1oD9fKbb7qQ2nhn9JJC24F" + }, + "followers": { + "href": null, + "total": 40850 + }, + "genres": [], + "href": "https://api.spotify.com/v1/artists/1oD9fKbb7qQ2nhn9JJC24F", + "id": "1oD9fKbb7qQ2nhn9JJC24F", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab6761610000e5ebc196ed35d9425d0abe9d2f63", + "width": 640 + }, + { + "height": 320, + "url": "https://i.scdn.co/image/ab67616100005174c196ed35d9425d0abe9d2f63", + "width": 320 + }, + { + "height": 160, + "url": "https://i.scdn.co/image/ab6761610000f178c196ed35d9425d0abe9d2f63", + "width": 160 + } + ], + "name": "Thắng", + "popularity": 53, + "type": "artist", + "uri": "spotify:artist:1oD9fKbb7qQ2nhn9JJC24F" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/23xCr75lKvnFvKi8ImHE7S" + }, + "followers": { + "href": null, + "total": 228197 + }, + "genres": ["v-pop", "vietnamese hip hop"], + "href": "https://api.spotify.com/v1/artists/23xCr75lKvnFvKi8ImHE7S", + "id": "23xCr75lKvnFvKi8ImHE7S", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab6761610000e5eb3edad601de71d029b73c620c", + "width": 640 + }, + { + "height": 320, + "url": "https://i.scdn.co/image/ab676161000051743edad601de71d029b73c620c", + "width": 320 + }, + { + "height": 160, + "url": "https://i.scdn.co/image/ab6761610000f1783edad601de71d029b73c620c", + "width": 160 + } + ], + "name": "Táo", + "popularity": 45, + "type": "artist", + "uri": "spotify:artist:23xCr75lKvnFvKi8ImHE7S" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3diftVOq7aEIebXKkC34oR" + }, + "followers": { + "href": null, + "total": 378115 + }, + "genres": [ + "indie viet", + "v-pop", + "vietnamese hip hop", + "vietnamese melodic rap" + ], + "href": "https://api.spotify.com/v1/artists/3diftVOq7aEIebXKkC34oR", + "id": "3diftVOq7aEIebXKkC34oR", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab6761610000e5ebbde8a1370ee2b335a8f967a5", + "width": 640 + }, + { + "height": 320, + "url": "https://i.scdn.co/image/ab67616100005174bde8a1370ee2b335a8f967a5", + "width": 320 + }, + { + "height": 160, + "url": "https://i.scdn.co/image/ab6761610000f178bde8a1370ee2b335a8f967a5", + "width": 160 + } + ], + "name": "tlinh", + "popularity": 61, + "type": "artist", + "uri": "spotify:artist:3diftVOq7aEIebXKkC34oR" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5dfZ5uSmzR7VQK0udbAVpf" + }, + "followers": { + "href": null, + "total": 4531079 + }, + "genres": ["v-pop", "vietnamese melodic rap"], + "href": "https://api.spotify.com/v1/artists/5dfZ5uSmzR7VQK0udbAVpf", + "id": "5dfZ5uSmzR7VQK0udbAVpf", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab6761610000e5eb51b32111f5bc456525313d89", + "width": 640 + }, + { + "height": 320, + "url": "https://i.scdn.co/image/ab6761610000517451b32111f5bc456525313d89", + "width": 320 + }, + { + "height": 160, + "url": "https://i.scdn.co/image/ab6761610000f17851b32111f5bc456525313d89", + "width": 160 + } + ], + "name": "Sơn Tùng M-TP", + "popularity": 61, + "type": "artist", + "uri": "spotify:artist:5dfZ5uSmzR7VQK0udbAVpf" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3mibIJiduF0MVLLAvHZAxw" + }, + "followers": { + "href": null, + "total": 734057 + }, + "genres": ["v-pop"], + "href": "https://api.spotify.com/v1/artists/3mibIJiduF0MVLLAvHZAxw", + "id": "3mibIJiduF0MVLLAvHZAxw", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab6761610000e5ebda93c541daefd806b8992302", + "width": 640 + }, + { + "height": 320, + "url": "https://i.scdn.co/image/ab67616100005174da93c541daefd806b8992302", + "width": 320 + }, + { + "height": 160, + "url": "https://i.scdn.co/image/ab6761610000f178da93c541daefd806b8992302", + "width": 160 + } + ], + "name": "Noo Phước Thịnh", + "popularity": 46, + "type": "artist", + "uri": "spotify:artist:3mibIJiduF0MVLLAvHZAxw" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2xK6qcvfXuFFbU0NL95aeo" + }, + "followers": { + "href": null, + "total": 490950 + }, + "genres": ["v-pop", "vietnamese singer-songwriter"], + "href": "https://api.spotify.com/v1/artists/2xK6qcvfXuFFbU0NL95aeo", + "id": "2xK6qcvfXuFFbU0NL95aeo", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab6761610000e5ebb20e2fe7ba45e11a36604b01", + "width": 640 + }, + { + "height": 320, + "url": "https://i.scdn.co/image/ab67616100005174b20e2fe7ba45e11a36604b01", + "width": 320 + }, + { + "height": 160, + "url": "https://i.scdn.co/image/ab6761610000f178b20e2fe7ba45e11a36604b01", + "width": 160 + } + ], + "name": "Thịnh Suy", + "popularity": 54, + "type": "artist", + "uri": "spotify:artist:2xK6qcvfXuFFbU0NL95aeo" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/06HL4z0CvFAxyc27GXpf02" + }, + "followers": { + "href": null, + "total": 77922559 + }, + "genres": ["pop"], + "href": "https://api.spotify.com/v1/artists/06HL4z0CvFAxyc27GXpf02", + "id": "06HL4z0CvFAxyc27GXpf02", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab6761610000e5eb5a00969a4698c3132a15fbb0", + "width": 640 + }, + { + "height": 320, + "url": "https://i.scdn.co/image/ab676161000051745a00969a4698c3132a15fbb0", + "width": 320 + }, + { + "height": 160, + "url": "https://i.scdn.co/image/ab6761610000f1785a00969a4698c3132a15fbb0", + "width": 160 + } + ], + "name": "Taylor Swift", + "popularity": 100, + "type": "artist", + "uri": "spotify:artist:06HL4z0CvFAxyc27GXpf02" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/6xRZoWlE9twEkMC5NW4Z9f" + }, + "followers": { + "href": null, + "total": 270926 + }, + "genres": ["v-pop"], + "href": "https://api.spotify.com/v1/artists/6xRZoWlE9twEkMC5NW4Z9f", + "id": "6xRZoWlE9twEkMC5NW4Z9f", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab6761610000e5ebc42e5249f4dd16bc3da3b63f", + "width": 640 + }, + { + "height": 320, + "url": "https://i.scdn.co/image/ab67616100005174c42e5249f4dd16bc3da3b63f", + "width": 320 + }, + { + "height": 160, + "url": "https://i.scdn.co/image/ab6761610000f178c42e5249f4dd16bc3da3b63f", + "width": 160 + } + ], + "name": "Hoang Ton", + "popularity": 49, + "type": "artist", + "uri": "spotify:artist:6xRZoWlE9twEkMC5NW4Z9f" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3EPkqJFzEGSJWtGsu1Xwqt" + }, + "followers": { + "href": null, + "total": 60033 + }, + "genres": ["v-pop", "vietnamese hip hop"], + "href": "https://api.spotify.com/v1/artists/3EPkqJFzEGSJWtGsu1Xwqt", + "id": "3EPkqJFzEGSJWtGsu1Xwqt", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab6761610000e5eb989049ccfee17365f57a22b3", + "width": 640 + }, + { + "height": 320, + "url": "https://i.scdn.co/image/ab67616100005174989049ccfee17365f57a22b3", + "width": 320 + }, + { + "height": 160, + "url": "https://i.scdn.co/image/ab6761610000f178989049ccfee17365f57a22b3", + "width": 160 + } + ], + "name": "Kay Trần", + "popularity": 37, + "type": "artist", + "uri": "spotify:artist:3EPkqJFzEGSJWtGsu1Xwqt" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5Cf9nBDNc99UFkq9Yqap7Q" + }, + "followers": { + "href": null, + "total": 486231 + }, + "genres": ["v-pop"], + "href": "https://api.spotify.com/v1/artists/5Cf9nBDNc99UFkq9Yqap7Q", + "id": "5Cf9nBDNc99UFkq9Yqap7Q", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab6761610000e5eb99e937ca54656d4d09474420", + "width": 640 + }, + { + "height": 320, + "url": "https://i.scdn.co/image/ab6761610000517499e937ca54656d4d09474420", + "width": 320 + }, + { + "height": 160, + "url": "https://i.scdn.co/image/ab6761610000f17899e937ca54656d4d09474420", + "width": 160 + } + ], + "name": "Trung Quân", + "popularity": 53, + "type": "artist", + "uri": "spotify:artist:5Cf9nBDNc99UFkq9Yqap7Q" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2Gvp79Cmni6PX13CAlSGex" + }, + "followers": { + "href": null, + "total": 173259 + }, + "genres": ["v-pop"], + "href": "https://api.spotify.com/v1/artists/2Gvp79Cmni6PX13CAlSGex", + "id": "2Gvp79Cmni6PX13CAlSGex", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab6761610000e5ebf2db4875c81f4d103aefc81a", + "width": 640 + }, + { + "height": 320, + "url": "https://i.scdn.co/image/ab67616100005174f2db4875c81f4d103aefc81a", + "width": 320 + }, + { + "height": 160, + "url": "https://i.scdn.co/image/ab6761610000f178f2db4875c81f4d103aefc81a", + "width": 160 + } + ], + "name": "Bùi Anh Tuấn", + "popularity": 46, + "type": "artist", + "uri": "spotify:artist:2Gvp79Cmni6PX13CAlSGex" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4YkqEuVf1Jf2x2XDqJ2CvC" + }, + "followers": { + "href": null, + "total": 211474 + }, + "genres": ["v-pop"], + "href": "https://api.spotify.com/v1/artists/4YkqEuVf1Jf2x2XDqJ2CvC", + "id": "4YkqEuVf1Jf2x2XDqJ2CvC", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab6761610000e5ebe51f475c32e7e8f34faf95c5", + "width": 640 + }, + { + "height": 320, + "url": "https://i.scdn.co/image/ab67616100005174e51f475c32e7e8f34faf95c5", + "width": 320 + }, + { + "height": 160, + "url": "https://i.scdn.co/image/ab6761610000f178e51f475c32e7e8f34faf95c5", + "width": 160 + } + ], + "name": "Tóc Tiên", + "popularity": 48, + "type": "artist", + "uri": "spotify:artist:4YkqEuVf1Jf2x2XDqJ2CvC" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0r63ReVRjxrS4ATbLrdcrL" + }, + "followers": { + "href": null, + "total": 819134 + }, + "genres": ["v-pop"], + "href": "https://api.spotify.com/v1/artists/0r63ReVRjxrS4ATbLrdcrL", + "id": "0r63ReVRjxrS4ATbLrdcrL", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab6761610000e5ebbe8b6591753659ca595c73c6", + "width": 640 + }, + { + "height": 320, + "url": "https://i.scdn.co/image/ab67616100005174be8b6591753659ca595c73c6", + "width": 320 + }, + { + "height": 160, + "url": "https://i.scdn.co/image/ab6761610000f178be8b6591753659ca595c73c6", + "width": 160 + } + ], + "name": "Hoàng Thùy Linh", + "popularity": 57, + "type": "artist", + "uri": "spotify:artist:0r63ReVRjxrS4ATbLrdcrL" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/7yquVKfxBuNFJbG9cy2R8A" + }, + "followers": { + "href": null, + "total": 554983 + }, + "genres": ["v-pop"], + "href": "https://api.spotify.com/v1/artists/7yquVKfxBuNFJbG9cy2R8A", + "id": "7yquVKfxBuNFJbG9cy2R8A", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab6761610000e5ebaf03006dd2e13de3921626e9", + "width": 640 + }, + { + "height": 320, + "url": "https://i.scdn.co/image/ab67616100005174af03006dd2e13de3921626e9", + "width": 320 + }, + { + "height": 160, + "url": "https://i.scdn.co/image/ab6761610000f178af03006dd2e13de3921626e9", + "width": 160 + } + ], + "name": "Vu Cat Tuong", + "popularity": 47, + "type": "artist", + "uri": "spotify:artist:7yquVKfxBuNFJbG9cy2R8A" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2rVYwIYNEsMxtt8j5yemHb" + }, + "followers": { + "href": null, + "total": 155651 + }, + "genres": ["indie viet", "v-pop", "viet lo-fi"], + "href": "https://api.spotify.com/v1/artists/2rVYwIYNEsMxtt8j5yemHb", + "id": "2rVYwIYNEsMxtt8j5yemHb", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab6761610000e5eb0fc0d818da3c3939993a24c1", + "width": 640 + }, + { + "height": 320, + "url": "https://i.scdn.co/image/ab676161000051740fc0d818da3c3939993a24c1", + "width": 320 + }, + { + "height": 160, + "url": "https://i.scdn.co/image/ab6761610000f1780fc0d818da3c3939993a24c1", + "width": 160 + } + ], + "name": "T.R.I", + "popularity": 50, + "type": "artist", + "uri": "spotify:artist:2rVYwIYNEsMxtt8j5yemHb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5ayWRfrcpObgDDlzheJ2Gr" + }, + "followers": { + "href": null, + "total": 133396 + }, + "genres": ["vietnamese hip hop"], + "href": "https://api.spotify.com/v1/artists/5ayWRfrcpObgDDlzheJ2Gr", + "id": "5ayWRfrcpObgDDlzheJ2Gr", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab6761610000e5eb422664c8cf0c99b3219ffd7b", + "width": 640 + }, + { + "height": 320, + "url": "https://i.scdn.co/image/ab67616100005174422664c8cf0c99b3219ffd7b", + "width": 320 + }, + { + "height": 160, + "url": "https://i.scdn.co/image/ab6761610000f178422664c8cf0c99b3219ffd7b", + "width": 160 + } + ], + "name": "TaynguyenSound", + "popularity": 43, + "type": "artist", + "uri": "spotify:artist:5ayWRfrcpObgDDlzheJ2Gr" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/6LrBtADUmDoLlcTrg448Qt" + }, + "followers": { + "href": null, + "total": 21425 + }, + "genres": ["v-pop"], + "href": "https://api.spotify.com/v1/artists/6LrBtADUmDoLlcTrg448Qt", + "id": "6LrBtADUmDoLlcTrg448Qt", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab6761610000e5ebfbe3a3b4ddbb0a5700608ec8", + "width": 640 + }, + { + "height": 320, + "url": "https://i.scdn.co/image/ab67616100005174fbe3a3b4ddbb0a5700608ec8", + "width": 320 + }, + { + "height": 160, + "url": "https://i.scdn.co/image/ab6761610000f178fbe3a3b4ddbb0a5700608ec8", + "width": 160 + } + ], + "name": "TIA", + "popularity": 41, + "type": "artist", + "uri": "spotify:artist:6LrBtADUmDoLlcTrg448Qt" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1dmaHHd1Xbd85cT1egYb4w" + }, + "followers": { + "href": null, + "total": 814330 + }, + "genres": ["v-pop"], + "href": "https://api.spotify.com/v1/artists/1dmaHHd1Xbd85cT1egYb4w", + "id": "1dmaHHd1Xbd85cT1egYb4w", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab6761610000e5eba7f28bd3ad5ef4a868151ee7", + "width": 640 + }, + { + "height": 320, + "url": "https://i.scdn.co/image/ab67616100005174a7f28bd3ad5ef4a868151ee7", + "width": 320 + }, + { + "height": 160, + "url": "https://i.scdn.co/image/ab6761610000f178a7f28bd3ad5ef4a868151ee7", + "width": 160 + } + ], + "name": "Trúc Nhân", + "popularity": 44, + "type": "artist", + "uri": "spotify:artist:1dmaHHd1Xbd85cT1egYb4w" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/7n2Ycct7Beij7Dj7meI4X0" + }, + "followers": { + "href": null, + "total": 18009361 + }, + "genres": ["k-pop", "k-pop girl group", "pop"], + "href": "https://api.spotify.com/v1/artists/7n2Ycct7Beij7Dj7meI4X0", + "id": "7n2Ycct7Beij7Dj7meI4X0", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab6761610000e5eb8944c8aec8db82f35980b191", + "width": 640 + }, + { + "height": 320, + "url": "https://i.scdn.co/image/ab676161000051748944c8aec8db82f35980b191", + "width": 320 + }, + { + "height": 160, + "url": "https://i.scdn.co/image/ab6761610000f1788944c8aec8db82f35980b191", + "width": 160 + } + ], + "name": "TWICE", + "popularity": 81, + "type": "artist", + "uri": "spotify:artist:7n2Ycct7Beij7Dj7meI4X0" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5UNWQJdUbO8Gbg9Qn3r52M" + }, + "followers": { + "href": null, + "total": 169971 + }, + "genres": ["v-pop"], + "href": "https://api.spotify.com/v1/artists/5UNWQJdUbO8Gbg9Qn3r52M", + "id": "5UNWQJdUbO8Gbg9Qn3r52M", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab6761610000e5ebd1791a8797ebb54224bbe240", + "width": 640 + }, + { + "height": 320, + "url": "https://i.scdn.co/image/ab67616100005174d1791a8797ebb54224bbe240", + "width": 320 + }, + { + "height": 160, + "url": "https://i.scdn.co/image/ab6761610000f178d1791a8797ebb54224bbe240", + "width": 160 + } + ], + "name": "Touliver", + "popularity": 50, + "type": "artist", + "uri": "spotify:artist:5UNWQJdUbO8Gbg9Qn3r52M" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2v14NO80QYditUms7sbEIZ" + }, + "followers": { + "href": null, + "total": 3363 + }, + "genres": [], + "href": "https://api.spotify.com/v1/artists/2v14NO80QYditUms7sbEIZ", + "id": "2v14NO80QYditUms7sbEIZ", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab6761610000e5ebc8b23f5433a8672e30acf43e", + "width": 640 + }, + { + "height": 320, + "url": "https://i.scdn.co/image/ab67616100005174c8b23f5433a8672e30acf43e", + "width": 320 + }, + { + "height": 160, + "url": "https://i.scdn.co/image/ab6761610000f178c8b23f5433a8672e30acf43e", + "width": 160 + } + ], + "name": "Trung Trần", + "popularity": 54, + "type": "artist", + "uri": "spotify:artist:2v14NO80QYditUms7sbEIZ" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1n9JKdEdLxrbgJiqz1WZFJ" + }, + "followers": { + "href": null, + "total": 120064 + }, + "genres": ["v-pop"], + "href": "https://api.spotify.com/v1/artists/1n9JKdEdLxrbgJiqz1WZFJ", + "id": "1n9JKdEdLxrbgJiqz1WZFJ", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab6761610000e5eb8140e8167b94b2ed2c36ca7c", + "width": 640 + }, + { + "height": 320, + "url": "https://i.scdn.co/image/ab676161000051748140e8167b94b2ed2c36ca7c", + "width": 320 + }, + { + "height": 160, + "url": "https://i.scdn.co/image/ab6761610000f1788140e8167b94b2ed2c36ca7c", + "width": 160 + } + ], + "name": "Tăng Duy Tân", + "popularity": 50, + "type": "artist", + "uri": "spotify:artist:1n9JKdEdLxrbgJiqz1WZFJ" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/6udveWUgX4vu75FF0DTrXV" + }, + "followers": { + "href": null, + "total": 1131227 + }, + "genres": ["k-pop", "korean r&b"], + "href": "https://api.spotify.com/v1/artists/6udveWUgX4vu75FF0DTrXV", + "id": "6udveWUgX4vu75FF0DTrXV", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab6761610000e5eb496189630cd3cb0c7b593fee", + "width": 640 + }, + { + "height": 320, + "url": "https://i.scdn.co/image/ab67616100005174496189630cd3cb0c7b593fee", + "width": 320 + }, + { + "height": 160, + "url": "https://i.scdn.co/image/ab6761610000f178496189630cd3cb0c7b593fee", + "width": 160 + } + ], + "name": "TAEYANG", + "popularity": 70, + "type": "artist", + "uri": "spotify:artist:6udveWUgX4vu75FF0DTrXV" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0Y5tJX1MQlPlqiwlOH1tJY" + }, + "followers": { + "href": null, + "total": 22701898 + }, + "genres": ["hip hop", "rap", "slap house"], + "href": "https://api.spotify.com/v1/artists/0Y5tJX1MQlPlqiwlOH1tJY", + "id": "0Y5tJX1MQlPlqiwlOH1tJY", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab6761610000e5ebe707b87e3f65997f6c09bfff", + "width": 640 + }, + { + "height": 320, + "url": "https://i.scdn.co/image/ab67616100005174e707b87e3f65997f6c09bfff", + "width": 320 + }, + { + "height": 160, + "url": "https://i.scdn.co/image/ab6761610000f178e707b87e3f65997f6c09bfff", + "width": 160 + } + ], + "name": "Travis Scott", + "popularity": 89, + "type": "artist", + "uri": "spotify:artist:0Y5tJX1MQlPlqiwlOH1tJY" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3OKg7YbOIatODzkRIbLJR4" + }, + "followers": { + "href": null, + "total": 1656778 + }, + "genres": ["speedrun"], + "href": "https://api.spotify.com/v1/artists/3OKg7YbOIatODzkRIbLJR4", + "id": "3OKg7YbOIatODzkRIbLJR4", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab6761610000e5ebc64c5f001dc3957cf5651460", + "width": 640 + }, + { + "height": 320, + "url": "https://i.scdn.co/image/ab67616100005174c64c5f001dc3957cf5651460", + "width": 320 + }, + { + "height": 160, + "url": "https://i.scdn.co/image/ab6761610000f178c64c5f001dc3957cf5651460", + "width": 160 + } + ], + "name": "TheFatRat", + "popularity": 66, + "type": "artist", + "uri": "spotify:artist:3OKg7YbOIatODzkRIbLJR4" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2knyDFP4xw9wZEWA98JX6b" + }, + "followers": { + "href": null, + "total": 106213 + }, + "genres": ["indie viet", "v-pop", "vietnamese singer-songwriter"], + "href": "https://api.spotify.com/v1/artists/2knyDFP4xw9wZEWA98JX6b", + "id": "2knyDFP4xw9wZEWA98JX6b", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab6761610000e5ebe28057e8f67ce8071d58bb35", + "width": 640 + }, + { + "height": 320, + "url": "https://i.scdn.co/image/ab67616100005174e28057e8f67ce8071d58bb35", + "width": 320 + }, + { + "height": 160, + "url": "https://i.scdn.co/image/ab6761610000f178e28057e8f67ce8071d58bb35", + "width": 160 + } + ], + "name": "TRANG", + "popularity": 48, + "type": "artist", + "uri": "spotify:artist:2knyDFP4xw9wZEWA98JX6b" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0ghlgldX5Dd6720Q3qFyQB" + }, + "followers": { + "href": null, + "total": 8194199 + }, + "genres": ["k-pop", "k-pop boy group"], + "href": "https://api.spotify.com/v1/artists/0ghlgldX5Dd6720Q3qFyQB", + "id": "0ghlgldX5Dd6720Q3qFyQB", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab6761610000e5eb63329d77582c519154674fd7", + "width": 640 + }, + { + "height": 320, + "url": "https://i.scdn.co/image/ab6761610000517463329d77582c519154674fd7", + "width": 320 + }, + { + "height": 160, + "url": "https://i.scdn.co/image/ab6761610000f17863329d77582c519154674fd7", + "width": 160 + } + ], + "name": "TOMORROW X TOGETHER", + "popularity": 77, + "type": "artist", + "uri": "spotify:artist:0ghlgldX5Dd6720Q3qFyQB" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3qNVuliS40BLgXGxhdBdqu" + }, + "followers": { + "href": null, + "total": 2755673 + }, + "genres": ["k-pop"], + "href": "https://api.spotify.com/v1/artists/3qNVuliS40BLgXGxhdBdqu", + "id": "3qNVuliS40BLgXGxhdBdqu", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab6761610000e5ebb29975f8b42bcba1eae62577", + "width": 640 + }, + { + "height": 320, + "url": "https://i.scdn.co/image/ab67616100005174b29975f8b42bcba1eae62577", + "width": 320 + }, + { + "height": 160, + "url": "https://i.scdn.co/image/ab6761610000f178b29975f8b42bcba1eae62577", + "width": 160 + } + ], + "name": "TAEYEON", + "popularity": 67, + "type": "artist", + "uri": "spotify:artist:3qNVuliS40BLgXGxhdBdqu" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1iyFL3CRuKW7PXgPH4VxSP" + }, + "followers": { + "href": null, + "total": 152893 + }, + "genres": ["k-pop boy group"], + "href": "https://api.spotify.com/v1/artists/1iyFL3CRuKW7PXgPH4VxSP", + "id": "1iyFL3CRuKW7PXgPH4VxSP", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab6761610000e5eba03a6aede6daa8b1584dc96a", + "width": 640 + }, + { + "height": 320, + "url": "https://i.scdn.co/image/ab67616100005174a03a6aede6daa8b1584dc96a", + "width": 320 + }, + { + "height": 160, + "url": "https://i.scdn.co/image/ab6761610000f178a03a6aede6daa8b1584dc96a", + "width": 160 + } + ], + "name": "TEMPEST", + "popularity": 49, + "type": "artist", + "uri": "spotify:artist:1iyFL3CRuKW7PXgPH4VxSP" + } + ] +} diff --git a/public/data/00005.json b/public/data/00005.json new file mode 100644 index 0000000..29bd788 --- /dev/null +++ b/public/data/00005.json @@ -0,0 +1,19124 @@ +{ + "title": "Albums", + "href": "/section/00005", + "dataType": "album", + "data": [ + { + "album_type": "album", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1zSv9qZANOWB4HRE8sxeTL" + }, + "href": "https://api.spotify.com/v1/artists/1zSv9qZANOWB4HRE8sxeTL", + "id": "1zSv9qZANOWB4HRE8sxeTL", + "name": "RPT MCK", + "type": "artist", + "uri": "spotify:artist:1zSv9qZANOWB4HRE8sxeTL" + } + ], + "copyrights": [ + { + "text": "(C) 2023 RPT MCK, exclusively licensed to CDSL", + "type": "C" + }, + { + "text": "(P) 2023 RPT MCK, exclusively licensed to CDSL", + "type": "P" + } + ], + "external_ids": { + "upc": "197188116262" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/1vi1WySkgPGkbR8NnQzlXu" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/1vi1WySkgPGkbR8NnQzlXu", + "id": "1vi1WySkgPGkbR8NnQzlXu", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273b315e8bb7ef5e57e9a25bb0f", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02b315e8bb7ef5e57e9a25bb0f", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851b315e8bb7ef5e57e9a25bb0f", + "width": 64 + } + ], + "is_playable": true, + "label": "N0L4B3L", + "name": "99%", + "popularity": 72, + "release_date": "2023-03-02", + "release_date_precision": "day", + "total_tracks": 16, + "tracks": { + "href": "https://api.spotify.com/v1/albums/1vi1WySkgPGkbR8NnQzlXu/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1zSv9qZANOWB4HRE8sxeTL" + }, + "href": "https://api.spotify.com/v1/artists/1zSv9qZANOWB4HRE8sxeTL", + "id": "1zSv9qZANOWB4HRE8sxeTL", + "name": "RPT MCK", + "type": "artist", + "uri": "spotify:artist:1zSv9qZANOWB4HRE8sxeTL" + } + ], + "disc_number": 1, + "duration_ms": 33874, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/3xlhYIhZ7heAvohmw3uyfd" + }, + "href": "https://api.spotify.com/v1/tracks/3xlhYIhZ7heAvohmw3uyfd", + "id": "3xlhYIhZ7heAvohmw3uyfd", + "is_local": false, + "is_playable": true, + "name": "00", + "preview_url": "https://p.scdn.co/mp3-preview/4c63923d75a6ee62d7fa1cefa61658578ee29cb7?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:3xlhYIhZ7heAvohmw3uyfd" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1zSv9qZANOWB4HRE8sxeTL" + }, + "href": "https://api.spotify.com/v1/artists/1zSv9qZANOWB4HRE8sxeTL", + "id": "1zSv9qZANOWB4HRE8sxeTL", + "name": "RPT MCK", + "type": "artist", + "uri": "spotify:artist:1zSv9qZANOWB4HRE8sxeTL" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2v14NO80QYditUms7sbEIZ" + }, + "href": "https://api.spotify.com/v1/artists/2v14NO80QYditUms7sbEIZ", + "id": "2v14NO80QYditUms7sbEIZ", + "name": "Trung Trần", + "type": "artist", + "uri": "spotify:artist:2v14NO80QYditUms7sbEIZ" + } + ], + "disc_number": 1, + "duration_ms": 156303, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/7jLSThU5Kg1RWt19Leiaxm" + }, + "href": "https://api.spotify.com/v1/tracks/7jLSThU5Kg1RWt19Leiaxm", + "id": "7jLSThU5Kg1RWt19Leiaxm", + "is_local": false, + "is_playable": true, + "name": "Chìm Sâu", + "preview_url": "https://p.scdn.co/mp3-preview/0496b1c18c7653d9124a2f39e148ec3babcae737?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 2, + "type": "track", + "uri": "spotify:track:7jLSThU5Kg1RWt19Leiaxm" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1zSv9qZANOWB4HRE8sxeTL" + }, + "href": "https://api.spotify.com/v1/artists/1zSv9qZANOWB4HRE8sxeTL", + "id": "1zSv9qZANOWB4HRE8sxeTL", + "name": "RPT MCK", + "type": "artist", + "uri": "spotify:artist:1zSv9qZANOWB4HRE8sxeTL" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/6xRZoWlE9twEkMC5NW4Z9f" + }, + "href": "https://api.spotify.com/v1/artists/6xRZoWlE9twEkMC5NW4Z9f", + "id": "6xRZoWlE9twEkMC5NW4Z9f", + "name": "Hoang Ton", + "type": "artist", + "uri": "spotify:artist:6xRZoWlE9twEkMC5NW4Z9f" + } + ], + "disc_number": 1, + "duration_ms": 238330, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/38MI5LpTajiO3A0DQGcCmu" + }, + "href": "https://api.spotify.com/v1/tracks/38MI5LpTajiO3A0DQGcCmu", + "id": "38MI5LpTajiO3A0DQGcCmu", + "is_local": false, + "is_playable": true, + "name": "Suit & Tie", + "preview_url": "https://p.scdn.co/mp3-preview/dea07c9d820a1e30dc3b7237679d555e94baca2f?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 3, + "type": "track", + "uri": "spotify:track:38MI5LpTajiO3A0DQGcCmu" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1zSv9qZANOWB4HRE8sxeTL" + }, + "href": "https://api.spotify.com/v1/artists/1zSv9qZANOWB4HRE8sxeTL", + "id": "1zSv9qZANOWB4HRE8sxeTL", + "name": "RPT MCK", + "type": "artist", + "uri": "spotify:artist:1zSv9qZANOWB4HRE8sxeTL" + } + ], + "disc_number": 1, + "duration_ms": 190303, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/4HHtyJdZVuefcyRmBUcyth" + }, + "href": "https://api.spotify.com/v1/tracks/4HHtyJdZVuefcyRmBUcyth", + "id": "4HHtyJdZVuefcyRmBUcyth", + "is_local": false, + "is_playable": true, + "name": "Va Vào Giai Điệu Này", + "preview_url": "https://p.scdn.co/mp3-preview/1a0848d00a6e2ec46480c9ba74b1751ef34ee1dc?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 4, + "type": "track", + "uri": "spotify:track:4HHtyJdZVuefcyRmBUcyth" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1zSv9qZANOWB4HRE8sxeTL" + }, + "href": "https://api.spotify.com/v1/artists/1zSv9qZANOWB4HRE8sxeTL", + "id": "1zSv9qZANOWB4HRE8sxeTL", + "name": "RPT MCK", + "type": "artist", + "uri": "spotify:artist:1zSv9qZANOWB4HRE8sxeTL" + } + ], + "disc_number": 1, + "duration_ms": 104698, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/6Aq4aOWwYShupneZy71zE4" + }, + "href": "https://api.spotify.com/v1/tracks/6Aq4aOWwYShupneZy71zE4", + "id": "6Aq4aOWwYShupneZy71zE4", + "is_local": false, + "is_playable": true, + "name": "Tối Nay Ta Đi Đâu Nhờ", + "preview_url": "https://p.scdn.co/mp3-preview/6f1e14b1b5e0208c9fef53d253486cd79015fce2?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 5, + "type": "track", + "uri": "spotify:track:6Aq4aOWwYShupneZy71zE4" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1zSv9qZANOWB4HRE8sxeTL" + }, + "href": "https://api.spotify.com/v1/artists/1zSv9qZANOWB4HRE8sxeTL", + "id": "1zSv9qZANOWB4HRE8sxeTL", + "name": "RPT MCK", + "type": "artist", + "uri": "spotify:artist:1zSv9qZANOWB4HRE8sxeTL" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3diftVOq7aEIebXKkC34oR" + }, + "href": "https://api.spotify.com/v1/artists/3diftVOq7aEIebXKkC34oR", + "id": "3diftVOq7aEIebXKkC34oR", + "name": "tlinh", + "type": "artist", + "uri": "spotify:artist:3diftVOq7aEIebXKkC34oR" + } + ], + "disc_number": 1, + "duration_ms": 141760, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/28bxbqNcAuNxYDZYet6eZ7" + }, + "href": "https://api.spotify.com/v1/tracks/28bxbqNcAuNxYDZYet6eZ7", + "id": "28bxbqNcAuNxYDZYet6eZ7", + "is_local": false, + "is_playable": true, + "name": "Chỉ Một Đêm Nữa Thôi", + "preview_url": "https://p.scdn.co/mp3-preview/5cdcca3839607c68e106b8d6d3836ec57f606f17?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 6, + "type": "track", + "uri": "spotify:track:28bxbqNcAuNxYDZYet6eZ7" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1zSv9qZANOWB4HRE8sxeTL" + }, + "href": "https://api.spotify.com/v1/artists/1zSv9qZANOWB4HRE8sxeTL", + "id": "1zSv9qZANOWB4HRE8sxeTL", + "name": "RPT MCK", + "type": "artist", + "uri": "spotify:artist:1zSv9qZANOWB4HRE8sxeTL" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2v14NO80QYditUms7sbEIZ" + }, + "href": "https://api.spotify.com/v1/artists/2v14NO80QYditUms7sbEIZ", + "id": "2v14NO80QYditUms7sbEIZ", + "name": "Trung Trần", + "type": "artist", + "uri": "spotify:artist:2v14NO80QYditUms7sbEIZ" + } + ], + "disc_number": 1, + "duration_ms": 173397, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/7kpNUrBDYDoX6QKGzrBD1R" + }, + "href": "https://api.spotify.com/v1/tracks/7kpNUrBDYDoX6QKGzrBD1R", + "id": "7kpNUrBDYDoX6QKGzrBD1R", + "is_local": false, + "is_playable": true, + "name": "Thôi Em Đừng Đi", + "preview_url": "https://p.scdn.co/mp3-preview/69b768853fe8a3ef97adfc3f0a64d6f20b07e40c?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 7, + "type": "track", + "uri": "spotify:track:7kpNUrBDYDoX6QKGzrBD1R" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1zSv9qZANOWB4HRE8sxeTL" + }, + "href": "https://api.spotify.com/v1/artists/1zSv9qZANOWB4HRE8sxeTL", + "id": "1zSv9qZANOWB4HRE8sxeTL", + "name": "RPT MCK", + "type": "artist", + "uri": "spotify:artist:1zSv9qZANOWB4HRE8sxeTL" + } + ], + "disc_number": 1, + "duration_ms": 60858, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/33dIUFKBA7U5KHs1fdBw8b" + }, + "href": "https://api.spotify.com/v1/tracks/33dIUFKBA7U5KHs1fdBw8b", + "id": "33dIUFKBA7U5KHs1fdBw8b", + "is_local": false, + "is_playable": true, + "name": "50/50", + "preview_url": "https://p.scdn.co/mp3-preview/8f7896e488ee117c2a0992b1b85a58c14ae26585?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 8, + "type": "track", + "uri": "spotify:track:33dIUFKBA7U5KHs1fdBw8b" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1zSv9qZANOWB4HRE8sxeTL" + }, + "href": "https://api.spotify.com/v1/artists/1zSv9qZANOWB4HRE8sxeTL", + "id": "1zSv9qZANOWB4HRE8sxeTL", + "name": "RPT MCK", + "type": "artist", + "uri": "spotify:artist:1zSv9qZANOWB4HRE8sxeTL" + } + ], + "disc_number": 1, + "duration_ms": 185669, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/29cUOvKfTmx9SFDC73QHv5" + }, + "href": "https://api.spotify.com/v1/tracks/29cUOvKfTmx9SFDC73QHv5", + "id": "29cUOvKfTmx9SFDC73QHv5", + "is_local": false, + "is_playable": true, + "name": "Cuốn Cho Anh Một Điếu Nữa Đi", + "preview_url": "https://p.scdn.co/mp3-preview/9bad846633d09455fa846d33b7a28a7dc55d12f0?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 9, + "type": "track", + "uri": "spotify:track:29cUOvKfTmx9SFDC73QHv5" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1zSv9qZANOWB4HRE8sxeTL" + }, + "href": "https://api.spotify.com/v1/artists/1zSv9qZANOWB4HRE8sxeTL", + "id": "1zSv9qZANOWB4HRE8sxeTL", + "name": "RPT MCK", + "type": "artist", + "uri": "spotify:artist:1zSv9qZANOWB4HRE8sxeTL" + } + ], + "disc_number": 1, + "duration_ms": 154917, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/2X2mIfNW5ZtLmVgpm9rgUX" + }, + "href": "https://api.spotify.com/v1/tracks/2X2mIfNW5ZtLmVgpm9rgUX", + "id": "2X2mIfNW5ZtLmVgpm9rgUX", + "is_local": false, + "is_playable": true, + "name": "Show Me Love", + "preview_url": "https://p.scdn.co/mp3-preview/fdf211c2aa77583e8fe709189a85b59d7e43a9af?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 10, + "type": "track", + "uri": "spotify:track:2X2mIfNW5ZtLmVgpm9rgUX" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1zSv9qZANOWB4HRE8sxeTL" + }, + "href": "https://api.spotify.com/v1/artists/1zSv9qZANOWB4HRE8sxeTL", + "id": "1zSv9qZANOWB4HRE8sxeTL", + "name": "RPT MCK", + "type": "artist", + "uri": "spotify:artist:1zSv9qZANOWB4HRE8sxeTL" + } + ], + "disc_number": 1, + "duration_ms": 202880, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3440g8awr2l0E5Yy2X5Epk" + }, + "href": "https://api.spotify.com/v1/tracks/3440g8awr2l0E5Yy2X5Epk", + "id": "3440g8awr2l0E5Yy2X5Epk", + "is_local": false, + "is_playable": true, + "name": "Tại Vì Sao", + "preview_url": "https://p.scdn.co/mp3-preview/bb60739c6a9a640c9118f1e471cfa24b9e685f8e?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 11, + "type": "track", + "uri": "spotify:track:3440g8awr2l0E5Yy2X5Epk" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1zSv9qZANOWB4HRE8sxeTL" + }, + "href": "https://api.spotify.com/v1/artists/1zSv9qZANOWB4HRE8sxeTL", + "id": "1zSv9qZANOWB4HRE8sxeTL", + "name": "RPT MCK", + "type": "artist", + "uri": "spotify:artist:1zSv9qZANOWB4HRE8sxeTL" + } + ], + "disc_number": 1, + "duration_ms": 98325, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/7EaPodlfG3tbhshy7MKzTL" + }, + "href": "https://api.spotify.com/v1/tracks/7EaPodlfG3tbhshy7MKzTL", + "id": "7EaPodlfG3tbhshy7MKzTL", + "is_local": false, + "is_playable": true, + "name": "Thờ Er", + "preview_url": "https://p.scdn.co/mp3-preview/fef5c7201bfc9780e2bb5b5e0259b874c2bad153?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 12, + "type": "track", + "uri": "spotify:track:7EaPodlfG3tbhshy7MKzTL" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1zSv9qZANOWB4HRE8sxeTL" + }, + "href": "https://api.spotify.com/v1/artists/1zSv9qZANOWB4HRE8sxeTL", + "id": "1zSv9qZANOWB4HRE8sxeTL", + "name": "RPT MCK", + "type": "artist", + "uri": "spotify:artist:1zSv9qZANOWB4HRE8sxeTL" + } + ], + "disc_number": 1, + "duration_ms": 192768, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/6GUGn0yUS6PvyYIXOoaT4j" + }, + "href": "https://api.spotify.com/v1/tracks/6GUGn0yUS6PvyYIXOoaT4j", + "id": "6GUGn0yUS6PvyYIXOoaT4j", + "is_local": false, + "is_playable": true, + "name": "Ai Mới Là Kẻ Xấu Xa", + "preview_url": "https://p.scdn.co/mp3-preview/871b7eea12244bbed64fbe767e4c1f6a72522ad2?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 13, + "type": "track", + "uri": "spotify:track:6GUGn0yUS6PvyYIXOoaT4j" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1zSv9qZANOWB4HRE8sxeTL" + }, + "href": "https://api.spotify.com/v1/artists/1zSv9qZANOWB4HRE8sxeTL", + "id": "1zSv9qZANOWB4HRE8sxeTL", + "name": "RPT MCK", + "type": "artist", + "uri": "spotify:artist:1zSv9qZANOWB4HRE8sxeTL" + } + ], + "disc_number": 1, + "duration_ms": 194005, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3YctJXK6kznnWl68TnYobN" + }, + "href": "https://api.spotify.com/v1/tracks/3YctJXK6kznnWl68TnYobN", + "id": "3YctJXK6kznnWl68TnYobN", + "is_local": false, + "is_playable": true, + "name": "Anh Đã Ổn Hơn", + "preview_url": "https://p.scdn.co/mp3-preview/fbb062212c346afcfde22a593c6e82f081411cab?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 14, + "type": "track", + "uri": "spotify:track:3YctJXK6kznnWl68TnYobN" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1zSv9qZANOWB4HRE8sxeTL" + }, + "href": "https://api.spotify.com/v1/artists/1zSv9qZANOWB4HRE8sxeTL", + "id": "1zSv9qZANOWB4HRE8sxeTL", + "name": "RPT MCK", + "type": "artist", + "uri": "spotify:artist:1zSv9qZANOWB4HRE8sxeTL" + } + ], + "disc_number": 1, + "duration_ms": 158559, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/33SYx5viijwLGMqfl50FKI" + }, + "href": "https://api.spotify.com/v1/tracks/33SYx5viijwLGMqfl50FKI", + "id": "33SYx5viijwLGMqfl50FKI", + "is_local": false, + "is_playable": true, + "name": "Badtrip", + "preview_url": "https://p.scdn.co/mp3-preview/c59dc6dec6d4e0272872b03e343de5b9d4b58867?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 15, + "type": "track", + "uri": "spotify:track:33SYx5viijwLGMqfl50FKI" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1zSv9qZANOWB4HRE8sxeTL" + }, + "href": "https://api.spotify.com/v1/artists/1zSv9qZANOWB4HRE8sxeTL", + "id": "1zSv9qZANOWB4HRE8sxeTL", + "name": "RPT MCK", + "type": "artist", + "uri": "spotify:artist:1zSv9qZANOWB4HRE8sxeTL" + } + ], + "disc_number": 1, + "duration_ms": 171673, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/4Mne52NZGUzdlPZSzjQM5f" + }, + "href": "https://api.spotify.com/v1/tracks/4Mne52NZGUzdlPZSzjQM5f", + "id": "4Mne52NZGUzdlPZSzjQM5f", + "is_local": false, + "is_playable": true, + "name": "99", + "preview_url": "https://p.scdn.co/mp3-preview/589675aaf1ddd585df8e7f28fbc09218a02f76b2?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 16, + "type": "track", + "uri": "spotify:track:4Mne52NZGUzdlPZSzjQM5f" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 16 + }, + "type": "album", + "uri": "spotify:album:1vi1WySkgPGkbR8NnQzlXu" + }, + { + "album_type": "album", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1oD9fKbb7qQ2nhn9JJC24F" + }, + "href": "https://api.spotify.com/v1/artists/1oD9fKbb7qQ2nhn9JJC24F", + "id": "1oD9fKbb7qQ2nhn9JJC24F", + "name": "Thắng", + "type": "artist", + "uri": "spotify:artist:1oD9fKbb7qQ2nhn9JJC24F" + } + ], + "copyrights": [ + { + "text": "2023 Thắng", + "type": "C" + }, + { + "text": "2023 Thắng", + "type": "P" + } + ], + "external_ids": { + "upc": "3617220044935" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/5jDZKqgoVRbob6A3omYTG5" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/5jDZKqgoVRbob6A3omYTG5", + "id": "5jDZKqgoVRbob6A3omYTG5", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273fa201fc6fbffdd089791821a", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02fa201fc6fbffdd089791821a", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851fa201fc6fbffdd089791821a", + "width": 64 + } + ], + "is_playable": true, + "label": "Thắng", + "name": "Cái Đầu Tiên", + "popularity": 63, + "release_date": "2023-04-30", + "release_date_precision": "day", + "total_tracks": 8, + "tracks": { + "href": "https://api.spotify.com/v1/albums/5jDZKqgoVRbob6A3omYTG5/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1oD9fKbb7qQ2nhn9JJC24F" + }, + "href": "https://api.spotify.com/v1/artists/1oD9fKbb7qQ2nhn9JJC24F", + "id": "1oD9fKbb7qQ2nhn9JJC24F", + "name": "Thắng", + "type": "artist", + "uri": "spotify:artist:1oD9fKbb7qQ2nhn9JJC24F" + } + ], + "disc_number": 1, + "duration_ms": 129440, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6QiE9xVHfGT1s3ilFo2lVu" + }, + "href": "https://api.spotify.com/v1/tracks/6QiE9xVHfGT1s3ilFo2lVu", + "id": "6QiE9xVHfGT1s3ilFo2lVu", + "is_local": false, + "is_playable": true, + "name": "Sober Song", + "preview_url": "https://p.scdn.co/mp3-preview/4b0024edc7cd63b854a2450cba37857e3fb28fee?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:6QiE9xVHfGT1s3ilFo2lVu" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1oD9fKbb7qQ2nhn9JJC24F" + }, + "href": "https://api.spotify.com/v1/artists/1oD9fKbb7qQ2nhn9JJC24F", + "id": "1oD9fKbb7qQ2nhn9JJC24F", + "name": "Thắng", + "type": "artist", + "uri": "spotify:artist:1oD9fKbb7qQ2nhn9JJC24F" + } + ], + "disc_number": 1, + "duration_ms": 194182, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1yo967mk7CpjvruNxBecOY" + }, + "href": "https://api.spotify.com/v1/tracks/1yo967mk7CpjvruNxBecOY", + "id": "1yo967mk7CpjvruNxBecOY", + "is_local": false, + "is_playable": true, + "name": "Trước Khi Em Tồn Tại", + "preview_url": "https://p.scdn.co/mp3-preview/e5ceb8ce7eb15483583b016e8daddeb85ddf7d64?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 2, + "type": "track", + "uri": "spotify:track:1yo967mk7CpjvruNxBecOY" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1oD9fKbb7qQ2nhn9JJC24F" + }, + "href": "https://api.spotify.com/v1/artists/1oD9fKbb7qQ2nhn9JJC24F", + "id": "1oD9fKbb7qQ2nhn9JJC24F", + "name": "Thắng", + "type": "artist", + "uri": "spotify:artist:1oD9fKbb7qQ2nhn9JJC24F" + } + ], + "disc_number": 1, + "duration_ms": 154838, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/27okvpcgpfODYvseTAdnYs" + }, + "href": "https://api.spotify.com/v1/tracks/27okvpcgpfODYvseTAdnYs", + "id": "27okvpcgpfODYvseTAdnYs", + "is_local": false, + "is_playable": true, + "name": "Limo", + "preview_url": "https://p.scdn.co/mp3-preview/686d8ad2f500d723461dd7cadccaa611d6fe8f53?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 3, + "type": "track", + "uri": "spotify:track:27okvpcgpfODYvseTAdnYs" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1oD9fKbb7qQ2nhn9JJC24F" + }, + "href": "https://api.spotify.com/v1/artists/1oD9fKbb7qQ2nhn9JJC24F", + "id": "1oD9fKbb7qQ2nhn9JJC24F", + "name": "Thắng", + "type": "artist", + "uri": "spotify:artist:1oD9fKbb7qQ2nhn9JJC24F" + } + ], + "disc_number": 1, + "duration_ms": 201868, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2D4OKwmgiWXrPcJ2UaJSNh" + }, + "href": "https://api.spotify.com/v1/tracks/2D4OKwmgiWXrPcJ2UaJSNh", + "id": "2D4OKwmgiWXrPcJ2UaJSNh", + "is_local": false, + "is_playable": true, + "name": "Tinkerbell", + "preview_url": "https://p.scdn.co/mp3-preview/ab9c9d7c97c0a2668cc2018c45ce9fc67c9700c0?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 4, + "type": "track", + "uri": "spotify:track:2D4OKwmgiWXrPcJ2UaJSNh" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1oD9fKbb7qQ2nhn9JJC24F" + }, + "href": "https://api.spotify.com/v1/artists/1oD9fKbb7qQ2nhn9JJC24F", + "id": "1oD9fKbb7qQ2nhn9JJC24F", + "name": "Thắng", + "type": "artist", + "uri": "spotify:artist:1oD9fKbb7qQ2nhn9JJC24F" + } + ], + "disc_number": 1, + "duration_ms": 200393, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/7jFHUsErqyXjIvyxzBKhf2" + }, + "href": "https://api.spotify.com/v1/tracks/7jFHUsErqyXjIvyxzBKhf2", + "id": "7jFHUsErqyXjIvyxzBKhf2", + "is_local": false, + "is_playable": true, + "name": "Mất Thời Gian", + "preview_url": "https://p.scdn.co/mp3-preview/7af4b001c9463364f5b0fed0fb6d80b448680367?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 5, + "type": "track", + "uri": "spotify:track:7jFHUsErqyXjIvyxzBKhf2" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1oD9fKbb7qQ2nhn9JJC24F" + }, + "href": "https://api.spotify.com/v1/artists/1oD9fKbb7qQ2nhn9JJC24F", + "id": "1oD9fKbb7qQ2nhn9JJC24F", + "name": "Thắng", + "type": "artist", + "uri": "spotify:artist:1oD9fKbb7qQ2nhn9JJC24F" + } + ], + "disc_number": 1, + "duration_ms": 147824, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/5ok0C5Q8O1p477MIZlQM0O" + }, + "href": "https://api.spotify.com/v1/tracks/5ok0C5Q8O1p477MIZlQM0O", + "id": "5ok0C5Q8O1p477MIZlQM0O", + "is_local": false, + "is_playable": true, + "name": "Save it for your boyfriends", + "preview_url": "https://p.scdn.co/mp3-preview/63291af2f48e544cdbc1dee69af24698c55cc167?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 6, + "type": "track", + "uri": "spotify:track:5ok0C5Q8O1p477MIZlQM0O" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1oD9fKbb7qQ2nhn9JJC24F" + }, + "href": "https://api.spotify.com/v1/artists/1oD9fKbb7qQ2nhn9JJC24F", + "id": "1oD9fKbb7qQ2nhn9JJC24F", + "name": "Thắng", + "type": "artist", + "uri": "spotify:artist:1oD9fKbb7qQ2nhn9JJC24F" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2l0cdSl2y1u8TuqyO0X5Rf" + }, + "href": "https://api.spotify.com/v1/artists/2l0cdSl2y1u8TuqyO0X5Rf", + "id": "2l0cdSl2y1u8TuqyO0X5Rf", + "name": "Limebócx", + "type": "artist", + "uri": "spotify:artist:2l0cdSl2y1u8TuqyO0X5Rf" + } + ], + "disc_number": 1, + "duration_ms": 261987, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/03ZqOfQjiFJ0CaoATCMxlU" + }, + "href": "https://api.spotify.com/v1/tracks/03ZqOfQjiFJ0CaoATCMxlU", + "id": "03ZqOfQjiFJ0CaoATCMxlU", + "is_local": false, + "is_playable": true, + "name": "Phải Lòng", + "preview_url": "https://p.scdn.co/mp3-preview/36bf860ec86c0773839afa5ac3d1ac6a897cc35d?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 7, + "type": "track", + "uri": "spotify:track:03ZqOfQjiFJ0CaoATCMxlU" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1oD9fKbb7qQ2nhn9JJC24F" + }, + "href": "https://api.spotify.com/v1/artists/1oD9fKbb7qQ2nhn9JJC24F", + "id": "1oD9fKbb7qQ2nhn9JJC24F", + "name": "Thắng", + "type": "artist", + "uri": "spotify:artist:1oD9fKbb7qQ2nhn9JJC24F" + } + ], + "disc_number": 1, + "duration_ms": 127114, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1K3CXUYKhLYN7koLW5WQjX" + }, + "href": "https://api.spotify.com/v1/tracks/1K3CXUYKhLYN7koLW5WQjX", + "id": "1K3CXUYKhLYN7koLW5WQjX", + "is_local": false, + "is_playable": true, + "name": "Xin Lỗi", + "preview_url": "https://p.scdn.co/mp3-preview/8679e0dea2ac9bb719ef78057b1feb994a9cea6f?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 8, + "type": "track", + "uri": "spotify:track:1K3CXUYKhLYN7koLW5WQjX" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 8 + }, + "type": "album", + "uri": "spotify:album:5jDZKqgoVRbob6A3omYTG5" + }, + { + "album_type": "album", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5jTFNkoZebPnX90CbB3F2A" + }, + "href": "https://api.spotify.com/v1/artists/5jTFNkoZebPnX90CbB3F2A", + "id": "5jTFNkoZebPnX90CbB3F2A", + "name": "MONO", + "type": "artist", + "uri": "spotify:artist:5jTFNkoZebPnX90CbB3F2A" + } + ], + "copyrights": [ + { + "text": "© 2022 S.E.A Entertainment, Exclusively Licensed To M Music Records", + "type": "C" + }, + { + "text": "℗ 2022 S.E.A Entertainment, Exclusively Licensed To M Music Records", + "type": "P" + } + ], + "external_ids": { + "upc": "00602448404374" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/3lZ0sW4znNieFHxGdyWXCj" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/3lZ0sW4znNieFHxGdyWXCj", + "id": "3lZ0sW4znNieFHxGdyWXCj", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273f909731198469e69f5809083", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02f909731198469e69f5809083", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851f909731198469e69f5809083", + "width": 64 + } + ], + "is_playable": true, + "label": "Universal Music Indochina Distributed Labels", + "name": "22", + "popularity": 60, + "release_date": "2022-08-18", + "release_date_precision": "day", + "total_tracks": 11, + "tracks": { + "href": "https://api.spotify.com/v1/albums/3lZ0sW4znNieFHxGdyWXCj/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5jTFNkoZebPnX90CbB3F2A" + }, + "href": "https://api.spotify.com/v1/artists/5jTFNkoZebPnX90CbB3F2A", + "id": "5jTFNkoZebPnX90CbB3F2A", + "name": "MONO", + "type": "artist", + "uri": "spotify:artist:5jTFNkoZebPnX90CbB3F2A" + } + ], + "disc_number": 1, + "duration_ms": 59791, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0MQLLu2sS9ASM71y3MB5oV" + }, + "href": "https://api.spotify.com/v1/tracks/0MQLLu2sS9ASM71y3MB5oV", + "id": "0MQLLu2sS9ASM71y3MB5oV", + "is_local": false, + "is_playable": true, + "name": "Intro", + "preview_url": null, + "track_number": 1, + "type": "track", + "uri": "spotify:track:0MQLLu2sS9ASM71y3MB5oV" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5jTFNkoZebPnX90CbB3F2A" + }, + "href": "https://api.spotify.com/v1/artists/5jTFNkoZebPnX90CbB3F2A", + "id": "5jTFNkoZebPnX90CbB3F2A", + "name": "MONO", + "type": "artist", + "uri": "spotify:artist:5jTFNkoZebPnX90CbB3F2A" + } + ], + "disc_number": 1, + "duration_ms": 149166, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3SPqGfmGxumrXeoHzIbhct" + }, + "href": "https://api.spotify.com/v1/tracks/3SPqGfmGxumrXeoHzIbhct", + "id": "3SPqGfmGxumrXeoHzIbhct", + "is_local": false, + "is_playable": true, + "name": "Buông", + "preview_url": null, + "track_number": 2, + "type": "track", + "uri": "spotify:track:3SPqGfmGxumrXeoHzIbhct" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5jTFNkoZebPnX90CbB3F2A" + }, + "href": "https://api.spotify.com/v1/artists/5jTFNkoZebPnX90CbB3F2A", + "id": "5jTFNkoZebPnX90CbB3F2A", + "name": "MONO", + "type": "artist", + "uri": "spotify:artist:5jTFNkoZebPnX90CbB3F2A" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/25M5YMbLCbYDSFPhQXYE8c" + }, + "href": "https://api.spotify.com/v1/artists/25M5YMbLCbYDSFPhQXYE8c", + "id": "25M5YMbLCbYDSFPhQXYE8c", + "name": "Onionn.", + "type": "artist", + "uri": "spotify:artist:25M5YMbLCbYDSFPhQXYE8c" + } + ], + "disc_number": 1, + "duration_ms": 197333, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6A1IbMKwjvXibcrU1sdqKH" + }, + "href": "https://api.spotify.com/v1/tracks/6A1IbMKwjvXibcrU1sdqKH", + "id": "6A1IbMKwjvXibcrU1sdqKH", + "is_local": false, + "is_playable": true, + "name": "Em Là", + "preview_url": null, + "track_number": 3, + "type": "track", + "uri": "spotify:track:6A1IbMKwjvXibcrU1sdqKH" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5jTFNkoZebPnX90CbB3F2A" + }, + "href": "https://api.spotify.com/v1/artists/5jTFNkoZebPnX90CbB3F2A", + "id": "5jTFNkoZebPnX90CbB3F2A", + "name": "MONO", + "type": "artist", + "uri": "spotify:artist:5jTFNkoZebPnX90CbB3F2A" + } + ], + "disc_number": 1, + "duration_ms": 228571, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/7xYyzBgQlMWXFtvWee5NYR" + }, + "href": "https://api.spotify.com/v1/tracks/7xYyzBgQlMWXFtvWee5NYR", + "id": "7xYyzBgQlMWXFtvWee5NYR", + "is_local": false, + "is_playable": true, + "name": "Kill Me", + "preview_url": null, + "track_number": 4, + "type": "track", + "uri": "spotify:track:7xYyzBgQlMWXFtvWee5NYR" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5jTFNkoZebPnX90CbB3F2A" + }, + "href": "https://api.spotify.com/v1/artists/5jTFNkoZebPnX90CbB3F2A", + "id": "5jTFNkoZebPnX90CbB3F2A", + "name": "MONO", + "type": "artist", + "uri": "spotify:artist:5jTFNkoZebPnX90CbB3F2A" + } + ], + "disc_number": 1, + "duration_ms": 245625, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6oG0E8FNTzwsKpOWFq6Wq2" + }, + "href": "https://api.spotify.com/v1/tracks/6oG0E8FNTzwsKpOWFq6Wq2", + "id": "6oG0E8FNTzwsKpOWFq6Wq2", + "is_local": false, + "is_playable": true, + "name": "Quên Anh Đi", + "preview_url": null, + "track_number": 5, + "type": "track", + "uri": "spotify:track:6oG0E8FNTzwsKpOWFq6Wq2" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5jTFNkoZebPnX90CbB3F2A" + }, + "href": "https://api.spotify.com/v1/artists/5jTFNkoZebPnX90CbB3F2A", + "id": "5jTFNkoZebPnX90CbB3F2A", + "name": "MONO", + "type": "artist", + "uri": "spotify:artist:5jTFNkoZebPnX90CbB3F2A" + } + ], + "disc_number": 1, + "duration_ms": 64000, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0n1YlzI05csSSnwoJS8iwF" + }, + "href": "https://api.spotify.com/v1/tracks/0n1YlzI05csSSnwoJS8iwF", + "id": "0n1YlzI05csSSnwoJS8iwF", + "is_local": false, + "is_playable": true, + "name": "MONOlogue", + "preview_url": null, + "track_number": 6, + "type": "track", + "uri": "spotify:track:0n1YlzI05csSSnwoJS8iwF" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5jTFNkoZebPnX90CbB3F2A" + }, + "href": "https://api.spotify.com/v1/artists/5jTFNkoZebPnX90CbB3F2A", + "id": "5jTFNkoZebPnX90CbB3F2A", + "name": "MONO", + "type": "artist", + "uri": "spotify:artist:5jTFNkoZebPnX90CbB3F2A" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/25M5YMbLCbYDSFPhQXYE8c" + }, + "href": "https://api.spotify.com/v1/artists/25M5YMbLCbYDSFPhQXYE8c", + "id": "25M5YMbLCbYDSFPhQXYE8c", + "name": "Onionn.", + "type": "artist", + "uri": "spotify:artist:25M5YMbLCbYDSFPhQXYE8c" + } + ], + "disc_number": 1, + "duration_ms": 219698, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2g4tRvSuOVNAz4p3Yfwy2O" + }, + "href": "https://api.spotify.com/v1/tracks/2g4tRvSuOVNAz4p3Yfwy2O", + "id": "2g4tRvSuOVNAz4p3Yfwy2O", + "is_local": false, + "is_playable": true, + "name": "Anh Không Thể", + "preview_url": null, + "track_number": 7, + "type": "track", + "uri": "spotify:track:2g4tRvSuOVNAz4p3Yfwy2O" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5jTFNkoZebPnX90CbB3F2A" + }, + "href": "https://api.spotify.com/v1/artists/5jTFNkoZebPnX90CbB3F2A", + "id": "5jTFNkoZebPnX90CbB3F2A", + "name": "MONO", + "type": "artist", + "uri": "spotify:artist:5jTFNkoZebPnX90CbB3F2A" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4BhqWauJSzNu8xEqNsa6Bx" + }, + "href": "https://api.spotify.com/v1/artists/4BhqWauJSzNu8xEqNsa6Bx", + "id": "4BhqWauJSzNu8xEqNsa6Bx", + "name": "Rein", + "type": "artist", + "uri": "spotify:artist:4BhqWauJSzNu8xEqNsa6Bx" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/25M5YMbLCbYDSFPhQXYE8c" + }, + "href": "https://api.spotify.com/v1/artists/25M5YMbLCbYDSFPhQXYE8c", + "id": "25M5YMbLCbYDSFPhQXYE8c", + "name": "Onionn.", + "type": "artist", + "uri": "spotify:artist:25M5YMbLCbYDSFPhQXYE8c" + } + ], + "disc_number": 1, + "duration_ms": 218052, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/4yr3swKnlTIuW11TzWBdGf" + }, + "href": "https://api.spotify.com/v1/tracks/4yr3swKnlTIuW11TzWBdGf", + "id": "4yr3swKnlTIuW11TzWBdGf", + "is_local": false, + "is_playable": true, + "name": "Do You", + "preview_url": null, + "track_number": 8, + "type": "track", + "uri": "spotify:track:4yr3swKnlTIuW11TzWBdGf" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5jTFNkoZebPnX90CbB3F2A" + }, + "href": "https://api.spotify.com/v1/artists/5jTFNkoZebPnX90CbB3F2A", + "id": "5jTFNkoZebPnX90CbB3F2A", + "name": "MONO", + "type": "artist", + "uri": "spotify:artist:5jTFNkoZebPnX90CbB3F2A" + } + ], + "disc_number": 1, + "duration_ms": 56200, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/56nAeu2d4VbBT6oK0r9ele" + }, + "href": "https://api.spotify.com/v1/tracks/56nAeu2d4VbBT6oK0r9ele", + "id": "56nAeu2d4VbBT6oK0r9ele", + "is_local": false, + "is_playable": true, + "name": "Cô nương Ahhhh~", + "preview_url": null, + "track_number": 9, + "type": "track", + "uri": "spotify:track:56nAeu2d4VbBT6oK0r9ele" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5jTFNkoZebPnX90CbB3F2A" + }, + "href": "https://api.spotify.com/v1/artists/5jTFNkoZebPnX90CbB3F2A", + "id": "5jTFNkoZebPnX90CbB3F2A", + "name": "MONO", + "type": "artist", + "uri": "spotify:artist:5jTFNkoZebPnX90CbB3F2A" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/25M5YMbLCbYDSFPhQXYE8c" + }, + "href": "https://api.spotify.com/v1/artists/25M5YMbLCbYDSFPhQXYE8c", + "id": "25M5YMbLCbYDSFPhQXYE8c", + "name": "Onionn.", + "type": "artist", + "uri": "spotify:artist:25M5YMbLCbYDSFPhQXYE8c" + } + ], + "disc_number": 1, + "duration_ms": 265600, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/5hkAuvgkOrd4KpDOlCNsvW" + }, + "href": "https://api.spotify.com/v1/tracks/5hkAuvgkOrd4KpDOlCNsvW", + "id": "5hkAuvgkOrd4KpDOlCNsvW", + "is_local": false, + "is_playable": true, + "name": "Waiting For You", + "preview_url": null, + "track_number": 10, + "type": "track", + "uri": "spotify:track:5hkAuvgkOrd4KpDOlCNsvW" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5jTFNkoZebPnX90CbB3F2A" + }, + "href": "https://api.spotify.com/v1/artists/5jTFNkoZebPnX90CbB3F2A", + "id": "5jTFNkoZebPnX90CbB3F2A", + "name": "MONO", + "type": "artist", + "uri": "spotify:artist:5jTFNkoZebPnX90CbB3F2A" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/25M5YMbLCbYDSFPhQXYE8c" + }, + "href": "https://api.spotify.com/v1/artists/25M5YMbLCbYDSFPhQXYE8c", + "id": "25M5YMbLCbYDSFPhQXYE8c", + "name": "Onionn.", + "type": "artist", + "uri": "spotify:artist:25M5YMbLCbYDSFPhQXYE8c" + } + ], + "disc_number": 1, + "duration_ms": 226235, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3VRQ7NTmCZDdFmLbBuZHUH" + }, + "href": "https://api.spotify.com/v1/tracks/3VRQ7NTmCZDdFmLbBuZHUH", + "id": "3VRQ7NTmCZDdFmLbBuZHUH", + "is_local": false, + "is_playable": true, + "name": "L.I.E", + "preview_url": null, + "track_number": 11, + "type": "track", + "uri": "spotify:track:3VRQ7NTmCZDdFmLbBuZHUH" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 11 + }, + "type": "album", + "uri": "spotify:album:3lZ0sW4znNieFHxGdyWXCj" + }, + { + "album_type": "album", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0V2DfUrZvBuUReS1LFo5ZI" + }, + "href": "https://api.spotify.com/v1/artists/0V2DfUrZvBuUReS1LFo5ZI", + "id": "0V2DfUrZvBuUReS1LFo5ZI", + "name": "Ngọt", + "type": "artist", + "uri": "spotify:artist:0V2DfUrZvBuUReS1LFo5ZI" + } + ], + "copyrights": [ + { + "text": "2019 Ngọt", + "type": "C" + }, + { + "text": "2019 Ngọt", + "type": "P" + } + ], + "external_ids": { + "upc": "3616843779842" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/2dZsaSnVn5i5uBg6FnhUVV" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/2dZsaSnVn5i5uBg6FnhUVV", + "id": "2dZsaSnVn5i5uBg6FnhUVV", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273331cabd7863a2d675633bca4", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02331cabd7863a2d675633bca4", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851331cabd7863a2d675633bca4", + "width": 64 + } + ], + "is_playable": true, + "label": "Ngọt", + "name": "3 (tuyển tập nhạc Ngọt mới trẻ sôi động 2019)", + "popularity": 55, + "release_date": "2019-06-10", + "release_date_precision": "day", + "total_tracks": 14, + "tracks": { + "href": "https://api.spotify.com/v1/albums/2dZsaSnVn5i5uBg6FnhUVV/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0V2DfUrZvBuUReS1LFo5ZI" + }, + "href": "https://api.spotify.com/v1/artists/0V2DfUrZvBuUReS1LFo5ZI", + "id": "0V2DfUrZvBuUReS1LFo5ZI", + "name": "Ngọt", + "type": "artist", + "uri": "spotify:artist:0V2DfUrZvBuUReS1LFo5ZI" + } + ], + "disc_number": 1, + "duration_ms": 216899, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/4jee49YwJGT8HAPxBF6jcx" + }, + "href": "https://api.spotify.com/v1/tracks/4jee49YwJGT8HAPxBF6jcx", + "id": "4jee49YwJGT8HAPxBF6jcx", + "is_local": false, + "is_playable": true, + "name": "MÀU (đen trắng)", + "preview_url": "https://p.scdn.co/mp3-preview/876114a28ac6f355bd5663ec5d98eb0e306176f2?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:4jee49YwJGT8HAPxBF6jcx" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0V2DfUrZvBuUReS1LFo5ZI" + }, + "href": "https://api.spotify.com/v1/artists/0V2DfUrZvBuUReS1LFo5ZI", + "id": "0V2DfUrZvBuUReS1LFo5ZI", + "name": "Ngọt", + "type": "artist", + "uri": "spotify:artist:0V2DfUrZvBuUReS1LFo5ZI" + } + ], + "disc_number": 1, + "duration_ms": 217113, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/7dh4M8CZKSRZV9QZc26Lmk" + }, + "href": "https://api.spotify.com/v1/tracks/7dh4M8CZKSRZV9QZc26Lmk", + "id": "7dh4M8CZKSRZV9QZc26Lmk", + "is_local": false, + "is_playable": true, + "name": "MẾU MÁO (T.T)", + "preview_url": "https://p.scdn.co/mp3-preview/c010cd5327003011ab982cdd82cff11419dc39fa?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 2, + "type": "track", + "uri": "spotify:track:7dh4M8CZKSRZV9QZc26Lmk" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0V2DfUrZvBuUReS1LFo5ZI" + }, + "href": "https://api.spotify.com/v1/artists/0V2DfUrZvBuUReS1LFo5ZI", + "id": "0V2DfUrZvBuUReS1LFo5ZI", + "name": "Ngọt", + "type": "artist", + "uri": "spotify:artist:0V2DfUrZvBuUReS1LFo5ZI" + } + ], + "disc_number": 1, + "duration_ms": 275713, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/31ueUFld6MiKi3gsCmCOEs" + }, + "href": "https://api.spotify.com/v1/tracks/31ueUFld6MiKi3gsCmCOEs", + "id": "31ueUFld6MiKi3gsCmCOEs", + "is_local": false, + "is_playable": true, + "name": "EM CÓ CHẮC KHÔNG (?) (bài ca rebound)", + "preview_url": "https://p.scdn.co/mp3-preview/ca510ea00461656ad6117a321d6c123199195e8e?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 3, + "type": "track", + "uri": "spotify:track:31ueUFld6MiKi3gsCmCOEs" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0V2DfUrZvBuUReS1LFo5ZI" + }, + "href": "https://api.spotify.com/v1/artists/0V2DfUrZvBuUReS1LFo5ZI", + "id": "0V2DfUrZvBuUReS1LFo5ZI", + "name": "Ngọt", + "type": "artist", + "uri": "spotify:artist:0V2DfUrZvBuUReS1LFo5ZI" + } + ], + "disc_number": 1, + "duration_ms": 178446, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0HM1TvJELK3ZJuG5owZY7T" + }, + "href": "https://api.spotify.com/v1/tracks/0HM1TvJELK3ZJuG5owZY7T", + "id": "0HM1TvJELK3ZJuG5owZY7T", + "is_local": false, + "is_playable": true, + "name": "GIẢ VỜ", + "preview_url": "https://p.scdn.co/mp3-preview/d9b06a961263f879dbb982933b6e4a6b3828db66?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 4, + "type": "track", + "uri": "spotify:track:0HM1TvJELK3ZJuG5owZY7T" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0V2DfUrZvBuUReS1LFo5ZI" + }, + "href": "https://api.spotify.com/v1/artists/0V2DfUrZvBuUReS1LFo5ZI", + "id": "0V2DfUrZvBuUReS1LFo5ZI", + "name": "Ngọt", + "type": "artist", + "uri": "spotify:artist:0V2DfUrZvBuUReS1LFo5ZI" + } + ], + "disc_number": 1, + "duration_ms": 247873, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/4cbqBy30awUz6PTUuJPuXT" + }, + "href": "https://api.spotify.com/v1/tracks/4cbqBy30awUz6PTUuJPuXT", + "id": "4cbqBy30awUz6PTUuJPuXT", + "is_local": false, + "is_playable": true, + "name": "CHUÔNG BÁO THỨC (sáng rồi)", + "preview_url": "https://p.scdn.co/mp3-preview/4e9092bf22f392a048f85e500fab6f0618ea3036?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 5, + "type": "track", + "uri": "spotify:track:4cbqBy30awUz6PTUuJPuXT" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0V2DfUrZvBuUReS1LFo5ZI" + }, + "href": "https://api.spotify.com/v1/artists/0V2DfUrZvBuUReS1LFo5ZI", + "id": "0V2DfUrZvBuUReS1LFo5ZI", + "name": "Ngọt", + "type": "artist", + "uri": "spotify:artist:0V2DfUrZvBuUReS1LFo5ZI" + } + ], + "disc_number": 1, + "duration_ms": 198753, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/5pJ70VyPyN0AyhAdF5GxSJ" + }, + "href": "https://api.spotify.com/v1/tracks/5pJ70VyPyN0AyhAdF5GxSJ", + "id": "5pJ70VyPyN0AyhAdF5GxSJ", + "is_local": false, + "is_playable": true, + "name": "(sau đây là) DỰ BÁO THỜI TIẾT (cho các vùng vào ngày mai)", + "preview_url": "https://p.scdn.co/mp3-preview/b145a491c8480ed42dfcee1da8a2637d1bcfe07c?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 6, + "type": "track", + "uri": "spotify:track:5pJ70VyPyN0AyhAdF5GxSJ" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0V2DfUrZvBuUReS1LFo5ZI" + }, + "href": "https://api.spotify.com/v1/artists/0V2DfUrZvBuUReS1LFo5ZI", + "id": "0V2DfUrZvBuUReS1LFo5ZI", + "name": "Ngọt", + "type": "artist", + "uri": "spotify:artist:0V2DfUrZvBuUReS1LFo5ZI" + } + ], + "disc_number": 1, + "duration_ms": 273806, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2nATvj5kfqy5r6RjgJ53JK" + }, + "href": "https://api.spotify.com/v1/tracks/2nATvj5kfqy5r6RjgJ53JK", + "id": "2nATvj5kfqy5r6RjgJ53JK", + "is_local": false, + "is_playable": true, + "name": "CHUYỂN KÊNH (sản phẩm này không phải là thuốc)", + "preview_url": "https://p.scdn.co/mp3-preview/fa58f30c06ec9ce3da8da452b4f59f4ff51abee8?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 7, + "type": "track", + "uri": "spotify:track:2nATvj5kfqy5r6RjgJ53JK" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0V2DfUrZvBuUReS1LFo5ZI" + }, + "href": "https://api.spotify.com/v1/artists/0V2DfUrZvBuUReS1LFo5ZI", + "id": "0V2DfUrZvBuUReS1LFo5ZI", + "name": "Ngọt", + "type": "artist", + "uri": "spotify:artist:0V2DfUrZvBuUReS1LFo5ZI" + } + ], + "disc_number": 1, + "duration_ms": 278779, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3YEPCntjHsvzLov9l2FVqS" + }, + "href": "https://api.spotify.com/v1/tracks/3YEPCntjHsvzLov9l2FVqS", + "id": "3YEPCntjHsvzLov9l2FVqS", + "is_local": false, + "is_playable": true, + "name": "HẾT THỜI", + "preview_url": "https://p.scdn.co/mp3-preview/f0e2eb6e06a52c2edab714bbec8de3beeaa820d6?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 8, + "type": "track", + "uri": "spotify:track:3YEPCntjHsvzLov9l2FVqS" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0V2DfUrZvBuUReS1LFo5ZI" + }, + "href": "https://api.spotify.com/v1/artists/0V2DfUrZvBuUReS1LFo5ZI", + "id": "0V2DfUrZvBuUReS1LFo5ZI", + "name": "Ngọt", + "type": "artist", + "uri": "spotify:artist:0V2DfUrZvBuUReS1LFo5ZI" + } + ], + "disc_number": 1, + "duration_ms": 165313, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1PSh36KndmbELCffSBHDhB" + }, + "href": "https://api.spotify.com/v1/tracks/1PSh36KndmbELCffSBHDhB", + "id": "1PSh36KndmbELCffSBHDhB", + "is_local": false, + "is_playable": true, + "name": "VÉ ĐI THIÊN ĐƯỜNG (một chiều)", + "preview_url": "https://p.scdn.co/mp3-preview/9fa8843a1ea42c880ef8d9f034da911b077caa1c?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 9, + "type": "track", + "uri": "spotify:track:1PSh36KndmbELCffSBHDhB" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0V2DfUrZvBuUReS1LFo5ZI" + }, + "href": "https://api.spotify.com/v1/artists/0V2DfUrZvBuUReS1LFo5ZI", + "id": "0V2DfUrZvBuUReS1LFo5ZI", + "name": "Ngọt", + "type": "artist", + "uri": "spotify:artist:0V2DfUrZvBuUReS1LFo5ZI" + } + ], + "disc_number": 1, + "duration_ms": 245819, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2kALQoFlKxSaerOCFB1vdm" + }, + "href": "https://api.spotify.com/v1/tracks/2kALQoFlKxSaerOCFB1vdm", + "id": "2kALQoFlKxSaerOCFB1vdm", + "is_local": false, + "is_playable": true, + "name": "(tôi) ĐI TRÚ ĐÔNG", + "preview_url": "https://p.scdn.co/mp3-preview/9117f09eb37302bf998301f107045d6996f8fd7f?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 10, + "type": "track", + "uri": "spotify:track:2kALQoFlKxSaerOCFB1vdm" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0V2DfUrZvBuUReS1LFo5ZI" + }, + "href": "https://api.spotify.com/v1/artists/0V2DfUrZvBuUReS1LFo5ZI", + "id": "0V2DfUrZvBuUReS1LFo5ZI", + "name": "Ngọt", + "type": "artist", + "uri": "spotify:artist:0V2DfUrZvBuUReS1LFo5ZI" + } + ], + "disc_number": 1, + "duration_ms": 276859, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/5FJs0VIIGdFZ1qc692PG9w" + }, + "href": "https://api.spotify.com/v1/tracks/5FJs0VIIGdFZ1qc692PG9w", + "id": "5FJs0VIIGdFZ1qc692PG9w", + "is_local": false, + "is_playable": true, + "name": "(bé)", + "preview_url": "https://p.scdn.co/mp3-preview/b347308ed9140fcf0cbfba3a202364f77c94f04a?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 11, + "type": "track", + "uri": "spotify:track:5FJs0VIIGdFZ1qc692PG9w" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0V2DfUrZvBuUReS1LFo5ZI" + }, + "href": "https://api.spotify.com/v1/artists/0V2DfUrZvBuUReS1LFo5ZI", + "id": "0V2DfUrZvBuUReS1LFo5ZI", + "name": "Ngọt", + "type": "artist", + "uri": "spotify:artist:0V2DfUrZvBuUReS1LFo5ZI" + } + ], + "disc_number": 1, + "duration_ms": 222846, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0AJi38NumMDXqo8pRw6zdh" + }, + "href": "https://api.spotify.com/v1/tracks/0AJi38NumMDXqo8pRw6zdh", + "id": "0AJi38NumMDXqo8pRw6zdh", + "is_local": false, + "is_playable": true, + "name": "LẦN CUỐI (đi bên em xót xa người ơi)", + "preview_url": "https://p.scdn.co/mp3-preview/6693b58902605cc34ff45dddeb70312c07864ebc?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 12, + "type": "track", + "uri": "spotify:track:0AJi38NumMDXqo8pRw6zdh" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0V2DfUrZvBuUReS1LFo5ZI" + }, + "href": "https://api.spotify.com/v1/artists/0V2DfUrZvBuUReS1LFo5ZI", + "id": "0V2DfUrZvBuUReS1LFo5ZI", + "name": "Ngọt", + "type": "artist", + "uri": "spotify:artist:0V2DfUrZvBuUReS1LFo5ZI" + } + ], + "disc_number": 1, + "duration_ms": 392673, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/41yXHyVw3iPQd9F4RXDR8y" + }, + "href": "https://api.spotify.com/v1/tracks/41yXHyVw3iPQd9F4RXDR8y", + "id": "41yXHyVw3iPQd9F4RXDR8y", + "is_local": false, + "is_playable": true, + "name": "NỨT (đôi chân đôi tay đôi mắt trái tim)", + "preview_url": "https://p.scdn.co/mp3-preview/0c2f78777594089a01bed55faddca1ac87b5dfa2?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 13, + "type": "track", + "uri": "spotify:track:41yXHyVw3iPQd9F4RXDR8y" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0V2DfUrZvBuUReS1LFo5ZI" + }, + "href": "https://api.spotify.com/v1/artists/0V2DfUrZvBuUReS1LFo5ZI", + "id": "0V2DfUrZvBuUReS1LFo5ZI", + "name": "Ngọt", + "type": "artist", + "uri": "spotify:artist:0V2DfUrZvBuUReS1LFo5ZI" + } + ], + "disc_number": 1, + "duration_ms": 126939, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/4as3LLLS2ONSNqgCV6saUR" + }, + "href": "https://api.spotify.com/v1/tracks/4as3LLLS2ONSNqgCV6saUR", + "id": "4as3LLLS2ONSNqgCV6saUR", + "is_local": false, + "is_playable": true, + "name": "RU MÌNH", + "preview_url": "https://p.scdn.co/mp3-preview/3c32bb8ee0b04c8b5adc51dfac9e3f01145db2a5?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 14, + "type": "track", + "uri": "spotify:track:4as3LLLS2ONSNqgCV6saUR" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 14 + }, + "type": "album", + "uri": "spotify:album:2dZsaSnVn5i5uBg6FnhUVV" + }, + { + "album_type": "compilation", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2Gvp79Cmni6PX13CAlSGex" + }, + "href": "https://api.spotify.com/v1/artists/2Gvp79Cmni6PX13CAlSGex", + "id": "2Gvp79Cmni6PX13CAlSGex", + "name": "Bùi Anh Tuấn", + "type": "artist", + "uri": "spotify:artist:2Gvp79Cmni6PX13CAlSGex" + } + ], + "copyrights": [ + { + "text": "2016 Bùi Anh Tuấn", + "type": "C" + }, + { + "text": "2016 Bùi Anh Tuấn", + "type": "P" + } + ], + "external_ids": { + "upc": "3616556782054" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/0ikT7EGA2fjpZMPEzIhCD7" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/0ikT7EGA2fjpZMPEzIhCD7", + "id": "0ikT7EGA2fjpZMPEzIhCD7", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b2737c3c408abc908828a405731b", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e027c3c408abc908828a405731b", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d000048517c3c408abc908828a405731b", + "width": 64 + } + ], + "is_playable": true, + "label": "Bui Anh Tuan", + "name": "Album Collection 1: Xin Em", + "popularity": 54, + "release_date": "2016-09-15", + "release_date_precision": "day", + "total_tracks": 10, + "tracks": { + "href": "https://api.spotify.com/v1/albums/0ikT7EGA2fjpZMPEzIhCD7/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2Gvp79Cmni6PX13CAlSGex" + }, + "href": "https://api.spotify.com/v1/artists/2Gvp79Cmni6PX13CAlSGex", + "id": "2Gvp79Cmni6PX13CAlSGex", + "name": "Bùi Anh Tuấn", + "type": "artist", + "uri": "spotify:artist:2Gvp79Cmni6PX13CAlSGex" + } + ], + "disc_number": 1, + "duration_ms": 326186, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/7Exn4fxCDYXmx4eyiSbdA0" + }, + "href": "https://api.spotify.com/v1/tracks/7Exn4fxCDYXmx4eyiSbdA0", + "id": "7Exn4fxCDYXmx4eyiSbdA0", + "is_local": false, + "is_playable": true, + "name": "Xin Em", + "preview_url": "https://p.scdn.co/mp3-preview/ee61da87adf331143ce610f8cd9c37173904c2b7?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:7Exn4fxCDYXmx4eyiSbdA0" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2Gvp79Cmni6PX13CAlSGex" + }, + "href": "https://api.spotify.com/v1/artists/2Gvp79Cmni6PX13CAlSGex", + "id": "2Gvp79Cmni6PX13CAlSGex", + "name": "Bùi Anh Tuấn", + "type": "artist", + "uri": "spotify:artist:2Gvp79Cmni6PX13CAlSGex" + } + ], + "disc_number": 1, + "duration_ms": 248760, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6FcVB6xmkGUwtP0hpySRR2" + }, + "href": "https://api.spotify.com/v1/tracks/6FcVB6xmkGUwtP0hpySRR2", + "id": "6FcVB6xmkGUwtP0hpySRR2", + "is_local": false, + "is_playable": true, + "name": "Hàn Gắn", + "preview_url": "https://p.scdn.co/mp3-preview/d3613237d8040687a43fa6c6b977fff5357a5c87?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 2, + "type": "track", + "uri": "spotify:track:6FcVB6xmkGUwtP0hpySRR2" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2Gvp79Cmni6PX13CAlSGex" + }, + "href": "https://api.spotify.com/v1/artists/2Gvp79Cmni6PX13CAlSGex", + "id": "2Gvp79Cmni6PX13CAlSGex", + "name": "Bùi Anh Tuấn", + "type": "artist", + "uri": "spotify:artist:2Gvp79Cmni6PX13CAlSGex" + } + ], + "disc_number": 1, + "duration_ms": 276160, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/5y3m3UvJRHDPCqO2SBq98f" + }, + "href": "https://api.spotify.com/v1/tracks/5y3m3UvJRHDPCqO2SBq98f", + "id": "5y3m3UvJRHDPCqO2SBq98f", + "is_local": false, + "is_playable": true, + "name": "Nơi Tình Yêu Bắt Đầu", + "preview_url": "https://p.scdn.co/mp3-preview/083f8963491df38d95ac633ecf241f994c982b5a?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 3, + "type": "track", + "uri": "spotify:track:5y3m3UvJRHDPCqO2SBq98f" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2Gvp79Cmni6PX13CAlSGex" + }, + "href": "https://api.spotify.com/v1/artists/2Gvp79Cmni6PX13CAlSGex", + "id": "2Gvp79Cmni6PX13CAlSGex", + "name": "Bùi Anh Tuấn", + "type": "artist", + "uri": "spotify:artist:2Gvp79Cmni6PX13CAlSGex" + } + ], + "disc_number": 1, + "duration_ms": 315986, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/13oWTZuocqL7XmsBBgNiZk" + }, + "href": "https://api.spotify.com/v1/tracks/13oWTZuocqL7XmsBBgNiZk", + "id": "13oWTZuocqL7XmsBBgNiZk", + "is_local": false, + "is_playable": true, + "name": "Chỉ Còn Lại Tình Yêu", + "preview_url": "https://p.scdn.co/mp3-preview/cded063ecc842d50a6f7852d97086ebb8cc8f337?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 4, + "type": "track", + "uri": "spotify:track:13oWTZuocqL7XmsBBgNiZk" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2Gvp79Cmni6PX13CAlSGex" + }, + "href": "https://api.spotify.com/v1/artists/2Gvp79Cmni6PX13CAlSGex", + "id": "2Gvp79Cmni6PX13CAlSGex", + "name": "Bùi Anh Tuấn", + "type": "artist", + "uri": "spotify:artist:2Gvp79Cmni6PX13CAlSGex" + } + ], + "disc_number": 1, + "duration_ms": 317773, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6ahYdGHGTfy83VwR4AhQi9" + }, + "href": "https://api.spotify.com/v1/tracks/6ahYdGHGTfy83VwR4AhQi9", + "id": "6ahYdGHGTfy83VwR4AhQi9", + "is_local": false, + "is_playable": true, + "name": "Nơi Tình Yêu Kết Thúc", + "preview_url": "https://p.scdn.co/mp3-preview/02dc92cd9f650897261c273089db0096bfb7bdac?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 5, + "type": "track", + "uri": "spotify:track:6ahYdGHGTfy83VwR4AhQi9" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2Gvp79Cmni6PX13CAlSGex" + }, + "href": "https://api.spotify.com/v1/artists/2Gvp79Cmni6PX13CAlSGex", + "id": "2Gvp79Cmni6PX13CAlSGex", + "name": "Bùi Anh Tuấn", + "type": "artist", + "uri": "spotify:artist:2Gvp79Cmni6PX13CAlSGex" + } + ], + "disc_number": 1, + "duration_ms": 233240, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/67Cxa088HT5J5OJ0SWB6Ip" + }, + "href": "https://api.spotify.com/v1/tracks/67Cxa088HT5J5OJ0SWB6Ip", + "id": "67Cxa088HT5J5OJ0SWB6Ip", + "is_local": false, + "is_playable": true, + "name": "Buông", + "preview_url": "https://p.scdn.co/mp3-preview/7d2c5f0351b215852ece16ae6beedbca1c51f82e?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 6, + "type": "track", + "uri": "spotify:track:67Cxa088HT5J5OJ0SWB6Ip" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2Gvp79Cmni6PX13CAlSGex" + }, + "href": "https://api.spotify.com/v1/artists/2Gvp79Cmni6PX13CAlSGex", + "id": "2Gvp79Cmni6PX13CAlSGex", + "name": "Bùi Anh Tuấn", + "type": "artist", + "uri": "spotify:artist:2Gvp79Cmni6PX13CAlSGex" + } + ], + "disc_number": 1, + "duration_ms": 251666, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/5OIARIcGdLPgB8XKsuG60G" + }, + "href": "https://api.spotify.com/v1/tracks/5OIARIcGdLPgB8XKsuG60G", + "id": "5OIARIcGdLPgB8XKsuG60G", + "is_local": false, + "is_playable": true, + "name": "Ngừng", + "preview_url": "https://p.scdn.co/mp3-preview/af8e93cfb8143ccfd6726544de6460ed7b670193?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 7, + "type": "track", + "uri": "spotify:track:5OIARIcGdLPgB8XKsuG60G" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2Gvp79Cmni6PX13CAlSGex" + }, + "href": "https://api.spotify.com/v1/artists/2Gvp79Cmni6PX13CAlSGex", + "id": "2Gvp79Cmni6PX13CAlSGex", + "name": "Bùi Anh Tuấn", + "type": "artist", + "uri": "spotify:artist:2Gvp79Cmni6PX13CAlSGex" + } + ], + "disc_number": 1, + "duration_ms": 325560, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/7u6aLoRR0posbr4t6X1zWL" + }, + "href": "https://api.spotify.com/v1/tracks/7u6aLoRR0posbr4t6X1zWL", + "id": "7u6aLoRR0posbr4t6X1zWL", + "is_local": false, + "is_playable": true, + "name": "Bí Mật Không Tên", + "preview_url": "https://p.scdn.co/mp3-preview/fc920c05e2c7e6cb60dcf740d759c69ef614a323?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 8, + "type": "track", + "uri": "spotify:track:7u6aLoRR0posbr4t6X1zWL" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2Gvp79Cmni6PX13CAlSGex" + }, + "href": "https://api.spotify.com/v1/artists/2Gvp79Cmni6PX13CAlSGex", + "id": "2Gvp79Cmni6PX13CAlSGex", + "name": "Bùi Anh Tuấn", + "type": "artist", + "uri": "spotify:artist:2Gvp79Cmni6PX13CAlSGex" + } + ], + "disc_number": 1, + "duration_ms": 249066, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1B1nTRl3efcnnd83FvEkJ3" + }, + "href": "https://api.spotify.com/v1/tracks/1B1nTRl3efcnnd83FvEkJ3", + "id": "1B1nTRl3efcnnd83FvEkJ3", + "is_local": false, + "is_playable": true, + "name": "Gần", + "preview_url": "https://p.scdn.co/mp3-preview/3b09aab87d4e15869612cb8048e092a315c48dc2?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 9, + "type": "track", + "uri": "spotify:track:1B1nTRl3efcnnd83FvEkJ3" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2Gvp79Cmni6PX13CAlSGex" + }, + "href": "https://api.spotify.com/v1/artists/2Gvp79Cmni6PX13CAlSGex", + "id": "2Gvp79Cmni6PX13CAlSGex", + "name": "Bùi Anh Tuấn", + "type": "artist", + "uri": "spotify:artist:2Gvp79Cmni6PX13CAlSGex" + } + ], + "disc_number": 1, + "duration_ms": 260760, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0rtwHli23DZDBobMqluwSd" + }, + "href": "https://api.spotify.com/v1/tracks/0rtwHli23DZDBobMqluwSd", + "id": "0rtwHli23DZDBobMqluwSd", + "is_local": false, + "is_playable": true, + "name": "Mơ Hồ", + "preview_url": "https://p.scdn.co/mp3-preview/815411a4f54737a9388df1486d66e63109f8b619?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 10, + "type": "track", + "uri": "spotify:track:0rtwHli23DZDBobMqluwSd" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 10 + }, + "type": "album", + "uri": "spotify:album:0ikT7EGA2fjpZMPEzIhCD7" + }, + { + "album_type": "album", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/41MozSoPIsD1dJM0CLPjZF" + }, + "href": "https://api.spotify.com/v1/artists/41MozSoPIsD1dJM0CLPjZF", + "id": "41MozSoPIsD1dJM0CLPjZF", + "name": "BLACKPINK", + "type": "artist", + "uri": "spotify:artist:41MozSoPIsD1dJM0CLPjZF" + } + ], + "copyrights": [ + { + "text": "YG Entertainment", + "type": "C" + }, + { + "text": "YG Entertainment, under license to YG PLUS", + "type": "P" + } + ], + "external_ids": { + "upc": "191222005314" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/2gNPnKP1PDkB5SZz3IMKuX" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/2gNPnKP1PDkB5SZz3IMKuX", + "id": "2gNPnKP1PDkB5SZz3IMKuX", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b2731895052324f123becdd0d53d", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e021895052324f123becdd0d53d", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d000048511895052324f123becdd0d53d", + "width": 64 + } + ], + "is_playable": true, + "label": "YG Entertainment", + "name": "THE ALBUM", + "popularity": 80, + "release_date": "2020-10-02", + "release_date_precision": "day", + "total_tracks": 8, + "tracks": { + "href": "https://api.spotify.com/v1/albums/2gNPnKP1PDkB5SZz3IMKuX/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/41MozSoPIsD1dJM0CLPjZF" + }, + "href": "https://api.spotify.com/v1/artists/41MozSoPIsD1dJM0CLPjZF", + "id": "41MozSoPIsD1dJM0CLPjZF", + "name": "BLACKPINK", + "type": "artist", + "uri": "spotify:artist:41MozSoPIsD1dJM0CLPjZF" + } + ], + "disc_number": 1, + "duration_ms": 180956, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6bvZRLLkBKkmgpBJTTj3QK" + }, + "href": "https://api.spotify.com/v1/tracks/6bvZRLLkBKkmgpBJTTj3QK", + "id": "6bvZRLLkBKkmgpBJTTj3QK", + "is_local": false, + "is_playable": true, + "name": "How You Like That", + "preview_url": "https://p.scdn.co/mp3-preview/1e69b83c57c81953bd66252d4ecf5ba5649171fa?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:6bvZRLLkBKkmgpBJTTj3QK" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/41MozSoPIsD1dJM0CLPjZF" + }, + "href": "https://api.spotify.com/v1/artists/41MozSoPIsD1dJM0CLPjZF", + "id": "41MozSoPIsD1dJM0CLPjZF", + "name": "BLACKPINK", + "type": "artist", + "uri": "spotify:artist:41MozSoPIsD1dJM0CLPjZF" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0C8ZW7ezQVs4URX5aX7Kqx" + }, + "href": "https://api.spotify.com/v1/artists/0C8ZW7ezQVs4URX5aX7Kqx", + "id": "0C8ZW7ezQVs4URX5aX7Kqx", + "name": "Selena Gomez", + "type": "artist", + "uri": "spotify:artist:0C8ZW7ezQVs4URX5aX7Kqx" + } + ], + "disc_number": 1, + "duration_ms": 175813, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1cdbkpZ3q1KYZDNSrOpdkb" + }, + "href": "https://api.spotify.com/v1/tracks/1cdbkpZ3q1KYZDNSrOpdkb", + "id": "1cdbkpZ3q1KYZDNSrOpdkb", + "is_local": false, + "is_playable": true, + "name": "Ice Cream (with Selena Gomez)", + "preview_url": "https://p.scdn.co/mp3-preview/7b1a37252e7510b4d1dce6e60f01f9452788a662?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 2, + "type": "track", + "uri": "spotify:track:1cdbkpZ3q1KYZDNSrOpdkb" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/41MozSoPIsD1dJM0CLPjZF" + }, + "href": "https://api.spotify.com/v1/artists/41MozSoPIsD1dJM0CLPjZF", + "id": "41MozSoPIsD1dJM0CLPjZF", + "name": "BLACKPINK", + "type": "artist", + "uri": "spotify:artist:41MozSoPIsD1dJM0CLPjZF" + } + ], + "disc_number": 1, + "duration_ms": 199122, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/28tufPkTcXmdNqTvi9hsoG" + }, + "href": "https://api.spotify.com/v1/tracks/28tufPkTcXmdNqTvi9hsoG", + "id": "28tufPkTcXmdNqTvi9hsoG", + "is_local": false, + "is_playable": true, + "name": "Pretty Savage", + "preview_url": "https://p.scdn.co/mp3-preview/1e92ef827f8ac53816c3e57c02a6d8b6a9e91fe1?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 3, + "type": "track", + "uri": "spotify:track:28tufPkTcXmdNqTvi9hsoG" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/41MozSoPIsD1dJM0CLPjZF" + }, + "href": "https://api.spotify.com/v1/artists/41MozSoPIsD1dJM0CLPjZF", + "id": "41MozSoPIsD1dJM0CLPjZF", + "name": "BLACKPINK", + "type": "artist", + "uri": "spotify:artist:41MozSoPIsD1dJM0CLPjZF" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4kYSro6naA4h99UJvo89HB" + }, + "href": "https://api.spotify.com/v1/artists/4kYSro6naA4h99UJvo89HB", + "id": "4kYSro6naA4h99UJvo89HB", + "name": "Cardi B", + "type": "artist", + "uri": "spotify:artist:4kYSro6naA4h99UJvo89HB" + } + ], + "disc_number": 1, + "duration_ms": 159168, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3AgMOlgdrG9RJXDWifcjVd" + }, + "href": "https://api.spotify.com/v1/tracks/3AgMOlgdrG9RJXDWifcjVd", + "id": "3AgMOlgdrG9RJXDWifcjVd", + "is_local": false, + "is_playable": true, + "name": "Bet You Wanna (Feat. Cardi B)", + "preview_url": "https://p.scdn.co/mp3-preview/91f39bde453fb46c045c1839ea5a23ae41377849?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 4, + "type": "track", + "uri": "spotify:track:3AgMOlgdrG9RJXDWifcjVd" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/41MozSoPIsD1dJM0CLPjZF" + }, + "href": "https://api.spotify.com/v1/artists/41MozSoPIsD1dJM0CLPjZF", + "id": "41MozSoPIsD1dJM0CLPjZF", + "name": "BLACKPINK", + "type": "artist", + "uri": "spotify:artist:41MozSoPIsD1dJM0CLPjZF" + } + ], + "disc_number": 1, + "duration_ms": 192765, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1GMufNnkKAnPLnqKJ5HHxW" + }, + "href": "https://api.spotify.com/v1/tracks/1GMufNnkKAnPLnqKJ5HHxW", + "id": "1GMufNnkKAnPLnqKJ5HHxW", + "is_local": false, + "is_playable": true, + "name": "Lovesick Girls", + "preview_url": "https://p.scdn.co/mp3-preview/0aaa1ab3651aeffd0386bf48383ae76b6e759d6f?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 5, + "type": "track", + "uri": "spotify:track:1GMufNnkKAnPLnqKJ5HHxW" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/41MozSoPIsD1dJM0CLPjZF" + }, + "href": "https://api.spotify.com/v1/artists/41MozSoPIsD1dJM0CLPjZF", + "id": "41MozSoPIsD1dJM0CLPjZF", + "name": "BLACKPINK", + "type": "artist", + "uri": "spotify:artist:41MozSoPIsD1dJM0CLPjZF" + } + ], + "disc_number": 1, + "duration_ms": 161945, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/7bi5vk9KoY6Flkat31ViYD" + }, + "href": "https://api.spotify.com/v1/tracks/7bi5vk9KoY6Flkat31ViYD", + "id": "7bi5vk9KoY6Flkat31ViYD", + "is_local": false, + "is_playable": true, + "name": "Crazy Over You", + "preview_url": "https://p.scdn.co/mp3-preview/80edd00c71b82f7c9f7a89881afa72b5d4a1e355?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 6, + "type": "track", + "uri": "spotify:track:7bi5vk9KoY6Flkat31ViYD" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/41MozSoPIsD1dJM0CLPjZF" + }, + "href": "https://api.spotify.com/v1/artists/41MozSoPIsD1dJM0CLPjZF", + "id": "41MozSoPIsD1dJM0CLPjZF", + "name": "BLACKPINK", + "type": "artist", + "uri": "spotify:artist:41MozSoPIsD1dJM0CLPjZF" + } + ], + "disc_number": 1, + "duration_ms": 169797, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3Gk1LfB771PIEGgsEa7gcV" + }, + "href": "https://api.spotify.com/v1/tracks/3Gk1LfB771PIEGgsEa7gcV", + "id": "3Gk1LfB771PIEGgsEa7gcV", + "is_local": false, + "is_playable": true, + "name": "Love To Hate Me", + "preview_url": "https://p.scdn.co/mp3-preview/6e8805189c9db8950d07b65ba2882f95d8698dc6?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 7, + "type": "track", + "uri": "spotify:track:3Gk1LfB771PIEGgsEa7gcV" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/41MozSoPIsD1dJM0CLPjZF" + }, + "href": "https://api.spotify.com/v1/artists/41MozSoPIsD1dJM0CLPjZF", + "id": "41MozSoPIsD1dJM0CLPjZF", + "name": "BLACKPINK", + "type": "artist", + "uri": "spotify:artist:41MozSoPIsD1dJM0CLPjZF" + } + ], + "disc_number": 1, + "duration_ms": 229201, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/00J8yszzb5PR6ZIvSBtg0Y" + }, + "href": "https://api.spotify.com/v1/tracks/00J8yszzb5PR6ZIvSBtg0Y", + "id": "00J8yszzb5PR6ZIvSBtg0Y", + "is_local": false, + "is_playable": true, + "name": "You Never Know", + "preview_url": "https://p.scdn.co/mp3-preview/b7afd096e0c16f3f6ae6e3f7fa029f5b08c93e4b?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 8, + "type": "track", + "uri": "spotify:track:00J8yszzb5PR6ZIvSBtg0Y" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 8 + }, + "type": "album", + "uri": "spotify:album:2gNPnKP1PDkB5SZz3IMKuX" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "copyrights": [ + { + "text": "(P) 2021 Melted Stone under exclusive license to Columbia Records, a Division of Sony Music Entertainment", + "type": "P" + } + ], + "external_ids": { + "upc": "886449652907" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/224jZ4sUX7OhAuMwaxp86S" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/224jZ4sUX7OhAuMwaxp86S", + "id": "224jZ4sUX7OhAuMwaxp86S", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b27350dba34377a595e35f81b0e4", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e0250dba34377a595e35f81b0e4", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d0000485150dba34377a595e35f81b0e4", + "width": 64 + } + ], + "is_playable": true, + "label": "Columbia", + "name": "Easy On Me", + "popularity": 77, + "release_date": "2021-10-14", + "release_date_precision": "day", + "total_tracks": 1, + "tracks": { + "href": "https://api.spotify.com/v1/albums/224jZ4sUX7OhAuMwaxp86S/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 224694, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0gplL1WMoJ6iYaPgMCL0gX" + }, + "href": "https://api.spotify.com/v1/tracks/0gplL1WMoJ6iYaPgMCL0gX", + "id": "0gplL1WMoJ6iYaPgMCL0gX", + "is_local": false, + "is_playable": true, + "name": "Easy On Me", + "preview_url": "https://p.scdn.co/mp3-preview/a0cd8077c79a4aa3dcaa68bbc5ecdeda46e8d13f?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:0gplL1WMoJ6iYaPgMCL0gX" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 1 + }, + "type": "album", + "uri": "spotify:album:224jZ4sUX7OhAuMwaxp86S" + }, + { + "album_type": "album", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "copyrights": [ + { + "text": "(P) 2021 Melted Stone under exclusive license to Columbia Records, a Division of Sony Music Entertainment", + "type": "P" + } + ], + "external_ids": { + "upc": "886449666447" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/21jF5jlMtzo94wbxmJ18aa" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/21jF5jlMtzo94wbxmJ18aa", + "id": "21jF5jlMtzo94wbxmJ18aa", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273c6b577e4c4a6d326354a89f7", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02c6b577e4c4a6d326354a89f7", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851c6b577e4c4a6d326354a89f7", + "width": 64 + } + ], + "is_playable": true, + "label": "Columbia", + "name": "30", + "popularity": 85, + "release_date": "2021-11-19", + "release_date_precision": "day", + "total_tracks": 12, + "tracks": { + "href": "https://api.spotify.com/v1/albums/21jF5jlMtzo94wbxmJ18aa/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 182163, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/13CVSGLSFl4UxpDVR6u3dq" + }, + "href": "https://api.spotify.com/v1/tracks/13CVSGLSFl4UxpDVR6u3dq", + "id": "13CVSGLSFl4UxpDVR6u3dq", + "is_local": false, + "is_playable": true, + "name": "Strangers By Nature", + "preview_url": "https://p.scdn.co/mp3-preview/2db2a405e5efcacedd8a7063366ca719163d6ccc?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:13CVSGLSFl4UxpDVR6u3dq" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 224694, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/46IZ0fSY2mpAiktS3KOqds" + }, + "href": "https://api.spotify.com/v1/tracks/46IZ0fSY2mpAiktS3KOqds", + "id": "46IZ0fSY2mpAiktS3KOqds", + "is_local": false, + "is_playable": true, + "name": "Easy On Me", + "preview_url": "https://p.scdn.co/mp3-preview/a0cd8077c79a4aa3dcaa68bbc5ecdeda46e8d13f?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 2, + "type": "track", + "uri": "spotify:track:46IZ0fSY2mpAiktS3KOqds" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 389107, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2DuPBbS5mIldXnh7Wum8Cy" + }, + "href": "https://api.spotify.com/v1/tracks/2DuPBbS5mIldXnh7Wum8Cy", + "id": "2DuPBbS5mIldXnh7Wum8Cy", + "is_local": false, + "is_playable": true, + "name": "My Little Love", + "preview_url": "https://p.scdn.co/mp3-preview/c4ce57ef6fa27d69781236e7ba715cec57cc622e?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 3, + "type": "track", + "uri": "spotify:track:2DuPBbS5mIldXnh7Wum8Cy" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 255278, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/09u787BYeYIGd2mFIJ505t" + }, + "href": "https://api.spotify.com/v1/tracks/09u787BYeYIGd2mFIJ505t", + "id": "09u787BYeYIGd2mFIJ505t", + "is_local": false, + "is_playable": true, + "name": "Cry Your Heart Out", + "preview_url": "https://p.scdn.co/mp3-preview/3d2c1e1714f9c6701ed8d978f4e70b497a0dbc06?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 4, + "type": "track", + "uri": "spotify:track:09u787BYeYIGd2mFIJ505t" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 225148, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3Kkjo3cT83cw09VJyrLNwX" + }, + "href": "https://api.spotify.com/v1/tracks/3Kkjo3cT83cw09VJyrLNwX", + "id": "3Kkjo3cT83cw09VJyrLNwX", + "is_local": false, + "is_playable": true, + "name": "Oh My God", + "preview_url": "https://p.scdn.co/mp3-preview/da3141fbf42b7fe6d809a87d75d8537056381970?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 5, + "type": "track", + "uri": "spotify:track:3Kkjo3cT83cw09VJyrLNwX" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 210384, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6w8ZPYdnGajyfPddTWdthN" + }, + "href": "https://api.spotify.com/v1/tracks/6w8ZPYdnGajyfPddTWdthN", + "id": "6w8ZPYdnGajyfPddTWdthN", + "is_local": false, + "is_playable": true, + "name": "Can I Get It", + "preview_url": "https://p.scdn.co/mp3-preview/117b02d5d1194420959da4ca930d7982962e3831?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 6, + "type": "track", + "uri": "spotify:track:6w8ZPYdnGajyfPddTWdthN" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 376169, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6v0UJD4a2FtleHeSYVX02A" + }, + "href": "https://api.spotify.com/v1/tracks/6v0UJD4a2FtleHeSYVX02A", + "id": "6v0UJD4a2FtleHeSYVX02A", + "is_local": false, + "is_playable": true, + "name": "I Drink Wine", + "preview_url": "https://p.scdn.co/mp3-preview/59ab0f0898400fba01a4429cac432ccadda2bfb8?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 7, + "type": "track", + "uri": "spotify:track:6v0UJD4a2FtleHeSYVX02A" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 161829, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/496vIKS2INz840xZaKncvR" + }, + "href": "https://api.spotify.com/v1/tracks/496vIKS2INz840xZaKncvR", + "id": "496vIKS2INz840xZaKncvR", + "is_local": false, + "is_playable": true, + "name": "All Night Parking (with Erroll Garner) Interlude", + "preview_url": "https://p.scdn.co/mp3-preview/35ce30503e18a3ebce5ce38c569d491cf38f6af6?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 8, + "type": "track", + "uri": "spotify:track:496vIKS2INz840xZaKncvR" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 300247, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2c6xRsQBv7pynuhYhWoHxo" + }, + "href": "https://api.spotify.com/v1/tracks/2c6xRsQBv7pynuhYhWoHxo", + "id": "2c6xRsQBv7pynuhYhWoHxo", + "is_local": false, + "is_playable": true, + "name": "Woman Like Me", + "preview_url": "https://p.scdn.co/mp3-preview/b75fb17544b1c75183ba81d352aac3f8ee064e85?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 9, + "type": "track", + "uri": "spotify:track:2c6xRsQBv7pynuhYhWoHxo" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 366004, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6bGMSP3H9YqkmaLnaJTIoF" + }, + "href": "https://api.spotify.com/v1/tracks/6bGMSP3H9YqkmaLnaJTIoF", + "id": "6bGMSP3H9YqkmaLnaJTIoF", + "is_local": false, + "is_playable": true, + "name": "Hold On", + "preview_url": "https://p.scdn.co/mp3-preview/6be7dae166fa0a0f93fe3af5c2b6f3e029d770b5?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 10, + "type": "track", + "uri": "spotify:track:6bGMSP3H9YqkmaLnaJTIoF" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 403961, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/10ImcQk9tihY1EKMDIbvXJ" + }, + "href": "https://api.spotify.com/v1/tracks/10ImcQk9tihY1EKMDIbvXJ", + "id": "10ImcQk9tihY1EKMDIbvXJ", + "is_local": false, + "is_playable": true, + "name": "To Be Loved", + "preview_url": "https://p.scdn.co/mp3-preview/33d92fe32e11b26f20a807914fb5c0dea857988c?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 11, + "type": "track", + "uri": "spotify:track:10ImcQk9tihY1EKMDIbvXJ" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 403044, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2j3GxEsbNYNeEzz86wDY4J" + }, + "href": "https://api.spotify.com/v1/tracks/2j3GxEsbNYNeEzz86wDY4J", + "id": "2j3GxEsbNYNeEzz86wDY4J", + "is_local": false, + "is_playable": true, + "name": "Love Is A Game", + "preview_url": "https://p.scdn.co/mp3-preview/645188ccba6239993e6bff1e7618b945ecd77342?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 12, + "type": "track", + "uri": "spotify:track:2j3GxEsbNYNeEzz86wDY4J" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 12 + }, + "type": "album", + "uri": "spotify:album:21jF5jlMtzo94wbxmJ18aa" + }, + { + "album_type": "album", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "copyrights": [ + { + "text": "2011 XL Recordings Ltd", + "type": "C" + }, + { + "text": "2011 XL Recordings Ltd", + "type": "P" + } + ], + "external_ids": { + "upc": "634904052065" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/5duyQokC4FMcWPYTV9Gpf9" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/5duyQokC4FMcWPYTV9Gpf9", + "id": "5duyQokC4FMcWPYTV9Gpf9", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273164feb363334f93b6458d2a9", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02164feb363334f93b6458d2a9", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851164feb363334f93b6458d2a9", + "width": 64 + } + ], + "is_playable": true, + "label": "XL Recordings", + "name": "21", + "popularity": 87, + "release_date": "2011-01-24", + "release_date_precision": "day", + "total_tracks": 11, + "tracks": { + "href": "https://api.spotify.com/v1/albums/5duyQokC4FMcWPYTV9Gpf9/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 228093, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/4OSBTYWVwsQhGLF9NHvIbR" + }, + "href": "https://api.spotify.com/v1/tracks/4OSBTYWVwsQhGLF9NHvIbR", + "id": "4OSBTYWVwsQhGLF9NHvIbR", + "is_local": false, + "is_playable": true, + "name": "Rolling in the Deep", + "preview_url": "https://p.scdn.co/mp3-preview/d2d7e717c72a4fa08b3a8b22722c7369e8aa587d?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:4OSBTYWVwsQhGLF9NHvIbR" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 223266, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/5mFMb5OHI3cN0UjITVztCj" + }, + "href": "https://api.spotify.com/v1/tracks/5mFMb5OHI3cN0UjITVztCj", + "id": "5mFMb5OHI3cN0UjITVztCj", + "is_local": false, + "is_playable": true, + "name": "Rumour Has It", + "preview_url": "https://p.scdn.co/mp3-preview/b2064057c1d5e811103e04ec682e52d2d3e5759e?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 2, + "type": "track", + "uri": "spotify:track:5mFMb5OHI3cN0UjITVztCj" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 250000, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2eF2x1BkgilhaZ2AipRY8j" + }, + "href": "https://api.spotify.com/v1/tracks/2eF2x1BkgilhaZ2AipRY8j", + "id": "2eF2x1BkgilhaZ2AipRY8j", + "is_local": false, + "is_playable": true, + "name": "Turning Tables", + "preview_url": "https://p.scdn.co/mp3-preview/f27742a6b5948be886fe872189affb9dae35190c?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 3, + "type": "track", + "uri": "spotify:track:2eF2x1BkgilhaZ2AipRY8j" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 243200, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1CRtJS94Hq3PbBZT9LuF90" + }, + "href": "https://api.spotify.com/v1/tracks/1CRtJS94Hq3PbBZT9LuF90", + "id": "1CRtJS94Hq3PbBZT9LuF90", + "is_local": false, + "is_playable": true, + "name": "Don't You Remember", + "preview_url": "https://p.scdn.co/mp3-preview/b07fef0646d43d982ced02b1644c99e9e52fddeb?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 4, + "type": "track", + "uri": "spotify:track:1CRtJS94Hq3PbBZT9LuF90" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 242973, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3di5hcvxxciiqwMH1jarhY" + }, + "href": "https://api.spotify.com/v1/tracks/3di5hcvxxciiqwMH1jarhY", + "id": "3di5hcvxxciiqwMH1jarhY", + "is_local": false, + "is_playable": true, + "name": "Set Fire to the Rain", + "preview_url": "https://p.scdn.co/mp3-preview/6fc68c105e091645376471727960d2ba3cd0ee01?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 5, + "type": "track", + "uri": "spotify:track:3di5hcvxxciiqwMH1jarhY" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 278040, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2hw47GMKL6LXwp5BJgPxXf" + }, + "href": "https://api.spotify.com/v1/tracks/2hw47GMKL6LXwp5BJgPxXf", + "id": "2hw47GMKL6LXwp5BJgPxXf", + "is_local": false, + "is_playable": true, + "name": "He Won't Go", + "preview_url": "https://p.scdn.co/mp3-preview/08f3520ab7b922797beff86baffb4f20a0f95d15?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 6, + "type": "track", + "uri": "spotify:track:2hw47GMKL6LXwp5BJgPxXf" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 228293, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/43Bcg5ckW8WchRzyPZA0u1" + }, + "href": "https://api.spotify.com/v1/tracks/43Bcg5ckW8WchRzyPZA0u1", + "id": "43Bcg5ckW8WchRzyPZA0u1", + "is_local": false, + "is_playable": true, + "name": "Take It All", + "preview_url": "https://p.scdn.co/mp3-preview/59203c3cf26363c0daa1db0bc69dd02b8878c786?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 7, + "type": "track", + "uri": "spotify:track:43Bcg5ckW8WchRzyPZA0u1" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 241351, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/42Uw9frN5ZVX40mRU3hHFL" + }, + "href": "https://api.spotify.com/v1/tracks/42Uw9frN5ZVX40mRU3hHFL", + "id": "42Uw9frN5ZVX40mRU3hHFL", + "is_local": false, + "is_playable": true, + "name": "I'll Be Waiting", + "preview_url": "https://p.scdn.co/mp3-preview/f70f5feddcd3c980f0bf6d341b55291e73f13267?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 8, + "type": "track", + "uri": "spotify:track:42Uw9frN5ZVX40mRU3hHFL" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 348226, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/5W63Zcirj6bvnTxhVIKTSK" + }, + "href": "https://api.spotify.com/v1/tracks/5W63Zcirj6bvnTxhVIKTSK", + "id": "5W63Zcirj6bvnTxhVIKTSK", + "is_local": false, + "is_playable": true, + "name": "One And Only", + "preview_url": "https://p.scdn.co/mp3-preview/a081279c55b878b41b78183b56e0ffc9f2cd400b?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 9, + "type": "track", + "uri": "spotify:track:5W63Zcirj6bvnTxhVIKTSK" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 316240, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2PPN1HFpVotjq7oJIqQbnx" + }, + "href": "https://api.spotify.com/v1/tracks/2PPN1HFpVotjq7oJIqQbnx", + "id": "2PPN1HFpVotjq7oJIqQbnx", + "is_local": false, + "is_playable": true, + "name": "Lovesong", + "preview_url": "https://p.scdn.co/mp3-preview/e09f24137097e0ab69e0dd2a26033e4ec2ddbed6?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 10, + "type": "track", + "uri": "spotify:track:2PPN1HFpVotjq7oJIqQbnx" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 285240, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3bNv3VuUOKgrf5hu3YcuRo" + }, + "href": "https://api.spotify.com/v1/tracks/3bNv3VuUOKgrf5hu3YcuRo", + "id": "3bNv3VuUOKgrf5hu3YcuRo", + "is_local": false, + "is_playable": true, + "name": "Someone Like You", + "preview_url": "https://p.scdn.co/mp3-preview/a79d612cac9b64e900ae937234e2838a88ebc415?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 11, + "type": "track", + "uri": "spotify:track:3bNv3VuUOKgrf5hu3YcuRo" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 11 + }, + "type": "album", + "uri": "spotify:album:5duyQokC4FMcWPYTV9Gpf9" + }, + { + "album_type": "album", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "copyrights": [ + { + "text": "2015 XL Recordings Ltd", + "type": "C" + }, + { + "text": "2015 XL Recordings Ltd", + "type": "P" + } + ], + "external_ids": { + "upc": "634904074067" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/6TVfiWmo8KtflUAmkK9gGF" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/6TVfiWmo8KtflUAmkK9gGF", + "id": "6TVfiWmo8KtflUAmkK9gGF", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b2737b9888dc365b8f957c63df14", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e027b9888dc365b8f957c63df14", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d000048517b9888dc365b8f957c63df14", + "width": 64 + } + ], + "is_playable": true, + "label": "XL Recordings", + "name": "25", + "popularity": 85, + "release_date": "2015-11-20", + "release_date_precision": "day", + "total_tracks": 11, + "tracks": { + "href": "https://api.spotify.com/v1/albums/6TVfiWmo8KtflUAmkK9gGF/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 295502, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1Yk0cQdMLx5RzzFTYwmuld" + }, + "href": "https://api.spotify.com/v1/tracks/1Yk0cQdMLx5RzzFTYwmuld", + "id": "1Yk0cQdMLx5RzzFTYwmuld", + "is_local": false, + "is_playable": true, + "name": "Hello", + "preview_url": "https://p.scdn.co/mp3-preview/27069a2e4ff7be549a241052b7e3233ac835e1f6?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:1Yk0cQdMLx5RzzFTYwmuld" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 223078, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/563SfWAHJs4FBZMkRN0IFN" + }, + "href": "https://api.spotify.com/v1/tracks/563SfWAHJs4FBZMkRN0IFN", + "id": "563SfWAHJs4FBZMkRN0IFN", + "is_local": false, + "is_playable": true, + "name": "Send My Love (To Your New Lover)", + "preview_url": "https://p.scdn.co/mp3-preview/454f693eeb9b383539f5d26ecdc7cd44c6d20292?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 2, + "type": "track", + "uri": "spotify:track:563SfWAHJs4FBZMkRN0IFN" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 348625, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6NdG17SJBXKJeYS67f7E74" + }, + "href": "https://api.spotify.com/v1/tracks/6NdG17SJBXKJeYS67f7E74", + "id": "6NdG17SJBXKJeYS67f7E74", + "is_local": false, + "is_playable": true, + "name": "I Miss You", + "preview_url": "https://p.scdn.co/mp3-preview/a76ed47d95b8cc839f1d5e7140145d03a166e483?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 3, + "type": "track", + "uri": "spotify:track:6NdG17SJBXKJeYS67f7E74" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 290900, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6O5TrlFWTYvznd9fMC0VvU" + }, + "href": "https://api.spotify.com/v1/tracks/6O5TrlFWTYvznd9fMC0VvU", + "id": "6O5TrlFWTYvznd9fMC0VvU", + "is_local": false, + "is_playable": true, + "name": "When We Were Young", + "preview_url": "https://p.scdn.co/mp3-preview/b35676526fa76530da3e9b880a64305e761bc2ce?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 4, + "type": "track", + "uri": "spotify:track:6O5TrlFWTYvznd9fMC0VvU" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 245426, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1zZh6zTXcDgvN0C6S1G4gU" + }, + "href": "https://api.spotify.com/v1/tracks/1zZh6zTXcDgvN0C6S1G4gU", + "id": "1zZh6zTXcDgvN0C6S1G4gU", + "is_local": false, + "is_playable": true, + "name": "Remedy", + "preview_url": "https://p.scdn.co/mp3-preview/7e821552ce5f5c448058c55a5a2ce647d6269e20?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 5, + "type": "track", + "uri": "spotify:track:1zZh6zTXcDgvN0C6S1G4gU" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 240439, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2DRMuw0U0QbkVQxWxdJV3M" + }, + "href": "https://api.spotify.com/v1/tracks/2DRMuw0U0QbkVQxWxdJV3M", + "id": "2DRMuw0U0QbkVQxWxdJV3M", + "is_local": false, + "is_playable": true, + "name": "Water Under the Bridge", + "preview_url": "https://p.scdn.co/mp3-preview/8040cf7551127a31796b5e5af369910edae39a68?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 6, + "type": "track", + "uri": "spotify:track:2DRMuw0U0QbkVQxWxdJV3M" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 225426, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0bqC0AqaBZKBZsjhI3y2OW" + }, + "href": "https://api.spotify.com/v1/tracks/0bqC0AqaBZKBZsjhI3y2OW", + "id": "0bqC0AqaBZKBZsjhI3y2OW", + "is_local": false, + "is_playable": true, + "name": "River Lea", + "preview_url": "https://p.scdn.co/mp3-preview/1f979070d3392357703f4a3bc57a55555bc83182?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 7, + "type": "track", + "uri": "spotify:track:0bqC0AqaBZKBZsjhI3y2OW" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 285935, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0DuWDLjriRPjDRoPgaCslY" + }, + "href": "https://api.spotify.com/v1/tracks/0DuWDLjriRPjDRoPgaCslY", + "id": "0DuWDLjriRPjDRoPgaCslY", + "is_local": false, + "is_playable": true, + "name": "Love In The Dark", + "preview_url": "https://p.scdn.co/mp3-preview/71fccaf81d5bd85928d35ac65e311709f841e4b6?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 8, + "type": "track", + "uri": "spotify:track:0DuWDLjriRPjDRoPgaCslY" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 227065, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2qBmtZnPSQouvADmqaHKxk" + }, + "href": "https://api.spotify.com/v1/tracks/2qBmtZnPSQouvADmqaHKxk", + "id": "2qBmtZnPSQouvADmqaHKxk", + "is_local": false, + "is_playable": true, + "name": "Million Years Ago", + "preview_url": "https://p.scdn.co/mp3-preview/b689bfb32895d9e883cebb8635584767a1c65de2?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 9, + "type": "track", + "uri": "spotify:track:2qBmtZnPSQouvADmqaHKxk" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 271800, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6DEMMeWXfmFAXgDUMMzeg6" + }, + "href": "https://api.spotify.com/v1/tracks/6DEMMeWXfmFAXgDUMMzeg6", + "id": "6DEMMeWXfmFAXgDUMMzeg6", + "is_local": false, + "is_playable": true, + "name": "All I Ask", + "preview_url": "https://p.scdn.co/mp3-preview/7f9fc461d85095d621f1bffb033a15b7f8d24eb6?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 10, + "type": "track", + "uri": "spotify:track:6DEMMeWXfmFAXgDUMMzeg6" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 251701, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2Eb7QQ5soJQBEYTfSb5BS6" + }, + "href": "https://api.spotify.com/v1/tracks/2Eb7QQ5soJQBEYTfSb5BS6", + "id": "2Eb7QQ5soJQBEYTfSb5BS6", + "is_local": false, + "is_playable": true, + "name": "Sweetest Devotion", + "preview_url": "https://p.scdn.co/mp3-preview/44c2dae58dbee03e161e57aa9fc6d4eff3b85df1?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 11, + "type": "track", + "uri": "spotify:track:2Eb7QQ5soJQBEYTfSb5BS6" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 11 + }, + "type": "album", + "uri": "spotify:album:6TVfiWmo8KtflUAmkK9gGF" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/6YVMFz59CuY7ngCxTxjpxE" + }, + "href": "https://api.spotify.com/v1/artists/6YVMFz59CuY7ngCxTxjpxE", + "id": "6YVMFz59CuY7ngCxTxjpxE", + "name": "aespa", + "type": "artist", + "uri": "spotify:artist:6YVMFz59CuY7ngCxTxjpxE" + } + ], + "copyrights": [ + { + "text": "© 2023 SM Entertainment, under exclusive license to Warner Records Inc.", + "type": "C" + }, + { + "text": "℗ 2023 SM Entertainment, under exclusive license to Warner Records Inc.", + "type": "P" + } + ], + "external_ids": { + "upc": "888735943508" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/69xF8jTd0c4Zoo7DT3Rwrn" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/69xF8jTd0c4Zoo7DT3Rwrn", + "id": "69xF8jTd0c4Zoo7DT3Rwrn", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b27304878afb19613a94d37b29ce", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e0204878afb19613a94d37b29ce", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d0000485104878afb19613a94d37b29ce", + "width": 64 + } + ], + "is_playable": true, + "label": "Warner Records", + "name": "MY WORLD - The 3rd Mini Album", + "popularity": 81, + "release_date": "2023-05-08", + "release_date_precision": "day", + "total_tracks": 6, + "tracks": { + "href": "https://api.spotify.com/v1/albums/69xF8jTd0c4Zoo7DT3Rwrn/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/6YVMFz59CuY7ngCxTxjpxE" + }, + "href": "https://api.spotify.com/v1/artists/6YVMFz59CuY7ngCxTxjpxE", + "id": "6YVMFz59CuY7ngCxTxjpxE", + "name": "aespa", + "type": "artist", + "uri": "spotify:artist:6YVMFz59CuY7ngCxTxjpxE" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2067CjQ2nC56cRZX8goeHg" + }, + "href": "https://api.spotify.com/v1/artists/2067CjQ2nC56cRZX8goeHg", + "id": "2067CjQ2nC56cRZX8goeHg", + "name": "nævis", + "type": "artist", + "uri": "spotify:artist:2067CjQ2nC56cRZX8goeHg" + } + ], + "disc_number": 1, + "duration_ms": 206920, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3q5qpprtugUIEPExuI7tRD" + }, + "href": "https://api.spotify.com/v1/tracks/3q5qpprtugUIEPExuI7tRD", + "id": "3q5qpprtugUIEPExuI7tRD", + "is_local": false, + "is_playable": true, + "name": "Welcome To MY World (feat. nævis)", + "preview_url": "https://p.scdn.co/mp3-preview/e348e5276c41616689ea14bcb9304a52e3d40509?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:3q5qpprtugUIEPExuI7tRD" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/6YVMFz59CuY7ngCxTxjpxE" + }, + "href": "https://api.spotify.com/v1/artists/6YVMFz59CuY7ngCxTxjpxE", + "id": "6YVMFz59CuY7ngCxTxjpxE", + "name": "aespa", + "type": "artist", + "uri": "spotify:artist:6YVMFz59CuY7ngCxTxjpxE" + } + ], + "disc_number": 1, + "duration_ms": 197040, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1ULdASrNy5rurl1TZfFaMP" + }, + "href": "https://api.spotify.com/v1/tracks/1ULdASrNy5rurl1TZfFaMP", + "id": "1ULdASrNy5rurl1TZfFaMP", + "is_local": false, + "is_playable": true, + "name": "Spicy", + "preview_url": "https://p.scdn.co/mp3-preview/d28e64d4864b1cf99e0e01738b32e3f95a8ce1c4?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 2, + "type": "track", + "uri": "spotify:track:1ULdASrNy5rurl1TZfFaMP" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/6YVMFz59CuY7ngCxTxjpxE" + }, + "href": "https://api.spotify.com/v1/artists/6YVMFz59CuY7ngCxTxjpxE", + "id": "6YVMFz59CuY7ngCxTxjpxE", + "name": "aespa", + "type": "artist", + "uri": "spotify:artist:6YVMFz59CuY7ngCxTxjpxE" + } + ], + "disc_number": 1, + "duration_ms": 201760, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/4wQDjZtXjsFtU3BLSiIH4t" + }, + "href": "https://api.spotify.com/v1/tracks/4wQDjZtXjsFtU3BLSiIH4t", + "id": "4wQDjZtXjsFtU3BLSiIH4t", + "is_local": false, + "is_playable": true, + "name": "Salty & Sweet", + "preview_url": "https://p.scdn.co/mp3-preview/4fa7c99e8f2465a83a9f4f4bebd2045491a959d6?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 3, + "type": "track", + "uri": "spotify:track:4wQDjZtXjsFtU3BLSiIH4t" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/6YVMFz59CuY7ngCxTxjpxE" + }, + "href": "https://api.spotify.com/v1/artists/6YVMFz59CuY7ngCxTxjpxE", + "id": "6YVMFz59CuY7ngCxTxjpxE", + "name": "aespa", + "type": "artist", + "uri": "spotify:artist:6YVMFz59CuY7ngCxTxjpxE" + } + ], + "disc_number": 1, + "duration_ms": 193413, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6nICBdDevG4NZysIqDFPEa" + }, + "href": "https://api.spotify.com/v1/tracks/6nICBdDevG4NZysIqDFPEa", + "id": "6nICBdDevG4NZysIqDFPEa", + "is_local": false, + "is_playable": true, + "name": "Thirsty", + "preview_url": "https://p.scdn.co/mp3-preview/a23891485b11893fc999cc19944871ad74738510?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 4, + "type": "track", + "uri": "spotify:track:6nICBdDevG4NZysIqDFPEa" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/6YVMFz59CuY7ngCxTxjpxE" + }, + "href": "https://api.spotify.com/v1/artists/6YVMFz59CuY7ngCxTxjpxE", + "id": "6YVMFz59CuY7ngCxTxjpxE", + "name": "aespa", + "type": "artist", + "uri": "spotify:artist:6YVMFz59CuY7ngCxTxjpxE" + } + ], + "disc_number": 1, + "duration_ms": 205893, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6fzio74FGqFFsenYkbGPzR" + }, + "href": "https://api.spotify.com/v1/tracks/6fzio74FGqFFsenYkbGPzR", + "id": "6fzio74FGqFFsenYkbGPzR", + "is_local": false, + "is_playable": true, + "name": "I'm Unhappy", + "preview_url": "https://p.scdn.co/mp3-preview/d495c37be4e4bf91a3ebdebd3aafedcc1d8e9bbf?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 5, + "type": "track", + "uri": "spotify:track:6fzio74FGqFFsenYkbGPzR" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/6YVMFz59CuY7ngCxTxjpxE" + }, + "href": "https://api.spotify.com/v1/artists/6YVMFz59CuY7ngCxTxjpxE", + "id": "6YVMFz59CuY7ngCxTxjpxE", + "name": "aespa", + "type": "artist", + "uri": "spotify:artist:6YVMFz59CuY7ngCxTxjpxE" + } + ], + "disc_number": 1, + "duration_ms": 218360, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/60Uio68M57PwKEgZxSutL6" + }, + "href": "https://api.spotify.com/v1/tracks/60Uio68M57PwKEgZxSutL6", + "id": "60Uio68M57PwKEgZxSutL6", + "is_local": false, + "is_playable": true, + "name": "'Til We Meet Again", + "preview_url": "https://p.scdn.co/mp3-preview/1a37ff462941b9cc72332b254115e2c29b2f7c46?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 6, + "type": "track", + "uri": "spotify:track:60Uio68M57PwKEgZxSutL6" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 6 + }, + "type": "album", + "uri": "spotify:album:69xF8jTd0c4Zoo7DT3Rwrn" + }, + { + "album_type": "album", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5bYwZAV9K923kEHW1Yhol5" + }, + "href": "https://api.spotify.com/v1/artists/5bYwZAV9K923kEHW1Yhol5", + "id": "5bYwZAV9K923kEHW1Yhol5", + "name": "Ruben Wan", + "type": "artist", + "uri": "spotify:artist:5bYwZAV9K923kEHW1Yhol5" + } + ], + "copyrights": [ + { + "text": "2022 Wan Nation", + "type": "C" + }, + { + "text": "2022 Wan Nation", + "type": "P" + } + ], + "external_ids": { + "upc": "197509735219" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/2svDUF02ZLBuFi0EZURX7Z" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/2svDUF02ZLBuFi0EZURX7Z", + "id": "2svDUF02ZLBuFi0EZURX7Z", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b2738e85038dbc0ea6f69d34c1a0", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e028e85038dbc0ea6f69d34c1a0", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d000048518e85038dbc0ea6f69d34c1a0", + "width": 64 + } + ], + "is_playable": true, + "label": "Wan Nation", + "name": "Colores", + "popularity": 21, + "release_date": "2023-01-27", + "release_date_precision": "day", + "total_tracks": 10, + "tracks": { + "href": "https://api.spotify.com/v1/albums/2svDUF02ZLBuFi0EZURX7Z/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5bYwZAV9K923kEHW1Yhol5" + }, + "href": "https://api.spotify.com/v1/artists/5bYwZAV9K923kEHW1Yhol5", + "id": "5bYwZAV9K923kEHW1Yhol5", + "name": "Ruben Wan", + "type": "artist", + "uri": "spotify:artist:5bYwZAV9K923kEHW1Yhol5" + } + ], + "disc_number": 1, + "duration_ms": 147857, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/5hOZvOr0T65WJqNbI4ChTw" + }, + "href": "https://api.spotify.com/v1/tracks/5hOZvOr0T65WJqNbI4ChTw", + "id": "5hOZvOr0T65WJqNbI4ChTw", + "is_local": false, + "is_playable": true, + "name": "Ruben Wan", + "preview_url": "https://p.scdn.co/mp3-preview/2b8cfe110b1e02d1f912620ad6596064d36e314f?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:5hOZvOr0T65WJqNbI4ChTw" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5bYwZAV9K923kEHW1Yhol5" + }, + "href": "https://api.spotify.com/v1/artists/5bYwZAV9K923kEHW1Yhol5", + "id": "5bYwZAV9K923kEHW1Yhol5", + "name": "Ruben Wan", + "type": "artist", + "uri": "spotify:artist:5bYwZAV9K923kEHW1Yhol5" + } + ], + "disc_number": 1, + "duration_ms": 193977, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1RBb4vOSBp6Mk0ZtnH1MTR" + }, + "href": "https://api.spotify.com/v1/tracks/1RBb4vOSBp6Mk0ZtnH1MTR", + "id": "1RBb4vOSBp6Mk0ZtnH1MTR", + "is_local": false, + "is_playable": true, + "name": "Recuerdos", + "preview_url": "https://p.scdn.co/mp3-preview/fe4124afd3a96ea9bacc6d7f88db4f83a20ded47?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 2, + "type": "track", + "uri": "spotify:track:1RBb4vOSBp6Mk0ZtnH1MTR" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5bYwZAV9K923kEHW1Yhol5" + }, + "href": "https://api.spotify.com/v1/artists/5bYwZAV9K923kEHW1Yhol5", + "id": "5bYwZAV9K923kEHW1Yhol5", + "name": "Ruben Wan", + "type": "artist", + "uri": "spotify:artist:5bYwZAV9K923kEHW1Yhol5" + } + ], + "disc_number": 1, + "duration_ms": 189981, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/68VbkzYXHCcAMV1V7GDqVU" + }, + "href": "https://api.spotify.com/v1/tracks/68VbkzYXHCcAMV1V7GDqVU", + "id": "68VbkzYXHCcAMV1V7GDqVU", + "is_local": false, + "is_playable": true, + "name": "Colores", + "preview_url": "https://p.scdn.co/mp3-preview/3fefda1b598ffbf6a277100181bdb0dc7c290cc5?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 3, + "type": "track", + "uri": "spotify:track:68VbkzYXHCcAMV1V7GDqVU" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5bYwZAV9K923kEHW1Yhol5" + }, + "href": "https://api.spotify.com/v1/artists/5bYwZAV9K923kEHW1Yhol5", + "id": "5bYwZAV9K923kEHW1Yhol5", + "name": "Ruben Wan", + "type": "artist", + "uri": "spotify:artist:5bYwZAV9K923kEHW1Yhol5" + } + ], + "disc_number": 1, + "duration_ms": 185166, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2ReDNN7TuDVCC14jTVOdFj" + }, + "href": "https://api.spotify.com/v1/tracks/2ReDNN7TuDVCC14jTVOdFj", + "id": "2ReDNN7TuDVCC14jTVOdFj", + "is_local": false, + "is_playable": true, + "name": "Ya Gane", + "preview_url": "https://p.scdn.co/mp3-preview/e0b73e659ecf00d55b9f8f88fb4f54c0111759fd?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 4, + "type": "track", + "uri": "spotify:track:2ReDNN7TuDVCC14jTVOdFj" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5bYwZAV9K923kEHW1Yhol5" + }, + "href": "https://api.spotify.com/v1/artists/5bYwZAV9K923kEHW1Yhol5", + "id": "5bYwZAV9K923kEHW1Yhol5", + "name": "Ruben Wan", + "type": "artist", + "uri": "spotify:artist:5bYwZAV9K923kEHW1Yhol5" + } + ], + "disc_number": 1, + "duration_ms": 177531, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/7LKUkjkeQkJiuShcscK565" + }, + "href": "https://api.spotify.com/v1/tracks/7LKUkjkeQkJiuShcscK565", + "id": "7LKUkjkeQkJiuShcscK565", + "is_local": false, + "is_playable": true, + "name": "Cuando Vuelva", + "preview_url": "https://p.scdn.co/mp3-preview/040c3d01775f1c0a596c43654c64c86a70c03b1e?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 5, + "type": "track", + "uri": "spotify:track:7LKUkjkeQkJiuShcscK565" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5bYwZAV9K923kEHW1Yhol5" + }, + "href": "https://api.spotify.com/v1/artists/5bYwZAV9K923kEHW1Yhol5", + "id": "5bYwZAV9K923kEHW1Yhol5", + "name": "Ruben Wan", + "type": "artist", + "uri": "spotify:artist:5bYwZAV9K923kEHW1Yhol5" + } + ], + "disc_number": 1, + "duration_ms": 180053, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1l2qwZWxOCdHMAzpp7lAlx" + }, + "href": "https://api.spotify.com/v1/tracks/1l2qwZWxOCdHMAzpp7lAlx", + "id": "1l2qwZWxOCdHMAzpp7lAlx", + "is_local": false, + "is_playable": true, + "name": "Nena Dime", + "preview_url": "https://p.scdn.co/mp3-preview/911c9bb100a3f93fee2ccf1653866e06c30413b7?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 6, + "type": "track", + "uri": "spotify:track:1l2qwZWxOCdHMAzpp7lAlx" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5bYwZAV9K923kEHW1Yhol5" + }, + "href": "https://api.spotify.com/v1/artists/5bYwZAV9K923kEHW1Yhol5", + "id": "5bYwZAV9K923kEHW1Yhol5", + "name": "Ruben Wan", + "type": "artist", + "uri": "spotify:artist:5bYwZAV9K923kEHW1Yhol5" + } + ], + "disc_number": 1, + "duration_ms": 174461, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3iK004IY4iXRZI2QS2p8JV" + }, + "href": "https://api.spotify.com/v1/tracks/3iK004IY4iXRZI2QS2p8JV", + "id": "3iK004IY4iXRZI2QS2p8JV", + "is_local": false, + "is_playable": true, + "name": "Trip a las Estrellas", + "preview_url": "https://p.scdn.co/mp3-preview/b3ca66a533e6116040a51afe6555b52f6179f5dc?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 7, + "type": "track", + "uri": "spotify:track:3iK004IY4iXRZI2QS2p8JV" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5bYwZAV9K923kEHW1Yhol5" + }, + "href": "https://api.spotify.com/v1/artists/5bYwZAV9K923kEHW1Yhol5", + "id": "5bYwZAV9K923kEHW1Yhol5", + "name": "Ruben Wan", + "type": "artist", + "uri": "spotify:artist:5bYwZAV9K923kEHW1Yhol5" + } + ], + "disc_number": 1, + "duration_ms": 183631, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6SLG5NWmQqvv9nYhXmfYX6" + }, + "href": "https://api.spotify.com/v1/tracks/6SLG5NWmQqvv9nYhXmfYX6", + "id": "6SLG5NWmQqvv9nYhXmfYX6", + "is_local": false, + "is_playable": true, + "name": "Pasado", + "preview_url": "https://p.scdn.co/mp3-preview/3f7b8c3d648c50d99775c992e64606fc876ff899?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 8, + "type": "track", + "uri": "spotify:track:6SLG5NWmQqvv9nYhXmfYX6" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5bYwZAV9K923kEHW1Yhol5" + }, + "href": "https://api.spotify.com/v1/artists/5bYwZAV9K923kEHW1Yhol5", + "id": "5bYwZAV9K923kEHW1Yhol5", + "name": "Ruben Wan", + "type": "artist", + "uri": "spotify:artist:5bYwZAV9K923kEHW1Yhol5" + } + ], + "disc_number": 1, + "duration_ms": 162000, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1unIywufcnIb7jPHNkogAw" + }, + "href": "https://api.spotify.com/v1/tracks/1unIywufcnIb7jPHNkogAw", + "id": "1unIywufcnIb7jPHNkogAw", + "is_local": false, + "is_playable": true, + "name": "Loser", + "preview_url": "https://p.scdn.co/mp3-preview/2baec0df2eef32d57537020450537e963416a642?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 9, + "type": "track", + "uri": "spotify:track:1unIywufcnIb7jPHNkogAw" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5bYwZAV9K923kEHW1Yhol5" + }, + "href": "https://api.spotify.com/v1/artists/5bYwZAV9K923kEHW1Yhol5", + "id": "5bYwZAV9K923kEHW1Yhol5", + "name": "Ruben Wan", + "type": "artist", + "uri": "spotify:artist:5bYwZAV9K923kEHW1Yhol5" + } + ], + "disc_number": 1, + "duration_ms": 243870, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/4CiouWhhb5qeszxQX6DWP1" + }, + "href": "https://api.spotify.com/v1/tracks/4CiouWhhb5qeszxQX6DWP1", + "id": "4CiouWhhb5qeszxQX6DWP1", + "is_local": false, + "is_playable": true, + "name": "Para Ti", + "preview_url": "https://p.scdn.co/mp3-preview/f1b6fe34e8645526469bc80acbde55c4283eadb1?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 10, + "type": "track", + "uri": "spotify:track:4CiouWhhb5qeszxQX6DWP1" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 10 + }, + "type": "album", + "uri": "spotify:album:2svDUF02ZLBuFi0EZURX7Z" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/7nqOGRxlXj7N2JYbgNEjYH" + }, + "href": "https://api.spotify.com/v1/artists/7nqOGRxlXj7N2JYbgNEjYH", + "id": "7nqOGRxlXj7N2JYbgNEjYH", + "name": "SEVENTEEN", + "type": "artist", + "uri": "spotify:artist:7nqOGRxlXj7N2JYbgNEjYH" + } + ], + "copyrights": [ + { + "text": "© 2023 PLEDIS Entertainment", + "type": "C" + }, + { + "text": "℗ 2023 PLEDIS Entertainment", + "type": "P" + } + ], + "external_ids": { + "upc": "196922401282" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/1JBzeeCJ3axQMVkqWbKh0I" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/1JBzeeCJ3axQMVkqWbKh0I", + "id": "1JBzeeCJ3axQMVkqWbKh0I", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b27380e31ba0c05187e6310ef264", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e0280e31ba0c05187e6310ef264", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d0000485180e31ba0c05187e6310ef264", + "width": 64 + } + ], + "is_playable": true, + "label": "PLEDIS Entertainment", + "name": "SEVENTEEN 10th Mini Album 'FML'", + "popularity": 84, + "release_date": "2023-04-24", + "release_date_precision": "day", + "total_tracks": 6, + "tracks": { + "href": "https://api.spotify.com/v1/albums/1JBzeeCJ3axQMVkqWbKh0I/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/7nqOGRxlXj7N2JYbgNEjYH" + }, + "href": "https://api.spotify.com/v1/artists/7nqOGRxlXj7N2JYbgNEjYH", + "id": "7nqOGRxlXj7N2JYbgNEjYH", + "name": "SEVENTEEN", + "type": "artist", + "uri": "spotify:artist:7nqOGRxlXj7N2JYbgNEjYH" + } + ], + "disc_number": 1, + "duration_ms": 202280, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3tgWMPOY4stCdKYj5NjrAe" + }, + "href": "https://api.spotify.com/v1/tracks/3tgWMPOY4stCdKYj5NjrAe", + "id": "3tgWMPOY4stCdKYj5NjrAe", + "is_local": false, + "is_playable": true, + "name": "F*ck My Life", + "preview_url": "https://p.scdn.co/mp3-preview/9851d5e3251f54aa1e56b064d925b06eef27de5f?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:3tgWMPOY4stCdKYj5NjrAe" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/7nqOGRxlXj7N2JYbgNEjYH" + }, + "href": "https://api.spotify.com/v1/artists/7nqOGRxlXj7N2JYbgNEjYH", + "id": "7nqOGRxlXj7N2JYbgNEjYH", + "name": "SEVENTEEN", + "type": "artist", + "uri": "spotify:artist:7nqOGRxlXj7N2JYbgNEjYH" + } + ], + "disc_number": 1, + "duration_ms": 200386, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3AOf6YEpxQ894FmrwI9k96" + }, + "href": "https://api.spotify.com/v1/tracks/3AOf6YEpxQ894FmrwI9k96", + "id": "3AOf6YEpxQ894FmrwI9k96", + "is_local": false, + "is_playable": true, + "name": "Super", + "preview_url": "https://p.scdn.co/mp3-preview/1dd31996959e603934dbe4c7d3ee377243a0f890?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 2, + "type": "track", + "uri": "spotify:track:3AOf6YEpxQ894FmrwI9k96" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/7nqOGRxlXj7N2JYbgNEjYH" + }, + "href": "https://api.spotify.com/v1/artists/7nqOGRxlXj7N2JYbgNEjYH", + "id": "7nqOGRxlXj7N2JYbgNEjYH", + "name": "SEVENTEEN", + "type": "artist", + "uri": "spotify:artist:7nqOGRxlXj7N2JYbgNEjYH" + } + ], + "disc_number": 1, + "duration_ms": 158213, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2hqn75Y9fEzL0qPoPRXCvX" + }, + "href": "https://api.spotify.com/v1/tracks/2hqn75Y9fEzL0qPoPRXCvX", + "id": "2hqn75Y9fEzL0qPoPRXCvX", + "is_local": false, + "is_playable": true, + "name": "Fire", + "preview_url": "https://p.scdn.co/mp3-preview/e74c6f0b3a8e98e99942eab428b3898c58db649f?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 3, + "type": "track", + "uri": "spotify:track:2hqn75Y9fEzL0qPoPRXCvX" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/7nqOGRxlXj7N2JYbgNEjYH" + }, + "href": "https://api.spotify.com/v1/artists/7nqOGRxlXj7N2JYbgNEjYH", + "id": "7nqOGRxlXj7N2JYbgNEjYH", + "name": "SEVENTEEN", + "type": "artist", + "uri": "spotify:artist:7nqOGRxlXj7N2JYbgNEjYH" + } + ], + "disc_number": 1, + "duration_ms": 209800, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3acGHJqr9xU1cnCEfLX1Lx" + }, + "href": "https://api.spotify.com/v1/tracks/3acGHJqr9xU1cnCEfLX1Lx", + "id": "3acGHJqr9xU1cnCEfLX1Lx", + "is_local": false, + "is_playable": true, + "name": "I Don't Understand But I Luv U", + "preview_url": "https://p.scdn.co/mp3-preview/6d03f2a62f249e5c2c60f8175b8d5945d5ca8677?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 4, + "type": "track", + "uri": "spotify:track:3acGHJqr9xU1cnCEfLX1Lx" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/7nqOGRxlXj7N2JYbgNEjYH" + }, + "href": "https://api.spotify.com/v1/artists/7nqOGRxlXj7N2JYbgNEjYH", + "id": "7nqOGRxlXj7N2JYbgNEjYH", + "name": "SEVENTEEN", + "type": "artist", + "uri": "spotify:artist:7nqOGRxlXj7N2JYbgNEjYH" + } + ], + "disc_number": 1, + "duration_ms": 165320, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/7v8v911KfBuFkqXvuDOtNm" + }, + "href": "https://api.spotify.com/v1/tracks/7v8v911KfBuFkqXvuDOtNm", + "id": "7v8v911KfBuFkqXvuDOtNm", + "is_local": false, + "is_playable": true, + "name": "Dust", + "preview_url": "https://p.scdn.co/mp3-preview/29df45140df98d059c312ee11988c3b108fe83ca?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 5, + "type": "track", + "uri": "spotify:track:7v8v911KfBuFkqXvuDOtNm" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/7nqOGRxlXj7N2JYbgNEjYH" + }, + "href": "https://api.spotify.com/v1/artists/7nqOGRxlXj7N2JYbgNEjYH", + "id": "7nqOGRxlXj7N2JYbgNEjYH", + "name": "SEVENTEEN", + "type": "artist", + "uri": "spotify:artist:7nqOGRxlXj7N2JYbgNEjYH" + } + ], + "disc_number": 1, + "duration_ms": 212786, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/7rIXkPCaibFJTs4rKS29OS" + }, + "href": "https://api.spotify.com/v1/tracks/7rIXkPCaibFJTs4rKS29OS", + "id": "7rIXkPCaibFJTs4rKS29OS", + "is_local": false, + "is_playable": true, + "name": "April shower", + "preview_url": "https://p.scdn.co/mp3-preview/1a3be2f46517c7f9d5ee57e148aaf5004b4223ec?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 6, + "type": "track", + "uri": "spotify:track:7rIXkPCaibFJTs4rKS29OS" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 6 + }, + "type": "album", + "uri": "spotify:album:1JBzeeCJ3axQMVkqWbKh0I" + }, + { + "album_type": "album", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "copyrights": [ + { + "text": "2008 XL Recordings Ltd", + "type": "C" + }, + { + "text": "2008 XL Recordings Ltd", + "type": "P" + } + ], + "external_ids": { + "upc": "634904031367" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/5awrJZBt3rP9RO5hlYdZB0" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/5awrJZBt3rP9RO5hlYdZB0", + "id": "5awrJZBt3rP9RO5hlYdZB0", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b2732369f428044d1fa7ed4a71a9", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e022369f428044d1fa7ed4a71a9", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d000048512369f428044d1fa7ed4a71a9", + "width": 64 + } + ], + "is_playable": true, + "label": "XL Recordings", + "name": "19", + "popularity": 76, + "release_date": "2008-01-27", + "release_date_precision": "day", + "total_tracks": 12, + "tracks": { + "href": "https://api.spotify.com/v1/albums/5awrJZBt3rP9RO5hlYdZB0/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 220506, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3FYqKyAKIB4mCygIFc1IYn" + }, + "href": "https://api.spotify.com/v1/tracks/3FYqKyAKIB4mCygIFc1IYn", + "id": "3FYqKyAKIB4mCygIFc1IYn", + "is_local": false, + "is_playable": true, + "name": "Daydreamer", + "preview_url": "https://p.scdn.co/mp3-preview/4dfb51e759e724793b555a79d8ee54ae203afe88?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:3FYqKyAKIB4mCygIFc1IYn" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 258506, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6c7aD7V8hDjJ05vs77dlJk" + }, + "href": "https://api.spotify.com/v1/tracks/6c7aD7V8hDjJ05vs77dlJk", + "id": "6c7aD7V8hDjJ05vs77dlJk", + "is_local": false, + "is_playable": true, + "name": "Best For Last", + "preview_url": "https://p.scdn.co/mp3-preview/6044378b8b980e81d4a868af97ddef6a329f6d60?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 2, + "type": "track", + "uri": "spotify:track:6c7aD7V8hDjJ05vs77dlJk" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 210506, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0Z5ok0QLLttAKsujOZYOXf" + }, + "href": "https://api.spotify.com/v1/tracks/0Z5ok0QLLttAKsujOZYOXf", + "id": "0Z5ok0QLLttAKsujOZYOXf", + "is_local": false, + "is_playable": true, + "name": "Chasing Pavements", + "preview_url": "https://p.scdn.co/mp3-preview/209e4b33acb8fd535c65ab403087a6c0c3dabc65?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 3, + "type": "track", + "uri": "spotify:track:0Z5ok0QLLttAKsujOZYOXf" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 191866, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2BuTotNunmHqGDB1pc7ROX" + }, + "href": "https://api.spotify.com/v1/tracks/2BuTotNunmHqGDB1pc7ROX", + "id": "2BuTotNunmHqGDB1pc7ROX", + "is_local": false, + "is_playable": true, + "name": "Cold Shoulder", + "preview_url": "https://p.scdn.co/mp3-preview/b603ef2f8880eef52789921bc6acd8ae8c841d44?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 4, + "type": "track", + "uri": "spotify:track:2BuTotNunmHqGDB1pc7ROX" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 208040, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2L1zGWSV5udDZlW668nRtA" + }, + "href": "https://api.spotify.com/v1/tracks/2L1zGWSV5udDZlW668nRtA", + "id": "2L1zGWSV5udDZlW668nRtA", + "is_local": false, + "is_playable": true, + "name": "Crazy For You", + "preview_url": "https://p.scdn.co/mp3-preview/3b2c77cee83f71198e041f7455d891585230911f?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 5, + "type": "track", + "uri": "spotify:track:2L1zGWSV5udDZlW668nRtA" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 203906, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2VFjUd6M9Ka7STuuCrMCcz" + }, + "href": "https://api.spotify.com/v1/tracks/2VFjUd6M9Ka7STuuCrMCcz", + "id": "2VFjUd6M9Ka7STuuCrMCcz", + "is_local": false, + "is_playable": true, + "name": "Melt My Heart To Stone", + "preview_url": "https://p.scdn.co/mp3-preview/cd9ae9e9b90cf3558621803eb6d9443c513d92f2?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 6, + "type": "track", + "uri": "spotify:track:2VFjUd6M9Ka7STuuCrMCcz" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 190280, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0bSutNd0MDvEr2mZPTlEhF" + }, + "href": "https://api.spotify.com/v1/tracks/0bSutNd0MDvEr2mZPTlEhF", + "id": "0bSutNd0MDvEr2mZPTlEhF", + "is_local": false, + "is_playable": true, + "name": "First Love", + "preview_url": "https://p.scdn.co/mp3-preview/c02dfd14cf533e6b2b688bd73be4821e200a1e8a?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 7, + "type": "track", + "uri": "spotify:track:0bSutNd0MDvEr2mZPTlEhF" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 197346, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6OLudcGaT6HQ5bXH54kI8i" + }, + "href": "https://api.spotify.com/v1/tracks/6OLudcGaT6HQ5bXH54kI8i", + "id": "6OLudcGaT6HQ5bXH54kI8i", + "is_local": false, + "is_playable": true, + "name": "Right As Rain", + "preview_url": "https://p.scdn.co/mp3-preview/25b1ee7bea6dee62e809c7b1ff340aa982cb4328?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 8, + "type": "track", + "uri": "spotify:track:6OLudcGaT6HQ5bXH54kI8i" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 212040, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/273QnyCvJB65rScHJ1nPZb" + }, + "href": "https://api.spotify.com/v1/tracks/273QnyCvJB65rScHJ1nPZb", + "id": "273QnyCvJB65rScHJ1nPZb", + "is_local": false, + "is_playable": true, + "name": "Make You Feel My Love", + "preview_url": "https://p.scdn.co/mp3-preview/3d9582dbaa291a0bdf96e750281595574f0de3ad?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 9, + "type": "track", + "uri": "spotify:track:273QnyCvJB65rScHJ1nPZb" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 195653, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6McbSHjAKqf0fjsLDRzgr5" + }, + "href": "https://api.spotify.com/v1/tracks/6McbSHjAKqf0fjsLDRzgr5", + "id": "6McbSHjAKqf0fjsLDRzgr5", + "is_local": false, + "is_playable": true, + "name": "My Same", + "preview_url": "https://p.scdn.co/mp3-preview/27ebf033af75ebd7d3d49b227f67927b86252a35?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 10, + "type": "track", + "uri": "spotify:track:6McbSHjAKqf0fjsLDRzgr5" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 258853, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1L91NeuzKQfcCchDI8SVii" + }, + "href": "https://api.spotify.com/v1/tracks/1L91NeuzKQfcCchDI8SVii", + "id": "1L91NeuzKQfcCchDI8SVii", + "is_local": false, + "is_playable": true, + "name": "Tired", + "preview_url": "https://p.scdn.co/mp3-preview/e6d4e46e3aacaa7b1275bcd7e0768e35ec0e841d?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 11, + "type": "track", + "uri": "spotify:track:1L91NeuzKQfcCchDI8SVii" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 271226, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/4zFHwVj4A8s0G5f7aOlpKo" + }, + "href": "https://api.spotify.com/v1/tracks/4zFHwVj4A8s0G5f7aOlpKo", + "id": "4zFHwVj4A8s0G5f7aOlpKo", + "is_local": false, + "is_playable": true, + "name": "Hometown Glory", + "preview_url": "https://p.scdn.co/mp3-preview/7f6ac1f843e7edf708e63f55f0cf0a265d717989?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 12, + "type": "track", + "uri": "spotify:track:4zFHwVj4A8s0G5f7aOlpKo" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 12 + }, + "type": "album", + "uri": "spotify:album:5awrJZBt3rP9RO5hlYdZB0" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "copyrights": [ + { + "text": "(P) 2012 Melted Stone Ltd under exclusive license to Columbia Records / Skyfall © 2012 Danjaq LLC, United Artists Corporation, Columbia Pictures Industries Inc., Skyfall, 007 Gun Logo, and related James Bond Trademarks © 1962-2012", + "type": "P" + } + ], + "external_ids": { + "upc": "886443673632" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/6TwN6Lq9glwnG8kNp6chHY" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/6TwN6Lq9glwnG8kNp6chHY", + "id": "6TwN6Lq9glwnG8kNp6chHY", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b2732737be35cc5245eef495be90", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e022737be35cc5245eef495be90", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d000048512737be35cc5245eef495be90", + "width": 64 + } + ], + "is_playable": true, + "label": "XL Recordings/Columbia", + "name": "Skyfall", + "popularity": 73, + "release_date": "2012-10-04", + "release_date_precision": "day", + "total_tracks": 1, + "tracks": { + "href": "https://api.spotify.com/v1/albums/6TwN6Lq9glwnG8kNp6chHY/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 286480, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6VObnIkLVruX4UVyxWhlqm" + }, + "href": "https://api.spotify.com/v1/tracks/6VObnIkLVruX4UVyxWhlqm", + "id": "6VObnIkLVruX4UVyxWhlqm", + "is_local": false, + "is_playable": true, + "name": "Skyfall", + "preview_url": "https://p.scdn.co/mp3-preview/d5c38cc8a0f4b3e01a5a688497d6b0e89da5f1c8?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:6VObnIkLVruX4UVyxWhlqm" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 1 + }, + "type": "album", + "uri": "spotify:album:6TwN6Lq9glwnG8kNp6chHY" + }, + { + "album_type": "album", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1vyhD5VmyZ7KMfW5gqLgo5" + }, + "href": "https://api.spotify.com/v1/artists/1vyhD5VmyZ7KMfW5gqLgo5", + "id": "1vyhD5VmyZ7KMfW5gqLgo5", + "name": "J Balvin", + "type": "artist", + "uri": "spotify:artist:1vyhD5VmyZ7KMfW5gqLgo5" + } + ], + "copyrights": [ + { + "text": "© 2020 UMG Recordings, Inc.", + "type": "C" + }, + { + "text": "℗ 2020 UMG Recordings, Inc.", + "type": "P" + } + ], + "external_ids": { + "upc": "00602508774843" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/2mX8ktJoWvyidWBU9U8Jis" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/2mX8ktJoWvyidWBU9U8Jis", + "id": "2mX8ktJoWvyidWBU9U8Jis", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b27335692baca45542527d742d0d", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e0235692baca45542527d742d0d", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d0000485135692baca45542527d742d0d", + "width": 64 + } + ], + "is_playable": true, + "label": "UMLE - Latino", + "name": "Colores", + "popularity": 76, + "release_date": "2020-03-19", + "release_date_precision": "day", + "total_tracks": 10, + "tracks": { + "href": "https://api.spotify.com/v1/albums/2mX8ktJoWvyidWBU9U8Jis/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1vyhD5VmyZ7KMfW5gqLgo5" + }, + "href": "https://api.spotify.com/v1/artists/1vyhD5VmyZ7KMfW5gqLgo5", + "id": "1vyhD5VmyZ7KMfW5gqLgo5", + "name": "J Balvin", + "type": "artist", + "uri": "spotify:artist:1vyhD5VmyZ7KMfW5gqLgo5" + } + ], + "disc_number": 1, + "duration_ms": 157733, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6zEgnpM0qYmHLDnh8WPejL" + }, + "href": "https://api.spotify.com/v1/tracks/6zEgnpM0qYmHLDnh8WPejL", + "id": "6zEgnpM0qYmHLDnh8WPejL", + "is_local": false, + "is_playable": true, + "name": "Amarillo", + "preview_url": null, + "track_number": 1, + "type": "track", + "uri": "spotify:track:6zEgnpM0qYmHLDnh8WPejL" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1vyhD5VmyZ7KMfW5gqLgo5" + }, + "href": "https://api.spotify.com/v1/artists/1vyhD5VmyZ7KMfW5gqLgo5", + "id": "1vyhD5VmyZ7KMfW5gqLgo5", + "name": "J Balvin", + "type": "artist", + "uri": "spotify:artist:1vyhD5VmyZ7KMfW5gqLgo5" + } + ], + "disc_number": 1, + "duration_ms": 205933, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2lCkncy6bIB0LTMT7kvrD1" + }, + "href": "https://api.spotify.com/v1/tracks/2lCkncy6bIB0LTMT7kvrD1", + "id": "2lCkncy6bIB0LTMT7kvrD1", + "is_local": false, + "is_playable": true, + "name": "Azul", + "preview_url": null, + "track_number": 2, + "type": "track", + "uri": "spotify:track:2lCkncy6bIB0LTMT7kvrD1" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1vyhD5VmyZ7KMfW5gqLgo5" + }, + "href": "https://api.spotify.com/v1/artists/1vyhD5VmyZ7KMfW5gqLgo5", + "id": "1vyhD5VmyZ7KMfW5gqLgo5", + "name": "J Balvin", + "type": "artist", + "uri": "spotify:artist:1vyhD5VmyZ7KMfW5gqLgo5" + } + ], + "disc_number": 1, + "duration_ms": 150720, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/380HmhwTE2NJgawn1NwkXi" + }, + "href": "https://api.spotify.com/v1/tracks/380HmhwTE2NJgawn1NwkXi", + "id": "380HmhwTE2NJgawn1NwkXi", + "is_local": false, + "is_playable": true, + "name": "Rojo", + "preview_url": null, + "track_number": 3, + "type": "track", + "uri": "spotify:track:380HmhwTE2NJgawn1NwkXi" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1vyhD5VmyZ7KMfW5gqLgo5" + }, + "href": "https://api.spotify.com/v1/artists/1vyhD5VmyZ7KMfW5gqLgo5", + "id": "1vyhD5VmyZ7KMfW5gqLgo5", + "name": "J Balvin", + "type": "artist", + "uri": "spotify:artist:1vyhD5VmyZ7KMfW5gqLgo5" + } + ], + "disc_number": 1, + "duration_ms": 189826, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/464uJVLmr0fDJGXOnciaDe" + }, + "href": "https://api.spotify.com/v1/tracks/464uJVLmr0fDJGXOnciaDe", + "id": "464uJVLmr0fDJGXOnciaDe", + "is_local": false, + "is_playable": true, + "name": "Rosa", + "preview_url": null, + "track_number": 4, + "type": "track", + "uri": "spotify:track:464uJVLmr0fDJGXOnciaDe" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1vyhD5VmyZ7KMfW5gqLgo5" + }, + "href": "https://api.spotify.com/v1/artists/1vyhD5VmyZ7KMfW5gqLgo5", + "id": "1vyhD5VmyZ7KMfW5gqLgo5", + "name": "J Balvin", + "type": "artist", + "uri": "spotify:artist:1vyhD5VmyZ7KMfW5gqLgo5" + } + ], + "disc_number": 1, + "duration_ms": 200266, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/35KmOEIUqAGn02t7n4qaIr" + }, + "href": "https://api.spotify.com/v1/tracks/35KmOEIUqAGn02t7n4qaIr", + "id": "35KmOEIUqAGn02t7n4qaIr", + "is_local": false, + "is_playable": true, + "name": "Morado", + "preview_url": null, + "track_number": 5, + "type": "track", + "uri": "spotify:track:35KmOEIUqAGn02t7n4qaIr" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1vyhD5VmyZ7KMfW5gqLgo5" + }, + "href": "https://api.spotify.com/v1/artists/1vyhD5VmyZ7KMfW5gqLgo5", + "id": "1vyhD5VmyZ7KMfW5gqLgo5", + "name": "J Balvin", + "type": "artist", + "uri": "spotify:artist:1vyhD5VmyZ7KMfW5gqLgo5" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/51XrH5fQP2oIQynuKxSWcW" + }, + "href": "https://api.spotify.com/v1/artists/51XrH5fQP2oIQynuKxSWcW", + "id": "51XrH5fQP2oIQynuKxSWcW", + "name": "Sky Rompiendo", + "type": "artist", + "uri": "spotify:artist:51XrH5fQP2oIQynuKxSWcW" + } + ], + "disc_number": 1, + "duration_ms": 142546, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3HTbI3yUJQw3fP0Po8qLcD" + }, + "href": "https://api.spotify.com/v1/tracks/3HTbI3yUJQw3fP0Po8qLcD", + "id": "3HTbI3yUJQw3fP0Po8qLcD", + "is_local": false, + "is_playable": true, + "name": "Verde", + "preview_url": null, + "track_number": 6, + "type": "track", + "uri": "spotify:track:3HTbI3yUJQw3fP0Po8qLcD" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1vyhD5VmyZ7KMfW5gqLgo5" + }, + "href": "https://api.spotify.com/v1/artists/1vyhD5VmyZ7KMfW5gqLgo5", + "id": "1vyhD5VmyZ7KMfW5gqLgo5", + "name": "J Balvin", + "type": "artist", + "uri": "spotify:artist:1vyhD5VmyZ7KMfW5gqLgo5" + } + ], + "disc_number": 1, + "duration_ms": 182093, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2hsA9YWuF3C9Gosi4dpjJN" + }, + "href": "https://api.spotify.com/v1/tracks/2hsA9YWuF3C9Gosi4dpjJN", + "id": "2hsA9YWuF3C9Gosi4dpjJN", + "is_local": false, + "is_playable": true, + "name": "Negro", + "preview_url": null, + "track_number": 7, + "type": "track", + "uri": "spotify:track:2hsA9YWuF3C9Gosi4dpjJN" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1vyhD5VmyZ7KMfW5gqLgo5" + }, + "href": "https://api.spotify.com/v1/artists/1vyhD5VmyZ7KMfW5gqLgo5", + "id": "1vyhD5VmyZ7KMfW5gqLgo5", + "name": "J Balvin", + "type": "artist", + "uri": "spotify:artist:1vyhD5VmyZ7KMfW5gqLgo5" + } + ], + "disc_number": 1, + "duration_ms": 176626, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1syf62zw48zu4FrPwMtDHk" + }, + "href": "https://api.spotify.com/v1/tracks/1syf62zw48zu4FrPwMtDHk", + "id": "1syf62zw48zu4FrPwMtDHk", + "is_local": false, + "is_playable": true, + "name": "Gris", + "preview_url": null, + "track_number": 8, + "type": "track", + "uri": "spotify:track:1syf62zw48zu4FrPwMtDHk" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1vyhD5VmyZ7KMfW5gqLgo5" + }, + "href": "https://api.spotify.com/v1/artists/1vyhD5VmyZ7KMfW5gqLgo5", + "id": "1vyhD5VmyZ7KMfW5gqLgo5", + "name": "J Balvin", + "type": "artist", + "uri": "spotify:artist:1vyhD5VmyZ7KMfW5gqLgo5" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4TAoP0f9OuWZUesao43xUW" + }, + "href": "https://api.spotify.com/v1/artists/4TAoP0f9OuWZUesao43xUW", + "id": "4TAoP0f9OuWZUesao43xUW", + "name": "Mr Eazi", + "type": "artist", + "uri": "spotify:artist:4TAoP0f9OuWZUesao43xUW" + } + ], + "disc_number": 1, + "duration_ms": 186693, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/5zzbORcD0GwLY0wQHP1Xs1" + }, + "href": "https://api.spotify.com/v1/tracks/5zzbORcD0GwLY0wQHP1Xs1", + "id": "5zzbORcD0GwLY0wQHP1Xs1", + "is_local": false, + "is_playable": true, + "name": "Arcoíris", + "preview_url": null, + "track_number": 9, + "type": "track", + "uri": "spotify:track:5zzbORcD0GwLY0wQHP1Xs1" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1vyhD5VmyZ7KMfW5gqLgo5" + }, + "href": "https://api.spotify.com/v1/artists/1vyhD5VmyZ7KMfW5gqLgo5", + "id": "1vyhD5VmyZ7KMfW5gqLgo5", + "name": "J Balvin", + "type": "artist", + "uri": "spotify:artist:1vyhD5VmyZ7KMfW5gqLgo5" + } + ], + "disc_number": 1, + "duration_ms": 145680, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/5pXy29xzxR3aTB0SYRI590" + }, + "href": "https://api.spotify.com/v1/tracks/5pXy29xzxR3aTB0SYRI590", + "id": "5pXy29xzxR3aTB0SYRI590", + "is_local": false, + "is_playable": true, + "name": "Blanco", + "preview_url": null, + "track_number": 10, + "type": "track", + "uri": "spotify:track:5pXy29xzxR3aTB0SYRI590" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 10 + }, + "type": "album", + "uri": "spotify:album:2mX8ktJoWvyidWBU9U8Jis" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/69cjjIQEN8M6heOBT2SqZE" + }, + "href": "https://api.spotify.com/v1/artists/69cjjIQEN8M6heOBT2SqZE", + "id": "69cjjIQEN8M6heOBT2SqZE", + "name": "Wun Two", + "type": "artist", + "uri": "spotify:artist:69cjjIQEN8M6heOBT2SqZE" + } + ], + "copyrights": [ + { + "text": "2023 Hip Dozer", + "type": "C" + }, + { + "text": "2023 Hip Dozer / ヒップ", + "type": "P" + } + ], + "external_ids": { + "upc": "3617053824056" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/7ID9pP53DPzfpgXA03soZi" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/7ID9pP53DPzfpgXA03soZi", + "id": "7ID9pP53DPzfpgXA03soZi", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273c2fc53b58d4baa4648ccd750", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02c2fc53b58d4baa4648ccd750", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851c2fc53b58d4baa4648ccd750", + "width": 64 + } + ], + "is_playable": true, + "label": "Hip Dozer", + "name": "Adele", + "popularity": 28, + "release_date": "2023-01-18", + "release_date_precision": "day", + "total_tracks": 1, + "tracks": { + "href": "https://api.spotify.com/v1/albums/7ID9pP53DPzfpgXA03soZi/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/69cjjIQEN8M6heOBT2SqZE" + }, + "href": "https://api.spotify.com/v1/artists/69cjjIQEN8M6heOBT2SqZE", + "id": "69cjjIQEN8M6heOBT2SqZE", + "name": "Wun Two", + "type": "artist", + "uri": "spotify:artist:69cjjIQEN8M6heOBT2SqZE" + } + ], + "disc_number": 1, + "duration_ms": 135000, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1eeoMyqCQP0sKUjwH6pPcj" + }, + "href": "https://api.spotify.com/v1/tracks/1eeoMyqCQP0sKUjwH6pPcj", + "id": "1eeoMyqCQP0sKUjwH6pPcj", + "is_local": false, + "is_playable": true, + "name": "Adele", + "preview_url": "https://p.scdn.co/mp3-preview/6047b1bdf632c0c3c88d0571f3b8ae7c902668c2?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:1eeoMyqCQP0sKUjwH6pPcj" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 1 + }, + "type": "album", + "uri": "spotify:album:7ID9pP53DPzfpgXA03soZi" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/6FAo7ORAHEzSSf5q10LLfN" + }, + "href": "https://api.spotify.com/v1/artists/6FAo7ORAHEzSSf5q10LLfN", + "id": "6FAo7ORAHEzSSf5q10LLfN", + "name": "Lil Mabu", + "type": "artist", + "uri": "spotify:artist:6FAo7ORAHEzSSf5q10LLfN" + } + ], + "copyrights": [ + { + "text": "2023 Lil Mabu", + "type": "C" + }, + { + "text": "2023 Lil Mabu", + "type": "P" + } + ], + "external_ids": { + "upc": "0739919326962" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/2na9riat7uwn9pax75cJue" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/2na9riat7uwn9pax75cJue", + "id": "2na9riat7uwn9pax75cJue", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273a56e7dc625146a33a712bef4", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02a56e7dc625146a33a712bef4", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851a56e7dc625146a33a712bef4", + "width": 64 + } + ], + "is_playable": true, + "label": "Lil Mabu", + "name": "MATHEMATICAL DISRESPECT", + "popularity": 80, + "release_date": "2023-05-05", + "release_date_precision": "day", + "total_tracks": 1, + "tracks": { + "href": "https://api.spotify.com/v1/albums/2na9riat7uwn9pax75cJue/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/6FAo7ORAHEzSSf5q10LLfN" + }, + "href": "https://api.spotify.com/v1/artists/6FAo7ORAHEzSSf5q10LLfN", + "id": "6FAo7ORAHEzSSf5q10LLfN", + "name": "Lil Mabu", + "type": "artist", + "uri": "spotify:artist:6FAo7ORAHEzSSf5q10LLfN" + } + ], + "disc_number": 1, + "duration_ms": 88304, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/0Ymjv0OJeIIPXr6s9wi3iW" + }, + "href": "https://api.spotify.com/v1/tracks/0Ymjv0OJeIIPXr6s9wi3iW", + "id": "0Ymjv0OJeIIPXr6s9wi3iW", + "is_local": false, + "is_playable": true, + "name": "MATHEMATICAL DISRESPECT", + "preview_url": "https://p.scdn.co/mp3-preview/8b5a6efd26fd97902739816fd35a3a896af7e970?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:0Ymjv0OJeIIPXr6s9wi3iW" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 1 + }, + "type": "album", + "uri": "spotify:album:2na9riat7uwn9pax75cJue" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5nP8x4uEFjAAmDzwOEc9b8" + }, + "href": "https://api.spotify.com/v1/artists/5nP8x4uEFjAAmDzwOEc9b8", + "id": "5nP8x4uEFjAAmDzwOEc9b8", + "name": "Matuê", + "type": "artist", + "uri": "spotify:artist:5nP8x4uEFjAAmDzwOEc9b8" + } + ], + "copyrights": [ + { + "text": "(P) 2023 Sony Music Entertainment Brasil ltda. sob licença exclusiva de 30PRAUM.", + "type": "P" + } + ], + "external_ids": { + "upc": "196871092944" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/54nMZ1uU3fJFROh7jEymzB" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/54nMZ1uU3fJFROh7jEymzB", + "id": "54nMZ1uU3fJFROh7jEymzB", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b2739935bba90dee253e77d8f9ad", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e029935bba90dee253e77d8f9ad", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d000048519935bba90dee253e77d8f9ad", + "width": 64 + } + ], + "is_playable": true, + "label": "Sony Music Entertainment", + "name": "Conexões de Máfia (feat. Rich The Kid)", + "popularity": 79, + "release_date": "2023-04-30", + "release_date_precision": "day", + "total_tracks": 1, + "tracks": { + "href": "https://api.spotify.com/v1/albums/54nMZ1uU3fJFROh7jEymzB/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5nP8x4uEFjAAmDzwOEc9b8" + }, + "href": "https://api.spotify.com/v1/artists/5nP8x4uEFjAAmDzwOEc9b8", + "id": "5nP8x4uEFjAAmDzwOEc9b8", + "name": "Matuê", + "type": "artist", + "uri": "spotify:artist:5nP8x4uEFjAAmDzwOEc9b8" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1pPmIToKXyGdsCF6LmqLmI" + }, + "href": "https://api.spotify.com/v1/artists/1pPmIToKXyGdsCF6LmqLmI", + "id": "1pPmIToKXyGdsCF6LmqLmI", + "name": "Rich The Kid", + "type": "artist", + "uri": "spotify:artist:1pPmIToKXyGdsCF6LmqLmI" + } + ], + "disc_number": 1, + "duration_ms": 221538, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/3ktTWpYdXrYApH54cBo4Ap" + }, + "href": "https://api.spotify.com/v1/tracks/3ktTWpYdXrYApH54cBo4Ap", + "id": "3ktTWpYdXrYApH54cBo4Ap", + "is_local": false, + "is_playable": true, + "name": "Conexões de Máfia (feat. Rich The Kid)", + "preview_url": "https://p.scdn.co/mp3-preview/6227cbd3689a04abb7bd8091125a705fbe6ea19f?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:3ktTWpYdXrYApH54cBo4Ap" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 1 + }, + "type": "album", + "uri": "spotify:album:54nMZ1uU3fJFROh7jEymzB" + }, + { + "album_type": "album", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2H9JNqowSMr4wZzQuJC1zJ" + }, + "href": "https://api.spotify.com/v1/artists/2H9JNqowSMr4wZzQuJC1zJ", + "id": "2H9JNqowSMr4wZzQuJC1zJ", + "name": "Ernesto Cortazar", + "type": "artist", + "uri": "spotify:artist:2H9JNqowSMr4wZzQuJC1zJ" + } + ], + "copyrights": [ + { + "text": "2012 Piano Drops Music & Publishing", + "type": "C" + }, + { + "text": "2012 Piano Drops Music & Publishing", + "type": "P" + } + ], + "external_ids": { + "upc": "859708459289" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/2mM2kooO4w2QEDfSo3cfth" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/2mM2kooO4w2QEDfSo3cfth", + "id": "2mM2kooO4w2QEDfSo3cfth", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b2733ab8fff9dedb505a3b456556", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e023ab8fff9dedb505a3b456556", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d000048513ab8fff9dedb505a3b456556", + "width": 64 + } + ], + "is_playable": true, + "label": "Piano Drops Music & Publishing", + "name": "Colors", + "popularity": 53, + "release_date": "2012-06-21", + "release_date_precision": "day", + "total_tracks": 10, + "tracks": { + "href": "https://api.spotify.com/v1/albums/2mM2kooO4w2QEDfSo3cfth/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2H9JNqowSMr4wZzQuJC1zJ" + }, + "href": "https://api.spotify.com/v1/artists/2H9JNqowSMr4wZzQuJC1zJ", + "id": "2H9JNqowSMr4wZzQuJC1zJ", + "name": "Ernesto Cortazar", + "type": "artist", + "uri": "spotify:artist:2H9JNqowSMr4wZzQuJC1zJ" + } + ], + "disc_number": 1, + "duration_ms": 203300, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0ZYfxR7GnVIzqVAHprCBSE" + }, + "href": "https://api.spotify.com/v1/tracks/0ZYfxR7GnVIzqVAHprCBSE", + "id": "0ZYfxR7GnVIzqVAHprCBSE", + "is_local": false, + "is_playable": true, + "name": "Colors", + "preview_url": "https://p.scdn.co/mp3-preview/bec7c72861321b7cb82dec8c2922169931f6a8c9?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:0ZYfxR7GnVIzqVAHprCBSE" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2H9JNqowSMr4wZzQuJC1zJ" + }, + "href": "https://api.spotify.com/v1/artists/2H9JNqowSMr4wZzQuJC1zJ", + "id": "2H9JNqowSMr4wZzQuJC1zJ", + "name": "Ernesto Cortazar", + "type": "artist", + "uri": "spotify:artist:2H9JNqowSMr4wZzQuJC1zJ" + } + ], + "disc_number": 1, + "duration_ms": 192334, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0pL5frsRW4ZrwtfpTDyT3M" + }, + "href": "https://api.spotify.com/v1/tracks/0pL5frsRW4ZrwtfpTDyT3M", + "id": "0pL5frsRW4ZrwtfpTDyT3M", + "is_local": false, + "is_playable": true, + "name": "Dreamer", + "preview_url": "https://p.scdn.co/mp3-preview/19d533d38992a859647b031e6929ea8722004604?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 2, + "type": "track", + "uri": "spotify:track:0pL5frsRW4ZrwtfpTDyT3M" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2H9JNqowSMr4wZzQuJC1zJ" + }, + "href": "https://api.spotify.com/v1/artists/2H9JNqowSMr4wZzQuJC1zJ", + "id": "2H9JNqowSMr4wZzQuJC1zJ", + "name": "Ernesto Cortazar", + "type": "artist", + "uri": "spotify:artist:2H9JNqowSMr4wZzQuJC1zJ" + } + ], + "disc_number": 1, + "duration_ms": 165553, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1k9gUkdpkas5zQuInbaGfc" + }, + "href": "https://api.spotify.com/v1/tracks/1k9gUkdpkas5zQuInbaGfc", + "id": "1k9gUkdpkas5zQuInbaGfc", + "is_local": false, + "is_playable": true, + "name": "Just Another Blue Day", + "preview_url": "https://p.scdn.co/mp3-preview/c4fabd1b103e1cd0bfd125c1cdfb6c7f8e26bdaf?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 3, + "type": "track", + "uri": "spotify:track:1k9gUkdpkas5zQuInbaGfc" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2H9JNqowSMr4wZzQuJC1zJ" + }, + "href": "https://api.spotify.com/v1/artists/2H9JNqowSMr4wZzQuJC1zJ", + "id": "2H9JNqowSMr4wZzQuJC1zJ", + "name": "Ernesto Cortazar", + "type": "artist", + "uri": "spotify:artist:2H9JNqowSMr4wZzQuJC1zJ" + } + ], + "disc_number": 1, + "duration_ms": 279038, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/7w4Iuv8yq2OnGw5EObFbYT" + }, + "href": "https://api.spotify.com/v1/tracks/7w4Iuv8yq2OnGw5EObFbYT", + "id": "7w4Iuv8yq2OnGw5EObFbYT", + "is_local": false, + "is_playable": true, + "name": "One Life, One Love", + "preview_url": "https://p.scdn.co/mp3-preview/877651bea19cb35a284918252408bd575c3fc147?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 4, + "type": "track", + "uri": "spotify:track:7w4Iuv8yq2OnGw5EObFbYT" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2H9JNqowSMr4wZzQuJC1zJ" + }, + "href": "https://api.spotify.com/v1/artists/2H9JNqowSMr4wZzQuJC1zJ", + "id": "2H9JNqowSMr4wZzQuJC1zJ", + "name": "Ernesto Cortazar", + "type": "artist", + "uri": "spotify:artist:2H9JNqowSMr4wZzQuJC1zJ" + } + ], + "disc_number": 1, + "duration_ms": 234131, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/7qzS8DyyZmHOPd1aM0CZFH" + }, + "href": "https://api.spotify.com/v1/tracks/7qzS8DyyZmHOPd1aM0CZFH", + "id": "7qzS8DyyZmHOPd1aM0CZFH", + "is_local": false, + "is_playable": true, + "name": "Hidden Beauty", + "preview_url": "https://p.scdn.co/mp3-preview/02333d34337b6833eeb907be41ae53f7db2c47c6?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 5, + "type": "track", + "uri": "spotify:track:7qzS8DyyZmHOPd1aM0CZFH" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2H9JNqowSMr4wZzQuJC1zJ" + }, + "href": "https://api.spotify.com/v1/artists/2H9JNqowSMr4wZzQuJC1zJ", + "id": "2H9JNqowSMr4wZzQuJC1zJ", + "name": "Ernesto Cortazar", + "type": "artist", + "uri": "spotify:artist:2H9JNqowSMr4wZzQuJC1zJ" + } + ], + "disc_number": 1, + "duration_ms": 191292, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/5OsMrYY6U481Rt1TddE37f" + }, + "href": "https://api.spotify.com/v1/tracks/5OsMrYY6U481Rt1TddE37f", + "id": "5OsMrYY6U481Rt1TddE37f", + "is_local": false, + "is_playable": true, + "name": "Bridge of Sighs", + "preview_url": "https://p.scdn.co/mp3-preview/7978cd37428b41de70ec500018788fd5ef807a75?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 6, + "type": "track", + "uri": "spotify:track:5OsMrYY6U481Rt1TddE37f" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2H9JNqowSMr4wZzQuJC1zJ" + }, + "href": "https://api.spotify.com/v1/artists/2H9JNqowSMr4wZzQuJC1zJ", + "id": "2H9JNqowSMr4wZzQuJC1zJ", + "name": "Ernesto Cortazar", + "type": "artist", + "uri": "spotify:artist:2H9JNqowSMr4wZzQuJC1zJ" + } + ], + "disc_number": 1, + "duration_ms": 230345, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0UmND6yzJXodzNYvtsZpCN" + }, + "href": "https://api.spotify.com/v1/tracks/0UmND6yzJXodzNYvtsZpCN", + "id": "0UmND6yzJXodzNYvtsZpCN", + "is_local": false, + "is_playable": true, + "name": "One More Day", + "preview_url": "https://p.scdn.co/mp3-preview/2436f09a2f215d70d7c3a44aa99b68e389f3e0f6?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 7, + "type": "track", + "uri": "spotify:track:0UmND6yzJXodzNYvtsZpCN" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2H9JNqowSMr4wZzQuJC1zJ" + }, + "href": "https://api.spotify.com/v1/artists/2H9JNqowSMr4wZzQuJC1zJ", + "id": "2H9JNqowSMr4wZzQuJC1zJ", + "name": "Ernesto Cortazar", + "type": "artist", + "uri": "spotify:artist:2H9JNqowSMr4wZzQuJC1zJ" + } + ], + "disc_number": 1, + "duration_ms": 244693, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1pK23lqhgezK6eJPXTYJrF" + }, + "href": "https://api.spotify.com/v1/tracks/1pK23lqhgezK6eJPXTYJrF", + "id": "1pK23lqhgezK6eJPXTYJrF", + "is_local": false, + "is_playable": true, + "name": "Tale of an Errant Soul", + "preview_url": "https://p.scdn.co/mp3-preview/2ec4ace0f69f84fb272c23e4f222a07cf47f0dc8?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 8, + "type": "track", + "uri": "spotify:track:1pK23lqhgezK6eJPXTYJrF" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2H9JNqowSMr4wZzQuJC1zJ" + }, + "href": "https://api.spotify.com/v1/artists/2H9JNqowSMr4wZzQuJC1zJ", + "id": "2H9JNqowSMr4wZzQuJC1zJ", + "name": "Ernesto Cortazar", + "type": "artist", + "uri": "spotify:artist:2H9JNqowSMr4wZzQuJC1zJ" + } + ], + "disc_number": 1, + "duration_ms": 192830, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/5cHXlEIOJTI3Ddr9k25RL7" + }, + "href": "https://api.spotify.com/v1/tracks/5cHXlEIOJTI3Ddr9k25RL7", + "id": "5cHXlEIOJTI3Ddr9k25RL7", + "is_local": false, + "is_playable": true, + "name": "Mellow Eyes", + "preview_url": "https://p.scdn.co/mp3-preview/e05bc36907f155997f7b9aa8be679cac5a98f583?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 9, + "type": "track", + "uri": "spotify:track:5cHXlEIOJTI3Ddr9k25RL7" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2H9JNqowSMr4wZzQuJC1zJ" + }, + "href": "https://api.spotify.com/v1/artists/2H9JNqowSMr4wZzQuJC1zJ", + "id": "2H9JNqowSMr4wZzQuJC1zJ", + "name": "Ernesto Cortazar", + "type": "artist", + "uri": "spotify:artist:2H9JNqowSMr4wZzQuJC1zJ" + } + ], + "disc_number": 1, + "duration_ms": 226533, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/5Du03K8DVAAzxP3KDwGXtd" + }, + "href": "https://api.spotify.com/v1/tracks/5Du03K8DVAAzxP3KDwGXtd", + "id": "5Du03K8DVAAzxP3KDwGXtd", + "is_local": false, + "is_playable": true, + "name": "Anna", + "preview_url": "https://p.scdn.co/mp3-preview/e28a5ddc971c00caaf3c6847459dec4d65ed81b7?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 10, + "type": "track", + "uri": "spotify:track:5Du03K8DVAAzxP3KDwGXtd" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 10 + }, + "type": "album", + "uri": "spotify:album:2mM2kooO4w2QEDfSo3cfth" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5flmV3mGx4eJl98dH8Fibn" + }, + "href": "https://api.spotify.com/v1/artists/5flmV3mGx4eJl98dH8Fibn", + "id": "5flmV3mGx4eJl98dH8Fibn", + "name": "Sammy Santana", + "type": "artist", + "uri": "spotify:artist:5flmV3mGx4eJl98dH8Fibn" + } + ], + "copyrights": [ + { + "text": "2023 L.M.F.", + "type": "C" + }, + { + "text": "2023 L.M.F.", + "type": "P" + } + ], + "external_ids": { + "upc": "197852180940" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/6h4krqE8P09et7lHDrZkjS" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/6h4krqE8P09et7lHDrZkjS", + "id": "6h4krqE8P09et7lHDrZkjS", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b2739ba54c99754eab5c872de3b3", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e029ba54c99754eab5c872de3b3", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d000048519ba54c99754eab5c872de3b3", + "width": 64 + } + ], + "is_playable": true, + "label": "L.M.F.", + "name": "Colores", + "popularity": 19, + "release_date": "2023-05-31", + "release_date_precision": "day", + "total_tracks": 1, + "tracks": { + "href": "https://api.spotify.com/v1/albums/6h4krqE8P09et7lHDrZkjS/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5flmV3mGx4eJl98dH8Fibn" + }, + "href": "https://api.spotify.com/v1/artists/5flmV3mGx4eJl98dH8Fibn", + "id": "5flmV3mGx4eJl98dH8Fibn", + "name": "Sammy Santana", + "type": "artist", + "uri": "spotify:artist:5flmV3mGx4eJl98dH8Fibn" + } + ], + "disc_number": 1, + "duration_ms": 171374, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0dtohe9TeJ56Eq42WeWCKe" + }, + "href": "https://api.spotify.com/v1/tracks/0dtohe9TeJ56Eq42WeWCKe", + "id": "0dtohe9TeJ56Eq42WeWCKe", + "is_local": false, + "is_playable": true, + "name": "Colores", + "preview_url": "https://p.scdn.co/mp3-preview/b5a10a4d23bfe7aea53979380d007df65fd14840?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:0dtohe9TeJ56Eq42WeWCKe" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 1 + }, + "type": "album", + "uri": "spotify:album:6h4krqE8P09et7lHDrZkjS" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1vP5VKRpTUL3X9D8f32P0g" + }, + "href": "https://api.spotify.com/v1/artists/1vP5VKRpTUL3X9D8f32P0g", + "id": "1vP5VKRpTUL3X9D8f32P0g", + "name": "Bx real", + "type": "artist", + "uri": "spotify:artist:1vP5VKRpTUL3X9D8f32P0g" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/16w5AbtIM56HebZ9W8BJwA" + }, + "href": "https://api.spotify.com/v1/artists/16w5AbtIM56HebZ9W8BJwA", + "id": "16w5AbtIM56HebZ9W8BJwA", + "name": "KlatTheKid", + "type": "artist", + "uri": "spotify:artist:16w5AbtIM56HebZ9W8BJwA" + } + ], + "copyrights": [ + { + "text": "2022 BX Real", + "type": "C" + }, + { + "text": "2022 BX Real", + "type": "P" + } + ], + "external_ids": { + "upc": "740442051900" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/5EKHkBAwt71DFUodWkbuDQ" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/5EKHkBAwt71DFUodWkbuDQ", + "id": "5EKHkBAwt71DFUodWkbuDQ", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b27308080032a94b6dbdbfcb12dd", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e0208080032a94b6dbdbfcb12dd", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d0000485108080032a94b6dbdbfcb12dd", + "width": 64 + } + ], + "is_playable": true, + "label": "BX Real", + "name": "Matue", + "popularity": 9, + "release_date": "2022-03-27", + "release_date_precision": "day", + "total_tracks": 1, + "tracks": { + "href": "https://api.spotify.com/v1/albums/5EKHkBAwt71DFUodWkbuDQ/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1vP5VKRpTUL3X9D8f32P0g" + }, + "href": "https://api.spotify.com/v1/artists/1vP5VKRpTUL3X9D8f32P0g", + "id": "1vP5VKRpTUL3X9D8f32P0g", + "name": "Bx real", + "type": "artist", + "uri": "spotify:artist:1vP5VKRpTUL3X9D8f32P0g" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/16w5AbtIM56HebZ9W8BJwA" + }, + "href": "https://api.spotify.com/v1/artists/16w5AbtIM56HebZ9W8BJwA", + "id": "16w5AbtIM56HebZ9W8BJwA", + "name": "KlatTheKid", + "type": "artist", + "uri": "spotify:artist:16w5AbtIM56HebZ9W8BJwA" + } + ], + "disc_number": 1, + "duration_ms": 134109, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/6b16bLnEWpZRYlJZoftimq" + }, + "href": "https://api.spotify.com/v1/tracks/6b16bLnEWpZRYlJZoftimq", + "id": "6b16bLnEWpZRYlJZoftimq", + "is_local": false, + "is_playable": true, + "name": "Matue", + "preview_url": "https://p.scdn.co/mp3-preview/ea10c9784ee77e2f8365090e197fc9f5558f6250?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:6b16bLnEWpZRYlJZoftimq" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 1 + }, + "type": "album", + "uri": "spotify:album:5EKHkBAwt71DFUodWkbuDQ" + }, + { + "album_type": "album", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4L5SLCIDWPPNGzrLraYCOS" + }, + "href": "https://api.spotify.com/v1/artists/4L5SLCIDWPPNGzrLraYCOS", + "id": "4L5SLCIDWPPNGzrLraYCOS", + "name": "Grupo Extra", + "type": "artist", + "uri": "spotify:artist:4L5SLCIDWPPNGzrLraYCOS" + } + ], + "copyrights": [ + { + "text": "Urban Latin Records", + "type": "C" + }, + { + "text": "Urban Latin Records", + "type": "P" + } + ], + "external_ids": { + "upc": "3614975043275" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/0e60AWHAGO3t7mNZPImsKA" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/0e60AWHAGO3t7mNZPImsKA", + "id": "0e60AWHAGO3t7mNZPImsKA", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273262b14c2ec6eb11849c7e926", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02262b14c2ec6eb11849c7e926", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851262b14c2ec6eb11849c7e926", + "width": 64 + } + ], + "is_playable": true, + "label": "Urban Latin Records", + "name": "Colores (Bachata Is Taking Over!)", + "popularity": 55, + "release_date": "2017-04-28", + "release_date_precision": "day", + "total_tracks": 17, + "tracks": { + "href": "https://api.spotify.com/v1/albums/0e60AWHAGO3t7mNZPImsKA/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4L5SLCIDWPPNGzrLraYCOS" + }, + "href": "https://api.spotify.com/v1/artists/4L5SLCIDWPPNGzrLraYCOS", + "id": "4L5SLCIDWPPNGzrLraYCOS", + "name": "Grupo Extra", + "type": "artist", + "uri": "spotify:artist:4L5SLCIDWPPNGzrLraYCOS" + } + ], + "disc_number": 1, + "duration_ms": 239372, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3iGjLTDqokSuf6yYI83wzi" + }, + "href": "https://api.spotify.com/v1/tracks/3iGjLTDqokSuf6yYI83wzi", + "id": "3iGjLTDqokSuf6yYI83wzi", + "is_local": false, + "is_playable": true, + "name": "Me Emborrachare - Bachata Radio Edit", + "preview_url": "https://p.scdn.co/mp3-preview/984ab95a6cdb2dc6217657094a3415c131eaf711?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:3iGjLTDqokSuf6yYI83wzi" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4L5SLCIDWPPNGzrLraYCOS" + }, + "href": "https://api.spotify.com/v1/artists/4L5SLCIDWPPNGzrLraYCOS", + "id": "4L5SLCIDWPPNGzrLraYCOS", + "name": "Grupo Extra", + "type": "artist", + "uri": "spotify:artist:4L5SLCIDWPPNGzrLraYCOS" + } + ], + "disc_number": 1, + "duration_ms": 208713, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2Ndf3nHKWpZ0Ds2u05f7j6" + }, + "href": "https://api.spotify.com/v1/tracks/2Ndf3nHKWpZ0Ds2u05f7j6", + "id": "2Ndf3nHKWpZ0Ds2u05f7j6", + "is_local": false, + "is_playable": true, + "name": "Te Amo Mi Vida", + "preview_url": "https://p.scdn.co/mp3-preview/599ba039cdd9b47cc1a6da4811f815ba98677e9d?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 2, + "type": "track", + "uri": "spotify:track:2Ndf3nHKWpZ0Ds2u05f7j6" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4L5SLCIDWPPNGzrLraYCOS" + }, + "href": "https://api.spotify.com/v1/artists/4L5SLCIDWPPNGzrLraYCOS", + "id": "4L5SLCIDWPPNGzrLraYCOS", + "name": "Grupo Extra", + "type": "artist", + "uri": "spotify:artist:4L5SLCIDWPPNGzrLraYCOS" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/7d1wBAl5FEvOENbACiZIYZ" + }, + "href": "https://api.spotify.com/v1/artists/7d1wBAl5FEvOENbACiZIYZ", + "id": "7d1wBAl5FEvOENbACiZIYZ", + "name": "Pelo D'Ambrosio", + "type": "artist", + "uri": "spotify:artist:7d1wBAl5FEvOENbACiZIYZ" + } + ], + "disc_number": 1, + "duration_ms": 222640, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6iDlWb0hPAWE66NgNpYqVg" + }, + "href": "https://api.spotify.com/v1/tracks/6iDlWb0hPAWE66NgNpYqVg", + "id": "6iDlWb0hPAWE66NgNpYqVg", + "is_local": false, + "is_playable": true, + "name": "Y Que Paso", + "preview_url": "https://p.scdn.co/mp3-preview/d855374c8745ca9e58db9a2d5d1dc467a79b1603?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 3, + "type": "track", + "uri": "spotify:track:6iDlWb0hPAWE66NgNpYqVg" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4L5SLCIDWPPNGzrLraYCOS" + }, + "href": "https://api.spotify.com/v1/artists/4L5SLCIDWPPNGzrLraYCOS", + "id": "4L5SLCIDWPPNGzrLraYCOS", + "name": "Grupo Extra", + "type": "artist", + "uri": "spotify:artist:4L5SLCIDWPPNGzrLraYCOS" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4tLUnrSgMM7tT0zVs3wX61" + }, + "href": "https://api.spotify.com/v1/artists/4tLUnrSgMM7tT0zVs3wX61", + "id": "4tLUnrSgMM7tT0zVs3wX61", + "name": "Daniel Santacruz", + "type": "artist", + "uri": "spotify:artist:4tLUnrSgMM7tT0zVs3wX61" + } + ], + "disc_number": 1, + "duration_ms": 250928, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6XBhB6lKrqeAnKn4CB0sVz" + }, + "href": "https://api.spotify.com/v1/tracks/6XBhB6lKrqeAnKn4CB0sVz", + "id": "6XBhB6lKrqeAnKn4CB0sVz", + "is_local": false, + "is_playable": true, + "name": "Volvieron a Darme las 6", + "preview_url": "https://p.scdn.co/mp3-preview/5484a1abdf34d0ba243abd4e2089087527f97d47?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 4, + "type": "track", + "uri": "spotify:track:6XBhB6lKrqeAnKn4CB0sVz" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4L5SLCIDWPPNGzrLraYCOS" + }, + "href": "https://api.spotify.com/v1/artists/4L5SLCIDWPPNGzrLraYCOS", + "id": "4L5SLCIDWPPNGzrLraYCOS", + "name": "Grupo Extra", + "type": "artist", + "uri": "spotify:artist:4L5SLCIDWPPNGzrLraYCOS" + } + ], + "disc_number": 1, + "duration_ms": 258352, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3binocFs2uBFGSlOeOmYsB" + }, + "href": "https://api.spotify.com/v1/tracks/3binocFs2uBFGSlOeOmYsB", + "id": "3binocFs2uBFGSlOeOmYsB", + "is_local": false, + "is_playable": true, + "name": "Esta Noche", + "preview_url": "https://p.scdn.co/mp3-preview/19af65726605370ed4b50d05bf3ab5c3b0aa01e5?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 5, + "type": "track", + "uri": "spotify:track:3binocFs2uBFGSlOeOmYsB" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4L5SLCIDWPPNGzrLraYCOS" + }, + "href": "https://api.spotify.com/v1/artists/4L5SLCIDWPPNGzrLraYCOS", + "id": "4L5SLCIDWPPNGzrLraYCOS", + "name": "Grupo Extra", + "type": "artist", + "uri": "spotify:artist:4L5SLCIDWPPNGzrLraYCOS" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5zvRX0y0JYtGOmGJwLwyIL" + }, + "href": "https://api.spotify.com/v1/artists/5zvRX0y0JYtGOmGJwLwyIL", + "id": "5zvRX0y0JYtGOmGJwLwyIL", + "name": "Bachata Heightz", + "type": "artist", + "uri": "spotify:artist:5zvRX0y0JYtGOmGJwLwyIL" + } + ], + "disc_number": 1, + "duration_ms": 264319, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/31urThFC0ijtXdenpPp2f3" + }, + "href": "https://api.spotify.com/v1/tracks/31urThFC0ijtXdenpPp2f3", + "id": "31urThFC0ijtXdenpPp2f3", + "is_local": false, + "is_playable": true, + "name": "Cuanto Duele", + "preview_url": "https://p.scdn.co/mp3-preview/6944d7d454dc9c366d7b266b515ae5f7f6d38c15?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 6, + "type": "track", + "uri": "spotify:track:31urThFC0ijtXdenpPp2f3" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4L5SLCIDWPPNGzrLraYCOS" + }, + "href": "https://api.spotify.com/v1/artists/4L5SLCIDWPPNGzrLraYCOS", + "id": "4L5SLCIDWPPNGzrLraYCOS", + "name": "Grupo Extra", + "type": "artist", + "uri": "spotify:artist:4L5SLCIDWPPNGzrLraYCOS" + } + ], + "disc_number": 1, + "duration_ms": 243495, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/14sspPKCM3FeYPXR5TLJae" + }, + "href": "https://api.spotify.com/v1/tracks/14sspPKCM3FeYPXR5TLJae", + "id": "14sspPKCM3FeYPXR5TLJae", + "is_local": false, + "is_playable": true, + "name": "Bailemos", + "preview_url": "https://p.scdn.co/mp3-preview/b8048dd1593efacf008676b2e765b6cf092c0cd7?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 7, + "type": "track", + "uri": "spotify:track:14sspPKCM3FeYPXR5TLJae" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4L5SLCIDWPPNGzrLraYCOS" + }, + "href": "https://api.spotify.com/v1/artists/4L5SLCIDWPPNGzrLraYCOS", + "id": "4L5SLCIDWPPNGzrLraYCOS", + "name": "Grupo Extra", + "type": "artist", + "uri": "spotify:artist:4L5SLCIDWPPNGzrLraYCOS" + } + ], + "disc_number": 1, + "duration_ms": 233984, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/7rSbrmVUyyGQaInjnOuEDs" + }, + "href": "https://api.spotify.com/v1/tracks/7rSbrmVUyyGQaInjnOuEDs", + "id": "7rSbrmVUyyGQaInjnOuEDs", + "is_local": false, + "is_playable": true, + "name": "Enamorarme Yo", + "preview_url": "https://p.scdn.co/mp3-preview/3ec7a0c2c063dd4aa7dcc0a80f93e33ef8043e65?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 8, + "type": "track", + "uri": "spotify:track:7rSbrmVUyyGQaInjnOuEDs" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4L5SLCIDWPPNGzrLraYCOS" + }, + "href": "https://api.spotify.com/v1/artists/4L5SLCIDWPPNGzrLraYCOS", + "id": "4L5SLCIDWPPNGzrLraYCOS", + "name": "Grupo Extra", + "type": "artist", + "uri": "spotify:artist:4L5SLCIDWPPNGzrLraYCOS" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0gp7iviru0HlUR7yGmiLJ7" + }, + "href": "https://api.spotify.com/v1/artists/0gp7iviru0HlUR7yGmiLJ7", + "id": "0gp7iviru0HlUR7yGmiLJ7", + "name": "Voz A Voz", + "type": "artist", + "uri": "spotify:artist:0gp7iviru0HlUR7yGmiLJ7" + } + ], + "disc_number": 1, + "duration_ms": 250734, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0rkA9cAdR1eIWo7oDxrpia" + }, + "href": "https://api.spotify.com/v1/tracks/0rkA9cAdR1eIWo7oDxrpia", + "id": "0rkA9cAdR1eIWo7oDxrpia", + "is_local": false, + "is_playable": true, + "name": "No Quiero Perderte", + "preview_url": "https://p.scdn.co/mp3-preview/d84c04bd499f65e1b2f6dba7985a09760baf8102?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 9, + "type": "track", + "uri": "spotify:track:0rkA9cAdR1eIWo7oDxrpia" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4L5SLCIDWPPNGzrLraYCOS" + }, + "href": "https://api.spotify.com/v1/artists/4L5SLCIDWPPNGzrLraYCOS", + "id": "4L5SLCIDWPPNGzrLraYCOS", + "name": "Grupo Extra", + "type": "artist", + "uri": "spotify:artist:4L5SLCIDWPPNGzrLraYCOS" + } + ], + "disc_number": 1, + "duration_ms": 296644, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3JqCmXehmCTFcvgj8oruHf" + }, + "href": "https://api.spotify.com/v1/tracks/3JqCmXehmCTFcvgj8oruHf", + "id": "3JqCmXehmCTFcvgj8oruHf", + "is_local": false, + "is_playable": true, + "name": "Por Lo Menos Te Tuve", + "preview_url": "https://p.scdn.co/mp3-preview/ecb49c9e090b36bf621d75e2a584775f5bfce18b?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 10, + "type": "track", + "uri": "spotify:track:3JqCmXehmCTFcvgj8oruHf" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4L5SLCIDWPPNGzrLraYCOS" + }, + "href": "https://api.spotify.com/v1/artists/4L5SLCIDWPPNGzrLraYCOS", + "id": "4L5SLCIDWPPNGzrLraYCOS", + "name": "Grupo Extra", + "type": "artist", + "uri": "spotify:artist:4L5SLCIDWPPNGzrLraYCOS" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1nf6gLEC45OmoJFIxU7aUT" + }, + "href": "https://api.spotify.com/v1/artists/1nf6gLEC45OmoJFIxU7aUT", + "id": "1nf6gLEC45OmoJFIxU7aUT", + "name": "Kewin Cosmos", + "type": "artist", + "uri": "spotify:artist:1nf6gLEC45OmoJFIxU7aUT" + } + ], + "disc_number": 1, + "duration_ms": 248924, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/56c4w4fwHNoEb0FdV4X9CJ" + }, + "href": "https://api.spotify.com/v1/tracks/56c4w4fwHNoEb0FdV4X9CJ", + "id": "56c4w4fwHNoEb0FdV4X9CJ", + "is_local": false, + "is_playable": true, + "name": "Ya Te Olvidé", + "preview_url": "https://p.scdn.co/mp3-preview/eb41b647839f407d0b163066d22a5617544240d9?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 11, + "type": "track", + "uri": "spotify:track:56c4w4fwHNoEb0FdV4X9CJ" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4L5SLCIDWPPNGzrLraYCOS" + }, + "href": "https://api.spotify.com/v1/artists/4L5SLCIDWPPNGzrLraYCOS", + "id": "4L5SLCIDWPPNGzrLraYCOS", + "name": "Grupo Extra", + "type": "artist", + "uri": "spotify:artist:4L5SLCIDWPPNGzrLraYCOS" + } + ], + "disc_number": 1, + "duration_ms": 283300, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6FjW1cPUFpSuMhtLDJE4pY" + }, + "href": "https://api.spotify.com/v1/tracks/6FjW1cPUFpSuMhtLDJE4pY", + "id": "6FjW1cPUFpSuMhtLDJE4pY", + "is_local": false, + "is_playable": true, + "name": "Olvidarte", + "preview_url": "https://p.scdn.co/mp3-preview/e65c8e3f634eb55657f3d0b064f81c2c119b93a6?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 12, + "type": "track", + "uri": "spotify:track:6FjW1cPUFpSuMhtLDJE4pY" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4L5SLCIDWPPNGzrLraYCOS" + }, + "href": "https://api.spotify.com/v1/artists/4L5SLCIDWPPNGzrLraYCOS", + "id": "4L5SLCIDWPPNGzrLraYCOS", + "name": "Grupo Extra", + "type": "artist", + "uri": "spotify:artist:4L5SLCIDWPPNGzrLraYCOS" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0hjlvpp7aRKHO68e5dB4jX" + }, + "href": "https://api.spotify.com/v1/artists/0hjlvpp7aRKHO68e5dB4jX", + "id": "0hjlvpp7aRKHO68e5dB4jX", + "name": "Nextar", + "type": "artist", + "uri": "spotify:artist:0hjlvpp7aRKHO68e5dB4jX" + } + ], + "disc_number": 1, + "duration_ms": 200074, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/120hG9q1oe2G41kqlqG9V5" + }, + "href": "https://api.spotify.com/v1/tracks/120hG9q1oe2G41kqlqG9V5", + "id": "120hG9q1oe2G41kqlqG9V5", + "is_local": false, + "is_playable": true, + "name": "Ahora Que No Te Tengo", + "preview_url": "https://p.scdn.co/mp3-preview/c0d2e080281a8c0e51833fe1be8067988c7c8a9f?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 13, + "type": "track", + "uri": "spotify:track:120hG9q1oe2G41kqlqG9V5" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4L5SLCIDWPPNGzrLraYCOS" + }, + "href": "https://api.spotify.com/v1/artists/4L5SLCIDWPPNGzrLraYCOS", + "id": "4L5SLCIDWPPNGzrLraYCOS", + "name": "Grupo Extra", + "type": "artist", + "uri": "spotify:artist:4L5SLCIDWPPNGzrLraYCOS" + } + ], + "disc_number": 1, + "duration_ms": 231114, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6x0UcshooWomCfap7iKuPx" + }, + "href": "https://api.spotify.com/v1/tracks/6x0UcshooWomCfap7iKuPx", + "id": "6x0UcshooWomCfap7iKuPx", + "is_local": false, + "is_playable": true, + "name": "Te Perdi", + "preview_url": "https://p.scdn.co/mp3-preview/67090c2ac50d60d4e3b33af219af47e3aecee6f7?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 14, + "type": "track", + "uri": "spotify:track:6x0UcshooWomCfap7iKuPx" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4L5SLCIDWPPNGzrLraYCOS" + }, + "href": "https://api.spotify.com/v1/artists/4L5SLCIDWPPNGzrLraYCOS", + "id": "4L5SLCIDWPPNGzrLraYCOS", + "name": "Grupo Extra", + "type": "artist", + "uri": "spotify:artist:4L5SLCIDWPPNGzrLraYCOS" + } + ], + "disc_number": 1, + "duration_ms": 236554, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2BdrCwDHkDcQm3vMHxvQil" + }, + "href": "https://api.spotify.com/v1/tracks/2BdrCwDHkDcQm3vMHxvQil", + "id": "2BdrCwDHkDcQm3vMHxvQil", + "is_local": false, + "is_playable": true, + "name": "Justamente Ahora", + "preview_url": "https://p.scdn.co/mp3-preview/b31199fbab3ed6728f284d301b485cd9a9b9ea8d?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 15, + "type": "track", + "uri": "spotify:track:2BdrCwDHkDcQm3vMHxvQil" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4L5SLCIDWPPNGzrLraYCOS" + }, + "href": "https://api.spotify.com/v1/artists/4L5SLCIDWPPNGzrLraYCOS", + "id": "4L5SLCIDWPPNGzrLraYCOS", + "name": "Grupo Extra", + "type": "artist", + "uri": "spotify:artist:4L5SLCIDWPPNGzrLraYCOS" + } + ], + "disc_number": 1, + "duration_ms": 229750, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6fNv5zHowqfZOM28mbCae9" + }, + "href": "https://api.spotify.com/v1/tracks/6fNv5zHowqfZOM28mbCae9", + "id": "6fNv5zHowqfZOM28mbCae9", + "is_local": false, + "is_playable": true, + "name": "Es Amor - Bachata Radio Edit", + "preview_url": "https://p.scdn.co/mp3-preview/bb5febf3af115b95186d3b77346251d5b46f6caa?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 16, + "type": "track", + "uri": "spotify:track:6fNv5zHowqfZOM28mbCae9" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4L5SLCIDWPPNGzrLraYCOS" + }, + "href": "https://api.spotify.com/v1/artists/4L5SLCIDWPPNGzrLraYCOS", + "id": "4L5SLCIDWPPNGzrLraYCOS", + "name": "Grupo Extra", + "type": "artist", + "uri": "spotify:artist:4L5SLCIDWPPNGzrLraYCOS" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1ADFyan08VIwFUGwGXDxNe" + }, + "href": "https://api.spotify.com/v1/artists/1ADFyan08VIwFUGwGXDxNe", + "id": "1ADFyan08VIwFUGwGXDxNe", + "name": "DJ Unic", + "type": "artist", + "uri": "spotify:artist:1ADFyan08VIwFUGwGXDxNe" + } + ], + "disc_number": 1, + "duration_ms": 246810, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6v0dJ07UpnZWXJxCMVu01S" + }, + "href": "https://api.spotify.com/v1/tracks/6v0dJ07UpnZWXJxCMVu01S", + "id": "6v0dJ07UpnZWXJxCMVu01S", + "is_local": false, + "is_playable": true, + "name": "Me Emborrachare - Reggaeton Radio Edit", + "preview_url": "https://p.scdn.co/mp3-preview/88c69028a6184dca852a8c7b0aef1962faa9235a?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 17, + "type": "track", + "uri": "spotify:track:6v0dJ07UpnZWXJxCMVu01S" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 17 + }, + "type": "album", + "uri": "spotify:album:0e60AWHAGO3t7mNZPImsKA" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4YZygJBd1bAKMCyTrut3Aa" + }, + "href": "https://api.spotify.com/v1/artists/4YZygJBd1bAKMCyTrut3Aa", + "id": "4YZygJBd1bAKMCyTrut3Aa", + "name": "pablillo beats", + "type": "artist", + "uri": "spotify:artist:4YZygJBd1bAKMCyTrut3Aa" + } + ], + "copyrights": [ + { + "text": "2023 5303522 Records DK", + "type": "C" + }, + { + "text": "2023 5303522 Records DK", + "type": "P" + } + ], + "external_ids": { + "upc": "197802060841" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/2DfbtlG81UMOCSXefn6BYj" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/2DfbtlG81UMOCSXefn6BYj", + "id": "2DfbtlG81UMOCSXefn6BYj", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273e1e003524571d63f96538d36", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02e1e003524571d63f96538d36", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851e1e003524571d63f96538d36", + "width": 64 + } + ], + "is_playable": true, + "label": "5303522 Records DK", + "name": "Colores", + "popularity": 21, + "release_date": "2023-05-04", + "release_date_precision": "day", + "total_tracks": 1, + "tracks": { + "href": "https://api.spotify.com/v1/albums/2DfbtlG81UMOCSXefn6BYj/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4YZygJBd1bAKMCyTrut3Aa" + }, + "href": "https://api.spotify.com/v1/artists/4YZygJBd1bAKMCyTrut3Aa", + "id": "4YZygJBd1bAKMCyTrut3Aa", + "name": "pablillo beats", + "type": "artist", + "uri": "spotify:artist:4YZygJBd1bAKMCyTrut3Aa" + } + ], + "disc_number": 1, + "duration_ms": 366571, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3DoIXq3J0b1qFMBO40LyLU" + }, + "href": "https://api.spotify.com/v1/tracks/3DoIXq3J0b1qFMBO40LyLU", + "id": "3DoIXq3J0b1qFMBO40LyLU", + "is_local": false, + "is_playable": true, + "name": "Colores", + "preview_url": "https://p.scdn.co/mp3-preview/711e49b28c37a10bd3d862031e95d5e7d72afceb?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:3DoIXq3J0b1qFMBO40LyLU" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 1 + }, + "type": "album", + "uri": "spotify:album:2DfbtlG81UMOCSXefn6BYj" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4TvtCcZsS94jDxtnTZh2qX" + }, + "href": "https://api.spotify.com/v1/artists/4TvtCcZsS94jDxtnTZh2qX", + "id": "4TvtCcZsS94jDxtnTZh2qX", + "name": "Matue", + "type": "artist", + "uri": "spotify:artist:4TvtCcZsS94jDxtnTZh2qX" + } + ], + "copyrights": [ + { + "text": "2023 Matue", + "type": "C" + }, + { + "text": "2023 Matue", + "type": "P" + } + ], + "external_ids": { + "upc": "5063245182189" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/18AT8xMxgqPLpiDZOtsLfN" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/18AT8xMxgqPLpiDZOtsLfN", + "id": "18AT8xMxgqPLpiDZOtsLfN", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273e9ba5113cca2779102f1355b", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02e9ba5113cca2779102f1355b", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851e9ba5113cca2779102f1355b", + "width": 64 + } + ], + "is_playable": true, + "label": "Matue", + "name": "Inferno De Dante", + "popularity": 23, + "release_date": "2023-02-14", + "release_date_precision": "day", + "total_tracks": 1, + "tracks": { + "href": "https://api.spotify.com/v1/albums/18AT8xMxgqPLpiDZOtsLfN/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4TvtCcZsS94jDxtnTZh2qX" + }, + "href": "https://api.spotify.com/v1/artists/4TvtCcZsS94jDxtnTZh2qX", + "id": "4TvtCcZsS94jDxtnTZh2qX", + "name": "Matue", + "type": "artist", + "uri": "spotify:artist:4TvtCcZsS94jDxtnTZh2qX" + } + ], + "disc_number": 1, + "duration_ms": 123103, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/7fhTP1lkMFFhhZpMbqCbNX" + }, + "href": "https://api.spotify.com/v1/tracks/7fhTP1lkMFFhhZpMbqCbNX", + "id": "7fhTP1lkMFFhhZpMbqCbNX", + "is_local": false, + "is_playable": true, + "name": "Inferno De Dante", + "preview_url": "https://p.scdn.co/mp3-preview/3c4b93afd9d0da6892baa4d5fe4b2bc4ad08a579?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:7fhTP1lkMFFhhZpMbqCbNX" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 1 + }, + "type": "album", + "uri": "spotify:album:18AT8xMxgqPLpiDZOtsLfN" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4mb1xtQVGSK5dh8AbtwBiR" + }, + "href": "https://api.spotify.com/v1/artists/4mb1xtQVGSK5dh8AbtwBiR", + "id": "4mb1xtQVGSK5dh8AbtwBiR", + "name": "MC Lan", + "type": "artist", + "uri": "spotify:artist:4mb1xtQVGSK5dh8AbtwBiR" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/34nDHQABOX9Sb4lbZhre0j" + }, + "href": "https://api.spotify.com/v1/artists/34nDHQABOX9Sb4lbZhre0j", + "id": "34nDHQABOX9Sb4lbZhre0j", + "name": "Matuê", + "type": "artist", + "uri": "spotify:artist:34nDHQABOX9Sb4lbZhre0j" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5YwzDz4RJfTiMHS4tdR5Lf" + }, + "href": "https://api.spotify.com/v1/artists/5YwzDz4RJfTiMHS4tdR5Lf", + "id": "5YwzDz4RJfTiMHS4tdR5Lf", + "name": "Xamã", + "type": "artist", + "uri": "spotify:artist:5YwzDz4RJfTiMHS4tdR5Lf" + } + ], + "copyrights": [ + { + "text": "2020, MC Lan, Matue & Xama", + "type": "C" + }, + { + "text": "2020, MC Lan, Matue & Xama", + "type": "P" + } + ], + "external_ids": { + "upc": "195712074590" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/6iM46uMk7q6NSbJHMo9LUc" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/6iM46uMk7q6NSbJHMo9LUc", + "id": "6iM46uMk7q6NSbJHMo9LUc", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b2735f46743a887b43e629044f0a", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e025f46743a887b43e629044f0a", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d000048515f46743a887b43e629044f0a", + "width": 64 + } + ], + "is_playable": true, + "label": "MC Lan, Matue & Xama", + "name": "Rap Game", + "popularity": 23, + "release_date": "2020-02-24", + "release_date_precision": "day", + "total_tracks": 1, + "tracks": { + "href": "https://api.spotify.com/v1/albums/6iM46uMk7q6NSbJHMo9LUc/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4mb1xtQVGSK5dh8AbtwBiR" + }, + "href": "https://api.spotify.com/v1/artists/4mb1xtQVGSK5dh8AbtwBiR", + "id": "4mb1xtQVGSK5dh8AbtwBiR", + "name": "MC Lan", + "type": "artist", + "uri": "spotify:artist:4mb1xtQVGSK5dh8AbtwBiR" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/34nDHQABOX9Sb4lbZhre0j" + }, + "href": "https://api.spotify.com/v1/artists/34nDHQABOX9Sb4lbZhre0j", + "id": "34nDHQABOX9Sb4lbZhre0j", + "name": "Matuê", + "type": "artist", + "uri": "spotify:artist:34nDHQABOX9Sb4lbZhre0j" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5YwzDz4RJfTiMHS4tdR5Lf" + }, + "href": "https://api.spotify.com/v1/artists/5YwzDz4RJfTiMHS4tdR5Lf", + "id": "5YwzDz4RJfTiMHS4tdR5Lf", + "name": "Xamã", + "type": "artist", + "uri": "spotify:artist:5YwzDz4RJfTiMHS4tdR5Lf" + } + ], + "disc_number": 1, + "duration_ms": 246845, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6l54Q4ulWQffA8Y250iSj9" + }, + "href": "https://api.spotify.com/v1/tracks/6l54Q4ulWQffA8Y250iSj9", + "id": "6l54Q4ulWQffA8Y250iSj9", + "is_local": false, + "is_playable": true, + "name": "Rap Game", + "preview_url": "https://p.scdn.co/mp3-preview/e98d6a434d3f7bbf81f9dfe217107ed24aa1b655?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:6l54Q4ulWQffA8Y250iSj9" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 1 + }, + "type": "album", + "uri": "spotify:album:6iM46uMk7q6NSbJHMo9LUc" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5XQWXnMwsvuvCPMneXUbsy" + }, + "href": "https://api.spotify.com/v1/artists/5XQWXnMwsvuvCPMneXUbsy", + "id": "5XQWXnMwsvuvCPMneXUbsy", + "name": "Marcianeke", + "type": "artist", + "uri": "spotify:artist:5XQWXnMwsvuvCPMneXUbsy" + } + ], + "copyrights": [ + { + "text": "2022 Rimas Entertainment México S.A de C.V", + "type": "C" + }, + { + "text": "2022 Rimas Entertainment México S.A de C.V", + "type": "P" + } + ], + "external_ids": { + "upc": "718123944964" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/3ilMPT4QKXFkSVTDnElcPu" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/3ilMPT4QKXFkSVTDnElcPu", + "id": "3ilMPT4QKXFkSVTDnElcPu", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273337c84da8797fdf30bcd7444", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02337c84da8797fdf30bcd7444", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851337c84da8797fdf30bcd7444", + "width": 64 + } + ], + "is_playable": true, + "label": "Nabru Records, a division of Rimas Entertainment LLC", + "name": "Colores", + "popularity": 35, + "release_date": "2022-03-11", + "release_date_precision": "day", + "total_tracks": 1, + "tracks": { + "href": "https://api.spotify.com/v1/albums/3ilMPT4QKXFkSVTDnElcPu/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5XQWXnMwsvuvCPMneXUbsy" + }, + "href": "https://api.spotify.com/v1/artists/5XQWXnMwsvuvCPMneXUbsy", + "id": "5XQWXnMwsvuvCPMneXUbsy", + "name": "Marcianeke", + "type": "artist", + "uri": "spotify:artist:5XQWXnMwsvuvCPMneXUbsy" + } + ], + "disc_number": 1, + "duration_ms": 198555, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/4yfdIgI2G8B0m2xVGvoEMq" + }, + "href": "https://api.spotify.com/v1/tracks/4yfdIgI2G8B0m2xVGvoEMq", + "id": "4yfdIgI2G8B0m2xVGvoEMq", + "is_local": false, + "is_playable": true, + "name": "Colores", + "preview_url": "https://p.scdn.co/mp3-preview/33c5ba54885ecc368d03a767cd45f063c9c21e43?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:4yfdIgI2G8B0m2xVGvoEMq" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 1 + }, + "type": "album", + "uri": "spotify:album:3ilMPT4QKXFkSVTDnElcPu" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4TvtCcZsS94jDxtnTZh2qX" + }, + "href": "https://api.spotify.com/v1/artists/4TvtCcZsS94jDxtnTZh2qX", + "id": "4TvtCcZsS94jDxtnTZh2qX", + "name": "Matue", + "type": "artist", + "uri": "spotify:artist:4TvtCcZsS94jDxtnTZh2qX" + } + ], + "copyrights": [ + { + "text": "2023 Matue", + "type": "C" + }, + { + "text": "2023 Matue", + "type": "P" + } + ], + "external_ids": { + "upc": "5063245237063" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/1M62po5iKT61ReBq3SKPPd" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/1M62po5iKT61ReBq3SKPPd", + "id": "1M62po5iKT61ReBq3SKPPd", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b2735e546bd87050c8f14e83defb", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e025e546bd87050c8f14e83defb", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d000048515e546bd87050c8f14e83defb", + "width": 64 + } + ], + "is_playable": true, + "label": "Matue", + "name": "Filho Da Noite", + "popularity": 41, + "release_date": "2023-04-20", + "release_date_precision": "day", + "total_tracks": 1, + "tracks": { + "href": "https://api.spotify.com/v1/albums/1M62po5iKT61ReBq3SKPPd/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4TvtCcZsS94jDxtnTZh2qX" + }, + "href": "https://api.spotify.com/v1/artists/4TvtCcZsS94jDxtnTZh2qX", + "id": "4TvtCcZsS94jDxtnTZh2qX", + "name": "Matue", + "type": "artist", + "uri": "spotify:artist:4TvtCcZsS94jDxtnTZh2qX" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2N2mOdsnjUlWeLUf9tSSt8" + }, + "href": "https://api.spotify.com/v1/artists/2N2mOdsnjUlWeLUf9tSSt8", + "id": "2N2mOdsnjUlWeLUf9tSSt8", + "name": "MC Ryan Sp and Chefin", + "type": "artist", + "uri": "spotify:artist:2N2mOdsnjUlWeLUf9tSSt8" + } + ], + "disc_number": 1, + "duration_ms": 274116, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/3V2jmJ8JdaOrOzPZgKOPFw" + }, + "href": "https://api.spotify.com/v1/tracks/3V2jmJ8JdaOrOzPZgKOPFw", + "id": "3V2jmJ8JdaOrOzPZgKOPFw", + "is_local": false, + "is_playable": true, + "name": "Filho Da Noite", + "preview_url": "https://p.scdn.co/mp3-preview/b51f11114a88e38cee2cb6ed827762c35b756998?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:3V2jmJ8JdaOrOzPZgKOPFw" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 1 + }, + "type": "album", + "uri": "spotify:album:1M62po5iKT61ReBq3SKPPd" + }, + { + "album_type": "album", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1uvxq0pWC1f55Yg9XmgLnW" + }, + "href": "https://api.spotify.com/v1/artists/1uvxq0pWC1f55Yg9XmgLnW", + "id": "1uvxq0pWC1f55Yg9XmgLnW", + "name": "Yawar", + "type": "artist", + "uri": "spotify:artist:1uvxq0pWC1f55Yg9XmgLnW" + } + ], + "copyrights": [ + { + "text": "2003 Tres Máscaras Music Group S.A.C.", + "type": "C" + }, + { + "text": "2003 Tres Máscaras Music Group S.A.C.", + "type": "P" + } + ], + "external_ids": { + "upc": "015568092800" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/4qyO900qJRTiM3lPCeHg00" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/4qyO900qJRTiM3lPCeHg00", + "id": "4qyO900qJRTiM3lPCeHg00", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273762e467d0ba4aef305efc4cd", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02762e467d0ba4aef305efc4cd", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851762e467d0ba4aef305efc4cd", + "width": 64 + } + ], + "is_playable": true, + "label": "Tres Máscaras Music Group S.A.C.", + "name": "De Colores", + "popularity": 48, + "release_date": "2003-09-22", + "release_date_precision": "day", + "total_tracks": 14, + "tracks": { + "href": "https://api.spotify.com/v1/albums/4qyO900qJRTiM3lPCeHg00/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1uvxq0pWC1f55Yg9XmgLnW" + }, + "href": "https://api.spotify.com/v1/artists/1uvxq0pWC1f55Yg9XmgLnW", + "id": "1uvxq0pWC1f55Yg9XmgLnW", + "name": "Yawar", + "type": "artist", + "uri": "spotify:artist:1uvxq0pWC1f55Yg9XmgLnW" + } + ], + "disc_number": 1, + "duration_ms": 207613, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/4getsxFmpMMdRQHQHTx5am" + }, + "href": "https://api.spotify.com/v1/tracks/4getsxFmpMMdRQHQHTx5am", + "id": "4getsxFmpMMdRQHQHTx5am", + "is_local": false, + "is_playable": true, + "name": "Dudas", + "preview_url": "https://p.scdn.co/mp3-preview/222866b21686b634031a879c1b255ce5673b218f?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:4getsxFmpMMdRQHQHTx5am" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1uvxq0pWC1f55Yg9XmgLnW" + }, + "href": "https://api.spotify.com/v1/artists/1uvxq0pWC1f55Yg9XmgLnW", + "id": "1uvxq0pWC1f55Yg9XmgLnW", + "name": "Yawar", + "type": "artist", + "uri": "spotify:artist:1uvxq0pWC1f55Yg9XmgLnW" + } + ], + "disc_number": 1, + "duration_ms": 261426, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1OvnvTyvYOD1yxfqL026bI" + }, + "href": "https://api.spotify.com/v1/tracks/1OvnvTyvYOD1yxfqL026bI", + "id": "1OvnvTyvYOD1yxfqL026bI", + "is_local": false, + "is_playable": true, + "name": "Todo Terminó", + "preview_url": "https://p.scdn.co/mp3-preview/1c95ddc8f9be1435f34aacc2645b4ef1c7f3d98d?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 2, + "type": "track", + "uri": "spotify:track:1OvnvTyvYOD1yxfqL026bI" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1uvxq0pWC1f55Yg9XmgLnW" + }, + "href": "https://api.spotify.com/v1/artists/1uvxq0pWC1f55Yg9XmgLnW", + "id": "1uvxq0pWC1f55Yg9XmgLnW", + "name": "Yawar", + "type": "artist", + "uri": "spotify:artist:1uvxq0pWC1f55Yg9XmgLnW" + } + ], + "disc_number": 1, + "duration_ms": 209320, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/44Gu1WbWUXE1PYxan28E8B" + }, + "href": "https://api.spotify.com/v1/tracks/44Gu1WbWUXE1PYxan28E8B", + "id": "44Gu1WbWUXE1PYxan28E8B", + "is_local": false, + "is_playable": true, + "name": "A Dónde Fue", + "preview_url": "https://p.scdn.co/mp3-preview/0f22c24a347005097cf7a8d09912ecd0d5e96326?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 3, + "type": "track", + "uri": "spotify:track:44Gu1WbWUXE1PYxan28E8B" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1uvxq0pWC1f55Yg9XmgLnW" + }, + "href": "https://api.spotify.com/v1/artists/1uvxq0pWC1f55Yg9XmgLnW", + "id": "1uvxq0pWC1f55Yg9XmgLnW", + "name": "Yawar", + "type": "artist", + "uri": "spotify:artist:1uvxq0pWC1f55Yg9XmgLnW" + } + ], + "disc_number": 1, + "duration_ms": 248560, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0IqkrJbluFB8hyrVMbFEIr" + }, + "href": "https://api.spotify.com/v1/tracks/0IqkrJbluFB8hyrVMbFEIr", + "id": "0IqkrJbluFB8hyrVMbFEIr", + "is_local": false, + "is_playable": true, + "name": "Compañera", + "preview_url": "https://p.scdn.co/mp3-preview/f6ac5c7b0eb9d3403c50b0c837743c1031b063d0?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 4, + "type": "track", + "uri": "spotify:track:0IqkrJbluFB8hyrVMbFEIr" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1uvxq0pWC1f55Yg9XmgLnW" + }, + "href": "https://api.spotify.com/v1/artists/1uvxq0pWC1f55Yg9XmgLnW", + "id": "1uvxq0pWC1f55Yg9XmgLnW", + "name": "Yawar", + "type": "artist", + "uri": "spotify:artist:1uvxq0pWC1f55Yg9XmgLnW" + } + ], + "disc_number": 1, + "duration_ms": 265293, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/4KWmG7f8io8GV0w1W3UR9r" + }, + "href": "https://api.spotify.com/v1/tracks/4KWmG7f8io8GV0w1W3UR9r", + "id": "4KWmG7f8io8GV0w1W3UR9r", + "is_local": false, + "is_playable": true, + "name": "La Fiesta del Tayta", + "preview_url": "https://p.scdn.co/mp3-preview/af6f73ae076a31651a0cf868f6c78c5d72829110?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 5, + "type": "track", + "uri": "spotify:track:4KWmG7f8io8GV0w1W3UR9r" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1uvxq0pWC1f55Yg9XmgLnW" + }, + "href": "https://api.spotify.com/v1/artists/1uvxq0pWC1f55Yg9XmgLnW", + "id": "1uvxq0pWC1f55Yg9XmgLnW", + "name": "Yawar", + "type": "artist", + "uri": "spotify:artist:1uvxq0pWC1f55Yg9XmgLnW" + } + ], + "disc_number": 1, + "duration_ms": 307773, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/4KCbv97OWfscOms4qV8zIv" + }, + "href": "https://api.spotify.com/v1/tracks/4KCbv97OWfscOms4qV8zIv", + "id": "4KCbv97OWfscOms4qV8zIv", + "is_local": false, + "is_playable": true, + "name": "Ay, Amor", + "preview_url": "https://p.scdn.co/mp3-preview/ddeedf0b06ae28ee91b2d67d4edb1574ef170992?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 6, + "type": "track", + "uri": "spotify:track:4KCbv97OWfscOms4qV8zIv" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1uvxq0pWC1f55Yg9XmgLnW" + }, + "href": "https://api.spotify.com/v1/artists/1uvxq0pWC1f55Yg9XmgLnW", + "id": "1uvxq0pWC1f55Yg9XmgLnW", + "name": "Yawar", + "type": "artist", + "uri": "spotify:artist:1uvxq0pWC1f55Yg9XmgLnW" + } + ], + "disc_number": 1, + "duration_ms": 285466, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/4Jkqu2Oj1SgHg8YO7Cq2Ab" + }, + "href": "https://api.spotify.com/v1/tracks/4Jkqu2Oj1SgHg8YO7Cq2Ab", + "id": "4Jkqu2Oj1SgHg8YO7Cq2Ab", + "is_local": false, + "is_playable": true, + "name": "En Soledad", + "preview_url": "https://p.scdn.co/mp3-preview/b06d9e8c767ac6ed7f61d27f91e027d0391ca7e4?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 7, + "type": "track", + "uri": "spotify:track:4Jkqu2Oj1SgHg8YO7Cq2Ab" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1uvxq0pWC1f55Yg9XmgLnW" + }, + "href": "https://api.spotify.com/v1/artists/1uvxq0pWC1f55Yg9XmgLnW", + "id": "1uvxq0pWC1f55Yg9XmgLnW", + "name": "Yawar", + "type": "artist", + "uri": "spotify:artist:1uvxq0pWC1f55Yg9XmgLnW" + } + ], + "disc_number": 1, + "duration_ms": 254733, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2HkdxoctBhDs3XWeHmUUm4" + }, + "href": "https://api.spotify.com/v1/tracks/2HkdxoctBhDs3XWeHmUUm4", + "id": "2HkdxoctBhDs3XWeHmUUm4", + "is_local": false, + "is_playable": true, + "name": "Linda Warmisitay", + "preview_url": "https://p.scdn.co/mp3-preview/2b147f2de9571e72bd789f6b7063de69092bce04?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 8, + "type": "track", + "uri": "spotify:track:2HkdxoctBhDs3XWeHmUUm4" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1uvxq0pWC1f55Yg9XmgLnW" + }, + "href": "https://api.spotify.com/v1/artists/1uvxq0pWC1f55Yg9XmgLnW", + "id": "1uvxq0pWC1f55Yg9XmgLnW", + "name": "Yawar", + "type": "artist", + "uri": "spotify:artist:1uvxq0pWC1f55Yg9XmgLnW" + } + ], + "disc_number": 1, + "duration_ms": 301226, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/28SZgHKf77pSOuXTMTxfPV" + }, + "href": "https://api.spotify.com/v1/tracks/28SZgHKf77pSOuXTMTxfPV", + "id": "28SZgHKf77pSOuXTMTxfPV", + "is_local": false, + "is_playable": true, + "name": "Aisha", + "preview_url": "https://p.scdn.co/mp3-preview/26150e06abf44e777c0e6fee11844761f2950e66?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 9, + "type": "track", + "uri": "spotify:track:28SZgHKf77pSOuXTMTxfPV" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1uvxq0pWC1f55Yg9XmgLnW" + }, + "href": "https://api.spotify.com/v1/artists/1uvxq0pWC1f55Yg9XmgLnW", + "id": "1uvxq0pWC1f55Yg9XmgLnW", + "name": "Yawar", + "type": "artist", + "uri": "spotify:artist:1uvxq0pWC1f55Yg9XmgLnW" + } + ], + "disc_number": 1, + "duration_ms": 274693, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2xX7pntfZjLjsO2o8EwkIO" + }, + "href": "https://api.spotify.com/v1/tracks/2xX7pntfZjLjsO2o8EwkIO", + "id": "2xX7pntfZjLjsO2o8EwkIO", + "is_local": false, + "is_playable": true, + "name": "¿Dónde Están Nuestras Vidas?", + "preview_url": "https://p.scdn.co/mp3-preview/1902c6ed0115ebd31bb4866cb195b5c1f42c87e2?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 10, + "type": "track", + "uri": "spotify:track:2xX7pntfZjLjsO2o8EwkIO" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1uvxq0pWC1f55Yg9XmgLnW" + }, + "href": "https://api.spotify.com/v1/artists/1uvxq0pWC1f55Yg9XmgLnW", + "id": "1uvxq0pWC1f55Yg9XmgLnW", + "name": "Yawar", + "type": "artist", + "uri": "spotify:artist:1uvxq0pWC1f55Yg9XmgLnW" + } + ], + "disc_number": 1, + "duration_ms": 269653, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/66SnePbzX6SCd2qTk5DYxQ" + }, + "href": "https://api.spotify.com/v1/tracks/66SnePbzX6SCd2qTk5DYxQ", + "id": "66SnePbzX6SCd2qTk5DYxQ", + "is_local": false, + "is_playable": true, + "name": "El Serranito", + "preview_url": "https://p.scdn.co/mp3-preview/8eb522cc028dee36c859ec8775b407c22f660710?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 11, + "type": "track", + "uri": "spotify:track:66SnePbzX6SCd2qTk5DYxQ" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1uvxq0pWC1f55Yg9XmgLnW" + }, + "href": "https://api.spotify.com/v1/artists/1uvxq0pWC1f55Yg9XmgLnW", + "id": "1uvxq0pWC1f55Yg9XmgLnW", + "name": "Yawar", + "type": "artist", + "uri": "spotify:artist:1uvxq0pWC1f55Yg9XmgLnW" + } + ], + "disc_number": 1, + "duration_ms": 214146, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3Tf6sGp08j73g9mIxQJ7O5" + }, + "href": "https://api.spotify.com/v1/tracks/3Tf6sGp08j73g9mIxQJ7O5", + "id": "3Tf6sGp08j73g9mIxQJ7O5", + "is_local": false, + "is_playable": true, + "name": "Madre", + "preview_url": "https://p.scdn.co/mp3-preview/7f610391be60a5307e92f914982fb4cc7afc8830?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 12, + "type": "track", + "uri": "spotify:track:3Tf6sGp08j73g9mIxQJ7O5" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1uvxq0pWC1f55Yg9XmgLnW" + }, + "href": "https://api.spotify.com/v1/artists/1uvxq0pWC1f55Yg9XmgLnW", + "id": "1uvxq0pWC1f55Yg9XmgLnW", + "name": "Yawar", + "type": "artist", + "uri": "spotify:artist:1uvxq0pWC1f55Yg9XmgLnW" + } + ], + "disc_number": 1, + "duration_ms": 272093, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3huHqtaRBoAp0Lno5Etf53" + }, + "href": "https://api.spotify.com/v1/tracks/3huHqtaRBoAp0Lno5Etf53", + "id": "3huHqtaRBoAp0Lno5Etf53", + "is_local": false, + "is_playable": true, + "name": "¿Quién Entiende al Amor?", + "preview_url": "https://p.scdn.co/mp3-preview/3001726f020f89f504127e0afd40bb4381d32646?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 13, + "type": "track", + "uri": "spotify:track:3huHqtaRBoAp0Lno5Etf53" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1uvxq0pWC1f55Yg9XmgLnW" + }, + "href": "https://api.spotify.com/v1/artists/1uvxq0pWC1f55Yg9XmgLnW", + "id": "1uvxq0pWC1f55Yg9XmgLnW", + "name": "Yawar", + "type": "artist", + "uri": "spotify:artist:1uvxq0pWC1f55Yg9XmgLnW" + } + ], + "disc_number": 1, + "duration_ms": 257893, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/7nMvYV2DHRy2FhtXmNsAl0" + }, + "href": "https://api.spotify.com/v1/tracks/7nMvYV2DHRy2FhtXmNsAl0", + "id": "7nMvYV2DHRy2FhtXmNsAl0", + "is_local": false, + "is_playable": true, + "name": "No Quiero Más Esta Vida", + "preview_url": "https://p.scdn.co/mp3-preview/754c9f071e30e356ff0376a8ae778b4bed5c635e?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 14, + "type": "track", + "uri": "spotify:track:7nMvYV2DHRy2FhtXmNsAl0" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 14 + }, + "type": "album", + "uri": "spotify:album:4qyO900qJRTiM3lPCeHg00" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5CAruGjgds3QlF5ICtEnnc" + }, + "href": "https://api.spotify.com/v1/artists/5CAruGjgds3QlF5ICtEnnc", + "id": "5CAruGjgds3QlF5ICtEnnc", + "name": "Jairo Vera", + "type": "artist", + "uri": "spotify:artist:5CAruGjgds3QlF5ICtEnnc" + } + ], + "copyrights": [ + { + "text": "© 2023 AnthonySly. Distribuido en forma exclusiva por Warner Music Chile S.A.", + "type": "C" + }, + { + "text": "℗ 2023 AnthonySly. Distribuido en forma exclusiva por Warner Music Chile S.A.", + "type": "P" + } + ], + "external_ids": { + "upc": "5054197563720" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/1HseVDLAPrTW8EIULoYqMe" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/1HseVDLAPrTW8EIULoYqMe", + "id": "1HseVDLAPrTW8EIULoYqMe", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273e900cebcd33d012d9f5ac6e2", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02e900cebcd33d012d9f5ac6e2", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851e900cebcd33d012d9f5ac6e2", + "width": 64 + } + ], + "is_playable": true, + "label": "WM Chile", + "name": "Matemos las Ganas", + "popularity": 55, + "release_date": "2023-02-10", + "release_date_precision": "day", + "total_tracks": 1, + "tracks": { + "href": "https://api.spotify.com/v1/albums/1HseVDLAPrTW8EIULoYqMe/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5CAruGjgds3QlF5ICtEnnc" + }, + "href": "https://api.spotify.com/v1/artists/5CAruGjgds3QlF5ICtEnnc", + "id": "5CAruGjgds3QlF5ICtEnnc", + "name": "Jairo Vera", + "type": "artist", + "uri": "spotify:artist:5CAruGjgds3QlF5ICtEnnc" + } + ], + "disc_number": 1, + "duration_ms": 208333, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/2o51TovZKl061qALyAzGYo" + }, + "href": "https://api.spotify.com/v1/tracks/2o51TovZKl061qALyAzGYo", + "id": "2o51TovZKl061qALyAzGYo", + "is_local": false, + "is_playable": true, + "name": "Matemos las Ganas", + "preview_url": "https://p.scdn.co/mp3-preview/616856e39de10e62bcb422451958ffc99b06e5d6?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:2o51TovZKl061qALyAzGYo" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 1 + }, + "type": "album", + "uri": "spotify:album:1HseVDLAPrTW8EIULoYqMe" + }, + { + "album_type": "album", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1LEtM3AleYg1xabW6CRkpi" + }, + "href": "https://api.spotify.com/v1/artists/1LEtM3AleYg1xabW6CRkpi", + "id": "1LEtM3AleYg1xabW6CRkpi", + "name": "Đen", + "type": "artist", + "uri": "spotify:artist:1LEtM3AleYg1xabW6CRkpi" + } + ], + "copyrights": [ + { + "text": "2021 Đen", + "type": "C" + }, + { + "text": "2021 Đen", + "type": "P" + } + ], + "external_ids": { + "upc": "3616840182492" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/7qIYRB5Hx88CJaj1Lx8EVN" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/7qIYRB5Hx88CJaj1Lx8EVN", + "id": "7qIYRB5Hx88CJaj1Lx8EVN", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b2734888abe8ee4d110278a67538", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e024888abe8ee4d110278a67538", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d000048514888abe8ee4d110278a67538", + "width": 64 + } + ], + "is_playable": true, + "label": "Đen", + "name": "Show Của Đen", + "popularity": 47, + "release_date": "2021-09-30", + "release_date_precision": "day", + "total_tracks": 14, + "tracks": { + "href": "https://api.spotify.com/v1/albums/7qIYRB5Hx88CJaj1Lx8EVN/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1LEtM3AleYg1xabW6CRkpi" + }, + "href": "https://api.spotify.com/v1/artists/1LEtM3AleYg1xabW6CRkpi", + "id": "1LEtM3AleYg1xabW6CRkpi", + "name": "Đen", + "type": "artist", + "uri": "spotify:artist:1LEtM3AleYg1xabW6CRkpi" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/14RscV8jZp2WBjJMr3SNK9" + }, + "href": "https://api.spotify.com/v1/artists/14RscV8jZp2WBjJMr3SNK9", + "id": "14RscV8jZp2WBjJMr3SNK9", + "name": "Ngọc Linh", + "type": "artist", + "uri": "spotify:artist:14RscV8jZp2WBjJMr3SNK9" + } + ], + "disc_number": 1, + "duration_ms": 285059, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2H5XRciniz2nQ0jhaZJcd9" + }, + "href": "https://api.spotify.com/v1/tracks/2H5XRciniz2nQ0jhaZJcd9", + "id": "2H5XRciniz2nQ0jhaZJcd9", + "is_local": false, + "is_playable": true, + "name": "Mười Năm - Live At Show Của Đen", + "preview_url": "https://p.scdn.co/mp3-preview/fb119cd616dec75b374b9e37c360adff216c65cb?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:2H5XRciniz2nQ0jhaZJcd9" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1LEtM3AleYg1xabW6CRkpi" + }, + "href": "https://api.spotify.com/v1/artists/1LEtM3AleYg1xabW6CRkpi", + "id": "1LEtM3AleYg1xabW6CRkpi", + "name": "Đen", + "type": "artist", + "uri": "spotify:artist:1LEtM3AleYg1xabW6CRkpi" + } + ], + "disc_number": 1, + "duration_ms": 148672, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/4mejuAFbM3r6bWUHKxk5fU" + }, + "href": "https://api.spotify.com/v1/tracks/4mejuAFbM3r6bWUHKxk5fU", + "id": "4mejuAFbM3r6bWUHKxk5fU", + "is_local": false, + "is_playable": true, + "name": "Lộn Xộn 2 - Live At Show Của Đen", + "preview_url": "https://p.scdn.co/mp3-preview/fe8066593e0b9de13849d41160861d71aa6849ff?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 2, + "type": "track", + "uri": "spotify:track:4mejuAFbM3r6bWUHKxk5fU" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1LEtM3AleYg1xabW6CRkpi" + }, + "href": "https://api.spotify.com/v1/artists/1LEtM3AleYg1xabW6CRkpi", + "id": "1LEtM3AleYg1xabW6CRkpi", + "name": "Đen", + "type": "artist", + "uri": "spotify:artist:1LEtM3AleYg1xabW6CRkpi" + } + ], + "disc_number": 1, + "duration_ms": 199552, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/14Pfh8Z2JpjwjavMYGZw9M" + }, + "href": "https://api.spotify.com/v1/tracks/14Pfh8Z2JpjwjavMYGZw9M", + "id": "14Pfh8Z2JpjwjavMYGZw9M", + "is_local": false, + "is_playable": true, + "name": "Nhiều Năm Nữa - Live At Show Của Đen", + "preview_url": "https://p.scdn.co/mp3-preview/53c6e007110adda3bff59b5e6f94d690014f1932?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 3, + "type": "track", + "uri": "spotify:track:14Pfh8Z2JpjwjavMYGZw9M" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1LEtM3AleYg1xabW6CRkpi" + }, + "href": "https://api.spotify.com/v1/artists/1LEtM3AleYg1xabW6CRkpi", + "id": "1LEtM3AleYg1xabW6CRkpi", + "name": "Đen", + "type": "artist", + "uri": "spotify:artist:1LEtM3AleYg1xabW6CRkpi" + } + ], + "disc_number": 1, + "duration_ms": 198400, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0ehr6CI3E8cCBdqbWCyWEV" + }, + "href": "https://api.spotify.com/v1/tracks/0ehr6CI3E8cCBdqbWCyWEV", + "id": "0ehr6CI3E8cCBdqbWCyWEV", + "is_local": false, + "is_playable": true, + "name": "Trời Ơi Con Chưa Muốn Chết - Live At Show Của Đen", + "preview_url": "https://p.scdn.co/mp3-preview/8d952bb7de0a14b7d7809d20c074d4c7030ac636?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 4, + "type": "track", + "uri": "spotify:track:0ehr6CI3E8cCBdqbWCyWEV" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1LEtM3AleYg1xabW6CRkpi" + }, + "href": "https://api.spotify.com/v1/artists/1LEtM3AleYg1xabW6CRkpi", + "id": "1LEtM3AleYg1xabW6CRkpi", + "name": "Đen", + "type": "artist", + "uri": "spotify:artist:1LEtM3AleYg1xabW6CRkpi" + } + ], + "disc_number": 1, + "duration_ms": 275498, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1oDaI6OOKaVqEn6H8bgaRo" + }, + "href": "https://api.spotify.com/v1/tracks/1oDaI6OOKaVqEn6H8bgaRo", + "id": "1oDaI6OOKaVqEn6H8bgaRo", + "is_local": false, + "is_playable": true, + "name": "Đố em biết anh đang nghĩ gì - Live At Show Của Đen", + "preview_url": "https://p.scdn.co/mp3-preview/997eeae6d4e56b4f384e60e87838ba326d739166?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 5, + "type": "track", + "uri": "spotify:track:1oDaI6OOKaVqEn6H8bgaRo" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1LEtM3AleYg1xabW6CRkpi" + }, + "href": "https://api.spotify.com/v1/artists/1LEtM3AleYg1xabW6CRkpi", + "id": "1LEtM3AleYg1xabW6CRkpi", + "name": "Đen", + "type": "artist", + "uri": "spotify:artist:1LEtM3AleYg1xabW6CRkpi" + } + ], + "disc_number": 1, + "duration_ms": 233429, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/7HYT9fyOhJBpuev4OdicNK" + }, + "href": "https://api.spotify.com/v1/tracks/7HYT9fyOhJBpuev4OdicNK", + "id": "7HYT9fyOhJBpuev4OdicNK", + "is_local": false, + "is_playable": true, + "name": "Mơ - Live At Show Của Đen", + "preview_url": "https://p.scdn.co/mp3-preview/3d083efd3c1fb25d101384a9700b3702fd1bfadb?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 6, + "type": "track", + "uri": "spotify:track:7HYT9fyOhJBpuev4OdicNK" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1LEtM3AleYg1xabW6CRkpi" + }, + "href": "https://api.spotify.com/v1/artists/1LEtM3AleYg1xabW6CRkpi", + "id": "1LEtM3AleYg1xabW6CRkpi", + "name": "Đen", + "type": "artist", + "uri": "spotify:artist:1LEtM3AleYg1xabW6CRkpi" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/6p3fQJ4VuN0gfh6YGELGZT" + }, + "href": "https://api.spotify.com/v1/artists/6p3fQJ4VuN0gfh6YGELGZT", + "id": "6p3fQJ4VuN0gfh6YGELGZT", + "name": "Ngọt", + "type": "artist", + "uri": "spotify:artist:6p3fQJ4VuN0gfh6YGELGZT" + } + ], + "disc_number": 1, + "duration_ms": 272133, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2ncglJOFf6z2LVAV0KAvge" + }, + "href": "https://api.spotify.com/v1/tracks/2ncglJOFf6z2LVAV0KAvge", + "id": "2ncglJOFf6z2LVAV0KAvge", + "is_local": false, + "is_playable": true, + "name": "Cho Toi Lang Thang - Live At Show Của Đen", + "preview_url": "https://p.scdn.co/mp3-preview/82eec98e4807fc4661f4a17146f8f792ba4e681e?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 7, + "type": "track", + "uri": "spotify:track:2ncglJOFf6z2LVAV0KAvge" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1LEtM3AleYg1xabW6CRkpi" + }, + "href": "https://api.spotify.com/v1/artists/1LEtM3AleYg1xabW6CRkpi", + "id": "1LEtM3AleYg1xabW6CRkpi", + "name": "Đen", + "type": "artist", + "uri": "spotify:artist:1LEtM3AleYg1xabW6CRkpi" + } + ], + "disc_number": 1, + "duration_ms": 246250, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6S7unWwOypztbchdoKA5gP" + }, + "href": "https://api.spotify.com/v1/tracks/6S7unWwOypztbchdoKA5gP", + "id": "6S7unWwOypztbchdoKA5gP", + "is_local": false, + "is_playable": true, + "name": "Anh Đếch Cần Gì Nhiều Ngoài Em - Live At Show Của Đen", + "preview_url": "https://p.scdn.co/mp3-preview/e44a6c8d59959a8b242fb82f2305944a603bf9a5?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 8, + "type": "track", + "uri": "spotify:track:6S7unWwOypztbchdoKA5gP" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1LEtM3AleYg1xabW6CRkpi" + }, + "href": "https://api.spotify.com/v1/artists/1LEtM3AleYg1xabW6CRkpi", + "id": "1LEtM3AleYg1xabW6CRkpi", + "name": "Đen", + "type": "artist", + "uri": "spotify:artist:1LEtM3AleYg1xabW6CRkpi" + } + ], + "disc_number": 1, + "duration_ms": 236096, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3vrtrHN8QFUdGheMzPs8j3" + }, + "href": "https://api.spotify.com/v1/tracks/3vrtrHN8QFUdGheMzPs8j3", + "id": "3vrtrHN8QFUdGheMzPs8j3", + "is_local": false, + "is_playable": true, + "name": "Đi Theo Bóng Mặt Trời - Live At Show Của Đen", + "preview_url": "https://p.scdn.co/mp3-preview/8905625d668bda11e5264db6008f0e61897698d8?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 9, + "type": "track", + "uri": "spotify:track:3vrtrHN8QFUdGheMzPs8j3" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1LEtM3AleYg1xabW6CRkpi" + }, + "href": "https://api.spotify.com/v1/artists/1LEtM3AleYg1xabW6CRkpi", + "id": "1LEtM3AleYg1xabW6CRkpi", + "name": "Đen", + "type": "artist", + "uri": "spotify:artist:1LEtM3AleYg1xabW6CRkpi" + } + ], + "disc_number": 1, + "duration_ms": 294768, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6ztkb5MiGLM6TqodbVDGTE" + }, + "href": "https://api.spotify.com/v1/tracks/6ztkb5MiGLM6TqodbVDGTE", + "id": "6ztkb5MiGLM6TqodbVDGTE", + "is_local": false, + "is_playable": true, + "name": "Bài Này Chill Phết - Live At Show Của Đen", + "preview_url": "https://p.scdn.co/mp3-preview/11d7114878c8059a1549ef3b380636cdf9053ce2?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 10, + "type": "track", + "uri": "spotify:track:6ztkb5MiGLM6TqodbVDGTE" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1LEtM3AleYg1xabW6CRkpi" + }, + "href": "https://api.spotify.com/v1/artists/1LEtM3AleYg1xabW6CRkpi", + "id": "1LEtM3AleYg1xabW6CRkpi", + "name": "Đen", + "type": "artist", + "uri": "spotify:artist:1LEtM3AleYg1xabW6CRkpi" + } + ], + "disc_number": 1, + "duration_ms": 298197, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0ROEej67C7sB3bk6SnBiEE" + }, + "href": "https://api.spotify.com/v1/tracks/0ROEej67C7sB3bk6SnBiEE", + "id": "0ROEej67C7sB3bk6SnBiEE", + "is_local": false, + "is_playable": true, + "name": "hai triệu năm - Live At Show Của Đen", + "preview_url": "https://p.scdn.co/mp3-preview/b709d4d5ce96a2995b71ffe597fc104661c7fa5e?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 11, + "type": "track", + "uri": "spotify:track:0ROEej67C7sB3bk6SnBiEE" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1LEtM3AleYg1xabW6CRkpi" + }, + "href": "https://api.spotify.com/v1/artists/1LEtM3AleYg1xabW6CRkpi", + "id": "1LEtM3AleYg1xabW6CRkpi", + "name": "Đen", + "type": "artist", + "uri": "spotify:artist:1LEtM3AleYg1xabW6CRkpi" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0vTUa2hbNHke3omoGxuKFm" + }, + "href": "https://api.spotify.com/v1/artists/0vTUa2hbNHke3omoGxuKFm", + "id": "0vTUa2hbNHke3omoGxuKFm", + "name": "Linh Cáo", + "type": "artist", + "uri": "spotify:artist:0vTUa2hbNHke3omoGxuKFm" + } + ], + "disc_number": 1, + "duration_ms": 265822, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6fH70e3UxJFNmLApdijeGa" + }, + "href": "https://api.spotify.com/v1/tracks/6fH70e3UxJFNmLApdijeGa", + "id": "6fH70e3UxJFNmLApdijeGa", + "is_local": false, + "is_playable": true, + "name": "Đưa Nhau Đi Trốn - Live At Show Của Đen", + "preview_url": "https://p.scdn.co/mp3-preview/b9c0104f808e1f7e8cd4e112e145d6f7dbb2751c?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 12, + "type": "track", + "uri": "spotify:track:6fH70e3UxJFNmLApdijeGa" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1LEtM3AleYg1xabW6CRkpi" + }, + "href": "https://api.spotify.com/v1/artists/1LEtM3AleYg1xabW6CRkpi", + "id": "1LEtM3AleYg1xabW6CRkpi", + "name": "Đen", + "type": "artist", + "uri": "spotify:artist:1LEtM3AleYg1xabW6CRkpi" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0vTUa2hbNHke3omoGxuKFm" + }, + "href": "https://api.spotify.com/v1/artists/0vTUa2hbNHke3omoGxuKFm", + "id": "0vTUa2hbNHke3omoGxuKFm", + "name": "Linh Cáo", + "type": "artist", + "uri": "spotify:artist:0vTUa2hbNHke3omoGxuKFm" + } + ], + "disc_number": 1, + "duration_ms": 346627, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2mqEoZUVNajcSnNJPEBBfu" + }, + "href": "https://api.spotify.com/v1/tracks/2mqEoZUVNajcSnNJPEBBfu", + "id": "2mqEoZUVNajcSnNJPEBBfu", + "is_local": false, + "is_playable": true, + "name": "Ta Cứ Đi Cùng Nhau - Live At Show Của Đen", + "preview_url": "https://p.scdn.co/mp3-preview/efda3837a483e64a9cffe28b2fc70b0f9a0faac3?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 13, + "type": "track", + "uri": "spotify:track:2mqEoZUVNajcSnNJPEBBfu" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1LEtM3AleYg1xabW6CRkpi" + }, + "href": "https://api.spotify.com/v1/artists/1LEtM3AleYg1xabW6CRkpi", + "id": "1LEtM3AleYg1xabW6CRkpi", + "name": "Đen", + "type": "artist", + "uri": "spotify:artist:1LEtM3AleYg1xabW6CRkpi" + } + ], + "disc_number": 1, + "duration_ms": 274833, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1Vawvhwe9GUxsBgGwSWeEk" + }, + "href": "https://api.spotify.com/v1/tracks/1Vawvhwe9GUxsBgGwSWeEk", + "id": "1Vawvhwe9GUxsBgGwSWeEk", + "is_local": false, + "is_playable": true, + "name": "Cảm Ơn - Live At Show Của Đen", + "preview_url": "https://p.scdn.co/mp3-preview/498d3d23484255bc5df7778c76a052630a90d905?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 14, + "type": "track", + "uri": "spotify:track:1Vawvhwe9GUxsBgGwSWeEk" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 14 + }, + "type": "album", + "uri": "spotify:album:7qIYRB5Hx88CJaj1Lx8EVN" + }, + { + "album_type": "album", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0V2DfUrZvBuUReS1LFo5ZI" + }, + "href": "https://api.spotify.com/v1/artists/0V2DfUrZvBuUReS1LFo5ZI", + "id": "0V2DfUrZvBuUReS1LFo5ZI", + "name": "Ngọt", + "type": "artist", + "uri": "spotify:artist:0V2DfUrZvBuUReS1LFo5ZI" + } + ], + "copyrights": [ + { + "text": "2022 Ngọt", + "type": "C" + }, + { + "text": "2022 Ngọt", + "type": "P" + } + ], + "external_ids": { + "upc": "3617053674019" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/1ZnJrvDY8ih3ppPWR2Tc2a" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/1ZnJrvDY8ih3ppPWR2Tc2a", + "id": "1ZnJrvDY8ih3ppPWR2Tc2a", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b2730771b564830e3dedb2d31358", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e020771b564830e3dedb2d31358", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d000048510771b564830e3dedb2d31358", + "width": 64 + } + ], + "is_playable": true, + "label": "Ngọt", + "name": "Gieo", + "popularity": 55, + "release_date": "2022-11-25", + "release_date_precision": "day", + "total_tracks": 11, + "tracks": { + "href": "https://api.spotify.com/v1/albums/1ZnJrvDY8ih3ppPWR2Tc2a/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0V2DfUrZvBuUReS1LFo5ZI" + }, + "href": "https://api.spotify.com/v1/artists/0V2DfUrZvBuUReS1LFo5ZI", + "id": "0V2DfUrZvBuUReS1LFo5ZI", + "name": "Ngọt", + "type": "artist", + "uri": "spotify:artist:0V2DfUrZvBuUReS1LFo5ZI" + } + ], + "disc_number": 1, + "duration_ms": 268845, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1UDAnignfiklanSQ6MfPUE" + }, + "href": "https://api.spotify.com/v1/tracks/1UDAnignfiklanSQ6MfPUE", + "id": "1UDAnignfiklanSQ6MfPUE", + "is_local": false, + "is_playable": true, + "name": "Bạn thỏ tivi nhỏ", + "preview_url": "https://p.scdn.co/mp3-preview/de345ae4087be8f4a0d0c5001c63adb0b0ad93e8?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:1UDAnignfiklanSQ6MfPUE" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0V2DfUrZvBuUReS1LFo5ZI" + }, + "href": "https://api.spotify.com/v1/artists/0V2DfUrZvBuUReS1LFo5ZI", + "id": "0V2DfUrZvBuUReS1LFo5ZI", + "name": "Ngọt", + "type": "artist", + "uri": "spotify:artist:0V2DfUrZvBuUReS1LFo5ZI" + } + ], + "disc_number": 1, + "duration_ms": 177050, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1gWYdMleZCQUUPSDL8uumT" + }, + "href": "https://api.spotify.com/v1/tracks/1gWYdMleZCQUUPSDL8uumT", + "id": "1gWYdMleZCQUUPSDL8uumT", + "is_local": false, + "is_playable": true, + "name": "Mấy Khi", + "preview_url": "https://p.scdn.co/mp3-preview/c61773078e7ed925c64d1a4bc555589a649e7827?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 2, + "type": "track", + "uri": "spotify:track:1gWYdMleZCQUUPSDL8uumT" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0V2DfUrZvBuUReS1LFo5ZI" + }, + "href": "https://api.spotify.com/v1/artists/0V2DfUrZvBuUReS1LFo5ZI", + "id": "0V2DfUrZvBuUReS1LFo5ZI", + "name": "Ngọt", + "type": "artist", + "uri": "spotify:artist:0V2DfUrZvBuUReS1LFo5ZI" + } + ], + "disc_number": 1, + "duration_ms": 165868, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2dXH1lY55KCIvvrA6tVG3A" + }, + "href": "https://api.spotify.com/v1/tracks/2dXH1lY55KCIvvrA6tVG3A", + "id": "2dXH1lY55KCIvvrA6tVG3A", + "is_local": false, + "is_playable": true, + "name": "Em Trang Trí", + "preview_url": "https://p.scdn.co/mp3-preview/49e7f84b8df9d664e0445db0e92207bd7165b296?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 3, + "type": "track", + "uri": "spotify:track:2dXH1lY55KCIvvrA6tVG3A" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0V2DfUrZvBuUReS1LFo5ZI" + }, + "href": "https://api.spotify.com/v1/artists/0V2DfUrZvBuUReS1LFo5ZI", + "id": "0V2DfUrZvBuUReS1LFo5ZI", + "name": "Ngọt", + "type": "artist", + "uri": "spotify:artist:0V2DfUrZvBuUReS1LFo5ZI" + } + ], + "disc_number": 1, + "duration_ms": 213667, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0uRpE3YtszcI37nUSBusmq" + }, + "href": "https://api.spotify.com/v1/tracks/0uRpE3YtszcI37nUSBusmq", + "id": "0uRpE3YtszcI37nUSBusmq", + "is_local": false, + "is_playable": true, + "name": "Điểm Đến Cuối Cùng", + "preview_url": "https://p.scdn.co/mp3-preview/f79d26ebd3878e74afbcc2c94bcd999814f29714?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 4, + "type": "track", + "uri": "spotify:track:0uRpE3YtszcI37nUSBusmq" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0V2DfUrZvBuUReS1LFo5ZI" + }, + "href": "https://api.spotify.com/v1/artists/0V2DfUrZvBuUReS1LFo5ZI", + "id": "0V2DfUrZvBuUReS1LFo5ZI", + "name": "Ngọt", + "type": "artist", + "uri": "spotify:artist:0V2DfUrZvBuUReS1LFo5ZI" + } + ], + "disc_number": 1, + "duration_ms": 198222, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0ON38MgDpAMcRC9ULx7NOf" + }, + "href": "https://api.spotify.com/v1/tracks/0ON38MgDpAMcRC9ULx7NOf", + "id": "0ON38MgDpAMcRC9ULx7NOf", + "is_local": false, + "is_playable": true, + "name": "Em Trong Đầu", + "preview_url": "https://p.scdn.co/mp3-preview/a8a73a74c05f1aba25ac6b5207352cba475eceaa?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 5, + "type": "track", + "uri": "spotify:track:0ON38MgDpAMcRC9ULx7NOf" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0V2DfUrZvBuUReS1LFo5ZI" + }, + "href": "https://api.spotify.com/v1/artists/0V2DfUrZvBuUReS1LFo5ZI", + "id": "0V2DfUrZvBuUReS1LFo5ZI", + "name": "Ngọt", + "type": "artist", + "uri": "spotify:artist:0V2DfUrZvBuUReS1LFo5ZI" + } + ], + "disc_number": 1, + "duration_ms": 100202, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2pWZBXOWnS6XkoRPjbpzJC" + }, + "href": "https://api.spotify.com/v1/tracks/2pWZBXOWnS6XkoRPjbpzJC", + "id": "2pWZBXOWnS6XkoRPjbpzJC", + "is_local": false, + "is_playable": true, + "name": "Chào Buổi Sáng", + "preview_url": "https://p.scdn.co/mp3-preview/cd79042cc331db57cc5fd2fae4301f4a88dace90?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 6, + "type": "track", + "uri": "spotify:track:2pWZBXOWnS6XkoRPjbpzJC" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0V2DfUrZvBuUReS1LFo5ZI" + }, + "href": "https://api.spotify.com/v1/artists/0V2DfUrZvBuUReS1LFo5ZI", + "id": "0V2DfUrZvBuUReS1LFo5ZI", + "name": "Ngọt", + "type": "artist", + "uri": "spotify:artist:0V2DfUrZvBuUReS1LFo5ZI" + } + ], + "disc_number": 1, + "duration_ms": 232204, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/4r7hIDwLsasMfj6nk2Wrib" + }, + "href": "https://api.spotify.com/v1/tracks/4r7hIDwLsasMfj6nk2Wrib", + "id": "4r7hIDwLsasMfj6nk2Wrib", + "is_local": false, + "is_playable": true, + "name": "Thấy Chưa", + "preview_url": "https://p.scdn.co/mp3-preview/94284ffbafdda0dcaa5f18a5dd40e8b4bd593c0f?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 7, + "type": "track", + "uri": "spotify:track:4r7hIDwLsasMfj6nk2Wrib" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0V2DfUrZvBuUReS1LFo5ZI" + }, + "href": "https://api.spotify.com/v1/artists/0V2DfUrZvBuUReS1LFo5ZI", + "id": "0V2DfUrZvBuUReS1LFo5ZI", + "name": "Ngọt", + "type": "artist", + "uri": "spotify:artist:0V2DfUrZvBuUReS1LFo5ZI" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/7fMznGrNJs6H2kZbiqDPgE" + }, + "href": "https://api.spotify.com/v1/artists/7fMznGrNJs6H2kZbiqDPgE", + "id": "7fMznGrNJs6H2kZbiqDPgE", + "name": "Mạc Mai Sương", + "type": "artist", + "uri": "spotify:artist:7fMznGrNJs6H2kZbiqDPgE" + } + ], + "disc_number": 1, + "duration_ms": 202166, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6Wi18yv3aoO0ZF4uulguof" + }, + "href": "https://api.spotify.com/v1/tracks/6Wi18yv3aoO0ZF4uulguof", + "id": "6Wi18yv3aoO0ZF4uulguof", + "is_local": false, + "is_playable": true, + "name": "Đá tan", + "preview_url": "https://p.scdn.co/mp3-preview/6fae0ff57b8036860166b5476e98dfb72c616c91?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 8, + "type": "track", + "uri": "spotify:track:6Wi18yv3aoO0ZF4uulguof" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0V2DfUrZvBuUReS1LFo5ZI" + }, + "href": "https://api.spotify.com/v1/artists/0V2DfUrZvBuUReS1LFo5ZI", + "id": "0V2DfUrZvBuUReS1LFo5ZI", + "name": "Ngọt", + "type": "artist", + "uri": "spotify:artist:0V2DfUrZvBuUReS1LFo5ZI" + } + ], + "disc_number": 1, + "duration_ms": 228084, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/4av2EVm9R6KhtXjxKUGTW5" + }, + "href": "https://api.spotify.com/v1/tracks/4av2EVm9R6KhtXjxKUGTW5", + "id": "4av2EVm9R6KhtXjxKUGTW5", + "is_local": false, + "is_playable": true, + "name": "Đêm Hôm Qua", + "preview_url": "https://p.scdn.co/mp3-preview/3fac69b910b87b4fdb98607afae979d965a6bfdb?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 9, + "type": "track", + "uri": "spotify:track:4av2EVm9R6KhtXjxKUGTW5" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0V2DfUrZvBuUReS1LFo5ZI" + }, + "href": "https://api.spotify.com/v1/artists/0V2DfUrZvBuUReS1LFo5ZI", + "id": "0V2DfUrZvBuUReS1LFo5ZI", + "name": "Ngọt", + "type": "artist", + "uri": "spotify:artist:0V2DfUrZvBuUReS1LFo5ZI" + } + ], + "disc_number": 1, + "duration_ms": 207516, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/06mzDTYkBVBfWlzinhom9I" + }, + "href": "https://api.spotify.com/v1/tracks/06mzDTYkBVBfWlzinhom9I", + "id": "06mzDTYkBVBfWlzinhom9I", + "is_local": false, + "is_playable": true, + "name": "Gieo", + "preview_url": "https://p.scdn.co/mp3-preview/091a408c01f333ab94d25c4307fb09bb9038b342?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 10, + "type": "track", + "uri": "spotify:track:06mzDTYkBVBfWlzinhom9I" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0V2DfUrZvBuUReS1LFo5ZI" + }, + "href": "https://api.spotify.com/v1/artists/0V2DfUrZvBuUReS1LFo5ZI", + "id": "0V2DfUrZvBuUReS1LFo5ZI", + "name": "Ngọt", + "type": "artist", + "uri": "spotify:artist:0V2DfUrZvBuUReS1LFo5ZI" + } + ], + "disc_number": 1, + "duration_ms": 271923, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1eXc2ZMStMsQ5cuUrFCnlO" + }, + "href": "https://api.spotify.com/v1/tracks/1eXc2ZMStMsQ5cuUrFCnlO", + "id": "1eXc2ZMStMsQ5cuUrFCnlO", + "is_local": false, + "is_playable": true, + "name": "Mất Tích", + "preview_url": "https://p.scdn.co/mp3-preview/541ed852139c6883b22c648de6129c11eb1eea9a?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 11, + "type": "track", + "uri": "spotify:track:1eXc2ZMStMsQ5cuUrFCnlO" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 11 + }, + "type": "album", + "uri": "spotify:album:1ZnJrvDY8ih3ppPWR2Tc2a" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/6zUWZmyi5MLOEynQ5wCI5f" + }, + "href": "https://api.spotify.com/v1/artists/6zUWZmyi5MLOEynQ5wCI5f", + "id": "6zUWZmyi5MLOEynQ5wCI5f", + "name": "Da LAB", + "type": "artist", + "uri": "spotify:artist:6zUWZmyi5MLOEynQ5wCI5f" + } + ], + "copyrights": [ + { + "text": "2019 LOOPS Music", + "type": "C" + }, + { + "text": "2019 LOOPS Music", + "type": "P" + } + ], + "external_ids": { + "upc": "3617051007444" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/3bUGXDqhdLNsxQrETRlTF1" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/3bUGXDqhdLNsxQrETRlTF1", + "id": "3bUGXDqhdLNsxQrETRlTF1", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273b374423d258fe4f7eb4888c3", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02b374423d258fe4f7eb4888c3", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851b374423d258fe4f7eb4888c3", + "width": 64 + } + ], + "is_playable": true, + "label": "LOOPS Music", + "name": "Nước Mắt Em Lau Bằng Tình Yêu Mới", + "popularity": 50, + "release_date": "2019-09-12", + "release_date_precision": "day", + "total_tracks": 1, + "tracks": { + "href": "https://api.spotify.com/v1/albums/3bUGXDqhdLNsxQrETRlTF1/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/6zUWZmyi5MLOEynQ5wCI5f" + }, + "href": "https://api.spotify.com/v1/artists/6zUWZmyi5MLOEynQ5wCI5f", + "id": "6zUWZmyi5MLOEynQ5wCI5f", + "name": "Da LAB", + "type": "artist", + "uri": "spotify:artist:6zUWZmyi5MLOEynQ5wCI5f" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4YkqEuVf1Jf2x2XDqJ2CvC" + }, + "href": "https://api.spotify.com/v1/artists/4YkqEuVf1Jf2x2XDqJ2CvC", + "id": "4YkqEuVf1Jf2x2XDqJ2CvC", + "name": "Tóc Tiên", + "type": "artist", + "uri": "spotify:artist:4YkqEuVf1Jf2x2XDqJ2CvC" + } + ], + "disc_number": 1, + "duration_ms": 285741, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/40fjFtLBN98eDzOS4NfXs5" + }, + "href": "https://api.spotify.com/v1/tracks/40fjFtLBN98eDzOS4NfXs5", + "id": "40fjFtLBN98eDzOS4NfXs5", + "is_local": false, + "is_playable": true, + "name": "Nước Mắt Em Lau Bằng Tình Yêu Mới", + "preview_url": "https://p.scdn.co/mp3-preview/753c599359deef5c764c6fbbc1be6a2b09a8bec9?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:40fjFtLBN98eDzOS4NfXs5" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 1 + }, + "type": "album", + "uri": "spotify:album:3bUGXDqhdLNsxQrETRlTF1" + }, + { + "album_type": "album", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0r63ReVRjxrS4ATbLrdcrL" + }, + "href": "https://api.spotify.com/v1/artists/0r63ReVRjxrS4ATbLrdcrL", + "id": "0r63ReVRjxrS4ATbLrdcrL", + "name": "Hoàng Thùy Linh", + "type": "artist", + "uri": "spotify:artist:0r63ReVRjxrS4ATbLrdcrL" + } + ], + "copyrights": [ + { + "text": "(P) 2022 Hoang Thuy Linh exclusively distributed by Sony Music Entertainment Hong Kong Limited", + "type": "P" + } + ], + "external_ids": { + "upc": "196589364418" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/38DiN8raykLZKEr5T6v5hM" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/38DiN8raykLZKEr5T6v5hM", + "id": "38DiN8raykLZKEr5T6v5hM", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273be0ac2aa3ed0047463210db1", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02be0ac2aa3ed0047463210db1", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851be0ac2aa3ed0047463210db1", + "width": 64 + } + ], + "is_playable": true, + "label": "Sony Music Entertainment", + "name": "LINK", + "popularity": 59, + "release_date": "2022-08-11", + "release_date_precision": "day", + "total_tracks": 9, + "tracks": { + "href": "https://api.spotify.com/v1/albums/38DiN8raykLZKEr5T6v5hM/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0r63ReVRjxrS4ATbLrdcrL" + }, + "href": "https://api.spotify.com/v1/artists/0r63ReVRjxrS4ATbLrdcrL", + "id": "0r63ReVRjxrS4ATbLrdcrL", + "name": "Hoàng Thùy Linh", + "type": "artist", + "uri": "spotify:artist:0r63ReVRjxrS4ATbLrdcrL" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1LEtM3AleYg1xabW6CRkpi" + }, + "href": "https://api.spotify.com/v1/artists/1LEtM3AleYg1xabW6CRkpi", + "id": "1LEtM3AleYg1xabW6CRkpi", + "name": "Đen", + "type": "artist", + "uri": "spotify:artist:1LEtM3AleYg1xabW6CRkpi" + } + ], + "disc_number": 1, + "duration_ms": 198947, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6SjnTRDyTM162pPOAM0O8M" + }, + "href": "https://api.spotify.com/v1/tracks/6SjnTRDyTM162pPOAM0O8M", + "id": "6SjnTRDyTM162pPOAM0O8M", + "is_local": false, + "is_playable": true, + "name": "Gieo Quẻ (feat. Đen)", + "preview_url": "https://p.scdn.co/mp3-preview/cf7611176ec98f24740b8403fadc2770d4916de3?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:6SjnTRDyTM162pPOAM0O8M" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0r63ReVRjxrS4ATbLrdcrL" + }, + "href": "https://api.spotify.com/v1/artists/0r63ReVRjxrS4ATbLrdcrL", + "id": "0r63ReVRjxrS4ATbLrdcrL", + "name": "Hoàng Thùy Linh", + "type": "artist", + "uri": "spotify:artist:0r63ReVRjxrS4ATbLrdcrL" + } + ], + "disc_number": 1, + "duration_ms": 185002, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/307iMiCYAKX6sUG7P4UKWt" + }, + "href": "https://api.spotify.com/v1/tracks/307iMiCYAKX6sUG7P4UKWt", + "id": "307iMiCYAKX6sUG7P4UKWt", + "is_local": false, + "is_playable": true, + "name": "See Tình", + "preview_url": "https://p.scdn.co/mp3-preview/bfa3c2c9f05e726d80058995b6419a7ec527f764?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 2, + "type": "track", + "uri": "spotify:track:307iMiCYAKX6sUG7P4UKWt" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0r63ReVRjxrS4ATbLrdcrL" + }, + "href": "https://api.spotify.com/v1/artists/0r63ReVRjxrS4ATbLrdcrL", + "id": "0r63ReVRjxrS4ATbLrdcrL", + "name": "Hoàng Thùy Linh", + "type": "artist", + "uri": "spotify:artist:0r63ReVRjxrS4ATbLrdcrL" + } + ], + "disc_number": 1, + "duration_ms": 173000, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0glPN37HvVqCUh1qCWBKo7" + }, + "href": "https://api.spotify.com/v1/tracks/0glPN37HvVqCUh1qCWBKo7", + "id": "0glPN37HvVqCUh1qCWBKo7", + "is_local": false, + "is_playable": true, + "name": "Lúc Thấy Lúc Không", + "preview_url": "https://p.scdn.co/mp3-preview/fa0c6dff8d426693de9a990eb76aeeceef3bc722?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 3, + "type": "track", + "uri": "spotify:track:0glPN37HvVqCUh1qCWBKo7" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0r63ReVRjxrS4ATbLrdcrL" + }, + "href": "https://api.spotify.com/v1/artists/0r63ReVRjxrS4ATbLrdcrL", + "id": "0r63ReVRjxrS4ATbLrdcrL", + "name": "Hoàng Thùy Linh", + "type": "artist", + "uri": "spotify:artist:0r63ReVRjxrS4ATbLrdcrL" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5M3ffmRiOX9Q8Y4jNeR5wu" + }, + "href": "https://api.spotify.com/v1/artists/5M3ffmRiOX9Q8Y4jNeR5wu", + "id": "5M3ffmRiOX9Q8Y4jNeR5wu", + "name": "Wren Evans", + "type": "artist", + "uri": "spotify:artist:5M3ffmRiOX9Q8Y4jNeR5wu" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/34nom4Ft3keMWBZPAUB3EI" + }, + "href": "https://api.spotify.com/v1/artists/34nom4Ft3keMWBZPAUB3EI", + "id": "34nom4Ft3keMWBZPAUB3EI", + "name": "Mew Amazing", + "type": "artist", + "uri": "spotify:artist:34nom4Ft3keMWBZPAUB3EI" + } + ], + "disc_number": 1, + "duration_ms": 204000, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/54EzTMmlLYab5d9psfwmxZ" + }, + "href": "https://api.spotify.com/v1/tracks/54EzTMmlLYab5d9psfwmxZ", + "id": "54EzTMmlLYab5d9psfwmxZ", + "is_local": false, + "is_playable": true, + "name": "Bắt Vía (feat. Wren Evans & Mew Amazing)", + "preview_url": "https://p.scdn.co/mp3-preview/3e1159a5b4447d470a383dbefb7aaf9093a6a95b?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 4, + "type": "track", + "uri": "spotify:track:54EzTMmlLYab5d9psfwmxZ" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0r63ReVRjxrS4ATbLrdcrL" + }, + "href": "https://api.spotify.com/v1/artists/0r63ReVRjxrS4ATbLrdcrL", + "id": "0r63ReVRjxrS4ATbLrdcrL", + "name": "Hoàng Thùy Linh", + "type": "artist", + "uri": "spotify:artist:0r63ReVRjxrS4ATbLrdcrL" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2q8305j8iKRCQr7Tn6woin" + }, + "href": "https://api.spotify.com/v1/artists/2q8305j8iKRCQr7Tn6woin", + "id": "2q8305j8iKRCQr7Tn6woin", + "name": "Thanh Bui", + "type": "artist", + "uri": "spotify:artist:2q8305j8iKRCQr7Tn6woin" + } + ], + "disc_number": 1, + "duration_ms": 240500, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2AA4UcXp2WRvsU9cyHT6Vy" + }, + "href": "https://api.spotify.com/v1/tracks/2AA4UcXp2WRvsU9cyHT6Vy", + "id": "2AA4UcXp2WRvsU9cyHT6Vy", + "is_local": false, + "is_playable": true, + "name": "không một bài hát nào có thể diễn tả cảm xúc của em lúc này. (feat. Thanh Bui)", + "preview_url": "https://p.scdn.co/mp3-preview/06700776ae9d80df6e334912b330d10d21a4cc68?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 5, + "type": "track", + "uri": "spotify:track:2AA4UcXp2WRvsU9cyHT6Vy" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0r63ReVRjxrS4ATbLrdcrL" + }, + "href": "https://api.spotify.com/v1/artists/0r63ReVRjxrS4ATbLrdcrL", + "id": "0r63ReVRjxrS4ATbLrdcrL", + "name": "Hoàng Thùy Linh", + "type": "artist", + "uri": "spotify:artist:0r63ReVRjxrS4ATbLrdcrL" + } + ], + "disc_number": 1, + "duration_ms": 172000, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/4X2iEvLVDm1Acd8Xmxw1ZC" + }, + "href": "https://api.spotify.com/v1/tracks/4X2iEvLVDm1Acd8Xmxw1ZC", + "id": "4X2iEvLVDm1Acd8Xmxw1ZC", + "is_local": false, + "is_playable": true, + "name": "Bo Xì Bo", + "preview_url": "https://p.scdn.co/mp3-preview/9526fe08330e81883021174d5de9470bd8e5e83e?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 6, + "type": "track", + "uri": "spotify:track:4X2iEvLVDm1Acd8Xmxw1ZC" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0r63ReVRjxrS4ATbLrdcrL" + }, + "href": "https://api.spotify.com/v1/artists/0r63ReVRjxrS4ATbLrdcrL", + "id": "0r63ReVRjxrS4ATbLrdcrL", + "name": "Hoàng Thùy Linh", + "type": "artist", + "uri": "spotify:artist:0r63ReVRjxrS4ATbLrdcrL" + } + ], + "disc_number": 1, + "duration_ms": 195008, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2Zos792uWaDCqqnmPaBH1x" + }, + "href": "https://api.spotify.com/v1/tracks/2Zos792uWaDCqqnmPaBH1x", + "id": "2Zos792uWaDCqqnmPaBH1x", + "is_local": false, + "is_playable": true, + "name": "Trưởng Nữ Chạy Trốn", + "preview_url": "https://p.scdn.co/mp3-preview/c00f2fadb3777b8a71224a5b1fdebd79822124cd?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 7, + "type": "track", + "uri": "spotify:track:2Zos792uWaDCqqnmPaBH1x" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0r63ReVRjxrS4ATbLrdcrL" + }, + "href": "https://api.spotify.com/v1/artists/0r63ReVRjxrS4ATbLrdcrL", + "id": "0r63ReVRjxrS4ATbLrdcrL", + "name": "Hoàng Thùy Linh", + "type": "artist", + "uri": "spotify:artist:0r63ReVRjxrS4ATbLrdcrL" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5kG9gxVkkdrskVLhfblCjT" + }, + "href": "https://api.spotify.com/v1/artists/5kG9gxVkkdrskVLhfblCjT", + "id": "5kG9gxVkkdrskVLhfblCjT", + "name": "Thanh Lam", + "type": "artist", + "uri": "spotify:artist:5kG9gxVkkdrskVLhfblCjT" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4rBvN6UImNzcY5abMKdAuw" + }, + "href": "https://api.spotify.com/v1/artists/4rBvN6UImNzcY5abMKdAuw", + "id": "4rBvN6UImNzcY5abMKdAuw", + "name": "Tùng Dương", + "type": "artist", + "uri": "spotify:artist:4rBvN6UImNzcY5abMKdAuw" + } + ], + "disc_number": 1, + "duration_ms": 268235, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/7rIPVGTU46ILYVrrblSu4P" + }, + "href": "https://api.spotify.com/v1/tracks/7rIPVGTU46ILYVrrblSu4P", + "id": "7rIPVGTU46ILYVrrblSu4P", + "is_local": false, + "is_playable": true, + "name": "Đánh Đố (feat. Thanh Lam & Tùng Dương)", + "preview_url": "https://p.scdn.co/mp3-preview/7569be7510282a8ef90e0e58b424b7a0e9136077?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 8, + "type": "track", + "uri": "spotify:track:7rIPVGTU46ILYVrrblSu4P" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0r63ReVRjxrS4ATbLrdcrL" + }, + "href": "https://api.spotify.com/v1/artists/0r63ReVRjxrS4ATbLrdcrL", + "id": "0r63ReVRjxrS4ATbLrdcrL", + "name": "Hoàng Thùy Linh", + "type": "artist", + "uri": "spotify:artist:0r63ReVRjxrS4ATbLrdcrL" + } + ], + "disc_number": 1, + "duration_ms": 195750, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2lGGlexu72TnPQPUHd8NWt" + }, + "href": "https://api.spotify.com/v1/tracks/2lGGlexu72TnPQPUHd8NWt", + "id": "2lGGlexu72TnPQPUHd8NWt", + "is_local": false, + "is_playable": true, + "name": "Hạ Phỏm", + "preview_url": "https://p.scdn.co/mp3-preview/c99e2afef64d5b39c8d8be81d2e4a11ed611edf2?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 9, + "type": "track", + "uri": "spotify:track:2lGGlexu72TnPQPUHd8NWt" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 9 + }, + "type": "album", + "uri": "spotify:album:38DiN8raykLZKEr5T6v5hM" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2Gvp79Cmni6PX13CAlSGex" + }, + "href": "https://api.spotify.com/v1/artists/2Gvp79Cmni6PX13CAlSGex", + "id": "2Gvp79Cmni6PX13CAlSGex", + "name": "Bùi Anh Tuấn", + "type": "artist", + "uri": "spotify:artist:2Gvp79Cmni6PX13CAlSGex" + } + ], + "copyrights": [ + { + "text": "2016 Bùi Anh Tuấn", + "type": "C" + }, + { + "text": "2016 Bùi Anh Tuấn", + "type": "P" + } + ], + "external_ids": { + "upc": "3616556841645" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/52oZQp5Au2YhGNGkhVqh1Q" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/52oZQp5Au2YhGNGkhVqh1Q", + "id": "52oZQp5Au2YhGNGkhVqh1Q", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273aad131a1d8c0a9fd12669392", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02aad131a1d8c0a9fd12669392", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851aad131a1d8c0a9fd12669392", + "width": 64 + } + ], + "is_playable": true, + "label": "Bui Anh Tuan", + "name": "Album Collection 2: Mùa Đông Tình Yêu", + "popularity": 23, + "release_date": "2016-12-05", + "release_date_precision": "day", + "total_tracks": 5, + "tracks": { + "href": "https://api.spotify.com/v1/albums/52oZQp5Au2YhGNGkhVqh1Q/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2Gvp79Cmni6PX13CAlSGex" + }, + "href": "https://api.spotify.com/v1/artists/2Gvp79Cmni6PX13CAlSGex", + "id": "2Gvp79Cmni6PX13CAlSGex", + "name": "Bùi Anh Tuấn", + "type": "artist", + "uri": "spotify:artist:2Gvp79Cmni6PX13CAlSGex" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/6jFvKq4gMkQ50joURHPGXO" + }, + "href": "https://api.spotify.com/v1/artists/6jFvKq4gMkQ50joURHPGXO", + "id": "6jFvKq4gMkQ50joURHPGXO", + "name": "Charmy pham", + "type": "artist", + "uri": "spotify:artist:6jFvKq4gMkQ50joURHPGXO" + } + ], + "disc_number": 1, + "duration_ms": 227400, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6JZryg0GQ5nkz00bl8FxIq" + }, + "href": "https://api.spotify.com/v1/tracks/6JZryg0GQ5nkz00bl8FxIq", + "id": "6JZryg0GQ5nkz00bl8FxIq", + "is_local": false, + "is_playable": true, + "name": "Mùa Đông Tình Yêu", + "preview_url": "https://p.scdn.co/mp3-preview/369f80bd8e821aa819aeb896e74efdf5244f999a?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:6JZryg0GQ5nkz00bl8FxIq" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2Gvp79Cmni6PX13CAlSGex" + }, + "href": "https://api.spotify.com/v1/artists/2Gvp79Cmni6PX13CAlSGex", + "id": "2Gvp79Cmni6PX13CAlSGex", + "name": "Bùi Anh Tuấn", + "type": "artist", + "uri": "spotify:artist:2Gvp79Cmni6PX13CAlSGex" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/24Wn81dwdDeTCuB1BWGoVJ" + }, + "href": "https://api.spotify.com/v1/artists/24Wn81dwdDeTCuB1BWGoVJ", + "id": "24Wn81dwdDeTCuB1BWGoVJ", + "name": "Hồ Ngọc Hà", + "type": "artist", + "uri": "spotify:artist:24Wn81dwdDeTCuB1BWGoVJ" + } + ], + "disc_number": 1, + "duration_ms": 281786, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2Iy4IrfEOiokjTAe9K9vXC" + }, + "href": "https://api.spotify.com/v1/tracks/2Iy4IrfEOiokjTAe9K9vXC", + "id": "2Iy4IrfEOiokjTAe9K9vXC", + "is_local": false, + "is_playable": true, + "name": "Ta Vẫn Còn Yêu", + "preview_url": "https://p.scdn.co/mp3-preview/aa63ed995f2b1d780eb5062e530f03c166c2026c?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 2, + "type": "track", + "uri": "spotify:track:2Iy4IrfEOiokjTAe9K9vXC" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2Gvp79Cmni6PX13CAlSGex" + }, + "href": "https://api.spotify.com/v1/artists/2Gvp79Cmni6PX13CAlSGex", + "id": "2Gvp79Cmni6PX13CAlSGex", + "name": "Bùi Anh Tuấn", + "type": "artist", + "uri": "spotify:artist:2Gvp79Cmni6PX13CAlSGex" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4DPEUF2kY7kVrbXX4Zgu7S" + }, + "href": "https://api.spotify.com/v1/artists/4DPEUF2kY7kVrbXX4Zgu7S", + "id": "4DPEUF2kY7kVrbXX4Zgu7S", + "name": "Bảo Thy", + "type": "artist", + "uri": "spotify:artist:4DPEUF2kY7kVrbXX4Zgu7S" + } + ], + "disc_number": 1, + "duration_ms": 251280, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2Gcls7eIysN3InhFrJYMo7" + }, + "href": "https://api.spotify.com/v1/tracks/2Gcls7eIysN3InhFrJYMo7", + "id": "2Gcls7eIysN3InhFrJYMo7", + "is_local": false, + "is_playable": true, + "name": "Đêm Cô Đơn", + "preview_url": "https://p.scdn.co/mp3-preview/78c95c5c9ba22cefd156faf15946e916733d9759?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 3, + "type": "track", + "uri": "spotify:track:2Gcls7eIysN3InhFrJYMo7" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2Gvp79Cmni6PX13CAlSGex" + }, + "href": "https://api.spotify.com/v1/artists/2Gvp79Cmni6PX13CAlSGex", + "id": "2Gvp79Cmni6PX13CAlSGex", + "name": "Bùi Anh Tuấn", + "type": "artist", + "uri": "spotify:artist:2Gvp79Cmni6PX13CAlSGex" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1vuXGfUQ15YoFnM2V49rF5" + }, + "href": "https://api.spotify.com/v1/artists/1vuXGfUQ15YoFnM2V49rF5", + "id": "1vuXGfUQ15YoFnM2V49rF5", + "name": "Giang Hong Ngoc", + "type": "artist", + "uri": "spotify:artist:1vuXGfUQ15YoFnM2V49rF5" + } + ], + "disc_number": 1, + "duration_ms": 325120, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0UPhO0SwjB2mnj0X3EJmGp" + }, + "href": "https://api.spotify.com/v1/tracks/0UPhO0SwjB2mnj0X3EJmGp", + "id": "0UPhO0SwjB2mnj0X3EJmGp", + "is_local": false, + "is_playable": true, + "name": "Ngỡ Một Lần Nữa Em Quay Về", + "preview_url": "https://p.scdn.co/mp3-preview/ad8eea73448ca4cc65ffc7f16ec14f38f64cdd59?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 4, + "type": "track", + "uri": "spotify:track:0UPhO0SwjB2mnj0X3EJmGp" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2Gvp79Cmni6PX13CAlSGex" + }, + "href": "https://api.spotify.com/v1/artists/2Gvp79Cmni6PX13CAlSGex", + "id": "2Gvp79Cmni6PX13CAlSGex", + "name": "Bùi Anh Tuấn", + "type": "artist", + "uri": "spotify:artist:2Gvp79Cmni6PX13CAlSGex" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/24Wn81dwdDeTCuB1BWGoVJ" + }, + "href": "https://api.spotify.com/v1/artists/24Wn81dwdDeTCuB1BWGoVJ", + "id": "24Wn81dwdDeTCuB1BWGoVJ", + "name": "Hồ Ngọc Hà", + "type": "artist", + "uri": "spotify:artist:24Wn81dwdDeTCuB1BWGoVJ" + } + ], + "disc_number": 1, + "duration_ms": 229600, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6v2GxIOlbtccYocypWDJoF" + }, + "href": "https://api.spotify.com/v1/tracks/6v2GxIOlbtccYocypWDJoF", + "id": "6v2GxIOlbtccYocypWDJoF", + "is_local": false, + "is_playable": true, + "name": "Dù Tình Phôi Pha", + "preview_url": "https://p.scdn.co/mp3-preview/e8e78e31a7107aea729b23ac39031a8391acb2f9?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 5, + "type": "track", + "uri": "spotify:track:6v2GxIOlbtccYocypWDJoF" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 5 + }, + "type": "album", + "uri": "spotify:album:52oZQp5Au2YhGNGkhVqh1Q" + }, + { + "album_type": "album", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/6YVMFz59CuY7ngCxTxjpxE" + }, + "href": "https://api.spotify.com/v1/artists/6YVMFz59CuY7ngCxTxjpxE", + "id": "6YVMFz59CuY7ngCxTxjpxE", + "name": "aespa", + "type": "artist", + "uri": "spotify:artist:6YVMFz59CuY7ngCxTxjpxE" + } + ], + "copyrights": [ + { + "text": "© 2022 SM Entertainment, under exclusive license to Warner Records Inc.", + "type": "C" + }, + { + "text": "℗ 2022 SM Entertainment, under exclusive license to Warner Records Inc.", + "type": "P" + } + ], + "external_ids": { + "upc": "888735941344" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/4w1dbvUy1crv0knXQvcSeY" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/4w1dbvUy1crv0knXQvcSeY", + "id": "4w1dbvUy1crv0knXQvcSeY", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273b3be3b970fc89a02f301c9da", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02b3be3b970fc89a02f301c9da", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851b3be3b970fc89a02f301c9da", + "width": 64 + } + ], + "is_playable": true, + "label": "Warner Records", + "name": "Girls - The 2nd Mini Album", + "popularity": 74, + "release_date": "2022-07-08", + "release_date_precision": "day", + "total_tracks": 9, + "tracks": { + "href": "https://api.spotify.com/v1/albums/4w1dbvUy1crv0knXQvcSeY/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/6YVMFz59CuY7ngCxTxjpxE" + }, + "href": "https://api.spotify.com/v1/artists/6YVMFz59CuY7ngCxTxjpxE", + "id": "6YVMFz59CuY7ngCxTxjpxE", + "name": "aespa", + "type": "artist", + "uri": "spotify:artist:6YVMFz59CuY7ngCxTxjpxE" + } + ], + "disc_number": 1, + "duration_ms": 240440, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2WTHLEVjfefbGoW7F3dXIg" + }, + "href": "https://api.spotify.com/v1/tracks/2WTHLEVjfefbGoW7F3dXIg", + "id": "2WTHLEVjfefbGoW7F3dXIg", + "is_local": false, + "is_playable": true, + "name": "Girls", + "preview_url": "https://p.scdn.co/mp3-preview/984b91b387b0495b85cc8007744830a99d5f19b3?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:2WTHLEVjfefbGoW7F3dXIg" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/6YVMFz59CuY7ngCxTxjpxE" + }, + "href": "https://api.spotify.com/v1/artists/6YVMFz59CuY7ngCxTxjpxE", + "id": "6YVMFz59CuY7ngCxTxjpxE", + "name": "aespa", + "type": "artist", + "uri": "spotify:artist:6YVMFz59CuY7ngCxTxjpxE" + } + ], + "disc_number": 1, + "duration_ms": 195053, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/396FqjKmViUZ92Wmm4rx3i" + }, + "href": "https://api.spotify.com/v1/tracks/396FqjKmViUZ92Wmm4rx3i", + "id": "396FqjKmViUZ92Wmm4rx3i", + "is_local": false, + "is_playable": true, + "name": "Illusion", + "preview_url": "https://p.scdn.co/mp3-preview/a26b8c1ee1e65d160b3784a0e2c85dafd720b8b7?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 2, + "type": "track", + "uri": "spotify:track:396FqjKmViUZ92Wmm4rx3i" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/6YVMFz59CuY7ngCxTxjpxE" + }, + "href": "https://api.spotify.com/v1/artists/6YVMFz59CuY7ngCxTxjpxE", + "id": "6YVMFz59CuY7ngCxTxjpxE", + "name": "aespa", + "type": "artist", + "uri": "spotify:artist:6YVMFz59CuY7ngCxTxjpxE" + } + ], + "disc_number": 1, + "duration_ms": 156866, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3tB10LUdisNWISpLw5gPCk" + }, + "href": "https://api.spotify.com/v1/tracks/3tB10LUdisNWISpLw5gPCk", + "id": "3tB10LUdisNWISpLw5gPCk", + "is_local": false, + "is_playable": true, + "name": "Lingo", + "preview_url": "https://p.scdn.co/mp3-preview/545858e5a5557efcc68552f92772bfc9ae7278e4?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 3, + "type": "track", + "uri": "spotify:track:3tB10LUdisNWISpLw5gPCk" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/6YVMFz59CuY7ngCxTxjpxE" + }, + "href": "https://api.spotify.com/v1/artists/6YVMFz59CuY7ngCxTxjpxE", + "id": "6YVMFz59CuY7ngCxTxjpxE", + "name": "aespa", + "type": "artist", + "uri": "spotify:artist:6YVMFz59CuY7ngCxTxjpxE" + } + ], + "disc_number": 1, + "duration_ms": 178133, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1uIN3VCVKzMXqF2A2Qlw5q" + }, + "href": "https://api.spotify.com/v1/tracks/1uIN3VCVKzMXqF2A2Qlw5q", + "id": "1uIN3VCVKzMXqF2A2Qlw5q", + "is_local": false, + "is_playable": true, + "name": "Life's Too Short", + "preview_url": "https://p.scdn.co/mp3-preview/cd3f444f64b65e11265869d0ec0dd3c77655f6e5?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 4, + "type": "track", + "uri": "spotify:track:1uIN3VCVKzMXqF2A2Qlw5q" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/6YVMFz59CuY7ngCxTxjpxE" + }, + "href": "https://api.spotify.com/v1/artists/6YVMFz59CuY7ngCxTxjpxE", + "id": "6YVMFz59CuY7ngCxTxjpxE", + "name": "aespa", + "type": "artist", + "uri": "spotify:artist:6YVMFz59CuY7ngCxTxjpxE" + } + ], + "disc_number": 1, + "duration_ms": 221640, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/11JpW4h96X4TlGt6LFpNCC" + }, + "href": "https://api.spotify.com/v1/tracks/11JpW4h96X4TlGt6LFpNCC", + "id": "11JpW4h96X4TlGt6LFpNCC", + "is_local": false, + "is_playable": true, + "name": "ICU", + "preview_url": "https://p.scdn.co/mp3-preview/91c7128866edc7359a056d2987d22ffa4a29459c?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 5, + "type": "track", + "uri": "spotify:track:11JpW4h96X4TlGt6LFpNCC" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/6YVMFz59CuY7ngCxTxjpxE" + }, + "href": "https://api.spotify.com/v1/artists/6YVMFz59CuY7ngCxTxjpxE", + "id": "6YVMFz59CuY7ngCxTxjpxE", + "name": "aespa", + "type": "artist", + "uri": "spotify:artist:6YVMFz59CuY7ngCxTxjpxE" + } + ], + "disc_number": 1, + "duration_ms": 178133, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2ouguQxJZn4jXisuNREqe5" + }, + "href": "https://api.spotify.com/v1/tracks/2ouguQxJZn4jXisuNREqe5", + "id": "2ouguQxJZn4jXisuNREqe5", + "is_local": false, + "is_playable": true, + "name": "Life's Too Short (English Version)", + "preview_url": "https://p.scdn.co/mp3-preview/cb0dc6dc8442589808c3ce8352da16e073651ff1?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 6, + "type": "track", + "uri": "spotify:track:2ouguQxJZn4jXisuNREqe5" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/6YVMFz59CuY7ngCxTxjpxE" + }, + "href": "https://api.spotify.com/v1/artists/6YVMFz59CuY7ngCxTxjpxE", + "id": "6YVMFz59CuY7ngCxTxjpxE", + "name": "aespa", + "type": "artist", + "uri": "spotify:artist:6YVMFz59CuY7ngCxTxjpxE" + } + ], + "disc_number": 1, + "duration_ms": 174933, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6Tj9KfzPp7tmgcDdsaPwGE" + }, + "href": "https://api.spotify.com/v1/tracks/6Tj9KfzPp7tmgcDdsaPwGE", + "id": "6Tj9KfzPp7tmgcDdsaPwGE", + "is_local": false, + "is_playable": true, + "name": "Black Mamba", + "preview_url": "https://p.scdn.co/mp3-preview/872fb3d2b80ecfcc1b35702ec3350427dbd6ba52?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 7, + "type": "track", + "uri": "spotify:track:6Tj9KfzPp7tmgcDdsaPwGE" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/6YVMFz59CuY7ngCxTxjpxE" + }, + "href": "https://api.spotify.com/v1/artists/6YVMFz59CuY7ngCxTxjpxE", + "id": "6YVMFz59CuY7ngCxTxjpxE", + "name": "aespa", + "type": "artist", + "uri": "spotify:artist:6YVMFz59CuY7ngCxTxjpxE" + } + ], + "disc_number": 1, + "duration_ms": 298173, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6kCHPE4E6nVg3KxZdlifnE" + }, + "href": "https://api.spotify.com/v1/tracks/6kCHPE4E6nVg3KxZdlifnE", + "id": "6kCHPE4E6nVg3KxZdlifnE", + "is_local": false, + "is_playable": true, + "name": "Forever", + "preview_url": "https://p.scdn.co/mp3-preview/8878a75c84b3444739703f1598ca22d14404b63e?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 8, + "type": "track", + "uri": "spotify:track:6kCHPE4E6nVg3KxZdlifnE" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/6YVMFz59CuY7ngCxTxjpxE" + }, + "href": "https://api.spotify.com/v1/artists/6YVMFz59CuY7ngCxTxjpxE", + "id": "6YVMFz59CuY7ngCxTxjpxE", + "name": "aespa", + "type": "artist", + "uri": "spotify:artist:6YVMFz59CuY7ngCxTxjpxE" + } + ], + "disc_number": 1, + "duration_ms": 204933, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2GyZkPeiJXXBqYY1ddtsjk" + }, + "href": "https://api.spotify.com/v1/tracks/2GyZkPeiJXXBqYY1ddtsjk", + "id": "2GyZkPeiJXXBqYY1ddtsjk", + "is_local": false, + "is_playable": true, + "name": "Dreams Come True", + "preview_url": "https://p.scdn.co/mp3-preview/cdb35f6d50208269b172d0f04b3469073a95046e?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 9, + "type": "track", + "uri": "spotify:track:2GyZkPeiJXXBqYY1ddtsjk" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 9 + }, + "type": "album", + "uri": "spotify:album:4w1dbvUy1crv0knXQvcSeY" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/6YVMFz59CuY7ngCxTxjpxE" + }, + "href": "https://api.spotify.com/v1/artists/6YVMFz59CuY7ngCxTxjpxE", + "id": "6YVMFz59CuY7ngCxTxjpxE", + "name": "aespa", + "type": "artist", + "uri": "spotify:artist:6YVMFz59CuY7ngCxTxjpxE" + } + ], + "copyrights": [ + { + "text": "2021 SM Entertainment", + "type": "C" + }, + { + "text": "2021 SM Entertainment", + "type": "P" + } + ], + "external_ids": { + "upc": "888735939310" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/3vyyDkvYWC36DwgZCYd3Wu" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/3vyyDkvYWC36DwgZCYd3Wu", + "id": "3vyyDkvYWC36DwgZCYd3Wu", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273d8cc2281fcd4519ca020926b", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02d8cc2281fcd4519ca020926b", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851d8cc2281fcd4519ca020926b", + "width": 64 + } + ], + "is_playable": true, + "label": "SM Entertainment", + "name": "Savage - The 1st Mini Album", + "popularity": 73, + "release_date": "2021-10-05", + "release_date_precision": "day", + "total_tracks": 6, + "tracks": { + "href": "https://api.spotify.com/v1/albums/3vyyDkvYWC36DwgZCYd3Wu/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/6YVMFz59CuY7ngCxTxjpxE" + }, + "href": "https://api.spotify.com/v1/artists/6YVMFz59CuY7ngCxTxjpxE", + "id": "6YVMFz59CuY7ngCxTxjpxE", + "name": "aespa", + "type": "artist", + "uri": "spotify:artist:6YVMFz59CuY7ngCxTxjpxE" + } + ], + "disc_number": 1, + "duration_ms": 147400, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1iNvVaWmlKJns2LNTXN39Q" + }, + "href": "https://api.spotify.com/v1/tracks/1iNvVaWmlKJns2LNTXN39Q", + "id": "1iNvVaWmlKJns2LNTXN39Q", + "is_local": false, + "is_playable": true, + "name": "aenergy", + "preview_url": "https://p.scdn.co/mp3-preview/e4fa6b04a577651a594c68f332161954b2fd72b5?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:1iNvVaWmlKJns2LNTXN39Q" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/6YVMFz59CuY7ngCxTxjpxE" + }, + "href": "https://api.spotify.com/v1/artists/6YVMFz59CuY7ngCxTxjpxE", + "id": "6YVMFz59CuY7ngCxTxjpxE", + "name": "aespa", + "type": "artist", + "uri": "spotify:artist:6YVMFz59CuY7ngCxTxjpxE" + } + ], + "disc_number": 1, + "duration_ms": 238143, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3dbLT62Cvs46Ju7a8gpr36" + }, + "href": "https://api.spotify.com/v1/tracks/3dbLT62Cvs46Ju7a8gpr36", + "id": "3dbLT62Cvs46Ju7a8gpr36", + "is_local": false, + "is_playable": true, + "name": "Savage", + "preview_url": "https://p.scdn.co/mp3-preview/a6d7a86d035c5ca5cca700d2dfe43e4ee2ba265a?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 2, + "type": "track", + "uri": "spotify:track:3dbLT62Cvs46Ju7a8gpr36" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/6YVMFz59CuY7ngCxTxjpxE" + }, + "href": "https://api.spotify.com/v1/artists/6YVMFz59CuY7ngCxTxjpxE", + "id": "6YVMFz59CuY7ngCxTxjpxE", + "name": "aespa", + "type": "artist", + "uri": "spotify:artist:6YVMFz59CuY7ngCxTxjpxE" + } + ], + "disc_number": 1, + "duration_ms": 214853, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6l1dTAhX7P6EKvA11NLNuW" + }, + "href": "https://api.spotify.com/v1/tracks/6l1dTAhX7P6EKvA11NLNuW", + "id": "6l1dTAhX7P6EKvA11NLNuW", + "is_local": false, + "is_playable": true, + "name": "I'll Make You Cry", + "preview_url": "https://p.scdn.co/mp3-preview/3bc36daf2dd587f06ae40e1dbe782a59f2ebc1b1?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 3, + "type": "track", + "uri": "spotify:track:6l1dTAhX7P6EKvA11NLNuW" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/6YVMFz59CuY7ngCxTxjpxE" + }, + "href": "https://api.spotify.com/v1/artists/6YVMFz59CuY7ngCxTxjpxE", + "id": "6YVMFz59CuY7ngCxTxjpxE", + "name": "aespa", + "type": "artist", + "uri": "spotify:artist:6YVMFz59CuY7ngCxTxjpxE" + } + ], + "disc_number": 1, + "duration_ms": 213560, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3UKKwGrpWWamc0XNSKXjmz" + }, + "href": "https://api.spotify.com/v1/tracks/3UKKwGrpWWamc0XNSKXjmz", + "id": "3UKKwGrpWWamc0XNSKXjmz", + "is_local": false, + "is_playable": true, + "name": "YEPPI YEPPI", + "preview_url": "https://p.scdn.co/mp3-preview/afe1fa86e0b7f41f93d330209ef4725a57f95a8d?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 4, + "type": "track", + "uri": "spotify:track:3UKKwGrpWWamc0XNSKXjmz" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/6YVMFz59CuY7ngCxTxjpxE" + }, + "href": "https://api.spotify.com/v1/artists/6YVMFz59CuY7ngCxTxjpxE", + "id": "6YVMFz59CuY7ngCxTxjpxE", + "name": "aespa", + "type": "artist", + "uri": "spotify:artist:6YVMFz59CuY7ngCxTxjpxE" + } + ], + "disc_number": 1, + "duration_ms": 191200, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/5bMHrigI1EAmZdiyRzKoQi" + }, + "href": "https://api.spotify.com/v1/tracks/5bMHrigI1EAmZdiyRzKoQi", + "id": "5bMHrigI1EAmZdiyRzKoQi", + "is_local": false, + "is_playable": true, + "name": "ICONIC", + "preview_url": "https://p.scdn.co/mp3-preview/ea9545881cc3804bfc8086c178baa6da1b3e0a1a?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 5, + "type": "track", + "uri": "spotify:track:5bMHrigI1EAmZdiyRzKoQi" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/6YVMFz59CuY7ngCxTxjpxE" + }, + "href": "https://api.spotify.com/v1/artists/6YVMFz59CuY7ngCxTxjpxE", + "id": "6YVMFz59CuY7ngCxTxjpxE", + "name": "aespa", + "type": "artist", + "uri": "spotify:artist:6YVMFz59CuY7ngCxTxjpxE" + } + ], + "disc_number": 1, + "duration_ms": 210560, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/285Bh5EkbxGGE76ge8JDbH" + }, + "href": "https://api.spotify.com/v1/tracks/285Bh5EkbxGGE76ge8JDbH", + "id": "285Bh5EkbxGGE76ge8JDbH", + "is_local": false, + "is_playable": true, + "name": "Lucid Dream", + "preview_url": "https://p.scdn.co/mp3-preview/9a11c37802bb45ed564dc8af5208c782ec6352a7?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 6, + "type": "track", + "uri": "spotify:track:285Bh5EkbxGGE76ge8JDbH" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 6 + }, + "type": "album", + "uri": "spotify:album:3vyyDkvYWC36DwgZCYd3Wu" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5bYwZAV9K923kEHW1Yhol5" + }, + "href": "https://api.spotify.com/v1/artists/5bYwZAV9K923kEHW1Yhol5", + "id": "5bYwZAV9K923kEHW1Yhol5", + "name": "Ruben Wan", + "type": "artist", + "uri": "spotify:artist:5bYwZAV9K923kEHW1Yhol5" + } + ], + "copyrights": [ + { + "text": "2022 Wan Nation", + "type": "C" + }, + { + "text": "2022 Wan Nation", + "type": "P" + } + ], + "external_ids": { + "upc": "196862268082" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/2N4DA9fPmcYrPZaWVB2eZm" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/2N4DA9fPmcYrPZaWVB2eZm", + "id": "2N4DA9fPmcYrPZaWVB2eZm", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273ca1bb46eb081b3c138b8e3c1", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02ca1bb46eb081b3c138b8e3c1", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851ca1bb46eb081b3c138b8e3c1", + "width": 64 + } + ], + "is_playable": true, + "label": "Wan Nation", + "name": "Colores", + "popularity": 5, + "release_date": "2022-05-27", + "release_date_precision": "day", + "total_tracks": 1, + "tracks": { + "href": "https://api.spotify.com/v1/albums/2N4DA9fPmcYrPZaWVB2eZm/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5bYwZAV9K923kEHW1Yhol5" + }, + "href": "https://api.spotify.com/v1/artists/5bYwZAV9K923kEHW1Yhol5", + "id": "5bYwZAV9K923kEHW1Yhol5", + "name": "Ruben Wan", + "type": "artist", + "uri": "spotify:artist:5bYwZAV9K923kEHW1Yhol5" + } + ], + "disc_number": 1, + "duration_ms": 189981, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3B0KekoJ8DsoCkaxRdPtIA" + }, + "href": "https://api.spotify.com/v1/tracks/3B0KekoJ8DsoCkaxRdPtIA", + "id": "3B0KekoJ8DsoCkaxRdPtIA", + "is_local": false, + "is_playable": true, + "name": "Colores", + "preview_url": "https://p.scdn.co/mp3-preview/3fefda1b598ffbf6a277100181bdb0dc7c290cc5?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:3B0KekoJ8DsoCkaxRdPtIA" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 1 + }, + "type": "album", + "uri": "spotify:album:2N4DA9fPmcYrPZaWVB2eZm" + }, + { + "album_type": "album", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "copyrights": [ + { + "text": "2008 XL Recordings Ltd", + "type": "C" + }, + { + "text": "2008 XL Recordings Ltd", + "type": "P" + } + ], + "external_ids": { + "upc": "634904531362" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/3uftDqGs13LsE1s8nn5XSe" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/3uftDqGs13LsE1s8nn5XSe", + "id": "3uftDqGs13LsE1s8nn5XSe", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273756527c53c3e52f122db4644", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02756527c53c3e52f122db4644", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851756527c53c3e52f122db4644", + "width": 64 + } + ], + "is_playable": true, + "label": "XL Recordings", + "name": "19", + "popularity": 67, + "release_date": "2008-11-17", + "release_date_precision": "day", + "total_tracks": 22, + "tracks": { + "href": "https://api.spotify.com/v1/albums/3uftDqGs13LsE1s8nn5XSe/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 220506, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0SA1xt4HUX5ny8xfgHOqQI" + }, + "href": "https://api.spotify.com/v1/tracks/0SA1xt4HUX5ny8xfgHOqQI", + "id": "0SA1xt4HUX5ny8xfgHOqQI", + "is_local": false, + "is_playable": true, + "name": "Daydreamer", + "preview_url": "https://p.scdn.co/mp3-preview/4dfb51e759e724793b555a79d8ee54ae203afe88?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:0SA1xt4HUX5ny8xfgHOqQI" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 258506, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/4YyIcE6UYsEIdywfIeakTd" + }, + "href": "https://api.spotify.com/v1/tracks/4YyIcE6UYsEIdywfIeakTd", + "id": "4YyIcE6UYsEIdywfIeakTd", + "is_local": false, + "is_playable": true, + "name": "Best For Last", + "preview_url": "https://p.scdn.co/mp3-preview/6044378b8b980e81d4a868af97ddef6a329f6d60?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 2, + "type": "track", + "uri": "spotify:track:4YyIcE6UYsEIdywfIeakTd" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 210506, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/4YoGMmUJJ9dZpQ2CLOmPl2" + }, + "href": "https://api.spotify.com/v1/tracks/4YoGMmUJJ9dZpQ2CLOmPl2", + "id": "4YoGMmUJJ9dZpQ2CLOmPl2", + "is_local": false, + "is_playable": true, + "name": "Chasing Pavements", + "preview_url": "https://p.scdn.co/mp3-preview/209e4b33acb8fd535c65ab403087a6c0c3dabc65?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 3, + "type": "track", + "uri": "spotify:track:4YoGMmUJJ9dZpQ2CLOmPl2" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 191866, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/78foNmu2hGDPwm3cJVlikF" + }, + "href": "https://api.spotify.com/v1/tracks/78foNmu2hGDPwm3cJVlikF", + "id": "78foNmu2hGDPwm3cJVlikF", + "is_local": false, + "is_playable": true, + "name": "Cold Shoulder", + "preview_url": "https://p.scdn.co/mp3-preview/b603ef2f8880eef52789921bc6acd8ae8c841d44?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 4, + "type": "track", + "uri": "spotify:track:78foNmu2hGDPwm3cJVlikF" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 208040, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2Mu0WHDu931jSNOC6GDIp5" + }, + "href": "https://api.spotify.com/v1/tracks/2Mu0WHDu931jSNOC6GDIp5", + "id": "2Mu0WHDu931jSNOC6GDIp5", + "is_local": false, + "is_playable": true, + "name": "Crazy For You", + "preview_url": "https://p.scdn.co/mp3-preview/3b2c77cee83f71198e041f7455d891585230911f?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 5, + "type": "track", + "uri": "spotify:track:2Mu0WHDu931jSNOC6GDIp5" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 203906, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1Ty11iX5DIhZRRD9zCHP3l" + }, + "href": "https://api.spotify.com/v1/tracks/1Ty11iX5DIhZRRD9zCHP3l", + "id": "1Ty11iX5DIhZRRD9zCHP3l", + "is_local": false, + "is_playable": true, + "name": "Melt My Heart To Stone", + "preview_url": "https://p.scdn.co/mp3-preview/cd9ae9e9b90cf3558621803eb6d9443c513d92f2?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 6, + "type": "track", + "uri": "spotify:track:1Ty11iX5DIhZRRD9zCHP3l" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 190280, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/4GIyHmvDwjlggh0FEivFNe" + }, + "href": "https://api.spotify.com/v1/tracks/4GIyHmvDwjlggh0FEivFNe", + "id": "4GIyHmvDwjlggh0FEivFNe", + "is_local": false, + "is_playable": true, + "name": "First Love", + "preview_url": "https://p.scdn.co/mp3-preview/c02dfd14cf533e6b2b688bd73be4821e200a1e8a?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 7, + "type": "track", + "uri": "spotify:track:4GIyHmvDwjlggh0FEivFNe" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 197346, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3jNughzX6earazVYR5VP47" + }, + "href": "https://api.spotify.com/v1/tracks/3jNughzX6earazVYR5VP47", + "id": "3jNughzX6earazVYR5VP47", + "is_local": false, + "is_playable": true, + "name": "Right As Rain", + "preview_url": "https://p.scdn.co/mp3-preview/25b1ee7bea6dee62e809c7b1ff340aa982cb4328?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 8, + "type": "track", + "uri": "spotify:track:3jNughzX6earazVYR5VP47" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 212040, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/5PuJtgZFBzZ98GIWDpS2sF" + }, + "href": "https://api.spotify.com/v1/tracks/5PuJtgZFBzZ98GIWDpS2sF", + "id": "5PuJtgZFBzZ98GIWDpS2sF", + "is_local": false, + "is_playable": true, + "name": "Make You Feel My Love", + "preview_url": "https://p.scdn.co/mp3-preview/3d9582dbaa291a0bdf96e750281595574f0de3ad?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 9, + "type": "track", + "uri": "spotify:track:5PuJtgZFBzZ98GIWDpS2sF" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 195653, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/7pbQxZifd3jTQ2MJuAOoSh" + }, + "href": "https://api.spotify.com/v1/tracks/7pbQxZifd3jTQ2MJuAOoSh", + "id": "7pbQxZifd3jTQ2MJuAOoSh", + "is_local": false, + "is_playable": true, + "name": "My Same", + "preview_url": "https://p.scdn.co/mp3-preview/27ebf033af75ebd7d3d49b227f67927b86252a35?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 10, + "type": "track", + "uri": "spotify:track:7pbQxZifd3jTQ2MJuAOoSh" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 258853, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/44LTAQLZPPSgNbmMh5Qacd" + }, + "href": "https://api.spotify.com/v1/tracks/44LTAQLZPPSgNbmMh5Qacd", + "id": "44LTAQLZPPSgNbmMh5Qacd", + "is_local": false, + "is_playable": true, + "name": "Tired", + "preview_url": "https://p.scdn.co/mp3-preview/e6d4e46e3aacaa7b1275bcd7e0768e35ec0e841d?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 11, + "type": "track", + "uri": "spotify:track:44LTAQLZPPSgNbmMh5Qacd" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 1, + "duration_ms": 271226, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/3cCPT7eJhpYXXlH2pbWhfP" + }, + "href": "https://api.spotify.com/v1/tracks/3cCPT7eJhpYXXlH2pbWhfP", + "id": "3cCPT7eJhpYXXlH2pbWhfP", + "is_local": false, + "is_playable": true, + "name": "Hometown Glory", + "preview_url": "https://p.scdn.co/mp3-preview/7f6ac1f843e7edf708e63f55f0cf0a265d717989?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 12, + "type": "track", + "uri": "spotify:track:3cCPT7eJhpYXXlH2pbWhfP" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 2, + "duration_ms": 232200, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/33rmlXHHEN5K8m5PINMEbb" + }, + "href": "https://api.spotify.com/v1/tracks/33rmlXHHEN5K8m5PINMEbb", + "id": "33rmlXHHEN5K8m5PINMEbb", + "is_local": false, + "is_playable": true, + "name": "Chasing Pavements - Live at Hotel Cafe", + "preview_url": "https://p.scdn.co/mp3-preview/5fdf42c67c7099493d3e3090c9b6e764a8989274?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:33rmlXHHEN5K8m5PINMEbb" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 2, + "duration_ms": 201866, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6uzHbGJs6nrQnHfAkADWoT" + }, + "href": "https://api.spotify.com/v1/tracks/6uzHbGJs6nrQnHfAkADWoT", + "id": "6uzHbGJs6nrQnHfAkADWoT", + "is_local": false, + "is_playable": true, + "name": "Melt My Heart To Stone - Live at Hotel Cafe", + "preview_url": "https://p.scdn.co/mp3-preview/f5193cdf07ececf9d5a001ea2fc71ad9fe3a9c8a?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 2, + "type": "track", + "uri": "spotify:track:6uzHbGJs6nrQnHfAkADWoT" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 2, + "duration_ms": 127506, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2sYK3yPdKL0YLHl6TdrYFn" + }, + "href": "https://api.spotify.com/v1/tracks/2sYK3yPdKL0YLHl6TdrYFn", + "id": "2sYK3yPdKL0YLHl6TdrYFn", + "is_local": false, + "is_playable": true, + "name": "That's It, I Quit, I'm Movin' On - Live at Hotel Cafe", + "preview_url": "https://p.scdn.co/mp3-preview/54817d71c057c0f89b26912ae6fca833e1040a66?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 3, + "type": "track", + "uri": "spotify:track:2sYK3yPdKL0YLHl6TdrYFn" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 2, + "duration_ms": 223400, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0zbKhsL2me1OhTqPOhnkaA" + }, + "href": "https://api.spotify.com/v1/tracks/0zbKhsL2me1OhTqPOhnkaA", + "id": "0zbKhsL2me1OhTqPOhnkaA", + "is_local": false, + "is_playable": true, + "name": "Crazy For You - Live at Hotel Cafe", + "preview_url": "https://p.scdn.co/mp3-preview/66b2c83b7d932c30fae6c9bcd48c68c9785c0b7b?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 4, + "type": "track", + "uri": "spotify:track:0zbKhsL2me1OhTqPOhnkaA" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 2, + "duration_ms": 212026, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1qMsnFyutQSZQheQcp3uAl" + }, + "href": "https://api.spotify.com/v1/tracks/1qMsnFyutQSZQheQcp3uAl", + "id": "1qMsnFyutQSZQheQcp3uAl", + "is_local": false, + "is_playable": true, + "name": "Right As Rain - Live at Hotel Cafe", + "preview_url": "https://p.scdn.co/mp3-preview/aea6f30b5110dc5d42308f8437a200c04ce47e32?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 5, + "type": "track", + "uri": "spotify:track:1qMsnFyutQSZQheQcp3uAl" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 2, + "duration_ms": 185440, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6VIrWBZfcY7iJDYk7CeZNP" + }, + "href": "https://api.spotify.com/v1/tracks/6VIrWBZfcY7iJDYk7CeZNP", + "id": "6VIrWBZfcY7iJDYk7CeZNP", + "is_local": false, + "is_playable": true, + "name": "My Same - Live at Hotel Cafe", + "preview_url": "https://p.scdn.co/mp3-preview/ed42175a35bb181141509587d2be4895d8cf1517?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 6, + "type": "track", + "uri": "spotify:track:6VIrWBZfcY7iJDYk7CeZNP" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 2, + "duration_ms": 232200, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3I7sFjGE02t7zNiMz6ILRe" + }, + "href": "https://api.spotify.com/v1/tracks/3I7sFjGE02t7zNiMz6ILRe", + "id": "3I7sFjGE02t7zNiMz6ILRe", + "is_local": false, + "is_playable": true, + "name": "Make You Feel My Love - Live at Hotel Cafe", + "preview_url": "https://p.scdn.co/mp3-preview/9a9635ca4436a8bf2e47371ab654826e310a068b?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 7, + "type": "track", + "uri": "spotify:track:3I7sFjGE02t7zNiMz6ILRe" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 2, + "duration_ms": 221493, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/4fLzX4LHtNfboqXVKdgUSf" + }, + "href": "https://api.spotify.com/v1/tracks/4fLzX4LHtNfboqXVKdgUSf", + "id": "4fLzX4LHtNfboqXVKdgUSf", + "is_local": false, + "is_playable": true, + "name": "Daydreamer - Live at Hotel Cafe", + "preview_url": "https://p.scdn.co/mp3-preview/649037aff465cd5d2ed2715d880d9666e0d37dd5?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 8, + "type": "track", + "uri": "spotify:track:4fLzX4LHtNfboqXVKdgUSf" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + } + ], + "disc_number": 2, + "duration_ms": 228573, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3V79Erdk3uUkrKvohOzbNP" + }, + "href": "https://api.spotify.com/v1/tracks/3V79Erdk3uUkrKvohOzbNP", + "id": "3V79Erdk3uUkrKvohOzbNP", + "is_local": false, + "is_playable": true, + "name": "Hometown Glory - Live at Hotel Cafe", + "preview_url": "https://p.scdn.co/mp3-preview/bf2da7c7e5bf08fb03890370f2cd982be3b5dce0?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 9, + "type": "track", + "uri": "spotify:track:3V79Erdk3uUkrKvohOzbNP" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY" + }, + "href": "https://api.spotify.com/v1/artists/4dpARuHxo51G3z768sgnrY", + "id": "4dpARuHxo51G3z768sgnrY", + "name": "Adele", + "type": "artist", + "uri": "spotify:artist:4dpARuHxo51G3z768sgnrY" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4wo1267SJuUfHgasdlfNfc" + }, + "href": "https://api.spotify.com/v1/artists/4wo1267SJuUfHgasdlfNfc", + "id": "4wo1267SJuUfHgasdlfNfc", + "name": "The Raconteurs", + "type": "artist", + "uri": "spotify:artist:4wo1267SJuUfHgasdlfNfc" + } + ], + "disc_number": 2, + "duration_ms": 268093, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6hRSA7yZ3TZCCd8W77UmBB" + }, + "href": "https://api.spotify.com/v1/tracks/6hRSA7yZ3TZCCd8W77UmBB", + "id": "6hRSA7yZ3TZCCd8W77UmBB", + "is_local": false, + "is_playable": true, + "name": "Many Shades Of Black - Performed by The Raconteurs and Adele", + "preview_url": "https://p.scdn.co/mp3-preview/a26191034c233633ceaf71d78bc3f1d437023039?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 10, + "type": "track", + "uri": "spotify:track:6hRSA7yZ3TZCCd8W77UmBB" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 22 + }, + "type": "album", + "uri": "spotify:album:3uftDqGs13LsE1s8nn5XSe" + }, + { + "album_type": "album", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/7nqOGRxlXj7N2JYbgNEjYH" + }, + "href": "https://api.spotify.com/v1/artists/7nqOGRxlXj7N2JYbgNEjYH", + "id": "7nqOGRxlXj7N2JYbgNEjYH", + "name": "SEVENTEEN", + "type": "artist", + "uri": "spotify:artist:7nqOGRxlXj7N2JYbgNEjYH" + } + ], + "copyrights": [ + { + "text": "© 2022 PLEDIS Entertainment", + "type": "C" + }, + { + "text": "℗ 2022 PLEDIS Entertainment", + "type": "P" + } + ], + "external_ids": { + "upc": "192641821851" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/4lfFgz2rD1irxf7dZhNJht" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/4lfFgz2rD1irxf7dZhNJht", + "id": "4lfFgz2rD1irxf7dZhNJht", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273decd839dd4fef3faf64c5fd5", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02decd839dd4fef3faf64c5fd5", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851decd839dd4fef3faf64c5fd5", + "width": 64 + } + ], + "is_playable": true, + "label": "PLEDIS Entertainment", + "name": "SEVENTEEN 4th Album 'Face the Sun'", + "popularity": 78, + "release_date": "2022-05-27", + "release_date_precision": "day", + "total_tracks": 9, + "tracks": { + "href": "https://api.spotify.com/v1/albums/4lfFgz2rD1irxf7dZhNJht/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/7nqOGRxlXj7N2JYbgNEjYH" + }, + "href": "https://api.spotify.com/v1/artists/7nqOGRxlXj7N2JYbgNEjYH", + "id": "7nqOGRxlXj7N2JYbgNEjYH", + "name": "SEVENTEEN", + "type": "artist", + "uri": "spotify:artist:7nqOGRxlXj7N2JYbgNEjYH" + } + ], + "disc_number": 1, + "duration_ms": 176560, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2j1Es5qEl4pD8GEe2WsYgP" + }, + "href": "https://api.spotify.com/v1/tracks/2j1Es5qEl4pD8GEe2WsYgP", + "id": "2j1Es5qEl4pD8GEe2WsYgP", + "is_local": false, + "is_playable": true, + "name": "Darl+ing", + "preview_url": "https://p.scdn.co/mp3-preview/5281e30e667c8ba656c641cb8f798a25028f057b?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:2j1Es5qEl4pD8GEe2WsYgP" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/7nqOGRxlXj7N2JYbgNEjYH" + }, + "href": "https://api.spotify.com/v1/artists/7nqOGRxlXj7N2JYbgNEjYH", + "id": "7nqOGRxlXj7N2JYbgNEjYH", + "name": "SEVENTEEN", + "type": "artist", + "uri": "spotify:artist:7nqOGRxlXj7N2JYbgNEjYH" + } + ], + "disc_number": 1, + "duration_ms": 197586, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6I2tqFhk8tq69iursYxuxd" + }, + "href": "https://api.spotify.com/v1/tracks/6I2tqFhk8tq69iursYxuxd", + "id": "6I2tqFhk8tq69iursYxuxd", + "is_local": false, + "is_playable": true, + "name": "HOT", + "preview_url": "https://p.scdn.co/mp3-preview/f608adef135057601b79ef87f268f01c9e4ba4cd?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 2, + "type": "track", + "uri": "spotify:track:6I2tqFhk8tq69iursYxuxd" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/7nqOGRxlXj7N2JYbgNEjYH" + }, + "href": "https://api.spotify.com/v1/artists/7nqOGRxlXj7N2JYbgNEjYH", + "id": "7nqOGRxlXj7N2JYbgNEjYH", + "name": "SEVENTEEN", + "type": "artist", + "uri": "spotify:artist:7nqOGRxlXj7N2JYbgNEjYH" + } + ], + "disc_number": 1, + "duration_ms": 172360, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/7BiEgR5r0yMmFoWC9kOTGf" + }, + "href": "https://api.spotify.com/v1/tracks/7BiEgR5r0yMmFoWC9kOTGf", + "id": "7BiEgR5r0yMmFoWC9kOTGf", + "is_local": false, + "is_playable": true, + "name": "DON QUIXOTE", + "preview_url": "https://p.scdn.co/mp3-preview/7ab7e6104f7a70095d967bc0196fd6376787f7fb?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 3, + "type": "track", + "uri": "spotify:track:7BiEgR5r0yMmFoWC9kOTGf" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/7nqOGRxlXj7N2JYbgNEjYH" + }, + "href": "https://api.spotify.com/v1/artists/7nqOGRxlXj7N2JYbgNEjYH", + "id": "7nqOGRxlXj7N2JYbgNEjYH", + "name": "SEVENTEEN", + "type": "artist", + "uri": "spotify:artist:7nqOGRxlXj7N2JYbgNEjYH" + } + ], + "disc_number": 1, + "duration_ms": 196186, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/5Av3flFGhQPu960OvjeNhm" + }, + "href": "https://api.spotify.com/v1/tracks/5Av3flFGhQPu960OvjeNhm", + "id": "5Av3flFGhQPu960OvjeNhm", + "is_local": false, + "is_playable": true, + "name": "March", + "preview_url": "https://p.scdn.co/mp3-preview/31af4b21df05a5a2bd11151b53755cbe3fe05050?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 4, + "type": "track", + "uri": "spotify:track:5Av3flFGhQPu960OvjeNhm" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/7nqOGRxlXj7N2JYbgNEjYH" + }, + "href": "https://api.spotify.com/v1/artists/7nqOGRxlXj7N2JYbgNEjYH", + "id": "7nqOGRxlXj7N2JYbgNEjYH", + "name": "SEVENTEEN", + "type": "artist", + "uri": "spotify:artist:7nqOGRxlXj7N2JYbgNEjYH" + } + ], + "disc_number": 1, + "duration_ms": 214893, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1sjObenL1HryPaQOiMDVZ9" + }, + "href": "https://api.spotify.com/v1/tracks/1sjObenL1HryPaQOiMDVZ9", + "id": "1sjObenL1HryPaQOiMDVZ9", + "is_local": false, + "is_playable": true, + "name": "Domino", + "preview_url": "https://p.scdn.co/mp3-preview/972ce0e63f892959608fab0456a15e26fd63981a?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 5, + "type": "track", + "uri": "spotify:track:1sjObenL1HryPaQOiMDVZ9" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/7nqOGRxlXj7N2JYbgNEjYH" + }, + "href": "https://api.spotify.com/v1/artists/7nqOGRxlXj7N2JYbgNEjYH", + "id": "7nqOGRxlXj7N2JYbgNEjYH", + "name": "SEVENTEEN", + "type": "artist", + "uri": "spotify:artist:7nqOGRxlXj7N2JYbgNEjYH" + } + ], + "disc_number": 1, + "duration_ms": 212653, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2rwJP8OEao5y3xexw52HfD" + }, + "href": "https://api.spotify.com/v1/tracks/2rwJP8OEao5y3xexw52HfD", + "id": "2rwJP8OEao5y3xexw52HfD", + "is_local": false, + "is_playable": true, + "name": "Shadow", + "preview_url": "https://p.scdn.co/mp3-preview/33000949b8915c3b8beeefc8bf402d328653edf8?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 6, + "type": "track", + "uri": "spotify:track:2rwJP8OEao5y3xexw52HfD" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/7nqOGRxlXj7N2JYbgNEjYH" + }, + "href": "https://api.spotify.com/v1/artists/7nqOGRxlXj7N2JYbgNEjYH", + "id": "7nqOGRxlXj7N2JYbgNEjYH", + "name": "SEVENTEEN", + "type": "artist", + "uri": "spotify:artist:7nqOGRxlXj7N2JYbgNEjYH" + } + ], + "disc_number": 1, + "duration_ms": 162426, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/5O7UzcP9xERulidcIULOEj" + }, + "href": "https://api.spotify.com/v1/tracks/5O7UzcP9xERulidcIULOEj", + "id": "5O7UzcP9xERulidcIULOEj", + "is_local": false, + "is_playable": true, + "name": "'bout you", + "preview_url": "https://p.scdn.co/mp3-preview/8d93df687f023b8823f4125039836172712adef5?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 7, + "type": "track", + "uri": "spotify:track:5O7UzcP9xERulidcIULOEj" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/7nqOGRxlXj7N2JYbgNEjYH" + }, + "href": "https://api.spotify.com/v1/artists/7nqOGRxlXj7N2JYbgNEjYH", + "id": "7nqOGRxlXj7N2JYbgNEjYH", + "name": "SEVENTEEN", + "type": "artist", + "uri": "spotify:artist:7nqOGRxlXj7N2JYbgNEjYH" + } + ], + "disc_number": 1, + "duration_ms": 212506, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0ilwFWjTwXszzwaG3XlNWj" + }, + "href": "https://api.spotify.com/v1/tracks/0ilwFWjTwXszzwaG3XlNWj", + "id": "0ilwFWjTwXszzwaG3XlNWj", + "is_local": false, + "is_playable": true, + "name": "IF you leave me", + "preview_url": "https://p.scdn.co/mp3-preview/f2b24b29559bd9208cc39ce63515cffdd4cc8d97?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 8, + "type": "track", + "uri": "spotify:track:0ilwFWjTwXszzwaG3XlNWj" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/7nqOGRxlXj7N2JYbgNEjYH" + }, + "href": "https://api.spotify.com/v1/artists/7nqOGRxlXj7N2JYbgNEjYH", + "id": "7nqOGRxlXj7N2JYbgNEjYH", + "name": "SEVENTEEN", + "type": "artist", + "uri": "spotify:artist:7nqOGRxlXj7N2JYbgNEjYH" + } + ], + "disc_number": 1, + "duration_ms": 201653, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/5kc5p2mwO2GFq93zw5ZFWV" + }, + "href": "https://api.spotify.com/v1/tracks/5kc5p2mwO2GFq93zw5ZFWV", + "id": "5kc5p2mwO2GFq93zw5ZFWV", + "is_local": false, + "is_playable": true, + "name": "Ash", + "preview_url": "https://p.scdn.co/mp3-preview/f2476b7b28db46498b5d7da7e4962ff4b5543fd2?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 9, + "type": "track", + "uri": "spotify:track:5kc5p2mwO2GFq93zw5ZFWV" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 9 + }, + "type": "album", + "uri": "spotify:album:4lfFgz2rD1irxf7dZhNJht" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2BheKw5jNK1WGkFxCQneAM" + }, + "href": "https://api.spotify.com/v1/artists/2BheKw5jNK1WGkFxCQneAM", + "id": "2BheKw5jNK1WGkFxCQneAM", + "name": "Garden Hall", + "type": "artist", + "uri": "spotify:artist:2BheKw5jNK1WGkFxCQneAM" + } + ], + "copyrights": [ + { + "text": "Hydra Music", + "type": "C" + }, + { + "text": "Hydra Music", + "type": "P" + } + ], + "external_ids": { + "upc": "8054181010244" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/5JbXr8EuoeeXoUPpVRjD6P" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/5JbXr8EuoeeXoUPpVRjD6P", + "id": "5JbXr8EuoeeXoUPpVRjD6P", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273100bfd79de1da2d724fdf807", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02100bfd79de1da2d724fdf807", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851100bfd79de1da2d724fdf807", + "width": 64 + } + ], + "is_playable": true, + "label": "Hydra Music", + "name": "Adele", + "popularity": 4, + "release_date": "2012-12-20", + "release_date_precision": "day", + "total_tracks": 1, + "tracks": { + "href": "https://api.spotify.com/v1/albums/5JbXr8EuoeeXoUPpVRjD6P/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2BheKw5jNK1WGkFxCQneAM" + }, + "href": "https://api.spotify.com/v1/artists/2BheKw5jNK1WGkFxCQneAM", + "id": "2BheKw5jNK1WGkFxCQneAM", + "name": "Garden Hall", + "type": "artist", + "uri": "spotify:artist:2BheKw5jNK1WGkFxCQneAM" + } + ], + "disc_number": 1, + "duration_ms": 223999, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6IXHzxYc96qSEtrQ2VLDA8" + }, + "href": "https://api.spotify.com/v1/tracks/6IXHzxYc96qSEtrQ2VLDA8", + "id": "6IXHzxYc96qSEtrQ2VLDA8", + "is_local": false, + "is_playable": true, + "name": "Adele", + "preview_url": "https://p.scdn.co/mp3-preview/341854f8c178cbf534a46a156bc72fcbf70b0a96?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:6IXHzxYc96qSEtrQ2VLDA8" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 1 + }, + "type": "album", + "uri": "spotify:album:5JbXr8EuoeeXoUPpVRjD6P" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2Nw4lgqM3h54zfgeLUi1le" + }, + "href": "https://api.spotify.com/v1/artists/2Nw4lgqM3h54zfgeLUi1le", + "id": "2Nw4lgqM3h54zfgeLUi1le", + "name": "David and the Bear", + "type": "artist", + "uri": "spotify:artist:2Nw4lgqM3h54zfgeLUi1le" + } + ], + "copyrights": [ + { + "text": "2022 David and the Bear", + "type": "C" + }, + { + "text": "2022 David and the Bear", + "type": "P" + } + ], + "external_ids": { + "upc": "9353450445534" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/4GYC4XtuW9Ff8THbVAhio0" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/4GYC4XtuW9Ff8THbVAhio0", + "id": "4GYC4XtuW9Ff8THbVAhio0", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b2730181b31bccf76709b7658750", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e020181b31bccf76709b7658750", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d000048510181b31bccf76709b7658750", + "width": 64 + } + ], + "is_playable": true, + "label": "Florecilla Records", + "name": "Colores de Esperanza", + "popularity": 23, + "release_date": "2022-02-18", + "release_date_precision": "day", + "total_tracks": 1, + "tracks": { + "href": "https://api.spotify.com/v1/albums/4GYC4XtuW9Ff8THbVAhio0/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2Nw4lgqM3h54zfgeLUi1le" + }, + "href": "https://api.spotify.com/v1/artists/2Nw4lgqM3h54zfgeLUi1le", + "id": "2Nw4lgqM3h54zfgeLUi1le", + "name": "David and the Bear", + "type": "artist", + "uri": "spotify:artist:2Nw4lgqM3h54zfgeLUi1le" + } + ], + "disc_number": 1, + "duration_ms": 164503, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6KOIANoQQwJfJeO1qMnCgA" + }, + "href": "https://api.spotify.com/v1/tracks/6KOIANoQQwJfJeO1qMnCgA", + "id": "6KOIANoQQwJfJeO1qMnCgA", + "is_local": false, + "is_playable": true, + "name": "Colores de Esperanza", + "preview_url": "https://p.scdn.co/mp3-preview/e6390340adc48b4c03746627f96dfd1ec03c20bc?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:6KOIANoQQwJfJeO1qMnCgA" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 1 + }, + "type": "album", + "uri": "spotify:album:4GYC4XtuW9Ff8THbVAhio0" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1x5xa7NxUzteNg0EUvw5Uj" + }, + "href": "https://api.spotify.com/v1/artists/1x5xa7NxUzteNg0EUvw5Uj", + "id": "1x5xa7NxUzteNg0EUvw5Uj", + "name": "Valeria Pintile", + "type": "artist", + "uri": "spotify:artist:1x5xa7NxUzteNg0EUvw5Uj" + } + ], + "copyrights": [ + { + "text": "2023 Poreniac Disqs", + "type": "C" + }, + { + "text": "2023 Poreniac Disqs", + "type": "P" + } + ], + "external_ids": { + "upc": "8720923604131" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/4j3SmMhdfe5CqfCqsOeJkl" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/4j3SmMhdfe5CqfCqsOeJkl", + "id": "4j3SmMhdfe5CqfCqsOeJkl", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b2730175d5b7c75e6251862363e9", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e020175d5b7c75e6251862363e9", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d000048510175d5b7c75e6251862363e9", + "width": 64 + } + ], + "is_playable": true, + "label": "Poreniac Disqs", + "name": "Matterello", + "popularity": 56, + "release_date": "2023-04-21", + "release_date_precision": "day", + "total_tracks": 1, + "tracks": { + "href": "https://api.spotify.com/v1/albums/4j3SmMhdfe5CqfCqsOeJkl/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1x5xa7NxUzteNg0EUvw5Uj" + }, + "href": "https://api.spotify.com/v1/artists/1x5xa7NxUzteNg0EUvw5Uj", + "id": "1x5xa7NxUzteNg0EUvw5Uj", + "name": "Valeria Pintile", + "type": "artist", + "uri": "spotify:artist:1x5xa7NxUzteNg0EUvw5Uj" + } + ], + "disc_number": 1, + "duration_ms": 170122, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1fBfm3eA3qgQvJlT4VPwjC" + }, + "href": "https://api.spotify.com/v1/tracks/1fBfm3eA3qgQvJlT4VPwjC", + "id": "1fBfm3eA3qgQvJlT4VPwjC", + "is_local": false, + "is_playable": true, + "name": "Matterello", + "preview_url": "https://p.scdn.co/mp3-preview/53061837e492c07b2abc5510e520523cf0eae332?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:1fBfm3eA3qgQvJlT4VPwjC" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 1 + }, + "type": "album", + "uri": "spotify:album:4j3SmMhdfe5CqfCqsOeJkl" + }, + { + "album_type": "album", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5nP8x4uEFjAAmDzwOEc9b8" + }, + "href": "https://api.spotify.com/v1/artists/5nP8x4uEFjAAmDzwOEc9b8", + "id": "5nP8x4uEFjAAmDzwOEc9b8", + "name": "Matuê", + "type": "artist", + "uri": "spotify:artist:5nP8x4uEFjAAmDzwOEc9b8" + } + ], + "copyrights": [ + { + "text": "(P) 2020 Sony Music Entertainment Brasil ltda. sob licença exclusiva de 30PRAUM Agenciamento e Produção.", + "type": "P" + } + ], + "external_ids": { + "upc": "886448633846" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/6ehm0SMBBoSxH8oSrFXre6" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/6ehm0SMBBoSxH8oSrFXre6", + "id": "6ehm0SMBBoSxH8oSrFXre6", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273eaf3178d5ebb408fab56f6b8", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02eaf3178d5ebb408fab56f6b8", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851eaf3178d5ebb408fab56f6b8", + "width": 64 + } + ], + "is_playable": true, + "label": "Sony Music Entertainment", + "name": "Máquina do Tempo", + "popularity": 78, + "release_date": "2020-09-10", + "release_date_precision": "day", + "total_tracks": 7, + "tracks": { + "href": "https://api.spotify.com/v1/albums/6ehm0SMBBoSxH8oSrFXre6/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5nP8x4uEFjAAmDzwOEc9b8" + }, + "href": "https://api.spotify.com/v1/artists/5nP8x4uEFjAAmDzwOEc9b8", + "id": "5nP8x4uEFjAAmDzwOEc9b8", + "name": "Matuê", + "type": "artist", + "uri": "spotify:artist:5nP8x4uEFjAAmDzwOEc9b8" + } + ], + "disc_number": 1, + "duration_ms": 120000, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/5T6mY3sQbvVfLnertXdoST" + }, + "href": "https://api.spotify.com/v1/tracks/5T6mY3sQbvVfLnertXdoST", + "id": "5T6mY3sQbvVfLnertXdoST", + "is_local": false, + "is_playable": true, + "name": "Cogulândia", + "preview_url": "https://p.scdn.co/mp3-preview/0409d0659560c80587ad9fe473e868557b8eae7d?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:5T6mY3sQbvVfLnertXdoST" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5nP8x4uEFjAAmDzwOEc9b8" + }, + "href": "https://api.spotify.com/v1/artists/5nP8x4uEFjAAmDzwOEc9b8", + "id": "5nP8x4uEFjAAmDzwOEc9b8", + "name": "Matuê", + "type": "artist", + "uri": "spotify:artist:5nP8x4uEFjAAmDzwOEc9b8" + } + ], + "disc_number": 1, + "duration_ms": 169092, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/2XymTaHTrQWDEuSyhfZvqF" + }, + "href": "https://api.spotify.com/v1/tracks/2XymTaHTrQWDEuSyhfZvqF", + "id": "2XymTaHTrQWDEuSyhfZvqF", + "is_local": false, + "is_playable": true, + "name": "Antes", + "preview_url": "https://p.scdn.co/mp3-preview/8d991901c95f7e9a60edb3ca4b818b1f88ea1bf3?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 2, + "type": "track", + "uri": "spotify:track:2XymTaHTrQWDEuSyhfZvqF" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5nP8x4uEFjAAmDzwOEc9b8" + }, + "href": "https://api.spotify.com/v1/artists/5nP8x4uEFjAAmDzwOEc9b8", + "id": "5nP8x4uEFjAAmDzwOEc9b8", + "name": "Matuê", + "type": "artist", + "uri": "spotify:artist:5nP8x4uEFjAAmDzwOEc9b8" + } + ], + "disc_number": 1, + "duration_ms": 165336, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/0bV0LtjtZH76gD0ujPYS3n" + }, + "href": "https://api.spotify.com/v1/tracks/0bV0LtjtZH76gD0ujPYS3n", + "id": "0bV0LtjtZH76gD0ujPYS3n", + "is_local": false, + "is_playable": true, + "name": "Gorilla Roxo", + "preview_url": "https://p.scdn.co/mp3-preview/b96a336d23d3d6bd5faedf1c50019057b8f6841b?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 3, + "type": "track", + "uri": "spotify:track:0bV0LtjtZH76gD0ujPYS3n" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5nP8x4uEFjAAmDzwOEc9b8" + }, + "href": "https://api.spotify.com/v1/artists/5nP8x4uEFjAAmDzwOEc9b8", + "id": "5nP8x4uEFjAAmDzwOEc9b8", + "name": "Matuê", + "type": "artist", + "uri": "spotify:artist:5nP8x4uEFjAAmDzwOEc9b8" + } + ], + "disc_number": 1, + "duration_ms": 165789, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/4OfKTnuccYFO1xxF4tCvRE" + }, + "href": "https://api.spotify.com/v1/tracks/4OfKTnuccYFO1xxF4tCvRE", + "id": "4OfKTnuccYFO1xxF4tCvRE", + "is_local": false, + "is_playable": true, + "name": "Vem Chapar", + "preview_url": "https://p.scdn.co/mp3-preview/741cbd5ec24bfc4e14cd2a7d8d0c80c404a4f791?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 4, + "type": "track", + "uri": "spotify:track:4OfKTnuccYFO1xxF4tCvRE" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5nP8x4uEFjAAmDzwOEc9b8" + }, + "href": "https://api.spotify.com/v1/artists/5nP8x4uEFjAAmDzwOEc9b8", + "id": "5nP8x4uEFjAAmDzwOEc9b8", + "name": "Matuê", + "type": "artist", + "uri": "spotify:artist:5nP8x4uEFjAAmDzwOEc9b8" + } + ], + "disc_number": 1, + "duration_ms": 164000, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/3sGcETRMuAgcPgjDpIkgMn" + }, + "href": "https://api.spotify.com/v1/tracks/3sGcETRMuAgcPgjDpIkgMn", + "id": "3sGcETRMuAgcPgjDpIkgMn", + "is_local": false, + "is_playable": true, + "name": "777-666", + "preview_url": "https://p.scdn.co/mp3-preview/b3978fbb5b7eec0167a638cf4ddc3f2f7676fa90?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 5, + "type": "track", + "uri": "spotify:track:3sGcETRMuAgcPgjDpIkgMn" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5nP8x4uEFjAAmDzwOEc9b8" + }, + "href": "https://api.spotify.com/v1/artists/5nP8x4uEFjAAmDzwOEc9b8", + "id": "5nP8x4uEFjAAmDzwOEc9b8", + "name": "Matuê", + "type": "artist", + "uri": "spotify:artist:5nP8x4uEFjAAmDzwOEc9b8" + } + ], + "disc_number": 1, + "duration_ms": 157687, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/2c80HnIOPMmQQVQllQEWb5" + }, + "href": "https://api.spotify.com/v1/tracks/2c80HnIOPMmQQVQllQEWb5", + "id": "2c80HnIOPMmQQVQllQEWb5", + "is_local": false, + "is_playable": true, + "name": "É Sal", + "preview_url": "https://p.scdn.co/mp3-preview/07c8396e8613725a6003065f9e95f5767adb629e?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 6, + "type": "track", + "uri": "spotify:track:2c80HnIOPMmQQVQllQEWb5" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5nP8x4uEFjAAmDzwOEc9b8" + }, + "href": "https://api.spotify.com/v1/artists/5nP8x4uEFjAAmDzwOEc9b8", + "id": "5nP8x4uEFjAAmDzwOEc9b8", + "name": "Matuê", + "type": "artist", + "uri": "spotify:artist:5nP8x4uEFjAAmDzwOEc9b8" + } + ], + "disc_number": 1, + "duration_ms": 230400, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/5oI9blwsXC8AkTWw6wASY8" + }, + "href": "https://api.spotify.com/v1/tracks/5oI9blwsXC8AkTWw6wASY8", + "id": "5oI9blwsXC8AkTWw6wASY8", + "is_local": false, + "is_playable": true, + "name": "Máquina do Tempo", + "preview_url": "https://p.scdn.co/mp3-preview/e23efd82bed73c1a538fd2396ede6292da8d92dd?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 7, + "type": "track", + "uri": "spotify:track:5oI9blwsXC8AkTWw6wASY8" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 7 + }, + "type": "album", + "uri": "spotify:album:6ehm0SMBBoSxH8oSrFXre6" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5nP8x4uEFjAAmDzwOEc9b8" + }, + "href": "https://api.spotify.com/v1/artists/5nP8x4uEFjAAmDzwOEc9b8", + "id": "5nP8x4uEFjAAmDzwOEc9b8", + "name": "Matuê", + "type": "artist", + "uri": "spotify:artist:5nP8x4uEFjAAmDzwOEc9b8" + } + ], + "copyrights": [ + { + "text": "(C) 2017 Matuê", + "type": "C" + }, + { + "text": "(P) 2017 Matuê", + "type": "P" + } + ], + "external_ids": { + "upc": "7898630310407" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/2NtkW7FT1VdKVjGXhLKp9k" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/2NtkW7FT1VdKVjGXhLKp9k", + "id": "2NtkW7FT1VdKVjGXhLKp9k", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273cab547ed80855f5336b60d83", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02cab547ed80855f5336b60d83", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851cab547ed80855f5336b60d83", + "width": 64 + } + ], + "is_playable": true, + "label": "Matuê", + "name": "Anos Luz", + "popularity": 66, + "release_date": "2017-11-10", + "release_date_precision": "day", + "total_tracks": 1, + "tracks": { + "href": "https://api.spotify.com/v1/albums/2NtkW7FT1VdKVjGXhLKp9k/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5nP8x4uEFjAAmDzwOEc9b8" + }, + "href": "https://api.spotify.com/v1/artists/5nP8x4uEFjAAmDzwOEc9b8", + "id": "5nP8x4uEFjAAmDzwOEc9b8", + "name": "Matuê", + "type": "artist", + "uri": "spotify:artist:5nP8x4uEFjAAmDzwOEc9b8" + } + ], + "disc_number": 1, + "duration_ms": 264035, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0GYPcKDlsb8WEtJkkKdtgH" + }, + "href": "https://api.spotify.com/v1/tracks/0GYPcKDlsb8WEtJkkKdtgH", + "id": "0GYPcKDlsb8WEtJkkKdtgH", + "is_local": false, + "is_playable": true, + "name": "Anos Luz", + "preview_url": "https://p.scdn.co/mp3-preview/df3df2dc829581cc7b1b6cb0d45041e00e84bf54?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:0GYPcKDlsb8WEtJkkKdtgH" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 1 + }, + "type": "album", + "uri": "spotify:album:2NtkW7FT1VdKVjGXhLKp9k" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5bYwZAV9K923kEHW1Yhol5" + }, + "href": "https://api.spotify.com/v1/artists/5bYwZAV9K923kEHW1Yhol5", + "id": "5bYwZAV9K923kEHW1Yhol5", + "name": "Ruben Wan", + "type": "artist", + "uri": "spotify:artist:5bYwZAV9K923kEHW1Yhol5" + } + ], + "copyrights": [ + { + "text": "2022 Wan Nation", + "type": "C" + }, + { + "text": "2022 Wan Nation", + "type": "P" + } + ], + "external_ids": { + "upc": "197047393155" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/7jdwPZkhhSRrO3vEqgO28L" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/7jdwPZkhhSRrO3vEqgO28L", + "id": "7jdwPZkhhSRrO3vEqgO28L", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273a66e0a7eba42ae481001ce5c", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02a66e0a7eba42ae481001ce5c", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851a66e0a7eba42ae481001ce5c", + "width": 64 + } + ], + "is_playable": true, + "label": "Wan Nation", + "name": "Colores (Guitar Version)", + "popularity": 13, + "release_date": "2022-07-15", + "release_date_precision": "day", + "total_tracks": 1, + "tracks": { + "href": "https://api.spotify.com/v1/albums/7jdwPZkhhSRrO3vEqgO28L/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5bYwZAV9K923kEHW1Yhol5" + }, + "href": "https://api.spotify.com/v1/artists/5bYwZAV9K923kEHW1Yhol5", + "id": "5bYwZAV9K923kEHW1Yhol5", + "name": "Ruben Wan", + "type": "artist", + "uri": "spotify:artist:5bYwZAV9K923kEHW1Yhol5" + } + ], + "disc_number": 1, + "duration_ms": 199743, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1dZvk699NLhTzzi4ChO1Fo" + }, + "href": "https://api.spotify.com/v1/tracks/1dZvk699NLhTzzi4ChO1Fo", + "id": "1dZvk699NLhTzzi4ChO1Fo", + "is_local": false, + "is_playable": true, + "name": "Colores - Guitar Version", + "preview_url": "https://p.scdn.co/mp3-preview/c81c10383dbd182f792c465900acdabd6a7202b0?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:1dZvk699NLhTzzi4ChO1Fo" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 1 + }, + "type": "album", + "uri": "spotify:album:7jdwPZkhhSRrO3vEqgO28L" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5nP8x4uEFjAAmDzwOEc9b8" + }, + "href": "https://api.spotify.com/v1/artists/5nP8x4uEFjAAmDzwOEc9b8", + "id": "5nP8x4uEFjAAmDzwOEc9b8", + "name": "Matuê", + "type": "artist", + "uri": "spotify:artist:5nP8x4uEFjAAmDzwOEc9b8" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3MrDVzg7ZXaYMyQmbDInr7" + }, + "href": "https://api.spotify.com/v1/artists/3MrDVzg7ZXaYMyQmbDInr7", + "id": "3MrDVzg7ZXaYMyQmbDInr7", + "name": "WIU", + "type": "artist", + "uri": "spotify:artist:3MrDVzg7ZXaYMyQmbDInr7" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/68YeXpLt3jB7JHQS5ZjMGo" + }, + "href": "https://api.spotify.com/v1/artists/68YeXpLt3jB7JHQS5ZjMGo", + "id": "68YeXpLt3jB7JHQS5ZjMGo", + "name": "Teto", + "type": "artist", + "uri": "spotify:artist:68YeXpLt3jB7JHQS5ZjMGo" + } + ], + "copyrights": [ + { + "text": "(P) 2022 Sony Music Entertainment Brasil ltda. sob licença exclusiva de 30PRAUM Agenciamento e Produção.", + "type": "P" + } + ], + "external_ids": { + "upc": "886449853229" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/2Czm8l03F67WEzX8MDruyy" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/2Czm8l03F67WEzX8MDruyy", + "id": "2Czm8l03F67WEzX8MDruyy", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273b0cd9991ea7465bac51e9a94", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02b0cd9991ea7465bac51e9a94", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851b0cd9991ea7465bac51e9a94", + "width": 64 + } + ], + "is_playable": true, + "label": "Sony Music Entertainment", + "name": "Vampiro", + "popularity": 71, + "release_date": "2022-03-29", + "release_date_precision": "day", + "total_tracks": 1, + "tracks": { + "href": "https://api.spotify.com/v1/albums/2Czm8l03F67WEzX8MDruyy/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5nP8x4uEFjAAmDzwOEc9b8" + }, + "href": "https://api.spotify.com/v1/artists/5nP8x4uEFjAAmDzwOEc9b8", + "id": "5nP8x4uEFjAAmDzwOEc9b8", + "name": "Matuê", + "type": "artist", + "uri": "spotify:artist:5nP8x4uEFjAAmDzwOEc9b8" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3MrDVzg7ZXaYMyQmbDInr7" + }, + "href": "https://api.spotify.com/v1/artists/3MrDVzg7ZXaYMyQmbDInr7", + "id": "3MrDVzg7ZXaYMyQmbDInr7", + "name": "WIU", + "type": "artist", + "uri": "spotify:artist:3MrDVzg7ZXaYMyQmbDInr7" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/68YeXpLt3jB7JHQS5ZjMGo" + }, + "href": "https://api.spotify.com/v1/artists/68YeXpLt3jB7JHQS5ZjMGo", + "id": "68YeXpLt3jB7JHQS5ZjMGo", + "name": "Teto", + "type": "artist", + "uri": "spotify:artist:68YeXpLt3jB7JHQS5ZjMGo" + } + ], + "disc_number": 1, + "duration_ms": 250434, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6bTdZ7xfKp3NqqADJ8HLyj" + }, + "href": "https://api.spotify.com/v1/tracks/6bTdZ7xfKp3NqqADJ8HLyj", + "id": "6bTdZ7xfKp3NqqADJ8HLyj", + "is_local": false, + "is_playable": true, + "name": "Vampiro", + "preview_url": "https://p.scdn.co/mp3-preview/c9466f8c1deecd08f40fda526d8b99cb2a875017?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:6bTdZ7xfKp3NqqADJ8HLyj" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 1 + }, + "type": "album", + "uri": "spotify:album:2Czm8l03F67WEzX8MDruyy" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1eFOTBAGM0w0SH7jnTYSd1" + }, + "href": "https://api.spotify.com/v1/artists/1eFOTBAGM0w0SH7jnTYSd1", + "id": "1eFOTBAGM0w0SH7jnTYSd1", + "name": "BLUEM", + "type": "artist", + "uri": "spotify:artist:1eFOTBAGM0w0SH7jnTYSd1" + } + ], + "copyrights": [ + { + "text": "2023 peermusic ITALY", + "type": "C" + }, + { + "text": "2023 peermusic ITALY - under exclusive license to Believe", + "type": "P" + } + ], + "external_ids": { + "upc": "3617054362656" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/4H5jQH3OFxQaxfqI6uuqGH" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/4H5jQH3OFxQaxfqI6uuqGH", + "id": "4H5jQH3OFxQaxfqI6uuqGH", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b2732737011bfb8aca7302e743c3", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e022737011bfb8aca7302e743c3", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d000048512737011bfb8aca7302e743c3", + "width": 64 + } + ], + "is_playable": true, + "label": "peermusic ITALY", + "name": "Adele", + "popularity": 33, + "release_date": "2023-01-19", + "release_date_precision": "day", + "total_tracks": 1, + "tracks": { + "href": "https://api.spotify.com/v1/albums/4H5jQH3OFxQaxfqI6uuqGH/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1eFOTBAGM0w0SH7jnTYSd1" + }, + "href": "https://api.spotify.com/v1/artists/1eFOTBAGM0w0SH7jnTYSd1", + "id": "1eFOTBAGM0w0SH7jnTYSd1", + "name": "BLUEM", + "type": "artist", + "uri": "spotify:artist:1eFOTBAGM0w0SH7jnTYSd1" + } + ], + "disc_number": 1, + "duration_ms": 185709, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2oFXROGfVUg247YtNKeQw1" + }, + "href": "https://api.spotify.com/v1/tracks/2oFXROGfVUg247YtNKeQw1", + "id": "2oFXROGfVUg247YtNKeQw1", + "is_local": false, + "is_playable": true, + "name": "Adele", + "preview_url": "https://p.scdn.co/mp3-preview/7489bdad8f11959a5d75095c5bcdba2dae33006b?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:2oFXROGfVUg247YtNKeQw1" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 1 + }, + "type": "album", + "uri": "spotify:album:4H5jQH3OFxQaxfqI6uuqGH" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5nP8x4uEFjAAmDzwOEc9b8" + }, + "href": "https://api.spotify.com/v1/artists/5nP8x4uEFjAAmDzwOEc9b8", + "id": "5nP8x4uEFjAAmDzwOEc9b8", + "name": "Matuê", + "type": "artist", + "uri": "spotify:artist:5nP8x4uEFjAAmDzwOEc9b8" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0JjPiLQNgAFaEkwoy56B1C" + }, + "href": "https://api.spotify.com/v1/artists/0JjPiLQNgAFaEkwoy56B1C", + "id": "0JjPiLQNgAFaEkwoy56B1C", + "name": "L7NNON", + "type": "artist", + "uri": "spotify:artist:0JjPiLQNgAFaEkwoy56B1C" + } + ], + "copyrights": [ + { + "text": "(P) 2021 Sony Music Entertainment Brasil ltda. sob licença exclusiva de 30PRAUM Agenciamento e Produção.", + "type": "P" + } + ], + "external_ids": { + "upc": "886449829262" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/3sQwZ1Bu0Qhzn2XeJwQW9E" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/3sQwZ1Bu0Qhzn2XeJwQW9E", + "id": "3sQwZ1Bu0Qhzn2XeJwQW9E", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b27336396e5a53d34a4033838b0d", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e0236396e5a53d34a4033838b0d", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d0000485136396e5a53d34a4033838b0d", + "width": 64 + } + ], + "is_playable": true, + "label": "Sony Music Entertainment", + "name": "Sem Dó", + "popularity": 63, + "release_date": "2021-12-30", + "release_date_precision": "day", + "total_tracks": 1, + "tracks": { + "href": "https://api.spotify.com/v1/albums/3sQwZ1Bu0Qhzn2XeJwQW9E/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5nP8x4uEFjAAmDzwOEc9b8" + }, + "href": "https://api.spotify.com/v1/artists/5nP8x4uEFjAAmDzwOEc9b8", + "id": "5nP8x4uEFjAAmDzwOEc9b8", + "name": "Matuê", + "type": "artist", + "uri": "spotify:artist:5nP8x4uEFjAAmDzwOEc9b8" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0JjPiLQNgAFaEkwoy56B1C" + }, + "href": "https://api.spotify.com/v1/artists/0JjPiLQNgAFaEkwoy56B1C", + "id": "0JjPiLQNgAFaEkwoy56B1C", + "name": "L7NNON", + "type": "artist", + "uri": "spotify:artist:0JjPiLQNgAFaEkwoy56B1C" + } + ], + "disc_number": 1, + "duration_ms": 267130, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2AQJRDfQJbfgmTf5e62Czl" + }, + "href": "https://api.spotify.com/v1/tracks/2AQJRDfQJbfgmTf5e62Czl", + "id": "2AQJRDfQJbfgmTf5e62Czl", + "is_local": false, + "is_playable": true, + "name": "Sem Dó", + "preview_url": "https://p.scdn.co/mp3-preview/ecd00093d8119abe07854e64e79863ee19aeeeb4?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:2AQJRDfQJbfgmTf5e62Czl" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 1 + }, + "type": "album", + "uri": "spotify:album:3sQwZ1Bu0Qhzn2XeJwQW9E" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0c0ZK1dn64z5zHGzqzKd21" + }, + "href": "https://api.spotify.com/v1/artists/0c0ZK1dn64z5zHGzqzKd21", + "id": "0c0ZK1dn64z5zHGzqzKd21", + "name": "Ocb Relax", + "type": "artist", + "uri": "spotify:artist:0c0ZK1dn64z5zHGzqzKd21" + } + ], + "copyrights": [ + { + "text": "2016 Ocb Relax", + "type": "C" + }, + { + "text": "2016 Ocb Relax", + "type": "P" + } + ], + "external_ids": { + "upc": "840096477030" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/5lO7Ml4oRPECDQFgkGgFFO" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/5lO7Ml4oRPECDQFgkGgFFO", + "id": "5lO7Ml4oRPECDQFgkGgFFO", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273638d6360607269b7e65e1df0", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02638d6360607269b7e65e1df0", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851638d6360607269b7e65e1df0", + "width": 64 + } + ], + "is_playable": true, + "label": "Ocb Relax", + "name": "Adele", + "popularity": 8, + "release_date": "2016-06-03", + "release_date_precision": "day", + "total_tracks": 1, + "tracks": { + "href": "https://api.spotify.com/v1/albums/5lO7Ml4oRPECDQFgkGgFFO/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0c0ZK1dn64z5zHGzqzKd21" + }, + "href": "https://api.spotify.com/v1/artists/0c0ZK1dn64z5zHGzqzKd21", + "id": "0c0ZK1dn64z5zHGzqzKd21", + "name": "Ocb Relax", + "type": "artist", + "uri": "spotify:artist:0c0ZK1dn64z5zHGzqzKd21" + } + ], + "disc_number": 1, + "duration_ms": 235785, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2RVyxzxisZbGDAgxrX0uAw" + }, + "href": "https://api.spotify.com/v1/tracks/2RVyxzxisZbGDAgxrX0uAw", + "id": "2RVyxzxisZbGDAgxrX0uAw", + "is_local": false, + "is_playable": true, + "name": "Adele", + "preview_url": "https://p.scdn.co/mp3-preview/cdc064199c7a3bbe942c9db478ace6e757c2f17b?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:2RVyxzxisZbGDAgxrX0uAw" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 1 + }, + "type": "album", + "uri": "spotify:album:5lO7Ml4oRPECDQFgkGgFFO" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/7y4breKexfBWgdyMgHMEHK" + }, + "href": "https://api.spotify.com/v1/artists/7y4breKexfBWgdyMgHMEHK", + "id": "7y4breKexfBWgdyMgHMEHK", + "name": "Kareful", + "type": "artist", + "uri": "spotify:artist:7y4breKexfBWgdyMgHMEHK" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3btewOJD9jMKKrn5IV7nFj" + }, + "href": "https://api.spotify.com/v1/artists/3btewOJD9jMKKrn5IV7nFj", + "id": "3btewOJD9jMKKrn5IV7nFj", + "name": "Mannequin", + "type": "artist", + "uri": "spotify:artist:3btewOJD9jMKKrn5IV7nFj" + } + ], + "copyrights": [ + { + "text": "2023 Liquid Ritual", + "type": "C" + }, + { + "text": "2023 Copyright Control", + "type": "P" + } + ], + "external_ids": { + "upc": "5054287186440" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/6H3RNHYcEZrISxZUXvZEUu" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/6H3RNHYcEZrISxZUXvZEUu", + "id": "6H3RNHYcEZrISxZUXvZEUu", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b27354c3d4b46f5accfe94db3580", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e0254c3d4b46f5accfe94db3580", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d0000485154c3d4b46f5accfe94db3580", + "width": 64 + } + ], + "is_playable": true, + "label": "Liquid Ritual", + "name": "Adele", + "popularity": 20, + "release_date": "2023-03-10", + "release_date_precision": "day", + "total_tracks": 1, + "tracks": { + "href": "https://api.spotify.com/v1/albums/6H3RNHYcEZrISxZUXvZEUu/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/7y4breKexfBWgdyMgHMEHK" + }, + "href": "https://api.spotify.com/v1/artists/7y4breKexfBWgdyMgHMEHK", + "id": "7y4breKexfBWgdyMgHMEHK", + "name": "Kareful", + "type": "artist", + "uri": "spotify:artist:7y4breKexfBWgdyMgHMEHK" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3btewOJD9jMKKrn5IV7nFj" + }, + "href": "https://api.spotify.com/v1/artists/3btewOJD9jMKKrn5IV7nFj", + "id": "3btewOJD9jMKKrn5IV7nFj", + "name": "Mannequin", + "type": "artist", + "uri": "spotify:artist:3btewOJD9jMKKrn5IV7nFj" + } + ], + "disc_number": 1, + "duration_ms": 218181, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3InrX4tDKOEuFDYEpIKn0K" + }, + "href": "https://api.spotify.com/v1/tracks/3InrX4tDKOEuFDYEpIKn0K", + "id": "3InrX4tDKOEuFDYEpIKn0K", + "is_local": false, + "is_playable": true, + "name": "Adele", + "preview_url": "https://p.scdn.co/mp3-preview/d24db8b3f30b72e7be9e1d94ce069dae194ef1c5?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:3InrX4tDKOEuFDYEpIKn0K" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 1 + }, + "type": "album", + "uri": "spotify:album:6H3RNHYcEZrISxZUXvZEUu" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3OpRnlSbpcupWDmKBcBq9E" + }, + "href": "https://api.spotify.com/v1/artists/3OpRnlSbpcupWDmKBcBq9E", + "id": "3OpRnlSbpcupWDmKBcBq9E", + "name": "Dania y Jimena", + "type": "artist", + "uri": "spotify:artist:3OpRnlSbpcupWDmKBcBq9E" + } + ], + "copyrights": [ + { + "text": "2023 Dania y Jimena; Under Exclusive License to Morphe Records", + "type": "C" + }, + { + "text": "2023 Dania y Jimena; Under Exclusive License to Morphe Records", + "type": "P" + } + ], + "external_ids": { + "upc": "656464940750" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/5HCVPmxLoGQdYjKjsSoN13" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/5HCVPmxLoGQdYjKjsSoN13", + "id": "5HCVPmxLoGQdYjKjsSoN13", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b27391dc1e216795c192e552f78e", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e0291dc1e216795c192e552f78e", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d0000485191dc1e216795c192e552f78e", + "width": 64 + } + ], + "is_playable": true, + "label": "Morphe Records", + "name": "Colores", + "popularity": 18, + "release_date": "2023-05-25", + "release_date_precision": "day", + "total_tracks": 1, + "tracks": { + "href": "https://api.spotify.com/v1/albums/5HCVPmxLoGQdYjKjsSoN13/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3OpRnlSbpcupWDmKBcBq9E" + }, + "href": "https://api.spotify.com/v1/artists/3OpRnlSbpcupWDmKBcBq9E", + "id": "3OpRnlSbpcupWDmKBcBq9E", + "name": "Dania y Jimena", + "type": "artist", + "uri": "spotify:artist:3OpRnlSbpcupWDmKBcBq9E" + } + ], + "disc_number": 1, + "duration_ms": 201600, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1QgItNonjeqZhjzcV078Ia" + }, + "href": "https://api.spotify.com/v1/tracks/1QgItNonjeqZhjzcV078Ia", + "id": "1QgItNonjeqZhjzcV078Ia", + "is_local": false, + "is_playable": true, + "name": "Colores", + "preview_url": "https://p.scdn.co/mp3-preview/2e85edafaf5f8c1cd2948b64fd3f18d243feaa7e?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:1QgItNonjeqZhjzcV078Ia" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 1 + }, + "type": "album", + "uri": "spotify:album:5HCVPmxLoGQdYjKjsSoN13" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4yqOAubTlVvTHMErgiuG0i" + }, + "href": "https://api.spotify.com/v1/artists/4yqOAubTlVvTHMErgiuG0i", + "id": "4yqOAubTlVvTHMErgiuG0i", + "name": "ZiCupi978", + "type": "artist", + "uri": "spotify:artist:4yqOAubTlVvTHMErgiuG0i" + } + ], + "copyrights": [ + { + "text": "2023 3108572 Records DK", + "type": "C" + }, + { + "text": "2023 3108572 Records DK", + "type": "P" + } + ], + "external_ids": { + "upc": "197632628075" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/7DoP1lguY13PJZAcRqNffP" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/7DoP1lguY13PJZAcRqNffP", + "id": "7DoP1lguY13PJZAcRqNffP", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273f41e0d06b0f770ed5613ff49", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02f41e0d06b0f770ed5613ff49", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851f41e0d06b0f770ed5613ff49", + "width": 64 + } + ], + "is_playable": true, + "label": "3108572 Records DK", + "name": "Colores Cool", + "popularity": 12, + "release_date": "2021-06-06", + "release_date_precision": "day", + "total_tracks": 3, + "tracks": { + "href": "https://api.spotify.com/v1/albums/7DoP1lguY13PJZAcRqNffP/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4yqOAubTlVvTHMErgiuG0i" + }, + "href": "https://api.spotify.com/v1/artists/4yqOAubTlVvTHMErgiuG0i", + "id": "4yqOAubTlVvTHMErgiuG0i", + "name": "ZiCupi978", + "type": "artist", + "uri": "spotify:artist:4yqOAubTlVvTHMErgiuG0i" + } + ], + "disc_number": 1, + "duration_ms": 141355, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/706FObdxc9lvWSaLik857W" + }, + "href": "https://api.spotify.com/v1/tracks/706FObdxc9lvWSaLik857W", + "id": "706FObdxc9lvWSaLik857W", + "is_local": false, + "is_playable": true, + "name": "Melodía Cool", + "preview_url": "https://p.scdn.co/mp3-preview/e43070ff6a9ab51472090e60b01e53e5d0924160?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:706FObdxc9lvWSaLik857W" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4yqOAubTlVvTHMErgiuG0i" + }, + "href": "https://api.spotify.com/v1/artists/4yqOAubTlVvTHMErgiuG0i", + "id": "4yqOAubTlVvTHMErgiuG0i", + "name": "ZiCupi978", + "type": "artist", + "uri": "spotify:artist:4yqOAubTlVvTHMErgiuG0i" + } + ], + "disc_number": 1, + "duration_ms": 159379, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1PGEIAHIoMq8MowVV6mlsn" + }, + "href": "https://api.spotify.com/v1/tracks/1PGEIAHIoMq8MowVV6mlsn", + "id": "1PGEIAHIoMq8MowVV6mlsn", + "is_local": false, + "is_playable": true, + "name": "Error Cool", + "preview_url": "https://p.scdn.co/mp3-preview/901e4809a3046a595625a81771e30f1772ffccc6?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 2, + "type": "track", + "uri": "spotify:track:1PGEIAHIoMq8MowVV6mlsn" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4yqOAubTlVvTHMErgiuG0i" + }, + "href": "https://api.spotify.com/v1/artists/4yqOAubTlVvTHMErgiuG0i", + "id": "4yqOAubTlVvTHMErgiuG0i", + "name": "ZiCupi978", + "type": "artist", + "uri": "spotify:artist:4yqOAubTlVvTHMErgiuG0i" + } + ], + "disc_number": 1, + "duration_ms": 175653, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6pYpHCAzwbf6TORekUXGHQ" + }, + "href": "https://api.spotify.com/v1/tracks/6pYpHCAzwbf6TORekUXGHQ", + "id": "6pYpHCAzwbf6TORekUXGHQ", + "is_local": false, + "is_playable": true, + "name": "Gente Cool", + "preview_url": "https://p.scdn.co/mp3-preview/68a66b4ff88cbed5959353df3fffe5298e18866f?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 3, + "type": "track", + "uri": "spotify:track:6pYpHCAzwbf6TORekUXGHQ" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 3 + }, + "type": "album", + "uri": "spotify:album:7DoP1lguY13PJZAcRqNffP" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/15S6E4gXmFAM4hGFLua0BT" + }, + "href": "https://api.spotify.com/v1/artists/15S6E4gXmFAM4hGFLua0BT", + "id": "15S6E4gXmFAM4hGFLua0BT", + "name": "Fer Bustillo", + "type": "artist", + "uri": "spotify:artist:15S6E4gXmFAM4hGFLua0BT" + } + ], + "copyrights": [ + { + "text": "2023 Fer Bustillo", + "type": "C" + }, + { + "text": "2023 Fer Bustillo", + "type": "P" + } + ], + "external_ids": { + "upc": "197686859425" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/5tFFY06UUpbaBekWQ6GrAX" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/5tFFY06UUpbaBekWQ6GrAX", + "id": "5tFFY06UUpbaBekWQ6GrAX", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b27388123398a9132146ebc2ead0", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e0288123398a9132146ebc2ead0", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d0000485188123398a9132146ebc2ead0", + "width": 64 + } + ], + "is_playable": true, + "label": "5061924 Records DK2", + "name": "COLORES", + "popularity": 22, + "release_date": "2023-03-25", + "release_date_precision": "day", + "total_tracks": 1, + "tracks": { + "href": "https://api.spotify.com/v1/albums/5tFFY06UUpbaBekWQ6GrAX/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/15S6E4gXmFAM4hGFLua0BT" + }, + "href": "https://api.spotify.com/v1/artists/15S6E4gXmFAM4hGFLua0BT", + "id": "15S6E4gXmFAM4hGFLua0BT", + "name": "Fer Bustillo", + "type": "artist", + "uri": "spotify:artist:15S6E4gXmFAM4hGFLua0BT" + } + ], + "disc_number": 1, + "duration_ms": 184320, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3Z617WHC8PFT30EmBuEh9R" + }, + "href": "https://api.spotify.com/v1/tracks/3Z617WHC8PFT30EmBuEh9R", + "id": "3Z617WHC8PFT30EmBuEh9R", + "is_local": false, + "is_playable": true, + "name": "COLORES", + "preview_url": "https://p.scdn.co/mp3-preview/d798df02e065b2e61369815db9c298b51fcade7e?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:3Z617WHC8PFT30EmBuEh9R" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 1 + }, + "type": "album", + "uri": "spotify:album:5tFFY06UUpbaBekWQ6GrAX" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3Fcvp26KmQKXthtNUfQcLx" + }, + "href": "https://api.spotify.com/v1/artists/3Fcvp26KmQKXthtNUfQcLx", + "id": "3Fcvp26KmQKXthtNUfQcLx", + "name": "The Hits Produtora", + "type": "artist", + "uri": "spotify:artist:3Fcvp26KmQKXthtNUfQcLx" + } + ], + "copyrights": [ + { + "text": "2021 MIRANT BEATS", + "type": "C" + }, + { + "text": "2021 MIRANT BEATS", + "type": "P" + } + ], + "external_ids": { + "upc": "024543557814" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/2l6yYOMv6xihoTI1wIgEy1" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/2l6yYOMv6xihoTI1wIgEy1", + "id": "2l6yYOMv6xihoTI1wIgEy1", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b27351b6d1e563a39d68a8b6883f", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e0251b6d1e563a39d68a8b6883f", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d0000485151b6d1e563a39d68a8b6883f", + "width": 64 + } + ], + "is_playable": true, + "label": "MIRANT BEATS", + "name": "Matuê x Yunk Vino x Type Beat x Freestyle Beats", + "popularity": 6, + "release_date": "2021-04-13", + "release_date_precision": "day", + "total_tracks": 1, + "tracks": { + "href": "https://api.spotify.com/v1/albums/2l6yYOMv6xihoTI1wIgEy1/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3Fcvp26KmQKXthtNUfQcLx" + }, + "href": "https://api.spotify.com/v1/artists/3Fcvp26KmQKXthtNUfQcLx", + "id": "3Fcvp26KmQKXthtNUfQcLx", + "name": "The Hits Produtora", + "type": "artist", + "uri": "spotify:artist:3Fcvp26KmQKXthtNUfQcLx" + } + ], + "disc_number": 1, + "duration_ms": 168600, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1OA2QMpBHTvXSIUUGZ2HlF" + }, + "href": "https://api.spotify.com/v1/tracks/1OA2QMpBHTvXSIUUGZ2HlF", + "id": "1OA2QMpBHTvXSIUUGZ2HlF", + "is_local": false, + "is_playable": true, + "name": "Matuê x Yunk Vino x Type Beat x Freestyle Beats", + "preview_url": "https://p.scdn.co/mp3-preview/a534a23801f99e13e76f3befac45b9546c1cfa91?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:1OA2QMpBHTvXSIUUGZ2HlF" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 1 + }, + "type": "album", + "uri": "spotify:album:2l6yYOMv6xihoTI1wIgEy1" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0KrtmJgSqnT9UpP7LBCN3b" + }, + "href": "https://api.spotify.com/v1/artists/0KrtmJgSqnT9UpP7LBCN3b", + "id": "0KrtmJgSqnT9UpP7LBCN3b", + "name": "Matue 085", + "type": "artist", + "uri": "spotify:artist:0KrtmJgSqnT9UpP7LBCN3b" + } + ], + "copyrights": [ + { + "text": "2023 Drew cabeçudo delas 7", + "type": "C" + }, + { + "text": "2023 Drew cabeçudo delas 7", + "type": "P" + } + ], + "external_ids": { + "upc": "718114831990" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/70ZQf45tM8d02z6SyQsqqX" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/70ZQf45tM8d02z6SyQsqqX", + "id": "70ZQf45tM8d02z6SyQsqqX", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273e53c7cd8d407db403ed555bc", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02e53c7cd8d407db403ed555bc", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851e53c7cd8d407db403ed555bc", + "width": 64 + } + ], + "is_playable": true, + "label": "Drew cabeçudo delas 7", + "name": "Filho da Noite", + "popularity": 15, + "release_date": "2023-06-03", + "release_date_precision": "day", + "total_tracks": 1, + "tracks": { + "href": "https://api.spotify.com/v1/albums/70ZQf45tM8d02z6SyQsqqX/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0KrtmJgSqnT9UpP7LBCN3b" + }, + "href": "https://api.spotify.com/v1/artists/0KrtmJgSqnT9UpP7LBCN3b", + "id": "0KrtmJgSqnT9UpP7LBCN3b", + "name": "Matue 085", + "type": "artist", + "uri": "spotify:artist:0KrtmJgSqnT9UpP7LBCN3b" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4CnGkTkaV3pC9pOXpt3iUh" + }, + "href": "https://api.spotify.com/v1/artists/4CnGkTkaV3pC9pOXpt3iUh", + "id": "4CnGkTkaV3pC9pOXpt3iUh", + "name": "Ryan Sp tubarão", + "type": "artist", + "uri": "spotify:artist:4CnGkTkaV3pC9pOXpt3iUh" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/6Ee1rYXrvFpNQZ9ma6NkTg" + }, + "href": "https://api.spotify.com/v1/artists/6Ee1rYXrvFpNQZ9ma6NkTg", + "id": "6Ee1rYXrvFpNQZ9ma6NkTg", + "name": "Chefin 23", + "type": "artist", + "uri": "spotify:artist:6Ee1rYXrvFpNQZ9ma6NkTg" + } + ], + "disc_number": 1, + "duration_ms": 272535, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/0QM7Icxowa1x0DPViYkqJD" + }, + "href": "https://api.spotify.com/v1/tracks/0QM7Icxowa1x0DPViYkqJD", + "id": "0QM7Icxowa1x0DPViYkqJD", + "is_local": false, + "is_playable": true, + "name": "Filho da Noite", + "preview_url": "https://p.scdn.co/mp3-preview/99522e656c35c71cbef34ac86bcc7865ebf6c730?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:0QM7Icxowa1x0DPViYkqJD" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 1 + }, + "type": "album", + "uri": "spotify:album:70ZQf45tM8d02z6SyQsqqX" + }, + { + "album_type": "album", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "copyrights": [ + { + "text": "2022 Loewe Verlag GmbH", + "type": "P" + } + ], + "external_ids": { + "upc": "4066338502001" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/4Lfbq6TFHW6pLn9Bh2WrT0" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/4Lfbq6TFHW6pLn9Bh2WrT0", + "id": "4Lfbq6TFHW6pLn9Bh2WrT0", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b2731df65da1c8b082bb72ba2540", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e021df65da1c8b082bb72ba2540", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d000048511df65da1c8b082bb72ba2540", + "width": 64 + } + ], + "is_playable": true, + "label": "Loewe Verlag", + "name": "Adele möchte die Welt umarmen (Eine warmherzige Geschichte über Adeles turbulentes Familenleben - geschrieben und gelesen von Bestsellerautorin Sabine Bohlmann)", + "popularity": 28, + "release_date": "2019-09-18", + "release_date_precision": "day", + "total_tracks": 44, + "tracks": { + "href": "https://api.spotify.com/v1/albums/4Lfbq6TFHW6pLn9Bh2WrT0/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 185771, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0HScdUtK6fJ2A03WXsLp81" + }, + "href": "https://api.spotify.com/v1/tracks/0HScdUtK6fJ2A03WXsLp81", + "id": "0HScdUtK6fJ2A03WXsLp81", + "is_local": false, + "is_playable": true, + "name": "Kapitel 1 & Kapitel 2.1 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/70e42c63ef0b5d4a33b23171bc415e35d8f9ffa3?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:0HScdUtK6fJ2A03WXsLp81" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 192831, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3JkyIYUPGHeC1K5ePGvlXy" + }, + "href": "https://api.spotify.com/v1/tracks/3JkyIYUPGHeC1K5ePGvlXy", + "id": "3JkyIYUPGHeC1K5ePGvlXy", + "is_local": false, + "is_playable": true, + "name": "Kapitel 2.2 & Kapitel 3.1 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/e4356df8e0195a0886f24f07ae925b4a63a7cd13?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 2, + "type": "track", + "uri": "spotify:track:3JkyIYUPGHeC1K5ePGvlXy" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 215602, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6Nuzun5znb6y0ICnIS5mMQ" + }, + "href": "https://api.spotify.com/v1/tracks/6Nuzun5znb6y0ICnIS5mMQ", + "id": "6Nuzun5znb6y0ICnIS5mMQ", + "is_local": false, + "is_playable": true, + "name": "Kapitel 3.2 & Kapitel 4.1 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/34194580a23078838cf500d8c9a10385ba970e79?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 3, + "type": "track", + "uri": "spotify:track:6Nuzun5znb6y0ICnIS5mMQ" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 202552, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1DJU77ggF5FN71RGX0gRny" + }, + "href": "https://api.spotify.com/v1/tracks/1DJU77ggF5FN71RGX0gRny", + "id": "1DJU77ggF5FN71RGX0gRny", + "is_local": false, + "is_playable": true, + "name": "Kapitel 4.2 & Kapitel 5.1 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/5b230e9e65004ce0a7ef36d136c40f3a79022c57?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 4, + "type": "track", + "uri": "spotify:track:1DJU77ggF5FN71RGX0gRny" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 190500, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/63NXK5h9TaGeiD0kYr2aDT" + }, + "href": "https://api.spotify.com/v1/tracks/63NXK5h9TaGeiD0kYr2aDT", + "id": "63NXK5h9TaGeiD0kYr2aDT", + "is_local": false, + "is_playable": true, + "name": "Kapitel 5.2 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/3165ad54444387d7bf323be6ee70d741d11aeac3?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 5, + "type": "track", + "uri": "spotify:track:63NXK5h9TaGeiD0kYr2aDT" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 198634, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/22hSn7EI7V3o0VnLLaQP27" + }, + "href": "https://api.spotify.com/v1/tracks/22hSn7EI7V3o0VnLLaQP27", + "id": "22hSn7EI7V3o0VnLLaQP27", + "is_local": false, + "is_playable": true, + "name": "Kapitel 5.3 & Kapitel 6 & Kapitel 7.1 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/9dc4f816b6806d891a2ad7e00b41eb609f22ffef?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 6, + "type": "track", + "uri": "spotify:track:22hSn7EI7V3o0VnLLaQP27" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 185318, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3dz7vvd1ubwdkfxeiPtxGp" + }, + "href": "https://api.spotify.com/v1/tracks/3dz7vvd1ubwdkfxeiPtxGp", + "id": "3dz7vvd1ubwdkfxeiPtxGp", + "is_local": false, + "is_playable": true, + "name": "Kapitel 7.2 & Kapitel 8.1 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/74f41b3dbb5e74847e668f8856bed5662ed12008?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 7, + "type": "track", + "uri": "spotify:track:3dz7vvd1ubwdkfxeiPtxGp" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 210100, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0Dne3xoC7xamVpL8Es5QJ5" + }, + "href": "https://api.spotify.com/v1/tracks/0Dne3xoC7xamVpL8Es5QJ5", + "id": "0Dne3xoC7xamVpL8Es5QJ5", + "is_local": false, + "is_playable": true, + "name": "Kapitel 8.2 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/0e80d96d5f8b700ba2a0558fff4c958c652d8dd9?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 8, + "type": "track", + "uri": "spotify:track:0Dne3xoC7xamVpL8Es5QJ5" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 210557, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3yVVZM86py5vy5VJraVyao" + }, + "href": "https://api.spotify.com/v1/tracks/3yVVZM86py5vy5VJraVyao", + "id": "3yVVZM86py5vy5VJraVyao", + "is_local": false, + "is_playable": true, + "name": "Kapitel 8.3 & Kapitel 9.1 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/0bc8584980ee49a4cb83e94e0916876aa3c2fb1c?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 9, + "type": "track", + "uri": "spotify:track:3yVVZM86py5vy5VJraVyao" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 197935, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/7lVIiVIevlXszlZHeyGekJ" + }, + "href": "https://api.spotify.com/v1/tracks/7lVIiVIevlXszlZHeyGekJ", + "id": "7lVIiVIevlXszlZHeyGekJ", + "is_local": false, + "is_playable": true, + "name": "Kapitel 9.2 & Kapitel 10.1 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/6e252408bf4c024be1df0e340b6164a54e236860?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 10, + "type": "track", + "uri": "spotify:track:7lVIiVIevlXszlZHeyGekJ" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 205581, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/5Gr4uX1SyFigMscUoA53KV" + }, + "href": "https://api.spotify.com/v1/tracks/5Gr4uX1SyFigMscUoA53KV", + "id": "5Gr4uX1SyFigMscUoA53KV", + "is_local": false, + "is_playable": true, + "name": "Kapitel 10.2 & Kapitel 11.1 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/b6a52299f5de99c881558d659150e42bb5476a48?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 11, + "type": "track", + "uri": "spotify:track:5Gr4uX1SyFigMscUoA53KV" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 195100, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6TCFdzCDSNKytcLPwzYLah" + }, + "href": "https://api.spotify.com/v1/tracks/6TCFdzCDSNKytcLPwzYLah", + "id": "6TCFdzCDSNKytcLPwzYLah", + "is_local": false, + "is_playable": true, + "name": "Kapitel 11.2 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/de6efa34025ee97b428cd23572f54378008ad819?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 12, + "type": "track", + "uri": "spotify:track:6TCFdzCDSNKytcLPwzYLah" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 205346, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6hEHgNAA11bR2kfEuP1AAb" + }, + "href": "https://api.spotify.com/v1/tracks/6hEHgNAA11bR2kfEuP1AAb", + "id": "6hEHgNAA11bR2kfEuP1AAb", + "is_local": false, + "is_playable": true, + "name": "Kapitel 11.3 & Kapitel 12.1 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/ddce1b6e6d9e37e483ba33e8133d24e08c47f98e?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 13, + "type": "track", + "uri": "spotify:track:6hEHgNAA11bR2kfEuP1AAb" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 186945, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/11xSFwHLxfblBlDwGN9SxB" + }, + "href": "https://api.spotify.com/v1/tracks/11xSFwHLxfblBlDwGN9SxB", + "id": "11xSFwHLxfblBlDwGN9SxB", + "is_local": false, + "is_playable": true, + "name": "Kapitel 12.2 & Kapitel 13.1 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/5440a0ce1b9b24e43652b467d6443cca44a63ecd?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 14, + "type": "track", + "uri": "spotify:track:11xSFwHLxfblBlDwGN9SxB" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 193984, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0VJ0fO58E8E7hmGCdLTYvD" + }, + "href": "https://api.spotify.com/v1/tracks/0VJ0fO58E8E7hmGCdLTYvD", + "id": "0VJ0fO58E8E7hmGCdLTYvD", + "is_local": false, + "is_playable": true, + "name": "Kapitel 13.2 & Kapitel 14.1 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/f1f7b7e7f6bf1f6512dbd3432d9c331d06bdfa4e?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 15, + "type": "track", + "uri": "spotify:track:0VJ0fO58E8E7hmGCdLTYvD" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 187102, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/4lhr1uKrwnntagdSASLa3r" + }, + "href": "https://api.spotify.com/v1/tracks/4lhr1uKrwnntagdSASLa3r", + "id": "4lhr1uKrwnntagdSASLa3r", + "is_local": false, + "is_playable": true, + "name": "Kapitel 14.2 & Kapitel 15.1 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/b5b7f1f0a559ad0839b390b9da0a091d44380080?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 16, + "type": "track", + "uri": "spotify:track:4lhr1uKrwnntagdSASLa3r" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 186818, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1L1Inb9CYU5atriJD5joKU" + }, + "href": "https://api.spotify.com/v1/tracks/1L1Inb9CYU5atriJD5joKU", + "id": "1L1Inb9CYU5atriJD5joKU", + "is_local": false, + "is_playable": true, + "name": "Kapitel 15.2 & Kapitel 16.1 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/7f3e5c19e0f9cf5dec24e7d5d5c5ecc631933616?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 17, + "type": "track", + "uri": "spotify:track:1L1Inb9CYU5atriJD5joKU" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 202300, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6dVyBFV4f5U6RVKvxMD9F2" + }, + "href": "https://api.spotify.com/v1/tracks/6dVyBFV4f5U6RVKvxMD9F2", + "id": "6dVyBFV4f5U6RVKvxMD9F2", + "is_local": false, + "is_playable": true, + "name": "Kapitel 16.2 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/3919a114c7499ccada097c74a5e573c9455397b5?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 18, + "type": "track", + "uri": "spotify:track:6dVyBFV4f5U6RVKvxMD9F2" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 187404, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/4t2BztBjJKZFnq1zx8r5Nd" + }, + "href": "https://api.spotify.com/v1/tracks/4t2BztBjJKZFnq1zx8r5Nd", + "id": "4t2BztBjJKZFnq1zx8r5Nd", + "is_local": false, + "is_playable": true, + "name": "Kapitel 16.3 & Kapitel 17.1 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/31c211f2f8b3c4809e06b1c59528fcb21a5ca692?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 19, + "type": "track", + "uri": "spotify:track:4t2BztBjJKZFnq1zx8r5Nd" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 190548, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/5s6hTAz4mW0tsxOtmLmxUQ" + }, + "href": "https://api.spotify.com/v1/tracks/5s6hTAz4mW0tsxOtmLmxUQ", + "id": "5s6hTAz4mW0tsxOtmLmxUQ", + "is_local": false, + "is_playable": true, + "name": "Kapitel 17.2 & Kapitel 18.1 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/e8ab3df40e177e65076eeb69b64515e50fdc033e?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 20, + "type": "track", + "uri": "spotify:track:5s6hTAz4mW0tsxOtmLmxUQ" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 198200, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0k4GYZgq6Cwwkhrvd3Vbi1" + }, + "href": "https://api.spotify.com/v1/tracks/0k4GYZgq6Cwwkhrvd3Vbi1", + "id": "0k4GYZgq6Cwwkhrvd3Vbi1", + "is_local": false, + "is_playable": true, + "name": "Kapitel 18.2 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/27aead721afcd40ba69b7c1afe6dbf91f748ad6e?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 21, + "type": "track", + "uri": "spotify:track:0k4GYZgq6Cwwkhrvd3Vbi1" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 200127, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/5eBFnrdsfan5Bqv3q2gcPw" + }, + "href": "https://api.spotify.com/v1/tracks/5eBFnrdsfan5Bqv3q2gcPw", + "id": "5eBFnrdsfan5Bqv3q2gcPw", + "is_local": false, + "is_playable": true, + "name": "Kapitel 18.3 & Kapitel 19.1 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/619039efee2b136ac60db2987edb07f0c7ebcc6a?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 22, + "type": "track", + "uri": "spotify:track:5eBFnrdsfan5Bqv3q2gcPw" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 246233, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2C92Bq4b07lbpFWYZIHsvy" + }, + "href": "https://api.spotify.com/v1/tracks/2C92Bq4b07lbpFWYZIHsvy", + "id": "2C92Bq4b07lbpFWYZIHsvy", + "is_local": false, + "is_playable": true, + "name": "Kapitel 19.2 & Kapitel 20.1 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/07726b188a1edf09d6d5eb4b1de262097d854e03?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 23, + "type": "track", + "uri": "spotify:track:2C92Bq4b07lbpFWYZIHsvy" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 220006, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/7xdBQDQur2nfj4eBQCEzCe" + }, + "href": "https://api.spotify.com/v1/tracks/7xdBQDQur2nfj4eBQCEzCe", + "id": "7xdBQDQur2nfj4eBQCEzCe", + "is_local": false, + "is_playable": true, + "name": "Kapitel 20.2 & Kapitel 21.1 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/1cb7bc97ec6a45f613460d3360ed607b877e5db1?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 24, + "type": "track", + "uri": "spotify:track:7xdBQDQur2nfj4eBQCEzCe" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 225657, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3IRZJPcVUvBwkjr2Ye4yJi" + }, + "href": "https://api.spotify.com/v1/tracks/3IRZJPcVUvBwkjr2Ye4yJi", + "id": "3IRZJPcVUvBwkjr2Ye4yJi", + "is_local": false, + "is_playable": true, + "name": "Kapitel 21.2 & Kapitel 22.1 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/4a686b9cd3a89f4e826b4a490da2f4666e4d21cf?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 25, + "type": "track", + "uri": "spotify:track:3IRZJPcVUvBwkjr2Ye4yJi" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 187904, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2p0K7IySQC52IMkiBSWuv0" + }, + "href": "https://api.spotify.com/v1/tracks/2p0K7IySQC52IMkiBSWuv0", + "id": "2p0K7IySQC52IMkiBSWuv0", + "is_local": false, + "is_playable": true, + "name": "Kapitel 22.2 & Kapitel 23.1 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/453e184853e2eb54d90acf0daddfcb5975a23433?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 26, + "type": "track", + "uri": "spotify:track:2p0K7IySQC52IMkiBSWuv0" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 213286, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/11owDDVozo92CEFX5xBwir" + }, + "href": "https://api.spotify.com/v1/tracks/11owDDVozo92CEFX5xBwir", + "id": "11owDDVozo92CEFX5xBwir", + "is_local": false, + "is_playable": true, + "name": "Kapitel 23.2 & Kapitel 24.1 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/cf831d35a46ac516c00af3b1bb6642bac8011734?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 27, + "type": "track", + "uri": "spotify:track:11owDDVozo92CEFX5xBwir" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 196404, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2aw4qpPmsb5tlZbVHViKB1" + }, + "href": "https://api.spotify.com/v1/tracks/2aw4qpPmsb5tlZbVHViKB1", + "id": "2aw4qpPmsb5tlZbVHViKB1", + "is_local": false, + "is_playable": true, + "name": "Kapitel 24.2 & Kapitel 25.1 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/733901cfc0894cf09f696552a50a72bfde458e0a?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 28, + "type": "track", + "uri": "spotify:track:2aw4qpPmsb5tlZbVHViKB1" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 201400, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3blzasHNmixVl2quRl4jPc" + }, + "href": "https://api.spotify.com/v1/tracks/3blzasHNmixVl2quRl4jPc", + "id": "3blzasHNmixVl2quRl4jPc", + "is_local": false, + "is_playable": true, + "name": "Kapitel 25.2 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/816c2f7a7bb60655c50d17e16f70786162812d50?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 29, + "type": "track", + "uri": "spotify:track:3blzasHNmixVl2quRl4jPc" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 188465, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/7jeFxP9gY4mXRfZLLJohFA" + }, + "href": "https://api.spotify.com/v1/tracks/7jeFxP9gY4mXRfZLLJohFA", + "id": "7jeFxP9gY4mXRfZLLJohFA", + "is_local": false, + "is_playable": true, + "name": "Kapitel 25.3 & Kapitel 26.1 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/ea30a5f3fef0651e74f65411b9f69b4ca2f4a3be?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 30, + "type": "track", + "uri": "spotify:track:7jeFxP9gY4mXRfZLLJohFA" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 192239, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/07TuRPx77QW2SgD4AqweNP" + }, + "href": "https://api.spotify.com/v1/tracks/07TuRPx77QW2SgD4AqweNP", + "id": "07TuRPx77QW2SgD4AqweNP", + "is_local": false, + "is_playable": true, + "name": "Kapitel 26.2 & Kapitel 27.1 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/7c37c7be4ad3e485720a383bc86aecb0f1c79121?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 31, + "type": "track", + "uri": "spotify:track:07TuRPx77QW2SgD4AqweNP" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 194300, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3fQfGyFuxE0KKWBsaBVMYI" + }, + "href": "https://api.spotify.com/v1/tracks/3fQfGyFuxE0KKWBsaBVMYI", + "id": "3fQfGyFuxE0KKWBsaBVMYI", + "is_local": false, + "is_playable": true, + "name": "Kapitel 27.2 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/b747394c56316bd71a31536a0c0cc5030d9a65f9?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 32, + "type": "track", + "uri": "spotify:track:3fQfGyFuxE0KKWBsaBVMYI" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 186745, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/30PCnDuaezvXCoXVyE1T7E" + }, + "href": "https://api.spotify.com/v1/tracks/30PCnDuaezvXCoXVyE1T7E", + "id": "30PCnDuaezvXCoXVyE1T7E", + "is_local": false, + "is_playable": true, + "name": "Kapitel 27.3 & Kapitel 28.1 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/e31453eb7ac1c42eb7053407f7868a52f09759eb?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 33, + "type": "track", + "uri": "spotify:track:30PCnDuaezvXCoXVyE1T7E" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 205539, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6V1ORHxHkSnQZ9rwtaCbqe" + }, + "href": "https://api.spotify.com/v1/tracks/6V1ORHxHkSnQZ9rwtaCbqe", + "id": "6V1ORHxHkSnQZ9rwtaCbqe", + "is_local": false, + "is_playable": true, + "name": "Kapitel 28.2 & Kapitel 29.1 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/34082b59d4856e55f09e7233f5dedaba80f5ac54?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 34, + "type": "track", + "uri": "spotify:track:6V1ORHxHkSnQZ9rwtaCbqe" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 193665, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/5Ak0aWfEUjFla0KZFhr73L" + }, + "href": "https://api.spotify.com/v1/tracks/5Ak0aWfEUjFla0KZFhr73L", + "id": "5Ak0aWfEUjFla0KZFhr73L", + "is_local": false, + "is_playable": true, + "name": "Kapitel 29.2 & Kapitel 30.1 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/4908bde9a213a5a884f5ad4645ee4bd1993fff5f?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 35, + "type": "track", + "uri": "spotify:track:5Ak0aWfEUjFla0KZFhr73L" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 192500, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/5vx3zBJSV30i5wrg5lggCb" + }, + "href": "https://api.spotify.com/v1/tracks/5vx3zBJSV30i5wrg5lggCb", + "id": "5vx3zBJSV30i5wrg5lggCb", + "is_local": false, + "is_playable": true, + "name": "Kapitel 30.2 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/eef62e0a9de0688826e6625d451e497781bec62e?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 36, + "type": "track", + "uri": "spotify:track:5vx3zBJSV30i5wrg5lggCb" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 192292, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/17Yjp9Fank340ihUyCv0dg" + }, + "href": "https://api.spotify.com/v1/tracks/17Yjp9Fank340ihUyCv0dg", + "id": "17Yjp9Fank340ihUyCv0dg", + "is_local": false, + "is_playable": true, + "name": "Kapitel 30.3 & Kapitel 31.1 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/615b3730822f85bbfa8bd446764f51d8dfe700ae?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 37, + "type": "track", + "uri": "spotify:track:17Yjp9Fank340ihUyCv0dg" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 194064, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/24zg4CHM2HFXkwQUUy1rBm" + }, + "href": "https://api.spotify.com/v1/tracks/24zg4CHM2HFXkwQUUy1rBm", + "id": "24zg4CHM2HFXkwQUUy1rBm", + "is_local": false, + "is_playable": true, + "name": "Kapitel 31.2 & Kapitel 32.1 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/e776ef0caa482d5e1ff050d8dbf8fcdf001ad7ff?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 38, + "type": "track", + "uri": "spotify:track:24zg4CHM2HFXkwQUUy1rBm" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 185965, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1sEvYm0AT4YUCJuNQBQDTD" + }, + "href": "https://api.spotify.com/v1/tracks/1sEvYm0AT4YUCJuNQBQDTD", + "id": "1sEvYm0AT4YUCJuNQBQDTD", + "is_local": false, + "is_playable": true, + "name": "Kapitel 32.2 & Kapitel 33.1 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/5230aba321b5e20127d2a9bc815c6317cefa0945?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 39, + "type": "track", + "uri": "spotify:track:1sEvYm0AT4YUCJuNQBQDTD" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 185900, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/5jg9jKRDEVMJiz25swPUTW" + }, + "href": "https://api.spotify.com/v1/tracks/5jg9jKRDEVMJiz25swPUTW", + "id": "5jg9jKRDEVMJiz25swPUTW", + "is_local": false, + "is_playable": true, + "name": "Kapitel 33.2 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/8531c88eef494a27322ca40ccd40b0c0a96f0cd1?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 40, + "type": "track", + "uri": "spotify:track:5jg9jKRDEVMJiz25swPUTW" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 186669, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/7n9TsXOhQ6ezwsfUCiUMg4" + }, + "href": "https://api.spotify.com/v1/tracks/7n9TsXOhQ6ezwsfUCiUMg4", + "id": "7n9TsXOhQ6ezwsfUCiUMg4", + "is_local": false, + "is_playable": true, + "name": "Kapitel 33.3 & Kapitel 34.1 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/a825557b7196c2c89e36c22578706c4c3f54466c?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 41, + "type": "track", + "uri": "spotify:track:7n9TsXOhQ6ezwsfUCiUMg4" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 201019, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2nVf7bHVLbXE8AFc634kPa" + }, + "href": "https://api.spotify.com/v1/tracks/2nVf7bHVLbXE8AFc634kPa", + "id": "2nVf7bHVLbXE8AFc634kPa", + "is_local": false, + "is_playable": true, + "name": "Kapitel 34.2 & Kapitel 35.1 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/d464631e45be738b052f7ff5fd9add125695182d?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 42, + "type": "track", + "uri": "spotify:track:2nVf7bHVLbXE8AFc634kPa" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 195841, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2l3zm3NY6LbEaLWNCKaJZO" + }, + "href": "https://api.spotify.com/v1/tracks/2l3zm3NY6LbEaLWNCKaJZO", + "id": "2l3zm3NY6LbEaLWNCKaJZO", + "is_local": false, + "is_playable": true, + "name": "Kapitel 35.2 & Kapitel 36.1 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/cb606981dc42a8d963a050e291f2c38f96ceb2ae?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 43, + "type": "track", + "uri": "spotify:track:2l3zm3NY6LbEaLWNCKaJZO" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 141151, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6l9Ykih7AlkmZypUitiW4y" + }, + "href": "https://api.spotify.com/v1/tracks/6l9Ykih7AlkmZypUitiW4y", + "id": "6l9Ykih7AlkmZypUitiW4y", + "is_local": false, + "is_playable": true, + "name": "Kapitel 36.2 - Adele möchte die Welt umarmen", + "preview_url": "https://p.scdn.co/mp3-preview/856910c5533d56acf367706821bcc30d3d9e7193?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 44, + "type": "track", + "uri": "spotify:track:6l9Ykih7AlkmZypUitiW4y" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 44 + }, + "type": "album", + "uri": "spotify:album:4Lfbq6TFHW6pLn9Bh2WrT0" + }, + { + "album_type": "album", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "copyrights": [ + { + "text": "2022 Loewe Verlag GmbH", + "type": "P" + } + ], + "external_ids": { + "upc": "4066339011564" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/6Ce2LTA9OEWjUN59TTQj0W" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/6Ce2LTA9OEWjUN59TTQj0W", + "id": "6Ce2LTA9OEWjUN59TTQj0W", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273fc03214a02201fb9bf3bea12", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02fc03214a02201fb9bf3bea12", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851fc03214a02201fb9bf3bea12", + "width": 64 + } + ], + "is_playable": true, + "label": "Loewe Verlag", + "name": "Adele malt die Welt bunt (Eine warmherzige Geschichte über Adeles turbulentes Familenleben - geschrieben und gelesen von Bestsellerautorin Sabine Bohlmann)", + "popularity": 27, + "release_date": "2021-10-13", + "release_date_precision": "day", + "total_tracks": 45, + "tracks": { + "href": "https://api.spotify.com/v1/albums/6Ce2LTA9OEWjUN59TTQj0W/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 214159, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/7tKH3UnqgbMttKjdZJkVpq" + }, + "href": "https://api.spotify.com/v1/tracks/7tKH3UnqgbMttKjdZJkVpq", + "id": "7tKH3UnqgbMttKjdZJkVpq", + "is_local": false, + "is_playable": true, + "name": "Kapitel 1 & Kapitel 2.1 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/e6afcdc8901ed9f058e2d4fba6c735b7491d9cdf?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:7tKH3UnqgbMttKjdZJkVpq" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 191384, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/7wUlNlGjZSjNo0QZCkBkrH" + }, + "href": "https://api.spotify.com/v1/tracks/7wUlNlGjZSjNo0QZCkBkrH", + "id": "7wUlNlGjZSjNo0QZCkBkrH", + "is_local": false, + "is_playable": true, + "name": "Kapitel 2.2 & Kapitel 3.1 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/49e3d504c60c67d8414d438317a4981e40b00b55?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 2, + "type": "track", + "uri": "spotify:track:7wUlNlGjZSjNo0QZCkBkrH" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 193100, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0AQKrPyJZso9LSu91WpbFt" + }, + "href": "https://api.spotify.com/v1/tracks/0AQKrPyJZso9LSu91WpbFt", + "id": "0AQKrPyJZso9LSu91WpbFt", + "is_local": false, + "is_playable": true, + "name": "Kapitel 3.2 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/5944a826ffd379a781fc17a96da6a67dbbd963fe?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 3, + "type": "track", + "uri": "spotify:track:0AQKrPyJZso9LSu91WpbFt" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 190817, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0jyUs4HteLU8yUDy3QQQGF" + }, + "href": "https://api.spotify.com/v1/tracks/0jyUs4HteLU8yUDy3QQQGF", + "id": "0jyUs4HteLU8yUDy3QQQGF", + "is_local": false, + "is_playable": true, + "name": "Kapitel 3.3 & Kapitel 4.1 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/8532a8d59e6640f2562852fd88fae006074b09f0?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 4, + "type": "track", + "uri": "spotify:track:0jyUs4HteLU8yUDy3QQQGF" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 192501, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6vY6zgB7OpZEU86hlBdk0r" + }, + "href": "https://api.spotify.com/v1/tracks/6vY6zgB7OpZEU86hlBdk0r", + "id": "6vY6zgB7OpZEU86hlBdk0r", + "is_local": false, + "is_playable": true, + "name": "Kapitel 4.2 & Kapitel 5.1 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/a32237ff5b43b39c687837adb6992bd2bdc62ee5?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 5, + "type": "track", + "uri": "spotify:track:6vY6zgB7OpZEU86hlBdk0r" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 187007, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/4Gq8SPrN1if4IRMaSCHH28" + }, + "href": "https://api.spotify.com/v1/tracks/4Gq8SPrN1if4IRMaSCHH28", + "id": "4Gq8SPrN1if4IRMaSCHH28", + "is_local": false, + "is_playable": true, + "name": "Kapitel 5.2 & Kapitel 6.1 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/2b60b852c59f5b069d7cd091c4d6c6f8dd2bd9d0?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 6, + "type": "track", + "uri": "spotify:track:4Gq8SPrN1if4IRMaSCHH28" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 190183, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3UZxdAUN0iKzR7GUkpEfHg" + }, + "href": "https://api.spotify.com/v1/tracks/3UZxdAUN0iKzR7GUkpEfHg", + "id": "3UZxdAUN0iKzR7GUkpEfHg", + "is_local": false, + "is_playable": true, + "name": "Kapitel 6.2 & Kapitel 7.1 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/27f889cdf8913c4d4d0611b04290b2f5a82d7677?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 7, + "type": "track", + "uri": "spotify:track:3UZxdAUN0iKzR7GUkpEfHg" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 235600, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0rAEdMgWNyNgjEOzIyZiTL" + }, + "href": "https://api.spotify.com/v1/tracks/0rAEdMgWNyNgjEOzIyZiTL", + "id": "0rAEdMgWNyNgjEOzIyZiTL", + "is_local": false, + "is_playable": true, + "name": "Kapitel 7.2 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/cc06e31ba4d81e9ca7931621a22cd23adc01fcfc?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 8, + "type": "track", + "uri": "spotify:track:0rAEdMgWNyNgjEOzIyZiTL" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 197428, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0K1c78jktlFiPtc1zWECKK" + }, + "href": "https://api.spotify.com/v1/tracks/0K1c78jktlFiPtc1zWECKK", + "id": "0K1c78jktlFiPtc1zWECKK", + "is_local": false, + "is_playable": true, + "name": "Kapitel 7.3 & Kapitel 8.1 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/17cbc88ac74085084c68b55fe18334028ae2d37f?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 9, + "type": "track", + "uri": "spotify:track:0K1c78jktlFiPtc1zWECKK" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 198733, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/5V8j7S2aCKa8BQ4jZ8Q6Xq" + }, + "href": "https://api.spotify.com/v1/tracks/5V8j7S2aCKa8BQ4jZ8Q6Xq", + "id": "5V8j7S2aCKa8BQ4jZ8Q6Xq", + "is_local": false, + "is_playable": true, + "name": "Kapitel 8.2 & Kapitel 9.1 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/11bc6cae0cddcf8b564b11f652d4572c24bd52ec?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 10, + "type": "track", + "uri": "spotify:track:5V8j7S2aCKa8BQ4jZ8Q6Xq" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 198773, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3VwKxfa6msfbA6Sie5e3JR" + }, + "href": "https://api.spotify.com/v1/tracks/3VwKxfa6msfbA6Sie5e3JR", + "id": "3VwKxfa6msfbA6Sie5e3JR", + "is_local": false, + "is_playable": true, + "name": "Kapitel 9.2 & Kapitel 10.1 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/3e29e9a81d10b9727f6a75ce9459ae74070beb46?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 11, + "type": "track", + "uri": "spotify:track:3VwKxfa6msfbA6Sie5e3JR" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 191600, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/4dD69cGND65zalsc7beOOo" + }, + "href": "https://api.spotify.com/v1/tracks/4dD69cGND65zalsc7beOOo", + "id": "4dD69cGND65zalsc7beOOo", + "is_local": false, + "is_playable": true, + "name": "Kapitel 10.2 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/f3feb71d7a2a32f984975f853731a321e4228dbb?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 12, + "type": "track", + "uri": "spotify:track:4dD69cGND65zalsc7beOOo" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 189555, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3SSvYzJ9OORcBFP0ipHIWr" + }, + "href": "https://api.spotify.com/v1/tracks/3SSvYzJ9OORcBFP0ipHIWr", + "id": "3SSvYzJ9OORcBFP0ipHIWr", + "is_local": false, + "is_playable": true, + "name": "Kapitel 10.3 & Kapitel 11.1 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/7eca5093028ea6034a636d27b946dd2d4128d6f8?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 13, + "type": "track", + "uri": "spotify:track:3SSvYzJ9OORcBFP0ipHIWr" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 192350, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/7v9EI5HMoiFazbCe72DETp" + }, + "href": "https://api.spotify.com/v1/tracks/7v9EI5HMoiFazbCe72DETp", + "id": "7v9EI5HMoiFazbCe72DETp", + "is_local": false, + "is_playable": true, + "name": "Kapitel 11.2 & Kapitel 12.1 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/727a23c1ed27ecf79b95f9dc55991679639723bd?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 14, + "type": "track", + "uri": "spotify:track:7v9EI5HMoiFazbCe72DETp" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 193500, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/4MEaNoW1ww3SS2TLSw8HT7" + }, + "href": "https://api.spotify.com/v1/tracks/4MEaNoW1ww3SS2TLSw8HT7", + "id": "4MEaNoW1ww3SS2TLSw8HT7", + "is_local": false, + "is_playable": true, + "name": "Kapitel 12.2 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/68bfb38d4de1fb7c90a27c8f368f561444cfb9c9?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 15, + "type": "track", + "uri": "spotify:track:4MEaNoW1ww3SS2TLSw8HT7" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 188192, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/7HfeLbaKItPARXHgpP7J2B" + }, + "href": "https://api.spotify.com/v1/tracks/7HfeLbaKItPARXHgpP7J2B", + "id": "7HfeLbaKItPARXHgpP7J2B", + "is_local": false, + "is_playable": true, + "name": "Kapitel 12.3 & Kapitel 13.1 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/e3cefe39ac06f1a19bac7c0010438843580b7552?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 16, + "type": "track", + "uri": "spotify:track:7HfeLbaKItPARXHgpP7J2B" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 211187, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0VMZkd3qqGjvPKcwIfHct6" + }, + "href": "https://api.spotify.com/v1/tracks/0VMZkd3qqGjvPKcwIfHct6", + "id": "0VMZkd3qqGjvPKcwIfHct6", + "is_local": false, + "is_playable": true, + "name": "Kapitel 13.2 & Kapitel 14.1 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/edc139e8810de38ab1114ba7ebb99882ee457303?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 17, + "type": "track", + "uri": "spotify:track:0VMZkd3qqGjvPKcwIfHct6" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 198500, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/148ibnTB4wh9kS7QThhlAS" + }, + "href": "https://api.spotify.com/v1/tracks/148ibnTB4wh9kS7QThhlAS", + "id": "148ibnTB4wh9kS7QThhlAS", + "is_local": false, + "is_playable": true, + "name": "Kapitel 14.2 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/603ee68f8e382799b4e9fd1f75b45b29407b0990?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 18, + "type": "track", + "uri": "spotify:track:148ibnTB4wh9kS7QThhlAS" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 187676, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6Eyz9CaPcnmPXJGPrjawdT" + }, + "href": "https://api.spotify.com/v1/tracks/6Eyz9CaPcnmPXJGPrjawdT", + "id": "6Eyz9CaPcnmPXJGPrjawdT", + "is_local": false, + "is_playable": true, + "name": "Kapitel 14.3 & Kapitel 15.1 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/eda11e6b60075855e5c01c872c3919ff6cf6eeea?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 19, + "type": "track", + "uri": "spotify:track:6Eyz9CaPcnmPXJGPrjawdT" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 185455, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/7ajqUkCYeT2SRRsNgfiFK7" + }, + "href": "https://api.spotify.com/v1/tracks/7ajqUkCYeT2SRRsNgfiFK7", + "id": "7ajqUkCYeT2SRRsNgfiFK7", + "is_local": false, + "is_playable": true, + "name": "Kapitel 15.2 & Kapitel 16.1 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/2826e72baf997338bd696f5acefc67c9c66f735c?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 20, + "type": "track", + "uri": "spotify:track:7ajqUkCYeT2SRRsNgfiFK7" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 200921, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6gmxd07P1IEM6z0ZmOZIrd" + }, + "href": "https://api.spotify.com/v1/tracks/6gmxd07P1IEM6z0ZmOZIrd", + "id": "6gmxd07P1IEM6z0ZmOZIrd", + "is_local": false, + "is_playable": true, + "name": "Kapitel 16.2 & Kapitel 17.1 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/e37f3169b48efe6bc09275d573bc427bc8636445?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 21, + "type": "track", + "uri": "spotify:track:6gmxd07P1IEM6z0ZmOZIrd" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 200600, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1nBM442HcNnpgdY9AX5XcI" + }, + "href": "https://api.spotify.com/v1/tracks/1nBM442HcNnpgdY9AX5XcI", + "id": "1nBM442HcNnpgdY9AX5XcI", + "is_local": false, + "is_playable": true, + "name": "Kapitel 17.2 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/02103faaee1dae4973c85f7cecbabdca4d884d40?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 22, + "type": "track", + "uri": "spotify:track:1nBM442HcNnpgdY9AX5XcI" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 199260, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3fCLYwsf6tZDnso6hhfLIP" + }, + "href": "https://api.spotify.com/v1/tracks/3fCLYwsf6tZDnso6hhfLIP", + "id": "3fCLYwsf6tZDnso6hhfLIP", + "is_local": false, + "is_playable": true, + "name": "Kapitel 17.3 & Kapitel 18 & Kapitel 19.1 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/1bf67f172628943b0cead2a5c9900baadd5c7e51?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 23, + "type": "track", + "uri": "spotify:track:3fCLYwsf6tZDnso6hhfLIP" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 206600, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0C3K6PwC6mOm0nyJgAL5Az" + }, + "href": "https://api.spotify.com/v1/tracks/0C3K6PwC6mOm0nyJgAL5Az", + "id": "0C3K6PwC6mOm0nyJgAL5Az", + "is_local": false, + "is_playable": true, + "name": "Kapitel 19.2 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/cc6be0e075e4ba534fc85067bccc7c427de483d0?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 24, + "type": "track", + "uri": "spotify:track:0C3K6PwC6mOm0nyJgAL5Az" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 205863, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/7o47QXQrxEs3HpzWcRt0Ro" + }, + "href": "https://api.spotify.com/v1/tracks/7o47QXQrxEs3HpzWcRt0Ro", + "id": "7o47QXQrxEs3HpzWcRt0Ro", + "is_local": false, + "is_playable": true, + "name": "Kapitel 19.3 & Kapitel 20 & Kapitel 21.1 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/2543ac2a5aeac60baad55c5e11e326a060ad16da?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 25, + "type": "track", + "uri": "spotify:track:7o47QXQrxEs3HpzWcRt0Ro" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 190100, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2gv7TlenArhKg5t2ijd3Xv" + }, + "href": "https://api.spotify.com/v1/tracks/2gv7TlenArhKg5t2ijd3Xv", + "id": "2gv7TlenArhKg5t2ijd3Xv", + "is_local": false, + "is_playable": true, + "name": "Kapitel 21.2 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/e19e1a444362085cef5c5b9301a5c6ffecebcc6e?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 26, + "type": "track", + "uri": "spotify:track:2gv7TlenArhKg5t2ijd3Xv" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 186507, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3CzkO7ijZVkxw53IIVCQ9Z" + }, + "href": "https://api.spotify.com/v1/tracks/3CzkO7ijZVkxw53IIVCQ9Z", + "id": "3CzkO7ijZVkxw53IIVCQ9Z", + "is_local": false, + "is_playable": true, + "name": "Kapitel 21.3 & Kapitel 22.1 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/a6feb990c5c342f2a2daaee46a6a8038299f5aba?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 27, + "type": "track", + "uri": "spotify:track:3CzkO7ijZVkxw53IIVCQ9Z" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 203707, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6TSmttKo2bTJXcaGOLKbtB" + }, + "href": "https://api.spotify.com/v1/tracks/6TSmttKo2bTJXcaGOLKbtB", + "id": "6TSmttKo2bTJXcaGOLKbtB", + "is_local": false, + "is_playable": true, + "name": "Kapitel 22.2 & Kapitel 23.1 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/ea321fe24b8cbf7b1debe5b6c09786d4f12b8cbe?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 28, + "type": "track", + "uri": "spotify:track:6TSmttKo2bTJXcaGOLKbtB" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 193839, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2qAiFDNErXotiiaAvliHQN" + }, + "href": "https://api.spotify.com/v1/tracks/2qAiFDNErXotiiaAvliHQN", + "id": "2qAiFDNErXotiiaAvliHQN", + "is_local": false, + "is_playable": true, + "name": "Kapitel 23.2 & Kapitel 24.1 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/444095c8c26fc703fa0bd906ec45f9aa1391ceb9?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 29, + "type": "track", + "uri": "spotify:track:2qAiFDNErXotiiaAvliHQN" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 238411, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0SaWiE3lkn92IKFFXgROyq" + }, + "href": "https://api.spotify.com/v1/tracks/0SaWiE3lkn92IKFFXgROyq", + "id": "0SaWiE3lkn92IKFFXgROyq", + "is_local": false, + "is_playable": true, + "name": "Kapitel 24.2 & Kapitel 25.1 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/996f5d7edf0b5e8e02157bb84467400f4914a2f7?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 30, + "type": "track", + "uri": "spotify:track:0SaWiE3lkn92IKFFXgROyq" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 196074, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3q0rxB9TDCkKk1KEUOW3UP" + }, + "href": "https://api.spotify.com/v1/tracks/3q0rxB9TDCkKk1KEUOW3UP", + "id": "3q0rxB9TDCkKk1KEUOW3UP", + "is_local": false, + "is_playable": true, + "name": "Kapitel 25.2 & Kapitel 26.1 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/b3719e8173ae1daa21e1f67fd60fbecfddf450aa?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 31, + "type": "track", + "uri": "spotify:track:3q0rxB9TDCkKk1KEUOW3UP" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 186300, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1ffXQhrpZBhwcHowQRolCj" + }, + "href": "https://api.spotify.com/v1/tracks/1ffXQhrpZBhwcHowQRolCj", + "id": "1ffXQhrpZBhwcHowQRolCj", + "is_local": false, + "is_playable": true, + "name": "Kapitel 26.2 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/2ef4e74b22acc545d01542bb21bfe833aa1df744?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 32, + "type": "track", + "uri": "spotify:track:1ffXQhrpZBhwcHowQRolCj" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 209484, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0EVGnskRkWN4dPufpTTJ5m" + }, + "href": "https://api.spotify.com/v1/tracks/0EVGnskRkWN4dPufpTTJ5m", + "id": "0EVGnskRkWN4dPufpTTJ5m", + "is_local": false, + "is_playable": true, + "name": "Kapitel 26.3 & Kapitel 27.1 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/086087ba17845a169cdcf2fafe06fd062a26559c?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 33, + "type": "track", + "uri": "spotify:track:0EVGnskRkWN4dPufpTTJ5m" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 192963, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0eGYsyqphVCjNEjdIOThjq" + }, + "href": "https://api.spotify.com/v1/tracks/0eGYsyqphVCjNEjdIOThjq", + "id": "0eGYsyqphVCjNEjdIOThjq", + "is_local": false, + "is_playable": true, + "name": "Kapitel 27.2 & Kapitel 28.1 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/bb0d9ba25f1907bebfd8ef4c4f2d621cf501c9a7?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 34, + "type": "track", + "uri": "spotify:track:0eGYsyqphVCjNEjdIOThjq" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 195800, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/14WSYFDe8yKDXjX5ysADIi" + }, + "href": "https://api.spotify.com/v1/tracks/14WSYFDe8yKDXjX5ysADIi", + "id": "14WSYFDe8yKDXjX5ysADIi", + "is_local": false, + "is_playable": true, + "name": "Kapitel 28.2 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/3fcc3d5019322b5fb1148cb3b146dd000aa05f47?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 35, + "type": "track", + "uri": "spotify:track:14WSYFDe8yKDXjX5ysADIi" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 194771, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/56OZLnw6OrT66IKZUzIl5b" + }, + "href": "https://api.spotify.com/v1/tracks/56OZLnw6OrT66IKZUzIl5b", + "id": "56OZLnw6OrT66IKZUzIl5b", + "is_local": false, + "is_playable": true, + "name": "Kapitel 28.3 & Kapitel 29.1 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/34c263544c60922dee78702e3aa9db1eb3765b76?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 36, + "type": "track", + "uri": "spotify:track:56OZLnw6OrT66IKZUzIl5b" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 188162, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0KdHCbvRZgt1UyyfsTiqSx" + }, + "href": "https://api.spotify.com/v1/tracks/0KdHCbvRZgt1UyyfsTiqSx", + "id": "0KdHCbvRZgt1UyyfsTiqSx", + "is_local": false, + "is_playable": true, + "name": "Kapitel 29.2 & Kapitel 30.1 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/cede59aec61b781411869375edca43162c8c555d?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 37, + "type": "track", + "uri": "spotify:track:0KdHCbvRZgt1UyyfsTiqSx" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 191222, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6t5kfcPkZgN3bBNr3zZsGr" + }, + "href": "https://api.spotify.com/v1/tracks/6t5kfcPkZgN3bBNr3zZsGr", + "id": "6t5kfcPkZgN3bBNr3zZsGr", + "is_local": false, + "is_playable": true, + "name": "Kapitel 30.2 & Kapitel 31.1 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/2e7578dc49dab4ff16a029736691c8210c097f54?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 38, + "type": "track", + "uri": "spotify:track:6t5kfcPkZgN3bBNr3zZsGr" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 212870, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/34f35G5b0O2M86Ek3FibFR" + }, + "href": "https://api.spotify.com/v1/tracks/34f35G5b0O2M86Ek3FibFR", + "id": "34f35G5b0O2M86Ek3FibFR", + "is_local": false, + "is_playable": true, + "name": "Kapitel 31.2 & Kapitel 32.1 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/6522bdea0294f7841f1b7f9af9666939a3bced4b?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 39, + "type": "track", + "uri": "spotify:track:34f35G5b0O2M86Ek3FibFR" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 195785, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3169e9ve7nzUx3HuCr7Jdg" + }, + "href": "https://api.spotify.com/v1/tracks/3169e9ve7nzUx3HuCr7Jdg", + "id": "3169e9ve7nzUx3HuCr7Jdg", + "is_local": false, + "is_playable": true, + "name": "Kapitel 32.2 & Kapitel 33.1 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/e25ec30c07c47edabe95f83b064e049074515749?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 40, + "type": "track", + "uri": "spotify:track:3169e9ve7nzUx3HuCr7Jdg" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 189300, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/5ciFc73U1L9YtB0DA4ZOUy" + }, + "href": "https://api.spotify.com/v1/tracks/5ciFc73U1L9YtB0DA4ZOUy", + "id": "5ciFc73U1L9YtB0DA4ZOUy", + "is_local": false, + "is_playable": true, + "name": "Kapitel 33.2 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/383019d9c04f6ef6ff925b46cde31cc48d321fa4?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 41, + "type": "track", + "uri": "spotify:track:5ciFc73U1L9YtB0DA4ZOUy" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 189695, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/7b3DSO9DUiq8tg8fc3DPYy" + }, + "href": "https://api.spotify.com/v1/tracks/7b3DSO9DUiq8tg8fc3DPYy", + "id": "7b3DSO9DUiq8tg8fc3DPYy", + "is_local": false, + "is_playable": true, + "name": "Kapitel 33.3 & Kapitel 34.1 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/93221593d0b901d0ff844410f754770a9260806f?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 42, + "type": "track", + "uri": "spotify:track:7b3DSO9DUiq8tg8fc3DPYy" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 200202, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/7kuJ7Jm8cR0SR0nKlnQdJ0" + }, + "href": "https://api.spotify.com/v1/tracks/7kuJ7Jm8cR0SR0nKlnQdJ0", + "id": "7kuJ7Jm8cR0SR0nKlnQdJ0", + "is_local": false, + "is_playable": true, + "name": "Kapitel 34.2 & Kapitel 35.1 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/025da09a12640ddf5264d51d6464e10ca4046dfd?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 43, + "type": "track", + "uri": "spotify:track:7kuJ7Jm8cR0SR0nKlnQdJ0" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 186400, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1j1QU4gUm7OqqHegQpCYHW" + }, + "href": "https://api.spotify.com/v1/tracks/1j1QU4gUm7OqqHegQpCYHW", + "id": "1j1QU4gUm7OqqHegQpCYHW", + "is_local": false, + "is_playable": true, + "name": "Kapitel 35.2 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/c98aea8787e6a1597c572ec13fff69c59199a093?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 44, + "type": "track", + "uri": "spotify:track:1j1QU4gUm7OqqHegQpCYHW" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 149109, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/4LxfFLjLcJltY6f0ePMf4B" + }, + "href": "https://api.spotify.com/v1/tracks/4LxfFLjLcJltY6f0ePMf4B", + "id": "4LxfFLjLcJltY6f0ePMf4B", + "is_local": false, + "is_playable": true, + "name": "Kapitel 35.3 - Adele malt die Welt bunt", + "preview_url": "https://p.scdn.co/mp3-preview/a8faf2055fd47d60eadbec587ed2fbad2d04f5f2?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 45, + "type": "track", + "uri": "spotify:track:4LxfFLjLcJltY6f0ePMf4B" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 45 + }, + "type": "album", + "uri": "spotify:album:6Ce2LTA9OEWjUN59TTQj0W" + }, + { + "album_type": "album", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3jpqAmDJIGUSrkSgJyAjU7" + }, + "href": "https://api.spotify.com/v1/artists/3jpqAmDJIGUSrkSgJyAjU7", + "id": "3jpqAmDJIGUSrkSgJyAjU7", + "name": "blaki rmt", + "type": "artist", + "uri": "spotify:artist:3jpqAmDJIGUSrkSgJyAjU7" + } + ], + "copyrights": [ + { + "text": "2022 blaki rmt", + "type": "C" + }, + { + "text": "2022 blaki rmt", + "type": "P" + } + ], + "external_ids": { + "upc": "7316216333379" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/6I6LUGNfzrUNDhgPSfds9Y" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/6I6LUGNfzrUNDhgPSfds9Y", + "id": "6I6LUGNfzrUNDhgPSfds9Y", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273458ee7f80a20ff7d3a7cc89c", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02458ee7f80a20ff7d3a7cc89c", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851458ee7f80a20ff7d3a7cc89c", + "width": 64 + } + ], + "is_playable": true, + "label": "blaki rmt", + "name": "los colores son mio", + "popularity": 24, + "release_date": "2022-09-23", + "release_date_precision": "day", + "total_tracks": 7, + "tracks": { + "href": "https://api.spotify.com/v1/albums/6I6LUGNfzrUNDhgPSfds9Y/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3jpqAmDJIGUSrkSgJyAjU7" + }, + "href": "https://api.spotify.com/v1/artists/3jpqAmDJIGUSrkSgJyAjU7", + "id": "3jpqAmDJIGUSrkSgJyAjU7", + "name": "blaki rmt", + "type": "artist", + "uri": "spotify:artist:3jpqAmDJIGUSrkSgJyAjU7" + } + ], + "disc_number": 1, + "duration_ms": 124285, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/00A1byeZqy3SUJXdlkwIsm" + }, + "href": "https://api.spotify.com/v1/tracks/00A1byeZqy3SUJXdlkwIsm", + "id": "00A1byeZqy3SUJXdlkwIsm", + "is_local": false, + "is_playable": true, + "name": "algo extra", + "preview_url": "https://p.scdn.co/mp3-preview/b0e191c049c404a73e98f750e22434602c4940a3?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:00A1byeZqy3SUJXdlkwIsm" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3jpqAmDJIGUSrkSgJyAjU7" + }, + "href": "https://api.spotify.com/v1/artists/3jpqAmDJIGUSrkSgJyAjU7", + "id": "3jpqAmDJIGUSrkSgJyAjU7", + "name": "blaki rmt", + "type": "artist", + "uri": "spotify:artist:3jpqAmDJIGUSrkSgJyAjU7" + } + ], + "disc_number": 1, + "duration_ms": 120857, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/5yOuTgiETrEvGXLQYV0GvA" + }, + "href": "https://api.spotify.com/v1/tracks/5yOuTgiETrEvGXLQYV0GvA", + "id": "5yOuTgiETrEvGXLQYV0GvA", + "is_local": false, + "is_playable": true, + "name": "conersamos", + "preview_url": "https://p.scdn.co/mp3-preview/77e66beeaa6470e7ed8e91d3a06a56a3b61d911d?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 2, + "type": "track", + "uri": "spotify:track:5yOuTgiETrEvGXLQYV0GvA" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3jpqAmDJIGUSrkSgJyAjU7" + }, + "href": "https://api.spotify.com/v1/artists/3jpqAmDJIGUSrkSgJyAjU7", + "id": "3jpqAmDJIGUSrkSgJyAjU7", + "name": "blaki rmt", + "type": "artist", + "uri": "spotify:artist:3jpqAmDJIGUSrkSgJyAjU7" + } + ], + "disc_number": 1, + "duration_ms": 129427, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3jAcWNG01zLWyTvgjI8VNT" + }, + "href": "https://api.spotify.com/v1/tracks/3jAcWNG01zLWyTvgjI8VNT", + "id": "3jAcWNG01zLWyTvgjI8VNT", + "is_local": false, + "is_playable": true, + "name": "estable", + "preview_url": "https://p.scdn.co/mp3-preview/ce8f4720a5f6868bb729a3555123f21d51b838d0?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 3, + "type": "track", + "uri": "spotify:track:3jAcWNG01zLWyTvgjI8VNT" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3jpqAmDJIGUSrkSgJyAjU7" + }, + "href": "https://api.spotify.com/v1/artists/3jpqAmDJIGUSrkSgJyAjU7", + "id": "3jpqAmDJIGUSrkSgJyAjU7", + "name": "blaki rmt", + "type": "artist", + "uri": "spotify:artist:3jpqAmDJIGUSrkSgJyAjU7" + } + ], + "disc_number": 1, + "duration_ms": 121714, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0TgrLXaSnud0qjy4u97AGn" + }, + "href": "https://api.spotify.com/v1/tracks/0TgrLXaSnud0qjy4u97AGn", + "id": "0TgrLXaSnud0qjy4u97AGn", + "is_local": false, + "is_playable": true, + "name": "no digas nada", + "preview_url": "https://p.scdn.co/mp3-preview/7075bab0a1469612103361eb7803d22c6540badd?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 4, + "type": "track", + "uri": "spotify:track:0TgrLXaSnud0qjy4u97AGn" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3jpqAmDJIGUSrkSgJyAjU7" + }, + "href": "https://api.spotify.com/v1/artists/3jpqAmDJIGUSrkSgJyAjU7", + "id": "3jpqAmDJIGUSrkSgJyAjU7", + "name": "blaki rmt", + "type": "artist", + "uri": "spotify:artist:3jpqAmDJIGUSrkSgJyAjU7" + } + ], + "disc_number": 1, + "duration_ms": 123000, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/4tXp4a1Dm13Mp3NkwDagyS" + }, + "href": "https://api.spotify.com/v1/tracks/4tXp4a1Dm13Mp3NkwDagyS", + "id": "4tXp4a1Dm13Mp3NkwDagyS", + "is_local": false, + "is_playable": true, + "name": "no quiero", + "preview_url": "https://p.scdn.co/mp3-preview/7e22a60bb50aaf71b6401d520a621558f7f9a792?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 5, + "type": "track", + "uri": "spotify:track:4tXp4a1Dm13Mp3NkwDagyS" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3jpqAmDJIGUSrkSgJyAjU7" + }, + "href": "https://api.spotify.com/v1/artists/3jpqAmDJIGUSrkSgJyAjU7", + "id": "3jpqAmDJIGUSrkSgJyAjU7", + "name": "blaki rmt", + "type": "artist", + "uri": "spotify:artist:3jpqAmDJIGUSrkSgJyAjU7" + } + ], + "disc_number": 1, + "duration_ms": 120000, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1zqlzoTsnwQxAUJ4ylCe3D" + }, + "href": "https://api.spotify.com/v1/tracks/1zqlzoTsnwQxAUJ4ylCe3D", + "id": "1zqlzoTsnwQxAUJ4ylCe3D", + "is_local": false, + "is_playable": true, + "name": "por mal", + "preview_url": "https://p.scdn.co/mp3-preview/b4170a4f7a046875df96959f486f1f9100fd4340?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 6, + "type": "track", + "uri": "spotify:track:1zqlzoTsnwQxAUJ4ylCe3D" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3jpqAmDJIGUSrkSgJyAjU7" + }, + "href": "https://api.spotify.com/v1/artists/3jpqAmDJIGUSrkSgJyAjU7", + "id": "3jpqAmDJIGUSrkSgJyAjU7", + "name": "blaki rmt", + "type": "artist", + "uri": "spotify:artist:3jpqAmDJIGUSrkSgJyAjU7" + } + ], + "disc_number": 1, + "duration_ms": 132000, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/5hZqbNkZTJxujJ6SXqCdiF" + }, + "href": "https://api.spotify.com/v1/tracks/5hZqbNkZTJxujJ6SXqCdiF", + "id": "5hZqbNkZTJxujJ6SXqCdiF", + "is_local": false, + "is_playable": true, + "name": "sabemos todos", + "preview_url": "https://p.scdn.co/mp3-preview/2c01bab2729932393f75863408dc21a4799a1a6b?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 7, + "type": "track", + "uri": "spotify:track:5hZqbNkZTJxujJ6SXqCdiF" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 7 + }, + "type": "album", + "uri": "spotify:album:6I6LUGNfzrUNDhgPSfds9Y" + }, + { + "album_type": "album", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "copyrights": [ + { + "text": "2022 Loewe Verlag GmbH", + "type": "P" + } + ], + "external_ids": { + "upc": "4066338502025" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/73nOXBEW3G3vRtDIsrUvj1" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/73nOXBEW3G3vRtDIsrUvj1", + "id": "73nOXBEW3G3vRtDIsrUvj1", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b27376446b04d24a8c30ca7a28f7", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e0276446b04d24a8c30ca7a28f7", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d0000485176446b04d24a8c30ca7a28f7", + "width": 64 + } + ], + "is_playable": true, + "label": "Loewe Verlag", + "name": "Adele und der beste Sommer der Welt (Eine warmherzige Geschichte über Adeles turbulentes Familenleben - geschrieben und gelesen von Bestsellerautorin Sabine Bohlmann)", + "popularity": 28, + "release_date": "2020-03-11", + "release_date_precision": "day", + "total_tracks": 43, + "tracks": { + "href": "https://api.spotify.com/v1/albums/73nOXBEW3G3vRtDIsrUvj1/tracks?offset=0&limit=50&market=VN&locale=en,vi;q=0.9", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 225695, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1XUNJ4mGacQDmOqXEWAQT7" + }, + "href": "https://api.spotify.com/v1/tracks/1XUNJ4mGacQDmOqXEWAQT7", + "id": "1XUNJ4mGacQDmOqXEWAQT7", + "is_local": false, + "is_playable": true, + "name": "Kapitel 1 & Kapitel 2.1 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/673db2595612c1466d6a89befc9b0a057fe33aea?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:1XUNJ4mGacQDmOqXEWAQT7" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 228893, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/4lRQHPjn7OEmcNTBAT44P4" + }, + "href": "https://api.spotify.com/v1/tracks/4lRQHPjn7OEmcNTBAT44P4", + "id": "4lRQHPjn7OEmcNTBAT44P4", + "is_local": false, + "is_playable": true, + "name": "Kapitel 2.2 & Kapitel 3.1 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/57daeefb65f652188786ceb8ec904f3fa9898cac?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 2, + "type": "track", + "uri": "spotify:track:4lRQHPjn7OEmcNTBAT44P4" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 193100, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/5fVN5xmgIIiIZDT0ulizLu" + }, + "href": "https://api.spotify.com/v1/tracks/5fVN5xmgIIiIZDT0ulizLu", + "id": "5fVN5xmgIIiIZDT0ulizLu", + "is_local": false, + "is_playable": true, + "name": "Kapitel 3.2 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/0676348be053c4cb6307066f730481983f8e2b7a?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 3, + "type": "track", + "uri": "spotify:track:5fVN5xmgIIiIZDT0ulizLu" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 199668, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/743gVGxsAgrnlkiIEwspCl" + }, + "href": "https://api.spotify.com/v1/tracks/743gVGxsAgrnlkiIEwspCl", + "id": "743gVGxsAgrnlkiIEwspCl", + "is_local": false, + "is_playable": true, + "name": "Kapitel 3.3 & Kapitel 4.1 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/4a43064a41a54b03a537637fb8d8bd78523fa5d2?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 4, + "type": "track", + "uri": "spotify:track:743gVGxsAgrnlkiIEwspCl" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 197083, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0wPhKeHkpOpV3S3FttSNs4" + }, + "href": "https://api.spotify.com/v1/tracks/0wPhKeHkpOpV3S3FttSNs4", + "id": "0wPhKeHkpOpV3S3FttSNs4", + "is_local": false, + "is_playable": true, + "name": "Kapitel 4.2 & Kapitel 5.1 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/3a265aa9cc24dfaf14fcc4fbd4ad07f2922fd0fd?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 5, + "type": "track", + "uri": "spotify:track:0wPhKeHkpOpV3S3FttSNs4" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 191740, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6gHa8QMD2HhEwMBZQtccwo" + }, + "href": "https://api.spotify.com/v1/tracks/6gHa8QMD2HhEwMBZQtccwo", + "id": "6gHa8QMD2HhEwMBZQtccwo", + "is_local": false, + "is_playable": true, + "name": "Kapitel 5.2 & Kapitel 6.1 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/7a652e0f7df8fd34f10e9df36f2af344d58d2349?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 6, + "type": "track", + "uri": "spotify:track:6gHa8QMD2HhEwMBZQtccwo" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 185801, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/4nOSB2NOx7ojS0uEGLzpVv" + }, + "href": "https://api.spotify.com/v1/tracks/4nOSB2NOx7ojS0uEGLzpVv", + "id": "4nOSB2NOx7ojS0uEGLzpVv", + "is_local": false, + "is_playable": true, + "name": "Kapitel 6.2 & Kapitel 7.1 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/a824c815aea3b9d558a75f7cb1f88c7e3edabc92?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 7, + "type": "track", + "uri": "spotify:track:4nOSB2NOx7ojS0uEGLzpVv" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 192000, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/445bCoQdlRviOQw2sUwsKu" + }, + "href": "https://api.spotify.com/v1/tracks/445bCoQdlRviOQw2sUwsKu", + "id": "445bCoQdlRviOQw2sUwsKu", + "is_local": false, + "is_playable": true, + "name": "Kapitel 7.2 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/9b8166aec13ee1fd1428ae59773433bb4f2e371e?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 8, + "type": "track", + "uri": "spotify:track:445bCoQdlRviOQw2sUwsKu" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 216935, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3RoOXUOFyveJcQGCN0pSTm" + }, + "href": "https://api.spotify.com/v1/tracks/3RoOXUOFyveJcQGCN0pSTm", + "id": "3RoOXUOFyveJcQGCN0pSTm", + "is_local": false, + "is_playable": true, + "name": "Kapitel 7.3 & Kapitel 8.1 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/ab330f09abddf3a3c31be0f6907736d3dfbe968e?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 9, + "type": "track", + "uri": "spotify:track:3RoOXUOFyveJcQGCN0pSTm" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 185513, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0Rh5qZpDj8eznvU2kmAZHN" + }, + "href": "https://api.spotify.com/v1/tracks/0Rh5qZpDj8eznvU2kmAZHN", + "id": "0Rh5qZpDj8eznvU2kmAZHN", + "is_local": false, + "is_playable": true, + "name": "Kapitel 8.2 & Kapitel 9.1 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/822ca0e489f2392d51f730d111480a4f5976e5ec?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 10, + "type": "track", + "uri": "spotify:track:0Rh5qZpDj8eznvU2kmAZHN" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 194311, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/41BF8EzweUa4hd91JpX3nf" + }, + "href": "https://api.spotify.com/v1/tracks/41BF8EzweUa4hd91JpX3nf", + "id": "41BF8EzweUa4hd91JpX3nf", + "is_local": false, + "is_playable": true, + "name": "Kapitel 9.2 & Kapitel 10.1 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/88013bd1e08b162f3fdc4a796f44b9f609d97052?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 11, + "type": "track", + "uri": "spotify:track:41BF8EzweUa4hd91JpX3nf" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 257164, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6oTjFzaPZadaPYGMNfovS1" + }, + "href": "https://api.spotify.com/v1/tracks/6oTjFzaPZadaPYGMNfovS1", + "id": "6oTjFzaPZadaPYGMNfovS1", + "is_local": false, + "is_playable": true, + "name": "Kapitel 10.2 & Kapitel 11.1 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/a3c2c90f28221856c6f6894226f1ecd43c6ad0dd?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 12, + "type": "track", + "uri": "spotify:track:6oTjFzaPZadaPYGMNfovS1" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 213318, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6rZgPAthEWXNVG3lf3VJds" + }, + "href": "https://api.spotify.com/v1/tracks/6rZgPAthEWXNVG3lf3VJds", + "id": "6rZgPAthEWXNVG3lf3VJds", + "is_local": false, + "is_playable": true, + "name": "Kapitel 11.2 & Kapitel 12.1 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/085a0148646566b894f2b0b593c521c2907ff178?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 13, + "type": "track", + "uri": "spotify:track:6rZgPAthEWXNVG3lf3VJds" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 191091, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/5rXAkeGsLXbi4UFYiNWdYz" + }, + "href": "https://api.spotify.com/v1/tracks/5rXAkeGsLXbi4UFYiNWdYz", + "id": "5rXAkeGsLXbi4UFYiNWdYz", + "is_local": false, + "is_playable": true, + "name": "Kapitel 12.2 & Kapitel 13.1 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/1d50b8481f60bcb43a2b39b1bdd067ca34e145f4?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 14, + "type": "track", + "uri": "spotify:track:5rXAkeGsLXbi4UFYiNWdYz" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 253200, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2xuTQRLKOfcvssikzxNakD" + }, + "href": "https://api.spotify.com/v1/tracks/2xuTQRLKOfcvssikzxNakD", + "id": "2xuTQRLKOfcvssikzxNakD", + "is_local": false, + "is_playable": true, + "name": "Kapitel 13.2 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/6ffaa2cf440e7c30bea93c08e9a9339d5d3bc4c3?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 15, + "type": "track", + "uri": "spotify:track:2xuTQRLKOfcvssikzxNakD" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 203067, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/4LDziZy5PbCO1Q0qi60TWV" + }, + "href": "https://api.spotify.com/v1/tracks/4LDziZy5PbCO1Q0qi60TWV", + "id": "4LDziZy5PbCO1Q0qi60TWV", + "is_local": false, + "is_playable": true, + "name": "Kapitel 13.3 & Kapitel 14.1 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/161c0867028985c501e5cdb610b7d78f9b5348ef?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 16, + "type": "track", + "uri": "spotify:track:4LDziZy5PbCO1Q0qi60TWV" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 193486, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1vogpAJBt4AoDL6nkekFJ0" + }, + "href": "https://api.spotify.com/v1/tracks/1vogpAJBt4AoDL6nkekFJ0", + "id": "1vogpAJBt4AoDL6nkekFJ0", + "is_local": false, + "is_playable": true, + "name": "Kapitel 14.2 & Kapitel 15.1 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/bebc8318d845e0477e0b35c4e4c142587ed7504e?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 17, + "type": "track", + "uri": "spotify:track:1vogpAJBt4AoDL6nkekFJ0" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 194837, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6ziguUUYL4EyHyN4P8amH4" + }, + "href": "https://api.spotify.com/v1/tracks/6ziguUUYL4EyHyN4P8amH4", + "id": "6ziguUUYL4EyHyN4P8amH4", + "is_local": false, + "is_playable": true, + "name": "Kapitel 15.2 & Kapitel 16.1 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/af04f9cc20d6cacee3b4aca1e1325aa7efa303f2?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 18, + "type": "track", + "uri": "spotify:track:6ziguUUYL4EyHyN4P8amH4" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 200181, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/43q68XPHz9s6ibAz8S4WTN" + }, + "href": "https://api.spotify.com/v1/tracks/43q68XPHz9s6ibAz8S4WTN", + "id": "43q68XPHz9s6ibAz8S4WTN", + "is_local": false, + "is_playable": true, + "name": "Kapitel 16.2 & Kapitel 17.1 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/220f4b99aee422ba6c729850e0898d80541262e1?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 19, + "type": "track", + "uri": "spotify:track:43q68XPHz9s6ibAz8S4WTN" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 194200, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3rjGChfIxdjw4x4xGoh9ye" + }, + "href": "https://api.spotify.com/v1/tracks/3rjGChfIxdjw4x4xGoh9ye", + "id": "3rjGChfIxdjw4x4xGoh9ye", + "is_local": false, + "is_playable": true, + "name": "Kapitel 17.2 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/980aeb0fbc29e7b0d3d5b5104733a2101b6608c1?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 20, + "type": "track", + "uri": "spotify:track:3rjGChfIxdjw4x4xGoh9ye" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 189799, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/4y9hIHXQmQjMwP2VoyOLYI" + }, + "href": "https://api.spotify.com/v1/tracks/4y9hIHXQmQjMwP2VoyOLYI", + "id": "4y9hIHXQmQjMwP2VoyOLYI", + "is_local": false, + "is_playable": true, + "name": "Kapitel 17.3 & Kapitel 18.1 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/155f16d734c368258cdd8d1840fdf19f910c17eb?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 21, + "type": "track", + "uri": "spotify:track:4y9hIHXQmQjMwP2VoyOLYI" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 210353, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1H182fBHgUsV2i3Y42iyyF" + }, + "href": "https://api.spotify.com/v1/tracks/1H182fBHgUsV2i3Y42iyyF", + "id": "1H182fBHgUsV2i3Y42iyyF", + "is_local": false, + "is_playable": true, + "name": "Kapitel 18.2 & Kapitel 19.1 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/80d81c05a1f733a98023a08918f1fa7a696ff97b?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 22, + "type": "track", + "uri": "spotify:track:1H182fBHgUsV2i3Y42iyyF" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 211640, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/5WLCaCphcSsuwdbfw0MVxU" + }, + "href": "https://api.spotify.com/v1/tracks/5WLCaCphcSsuwdbfw0MVxU", + "id": "5WLCaCphcSsuwdbfw0MVxU", + "is_local": false, + "is_playable": true, + "name": "Kapitel 19.2 & Kapitel 20.1 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/49ada320c8da608609ddff4b68617be1550b1baa?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 23, + "type": "track", + "uri": "spotify:track:5WLCaCphcSsuwdbfw0MVxU" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 192709, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/05203ZUKPnoVRaFCOnwLFv" + }, + "href": "https://api.spotify.com/v1/tracks/05203ZUKPnoVRaFCOnwLFv", + "id": "05203ZUKPnoVRaFCOnwLFv", + "is_local": false, + "is_playable": true, + "name": "Kapitel 20.2 & Kapitel 21.1 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/70c924b08dccf27a116c50d19cc73802e4f440e2?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 24, + "type": "track", + "uri": "spotify:track:05203ZUKPnoVRaFCOnwLFv" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 214500, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/07cMiuD9pIsjwq4wwLJqqR" + }, + "href": "https://api.spotify.com/v1/tracks/07cMiuD9pIsjwq4wwLJqqR", + "id": "07cMiuD9pIsjwq4wwLJqqR", + "is_local": false, + "is_playable": true, + "name": "Kapitel 21.2 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/d14409c102233fdd85d79b9544862943988f01e9?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 25, + "type": "track", + "uri": "spotify:track:07cMiuD9pIsjwq4wwLJqqR" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 204860, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/70KnU6gd7uQYz0UlMJLahf" + }, + "href": "https://api.spotify.com/v1/tracks/70KnU6gd7uQYz0UlMJLahf", + "id": "70KnU6gd7uQYz0UlMJLahf", + "is_local": false, + "is_playable": true, + "name": "Kapitel 21.3 & Kapitel 22.1 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/344c407b772719fd97338630ea7e1ac1455be388?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 26, + "type": "track", + "uri": "spotify:track:70KnU6gd7uQYz0UlMJLahf" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 202459, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/4Ilq2vHWrLhvHF5pXkw7Fg" + }, + "href": "https://api.spotify.com/v1/tracks/4Ilq2vHWrLhvHF5pXkw7Fg", + "id": "4Ilq2vHWrLhvHF5pXkw7Fg", + "is_local": false, + "is_playable": true, + "name": "Kapitel 22.2 & Kapitel 23.1 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/af71b571ef68eba9613e6246fbfca7fa2fb3e8bf?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 27, + "type": "track", + "uri": "spotify:track:4Ilq2vHWrLhvHF5pXkw7Fg" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 198768, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/6CybXuLwxBGmECRIoTtbe9" + }, + "href": "https://api.spotify.com/v1/tracks/6CybXuLwxBGmECRIoTtbe9", + "id": "6CybXuLwxBGmECRIoTtbe9", + "is_local": false, + "is_playable": true, + "name": "Kapitel 23.2 & Kapitel 24.1 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/c6bcf411573901d980079953056740e0d4c3d538?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 28, + "type": "track", + "uri": "spotify:track:6CybXuLwxBGmECRIoTtbe9" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 200300, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/3F0SS9sErcx1YfQg3QSDOm" + }, + "href": "https://api.spotify.com/v1/tracks/3F0SS9sErcx1YfQg3QSDOm", + "id": "3F0SS9sErcx1YfQg3QSDOm", + "is_local": false, + "is_playable": true, + "name": "Kapitel 24.2 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/ddd7268093d9c8a8206503d009c62cbac165d8d1?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 29, + "type": "track", + "uri": "spotify:track:3F0SS9sErcx1YfQg3QSDOm" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 207066, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1faY9PyBNctru5fKiEo6cM" + }, + "href": "https://api.spotify.com/v1/tracks/1faY9PyBNctru5fKiEo6cM", + "id": "1faY9PyBNctru5fKiEo6cM", + "is_local": false, + "is_playable": true, + "name": "Kapitel 24.3 & Kapitel 25.1 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/8df5947e0336c6b91d339b600de94f920dbe6197?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 30, + "type": "track", + "uri": "spotify:track:1faY9PyBNctru5fKiEo6cM" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 229334, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0MlO0STcKG8PGTzvKxiN2H" + }, + "href": "https://api.spotify.com/v1/tracks/0MlO0STcKG8PGTzvKxiN2H", + "id": "0MlO0STcKG8PGTzvKxiN2H", + "is_local": false, + "is_playable": true, + "name": "Kapitel 25.2 & Kapitel 26.1 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/f457bcf21072c34561728b3c700a2c164f4c0475?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 31, + "type": "track", + "uri": "spotify:track:0MlO0STcKG8PGTzvKxiN2H" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 192126, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/7MxFeKifHg7xPVA6wwoY0f" + }, + "href": "https://api.spotify.com/v1/tracks/7MxFeKifHg7xPVA6wwoY0f", + "id": "7MxFeKifHg7xPVA6wwoY0f", + "is_local": false, + "is_playable": true, + "name": "Kapitel 26.2 & Kapitel 27.1 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/bf9902e77776328051ef3aa212fd0a05e0da1d6a?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 32, + "type": "track", + "uri": "spotify:track:7MxFeKifHg7xPVA6wwoY0f" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 196771, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/5lqxw4DcTF7kODgLu4xnTL" + }, + "href": "https://api.spotify.com/v1/tracks/5lqxw4DcTF7kODgLu4xnTL", + "id": "5lqxw4DcTF7kODgLu4xnTL", + "is_local": false, + "is_playable": true, + "name": "Kapitel 27.2 & Kapitel 28.1 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/a3ba58e659a8921ae337f6486a32158e05017cd2?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 33, + "type": "track", + "uri": "spotify:track:5lqxw4DcTF7kODgLu4xnTL" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 192356, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/4S3ypUErEaKT3h4q3VJ1xb" + }, + "href": "https://api.spotify.com/v1/tracks/4S3ypUErEaKT3h4q3VJ1xb", + "id": "4S3ypUErEaKT3h4q3VJ1xb", + "is_local": false, + "is_playable": true, + "name": "Kapitel 28.2 & Kapitel 29.1 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/f41192586b99629de8b59d169b0d36f0b24a16e6?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 34, + "type": "track", + "uri": "spotify:track:4S3ypUErEaKT3h4q3VJ1xb" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 202200, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/35ZZIx3v8nyG9T5bv5vdY5" + }, + "href": "https://api.spotify.com/v1/tracks/35ZZIx3v8nyG9T5bv5vdY5", + "id": "35ZZIx3v8nyG9T5bv5vdY5", + "is_local": false, + "is_playable": true, + "name": "Kapitel 29.2 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/4c2d64e366396020361bf5ff071d3c560fadcb0c?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 35, + "type": "track", + "uri": "spotify:track:35ZZIx3v8nyG9T5bv5vdY5" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 190775, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1TLUVX2gIEwz4NRbXfYGBB" + }, + "href": "https://api.spotify.com/v1/tracks/1TLUVX2gIEwz4NRbXfYGBB", + "id": "1TLUVX2gIEwz4NRbXfYGBB", + "is_local": false, + "is_playable": true, + "name": "Kapitel 29.3 & Kapitel 30.1 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/60399aba4f5243aad87ccb78a26dfd35ead6360e?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 36, + "type": "track", + "uri": "spotify:track:1TLUVX2gIEwz4NRbXfYGBB" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 194014, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/2ZgP8J8YdOKJ0MAYIDVhtM" + }, + "href": "https://api.spotify.com/v1/tracks/2ZgP8J8YdOKJ0MAYIDVhtM", + "id": "2ZgP8J8YdOKJ0MAYIDVhtM", + "is_local": false, + "is_playable": true, + "name": "Kapitel 30.2 & Kapitel 31.1 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/772f7d87d3f1c0f6de8750e40e7949fb4c9438e7?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 37, + "type": "track", + "uri": "spotify:track:2ZgP8J8YdOKJ0MAYIDVhtM" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 230350, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/5IV4pc9JVeWtcBigBPz4I4" + }, + "href": "https://api.spotify.com/v1/tracks/5IV4pc9JVeWtcBigBPz4I4", + "id": "5IV4pc9JVeWtcBigBPz4I4", + "is_local": false, + "is_playable": true, + "name": "Kapitel 31.2 & Kapitel 32.1 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/92a738247c761f07a0717890adaebec1eb7ebbf3?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 38, + "type": "track", + "uri": "spotify:track:5IV4pc9JVeWtcBigBPz4I4" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 196866, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/54aeGnCRktdd1vaky0OxS9" + }, + "href": "https://api.spotify.com/v1/tracks/54aeGnCRktdd1vaky0OxS9", + "id": "54aeGnCRktdd1vaky0OxS9", + "is_local": false, + "is_playable": true, + "name": "Kapitel 32.2 & Kapitel 33.1 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/cfccabf45ee8fe7cb58151c1c763ca1ef460558a?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 39, + "type": "track", + "uri": "spotify:track:54aeGnCRktdd1vaky0OxS9" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 209621, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/4k1Dd3GP772WVgRikYefpl" + }, + "href": "https://api.spotify.com/v1/tracks/4k1Dd3GP772WVgRikYefpl", + "id": "4k1Dd3GP772WVgRikYefpl", + "is_local": false, + "is_playable": true, + "name": "Kapitel 33.2 & Kapitel 34.1 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/d1798eb8f58b95d4014e0374842186ef25366afd?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 40, + "type": "track", + "uri": "spotify:track:4k1Dd3GP772WVgRikYefpl" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 233475, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/1VSFT4PQuvTtQOTihoEiRQ" + }, + "href": "https://api.spotify.com/v1/tracks/1VSFT4PQuvTtQOTihoEiRQ", + "id": "1VSFT4PQuvTtQOTihoEiRQ", + "is_local": false, + "is_playable": true, + "name": "Kapitel 34.2 & Kapitel 35 & Kapitel 36.1 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/05f59af221814a22c1fdbfaad40466570d9e8d92?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 41, + "type": "track", + "uri": "spotify:track:1VSFT4PQuvTtQOTihoEiRQ" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 194358, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/5nrWpXvIjWXUo81Zn6LySr" + }, + "href": "https://api.spotify.com/v1/tracks/5nrWpXvIjWXUo81Zn6LySr", + "id": "5nrWpXvIjWXUo81Zn6LySr", + "is_local": false, + "is_playable": true, + "name": "Kapitel 36.2 & Kapitel 37.1 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/f4485807711ecaf54090cdf086c887cba34cfeca?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 42, + "type": "track", + "uri": "spotify:track:5nrWpXvIjWXUo81Zn6LySr" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5oCyRdPN5mmuvh69MF6Fqb" + }, + "href": "https://api.spotify.com/v1/artists/5oCyRdPN5mmuvh69MF6Fqb", + "id": "5oCyRdPN5mmuvh69MF6Fqb", + "name": "Sabine Bohlmann", + "type": "artist", + "uri": "spotify:artist:5oCyRdPN5mmuvh69MF6Fqb" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3TII9rihKMFGuLRLeOr4td" + }, + "href": "https://api.spotify.com/v1/artists/3TII9rihKMFGuLRLeOr4td", + "id": "3TII9rihKMFGuLRLeOr4td", + "name": "Adele-Hörbücher", + "type": "artist", + "uri": "spotify:artist:3TII9rihKMFGuLRLeOr4td" + } + ], + "disc_number": 1, + "duration_ms": 177743, + "explicit": false, + "external_urls": { + "spotify": "https://open.spotify.com/track/0EzEAPPhIVu8s7WNcfisma" + }, + "href": "https://api.spotify.com/v1/tracks/0EzEAPPhIVu8s7WNcfisma", + "id": "0EzEAPPhIVu8s7WNcfisma", + "is_local": false, + "is_playable": true, + "name": "Kapitel 37.2 - Adele und der beste Sommer der Welt", + "preview_url": "https://p.scdn.co/mp3-preview/7b4bfe3b5f97715c3507dd73e96a48d7c087c026?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 43, + "type": "track", + "uri": "spotify:track:0EzEAPPhIVu8s7WNcfisma" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 43 + }, + "type": "album", + "uri": "spotify:album:73nOXBEW3G3vRtDIsrUvj1" + } + ] +} diff --git a/public/data/bannerSearch.json b/public/data/bannerSearch.json new file mode 100644 index 0000000..b65c2fb --- /dev/null +++ b/public/data/bannerSearch.json @@ -0,0 +1,248 @@ +[ + { + "title": "Vietnamese Music", + "bgColor": "rgb(96, 129, 8)", + "id": "0JQ5DAqbMKFLIOWOrpNSUR", + "imgUrl": "https://i.scdn.co/image/ab67fb8200005caf55dfb53724670e4db6cee444" + }, + { + "title": "Pop", + "bgColor": "rgb(20, 138, 8)", + "id": "0JQ5DAqbMKFEC4WFtoNRpw", + "imgUrl": "https://i.scdn.co/image/ab67fb8200005cafa862ab80dd85682b37c4e768" + }, + { + "title": "K-pop", + "bgColor": "rgb(20, 138, 8)", + "id": "0JQ5DAqbMKFGvOw3O4nLAf", + "imgUrl": "https://i.scdn.co/image/ab67fb8200005caf013ee3c983e6f60bf28bad5a" + }, + { + "title": "Hip-Hop", + "bgColor": "rgb(188, 89, 0)", + "id": "0JQ5DAqbMKFQ00XGBls6ym", + "imgUrl": "https://i.scdn.co/image/ab67fb8200005caf7e11c8413dc33c00740579c1" + }, + { + "title": "Fresh Finds", + "bgColor": "rgb(255, 0, 144)", + "id": "0JQ5DAqbMKFImHYGo3eTSg", + "imgUrl": "https://i.scdn.co/image/ab67fb8200005cafcc1499bbb8565f490858c2bc" + }, + { + "title": "EQUAL", + "bgColor": "rgb(5, 105, 82)", + "id": "0JQ5DAqbMKFPw634sFwguI", + "imgUrl": "https://i.scdn.co/image/ab67fb8200005caf9ed6e364e8839210dc4dbff7" + }, + { + "title": "RADAR", + "bgColor": "rgb(119, 119, 119)", + "id": "0JQ5DAqbMKFOOxftoKZxod", + "imgUrl": "https://i.scdn.co/image/ab67fb8200005cafdb2aa9c7caea42f900721497" + }, + { + "title": "Mood", + "bgColor": "rgb(225, 17, 140)", + "id": "0JQ5DAqbMKFzHmL4tf05da", + "imgUrl": "https://i.scdn.co/image/ab67fb8200005caf271f9d895003c5f5561c1354" + }, + { + "title": "Rock", + "bgColor": "rgb(233, 20, 41)", + "id": "0JQ5DAqbMKFDXXwE9BDJAr", + "imgUrl": "https://i.scdn.co/image/ab67fb8200005cafae7e69beb88f16969641b53e" + }, + { + "title": "Latin", + "bgColor": "rgb(225, 17, 140)", + "id": "0JQ5DAqbMKFxXaXKP7zcDp", + "imgUrl": "https://i.scdn.co/image/ab67fb8200005cafa59f90c077c9f618fd0dde30" + }, + { + "title": "Dance/Electronic", + "bgColor": "rgb(216, 64, 0)", + "id": "0JQ5DAqbMKFHOzuVTgTizF", + "imgUrl": "https://i.scdn.co/image/ab67fb8200005cafdfdaac1cf9574a196ca25196" + }, + { + "title": "Indie", + "bgColor": "rgb(233, 20, 41)", + "id": "0JQ5DAqbMKFCWjUTdzaG0e", + "imgUrl": "https://i.scdn.co/image/ab67fb8200005cafa1a252e3a815b65778d8c2aa" + }, + { + "title": "Workout", + "bgColor": "rgb(119, 119, 119)", + "id": "0JQ5DAqbMKFAXlCG6QvYQ4", + "imgUrl": "https://i.scdn.co/image/ab67706f000000029249b35f23fb596b6f006a15" + }, + { + "title": "R&B", + "bgColor": "rgb(220, 20, 140)", + "id": "0JQ5DAqbMKFEZPnFQSFB1T", + "imgUrl": "https://i.scdn.co/image/ab67fb8200005cafbe6a6e705e1a71117c2d0c2c" + }, + { + "title": "Chill", + "bgColor": "rgb(216, 64, 0)", + "id": "0JQ5DAqbMKFFzDl7qN9Apr", + "imgUrl": "https://i.scdn.co/image/ab67fb8200005caf47e942f5bea637f4f4760170" + }, + { + "title": "Sleep", + "bgColor": "rgb(30, 50, 100)", + "id": "0JQ5DAqbMKFCuoRTxhYWow", + "imgUrl": "https://i.scdn.co/image/ab67706f00000002b70e0223f544b1faa2e95ed0" + }, + { + "title": "Party", + "bgColor": "rgb(83, 122, 161)", + "id": "0JQ5DAqbMKFA6SOHvT3gck", + "imgUrl": "https://i.scdn.co/image/ab67fb8200005cafcbf80f8ea695536eace4fd2c" + }, + { + "title": "At Home", + "bgColor": "rgb(81, 121, 161)", + "id": "0JQ5DAqbMKFx0uLQR2okcc", + "imgUrl": "https://i.scdn.co/image/ab67fb8200005cafe914a07d20cec7a65e2e5dad" + }, + { + "title": "Decades", + "bgColor": "rgb(186, 93, 7)", + "id": "0JQ5DAqbMKFIVNxQgRNSg0", + "imgUrl": "https://i.scdn.co/image/ab67fb8200005caff005a355830c374754d32868" + }, + { + "title": "Love", + "bgColor": "rgb(230, 30, 50)", + "id": "0JQ5DAqbMKFAUsdyVjCQuL", + "imgUrl": "https://i.scdn.co/image/ab67fb8200005cafb03c6f8e7efca2ae36f41b31" + }, + { + "title": "Metal", + "bgColor": "rgb(233, 20, 41)", + "id": "0JQ5DAqbMKFDkd668ypn6O", + "imgUrl": "https://i.scdn.co/image/ab67fb8200005cafefa737b67ec51ec989f5a51d" + }, + { + "title": "Jazz", + "bgColor": "rgb(119, 119, 119)", + "id": "0JQ5DAqbMKFAJ5xb0fwo9m", + "imgUrl": "https://i.scdn.co/image/ab67fb8200005cafe289743024639ea8f202364d" + }, + { + "title": "Trending", + "bgColor": "rgb(176, 40, 151)", + "id": "0JQ5DAqbMKFQIL0AXnG5AK", + "imgUrl": "https://i.scdn.co/image/ab67fb8200005caf1867113f5218598847550acd" + }, + { + "title": "Classical", + "bgColor": "rgb(125, 75, 50)", + "id": "0JQ5DAqbMKFPrEiAOxgac3", + "imgUrl": "https://i.scdn.co/image/ab67fb8200005caf12809992dfc5b318892ea07b" + }, + { + "title": "Folk & Acoustic", + "bgColor": "rgb(188, 89, 0)", + "id": "0JQ5DAqbMKFy78wprEpAjl", + "imgUrl": "https://i.scdn.co/image/ab67fb8200005cafcc70a3c2e4c71398708bdc4a" + }, + { + "title": "Focus", + "bgColor": "rgb(80, 55, 80)", + "id": "0JQ5DAqbMKFCbimwdOYlsl", + "imgUrl": "https://i.scdn.co/image/ab67706f00000002e4eadd417a05b2546e866934" + }, + { + "title": "Soul", + "bgColor": "rgb(220, 20, 140)", + "id": "0JQ5DAqbMKFIpEuaCnimBj", + "imgUrl": "https://i.scdn.co/image/ab67fb8200005cafd82e2c83fe100a89e9cbb2a2" + }, + { + "title": "Kids & Family", + "bgColor": "rgb(141, 103, 171)", + "id": "0JQ5DAqbMKFFoimhOqWzLB", + "imgUrl": "https://i.scdn.co/image/ab67fb8200005caf8a04560a209b3f32165ea8a2" + }, + { + "title": "Gaming", + "bgColor": "rgb(232, 17, 91)", + "id": "0JQ5DAqbMKFCfObibaOZbv", + "imgUrl": "https://i.scdn.co/image/ab67fb8200005caf26dd3719e8824756914ae61f" + }, + { + "title": "Anime", + "bgColor": "rgb(228, 29, 99)", + "id": "0JQ5DAqbMKFziKOShCi009", + "imgUrl": "https://i.scdn.co/image/ab67706f00000002c19c5f13f8b3ff2d73ff00bc" + }, + { + "title": "Instrumental", + "bgColor": "rgb(83, 122, 161)", + "id": "0JQ5DAqbMKFRieVZLLoo9m", + "imgUrl": "https://i.scdn.co/image/ab67706f000000028ed1a5002b96c2ea882541b2" + }, + { + "title": "Wellness", + "bgColor": "rgb(165, 103, 82)", + "id": "0JQ5DAqbMKFLb2EqgLtpjC", + "imgUrl": "https://i.scdn.co/image/ab67fb8200005caf8dec632effd9735fa8aba06e" + }, + { + "title": "Punk", + "bgColor": "rgb(30, 50, 100)", + "id": "0JQ5DAqbMKFAjfauKLOZiv", + "imgUrl": "https://i.scdn.co/image/ab67fb8200005cafb2cdd7a95b0a5444aa15cfb5" + }, + { + "title": "Ambient", + "bgColor": "rgb(71, 125, 149)", + "id": "0JQ5DAqbMKFLjmiZRss79w", + "imgUrl": "https://i.scdn.co/image/ab67fb8200005cafa6ee95dc83af715115f40522" + }, + { + "title": "Blues", + "bgColor": "rgb(176, 98, 57)", + "id": "0JQ5DAqbMKFQiK2EHwyjcU", + "imgUrl": "https://i.scdn.co/image/ab67fb8200005caff22ac5cab318d550b593ffac" + }, + { + "title": "Cooking & Dining", + "bgColor": "rgb(186, 93, 7)", + "id": "0JQ5DAqbMKFRY5ok2pxXJ0", + "imgUrl": "https://i.scdn.co/image/ab67fb8200005cafe53d71d0920a4f1f441d803c" + }, + { + "title": "Alternative", + "bgColor": "rgb(233, 20, 41)", + "id": "0JQ5DAqbMKFFtlLYUHv8bT", + "imgUrl": "https://i.scdn.co/image/ab67fb8200005cafda178a834e4f87371e9fa543" + }, + { + "title": "Travel", + "bgColor": "rgb(13, 114, 237)", + "id": "0JQ5DAqbMKFAQy4HL4XU2D", + "imgUrl": "https://i.scdn.co/image/ab67fb8200005caf4b36a2c31432ace68d90c4f2" + }, + { + "title": "Spotify Singles", + "bgColor": "rgb(119, 119, 119)", + "id": "0JQ5DAqbMKFDBgllo2cUIN", + "imgUrl": "https://i.scdn.co/image/ab67fb8200005caf14030380532b34badbf0a229" + }, + { + "title": "Summer", + "bgColor": "rgb(39, 133, 106)", + "id": "0JQ5DAqbMKFLVaM30PMBm4", + "imgUrl": "https://i.scdn.co/image/ab67fb8200005caf097a46192e6bb67e52cdff60" + }, + { + "title": "Tastemakers", + "bgColor": "rgb(232, 17, 91)", + "id": "0JQ5DAqbMKFRKBHIxJ5hMm", + "imgUrl": "https://t.scdn.co/images/37732285a0ff4e24987cdf5c45bdf31f.png" + } +] diff --git a/public/data/initAlbums.json b/public/data/initAlbums.json deleted file mode 100644 index c26d95b..0000000 --- a/public/data/initAlbums.json +++ /dev/null @@ -1,1162 +0,0 @@ -{ - "query": "money", - "albums": { - "totalCount": 450, - "items": [ - { - "data": { - "uri": "spotify:album:2drqVzCt52KiDxKgl0Rq0P", - "name": "Money", - "artists": { - "items": [ - { - "uri": "spotify:artist:4kYSro6naA4h99UJvo89HB", - "profile": { - "name": "Cardi B" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e028d5816c9f31f1187eb30913f", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d000048518d5816c9f31f1187eb30913f", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b2738d5816c9f31f1187eb30913f", - "width": 640, - "height": 640 - } - ] - }, - "date": { - "year": 2018 - } - } - }, - { - "data": { - "uri": "spotify:album:1pDKUOkHVHGKKzH69YVnOG", - "name": "Hard To Love", - "artists": { - "items": [ - { - "uri": "spotify:artist:3tJoFztHeIJkJWMrx0td2f", - "profile": { - "name": "Moneybagg Yo" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e0280d4dbabc0b1e635692839eb", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000485180d4dbabc0b1e635692839eb", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b27380d4dbabc0b1e635692839eb", - "width": 640, - "height": 640 - } - ] - }, - "date": { - "year": 2023 - } - } - }, - { - "data": { - "uri": "spotify:album:2Jj4mjzEDaXp9X3AHpo5Gu", - "name": "Money", - "artists": { - "items": [ - { - "uri": "spotify:artist:1gW6pz5n1aK249L0GvfQCC", - "profile": { - "name": "Grupo Marca Registrada" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e02fea3fb9a7ce7d1ce21ac6322", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d00004851fea3fb9a7ce7d1ce21ac6322", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b273fea3fb9a7ce7d1ce21ac6322", - "width": 640, - "height": 640 - } - ] - }, - "date": { - "year": 2021 - } - } - }, - { - "data": { - "uri": "spotify:album:12QMwxaBwtZWp7BKBwzaol", - "name": "Hard To Love", - "artists": { - "items": [ - { - "uri": "spotify:artist:3tJoFztHeIJkJWMrx0td2f", - "profile": { - "name": "Moneybagg Yo" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e021a7fadc93eaa5c5749df4bc4", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d000048511a7fadc93eaa5c5749df4bc4", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b2731a7fadc93eaa5c5749df4bc4", - "width": 640, - "height": 640 - } - ] - }, - "date": { - "year": 2023 - } - } - }, - { - "data": { - "uri": "spotify:album:1nlaLDMPSzXL8G5LPBDhwd", - "name": "MONEY ON THE DASH", - "artists": { - "items": [ - { - "uri": "spotify:artist:67MNhiAICFY6Pwc2YxCO0K", - "profile": { - "name": "Elley Duhé" - } - }, - { - "uri": "spotify:artist:0vqJkZ0RpLZixt3lTmD8vP", - "profile": { - "name": "Whethan" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e02a33af2e78a60e270aa668f43", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d00004851a33af2e78a60e270aa668f43", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b273a33af2e78a60e270aa668f43", - "width": 640, - "height": 640 - } - ] - }, - "date": { - "year": 2023 - } - } - }, - { - "data": { - "uri": "spotify:album:5PtCXycY9LrvdDeXWioM9o", - "name": "Moneysign Suede", - "artists": { - "items": [ - { - "uri": "spotify:artist:5w61NhDHxboaPUjFZ9r2vh", - "profile": { - "name": "MoneySign Suede" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e029ba085929b4f1e70b0652900", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d000048519ba085929b4f1e70b0652900", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b2739ba085929b4f1e70b0652900", - "width": 640, - "height": 640 - } - ] - }, - "date": { - "year": 2022 - } - } - }, - { - "data": { - "uri": "spotify:album:5ffogo3K3fYibGWa93IzUe", - "name": "A Gangsta’s Pain", - "artists": { - "items": [ - { - "uri": "spotify:artist:3tJoFztHeIJkJWMrx0td2f", - "profile": { - "name": "Moneybagg Yo" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e02b9ba23c2a9edf6f4b7e48bed", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d00004851b9ba23c2a9edf6f4b7e48bed", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b273b9ba23c2a9edf6f4b7e48bed", - "width": 640, - "height": 640 - } - ] - }, - "date": { - "year": 2021 - } - } - }, - { - "data": { - "uri": "spotify:album:7jt2ZSsqgR2VG6s1XkWw7E", - "name": "Money", - "artists": { - "items": [ - { - "uri": "spotify:artist:2o5jDhtHVPhrJdv3cEQ99Z", - "profile": { - "name": "Tiësto" - } - }, - { - "uri": "spotify:artist:5iQ5zOYomcR6F3gYon6GNW", - "profile": { - "name": "Killfake" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e0268a8451f72e70040392160bc", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000485168a8451f72e70040392160bc", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b27368a8451f72e70040392160bc", - "width": 640, - "height": 640 - } - ] - }, - "date": { - "year": 2021 - } - } - }, - { - "data": { - "uri": "spotify:album:0WPnWF4ZnJFn6Li3DXcObK", - "name": "Money", - "artists": { - "items": [ - { - "uri": "spotify:artist:3eUpxakSdjFZ5ROQKgfL2W", - "profile": { - "name": "Tentendo" - } - }, - { - "uri": "spotify:artist:6cUanG4fLNSAhNEcu6n34w", - "profile": { - "name": "honey" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e021a3b80f33e9c04bc1b92d9ea", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d000048511a3b80f33e9c04bc1b92d9ea", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b2731a3b80f33e9c04bc1b92d9ea", - "width": 640, - "height": 640 - } - ] - }, - "date": { - "year": 2023 - } - } - }, - { - "data": { - "uri": "spotify:album:6tQbwu7HWigKSOVuQOa0os", - "name": "MONEY ON THE DASH - Diplo Remix", - "artists": { - "items": [ - { - "uri": "spotify:artist:67MNhiAICFY6Pwc2YxCO0K", - "profile": { - "name": "Elley Duhé" - } - }, - { - "uri": "spotify:artist:0vqJkZ0RpLZixt3lTmD8vP", - "profile": { - "name": "Whethan" - } - }, - { - "uri": "spotify:artist:5fMUXHkw8R8eOP2RNVYEZX", - "profile": { - "name": "Diplo" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e02d67a266807ee42d1fd9ce0a0", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d00004851d67a266807ee42d1fd9ce0a0", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b273d67a266807ee42d1fd9ce0a0", - "width": 640, - "height": 640 - } - ] - }, - "date": { - "year": 2023 - } - } - }, - { - "data": { - "uri": "spotify:album:2pe0owZ6XB7MnLTzi6Qf8M", - "name": "Money", - "artists": { - "items": [ - { - "uri": "spotify:artist:67FB4n52MgexGQIG8s0yUH", - "profile": { - "name": "Lola Young" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e029fd99a4e0ee3cb7a55471cf0", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d000048519fd99a4e0ee3cb7a55471cf0", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b2739fd99a4e0ee3cb7a55471cf0", - "width": 640, - "height": 640 - } - ] - }, - "date": { - "year": 2023 - } - } - }, - { - "data": { - "uri": "spotify:album:1VbBXmKIEcjABfAOOAxdiE", - "name": "Ocean Spray", - "artists": { - "items": [ - { - "uri": "spotify:artist:3tJoFztHeIJkJWMrx0td2f", - "profile": { - "name": "Moneybagg Yo" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e021fd55012ede32e7ea08c928c", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d000048511fd55012ede32e7ea08c928c", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b2731fd55012ede32e7ea08c928c", - "width": 640, - "height": 640 - } - ] - }, - "date": { - "year": 2023 - } - } - }, - { - "data": { - "uri": "spotify:album:5qmEF78Uq9CjwIgvKQe7WG", - "name": "Money", - "artists": { - "items": [ - { - "uri": "spotify:artist:0bzfPKdbXL5ezYW2z3UGQj", - "profile": { - "name": "Michael Kiwanuka" - } - }, - { - "uri": "spotify:artist:1uiEZYehlNivdK3iQyAbye", - "profile": { - "name": "Tom Misch" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e0213df1883a40a27f8f0d41d0a", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000485113df1883a40a27f8f0d41d0a", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b27313df1883a40a27f8f0d41d0a", - "width": 640, - "height": 640 - } - ] - }, - "date": { - "year": 2019 - } - } - }, - { - "data": { - "uri": "spotify:album:0z3SFl34YWiKMXwsTNPdVp", - "name": "Money Rain (Phonk Remix)", - "artists": { - "items": [ - { - "uri": "spotify:artist:1iuGd0kNu2eqLwP9DFGCNY", - "profile": { - "name": "VTORNIK" - } - }, - { - "uri": "spotify:artist:3kXvE7gEBfGkwDaknMngF7", - "profile": { - "name": "Phonk" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e020cffcb3e6efe7b82200366cd", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d000048510cffcb3e6efe7b82200366cd", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b2730cffcb3e6efe7b82200366cd", - "width": 640, - "height": 640 - } - ] - }, - "date": { - "year": 2021 - } - } - }, - { - "data": { - "uri": "spotify:album:7wbZNsw7lzryElP81VzFVk", - "name": "Money", - "artists": { - "items": [ - { - "uri": "spotify:artist:0CGIvnmyQM231duHwTYp1c", - "profile": { - "name": "Ketafijikana" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e023c75b4518b9abece4869e66c", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d000048513c75b4518b9abece4869e66c", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b2733c75b4518b9abece4869e66c", - "width": 640, - "height": 640 - } - ] - }, - "date": { - "year": 2021 - } - } - }, - { - "data": { - "uri": "spotify:album:30XjUCo4sqJqNuYuJdYAFu", - "name": "Keep It Low (feat. Future)", - "artists": { - "items": [ - { - "uri": "spotify:artist:3tJoFztHeIJkJWMrx0td2f", - "profile": { - "name": "Moneybagg Yo" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e02c75b4a7e2fbda0cd442b267f", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d00004851c75b4a7e2fbda0cd442b267f", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b273c75b4a7e2fbda0cd442b267f", - "width": 640, - "height": 640 - } - ] - }, - "date": { - "year": 2023 - } - } - }, - { - "data": { - "uri": "spotify:album:7AxCwJSOFFXOGPNoQsotVT", - "name": "MONEY", - "artists": { - "items": [ - { - "uri": "spotify:artist:0J5NDaSRSz2QolH5yZNrnW", - "profile": { - "name": "Kartier papi" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e02cf9f475f5d7c910fb8d4191d", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d00004851cf9f475f5d7c910fb8d4191d", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b273cf9f475f5d7c910fb8d4191d", - "width": 640, - "height": 640 - } - ] - }, - "date": { - "year": 2023 - } - } - }, - { - "data": { - "uri": "spotify:album:2SvNV2pLgPlGBwYH9VoStl", - "name": "Money", - "artists": { - "items": [ - { - "uri": "spotify:artist:3MK71khOrqZwGpyfYzwKXR", - "profile": { - "name": "Jones Meadow" - } - }, - { - "uri": "spotify:artist:776UugG4CdQlYfsEUVCRqb", - "profile": { - "name": "Nina Carr" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e0215737e379261c0290805b3aa", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000485115737e379261c0290805b3aa", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b27315737e379261c0290805b3aa", - "width": 640, - "height": 640 - } - ] - }, - "date": { - "year": 2022 - } - } - }, - { - "data": { - "uri": "spotify:album:71gZFvUAe6KfEsji7oqXVv", - "name": "Ocean Spray", - "artists": { - "items": [ - { - "uri": "spotify:artist:3tJoFztHeIJkJWMrx0td2f", - "profile": { - "name": "Moneybagg Yo" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e02e99fff95f83d53a791fcbbbb", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d00004851e99fff95f83d53a791fcbbbb", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b273e99fff95f83d53a791fcbbbb", - "width": 640, - "height": 640 - } - ] - }, - "date": { - "year": 2023 - } - } - }, - { - "data": { - "uri": "spotify:album:1Iil75bwEdOFvpodfUtjHl", - "name": "Money", - "artists": { - "items": [ - { - "uri": "spotify:artist:3I4LABb5aL1DfRBaggbbFl", - "profile": { - "name": "Scotty Austin" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e02f45be13f270ba9a57499278b", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d00004851f45be13f270ba9a57499278b", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b273f45be13f270ba9a57499278b", - "width": 640, - "height": 640 - } - ] - }, - "date": { - "year": 2022 - } - } - }, - { - "data": { - "uri": "spotify:album:1fkGVz3LWxjax7F0Mrj3f5", - "name": "Money, Power & Respect", - "artists": { - "items": [ - { - "uri": "spotify:artist:0A7g2YbCA9FlyZvAG6VmKP", - "profile": { - "name": "The LOX" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e02a76a236552d8b904868933a3", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d00004851a76a236552d8b904868933a3", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b273a76a236552d8b904868933a3", - "width": 640, - "height": 640 - } - ] - }, - "date": { - "year": 1998 - } - } - }, - { - "data": { - "uri": "spotify:album:5ShVyR5WFkMR62ylYbRYhF", - "name": "Money", - "artists": { - "items": [ - { - "uri": "spotify:artist:1NP2R1VpIfFe7amzJxCDVh", - "profile": { - "name": "V1V1D" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e02b495ab467bf92d096fc07ab6", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d00004851b495ab467bf92d096fc07ab6", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b273b495ab467bf92d096fc07ab6", - "width": 640, - "height": 640 - } - ] - }, - "date": { - "year": 2022 - } - } - }, - { - "data": { - "uri": "spotify:album:1TwrnBDlShNlNIn20c5h31", - "name": "Motion God", - "artists": { - "items": [ - { - "uri": "spotify:artist:3tJoFztHeIJkJWMrx0td2f", - "profile": { - "name": "Moneybagg Yo" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e0297ed08ee74da2b210ab08078", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000485197ed08ee74da2b210ab08078", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b27397ed08ee74da2b210ab08078", - "width": 640, - "height": 640 - } - ] - }, - "date": { - "year": 2023 - } - } - }, - { - "data": { - "uri": "spotify:album:5QRGz0LiB8LoO5v5j0NvZ4", - "name": "Money", - "artists": { - "items": [ - { - "uri": "spotify:artist:5iTeuqbNnieioTxkY6aH4F", - "profile": { - "name": "Chris-n-Teeb" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e022b114dd67c9e3704f7aba3de", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d000048512b114dd67c9e3704f7aba3de", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b2732b114dd67c9e3704f7aba3de", - "width": 640, - "height": 640 - } - ] - }, - "date": { - "year": 2019 - } - } - }, - { - "data": { - "uri": "spotify:album:0GJ7jQJRIQNDjz54cPo2XI", - "name": "Money Sucks, Friends Rule", - "artists": { - "items": [ - { - "uri": "spotify:artist:5R3Hr2cnCCjt220Jmt2xLf", - "profile": { - "name": "Dillon Francis" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e02483536d7340f3b68c19b637c", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d00004851483536d7340f3b68c19b637c", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b273483536d7340f3b68c19b637c", - "width": 640, - "height": 640 - } - ] - }, - "date": { - "year": 2014 - } - } - }, - { - "data": { - "uri": "spotify:album:2VXqjyaaqRellg8cw99QVy", - "name": "Money", - "artists": { - "items": [ - { - "uri": "spotify:artist:2v0x2qsSuy06OiFIo8zX6s", - "profile": { - "name": "Money" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e024597c6365dc96a6929ddc963", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d000048514597c6365dc96a6929ddc963", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b2734597c6365dc96a6929ddc963", - "width": 640, - "height": 640 - } - ] - }, - "date": { - "year": 2022 - } - } - }, - { - "data": { - "uri": "spotify:album:6MyJhSzVSOravLjL5hpFMk", - "name": "Money Shot", - "artists": { - "items": [ - { - "uri": "spotify:artist:2pAajGWerK3ghwToNWFENS", - "profile": { - "name": "Puscifer" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e02fb4f3561a4cd7f7aaef9ca7f", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d00004851fb4f3561a4cd7f7aaef9ca7f", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b273fb4f3561a4cd7f7aaef9ca7f", - "width": 640, - "height": 640 - } - ] - }, - "date": { - "year": 2015 - } - } - }, - { - "data": { - "uri": "spotify:album:2iOo4RatJizCchSxzo4GyY", - "name": "Money", - "artists": { - "items": [ - { - "uri": "spotify:artist:4kYSro6naA4h99UJvo89HB", - "profile": { - "name": "Cardi B" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e02db5a5f403e65bba175005c71", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d00004851db5a5f403e65bba175005c71", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b273db5a5f403e65bba175005c71", - "width": 640, - "height": 640 - } - ] - }, - "date": { - "year": 2018 - } - } - }, - { - "data": { - "uri": "spotify:album:3raeLaYMyhfb67HgnnNrsg", - "name": "Epidemic (Deluxe)", - "artists": { - "items": [ - { - "uri": "spotify:artist:3Rx4PJ7SP6unkOk5elPUK7", - "profile": { - "name": "Money Man" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e02d9cbe9b9bec4732330a17c7e", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d00004851d9cbe9b9bec4732330a17c7e", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b273d9cbe9b9bec4732330a17c7e", - "width": 640, - "height": 640 - } - ] - }, - "date": { - "year": 2020 - } - } - } - ], - "pagingInfo": { - "nextOffset": 29, - "limit": 29 - } - } -} \ No newline at end of file diff --git a/public/data/initArtistDetail.json b/public/data/initArtistDetail.json new file mode 100644 index 0000000..d69fc53 --- /dev/null +++ b/public/data/initArtistDetail.json @@ -0,0 +1,3268 @@ +{ + "id": "5dfZ5uSmzR7VQK0udbAVpf", + "uri": "spotify:artist:5dfZ5uSmzR7VQK0udbAVpf", + "following": false, + "sharingInfo": { + "shareUrl": "https://open.spotify.com/artist/5dfZ5uSmzR7VQK0udbAVpf?si=m8wQVv_1RyWDB4NH17TxdA", + "shareId": "m8wQVv_1RyWDB4NH17TxdA" + }, + "profile": { + "name": "Sơn Tùng M-TP", + "verified": true, + "pinnedItem": null, + "biography": { + "text": "Nguyễn Thanh Tùng, born in 1994, known professionally as Sơn Tùng M-TP, is a Vietnamese singer, songwriter, producer, and actor. He is not only known as one of the most successful Vietnamese artists and as the "Prince of V-pop", but also as the Chairman of three self-created companies: M-TP Entertainment, M-TP Talent and M-TP & Friends. He has received many achievements: a MTV Europe Music Award, an Mnet Asian Music Award, appeared on Forbes Vietnam's 2018 30 Under 30 list, and is also the first Vietnamese musician to enter the Billboard Social 50.\nUp until now, he has already released a total of 25 songs, such as "Cơn mưa ngang qua", "Em của ngày hôm qua", " Âm thầm bên em", and many more. His single "Chạy ngay đi" was released with a music video featuring Thai actress Davika Hoorne, and with a collaboration with rapper Snoop Dogg, he went on and created the big hit "Hãy trao cho anh". After releasing "Có chắc yêu là đây" in 2020, the song became the 3rd-most-streamed Youtube premiere at the time with 902,000 live viewers.\nAs we all know, music is, without a doubt, the easiest way to connect people. For Sơn Tùng M-TP, music is everything he ever wanted to offer to the world around him with all his heart and soul." + }, + "externalLinks": { + "items": [ + { + "name": "FACEBOOK", + "url": "https://facebook.com/MTP.Fan" + }, + { + "name": "INSTAGRAM", + "url": "https://instagram.com/sontungmtp" + }, + { + "name": "TWITTER", + "url": "https://twitter.com/sontungmtp777" + }, + { + "name": "WIKIPEDIA", + "url": "https://vi.wikipedia.org/wiki/S%C6%A1n_T%C3%B9ng_M-TP" + } + ] + }, + "playlists": { + "totalCount": 2, + "items": [ + { + "uri": "spotify:playlist:37i9dQZF1DWYPc4oQ0ynkq", + "name": "Mãi Yêu Sơn Tùng M-TP", + "description": "Sự trở lại với MAKING MY WAY", + "owner": { + "name": "Spotify" + }, + "images": { + "items": [ + { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67706f00000002b0cec6a6f725da4223a17e35", + "width": null, + "height": null + } + ] + } + ] + } + }, + { + "uri": "spotify:playlist:37i9dQZF1DZ06evO34291n", + "name": "This Is Sơn Tùng M-TP", + "description": "This is Sơn Tùng M-TP. The essential tracks, all in one playlist.", + "owner": { + "name": "Spotify" + }, + "images": { + "items": [ + { + "sources": [ + { + "url": "https://thisis-images.scdn.co/37i9dQZF1DZ06evO34291n-default.jpg", + "width": null, + "height": null + } + ] + } + ] + } + } + ] + } + }, + "visuals": { + "gallery": { + "items": [ + { + "sources": [ + { + "url": "https://i.scdn.co/image/ab6761670000ecd4a01d3116188d2518612a7bae", + "width": 640, + "height": 640 + } + ] + }, + { + "sources": [ + { + "url": "https://i.scdn.co/image/ab6761670000ecd482cfa8645cfbc0ead46ee755", + "width": 640, + "height": 640 + } + ] + }, + { + "sources": [ + { + "url": "https://i.scdn.co/image/ab6761670000ecd4bc4c69db37cd56de26778517", + "width": 640, + "height": 640 + } + ] + }, + { + "sources": [ + { + "url": "https://i.scdn.co/image/ab6761670000ecd4eee45e0c46fa809495eee416", + "width": 640, + "height": 640 + } + ] + }, + { + "sources": [ + { + "url": "https://i.scdn.co/image/ab6761670000ecd4b7f9c99345de93170d88e2c0", + "width": 640, + "height": 640 + } + ] + }, + { + "sources": [ + { + "url": "https://i.scdn.co/image/ab6761670000ecd4248bc59798828a9d38ebd973", + "width": 640, + "height": 640 + } + ] + }, + { + "sources": [ + { + "url": "https://i.scdn.co/image/ab6761670000ecd4d91f1a5ea299d72e4e100744", + "width": 640, + "height": 640 + } + ] + }, + { + "sources": [ + { + "url": "https://i.scdn.co/image/ab6761670000ecd4797234e6252c6957e5c45d78", + "width": 640, + "height": 640 + } + ] + }, + { + "sources": [ + { + "url": "https://i.scdn.co/image/ab6761670000ecd45a14ba34b68c918ebd646c6c", + "width": 640, + "height": 640 + } + ] + }, + { + "sources": [ + { + "url": "https://i.scdn.co/image/ab6761670000ecd48b6bf0c66e835dff61b5744e", + "width": 640, + "height": 640 + } + ] + } + ] + }, + "avatarImage": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab6761610000e5eb51b32111f5bc456525313d89", + "width": 640, + "height": 640 + }, + { + "url": "https://i.scdn.co/image/ab6761610000f17851b32111f5bc456525313d89", + "width": 160, + "height": 160 + }, + { + "url": "https://i.scdn.co/image/ab6761610000517451b32111f5bc456525313d89", + "width": 320, + "height": 320 + } + ], + "extractedColors": { + "colorRaw": { + "hex": "#182840" + } + } + }, + "headerImage": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab6761860000101638d87ef636e7f7d31a5a2c03", + "width": 2660, + "height": 1140 + } + ], + "extractedColors": { + "colorRaw": { + "hex": "#485078" + } + } + } + }, + "discography": { + "latest": { + "id": "0vIga29jbgY0d1oU51WELA", + "uri": "spotify:album:0vIga29jbgY0d1oU51WELA", + "name": "Chạy Ngay Đi - VuNhann Remix - Beat", + "type": "SINGLE", + "copyright": { + "items": [ + { + "type": "C", + "text": "2023 SOXO VuNhann" + }, + { + "type": "P", + "text": "2023 SOXO VuNhann" + } + ] + }, + "date": { + "year": 2023 + }, + "coverArt": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67616d00001e027fdaa57868c6d319e53340dc", + "width": 300, + "height": 300 + }, + { + "url": "https://i.scdn.co/image/ab67616d000048517fdaa57868c6d319e53340dc", + "width": 64, + "height": 64 + }, + { + "url": "https://i.scdn.co/image/ab67616d0000b2737fdaa57868c6d319e53340dc", + "width": 640, + "height": 640 + } + ] + }, + "tracks": { + "totalCount": 1 + }, + "label": "SOXO VuNhann", + "playability": { + "playable": true, + "reason": "PLAYABLE" + } + }, + "popularReleases": { + "totalCount": 20, + "items": [ + { + "releases": { + "items": [ + { + "id": "5hxm3ulOLVvjFdZNFO3n4M", + "uri": "spotify:album:5hxm3ulOLVvjFdZNFO3n4M", + "name": "m-tp M-TP", + "type": "ALBUM", + "copyright": { + "items": [ + { + "type": "C", + "text": "M-TP Entertainment Ltd" + }, + { + "type": "P", + "text": "M-TP Entertainment Ltd" + } + ] + }, + "date": { + "year": 2017, + "month": 4, + "day": 1, + "precision": "DAY" + }, + "coverArt": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67616d00001e02af31997b23b7e6e65de1816b", + "width": 300, + "height": 300 + }, + { + "url": "https://i.scdn.co/image/ab67616d00004851af31997b23b7e6e65de1816b", + "width": 64, + "height": 64 + }, + { + "url": "https://i.scdn.co/image/ab67616d0000b273af31997b23b7e6e65de1816b", + "width": 640, + "height": 640 + } + ] + }, + "tracks": { + "totalCount": 18 + }, + "label": "M-TP Entertainment Ltd", + "playability": { + "playable": true, + "reason": "PLAYABLE" + }, + "sharingInfo": { + "shareId": "NSepbdsTSkCf9dlqc6gzAg", + "shareUrl": "https://open.spotify.com/album/5hxm3ulOLVvjFdZNFO3n4M?si=NSepbdsTSkCf9dlqc6gzAg" + } + } + ] + } + }, + { + "releases": { + "items": [ + { + "id": "371NWHWKJxyUYwOywWpTal", + "uri": "spotify:album:371NWHWKJxyUYwOywWpTal", + "name": "MAKING MY WAY", + "type": "SINGLE", + "copyright": { + "items": [ + { + "type": "C", + "text": "(C) 2023 M-TP Entertainment Ltd" + }, + { + "type": "P", + "text": "(P) 2023 M-TP Entertainment Ltd" + } + ] + }, + "date": { + "year": 2023, + "month": 5, + "day": 5, + "precision": "DAY" + }, + "coverArt": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67616d00001e020b303433c40b65a63dec0a04", + "width": 300, + "height": 300 + }, + { + "url": "https://i.scdn.co/image/ab67616d000048510b303433c40b65a63dec0a04", + "width": 64, + "height": 64 + }, + { + "url": "https://i.scdn.co/image/ab67616d0000b2730b303433c40b65a63dec0a04", + "width": 640, + "height": 640 + } + ] + }, + "tracks": { + "totalCount": 1 + }, + "label": "M-TP Entertainment Ltd", + "playability": { + "playable": true, + "reason": "PLAYABLE" + }, + "sharingInfo": { + "shareId": "bOJC5HW8RXCQmhAXboeesg", + "shareUrl": "https://open.spotify.com/album/371NWHWKJxyUYwOywWpTal?si=bOJC5HW8RXCQmhAXboeesg" + } + } + ] + } + }, + { + "releases": { + "items": [ + { + "id": "33Iz5SghJnJ9iM0xIWCS3M", + "uri": "spotify:album:33Iz5SghJnJ9iM0xIWCS3M", + "name": "Muộn Rồi Mà Sao Còn", + "type": "SINGLE", + "copyright": { + "items": [ + { + "type": "C", + "text": "2021 M-TP Entertainment Ltd" + }, + { + "type": "P", + "text": "2021 M-TP Entertainment Ltd" + } + ] + }, + "date": { + "year": 2021, + "month": 4, + "day": 29, + "precision": "DAY" + }, + "coverArt": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67616d00001e0229f906fe7a60df7777b02ee1", + "width": 300, + "height": 300 + }, + { + "url": "https://i.scdn.co/image/ab67616d0000485129f906fe7a60df7777b02ee1", + "width": 64, + "height": 64 + }, + { + "url": "https://i.scdn.co/image/ab67616d0000b27329f906fe7a60df7777b02ee1", + "width": 640, + "height": 640 + } + ] + }, + "tracks": { + "totalCount": 1 + }, + "label": "M-TP Entertainment Ltd", + "playability": { + "playable": true, + "reason": "PLAYABLE" + }, + "sharingInfo": { + "shareId": "mGzSR20PTjiqeAtvjrIRKA", + "shareUrl": "https://open.spotify.com/album/33Iz5SghJnJ9iM0xIWCS3M?si=mGzSR20PTjiqeAtvjrIRKA" + } + } + ] + } + }, + { + "releases": { + "items": [ + { + "id": "6oT0WOEPWOxsa2Vmnkxwxa", + "uri": "spotify:album:6oT0WOEPWOxsa2Vmnkxwxa", + "name": "Chúng Ta Của Hiện Tại", + "type": "SINGLE", + "copyright": { + "items": [ + { + "type": "C", + "text": "2020 M-TP Entertainment Ltd" + }, + { + "type": "P", + "text": "2020 M-TP Entertainment Ltd" + } + ] + }, + "date": { + "year": 2020, + "month": 12, + "day": 20, + "precision": "DAY" + }, + "coverArt": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67616d00001e025888c34015bebbf123957f6d", + "width": 300, + "height": 300 + }, + { + "url": "https://i.scdn.co/image/ab67616d000048515888c34015bebbf123957f6d", + "width": 64, + "height": 64 + }, + { + "url": "https://i.scdn.co/image/ab67616d0000b2735888c34015bebbf123957f6d", + "width": 640, + "height": 640 + } + ] + }, + "tracks": { + "totalCount": 1 + }, + "label": "M-TP Entertainment Ltd", + "playability": { + "playable": true, + "reason": "PLAYABLE" + }, + "sharingInfo": { + "shareId": "6SNLIKrVSnGwFrGJa6m-5Q", + "shareUrl": "https://open.spotify.com/album/6oT0WOEPWOxsa2Vmnkxwxa?si=6SNLIKrVSnGwFrGJa6m-5Q" + } + } + ] + } + }, + { + "releases": { + "items": [ + { + "id": "7r2UDe86W9yNHVymWu02xG", + "uri": "spotify:album:7r2UDe86W9yNHVymWu02xG", + "name": "SKY DECADE", + "type": "EP", + "copyright": { + "items": [ + { + "type": "C", + "text": "2022 M-TP Entertainment Ltd" + }, + { + "type": "P", + "text": "2022 M-TP Entertainment Ltd" + } + ] + }, + "date": { + "year": 2022, + "month": 10, + "day": 6, + "precision": "DAY" + }, + "coverArt": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67616d00001e02771323ba8f7fe1d93fe094ed", + "width": 300, + "height": 300 + }, + { + "url": "https://i.scdn.co/image/ab67616d00004851771323ba8f7fe1d93fe094ed", + "width": 64, + "height": 64 + }, + { + "url": "https://i.scdn.co/image/ab67616d0000b273771323ba8f7fe1d93fe094ed", + "width": 640, + "height": 640 + } + ] + }, + "tracks": { + "totalCount": 4 + }, + "label": "M-TP Entertainment Ltd", + "playability": { + "playable": true, + "reason": "PLAYABLE" + }, + "sharingInfo": { + "shareId": "6F1agjNvSD-qmCZJRkVqJg", + "shareUrl": "https://open.spotify.com/album/7r2UDe86W9yNHVymWu02xG?si=6F1agjNvSD-qmCZJRkVqJg" + } + } + ] + } + }, + { + "releases": { + "items": [ + { + "id": "738A5dZVHTynH0sfeL87KV", + "uri": "spotify:album:738A5dZVHTynH0sfeL87KV", + "name": "CÓ CHẮC YÊU LÀ ĐÂY", + "type": "SINGLE", + "copyright": { + "items": [ + { + "type": "C", + "text": "2020 M-TP Entertainment Ltd" + }, + { + "type": "P", + "text": "2020 M-TP Entertainment Ltd" + } + ] + }, + "date": { + "year": 2020, + "month": 7, + "day": 6, + "precision": "DAY" + }, + "coverArt": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67616d00001e02659e798cad5728dbeabf1603", + "width": 300, + "height": 300 + }, + { + "url": "https://i.scdn.co/image/ab67616d00004851659e798cad5728dbeabf1603", + "width": 64, + "height": 64 + }, + { + "url": "https://i.scdn.co/image/ab67616d0000b273659e798cad5728dbeabf1603", + "width": 640, + "height": 640 + } + ] + }, + "tracks": { + "totalCount": 1 + }, + "label": "M-TP Entertainment Ltd", + "playability": { + "playable": true, + "reason": "PLAYABLE" + }, + "sharingInfo": { + "shareId": "hdROFUSuRIq-4hOnAC57YA", + "shareUrl": "https://open.spotify.com/album/738A5dZVHTynH0sfeL87KV?si=hdROFUSuRIq-4hOnAC57YA" + } + } + ] + } + }, + { + "releases": { + "items": [ + { + "id": "7aqlLOsEHnLv8XPBs05iOJ", + "uri": "spotify:album:7aqlLOsEHnLv8XPBs05iOJ", + "name": "CHẠY NGAY ĐI (Onionn Remix)", + "type": "SINGLE", + "copyright": { + "items": [ + { + "type": "C", + "text": "M-TP Entertainment Ltd" + }, + { + "type": "P", + "text": "M-TP Entertainment Ltd" + } + ] + }, + "date": { + "year": 2018, + "month": 7, + "day": 5, + "precision": "DAY" + }, + "coverArt": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67616d00001e02754d0b74f5f7eb1f109114f3", + "width": 300, + "height": 300 + }, + { + "url": "https://i.scdn.co/image/ab67616d00004851754d0b74f5f7eb1f109114f3", + "width": 64, + "height": 64 + }, + { + "url": "https://i.scdn.co/image/ab67616d0000b273754d0b74f5f7eb1f109114f3", + "width": 640, + "height": 640 + } + ] + }, + "tracks": { + "totalCount": 1 + }, + "label": "M-TP Entertainment Ltd", + "playability": { + "playable": true, + "reason": "PLAYABLE" + }, + "sharingInfo": { + "shareId": "qDfXHgX6QTqEXQhbzkM-wg", + "shareUrl": "https://open.spotify.com/album/7aqlLOsEHnLv8XPBs05iOJ?si=qDfXHgX6QTqEXQhbzkM-wg" + } + } + ] + } + }, + { + "releases": { + "items": [ + { + "id": "2bPHnJXjR8q8eC84jCmNt7", + "uri": "spotify:album:2bPHnJXjR8q8eC84jCmNt7", + "name": "Hãy Trao Cho Anh", + "type": "SINGLE", + "copyright": { + "items": [ + { + "type": "C", + "text": "2019 Son Tung M-TP" + }, + { + "type": "P", + "text": "2019 M-TP Entertainment Ltd" + } + ] + }, + "date": { + "year": 2019, + "month": 7, + "day": 2, + "precision": "DAY" + }, + "coverArt": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67616d00001e020ac09baba508700ed0b5d4e3", + "width": 300, + "height": 300 + }, + { + "url": "https://i.scdn.co/image/ab67616d000048510ac09baba508700ed0b5d4e3", + "width": 64, + "height": 64 + }, + { + "url": "https://i.scdn.co/image/ab67616d0000b2730ac09baba508700ed0b5d4e3", + "width": 640, + "height": 640 + } + ] + }, + "tracks": { + "totalCount": 1 + }, + "label": "M-TP Entertainment Ltd", + "playability": { + "playable": true, + "reason": "PLAYABLE" + }, + "sharingInfo": { + "shareId": "ZXXWECIGSrma2jMJElGsaQ", + "shareUrl": "https://open.spotify.com/album/2bPHnJXjR8q8eC84jCmNt7?si=ZXXWECIGSrma2jMJElGsaQ" + } + } + ] + } + }, + { + "releases": { + "items": [ + { + "id": "1ZutY9YHq5MEPDTT0wy06u", + "uri": "spotify:album:1ZutY9YHq5MEPDTT0wy06u", + "name": "THERE'S NO ONE AT ALL", + "type": "SINGLE", + "copyright": { + "items": [ + { + "type": "C", + "text": "(C) 2022 M-TP Entertainment Ltd" + }, + { + "type": "P", + "text": "(P) 2022 M-TP Entertainment" + } + ] + }, + "date": { + "year": 2022, + "month": 4, + "day": 28, + "precision": "DAY" + }, + "coverArt": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67616d00001e0248e90a4c48b31c66e8b0d24f", + "width": 300, + "height": 300 + }, + { + "url": "https://i.scdn.co/image/ab67616d0000485148e90a4c48b31c66e8b0d24f", + "width": 64, + "height": 64 + }, + { + "url": "https://i.scdn.co/image/ab67616d0000b27348e90a4c48b31c66e8b0d24f", + "width": 640, + "height": 640 + } + ] + }, + "tracks": { + "totalCount": 1 + }, + "label": "M-TP Entertainment Ltd", + "playability": { + "playable": true, + "reason": "PLAYABLE" + }, + "sharingInfo": { + "shareId": "t2YjvU84RfuE9XIjcSsCzw", + "shareUrl": "https://open.spotify.com/album/1ZutY9YHq5MEPDTT0wy06u?si=t2YjvU84RfuE9XIjcSsCzw" + } + } + ] + } + }, + { + "releases": { + "items": [ + { + "id": "635YOdtbHIX1TlTn2oFHGh", + "uri": "spotify:album:635YOdtbHIX1TlTn2oFHGh", + "name": "CHẠY NGAY ĐI", + "type": "SINGLE", + "copyright": { + "items": [ + { + "type": "C", + "text": "2018 M-TP Entertainment Ltd" + }, + { + "type": "P", + "text": "2018 M-TP Entertainment Ltd" + } + ] + }, + "date": { + "year": 2018, + "month": 5, + "day": 11, + "precision": "DAY" + }, + "coverArt": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67616d00001e02eda65b93d53c2f982c5d57d8", + "width": 300, + "height": 300 + }, + { + "url": "https://i.scdn.co/image/ab67616d00004851eda65b93d53c2f982c5d57d8", + "width": 64, + "height": 64 + }, + { + "url": "https://i.scdn.co/image/ab67616d0000b273eda65b93d53c2f982c5d57d8", + "width": 640, + "height": 640 + } + ] + }, + "tracks": { + "totalCount": 1 + }, + "label": "M-TP Entertainment", + "playability": { + "playable": true, + "reason": "PLAYABLE" + }, + "sharingInfo": { + "shareId": "6MCQDQT_SlyzXdGcwhZB5w", + "shareUrl": "https://open.spotify.com/album/635YOdtbHIX1TlTn2oFHGh?si=6MCQDQT_SlyzXdGcwhZB5w" + } + } + ] + } + } + ] + }, + "singles": { + "totalCount": 32, + "items": [ + { + "releases": { + "items": [ + { + "id": "0vIga29jbgY0d1oU51WELA", + "uri": "spotify:album:0vIga29jbgY0d1oU51WELA", + "name": "Chạy Ngay Đi - VuNhann Remix - Beat", + "type": "SINGLE", + "copyright": { + "items": [ + { + "type": "C", + "text": "2023 SOXO VuNhann" + }, + { + "type": "P", + "text": "2023 SOXO VuNhann" + } + ] + }, + "date": { + "year": 2023, + "month": 7, + "day": 3, + "precision": "DAY" + }, + "coverArt": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67616d00001e027fdaa57868c6d319e53340dc", + "width": 300, + "height": 300 + }, + { + "url": "https://i.scdn.co/image/ab67616d000048517fdaa57868c6d319e53340dc", + "width": 64, + "height": 64 + }, + { + "url": "https://i.scdn.co/image/ab67616d0000b2737fdaa57868c6d319e53340dc", + "width": 640, + "height": 640 + } + ] + }, + "tracks": { + "totalCount": 1 + }, + "label": "SOXO VuNhann", + "playability": { + "playable": true, + "reason": "PLAYABLE" + }, + "sharingInfo": { + "shareId": "eI9tisp8TrmcrD_wJb4spQ", + "shareUrl": "https://open.spotify.com/album/0vIga29jbgY0d1oU51WELA?si=eI9tisp8TrmcrD_wJb4spQ" + } + } + ] + } + }, + { + "releases": { + "items": [ + { + "id": "371NWHWKJxyUYwOywWpTal", + "uri": "spotify:album:371NWHWKJxyUYwOywWpTal", + "name": "MAKING MY WAY", + "type": "SINGLE", + "copyright": { + "items": [ + { + "type": "C", + "text": "(C) 2023 M-TP Entertainment Ltd" + }, + { + "type": "P", + "text": "(P) 2023 M-TP Entertainment Ltd" + } + ] + }, + "date": { + "year": 2023, + "month": 5, + "day": 5, + "precision": "DAY" + }, + "coverArt": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67616d00001e020b303433c40b65a63dec0a04", + "width": 300, + "height": 300 + }, + { + "url": "https://i.scdn.co/image/ab67616d000048510b303433c40b65a63dec0a04", + "width": 64, + "height": 64 + }, + { + "url": "https://i.scdn.co/image/ab67616d0000b2730b303433c40b65a63dec0a04", + "width": 640, + "height": 640 + } + ] + }, + "tracks": { + "totalCount": 1 + }, + "label": "M-TP Entertainment Ltd", + "playability": { + "playable": true, + "reason": "PLAYABLE" + }, + "sharingInfo": { + "shareId": "bOJC5HW8RXCQmhAXboeesg", + "shareUrl": "https://open.spotify.com/album/371NWHWKJxyUYwOywWpTal?si=bOJC5HW8RXCQmhAXboeesg" + } + } + ] + } + }, + { + "releases": { + "items": [ + { + "id": "7r2UDe86W9yNHVymWu02xG", + "uri": "spotify:album:7r2UDe86W9yNHVymWu02xG", + "name": "SKY DECADE", + "type": "EP", + "copyright": { + "items": [ + { + "type": "C", + "text": "2022 M-TP Entertainment Ltd" + }, + { + "type": "P", + "text": "2022 M-TP Entertainment Ltd" + } + ] + }, + "date": { + "year": 2022, + "month": 10, + "day": 6, + "precision": "DAY" + }, + "coverArt": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67616d00001e02771323ba8f7fe1d93fe094ed", + "width": 300, + "height": 300 + }, + { + "url": "https://i.scdn.co/image/ab67616d00004851771323ba8f7fe1d93fe094ed", + "width": 64, + "height": 64 + }, + { + "url": "https://i.scdn.co/image/ab67616d0000b273771323ba8f7fe1d93fe094ed", + "width": 640, + "height": 640 + } + ] + }, + "tracks": { + "totalCount": 4 + }, + "label": "M-TP Entertainment Ltd", + "playability": { + "playable": true, + "reason": "PLAYABLE" + }, + "sharingInfo": { + "shareId": "6F1agjNvSD-qmCZJRkVqJg", + "shareUrl": "https://open.spotify.com/album/7r2UDe86W9yNHVymWu02xG?si=6F1agjNvSD-qmCZJRkVqJg" + } + } + ] + } + }, + { + "releases": { + "items": [ + { + "id": "0d0Blbqh2qSxiej0aoJJvw", + "uri": "spotify:album:0d0Blbqh2qSxiej0aoJJvw", + "name": "There's No One At All (Another Version)", + "type": "SINGLE", + "copyright": { + "items": [ + { + "type": "C", + "text": "(C) 2022 M-TP Entertainment Ltd" + }, + { + "type": "P", + "text": "(P) 2022 M-TP Entertainment" + } + ] + }, + "date": { + "year": 2022, + "month": 7, + "day": 5, + "precision": "DAY" + }, + "coverArt": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67616d00001e028df0d48c84650c99b01a3fd3", + "width": 300, + "height": 300 + }, + { + "url": "https://i.scdn.co/image/ab67616d000048518df0d48c84650c99b01a3fd3", + "width": 64, + "height": 64 + }, + { + "url": "https://i.scdn.co/image/ab67616d0000b2738df0d48c84650c99b01a3fd3", + "width": 640, + "height": 640 + } + ] + }, + "tracks": { + "totalCount": 1 + }, + "label": "M-TP Entertainment Ltd", + "playability": { + "playable": true, + "reason": "PLAYABLE" + }, + "sharingInfo": { + "shareId": "pYF5xjydQZCelFNQvA4WWg", + "shareUrl": "https://open.spotify.com/album/0d0Blbqh2qSxiej0aoJJvw?si=pYF5xjydQZCelFNQvA4WWg" + } + } + ] + } + }, + { + "releases": { + "items": [ + { + "id": "4OZGRo7rvIxPHeioQcKhH7", + "uri": "spotify:album:4OZGRo7rvIxPHeioQcKhH7", + "name": "CƠN MƯA NGANG QUA (REMIX 2022)", + "type": "SINGLE", + "copyright": { + "items": [ + { + "type": "C", + "text": "2022 M-TP Entertainment Ltd" + }, + { + "type": "P", + "text": "2022 M-TP Entertainment Ltd" + } + ] + }, + "date": { + "year": 2022, + "month": 6, + "day": 7, + "precision": "DAY" + }, + "coverArt": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67616d00001e025a49b51d7300294409a25589", + "width": 300, + "height": 300 + }, + { + "url": "https://i.scdn.co/image/ab67616d000048515a49b51d7300294409a25589", + "width": 64, + "height": 64 + }, + { + "url": "https://i.scdn.co/image/ab67616d0000b2735a49b51d7300294409a25589", + "width": 640, + "height": 640 + } + ] + }, + "tracks": { + "totalCount": 1 + }, + "label": "M-TP Entertainment Ltd", + "playability": { + "playable": true, + "reason": "PLAYABLE" + }, + "sharingInfo": { + "shareId": "GbIzDttDRNml8QMmEqRjDQ", + "shareUrl": "https://open.spotify.com/album/4OZGRo7rvIxPHeioQcKhH7?si=GbIzDttDRNml8QMmEqRjDQ" + } + } + ] + } + }, + { + "releases": { + "items": [ + { + "id": "1ZutY9YHq5MEPDTT0wy06u", + "uri": "spotify:album:1ZutY9YHq5MEPDTT0wy06u", + "name": "THERE'S NO ONE AT ALL", + "type": "SINGLE", + "copyright": { + "items": [ + { + "type": "C", + "text": "(C) 2022 M-TP Entertainment Ltd" + }, + { + "type": "P", + "text": "(P) 2022 M-TP Entertainment" + } + ] + }, + "date": { + "year": 2022, + "month": 4, + "day": 28, + "precision": "DAY" + }, + "coverArt": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67616d00001e0248e90a4c48b31c66e8b0d24f", + "width": 300, + "height": 300 + }, + { + "url": "https://i.scdn.co/image/ab67616d0000485148e90a4c48b31c66e8b0d24f", + "width": 64, + "height": 64 + }, + { + "url": "https://i.scdn.co/image/ab67616d0000b27348e90a4c48b31c66e8b0d24f", + "width": 640, + "height": 640 + } + ] + }, + "tracks": { + "totalCount": 1 + }, + "label": "M-TP Entertainment Ltd", + "playability": { + "playable": true, + "reason": "PLAYABLE" + }, + "sharingInfo": { + "shareId": "t2YjvU84RfuE9XIjcSsCzw", + "shareUrl": "https://open.spotify.com/album/1ZutY9YHq5MEPDTT0wy06u?si=t2YjvU84RfuE9XIjcSsCzw" + } + } + ] + } + }, + { + "releases": { + "items": [ + { + "id": "33Iz5SghJnJ9iM0xIWCS3M", + "uri": "spotify:album:33Iz5SghJnJ9iM0xIWCS3M", + "name": "Muộn Rồi Mà Sao Còn", + "type": "SINGLE", + "copyright": { + "items": [ + { + "type": "C", + "text": "2021 M-TP Entertainment Ltd" + }, + { + "type": "P", + "text": "2021 M-TP Entertainment Ltd" + } + ] + }, + "date": { + "year": 2021, + "month": 4, + "day": 29, + "precision": "DAY" + }, + "coverArt": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67616d00001e0229f906fe7a60df7777b02ee1", + "width": 300, + "height": 300 + }, + { + "url": "https://i.scdn.co/image/ab67616d0000485129f906fe7a60df7777b02ee1", + "width": 64, + "height": 64 + }, + { + "url": "https://i.scdn.co/image/ab67616d0000b27329f906fe7a60df7777b02ee1", + "width": 640, + "height": 640 + } + ] + }, + "tracks": { + "totalCount": 1 + }, + "label": "M-TP Entertainment Ltd", + "playability": { + "playable": true, + "reason": "PLAYABLE" + }, + "sharingInfo": { + "shareId": "mGzSR20PTjiqeAtvjrIRKA", + "shareUrl": "https://open.spotify.com/album/33Iz5SghJnJ9iM0xIWCS3M?si=mGzSR20PTjiqeAtvjrIRKA" + } + } + ] + } + }, + { + "releases": { + "items": [ + { + "id": "2AI7zFKgSv94TG8qbvLkcL", + "uri": "spotify:album:2AI7zFKgSv94TG8qbvLkcL", + "name": "Remember Me (Onionn Remix Countdown 2021)", + "type": "SINGLE", + "copyright": { + "items": [ + { + "type": "C", + "text": "2021 M-TP Entertainment Ltd" + }, + { + "type": "P", + "text": "2021 M-TP Entertainment Ltd" + } + ] + }, + "date": { + "year": 2021, + "month": 2, + "day": 8, + "precision": "DAY" + }, + "coverArt": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67616d00001e0292e8a2d6fb0fe8ff6c696b3a", + "width": 300, + "height": 300 + }, + { + "url": "https://i.scdn.co/image/ab67616d0000485192e8a2d6fb0fe8ff6c696b3a", + "width": 64, + "height": 64 + }, + { + "url": "https://i.scdn.co/image/ab67616d0000b27392e8a2d6fb0fe8ff6c696b3a", + "width": 640, + "height": 640 + } + ] + }, + "tracks": { + "totalCount": 1 + }, + "label": "M-TP Entertainment Ltd", + "playability": { + "playable": true, + "reason": "PLAYABLE" + }, + "sharingInfo": { + "shareId": "VDH1sR1vR6CgOLSiS5u4GQ", + "shareUrl": "https://open.spotify.com/album/2AI7zFKgSv94TG8qbvLkcL?si=VDH1sR1vR6CgOLSiS5u4GQ" + } + } + ] + } + }, + { + "releases": { + "items": [ + { + "id": "5tDA8zpYtcU3RCMWP2rSei", + "uri": "spotify:album:5tDA8zpYtcU3RCMWP2rSei", + "name": "Có Chắc Yêu Là Đây (Onionn Remix countdown 2021)", + "type": "SINGLE", + "copyright": { + "items": [ + { + "type": "C", + "text": "2021 M-TP Entertainment Ltd" + }, + { + "type": "P", + "text": "2021 M-TP Entertainment Ltd" + } + ] + }, + "date": { + "year": 2021, + "month": 2, + "day": 8, + "precision": "DAY" + }, + "coverArt": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67616d00001e0262dee5c4741a0a9287c690ca", + "width": 300, + "height": 300 + }, + { + "url": "https://i.scdn.co/image/ab67616d0000485162dee5c4741a0a9287c690ca", + "width": 64, + "height": 64 + }, + { + "url": "https://i.scdn.co/image/ab67616d0000b27362dee5c4741a0a9287c690ca", + "width": 640, + "height": 640 + } + ] + }, + "tracks": { + "totalCount": 1 + }, + "label": "M-TP Entertainment Ltd", + "playability": { + "playable": true, + "reason": "PLAYABLE" + }, + "sharingInfo": { + "shareId": "0_ZauxO-TnWbtLlSsHRwpg", + "shareUrl": "https://open.spotify.com/album/5tDA8zpYtcU3RCMWP2rSei?si=0_ZauxO-TnWbtLlSsHRwpg" + } + } + ] + } + }, + { + "releases": { + "items": [ + { + "id": "582PJYHsMKTgBtPlFvyHvu", + "uri": "spotify:album:582PJYHsMKTgBtPlFvyHvu", + "name": "Skyler", + "type": "SINGLE", + "copyright": { + "items": [ + { + "type": "C", + "text": "2021 MTP Entertainment Ltd" + }, + { + "type": "P", + "text": "2021 MTP Entertainment Ltd" + } + ] + }, + "date": { + "year": 2021, + "month": 1, + "day": 28, + "precision": "DAY" + }, + "coverArt": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67616d00001e0287bfec023ebe8c31c6eb348b", + "width": 300, + "height": 300 + }, + { + "url": "https://i.scdn.co/image/ab67616d0000485187bfec023ebe8c31c6eb348b", + "width": 64, + "height": 64 + }, + { + "url": "https://i.scdn.co/image/ab67616d0000b27387bfec023ebe8c31c6eb348b", + "width": 640, + "height": 640 + } + ] + }, + "tracks": { + "totalCount": 1 + }, + "label": "M-TP Entertainment Ltd", + "playability": { + "playable": true, + "reason": "PLAYABLE" + }, + "sharingInfo": { + "shareId": "TQzybqGMRiq8BuwMVhk53A", + "shareUrl": "https://open.spotify.com/album/582PJYHsMKTgBtPlFvyHvu?si=TQzybqGMRiq8BuwMVhk53A" + } + } + ] + } + } + ] + }, + "albums": { + "totalCount": 2, + "items": [ + { + "releases": { + "items": [ + { + "id": "6vuMClyEPUQFkIy5Udu1hG", + "uri": "spotify:album:6vuMClyEPUQFkIy5Udu1hG", + "name": "Sky Tour (Original Motion Picture Soundtrack)", + "type": "ALBUM", + "copyright": { + "items": [ + { + "type": "C", + "text": "2019 M-TP Entertainment Ltd" + }, + { + "type": "P", + "text": "2019 M-TP Entertainment Ltd" + } + ] + }, + "date": { + "year": 2020, + "month": 6, + "day": 12, + "precision": "DAY" + }, + "coverArt": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67616d00001e027663e8afc902209090664782", + "width": 300, + "height": 300 + }, + { + "url": "https://i.scdn.co/image/ab67616d000048517663e8afc902209090664782", + "width": 64, + "height": 64 + }, + { + "url": "https://i.scdn.co/image/ab67616d0000b2737663e8afc902209090664782", + "width": 640, + "height": 640 + } + ] + }, + "tracks": { + "totalCount": 8 + }, + "label": "M-TP Entertainment Ltd", + "playability": { + "playable": true, + "reason": "PLAYABLE" + }, + "sharingInfo": { + "shareId": "oVP1YvZFRqSYE8Vovth6uA", + "shareUrl": "https://open.spotify.com/album/6vuMClyEPUQFkIy5Udu1hG?si=oVP1YvZFRqSYE8Vovth6uA" + } + } + ] + } + }, + { + "releases": { + "items": [ + { + "id": "5hxm3ulOLVvjFdZNFO3n4M", + "uri": "spotify:album:5hxm3ulOLVvjFdZNFO3n4M", + "name": "m-tp M-TP", + "type": "ALBUM", + "copyright": { + "items": [ + { + "type": "C", + "text": "M-TP Entertainment Ltd" + }, + { + "type": "P", + "text": "M-TP Entertainment Ltd" + } + ] + }, + "date": { + "year": 2017, + "month": 4, + "day": 1, + "precision": "DAY" + }, + "coverArt": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67616d00001e02af31997b23b7e6e65de1816b", + "width": 300, + "height": 300 + }, + { + "url": "https://i.scdn.co/image/ab67616d00004851af31997b23b7e6e65de1816b", + "width": 64, + "height": 64 + }, + { + "url": "https://i.scdn.co/image/ab67616d0000b273af31997b23b7e6e65de1816b", + "width": 640, + "height": 640 + } + ] + }, + "tracks": { + "totalCount": 18 + }, + "label": "M-TP Entertainment Ltd", + "playability": { + "playable": true, + "reason": "PLAYABLE" + }, + "sharingInfo": { + "shareId": "NSepbdsTSkCf9dlqc6gzAg", + "shareUrl": "https://open.spotify.com/album/5hxm3ulOLVvjFdZNFO3n4M?si=NSepbdsTSkCf9dlqc6gzAg" + } + } + ] + } + } + ] + }, + "compilations": { + "totalCount": 0, + "items": [] + }, + "topTracks": { + "items": [ + { + "uid": "51457a09623f7cd61bca", + "track": { + "id": "6HGOxrNik4iPurqStawTFQ", + "uri": "spotify:track:6HGOxrNik4iPurqStawTFQ", + "name": "MAKING MY WAY", + "playcount": "7575384", + "discNumber": 1, + "duration": { + "totalMilliseconds": 258006 + }, + "playability": { + "playable": true, + "reason": "PLAYABLE" + }, + "contentRating": { + "label": "NONE" + }, + "artists": { + "items": [ + { + "uri": "spotify:artist:5dfZ5uSmzR7VQK0udbAVpf", + "profile": { + "name": "Sơn Tùng M-TP" + } + } + ] + }, + "album": { + "uri": "spotify:album:371NWHWKJxyUYwOywWpTal", + "coverArt": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67616d00001e020b303433c40b65a63dec0a04" + }, + { + "url": "https://i.scdn.co/image/ab67616d000048510b303433c40b65a63dec0a04" + }, + { + "url": "https://i.scdn.co/image/ab67616d0000b2730b303433c40b65a63dec0a04" + } + ] + } + } + } + }, + { + "uid": "8338c5cf307402dec94e", + "track": { + "id": "5fFLotKS1286huYIMQHqz7", + "uri": "spotify:track:5fFLotKS1286huYIMQHqz7", + "name": "Muộn Rồi Mà Sao Còn", + "playcount": "28329063", + "discNumber": 1, + "duration": { + "totalMilliseconds": 275905 + }, + "playability": { + "playable": true, + "reason": "PLAYABLE" + }, + "contentRating": { + "label": "NONE" + }, + "artists": { + "items": [ + { + "uri": "spotify:artist:5dfZ5uSmzR7VQK0udbAVpf", + "profile": { + "name": "Sơn Tùng M-TP" + } + } + ] + }, + "album": { + "uri": "spotify:album:33Iz5SghJnJ9iM0xIWCS3M", + "coverArt": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67616d00001e0229f906fe7a60df7777b02ee1" + }, + { + "url": "https://i.scdn.co/image/ab67616d0000485129f906fe7a60df7777b02ee1" + }, + { + "url": "https://i.scdn.co/image/ab67616d0000b27329f906fe7a60df7777b02ee1" + } + ] + } + } + } + }, + { + "uid": "36fc28060d71af2b1ac4", + "track": { + "id": "17iGUekw5nFt5mIRJcUm3R", + "uri": "spotify:track:17iGUekw5nFt5mIRJcUm3R", + "name": "Chúng Ta Của Hiện Tại", + "playcount": "34007077", + "discNumber": 1, + "duration": { + "totalMilliseconds": 301538 + }, + "playability": { + "playable": true, + "reason": "PLAYABLE" + }, + "contentRating": { + "label": "NONE" + }, + "artists": { + "items": [ + { + "uri": "spotify:artist:5dfZ5uSmzR7VQK0udbAVpf", + "profile": { + "name": "Sơn Tùng M-TP" + } + } + ] + }, + "album": { + "uri": "spotify:album:6oT0WOEPWOxsa2Vmnkxwxa", + "coverArt": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67616d00001e025888c34015bebbf123957f6d" + }, + { + "url": "https://i.scdn.co/image/ab67616d000048515888c34015bebbf123957f6d" + }, + { + "url": "https://i.scdn.co/image/ab67616d0000b2735888c34015bebbf123957f6d" + } + ] + } + } + } + }, + { + "uid": "5824426a95f2c294bb91", + "track": { + "id": "1Huy9G87D6pbIveFulsH0P", + "uri": "spotify:track:1Huy9G87D6pbIveFulsH0P", + "name": "Âm Thầm Bên Em", + "playcount": "13160940", + "discNumber": 1, + "duration": { + "totalMilliseconds": 293112 + }, + "playability": { + "playable": true, + "reason": "PLAYABLE" + }, + "contentRating": { + "label": "NONE" + }, + "artists": { + "items": [ + { + "uri": "spotify:artist:5dfZ5uSmzR7VQK0udbAVpf", + "profile": { + "name": "Sơn Tùng M-TP" + } + } + ] + }, + "album": { + "uri": "spotify:album:5hxm3ulOLVvjFdZNFO3n4M", + "coverArt": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67616d00001e02af31997b23b7e6e65de1816b" + }, + { + "url": "https://i.scdn.co/image/ab67616d00004851af31997b23b7e6e65de1816b" + }, + { + "url": "https://i.scdn.co/image/ab67616d0000b273af31997b23b7e6e65de1816b" + } + ] + } + } + } + }, + { + "uid": "fc9b4691410a717d2511", + "track": { + "id": "2z9iLlNBt1aLZUCFgXby97", + "uri": "spotify:track:2z9iLlNBt1aLZUCFgXby97", + "name": "CÓ CHẮC YÊU LÀ ĐÂY", + "playcount": "19719794", + "discNumber": 1, + "duration": { + "totalMilliseconds": 202105 + }, + "playability": { + "playable": true, + "reason": "PLAYABLE" + }, + "contentRating": { + "label": "NONE" + }, + "artists": { + "items": [ + { + "uri": "spotify:artist:5dfZ5uSmzR7VQK0udbAVpf", + "profile": { + "name": "Sơn Tùng M-TP" + } + } + ] + }, + "album": { + "uri": "spotify:album:738A5dZVHTynH0sfeL87KV", + "coverArt": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67616d00001e02659e798cad5728dbeabf1603" + }, + { + "url": "https://i.scdn.co/image/ab67616d00004851659e798cad5728dbeabf1603" + }, + { + "url": "https://i.scdn.co/image/ab67616d0000b273659e798cad5728dbeabf1603" + } + ] + } + } + } + }, + { + "uid": "ddcd715a65a8a7992b3d", + "track": { + "id": "5HbLlcJogki9rRq2KfkGQP", + "uri": "spotify:track:5HbLlcJogki9rRq2KfkGQP", + "name": "Nơi Này Có Anh", + "playcount": "15319173", + "discNumber": 1, + "duration": { + "totalMilliseconds": 260117 + }, + "playability": { + "playable": true, + "reason": "PLAYABLE" + }, + "contentRating": { + "label": "NONE" + }, + "artists": { + "items": [ + { + "uri": "spotify:artist:5dfZ5uSmzR7VQK0udbAVpf", + "profile": { + "name": "Sơn Tùng M-TP" + } + } + ] + }, + "album": { + "uri": "spotify:album:5hxm3ulOLVvjFdZNFO3n4M", + "coverArt": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67616d00001e02af31997b23b7e6e65de1816b" + }, + { + "url": "https://i.scdn.co/image/ab67616d00004851af31997b23b7e6e65de1816b" + }, + { + "url": "https://i.scdn.co/image/ab67616d0000b273af31997b23b7e6e65de1816b" + } + ] + } + } + } + }, + { + "uid": "c42b843400f3644fca4d", + "track": { + "id": "3ZYrI2prWaAm1RbpCqZzlO", + "uri": "spotify:track:3ZYrI2prWaAm1RbpCqZzlO", + "name": "CHẠY NGAY ĐI - Onionn Remix", + "playcount": "14597928", + "discNumber": 1, + "duration": { + "totalMilliseconds": 230400 + }, + "playability": { + "playable": true, + "reason": "PLAYABLE" + }, + "contentRating": { + "label": "NONE" + }, + "artists": { + "items": [ + { + "uri": "spotify:artist:5dfZ5uSmzR7VQK0udbAVpf", + "profile": { + "name": "Sơn Tùng M-TP" + } + }, + { + "uri": "spotify:artist:25M5YMbLCbYDSFPhQXYE8c", + "profile": { + "name": "Onionn." + } + } + ] + }, + "album": { + "uri": "spotify:album:7aqlLOsEHnLv8XPBs05iOJ", + "coverArt": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67616d00001e02754d0b74f5f7eb1f109114f3" + }, + { + "url": "https://i.scdn.co/image/ab67616d00004851754d0b74f5f7eb1f109114f3" + }, + { + "url": "https://i.scdn.co/image/ab67616d0000b273754d0b74f5f7eb1f109114f3" + } + ] + } + } + } + }, + { + "uid": "49bd2460b8d19c1cb3af", + "track": { + "id": "0YRtuiIMa3FM3LywGlJIii", + "uri": "spotify:track:0YRtuiIMa3FM3LywGlJIii", + "name": "Buông Đôi Tay Nhau Ra", + "playcount": "7952280", + "discNumber": 1, + "duration": { + "totalMilliseconds": 227492 + }, + "playability": { + "playable": true, + "reason": "PLAYABLE" + }, + "contentRating": { + "label": "NONE" + }, + "artists": { + "items": [ + { + "uri": "spotify:artist:5dfZ5uSmzR7VQK0udbAVpf", + "profile": { + "name": "Sơn Tùng M-TP" + } + } + ] + }, + "album": { + "uri": "spotify:album:5hxm3ulOLVvjFdZNFO3n4M", + "coverArt": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67616d00001e02af31997b23b7e6e65de1816b" + }, + { + "url": "https://i.scdn.co/image/ab67616d00004851af31997b23b7e6e65de1816b" + }, + { + "url": "https://i.scdn.co/image/ab67616d0000b273af31997b23b7e6e65de1816b" + } + ] + } + } + } + }, + { + "uid": "64909bc0c63b7df93c06", + "track": { + "id": "0f5yQttJS5nNxRAleF4kZO", + "uri": "spotify:track:0f5yQttJS5nNxRAleF4kZO", + "name": "Hãy Trao Cho Anh", + "playcount": "22058542", + "discNumber": 1, + "duration": { + "totalMilliseconds": 245658 + }, + "playability": { + "playable": true, + "reason": "PLAYABLE" + }, + "contentRating": { + "label": "NONE" + }, + "artists": { + "items": [ + { + "uri": "spotify:artist:5dfZ5uSmzR7VQK0udbAVpf", + "profile": { + "name": "Sơn Tùng M-TP" + } + }, + { + "uri": "spotify:artist:7hJcb9fa4alzcOq3EaNPoG", + "profile": { + "name": "Snoop Dogg" + } + } + ] + }, + "album": { + "uri": "spotify:album:2bPHnJXjR8q8eC84jCmNt7", + "coverArt": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67616d00001e020ac09baba508700ed0b5d4e3" + }, + { + "url": "https://i.scdn.co/image/ab67616d000048510ac09baba508700ed0b5d4e3" + }, + { + "url": "https://i.scdn.co/image/ab67616d0000b2730ac09baba508700ed0b5d4e3" + } + ] + } + } + } + }, + { + "uid": "4c7ef07194d1750e122c", + "track": { + "id": "6UdpjBhLNMFl3dH46iXlGi", + "uri": "spotify:track:6UdpjBhLNMFl3dH46iXlGi", + "name": "Nắng Ấm Ngang Qua", + "playcount": "3271642", + "discNumber": 1, + "duration": { + "totalMilliseconds": 195697 + }, + "playability": { + "playable": true, + "reason": "PLAYABLE" + }, + "contentRating": { + "label": "NONE" + }, + "artists": { + "items": [ + { + "uri": "spotify:artist:5dfZ5uSmzR7VQK0udbAVpf", + "profile": { + "name": "Sơn Tùng M-TP" + } + } + ] + }, + "album": { + "uri": "spotify:album:7r2UDe86W9yNHVymWu02xG", + "coverArt": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67616d00001e02771323ba8f7fe1d93fe094ed" + }, + { + "url": "https://i.scdn.co/image/ab67616d00004851771323ba8f7fe1d93fe094ed" + }, + { + "url": "https://i.scdn.co/image/ab67616d0000b273771323ba8f7fe1d93fe094ed" + } + ] + } + } + } + } + ] + } + }, + "stats": { + "followers": 4561958, + "monthlyListeners": 1362651, + "worldRank": 0, + "topCities": { + "items": [ + { + "numberOfListeners": 426223, + "city": "Ho Chi Minh City", + "country": "VN", + "region": "SG" + }, + { + "numberOfListeners": 372711, + "city": "Hanoi", + "country": "VN", + "region": "HN" + }, + { + "numberOfListeners": 30685, + "city": "Da Nang", + "country": "VN", + "region": "DN" + }, + { + "numberOfListeners": 19883, + "city": "Bien Hoa", + "country": "VN", + "region": "39" + }, + { + "numberOfListeners": 16942, + "city": "Can Tho", + "country": "VN", + "region": "CT" + } + ] + } + }, + "relatedContent": { + "appearsOn": { + "totalCount": 0, + "items": [] + }, + "featuring": { + "totalCount": 2, + "items": [ + { + "uri": "spotify:playlist:37i9dQZF1DWYPc4oQ0ynkq", + "id": "37i9dQZF1DWYPc4oQ0ynkq", + "owner": { + "name": "Spotify" + }, + "name": "Mãi Yêu Sơn Tùng M-TP", + "description": "Sự trở lại với MAKING MY WAY", + "images": { + "totalCount": 1, + "items": [ + { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67706f00000002b0cec6a6f725da4223a17e35", + "width": null, + "height": null + } + ] + } + ] + } + }, + { + "uri": "spotify:playlist:37i9dQZF1E4s2rxfOKtG1a", + "id": "37i9dQZF1E4s2rxfOKtG1a", + "owner": { + "name": "Spotify" + }, + "name": "Sơn Tùng M-TP Radio", + "description": "", + "images": { + "totalCount": 1, + "items": [ + { + "sources": [ + { + "url": "https://seeded-session-images.scdn.co/v1/img/artist/5dfZ5uSmzR7VQK0udbAVpf/en", + "width": null, + "height": null + } + ] + } + ] + } + } + ] + }, + "discoveredOn": { + "totalCount": 91, + "items": [ + { + "uri": "spotify:playlist:37i9dQZF1DX0F4i7Q9pshJ", + "id": "37i9dQZF1DX0F4i7Q9pshJ", + "owner": { + "name": "Spotify" + }, + "name": "Hot Hits Vietnam", + "description": "Đông tới Tây, đây là những ca khúc thịnh hành nhất ở Việt Nam. Ảnh bìa: Andree Right Hand", + "images": { + "totalCount": 1, + "items": [ + { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67706f00000002fde9215bb90eb42a940b4a07", + "width": null, + "height": null + } + ] + } + ] + } + }, + { + "uri": "spotify:playlist:37i9dQZF1DWVOaOWiVD1Lf", + "id": "37i9dQZF1DWVOaOWiVD1Lf", + "owner": { + "name": "Spotify" + }, + "name": "Thiên Hạ Nghe Gì", + "description": "\u001dNhững gì mà người bên cạnh bạn đang nghe. Ảnh bìa: Taylor Swift", + "images": { + "totalCount": 1, + "items": [ + { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67706f0000000222ff2d684770f5a1cee563f5", + "width": null, + "height": null + } + ] + } + ] + } + }, + { + "uri": "spotify:playlist:37i9dQZF1DX4g8Gs5nUhpp", + "id": "37i9dQZF1DX4g8Gs5nUhpp", + "owner": { + "name": "Spotify" + }, + "name": "V-Pop Không Thể Thiếu", + "description": "V-Pop nở hoa trên những ca khúc này. Ảnh bìa: GREY D", + "images": { + "totalCount": 1, + "items": [ + { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67706f000000020c49671f948cc64e836b05f6", + "width": null, + "height": null + } + ] + } + ] + } + }, + { + "uri": "spotify:playlist:37i9dQZF1DWYPc4oQ0ynkq", + "id": "37i9dQZF1DWYPc4oQ0ynkq", + "owner": { + "name": "Spotify" + }, + "name": "Mãi Yêu Sơn Tùng M-TP", + "description": "Sự trở lại với MAKING MY WAY", + "images": { + "totalCount": 1, + "items": [ + { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67706f00000002b0cec6a6f725da4223a17e35", + "width": null, + "height": null + } + ] + } + ] + } + }, + { + "uri": "spotify:playlist:37i9dQZF1DX1e2VSJFudND", + "id": "37i9dQZF1DX1e2VSJFudND", + "owner": { + "name": "Spotify" + }, + "name": "Cà Phê Quán Quen", + "description": "Quán quen, nhạc cũ, cảm giác lạ. ", + "images": { + "totalCount": 1, + "items": [ + { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67706f00000002bb725c5d5937b5ad9424a920", + "width": null, + "height": null + } + ] + } + ] + } + }, + { + "uri": "spotify:playlist:37i9dQZEVXbLdGSmz6xilI", + "id": "37i9dQZEVXbLdGSmz6xilI", + "owner": { + "name": "Spotify" + }, + "name": "Top 50 - Vietnam", + "description": "Your daily update of the most played tracks right now - Vietnam.", + "images": { + "totalCount": 1, + "items": [ + { + "sources": [ + { + "url": "https://charts-images.scdn.co/assets/locale_en/regional/daily/region_vn_default.jpg", + "width": null, + "height": null + } + ] + } + ] + } + }, + { + "uri": "spotify:playlist:37i9dQZF1DX3e9b2XMiQ6I", + "id": "37i9dQZF1DX3e9b2XMiQ6I", + "owner": { + "name": "Spotify" + }, + "name": "Anh Hào Nhạc Việt", + "description": "Những nam thần của làng nhạc Việt. Ảnh bìa: Kay Trần, Machiot, WOKEUP", + "images": { + "totalCount": 1, + "items": [ + { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67706f00000002f0450d50735b86d574bc0ef4", + "width": null, + "height": null + } + ] + } + ] + } + }, + { + "uri": "spotify:playlist:37i9dQZF1DZ06evO4jkBCE", + "id": "37i9dQZF1DZ06evO4jkBCE", + "owner": { + "name": "Spotify" + }, + "name": "This Is Snoop Dogg", + "description": "This is Snoop Dogg. The essential tracks, all in one playlist.", + "images": { + "totalCount": 1, + "items": [ + { + "sources": [ + { + "url": "https://thisis-images.scdn.co/37i9dQZF1DZ06evO4jkBCE-default.jpg", + "width": null, + "height": null + } + ] + } + ] + } + }, + { + "uri": "spotify:playlist:37i9dQZF1DWVbRrSFENdgA", + "id": "37i9dQZF1DWVbRrSFENdgA", + "owner": { + "name": "Spotify" + }, + "name": "Tiếng Hát Át Tiếng Ka", + "description": "Hãy để tiếng hát của bạn át tiếng karaoke của hàng xóm. Ảnh bìa: JustaTee", + "images": { + "totalCount": 1, + "items": [ + { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67706f0000000240db976dff3d8df28cf81656", + "width": null, + "height": null + } + ] + } + ] + } + }, + { + "uri": "spotify:playlist:37i9dQZEVXbKZyn1mKjmIl", + "id": "37i9dQZEVXbKZyn1mKjmIl", + "owner": { + "name": "Spotify" + }, + "name": "Top Songs - Vietnam", + "description": "Your weekly update of the most played tracks right now - Vietnam.", + "images": { + "totalCount": 1, + "items": [ + { + "sources": [ + { + "url": "https://charts-images.scdn.co/assets/locale_en/regional/weekly/region_vn_default.jpg", + "width": null, + "height": null + } + ] + } + ] + } + }, + { + "uri": "spotify:playlist:37i9dQZF1DWTGJQIUtvLRw", + "id": "37i9dQZF1DWTGJQIUtvLRw", + "owner": { + "name": "Spotify" + }, + "name": "Workspace", + "description": "I'm tired.", + "images": { + "totalCount": 1, + "items": [ + { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67706f000000022973d60df0c69b14865f35d2", + "width": null, + "height": null + } + ] + } + ] + } + }, + { + "uri": "spotify:playlist:3X73jt9lV5Nhe4CoUKky10", + "id": "3X73jt9lV5Nhe4CoUKky10", + "owner": { + "name": "Tamaboco Gonbachigo" + }, + "name": "Nhạc lofi chill dễ ngủ:)", + "description": "", + "images": { + "totalCount": 1, + "items": [ + { + "sources": [ + { + "url": "https://mosaic.scdn.co/640/ab67616d00001e025888c34015bebbf123957f6dab67616d00001e028a17a3048580c0416bcd3c79ab67616d00001e02ad8815780d5fcaa5f1a77ef5ab67616d00001e02c403fda2e26a621d7b1c9145", + "width": 640, + "height": 640 + }, + { + "url": "https://mosaic.scdn.co/300/ab67616d00001e025888c34015bebbf123957f6dab67616d00001e028a17a3048580c0416bcd3c79ab67616d00001e02ad8815780d5fcaa5f1a77ef5ab67616d00001e02c403fda2e26a621d7b1c9145", + "width": 300, + "height": 300 + }, + { + "url": "https://mosaic.scdn.co/60/ab67616d00001e025888c34015bebbf123957f6dab67616d00001e028a17a3048580c0416bcd3c79ab67616d00001e02ad8815780d5fcaa5f1a77ef5ab67616d00001e02c403fda2e26a621d7b1c9145", + "width": 60, + "height": 60 + } + ] + } + ] + } + }, + { + "uri": "spotify:playlist:4pkof2WT0Spca1pX3j2dh4", + "id": "4pkof2WT0Spca1pX3j2dh4", + "owner": { + "name": "Phanzy's Cafe" + }, + "name": "Vietnamese (V-Pop) 2023", + "description": "Cover: Jack - J97 || Only the best V-Pop 2023", + "images": { + "totalCount": 1, + "items": [ + { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67706c0000da8492a082743cbe3d74ce25e133", + "width": null, + "height": null + } + ] + } + ] + } + }, + { + "uri": "spotify:playlist:4yjgdCG36M4nuIhDhFLvOQ", + "id": "4yjgdCG36M4nuIhDhFLvOQ", + "owner": { + "name": "Filtr Indonesia" + }, + "name": "Trending Banget Loh ", + "description": "TBL TBL TBL deretan hits viral yang lagi trending dengerin semua lagunya disini. Cover : Aruma & Raim Laode", + "images": { + "totalCount": 1, + "items": [ + { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67706c0000da8443a3f3fc3232d8767b9ef3b1", + "width": null, + "height": null + } + ] + } + ] + } + }, + { + "uri": "spotify:playlist:37i9dQZF1DXbnGLxyfE2f5", + "id": "37i9dQZF1DXbnGLxyfE2f5", + "owner": { + "name": "Spotify" + }, + "name": "Những Bài Hát Hay Nhất Thập Kỷ Dành Cho Bạn", + "description": "Một số bài hát hay nhất trong 10 năm qua, trong playlist được lựa chọn theo sở thích của bạn.", + "images": { + "totalCount": 1, + "items": [ + { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67706f0000000292e24018908664f6a18e09ce", + "width": null, + "height": null + } + ] + } + ] + } + }, + { + "uri": "spotify:playlist:3wt0UQJqTchp3dG0NirJ6X", + "id": "3wt0UQJqTchp3dG0NirJ6X", + "owner": { + "name": "Star Online" + }, + "name": "NHẠC REMIX CỰC CHÁY", + "description": "Tổng hợp những bản nhạc cháy nhất, hot nhất....0976698728", + "images": { + "totalCount": 1, + "items": [ + { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67706c0000da84955895cf144ad089c360d770", + "width": null, + "height": null + } + ] + } + ] + } + }, + { + "uri": "spotify:playlist:37i9dQZF1DWYshp3qt6eyW", + "id": "37i9dQZF1DWYshp3qt6eyW", + "owner": { + "name": "Spotify" + }, + "name": "Thoải Mái Gác Chân Lên", + "description": "Người lạ ơi, thoải mái gác chân lên nghỉ ngơi...", + "images": { + "totalCount": 1, + "items": [ + { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67706f0000000262bc6f22c2512f7801a734c8", + "width": null, + "height": null + } + ] + } + ] + } + }, + { + "uri": "spotify:playlist:37i9dQZF1DXdnyffTsenNZ", + "id": "37i9dQZF1DXdnyffTsenNZ", + "owner": { + "name": "Spotify" + }, + "name": "Party Life", + "description": "Party it up!", + "images": { + "totalCount": 1, + "items": [ + { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67706f0000000241a35a7bac1c9e49e6cc671c", + "width": null, + "height": null + } + ] + } + ] + } + }, + { + "uri": "spotify:playlist:6LTLxWJHKHhqoird4PdcJ0", + "id": "6LTLxWJHKHhqoird4PdcJ0", + "owner": { + "name": "k.loan21_" + }, + "name": " Lofi Chill Nhạc Việt 2023", + "description": "", + "images": { + "totalCount": 1, + "items": [ + { + "sources": [ + { + "url": "https://mosaic.scdn.co/640/ab67616d00001e024493b8e39ce5d7d633882637ab67616d00001e025de1e9bc4bda094138f3643bab67616d00001e02b9e69cfcff062c7adc732c2aab67616d00001e02f534e2bfbc55369a5f8588de", + "width": 640, + "height": 640 + }, + { + "url": "https://mosaic.scdn.co/300/ab67616d00001e024493b8e39ce5d7d633882637ab67616d00001e025de1e9bc4bda094138f3643bab67616d00001e02b9e69cfcff062c7adc732c2aab67616d00001e02f534e2bfbc55369a5f8588de", + "width": 300, + "height": 300 + }, + { + "url": "https://mosaic.scdn.co/60/ab67616d00001e024493b8e39ce5d7d633882637ab67616d00001e025de1e9bc4bda094138f3643bab67616d00001e02b9e69cfcff062c7adc732c2aab67616d00001e02f534e2bfbc55369a5f8588de", + "width": 60, + "height": 60 + } + ] + } + ] + } + }, + { + "uri": "spotify:playlist:0aiBKNSqiPnhtcw1QlXK5s", + "id": "0aiBKNSqiPnhtcw1QlXK5s", + "owner": { + "name": "LONGK" + }, + "name": "Nhạc Việt Top Hits - VPOP 2023", + "description": "Những bản V-POP, Hip Hop, Rap Việt và Indie Việt hay nhất được tuyển chọn hàng tuần bởi LONGK. Happy listening!", + "images": { + "totalCount": 1, + "items": [ + { + "sources": [ + { + "url": "https://i.scdn.co/image/ab67706c0000da846e299909baab23a0806a3391", + "width": null, + "height": null + } + ] + } + ] + } + } + ] + }, + "relatedArtists": { + "totalCount": 20, + "items": [ + { + "id": "6xRZoWlE9twEkMC5NW4Z9f", + "uri": "spotify:artist:6xRZoWlE9twEkMC5NW4Z9f", + "profile": { + "name": "Hoang Ton" + }, + "visuals": { + "avatarImage": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab6761610000e5ebc42e5249f4dd16bc3da3b63f", + "width": 640, + "height": 640 + }, + { + "url": "https://i.scdn.co/image/ab6761610000f178c42e5249f4dd16bc3da3b63f", + "width": 160, + "height": 160 + }, + { + "url": "https://i.scdn.co/image/ab67616100005174c42e5249f4dd16bc3da3b63f", + "width": 320, + "height": 320 + } + ] + } + } + }, + { + "id": "7yquVKfxBuNFJbG9cy2R8A", + "uri": "spotify:artist:7yquVKfxBuNFJbG9cy2R8A", + "profile": { + "name": "Vu Cat Tuong" + }, + "visuals": { + "avatarImage": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab6761610000e5ebaf03006dd2e13de3921626e9", + "width": 640, + "height": 640 + }, + { + "url": "https://i.scdn.co/image/ab6761610000f178af03006dd2e13de3921626e9", + "width": 160, + "height": 160 + }, + { + "url": "https://i.scdn.co/image/ab67616100005174af03006dd2e13de3921626e9", + "width": 320, + "height": 320 + } + ] + } + } + }, + { + "id": "0IdAjS2LRieBR3gzoazdAw", + "uri": "spotify:artist:0IdAjS2LRieBR3gzoazdAw", + "profile": { + "name": "MIN" + }, + "visuals": { + "avatarImage": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab6761610000e5eb9fbf4d041c3512612974d7e8", + "width": 640, + "height": 640 + }, + { + "url": "https://i.scdn.co/image/ab6761610000f1789fbf4d041c3512612974d7e8", + "width": 160, + "height": 160 + }, + { + "url": "https://i.scdn.co/image/ab676161000051749fbf4d041c3512612974d7e8", + "width": 320, + "height": 320 + } + ] + } + } + }, + { + "id": "5FWPIKz9czXWaiNtw45KQs", + "uri": "spotify:artist:5FWPIKz9czXWaiNtw45KQs", + "profile": { + "name": "Đức Phúc" + }, + "visuals": { + "avatarImage": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab6761610000e5eba7e82b4fbe3605c71aed9fee", + "width": 640, + "height": 640 + }, + { + "url": "https://i.scdn.co/image/ab6761610000f178a7e82b4fbe3605c71aed9fee", + "width": 160, + "height": 160 + }, + { + "url": "https://i.scdn.co/image/ab67616100005174a7e82b4fbe3605c71aed9fee", + "width": 320, + "height": 320 + } + ] + } + } + }, + { + "id": "6sJBvMCAi9NuNCxI9RDYDW", + "uri": "spotify:artist:6sJBvMCAi9NuNCxI9RDYDW", + "profile": { + "name": "Osad" + }, + "visuals": { + "avatarImage": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab6761610000e5eb69be8edba5ca150e913dd938", + "width": 640, + "height": 640 + }, + { + "url": "https://i.scdn.co/image/ab6761610000f17869be8edba5ca150e913dd938", + "width": 160, + "height": 160 + }, + { + "url": "https://i.scdn.co/image/ab6761610000517469be8edba5ca150e913dd938", + "width": 320, + "height": 320 + } + ] + } + } + }, + { + "id": "1dmaHHd1Xbd85cT1egYb4w", + "uri": "spotify:artist:1dmaHHd1Xbd85cT1egYb4w", + "profile": { + "name": "Trúc Nhân" + }, + "visuals": { + "avatarImage": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab6761610000e5eba7f28bd3ad5ef4a868151ee7", + "width": 640, + "height": 640 + }, + { + "url": "https://i.scdn.co/image/ab6761610000f178a7f28bd3ad5ef4a868151ee7", + "width": 160, + "height": 160 + }, + { + "url": "https://i.scdn.co/image/ab67616100005174a7f28bd3ad5ef4a868151ee7", + "width": 320, + "height": 320 + } + ] + } + } + }, + { + "id": "5OvCh1Nin8AGw7OkxYinBe", + "uri": "spotify:artist:5OvCh1Nin8AGw7OkxYinBe", + "profile": { + "name": "Tiên Tiên" + }, + "visuals": { + "avatarImage": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab6761610000e5eb367ac417cc3e77ffb8362e0a", + "width": 640, + "height": 640 + }, + { + "url": "https://i.scdn.co/image/ab6761610000f178367ac417cc3e77ffb8362e0a", + "width": 160, + "height": 160 + }, + { + "url": "https://i.scdn.co/image/ab67616100005174367ac417cc3e77ffb8362e0a", + "width": 320, + "height": 320 + } + ] + } + } + }, + { + "id": "4fCHhderLwLacsIOIKgu3J", + "uri": "spotify:artist:4fCHhderLwLacsIOIKgu3J", + "profile": { + "name": "Bao Anh" + }, + "visuals": { + "avatarImage": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab6761610000e5ebc8a99b7d4971c74cd6dc0eaa", + "width": 640, + "height": 640 + }, + { + "url": "https://i.scdn.co/image/ab6761610000f178c8a99b7d4971c74cd6dc0eaa", + "width": 160, + "height": 160 + }, + { + "url": "https://i.scdn.co/image/ab67616100005174c8a99b7d4971c74cd6dc0eaa", + "width": 320, + "height": 320 + } + ] + } + } + }, + { + "id": "3nGqUwkJHiLPDECMVrX1Sq", + "uri": "spotify:artist:3nGqUwkJHiLPDECMVrX1Sq", + "profile": { + "name": "Masew" + }, + "visuals": { + "avatarImage": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab6761610000e5eb3384ebf481862099a35cecaa", + "width": 640, + "height": 640 + }, + { + "url": "https://i.scdn.co/image/ab6761610000f1783384ebf481862099a35cecaa", + "width": 160, + "height": 160 + }, + { + "url": "https://i.scdn.co/image/ab676161000051743384ebf481862099a35cecaa", + "width": 320, + "height": 320 + } + ] + } + } + }, + { + "id": "5GBXwBVQufRCmwI1bNRIUo", + "uri": "spotify:artist:5GBXwBVQufRCmwI1bNRIUo", + "profile": { + "name": "Only C" + }, + "visuals": { + "avatarImage": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab6761610000e5ebc7c8ae4ffa1d7f3bfd4aadfa", + "width": 640, + "height": 640 + }, + { + "url": "https://i.scdn.co/image/ab6761610000f178c7c8ae4ffa1d7f3bfd4aadfa", + "width": 160, + "height": 160 + }, + { + "url": "https://i.scdn.co/image/ab67616100005174c7c8ae4ffa1d7f3bfd4aadfa", + "width": 320, + "height": 320 + } + ] + } + } + }, + { + "id": "5Cf9nBDNc99UFkq9Yqap7Q", + "uri": "spotify:artist:5Cf9nBDNc99UFkq9Yqap7Q", + "profile": { + "name": "Trung Quân" + }, + "visuals": { + "avatarImage": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab6761610000e5eb99e937ca54656d4d09474420", + "width": 640, + "height": 640 + }, + { + "url": "https://i.scdn.co/image/ab6761610000f17899e937ca54656d4d09474420", + "width": 160, + "height": 160 + }, + { + "url": "https://i.scdn.co/image/ab6761610000517499e937ca54656d4d09474420", + "width": 320, + "height": 320 + } + ] + } + } + }, + { + "id": "0gGd4WhPXBSgDX6fdOHcOw", + "uri": "spotify:artist:0gGd4WhPXBSgDX6fdOHcOw", + "profile": { + "name": "Rhymastic" + }, + "visuals": { + "avatarImage": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab6761610000e5eb0e62e694576ab6f8e56db3d8", + "width": 640, + "height": 640 + }, + { + "url": "https://i.scdn.co/image/ab6761610000f1780e62e694576ab6f8e56db3d8", + "width": 160, + "height": 160 + }, + { + "url": "https://i.scdn.co/image/ab676161000051740e62e694576ab6f8e56db3d8", + "width": 320, + "height": 320 + } + ] + } + } + }, + { + "id": "5Kh0ta0UY4uJ4g2CIdq9V9", + "uri": "spotify:artist:5Kh0ta0UY4uJ4g2CIdq9V9", + "profile": { + "name": "Phuong Ly" + }, + "visuals": { + "avatarImage": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab6761610000e5eb629d16ae1c93b987e30b9744", + "width": 640, + "height": 640 + }, + { + "url": "https://i.scdn.co/image/ab6761610000f178629d16ae1c93b987e30b9744", + "width": 160, + "height": 160 + }, + { + "url": "https://i.scdn.co/image/ab67616100005174629d16ae1c93b987e30b9744", + "width": 320, + "height": 320 + } + ] + } + } + }, + { + "id": "57g2v7gJZepcwsuwssIfZs", + "uri": "spotify:artist:57g2v7gJZepcwsuwssIfZs", + "profile": { + "name": "Vũ." + }, + "visuals": { + "avatarImage": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab6761610000e5ebbc09eff5baa6fe89e87d1d37", + "width": 640, + "height": 640 + }, + { + "url": "https://i.scdn.co/image/ab6761610000f178bc09eff5baa6fe89e87d1d37", + "width": 160, + "height": 160 + }, + { + "url": "https://i.scdn.co/image/ab67616100005174bc09eff5baa6fe89e87d1d37", + "width": 320, + "height": 320 + } + ] + } + } + }, + { + "id": "3rjcQ5VIWCN4q7UFetzdeO", + "uri": "spotify:artist:3rjcQ5VIWCN4q7UFetzdeO", + "profile": { + "name": "JustaTee" + }, + "visuals": { + "avatarImage": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab6761610000e5ebde3d3210433dd11c07678420", + "width": 640, + "height": 640 + }, + { + "url": "https://i.scdn.co/image/ab6761610000f178de3d3210433dd11c07678420", + "width": 160, + "height": 160 + }, + { + "url": "https://i.scdn.co/image/ab67616100005174de3d3210433dd11c07678420", + "width": 320, + "height": 320 + } + ] + } + } + }, + { + "id": "75Ki5hBCOpDtKGoFyTvLxP", + "uri": "spotify:artist:75Ki5hBCOpDtKGoFyTvLxP", + "profile": { + "name": "Lou Hoàng" + }, + "visuals": { + "avatarImage": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab6761610000e5eb844ad06e3ff96e7b88b18660", + "width": 640, + "height": 640 + }, + { + "url": "https://i.scdn.co/image/ab6761610000f178844ad06e3ff96e7b88b18660", + "width": 160, + "height": 160 + }, + { + "url": "https://i.scdn.co/image/ab67616100005174844ad06e3ff96e7b88b18660", + "width": 320, + "height": 320 + } + ] + } + } + }, + { + "id": "718QENtLy8bL4xVoZPg5PP", + "uri": "spotify:artist:718QENtLy8bL4xVoZPg5PP", + "profile": { + "name": "YanBi" + }, + "visuals": { + "avatarImage": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab6761610000e5eb0a5e78a281128467b1a42f6e", + "width": 640, + "height": 640 + }, + { + "url": "https://i.scdn.co/image/ab6761610000f1780a5e78a281128467b1a42f6e", + "width": 160, + "height": 160 + }, + { + "url": "https://i.scdn.co/image/ab676161000051740a5e78a281128467b1a42f6e", + "width": 320, + "height": 320 + } + ] + } + } + }, + { + "id": "6yzbDKj9tQCYUyhAvrDNHW", + "uri": "spotify:artist:6yzbDKj9tQCYUyhAvrDNHW", + "profile": { + "name": "JUUN D" + }, + "visuals": { + "avatarImage": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab6761610000e5ebe2f7135e53d9f7d8421e7a45", + "width": 640, + "height": 640 + }, + { + "url": "https://i.scdn.co/image/ab6761610000f178e2f7135e53d9f7d8421e7a45", + "width": 160, + "height": 160 + }, + { + "url": "https://i.scdn.co/image/ab67616100005174e2f7135e53d9f7d8421e7a45", + "width": 320, + "height": 320 + } + ] + } + } + }, + { + "id": "6jRD85dsXJYn5vv73rqSGi", + "uri": "spotify:artist:6jRD85dsXJYn5vv73rqSGi", + "profile": { + "name": "Chi Pu" + }, + "visuals": { + "avatarImage": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab6761610000e5eb7607e55b38244c1038147c95", + "width": 640, + "height": 640 + }, + { + "url": "https://i.scdn.co/image/ab6761610000f1787607e55b38244c1038147c95", + "width": 160, + "height": 160 + }, + { + "url": "https://i.scdn.co/image/ab676161000051747607e55b38244c1038147c95", + "width": 320, + "height": 320 + } + ] + } + } + }, + { + "id": "6jFvKq4gMkQ50joURHPGXO", + "uri": "spotify:artist:6jFvKq4gMkQ50joURHPGXO", + "profile": { + "name": "Charmy pham" + }, + "visuals": { + "avatarImage": { + "sources": [ + { + "url": "https://i.scdn.co/image/ab6761610000e5eb0101c2b33025724869bf40d1", + "width": 640, + "height": 640 + }, + { + "url": "https://i.scdn.co/image/ab6761610000f1780101c2b33025724869bf40d1", + "width": 160, + "height": 160 + }, + { + "url": "https://i.scdn.co/image/ab676161000051740101c2b33025724869bf40d1", + "width": 320, + "height": 320 + } + ] + } + } + } + ] + } + }, + "goods": { + "events": { + "userLocation": { + "name": "Ashburn" + }, + "concerts": { + "totalCount": 0, + "items": [], + "pagingInfo": { + "limit": 0 + } + } + }, + "merch": { + "items": [] + } + } +} \ No newline at end of file diff --git a/public/data/initArtists.json b/public/data/initArtists.json deleted file mode 100644 index dc5286d..0000000 --- a/public/data/initArtists.json +++ /dev/null @@ -1,2269 +0,0 @@ -{ - "artists": { - "totalCount": 81, - "items": [ - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:1BaQKcXBkeFVnyo6W2tWY2", - "id": "1BaQKcXBkeFVnyo6W2tWY2", - "name": "DHURATA", - "artists": { - "items": [ - { - "uri": "spotify:artist:6t7U7sYlVCtlMWzbecJcHd", - "profile": { - "name": "Dhurata Dora" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e0265a83e777210f3e44ce5f3e1", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000485165a83e777210f3e44ce5f3e1", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b27365a83e777210f3e44ce5f3e1", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "7SXcz2GCSxqJFM7g_Pet9g", - "shareUrl": "https://open.spotify.com/album/1BaQKcXBkeFVnyo6W2tWY2?si=7SXcz2GCSxqJFM7g_Pet9g" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:2qQf72CQ3j5D9AEwvmGvdX", - "id": "2qQf72CQ3j5D9AEwvmGvdX", - "name": "Sunrise", - "artists": { - "items": [ - { - "uri": "spotify:artist:20gsENnposVs2I4rQ5kvrf", - "profile": { - "name": "Sam Feldt" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e0201288d5dc8b701031d97a0d7", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000485101288d5dc8b701031d97a0d7", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b27301288d5dc8b701031d97a0d7", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "GZ_dmkRtRu-XbNejmcs7bg", - "shareUrl": "https://open.spotify.com/album/2qQf72CQ3j5D9AEwvmGvdX?si=GZ_dmkRtRu-XbNejmcs7bg" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:209j2TtzIAQHRxoBgeoqUM", - "id": "209j2TtzIAQHRxoBgeoqUM", - "name": "Reloaded", - "artists": { - "items": [ - { - "uri": "spotify:artist:14dmbYen0AciYxu5n4Fkpd", - "profile": { - "name": "DJ BoBo" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e025e31e1be55fa05cc9651ce07", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d000048515e31e1be55fa05cc9651ce07", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b2735e31e1be55fa05cc9651ce07", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "-ddZK6_CRdu3IjZJzvTvhA", - "shareUrl": "https://open.spotify.com/album/209j2TtzIAQHRxoBgeoqUM?si=-ddZK6_CRdu3IjZJzvTvhA" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:17nkMuRLEPUTt9xt3gQOgy", - "id": "17nkMuRLEPUTt9xt3gQOgy", - "name": "Antiexemplu", - "artists": { - "items": [ - { - "uri": "spotify:artist:1n5LD9Ar3D6RK2X2ewGvXb", - "profile": { - "name": "Carla's Dreams" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e028cb919b4f26d3a0d663fd6a0", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d000048518cb919b4f26d3a0d663fd6a0", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b2738cb919b4f26d3a0d663fd6a0", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "OUS7_ORoTFmumSBuSkYozA", - "shareUrl": "https://open.spotify.com/album/17nkMuRLEPUTt9xt3gQOgy?si=OUS7_ORoTFmumSBuSkYozA" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:2knRps90HKMGWoVRxgpvXJ", - "id": "2knRps90HKMGWoVRxgpvXJ", - "name": "My Gorgeous Drama Queens", - "artists": { - "items": [ - { - "uri": "spotify:artist:05qpk4JDcLSFNJSsPIZ8Ye", - "profile": { - "name": "The Motans" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e028daa55c7c0d8bcd3fc627357", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d000048518daa55c7c0d8bcd3fc627357", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b2738daa55c7c0d8bcd3fc627357", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "Rf0aoDkGTn-8Tq75IQyI3Q", - "shareUrl": "https://open.spotify.com/album/2knRps90HKMGWoVRxgpvXJ?si=Rf0aoDkGTn-8Tq75IQyI3Q" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:4SIpuXhPR2PhE2H1tU75QM", - "id": "4SIpuXhPR2PhE2H1tU75QM", - "name": "Supervara 2009", - "artists": { - "items": [ - { - "uri": "spotify:artist:0LyfQWJT6nXafLPZqxe9Of", - "profile": { - "name": "Various Artists" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e02a395a93d8a438e46e914caeb", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d00004851a395a93d8a438e46e914caeb", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b273a395a93d8a438e46e914caeb", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "3nv_E18bT56YIr1v-sBFmA", - "shareUrl": "https://open.spotify.com/album/4SIpuXhPR2PhE2H1tU75QM?si=3nv_E18bT56YIr1v-sBFmA" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:4QyylR4pPcWRpp3U2gkPcd", - "id": "4QyylR4pPcWRpp3U2gkPcd", - "name": "Sunrise To Sunset", - "artists": { - "items": [ - { - "uri": "spotify:artist:20gsENnposVs2I4rQ5kvrf", - "profile": { - "name": "Sam Feldt" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e0209345bdc4fa847fb5e5898cc", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000485109345bdc4fa847fb5e5898cc", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b27309345bdc4fa847fb5e5898cc", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "Xy036bdEQSidwx352XfOnQ", - "shareUrl": "https://open.spotify.com/album/4QyylR4pPcWRpp3U2gkPcd?si=Xy036bdEQSidwx352XfOnQ" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:3rgrMDKCWu1hLnMVv9BJiE", - "id": "3rgrMDKCWu1hLnMVv9BJiE", - "name": "All The Hits 2017", - "artists": { - "items": [ - { - "uri": "spotify:artist:0LyfQWJT6nXafLPZqxe9Of", - "profile": { - "name": "Various Artists" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e027b4758a52ca5e4c84c01ef56", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d000048517b4758a52ca5e4c84c01ef56", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b2737b4758a52ca5e4c84c01ef56", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "L1dHCTbJQDiFAC21ndFXqw", - "shareUrl": "https://open.spotify.com/album/3rgrMDKCWu1hLnMVv9BJiE?si=L1dHCTbJQDiFAC21ndFXqw" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:66cSCYHzE9eWbgtICJ7ceI", - "id": "66cSCYHzE9eWbgtICJ7ceI", - "name": "Annual 2021", - "artists": { - "items": [ - { - "uri": "spotify:artist:0NGAZxHanS9e0iNHpR8f2W", - "profile": { - "name": "Alok" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e02b495cce6a4628c518b67adc4", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d00004851b495cce6a4628c518b67adc4", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b273b495cce6a4628c518b67adc4", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "eXDHc8DLRTqRL0VKGlwy-g", - "shareUrl": "https://open.spotify.com/album/66cSCYHzE9eWbgtICJ7ceI?si=eXDHc8DLRTqRL0VKGlwy-g" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:3z7A1LFhxzmOGwTZtSWQ1D", - "id": "3z7A1LFhxzmOGwTZtSWQ1D", - "name": "Ngoc", - "artists": { - "items": [ - { - "uri": "spotify:artist:1n5LD9Ar3D6RK2X2ewGvXb", - "profile": { - "name": "Carla's Dreams" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e02213d9424796690df42271d6b", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d00004851213d9424796690df42271d6b", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b273213d9424796690df42271d6b", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "3ldPFfwuSqW5uMx4-bYC5g", - "shareUrl": "https://open.spotify.com/album/3z7A1LFhxzmOGwTZtSWQ1D?si=3ldPFfwuSqW5uMx4-bYC5g" - } - } - ] - } - }, - { - "releases": { - "totalCount": 2, - "items": [ - { - "uri": "spotify:album:17B9ZB9opgRGcvN4Svc2si", - "id": "17B9ZB9opgRGcvN4Svc2si", - "name": "Never Dies", - "artists": { - "items": [ - { - "uri": "spotify:artist:47z7ZrgFoBvVpCnElCE3Zh", - "profile": { - "name": "Yellow Claw" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e022a4f7e877e5755965064961b", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d000048512a4f7e877e5755965064961b", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b2732a4f7e877e5755965064961b", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "av5EUNeVQ6a8B9JB_AI47Q", - "shareUrl": "https://open.spotify.com/album/17B9ZB9opgRGcvN4Svc2si?si=av5EUNeVQ6a8B9JB_AI47Q" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:2utQ29E4RCASpiC8wKAqGK", - "id": "2utQ29E4RCASpiC8wKAqGK", - "name": "Tiny Sparks", - "artists": { - "items": [ - { - "uri": "spotify:artist:2oRTLExi1ct74cVtfAwfhV", - "profile": { - "name": "Gromee" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e022716cec7fb5cbb0d115bef62", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d000048512716cec7fb5cbb0d115bef62", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b2732716cec7fb5cbb0d115bef62", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "bkSGb0rKSkmkIeb96jbT-w", - "shareUrl": "https://open.spotify.com/album/2utQ29E4RCASpiC8wKAqGK?si=bkSGb0rKSkmkIeb96jbT-w" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:2n4R0ceMjfqPBgwhdQ0MYJ", - "id": "2n4R0ceMjfqPBgwhdQ0MYJ", - "name": "Music Non Stop Hits", - "artists": { - "items": [ - { - "uri": "spotify:artist:0LyfQWJT6nXafLPZqxe9Of", - "profile": { - "name": "Various Artists" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e02f0e68990d144c09eeb7b697e", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d00004851f0e68990d144c09eeb7b697e", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b273f0e68990d144c09eeb7b697e", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "IyQ1KkCYRFyV5BnsJM34nw", - "shareUrl": "https://open.spotify.com/album/2n4R0ceMjfqPBgwhdQ0MYJ?si=IyQ1KkCYRFyV5BnsJM34nw" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:6dCJAD121RDSJ4xrTGewlA", - "id": "6dCJAD121RDSJ4xrTGewlA", - "name": "Supervara 2009", - "artists": { - "items": [ - { - "uri": "spotify:artist:0LyfQWJT6nXafLPZqxe9Of", - "profile": { - "name": "Various Artists" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e02c036c933aa73e5aaa7e88272", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d00004851c036c933aa73e5aaa7e88272", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b273c036c933aa73e5aaa7e88272", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "GChj068uQRuJ1BVkeDTvMQ", - "shareUrl": "https://open.spotify.com/album/6dCJAD121RDSJ4xrTGewlA?si=GChj068uQRuJ1BVkeDTvMQ" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:2gVrx1QPgxt4UnV5FErP18", - "id": "2gVrx1QPgxt4UnV5FErP18", - "name": "Romanian Best Hits Vol. 1", - "artists": { - "items": [ - { - "uri": "spotify:artist:0LyfQWJT6nXafLPZqxe9Of", - "profile": { - "name": "Various Artists" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e02360a459802c47bf4f87f63e1", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d00004851360a459802c47bf4f87f63e1", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b273360a459802c47bf4f87f63e1", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "0Ab4YW_BQnq9_iF-I_5B3Q", - "shareUrl": "https://open.spotify.com/album/2gVrx1QPgxt4UnV5FErP18?si=0Ab4YW_BQnq9_iF-I_5B3Q" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:3I6ImWi3vp6t7alQRj4Yji", - "id": "3I6ImWi3vp6t7alQRj4Yji", - "name": "51 самый лучший румынский хит, Ч. 2", - "artists": { - "items": [ - { - "uri": "spotify:artist:0LyfQWJT6nXafLPZqxe9Of", - "profile": { - "name": "Various Artists" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e0251077166056f4481aa948e85", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000485151077166056f4481aa948e85", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b27351077166056f4481aa948e85", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "mIci4ukKRiynVFT2OGRnZQ", - "shareUrl": "https://open.spotify.com/album/3I6ImWi3vp6t7alQRj4Yji?si=mIci4ukKRiynVFT2OGRnZQ" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:3X2yHumpEN6qHCOHgjr6x8", - "id": "3X2yHumpEN6qHCOHgjr6x8", - "name": "Mai stai", - "artists": { - "items": [ - { - "uri": "spotify:artist:0niQ4Q9nI1Qh0BHpT3b4NC", - "profile": { - "name": "3 Sud Est" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e0247f1c72cfe9a3bddfbbc1453", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000485147f1c72cfe9a3bddfbbc1453", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b27347f1c72cfe9a3bddfbbc1453", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "VlKQhKv3RFSGJAGFwp4ogw", - "shareUrl": "https://open.spotify.com/album/3X2yHumpEN6qHCOHgjr6x8?si=VlKQhKv3RFSGJAGFwp4ogw" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:7efYDdAzXSqv1mD8iWDVta", - "id": "7efYDdAzXSqv1mD8iWDVta", - "name": "Ultra Weekend 6", - "artists": { - "items": [ - { - "uri": "spotify:artist:0LyfQWJT6nXafLPZqxe9Of", - "profile": { - "name": "Various Artists" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e0233da01ad94cb041202a936a3", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000485133da01ad94cb041202a936a3", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b27333da01ad94cb041202a936a3", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "NHx3scIQSWGyblUpBWxQ0g", - "shareUrl": "https://open.spotify.com/album/7efYDdAzXSqv1mD8iWDVta?si=NHx3scIQSWGyblUpBWxQ0g" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:3YxMlVTToT0qu0ReWUQKWn", - "id": "3YxMlVTToT0qu0ReWUQKWn", - "name": "Amazing Hits", - "artists": { - "items": [ - { - "uri": "spotify:artist:1omKDrKCcMD79tfK8Vb2Hr", - "profile": { - "name": "Connect-R" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e02a903b1cdab9f00c4c5c26603", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d00004851a903b1cdab9f00c4c5c26603", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b273a903b1cdab9f00c4c5c26603", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "dff66rUbT0e1dxNnXID3Vg", - "shareUrl": "https://open.spotify.com/album/3YxMlVTToT0qu0ReWUQKWn?si=dff66rUbT0e1dxNnXID3Vg" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:3pcIJIuMpyw7L2fxGETbzk", - "id": "3pcIJIuMpyw7L2fxGETbzk", - "name": "Baila Conmigo", - "artists": { - "items": [ - { - "uri": "spotify:artist:47z7ZrgFoBvVpCnElCE3Zh", - "profile": { - "name": "Yellow Claw" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e0224806be3b400cc478731bfbe", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000485124806be3b400cc478731bfbe", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b27324806be3b400cc478731bfbe", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "c5bsTryiQsWw3eIm-8Hh2A", - "shareUrl": "https://open.spotify.com/album/3pcIJIuMpyw7L2fxGETbzk?si=c5bsTryiQsWw3eIm-8Hh2A" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:0XgKWgSVOG0BLFvROk3AVg", - "id": "0XgKWgSVOG0BLFvROk3AVg", - "name": "DJ Central Groove Vol, 3", - "artists": { - "items": [ - { - "uri": "spotify:artist:0LyfQWJT6nXafLPZqxe9Of", - "profile": { - "name": "Various Artists" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e02da120b23e980081c9354e3fb", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d00004851da120b23e980081c9354e3fb", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b273da120b23e980081c9354e3fb", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "YxLCdlFvQ221ld-dvENN1w", - "shareUrl": "https://open.spotify.com/album/0XgKWgSVOG0BLFvROk3AVg?si=YxLCdlFvQ221ld-dvENN1w" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:4KDupOYFdmHY0buIQ3w7o7", - "id": "4KDupOYFdmHY0buIQ3w7o7", - "name": "Home Workout Hits", - "artists": { - "items": [ - { - "uri": "spotify:artist:0LyfQWJT6nXafLPZqxe9Of", - "profile": { - "name": "Various Artists" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e0215b0e3079b43f2aeccd54d2c", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000485115b0e3079b43f2aeccd54d2c", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b27315b0e3079b43f2aeccd54d2c", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "9ZyrdCx9Qq2CuREf3MWhmQ", - "shareUrl": "https://open.spotify.com/album/4KDupOYFdmHY0buIQ3w7o7?si=9ZyrdCx9Qq2CuREf3MWhmQ" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:6m5P0s0ku0wmYjIouBSl1b", - "id": "6m5P0s0ku0wmYjIouBSl1b", - "name": "Romania Loves the Minimal Beat", - "artists": { - "items": [ - { - "uri": "spotify:artist:0LyfQWJT6nXafLPZqxe9Of", - "profile": { - "name": "Various Artists" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e027035255a16f136cbfbf2ac4f", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d000048517035255a16f136cbfbf2ac4f", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b2737035255a16f136cbfbf2ac4f", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "Jv50mTTCQsCLMbTttzv5qA", - "shareUrl": "https://open.spotify.com/album/6m5P0s0ku0wmYjIouBSl1b?si=Jv50mTTCQsCLMbTttzv5qA" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:5xBI4SxnDOTYFWkL7SRm9d", - "id": "5xBI4SxnDOTYFWkL7SRm9d", - "name": "Romania Loves the Minimal Beat", - "artists": { - "items": [ - { - "uri": "spotify:artist:0LyfQWJT6nXafLPZqxe9Of", - "profile": { - "name": "Various Artists" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e0295101318706970f4fe3e12c9", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000485195101318706970f4fe3e12c9", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b27395101318706970f4fe3e12c9", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "NBaVnZDJToCUzgA8x-N1Sg", - "shareUrl": "https://open.spotify.com/album/5xBI4SxnDOTYFWkL7SRm9d?si=NBaVnZDJToCUzgA8x-N1Sg" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:0mieUHsgXataLzOx3TqbVh", - "id": "0mieUHsgXataLzOx3TqbVh", - "name": "Just Dance 3", - "artists": { - "items": [ - { - "uri": "spotify:artist:0LyfQWJT6nXafLPZqxe9Of", - "profile": { - "name": "Various Artists" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e02f33a43ee55f928012368d66c", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d00004851f33a43ee55f928012368d66c", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b273f33a43ee55f928012368d66c", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "0uI6oQXhS--FpjInEMFjQQ", - "shareUrl": "https://open.spotify.com/album/0mieUHsgXataLzOx3TqbVh?si=0uI6oQXhS--FpjInEMFjQQ" - } - } - ] - } - }, - { - "releases": { - "totalCount": 2, - "items": [ - { - "uri": "spotify:album:2F7tejLHzTqFq2XLol9ZGy", - "id": "2F7tejLHzTqFq2XLol9ZGy", - "name": "Global Warming: Meltdown (Deluxe Version)", - "artists": { - "items": [ - { - "uri": "spotify:artist:0TnOYISbd1XYRBk9myaseg", - "profile": { - "name": "Pitbull" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e02f2486b438645e97b523e4f90", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d00004851f2486b438645e97b523e4f90", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b273f2486b438645e97b523e4f90", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "xSBqvCQrQCuNrUXkSxnbPA", - "shareUrl": "https://open.spotify.com/album/2F7tejLHzTqFq2XLol9ZGy?si=xSBqvCQrQCuNrUXkSxnbPA" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:628ZjvbKY81unpsn9yGoVX", - "id": "628ZjvbKY81unpsn9yGoVX", - "name": "Declaratie De Dragoste Vol. 6 (I Love You)", - "artists": { - "items": [ - { - "uri": "spotify:artist:0LyfQWJT6nXafLPZqxe9Of", - "profile": { - "name": "Various Artists" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e02e3376729d46194218cd81a77", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d00004851e3376729d46194218cd81a77", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b273e3376729d46194218cd81a77", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "h1aOEnOjSYOBoqFEoMDUXg", - "shareUrl": "https://open.spotify.com/album/628ZjvbKY81unpsn9yGoVX?si=h1aOEnOjSYOBoqFEoMDUXg" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:2tbufAIPiFlgg3bKp6zzRw", - "id": "2tbufAIPiFlgg3bKp6zzRw", - "name": "Music Non Stop Hits", - "artists": { - "items": [ - { - "uri": "spotify:artist:0LyfQWJT6nXafLPZqxe9Of", - "profile": { - "name": "Various Artists" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e028717741457cdfca25a136cb4", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d000048518717741457cdfca25a136cb4", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b2738717741457cdfca25a136cb4", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "dbxS8hjITUSZzJcqnbbZTQ", - "shareUrl": "https://open.spotify.com/album/2tbufAIPiFlgg3bKp6zzRw?si=dbxS8hjITUSZzJcqnbbZTQ" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:7sromNz04iHfai9RjccYfp", - "id": "7sromNz04iHfai9RjccYfp", - "name": "51 самый лучший румынский хит, Ч. 3", - "artists": { - "items": [ - { - "uri": "spotify:artist:0LyfQWJT6nXafLPZqxe9Of", - "profile": { - "name": "Various Artists" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e020c6563ca48e0bdbf959ceaff", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d000048510c6563ca48e0bdbf959ceaff", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b2730c6563ca48e0bdbf959ceaff", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "Mey8BlLJRs2nL64hyNLTXQ", - "shareUrl": "https://open.spotify.com/album/7sromNz04iHfai9RjccYfp?si=Mey8BlLJRs2nL64hyNLTXQ" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:5ZQ8lelTkJfwcubKRZrNhX", - "id": "5ZQ8lelTkJfwcubKRZrNhX", - "name": "Never Dies (The Remixes)", - "artists": { - "items": [ - { - "uri": "spotify:artist:47z7ZrgFoBvVpCnElCE3Zh", - "profile": { - "name": "Yellow Claw" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e02330218e7107742b2072d00ff", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d00004851330218e7107742b2072d00ff", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b273330218e7107742b2072d00ff", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "5jFrnMtqTtCJ92FdDSes-A", - "shareUrl": "https://open.spotify.com/album/5ZQ8lelTkJfwcubKRZrNhX?si=5jFrnMtqTtCJ92FdDSes-A" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:4pFSLuMPTMIG08VcDyVYLW", - "id": "4pFSLuMPTMIG08VcDyVYLW", - "name": "Amazing Hits", - "artists": { - "items": [ - { - "uri": "spotify:artist:0LyfQWJT6nXafLPZqxe9Of", - "profile": { - "name": "Various Artists" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e02d041b39ca21c1ef3b0a815af", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d00004851d041b39ca21c1ef3b0a815af", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b273d041b39ca21c1ef3b0a815af", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "yXXznyhiSE-HcywWkGRpLQ", - "shareUrl": "https://open.spotify.com/album/4pFSLuMPTMIG08VcDyVYLW?si=yXXznyhiSE-HcywWkGRpLQ" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:6chaCSLxQffdYqkqX2xjUc", - "id": "6chaCSLxQffdYqkqX2xjUc", - "name": "Ultra 2012", - "artists": { - "items": [ - { - "uri": "spotify:artist:0LyfQWJT6nXafLPZqxe9Of", - "profile": { - "name": "Various Artists" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e02b77ceec0ad96f7249ef5ef4c", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d00004851b77ceec0ad96f7249ef5ef4c", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b273b77ceec0ad96f7249ef5ef4c", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "A9Q5pmQzQT6_WxmLXyBBew", - "shareUrl": "https://open.spotify.com/album/6chaCSLxQffdYqkqX2xjUc?si=A9Q5pmQzQT6_WxmLXyBBew" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:6jKRCPb9ID6eehPu06Y900", - "id": "6jKRCPb9ID6eehPu06Y900", - "name": "Daydream Festival México", - "artists": { - "items": [ - { - "uri": "spotify:artist:0LyfQWJT6nXafLPZqxe9Of", - "profile": { - "name": "Various Artists" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e02b978b731ae7ae39f1c7c56da", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d00004851b978b731ae7ae39f1c7c56da", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b273b978b731ae7ae39f1c7c56da", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "6XjPe1K9Rbqn0sTW162JlA", - "shareUrl": "https://open.spotify.com/album/6jKRCPb9ID6eehPu06Y900?si=6XjPe1K9Rbqn0sTW162JlA" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:6JQZ6mBMYRGR9RQVCRTWNS", - "id": "6JQZ6mBMYRGR9RQVCRTWNS", - "name": "Declaratie De Dragoste Vol. 6 (I Love You)", - "artists": { - "items": [ - { - "uri": "spotify:artist:0LyfQWJT6nXafLPZqxe9Of", - "profile": { - "name": "Various Artists" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e02c9a0689fa468e49cb3e02bbe", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d00004851c9a0689fa468e49cb3e02bbe", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b273c9a0689fa468e49cb3e02bbe", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "zxXJNEabT527yjDu-E5T6A", - "shareUrl": "https://open.spotify.com/album/6JQZ6mBMYRGR9RQVCRTWNS?si=zxXJNEabT527yjDu-E5T6A" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:79Vd5JQ98vP3gPKw6vpLoW", - "id": "79Vd5JQ98vP3gPKw6vpLoW", - "name": "Papa (Vadim Adamov & Hardphol Remix)", - "artists": { - "items": [ - { - "uri": "spotify:artist:0LyfQWJT6nXafLPZqxe9Of", - "profile": { - "name": "Various Artists" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e02b3d2dcba4da2c27fcb4e14db", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d00004851b3d2dcba4da2c27fcb4e14db", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b273b3d2dcba4da2c27fcb4e14db", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "VV2AR-UjSzSu8_2M_Tw-yQ", - "shareUrl": "https://open.spotify.com/album/79Vd5JQ98vP3gPKw6vpLoW?si=VV2AR-UjSzSu8_2M_Tw-yQ" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:1Hl89drDt3XdEpKHUDgCfe", - "id": "1Hl89drDt3XdEpKHUDgCfe", - "name": "Alesta", - "artists": { - "items": [ - { - "uri": "spotify:artist:0BmLNz4nSLfoWYW1cYsElL", - "profile": { - "name": "Alexandra Stan" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e02ccbd6aa942121a5e79dbd071", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d00004851ccbd6aa942121a5e79dbd071", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b273ccbd6aa942121a5e79dbd071", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "BEiDL5JZT0mAv2JGomD4LQ", - "shareUrl": "https://open.spotify.com/album/1Hl89drDt3XdEpKHUDgCfe?si=BEiDL5JZT0mAv2JGomD4LQ" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:1Fzq2n9s3YHDajNdQOCOQS", - "id": "1Fzq2n9s3YHDajNdQOCOQS", - "name": "Can't Get You Out Of My Head Vol. 001", - "artists": { - "items": [ - { - "uri": "spotify:artist:0NGAZxHanS9e0iNHpR8f2W", - "profile": { - "name": "Alok" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e02b0600d2d2af8b00605e022cb", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d00004851b0600d2d2af8b00605e022cb", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b273b0600d2d2af8b00605e022cb", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "iG3Z5pQaQxK04gsJNP2noA", - "shareUrl": "https://open.spotify.com/album/1Fzq2n9s3YHDajNdQOCOQS?si=iG3Z5pQaQxK04gsJNP2noA" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:5lhpCkp46sHTWx7FN3zkwz", - "id": "5lhpCkp46sHTWx7FN3zkwz", - "name": "Pretty Thoughts (Jean Juan Remix)", - "artists": { - "items": [ - { - "uri": "spotify:artist:0LyfQWJT6nXafLPZqxe9Of", - "profile": { - "name": "Various Artists" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e02a93255b12dfa8ada534a1d28", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d00004851a93255b12dfa8ada534a1d28", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b273a93255b12dfa8ada534a1d28", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "kUdXNUQiSaWLipKaSeFBwA", - "shareUrl": "https://open.spotify.com/album/5lhpCkp46sHTWx7FN3zkwz?si=kUdXNUQiSaWLipKaSeFBwA" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:6wNTvvIU7hL2Dxoi7KPHVK", - "id": "6wNTvvIU7hL2Dxoi7KPHVK", - "name": "Nota De Plata (Pascal Junior Remix)", - "artists": { - "items": [ - { - "uri": "spotify:artist:05qpk4JDcLSFNJSsPIZ8Ye", - "profile": { - "name": "The Motans" - } - }, - { - "uri": "spotify:artist:4T8dF8zYAxgtlPPICuFQ5w", - "profile": { - "name": "Pascal Junior" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e022a0dec8a658cfbaab475d755", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d000048512a0dec8a658cfbaab475d755", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b2732a0dec8a658cfbaab475d755", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "bozXJmQBSFiiUt_ZuGycIQ", - "shareUrl": "https://open.spotify.com/album/6wNTvvIU7hL2Dxoi7KPHVK?si=bozXJmQBSFiiUt_ZuGycIQ" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:4vgADw1TGcTMiavCACcyXQ", - "id": "4vgADw1TGcTMiavCACcyXQ", - "name": "Papa (Adrian Funk x OLiX Remix)", - "artists": { - "items": [ - { - "uri": "spotify:artist:0LyfQWJT6nXafLPZqxe9Of", - "profile": { - "name": "Various Artists" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e028e55fa62150af9cb3c502859", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d000048518e55fa62150af9cb3c502859", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b2738e55fa62150af9cb3c502859", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "lZiZDaixRJ-iA04PKD9IBA", - "shareUrl": "https://open.spotify.com/album/4vgADw1TGcTMiavCACcyXQ?si=lZiZDaixRJ-iA04PKD9IBA" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:2fKUuHJGZ2MpdNXGKAGs3p", - "id": "2fKUuHJGZ2MpdNXGKAGs3p", - "name": "Музыка для тренировок и фитнеса", - "artists": { - "items": [ - { - "uri": "spotify:artist:0LyfQWJT6nXafLPZqxe9Of", - "profile": { - "name": "Various Artists" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e028138ea28e4bcd40a90ea9958", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d000048518138ea28e4bcd40a90ea9958", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b2738138ea28e4bcd40a90ea9958", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "A0yS8vg-Qrae1T9YlYDqLg", - "shareUrl": "https://open.spotify.com/album/2fKUuHJGZ2MpdNXGKAGs3p?si=A0yS8vg-Qrae1T9YlYDqLg" - } - } - ] - } - }, - { - "releases": { - "totalCount": 2, - "items": [ - { - "uri": "spotify:album:0An79FlONI8O44UNmEMoo9", - "id": "0An79FlONI8O44UNmEMoo9", - "name": "Show me the way (Radio Edit)", - "artists": { - "items": [ - { - "uri": "spotify:artist:32Nz3bGbVrLkL7Fo8WTyQ0", - "profile": { - "name": "Marco & Seba" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e02cfdb977a1f6f033ef8e09a3a", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d00004851cfdb977a1f6f033ef8e09a3a", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b273cfdb977a1f6f033ef8e09a3a", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "yRplvftnQCGPqzPPgNBj0w", - "shareUrl": "https://open.spotify.com/album/0An79FlONI8O44UNmEMoo9?si=yRplvftnQCGPqzPPgNBj0w" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:0URMeyN2XosmGKgsibzLuj", - "id": "0URMeyN2XosmGKgsibzLuj", - "name": "Party Anthems", - "artists": { - "items": [ - { - "uri": "spotify:artist:0LyfQWJT6nXafLPZqxe9Of", - "profile": { - "name": "Various Artists" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e02463de6a4786993f106f42a55", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d00004851463de6a4786993f106f42a55", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b273463de6a4786993f106f42a55", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "bqV5uRliQyi4pmsogYi6WA", - "shareUrl": "https://open.spotify.com/album/0URMeyN2XosmGKgsibzLuj?si=bqV5uRliQyi4pmsogYi6WA" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:3CAkYqQ6t34USbOfao1t73", - "id": "3CAkYqQ6t34USbOfao1t73", - "name": "Nota De Plata", - "artists": { - "items": [ - { - "uri": "spotify:artist:05qpk4JDcLSFNJSsPIZ8Ye", - "profile": { - "name": "The Motans" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e024400fc221edf0a319a02a80e", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d000048514400fc221edf0a319a02a80e", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b2734400fc221edf0a319a02a80e", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "Lhz4J9keTwmPR_z3Yj-CJg", - "shareUrl": "https://open.spotify.com/album/3CAkYqQ6t34USbOfao1t73?si=Lhz4J9keTwmPR_z3Yj-CJg" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:5droCbtu6i8RlbSyY2zPij", - "id": "5droCbtu6i8RlbSyY2zPij", - "name": "Fie Ce-o Fi", - "artists": { - "items": [ - { - "uri": "spotify:artist:0LyfQWJT6nXafLPZqxe9Of", - "profile": { - "name": "Various Artists" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e020a63c6055ed1e4e076797273", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d000048510a63c6055ed1e4e076797273", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b2730a63c6055ed1e4e076797273", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "KVN0Wew5Snatz7_Mtr0mHQ", - "shareUrl": "https://open.spotify.com/album/5droCbtu6i8RlbSyY2zPij?si=KVN0Wew5Snatz7_Mtr0mHQ" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:4VCmuQ3aAPQZhOpwun5edv", - "id": "4VCmuQ3aAPQZhOpwun5edv", - "name": "Buna dimineata la Mos Ajun", - "artists": { - "items": [ - { - "uri": "spotify:artist:0LyfQWJT6nXafLPZqxe9Of", - "profile": { - "name": "Various Artists" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e024be11c88bca55664e5c261af", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d000048514be11c88bca55664e5c261af", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b2734be11c88bca55664e5c261af", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "BXai1s_BSWqO8ux_L9InTQ", - "shareUrl": "https://open.spotify.com/album/4VCmuQ3aAPQZhOpwun5edv?si=BXai1s_BSWqO8ux_L9InTQ" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:69BI1AuHZzfnSK3pyrprc3", - "id": "69BI1AuHZzfnSK3pyrprc3", - "name": "Nota De Plata (Dirty Nano Remix)", - "artists": { - "items": [ - { - "uri": "spotify:artist:05qpk4JDcLSFNJSsPIZ8Ye", - "profile": { - "name": "The Motans" - } - }, - { - "uri": "spotify:artist:0YeBK2Xpnx9UuwvOHpcxoJ", - "profile": { - "name": "Dirty Nano" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e028a10546590485ead73ccf227", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d000048518a10546590485ead73ccf227", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b2738a10546590485ead73ccf227", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "UVd7_SLETGi_hptlPyHc3w", - "shareUrl": "https://open.spotify.com/album/69BI1AuHZzfnSK3pyrprc3?si=UVd7_SLETGi_hptlPyHc3w" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:5i5UFKIFm1DNPRQeGZj43P", - "id": "5i5UFKIFm1DNPRQeGZj43P", - "name": "Ultra Weekend 8", - "artists": { - "items": [ - { - "uri": "spotify:artist:0LyfQWJT6nXafLPZqxe9Of", - "profile": { - "name": "Various Artists" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e02602fcd81d59ff3a2bfcff115", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d00004851602fcd81d59ff3a2bfcff115", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b273602fcd81d59ff3a2bfcff115", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "SQd6LwH2Rj2WOa1voRhnuA", - "shareUrl": "https://open.spotify.com/album/5i5UFKIFm1DNPRQeGZj43P?si=SQd6LwH2Rj2WOa1voRhnuA" - } - } - ] - } - }, - { - "releases": { - "totalCount": 1, - "items": [ - { - "uri": "spotify:album:4ZzOy4MGRkIYACL9RKNv9o", - "id": "4ZzOy4MGRkIYACL9RKNv9o", - "name": "Non Stop Hits", - "artists": { - "items": [ - { - "uri": "spotify:artist:0LyfQWJT6nXafLPZqxe9Of", - "profile": { - "name": "Various Artists" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e0233a71b0538aee9c92dddfceb", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000485133a71b0538aee9c92dddfceb", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b27333a71b0538aee9c92dddfceb", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "nL1aLxsRSZu05-GD-4HIRw", - "shareUrl": "https://open.spotify.com/album/4ZzOy4MGRkIYACL9RKNv9o?si=nL1aLxsRSZu05-GD-4HIRw" - } - } - ] - } - }, - { - "releases": { - "totalCount": 2, - "items": [ - { - "uri": "spotify:album:1BLdgA7RV3psnshSAwlpax", - "id": "1BLdgA7RV3psnshSAwlpax", - "name": "Tu Si Eu", - "artists": { - "items": [ - { - "uri": "spotify:artist:1n5LD9Ar3D6RK2X2ewGvXb", - "profile": { - "name": "Carla's Dreams" - } - } - ] - }, - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e02f20518349ca2aeb77cac9901", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d00004851f20518349ca2aeb77cac9901", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b273f20518349ca2aeb77cac9901", - "width": 640, - "height": 640 - } - ] - }, - "sharingInfo": { - "shareId": "2g_uZ_I1QYmdknLXi6igjw", - "shareUrl": "https://open.spotify.com/album/1BLdgA7RV3psnshSAwlpax?si=2g_uZ_I1QYmdknLXi6igjw" - } - } - ] - } - } - ] - } -} \ No newline at end of file diff --git a/public/data/initPlaylists.json b/public/data/initPlaylists.json deleted file mode 100644 index 3bf0aab..0000000 --- a/public/data/initPlaylists.json +++ /dev/null @@ -1,769 +0,0 @@ -{ - "query": "S%C6%A1n+t%C3%B9ng", - "playlists": { - "totalCount": 1000, - "items": [ - { - "data": { - "uri": "spotify:playlist:7K4fE6HQ1WP97EuHmbexQr", - "name": "Sơn Tùng Remix", - "description": "", - "images": { - "items": [ - { - "sources": [ - { - "url": "https://mosaic.scdn.co/640/ab67616d00001e025e228bbb9332c9b6fd0c3df3ab67616d00001e0262dee5c4741a0a9287c690caab67616d00001e02754d0b74f5f7eb1f109114f3ab67616d00001e0292e8a2d6fb0fe8ff6c696b3a", - "width": 640, - "height": 640 - }, - { - "url": "https://mosaic.scdn.co/300/ab67616d00001e025e228bbb9332c9b6fd0c3df3ab67616d00001e0262dee5c4741a0a9287c690caab67616d00001e02754d0b74f5f7eb1f109114f3ab67616d00001e0292e8a2d6fb0fe8ff6c696b3a", - "width": 300, - "height": 300 - }, - { - "url": "https://mosaic.scdn.co/60/ab67616d00001e025e228bbb9332c9b6fd0c3df3ab67616d00001e0262dee5c4741a0a9287c690caab67616d00001e02754d0b74f5f7eb1f109114f3ab67616d00001e0292e8a2d6fb0fe8ff6c696b3a", - "width": 60, - "height": 60 - } - ] - } - ] - }, - "owner": { - "name": "Quoc Thai" - } - } - }, - { - "data": { - "uri": "spotify:playlist:37i9dQZF1DWYPc4oQ0ynkq", - "name": "Mãi Yêu Sơn Tùng M-TP", - "description": "Sự trở lại với MAKING MY WAY", - "images": { - "items": [ - { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67706f00000002b0cec6a6f725da4223a17e35", - "width": null, - "height": null - } - ] - } - ] - }, - "owner": { - "name": "Spotify" - } - } - }, - { - "data": { - "uri": "spotify:playlist:37i9dQZF1DX0F4i7Q9pshJ", - "name": "Hot Hits Vietnam", - "description": "Đông tới Tây, đây là những ca khúc thịnh hành nhất ở Việt Nam. Ảnh bìa: Hoàng Thùy Linh", - "images": { - "items": [ - { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67706f000000027593ee00cbf4d2fa528880f4", - "width": null, - "height": null - } - ] - } - ] - }, - "owner": { - "name": "Spotify" - } - } - }, - { - "data": { - "uri": "spotify:playlist:6PEiBLN0Bjkfvc8ARaOdz3", - "name": "Playlist Sơn Tùng M-TP", - "description": "", - "images": { - "items": [ - { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67706c0000da84af966c0ac1d3ff832b0a450f", - "width": null, - "height": null - } - ] - } - ] - }, - "owner": { - "name": "Wangie_Zun" - } - } - }, - { - "data": { - "uri": "spotify:playlist:37i9dQZF1DX4g8Gs5nUhpp", - "name": "V-Pop Không Thể Thiếu", - "description": "V-Pop nở hoa trên những ca khúc này. Ảnh bìa: Vũ.", - "images": { - "items": [ - { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67706f000000020e2b5e0809db2a9ec6c4b1c8", - "width": null, - "height": null - } - ] - } - ] - }, - "owner": { - "name": "Spotify" - } - } - }, - { - "data": { - "uri": "spotify:playlist:4DoeHyTWRntiI9bPeot9tc", - "name": "Nhạc Sơn Tùng M-TP", - "description": "", - "images": { - "items": [ - { - "sources": [ - { - "url": "https://mosaic.scdn.co/640/ab67616d00001e020ac09baba508700ed0b5d4e3ab67616d00001e02af31997b23b7e6e65de1816bab67616d00001e02bd5e1e87284f21254d1fd7d0ab67616d00001e02eda65b93d53c2f982c5d57d8", - "width": 640, - "height": 640 - }, - { - "url": "https://mosaic.scdn.co/300/ab67616d00001e020ac09baba508700ed0b5d4e3ab67616d00001e02af31997b23b7e6e65de1816bab67616d00001e02bd5e1e87284f21254d1fd7d0ab67616d00001e02eda65b93d53c2f982c5d57d8", - "width": 300, - "height": 300 - }, - { - "url": "https://mosaic.scdn.co/60/ab67616d00001e020ac09baba508700ed0b5d4e3ab67616d00001e02af31997b23b7e6e65de1816bab67616d00001e02bd5e1e87284f21254d1fd7d0ab67616d00001e02eda65b93d53c2f982c5d57d8", - "width": 60, - "height": 60 - } - ] - } - ] - }, - "owner": { - "name": "Hiền Giày" - } - } - }, - { - "data": { - "uri": "spotify:playlist:37i9dQZF1DZ06evO0rEBlZ", - "name": "This Is Son Tuyen", - "description": "This is Son Tuyen. The essential tracks, all in one playlist.", - "images": { - "items": [ - { - "sources": [ - { - "url": "https://thisis-images.scdn.co/37i9dQZF1DZ06evO0rEBlZ-default.jpg", - "width": null, - "height": null - } - ] - } - ] - }, - "owner": { - "name": "Spotify" - } - } - }, - { - "data": { - "uri": "spotify:playlist:5IijTxU9wey5KDBuXaODsK", - "name": "The Summer I Turned Pretty: Lola Tung’s Belly Playlist", - "description": "This is my Belly/TSITP Playlist. It includes songs I played while getting into character and some songs that we listened to on set or while getting ready in the hair & makeup trailer, and others are songs that just remind me of this magical summer. ", - "images": { - "items": [ - { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67706c0000da843eaf1c8e1d2faeb71c71a964", - "width": null, - "height": null - } - ] - } - ] - }, - "owner": { - "name": "Prime Video" - } - } - }, - { - "data": { - "uri": "spotify:playlist:37i9dQZF1DWSG5OQeK5GOm", - "name": "Top Bài Hát 2021", - "description": "Những bài hát có lượt nghe nhiều nhất năm 2021 tại Việt Nam. Ảnh bìa: Sơn Tùng M-TP", - "images": { - "items": [ - { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67706f0000000212fa91690c77d0cad2895636", - "width": null, - "height": null - } - ] - } - ] - }, - "owner": { - "name": "Spotify" - } - } - }, - { - "data": { - "uri": "spotify:playlist:7uDeZNu85jU3UHWsTHz102", - "name": "Sơn Tùng MTP playlist", - "description": "", - "images": { - "items": [ - { - "sources": [ - { - "url": "https://mosaic.scdn.co/640/ab67616d00001e0229f906fe7a60df7777b02ee1ab67616d00001e025888c34015bebbf123957f6dab67616d00001e02659e798cad5728dbeabf1603ab67616d00001e02af31997b23b7e6e65de1816b", - "width": 640, - "height": 640 - }, - { - "url": "https://mosaic.scdn.co/300/ab67616d00001e0229f906fe7a60df7777b02ee1ab67616d00001e025888c34015bebbf123957f6dab67616d00001e02659e798cad5728dbeabf1603ab67616d00001e02af31997b23b7e6e65de1816b", - "width": 300, - "height": 300 - }, - { - "url": "https://mosaic.scdn.co/60/ab67616d00001e0229f906fe7a60df7777b02ee1ab67616d00001e025888c34015bebbf123957f6dab67616d00001e02659e798cad5728dbeabf1603ab67616d00001e02af31997b23b7e6e65de1816b", - "width": 60, - "height": 60 - } - ] - } - ] - }, - "owner": { - "name": "Liuminhvulmv" - } - } - }, - { - "data": { - "uri": "spotify:playlist:37i9dQZF1DWVOaOWiVD1Lf", - "name": "Thiên Hạ Nghe Gì", - "description": "\u001dNhững gì mà người bên cạnh bạn đang nghe. Ảnh bìa: (đố biết)", - "images": { - "items": [ - { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67706f000000029b8b954aba0c9c86ccc57bee", - "width": null, - "height": null - } - ] - } - ] - }, - "owner": { - "name": "Spotify" - } - } - }, - { - "data": { - "uri": "spotify:playlist:66fHWkzkLOijueDWisfjaY", - "name": "Sơn tùng", - "description": "", - "images": { - "items": [ - { - "sources": [ - { - "url": "https://mosaic.scdn.co/640/ab67616d00001e020b303433c40b65a63dec0a04ab67616d00001e0229f906fe7a60df7777b02ee1ab67616d00001e025888c34015bebbf123957f6dab67616d00001e02af31997b23b7e6e65de1816b", - "width": 640, - "height": 640 - }, - { - "url": "https://mosaic.scdn.co/300/ab67616d00001e020b303433c40b65a63dec0a04ab67616d00001e0229f906fe7a60df7777b02ee1ab67616d00001e025888c34015bebbf123957f6dab67616d00001e02af31997b23b7e6e65de1816b", - "width": 300, - "height": 300 - }, - { - "url": "https://mosaic.scdn.co/60/ab67616d00001e020b303433c40b65a63dec0a04ab67616d00001e0229f906fe7a60df7777b02ee1ab67616d00001e025888c34015bebbf123957f6dab67616d00001e02af31997b23b7e6e65de1816b", - "width": 60, - "height": 60 - } - ] - } - ] - }, - "owner": { - "name": "Chiến" - } - } - }, - { - "data": { - "uri": "spotify:playlist:37i9dQZF1DWT2oR9BciC32", - "name": "Indie Việt", - "description": "Những ca khúc hay nhất từ dòng nhạc rất đa dạng. Ảnh bìa: Thịnh Suy", - "images": { - "items": [ - { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67706f00000002010e88a0c34c9f0d2bf2634f", - "width": null, - "height": null - } - ] - } - ] - }, - "owner": { - "name": "Spotify" - } - } - }, - { - "data": { - "uri": "spotify:playlist:09CBZv2eAvgddA38rNsTCs", - "name": "Nhạc sơn tùng", - "description": "", - "images": { - "items": [ - { - "sources": [ - { - "url": "https://mosaic.scdn.co/640/ab67616d00001e020b303433c40b65a63dec0a04ab67616d00001e0229f906fe7a60df7777b02ee1ab67616d00001e025888c34015bebbf123957f6dab67616d00001e025a49b51d7300294409a25589", - "width": 640, - "height": 640 - }, - { - "url": "https://mosaic.scdn.co/300/ab67616d00001e020b303433c40b65a63dec0a04ab67616d00001e0229f906fe7a60df7777b02ee1ab67616d00001e025888c34015bebbf123957f6dab67616d00001e025a49b51d7300294409a25589", - "width": 300, - "height": 300 - }, - { - "url": "https://mosaic.scdn.co/60/ab67616d00001e020b303433c40b65a63dec0a04ab67616d00001e0229f906fe7a60df7777b02ee1ab67616d00001e025888c34015bebbf123957f6dab67616d00001e025a49b51d7300294409a25589", - "width": 60, - "height": 60 - } - ] - } - ] - }, - "owner": { - "name": "Nguyễn Tuấn Anh" - } - } - }, - { - "data": { - "uri": "spotify:playlist:37i9dQZF1DWUTZW9htiAv9", - "name": "Remix Đỉnh Của Đỉnh", - "description": "Quẩy tung sàn cùng những bản remix thịnh hành tóp tóp cho tới vinahouse đỉnh cao. ", - "images": { - "items": [ - { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67706f000000025dc7b1fb8e8892e735545de6", - "width": null, - "height": null - } - ] - } - ] - }, - "owner": { - "name": "Spotify" - } - } - }, - { - "data": { - "uri": "spotify:playlist:5aJO4X97gXKckYNbEGHJqH", - "name": "Le Tung Son", - "description": "", - "images": { - "items": [ - { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67706c0000da849ccb0a6f8aed93d9f2d7d28b", - "width": null, - "height": null - } - ] - } - ] - }, - "owner": { - "name": "Nykosun" - } - } - }, - { - "data": { - "uri": "spotify:playlist:37i9dQZF1DZ06evO143m6K", - "name": "This Is Tùng", - "description": "This is Tùng. The essential tracks, all in one playlist.", - "images": { - "items": [ - { - "sources": [ - { - "url": "https://thisis-images.scdn.co/37i9dQZF1DZ06evO143m6K-default.jpg", - "width": null, - "height": null - } - ] - } - ] - }, - "owner": { - "name": "Spotify" - } - } - }, - { - "data": { - "uri": "spotify:playlist:5aUmWr1SNlLk9F8Uqpu417", - "name": "Sơn Tùng ", - "description": "", - "images": { - "items": [ - { - "sources": [ - { - "url": "https://mosaic.scdn.co/640/ab67616d00001e02367e66db58f0d26ad3371983ab67616d00001e0248e90a4c48b31c66e8b0d24fab67616d00001e025888c34015bebbf123957f6dab67616d00001e02af31997b23b7e6e65de1816b", - "width": 640, - "height": 640 - }, - { - "url": "https://mosaic.scdn.co/300/ab67616d00001e02367e66db58f0d26ad3371983ab67616d00001e0248e90a4c48b31c66e8b0d24fab67616d00001e025888c34015bebbf123957f6dab67616d00001e02af31997b23b7e6e65de1816b", - "width": 300, - "height": 300 - }, - { - "url": "https://mosaic.scdn.co/60/ab67616d00001e02367e66db58f0d26ad3371983ab67616d00001e0248e90a4c48b31c66e8b0d24fab67616d00001e025888c34015bebbf123957f6dab67616d00001e02af31997b23b7e6e65de1816b", - "width": 60, - "height": 60 - } - ] - } - ] - }, - "owner": { - "name": "Nguyễn Phương" - } - } - }, - { - "data": { - "uri": "spotify:playlist:37i9dQZF1DX2EFtEf6QszT", - "name": "Mãi Yêu Dương Hồng Loan", - "description": "Những ca khúc hay nhất từ giọng hát ngọt ngào Dương Hồng Loan", - "images": { - "items": [ - { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67706f000000026346cc045e4eb97c4f58c287", - "width": null, - "height": null - } - ] - } - ] - }, - "owner": { - "name": "Spotify" - } - } - }, - { - "data": { - "uri": "spotify:playlist:4MzN5vZrd4rMaDr57aOwnl", - "name": "Tungsten", - "description": "Every song I like", - "images": { - "items": [ - { - "sources": [ - { - "url": "https://mosaic.scdn.co/640/ab67616d00001e0223152d9337d6c57b116ed13aab67616d00001e02396bd4537ee966711c5bf7deab67616d00001e023b812eed53f0d7e134fe446eab67616d00001e027a293e6787c6d200c5077cd0", - "width": 640, - "height": 640 - }, - { - "url": "https://mosaic.scdn.co/300/ab67616d00001e0223152d9337d6c57b116ed13aab67616d00001e02396bd4537ee966711c5bf7deab67616d00001e023b812eed53f0d7e134fe446eab67616d00001e027a293e6787c6d200c5077cd0", - "width": 300, - "height": 300 - }, - { - "url": "https://mosaic.scdn.co/60/ab67616d00001e0223152d9337d6c57b116ed13aab67616d00001e02396bd4537ee966711c5bf7deab67616d00001e023b812eed53f0d7e134fe446eab67616d00001e027a293e6787c6d200c5077cd0", - "width": 60, - "height": 60 - } - ] - } - ] - }, - "owner": { - "name": "Alex" - } - } - }, - { - "data": { - "uri": "spotify:playlist:37i9dQZF1DWWdlSG3xntgM", - "name": "Bolero Tuyệt Phẩm", - "description": "Những ca khúc để đời của dòng nhạc vàng. Ảnh bìa: Như Quỳnh", - "images": { - "items": [ - { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67706f00000002697682c9f2feaac80c7dbcaf", - "width": null, - "height": null - } - ] - } - ] - }, - "owner": { - "name": "Spotify" - } - } - }, - { - "data": { - "uri": "spotify:playlist:3IodsyNDlHWQ1GBvQiIhsG", - "name": "My song so tung", - "description": "", - "images": { - "items": [ - { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67706c0000da84557a583172d1afcc252519f7", - "width": null, - "height": null - } - ] - } - ] - }, - "owner": { - "name": "Clover" - } - } - }, - { - "data": { - "uri": "spotify:playlist:37i9dQZF1DX5UMwGFV95IS", - "name": "Đóa Hồng Nhạc Việt", - "description": "Một nửa mềm mại của làng nhạc Việt. Ảnh bìa: MIN", - "images": { - "items": [ - { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67706f00000002dc5024789773e5a37812c3f2", - "width": null, - "height": null - } - ] - } - ] - }, - "owner": { - "name": "Spotify" - } - } - }, - { - "data": { - "uri": "spotify:playlist:3qu5n3huplsb09hqy6xs7T", - "name": "Tuyển tập của Sơn Tùng M-TP", - "description": "", - "images": { - "items": [ - { - "sources": [ - { - "url": "https://mosaic.scdn.co/640/ab67616d00001e0229f906fe7a60df7777b02ee1ab67616d00001e02771323ba8f7fe1d93fe094edab67616d00001e0280c819177b63d5a7f1d2a5f4ab67616d00001e0296dc8a7f70527bd009d9c535", - "width": 640, - "height": 640 - }, - { - "url": "https://mosaic.scdn.co/300/ab67616d00001e0229f906fe7a60df7777b02ee1ab67616d00001e02771323ba8f7fe1d93fe094edab67616d00001e0280c819177b63d5a7f1d2a5f4ab67616d00001e0296dc8a7f70527bd009d9c535", - "width": 300, - "height": 300 - }, - { - "url": "https://mosaic.scdn.co/60/ab67616d00001e0229f906fe7a60df7777b02ee1ab67616d00001e02771323ba8f7fe1d93fe094edab67616d00001e0280c819177b63d5a7f1d2a5f4ab67616d00001e0296dc8a7f70527bd009d9c535", - "width": 60, - "height": 60 - } - ] - } - ] - }, - "owner": { - "name": "Đức An" - } - } - }, - { - "data": { - "uri": "spotify:playlist:37i9dQZF1DWYXdFGkgrNCC", - "name": "Buổi Diễn", - "description": "Những phần trình diễn sống động và chân thực trên sân khấu. Ảnh bìa: Hoàng Dũng", - "images": { - "items": [ - { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67706f00000002ffa82e908e543449709da631", - "width": null, - "height": null - } - ] - } - ] - }, - "owner": { - "name": "Spotify" - } - } - }, - { - "data": { - "uri": "spotify:playlist:1YFQOrEX8Qc7N6yT8DPAUS", - "name": "Sơn Tùng MTP", - "description": "", - "images": { - "items": [ - { - "sources": [ - { - "url": "https://mosaic.scdn.co/640/ab67616d00001e020ac09baba508700ed0b5d4e3ab67616d00001e020b303433c40b65a63dec0a04ab67616d00001e02659e798cad5728dbeabf1603ab67616d00001e02af31997b23b7e6e65de1816b", - "width": 640, - "height": 640 - }, - { - "url": "https://mosaic.scdn.co/300/ab67616d00001e020ac09baba508700ed0b5d4e3ab67616d00001e020b303433c40b65a63dec0a04ab67616d00001e02659e798cad5728dbeabf1603ab67616d00001e02af31997b23b7e6e65de1816b", - "width": 300, - "height": 300 - }, - { - "url": "https://mosaic.scdn.co/60/ab67616d00001e020ac09baba508700ed0b5d4e3ab67616d00001e020b303433c40b65a63dec0a04ab67616d00001e02659e798cad5728dbeabf1603ab67616d00001e02af31997b23b7e6e65de1816b", - "width": 60, - "height": 60 - } - ] - } - ] - }, - "owner": { - "name": "BeBiii🧸" - } - } - }, - { - "data": { - "uri": "spotify:playlist:37i9dQZF1DXcJ3YhsMrHLi", - "name": "Mãi Yêu Đen", - "description": "Ca khúc mới Nấu ăn cho em cùng những bài khác từ \"một người Việt chơi nhạc Rap\"", - "images": { - "items": [ - { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67706f000000026b3b89886acd5a3f68f60484", - "width": null, - "height": null - } - ] - } - ] - }, - "owner": { - "name": "Spotify" - } - } - }, - { - "data": { - "uri": "spotify:playlist:3DPUit288Z1gV35NAMcnMa", - "name": "Sky-Son Tung", - "description": "", - "images": { - "items": [ - { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67706c0000da84186d074899949ddc34dcfde4", - "width": null, - "height": null - } - ] - } - ] - }, - "owner": { - "name": "Khangminhr" - } - } - }, - { - "data": { - "uri": "spotify:playlist:37i9dQZF1DXbKsyiqE26uw", - "name": "Mãi Yêu Hà Anh Tuấn", - "description": "Ca khúc mới nhất Tháng Mấy Em Nhớ Anh và những bài hát quen thuộc khác.", - "images": { - "items": [ - { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67706f00000002e86341e68e764574034135f7", - "width": null, - "height": null - } - ] - } - ] - }, - "owner": { - "name": "Spotify" - } - } - } - ], - "pagingInfo": { - "nextOffset": 29, - "limit": 29 - } - } -} \ No newline at end of file diff --git a/public/data/initSongs.json b/public/data/initSongs.json index 55731f5..dd64ec7 100644 --- a/public/data/initSongs.json +++ b/public/data/initSongs.json @@ -1,342 +1,36 @@ { - "query": "s%C6%A1n+t%C3%B9ng", - "tracks": { - "totalCount": 1000, - "items": [ - { - "data": { - "uri": "spotify:track:6HGOxrNik4iPurqStawTFQ", - "id": "6HGOxrNik4iPurqStawTFQ", - "name": "MAKING MY WAY", - "albumOfTrack": { - "uri": "spotify:album:371NWHWKJxyUYwOywWpTal", - "name": "MAKING MY WAY", - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e020b303433c40b65a63dec0a04", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d000048510b303433c40b65a63dec0a04", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b2730b303433c40b65a63dec0a04", - "width": 640, - "height": 640 - } - ] - }, - "id": "371NWHWKJxyUYwOywWpTal", - "sharingInfo": { - "shareUrl": "https://open.spotify.com/album/371NWHWKJxyUYwOywWpTal?si=uZnghUFTQd6DtLsO_mRUsA" - } - }, - "artists": { - "items": [ - { - "uri": "spotify:artist:5dfZ5uSmzR7VQK0udbAVpf", - "profile": { - "name": "Sơn Tùng M-TP" - } - } - ] - }, - "contentRating": { - "label": "NONE" - }, - "duration": { - "totalMilliseconds": 258006 - }, - "playability": { - "playable": true - } - } - }, - { - "data": { - "uri": "spotify:track:5fFLotKS1286huYIMQHqz7", - "id": "5fFLotKS1286huYIMQHqz7", - "name": "Muộn Rồi Mà Sao Còn", - "albumOfTrack": { - "uri": "spotify:album:33Iz5SghJnJ9iM0xIWCS3M", - "name": "Muộn Rồi Mà Sao Còn", - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e0229f906fe7a60df7777b02ee1", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000485129f906fe7a60df7777b02ee1", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b27329f906fe7a60df7777b02ee1", - "width": 640, - "height": 640 - } - ] - }, - "id": "33Iz5SghJnJ9iM0xIWCS3M", - "sharingInfo": { - "shareUrl": "https://open.spotify.com/album/33Iz5SghJnJ9iM0xIWCS3M?si=CqKkhP9ZTaeXrsRCAjkLwA" - } - }, - "artists": { - "items": [ - { - "uri": "spotify:artist:5dfZ5uSmzR7VQK0udbAVpf", - "profile": { - "name": "Sơn Tùng M-TP" - } - } - ] - }, - "contentRating": { - "label": "NONE" - }, - "duration": { - "totalMilliseconds": 275905 - }, - "playability": { - "playable": true - } - } - }, - { - "data": { - "uri": "spotify:track:0f5yQttJS5nNxRAleF4kZO", - "id": "0f5yQttJS5nNxRAleF4kZO", - "name": "Hãy Trao Cho Anh", - "albumOfTrack": { - "uri": "spotify:album:2bPHnJXjR8q8eC84jCmNt7", - "name": "Hãy Trao Cho Anh", - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e020ac09baba508700ed0b5d4e3", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d000048510ac09baba508700ed0b5d4e3", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b2730ac09baba508700ed0b5d4e3", - "width": 640, - "height": 640 - } - ] - }, - "id": "2bPHnJXjR8q8eC84jCmNt7", - "sharingInfo": { - "shareUrl": "https://open.spotify.com/album/2bPHnJXjR8q8eC84jCmNt7?si=8kaRNc3QSwyEfoJ5liqUFw" - } - }, - "artists": { - "items": [ - { - "uri": "spotify:artist:5dfZ5uSmzR7VQK0udbAVpf", - "profile": { - "name": "Sơn Tùng M-TP" - } - }, - { - "uri": "spotify:artist:7hJcb9fa4alzcOq3EaNPoG", - "profile": { - "name": "Snoop Dogg" - } - } - ] - }, - "contentRating": { - "label": "NONE" - }, - "duration": { - "totalMilliseconds": 245658 - }, - "playability": { - "playable": true - } - } - }, - { - "data": { - "uri": "spotify:track:17iGUekw5nFt5mIRJcUm3R", - "id": "17iGUekw5nFt5mIRJcUm3R", - "name": "Chúng Ta Của Hiện Tại", - "albumOfTrack": { - "uri": "spotify:album:6oT0WOEPWOxsa2Vmnkxwxa", - "name": "Chúng Ta Của Hiện Tại", - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e025888c34015bebbf123957f6d", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d000048515888c34015bebbf123957f6d", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b2735888c34015bebbf123957f6d", - "width": 640, - "height": 640 - } - ] - }, - "id": "6oT0WOEPWOxsa2Vmnkxwxa", - "sharingInfo": { - "shareUrl": "https://open.spotify.com/album/6oT0WOEPWOxsa2Vmnkxwxa?si=3XohKyu-QIG_gZUrHBYRRQ" - } - }, - "artists": { - "items": [ - { - "uri": "spotify:artist:5dfZ5uSmzR7VQK0udbAVpf", - "profile": { - "name": "Sơn Tùng M-TP" - } - } - ] - }, - "contentRating": { - "label": "NONE" - }, - "duration": { - "totalMilliseconds": 301538 - }, - "playability": { - "playable": true - } - } - }, - { - "data": { - "uri": "spotify:track:3ZYrI2prWaAm1RbpCqZzlO", - "id": "3ZYrI2prWaAm1RbpCqZzlO", - "name": "CHẠY NGAY ĐI - Onionn Remix", - "albumOfTrack": { - "uri": "spotify:album:7aqlLOsEHnLv8XPBs05iOJ", - "name": "CHẠY NGAY ĐI (Onionn Remix)", - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e02754d0b74f5f7eb1f109114f3", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d00004851754d0b74f5f7eb1f109114f3", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b273754d0b74f5f7eb1f109114f3", - "width": 640, - "height": 640 - } - ] - }, - "id": "7aqlLOsEHnLv8XPBs05iOJ", - "sharingInfo": { - "shareUrl": "https://open.spotify.com/album/7aqlLOsEHnLv8XPBs05iOJ?si=zspARd6yTs-QokvfKH5p-Q" - } - }, - "artists": { - "items": [ - { - "uri": "spotify:artist:5dfZ5uSmzR7VQK0udbAVpf", - "profile": { - "name": "Sơn Tùng M-TP" - } - }, - { - "uri": "spotify:artist:25M5YMbLCbYDSFPhQXYE8c", - "profile": { - "name": "Onionn." - } - } - ] - }, - "contentRating": { - "label": "NONE" - }, - "duration": { - "totalMilliseconds": 230400 - }, - "playability": { - "playable": true - } - } - }, - { - "data": { - "uri": "spotify:track:7hX5Of6NDiEaAR9zWsAeYY", - "id": "7hX5Of6NDiEaAR9zWsAeYY", - "name": "Khuôn Mặt Đáng Thương", - "albumOfTrack": { - "uri": "spotify:album:5hxm3ulOLVvjFdZNFO3n4M", - "name": "m-tp M-TP", - "coverArt": { - "sources": [ - { - "url": "https://i.scdn.co/image/ab67616d00001e02af31997b23b7e6e65de1816b", - "width": 300, - "height": 300 - }, - { - "url": "https://i.scdn.co/image/ab67616d00004851af31997b23b7e6e65de1816b", - "width": 64, - "height": 64 - }, - { - "url": "https://i.scdn.co/image/ab67616d0000b273af31997b23b7e6e65de1816b", - "width": 640, - "height": 640 - } - ] - }, - "id": "5hxm3ulOLVvjFdZNFO3n4M", - "sharingInfo": { - "shareUrl": "https://open.spotify.com/album/5hxm3ulOLVvjFdZNFO3n4M?si=DXBomR0sTpKLYUwjgs9kzQ" - } - }, - "artists": { - "items": [ - { - "uri": "spotify:artist:5dfZ5uSmzR7VQK0udbAVpf", - "profile": { - "name": "Sơn Tùng M-TP" - } - } - ] - }, - "contentRating": { - "label": "NONE" - }, - "duration": { - "totalMilliseconds": 257451 - }, - "playability": { - "playable": true - } - } - } - ], - "pagingInfo": { - "nextOffset": 6, - "limit": 6 + "title": "initSong", + "id": "00006", + "data": [ + { + "title": "MAKING MY WAY", + "imageUrl": "https://i.scdn.co/image/ab67616d00001e020b303433c40b65a63dec0a04", + "id": "6HGOxrNik4iPurqStawTFQ" + }, + { + "title": "Muộn Rồi Mà Sao Còn", + "imageUrl": "https://i.scdn.co/image/ab67616d00001e0229f906fe7a60df7777b02ee1", + "id": "5fFLotKS1286huYIMQHqz7" + }, + { + "title": "Hãy Trao Cho Anh", + "imageUrl": "https://i.scdn.co/image/ab67616d00001e020ac09baba508700ed0b5d4e3", + "id": "0f5yQttJS5nNxRAleF4kZO" + }, + { + "title": "Chúng Ta Của Hiện Tại", + "imageUrl": "https://i.scdn.co/image/ab67616d00001e025888c34015bebbf123957f6d", + "id": "17iGUekw5nFt5mIRJcUm3R" + }, + { + "title": "CHẠY NGAY ĐI - Onionn Remix", + "imageUrl": "https://i.scdn.co/image/ab67616d00001e02754d0b74f5f7eb1f109114f3", + "id": "3ZYrI2prWaAm1RbpCqZzlO" + }, + { + "title": "Khuôn Mặt Đáng Thương", + "imageUrl": "https://i.scdn.co/image/ab67616d00001e02af31997b23b7e6e65de1816b", + "id": "7hX5Of6NDiEaAR9zWsAeYY" } - } -} \ No newline at end of file + ] +} diff --git a/public/data/initTopTracks.json b/public/data/initTopTracks.json new file mode 100644 index 0000000..81ded6c --- /dev/null +++ b/public/data/initTopTracks.json @@ -0,0 +1,792 @@ +[ + { + "album": { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5dfZ5uSmzR7VQK0udbAVpf" + }, + "href": "https://api.spotify.com/v1/artists/5dfZ5uSmzR7VQK0udbAVpf", + "id": "5dfZ5uSmzR7VQK0udbAVpf", + "name": "Sơn Tùng M-TP", + "type": "artist", + "uri": "spotify:artist:5dfZ5uSmzR7VQK0udbAVpf" + } + ], + "external_urls": { + "spotify": "https://open.spotify.com/album/371NWHWKJxyUYwOywWpTal" + }, + "href": "https://api.spotify.com/v1/albums/371NWHWKJxyUYwOywWpTal", + "id": "371NWHWKJxyUYwOywWpTal", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b2730b303433c40b65a63dec0a04", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e020b303433c40b65a63dec0a04", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d000048510b303433c40b65a63dec0a04", + "width": 64 + } + ], + "is_playable": true, + "name": "MAKING MY WAY", + "release_date": "2023-05-05", + "release_date_precision": "day", + "total_tracks": 1, + "type": "album", + "uri": "spotify:album:371NWHWKJxyUYwOywWpTal" + }, + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5dfZ5uSmzR7VQK0udbAVpf" + }, + "href": "https://api.spotify.com/v1/artists/5dfZ5uSmzR7VQK0udbAVpf", + "id": "5dfZ5uSmzR7VQK0udbAVpf", + "name": "Sơn Tùng M-TP", + "type": "artist", + "uri": "spotify:artist:5dfZ5uSmzR7VQK0udbAVpf" + } + ], + "disc_number": 1, + "duration_ms": 258006, + "explicit": false, + "external_ids": { + "isrc": "QM6N22304577" + }, + "external_urls": { + "spotify": "https://open.spotify.com/track/6HGOxrNik4iPurqStawTFQ" + }, + "href": "https://api.spotify.com/v1/tracks/6HGOxrNik4iPurqStawTFQ", + "id": "6HGOxrNik4iPurqStawTFQ", + "is_local": false, + "is_playable": true, + "name": "MAKING MY WAY", + "popularity": 70, + "preview_url": "https://p.scdn.co/mp3-preview/e11c582ddf692c4b4c3b39d86461bcdc6701e7ed?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:6HGOxrNik4iPurqStawTFQ" + }, + { + "album": { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5dfZ5uSmzR7VQK0udbAVpf" + }, + "href": "https://api.spotify.com/v1/artists/5dfZ5uSmzR7VQK0udbAVpf", + "id": "5dfZ5uSmzR7VQK0udbAVpf", + "name": "Sơn Tùng M-TP", + "type": "artist", + "uri": "spotify:artist:5dfZ5uSmzR7VQK0udbAVpf" + } + ], + "external_urls": { + "spotify": "https://open.spotify.com/album/33Iz5SghJnJ9iM0xIWCS3M" + }, + "href": "https://api.spotify.com/v1/albums/33Iz5SghJnJ9iM0xIWCS3M", + "id": "33Iz5SghJnJ9iM0xIWCS3M", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b27329f906fe7a60df7777b02ee1", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e0229f906fe7a60df7777b02ee1", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d0000485129f906fe7a60df7777b02ee1", + "width": 64 + } + ], + "is_playable": true, + "name": "Muộn Rồi Mà Sao Còn", + "release_date": "2021-04-29", + "release_date_precision": "day", + "total_tracks": 1, + "type": "album", + "uri": "spotify:album:33Iz5SghJnJ9iM0xIWCS3M" + }, + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5dfZ5uSmzR7VQK0udbAVpf" + }, + "href": "https://api.spotify.com/v1/artists/5dfZ5uSmzR7VQK0udbAVpf", + "id": "5dfZ5uSmzR7VQK0udbAVpf", + "name": "Sơn Tùng M-TP", + "type": "artist", + "uri": "spotify:artist:5dfZ5uSmzR7VQK0udbAVpf" + } + ], + "disc_number": 1, + "duration_ms": 275905, + "explicit": false, + "external_ids": { + "isrc": "FR96X2124024" + }, + "external_urls": { + "spotify": "https://open.spotify.com/track/5fFLotKS1286huYIMQHqz7" + }, + "href": "https://api.spotify.com/v1/tracks/5fFLotKS1286huYIMQHqz7", + "id": "5fFLotKS1286huYIMQHqz7", + "is_local": false, + "is_playable": true, + "name": "Muộn Rồi Mà Sao Còn", + "popularity": 66, + "preview_url": "https://p.scdn.co/mp3-preview/b0d6994a6b9963b78cb6a2e147a61da90914198e?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:5fFLotKS1286huYIMQHqz7" + }, + { + "album": { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5dfZ5uSmzR7VQK0udbAVpf" + }, + "href": "https://api.spotify.com/v1/artists/5dfZ5uSmzR7VQK0udbAVpf", + "id": "5dfZ5uSmzR7VQK0udbAVpf", + "name": "Sơn Tùng M-TP", + "type": "artist", + "uri": "spotify:artist:5dfZ5uSmzR7VQK0udbAVpf" + } + ], + "external_urls": { + "spotify": "https://open.spotify.com/album/6oT0WOEPWOxsa2Vmnkxwxa" + }, + "href": "https://api.spotify.com/v1/albums/6oT0WOEPWOxsa2Vmnkxwxa", + "id": "6oT0WOEPWOxsa2Vmnkxwxa", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b2735888c34015bebbf123957f6d", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e025888c34015bebbf123957f6d", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d000048515888c34015bebbf123957f6d", + "width": 64 + } + ], + "is_playable": true, + "name": "Chúng Ta Của Hiện Tại", + "release_date": "2020-12-20", + "release_date_precision": "day", + "total_tracks": 1, + "type": "album", + "uri": "spotify:album:6oT0WOEPWOxsa2Vmnkxwxa" + }, + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5dfZ5uSmzR7VQK0udbAVpf" + }, + "href": "https://api.spotify.com/v1/artists/5dfZ5uSmzR7VQK0udbAVpf", + "id": "5dfZ5uSmzR7VQK0udbAVpf", + "name": "Sơn Tùng M-TP", + "type": "artist", + "uri": "spotify:artist:5dfZ5uSmzR7VQK0udbAVpf" + } + ], + "disc_number": 1, + "duration_ms": 301538, + "explicit": false, + "external_ids": { + "isrc": "DGA062020720" + }, + "external_urls": { + "spotify": "https://open.spotify.com/track/17iGUekw5nFt5mIRJcUm3R" + }, + "href": "https://api.spotify.com/v1/tracks/17iGUekw5nFt5mIRJcUm3R", + "id": "17iGUekw5nFt5mIRJcUm3R", + "is_local": false, + "is_playable": true, + "name": "Chúng Ta Của Hiện Tại", + "popularity": 66, + "preview_url": "https://p.scdn.co/mp3-preview/763b5e936ca9ae98afc2181deff0cbb023d513bb?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:17iGUekw5nFt5mIRJcUm3R" + }, + { + "album": { + "album_type": "album", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5dfZ5uSmzR7VQK0udbAVpf" + }, + "href": "https://api.spotify.com/v1/artists/5dfZ5uSmzR7VQK0udbAVpf", + "id": "5dfZ5uSmzR7VQK0udbAVpf", + "name": "Sơn Tùng M-TP", + "type": "artist", + "uri": "spotify:artist:5dfZ5uSmzR7VQK0udbAVpf" + } + ], + "external_urls": { + "spotify": "https://open.spotify.com/album/5hxm3ulOLVvjFdZNFO3n4M" + }, + "href": "https://api.spotify.com/v1/albums/5hxm3ulOLVvjFdZNFO3n4M", + "id": "5hxm3ulOLVvjFdZNFO3n4M", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273af31997b23b7e6e65de1816b", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02af31997b23b7e6e65de1816b", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851af31997b23b7e6e65de1816b", + "width": 64 + } + ], + "is_playable": true, + "name": "m-tp M-TP", + "release_date": "2017-04-01", + "release_date_precision": "day", + "total_tracks": 18, + "type": "album", + "uri": "spotify:album:5hxm3ulOLVvjFdZNFO3n4M" + }, + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5dfZ5uSmzR7VQK0udbAVpf" + }, + "href": "https://api.spotify.com/v1/artists/5dfZ5uSmzR7VQK0udbAVpf", + "id": "5dfZ5uSmzR7VQK0udbAVpf", + "name": "Sơn Tùng M-TP", + "type": "artist", + "uri": "spotify:artist:5dfZ5uSmzR7VQK0udbAVpf" + } + ], + "disc_number": 1, + "duration_ms": 293112, + "explicit": false, + "external_ids": { + "isrc": "FR2X41848606" + }, + "external_urls": { + "spotify": "https://open.spotify.com/track/1Huy9G87D6pbIveFulsH0P" + }, + "href": "https://api.spotify.com/v1/tracks/1Huy9G87D6pbIveFulsH0P", + "id": "1Huy9G87D6pbIveFulsH0P", + "is_local": false, + "is_playable": true, + "name": "Âm Thầm Bên Em", + "popularity": 64, + "preview_url": "https://p.scdn.co/mp3-preview/1bdff03a9755b035e5aca28af1c897873aa61a39?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 11, + "type": "track", + "uri": "spotify:track:1Huy9G87D6pbIveFulsH0P" + }, + { + "album": { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5dfZ5uSmzR7VQK0udbAVpf" + }, + "href": "https://api.spotify.com/v1/artists/5dfZ5uSmzR7VQK0udbAVpf", + "id": "5dfZ5uSmzR7VQK0udbAVpf", + "name": "Sơn Tùng M-TP", + "type": "artist", + "uri": "spotify:artist:5dfZ5uSmzR7VQK0udbAVpf" + } + ], + "external_urls": { + "spotify": "https://open.spotify.com/album/738A5dZVHTynH0sfeL87KV" + }, + "href": "https://api.spotify.com/v1/albums/738A5dZVHTynH0sfeL87KV", + "id": "738A5dZVHTynH0sfeL87KV", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273659e798cad5728dbeabf1603", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02659e798cad5728dbeabf1603", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851659e798cad5728dbeabf1603", + "width": 64 + } + ], + "is_playable": true, + "name": "CÓ CHẮC YÊU LÀ ĐÂY", + "release_date": "2020-07-06", + "release_date_precision": "day", + "total_tracks": 1, + "type": "album", + "uri": "spotify:album:738A5dZVHTynH0sfeL87KV" + }, + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5dfZ5uSmzR7VQK0udbAVpf" + }, + "href": "https://api.spotify.com/v1/artists/5dfZ5uSmzR7VQK0udbAVpf", + "id": "5dfZ5uSmzR7VQK0udbAVpf", + "name": "Sơn Tùng M-TP", + "type": "artist", + "uri": "spotify:artist:5dfZ5uSmzR7VQK0udbAVpf" + } + ], + "disc_number": 1, + "duration_ms": 202105, + "explicit": false, + "external_ids": { + "isrc": "FRX202047969" + }, + "external_urls": { + "spotify": "https://open.spotify.com/track/2z9iLlNBt1aLZUCFgXby97" + }, + "href": "https://api.spotify.com/v1/tracks/2z9iLlNBt1aLZUCFgXby97", + "id": "2z9iLlNBt1aLZUCFgXby97", + "is_local": false, + "is_playable": true, + "name": "CÓ CHẮC YÊU LÀ ĐÂY", + "popularity": 61, + "preview_url": "https://p.scdn.co/mp3-preview/4382a5c617b324919f7c291ea187f48319e6c3db?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:2z9iLlNBt1aLZUCFgXby97" + }, + { + "album": { + "album_type": "album", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5dfZ5uSmzR7VQK0udbAVpf" + }, + "href": "https://api.spotify.com/v1/artists/5dfZ5uSmzR7VQK0udbAVpf", + "id": "5dfZ5uSmzR7VQK0udbAVpf", + "name": "Sơn Tùng M-TP", + "type": "artist", + "uri": "spotify:artist:5dfZ5uSmzR7VQK0udbAVpf" + } + ], + "external_urls": { + "spotify": "https://open.spotify.com/album/5hxm3ulOLVvjFdZNFO3n4M" + }, + "href": "https://api.spotify.com/v1/albums/5hxm3ulOLVvjFdZNFO3n4M", + "id": "5hxm3ulOLVvjFdZNFO3n4M", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273af31997b23b7e6e65de1816b", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02af31997b23b7e6e65de1816b", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851af31997b23b7e6e65de1816b", + "width": 64 + } + ], + "is_playable": true, + "name": "m-tp M-TP", + "release_date": "2017-04-01", + "release_date_precision": "day", + "total_tracks": 18, + "type": "album", + "uri": "spotify:album:5hxm3ulOLVvjFdZNFO3n4M" + }, + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5dfZ5uSmzR7VQK0udbAVpf" + }, + "href": "https://api.spotify.com/v1/artists/5dfZ5uSmzR7VQK0udbAVpf", + "id": "5dfZ5uSmzR7VQK0udbAVpf", + "name": "Sơn Tùng M-TP", + "type": "artist", + "uri": "spotify:artist:5dfZ5uSmzR7VQK0udbAVpf" + } + ], + "disc_number": 1, + "duration_ms": 260117, + "explicit": false, + "external_ids": { + "isrc": "FR10S1774874" + }, + "external_urls": { + "spotify": "https://open.spotify.com/track/5HbLlcJogki9rRq2KfkGQP" + }, + "href": "https://api.spotify.com/v1/tracks/5HbLlcJogki9rRq2KfkGQP", + "id": "5HbLlcJogki9rRq2KfkGQP", + "is_local": false, + "is_playable": true, + "name": "Nơi Này Có Anh", + "popularity": 58, + "preview_url": "https://p.scdn.co/mp3-preview/32eae7d15f6f4b400f7b94a4a9069c3736379b64?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 18, + "type": "track", + "uri": "spotify:track:5HbLlcJogki9rRq2KfkGQP" + }, + { + "album": { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5dfZ5uSmzR7VQK0udbAVpf" + }, + "href": "https://api.spotify.com/v1/artists/5dfZ5uSmzR7VQK0udbAVpf", + "id": "5dfZ5uSmzR7VQK0udbAVpf", + "name": "Sơn Tùng M-TP", + "type": "artist", + "uri": "spotify:artist:5dfZ5uSmzR7VQK0udbAVpf" + } + ], + "external_urls": { + "spotify": "https://open.spotify.com/album/7aqlLOsEHnLv8XPBs05iOJ" + }, + "href": "https://api.spotify.com/v1/albums/7aqlLOsEHnLv8XPBs05iOJ", + "id": "7aqlLOsEHnLv8XPBs05iOJ", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273754d0b74f5f7eb1f109114f3", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02754d0b74f5f7eb1f109114f3", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851754d0b74f5f7eb1f109114f3", + "width": 64 + } + ], + "is_playable": true, + "name": "CHẠY NGAY ĐI (Onionn Remix)", + "release_date": "2018-07-05", + "release_date_precision": "day", + "total_tracks": 1, + "type": "album", + "uri": "spotify:album:7aqlLOsEHnLv8XPBs05iOJ" + }, + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5dfZ5uSmzR7VQK0udbAVpf" + }, + "href": "https://api.spotify.com/v1/artists/5dfZ5uSmzR7VQK0udbAVpf", + "id": "5dfZ5uSmzR7VQK0udbAVpf", + "name": "Sơn Tùng M-TP", + "type": "artist", + "uri": "spotify:artist:5dfZ5uSmzR7VQK0udbAVpf" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/25M5YMbLCbYDSFPhQXYE8c" + }, + "href": "https://api.spotify.com/v1/artists/25M5YMbLCbYDSFPhQXYE8c", + "id": "25M5YMbLCbYDSFPhQXYE8c", + "name": "Onionn.", + "type": "artist", + "uri": "spotify:artist:25M5YMbLCbYDSFPhQXYE8c" + } + ], + "disc_number": 1, + "duration_ms": 230400, + "explicit": false, + "external_ids": { + "isrc": "FR59R1822837" + }, + "external_urls": { + "spotify": "https://open.spotify.com/track/3ZYrI2prWaAm1RbpCqZzlO" + }, + "href": "https://api.spotify.com/v1/tracks/3ZYrI2prWaAm1RbpCqZzlO", + "id": "3ZYrI2prWaAm1RbpCqZzlO", + "is_local": false, + "is_playable": true, + "name": "CHẠY NGAY ĐI - Onionn Remix", + "popularity": 60, + "preview_url": "https://p.scdn.co/mp3-preview/6e6c76fd10f23371eccc453116411f0dc4ae23f5?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:3ZYrI2prWaAm1RbpCqZzlO" + }, + { + "album": { + "album_type": "album", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5dfZ5uSmzR7VQK0udbAVpf" + }, + "href": "https://api.spotify.com/v1/artists/5dfZ5uSmzR7VQK0udbAVpf", + "id": "5dfZ5uSmzR7VQK0udbAVpf", + "name": "Sơn Tùng M-TP", + "type": "artist", + "uri": "spotify:artist:5dfZ5uSmzR7VQK0udbAVpf" + } + ], + "external_urls": { + "spotify": "https://open.spotify.com/album/5hxm3ulOLVvjFdZNFO3n4M" + }, + "href": "https://api.spotify.com/v1/albums/5hxm3ulOLVvjFdZNFO3n4M", + "id": "5hxm3ulOLVvjFdZNFO3n4M", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273af31997b23b7e6e65de1816b", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02af31997b23b7e6e65de1816b", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851af31997b23b7e6e65de1816b", + "width": 64 + } + ], + "is_playable": true, + "name": "m-tp M-TP", + "release_date": "2017-04-01", + "release_date_precision": "day", + "total_tracks": 18, + "type": "album", + "uri": "spotify:album:5hxm3ulOLVvjFdZNFO3n4M" + }, + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5dfZ5uSmzR7VQK0udbAVpf" + }, + "href": "https://api.spotify.com/v1/artists/5dfZ5uSmzR7VQK0udbAVpf", + "id": "5dfZ5uSmzR7VQK0udbAVpf", + "name": "Sơn Tùng M-TP", + "type": "artist", + "uri": "spotify:artist:5dfZ5uSmzR7VQK0udbAVpf" + } + ], + "disc_number": 1, + "duration_ms": 227492, + "explicit": false, + "external_ids": { + "isrc": "FR2X41848607" + }, + "external_urls": { + "spotify": "https://open.spotify.com/track/0YRtuiIMa3FM3LywGlJIii" + }, + "href": "https://api.spotify.com/v1/tracks/0YRtuiIMa3FM3LywGlJIii", + "id": "0YRtuiIMa3FM3LywGlJIii", + "is_local": false, + "is_playable": true, + "name": "Buông Đôi Tay Nhau Ra", + "popularity": 60, + "preview_url": "https://p.scdn.co/mp3-preview/0adfbf8e75964a542061421a7a24fd2b7ef5737a?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 12, + "type": "track", + "uri": "spotify:track:0YRtuiIMa3FM3LywGlJIii" + }, + { + "album": { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5dfZ5uSmzR7VQK0udbAVpf" + }, + "href": "https://api.spotify.com/v1/artists/5dfZ5uSmzR7VQK0udbAVpf", + "id": "5dfZ5uSmzR7VQK0udbAVpf", + "name": "Sơn Tùng M-TP", + "type": "artist", + "uri": "spotify:artist:5dfZ5uSmzR7VQK0udbAVpf" + } + ], + "external_urls": { + "spotify": "https://open.spotify.com/album/2bPHnJXjR8q8eC84jCmNt7" + }, + "href": "https://api.spotify.com/v1/albums/2bPHnJXjR8q8eC84jCmNt7", + "id": "2bPHnJXjR8q8eC84jCmNt7", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b2730ac09baba508700ed0b5d4e3", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e020ac09baba508700ed0b5d4e3", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d000048510ac09baba508700ed0b5d4e3", + "width": 64 + } + ], + "is_playable": true, + "name": "Hãy Trao Cho Anh", + "release_date": "2019-07-02", + "release_date_precision": "day", + "total_tracks": 1, + "type": "album", + "uri": "spotify:album:2bPHnJXjR8q8eC84jCmNt7" + }, + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5dfZ5uSmzR7VQK0udbAVpf" + }, + "href": "https://api.spotify.com/v1/artists/5dfZ5uSmzR7VQK0udbAVpf", + "id": "5dfZ5uSmzR7VQK0udbAVpf", + "name": "Sơn Tùng M-TP", + "type": "artist", + "uri": "spotify:artist:5dfZ5uSmzR7VQK0udbAVpf" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/7hJcb9fa4alzcOq3EaNPoG" + }, + "href": "https://api.spotify.com/v1/artists/7hJcb9fa4alzcOq3EaNPoG", + "id": "7hJcb9fa4alzcOq3EaNPoG", + "name": "Snoop Dogg", + "type": "artist", + "uri": "spotify:artist:7hJcb9fa4alzcOq3EaNPoG" + } + ], + "disc_number": 1, + "duration_ms": 245658, + "explicit": false, + "external_ids": { + "isrc": "FR59R1945194" + }, + "external_urls": { + "spotify": "https://open.spotify.com/track/0f5yQttJS5nNxRAleF4kZO" + }, + "href": "https://api.spotify.com/v1/tracks/0f5yQttJS5nNxRAleF4kZO", + "id": "0f5yQttJS5nNxRAleF4kZO", + "is_local": false, + "is_playable": true, + "name": "Hãy Trao Cho Anh", + "popularity": 59, + "preview_url": "https://p.scdn.co/mp3-preview/cba8579fc8be297192aab12ed19f85432feaeac0?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 1, + "type": "track", + "uri": "spotify:track:0f5yQttJS5nNxRAleF4kZO" + }, + { + "album": { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5dfZ5uSmzR7VQK0udbAVpf" + }, + "href": "https://api.spotify.com/v1/artists/5dfZ5uSmzR7VQK0udbAVpf", + "id": "5dfZ5uSmzR7VQK0udbAVpf", + "name": "Sơn Tùng M-TP", + "type": "artist", + "uri": "spotify:artist:5dfZ5uSmzR7VQK0udbAVpf" + } + ], + "external_urls": { + "spotify": "https://open.spotify.com/album/7r2UDe86W9yNHVymWu02xG" + }, + "href": "https://api.spotify.com/v1/albums/7r2UDe86W9yNHVymWu02xG", + "id": "7r2UDe86W9yNHVymWu02xG", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273771323ba8f7fe1d93fe094ed", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02771323ba8f7fe1d93fe094ed", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851771323ba8f7fe1d93fe094ed", + "width": 64 + } + ], + "is_playable": true, + "name": "SKY DECADE", + "release_date": "2022-10-06", + "release_date_precision": "day", + "total_tracks": 4, + "type": "album", + "uri": "spotify:album:7r2UDe86W9yNHVymWu02xG" + }, + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5dfZ5uSmzR7VQK0udbAVpf" + }, + "href": "https://api.spotify.com/v1/artists/5dfZ5uSmzR7VQK0udbAVpf", + "id": "5dfZ5uSmzR7VQK0udbAVpf", + "name": "Sơn Tùng M-TP", + "type": "artist", + "uri": "spotify:artist:5dfZ5uSmzR7VQK0udbAVpf" + } + ], + "disc_number": 1, + "duration_ms": 195697, + "explicit": false, + "external_ids": { + "isrc": "FRX872263797" + }, + "external_urls": { + "spotify": "https://open.spotify.com/track/6UdpjBhLNMFl3dH46iXlGi" + }, + "href": "https://api.spotify.com/v1/tracks/6UdpjBhLNMFl3dH46iXlGi", + "id": "6UdpjBhLNMFl3dH46iXlGi", + "is_local": false, + "is_playable": true, + "name": "Nắng Ấm Ngang Qua", + "popularity": 58, + "preview_url": "https://p.scdn.co/mp3-preview/a030ec079582c71c8907f20fda086b0bf32e652c?cid=0b297fa8a249464ba34f5861d4140e58", + "track_number": 3, + "type": "track", + "uri": "spotify:track:6UdpjBhLNMFl3dH46iXlGi" + } +] diff --git a/src/APIs/artistApi.ts b/src/APIs/artistApi.ts new file mode 100644 index 0000000..bd7dabd --- /dev/null +++ b/src/APIs/artistApi.ts @@ -0,0 +1,26 @@ +import { rapidApiClient, spotifyApiDev } from './axiosClient' + +const artistApi = async (id?: string) => { + if (!id) return + const { data } = await rapidApiClient.get('artist_overview/', { + params: { + id: id, + }, + }) + + return data.data.artist +} + +export const getArtistTopTrack = async (id?: string) => { + if (!id) return + const { data } = await spotifyApiDev.get(`artists/${id}/top-tracks?market=VN`) + return data +} + +export const getArtistAlbums = async (id?: string) => { + if (!id) return + const { data } = await spotifyApiDev.get(`artists/${id}/albums`) + return data +} + +export default artistApi diff --git a/src/APIs/authorizeApi.ts b/src/APIs/authorizeApi.ts new file mode 100644 index 0000000..553e8c5 --- /dev/null +++ b/src/APIs/authorizeApi.ts @@ -0,0 +1,25 @@ +// import { scopes } from '@/config/spotify' +// import { generateCodeChallenge, generateRandomString } from '@/utils' + +// const authorizeApi = async () => { +// const clientId = import.meta.env.VITE_SPOTIFY_CLIENT_ID +// const codeVerifier = generateRandomString(128) +// const codeChallenge = await generateCodeChallenge(codeVerifier) +// const state = generateRandomString(16) +// const scope = scopes + +// localStorage.setItem('spotify_code_verifier', codeVerifier) + +// const args = new URLSearchParams({ +// response_type: 'code', +// client_id: clientId, +// scope: scope, +// redirect_uri: `${window.location.origin}/`, +// state: state, +// code_challenge_method: 'S256', +// code_challenge: codeChallenge, +// }) +// window.location.replace('https://accounts.spotify.com/authorize?' + args) +// } + +// export default authorizeApi diff --git a/src/APIs/axiosClient.ts b/src/APIs/axiosClient.ts new file mode 100644 index 0000000..7f89606 --- /dev/null +++ b/src/APIs/axiosClient.ts @@ -0,0 +1,75 @@ +import axios from 'axios' +import queryString from 'query-string' +import { getAccessToken, getAccessTokenDev } from './getAccessToken' + +export const spotifyApiClient = axios.create({ + baseURL: 'https://api.spotify.com/v1', + paramsSerializer: (params) => queryString.stringify(params, { encode: false }), +}) + +spotifyApiClient.interceptors.request.use(async (config) => { + config.headers['Content-Type'] = 'application/json' + const isLogged = Boolean(localStorage.getItem('spotify_refresh_token')) + + if (isLogged) { + const token = await getAccessToken() + if (token) { + config.headers.Authorization = `Bearer ${token}` + } + } else { + const tokenDev = await getAccessTokenDev() + config.headers.Authorization = `Bearer ${tokenDev}` + } + + return config +}) + +export const spotifyApiDev = axios.create({ + baseURL: 'https://api.spotify.com/v1', + paramsSerializer: (params) => queryString.stringify(params, { encode: false }), +}) + +spotifyApiDev.interceptors.request.use(async (config) => { + config.headers['Content-Type'] = 'application/json' + + const tokenDev = await getAccessTokenDev() + config.headers.Authorization = `Bearer ${tokenDev}` + + return config +}) + +//to get artists data +export const rapidApiClient = axios.create({ + baseURL: 'https://spotify23.p.rapidapi.com', + paramsSerializer: (params) => queryString.stringify(params, { encode: false }), +}) + +rapidApiClient.interceptors.request.use((config) => { + const apiKey = import.meta.env.VITE_RAPID_SPOTIFY_API + + config.headers['X-RapidAPI-Key'] = apiKey + config.headers['X-RapidAPI-Host'] = 'spotify23.p.rapidapi.com' + + return config +}) + +// youtube search +// export const youtubeApiClient = axios.create({ +// baseURL: 'https://youtube.googleapis.com/youtube/v3', +// paramsSerializer: (params) => queryString.stringify(params, { encode: true }), +// }) + +//rapidApi - Youtube search https://rapidapi.com/fama-official-fastytapi/api/fastytapi/ +// export const rapidYtSearchClient = axios.create({ +// baseURL: 'https://fastytapi.p.rapidapi.com/ytapi', +// paramsSerializer: (params) => queryString.stringify(params, { encode: true }), +// }) + +// rapidYtSearchClient.interceptors.request.use((config) => { +// const apiKey = import.meta.env.VITE_RAPID_YOUTUBE_SEARCH + +// config.headers['X-RapidAPI-Key'] = apiKey +// config.headers['X-RapidAPI-Host'] = 'fastytapi.p.rapidapi.com' + +// return config +// }) diff --git a/src/APIs/browserApi.ts b/src/APIs/browserApi.ts new file mode 100644 index 0000000..120f89f --- /dev/null +++ b/src/APIs/browserApi.ts @@ -0,0 +1,29 @@ +import { countries } from '@/types/countries' +import { spotifyApiDev } from './axiosClient' + +interface browserApiProps { + limit: number + country: countries + type: 'featured-playlists' | 'new-releases' +} + +const browserApi = async (params: Partial) => { + const { country, limit, type } = params + + const { data } = await spotifyApiDev.get(`browse/${type}`, { + params: { + country: country, + limit: limit, + }, + }) + + if (data?.albums) { + return data.albums.items + } + + if (data?.playlists) { + return data.playlists.items + } +} + +export default browserApi diff --git a/src/APIs/categoriesApi.ts b/src/APIs/categoriesApi.ts new file mode 100644 index 0000000..b5fa3dd --- /dev/null +++ b/src/APIs/categoriesApi.ts @@ -0,0 +1,42 @@ +import { spotifyApiDev } from './axiosClient' + +export const getCategories = async () => { + const { data } = await spotifyApiDev.get('browse/categories', { + params: { + country: 'VN', + limit: 50, + }, + }) + + return data +} + +interface getCategoryPlaylistProps { + id?: string + limit?: number + offset?: number +} + +export const getCategoryPlaylist = async (params: getCategoryPlaylistProps) => { + const { id, limit = 50, offset = 0 } = params + if (!id) return + + const { data } = await spotifyApiDev.get(`browse/categories/${id}/playlists`, { + params: { + limit, + country: 'VN', + offset, + }, + }) + + return data +} + +export const getCategoryInfo = async (params: getCategoryPlaylistProps) => { + const { id } = params + if (!id) return + + const { data } = await spotifyApiDev.get(`browse/categories/${id}`) + + return data +} diff --git a/src/APIs/categoryApi.ts b/src/APIs/categoryApi.ts new file mode 100644 index 0000000..8c9b119 --- /dev/null +++ b/src/APIs/categoryApi.ts @@ -0,0 +1,16 @@ +import { spotifyApiDev } from './axiosClient' + +interface categoryApiProps { + type: string + id: string +} + +const categoryApi = async (params: Partial) => { + const { type, id } = params + + const { data } = await spotifyApiDev.get(`${type}/${id}`) + + return data +} + +export default categoryApi diff --git a/src/APIs/episodeApi.ts b/src/APIs/episodeApi.ts new file mode 100644 index 0000000..0b7c0af --- /dev/null +++ b/src/APIs/episodeApi.ts @@ -0,0 +1,15 @@ +import { spotifyApiDev } from './axiosClient' + +interface EpisodeApiProps { + id: string +} + +const episodeApi = async (params: Partial) => { + const { id } = params + + const { data } = await spotifyApiDev.get(`episodes/${id}`) + + return data +} + +export default episodeApi diff --git a/src/APIs/getAccessToken.ts b/src/APIs/getAccessToken.ts new file mode 100644 index 0000000..2c117f7 --- /dev/null +++ b/src/APIs/getAccessToken.ts @@ -0,0 +1,34 @@ +import axios from 'axios' +import { handleRefreshToken } from './handleRefreshToken' + +export const getAccessToken = async () => { + const accessTokenAt = new Date( + JSON.parse(localStorage.getItem('spotify_access_token_at') as string) + ).getTime() + const currentTime = new Date() + + if (currentTime.getTime() - accessTokenAt < 3600000) { + return localStorage.getItem('spotify_access_token') + } else { + return await handleRefreshToken() + } +} + +export const getAccessTokenDev = async () => { + const CLIENT_ID = import.meta.env.VITE_SPOTIFY_CLIENT_ID + const CLIENT_SECRET = import.meta.env.VITE_SPOTIFY_CLIENT_SECRET + const refreshTokenDev = import.meta.env.VITE_REFRESH_TOKEN_DEV + const headers = { + 'Content-Type': 'application/x-www-form-urlencoded', + Authorization: 'Basic ' + btoa(`${CLIENT_ID}:${CLIENT_SECRET}`), + } + + const params = new URLSearchParams() + params.append('grant_type', 'refresh_token') + params.append('refresh_token', refreshTokenDev as string) + const url = 'https://accounts.spotify.com/api/token' + + const { data } = await axios.post(url, params, { headers }) + + return data.access_token +} diff --git a/src/APIs/getAudioLink.ts b/src/APIs/getAudioLink.ts new file mode 100644 index 0000000..572937e --- /dev/null +++ b/src/APIs/getAudioLink.ts @@ -0,0 +1,108 @@ +import axios from 'axios' + +interface GetAudioLinkParams { + query: string + duration_ms: number + type: 'show' | 'track' +} + +export const getYoutubeAudioId = async (paramsSearch: GetAudioLinkParams) => { + const { type, query, duration_ms } = paramsSearch + const url = + type === 'track' + ? 'https://fastytapi.p.rapidapi.com/ytapi/search' + : 'https://yt-api.p.rapidapi.com/search' + const params = + type === 'track' + ? { + query: `${query}`, + resultsType: 'video', + sortBy: 'relevance', + geo: 'GB', + } + : { + query: query, + sort_by: 'relevance', + } + + const apiKey = + type === 'track' + ? import.meta.env.VITE_RAPID_YOUTUBE_SEARCH + : import.meta.env.VITE_RAPID_YOUTUBE_SEARCH_PODCAST_AND_AUDIO + const rapidHost = + type === 'track' ? 'fastytapi.p.rapidapi.com' : 'yt-api.p.rapidapi.com' + + const option = { + method: 'GET', + url, + params, + headers: { + 'X-RapidAPI-Key': apiKey, + 'X-RapidAPI-Host': rapidHost, + }, + } + + const { data } = await axios.request(option) + + if (type === 'show') return data.data[0].videoId + + for (const item of data.data) { + const diff = Math.abs(item.lengthSeconds - duration_ms / 1000) + if (diff < 80) { + return item.videoId + } + } + + return data.data[0].videoId +} + +export const getAudioLink = async (params: GetAudioLinkParams) => { + const { query } = params + console.log(query) + const id = await getYoutubeAudioId(params) + console.log(id) + const options = { + method: 'GET', + url: 'https://yt-api.p.rapidapi.com/dl', + params: { id }, + headers: { + 'X-RapidAPI-Key': import.meta.env.VITE_RAPID_YOUTUBE_SEARCH_PODCAST_AND_AUDIO, + 'X-RapidAPI-Host': 'ytstream-download-youtube-videos.p.rapidapi.com', + }, + } + const { data } = await axios.request(options) + const returnData = data.adaptiveFormats + .filter((item: any) => item.mimeType.includes('audio')) + .sort((a: any, b: any) => -a.bitrate + b.bitrate)[0] + + return { + audioLink: returnData.url, + durationMs: Number(returnData.approxDurationMs), + } +} + +// export const getAudioLink = async (params: GetAudioLinkParams) => { +// const { query } = params +// console.log(query) +// const id = await getYoutubeAudioId(params) +// console.log(id) +// const options = { +// method: 'GET', +// url: 'https://yt-api.p.rapidapi.com/dl', +// params: { id }, +// headers: { +// 'X-RapidAPI-Key': import.meta.env.VITE_RAPID_YOUTUBE_SEARCH_PODCAST_AND_AUDIO, +// 'X-RapidAPI-Host': 'ytstream-download-youtube-videos.p.rapidapi.com', +// }, +// } +// const { data } = await axios.request(options) +// const returnData = data.adaptiveFormats +// .filter((item: any) => item.mimeType.includes('audio')) +// .sort((a: any, b: any) => -a.bitrate + b.bitrate)[0] +// await fetch(`http://localhost:3000/audio-link?id=${id}`, { method: 'GET' }) + +// return { +// audioLink: `http://localhost:3000/audio/${id}`, +// durationMs: Number(returnData.approxDurationMs), +// } +// } diff --git a/src/APIs/getRefreshToken.ts b/src/APIs/getRefreshToken.ts new file mode 100644 index 0000000..488b9fc --- /dev/null +++ b/src/APIs/getRefreshToken.ts @@ -0,0 +1,27 @@ +import { REDIRECT_URI } from '@/constants/auth' +import axios from 'axios' + +export const getRefreshToken = async () => { + const authCode = localStorage.getItem('spotify_auth_code') + const CLIENT_ID = import.meta.env.VITE_SPOTIFY_CLIENT_ID + const CLIENT_SECRET = import.meta.env.VITE_SPOTIFY_CLIENT_SECRET + + const params = new URLSearchParams() + params.append('grant_type', 'authorization_code') + params.append('code', authCode as string) + params.append('redirect_uri', REDIRECT_URI) + params.append('client_id', CLIENT_ID) + params.append('client_secret', CLIENT_SECRET) + + try { + const { data } = await axios.post('https://accounts.spotify.com/api/token', params) + const currentTime = new Date() + + localStorage.setItem('spotify_refresh_token', data.refresh_token) + localStorage.setItem('spotify_access_token', data.access_token) + localStorage.setItem('spotify_access_token_at', JSON.stringify(currentTime)) + return { status: true } + } catch { + return { status: false } + } +} diff --git a/src/APIs/handleRefreshToken.ts b/src/APIs/handleRefreshToken.ts new file mode 100644 index 0000000..8c44e27 --- /dev/null +++ b/src/APIs/handleRefreshToken.ts @@ -0,0 +1,23 @@ +import axios from 'axios' + +export const handleRefreshToken = async () => { + const CLIENT_ID = import.meta.env.VITE_SPOTIFY_CLIENT_ID + const CLIENT_SECRET = import.meta.env.VITE_SPOTIFY_CLIENT_SECRET + const refreshToken = localStorage.getItem('spotify_refresh_token') + const url = 'https://accounts.spotify.com/api/token' + const headers = { + 'Content-Type': 'application/x-www-form-urlencoded', + Authorization: 'Basic ' + btoa(`${CLIENT_ID}:${CLIENT_SECRET}`), + } + const params = new URLSearchParams() + params.append('grant_type', 'refresh_token') + params.append('refresh_token', refreshToken as string) + + const { data } = await axios.post(url, params, { headers }) + + const currentTime = new Date() + + localStorage.setItem('spotify_access_token', data.access_token) + localStorage.setItem('spotify_access_token_at', JSON.stringify(currentTime)) + return data.access_token +} diff --git a/src/APIs/playerApi.ts b/src/APIs/playerApi.ts new file mode 100644 index 0000000..e1d6b80 --- /dev/null +++ b/src/APIs/playerApi.ts @@ -0,0 +1,19 @@ +import { spotifyApiClient } from './axiosClient' + +export const getUserQueue = async () => { + const { data } = await spotifyApiClient.get('me/player/queue') + return data +} + +export const handlePause = async () => { + await spotifyApiClient.put(`me/player/pause`) +} + +export const handlePlay = async () => { + await spotifyApiClient.put(`me/player/play`) +} + +export const getPlaybackState = async () => { + const { data } = await spotifyApiClient.get('me/player') + return data +} diff --git a/src/APIs/searchApi.ts b/src/APIs/searchApi.ts new file mode 100644 index 0000000..c4c3607 --- /dev/null +++ b/src/APIs/searchApi.ts @@ -0,0 +1,37 @@ +import { countries } from '@/types/countries' +import { spotifyApiDev } from './axiosClient' + +type SearchTypes = + | 'all' + | Array<'album' | 'artist' | 'playlist' | 'track' | 'show' | 'episode' | 'audiobook'> + +interface SearchArgs { + query: string + types?: SearchTypes + limit?: number + market?: countries +} + +const searchApi = async (params: Partial) => { + const { query = '', types = 'all', limit = 10, market = 'VN' } = params + let typesParam: string + + if (types === 'all') { + typesParam = 'album%2Cplaylist%2Ctrack%2Cartist%2Cshow%2Cepisode%2Caudiobook' + } else { + typesParam = types.map((type) => encodeURIComponent(type)).join('%2C') + } + + const { data } = await spotifyApiDev('search', { + params: { + q: encodeURIComponent(query), + type: typesParam, + market: market, + limit: limit, + }, + }) + + return data +} + +export default searchApi diff --git a/src/APIs/showApi.ts b/src/APIs/showApi.ts new file mode 100644 index 0000000..7985fb5 --- /dev/null +++ b/src/APIs/showApi.ts @@ -0,0 +1,15 @@ +import { spotifyApiDev } from './axiosClient' + +interface ShowApiProps { + id?: string +} + +const showApi = async (params: ShowApiProps) => { + const { id } = params + + const { data } = await spotifyApiDev.get(`shows/${id}`) + + return data +} + +export default showApi diff --git a/src/assets/image/search-banner/index.ts b/src/APIs/testApi.ts similarity index 100% rename from src/assets/image/search-banner/index.ts rename to src/APIs/testApi.ts diff --git a/src/APIs/trackApi.ts b/src/APIs/trackApi.ts new file mode 100644 index 0000000..473b288 --- /dev/null +++ b/src/APIs/trackApi.ts @@ -0,0 +1,35 @@ +import { countries } from '@/types/countries' +import { spotifyApiDev } from './axiosClient' + +interface GetTrackParams { + id: string +} + +export const getTrack = async (params: GetTrackParams) => { + const { id } = params + + const { data } = await spotifyApiDev.get(`tracks/${id}`) + + return data +} + +interface getTrackRecommendationParams { + limit?: number + market?: countries + seed_artists: string + seed_tracks?: string +} + +export const getTrackRecommendation = async (params: getTrackRecommendationParams) => { + const { limit = 19, market = 'VN', seed_artists, seed_tracks } = params + const { data } = await spotifyApiDev.get('recommendations', { + params: { + limit, + market, + seed_artists, + seed_tracks, + }, + }) + + return data.tracks +} diff --git a/src/APIs/userApi.ts b/src/APIs/userApi.ts new file mode 100644 index 0000000..5889c43 --- /dev/null +++ b/src/APIs/userApi.ts @@ -0,0 +1,30 @@ +import { spotifyApiClient, spotifyApiDev } from './axiosClient' + +export const getUserData = async () => { + const { data } = await spotifyApiClient.get(`me`) + // console.log(data) + return data +} + +export const getUserPlaylist = async (id: string) => { + const { data } = await spotifyApiDev.get(`users/${id}/playlists`, { + params: { + limit: 50, + }, + }) + return data +} + +export const getUserAlbum = async () => { + const { data } = await spotifyApiClient.get('me/albums') + return data +} + +export const getUserTopArtists = async () => { + const { data } = await spotifyApiClient.get('me/top/artists', { + params: { + limit: 50, + }, + }) + return data +} diff --git a/src/App.module.scss b/src/App.module.scss deleted file mode 100644 index ba08da0..0000000 --- a/src/App.module.scss +++ /dev/null @@ -1,39 +0,0 @@ -@import './scss/variable'; - -.app { - background-color: $black; - height: 100vh; - width: max(100vw, 900px); - overflow: hidden; - display: flex; - gap: $panel-gap; - padding: .8rem; -} - -.main { - flex: 1; - height: 100%; - border-radius: $panel-gap; - overflow: hidden; - overflow-y: auto; -} - - -.split { - display: flex; - flex-direction: row; - height: 100%; - width: 100%; -} - -// .gutter { -// background-color: #fff; -// cursor: col-resize; -// } - -// .gutter.gutter-horizontal { -// /* background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAeCAYAAADkftS9AAAAIklEQVQoU2M4c+bMfxAGAgYYmwGrIIiDjrELjpo5aiZeMwF+yNnOs5KSvgAAAABJRU5ErkJggg=='); */ -// height: 100%; -// background-color: #fff; -// cursor: col-resize; -// } \ No newline at end of file diff --git a/src/App.tsx b/src/App.tsx index 0e5ba6d..026c71c 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,41 +1,66 @@ -import { - Route, - Routes -} from 'react-router-dom' -import Split from 'react-split' -import styles from './App.module.scss' -import Sidebar from './components/Sidebar/Sidebar' -import { MainLayoutProvider } from './contexts/MainLayoutContext' -import Artist from './pages/Artist/Artist' -import Home from './pages/Home/Home' -import Search from './pages/Search/Search' -import './resizable.scss' +import { Suspense, createContext, lazy, useEffect, useState } from 'react' +import { Route, Routes } from 'react-router-dom' +import LoadingLayout from './layouts/LoadingLayout/LoadingLayout' +import { deleteAllCookies } from './utils' +const RootLayout = lazy(() => import('./layouts/RootLayout/RootLayout')) +const Home = lazy(() => import('@/pages/Home/Home')) +const Playlist = lazy(() => import('@/pages/Playlist/Playlist')) +const Album = lazy(() => import('@/pages/Album/Album')) +const Artist = lazy(() => import('@/pages/Artist/Artist')) +const Search = lazy(() => import('@/pages/Search/Search')) +const Section = lazy(() => import('@/pages/Section/Section')) +const Show = lazy(() => import('@/pages/Show/Show')) +const Episode = lazy(() => import('@/pages/Episode/Episode')) +const Alert = lazy(() => import('@/components/Alert/Alert')) +const Queue = lazy(() => import('@/pages/Queue/Queue')) +const Test = lazy(() => import('@/pages/test')) +const Genre = lazy(() => import('@/pages/Genre/Genre')) + +interface AppContext { + isPlayingViewShowed: boolean + setPlayingViewShowed: React.Dispatch> +} + +export const AppContext = createContext({} as AppContext) + +const App = () => { + const [isPlayingViewShowed, setPlayingViewShowed] = useState(false) + useEffect(() => { + deleteAllCookies() + }, []) + + if (window.innerWidth < 900) { + return + } -function App() { return ( -
- - - -
- - } /> - } /> - } /> - -
-
-
-
+ + }> + + }> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + + } /> + } /> + } /> + } /> + } /> + } /> + + + } /> + + + ) } diff --git a/src/assets/icons/index.tsx b/src/assets/icons/index.tsx new file mode 100644 index 0000000..289db43 --- /dev/null +++ b/src/assets/icons/index.tsx @@ -0,0 +1,430 @@ +interface IconProps { + size?: number +} + +export function SearchActiveIcon() { + return ( + + ) +} + +export function SearchIcon() { + return ( + + ) +} + +export function HomeActiveIcon() { + return ( + + ) +} + +export function HomeIcon() { + return ( + + ) +} + +export function LibraryIcon() { + return ( + + ) +} + +export function HeartIcon(props: Partial) { + const { size = 32 } = props + return ( + + ) +} + +export function ClockIcon() { + return ( + + ) +} + +export function PlayIcon() { + return ( + + ) +} + +export function UserImgDefault() { + return ( + + ) +} + +export function Verified() { + return ( + + ) +} + +export function FaceBookIcon() { + return ( + + ) +} + +export function CloseIcon() { + return ( + + ) +} + +export function SkipBackIcon() { + return ( + + ) +} + +export function SkipForwardIcon() { + return ( + + ) +} + +export function ShuffleIcon() { + return ( + + ) +} + +export function RepeatIcon() { + return ( + + ) +} + +export function PlayingViewIcon() { + return ( + + ) +} + +export function QueueIcon() { + return ( + + ) +} + +export type SoundLevel = 'mute' | 'low' | 'medium' | 'high' +interface SoundIconLevel { + level: SoundLevel +} + +export function SoundIcon(params: Required) { + const { level } = params + + switch (level) { + case 'mute': { + return ( + + ) + } + case 'low': { + return ( + + ) + } + case 'medium': { + return ( + + ) + } + case 'high': { + return ( + + ) + } + } +} + +export function PlusCircle() { + return ( + + ) +} + +export function MusicNote(props: Partial) { + const { size = 24 } = props + return ( + + ) +} + +export function SingleMusicNote(props: Partial) { + const { size = 16 } = props + return ( + + ) +} diff --git a/src/assets/image/animation/equaliser-animated-green.f5eb96f2.gif b/src/assets/image/animation/equaliser-animated-green.f5eb96f2.gif new file mode 100644 index 0000000..f8b271f Binary files /dev/null and b/src/assets/image/animation/equaliser-animated-green.f5eb96f2.gif differ diff --git a/src/assets/image/logo/logo.svg b/src/assets/image/logo/logo.svg new file mode 100644 index 0000000..5f93661 --- /dev/null +++ b/src/assets/image/logo/logo.svg @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/src/assets/image/search-banner/image (1).jpg b/src/assets/image/search-banner/image (1).jpg deleted file mode 100644 index 252f3d5..0000000 Binary files a/src/assets/image/search-banner/image (1).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (10).jpg b/src/assets/image/search-banner/image (10).jpg deleted file mode 100644 index 4e57d05..0000000 Binary files a/src/assets/image/search-banner/image (10).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (11).jpg b/src/assets/image/search-banner/image (11).jpg deleted file mode 100644 index 27cc953..0000000 Binary files a/src/assets/image/search-banner/image (11).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (12).jpg b/src/assets/image/search-banner/image (12).jpg deleted file mode 100644 index 477056d..0000000 Binary files a/src/assets/image/search-banner/image (12).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (13).jpg b/src/assets/image/search-banner/image (13).jpg deleted file mode 100644 index 599106a..0000000 Binary files a/src/assets/image/search-banner/image (13).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (14).jpg b/src/assets/image/search-banner/image (14).jpg deleted file mode 100644 index 256995c..0000000 Binary files a/src/assets/image/search-banner/image (14).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (15).jpg b/src/assets/image/search-banner/image (15).jpg deleted file mode 100644 index 09b3001..0000000 Binary files a/src/assets/image/search-banner/image (15).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (16).jpg b/src/assets/image/search-banner/image (16).jpg deleted file mode 100644 index 43780d4..0000000 Binary files a/src/assets/image/search-banner/image (16).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (17).jpg b/src/assets/image/search-banner/image (17).jpg deleted file mode 100644 index e01d273..0000000 Binary files a/src/assets/image/search-banner/image (17).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (18).jpg b/src/assets/image/search-banner/image (18).jpg deleted file mode 100644 index 5c5541e..0000000 Binary files a/src/assets/image/search-banner/image (18).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (19).jpg b/src/assets/image/search-banner/image (19).jpg deleted file mode 100644 index 438c604..0000000 Binary files a/src/assets/image/search-banner/image (19).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (2).jpg b/src/assets/image/search-banner/image (2).jpg deleted file mode 100644 index 1a26d1e..0000000 Binary files a/src/assets/image/search-banner/image (2).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (20).jpg b/src/assets/image/search-banner/image (20).jpg deleted file mode 100644 index d8c9b97..0000000 Binary files a/src/assets/image/search-banner/image (20).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (21).jpg b/src/assets/image/search-banner/image (21).jpg deleted file mode 100644 index af66750..0000000 Binary files a/src/assets/image/search-banner/image (21).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (22).jpg b/src/assets/image/search-banner/image (22).jpg deleted file mode 100644 index 2560b33..0000000 Binary files a/src/assets/image/search-banner/image (22).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (23).jpg b/src/assets/image/search-banner/image (23).jpg deleted file mode 100644 index 717c928..0000000 Binary files a/src/assets/image/search-banner/image (23).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (24).jpg b/src/assets/image/search-banner/image (24).jpg deleted file mode 100644 index 8c60469..0000000 Binary files a/src/assets/image/search-banner/image (24).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (25).jpg b/src/assets/image/search-banner/image (25).jpg deleted file mode 100644 index a2f25ca..0000000 Binary files a/src/assets/image/search-banner/image (25).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (26).jpg b/src/assets/image/search-banner/image (26).jpg deleted file mode 100644 index 4644b92..0000000 Binary files a/src/assets/image/search-banner/image (26).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (27).jpg b/src/assets/image/search-banner/image (27).jpg deleted file mode 100644 index 5fcd484..0000000 Binary files a/src/assets/image/search-banner/image (27).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (28).jpg b/src/assets/image/search-banner/image (28).jpg deleted file mode 100644 index a5d9391..0000000 Binary files a/src/assets/image/search-banner/image (28).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (29).jpg b/src/assets/image/search-banner/image (29).jpg deleted file mode 100644 index fe478d3..0000000 Binary files a/src/assets/image/search-banner/image (29).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (3).jpg b/src/assets/image/search-banner/image (3).jpg deleted file mode 100644 index bf3b593..0000000 Binary files a/src/assets/image/search-banner/image (3).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (30).jpg b/src/assets/image/search-banner/image (30).jpg deleted file mode 100644 index fcdb156..0000000 Binary files a/src/assets/image/search-banner/image (30).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (31).jpg b/src/assets/image/search-banner/image (31).jpg deleted file mode 100644 index 69d4831..0000000 Binary files a/src/assets/image/search-banner/image (31).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (32).jpg b/src/assets/image/search-banner/image (32).jpg deleted file mode 100644 index 585ccc2..0000000 Binary files a/src/assets/image/search-banner/image (32).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (33).jpg b/src/assets/image/search-banner/image (33).jpg deleted file mode 100644 index 746e9b2..0000000 Binary files a/src/assets/image/search-banner/image (33).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (34).jpg b/src/assets/image/search-banner/image (34).jpg deleted file mode 100644 index 61d0c87..0000000 Binary files a/src/assets/image/search-banner/image (34).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (35).jpg b/src/assets/image/search-banner/image (35).jpg deleted file mode 100644 index d5ae0eb..0000000 Binary files a/src/assets/image/search-banner/image (35).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (36).jpg b/src/assets/image/search-banner/image (36).jpg deleted file mode 100644 index ffcc2fb..0000000 Binary files a/src/assets/image/search-banner/image (36).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (37).jpg b/src/assets/image/search-banner/image (37).jpg deleted file mode 100644 index 6f97574..0000000 Binary files a/src/assets/image/search-banner/image (37).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (38).jpg b/src/assets/image/search-banner/image (38).jpg deleted file mode 100644 index 8dd93e5..0000000 Binary files a/src/assets/image/search-banner/image (38).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (39).jpg b/src/assets/image/search-banner/image (39).jpg deleted file mode 100644 index a5d826f..0000000 Binary files a/src/assets/image/search-banner/image (39).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (4).jpg b/src/assets/image/search-banner/image (4).jpg deleted file mode 100644 index 0ff2bc7..0000000 Binary files a/src/assets/image/search-banner/image (4).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (40).jpg b/src/assets/image/search-banner/image (40).jpg deleted file mode 100644 index b8d408b..0000000 Binary files a/src/assets/image/search-banner/image (40).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (41).jpg b/src/assets/image/search-banner/image (41).jpg deleted file mode 100644 index edf0b32..0000000 Binary files a/src/assets/image/search-banner/image (41).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (42).jpg b/src/assets/image/search-banner/image (42).jpg deleted file mode 100644 index b3a866d..0000000 Binary files a/src/assets/image/search-banner/image (42).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (43).jpg b/src/assets/image/search-banner/image (43).jpg deleted file mode 100644 index 709defc..0000000 Binary files a/src/assets/image/search-banner/image (43).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (44).jpg b/src/assets/image/search-banner/image (44).jpg deleted file mode 100644 index e5fe0bc..0000000 Binary files a/src/assets/image/search-banner/image (44).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (45).jpg b/src/assets/image/search-banner/image (45).jpg deleted file mode 100644 index aa411f9..0000000 Binary files a/src/assets/image/search-banner/image (45).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (46).jpg b/src/assets/image/search-banner/image (46).jpg deleted file mode 100644 index 0138735..0000000 Binary files a/src/assets/image/search-banner/image (46).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (47).jpg b/src/assets/image/search-banner/image (47).jpg deleted file mode 100644 index 65c716a..0000000 Binary files a/src/assets/image/search-banner/image (47).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (48).jpg b/src/assets/image/search-banner/image (48).jpg deleted file mode 100644 index 659520c..0000000 Binary files a/src/assets/image/search-banner/image (48).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (49).jpg b/src/assets/image/search-banner/image (49).jpg deleted file mode 100644 index 52d9801..0000000 Binary files a/src/assets/image/search-banner/image (49).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (5).jpg b/src/assets/image/search-banner/image (5).jpg deleted file mode 100644 index dc26d7f..0000000 Binary files a/src/assets/image/search-banner/image (5).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (50).jpg b/src/assets/image/search-banner/image (50).jpg deleted file mode 100644 index 1d734a7..0000000 Binary files a/src/assets/image/search-banner/image (50).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (51).jpg b/src/assets/image/search-banner/image (51).jpg deleted file mode 100644 index 952591f..0000000 Binary files a/src/assets/image/search-banner/image (51).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (52).jpg b/src/assets/image/search-banner/image (52).jpg deleted file mode 100644 index 153256c..0000000 Binary files a/src/assets/image/search-banner/image (52).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (53).jpg b/src/assets/image/search-banner/image (53).jpg deleted file mode 100644 index ae37b0a..0000000 Binary files a/src/assets/image/search-banner/image (53).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (54).jpg b/src/assets/image/search-banner/image (54).jpg deleted file mode 100644 index 9f56aa8..0000000 Binary files a/src/assets/image/search-banner/image (54).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (55).jpg b/src/assets/image/search-banner/image (55).jpg deleted file mode 100644 index d9126f3..0000000 Binary files a/src/assets/image/search-banner/image (55).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (6).jpg b/src/assets/image/search-banner/image (6).jpg deleted file mode 100644 index 0091cf7..0000000 Binary files a/src/assets/image/search-banner/image (6).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (7).jpg b/src/assets/image/search-banner/image (7).jpg deleted file mode 100644 index 0af21bc..0000000 Binary files a/src/assets/image/search-banner/image (7).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (8).jpg b/src/assets/image/search-banner/image (8).jpg deleted file mode 100644 index 794c939..0000000 Binary files a/src/assets/image/search-banner/image (8).jpg and /dev/null differ diff --git a/src/assets/image/search-banner/image (9).jpg b/src/assets/image/search-banner/image (9).jpg deleted file mode 100644 index 043d54e..0000000 Binary files a/src/assets/image/search-banner/image (9).jpg and /dev/null differ diff --git a/src/components/AboutArtist/AboutArtist.module.scss b/src/components/AboutArtist/AboutArtist.module.scss new file mode 100644 index 0000000..bc20d5c --- /dev/null +++ b/src/components/AboutArtist/AboutArtist.module.scss @@ -0,0 +1,80 @@ +@import '../../scss/variable'; +@import '../../scss/mixin'; + +.wrapper { + padding-inline: $col-gap; + margin: 12px 0; +} + +.title { + h2 { + margin: 0; + font-size: 24px; + color: $white; + } + margin: 8px 0; +} + +.body { + background-position: center; + background-repeat: no-repeat; + background-size: cover; + height: 516px; + width: min(800px, 100%); + border-radius: 8px; + display: flex; + align-items: flex-end; + transform: scale(1); + transform-origin: center; + transition: all 0.25s ease; + + &:hover { + transform: scale(1.01); + } +} + +.text-content { + width: 80%; + padding: 40px; + + .monthly-listener { + font-size: 16px; + margin: 8px 0; + font-weight: 700; + } + + .desc { + color: $white; + font-size: 16px; + @include text-line-clamp(3); + line-height: 1.3; + text-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); + + a { + color: $white; + font-weight: 700; + + &:hover { + text-decoration: underline; + } + } + } +} + +.playing-view { + .body { + height: 270px !important; + width: 100% !important; + flex: 1; + } + + .text-content { + width: 100% !important; + padding: 16px 16px 26px !important; + + .desc { + font-size: 14px; + @include text-line-clamp(2); + } + } +} diff --git a/src/components/AboutArtist/AboutArtist.tsx b/src/components/AboutArtist/AboutArtist.tsx new file mode 100644 index 0000000..003021c --- /dev/null +++ b/src/components/AboutArtist/AboutArtist.tsx @@ -0,0 +1,60 @@ +import { unicodeDecoder } from '@/utils' +import classNames from 'classnames/bind' +import { FC, memo, useContext } from 'react' +import styles from './AboutArtist.module.scss' +import { ArtistContext } from '@/contexts/ArtistContext' + +const cx = classNames.bind(styles) + +interface AboutArtistProps { + stats?: any + profile?: any + visuals?: any + isLoading?: boolean + aboutImg?: string + inclHeader?: boolean + type?: 'default' | 'playing-view' +} + +const AboutArtist: FC = ({ + profile, + stats, + isLoading, + aboutImg, + inclHeader = true, + type = 'default', +}) => { + const desc = unicodeDecoder(profile?.bio) + const { setModalOpen } = useContext(ArtistContext) + + return ( +
+ {inclHeader && ( +
+

About

+
+ )} +
setModalOpen(true)} + > +
+ {!isLoading && ( + <> +
+ {stats?.monthlyListeners?.toLocaleString()} monthly listeners +
+ + + )} +
+
+
+ ) +} + +export default memo(AboutArtist) diff --git a/src/components/AboutShow/AboutShow.module.scss b/src/components/AboutShow/AboutShow.module.scss new file mode 100644 index 0000000..91dc27c --- /dev/null +++ b/src/components/AboutShow/AboutShow.module.scss @@ -0,0 +1,48 @@ +@import '../../scss/variable'; +@import '../../scss/mixin'; + +.about-show-wrapper { + display: flex; + flex-direction: column; +} + +.title { + font-size: 24px; + padding: 16px 0; + margin: 0; +} + +.content { + overflow: hidden; + font-size: 16px; + color: $text-neutral; + line-height: 1.5; + margin-bottom: 24px; + position: relative; + + + + a { + color: $text-neutral; + font-weight: 700; + + &:hover { + text-decoration: underline; + } + } +} + +.expand-btn { + button { + @include reset-button; + background-color: transparent; + font-size: 16px; + color: $white; + font-weight: 700; + cursor: pointer; + } +} + +.expanded { + @include text-line-clamp(5); +} diff --git a/src/components/AboutShow/AboutShow.tsx b/src/components/AboutShow/AboutShow.tsx new file mode 100644 index 0000000..4c22932 --- /dev/null +++ b/src/components/AboutShow/AboutShow.tsx @@ -0,0 +1,40 @@ +import { useEllipsisVertical } from '@/hooks' +import classNames from 'classnames/bind' +import { FC, memo, useRef, useState } from 'react' +import Skeleton from 'react-loading-skeleton' +import styles from './AboutShow.module.scss' + +const cx = classNames.bind(styles) + +interface AboutShowProps { + htmlDesc?: string + isLoading?: boolean +} + +const AboutShow: FC = ({ htmlDesc, isLoading }) => { + const [isExpanded, setExpanded] = useState(false) + + const descRef = useRef() + + const isEllipsisActive = useEllipsisVertical(descRef.current) + + return ( +
+

+ {!isLoading ? 'About' : } +

+
+
+
+ {isEllipsisActive && ( +
+ +
+ )} +
+ ) +} + +export default memo(AboutShow) diff --git a/src/components/Alert/Alert.module.scss b/src/components/Alert/Alert.module.scss new file mode 100644 index 0000000..ab1a8c1 --- /dev/null +++ b/src/components/Alert/Alert.module.scss @@ -0,0 +1,76 @@ +@import '../../scss/variable'; + +.wrapper { + background-color: $bg-base; + height: 100vh; + width: 100vw; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + position: absolute; + top: 0; + left: 0; + z-index: 99999; +} + +.logo { + height: 60px; + width: 100%; + background-position: center; + background-repeat: no-repeat; + background-size: contain; +} + +.body { + display: flex; + flex-direction: column; + align-items: center; + padding: 40px; + + &__heading { + font-size: 48px; + font-weight: 700; + letter-spacing: -2px; + margin: 4px 0 16px; + } + + &__sub-heading { + font-size: 16px; + color: $text-subdued; + margin: 0 0 40px; + } + + &__home-btn { + font-size: 16px; + font-weight: 700; + text-decoration: none; + background: #fff; + border: 1px solid #878787; + border-radius: 48px; + color: #000; + display: inline-block; + line-height: 24px; + margin-bottom: 36px; + padding: 12px 32px; + text-align: center; + white-space: nowrap; + margin: 0 0 36px; + + &:hover { + transform: scale(1.04); + } + } + + &__help { + font-size: 16px; + color: #fff; + display: block; + font-weight: 700; + text-decoration: none; + + &:hover { + text-decoration: underline; + } + } +} diff --git a/src/components/Alert/Alert.tsx b/src/components/Alert/Alert.tsx new file mode 100644 index 0000000..9e78d71 --- /dev/null +++ b/src/components/Alert/Alert.tsx @@ -0,0 +1,62 @@ +import React, { useMemo } from 'react' +import styles from './Alert.module.scss' +import classNames from 'classnames/bind' +import logoImage from '@/assets/image/logo/logo.svg' +import { useDocumentTitle } from 'usehooks-ts' + +const cx = classNames.bind(styles) + +interface AlertProps { + type?: 'notfound' | 'wrong' | 'noSupportDevice' +} + +const Alert: React.FC = (props) => { + const { type = 'notfound' } = props + + const { documentTitle, message } = useMemo(() => { + switch (type) { + case 'notfound': + return { + documentTitle: 'Page not found', + message: `We can't seem to find the page you are looking for.`, + } + case 'wrong': + return { + documentTitle: 'Oops!', + message: `Sorry, we couldn't complete your request.\n Please try refreshing this page or contact us.`, + } + case 'noSupportDevice': + return { + documentTitle: 'Unsupported device!', + message: 'Desktop supported only!', + } + } + }, [type]) + + useDocumentTitle(documentTitle) + return ( +
+
+
+

+ {type === 'notfound' ? 'Page not found' : 'Oops! Something went wrong'} +

+

{message}

+ {type !== 'noSupportDevice' && ( + + Home + + )} + + Help + +
+
+ ) +} + +export default Alert diff --git a/src/components/ArtistBanner/ArtistBanner.module.scss b/src/components/ArtistBanner/ArtistBanner.module.scss new file mode 100644 index 0000000..156cbd9 --- /dev/null +++ b/src/components/ArtistBanner/ArtistBanner.module.scss @@ -0,0 +1,98 @@ +@import '../../scss/variable'; +@import '../../scss/mixin'; + +.wrapper { + position: relative; + height: max(40vh, 330px); + display: flex; + flex-direction: column; + justify-content: flex-end; + padding: 0 24px 24px; + margin-top: -$navbar-height; + background-color: transparent; +} + +.blur { + width: 100%; + height: 100%; + position: absolute; + top: 0; + right: 0; + background: linear-gradient(transparent 0, rgba(0, 0, 0, .5) 100%), $bg-noise; + z-index: 1; + background-color: transparent; +} + +.main { + display: flex; + transform: translateZ(10px); + z-index: 7; + align-items: flex-end; + gap: $col-gap; +} + + +.avatar { + height: 232px; + aspect-ratio: 1 / 1; + overflow: hidden; + border-radius: 50%; + box-shadow: 0 4px 60px rgba(0, 0, 0, .5); + + img { + height: 100%; + width: 100%; + object-fit: cover; + } +} + +.info { + display: flex; + flex-direction: column; + + .verified { + display: flex; + align-items: center; + gap: 8px; + font-size: 14px; + + .icon { + color: #3d91f4; + position: relative; + width: 22px; + + .check-white { + position: absolute; + width: 12px; + height: 12px; + background-color: $white; + z-index: 0; + top: -6px; + right: 4px; + } + + svg { + position: absolute; + z-index: 2; + top: -12px; + } + } + } + + .name { + font-size: 96px; + margin: 28px 0 22px; + letter-spacing: -2px; + line-height: 1.2; + @include text-line-clamp(2); + } + + .monthly-listener { + font-size: 16px; + margin: 8px 0; + } +} + +.no-header-img { + height: clamp(340px, 30vh, 400px) !important; +} \ No newline at end of file diff --git a/src/components/ArtistBanner/ArtistBanner.tsx b/src/components/ArtistBanner/ArtistBanner.tsx new file mode 100644 index 0000000..40075ae --- /dev/null +++ b/src/components/ArtistBanner/ArtistBanner.tsx @@ -0,0 +1,73 @@ +import { Verified } from '@/assets/icons' +import classNames from 'classnames/bind' +import { FC } from 'react' +import styles from './ArtistBanner.module.scss' +import { Image } from '../UIs' + +const cx = classNames.bind(styles) + +interface ArtistBannerProps { + name?: string + avatar?: string + followerNumber?: number + dominantColor?: string + monthlyListeners?: number + bgBannerOpacity?: number + isVerified?: boolean + inclHeaderImg?: boolean + isLoading?: boolean +} + +const ArtistBanner: FC = (props) => { + const { + name, + monthlyListeners, + dominantColor, + bgBannerOpacity, + isVerified, + inclHeaderImg, + avatar, + isLoading, + } = props + + return ( +
+ {!isLoading && ( +
+ {!inclHeaderImg && ( +
+ {/* avt */} + avt +
+ )} +
+ {isVerified && ( +
+ + +
+
+ Verified Artist +
+ )} +

{name}

+ {!isLoading && ( + + {monthlyListeners?.toLocaleString()} monthly listeners + + )} +
+
+ )} +
+
+ ) +} + +export default ArtistBanner diff --git a/src/components/ArtistModal/ArtistModal.module.scss b/src/components/ArtistModal/ArtistModal.module.scss new file mode 100644 index 0000000..731e487 --- /dev/null +++ b/src/components/ArtistModal/ArtistModal.module.scss @@ -0,0 +1,132 @@ +@import '../../scss/mixin'; +@import '../../scss/variable'; + +.wrapper { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 99; + background-color: rgba($color: #000000, $alpha: 0.7); + transition: all 0.4s ease; + @include item-center; +} + +.close-btn { + position: absolute; + z-index: 9999; + top: 16px; + right: 16px; + opacity: 0.7; + + button { + @include button-icon(32px, $bg-base, $bg-base); + color: $white; + } + + &:hover { + opacity: 1; + } +} + +.modal { + width: clamp(500px, 40vw, 768px); + height: min(750px, 70vh); + border-radius: $panel-border-radius; + overflow: hidden; + position: relative; + transform-origin: bottom center; + + animation: zoomOut 0.4s ease; +} + +.main { + overflow: hidden; + overflow-y: scroll; + width: 100%; + height: 100%; + + &::-webkit-scrollbar { + display: none; + } +} + +.img { + height: 56.25%; + + img { + width: 100%; + height: 100%; + object-fit: cover; + } +} + +.body { + background-color: $bg-base; + display: flex; + padding: 40px; +} + +.right { + .bio { + color: $text-neutral; + font-size: 16px; + margin: 0; + + a { + color: $text-neutral; + font-weight: 700; + + &:hover { + text-decoration: underline; + } + } + } +} + +.left { + min-width: 170px; + display: flex; + flex-direction: column; + + .stats-listener { + display: flex; + flex-direction: column; + margin: 0 40px 30px 0; + + .quantity { + font-size: 32px; + color: $white; + font-weight: 700; + margin: 14px 0; + } + + .type { + font-size: 14px; + color: $text-neutral; + } + } +} + +.close { + opacity: 0; + + .modal { + transition: all 0.3s ease; + transform: scale(0.4); + opacity: 0; + } +} + +@keyframes zoomOut { + 0% { + transform: scale(0.4); + opacity: 0; + } + + 100% { + transform: scale(1); + opacity: 1; + } +} diff --git a/src/components/ArtistModal/ArtistModal.tsx b/src/components/ArtistModal/ArtistModal.tsx new file mode 100644 index 0000000..00b3a2d --- /dev/null +++ b/src/components/ArtistModal/ArtistModal.tsx @@ -0,0 +1,93 @@ +import { CloseIcon } from '@/assets/icons' +import classNames from 'classnames/bind' +import { FC, useEffect, useRef, useState } from 'react' +import ArtistCityStats from '../UIs/ArtistCityStats/ArtistCityStats' +import styles from './ArtistModal.module.scss' +import { ArtistProfile, ArtistStats } from '@/types/artist' + +const cx = classNames.bind(styles) + +interface ArtistModalProps { + profile: ArtistProfile + aboutImg: string + stats: ArtistStats + setModalOpen: React.Dispatch> +} + +const ArtistModal: FC = ({ + profile, + aboutImg, + stats, + setModalOpen, +}) => { + const timeoutId = useRef() + const [isClose, setClose] = useState(false) + + const handleKeyPress = (e: any) => { + if (e.code === 'Escape') { + handleClose() + } + } + + useEffect(() => { + document.addEventListener('keydown', handleKeyPress) + + return () => { + clearTimeout(timeoutId.current) + document.removeEventListener('keypress', handleKeyPress) + } + }, []) + + const handleClose = () => { + setClose(true) + timeoutId.current = setTimeout(() => { + setModalOpen(false) + }, 400) + } + + console.log(profile) + + return ( +
+
e.stopPropagation()}> +
+ +
+
+
+ {profile?.name} +
+
+
+
+
{stats?.followers?.toLocaleString()}
+ Followers +
+
+
+ {stats?.monthlyListeners?.toLocaleString()} +
+ Monthly Listeners +
+ {stats?.topCities?.items?.map((item) => ( + + ))} +
+
+

+
+
+
+
+
+ ) +} + +export default ArtistModal diff --git a/types.ts b/src/components/ArtistModal/ExternalLinkItem/ExternalLinkItem.module.scss similarity index 100% rename from types.ts rename to src/components/ArtistModal/ExternalLinkItem/ExternalLinkItem.module.scss diff --git a/src/components/ArtistModal/ExternalLinkItem/ExternalLinkItem.tsx b/src/components/ArtistModal/ExternalLinkItem/ExternalLinkItem.tsx new file mode 100644 index 0000000..e96f43e --- /dev/null +++ b/src/components/ArtistModal/ExternalLinkItem/ExternalLinkItem.tsx @@ -0,0 +1,35 @@ +// import {FC, useMemo} from 'react' +// import styles from './ExternalLinkItem.module.scss' +// import classNames from 'classnames/bind' +// import {IoLogoFacebook, IoLogoInstagram, IoLogoTwitter } from 'react-icons/io' +// import {BiLinkExternal} from 'react-icons/bi' +// import { ExternalLink } from '@/types/artist' + +// const cx = classNames.bind(styles) + + + +// const ExternalLinkItem: FC = ({name, url}) => { + + +// const icons = useMemo(() => { +// return { +// 'FACEBOOK': IoLogoFacebook, +// 'INSTAGRAM': IoLogoInstagram, +// 'TWITTER': IoLogoTwitter, +// 'WIKIPEDIA': BiLinkExternal, +// } +// }, []) + + + + +// return ( +//
+//
+//
+//
+// ) +// } + +// export default ExternalLinkItem \ No newline at end of file diff --git a/src/components/AudioPlayer/AudioPlayer.module.scss b/src/components/AudioPlayer/AudioPlayer.module.scss new file mode 100644 index 0000000..d55050d --- /dev/null +++ b/src/components/AudioPlayer/AudioPlayer.module.scss @@ -0,0 +1,20 @@ +@import '../../scss/variable'; + +.wrapper { + height: 100%; + background-color: $black; + display: flex; + flex-direction: row; + padding: 8px; +} + +.left, +.right { + flex: 3; + width: 30%; +} + +.center { + flex: 4; + width: 40%; +} diff --git a/src/components/AudioPlayer/AudioPlayer.tsx b/src/components/AudioPlayer/AudioPlayer.tsx new file mode 100644 index 0000000..c69889c --- /dev/null +++ b/src/components/AudioPlayer/AudioPlayer.tsx @@ -0,0 +1,29 @@ +import classNames from 'classnames/bind' +import { FC, useContext } from 'react' +import styles from './AudioPlayer.module.scss' +import Left from './Left/Left' +import PlayerControl from './PlayerControl/PlayerControl' +import { PlayerContext } from '@/contexts/PlayerContext' +import Right from './Right/Right' + +const cx = classNames.bind(styles) + +const AudioPlayer: FC = () => { + const { currentTrack } = useContext(PlayerContext) + + return ( +
+
{currentTrack && }
+ +
+ +
+ +
+ +
+
+ ) +} + +export default AudioPlayer diff --git a/src/components/AudioPlayer/Left/Left.module.scss b/src/components/AudioPlayer/Left/Left.module.scss new file mode 100644 index 0000000..1e3a6b8 --- /dev/null +++ b/src/components/AudioPlayer/Left/Left.module.scss @@ -0,0 +1,94 @@ +@import '../../../scss/variable'; +@import '../../../scss/mixin'; + +.wrapper { + min-width: 180px; + display: flex; + flex-direction: row; + gap: 16px; + overflow: hidden; + justify-content: flex-start; + overflow: hidden; +} + +.thumb { + height: 56px; + width: 56px; + aspect-ratio: 1 / 1; + border-radius: 4px; + overflow: hidden; + + .default-thumb { + @include default-thumb; + } + + img { + height: 100%; + width: 100%; + object-fit: cover; + } +} + +.body { + // flex: 1; + overflow: hidden; + max-width: calc(100% - 148px); + + & > div { + height: 100%; + display: flex; + flex-direction: column; + padding: 8px 0; + justify-content: space-between; + overflow: hidden; + } + + .name { + font-size: 14px; + font-weight: 700; + cursor: pointer; + @include text-in-one-line; + position: relative; + + *::-webkit-scrollbar { + display: none; + } + + .pivot { + color: transparent; + position: absolute; + opacity: 0; + z-index: -99; + } + + span { + margin-right: 40px; + } + + a { + color: $white; + + &:hover { + text-decoration: underline; + } + } + } + + .artists { + @include text-in-one-line; + display: flex; + overflow: hidden; + } +} + +.icon { + flex: 1; + display: flex; + align-items: center; + color: hsla(0, 0%, 100%, 0.7); + margin-inline: 4px 40px; + + &:hover { + color: $white; + } +} diff --git a/src/components/AudioPlayer/Left/Left.tsx b/src/components/AudioPlayer/Left/Left.tsx new file mode 100644 index 0000000..75d3d71 --- /dev/null +++ b/src/components/AudioPlayer/Left/Left.tsx @@ -0,0 +1,89 @@ +import { HeartIcon, MusicNote } from '@/assets/icons' +import { Image, SubTitle } from '@/components/UIs' +import { PlayerContext } from '@/contexts/PlayerContext' +import { useEllipsisHorizontal } from '@/hooks' +import classNames from 'classnames/bind' +import { FC, useContext, useMemo, useRef } from 'react' +import Marquee from 'react-fast-marquee' +import Skeleton from 'react-loading-skeleton' +import { Link } from 'react-router-dom' +import styles from './Left.module.scss' + +const cx = classNames.bind(styles) + +const Left: FC = () => { + const { playBarData, playingType } = useContext(PlayerContext) + const isLoading = useMemo( + () => Boolean(!playBarData?.trackName), + [playBarData?.trackName] + ) + + const trackNameRef = useRef() + const isEllipsisActive = useEllipsisHorizontal( + trackNameRef.current, + playBarData?.trackName + ) + + return ( +
+
+ {playBarData?.thumb ? ( + {playBarData?.trackName} + ) : ( +
+ +
+ )} +
+
+
+
+ {playBarData?.trackName} + {!isLoading ? ( + isEllipsisActive ? ( + + + {playBarData?.trackName} + + + ) : ( + + {playBarData?.trackName} + + ) + ) : ( + + )} +
+
+ {!isLoading ? ( + + ) : ( + + )} +
+
+
+
{!isLoading && }
+
+ ) +} + +export default Left diff --git a/src/components/AudioPlayer/PlayerControl/PlayerControl.module.scss b/src/components/AudioPlayer/PlayerControl/PlayerControl.module.scss new file mode 100644 index 0000000..72a4654 --- /dev/null +++ b/src/components/AudioPlayer/PlayerControl/PlayerControl.module.scss @@ -0,0 +1,60 @@ +@import '../../../scss/variable'; +@import '../../../scss/mixin'; + +.wrapper { + display: flex; + flex-direction: column; +} + +.buttons { + display: flex; + justify-content: center; + gap: 12px; + align-items: center; +} + +.btn { + @include reset-button; + background-color: transparent; + border: none; + color: hsla(0, 0%, 100%, 0.7); + cursor: pointer; + + &:hover { + color: $white; + } +} + +.playback-bar { + margin-top: 12px; + display: flex; + justify-content: space-between; + align-items: center; + gap: 8px; +} + +.playback-position, +.playback-duration { + width: 40px; + color: $text-subdued; + font-size: 11px; + line-height: 100%; + display: flex; + align-items: center; + justify-content: center; +} + +.range { + flex: 1; +} + +.active { + @include button-active; + + color: $secondary !important; + position: relative; + + &::after { + bottom: -3px; + } +} diff --git a/src/components/AudioPlayer/PlayerControl/PlayerControl.tsx b/src/components/AudioPlayer/PlayerControl/PlayerControl.tsx new file mode 100644 index 0000000..11da4d9 --- /dev/null +++ b/src/components/AudioPlayer/PlayerControl/PlayerControl.tsx @@ -0,0 +1,189 @@ +import { RepeatIcon, ShuffleIcon, SkipBackIcon, SkipForwardIcon } from '@/assets/icons' +import { PlayButton, Range } from '@/components/UIs' +import { PlayerContext } from '@/contexts/PlayerContext' +import durationConvertor from '@/utils/durationConvertor' +import classNames from 'classnames/bind' +import React, { FC, useContext, useEffect, useState } from 'react' +import styles from './PlayerControl.module.scss' +import { Tooltip } from 'antd' + +const cx = classNames.bind(styles) + +const PlayerControl: FC = () => { + const { + currentTrack, + intervalIdRef, + isPlaying, + duration, + audioRef, + isReady, + userClicked, + isShuffle, + isRepeat, + isBtnClickable, + handlePlay, + handlePause, + setCurrentTime, + handleForward, + handleBack, + setUserClicked, + setShuffle, + setRepeat, + } = useContext(PlayerContext) + const [trackProcess, setTrackProcess] = useState(audioRef?.current?.currentTime) + + const startTimer = () => { + clearInterval(intervalIdRef?.current) + intervalIdRef.current = setInterval(() => { + if (!audioRef?.current?.paused) { + setTrackProcess((prev) => +prev + 1) + } + }, 1000) + } + + useEffect(() => { + setTrackProcess(0) + clearInterval(intervalIdRef?.current) + }, [currentTrack]) + + useEffect(() => { + // console.log(isPlaying) + if (isPlaying) { + startTimer() + handlePlay() + } + }, [isPlaying]) + + const handleRangeChange = (e: React.ChangeEvent) => { + clearInterval(intervalIdRef?.current) + setTrackProcess(+e.target.value) + } + + const handleMouseUp = () => { + setCurrentTime(trackProcess) + startTimer() + } + + if (audioRef?.current) { + audioRef.current.onended = () => { + if (isRepeat) { + // console.log('repeated') + setCurrentTime(0) + setTrackProcess(0) + startTimer() + handlePlay() + } else { + handleForward() + } + } + } + + const handlePlayBtn = () => { + // console.log(duration, isPlaying) + if (!duration && !isReady) return + if (!userClicked) setUserClicked(true) + if (isPlaying) { + clearInterval(intervalIdRef?.current) + handlePause() + } else { + setTrackProcess(audioRef?.current?.currentTime) + startTimer() + handlePlay() + } + } + + //detect the click event on the keyboard: pause, play, back, forward,... + + navigator.mediaSession.setActionHandler('play', () => { + handlePlayBtn() + }) + + navigator.mediaSession.setActionHandler('pause', () => { + handlePlayBtn() + }) + + navigator.mediaSession.setActionHandler('stop', () => { + handlePlayBtn() + }) + + navigator.mediaSession.setActionHandler('previoustrack', () => { + handleBack() + }) + + navigator.mediaSession.setActionHandler('nexttrack', () => { + handleForward() + }) + + return ( +
+
+ + + + + + + +
isBtnClickable && handlePlayBtn()} className={cx('btn')}> + +
+
+ + + + + + +
+
+
+ {durationConvertor({ milliseconds: +trackProcess * 1000 })} +
+
+ +
+
+ {durationConvertor({ milliseconds: duration ? duration * 1000 : 0 })} +
+
+
+ ) +} + +export default PlayerControl diff --git a/src/components/AudioPlayer/Right/Right.module.scss b/src/components/AudioPlayer/Right/Right.module.scss new file mode 100644 index 0000000..20b1b40 --- /dev/null +++ b/src/components/AudioPlayer/Right/Right.module.scss @@ -0,0 +1,34 @@ +@import '../../../scss/variable'; +@import '../../../scss/mixin'; + +.wrapper { + height: 100%; + display: flex; + flex-direction: row; + justify-content: flex-end; + align-items: center; + padding-right: 16px; + + .btn { + background-color: transparent; + color: $text-subdued; + @include reset-button; + padding: 8px; + cursor: pointer; + + &:hover { + color: $white; + } + } +} + +.volume { + display: flex; + flex-direction: row; + align-items: center; + width: 125px; +} + +.active { + @include button-active; +} diff --git a/src/components/AudioPlayer/Right/Right.tsx b/src/components/AudioPlayer/Right/Right.tsx new file mode 100644 index 0000000..510d9f2 --- /dev/null +++ b/src/components/AudioPlayer/Right/Right.tsx @@ -0,0 +1,127 @@ +import { PlayingViewIcon, QueueIcon, SoundIcon, SoundLevel } from '@/assets/icons' +import { Range } from '@/components/UIs' +import { PlayerContext } from '@/contexts/PlayerContext' +import { Tooltip } from 'antd' +import classNames from 'classnames/bind' +import { FC, useCallback, useContext, useEffect, useRef, useState } from 'react' +import styles from './Right.module.scss' +import { useLocation, useNavigate } from 'react-router-dom' +import { AppContext } from '@/App' + +const cx = classNames.bind(styles) + +const Right: FC = () => { + const { audioRef, isBtnClickable, playingType } = useContext(PlayerContext) + const { setPlayingViewShowed, isPlayingViewShowed } = useContext(AppContext) + const [volume, setVolume] = useState( + JSON.parse(localStorage.getItem('spotify_volume') as string) ?? 1 + ) + const [volumeLevel, setVolumeLevel] = useState('high') + const prevVolume = useRef(volume) + + const { pathname, key } = useLocation() + const navigate = useNavigate() + + useEffect(() => { + if (playingType === 'show') { + setPlayingViewShowed(false) + } + }, [playingType]) + + const volumeLevelFilter = useCallback((value: number): SoundLevel => { + if (+value === 0) { + return 'mute' + } else if (+value < 0.33) { + return 'low' + } else if (+value < 0.66) { + return 'medium' + } else { + return 'high' + } + }, []) + + const handleVolumeChange = (e: React.ChangeEvent) => { + const volumeValue = Number(e.target.value) + localStorage.setItem('spotify_volume', JSON.stringify(volumeValue)) + audioRef.current.volume = volumeValue + setVolumeLevel(volumeLevelFilter(volumeValue)) + setVolume(volumeValue) + } + + const handleMouseUp = () => { + return + } + + const handleSoundClicked = () => { + if (volumeLevel === 'mute') { + audioRef.current.volume = prevVolume.current + setVolume(prevVolume.current) + setVolumeLevel(volumeLevelFilter(prevVolume.current)) + } else { + prevVolume.current = volume + audioRef.current.volume = 0 + setVolume(0) + setVolumeLevel('mute') + } + } + + const handleClickQueueBtn = () => { + if (pathname !== '/queue') { + navigate('/queue') + } else if (key !== 'default') { + navigate(-1) + } else { + navigate('/') + } + } + + const handleClickPlayingView = () => { + if (playingType === 'show') return + if (isBtnClickable) { + setPlayingViewShowed((prev) => !prev) + } + } + + return ( +
+ + + + + + +
+ + + + +
+
+ ) +} + +export default Right diff --git a/src/components/AudioPlayerF.tsx b/src/components/AudioPlayerF.tsx new file mode 100644 index 0000000..6ffe578 --- /dev/null +++ b/src/components/AudioPlayerF.tsx @@ -0,0 +1,16 @@ +import { PlayerContext } from '@/contexts/PlayerContext' +import { useContext } from 'react' + +interface AudioPlayerFParams { + audioUrl: string +} + +const AudioPlayerF = ({ audioUrl }: AudioPlayerFParams) => { + const { audioRef } = useContext(PlayerContext) + + audioRef.current = new Audio(audioUrl) + + return
+} + +export default AudioPlayerF diff --git a/src/components/Discography/Discography.module.scss b/src/components/Discography/Discography.module.scss new file mode 100644 index 0000000..136736d --- /dev/null +++ b/src/components/Discography/Discography.module.scss @@ -0,0 +1,42 @@ +@import '../../scss/variable'; +@import '../../scss/mixin'; + +.wrapper { + padding-inline: $col-gap; + margin-top: 32px; +} + +.title { + + + h2 { + margin: 0; + font-size: 24px; + } +} + +.selection { + display: flex; + gap: 10px; + padding: 7px 0 10px; + margin: 14px 0; + background-color: $bg-base; + min-height: 52px; + + + .btn { + @include button-text(4px 12px, $bg-button, $bg-button-highlight); + color: $white; + font-size: 14px; + border-radius: 32px; + } + + .active { + color: $black; + @include button-text(4px 12px, $white, $white); + } +} + +.section { + margin-inline: -24px; +} \ No newline at end of file diff --git a/src/components/Discography/Discography.tsx b/src/components/Discography/Discography.tsx new file mode 100644 index 0000000..6569690 --- /dev/null +++ b/src/components/Discography/Discography.tsx @@ -0,0 +1,76 @@ +import classNames from 'classnames/bind' +import { FC, useMemo, useState } from 'react' +import { Section } from '..' +import styles from './Discography.module.scss' + +const cx = classNames.bind(styles) + +interface DiscographyProps { + data: any +} + +const Discography: FC = ({ data }) => { + const [category, setCategory] = useState('popularReleases') + + const selection = useMemo( + () => [ + { + key: 'popularReleases', + display: 'Popular releases', + active: 'popularReleases' === category, + isExist: Boolean(data?.popularReleases?.length), + }, + + { + key: 'albums', + display: 'Albums', + active: 'albums' === category, + isExist: Boolean(data?.albums?.length), + }, + { + key: 'singles', + display: 'Singles', + active: 'singles' === category, + isExist: Boolean(data?.singles?.length), + }, + ], + [category, data] + ) + + return ( +
+
+

Discography

+
+
+ {selection + .filter((item) => item.isExist) + .map((item) => ( + + ))} +
+
+
+
+
+ ) +} + +export default Discography diff --git a/src/components/Footer/Footer.module.scss b/src/components/Footer/Footer.module.scss new file mode 100644 index 0000000..c84bfc3 --- /dev/null +++ b/src/components/Footer/Footer.module.scss @@ -0,0 +1,66 @@ +@import '../../scss/mixin'; +@import '../../scss/variable'; + +.footer { + display: flex; + flex-direction: column; + padding: 8px 32px 40px; + margin-top: 40px; + + &__top { + display: flex; + justify-content: space-between; + margin-top: 32px; + + &-links { + display: flex; + flex-wrap: wrap; + } + + &-social-links { + display: flex; + column-gap: 16px; + + a { + @include button-icon(40px, rgb(41, 41, 41), rgb(114, 114, 114)); + + .icon { + color: $white; + font-size: 18px; + } + } + } + + } + + + &__bottom { + display: flex; + justify-content: space-between; + align-items: center; + padding-top: 26px; + border-top: 1px solid rgba($color: #fff, $alpha: .1); + + + &-links { + display: flex; + column-gap: 16px; + + &-item { + font-size: 14px; + color: $text-subdued; + text-decoration: none; + + &:hover { + color: $white; + } + } + } + + + &-copyright { + color: $text-subdued; + font-size: 14px; + } + } +} \ No newline at end of file diff --git a/src/components/Footer/Footer.tsx b/src/components/Footer/Footer.tsx new file mode 100644 index 0000000..d6cf29e --- /dev/null +++ b/src/components/Footer/Footer.tsx @@ -0,0 +1,45 @@ +import { bottomLinks, socialNetworkLinks, topLinkGroups } from '@/constants' +import classNames from 'classnames/bind' +import { FC, memo } from 'react' +import styles from './Footer.module.scss' +import LinkGroup from './LinkGroup/LinkGroup' + +const cx = classNames.bind(styles) + +const Footer: FC = () => { + return ( +
+ + +
+ ) +} + +export default memo(Footer) diff --git a/src/components/Footer/LinkGroup/LinkGroup.module.scss b/src/components/Footer/LinkGroup/LinkGroup.module.scss new file mode 100644 index 0000000..e8d2970 --- /dev/null +++ b/src/components/Footer/LinkGroup/LinkGroup.module.scss @@ -0,0 +1,33 @@ +@import '../../../scss/variable'; + +.wrapper { + display: flex; + flex-direction: column; + margin: 0 24px 32px 0; + min-width: 170px; + + .title { + font-size: 16px; + font-weight: 700; + color: $white; + } + + .list { + display: flex; + flex-direction: column; + color: $text-subdued; + + a { + color: inherit; + text-decoration: none; + font-size: 16px; + margin-top: 8px; + margin-bottom: 8px; + + &:hover { + color: $white; + text-decoration: underline; + } + } + } +} \ No newline at end of file diff --git a/src/components/Footer/LinkGroup/LinkGroup.tsx b/src/components/Footer/LinkGroup/LinkGroup.tsx new file mode 100644 index 0000000..4df8b45 --- /dev/null +++ b/src/components/Footer/LinkGroup/LinkGroup.tsx @@ -0,0 +1,33 @@ +import React from 'react' +import styles from './LinkGroup.module.scss' +import classNames from 'classnames/bind' + +const cx = classNames.bind(styles) + +interface LinkGroupProps { + groupLink: { + title: string + links: { + title: string + href: string + dataAttributes: { 'data-ga-category': string; 'data-ga-action': string } + }[] + } +} + +const LinkGroup: React.FC = ({ groupLink }) => { + return ( +
+

{groupLink.title}

+
+ {groupLink.links.map((item, index) => ( + + {item.title} + + ))} +
+
+ ) +} + +export default LinkGroup diff --git a/src/components/Greeting/Greeting.module.scss b/src/components/Greeting/Greeting.module.scss index dd0a43a..d493c44 100644 --- a/src/components/Greeting/Greeting.module.scss +++ b/src/components/Greeting/Greeting.module.scss @@ -2,7 +2,8 @@ @import '../../scss/breakpoint'; .body { - padding-top: 64px; + margin-top: -$navbar-height; + padding-top: $navbar-height; padding-inline: 24px; position: relative; font-family: CircularSp; @@ -13,6 +14,7 @@ .greet { font-size: 3.2rem; font-weight: 700; + min-height: 52px; p { margin: 0; @@ -26,11 +28,6 @@ grid-template: auto / repeat(3, 1fr); padding: 15px 0; font-weight: 700; - - // @include responsive(lg) { - // grid-template: auto / repeat(2, 1fr); - // } - } .songs-section-responsive { diff --git a/src/components/Greeting/Greeting.tsx b/src/components/Greeting/Greeting.tsx index 1a6b98b..e697471 100644 --- a/src/components/Greeting/Greeting.tsx +++ b/src/components/Greeting/Greeting.tsx @@ -1,8 +1,11 @@ +import { HomePageContext } from '@/contexts/HomePageContext' import { MainLayoutContext } from '@/contexts/MainLayoutContext' import classNames from 'classnames/bind' -import React, { FC, useContext, useEffect, useState } from 'react' +import React, { FC, memo, useContext, useEffect, useState } from 'react' +import Skeleton from 'react-loading-skeleton' import SongItemTag from '../SongItemTag/SongItemTag' import styles from './Greeting.module.scss' +import { ResponseSectionItem } from '@/types/section' const cx = classNames.bind(styles) @@ -13,20 +16,16 @@ interface GreetingProps { const Greeting: FC = (props) => { const { bgColor, setBgColor } = props + const [isLoading, setLoading] = useState(true) - const [initSongs, setInitSongs] = useState<[]>([]) - - const {width} = useContext(MainLayoutContext) + const { greetingAlbum } = useContext(HomePageContext) + const { width } = useContext(MainLayoutContext) useEffect(() => { - (async () => { - const response = await fetch('data/initSongs.json') - const data = await response.json() - - setInitSongs(data.tracks.items) - })() - }, []) + setBgColor('#e0e0e0') + setLoading(greetingAlbum?.length === 0) + }, [greetingAlbum]) const greeting = (): string => { const currentHour = new Date().getHours() @@ -38,27 +37,44 @@ const Greeting: FC = (props) => { return (
-

{greeting()}

+ {!isLoading ? ( +

{greeting()}

+ ) : ( + + )}
- {initSongs.slice(0, 6).map((item: any, index) => ( - - ))} + {!isLoading + ? greetingAlbum + ?.slice(0, 6) + .map((item: ResponseSectionItem, index) => ( + + )) + : Array(6) + .fill(0) + .map((item, index) => ( + + ))}
) } -export default Greeting +export default memo(Greeting) diff --git a/src/components/Header/ArtistList/ArtistList.module.scss b/src/components/Header/ArtistList/ArtistList.module.scss new file mode 100644 index 0000000..201712c --- /dev/null +++ b/src/components/Header/ArtistList/ArtistList.module.scss @@ -0,0 +1,21 @@ +@import '../../../scss/variable'; +@import '../../../scss/mixin'; + +.wrapper { + display: flex; + gap: 3px; + @include text-line-clamp(2); + + .name { + color: $text-neutral; + } + + .playlist { + font-size: 14px; + color: $white; + + &:hover { + text-decoration: underline; + } + } +} \ No newline at end of file diff --git a/src/components/Header/ArtistList/ArtistList.tsx b/src/components/Header/ArtistList/ArtistList.tsx new file mode 100644 index 0000000..c81352e --- /dev/null +++ b/src/components/Header/ArtistList/ArtistList.tsx @@ -0,0 +1,81 @@ +import classNames from 'classnames/bind' +import React, { Fragment } from 'react' +import { Link } from 'react-router-dom' +import styles from './ArtistList.module.scss' +import { ArtistData } from '@/types/artist' + +const cx = classNames.bind(styles) + +interface ArtistListProps { + data: ArtistData[] | null | string +} + +const ArtistList: React.FC = (props) => { + const { data } = props + if (typeof data === 'string') { + return
{data}
+ } + const renderData: any = [] + if (data) { + if (data.length === 1) { + renderData.push( + + {data[0]?.name} + + ) + } else if (data?.length === 2) { + renderData.push( + <> + + {data[0]?.name} + + {', '} + + {data[1]?.name} + + + ) + } else { + for (let i = 0; i < data.length - 2; i++) { + renderData.push( + + + {data[0]?.name} + + {', '} + + ) + } + renderData.push( + + + + {data[data.length - 2]?.name} + + + {' and '} + + ) + renderData.push( + + + {data[data?.length - 1]?.name} + + + ) + } + } + + + return ( +
+ {(renderData?.length && renderData) || data} +
+
+ ) +} + +export default ArtistList diff --git a/src/components/Header/Header.module.scss b/src/components/Header/Header.module.scss index b7079f0..4246db8 100644 --- a/src/components/Header/Header.module.scss +++ b/src/components/Header/Header.module.scss @@ -1,12 +1,180 @@ @import '../../scss/variable'; @import '../../scss/mixin'; -@import '../../scss/breakpoint'; -.header { +.wrapper { position: relative; - font-family: CircularSp; - font-weight: 700; + height: clamp(340px, 30vh, 400px); + color: $white; + margin-top: -64px; + padding: 0 24px 24px; + display: flex; + align-items: flex-end; transition: all 1s ease; - background-image: linear-gradient(0deg, rgba(0, 0, 0, 1), rgba(0, 0, 0, 0)) !important; - filter: brightness(.8); + filter: brightness(110%); + // background-image: linear-gradient(rgba(60, 60, 60, 0.6) 0, $bg-base 100%), $bg-noise !important; + background: linear-gradient(transparent 0, rgba(0, 0, 0, 0.5) 100%), $bg-noise; + // background-color: #fff; +} + +.body { + display: flex; + gap: 24px; + width: 100%; + // overflow: hidden; + + .img { + height: 232px; + min-width: 232px; + width: 232px; + box-shadow: 0 4px 60px rgba(0, 0, 0, 0.5); + overflow: hidden; + + span { + display: block; + width: 100%; + height: 100%; + } + + img { + object-fit: cover; + width: 100%; + height: 100%; + } + } + + .content { + //fix content overflow + overflow: hidden; + display: flex; + flex-direction: column; + justify-content: flex-end; + flex: 1; + + .skeleton { + display: flex; + flex-direction: column; + gap: 20px; + margin-bottom: 60px; + } + + .type { + font-size: 14px; + margin: 0; + font-weight: 700; + } + + .title { + font-size: 96px; + padding: 8px 0 8px; + @include text-in-one-line; + margin: 0 0 4px; + // @include text-shadow; + } + + .desc { + font-size: 14px; + color: hsla(0, 0%, 100%, 0.7); + margin-bottom: 8px; + @include text-line-clamp(2); + display: flex; + + .artist { + color: $white; + font-size: 14px; + } + + a { + color: hsla(0, 0%, 100%, 0.7); + + &:hover { + text-decoration: underline; + } + } + } + + .quantity { + font-size: 14px; + margin-top: 8px; + width: 100%; + display: flex; + align-items: center; + min-height: 24px; + + .artist { + font-size: 14px; + color: $white; + font-weight: 700; + max-width: 40%; + } + + .release-date { + } + + .logo { + height: 20px; + aspect-ratio: 1 / 1; + background-position: center; + background-repeat: no-repeat; + background-size: cover; + margin-right: 10px; + } + + .dot { + height: 4px; + aspect-ratio: 1 / 1; + background-color: #fff; + border-radius: 50%; + margin-inline: 5px; + } + + .text { + width: max-content; + } + } + } +} + +.show { + .img { + border-radius: 12px; + } + + .title { + font-size: 72px !important; + } + + .publisher { + color: $white; + + span { + font-size: 24px; + font-weight: 700; + } + } +} + +.underline { + &:hover { + text-decoration-line: underline !important; + text-decoration-thickness: 2px; + } +} + + +//------------------------------- + +.category-header { + width: 100%; + overflow: hidden; +} + + +.category-title { + font-size: 96px; + margin: 0; + color: $white; + margin-bottom: 6px; + letter-spacing: -3px; + + @include text-in-one-line; } diff --git a/src/components/Header/Header.tsx b/src/components/Header/Header.tsx index 7a99e1d..f75197c 100644 --- a/src/components/Header/Header.tsx +++ b/src/components/Header/Header.tsx @@ -1,62 +1,123 @@ -// import classNames from 'classnames/bind' -// import React, { useEffect, useState } from 'react' -// import { FaUser } from 'react-icons/fa' -// import { IoIosArrowBack, IoIosArrowForward } from 'react-icons/io' -// import SongItemTag from '../SongItemTag/SongItemTag' -// import styles from './Header.module.scss' -// import Greeting from '../Greeting/Greeting' -// import Navbar from '../Navbar/Navbar' +import logoImage from '@/assets/image/logo/logo.svg' +import { HeaderProps } from '@/types/others' +import { transformDomain } from '@/utils' +import classNames from 'classnames/bind' +import React, { memo } from 'react' +import Skeleton from 'react-loading-skeleton' +import { Link } from 'react-router-dom' +import { Image, SubTitle, ThumbDefault } from '../UIs' +import styles from './Header.module.scss' -// interface HeaderProps { -// children?: React.ReactNode -// } +const cx = classNames.bind(styles) -// interface Location { -// prev: string | null -// next: string | null -// } +//Header of Playlist page & Album page -// const cx = classNames.bind(styles) +const Header: React.FC = ({ + title, + thumbnail, + quantity, + bgColor, + desc, + isLoading, + type, + artists, + releaseDate, + isWhiteColor = false, + headerType, + publisher, + showName, + showId, +}) => { + return ( +
+ {headerType !== 'genre' ? ( +
+
+ {!isLoading ? ( + thumbnail ? ( + {title} + ) : ( + + ) + ) : ( + + )} +
+
+ {!isLoading ? ( + <> + {' '} +

+ {(type === 'album' && 'Album') || + (type === 'single' && 'Single') || + (type === 'compilation' && 'Compilation') || + (type === 'podcast' && 'Podcast') || + (type === 'episode' && 'Podcast Episode') || + type} +

+

+ {title} +

+
+ {/* */} +
+ {headerType === 'show' ? ( + +
+ {publisher || showName} +
+ + ) : ( +
+
+ {(type === 'album' || + type === 'single' || + type === 'compilation') && ( + <> +
+ {} +
{' '} +
{' '} +
+ {releaseDate?.slice(0, 4)} +
+ + )} +
+
{`${quantity || 0} songs`}
+
+ )} + + ) : ( +
+ + +
+ )} +
+
+ ) : ( +
+ {!isLoading ? ( +

{title}

+ ) : ( +
+ +
+ )} +
+ )} +
+
+ ) +} -// const Header: React.FC = (props) => { -// const [location, setLocation] = useState({ prev: null, next: null }) -// const [bgColor, setBgColor] = useState('#1ed760') - -// const [initSongs, setInitSongs] = useState<[]>([]) - - -// return ( -//
-// {/*
-//
-// -// -//
-//
-// -//
-//
*/} -// - -// -//
-// ) -// } - -// export default Header +export default memo(Header) diff --git a/src/components/Navbar/Navbar.module.scss b/src/components/Navbar/Navbar.module.scss index 3a1e6d5..58e1b47 100644 --- a/src/components/Navbar/Navbar.module.scss +++ b/src/components/Navbar/Navbar.module.scss @@ -1,14 +1,13 @@ @import '../../scss/variable'; @import '../../scss/mixin'; - .nav { padding: 16px 24px; display: flex; justify-content: space-between; align-items: center; - height: 64px; - z-index: 9999; + height: $navbar-height; + z-index: 8; position: absolute; top: 0; left: 0; @@ -30,16 +29,21 @@ display: flex; align-items: center; gap: 8px; - + &-button { display: flex; gap: $panel-gap; button { - @include button-icon(32px, rgba(0, 0, 0, .1), rgba(0, 0, 0, .25)); + @include button-icon(32px, rgba(0, 0, 0, 0.3), rgba(0, 0, 0, 0.4)); font-size: 20px; color: $white; } + + button:disabled { + background-color: rgba(0, 0, 0, 0.3); + cursor: not-allowed; + } } &-search { @@ -66,9 +70,12 @@ &:hover { background-color: $bg-elevated-highlight; - box-shadow: 0 0 0 1px hsla(0, 0%, 100%, .2); + box-shadow: 0 0 0 1px hsla(0, 0%, 100%, 0.2); } + &:focus { + box-shadow: 0 0 0 1px $white; + } } } @@ -78,7 +85,7 @@ transform: translateY(-42%); font-size: 18px; color: #fff; - opacity: .7; + opacity: 0.7; } .search-icon { @@ -91,15 +98,98 @@ background-color: transparent; cursor: pointer; } + } + &-play-btn { + display: flex; + align-items: center; + gap: $panel-gap; + opacity: 0; + transition: all 0.5s ease; + + .play-btn { + @include button-icon(48px, $primary, $primary); + opacity: 1; + font-size: 24px; + transition: opacity 0.2s ease, scale 33ms ease; + box-shadow: 0 8px 8px rgba(0, 0, 0, 0.3); + + &:hover { + scale: 1.05; + } + } + + .artist-name { + font-size: 24px; + font-weight: 700; + } } } .user { - button { - @include button-icon(32px, $black, $black); + position: relative; + button[name='user account'] { + @include button-icon(32px, $bg-base, $bg-base); color: $white; - border: 3px $white solid; + font-size: 16px; + } + + &-avt { + width: 32px; + height: 32px; + border-radius: 50%; + overflow: hidden; + cursor: pointer; + border: 3px #292929 solid; + } + + &-dropdown { + display: none; + position: absolute; + top: 26px; + right: -60%; + padding-top: 10px; + } + + &:hover .user-dropdown { + display: block; + } + } +} + +.login-btn { + button { + @include reset-button; + font-size: 16px; + font-weight: 700; + background-color: $white; + padding: 10px 16px; + border-radius: 500px; + transform-origin: center; + transition: all 33ms ease; + cursor: pointer; + color: $black; + box-shadow: 0 8px 8px rgba(0, 0, 0, .15); + + &:hover { + transform: scale(1.04); } } -} \ No newline at end of file +} + +.darken { + filter: brightness(65%) !important; +} + +.genre-title { + margin-left: 10px; + font-size: 24px; + color: $white; + font-weight: 700; + opacity: 0; + transition: all .5s ease; +} + +.show { + opacity: 1; +} diff --git a/src/components/Navbar/Navbar.tsx b/src/components/Navbar/Navbar.tsx index 6d4f798..23801c5 100644 --- a/src/components/Navbar/Navbar.tsx +++ b/src/components/Navbar/Navbar.tsx @@ -1,66 +1,90 @@ -import React, { FC } from 'react' -import { FaUser } from 'react-icons/fa' -import { IoIosArrowBack, IoIosArrowForward } from 'react-icons/io' +import { UserImgDefault } from '@/assets/icons' +import { AuthContext } from '@/contexts/AuthContext' +import classNames from 'classnames/bind' +import React, { FC, useContext, useEffect, useRef } from 'react' import { FiSearch } from 'react-icons/fi' +import { IoIosArrowBack, IoIosArrowForward } from 'react-icons/io' import { MdOutlineClear } from 'react-icons/md' +import { useLocation, useNavigate } from 'react-router-dom' +import { Image, PlayButton } from '../UIs' import styles from './Navbar.module.scss' -import classNames from 'classnames/bind' +import UserDropdown from './UserDropdown/UserDropdown' const cx = classNames.bind(styles) interface NavbarProps { + type?: 'default' | 'home' | 'section' | 'search' | 'artist' | 'genre' bgColor?: string | null navOpacity?: number - isSearch?: boolean query?: string - setQuery?: React.Dispatch> + title?: string + playBtnVisible?: boolean + inclPlayBtn?: boolean + setQuery?: React.Dispatch> + handleClickPlayBtn?: any + showTitle?: boolean } const Navbar: FC = (props) => { const { bgColor, navOpacity = 1, - isSearch = false, query, setQuery, + type = 'default', + title = '', + playBtnVisible = false, + inclPlayBtn = false, + handleClickPlayBtn, + showTitle = false, } = props - // console.log(query) + const { isLogged, userData, handleLogin } = useContext(AuthContext) + const { key } = useLocation() + const navigate = useNavigate() + const queryRef = useRef(null) + + useEffect(() => { + if (type === 'search') { + queryRef?.current.focus() + } + }, []) return ( -
+
-
- -
- + {isLogged ? ( +
+ {userData?.images?.length === 0 ? ( + + ) : ( +
+ {userData?.display_name} +
+ )} + +
+ +
+
+ ) : ( +
+ +
+ )} + ) } diff --git a/src/components/Navbar/UserDropdown/UserDropdown.module.scss b/src/components/Navbar/UserDropdown/UserDropdown.module.scss new file mode 100644 index 0000000..99bbb3e --- /dev/null +++ b/src/components/Navbar/UserDropdown/UserDropdown.module.scss @@ -0,0 +1,21 @@ +@import '../../../scss/variable'; +@import '../../../scss/mixin'; + +.user-dropdown-wrapper { + display: flex; + flex-direction: column; + background-color: $bg-card-highlight; + box-shadow: 0 16px 24px rgba(0, 0, 0, 0.3), 0 6px 8px rgba(0, 0, 0, 0.2); + border-radius: 4px; + overflow: hidden; +} + +.logout-btn { + @include reset-button; + padding: 10px 20px; + font-size: 14px; + font-weight: 700; + background-color: transparent; + color: $white; + cursor: pointer; +} diff --git a/src/components/Navbar/UserDropdown/UserDropdown.tsx b/src/components/Navbar/UserDropdown/UserDropdown.tsx new file mode 100644 index 0000000..83d20e1 --- /dev/null +++ b/src/components/Navbar/UserDropdown/UserDropdown.tsx @@ -0,0 +1,20 @@ +import { FC, useContext } from 'react' +import styles from './UserDropdown.module.scss' +import classNames from 'classnames/bind' +import { AuthContext } from '@/contexts/AuthContext' + +const cx = classNames.bind(styles) + +const UserDropdown: FC = () => { + const { handleLogout } = useContext(AuthContext) + + return ( +
+ +
+ ) +} + +export default UserDropdown diff --git a/src/components/PlayingView/NextSong/NextSong.module.scss b/src/components/PlayingView/NextSong/NextSong.module.scss new file mode 100644 index 0000000..1e49743 --- /dev/null +++ b/src/components/PlayingView/NextSong/NextSong.module.scss @@ -0,0 +1,90 @@ +@import '../../../scss/variable'; +@import '../../../scss/mixin'; + +.next-song-wrapper { + border-radius: 16px; + padding: 16px; + background-color: #232323; + display: flex; + flex-direction: column; +} + +.header { + display: flex; + flex-direction: row; + justify-content: space-between; + + .title { + font-size: 16px; + font-weight: 700; + color: $white; + } + + .open-queue-btn { + & > button { + @include reset-button; + background-color: transparent; + font-weight: 700; + font-size: 14px; + color: $text-subdued; + transform-origin: center; + transition: all 0.1s ease; + cursor: pointer; + + &:hover { + color: $white; + text-decoration: underline; + transform: scale(1.04); + } + } + } +} + +.body { + margin-top: 16px; +} + +.next-song { + display: flex; + flex-direction: row; + gap: 12px; + height: 64px; + padding: 8px; + align-items: center; + border-radius: 8px; + overflow: hidden; + + &:hover { + background-color: #393939; + } + + .icon { + width: 16px; + } + + .thumb { + height: 100%; + aspect-ratio: 1 / 1; + overflow: hidden; + border-radius: 4px; + } + + .content { + display: flex; + flex-direction: column; + overflow: hidden; + flex: 1; + + .name-track { + font-size: 16px; + color: $white; + font-weight: 700; + cursor: pointer; + @include text-in-one-line; + + &:hover { + text-decoration: underline; + } + } + } +} diff --git a/src/components/PlayingView/NextSong/NextSong.tsx b/src/components/PlayingView/NextSong/NextSong.tsx new file mode 100644 index 0000000..7f65f95 --- /dev/null +++ b/src/components/PlayingView/NextSong/NextSong.tsx @@ -0,0 +1,64 @@ +import { SingleMusicNote } from '@/assets/icons' +import { Image, SubTitle } from '@/components/UIs' +import { PlayerContext } from '@/contexts/PlayerContext' +import { SpotifyTrack } from '@/types/track' +import classNames from 'classnames/bind' +import { FC, useContext } from 'react' +import { Link } from 'react-router-dom' +import styles from './NextSong.module.scss' + +const cx = classNames.bind(styles) + +interface NextSongProps { + nextSong: SpotifyTrack +} +const NextSong: FC = ({ nextSong }) => { + const { + setQueue, + setCurrentTrack, + setCurrentTrackIndex, + calNextTrackIndex, + setPlayingType, + } = useContext(PlayerContext) + + const handleClick = (e: React.MouseEvent) => { + e.stopPropagation() + setCurrentTrack({ ...nextSong }) + setQueue([{ ...nextSong }]) + setCurrentTrackIndex(0) + calNextTrackIndex() + setPlayingType('track') + } + return ( +
+
+ Next in queue + +
+ +
+ +
+
+
handleClick(e)} className={cx('next-song')}> +
+ +
+
+ {nextSong?.name} +
+
+ + {nextSong?.name} + + + + +
+
+
+
+ ) +} + +export default NextSong diff --git a/src/components/PlayingView/PlayingView.module.scss b/src/components/PlayingView/PlayingView.module.scss new file mode 100644 index 0000000..5ce6070 --- /dev/null +++ b/src/components/PlayingView/PlayingView.module.scss @@ -0,0 +1,124 @@ +@import '../../scss/variable'; +@import '../../scss/mixin'; + +.playing-view-wrapper { + max-width: 400px; + min-width: 300px; + overflow: hidden; + overflow-y: scroll; + background-color: $bg-base; + border-radius: $panel-border-radius; + padding: 16px; + + &::-webkit-scrollbar { + display: none; + } + + & > div { + display: flex; + flex-direction: column; + gap: 16px; + } +} + +.header { + height: 32px; + display: flex; + flex-direction: row; + justify-content: flex-end; + + .close-btn { + width: 32px; + height: 32px; + border-radius: 50%; + transition: all 0.2s ease; + position: relative; + + button { + position: absolute; + top: 2px; + right: 0px; + @include reset-button; + cursor: pointer; + width: 100%; + height: 100%; + background-color: transparent; + color: rgba($color: #fff, $alpha: 0.7); + } + + &:hover { + background-color: rgba($color: #fff, $alpha: 0.1); + } + } +} + +.track-banner { + width: 100%; + aspect-ratio: 1 / 1; + + & > div { + width: 100%; + height: 100%; + border-radius: 8px; + overflow: hidden; + } + + .default-banner { + @include item-center; + height: 100%; + width: 100%; + background-color: $bg-card-highlight; + color: $white; + } +} + +.content { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + gap: 24px; + width: 100%; + height: 64px; + + .title { + flex: 1; + display: flex; + flex-direction: column; + overflow: hidden; + + .name-track { + font-size: 24px; + font-weight: 700; + color: $white; + margin: 0; + padding-bottom: 8px; + + &:hover { + text-decoration: underline; + text-decoration-thickness: 2px; + } + } + } + + .heart-btn { + width: 30px; + color: $text-subdued; + cursor: pointer; + + &:hover { + color: $white; + } + } +} + +.about-artist { + height: 270px; + overflow: hidden; + border-radius: 8px; + + & > div { + margin-inline: -24px; + overflow: hidden; + } +} diff --git a/src/components/PlayingView/PlayingView.tsx b/src/components/PlayingView/PlayingView.tsx new file mode 100644 index 0000000..c61d589 --- /dev/null +++ b/src/components/PlayingView/PlayingView.tsx @@ -0,0 +1,87 @@ +import { FC, useContext, useEffect } from 'react' +import styles from './PlayingView.module.scss' +import classNames from 'classnames/bind' +import { PlayerContext } from '@/contexts/PlayerContext' +import { AboutArtist } from '..' +import { ArtistContext } from '@/contexts/ArtistContext' +import { Image, SubTitle } from '../UIs' +import Marquee from 'react-fast-marquee' +import { CloseIcon, HeartIcon, MusicNote } from '@/assets/icons' +import { Link } from 'react-router-dom' +import { AppContext } from '@/App' +import NextSong from './NextSong/NextSong' + +const cx = classNames.bind(styles) + +const PlayingView: FC = () => { + const { currentTrack, queue, nextTrackIndex } = useContext(PlayerContext) + const { setId, isLoading, profile, stats, aboutImg, avatarImg } = + useContext(ArtistContext) + const { setPlayingViewShowed } = useContext(AppContext) + + useEffect(() => { + setId(currentTrack?.artists?.[0]?.id) + }, [currentTrack]) + + return ( +
+
+
+
+ +
+
+
+
+ {currentTrack?.album?.images?.[0]?.url ? ( + {currentTrack?.name} + ) : ( +
+ +
+ )} +
+
+
+
+ + +

{currentTrack?.name}

+
+ + + + + + +
+
+ +
+
+
+
+ +
+
+
+ +
+
+
+ ) +} + +export default PlayingView diff --git a/src/components/SearchBanner/BannerItem/BannerItem.module.scss b/src/components/SearchBanner/BannerItem/BannerItem.module.scss new file mode 100644 index 0000000..1410892 --- /dev/null +++ b/src/components/SearchBanner/BannerItem/BannerItem.module.scss @@ -0,0 +1,55 @@ +@import '../../../scss/variable'; +@import '../../../scss/mixin'; + +.main { + // width: 100%; + // min-width: 150px; + // max-width: 230px; + aspect-ratio: 1 / 1; + border-radius: $panel-border-radius; + position: relative; + overflow: hidden; +} + +.wrapper { + width: 100%; + height: 100%; + border-radius: $panel-border-radius; + position: relative; + overflow: hidden; + + .title { + width: 100%; + padding: 16px; + overflow: hidden; + + &-text { + margin: 0; + font-size: 24px; + text-decoration: none !important; + color: #fff; + overflow-wrap: break-word; + } + } + + .img { + width: 100px; + aspect-ratio: 1 / 1; + position: absolute; + rotate: 25deg; + bottom: -14px; + right: -10px; + + span { + display: block; + width: 100%; + height: 100%; + } + + img { + width: 100%; + height: 100%; + object-fit: cover; + } + } +} diff --git a/src/components/SearchBanner/BannerItem/BannerItem.tsx b/src/components/SearchBanner/BannerItem/BannerItem.tsx new file mode 100644 index 0000000..ff45787 --- /dev/null +++ b/src/components/SearchBanner/BannerItem/BannerItem.tsx @@ -0,0 +1,28 @@ +import { Image } from '@/components/UIs' +import { SearchBannerItem } from '@/types/search' +import classNames from 'classnames/bind' +import React from 'react' +import { Link } from 'react-router-dom' +import styles from './BannerItem.module.scss' + +const cx = classNames.bind(styles) + +const BannerItem: React.FC = ({ title, imgUrl, id, bgColor }) => { + return ( + +
+
+

+
+
+ {title} +
+
+ + ) +} + +export default BannerItem diff --git a/src/components/SearchBanner/SearchBanner.module.scss b/src/components/SearchBanner/SearchBanner.module.scss new file mode 100644 index 0000000..d8af727 --- /dev/null +++ b/src/components/SearchBanner/SearchBanner.module.scss @@ -0,0 +1,19 @@ +.wrapper { + margin-top: 16px; + padding-inline: 24px; + + .heading { + font-size: 24px; + margin-top: 28px; + margin-bottom: 16px; + } + + .body { + display: grid; + gap: 24px; + grid-template-columns: repeat(5, 1fr); + } +} + + + diff --git a/src/components/SearchBanner/SearchBanner.tsx b/src/components/SearchBanner/SearchBanner.tsx new file mode 100644 index 0000000..e86eb24 --- /dev/null +++ b/src/components/SearchBanner/SearchBanner.tsx @@ -0,0 +1,35 @@ +import { MainLayoutContext } from '@/contexts/MainLayoutContext' +import { SearchContext } from '@/contexts/SearchContext' +import classNames from 'classnames/bind' +import React, { useContext } from 'react' +import BannerItem from './BannerItem/BannerItem' +import styles from './SearchBanner.module.scss' + +const cx = classNames.bind(styles) + +const SearchBanner: React.FC = () => { + const { quantityCol } = useContext(MainLayoutContext) + const { categoriesData } = useContext(SearchContext) + + return ( +
+

Browse all

+
+ {categoriesData?.map((item, index) => ( + + ))} +
+
+ ) +} + +export default React.memo(SearchBanner) diff --git a/src/components/SearchResult/SearchNotFound/SearchNotFound.module.scss b/src/components/SearchResult/SearchNotFound/SearchNotFound.module.scss new file mode 100644 index 0000000..432f296 --- /dev/null +++ b/src/components/SearchResult/SearchNotFound/SearchNotFound.module.scss @@ -0,0 +1,33 @@ +@import '../../../scss/mixin'; + +.wrapper { + display: flex; + flex-direction: column; + min-height: 100vh; + justify-content: space-between; +} + + +.not-found { + min-height: 400px; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + padding-inline: 24px; + overflow: hidden; + + .title { + display: block; + width: 100%; + font-size: 24px; + font-weight: 700; + text-align: center; + @include text-line-clamp(4); + + } + + .msg { + font-size: 14px; + } +} \ No newline at end of file diff --git a/src/components/SearchResult/SearchNotFound/SearchNotFound.tsx b/src/components/SearchResult/SearchNotFound/SearchNotFound.tsx new file mode 100644 index 0000000..f8d903d --- /dev/null +++ b/src/components/SearchResult/SearchNotFound/SearchNotFound.tsx @@ -0,0 +1,29 @@ +import {FC} from 'react' +import styles from './SearchNotFound.module.scss' +import classNames from 'classnames/bind' +import { Footer } from '@/components' + +const cx = classNames.bind(styles) + +interface SearchNotFoundProps { + query?: string +} + +const SearchNotFound: FC = ({query}) => { + return ( +
+
+

{`No results found for "${query}"`}

+ + Please make sure your words are spelled correctly, or use fewer or different + keywords. + +
+
+
+ ) +} + +export default SearchNotFound diff --git a/src/components/SearchResult/SearchResult.module.scss b/src/components/SearchResult/SearchResult.module.scss new file mode 100644 index 0000000..f2f0c88 --- /dev/null +++ b/src/components/SearchResult/SearchResult.module.scss @@ -0,0 +1,46 @@ +@import '../../scss/variable'; +@import '../../scss/mixin'; + + + +.wrapper { + display: flex; + flex-direction: column; + gap: $panel-gap; + position: relative; +} + + + +.search__kind { + display: flex; + gap: 10px; + padding: 7px 24px 10px; + margin-bottom: 4px; + transform: translateZ(1px); + background-color: $bg-base; + z-index: 8; + min-height: 52px; + position: sticky; + position: -webkit-sticky; + top: 0; + right: 0; + left: 0; + + .btn { + @include button-text(8px 12px, $bg-button, $bg-button-highlight); + color: $white; + font-size: 14px; + border-radius: 32px; + } + + .active { + color: $black; + @include button-text(8px 12px, $white, $white); + } +} + + +.grid-md { + grid-template-columns: 16px minmax(300px, 4fr) 2fr 50px !important; +} \ No newline at end of file diff --git a/src/components/SearchResult/SearchResult.tsx b/src/components/SearchResult/SearchResult.tsx new file mode 100644 index 0000000..954e74f --- /dev/null +++ b/src/components/SearchResult/SearchResult.tsx @@ -0,0 +1,199 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { SearchContext } from '@/contexts/SearchContext' +import classNames from 'classnames/bind' +import { FC, useContext, useEffect, useState } from 'react' +import { Section } from '..' +import SongList from '../SongList/SongList' +import SearchNotFound from './SearchNotFound/SearchNotFound' +import styles from './SearchResult.module.scss' +import TopResult from './TopResult/TopResult' + +const cx = classNames.bind(styles) + +const SearchResult: FC = () => { + const { data, query, categoryRef, isLoading } = useContext(SearchContext) + const [category, setCategory] = useState(categoryRef.current) + const [searchSelections, setSearchSelections] = useState([]) + + useEffect(() => { + setSearchSelections([ + { + key: 'all', + active: category === 'all', + display: 'All', + isExist: true, + }, + { + key: 'albums', + active: category === 'albums', + display: 'Albums', + isExist: Boolean(data?.albums?.total), + }, + { + key: 'artists', + active: category === 'artists', + display: 'Artists', + isExist: Boolean(data?.artists?.total), + }, + { + key: 'tracks', + active: category === 'tracks', + display: 'Songs', + isExist: Boolean(data?.tracks?.total), + }, + { + key: 'playlists', + active: category === 'playlists', + display: 'Playlists', + isExist: Boolean(data?.playlists?.total), + }, + { + key: 'shows', + active: category === 'shows', + display: 'Podcasts & Shows', + isExist: Boolean(data?.shows?.total), + }, + { + key: 'episodes', + active: category === 'episodes', + display: 'Episodes', + isExist: Boolean(data?.episodes?.total), + }, + ]) + }, [category, data]) + + if ( + data?.albums.items.filter((item: any) => item).length === 0 && + data?.artists.items.filter((item: any) => item).length === 0 && + data?.episodes.items.filter((item: any) => item).length === 0 && + data?.playlists.items.filter((item: any) => item).length === 0 && + data?.shows.items.filter((item: any) => item).length === 0 && + data?.tracks.items.filter((item: any) => item).length === 0 + ) { + return + } + + return ( +
+
+ {searchSelections + .filter((item: any) => item.isExist) + .map((item: any) => ( + + ))} +
+
+ {category !== 'all' ? ( + searchSelections + .filter((item: any) => item.active) + .map((item: any, index: number) => { + if (item.key !== 'tracks') { + return ( +
+
item) + ?.sort((a: any, b: any) => -a.popularity + b.popularity)} + /> +
+ ) + } else { + return ( + item) + ?.sort((a: any, b: any) => -a?.popularity + b?.popularity)} + isLoading={isLoading} + /> + ) + } + }) + ) : ( + <> + {data?.tracks.items?.filter((item: any) => item).length !== 0 && ( + item) + .sort((a: any, b: any) => -a.popularity + b.popularity)} + /> + )} + {data?.artists?.items.filter((item: any) => item).length !== 0 && ( +
item)} + /> + )} + {data?.albums?.items.filter((item: any) => item).length !== 0 && ( +
item) + .sort((a: any, b: any) => -a.popularity + b.popularity)} + /> + )} + {data?.playlists?.items.filter((item: any) => item).length !== 0 && ( +
item) + .sort((a: any, b: any) => -a.popularity + b.popularity)} + /> + )} + {data?.episodes?.items.filter((item: any) => item).length !== 0 && ( +
item) + .sort((a: any, b: any) => -a.popularity + b.popularity)} + /> + )} + {data?.shows?.items.filter((item: any) => item).length !== 0 && ( +
item) + .sort((a: any, b: any) => -a.popularity + b.popularity)} + type="show" + /> + )} + + )} +
+
+ ) +} + +export default SearchResult diff --git a/src/components/SearchResult/TopResult/TopResult.module.scss b/src/components/SearchResult/TopResult/TopResult.module.scss new file mode 100644 index 0000000..ae70f08 --- /dev/null +++ b/src/components/SearchResult/TopResult/TopResult.module.scss @@ -0,0 +1,109 @@ +@import '../../../scss/variable'; +@import '../../../scss/mixin'; + +.wrapper { + width: 100%; + padding-inline: 24px; + display: flex; + justify-content: space-between; + gap: 48px; + margin-bottom: 28px; +} + +.left, +.right { + .header { + margin: 6px 0 22px; + + .heading { + font-size: 24px; + font-weight: 700; + margin: 0; + } + } +} + +.right { + flex: 6; +} + +.left { + flex: 4; + + .body { + padding: 20px; + display: flex; + flex-direction: column; + position: relative; + background-color: $bg-card; + transition: background-color 0.3s ease; + border-radius: $panel-border-radius; + gap: 14px; + max-width: 500px; + overflow: hidden; + + .thumb { + height: 92px; + width: 92px; + overflow: hidden; + border-radius: 4px; + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.5); + + img { + height: 100%; + width: 100%; + object-fit: cover; + } + + .default-thumb { + @include default-thumb; + background-color: #333; + } + } + + .main { + min-height: 62px; + // max-width: 100%; + // overflow: hidden; + + .name { + font-size: 32px; + color: $white; + font-weight: 700; + margin: 10px 0 18px; + + h3 { + padding: 0; + margin: 0; + @include text-in-one-line; + } + } + } + + .btn-pivot { + position: absolute; + bottom: 70px; + right: 70px; + + .play-btn { + position: absolute; + opacity: 0; + transform: translateY(8px); + transition: all 0.3s ease; + } + } + + &:hover { + background-color: $bg-card-highlight; + + .play-btn { + opacity: 1; + transform: translateY(0); + } + } + } +} + +.responsive { + flex-direction: column; +} diff --git a/src/components/SearchResult/TopResult/TopResult.tsx b/src/components/SearchResult/TopResult/TopResult.tsx new file mode 100644 index 0000000..decb2d9 --- /dev/null +++ b/src/components/SearchResult/TopResult/TopResult.tsx @@ -0,0 +1,140 @@ +import { SongItem } from '@/components' +import { Image, PlayButton, SubTitle } from '@/components/UIs' +import { MainLayoutContext } from '@/contexts/MainLayoutContext' +import classNames from 'classnames/bind' +import { FC, useContext, useLayoutEffect, useState } from 'react' +import Skeleton from 'react-loading-skeleton' +import styles from './TopResult.module.scss' +import { PlayerContext } from '@/contexts/PlayerContext' +import { SpotifyTrack } from '@/types/track' +import { MusicNote } from '@/assets/icons' + +const cx = classNames.bind(styles) + +interface TopResultProps { + topResult: SpotifyTrack + songs: SpotifyTrack[] +} + +const TopResult: FC = ({ topResult, songs }) => { + const [isLoading, setLoading] = useState(true) + const { width } = useContext(MainLayoutContext) + const { + setCurrentTrack, + setQueue, + setCurrentTrackIndex, + calNextTrackIndex, + setPlayingType, + currentTrack, + } = useContext(PlayerContext) + + useLayoutEffect(() => { + if (topResult && songs) { + setLoading(false) + } else setLoading(true) + }, [topResult, songs]) + + const handleClickPlayBtn = (e: React.MouseEvent) => { + e.stopPropagation() + if (currentTrack?.id === topResult?.id) return + setCurrentTrack({ ...topResult }) + setQueue([{ ...topResult }]) + setCurrentTrackIndex(0) + setPlayingType('track') + calNextTrackIndex() + } + + return ( +
+
+
+

Top result

+
+
+
+ {!isLoading ? ( + topResult?.album?.images?.[0]?.url ? ( + {topResult?.name} + ) : ( +
+ +
+ ) + ) : ( + + )} +
+
+ <> +
+ {!isLoading ? ( +

{topResult?.name}

+ ) : ( + + )} +
+
+ {!isLoading ? ( + + ) : ( + + )} +
+ +
+
+ {!isLoading && ( +
handleClickPlayBtn(e)} className={cx('play-btn')}> + +
+ )} +
+
+
+
+
+

Songs

+
+
+ {!isLoading + ? songs + ?.slice(0, 4) + .map((item, index) => ( + + )) + : Array(4) + .fill(0) + .map((item, index) => ( + + ))} +
+
+
+ ) +} + +export default TopResult diff --git a/src/components/Section/Section.module.scss b/src/components/Section/Section.module.scss index e69de29..8f9eac4 100644 --- a/src/components/Section/Section.module.scss +++ b/src/components/Section/Section.module.scss @@ -0,0 +1,51 @@ +@import '../../scss/variable'; + +.wrapper { + padding-inline: 24px; + display: flex; + flex-direction: column; + margin-bottom: 22px; +} + +.header { + flex: 1; + display: flex; + justify-content: space-between; + align-items: center; + min-height: 67px; + + .heading { + color: $white; + font-size: 24px; + font-weight: 700; + margin: 8px 0 16px; + } + + a { + font-size: 14px; + font-weight: 700; + color: $text-neutral; + + &:hover { + text-decoration: underline; + } + } +} + +.body { + overflow: hidden; + display: grid; + // grid-template-columns: repeat(4, 1fr); + grid-column: 1; + grid-gap: 24px; + // max-height: 305px; + align-content: stretch; +} + +.un-clickable { + &:hover { + text-decoration: none !important; + cursor: text; + } + pointer-events: none; +} \ No newline at end of file diff --git a/src/components/Section/Section.tsx b/src/components/Section/Section.tsx index 3009766..6f5d70d 100644 --- a/src/components/Section/Section.tsx +++ b/src/components/Section/Section.tsx @@ -1,14 +1,174 @@ +/* eslint-disable react-refresh/only-export-components */ +import { MainLayoutContext } from '@/contexts/MainLayoutContext' +import classNames from 'classnames/bind' +import React, { memo, useContext, useEffect, useMemo, useState } from 'react' +import Skeleton from 'react-loading-skeleton' +import { Link } from 'react-router-dom' +import SectionItem from '../SectionItem/SectionItem' +import styles from './Section.module.scss' +import { SectionProps } from '@/types/section' +import { useInView } from 'react-intersection-observer' -interface SectionProps { - label: string; - type: string -} +const cx = classNames.bind(styles) + +const Section: React.FC = ({ + title, + href, + data, + isFull = false, + dataType, + isClickable = true, + hideHeader = false, + type = 'default', + apiType, + pageType = 'section', +}) => { + const [isLoading, setLoading] = useState(true) + const { quantityCol, width } = useContext(MainLayoutContext) + const [renderNumb, setRenderNumb] = useState(() => { + if ((data?.length ?? 0 < 19) && data?.length) return data.length + return 9 + }) + + const { ref: lazyRenderRef, inView: lazyRenderInView } = useInView({ + threshold: 0, + }) + + const columnWidth = (width - 2 * 24 - (quantityCol - 1) * 24) / quantityCol + + useEffect(() => { + if (renderNumb === data?.length) { + return + } + if (lazyRenderInView && data?.length && renderNumb + 9 > data?.length) { + setRenderNumb(data.length) + } else { + setRenderNumb((prev) => prev + 9) + } + }, [lazyRenderInView]) + + const sectionProps = useMemo(() => { + if (data) { + return data.map((item) => { + return { + id: + (apiType === 'rapid' && + (item.uri?.split(':')[item.uri.split.length] || + item?.releases?.items[0].id)) || + item?.id, + title: + (apiType === 'rapid' && + (item?.profile?.name || item?.releases?.items[0].name)) || + item?.name, + artists: item?.artists, + desc: + (apiType === 'spotify' && item?.description) || + (apiType === 'rapid' && + (item?.releases?.items[0].type || item?.description || item?.date?.year)), + publisher: item?.publisher, + imageUrl: + (apiType === 'spotify' && item?.images?.[0]?.url) || + (apiType === 'rapid' && + (item?.images?.items?.[0]?.sources[0]?.url || + item?.coverArt?.sources[0]?.url || + item?.visuals?.avatarImage?.sources[0]?.url || + item?.releases?.items[0]?.coverArt?.sources[0]?.url)), + dateAdd: item?.release_date, + author: + (item?.artists && item?.artists[0]?.name) || + (item?.owner && item?.owner?.display_name), + } + }) + } + }, [data]) + useEffect(() => { + if (data && data?.length !== 0) { + setLoading(false) + } else setLoading(true) + }, [data]) -const Section: React.FC = () => { return ( -
Section
+
+ {!hideHeader && ( +
+ {!isLoading ? ( + <> + quantityCol + ), + })} + to={ + isClickable && (sectionProps?.length || 0) > quantityCol + ? `${href}` + : '#' + } + > +

{title}

+ + {(sectionProps?.length || 0) > quantityCol && !isFull && isClickable && ( + Show all + )} + + ) : ( + + )} +
+ )} +
+ {!isLoading ? ( + <> + {sectionProps + ?.slice( + 0, + isFull + ? pageType === 'genre' + ? sectionProps?.length + : renderNumb + : Math.min(quantityCol, sectionProps.length) + ) + .map((item, index) => ( + + ))} + {isFull && pageType !== 'genre' &&
} + + ) : ( + Array(quantityCol) + .fill(0) + .map((item, index) => ( + + )) + )} +
+
) } -export default Section \ No newline at end of file +export default memo(Section) diff --git a/src/components/SectionItem/SectionItem.module.scss b/src/components/SectionItem/SectionItem.module.scss new file mode 100644 index 0000000..d67e151 --- /dev/null +++ b/src/components/SectionItem/SectionItem.module.scss @@ -0,0 +1,118 @@ +@import '../../scss/variable'; +@import '../../scss/mixin'; + +.wrapper { + background-color: $bg-card; + padding: 16px; + border-radius: $panel-border-radius; + width: 100%; + height: 100%; + transition: background-color 0.3s ease; + position: relative; + cursor: pointer; + + &:hover { + background-color: $bg-card-highlight; + } + + .img { + width: 100%; + aspect-ratio: 1 / 1; + margin-bottom: 16px; + border-radius: 6px; + overflow: hidden; + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.5); + + span { + display: block; + width: 100%; + height: 100%; + } + + img { + width: 100%; + height: 100%; + object-fit: cover; + } + + .user-img-default { + width: 100%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; + background-color: #333; + color: $text-neutral; + } + } + + .btn-pivot { + width: 100%; + height: 0; + position: relative; + + .play-btn { + position: absolute; + z-index: 7; + top: -66px; + right: 8px; + opacity: 0; + transition: transform 0.3s ease, opacity 0.3s; + } + } + + .body { + display: flex; + flex-direction: column; + overflow: hidden; + position: relative; + max-width: 100%; + + .heading { + width: 100%; + display: block; + @include text-in-one-line; + font-size: 16px; + font-weight: 700; + color: $white; + margin: 0; + padding-bottom: 4px; + } + + .desc { + font-size: 14px; + color: $text-subdued; + @include text-line-clamp(2); + font-weight: 700; + margin: 6px 0 4px; + + p { + display: block; + color: $text-subdued; + + // min-height: 32px; + margin: 0; + color: $text-subdued; + line-height: 1.5; + } + + a { + color: $text-subdued; + font-weight: 700; + + &:hover { + text-decoration: underline; + } + } + } + } + + &:hover .play-btn { + opacity: 1; + transform: translateY(-8px); + } +} + +.isArtist { + border-radius: 50% !important; +} diff --git a/src/components/SectionItem/SectionItem.tsx b/src/components/SectionItem/SectionItem.tsx new file mode 100644 index 0000000..4979910 --- /dev/null +++ b/src/components/SectionItem/SectionItem.tsx @@ -0,0 +1,187 @@ +import { getArtistTopTrack } from '@/apis/artistApi' +import categoryApi from '@/apis/categoryApi' +import showApi from '@/apis/showApi' +import { UserImgDefault } from '@/assets/icons' +import { PlayerContext } from '@/contexts/PlayerContext' +import { SectionItemI } from '@/types/section' +import { dateFormatConvertor } from '@/utils' +import classNames from 'classnames/bind' +import React, { memo, useContext } from 'react' +import Skeleton from 'react-loading-skeleton' +import 'react-loading-skeleton/dist/skeleton.css' +import { useNavigate } from 'react-router-dom' +import { Image, PlayButton, SubTitle } from '../UIs' +import styles from './SectionItem.module.scss' +import episodeApi from '@/apis/episodeApi' + +const cx = classNames.bind(styles) + +const SectionItem: React.FC = ({ + title, + name, + imageUrl, + id, + dataType, + author, + artists, + desc, + isLoading, + publisher, + dateAdd, + type, +}) => { + const { + setCurrentTrack, + setCurrentTrackIndex, + setQueue, + calNextTrackIndex, + setPlayingType, + } = useContext(PlayerContext) + + const navigate = useNavigate() + const handleClickPlayBtn = (e: React.MouseEvent) => { + e.stopPropagation() + if (dataType === 'album') { + const fetchData = async () => { + const data = await categoryApi({ + type: 'albums', + id, + }) + const queueList = data?.tracks?.items?.map((item: any) => { + return { + ...item, + album: { + album_type: data?.album_type, + id: data?.name, + name: data?.name, + images: data?.images, + }, + } + }) + setQueue([...queueList]) + setCurrentTrack({ ...queueList?.[0] }) + setCurrentTrackIndex(0) + setPlayingType('track') + calNextTrackIndex() + } + fetchData() + } else if (dataType === 'playlist') { + const fetchData = async () => { + const data = await categoryApi({ + type: `playlists`, + id, + }) + const queueList = data?.tracks?.items?.map((item: any) => item?.track) || [] + setQueue([...queueList]) + setCurrentTrack({ ...queueList?.[0] }) + setCurrentTrackIndex(0) + setPlayingType('track') + calNextTrackIndex() + } + fetchData() + } else if (dataType === 'artist') { + const fetchData = async () => { + const data = await getArtistTopTrack(id) + setQueue([...data.tracks]) + setCurrentTrack({ ...data?.tracks?.[0] }) + setCurrentTrackIndex(0) + calNextTrackIndex() + setPlayingType('track') + } + fetchData() + } else if (dataType === 'show') { + const fetchData = async () => { + const data = await showApi({ id }) + const queueList = + data?.episodes?.items?.map((item: any) => { + return { + ...item, + show: { name: data?.name, id: data?.id, publisher: data?.publisher }, + } + }) || [] + setQueue([...queueList]) + setCurrentTrack({ ...queueList?.[0] }) + setCurrentTrackIndex(0) + calNextTrackIndex() + setPlayingType('show') + } + fetchData() + } else if (dataType === 'episode') { + const fetchData = async () => { + const data = await episodeApi({ id }) + setQueue([{ ...data }]) + setCurrentTrack({ ...data }) + setCurrentTrackIndex(0) + setPlayingType('show') + calNextTrackIndex() + } + fetchData() + } + } + + return ( +
navigate(`/${dataType}/${id}`)} className={cx('wrapper')}> +
+ {!isLoading ? ( + dataType === 'artist' ? ( + imageUrl ? ( + {title + ) : ( +
+ +
+ ) + ) : ( + {title + ) + ) : ( + + )} +
+
+ {!isLoading && ( +
+ +
+ )} +
+
+ {!isLoading ? ( +

{title || name}

+ ) : ( + + )} +
+ {!isLoading ? ( +

) || + 'Lorem ipsum dolor sit amet consectetur adipisicing elit.', + }} + >

+ ) : ( + + )} +
+
+
+ ) +} + +export default memo(SectionItem) diff --git a/src/components/ShowItem/ShowItem.module.scss b/src/components/ShowItem/ShowItem.module.scss new file mode 100644 index 0000000..2a3f141 --- /dev/null +++ b/src/components/ShowItem/ShowItem.module.scss @@ -0,0 +1,84 @@ +@import '../../scss/variable'; +@import '../../scss/mixin'; + +.main { + border-top: 2px solid rgba($color: #fff, $alpha: 0.1); + cursor: pointer; +} + +.main:hover, +.main:hover + .main { + border-color: transparent; +} + +.show-item-wrapper { + display: flex; + flex-direction: row; + align-items: flex-start; + color: $white; + padding: 16px; + + &:hover { + background-color: rgba($color: #fff, $alpha: 0.1); + border-radius: 4px; + } +} + +.thumb { + width: 112px; + height: 112px; + overflow: hidden; + border-radius: 4px; + margin-right: 24px; +} + +.body { + flex: 1; +} + +.title { + h4 { + font-size: 16px; + font-weight: 700; + margin: 0; + } + + &:hover { + text-decoration: underline; + } +} + +.desc { + font-size: 14px; + color: $text-neutral; + line-height: 1.5; + margin: 10px 0 22px; + @include text-line-clamp(2); +} + +.action { + display: flex; + flex-direction: row; + align-items: center; + + .play-btn { + margin-right: 16px; + } + + .release-date { + display: flex; + flex-direction: row; + font-size: 14px; + color: rgba($color: #fff, $alpha: 0.7); + align-items: center; + gap: 4px; + letter-spacing: 1px; + + .dot { + height: 3px; + width: 3px; + border-radius: 500px; + background-color: rgba($color: #fff, $alpha: 0.7); + } + } +} diff --git a/src/components/ShowItem/ShowItem.tsx b/src/components/ShowItem/ShowItem.tsx new file mode 100644 index 0000000..029907e --- /dev/null +++ b/src/components/ShowItem/ShowItem.tsx @@ -0,0 +1,103 @@ +import { CurrentTrack, PlayerContext } from '@/contexts/PlayerContext' +import { ShowItem as ShowItemProps } from '@/types/show' +import { dateFormatConvertor } from '@/utils' +import durationConvertor from '@/utils/durationConvertor' +import classNames from 'classnames/bind' +import { FC, memo, useContext } from 'react' +import Skeleton from 'react-loading-skeleton' +import { useNavigate } from 'react-router-dom' +import { Image, PlayButton } from '../UIs' +import styles from './ShowItem.module.scss' + +const cx = classNames.bind(styles) + +interface ShowItemComponentProps { + isLoading?: boolean + show?: { + name?: string + id?: string + publisher?: string + } + item?: ShowItemProps +} + +const ShowItem: FC = ({ item, show, isLoading }) => { + const { + setQueue, + setCurrentTrack, + setCurrentTrackIndex, + setPlayingType, + calNextTrackIndex, + } = useContext(PlayerContext) + + const navigate = useNavigate() + + const handleClickPlayBtn = (e: React.MouseEvent) => { + e.stopPropagation() + const dataNormalized = { ...item, show } + setQueue([{ ...(dataNormalized as CurrentTrack) }]) + setCurrentTrack({ ...dataNormalized }) + setCurrentTrackIndex(0) + setPlayingType('show') + calNextTrackIndex() + } + + return ( +
+
navigate(`/episode/${item?.id}`)} + className={cx('show-item-wrapper')} + > +
+ {!isLoading ? ( + {item?.name} + ) : ( + + )} +
+
+
+ {!isLoading ? ( +

{item?.name}

+ ) : ( + + )} +
+
+ {!isLoading ? ( + item?.description + ) : ( + + )} +
+ {!isLoading && ( +
+
+ +
+
+ {dateFormatConvertor(item?.release_date)} +
+ + {durationConvertor({ milliseconds: item?.duration_ms, type: 'long' })} + +
+
+ )} +
+
+
+ ) +} + +export default memo(ShowItem) diff --git a/src/components/ShowsList/ShowsList.module.scss b/src/components/ShowsList/ShowsList.module.scss new file mode 100644 index 0000000..af820dc --- /dev/null +++ b/src/components/ShowsList/ShowsList.module.scss @@ -0,0 +1,9 @@ +.shows-list-wrapper { + display: flex; + flex-direction: column; +} + +.title { + font-size: 24px; + +} \ No newline at end of file diff --git a/src/components/ShowsList/ShowsList.tsx b/src/components/ShowsList/ShowsList.tsx new file mode 100644 index 0000000..0150e4d --- /dev/null +++ b/src/components/ShowsList/ShowsList.tsx @@ -0,0 +1,67 @@ +import { FC, memo, useState, useEffect } from 'react' +import styles from './ShowsList.module.scss' +import classNames from 'classnames/bind' +import { ShowData, ShowItem as ShowItemProps } from '@/types/show' +import { ShowItem } from '..' +import { useInView } from 'react-intersection-observer' + +const cx = classNames.bind(styles) + +interface ShowsListProps { + data?: ShowItemProps[] + originalData?: ShowData + isLoading?: boolean +} + +const ShowsList: FC = ({ data, isLoading, originalData }) => { + const [renderNumb, setRenderNumb] = useState(() => { + if ((data?.length ?? 0 < 9) && data?.length) { + return data?.length + } + return 9 + }) + + const { ref, inView } = useInView({ threshold: 0 }) + + useEffect(() => { + if (renderNumb === data?.length) { + return + } + if (inView && data?.length && renderNumb + 10 > data?.length) { + setRenderNumb(data.length) + } else { + setRenderNumb((prev) => prev + 10) + } + }, [inView]) + + return ( +
+

All Episodes

+
+ {!isLoading ? ( + <> + {data?.slice(0, renderNumb)?.map((item) => ( + + ))} +
+ + ) : ( + Array(5) + .fill(0) + .map((item, index) => ) + )} +
+
+ ) +} + +export default memo(ShowsList) diff --git a/src/components/Sidebar/Library/Library.module.scss b/src/components/Sidebar/Library/Library.module.scss index 137ab45..0f14a28 100644 --- a/src/components/Sidebar/Library/Library.module.scss +++ b/src/components/Sidebar/Library/Library.module.scss @@ -2,7 +2,6 @@ @import '../../../scss/animations'; @import '../../../scss/mixin'; - .lib { background-color: $bg-base; display: flex; @@ -50,7 +49,7 @@ &:hover { color: $white; - } + } } } } @@ -77,9 +76,28 @@ &::-webkit-scrollbar { display: none; } - } .bottom-shadow { - box-shadow: 0 6px 10px rgba(0,0,0,.6); -} \ No newline at end of file + box-shadow: 0 6px 10px rgba(0, 0, 0, 0.6); +} + +.lib-notify { + flex: 1; + display: flex; + justify-content: center; + align-items: flex-start; + margin-top: 40px; + overflow: hidden; + + + .content { + font-size: 14px; + color: $text-subdued; + cursor: pointer; + + &:hover { + color: $white; + } + } +} diff --git a/src/components/Sidebar/Library/Library.tsx b/src/components/Sidebar/Library/Library.tsx index 233ba02..99a06d5 100644 --- a/src/components/Sidebar/Library/Library.tsx +++ b/src/components/Sidebar/Library/Library.tsx @@ -1,42 +1,79 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { LibraryIcon } from '@/assets/icons' +import { SidebarItem } from '@/components' +import { AuthContext } from '@/contexts/AuthContext' +import { LibDataItem, LibSelection } from '@/types/sidebar' +import { fetchSidebarData } from '@/utils' import classNames from 'classnames/bind' +import { FC, useContext, useEffect, useMemo, useState } from 'react' import { HiArrowRight, HiOutlinePlus } from 'react-icons/hi' -import { TbPlaylist } from 'react-icons/tb' import styles from './Library.module.scss' -import SidebarItem from '@/components/SidebarItem/SidebarItem' -import { useEffect, useState } from 'react' const cx = classNames.bind(styles) -type LibSelection = Array<{ name: string }> +type libCategory = 'playlist' | 'album' | 'artist' -const Library = () => { - const [category, setCategory] = useState('Playlists') - // const [data, setData] = useState<[]>([]) - const [renderData, setRenderData] = useState<[]>([]) +const Library: FC = () => { + const { userData, isLogged, handleLogin } = useContext(AuthContext) + const [category, setCategory] = useState('playlist') const [bottomShadow, setBottomShadow] = useState(false) + const [data, setData] = useState([]) - const libSelection: LibSelection = [ - { - name: 'Playlists', - }, - { - name: 'Artists', - }, - { - name: 'Albums', - }, - ] + useEffect(() => { + const fetchData = async () => { + const data = await fetchSidebarData({ type: category, userId: userData?.id }) + setData(data) + } + fetchData() + }, [category, userData]) + + const libSelections: LibSelection[] = useMemo( + () => [ + { + type: 'playlist', + title: 'Playlists', + id: '00003', + active: category === 'playlist', + }, + { + type: 'artist', + title: 'Artists', + id: '00004', + active: category === 'artist', + }, + { + type: 'album', + title: 'Albums', + id: '00005', + active: category === 'album', + }, + ], + [category] + ) + + const libSelection = useMemo( + () => libSelections.find((libSelection) => libSelection.active), + [category] + ) + + const libNotify = (type: libCategory): string => { + switch (type) { + case 'playlist': + return 'Log in to view your playlists.' + case 'artist': + return 'Login to view your favorite artists.' + case 'album': + return 'Login to view your albums saved.' + } + } - const handleClick = (type: string): void => { + const handleClick = (type: 'playlist' | 'album' | 'artist'): void => { setCategory(type) } - const handleScroll = ( - e: React.UIEvent - ): void => { + const handleScroll = (e: React.UIEvent): void => { const yAxis = e.currentTarget.scrollTop - // console.log(yAxis) if (yAxis > 0) { setBottomShadow(true) } else { @@ -44,62 +81,12 @@ const Library = () => { } } - useEffect(() => { - (async () => { - const response = await fetch(`data/init${category}.json`) - const data = await response.json() - // setData(data.playlists.items) - setRenderData( - data[`${category.toLowerCase()}`].items.map( - (item: any, index: number) => { - if (category === 'Playlists') { - return ( - - ) - } - - if (category === 'Artists') { - return ( - - ) - } - - if (category === 'Albums') { - return ( - - ) - } - } - ) - ) - })() - }, [category]) - return (
- +

Your Library

@@ -113,21 +100,37 @@ const Library = () => {
-
- {libSelection.map((item, index) => ( - ))}
-
handleScroll(e)} - className={cx('playlist-section')} - > - {renderData} -
+ {isLogged ? ( +
+ {data?.map((item, index: number) => ( + + ))} +
+ ) : ( +
+ + {libNotify(category)} + +
+ )} ) } diff --git a/src/components/Sidebar/Nav/Nav.tsx b/src/components/Sidebar/Nav/Nav.tsx index 4e4ac23..9ecb27f 100644 --- a/src/components/Sidebar/Nav/Nav.tsx +++ b/src/components/Sidebar/Nav/Nav.tsx @@ -1,13 +1,8 @@ -import { useMemo } from 'react' -import styles from './Nav.module.scss' +import { HomeActiveIcon, HomeIcon, SearchActiveIcon, SearchIcon } from '@/assets/icons' import classNames from 'classnames/bind' +import { useMemo } from 'react' import { Link, useLocation } from 'react-router-dom' -import { - RiHome5Fill, - RiHome5Line, - RiSearch2Line, - RiSearchEyeLine, -} from 'react-icons/ri' +import styles from './Nav.module.scss' const cx = classNames.bind(styles) @@ -20,13 +15,13 @@ const Nav = () => { name: 'Home', path: '/', active: pathname === '/', - icons: [RiHome5Fill, RiHome5Line], + icons: [HomeActiveIcon, HomeIcon], }, { name: 'Search', path: '/search', active: pathname === '/search', - icons: [RiSearchEyeLine, RiSearch2Line], + icons: [SearchActiveIcon, SearchIcon], }, ], [pathname] diff --git a/src/components/Sidebar/Sidebar.module.scss b/src/components/Sidebar/Sidebar.module.scss index fcba5c6..0844850 100644 --- a/src/components/Sidebar/Sidebar.module.scss +++ b/src/components/Sidebar/Sidebar.module.scss @@ -1,8 +1,11 @@ @import '../../scss/variable'; .sidebar { - width: max(20%, 280px); + // width: max(20%, 280px); + // max-width: 600px; display: flex; flex-direction: column; gap: $panel-gap; + min-width: 280px; + max-width: 500px; } \ No newline at end of file diff --git a/src/components/Sidebar/Sidebar.tsx b/src/components/Sidebar/Sidebar.tsx index 01cbd27..d13e2d5 100644 --- a/src/components/Sidebar/Sidebar.tsx +++ b/src/components/Sidebar/Sidebar.tsx @@ -1,20 +1,19 @@ -import { FC, ReactNode } from 'react' +import { FC, ReactNode, memo } from 'react' import Library from './Library/Library' import Nav from './Nav/Nav' import styles from './Sidebar.module.scss' - interface SidebarProps { children?: ReactNode } const Sidebar: FC = () => { return ( -
+
+ ) } -export default Sidebar +export default memo(Sidebar) diff --git a/src/components/SidebarItem/SidebarItem.module.scss b/src/components/SidebarItem/SidebarItem.module.scss index 1a2f184..3963cb3 100644 --- a/src/components/SidebarItem/SidebarItem.module.scss +++ b/src/components/SidebarItem/SidebarItem.module.scss @@ -1,15 +1,17 @@ @import '../../scss/variable'; +@import '../../scss/mixin'; .sidebar-item { height: 64px; - display: flex; padding: 8px; align-items: inherit; - background-color: transparent; gap: $panel-gap; border-radius: 6px; transition: all .1s ease; cursor: pointer; + display: grid; + grid-template-columns: 48px auto; + &:hover { background-color: $bg-highlight; @@ -18,10 +20,9 @@ .thumbnail { height: 100%; aspect-ratio: 1 / 1; - background-position: center; - background-repeat: no-repeat; - background-size: cover; + object-fit: cover; border-radius: 4px; + overflow: hidden; } .body { @@ -45,6 +46,7 @@ font-size: 1.2rem; font-weight: 400; color: $text-subdued; + @include text-in-one-line; } } } \ No newline at end of file diff --git a/src/components/SidebarItem/SidebarItem.tsx b/src/components/SidebarItem/SidebarItem.tsx index fbd9846..4a6b5e4 100644 --- a/src/components/SidebarItem/SidebarItem.tsx +++ b/src/components/SidebarItem/SidebarItem.tsx @@ -1,36 +1,36 @@ import classNames from 'classnames/bind' import { FC } from 'react' +import { Link } from 'react-router-dom' +import { Image, SubTitle, ThumbDefault } from '../UIs' import styles from './SidebarItem.module.scss' +import { SidebarItemProps } from '@/types/sidebar' const cx = classNames.bind(styles) -interface SidebarItemProps { - type: 'playlist' | 'artist' | 'album' - thumbnail: string | null - name: string | null - -} - const SidebarItem: FC = (props) => { - const {type, thumbnail, name} = props + const { type, thumbnail, name, author, id, artists } = props const newType = (() => { - if(type === 'playlist') return 'Playlist' - if(type === 'artist') return 'Artist' - if(type === 'album') return 'Album' + if (type === 'playlist') return author + if (type === 'artist') return 'Artist' + if (type === 'album' && artists) return })() return ( -
-
-
-

{name}

- - {newType} - -
+
+ +
+
+ {thumbnail ? {name} : } +
+
+

{name}

+ {newType} +
+
+
) } -export default SidebarItem \ No newline at end of file +export default SidebarItem diff --git a/src/components/SongItem/SongItem.module.scss b/src/components/SongItem/SongItem.module.scss new file mode 100644 index 0000000..0799c70 --- /dev/null +++ b/src/components/SongItem/SongItem.module.scss @@ -0,0 +1,170 @@ +@import '../../scss/variable'; +@import '../../scss/mixin'; + +.wrapper { + display: grid; + grid-template-columns: 16px minmax(300px, 6fr) 4fr 3fr 50px; + grid-gap: 16px; + height: 56px; + padding-inline: 16px; + align-items: center; + border-radius: 4px; + + &:hover { + background-color: hsla(0, 0%, 100%, 0.1); + cursor: pointer; + + .order-icon { + opacity: 1; + } + + .order-number { + opacity: 0; + } + } +} + +.main { + display: flex; + align-items: center; + gap: 16px; + padding-right: 8px; + + .thumb { + height: 40px; + width: 40px; + aspect-ratio: 1 / 1; + overflow: hidden; + + .default-thumb { + @include default-thumb; + color: $text-neutral; + } + + span { + display: block; + width: 100%; + height: 100%; + } + + img { + width: 100%; + height: 100%; + } + } + + .title { + display: flex; + flex-direction: column; + justify-content: space-between; + height: 100%; + gap: 5px; + flex: 1; + overflow: hidden; + + .name { + color: $white; + font-size: 16px; + padding: 0; + margin: 0; + -webkit-line-clamp: 1; + -webkit-box-orient: vertical; + display: -webkit-box; + white-space: unset; + word-break: break-all; + overflow: hidden; + text-overflow: ellipsis; + } + + .sub-title { + display: flex; + align-items: center; + gap: 3px; + width: 100%; + @include text-in-one-line; + } + + .explicit { + font-size: 9px; + padding: 3px 6px; + text-transform: uppercase; + background-color: hsla(0, 0%, 100%, 0.6); + color: $bg-base; + border-radius: 2px; + margin-right: 8px; + } + } +} + +.album { + -webkit-line-clamp: 1; + -webkit-box-orient: vertical; + display: -webkit-box; + white-space: unset; + word-break: break-all; + overflow: hidden; + text-overflow: ellipsis; +} + +.order { + font-size: 16px; + color: $text-neutral; + position: relative; + + &-number { + opacity: 1; + z-index: -1; + } + + &-icon { + @include button-icon(28px, transparent, transparent); + color: #fff; + opacity: 0; + position: absolute; + top: -5px; + right: -3px; + transition: none; + } + + .equaliser { + width: 14px; + height: 14px; + overflow: hidden; + + & > img { + width: 100%; + height: 100%; + } + } +} + +.album, +.date-add, +.duration { + font-size: 14px; + color: $text-neutral; +} + +.duration { + text-align: end; + transform: translateX(-10px); +} + +.grid-md { + grid-template-columns: 16px minmax(300px, 4fr) 2fr 50px !important; +} + +.is-album-track { + grid-template-columns: 16px minmax(300px, 4fr) 50px !important; +} + +.is-search-result { + grid-template-columns: minmax(300px, 4fr) 50px !important; +} + +.is-playing { + .order-number, + .name { + color: $tertiary !important; + } +} diff --git a/src/components/SongItem/SongItem.tsx b/src/components/SongItem/SongItem.tsx new file mode 100644 index 0000000..ffcf63a --- /dev/null +++ b/src/components/SongItem/SongItem.tsx @@ -0,0 +1,146 @@ +import { PlayIcon, SingleMusicNote } from '@/assets/icons' +import { MainLayoutContext } from '@/contexts/MainLayoutContext' +import { PlayerContext } from '@/contexts/PlayerContext' +import { SongItemProps } from '@/types/track' +import { dateFormatConvertor } from '@/utils' +import durationConvertor from '@/utils/durationConvertor' +import classNames from 'classnames/bind' +import React, { memo, useContext } from 'react' +import Skeleton from 'react-loading-skeleton' +import { Image, SubTitle } from '../UIs' +import styles from './SongItem.module.scss' +import equaliser from '@/assets/image/animation/equaliser-animated-green.f5eb96f2.gif' + +const cx = classNames.bind(styles) + +const SongItem: React.FC = ({ + songName, + artists, + thumb, + duration = 0, + order, + isLoading = false, + dateAdd, + albumData, + isExplicit = false, + type = 'default', + originalData, +}) => { + const { width } = useContext(MainLayoutContext) + const { + setCurrentTrack, + setQueue, + setCurrentTrackIndex, + calNextTrackIndex, + setPlayingType, + queue, + isPlaying, + currentTrack, + } = useContext(PlayerContext) + + const handleClick = (e: React.MouseEvent) => { + e.stopPropagation() + if (currentTrack?.id === originalData?.id) return + const indexOfTrackInQueue = queue.findIndex((item) => item?.id === originalData?.id) + if (indexOfTrackInQueue === -1) { + setQueue(originalData ? [{ ...originalData }] : []) + setCurrentTrack({ ...originalData }) + setCurrentTrackIndex(0) + calNextTrackIndex() + } else { + setCurrentTrack({ ...originalData }) + setCurrentTrackIndex(indexOfTrackInQueue) + calNextTrackIndex() + } + if (originalData?.album) { + setPlayingType('track') + } else { + setPlayingType('show') + } + } + + return ( +
handleClick(e)} + className={cx({ + wrapper: true, + 'grid-md': width <= 780 && type !== 'album', + 'is-album-track': type === 'album', + 'is-search-result': type === 'search', + 'is-playing': currentTrack?.id === originalData?.id, + })} + > + {type !== 'search' && ( +
+ {!isLoading && + (isPlaying && currentTrack?.id === originalData?.id ? ( +
+ equaliser +
+ ) : ( + <> + {order} + + + ))} +
+ )} +
+ {type !== 'album' && ( +
+ {!isLoading ? ( + thumb ? ( + {songName} + ) : ( +
+ +
+ ) + ) : ( + + )} +
+ )} +
+ {!isLoading ? ( + <> +

{songName}

+ {type !== 'artist' && ( +
+ {isExplicit && E} + +
+ )} + + ) : ( + <> + + + + )} +
+
+ {type !== 'album' && type !== 'search' && ( + <> +
+ {!isLoading && } +
+ {width > 780 && ( +
+ {dateAdd !== '1970-01-01T00:00:00Z' && dateAdd + ? dateFormatConvertor(dateAdd) + : ''} +
+ )} + + )} +
+ {!isLoading && durationConvertor({ milliseconds: duration })} +
+
+ ) +} + +export default memo(SongItem) diff --git a/src/components/SongItemTag/SongItemTag.module.scss b/src/components/SongItemTag/SongItemTag.module.scss index 2ff0e85..e490a44 100644 --- a/src/components/SongItemTag/SongItemTag.module.scss +++ b/src/components/SongItemTag/SongItemTag.module.scss @@ -11,28 +11,38 @@ border-radius: 4px; overflow: hidden; position: relative; + color: $white; + transition: all .3s ease; + cursor: pointer; &:hover .body .play-btn { opacity: 1; } + + &:hover { + background-color: $bg-card-highlight; + } } .thumbnail { height: 100%; aspect-ratio: 1 / 1; - background-position: center; - background-repeat: no-repeat; - background-size: cover; + + img { + height: 100%; + width: 100%; + object-fit: cover; + } } .body { - padding-inline: 16px; + margin-inline: 16px; flex: 1; display: flex; align-items: center; justify-content: space-between; gap: 16px; - + position: relative; &-name { flex: 1; @@ -46,34 +56,12 @@ font-weight: 700; } - - .play-btn { - @include button-icon(50px, $primary, $primary); opacity: 0; - font-size: 24px; - transition: opacity .2s ease, scale .1s ease; - box-shadow: 0 8px 8px rgba(0, 0, 0, .3); - - - // &-child { - // position: absolute; - // top: 50%; - // left: 50%; - // transform: translate(-40%, -50%); - // } - - &:hover { - scale: 1.1; - } - - // @include responsive(md) { - // display: none; - // } - - &-hidden { - display: none; - } - + transition: all .3s ease; } +} + +.hidden { + display: none !important; } \ No newline at end of file diff --git a/src/components/SongItemTag/SongItemTag.tsx b/src/components/SongItemTag/SongItemTag.tsx index 209636d..3562e1c 100644 --- a/src/components/SongItemTag/SongItemTag.tsx +++ b/src/components/SongItemTag/SongItemTag.tsx @@ -1,55 +1,121 @@ -import useDominantColor from '@/hooks/useDominantColor' +import categoryApi from '@/apis/categoryApi' +import { PlayerContext } from '@/contexts/PlayerContext' +import useComponentSize from '@/hooks/useComponentSize' +import { SpotifyAlbum } from '@/types/album' +import { SongItemTagProps, SpotifyTrack } from '@/types/track' import classNames from 'classnames/bind' -import React, { useRef } from 'react' -import { TbPlayerPlayFilled } from 'react-icons/tb' +import { usePalette } from 'color-thief-react' +import React, { useContext, useRef } from 'react' +import Skeleton from 'react-loading-skeleton' +import { useNavigate } from 'react-router-dom' +import { Image, PlayButton } from '../UIs' import styles from './SongItemTag.module.scss' -import useComponentSize from '@/hooks/useComponentSize' const cx = classNames.bind(styles) -interface SongItemTagProps { - thumbnailUrl?: string - name: string - setBgColor: React.Dispatch> -} - const SongItemTag: React.FC = (props) => { - const { thumbnailUrl, name, setBgColor } = props - const color = useDominantColor(thumbnailUrl) + const { thumbnailUrl, name, setBgColor, isLoading, id } = props + const { + setCurrentTrack, + setCurrentTrackIndex, + setQueue, + calNextTrackIndex, + setPlayingType, + } = useContext(PlayerContext) + // const color = useDominantColor(thumbnailUrl) + + const { data: dataColor } = usePalette(thumbnailUrl as string, 10, 'hex', { + crossOrigin: 'Anonymous', + quality: 100, + }) + + const color = dataColor?.[2] ?? '#121212' + + const imgRef = useRef(null) const handleHover = (): void => { - setBgColor(color) + setBgColor(color as string) } + const navigate = useNavigate() + const songTagRef = useRef(null) const { width } = useComponentSize(songTagRef) - // console.log('im here') + const handleClickPlayBtn = () => { + const fetchData = async () => { + const data: SpotifyAlbum = await categoryApi({ + type: 'albums', + id: id, + }) + + const queueList = + data?.tracks?.items?.map((item: SpotifyTrack) => { + return { + ...item, + album: { + images: data?.images, + id: data?.id, + album_type: data?.album_type, + name: data?.name, + }, + } + }) || [] + setQueue([...queueList]) + setCurrentTrack({ ...queueList[0] }) + setCurrentTrackIndex(0) + calNextTrackIndex() + setPlayingType('track') + } + fetchData() + } return (
setBgColor('#c0b8c1')} + onMouseLeave={() => setBgColor('#e0e0e0')} className={cx('song-item-tag')} + onClick={() => navigate(`/album/${id}`)} > -
+
+ {!isLoading ? ( + // {name} + {name} + ) : ( + + )} +
-

{name}

- + {!isLoading ? ( + <> +

{name}

+
{ + e.stopPropagation() + handleClickPlayBtn() + }} + > + +
+ + ) : ( + + )}
) } -export default SongItemTag \ No newline at end of file +export default SongItemTag diff --git a/src/components/SongList/SongList.module.scss b/src/components/SongList/SongList.module.scss new file mode 100644 index 0000000..3ed8ead --- /dev/null +++ b/src/components/SongList/SongList.module.scss @@ -0,0 +1,52 @@ +@import '../../scss/variable'; + +.wrapper { + position: relative; + + .freeze-top-row { + display: grid; + // grid-template-columns: 16px 6fr 4fr 3fr 50px; + grid-template-columns: 16px minmax(300px, 6fr) 4fr 3fr 50px; + grid-gap: 16px; + padding-inline: 40px; + margin-inline: -24px; + height: 36px; + border-bottom: 1px solid hsla(0, 0%, 100%, .1); + align-items: center; + position: -webkit-sticky; + position: sticky; + z-index: 7; + transform: translateZ(10px); + + div { + color: $text-neutral; + font-size: 14px; + } + + .clock-icon { + display: flex; + justify-content: center; + transform: translateX(-5px); + } + } + + .songs { + display: flex; + flex-direction: column; + padding-top: 16px; + } + + .stuck { + background-color: $bg-highlight; + box-shadow: 0 -1px 0 0 #181818; + -webkit-box-shadow: 0 -1px 0 0 #181818; + } +} + +.grid-md { + grid-template-columns: 16px minmax(300px, 4fr) 2fr 50px !important; +} + +.is-album-track { + grid-template-columns: 16px 4fr 50px !important; +} \ No newline at end of file diff --git a/src/components/SongList/SongList.tsx b/src/components/SongList/SongList.tsx new file mode 100644 index 0000000..0b20d97 --- /dev/null +++ b/src/components/SongList/SongList.tsx @@ -0,0 +1,154 @@ +/* eslint-disable react-refresh/only-export-components */ +import { FC, memo, useContext, useEffect, useState } from 'react' +import styles from './SongList.module.scss' +import classNames from 'classnames/bind' +import SongItem from '../SongItem/SongItem' +import { MainLayoutContext } from '@/contexts/MainLayoutContext' +import { useInView } from 'react-intersection-observer' +import { ClockIcon } from '@/assets/icons' +import { SongListProps } from '@/types/track' +import { PlayerContext } from '@/contexts/PlayerContext' + +const cx = classNames.bind(styles) + +const SongList: FC = ({ + songList, + pivotTop, + isLoading = false, + top, + type = 'default', + albumId, + albumImages, + inclHeader = true, + albumName, + albumType, + adjustOrder = 0, +}) => { + const { width } = useContext(MainLayoutContext) + const { playingType } = useContext(PlayerContext) + const [renderNumb, setRenderNumb] = useState(() => { + if ((songList?.length ?? 0 < 9) && songList?.length) return songList.length + return 9 + }) + + const { ref, inView } = useInView({ threshold: 0 }) + + const { ref: lazyRenderRef, inView: lazyRenderInView } = useInView({ + threshold: 0, + }) + + useEffect(() => { + if (renderNumb === songList?.length) { + return + } + if (lazyRenderInView && songList?.length && renderNumb + 10 > songList?.length) { + setRenderNumb(songList.length) + } else { + setRenderNumb((prev) => prev + 10) + } + }, [lazyRenderInView]) + + return ( +
+ {inclHeader && ( + <> +
+
+ {type !== 'album' ? ( + <> + {' '} +
#
+
Title
+
Album
+ {width > 780 &&
Date added
} +
+ +
{' '} + + ) : ( + <> +
#
+
Title
+
+ +
+ + )} +
+ + )} +
+ {(() => { + let order = 1 + if (!isLoading) { + return ( + <> + {songList?.slice(0, renderNumb)?.map((item: any, index: number) => ( + + ))} +
+ + ) + } else { + return Array(9) + ?.fill(0) + ?.map((item, index) => ( + + )) + } + })()} +
+
+ ) +} + +export default memo(SongList) diff --git a/src/components/TopTracks/TopTracks.module.scss b/src/components/TopTracks/TopTracks.module.scss new file mode 100644 index 0000000..9f0bcbf --- /dev/null +++ b/src/components/TopTracks/TopTracks.module.scss @@ -0,0 +1,38 @@ +@import '../../scss/variable'; + +.wrapper { + position: relative; + z-index: 1; + padding-inline: $col-gap; + display: flex; + flex-direction: column; +} + +.title { + margin: 2px 0 10px; + + h2 { + margin: 0; + font-size: 24px; + } +} + +.show-more-btn { + color: hsla(0,0%,100%,.7); + cursor: pointer; + margin: 4px 0; + + button { + background: none; + border: none; + font-size: 14px; + color: hsla(0,0%,100%,.7); + padding: 16px; + cursor: pointer; + + &:hover { + color: $white; + } + } + +} \ No newline at end of file diff --git a/src/components/TopTracks/TopTracks.tsx b/src/components/TopTracks/TopTracks.tsx new file mode 100644 index 0000000..9828b10 --- /dev/null +++ b/src/components/TopTracks/TopTracks.tsx @@ -0,0 +1,58 @@ +import { SpotifyTrack } from '@/types/track' +import classNames from 'classnames/bind' +import { FC, memo, useState } from 'react' +import { SongItem } from '..' +import styles from './TopTracks.module.scss' + +const cx = classNames.bind(styles) + +interface TopTrackProps { + songList?: SpotifyTrack[] + isLoading?: boolean +} + +const TopTrack: FC = ({ songList, isLoading }) => { + const [isLess, setLess] = useState(true) + + + return ( +
+
+

Popular

+
+
+ {!isLoading + ? songList + ?.slice(0, isLess ? 5 : 10) + .map((item, index: number) => ( + + )) + : Array(10) + .fill(0) + ?.slice(0, isLess ? 5 : 10) + .map((item: any, index: number) => ( + + ))} +
+ {songList?.length && songList?.length > 5 && ( +
+ +
+ )} +
+ ) +} + +export default memo(TopTrack) diff --git a/src/components/UIs/ArtistCityStats/ArtistCityStats.module.scss b/src/components/UIs/ArtistCityStats/ArtistCityStats.module.scss new file mode 100644 index 0000000..532f8eb --- /dev/null +++ b/src/components/UIs/ArtistCityStats/ArtistCityStats.module.scss @@ -0,0 +1,18 @@ +@import '../../../scss/variable'; + +.wrapper { + display: flex; + flex-direction: column; + font-size: 14px; + margin-bottom: 16px; +} + +.city { + font-weight: 700; + color: $white; + margin: 0 0 6px; +} + +.number-of-listeners { + color: $text-neutral; +} diff --git a/src/components/UIs/ArtistCityStats/ArtistCityStats.tsx b/src/components/UIs/ArtistCityStats/ArtistCityStats.tsx new file mode 100644 index 0000000..e46504c --- /dev/null +++ b/src/components/UIs/ArtistCityStats/ArtistCityStats.tsx @@ -0,0 +1,17 @@ +import { FC } from 'react' +import styles from './ArtistCityStats.module.scss' +import classNames from 'classnames/bind' +import { ArtistTopCity } from '@/types/artist' + +const cx = classNames.bind(styles) + +const ArtistCityStats: FC = ({ city, country, numberOfListeners }) => { + return ( +
+

{`${city}, ${country}`}

+ {`${numberOfListeners?.toLocaleString()} listeners`} +
+ ) +} + +export default ArtistCityStats diff --git a/src/components/UIs/Image/Image.module.scss b/src/components/UIs/Image/Image.module.scss new file mode 100644 index 0000000..abd3993 --- /dev/null +++ b/src/components/UIs/Image/Image.module.scss @@ -0,0 +1,33 @@ +@import '../../../scss/variable'; + +.wrapper { + width: 100%; + height: 100%; + position: relative; + + img { + width: 100%; + height: 100%; + object-fit: cover; + animation: brighten-up 0.2s; + } +} + +.overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + opacity: 0.25; +} + +@keyframes brighten-up { + 0% { + filter: brightness(0.3); + } + + 100% { + filter: brightness(1); + } +} diff --git a/src/components/UIs/Image/Image.tsx b/src/components/UIs/Image/Image.tsx new file mode 100644 index 0000000..bc57226 --- /dev/null +++ b/src/components/UIs/Image/Image.tsx @@ -0,0 +1,59 @@ +import { FC, useEffect, useState } from 'react' +import { useInView } from 'react-intersection-observer' +import Skeleton from 'react-loading-skeleton' +import styles from './Image.module.scss' + +interface ImageLazyProps { + src?: string + alt?: string + inclSkeleton?: boolean + colorRaw?: string +} + +const ImageLazy: FC = (props) => { + const { src = '', alt = '', inclSkeleton = true, colorRaw = '' } = props + const [isLoading, setLoading] = useState(true) + const [mounted, setMounted] = useState(false) + + const { ref, inView } = useInView({ threshold: 0, triggerOnce: true }) + + useEffect(() => { + if (inView && !mounted) { + setMounted(true) + } + }, [inView]) + + useEffect(() => { + if (mounted) { + const img = new Image() + img.src = src + img.onload = () => { + setLoading(false) + } + } + }, [src, mounted]) + + return ( +
+
+ {inclSkeleton ? ( + + ) : ( +
+ )} +
+ {alt} +
+ ) +} + +export default ImageLazy diff --git a/src/components/UIs/PlayButton/PlayButton.module.scss b/src/components/UIs/PlayButton/PlayButton.module.scss new file mode 100644 index 0000000..4895024 --- /dev/null +++ b/src/components/UIs/PlayButton/PlayButton.module.scss @@ -0,0 +1,25 @@ +@import '../../../scss/variable'; + +.wrapper { +} + +.play-btn { + position: relative; + font-size: 24px; + box-shadow: 0 8px 8px rgba(0, 0, 0, 0.3); + color: $black; + border: none; + cursor: pointer; + transition: all ease-in-out 0.2s; + display: flex; + justify-content: center; + align-items: center; + background-color: $primary; + transform-origin: center; + outline: none; + opacity: 0.95; + + &-child { + font-size: 28px; + } +} diff --git a/src/components/UIs/PlayButton/PlayButton.tsx b/src/components/UIs/PlayButton/PlayButton.tsx new file mode 100644 index 0000000..eff85ff --- /dev/null +++ b/src/components/UIs/PlayButton/PlayButton.tsx @@ -0,0 +1,67 @@ +import { FC, useState, memo } from 'react' +import styles from './PlayButton.module.scss' +import classNames from 'classnames/bind' +import { TbPlayerPlayFilled } from 'react-icons/tb' +import { GiPauseButton } from 'react-icons/gi' + +const cx = classNames.bind(styles) + +interface PlayButtonProps { + size: number + fontSize?: number + transitionDuration?: number //ms + scaleHovering?: number + bgColor?: string + isPlay?: boolean +} + +const PlayButton: FC = (props) => { + const { + size, + fontSize, + transitionDuration, + scaleHovering, + bgColor, + isPlay = false, + } = props + const [isHovering, setHovering] = useState(false) + + return ( +
setHovering(true)} + onMouseLeave={() => setHovering(false)} + > + +
+ ) +} + +export default memo(PlayButton) diff --git a/src/components/UIs/Range/Range.module.scss b/src/components/UIs/Range/Range.module.scss new file mode 100644 index 0000000..1f726ca --- /dev/null +++ b/src/components/UIs/Range/Range.module.scss @@ -0,0 +1,47 @@ +@import '../../../scss/variable'; + +.wrapper { + height: 4px; + width: 100%; + background-color: rgba($color: #fff, $alpha: 0.3); + border-radius: 2px; + position: relative; + + .process-bar { + width: 100%; + height: 100%; + background-color: $white; + border-radius: 50px; + } + + &:hover .process-bar { + background-color: $secondary; + } + + &:hover .controls { + opacity: 1; + } +} + +.controls { + position: absolute; + top: 0; + width: 100%; + height: 100%; + right: 0; + background-color: transparent; + outline: none; + appearance: none; + cursor: pointer; + opacity: 0; + + &::-webkit-slider-thumb { + -webkit-appearance: none; + appearance: none; + width: 12px; + height: 12px; + background: $white; + cursor: pointer; + border-radius: 50%; + } +} diff --git a/src/components/UIs/Range/Range.tsx b/src/components/UIs/Range/Range.tsx new file mode 100644 index 0000000..316b549 --- /dev/null +++ b/src/components/UIs/Range/Range.tsx @@ -0,0 +1,51 @@ +import classNames from 'classnames/bind' +import React, { FC } from 'react' +import styles from './Range.module.scss' + +const cx = classNames.bind(styles) + +interface RangeProps { + maxValue?: number + step?: number + process?: number + handleChange: (e: React.ChangeEvent) => void + handleMouseUp: ( + e?: React.MouseEvent | React.TouchEvent + ) => void +} + +const Range: FC = ({ + maxValue, + step, + process, + handleChange, + handleMouseUp, +}) => { + return ( +
+
+
+
+ +
+ ) +} + +export default Range diff --git a/src/components/UIs/SubTitle/SubTitle.module.scss b/src/components/UIs/SubTitle/SubTitle.module.scss new file mode 100644 index 0000000..6274e6f --- /dev/null +++ b/src/components/UIs/SubTitle/SubTitle.module.scss @@ -0,0 +1,39 @@ +@import '../../../scss/variable'; +@import '../../../scss/mixin'; + +.artists { + font-size: 14px; + color: $text-neutral; + display: flex; + gap: 3px; + overflow: hidden; + width: 100%; + @include text-in-one-line; + flex: 1; + + .artist-item { + font-size: 14px; + color: $text-neutral; + + + &:hover { + text-decoration: underline; + color: $white; + } + } +} + +.artist-item { + font-size: 14px; + color: $text-neutral; + + + &:hover { + text-decoration: underline; + color: $white; + } +} + +.white-color { + color: $white !important; +} \ No newline at end of file diff --git a/src/components/UIs/SubTitle/SubTitle.tsx b/src/components/UIs/SubTitle/SubTitle.tsx new file mode 100644 index 0000000..86b50e1 --- /dev/null +++ b/src/components/UIs/SubTitle/SubTitle.tsx @@ -0,0 +1,120 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +import classNames from 'classnames/bind' +import { FC, Fragment } from 'react' +import { Link } from 'react-router-dom' +import styles from './SubTitle.module.scss' + +const cx = classNames.bind(styles) + +interface ArtistsProps { + data: any + isWhiteColor?: boolean + type?: 'artist' | 'album' | 'show' + apiType?: 'spotify' | 'rapid' + fontSize?: number +} + +const Artists: FC = ({ + data, + isWhiteColor, + type = 'artist', + fontSize, + apiType = 'spotify', +}) => { + const renderData: any[] = [] + let dataNormalized: any + + if (apiType === 'rapid') { + if (type === 'artist') { + dataNormalized = data?.items?.map((item: any) => { + return { + id: item.uri.split(':').pop(), + name: item.profile.name, + } + }) + } + } else { + dataNormalized = data + } + + if (dataNormalized) { + if (dataNormalized.length === 1) { + renderData.push( + + + {dataNormalized?.[0]?.name} + + + ) + } else { + for (let i = 0; i < dataNormalized.length - 1; i++) { + renderData.push( + + + + {dataNormalized[i]?.name} + + + {', '} + + ) + } + + renderData.push( + + + + {dataNormalized[dataNormalized?.length - 1]?.name} + + + + ) + } + } + + return ( +
e.stopPropagation()} className={cx('artists')}> + {renderData} +
+ ) +} + +export default Artists diff --git a/src/components/UIs/ThumbDefault/ThumbDefault.module.scss b/src/components/UIs/ThumbDefault/ThumbDefault.module.scss new file mode 100644 index 0000000..a19da31 --- /dev/null +++ b/src/components/UIs/ThumbDefault/ThumbDefault.module.scss @@ -0,0 +1,14 @@ +@import '../../../scss/variable'; + +.wrapper { + width: 100%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; + background-color: $bg-card-highlight; + + .icon { + color: $text-neutral; + } +} diff --git a/src/components/UIs/ThumbDefault/ThumbDefault.tsx b/src/components/UIs/ThumbDefault/ThumbDefault.tsx new file mode 100644 index 0000000..21b1374 --- /dev/null +++ b/src/components/UIs/ThumbDefault/ThumbDefault.tsx @@ -0,0 +1,18 @@ +import { FC } from 'react' +import styles from './ThumbDefault.module.scss' +import classNames from 'classnames/bind' +import { MusicNote } from '@/assets/icons' + +const cx = classNames.bind(styles) + +const ThumbDefault: FC = () => { + return ( +
+
+ +
+
+ ) +} + +export default ThumbDefault diff --git a/src/components/UIs/index.ts b/src/components/UIs/index.ts new file mode 100644 index 0000000..a10fbc4 --- /dev/null +++ b/src/components/UIs/index.ts @@ -0,0 +1,7 @@ +import SubTitle from './SubTitle/SubTitle' +import PlayButton from './PlayButton/PlayButton' +import Image from './Image/Image' +import Range from './Range/Range' +import ThumbDefault from './ThumbDefault/ThumbDefault' + +export { SubTitle, PlayButton, Image, Range, ThumbDefault } diff --git a/src/components/index.ts b/src/components/index.ts new file mode 100644 index 0000000..172c8f6 --- /dev/null +++ b/src/components/index.ts @@ -0,0 +1,51 @@ +import Section from './Section/Section' +import Footer from './Footer/Footer' +import Greeting from './Greeting/Greeting' +import Header from './Header/Header' +import Navbar from './Navbar/Navbar' +import Alert from './Alert/Alert' +import SearchBanner from './SearchBanner/SearchBanner' +import SectionItem from './SectionItem/SectionItem' +import Sidebar from './Sidebar/Sidebar' +import SidebarItem from './SidebarItem/SidebarItem' +import SongItem from './SongItem/SongItem' +import SongItemTag from './SongItemTag/SongItemTag' +import ArtistList from './Header/ArtistList/ArtistList' +import SearchResult from './SearchResult/SearchResult' +import SongList from './SongList/SongList' +import TopTracks from './TopTracks/TopTracks' +import Discography from './Discography/Discography' +import AboutArtist from './AboutArtist/AboutArtist' +import ArtistModal from './ArtistModal/ArtistModal' +import AudioPlayer from './AudioPlayer/AudioPlayer' +import AboutShow from './AboutShow/AboutShow' +import ShowsList from './ShowsList/ShowsList' +import ShowItem from './ShowItem/ShowItem' +import PlayingView from './PlayingView/PlayingView' + +export { + Section, + Footer, + Greeting, + Header, + Navbar, + Alert, + SearchBanner, + SectionItem, + Sidebar, + SidebarItem, + SongItem, + SongItemTag, + ArtistList, + SearchResult, + SongList, + TopTracks, + Discography, + AboutArtist, + ArtistModal, + AudioPlayer, + AboutShow, + ShowsList, + ShowItem, + PlayingView, +} diff --git a/src/config/spotify.ts b/src/config/spotify.ts new file mode 100644 index 0000000..68d069b --- /dev/null +++ b/src/config/spotify.ts @@ -0,0 +1,28 @@ +const scopes = [ + 'ugc-image-upload', + 'user-read-playback-state', + 'user-modify-playback-state', + 'user-read-currently-playing', + 'app-remote-control', + 'streaming', + 'playlist-read-private', + 'playlist-read-collaborative', + 'playlist-modify-private', + 'playlist-modify-public', + 'user-follow-modify', + 'user-follow-read', + 'user-read-playback-position', + 'user-top-read', + 'user-read-recently-played', + 'user-library-modify', + 'user-library-read', + 'user-read-email', + 'user-read-private', + // --- + // 'user-self-provisioning', + // 'openid', + // 'profile', + // 'email', +].join(' ') + +export { scopes } diff --git a/src/constants/auth.ts b/src/constants/auth.ts new file mode 100644 index 0000000..68cec6d --- /dev/null +++ b/src/constants/auth.ts @@ -0,0 +1,6 @@ +import { scopes } from '@/config/spotify' + +export const END_POINT = 'https://accounts.spotify.com/authorize' +export const RESPONSE_TYPE = 'code' +export const SCOPE = scopes +export const REDIRECT_URI = `${window.location.origin}/` diff --git a/src/constants/index.ts b/src/constants/index.ts new file mode 100644 index 0000000..3e28335 --- /dev/null +++ b/src/constants/index.ts @@ -0,0 +1,163 @@ +import { BsFacebook } from 'react-icons/bs' +import { FaGithub, FaInstagram } from 'react-icons/fa' + + +export const socialNetworkLinks = [ + { + title: 'Facebook', + link: 'https://www.facebook.com/tuan204.dev', + icon: BsFacebook, + }, + { + title: 'Instagram', + link: 'https://www.instagram.com/tuan204.dev/', + icon: FaInstagram, + }, + { + title: 'Github', + link: 'https://github.com/tuan204-dev', + icon: FaGithub, + }, +] + + +export const bottomLinks = [ + { + title: 'Legal', + href: 'https://www.facebook.com/tuan204.dev', + }, + { + title: 'Privacy Center', + href: 'https://www.facebook.com/tuan204.dev', + }, + { + title: 'Privacy Policy', + href: 'https://www.facebook.com/tuan204.dev', + }, + { + title: 'Cookies', + href: 'https://www.facebook.com/tuan204.dev', + }, + { + title: 'About Ads', + href: 'https://www.facebook.com/tuan204.dev', + }, + { + title: 'Accessibility', + href: 'https://www.facebook.com/tuan204.dev', + }, +] + +export const topLinkGroups = [ + { + title: 'Company', + links: [ + { + title: 'About', + href: 'https://www.facebook.com/tuan204.dev', + dataAttributes: { + 'data-ga-category': 'menu', + 'data-ga-action': 'about', + }, + }, + { + title: 'Jobs', + href: 'https://www.facebook.com/tuan204.dev', + dataAttributes: { + 'data-ga-category': 'menu', + 'data-ga-action': 'jobs', + }, + }, + { + title: 'For the Record', + href: 'https://www.facebook.com/tuan204.dev', + dataAttributes: { + 'data-ga-category': 'menu', + 'data-ga-action': 'press', + }, + }, + ], + }, + { + title: 'Communities', + links: [ + { + title: 'For Artists', + href: 'https://www.facebook.com/tuan204.dev', + dataAttributes: { + 'data-ga-category': 'menu', + 'data-ga-action': 'artists', + }, + }, + { + title: 'Developers', + href: 'https://www.facebook.com/tuan204.dev', + dataAttributes: { + 'data-ga-category': 'menu', + 'data-ga-action': 'developers', + }, + }, + { + title: 'Advertising', + href: 'https://www.facebook.com/tuan204.dev', + dataAttributes: { + 'data-ga-category': 'menu', + 'data-ga-action': 'advertising', + }, + }, + { + title: 'Investors', + href: 'https://www.facebook.com/tuan204.dev', + dataAttributes: { + 'data-ga-category': 'menu', + 'data-ga-action': 'investors', + }, + }, + { + title: 'Vendors', + href: 'https://www.facebook.com/tuan204.dev', + dataAttributes: { + 'data-ga-category': 'menu', + 'data-ga-action': 'vendors', + }, + }, + { + title: 'Spotify for Work', + href: 'https://www.facebook.com/tuan204.dev', + dataAttributes: { + 'data-ga-category': 'menu', + 'data-ga-action': 'spotify_for_work', + }, + }, + ], + }, + { + title: 'Useful links', + links: [ + { + title: 'Support', + href: 'https://www.facebook.com/tuan204.dev', + dataAttributes: { + 'data-ga-category': 'menu', + 'data-ga-action': 'help', + }, + }, + { + title: 'Web Player', + href: 'https://www.facebook.com/tuan204.dev', + dataAttributes: { + 'data-ga-category': 'menu', + 'data-ga-action': 'play', + }, + }, + { + title: 'Free Mobile App', + href: 'https://www.facebook.com/tuan204.dev', + dataAttributes: { + 'data-ga-category': 'menu', + 'data-ga-action': 'free', + }, + }, + ], + }, +] diff --git a/src/contexts/ArtistContext.tsx b/src/contexts/ArtistContext.tsx new file mode 100644 index 0000000..72267bf --- /dev/null +++ b/src/contexts/ArtistContext.tsx @@ -0,0 +1,134 @@ +import artistApi from '@/apis/artistApi' +import { ArtistModal } from '@/components' +import { ArtistProfile } from '@/types/artist' +import { RapidArtistTrack, SpotifyTrack } from '@/types/track' +import { normalizeTrack } from '@/utils' +import { FC, ReactNode, createContext, useEffect, useState } from 'react' +import { useLocation, useParams } from 'react-router-dom' + +interface ArtistProviderProps { + children: ReactNode +} + +interface ArtistContext { + profile: ArtistProfile + avatarImg?: string + headerImg?: string + colorRaw?: string + stats: { + followerNumbers?: number + monthlyListeners?: number + } + topTracks?: SpotifyTrack[] + discography: { + popularReleases?: any[] + albums?: any[] + singles?: any[] + } + playlists?: any[] + featuring?: any[] + relatedArtists?: any[] + appearsOn?: any[] + discoveredOn?: any[] + aboutImg: string + setId: React.Dispatch> + isLoading: boolean + visuals: any + setModalOpen: React.Dispatch> +} + +export const ArtistContext = createContext({} as ArtistContext) + +export const ArtistProvider: FC = ({ children }) => { + const [isModalOpen, setModalOpen] = useState(false) + const [id, setId] = useState('') + const [responseData, setResponseData] = useState() + const [artistData, setArtistData] = useState() + const [isLoading, setLoading] = useState(true) + const regex = /^\/artist\// + const { pathname } = useLocation() + const { id: artistId } = useParams() + + useEffect(() => { + if (regex.test(pathname)) { + setId(artistId) + } + // } else if(pathname !== '/queue') { + // setId('') + // setArtistData(undefined) + // setResponseData(undefined) + // } + }, [pathname]) + + useEffect(() => { + const fetchData = async () => { + const data = await artistApi(id) + setResponseData(data) + } + if (id !== '') fetchData() + }, [id]) + + // console.log(artistData) + + useEffect(() => { + setArtistData((prev: any) => { + return { + ...prev, + profile: { + id: responseData?.id, + name: responseData?.profile?.name, + bio: responseData?.profile?.biography?.text, + isVerified: responseData?.profile?.verified, + externalLinks: responseData?.profile?.externalLinks?.items + }, + headerImg: responseData?.visuals?.headerImage?.sources[0]?.url, + avatarImg: responseData?.visuals?.avatarImage?.sources[0]?.url, + colorRaw: + responseData?.visuals?.headerImage?.extractedColors?.colorRaw.hex || + responseData?.visuals?.avatarImage?.extractedColors?.colorRaw?.hex, + stats: { + followerNumbers: responseData?.stats?.followers, + monthlyListeners: responseData?.stats?.monthlyListeners, + }, + topTracks: responseData?.discography?.topTracks?.items?.map( + (item: RapidArtistTrack) => normalizeTrack(item) + ), + discography: { + popularReleases: responseData?.discography?.popularReleases.items, + albums: responseData?.discography?.albums.items, + singles: responseData?.discography?.singles.items, + }, + playlists: responseData?.profile?.playlists?.items, + appearsOn: responseData?.relatedContent?.appearsOn?.items?.map( + (item: any) => item?.releases?.items[0] + ), + featuring: responseData?.relatedContent?.featuring?.items, + relatedArtists: responseData?.relatedContent?.relatedArtists?.items, + discoveredOn: responseData?.relatedContent?.discoveredOn?.items, + aboutImg: responseData?.visuals?.gallery?.items[0]?.sources[0]?.url, + visuals: responseData?.visuals, + } + }) + }, [responseData]) + + useEffect(() => { + setLoading(Boolean(!responseData)) + }, [responseData]) + + return ( + + {children} + {isModalOpen && ( + + )} + + ) +} diff --git a/src/contexts/AuthContext.tsx b/src/contexts/AuthContext.tsx new file mode 100644 index 0000000..93c7ebe --- /dev/null +++ b/src/contexts/AuthContext.tsx @@ -0,0 +1,84 @@ +import { getRefreshToken } from '@/apis/getRefreshToken' +import { getUserData } from '@/apis/userApi' +import { END_POINT, REDIRECT_URI, RESPONSE_TYPE, SCOPE } from '@/constants/auth' +import { UserData } from '@/types/user' +import { FC, ReactNode, createContext, useEffect, useState } from 'react' +import { useLocation, useNavigate } from 'react-router-dom' + +interface AuthProviderProps { + children: ReactNode +} + +interface AuthContext { + isLogged: boolean + userData?: UserData + handleLogin: () => void + handleLogout: () => void +} + +export const AuthContext = createContext({} as AuthContext) + +export const AuthProvider: FC = ({ children }) => { + const refreshToken = localStorage.getItem('spotify_refresh_token') + const authCode = localStorage.getItem('spotify_auth_code') + + const [isLogged, setLogged] = useState(Boolean(refreshToken)) + const [userData, setUserData] = useState({}) + + const navigate = useNavigate() + const location = useLocation() + + useEffect(() => { + const search = location.search.split('=') + if (search[0] === '?code') { + localStorage.setItem('spotify_auth_code', search[1]) + navigate({ search: '' }) + } + }, []) + + useEffect(() => { + if (authCode && !isLogged) { + const handleAuth = async () => { + const { status } = await getRefreshToken() + if (status) { + setLogged(true) + } else setLogged(false) + } + handleAuth() + } + }, [authCode]) + + useEffect(() => { + const fetchUserData = async () => { + const data = await getUserData() + setUserData(data) + } + if (isLogged) { + fetchUserData() + } + }, [isLogged]) + + // handle login to get auth code + const handleLogin = (): void => { + const CLIENT_ID = import.meta.env.VITE_SPOTIFY_CLIENT_ID + window.location.replace( + `${END_POINT}?client_id=${CLIENT_ID}&redirect_uri=${REDIRECT_URI}&response_type=${RESPONSE_TYPE}&scope=${SCOPE}` + ) + } + + const handleLogout = () => { + localStorage.removeItem('spotify_refresh_token') + localStorage.removeItem('spotify_access_token') + localStorage.removeItem('spotify_access_token_at') + localStorage.removeItem('spotify_auth_code') + localStorage.removeItem('spotify_current_track') + setLogged(false) + window.location.reload() + } + + return ( + + {children} + + ) +} diff --git a/src/contexts/HomePageContext.tsx b/src/contexts/HomePageContext.tsx new file mode 100644 index 0000000..c224bc3 --- /dev/null +++ b/src/contexts/HomePageContext.tsx @@ -0,0 +1,106 @@ +import { FC, ReactNode, createContext, useEffect, useState } from 'react' +import { fetchHomePageData } from '@/utils' +import searchApi from '@/apis/searchApi' +import { ResponseSectionItem, SectionProps } from '@/types/section' + +interface HomePageProviderProps { + children: ReactNode +} + +interface HomePageContext { + featurePlaylist?: SectionProps + newReleases?: SectionProps + topMixes?: SectionProps + suggestArtists?: SectionProps + trending?: SectionProps + mood?: SectionProps + focus?: SectionProps + jazz?: SectionProps + chill?: SectionProps + greetingAlbum?: ResponseSectionItem[] +} + +export const HomePageContext = createContext({} as HomePageContext) + +export const HomePageProvider: FC = ({ children }) => { + const [greetingAlbum, setGreetingAlbum] = useState([]) + const [featurePlaylist, setFeaturePlaylist] = useState() + const [newReleases, setNewRelease] = useState() + const [topMixes, setTopMixes] = useState() + const [suggestArtists, setSuggestArtists] = useState() + const [trending, setTrending] = useState() + const [mood, setMood] = useState() + const [focus, setFocus] = useState() + const [jazz, setJazz] = useState() + const [chill, setChill] = useState() + + useEffect(() => { + fetchHomePageData({ type: 'newRelease', setData: setNewRelease }) + fetchHomePageData({ type: 'featuredPlaylists', setData: setFeaturePlaylist }) + fetchHomePageData({ type: 'topMixes', setData: setTopMixes }) + fetchHomePageData({ type: 'suggestedArtists', setData: setSuggestArtists }) + fetchHomePageData({ + type: 'category', + categoryId: '0JQ5DAqbMKFQIL0AXnG5AK', + categoryName: 'Trending', + setData: setTrending, + }) + fetchHomePageData({ + type: 'category', + categoryId: '0JQ5DAqbMKFzHmL4tf05da', + categoryName: 'Mood', + setData: setMood, + }) + fetchHomePageData({ + type: 'category', + categoryId: '0JQ5DAqbMKFCbimwdOYlsl', + categoryName: 'Focus', + setData: setFocus, + }) + fetchHomePageData({ + type: 'category', + categoryId: '0JQ5DAqbMKFAJ5xb0fwo9m', + categoryName: 'Jazz', + setData: setJazz, + }) + fetchHomePageData({ + type: 'category', + categoryId: '0JQ5DAqbMKFFzDl7qN9Apr', + categoryName: 'Chill', + setData: setChill, + }) + }, []) + + useEffect(() => { + const fetchData = async () => { + const data = await searchApi({ + query: 'album', + types: ['album'], + limit: 50, + }) + + setGreetingAlbum(data?.albums.items) + } + + fetchData() + }, []) + + return ( + + {children} + + ) +} diff --git a/src/contexts/MainLayoutContext.tsx b/src/contexts/MainLayoutContext.tsx index 36e573a..ce22efb 100644 --- a/src/contexts/MainLayoutContext.tsx +++ b/src/contexts/MainLayoutContext.tsx @@ -1,5 +1,5 @@ import useComponentSize from '@/hooks/useComponentSize' -import React, { FC, createContext, useRef } from 'react' +import React, { FC, createContext, useRef, useState, useEffect } from 'react' interface MainLayoutProps { children: React.ReactNode @@ -8,18 +8,31 @@ interface MainLayoutProps { interface MainLayoutContext { height: number width: number + quantityCol: number } export const MainLayoutContext = createContext({} as MainLayoutContext) export const MainLayoutProvider: FC = ({ children }) => { const mainRef = useRef(null) + const [quantityCol, setQuantityCol] = useState(4) const size = useComponentSize(mainRef) + useEffect(() => { + if (size.width < 548) setQuantityCol(2) + else if (size.width < 748) setQuantityCol(3) + else if (size.width < 1048) setQuantityCol(4) + else if (size.width < 1248) setQuantityCol(5) + else if (size.width < 1448) setQuantityCol(6) + else if (size.width < 1648) setQuantityCol(7) + else if (size.width < 1868) setQuantityCol(8) + else setQuantityCol(9) + }, [size.width]) + return ( -
- +
+ {children}
diff --git a/src/contexts/PlayerContext.tsx b/src/contexts/PlayerContext.tsx new file mode 100644 index 0000000..2ddf4ec --- /dev/null +++ b/src/contexts/PlayerContext.tsx @@ -0,0 +1,338 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { getAudioLink } from '@/apis/getAudioLink' +import { getTrackRecommendation } from '@/apis/trackApi' +import { ArtistData } from '@/types/artist' +import { ImageSource } from '@/types/others' +import { Episode } from '@/types/show' +import { SpotifyTrack } from '@/types/track' +import { FC, ReactNode, createContext, useEffect, useMemo, useRef, useState } from 'react' + +interface PlayBarData { + trackName?: string + thumb?: string + artists?: ArtistData[] + albumId?: string + albumName?: string + episode?: string + show?: ( + | { + id?: string + images?: ImageSource[] + name?: string + publisher?: string + } + | undefined + )[] +} + +interface PlayerProviderProps { + children: ReactNode +} + +interface ReturnData { + duration?: number + playBarData?: PlayBarData +} + +export interface CurrentTrack extends SpotifyTrack, Episode {} + +interface PlayerContext extends ReturnData { + setCurrentTrack: React.Dispatch> + setCurrentTime: React.Dispatch> + setQueue: React.Dispatch> + setCurrentTrackIndex: React.Dispatch> + setReady: React.Dispatch> + setPlaying: React.Dispatch> + setUserClicked: React.Dispatch> + setNextTrackIndex: React.Dispatch> + setRepeat: React.Dispatch> + setShuffle: React.Dispatch> + setPlayingType: React.Dispatch> + handlePlay: () => void + handlePause: () => void + handleForward: () => void + handleBack: () => void + calNextTrackIndex: () => void + audioRef: React.MutableRefObject + prevDocumentTitle: React.MutableRefObject + isPlaying: boolean + intervalIdRef: any + currentTrack?: CurrentTrack + queue: SpotifyTrack[] + fakeCurrentIndex?: number + currentTrackIndex: number + isReady: boolean + userClicked: boolean + nextTrackIndex: number + isRepeat: boolean + isShuffle: boolean + isBtnClickable: boolean + playingType: 'track' | 'show' +} + +export const PlayerContext = createContext({} as PlayerContext) + +export const PlayerProvider: FC = ({ children }) => { + const [audioData, setAudioData] = useState() + const [currentTrackIndex, setCurrentTrackIndex] = useState(0) + const [nextTrackIndex, setNextTrackIndex] = useState(1) + const [playingType, setPlayingType] = useState<'track' | 'show'>('track') + + // ----------Control----------------- + const [currentTime, setCurrentTime] = useState(0) //s + const [isPlaying, setPlaying] = useState(false) + const [isReady, setReady] = useState(false) + const [userClicked, setUserClicked] = useState(false) //detect the user clicked or yet + const [isRepeat, setRepeat] = useState(false) + const [isShuffle, setShuffle] = useState(false) + const [isBtnClickable, setBtnClickable] = useState(false) + + // ---------------Queue list---------------- + const [queue, setQueue] = useState([]) + const [currentTrack, setCurrentTrack] = useState() + + useEffect(() => { + if (currentTrack) { + localStorage.setItem('spotify_current_track', JSON.stringify(currentTrack)) + } + if (currentTrackIndex >= queue?.length - 1 && currentTrack) { + if (playingType === 'track') { + const getRecommendation = async () => { + const data = await getTrackRecommendation({ + seed_artists: currentTrack?.artists?.[0]?.id as string, + seed_tracks: currentTrack?.id, + limit: 19, + }) + setQueue((prev) => [...prev, ...data]) + } + getRecommendation() + } else if (queue?.length >= 2) { + setCurrentTrackIndex(0) + setCurrentTrack({ ...queue[0] }) + calNextTrackIndex() + } + } + }, [currentTrack]) + + // ----------------------------------------------- + + const intervalIdRef = useRef() + + // const audioRef = useRef(new Audio()) + const audioRef = useRef() + + const prevDocumentTitle = useRef('') + + // set default state from localStorage + useEffect(() => { + audioRef.current.volume = localStorage.getItem('spotify_volume') + ? JSON.parse(localStorage.getItem('spotify_volume') as string) + : 1 + const initTrack = + JSON.parse(localStorage.getItem('spotify_current_track') as string) || undefined + const initPlayingType = + JSON.parse(localStorage.getItem('spotify_playing_type') as 'track' | 'show') ?? + 'track' + const isShuffle = + JSON.parse(localStorage.getItem('spotify_is_shuffle') as string) ?? false + const isRepeat = + JSON.parse(localStorage.getItem('spotify_is_repeat') as string) ?? false + + setPlayingType(initPlayingType) + setCurrentTrack(initTrack && { ...initTrack }) + setQueue(initTrack ? [{ ...initTrack }] : []) + setBtnClickable(Boolean(initTrack)) + setShuffle(isShuffle) + setRepeat(isRepeat) + }, []) + + if (audioRef.current) { + audioRef.current.onloadeddata = () => { + audioRef.current.muted = false + setBtnClickable(true) + if (userClicked) { + setReady(true) + setPlaying(true) + } + } + } + + useMemo(() => { + if (audioData) { + audioRef.current.src = audioData.audioLink + audioRef.current.load() + setBtnClickable(false) + } + }, [audioData]) + + useEffect(() => { + const fetchData = async () => { + const query = + playingType === 'track' + ? `${currentTrack?.name} - ${currentTrack?.artists + ?.map((artist) => artist?.name) + .join(' ')} ${ + currentTrack?.album?.album_type?.toLocaleLowerCase() === 'album' + ? `album: ${currentTrack?.album?.name}` + : '' + }` + : `${currentTrack?.show?.publisher} ${currentTrack?.name} ${currentTrack?.type} original` + const data = await getAudioLink({ + query, + duration_ms: currentTrack?.duration_ms as number, + type: playingType, + }) + setAudioData(data) + } + handlePause() + setReady(false) + if (queue?.filter((item: CurrentTrack) => item).length !== 0) { + fetchData() + } + }, [currentTrack]) + + useEffect(() => { + if (audioRef.current) { + audioRef.current.currentTime = currentTime + } + }, [currentTime]) + + useEffect(() => { + calNextTrackIndex() + }, [currentTrack, isShuffle]) + + useEffect(() => { + localStorage.setItem('spotify_playing_type', JSON.stringify(playingType)) + }, [playingType]) + + useEffect(() => { + if (isBtnClickable) return + if (localStorage.getItem('spotify_current_track') !== null) setBtnClickable(true) + }, [queue]) + + useEffect(() => { + if (currentTrack && userClicked) { + if (isPlaying) { + prevDocumentTitle.current = window.document.title + window.document.title = `${currentTrack?.name} • ${currentTrack?.artists?.[0]?.name}` + } else { + window.document.title = prevDocumentTitle.current + } + } + }, [currentTrack, isPlaying]) + + useEffect(() => { + localStorage.setItem('spotify_is_shuffle', JSON.stringify(isShuffle)) + }, [isShuffle]) + + useEffect(() => { + localStorage.setItem('spotify_is_repeat', JSON.stringify(isRepeat)) + }, [isRepeat]) + + // ----------------------------------------- + + const handlePlay = () => { + if (audioRef.current?.paused) { + audioRef.current.play() + setPlaying(true) + } + } + + const handlePause = () => { + // if (!audioRef.current?.paused) { + audioRef.current.pause() + setPlaying(false) + // } + } + + const handleBack = () => { + // console.log('backed') + handlePause() + if (currentTrackIndex > 0) { + setCurrentTrack({ ...queue[currentTrackIndex - 1] }) + setCurrentTrackIndex(currentTrackIndex - 1) + } + setCurrentTime(0) + } + + const handleForward = () => { + if (currentTrackIndex < queue.length - 1) { + handlePause() + setCurrentTrack({ ...queue[nextTrackIndex] }) + setCurrentTrackIndex(nextTrackIndex) + calNextTrackIndex() + setCurrentTime(0) + } + } + + const calNextTrackIndex = () => { + if (isShuffle) { + let randomIndex = currentTrackIndex + while (randomIndex === currentTrackIndex) { + randomIndex = Math.floor(Math.random() * queue?.length) + } + setNextTrackIndex(randomIndex) + } else { + setNextTrackIndex(currentTrackIndex + 1) + } + } + + const returnData = useMemo(() => { + return { + duration: audioData?.durationMs / 1000, + playBarData: { + trackName: currentTrack?.name, + thumb: + playingType === 'track' + ? currentTrack?.album?.images?.[currentTrack?.album?.images?.length - 1]?.url + : currentTrack?.images?.[currentTrack?.images?.length - 1]?.url, + albumId: currentTrack?.album?.id, + albumName: currentTrack?.album?.name, + artists: currentTrack?.artists, + episode: currentTrack?.id, + show: [currentTrack?.show], + }, + } + }, [currentTrack, audioData]) + + return ( + + {children} + + + ) +} diff --git a/src/contexts/SearchContext.tsx b/src/contexts/SearchContext.tsx new file mode 100644 index 0000000..f5e36c1 --- /dev/null +++ b/src/contexts/SearchContext.tsx @@ -0,0 +1,63 @@ +import searchApi from '@/apis/searchApi' +import { REDIRECT_URI } from '@/constants/auth' +import { SearchBannerItem } from '@/types/search' +import { FC, ReactNode, createContext, useEffect, useRef, useState } from 'react' +interface SearchProviderProps { + children: ReactNode +} + +interface SearchContext { + setQuery: React.Dispatch> + data: any + query: string | undefined + categoriesData: SearchBannerItem[] + categoryRef: React.MutableRefObject + isLoading: boolean +} + +export const SearchContext = createContext({} as SearchContext) + +export const SearchProvider: FC = ({ children }) => { + const [query, setQuery] = useState('') + const [data, setData] = useState(null) + const [categoriesData, setCategoriesData] = useState([]) + const [isLoading, setLoading] = useState(true) + + const categoryRef = useRef('all') + + useEffect(() => { + const fetchCategories = async () => { + const response = await fetch(`${REDIRECT_URI}/data/bannerSearch.json`) + const data = await response.json() + setCategoriesData([...data]) + } + fetchCategories() + }, []) + + useEffect(() => { + const fetchData = async () => { + const data = await searchApi({ + query: query, + market: 'VN', + limit: 19, + }) + setData({ ...data }) + setLoading(false) + } + if (query) { + setData(null) + setLoading(true) + fetchData() + } else { + setData(null) + } + }, [query]) + + return ( + + {children} + + ) +} diff --git a/src/hooks/index.ts b/src/hooks/index.ts new file mode 100644 index 0000000..980ec17 --- /dev/null +++ b/src/hooks/index.ts @@ -0,0 +1,15 @@ +import useComponentSize from './useComponentSize' +import useDominantColor from './useDominantColor' +import useRaiseColorTone from './useRaisedColorTone' +import useEllipsisVertical from './useEllipsisVertical' +import useEllipsisHorizontal from './useEllipsisHorizontal' +import useColorGenerator from './useColorGenerator' + +export { + useComponentSize, + useDominantColor, + useRaiseColorTone, + useEllipsisVertical, + useEllipsisHorizontal, + useColorGenerator, +} diff --git a/src/hooks/useColorGenerator.ts b/src/hooks/useColorGenerator.ts new file mode 100644 index 0000000..072b207 --- /dev/null +++ b/src/hooks/useColorGenerator.ts @@ -0,0 +1,15 @@ +//https://rgbcolorpicker.com/random + +const useColorGenerator = () => { + return ( + 'hsl(' + + 360 * Math.random() + + ',' + + (60 + 30 * Math.random()) + + '%,' + + (30 + 20 * Math.random()) + + '%)' + ) +} + +export default useColorGenerator diff --git a/src/hooks/useComponentSize.ts b/src/hooks/useComponentSize.ts index 7b85cf8..23bd6f2 100644 --- a/src/hooks/useComponentSize.ts +++ b/src/hooks/useComponentSize.ts @@ -31,7 +31,7 @@ const useComponentSize = (ref: RefObject): ComponentSize => { observer.unobserve(ref.current) } } - }, [ref]) + }, [ref.current?.clientHeight, ref.current?.clientHeight]) return componentSize } diff --git a/src/hooks/useEllipsisHorizontal.ts b/src/hooks/useEllipsisHorizontal.ts new file mode 100644 index 0000000..6f472c9 --- /dev/null +++ b/src/hooks/useEllipsisHorizontal.ts @@ -0,0 +1,20 @@ +import { useEffect, useState } from 'react' + +const useEllipsisHorizontal = (e: HTMLElement, dependency?: any) => { + const [isActive, setActive] = useState(false) + + useEffect(() => { + setActive(false) + }, [dependency]) + + useEffect(() => { + if (e?.offsetWidth < e?.scrollWidth) { + setActive(true) + } + }, [e?.offsetWidth, e?.scrollWidth]) + + if (isActive) return true + return false +} + +export default useEllipsisHorizontal diff --git a/src/hooks/useEllipsisVertical.ts b/src/hooks/useEllipsisVertical.ts new file mode 100644 index 0000000..3a95c71 --- /dev/null +++ b/src/hooks/useEllipsisVertical.ts @@ -0,0 +1,15 @@ +import { useEffect, useState } from 'react' + +const useEllipsisVertical = (e: HTMLElement) => { + const [isActive, setActive] = useState(false) + useEffect(() => { + if (e?.offsetHeight < e?.scrollHeight) { + setActive(true) + } + }, [e?.offsetHeight, e?.scrollHeight]) + + if (isActive) return true + return false +} + +export default useEllipsisVertical diff --git a/src/hooks/useRaisedColorTone.ts b/src/hooks/useRaisedColorTone.ts new file mode 100644 index 0000000..ecd9ad5 --- /dev/null +++ b/src/hooks/useRaisedColorTone.ts @@ -0,0 +1,20 @@ +function useRaiseColorTone(color: string): string { + // Extract the RGB components from the color code + const red = parseInt(color.substring(1, 3), 16) + const green = parseInt(color.substring(3, 5), 16) + const blue = parseInt(color.substring(5, 7), 16) + + // Calculate the raised color values + const raisedRed = Math.min(Math.round(red * 1.), 255) + const raisedGreen = Math.min(Math.round(green * 1.), 255) + const raisedBlue = Math.min(Math.round(blue * 1.), 255) + + // Convert the raised color values back to hexadecimal + const raisedColor = `#${raisedRed.toString(16).padStart(2, '0')}${raisedGreen + .toString(16) + .padStart(2, '0')}${raisedBlue.toString(16).padStart(2, '0')}` + + return raisedColor +} + +export default useRaiseColorTone diff --git a/src/index.scss b/src/index.scss index c99e269..bf0e6c9 100644 --- a/src/index.scss +++ b/src/index.scss @@ -6,9 +6,14 @@ src: url('./assets/fonts/CircularSp-Book.woff2'); font-weight: 400; } + @font-face { font-family: CircularSp; src: url('./assets/fonts/CircularSp-Bold.woff2'); font-weight: 700; } +@font-face { + font-family: 'Spoticon'; + src: url('./assets/fonts/spoticon_regular.woff2'); +} \ No newline at end of file diff --git a/src/layouts/LoadingLayout/LoadingLayout.module.scss b/src/layouts/LoadingLayout/LoadingLayout.module.scss new file mode 100644 index 0000000..15d6a1c --- /dev/null +++ b/src/layouts/LoadingLayout/LoadingLayout.module.scss @@ -0,0 +1,25 @@ +@import '../../scss/variable'; + + +.wrapper { + height: 100vh; + display: flex; + flex-direction: column; + background-color: $black; +} + +.spinner { + width: calc(100% - 16px); + flex: 1; + display: flex; + justify-content: center; + align-items: center; + background-color: $bg-base; + margin: 8px 8px 0; + border-radius: $panel-border-radius; +} + +.audio-player-bar { + height: 88px; + padding: 8px; +} \ No newline at end of file diff --git a/src/layouts/LoadingLayout/LoadingLayout.tsx b/src/layouts/LoadingLayout/LoadingLayout.tsx new file mode 100644 index 0000000..092b729 --- /dev/null +++ b/src/layouts/LoadingLayout/LoadingLayout.tsx @@ -0,0 +1,22 @@ +import { FC } from 'react' +import styles from './LoadingLayout.module.scss' +import classNames from 'classnames/bind' +import { StageSpinner } from 'react-spinners-kit' +import { AudioPlayer } from '@/components' + +const cx = classNames.bind(styles) + +const LoadingLayout: FC = () => { + return ( +
+
+ +
+
+ +
+
+ ) +} + +export default LoadingLayout diff --git a/src/layouts/RootLayout/RootLayout.module.scss b/src/layouts/RootLayout/RootLayout.module.scss new file mode 100644 index 0000000..bde97f1 --- /dev/null +++ b/src/layouts/RootLayout/RootLayout.module.scss @@ -0,0 +1,42 @@ +@import '../../scss/variable'; + +.root-layout { + background-color: $black; + height: 100vh; + width: max(100vw, 900px); + overflow: hidden; + display: flex; + gap: $panel-gap; + padding: .8rem; + max-width: 3000px; + display: flex; + flex-direction: column; + overflow: hidden; +} + +.top { + height: calc(100vh - 96px); +} + +.bottom { + height: 72px; +} + +.main { + flex: 1; + height: 100%; + background-color: $bg-base; + border-radius: $panel-gap; + -webkit-border-radius: $panel-gap; + overflow: hidden; + -webkit-overflow: hidden; + overflow-y: auto; + position: relative; +} + +.split { + display: flex; + flex-direction: row; + height: 100%; + width: 100%; +} \ No newline at end of file diff --git a/src/layouts/RootLayout/RootLayout.tsx b/src/layouts/RootLayout/RootLayout.tsx new file mode 100644 index 0000000..68edfb5 --- /dev/null +++ b/src/layouts/RootLayout/RootLayout.tsx @@ -0,0 +1,67 @@ +import { FC, useContext } from 'react' +import styles from './RootLayout.module.scss' +import classNames from 'classnames/bind' +import { Outlet } from 'react-router-dom' +import { SkeletonTheme } from 'react-loading-skeleton' +import Split from 'react-split' +import { PlayingView, Sidebar } from '@/components' +import { MainLayoutProvider } from '@/contexts/MainLayoutContext' +import { ArtistProvider } from '@/contexts/ArtistContext' +import { SearchProvider } from '@/contexts/SearchContext' +import { HomePageProvider } from '@/contexts/HomePageContext' +import { AudioPlayer } from '@/components' +import { PlayerProvider } from '@/contexts/PlayerContext' +import { AuthProvider } from '@/contexts/AuthContext' +import { AppContext } from '@/App' + +const cx = classNames.bind(styles) + +const RootLayout: FC = () => { + const { isPlayingViewShowed } = useContext(AppContext) + + return ( +
+ + + + + + +
+ + + +
+ +
+
+ {isPlayingViewShowed ? ( + + ) : ( +
+ )} +
+
+
+ +
+
+
+
+
+
+
+
+ ) +} + +export default RootLayout diff --git a/src/layouts/TopLayout/TopLayout.module.scss b/src/layouts/TopLayout/TopLayout.module.scss new file mode 100644 index 0000000..c9e781d --- /dev/null +++ b/src/layouts/TopLayout/TopLayout.module.scss @@ -0,0 +1,20 @@ +@import '../../scss/variable'; + +.main { + flex: 1; + height: 100%; + background-color: $bg-base; + border-radius: $panel-gap; + -webkit-border-radius: $panel-gap; + overflow: hidden; + -webkit-overflow: hidden; + overflow-y: auto; + position: relative; +} + +.split { + display: flex; + flex-direction: row; + height: 100%; + width: 100%; +} \ No newline at end of file diff --git a/src/layouts/TopLayout/TopLayout.tsx b/src/layouts/TopLayout/TopLayout.tsx new file mode 100644 index 0000000..d966b6f --- /dev/null +++ b/src/layouts/TopLayout/TopLayout.tsx @@ -0,0 +1,32 @@ +import { FC } from 'react' +import styles from './TopLayout.module.scss' +import classNames from 'classnames/bind' +import Split from 'react-split' +import { Sidebar } from '@/components' +import { MainLayoutProvider } from '@/contexts/MainLayoutContext' +import { Outlet } from 'react-router-dom' + +const cx = classNames.bind(styles) + +const TopLayout: FC = () => { + return ( +
+ + + +
+ +
+
+
+
+ ) +} + +export default TopLayout diff --git a/src/main.tsx b/src/main.tsx index a44e7ab..16b3eaf 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,12 +1,17 @@ +// import React from 'react' import ReactDOM from 'react-dom/client' import { BrowserRouter } from 'react-router-dom' import App from './App.tsx' import './index.scss' +import { ErrorBoundary } from 'react-error-boundary' +import { Alert } from './components/index.ts' ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( // + }> - // + + // {/* */} ) diff --git a/src/pages/Album/Album.module.scss b/src/pages/Album/Album.module.scss new file mode 100644 index 0000000..0de0aea --- /dev/null +++ b/src/pages/Album/Album.module.scss @@ -0,0 +1,88 @@ +@import '../../scss/variable'; +@import '../../scss/mixin'; + +.wrapper { + height: 100%; + position: relative; + overflow: hidden; + background-color: $bg-base; +} + +.body { + height: 100%; + overflow: hidden; + overflow-y: scroll; + padding-bottom: 32px; + padding-top: $navbar-height; + position: relative; + + &::-webkit-scrollbar { + display: none; + } +} + +.song-list { + position: relative; + + .bg-blur { + position: absolute; + height: 232px; + top: 0; + left: 0; + right: 0; + background-image: linear-gradient(rgba(0, 0, 0, 0.6) 0, $bg-base 100%), $bg-noise; + z-index: 0; + } + + .main { + position: relative; + padding-inline: 24px; + + .action-bar { + display: flex; + position: relative; + padding: 24px; + align-items: center; + gap: 32px; + + .heart { + @include button-icon(42px, transparent, transparent); + color: $text-subdued; + transition: none; + + &:hover { + color: $white; + } + } + } + } +} + +.copy-rights { + display: flex; + flex-direction: column; + padding-inline: 24px; + margin-top: 32px; + line-height: 1.7; + gap: 4px; + + p { + color: $text-neutral; + font-size: 11px; + margin: 0; + } + + .date { + font-size: 14px; + margin-bottom: 2px; + } +} + +.artist-albums { + margin-top: 32px; +} + +.pivot-tracking { + position: absolute; + z-index: -999; +} diff --git a/src/pages/Album/Album.tsx b/src/pages/Album/Album.tsx new file mode 100644 index 0000000..2b0d0ec --- /dev/null +++ b/src/pages/Album/Album.tsx @@ -0,0 +1,218 @@ +import { getArtistAlbums } from '@/apis/artistApi' +import categoryApi from '@/apis/categoryApi' +import { HeartIcon } from '@/assets/icons' +import { Footer, Header, Navbar, Section, SongList } from '@/components' +import { PlayButton } from '@/components/UIs' +import { PlayerContext } from '@/contexts/PlayerContext' +import { useComponentSize } from '@/hooks' +import { SpotifyAlbum } from '@/types/album' +import { ResponseSectionItem } from '@/types/section' +import { dateFormatConvertor, documentTitle } from '@/utils' +import classNames from 'classnames/bind' +import { usePalette } from 'color-thief-react' +import React, { useContext, useEffect, useMemo, useRef, useState } from 'react' +import { useInView } from 'react-intersection-observer' +import { useNavigate, useParams } from 'react-router-dom' +import styles from './Album.module.scss' + +const cx = classNames.bind(styles) + +const Album: React.FC = () => { + const { + setCurrentTrack, + setQueue, + setCurrentTrackIndex, + calNextTrackIndex, + setPlayingType, + isPlaying, + prevDocumentTitle, + currentTrack, + } = useContext(PlayerContext) + const [data, setData] = useState() + const [navOpacity, setNavOpacity] = useState(0) + const [isLoading, setLoading] = useState(true) + const [navPlayBtnVisible, setNavPlayBtnVisible] = useState(false) + const [artistAlbums, setArtistAlbums] = useState() + + useEffect(() => { + if (isPlaying) { + prevDocumentTitle.current = `${data?.name ? data?.name : 'Album'} | Spotify` + } else { + documentTitle(`${data?.name ? data?.name : 'Album'} | Spotify`) + } + }, [isPlaying, data]) + + const { ref: pivotTrackingRef, inView: isTracking } = useInView({ + threshold: 0, + }) + + // const bgColor = useRaiseColorTone(useDominantColor(data?.images?.[0].url)) + + const { data: dataColor } = usePalette(data?.images?.[0]?.url as string, 10, 'hex', { + crossOrigin: 'Anonymous', + quality: 100, + }) + + const bgColor = dataColor?.[2] ?? '#121212' + + const headerRef = useRef() + const { height: headerHeight } = useComponentSize(headerRef) + + const { id } = useParams() + const navigate = useNavigate() + + const artistAlbumsNormalized = useMemo(() => { + return artistAlbums?.filter((album: SpotifyAlbum) => album?.id !== data?.id) as + | ResponseSectionItem[] + | undefined + }, [artistAlbums]) + + useEffect(() => { + const fetchData = async () => { + const data = await categoryApi({ + type: 'albums', + id: id, + }) + if (data?.error) { + navigate('/not-found') + } else setData(data) + } + if (id !== 'undefined') { + fetchData() + } + }, [id]) + + useEffect(() => { + const fetchArtistAlbum = async () => { + const artistAlbums = await getArtistAlbums(data?.artists?.[0]?.id) + if (artistAlbums?.items?.length && artistAlbums?.items?.length !== 0) { + setArtistAlbums([...artistAlbums.items]) + } + } + fetchArtistAlbum() + }, [data?.artists?.[0]?.id]) + + useEffect(() => { + setLoading(Boolean(!data)) + }, [data]) + + const handleScroll = (e: React.UIEvent): void => { + const yAxis = e.currentTarget.scrollTop + if (yAxis > 64) { + setNavOpacity(1) + } else setNavOpacity(yAxis / 64) + if (yAxis > headerHeight + 14) { + setNavPlayBtnVisible(true) + } else setNavPlayBtnVisible(false) + } + + const handleClickPlayBtn = () => { + const queueList = + data?.tracks?.items?.map((item) => { + return { + ...item, + album: { + images: data?.images, + id: data?.id, + album_type: data?.album_type, + name: data?.name, + }, + } + }) || [] + setQueue(queueList) + setCurrentTrack(queueList[0]) + setCurrentTrackIndex(0) + setPlayingType('track') + calNextTrackIndex() + } + + return ( +
+ +
isTracking && handleScroll(e)} className={cx('body')}> +
+
+
+
+
+
+
+
+
handleClickPlayBtn()}> + +
+ +
+ +
+
+ +
+

{dateFormatConvertor(data?.release_date)}

+ {data?.copyrights?.map((item, index: number) => ( +

+ {item?.text?.replace(/\(C\)|\(P\)/g, (match) => { + return match === '(C)' ? '©' : '℗' + })} +

+ ))} +
+ {artistAlbumsNormalized?.length !== 0 && ( +
+
+
+
+ )} +
+
+ ) +} + +export default Album diff --git a/src/pages/Artist/Artist.module.scss b/src/pages/Artist/Artist.module.scss new file mode 100644 index 0000000..a6e2c2e --- /dev/null +++ b/src/pages/Artist/Artist.module.scss @@ -0,0 +1,100 @@ +@import '../../scss/variable'; + +.wrapper { + height: 100%; + position: relative; + overflow: hidden; + background-color: $bg-base; +} + +.banner-img { + width: 100%; + position: absolute; + // background-position: center; + // background-size: cover; + // background-repeat: no-repeat; + z-index: 0; + transition: all 1ms ease; + transform-origin: center; + + & > img { + width: 100%; + height: 100%; + object-fit: cover; + animation: brighten-up 0.2s; + } + + .overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + background-image: linear-gradient(rgba(0, 0, 0, 0.6) 0, $bg-base 100%), $bg-noise; + opacity: 0.25; + } +} + +.body { + height: 100%; + overflow: hidden; + overflow-y: scroll; + padding-bottom: 32px; + padding-top: $navbar-height; + position: relative; + z-index: 7; + + &::-webkit-scrollbar { + display: none; + } +} + +.bg-blur { + position: absolute; + height: 232px; + left: 0; + right: 0; + background-image: linear-gradient(rgba(0, 0, 0, 0.6) 0, $bg-base 100%), $bg-noise; + z-index: 0; +} + +.action-bar { + padding: 24px; + display: flex; + align-items: center; + position: relative; + z-index: 1; + gap: 24px; + + .follow-btn { + color: $white; + background-color: transparent; + border: 1px solid hsla(0, 0%, 100%, 0.3); + border-radius: 4px; + font-size: 12px; + font-weight: 700; + letter-spacing: 0.1em; + padding: 7px 15px; + text-transform: uppercase; + cursor: pointer; + + &:hover { + border-color: $white; + } + } +} + +.pivot-tracking { + position: absolute; + z-index: -999; +} + +@keyframes brighten-up { + 0% { + filter: brightness(0.3); + } + + 100% { + filter: brightness(1); + } +} diff --git a/src/pages/Artist/Artist.tsx b/src/pages/Artist/Artist.tsx index 93d9a64..92fc6fd 100644 --- a/src/pages/Artist/Artist.tsx +++ b/src/pages/Artist/Artist.tsx @@ -1,16 +1,245 @@ -interface ArtistProps { - children?: React.ReactNode -} +import { + AboutArtist, + Discography, + Footer, + Navbar, + Section, + TopTracks, +} from '@/components' +import ArtistBanner from '@/components/ArtistBanner/ArtistBanner' +import { Image, PlayButton } from '@/components/UIs' +import { ArtistContext } from '@/contexts/ArtistContext' +import { PlayerContext } from '@/contexts/PlayerContext' +import { useComponentSize } from '@/hooks' +import { documentTitle } from '@/utils' +import classNames from 'classnames/bind' +import React, { useContext, useEffect, useRef, useState } from 'react' +import { useInView } from 'react-intersection-observer' +import styles from './Artist.module.scss' +import { SpotifyTrack } from '@/types/track' + +const cx = classNames.bind(styles) + +const Artist: React.FC = () => { + const [navOpacity, setNavOpacity] = useState(0) + const [bgBannerOpacity, setBgBannerOpacity] = useState(0) + const [bgBannerScale, setBgBannerScale] = useState(1.05) + const [navPlayBtnVisible, setNavPlayBtnVisible] = useState(false) + + const { + isLoading, + profile, + headerImg, + avatarImg, + colorRaw, + stats, + topTracks, + discography, + playlists, + featuring, + relatedArtists, + discoveredOn, + appearsOn, + aboutImg, + visuals, + } = useContext(ArtistContext) + const { + setCurrentTrack, + setCurrentTrackIndex, + setQueue, + calNextTrackIndex, + setPlayingType, + isPlaying, + prevDocumentTitle, + } = useContext(PlayerContext) + + useEffect(() => { + if (isPlaying) { + prevDocumentTitle.current = `${profile?.name ? profile?.name : 'Artist'} | Spotify` + } else { + documentTitle(`${profile?.name ? profile?.name : 'Artist'} | Spotify`) + } + }, [isPlaying, profile]) + + const bannerRef = useRef() + + const { ref: pivotTrackingRef, inView: isTracking } = useInView({ + threshold: 0, + }) -const Artist: React.FC = () => { + const { height: bannerHeight } = useComponentSize(bannerRef) - // const {children} = props + const handleScroll = (e: React.UIEvent): void => { + const yAxis = e.currentTarget.scrollTop + if (yAxis > bannerHeight / 2) { + setNavOpacity(1) + setBgBannerOpacity(1) + setBgBannerScale(1.2) + } else { + setNavOpacity((2 * yAxis) / bannerHeight) + setBgBannerOpacity((2 * yAxis) / bannerHeight) + setBgBannerScale(1.05 - 0.05 * ((2 * yAxis) / bannerHeight)) + } + + if (yAxis > 0.6 * bannerHeight) { + setNavOpacity(1) + } else setNavOpacity(yAxis / (0.6 * bannerHeight)) + + if (yAxis > bannerHeight + 14) { + setNavPlayBtnVisible(true) + } else setNavPlayBtnVisible(false) + } + + const handleClickPlayBtn = () => { + setQueue([...(topTracks as SpotifyTrack[])] || []) + setCurrentTrack({ ...topTracks?.[0] }) + setCurrentTrackIndex(0) + calNextTrackIndex() + setPlayingType('track') + } return ( -
Artist
+
+ +
+ {!isLoading && ( + banner-image + )} +
+
+
isTracking && handleScroll(e)} className={cx('body')}> +
+
+
+
+
+ +
+
+
+ +
+ +
+ + + + {featuring?.length !== 0 && ( +
+ )} + {relatedArtists?.length !== 0 && ( +
+ )} + {appearsOn?.length !== 0 && ( +
+ )} + {playlists?.length !== 0 && ( +
+ )} + {discoveredOn?.length !== 0 && ( +
+ )} + {aboutImg && ( + + )} +
+
+
+
) } export default Artist - - diff --git a/src/pages/Episode/Episode.module.scss b/src/pages/Episode/Episode.module.scss new file mode 100644 index 0000000..4648bc0 --- /dev/null +++ b/src/pages/Episode/Episode.module.scss @@ -0,0 +1,153 @@ +@import '../../scss/variable'; +@import '../../scss/mixin'; + +.episode-wrapper { + height: 100%; + position: relative; + overflow: hidden; + background-color: $bg-base; +} + +.body { + height: 100%; + overflow: hidden; + overflow-y: scroll; + padding-bottom: 32px; + padding-top: $navbar-height; + position: relative; + + &::-webkit-scrollbar { + display: none; + } +} + +.pivot-tracking { + position: absolute; + z-index: -999; +} + +.main { + position: relative; +} + +.bg-blur { + position: absolute; + height: 232px; + top: 0; + left: 0; + right: 0; + background-image: linear-gradient(rgba(0, 0, 0, 0.6) 0, $bg-base 100%), $bg-noise; + z-index: 0; +} + +.action-bar { + position: relative; + display: flex; + flex-direction: column; + padding: 24px; + gap: 16px; + + .top { + display: flex; + flex-direction: row; + font-size: 14px; + color: rgba($color: #fff, $alpha: 0.7); + align-items: center; + gap: 4px; + letter-spacing: 1px; + + .dot { + height: 3px; + width: 3px; + border-radius: 500px; + background-color: rgba($color: #fff, $alpha: 0.7); + } + } + + .bottom { + display: flex; + flex-direction: row; + align-items: center; + + .play-btn { + margin-right: 32px; + } + + .plus-btn { + color: $text-subdued; + cursor: pointer; + transform-origin: center; + + &:hover { + color: $white; + transform: scale(1.04); + } + } + } +} + +.content { + position: relative; + padding-inline: 24px; + max-width: 672px; + + .title { + font-size: 24px; + font-weight: 700; + color: $white; + } + + .desc { + font-size: 16px; + color: $text-neutral; + + a { + color: $white; + font-weight: 700; + + &:hover { + text-decoration: underline; + } + } + + } +} + +.expand-btn { + margin-top: 4px; + + button { + @include reset-button; + background-color: transparent; + font-size: 16px; + color: $white; + font-weight: 700; + cursor: pointer; + } +} +.expanded { + @include text-line-clamp(5); +} + +.see-all-btn { + margin-top: 48px; + padding-inline: 24px; + + button { + @include reset-button; + font-size: 14px; + font-weight: 700; + color: $white; + background-color: transparent; + padding: 7px 15px; + border-radius: 500px; + border: 1px solid $essential-subdued; + cursor: pointer; + transform-origin: center; + + &:hover { + transform: scale(1.04); + border-color: $white; + } + } +} diff --git a/src/pages/Episode/Episode.tsx b/src/pages/Episode/Episode.tsx new file mode 100644 index 0000000..5f740ee --- /dev/null +++ b/src/pages/Episode/Episode.tsx @@ -0,0 +1,146 @@ +import episodeApi from '@/apis/episodeApi' +import { PlusCircle } from '@/assets/icons' +import { Footer, Header, Navbar } from '@/components' +import { PlayButton } from '@/components/UIs' +import { CurrentTrack, PlayerContext } from '@/contexts/PlayerContext' +import { useEllipsisVertical } from '@/hooks' +import { Episode as EpisodeData } from '@/types/show' +import { dateFormatConvertor } from '@/utils' +import durationConvertor from '@/utils/durationConvertor' +import classNames from 'classnames/bind' +import { usePalette } from 'color-thief-react' +import { FC, useContext, useEffect, useRef, useState } from 'react' +import { useInView } from 'react-intersection-observer' +import { Link, useParams } from 'react-router-dom' +import styles from './Episode.module.scss' + +const cx = classNames.bind(styles) + +const Episode: FC = () => { + const { + setQueue, + setCurrentTrack, + setCurrentTrackIndex, + setPlayingType, + calNextTrackIndex, + currentTrack, + } = useContext(PlayerContext) + const [navOpacity, setNavOpacity] = useState(0) + const [data, setData] = useState() + const [isLoading, setLoading] = useState(true) + const [isExpanded, setExpanded] = useState(false) + const { ref: pivotTrackingRef, inView: isTracking } = useInView() //put above all + + // const bgColor = useDominantColor(data?.images?.[0].url) || '#121212' + + const { data: dataColor } = usePalette(data?.images?.[0]?.url as string, 10, 'hex', { + crossOrigin: 'Anonymous', + quality: 100, + }) + + const bgColor = dataColor?.[2] ?? '#121212' + + const { id } = useParams() + + const headerRef = useRef() + const descRef = useRef() + + const isEllipsisActive = useEllipsisVertical(descRef.current) + + useEffect(() => { + const fetchData = async () => { + const data = await episodeApi({ id }) + setData(data) + } + fetchData() + }, []) + + useEffect(() => { + setLoading(Boolean(!data)) + }, [data]) + + const handleScroll = (e: React.UIEvent): void => { + const yAxis = e.currentTarget.scrollTop + if (yAxis > 64) { + setNavOpacity(1) + } else setNavOpacity(yAxis / 64) + } + + const handleClickPlayBtn = (e: React.MouseEvent) => { + e.stopPropagation() + if (currentTrack?.id === data?.id) return + setQueue([{ ...(data as CurrentTrack) }]) + setCurrentTrack({ ...data }) + setCurrentTrackIndex(0) + setPlayingType('show') + calNextTrackIndex() + } + + return ( +
+ +
isTracking && handleScroll(e)}> +
+
+
+
+
+
+
+
+ {dateFormatConvertor(data?.release_date)} +
+ + {durationConvertor({ milliseconds: data?.duration_ms, type: 'long' })} + +
+
+
+ +
+
+ +
+
+
+
+

Episode Description

+
+ +
+ {isEllipsisActive && ( +
+ +
+ )} +
+ +
+ +
+ +
+
+
+
+ ) +} + +export default Episode diff --git a/src/pages/Genre/Genre.module.scss b/src/pages/Genre/Genre.module.scss new file mode 100644 index 0000000..9aa543a --- /dev/null +++ b/src/pages/Genre/Genre.module.scss @@ -0,0 +1,47 @@ +@import '../../scss/variable'; +@import '../../scss/mixin'; + +.genre-wrapper { + height: 100%; + position: relative; + overflow: hidden; + background-color: $bg-base; +} + +.body { + height: 100%; + overflow: hidden; + overflow-y: scroll; + padding-bottom: 32px; + padding-top: $navbar-height; + position: relative; + + &::-webkit-scrollbar { + display: none; + } +} + +.main { + position: relative; + + + .bg-blur { + position: absolute; + height: 232px; + top: 0; + left: 0; + right: 0; + background-image: linear-gradient(rgba(0, 0, 0, 0.6) 0, $bg-base 100%), $bg-noise; + z-index: 0; + } + + + .section { + padding-top: 90px; + } +} + +.pivot-tracking { + position: absolute; + z-index: -999; +} diff --git a/src/pages/Genre/Genre.tsx b/src/pages/Genre/Genre.tsx new file mode 100644 index 0000000..36bdb8b --- /dev/null +++ b/src/pages/Genre/Genre.tsx @@ -0,0 +1,140 @@ +import { FC, useEffect, useRef, useState } from 'react' +import styles from './Genre.module.scss' +import classNames from 'classnames/bind' +import { Footer, Header, Navbar, Section } from '@/components' +import { useParams } from 'react-router-dom' +import { getCategoryInfo, getCategoryPlaylist } from '@/apis/categoriesApi' +import { PlaylistData } from '@/types/playlist' +import { CategoryItem } from '@/types/search' +import { ResponseSectionItem } from '@/types/section' +import { useComponentSize } from '@/hooks' +import { useInView } from 'react-intersection-observer' + +const cx = classNames.bind(styles) + +const Genre: FC = () => { + const [info, setInfo] = useState() + const [data, setData] = useState([]) + const [renderNumb, setRenderNumb] = useState(19) + const [totalPlaylist, setTotalPlaylist] = useState(0) + const [isLoading, setLoading] = useState(true) + const [navOpacity, setNavOpacity] = useState(0) + const [isShowNavTitle, setShowNavTitle] = useState(false) + + const bgColor = 'rgb(18, 18, 18)' + const { ref: pivotTrackingRef, inView: isTracking } = useInView({ + threshold: 0, + }) + + const { ref: lazyLoadingRef, inView: lazyLoadingInView } = useInView({ + threshold: 0, + }) + + const { id } = useParams() + + const headerRef = useRef() + const { height: headerHeight } = useComponentSize(headerRef) + + useEffect(() => { + const fetchInfo = async () => { + const data = await getCategoryInfo({ id }) + setInfo({ ...data }) + } + + fetchInfo() + }, [id]) + + useEffect(() => { + const fetchInitData = async () => { + const data = await getCategoryPlaylist({ id, limit: renderNumb, offset: 0 }) + setTotalPlaylist(data?.playlists?.total ?? 0) + const dataNormalized = data?.playlists?.items?.filter((item: any) => item) + setData([...dataNormalized]) + } + fetchInitData() + }, [id]) + + useEffect(() => { + if (!lazyLoadingInView || totalPlaylist === 0) { + return + } + + if (totalPlaylist > renderNumb) { + const fetchData = async () => { + const data = await getCategoryPlaylist({ id, limit: 18, offset: renderNumb }) + const dataNormalized = data?.playlists?.items?.filter((item: any) => item) + setData((prev) => [...prev, ...dataNormalized]) + if (renderNumb + 18 > totalPlaylist) { + setRenderNumb(totalPlaylist) + } else { + setRenderNumb(renderNumb + 18) + } + } + fetchData() + } + }, [lazyLoadingInView]) + + useEffect(() => { + if (info && data?.length !== 0) { + setLoading(false) + } else setLoading(true) + }, [data, info]) + + const handleScroll = (e: React.UIEvent): void => { + const yAxis = e.currentTarget.scrollTop + if (yAxis < headerHeight) { + setNavOpacity(yAxis / headerHeight) + } else setNavOpacity(1) + + if (yAxis > headerHeight + 70) { + setShowNavTitle(true) + } else { + setShowNavTitle(false) + } + } + + return ( +
+ +
isTracking && handleScroll(e)} className={cx('body')}> +
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ) +} + +export default Genre diff --git a/src/pages/Home/Home.module.scss b/src/pages/Home/Home.module.scss index cfef0dd..63d58b0 100644 --- a/src/pages/Home/Home.module.scss +++ b/src/pages/Home/Home.module.scss @@ -2,18 +2,24 @@ height: 100%; position: relative; overflow: hidden; - + -webkit-overflow: hidden; } .body { height: 100%; overflow: hidden; overflow-y: scroll; + padding-bottom: 32px; + padding-top: 64px; + position: relative; + // background-color: transparent; &::-webkit-scrollbar { display: none; } } - - +.pivot-tracking { + position: absolute; + z-index: -999; +} \ No newline at end of file diff --git a/src/pages/Home/Home.tsx b/src/pages/Home/Home.tsx index f8cdfaa..78260e6 100644 --- a/src/pages/Home/Home.tsx +++ b/src/pages/Home/Home.tsx @@ -1,33 +1,125 @@ -import Greeting from '@/components/Greeting/Greeting' -import Navbar from '@/components/Navbar/Navbar' +import { Footer, Greeting, Navbar, Section } from '@/components' +import { HomePageContext } from '@/contexts/HomePageContext' +import { PlayerContext } from '@/contexts/PlayerContext' +import { documentTitle } from '@/utils' import classNames from 'classnames/bind' -import { useState } from 'react' +import { useContext, useEffect, useState } from 'react' +import { useInView } from 'react-intersection-observer' import styles from './Home.module.scss' const cx = classNames.bind(styles) -const Home = () => { +const Home: React.FC = () => { const [bgColor, setBgColor] = useState('#c0b8c1') const [navOpacity, setNavOpacity] = useState(0) - const handleScroll = ( - e: React.UIEvent - ): void => { + const { isPlaying, prevDocumentTitle } = useContext(PlayerContext) + const { + featurePlaylist, + newReleases, + suggestArtists, + topMixes, + trending, + chill, + focus, + jazz, + mood, + } = useContext(HomePageContext) + + useEffect(() => { + if (isPlaying) { + prevDocumentTitle.current = 'Spotify - Clone' + } else { + documentTitle('Spotify - Clone') + } + }, [isPlaying]) + + const { ref: pivotTrackingRef, inView: isTracking } = useInView({ + threshold: 0, + }) + + const handleScroll = (e: React.UIEvent): void => { const yAxis = e.currentTarget.scrollTop - // console.log(yAxis) if (yAxis > 64) { setNavOpacity(1) - return - } - setNavOpacity(yAxis / 64) + } else setNavOpacity(yAxis / 64) } return (
- -
handleScroll(e)} className={cx('body')}> + +
isTracking && handleScroll(e)} className={cx('body')}> +
-
+
+
+
+
+
+
+
+
+
+ +
) diff --git a/src/pages/Playlist/Playlist.module.scss b/src/pages/Playlist/Playlist.module.scss new file mode 100644 index 0000000..13bdfd4 --- /dev/null +++ b/src/pages/Playlist/Playlist.module.scss @@ -0,0 +1,70 @@ +@import '../../scss/variable'; +@import '../../scss/mixin'; + +.wrapper { + height: 100%; + position: relative; + overflow: hidden; + background-color: $bg-base; +} + + +.body { + height: 100%; + overflow: hidden; + overflow-y: scroll; + padding-bottom: 32px; + padding-top: $navbar-height; + position: relative; + + &::-webkit-scrollbar { + display: none; + } +} + +.song-list { + position: relative; + + .bg-blur { + position: absolute; + height: 232px; + top: 0; + left: 0; + right: 0; + background-image: linear-gradient(rgba(0, 0, 0, .6) 0, $bg-base 100%), $bg-noise; + z-index: 0; + } + + .main { + position: relative; + padding-inline: 24px; + + .action-bar { + display: flex; + position: relative; + padding: 24px; + align-items: center; + gap: 32px; + + .heart { + @include button-icon(42px, transparent, transparent); + color: $text-subdued; + transition: none; + + &:hover { + color: $white; + } + } + } + + } +} + +.grid-md { + grid-template-columns: 16px minmax(300px, 4fr) 2fr 50px !important; +} + +.pivot-tracking { + position: absolute; + z-index: -999; +} \ No newline at end of file diff --git a/src/pages/Playlist/Playlist.tsx b/src/pages/Playlist/Playlist.tsx new file mode 100644 index 0000000..91177a5 --- /dev/null +++ b/src/pages/Playlist/Playlist.tsx @@ -0,0 +1,161 @@ +/* eslint-disable react-refresh/only-export-components */ +import categoryApi from '@/apis/categoryApi' +import { HeartIcon } from '@/assets/icons' +import { Footer, Header, Navbar, SongList } from '@/components' +import { PlayButton } from '@/components/UIs' +import { PlayerContext } from '@/contexts/PlayerContext' +import { useComponentSize } from '@/hooks' +import { PlaylistData } from '@/types/playlist' +import { documentTitle } from '@/utils' +import classNames from 'classnames/bind' +import { usePalette } from 'color-thief-react' +import React, { memo, useContext, useEffect, useRef, useState } from 'react' +import { useInView } from 'react-intersection-observer' +import { useNavigate, useParams } from 'react-router-dom' +import styles from './Playlist.module.scss' + +const cx = classNames.bind(styles) + +const Playlist: React.FC = () => { + const { + setQueue, + setCurrentTrack, + setCurrentTrackIndex, + calNextTrackIndex, + setPlayingType, + isPlaying, + prevDocumentTitle, + } = useContext(PlayerContext) + const [navOpacity, setNavOpacity] = useState(0) + const [data, setData] = useState() + const [isLoading, setLoading] = useState(true) + const [navPlayBtnVisible, setNavPlayBtnVisible] = useState(false) + + // const bgColor = useRaiseColorTone(useDominantColor(data?.images?.[0]?.url) || '#121212') + + const { data: dataColor } = usePalette(data?.images?.[0]?.url as string, 10, 'hex', { + crossOrigin: 'Anonymous', + quality: 100, + }) + + const bgColor = dataColor?.[2] ?? '#121212' + + const { ref: pivotTrackingRef, inView: isTracking } = useInView({ + threshold: 0, + }) + + useEffect(() => { + if (isPlaying) { + prevDocumentTitle.current = `${ + data?.name ? data?.name : 'Playlist' + } | Spotify Playlist` + } else { + documentTitle(`${data?.name ? data?.name : 'Playlist'} | Spotify Playlist`) + } + }, [isPlaying, data]) + + const headerRef = useRef() + const { height: headerHeight } = useComponentSize(headerRef) + + const { id } = useParams() + + const navigate = useNavigate() + + useEffect(() => { + const fetchData = async () => { + const data = await categoryApi({ + type: 'playlists', + id: id, + }) + if (data?.error) { + navigate('/not-found') + } else { + setData({ ...data }) + } + } + if (id !== 'undefined') { + fetchData() + } + }, [id]) + + useEffect(() => { + setLoading(Boolean(!data)) + }, [data]) + + const handleScroll = (e: React.UIEvent): void => { + const yAxis = e.currentTarget.scrollTop + if (yAxis > 64) { + setNavOpacity(1) + } else setNavOpacity(yAxis / 64) + if (yAxis > headerHeight + 14) { + setNavPlayBtnVisible(true) + } else setNavPlayBtnVisible(false) + } + + const handleClickPlayBtn = () => { + setQueue(data?.tracks?.items?.map((item) => item.track) || []) + setCurrentTrack(data?.tracks?.items?.[0]?.track) + setCurrentTrackIndex(0) + calNextTrackIndex() + setPlayingType('track') + } + + return ( +
+ +
isTracking && handleScroll(e)} className={cx('body')}> +
+
+
+
+
+
+
+
+
+ +
+ +
+ +
+
+
+
+
+ ) +} + +export default memo(Playlist) diff --git a/src/pages/Queue/Queue.module.scss b/src/pages/Queue/Queue.module.scss new file mode 100644 index 0000000..0439c20 --- /dev/null +++ b/src/pages/Queue/Queue.module.scss @@ -0,0 +1,93 @@ +@import '../../scss/variable'; +@import '../../scss/mixin'; + +.queue-wrapper { + height: 100%; + position: relative; + overflow: hidden; + background-color: $bg-base; +} + +.body { + height: 100%; + overflow: hidden; + overflow-y: scroll; + padding-bottom: 32px; + padding-top: $navbar-height; + position: relative; + + &::-webkit-scrollbar { + display: none; + } +} + +.title { + padding-inline: 24px; + font-size: 24px; + color: $white; + margin-bottom: 24px; + margin-top: 42px; +} + +.now-playing { + padding-inline: 24px; +} + + +.sub-title { + font-size: 16px; + color: $text-subdued; + margin: 0; + margin-bottom: 4px; +} + +.queue-list { + padding-inline: 24px; + margin-top: 40px; +} + +.queue-notify { + height: 50vh; + min-height: 300px; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} + +.content { + font-size: 32px; +} + +.home-btn { + font-size: 16px; + font-weight: 700; + text-decoration: none; + background: #fff; + border: 1px solid #878787; + border-radius: 48px; + color: #000; + display: inline-block; + line-height: 24px; + margin-bottom: 36px; + padding: 12px 32px; + text-align: center; + white-space: nowrap; + margin: 0 0 36px; + + &:hover { + transform: scale(1.04); + } +} + +.help { + font-size: 16px; + color: #fff; + display: block; + font-weight: 700; + text-decoration: none; + + &:hover { + text-decoration: underline; + } +} diff --git a/src/pages/Queue/Queue.tsx b/src/pages/Queue/Queue.tsx new file mode 100644 index 0000000..7c33e97 --- /dev/null +++ b/src/pages/Queue/Queue.tsx @@ -0,0 +1,91 @@ +import { Footer, Navbar, SongItem, SongList } from '@/components' +import { PlayerContext } from '@/contexts/PlayerContext' +import { documentTitle } from '@/utils' +import classNames from 'classnames/bind' +import { FC, useContext, useEffect } from 'react' +import { Link } from 'react-router-dom' +import styles from './Queue.module.scss' + +const cx = classNames.bind(styles) + +const Queue: FC = () => { + const { + queue, + currentTrack, + currentTrackIndex, + isShuffle, + isPlaying, + prevDocumentTitle, + } = useContext(PlayerContext) + + useEffect(() => { + if (isPlaying) { + prevDocumentTitle.current = 'Spotify - Play Queue' + } else { + documentTitle('Spotify - Play Queue') + } + }, [isPlaying]) + + const queueNormalized = queue.filter((item) => item) + + return ( +
+ +
+ {queueNormalized.length !== 0 ? ( + <> +

Queue

+
+

Now playing

+ +
+ {queue?.filter((item) => item)?.length > 1 && ( +
+

Next

+ track?.id !== currentTrack?.id) + : queueNormalized.slice(currentTrackIndex + 1) + } + adjustOrder={1} + /> +
+ )} + + ) : ( +
+

No Queue Tracks

+ +
Home
+ + + Help + +
+ )} +
+
+
+ ) +} + +export default Queue diff --git a/src/pages/Search/Search.module.scss b/src/pages/Search/Search.module.scss index cc20682..db1d36a 100644 --- a/src/pages/Search/Search.module.scss +++ b/src/pages/Search/Search.module.scss @@ -1,6 +1,19 @@ + .search { height: 100%; position: relative; overflow: hidden; +} + +.body { + height: 100%; + overflow: hidden; + overflow-y: scroll; + padding-bottom: 32px; + padding-top: 64px; + + &::-webkit-scrollbar { + display: none; + } } \ No newline at end of file diff --git a/src/pages/Search/Search.tsx b/src/pages/Search/Search.tsx index 3fb5d17..0cc0286 100644 --- a/src/pages/Search/Search.tsx +++ b/src/pages/Search/Search.tsx @@ -1,6 +1,9 @@ -import Navbar from '@/components/Navbar/Navbar' +import { Footer, Navbar, SearchBanner, SearchResult } from '@/components' +import { PlayerContext } from '@/contexts/PlayerContext' +import { SearchContext } from '@/contexts/SearchContext' +import { documentTitle } from '@/utils' import classNames from 'classnames/bind' -import React, { FC, useState } from 'react' +import React, { FC, useContext, useEffect, useState } from 'react' import styles from './Search.module.scss' const cx = classNames.bind(styles) @@ -10,13 +13,46 @@ interface SearchProps { } const Search: FC = () => { - // const { children } = props - const [query, setQuery] = useState('') + const { setQuery: setSearchQuery, query: searchQuery } = useContext(SearchContext) + const { isPlaying, prevDocumentTitle } = useContext(PlayerContext) + const [query, setQuery] = useState(searchQuery) + const [debounceValue, setDebounceValue] = useState(searchQuery) + + useEffect(() => { + if (isPlaying) { + prevDocumentTitle.current = 'Spotify – Search' + } else { + documentTitle('Spotify – Search') + } + }, [isPlaying]) + + useEffect(() => { + let timeoutId: any + if (!query?.trim()) { + setDebounceValue('') + } else { + timeoutId = setTimeout(() => { + setDebounceValue(query?.trim()) + }, 500) + } + + return () => clearTimeout(timeoutId) + }, [query]) + + useEffect(() => { + setSearchQuery(debounceValue) + }, [debounceValue]) return (
- -
+ +
+ {debounceValue && } +
+ +
+
+
) } diff --git a/src/pages/Section/Section.module.scss b/src/pages/Section/Section.module.scss new file mode 100644 index 0000000..3c906c1 --- /dev/null +++ b/src/pages/Section/Section.module.scss @@ -0,0 +1,19 @@ +@import '../../scss/variable'; + +.wrapper { + height: 100%; + position: relative; + overflow: hidden; +} + +.body { + height: 100%; + overflow: hidden; + overflow-y: scroll; + padding-bottom: 32px; + padding-top: $navbar-height; + + &::-webkit-scrollbar { + display: none; + } +} \ No newline at end of file diff --git a/src/pages/Section/Section.tsx b/src/pages/Section/Section.tsx new file mode 100644 index 0000000..6bc5f5c --- /dev/null +++ b/src/pages/Section/Section.tsx @@ -0,0 +1,122 @@ +import { Section as SectionContent } from '@/components' +import Footer from '@/components/Footer/Footer' +import Navbar from '@/components/Navbar/Navbar' +import { ArtistContext } from '@/contexts/ArtistContext' +import { HomePageContext } from '@/contexts/HomePageContext' +import classNames from 'classnames/bind' +import React, { useContext, useEffect, useState } from 'react' +import { useLocation, useParams } from 'react-router-dom' +import styles from './Section.module.scss' +import { SectionProps } from '@/types/section' + +const cx = classNames.bind(styles) + +const Section: React.FC = () => { + const [data, setData] = useState() + const featuringRegex = /^\/artist\/.*\/featuring$/ + const relatedRegex = /^\/artist\/.*\/related$/ + const playlistsRegex = /^\/artist\/.*\/playlists$/ + const discoveredOnRegex = /^\/artist\/.*\/discovered-on$/ + const appearsOnRegex = /^\/artist\/.*\/appears-on$/ + + const { profile, featuring, relatedArtists, discoveredOn, playlists, appearsOn } = + useContext(ArtistContext) + const { featurePlaylist, newReleases, suggestArtists, topMixes } = + useContext(HomePageContext) + + const { id } = useParams() + const { pathname } = useLocation() + + useEffect(() => { + const fetchData = async () => { + if (id === 'newReleases') { + setData({ + title: newReleases?.title, + href: newReleases?.href, + dataType: newReleases?.dataType, + data: newReleases?.data, + apiType: newReleases?.apiType, + }) + } else if (id === 'featurePlaylist') { + setData({ + title: featurePlaylist?.title, + href: featurePlaylist?.href, + dataType: featurePlaylist?.dataType, + data: featurePlaylist?.data, + apiType: featurePlaylist?.apiType, + }) + } else if (id === 'topMixes') { + setData({ + title: topMixes?.title, + href: topMixes?.href, + dataType: topMixes?.dataType, + data: topMixes?.data, + apiType: topMixes?.apiType, + }) + } else if (id === 'suggestedArtists') { + setData({ + title: suggestArtists?.title, + href: suggestArtists?.href, + dataType: suggestArtists?.dataType, + data: suggestArtists?.data, + apiType: suggestArtists?.apiType, + }) + } else if (featuringRegex.test(pathname)) { + setData({ + title: `Featuring ${profile?.name}`, + dataType: 'playlist', + data: featuring, + apiType: 'rapid', + }) + } else if (relatedRegex.test(pathname)) { + setData({ + title: `Fans also like`, + dataType: 'artist', + data: relatedArtists, + apiType: 'rapid', + }) + } else if (discoveredOnRegex.test(pathname)) { + setData({ + title: `Discovered on`, + dataType: 'playlist', + data: discoveredOn, + apiType: 'rapid', + }) + } else if (playlistsRegex.test(pathname)) { + setData({ + title: `Artist Playlists`, + dataType: 'playlist', + data: playlists, + apiType: 'rapid', + }) + } else if (appearsOnRegex.test(pathname)) { + setData({ + title: `Appear On`, + dataType: 'album', + data: appearsOn, + apiType: 'rapid', + }) + } + } + fetchData() + }, [pathname]) + + return ( +
+ +
+ +
+
+
+ ) +} + +export default Section diff --git a/src/pages/Show/Show.module.scss b/src/pages/Show/Show.module.scss new file mode 100644 index 0000000..8d8aa01 --- /dev/null +++ b/src/pages/Show/Show.module.scss @@ -0,0 +1,101 @@ +@import '../../scss/variable'; +@import '../../scss/mixin'; + +.show-wrapper { + height: 100%; + position: relative; + overflow: hidden; + background-color: $bg-base; +} + +.body { + height: 100%; + overflow: hidden; + overflow-y: scroll; + padding-bottom: 32px; + padding-top: $navbar-height; + position: relative; + + &::-webkit-scrollbar { + display: none; + } +} + +.pivot-tracking { + position: absolute; + z-index: -999; +} + +.main { + position: relative; +} + +.bg-blur { + position: absolute; + height: 232px; + top: 0; + left: 0; + right: 0; + background-image: linear-gradient(rgba(0, 0, 0, 0.6) 0, $bg-base 100%), $bg-noise; + z-index: 0; +} + +.action-bar { + display: flex; + position: relative; + padding: 24px; + align-items: center; + gap: 32px; + + .follow-btn { + @include reset-button; + padding: 8px 15px; + font-size: 14px; + font-weight: 700; + background-color: transparent; + color: $white; + border: 1px solid #878787; + border-radius: 500px; + cursor: pointer; + transition: all 33ms ease; + + &:hover { + border-color: $white; + transform: scale(1.04); + } + } +} + +.content { + position: relative; + z-index: 7; + display: flex; + flex-direction: row; + column-gap: 4%; + padding-inline: 24px; + + .about { + flex: 1; + order: 2; + padding-bottom: 20px; + } + + .episodes-list { + order: 1; + flex: 2; + } +} + +.col-layout { + .content { + flex-direction: column; + + .about { + order: 1; + } + + .episodes-list { + order: 2; + } + } +} diff --git a/src/pages/Show/Show.tsx b/src/pages/Show/Show.tsx new file mode 100644 index 0000000..459d1cb --- /dev/null +++ b/src/pages/Show/Show.tsx @@ -0,0 +1,118 @@ +import showApi from '@/apis/showApi' +import { AboutShow, Footer, Header, Navbar, ShowsList } from '@/components' +import { MainLayoutContext } from '@/contexts/MainLayoutContext' +import { PlayerContext } from '@/contexts/PlayerContext' +import { ShowData } from '@/types/show' +import { documentTitle } from '@/utils' +import classNames from 'classnames/bind' +import { usePalette } from 'color-thief-react' +import { FC, useContext, useEffect, useRef, useState } from 'react' +import { useInView } from 'react-intersection-observer' +import { useNavigate, useParams } from 'react-router-dom' +import styles from './Show.module.scss' + +const cx = classNames.bind(styles) + +const Show: FC = () => { + const { isPlaying, prevDocumentTitle } = useContext(PlayerContext) + const [navOpacity, setNavOpacity] = useState(0) + const [data, setData] = useState() + const [isLoading, setLoading] = useState(true) + const navigate = useNavigate() + // const bgColor = useRaiseColorTone(useDominantColor(data?.images?.[0].url) || '#121212') + + const { data: dataColor } = usePalette(data?.images?.[0]?.url as string, 10, 'hex', { + crossOrigin: 'Anonymous', + quality: 100, + }) + + const bgColor = dataColor?.[2] ?? '#121212' + + const { id } = useParams() + const { width } = useContext(MainLayoutContext) + const { ref: pivotTrackingRef, inView: isTracking } = useInView() //put above all + + useEffect(() => { + if (isPlaying) { + prevDocumentTitle.current = `${ + data?.name ? data?.name : ' | Podcast on Spotify' + } | Spotify Podcast` + } else { + documentTitle( + `${data?.name ? data?.name : ' | Podcast on Spotify'} | Spotify Podcast` + ) + } + }, [isPlaying, data]) + + const headerRef = useRef() + + useEffect(() => { + const fetchData = async () => { + const data = await showApi({ id }) + if (data?.error) { + navigate('/not-found') + } else { + setData({ ...data }) + } + } + if (id !== 'undefined') { + fetchData() + } + }, [id]) + + useEffect(() => { + setLoading(Boolean(!data)) + }, [data]) + + const handleScroll = (e: React.UIEvent): void => { + const yAxis = e.currentTarget.scrollTop + if (yAxis > 64) { + setNavOpacity(1) + } else setNavOpacity(yAxis / 64) + } + + return ( +
+ +
isTracking && handleScroll(e)}> +
+
+
+
+
+
+
+ +
+
+
+ +
+
+ +
+
+
+
+
+
+ ) +} + +export default Show diff --git a/src/pages/test.tsx b/src/pages/test.tsx new file mode 100644 index 0000000..5c76d02 --- /dev/null +++ b/src/pages/test.tsx @@ -0,0 +1,16 @@ +// import { getYoutubeTrackId, getYoutubeVideoId } from '@/apis/getAudioLink' +// import { useEffect } from 'react' + +const Test = () => { + // useEffect(() => { + // const fetchData = async () => { + // await getYoutubeTrackId('Suit & Tie - RPT MCK Hoang Ton album: 99%') + // } + + // fetchData() + // }, []) + + return
test
+} + +export default Test diff --git a/src/scss/_animations.scss b/src/scss/_animations.scss index efaa70d..93471b9 100644 --- a/src/scss/_animations.scss +++ b/src/scss/_animations.scss @@ -1,3 +1,3 @@ @mixin text-transition { - transition: all .2s cubic-bezier(0.215, 0.610, 0.355, 1) ; -} \ No newline at end of file + transition: all 0.2s cubic-bezier(0.215, 0.61, 0.355, 1); +} diff --git a/src/scss/_global.scss b/src/scss/_global.scss index 759c8c6..1050e90 100644 --- a/src/scss/_global.scss +++ b/src/scss/_global.scss @@ -1,7 +1,12 @@ -@import './variable'; +@import './variable'; -*, *::after, *::before { +*, +*::after, +*::before { box-sizing: border-box; + -webkit-box-sizing: border-box; + + scrollbar-width: none; } html { @@ -13,4 +18,17 @@ body { color: $white; } +a { + text-decoration: none; +} +p, +h1, +h2, +h3, +h4, +h5, +h6, +span { + line-height: 1.3; +} diff --git a/src/scss/_mixin.scss b/src/scss/_mixin.scss index f27519c..c1271ec 100644 --- a/src/scss/_mixin.scss +++ b/src/scss/_mixin.scss @@ -1,3 +1,5 @@ +@import './variable'; + @mixin backgroundImg($url) { background-image: url($url); background-position: center; @@ -12,9 +14,19 @@ } @mixin button-base { + color: $black; border: none; cursor: pointer; - transition: all ease-in-out .2s; + transition: all ease-in-out 0.2s; +} + +@mixin reset-button { + border: none; + outline: none; + + &:focus { + outline: none; + } } @mixin button-icon($size, $bg, $bg-highlight) { @@ -31,13 +43,58 @@ } } - @mixin button-text($padding, $bg, $bg-highlight) { + @include button-base(); padding: $padding; background-color: $bg; - @include button-base(); &:hover { background-color: $bg-highlight; } -} \ No newline at end of file +} + +@mixin text-line-clamp($line-number) { + display: -webkit-box; + -webkit-line-clamp: $line-number; + -webkit-box-orient: vertical; + overflow: hidden; + white-space: normal; +} + +@mixin text-in-one-line { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +@mixin text-shadow { + text-shadow: 0px 0px 2px #7d7d7d; +} + +@mixin button-active { + color: $secondary !important; + position: relative; + + &::after { + content: ''; + height: 4px; + width: 4px; + position: absolute; + background-color: $secondary; + border-radius: 50%; + bottom: 4px; + left: 50%; + transform: translateX(-50%); + } + + &:hover { + color: $primary; + } +} + +@mixin default-thumb { + @include item-center(); + width: 100%; + height: 100%; + background-color: $bg-card-highlight; +} diff --git a/src/scss/_variable.scss b/src/scss/_variable.scss index e8e7d85..0bbe99b 100644 --- a/src/scss/_variable.scss +++ b/src/scss/_variable.scss @@ -1,18 +1,20 @@ $black: #000; $white: #fff; $primary: #1ed760; - - +$secondary: #1db954; +$tertiary: #1dcf5d; $bg-base: #121212; $bg-highlight: #1a1a1a; $bg-elevated-base: #242424; $bg-elevated-highlight: #2a2a2a; +$bg-card: #181818; +$bg-card-highlight: #282828; +$essential-subdued: #727272; $bg-button: rgba(255, 255, 255, 0.07); $bg-button-highlight: rgba(255, 255, 255, 0.1); $bg-noise: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMDAiIGhlaWdodD0iMzAwIj48ZmlsdGVyIGlkPSJhIiB4PSIwIiB5PSIwIj48ZmVUdXJidWxlbmNlIGJhc2VGcmVxdWVuY3k9Ii43NSIgc3RpdGNoVGlsZXM9InN0aXRjaCIgdHlwZT0iZnJhY3RhbE5vaXNlIi8+PGZlQ29sb3JNYXRyaXggdHlwZT0ic2F0dXJhdGUiIHZhbHVlcz0iMCIvPjwvZmlsdGVyPjxwYXRoIGQ9Ik0wIDBoMzAwdjMwMEgweiIgZmlsdGVyPSJ1cmwoI2EpIiBvcGFjaXR5PSIuMDUiLz48L3N2Zz4=); - $text-subdued: #a7a7a7; $text-neutral: #b3b3b3; @@ -20,5 +22,6 @@ $panel-gap: 8px; $row-gap: 16px; $col-gap: 24px; +$panel-border-radius: 8px; -$panel-border-radius: 8px; \ No newline at end of file +$navbar-height: 64px; diff --git a/src/types/album.ts b/src/types/album.ts new file mode 100644 index 0000000..7236be5 --- /dev/null +++ b/src/types/album.ts @@ -0,0 +1,36 @@ +import { ArtistData } from './artist' +import { ImageSource } from './others' +import { SpotifyTrack } from './track' + +export interface AlbumItem { + title?: string + imageUrl?: string + id?: string + author?: string + dateTime?: string + album?: { + id?: string + images?: ImageSource[] + name?: string + artists?: ArtistData[] + } +} + +export interface SpotifyAlbum { + artists?: ArtistData[] + images?: ImageSource[] + id?: string + name?: string + album_type?: 'album' | 'Playlist' | 'single' | 'compilation' | 'podcast' | 'episode' + + release_date?: string + description?: string + tracks?: { + total?: number + items: SpotifyTrack[] + } + copyrights?: { + text?: string + type?: string + }[] +} diff --git a/src/types/artist.ts b/src/types/artist.ts new file mode 100644 index 0000000..1ece26e --- /dev/null +++ b/src/types/artist.ts @@ -0,0 +1,50 @@ +import { ExtractedColors, Gallery, HeaderImage, ImageSource } from './others' + +export interface ArtistData { + name: string + id: string +} + +export interface ArtistItem { + name?: string + imageUrl?: string + id?: string + images?: ImageSource[] +} + +export interface ArtistProfile { + id: string | undefined + name: string | undefined + bio: string | undefined + isVerified: boolean | undefined + biography?: { text: string } +} + +export interface ArtistTopCity { + city: string + country: string + numberOfListeners: number + region: string +} + +export interface ArtistStats { + followers: number + monthlyListeners: number + topCities: { items: ArtistTopCity[] } +} + +interface AvatarImage { + sources: ImageSource[] + extractedColors: ExtractedColors +} + +export interface Visuals { + avatarImage: AvatarImage + gallery: Gallery + headerImage: HeaderImage +} + +export interface ExternalLink { + name: string + url: string +} diff --git a/src/types/countries.ts b/src/types/countries.ts new file mode 100644 index 0000000..5cc4ecb --- /dev/null +++ b/src/types/countries.ts @@ -0,0 +1,185 @@ +export type countries = + | 'AD' + | 'AE' + | 'AG' + | 'AL' + | 'AM' + | 'AO' + | 'AR' + | 'AT' + | 'AU' + | 'AZ' + | 'BA' + | 'BB' + | 'BD' + | 'BE' + | 'BF' + | 'BG' + | 'BH' + | 'BI' + | 'BJ' + | 'BN' + | 'BO' + | 'BR' + | 'BS' + | 'BT' + | 'BW' + | 'BY' + | 'BZ' + | 'CA' + | 'CD' + | 'CG' + | 'CH' + | 'CI' + | 'CL' + | 'CM' + | 'CO' + | 'CR' + | 'CV' + | 'CW' + | 'CY' + | 'CZ' + | 'DE' + | 'DJ' + | 'DK' + | 'DM' + | 'DO' + | 'DZ' + | 'EC' + | 'EE' + | 'EG' + | 'ES' + | 'ET' + | 'FI' + | 'FJ' + | 'FM' + | 'FR' + | 'GA' + | 'GB' + | 'GD' + | 'GE' + | 'GH' + | 'GM' + | 'GN' + | 'GQ' + | 'GR' + | 'GT' + | 'GW' + | 'GY' + | 'HK' + | 'HN' + | 'HR' + | 'HT' + | 'HU' + | 'ID' + | 'IE' + | 'IL' + | 'IN' + | 'IQ' + | 'IS' + | 'IT' + | 'JM' + | 'JO' + | 'JP' + | 'KE' + | 'KG' + | 'KH' + | 'KI' + | 'KM' + | 'KN' + | 'KR' + | 'KW' + | 'KZ' + | 'LA' + | 'LB' + | 'LC' + | 'LI' + | 'LK' + | 'LR' + | 'LS' + | 'LT' + | 'LU' + | 'LV' + | 'LY' + | 'MA' + | 'MC' + | 'MD' + | 'ME' + | 'MG' + | 'MH' + | 'MK' + | 'ML' + | 'MN' + | 'MO' + | 'MR' + | 'MT' + | 'MU' + | 'MV' + | 'MW' + | 'MX' + | 'MY' + | 'MZ' + | 'NA' + | 'NE' + | 'NG' + | 'NI' + | 'NL' + | 'NO' + | 'NP' + | 'NR' + | 'NZ' + | 'OM' + | 'PA' + | 'PE' + | 'PG' + | 'PH' + | 'PK' + | 'PL' + | 'PS' + | 'PT' + | 'PW' + | 'PY' + | 'QA' + | 'RO' + | 'RS' + | 'RW' + | 'SA' + | 'SB' + | 'SC' + | 'SE' + | 'SG' + | 'SI' + | 'SK' + | 'SL' + | 'SM' + | 'SN' + | 'SR' + | 'ST' + | 'SV' + | 'SZ' + | 'TD' + | 'TG' + | 'TH' + | 'TJ' + | 'TL' + | 'TN' + | 'TO' + | 'TR' + | 'TT' + | 'TV' + | 'TW' + | 'TZ' + | 'UA' + | 'UG' + | 'US' + | 'UY' + | 'UZ' + | 'VC' + | 'VE' + | 'VN' + | 'VU' + | 'WS' + | 'XK' + | 'ZA' + | 'ZM' + | 'ZW' diff --git a/src/types/homePage.ts b/src/types/homePage.ts new file mode 100644 index 0000000..2eca90e --- /dev/null +++ b/src/types/homePage.ts @@ -0,0 +1,13 @@ +import { countries } from "./countries" + +export interface NewReleasesArgs { + accessToken: string + limit: number + country: countries +} + +export interface FeaturedPlaylistsProps { + limit: number + accessToken: string + country: countries +} diff --git a/src/types/others.ts b/src/types/others.ts new file mode 100644 index 0000000..8350c2e --- /dev/null +++ b/src/types/others.ts @@ -0,0 +1,50 @@ +import { ArtistData } from "./artist" + +export interface ImageSource { + url: string + width: number + height: number +} + +export interface ColorRaw { + hex: string +} + +export interface ExtractedColors { + colorRaw: ColorRaw +} + +export interface GalleryItem { + sources: ImageSource[] +} + +export interface Gallery { + items: GalleryItem[] +} + +export interface AvatarImage { + sources: ImageSource[] + extractedColors: ExtractedColors +} + +export interface HeaderImage { + sources: ImageSource[] + extractedColors: ExtractedColors +} + +export interface HeaderProps { + title?: string + thumbnail?: string + quantity?: number + type?: 'Playlist' | 'album' | 'single' | 'compilation' | 'podcast' | 'episode' + bgColor?: string + desc?: string + isLoading?: boolean + artists?: ArtistData[] + releaseDate?: string + isWhiteColor?: boolean + headerType?: 'playlist' | 'album' | 'show' | 'genre' + publisher?: string + showName?: string + showId?: string +} diff --git a/src/types/playlist.ts b/src/types/playlist.ts new file mode 100644 index 0000000..ccb957c --- /dev/null +++ b/src/types/playlist.ts @@ -0,0 +1,27 @@ +import { ImageSource } from './others' +import { SpotifyTrack } from './track' + +export interface PlayListItem { + title?: string + imageUrl?: string + author?: string + id?: string + name?: string + description?: string + images?: ImageSource[] +} + +export interface PlaylistData { + description?: string + id?: string + name?: string + images?: ImageSource[] + owner?: { + display_name?: string + id?: string + } + tracks?: { + items?: { track: SpotifyTrack }[] + total?: number + } +} diff --git a/src/types/search.ts b/src/types/search.ts new file mode 100644 index 0000000..6c21f7f --- /dev/null +++ b/src/types/search.ts @@ -0,0 +1,16 @@ +export interface SearchBannerItem { + title?: string + imgUrl?: string + id?: string + bgColor?: string +} + +export interface CategoryItem { + icons: { + height: number + width: number + url: string + }[] + id: string + name: string +} diff --git a/src/types/section.ts b/src/types/section.ts new file mode 100644 index 0000000..e6a0f46 --- /dev/null +++ b/src/types/section.ts @@ -0,0 +1,49 @@ +import { AlbumItem } from './album' +import { ArtistData, ArtistItem, Visuals } from './artist' +import { ImageSource } from './others' +import { PlayListItem } from './playlist' + +export interface SectionItemI extends PlayListItem, ArtistItem, AlbumItem { + isArtist?: boolean + isLoading?: boolean + columnWidth?: number + dataType?: string + artists?: ArtistData[] + desc?: string + publisher?: string + dateAdd?: string + type?: 'default' | 'playlist' | 'album' | 'artistList' | 'artist' | 'show' +} + +export interface SectionProps { + title?: string + href?: string + data?: ResponseSectionItem[] + dataType?: string + isFull?: boolean + isClickable?: boolean + hideHeader?: boolean + type?: 'default' | 'playlist' | 'album' | 'artistList' | 'artist' | 'show' + apiType?: 'spotify' | 'rapid' + pageType?: 'section' | 'genre' +} + +export interface ResponseSectionItem { + id?: string + name?: string + images: ImageSource[] | any + publisher?: string + artists?: ArtistData[] + description?: string + owner?: { + display_name: string + } + release_date?: string + uri?: string + visuals?: Visuals + profile?: any + releases?: any + coverArt?: any + date?: any + albumId?: string +} diff --git a/src/types/show.ts b/src/types/show.ts new file mode 100644 index 0000000..b5fe5b2 --- /dev/null +++ b/src/types/show.ts @@ -0,0 +1,45 @@ +import { ImageSource } from './others' + +export interface ShowItem { + description?: string + html_description?: string + duration_ms?: number + explicit?: boolean + id?: string + images?: ImageSource[] + name?: string + release_date?: string + type?: string +} + +export interface ShowData { + description?: string + html_description?: string + episodes?: { + items?: ShowItem[] + } + explicit?: boolean + id?: string + images?: ImageSource[] + name?: string + publisher?: string + total_episodes?: number +} + +export interface Episode extends ShowItem { + show?: { + id?: string + images?: ImageSource[] + name?: string + publisher?: string + } +} + +export interface Episode extends ShowItem { + show?: { + id?: string + images?: ImageSource[] + name?: string + publisher?: string + } +} diff --git a/src/types/sidebar.ts b/src/types/sidebar.ts new file mode 100644 index 0000000..fb99724 --- /dev/null +++ b/src/types/sidebar.ts @@ -0,0 +1,38 @@ +import { AlbumItem } from './album' +import { ArtistData, ArtistItem } from './artist' +import { PlayListItem } from './playlist' + +export type LibSelection = { + title: string + id: string + type: 'playlist' | 'album' | 'artist' + active: boolean +} + +export interface ResponseLibItem { + id?: string + owner?: { + display_name?: string + } + artists?: ArtistData[] + name?: string + images?: { + url?: string + }[] +} + +export interface SidebarItemProps { + author?: string + type?: 'playlist' | 'artist' | 'album' + thumbnail?: string | undefined + name?: string | undefined + id?: string + artists?: ArtistData[] +} + +export interface LibDataItem extends PlayListItem, AlbumItem, ArtistItem { + owner?: { + display_name: string + } + artists?: ArtistData[] +} diff --git a/src/types/track.ts b/src/types/track.ts new file mode 100644 index 0000000..3788bfe --- /dev/null +++ b/src/types/track.ts @@ -0,0 +1,87 @@ +import { SpotifyAlbum } from './album' +import { ArtistData } from './artist' +import { ImageSource } from './others' + +export interface SongItemTagProps { + thumbnailUrl?: string + name?: string + isLoading?: boolean + id?: string + setBgColor: React.Dispatch> + albumId?: string +} + +export interface SongItemProps { + songName?: string + artists?: ArtistData[] + thumb?: string + duration?: number + order?: number + isLoading?: boolean + albumData?: SpotifyAlbum + dateAdd?: string + isExplicit?: boolean + type?: 'default' | 'playlist' | 'album' | 'search' | 'artist' + id?: string + originalData?: SpotifyTrack + isPlaying?: boolean +} + +export interface SongListProps { + songList?: SongItemProps[] | { track?: SpotifyTrack }[] + pivotTop?: number + top?: number + isLoading?: boolean + type?: 'default' | 'playlist' | 'album' | 'search' | 'artist' + albumId?: string + albumImages?: ImageSource[] + inclHeader?: boolean + albumName?: string + albumType?: + | 'album' + | 'Playlist' + | 'single' + | 'compilation' + | 'podcast' + | 'episode' + | undefined + adjustOrder?: number +} + +export interface SpotifyTrack { + album?: SpotifyAlbum + artists?: ArtistData[] + explicit?: boolean + duration_ms?: number + name?: string + id?: string + popularity?: number +} + +// -----------Rapid---------- + +export interface RapidTrack { + soundcloudTrack?: { + audio?: { + quality?: string + url?: string + durationMs?: number + durationText?: string + }[] + } +} + +export interface RapidArtistTrack { + uid?: string + track?: { + album?: any + artists?: any + id?: string + name?: string + uri?: string + playcount?: string + duration?: { + totalMilliseconds?: number + } + } +} diff --git a/src/types/types.ts b/src/types/types.ts new file mode 100644 index 0000000..3598597 --- /dev/null +++ b/src/types/types.ts @@ -0,0 +1,482 @@ +// export type countries = +// | 'AD' +// | 'AE' +// | 'AG' +// | 'AL' +// | 'AM' +// | 'AO' +// | 'AR' +// | 'AT' +// | 'AU' +// | 'AZ' +// | 'BA' +// | 'BB' +// | 'BD' +// | 'BE' +// | 'BF' +// | 'BG' +// | 'BH' +// | 'BI' +// | 'BJ' +// | 'BN' +// | 'BO' +// | 'BR' +// | 'BS' +// | 'BT' +// | 'BW' +// | 'BY' +// | 'BZ' +// | 'CA' +// | 'CD' +// | 'CG' +// | 'CH' +// | 'CI' +// | 'CL' +// | 'CM' +// | 'CO' +// | 'CR' +// | 'CV' +// | 'CW' +// | 'CY' +// | 'CZ' +// | 'DE' +// | 'DJ' +// | 'DK' +// | 'DM' +// | 'DO' +// | 'DZ' +// | 'EC' +// | 'EE' +// | 'EG' +// | 'ES' +// | 'ET' +// | 'FI' +// | 'FJ' +// | 'FM' +// | 'FR' +// | 'GA' +// | 'GB' +// | 'GD' +// | 'GE' +// | 'GH' +// | 'GM' +// | 'GN' +// | 'GQ' +// | 'GR' +// | 'GT' +// | 'GW' +// | 'GY' +// | 'HK' +// | 'HN' +// | 'HR' +// | 'HT' +// | 'HU' +// | 'ID' +// | 'IE' +// | 'IL' +// | 'IN' +// | 'IQ' +// | 'IS' +// | 'IT' +// | 'JM' +// | 'JO' +// | 'JP' +// | 'KE' +// | 'KG' +// | 'KH' +// | 'KI' +// | 'KM' +// | 'KN' +// | 'KR' +// | 'KW' +// | 'KZ' +// | 'LA' +// | 'LB' +// | 'LC' +// | 'LI' +// | 'LK' +// | 'LR' +// | 'LS' +// | 'LT' +// | 'LU' +// | 'LV' +// | 'LY' +// | 'MA' +// | 'MC' +// | 'MD' +// | 'ME' +// | 'MG' +// | 'MH' +// | 'MK' +// | 'ML' +// | 'MN' +// | 'MO' +// | 'MR' +// | 'MT' +// | 'MU' +// | 'MV' +// | 'MW' +// | 'MX' +// | 'MY' +// | 'MZ' +// | 'NA' +// | 'NE' +// | 'NG' +// | 'NI' +// | 'NL' +// | 'NO' +// | 'NP' +// | 'NR' +// | 'NZ' +// | 'OM' +// | 'PA' +// | 'PE' +// | 'PG' +// | 'PH' +// | 'PK' +// | 'PL' +// | 'PS' +// | 'PT' +// | 'PW' +// | 'PY' +// | 'QA' +// | 'RO' +// | 'RS' +// | 'RW' +// | 'SA' +// | 'SB' +// | 'SC' +// | 'SE' +// | 'SG' +// | 'SI' +// | 'SK' +// | 'SL' +// | 'SM' +// | 'SN' +// | 'SR' +// | 'ST' +// | 'SV' +// | 'SZ' +// | 'TD' +// | 'TG' +// | 'TH' +// | 'TJ' +// | 'TL' +// | 'TN' +// | 'TO' +// | 'TR' +// | 'TT' +// | 'TV' +// | 'TW' +// | 'TZ' +// | 'UA' +// | 'UG' +// | 'US' +// | 'UY' +// | 'UZ' +// | 'VC' +// | 'VE' +// | 'VN' +// | 'VU' +// | 'WS' +// | 'XK' +// | 'ZA' +// | 'ZM' +// | 'ZW' + +// // API fetching +// export interface NewReleasesArgs { +// accessToken: string +// limit: number +// country: countries +// } + +// export interface FeaturedPlaylistsProps { +// limit: number +// accessToken: string +// country: countries +// } + +// export interface RequestArg { +// type: 'playlists' | 'albums' +// accessToken: string +// id: string +// } + +// // ---------------------------------------------------- + +// export interface ImageSource { +// url: string +// width: number +// height: number +// } + +// interface ColorRaw { +// hex: string +// } + +// interface ExtractedColors { +// colorRaw: ColorRaw +// } + +// interface GalleryItem { +// sources: ImageSource[] +// } + +// interface Gallery { +// items: GalleryItem[] +// } + +// interface AvatarImage { +// sources: ImageSource[] +// extractedColors: ExtractedColors +// } + +// interface HeaderImage { +// sources: ImageSource[] +// extractedColors: ExtractedColors +// } + +// interface Visuals { +// avatarImage: AvatarImage +// gallery: Gallery +// headerImage: HeaderImage +// } + +// export interface ArtistData { +// name: string +// id: string +// } +// export interface SearchBannerItem { +// title?: string +// imageUrl?: string +// bgColor?: string +// } + +// export interface PlayListItem { +// title?: string +// imageUrl?: string +// author?: string +// id?: string +// } + +// export interface ArtistItem { +// name?: string +// imageUrl?: string +// id?: string +// } + +// export interface AlbumItem { +// title?: string +// imageUrl?: string +// id?: string +// author?: string +// dateTime?: string +// } + +// export interface SectionItemI extends PlayListItem, ArtistItem, AlbumItem { +// isArtist?: boolean +// isLoading?: boolean +// columnWidth?: number +// dataType?: string +// artists?: ArtistData[] +// desc?: string +// publisher?: string +// dateAdd?: string +// type?: 'default' | 'playlist' | 'album' | 'artistList' | 'artist' | 'show' +// } + +// export interface SectionProps { +// title?: string +// href?: string +// data?: ResponseSectionItem[] +// dataType?: string +// isFull?: boolean +// isClickable?: boolean +// hideHeader?: boolean +// type?: 'default' | 'playlist' | 'album' | 'artistList' | 'artist' | 'show' +// apiType: 'spotify' | 'rapid' | undefined +// } + +// export interface SongItemTagProps { +// thumbnailUrl?: string +// name?: string +// isLoading?: boolean +// id?: string +// setBgColor: React.Dispatch> +// } + +// export interface HeaderProps { +// title?: string +// thumbnail?: string +// quantity?: number +// type?: 'Playlist' | 'album' | 'single' | 'compilation' | 'podcast' | 'episode' +// bgColor?: string +// desc?: string +// isLoading?: boolean +// artists?: string +// releaseDate?: string +// isWhiteColor?: boolean +// headerType?: 'playlist' | 'album' | 'show' +// publisher?: string +// showName?: string +// showId?: string +// } + +// export type LibSelection = { +// title: string +// id: string +// type: 'playlist' | 'album' | 'artist' +// active: boolean +// } + +// export interface ResponseLibItem { +// id?: string +// owner?: { +// display_name?: string +// } +// artists?: ArtistData[] +// name?: string +// images?: { +// url?: string +// }[] +// } + +// export interface ResponseSectionItem { +// id?: string +// name?: string +// images: +// | { +// url: string +// }[] +// | any +// publisher?: string +// artists?: ArtistData[] +// description?: string +// owner?: { +// display_name: string +// } +// release_date?: string +// uri?: string +// visuals?: Visuals +// profile?: any +// releases?: any +// coverArt?: any +// date?: any +// } + +// export interface SongItemProps { +// songName?: string +// artists?: ArtistData[] +// thumb?: string +// duration?: number +// order?: number +// isLoading?: boolean +// albumData?: SpotifyAlbum +// dateAdd?: string +// isExplicit?: boolean +// type?: 'default' | 'playlist' | 'album' | 'search' | 'artist' +// id?: string +// } +// export interface SongListProps { +// songList: SongItemProps[] +// pivotTop: number +// top: number +// isLoading?: boolean +// type?: 'default' | 'playlist' | 'album' | 'search' | 'artist' +// } + +// // ____________Artist______________ + +// export interface ArtistProfile { +// id: string | undefined +// name: string | undefined +// bio: string | undefined +// isVerified: boolean | undefined +// biography?: { text: string } +// } + +// export interface ArtistTopCity { +// city: string +// country: string +// numberOfListeners: number +// region: string +// } + +// export interface ArtistStats { +// followers: number +// monthlyListeners: number +// topCities: { items: ArtistTopCity[] } +// } + +// export interface SpotifyAlbum { +// artists?: ArtistData[] +// images?: { url?: string }[] +// id?: string +// name?: string +// } + +// export interface SpotifyTrack { +// album?: SpotifyAlbum +// artists?: ArtistData[] +// duration_ms?: number +// name?: string +// id?: string +// } + +// export interface RapidTrack { +// soundcloudTrack?: { +// audio?: { +// quality?: string +// url?: string +// durationMs?: number +// durationText?: string +// }[] +// } +// } + +// // ------Shows------ + +// export interface ShowItem { +// description?: string +// html_description?: string +// duration_ms?: number +// explicit?: boolean +// id?: string +// images?: ImageSource[] +// name?: string +// release_date?: string +// } + +// export interface ShowData { +// description?: string +// html_description?: string +// episodes?: { +// items?: ShowItem[] +// } +// explicit?: boolean +// id?: string +// images?: ImageSource[] +// name?: string +// publisher?: string +// total_episodes?: number +// } + +// export interface Episode extends ShowItem { +// show?: { +// id?: string +// images?: ImageSource[] +// name?: string +// publisher?: string +// } +// } + +// // ------user------ +// export interface UserData { +// display_name?: string +// id?: string +// images?: ImageSource[] +// email?: string +// country?: countries +// followers?: { total?: number } +// } \ No newline at end of file diff --git a/src/types/user.ts b/src/types/user.ts new file mode 100644 index 0000000..788a89e --- /dev/null +++ b/src/types/user.ts @@ -0,0 +1,11 @@ +import { countries } from './countries' +import { ImageSource } from './others' + +export interface UserData { + display_name?: string + id?: string + images?: ImageSource[] + email?: string + country?: countries + followers?: { total?: number } +} diff --git a/src/utils/dateFormatConvertor.ts b/src/utils/dateFormatConvertor.ts new file mode 100644 index 0000000..dd4d9c6 --- /dev/null +++ b/src/utils/dateFormatConvertor.ts @@ -0,0 +1,11 @@ +const dateFormatConvertor = (dateString: string | undefined): string => { + if(!dateString) return '' + const date = new Date(dateString) + return date.toLocaleDateString('en-US', { + month: 'long', + day: 'numeric', + year: 'numeric', + }) +} + +export default dateFormatConvertor diff --git a/src/utils/deleteAllCookies.ts b/src/utils/deleteAllCookies.ts new file mode 100644 index 0000000..5d60571 --- /dev/null +++ b/src/utils/deleteAllCookies.ts @@ -0,0 +1,25 @@ +//fix 403 Forbidden + +const deleteAllCookies = () => { + document.cookie = document.cookie.split(';').reduce((newCookie1, keyVal) => { + const pair = keyVal.trim().split('=') + if (pair[0]) { + if (pair[0] !== 'path' && pair[0] !== 'expires') { + newCookie1 += pair[0] + '=;' + } + } + return newCookie1 + }, 'expires=Thu, 01 Jan 1970 00:00:00 UTC; path:/;') + + caches.keys().then((keys) => { + keys.forEach((key) => caches.delete(key)) + }) + + // indexedDB.databases().then((dbs) => { + // dbs.forEach((db) => indexedDB.deleteDatabase(db.name as string)) + // }) + + sessionStorage.clear() +} + +export default deleteAllCookies diff --git a/src/utils/documentTitle.ts b/src/utils/documentTitle.ts new file mode 100644 index 0000000..45d1387 --- /dev/null +++ b/src/utils/documentTitle.ts @@ -0,0 +1,6 @@ +const documentTitle = (title: string): void => { + if (!title) return + window.document.title = title +} + +export default documentTitle \ No newline at end of file diff --git a/src/utils/durationConvertor.ts b/src/utils/durationConvertor.ts new file mode 100644 index 0000000..f252f6a --- /dev/null +++ b/src/utils/durationConvertor.ts @@ -0,0 +1,29 @@ +interface durationConvertorParams { + milliseconds?: number + type?: 'short' | 'long' +} + +const durationConvertor = (params: Partial): string => { + const { milliseconds, type = 'short' } = params + if (!milliseconds && milliseconds !== 0) return '' + const totalSeconds = Math.floor(milliseconds / 1000) + const hours = Math.floor(totalSeconds / 3600) + const minutes = `${('0' + Math.floor((totalSeconds % 3600) / 60)).slice(-2)}` + const seconds = `${('0' + (totalSeconds % 60)).slice(-2)}` + + if (type === 'short') { + if (hours > 0) { + return `${hours}:${minutes}:${seconds}` + } + + return `${minutes}:${seconds}` + } else { + if (hours > 0) { + return `${hours} hours ${minutes} min ${seconds} sec` + } + + return `${minutes} min ${seconds} sec` + } +} + +export default durationConvertor diff --git a/src/utils/fetchData.ts b/src/utils/fetchData.ts deleted file mode 100644 index 87fd60d..0000000 --- a/src/utils/fetchData.ts +++ /dev/null @@ -1,45 +0,0 @@ -import axios from 'axios' - -export const types = { - albums: 'albums', - artists: 'artists', - episodes: 'episodes', - genres: 'genres', - playlists: 'playlists', - podcasts: 'podcasts', - tracks: 'tracks', - users: 'users', - multi: 'multi', -} - -export const options = { - search: 'search', - artists: 'artists', - tracks: 'tracks', -} - - -export const fetchData = async ( - option: string, - param: string, - type = 'multi', - limit = 10 -) => { - const options = { - method: 'GET', - url: `https://spotify-web2.p.rapidapi.com/${option}/`, - params: { - q: param, - type: type, - offset: '0', - limit: `${limit}`, - numberOfTopResults: '5', - }, - headers: { - 'X-RapidAPI-Key': process.env.RAPID_SPOTIFY_API, - 'X-RapidAPI-Host': 'spotify-web2.p.rapidapi.com', - }, - } - const response = await axios.request(options) - return response -} diff --git a/src/utils/fetchHomePageData.ts b/src/utils/fetchHomePageData.ts new file mode 100644 index 0000000..45c56f1 --- /dev/null +++ b/src/utils/fetchHomePageData.ts @@ -0,0 +1,114 @@ +import browserApi from '@/apis/browserApi' +import { getCategoryPlaylist } from '@/apis/categoriesApi' +import searchApi from '@/apis/searchApi' +import { SectionProps } from '@/types/section' + +interface PropsType { + type: 'newRelease' | 'featuredPlaylists' | 'topMixes' | 'suggestedArtists' | 'category' + setData: React.Dispatch> + limit?: number + categoryId?: string + categoryName?: string +} + +const fetchHomePageData = (params: Partial) => { + const { type, setData, limit = 50, categoryId, categoryName } = params + + if (type === 'category') { + const fetchData = async () => { + const data = await getCategoryPlaylist({ id: categoryId, limit: 20 }) + const dataNormalized = data?.playlists?.items?.filter((item: any) => item) + setData!({ + title: categoryName, + href: `/genre/${categoryId}`, + apiType: 'spotify', + data: dataNormalized, + dataType: 'playlist', + }) + } + fetchData() + return + } + + switch (type) { + case 'newRelease': { + const fetchData = async () => { + const response = await browserApi({ + limit: limit, + country: 'VN', + type: 'new-releases', + }) + setData!({ + title: 'New Releases', + href: '/section/newReleases', + dataType: 'album', + data: response, + apiType: 'spotify', + }) + } + fetchData() + break + } + + case 'featuredPlaylists': { + const fetchData = async () => { + const response = await browserApi({ + limit: limit, + country: 'VN', + type: 'featured-playlists', + }) + setData!({ + title: 'Featured Playlists', + href: '/section/featurePlaylist', + dataType: 'playlist', + data: response, + apiType: 'spotify', + }) + } + fetchData() + break + } + + case 'topMixes': { + const fetchData = async () => { + const response = await searchApi({ + query: 'chill mix lofi', + types: ['playlist'], + limit: limit, + }) + setData!({ + title: 'Top mixes', + href: '/section/topMixes', + dataType: 'playlist', + data: response?.playlists.items, + apiType: 'spotify', + }) + } + fetchData() + break + } + + case 'suggestedArtists': { + const fetchData = async () => { + const response = await searchApi({ + query: 'artist', + types: ['artist'], + limit: limit, + }) + setData!({ + title: 'Suggested artists', + href: '/section/suggestedArtists', + dataType: 'artist', + data: response?.artists.items + .sort((a: any, b: any) => -a.popularity + b.popularity) + .filter((artist: any) => artist.images.length !== 0), + apiType: 'spotify', + }) + } + fetchData() + break + } + } +} + +export default fetchHomePageData diff --git a/src/utils/fetchLocalData.ts b/src/utils/fetchLocalData.ts new file mode 100644 index 0000000..3fb1bf1 --- /dev/null +++ b/src/utils/fetchLocalData.ts @@ -0,0 +1,8 @@ +const fetchLocalData = async (fileName: string) => { + const response = await fetch(`../assets/data/${fileName}.json`) + const data = await response.json() + + return data +} + +export default fetchLocalData diff --git a/src/utils/fetchSidebarData.ts b/src/utils/fetchSidebarData.ts new file mode 100644 index 0000000..04a3697 --- /dev/null +++ b/src/utils/fetchSidebarData.ts @@ -0,0 +1,33 @@ +import { getUserAlbum, getUserPlaylist, getUserTopArtists } from '@/apis/userApi' + +interface argsProps { + type: 'playlist' | 'album' | 'artist' + userId: string +} + +const fetchSidebarData = async (args: Partial) => { + const { type, userId } = args + + switch (type) { + case 'playlist': { + if (!userId) return + const data = await getUserPlaylist(userId as string) + return data?.items + } + case 'artist': { + const data = await getUserTopArtists() + return data?.items + } + case 'album': { + const data = await getUserAlbum() + return data?.items + } + default: { + if (!userId) return + const data = await getUserPlaylist(userId as string) + return data?.items + } + } +} + +export default fetchSidebarData diff --git a/src/utils/generateRandomString.ts b/src/utils/generateRandomString.ts new file mode 100644 index 0000000..42df06e --- /dev/null +++ b/src/utils/generateRandomString.ts @@ -0,0 +1,11 @@ +const generateRandomString = (length: number) => { + let text = '' + const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' + + for (let i = 0; i < length; i++) { + text += possible.charAt(Math.floor(Math.random() * possible.length)) + } + return text +} + +export default generateRandomString diff --git a/src/utils/htmlCleaner.ts b/src/utils/htmlCleaner.ts new file mode 100644 index 0000000..9d42208 --- /dev/null +++ b/src/utils/htmlCleaner.ts @@ -0,0 +1,26 @@ +import { ArtistData } from '@/types/artist' + +export default function htmlCleaner( + htmlString: string | undefined +): ArtistData[] | null | string { + if (!htmlString) return null + const parser = new DOMParser() + const doc = parser.parseFromString(htmlString, 'text/html') + const playlists: ArtistData[] = [] + + const links = doc.querySelectorAll('a') + if (links.length === 0) { + return htmlString + } + + links.forEach((link) => { + const name = link.textContent?.trim() + const href = link.getAttribute('href') + if (name && href && href.startsWith('spotify:playlist:')) { + const id = href.split(':')[2] + playlists.push({ name, id }) + } + }) + + return playlists +} diff --git a/src/utils/index.ts b/src/utils/index.ts new file mode 100644 index 0000000..94048d8 --- /dev/null +++ b/src/utils/index.ts @@ -0,0 +1,27 @@ +import dateFormatConvertor from './dateFormatConvertor' +import fetchLocalData from './fetchLocalData' +import fetchSidebarData from './fetchSidebarData' +import htmlCleaner from './htmlCleaner' +import stringCleaner from './stringCleaner' +import { unicodeDecoder } from './unicodeDecoder' +import fetchHomePageData from './fetchHomePageData' +import normalizeAlbum from './normalizeAlbum' +import normalizeTrack from './normalizeTrack' +import transformDomain from './transformDomain' +import documentTitle from './documentTitle' +import deleteAllCookies from './deleteAllCookies' + +export { + dateFormatConvertor, + fetchLocalData, + fetchSidebarData, + htmlCleaner, + stringCleaner, + unicodeDecoder, + fetchHomePageData, + normalizeAlbum, + normalizeTrack, + transformDomain, + documentTitle, + deleteAllCookies, +} diff --git a/src/utils/normalizeAlbum.ts b/src/utils/normalizeAlbum.ts new file mode 100644 index 0000000..622ba5b --- /dev/null +++ b/src/utils/normalizeAlbum.ts @@ -0,0 +1,10 @@ +import { SpotifyAlbum } from '@/types/album' + +const normalizeAlbum = (album: any): SpotifyAlbum => { + return { + images: album.coverArt.sources, + id: album.uri.split(':').pop(), + } +} + +export default normalizeAlbum diff --git a/src/utils/normalizeTrack.ts b/src/utils/normalizeTrack.ts new file mode 100644 index 0000000..bc436c0 --- /dev/null +++ b/src/utils/normalizeTrack.ts @@ -0,0 +1,16 @@ +import { RapidArtistTrack, SpotifyTrack } from '@/types/track' +import { normalizeAlbum } from '.' + +const normalizeTrack = (rapidTrack: RapidArtistTrack): SpotifyTrack => { + return { + album: normalizeAlbum(rapidTrack?.track?.album), + artists: rapidTrack?.track?.artists.items.map((item: any) => { + return { name: item?.profile?.name, id: item?.uri.split(':').pop() } + }), + duration_ms: rapidTrack?.track?.duration?.totalMilliseconds, + name: rapidTrack?.track?.name, + id: rapidTrack?.track?.id, + } +} + +export default normalizeTrack diff --git a/src/utils/stringCleaner.ts b/src/utils/stringCleaner.ts new file mode 100644 index 0000000..089bd12 --- /dev/null +++ b/src/utils/stringCleaner.ts @@ -0,0 +1,14 @@ +const stringCleaner = (input?: string): string => { + if(!input) return '' + // Replace HTML entities + const replacedEntities = input + .replace(/&/g, "&") + .replace(///g, "/"); + + // Remove duplicate slashes + const cleanedString = replacedEntities.replace(/\/{2,}/g, "/"); + + return cleanedString; +} + +export default stringCleaner \ No newline at end of file diff --git a/src/utils/transformDomain.ts b/src/utils/transformDomain.ts new file mode 100644 index 0000000..56fa27d --- /dev/null +++ b/src/utils/transformDomain.ts @@ -0,0 +1,7 @@ +import { REDIRECT_URI } from '@/constants/auth' + +const transformDomain = (inputString: string): string => { + return inputString.replace(/https:\/\/open\.spotify\.com\//g, REDIRECT_URI) +} + +export default transformDomain diff --git a/src/utils/unicodeDecoder.ts b/src/utils/unicodeDecoder.ts new file mode 100644 index 0000000..4ef57df --- /dev/null +++ b/src/utils/unicodeDecoder.ts @@ -0,0 +1,9 @@ +export const unicodeDecoder = (input: string | undefined): string => { + if(!input) return '' + return input.replace( + /&#(\d+);/g, + (_: string, dec: string): string => { + return String.fromCharCode(parseInt(dec, 10)) + } + ) +} diff --git a/types.d.ts b/types.d.ts new file mode 100644 index 0000000..bfff402 --- /dev/null +++ b/types.d.ts @@ -0,0 +1 @@ +declare module '@uidotdev/usehooks'; \ No newline at end of file diff --git a/vite.config.ts b/vite.config.ts index 4c71434..2f6343f 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -6,7 +6,7 @@ export default defineConfig({ plugins: [react()], resolve: { alias: { - '@': '/src' - } - } + '@': '/src', + }, + }, })