From 97cd4768676344255b2484ad2afe8bdf55ef46ca Mon Sep 17 00:00:00 2001 From: jhellerstedt Date: Thu, 30 Oct 2025 11:46:25 +1100 Subject: [PATCH 1/2] add input for 2FA code --- plex/connection.py | 45 ++++++++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/plex/connection.py b/plex/connection.py index f5e4832..bc04ca1 100644 --- a/plex/connection.py +++ b/plex/connection.py @@ -1,28 +1,31 @@ from plexapi.myplex import MyPlexAccount class PlexConnection(): - def __init__(self, username=None, password=None, resource=None): - self.username = username - self.password = password - self.resource = resource - self._server = None + def __init__(self, username=None, password=None, resource=None): + self.username = username + self.password = password + self.resource = resource + self._server = None - @property - def music_library(self, section_name='Music'): - return self.library.section(section_name) + @property + def music_library(self, section_name='Music'): + return self.library.section(section_name) - @property - def library(self): - return self.server.library + @property + def library(self): + return self.server.library - @property - def server(self): - if not self._server: - self._server = self._setup_server() - return self._server + @property + def server(self): + if not self._server: + self._server = self._setup_server() + return self._server - def _setup_server(self): - print(f'Connecting to Plex server {self.resource}...') - account = MyPlexAccount(self.username, self.password) - print(f'Connecting to Plex server {self.resource}... DONE.') - return account.resource(self.resource).connect() + def _setup_server(self): + print(f'Connecting to Plex server {self.resource}...') + # In plex/connection.py, line 26: + two_factor_code = input("Enter your Plex 2FA code: ") + account = MyPlexAccount(self.username, self.password, code=two_factor_code) + + print(f'Connecting to Plex server {self.resource}... DONE.') + return account.resource(self.resource).connect() From f3fba060327df71debfea3838c1dad68ecaab4c0 Mon Sep 17 00:00:00 2001 From: jhellerstedt Date: Thu, 30 Oct 2025 12:23:27 +1100 Subject: [PATCH 2/2] add token switch; propagate token and url through input args --- generate.py | 30 ++++++++++++++++-------------- plex/connection.py | 18 +++++++++++------- plex_playlist_builder.py | 4 ++-- 3 files changed, 29 insertions(+), 23 deletions(-) diff --git a/generate.py b/generate.py index 5761a2e..26b5035 100644 --- a/generate.py +++ b/generate.py @@ -5,22 +5,24 @@ if __name__ == "__main__": - parser = argparse.ArgumentParser() - - parser.add_argument('--username', '-u', help='Plex account username/email', required=True, type=str) - parser.add_argument('--password', '-p', help='Plex account password', required=True, type=str) - parser.add_argument('--resource', '-r', help='Plex server resource name', required=True, type=str) - parser.add_argument('--playlist_title', '-t', help='Name of target playlist to update', default='Music Bot', type=str) - parser.add_argument('--track_count', '-c', help='Number of tracks to add to playlist', default=50, type=int) - - args = parser.parse_args() - - print(f'Generating playlist named "{args.playlist_title}" with {args.track_count} tracks...') - - PlexPlaylistBuilder( + parser = argparse.ArgumentParser() + parser.add_argument('--username', '-u', help='Plex account username/email', default=None, type=str) + parser.add_argument('--password', '-p', help='Plex account password', default=None, type=str) + parser.add_argument('--resource', '-r', help='Plex server resource name', default=None, type=str) + parser.add_argument('--server_url', '-s', help='Plex server url', default=None, type=str) + parser.add_argument('--token', '-tk', help='Plex token', default=None, type=str) + parser.add_argument('--playlist_title', '-t', help='Name of target playlist to update', default='Music Bot', type=str) + parser.add_argument('--track_count', '-c', help='Number of tracks to add to playlist', default=50, type=int) + + args = parser.parse_args() + print(f'Generating playlist named "{args.playlist_title}" with {args.track_count} tracks...') + + PlexPlaylistBuilder( username=args.username, password=args.password, - resource=args.resource + resource=args.resource, + server_url=args.server_url, + token=args.token, ).build_playlist( playlist_title=args.playlist_title, track_count=int(args.track_count) diff --git a/plex/connection.py b/plex/connection.py index bc04ca1..d9d3aaa 100644 --- a/plex/connection.py +++ b/plex/connection.py @@ -1,10 +1,12 @@ -from plexapi.myplex import MyPlexAccount +from plexapi.myplex import MyPlexAccount, PlexServer class PlexConnection(): - def __init__(self, username=None, password=None, resource=None): + def __init__(self, username=None, password=None, resource=None, server_url=None, token=None): self.username = username self.password = password self.resource = resource + self.server_url = server_url + self.token = token self._server = None @property @@ -23,9 +25,11 @@ def server(self): def _setup_server(self): print(f'Connecting to Plex server {self.resource}...') - # In plex/connection.py, line 26: - two_factor_code = input("Enter your Plex 2FA code: ") - account = MyPlexAccount(self.username, self.password, code=two_factor_code) - print(f'Connecting to Plex server {self.resource}... DONE.') - return account.resource(self.resource).connect() + # Use token if available, otherwise fall back to 2FA flow + if self.token: + return PlexServer(f'http://{self.server_url}:32400', token=self.token) + else: + two_factor_code = input("Enter your Plex 2FA code: ") + account = MyPlexAccount(self.username, self.password, code=two_factor_code) + return account.resource(self.resource).connect() diff --git a/plex_playlist_builder.py b/plex_playlist_builder.py index f902ce1..b7d5e57 100644 --- a/plex_playlist_builder.py +++ b/plex_playlist_builder.py @@ -8,9 +8,9 @@ class PlexPlaylistBuilder(): - def __init__(self, username=None, password=None, resource=None): + def __init__(self, username=None, password=None, resource=None, server_url=None, token=None): plex_library = PlexConnection( - username=username, password=password, resource=resource + username=username, password=password, resource=resource, server_url=server_url, token=token, ).music_library self.music_library = PlexMusic(plex_library)