mirror of
https://github.com/BreizhHardware/Jellystat.git
synced 2026-01-18 16:27:20 +01:00
Added Sync feature to only sync Recently Added Items that don't exist in the database (this will not update existing data), default interval now set to 15 Minutes Renamed existing sync to Full sync (should function exactly the same), default interval now set to 1 day Reworked handling of items no longer on jellyfin. Items are no longer deleted but are now marked as archived so that we can still view their items when looking at Playback Activity. Added options to purge Archived data. This will either purge just the item (including seasons and episodes if its a show) or the item plus all related watch activity
117 lines
4.7 KiB
JavaScript
117 lines
4.7 KiB
JavaScript
exports.up = async function(knex) {
|
|
try
|
|
{
|
|
await knex.schema.raw(`
|
|
DROP FUNCTION IF EXISTS public.fs_most_popular_items(integer, text);
|
|
|
|
CREATE OR REPLACE FUNCTION public.fs_most_popular_items(
|
|
days integer,
|
|
itemtype text)
|
|
RETURNS TABLE(unique_viewers bigint, latest_activity_date timestamp with time zone, "Name" text, "Id" text, "PrimaryImageHash" text, archived boolean)
|
|
LANGUAGE 'plpgsql'
|
|
COST 100
|
|
VOLATILE PARALLEL UNSAFE
|
|
ROWS 1000
|
|
|
|
AS $BODY$
|
|
BEGIN
|
|
RETURN QUERY
|
|
SELECT
|
|
t.unique_viewers,
|
|
t.latest_activity_date,
|
|
i."Name",
|
|
i."Id",
|
|
i."PrimaryImageHash",
|
|
i.archived
|
|
FROM (
|
|
SELECT
|
|
jf_playback_activity."NowPlayingItemId",
|
|
count(DISTINCT jf_playback_activity."UserId") AS unique_viewers,
|
|
latest_activity_date.latest_date AS latest_activity_date
|
|
FROM
|
|
jf_playback_activity
|
|
JOIN (
|
|
SELECT
|
|
jf_playback_activity_1."NowPlayingItemId",
|
|
max(jf_playback_activity_1."ActivityDateInserted") AS latest_date
|
|
FROM
|
|
jf_playback_activity jf_playback_activity_1
|
|
GROUP BY jf_playback_activity_1."NowPlayingItemId"
|
|
) latest_activity_date
|
|
ON jf_playback_activity."NowPlayingItemId" = latest_activity_date."NowPlayingItemId"
|
|
WHERE
|
|
jf_playback_activity."ActivityDateInserted" BETWEEN CURRENT_DATE - MAKE_INTERVAL(days => days) and NOW()
|
|
GROUP BY
|
|
jf_playback_activity."NowPlayingItemId", latest_activity_date.latest_date
|
|
) t
|
|
JOIN jf_library_items i
|
|
ON t."NowPlayingItemId" = i."Id"
|
|
AND i."Type" = itemtype
|
|
ORDER BY
|
|
t.unique_viewers DESC, t.latest_activity_date DESC;
|
|
END;
|
|
|
|
$BODY$;`);
|
|
|
|
}catch (error) {
|
|
console.error(error);
|
|
}
|
|
};
|
|
|
|
exports.down = async function(knex) {
|
|
try {
|
|
await knex.schema.raw(`
|
|
DROP FUNCTION IF EXISTS public.fs_most_popular_items(integer, text);
|
|
|
|
CREATE OR REPLACE FUNCTION public.fs_most_popular_items(
|
|
days integer,
|
|
itemtype text)
|
|
RETURNS TABLE(unique_viewers bigint, latest_activity_date timestamp with time zone, "Name" text, "Id" text, "PrimaryImageHash" text)
|
|
LANGUAGE 'plpgsql'
|
|
COST 100
|
|
VOLATILE PARALLEL UNSAFE
|
|
ROWS 1000
|
|
|
|
AS $BODY$
|
|
BEGIN
|
|
RETURN QUERY
|
|
SELECT
|
|
t.unique_viewers,
|
|
t.latest_activity_date,
|
|
i."Name",
|
|
i."Id",
|
|
i."PrimaryImageHash"
|
|
FROM (
|
|
SELECT
|
|
jf_playback_activity."NowPlayingItemId",
|
|
count(DISTINCT jf_playback_activity."UserId") AS unique_viewers,
|
|
latest_activity_date.latest_date AS latest_activity_date
|
|
FROM
|
|
jf_playback_activity
|
|
JOIN (
|
|
SELECT
|
|
jf_playback_activity_1."NowPlayingItemId",
|
|
max(jf_playback_activity_1."ActivityDateInserted") AS latest_date
|
|
FROM
|
|
jf_playback_activity jf_playback_activity_1
|
|
GROUP BY jf_playback_activity_1."NowPlayingItemId"
|
|
) latest_activity_date
|
|
ON jf_playback_activity."NowPlayingItemId" = latest_activity_date."NowPlayingItemId"
|
|
WHERE
|
|
jf_playback_activity."ActivityDateInserted" BETWEEN CURRENT_DATE - MAKE_INTERVAL(days => days) and NOW()
|
|
GROUP BY
|
|
jf_playback_activity."NowPlayingItemId", latest_activity_date.latest_date
|
|
) t
|
|
JOIN jf_library_items i
|
|
ON t."NowPlayingItemId" = i."Id"
|
|
AND i."Type" = itemtype
|
|
ORDER BY
|
|
t.unique_viewers DESC, t.latest_activity_date DESC;
|
|
END;
|
|
|
|
$BODY$;`);
|
|
} catch (error) {
|
|
console.error(error);
|
|
}
|
|
};
|