diff --git a/VERSION b/VERSION
index 7bc2b21f..880de668 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.17.3-develop26
+1.17.3-develop27
diff --git a/docs/metadata/filters.md b/docs/metadata/filters.md
index 7e12ae88..6168d7e4 100644
--- a/docs/metadata/filters.md
+++ b/docs/metadata/filters.md
@@ -155,20 +155,21 @@ Number filters can **NOT** take multiple values.
### Attribute
-| Number Filters | Description | Movies | Shows | Seasons | Episodes | Artists | Albums | Track |
-|:------------------------------|:---------------------------------------------------------------------|:-------:|:-------------------:|:-------------------:|:--------:|:--------:|:--------:|:--------:|
-| `year` | Uses the year attribute to match
minimum: `1` | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ |
-| `tmdb_year`2 | Uses the year on TMDb to match
minimum: `1` | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
-| `critic_rating` | Uses the critic rating attribute to match
`0.0` - `10.0` | ✅ | ✅ | ❌ | ✅ | ❌ | ✅ | ❌ |
-| `audience_rating` | Uses the audience rating attribute to match
`0.0` - `10.0` | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ |
-| `user_rating` | Uses the user rating attribute to match
`0.0` - `10.0` | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
-| `tmdb_vote_count`2 | Uses the tmdb vote count to match
minimum: `1` | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
-| `plays` | Uses the plays attribute to match
minimum: `1` | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
-| `duration` | Uses the duration attribute to match using minutes
minimum: `0.0` | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ | ✅ |
-| `channels` | Uses the audio channels attribute to match
minimum: `0` | ✅ | ✅1 | ✅1 | ✅ | ❌ | ❌ | ❌ |
-| `height` | Uses the height attribute to match
minimum: `0` | ✅ | ✅1 | ✅1 | ✅ | ❌ | ❌ | ❌ |
-| `width` | Uses the width attribute to match
minimum: `0` | ✅ | ✅1 | ✅1 | ✅ | ❌ | ❌ | ❌ |
-| `aspect` | Uses the aspect attribute to match
minimum: `0.0` | ✅ | ✅1 | ✅1 | ✅ | ❌ | ❌ | ❌ |
+| Number Filters | Description | Movies | Shows | Seasons | Episodes | Artists | Albums | Track |
+|:------------------------------|:---------------------------------------------------------------------|:-------:|:-------------------:|:-------------------:|:--------:|:-------------------:|:-------------------:|:--------:|
+| `year` | Uses the year attribute to match
minimum: `1` | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ |
+| `tmdb_year`2 | Uses the year on TMDb to match
minimum: `1` | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
+| `critic_rating` | Uses the critic rating attribute to match
`0.0` - `10.0` | ✅ | ✅ | ❌ | ✅ | ❌ | ✅ | ❌ |
+| `audience_rating` | Uses the audience rating attribute to match
`0.0` - `10.0` | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ |
+| `user_rating` | Uses the user rating attribute to match
`0.0` - `10.0` | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
+| `tmdb_vote_count`2 | Uses the tmdb vote count to match
minimum: `1` | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
+| `plays` | Uses the plays attribute to match
minimum: `1` | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
+| `duration` | Uses the duration attribute to match using minutes
minimum: `0.0` | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ | ✅ |
+| `channels` | Uses the audio channels attribute to match
minimum: `0` | ✅ | ✅1 | ✅1 | ✅ | ❌ | ❌ | ❌ |
+| `height` | Uses the height attribute to match
minimum: `0` | ✅ | ✅1 | ✅1 | ✅ | ❌ | ❌ | ❌ |
+| `width` | Uses the width attribute to match
minimum: `0` | ✅ | ✅1 | ✅1 | ✅ | ❌ | ❌ | ❌ |
+| `aspect` | Uses the aspect attribute to match
minimum: `0.0` | ✅ | ✅1 | ✅1 | ✅ | ❌ | ❌ | ❌ |
+| `versions` | Uses the number of versions found to match
minimum: `0` | ✅ | ✅1 | ✅1 | ✅ | ✅1 | ✅1 | ✅ |
1 Filters using the special `episodes` [filter](#special-filters) with the [default percent](details/setting).
diff --git a/docs/metadata/overlay.md b/docs/metadata/overlay.md
index b689e42e..25780a94 100644
--- a/docs/metadata/overlay.md
+++ b/docs/metadata/overlay.md
@@ -205,7 +205,7 @@ There are multiple Special Text Variables that can be used when formatting the t
| `<>`: Number of Episodes (`1`)
`<>`: Number of Episodes As Words (`One`)
`<>`: Number of Episodes With 10s Padding (`01`)
`<>`: Number of Episodes With 100s Padding (`001`) | ❌ | ✅ | ✅ | ❌ |
| `<>`: Season Number (`1`)
`<>`: Season Number As Words (`One`)
`<>`: Season Number With 10s Padding (`01`)
`<>`: Season Number With 100s Padding (`001`) | ❌ | ❌ | ✅ | ✅ |
| `<>`: Episode Number (`1`)
`<>`: Episode Number As Words (`One`)
`<>`: Episode Number With 10s Padding (`01`)
`<>`: Episode Number With 100s Padding (`001`) | ❌ | ❌ | ❌ | ✅ |
-| `<>`: Number of Versions of the Item (`1`)
`<>`: Number of Versions of the Item As Words (`One`)
`<>`: Number of Versions of the Item With 10s Padding (`01`)
`<>`: Number of Versions of the Item With 100s Padding (`001`) | ❌ | ✅ | ✅ | ✅ |
+| `<>`: Number of Versions of the Item (`1`)
`<>`: Number of Versions of the Item As Words (`One`)
`<>`: Number of Versions of the Item With 10s Padding (`01`)
`<>`: Number of Versions of the Item With 100s Padding (`001`) | ✅ | ❌ | ❌ | ✅ |
| `<>`: Complete Runtime of the Item in minutes (`150`)
`<>`: Hours in runtime of the Item (`2`)
`<>`: Minutes remaining in the hour in the runtime of the Item (`30`) | ✅ | ❌ | ❌ | ✅ |
| `<>`: Bitrate of the first media file for an item.
`<>`: Bitrate of the media file with the highest bitrate
`<>`: Bitrate of the media file with the lowest bitrate | ✅ | ❌ | ❌ | ✅ |
| `<>`: Original Available Date of the Item
`<>`: Original Available Date of the Item in the given format. [Format Options](https://strftime.org/) | ✅ | ✅ | ❌ | ✅ |
diff --git a/modules/builder.py b/modules/builder.py
index ce870fde..9aa29c35 100644
--- a/modules/builder.py
+++ b/modules/builder.py
@@ -73,10 +73,10 @@ discover_status = {
}
sub_filters = [
"filepath", "audio_track_title", "resolution", "audio_language", "subtitle_language", "has_dolby_vision",
- "channels", "height", "width", "aspect", "audio_codec", "audio_profile", "video_codec", "video_profile"
+ "channels", "height", "width", "aspect", "audio_codec", "audio_profile", "video_codec", "video_profile", "versions"
]
filters_by_type = {
- "movie_show_season_episode_artist_album_track": ["title", "summary", "collection", "has_collection", "added", "last_played", "user_rating", "plays", "filepath", "label", "audio_track_title"],
+ "movie_show_season_episode_artist_album_track": ["title", "summary", "collection", "has_collection", "added", "last_played", "user_rating", "plays", "filepath", "label", "audio_track_title", "versions"],
"movie_show_season_episode_album_track": ["year"],
"movie_show_season_episode_artist_album": ["has_overlay"],
"movie_show_season_episode": ["resolution", "audio_language", "subtitle_language", "has_dolby_vision", "channels", "height", "width", "aspect", "audio_codec", "audio_profile", "video_codec", "video_profile"],
@@ -120,7 +120,7 @@ date_filters = ["release", "added", "last_played", "first_episode_aired", "last_
date_modifiers = ["", ".not", ".before", ".after", ".regex"]
number_filters = [
"year", "tmdb_year", "critic_rating", "audience_rating", "user_rating", "tmdb_vote_count", "plays", "duration",
- "channels", "height", "width", "aspect"]
+ "channels", "height", "width", "aspect", "versions"]
number_modifiers = ["", ".not", ".gt", ".gte", ".lt", ".lte"]
special_filters = [
"history", "episodes", "seasons", "albums", "tracks", "original_language", "original_language.not",
diff --git a/modules/meta.py b/modules/meta.py
index 4461b207..495cd92d 100644
--- a/modules/meta.py
+++ b/modules/meta.py
@@ -762,6 +762,7 @@ class MetadataFile(DataFile):
col["test"] = True
if collection_title in sync:
sync.pop(collection_title)
+ col_names.append(collection_title)
self.collections[collection_title] = col
if other_name and not other_keys:
logger.warning(f"Config Warning: Other Collection {other_name} not needed")
diff --git a/modules/plex.py b/modules/plex.py
index 587802ea..fe138619 100644
--- a/modules/plex.py
+++ b/modules/plex.py
@@ -1451,6 +1451,8 @@ class Plex(Library):
attr = getattr(media, filter_actual)
if attr and attr > test_number:
test_number = attr
+ elif filter_attr == "versions":
+ test_number = len(item.media)
elif filter_attr == "audio_language":
for media in item.media:
for part in media.parts: