Я пытаюсь создать простую функцию для обхода FFProbe, и большую часть данных можно получить правильно.
Проблема заключается в том, что при фактической печати строк в командной строке с использованием командной строки Windows и Git Bash для Windows вывод выглядит искаженным и неупорядоченным.
В некоторых песнях (в частности, в файле Imagine Dragons - Hit Parade_ Best of the Dance Music Charts\80 - Beazz - Lime (Extended Mix).flac
) отсутствуют метаданные. Я не знаю почему, но словарь, который возвращает функция ниже, пуст.
FFProbe выводит свои результаты в stderr
, которые могут быть переданы в subprocess.PIPE
, декодированы и проанализированы. Я выбрал регулярное выражение для бита синтаксического анализа.
Это уменьшенная версия моего кода ниже, для вывода взгляните на Суть Github.
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
import os
from glob import glob
from re import findall, MULTILINE
from subprocess import Popen, PIPE
def glob_from(path, ext):
"""Return glob from a directory."""
working_dir = os.getcwd()
os.chdir(path)
file_paths = glob("**/*." + ext)
os.chdir(working_dir)
return file_paths
def media_metadata(file_path):
"""Use FFPROBE to get information about a media file."""
stderr = Popen(("ffprobe", file_path), shell=True, stderr=PIPE).communicate()[1].decode()
metadata = {}
for match in findall(r"(\w+)\s+:\s(.+)$", stderr, MULTILINE):
metadata[match[0].lower()] = match[1]
return metadata
if __name__ == "__main__":
base = "C:/Users/spike/Music/Deezloader"
for file in glob_from(base, "flac"):
meta = media_metadata(os.path.join(base, file))
title_length = meta.get("title", file) + " - " + meta.get("length", "000")
print(title_length)
Я не понимаю, почему вывод (строки могут быть эффективно извлечены из шаблона регулярного выражения, однако вывод странно отформатирован при печати) выглядит неупорядоченным только при выводе на консоль с помощью функции print
python. Неважно, как я строю строку для печати, конкатенации, аргументов с разделителями-запятыми и так далее.
Я заканчиваю тем, что сначала указываю длину песни, а затем название песни, но без пробела между ними. Черта почему-то свисает с конца. Основываясь на операторе печати в предыдущем коде, формат должен быть Title - 000
({title} - {length}
), но вывод больше похож на 000Title -
. Почему?