{"adoption": {"forks": 89, "observed_at": "2026-08-28T04:04:33.321296+00:00", "stars": 1377}, "canonical_url": "https://ross.abutalabs.com/products/savify", "card": {"archived": false, "artifact_type": "library", "description": "Download Spotify songs to mp3 with full metadata and cover art!", "domain": ["media"], "enriched": true, "function": ["audio-processing", "web-scraping", "cli"], "health_score": 20, "homepage": null, "language": "Python", "license": "MIT", "license_family": "permissive", "maturity": "maintenance", "member_repos": ["LaurenceRawlings/savify"], "name": "LaurenceRawlings/savify", "platform": ["python", "cross-platform", "cli"], "pushed_at": "2023-06-22T09:46:58+00:00", "repo": "LaurenceRawlings/savify", "stars": 1377, "tags": ["spotify", "youtube-dl", "mp3", "id3v2", "metadata", "cover-art", "ffmpeg", "music-downloader", "audio", "automation"], "topics": ["spotify", "spotify-api", "spotify-playlist", "spotify-downloader", "spotify-alternative", "youtube", "youtube-dl", "spotify-web-api", "tags", "album-artwork", "spotify-playlist-downloader", "ffmpeg", "id3v2", "downloads-songs", "cover-art", "mp3", "playlists", "metadata", "spotify-to-mp3", "podcasts"], "urls": [], "use_cases": ["download spotify playlists as mp3 files", "convert spotify tracks to mp3 with cover art", "download songs by name without a spotify link", "tag downloaded music with title artist album metadata", "rip audio from youtube with correct spotify metadata", "batch download entire spotify albums", "convert downloaded songs to flac or m4a"], "what_it_is": "Savify is a Python library and CLI tool that downloads songs from providers like YouTube and embeds metadata scraped from Spotify, producing mp3 files up to 320 kb/s with id3v2 tags and cover art. It supports Spotify track, album, and playlist links plus integrated search, and can convert to other formats like aac, flac, m4a, opus, vorbis, and wav.", "when_to_avoid": ["you need tags on non-mp3 formats (only mp3 gets tags)", "you want to stream directly from Spotify itself (it downloads from other sources)", "you need a maintained tool - the last release was mid-2023 and youtube-dl-based downloaders often break"], "when_to_choose": ["you want spotify-accurate metadata and cover art on downloaded music", "you need a scriptable python library or CLI for bulk playlist downloads", "you want flexible output formats beyond mp3"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/savify", "repo": "LaurenceRawlings/savify", "role": "main", "score": 23}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:04:33.321296+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T04:40:24.600637+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "9fb7171f488a17924aff651f7143d1b24067d91dc99acafd7121fb5a2afe92f4", "fetched_at": "2026-08-28T04:04:33.321296+00:00", "kind": "readme", "missing": false, "url": "https://github.com/LaurenceRawlings/savify"}, {"content_hash": "2af23d2ccfe7973379eb65e7427645ebccfa7af9bcb3aab3a4610e0bfe729f77", "fetched_at": "2026-08-29T11:56:32.358269+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/savify/json"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:04:33.321296+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T04:40:24.600637+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "9fb7171f488a17924aff651f7143d1b24067d91dc99acafd7121fb5a2afe92f4", "fetched_at": "2026-08-28T04:04:33.321296+00:00", "kind": "readme", "missing": false, "url": "https://github.com/LaurenceRawlings/savify"}, {"content_hash": "2af23d2ccfe7973379eb65e7427645ebccfa7af9bcb3aab3a4610e0bfe729f77", "fetched_at": "2026-08-29T11:56:32.358269+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/savify/json"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T04:40:24.600637+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "9fb7171f488a17924aff651f7143d1b24067d91dc99acafd7121fb5a2afe92f4", "fetched_at": "2026-08-28T04:04:33.321296+00:00", "kind": "readme", "missing": false, "url": "https://github.com/LaurenceRawlings/savify"}, {"content_hash": "2af23d2ccfe7973379eb65e7427645ebccfa7af9bcb3aab3a4610e0bfe729f77", "fetched_at": "2026-08-29T11:56:32.358269+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/savify/json"}], "taxonomy_version": 1}, "health_score": {"inputs": ["days_since_push", "days_since_release", "archived"], "kind": "computed", "method": "health_v1"}, "homepage": {"kind": "observed", "observed_at": "2026-08-28T04:04:33.321296+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:04:33.321296+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:04:33.321296+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T04:40:24.600637+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "9fb7171f488a17924aff651f7143d1b24067d91dc99acafd7121fb5a2afe92f4", "fetched_at": "2026-08-28T04:04:33.321296+00:00", "kind": "readme", "missing": false, "url": "https://github.com/LaurenceRawlings/savify"}, {"content_hash": "2af23d2ccfe7973379eb65e7427645ebccfa7af9bcb3aab3a4610e0bfe729f77", "fetched_at": "2026-08-29T11:56:32.358269+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/savify/json"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:04:33.321296+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:04:33.321296+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T04:40:24.600637+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "9fb7171f488a17924aff651f7143d1b24067d91dc99acafd7121fb5a2afe92f4", "fetched_at": "2026-08-28T04:04:33.321296+00:00", "kind": "readme", "missing": false, "url": "https://github.com/LaurenceRawlings/savify"}, {"content_hash": "2af23d2ccfe7973379eb65e7427645ebccfa7af9bcb3aab3a4610e0bfe729f77", "fetched_at": "2026-08-29T11:56:32.358269+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/savify/json"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:04:33.321296+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:04:33.321296+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:04:33.321296+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T04:40:24.600637+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "9fb7171f488a17924aff651f7143d1b24067d91dc99acafd7121fb5a2afe92f4", "fetched_at": "2026-08-28T04:04:33.321296+00:00", "kind": "readme", "missing": false, "url": "https://github.com/LaurenceRawlings/savify"}, {"content_hash": "2af23d2ccfe7973379eb65e7427645ebccfa7af9bcb3aab3a4610e0bfe729f77", "fetched_at": "2026-08-29T11:56:32.358269+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/savify/json"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:04:33.321296+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:04:33.321296+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T04:40:24.600637+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "9fb7171f488a17924aff651f7143d1b24067d91dc99acafd7121fb5a2afe92f4", "fetched_at": "2026-08-28T04:04:33.321296+00:00", "kind": "readme", "missing": false, "url": "https://github.com/LaurenceRawlings/savify"}, {"content_hash": "2af23d2ccfe7973379eb65e7427645ebccfa7af9bcb3aab3a4610e0bfe729f77", "fetched_at": "2026-08-29T11:56:32.358269+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/savify/json"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T04:40:24.600637+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "9fb7171f488a17924aff651f7143d1b24067d91dc99acafd7121fb5a2afe92f4", "fetched_at": "2026-08-28T04:04:33.321296+00:00", "kind": "readme", "missing": false, "url": "https://github.com/LaurenceRawlings/savify"}, {"content_hash": "2af23d2ccfe7973379eb65e7427645ebccfa7af9bcb3aab3a4610e0bfe729f77", "fetched_at": "2026-08-29T11:56:32.358269+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/savify/json"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T04:40:24.600637+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "9fb7171f488a17924aff651f7143d1b24067d91dc99acafd7121fb5a2afe92f4", "fetched_at": "2026-08-28T04:04:33.321296+00:00", "kind": "readme", "missing": false, "url": "https://github.com/LaurenceRawlings/savify"}, {"content_hash": "2af23d2ccfe7973379eb65e7427645ebccfa7af9bcb3aab3a4610e0bfe729f77", "fetched_at": "2026-08-29T11:56:32.358269+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/savify/json"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T04:40:24.600637+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "9fb7171f488a17924aff651f7143d1b24067d91dc99acafd7121fb5a2afe92f4", "fetched_at": "2026-08-28T04:04:33.321296+00:00", "kind": "readme", "missing": false, "url": "https://github.com/LaurenceRawlings/savify"}, {"content_hash": "2af23d2ccfe7973379eb65e7427645ebccfa7af9bcb3aab3a4610e0bfe729f77", "fetched_at": "2026-08-29T11:56:32.358269+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/savify/json"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 0, "longevity": 100, "rhythm": 8}, "computed_at": "2026-09-02T17:46:02.011165+00:00", "flags": [], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 2568, "days_push": 1168, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 23, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}