def getMimeTye(self, path=None): path = self.__path if None == path else path if os.path.exists(path) and MediaInfo.can_parse(path): pass # MediaInfo.parse(filename, library_file, cover_data, encoding_errors, parse_speed, text, full, legacy_stream_display)
def functions(cls): return { 'track': { 'func': cls.track, 'help': r'MediaInfo (https://mediaarea.net/en/MediaInfo) track data', 'args': ['track id or type', 'property'], 'example': 'track["Video","format"]', 'source': 'demo.avi', 'output': 'MPEG-4 Visual' }, } if MediaInfo.can_parse() else {}
def create(cls, os_family=None, suggested_path=None): """Create the executor instance.""" for candidate in define_candidate(cls.locations, cls.names, os_family, suggested_path): if MediaInfo.can_parse(candidate): lib = MediaInfo._get_library(candidate) lib.MediaInfo_Option.argtypes = [ c_void_p, c_wchar_p, c_wchar_p ] lib.MediaInfo_Option.restype = c_wchar_p version = MediaInfoExecutor._get_version( lib.MediaInfo_Option(None, "Info_Version", "")) logger.debug('MediaInfo library detected: %s (v%s)', candidate, '.'.join(map(str, version))) return MediaInfoCTypesExecutor(candidate, version)
def media_length(media_path): """ Uses Media Info to obtain the media length :param media_path: The file path to be checked.. """ if MediaInfo.can_parse(): media_data = MediaInfo.parse(media_path) else: xml = check_output([ 'mediainfo', '-f', '--Output=XML', '--Inform=OLDXML', media_path ]) if not xml.startswith(b'<?xml'): xml = check_output( ['mediainfo', '-f', '--Output=XML', media_path]) media_data = MediaInfo(xml.decode("utf-8")) # duration returns in milli seconds return media_data.tracks[0].duration
def test_can_parse_true(self): self.assertTrue(MediaInfo.can_parse())
if ssh_enabled: logger.info("SSH and SFTP sessions created successfully") else: logger.warning("Disabling remote recoding due to SSH error") count = 0.0 for path in paths: count += 1.0 cur_file = normalize_path(path) ffmpeg_cmd = ffmpeg_base_cmd + "\"" + cur_file + "\"" video_cmd = ' -c:v copy' audio_cmd = ' -c:a copy' need_remote = False redo_audio = False media_info = MediaInfo.parse(normalize_path(path)) if MediaInfo.can_parse(): for track in media_info.tracks: if track.track_type == 'Video': if not track.bit_rate: video_cmd = ffmpeg_video_encode need_remote = True elif not track.format.startswith( VIDEO_CODEC ) or track.bit_rate > MAX_BITRATE or track.height > MAX_HEIGHT or track.width > MAX_WIDTH: video_cmd = ffmpeg_video_encode need_remote = True elif track.format.startswith( VIDEO_CODEC ) and not track.format_profile.startswith(VIDEO_PROFILE): video_cmd = ffmpeg_video_encode need_remote = True
def is_available(): """Check if the parser is callable """ return MediaInfo.can_parse()
def main(): # Получаем исходную и целевую дирректории. dirslist = getDirs(sys.argv, DEFAULT_OUTPUT) # Показываем куда и откуда будет импорт. print('Источник импорта: ', dirslist[0]) print('Дирректория назначения: ', dirslist[1]) # Просим подтверждение перед началом работы. #if not confirm(): # sys.exit("Задание отменено") # Задаем счетчики "плохих" и "хороших" операций. fTotal = okOp = badOp = 0 badFiles = [] # Собственно, импорт. for root, dirs, files in os.walk(dirslist[0]): i = 0 for name in files: i += 1 fTotal += 1 filePath = os.path.join(root, name) # Отображаем текущий процесс и прогресс выполнения. fileExtension = os.path.splitext(name)[1] print('Обработка файла {} из {} (дир. -= {} =-)' .format(i, len(files), os.path.basename(root).upper())) if fileExtension.upper() == '.MP4' and MediaInfo.can_parse(): media_info = MediaInfo.parse(filePath) # wrongDate = datetime.strptime(media_info.tracks[0].encoded_date, "UTC %Y-%m-%d %H:%M:%S").year == 1970 # encodedDate = media_info.tracks[0].file_creation_date__local.replace('-', ':') if wrongDate else media_info.tracks[0].encoded_date.replace('-', ':') encodedDate = media_info.tracks[0].encoded_date.replace('-', ':') exifDateTime = encodedDate.replace('UTC ', '') elif fileExtension == '.JPG': with open(filePath, 'rb') as f: tags = exifread.process_file(f, details=False) exifDateTime = tags.get('EXIF DateTimeOriginal') # При отсутствии у фото EXIF-данных - файл пропускаем, # занося его в список "плохих" файлов. if not exifDateTime: print('Отсутствуют EXIF данные. Файл пропущен!!!', name) badOp += 1 badFiles.append(filePath) continue else: print('Неизвестный файл', name) badOp += 1 badFiles.append(filePath) continue exifDate, exifTime = str(exifDateTime).split(' ') year, month, day = exifDate.split(':') hour, minute, sec = exifTime.split(':') # Задаем название импортированного файла. newFileName = '{}-{}-{}'.format(year + month + day, hour, minute) path = dirslist[1] if not os.path.exists(path): print('Создаем новую папку') os.makedirs(path, exist_ok=True) newPath = os.path.join(path, newFileName) # Найдем подходящие имя для файла tmpPath = newPath fileindex = 1 while os.path.exists(tmpPath + fileExtension): tmpPath = newPath + '_{}'.format(fileindex) fileindex += 1 newPath = tmpPath + fileExtension try: shutil.copy2(filePath, newPath) print('OK') okOp += 1 except (IOError, Exception) as e: print('BAD ' + e) badOp += 1 # По завершении импорта выводим статистику сделанного. print('Обработано файлов всего:', fTotal) print('Успешных операций:', okOp) print('Завершенных с ошибками:', badOp) # И имена "плохих" файлов, если таковые есть. if len(badFiles): print('Необработанные файлы: ') for bf in badFiles: print(bf)