-
-
Notifications
You must be signed in to change notification settings - Fork 2
Description
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