164 lines
No EOL
5.2 KiB
JavaScript
164 lines
No EOL
5.2 KiB
JavaScript
import { createClient } from '@supabase/supabase-js'
|
|
|
|
const SUPABASE_URL = process.env.SUPABASE_URL
|
|
const SUPABASE_KEY = process.env.SUPABASE_KEY
|
|
const supabase = createClient(SUPABASE_URL, SUPABASE_KEY)
|
|
|
|
const PAGE_SIZE = 1000
|
|
|
|
const fetchAllShows = async () => {
|
|
let shows = []
|
|
let rangeStart = 0
|
|
|
|
while (true) {
|
|
const { data, error } = await supabase
|
|
.from('shows')
|
|
.select(`
|
|
title,
|
|
tmdb_id,
|
|
collected,
|
|
favorite,
|
|
year,
|
|
episodes (
|
|
episode_number,
|
|
season_number,
|
|
last_watched_at
|
|
)
|
|
`)
|
|
.range(rangeStart, rangeStart + PAGE_SIZE - 1)
|
|
|
|
if (error) {
|
|
console.error(error)
|
|
break
|
|
}
|
|
|
|
shows = shows.concat(data)
|
|
|
|
if (data.length < PAGE_SIZE) break
|
|
rangeStart += PAGE_SIZE
|
|
}
|
|
|
|
return shows
|
|
}
|
|
|
|
export default async function () {
|
|
const shows = await fetchAllShows()
|
|
|
|
let episodes = []
|
|
shows.forEach(show => {
|
|
show.episodes.forEach(episode => {
|
|
episodes.push({
|
|
...episode,
|
|
show_title: show['title'],
|
|
show_tmdb_id: show['tmdb_id'],
|
|
collected: show['collected'],
|
|
favorite: show['favorite'],
|
|
year: show['year']
|
|
})
|
|
})
|
|
})
|
|
|
|
episodes.sort((a, b) => new Date(b['last_watched_at']) - new Date(a['last_watched_at']))
|
|
const allEpisodes = episodes
|
|
const recentlyWatchedEpisodes = episodes.slice(0, 75)
|
|
|
|
const formatEpisodeData = (episodes) => {
|
|
const episodeData = []
|
|
const showEpisodesMap = {}
|
|
|
|
episodes.forEach((episode) => {
|
|
const showTitle = episode['show_title']
|
|
const showTmdbId = episode['show_tmdb_id']
|
|
const episodeNumber = episode['episode_number']
|
|
const seasonNumber = episode['season_number']
|
|
const lastWatchedAt = episode['last_watched_at']
|
|
const collected = episode['collected']
|
|
const favorite = episode['favorite']
|
|
|
|
if (!showEpisodesMap[showTmdbId]) {
|
|
showEpisodesMap[showTmdbId] = {
|
|
title: showTitle,
|
|
tmdbId: showTmdbId,
|
|
collected,
|
|
favorite,
|
|
dateAdded: lastWatchedAt,
|
|
lastWatchedAt,
|
|
episodes: []
|
|
}
|
|
}
|
|
|
|
showEpisodesMap[showTmdbId].episodes.push({
|
|
name: showTitle,
|
|
url: `https://www.themoviedb.org/tv/${showTmdbId}/season/${seasonNumber}/episode/${episodeNumber}`,
|
|
subtext: `${showTitle} • S${seasonNumber}E${episodeNumber}`,
|
|
episode: episodeNumber,
|
|
season: seasonNumber,
|
|
tmdbId: showTmdbId,
|
|
type: 'tv',
|
|
image: `https://coryd.dev/media/shows/poster-${showTmdbId}.jpg`,
|
|
backdrop: `https://coryd.dev/media/shows/backdrops/backdrop-${showTmdbId}.jpg`,
|
|
dateAdded: lastWatchedAt,
|
|
lastWatchedAt
|
|
})
|
|
})
|
|
|
|
const sortedShows = Object.values(showEpisodesMap).sort((a, b) => new Date(b['episodes'][0]['lastWatchedAt']) - new Date(a['episodes'][0]['lastWatchedAt']))
|
|
|
|
sortedShows.forEach((show) => {
|
|
const startingEpisode = show['episodes'][show['episodes'].length - 1]['episode']
|
|
const startingSeason = show['episodes'][show['episodes'].length - 1]['season']
|
|
const endingEpisode = show['episodes'][0]['episode']
|
|
const endingSeason = show['episodes'][0]['season']
|
|
|
|
if (show.episodes.length > 1) {
|
|
episodeData.push({
|
|
name: show.title,
|
|
url: `https://www.themoviedb.org/tv/${show['tmdbId']}`,
|
|
subtext: `S${startingSeason}E${startingEpisode} - S${endingSeason}E${endingEpisode}`,
|
|
startingEpisode,
|
|
startingSeason,
|
|
episode: endingEpisode,
|
|
season: endingSeason,
|
|
tmdbId: show['tmdbId'],
|
|
collected: show['collected'],
|
|
favorite: show['favorite'],
|
|
type: 'tv-range',
|
|
image: `https://coryd.dev/media/shows/poster-${show['tmdbId']}.jpg`,
|
|
backdrop: `https://coryd.dev/media/shows/backdrops/backdrop-${show['tmdbId']}.jpg`,
|
|
})
|
|
} else {
|
|
const singleEpisode = show['episodes'][0]
|
|
singleEpisode['collected'] = show['collected']
|
|
singleEpisode['favorite'] = show['favorite']
|
|
episodeData.push(singleEpisode)
|
|
}
|
|
})
|
|
|
|
return episodeData
|
|
}
|
|
|
|
const favoriteShows = shows.filter(show => show['favorite'])
|
|
const collectedShows = shows.filter(show => show['collected'])
|
|
const toWatch = shows.map(show => ({...show, url: `https://www.themoviedb.org/tv/${show['tmdb_id']}`})).filter(show => !show.episodes.some(episode => episode.last_watched_at)).sort((a, b) => a['title'].localeCompare(b['title']))
|
|
|
|
return {
|
|
shows,
|
|
watchHistory: formatEpisodeData(allEpisodes),
|
|
recentlyWatched: formatEpisodeData(recentlyWatchedEpisodes),
|
|
favorites: formatEpisodeData(favoriteShows.flatMap(show => show['episodes'].map(episode => ({
|
|
...episode,
|
|
show_title: show['title'],
|
|
show_tmdb_id: show['tmdb_id'],
|
|
collected: show['collected'],
|
|
favorite: show['favorite']
|
|
})))).sort((a, b) => a['name'].localeCompare(b['name'])),
|
|
collection: formatEpisodeData(collectedShows.flatMap(show => show['episodes'].map(episode => ({
|
|
...episode,
|
|
show_title: show['title'],
|
|
show_tmdb_id: show['tmdb_id'],
|
|
collected: show['collected'],
|
|
favorite: show['favorite']
|
|
})))),
|
|
toWatch
|
|
}
|
|
} |