mirror of
https://github.com/sct/overseerr.git
synced 2025-09-17 17:24:35 +02:00
fix(tautulli): fetch additional user history as necessary to return 20 unique media (#2446)
* fix(tautulli): fetch additional user history as necessary to return 20 unique media * refactor: rename var for clarity * refactor: make single DB query for recently watched media * fix: resolve query builder weirdness * refactor: use find instead of qb * refactor: minor refactor * fix: also find 4K rating keys
This commit is contained in:
@@ -1,9 +1,10 @@
|
||||
import { Router } from 'express';
|
||||
import gravatarUrl from 'gravatar-url';
|
||||
import { uniqWith } from 'lodash';
|
||||
import { getRepository, Not } from 'typeorm';
|
||||
import { findIndex, sortBy } from 'lodash';
|
||||
import { getRepository, In, Not } from 'typeorm';
|
||||
import PlexTvAPI from '../../api/plextv';
|
||||
import TautulliAPI from '../../api/tautulli';
|
||||
import { MediaType } from '../../constants/media';
|
||||
import { UserType } from '../../constants/user';
|
||||
import Media from '../../entity/Media';
|
||||
import { MediaRequest } from '../../entity/MediaRequest';
|
||||
@@ -521,7 +522,6 @@ router.get<{ id: string }, UserWatchDataResponse>(
|
||||
}
|
||||
|
||||
try {
|
||||
const mediaRepository = getRepository(Media);
|
||||
const user = await getRepository(User).findOneOrFail({
|
||||
where: { id: Number(req.params.id) },
|
||||
select: ['id', 'plexId'],
|
||||
@@ -532,33 +532,64 @@ router.get<{ id: string }, UserWatchDataResponse>(
|
||||
const watchStats = await tautulli.getUserWatchStats(user);
|
||||
const watchHistory = await tautulli.getUserWatchHistory(user);
|
||||
|
||||
const media = (
|
||||
await Promise.all(
|
||||
uniqWith(watchHistory, (recordA, recordB) =>
|
||||
recordA.grandparent_rating_key && recordB.grandparent_rating_key
|
||||
? recordA.grandparent_rating_key ===
|
||||
recordB.grandparent_rating_key
|
||||
: recordA.parent_rating_key && recordB.parent_rating_key
|
||||
? recordA.parent_rating_key === recordB.parent_rating_key
|
||||
: recordA.rating_key === recordB.rating_key
|
||||
)
|
||||
.slice(0, 20)
|
||||
.map(
|
||||
async (record) =>
|
||||
await mediaRepository.findOne({
|
||||
where: {
|
||||
ratingKey:
|
||||
record.media_type === 'movie'
|
||||
? record.rating_key
|
||||
: record.grandparent_rating_key,
|
||||
},
|
||||
})
|
||||
)
|
||||
)
|
||||
).filter((media) => !!media) as Media[];
|
||||
const recentlyWatched = sortBy(
|
||||
await getRepository(Media).find({
|
||||
where: [
|
||||
{
|
||||
mediaType: MediaType.MOVIE,
|
||||
ratingKey: In(
|
||||
watchHistory
|
||||
.filter((record) => record.media_type === 'movie')
|
||||
.map((record) => record.rating_key)
|
||||
),
|
||||
},
|
||||
{
|
||||
mediaType: MediaType.MOVIE,
|
||||
ratingKey4k: In(
|
||||
watchHistory
|
||||
.filter((record) => record.media_type === 'movie')
|
||||
.map((record) => record.rating_key)
|
||||
),
|
||||
},
|
||||
{
|
||||
mediaType: MediaType.TV,
|
||||
ratingKey: In(
|
||||
watchHistory
|
||||
.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({
|
||||
recentlyWatched: media,
|
||||
recentlyWatched,
|
||||
playCount: watchStats.total_plays,
|
||||
});
|
||||
} catch (e) {
|
||||
|
Reference in New Issue
Block a user