10 Commits
2 changed files with 81 additions and 69 deletions
+67 -59
View File
@@ -6,6 +6,7 @@ from argparse import ArgumentParser
from mutagen.flac import FLAC from mutagen.flac import FLAC
from os import cpu_count, path, walk from os import cpu_count, path, walk
from pathlib import Path from pathlib import Path
from shutil import copy
from subprocess import check_output, Popen from subprocess import check_output, Popen
from sys import exit as s_exit from sys import exit as s_exit
from time import sleep from time import sleep
@@ -28,8 +29,9 @@ def scan_source(_source):
for _album in sorted(_album_dirs): for _album in sorted(_album_dirs):
for _root, _directories, _files in walk(path.expanduser(_album)): for _root, _directories, _files in walk(path.expanduser(_album)):
for _filename in _files: for _filename in _files:
if _filename.endswith('.flac'): if _filename.endswith('.flac') or _filename.endswith('.mp3') or _filename.endswith('.mp4') \
_full_paths.append(f"{_album}/{_filename[:-5]}") or _filename.endswith('.m4a'):
_full_paths.append(f"{_album}/{_filename}")
return _album_dirs, _full_paths return _album_dirs, _full_paths
@@ -44,66 +46,72 @@ def scan_destination_convert():
for _file in source_directories[1]: for _file in source_directories[1]:
_i_total += 1 _i_total += 1
_progress = round((_i_total / _total_files) * 100, 2) _progress = round((_i_total / _total_files) * 100, 2)
if not Path(f"{_file.replace(path.expanduser(source), path.expanduser(destination))}.mp3").is_file() and not \ if not Path(f"{(_file.replace(path.expanduser(source), path.expanduser(destination)))[:-5]}.m4a").is_file()\
Path(f"{_file.replace(path.expanduser(source), path.expanduser(destination))}.m4a").is_file(): and not Path(f"{(_file.replace(path.expanduser(source), path.expanduser(destination)))}").is_file():
_file_s = _file.replace(' ', '\\ ').replace("'", "\\'").replace(')', '\\)').replace('(', '\\(')\ if not _file.endswith('.flac'):
.replace('&', '\\&').replace('`', '\\`').replace('$', '\\$') + '.flac' print(f"[{_file}] Not a FLAC file, copying...")
_file_d = _file.replace(path.expanduser(source), path.expanduser(destination)).replace(' ', '\\ ')\ copy(f"{_file}", f"{_file.replace(path.expanduser(source), path.expanduser(destination))}")
.replace("'", "\\'").replace(')', '\\)').replace('(', '\\(').replace('&', '\\&')\
.replace('`', '\\`').replace('$', '\\$') + '.m4a'
_active_processes = int(check_output('ps -C ffmpeg | wc -l', shell=True)) - 1
if _active_processes >= cpu_count():
while _active_processes >= cpu_count():
print(f"\nThere are already {cpu_count()} processes running...\n")
sleep(1)
_active_processes = int(check_output('ps -C ffmpeg | wc -l', shell=True)) - 1
_i += 1
print(f"\n{_progress}% | \u001b[38;5;0;48;5;15mConverting {_file_s} to {_file_d}...\u001b[0m\n")
# get relevant ReplayGain info
_audio = FLAC(f"{_file}.flac")
if args.albumgain:
if _audio.get('replaygain_album_gain'):
_rggain = float(_audio.get('replaygain_album_gain')[0][:-3])
elif _audio.get('REPLAYGAIN_ALBUM_GAIN'):
_rggain = float(_audio.get('REPLAYGAIN_ALBUM_GAIN')[0][:-3])
else:
_rggain = None
if _audio.get('replaygain_album_peak'):
_rgpeak = float(_audio.get('replaygain_album_peak')[0])
elif _audio.get('REPLAYGAIN_ALBUM_PEAK'):
_rgpeak = float(_audio.get('REPLAYGAIN_ALBUM_PEAK')[0])
else:
_rgpeak = None
else: else:
if _audio.get('replaygain_track_gain'): _file_s = _file.replace(' ', '\\ ').replace("'", "\\'").replace(')', '\\)').replace('(', '\\(') \
_rggain = float(_audio.get('replaygain_track_gain')[0][:-3]) .replace(']', '\\]').replace('[', '\\[').replace('&', '\\&').replace('`', '\\`') \
elif _audio.get('REPLAYGAIN_TRACK_GAIN'): .replace('$', '\\$')
_rggain = float(_audio.get('REPLAYGAIN_TRACK_GAIN')[0][:-3]) _file_d = _file.replace(path.expanduser(source), path.expanduser(destination)).replace(' ', '\\ ') \
.replace("'", "\\'").replace(')', '\\)').replace('(', '\\(').replace(']', '\\]') \
.replace('[', '\\[').replace('&', '\\&').replace('`', '\\`').replace('$', '\\$')[
:-5] + '.m4a'
_active_processes = int(check_output('ps -C ffmpeg | wc -l', shell=True)) - 1
if _active_processes >= cpu_count():
while _active_processes >= cpu_count():
print(f"\nThere are already {cpu_count()} processes running...\n")
sleep(1)
_active_processes = int(check_output('ps -C ffmpeg | wc -l', shell=True)) - 1
_i += 1
print(f"\n{_progress}% | \u001b[38;5;0;48;5;15mConverting {_file_s} to {_file_d}...\u001b[0m\n")
# get relevant ReplayGain info
_audio = FLAC(f"{_file}")
if args.albumgain:
if _audio.get('REPLAYGAIN_ALBUM_GAIN'):
_rggain = float(_audio.get('REPLAYGAIN_ALBUM_GAIN')[0][:-3])
elif _audio.get('replaygain_album_gain'):
_rggain = float(_audio.get('replaygain_album_gain')[0][:-3])
else:
_rggain = None
if _audio.get('REPLAYGAIN_ALBUM_PEAK'):
_rgpeak = float(_audio.get('REPLAYGAIN_ALBUM_PEAK')[0])
elif _audio.get('replaygain_album_peak'):
_rgpeak = float(_audio.get('replaygain_album_peak')[0])
else:
_rgpeak = None
else: else:
_rggain = None if _audio.get('REPLAYGAIN_TRACK_GAIN'):
if _audio.get('replaygain_track_peak'): _rggain = float(_audio.get('REPLAYGAIN_TRACK_GAIN')[0][:-3])
_rgpeak = float(_audio.get('replaygain_track_peak')[0]) elif _audio.get('replaygain_track_gain'):
elif _audio.get('REPLAYGAIN_TRACK_PEAK'): _rggain = float(_audio.get('replaygain_track_gain')[0][:-3])
_rgpeak = float(_audio.get('REPLAYGAIN_TRACK_PEAK')[0]) else:
_rggain = None
if _audio.get('REPLAYGAIN_TRACK_PEAK'):
_rgpeak = float(_audio.get('REPLAYGAIN_TRACK_PEAK')[0])
elif _audio.get('replaygain_track_peak'):
_rgpeak = float(_audio.get('replaygain_track_peak')[0])
else:
_rgpeak = None
# determine ffmpeg arguments
if args.bake and _rggain is not None:
_bake_args, _flac2pod_rg_tags = '-filter:a "volume=' + str(_rggain) + 'dB"', ''
elif _rggain is not None and _rgpeak is not None:
_bake_args, _flac2pod_rg_tags = '', f"-metadata comment='FLAC2PODRG#{_rggain}#{_rgpeak}#'"
else: else:
_rgpeak = None _bake_args, _flac2pod_rg_tags = '', ''
# determine ffmpeg arguments # generate the appropriate ffmpeg command
if args.bake and _rggain is not None: _cmd = f"screen -DmS flac2pod{_i} ffmpeg -i {_file_s} -c:a aac -ab 256k {_bake_args} -map_metadata 0 " \
_bake_args, _flac2pod_rg_tags = '-filter:a "volume=' + str(_rggain) + 'dB"', '' f"{_flac2pod_rg_tags} -aac_pns 0 -movflags +faststart -vn {_file_d} </dev/null"
elif _rggain is not None and _rgpeak is not None: if _rggain is not None:
_bake_args, _flac2pod_rg_tags = '', f"-metadata comment='FLAC2PODRG#{_rggain}#{_rgpeak}#'" print(f"\u001b[38;5;0;48;5;15mGain adjustment: {_rggain}dB\u001b[0m")
else: else:
_bake_args, _flac2pod_rg_tags = '', '' print(f"\u001b[38;5;0;48;5;88mNo ReplayGain data found!\u001b[0m")
# generate the appropriate ffmpeg command if args.stopifnogain:
_cmd = f"screen -DmS flac2pod{_i} ffmpeg -i {_file_s} -c:a aac -ab 256k {_bake_args} -map_metadata 0 " \ s_exit(1)
f"{_flac2pod_rg_tags} -aac_pns 0 -movflags +faststart -vn {_file_d} </dev/null" Popen(_cmd, shell=True)
if _rggain is not None:
print(f"\u001b[38;5;0;48;5;15mGain adjustment: {_rggain}dB\u001b[0m")
else:
print(f"\u001b[38;5;0;48;5;88mNo ReplayGain data found!\u001b[0m")
if args.stopifnogain:
s_exit(1)
Popen(_cmd, shell=True)
_active_processes = int(check_output('ps -C ffmpeg | wc -l', shell=True)) - 1 _active_processes = int(check_output('ps -C ffmpeg | wc -l', shell=True)) - 1
while _active_processes != 0: while _active_processes != 0:
print('\nPlease wait for the remaining conversions to complete...\n') print('\nPlease wait for the remaining conversions to complete...\n')
+14 -10
View File
@@ -2,7 +2,7 @@
from argparse import ArgumentParser from argparse import ArgumentParser
from flac2pod import scan_source from flac2pod import scan_source
from mutagen.flac import FLAC from mutagen.flac import FLAC, FLACNoHeaderError
from os import listdir, system from os import listdir, system
from subprocess import PIPE, Popen, STDOUT from subprocess import PIPE, Popen, STDOUT
from sys import exit as s_exit from sys import exit as s_exit
@@ -26,16 +26,20 @@ if __name__ == "__main__":
gain = 1 gain = 1
for album in sorted(source_directories[0]): for album in sorted(source_directories[0]):
std_album = album.replace(' ', '\\ ').replace("'", "\\'").replace(')', '\\)') \ std_album = album.replace(' ', '\\ ').replace("'", "\\'").replace(')', '\\)').replace('(', '\\(')\
.replace('(', '\\(').replace('&', '\\&').replace('`', '\\`').replace('$', '\\$') .replace(']', '\\]').replace('[', '\\[').replace('&', '\\&').replace('`', '\\`').replace('$', '\\$')
for song in listdir(album): for song in listdir(album):
audio = FLAC(f"{album}/{song}") try:
if audio.get('replaygain_track_gain') or audio.get('REPLAYGAIN_TRACK_GAIN'): audio = FLAC(f"{album}/{song}")
gain = 1 if audio.get('replaygain_track_gain') or audio.get('REPLAYGAIN_TRACK_GAIN'):
else: gain = 1
gain = 0 else:
break gain = 0
if args.force or gain == 0: break
except FLACNoHeaderError:
print(f"[{album}/*] Contains non-FLAC files, skipping album...")
gain = 2
if gain != 2 and (args.force or gain == 0):
print(f"[{album}/*] Adding ReplayGain data...") print(f"[{album}/*] Adding ReplayGain data...")
system(f"metaflac --remove-replay-gain {std_album}/*") system(f"metaflac --remove-replay-gain {std_album}/*")
command = f"metaflac --add-replay-gain {std_album}/*" command = f"metaflac --add-replay-gain {std_album}/*"