Initial Setup for Toggle (#280)

* Initial Setup for Toggle

* Enhancements to Offline (#279)

* [skip actions]

* xcode and project stuff

* Enhancements to Offline (#279)

* fix workflows

* we don't need tests running on a pr, it's already going to run on a push

* complete move to yarn

* run formatter

* fix build, prep for using mediasources

* linting errors

---------

Co-authored-by: Ritesh Shukla <ritesh.shukla2@M-LD4JMWLW26.local>
Co-authored-by: Violet Caulfield <42452695+anultravioletaurora@users.noreply.github.com>
Co-authored-by: anultravioletaurora <jellify@cosmonautical.com>
Co-authored-by: Violet Caulfield <violet@cosmonautical.cloud>
This commit is contained in:
Ritesh Shukla
2025-04-24 17:53:01 +05:30
committed by GitHub
parent d64bd9d934
commit ff7c454011
19 changed files with 3409 additions and 3368 deletions

View File

@@ -16,8 +16,8 @@ jobs:
- name: 💬 Echo package.json version to Github ENV
run: echo VERSION_NUMBER=$(node -p -e "require('./package.json').version") >> $GITHUB_ENV
- name: 🟢 Run npm run init
run: npm run init
- name: 🧵 Run yarn install
run: yarn install
- name: 🚀 Run fastlane build
run: npm run fastlane:android:build
run: yarn fastlane:android:build

View File

@@ -17,14 +17,14 @@ jobs:
- name: 💬 Echo package.json version to Github ENV
run: echo VERSION_NUMBER=$(node -p -e "require('./package.json').version") >> $GITHUB_ENV
- name: 🟢 Run npm run init
run: npm run init
- name: 🍎 Run yarn init:ios
run: yarn init:ios
- name: 🍫 Install CocoaPods
run: npm run pod:install
run: yarn pod:install
- name: 🚀 Run fastlane build
run: npm run fastlane:ios:build
run: yarn fastlane:ios:build
env:
# FASTLANE_PASSWORD: ${{ secrets.FASTLANE_PASSWORD }}
APPSTORE_CONNECT_API_KEY_JSON: ${{ secrets.APPSTORE_CONNECT_API_KEY_JSON }}

View File

@@ -17,11 +17,11 @@ jobs:
with:
node-version: 20
- name: 🟢 Run npm run init
run: npm run init
- name: 🧵 Run yarn install
run: yarn install
- name: 🍫 Install CocoaPods
run: npm run pod:install
run: yarn pod:install
- name: Version Up
run: npx react-native bump-version --type minor
@@ -35,10 +35,10 @@ jobs:
working-directory: ./ios/fastlane
- name: 🚀 Run Android fastlane build
run: npm run fastlane:android:build
run: yarn fastlane:android:build
- name: 🚀 Run iOS fastlane build and publish to TestFlight
run: npm run fastlane:ios:beta
run: yarn fastlane:ios:beta
env:
APPSTORE_CONNECT_API_KEY_JSON: ${{ secrets.APPSTORE_CONNECT_API_KEY_JSON }}
FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD: ${{ secrets.FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD }}
@@ -85,7 +85,7 @@ jobs:
- name: 😎 Notify on Discord
- name: 🗣️ Notify on Discord
run: |
cd ios
bundle exec fastlane notifyOnDiscord

View File

@@ -3,7 +3,7 @@ on:
push:
branches-ignore:
- "main"
pull_request:
jobs:
run-jest-test-suite:
runs-on: macos-latest
@@ -19,11 +19,11 @@ jobs:
- name: 💬 Echo package.json version to Github ENV
run: echo VERSION_NUMBER=$(node -p -e "require('./package.json').version") >> $GITHUB_ENV
- name: 🟢 Run npm run init
run: npm run init
- name: 🟢 Run yarn init:ios
run: yarn init:ios
- name: 🧪 Run npm test
run: npm run test
run: yarn test
- name: 🦋 Check Styling
run: npm run format:check
run: yarn format:check

View File

@@ -161,21 +161,21 @@ This is undoubtedly a passion project of [mine](https://github.com/anultraviolet
##### Setup
- Clone this repository
- Run `npm run init:ios` to initialize the project
- Run `yarn init:ios` to initialize the project
- This will install `npm` packages, install `bundler` and required gems, and install required CocoaPods
- In the `ios` directory, run `fastlane match development --readonly` to fetch the development signing certificates
- *You will need access to the *Jellify Signing* private repository*
##### Running
- Run `npm run start` to start the dev server
- Run `yarn start` to start the dev server
- Open the `Jellify.xcodeworkspace` with Xcode, _not_ the `Jellify.xcodeproject`
- Run either on a device or in the simulator
- _You will need to wait for Xcode to finish it's "Indexing" step_
##### Building
- To create a build, run `npm run fastlane:ios:build` to use fastlane to compile an `.ipa`
- To create a build, run `yarn fastlane:ios:build` to use fastlane to compile an `.ipa`
### 🤖 Android
@@ -189,18 +189,18 @@ This is undoubtedly a passion project of [mine](https://github.com/anultraviolet
##### Setup
- Clone this repository
- Run `npm i` to install `npm` packages
- Run `yarn install` to install `npm` packages
##### Running
- Run `npm run start` to start the dev server
- Run `yarn start` to start the dev server
- Open the `android` folder with Android Studio
- _Android Studio should automatically grab the "Run Configurations" and initialize Gradle_
- Run either on a device or in the simulator
##### Building
- To create a build, run `npm run fastlane:android:build` to use fastlane to compile an `.apk` for all architectures
- To create a build, run `yarn fastlane:android:build` to use fastlane to compile an `.apk` for all architectures
#### References

View File

@@ -0,0 +1,20 @@
import { PlaybackInfoResponse } from '@jellyfin/sdk/lib/generated-client/models'
import Client from '../../../api/client'
import { getMediaInfoApi } from '@jellyfin/sdk/lib/utils/api'
export async function fetchMediaInfo(itemId: string): Promise<PlaybackInfoResponse> {
return new Promise((resolve, reject) => {
getMediaInfoApi(Client.api!)
.getPlaybackInfo({
itemId,
userId: Client.user?.id,
})
.then(({ data }) => {
console.debug(data)
resolve(data)
})
.catch((error) => {
reject(error)
})
})
}

View File

@@ -1,6 +1,7 @@
import { QueryKeys } from '../../enums/query-keys'
interface CategoryRoute {
/* eslint-disable @typescript-eslint/no-explicit-any */
name: any // ¯\_(ツ)_/¯
iconName: string
params?: {

View File

@@ -34,7 +34,7 @@ export default function ServerLibrary(): React.JSX.Element {
useEffect(() => {
if (!isPending && isSuccess)
setPlaylistLibrary(
libraries.filter((library) => library.CollectionType === 'playlists')[0],
libraries?.filter((library) => library.CollectionType === 'playlists')[0],
)
}, [isPending, isSuccess])

View File

@@ -74,13 +74,32 @@ const mmkv = new MMKV({
const MMKV_OFFLINE_MODE_KEYS = {
AUDIO_CACHE: 'audioCache',
AUDIO_CACHE_LIMIT: 'audioCacheLimit',
}
export const getDefaultAudioCacheLimit = () => {
if (!mmkv.contains(MMKV_OFFLINE_MODE_KEYS.AUDIO_CACHE_LIMIT)) {
mmkv.set(MMKV_OFFLINE_MODE_KEYS.AUDIO_CACHE_LIMIT, 20)
}
}
getDefaultAudioCacheLimit()
const AUDIO_CACHE_LIMIT = mmkv.getNumber(MMKV_OFFLINE_MODE_KEYS.AUDIO_CACHE_LIMIT)
export const saveAudio = async (
track: JellifyTrack,
queryClient: QueryClient,
isAutoDownloaded: boolean = true,
) => {
if (
isAutoDownloaded &&
AUDIO_CACHE_LIMIT &&
(!Number.isFinite(AUDIO_CACHE_LIMIT) || AUDIO_CACHE_LIMIT <= 0)
) {
// If the cache limit is not set or is not a number, or is less than 0, Dont Auto Download
return
}
const existingRaw = mmkv.getString(MMKV_OFFLINE_MODE_KEYS.AUDIO_CACHE)
let existingArray: JellifyDownload[] = []
try {
@@ -90,6 +109,7 @@ export const saveAudio = async (
} catch (error) {
//Ignore
}
try {
console.log('Downloading audio', track)
@@ -161,8 +181,6 @@ export const deleteAudioCache = async () => {
mmkv.delete(MMKV_OFFLINE_MODE_KEYS.AUDIO_CACHE)
}
const AUDIO_CACHE_LIMIT = 20 // change as needed
export const purneAudioCache = async () => {
const existingRaw = mmkv.getString(MMKV_OFFLINE_MODE_KEYS.AUDIO_CACHE)
if (!existingRaw) return
@@ -179,7 +197,7 @@ export const purneAudioCache = async () => {
.filter((item) => item.isAutoDownloaded)
.sort((a, b) => new Date(a.savedAt).getTime() - new Date(b.savedAt).getTime()) // oldest first
const excess = autoDownloads.length - AUDIO_CACHE_LIMIT
const excess = autoDownloads.length - (AUDIO_CACHE_LIMIT ?? 20)
if (excess <= 0) return
// Remove the oldest `excess` files
@@ -201,3 +219,11 @@ export const purneAudioCache = async () => {
mmkv.set(MMKV_OFFLINE_MODE_KEYS.AUDIO_CACHE, JSON.stringify(existingArray))
}
export const setAudioCacheLimit = (limit: number) => {
mmkv.set(MMKV_OFFLINE_MODE_KEYS.AUDIO_CACHE_LIMIT, limit)
}
export const getAudioCacheLimit = () => {
return mmkv.getNumber(MMKV_OFFLINE_MODE_KEYS.AUDIO_CACHE_LIMIT)
}

View File

@@ -1,6 +1,7 @@
import { QueryKeys } from '../../enums/query-keys'
interface CategoryRoute {
/* eslint-disable @typescript-eslint/no-explicit-any */
name: any // ¯\_(ツ)_/¯
iconName: string
params?: {

View File

@@ -12,6 +12,7 @@ export const DownloadProgressBar = () => {
return (
<View style={styles.container}>
{/* eslint-disable @typescript-eslint/no-explicit-any */}
{Object.entries(downloads || {}).map(([url, item]: any) => {
const animatedWidth = useSharedValue(item.progress)
animatedWidth.value = withTiming(item.progress, { duration: 200 })

View File

@@ -10,6 +10,7 @@ import { Separator } from 'tamagui'
import { QueryConfig } from '../../api/queries/query.config'
export default function TracksScreen({ route, navigation }: TracksProps): React.JSX.Element {
/* eslint-disable @typescript-eslint/no-explicit-any */
const queryKey: any[] = [route.params.query]
if (route.params.query === QueryKeys.RecentlyPlayed)

View File

@@ -67,4 +67,5 @@ export enum QueryKeys {
RecentlyAdded = 'RecentlyAdded',
SimilarItems = 'SimilarItems',
AudioCache = 'AudioCache',
MediaSources = 'MediaSources',
}

View File

@@ -24,17 +24,19 @@ GEM
json (>= 1.5.1)
artifactory (3.0.17)
atomos (0.1.3)
aws-eventstream (1.3.0)
aws-partitions (1.1044.0)
aws-sdk-core (3.217.1)
aws-eventstream (1.3.2)
aws-partitions (1.1091.0)
aws-sdk-core (3.222.2)
aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.992.0)
aws-sigv4 (~> 1.9)
base64
jmespath (~> 1, >= 1.6.1)
aws-sdk-kms (1.97.0)
logger
aws-sdk-kms (1.99.0)
aws-sdk-core (~> 3, >= 3.216.0)
aws-sigv4 (~> 1.5)
aws-sdk-s3 (1.179.0)
aws-sdk-s3 (1.183.0)
aws-sdk-core (~> 3, >= 3.216.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.5)
@@ -138,7 +140,7 @@ GEM
faraday_middleware (1.2.1)
faraday (~> 1.0)
fastimage (2.4.0)
fastlane (2.226.0)
fastlane (2.227.1)
CFPropertyList (>= 2.3, < 4.0.0)
addressable (>= 2.8, < 3.0.0)
artifactory (~> 3.0)
@@ -178,7 +180,7 @@ GEM
tty-spinner (>= 0.8.0, < 1.0.0)
word_wrap (~> 1.0.0)
xcodeproj (>= 1.13.0, < 2.0.0)
xcpretty (~> 0.4.0)
xcpretty (~> 0.4.1)
xcpretty-travis-formatter (>= 0.0.3, < 2.0.0)
fastlane-plugin-discord_notifier (0.1.7)
discordrb (~> 3.3.0)
@@ -205,12 +207,12 @@ GEM
google-apis-core (>= 0.11.0, < 2.a)
google-apis-storage_v1 (0.31.0)
google-apis-core (>= 0.11.0, < 2.a)
google-cloud-core (1.7.1)
google-cloud-core (1.8.0)
google-cloud-env (>= 1.0, < 3.a)
google-cloud-errors (~> 1.0)
google-cloud-env (1.6.0)
faraday (>= 0.17.3, < 3.0)
google-cloud-errors (1.4.0)
google-cloud-errors (1.5.0)
google-cloud-storage (1.47.0)
addressable (~> 2.8)
digest-crc (~> 0.4)
@@ -229,11 +231,12 @@ GEM
http-accept (1.7.0)
http-cookie (1.0.8)
domain_name (~> 0.5)
httpclient (2.8.3)
httpclient (2.9.0)
mutex_m
i18n (1.14.7)
concurrent-ruby (~> 1.0)
jmespath (1.6.2)
json (2.9.1)
json (2.10.2)
jwt (2.10.1)
base64
logger (1.6.5)
@@ -272,7 +275,7 @@ GEM
mime-types (>= 1.16, < 4.0)
netrc (~> 0.8)
retriable (3.1.2)
rexml (3.4.0)
rexml (3.4.1)
rouge (3.28.0)
ruby-macho (2.5.1)
ruby2_keywords (0.0.5)
@@ -316,7 +319,7 @@ GEM
colored2 (~> 3.1)
nanaimo (~> 0.4.0)
rexml (>= 3.3.6, < 4.0)
xcpretty (0.4.0)
xcpretty (0.4.1)
rouge (~> 3.28.0)
xcpretty-travis-formatter (1.0.1)
xcpretty (~> 0.2, >= 0.0.7)

View File

@@ -29,32 +29,16 @@
CF620D192CF2BB210045E433 /* Aileron-Black.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF620D092CF2BB200045E433 /* Aileron-Black.otf */; };
CF620D1A2CF2BB210045E433 /* Aileron-ThinItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF620D0A2CF2BB200045E433 /* Aileron-ThinItalic.otf */; };
CF620D1B2CF2BB210045E433 /* Aileron-SemiBold.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF620D0B2CF2BB200045E433 /* Aileron-SemiBold.otf */; };
CF68914D2D45316A00F1279C /* Aileron-Black.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF6891312D45316A00F1279C /* Aileron-Black.otf */; };
CF68914E2D45316A00F1279C /* icon_1024pt_1x.jpg in Resources */ = {isa = PBXBuildFile; fileRef = CF68914A2D45316A00F1279C /* icon_1024pt_1x.jpg */; };
CF68914F2D45316A00F1279C /* Aileron-Light.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF6891382D45316A00F1279C /* Aileron-Light.otf */; };
CF6891502D45316A00F1279C /* Aileron-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF68913A2D45316A00F1279C /* Aileron-Regular.otf */; };
CF6891512D45316A00F1279C /* Aileron-Italic.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF6891372D45316A00F1279C /* Aileron-Italic.otf */; };
CF6891522D45316A00F1279C /* Aileron-Heavy.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF6891352D45316A00F1279C /* Aileron-Heavy.otf */; };
CF6891532D45316A00F1279C /* Aileron-BoldItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF6891342D45316A00F1279C /* Aileron-BoldItalic.otf */; };
CF6891542D45316A00F1279C /* icon_20pt_2x.jpg in Resources */ = {isa = PBXBuildFile; fileRef = CF6891422D45316A00F1279C /* icon_20pt_2x.jpg */; };
CF6891552D45316A00F1279C /* Aileron-UltraLight.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF68913F2D45316A00F1279C /* Aileron-UltraLight.otf */; };
CF6891562D45316A00F1279C /* icon_29pt_2x.jpg in Resources */ = {isa = PBXBuildFile; fileRef = CF6891442D45316A00F1279C /* icon_29pt_2x.jpg */; };
CF6891572D45316A00F1279C /* Aileron-HeavyItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF6891362D45316A00F1279C /* Aileron-HeavyItalic.otf */; };
CF6891582D45316A00F1279C /* icon_40pt_3x.jpg in Resources */ = {isa = PBXBuildFile; fileRef = CF6891472D45316A00F1279C /* icon_40pt_3x.jpg */; };
CF6891592D45316A00F1279C /* icon_40pt_2x.jpg in Resources */ = {isa = PBXBuildFile; fileRef = CF6891462D45316A00F1279C /* icon_40pt_2x.jpg */; };
CF68915A2D45316A00F1279C /* icon_original.jpeg in Resources */ = {isa = PBXBuildFile; fileRef = CF68914B2D45316A00F1279C /* icon_original.jpeg */; };
CF68915B2D45316A00F1279C /* Aileron-SemiBoldItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF68913C2D45316A00F1279C /* Aileron-SemiBoldItalic.otf */; };
CF68915C2D45316A00F1279C /* Aileron-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF6891332D45316A00F1279C /* Aileron-Bold.otf */; };
CF68915D2D45316A00F1279C /* icon_60pt_3x.jpg in Resources */ = {isa = PBXBuildFile; fileRef = CF6891492D45316A00F1279C /* icon_60pt_3x.jpg */; };
CF68915E2D45316A00F1279C /* icon_60pt_2x.jpg in Resources */ = {isa = PBXBuildFile; fileRef = CF6891482D45316A00F1279C /* icon_60pt_2x.jpg */; };
CF68915F2D45316A00F1279C /* Aileron-BlackItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF6891322D45316A00F1279C /* Aileron-BlackItalic.otf */; };
CF6891602D45316A00F1279C /* icon_20pt_3x.jpg in Resources */ = {isa = PBXBuildFile; fileRef = CF6891432D45316A00F1279C /* icon_20pt_3x.jpg */; };
CF6891612D45316A00F1279C /* Aileron-UltraLightItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF6891402D45316A00F1279C /* Aileron-UltraLightItalic.otf */; };
CF6891622D45316A00F1279C /* icon_29pt_3x.jpg in Resources */ = {isa = PBXBuildFile; fileRef = CF6891452D45316A00F1279C /* icon_29pt_3x.jpg */; };
CF6891632D45316A00F1279C /* Aileron-LightItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF6891392D45316A00F1279C /* Aileron-LightItalic.otf */; };
CF6891642D45316A00F1279C /* Aileron-ThinItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF68913E2D45316A00F1279C /* Aileron-ThinItalic.otf */; };
CF6891652D45316A00F1279C /* Aileron-Thin.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF68913D2D45316A00F1279C /* Aileron-Thin.otf */; };
CF6891662D45316A00F1279C /* Aileron-SemiBold.otf in Resources */ = {isa = PBXBuildFile; fileRef = CF68913B2D45316A00F1279C /* Aileron-SemiBold.otf */; };
CF6B19DD2D550FA7002464CB /* icon_dark_20pt_2x.png in Resources */ = {isa = PBXBuildFile; fileRef = CF6B19D42D550FA7002464CB /* icon_dark_20pt_2x.png */; };
CF6B19DE2D550FA7002464CB /* icon_dark_29pt_3x.png in Resources */ = {isa = PBXBuildFile; fileRef = CF6B19D72D550FA7002464CB /* icon_dark_29pt_3x.png */; };
CF6B19DF2D550FA7002464CB /* icon_dark_60pt_2x.png in Resources */ = {isa = PBXBuildFile; fileRef = CF6B19DA2D550FA7002464CB /* icon_dark_60pt_2x.png */; };
@@ -418,7 +402,8 @@
83CBB9F71A601CBA00E9B192 /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 1210;
BuildIndependentTargetsInParallel = YES;
LastUpgradeCheck = 1630;
TargetAttributes = {
00E356ED1AD99517003FC87E = {
CreatedOnToolsVersion = 6.2;
@@ -487,10 +472,8 @@
CF620D1B2CF2BB210045E433 /* Aileron-SemiBold.otf in Resources */,
81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */,
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
CF68914D2D45316A00F1279C /* Aileron-Black.otf in Resources */,
CF6B19E92D5510E0002464CB /* icon_dark_original.png in Resources */,
CF68914E2D45316A00F1279C /* icon_1024pt_1x.jpg in Resources */,
CF68914F2D45316A00F1279C /* Aileron-Light.otf in Resources */,
CF6B19DD2D550FA7002464CB /* icon_dark_20pt_2x.png in Resources */,
CF6B19DE2D550FA7002464CB /* icon_dark_29pt_3x.png in Resources */,
CF6B19DF2D550FA7002464CB /* icon_dark_60pt_2x.png in Resources */,
@@ -499,29 +482,15 @@
CF6B19E32D550FA7002464CB /* icon_dark_40pt_2x.png in Resources */,
CF6B19E42D550FA7002464CB /* icon_dark_40pt_3x.png in Resources */,
CF6B19E52D550FA7002464CB /* icon_dark_60pt_3x.png in Resources */,
CF6891502D45316A00F1279C /* Aileron-Regular.otf in Resources */,
CF6891512D45316A00F1279C /* Aileron-Italic.otf in Resources */,
CF6891522D45316A00F1279C /* Aileron-Heavy.otf in Resources */,
CF6891532D45316A00F1279C /* Aileron-BoldItalic.otf in Resources */,
CF6891542D45316A00F1279C /* icon_20pt_2x.jpg in Resources */,
CF6891552D45316A00F1279C /* Aileron-UltraLight.otf in Resources */,
CF6891562D45316A00F1279C /* icon_29pt_2x.jpg in Resources */,
CF6891572D45316A00F1279C /* Aileron-HeavyItalic.otf in Resources */,
CF6891582D45316A00F1279C /* icon_40pt_3x.jpg in Resources */,
CF6891592D45316A00F1279C /* icon_40pt_2x.jpg in Resources */,
CF68915A2D45316A00F1279C /* icon_original.jpeg in Resources */,
CF68915B2D45316A00F1279C /* Aileron-SemiBoldItalic.otf in Resources */,
CF68915C2D45316A00F1279C /* Aileron-Bold.otf in Resources */,
CF68915D2D45316A00F1279C /* icon_60pt_3x.jpg in Resources */,
CF68915E2D45316A00F1279C /* icon_60pt_2x.jpg in Resources */,
CF68915F2D45316A00F1279C /* Aileron-BlackItalic.otf in Resources */,
CF6891602D45316A00F1279C /* icon_20pt_3x.jpg in Resources */,
CF6891612D45316A00F1279C /* Aileron-UltraLightItalic.otf in Resources */,
CF6891622D45316A00F1279C /* icon_29pt_3x.jpg in Resources */,
CF6891632D45316A00F1279C /* Aileron-LightItalic.otf in Resources */,
CF6891642D45316A00F1279C /* Aileron-ThinItalic.otf in Resources */,
CF6891652D45316A00F1279C /* Aileron-Thin.otf in Resources */,
CF6891662D45316A00F1279C /* Aileron-SemiBold.otf in Resources */,
217EBE16A3E8C5FBF476C905 /* PrivacyInfo.xcprivacy in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -553,10 +522,14 @@
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Jellify/Pods-Jellify-resources-${CONFIGURATION}-input-files.xcfilelist",
);
inputPaths = (
);
name = "[CP] Copy Pods Resources";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Jellify/Pods-Jellify-resources-${CONFIGURATION}-output-files.xcfilelist",
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Jellify/Pods-Jellify-resources.sh\"\n";
@@ -570,10 +543,14 @@
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Jellify/Pods-Jellify-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
inputPaths = (
);
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Jellify/Pods-Jellify-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Jellify/Pods-Jellify-frameworks.sh\"\n";
@@ -722,6 +699,7 @@
DEVELOPMENT_TEAM = WAH9CZ8BPG;
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = WAH9CZ8BPG;
ENABLE_BITCODE = NO;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
INFOPLIST_FILE = Jellify/Info.plist;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.music";
LD_RUNPATH_SEARCH_PATHS = (
@@ -762,6 +740,7 @@
CURRENT_PROJECT_VERSION = 136;
DEVELOPMENT_TEAM = WAH9CZ8BPG;
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = WAH9CZ8BPG;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
INFOPLIST_FILE = Jellify/Info.plist;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.music";
LD_RUNPATH_SEARCH_PATHS = (
@@ -822,6 +801,7 @@
CXX = "";
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "";
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
@@ -871,10 +851,7 @@
"-DFOLLY_CFG_NO_COROUTINES=1",
"-DFOLLY_HAVE_CLOCK_GETTIME=1",
);
OTHER_LDFLAGS = (
"$(inherited)",
" ",
);
OTHER_LDFLAGS = "$(inherited) ";
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
SDKROOT = iphoneos;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG";
@@ -918,6 +895,7 @@
CXX = "";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "";
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
@@ -959,12 +937,10 @@
"-DFOLLY_CFG_NO_COROUTINES=1",
"-DFOLLY_HAVE_CLOCK_GETTIME=1",
);
OTHER_LDFLAGS = (
"$(inherited)",
" ",
);
OTHER_LDFLAGS = "$(inherited) ";
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_VERSION = 5.0;
USE_HERMES = true;
VALIDATE_PRODUCT = YES;

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1620"
LastUpgradeVersion = "1630"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1210"
LastUpgradeVersion = "1630"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"

View File

@@ -1,122 +1,122 @@
{
"name": "jellify",
"version": "0.11.0",
"private": true,
"scripts": {
"init": "npm i",
"init:ios": "npm i && npm run pod:install",
"reinstall": "rm -rf ./node_modules && npm i",
"android": "react-native run-android",
"ios": "react-native run-ios",
"lint": "eslint .",
"start": "react-native start",
"test": "jest",
"clean:ios": "cd ios && pod deintegrate",
"clean:android": "cd android && rm -rf app/ build/",
"pod:install": "cd ios && bundle install && RCT_NEW_ARCH_ENABLED=0 bundle exec pod install",
"pod:install-new-arch": "cd ios && bundle install && RCT_NEW_ARCH_ENABLED=1 bundle exec pod install",
"fastlane:ios:build": "cd ios && bundle exec fastlane build",
"fastlane:ios:beta": "cd ios && bundle exec fastlane beta",
"fastlane:android:build": "cd android && bundle install && bundle exec fastlane build",
"androidBuild": "cd android && ./gradlew clean && ./gradlew assembleRelease && cd .. && echo 'find apk in android/app/build/outputs/apk/release'",
"prepare": "husky",
"format:check": "prettier --check .",
"format": "prettier --write .",
"postinstall": "patch-package"
},
"dependencies": {
"@jellyfin/sdk": "^0.11.0",
"@react-native-community/blur": "^4.4.1",
"@react-native-community/cli": "^15.1.3",
"@react-native-community/netinfo": "^11.4.1",
"@react-native-masked-view/masked-view": "^0.3.2",
"@react-navigation/bottom-tabs": "^7.2.0",
"@react-navigation/material-top-tabs": "^7.2.10",
"@react-navigation/native": "^7.1.6",
"@react-navigation/native-stack": "^7.1.1",
"@react-navigation/stack": "^7.1.0",
"@tamagui/config": "^1.125.34",
"@tamagui/toast": "^1.125.34",
"@tanstack/query-sync-storage-persister": "^5.73.3",
"@tanstack/react-query": "^5.73.3",
"@tanstack/react-query-persist-client": "^5.73.3",
"axios": "^1.7.9",
"bundle": "^2.1.0",
"burnt": "^0.12.2",
"expo": "^52.0.0",
"expo-image": "^2.0.7",
"gem": "^2.4.3",
"invert-color": "^2.0.0",
"jest-expo": "^52.0.6",
"lodash": "^4.17.21",
"npm-bundle": "^3.0.3",
"patch-package": "^8.0.0",
"react": "18.3.1",
"react-freeze": "^1.0.4",
"react-native": "0.77.0",
"react-native-background-actions": "^4.0.1",
"react-native-blurhash": "^2.1.1",
"react-native-boost": "^0.5.5",
"react-native-carplay": "^2.4.1-beta.0",
"react-native-device-info": "^14.0.4",
"react-native-draggable-flatlist": "^4.0.1",
"react-native-fs": "^2.20.0",
"react-native-gesture-handler": "^2.23.0",
"react-native-haptic-feedback": "^2.3.3",
"react-native-mmkv": "^2.12.2",
"react-native-pager-view": "^6.7.0",
"react-native-reanimated": "^3.17.4",
"react-native-safe-area-context": "^5.2.0",
"react-native-screens": "^4.6.0",
"react-native-swipeable-item": "^2.0.9",
"react-native-text-ticker": "^1.14.0",
"react-native-track-player": "^4.1.1",
"react-native-url-polyfill": "^2.0.0",
"react-native-uuid": "^2.0.3",
"react-native-vector-icons": "^10.2.0",
"ruby": "^0.6.1",
"tamagui": "^1.125.34"
},
"devDependencies": {
"@babel/core": "^7.25.2",
"@babel/preset-env": "^7.25.3",
"@babel/runtime": "^7.25.0",
"@react-native-community/cli-platform-android": "15.1.3",
"@react-native-community/cli-platform-ios": "15.1.3",
"@react-native/babel-preset": "0.77.0",
"@react-native/eslint-config": "0.77.0",
"@react-native/metro-config": "0.77.0",
"@react-native/typescript-config": "0.77.0",
"@types/jest": "^29.5.13",
"@types/lodash": "^4.17.10",
"@types/react": "^18.2.6",
"@types/react-native-vector-icons": "^6.4.18",
"@types/react-test-renderer": "^18.3.1",
"@typescript-eslint/eslint-plugin": "^8.29.1",
"@typescript-eslint/parser": "^8.29.1",
"babel-plugin-module-resolver": "^5.0.2",
"eslint": "^8.57.1",
"eslint-config-prettier": "^10.1.2",
"eslint-plugin-import": "^2.31.0",
"eslint-plugin-prettier": "^5.2.6",
"eslint-plugin-react": "^7.37.5",
"eslint-plugin-react-native": "^5.0.0",
"husky": "^9.1.7",
"jest": "^29.6.3",
"jscodeshift": "^0.15.2",
"lint-staged": "^15.5.0",
"prettier": "^2.8.8",
"react-native-cli-bump-version": "^1.5.1",
"react-test-renderer": "18.3.1",
"typescript": "5.7.3"
},
"lint-staged": {
"*.{js,jsx,ts,tsx}": [
"prettier --write",
"eslint --fix"
]
},
"engines": {
"node": ">=18"
}
}
"name": "jellify",
"version": "0.11.0",
"private": true,
"scripts": {
"init:ios": "yarn install && yarn pod:install",
"reinstall": "rm -rf ./node_modules && yarn install",
"android": "react-native run-android",
"ios": "react-native run-ios",
"lint": "eslint .",
"start": "react-native start",
"test": "jest",
"clean:ios": "cd ios && pod deintegrate",
"clean:android": "cd android && rm -rf app/ build/",
"pod:install": "cd ios && bundle install && RCT_NEW_ARCH_ENABLED=0 bundle exec pod install",
"pod:install-new-arch": "cd ios && bundle install && RCT_NEW_ARCH_ENABLED=1 bundle exec pod install",
"fastlane:ios:build": "cd ios && bundle exec fastlane build",
"fastlane:ios:match": "cd ios && bundle exec fastlane match development",
"fastlane:ios:beta": "cd ios && bundle exec fastlane beta",
"fastlane:android:build": "cd android && bundle install && bundle exec fastlane build",
"androidBuild": "cd android && ./gradlew clean && ./gradlew assembleRelease && cd .. && echo 'find apk in android/app/build/outputs/apk/release'",
"prepare": "husky",
"format:check": "prettier --check .",
"format": "prettier --write .",
"postinstall": "patch-package"
},
"dependencies": {
"@jellyfin/sdk": "^0.11.0",
"@react-native-community/blur": "^4.4.1",
"@react-native-community/cli": "^15.1.3",
"@react-native-community/netinfo": "^11.4.1",
"@react-native-masked-view/masked-view": "^0.3.2",
"@react-navigation/bottom-tabs": "^7.2.0",
"@react-navigation/material-top-tabs": "^7.2.10",
"@react-navigation/native": "^7.1.6",
"@react-navigation/native-stack": "^7.1.1",
"@react-navigation/stack": "^7.1.0",
"@tamagui/config": "^1.125.34",
"@tamagui/toast": "^1.125.34",
"@tanstack/query-sync-storage-persister": "^5.73.3",
"@tanstack/react-query": "^5.73.3",
"@tanstack/react-query-persist-client": "^5.73.3",
"axios": "^1.7.9",
"bundle": "^2.1.0",
"burnt": "^0.12.2",
"expo": "^52.0.0",
"expo-image": "^2.0.7",
"gem": "^2.4.3",
"invert-color": "^2.0.0",
"jest-expo": "^52.0.6",
"lodash": "^4.17.21",
"npm-bundle": "^3.0.3",
"patch-package": "^8.0.0",
"react": "18.3.1",
"react-freeze": "^1.0.4",
"react-native": "0.77.0",
"react-native-background-actions": "^4.0.1",
"react-native-blurhash": "^2.1.1",
"react-native-boost": "^0.5.5",
"react-native-carplay": "^2.4.1-beta.0",
"react-native-device-info": "^14.0.4",
"react-native-draggable-flatlist": "^4.0.1",
"react-native-fs": "^2.20.0",
"react-native-gesture-handler": "^2.23.0",
"react-native-haptic-feedback": "^2.3.3",
"react-native-mmkv": "^2.12.2",
"react-native-pager-view": "^6.7.0",
"react-native-reanimated": "^3.17.4",
"react-native-safe-area-context": "^5.2.0",
"react-native-screens": "^4.6.0",
"react-native-swipeable-item": "^2.0.9",
"react-native-text-ticker": "^1.14.0",
"react-native-track-player": "^4.1.1",
"react-native-url-polyfill": "^2.0.0",
"react-native-uuid": "^2.0.3",
"react-native-vector-icons": "^10.2.0",
"ruby": "^0.6.1",
"tamagui": "^1.125.34"
},
"devDependencies": {
"@babel/core": "^7.25.2",
"@babel/preset-env": "^7.25.3",
"@babel/runtime": "^7.25.0",
"@react-native-community/cli-platform-android": "15.1.3",
"@react-native-community/cli-platform-ios": "15.1.3",
"@react-native/babel-preset": "0.77.0",
"@react-native/eslint-config": "0.77.0",
"@react-native/metro-config": "0.77.0",
"@react-native/typescript-config": "0.77.0",
"@types/jest": "^29.5.13",
"@types/lodash": "^4.17.10",
"@types/react": "^18.2.6",
"@types/react-native-vector-icons": "^6.4.18",
"@types/react-test-renderer": "^18.3.1",
"@typescript-eslint/eslint-plugin": "^8.29.1",
"@typescript-eslint/parser": "^8.29.1",
"babel-plugin-module-resolver": "^5.0.2",
"eslint": "^8.57.1",
"eslint-config-prettier": "^10.1.2",
"eslint-plugin-import": "^2.31.0",
"eslint-plugin-prettier": "^5.2.6",
"eslint-plugin-react": "^7.37.5",
"eslint-plugin-react-native": "^5.0.0",
"husky": "^9.1.7",
"jest": "^29.6.3",
"jscodeshift": "^0.15.2",
"lint-staged": "^15.5.0",
"prettier": "^2.8.8",
"react-native-cli-bump-version": "^1.5.1",
"react-test-renderer": "18.3.1",
"typescript": "5.7.3"
},
"lint-staged": {
"*.{js,jsx,ts,tsx}": [
"prettier --write",
"eslint --fix"
]
},
"engines": {
"node": ">=18"
}
}

6337
yarn.lock

File diff suppressed because it is too large Load Diff