A modular music archival program
OrpheusDL is a modular music archival tool written in Python which allows archiving from multiple different services.
Follow these steps to get a local copy of Orpheus up and running:
- Python 3.7+ (due to the requirement of dataclasses), though Python 3.9 is highly recommended
- Clone the repo
git clone https://github.com/yarrm80s/orpheusdl.git && cd orpheusdl
- Install all requirements
pip install -r requirements.txt
- Run the program at least once, or use this command to create the settings file
python3 orpheus.py settings refresh
- Enter your credentials in
config/settings.json
Just call orpheus.py with any link you want to archive, for example Qobuz:
python3 orpheus.py https://open.qobuz.com/album/c9wsrrjh49ftbAlternatively do a search (luckysearch to automatically select the first option):
python3 orpheus.py search qobuz track darkside alan walkerOr if you have the ID of what you want to download, use:
python3 orpheus.py download qobuz track 52151405You can customize every module from Orpheus individually and also set general/global settings which are active in every loaded module. You'll find the configuration file here: config/settings.json
{ "download_path": "./downloads/", "download_quality": "hifi", "search_limit": 10 }download_path: Set the absolute or relative output path with / as the delimiter
download_quality: Choose one of the following settings:
- "hifi": FLAC higher than 44.1/16 if available
- "lossless": FLAC with 44.1/16 if available
- "high": lossy codecs such as MP3, AAC, ... in a higher bitrate
- "medium": lossy codecs such as MP3, AAC, ... in a medium bitrate
- "low": lossy codecs such as MP3, AAC, ... in a lower bitrate
NOTE: The download_quality really depends on the used modules, so check out the modules README.md
search_limit: How many search results are shown
{ "album_format": "{name}{explicit}", "playlist_format": "{name}{explicit}", "track_filename_format": "{track_number}. {name}", "single_full_path_format": "{name}", "enable_zfill": true, "force_album_format": false }track_filename_format: How tracks are formatted in albums and playlists. The relevant extension is appended to the end.
album_format, playlist_format, artist_format: Base directories for their respective formats - tracks and cover art are stored here. May have slashes in it, for instance {artist}/{album}.
single_full_path_format: How singles are handled, which is separate to how the above work. Instead, this has both the folder's name and the track's name.
enable_zfill: Enables zero padding for track_number, total_tracks, disc_number, total_discs if the corresponding number has more than 2 digits
force_album_format: Forces the album_format for tracks instead of the single_full_path_format and also uses album_format in the playlist_format folder
track_filename_format variables are {name}, {album}, {album_artist}, {album_id}, {track_number}, {total_tracks}, {disc_number}, {total_discs}, {release_date}, {release_year}, {artist_id}, {isrc}, {upc}, {explicit}, {copyright}, {codec}, {sample_rate}, {bit_depth}.
album_format variables are {name}, {id}, {artist}, {artist_id}, {release_year}, {upc}, {explicit}, {quality}.
playlist_format variables are {name}, {creator}, {tracks}, {release_year}, {explicit}, {creator_id}
{quality}will add[Dolby Atmos] [96kHz 24bit] [M]
to the corresponding path (depending on the module)
{explicit}will addto the corresponding path[E]
{ "embed_cover": true, "main_compression": "high", "main_resolution": 1400, "save_external": false, "external_format": "png", "external_compression": "low", "external_resolution": 3000, "save_animated_cover": true }| Option | Info |
|---|---|
| embed_cover | Enable it to embed the album cover inside every track |
| main_compression | Compression of the main cover |
| main_resolution | Resolution (in pixels) of the cover of the module used |
| save_external | Enable it to save the cover from a third party cover module |
| external_format | Format of the third party cover, supported values: jpg, png, webp |
| external_compression | Compression of the third party cover, supported values: low, high |
| external_resolution | Resolution (in pixels) of the third party cover |
| save_animated_cover | Enable saving the animated cover when supported from the module (often in MPEG-4 format) |
{ "proprietary_codecs": false, "spatial_codecs": true }proprietary_codecs: Enable it to allow MQA, E-AC-3 JOC or AC-4 IMS
spatial_codecs: Enable it to allow MPEG-H 3D, E-AC-3 JOC or AC-4 IMS
Note: spatial_codecs has priority over proprietary_codecs when deciding if a codec is enabled
{ "lyrics": "default", "covers": "default", "credits": "default" }Change default to the module name under /modules in order to retrieve lyrics, covers or credits from the selected module
{ "embed_lyrics": true, "embed_synced_lyrics": false, "save_synced_lyrics": true }| Option | Info |
|---|---|
| embed_lyrics | Embeds the (unsynced) lyrics inside every track |
| embed_synced_lyrics | Embeds the synced lyrics inside every track (needs embed_lyrics to be enabled) (required for Roon) |
| save_synced_lyrics | Saves the synced lyrics inside a .lrc file in the same directory as the track with the same track_format variables |
Yarrm80s - @yarrm80s
Dniel97 - @Dniel97
Project Link: Orpheus Public GitHub Repository
- Chimera by Aesir - the inspiration to the project
- Icon modified from a freepik image