Schaka / janitorr

Cleans your Radarr, Sonarr, Jellyseerr and Jellyfin before you run out of space
GNU General Public License v3.0
310 stars 6 forks source link

500 Internal Server Error - Emby #55

Closed kylehandy123 closed 1 month ago

kylehandy123 commented 1 month ago

Hi, I'm sorry to have to open another issue, but after the latest update, I am still receiving "500 Internal Server Error". Currently, the log is filling and posting so fast, I'm not sure what Janitorr is doing as my entire log is jumbled with error messages. See log below.

        at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:70) ~[na:na]
        at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:99) ~[na:na]
        at jdk.proxy4/jdk.proxy4.$Proxy49.addPathToLibrary(Unknown Source) ~[na:na]
        at com.github.schaka.janitorr.mediaserver.MediaServerClient$DefaultImpls.addPathToLibrary$default(MediaServerClient.kt:24) ~[na:na]
        at com.github.schaka.janitorr.mediaserver.emby.EmbyRestService.updateLeavingSoon(EmbyRestService.kt:70) ~[na:na]
        at com.github.schaka.janitorr.mediaserver.MediaServerService.updateLeavingSoon$default(MediaServerService.kt:33) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule.cleanupMediaType(AbstractCleanupSchedule.kt:73) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule.scheduleDelete(AbstractCleanupSchedule.kt:49) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule.scheduleDelete$default(AbstractCleanupSchedule.kt:33) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at com.github.schaka.janitorr.cleanup.MediaCleanupSchedule.runSchedule(MediaCleanupSchedule.kt:52) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.lang.reflect.Method.invoke(Method.java:580) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354) ~[na:na]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[na:na]
        at org.springframework.cache.interceptor.CacheInterceptor.lambda$invoke$0(CacheInterceptor.java:64) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheAspectSupport.invokeOperation(CacheAspectSupport.java:416) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheAspectSupport.evaluate(CacheAspectSupport.java:548) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:433) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:395) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:74) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[na:na]
        at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720) ~[na:na]
        at com.github.schaka.janitorr.cleanup.MediaCleanupSchedule$$SpringCGLIB$$0.runSchedule(<generated>) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.lang.reflect.Method.invoke(Method.java:580) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at org.springframework.scheduling.support.ScheduledMethodRunnable.runInternal(ScheduledMethodRunnable.java:130) ~[na:na]
        at org.springframework.scheduling.support.ScheduledMethodRunnable.lambda$run$2(ScheduledMethodRunnable.java:124) ~[na:na]
        at io.micrometer.observation.Observation.observe(Observation.java:499) ~[com.github.schaka.janitorr.JanitorrApplicationKt:1.13.2]
        at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:124) ~[na:na]
        at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at java.base@21.0.3/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572) ~[na:na]
        at java.base@21.0.3/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:358) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) ~[na:na]
        at java.base@21.0.3/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ~[na:na]
        at java.base@21.0.3/java.lang.Thread.runWith(Thread.java:1596) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.lang.VirtualThread.run(VirtualThread.java:309) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.lang.VirtualThread$VThreadContinuation$1.run(VirtualThread.java:190) ~[na:na]

2024-08-26T20:52:39.441-04:00  INFO 1 --- [   scheduling-1] c.g.s.j.s.sonarr.SonarrRestService       : Dry run - not deleting any TV shows without files or monitoring
2024-08-26T20:52:40.036-04:00 ERROR 1 --- [   scheduling-1] o.s.s.s.TaskUtils$LoggingErrorHandler    : Unexpected error occurred in scheduled task

feign.FeignException$InternalServerError: [500 Internal Server Error] during [POST] to [http://192.168.1.201:8096/emby/Library/VirtualFolders/Paths?refreshLibrary=true] [EmbyMediaServerClient#addPathToLibrary(AddPathRequest,boolean)]: [Unrecognized Guid format.]
        at feign.codec.ErrorDecoder$Default.decode(ErrorDecoder.java:103) ~[na:na]
        at feign.InvocationContext.decodeError(InvocationContext.java:126) ~[na:na]
        at feign.InvocationContext.proceed(InvocationContext.java:72) ~[na:na]
        at feign.ResponseHandler.handleResponse(ResponseHandler.java:63) ~[na:na]
        at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:114) ~[na:na]
        at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:70) ~[na:na]
        at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:99) ~[na:na]
        at jdk.proxy4/jdk.proxy4.$Proxy49.addPathToLibrary(Unknown Source) ~[na:na]
        at com.github.schaka.janitorr.mediaserver.MediaServerClient$DefaultImpls.addPathToLibrary$default(MediaServerClient.kt:24) ~[na:na]
        at com.github.schaka.janitorr.mediaserver.emby.EmbyRestService.updateLeavingSoon(EmbyRestService.kt:70) ~[na:na]
        at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule.deleteTvShows(AbstractCleanupSchedule.kt:103) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule$scheduleDelete$2.invoke(AbstractCleanupSchedule.kt:49) ~[na:na]
        at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule$scheduleDelete$2.invoke(AbstractCleanupSchedule.kt:49) ~[na:na]
        at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule.cleanupMediaType(AbstractCleanupSchedule.kt:76) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule.scheduleDelete(AbstractCleanupSchedule.kt:49) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at com.github.schaka.janitorr.cleanup.TagBasedCleanupSchedule.runSchedule(TagBasedCleanupSchedule.kt:52) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.lang.reflect.Method.invoke(Method.java:580) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354) ~[na:na]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[na:na]
        at org.springframework.cache.interceptor.CacheInterceptor.lambda$invoke$0(CacheInterceptor.java:64) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheAspectSupport.invokeOperation(CacheAspectSupport.java:416) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheAspectSupport.evaluate(CacheAspectSupport.java:548) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:433) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:395) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:74) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[na:na]
        at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720) ~[na:na]
        at com.github.schaka.janitorr.cleanup.TagBasedCleanupSchedule$$SpringCGLIB$$0.runSchedule(<generated>) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.lang.reflect.Method.invoke(Method.java:580) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at org.springframework.scheduling.support.ScheduledMethodRunnable.runInternal(ScheduledMethodRunnable.java:130) ~[na:na]
        at org.springframework.scheduling.support.ScheduledMethodRunnable.lambda$run$2(ScheduledMethodRunnable.java:124) ~[na:na]
        at io.micrometer.observation.Observation.observe(Observation.java:499) ~[com.github.schaka.janitorr.JanitorrApplicationKt:1.13.2]
        at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:124) ~[na:na]
        at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at java.base@21.0.3/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572) ~[na:na]
        at java.base@21.0.3/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:358) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) ~[na:na]
        at java.base@21.0.3/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ~[na:na]
        at java.base@21.0.3/java.lang.Thread.runWith(Thread.java:1596) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.lang.VirtualThread.run(VirtualThread.java:309) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.lang.VirtualThread$VThreadContinuation$1.run(VirtualThread.java:190) ~[na:na]

Here is my current config. It was recreated brand new today, after not touching Janitorr for a month.

server:
  port: 8978

# File system access (same mapping as Sonarr, Radarr and Jellyfin) is required to delete TV shows by season and create "Leaving Soon" collections in Jellyfin
# Currently, Jellyfin does not support an easy way to add only a few seasons or movies to a collection, we need access to temporary symlinks
# Additionally, checks to prevent deletion on currently still seeding media currently require file system access as well
file-system:
  access: true
  validate-seeding: true # validates seeding by checking if the original file exists and skips deletion - turning this off will send a delete to the *arrs even if a torrent may still be active
  leaving-soon-dir: "/data/leaving-soon" # A directory this container can write to and Jellyfin can find under the same path - this will contain new folders with symlinks to files for Jellyfin's "Leaving Soon" collections
  from-scratch: true # Clean up entire "Leaving Soon" directory and rebuild from scratch - this can help with clearing orphaned data - turning this off can save resources (less writes to drive)
  free-space-check-dir: "/data" # This is the default directory Janitorr uses to check how much space is left on your drives. By default, it checks the entire root - you may point it at a specific folder

application:
  dry-run: true
  whole-tv-show: false # activating this will treat as a whole show as recently download/watched from a single episode, rather than that episode's season - shows will be deleted as a whole
  whole-show-seeding-check: false # Turning this off, disables the seeding check entirely if whole-tv-show is enabled. Activating this check will keep a whole TV show if any season is still seeding (requires file access).
  leaving-soon: 14d # 14 days before a movie is deleted, it gets added to a "Leaving Soon" type collection (i.e. movies that are 76 to 89 days old)
  exclusion-tag: "janitorr_keep" # Set this tag to your movies or TV shows in the *arrs to exclude media from being cleaned up

  media-deletion:
    enabled: true
    movie-expiration:
      # Percentage of free disk space to expiration time - if the highest given number is not reached, nothing will be deleted
      # If filesystem access is not given, disk percentage can't be determined. As a result, Janitorr will always choose the largest expiration time.
      30: 15d # 15 days
      40: 30d # 1 month - if a movie's files on your system are older than this, they will be deleted
      50: 60d # 2 months
      60: 90d # 3 months
    season-expiration:
      30: 15d # 15 days
      40: 20d # 20 days - if a season's files on your system are older than this, they will be deleted
      50: 60d # 2 months
      60: 120d # 4 months

  tag-based-deletion:
    enabled: true
    minimum-free-disk-percent: 100
    schedules:
      - tag: 5 - demo
        expiration: 30d
      - tag: 10 - demo
        expiration: 7d

  episode-deletion: # This ignores Jellystat. Only grab history matters. It also doesn't clean up Jellyfin. There is NO seeding check either.
    enabled: true
    tag: janitorr_daily # Shows tagged with this will have all episodes of their LATEST season deleted by the below thresholds
    max-episodes: 10 # maximum (latest) episodes of this season to keep
    max-age: 30d # Maximum age to keep any episode at all - even the last 10 episodes would expire after 30 days in this example

clients:
  sonarr:
    enabled: true
    url: "http://192.168.1.201:8989"
    api-key: "*****"
    delete-empty-shows: true # If a show that was "touched" by Janitorr contains no files and has no monitored seasons at all, it will get deleted as part of orphan cleanup
  radarr:
    enabled: true
    url: "http://192.168.1.201:7878"
    api-key: "*****"

  ## You can only choose one out of Jellyfin or Emby.
  ## User login is only needed if deletion is enabled.
  jellyfin:
    enabled: false
    url: "http://localhost:8096"
    api-key: "*****"
    username: Janitorr
    password: janitorr
    delete: true # Jellyfin setup is required for JellyStat. However, if you don't want Janitorr to send delete requests to the Jellyfin API, disable it here

  ## You can only choose one out of Jellyfin or Emby. Emby support is secondary.
  ## User login is only needed if deletion is enabled.
  emby:
    enabled: true
    url: "http://192.168.1.201:8096"
    api-key: "*****"
    username: *****
    password: *****
    delete: true # Emby setup is required for JellyStat. However, if you don't want Janitorr to send delete requests to the Emby API, disable it here
  jellyseerr:
    enabled: true
    url: "http://192.168.1.201:5055"
    api-key: "*****"
    match-server: false # Enable if you have several Radarr/Sonarr instances set up in Jellyseerr. Janitorr will match them by the host+port supplied in their respective config settings.
  jellystat:
    enabled: true
    whole-tv-show: false # Enabling this will make Jellystat consider TV shows as a whole if any episode of any season has been watched
    url: "http://192.168.1.201:3007"
    api-key: "*****"

Once again, apologies for reopening, but I'm hoping I can somehow resolve this so I can see Janitorr working, know what it's doing, and be able to use it.

Schaka commented 1 month ago

Seems like Emby changed their API again since the last time a ticket was created. I need to either find someone willing to maintain the Emby implementation or abandon support.

Please try the latest develop build for the image you're using and report back. If you don't respond within a week, I'll close this issue and assume things are fixed until I get another report.

@hacshacdgacs sorry for tagging you, but are you having issues like OP? Last time, your response was what helped me determine that things were working correctly.

hacshacdgacs commented 1 month ago

So far I haven't had any issues at all, I'll have a look when back at my pc to see what issues they've been having and check again

On Tue, 27 Aug 2024, 19:17 Schaka, @.***> wrote:

Seems like Emby changed their API again since the last time a ticket was created. I need to either find someone willing to maintain the Emby implementation or abandon support.

Please try the latest develop build for the image you're using and report back. If you don't respond within a week, I'll close this issue and assume things are fixed until I get another report.

@hacshacdgacs https://github.com/hacshacdgacs sorry for tagging you, but are you having issues like OP? Last time, your response was what helped me determine that things were working correctly.

— Reply to this email directly, view it on GitHub https://github.com/Schaka/janitorr/issues/55#issuecomment-2311749536, or unsubscribe https://github.com/notifications/unsubscribe-auth/AUMWJOBJLZFYOJMZ2V3FL33ZTQR2LAVCNFSM6AAAAABNFBVCTCVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDGMJRG42DSNJTGY . You are receiving this because you were mentioned.Message ID: @.***>

kylehandy123 commented 1 month ago

Switched to Develop image. Using the exact same config as above. Container will not start, here are the logs:

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/

 :: Spring Boot ::                (v3.3.2)

2024-08-27T03:58:38.878-04:00  INFO 1 --- [           main] c.g.s.janitorr.JanitorrApplicationKt     : Starting JanitorrApplicationKt using Java 21.0.4 with PID 1 (/app/classes started by root in /)
2024-08-27T03:58:38.881-04:00  INFO 1 --- [           main] c.g.s.janitorr.JanitorrApplicationKt     : No active profile set, falling back to 1 default profile: "default"
2024-08-27T03:58:40.373-04:00  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port 8080 (http)
2024-08-27T03:58:40.389-04:00  INFO 1 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2024-08-27T03:58:40.390-04:00  INFO 1 --- [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.26]
2024-08-27T03:58:40.445-04:00  INFO 1 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2024-08-27T03:58:40.446-04:00  INFO 1 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1482 ms
2024-08-27T03:58:40.767-04:00  WARN 1 --- [           main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'mediaCleanupSchedule' defined in file [/app/classes/com/github/schaka/janitorr/cleanup/MediaCleanupSchedule.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'mediaServer' defined in class path resource [com/github/schaka/janitorr/mediaserver/config/MediaServerConfig.class]: Unsatisfied dependency expressed through method 'mediaServer' parameter 2: Error creating bean with name 'application-com.github.schaka.janitorr.config.ApplicationProperties': Could not bind properties to 'ApplicationProperties' : prefix=application, ignoreInvalidFields=false, ignoreUnknownFields=true
2024-08-27T03:58:40.771-04:00  INFO 1 --- [           main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
2024-08-27T03:58:40.787-04:00  INFO 1 --- [           main] .s.b.a.l.ConditionEvaluationReportLogger : 

Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
2024-08-27T03:58:40.811-04:00 ERROR 1 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   : 

***************************
APPLICATION FAILED TO START
***************************

Description:

Failed to bind properties under 'application' to com.github.schaka.janitorr.config.ApplicationProperties:

    Reason: java.lang.NullPointerException: Parameter specified as non-null is null: method com.github.schaka.janitorr.config.ApplicationProperties.<init>, parameter mediaDeletion

Action:

Update your application's configuration

** Press ANY KEY to close this window ** 

Apologies if I'm completely blind and missed the obvious reason this is occurring when switching to the Develop image.

Schaka commented 1 month ago

You're likely not mapping your config file correctly into the container. It can't find media-deletion in your application.yml.

If you were using the native image before, use native-develop.

kylehandy123 commented 1 month ago

Remade container, loads application now as expected. Still receiving the same errors as the original log posted. Unrecognized Guid Format. I can confirm I am running the native-develop image now.

Schaka commented 1 month ago

Does it create the collection successfully? Can you see it in your Emby media folders? If yes, does it have a guid? What Emby version are you on?

Neither me on my test install nor hacshacdgacs seems to have that problem.

kylehandy123 commented 1 month ago

It does create a collection in Emby, Shows (Deleted Soon). Emby Version [4.8.8.0] Sorry, how would you check what the GUID is for the collection?

hacshacdgacs commented 1 month ago

Emby Version [4.9.0.30] is the latest emby version (Beta) and I don't and haven't that issue of guid.

Schaka commented 1 month ago

It does create a collection in Emby, Shows (Deleted Soon). Emby Version [4.8.8.0] Sorry, how would you check what the GUID is for the collection?

Sorry, it's a bit complicated. You need to go into the Dashboard => Library view.

Open F12 for the browser console, reload the site. Check the network tab for XHR connections. There should be one like Query?Limit=50[...]

Click on it, click Preview. The JSON items in there should have a GUID. This Guid is field is being used to later add more folders to existing collections in Emby.

The very call that errors for you complains that that GUID is invalid invalid when passing it to the call. So that's pretty weird. Please try the latest image again in 5-10minutes after this response and if possible provide the info I requested.

kylehandy123 commented 1 month ago

Hi Schaka, sorry for the delay, it was quite late during my last message. Here is the JSON output of my library view. I'm sending the whole thing as I'm not sure which GUID you'll need.

{Items: [{Name: "Anime", Locations: ["/media/media/anime"], CollectionType: "tvshows",…},…],…}
Items
: 
[{Name: "Anime", Locations: ["/media/media/anime"], CollectionType: "tvshows",…},…]
0
: 
{Name: "Anime", Locations: ["/media/media/anime"], CollectionType: "tvshows",…}
CollectionType
: 
"tvshows"
Guid
: 
"3d99ec3b05fe40a78416c7f40b6a2cd7"
Id
: 
"563010"
ItemId
: 
"563010"
LibraryOptions
: 
{EnableArchiveMediaFiles: false, EnablePhotos: true, EnableRealtimeMonitor: true,…}
Locations
: 
["/media/media/anime"]
Name
: 
"Anime"
PrimaryImageItemId
: 
"563010"
1
: 
{Name: "Audio books", Locations: ["/media/media/audio_books"], CollectionType: "audiobooks",…}
CollectionType
: 
"audiobooks"
Guid
: 
"bac6ff2b1b2246548ede7f6d9fe2f27f"
Id
: 
"565321"
ItemId
: 
"565321"
LibraryOptions
: 
{EnableArchiveMediaFiles: false, EnablePhotos: true, EnableRealtimeMonitor: true,…}
Locations
: 
["/media/media/audio_books"]
Name
: 
"Audio books"
2
: 
{Name: "Live TV Recordings", Locations: ["/media/media/emby_live_tv"],…}
Guid
: 
"b0facf75a3de4cc9aedce3cbb3ea5eb8"
Id
: 
"613657"
ItemId
: 
"613657"
LibraryOptions
: 
{EnableArchiveMediaFiles: false, EnablePhotos: true, EnableRealtimeMonitor: true,…}
Locations
: 
["/media/media/emby_live_tv"]
Name
: 
"Live TV Recordings"
PrimaryImageItemId
: 
"613657"
3
: 
{Name: "Movies", Locations: ["/media/media/movies"], CollectionType: "movies",…}
CollectionType
: 
"movies"
Guid
: 
"0d2dcacba8a147b0b94278c9b15a59e1"
Id
: 
"554407"
ItemId
: 
"554407"
LibraryOptions
: 
{EnableArchiveMediaFiles: false, EnablePhotos: true, EnableRealtimeMonitor: true,…}
Locations
: 
["/media/media/movies"]
Name
: 
"Movies"
PrimaryImageItemId
: 
"554407"
4
: 
{Name: "Music", Locations: ["/media/media/music"], CollectionType: "music",…}
CollectionType
: 
"music"
Guid
: 
"8f84d19a76964d57bc759321e64dee14"
Id
: 
"560309"
ItemId
: 
"560309"
LibraryOptions
: 
{EnableArchiveMediaFiles: false, EnablePhotos: true, EnableRealtimeMonitor: true,…}
Locations
: 
["/media/media/music"]
Name
: 
"Music"
5
: 
{Name: "Shows (Deleted Soon)", Locations: [], CollectionType: "tvshows",…}
CollectionType
: 
"tvshows"
Guid
: 
"5e7e2ebb979c4f148c7d314830245048"
Id
: 
"689278"
ItemId
: 
"689278"
LibraryOptions
: 
{EnableArchiveMediaFiles: false, EnablePhotos: true, EnableRealtimeMonitor: true,…}
Locations
: 
[]
Name
: 
"Shows (Deleted Soon)"
6
: 
{Name: "TV shows", Locations: ["/media/media/tv"], CollectionType: "tvshows",…}
CollectionType
: 
"tvshows"
Guid
: 
"ea5c1bcc8fa94b4e84c54c44350451ba"
Id
: 
"559081"
ItemId
: 
"559081"
LibraryOptions
: 
{EnableArchiveMediaFiles: false, EnablePhotos: true, EnableRealtimeMonitor: true,…}
Locations
: 
["/media/media/tv"]
Name
: 
"TV shows"
PrimaryImageItemId
: 
"559081"
TotalRecordCount
: 
7

Apologies the JSON output is a bit of a mess, it doesn't appear to like being copy and pasted. I've attached a screenshot, albeit blown out due to Windows HDR, to this comment in case that's more useful. Apologies again.

I updated to your latest version on the Native-Develop image, and am still receiving the same errors. Nonetheless, here is the log output in case anything has changed whatsoever that I didn't notice.

        at feign.ResponseHandler.handleResponse(ResponseHandler.java:63) ~[na:na]
        at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:114) ~[na:na]
        at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:70) ~[na:na]
        at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:99) ~[na:na]
        at jdk.proxy4/jdk.proxy4.$Proxy49.addPathToLibrary(Unknown Source) ~[na:na]
        at com.github.schaka.janitorr.mediaserver.emby.EmbyRestService.updateLeavingSoon(EmbyRestService.kt:71) ~[na:na]
        at com.github.schaka.janitorr.mediaserver.MediaServerService.updateLeavingSoon$default(MediaServerService.kt:33) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule.cleanupMediaType(AbstractCleanupSchedule.kt:73) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule.scheduleDelete(AbstractCleanupSchedule.kt:49) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule.scheduleDelete$default(AbstractCleanupSchedule.kt:33) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at com.github.schaka.janitorr.cleanup.MediaCleanupSchedule.runSchedule(MediaCleanupSchedule.kt:52) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.lang.reflect.Method.invoke(Method.java:580) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354) ~[na:na]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[na:na]
        at org.springframework.cache.interceptor.CacheInterceptor.lambda$invoke$0(CacheInterceptor.java:64) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheAspectSupport.invokeOperation(CacheAspectSupport.java:416) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheAspectSupport.evaluate(CacheAspectSupport.java:548) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:433) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:395) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:74) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[na:na]
        at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720) ~[na:na]
        at com.github.schaka.janitorr.cleanup.MediaCleanupSchedule$$SpringCGLIB$$0.runSchedule(<generated>) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.lang.reflect.Method.invoke(Method.java:580) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at org.springframework.scheduling.support.ScheduledMethodRunnable.runInternal(ScheduledMethodRunnable.java:130) ~[na:na]
        at org.springframework.scheduling.support.ScheduledMethodRunnable.lambda$run$2(ScheduledMethodRunnable.java:124) ~[na:na]
        at io.micrometer.observation.Observation.observe(Observation.java:499) ~[com.github.schaka.janitorr.JanitorrApplicationKt:1.13.2]
        at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:124) ~[na:na]
        at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at java.base@21.0.3/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572) ~[na:na]
        at java.base@21.0.3/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:358) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) ~[na:na]
        at java.base@21.0.3/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ~[na:na]
        at java.base@21.0.3/java.lang.Thread.runWith(Thread.java:1596) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.lang.VirtualThread.run(VirtualThread.java:309) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.lang.VirtualThread$VThreadContinuation$1.run(VirtualThread.java:190) ~[na:na]

2024-08-27T14:16:24.381-04:00  INFO 1 --- [   scheduling-1] c.g.s.j.s.sonarr.SonarrRestService       : Dry run - not deleting any TV shows without files or monitoring
2024-08-27T14:16:24.981-04:00 ERROR 1 --- [   scheduling-1] o.s.s.s.TaskUtils$LoggingErrorHandler    : Unexpected error occurred in scheduled task

feign.FeignException$InternalServerError: [500 Internal Server Error] during [POST] to [http://192.168.1.201:8096/emby/Library/VirtualFolders/Paths?refreshLibrary=false] [EmbyMediaServerClient#addPathToLibrary(AddMediaPathRequest)]: [Unrecognized Guid format.]
        at feign.codec.ErrorDecoder$Default.decode(ErrorDecoder.java:103) ~[na:na]
        at feign.InvocationContext.decodeError(InvocationContext.java:126) ~[na:na]
        at feign.InvocationContext.proceed(InvocationContext.java:72) ~[na:na]
        at feign.ResponseHandler.handleResponse(ResponseHandler.java:63) ~[na:na]
        at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:114) ~[na:na]
        at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:70) ~[na:na]
        at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:99) ~[na:na]
        at jdk.proxy4/jdk.proxy4.$Proxy49.addPathToLibrary(Unknown Source) ~[na:na]
        at com.github.schaka.janitorr.mediaserver.emby.EmbyRestService.updateLeavingSoon(EmbyRestService.kt:71) ~[na:na]
        at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule.deleteTvShows(AbstractCleanupSchedule.kt:103) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule$scheduleDelete$2.invoke(AbstractCleanupSchedule.kt:49) ~[na:na]
        at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule$scheduleDelete$2.invoke(AbstractCleanupSchedule.kt:49) ~[na:na]
        at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule.cleanupMediaType(AbstractCleanupSchedule.kt:76) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule.scheduleDelete(AbstractCleanupSchedule.kt:49) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at com.github.schaka.janitorr.cleanup.TagBasedCleanupSchedule.runSchedule(TagBasedCleanupSchedule.kt:52) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.lang.reflect.Method.invoke(Method.java:580) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354) ~[na:na]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[na:na]
        at org.springframework.cache.interceptor.CacheInterceptor.lambda$invoke$0(CacheInterceptor.java:64) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheAspectSupport.invokeOperation(CacheAspectSupport.java:416) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheAspectSupport.evaluate(CacheAspectSupport.java:548) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:433) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:395) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:74) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[na:na]
        at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720) ~[na:na]
        at com.github.schaka.janitorr.cleanup.TagBasedCleanupSchedule$$SpringCGLIB$$0.runSchedule(<generated>) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.lang.reflect.Method.invoke(Method.java:580) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at org.springframework.scheduling.support.ScheduledMethodRunnable.runInternal(ScheduledMethodRunnable.java:130) ~[na:na]
        at org.springframework.scheduling.support.ScheduledMethodRunnable.lambda$run$2(ScheduledMethodRunnable.java:124) ~[na:na]
        at io.micrometer.observation.Observation.observe(Observation.java:499) ~[com.github.schaka.janitorr.JanitorrApplicationKt:1.13.2]
        at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:124) ~[na:na]
        at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at java.base@21.0.3/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572) ~[na:na]
        at java.base@21.0.3/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:358) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) ~[na:na]
        at java.base@21.0.3/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ~[na:na]
        at java.base@21.0.3/java.lang.Thread.runWith(Thread.java:1596) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.lang.VirtualThread.run(VirtualThread.java:309) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.lang.VirtualThread$VThreadContinuation$1.run(VirtualThread.java:190) ~[na:na]

Screenshot_1277

Schaka commented 1 month ago

Please try the latest image within 5-10 minutes after this comment. I think they may have made some changes to where it requires the ID instead of GUID now, despite the error message complaining about Guid format as well.

Since this isn't clearly documented, I just tried to follow what the Emby Web UI is doing. Hopefully this finally fixes it.

kylehandy123 commented 1 month ago

Just updated and rebooted the container, still receiving the same Unrecognized Guid Format error. Using the same config.

Schaka commented 1 month ago

Can you please post the log file? With TRACE enabled.

It should print the collection it finds now.

I've made sure the request matches exactly what the web ui does.

kylehandy123 commented 1 month ago

Here is the log with TRACE enabled. I redacted out usernames at the top of the log for user privacy as some used their full names.

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/

 :: Spring Boot ::                (v3.3.2)

2024-08-28T02:46:45.955-04:00  INFO 1 --- [           main] c.g.s.janitorr.JanitorrApplicationKt     : Starting AOT-processed JanitorrApplicationKt using Java 21.0.3 with PID 1 (/workspace/com.github.schaka.janitorr.JanitorrApplicationKt started by cnb in /workspace)
2024-08-28T02:46:45.955-04:00 DEBUG 1 --- [           main] c.g.s.janitorr.JanitorrApplicationKt     : Running with Spring Boot v3.3.2, Spring v6.1.11
2024-08-28T02:46:45.955-04:00  INFO 1 --- [           main] c.g.s.janitorr.JanitorrApplicationKt     : No active profile set, falling back to 1 default profile: "default"
2024-08-28T02:46:46.005-04:00  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port 8978 (http)
2024-08-28T02:46:46.006-04:00  INFO 1 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2024-08-28T02:46:46.006-04:00  INFO 1 --- [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.26]
2024-08-28T02:46:46.022-04:00  INFO 1 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2024-08-28T02:46:46.022-04:00  INFO 1 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 67 ms
2024-08-28T02:46:46.221-04:00  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port 8978 (http) with context path '/'
2024-08-28T02:46:46.221-04:00  INFO 1 --- [           main] c.g.s.janitorr.JanitorrApplicationKt     : Started JanitorrApplicationKt in 0.292 seconds (process running for 0.301)
2024-08-28T02:46:46.241-04:00 DEBUG 1 --- [   scheduling-1] c.g.s.j.cleanup.MediaCleanupSchedule     : Cleaning up TV shows older than 20
2024-08-28T02:46:46.260-04:00 DEBUG 1 --- [   scheduling-1] c.g.s.j.cleanup.MediaCleanupSchedule     : Cleaning up movies older than 30
2024-08-28T02:46:57.942-04:00 DEBUG 1 --- [   scheduling-1] c.g.s.j.jellystat.JellystatRestService   : Updating history - user *** watched The Queen Who Ever Was 2 at 2024-08-07T03:10:14.998Z
2024-08-28T02:46:58.047-04:00 DEBUG 1 --- [   scheduling-1] c.g.s.j.jellystat.JellystatRestService   : Updating history - user *** watched Servants of Two Masters 1 at 2024-08-08T02:15:55.519Z
2024-08-28T02:46:58.200-04:00 DEBUG 1 --- [   scheduling-1] c.g.s.j.jellystat.JellystatRestService   : Updating history - user *** watched Assassination Run 4 at 2024-07-22T04:06:52.278Z
2024-08-28T02:46:58.219-04:00 DEBUG 1 --- [   scheduling-1] c.g.s.j.jellystat.JellystatRestService   : Updating history - user *** watched I Do 1 at 2024-07-14T10:29:29.998Z
2024-08-28T02:46:58.243-04:00 DEBUG 1 --- [   scheduling-1] c.g.s.j.jellystat.JellystatRestService   : Updating history - user *** watched Infected 1 at 2024-07-27T19:31:54.286Z
2024-08-28T02:46:58.363-04:00 DEBUG 1 --- [   scheduling-1] c.g.s.j.jellystat.JellystatRestService   : Updating history - user *** watched The Beginning of Madness 1 at 2024-07-11T02:19:40.313Z
2024-08-28T02:46:58.521-04:00 DEBUG 1 --- [   scheduling-1] c.g.s.j.jellystat.JellystatRestService   : Updating history - user *** watched Clash! Shanks Vs Eustass Kid! 22 at 2024-07-15T02:32:04.875Z
2024-08-28T02:46:58.530-04:00 DEBUG 1 --- [   scheduling-1] c.g.s.j.jellystat.JellystatRestService   : Updating history - user *** watched The Boy Who Became the World's Strongest Sorcerer Begins His Practical Exercises 1 at 2024-07-26T00:27:45.842Z
2024-08-28T02:46:58.667-04:00 DEBUG 1 --- [   scheduling-1] c.g.s.j.jellystat.JellystatRestService   : Updating history - user *** watched Villaintines Day 3 at 2024-08-25T15:08:53.625Z
2024-08-28T02:46:58.680-04:00 TRACE 1 --- [   scheduling-1] c.g.s.j.m.emby.EmbyRestService           : Leaving Soon Collection Created/Found: VirtualFolderResponse(CollectionType=tvshows, ItemId=689278, LibraryOptions=LibraryOptions(AllowEmbeddedSubtitles=null, AutomaticRefreshIntervalDays=0, AutomaticallyAddToCollection=false, DisabledLocalMetadataReaders=[], DisabledSubtitleFetchers=[], EnableAutomaticSeriesGrouping=true, EnableChapterImageExtraction=false, EnableEmbeddedEpisodeInfos=false, EnableEmbeddedTitles=false, EnableInternetProviders=false, EnablePhotos=true, EnableRealtimeMonitor=true, ExtractChapterImagesDuringLibraryScan=false, LocalMetadataReaderOrder=null, MetadataCountryCode=, MetadataSavers=[], PathInfos=[], PreferredMetadataLanguage=, RequirePerfectSubtitleMatch=true, SaveLocalMetadata=false, SaveSubtitlesWithMedia=true, SeasonZeroDisplayName=null, SkipSubtitlesIfAudioTrackMatches=false, SkipSubtitlesIfEmbeddedSubtitlesPresent=false, SubtitleDownloadLanguages=[], SubtitleFetcherOrder=[], TypeOptions=[]), Locations=[], Name=Shows (Deleted Soon), PrimaryImageItemId=null, RefreshProgress=0, RefreshStatus=null, Id=689278, Guid=5e7e2ebb979c4f148c7d314830245048)
2024-08-28T02:46:58.683-04:00 ERROR 1 --- [   scheduling-1] o.s.s.s.TaskUtils$LoggingErrorHandler    : Unexpected error occurred in scheduled task

feign.FeignException$InternalServerError: [500 Internal Server Error] during [POST] to [http://192.168.1.201:8096/emby/Library/VirtualFolders/Paths?refreshLibrary=false] [EmbyMediaServerClient#addPathToLibrary(AddMediaPathRequest)]: [Unrecognized Guid format.]
        at feign.codec.ErrorDecoder$Default.decode(ErrorDecoder.java:103) ~[na:na]
        at feign.InvocationContext.decodeError(InvocationContext.java:126) ~[na:na]
        at feign.InvocationContext.proceed(InvocationContext.java:72) ~[na:na]
        at feign.ResponseHandler.handleResponse(ResponseHandler.java:63) ~[na:na]
        at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:114) ~[na:na]
        at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:70) ~[na:na]
        at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:99) ~[na:na]
        at jdk.proxy4/jdk.proxy4.$Proxy49.addPathToLibrary(Unknown Source) ~[na:na]
        at com.github.schaka.janitorr.mediaserver.emby.EmbyRestService.updateLeavingSoon(EmbyRestService.kt:78) ~[na:na]
        at com.github.schaka.janitorr.mediaserver.MediaServerService.updateLeavingSoon$default(MediaServerService.kt:33) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule.cleanupMediaType(AbstractCleanupSchedule.kt:73) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule.scheduleDelete(AbstractCleanupSchedule.kt:49) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule.scheduleDelete$default(AbstractCleanupSchedule.kt:33) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at com.github.schaka.janitorr.cleanup.MediaCleanupSchedule.runSchedule(MediaCleanupSchedule.kt:52) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.lang.reflect.Method.invoke(Method.java:580) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354) ~[na:na]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[na:na]
        at org.springframework.cache.interceptor.CacheInterceptor.lambda$invoke$0(CacheInterceptor.java:64) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheAspectSupport.invokeOperation(CacheAspectSupport.java:416) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheAspectSupport.evaluate(CacheAspectSupport.java:548) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:433) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:395) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:74) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[na:na]
        at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720) ~[na:na]
        at com.github.schaka.janitorr.cleanup.MediaCleanupSchedule$$SpringCGLIB$$0.runSchedule(<generated>) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.lang.reflect.Method.invoke(Method.java:580) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at org.springframework.scheduling.support.ScheduledMethodRunnable.runInternal(ScheduledMethodRunnable.java:130) ~[na:na]
        at org.springframework.scheduling.support.ScheduledMethodRunnable.lambda$run$2(ScheduledMethodRunnable.java:124) ~[na:na]
        at io.micrometer.observation.Observation.observe(Observation.java:499) ~[com.github.schaka.janitorr.JanitorrApplicationKt:1.13.2]
        at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:124) ~[na:na]
        at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at java.base@21.0.3/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572) ~[na:na]
        at java.base@21.0.3/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:358) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) ~[na:na]
        at java.base@21.0.3/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ~[na:na]
        at java.base@21.0.3/java.lang.Thread.runWith(Thread.java:1596) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.lang.VirtualThread.run(VirtualThread.java:309) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.lang.VirtualThread$VThreadContinuation$1.run(VirtualThread.java:190) ~[na:na]

2024-08-28T02:46:58.684-04:00 DEBUG 1 --- [   scheduling-1] c.g.s.j.cleanup.TagBasedCleanupSchedule  : Deleting TV shows and movies with tag: TagDeleteSchedule(tag=5 - demo, expiration=PT720H)
2024-08-28T02:46:59.023-04:00  INFO 1 --- [   scheduling-1] c.g.s.j.s.sonarr.SonarrRestService       : Dry run - not deleting any TV shows without files or monitoring
2024-08-28T02:46:59.492-04:00 TRACE 1 --- [   scheduling-1] c.g.s.j.m.emby.EmbyRestService           : Leaving Soon Collection Created/Found: VirtualFolderResponse(CollectionType=tvshows, ItemId=689278, LibraryOptions=LibraryOptions(AllowEmbeddedSubtitles=null, AutomaticRefreshIntervalDays=0, AutomaticallyAddToCollection=false, DisabledLocalMetadataReaders=[], DisabledSubtitleFetchers=[], EnableAutomaticSeriesGrouping=true, EnableChapterImageExtraction=false, EnableEmbeddedEpisodeInfos=false, EnableEmbeddedTitles=false, EnableInternetProviders=false, EnablePhotos=true, EnableRealtimeMonitor=true, ExtractChapterImagesDuringLibraryScan=false, LocalMetadataReaderOrder=null, MetadataCountryCode=, MetadataSavers=[], PathInfos=[], PreferredMetadataLanguage=, RequirePerfectSubtitleMatch=true, SaveLocalMetadata=false, SaveSubtitlesWithMedia=true, SeasonZeroDisplayName=null, SkipSubtitlesIfAudioTrackMatches=false, SkipSubtitlesIfEmbeddedSubtitlesPresent=false, SubtitleDownloadLanguages=[], SubtitleFetcherOrder=[], TypeOptions=[]), Locations=[], Name=Shows (Deleted Soon), PrimaryImageItemId=null, RefreshProgress=0, RefreshStatus=null, Id=689278, Guid=5e7e2ebb979c4f148c7d314830245048)
2024-08-28T02:46:59.494-04:00 ERROR 1 --- [   scheduling-1] o.s.s.s.TaskUtils$LoggingErrorHandler    : Unexpected error occurred in scheduled task

feign.FeignException$InternalServerError: [500 Internal Server Error] during [POST] to [http://192.168.1.201:8096/emby/Library/VirtualFolders/Paths?refreshLibrary=false] [EmbyMediaServerClient#addPathToLibrary(AddMediaPathRequest)]: [Unrecognized Guid format.]
        at feign.codec.ErrorDecoder$Default.decode(ErrorDecoder.java:103) ~[na:na]
        at feign.InvocationContext.decodeError(InvocationContext.java:126) ~[na:na]
        at feign.InvocationContext.proceed(InvocationContext.java:72) ~[na:na]
        at feign.ResponseHandler.handleResponse(ResponseHandler.java:63) ~[na:na]
        at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:114) ~[na:na]
        at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:70) ~[na:na]
        at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:99) ~[na:na]
        at jdk.proxy4/jdk.proxy4.$Proxy49.addPathToLibrary(Unknown Source) ~[na:na]
        at com.github.schaka.janitorr.mediaserver.emby.EmbyRestService.updateLeavingSoon(EmbyRestService.kt:78) ~[na:na]
        at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule.deleteTvShows(AbstractCleanupSchedule.kt:103) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule$scheduleDelete$2.invoke(AbstractCleanupSchedule.kt:49) ~[na:na]
        at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule$scheduleDelete$2.invoke(AbstractCleanupSchedule.kt:49) ~[na:na]
        at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule.cleanupMediaType(AbstractCleanupSchedule.kt:76) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule.scheduleDelete(AbstractCleanupSchedule.kt:49) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at com.github.schaka.janitorr.cleanup.TagBasedCleanupSchedule.runSchedule(TagBasedCleanupSchedule.kt:52) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.lang.reflect.Method.invoke(Method.java:580) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354) ~[na:na]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[na:na]
        at org.springframework.cache.interceptor.CacheInterceptor.lambda$invoke$0(CacheInterceptor.java:64) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheAspectSupport.invokeOperation(CacheAspectSupport.java:416) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheAspectSupport.evaluate(CacheAspectSupport.java:548) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:433) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:395) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:74) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[na:na]
        at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720) ~[na:na]
        at com.github.schaka.janitorr.cleanup.TagBasedCleanupSchedule$$SpringCGLIB$$0.runSchedule(<generated>) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.lang.reflect.Method.invoke(Method.java:580) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at org.springframework.scheduling.support.ScheduledMethodRunnable.runInternal(ScheduledMethodRunnable.java:130) ~[na:na]
        at org.springframework.scheduling.support.ScheduledMethodRunnable.lambda$run$2(ScheduledMethodRunnable.java:124) ~[na:na]
        at io.micrometer.observation.Observation.observe(Observation.java:499) ~[com.github.schaka.janitorr.JanitorrApplicationKt:1.13.2]
        at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:124) ~[na:na]
        at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at java.base@21.0.3/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572) ~[na:na]
        at java.base@21.0.3/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:358) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) ~[na:na]
        at java.base@21.0.3/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ~[na:na]
        at java.base@21.0.3/java.lang.Thread.runWith(Thread.java:1596) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.lang.VirtualThread.run(VirtualThread.java:309) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.lang.VirtualThread$VThreadContinuation$1.run(VirtualThread.java:190) ~[na:na]
Schaka commented 1 month ago

It shows that everything is correct and being sent correctly. The only other idea I have is that a reverse proxy could possibly alter the request and maybe break some parameters.

I double checked the API docs for authentication to make sure it's not a problem with authentication itself. I've personally not had these issues on my local install that I test against, so it's hard to pinpoint what the problem could be.

If authentication were an issue somehow, it shouldn't be able to create the collection at all. So before you try the latest image again, please delete your 'TV Shows (Leaving Soon)' collection.

For documentation sake, here's the request as the Web UI sends it: image

There isn't any difference to what Janitorr does here.

kylehandy123 commented 1 month ago

Removed the collection. Updated the Janitorr container, still spitting the same error. Saying this, pardon my ignorance, does it appear to be working correctly despite throwing the mile long error in the log? Albeit frustrating that the log is a long error, if it's working correctly from what you can currently tell, I'm not going to really complain further. My only other question would be, should it be creating another collection for movies leaving soon?

Schaka commented 1 month ago

No, it's not working correctly because it's not adding the path to your collection. Does the collection exist again?

When you open it up, and check what paths it contains, it should contain: /data/leaving-soon/media/tv. This directory should also already exists on your drive.

This is assuming you've mapped it into Emby correctly and Emby can find the same directory under /data/leaving-soon as Janitorr.

Now there's a possibility that Emby refuses to give a proper response when it goes wrong and tells us something about a wrong Guid when it really means "folder doesn't exist". Jellyfin just throws a 400 and indicates the folder doesn't exist.

Now if Emby weren't closed source, I could take a look at what they're doing and debug this myself. Now I'm left guessing.

@ebr11 @LukePulverenti do you have any idea what could be wrong? The PostLibraryVirtualFolderPaths Endpoint throws a 500 with [invalid Guid format.] I've confirmed several times by looking at the docs and seeing what the Web UI actually does that the request I send is correct. I'm not sure what could cause a server error that specific here.

To he best of my knowledge, there's no Guid here.

kylehandy123 commented 1 month ago

I can confirm the collection exists again, and there is no folder mapping to it in Emby. I can confirm on my drive that both Emby and Janitorr can access /mnt/media/media which contains the default TV, Movies, Anime, etc folders, which Emby can access, Emby also can see /mnt/media/media/leaving-soon and I can manually add it to the collection, and Janitorr also has access to all these folders. Janitorr also created /mnt/media/media/leaving-soon/tv/media & tag-based on the drive. I'm going to spin up a Jellyfin instance and confirm that Janitorr works on it. I don't want to add additional confusion so I'll only report my findings if they are of any use. This is more so for my own sanity at this point.

Edit 1: I'm not going to spin up a Jellyfin instance tonight, and won't do so if that would hinder testing on Emby. I won't look at doing so until tomorrow unless told not to otherwise.

Schaka commented 1 month ago

In this post, you're talking about /mnt/media/leaving-soon but in your Janitorr config, it's leaving-soon-dir: "/data/leaving-soon"

I assume this is mapped correctly into Janitorr since it managed to create the right files on drive. But does Emby ALSO know this folder as /data/leaving-soon on its side, or does it only know it as /data/media/leaving-soon?

Since Janitorr gives this info to Emby, the paths need to be identical. As a workaround, you could manually add the relevant paths to the libraries when they are created. As long as they are recognized by Janitorr (i.e. they need to be the path Janitorr knows, like /data/leaving-soon).

You're welcome to spin up Jellyfin and see if it works for you. If it does, it's likely to be an Emby issue. If not, I would suspect it's a mapping issue.

services:
  emby:
    image: emby/embyserver:latest
    container_name: emby
    environment:
      - UID=1000
      - GID=1000
      - TZ=Europe/Berlin
    devices:
      - /dev/dri:/dev/dri
    volumes:
      - /appdata/emby:/config
      - /share_media:/data

  janitorr:
    container_name: janitorr
    image: ghcr.io/schaka/janitorr:native-stable
    user: 1000:1000
    volumes:
      - /appdata/janitorr/config/application.yml:/workspace/application.yml
      #- /appdata/janitorr/config:/config
      - /share_media:/data    

Now Emby finds my movies as /data/media/movies. Janitorr also finds them as /data/media/movies. Everything symlink for leaving-soon will be pointed at /data/leaving-soon, so on my host system, it'll be found as: /share_media/leaving-soon/[...].

Hopefully this helps. In your screenshot of your libraries, I see Emby uses paths like /media/media/tv.

Edit: I added Emby's path validation endpoint to throw an error in the log if Emby can't find the path. So if your mapping is wrong, you'll know with the latest iamge.

kylehandy123 commented 1 month ago

I understand the concern. I've gone ahead and changed the path mapping for the container to /media/media, which is identical to Emby's container path mapping of /media/media. I've also made sure that both Emby and Janitorr look for /mnt/media/media. I believe doing this means both Emby and Janitorr are looking, internally and externally, at the exact same path mappings. Nonetheless, it appears this didn't work as expected. It appears to have.. Reverted practically back to the original log I posted in this issue now. Log posted below.

        at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:70) ~[na:na]
        at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:99) ~[na:na]
        at jdk.proxy4/jdk.proxy4.$Proxy49.addPathToLibrary(Unknown Source) ~[na:na]
        at com.github.schaka.janitorr.mediaserver.emby.EmbyRestService.updateLeavingSoon(EmbyRestService.kt:79) ~[na:na]
        at com.github.schaka.janitorr.mediaserver.MediaServerService.updateLeavingSoon$default(MediaServerService.kt:33) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule.cleanupMediaType(AbstractCleanupSchedule.kt:73) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule.scheduleDelete(AbstractCleanupSchedule.kt:49) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule.scheduleDelete$default(AbstractCleanupSchedule.kt:33) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at com.github.schaka.janitorr.cleanup.MediaCleanupSchedule.runSchedule(MediaCleanupSchedule.kt:52) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.lang.reflect.Method.invoke(Method.java:580) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354) ~[na:na]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[na:na]
        at org.springframework.cache.interceptor.CacheInterceptor.lambda$invoke$0(CacheInterceptor.java:64) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheAspectSupport.invokeOperation(CacheAspectSupport.java:416) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheAspectSupport.evaluate(CacheAspectSupport.java:548) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:433) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:395) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:74) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[na:na]
        at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720) ~[na:na]
        at com.github.schaka.janitorr.cleanup.MediaCleanupSchedule$$SpringCGLIB$$0.runSchedule(<generated>) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.lang.reflect.Method.invoke(Method.java:580) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at org.springframework.scheduling.support.ScheduledMethodRunnable.runInternal(ScheduledMethodRunnable.java:130) ~[na:na]
        at org.springframework.scheduling.support.ScheduledMethodRunnable.lambda$run$2(ScheduledMethodRunnable.java:124) ~[na:na]
        at io.micrometer.observation.Observation.observe(Observation.java:499) ~[com.github.schaka.janitorr.JanitorrApplicationKt:1.13.2]
        at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:124) ~[na:na]
        at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at java.base@21.0.3/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572) ~[na:na]
        at java.base@21.0.3/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:358) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) ~[na:na]
        at java.base@21.0.3/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ~[na:na]
        at java.base@21.0.3/java.lang.Thread.runWith(Thread.java:1596) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.lang.VirtualThread.run(VirtualThread.java:309) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.lang.VirtualThread$VThreadContinuation$1.run(VirtualThread.java:190) ~[na:na]

2024-08-28T15:17:05.577-04:00 DEBUG 1 --- [   scheduling-1] c.g.s.j.cleanup.TagBasedCleanupSchedule  : Deleting TV shows and movies with tag: TagDeleteSchedule(tag=5 - demo, expiration=PT720H)
2024-08-28T15:17:05.898-04:00  INFO 1 --- [   scheduling-1] c.g.s.j.s.sonarr.SonarrRestService       : Dry run - not deleting any TV shows without files or monitoring
2024-08-28T15:17:06.409-04:00 TRACE 1 --- [   scheduling-1] c.g.s.j.m.emby.EmbyRestService           : Leaving Soon Collection Created/Found: VirtualFolderResponse(CollectionType=tvshows, ItemId=692716, LibraryOptions=LibraryOptions(AllowEmbeddedSubtitles=null, AutomaticRefreshIntervalDays=0, AutomaticallyAddToCollection=false, DisabledLocalMetadataReaders=[], DisabledSubtitleFetchers=[], EnableAutomaticSeriesGrouping=true, EnableChapterImageExtraction=false, EnableEmbeddedEpisodeInfos=false, EnableEmbeddedTitles=false, EnableInternetProviders=false, EnablePhotos=true, EnableRealtimeMonitor=true, ExtractChapterImagesDuringLibraryScan=false, LocalMetadataReaderOrder=null, MetadataCountryCode=null, MetadataSavers=[], PathInfos=[], PreferredMetadataLanguage=null, RequirePerfectSubtitleMatch=true, SaveLocalMetadata=false, SaveSubtitlesWithMedia=true, SeasonZeroDisplayName=null, SkipSubtitlesIfAudioTrackMatches=false, SkipSubtitlesIfEmbeddedSubtitlesPresent=false, SubtitleDownloadLanguages=[], SubtitleFetcherOrder=[], TypeOptions=[]), Locations=[], Name=Shows (Deleted Soon), PrimaryImageItemId=null, RefreshProgress=0, RefreshStatus=null, Id=692716, Guid=25f0da1a76344c53a385bca7fedd5e8b)
2024-08-28T15:17:06.414-04:00 ERROR 1 --- [   scheduling-1] o.s.s.s.TaskUtils$LoggingErrorHandler    : Unexpected error occurred in scheduled task

feign.FeignException$InternalServerError: [500 Internal Server Error] during [POST] to [http://192.168.1.201:8096/emby/Library/VirtualFolders/Paths?refreshLibrary=false] [EmbyMediaServerClient#addPathToLibrary(AddMediaPathRequest)]: [Unrecognized Guid format.]
        at feign.codec.ErrorDecoder$Default.decode(ErrorDecoder.java:103) ~[na:na]
        at feign.InvocationContext.decodeError(InvocationContext.java:126) ~[na:na]
        at feign.InvocationContext.proceed(InvocationContext.java:72) ~[na:na]
        at feign.ResponseHandler.handleResponse(ResponseHandler.java:63) ~[na:na]
        at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:114) ~[na:na]
        at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:70) ~[na:na]
        at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:99) ~[na:na]
        at jdk.proxy4/jdk.proxy4.$Proxy49.addPathToLibrary(Unknown Source) ~[na:na]
        at com.github.schaka.janitorr.mediaserver.emby.EmbyRestService.updateLeavingSoon(EmbyRestService.kt:79) ~[na:na]
        at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule.deleteTvShows(AbstractCleanupSchedule.kt:103) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule$scheduleDelete$2.invoke(AbstractCleanupSchedule.kt:49) ~[na:na]
        at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule$scheduleDelete$2.invoke(AbstractCleanupSchedule.kt:49) ~[na:na]
        at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule.cleanupMediaType(AbstractCleanupSchedule.kt:76) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule.scheduleDelete(AbstractCleanupSchedule.kt:49) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at com.github.schaka.janitorr.cleanup.TagBasedCleanupSchedule.runSchedule(TagBasedCleanupSchedule.kt:52) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.lang.reflect.Method.invoke(Method.java:580) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354) ~[na:na]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[na:na]
        at org.springframework.cache.interceptor.CacheInterceptor.lambda$invoke$0(CacheInterceptor.java:64) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheAspectSupport.invokeOperation(CacheAspectSupport.java:416) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheAspectSupport.evaluate(CacheAspectSupport.java:548) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:433) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:395) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:74) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[na:na]
        at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720) ~[na:na]
        at com.github.schaka.janitorr.cleanup.TagBasedCleanupSchedule$$SpringCGLIB$$0.runSchedule(<generated>) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.lang.reflect.Method.invoke(Method.java:580) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at org.springframework.scheduling.support.ScheduledMethodRunnable.runInternal(ScheduledMethodRunnable.java:130) ~[na:na]
        at org.springframework.scheduling.support.ScheduledMethodRunnable.lambda$run$2(ScheduledMethodRunnable.java:124) ~[na:na]
        at io.micrometer.observation.Observation.observe(Observation.java:499) ~[com.github.schaka.janitorr.JanitorrApplicationKt:1.13.2]
        at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:124) ~[na:na]
        at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at java.base@21.0.3/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572) ~[na:na]
        at java.base@21.0.3/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:358) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) ~[na:na]
        at java.base@21.0.3/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ~[na:na]
        at java.base@21.0.3/java.lang.Thread.runWith(Thread.java:1596) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.lang.VirtualThread.run(VirtualThread.java:309) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.lang.VirtualThread$VThreadContinuation$1.run(VirtualThread.java:190) ~[na:na]

Here is some additional information. First screenshot is Janitorr. Second screenshot is Emby. And my current config.

Screenshot_1278

Screenshot_1279

logging:
  level:
    com.github.schaka: TRACE

server:
  port: 8978

# File system access (same mapping as Sonarr, Radarr and Jellyfin) is required to delete TV shows by season and create "Leaving Soon" collections in Jellyfin
# Currently, Jellyfin does not support an easy way to add only a few seasons or movies to a collection, we need access to temporary symlinks
# Additionally, checks to prevent deletion on currently still seeding media currently require file system access as well
file-system:
  access: true
  validate-seeding: true # validates seeding by checking if the original file exists and skips deletion - turning this off will send a delete to the *arrs even if a torrent may still be active
  leaving-soon-dir: "/media/media/leaving-soon" # A directory this container can write to and Jellyfin can find under the same path - this will contain new folders with symlinks to files for Jellyfin's "Leaving Soon" collections
  from-scratch: true # Clean up entire "Leaving Soon" directory and rebuild from scratch - this can help with clearing orphaned data - turning this off can save resources (less writes to drive)
  free-space-check-dir: "/media/media" # This is the default directory Janitorr uses to check how much space is left on your drives. By default, it checks the entire root - you may point it at a specific folder

application:
  dry-run: true
  whole-tv-show: false # activating this will treat as a whole show as recently download/watched from a single episode, rather than that episode's season - shows will be deleted as a whole
  whole-show-seeding-check: false # Turning this off, disables the seeding check entirely if whole-tv-show is enabled. Activating this check will keep a whole TV show if any season is still seeding (requires file access).
  leaving-soon: 14d # 14 days before a movie is deleted, it gets added to a "Leaving Soon" type collection (i.e. movies that are 76 to 89 days old)
  exclusion-tag: "janitorr_keep" # Set this tag to your movies or TV shows in the *arrs to exclude media from being cleaned up

  media-deletion:
    enabled: true
    movie-expiration:
      # Percentage of free disk space to expiration time - if the highest given number is not reached, nothing will be deleted
      # If filesystem access is not given, disk percentage can't be determined. As a result, Janitorr will always choose the largest expiration time.
      30: 15d # 15 days
      40: 30d # 1 month - if a movie's files on your system are older than this, they will be deleted
      50: 60d # 2 months
      60: 90d # 3 months
    season-expiration:
      30: 15d # 15 days
      40: 20d # 20 days - if a season's files on your system are older than this, they will be deleted
      50: 60d # 2 months
      60: 120d # 4 months

  tag-based-deletion:
    enabled: true
    minimum-free-disk-percent: 100
    schedules:
      - tag: 5 - demo
        expiration: 30d
      - tag: 10 - demo
        expiration: 7d

  episode-deletion: # This ignores Jellystat. Only grab history matters. It also doesn't clean up Jellyfin. There is NO seeding check either.
    enabled: true
    tag: janitorr_daily # Shows tagged with this will have all episodes of their LATEST season deleted by the below thresholds
    max-episodes: 250 # maximum (latest) episodes of this season to keep
    max-age: 365d # Maximum age to keep any episode at all - even the last 10 episodes would expire after 30 days in this example

clients:
  sonarr:
    enabled: true
    url: "http://192.168.1.201:8989"
    api-key: "***"
    delete-empty-shows: true # If a show that was "touched" by Janitorr contains no files and has no monitored seasons at all, it will get deleted as part of orphan cleanup
  radarr:
    enabled: true
    url: "http://192.168.1.201:7878"
    api-key: "***"

  ## You can only choose one out of Jellyfin or Emby.
  ## User login is only needed if deletion is enabled.
  jellyfin:
    enabled: false
    url: "http://localhost:8096"
    api-key: "***"
    username: Janitorr
    password: janitorr
    delete: true # Jellyfin setup is required for JellyStat. However, if you don't want Janitorr to send delete requests to the Jellyfin API, disable it here

  ## You can only choose one out of Jellyfin or Emby. Emby support is secondary.
  ## User login is only needed if deletion is enabled.
  emby:
    enabled: true
    url: "http://192.168.1.201:8096"
    api-key: "***"
    username: kylehandy123
    password: ***
    delete: true # Emby setup is required for JellyStat. However, if you don't want Janitorr to send delete requests to the Emby API, disable it here
  jellyseerr:
    enabled: true
    url: "http://192.168.1.201:5055"
    api-key: "***"
    match-server: false # Enable if you have several Radarr/Sonarr instances set up in Jellyseerr. Janitorr will match them by the host+port supplied in their respective config settings.
  jellystat:
    enabled: true
    whole-tv-show: false # Enabling this will make Jellystat consider TV shows as a whole if any episode of any season has been watched
    url: "http://192.168.1.201:3007"
    api-key: "***"
Schaka commented 1 month ago

It's almost definitely a bug in Emby. I'll be honest with you, I have no idea what could fix it. I've been trying myself and now even the ValidatePath endpoint throws an error. This is for a path that most definitely exists.

This is the error in Emby's server log:

2024-08-28 21:37:30.509 Info Server: http/1.1 POST http://host5:8096/host5/Library/VirtualFolders/Paths?refreshLibrary=false. UserAgent: Java/21.0.3
2024-08-28 21:37:30.510 Error Server: Error processing request
    *** Error Report ***
    Version: 4.8.8.0
    Command line: /system/EmbyServer.dll -programdata /config -ffdetect /bin/ffdetect -ffmpeg /bin/ffmpeg -ffprobe /bin/ffprobe -restartexitcode 3
    Operating system: Linux version 6.1.0-13-amd64 (debian-kernel@lists.debian.org) (gcc-12 (Debian 12.2.0-14) 12.2.0, GNU ld (GNU Binutils for Debian) 2.40) #1 SMP PREEMPT
    Framework: .NET 6.0.25
    OS/Process: x64/x64
    Runtime: system/System.Private.CoreLib.dll
    Processor count: 12
    Data path: /config
    Application path: /system
    System.FormatException: System.FormatException: Unrecognized Guid format.
       at System.Guid.GuidResult.SetFailure(Boolean overflow, String failureMessageID)
       at System.Guid.TryParseGuid(ReadOnlySpan`1 guidString, GuidResult& result)
       at System.Guid..ctor(String g)
       at MediaBrowser.Controller.Library.LibraryManagerExtensions.GetItemById(ILibraryManager manager, ReadOnlySpan`1 id)
       at MediaBrowser.Controller.Library.LibraryManagerExtensions.GetItemById(ILibraryManager manager, String id)
       at Emby.Api.Library.LibraryStructureService.Post(AddMediaPath request)
       at Emby.Server.Implementations.Services.ServiceController.<>c__DisplayClass8_0.<VoidActionDelegate>b__0(Object service, Object request)
       at Emby.Server.Implementations.Services.ServiceController.Execute(HttpListenerHost appHost, Object requestDto, IRequest req, Type serviceType)
       at Emby.Server.Implementations.Services.ServiceHandler.ProcessRequestAsync(HttpListenerHost httpHost, IServerApplicationHost appHost, IRequest httpReq, IResponse httpRes, IStreamHelper streamHelper, RestPath restPath, String responseContentType, CancellationToken cancellationToken)
       at Emby.Server.Implementations.HttpServer.HttpListenerHost.RequestHandler(IRequest httpReq, ReadOnlyMemory`1 urlString, ReadOnlyMemory`1 localPath, CancellationToken cancellationToken)
    Source: System.Private.CoreLib
    TargetSite: Void SetFailure(Boolean, System.String)

And for ValidatePath:

2024-08-28 22:16:46.210 Error Server: Error processing request
    *** Error Report ***
    Version: 4.8.8.0
    Command line: /system/EmbyServer.dll -programdata /config -ffdetect /bin/ffdetect -ffmpeg /bin/ffmpeg -ffprobe /bin/ffprobe -restartexitcode 3
    Operating system: Linux version 6.1.0-13-amd64 (debian-kernel@lists.debian.org) (gcc-12 (Debian 12.2.0-14) 12.2.0, GNU ld (GNU Binutils for Debian) 2.40) #1 SMP PREEMPT
    Framework: .NET 6.0.25
    OS/Process: x64/x64
    Runtime: system/System.Private.CoreLib.dll
    Processor count: 12
    Data path: /config
    Application path: /system
    System.NullReferenceException: System.NullReferenceException: Object reference not set to an instance of an object.
       at Emby.Server.Implementations.IO.SmbFileSystem.IsEnabledForPath(String path)
       at Emby.Server.Implementations.IO.ManagedFileSystem.FileExists(String path, FileSystemCredentials credentials)
       at Emby.Api.EnvironmentService.Post(ValidatePath request)
       at Emby.Server.Implementations.Services.ServiceController.GetTaskResult(Task task)
       at Emby.Server.Implementations.Services.ServiceHandler.ProcessRequestAsync(HttpListenerHost httpHost, IServerApplicationHost appHost, IRequest httpReq, IResponse httpRes, IStreamHelper streamHelper, RestPath restPath, String responseContentType, CancellationToken cancellationToken)
       at Emby.Server.Implementations.HttpServer.HttpListenerHost.RequestHandler(IRequest httpReq, ReadOnlyMemory`1 urlString, ReadOnlyMemory`1 localPath, CancellationToken cancellationToken)
    Source: Emby.Server.Implementations
    TargetSite: Boolean IsEnabledForPath(System.String)

I think with the latest image it should now FINALLY serialize the request body correctly and provide all the data as Emby asks.

kylehandy123 commented 1 month ago

I can confirm I can see that the log is no longer throwing an Unrecongnized GUID error, and the libraries within Emby now have folders assigned to them. I also saw that leaving-soon/movies and leaving-soon/TV was created. I'm going to quickly clean up everything on my end so its starting fresh, and ensure the log doesn't have a stroke again. @Schaka Thank you SO much for working on this thus far, things seem to be working, and I'll comment in the next 30 minutes confirming if everything appears to be working correctly on my end too.

kylehandy123 commented 1 month ago

So the original error is gone now, thankfully. I did receive a new error when i disabled dry-run in my config. Log below for only that error.

2024-08-28T18:52:24.684-04:00 ERROR 1 --- [   scheduling-1] o.s.s.s.TaskUtils$LoggingErrorHandler    : Unexpected error occurred in scheduled task

feign.FeignException$InternalServerError: [500 Internal Server Error] during [DELETE] to [http://192.168.1.201:8989/api/v3/episodefile/30378] [SonarrClient#deleteEpisodeFile(int)]: [{
  "message": "Unable to delete episode file",
  "description": "NzbDrone.Core.Exceptions.NzbDroneClientException: Unable to delete episode file\n   at NzbDrone.Core.MediaFiles.MediaFileDeletionServi... (3768 bytes)]
        at feign.codec.ErrorDecoder$Default.decode(ErrorDecoder.java:103) ~[na:na]
        at feign.InvocationContext.decodeError(InvocationContext.java:126) ~[na:na]
        at feign.InvocationContext.proceed(InvocationContext.java:72) ~[na:na]
        at feign.ResponseHandler.handleResponse(ResponseHandler.java:63) ~[na:na]
        at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:114) ~[na:na]
        at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:70) ~[na:na]
        at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:99) ~[na:na]
        at jdk.proxy4/jdk.proxy4.$Proxy52.deleteEpisodeFile(Unknown Source) ~[na:na]
        at com.github.schaka.janitorr.servarr.sonarr.SonarrRestService.removeBySeason(SonarrRestService.kt:180) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at com.github.schaka.janitorr.servarr.sonarr.SonarrRestService.removeEntries(SonarrRestService.kt:162) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.lang.reflect.Method.invoke(Method.java:580) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354) ~[na:na]
        at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:716) ~[na:na]
        at com.github.schaka.janitorr.servarr.sonarr.SonarrRestService$$SpringCGLIB$$0.removeEntries(<generated>) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule.deleteTvShows(AbstractCleanupSchedule.kt:96) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule$scheduleDelete$2.invoke(AbstractCleanupSchedule.kt:49) ~[na:na]
        at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule$scheduleDelete$2.invoke(AbstractCleanupSchedule.kt:49) ~[na:na]
        at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule.cleanupMediaType(AbstractCleanupSchedule.kt:76) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule.scheduleDelete(AbstractCleanupSchedule.kt:49) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule.scheduleDelete$default(AbstractCleanupSchedule.kt:33) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at com.github.schaka.janitorr.cleanup.MediaCleanupSchedule.runSchedule(MediaCleanupSchedule.kt:52) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.lang.reflect.Method.invoke(Method.java:580) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354) ~[na:na]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[na:na]
        at org.springframework.cache.interceptor.CacheInterceptor.lambda$invoke$0(CacheInterceptor.java:64) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheAspectSupport.invokeOperation(CacheAspectSupport.java:416) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheAspectSupport.evaluate(CacheAspectSupport.java:548) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:433) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:395) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:74) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[na:na]
        at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720) ~[na:na]
        at com.github.schaka.janitorr.cleanup.MediaCleanupSchedule$$SpringCGLIB$$0.runSchedule(<generated>) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.lang.reflect.Method.invoke(Method.java:580) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at org.springframework.scheduling.support.ScheduledMethodRunnable.runInternal(ScheduledMethodRunnable.java:130) ~[na:na]
        at org.springframework.scheduling.support.ScheduledMethodRunnable.lambda$run$2(ScheduledMethodRunnable.java:124) ~[na:na]
        at io.micrometer.observation.Observation.observe(Observation.java:499) ~[com.github.schaka.janitorr.JanitorrApplicationKt:1.13.2]
        at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:124) ~[na:na]
        at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11]
        at java.base@21.0.3/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572) ~[na:na]
        at java.base@21.0.3/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:358) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) ~[na:na]
        at java.base@21.0.3/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ~[na:na]
        at java.base@21.0.3/java.lang.Thread.runWith(Thread.java:1596) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.lang.VirtualThread.run(VirtualThread.java:309) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na]
        at java.base@21.0.3/java.lang.VirtualThread$VThreadContinuation$1.run(VirtualThread.java:190) ~[na:na]

2024-08-28T18:52:24.684-04:00  INFO 1 --- [   scheduling-1] c.g.s.j.cleanup.TagBasedCleanupSchedule  : Tag based cleanup disabled, do nothing
2024-08-28T18:52:24.684-04:00  INFO 1 --- [   scheduling-1] c.g.s.j.c.WeeklyEpisodeCleanupSchedule   : Episode based cleanup disabled, do nothing

And just a question, once dry-run was disabled, I now see on Emby that the Shows (Deleted Soon) collection has folders in it. These folders are of show names that I presume are going to be deleted. The folders are empty, with no details about the show, etc. Is this expected behaviour? Screenshot attached.

Screenshot_1280 Screenshot_1281

hacshacdgacs commented 1 month ago

Just out of curiosity in regards to the folders at the bottom have you done a scan media of the deleted soon libraries? You don't normally have to but emby my not have clicked to the files being in those folders just yet

On Thu, 29 Aug 2024, 10:57 kylehandy123, @.***> wrote:

So the original error is gone now, thankfully. I did receive a new error when i disabled dry-run in my config. Log below for only that error.

2024-08-28T18:52:24.684-04:00 ERROR 1 --- [ scheduling-1] o.s.s.s.TaskUtils$LoggingErrorHandler : Unexpected error occurred in scheduled task

feign.FeignException$InternalServerError: [500 Internal Server Error] during [DELETE] to [http://192.168.1.201:8989/api/v3/episodefile/30378] [SonarrClient#deleteEpisodeFile(int)]: [{ "message": "Unable to delete episode file", "description": "NzbDrone.Core.Exceptions.NzbDroneClientException: Unable to delete episode file\n at NzbDrone.Core.MediaFiles.MediaFileDeletionServi... (3768 bytes)] at feign.codec.ErrorDecoder$Default.decode(ErrorDecoder.java:103) ~[na:na] at feign.InvocationContext.decodeError(InvocationContext.java:126) ~[na:na] at feign.InvocationContext.proceed(InvocationContext.java:72) ~[na:na] at feign.ResponseHandler.handleResponse(ResponseHandler.java:63) ~[na:na] at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:114) ~[na:na] at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:70) ~[na:na] at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:99) ~[na:na] at jdk.proxy4/jdk.proxy4.$Proxy52.deleteEpisodeFile(Unknown Source) ~[na:na] at com.github.schaka.janitorr.servarr.sonarr.SonarrRestService.removeBySeason(SonarrRestService.kt:180) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na] at com.github.schaka.janitorr.servarr.sonarr.SonarrRestService.removeEntries(SonarrRestService.kt:162) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na] at @./java.lang.reflect.Method.invoke(Method.java:580) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na] at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354) ~[na:na] at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:716) ~[na:na] at com.github.schaka.janitorr.servarr.sonarr.SonarrRestService$$SpringCGLIB$$0.removeEntries() ~[com.github.schaka.janitorr.JanitorrApplicationKt:na] at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule.deleteTvShows(AbstractCleanupSchedule.kt:96) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na] at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule$scheduleDelete$2.invoke(AbstractCleanupSchedule.kt:49) ~[na:na] at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule$scheduleDelete$2.invoke(AbstractCleanupSchedule.kt:49) ~[na:na] at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule.cleanupMediaType(AbstractCleanupSchedule.kt:76) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na] at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule.scheduleDelete(AbstractCleanupSchedule.kt:49) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na] at com.github.schaka.janitorr.cleanup.AbstractCleanupSchedule.scheduleDelete$default(AbstractCleanupSchedule.kt:33) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na] at com.github.schaka.janitorr.cleanup.MediaCleanupSchedule.runSchedule(MediaCleanupSchedule.kt:52) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na] at @./java.lang.reflect.Method.invoke(Method.java:580) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na] at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:354) ~[na:na] at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[na:na] at org.springframework.cache.interceptor.CacheInterceptor.lambda$invoke$0(CacheInterceptor.java:64) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11] at org.springframework.cache.interceptor.CacheAspectSupport.invokeOperation(CacheAspectSupport.java:416) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11] at org.springframework.cache.interceptor.CacheAspectSupport.evaluate(CacheAspectSupport.java:548) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11] at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:433) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11] at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:395) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11] at org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:74) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:768) ~[na:na] at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:720) ~[na:na] at com.github.schaka.janitorr.cleanup.MediaCleanupSchedule$$SpringCGLIB$$0.runSchedule() ~[com.github.schaka.janitorr.JanitorrApplicationKt:na] at @./java.lang.reflect.Method.invoke(Method.java:580) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na] at org.springframework.scheduling.support.ScheduledMethodRunnable.runInternal(ScheduledMethodRunnable.java:130) ~[na:na] at org.springframework.scheduling.support.ScheduledMethodRunnable.lambda$run$2(ScheduledMethodRunnable.java:124) ~[na:na] at io.micrometer.observation.Observation.observe(Observation.java:499) ~[com.github.schaka.janitorr.JanitorrApplicationKt:1.13.2] at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:124) ~[na:na] at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) ~[com.github.schaka.janitorr.JanitorrApplicationKt:6.1.11] at @./java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572) ~[na:na] at @./java.util.concurrent.FutureTask.runAndReset(FutureTask.java:358) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na] at @./java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) ~[na:na] at @./java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na] at @./java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ~[na:na] at @./java.lang.Thread.runWith(Thread.java:1596) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na] at @./java.lang.VirtualThread.run(VirtualThread.java:309) ~[com.github.schaka.janitorr.JanitorrApplicationKt:na] at @.***/java.lang.VirtualThread$VThreadContinuation$1.run(VirtualThread.java:190) ~[na:na]

2024-08-28T18:52:24.684-04:00 INFO 1 --- [ scheduling-1] c.g.s.j.cleanup.TagBasedCleanupSchedule : Tag based cleanup disabled, do nothing 2024-08-28T18:52:24.684-04:00 INFO 1 --- [ scheduling-1] c.g.s.j.c.WeeklyEpisodeCleanupSchedule : Episode based cleanup disabled, do nothing

And just a question, once dry-run was disabled, I now see on Emby that the Shows (Deleted Soon) collection has folders in it. These folders are of show names that I presume are going to be deleted. The folders are empty, with no details about the show, etc. Is this expected behaviour? Screenshot attached.

Screenshot_1280.png (view on web) https://github.com/user-attachments/assets/3f8f8a73-87c7-43cb-8d8f-08ca53a9d83e Screenshot_1281.png (view on web) https://github.com/user-attachments/assets/77eedb8a-1f95-4941-b0fe-b37b6ff5bf7f

— Reply to this email directly, view it on GitHub https://github.com/Schaka/janitorr/issues/55#issuecomment-2316377381, or unsubscribe https://github.com/notifications/unsubscribe-auth/AUMWJOE366NBORUCHST4HE3ZTZIVTAVCNFSM6AAAAABNFBVCTCVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDGMJWGM3TOMZYGE . You are receiving this because you were mentioned.Message ID: @.***>

kylehandy123 commented 1 month ago

@hacshacdgacs I did run 2 scans prior to asking the question in the above comment, just to ensure I wasn't mistaken. As of now, the folder remains the same as the above screenshots.

Schaka commented 1 month ago

For the sonarr error you're seeing I'll need your sonarr log file. There's unfortunately nothing here.

Older Sonarr v3 is not supported. And you need to make sure it can delete the files on your drives, of course.

Regarding the leaving soon folders, they should contain symlinks. If the symlinks aren't being created, you need to carefully go through the log file. It should say exactly which ones couldn't be created.

kylehandy123 commented 1 month ago

Brilliant thank you. I will go through them between now and tomorrow and see what I can find.

Schaka commented 1 month ago

Regarding file permissions, I saw that you're on Unraid. You may need to add: Extra Parameters: --user 99:100 to your config.

This will run the container as nobody:users, the default Unraid user that Emby should also be running as. Both should then have the correct file permissions. You'll have to ssh into your server for now and chown -R nobody:users /your/leaving/soon/folder to correct any folders and symlinks that may have been created as another user.

I'll get this added to the Unraid template just in case.

kylehandy123 commented 1 month ago

So good news, it appears Janitorr is now working correctly. Sonarr was cleaned up of old content, unmonitored, etc. Emby now has content in the Shows (Deleted Soon) folder. If I may ask a few questions just to better my understanding of how Janitorr exactly works, if not, please feel more than free to just close this issue. Otherwise;

  1. Does Janitorr automatically choose the oldest requested/added content to Sonarr/Emby as what to remove first?
  2. Does watching something in the Shows (Deleted Soon) collection automatically mark that content as being watched and therefore not to remove it?
  3. This is related to 1 & 2, but how does Janitorr exactly decide which content should be selected for removal vs kept until a later date? I see the timeframes under movie-expiration and episode-deletion, but want to just understand better how this works.
  4. I see episode-deletion ignores Jellystat. Only grab history. Is this oldest grab history?
  5. Is Janitorr also removing requests from Jellyseerr? I THINK it is, based on what I think i remember reading, but just want to verify.

I apologize for the questions, I just want to understand exactly how Janitorr is deciding what to do, mainly so I can tweak my config, etc. Any helpful tips, explanations of what the config is telling Janitorr to do, or pointing me to information already out there is appreciated. Again, please don't feel inclined to answer my torrent of questions, I'm happy that its just working now and I can learn and go from here.

Thank you again @Schaka for all the work the last few days fixing these issues and getting things working as I think Janitorr was expected to work as.

Schaka commented 1 month ago
  1. No, if it goes over the threshold, it deletes everything that crosses the threshold indiscriminately. It does not keep re-checking after every season if more space is available now. But you're free to add as many thresholds as you want to that list. You can do so in 1% iterations.
  2. If you have Jellystat set up to monitor all libraries including the (Deleted Soon) libraries, it should show up on Jellystat. You can confirm this by trying it out for a show you want to keep. Jellystat uses metadata (IMDB, TMDB, TVDB) to match, so this needs to be correct. The best way to ensure that is TRaSH Guides folder naming.
  3. It selects them by grab history. If a show was grabbed 3 months ago and your season-expiration is set to 80 days, this show has crossed the threshold. The % of disk space left just decides which threshold gets used for calculation. If Jellystat is enabled, it will then check Jellystat for the last watch date and if applicable update the "age" of that season. So you don't run the risk of shows expiring if they were watched unless some metadata is missing.
  4. This is a feature people requested for daily/weekly episodes of constantly running shows. Think the Korean Running Man or one of those German telenovelas running for 5000+ episodes. It will first delete all episodes that are too old, as defined by you (and grab history only). It will delete then the oldest episodes until you've reached your minimum keep.
  5. It does. It relies on matching Sonarr/Radarr IDs but will fall back to metadata matching.

I've added the user to the Unraid template (I think this is what you were missing?). If everything works as expected now, I'll release a new build and close this issue.

kylehandy123 commented 1 month ago

Thank you very much for the explanations. Thank you for adding the user to the unraid template. I'm not 100% certain how much of a problem this was, but I don't see any reason to not add it as a safety net nonetheless. I did reset permissions for my entire Media directory which appears to have solved the issue, so good call. Everything now appears to be working, so I think you're safe to release a new build. Thanks again for the help, I'll likely be floating around for feature requests or reporting issues as they arise to Unraid and Emby specifically.