From c1a40cb556d8ffb75d29ae0e939037ab5dcfa10b Mon Sep 17 00:00:00 2001
From: Geoff S <33594517+ZeroCoolGOS@users.noreply.github.com>
Date: Mon, 29 Mar 2021 19:08:34 -0700
Subject: [PATCH] v2.11.4 Community Updates**\ Enhancement: Images to the
bottom of Now Showing for resolution, sound format, and aspect ratio (Issue
#74) - Create GIMP template file for all icons for 'Presented' mode - Add
support for resolution display - Add support for rating display - TODO: -
Add support for sound format - Add support for aspect ratio - Add
support for changing 'font color' for 'PRESENTED IN' text - Add icons for
720p & 1080p (explicit) - BUG(s): - If playing a lower quality video the
'current' video resolution is not displayed.
---
GitVersion.yml | 2 +-
assets/plexmovieposter/PMPDLib.php | 165 ++++++++++++++++++
assets/plexmovieposter/PlexLib.php | 131 ++++++++++++--
.../images/icons/mediaInfo/4K_HDR.png | Bin 0 -> 11201 bytes
.../images/icons/mediaInfo/Dolby_Atmos.png | Bin 0 -> 19086 bytes
.../images/icons/mediaInfo/Dolby_TRUEHD71.png | Bin 0 -> 12741 bytes
.../images/icons/mediaInfo/Radio_2.39_1.png | Bin 0 -> 14275 bytes
.../images/icons/mediaInfo/Rated-G.png | Bin 0 -> 21767 bytes
.../images/icons/mediaInfo/Rated-NA.png | Bin 0 -> 20162 bytes
.../images/icons/mediaInfo/Rated-NC17.png | Bin 0 -> 19179 bytes
.../images/icons/mediaInfo/Rated-PG.png | Bin 0 -> 21509 bytes
.../images/icons/mediaInfo/Rated-PG13.png | Bin 0 -> 25734 bytes
.../images/icons/mediaInfo/Rated-R.png | Bin 0 -> 19692 bytes
.../images/icons/mediaInfo/Rated-TV14.png | Bin 0 -> 26039 bytes
.../images/icons/mediaInfo/Rated-TVMA.png | Bin 0 -> 26372 bytes
.../images/icons/mediaInfo/Rated-TVPG.png | Bin 0 -> 24481 bytes
.../images/icons/mediaInfo/Rated-XXX.png | Bin 0 -> 16164 bytes
.../images/icons/mediaInfo/Res-HD1080.png | Bin 0 -> 8870 bytes
.../images/icons/mediaInfo/Res-HD720.png | Bin 0 -> 9298 bytes
.../images/icons/mediaInfo/Res-SD.png | Bin 0 -> 17528 bytes
.../images/icons/mediaInfo/Res-UHD4K.png | Bin 0 -> 7757 bytes
.../images/icons/mediaInfo/Res-UHD8K.png | Bin 0 -> 9275 bytes
.../icons/mediaInfo/_MediaInfo_Template.xcf | Bin 0 -> 3159188 bytes
assets/plexmovieposter/setData.php | 4 +-
build/DockerSetup.config | 2 +-
build/UpdateVersion.py | 2 +-
config.php | 4 +-
docs/ChangeLogs.md | 17 +-
getData.php | 44 +++--
settings/PMPInfo.php | 2 +-
settings/comingSoon.php | 7 +-
settings/nowShowing.php | 7 +-
32 files changed, 352 insertions(+), 35 deletions(-)
create mode 100644 assets/plexmovieposter/images/icons/mediaInfo/4K_HDR.png
create mode 100644 assets/plexmovieposter/images/icons/mediaInfo/Dolby_Atmos.png
create mode 100644 assets/plexmovieposter/images/icons/mediaInfo/Dolby_TRUEHD71.png
create mode 100644 assets/plexmovieposter/images/icons/mediaInfo/Radio_2.39_1.png
create mode 100644 assets/plexmovieposter/images/icons/mediaInfo/Rated-G.png
create mode 100644 assets/plexmovieposter/images/icons/mediaInfo/Rated-NA.png
create mode 100644 assets/plexmovieposter/images/icons/mediaInfo/Rated-NC17.png
create mode 100644 assets/plexmovieposter/images/icons/mediaInfo/Rated-PG.png
create mode 100644 assets/plexmovieposter/images/icons/mediaInfo/Rated-PG13.png
create mode 100644 assets/plexmovieposter/images/icons/mediaInfo/Rated-R.png
create mode 100644 assets/plexmovieposter/images/icons/mediaInfo/Rated-TV14.png
create mode 100644 assets/plexmovieposter/images/icons/mediaInfo/Rated-TVMA.png
create mode 100644 assets/plexmovieposter/images/icons/mediaInfo/Rated-TVPG.png
create mode 100644 assets/plexmovieposter/images/icons/mediaInfo/Rated-XXX.png
create mode 100644 assets/plexmovieposter/images/icons/mediaInfo/Res-HD1080.png
create mode 100644 assets/plexmovieposter/images/icons/mediaInfo/Res-HD720.png
create mode 100644 assets/plexmovieposter/images/icons/mediaInfo/Res-SD.png
create mode 100644 assets/plexmovieposter/images/icons/mediaInfo/Res-UHD4K.png
create mode 100644 assets/plexmovieposter/images/icons/mediaInfo/Res-UHD8K.png
create mode 100644 assets/plexmovieposter/images/icons/mediaInfo/_MediaInfo_Template.xcf
diff --git a/GitVersion.yml b/GitVersion.yml
index 1225abe..d984e63 100644
--- a/GitVersion.yml
+++ b/GitVersion.yml
@@ -3,4 +3,4 @@ ignore:
sha: []
merge-message-formats: {}
mode: ContinuousDelivery
-next-version: 2.11.3
+next-version: 2.11.4
diff --git a/assets/plexmovieposter/PMPDLib.php b/assets/plexmovieposter/PMPDLib.php
index 7f94d05..8ece9cf 100644
--- a/assets/plexmovieposter/PMPDLib.php
+++ b/assets/plexmovieposter/PMPDLib.php
@@ -285,6 +285,171 @@ function SetFullScreenMode($SetMode = FALSE) {
}
}
+function PMPD_DisplayMediaInfo(){
+ // Global Variables - Input
+ global $mediaContentRating, $mediaVideoCodec, $mediaVideoResolution, $mediaAudioCodec, $mediaAudioChannelLayout;
+
+ // Global Variables - Output
+ global $bottomLine;
+
+ $iconPath = "assets/plexmovieposter/images/icons/mediaInfo";
+
+ $title = "PRESENTED IN";
+
+ $iconSizeWidth = "20%";
+
+ // https://www.spectrum.net/support/tv/tv-and-movie-ratings-descriptions/
+
+ switch ($mediaContentRating) {
+ case "TV-Y":
+ $contentRatingProfile = "$iconPath/Rated-TVY.png";
+ break;
+ case "TV-Y7":
+ $contentRatingProfile = "$iconPath/Rated-TVY7.png";
+ break;
+ case "TV-Y7 FV":
+ $contentRatingProfile = "$iconPath/Rated-TVY7FV.png";
+ break;
+ case "G":
+ $contentRatingProfile = "$iconPath/Rated-G.png";
+ break;
+ case "TV-G":
+ $contentRatingProfile = "$iconPath/Rated-TVG.png";
+ break;
+ case "PG":
+ $contentRatingProfile = "$iconPath/Rated-PG.png";
+ break;
+ case "TV-PG":
+ $contentRatingProfile = "$iconPath/Rated-TVPG.png";
+ break;
+ case "PG-13":
+ $contentRatingProfile = "$iconPath/Rated-PG13.png";
+ break;
+ case "TV-14":
+ $contentRatingProfile = "$iconPath/Rated-TV14.png";
+ break;
+ case "R":
+ $contentRatingProfile = "$iconPath/Rated-R.png";
+ break;
+ case "TV-MA":
+ $contentRatingProfile = "$iconPath/Rated-TVMA.png";
+ break;
+ case "NC-17":
+ $contentRatingProfile = "$iconPath/Rated-NC17.png";
+ break;
+ case "XXX":
+ $contentRatingProfile = "$iconPath/Rated-XXX.png";
+ break;
+ default:
+ $contentRatingProfile = "$iconPath/Rated-NA.png";
+ break;
+ }
+
+ switch ($mediaVideoResolution) {
+ case "sd":
+ $videoResolutionProfile = "$iconPath/Res-SD.png";
+ break;
+ case "720":
+ $videoResolutionProfile = "$iconPath/Res-HD720.png";
+ break;
+ case "720p":
+ $videoResolutionProfile = "$iconPath/Res-HD720.png";
+ break;
+ case "1080":
+ $videoResolutionProfile = "$iconPath/Res-HD1080.png";
+ break;
+ case "1080p":
+ $videoResolutionProfile = "$iconPath/Res-HD1080.png";
+ break;
+ case "4k":
+ $videoResolutionProfile = "$iconPath/Res-UHD4K.png";
+ break;
+ case "8k":
+ $videoResolutionProfile = "$iconPath/Res-UHD8K.png";
+ break;
+ default:
+ $videoResolutionProfile = "";
+ break;
+ }
+
+ switch ($mediaVideoCodec) {
+ case "h264":
+ $videoCodecProfile = "";
+ break;
+ case "mpeg4":
+ $videoCodecProfile = "";
+ break;
+ case "hevc":
+ $videoCodecProfile = "";
+ break;
+ default:
+ $videoCodecProfile = "";
+ break;
+ }
+
+ switch ($mediaAudioCodec) {
+ case "aac":
+ $audioCodecProfile = "";
+ break;
+ case "ac3":
+ $audioCodecProfile = "";
+ break;
+ case "eac3":
+ $audioCodecProfile = "";
+ break;
+ case "dca":
+ $audioCodecProfile = "";
+ break;
+ case "dca-ma":
+ $audioCodecProfile = "";
+ break;
+ case "mp3":
+ $audioCodecProfile = "";
+ break;
+ case "opus":
+ $audioCodecProfile = "";
+ break;
+ default:
+ $audioCodecProfile = "";
+ break;
+ }
+
+ switch ($mediaAudioChannelLayout) {
+ case "mono":
+ $audioChannelLayoutProfile = "";
+ break;
+ case "stereo":
+ $audioChannelLayoutProfile = "";
+ break;
+ case "5.1":
+ $audioChannelLayoutProfile = "";
+ break;
+ case "7.1":
+ $audioChannelLayoutProfile = "$iconPath/Dolby_TRUEHD71.png";
+ break;
+ default:
+ $audioCodecProfile = "";
+ break;
+ }
+
+ $profileHeader = "";
+ $titleProfile = "
";
+
+ $mediaProfiles = "$videoResolutionProfile $videoCodecProfile $audioChannelLayoutProfile $contentRatingProfile";
+
+ $masterProfile = "$profileHeader $titleProfile $mediaProfiles $profileFooter";
+
+ $bottomLine = $masterProfile;
+}
+
function PMPD_SetResults() {
// Global Variables - Input
diff --git a/assets/plexmovieposter/PlexLib.php b/assets/plexmovieposter/PlexLib.php
index 71db7a6..6438359 100644
--- a/assets/plexmovieposter/PlexLib.php
+++ b/assets/plexmovieposter/PlexLib.php
@@ -318,7 +318,7 @@ function plex_metadata_audioCodec($mediaType = "episode", $isPlayingMode = FALSE
// Notes: audioCodec
//
- // contentRating
+ // Audio Codec
switch ($mediaType) {
case "episode":
$media_metadata_name = 'audioCodec';
@@ -345,12 +345,12 @@ function plex_metadata_audioCodec($mediaType = "episode", $isPlayingMode = FALSE
$media_logClass = "PLEX_getTVMetadata";
}
- if ($isPlayingMode == TRUE) {
+ // if ($isPlayingMode == TRUE) {
$mediaAudioCodec = $clients->Media[$media_metadata_name];
- }
- else {
- $mediaAudioCodec = "N/A";
- }
+ // }
+ // else {
+ // $mediaAudioCodec = "N/A";
+ // }
// $media_MetadataID_TMP = preg_split("#/#", $mediaAudioCodec);
// $media_MetadataID = $media_MetadataID_TMP[3];
@@ -360,6 +360,58 @@ function plex_metadata_audioCodec($mediaType = "episode", $isPlayingMode = FALSE
pmp_Logging("$media_logClass", "\tmediaAudioCodec @ $mediaType ($media_metadata_name) - \"$mediaAudioCodec\"");
}
+function plex_metadata_audioChannelLayout($mediaType = "episode", $isPlayingMode = FALSE) {
+ global $clients, $isPlaying;
+ global $mediaAudioChannelLayout, $mediaAudioChannelLayout_MetadataID;
+
+ $media_MetadataID_STR = "";
+
+ // Notes: audioChannelLayout
+ //
+
+ // Audio Codec
+ switch ($mediaType) {
+ case "episode":
+ $media_metadata_name = 'audioChannelLayout';
+ $media_logClass = "PLEX_getTVMetadata";
+ break;
+ case "season":
+ $media_metadata_name = 'audioChannelLayout';
+ $media_logClass = "PLEX_getTVMetadata";
+ break;
+ case "series":
+ $media_metadata_name = 'audioChannelLayout';
+ $media_logClass = "PLEX_getTVMetadata";
+ break;
+ case "movie":
+ $media_metadata_name = 'audioChannelLayout';
+ $media_logClass = "PLEX_getMovieMetadata";
+ break;
+ case "track":
+ $media_metadata_name = 'audioChannelLayout';
+ $media_logClass = "PLEX_getMusicMetadata";
+ break;
+ default:
+ $media_metadata_name = 'audioChannelLayout';
+ $media_logClass = "PLEX_getTVMetadata";
+ }
+
+ // if ($isPlayingMode == TRUE) {
+ $rootElement = $clients->Media->Part->Stream[0];
+ $mediaAudioChannelLayout = $rootElement[$media_metadata_name];
+ // }
+ // else {
+ // $mediaAudioChannelLayout = "N/A";
+ // }
+
+ // $media_MetadataID_TMP = preg_split("#/#", $mediaAudioChannelLayout);
+ // $media_MetadataID = $media_MetadataID_TMP[3];
+ // $media_MetadataID_STR = "(metadata ID: $media_MetadataID)";
+
+ // $mediaAudioChannelLayout_MetadataID = $media_MetadataID;
+ pmp_Logging("$media_logClass", "\tmediaAudioChannelLayout @ $mediaType ($media_metadata_name) - \"$mediaAudioChannelLayout\"");
+}
+
function plex_metadata_videoCodec($mediaType = "episode", $isPlayingMode = FALSE) {
global $clients, $isPlaying;
global $mediaVideoCodec, $mediaVideoCodec_MetadataID;
@@ -396,12 +448,12 @@ function plex_metadata_videoCodec($mediaType = "episode", $isPlayingMode = FALSE
$media_logClass = "PLEX_getTVMetadata";
}
- if ($isPlayingMode == TRUE) {
+ // if ($isPlayingMode == TRUE) {
$mediaVideoCodec = $clients->Media[$media_metadata_name];
- }
- else {
- $mediaVideoCodec = "N/A";
- }
+ // }
+ // else {
+ // $mediaVideoCodec = "N/A";
+ // }
// $media_MetadataID_TMP = preg_split("#/#", $mediaVideoCodec);
// $media_MetadataID = $media_MetadataID_TMP[3];
@@ -411,6 +463,57 @@ function plex_metadata_videoCodec($mediaType = "episode", $isPlayingMode = FALSE
pmp_Logging("$media_logClass", "\tmediaVideoCodec @ $mediaType ($media_metadata_name) - \"$mediaVideoCodec\"");
}
+function plex_metadata_videoResolution($mediaType = "episode", $isPlayingMode = FALSE) {
+ global $clients, $isPlaying;
+ global $mediaVideoResolution, $mediaVideoResolution_MetadataID;
+
+ $media_MetadataID_STR = "";
+
+ // Notes: videoResolution
+ //
+
+ // videoResolution
+ switch ($mediaType) {
+ case "episode":
+ $media_metadata_name = 'videoResolution';
+ $media_logClass = "PLEX_getTVMetadata";
+ break;
+ case "season":
+ $media_metadata_name = 'videoResolution';
+ $media_logClass = "PLEX_getTVMetadata";
+ break;
+ case "series":
+ $media_metadata_name = 'videoResolution';
+ $media_logClass = "PLEX_getTVMetadata";
+ break;
+ case "movie":
+ $media_metadata_name = 'videoResolution';
+ $media_logClass = "PLEX_getMovieMetadata";
+ break;
+ case "track":
+ $media_metadata_name = 'videoResolution';
+ $media_logClass = "PLEX_getMusicMetadata";
+ break;
+ default:
+ $media_metadata_name = 'videoResolution';
+ $media_logClass = "PLEX_getTVMetadata";
+ }
+
+ // if ($isPlayingMode == TRUE) {
+ $mediaVideoResolution = $clients->Media[$media_metadata_name];
+ // }
+ // else {
+ // $mediaVideoResolution = "N/A";
+ // }
+
+ // $media_MetadataID_TMP = preg_split("#/#", $mediaVideoResolution);
+ // $media_MetadataID = $media_MetadataID_TMP[3];
+ // $media_MetadataID_STR = "(metadata ID: $media_MetadataID)";
+
+ // $mediaVideoResolution_MetadataID = $media_MetadataID;
+ pmp_Logging("$media_logClass", "\tmediaVideoResolution @ $mediaType ($media_metadata_name) - \"$mediaVideoResolution\"");
+}
+
function plex_metadata_audioDisplay($mediaType = "episode", $isPlayingMode = FALSE) {
global $clients, $isPlaying;
global $mediaAudioDisplay, $mediaAudioDisplay_MetadataID;
@@ -981,11 +1084,13 @@ function plex_metadata_PROCESS() {
plex_metadata_thumb("$mediaType", $ComingSoonMode); // COMING SOON MODE
plex_metadata_art("$mediaType");
plex_metadata_contentRating("$mediaType");
+ plex_metadata_audioCodec("$mediaType");
+ plex_metadata_audioChannelLayout("$mediaType");
+ plex_metadata_videoCodec("$mediaType");
+ plex_metadata_videoResolution("$mediaType");
if ($isPlaying == TRUE) {
plex_metadata_decision("$mediaType", $isPlayingMode); // isPlaying Mode
- plex_metadata_audioCodec("$mediaType", $isPlayingMode); // isPlaying Mode
- plex_metadata_videoCodec("$mediaType", $isPlayingMode); // isPlaying Mode
plex_metadata_audioDisplay("$mediaType", $isPlayingMode); // isPlaying Mode
plex_metadata_videoDisplay("$mediaType", $isPlayingMode); // isPlaying Mode
}
diff --git a/assets/plexmovieposter/images/icons/mediaInfo/4K_HDR.png b/assets/plexmovieposter/images/icons/mediaInfo/4K_HDR.png
new file mode 100644
index 0000000000000000000000000000000000000000..318a48d9e29c72070154cd947f46e4d018c6e206
GIT binary patch
literal 11201
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
G`~L%^*y)S_
literal 0
HcmV?d00001
diff --git a/assets/plexmovieposter/images/icons/mediaInfo/Dolby_Atmos.png b/assets/plexmovieposter/images/icons/mediaInfo/Dolby_Atmos.png
new file mode 100644
index 0000000000000000000000000000000000000000..23fb757f4fea8a74c1fe22c2d1e1fb422a6c3f02
GIT binary patch
literal 19086
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