Skip to main content

Spotify track and playlist metadata library

Project description

GitHub stars GitHub forks License Repo size Last commit Issues Top language Python Selenium

🚀 Syncify

Syncify is a Python library + CLI that fetches Spotify track and playlist metadata directly from open.spotify.com pages — great for quick metadata lookups, playlist introspection, and tooling where you don’t want to wire up OAuth.

Heads up: Syncify scrapes Spotify’s web UI (via Selenium). Selectors can break if Spotify updates their site.

✨ Features

  • Track metadata: title, artist, cover image URL, and track ID from a track URL
  • Playlist metadata: playlist title, cover image URL, playlist ID, and all track URLs
  • CLI-first: run syncify <url> or python -m syncify ...
  • Auto-detect URLs: mix track + playlist URLs in one command
  • No OAuth setup: does not require Spotify API keys/tokens

🧠 How It Works

  • Input: Spotify track/playlist URLs (https://open.spotify.com/track/..., https://open.spotify.com/playlist/...)
  • URL detection: a lightweight regex-based detector determines whether each URL is a Track or Playlist
  • Extraction:
    • Tracks: Selenium loads the page and extracts title/artist/image from page elements
    • Playlists: Selenium loads the page, scrolls through the track list, and collects every track link
  • Output:
    • Library: returns dataclasses (TrackDetails, PlaylistDetails)
    • CLI: prints a readable summary plus playlist track URLs

🛠 Tech Stack

  • Language: Python
  • Automation/scraping: Selenium (headless Chrome)
  • Driver management: webdriver-manager (fallback if Selenium driver resolution fails)
  • HTML parsing (small helper): BeautifulSoup4
  • HTTP: requests

📦 Installation

Prerequisites

  • Python: 3.9+ recommended (packaging allows older, but tested targets are 3.9–3.12)
  • Google Chrome installed (used by Selenium)

Install from GitHub (recommended)

pip install "git+https://github.com/adelelawady/Syncify.git"

Install locally (for development)

git clone https://github.com/adelelawady/Syncify.git
cd Syncify
pip install -e ".[dev]"

Install from source tree (non-editable)

pip install .

⚙️ Configuration

Syncify has no required environment variables.

Runtime requirements

  • Chrome available on PATH / installed normally
  • Chromedriver is handled automatically via Selenium’s driver resolution, with a fallback to webdriver-manager.

Troubleshooting

  • If Selenium can’t start Chrome:
    • Ensure Chrome is installed and up to date.
    • Try upgrading Selenium and webdriver-manager:
pip install -U selenium webdriver-manager
  • If playlist results are incomplete:
    • Spotify’s UI loads tracks lazily; the scraper scrolls, but very large playlists may take longer.

🚀 Usage

As a library

from syncify import get_track, get_playlist

track = get_track("https://open.spotify.com/track/5nJ4Zzqc2UjwSaIcv7bGjx")
print(track.track_title, "-", track.artist_title)
print(track.track_image_url)

playlist = get_playlist("https://open.spotify.com/playlist/5YOevUTnavVClJ0hAslu0N")
print(playlist.title)
print("Tracks:", len(playlist.track_urls))
print(playlist.track_urls[:5])

As a CLI

After installation, you can use either:

  • syncify ... (console script), or
  • python -m syncify ... (module execution)
# Auto-detect URL type (track or playlist)
syncify https://open.spotify.com/track/5nJ4Zzqc2UjwSaIcv7bGjx
syncify https://open.spotify.com/playlist/5YOevUTnavVClJ0hAslu0N

# Explicit type
syncify --track https://open.spotify.com/track/...
syncify --playlist https://open.spotify.com/playlist/...

# Multiple URLs (mixed types supported)
syncify <url1> <url2> <url3>

CLI flags:

syncify --track <URL>
syncify --playlist <URL>
syncify <URL> [URL ...]

📡 API Reference

get_track(url: str) -> TrackDetails

Fetch metadata for a Spotify track URL.

Field Type Description
spotify_url str Original Spotify URL
track_id str Spotify track ID
track_title str Song title
artist_title str Artist name
track_image_url str Cover image URL

get_playlist(url: str) -> PlaylistDetails

Fetch metadata for a Spotify playlist URL.

Field Type Description
playlist_url str Original Spotify URL
playlist_id str Spotify playlist ID
title str Playlist title
playlist_image_url str Cover image URL
track_urls list[str] Track URLs in the playlist

📂 Project Structure

Syncify/
├─ syncify/
│  ├─ __init__.py              # Public API exports
│  ├─ __main__.py              # CLI: `python -m syncify` / `syncify`
│  └─ spotify/
│     ├─ Spotify_track_info.py
│     ├─ Spotify_playlist_info.py
│     ├─ utils.py
│     └─ __init__.py
├─ main.py                     # Convenience script wrapper
├─ pyproject.toml              # Modern packaging + dependencies
├─ setup.py                    # Legacy packaging (mirrors pyproject)
├─ requirements.txt            # Dev-friendly requirements list
└─ README.md

🧪 Development

git clone https://github.com/adelelawady/Syncify.git
cd Syncify
python -m venv .venv

# Windows PowerShell
.venv\Scripts\Activate.ps1

pip install -e ".[dev]"

# Run the CLI against a URL
python -m syncify https://open.spotify.com/track/<id>

Suggested checks:

python -c "from syncify import get_track; print(get_track('https://open.spotify.com/track/<id>').track_title)"

🤝 Contributing

Contributions are welcome!

  • Bugs/requests: open an issue with a minimal repro (URL + expected vs actual output)
  • PRs:
    • Keep changes focused and include a clear description
    • Prefer small, well-scoped improvements to selectors and parsing logic
    • Avoid committing local artifacts (.venv/, build/, syncify.egg-info/)

If you’re adding new scraping logic, please include:

  • A sample Spotify URL (track/playlist) that the change targets
  • A note about which DOM selectors were relied on and why

📜 License

MIT (as declared in package metadata).

Tip: consider adding a top-level LICENSE file so GitHub can display the license automatically.

⭐ Support

If you find Syncify useful, please star the repo — it helps others discover the project and motivates continued maintenance.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

syncify_py-1.0.0.tar.gz (13.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

syncify_py-1.0.0-py3-none-any.whl (12.9 kB view details)

Uploaded Python 3

File details

Details for the file syncify_py-1.0.0.tar.gz.

File metadata

  • Download URL: syncify_py-1.0.0.tar.gz
  • Upload date:
  • Size: 13.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.0

File hashes

Hashes for syncify_py-1.0.0.tar.gz
Algorithm Hash digest
SHA256 0d40b3e8f524508d06c36de5664550f5d14fbf41b82c1831e066827ae8622b4d
MD5 28a1fa98a89a823c43bf94799a1e2d84
BLAKE2b-256 9beb16e4c49228f16763fe905b76be58b1365dadcef0a414ee2cb9553c860c63

See more details on using hashes here.

File details

Details for the file syncify_py-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: syncify_py-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 12.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.0

File hashes

Hashes for syncify_py-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 37e9b26f749928ce7030bb92f7d0da9d812ad1be8a8977a0310a2f2f540d3636
MD5 ccb93e73479e85040d0526806decbeee
BLAKE2b-256 89cf130c4606359bb423ac740efad02fb47ba778b256f5c4b8378decafa4a3bc

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page