41 lines
1.4 KiB
JavaScript
41 lines
1.4 KiB
JavaScript
|
|
// Each entry: { codec name for the server, container, MIME to probe }
|
||
|
|
export const CODEC_PROBES = [
|
||
|
|
{ codec: 'mp3', container: 'mp3', mime: 'audio/mpeg' },
|
||
|
|
{ codec: 'aac', container: 'mp4', mime: 'audio/mp4; codecs="mp4a.40.2"' },
|
||
|
|
{ codec: 'opus', container: 'ogg', mime: 'audio/ogg; codecs="opus"' },
|
||
|
|
{ codec: 'vorbis', container: 'ogg', mime: 'audio/ogg; codecs="vorbis"' },
|
||
|
|
{ codec: 'flac', container: 'flac', mime: 'audio/flac' },
|
||
|
|
{ codec: 'wav', container: 'wav', mime: 'audio/wav' },
|
||
|
|
{ codec: 'alac', container: 'mp4', mime: 'audio/mp4; codecs="alac"' },
|
||
|
|
]
|
||
|
|
|
||
|
|
// Default transcoding targets — ordered by preference.
|
||
|
|
// These are attempted if direct play is not possible.
|
||
|
|
const DEFAULT_TRANSCODING_PROFILES = [
|
||
|
|
{ container: 'ogg', audioCodec: 'opus', protocol: 'http' },
|
||
|
|
{ container: 'mp3', audioCodec: 'mp3', protocol: 'http' },
|
||
|
|
]
|
||
|
|
|
||
|
|
export function detectBrowserProfile() {
|
||
|
|
const audio = new Audio()
|
||
|
|
const directPlayProfiles = []
|
||
|
|
|
||
|
|
for (const { codec, container, mime } of CODEC_PROBES) {
|
||
|
|
if (audio.canPlayType(mime) === 'probably') {
|
||
|
|
directPlayProfiles.push({
|
||
|
|
containers: [container],
|
||
|
|
audioCodecs: [codec],
|
||
|
|
protocols: ['http'],
|
||
|
|
})
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return {
|
||
|
|
name: 'NavidromeUI',
|
||
|
|
platform: navigator.userAgent,
|
||
|
|
directPlayProfiles,
|
||
|
|
transcodingProfiles: DEFAULT_TRANSCODING_PROFILES,
|
||
|
|
codecProfiles: [],
|
||
|
|
}
|
||
|
|
}
|