A tool for downloading songs from music streaming services like Spotify and Apple Music.
APACHE-2.0 License
Bot releases are visible (Hide)
β {YEAR} {LABEL}
to match Apple Music. https://github.com/miraclx/freyr-js/pull/638
Full Changelog: https://github.com/miraclx/freyr-js/compare/v0.10.2...v0.10.3
Published by github-actions[bot] 10 months ago
Full Changelog: https://github.com/miraclx/freyr-js/compare/v0.10.1...v0.10.2
Published by github-actions[bot] about 1 year ago
https://music.apple.com/us/song/1699712652
. https://github.com/miraclx/freyr-js/pull/552
Full Changelog: https://github.com/miraclx/freyr-js/compare/v0.10.0...v0.10.1
Published by github-actions[bot] about 1 year ago
SolidaritΓ©
now get properly normalized, helping more accurate lookups. https://github.com/miraclx/freyr-js/pull/473
bins/{posix,windows}
as being of higher priority than those in PATH
. https://github.com/miraclx/freyr-js/pull/474
ATOMIC_PARSLEY_PATH
environment variable. https://github.com/miraclx/freyr-js/pull/475
AtomicParsley
in the Docker images, fixing a class of errors. https://github.com/miraclx/freyr-js/pull/476
Full Changelog: https://github.com/miraclx/freyr-js/compare/v0.9.0...v0.10.0
Published by github-actions[bot] almost 2 years ago
-D, --downloader
with -S, --source
, introduced the -D, --check-dir
flag. https://github.com/miraclx/freyr-js/pull/350
.downloader.order
entry in the config file with .downloader.sources
. https://github.com/miraclx/freyr-js/pull/350
ffmpeg
with bundled Wasm version. https://github.com/miraclx/freyr-js/pull/305
urify
subcommand with Spotify URLs. https://github.com/miraclx/freyr-js/pull/308
v16
. https://github.com/miraclx/freyr-js/pull/293, https://github.com/miraclx/freyr-js/pull/332, https://github.com/miraclx/freyr-js/commit/d4ed669b068ad417cdf21b27d42ed2fdccc68544
Full Changelog: https://github.com/miraclx/freyr-js/compare/v0.8.1...v0.9.0
Published by github-actions[bot] about 2 years ago
Full Changelog: https://github.com/miraclx/freyr-js/compare/v0.8.0...v0.8.1
Published by github-actions[bot] about 2 years ago
AtomicParsley
during docker build to allow for maximum platform support. https://github.com/miraclx/freyr-js/pull/212
yarn install
not ahering to dependency overrides. https://github.com/miraclx/freyr-js/pull/215
tty
writing for normal logs. Allowing stdout
piping for everything except the progressbar. https://github.com/miraclx/freyr-js/pull/231
Full Changelog: https://github.com/miraclx/freyr-js/compare/v0.7.0...v0.8.0
Published by github-actions[bot] over 2 years ago
-v, --version
. https://github.com/miraclx/freyr-js/pull/152
Full Changelog: https://github.com/miraclx/freyr-js/compare/v0.6.0...v0.7.0
Published by github-actions[bot] over 2 years ago
"single"
specification in "type"
filter. https://github.com/miraclx/freyr-js/pull/124
AND
and OR
behavior when dealing with filters. https://github.com/miraclx/freyr-js/pull/127
CHANGELOG.md
file to track project changes. https://github.com/miraclx/freyr-js/pull/148
AtomicParsley
or atomicparsley
. https://github.com/miraclx/freyr-js/pull/140
Full Changelog: https://github.com/miraclx/freyr-js/compare/v0.5.0...v0.6.0
Published by miraclx over 2 years ago
π View on NPM
π View on Docker Hub
πΎ Installation:
π¦ NPM:
npm install -g [email protected]
π§Ά Yarn:yarn global add [email protected]
π³ Docker:docker pull freyrcli/freyrjs:v0.5.0
Full Changelog: https://github.com/miraclx/freyr-js/commits/v0.5.0
Built with β€οΈ by
Miraculous Owonubi
Via Coinbase (BTC
, ETH
, USDC
, LTC
, DAI
, BCH
):
$5
| $10
| $15
| $20
Or Directly:
Hey there, you might want to consider a cleaner and straight-forward installation method, without having to manually setup the requirements. If so, checkout the Docker installation method
Download for your individual platforms here https://www.python.org/downloads/
Linux: (check individual package managers)
sudo apt-get install python3.6
sudo pacman -S python
apt install python
sudo apk add python3
Download for your individual platforms here https://nodejs.org/en/download/
macOS + Linux: nvm recommended.
# install node with this nvm command
# freyr works with a minimum of v12
$ nvm install --lts
apt install nodejs
sudo apk add nodejs
Download for your individual platforms here https://ffmpeg.org/download.html
ffmpeg
binary from the compressed file, if it's in one.PATH
FFMPEG_PATH
to explicitly specify binary to useppa:mc3man/trusty-media
PPA provides recent buildssudo pacman -S ffmpeg
apt install ffmpeg
sudo apk add ffmpeg
First, download the latest release for your individual platforms here https://github.com/wez/atomicparsley/releases/latest
Then;
AtomicParsley.exe
in your PATH
.bins/windows
folder of this project directory. Create the folder(s) if they don't exist.AtomicParsley
in your PATH
.bins/posix
folder of this project directory. Create the folder(s) if they don't exist.sudo apt-get install atomicparsley
sudo pacman -S atomicparsley
apt install atomicparsley
First start by ensuring all requirements listed above are satisfied. Thereafter, you can use either of these options to install freyr:
NPM: npm install -g freyr
Yarn: yarn global add freyr
git clone https://github.com/miraclx/freyr-js.git freyr
cd freyr
% | NPM | Yarn |
---|---|---|
pull dependencies | npm install |
yarn install |
install globally | npm link |
yarn link |
For convenience, we provide officially prebuilt images (automated builds from this repo) so you can skip the setup and build process and get right into it.
docker run -it --rm -v $PWD:/data freyrcli/freyrjs [options, arguments and queries...]
You can also create a handy alias to skip remembering that whole line everytime
alias freyr='docker run -it --rm -v $PWD:/data freyrcli/freyrjs'
The
-v $PWD:/data
part sets the working directory for freyr to the current working directory.
For example, you can use-v ~/Music/freyr:/data
to set the work directory and consequently, default save location to~/Music/freyr
.Please ensure the folder on the host already exists, create it if not. Otherwise, docker autocreates the folder as root and that causes unpleasant
Permission Denied
issues when you run freyr.
[See Docker Development]
Usage: freyr [options] [query...]
Usage: freyr [options] [subcommand]
[See Service Support].
freyr --help
*The get
subcommand is implicit and default.
Usage: freyr [options] get [options] [query...]
Usage: freyr [options] [query...]
____
/ __/_______ __ _______
/ /_/ ___/ _ \/ / / / ___/
/ __/ / / __/ /_/ / /
/_/ /_/ \___/\__, /_/
/____/ v0.1.0
freyr v0.1.0 - (c) Miraculous Owonubi <[email protected]>
-------------------------------------------------------------
Usage: freyr get [options] [query...]
Download music tracks from queries
Options:
-i, --input <FILE> use URIs found in the specified FILE as queries (file size limit: 1 MiB)
(each query on a new line, use '#' for comments, whitespaces ignored)
(example: `-i queue.txt`)
-b, --bitrate <N> set audio quality / bitrate for audio encoding
(valid: 96,128,160,192,256,320) (default: "320k")
-n, --chunks <N> number of concurrent chunk streams with which to download (default: 7)
-r, --retries <N> set number of retries for each chunk before giving up
(`infinite` for infinite) (default: 10)
-t, --meta-retries <N> set number of retries for collating track feeds (`infinite` for infinite) (default: 5)
-d, --directory <DIR> save tracks to DIR/..
-c, --cover <NAME> custom name for the cover art (default: "cover.png")
--cover-size <SIZE> preferred cover art dimensions
(format: <width>x<height> or <size> as <size>x<size>) (default: "640x640")
-C, --no-cover skip saving a cover art
-x, --format <FORMAT> preferred audio output format (to export) (unimplemented)
(valid: mp3,m4a,flac) (default: "m4a")
-D, --downloader <SERVICE> specify a preferred download source or a `,`-separated preference order
(valid: youtube,yt_music) (default: "yt_music")
-l, --filter <MATCH> filter matches off patterns (repeatable and optionally `,`-separated)
(value omission implies `true` if applicable)
(format: <key=value>) (example: title="when we all fall asleep*",type=album)
See `freyr help filter` for more information
-L, --filter-case enable case sensitivity for glob matches on the filters
-z, --concurrency <SPEC> key-value concurrency pairs (repeatable and optionally `,`-separated)
(format: <[key=]value>) (key omission implies track concurrency)
(valid(key): queries,tracks,trackStage,downloader,encoder,embedder)
(example: `queries=2,downloader=4` processes 2 CLI queries,
downloads at most 4 tracks concurrently)
--gapless set the gapless playback flag for all tracks
-f, --force force overwrite of existing files
-o, --config <FILE> specify alternative configuration file
-p, --playlist <FILENAME> create playlist for all successfully collated tracks
-P, --no-playlist skip creating a playlist file for collections
--playlist-dir <DIR> directory to save playlist file to, if any, (default: tracks base directory)
--playlist-noappend do not append to the playlist file, if any exists
--playlist-noescape do not escape invalid characters within playlist entries
--playlist-namespace <SPEC> namespace to prefix on each track entry, relative to tracks base directory
useful for, but not limited to custom (file:// or http://) entries
(example, you can prefix with a HTTP domain path: `http://webpage.com/music`)
--playlist-force-append force append collection tracks to the playlist file
-s, --storefront <COUNTRY> country storefront code (example: us,uk,ru)
-T, --no-tree don't organise tracks in directory structure `[DIR/]<ARTIST>/<ALBUM>/<TRACK>`
--tags tag configuration specification (repeatable and optionally `,`-separated) (unimplemented)
(format: <key=value>) (reserved keys: [exclude, account])
--via-tor tunnel network traffic through the tor network (unimplemented)
--cache-dir <DIR> specify alternative cache directory, `<tmp>` for tempdir
-m, --mem-cache <SIZE> max size of bytes to be cached in-memory for each download chunk
--no-mem-cache disable in-memory chunk caching (restricts to sequential download)
--timeout <N> network inactivity timeout (ms) (default: 10000)
--no-auth skip authentication procedure
--no-browser disable auto-launching of user browser
--no-net-check disable internet connection check
--ffmpeg <PATH> explicit path to the ffmpeg binary
--atomic-parsley <PATH> explicit path to the atomic-parsley binary
--no-stats don't show the stats on completion
--pulsate-bar show a pulsating bar
--single-bar show a single bar for the download, hide chunk-view
(default when number of chunks/segments exceed printable space)
-h, --help show this help information
Environment Variables:
SHOW_DEBUG_STACK show extended debug information
FFMPEG_PATH custom ffmpeg path, alternatively use `--ffmpeg`
ATOMIC_PARSLEY_PATH custom AtomicParsley path, alternatively use `--atomic-parsley`
Info:
When downloading playlists, the tracks are downloaded individually into
their respective folders. However, a m3u8 playlist file is generated in
the base directory with the name of the playlist that lists the tracks
____
/ __/_______ __ _______
/ /_/ ___/ _ \/ / / / ___/
/ __/ / / __/ /_/ / /
/_/ /_/ \___/\__, /_/
/____/ v0.1.0
freyr v0.1.0 - (c) Miraculous Owonubi <[email protected]>
-------------------------------------------------------------
Checking directory permissions...[done]
[spotify:track:5FNS5Vj69AhRGJWjhrAd01]
[β’] Identifying service...[Spotify]
[β’] Checking authentication...[unauthenticated]
[Spotify Login]
[β’] Logging in...[done]
Detected [track]
Obtaining track metadata...[done]
β€ Title: Slow Dance
β€ Album: Slow Dance
β€ Artist: AJ Mitchell
β€ Year: 2019
β€ Playtime: 02:58
[β’] Collating...
β’ [01 Slow Dance]
| β€ Collating sources...
| β€ [β’] YouTube Music...[success, found 1 source]
| β€ Awaiting audiofeeds...[done]
| [β] Got album art
| [β] Got raw track file
| [β’] Post Processing...
[β’] Download Complete
[β’] Embedding Metadata...
β’ [β] 01 Slow Dance
[β’] Collation Complete
========== Stats ==========
[β’] Runtime: [31.7s]
[β’] Total queries: [01]
[β’] Total tracks: [01]
Β» Skipped: [00]
β Passed: [01]
β Failed: [00]
[β’] Output directory: [.]
[β’] Cover Art: cover.png (640x640)
[β’] Total Output size: 7.30 MB
[β’] Total Network Usage: 3.12 MB
β« Media: 3.02 MB
β€ Album Art: 106.76 KB
[β’] Output bitrate: 320k
===========================
____
/ __/_______ __ _______
/ /_/ ___/ _ \/ / / / ___/
/ __/ / / __/ /_/ / /
/_/ /_/ \___/\__, /_/
/____/ v0.1.0
freyr v0.1.0 - (c) Miraculous Owonubi <[email protected]>
-------------------------------------------------------------
Checking directory permissions...[done]
[https://music.apple.com/us/album/im-sorry-im-not-sorry-ep/1491795443]
[β’] Identifying service...[Apple Music]
[β’] Checking authentication...[authenticated]
Detected [album]
Obtaining album metadata...[done]
β€ Album Name: I'm Sorry, I'm Not Sorry
β€ Artist: Sody
β€ Tracks: 4
β€ Type: Album
β€ Year: 2020
β€ Genres: Singer/Songwriter, Music
[β’] Collating [I'm Sorry, I'm Not Sorry]...
[β’] Inquiring tracks...[done]
β’ [01 What We Had]
| β€ Collating sources...
| β€ [β’] YouTube Music...[success, found 4 sources]
| β€ Awaiting audiofeeds...[done]
| [β] Got album art
| [β] Got raw track file
| [β’] Post Processing...
β’ [02 Reason To Stay]
| β€ Collating sources...
| β€ [β’] YouTube Music...[success, found 6 sources]
| β€ Awaiting audiofeeds...[done]
| [β] Got album art
| [β] Got raw track file
| [β’] Post Processing...
β’ [03 Nothing Ever Changes]
| β€ Collating sources...
| β€ [β’] YouTube Music...[success, found 4 sources]
| β€ Awaiting audiofeeds...[done]
| [β] Got album art
| [β] Got raw track file
| [β’] Post Processing...
β’ [04 Love's a Waste]
| β€ Collating sources...
| β€ [β’] YouTube Music...[success, found 4 sources]
| β€ Awaiting audiofeeds...[done]
| [β] Got album art
| [β] Got raw track file
| [β’] Post Processing...
[β’] Download Complete
[β’] Embedding Metadata...
β’ [β] 01 What We Had
β’ [β] 02 Reason To Stay
β’ [β] 03 Nothing Ever Changes
β’ [β] 04 Love's a Waste
[β’] Collation Complete
========== Stats ==========
[β’] Runtime: [2m 2.3s]
[β’] Total queries: [01]
[β’] Total tracks: [04]
Β» Skipped: [00]
β Passed: [04]
β Failed: [00]
[β’] Output directory: [.]
[β’] Cover Art: cover.png (640x640)
[β’] Total Output size: 29.79 MB
[β’] Total Network Usage: 13.35 MB
β« Media: 12.73 MB
β€ Album Art: 619.43 KB
[β’] Output bitrate: 320k
===========================
____
/ __/_______ __ _______
/ /_/ ___/ _ \/ / / / ___/
/ __/ / / __/ /_/ / /
/_/ /_/ \___/\__, /_/
/____/ v0.1.0
freyr v0.1.0 - (c) Miraculous Owonubi <[email protected]>
-------------------------------------------------------------
Checking directory permissions...[done]
[https://www.deezer.com/us/artist/14808825]
[β’] Identifying service...[Deezer]
[β’] Checking authentication...[authenticated]
Detected [artist]
Obtaining artist metadata...[done]
β€ Artist: Mazie
β€ Followers: 6
> Gathering collections...[done]
[β’] Collating...
(01) [i think i wanna be alone] (single)
[β’] Inquiring tracks...[done]
β’ [01 i think i wanna be alone]
| β€ Collating sources...
| β€ [β’] YouTube Music...[success, found 2 sources]
| β€ Awaiting audiofeeds...[done]
| [β] Got album art
| [β] Got raw track file
| [β’] Post Processing...
(02) [no friends] (single)
[β’] Inquiring tracks...[done]
β’ [01 no friends]
| β€ Collating sources...
| β€ [β’] YouTube Music...[success, found 4 sources]
| β€ Awaiting audiofeeds...[done]
| [β] Got album art
| [β] Got raw track file
| [β’] Post Processing...
[β’] Download Complete
[β’] Embedding Metadata...
β’ [β] 01 i think i wanna be alone
β’ [β] 01 no friends
[β’] Collation Complete
========== Stats ==========
[β’] Runtime: [54.6s]
[β’] Total queries: [01]
[β’] Total tracks: [02]
Β» Skipped: [00]
β Passed: [02]
β Failed: [00]
[β’] Output directory: [.]
[β’] Cover Art: cover.png (640x640)
[β’] Total Output size: 8.47 MB
[β’] Total Network Usage: 3.66 MB
β« Media: 3.50 MB
β€ Album Art: 157.16 KB
[β’] Output bitrate: 320k
===========================
Queries can be collated to be processed at once.
freyr query1 query2 ... queryN
Queries can be batched into a file and loaded all at once with the -i, --input <FILE>
flag.
Queries should be on separate lines.
Lines starting with a #
are treated as comments and ignored. comments can also be inlined with everything following the #
character ignored.
# ./queue.txt
# Hailee Steinfeld
https://open.spotify.com/track/5Gu0PDLN4YJeW75PpBSg9p # (track) Let Me Go
https://open.spotify.com/track/7GCVboEDzfL3NKp1NrAgHR # (track) Wrong Direction
# (album) Rina Sawayama
https://open.spotify.com/album/3stadz88XVpHcXnVYMHc4J
freyr -i ./queue.txt
Use the --help
flag to see full usage documentation.
Services can be queried with short URIs containing the type and ID for the resource.
Use the urify
subcommand to parse betweeen URIs and its equivalent URL representation, and vice-versa.
Creating freyr-compatible queue output.
spotify:album:2D23kwwoy2JpZVuJwzE42B
[+] Urify complete
[+] Urify complete
Successfully written to [queue_of_uris.txt]
FOLDER/<Artist Name>/<Album Name>/<Track Name>
Persistent configuration such as authentication keys and their validity period are stored within a session specific configuration file.
This configuration file resides within the user config directory per-platform. e.g $HOME/.config/FreyrCLI/d3fault.x4p
for Linux.
All configuration is to be defined within a conf.json
file in the root of the project.
This file should be of JSON
format and is to be structured as such.
Defaults are in the conf.json file.
server
: <object> The server URL configuration same as on an individual services' callback option.
hostname
: <string>
port
: <number>
useHttps
: <boolean>
concurrency
: <object>
queries
: <number> The number of queries to be processed concurrently.tracks
: <number> The number of tracks to be actively processed in parallel.trackStage
: <number> The number of tracks to concurrently preprocess before being pushed to the main trackQueue.downloader
: <number> The number of tracks to be concurrently downloaded in parallel.encoder
: <number> The total number of tracks to be concurrently undergo encoding.embedder
: <number> The total number of tracks to be concurrently embedded in parallel.opts
: <object>
netCheck
: <boolean> Whether or not to check network access at program start.attemptAuth
: <boolean> Whether or not to process authentication.autoOpenBrowser
: <boolean> Whether or not to automatically open user browser.filters
: <FilterRules[]> Filter rules each track must match to be downloaded.dirs
: <object>
output
: <string> Default download directory. Default: "."
cache
: <string> Default temp download directory. Default: "<tmp>"
playlist
: <object>
always
: <boolean> Always create playlists for collections and non-collections alike.append
: <boolean> Append non-collection tracks onto the playlist file.escape
: <boolean> Escape #
characters within playlist entries paths.forceAppend
: <boolean> Force append collection tracks.dir
: <string> Default playlist save directory.namespace
: <string> Prefix namespace to prepend to track paths.image
: <object|number|string> An object with fields pertaining to an image's properties or a number defining its size. (<width>x<height> or <size> as <size>x<size>)
width
: <number|string>
height
: <number|string>
downloader
: <object>
memCache
: <boolean> Whether or not to use in-memory caching for download chunks.cacheSize
: <number> Maximum size of bytes to be cached per download.order
: <array> Service download sources order.
youtube
, yt_music
[ "yt_music", "youtube" ]
services
: <ServiceConfiguration: object>
{
"server": {
"hostname": "localhost",
"port": 36346,
"useHttps": false
},
"image": {
"width": 640,
"height": 640
},
"services": {
"spotify": {
"client_id": "CLIENT_ID",
"client_secret": "CLIENT_SECRET",
"refresh_token": "OPTIONAL_REFRESH_TOKEN"
},
"apple_music": {
"developerToken": "DEVELOPER_TOKEN"
},
"deezer": {
"retries": 5
}
}
}
The conf.json file already includes some API tokens for service authentication and should work right out of the box. [See Project specific configuration]
spotify
: <object>
clientId
: <string>
clientSecret
: <string>
refreshToken
: <string>
Spotify requires a clientId
and a clientSecret
that can be gotten from their developer dashboard.
If you wish to create and use custom keys, [See Spotify API Authorization].
An optional refreshToken
option can be defined which can be used to authenticate a session without necessarily requesting explicit permissions. The refreshToken
is already bound to a pre-authenticated account.
An invalid refreshToken
, when specified, would fallback to requesting account access which in-turn would request re-authentication of the users' account.
CREATE A CLIENT ID
and create an appEdit Settings
http://localhost:36346/callback
to the Redirect URIsclientId
and the clientSecret
from the dashboard in the spotify
object that is a property of the services
object of the conf.json
file. [See Confiuration]apple_music
: <object>
storefront
: <string>
developerToken
: <string>
This library already includes a pre-defined developer token that should work at will. This developer token is the default token, extracted off the Apple Music website. While this developer token could expire over time, we'll try to update with the most recent developer token as time goes on.
To create a custom developer token, please refer to the Apple Music documentation on this topic.
The storefront
option defines the default storefront to be used in the absence of a specification.
[See Apple Music API: Getting Keys and Creating Tokens
]
After successfully acquiring the developer token, include the developerToken
to the apple_music
object that's a property of the services
object in the conf.json
file. [See Confiuration]
deezer
: <object>
retries
: <number>
Authentication unrequired. API is freely accessible.
Because of the 50 requests / 5 seconds limit enforced on an IP-basis for Deezer's API [See #32],
occasionally a Quota limit exceeded
error would be thrown by the API server.
To combat this, freyr employs request batching, managed delays and finally, retries when things go awry.
You can configure how many retries you want freyr to make before accepting failure.
Filter rules each to be matched against the tracks involved in any operation.
Used as values to the -l, --filter
flag or as key-value pairs in the filters
array of the configuration file.
key | syntax | description | examples |
---|---|---|---|
id |
glob | Resource ID |
id=1497949287 , id=*149
|
uri |
glob | Resource URI | uri="*:+(track|album):*" |
title |
glob | Track title | title="all*good girls*hell" |
album |
glob | Track album | album="when we*fall*do we go*" |
artist |
glob | Match an artist | artist="Billie*" |
trackn |
Numeric Range | Match a track number range |
trackn="2..5" , trackn="4..=5"
|
type |
Static |
album | compilation
|
type=compilation |
duration |
Timed Range | Track duration |
duration="3s.." , duration="2:30..3:00" , duration="..=3m"
|
explicit |
Static |
true | false | inoffensive
|
explicit=true , explicit=inoffensive
|
album_artist |
glob | Album artist | album_artist="Billie Eilish" |
isrc |
glob | Track ISRC | isrc=USUM71900766 |
label |
glob | Record label | label="*Interscope*" |
year |
Numeric Range | Release year |
year=2019 , year=2018..2020
|
diskn |
Numeric Range | Disk number | diskn=1 |
ntracks |
Numeric Range | Number of tracks in the album | ntracks=10..=14 |
Syntax: [a][..][[=]b]
Spec | Match | Representation |
---|---|---|
.. |
-β ... β |
x |
3..7 |
3, 4, 5, 6 |
7 > x β₯ 3 |
3..=7 |
3, 4, 5, 6, 7 |
7 β₯ x β₯ 3 |
..3 |
-β ... 0, 1, 2 |
3 > x |
..=3 |
-β ... 1, 2, 3 |
3 β₯ x |
5.. |
5, 6, 7 ... β |
x β₯ 5 |
Examples: duration=60s..=3:40
Metric | Values |
---|---|
Seconds |
30 , 30s , 00:30
|
Minutes |
120 , 120s , 02:00
|
Hours |
5400 , 5400s , 01:30
|
To preview filter rules specification, use the filter
subcommand.
[
{
"query": "*",
"filters": {
"title": "all*good girls*hell",
"artist": "*eilish",
"trackn": "4..=5"
}
}
]
Service | Track | Album | Artist | Playlist | URI Short Tags |
---|---|---|---|---|---|
Spotify | β | β | β | β | spotify: |
Apple Music | β | β | β | β | apple_music: |
Deezer | β | β | β | β | deezer: |
Youtube Music (See #6) | β | β | β | β | β |
Tidal (See #33) | β | β | β | β | β |
Meta | Spotify | Apple Music | Deezer |
---|---|---|---|
Title |
β | β | β |
Artist |
β | β | β |
Composer |
β | β | β |
Album |
β | β | β |
Genre |
β | β | β |
Track Number |
β | β | β |
Disk Number |
β | β | β |
Release Date |
β | β | β |
Rating |
β | β | β |
Album Artist |
β | β | β |
ISRC |
β | β | β |
Label |
β | β | β |
Copyright |
β | β | β |
Cover Art |
β | β | β |
Feel free to clone and use in adherance to the license. Pull requests are very much welcome.
git clone https://github.com/miraclx/freyr-js.git freyr
cd freyr
If using NPM:
npm install
# to have access to the freyr command globally
npm link
If using Yarn:
yarn install
# to have access to the freyr command globally
yarn link
The default provided Dockerfile builds minimal alpine images. Average build network usage is ~ 80 MB and disk usage is ~ 180 MB.
git clone https://github.com/miraclx/freyr-js.git freyr
cd freyr
docker build -t freyr-dev .
Afterwards, you can drop into the container by explicitly defining the entrypoint
docker run -it --entrypoint bash freyr-dev
# Alternatively, create a handy alias
alias freyrsh='docker run -it --entrypoint bash freyr-dev'
Optionally, you can use these interesting flags to customize the experience.
-h freyr-dev
sets the container hostname to freyr-dev
-m 1G
sets the container memory limit-v $PWD:/data
mounts the current working directory to /data
within the container.--cpus 2
limits the container to using 2 CPU coresThe freyr source would be available in the /freyr
directory within the container along with a globally registered command freyr
for calling the script.
For more information and documentation about docker, please refer to its official website:
Apache 2.0 Β© Miraculous Owonubi (@miraclx) <[email protected]>