Improve medioinfo with invalid videos and add multiple videos support to the /info

This commit is contained in:
Zoe Roux 2024-01-24 01:41:59 +01:00
parent 6ec387e724
commit 7193a599b7
5 changed files with 38 additions and 24 deletions

View File

@ -160,11 +160,11 @@ export const WatchInfoP = z
/**
* The container of the video file of this episode. Common containers are mp4, mkv, avi and so on.
*/
container: z.string(),
container: z.string().nullable(),
/**
* The video track.
*/
video: VideoP,
video: VideoP.nullable(),
/**
* The list of audio tracks.
*/

View File

@ -60,7 +60,7 @@ const MediaInfoTable = ({
[
{
[t("mediainfo.file")]: path?.replace(/^\/video\//, ""),
[t("mediainfo.container")]: container,
[t("mediainfo.container")]: container !== null ? container : t("mediainfo.nocontainer"),
[t("mediainfo.duration")]: duration,
[t("mediainfo.size")]: size,
},
@ -69,7 +69,9 @@ const MediaInfoTable = ({
? `${video.width}x${video.height} (${video.quality}) - ${formatBitrate(
video.bitrate,
)} - ${video.codec}`
: undefined,
: video === null
? t("mediainfo.novideo")
: undefined,
},
audios === undefined
? { [t("mediainfo.audio")]: undefined }

View File

@ -185,6 +185,8 @@
"forced": "Forced",
"default": "Default",
"duration": "Duration",
"size": "Size"
"size": "Size",
"novideo": "No video",
"nocontainer": "Invalid container"
}
}

View File

@ -185,6 +185,8 @@
"forced": "Forcé",
"default": "Par Défaut",
"duration": "Duration",
"size": "Taille"
"size": "Taille",
"novideo": "Pas de video",
"nocontainer": "Conteneur invalide"
}
}

View File

@ -24,9 +24,11 @@ type MediaInfo struct {
/// The length of the media in seconds.
Duration float32 `json:"duration"`
/// The container of the video file of this episode.
Container string `json:"container"`
Container *string `json:"container"`
/// The video codec and infromations.
Video Video `json:"video"`
Video *Video `json:"video"`
/// The list of videos if there are multiples.
Videos []Video `json:"videos"`
/// The list of audio tracks.
Audios []Audio `json:"audios"`
/// The list of subtitles tracks.
@ -200,7 +202,7 @@ func GetInfo(path string) (*MediaInfo, error) {
attachments = make([]string, 0)
}
return &MediaInfo{
ret := MediaInfo{
Sha: sha,
Path: path,
// Remove leading .
@ -208,21 +210,23 @@ func GetInfo(path string) (*MediaInfo, error) {
Size: ParseUint64(mi.Parameter(mediainfo.StreamGeneral, 0, "FileSize")),
// convert ms to seconds
Duration: ParseFloat(mi.Parameter(mediainfo.StreamGeneral, 0, "Duration")) / 1000,
Container: mi.Parameter(mediainfo.StreamGeneral, 0, "Format"),
Video: Video{
// This codec is not in the right format (does not include bitdepth...).
Codec: mi.Parameter(mediainfo.StreamVideo, 0, "Format"),
Language: OrNull(mi.Parameter(mediainfo.StreamVideo, 0, "Language")),
Quality: QualityFromHeight(ParseUint(mi.Parameter(mediainfo.StreamVideo, 0, "Height"))),
Width: ParseUint(mi.Parameter(mediainfo.StreamVideo, 0, "Width")),
Height: ParseUint(mi.Parameter(mediainfo.StreamVideo, 0, "Height")),
Bitrate: ParseUint(
Or(
mi.Parameter(mediainfo.StreamVideo, 0, "BitRate"),
mi.Parameter(mediainfo.StreamVideo, 0, "OverallBitRate"),
Container: OrNull(mi.Parameter(mediainfo.StreamGeneral, 0, "Format")),
Videos: Map(make([]Video, ParseUint(mi.Parameter(mediainfo.StreamVideo, 0, "StreamCount"))), func(_ Video, i int) Video {
return Video{
// This codec is not in the right format (does not include bitdepth...).
Codec: mi.Parameter(mediainfo.StreamVideo, 0, "Format"),
Language: OrNull(mi.Parameter(mediainfo.StreamVideo, 0, "Language")),
Quality: QualityFromHeight(ParseUint(mi.Parameter(mediainfo.StreamVideo, 0, "Height"))),
Width: ParseUint(mi.Parameter(mediainfo.StreamVideo, 0, "Width")),
Height: ParseUint(mi.Parameter(mediainfo.StreamVideo, 0, "Height")),
Bitrate: ParseUint(
Or(
mi.Parameter(mediainfo.StreamVideo, 0, "BitRate"),
mi.Parameter(mediainfo.StreamVideo, 0, "OverallBitRate"),
),
),
),
},
}
}),
Audios: Map(make([]Audio, ParseUint(mi.Parameter(mediainfo.StreamAudio, 0, "StreamCount"))), func(_ Audio, i int) Audio {
return Audio{
Index: uint32(i),
@ -269,5 +273,9 @@ func GetInfo(path string) (*MediaInfo, error) {
func(font string, _ int) string {
return fmt.Sprintf("/video/%s/attachment/%s", sha, font)
}),
}, nil
}
if len(ret.Videos) > 0 {
ret.Video = &ret.Videos[0]
}
return &ret, nil
}