@ -1,9 +1,10 @@
import { Router } from 'express' ;
import { Router } from 'express' ;
import gravatarUrl from 'gravatar-url' ;
import gravatarUrl from 'gravatar-url' ;
import { uniqWith } from 'lodash' ;
import { findIndex, sortBy } from 'lodash' ;
import { getRepository , Not } from 'typeorm' ;
import { getRepository , In, Not } from 'typeorm' ;
import PlexTvAPI from '../../api/plextv' ;
import PlexTvAPI from '../../api/plextv' ;
import TautulliAPI from '../../api/tautulli' ;
import TautulliAPI from '../../api/tautulli' ;
import { MediaType } from '../../constants/media' ;
import { UserType } from '../../constants/user' ;
import { UserType } from '../../constants/user' ;
import Media from '../../entity/Media' ;
import Media from '../../entity/Media' ;
import { MediaRequest } from '../../entity/MediaRequest' ;
import { MediaRequest } from '../../entity/MediaRequest' ;
@ -521,7 +522,6 @@ router.get<{ id: string }, UserWatchDataResponse>(
}
}
try {
try {
const mediaRepository = getRepository ( Media ) ;
const user = await getRepository ( User ) . findOneOrFail ( {
const user = await getRepository ( User ) . findOneOrFail ( {
where : { id : Number ( req . params . id ) } ,
where : { id : Number ( req . params . id ) } ,
select : [ 'id' , 'plexId' ] ,
select : [ 'id' , 'plexId' ] ,
@ -532,33 +532,64 @@ router.get<{ id: string }, UserWatchDataResponse>(
const watchStats = await tautulli . getUserWatchStats ( user ) ;
const watchStats = await tautulli . getUserWatchStats ( user ) ;
const watchHistory = await tautulli . getUserWatchHistory ( user ) ;
const watchHistory = await tautulli . getUserWatchHistory ( user ) ;
const media = (
const recentlyWatched = sortBy (
await Promise . all (
await getRepository ( Media ) . find ( {
uniqWith ( watchHistory , ( recordA , recordB ) = >
where : [
recordA . grandparent_rating_key && recordB . grandparent_rating_key
{
? recordA . grandparent_rating_key ===
mediaType : MediaType.MOVIE ,
recordB . grandparent_rating_key
ratingKey : In (
: recordA . parent_rating_key && recordB . parent_rating_key
watchHistory
? recordA . parent_rating_key === recordB . parent_rating_key
. filter ( ( record ) = > record . media_type === 'movie' )
: recordA . rating_key === recordB . rating_key
. map ( ( record ) = > record . rating_key )
)
) ,
. slice ( 0 , 20 )
} ,
. map (
{
async ( record ) = >
mediaType : MediaType.MOVIE ,
await mediaRepository . findOne ( {
ratingKey4k : In (
where : {
watchHistory
ratingKey :
. filter ( ( record ) = > record . media_type === 'movie' )
record . media_type === 'movie'
. map ( ( record ) = > record . rating_key )
? record . rating_key
) ,
: record . grandparent_rating_key ,
} ,
} ,
{
} )
mediaType : MediaType.TV ,
)
ratingKey : In (
)
watchHistory
) . filter ( ( media ) = > ! ! media ) as Media [ ] ;
. filter ( ( record ) = > record . media_type === 'episode' )
. map ( ( record ) = > record . grandparent_rating_key )
) ,
} ,
{
mediaType : MediaType.TV ,
ratingKey4k : In (
watchHistory
. filter ( ( record ) = > record . media_type === 'episode' )
. map ( ( record ) = > record . grandparent_rating_key )
) ,
} ,
] ,
} ) ,
[
( media ) = >
findIndex (
watchHistory ,
( record ) = >
( ! ! media . ratingKey &&
parseInt ( media . ratingKey ) ===
( record . media_type === 'movie'
? record . rating_key
: record . grandparent_rating_key ) ) ||
( ! ! media . ratingKey4k &&
parseInt ( media . ratingKey4k ) ===
( record . media_type === 'movie'
? record . rating_key
: record . grandparent_rating_key ) )
) ,
]
) ;
return res . status ( 200 ) . json ( {
return res . status ( 200 ) . json ( {
recentlyWatched : media ,
recentlyWatched ,
playCount : watchStats.total_plays ,
playCount : watchStats.total_plays ,
} ) ;
} ) ;
} catch ( e ) {
} catch ( e ) {