From ffbd6894c22538dbb319e750bf51082b39aab8b6 Mon Sep 17 00:00:00 2001 From: blackicedbear Date: Tue, 10 Mar 2026 12:22:24 +0100 Subject: [PATCH] feat(RTLP): add premium bypass option to download premium-only content By default, content with tier 'PREMIUM' is skipped. Use --premium-bypass flag to download premium movies and episodes. Co-Authored-By: Claude Opus 4.6 --- RTLP/__init__.py | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/RTLP/__init__.py b/RTLP/__init__.py index f6bf504..1af1923 100644 --- a/RTLP/__init__.py +++ b/RTLP/__init__.py @@ -34,12 +34,14 @@ class RTLP(Service): @staticmethod @click.command(name="RTLP", short_help="https://plus.rtl.de", help=__doc__) @click.argument("title", type=str) + @click.option("--premium-bypass", is_flag=True, default=False, help="Download premium-only content (default: skip premium content).") @click.pass_context def cli(ctx: click.Context, **kwargs: Any) -> RTLP: return RTLP(ctx, **kwargs) - def __init__(self, ctx: click.Context, title: str): + def __init__(self, ctx: click.Context, title: str, premium_bypass: bool = False): self.title = title + self.premium_bypass = premium_bypass super().__init__(ctx) def get_session(self) -> requests.Session: @@ -208,6 +210,10 @@ class RTLP(Service): self.log.debug(f"Movie ID: {content_id}, Title: {movie_data['title']}") + if self._is_premium(movie_data) and not self.premium_bypass: + self.log.info(f"Skipping premium movie: {movie_data['title']} (use --premium-bypass to download)") + return Movies([]) + return Movies([ Movie( id_=content_id, @@ -247,6 +253,10 @@ class RTLP(Service): if 'format' not in episode_data or 'title' not in episode_data['format']: raise ValueError("Missing 'format.title' in episode_data.") + if self._is_premium(episode_data) and not self.premium_bypass: + self.log.info(f"Skipping premium episode: {episode_data['title']} (use --premium-bypass to download)") + return Series([]) + return Series([ Episode( id_=content_id, @@ -282,6 +292,10 @@ class RTLP(Service): for episode in season_data['episodes']: self._validate_required_fields(episode, ['id', 'title', 'number', 'episodeSeason'], 'episode') + if self._is_premium(episode) and not self.premium_bypass: + self.log.info(f"Skipping premium episode: {episode['title']} (use --premium-bypass to download)") + continue + episodes.append(Episode( id_=episode['id'], service=self.__class__, @@ -334,6 +348,10 @@ class RTLP(Service): for episode in season_data['episodes']: self._validate_required_fields(episode, ['id', 'title', 'number', 'episodeSeason'], 'episode') + if self._is_premium(episode) and not self.premium_bypass: + self.log.info(f"Skipping premium episode: {episode['title']} (use --premium-bypass to download)") + continue + episodes.append(Episode( id_=episode['id'], service=self.__class__, @@ -447,6 +465,10 @@ class RTLP(Service): return response_data['data'] + def _is_premium(self, data: dict) -> bool: + """Check if content is premium-only (skipped unless premium_bypass is enabled).""" + return data.get('tier') == 'PREMIUM' + @staticmethod def _get_episode_season(episode: dict) -> Optional[int]: """Extract the season number (ordinal or year) from episode data."""