From f4aef97e1703ad4b79e513d5379c6b0fcc59b838 Mon Sep 17 00:00:00 2001 From: tcely Date: Wed, 9 Apr 2025 23:05:53 -0400 Subject: [PATCH] POST to `/Items/{ID}/Refresh` --- tubesync/sync/mediaservers.py | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/tubesync/sync/mediaservers.py b/tubesync/sync/mediaservers.py index d07f2f21..ce49ff78 100644 --- a/tubesync/sync/mediaservers.py +++ b/tubesync/sync/mediaservers.py @@ -47,7 +47,7 @@ class MediaServer: timeout=self.TIMEOUT, )) - def make_request(self, uri='/', headers={}, params={}): + def make_request(self, uri='/', /, *, headers={}, params={}): ''' A very simple implementation is: url, kwargs = self.make_request_args(uri=uri, headers=headers, params=params) @@ -87,7 +87,7 @@ class PlexMediaServer(MediaServer): 'here

.') - def make_request(self, uri='/', headers={}, params={}): + def make_request(self, uri='/', /, *, headers={}, params={}): url, kwargs = self.make_request_args(uri=uri, headers=headers, token_param='X-Plex-Token', params=params) log.debug(f'[plex media server] Making HTTP GET request to: {url}') if kwargs['verify']: @@ -207,7 +207,9 @@ class JellyfinMediaServer(MediaServer): '

The "API Key" token is required for API access. Your Jellyfin administrator can generate an "API Key" token for use with TubeSync for you.

' '

The libraries is a comma-separated list of library IDs in Jellyfin. Leave this blank to see a list.

') - def make_request(self, uri='/', headers={}, params={}): + def make_request(self, uri='/', /, *, headers={}, params={}, data={}, json=None, method='GET'): + assert method in {'GET', 'POST'}, f'Unimplemented method: {method}' + headers.update({'Content-Type': 'application/json'}) url, kwargs = self.make_request_args(uri=uri, token_header='X-Emby-Token', headers=headers, params=params) # From the Emby source code; @@ -222,11 +224,17 @@ class JellyfinMediaServer(MediaServer): if token: kwargs['headers'].update({ 'X-MediaBrowser-Token': token, - 'X-Emby-Authorization': f'Emby Token={token}, Client=TubeSync, Version={settings.VERSION!s}', - 'Authorization': f'MediaBrowser Token="{token}", Client="TubeSync", Version="{settings.VERSION!s}"', + 'X-Emby-Authorization': f'Emby Token={token}, Client=TubeSync, Version={settings.VERSION}', + 'Authorization': f'MediaBrowser Token="{token}", Client="TubeSync", Version="{settings.VERSION}"', }) - log.debug(f'[jellyfin media server] Making HTTP GET request to: {url}') - return requests.get(url, **kwargs) + + log.debug(f'[jellyfin media server] Making HTTP {method} request to: {url}') + return requests.request( + method, url, + data=data, + json=json, + **kwargs, + ) def validate(self): if not self.object.host: @@ -287,8 +295,8 @@ class JellyfinMediaServer(MediaServer): def update(self): libraries = self.object.loaded_options.get('libraries', '').split(',') for library_id in map(str.strip, libraries): - uri = f'/Library/{library_id}/Refresh' - response = self.make_request(uri) + uri = f'/Items/{library_id}/Refresh' + response = self.make_request(uri, method='POST') if response.status_code != 204: # 204 No Content is expected for successful refresh raise MediaServerError(f'Failed to refresh Jellyfin library "{library_id}", status code: {response.status_code}') return True