Skip to main content

Download audio from Youtube into your Beets library

Project description

beets-ytimport

A beets plugin to download audio from Youtube and import it into your library.

Differences compared to the ydl plugin:

  • Supports downloading liked songs into your beets library (using ytmusicapi).
  • Uses yt-dlp instead of ytdl to download the audio files.
  • Prefers to download Opus files, avoiding re-encoding lossy audio (which would decrease quality).

Installation

python3 -m pip install beets-ytimport ytmusicapi yt-dlp

Configuration

Enable the plugin and add a ytimport section to your beets config.yaml as follows:

plugins:
  - ytimport

import:
  move: true
# Alternatively, you can declare left-over cover art within the import source dir as clutter:
#clutter:
#  - cover.jpg

ytimport:
  directory: /path/to/youtube/cache # required
  import: true
  reimport: false
  # Prefers opus over m4a due to higher quality and support for custom tags.
  # (You can get opus or m4a from Youtube and mp3 from SoundCloud.)
  # To prefer m4a instead, set 'm4a/bestaudio/best'.
  format: bestaudio/best
  url_file: ''
  likes: false
  max_likes: 15
  set:
    loved: true
  auth_headers: ''
  oauth_client_id: ''
  oauth_client_secret: ''
  cookiefile: path/to/your/cookies
  min_length: 60 # 1m; min track length in seconds
  max_length: 7200 # 2h; max track length in seconds
  max_length_nochapter: 900 # 15m; max track length when no chapters defined
  split_tracks: true
  group_albums: true
  quiet_fallback: skip # optional; alternatively, to import as is, set 'asis'.
  oauth_client_id: ''
  oauth_client_secret: ''

For more information, see CLI.

Usage

Once you enabled the ytimport plugin within your beets configuration, you can download your liked songs from Youtube and import them into your beets library as follows:

beet ytimport --likes --max-likes 3

Please note that the command prompts you for Google authentication, unless you specified the auth_headers option within your beets configuration file pointing to a file containing HTTP headers (to get the HTTP headers, see here). For Authentication oauth clientID and Secret are required (this requres a google cloud console account, see here). Alternativly you can pass your cookie file to ytimport (to retrieve it use one of many cookie export extensions eg To imp Import auto-tagger prompts can be disabled by specifying the -q option. You can interrupt and continue or repeat the command to synchronize likes from your Youtube account(s) into your beets library incrementally.

To download a particular track, run:

beet ytimport --no-likes https://www.youtube.com/watch?v=hC8CH0Z3L54

CLI

Usage: beet ytimport [options]

Options:
  -h, --help            show this help message and exit
  --directory=DIR       directory to download Youtube files to
  --format=FORMAT       preferred file format
  --auth-headers=FILE   path to a file containing the HTTP headers of an
                        authenticated POST request to music.youtube.com,
                        copied from your browser's development tool
  --url-file=URL        URL/path to a file containing a download URL per line
  --likes               download liked songs
  --no-likes            don't download liked songs
  --max-likes=LIKES     maximum number of likes to obtain
  --split-tracks        split tracks by chapter
  --no-split-tracks     don't split tracks
  --group-albums        import split tracks as albums
  --no-group-albums     don't import split tracks as albums
  --import              import downloaded songs into beets
  --no-import           don't import downloaded songs into beets
  --reimport            re-download and re-import tracks
  --no-reimport         don't re-download and re-import tracks
  --set=KEY=VALUE       set a field on import, using KEY=VALUE format
  --min-length=SECONDS  minimum track length in seconds
  --max-length=SECONDS  maximum track length in seconds
  --max-length-nochapter=SECONDS
                        max track length in seconds when no chapters defined
  -q, --quiet           don't prompt for input when importing
  --quiet-fallback=skip|asis
                        decision in quiet mode when there is no strong match
  --pretend             don't import but print the files when importing
  --cookiefile          path to a file containing the cookies for a logged in
                        user on music.youtube.com in Netscape format

Development

Run the unit tests (containerized):

make test

Run the e2e tests (containerized):

make test-e2e

To test your plugin changes manually, you can run a shell within a beets docker container as follows:

make beets-sh

A temporary beets library is written to ./data. It can be removed by calling make clean-data.

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distribution

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

beets_ytimport-1.12.1-py3-none-any.whl (16.3 kB view details)

Uploaded Python 3

File details

Details for the file beets_ytimport-1.12.1-py3-none-any.whl.

File metadata

File hashes

Hashes for beets_ytimport-1.12.1-py3-none-any.whl
Algorithm Hash digest
SHA256 262fc6bb079625b8a8c469a735c3fd3b90a90723a40b12db5672ca53ffd17d45
MD5 77b96b32093cb5dabc16fe9b5542dfa4
BLAKE2b-256 118860ed89b5b2a3bf3346124b46f12622067001fae6f4128daadb3856814733

See more details on using hashes here.

Provenance

The following attestation bundles were made for beets_ytimport-1.12.1-py3-none-any.whl:

Publisher: workflow.yml on mgoltzsche/beets-ytimport

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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