Coverage for mymeco/files/video.py: 75%
18 statements
« prev ^ index » next coverage.py v7.4.1, created at 2024-12-11 22:07 +0000
« prev ^ index » next coverage.py v7.4.1, created at 2024-12-11 22:07 +0000
1"""Video file module."""
2import logging
3import json
4import ffmpeg
7class Video:
8 """
9 Video class.
11 Aim to read a video file to extract technical information such as video
12 codec, resolution, etc…
13 """
15 _log: logging.Logger = logging.getLogger(__file__)
17 def __init__(self, filename):
18 self.filename = filename
19 self.probe = ffmpeg.probe(self.filename)
20 self._log.debug(json.dumps(self.probe, indent=4))
22 @property
23 def audio(self):
24 """Retrieve list of audio stream in file."""
25 return [
26 {
27 'codec': audio.get('codec_long_name', 'Unknown'),
28 'language': audio.get(
29 'tags', {'language': 'und'}
30 ).get('language', 'und'),
31 'channels': audio.get('channels', 0)
32 }
33 for audio in self.probe['streams']
34 if audio.get('codec_type', '') == 'audio'
35 ]
37 @property
38 def subtitle(self):
39 """Retrieve list of subtitles."""
40 return [
41 {
42 'language': sub.get(
43 'tags', {'language': 'und'}
44 ).get('language', 'und')
45 }
46 for sub in self.probe['streams']
47 if sub.get('codec_type', '') == 'subtitle'
48 ]
50 @property
51 def video(self):
52 """Retrieve list of video stream."""
53 return [
54 {
55 'codec': vid.get('codec_long_name', 'Unknown'),
56 'aspect': vid.get('display_aspect_ratio', '1:1'),
57 'width': vid.get('coded_width', vid.get('width', 0)),
58 'height': vid.get('coded_height', vid.get('height', 0)),
59 'durationinseconds': float(self.probe['format']['duration']),
60 }
61 for vid in self.probe['streams']
62 if vid.get('codec_type', '') == 'video'
63 ]