terrelsa13 / MUMC

Multi-User Media Cleaner aka MUMC (pronounced Mew-Mick) will go through movies, tv episodes, audio tracks, and audiobooks in your Emby/Jellyfin libraries deleting media items you no longer want.
GNU General Public License v3.0
92 stars 6 forks source link

Script killed when launched with many users #97

Closed Floflobel closed 6 months ago

Floflobel commented 9 months ago

Hello,

I try to run the script on all my users (~200) but every time it gets killed. I see the RAM increasing as it runs on all the users. Is there any way to help? I've left it 10GB of RAM to run quietly. I'll try to get some logs in DEBUG 4 mode, but it may take a while for it to crash.

terrelsa13 commented 9 months ago

I will need more detail.

  1. Which version of MUMC are you running?
  2. Please attach your mumc_config.yaml
    1. You can remove the admin_settings > server portion of the mumc_confing.yaml
    2. You can remove the admin_settings > users portion of the mumc_confing.yaml
Floflobel commented 9 months ago

Sorry, I was at this commit but here's the info:

  1. https://github.com/terrelsa13/MUMC/commit/bec1c597f3ede54cd83c79a90f3ee96d7c94a7fb

    MUMC Version: 5.3.4
    MUMC Config Version: 5.3.0
    Emby Version: 4.8.0.59
    Python Version: 3.9.2
    OS Info: Linux-5.10.0-25-amd64-x86_64-with-glibc2.31
    Time Stamp Start: 20231129144130
  2. mumc_config.yaml

    ---
    version: 5.3.0
    basic_settings:
    filter_statements:
    movie:
      played:
        condition_days: -1
        count_equality: '>='
        count: 1
      created:
        condition_days: 1095
        count_equality: ==
        count: 0
        behavioral_control: true
    episode:
      played:
        condition_days: -1
        count_equality: '>='
        count: 1
      created:
        condition_days: -1
        count_equality: '>='
        count: 1
        behavioral_control: true
    audio:
      played:
        condition_days: -1
        count_equality: '>='
        count: 1
      created:
        condition_days: -1
        count_equality: '>='
        count: 1
        behavioral_control: true
    advanced_settings:
    filter_statements:
    movie:
      query_filter:
        favorited: true
        whitetagged: true
        blacktagged: true
        whitelisted: true
        blacklisted: true
    episode:
      query_filter:
        favorited: true
        whitetagged: true
        blacktagged: true
        whitelisted: true
        blacklisted: true
    audio:
      query_filter:
        favorited: true
        whitetagged: true
        blacktagged: true
        whitelisted: true
        blacklisted: true
    behavioral_statements:
    movie:
      favorited:
        action: keep
        user_conditional: any
        played_conditional: ignore
        action_control: 0
        dynamic_behavior: false
        extra:
          genre: 0
          library_genre: 0
      whitetagged:
        action: keep
        user_conditional: all
        played_conditional: ignore
        action_control: 0
        dynamic_behavior: false
        tags: []
      blacktagged:
        action: delete
        user_conditional: all
        played_conditional: any_played
        action_control: 0
        dynamic_behavior: false
        tags: []
      whitelisted:
        action: keep
        user_conditional: all
        played_conditional: any_any
        action_control: 0
        dynamic_behavior: false
      blacklisted:
        action: delete
        user_conditional: all
        played_conditional: all_created
        action_control: 5
        dynamic_behavior: false
    episode:
      favorited:
        action: keep
        user_conditional: any
        played_conditional: ignore
        action_control: 3
        dynamic_behavior: false
        extra:
          genre: 0
          season_genre: 0
          series_genre: 0
          library_genre: 0
          studio_network: 0
          studio_network_genre: 0
      whitetagged:
        action: keep
        user_conditional: all
        played_conditional: ignore
        action_control: 0
        dynamic_behavior: false
        tags: []
      blacktagged:
        action: delete
        user_conditional: all
        played_conditional: any_played
        action_control: 0
        dynamic_behavior: false
        tags: []
     whitelisted:
        action: keep
        user_conditional: any
        played_conditional: ignore
        action_control: 3
        dynamic_behavior: false
      blacklisted:
        action: delete
        user_conditional: any
        played_conditional: any_played
        action_control: 3
        dynamic_behavior: false
    audio:
      favorited:
        action: keep
        user_conditional: any
        played_conditional: ignore
        action_control: 3
        dynamic_behavior: false
        extra:
          genre: 0
          album_genre: 0
          library_genre: 0
          track_artist: 0
          album_artist: 0
      whitetagged:
        action: keep
        user_conditional: all
        played_conditional: ignore
        action_control: 0
        dynamic_behavior: false
        tags: []
      blacktagged:
        action: delete
        user_conditional: all
        played_conditional: any_played
        action_control: 0
        dynamic_behavior: false
        tags: []
      whitelisted:
        action: keep
        user_conditional: any
        played_conditional: ignore
        action_control: 3
        dynamic_behavior: false
      blacklisted:
        action: delete
        user_conditional: any
        played_conditional: any_played
        action_control: 3
        dynamic_behavior: false
    whitetags: []
    blacktags: []
    episode_control:
    minimum_episodes: 0
    minimum_played_episodes: 0
    minimum_episodes_behavior: Max Played Min Unplayed
    trakt_fix:
    set_missing_last_played_date:
      movie: false
      episode: false
      audio: false
    console_controls:
    headers:
      script:
        show: true
        formatting:
          font:
            color: ''
            style: ''
          background:
            color: ''
      user:
        show: true
        formatting:
          font:
            color: ''
            style: ''
          background:
            color: ''
      summary:
        show: true
        formatting:
          font:
            color: ''
            style: ''
          background:
            color: ''
    footers:
      script:
        show: true
        formatting:
          font:
            color: ''
            style: ''
          background:
            color: ''
    warnings:
      script:
        show: true
        formatting:
          font:
            color: ''
            style: ''
          background:
            color: ''
    movie:
      delete:
        show: true
        formatting:
          font:
            color: ''
            style: ''
          background:
            color: ''
      keep:
        show: true
        formatting:
          font:
            color: ''
            style: ''
          background:
            color: ''
      post_processing:
        show: true
        formatting:
          font:
            color: ''
            style: ''
          background:
            color: ''
      summary:
        show: true
        formatting:
          font:
            color: ''
            style: ''
          background:
            color: ''
    episode:
      delete:
        show: true
        formatting:
          font:
            color: ''
            style: ''
          background:
            color: ''
      keep:
        show: true
        formatting:
          font:
            color: ''
            style: ''
          background:
            color: ''
      post_processing:
        show: true
        formatting:
          font:
            color: ''
            style: ''
          background:
            color: ''
      summary:
        show: true
        formatting:
          font:
            color: ''
            style: ''
          background:
            color: ''
    audio:
      delete:
        show: true
        formatting:
          font:
            color: ''
            style: ''
          background:
            color: ''
      keep:
        show: true
        formatting:
          font:
            color: ''
            style: ''
          background:
            color: ''
      post_processing:
        show: true
        formatting:
          font:
            color: ''
            style: ''
          background:
            color: ''
      summary:
        show: true
        formatting:
          font:
            color: ''
            style: ''
          background:
            color: ''
    UPDATE_CONFIG: false
    REMOVE_FILES: false
    admin_settings:
    server:
    brand: emby
    ...
    behavior:
    list: whitelist
    matching: byId
    users:
    ...
    api_controls:
    attempts: 16
    item_limit: 100
    cache:
    size: 4096
    fallback_behavior: LRU
    minimum_age: 200
    DEBUG: 4

I also try with the basic default cache settings.

terrelsa13 commented 9 months ago

Increasing the cache size potentially helps the script run "faster" while shrinking the available RAM by the value defined in admin_settings > cache > size. If you are running out of RAM when the script is running, increasing the cache is hurting, not helping.

High level of how the script works:

  1. The filter_statement portion of the script is run
    1. The sever is queried for media items for each user
    2. The media items for each user are stored in a dictionary
    3. Details about the conditional behavior information for each media item are stored in dictionaries
  2. The behavioral_statement portion of the script is run
    1. Each media item is compared across all users
    2. Depending on the configuration the media item is either added or removed from the delete list
  3. The delete process is run
    1. Each media item in the delete list is printed for summary
    2. When REMOVE_FILES: true a request to delete is sent to the server for each media item

If there are lots of monitored users and lots of queried media items the dictionaries in 1ii and 1iii are going to grow until all users and all filtered media items are queried.

My suggestions:

  1. Add swap memory
    1. This will be slow
  2. Increase the available RAM until the script is able to finish
    1. This only works if more RAM is available or can be added
  3. Run multiple instances of the script, each with x100 monitored users, at staggered times
    1. If x100 monitored users per script still crashes, try x50, try x25, etc...

The -c command line option can be used to specify a different yaml configuration file. Example: /path/to/python3 /path/to/mumc.py -c /path/to/alternate/yaml_config

terrelsa13 commented 9 months ago

@Floflobel Were you able to get MUMC to run without exhausting the available memory?

Floflobel commented 9 months ago

Thank you for all the information. I am trying to reduce the cache and run it on a computer with 32GB of RAM available. I think the next step is to remove the disabled users from the list. I could try splitting as you said, but I'd lose the advantage of running it on all my users.

Floflobel commented 9 months ago

It just occurred to me that instead of splitting up my users, I could split up the libraries, as I have 7, so I could launch the first library on all my users, then the second, …

terrelsa13 commented 9 months ago

Ahh yes good point! Separating the libraries would also work.

Let me know how this turns out.

Floflobel commented 8 months ago

I'm still trying to play only with one library but it's quite complicated to identify disabled users on Emby.

Is there an easy way to ignore disabled users in the code?

terrelsa13 commented 8 months ago

Not sure I understand. Are you saying you want the script to ignore users that are disabled in the GUI?

Floflobel commented 8 months ago

No, I would like there to be an option to ignore disabled Emby users in MUMC configuration.

The current problem is that when CONFIG_UPDATE=True, it is impossible to see if a user is disabled on Emby. And therefore not to choose it for MUMC. By default, all users are shown in the MUMC CLI configuration.

I could look at each user one by one, but when there are a number of them, it's quite annoying. Personally, I always deactivate my users instead of deleting them in case I need to reactivate them one day.

terrelsa13 commented 8 months ago

Got it!

Yes, there appears to be a IsDisabled: parameter for each user.

I see a few ways this could be implemented. What are you looking for?

  1. Simply show on the command line if the user is disabled?
  2. Or, hide the user from the command line if they are disabled?
  3. Or, do not allow selecting of disabled users?
  4. Some other option?

The closest option for right now is to manually disable each library for any given user in mumc_config.yaml using the lib_enabled option. Not sure this would be any easier than manually removing each user from mumc_config.yaml.

  users:
  - user_id: abcdef1234567890abcdef1234567890
    user_name: UserX
    whitelist:
    - lib_id: bcdef1234567890abcdef1234567890a
      collection_type: music
      path: /path/to/music/albums
      network_path: smb://192.168.x.x/albums
      lib_enabled: false
    blacklist:
    - lib_id: cdef1234567890abcdef1234567890ab
      collection_type: movies
      path: /path/to/movies
      network_path: smb://192.168.x.x/movies
      lib_enabled: false
    - lib_id: def1234567890abcdef1234567890abc
      collection_type: tvshows
      path: /path/to//tv
      network_path: smb://192.168.x.x/tv
      lib_enabled: false
Floflobel commented 8 months ago

Yes, there is an option to find out if a user is disabled on the Emby API.

I was thinking more about option "4." :

Why this option and not the one you quoted above? The reality is that a user can be deactivated at any time from Emby. I'd like to ignore this in MUMC and have it automatically ignored if the parameter is checked. If one of your options were implemented, I would have to restart the MUMC configuration each time to delete the user or do it manually.

NB: I think this option should be set to "true" by default, so that deactivated users are taken into account, as is currently the case.

terrelsa13 commented 8 months ago

Ahh I see. I misunderstood this...

The current problem is that when CONFIG_UPDATE=True, it is impossible to see if a user is disabled on Emby. And therefore not to choose it for MUMC. By default, all users are shown in the MUMC CLI configuration.

I was thinking you only cared about disabling users when modifying the config.

You are correct, your suggestion makes more sense now. You are wanting to disable them in the GUI and have MUMC look for disabled users and ignore them depending on the value of the option that controls it.

Let me see what I can do.

terrelsa13 commented 8 months ago

@Floflobel Take a look at the latest (v5.3.20-beta) in the MUMC_dev branch.

You can either manually add admin_settings > behavior > users > monitor_disabled to the mumc_config.yaml. Or run MUMC once and let it add admin_settings > behavior > users > monitor_disabled to the mumc_config.yaml.

admin_settings:
  behavior:
    ...
    users:
      monitor_disabled: true

monitor_disabled: true - Will include users disabled in the GUI when MUMC runs. monitor_disabled: false - Will exclude users disabled in the GUI when MUMC runs.

Let me know how this works out.


I am also experimenting with a way to allow a choice of how to select the users and libraries. I cannot imagine having to rebuild the config for 200 users.

The choices would be as follows.

        print('Decide how to select users and/or libraries.')
        print('0 - Select users and libraries; (i.e. Select specific users and the specific libraries to be ' + str(library_setup_behavior) + 'ed for each user)')
        print('1 - Select users; (i.e. All libraries will be ' + str(library_setup_behavior) + 'ed for the selected users)')
        print('2 - Select libraries; (i.e. Selected libraries will be ' + str(library_setup_behavior) + 'ed for all users)')
        selection=input('Enter number (default ' + str(defaultvalue) + '): ')

I always have to re-learn how I implemented the user and library builders. And they are always a PITA to work with. No ETA on this yet.

Floflobel commented 8 months ago

Ouha fantastic, thank you very much for your speed.

I redid the configuration from scratch to be 100% sure. I seem to have an error, maybe it's related to my configuration:

----------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------
Time Stamp Start: 20240109114534
MUMC Version: 5.3.20-beta
MUMC Config Version: 5.3.20-beta
Emby Version: 4.8.0.66
Python Version: 3.9.2
OS Info: Linux-5.10.0-26-amd64-x86_64-with-glibc2.31
----------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------
Start...
Cleaning media for server at: https://URL:443/emby
----------------------------------------------------------------------------------------
Traceback (most recent call last):
  File "/root/MUMC/./mumc.py", line 105, in <module>
    MUMC()
  File "/root/MUMC/./mumc.py", line 76, in MUMC
    cfg=init_getMedia(cfg)
  File "/root/MUMC/mumc_modules/mumc_get_media.py", line 713, in init_getMedia
    this_users_info=get_single_user(user_info['user_id'],the_dict)
  File "/root/MUMC/mumc_modules/mumc_user_queries.py", line 20, in get_single_user
    data_all_users=data_all_users['Items']
KeyError: 'Items'

Config file:

---
version: 5.3.20-beta
basic_settings:
  filter_statements:
    movie:
      played:
        condition_days: -1
        count_equality: '>='
        count: 1
      created:
        condition_days: 1095
        count_equality: ==
        count: 0
        behavioral_control: true
...
  behavioral_statements:
    movie:
      favorited:
        action: keep
        user_conditional: any
        played_conditional: ignore
        action_control: 0
        dynamic_behavior: false
        extra:
          genre: 0
          library_genre: 0
      whitetagged:
        action: keep
        user_conditional: all
        played_conditional: ignore
        action_control: 0
        dynamic_behavior: false
        tags: []
      blacktagged:
        action: delete
        user_conditional: all
        played_conditional: any_played
        action_control: 0
        dynamic_behavior: false
        tags: []
      whitelisted:
        action: keep
        user_conditional: all
        played_conditional: any_any
        action_control: 0
        dynamic_behavior: false
      blacklisted:
        action: delete
        user_conditional: all
        played_conditional: all_created
        action_control: 5
        dynamic_behavior: false
...
  trakt_fix:
    set_missing_last_played_date:
      movie: false
      episode: false
      audio: false
admin_settings:
  server:
    brand: emby
...
  behavior:
    list: blacklist
    matching: byId
    users:
      monitor_disabled: false
...
  api_controls:
    attempts: 4
    item_limit: 25
  cache:
    size: 32
    fallback_behavior: LRU
    minimum_age: 200
DEBUG: 0
terrelsa13 commented 8 months ago

I seem to have an error, maybe it's related to my configuration:

Yeah, script was requesting /Users/Query; which returns a dictionary with a key called Items that has a list of users as its value. http://172.31.14.150:39647/Users/Query?api_key=e3232b6388f04637b83c6c549b49c393

Now script is requesting /Users which returns a list of users; and has the common behavior with Jellyfin. http://172.31.14.150:39647/Users?api_key=e3232b6388f04637b83c6c549b49c393

I plan to have another beta release sometime tonight to address that issue and some others.

terrelsa13 commented 8 months ago

To whoever may see this. Those are the API keys from my dev server. I change them often. And the IP is local cannot be accessed remotely.

terrelsa13 commented 8 months ago

@Floflobel

I seem to have an error, maybe it's related to my configuration:

This error should be fixed in the latest release v5.4.0.

Floflobel commented 8 months ago

Super cool, thank you so much for the quick addition of this feature which will greatly help me in my set-up! I think I'll manage to get MUMC on all my users now.

I'm taking the liberty of closing this ticket because for me it's done.

terrelsa13 commented 7 months ago

@Floflobel As promised I have been working on cleaning up the user and library builder so those with either many libraries or many users can create/edit the users and libraries more efficiently.

There is a v5.4.1-beta on the MUMC_dev branch. The next time you are creating/editing users and libraries in the config, give it a shot and let me know if the updates make your life a little easier when it comes to MUMC user management.

When creating/editing the config there will be a new question asking how you would like to build the user libraries. You will want to choose 2. Which will only ask to select libraries and apply those libraries to all users that have access in the GUI to the selected libraries/folders.

Decide how to select users and/or libraries.
0 - Select users and libraries.
    Select specific users and the specific libraries to be blacklisted for each user.
1 - Select users only.
    Selected users will have all libraries blacklisted according to their access policy.
2 - Select libraries only.
    Selected libraries will be blacklisted for all users according to their access policy.
Enter number (default 0 - Select users and libraries):

I am also experimenting with a way to allow a choice of how to select the users and libraries. I cannot imagine having to rebuild the config for 200 users.

The choices would be as follows.

        print('Decide how to select users and/or libraries.')
        print('0 - Select users and libraries; (i.e. Select specific users and the specific libraries to be ' + str(library_setup_behavior) + 'ed for each user)')
        print('1 - Select users; (i.e. All libraries will be ' + str(library_setup_behavior) + 'ed for the selected users)')
        print('2 - Select libraries; (i.e. Selected libraries will be ' + str(library_setup_behavior) + 'ed for all users)')
        selection=input('Enter number (default ' + str(defaultvalue) + '): ')

I always have to re-learn how I implemented the user and library builders. And they are always a PITA to work with. No ETA on this yet.

Floflobel commented 7 months ago

That's great news! Thank you so much for all your hard work. I'll test this out when I have a moment and get back to you.

Floflobel commented 6 months ago

I'd like to come back to this ticket, but don't hesitate if you'd like me to open another.

I've tried the new version and thank you very much, the setup is much simpler and allows you to select all users with specific libraries. It's really cool.

I had started to make a python script to compensate for this but it's much cleaner now.

However, I get an error when I run the script, I think it doesn't like something in my configuration file.

----------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------
Time Stamp Start: 20240213212928
MUMC Version: 5.5.4-beta
MUMC Config Version: 5.5.4-beta
Emby Version: 4.8.1.0
Python Version: 3.9.2
OS Info: Linux-5.10.0-27-amd64-x86_64-with-glibc2.31
----------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------
Start...
Cleaning media for server at: https://streaming.domain:443/emby
----------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------
Get List Of Media For:
user1- 247c7554c10b4bb4934acafd01afcf5e
----------------------------------------------------------------------------------------
Traceback (most recent call last):
  File "/dev/shm/MUMC/mumc.py", line 105, in <module>
    MUMC()
  File "/dev/shm/MUMC/mumc.py", line 76, in MUMC
    cfg=init_getMedia(cfg)
  File "/dev/shm/MUMC/mumc_modules/mumc_get_media.py", line 817, in init_getMedia
    movie_returns=get_mediaItems(the_dict,the_dict['movie_dict']['media_type'],user_info,movie_returns)
  File "/dev/shm/MUMC/mumc_modules/mumc_get_media.py", line 580, in get_mediaItems
    var_dict['item_isWhitelisted']=get_isItemWhitelisted_Blacklisted('whitelist',item,user_info,the_dict)
  File "/dev/shm/MUMC/mumc_modules/mumc_blacklist_whitelist.py", line 58, in get_isItemWhitelisted_Blacklisted
    item_isWhitelisted_isBlacklisted, itemWhitelistedBlacklistedValue=get_isItemMatching_doesItemStartWith(ItemPath,user_wlbllib_path_json,the_dict)
  File "/dev/shm/MUMC/mumc_modules/mumc_compare_items.py", line 60, in get_isItemMatching_doesItemStartWith
    item_two = item_two.replace('\\','/')
AttributeError: 'list' object has no attribute 'replace'
terrelsa13 commented 6 months ago

Good. Glad this simplifies user management for you!

Ok, I'm willing to bet I've messed something up in this new user and library builder. Will you share your config?

If I cannot find the issue by looking at the config, I may need a debug log. But let's try the config first.

Floflobel commented 6 months ago

Sorry for the long wait, here's my setup.

I deleted all my users, leaving just two.

---
version: 5.5.4-beta
basic_settings:
  filter_statements:
    movie:
      played:
        condition_days: -1
        count_equality: '>='
        count: 1
      created:
        condition_days: 1095
        count_equality: ==
        count: 0
        behavioral_control: true
    episode:
      played:
        condition_days: -1
        count_equality: '>='
        count: 1
      created:
        condition_days: -1
        count_equality: '>='
        count: 1
        behavioral_control: true
    audio:
      played:
        condition_days: -1
        count_equality: '>='
        count: 1
      created:
        condition_days: -1
        count_equality: '>='
        count: 1
        behavioral_control: true
advanced_settings:
  filter_statements:
    movie:
      query_filter:
        favorited: true
        whitetagged: false
        blacktagged: true
        whitelisted: false
        blacklisted: true
    episode:
      query_filter:
        favorited: true
        whitetagged: false
        blacktagged: true
        whitelisted: false
        blacklisted: true
    audio:
      query_filter:
        favorited: true
        whitetagged: false
        blacktagged: true
        whitelisted: false
        blacklisted: true
  behavioral_statements:
    movie:
      favorited:
        action: keep
        user_conditional: any
        played_conditional: ignore
        action_control: 3
        dynamic_behavior: false
        extra:
          genre: 0
          library_genre: 0
      whitetagged:
        action: keep
        user_conditional: all
        played_conditional: ignore
        action_control: 0
        dynamic_behavior: false
        tags: []
      blacktagged:
        action: delete
        user_conditional: all
        played_conditional: any_played
        action_control: 0
        dynamic_behavior: false
        tags: []
      whitelisted:
        action: keep
        user_conditional: all
        played_conditional: any_any
        action_control: 0
        dynamic_behavior: false
      blacklisted:
        action: delete
        user_conditional: all
        played_conditional: all_created
        action_control: 5
        dynamic_behavior: false
    episode:
      favorited:
        action: keep
        user_conditional: any
        played_conditional: ignore
        action_control: 3
        dynamic_behavior: false
        extra:
          genre: 0
          season_genre: 0
          series_genre: 0
          library_genre: 0
          studio_network: 0
          studio_network_genre: 0
      whitetagged:
        action: keep
        user_conditional: all
        played_conditional: ignore
        action_control: 0
        dynamic_behavior: false
        tags: []
      blacktagged:
        action: delete
        user_conditional: all
        played_conditional: any_played
        action_control: 0
        dynamic_behavior: false
        tags: []
      whitelisted:
        action: keep
        user_conditional: any
        played_conditional: ignore
        action_control: 3
        dynamic_behavior: false
      blacklisted:
        action: delete
        user_conditional: any
        played_conditional: any_played
        action_control: 3
        dynamic_behavior: false
    audio:
      favorited:
        action: keep
        user_conditional: any
        played_conditional: ignore
        action_control: 3
        dynamic_behavior: false
        extra:
          genre: 0
          album_genre: 0
          library_genre: 0
          track_artist: 0
          album_artist: 0
      whitetagged:
        action: keep
        user_conditional: all
        played_conditional: ignore
        action_control: 0
        dynamic_behavior: false
        tags: []
      blacktagged:
        action: delete
        user_conditional: all
        played_conditional: any_played
        action_control: 0
        dynamic_behavior: false
        tags: []
      whitelisted:
        action: keep
        user_conditional: any
        played_conditional: ignore
        action_control: 3
        dynamic_behavior: false
      blacklisted:
        action: delete
        user_conditional: any
        played_conditional: any_played
        action_control: 3
        dynamic_behavior: false
  whitetags: []
  blacktags: []
  episode_control:
    minimum_episodes: 0
    minimum_played_episodes: 0
    minimum_episodes_behavior: Max Played Min Unplayed
  trakt_fix:
    set_missing_last_played_date:
      movie: false
      episode: false
      audio: false
  console_controls:
    headers:
      script:
        show: true
        formatting:
          font:
            color: ''
            style: ''
          background:
            color: ''
      user:
        show: true
        formatting:
          font:
            color: ''
            style: ''
          background:
            color: ''
      summary:
        show: true
        formatting:
          font:
            color: ''
            style: ''
          background:
            color: ''
    footers:
      script:
        show: true
        formatting:
          font:
            color: ''
            style: ''
          background:
            color: ''
    warnings:
      script:
        show: true
        formatting:
          font:
            color: ''
            style: ''
          background:
            color: ''
    movie:
      delete:
        show: true
        formatting:
          font:
            color: ''
            style: ''
          background:
            color: ''
      keep:
        show: true
        formatting:
          font:
            color: ''
            style: ''
          background:
            color: ''
      post_processing:
        show: true
        formatting:
          font:
            color: ''
            style: ''
          background:
            color: ''
      summary:
        show: true
        formatting:
          font:
            color: ''
            style: ''
          background:
            color: ''
    episode:
      delete:
        show: true
        formatting:
          font:
            color: ''
            style: ''
          background:
            color: ''
      keep:
        show: true
        formatting:
          font:
            color: ''
            style: ''
          background:
            color: ''
      post_processing:
        show: true
        formatting:
          font:
            color: ''
            style: ''
          background:
            color: ''
      summary:
        show: true
        formatting:
          font:
            color: ''
            style: ''
          background:
            color: ''
    audio:
      delete:
        show: true
        formatting:
          font:
            color: ''
            style: ''
          background:
            color: ''
      keep:
        show: true
        formatting:
          font:
            color: ''
            style: ''
          background:
            color: ''
      post_processing:
        show: true
        formatting:
          font:
            color: ''
            style: ''
          background:
            color: ''
      summary:
        show: true
        formatting:
          font:
            color: ''
            style: ''
          background:
            color: ''
  UPDATE_CONFIG: false
  REMOVE_FILES: false
admin_settings:
  server:
    brand: emby
    url: https://streaming.domain:443/emby
    auth_key: XXXXXX
  behavior:
    list: blacklist
    matching: byPath
    users:
      monitor_disabled: false
  users:
  - user_id: 247c7554c10b4bb4934acafd01afcf5e
    user_name: user1
    whitelist:
    - lib_id: db4c1708cbb5dd1676284a40f2950aba
      collection_type: movies
      path: /media/storage3/films
      network_path: ''
      lib_enabled: true
    - lib_id: db4c1708cbb5dd1676284a40f2950aba
      collection_type: movies
      path: /media/storage6/films
      network_path: ''
      lib_enabled: true
    - lib_id: db4c1708cbb5dd1676284a40f2950aba
      collection_type: movies
      path: /media/storage4/films
      network_path: ''
      lib_enabled: true
    - lib_id: db4c1708cbb5dd1676284a40f2950aba
      collection_type: movies
      path: /media/storage8/films
      network_path: ''
      lib_enabled: true
    - lib_id: db4c1708cbb5dd1676284a40f2950aba
      collection_type: movies
      path: /media/storage2/films
      network_path: ''
      lib_enabled: true
    - lib_id: db4c1708cbb5dd1676284a40f2950aba
      collection_type: movies
      path: /media/storage9/films
      network_path: ''
      lib_enabled: true
    - lib_id: 4243b5a6131c8132dd863e2585f88056
      collection_type: playlists
      path: /var/lib/emby/data/playlists
      network_path: ''
      lib_enabled: true
    - lib_id: 4243b5a6131c8132dd863e2585f88056
      collection_type: playlists
      path: /var/lib/emby/data/userplaylists
      network_path: ''
      lib_enabled: true
    - lib_id: 23f368a8448168d1fd434a016eb66fb6
      collection_type: tvshows
      path: /media/storage3/manga
      network_path: ''
      lib_enabled: true
    - lib_id: 23f368a8448168d1fd434a016eb66fb6
      collection_type: tvshows
      path: /media/storage6/manga
      network_path: ''
      lib_enabled: true
    - lib_id: 23f368a8448168d1fd434a016eb66fb6
      collection_type: tvshows
      path: /media/storage7/manga
      network_path: ''
      lib_enabled: true
    - lib_id: 23f368a8448168d1fd434a016eb66fb6
      collection_type: tvshows
      path: /media/storage4/manga
      network_path: ''
      lib_enabled: true
    - lib_id: 23f368a8448168d1fd434a016eb66fb6
      collection_type: tvshows
      path: /media/storage8/manga
      network_path: ''
      lib_enabled: true
    - lib_id: 23f368a8448168d1fd434a016eb66fb6
      collection_type: tvshows
      path: /media/storage2/manga
      network_path: ''
      lib_enabled: true
    - lib_id: 23f368a8448168d1fd434a016eb66fb6
      collection_type: tvshows
      path: /media/storage9/manga
      network_path: ''
      lib_enabled: true
    - lib_id: d565273fd114d77bdf349a2896867069
      collection_type: tvshows
      path: /media/storage3/series
      network_path: ''
      lib_enabled: true
    - lib_id: d565273fd114d77bdf349a2896867069
      collection_type: tvshows
      path: /media/storage6/series
      network_path: ''
      lib_enabled: true
    - lib_id: d565273fd114d77bdf349a2896867069
      collection_type: tvshows
      path: /media/storage7/series
      network_path: ''
      lib_enabled: true
    - lib_id: d565273fd114d77bdf349a2896867069
      collection_type: tvshows
      path: /media/storage4/series
      network_path: ''
      lib_enabled: true
    - lib_id: d565273fd114d77bdf349a2896867069
      collection_type: tvshows
      path: /media/storage8/series
      network_path: ''
      lib_enabled: true
    - lib_id: d565273fd114d77bdf349a2896867069
      collection_type: tvshows
      path: /media/storage2/series
      network_path: ''
      lib_enabled: true
    - lib_id: d565273fd114d77bdf349a2896867069
      collection_type: tvshows
      path: /media/storage9/series
      network_path: ''
      lib_enabled: true
    blacklist:
    - lib_id: db4c1708cbb5dd1676284a40f2950aba
      collection_type: movies
      path: /media/storage7/films
      network_path: ''
      lib_enabled: true
    userPosition: 0
  - user_id: 5417e14c6a3b4394866cbefe7bfaa025
    user_name: user2
    whitelist:
    - lib_id: db4c1708cbb5dd1676284a40f2950aba
      collection_type: movies
      path: /media/storage3/films
      network_path: ''
      lib_enabled: true
    - lib_id: db4c1708cbb5dd1676284a40f2950aba
      collection_type: movies
      path: /media/storage6/films
      network_path: ''
      lib_enabled: true
    - lib_id: db4c1708cbb5dd1676284a40f2950aba
      collection_type: movies
      path: /media/storage4/films
      network_path: ''
      lib_enabled: true
    - lib_id: db4c1708cbb5dd1676284a40f2950aba
      collection_type: movies
      path: /media/storage8/films
      network_path: ''
      lib_enabled: true
    - lib_id: db4c1708cbb5dd1676284a40f2950aba
      collection_type: movies
      path: /media/storage2/films
      network_path: ''
      lib_enabled: true
    - lib_id: db4c1708cbb5dd1676284a40f2950aba
      collection_type: movies
      path: /media/storage9/films
      network_path: ''
      lib_enabled: true
    - lib_id: 4243b5a6131c8132dd863e2585f88056
      collection_type: playlists
      path: /var/lib/emby/data/playlists
      network_path: ''
      lib_enabled: true
    - lib_id: 4243b5a6131c8132dd863e2585f88056
      collection_type: playlists
      path: /var/lib/emby/data/userplaylists
      network_path: ''
      lib_enabled: true
    - lib_id: 23f368a8448168d1fd434a016eb66fb6
      collection_type: tvshows
      path: /media/storage3/manga
      network_path: ''
      lib_enabled: true
    - lib_id: 23f368a8448168d1fd434a016eb66fb6
      collection_type: tvshows
      path: /media/storage6/manga
      network_path: ''
      lib_enabled: true
    - lib_id: 23f368a8448168d1fd434a016eb66fb6
      collection_type: tvshows
      path: /media/storage7/manga
      network_path: ''
      lib_enabled: true
    - lib_id: 23f368a8448168d1fd434a016eb66fb6
      collection_type: tvshows
      path: /media/storage4/manga
      network_path: ''
      lib_enabled: true
    - lib_id: 23f368a8448168d1fd434a016eb66fb6
      collection_type: tvshows
      path: /media/storage8/manga
      network_path: ''
      lib_enabled: true
    - lib_id: 23f368a8448168d1fd434a016eb66fb6
      collection_type: tvshows
      path: /media/storage2/manga
      network_path: ''
      lib_enabled: true
    - lib_id: 23f368a8448168d1fd434a016eb66fb6
      collection_type: tvshows
      path: /media/storage9/manga
      network_path: ''
      lib_enabled: true
    - lib_id: d565273fd114d77bdf349a2896867069
      collection_type: tvshows
      path: /media/storage3/series
      network_path: ''
      lib_enabled: true
    - lib_id: d565273fd114d77bdf349a2896867069
      collection_type: tvshows
      path: /media/storage6/series
      network_path: ''
      lib_enabled: true
    - lib_id: d565273fd114d77bdf349a2896867069
      collection_type: tvshows
      path: /media/storage7/series
      network_path: ''
      lib_enabled: true
    - lib_id: d565273fd114d77bdf349a2896867069
      collection_type: tvshows
      path: /media/storage4/series
      network_path: ''
      lib_enabled: true
    - lib_id: d565273fd114d77bdf349a2896867069
      collection_type: tvshows
      path: /media/storage8/series
      network_path: ''
      lib_enabled: true
    - lib_id: d565273fd114d77bdf349a2896867069
      collection_type: tvshows
      path: /media/storage2/series
      network_path: ''
      lib_enabled: true
    - lib_id: d565273fd114d77bdf349a2896867069
      collection_type: tvshows
      path: /media/storage9/series
      network_path: ''
      lib_enabled: true
    - lib_id: cfb3602ad86e4cb99c8c959cb411b877
      collection_type: Movies
      path: /var/lib/emby/data/top-picks
      network_path: ''
      lib_enabled: true
    blacklist:
    - lib_id: db4c1708cbb5dd1676284a40f2950aba
      collection_type: movies
      path: /media/storage7/films
      network_path: ''
      lib_enabled: true
    userPosition: 1
# ....
  api_controls:
    attempts: 4
    item_limit: 25
  cache:
    size: 32
    fallback_behavior: LRU
    minimum_age: 200
DEBUG: 0
...
terrelsa13 commented 6 months ago

Sorry for the delay. I am looking into updating this portion of the script. Once I have something I will let you know.

terrelsa13 commented 6 months ago

Take a look at v5.6.1 on the MUMC_dev branch.

Floflobel commented 6 months ago

Everything looks good now, and the script runs smoothly. Thanks a lot!

terrelsa13 commented 6 months ago

Awesome! When I get a chance I will merge the MUMC_dev changes into the MUMC_latest branch and make an official release.