У меня есть папка приблизительно с 300 видео. Я хочу отсортировать их по их видео скорости передачи. Я использую команду 'mediainfo' для получения информации о скорости передачи файла. Действительно ли возможно записать сценарий (возможно в Python) для сортировки этих видео с помощью этой команды. Я не знаю много о сценариях, поэтому объясните :).Thanks заранее.
Я быстро сделал сценарий Python, который называет процесс mediainfo для каждого файла в критерии поиска и виды затем критериями сортировки и распечатывает результаты. Измените для своих собственных потребностей.
Это использует чистую строковую сортировку для значений. Вы могли также добавить reverse=True
для отсортированного метода, если требуется или делают то, что Вы хотите с кодом иначе. Этот сценарий требует, чтобы Вы передали споры с 'вокруг них. Аргументом критериев сортировки может быть любое значение, которое mediainfo возвращает из файлов.
import os, sys, glob
import pprint
# Call: python mediainfo_sort.py 'search_criteria' 'sort_criteria'
# Call example: python mediainfo_sort.py '*.avi' 'Bit rate'
files = glob.glob(sys.argv[1])
criteria = sys.argv[2]
# Will have data in format: {'file_path': {'Media Attribute', 'Value'}}
file_datas = {}
# Contruct data by calling mediainfo for all files in
for file_path in files:
mediainfo = os.popen('mediainfo "%s"' % file_path).read()
file_data = {}
infos = mediainfo.splitlines()
for info in infos:
if ':' in info:
info_split = info.split(':')
file_data[info_split[0].strip()] = info_split[1].strip()
file_datas[file_path] = file_data
# function for sorted, uses Media attribute (sort_criteria) value as sorting key
def getKey(item):
return item[1][criteria]
sorted_files = sorted(file_datas.items(), key=getKey)
# In the end just join the keys (filenames) with newline and print
print '\n'.join([x[0] for x in sorted_files])
Можно найти полезным проверить этот поток .
Вот быстрая сводка, как предложено в комментариях:
1) наутилус Python установки и мутаген Python с sudo apt-get install python-nautilus python-mutagen
2) Набор Ваша переменная PYTHONPATH путем следования инструкциям здесь .
3) Создают каталог, названный расширениями Python в ~/.nautilus
4), Загрузка этот сценарий Python, и вставьте его в ~/.nautilus/python-extensions
5) наутилус Перезапуска с $ nautilus -q && nautilus &
, я все еще рекомендую прочитать поток хотя, существует большая полезная информация там.
Как я упомянул в своем комментарии, mediainfo
команда действительно, действительно замедлитесь. Существуют лучшие альтернативы, я думаю.
Однако вот моя версия сценария Python, который должен сделать задание (python3):
#!/usr/bin/env python3
import os
import subprocess
directory = "/path/to/files"
# list the files in the directory
files_tosort = os.listdir(directory)
filedata = []
for file in files_tosort:
# combine filepath and file, take care of the whitespaces
filepath = directory+"/"+file; command = "mediainfo "+"'"+filepath+"'"
# get the file's data
data = subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8")
# extract the bitrate from the output
bitrate = [line[line.find(":")+2:].replace("Kbps", "").replace(" ", "") \
for line in data.splitlines() if "Bit rate" in line][0]
# add the found bitrate+filename to he list
filedata.append((int(bitrate), file))
# sort the list by the bitrate
filedata.sort(key=lambda item: item[0])
# print out
for item in filedata:
print("bitrate: "+str(item[0])+" Kbps\t file: "+item[1])
Это создает вывод, будучи похож:
bitrate: 606 Kbps file: film1.avi
bitrate: 731 Kbps file: film10.avi
bitrate: 790 Kbps file: film4.avi
bitrate: 802 Kbps file: film3.avi
bitrate: 845 Kbps file: film6.avi
bitrate: 919 Kbps file: film7.avi
bitrate: 984 Kbps file: film5.avi
bitrate: 1023 Kbps file: film2.avi
bitrate: 1088 Kbps file: film8.avi
если существует риск нечитабельных файлов, "попытка / кроме" должна быть встроена в сценарий, для передачи в тех случаях.
Как с любым сценарием, скопируйте сценарий в пустой файл, установите путь в файлы в заголовке сценария, сохраните его как sort_video.py
и выполненный это командой:
python3 /path/to/sort_video.py
Используя команду mediainfo
и sort
я могу отсортировать около 100+ видео менее чем за 10 секунд:
mediainfo --Inform="General;%OverallBitRate% | %CompleteName% (%OverallBitRate/String%)\n" * | sort -n
Тем не менее, он сортирует видео по глобальному битрейту видеофайла, а не только по битрейту видеопотока.
1091318 | videoA.mkv (1 091 kb/s)
1505121 | videoB.mkv (1 505 kb/s)
8803070 | videoD.mkv (8 803 kb/s)
11192962 | videoC.mkv (11.2 Mb/s)
Запуск mediainfo
с шаблоном через параметр Inform
просим печатать сначала OverallBitRate
только с числовыми символами .
Просим искать все файлы папки рекурсивно соответствующие *
.
Затем мы передаем весь результат в команду sort
с параметрами -n
, указывающими, что мы сортируем числовые значения.
Поскольку последний символ %OverallBitRate%
не является числовым (пробел не является числовым символом), sort -n
будет учитывать только первые числовые символы.
Это означает, что sort -n
с просмотром цифр перед разделением |
, которое разделяет общую скорость передачи данных и имя файла.
Каждая строка, mediainfo
, похоже, ограничена только одним разделом с использованием параметров --Inform
. Таким образом, если имя файла будет напечатано, вы можете получить только общий битрейт вместо битрейта (что очень близко), поскольку битрейт
находится в разделе видео
, а общий битрейт
, однако в разделе Общие
как имя файла.
Разница в том, что OverallBitRate
также содержит битрейт аудио вдоль видео.
Как видно, это не совсем скрипт python: mediainfo
сама по себе может сделать большую часть работы, делая скрипт python ненужным.