diff --git a/front/packages/models/src/resources/watch-info.ts b/front/packages/models/src/resources/watch-info.ts index f6a746cf..6c89cc75 100644 --- a/front/packages/models/src/resources/watch-info.ts +++ b/front/packages/models/src/resources/watch-info.ts @@ -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. */ diff --git a/front/packages/ui/src/components/media-info.tsx b/front/packages/ui/src/components/media-info.tsx index 76ebfd03..22c8db9e 100644 --- a/front/packages/ui/src/components/media-info.tsx +++ b/front/packages/ui/src/components/media-info.tsx @@ -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 } diff --git a/front/translations/en.json b/front/translations/en.json index 0d8e50a6..a2fb01f2 100644 --- a/front/translations/en.json +++ b/front/translations/en.json @@ -185,6 +185,8 @@ "forced": "Forced", "default": "Default", "duration": "Duration", - "size": "Size" + "size": "Size", + "novideo": "No video", + "nocontainer": "Invalid container" } } diff --git a/front/translations/fr.json b/front/translations/fr.json index 7843b099..fd8aa6f1 100644 --- a/front/translations/fr.json +++ b/front/translations/fr.json @@ -185,6 +185,8 @@ "forced": "Forcé", "default": "Par Défaut", "duration": "Duration", - "size": "Taille" + "size": "Taille", + "novideo": "Pas de video", + "nocontainer": "Conteneur invalide" } } diff --git a/transcoder/src/info.go b/transcoder/src/info.go index f1a60409..c19b0fbe 100644 --- a/transcoder/src/info.go +++ b/transcoder/src/info.go @@ -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 }