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,