From 90a5d941473c0e3e938f2d3113a0a2ecd093c760 Mon Sep 17 00:00:00 2001 From: Lei Nelissen Date: Sat, 24 May 2025 00:09:12 +0200 Subject: [PATCH] fix: missing images --- ios/Fintunes.xcodeproj/project.pbxproj | 10 +-- ios/Fintunes/Info.plist | 4 +- ios/Podfile.lock | 65 +++++++++++++++---- package.json | 4 +- pnpm-lock.yaml | 28 ++++---- src/components/CoverImage.tsx | 9 +-- src/screens/Downloads/index.tsx | 2 +- src/screens/Music/stacks/Albums.tsx | 6 +- src/screens/Music/stacks/Playlists.tsx | 4 +- .../Music/stacks/components/AlbumImage.tsx | 37 ++++++----- .../Music/stacks/components/TrackListView.tsx | 3 +- src/utility/JellyfinApi/lib.ts | 55 +++++++++------- src/utility/JellyfinApi/track.ts | 2 +- 13 files changed, 143 insertions(+), 86 deletions(-) diff --git a/ios/Fintunes.xcodeproj/project.pbxproj b/ios/Fintunes.xcodeproj/project.pbxproj index 04514aa..945ba17 100644 --- a/ios/Fintunes.xcodeproj/project.pbxproj +++ b/ios/Fintunes.xcodeproj/project.pbxproj @@ -319,6 +319,7 @@ "${PODS_CONFIGURATION_BUILD_DIR}/RNSVG/RNSVGFilters.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/React-Core_privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/React-cxxreact/React-cxxreact_privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/Sentry/Sentry.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/boost/boost_privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/glog/glog_privacy.bundle", @@ -330,6 +331,7 @@ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNSVGFilters.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/React-Core_privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/React-cxxreact_privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/SDWebImage.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Sentry.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/boost_privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/glog_privacy.bundle", @@ -390,7 +392,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 115; + CURRENT_PROJECT_VERSION = 117; DEVELOPMENT_TEAM = HD2D35G9Y4; ENABLE_BITCODE = NO; GCC_PREPROCESSOR_DEFINITIONS = ( @@ -427,7 +429,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 115; + CURRENT_PROJECT_VERSION = 117; DEVELOPMENT_TEAM = HD2D35G9Y4; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HD2D35G9Y4; INFOPLIST_FILE = Fintunes/Info.plist; @@ -607,7 +609,7 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 115; + CURRENT_PROJECT_VERSION = 117; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = HD2D35G9Y4; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -642,7 +644,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Manual; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 115; + CURRENT_PROJECT_VERSION = 117; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = HD2D35G9Y4; GCC_C_LANGUAGE_STANDARD = gnu11; diff --git a/ios/Fintunes/Info.plist b/ios/Fintunes/Info.plist index 1dad321..66abf7e 100644 --- a/ios/Fintunes/Info.plist +++ b/ios/Fintunes/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 2.4.5 + 2.4.6 CFBundleSignature ???? CFBundleVersion - 115 + 117 LSRequiresIPhoneOS LSSupportsOpeningDocumentsInPlace diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 862219b..19e04ac 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -8,6 +8,11 @@ PODS: - hermes-engine (0.79.2): - hermes-engine/Pre-built (= 0.79.2) - hermes-engine/Pre-built (0.79.2) + - libavif/core (0.11.1) + - libavif/libdav1d (0.11.1): + - libavif/core + - libdav1d (>= 0.6.0) + - libdav1d (1.2.0) - libwebp (1.3.2): - libwebp/demux (= 1.3.2) - libwebp/mux (= 1.3.2) @@ -1894,10 +1899,35 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - RNFastImage (8.6.3): + - RNFastImage (8.9.2): + - DoubleConversion + - glog + - hermes-engine + - libavif/core (~> 0.11.1) + - libavif/libdav1d (~> 0.11.1) + - RCT-Folly (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety - React-Core - - SDWebImage (~> 5.11.1) - - SDWebImageWebPCoder (~> 0.8.4) + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SDWebImage (>= 5.19.1) + - SDWebImageAVIFCoder (~> 0.11.0) + - SDWebImageWebPCoder (~> 0.14) + - Yoga - RNFlashList (1.8.0): - DoubleConversion - glog @@ -2221,12 +2251,15 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - SDWebImage (5.11.1): - - SDWebImage/Core (= 5.11.1) - - SDWebImage/Core (5.11.1) - - SDWebImageWebPCoder (0.8.5): + - SDWebImage (5.21.0): + - SDWebImage/Core (= 5.21.0) + - SDWebImage/Core (5.21.0) + - SDWebImageAVIFCoder (0.11.0): + - libavif/core (>= 0.11.0) + - SDWebImage (~> 5.10) + - SDWebImageWebPCoder (0.14.6): - libwebp (~> 1.0) - - SDWebImage/Core (~> 5.10) + - SDWebImage/Core (~> 5.17) - Sentry/HybridSDK (8.49.2) - SocketRocket (0.7.1) - SwiftAudioEx (1.1.0) @@ -2315,7 +2348,7 @@ DEPENDENCIES: - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) - "RNCAsyncStorage (from `../node_modules/@react-native-async-storage/async-storage`)" - "RNDateTimePicker (from `../node_modules/@react-native-community/datetimepicker`)" - - RNFastImage (from `../node_modules/react-native-fast-image`) + - "RNFastImage (from `../node_modules/@d11/react-native-fast-image`)" - "RNFlashList (from `../node_modules/@shopify/flash-list`)" - RNFS (from `../node_modules/react-native-fs`) - RNGestureHandler (from `../node_modules/react-native-gesture-handler`) @@ -2328,8 +2361,11 @@ DEPENDENCIES: SPEC REPOS: trunk: + - libavif + - libdav1d - libwebp - SDWebImage + - SDWebImageAVIFCoder - SDWebImageWebPCoder - Sentry - SocketRocket @@ -2496,7 +2532,7 @@ EXTERNAL SOURCES: RNDateTimePicker: :path: "../node_modules/@react-native-community/datetimepicker" RNFastImage: - :path: "../node_modules/react-native-fast-image" + :path: "../node_modules/@d11/react-native-fast-image" RNFlashList: :path: "../node_modules/@shopify/flash-list" RNFS: @@ -2524,6 +2560,8 @@ SPEC CHECKSUMS: fmt: a40bb5bd0294ea969aaaba240a927bd33d878cdd glog: 5683914934d5b6e4240e497e0f4a3b42d1854183 hermes-engine: 314be5250afa5692b57b4dd1705959e1973a8ebe + libavif: 84bbb62fb232c3018d6f1bab79beea87e35de7b7 + libdav1d: 23581a4d8ec811ff171ed5e2e05cd27bad64c39f libwebp: 1786c9f4ff8a279e4dac1e8f385004d5fc253009 RCT-Folly: e78785aa9ba2ed998ea4151e314036f6c49e6d82 RCTDeprecation: 83ffb90c23ee5cea353bd32008a7bca100908f8c @@ -2597,7 +2635,7 @@ SPEC CHECKSUMS: ReactCommon: 76d2dc87136d0a667678668b86f0fca0c16fdeb0 RNCAsyncStorage: 39c42c1e478e1f5166d1db52b5055e090e85ad66 RNDateTimePicker: 43ee3de2bc639bc0d9b77564961060a54dfc7111 - RNFastImage: 462a183c4b0b6b26fdfd639e1ed6ba37536c3b87 + RNFastImage: 72769fac450a8a7d111378433111d8e52f2b251e RNFlashList: 5001dd06f0003a497de3e2035653c54cf8b48e96 RNFS: 89de7d7f4c0f6bafa05343c578f61118c8282ed8 RNGestureHandler: ebef699ea17e7c0006c1074e1e423ead60ce0121 @@ -2606,8 +2644,9 @@ SPEC CHECKSUMS: RNScreens: 5621e3ad5a329fbd16de683344ac5af4192b40d3 RNSentry: f444779917ac0314ecffea5e8bd1041d1be06c31 RNSVG: 794f269526df9ddc1f79b3d1a202b619df0368e3 - SDWebImage: a7f831e1a65eb5e285e3fb046a23fcfbf08e696d - SDWebImageWebPCoder: 908b83b6adda48effe7667cd2b7f78c897e5111d + SDWebImage: f84b0feeb08d2d11e6a9b843cb06d75ebf5b8868 + SDWebImageAVIFCoder: 00310d246aab3232ce77f1d8f0076f8c4b021d90 + SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380 Sentry: 47021097466aa130802420d485a34da445963d99 SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 SwiftAudioEx: f6aa653770f3a0d3851edaf8d834a30aee4a7646 diff --git a/package.json b/package.json index 92db2da..acf4e2e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "fintunes", - "version": "2.4.5", + "version": "2.4.6", "main": "src/index.js", "private": true, "scripts": { @@ -12,6 +12,7 @@ "postinstall": "patch-package" }, "dependencies": { + "@d11/react-native-fast-image": "^8.9.2", "@react-native-async-storage/async-storage": "^2.1.2", "@react-native-community/blur": "^4.4.1", "@react-native-community/datetimepicker": "^8.3.0", @@ -36,7 +37,6 @@ "react-native-accessibility-settings": "^0.1.2", "react-native-collapsible": "^1.6.2", "react-native-dotenv": "^3.4.11", - "react-native-fast-image": "^8.6.3", "react-native-fs": "^2.20.0", "react-native-gesture-handler": "^2.25.0", "react-native-localize": "^3.4.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5795f1b..3520d01 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,6 +19,9 @@ importers: .: dependencies: + '@d11/react-native-fast-image': + specifier: ^8.9.2 + version: 8.9.2(react-native@0.79.2(@babel/core@7.27.1)(@react-native-community/cli@18.0.0(typescript@5.8.3))(@types/react@18.3.20)(react@19.0.0))(react@19.0.0) '@react-native-async-storage/async-storage': specifier: ^2.1.2 version: 2.1.2(react-native@0.79.2(@babel/core@7.27.1)(@react-native-community/cli@18.0.0(typescript@5.8.3))(@types/react@18.3.20)(react@19.0.0)) @@ -91,9 +94,6 @@ importers: react-native-dotenv: specifier: ^3.4.11 version: 3.4.11(@babel/runtime@7.27.1) - react-native-fast-image: - specifier: ^8.6.3 - version: 8.6.3(react-native@0.79.2(@babel/core@7.27.1)(@react-native-community/cli@18.0.0(typescript@5.8.3))(@types/react@18.3.20)(react@19.0.0))(react@19.0.0) react-native-fs: specifier: ^2.20.0 version: 2.20.0(react-native@0.79.2(@babel/core@7.27.1)(@react-native-community/cli@18.0.0(typescript@5.8.3))(@types/react@18.3.20)(react@19.0.0)) @@ -794,6 +794,12 @@ packages: resolution: {integrity: sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==} engines: {node: '>=6.9.0'} + '@d11/react-native-fast-image@8.9.2': + resolution: {integrity: sha512-7d0O5mA17SCbIAYq9D0WxDlS3HXf5v9vg9ltphDfP/3R57sBEf6/wby/sHkOmrQGwvgUlz2oSo5Ld8hgocLJeQ==} + peerDependencies: + react: '*' + react-native: '*' + '@egjs/hammerjs@2.0.17': resolution: {integrity: sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==} engines: {node: '>=0.8.0'} @@ -3840,12 +3846,6 @@ packages: react: '*' react-native: '*' - react-native-fast-image@8.6.3: - resolution: {integrity: sha512-Sdw4ESidXCXOmQ9EcYguNY2swyoWmx53kym2zRsvi+VeFCHEdkO+WG1DK+6W81juot40bbfLNhkc63QnWtesNg==} - peerDependencies: - react: ^17 || ^18 - react-native: '>=0.60.0' - react-native-fs@2.20.0: resolution: {integrity: sha512-VkTBzs7fIDUiy/XajOSNk0XazFE9l+QlMAce7lGuebZcag5CnjszB+u4BdqzwaQOdcYb5wsJIsqq4kxInIRpJQ==} peerDependencies: @@ -5444,6 +5444,11 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 + '@d11/react-native-fast-image@8.9.2(react-native@0.79.2(@babel/core@7.27.1)(@react-native-community/cli@18.0.0(typescript@5.8.3))(@types/react@18.3.20)(react@19.0.0))(react@19.0.0)': + dependencies: + react: 19.0.0 + react-native: 0.79.2(@babel/core@7.27.1)(@react-native-community/cli@18.0.0(typescript@5.8.3))(@types/react@18.3.20)(react@19.0.0) + '@egjs/hammerjs@2.0.17': dependencies: '@types/hammerjs': 2.0.46 @@ -9377,11 +9382,6 @@ snapshots: react-native: 0.79.2(@babel/core@7.27.1)(@react-native-community/cli@18.0.0(typescript@5.8.3))(@types/react@18.3.20)(react@19.0.0) optional: true - react-native-fast-image@8.6.3(react-native@0.79.2(@babel/core@7.27.1)(@react-native-community/cli@18.0.0(typescript@5.8.3))(@types/react@18.3.20)(react@19.0.0))(react@19.0.0): - dependencies: - react: 19.0.0 - react-native: 0.79.2(@babel/core@7.27.1)(@react-native-community/cli@18.0.0(typescript@5.8.3))(@types/react@18.3.20)(react@19.0.0) - react-native-fs@2.20.0(react-native@0.79.2(@babel/core@7.27.1)(@react-native-community/cli@18.0.0(typescript@5.8.3))(@types/react@18.3.20)(react@19.0.0)): dependencies: base-64: 0.1.0 diff --git a/src/components/CoverImage.tsx b/src/components/CoverImage.tsx index a71deac..9698e6e 100644 --- a/src/components/CoverImage.tsx +++ b/src/components/CoverImage.tsx @@ -28,7 +28,7 @@ interface Props { margin?: number; radius?: number; style?: ViewProps['style']; - src: string; + src?: string; } const emptyAlbumLight = require('@/assets/images/empty-album-light.png'); @@ -59,6 +59,8 @@ function CoverImage({ return { imageSize, canvasSize }; }, [blurRadius, margin]); + console.log({ src, hasFailed }); + return ( @@ -69,7 +71,7 @@ function CoverImage({ - {src && ( + {src ? ( <> - )} - {(!src || hasFailed) && ( + ) : ( - + diff --git a/src/screens/Music/stacks/Albums.tsx b/src/screens/Music/stacks/Albums.tsx index ef1b7c2..f8c5209 100644 --- a/src/screens/Music/stacks/Albums.tsx +++ b/src/screens/Music/stacks/Albums.tsx @@ -48,7 +48,7 @@ const SectionHeading = React.memo(function SectionHeading(props: { interface GeneratedAlbumItemProps { id: ReactText; - imageUrl: string; + imageUrl: string | null; name: string; artist: string; onPress: (id: string) => void; @@ -66,7 +66,7 @@ const GeneratedAlbumItem = React.memo(function GeneratedAlbumItem(props: Generat - + {name} {artist} @@ -136,7 +136,7 @@ const Albums: React.FC = () => { void; } @@ -26,7 +26,7 @@ const GeneratedPlaylistItem = React.memo(function GeneratedPlaylistItem(props: G return ( - + {name} diff --git a/src/screens/Music/stacks/components/AlbumImage.tsx b/src/screens/Music/stacks/components/AlbumImage.tsx index 7d6fcbb..86ae461 100644 --- a/src/screens/Music/stacks/components/AlbumImage.tsx +++ b/src/screens/Music/stacks/components/AlbumImage.tsx @@ -1,6 +1,6 @@ -import React, { useState } from 'react'; +import React from 'react'; import styled from 'styled-components/native'; -import FastImage, { FastImageProps } from 'react-native-fast-image'; +import FastImage, { FastImageProps, Source } from '@d11/react-native-fast-image'; import { Dimensions } from 'react-native'; import { useUserOrSystemScheme } from '@/components/Colors'; @@ -22,24 +22,29 @@ const Container = styled(FastImage)` margin-bottom: 5px; `; -function AlbumImage(props: FastImageProps) { - const [hasError, setError] = useState(false); - const colorScheme = useUserOrSystemScheme(); +export interface AlbumImageProps extends FastImageProps { + source: number | Omit & { + uri?: string; + }; +} - if (!props.source || hasError) { - return ( - - ); +const defaultImageDark = require('@/assets/images/empty-album-dark.png'); +const defaultImageLight = require('@/assets/images/empty-album-light.png'); + +function AlbumImage(props: FastImageProps) { + const colorScheme = useUserOrSystemScheme(); + const defaultImage = colorScheme === 'light' ? defaultImageLight : defaultImageDark; + + // If no source is provided, use the default image as the main source + if (!props.source || (typeof props.source === 'object' && 'uri' in props.source && !props.source.uri)) { + return ; } return ( - setError(true)} /> + ); } diff --git a/src/screens/Music/stacks/components/TrackListView.tsx b/src/screens/Music/stacks/components/TrackListView.tsx index 0d9b214..38a110b 100644 --- a/src/screens/Music/stacks/components/TrackListView.tsx +++ b/src/screens/Music/stacks/components/TrackListView.tsx @@ -100,6 +100,7 @@ const TrackListView: React.FC = ({ const tracks = useTypedSelector((state) => state.music.tracks.entities); const isLoading = useTypedSelector((state) => state.music.tracks.isLoading); const downloadedTracks = useTypedSelector(selectDownloadedTracks(trackIds)); + const entity = useTypedSelector((state) => itemDisplayStyle === 'album' ? state.music.albums.entities[entityId] : state.music.playlists.entities[entityId]); const totalDuration = useMemo(() => ( trackIds.reduce((sum, trackId) => ( sum + (tracks[trackId]?.RunTimeTicks || 0) @@ -173,7 +174,7 @@ const TrackListView: React.FC = ({ > - +
{title}
{artist} diff --git a/src/utility/JellyfinApi/lib.ts b/src/utility/JellyfinApi/lib.ts index 0ce110f..c61c0e7 100644 --- a/src/utility/JellyfinApi/lib.ts +++ b/src/utility/JellyfinApi/lib.ts @@ -46,7 +46,7 @@ export async function fetchApi( path: PathOrCredentialInserter, providedConfig?: RequestInit, parseResponse = true -) { +) { // Retrieve the latest credentials from the Redux store const credentials = asyncFetchStore().getState().settings.credentials; @@ -67,11 +67,11 @@ export async function fetchApi( ...generateConfig(credentials).headers, } }; - + // Actually perform the request const response = await fetch(url, config); - if (__DEV__) { + if (__DEV__) { console.log(`%c[HTTP] → [${response.status}] ${url}`, 'font-weight:bold;'); console.log('\t', config); } @@ -96,24 +96,44 @@ export async function fetchApi( if (parseResponse) { // Parse body as JSON const data = await response.json() as Promise; - + return data; } return null; } +function formatImageUri(ItemId: string | number, baseUri: string): string { + return encodeURI(`${baseUri}/Items/${ItemId}/Images/Primary?format=jpeg`); +} + /** * Retrieve an image URL for a given ItemId */ -export function getImage(ItemId: string | number, credentials?: AppState['settings']['credentials']): string { +export function getImage(item: string | number | Album | AlbumTrack | Playlist | ArtistItem | null, credentials?: AppState['settings']['credentials']): string | undefined { // Either accept provided credentials, or retrieve them directly from the store - const { uri: serverUri } = credentials + const { uri: serverUri } = credentials ?? asyncFetchStore().getState().settings.credentials ?? {}; - - // Generate the uri and return - const uri = encodeURI(`${serverUri}/Items/${ItemId}/Images/Primary?format=jpeg`); - return uri; + + if (!item || !serverUri) { + return undefined; + // GUARD: If the item's just the id, we'll pass it on directly. + } else if (typeof item === 'string' || typeof item === 'number') { + if (__DEV__) { + console.warn('useGetImage: supplied item is string or number. Please submit an item object instead.', { item }); + } + return formatImageUri(item, serverUri); + // GUARD: If the item has an `PrimaryImageItemId` (for Emby servers), + // we'll attemp to return that + } else if ('PrimaryImageItemId' in item) { + return formatImageUri(item.PrimaryImageItemId || item.Id, serverUri); + } else { + if ('ImageTags' in item && item.ImageTags.Primary) { + return formatImageUri(item.Id, serverUri); + } + } + + return undefined; } /** @@ -122,18 +142,7 @@ export function getImage(ItemId: string | number, credentials?: AppState['settin export function useGetImage() { const credentials = useTypedSelector((state) => state.settings.credentials); - return (item: string | number | Album | AlbumTrack | Playlist | ArtistItem | null) => { - if (!item) { - return ''; - // GUARD: If the item's just the id, we'll pass it on directly. - } else if (typeof item === 'string' || typeof item === 'number') { - return getImage(item, credentials); - // GUARD: If the item has an `PrimaryImageItemId` (for Emby servers), - // we'll attemp to return that - } else if ('PrimaryImageItemId' in item) { - return getImage(item.PrimaryImageItemId || item.Id, credentials); - } else { - return getImage(item.Id); - } + return (item: Parameters[0]) => { + return getImage(item, credentials); }; } \ No newline at end of file diff --git a/src/utility/JellyfinApi/track.ts b/src/utility/JellyfinApi/track.ts index ad048e0..e06c9a2 100644 --- a/src/utility/JellyfinApi/track.ts +++ b/src/utility/JellyfinApi/track.ts @@ -57,7 +57,7 @@ export async function generateTrack(track: AlbumTrack): Promise { artist: track.Artists.join(', '), album: track.Album, duration: track.RunTimeTicks, - artwork: getImage(track.Id), + artwork: getImage(track), bitRate: baseTrackOptions.audioBitRate, }; }