mirror of
https://github.com/Jellify-Music/App.git
synced 2026-05-07 11:59:34 -05:00
building out discover
scrobbling changes building out playlist
This commit is contained in:
@@ -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";
|
||||
|
||||
|
||||
@@ -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>
|
||||
)
|
||||
}
|
||||
@@ -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>
|
||||
)
|
||||
}
|
||||
@@ -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}
|
||||
|
||||
@@ -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}
|
||||
/>
|
||||
)
|
||||
}
|
||||
@@ -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>
|
||||
)
|
||||
}
|
||||
@@ -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
@@ -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
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user