#!/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: