ripbot/ripbot.py

102 lines
2.7 KiB
Python
Executable File

#!/usr/bin/env python3
import subprocess
import sys
import discid
import musicbrainzngs as mb
class Disk:
__albums__ = list()
def __init__(self):
pass
def addAlbum(self, album):
self.__albums__.append(album)
class Album:
songs = list()
name = ""
artist = ""
def __init__(self, artist = "", name = ""):
self.artist = artist
self.name = name
def addSong(self, song, position = -1):
if position == -1:
self.songs += [song]
else:
self.songs = self.songs[0:position] + [song] + self.songs[position:]
class Artist:
def __init__(self):
pass
class Song:
name = ""
position = -1
def __init__(self, name, position):
self.name = name
self.position = position
def getTitleAmount():
process = subprocess.Popen(["cdparanoia", "-Q", "--stderr-progress", "--"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
startCount = False
trackCount = 0
for line in process.stderr:
out = line.decode()
if startCount == True and not "TOTAL" in out:
trackCount += 1
if "===========================================================" in out:
startCount = True
elif "TOTAL" in out:
startCount = False
return trackCount
def getMBbyDisc():
disc = discid.read("/dev/cdrom")
mb.set_useragent("ripbot", "0.01", "https://git.geekify.de/sqozz/ripbot")
releases = mb.get_releases_by_discid(disc.id, includes=["artists", "recordings"])
if len(releases["disc"]["release-list"]) > 1:
print("Found {0} relases by discid {1}".format(releases["disc"]["release-count"], releases["disc"]["id"]))
else:
release = releases["disc"]["release-list"][0]
album = Album()
albumTitle = release["title"]
album.title = albumTitle
artist = release["artist-credit"][0]["artist"]["name"]
album.artist = artist
print("{0} - {1}:".format(albumTitle, artist))
for disc in release["medium-list"]:
for track in disc["track-list"]:
song = Song(track["recording"]["title"], track["number"])
album.addSong(song)
return album
def ripTitles(album = None):
process = subprocess.Popen(["cdparanoia", "-B", "-l", "--stderr-progress", "--", "\"1-2\""], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
currentTitle = 0
for line in process.stderr:
out = line.decode()
if "outputting to" in out:
currentTitle += 1
if album is None:
print("Ripping title {0}".format(currentTitle))
else:
print("Ripping {1}. title: {0}".format(album.songs[currentTitle - 1].name, album.songs[currentTitle - 1].position))
elif "##" == out[:2]:
print(out.strip(), end="\r")
sys.stdout.write("\r")
#else:
#print(out.strip())
titleAmount = getTitleAmount()
print("Found {0} titles".format(titleAmount))
album = getMBbyDisc()
print("Start ripping")
ripTitles(album)
# vim:ts=2 sts=2 sw=2 noexpandtab: