mirror of
https://github.com/sct/overseerr.git
synced 2025-09-17 17:24:35 +02:00
feat: plex deep links for iOS devices (#2680)
This commit is contained in:
@@ -145,6 +145,9 @@ class Media {
|
|||||||
public plexUrl?: string;
|
public plexUrl?: string;
|
||||||
public plexUrl4k?: string;
|
public plexUrl4k?: string;
|
||||||
|
|
||||||
|
public iOSPlexUrl?: string;
|
||||||
|
public iOSPlexUrl4k?: string;
|
||||||
|
|
||||||
public tautulliUrl?: string;
|
public tautulliUrl?: string;
|
||||||
public tautulliUrl4k?: string;
|
public tautulliUrl4k?: string;
|
||||||
|
|
||||||
@@ -164,6 +167,8 @@ class Media {
|
|||||||
this.ratingKey
|
this.ratingKey
|
||||||
}`;
|
}`;
|
||||||
|
|
||||||
|
this.iOSPlexUrl = `plex://preplay/?metadataKey=%2Flibrary%2Fmetadata%2F${this.ratingKey}&server=${machineId}`;
|
||||||
|
|
||||||
if (tautulliUrl) {
|
if (tautulliUrl) {
|
||||||
this.tautulliUrl = `${tautulliUrl}/info?rating_key=${this.ratingKey}`;
|
this.tautulliUrl = `${tautulliUrl}/info?rating_key=${this.ratingKey}`;
|
||||||
}
|
}
|
||||||
@@ -176,6 +181,8 @@ class Media {
|
|||||||
this.ratingKey4k
|
this.ratingKey4k
|
||||||
}`;
|
}`;
|
||||||
|
|
||||||
|
this.iOSPlexUrl4k = `plex://preplay/?metadataKey=%2Flibrary%2Fmetadata%2F${this.ratingKey4k}&server=${machineId}`;
|
||||||
|
|
||||||
if (tautulliUrl) {
|
if (tautulliUrl) {
|
||||||
this.tautulliUrl4k = `${tautulliUrl}/info?rating_key=${this.ratingKey4k}`;
|
this.tautulliUrl4k = `${tautulliUrl}/info?rating_key=${this.ratingKey4k}`;
|
||||||
}
|
}
|
||||||
|
@@ -113,6 +113,30 @@ const MovieDetails: React.FC<MovieDetailsProps> = ({ movie }) => {
|
|||||||
setShowManager(router.query.manage == '1' ? true : false);
|
setShowManager(router.query.manage == '1' ? true : false);
|
||||||
}, [router.query.manage]);
|
}, [router.query.manage]);
|
||||||
|
|
||||||
|
const [plexUrl, setPlexUrl] = useState(data?.mediaInfo?.plexUrl);
|
||||||
|
const [plexUrl4k, setPlexUrl4k] = useState(data?.mediaInfo?.plexUrl4k);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (data) {
|
||||||
|
if (
|
||||||
|
/iPad|iPhone|iPod/.test(navigator.userAgent) ||
|
||||||
|
(navigator.userAgent === 'MacIntel' && navigator.maxTouchPoints > 1)
|
||||||
|
) {
|
||||||
|
setPlexUrl(data.mediaInfo?.iOSPlexUrl);
|
||||||
|
setPlexUrl4k(data.mediaInfo?.iOSPlexUrl4k);
|
||||||
|
} else {
|
||||||
|
setPlexUrl(data.mediaInfo?.plexUrl);
|
||||||
|
setPlexUrl4k(data.mediaInfo?.plexUrl4k);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, [
|
||||||
|
data,
|
||||||
|
data?.mediaInfo?.iOSPlexUrl,
|
||||||
|
data?.mediaInfo?.iOSPlexUrl4k,
|
||||||
|
data?.mediaInfo?.plexUrl,
|
||||||
|
data?.mediaInfo?.plexUrl4k,
|
||||||
|
]);
|
||||||
|
|
||||||
if (!data && !error) {
|
if (!data && !error) {
|
||||||
return <LoadingSpinner />;
|
return <LoadingSpinner />;
|
||||||
}
|
}
|
||||||
@@ -125,32 +149,31 @@ const MovieDetails: React.FC<MovieDetailsProps> = ({ movie }) => {
|
|||||||
const mediaLinks: PlayButtonLink[] = [];
|
const mediaLinks: PlayButtonLink[] = [];
|
||||||
|
|
||||||
if (
|
if (
|
||||||
data.mediaInfo?.plexUrl &&
|
plexUrl &&
|
||||||
hasPermission([Permission.REQUEST, Permission.REQUEST_MOVIE], {
|
hasPermission([Permission.REQUEST, Permission.REQUEST_MOVIE], {
|
||||||
type: 'or',
|
type: 'or',
|
||||||
})
|
})
|
||||||
) {
|
) {
|
||||||
mediaLinks.push({
|
mediaLinks.push({
|
||||||
text: intl.formatMessage(messages.playonplex),
|
text: intl.formatMessage(messages.playonplex),
|
||||||
url: data.mediaInfo?.plexUrl,
|
url: plexUrl,
|
||||||
svg: <PlayIcon />,
|
svg: <PlayIcon />,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
settings.currentSettings.movie4kEnabled &&
|
settings.currentSettings.movie4kEnabled &&
|
||||||
data.mediaInfo?.plexUrl4k &&
|
plexUrl4k &&
|
||||||
hasPermission([Permission.REQUEST_4K, Permission.REQUEST_4K_MOVIE], {
|
hasPermission([Permission.REQUEST_4K, Permission.REQUEST_4K_MOVIE], {
|
||||||
type: 'or',
|
type: 'or',
|
||||||
})
|
})
|
||||||
) {
|
) {
|
||||||
mediaLinks.push({
|
mediaLinks.push({
|
||||||
text: intl.formatMessage(messages.play4konplex),
|
text: intl.formatMessage(messages.play4konplex),
|
||||||
url: data.mediaInfo?.plexUrl4k,
|
url: plexUrl4k,
|
||||||
svg: <PlayIcon />,
|
svg: <PlayIcon />,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
const trailerUrl = data.relatedVideos
|
const trailerUrl = data.relatedVideos
|
||||||
?.filter((r) => r.type === 'Trailer')
|
?.filter((r) => r.type === 'Trailer')
|
||||||
.sort((a, b) => a.size - b.size)
|
.sort((a, b) => a.size - b.size)
|
||||||
|
@@ -106,6 +106,30 @@ const TvDetails: React.FC<TvDetailsProps> = ({ tv }) => {
|
|||||||
setShowManager(router.query.manage == '1' ? true : false);
|
setShowManager(router.query.manage == '1' ? true : false);
|
||||||
}, [router.query.manage]);
|
}, [router.query.manage]);
|
||||||
|
|
||||||
|
const [plexUrl, setPlexUrl] = useState(data?.mediaInfo?.plexUrl);
|
||||||
|
const [plexUrl4k, setPlexUrl4k] = useState(data?.mediaInfo?.plexUrl4k);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (data) {
|
||||||
|
if (
|
||||||
|
/iPad|iPhone|iPod/.test(navigator.userAgent) ||
|
||||||
|
(navigator.userAgent === 'MacIntel' && navigator.maxTouchPoints > 1)
|
||||||
|
) {
|
||||||
|
setPlexUrl(data.mediaInfo?.iOSPlexUrl);
|
||||||
|
setPlexUrl4k(data.mediaInfo?.iOSPlexUrl4k);
|
||||||
|
} else {
|
||||||
|
setPlexUrl(data.mediaInfo?.plexUrl);
|
||||||
|
setPlexUrl4k(data.mediaInfo?.plexUrl4k);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, [
|
||||||
|
data,
|
||||||
|
data?.mediaInfo?.iOSPlexUrl,
|
||||||
|
data?.mediaInfo?.iOSPlexUrl4k,
|
||||||
|
data?.mediaInfo?.plexUrl,
|
||||||
|
data?.mediaInfo?.plexUrl4k,
|
||||||
|
]);
|
||||||
|
|
||||||
if (!data && !error) {
|
if (!data && !error) {
|
||||||
return <LoadingSpinner />;
|
return <LoadingSpinner />;
|
||||||
}
|
}
|
||||||
@@ -116,29 +140,24 @@ const TvDetails: React.FC<TvDetailsProps> = ({ tv }) => {
|
|||||||
|
|
||||||
const mediaLinks: PlayButtonLink[] = [];
|
const mediaLinks: PlayButtonLink[] = [];
|
||||||
|
|
||||||
if (
|
if (plexUrl) {
|
||||||
data.mediaInfo?.plexUrl &&
|
|
||||||
hasPermission([Permission.REQUEST, Permission.REQUEST_TV], {
|
|
||||||
type: 'or',
|
|
||||||
})
|
|
||||||
) {
|
|
||||||
mediaLinks.push({
|
mediaLinks.push({
|
||||||
text: intl.formatMessage(messages.playonplex),
|
text: intl.formatMessage(messages.playonplex),
|
||||||
url: data.mediaInfo?.plexUrl,
|
url: plexUrl,
|
||||||
svg: <PlayIcon />,
|
svg: <PlayIcon />,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
settings.currentSettings.series4kEnabled &&
|
settings.currentSettings.series4kEnabled &&
|
||||||
data.mediaInfo?.plexUrl4k &&
|
plexUrl4k &&
|
||||||
hasPermission([Permission.REQUEST_4K, Permission.REQUEST_4K_TV], {
|
hasPermission([Permission.REQUEST_4K, Permission.REQUEST_4K_TV], {
|
||||||
type: 'or',
|
type: 'or',
|
||||||
})
|
})
|
||||||
) {
|
) {
|
||||||
mediaLinks.push({
|
mediaLinks.push({
|
||||||
text: intl.formatMessage(messages.play4konplex),
|
text: intl.formatMessage(messages.play4konplex),
|
||||||
url: data.mediaInfo?.plexUrl4k,
|
url: plexUrl4k,
|
||||||
svg: <PlayIcon />,
|
svg: <PlayIcon />,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user