From 62166624dc26864d303ea651284ff79431858f51 Mon Sep 17 00:00:00 2001 From: Jonas Weinz Date: Sun, 20 Jul 2025 20:17:02 +0200 Subject: [PATCH] initial commit --- .gitignore | 164 ++++ README.md | 15 + hipsterfy/__init__.py | 0 hipsterfy/hipsterfy.py | 260 ++++++ hipsterfy/main.py | 30 + hipsterfy/panel_page.py | 61 ++ poetry.lock | 7 + pyproject.toml | 29 + test_notebooks/scratch.ipynb | 1706 ++++++++++++++++++++++++++++++++++ 9 files changed, 2272 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 hipsterfy/__init__.py create mode 100644 hipsterfy/hipsterfy.py create mode 100644 hipsterfy/main.py create mode 100644 hipsterfy/panel_page.py create mode 100644 poetry.lock create mode 100644 pyproject.toml create mode 100644 test_notebooks/scratch.ipynb diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3846299 --- /dev/null +++ b/.gitignore @@ -0,0 +1,164 @@ +# ---> Python +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so +*.cache +*.json + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + diff --git a/README.md b/README.md new file mode 100644 index 0000000..7cc94a0 --- /dev/null +++ b/README.md @@ -0,0 +1,15 @@ +# Hipsterfy + +creates small track cards with Spotify embeds and QR codes to print them out. Any relation to an existing party game is purely coincidental. + +## Installation + +```bash +pip install -e . +``` + +## Usage + +```bash +python -m hipsterfy.main +``` \ No newline at end of file diff --git a/hipsterfy/__init__.py b/hipsterfy/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/hipsterfy/hipsterfy.py b/hipsterfy/hipsterfy.py new file mode 100644 index 0000000..843ab8c --- /dev/null +++ b/hipsterfy/hipsterfy.py @@ -0,0 +1,260 @@ +from qrcode.image.pil import PilImage +from qrcode.image.pure import PyPNGImage +import spotipy +from spotipy.oauth2 import SpotifyClientCredentials + +from pathlib import Path +import json +import qrcode +from io import BytesIO +import base64 +from PIL import Image +from typing import List, Dict, Any +import pandas as pd +import re + +class Hipsterfy(object): + + def __init__(self, client_id, client_secret): + self.client_id = client_id + self.client_secret = client_secret + self.sp = self.authenticate_spotify() + + def authenticate_spotify(self): + """ + Authenticate with Spotify using Client Credentials Flow. + """ + credentials = SpotifyClientCredentials(client_id=self.client_id, client_secret=self.client_secret) + sp = spotipy.Spotify(client_credentials_manager=credentials) + return sp + +class HipsterfyPlaylistItem(object): + + def _generate_qr_code_base64(self, url): + qr: qrcode.QRCode[PilImage | PyPNGImage] = qrcode.QRCode(box_size=2, border=2) + qr.add_data(url) + qr.make(fit=True) + img = qr.make_image(fill_color="black", back_color="white") + buffered = BytesIO() + img.save(buffered, format="PNG") + img_str = base64.b64encode(buffered.getvalue()).decode() + return f'QR Code' + + def generate_hipsterfy_front_card(self, include_preview:bool = False): + # generates the square front card only with the centered qr code + preview_html = self.embed_html if include_preview else "" + if not self._qr_html: + return "" + return f""" +
+
+
+ {self._qr_html} + {preview_html} +
+ +
+ Scan for Spotify Preview +
+
+
+ """ + + def generate_hipsterfy_back_card(self, primary_property, secondary_property, additional_properties:List[str]=None, album_cover_gb:bool = True): + # generates the back card with primary and secondary property and additional properties + additional_html = "" + if additional_properties: + for prop in additional_properties: + value = getattr(self, f"{prop}", "N/A") + additional_html += f"
{prop.replace('_', ' ').title()}: {value}
" + + # Albumcover als Hintergrund + album_bg = "" + if album_cover_gb and self.album_images and len(self.album_images) > 0: + album_url = self.album_images[0]['url'] + album_bg = f""" + background: + linear-gradient(135deg, rgba(30,30,30,0.65) 60%, rgba(0,0,0,0.85) 100%), + url('{album_url}') center center/cover no-repeat; + """ + else: + album_bg = "background: #f9f9f9;" + + return f""" +
+
+

{getattr(self, primary_property)}

+

{getattr(self, secondary_property)}

+ {additional_html} +
+
+ """ + + @staticmethod + def get_available_properties() -> List[str]: + """ + Returns a list of all available properties for the HipsterfyPlaylistItem. + This can be used to dynamically generate the back card with all properties. + """ + return [ + 'title', 'artists', 'album', 'release_date', 'release_year', 'duration', 'popularity', + 'explicit', 'link', 'track_id', 'preview_url', 'track_number', + 'disc_number', 'available_markets', 'is_local', 'external_ids', + 'uri', 'album_images', 'album_type', + 'album_release_date_precision', 'album_total_tracks', + 'album_id', 'album_uri' + ] + + def __init__(self, playlist_item:dict): + self._raw_data = playlist_item + self._title = self._raw_data['name'] + self._artists = ', '.join([artist['name'] for artist in self._raw_data['artists']]) + self._album = self._raw_data['album']['name'] + self._release_date = self._raw_data['album']['release_date'] + self._duration_ms = self._raw_data['duration_ms'] + self._duration_min = round(self._duration_ms / 60000, 2) + self._link = self._raw_data['external_urls']['spotify'] + self._track_id = self._raw_data['id'] + self._popularity = self._raw_data.get('popularity') + self._explicit = self._raw_data.get('explicit') + self._preview_url = self._raw_data.get('preview_url') + self._track_number = self._raw_data.get('track_number') + self._disc_number = self._raw_data.get('disc_number') + self._available_markets = self._raw_data.get('available_markets') + self._is_local = self._raw_data.get('is_local') + self._external_ids = self._raw_data.get('external_ids') + self._uri = self._raw_data.get('uri') + self._album_images = self._raw_data['album'].get('images') + self._album_type = self._raw_data['album'].get('album_type') + self._album_release_date_precision = self._raw_data['album'].get('release_date_precision') + self._album_total_tracks = self._raw_data['album'].get('total_tracks') + self._album_id = self._raw_data['album'].get('id') + self._album_uri = self._raw_data['album'].get('uri') + + self._embed_html = "" + self._qr_html = "" + if self._track_id: + self._embed_html = f""" + + """ + self._qr_html = self._generate_qr_code_base64(f"https://open.spotify.com/embed/track/{self._track_id}") + + @property + def title(self): + return self._title + @property + def artists(self): + return self._artists + @property + def album(self): + return self._album + @property + def release_date(self): + return self._release_date + @property + def release_year(self): + return self._release_date.split('-')[0] if self._release_date else None + @property + def duration(self): + return self._duration_min + @property + def popularity(self): + return self._popularity + @property + def explicit(self): + return self._explicit + @property + def link(self): + return self._link + @property + def track_id(self): + return self._track_id + @property + def preview_url(self): + return self._preview_url + @property + def track_number(self): + return self._track_number + @property + def disc_number(self): + return self._disc_number + @property + def available_markets(self): + return self._available_markets + @property + def is_local(self): + return self._is_local + @property + def external_ids(self): + return self._external_ids + @property + def uri(self): + return self._uri + @property + def album_images(self): + return self._album_images + @property + def album_type(self): + return self._album_type + @property + def album_release_date_precision(self): + return self._album_release_date_precision + @property + def album_total_tracks(self): + return self._album_total_tracks + @property + def album_id(self): + return self._album_id + @property + def album_uri(self): + return self._album_uri + @property + def embed_html(self): + return self._embed_html + @property + def qr_html(self): + return self._qr_html + + +class HipsterfyPlaylist(object): + def __init__(self, playlist_uri, hipsterfy:Hipsterfy): + self._playlist_uri = playlist_uri + self._hipsterfy = hipsterfy + self._tracks_data = [] + self._load_playlist() + def _load_playlist(self): + """Load the playlist data from Spotify and extract track information. + """ + playlist_id = self._playlist_uri.split("/")[-1].split("?")[0] + results = self._hipsterfy.sp.playlist_items(playlist_id, additional_types=['track']) + self._tracks_data = [HipsterfyPlaylistItem(item['track']) for item in results['items'] if item['track']] + def get_tracks_data(self) -> List[HipsterfyPlaylistItem]: + """Returns the list of HipsterfyPlaylistItem objects representing the tracks in the playlist. + """ + return self._tracks_data diff --git a/hipsterfy/main.py b/hipsterfy/main.py new file mode 100644 index 0000000..31d92b4 --- /dev/null +++ b/hipsterfy/main.py @@ -0,0 +1,30 @@ +import panel as pn +import argparse + +from hipsterfy.hipsterfy import Hipsterfy, HipsterfyPlaylist +from hipsterfy.panel_page import create_panel_page + +def parse_args(): + parser = argparse.ArgumentParser(description="Hipsterfy - A Spotify Playlist Manager") + parser.add_argument('--spotify_client_id', type=str, required=True, help='Spotify Client ID') + parser.add_argument('--spotify_client_secret', type=str, required=True, help='Spotify Client Secret') + parser.add_argument('--port', type=int, default=5006, help='Port to run the Panel app on') + return parser.parse_args() + +def panel_main(): + args = parse_args() + hipsterfy = Hipsterfy(args.spotify_client_id, args.spotify_client_secret) + + # Create a Panel app + pn.extension() + + # Example usage of Hipsterfy + playlist_uri = 'https://open.spotify.com/playlist/294v6cT4ZWxtpsKQPZyC5h' # Replace with your playlist URI + app = create_panel_page(hipsterfy, playlist_uri) + + # Serve the Panel app + pn.serve(app, port=args.port, websocket_origin='*', show=False) + +if __name__ == "__main__": + panel_main() + \ No newline at end of file diff --git a/hipsterfy/panel_page.py b/hipsterfy/panel_page.py new file mode 100644 index 0000000..1cd7fef --- /dev/null +++ b/hipsterfy/panel_page.py @@ -0,0 +1,61 @@ +import panel as pn +from hipsterfy.hipsterfy import Hipsterfy, HipsterfyPlaylist, HipsterfyPlaylistItem + +def create_panel_page(hipsterfy: Hipsterfy, playlist_uri: str=None) -> pn.Template: + + # create widgets + playlist_uri = pn.widgets.TextInput(name='Playlist URI', value=playlist_uri or '', placeholder='Enter Spotify Playlist URI') + primary_item = pn.widgets.Select(name='Primary Item', options=HipsterfyPlaylistItem.get_available_properties(), value="release_year") + secondary_item = pn.widgets.Select(name='Secondary Item', options=HipsterfyPlaylistItem.get_available_properties(), value="title") + additional_items = pn.widgets.MultiChoice(name='Additional Items', options=HipsterfyPlaylistItem.get_available_properties(), value=["artist", "album"]) + enable_album_art = pn.widgets.Checkbox(name='Enable Album Art', value=True) + + + create_preview_button = pn.widgets.Button(name='Create Preview', button_type='primary') + + front_cards_column = pn.Column(sizing_mode='stretch_width') + back_cards_column = pn.Column(sizing_mode='stretch_width') + + # add widgets to the sidebar of the template + template = pn.template.FastListTemplate( + title='Hipsterfy Playlist Manager', + sidebar=[playlist_uri, primary_item, secondary_item, additional_items, enable_album_art, create_preview_button], + main=[pn.Row(front_cards_column, back_cards_column, sizing_mode='stretch_width')], + accent_base_color='indigo', + header_background='indigo', + header_color='white' + ) + + def create_preview(event): + # clear previous cards + front_cards_column.clear() + back_cards_column.clear() + + # get playlist URI + uri = playlist_uri.value.strip() + if not uri: + pn.state.notifications.error("Please enter a valid Spotify Playlist URI.") + return + + # create HipsterfyPlaylist instance + hipsterfy_playlist = HipsterfyPlaylist(uri, hipsterfy) + + # generate front and back cards for each item in the playlist + for item in hipsterfy_playlist.get_tracks_data(): + front_card = item.generate_hipsterfy_front_card(include_preview=False) + back_card = item.generate_hipsterfy_back_card( + primary_property=primary_item.value, + secondary_property=secondary_item.value, + additional_properties=additional_items.value, + album_cover_gb=enable_album_art.value + ) + front_cards_column.append(pn.pane.HTML(front_card, sizing_mode='stretch_width')) + back_cards_column.append(pn.pane.HTML(back_card, sizing_mode='stretch_width')) + # notify user of success + + # bind the create_preview function to the button click event + create_preview_button.on_click(create_preview) + + # return the template + return template + diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..3aa31f8 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +package = [] + +[metadata] +lock-version = "2.0" +python-versions = "*" +content-hash = "115cf985d932e9bf5f540555bbdd75decbb62cac81e399375fc19f6277f8c1d8" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..a5d3f0b --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,29 @@ +[project] +name = "hipsterfy" +version = "0.1.0" +description = "" +authors = [ + {name="Jonas Weinz"} +] +readme = "README.md" +requires-python = ">=3.12" +dependencies = [ + "spotipy", + "pandas", + "pillow", + "qrcode", + "panel", +] +[tool.poetry] +name = "hipsterfy" +version = "0.1.0" +description = "" +authors = [ + "Jonas Weinz" +] +readme = "README.md" + + +[build-system] +requires = ["poetry-core>=2.0.0,<3.0.0"] +build-backend = "poetry.core.masonry.api" diff --git a/test_notebooks/scratch.ipynb b/test_notebooks/scratch.ipynb new file mode 100644 index 0000000..c2b3c95 --- /dev/null +++ b/test_notebooks/scratch.ipynb @@ -0,0 +1,1706 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "95a6b0fe", + "metadata": {}, + "source": [ + "## Scratchpad\n", + "\n", + "read a spotify playlist and parse that" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "dcb56db9", + "metadata": {}, + "outputs": [], + "source": [ + "import spotipy\n", + "from spotipy.oauth2 import SpotifyClientCredentials\n", + "\n", + "from pathlib import Path\n", + "import json\n", + "import pandas as pd\n", + "\n", + "creadentials = Path(\"spotify_credentials.json\")\n", + "if not creadentials.exists():\n", + " raise FileNotFoundError(\"Spotify credentials file not found. Please create 'spotify_credentials.json' with your Spotify API credentials.\")\n", + "creds = json.loads(creadentials.read_text())\n", + "\n", + "CLIENT_ID = creds.get(\"CLIENT_ID\")\n", + "CLIENT_SECRET = creds.get(\"CLIENT_SECRET\")\n", + "if not CLIENT_ID or not CLIENT_SECRET:\n", + " raise ValueError(\"CLIENT_ID and CLIENT_SECRET must be provided in 'spotify_credentials.json'.\")\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "243aa1d1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n", + "dict_keys(['preview_url', 'available_markets', 'explicit', 'type', 'episode', 'track', 'album', 'artists', 'disc_number', 'track_number', 'duration_ms', 'external_ids', 'external_urls', 'href', 'id', 'name', 'popularity', 'uri', 'is_local'])\n" + ] + } + ], + "source": [ + "# Set up client credentials\n", + "auth_manager = SpotifyClientCredentials(client_id=CLIENT_ID, client_secret=CLIENT_SECRET)\n", + "sp = spotipy.Spotify(auth_manager=auth_manager)\n", + "\n", + "# Your playlist link or ID\n", + "playlist_url = 'https://open.spotify.com/playlist/294v6cT4ZWxtpsKQPZyC5h'\n", + "\n", + "# Extract playlist ID from URL\n", + "playlist_id = playlist_url.split(\"/\")[-1].split(\"?\")[0]\n", + "\n", + "# Get playlist items\n", + "results = sp.playlist_items(playlist_id, additional_types=['track'])\n", + "\n", + "tracks_data = []\n", + "\n", + "for item in results['items']:\n", + " track = item['track']\n", + " if track:\n", + " print(track.keys())\n", + " title = track['name']\n", + " artists = ', '.join([artist['name'] for artist in track['artists']])\n", + " album = track['album']['name']\n", + " release_date = track['album']['release_date']\n", + " duration_ms = track['duration_ms']\n", + " duration_min = round(duration_ms / 60000, 2)\n", + " link = track['external_urls']['spotify']\n", + "\n", + " track_info = {\n", + " 'title': title,\n", + " 'artist': artists,\n", + " 'album': album,\n", + " 'release_date': release_date,\n", + " 'length_min': duration_min,\n", + " 'spotify_link': link\n", + " }\n", + " tracks_data.append(track_info)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "e0c7b632", + "metadata": {}, + "outputs": [], + "source": [ + "tracks_data = []\n", + "\n", + "for item in results['items']:\n", + " track = item['track']\n", + " if track:\n", + " title = track['name']\n", + " artists = ', '.join([artist['name'] for artist in track['artists']])\n", + " album = track['album']['name']\n", + " release_date = track['album']['release_date']\n", + " duration_ms = track['duration_ms']\n", + " duration_min = round(duration_ms / 60000, 2)\n", + " link = track['external_urls']['spotify']\n", + " track_id = track['id']\n", + " popularity = track.get('popularity')\n", + " explicit = track.get('explicit')\n", + " preview_url = track.get('preview_url')\n", + " track_number = track.get('track_number')\n", + " disc_number = track.get('disc_number')\n", + " available_markets = track.get('available_markets')\n", + " is_local = track.get('is_local')\n", + " external_ids = track.get('external_ids')\n", + " uri = track.get('uri')\n", + " album_images = track['album'].get('images')\n", + " album_type = track['album'].get('album_type')\n", + " album_release_date_precision = track['album'].get('release_date_precision')\n", + " album_total_tracks = track['album'].get('total_tracks')\n", + " album_id = track['album'].get('id')\n", + " album_uri = track['album'].get('uri')\n", + " # Künstler-Objekte mit mehr Infos\n", + " artists_full = track.get('artists')\n", + "\n", + " track_info = {\n", + " 'title': title,\n", + " 'artist': artists,\n", + " 'album': album,\n", + " 'release_date': release_date,\n", + " 'length_min': duration_min,\n", + " 'spotify_link': link,\n", + " 'track_id': track_id,\n", + " 'popularity': popularity,\n", + " 'explicit': explicit,\n", + " 'preview_url': preview_url,\n", + " 'track_number': track_number,\n", + " 'disc_number': disc_number,\n", + " 'available_markets': available_markets,\n", + " 'is_local': is_local,\n", + " 'external_ids': external_ids,\n", + " 'uri': uri,\n", + " 'album_images': album_images,\n", + " 'album_type': album_type,\n", + " 'album_release_date_precision': album_release_date_precision,\n", + " 'album_total_tracks': album_total_tracks,\n", + " 'album_id': album_id,\n", + " 'album_uri': album_uri,\n", + " 'artists_full': artists_full\n", + " }\n", + " tracks_data.append(track_info)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "696c61f5", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "33b0a0ee", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + "

Barbie Girl

\n", + "

Künstler: Aqua

\n", + "

Album: Aquarium (Special Edition) (album, 17 Tracks)

\n", + "

Veröffentlicht: 1997-01-01 (day)

\n", + "

Länge: 3.3 min

\n", + "

Track #: 3 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 80/100

\n", + "

Verfügbar in: 184 Ländern

\n", + "

ISRC/IDs: isrc: DKBKA9700403

\n", + "

Spotify URI: spotify:track:5ZrDlcxIDZyjOzHdYW1ydr

\n", + "

Album URI: spotify:album:3hHmYc6mrl6NkmRW1ZwYvm

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Sing Hallelujah!

\n", + "

Künstler: Dr. Alban

\n", + "

Album: One Love (2nd Edition) (album, 12 Tracks)

\n", + "

Veröffentlicht: 1992-05-04 (day)

\n", + "

Länge: 4.02 min

\n", + "

Track #: 4 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 3/100

\n", + "

Verfügbar in: 0 Ländern

\n", + "

ISRC/IDs: isrc: DEA819200295

\n", + "

Spotify URI: spotify:track:1ohbjkuczl6hEoYEo931PH

\n", + "

Album URI: spotify:album:5YPI9qfm2uuMxlq4CEUOFu

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Wonderwall - Remastered

\n", + "

Künstler: Oasis

\n", + "

Album: [What's the Story] Morning Glory? [Remastered] (album, 12 Tracks)

\n", + "

Veröffentlicht: 1995-10-02 (day)

\n", + "

Länge: 4.31 min

\n", + "

Track #: 3 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 2/100

\n", + "

Verfügbar in: 0 Ländern

\n", + "

ISRC/IDs: isrc: GBQCP1400109

\n", + "

Spotify URI: spotify:track:1rHtngf9FuO1y0aEyPcNVF

\n", + "

Album URI: spotify:album:0spT2EJ0PlKmrwydKWHRA1

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Lemon Tree - Album Edit

\n", + "

Künstler: Fools Garden

\n", + "

Album: Dish Of The Day (album, 11 Tracks)

\n", + "

Veröffentlicht: 1995 (year)

\n", + "

Länge: 3.18 min

\n", + "

Track #: 3 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 0/100

\n", + "

Verfügbar in: 0 Ländern

\n", + "

ISRC/IDs: isrc: DEAF70927221

\n", + "

Spotify URI: spotify:track:4jH2NgiLe1z17ev6z6i7Fz

\n", + "

Album URI: spotify:album:1L8jOPhcmUBO9Ljr3x3EfP

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

The Rhythm of the Night

\n", + "

Künstler: Corona

\n", + "

Album: The Rhythm of the Night (album, 16 Tracks)

\n", + "

Veröffentlicht: 1994 (year)

\n", + "

Länge: 4.4 min

\n", + "

Track #: 8 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 76/100

\n", + "

Verfügbar in: 169 Ländern

\n", + "

ISRC/IDs: isrc: ITA199800041

\n", + "

Spotify URI: spotify:track:0ofMkI3jzmGCElAOgOLeo3

\n", + "

Album URI: spotify:album:6rrPmmb2lQd5pNRL6HKBZx

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Blue (Da Ba Dee) - Gabry Ponte Ice Pop Radio

\n", + "

Künstler: Eiffel 65, Gabry Ponte

\n", + "

Album: Europop (album, 19 Tracks)

\n", + "

Veröffentlicht: 1999 (year)

\n", + "

Länge: 4.73 min

\n", + "

Track #: 4 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 11/100

\n", + "

Verfügbar in: 0 Ländern

\n", + "

ISRC/IDs: isrc: ITT019810102

\n", + "

Spotify URI: spotify:track:2yAVzRiEQooPEJ9SYx11L3

\n", + "

Album URI: spotify:album:54vbD17F1t5q3yHkj1cX37

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

It's My Life

\n", + "

Künstler: Dr. Alban

\n", + "

Album: One Love (2nd Edition) (album, 12 Tracks)

\n", + "

Veröffentlicht: 1992-05-04 (day)

\n", + "

Länge: 4.0 min

\n", + "

Track #: 2 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 8/100

\n", + "

Verfügbar in: 0 Ländern

\n", + "

ISRC/IDs: isrc: DEA819200287

\n", + "

Spotify URI: spotify:track:6HdM7gzXVgcpepv276raog

\n", + "

Album URI: spotify:album:5YPI9qfm2uuMxlq4CEUOFu

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Boom, Boom, Boom, Boom!!

\n", + "

Künstler: Vengaboys

\n", + "

Album: Greatest Hits! (compilation, 16 Tracks)

\n", + "

Veröffentlicht: 2009-12-11 (day)

\n", + "

Länge: 3.38 min

\n", + "

Track #: 2 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 5/100

\n", + "

Verfügbar in: 0 Ländern

\n", + "

ISRC/IDs: isrc: NLC529811150

\n", + "

Spotify URI: spotify:track:65OXGbKBQ8gUyJvUd0jNpf

\n", + "

Album URI: spotify:album:5t02mTYT9ks9sOC1ihea4a

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

...Baby One More Time

\n", + "

Künstler: Britney Spears

\n", + "

Album: ...Baby One More Time (Digital Deluxe Version) (album, 16 Tracks)

\n", + "

Veröffentlicht: 1999-01-12 (day)

\n", + "

Länge: 3.52 min

\n", + "

Track #: 1 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 85/100

\n", + "

Verfügbar in: 185 Ländern

\n", + "

ISRC/IDs: isrc: USJI19810404

\n", + "

Spotify URI: spotify:track:3MjUtNVVq3C8Fn0MP3zhXa

\n", + "

Album URI: spotify:album:3WNxdumkSMGMJRhEgK80qx

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

I Want It That Way

\n", + "

Künstler: Backstreet Boys

\n", + "

Album: Millennium (album, 12 Tracks)

\n", + "

Veröffentlicht: 1999-05-18 (day)

\n", + "

Länge: 3.56 min

\n", + "

Track #: 2 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 87/100

\n", + "

Verfügbar in: 185 Ländern

\n", + "

ISRC/IDs: isrc: USJI19910614

\n", + "

Spotify URI: spotify:track:47BBI51FKFwOMlIiX6m8ya

\n", + "

Album URI: spotify:album:5ySxm9hxBNss01WCL7GLyQ

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Teenage Dirtbag

\n", + "

Künstler: Wheatus

\n", + "

Album: Songs From Dawson's Creek, Vol. II (compilation, 14 Tracks)

\n", + "

Veröffentlicht: 2000-09-29 (day)

\n", + "

Länge: 4.03 min

\n", + "

Track #: 10 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 72/100

\n", + "

Verfügbar in: 185 Ländern

\n", + "

ISRC/IDs: isrc: USSM10008431

\n", + "

Spotify URI: spotify:track:3LI4MmibTkXH5cGpCGZgyw

\n", + "

Album URI: spotify:album:187HV0h26fG3mkRsySp5Lj

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Gangsta's Paradise

\n", + "

Künstler: Coolio, L.V.

\n", + "

Album: Gangsta's Paradise (album, 14 Tracks)

\n", + "

Veröffentlicht: 1995-11-07 (day)

\n", + "

Länge: 4.01 min

\n", + "

Track #: 2 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 11/100

\n", + "

Verfügbar in: 0 Ländern

\n", + "

ISRC/IDs: isrc: USTB10400128

\n", + "

Spotify URI: spotify:track:7lQWRAjyhTpCWFC0jmclT4

\n", + "

Album URI: spotify:album:0fYctMs4EvoEqzDh8Kmg5g

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Jump Around - 30 Years Remaster

\n", + "

Künstler: House Of Pain

\n", + "

Album: House of Pain (Fine Malt Lyrics) [30 Years] [Deluxe Edition] (album, 22 Tracks)

\n", + "

Veröffentlicht: 2022-07-22 (day)

\n", + "

Länge: 3.64 min

\n", + "

Track #: 2 | Disc #: 1

\n", + "

Explizit: ✅ | Beliebtheit: 78/100

\n", + "

Verfügbar in: 185 Ländern

\n", + "

ISRC/IDs: isrc: USTB12100088

\n", + "

Spotify URI: spotify:track:7L93GESzq43UkKUt5FsOCq

\n", + "

Album URI: spotify:album:1GYvmeraQXDxxSC9T3RDvM

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Intergalactic - Remastered 2009

\n", + "

Künstler: Beastie Boys

\n", + "

Album: Hello Nasty (Deluxe Edition/Remastered) (album, 43 Tracks)

\n", + "

Veröffentlicht: 1998-07-14 (day)

\n", + "

Länge: 3.86 min

\n", + "

Track #: 7 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 72/100

\n", + "

Verfügbar in: 184 Ländern

\n", + "

ISRC/IDs: isrc: USCA20903764

\n", + "

Spotify URI: spotify:track:5fpizYGbi5IQoEraj6FP0R

\n", + "

Album URI: spotify:album:6eGYLONkDMja0MNtZWnRRB

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Everybody (Backstreet's Back) - Radio Edit

\n", + "

Künstler: Backstreet Boys

\n", + "

Album: Backstreet's Back (album, 11 Tracks)

\n", + "

Veröffentlicht: 1997-08-12 (day)

\n", + "

Länge: 3.76 min

\n", + "

Track #: 1 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 82/100

\n", + "

Verfügbar in: 183 Ländern

\n", + "

ISRC/IDs: isrc: USJI19710083

\n", + "

Spotify URI: spotify:track:1di1BEgJYzPvXUuinsYJGP

\n", + "

Album URI: spotify:album:2U9ONknz1iFEK9drEKLx8v

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Wannabe

\n", + "

Künstler: Spice Girls

\n", + "

Album: Spice (album, 10 Tracks)

\n", + "

Veröffentlicht: 1996-01-01 (day)

\n", + "

Länge: 2.88 min

\n", + "

Track #: 1 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 84/100

\n", + "

Verfügbar in: 184 Ländern

\n", + "

ISRC/IDs: isrc: GBAAA9600008

\n", + "

Spotify URI: spotify:track:1Je1IMUlBXcx1Fz0WE7oPT

\n", + "

Album URI: spotify:album:3x2jF7blR6bFHtk4MccsyJ

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

What Is Love - 7\" Mix

\n", + "

Künstler: Haddaway

\n", + "

Album: The Album (album, 12 Tracks)

\n", + "

Veröffentlicht: 1993-09-13 (day)

\n", + "

Länge: 4.51 min

\n", + "

Track #: 1 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 85/100

\n", + "

Verfügbar in: 185 Ländern

\n", + "

ISRC/IDs: isrc: DEA410500401

\n", + "

Spotify URI: spotify:track:0OTO8ZF2YqFQVw9hnZylTd

\n", + "

Album URI: spotify:album:5YOPNlihunDoAew2Jlbbd7

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

I'm Gonna Be (500 Miles)

\n", + "

Künstler: The Proclaimers

\n", + "

Album: Sunshine on Leith (album, 12 Tracks)

\n", + "

Veröffentlicht: 1988-01-01 (day)

\n", + "

Länge: 3.66 min

\n", + "

Track #: 1 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 79/100

\n", + "

Verfügbar in: 185 Ländern

\n", + "

ISRC/IDs: isrc: GBAYK8800055

\n", + "

Spotify URI: spotify:track:67iAlVNDDdddxqSD2EZhFs

\n", + "

Album URI: spotify:album:5sK78apv4yOoXjxRL4kOdJ

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Rhythm Is a Dancer

\n", + "

Künstler: SNAP!

\n", + "

Album: The Madman's Return (album, 14 Tracks)

\n", + "

Veröffentlicht: 1992-01-01 (day)

\n", + "

Länge: 5.54 min

\n", + "

Track #: 6 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 75/100

\n", + "

Verfügbar in: 185 Ländern

\n", + "

ISRC/IDs: isrc: DET189200600

\n", + "

Spotify URI: spotify:track:5uFYYOyT3EclOVhiFzPJSz

\n", + "

Album URI: spotify:album:4XbUZbCiZynKWMCWFoNSbY

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Harder, Better, Faster, Stronger

\n", + "

Künstler: Daft Punk

\n", + "

Album: Discovery (album, 14 Tracks)

\n", + "

Veröffentlicht: 2001-03-12 (day)

\n", + "

Länge: 3.77 min

\n", + "

Track #: 4 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 75/100

\n", + "

Verfügbar in: 185 Ländern

\n", + "

ISRC/IDs: isrc: GBDUW0000059

\n", + "

Spotify URI: spotify:track:5W3cjX2J3tjhG8zb6u0qHn

\n", + "

Album URI: spotify:album:2noRn2Aes5aoNVsU6iWThc

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Digital Love

\n", + "

Künstler: Daft Punk

\n", + "

Album: Musique, Vol. 1 (compilation, 15 Tracks)

\n", + "

Veröffentlicht: 2006-03-29 (day)

\n", + "

Länge: 5.02 min

\n", + "

Track #: 15 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 47/100

\n", + "

Verfügbar in: 185 Ländern

\n", + "

ISRC/IDs: isrc: GBDUW0000058

\n", + "

Spotify URI: spotify:track:5bRDSGmwZJsGG7tPN14fDu

\n", + "

Album URI: spotify:album:4a0p1M12f7VaZWdoNSdEK4

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

I'm Gonna Be (500 Miles)

\n", + "

Künstler: The Proclaimers

\n", + "

Album: Finest (album, 14 Tracks)

\n", + "

Veröffentlicht: 2003-09-01 (day)

\n", + "

Länge: 3.66 min

\n", + "

Track #: 1 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 72/100

\n", + "

Verfügbar in: 185 Ländern

\n", + "

ISRC/IDs: isrc: GBAYK8800055

\n", + "

Spotify URI: spotify:track:66S14BkJDxgkYxLl5DCqOz

\n", + "

Album URI: spotify:album:7hPq9fDWwXPo1tT0oi3XcM

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Insomnia - Radio Edit

\n", + "

Künstler: Faithless

\n", + "

Album: Pure... 90s Dance Party (compilation, 68 Tracks)

\n", + "

Veröffentlicht: 2010-12-10 (day)

\n", + "

Länge: 3.58 min

\n", + "

Track #: 17 | Disc #: 3

\n", + "

Explizit: ❌ | Beliebtheit: 64/100

\n", + "

Verfügbar in: 170 Ländern

\n", + "

ISRC/IDs: isrc: GBBXH9600001

\n", + "

Spotify URI: spotify:track:3dX6WDwnHwYzB5t754oB4T

\n", + "

Album URI: spotify:album:03awYMGLQWIlD1VyDwq1HF

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Chihuahua

\n", + "

Künstler: DJ BoBo

\n", + "

Album: Visions (album, 16 Tracks)

\n", + "

Veröffentlicht: 2003-02-24 (day)

\n", + "

Länge: 3.0 min

\n", + "

Track #: 5 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 53/100

\n", + "

Verfügbar in: 185 Ländern

\n", + "

ISRC/IDs: isrc: DEMI60300005

\n", + "

Spotify URI: spotify:track:4XxARXvYh14HGGt6EMNmUm

\n", + "

Album URI: spotify:album:06WU43pEpl5mpnkKsRn47A

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

How Much Is The Fish?

\n", + "

Künstler: Scooter

\n", + "

Album: No Time To Chill (album, 12 Tracks)

\n", + "

Veröffentlicht: 1998-07-20 (day)

\n", + "

Länge: 3.78 min

\n", + "

Track #: 2 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 65/100

\n", + "

Verfügbar in: 183 Ländern

\n", + "

ISRC/IDs: isrc: DEN270200133

\n", + "

Spotify URI: spotify:track:73aOM4jyU3begiIYxYUd89

\n", + "

Album URI: spotify:album:0sFHr1bZ6mPOnICWWRJA01

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Lemon Tree

\n", + "

Künstler: Fools Garden

\n", + "

Album: Dish of the Day (album, 11 Tracks)

\n", + "

Veröffentlicht: 1995-01-01 (day)

\n", + "

Länge: 3.18 min

\n", + "

Track #: 3 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 79/100

\n", + "

Verfügbar in: 185 Ländern

\n", + "

ISRC/IDs: isrc: DEAF70927221

\n", + "

Spotify URI: spotify:track:2epbL7s3RFV81K5UhTgZje

\n", + "

Album URI: spotify:album:3epesmrZX0KYpeImQtcVUa

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Let's Get Loud

\n", + "

Künstler: Jennifer Lopez

\n", + "

Album: On The 6 (album, 16 Tracks)

\n", + "

Veröffentlicht: 1999-06-01 (day)

\n", + "

Länge: 3.99 min

\n", + "

Track #: 5 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 75/100

\n", + "

Verfügbar in: 185 Ländern

\n", + "

ISRC/IDs: isrc: USSM19900597

\n", + "

Spotify URI: spotify:track:42nSaPdT6g3ZIMHmKLlP2p

\n", + "

Album URI: spotify:album:3Gby5NNeNYkMgAnrtEA3lc

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Angels

\n", + "

Künstler: Robbie Williams

\n", + "

Album: Life Thru A Lens (album, 11 Tracks)

\n", + "

Veröffentlicht: 1997-01-01 (day)

\n", + "

Länge: 4.42 min

\n", + "

Track #: 4 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 80/100

\n", + "

Verfügbar in: 184 Ländern

\n", + "

ISRC/IDs: isrc: GBAYE9700233

\n", + "

Spotify URI: spotify:track:1M2nd8jNUkkwrc1dgBPTJz

\n", + "

Album URI: spotify:album:31Sx9uz9KqlvmX07Pvp0wN

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Mr. Vain - Original Radio Edit

\n", + "

Künstler: Culture Beat

\n", + "

Album: Mr. Vain (single, 8 Tracks)

\n", + "

Veröffentlicht: 1993-01-01 (day)

\n", + "

Länge: 4.29 min

\n", + "

Track #: 3 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 75/100

\n", + "

Verfügbar in: 185 Ländern

\n", + "

ISRC/IDs: isrc: DEPT99300113

\n", + "

Spotify URI: spotify:track:4ih3dyFZoeTdaeJW9mPbOI

\n", + "

Album URI: spotify:album:0eVj6uUqoagjDPSOmz2rRj

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Oops!...I Did It Again

\n", + "

Künstler: Britney Spears

\n", + "

Album: Oops!... I Did It Again (album, 12 Tracks)

\n", + "

Veröffentlicht: 2000-05-16 (day)

\n", + "

Länge: 3.52 min

\n", + "

Track #: 1 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 85/100

\n", + "

Verfügbar in: 185 Ländern

\n", + "

ISRC/IDs: isrc: USJI10000100

\n", + "

Spotify URI: spotify:track:6naxalmIoLFWR0siv8dnQQ

\n", + "

Album URI: spotify:album:5PmgtkodFl2Om3hMXONDll

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Infinity

\n", + "

Künstler: Guru Josh

\n", + "

Album: Infinity (album, 16 Tracks)

\n", + "

Veröffentlicht: 1990-10-17 (day)

\n", + "

Länge: 4.03 min

\n", + "

Track #: 7 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 59/100

\n", + "

Verfügbar in: 183 Ländern

\n", + "

ISRC/IDs: isrc: GBARL9000068

\n", + "

Spotify URI: spotify:track:78fTO9KOXmWLkm1r6Ko2Uq

\n", + "

Album URI: spotify:album:0PuT9tt0GtnAYA8CaZ5RMW

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Lo Siento BB:/ (with Bad Bunny & Julieta Venegas)

\n", + "

Künstler: Tainy, Bad Bunny, Julieta Venegas

\n", + "

Album: Lo Siento BB:/ (with Bad Bunny & Julieta Venegas) (single, 1 Tracks)

\n", + "

Veröffentlicht: 2021-10-05 (day)

\n", + "

Länge: 3.46 min

\n", + "

Track #: 1 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 74/100

\n", + "

Verfügbar in: 185 Ländern

\n", + "

ISRC/IDs: isrc: USA2P2135437

\n", + "

Spotify URI: spotify:track:4gzsuuZypVbxs0Af1LSZyB

\n", + "

Album URI: spotify:album:4589OIFRZp41qbsp7TWFCx

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Ante Up (feat. Busta Rhymes, Teflon & Remi Martin) - Remix

\n", + "

Künstler: M.O.P., Busta Rhymes, Teflon, Remi Martin

\n", + "

Album: Warriorz (album, 20 Tracks)

\n", + "

Veröffentlicht: 2000-08-29 (day)

\n", + "

Länge: 4.13 min

\n", + "

Track #: 20 | Disc #: 1

\n", + "

Explizit: ✅ | Beliebtheit: 64/100

\n", + "

Verfügbar in: 185 Ländern

\n", + "

ISRC/IDs: isrc: USLR50100062

\n", + "

Spotify URI: spotify:track:5osSw3tL07Tuid7AWsvYcc

\n", + "

Album URI: spotify:album:0mw0v424Ribwwrt0oMVB1j

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Jump Around

\n", + "

Künstler: House Of Pain

\n", + "

Album: House of Pain (Fine Malt Lyrics) (album, 19 Tracks)

\n", + "

Veröffentlicht: 1992-07-21 (day)

\n", + "

Länge: 3.58 min

\n", + "

Track #: 2 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 68/100

\n", + "

Verfügbar in: 185 Ländern

\n", + "

ISRC/IDs: isrc: USTB10300119

\n", + "

Spotify URI: spotify:track:6JymsaWDHk2Yj4e0yNBIFH

\n", + "

Album URI: spotify:album:0hWY4eSi2bZ8tWplgjO0ph

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Espresso Macchiato

\n", + "

Künstler: Tommy Cash

\n", + "

Album: Espresso Macchiato (single, 1 Tracks)

\n", + "

Veröffentlicht: 2024-12-07 (day)

\n", + "

Länge: 2.9 min

\n", + "

Track #: 1 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 82/100

\n", + "

Verfügbar in: 14 Ländern

\n", + "

ISRC/IDs: isrc: DGA0S2441622

\n", + "

Spotify URI: spotify:track:4zpNfuWJA3K4d9TS4qnOIB

\n", + "

Album URI: spotify:album:6i83szVwI1FZFeMQHobNsj

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Bara Bada Bastu

\n", + "

Künstler: KAJ

\n", + "

Album: Bara Bada Bastu (single, 1 Tracks)

\n", + "

Veröffentlicht: 2025-02-21 (day)

\n", + "

Länge: 2.78 min

\n", + "

Track #: 1 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 81/100

\n", + "

Verfügbar in: 184 Ländern

\n", + "

ISRC/IDs: isrc: SEPQA2500011

\n", + "

Spotify URI: spotify:track:2gThkoApt6B7ajBWZRLAVv

\n", + "

Album URI: spotify:album:2zjk45mVWiAZILHTUmR0ON

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Baller

\n", + "

Künstler: Abor & Tynna

\n", + "

Album: Bittersüß (album, 16 Tracks)

\n", + "

Veröffentlicht: 2025-02-14 (day)

\n", + "

Länge: 2.66 min

\n", + "

Track #: 12 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 79/100

\n", + "

Verfügbar in: 185 Ländern

\n", + "

ISRC/IDs: isrc: DEE862401926

\n", + "

Spotify URI: spotify:track:4kbkYbhWNiSJraySknB4hD

\n", + "

Album URI: spotify:album:0PrVmVD88Xk509v7BOT6a2

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Recognizer

\n", + "

Künstler: Daft Punk

\n", + "

Album: TRON: Legacy (album, 22 Tracks)

\n", + "

Veröffentlicht: 2010-12-03 (day)

\n", + "

Länge: 2.63 min

\n", + "

Track #: 4 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 0/100

\n", + "

Verfügbar in: 0 Ländern

\n", + "

ISRC/IDs: isrc: USWD11054879

\n", + "

Spotify URI: spotify:track:5d5AjRMgz2TO50BCoXRu7Z

\n", + "

Album URI: spotify:album:40EZGFRJY2R43IPiOnFelG

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

U Can't Touch This

\n", + "

Künstler: MC Hammer

\n", + "

Album: Please Hammer Don't Hurt 'Em (album, 13 Tracks)

\n", + "

Veröffentlicht: 1990-02-20 (day)

\n", + "

Länge: 4.29 min

\n", + "

Track #: 2 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 77/100

\n", + "

Verfügbar in: 184 Ländern

\n", + "

ISRC/IDs: isrc: USCA29000294

\n", + "

Spotify URI: spotify:track:1B75hgRqe7A4fwee3g3Wmu

\n", + "

Album URI: spotify:album:4r1WecJyt5FOhglysp9zhN

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Relax, Take It Easy

\n", + "

Künstler: MIKA

\n", + "

Album: Life In Cartoon Motion (album, 10 Tracks)

\n", + "

Veröffentlicht: 2006-01-01 (day)

\n", + "

Länge: 4.5 min

\n", + "

Track #: 5 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 71/100

\n", + "

Verfügbar in: 182 Ländern

\n", + "

ISRC/IDs: isrc: USC7R0600114

\n", + "

Spotify URI: spotify:track:0KM2y796j63t5RHhvRUxld

\n", + "

Album URI: spotify:album:6oIaXBTIZ2Q9cJKBgrZ2Ox

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Pump It

\n", + "

Künstler: Black Eyed Peas

\n", + "

Album: Monkey Business (album, 16 Tracks)

\n", + "

Veröffentlicht: 2005-01-01 (day)

\n", + "

Länge: 3.55 min

\n", + "

Track #: 1 | Disc #: 1

\n", + "

Explizit: ✅ | Beliebtheit: 84/100

\n", + "

Verfügbar in: 184 Ländern

\n", + "

ISRC/IDs: isrc: USIR10500407

\n", + "

Spotify URI: spotify:track:2ygMBIctKIAfbEBcT9065L

\n", + "

Album URI: spotify:album:6VsJamdhvYKcnpwHAKULI0

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Hey Ya!

\n", + "

Künstler: Outkast

\n", + "

Album: Speakerboxxx/The Love Below (album, 40 Tracks)

\n", + "

Veröffentlicht: 2003 (year)

\n", + "

Länge: 3.92 min

\n", + "

Track #: 9 | Disc #: 2

\n", + "

Explizit: ✅ | Beliebtheit: 86/100

\n", + "

Verfügbar in: 185 Ländern

\n", + "

ISRC/IDs: isrc: USAR10300924

\n", + "

Spotify URI: spotify:track:2PpruBYCo4H7WOBJ7Q2EwM

\n", + "

Album URI: spotify:album:1UsmQ3bpJTyK6ygoOOjG1r

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Thunderstruck

\n", + "

Künstler: AC/DC

\n", + "

Album: The Razors Edge (album, 12 Tracks)

\n", + "

Veröffentlicht: 1990-09-24 (day)

\n", + "

Länge: 4.88 min

\n", + "

Track #: 1 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 89/100

\n", + "

Verfügbar in: 185 Ländern

\n", + "

ISRC/IDs: isrc: AUAP09000014

\n", + "

Spotify URI: spotify:track:57bgtoPSgt236HzfBOd8kj

\n", + "

Album URI: spotify:album:4vu7F6h90Br1ZtYYaqfITy

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Sweet Child O' Mine

\n", + "

Künstler: Guns N' Roses

\n", + "

Album: Appetite For Destruction (album, 12 Tracks)

\n", + "

Veröffentlicht: 1987-07-21 (day)

\n", + "

Länge: 5.93 min

\n", + "

Track #: 9 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 90/100

\n", + "

Verfügbar in: 183 Ländern

\n", + "

ISRC/IDs: isrc: USGF18714809

\n", + "

Spotify URI: spotify:track:7snQQk1zcKl8gZ92AnueZW

\n", + "

Album URI: spotify:album:28yHV3Gdg30AiB8h8em1eW

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Fuck It

\n", + "

Künstler: Myle

\n", + "

Album: Fuck It (single, 1 Tracks)

\n", + "

Veröffentlicht: 2024-02-23 (day)

\n", + "

Länge: 2.35 min

\n", + "

Track #: 1 | Disc #: 1

\n", + "

Explizit: ✅ | Beliebtheit: 34/100

\n", + "

Verfügbar in: 185 Ländern

\n", + "

ISRC/IDs: isrc: DEZC62400003

\n", + "

Spotify URI: spotify:track:4LyjgYMLOm3ZHEmO5cYRar

\n", + "

Album URI: spotify:album:5d5pTxLQL12Vcf3ENE3Bl1

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

The Final Countdown

\n", + "

Künstler: Europe

\n", + "

Album: The Final Countdown (Expanded Edition) (album, 13 Tracks)

\n", + "

Veröffentlicht: 1986 (year)

\n", + "

Länge: 5.17 min

\n", + "

Track #: 1 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 80/100

\n", + "

Verfügbar in: 185 Ländern

\n", + "

ISRC/IDs: isrc: USSM18600196

\n", + "

Spotify URI: spotify:track:3MrRksHupTVEQ7YbA0FsZK

\n", + "

Album URI: spotify:album:5Jkd47JEaCU1g4DcGBnHm3

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Never Gonna Give You Up

\n", + "

Künstler: Rick Astley

\n", + "

Album: Whenever You Need Somebody (album, 10 Tracks)

\n", + "

Veröffentlicht: 1987-11-12 (day)

\n", + "

Länge: 3.56 min

\n", + "

Track #: 1 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 82/100

\n", + "

Verfügbar in: 185 Ländern

\n", + "

ISRC/IDs: isrc: GBARL9300135

\n", + "

Spotify URI: spotify:track:4PTG3Z6ehGkBFwjybzWkR8

\n", + "

Album URI: spotify:album:6eUW0wxWtzkFdaEFsTJto6

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Africa

\n", + "

Künstler: TOTO

\n", + "

Album: Toto IV (album, 10 Tracks)

\n", + "

Veröffentlicht: 1982-04-08 (day)

\n", + "

Länge: 4.93 min

\n", + "

Track #: 10 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 90/100

\n", + "

Verfügbar in: 185 Ländern

\n", + "

ISRC/IDs: isrc: USSM19801941

\n", + "

Spotify URI: spotify:track:2374M0fQpWi3dLnB54qaLX

\n", + "

Album URI: spotify:album:62U7xIHcID94o20Of5ea4D

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Alles neu

\n", + "

Künstler: Peter Fox

\n", + "

Album: Stadtaffe (album, 12 Tracks)

\n", + "

Veröffentlicht: 2008-09-26 (day)

\n", + "

Länge: 4.33 min

\n", + "

Track #: 1 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 70/100

\n", + "

Verfügbar in: 184 Ländern

\n", + "

ISRC/IDs: isrc: DEA620800706

\n", + "

Spotify URI: spotify:track:5hqxBvQJ3XJDSbxT9vyyqA

\n", + "

Album URI: spotify:album:6cEVfMd0XVocPbRrYkVY5H

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Haus am See

\n", + "

Künstler: Peter Fox

\n", + "

Album: Stadtaffe (album, 12 Tracks)

\n", + "

Veröffentlicht: 2008-09-26 (day)

\n", + "

Länge: 3.6 min

\n", + "

Track #: 3 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 68/100

\n", + "

Verfügbar in: 184 Ländern

\n", + "

ISRC/IDs: isrc: DEA620800624

\n", + "

Spotify URI: spotify:track:7A4KdLy1DXOOC5fhIdDuHz

\n", + "

Album URI: spotify:album:6cEVfMd0XVocPbRrYkVY5H

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

RÓA

\n", + "

Künstler: VÆB

\n", + "

Album: RÓA (single, 1 Tracks)

\n", + "

Veröffentlicht: 2025-01-17 (day)

\n", + "

Länge: 2.71 min

\n", + "

Track #: 1 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 75/100

\n", + "

Verfügbar in: 185 Ländern

\n", + "

ISRC/IDs: isrc: ISB112500109

\n", + "

Spotify URI: spotify:track:1YnOwWvV1bQevRqJMCbYJz

\n", + "

Album URI: spotify:album:6CukWYQblekfCN4j1SVYp2

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Schwarz zu blau

\n", + "

Künstler: Peter Fox

\n", + "

Album: Stadtaffe (album, 12 Tracks)

\n", + "

Veröffentlicht: 2008-09-26 (day)

\n", + "

Länge: 3.6 min

\n", + "

Track #: 2 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 63/100

\n", + "

Verfügbar in: 184 Ländern

\n", + "

ISRC/IDs: isrc: DEA620800623

\n", + "

Spotify URI: spotify:track:1Fjz0ME9pzk553wH86m3ZZ

\n", + "

Album URI: spotify:album:6cEVfMd0XVocPbRrYkVY5H

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Zukunft Pink (feat. Inéz)

\n", + "

Künstler: Peter Fox, Inéz

\n", + "

Album: Love Songs (deluxe) (album, 14 Tracks)

\n", + "

Veröffentlicht: 2023-05-26 (day)

\n", + "

Länge: 3.86 min

\n", + "

Track #: 11 | Disc #: 1

\n", + "

Explizit: ✅ | Beliebtheit: 60/100

\n", + "

Verfügbar in: 184 Ländern

\n", + "

ISRC/IDs: isrc: DEA622201528

\n", + "

Spotify URI: spotify:track:0XRJfwNFKpKn6yN1JYktSK

\n", + "

Album URI: spotify:album:5wHeVZ2szvl9VF1AVuBN3Y

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Augenbling

\n", + "

Künstler: Seeed

\n", + "

Album: SEEED (album, 13 Tracks)

\n", + "

Veröffentlicht: 2012-09-21 (day)

\n", + "

Länge: 3.61 min

\n", + "

Track #: 4 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 62/100

\n", + "

Verfügbar in: 0 Ländern

\n", + "

ISRC/IDs: isrc: DEA611200344

\n", + "

Spotify URI: spotify:track:4eT8TcG3KKlprFcYePA9gw

\n", + "

Album URI: spotify:album:2dSLWOAettty18g9KTmi6E

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Two Princes

\n", + "

Künstler: Spin Doctors

\n", + "

Album: Pocket Full Of Kryptonite (album, 10 Tracks)

\n", + "

Veröffentlicht: 1991-08-27 (day)

\n", + "

Länge: 4.28 min

\n", + "

Track #: 7 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 75/100

\n", + "

Verfügbar in: 185 Ländern

\n", + "

ISRC/IDs: isrc: USSM19000350

\n", + "

Spotify URI: spotify:track:4ePP9So5xRzspjLFVVbj90

\n", + "

Album URI: spotify:album:2TWdmpnFNCMlZDQROleupK

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Alles nur geklaut

\n", + "

Künstler: Die Prinzen

\n", + "

Album: Alles nur geklaut (album, 12 Tracks)

\n", + "

Veröffentlicht: 1993-11-12 (day)

\n", + "

Länge: 3.2 min

\n", + "

Track #: 2 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 70/100

\n", + "

Verfügbar in: 185 Ländern

\n", + "

ISRC/IDs: isrc: DEC739300092

\n", + "

Spotify URI: spotify:track:6X1mehC9bJ1ExEip4HB79W

\n", + "

Album URI: spotify:album:3Vew6UPhQVQ1vRCLKbLcEj

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Who the Hell Is Edgar?

\n", + "

Künstler: TEYA, SALENA

\n", + "

Album: Who the Hell Is Edgar? (single, 1 Tracks)

\n", + "

Veröffentlicht: 2023-03-08 (day)

\n", + "

Länge: 2.66 min

\n", + "

Track #: 1 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 55/100

\n", + "

Verfügbar in: 184 Ländern

\n", + "

ISRC/IDs: isrc: DEA622300267

\n", + "

Spotify URI: spotify:track:3gUC7tGDPVLOq42vvTUVdI

\n", + "

Album URI: spotify:album:0Pc0YjphyuqsZbeHJq7AJ0

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

The Look

\n", + "

Künstler: Roxette

\n", + "

Album: Don't Bore Us - Get to the Chorus! Roxette's Greatest Hits (compilation, 18 Tracks)

\n", + "

Veröffentlicht: 1995-10-23 (day)

\n", + "

Länge: 3.96 min

\n", + "

Track #: 3 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 55/100

\n", + "

Verfügbar in: 184 Ländern

\n", + "

ISRC/IDs: isrc: SEAME8878010

\n", + "

Spotify URI: spotify:track:7akWKDSf4k0Q0AHGoG91hu

\n", + "

Album URI: spotify:album:6Zd1OLqFX5geleqvJ9xtAL

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " \n", + "
\n", + " \n", + "

Ice Ice Baby

\n", + "

Künstler: Vanilla Ice

\n", + "

Album: To The Extreme (album, 15 Tracks)

\n", + "

Veröffentlicht: 1990-01-01 (day)

\n", + "

Länge: 4.52 min

\n", + "

Track #: 1 | Disc #: 1

\n", + "

Explizit: ❌ | Beliebtheit: 67/100

\n", + "

Verfügbar in: 184 Ländern

\n", + "

ISRC/IDs: isrc: USSB29000129

\n", + "

Spotify URI: spotify:track:11d9oUiwHuYt216EFA2tiz

\n", + "

Album URI: spotify:album:1LHacvoBTd7o2d7wwQ9EZD

\n", + "

Lokal:

\n", + " Auf Spotify anhören\n", + "
\n", + " \n", + "
\n", + "
QR für Preview:
\"QR
\n", + "
\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from IPython.display import display, HTML\n", + "import re\n", + "import qrcode\n", + "import base64\n", + "from io import BytesIO\n", + "\n", + "def extract_track_id(spotify_link):\n", + " match = re.search(r\"track/([a-zA-Z0-9]+)\", spotify_link)\n", + " if match:\n", + " return match.group(1)\n", + " return None\n", + "\n", + "def bool_icon(val):\n", + " return \"✅\" if val else \"❌\"\n", + "\n", + "def generate_qr_code_base64(url):\n", + " qr = qrcode.QRCode(box_size=2, border=2)\n", + " qr.add_data(url)\n", + " qr.make(fit=True)\n", + " img = qr.make_image(fill_color=\"black\", back_color=\"white\")\n", + " buffered = BytesIO()\n", + " img.save(buffered, format=\"PNG\")\n", + " img_str = base64.b64encode(buffered.getvalue()).decode()\n", + " return f'
QR für Preview:
\"QR
'\n", + "\n", + "html_cards = \"\"\n", + "for track in tracks_data:\n", + " track_id = extract_track_id(track['spotify_link'])\n", + " embed_html = \"\"\n", + " qr_html = \"\"\n", + " if track_id:\n", + " embed_html = f\"\"\"\n", + " \n", + " \"\"\"\n", + " qr_html = generate_qr_code_base64(f\"https://open.spotify.com/embed/track/{track_id}\")\n", + " # Albumcover, falls vorhanden\n", + " album_img_html = \"\"\n", + " if track.get('album_images') and len(track['album_images']) > 0:\n", + " album_img_html = f''\n", + " \n", + " # Künstler-Details\n", + " artists_full = \", \".join([a[\"name\"] for a in track.get(\"artists_full\", [])]) if track.get(\"artists_full\") else track.get(\"artist\")\n", + " # Märkte\n", + " markets_count = len(track.get(\"available_markets\", [])) if track.get(\"available_markets\") else 0\n", + " # Externe IDs\n", + " external_ids = track.get(\"external_ids\", {})\n", + " external_ids_str = \", \".join([f\"{k}: {v}\" for k, v in external_ids.items()]) if external_ids else \"\"\n", + " # Weitere Albumdaten\n", + " album_type = track.get(\"album_type\", \"\")\n", + " album_release_date_precision = track.get(\"album_release_date_precision\", \"\")\n", + " album_total_tracks = track.get(\"album_total_tracks\", \"\")\n", + " # Explizit\n", + " explicit = bool_icon(track.get(\"explicit\"))\n", + " # Beliebtheit\n", + " popularity = track.get(\"popularity\", \"\")\n", + " # Tracknummer\n", + " track_number = track.get(\"track_number\", \"\")\n", + " disc_number = track.get(\"disc_number\", \"\")\n", + " # Lokal\n", + " is_local = bool_icon(track.get(\"is_local\"))\n", + " # URI\n", + " uri = track.get(\"uri\", \"\")\n", + " # Album URI\n", + " album_uri = track.get(\"album_uri\", \"\")\n", + "\n", + " card = f\"\"\"\n", + "
\n", + " {album_img_html}\n", + "

{track['title']}

\n", + "

Künstler: {artists_full}

\n", + "

Album: {track['album']} ({album_type}, {album_total_tracks} Tracks)

\n", + "

Veröffentlicht: {track['release_date']} ({album_release_date_precision})

\n", + "

Länge: {track['length_min']} min

\n", + "

Track #: {track_number} | Disc #: {disc_number}

\n", + "

Explizit: {explicit} | Beliebtheit: {popularity}/100

\n", + "

Verfügbar in: {markets_count} Ländern

\n", + "

ISRC/IDs: {external_ids_str}

\n", + "

Spotify URI: {uri}

\n", + "

Album URI: {album_uri}

\n", + "

Lokal: {is_local}

\n", + " Auf Spotify anhören\n", + "
{embed_html}
\n", + " {qr_html}\n", + "
\n", + "
\n", + " \"\"\"\n", + " html_cards += card\n", + "\n", + "display(HTML(html_cards))" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "d7efef5f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "''" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "qr_html" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "026dec91", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'
QR für Preview:
\"QR
'" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "generate_qr_code_base64(\"https://open.spotify.com/track/3n3Ppam7vgaVa1iaRUc9Lp\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "83781998", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "hipsterfy-T9PmAG4i-py3.12", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}