dotfiles/hm/scripts/replayGain

76 lines
1.9 KiB
Plaintext
Raw Permalink Normal View History

#!/usr/bin/env nix-shell
#! nix-shell -i python3 --pure
2024-01-10 13:55:15 +01:00
#! nix-shell -p python3 python3Packages.coloredlogs r128gain
# TODO r128gain is not maintainted anymore
2024-11-30 20:06:14 +01:00
# rsgain replaces it, does the same job as I do with albums
2018-08-04 12:43:13 +02:00
# Normalisation is done at the default of each program,
# which is usually -89.0 dB
2019-11-01 18:34:45 +01:00
# TODO The simplifications/fixes I've done makes it consider
# multi-discs albums as multiple albums
2019-10-17 12:44:30 +02:00
import logging
2018-08-04 12:43:13 +02:00
import os
2019-10-17 12:44:30 +02:00
import sys
import typing
2018-08-04 12:43:13 +02:00
import coloredlogs
2018-08-07 16:09:41 +02:00
import r128gain
2018-08-04 12:43:13 +02:00
2021-06-13 11:49:21 +02:00
coloredlogs.install(level="DEBUG", fmt="%(levelname)s %(message)s")
2018-08-04 12:43:13 +02:00
log = logging.getLogger()
2018-08-07 16:09:41 +02:00
# TODO Remove debug
2018-08-04 12:43:13 +02:00
# Constants
2021-06-13 11:49:21 +02:00
FORCE = "-f" in sys.argv
2018-08-07 16:09:41 +02:00
if FORCE:
2021-06-13 11:49:21 +02:00
sys.argv.remove("-f")
2019-10-17 12:44:30 +02:00
if len(sys.argv) >= 2:
SOURCE_FOLDER = os.path.realpath(sys.argv[1])
else:
SOURCE_FOLDER = os.path.join(os.path.expanduser("~"), "Musiques")
2018-08-04 12:43:13 +02:00
2019-10-17 12:44:30 +02:00
def isMusic(f: str) -> bool:
2018-08-07 16:09:41 +02:00
ext = os.path.splitext(f)[1][1:].lower()
return ext in r128gain.AUDIO_EXTENSIONS
2018-08-04 12:43:13 +02:00
2019-10-17 12:44:30 +02:00
2018-08-04 12:43:13 +02:00
# Get album paths
2018-08-07 16:09:41 +02:00
log.info("Listing albums and tracks")
2019-10-17 12:44:30 +02:00
albums = list()
singleFiles = list()
2018-08-04 12:43:13 +02:00
for root, dirs, files in os.walk(SOURCE_FOLDER):
2019-10-17 12:44:30 +02:00
folder_has_music = False
for f in files:
if isMusic(f):
folder_has_music = True
fullPath = os.path.join(root, f)
singleFiles.append(fullPath)
2018-08-04 12:43:13 +02:00
2019-10-17 12:44:30 +02:00
if folder_has_music:
albums.append(root)
# log.info("Processing single files")
# r128gain.process(singleFiles, album_gain=False,
# skip_tagged=not FORCE, report=True)
2018-08-04 12:43:13 +02:00
for album in albums:
albumName = os.path.relpath(album, SOURCE_FOLDER)
log.info("Processing album {}".format(albumName))
2019-10-17 12:44:30 +02:00
musicFiles = list()
for f in os.listdir(album):
if isMusic(f):
fullPath = os.path.join(album, f)
musicFiles.append(fullPath)
2018-08-04 12:43:13 +02:00
2019-10-17 12:44:30 +02:00
if not musicFiles:
2018-08-07 16:09:41 +02:00
continue
2018-08-04 12:43:13 +02:00
2021-06-13 11:49:21 +02:00
r128gain.process(musicFiles, album_gain=True, skip_tagged=not FORCE, report=True)
2019-10-17 12:44:30 +02:00
print("==============================")