mirror of
https://github.com/sct/overseerr.git
synced 2025-09-17 17:24:35 +02:00
fix(ui): minor fixes (#3036)
* fix(ui): hide available media on person page * fix(ui): set correct label for image cache settings * fix(ui): disable status badge tooltip for collections * fix(ui): replace empty space when no episodes in season * fix: suggested changes * fix(jobs): set watchlist sync to short interval * chore: run i18n:extract * fix: suggested changes
This commit is contained in:

committed by
GitHub

parent
21d20fdfd6
commit
f5c2fc1c20
@@ -372,7 +372,8 @@ export interface TmdbPersonCombinedCredits {
|
|||||||
crew: TmdbPersonCreditCrew[];
|
crew: TmdbPersonCreditCrew[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface TmdbSeasonWithEpisodes extends TmdbTvSeasonResult {
|
export interface TmdbSeasonWithEpisodes
|
||||||
|
extends Omit<TmdbTvSeasonResult, 'episode_count'> {
|
||||||
episodes: TmdbTvEpisodeResult[];
|
episodes: TmdbTvEpisodeResult[];
|
||||||
external_ids: TmdbExternalIds;
|
external_ids: TmdbExternalIds;
|
||||||
}
|
}
|
||||||
|
@@ -63,7 +63,7 @@ export const startJobs = (): void => {
|
|||||||
id: 'plex-watchlist-sync',
|
id: 'plex-watchlist-sync',
|
||||||
name: 'Plex Watchlist Sync',
|
name: 'Plex Watchlist Sync',
|
||||||
type: 'process',
|
type: 'process',
|
||||||
interval: 'long',
|
interval: 'short',
|
||||||
cronSchedule: jobs['plex-watchlist-sync'].schedule,
|
cronSchedule: jobs['plex-watchlist-sync'].schedule,
|
||||||
job: schedule.scheduleJob(jobs['plex-watchlist-sync'].schedule, () => {
|
job: schedule.scheduleJob(jobs['plex-watchlist-sync'].schedule, () => {
|
||||||
logger.info('Starting scheduled job: Plex Watchlist Sync', {
|
logger.info('Starting scheduled job: Plex Watchlist Sync', {
|
||||||
|
@@ -50,7 +50,7 @@ interface Season {
|
|||||||
seasonNumber: number;
|
seasonNumber: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface SeasonWithEpisodes extends Season {
|
export interface SeasonWithEpisodes extends Omit<Season, 'episodeCount'> {
|
||||||
episodes: Episode[];
|
episodes: Episode[];
|
||||||
externalIds: ExternalIds;
|
externalIds: ExternalIds;
|
||||||
}
|
}
|
||||||
@@ -141,7 +141,6 @@ export const mapSeasonWithEpisodes = (
|
|||||||
season: TmdbSeasonWithEpisodes
|
season: TmdbSeasonWithEpisodes
|
||||||
): SeasonWithEpisodes => ({
|
): SeasonWithEpisodes => ({
|
||||||
airDate: season.air_date,
|
airDate: season.air_date,
|
||||||
episodeCount: season.episode_count,
|
|
||||||
episodes: season.episodes.map(mapEpisodeResult),
|
episodes: season.episodes.map(mapEpisodeResult),
|
||||||
externalIds: mapExternalIds(season.external_ids),
|
externalIds: mapExternalIds(season.external_ids),
|
||||||
id: season.id,
|
id: season.id,
|
||||||
|
@@ -1,5 +1,7 @@
|
|||||||
import TheMovieDb from '@server/api/themoviedb';
|
import TheMovieDb from '@server/api/themoviedb';
|
||||||
|
import { MediaStatus } from '@server/constants/media';
|
||||||
import Media from '@server/entity/Media';
|
import Media from '@server/entity/Media';
|
||||||
|
import { getSettings } from '@server/lib/settings';
|
||||||
import logger from '@server/logger';
|
import logger from '@server/logger';
|
||||||
import {
|
import {
|
||||||
mapCastCredits,
|
mapCastCredits,
|
||||||
@@ -34,6 +36,7 @@ personRoutes.get('/:id', async (req, res, next) => {
|
|||||||
|
|
||||||
personRoutes.get('/:id/combined_credits', async (req, res, next) => {
|
personRoutes.get('/:id/combined_credits', async (req, res, next) => {
|
||||||
const tmdb = new TheMovieDb();
|
const tmdb = new TheMovieDb();
|
||||||
|
const settings = getSettings();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const combinedCredits = await tmdb.getPersonCombinedCredits({
|
const combinedCredits = await tmdb.getPersonCombinedCredits({
|
||||||
@@ -41,14 +44,30 @@ personRoutes.get('/:id/combined_credits', async (req, res, next) => {
|
|||||||
language: req.locale ?? (req.query.language as string),
|
language: req.locale ?? (req.query.language as string),
|
||||||
});
|
});
|
||||||
|
|
||||||
const castMedia = await Media.getRelatedMedia(
|
let castMedia = await Media.getRelatedMedia(
|
||||||
combinedCredits.cast.map((result) => result.id)
|
combinedCredits.cast.map((result) => result.id)
|
||||||
);
|
);
|
||||||
|
|
||||||
const crewMedia = await Media.getRelatedMedia(
|
let crewMedia = await Media.getRelatedMedia(
|
||||||
combinedCredits.crew.map((result) => result.id)
|
combinedCredits.crew.map((result) => result.id)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if (settings.main.hideAvailable) {
|
||||||
|
castMedia = castMedia.filter(
|
||||||
|
(media) =>
|
||||||
|
(media.mediaType === 'movie' || media.mediaType === 'tv') &&
|
||||||
|
media.status !== MediaStatus.AVAILABLE &&
|
||||||
|
media.status !== MediaStatus.PARTIALLY_AVAILABLE
|
||||||
|
);
|
||||||
|
|
||||||
|
crewMedia = crewMedia.filter(
|
||||||
|
(media) =>
|
||||||
|
(media.mediaType === 'movie' || media.mediaType === 'tv') &&
|
||||||
|
media.status !== MediaStatus.AVAILABLE &&
|
||||||
|
media.status !== MediaStatus.PARTIALLY_AVAILABLE
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
return res.status(200).json({
|
return res.status(200).json({
|
||||||
cast: combinedCredits.cast
|
cast: combinedCredits.cast
|
||||||
.map((result) =>
|
.map((result) =>
|
||||||
|
@@ -20,7 +20,7 @@ const Tooltip = ({ children, content, tooltipConfig }: TooltipProps) => {
|
|||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{React.cloneElement(children, { ref: setTriggerRef })}
|
{React.cloneElement(children, { ref: setTriggerRef })}
|
||||||
{visible && (
|
{visible && content && (
|
||||||
<div
|
<div
|
||||||
ref={setTooltipRef}
|
ref={setTooltipRef}
|
||||||
{...getTooltipProps({
|
{...getTooltipProps({
|
||||||
|
@@ -309,7 +309,7 @@ const SettingsMain = () => {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="form-row">
|
<div className="form-row">
|
||||||
<label htmlFor="csrfProtection" className="checkbox-label">
|
<label htmlFor="cacheImages" className="checkbox-label">
|
||||||
<span className="mr-2">
|
<span className="mr-2">
|
||||||
{intl.formatMessage(messages.cacheImages)}
|
{intl.formatMessage(messages.cacheImages)}
|
||||||
</span>
|
</span>
|
||||||
|
@@ -77,7 +77,7 @@ const StatusBadge = ({
|
|||||||
mediaType === 'movie' ? globalMessages.movie : globalMessages.tvshow
|
mediaType === 'movie' ? globalMessages.movie : globalMessages.tvshow
|
||||||
),
|
),
|
||||||
});
|
});
|
||||||
} else if (hasPermission(Permission.ADMIN)) {
|
} else if (hasPermission(Permission.ADMIN) && serviceUrl) {
|
||||||
mediaLink = serviceUrl;
|
mediaLink = serviceUrl;
|
||||||
mediaLinkDescription = intl.formatMessage(messages.openinarr, {
|
mediaLinkDescription = intl.formatMessage(messages.openinarr, {
|
||||||
arr: mediaType === 'movie' ? 'Radarr' : 'Sonarr',
|
arr: mediaType === 'movie' ? 'Radarr' : 'Sonarr',
|
||||||
|
@@ -6,6 +6,7 @@ import useSWR from 'swr';
|
|||||||
|
|
||||||
const messages = defineMessages({
|
const messages = defineMessages({
|
||||||
somethingwentwrong: 'Something went wrong while retrieving season data.',
|
somethingwentwrong: 'Something went wrong while retrieving season data.',
|
||||||
|
noepisodes: 'Episode list unavailable.',
|
||||||
});
|
});
|
||||||
|
|
||||||
type SeasonProps = {
|
type SeasonProps = {
|
||||||
@@ -29,7 +30,10 @@ const Season = ({ seasonNumber, tvId }: SeasonProps) => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col justify-center divide-y divide-gray-700">
|
<div className="flex flex-col justify-center divide-y divide-gray-700">
|
||||||
{data.episodes
|
{data.episodes.length === 0 ? (
|
||||||
|
<p>{intl.formatMessage(messages.noepisodes)}</p>
|
||||||
|
) : (
|
||||||
|
data.episodes
|
||||||
.slice()
|
.slice()
|
||||||
.reverse()
|
.reverse()
|
||||||
.map((episode) => {
|
.map((episode) => {
|
||||||
@@ -56,7 +60,8 @@ const Season = ({ seasonNumber, tvId }: SeasonProps) => {
|
|||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
})}
|
})
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
@@ -881,6 +881,7 @@
|
|||||||
"components.TitleCard.mediaerror": "{mediaType} Not Found",
|
"components.TitleCard.mediaerror": "{mediaType} Not Found",
|
||||||
"components.TitleCard.tmdbid": "TMDB ID",
|
"components.TitleCard.tmdbid": "TMDB ID",
|
||||||
"components.TitleCard.tvdbid": "TheTVDB ID",
|
"components.TitleCard.tvdbid": "TheTVDB ID",
|
||||||
|
"components.TvDetails.Season.noepisodes": "Episode list unavailable.",
|
||||||
"components.TvDetails.Season.somethingwentwrong": "Something went wrong while retrieving season data.",
|
"components.TvDetails.Season.somethingwentwrong": "Something went wrong while retrieving season data.",
|
||||||
"components.TvDetails.TvCast.fullseriescast": "Full Series Cast",
|
"components.TvDetails.TvCast.fullseriescast": "Full Series Cast",
|
||||||
"components.TvDetails.TvCrew.fullseriescrew": "Full Series Crew",
|
"components.TvDetails.TvCrew.fullseriescrew": "Full Series Crew",
|
||||||
|
Reference in New Issue
Block a user