Exemple #1
0
def choose_managed_user(account: MyPlexAccount):
    users = [u.title for u in account.users()]
    if not users:
        return None

    click.echo(success("Managed user(s) found:"))
    users = sorted(users)
    users.insert(0, account.username)
    user = inquirer.select(
        message="Select the user you would like to use:",
        choices=users,
        default=None,
        style=style,
        qmark="",
        pointer=">",
    ).execute()

    if user == account.username:
        return None

    # Sanity check, even the user can't input invalid user
    user_account = account.user(user)
    if user_account:
        return user

    return None
Exemple #2
0
def choose_managed_user(account: MyPlexAccount):
    users = [u.title for u in account.users() if u.friend]
    if not users:
        return None

    click.echo(success("Managed user(s) found:"))
    users = sorted(users)
    for user in users:
        click.echo(f"- {user}")

    if not click.confirm(PROMPT_MANAGED_USER):
        return None

    # choice = prompt_choice(users)
    user = click.prompt(
        title("Please select:"),
        type=Choice(users),
        show_default=True,
    )

    # Sanity check, even the user can't input invalid user
    user_account = account.user(user)
    if user_account:
        return user

    return None
def main():
    config = load_config()

    account = MyPlexAccount(config.get('DEFAULT', 'username'),
                            config.get('DEFAULT', 'password'))

    admin_server = account.resource(config.get('DEFAULT',
                                               'server name')).connect()

    user = account.user(config.get('DEFAULT', 'user'))

    # Get the token for the machine.
    token = user.get_token(admin_server.machineIdentifier)

    # Get the user server. We access the base URL by requesting a URL for a
    # blank key.
    user_server = PlexServer(admin_server.url(''), token=token)

    albums = {a.key: a for a in user_server.library.section('Music').albums()}
    playlist = user_server.playlist(config.get('DEFAULT', 'playlist name'))
    items = playlist.items()

    sort_structure = []

    for track in items:
        album = albums[track.parentKey]

        key = get_track_sort_key(track, album)

        sort_structure.append((key, track))

    sort_structure.sort(key=lambda item: item[0])

    items = [item[1] for item in sort_structure]

    for item in items:
        playlist.removeItem(item)

    playlist.addItems(items)
Exemple #4
0
def authenticate() -> PlexServer:
    method = plex_settings["authentication_method"].lower()
    try:
        home_user_sync = plex_settings["home_user_sync"].lower()
        home_username = plex_settings["home_username"]
        home_server_base_url = plex_settings["home_server_base_url"]
    except Exception:
        home_user_sync = "false"
        home_username = ""
        home_server_base_url = ""

    try:
        session = Session()
        session.mount("https://", HostNameIgnoringAdapter())

        # Direct connection
        if method == "direct":
            base_url = plex_settings["base_url"]
            token = plex_settings["token"]
            plex = PlexServer(base_url, token, session)

        # Myplex connection
        elif method == "myplex":
            plex_server = plex_settings["server"]
            plex_user = plex_settings["myplex_user"]
            plex_password = plex_settings["myplex_password"]

            if home_user_sync == "true":
                if home_username == "":
                    logger.error(
                        "Home authentication cancelled as home_username is empty"
                    )
                    sys.exit(1)

                logger.warning(
                    f"Authenticating as admin for MyPlex home user: {home_username}"
                )
                plex_account = MyPlexAccount(plex_user, plex_password)
                plex_server_home = PlexServer(home_server_base_url,
                                              plex_account.authenticationToken,
                                              session)

                logger.warning("Retrieving home user information")
                plex_user_account = plex_account.user(home_username)

                logger.warning("Retrieving user token for MyPlex home user")
                plex_user_token = plex_user_account.get_token(
                    plex_server_home.machineIdentifier)

                logger.warning("Retrieved user token for MyPlex home user")
                plex = PlexServer(home_server_base_url, plex_user_token,
                                  session)
                logger.warning(
                    "Successfully authenticated for MyPlex home user")
            else:
                account = MyPlexAccount(plex_user,
                                        plex_password,
                                        session=session)
                plex = account.resource(plex_server).connect()
        else:
            logger.critical(
                "[PLEX] Failed to authenticate due to invalid settings or authentication info, exiting..."
            )
            sys.exit(1)
        return plex
    except Exception:
        logger.exception("Unable to authenticate to Plex Media Server")
        sys.exit(1)
def authenticate():
    method = plex_settings['authentication_method'].lower()
    try:
        home_user_sync = plex_settings['home_user_sync'].lower()
        home_username = plex_settings['home_username']
        home_server_base_url = plex_settings['home_server_base_url']
    except Exception as e:
        home_user_sync = 'false'
        home_username = ''
        home_server_base_url = ''

    try:
        # Direct connection
        if method == 'direct':
            base_url = plex_settings['base_url']
            token = plex_settings['token']
            plex = PlexServer(base_url, token)

        # Myplex connection
        elif method == 'myplex':
            plex_server = plex_settings['server']
            plex_user = plex_settings['myplex_user']
            plex_password = plex_settings['myplex_password']

            if home_user_sync == 'true':
                if home_username == '':
                    logger.error(
                        'Home authentication cancelled as certain home_user settings are invalid'
                    )
                    return None
                try:
                    logger.warning(
                        'Authenticating as admin for MyPlex home user: %s' %
                        (home_username))
                    plex_account = MyPlexAccount(plex_user, plex_password)
                    plex_server_home = PlexServer(
                        home_server_base_url, plex_account.authenticationToken)

                    logger.warning('Retrieving home user information')
                    plex_user_account = plex_account.user(home_username)

                    logger.warning(
                        'Retrieving user token for MyPlex home user')
                    plex_user_token = plex_user_account.get_token(
                        plex_server_home.machineIdentifier)

                    logger.warning('Retrieved user token for MyPlex home user')
                    plex = PlexServer(home_server_base_url, plex_user_token)
                    logger.warning(
                        'Successfully authenticated for MyPlex home user')
                except Exception as e:
                    logger.error(
                        'Error occured during Plex Home user lookup or server authentication: %s'
                        % (e))
            else:
                account = MyPlexAccount(plex_user, plex_password)
                plex = account.resource(plex_server).connect()
        else:
            logger.critical(
                '[PLEX] Failed to authenticate due to invalid settings or authentication info, exiting...'
            )
            sys.exit()
        return plex
    except Exception as e:
        logger.error(
            'Unable to authenticate to Plex Media Server, traceback: %s' % (e))
        return None
Exemple #6
0
def get_env_data():
    trakt.core.CONFIG_PATH = pytrakt_file
    plex_needed = util.input_yesno(
        "-- Plex --\nAre you logged into this server with a Plex account?")
    if plex_needed:
        username = input("Please enter your Plex username: "******"Please enter your Plex password: "******"Now enter the server name: ")
        account = MyPlexAccount(username, password)
        plex = account.resource(
            servername).connect()  # returns a PlexServer instance
        token = plex._token
        users = account.users()
        if users:
            print("Managed user(s) found:")
            for user in users:
                if user.friend is True:
                    print(user.title)
            print("If you want to use a managed user enter its username,")
            name = input(
                "if you want to use your main account just press enter: ")
            while name:
                try:
                    useraccount = account.user(name)
                except:
                    if name != "_wrong":
                        print("Unknown username!")
                    name = input(
                        "Please enter a managed username (or just press enter to use your main account): "
                    )
                    if not name:
                        print("Ok, continuing with your account " + username)
                        break
                    continue
                try:
                    token = account.user(name).get_token(
                        plex.machineIdentifier)
                    username = name
                    break
                except:
                    print("Impossible to find the managed user \'" + name +
                          "\' on this server!")
                    name = "_wrong"
        with open(env_file, 'w') as txt:
            txt.write("PLEX_USERNAME="******"\n")
            txt.write("PLEX_TOKEN=" + token + "\n")
            txt.write("PLEX_BASEURL=" + plex._baseurl + "\n")
            txt.write("PLEX_FALLBACKURL=http://localhost:32400\n")
        print("Plex token and baseurl for {} have been added in .env file:".
              format(username))
        print("PLEX_TOKEN={}".format(token))
        print("PLEX_BASEURL={}".format(plex._baseurl))
    else:
        with open(env_file, "w") as txt:
            txt.write("PLEX_USERNAME=-\n")
            txt.write("PLEX_TOKEN=-\n")
            txt.write("PLEX_BASEURL=http://localhost:32400\n")

    trakt.core.AUTH_METHOD = trakt.core.DEVICE_AUTH
    print("-- Trakt --")
    client_id, client_secret = trakt.core._get_client_info()
    trakt.init(client_id=client_id, client_secret=client_secret, store=True)
    trakt_user = trakt.users.User('me')
    with open(env_file, "a") as txt:
        txt.write("TRAKT_USERNAME="******"\n")
    print(
        "You are now logged into Trakt. Your Trakt credentials have been added in .env and .pytrakt.json files."
    )
    print("You can enjoy sync! \nCheck config.json to adjust settings.")
    print(
        "If you want to change Plex or Trakt account, just edit or remove .env and .pytrakt.json files."
    )
Exemple #7
0
def get_env_data():
    trakt.core.CONFIG_PATH = pytrakt_file
    print("")
    #plex_needed = util.input_yesno("Are you logged into hawke.one with your Plex account? (almost certainly yes)")
    plex_needed = 1
    if plex_needed:
        username = input("    Please enter your Plex username: "******"    Please enter your Plex password: "******"\nNext we will need your server name:\n\n    The server name is displayed top left (under the library title) when viewing a library on that server:\n    https://app.plex.tv/desktop \n\n    For Hawke.one your server name will most likely be one of the following:"
        )
        print("     1) plex1.hawke.one (usually for Golden Company)")
        print("     2) plex2.hawke.one (usually for Nightswatch)")
        print("     3) plex3.hawke.one (usually for Kings Guard")
        print("     4) plex4.hawke.one (usually for Nightswatch)")
        servername = input(
            "\n    Please select you server (1-4), or enter your custom server name: "
        )
        if servername == "1": servername = "plex1.hawke.one"
        if servername == "2": servername = "plex2.hawke.one"
        if servername == "3": servername = "plex3.hawke.one"
        if servername == "4": servername = "plex4.hawke.one"
        print("    Verifying server...")
        account = MyPlexAccount(username, password)
        plex = account.resource(
            servername).connect()  # returns a PlexServer instance
        token = plex._token
        users = account.users()
        if users:
            print("\n    The following managed Plex user(s) were found:")
            for user in users:
                if user.friend is True:
                    print("     * " + user.title)
            print(" ")
            name = input(
                "    To use your " + username +
                " account, press enter (else enter the name of a managed user): "
            )
            while name:
                try:
                    useraccount = account.user(name)
                except:
                    if name != "_wrong":
                        print("Unknown username!")
                    name = input(
                        "Please enter a managed username (or just press enter to use your main account): "
                    )
                    if not name:
                        print("Ok, continuing with your account " + username)
                        break
                    continue
                try:
                    token = account.user(name).get_token(
                        plex.machineIdentifier)
                    username = name
                    break
                except:
                    print("    Impossible to find the managed user \'" + name +
                          "\' on this server!")
                    name = "_wrong"
        CONFIG["PLEX_USERNAME"] = username
        CONFIG["PLEX_TOKEN"] = token
        CONFIG["PLEX_BASEURL"] = plex._baseurl
        CONFIG["PLEX_FALLBACKURL"] = "http://localhost:32400"

        print("    User {} configured successfully.".format(username))
        # print("PLEX_TOKEN={}".format(token))
        # print("PLEX_BASEURL={}".format(plex._baseurl))
    else:
        CONFIG["PLEX_USERNAME"] = "******"
        CONFIG["PLEX_TOKEN"] = "-"
        CONFIG["PLEX_BASEURL"] = "http://localhost:32400"

    trakt.core.AUTH_METHOD = trakt.core.DEVICE_AUTH
    print("\n\n")
    print("Now we'll setup the Trakt part of things:")
    print(" ")
    print(
        "    Create the required Trakt client ID and secret by completing the following steps:"
    )

    if platform.system() == "Windows":
        print(
            "      1 - Press enter below to open http://trakt.tv/oauth/applications"
        )
        print("      2 - Login to your Trakt account")
        print("      3 - Press the NEW APPLICATION button")
        print(
            "      4 - Set the NAME field = hawke.one (or something else meaningful)"
        )
        import pyperclip
        pyperclip.copy("urn:ietf:wg:oauth:2.0:oob")
        print(
            "      5 - Set the REDIRECT URL field = urn:ietf:wg:oauth:2.0:oob (This has been copied to your clipboard for you)"
        )
        input(
            "\n    Press Enter to open http://trakt.tv/oauth/applications and complete steps 1-6: "
        )
        webbrowser.open('http://trakt.tv/oauth/applications')
    else:
        print(
            "      1 - Open http://trakt.tv/oauth/applications on any computer"
        )
        print("      2 - Login to your Trakt account")
        print("      3 - Press the NEW APPLICATION button")
        print("      4 - Set the NAME field = hawke.one")
        print(
            "      5 - Set the REDIRECT URL field = urn:ietf:wg:oauth:2.0:oob")

    print("      6 - Press the SAVE APP button")

    print(
        "\n    Once steps 1-6 are completed, please proceed to steps 7-8 below:\n"
    )

    #client_id, client_secret = trakt.core._get_client_info()
    client_id = input("      7 - Copy and paste the displayed Client ID: ")
    client_secret = input(
        "      8 - Copy and paste the displayed Client secret: ")

    if platform.system() == "Windows":
        input(
            "\n    We will now generate a user code and open https://trakt.tv/activate for you to authenticate the app.\n    Press Enter to continue..."
        )
        webbrowser.open('https://trakt.tv/activate')
        print("\n")

    trakt.init(client_id=client_id, client_secret=client_secret, store=True)
    trakt_user = trakt.users.User('me')
    CONFIG["TRAKT_USERNAME"] = trakt_user.username

    print("\n\n")
    print("You're all done!\n")
    print(
        "Plex / Trakt accounts may be altered by re-running setup, or deleting the .env and .pytrakt.json files."
    )
    print("Expert settings may also be altered within the config.json file.")
    print(" ")
    print(" ")

    CONFIG.save()
Exemple #8
0
 password = input("Please enter your Plex password: "******"Now enter the server name: ")
 account = MyPlexAccount(username, password)
 plex = account.resource(servername).connect()  # returns a PlexServer instance
 token = plex._token
 users = account.users()
 if users:
     print("Managed user(s) found:")
     for user in users:
         if user.friend is True:
             print(user.title)
     print("If you want to use a managed user enter its username,")
     name = input("if you want to use your main account just press enter: ")
     while name:
         try:
             useraccount = account.user(name)
         except:
             if name != "_wrong":
                 print("Unknown username!")
             name = input("Please enter a managed username (or just press enter to use your main account): ")
             if not name:
                 print("Ok, continuing with your account " + username)
                 break
             continue
         try:
             token = account.user(name).get_token(plex.machineIdentifier)
             username = name
             break
         except:
             print("Impossible to find the managed user \'"+name+"\' on this server!")
             name = "_wrong"
Exemple #9
0
        print('Finished with photos...')
        sections.append(
            dict(name='Photos',
                 type='photo',
                 location='/data/Photos',
                 agent='com.plexapp.agents.none',
                 scanner='Plex Photo Scanner',
                 expected_media_count=has_photos))

    if sections:
        print('Ok, got the media, it`s time to create a library for you!')

        for section in sections:
            create_section(server, section)

    import logging
    logging.basicConfig(level=logging.INFO)
    shared_username = os.environ.get('SHARED_USERNAME', 'PKKid')
    try:
        user = account.user(shared_username)
        account.updateFriend(user, server)
        print('The server was shared with user "%s"' % shared_username)
    except NotFound:
        pass

    print('Base URL is %s' % server.url('', False))
    if opts.show_token:
        print('Auth token is %s' % account.authenticationToken)

    print('Server %s is ready to use!' % opts.server_name)
Exemple #10
0
def authenticate():
    method = plex_settings["authentication_method"].lower()
    try:
        home_user_sync = plex_settings["home_user_sync"].lower()
        home_username = plex_settings["home_username"]
        home_server_base_url = plex_settings["home_server_base_url"]
    except Exception:
        home_user_sync = "false"
        home_username = ""
        home_server_base_url = ""

    try:
        # Direct connection
        if method == "direct":
            base_url = plex_settings["base_url"]
            token = plex_settings["token"]
            plex = PlexServer(base_url, token)

        # Myplex connection
        elif method == "myplex":
            plex_server = plex_settings["server"]
            plex_user = plex_settings["myplex_user"]
            plex_password = plex_settings["myplex_password"]

            if home_user_sync == "true":
                if home_username == "":
                    logger.error(
                        "Home authentication cancelled as certain home_user settings are invalid"
                    )
                    return None
                try:
                    logger.warning(
                        "Authenticating as admin for MyPlex home user: %s"
                        % (home_username)
                    )
                    plex_account = MyPlexAccount(plex_user, plex_password)
                    plex_server_home = PlexServer(
                        home_server_base_url, plex_account.authenticationToken
                    )

                    logger.warning("Retrieving home user information")
                    plex_user_account = plex_account.user(home_username)

                    logger.warning("Retrieving user token for MyPlex home user")
                    plex_user_token = plex_user_account.get_token(
                        plex_server_home.machineIdentifier
                    )

                    logger.warning("Retrieved user token for MyPlex home user")
                    plex = PlexServer(home_server_base_url, plex_user_token)
                    logger.warning("Successfully authenticated for MyPlex home user")
                except Exception as e:
                    logger.error(
                        "Error occured during Plex Home user lookup or server authentication: %s"
                        % (e)
                    )
            else:
                account = MyPlexAccount(plex_user, plex_password)
                plex = account.resource(plex_server).connect()
        else:
            logger.critical(
                "[PLEX] Failed to authenticate due to invalid settings or authentication info, exiting..."
            )
            sys.exit()
        return plex
    except Exception as e:
        logger.error("Unable to authenticate to Plex Media Server, traceback: %s" % (e))
        return None