Skip to content

Commit

Permalink
Merge pull request #666 from deuteronomy-works/master
Browse files Browse the repository at this point in the history
Merged
  • Loading branch information
amoh-godwin authored Oct 6, 2023
2 parents 46ae3ab + 2b5a4a7 commit e06d66e
Show file tree
Hide file tree
Showing 3 changed files with 115 additions and 46 deletions.
12 changes: 7 additions & 5 deletions local_probe_t_est.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import os
import pprint
from pyffmpeg import FFprobe


Expand All @@ -8,15 +9,16 @@
#test_file = "G:\Entertainment\Movies\Interstellar (2014)\Interstellar.2014.720p.BluRay.x264.YIFY.mp4"
flv_file = os.path.join(test_folder, 'sample_960x400_ocean_with_audio.flv')

f = FFprobe('flv_file')
f = FFprobe(flv_file)
# ret = f.get_album_art('cover.png')


print(f.duration)
pprint.pprint(f.duration)
for x in f.metadata:
print(x, '\n')

print(f.metadata)
print(f.metadata[0])
pprint.pprint(f.metadata)
pprint.pprint(f.metadata[0])
# print(f.metadata[0][0])
print(f.metadata[0][0]['codec'])
print("is codec flv1?")
pprint.pprint(f.metadata[0]['codec'] == 'flv1')
72 changes: 31 additions & 41 deletions pyffmpeg/pseudo_ffprobe.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import random
import os
import logging
from collections import defaultdict
# from base64 import b64decode

from .misc import Paths, SHELL, ModifiedList
Expand Down Expand Up @@ -116,19 +117,18 @@ def _extract_all(self, stdout):
print("Multiple input files found.\
However only one will be probed")
all_streams = all_streams[0]

# individual streams
streams = all_streams.split('Stream')
for x in range(len(streams)):
self.metadata[-1] = self._parse_input_meta(streams[0])

if x == 0:
if streams[x]:
self.metadata[-1] = self._parse_input_meta(streams[x])
else:
if streams[x]:
self.metadata[0].append(self._parse_meta(streams[x]))
tags = defaultdict(list)
for x in range(1, len(streams)):
if streams[x]:
tags.update(self._parse_meta(streams[x]))

if len(tags) > 0:
self.metadata[0] = tags

# parse other metadata
self._parse_other_meta()

# then handle stream 0:0 so
Expand Down Expand Up @@ -165,23 +165,8 @@ def get_album_art(self, out_file=None):

def _parse_meta(self, stream):
self.logger.info('Inside _parse_meta')
tags = {}
metadata = self._strip_meta(stream)
# Previous key will be overriden
prev_key = ''

for x in range(len(metadata)):
line = metadata[x]
data = line.split(":", 1)
key = data[0].strip()
value = data[1].strip()
# this might be a continuation
if key == '':
tags[prev_key] += "\\r\\n" + data[1].strip()
else:
tags[key] = value
prev_key = key

tags = self._generate_tags(metadata)
return tags

def _parse_header(self, line):
Expand All @@ -202,23 +187,8 @@ def _parse_header(self, line):

def _parse_input_meta(self, stream):
self.logger.info('Inside _parse_input_meta')
tags = {}
metadata = self._strip_input_meta(stream)

# previous key will be overriden
prev_key = ''
for x in range(len(metadata)):
line = metadata[x]
data = line.split(":", 1)
key = data[0].strip()
value = data[1].strip()
# this might be a continuation
if key == '':
tags[prev_key] += "\\r\\n" + data[1].strip()
else:
tags[key] = value
prev_key = key

tags = self._generate_tags(metadata)
return tags

def _parse_other_meta(self):
Expand Down Expand Up @@ -320,3 +290,23 @@ def _strip_input_meta(self, stdout):
meta.append(line)

return meta

def _generate_tags(self, metadata):
prev_key = ''
tags = defaultdict(list)

for x in range(len(metadata)):
line = metadata[x]
data = line.split(":", 1)
key = data[0].strip()
value = data[1].strip()
# this might be a continuation, if not we add it to orphaned key list
if key == '':
if prev_key == '':
tags['unpaired_values'].append(value)
else:
tags[prev_key].append("\\r\\n" + data[1].strip())
else:
tags[key] = value
prev_key = key
return tags
77 changes: 77 additions & 0 deletions test_pseudo_ffprobe.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import pytest
import os
import requests
from collections import defaultdict
from pyffmpeg import FFprobe

# test speed to make sure no convertion took place
Expand Down Expand Up @@ -31,3 +32,79 @@ def test_probe(file_name, duration):

def test_album_art():
pass

@pytest.mark.parametrize(
'file_name',
[
("countdown.mp4"),
]
)
def test_generate_tags(file_name):
metadata_one = [
' major_brand : mp42',
' minor_version : 0',
' compatible_brands: isommp42',
' creation_time : 2016-07-05T17:50:46.000000Z',
' Duration: 00:00:04.37',
'start: 0.000000',
'bitrate: 322 kb/s'
]
metadata_two = [
'codec: h264',
'data_rate: 223 kb/s',
'dimensions: 640x360',
'DAR: 16:9',
'SAR: 1:1',
'fps: 29.97',
'tbn: 30k',
'tbr: 29.97',
' handler_name : VideoHandler',
' vendor_id : [0][0][0][0]',
'codec: aac',
'bitrate: 96 kb/s',
'channels: stereo',
'sample_rate: 44100 Hz',
' creation_time : 2016-07-05T17:50:46.000000Z',
' handler_name : IsoMedia File Produced by Google, 5-11-2011',
' vendor_id : [0][0][0][0]',
'Parsing a group of options: output url /dev/null.',
'Opening an output file: /dev/null.',
'[h264 @ 0x7f916e046480] nal_unit_type: 7(SPS), nal_ref_idc: 3',
'[h264 @ 0x7f916e046480] nal_unit_type: 8(PPS), nal_ref_idc: 3'
]
tags_one = defaultdict(list,
{
'Duration': '00:00:04.37',
'bitrate': '322 kb/s',
'compatible_brands': 'isommp42',
'creation_time': '2016-07-05T17:50:46.000000Z',
'major_brand': 'mp42',
'minor_version': '0',
'start': '0.000000'
})
tags_two = defaultdict(list,
{
'DAR': '16:9',
'Opening an output file': '/dev/null.',
'Parsing a group of options': 'output url /dev/null.',
'SAR': '1:1',
'[h264 @ 0x7f916e046480] nal_unit_type': '8(PPS), nal_ref_idc: '
'3',
'bitrate': '96 kb/s',
'channels': 'stereo',
'codec': 'aac',
'creation_time': '2016-07-05T17:50:46.000000Z',
'data_rate': '223 kb/s',
'dimensions': '640x360',
'fps': '29.97',
'handler_name': 'IsoMedia File Produced by Google, 5-11-2011',
'sample_rate': '44100 Hz',
'tbn': '30k',
'tbr': '29.97',
'vendor_id': '[0][0][0][0]'
})
test_file = os.path.join(TEST_FOLDER, file_name)
f = FFprobe(test_file)

assert tags_one == f._generate_tags(metadata_one)
assert tags_two == f._generate_tags(metadata_two)

0 comments on commit e06d66e

Please sign in to comment.