add subtitle and thumbnail metadata to video summary

This commit is contained in:
bmcdonough 2025-09-17 22:05:34 +00:00
parent c18aff4c38
commit 7d66f8bcec
4 changed files with 59 additions and 22 deletions

View File

@ -53,11 +53,12 @@ class StreamItemSerializer(serializers.Serializer):
"""serialize stream item"""
index = serializers.IntegerField()
codec = serializers.CharField()
bitrate = serializers.IntegerField()
type = serializers.ChoiceField(choices=["video", "audio"])
codec = serializers.CharField(required=False, allow_null=True)
bitrate = serializers.IntegerField(required=False)
type = serializers.ChoiceField(choices=["video", "audio", "subtitle"])
width = serializers.IntegerField(required=False)
height = serializers.IntegerField(required=False)
language = serializers.CharField(required=False)
class SubtitleItemSerializer(serializers.Serializer):

View File

@ -45,25 +45,37 @@ class MediaStreamExtractor:
self._extract_video_metadata(stream)
elif codec_type == "audio":
self._extract_audio_metadata(stream)
elif codec_type == "subtitle":
self._extract_subtitle_metadata(stream)
else:
return
def _extract_video_metadata(self, stream):
"""parse video metadata"""
if "bit_rate" not in stream:
# is probably thumbnail
return
self.metadata.append(
{
"type": "video",
"index": stream["index"],
"codec": stream["codec_name"],
"width": stream["width"],
"height": stream["height"],
"bitrate": int(stream["bit_rate"]),
}
)
if stream["disposition"]["attached_pic"] == 1:
self.metadata.append(
{
"type": "thumbnail",
"index": stream["index"],
"codec": stream["codec_name"],
"width": stream["width"],
"height": stream["height"],
}
)
else:
self.metadata.append(
{
"type": "video",
"index": stream["index"],
"codec": stream["codec_name"],
"width": stream["width"],
"height": stream["height"],
"bitrate": int(stream.get("bit_rate", 0)),
"language": stream.get("tags", {}).get(
"language", "unknown"
),
}
)
def _extract_audio_metadata(self, stream):
"""extract audio metadata"""
@ -73,6 +85,19 @@ class MediaStreamExtractor:
"index": stream["index"],
"codec": stream.get("codec_name", "undefined"),
"bitrate": int(stream.get("bit_rate", 0)),
"language": stream.get("tags", {}).get("language", "unknown"),
}
)
def _extract_subtitle_metadata(self, stream):
"""extract subtitle metadata"""
self.metadata.append(
{
"type": "subtitle",
"index": stream["index"],
"codec": stream.get("codec_name", "text"),
"bitrate": int(stream.get("bit_rate", 0)),
"language": stream.get("tags", {}).get("language", "unknown"),
}
)

View File

@ -43,10 +43,11 @@ export type StatsType = {
export type StreamType = {
type: string;
index: number;
codec: string;
codec?: string;
width?: number;
height?: number;
bitrate: number;
bitrate?: number;
language?: string;
};
export type Subtitles = {

View File

@ -467,13 +467,23 @@ const Video = () => {
video.streams.map(stream => {
return (
<p key={stream.index}>
{capitalizeFirstLetter(stream.type)}: {stream.codec}{' '}
{humanFileSize(stream.bitrate, useSiUnits)}/s
{capitalizeFirstLetter(stream.type)}: {stream.codec}
{stream.bitrate && (
<>
<span className="space-carrot">|</span>{' '}
{`${humanFileSize(stream.bitrate, useSiUnits)}/s`}
</>
)}
{stream.width && (
<>
<span className="space-carrot">|</span> {stream.width}x{stream.height}
</>
)}{' '}
)}
{stream.language && (
<>
<span className="space-carrot">|</span> {stream.language}
</>
)}
</p>
);
})}