Declarative music library management
Go to file
2020-03-13 18:10:07 -05:00
.gitignore Initial commit 2020-01-17 22:15:58 -06:00
badwitch.py Improve date detection 2020-03-13 18:10:07 -05:00
README.md Update README 2020-03-13 17:34:06 -05:00
requirements.txt Work on GUI a bit 2020-03-07 02:53:14 -06:00
venv.sh Do a whole helluvalotta work 2020-03-03 18:39:04 -06:00

badwitch

Bad Witch is a declarative music management system (and later, a streaming music player) based around Youtube-DL.

It's the natural evolution of ptgdp

Syntax

The library is stored in a flat JSON file with a pretty simple syntax:

{
	"Album Name": {
		"meta": {
			"genre": "Rock",
			"publisher": "Foobar Records",
			"release_date": "2020-03-06"
		},
		"Song Title": {
			"track": 1,
			"artist": "Salt",
			"source": "https://youtube-dl.parseable.link.to/song"
		}
	}
}

The entire "meta" entry for the album is optional, but recommended.

Some tags are automatically inferred. For example, the album_artist tag will be set to the artist of the album's songs OR "Various Artists" if there are several.

Example

Here's an example library for, fittingly enough, Nine Inch Nails' 'Bad Witch':

{
	"Bad Witch": {
		"meta": {
			"genre": "Industrial",
			"publisher": "The Null Corporation",
			"release_date": "2018-06-22"
		},
		"Shit Mirror": {
			"track": 1,
			"artist": "Nine Inch Nails",
			"source": "https://www.youtube.com/watch?v=yeqjz5mXrLQ"
		},
		"Ahead of Ourselves": {
			"track": 2,
			"artist": "Nine Inch Nails",
			"source": "https://www.youtube.com/watch?v=4Ab1O-i4ep4"
		},
		"Play the Goddamned Part": {
			"track": 3,
			"artist": "Nine Inch Nails",
			"source": "https://www.youtube.com/watch?v=85UgvBkMfr8"
		},
		"God Break Down the Door": {
			"track": 4,
			"artist": "Nine Inch Nails",
			"source": "https://www.youtube.com/watch?v=eeJ_DzRJUI4"
		},
		"I'm Not From This World": {
			"track": 5,
			"artist": "Nine Inch Nails",
			"source": "https://www.youtube.com/watch?v=9fjbcSUSt9w"
		},
		"Over and Out": {
			"track": 6,
			"artist": "Nine Inch Nails",
			"source": "https://www.youtube.com/watch?v=h-XlN3N2fis"
		}
	}
}

Usage

The tool has flags to change the location of the lib.json file (defaults to ${XDG_DATA_HOME:~/.local/share}/badwitch/lib.json) and increase verbosity. After that, it takes a subcommand:

  • list: List entire contents of library. Good for ensuring library integrity.

  • download: Downloads and retags all songs.

  • edit: Starts an interactive prompt to add/edit albums and songs. It's pretty shitty, but it works and stops you from having to write a shitton of JSON.

  • playlist: Starts an interactive prompt to import a playlist. It's less shitty and uses YouTube's built-in music tags where possible.

Limitations

Currently it only supports URLs that youtube-dl can handle. This does, however, mean that you can give it a few cool things like SoundCloud links (or smut, I guess). However, if song files exist that match the nomenclature you laid out in the library file, it'll skip downloading them.