diff --git a/VERSION b/VERSION index 2bf337b5..370a58cc 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.16.2-develop27 +1.16.2-develop28 diff --git a/config/config.yml.template b/config/config.yml.template index a4b38bcb..08dfb185 100644 --- a/config/config.yml.template +++ b/config/config.yml.template @@ -115,6 +115,7 @@ sonarr: # Can be individually specified trakt: client_id: ################################################################ client_secret: ################################################################ + pin: authorization: # everything below is autofilled by the script access_token: diff --git a/docs/config/radarr.md b/docs/config/radarr.md index 018476de..4779d909 100644 --- a/docs/config/radarr.md +++ b/docs/config/radarr.md @@ -4,6 +4,8 @@ Configuring [Radarr](https://radarr.video/) is optional but will allow you to se Radarr V2 may work, but it is not supported please upgrade to V3 if you can. +Items in your List Exclusions will be ignored by PMM. + A `radarr` mapping can be either in the root of the config file as global mapping for all libraries, or you can specify the `radarr` mapping individually per library. Below is a `radarr` mapping example and the full set of attributes: diff --git a/docs/config/sonarr.md b/docs/config/sonarr.md index fc25b025..b6efae4b 100644 --- a/docs/config/sonarr.md +++ b/docs/config/sonarr.md @@ -4,6 +4,8 @@ Configuring [Sonarr](https://sonarr.tv/) is optional but will allow you to send Sonarr V2 may work, but it is not supported please upgrade to V3 if you can. +Items in your List Exclusions will be ignored by PMM. + A `sonarr` mapping can be either in the root of the config file as global mapping for all libraries, or you can specify the `sonarr` mapping individually per library. Below is a `sonarr` mapping example and the full set of attributes: diff --git a/docs/config/trakt.md b/docs/config/trakt.md index b5f31232..1f635dbc 100644 --- a/docs/config/trakt.md +++ b/docs/config/trakt.md @@ -9,6 +9,7 @@ Below is a `trakt` mapping example and the full set of attributes: trakt: client_id: ################################################################ client_secret: ################################################################ + pin: authorization: access_token: token_type: @@ -22,22 +23,17 @@ trakt: |:----------------|:--------------------------------|:-------:|:--------:| | `client_id` | Trakt Application Client ID | N/A | ✅ | | `client_secret` | Trakt Application Client Secret | N/A | ✅ | +| `pin` | Trakt Pin | None | ❌ | * All other attributes will be filled in by the script. -* To connect to Trakt.tv you must create a Trakt application and supply the script the `client id` and `client secret` provided, please do the following: +* To connect to Trakt.tv you must create a Trakt application and supply the script the `client_id`, `client_secret`, and `pin` provided, please do the following: 1. [Click here to create a Trakt API application.](https://trakt.tv/oauth/applications/new) 2. Enter a `Name` for the application. 3. Enter `urn:ietf:wg:oauth:2.0:oob` for `Redirect uri`. 4. Click the `SAVE APP` button. -5. Record the `Client ID` and `Client Secret`. +5. Record the `Client ID` and `Client Secret` as `client_id` and `client_secret` in your Configuration File. +6. Navigate to `https://trakt.tv/oauth/authorize?response_type=code&redirect_uri=urn:ietf:wg:oauth:2.0:oob&client_id=<>` replacing `<>` with your Client ID. +7. Record the `PIN` as `pin` in your Configuration File. -* On the first run, the script will walk the user through the OAuth flow by producing a Trakt URL for the user to follow. Once authenticated at the Trakt URL, the user needs to return the code to the script. If the code is correct, the script will populate the `authorization` sub-attributes to use in subsequent runs. - -

OAuth Flow using Docker

- -To authenticate Trakt the first time, you need run the container with the `-it` flags in order to walk through the OAuth flow mentioned above. Once you have the Trakt authentication data saved into the YAML, you'll be able to run the container normally. - -

OAuth Flow using unRAID Docker

- -Directions on how to authenticate Trakt on unRAID can be found on the [unRAID Walkthrough](../home/guides/unraid.md#advanced-installation-authenticating-trakt-or-myanimelist) page. +* Run the script shortly after obtaining your pin I don't know if it expires at any point or not. \ No newline at end of file diff --git a/modules/config.py b/modules/config.py index 4c7cddd3..e9d252df 100644 --- a/modules/config.py +++ b/modules/config.py @@ -430,6 +430,7 @@ class ConfigFile: self.Trakt = Trakt(self, { "client_id": check_for_attribute(self.data, "client_id", parent="trakt", throw=True), "client_secret": check_for_attribute(self.data, "client_secret", parent="trakt", throw=True), + "pin": check_for_attribute(self.data, "pin", parent="trakt", default_is_none=True), "config_path": self.config_path, "authorization": self.data["trakt"]["authorization"] if "authorization" in self.data["trakt"] else None }) diff --git a/modules/trakt.py b/modules/trakt.py index 51ecd59c..1167220d 100644 --- a/modules/trakt.py +++ b/modules/trakt.py @@ -6,7 +6,6 @@ from ruamel import yaml logger = util.logger redirect_uri = "urn:ietf:wg:oauth:2.0:oob" -redirect_uri_encoded = redirect_uri.replace(":", "%3A") base_url = "https://api.trakt.tv" builders = [ "trakt_collected_daily", "trakt_collected_weekly", "trakt_collected_monthly", "trakt_collected_yearly", "trakt_collected_all", @@ -33,6 +32,7 @@ class Trakt: self.config = config self.client_id = params["client_id"] self.client_secret = params["client_secret"] + self.pin = params["pin"] self.config_path = params["config_path"] self.authorization = params["authorization"] logger.secret(self.client_secret) @@ -41,13 +41,16 @@ class Trakt: self._authorization() def _authorization(self): - url = f"https://trakt.tv/oauth/authorize?response_type=code&client_id={self.client_id}&redirect_uri={redirect_uri_encoded}" - logger.info(f"Navigate to: {url}") - logger.info("If you get an OAuth error your client_id or client_secret is invalid") - webbrowser.open(url, new=2) - try: pin = util.logger_input("Trakt pin (case insensitive)", timeout=300).strip() - except TimeoutExpired: raise Failed("Input Timeout: Trakt pin required.") - if not pin: raise Failed("Trakt Error: No input Trakt pin required.") + if self.pin: + pin = self.pin + else: + url = f"https://trakt.tv/oauth/authorize?response_type=code&redirect_uri={redirect_uri}&client_id={self.client_id}" + logger.info(f"Navigate to: {url}") + logger.info("If you get an OAuth error your client_id or client_secret is invalid") + webbrowser.open(url, new=2) + try: pin = util.logger_input("Trakt pin (case insensitive)", timeout=300).strip() + except TimeoutExpired: raise Failed("Input Timeout: Trakt pin required.") + if not pin: raise Failed("Trakt Error: Trakt pin required.") json = { "code": pin, "client_id": self.client_id, @@ -94,6 +97,7 @@ class Trakt: if self.authorization != authorization and not self.config.read_only: yaml.YAML().allow_duplicate_keys = True config, ind, bsi = yaml.util.load_yaml_guess_indent(open(self.config_path)) + config["trakt"]["pin"] = None config["trakt"]["authorization"] = { "access_token": authorization["access_token"], "token_type": authorization["token_type"],