sbraz / pymediainfo

A Python wrapper around the MediaInfo library
https://pymediainfo.readthedocs.org/
Other
316 stars 57 forks source link

[Question] How to display Menu's timestamps #91

Closed codenotworking closed 4 years ago

codenotworking commented 4 years ago

I'm trying to figure out how to display the timestamps in the Menu section of a video file. Here's my working basic code:

from pymediainfo import MediaInfo
media = MediaInfo.parse(r"c:\video.mkv")
for track in media.tracks:
    if track.track_type == "Menu":
        pprint(track.to_data())

This produces the following:

{'00_00_00000': 'en:00:00:00.000',
 '00_10_41683': 'en:00:10:41.683',
 '00_21_07308': 'en:00:21:07.308',
 '00_29_12876': 'en:00:29:12.876',
 '00_40_12744': 'en:00:40:12.744',
 '00_50_50464': 'en:00:50:50.464',
 '01_01_02033': 'en:01:01:02.033',
 '01_10_15420': 'en:01:10:15.420',
 '01_19_59086': 'en:01:19:59.086',
 '01_29_40709': 'en:01:29:40.709',
 '01_40_10338': 'en:01:40:10.338',
 '01_48_35801': 'en:01:48:35.801',
 '01_50_49977': 'en:01:50:49.977',
 'chapters_pos_begin': '94',
 'chapters_pos_end': '107',
 'count': '107',
 'count_of_stream_of_this_kind': '1',
 'kind_of_stream': 'Menu',
 'other_kind_of_stream': ['Menu'],
 'stream_identifier': '0',
 'track_type': 'Menu'}

I'm looking to extract only the timestamps from the produced dictionary, similar to how MediaInfo itself formats it:

0:00:00.000                              : en:00:00:00.000
00:10:41.683                             : en:00:10:41.683
00:21:07.308                             : en:00:21:07.308
00:29:12.876                             : en:00:29:12.876
00:40:12.744                             : en:00:40:12.744
00:50:50.464                             : en:00:50:50.464
01:01:02.033                             : en:01:01:02.033
01:10:15.420                             : en:01:10:15.420
01:19:59.086                             : en:01:19:59.086
01:29:40.709                             : en:01:29:40.709
01:40:10.338                             : en:01:40:10.338
01:48:35.801                             : en:01:48:35.801
01:50:49.977                             : en:01:50:49.977

I found a post on Sourceforge where someone asks the developer of MediaInfo for extracting the timestamps. The developer suggested some psuedocode, but I wouldn't even know where to begin:

Begin=MediaInfo::Get(Stream_Menu, x, "Chapters_Pos_Begin");
End=MediaInfo::Get(Stream_Menu, x, "Chapters_Pos_End");
for (i=Begin; i<End; ++i)
{
    Key=MediaInfo::Get(Stream_Menu, x, i, Info_Name);
    Value=MediaInfo::Get(Stream_Menu, x, i);
}

Any help on how to extract the Menu section's timestamps using python?

codenotworking commented 4 years ago

Never mind. I figured it out. I managed to create a simple for loop, using regex to find the timestamp dictionary keys to return the timestamp dictionary values, while also formatting the timestamp dictionary keys to look like real timestamps:

for key, value in track.to_data().items():
    if re.search(r"\d+_\d+_\d+", key):
        keyFormatted = key.replace("_", ":")
        keyFormatted = f"{keyFormatted[0:-3]}.{keyFormatted[-3:]}"
        print(f"{keyFormatted}\t{value}")

This produced:

00:00:00.000    en:00:00:00.000
00:10:41.683    en:00:10:41.683
00:21:07.308    en:00:21:07.308
00:29:12.876    en:00:29:12.876
00:40:12.744    en:00:40:12.744
00:50:50.464    en:00:50:50.464
01:01:02.033    en:01:01:02.033
01:10:15.420    en:01:10:15.420
01:19:59.086    en:01:19:59.086
01:29:40.709    en:01:29:40.709
01:40:10.338    en:01:40:10.338
01:48:35.801    en:01:48:35.801
01:50:49.977    en:01:50:49.977
jessielw commented 1 year ago

This is a solution that can be used either way.

it renumbers the chapters in the correct format 01, 02, etc. However, it could be adjusted for use anyway.

https://gist.github.com/jlw4049/88b049951479eb4abd6822d6f2167a6f