diff --git a/frontend/src/Search/Table/ReleaseLinks.css b/frontend/src/Search/Table/ReleaseLinks.css new file mode 100644 index 000000000..d37a082a1 --- /dev/null +++ b/frontend/src/Search/Table/ReleaseLinks.css @@ -0,0 +1,13 @@ +.links { + margin: 0; +} + +.link { + white-space: nowrap; +} + +.linkLabel { + composes: label from '~Components/Label.css'; + + cursor: pointer; +} diff --git a/frontend/src/Search/Table/ReleaseLinks.css.d.ts b/frontend/src/Search/Table/ReleaseLinks.css.d.ts new file mode 100644 index 000000000..9f91f93a4 --- /dev/null +++ b/frontend/src/Search/Table/ReleaseLinks.css.d.ts @@ -0,0 +1,9 @@ +// This file is automatically generated. +// Please do not change this file! +interface CssExports { + 'link': string; + 'linkLabel': string; + 'links': string; +} +export const cssExports: CssExports; +export default cssExports; diff --git a/frontend/src/Search/Table/ReleaseLinks.tsx b/frontend/src/Search/Table/ReleaseLinks.tsx new file mode 100644 index 000000000..38260bc21 --- /dev/null +++ b/frontend/src/Search/Table/ReleaseLinks.tsx @@ -0,0 +1,90 @@ +import React from 'react'; +import Label from 'Components/Label'; +import Link from 'Components/Link/Link'; +import { kinds, sizes } from 'Helpers/Props'; +import { IndexerCategory } from 'Indexer/Indexer'; +import styles from './ReleaseLinks.css'; + +interface ReleaseLinksProps { + categories: IndexerCategory[]; + imdbId?: string; + tmdbId?: number; + tvdbId?: number; + tvMazeId?: number; +} + +function ReleaseLinks(props: ReleaseLinksProps) { + const { categories = [], imdbId, tmdbId, tvdbId, tvMazeId } = props; + + const categoryNames = categories + .filter((item) => item.id < 100000) + .map((c) => c.name); + + return ( +
+ {imdbId ? ( + + + + ) : null} + + {tmdbId ? ( + + + + ) : null} + + {tvdbId ? ( + + + + ) : null} + + {tvMazeId ? ( + + + + ) : null} +
+ ); +} + +export default ReleaseLinks; diff --git a/frontend/src/Search/Table/SearchIndexRow.css b/frontend/src/Search/Table/SearchIndexRow.css index 342092b81..37b59a35d 100644 --- a/frontend/src/Search/Table/SearchIndexRow.css +++ b/frontend/src/Search/Table/SearchIndexRow.css @@ -63,7 +63,7 @@ } .externalLinks { - margin: 0 2px; - width: 22px; - text-align: center; + composes: button from '~Components/Link/IconButton.css'; + + color: var(--textColor); } diff --git a/frontend/src/Search/Table/SearchIndexRow.js b/frontend/src/Search/Table/SearchIndexRow.js index 67c267696..613605e02 100644 --- a/frontend/src/Search/Table/SearchIndexRow.js +++ b/frontend/src/Search/Table/SearchIndexRow.js @@ -16,6 +16,7 @@ import titleCase from 'Utilities/String/titleCase'; import translate from 'Utilities/String/translate'; import CategoryLabel from './CategoryLabel'; import Peers from './Peers'; +import ReleaseLinks from './ReleaseLinks'; import styles from './SearchIndexRow.css'; function getDownloadIcon(isGrabbing, isGrabbed, grabError) { @@ -118,6 +119,10 @@ class SearchIndexRow extends Component { grabs, seeders, leechers, + imdbId, + tmdbId, + tvdbId, + tvMazeId, indexerFlags, columns, isGrabbing, @@ -343,6 +348,32 @@ class SearchIndexRow extends Component { /> : null } + + { + imdbId || tmdbId || tvdbId || tvMazeId ? ( + + } + title={translate('Links')} + body={ + + } + kind={kinds.INVERSE} + position={tooltipPositions.TOP} + /> + ) : null + } ); } @@ -375,6 +406,10 @@ SearchIndexRow.propTypes = { grabs: PropTypes.number, seeders: PropTypes.number, leechers: PropTypes.number, + imdbId: PropTypes.number, + tmdbId: PropTypes.number, + tvdbId: PropTypes.number, + tvMazeId: PropTypes.number, indexerFlags: PropTypes.arrayOf(PropTypes.string).isRequired, columns: PropTypes.arrayOf(PropTypes.object).isRequired, onGrabPress: PropTypes.func.isRequired, diff --git a/src/Prowlarr.Api.V1/Search/ReleaseResource.cs b/src/Prowlarr.Api.V1/Search/ReleaseResource.cs index 49364f445..77f68ca16 100644 --- a/src/Prowlarr.Api.V1/Search/ReleaseResource.cs +++ b/src/Prowlarr.Api.V1/Search/ReleaseResource.cs @@ -23,8 +23,10 @@ namespace Prowlarr.Api.V1.Search public string ReleaseHash { get; set; } public string Title { get; set; } public string SortTitle { get; set; } - public bool Approved { get; set; } public int ImdbId { get; set; } + public int TmdbId { get; set; } + public int TvdbId { get; set; } + public int TvMazeId { get; set; } public DateTime PublishDate { get; set; } public string CommentUrl { get; set; } public string DownloadUrl { get; set; } @@ -80,6 +82,9 @@ namespace Prowlarr.Api.V1.Search Title = releaseInfo.Title, SortTitle = releaseInfo.Title.NormalizeTitle(), ImdbId = releaseInfo.ImdbId, + TmdbId = releaseInfo.TmdbId, + TvdbId = releaseInfo.TvdbId, + TvMazeId = releaseInfo.TvMazeId, PublishDate = releaseInfo.PublishDate, CommentUrl = releaseInfo.CommentUrl, DownloadUrl = releaseInfo.DownloadUrl,