From 169077eafee5e990aaa55d94647e3e72efe7b427 Mon Sep 17 00:00:00 2001 From: Violet Caulfield <42452695+anultravioletaurora@users.noreply.github.com> Date: Sat, 6 Sep 2025 21:50:56 -0500 Subject: [PATCH] Bugfix/aac+alac on android (#512) * set default device profiles, enable AAC for Android initialize device profile properly in the device profiles store --- .../Settings/components/playback-tab.tsx | 7 +- src/enums/audio-quality.ts | 8 +++ src/stores/device-profile.ts | 6 +- src/stores/settings/player.ts | 8 +-- src/stores/settings/usage.ts | 2 +- src/utils/device-profiles.ts | 72 +++++++++---------- src/utils/mappings.ts | 4 +- 7 files changed, 53 insertions(+), 54 deletions(-) diff --git a/src/components/Settings/components/playback-tab.tsx b/src/components/Settings/components/playback-tab.tsx index f9b6403c..00c8d3d3 100644 --- a/src/components/Settings/components/playback-tab.tsx +++ b/src/components/Settings/components/playback-tab.tsx @@ -1,12 +1,9 @@ import SettingsListGroup from './settings-list-group' import { RadioGroup } from 'tamagui' import { RadioGroupItemWithLabel } from '../../Global/helpers/radio-group-item-with-label' -import { - StreamingQuality, - useDisplayAudioQualityBadge, - useStreamingQuality, -} from '../../../stores/settings/player' +import { useDisplayAudioQualityBadge, useStreamingQuality } from '../../../stores/settings/player' import { SwitchWithLabel } from '../../Global/helpers/switch-with-label' +import StreamingQuality from '../../../enums/audio-quality' export default function PlaybackTab(): React.JSX.Element { const [streamingQuality, setStreamingQuality] = useStreamingQuality() diff --git a/src/enums/audio-quality.ts b/src/enums/audio-quality.ts index e69de29b..273fc900 100644 --- a/src/enums/audio-quality.ts +++ b/src/enums/audio-quality.ts @@ -0,0 +1,8 @@ +enum StreamingQuality { + Original = 'original', // Direct Play + High = 'high', // 320 + Medium = 'medium', // 256 + Low = 'low', // 128 +} + +export default StreamingQuality diff --git a/src/stores/device-profile.ts b/src/stores/device-profile.ts index ea2c9ff4..d68b31a9 100644 --- a/src/stores/device-profile.ts +++ b/src/stores/device-profile.ts @@ -2,6 +2,8 @@ import { DeviceProfile } from '@jellyfin/sdk/lib/generated-client' import { create } from 'zustand' import { createJSONStorage, devtools, persist } from 'zustand/middleware' import { stateStorage } from '../constants/storage' +import { getDeviceProfile } from '../utils/device-profiles' +import StreamingQuality from '../enums/audio-quality' type DeviceProfileStore = { deviceProfile: DeviceProfile @@ -12,7 +14,7 @@ export const useStreamingDeviceProfileStore = create()( devtools( persist( (set) => ({ - deviceProfile: {}, + deviceProfile: getDeviceProfile(StreamingQuality.Original, 'stream'), setDeviceProfile: (data: DeviceProfile) => set({ deviceProfile: data }), }), { @@ -33,7 +35,7 @@ export const useDownloadingDeviceProfileStore = create()( devtools( persist( (set) => ({ - deviceProfile: {}, + deviceProfile: getDeviceProfile(StreamingQuality.Original, 'download'), setDeviceProfile: (data: DeviceProfile) => set({ deviceProfile: data }), }), { diff --git a/src/stores/settings/player.ts b/src/stores/settings/player.ts index 78019e3f..22299d4f 100644 --- a/src/stores/settings/player.ts +++ b/src/stores/settings/player.ts @@ -4,13 +4,7 @@ import { stateStorage } from '../../constants/storage' import { useStreamingDeviceProfileStore } from '../device-profile' import { useEffect } from 'react' import { getDeviceProfile } from '../../utils/device-profiles' - -export enum StreamingQuality { - Original = 'original', // Direct Play - High = 'high', // 320 - Medium = 'medium', // 256 - Low = 'low', // 128 -} +import StreamingQuality from '../../enums/audio-quality' type PlayerSettingsStore = { streamingQuality: StreamingQuality diff --git a/src/stores/settings/usage.ts b/src/stores/settings/usage.ts index 0c32a3f9..3d611384 100644 --- a/src/stores/settings/usage.ts +++ b/src/stores/settings/usage.ts @@ -1,8 +1,8 @@ import { create } from 'zustand' -import { StreamingQuality } from './player' import { createJSONStorage, devtools, persist } from 'zustand/middleware' import { Platform } from 'react-native' import { stateStorage } from '../../constants/storage' +import StreamingQuality from '../../enums/audio-quality' export type DownloadQuality = StreamingQuality diff --git a/src/utils/device-profiles.ts b/src/utils/device-profiles.ts index 86e14207..360314b7 100644 --- a/src/utils/device-profiles.ts +++ b/src/utils/device-profiles.ts @@ -19,11 +19,11 @@ import { EncodingContext, MediaStreamProtocol, } from '@jellyfin/sdk/lib/generated-client' -import { StreamingQuality } from '../stores/settings/player' import { Platform } from 'react-native' import { getQualityParams } from './mappings' import { capitalize } from 'lodash' import { SourceType } from '../types/JellifyTrack' +import StreamingQuality from '../enums/audio-quality' /** * A constant that defines the options for the {@link useDeviceProfile} hook - building the @@ -174,15 +174,15 @@ const DEFAULT_PLATFORM_PROFILE: DeviceProfile = { Container: 'mp3', Type: DlnaProfileType.Audio, }, - // { - // Container: 'aac', - // Type: DlnaProfileType.Audio, - // }, - // { - // AudioCodec: 'aac', - // Container: 'm4a', - // Type: DlnaProfileType.Audio, - // }, + { + Container: 'aac', + Type: DlnaProfileType.Audio, + }, + { + AudioCodec: 'aac', + Container: 'm4a', + Type: DlnaProfileType.Audio, + }, // { // AudioCodec: 'aac', // Container: 'm4b', @@ -198,24 +198,24 @@ const DEFAULT_PLATFORM_PROFILE: DeviceProfile = { }, ], TranscodingProfiles: [ - // { - // AudioCodec: 'aac', - // BreakOnNonKeyFrames: true, - // Container: 'aac', - // Context: EncodingContext.Streaming, - // MaxAudioChannels: '6', - // MinSegments: 2, - // Protocol: MediaStreamProtocol.Hls, - // Type: DlnaProfileType.Audio, - // }, - // { - // AudioCodec: 'aac', - // Container: 'aac', - // Context: EncodingContext.Streaming, - // MaxAudioChannels: '6', - // Protocol: MediaStreamProtocol.Http, - // Type: DlnaProfileType.Audio, - // }, + { + AudioCodec: 'aac', + BreakOnNonKeyFrames: true, + Container: 'aac', + Context: EncodingContext.Streaming, + MaxAudioChannels: '6', + MinSegments: 2, + Protocol: MediaStreamProtocol.Hls, + Type: DlnaProfileType.Audio, + }, + { + AudioCodec: 'aac', + Container: 'aac', + Context: EncodingContext.Streaming, + MaxAudioChannels: '6', + Protocol: MediaStreamProtocol.Http, + Type: DlnaProfileType.Audio, + }, { AudioCodec: 'mp3', Container: 'mp3', @@ -240,14 +240,14 @@ const DEFAULT_PLATFORM_PROFILE: DeviceProfile = { Protocol: MediaStreamProtocol.Http, Type: DlnaProfileType.Audio, }, - // { - // AudioCodec: 'aac', - // Container: 'aac', - // Context: EncodingContext.Static, - // MaxAudioChannels: '6', - // Protocol: MediaStreamProtocol.Http, - // Type: DlnaProfileType.Audio, - // }, + { + AudioCodec: 'aac', + Container: 'aac', + Context: EncodingContext.Static, + MaxAudioChannels: '6', + Protocol: MediaStreamProtocol.Http, + Type: DlnaProfileType.Audio, + }, { AudioCodec: 'wav', Container: 'wav', diff --git a/src/utils/mappings.ts b/src/utils/mappings.ts index 2228451b..fe69b1fc 100644 --- a/src/utils/mappings.ts +++ b/src/utils/mappings.ts @@ -13,16 +13,14 @@ import { AudioApi } from '@jellyfin/sdk/lib/generated-client/api' import { JellifyDownload } from '../types/JellifyDownload' import { Api } from '@jellyfin/sdk/lib/api' import RNFS from 'react-native-fs' -import { StreamingQuality } from '../stores/settings/player' import { AudioQuality } from '../types/AudioQuality' import { queryClient } from '../constants/query-client' -import { QueryKeys } from '../enums/query-keys' import { isUndefined } from 'lodash' import uuid from 'react-native-uuid' import { convertRunTimeTicksToSeconds } from './runtimeticks' import { DownloadQuality } from '../stores/settings/usage' import MediaInfoQueryKey from '../api/queries/media/keys' -import { JellifyUser } from '../types/JellifyUser' +import StreamingQuality from '../enums/audio-quality' /** * Gets quality-specific parameters for transcoding