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 && (
+
+ setExpanded((prev) => !prev)}>
+ {isExpanded ? 'Show less' : '... Show more'}
+
+
+ )}
+
+ )
+}
+
+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 && (
+
+ {/*
*/}
+
+
+ )}
+
+ {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()}>
+
+
+
+
+
+
+
+
+
+
+
+
+
{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}
+ {!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 && setShuffle(!isShuffle)}
+ className={cx({ btn: true, active: isShuffle })}
+ >
+
+
+
+
+ isBtnClickable && handleBack()} className={cx('btn')}>
+
+
+
+
+ isBtnClickable && handlePlayBtn()} className={cx('btn')}>
+
+
+
+
+ isBtnClickable && handleForward()} className={cx('btn')}>
+
+
+
+
+ isBtnClickable && setRepeat((prev) => !prev)}
+ className={cx({ btn: true, active: isRepeat })}
+ >
+
+
+
+
+
+
+ {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) => (
+ setCategory(item.key)}
+ >
+ {item.display}
+
+ ))}
+
+
+
+
+
+ )
+}
+
+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 (
+
+ )
+}
+
+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 ? (
+
+ ) : (
+
+ )
+ ) : (
+
+ )}
+
+
+ {!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 (
-
+
-
+ navigate(-1)}>
navigate(1)}
>
- {isSearch && (
+ {type === 'search' && (
-
@@ -70,6 +94,7 @@ const Navbar: FC = (props) => {
{query && (
setQuery!('')}
>
@@ -78,13 +103,49 @@ const Navbar: FC = (props) => {
)}
)}
+
+ {type === 'genre' && (
+
+ {title}
+
+ )}
+
+ {inclPlayBtn && (
+
+
handleClickPlayBtn && handleClickPlayBtn()}>
+
+
+
+ {title}
+
+
+ )}
-
-
-
-
-
-
+ {isLogged ? (
+
+ {userData?.images?.length === 0 ? (
+
+
+
+ ) : (
+
+
+
+ )}
+
+
+
+
+
+ ) : (
+
+ Login
+
+ )}
+
)
}
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 (
+
+
+ Logout
+
+
+ )
+}
+
+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
+
+
+ Open queue
+
+
+
+
+
handleClick(e)} className={cx('next-song')}>
+
+
+
+
+
+
+
+
+ {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 (
+
+
+
+
+ setPlayingViewShowed(false)}>
+
+
+
+
+
+
+ {currentTrack?.album?.images?.[0]?.url ? (
+
+ ) : (
+
+
+
+ )}
+
+
+
+
+
+
+ {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 (
+
+
+
+ )
+}
+
+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) => (
+ {
+ categoryRef.current = item.key
+ setCategory(item.key)
+ }}
+ >
+ {item.display}
+
+ ))}
+
+
+ {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 ? (
+
+ ) : (
+
+
+
+ )
+ ) : (
+
+ )}
+
+
+ <>
+
+ {!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 ? (
+
+ ) : (
+
+
+
+ )
+ ) : (
+
+ )
+ ) : (
+
+ )}
+
+
+ {!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 ? (
+
+ ) : (
+
+ )}
+
+
+
+ {!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 (
@@ -113,21 +100,37 @@ const Library = () => {
-
- {libSelection.map((item, index) => (
-
handleClick(item.name)} key={index}>
- {item.name}
+
+ {libSelections.map((item, index) => (
+ handleClick(item.type)} key={index}>
+ {item.title}
))}
- 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}
+ {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 ? (
+
+
+
+ ) : (
+ <>
+
{order}
+
+
+
+ >
+ ))}
+
+ )}
+
+ {type !== 'album' && (
+
+ {!isLoading ? (
+ thumb ? (
+
+ ) : (
+
+
+
+ )
+ ) : (
+
+ )}
+
+ )}
+
+ {!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}
-
-
-
+ {!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 && (
+
+ setLess(!isLess)}>
+ {isLess ? 'See more' : 'Show less'}
+
+
+ )}
+
+ )
+}
+
+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 ? (
+
+ ) : (
+
+ )}
+
+
+
+ )
+}
+
+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)}
+ >
+
+ {!isPlay ? (
+
+ ) : (
+
+ )}
+
+
+ )
+}
+
+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 && (
+
+ )}
+
+
+ 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 && (
+
+ setExpanded((prev) => !prev)}>
+ {isExpanded ? 'Show less' : '... Show more'}
+
+
+ )}
+
+
+
+ See all episode
+
+
+
+
+
+
+ )
+}
+
+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',
+ },
+ },
})