Skip to content

Watchlist not found #28

@javikobcn

Description

@javikobcn

linuxserver.io

Hi, the last days I'm having problems with syncing my library


Expected Behavior

Sync plex without errors

Current Behavior

Can't sync my library properly

Steps to Reproduce

Environment

**OS: Docker on Synology DSM 7.1
Installed via docker compose with latest version

Command used to create docker container (run/create/compose/screenshot)

Docker compose:

services:
plextraktsync:
image: lscr.io/linuxserver-labs/plextraktsync:latest
container_name: plextraktsync
environment:
- PUID=1027
- PGID=100
- TZ=Europe/Madrid
volumes:
- /volume2/docker/plextraktsync/config:/config
restart: unless-stopped

Docker logs

INFO PlexTraktSync [0.34.7]
INFO Connecting with url: https://192-168-1-100.8a260bde73f6447c94d82bd16f082736.plex.direct:32400, timeout 30 seconds
INFO Sync Movie sections: ['Documentales', 'Películas']
INFO Sync Show sections: ['Otros Documentales', 'Series']
INFO Enable sync plugin 'AddCollectionPlugin': False
INFO Enable sync plugin 'ClearCollectedPlugin': False
INFO Enable sync plugin 'LikedListsPlugin': True
INFO Enable sync plugin 'SyncRatingsPlugin': True
INFO Enable sync plugin 'SyncWatchedPlugin': True
INFO Enable sync plugin 'TraktListsPlugin': True
INFO Enable sync plugin 'WatchListPlugin': True
ERROR (404) not_found; https://metadata.provider.plex.tv/library/sections/watchlist/all?includeCollections=0&includeExternalMedia=0&includeUserState=0
╭──────────────────────────────────────────────────────────────── Traceback (most recent call last) ─────────────────────────────────────────────────────────────────╮
│ /lsiopy/lib/python3.12/site-packages/plextraktsync/cli.py:28 in wrap │
│ │
│ 25 │ │ │ cmd = getattr(module, name) │
│ 26 │ │ │ │
│ 27 │ │ │ try: │
│ ❱ 28 │ │ │ │ cmd(*args, **kwargs) │
│ 29 │ │ │ except EOFError as e: │
│ 30 │ │ │ │ raise ClickException(f"Program requested terminal, No terminal is │
│ connected: {e}") │
│ 31 │ │ │ except ClickException as e: │
│ │
│ /lsiopy/lib/python3.12/site-packages/plextraktsync/commands/sync.py:74 in sync │
│ │
│ 71 │ │ │ w.print_plan(print=logger.info) │
│ 72 │ │ if dry_run: │
│ 73 │ │ │ logger.info("Enabled dry-run mode: not making actual changes") │
│ ❱ 74 │ │ run_async(runner, walker=w, dry_run=config.dry_run) │
│ 75 │
│ │
│ /lsiopy/lib/python3.12/site-packages/decorator.py:235 in fun │
│ │
│ 232 │ │ def fun(*args, **kw): │
│ 233 │ │ if not kwsyntax: │
│ 234 │ │ │ │ args, kw = fix(args, kw, sig) │
│ ❱ 235 │ │ │ return caller(func, *(extras + args), **kw) │
│ 236 │ │
│ 237 │ fun.name = func.name
│ 238 │ fun.doc = func.doc
│ │
│ /lsiopy/lib/python3.12/site-packages/plextraktsync/decorators/coro.py:15 in coro │
│ │
│ 12 │ │
│ 13 │ pallets/click#85 (comment)
│ 14 │ """ │
│ ❱ 15 │ return asyncio.run(f(*args, **kwargs)) │
│ 16 │
│ │
│ /usr/lib/python3.12/asyncio/runners.py:195 in run │
│ │
│ 192 │ │ │ "asyncio.run() cannot be called from a running event loop") │
│ 193 │ │
│ 194 │ with Runner(debug=debug, loop_factory=loop_factory) as runner: │
│ ❱ 195 │ │ return runner.run(main) │
│ 196 │
│ 197 │
│ 198 def _cancel_all_tasks(loop): │
│ │
│ /usr/lib/python3.12/asyncio/runners.py:118 in run │
│ │
│ 115 │ │ │
│ 116 │ │ self._interrupt_count = 0 │
│ 117 │ │ try: │
│ ❱ 118 │ │ │ return self._loop.run_until_complete(task) │
│ 119 │ │ except exceptions.CancelledError: │
│ 120 │ │ │ if self._interrupt_count > 0: │
│ 121 │ │ │ │ uncancel = getattr(task, "uncancel", None) │
│ │
│ /usr/lib/python3.12/asyncio/base_events.py:691 in run_until_complete │
│ │
688 │ │ if not future.done(): │
│ 689 │ │ │ raise RuntimeError('Event loop stopped before Future completed.') │
│ 690 │ │ │
│ ❱ 691 │ │ return future.result() │
│ 692 │ │
│ 693 │ def stop(self): │
│ 694 │ │ """Stop running the event loop. │
│ │
│ /lsiopy/lib/python3.12/site-packages/plextraktsync/commands/sync.py:13 in run_async │
│ │
│ 10 │
│ 11 @coro
│ 12 async def run_async(runner, **kwargs): │
│ ❱ 13 │ await runner.sync(**kwargs) │
│ 14 │
│ 15 │
│ 16 def sync( │
│ │
│ /lsiopy/lib/python3.12/site-packages/plextraktsync/sync/Sync.py:45 in sync │
│ │
│ 42 │ │ self.walker = walker │
│ 43 │ │ is_partial = walker.is_partial │
│ 44 │ │ │
│ ❱ 45 │ │ pm = self.pm │
│ 46 │ │ pm.hook.init(sync=self, pm=pm, is_partial=is_partial, dry_run=dry_run) │
│ 47 │ │ │
│ 48 │ │ if self.config.need_library_walk: │
│ │
│ /usr/lib/python3.12/functools.py:998 in get
│ │
│ 995 │ │ │ raise TypeError(msg) from None │
│ 996 │ │ val = cache.get(self.attrname, _NOT_FOUND) │
│ 997 │ │ if val is _NOT_FOUND: │
│ ❱ 998 │ │ │ val = self.func(instance) │
│ 999 │ │ │ try: │
│ 1000 │ │ │ │ cache[self.attrname] = val │
│ 1001 │ │ │ except TypeError: │
│ │
│ /lsiopy/lib/python3.12/site-packages/plextraktsync/sync/Sync.py:37 in pm │
│ │
│ 34 │ │ from .plugin import SyncPluginManager │
│ 35 │ │ │
│ 36 │ │ pm = SyncPluginManager() │
│ ❱ 37 │ │ pm.register_plugins(self) │
│ 38 │ │ │
│ 39 │ │ return pm │
│ 40 │
│ │
│ /lsiopy/lib/python3.12/site-packages/plextraktsync/sync/plugin/SyncPluginManager.py:68 in register_plugins │
│ │
│ 65 │ │ │ with measure_time(f"Created '{plugin.name}' plugin", │
│ logger=self.logger.debug): │
│ 66 │ │ │ │ p = plugin.factory(sync) │
│ 67 │ │ │ with measure_time(f"Registered '{plugin.name}' plugin", │
│ logger=self.logger.debug): │
│ ❱ 68 │ │ │ │ self.pm.register(p) │
│ 69 │
│ │
│ /lsiopy/lib/python3.12/site-packages/apluggy/wrap/main.py:126 in register │
│ │
│ 123 │ ) -> Union[str, None]: │
│ 124 │ │ if callable(plugin): │
│ 125 │ │ │ plugin = plugin() │
│ ❱ 126 │ │ return super().register(plugin, name=name) │
│ 127 │ │
│ 128 │ def get_canonical_name(self, plugin: _Plugin) -> str: │
│ 129 │ │ '''Override to include class names in plugin names.''' │
│ │
│ /lsiopy/lib/python3.12/site-packages/pluggy/_manager.py:157 in register │
│ │
│ 154 │ │ │
│ 155 │ │ # register matching hook implementations of the plugin │
│ 156 │ │ for name in dir(plugin): │
│ ❱ 157 │ │ │ hookimpl_opts = self.parse_hookimpl_opts(plugin, name) │
│ 158 │ │ │ if hookimpl_opts is not None: │
│ 159 │ │ │ │ normalize_hookimpl_opts(hookimpl_opts) │
│ 160 │ │ │ │ method: _HookImplFunction[object] = getattr(plugin, name) │
│ │
│ /lsiopy/lib/python3.12/site-packages/pluggy/_manager.py:184 in parse_hookimpl_opts │
│ │
│ 181 │ │ customize how hook implementation are picked up. By default, returns the │
│ 182 │ │ options for items decorated with :class:HookimplMarker. │
│ 183 │ │ """ │
│ ❱ 184 │ │ method: object = getattr(plugin, name) │
│ 185 │ │ if not inspect.isroutine(method): │
│ 186 │ │ │ return None │
│ 187 │ │ try: │
│ │
│ /usr/lib/python3.12/functools.py:998 in get
│ │
│ 995 │ │ │ raise TypeError(msg) from None │
│ 996 │ │ val = cache.get(self.attrname, _NOT_FOUND) │
│ 997 │ │ if val is _NOT_FOUND: │
│ ❱ 998 │ │ │ val = self.func(instance) │
│ 999 │ │ │ try: │
│ 1000 │ │ │ │ cache[self.attrname] = val │
│ 1001 │ │ │ except TypeError: │
│ │
│ /lsiopy/lib/python3.12/site-packages/plextraktsync/sync/WatchListPlugin.py:60 in plex_wl │
│ │
│ 57 │ def plex_wl(self): │
│ 58 │ │ from plextraktsync.plex.PlexWatchList import PlexWatchList │
│ 59 │ │ │
│ ❱ 60 │ │ return PlexWatchList(self.plex.watchlist()) │
│ 61 │ │
│ 62 │ @cached_property │
│ 63 │ def sync_wl(self): │
│ │
│ /lsiopy/lib/python3.12/site-packages/plextraktsync/plex/PlexApi.py:249 in watchlist │
│ │
│ 246 │ │ │ "includeUserState": 0, │
│ 247 │ │ } │
│ 248 │ │ try: │
│ ❱ 249 │ │ │ return self.account.watchlist(libtype=libtype, **params) │
│ 250 │ │ except BadRequest as e: │
│ 251 │ │ │ self.logger.error(f"Error during {self.account.username} watchlist access: │
│ {e}") │
│ 252 │ │ │ return None │
│ │
│ /lsiopy/lib/python3.12/site-packages/plexapi/myplex.py:947 in watchlist │
│ │
│ 944 │ │ params.update(kwargs) │
│ 945 │ │ │
│ 946 │ │ key = │
│ f'{self.METADATA}/library/sections/watchlist/{filter}{utils.joinArgs(params)}' │
│ ❱ 947 │ │ return self._toOnlineMetadata(self.fetchItems(key, maxresults=maxresults), │
│ **kwargs) │
│ 948 │ │
│ 949 │ def onWatchlist(self, item): │
│ 950 │ │ """ Returns True if the item is on the user's watchlist. │
│ │
│ /lsiopy/lib/python3.12/site-packages/plexapi/base.py:281 in fetchItems │
│ │
│ 278 │ │ │ headers['X-Plex-Container-Start'] = str(container_start) │
│ 279 │ │ │ headers['X-Plex-Container-Size'] = str(container_size) │
│ 280 │ │ │ │
│ ❱ 281 │ │ │ data = self._server.query(ekey, headers=headers, params=params) │
│ 282 │ │ │ subresults = self.findItems(data, cls, ekey, **kwargs) │
│ 283 │ │ │ total_size = utils.cast(int, data.attrib.get('totalSize') or │
│ data.attrib.get('size')) or len(subresults) │
│ 284 │
│ │
│ /lsiopy/lib/python3.12/site-packages/plexapi/myplex.py:244 in query │
│ │
│ 241 │ │ │ │ │ raise TwoFactorRequired(message) │
│ 242 │ │ │ │ raise Unauthorized(message) │
│ 243 │ │ │ elif response.status_code == 404: │
│ ❱ 244 │ │ │ │ raise NotFound(message) │
│ 245 │ │ │ elif response.status_code == 422 and "Invalid token" in response.text: │
│ 246 │ │ │ │ raise Unauthorized(message) │
│ 247 │ │ │ else: │
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
NotFound: (404) not_found; https://metadata.provider.plex.tv/library/sections/watchlist/all?includeCollections=0&includeExternalMedia=0&includeUserState=0
Error: Error running sync command: (404) not_found; https://metadata.provider.plex.tv/library/sections/watchlist/all?includeCollections=0&includeExternalMedia=0&includeUserState=0

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions