mirror of
https://github.com/streamyfin/streamyfin.git
synced 2026-06-02 20:18:29 +01:00
107 lines
2.9 KiB
TypeScript
107 lines
2.9 KiB
TypeScript
import type {
|
|
DeviceProfile,
|
|
ProfileCondition,
|
|
} from "@jellyfin/sdk/lib/generated-client/models";
|
|
import type { ChromecastCapabilities } from "./capabilities";
|
|
|
|
/**
|
|
* Build a Jellyfin `DeviceProfile` for a Chromecast from its detected capabilities.
|
|
* Replaces the former static `chromecast.ts` / `chromecasth265.ts` profiles.
|
|
*/
|
|
export const buildChromecastProfile = (
|
|
caps: ChromecastCapabilities,
|
|
): DeviceProfile => {
|
|
const videoCodecs = caps.hevc ? "hevc,h264" : "h264";
|
|
const maxHeight = caps.maxResolution === 2160 ? "2160" : "1080";
|
|
const maxChannels = String(caps.maxAudioChannels);
|
|
|
|
const videoConditions: ProfileCondition[] = [
|
|
{
|
|
Condition: "LessThanEqual",
|
|
Property: "Height",
|
|
Value: maxHeight,
|
|
IsRequired: false,
|
|
},
|
|
];
|
|
// When HEVC is allowed but 10-bit is not, force the server to transcode
|
|
// 10-bit sources down to 8-bit.
|
|
if (caps.hevc && !caps.hevc10bit) {
|
|
videoConditions.push({
|
|
Condition: "LessThanEqual",
|
|
Property: "VideoBitDepth",
|
|
Value: "8",
|
|
IsRequired: false,
|
|
});
|
|
}
|
|
|
|
return {
|
|
Name: "Chromecast Video Profile",
|
|
MaxStreamingBitrate: caps.maxVideoBitrate,
|
|
MaxStaticBitrate: caps.maxVideoBitrate,
|
|
MusicStreamingTranscodingBitrate: 384000,
|
|
CodecProfiles: [
|
|
{
|
|
Type: "Video",
|
|
Codec: videoCodecs,
|
|
Conditions: videoConditions,
|
|
},
|
|
{
|
|
Type: "Audio",
|
|
Codec: "aac,mp3,flac,opus,vorbis",
|
|
// Force transcode of multichannel audio the receiver cannot output.
|
|
Conditions: [
|
|
{
|
|
Condition: "LessThanEqual",
|
|
Property: "AudioChannels",
|
|
Value: maxChannels,
|
|
IsRequired: false,
|
|
},
|
|
],
|
|
},
|
|
],
|
|
ContainerProfiles: [],
|
|
DirectPlayProfiles: [
|
|
{
|
|
Container: caps.hevc ? "mp4,mkv" : "mp4",
|
|
Type: "Video",
|
|
VideoCodec: videoCodecs,
|
|
AudioCodec: "aac,mp3,opus,vorbis",
|
|
},
|
|
{ Container: "mp3", Type: "Audio" },
|
|
{ Container: "aac", Type: "Audio" },
|
|
{ Container: "flac", Type: "Audio" },
|
|
{ Container: "wav", Type: "Audio" },
|
|
],
|
|
TranscodingProfiles: [
|
|
{
|
|
Container: "ts",
|
|
Type: "Video",
|
|
VideoCodec: videoCodecs,
|
|
AudioCodec: "aac,mp3",
|
|
Protocol: "hls",
|
|
Context: "Streaming",
|
|
MaxAudioChannels: maxChannels,
|
|
MinSegments: 2,
|
|
BreakOnNonKeyFrames: true,
|
|
},
|
|
{
|
|
Container: "mp3",
|
|
Type: "Audio",
|
|
AudioCodec: "mp3",
|
|
Protocol: "http",
|
|
Context: "Streaming",
|
|
MaxAudioChannels: maxChannels,
|
|
},
|
|
{
|
|
Container: "aac",
|
|
Type: "Audio",
|
|
AudioCodec: "aac",
|
|
Protocol: "http",
|
|
Context: "Streaming",
|
|
MaxAudioChannels: maxChannels,
|
|
},
|
|
],
|
|
SubtitleProfiles: [{ Format: "vtt", Method: "Encode" }],
|
|
};
|
|
};
|