From 97d044c614f98485e0fcfd7580e88f4d915bcbcf Mon Sep 17 00:00:00 2001 From: Violet Caulfield Date: Tue, 27 Aug 2024 06:38:33 -0500 Subject: [PATCH] Laying out project structure and adding basic backend functionality --- App.tsx | 1 + README.md | 1 + api/jellyfinservice.ts | 59 ++++ api/models/ArtistModel.ts | 11 + api/queries/artists.ts | 16 ++ babel.config.js | 5 + package-lock.json | 591 +++++++++++++++++++++++++++++++++++++- package.json | 12 +- 8 files changed, 686 insertions(+), 10 deletions(-) create mode 100644 api/jellyfinservice.ts create mode 100644 api/models/ArtistModel.ts create mode 100644 api/queries/artists.ts diff --git a/App.tsx b/App.tsx index 125fe1b9..ce676b3a 100644 --- a/App.tsx +++ b/App.tsx @@ -24,6 +24,7 @@ import { LearnMoreLinks, ReloadInstructions, } from 'react-native/Libraries/NewAppScreen'; +import { JellyfinService } from './api/jellyfinservice'; type SectionProps = PropsWithChildren<{ title: string; diff --git a/README.md b/README.md index 23c62b77..3bd8486b 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ A music player for Jellyfin powered by React Native [Jellyfin SDK](https://typescript-sdk.jellyfin.org/) [Tanstack Query](https://tanstack.com/query/latest/docs/framework/react/react-native) [React Native Track Player](https://github.com/doublesymmetry/react-native-track-player) +[React Native Keychain](https://github.com/oblador/react-native-keychain) ### Logging [GlitchTip](https://glitchtip.com/) captures anonymous logging if and only if the user opts into it. This can be toggled at anytime \ No newline at end of file diff --git a/api/jellyfinservice.ts b/api/jellyfinservice.ts new file mode 100644 index 00000000..a35f5423 --- /dev/null +++ b/api/jellyfinservice.ts @@ -0,0 +1,59 @@ +import { Api, Jellyfin } from "@jellyfin/sdk"; +import { getItemsApi } from "@jellyfin/sdk/lib/utils/api/items-api" +import { getDeviceNameSync, getUniqueIdSync } from "react-native-device-info"; +import { ArtistModel } from "./models/ArtistModel"; +import * as Keychain from "react-native-keychain" + +let clientName : string = require('root-require')('./package.json').name +let clientVersion : string = require('root-require')('./package.json').version + +export class JellyfinService { + + private static _instance: JellyfinService; + + private api?: Api; + + // TODO: This should read in auth details when constructed? + private constructor() {}; + + private client : Jellyfin = new Jellyfin({ + clientInfo: { + name: clientName, + version: clientVersion + }, + deviceInfo: { + name: getDeviceNameSync(), + id: getUniqueIdSync() + } + }) + + public static get instance() { + + // TODO: Determine this makes singleton correctly + return this._instance || (this._instance = new this()) + } + + public initConnection(serverUrl: string) : void { + JellyfinService.instance.api = JellyfinService.instance.client.createApi(serverUrl); + } + + public storeAuthDetails(serverUrl: string, username: string, sessionToken: string) : Promise { + // Set sessionToken in API + JellyfinService.instance.api = JellyfinService.instance.client.createApi(serverUrl, sessionToken); + + // Store in encrypted local storage + return Keychain.setInternetCredentials(serverUrl, username, sessionToken) + + // TODO: Refresh on reopen? + } + + public async getArtistById(artistJellyfinId: string) : Promise { + + return getItemsApi(JellyfinService.instance.api!) + .getItems({ ids: [artistJellyfinId]}) + + // TODO: Error handling here + .then((response) => response.data.Items!.at(0)!) + .then(item => new ArtistModel(item)) + } +} \ No newline at end of file diff --git a/api/models/ArtistModel.ts b/api/models/ArtistModel.ts new file mode 100644 index 00000000..9405c823 --- /dev/null +++ b/api/models/ArtistModel.ts @@ -0,0 +1,11 @@ +import { BaseItemDto } from "@jellyfin/sdk/lib/generated-client/models"; + +export class ArtistModel { + + name?: string | undefined | null; + + constructor(itemDto : BaseItemDto) { + + this.name = itemDto.Name + } +} \ No newline at end of file diff --git a/api/queries/artists.ts b/api/queries/artists.ts new file mode 100644 index 00000000..f7f2b1ba --- /dev/null +++ b/api/queries/artists.ts @@ -0,0 +1,16 @@ +import { BaseItemDto } from '@jellyfin/sdk/lib/generated-client/models/base-item-dto' +import { useQuery, UseQueryResult } from '@tanstack/react-query' +import { JellyfinService } from '../jellyfinservice' +import { ArtistModel } from '../models/ArtistModel' + +namespace ArtistQueries { + + export function fetchArtistById(artistJellyfinId: string) : UseQueryResult { + return useQuery({ + queryKey: ['artists', artistJellyfinId], + queryFn: async () => { + return JellyfinService.instance.getArtistById(artistJellyfinId); + } + }) + } +} diff --git a/babel.config.js b/babel.config.js index f7b3da3b..f54cb058 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,3 +1,8 @@ module.exports = { presets: ['module:@react-native/babel-preset'], + plugins: [ + + // react-native-reanimated/plugin has to be listed last + 'react-native-reanimated/plugin', + ] }; diff --git a/package-lock.json b/package-lock.json index ee8947bd..d2711f66 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,24 @@ { - "name": "Jellify", + "name": "jellify", "version": "0.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "Jellify", + "name": "jellify", "version": "0.0.1", "dependencies": { + "@animatereactnative/marquee": "^0.2.0", "@jellyfin/sdk": "^0.10.0", + "@sentry/react-native": "^5.30.0", + "@tanstack/react-query": "^5.52.1", "react": "18.3.1", - "react-native": "0.75.2" + "react-native": "0.75.2", + "react-native-device-info": "^11.1.0", + "react-native-keychain": "^8.2.0", + "react-native-reanimated": "^3.15.0", + "react-native-track-player": "^4.1.1", + "react-native-vector-icons": "^10.1.0" }, "devDependencies": { "@babel/core": "^7.20.0", @@ -46,6 +54,20 @@ "node": ">=6.0.0" } }, + "node_modules/@animatereactnative/marquee": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@animatereactnative/marquee/-/marquee-0.2.0.tgz", + "integrity": "sha512-pwdKnBr+0JzaKZ4eNmfiALQxNCxN0XkDyW0h+h90x5tSYaMAn/0H9lpF7nNum2JR7LYDgp0hfEl7Y1uVRRKdjA==", + "license": "MIT", + "engines": { + "node": ">= 16.0.0" + }, + "peerDependencies": { + "react": "*", + "react-native": "*", + "react-native-reanimated": ">=2.2.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", @@ -4679,6 +4701,348 @@ } } }, + "node_modules/@sentry-internal/feedback": { + "version": "7.119.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-7.119.0.tgz", + "integrity": "sha512-om8TkAU5CQGO8nkmr7qsSBVkP+/vfeS4JgtW3sjoTK0fhj26+DljR6RlfCGWtYQdPSP6XV7atcPTjbSnsmG9FQ==", + "license": "MIT", + "dependencies": { + "@sentry/core": "7.119.0", + "@sentry/types": "7.119.0", + "@sentry/utils": "7.119.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@sentry-internal/replay-canvas": { + "version": "7.119.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-7.119.0.tgz", + "integrity": "sha512-NL02VQx6ekPxtVRcsdp1bp5Tb5w6vnfBKSIfMKuDRBy5A10Uc3GSoy/c3mPyHjOxB84452A+xZSx6bliEzAnuA==", + "license": "MIT", + "dependencies": { + "@sentry/core": "7.119.0", + "@sentry/replay": "7.119.0", + "@sentry/types": "7.119.0", + "@sentry/utils": "7.119.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@sentry-internal/tracing": { + "version": "7.119.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.119.0.tgz", + "integrity": "sha512-oKdFJnn+56f0DHUADlL8o9l8jTib3VDLbWQBVkjD9EprxfaCwt2m8L5ACRBdQ8hmpxCEo4I8/6traZ7qAdBUqA==", + "license": "MIT", + "dependencies": { + "@sentry/core": "7.119.0", + "@sentry/types": "7.119.0", + "@sentry/utils": "7.119.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/babel-plugin-component-annotate": { + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-2.20.1.tgz", + "integrity": "sha512-4mhEwYTK00bIb5Y9UWIELVUfru587Vaeg0DQGswv4aIRHIiMKLyNqCEejaaybQ/fNChIZOKmvyqXk430YVd7Qg==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/@sentry/browser": { + "version": "7.119.0", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.119.0.tgz", + "integrity": "sha512-WwmW1Y4D764kVGeKmdsNvQESZiAn9t8LmCWO0ucBksrjL2zw9gBPtOpRcO6l064sCLeSxxzCN+kIxhRm1gDFEA==", + "license": "MIT", + "dependencies": { + "@sentry-internal/feedback": "7.119.0", + "@sentry-internal/replay-canvas": "7.119.0", + "@sentry-internal/tracing": "7.119.0", + "@sentry/core": "7.119.0", + "@sentry/integrations": "7.119.0", + "@sentry/replay": "7.119.0", + "@sentry/types": "7.119.0", + "@sentry/utils": "7.119.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/cli": { + "version": "2.31.2", + "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.31.2.tgz", + "integrity": "sha512-2aKyUx6La2P+pplL8+2vO67qJ+c1C79KYWAyQBE0JIT5kvKK9JpwtdNoK1F0/2mRpwhhYPADCz3sVIRqmL8cQQ==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.7", + "progress": "^2.0.3", + "proxy-from-env": "^1.1.0", + "which": "^2.0.2" + }, + "bin": { + "sentry-cli": "bin/sentry-cli" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@sentry/cli-darwin": "2.31.2", + "@sentry/cli-linux-arm": "2.31.2", + "@sentry/cli-linux-arm64": "2.31.2", + "@sentry/cli-linux-i686": "2.31.2", + "@sentry/cli-linux-x64": "2.31.2", + "@sentry/cli-win32-i686": "2.31.2", + "@sentry/cli-win32-x64": "2.31.2" + } + }, + "node_modules/@sentry/cli-darwin": { + "version": "2.31.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.31.2.tgz", + "integrity": "sha512-BHA/JJXj1dlnoZQdK4efRCtHRnbBfzbIZUKAze7oRR1RfNqERI84BVUQeKateD3jWSJXQfEuclIShc61KOpbKw==", + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-linux-arm": { + "version": "2.31.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.31.2.tgz", + "integrity": "sha512-W8k5mGYYZz/I/OxZH65YAK7dCkQAl+wbuoASGOQjUy5VDgqH0QJ8kGJufXvFPM+f3ZQGcKAnVsZ6tFqZXETBAw==", + "cpu": [ + "arm" + ], + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "linux", + "freebsd" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-linux-arm64": { + "version": "2.31.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.31.2.tgz", + "integrity": "sha512-FLVKkJ/rWvPy/ka7OrUdRW63a/z8HYI1Gt8Pr6rWs50hb7YJja8lM8IO10tYmcFE/tODICsnHO9HTeUg2g2d1w==", + "cpu": [ + "arm64" + ], + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "linux", + "freebsd" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-linux-i686": { + "version": "2.31.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.31.2.tgz", + "integrity": "sha512-A64QtzaPi3MYFpZ+Fwmi0mrSyXgeLJ0cWr4jdeTGrzNpeowSteKgd6tRKU+LVq0k5shKE7wdnHk+jXnoajulMA==", + "cpu": [ + "x86", + "ia32" + ], + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "linux", + "freebsd" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-linux-x64": { + "version": "2.31.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.31.2.tgz", + "integrity": "sha512-YL/r+15R4mOEiU3mzn7iFQOeFEUB6KxeKGTTrtpeOGynVUGIdq4nV5rHow5JDbIzOuBS3SpOmcIMluvo1NCh0g==", + "cpu": [ + "x64" + ], + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "linux", + "freebsd" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-win32-i686": { + "version": "2.31.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.31.2.tgz", + "integrity": "sha512-Az/2bmW+TFI059RE0mSBIxTBcoShIclz7BDebmIoCkZ+retrwAzpmBnBCDAHow+Yi43utOow+3/4idGa2OxcLw==", + "cpu": [ + "x86", + "ia32" + ], + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-win32-x64": { + "version": "2.31.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.31.2.tgz", + "integrity": "sha512-XIzyRnJu539NhpFa+JYkotzVwv3NrZ/4GfHB/JWA2zReRvsk39jJG8D5HOmm0B9JA63QQT7Dt39RW8g3lkmb6w==", + "cpu": [ + "x64" + ], + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/core": { + "version": "7.119.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.119.0.tgz", + "integrity": "sha512-CS2kUv9rAJJEjiRat6wle3JATHypB0SyD7pt4cpX5y0dN5dZ1JrF57oLHRMnga9fxRivydHz7tMTuBhSSwhzjw==", + "license": "MIT", + "dependencies": { + "@sentry/types": "7.119.0", + "@sentry/utils": "7.119.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/hub": { + "version": "7.119.0", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-7.119.0.tgz", + "integrity": "sha512-183h5B/rZosLxpB+ZYOvFdHk0rwZbKskxqKFtcyPbDAfpCUgCass41UTqyxF6aH1qLgCRxX8GcLRF7frIa/SOg==", + "license": "MIT", + "dependencies": { + "@sentry/core": "7.119.0", + "@sentry/types": "7.119.0", + "@sentry/utils": "7.119.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/integrations": { + "version": "7.119.0", + "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-7.119.0.tgz", + "integrity": "sha512-OHShvtsRW0A+ZL/ZbMnMqDEtJddPasndjq+1aQXw40mN+zeP7At/V1yPZyFaURy86iX7Ucxw5BtmzuNy7hLyTA==", + "license": "MIT", + "dependencies": { + "@sentry/core": "7.119.0", + "@sentry/types": "7.119.0", + "@sentry/utils": "7.119.0", + "localforage": "^1.8.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/react": { + "version": "7.119.0", + "resolved": "https://registry.npmjs.org/@sentry/react/-/react-7.119.0.tgz", + "integrity": "sha512-cf8Cei+qdSA26gx+IMAuc/k44PeBImNzIpXi3930SLhUe44ypT5OZ/44L6xTODHZzTIyMSJPduf59vT2+eW9yg==", + "license": "MIT", + "dependencies": { + "@sentry/browser": "7.119.0", + "@sentry/core": "7.119.0", + "@sentry/types": "7.119.0", + "@sentry/utils": "7.119.0", + "hoist-non-react-statics": "^3.3.2" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "react": "15.x || 16.x || 17.x || 18.x" + } + }, + "node_modules/@sentry/react-native": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/react-native/-/react-native-5.30.0.tgz", + "integrity": "sha512-6p2o+x5V9Hfe+6UPbMsMrEYPqv39HnkHbz7fZ6YGVqbcdmoXlztFJYtWUZgUCxAaq53L/LPbfmwJwxsdaPxGKg==", + "license": "MIT", + "dependencies": { + "@sentry/babel-plugin-component-annotate": "2.20.1", + "@sentry/browser": "7.119.0", + "@sentry/cli": "2.31.2", + "@sentry/core": "7.119.0", + "@sentry/hub": "7.119.0", + "@sentry/integrations": "7.119.0", + "@sentry/react": "7.119.0", + "@sentry/types": "7.119.0", + "@sentry/utils": "7.119.0" + }, + "bin": { + "sentry-expo-upload-sourcemaps": "scripts/expo-upload-sourcemaps.js" + }, + "peerDependencies": { + "expo": ">=49.0.0", + "react": ">=17.0.0", + "react-native": ">=0.65.0" + }, + "peerDependenciesMeta": { + "expo": { + "optional": true + } + } + }, + "node_modules/@sentry/replay": { + "version": "7.119.0", + "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.119.0.tgz", + "integrity": "sha512-BnNsYL+X5I4WCH6wOpY6HQtp4MgVt0NVlhLUsEyrvMUiTs0bPkDBrulsgZQBUKJsbOr3l9nHrFoNVB/0i6WNLA==", + "license": "MIT", + "dependencies": { + "@sentry-internal/tracing": "7.119.0", + "@sentry/core": "7.119.0", + "@sentry/types": "7.119.0", + "@sentry/utils": "7.119.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@sentry/types": { + "version": "7.119.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.119.0.tgz", + "integrity": "sha512-27qQbutDBPKGbuJHROxhIWc1i0HJaGLA90tjMu11wt0E4UNxXRX+UQl4Twu68v4EV3CPvQcEpQfgsViYcXmq+w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/utils": { + "version": "7.119.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.119.0.tgz", + "integrity": "sha512-ZwyXexWn2ZIe2bBoYnXJVPc2esCSbKpdc6+0WJa8eutXfHq3FRKg4ohkfCBpfxljQGEfP1+kfin945lA21Ka+A==", + "license": "MIT", + "dependencies": { + "@sentry/types": "7.119.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@sideway/address": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", @@ -4724,6 +5088,32 @@ "@sinonjs/commons": "^3.0.0" } }, + "node_modules/@tanstack/query-core": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.52.0.tgz", + "integrity": "sha512-U1DOEgltjUwalN6uWYTewSnA14b+tE7lSylOiASKCAO61ENJeCq9VVD/TXHA6O5u9+6v5+UgGYBSccTKDoyMqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.52.1", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.52.1.tgz", + "integrity": "sha512-soyn4dNIUZ8US8NaPVXv06gkZFHaZnPfKWPDjRJjFRW3Y7WZ0jx72eT6zhw3VQlkMPysmXye8l35ewPHspKgbQ==", + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "5.52.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" + } + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -5157,6 +5547,18 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -8568,6 +8970,21 @@ "hermes-estree": "0.22.0" } }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -8600,6 +9017,19 @@ "node": ">= 0.8" } }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -8654,6 +9084,12 @@ "node": ">=16.x" } }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "license": "MIT" + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -11289,6 +11725,15 @@ "node": ">= 0.8.0" } }, + "node_modules/lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, "node_modules/lighthouse-logger": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", @@ -11320,6 +11765,15 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "license": "MIT" }, + "node_modules/localforage": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", + "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", + "license": "Apache-2.0", + "dependencies": { + "lie": "3.1.1" + } + }, "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -12348,7 +12802,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -12875,6 +13328,15 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "license": "MIT" }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/promise": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", @@ -12901,7 +13363,6 @@ "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", @@ -12913,15 +13374,13 @@ "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true, "license": "MIT" }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/punycode": { "version": "2.3.1", @@ -13087,6 +13546,122 @@ } } }, + "node_modules/react-native-device-info": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/react-native-device-info/-/react-native-device-info-11.1.0.tgz", + "integrity": "sha512-hzXJSObJdezEz0hF7MAJ3tGeoesuQWenXXt9mrQR9Mjb8kXpZ09rqSsZ/quNpJdZpQ3rYiFa3/0GFG5KNn9PBg==", + "license": "MIT", + "peerDependencies": { + "react-native": "*" + } + }, + "node_modules/react-native-keychain": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/react-native-keychain/-/react-native-keychain-8.2.0.tgz", + "integrity": "sha512-SkRtd9McIl1Ss2XSWNLorG+KMEbgeVqX+gV+t3u1EAAqT8q2/OpRmRbxpneT2vnb/dMhiU7g6K/pf3nxLUXRvA==", + "license": "MIT" + }, + "node_modules/react-native-reanimated": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-3.15.0.tgz", + "integrity": "sha512-yGxOyYAAu/5CyjonM2SgsM5sviiiK8HiHL9jT1bKfRxMLnNX9cFP8/UXRkbMT7ZXIfOlCvNFR0AqnphpuXIPVA==", + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-arrow-functions": "^7.0.0-0", + "@babel/plugin-transform-class-properties": "^7.0.0-0", + "@babel/plugin-transform-classes": "^7.0.0-0", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.0.0-0", + "@babel/plugin-transform-optional-chaining": "^7.0.0-0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0-0", + "@babel/plugin-transform-template-literals": "^7.0.0-0", + "@babel/plugin-transform-unicode-regex": "^7.0.0-0", + "@babel/preset-typescript": "^7.16.7", + "convert-source-map": "^2.0.0", + "invariant": "^2.2.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0", + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-track-player": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/react-native-track-player/-/react-native-track-player-4.1.1.tgz", + "integrity": "sha512-E5N/eK/+HtAVJUAzXpm1cWz8ROheV9jb0TI6h2bM+333U+DWibTTnT2T1122FkCoXLXIYavtm2FR2if+5jH8cA==", + "license": "Apache-2.0", + "funding": { + "url": "https://github.com/doublesymmetry/react-native-track-player?sponsor=1" + }, + "peerDependencies": { + "react": ">=16.8.6", + "react-native": ">=0.60.0-rc.2", + "react-native-windows": ">=0.63.0", + "shaka-player": "^4.7.9" + }, + "peerDependenciesMeta": { + "react-native-windows": { + "optional": true + }, + "shaka-player": { + "optional": true + } + } + }, + "node_modules/react-native-vector-icons": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/react-native-vector-icons/-/react-native-vector-icons-10.1.0.tgz", + "integrity": "sha512-fdQjCHIdoXmRoTZ5gvN1FmT4sGLQ2wmQiNZHKJQUYnE2tkIwjGnxNch+6Nd4lHAACvMWO7LOzBNot2u/zlOmkw==", + "license": "MIT", + "dependencies": { + "prop-types": "^15.7.2", + "yargs": "^16.1.1" + }, + "bin": { + "fa-upgrade.sh": "bin/fa-upgrade.sh", + "fa5-upgrade": "bin/fa5-upgrade.sh", + "fa6-upgrade": "bin/fa6-upgrade.sh", + "generate-icon": "bin/generate-icon.js" + } + }, + "node_modules/react-native-vector-icons/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/react-native-vector-icons/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/react-native-vector-icons/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, "node_modules/react-native/node_modules/@jest/types": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", diff --git a/package.json b/package.json index d4fe452e..2d89ec80 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "Jellify", + "name": "jellify", "version": "0.0.1", "private": true, "scripts": { @@ -10,9 +10,17 @@ "test": "jest" }, "dependencies": { + "@animatereactnative/marquee": "^0.2.0", "@jellyfin/sdk": "^0.10.0", + "@sentry/react-native": "^5.30.0", + "@tanstack/react-query": "^5.52.1", "react": "18.3.1", - "react-native": "0.75.2" + "react-native": "0.75.2", + "react-native-device-info": "^11.1.0", + "react-native-keychain": "^8.2.0", + "react-native-reanimated": "^3.15.0", + "react-native-track-player": "^4.1.1", + "react-native-vector-icons": "^10.1.0" }, "devDependencies": { "@babel/core": "^7.20.0",