2021-03-25 14:22:43 +00:00
|
|
|
import {
|
|
|
|
faCloudUploadAlt,
|
|
|
|
faHistory,
|
|
|
|
faSearch,
|
|
|
|
faSync,
|
|
|
|
faToolbox,
|
|
|
|
faUser,
|
|
|
|
faWrench,
|
|
|
|
} from "@fortawesome/free-solid-svg-icons";
|
2021-08-14 12:59:08 +00:00
|
|
|
import React, { FunctionComponent, useState } from "react";
|
2021-08-21 17:30:25 +00:00
|
|
|
import { Alert, Container, Row } from "react-bootstrap";
|
2021-03-25 14:22:43 +00:00
|
|
|
import { Helmet } from "react-helmet";
|
|
|
|
import { Redirect, RouteComponentProps, withRouter } from "react-router-dom";
|
2021-08-21 17:08:39 +00:00
|
|
|
import { useIsGroupTaskRunningWithId } from "../../@modules/task/hooks";
|
2021-05-09 03:42:21 +00:00
|
|
|
import { useMovieBy, useProfileBy } from "../../@redux/hooks";
|
2021-03-25 14:22:43 +00:00
|
|
|
import { MoviesApi, ProvidersApi } from "../../apis";
|
|
|
|
import {
|
|
|
|
ContentHeader,
|
|
|
|
ItemEditorModal,
|
|
|
|
LoadingIndicator,
|
|
|
|
MovieHistoryModal,
|
|
|
|
MovieUploadModal,
|
|
|
|
SubtitleToolModal,
|
|
|
|
useShowModal,
|
|
|
|
} from "../../components";
|
|
|
|
import { ManualSearchModal } from "../../components/modals/ManualSearchModal";
|
2021-08-21 17:08:39 +00:00
|
|
|
import { TaskGroupName } from "../../components/modals/MovieUploadModal";
|
2021-03-25 14:22:43 +00:00
|
|
|
import ItemOverview from "../../generic/ItemOverview";
|
2021-04-23 16:18:09 +00:00
|
|
|
import { RouterEmptyPath } from "../../special-pages/404";
|
2021-08-14 12:59:08 +00:00
|
|
|
import { useOnLoadedOnce } from "../../utilites";
|
2021-03-25 14:22:43 +00:00
|
|
|
import Table from "./table";
|
|
|
|
|
|
|
|
const download = (item: any, result: SearchResultType) => {
|
|
|
|
item = item as Item.Movie;
|
|
|
|
const { language, hearing_impaired, forced, provider, subtitle } = result;
|
|
|
|
return ProvidersApi.downloadMovieSubtitle(item.radarrId, {
|
|
|
|
language,
|
|
|
|
hi: hearing_impaired,
|
|
|
|
forced,
|
|
|
|
provider,
|
|
|
|
subtitle,
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
interface Params {
|
|
|
|
id: string;
|
|
|
|
}
|
|
|
|
|
|
|
|
interface Props extends RouteComponentProps<Params> {}
|
|
|
|
|
|
|
|
const MovieDetailView: FunctionComponent<Props> = ({ match }) => {
|
|
|
|
const id = Number.parseInt(match.params.id);
|
2021-08-14 12:59:08 +00:00
|
|
|
const movie = useMovieBy(id);
|
|
|
|
const item = movie.content;
|
2021-03-25 14:22:43 +00:00
|
|
|
|
2021-08-14 12:59:08 +00:00
|
|
|
const profile = useProfileBy(movie.content?.profileId);
|
2021-05-09 03:42:21 +00:00
|
|
|
|
2021-03-25 14:22:43 +00:00
|
|
|
const showModal = useShowModal();
|
|
|
|
|
|
|
|
const [valid, setValid] = useState(true);
|
|
|
|
|
2021-08-21 17:08:39 +00:00
|
|
|
const hasTask = useIsGroupTaskRunningWithId(TaskGroupName, id);
|
|
|
|
|
2021-08-14 12:59:08 +00:00
|
|
|
useOnLoadedOnce(() => {
|
|
|
|
if (movie.content === null) {
|
2021-03-25 14:22:43 +00:00
|
|
|
setValid(false);
|
|
|
|
}
|
2021-08-14 12:59:08 +00:00
|
|
|
}, movie);
|
2021-03-25 14:22:43 +00:00
|
|
|
|
|
|
|
if (isNaN(id) || !valid) {
|
|
|
|
return <Redirect to={RouterEmptyPath}></Redirect>;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!item) {
|
|
|
|
return <LoadingIndicator></LoadingIndicator>;
|
|
|
|
}
|
|
|
|
|
|
|
|
const allowEdit = item.profileId !== undefined;
|
|
|
|
|
|
|
|
return (
|
|
|
|
<Container fluid>
|
|
|
|
<Helmet>
|
|
|
|
<title>{item.title} - Bazarr (Movies)</title>
|
|
|
|
</Helmet>
|
|
|
|
<ContentHeader>
|
|
|
|
<ContentHeader.Group pos="start">
|
|
|
|
<ContentHeader.AsyncButton
|
|
|
|
icon={faSync}
|
2021-08-21 17:08:39 +00:00
|
|
|
disabled={hasTask}
|
2021-03-25 14:22:43 +00:00
|
|
|
promise={() =>
|
|
|
|
MoviesApi.action({ action: "scan-disk", radarrid: item.radarrId })
|
|
|
|
}
|
|
|
|
>
|
|
|
|
Scan Disk
|
|
|
|
</ContentHeader.AsyncButton>
|
|
|
|
<ContentHeader.AsyncButton
|
|
|
|
icon={faSearch}
|
2021-08-21 17:08:39 +00:00
|
|
|
disabled={item.profileId === null || hasTask}
|
2021-03-25 14:22:43 +00:00
|
|
|
promise={() =>
|
|
|
|
MoviesApi.action({
|
|
|
|
action: "search-missing",
|
|
|
|
radarrid: item.radarrId,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
>
|
|
|
|
Search
|
|
|
|
</ContentHeader.AsyncButton>
|
|
|
|
<ContentHeader.Button
|
|
|
|
icon={faUser}
|
2021-08-21 17:08:39 +00:00
|
|
|
disabled={item.profileId === null || hasTask}
|
2021-03-25 14:22:43 +00:00
|
|
|
onClick={() => showModal<Item.Movie>("manual-search", item)}
|
|
|
|
>
|
|
|
|
Manual
|
|
|
|
</ContentHeader.Button>
|
|
|
|
<ContentHeader.Button
|
|
|
|
icon={faHistory}
|
|
|
|
onClick={() => showModal("history", item)}
|
|
|
|
>
|
|
|
|
History
|
|
|
|
</ContentHeader.Button>
|
|
|
|
<ContentHeader.Button
|
|
|
|
icon={faToolbox}
|
2021-08-21 17:08:39 +00:00
|
|
|
disabled={hasTask}
|
2021-03-25 14:22:43 +00:00
|
|
|
onClick={() => showModal("tools", [item])}
|
|
|
|
>
|
|
|
|
Tools
|
|
|
|
</ContentHeader.Button>
|
|
|
|
</ContentHeader.Group>
|
|
|
|
|
|
|
|
<ContentHeader.Group pos="end">
|
|
|
|
<ContentHeader.Button
|
2021-08-21 17:08:39 +00:00
|
|
|
disabled={!allowEdit || item.profileId === null || hasTask}
|
2021-03-25 14:22:43 +00:00
|
|
|
icon={faCloudUploadAlt}
|
|
|
|
onClick={() => showModal("upload", item)}
|
|
|
|
>
|
|
|
|
Upload
|
|
|
|
</ContentHeader.Button>
|
|
|
|
<ContentHeader.Button
|
|
|
|
icon={faWrench}
|
2021-08-21 17:08:39 +00:00
|
|
|
disabled={hasTask}
|
2021-03-25 14:22:43 +00:00
|
|
|
onClick={() => showModal("edit", item)}
|
|
|
|
>
|
|
|
|
Edit Movie
|
|
|
|
</ContentHeader.Button>
|
|
|
|
</ContentHeader.Group>
|
|
|
|
</ContentHeader>
|
2021-08-21 17:30:25 +00:00
|
|
|
<Row>
|
|
|
|
<Alert
|
|
|
|
className="w-100 m-0 py-2"
|
|
|
|
show={hasTask}
|
|
|
|
style={{ borderRadius: 0 }}
|
|
|
|
variant="light"
|
|
|
|
>
|
|
|
|
A background task is running for this movie, actions are unavailable
|
|
|
|
</Alert>
|
|
|
|
</Row>
|
2021-03-25 14:22:43 +00:00
|
|
|
<Row>
|
|
|
|
<ItemOverview item={item} details={[]}></ItemOverview>
|
|
|
|
</Row>
|
|
|
|
<Row>
|
2021-05-09 03:42:21 +00:00
|
|
|
<Table movie={item} profile={profile}></Table>
|
2021-03-25 14:22:43 +00:00
|
|
|
</Row>
|
|
|
|
<ItemEditorModal
|
|
|
|
modalKey="edit"
|
|
|
|
submit={(form) => MoviesApi.modify(form)}
|
|
|
|
></ItemEditorModal>
|
2021-05-08 14:25:29 +00:00
|
|
|
<SubtitleToolModal modalKey="tools" size="lg"></SubtitleToolModal>
|
2021-03-25 14:22:43 +00:00
|
|
|
<MovieHistoryModal modalKey="history" size="lg"></MovieHistoryModal>
|
|
|
|
<MovieUploadModal modalKey="upload" size="lg"></MovieUploadModal>
|
|
|
|
<ManualSearchModal
|
|
|
|
modalKey="manual-search"
|
|
|
|
onSelect={download}
|
|
|
|
></ManualSearchModal>
|
|
|
|
</Container>
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
|
|
|
export default withRouter(MovieDetailView);
|