building out discover

scrobbling changes

building out playlist
This commit is contained in:
Violet Caulfield
2025-01-09 09:47:05 -06:00
parent 9067c2c972
commit 0a550005d6
9 changed files with 101 additions and 34 deletions
+1 -3
View File
@@ -1,7 +1,6 @@
import { SafeAreaView } from "react-native-safe-area-context";
import { StackParamList } from "../types";
import { NativeStackNavigationProp } from "@react-navigation/native-stack";
import { ScrollView, Separator, View, YStack, XStack } from "tamagui";
import { ScrollView, YStack, XStack } from "tamagui";
import { CachedImage } from "@georstat/react-native-image-cache";
import { getImageApi } from "@jellyfin/sdk/lib/utils/api";
import { useApiClientContext } from "../jellyfin-api-provider";
@@ -11,7 +10,6 @@ import { H4, H5, Text } from "../Global/helpers/text";
import { FlatList } from "react-native";
import { useAlbumTracks } from "../../api/queries/album";
import { usePlayerContext } from "../../player/provider";
import { mapDtoToTrack } from "../../helpers/mappings";
import RunTimeTicks from "../Global/helpers/runtimeticks";
import Track from "../Global/components/track";
+21 -7
View File
@@ -1,12 +1,26 @@
import { SafeAreaView } from "react-native-safe-area-context";
import { ScrollView } from "tamagui";
import { createNativeStackNavigator } from "@react-navigation/native-stack";
import { StackParamList } from "../types";
import Index from "./screens";
export const DiscoverStack = createNativeStackNavigator<StackParamList>();
export function Discover(): React.JSX.Element {
return (
<SafeAreaView>
<ScrollView>
</ScrollView>
</SafeAreaView>
<DiscoverStack.Navigator
id="Discover"
initialRouteName="Discover"
screenOptions={{
}}>
<DiscoverStack.Screen
name="Discover"
component={Index}
options={{
headerLargeTitle: true
}}
/>
</DiscoverStack.Navigator>
)
}
+13
View File
@@ -0,0 +1,13 @@
import React from "react";
import { SafeAreaView } from "react-native-safe-area-context";
import { ScrollView } from "tamagui";
export default function Index() : React.JSX.Element {
return (
<SafeAreaView>
<ScrollView>
</ScrollView>
</SafeAreaView>
)
}
+4 -1
View File
@@ -3,7 +3,10 @@ import Artist from "../../Artist/component";
import { NativeStackNavigationProp } from "@react-navigation/native-stack";
import { StackParamList } from "../../types";
export function HomeArtistScreen({ route, navigation } : { route: RouteProp<StackParamList, "Artist">, navigation: NativeStackNavigationProp<StackParamList>}): React.JSX.Element {
export function HomeArtistScreen({ route, navigation } : {
route: RouteProp<StackParamList, "Artist">,
navigation: NativeStackNavigationProp<StackParamList>
}): React.JSX.Element {
return (
<Artist
artistId={route.params.artistId}
+17
View File
@@ -0,0 +1,17 @@
import Playlist from "@/components/Playlist/component";
import { StackParamList } from "@/components/types";
import { RouteProp } from "@react-navigation/native";
import { NativeStackNavigationProp } from "@react-navigation/native-stack";
import React from "react";
export function PlaylistScreen({ route, navigation }: {
route: RouteProp<StackParamList, "Playlist">,
navigation: NativeStackNavigationProp<StackParamList>
}) : React.JSX.Element {
return (
<Playlist
playlist={route.params.playlist}
navigation={navigation}
/>
)
}
+17
View File
@@ -0,0 +1,17 @@
import { BaseItemDto } from "@jellyfin/sdk/lib/generated-client/models";
import { NativeStackNavigationProp } from "@react-navigation/native-stack";
import { StackParamList } from "../types";
import { ScrollView } from "tamagui";
interface PlaylistProps {
playlist: BaseItemDto;
navigation: NativeStackNavigationProp<StackParamList>
}
export default function Playlist(props: PlaylistProps): React.JSX.Element {
return (
<ScrollView>
</ScrollView>
)
}
+9 -1
View File
@@ -4,6 +4,7 @@ import { NativeStackScreenProps } from "@react-navigation/native-stack";
export type StackParamList = {
Home: undefined;
Discover: undefined;
Artist: {
artistId: string,
artistName: string
@@ -11,10 +12,17 @@ export type StackParamList = {
Album: {
album: BaseItemDto
};
Playlist: {
playlist: BaseItemDto
}
}
export type ProvidedHomeProps = NativeStackScreenProps<StackParamList, 'Home'>;
export type DiscoverProps = NativeStackScreenProps<StackParamList, 'Discover'>;
export type HomeArtistProps = NativeStackScreenProps<StackParamList, 'Artist'>;
export type HomeAlbumProps = NativeStackScreenProps<StackParamList, 'Album'>;
export type HomeAlbumProps = NativeStackScreenProps<StackParamList, 'Album'>;
export type HomePlaylistProps = NativeStackScreenProps<StackParamList, "Playlist">;
+14 -13
View File
@@ -6,7 +6,7 @@ import { convertSecondsToRunTimeTicks } from "@/helpers/runtimeticks";
export async function handlePlaybackState(sessionId: string, playstateApi: PlaystateApi, track: JellifyTrack, state: State) {
switch (state) {
case (State.Playing) : {
return playstateApi.reportPlaybackStart({
await playstateApi.reportPlaybackStart({
playbackStartInfo: {
SessionId: sessionId,
ItemId: track.ItemId
@@ -17,7 +17,7 @@ export async function handlePlaybackState(sessionId: string, playstateApi: Plays
case (State.Ended) :
case (State.Paused) :
case (State.Stopped) : {
return playstateApi.reportPlaybackStopped({
await playstateApi.reportPlaybackStopped({
playbackStopInfo: {
SessionId: sessionId,
ItemId: track.ItemId
@@ -26,7 +26,7 @@ export async function handlePlaybackState(sessionId: string, playstateApi: Plays
}
default : {
return;
}
}
}
@@ -34,7 +34,7 @@ export async function handlePlaybackState(sessionId: string, playstateApi: Plays
export async function handlePlaybackStopped(sessionId: string, playstateApi: PlaystateApi, track: JellifyTrack) {
console.debug("Stopping playback for session");
return playstateApi.reportPlaybackStopped({
await playstateApi.reportPlaybackStopped({
playbackStopInfo: {
SessionId: sessionId,
ItemId: track.ItemId
@@ -45,7 +45,7 @@ export async function handlePlaybackStopped(sessionId: string, playstateApi: Pla
export async function handlePlaybackStarted(sessionId: string, playstateApi: PlaystateApi, track: JellifyTrack) {
console.debug("Starting playback for session");
return playstateApi.reportPlaybackStart({
await playstateApi.reportPlaybackStart({
playbackStartInfo: {
SessionId: sessionId,
ItemId: track.ItemId
@@ -54,13 +54,14 @@ export async function handlePlaybackStarted(sessionId: string, playstateApi: Pla
}
export async function handlePlaybackProgressUpdated(sessionId: string, playstateApi: PlaystateApi, track: JellifyTrack, progress: Progress) {
console.debug("Reporting playback progress");
return playstateApi.reportPlaybackProgress({
playbackProgressInfo: {
SessionId: sessionId,
ItemId: track.ItemId,
PositionTicks: convertSecondsToRunTimeTicks(progress.position)
}
});
if (progress.duration - progress.position === 5)
await playstateApi.reportPlaybackStopped({
playbackStopInfo: {
SessionId: sessionId,
ItemId: track.ItemId
}
})
else
return
}
+5 -9
View File
@@ -91,23 +91,19 @@ const PlayerContextInitializer = () => {
switch (event.type) {
case (Event.PlaybackState) : {
handlePlaybackState(sessionId, playStateApi, await TrackPlayer.getActiveTrack() as JellifyTrack, event.state);
break;
}
// case (Event.PlaybackProgressUpdated) : {
// handlePlaybackProgressUpdated(sessionId, playStateApi, nowPlaying!, event);
// break;
// }
case (Event.PlaybackProgressUpdated) : {
handlePlaybackProgressUpdated(sessionId, playStateApi, nowPlaying!, event);
break;
}
case (Event.PlaybackActiveTrackChanged) : {
console.debug("Active track changed");
if ((await TrackPlayer.getActiveTrack() as JellifyTrack | undefined) !== nowPlaying) {
handlePlaybackStopped(sessionId, playStateApi, nowPlaying!);
if ((await TrackPlayer.getActiveTrack() as JellifyTrack | undefined) !== nowPlaying) {
// Sleep to prevent flickering in players when skipping to a queue index
sleep(250).then(async () => {
setNowPlaying(await TrackPlayer.getActiveTrack() as JellifyTrack | undefined);