From 37ef098718b819cc4c1a08b19b5e9cab69bdf80a Mon Sep 17 00:00:00 2001 From: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com> Date: Thu, 28 Nov 2024 16:36:03 -0800 Subject: [PATCH 01/30] Flip docker container healthcheck https first --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 7a52841f..8d8c324b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -25,4 +25,4 @@ CMD [ "python", "Tautulli.py", "--datadir", "/config" ] ENTRYPOINT [ "./start.sh" ] EXPOSE 8181 -HEALTHCHECK --start-period=90s CMD curl -ILfSs http://localhost:8181/status > /dev/null || curl -ILfkSs https://localhost:8181/status > /dev/null || exit 1 +HEALTHCHECK --start-period=90s CMD curl -ILfks https://localhost:8181/status > /dev/null || curl -ILfs http://localhost:8181/status > /dev/null || exit 1 From b7c4f2eefe40c3f6b147e07cc3d83de120094fdc Mon Sep 17 00:00:00 2001 From: chrisdecker08 <62341865+chrisdecker08@users.noreply.github.com> Date: Sat, 14 Dec 2024 15:24:08 -0500 Subject: [PATCH 02/30] detect HDR transcodes via colorTrc attribute (#2466) --- plexpy/pmsconnect.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plexpy/pmsconnect.py b/plexpy/pmsconnect.py index 2575d2da..46cd143e 100644 --- a/plexpy/pmsconnect.py +++ b/plexpy/pmsconnect.py @@ -3386,10 +3386,10 @@ class PmsConnect(object): def get_dynamic_range(stream): extended_display_title = helpers.get_xml_attr(stream, 'extendedDisplayTitle') bit_depth = helpers.cast_to_int(helpers.get_xml_attr(stream, 'bitDepth')) - color_space = helpers.get_xml_attr(stream, 'colorSpace') + color_trc = helpers.get_xml_attr(stream, 'colorTrc') DOVI_profile = helpers.get_xml_attr(stream, 'DOVIProfile') - HDR = bool(bit_depth > 8 and 'bt2020' in color_space) + HDR = bool(bit_depth > 8 and (color_trc == 'smpte2084' or color_trc == 'arib-std-b67')) DV = bool(DOVI_profile) if not HDR and not DV: From 63fe386057bc315bc97e3cecf622c21ad9f6e6fd Mon Sep 17 00:00:00 2001 From: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com> Date: Thu, 9 Jan 2025 09:13:57 -0800 Subject: [PATCH 03/30] Disable basic auth for /newsletter and /image endpoints Fixes #2472 --- plexpy/webstart.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/plexpy/webstart.py b/plexpy/webstart.py index 8a6edc6e..1f3fb7ed 100644 --- a/plexpy/webstart.py +++ b/plexpy/webstart.py @@ -171,6 +171,12 @@ def initialize(options): '/status': { 'tools.auth_basic.on': False }, + '/newsletter': { + 'tools.auth_basic.on': False + }, + '/image': { + 'tools.auth_basic.on': False + }, '/interfaces': { 'tools.staticdir.on': True, 'tools.staticdir.dir': "interfaces", From 8f03e276178896130759da2d8f6367d77e63ae29 Mon Sep 17 00:00:00 2001 From: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com> Date: Thu, 9 Jan 2025 09:57:58 -0800 Subject: [PATCH 04/30] Add VirusTotal scan to installer build CI --- .github/workflows/publish-installers.yml | 18 ++++++++++++++++++ .github/workflows/submit-winget.yml | 13 +++++++++++++ 2 files changed, 31 insertions(+) diff --git a/.github/workflows/publish-installers.yml b/.github/workflows/publish-installers.yml index e3f7fe85..b4a66960 100644 --- a/.github/workflows/publish-installers.yml +++ b/.github/workflows/publish-installers.yml @@ -100,6 +100,24 @@ jobs: name: Tautulli-${{ matrix.os }}-installer path: Tautulli-${{ matrix.os }}-${{ steps.get_version.outputs.RELEASE_VERSION }}-${{ matrix.arch }}.${{ matrix.ext }} + virus-total: + name: VirusTotal Scan + needs: build-installer + if: needs.build-installer.result == 'success' && !contains(github.event.head_commit.message, '[skip ci]') + runs-on: ubuntu-latest + steps: + - name: Download Installers + if: needs.build-installer.result == 'success' + uses: actions/download-artifact@v4 + + - name: Upload to VirusTotal + uses: crazy-max/ghaction-virustotal@v4 + with: + vt_api_key: ${{ secrets.VT_API_KEY }} + files: | + Tautulli-windows-installer/Tautulli-windows-*-x64.exe + Tautulli-macos-installer/Tautulli-macos-*-universal.pkg + release: name: Release Installers needs: build-installer diff --git a/.github/workflows/submit-winget.yml b/.github/workflows/submit-winget.yml index aa1c4dec..e4b0303f 100644 --- a/.github/workflows/submit-winget.yml +++ b/.github/workflows/submit-winget.yml @@ -23,3 +23,16 @@ jobs: # getting latest wingetcreate file iwr https://aka.ms/wingetcreate/latest -OutFile wingetcreate.exe .\wingetcreate.exe update $wingetPackage -s -v $version -u $installerUrl -t $gitToken + + virus-total: + name: VirusTotal Scan + runs-on: ubuntu-latest + steps: + - name: Upload to VirusTotal + uses: crazy-max/ghaction-virustotal@v4 + with: + vt_api_key: ${{ secrets.VT_API_KEY }} + update_release_body: true + files: | + .exe$ + .pkg$ From f9b3631745db0e3918d5d8e0614a0783af8cf227 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 Jan 2025 10:14:37 -0800 Subject: [PATCH 05/30] Bump pyjwt from 2.10.0 to 2.10.1 (#2445) Bumps [pyjwt](https://github.com/jpadilla/pyjwt) from 2.10.0 to 2.10.1. - [Release notes](https://github.com/jpadilla/pyjwt/releases) - [Changelog](https://github.com/jpadilla/pyjwt/blob/master/CHANGELOG.rst) - [Commits](https://github.com/jpadilla/pyjwt/compare/2.10.0...2.10.1) --- updated-dependencies: - dependency-name: pyjwt dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> [skip ci] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index e6a85bdb..e05608bc 100644 --- a/requirements.txt +++ b/requirements.txt @@ -28,7 +28,7 @@ platformdirs==4.3.6 plexapi==4.16.0 portend==3.2.0 profilehooks==1.13.0 -PyJWT==2.10.0 +PyJWT==2.10.1 pyparsing==3.2.0 python-dateutil==2.9.0.post0 python-twitter==3.5 From 85e9237608dda60c0f1985d9537cac8432fba247 Mon Sep 17 00:00:00 2001 From: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com> Date: Thu, 9 Jan 2025 10:16:47 -0800 Subject: [PATCH 06/30] Update pyjwt==2.10.1 --- lib/jwt/__init__.py | 2 +- lib/jwt/api_jwt.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/jwt/__init__.py b/lib/jwt/__init__.py index 9d4b6744..457a4e35 100644 --- a/lib/jwt/__init__.py +++ b/lib/jwt/__init__.py @@ -27,7 +27,7 @@ from .exceptions import ( ) from .jwks_client import PyJWKClient -__version__ = "2.10.0" +__version__ = "2.10.1" __title__ = "PyJWT" __description__ = "JSON Web Token implementation in Python" diff --git a/lib/jwt/api_jwt.py b/lib/jwt/api_jwt.py index fa4d5e6f..3a201436 100644 --- a/lib/jwt/api_jwt.py +++ b/lib/jwt/api_jwt.py @@ -419,11 +419,11 @@ class PyJWT: if "iss" not in payload: raise MissingRequiredClaimError("iss") - if isinstance(issuer, Sequence): - if payload["iss"] not in issuer: + if isinstance(issuer, str): + if payload["iss"] != issuer: raise InvalidIssuerError("Invalid issuer") else: - if payload["iss"] != issuer: + if payload["iss"] not in issuer: raise InvalidIssuerError("Invalid issuer") From 078c293bd78781cd9dbfe3f4e4102e08698349a5 Mon Sep 17 00:00:00 2001 From: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com> Date: Thu, 9 Jan 2025 10:45:29 -0800 Subject: [PATCH 07/30] Update plexapi=4.16.1 --- lib/plexapi/const.py | 2 +- lib/plexapi/sonos.py | 5 +++-- lib/plexapi/video.py | 4 ++-- requirements.txt | 2 +- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/plexapi/const.py b/lib/plexapi/const.py index 93f7e034..bc3e81aa 100644 --- a/lib/plexapi/const.py +++ b/lib/plexapi/const.py @@ -4,6 +4,6 @@ # Library version MAJOR_VERSION = 4 MINOR_VERSION = 16 -PATCH_VERSION = 0 +PATCH_VERSION = 1 __short_version__ = f"{MAJOR_VERSION}.{MINOR_VERSION}" __version__ = f"{__short_version__}.{PATCH_VERSION}" diff --git a/lib/plexapi/sonos.py b/lib/plexapi/sonos.py index 14f83d31..8f1295f4 100644 --- a/lib/plexapi/sonos.py +++ b/lib/plexapi/sonos.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- import requests -from plexapi import CONFIG, X_PLEX_IDENTIFIER +from plexapi import CONFIG, X_PLEX_IDENTIFIER, TIMEOUT from plexapi.client import PlexClient from plexapi.exceptions import BadRequest from plexapi.playqueue import PlayQueue @@ -46,7 +46,7 @@ class PlexSonosClient(PlexClient): _session (obj): Requests session object used to access this client. """ - def __init__(self, account, data): + def __init__(self, account, data, timeout=None): self._data = data self.deviceClass = data.attrib.get("deviceClass") self.machineIdentifier = data.attrib.get("machineIdentifier") @@ -66,6 +66,7 @@ class PlexSonosClient(PlexClient): self._last_call = 0 self._proxyThroughServer = False self._showSecrets = CONFIG.get("log.show_secrets", "").lower() == "true" + self._timeout = timeout or TIMEOUT def playMedia(self, media, offset=0, **params): diff --git a/lib/plexapi/video.py b/lib/plexapi/video.py index 6e811aa4..9e4201b8 100644 --- a/lib/plexapi/video.py +++ b/lib/plexapi/video.py @@ -716,7 +716,7 @@ class Show( class Season( Video, AdvancedSettingsMixin, ExtrasMixin, RatingMixin, - ArtMixin, PosterMixin, ThemeUrlMixin, + ArtMixin, LogoMixin, PosterMixin, ThemeUrlMixin, SeasonEditMixins ): """ Represents a single Season. @@ -883,7 +883,7 @@ class Season( class Episode( Video, Playable, ExtrasMixin, RatingMixin, - ArtMixin, PosterMixin, ThemeUrlMixin, + ArtMixin, LogoMixin, PosterMixin, ThemeUrlMixin, EpisodeEditMixins ): """ Represents a single Episode. diff --git a/requirements.txt b/requirements.txt index e05608bc..0bd14208 100644 --- a/requirements.txt +++ b/requirements.txt @@ -25,7 +25,7 @@ musicbrainzngs==0.7.1 packaging==24.2 paho-mqtt==2.1.0 platformdirs==4.3.6 -plexapi==4.16.0 +plexapi==4.16.1 portend==3.2.0 profilehooks==1.13.0 PyJWT==2.10.1 From 67fa4ca6453eb3db5e8a44d53560b56bd70d7a86 Mon Sep 17 00:00:00 2001 From: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com> Date: Thu, 9 Jan 2025 10:45:49 -0800 Subject: [PATCH 08/30] Add logos to season and episode exports --- plexpy/exporter.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/plexpy/exporter.py b/plexpy/exporter.py index 053dd3bc..18c20a4e 100644 --- a/plexpy/exporter.py +++ b/plexpy/exporter.py @@ -40,8 +40,8 @@ class Export(object): MEDIA_TYPES = { 'movie': (True, True, True), 'show': (True, True, True), - 'season': (True, True, False), - 'episode': (False, False, False), + 'season': (True, True, True), + 'episode': (False, False, True), 'artist': (True, True, False), 'album': (True, True, False), 'track': (False, False, False), @@ -533,6 +533,9 @@ class Export(object): 'librarySectionID': None, 'librarySectionKey': None, 'librarySectionTitle': None, + 'logo': lambda o: next((i.url for i in o.images if i.type == 'clearLogo'), None), + 'logoFile': lambda o: self.get_image(o, 'logo'), + 'logoProvider': lambda o: self.get_image_provider(o, 'logo'), 'metadataDirectory': None, 'parentGuid': None, 'parentIndex': None, @@ -626,6 +629,9 @@ class Export(object): 'librarySectionKey': None, 'librarySectionTitle': None, 'locations': None, + 'logo': lambda o: next((i.url for i in o.images if i.type == 'clearLogo'), None), + 'logoFile': lambda o: self.get_image(o, 'logo'), + 'logoProvider': lambda o: self.get_image_provider(o, 'logo'), 'markers': { 'end': None, 'final': None, From 0a4730625ccc9c119c823a4e6a33314976b3b709 Mon Sep 17 00:00:00 2001 From: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com> Date: Thu, 9 Jan 2025 15:12:49 -0800 Subject: [PATCH 09/30] Update copyright year --- package/Tautulli.nsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/Tautulli.nsi b/package/Tautulli.nsi index ad09846c..7232c23f 100644 --- a/package/Tautulli.nsi +++ b/package/Tautulli.nsi @@ -7,7 +7,7 @@ !define APP_NAME "Tautulli" !define COMP_NAME "Tautulli" !define WEB_SITE "https://tautulli.com" -!define COPYRIGHT "Tautulli © 2020" +!define COPYRIGHT "Tautulli © 2025" !define DESCRIPTION "Monitor your Plex Media Server" !define APP_ICON "..\dist\Tautulli\data\interfaces\default\images\logo-circle.ico" !define LICENSE_TXT "..\dist\Tautulli\LICENSE" From 65dc466c07f51e85542635e674ab0e9a09c7f91f Mon Sep 17 00:00:00 2001 From: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com> Date: Thu, 9 Jan 2025 15:13:20 -0800 Subject: [PATCH 10/30] Add Github token to release virus scan --- .github/workflows/submit-winget.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/submit-winget.yml b/.github/workflows/submit-winget.yml index e4b0303f..5385c1c3 100644 --- a/.github/workflows/submit-winget.yml +++ b/.github/workflows/submit-winget.yml @@ -32,6 +32,7 @@ jobs: uses: crazy-max/ghaction-virustotal@v4 with: vt_api_key: ${{ secrets.VT_API_KEY }} + github_token: ${{ secrets.GHACTIONS_TOKEN }} update_release_body: true files: | .exe$ From a96fd23d72f5aa3042d6f9a55d8051653ff6f0b8 Mon Sep 17 00:00:00 2001 From: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com> Date: Sat, 11 Jan 2025 15:27:24 -0800 Subject: [PATCH 11/30] v2.15.1 --- CHANGELOG.md | 12 ++++++++++++ plexpy/version.py | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index abd3f8d4..5d5524c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## v2.15.1 (2025-01-11) + +* Activity: + * Fix: Detection of HDR transcodes. (Thanks @chrisdecker08) (#2412, #2466) +* Newsletters: + * Fix: Disable basic authentication for /newsletter and /image endpoints. (#2472) +* Exporter: + * New: Added logos to season and episode exports. +* Other: + * Fix Docker container https health check. + + ## v2.15.0 (2024-11-24) * Notes: diff --git a/plexpy/version.py b/plexpy/version.py index ae1d3273..b08e42da 100644 --- a/plexpy/version.py +++ b/plexpy/version.py @@ -16,4 +16,4 @@ # along with Tautulli. If not, see . PLEXPY_BRANCH = "master" -PLEXPY_RELEASE_VERSION = "v2.15.0" \ No newline at end of file +PLEXPY_RELEASE_VERSION = "v2.15.1" \ No newline at end of file From 2ed603f2886caa301ae11701fc7358374183766e Mon Sep 17 00:00:00 2001 From: luzpaz Date: Sun, 16 Mar 2025 15:25:29 -0400 Subject: [PATCH 12/30] Fix typos (#2520) Found via codespell --- README.md | 2 +- Tautulli.py | 2 +- plexpy/activity_pinger.py | 2 +- plexpy/config.py | 2 +- plexpy/datatables.py | 2 +- plexpy/mobile_app.py | 2 +- plexpy/notification_handler.py | 4 ++-- plexpy/notifiers.py | 2 +- plexpy/webauth.py | 2 +- plexpy/webserve.py | 12 ++++++------ 10 files changed, 16 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 1f24741e..37829290 100644 --- a/README.md +++ b/README.md @@ -129,7 +129,7 @@ This is free software under the GPL v3 open source license. Feel free to do with but any modification must be open sourced. A copy of the license is included. This software includes Highsoft software libraries which you may freely distribute for -non-commercial use. Commerical users must licence this software, for more information visit +non-commercial use. Commercial users must licence this software, for more information visit https://shop.highsoft.com/faq/non-commercial#non-commercial-redistribution. diff --git a/Tautulli.py b/Tautulli.py index 200cd39d..b3cf4736 100755 --- a/Tautulli.py +++ b/Tautulli.py @@ -129,7 +129,7 @@ def main(): if args.quiet: plexpy.QUIET = True - # Do an intial setup of the logger. + # Do an initial setup of the logger. # Require verbose for pre-initilization to see critical errors logger.initLogger(console=not plexpy.QUIET, log_dir=False, verbose=True) diff --git a/plexpy/activity_pinger.py b/plexpy/activity_pinger.py index 9e8487fb..22688027 100644 --- a/plexpy/activity_pinger.py +++ b/plexpy/activity_pinger.py @@ -173,7 +173,7 @@ def check_active_sessions(ws_request=False): row_id = monitor_process.write_session_history(session=stream) if row_id: - # If session is written to the databaase successfully, remove the session from the session table + # If session is written to the database successfully, remove the session from the session table logger.debug("Tautulli Monitor :: Removing sessionKey %s ratingKey %s from session queue" % (stream['session_key'], stream['rating_key'])) monitor_process.delete_session(row_id=row_id) diff --git a/plexpy/config.py b/plexpy/config.py index c41e3b59..3e9862ff 100644 --- a/plexpy/config.py +++ b/plexpy/config.py @@ -568,7 +568,7 @@ class Config(object): def _upgrade(self): """ - Upgrades config file from previous verisions and bumps up config version + Upgrades config file from previous versions and bumps up config version """ if self.CONFIG_VERSION == 0: self.CONFIG_VERSION = 1 diff --git a/plexpy/datatables.py b/plexpy/datatables.py index 68c76c57..0cc94760 100644 --- a/plexpy/datatables.py +++ b/plexpy/datatables.py @@ -283,7 +283,7 @@ def extract_columns(columns=None, match_columns=None): columns_string = columns_string.rstrip(', ') # We return a dict of the column params - # column_string is a comma seperated list of the exact column variables received. + # column_string is a comma separated list of the exact column variables received. # column_literal is the text before the "as" if we have an "as". Usually a function. # column_named is the text after the "as", if we have an "as". Any table prefix is also stripped off. # We use this to match with columns received from the Datatables request. diff --git a/plexpy/mobile_app.py b/plexpy/mobile_app.py index f3c835c3..8ba075d5 100644 --- a/plexpy/mobile_app.py +++ b/plexpy/mobile_app.py @@ -132,7 +132,7 @@ def set_mobile_device_config(mobile_device_id=None, **kwargs): if str(mobile_device_id).isdigit(): mobile_device_id = int(mobile_device_id) else: - logger.error("Tautulli MobileApp :: Unable to set exisiting mobile device: invalid mobile_device_id %s." % mobile_device_id) + logger.error("Tautulli MobileApp :: Unable to set existing mobile device: invalid mobile_device_id %s." % mobile_device_id) return False keys = {'id': mobile_device_id} diff --git a/plexpy/notification_handler.py b/plexpy/notification_handler.py index 56ac9df6..ada7dcfb 100644 --- a/plexpy/notification_handler.py +++ b/plexpy/notification_handler.py @@ -955,7 +955,7 @@ def build_media_notify_params(notify_action=None, session=None, timeline=None, m now_iso = now.isocalendar() available_params = { - # Global paramaters + # Global parameters 'tautulli_version': common.RELEASE, 'tautulli_remote': plexpy.CONFIG.GIT_REMOTE, 'tautulli_branch': plexpy.CONFIG.GIT_BRANCH, @@ -1267,7 +1267,7 @@ def build_server_notify_params(notify_action=None, **kwargs): now_iso = now.isocalendar() available_params = { - # Global paramaters + # Global parameters 'tautulli_version': common.RELEASE, 'tautulli_remote': plexpy.CONFIG.GIT_REMOTE, 'tautulli_branch': plexpy.CONFIG.GIT_BRANCH, diff --git a/plexpy/notifiers.py b/plexpy/notifiers.py index 2029aa01..b44caf82 100644 --- a/plexpy/notifiers.py +++ b/plexpy/notifiers.py @@ -4055,7 +4055,7 @@ class TAUTULLIREMOTEAPP(Notifier): } else: logger.warn("Tautulli Notifiers :: Cryptography library is missing. " - "Tautulli Remote app notifications will be sent unecrypted. " + "Tautulli Remote app notifications will be sent unencrypted. " "Install the library to encrypt the notifications.") payload = {'app_id': mobile_app._ONESIGNAL_APP_ID, diff --git a/plexpy/webauth.py b/plexpy/webauth.py index 05c81a81..c4b83ab7 100644 --- a/plexpy/webauth.py +++ b/plexpy/webauth.py @@ -50,7 +50,7 @@ def plex_user_login(token=None, headers=None): user_token = None user_id = None - # Try to login to Plex.tv to check if the user has a vaild account + # Try to login to Plex.tv to check if the user has a valid account if token: plex_tv = PlexTV(token=token, headers=headers) plex_user = plex_tv.get_plex_account_details() diff --git a/plexpy/webserve.py b/plexpy/webserve.py index 6ea9aa63..0349e6e8 100644 --- a/plexpy/webserve.py +++ b/plexpy/webserve.py @@ -608,7 +608,7 @@ class WebInterface(object): status_message = '' else: result = None - status_message = 'An error occured.' + status_message = 'An error occurred.' return serve_template(template_name="edit_library.html", title="Edit Library", data=result, server_id=plexpy.CONFIG.PMS_IDENTIFIER, status_message=status_message) @@ -1347,7 +1347,7 @@ class WebInterface(object): status_message = '' else: result = None - status_message = 'An error occured.' + status_message = 'An error occurred.' return serve_template(template_name="edit_user.html", title="Edit User", data=result, status_message=status_message) @@ -1365,7 +1365,7 @@ class WebInterface(object): keep_history (int): 0 or 1 allow_guest (int): 0 or 1 - Optional paramters: + Optional parameters: None Returns: @@ -3031,7 +3031,7 @@ class WebInterface(object): """ Delete the Tautulli notification logs. ``` - Required paramters: + Required parameters: None Optional parameters: @@ -3056,7 +3056,7 @@ class WebInterface(object): """ Delete the Tautulli newsletter logs. ``` - Required paramters: + Required parameters: None Optional parameters: @@ -3081,7 +3081,7 @@ class WebInterface(object): """ Delete the Tautulli login logs. ``` - Required paramters: + Required parameters: None Optional parameters: From f23d3eb81c5057633eb104963d50ccccf14a2ade Mon Sep 17 00:00:00 2001 From: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com> Date: Sat, 11 Jan 2025 15:42:15 -0800 Subject: [PATCH 13/30] Fix changelog username --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5d5524c4..7ce76873 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ## v2.15.1 (2025-01-11) * Activity: - * Fix: Detection of HDR transcodes. (Thanks @chrisdecker08) (#2412, #2466) + * Fix: Detection of HDR transcodes. (Thanks @cdecker08) (#2412, #2466) * Newsletters: * Fix: Disable basic authentication for /newsletter and /image endpoints. (#2472) * Exporter: From c70381c3ff4dec8d62d7e35be811ae93a139f05a Mon Sep 17 00:00:00 2001 From: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com> Date: Thu, 23 Jan 2025 13:30:45 -0800 Subject: [PATCH 14/30] Fix ntfy notifications not sending if provider link is blank --- plexpy/notifiers.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plexpy/notifiers.py b/plexpy/notifiers.py index b44caf82..5f231a17 100644 --- a/plexpy/notifiers.py +++ b/plexpy/notifiers.py @@ -2667,7 +2667,8 @@ class NTFY(Notifier): provider_name = pretty_metadata.get_provider_name(provider) provider_link = pretty_metadata.get_provider_link(provider) - actions.append(f"view, View on {provider_name}, {provider_link}, clear=true") + if provider_link: + actions.append(f"view, View on {provider_name}, {provider_link}, clear=true") if self.config['incl_pmslink']: plex_url = pretty_metadata.get_plex_url() From 0879b848b970ab05e67ea843bca49f607a8b0a5e Mon Sep 17 00:00:00 2001 From: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com> Date: Fri, 24 Jan 2025 10:54:15 -0800 Subject: [PATCH 15/30] Add link to library page from activity card media type icon --- .../default/current_activity_instance.html | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/data/interfaces/default/current_activity_instance.html b/data/interfaces/default/current_activity_instance.html index fcc1b592..b1b7c3aa 100644 --- a/data/interfaces/default/current_activity_instance.html +++ b/data/interfaces/default/current_activity_instance.html @@ -74,6 +74,7 @@ DOCUMENTATION :: END parent_href = page('info', data['parent_rating_key']) grandparent_href = page('info', data['grandparent_rating_key']) user_href = page('user', data['user_id']) if data['user_id'] else '#' + library_href = page('library', data['section_id']) season = short_season(data['parent_title']) %>
% if data['live']: % elif data['channel_stream'] == 0: % else: