fallback to ffmpeg for tag extraction when mutagen fails
This commit is contained in:
parent
e78e69d35a
commit
0dcc686b19
|
@ -1,10 +1,13 @@
|
||||||
from ..types import File, Tags
|
from ..types import File, Tags
|
||||||
|
from ..meta import ffprobe_path
|
||||||
|
|
||||||
|
from subprocess import run as run_command
|
||||||
|
from json import loads as load_json_string
|
||||||
|
|
||||||
from mutagen.mp3 import EasyMP3 as MP3
|
from mutagen.mp3 import EasyMP3 as MP3
|
||||||
from mutagen.flac import FLAC
|
from mutagen.flac import FLAC
|
||||||
|
|
||||||
|
def load_tag_information_mutagen(file: File) -> Tags:
|
||||||
def load_tag_information(file: File) -> Tags:
|
|
||||||
path = file.join_path_to()
|
path = file.join_path_to()
|
||||||
tags = Tags()
|
tags = Tags()
|
||||||
if file.extension == "mp3":
|
if file.extension == "mp3":
|
||||||
|
@ -16,6 +19,60 @@ def load_tag_information(file: File) -> Tags:
|
||||||
tags.title = flac["title"][0]
|
tags.title = flac["title"][0]
|
||||||
tags.artist = flac["artist"][0]
|
tags.artist = flac["artist"][0]
|
||||||
else:
|
else:
|
||||||
print("Invalid / Unsupported Container")
|
raise Exception("Could Not Load Tags Using Mutagen")
|
||||||
exit()
|
|
||||||
return tags
|
return tags
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def load_tag_information_ffmpeg(file: File) -> Tags:
|
||||||
|
path = file.join_path_to()
|
||||||
|
tags = Tags()
|
||||||
|
|
||||||
|
command_args = [
|
||||||
|
ffprobe_path,
|
||||||
|
"-v", "quiet",
|
||||||
|
"-print_format", "json",
|
||||||
|
"-show_format",
|
||||||
|
path
|
||||||
|
]
|
||||||
|
|
||||||
|
ffprobe_output = run_command(command_args, capture_output=True).stdout
|
||||||
|
|
||||||
|
data = load_json_string(ffprobe_output)
|
||||||
|
file_tags = data["format"]["tags"]
|
||||||
|
|
||||||
|
title = None
|
||||||
|
artist = None
|
||||||
|
|
||||||
|
try:
|
||||||
|
if "title" in file_tags.keys():
|
||||||
|
title = file_tags["title"]
|
||||||
|
elif "TITLE" in file_tags.keys():
|
||||||
|
title = file_tags["TITLE"]
|
||||||
|
|
||||||
|
if "artist" in file_tags.keys():
|
||||||
|
artist = file_tags["artist"]
|
||||||
|
elif "ARTIST" in file_tags.keys():
|
||||||
|
artist = file_tags["ARTIST"]
|
||||||
|
except Exception as e:
|
||||||
|
print(data["format"]["tags"], file, e)
|
||||||
|
exit()
|
||||||
|
|
||||||
|
if title is None or artist is None:
|
||||||
|
raise Exception("Could Not Load Tags Using FFprobe")
|
||||||
|
|
||||||
|
tags.title = title
|
||||||
|
tags.artist = artist
|
||||||
|
return tags
|
||||||
|
|
||||||
|
def load_tag_information(file: File) -> Tags:
|
||||||
|
try:
|
||||||
|
tags = load_tag_information_mutagen(file)
|
||||||
|
return tags
|
||||||
|
except:
|
||||||
|
try:
|
||||||
|
tags = load_tag_information_ffmpeg(file)
|
||||||
|
return tags
|
||||||
|
except:
|
||||||
|
print(f"Could not get tags for file {file.filename}. Exiting.")
|
||||||
|
exit()
|
||||||
|
|
|
@ -2,6 +2,6 @@
|
||||||
let
|
let
|
||||||
fold-to-ascii = (py: py.callPackage ./nix-extra-deps/fold-to-ascii.nix { });
|
fold-to-ascii = (py: py.callPackage ./nix-extra-deps/fold-to-ascii.nix { });
|
||||||
my_python = pkgs.python39.withPackages
|
my_python = pkgs.python39.withPackages
|
||||||
(py: with py; [ py.mutagen (fold-to-ascii py) py.autopep8 py.pyyaml ]);
|
(py: with py; [ (fold-to-ascii py) py.mutagen py.autopep8 py.pyyaml ]);
|
||||||
|
|
||||||
in pkgs.mkShell { packages = with pkgs; [ my_python ffmpeg fd r128gain ]; }
|
in pkgs.mkShell { packages = with pkgs; [ my_python ffmpeg fd r128gain ]; }
|
||||||
|
|
Loading…
Reference in a new issue