[Bug]: Torrents that were hardlinked via cross-seed aren't being tagged as noHL

Describe the Bug
According to FR #291 , hard links that exist inside the root folder are supposed to be ignored and therefore torrents can still be tagged with noHL if there are none outside the root dir. Perhaps my config is wrong but I am still getting torrents that should be tagged not being tagged because of cross-seed.
An example is a torrent for Chicago Fire Season 9.
This torrent is no hard-linked to my media folder but individual episodes have been hard-linked by cross-seed to the folder "cross-seed-data"
The original full season pack has then not been tagged as noHL.
Config
# This is an example configuration file that documents all the options.
# It will need to be modified for your specific use case.
# Please refer to the link below for more details on how to set up the configuration file
# https://github.com/StuffAnThings/qbit_manage/wiki/Config-Setup

commands:
  # The commands defined below will IGNORE any commands used in command line and docker env variables.
  dry_run: false
  cross_seed: false
  recheck: false
  cat_update: false
  tag_update: true
  rem_unregistered: false
  tag_tracker_error: true
  rem_orphaned: true
  tag_nohardlinks: true
  skip_cleanup: false

  skip_qb_version_check: false
  share_limits: true
qbt:
  # qBittorrent parameters
  host:
  user:
  pass:

settings:
  force_auto_tmm: true
  tracker_error_tag: issue
  nohardlinks_tag: noHL
  share_limits_tag: ~share_limit
  ignoreTags_OnUpdate: # When running tag-update function, it will update torrent tags for a given torrent even if the torrent has at least one or more of the tags defined here. Otherwise torrents will not be tagged if tags exist.
  - noHL
  - issue
  - cross-seed
directory:
  # Do not remove these
  # Cross-seed var: </your/path/here/>  # Output directory of cross-seed
  # root_dir var: </your/path/here/>  # Root downloads directory used to check for orphaned files, noHL, and RecycleBin.
  # <OPTIONAL> remote_dir var: </your/path/here/>  # Path of docker host mapping of root_dir.
  # Must be set if you're running qbit_manage locally and qBittorrent/cross_seed is in a docker
  # <OPTIONAL> recycle_bin var: </your/path/here/>   # Path of the RecycleBin folder. Default location is set to remote_dir/.RecycleBin
  # <OPTIONAL> torrents_dir var: </your/path/here/>  # Path of the your qbittorrent torrents directory. Required for `save_torrents` attribute in recyclebin

  cross_seed: /your/path/here/
  root_dir: /data/torrents/
  remote_dir: /mnt/user/data/torrents/
  recycle_bin: /mnt/user/data/torrents/.RecycleBin
  orphaned_dir: /mnt/user/data/torrents/orphaned

  torrents_dir:
cat:
  # Category & Path Parameters
  # <Category Name> : <save_path>  # Path of your save directory.
  movies: /data/torrents/movies
  tv: /data/torrents/tv
  movies.cross-seed: /data/torrents/movies
  tv.cross-seed: /data/torrents/tv
  all: /data/torrents/
  music (FL): /data/torrents/music (FL)
  music (L): /data/torrents/music (L)
  music to upload: /data/torrents/music to upload
  seed: /data/torrents/seed
  cross-seed-data: /data/torrents/cross-seed-data
  cross-seed-data.cross-seed: /data/torrents/cross-seed-data
  audiobooks: /data/torrents/audiobooks
  books: /data/torrents/books

tracker:
  # Mandatory
  # Tag Parameters
  # <Tracker URL Keyword>:    # <MANDATORY> This is the keyword in the tracker url
  # <MANDATORY> Set tag name. Can be a list of tags or a single tag
  #   tag: <Tag Name>
  # <OPTIONAL> Will set the torrent Maximum share ratio until torrent is stopped from seeding/uploading. -2 means the global limit should be used, -1 means no limit.
  #   max_ratio: 5.0
  # <OPTIONAL> Will set the torrent Maximum seeding time (min) until torrent is stopped from seeding. -2 means the global limit should be used, -1 means no limit.
  #   max_seeding_time: 129600
  # <OPTIONAL> Will ensure that noHL torrents from this tracker are not deleted by cleanup variable if torrent has not yet met the minimum seeding time (min).
  #   min_seeding_time: 2000
  # <OPTIONAL> Will limit the upload speed KiB/s (KiloBytes/second) (-1 means no limit)
  #   limit_upload_speed: 150
  # <OPTIONAL> Set this to the notifiarr react name. This is used to add indexer reactions to the notifications sent by Notifiarr
  #   notifiarr: <notifiarr indexer>
  animebytes.tv:
    tag: AnimeBytes
    notifiarr: animebytes
  aither:
    tag: aither
  avistaz:
    tag:
    - Avistaz
    - tag2
    - tag3
  beyond-hd:
    tag: [Beyond-HD, tag2, tag3]
    notifiarr: beyondhd
  blutopia:
    tag: Blutopia
    notifiarr: blutopia
  cartoonchaos:
    tag: CartoonChaos
  digitalcore:
    tag: DigitalCore
    max_ratio: 5.0
    notifiarr: digitalcore
  filelist:
    tag: filelist
  flro:
    tag: filelist
  gazellegames:
    tag: GGn
  hdts:
    tag: HDTorrents
  landof.tv:
    tag: BroadcasTheNet
    notifiarr: broadcasthenet
  myanonamouse:
    tag: MaM
  opsfet:
    tag: orpheus
  nebulance:
    tag: nebulance
  passthepopcorn:
    tag: PassThePopcorn
    notifiarr: passthepopcorn
  privatehd:
    tag: PrivateHD
    notifiarr:
  tleechreload:
    tag: TorrentLeech
    notifiarr: torrentleech
  torrentdb:
    tag: TorrentDB
    notifiarr: torrentdb
  torrentleech:
    tag: TorrentLeech
    notifiarr: torrentleech
  tv-vault:
    tag: TV-Vault
  uhdbits:
    tag: uhdbits

  # The "other" key is a special keyword and if defined will tag any other trackers that don't match the above trackers into this tag
  other:
    tag: other

nohardlinks:
  # Tag Movies/Series that are not hard linked
  # Mandatory to fill out directory parameter above to use this function (root_dir/remote_dir)
  # This variable should be set to your category name of your completed movies/completed series in qbit. Acceptable variable can be any category you would like to tag if there are no hardlinks found
  movies:
    # <OPTIONAL> exclude_tags var: Will exclude torrents with any of the following tags when searching through the category.
    exclude_tags:
    - Beyond-HD
    - AnimeBytes
    - MaM
    - orpheus

  tv:
    # <OPTIONAL> exclude_tags var: Will exclude torrents with any of the following tags when searching through the category.
    exclude_tags:
    - Beyond-HD
    - BroadcasTheNet
    - MaM
    - orpheus

  movies.cross-seed:
    # <OPTIONAL> exclude_tags var: Will exclude torrents with any of the following tags when searching through the category.
    exclude_tags:
    - Beyond-HD
    - AnimeBytes
    - MaM
    - orpheus
  tv.cross-seed:
    # <OPTIONAL> exclude_tags var: Will exclude torrents with any of the following tags when searching through the category.
    exclude_tags:
    - Beyond-HD
    - BroadcasTheNet
    - MaM
    - orpheus

  cross-seed-data:
    # <OPTIONAL> exclude_tags var: Will exclude torrents with any of the following tags when searching through the category.
    exclude_tags:
    - Beyond-HD
    - BroadcasTheNet
    - MaM
    - orpheus

  cross-seed-data.cross-seed:
    # <OPTIONAL> exclude_tags var: Will exclude torrents with any of the following tags when searching through the category.
    exclude_tags:
    - Beyond-HD
    - BroadcasTheNet
    - MaM
    - orpheus

share_limits:
  # Control how torrent share limits are set depending on the priority of your grouping
  # Each torrent will be matched with the share limit group with the highest priority that meets the group filter criteria.
  # Each torrent can only be matched with one share limit group
  # This variable is mandatory and is a text defining the name of your grouping. This can be any string you want
  noHL_TorrentLeech:
    # <MANDATORY> priority: <int/float> # This is the priority of your grouping. The lower the number the higher the priority
    priority: 1
    # <OPTIONAL> include_all_tags: <list> # Filter the group based on one or more tags. Multiple include_all_tags are checked with an AND condition
    # All tags defined here must be present in the torrent for it to be included in this group
    include_all_tags:
    - noHL
    - TorrentLeech
    # <OPTIONAL> include_any_tags: <list> # Filter the group based on one or more tags. Multiple include_any_tags are checked with an OR condition
    # Any tags defined here must be present in the torrent for it to be included in this group
    # <OPTIONAL> exclude_all_tags: <list> # Filter by excluding one or more tags. Multiple exclude_all_tags are checked with an AND condition
    # This is useful to combine with the category filter to exclude one or more tags from an entire category
    # All tags defined here must be present in the torrent for it to be excluded in this group
    exclude_all_tags:
    # <OPTIONAL> exclude_any_tags: <list> # Filter by excluding one or more tags. Multiple exclude_any_tags are checked with an OR condition
    # This is useful to combine with the category filter to exclude one or more tags from an entire category
    # Any tags defined here must be present in the torrent for it to be excluded in this group
    exclude_any_tags:
    # <OPTIONAL> categories: <list> # Filter by including one or more categories. Multiple categories are checked with an OR condition
    # Since one torrent can only be associated with a single category, multiple categories are checked with an OR condition
    categories:
    - tv
    - movies
    - tv.cross-seed
    - movies.cross-seed
    - cross-seed-data
    - cross-seed-data.cross-seed
    # <OPTIONAL> max_ratio <float>: Will set the torrent Maximum share ratio until torrent is stopped from seeding/uploading.
    # Will default to -1 (no limit) if not specified for the group.
    max_ratio: 1.5
    # <OPTIONAL> max_seeding_time <int>: Will set the torrent Maximum seeding time (minutes) until torrent is stopped from seeding.
    # Will default to -1 (no limit) if not specified for the group.
    max_seeding_time: 11520
    # <OPTIONAL> min_seeding_time <int>: Will prevent torrent deletion by cleanup variable if torrent has not yet minimum seeding time (minutes).
    # Will default to 0 if not specified for the group.
    min_seeding_time:
    # <OPTIONAL> Limit Upload Speed <int>: Will limit the upload speed KiB/s (KiloBytes/second) (`-1` : No Limit)
    limit_upload_speed:
    # <OPTIONAL> cleanup <bool>: WARNING!! Setting this as true Will remove and delete contents of any torrents that satisfies the share limits
    cleanup: false
    # <OPTIONAL> resume_torrent_after_change <bool>: This variable will resume your torrent after changing share limits. Default is true
    resume_torrent_after_change: true
    # <OPTIONAL> add_group_to_tag <bool>: This adds your grouping as a tag with a suffix defined in settings . Default is true
    # Example: A grouping defined as noHL will have a tag set to noHL.share_limit (if using the default suffix)
    add_group_to_tag: true

  noHL_aither:
    # <MANDATORY> priority: <int/float> # This is the priority of your grouping. The lower the number the higher the priority
    priority: 2
    # <OPTIONAL> include_all_tags: <list> # Filter the group based on one or more tags. Multiple include_all_tags are checked with an AND condition
    # All tags defined here must be present in the torrent for it to be included in this group
    include_all_tags:
    - noHL
    - aither
    # <OPTIONAL> include_any_tags: <list> # Filter the group based on one or more tags. Multiple include_any_tags are checked with an OR condition
    # Any tags defined here must be present in the torrent for it to be included in this group
    include_any_tags:
    # <OPTIONAL> exclude_all_tags: <list> # Filter by excluding one or more tags. Multiple exclude_all_tags are checked with an AND condition
    # This is useful to combine with the category filter to exclude one or more tags from an entire category
    # All tags defined here must be present in the torrent for it to be excluded in this group
    exclude_all_tags:
    - Beyond-HD
    # <OPTIONAL> exclude_any_tags: <list> # Filter by excluding one or more tags. Multiple exclude_any_tags are checked with an OR condition
    # This is useful to combine with the category filter to exclude one or more tags from an entire category
    # Any tags defined here must be present in the torrent for it to be excluded in this group
    exclude_any_tags:
    - Beyond-HD
    # <OPTIONAL> categories: <list> # Filter by including one or more categories. Multiple categories are checked with an OR condition
    # Since one torrent can only be associated with a single category, multiple categories are checked with an OR condition
    categories:
    - tv
    - movies
    - tv.cross-seed
    - movies.cross-seed
    - cross-seed-data
    - cross-seed-data.cross-seed
    # <OPTIONAL> max_ratio <float>: Will set the torrent Maximum share ratio until torrent is stopped from seeding/uploading.
    # Will default to -1 (no limit) if not specified for the group.
    max_ratio:
    # <OPTIONAL> max_seeding_time <int>: Will set the torrent Maximum seeding time (minutes) until torrent is stopped from seeding.
    # Will default to -1 (no limit) if not specified for the group.
    max_seeding_time: 8640
    # <OPTIONAL> min_seeding_time <int>: Will prevent torrent deletion by cleanup variable if torrent has not yet minimum seeding time (minutes).
    # Will default to 0 if not specified for the group.
    min_seeding_time: 7200
    # <OPTIONAL> Limit Upload Speed <int>: Will limit the upload speed KiB/s (KiloBytes/second) (`-1` : No Limit)
    limit_upload_speed:
    # <OPTIONAL> cleanup <bool>: WARNING!! Setting this as true Will remove and delete contents of any torrents that satisfies the share limits
    cleanup: false
    # <OPTIONAL> resume_torrent_after_change <bool>: This variable will resume your torrent after changing share limits. Default is true
    resume_torrent_after_change: true
    # <OPTIONAL> add_group_to_tag <bool>: This adds your grouping as a tag with a suffix defined in settings . Default is true
    # Example: A grouping defined as noHL will have a tag set to noHL.share_limit (if using the default suffix)
    add_group_to_tag: true

  noHL_filelist:
    # <MANDATORY> priority: <int/float> # This is the priority of your grouping. The lower the number the higher the priority
    priority: 3
    # <OPTIONAL> include_all_tags: <list> # Filter the group based on one or more tags. Multiple include_all_tags are checked with an AND condition
    # All tags defined here must be present in the torrent for it to be included in this group
    include_all_tags:
    - noHL
    - filelist
    # <OPTIONAL> include_any_tags: <list> # Filter the group based on one or more tags. Multiple include_any_tags are checked with an OR condition
    # Any tags defined here must be present in the torrent for it to be included in this group
    include_any_tags:
    # <OPTIONAL> exclude_all_tags: <list> # Filter by excluding one or more tags. Multiple exclude_all_tags are checked with an AND condition
    # This is useful to combine with the category filter to exclude one or more tags from an entire category
    # All tags defined here must be present in the torrent for it to be excluded in this group
    exclude_all_tags:
    - Beyond-HD
    # <OPTIONAL> exclude_any_tags: <list> # Filter by excluding one or more tags. Multiple exclude_any_tags are checked with an OR condition
    # This is useful to combine with the category filter to exclude one or more tags from an entire category
    # Any tags defined here must be present in the torrent for it to be excluded in this group
    exclude_any_tags:
    - Beyond-HD
    # <OPTIONAL> categories: <list> # Filter by including one or more categories. Multiple categories are checked with an OR condition
    # Since one torrent can only be associated with a single category, multiple categories are checked with an OR condition
    categories:
    - tv
    - movies
    - tv.cross-seed
    - movies.cross-seed
    - cross-seed-data
    - cross-seed-data.cross-seed
    # <OPTIONAL> max_ratio <float>: Will set the torrent Maximum share ratio until torrent is stopped from seeding/uploading.
    # Will default to -1 (no limit) if not specified for the group.
    max_ratio:
    # <OPTIONAL> max_seeding_time <int>: Will set the torrent Maximum seeding time (minutes) until torrent is stopped from seeding.
    # Will default to -1 (no limit) if not specified for the group.
    max_seeding_time: 4320
    # <OPTIONAL> min_seeding_time <int>: Will prevent torrent deletion by cleanup variable if torrent has not yet minimum seeding time (minutes).
    # Will default to 0 if not specified for the group.
    min_seeding_time: 240
    # <OPTIONAL> Limit Upload Speed <int>: Will limit the upload speed KiB/s (KiloBytes/second) (`-1` : No Limit)
    limit_upload_speed:
    # <OPTIONAL> cleanup <bool>: WARNING!! Setting this as true Will remove and delete contents of any torrents that satisfies the share limits
    cleanup: false
    # <OPTIONAL> resume_torrent_after_change <bool>: This variable will resume your torrent after changing share limits. Default is true
    resume_torrent_after_change: true
    # <OPTIONAL> add_group_to_tag <bool>: This adds your grouping as a tag with a suffix defined in settings . Default is true
    # Example: A grouping defined as noHL will have a tag set to noHL.share_limit (if using the default suffix)
    add_group_to_tag: true

  noHL_Blu:
    # <MANDATORY> priority: <int/float> # This is the priority of your grouping. The lower the number the higher the priority
    priority: 4
    # <OPTIONAL> include_all_tags: <list> # Filter the group based on one or more tags. Multiple include_all_tags are checked with an AND condition
    # All tags defined here must be present in the torrent for it to be included in this group
    include_all_tags:
    - noHL
    - Blutopia
    # <OPTIONAL> include_any_tags: <list> # Filter the group based on one or more tags. Multiple include_any_tags are checked with an OR condition
    # Any tags defined here must be present in the torrent for it to be included in this group
    # <OPTIONAL> exclude_all_tags: <list> # Filter by excluding one or more tags. Multiple exclude_all_tags are checked with an AND condition
    # This is useful to combine with the category filter to exclude one or more tags from an entire category
    # All tags defined here must be present in the torrent for it to be excluded in this group
    exclude_all_tags:
    - Beyond-HD
    # <OPTIONAL> exclude_any_tags: <list> # Filter by excluding one or more tags. Multiple exclude_any_tags are checked with an OR condition
    # This is useful to combine with the category filter to exclude one or more tags from an entire category
    # Any tags defined here must be present in the torrent for it to be excluded in this group
    exclude_any_tags:
    - Beyond-HD
    # <OPTIONAL> categories: <list> # Filter by including one or more categories. Multiple categories are checked with an OR condition
    # Since one torrent can only be associated with a single category, multiple categories are checked with an OR condition
    categories:
    - tv
    - movies
    - tv.cross-seed
    - movies.cross-seed
    - cross-seed-data
    - cross-seed-data.cross-seed
    # <OPTIONAL> max_ratio <float>: Will set the torrent Maximum share ratio until torrent is stopped from seeding/uploading.
    # Will default to -1 (no limit) if not specified for the group.
    max_ratio:
    # <OPTIONAL> max_seeding_time <int>: Will set the torrent Maximum seeding time (minutes) until torrent is stopped from seeding.
    # Will default to -1 (no limit) if not specified for the group.
    max_seeding_time: 11000
    # <OPTIONAL> min_seeding_time <int>: Will prevent torrent deletion by cleanup variable if torrent has not yet minimum seeding time (minutes).
    # Will default to 0 if not specified for the group.
    min_seeding_time: 11000
    # <OPTIONAL> Limit Upload Speed <int>: Will limit the upload speed KiB/s (KiloBytes/second) (`-1` : No Limit)
    limit_upload_speed:
    # <OPTIONAL> cleanup <bool>: WARNING!! Setting this as true Will remove and delete contents of any torrents that satisfies the share limits
    cleanup: false
    # <OPTIONAL> resume_torrent_after_change <bool>: This variable will resume your torrent after changing share limits. Default is true
    resume_torrent_after_change: true
    # <OPTIONAL> add_group_to_tag <bool>: This adds your grouping as a tag with a suffix defined in settings . Default is true
    # Example: A grouping defined as noHL will have a tag set to noHL.share_limit (if using the default suffix)
    add_group_to_tag: true

  noHL_UHDBits:
    # <MANDATORY> priority: <int/float> # This is the priority of your grouping. The lower the number the higher the priority
    priority: 5
    # <OPTIONAL> include_all_tags: <list> # Filter the group based on one or more tags. Multiple include_all_tags are checked with an AND condition
    # All tags defined here must be present in the torrent for it to be included in this group
    include_all_tags:
    - noHL
    - uhdbits
    # <OPTIONAL> include_any_tags: <list> # Filter the group based on one or more tags. Multiple include_any_tags are checked with an OR condition
    # Any tags defined here must be present in the torrent for it to be included in this group
    # <OPTIONAL> exclude_all_tags: <list> # Filter by excluding one or more tags. Multiple exclude_all_tags are checked with an AND condition
    # This is useful to combine with the category filter to exclude one or more tags from an entire category
    # All tags defined here must be present in the torrent for it to be excluded in this group
    exclude_all_tags:
    - Beyond-HD
    # <OPTIONAL> exclude_any_tags: <list> # Filter by excluding one or more tags. Multiple exclude_any_tags are checked with an OR condition
    # This is useful to combine with the category filter to exclude one or more tags from an entire category
    # Any tags defined here must be present in the torrent for it to be excluded in this group
    exclude_any_tags:
    - Beyond-HD
    # <OPTIONAL> categories: <list> # Filter by including one or more categories. Multiple categories are checked with an OR condition
    # Since one torrent can only be associated with a single category, multiple categories are checked with an OR condition
    categories:
    - tv
    - movies
    - tv.cross-seed
    - movies.cross-seed
    - cross-seed-data
    - cross-seed-data.cross-seed
    # <OPTIONAL> max_ratio <float>: Will set the torrent Maximum share ratio until torrent is stopped from seeding/uploading.
    # Will default to -1 (no limit) if not specified for the group.
    max_ratio:
    # <OPTIONAL> max_seeding_time <int>: Will set the torrent Maximum seeding time (minutes) until torrent is stopped from seeding.
    # Will default to -1 (no limit) if not specified for the group.
    max_seeding_time: 11000
    # <OPTIONAL> min_seeding_time <int>: Will prevent torrent deletion by cleanup variable if torrent has not yet minimum seeding time (minutes).
    # Will default to 0 if not specified for the group.
    min_seeding_time: 11000
    # <OPTIONAL> Limit Upload Speed <int>: Will limit the upload speed KiB/s (KiloBytes/second) (`-1` : No Limit)
    limit_upload_speed:
    # <OPTIONAL> cleanup <bool>: WARNING!! Setting this as true Will remove and delete contents of any torrents that satisfies the share limits
    cleanup: false
    # <OPTIONAL> resume_torrent_after_change <bool>: This variable will resume your torrent after changing share limits. Default is true
    resume_torrent_after_change: true
    # <OPTIONAL> add_group_to_tag <bool>: This adds your grouping as a tag with a suffix defined in settings . Default is true
    # Example: A grouping defined as noHL will have a tag set to noHL.share_limit (if using the default suffix)
    add_group_to_tag: true

  noHL_nebulance:
    # <MANDATORY> priority: <int/float> # This is the priority of your grouping. The lower the number the higher the priority
    priority: 6
    # <OPTIONAL> include_all_tags: <list> # Filter the group based on one or more tags. Multiple include_all_tags are checked with an AND condition
    # All tags defined here must be present in the torrent for it to be included in this group
    include_all_tags:
    - noHL
    - nebulance
    # <OPTIONAL> include_any_tags: <list> # Filter the group based on one or more tags. Multiple include_any_tags are checked with an OR condition
    # Any tags defined here must be present in the torrent for it to be included in this group
    # <OPTIONAL> exclude_all_tags: <list> # Filter by excluding one or more tags. Multiple exclude_all_tags are checked with an AND condition
    # This is useful to combine with the category filter to exclude one or more tags from an entire category
    # All tags defined here must be present in the torrent for it to be excluded in this group
    exclude_all_tags:
    - Beyond-HD
    # <OPTIONAL> exclude_any_tags: <list> # Filter by excluding one or more tags. Multiple exclude_any_tags are checked with an OR condition
    # This is useful to combine with the category filter to exclude one or more tags from an entire category
    # Any tags defined here must be present in the torrent for it to be excluded in this group
    exclude_any_tags:
    - Beyond-HD
    # <OPTIONAL> categories: <list> # Filter by including one or more categories. Multiple categories are checked with an OR condition
    # Since one torrent can only be associated with a single category, multiple categories are checked with an OR condition
    categories:
    - tv
    - movies
    - tv.cross-seed
    - movies.cross-seed
    - cross-seed-data
    - cross-seed-data.cross-seed
    # <OPTIONAL> max_ratio <float>: Will set the torrent Maximum share ratio until torrent is stopped from seeding/uploading.
    # Will default to -1 (no limit) if not specified for the group.
    max_ratio:
    # <OPTIONAL> max_seeding_time <int>: Will set the torrent Maximum seeding time (minutes) until torrent is stopped from seeding.
    # Will default to -1 (no limit) if not specified for the group.
    max_seeding_time: 11000
    # <OPTIONAL> min_seeding_time <int>: Will prevent torrent deletion by cleanup variable if torrent has not yet minimum seeding time (minutes).
    # Will default to 0 if not specified for the group.
    min_seeding_time: 11000
    # <OPTIONAL> Limit Upload Speed <int>: Will limit the upload speed KiB/s (KiloBytes/second) (`-1` : No Limit)
    limit_upload_speed:
    # <OPTIONAL> cleanup <bool>: WARNING!! Setting this as true Will remove and delete contents of any torrents that satisfies the share limits
    cleanup: false
    # <OPTIONAL> resume_torrent_after_change <bool>: This variable will resume your torrent after changing share limits. Default is true
    resume_torrent_after_change: true
    # <OPTIONAL> add_group_to_tag <bool>: This adds your grouping as a tag with a suffix defined in settings . Default is true
    # Example: A grouping defined as noHL will have a tag set to noHL.share_limit (if using the default suffix)
    add_group_to_tag: true

recyclebin:
  # Recycle Bin method of deletion will move files into the recycle bin (Located in /root_dir/.RecycleBin) instead of directly deleting them in qbit
  # By default the Recycle Bin will be emptied on every run of the qbit_manage script if empty_after_x_days is defined.
  enabled: true
  # <OPTIONAL> empty_after_x_days var:
  # Will automatically remove all files and folders in recycle bin after x days. (Checks every script run)
  # If this variable is not defined it, the RecycleBin will never be emptied.
  # WARNING: Setting this variable to 0 will delete all files immediately upon script run!
  empty_after_x_days: 14
  # <OPTIONAL> save_torrents var:
  # If this option is set to true you MUST fill out the torrents_dir in the directory attribute.
  # This will save a copy of your .torrent and .fastresume file in the recycle bin before deleting it from qbittorrent
  save_torrents: false
  # <OPTIONAL> split_by_category var:
  # This will split the recycle bin folder by the save path defined in the `cat` attribute
  # and add the base folder name of the recycle bin that was defined in the `recycle_bin` sub-attribute under directory.
  split_by_category: false

orphaned:
  # Orphaned files are those in the root_dir download directory that are not referenced by any active torrents.
  # Will automatically remove all files and folders in orphaned data after x days. (Checks every script run)
  # If this variable is not defined it, the orphaned data will never be emptied.
  # WARNING: Setting this variable to 0 will delete all files immediately upon script run!
  empty_after_x_days: 7
  # File patterns that will not be considered orphaned files. Handy for generated files that aren't part of the torrent but belong with the torrent's files
  exclude_patterns:
  - '**/.DS_Store'
  - '**/Thumbs.db'
  - '**/@eaDir'
  - /data/torrents/books/**
  - /data/torrents/audiobooks/**
  - '**/*.!qB'
  - /data/torrents/temp/**
  - '**/_unpackerred'

webhooks:
  error:
  run_start:
  run_end:
  function:
    cross_seed:
    recheck:
    cat_update:
    tag_update:
    rem_unregistered:
    tag_tracker_error:
    rem_orphaned:
    tag_nohardlinks:
    cleanup_dirs:
    share_limits:

Logs
https://gist.github.com/removinggoose/43f9b91800fbc96b916d598a57e5bf54
Screenshots

Installation
Unraid
Version Number
4.0.2
What branch are you on?
master

ls -lha showing that the files are not hard linked?
cross seed data would symlink or hardlink them and only hardlink is supported with QBm.  It's expected for cross-seed data hardlinked episodes to well, be hardlinked

Yes there are hard links but according to FR #291 i was of the understanding that if there are no hard links outside of the root dir, which there aren’t, then it should be marked as noHL

Again please provide the information requested.
stat with the ionodes from the individual episodes in client, the season pack in client, and the library episodes would confirm.
it is 100% possible and likely that the season pack and individual episodes are both hardlinked to the to the library.

Thank you for your reply. I appreciate your help. Would you please be able to tell me step by step on how to do this?
I know that the episodes are not in library and nor is the season but would like to check and make sure by doing the thing you said to do

I've encountered a similar issue to this today, and wondered if you can check something. The torrents you're having the issue with, are they all ones where the torrent content is in a subfolder? I've found today that torrents where the content is in a subfolder (or subfolders) do not get flagged as noHL. I discovered this when manually adding a torrent to a new category (correctly added to qbm too), which then got data-match cross-seeded, and the noHL wasn't picked up.

Screenshots to confim file list with inodes, showing both locations are outside of the media folder:

Hello! Running with trace logging would help identify the root cause of why the torrent was not selected as NoHL. It provides a lot more details so please try that and post the results for the torrent. Since the logs can be quite excessive make sure to post the log only for the specific torrent hash.

Trace logs: https://privatebin.net/?e2efb1107898c945#BR6v5SkrJBDzH8Q5nfhpof7nhorg1A5SvXHyQDvegV3M

Unfortunately I’m unable to give the trace logs and inode info due to lack of knowledge on how to do so. I can however tell you that it was a season folder that was then data matched as single episodes and placed into the cross-seed-data folder. All of this folders are in the main directory for downloads that qbitmanage sees. They don’t appear elsewhere
appreciate your logs and such and hopefully we can get to the bottom of it. It’s not such a massive problem because for me the main series folder is marked as noHL and then when that is removed, the single episodes are then marked noHL

For trace logs, you can set the container variable QBIT_LOG_LEVEL: debug. For inodes, you can navigate to the directory containing the files you want to check and run ls -lhia.

Thanks for the help. Here are the inode screenshots. Not entirely sure how to interpret this but hope it helps. I will follow up with trace logs

ok i have enabled trace logging but not sure what part you would like out of it. Do i need to delete and re add the torrents so they are scanned?

ok i have enabled trace logging but not sure what part you would like out of it. Do i need to delete and re add the torrents so they are scanned?

No - just re-run qbitmanage with trace logging, then have a look at the output and just share the section(s) relating to a torrent you'd expect to be marked noHL but isn't.

ok so i can only apologise for how dumb i might be but I went into the container setup with unraid and set the log level to debug. Then restarted the container and check the log files in /qbit_manage/logs/activity.log and there doesn't seem to be anything different or anywhere i can find the specific torrent file so either i've done it wrong or i'm looking in the wrong place for the logs

ok so i can only apologise for how dumb i might be but I went into the container setup with unraid and set the log level to debug. Then restarted the container and check the log files in /qbit_manage/logs/activity.log and there doesn't seem to be anything different or anywhere i can find the specific torrent file so either i've done it wrong or i'm looking in the wrong place for the logs

You'll know it's worked as you'll see lines like this:
[2023-07-28 12:57:36,620] [nohardlink:507]            [TRACE]    | Checking no of hard links: 1
...i.e., they have [TRACE] in the line.
You can get the torrent hash by clicking the torrent in qbit, then under the General tab you'll see it. Search your trace logs for that hash, and you'll find the relevant sections.

New logs (with longer expiry) here: https://privatebin.net/?8169c634f976c536#KSGvG85R8YzjptsAMyzJmPh1PtRLKV3TpuzRtNaVMdL

Hi @yammes08 , I notice in the trace logs Checking inode_count dict: None  which is most likely the cause of the issue. Do you see in the trace logs something that looks like "has permission issues. Skipping..." or "not found. Skipping..." ?

@yammes08 can you also share your config?

@yammes08 , can you update to the latest develop and rerun with trace logs? I think I might have fixed the issue

Hey @bobokun

...I notice in the trace logs Checking inode_count dict: None  which is most likely the cause of the issue. Do you see in the trace logs something that looks like "has permission issues. Skipping..." or "not found. Skipping..." ?

I couldn't find either of those things in the logs

can you also share your config? Is /data/torrents/cross-seed-data also found in your root_dir?

Config here: https://privatebin.net/?aa6eb8491ed36e4b#G3ZVhLctGuttrMFshk9kAN3t8Ku9PtQghK3MHf7cUCyw

can you update to the latest develop and rerun with trace logs? I think I might have fixed the issue

Updated to latest develop, still seems to be the same issue. New logs: https://privatebin.net/?cbc816f4fc1c50af#54aYKnM6Ybb9BdsbJ2UEJqmRCjhxdh4nq5TZv5kSezEi

Hold on, I don't think my container updated properly. Re-running.

OK, I'm seeing this is now fixed! 🤘

@removinggoose - perhaps you could update to develop and re-run - see if this is fixed for you too?

Seems to have done the trick. Thanks

How often do you have qbit manage run? I'm noticing torrents be given share limits prior to them being hard linked and therefore the share limits stay after the torrent is hard linked. Is there a way around this other than reducing time to minimise likelihood of occurring?

Share limits should adjust on the next run if they were applied prior to being hard linked. If not it's probably a config issue where the priority needs to be adjusted.

Sorry to sort of change the subject of the thread. I can start a new discussion if needed.
Here is the part of the config that describes the hard links. I'm not sure what priorities do exactly and how to configure it so that it doesn't tag until complete.
share_limits:
  # Control how torrent share limits are set depending on the priority of your grouping
  # Each torrent will be matched with the share limit group with the highest priority that meets the group filter criteria.
  # Each torrent can only be matched with one share limit group
  # This variable is mandatory and is a text defining the name of your grouping. This can be any string you want
  noHL_TorrentLeech:
    # <MANDATORY> priority: <int/float> # This is the priority of your grouping. The lower the number the higher the priority
    priority: 1
    # <OPTIONAL> include_all_tags: <list> # Filter the group based on one or more tags. Multiple include_all_tags are checked with an AND condition
    # All tags defined here must be present in the torrent for it to be included in this group
    include_all_tags:
    - noHL
    - TorrentLeech
    # <OPTIONAL> include_any_tags: <list> # Filter the group based on one or more tags. Multiple include_any_tags are checked with an OR condition
    # Any tags defined here must be present in the torrent for it to be included in this group
    # <OPTIONAL> exclude_all_tags: <list> # Filter by excluding one or more tags. Multiple exclude_all_tags are checked with an AND condition
    # This is useful to combine with the category filter to exclude one or more tags from an entire category
    # All tags defined here must be present in the torrent for it to be excluded in this group
    exclude_all_tags:
    # <OPTIONAL> exclude_any_tags: <list> # Filter by excluding one or more tags. Multiple exclude_any_tags are checked with an OR condition
    # This is useful to combine with the category filter to exclude one or more tags from an entire category
    # Any tags defined here must be present in the torrent for it to be excluded in this group
    exclude_any_tags:
    # <OPTIONAL> categories: <list> # Filter by including one or more categories. Multiple categories are checked with an OR condition
    # Since one torrent can only be associated with a single category, multiple categories are checked with an OR condition
    categories:
    - tv
    - movies
    - tv.cross-seed
    - movies.cross-seed
    - cross-seed-data
    - cross-seed-data.cross-seed
    # <OPTIONAL> max_ratio <float>: Will set the torrent Maximum share ratio until torrent is stopped from seeding/uploading.
    # Will default to -1 (no limit) if not specified for the group.
    max_ratio: 1.5
    # <OPTIONAL> max_seeding_time <int>: Will set the torrent Maximum seeding time (minutes) until torrent is stopped from seeding.
    # Will default to -1 (no limit) if not specified for the group.
    max_seeding_time: 11520
    # <OPTIONAL> min_seeding_time <int>: Will prevent torrent deletion by cleanup variable if torrent has not yet minimum seeding time (minutes).
    # Will default to 0 if not specified for the group.
    min_seeding_time:
    # <OPTIONAL> Limit Upload Speed <int>: Will limit the upload speed KiB/s (KiloBytes/second) (`-1` : No Limit)
    limit_upload_speed:
    # <OPTIONAL> cleanup <bool>: WARNING!! Setting this as true Will remove and delete contents of any torrents that satisfies the share limits
    cleanup: false
    # <OPTIONAL> resume_torrent_after_change <bool>: This variable will resume your torrent after changing share limits. Default is true
    resume_torrent_after_change: true
    # <OPTIONAL> add_group_to_tag <bool>: This adds your grouping as a tag with a suffix defined in settings . Default is true
    # Example: A grouping defined as noHL will have a tag set to noHL.share_limit (if using the default suffix)
    add_group_to_tag: true

  noHL_aither:
    # <MANDATORY> priority: <int/float> # This is the priority of your grouping. The lower the number the higher the priority
    priority: 2
    # <OPTIONAL> include_all_tags: <list> # Filter the group based on one or more tags. Multiple include_all_tags are checked with an AND condition
    # All tags defined here must be present in the torrent for it to be included in this group
    include_all_tags:
    - noHL
    - aither
    # <OPTIONAL> include_any_tags: <list> # Filter the group based on one or more tags. Multiple include_any_tags are checked with an OR condition
    # Any tags defined here must be present in the torrent for it to be included in this group
    include_any_tags:
    # <OPTIONAL> exclude_all_tags: <list> # Filter by excluding one or more tags. Multiple exclude_all_tags are checked with an AND condition
    # This is useful to combine with the category filter to exclude one or more tags from an entire category
    # All tags defined here must be present in the torrent for it to be excluded in this group
    exclude_all_tags:
    - Beyond-HD
    # <OPTIONAL> exclude_any_tags: <list> # Filter by excluding one or more tags. Multiple exclude_any_tags are checked with an OR condition
    # This is useful to combine with the category filter to exclude one or more tags from an entire category
    # Any tags defined here must be present in the torrent for it to be excluded in this group
    exclude_any_tags:
    - Beyond-HD
    # <OPTIONAL> categories: <list> # Filter by including one or more categories. Multiple categories are checked with an OR condition
    # Since one torrent can only be associated with a single category, multiple categories are checked with an OR condition
    categories:
    - tv
    - movies
    - tv.cross-seed
    - movies.cross-seed
    - cross-seed-data
    - cross-seed-data.cross-seed
    # <OPTIONAL> max_ratio <float>: Will set the torrent Maximum share ratio until torrent is stopped from seeding/uploading.
    # Will default to -1 (no limit) if not specified for the group.
    max_ratio:
    # <OPTIONAL> max_seeding_time <int>: Will set the torrent Maximum seeding time (minutes) until torrent is stopped from seeding.
    # Will default to -1 (no limit) if not specified for the group.
    max_seeding_time: 8640
    # <OPTIONAL> min_seeding_time <int>: Will prevent torrent deletion by cleanup variable if torrent has not yet minimum seeding time (minutes).
    # Will default to 0 if not specified for the group.
    min_seeding_time: 7200
    # <OPTIONAL> Limit Upload Speed <int>: Will limit the upload speed KiB/s (KiloBytes/second) (`-1` : No Limit)
    limit_upload_speed:
    # <OPTIONAL> cleanup <bool>: WARNING!! Setting this as true Will remove and delete contents of any torrents that satisfies the share limits
    cleanup: false
    # <OPTIONAL> resume_torrent_after_change <bool>: This variable will resume your torrent after changing share limits. Default is true
    resume_torrent_after_change: true
    # <OPTIONAL> add_group_to_tag <bool>: This adds your grouping as a tag with a suffix defined in settings . Default is true
    # Example: A grouping defined as noHL will have a tag set to noHL.share_limit (if using the default suffix)
    add_group_to_tag: true

  noHL_filelist:
    # <MANDATORY> priority: <int/float> # This is the priority of your grouping. The lower the number the higher the priority
    priority: 3
    # <OPTIONAL> include_all_tags: <list> # Filter the group based on one or more tags. Multiple include_all_tags are checked with an AND condition
    # All tags defined here must be present in the torrent for it to be included in this group
    include_all_tags:
    - noHL
    - filelist
    # <OPTIONAL> include_any_tags: <list> # Filter the group based on one or more tags. Multiple include_any_tags are checked with an OR condition
    # Any tags defined here must be present in the torrent for it to be included in this group
    include_any_tags:
    # <OPTIONAL> exclude_all_tags: <list> # Filter by excluding one or more tags. Multiple exclude_all_tags are checked with an AND condition
    # This is useful to combine with the category filter to exclude one or more tags from an entire category
    # All tags defined here must be present in the torrent for it to be excluded in this group
    exclude_all_tags:
    - Beyond-HD
    # <OPTIONAL> exclude_any_tags: <list> # Filter by excluding one or more tags. Multiple exclude_any_tags are checked with an OR condition
    # This is useful to combine with the category filter to exclude one or more tags from an entire category
    # Any tags defined here must be present in the torrent for it to be excluded in this group
    exclude_any_tags:
    - Beyond-HD
    # <OPTIONAL> categories: <list> # Filter by including one or more categories. Multiple categories are checked with an OR condition
    # Since one torrent can only be associated with a single category, multiple categories are checked with an OR condition
    categories:
    - tv
    - movies
    - tv.cross-seed
    - movies.cross-seed
    - cross-seed-data
    - cross-seed-data.cross-seed
    # <OPTIONAL> max_ratio <float>: Will set the torrent Maximum share ratio until torrent is stopped from seeding/uploading.
    # Will default to -1 (no limit) if not specified for the group.
    max_ratio:
    # <OPTIONAL> max_seeding_time <int>: Will set the torrent Maximum seeding time (minutes) until torrent is stopped from seeding.
    # Will default to -1 (no limit) if not specified for the group.
    max_seeding_time: 4320
    # <OPTIONAL> min_seeding_time <int>: Will prevent torrent deletion by cleanup variable if torrent has not yet minimum seeding time (minutes).
    # Will default to 0 if not specified for the group.
    min_seeding_time: 240
    # <OPTIONAL> Limit Upload Speed <int>: Will limit the upload speed KiB/s (KiloBytes/second) (`-1` : No Limit)
    limit_upload_speed:
    # <OPTIONAL> cleanup <bool>: WARNING!! Setting this as true Will remove and delete contents of any torrents that satisfies the share limits
    cleanup: false
    # <OPTIONAL> resume_torrent_after_change <bool>: This variable will resume your torrent after changing share limits. Default is true
    resume_torrent_after_change: true
    # <OPTIONAL> add_group_to_tag <bool>: This adds your grouping as a tag with a suffix defined in settings . Default is true
    # Example: A grouping defined as noHL will have a tag set to noHL.share_limit (if using the default suffix)
    add_group_to_tag: true

  noHL_Blu:
    # <MANDATORY> priority: <int/float> # This is the priority of your grouping. The lower the number the higher the priority
    priority: 4
    # <OPTIONAL> include_all_tags: <list> # Filter the group based on one or more tags. Multiple include_all_tags are checked with an AND condition
    # All tags defined here must be present in the torrent for it to be included in this group
    include_all_tags:
    - noHL
    - Blutopia
    # <OPTIONAL> include_any_tags: <list> # Filter the group based on one or more tags. Multiple include_any_tags are checked with an OR condition
    # Any tags defined here must be present in the torrent for it to be included in this group
    # <OPTIONAL> exclude_all_tags: <list> # Filter by excluding one or more tags. Multiple exclude_all_tags are checked with an AND condition
    # This is useful to combine with the category filter to exclude one or more tags from an entire category
    # All tags defined here must be present in the torrent for it to be excluded in this group
    exclude_all_tags:
    - Beyond-HD
    # <OPTIONAL> exclude_any_tags: <list> # Filter by excluding one or more tags. Multiple exclude_any_tags are checked with an OR condition
    # This is useful to combine with the category filter to exclude one or more tags from an entire category
    # Any tags defined here must be present in the torrent for it to be excluded in this group
    exclude_any_tags:
    - Beyond-HD
    # <OPTIONAL> categories: <list> # Filter by including one or more categories. Multiple categories are checked with an OR condition
    # Since one torrent can only be associated with a single category, multiple categories are checked with an OR condition
    categories:
    - tv
    - movies
    - tv.cross-seed
    - movies.cross-seed
    - cross-seed-data
    - cross-seed-data.cross-seed
    # <OPTIONAL> max_ratio <float>: Will set the torrent Maximum share ratio until torrent is stopped from seeding/uploading.
    # Will default to -1 (no limit) if not specified for the group.
    max_ratio:
    # <OPTIONAL> max_seeding_time <int>: Will set the torrent Maximum seeding time (minutes) until torrent is stopped from seeding.
    # Will default to -1 (no limit) if not specified for the group.
    max_seeding_time: 11000
    # <OPTIONAL> min_seeding_time <int>: Will prevent torrent deletion by cleanup variable if torrent has not yet minimum seeding time (minutes).
    # Will default to 0 if not specified for the group.
    min_seeding_time: 11000
    # <OPTIONAL> Limit Upload Speed <int>: Will limit the upload speed KiB/s (KiloBytes/second) (`-1` : No Limit)
    limit_upload_speed:
    # <OPTIONAL> cleanup <bool>: WARNING!! Setting this as true Will remove and delete contents of any torrents that satisfies the share limits
    cleanup: false
    # <OPTIONAL> resume_torrent_after_change <bool>: This variable will resume your torrent after changing share limits. Default is true
    resume_torrent_after_change: true
    # <OPTIONAL> add_group_to_tag <bool>: This adds your grouping as a tag with a suffix defined in settings . Default is true
    # Example: A grouping defined as noHL will have a tag set to noHL.share_limit (if using the default suffix)
    add_group_to_tag: true

  noHL_UHDBits:
    # <MANDATORY> priority: <int/float> # This is the priority of your grouping. The lower the number the higher the priority
    priority: 5
    # <OPTIONAL> include_all_tags: <list> # Filter the group based on one or more tags. Multiple include_all_tags are checked with an AND condition
    # All tags defined here must be present in the torrent for it to be included in this group
    include_all_tags:
    - noHL
    - uhdbits
    # <OPTIONAL> include_any_tags: <list> # Filter the group based on one or more tags. Multiple include_any_tags are checked with an OR condition
    # Any tags defined here must be present in the torrent for it to be included in this group
    # <OPTIONAL> exclude_all_tags: <list> # Filter by excluding one or more tags. Multiple exclude_all_tags are checked with an AND condition
    # This is useful to combine with the category filter to exclude one or more tags from an entire category
    # All tags defined here must be present in the torrent for it to be excluded in this group
    exclude_all_tags:
    - Beyond-HD
    # <OPTIONAL> exclude_any_tags: <list> # Filter by excluding one or more tags. Multiple exclude_any_tags are checked with an OR condition
    # This is useful to combine with the category filter to exclude one or more tags from an entire category
    # Any tags defined here must be present in the torrent for it to be excluded in this group
    exclude_any_tags:
    - Beyond-HD
    # <OPTIONAL> categories: <list> # Filter by including one or more categories. Multiple categories are checked with an OR condition
    # Since one torrent can only be associated with a single category, multiple categories are checked with an OR condition
    categories:
    - tv
    - movies
    - tv.cross-seed
    - movies.cross-seed
    - cross-seed-data
    - cross-seed-data.cross-seed
    # <OPTIONAL> max_ratio <float>: Will set the torrent Maximum share ratio until torrent is stopped from seeding/uploading.
    # Will default to -1 (no limit) if not specified for the group.
    max_ratio:
    # <OPTIONAL> max_seeding_time <int>: Will set the torrent Maximum seeding time (minutes) until torrent is stopped from seeding.
    # Will default to -1 (no limit) if not specified for the group.
    max_seeding_time: 11000
    # <OPTIONAL> min_seeding_time <int>: Will prevent torrent deletion by cleanup variable if torrent has not yet minimum seeding time (minutes).
    # Will default to 0 if not specified for the group.
    min_seeding_time: 11000
    # <OPTIONAL> Limit Upload Speed <int>: Will limit the upload speed KiB/s (KiloBytes/second) (`-1` : No Limit)
    limit_upload_speed:
    # <OPTIONAL> cleanup <bool>: WARNING!! Setting this as true Will remove and delete contents of any torrents that satisfies the share limits
    cleanup: false
    # <OPTIONAL> resume_torrent_after_change <bool>: This variable will resume your torrent after changing share limits. Default is true
    resume_torrent_after_change: true
    # <OPTIONAL> add_group_to_tag <bool>: This adds your grouping as a tag with a suffix defined in settings . Default is true
    # Example: A grouping defined as noHL will have a tag set to noHL.share_limit (if using the default suffix)
    add_group_to_tag: true

  noHL_nebulance:
    # <MANDATORY> priority: <int/float> # This is the priority of your grouping. The lower the number the higher the priority
    priority: 6
    # <OPTIONAL> include_all_tags: <list> # Filter the group based on one or more tags. Multiple include_all_tags are checked with an AND condition
    # All tags defined here must be present in the torrent for it to be included in this group
    include_all_tags:
    - noHL
    - nebulance
    # <OPTIONAL> include_any_tags: <list> # Filter the group based on one or more tags. Multiple include_any_tags are checked with an OR condition
    # Any tags defined here must be present in the torrent for it to be included in this group
    # <OPTIONAL> exclude_all_tags: <list> # Filter by excluding one or more tags. Multiple exclude_all_tags are checked with an AND condition
    # This is useful to combine with the category filter to exclude one or more tags from an entire category
    # All tags defined here must be present in the torrent for it to be excluded in this group
    exclude_all_tags:
    - Beyond-HD
    # <OPTIONAL> exclude_any_tags: <list> # Filter by excluding one or more tags. Multiple exclude_any_tags are checked with an OR condition
    # This is useful to combine with the category filter to exclude one or more tags from an entire category
    # Any tags defined here must be present in the torrent for it to be excluded in this group
    exclude_any_tags:
    - Beyond-HD
    # <OPTIONAL> categories: <list> # Filter by including one or more categories. Multiple categories are checked with an OR condition
    # Since one torrent can only be associated with a single category, multiple categories are checked with an OR condition
    categories:
    - tv
    - movies
    - tv.cross-seed
    - movies.cross-seed
    - cross-seed-data
    - cross-seed-data.cross-seed
    # <OPTIONAL> max_ratio <float>: Will set the torrent Maximum share ratio until torrent is stopped from seeding/uploading.
    # Will default to -1 (no limit) if not specified for the group.
    max_ratio:
    # <OPTIONAL> max_seeding_time <int>: Will set the torrent Maximum seeding time (minutes) until torrent is stopped from seeding.
    # Will default to -1 (no limit) if not specified for the group.
    max_seeding_time: 11000
    # <OPTIONAL> min_seeding_time <int>: Will prevent torrent deletion by cleanup variable if torrent has not yet minimum seeding time (minutes).
    # Will default to 0 if not specified for the group.
    min_seeding_time: 11000
    # <OPTIONAL> Limit Upload Speed <int>: Will limit the upload speed KiB/s (KiloBytes/second) (`-1` : No Limit)
    limit_upload_speed:
    # <OPTIONAL> cleanup <bool>: WARNING!! Setting this as true Will remove and delete contents of any torrents that satisfies the share limits
    cleanup: false
    # <OPTIONAL> resume_torrent_after_change <bool>: This variable will resume your torrent after changing share limits. Default is true
    resume_torrent_after_change: true
    # <OPTIONAL> add_group_to_tag <bool>: This adds your grouping as a tag with a suffix defined in settings . Default is true
    # Example: A grouping defined as noHL will have a tag set to noHL.share_limit (if using the default suffix)
    add_group_to_tag: true

recyclebin:
  # Recycle Bin method of deletion will move files into the recycle bin (Located in /root_dir/.RecycleBin) instead of directly deleting them in qbit
  # By default the Recycle Bin will be emptied on every run of the qbit_manage script if empty_after_x_days is defined.
  enabled: true
  # <OPTIONAL> empty_after_x_days var:
  # Will automatically remove all files and folders in recycle bin after x days. (Checks every script run)
  # If this variable is not defined it, the RecycleBin will never be emptied.
  # WARNING: Setting this variable to 0 will delete all files immediately upon script run!
  empty_after_x_days: 7
  # <OPTIONAL> save_torrents var:
  # If this option is set to true you MUST fill out the torrents_dir in the directory attribute.
  # This will save a copy of your .torrent and .fastresume file in the recycle bin before deleting it from qbittorrent
  save_torrents: false
  # <OPTIONAL> split_by_category var:
  # This will split the recycle bin folder by the save path defined in the `cat` attribute
  # and add the base folder name of the recycle bin that was defined in the `recycle_bin` sub-attribute under directory.
  split_by_category: false

orphaned:

Priority is clear
If a torrent applies to multiple groups, the higher prioritized group applies.
you also do not have a default category thus as soon as any share limit group is added for noHL they can and will never have any other groups applied as they match nothing else

That solves it. Silly me. Thanks for the help


Getting default value for not yet cached item from SQLite

Description of Change
Now GetAsync call from SqliteCache returns default value if object not found
Issues Resolved
#326
API Changes
Changing GetAsync to FindAsync in SqliteCache
Platforms Affected

All

Behavioral Changes
Works as expected
Testing Procedure
Get an object from sqlite cache wich was not yet set
PR Checklist

[x] Rebased on top of the target branch at time of PR
[x] Changes adhere to coding standard

Thanks for another great PR @JeremyBP


support for "direct" jsonl files

I am wondering if we really need to support "direct" jsonl files in the optimade.yaml format.
Conceptually to me it seems that the current purpose of optimake is to generate a jsonl file from other structural data formats and optimade.yaml is something that help to achieve this.
If we already have a jsonl file, then the only purpose I see is validation, and the optimade.yaml file does not seem strictly necessary.
But perhaps generating jsonl files and validating them is different enough to separate them?
E.g. we could have a different optimake subcommand for validation (optimade validate <jsonl-file>?)
Regarding the Materials Cloud Archive service, this change would affect  it, as then we should add support for a "direct" jsonl file without any optimade.yaml file.

Would you still want people to provide an optimade.yaml to trigger the scraper at the your end? Otherwise you have to rely on file extensions and the file header which might have many false positives (we can also extend the yaml file to support/require the new database description field to be served in the OPTIMADE metadata)

Could be that we accept either optimade.yaml or optimade.jsonl, but i agree that a single file would be preferable. But i think it's good to design optimake in a way that makes the most sense by itself.
E.g. the example
config_version: 0.1.0

database_description: >-
  This database contains some example CIFs.

entries:
  jsonl_path: example.jsonl
``

I think currently it doesn't do anything, right? And in the future, would it just validate the file? But maybe this makes sense, open to discuss further.

Coming back to this (perhaps it can be closed in the original context), I would quite like optimake serve . (or optimake serve optimade.jsonl) to work without needing a config file, even if it throws errors about validation of the file.

yep, i agree that optimade.jsonl doesn't need to have the config file, and we could make it optional in this case.


Update Plugin Artifacts Links for

Automated changes by create-pull-request GitHub action

 Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.You have signed the CLA already but the status is still pending? Let us recheck it.


<1 CPS time bug

Something's wrong with the time estimate.

What exactly is wrong with it?  If you are on average CPS mode, it will take time for it to correct itself as it is based on history.

Okay, I switched to current CpS mode and it works a lot better. Though it's kinda cool to watch the seconds melt away so quickly.

It's a trade off.  So your issue is fixed?

Closing due to lack of response.


Reads length within specific regions

Hi, could you consider adding an option to calculate statistics from one or more specific regions of a long-read sequencing dataset? Thank you in advance.

Hi,
cramino can read from stdin, so you could use samtools view to select a specific region from your alignment file, then pipe that into cramino. Would that work for you?
Best,
Wouter

Hi Wouter,
Apologies for the late reply, but I managed to work on this only this
morning. Yes, it worked! Thanks a lot, and great work with the tool.
Best,
Arianna
Il giorno ven 26 lug 2024 alle ore 16:01 Wouter De Coster <
@.***> ha scritto:

Hi,
cramino can read from stdin, so you could use samtools view to select a
specific region from your alignment file, then pipe that into cramino.
Would that work for you?
Best,
Wouter
—
Reply to this email directly, view it on GitHub
https://github.com/wdecoster/cramino/issues/31#issuecomment-2252841462,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/BEP5T2OSL6K24LYK3AFN5FDZOJJCZAVCNFSM6AAAAABLQP3RA2VHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDENJSHA2DCNBWGI
.
You are receiving this because you authored the thread.Message ID:
@.***>

Thanks for the feedback! Please let me know if you have any other questions or suggestions.


Remove getHostGICVersion and set the MaxQemuVCPUs on arm64

/test

Hi @justin-he
There are a few golint errors in arm ci you may want to fix. ;)
10:03:27 /home/jenkins/workspace/kata-containers-runtime-ARM-18.04-PR/go/src/github.com/kata-containers/runtime/virtcontainers/utils
10:03:55 virtcontainers/qemu_arm64_test.go:78:21: undeclared name: `gicProfile` (typecheck)
10:03:55 	savedGicProfile := gicProfile
10:03:55 	                   ^
10:03:55 virtcontainers/qemu_arm64_test.go:89:25: undeclared name: `hostGICVersion` (typecheck)
10:03:55 	savedHostGICVersion := hostGICVersion
10:03:55 	                       ^
10:03:55 virtcontainers/qemu_arm64_test.go:99:20: undeclared name: `getHostGICVersion` (typecheck)
10:03:55 		hostGICVersion = getHostGICVersion()
10:03:55 		                 ^

/test

/retest

Hi @justin-he
15:02:13 virtcontainers/qemu_arm64.go:28: File is not `gofmt`-ed with `-s` (gofmt)
15:02:13 var defaultGICVersion  = uint32(3)

you may want to do gofmt on virtcontainers/qemu_arm64.go. ;)

Hi @justin-he
15:02:13 virtcontainers/qemu_arm64.go:28: File is not `gofmt`-ed with `-s` (gofmt)
15:02:13 var defaultGICVersion  = uint32(3)

you may want to do gofmt on virtcontainers/qemu_arm64.go. ;)

Thanks, done for the update

/test

Failed CI jobs are not related with the changes, merging PR ...
repo saved to /etc/yum.repos.d/docker-ce.repo
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * epel: iad.mirror.rackspace.com
Not using downloaded base/repomd.xml because it is older than what we have:
  Current   : Fri Apr 17 00:37:58 2020
  Downloaded: Thu Sep 19 01:13:18 2019
http://olcentgbl.trafficmanager.net/centos/7/os/x86_64/repodata/other.sqlite.bz2: [Errno -1] Metadata file does not match checksum
Trying other mirror.
http://olcentgbl.trafficmanager.net/centos/7/os/x86_64/repodata/other.sqlite.bz2: [Errno -1] Metadata file does not match checksum
Trying other mirror.

00:00:55.644 Complete!
00:00:55.724 Install podman
00:00:57.527 Last metadata expiration check: 0:02:43 ago on Tue 21 Apr 2020 08:26:04 AM UTC.
00:00:59.407 No match for argument: podman-1.8.2
00:00:59.445 Error: Unable to find a match: podman-1.8.2
00:00:59.469 Failed at 21: sudo -E dnf -y install podman-"${version}"
00:00:59.568 Build step 'Execute shell' marked build as failure
00:01:06.862 Performing Post build task...
00:01:06.862 Match found for :.* : True
00:01:06.862 Logical operation result is TRUE
00:01:06.862 Running script  : #!/bin/bash


Crash occurs when leaving level

We have a setup where we're constantly sending data at a 40ms rate, but the application occasionally crashes when we leave the level to our Main Menu level.
We found the culprit to be the lambda function bound to "OnDataReceived"  in UDPComponent, line 270.  Since this bind is not cleared on EndPlay, the lambda persists and is called constantly even while being destroyed, which causes the crash.

The downstream callbacks are cleared here: https://github.com/getnamo/UDP-Unreal/blob/5d49e2e3361480a6776625d6c23a6ff0578082b9/Source/UDPWrapper/Private/UDPComponent.cpp#L346
You can likely unbind the OnDataReceived somewhere here: https://github.com/getnamo/UDP-Unreal/blob/5d49e2e3361480a6776625d6c23a6ff0578082b9/Source/UDPWrapper/Private/UDPComponent.cpp#L321 although it does get called with stop and deleted on Close so I don't quite see how it's being called after it's been cleared?

We concluded it is the AsyncTask that somehow still runs when changing level. By setting Settings.bReceiveDataOnGameThread to false on the Actor that handles the UDP Component (this on BeginPlay), we are able to avoid the crash.
Still needs more testing but seems to be a working solution for now


Add get_by_status to any status based object:

[ ] RawData
[ ] PrepTemplate
[ ] PreprocessedData

@josenavas can we close?

Yup


Signature of $width/width()/getWidth() has changed

Laravel 11.10
Filament v3.2.91
filament-rating-field v0.4.0
I added a simple RatingColumn::make('difficulty') to a table and receive the following error when attempting to load that resource's index page:

Type of Yepsua\Filament\Tables\Components\RatingColumn::$width must be Closure|string|int|null (as in class Filament\Tables\Columns\Column)

I was able to make it work by going down into Yepsua\Filament\Tables\Components\RatingColumn.php class and fixing the $width property and the width() and getWidth() methods to match the signatures in Filament\Tables\Columns\Concerns\HasWidth.php.

Hi @renderse7en,
can you describe what changes you make to git it work, can do it with closure so no need to change package code


Amendment to dietary requirement text...

...
Please can we amend the dietary requirement text which appears on the booking form from:
"Please let us know your dietary requirements so we can make sure you get the right food."
to
"Please let us know your dietary requirements and how many people have these, i.e. 2 vegetarians"

DEFINITELY ignore this - it was me! and I have the power to change it. Sorry too excited and going too fast.


Language server stderr is not always printed in chronological order

I have switched my language server luapls from a log file to logging via stderr, but have noticed that the log messages are not printing in chronological order. This was not the case with the log file.
Sample:
LSP: INFO Language server stderr: 2024/11/28 12:04:55.128  INFO [luapls.server] reading from stdin, writing to stdout
LSP: INFO Language server stderr: 2024/11/28 12:04:55.129 DEBUG [luapls.rpc] jsonrpc2: --> request #0: initialize: {"capabilities":{"general":{"markdown":{"parser":"kakoune-lsp","version":"18.1.0-snapshot"},"positionEncodings":["utf-8","utf-16"],"regularExpressions":{"engine":"Rust regex"}},"offsetEncoding":["utf-8","utf-16"],"textDocument":{"callHierarchy":{"dynamicRegistration":false},"codeAction":{"codeActionLiteralSupport":{"codeActionKind":{"valueSet":["quickfix","refactor","refactor.extract","refactor.inline","refactor.rewrite","source","source.fixAll","source.organizeImports"]}},"dynamicRegistration":false,"isPreferredSupport":false,"resolveSupport":{"properties":["edit"]}},"codeLens":{"dynamicRegistration":false},"colorProvider":{"dynamicRegistration":false},"completion":{"completionItem":{"commitCharactersSupport":false,"deprecatedSupport":false,"documentationFormat":["markdown","plaintext"],"preselectSupport":false,"resolveSupport":{"properties":["additionalTextEdits","detail","documentation"]},"snippetSupport":false},"completionItemKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]},"contextSupport":false,"dynamicRegistration":false},"declaration":{"dynamicRegistration":false,"linkSupport":false},"definition":{"dynamicRegistration":false,"linkSupport":false},"documentHighlight":{"dynamicRegistration":false},"documentLink":{"dynamicRegistration":false,"tooltipSupport":false},"documentSymbol":{"dynamicRegistration":false,"hierarchicalDocumentSymbolSupport":true,"symbolKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]}},"formatting":{"dynamicRegistration":false},"hover":{"contentFormat":["markdown","plaintext"],"dynamicRegistration":false},"implementation":{"dynamicRegistration":false,"linkSupport":false},"inlayHint":{"dynamicRegistration":false},"onTypeFormatting":{"dynamicRegistration":false},"publishDiagnostics":{"relatedInformation":true,"tagSupport":{"valueSet":[1,2]}},"rangeFormatting":{"dynamicRegistration":false},"references":{"dynamicRegistration":false},"rename":{"dynamicRegistration":false,"prepareSupport":false},"selectionRange":{},"semanticTokens":{"dynamicRegistration":true,"formats":["relative"],"requests":{"full":true,"range":false},"serverCancelSupport":true,"tokenModifiers":["readonly","documentation","constant"],"tokenTypes":["variable","operator","string","keyword","namespace","function","type","comment","method"]},"signatureHelp":{"contextSupport":false,"dynamicRegistration":false,"signatureInformation":{"documentationFormat":["plaintext"],"parameterInformation":{"labelOffsetSupport":false}}},"synchronization":{"didSave":true,"dynamicRegistration":false,"willSave":false,"willSaveWaitUntil":false},"typeDefinition":{"dynamicRegistration":false,"linkSupport":false}},"window":{"showMessage":{"messageActionItem":{"additionalPropertiesSupport":true}},"workDoneProgress":true},"workspace":{"applyEdit":true,"codeLens":{"refreshSupport":true},"configuration":true,"didChangeConfiguration":{"dynamicRegistration":false},"executeCommand":{"dynamicRegistration":false},"inlayHint":{"refreshSupport":true},"semanticTokens":{"refreshSupport":true},"symbol":{"dynamicRegistration":false,"symbolKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]}},"workspaceEdit":{"changeAnnotationSupport":{},"documentChanges":true,"failureHandling":"abort","normalizesLineEndings":false,"resourceOperations":["create","delete","rename"]},"workspaceFolders":false}},"clientInfo":{"name":"kakoune-lsp","version":"18.1.0-snapshot"},"initializationOptions":{"roots":["demo.lua"]},"processId":379680,"rootPath":"/home/rai/dev/personal/luapls","rootUri":"file:///home/rai/dev/personal/luapls","trace":"off","workspaceFolders":[{"name":"/home/rai/dev/personal/luapls","uri":"file:///home/rai/dev/personal/luapls"}]}
LSP: INFO Language server stderr: 2024/11/28 12:04:55.136 DEBUG [luapls.environment] Parsed file '/home/rai/dev/personal/luapls/demos/demo.lua' in 164.868µs
LSP: INFO Language server stderr: 2024/11/28 12:04:55.137 DEBUG [luapls.environment] Parsed file '/home/rai/dev/personal/luapls/demos/demo3.lua' in 34.695µs
LSP: INFO Language server stderr: 2024/11/28 12:04:55.137 DEBUG [luapls.environment] Parsed file '/home/rai/dev/personal/luapls/demos/demo2.lua' in 62.823µs
LSP: INFO Language server stderr: 2024/11/28 12:04:55.137 DEBUG [luapls.environment] TYPES:
LSP: INFO Language server stderr: 2024/11/28 12:04:55.137 DEBUG [luapls.environment] Parsed file '/home/rai/dev/personal/luapls/demos/demo4.lua' in 21.059µs
LSP: INFO Language server stderr: 2024/11/28 12:04:55.137 DEBUG [luapls.environment] Initialization took 6.288596ms
LSP: INFO Language server stderr: 2024/11/28 12:04:55.137 DEBUG [luapls.rpc] jsonrpc2: <-- result #0: initialize: {"capabilities":{"textDocumentSync":{"openClose":true,"change":2},"hoverProvider":true,"definitionProvider":true,"documentHighlightProvider":true},"serverInfo":{"name":"luapls"}}
LSP: INFO Language server stderr: 2024/11/28 12:04:55.138 DEBUG [luapls.rpc] jsonrpc2: <-- notif: textDocument/publishDiagnostics: {"uri":"file:///home/rai/dev/personal/luapls/demos/demo2.lua","diagnostics":[{"range":{"start":{"line":8,"character":4},"end":{"line":8,"character":11}},"severity":1,"message":"Unknown annotation"},{"range":{"start":{"line":8,"character":4},"end":{"line":8,"character":4}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":8,"character":12},"end":{"line":8,"character":12}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":8,"character":16},"end":{"line":8,"character":16}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":8,"character":20},"end":{"line":8,"character":20}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":8,"character":23},"end":{"line":8,"character":23}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":9,"character":0},"end":{"line":9,"character":3}},"severity":1,"message":"Extraneous ---"},{"range":{"start":{"line":9,"character":4},"end":{"line":9,"character":10}},"severity":1,"message":"Extraneous invalid"},{"range":{"start":{"line":9,"character":10},"end":{"line":9,"character":11}},"severity":1,"message":"Extraneous whitespace"},{"range":{"start":{"line":8,"character":27},"end":{"line":8,"character":27}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":9,"character":13},"end":{"line":9,"character":13}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":10,"character":4},"end":{"line":10,"character":10}},"severity":1,"message":"Unknown annotation"},{"range":{"start":{"line":10,"character":4},"end":{"line":10,"character":10}},"severity":1,"message":"Expected expression"},{"range":{"start":{"line":10,"character":4},"end":{"line":10,"character":4}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":10,"character":11},"end":{"line":10,"character":11}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":10,"character":13},"end":{"line":10,"character":13}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":11,"character":4},"end":{"line":11,"character":11}},"severity":1,"message":"Unknown annotation"},{"range":{"start":{"line":11,"character":4},"end":{"line":11,"character":11}},"severity":1,"message":"Expected expression"},{"range":{"start":{"line":11,"character":4},"end":{"line":11,"character":4}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":11,"character":12},"end":{"line":11,"character":12}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":16,"character":4},"end":{"line":16,"character":8}},"severity":1,"message":"Unknown annotation"},{"range":{"start":{"line":16,"character":4},"end":{"line":16,"character":4}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":16,"character":9},"end":{"line":16,"character":9}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":16,"character":12},"end":{"line":16,"character":12}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":16,"character":14},"end":{"line":16,"character":14}},"severity":1,"message":"Invalid statement"}]}
LSP: INFO Language server stderr: 2024/11/28 12:04:55.138 DEBUG [luapls.rpc] jsonrpc2: <-- notif: textDocument/publishDiagnostics: {"uri":"file:///home/rai/dev/personal/luapls/demos/demo.lua","diagnostics":[{"range":{"start":{"line":0,"character":4},"end":{"line":0,"character":15}},"severity":1,"message":"Unknown annotation"},{"range":{"start":{"line":0,"character":4},"end":{"line":0,"character":15}},"severity":1,"message":"Expected expression"},{"range":{"start":{"line":0,"character":4},"end":{"line":0,"character":4}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":0,"character":31},"end":{"line":0,"character":36}},"severity":1,"message":"Expected expression"},{"range":{"start":{"line":0,"character":11},"end":{"line":0,"character":11}},"severity":1,"message":"Missing left paren"},{"range":{"start":{"line":0,"character":12},"end":{"line":0,"character":12}},"severity":1,"message":"Missing right paren"},{"range":{"start":{"line":2,"character":11},"end":{"line":2,"character":11}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":3,"character":4},"end":{"line":3,"character":10}},"severity":1,"message":"Unknown annotation"},{"range":{"start":{"line":3,"character":4},"end":{"line":3,"character":10}},"severity":1,"message":"Expected expression"},{"range":{"start":{"line":3,"character":4},"end":{"line":3,"character":4}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":3,"character":11},"end":{"line":3,"character":11}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":3,"character":17},"end":{"line":3,"character":17}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":6,"character":4},"end":{"line":6,"character":10}},"severity":1,"message":"Unknown annotation"},{"range":{"start":{"line":6,"character":4},"end":{"line":6,"character":10}},"severity":1,"message":"Expected expression"},{"range":{"start":{"line":6,"character":4},"end":{"line":6,"character":4}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":6,"character":11},"end":{"line":6,"character":11}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":6,"character":17},"end":{"line":6,"character":17}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":15,"character":4},"end":{"line":15,"character":9}},"severity":1,"message":"Unknown annotation"},{"range":{"start":{"line":15,"character":4},"end":{"line":15,"character":9}},"severity":1,"message":"Expected expression"},{"range":{"start":{"line":15,"character":4},"end":{"line":15,"character":4}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":15,"character":10},"end":{"line":15,"character":10}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":24,"character":4},"end":{"line":24,"character":11}},"severity":1,"message":"Unknown annotation"},{"range":{"start":{"line":24,"character":4},"end":{"line":24,"character":4}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":24,"character":12},"end":{"line":24,"character":12}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":24,"character":16},"end":{"line":24,"character":16}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":24,"character":20},"end":{"line":24,"character":20}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":24,"character":23},"end":{"line":24,"character":23}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":25,"character":0},"end":{"line":25,"character":3}},"severity":1,"message":"Extraneous ---"},{"range":{"start":{"line":25,"character":4},"end":{"line":25,"character":10}},"severity":1,"message":"Extraneous invalid"},{"range":{"start":{"line":25,"character":10},"end":{"line":25,"character":11}},"severity":1,"message":"Extraneous whitespace"},{"range":{"start":{"line":24,"character":27},"end":{"line":24,"character":27}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":25,"character":13},"end":{"line":25,"character":13}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":26,"character":4},"end":{"line":26,"character":10}},"severity":1,"message":"Unknown annotation"},{"range":{"start":{"line":26,"character":4},"end":{"line":26,"character":10}},"severity":1,"message":"Expected expression"},{"range":{"start":{"line":26,"character":4},"end":{"line":26,"character":4}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":26,"character":11},"end":{"line":26,"character":11}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":26,"character":13},"end":{"line":26,"character":13}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":27,"character":4},"end":{"line":27,"character":11}},"severity":1,"message":"Unknown annotation"},{"range":{"start":{"line":27,"character":4},"end":{"line":27,"character":11}},"severity":1,"message":"Expected expression"},{"range":{"start":{"line":27,"character":4},"end":{"line":27,"character":4}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":27,"character":12},"end":{"line":27,"character":12}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":34,"character":4},"end":{"line":34,"character":11}},"severity":1,"message":"Unknown annotation"},{"range":{"start":{"line":34,"character":4},"end":{"line":34,"character":4}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":34,"character":12},"end":{"line":34,"character":12}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":34,"character":16},"end":{"line":34,"character":16}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":34,"character":27},"end":{"line":34,"character":27}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":34,"character":30},"end":{"line":34,"character":30}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":35,"character":0},"end":{"line":35,"character":3}},"severity":1,"message":"Extraneous ---"},{"range":{"start":{"line":35,"character":4},"end":{"line":35,"character":10}},"severity":1,"message":"Extraneous invalid"},{"range":{"start":{"line":35,"character":10},"end":{"line":35,"character":11}},"severity":1,"message":"Extraneous whitespace"},{"range":{"start":{"line":34,"character":34},"end":{"line":34,"character":34}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":35,"character":13},"end":{"line":35,"character":13}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":36,"character":4},"end":{"line":36,"character":10}},"severity":1,"message":"Unknown annotation"},{"range":{"start":{"line":36,"character":4},"end":{"line":36,"character":10}},"severity":1,"message":"Expected expression"},{"range":{"start":{"line":36,"character":4},"end":{"line":36,"character":4}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":36,"character":11},"end":{"line":36,"character":11}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":36,"character":13},"end":{"line":36,"character":13}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":37,"character":4},"end":{"line":37,"character":11}},"severity":1,"message":"Unknown annotation"},{"range":{"start":{"line":37,"character":4},"end":{"line":37,"character":11}},"severity":1,"message":"Expected expression"},{"range":{"start":{"line":37,"character":4},"end":{"line":37,"character":4}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":37,"character":12},"end":{"line":37,"character":12}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":42,"character":4},"end":{"line":42,"character":10}},"severity":1,"message":"Unknown annotation"},{"range":{"start":{"line":42,"character":4},"end":{"line":42,"character":10}},"severity":1,"message":"Expected expression"},{"range":{"start":{"line":42,"character":4},"end":{"line":42,"character":4}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":42,"character":11},"end":{"line":42,"character":11}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":42,"character":17},"end":{"line":42,"character":17}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":55,"character":4},"end":{"line":55,"character":10}},"severity":1,"message":"Unknown annotation"},{"range":{"start":{"line":55,"character":4},"end":{"line":55,"character":10}},"severity":1,"message":"Expected expression"},{"range":{"start":{"line":55,"character":4},"end":{"line":55,"character":4}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":55,"character":11},"end":{"line":55,"character":11}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":55,"character":17},"end":{"line":55,"character":17}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":13,"character":37},"end":{"line":13,"character":37}},"severity":1,"message":"Missing end"},{"range":{"start":{"line":0,"character":16},"end":{"line":0,"character":16}},"severity":1,"message":"Invalid statement"}]}
LSP: INFO Language server stderr: 2024/11/28 12:04:55.137 DEBUG [luapls.rpc] jsonrpc2: --> notif: initialized: {}
LSP: INFO Language server stderr: 2024/11/28 12:04:55.138 DEBUG [luapls.rpc] jsonrpc2: <-- notif: textDocument/publishDiagnostics: {"uri":"file:///home/rai/dev/personal/luapls/demos/demo3.lua","diagnostics":[{"range":{"start":{"line":7,"character":7},"end":{"line":7,"character":10}},"severity":1,"message":"Extraneous identifier"},{"range":{"start":{"line":7,"character":16},"end":{"line":7,"character":20}},"severity":1,"message":"Expected expression"},{"range":{"start":{"line":7,"character":16},"end":{"line":7,"character":16}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":11,"character":10},"end":{"line":11,"character":11}},"severity":1,"message":"Expected expression"},{"range":{"start":{"line":11,"character":12},"end":{"line":11,"character":12}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":14,"character":7},"end":{"line":14,"character":8}},"severity":1,"message":"Extraneous right bracket"}]}
LSP: INFO Language server stderr: 2024/11/28 12:04:55.138 DEBUG [luapls.rpc] jsonrpc2: <-- notif: textDocument/publishDiagnostics: {"uri":"file:///home/rai/dev/personal/luapls/demos/demo4.lua","diagnostics":[]}
LSP: INFO Language server stderr: 2024/11/28 12:04:55.138 DEBUG [luapls.rpc] jsonrpc2: --> notif: textDocument/didOpen: {"textDocument":{"languageId":"lua","text":"--- @diagnostic disable:unused-local,unused-function\n\n--- @class Foo\n--- @field field Bar\n\n--- @class Bar\n--- @field field Foo\n\nlocal other = require(\"demos.demo2\")\n\nlocal num = 3\nlocal other_num = num\nlocal other_other_num = other_num\nlocal other_other_other_num = other_other_num\n\n--- @type number\nlocal uninitialized\n\nlocal str, bool = \"foo\", true\nlocal unknown = nil\nlocal func = function(foo, bar) end\n\nlocal type_error = num + str\n\n--- Returns the sum of two numbers.\n--- @param a number\n--- @param b number\n--- @return number\nlocal function add(a, b)\n  return a + b\nend\n\nlocal baz = add(true, 3)\n\n--- Returns the difference of two numbers.\n--- @param a number\n--- @param b number\n--- @return number\nlocal sub = function(a, b)\n  return a - b\nend\n\n--- @param input string\nlocal function print(input) end\n\nlocal tbl = {\n  first = 1,\n  second = \"two\",\n  third = true,\n}\n\ntbl.fourth = function() end\n\nprint(tbl.fourth)\n\n--- @param first string\nfunction tbl.fifth(first) end\n\ntbl.sixth = function(first, ...)\n  print\"bar\"\nend\n\nscript.on_event(defines.events.on_player_created, function(e)\n  local player = game.get_player(e.player_index)\n  if not player then\n    return\n  end\n  player.print(\"Hello, world!\")\nend)\n\nfor i = 1, 10 do\n  print(i)\nend\n","uri":"file:///home/rai/dev/personal/luapls/demos/demo.lua","version":2}}
LSP: INFO Language server stderr: 2024/11/28 12:04:55.139 DEBUG [luapls.rpc] jsonrpc2: --> request #1: textDocument/documentHighlight: {"position":{"character":6,"line":0},"textDocument":{"uri":"file:///home/rai/dev/personal/luapls/demos/demo.lua"}}
LSP: INFO Language server stderr: 2024/11/28 12:04:55.139 DEBUG [luapls.rpc] jsonrpc2: <-- notif: textDocument/publishDiagnostics: {"uri":"file:///home/rai/dev/personal/luapls/demos/demo.lua","diagnostics":[{"range":{"start":{"line":0,"character":4},"end":{"line":0,"character":15}},"severity":1,"message":"Unknown annotation"},{"range":{"start":{"line":0,"character":4},"end":{"line":0,"character":15}},"severity":1,"message":"Expected expression"},{"range":{"start":{"line":0,"character":4},"end":{"line":0,"character":4}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":0,"character":31},"end":{"line":0,"character":36}},"severity":1,"message":"Expected expression"},{"range":{"start":{"line":0,"character":11},"end":{"line":0,"character":11}},"severity":1,"message":"Missing left paren"},{"range":{"start":{"line":0,"character":12},"end":{"line":0,"character":12}},"severity":1,"message":"Missing right paren"},{"range":{"start":{"line":2,"character":11},"end":{"line":2,"character":11}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":3,"character":4},"end":{"line":3,"character":10}},"severity":1,"message":"Unknown annotation"},{"range":{"start":{"line":3,"character":4},"end":{"line":3,"character":10}},"severity":1,"message":"Expected expression"},{"range":{"start":{"line":3,"character":4},"end":{"line":3,"character":4}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":3,"character":11},"end":{"line":3,"character":11}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":3,"character":17},"end":{"line":3,"character":17}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":6,"character":4},"end":{"line":6,"character":10}},"severity":1,"message":"Unknown annotation"},{"range":{"start":{"line":6,"character":4},"end":{"line":6,"character":10}},"severity":1,"message":"Expected expression"},{"range":{"start":{"line":6,"character":4},"end":{"line":6,"character":4}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":6,"character":11},"end":{"line":6,"character":11}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":6,"character":17},"end":{"line":6,"character":17}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":15,"character":4},"end":{"line":15,"character":9}},"severity":1,"message":"Unknown annotation"},{"range":{"start":{"line":15,"character":4},"end":{"line":15,"character":9}},"severity":1,"message":"Expected expression"},{"range":{"start":{"line":15,"character":4},"end":{"line":15,"character":4}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":15,"character":10},"end":{"line":15,"character":10}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":24,"character":4},"end":{"line":24,"character":11}},"severity":1,"message":"Unknown annotation"},{"range":{"start":{"line":24,"character":4},"end":{"line":24,"character":4}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":24,"character":12},"end":{"line":24,"character":12}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":24,"character":16},"end":{"line":24,"character":16}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":24,"character":20},"end":{"line":24,"character":20}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":24,"character":23},"end":{"line":24,"character":23}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":25,"character":0},"end":{"line":25,"character":3}},"severity":1,"message":"Extraneous ---"},{"range":{"start":{"line":25,"character":4},"end":{"line":25,"character":10}},"severity":1,"message":"Extraneous invalid"},{"range":{"start":{"line":25,"character":10},"end":{"line":25,"character":11}},"severity":1,"message":"Extraneous whitespace"},{"range":{"start":{"line":24,"character":27},"end":{"line":24,"character":27}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":25,"character":13},"end":{"line":25,"character":13}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":26,"character":4},"end":{"line":26,"character":10}},"severity":1,"message":"Unknown annotation"},{"range":{"start":{"line":26,"character":4},"end":{"line":26,"character":10}},"severity":1,"message":"Expected expression"},{"range":{"start":{"line":26,"character":4},"end":{"line":26,"character":4}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":26,"character":11},"end":{"line":26,"character":11}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":26,"character":13},"end":{"line":26,"character":13}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":27,"character":4},"end":{"line":27,"character":11}},"severity":1,"message":"Unknown annotation"},{"range":{"start":{"line":27,"character":4},"end":{"line":27,"character":11}},"severity":1,"message":"Expected expression"},{"range":{"start":{"line":27,"character":4},"end":{"line":27,"character":4}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":27,"character":12},"end":{"line":27,"character":12}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":34,"character":4},"end":{"line":34,"character":11}},"severity":1,"message":"Unknown annotation"},{"range":{"start":{"line":34,"character":4},"end":{"line":34,"character":4}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":34,"character":12},"end":{"line":34,"character":12}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":34,"character":16},"end":{"line":34,"character":16}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":34,"character":27},"end":{"line":34,"character":27}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":34,"character":30},"end":{"line":34,"character":30}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":35,"character":0},"end":{"line":35,"character":3}},"severity":1,"message":"Extraneous ---"},{"range":{"start":{"line":35,"character":4},"end":{"line":35,"character":10}},"severity":1,"message":"Extraneous invalid"},{"range":{"start":{"line":35,"character":10},"end":{"line":35,"character":11}},"severity":1,"message":"Extraneous whitespace"},{"range":{"start":{"line":34,"character":34},"end":{"line":34,"character":34}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":35,"character":13},"end":{"line":35,"character":13}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":36,"character":4},"end":{"line":36,"character":10}},"severity":1,"message":"Unknown annotation"},{"range":{"start":{"line":36,"character":4},"end":{"line":36,"character":10}},"severity":1,"message":"Expected expression"},{"range":{"start":{"line":36,"character":4},"end":{"line":36,"character":4}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":36,"character":11},"end":{"line":36,"character":11}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":36,"character":13},"end":{"line":36,"character":13}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":37,"character":4},"end":{"line":37,"character":11}},"severity":1,"message":"Unknown annotation"},{"range":{"start":{"line":37,"character":4},"end":{"line":37,"character":11}},"severity":1,"message":"Expected expression"},{"range":{"start":{"line":37,"character":4},"end":{"line":37,"character":4}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":37,"character":12},"end":{"line":37,"character":12}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":42,"character":4},"end":{"line":42,"character":10}},"severity":1,"message":"Unknown annotation"},{"range":{"start":{"line":42,"character":4},"end":{"line":42,"character":10}},"severity":1,"message":"Expected expression"},{"range":{"start":{"line":42,"character":4},"end":{"line":42,"character":4}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":42,"character":11},"end":{"line":42,"character":11}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":42,"character":17},"end":{"line":42,"character":17}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":55,"character":4},"end":{"line":55,"character":10}},"severity":1,"message":"Unknown annotation"},{"range":{"start":{"line":55,"character":4},"end":{"line":55,"character":10}},"severity":1,"message":"Expected expression"},{"range":{"start":{"line":55,"character":4},"end":{"line":55,"character":4}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":55,"character":11},"end":{"line":55,"character":11}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":55,"character":17},"end":{"line":55,"character":17}},"severity":1,"message":"Invalid statement"},{"range":{"start":{"line":13,"character":37},"end":{"line":13,"character":37}},"severity":1,"message":"Missing end"},{"range":{"start":{"line":0,"character":16},"end":{"line":0,"character":16}},"severity":1,"message":"Invalid statement"}]}

Reproduction:

go install github.com/raiguard/luapls
Set up luapls with kak-lsp:

hook global BufSetOption filetype=lua %{
  set-option buffer lsp_servers %exp{
    [luapls]
    filetypes = ["lua"]
    root_globs = [".git/", ".luarc.json", ".editorconfig", ".kakrc"]
    command = "luapls"
    args = ["lsp", "3"]
  }
}

Open any Lua file
Observe that log messages are not printed in order.

yep sorry about that, that's a regression I've ignored so far, will fix


Sample to send message

Hi,
I am not able to send a massage using curl:
curl -H "Content-Type: application/json" -X POST -d '{"command":"sendMessage","params": ["Hello @PHONE_NUMBER"]}' http://IP:4000/command
Do I miss something?

hi, for the function sendMessage you must pass 2 parameters: the chat_id and the message
try this ;0


Fetch configuration from monika-hq

implements issue #117

[x] Add a new key in the configuration file to specify the URL or IP address of Symon and the API Key to connect to Symon.
[x] If Symon server is specified, Monika first performs handshake with Symon. See this doc.
[ ] After handshake, Monika performs the report flow in interval.
[ ] On incident/recovery, Monika also performs the report flow.

Note:

I added getConfig() function because later the configuration can be updated on the fly with data from monika-hq

How to test?

Setup a mock endpoint for monika-hq with httptarget
curl --location --request POST 'http://localhost:51423/api/paths' \
--header 'Content-Type: application/json' \
--data-raw '{
    "base_path": "monikahq/api/handshake",
    "delay_min_ms": 0,
    "delay_max_ms": 20,
    "return_code": 200,
    "return_headers": {
        "Content-Type": [
            "application/json"
        ]
    },
    "return_body": "{\"monika\":{\"id\":\"some_uuid\",\"ip_address\":\"this-instance-ip\"},\"data\":{\"probes\":[{\"requests\":[{\"url\":\"http://localhost:51423/delay/50/100\"}],\"incidentThreshold\":1,\"recoveryThreshold\":1,\"alerts\":[\"status-not-2xx\",\"response-time-greater-than-70-ms\"]}]}}"
}'

use this in monika configuration json file
{
  "monika-hq": {
    "url": "http://localhost:51423/monikahq",
    "key": "GENERATED_KEY"
  }
}

now when you run monika, it should use configuration from monika-hq

rebased to main branch

rebased to main branch and resolved conflict