fix: align terraform resources with actual provider schema
ci/woodpecker/pr/pre-commit Pipeline failed
ci/woodpecker/pr/plan Pipeline failed

Use nested attribute assignment instead of dynamic blocks for
specifications, quality_groups, and format_items. Remove unsupported
season_search_maximum_single_episode_age from indexer configs. Flatten
custom format specifications to use value/min/max directly.
This commit is contained in:
2026-06-28 22:27:40 +10:00
parent 117c8e7841
commit fe1219878e
24 changed files with 202 additions and 269 deletions
+5 -7
View File
@@ -1,9 +1,7 @@
include_custom_format_when_renaming: false include_custom_format_when_renaming: false
specifications: specifications:
- name: av1 - name: av1
implementation: ReleaseTitleSpecification implementation: ReleaseTitleSpecification
negate: false negate: false
required: false required: false
fields: value: av1
- name: value
value: "av1"
+5 -7
View File
@@ -1,9 +1,7 @@
include_custom_format_when_renaming: false include_custom_format_when_renaming: false
specifications: specifications:
- name: x264 - name: x264
implementation: ReleaseTitleSpecification implementation: ReleaseTitleSpecification
negate: false negate: false
required: false required: false
fields: value: (x|h)\.?264
- name: value
value: "(x|h)\\.?264"
+5 -7
View File
@@ -1,9 +1,7 @@
include_custom_format_when_renaming: false include_custom_format_when_renaming: false
specifications: specifications:
- name: x265 - name: x265
implementation: ReleaseTitleSpecification implementation: ReleaseTitleSpecification
negate: false negate: false
required: false required: false
fields: value: (((x|h)\.?265)|(HEVC))
- name: value
value: "(((x|h)\\.?265)|(HEVC))"
+15 -21
View File
@@ -1,23 +1,17 @@
include_custom_format_when_renaming: false include_custom_format_when_renaming: false
specifications: specifications:
- name: hdr10 - name: hdr10
implementation: ReleaseTitleSpecification implementation: ReleaseTitleSpecification
negate: false negate: false
required: true required: true
fields: value: hdr10
- name: value - name: x265
value: "hdr10" implementation: ReleaseTitleSpecification
- name: x265 negate: false
implementation: ReleaseTitleSpecification required: true
negate: false value: (((x|h)\.?265)|(HEVC))
required: true - name: Surround Sound
fields: implementation: ReleaseTitleSpecification
- name: value negate: false
value: "(((x|h)\\.?265)|(HEVC))" required: true
- name: Surround Sound value: DTS.?(HD|ES|X(?!\D))|TRUEHD|ATMOS|DD(\+|P).?([5-9])|EAC3.?([5-9])
implementation: ReleaseTitleSpecification
negate: false
required: true
fields:
- name: value
value: "DTS.?(HD|ES|X(?!\\D))|TRUEHD|ATMOS|DD(\\+|P).?([5-9])|EAC3.?([5-9])"
+20 -28
View File
@@ -1,30 +1,22 @@
include_custom_format_when_renaming: false include_custom_format_when_renaming: false
specifications: specifications:
- name: 10bit - name: 10bit
implementation: ReleaseTitleSpecification implementation: ReleaseTitleSpecification
negate: false negate: false
required: true required: true
fields: value: 10bit
- name: value - name: hvec
value: "10bit" implementation: ReleaseTitleSpecification
- name: hvec negate: false
implementation: ReleaseTitleSpecification required: false
negate: false value: hvec
required: false - name: x265
fields: implementation: ReleaseTitleSpecification
- name: value negate: false
value: "hvec" required: true
- name: x265 value: (((x|h)\.?265)|(HEVC))
implementation: ReleaseTitleSpecification - name: 'release_iVy: iVy'
negate: false implementation: ReleaseGroupSpecification
required: true negate: false
fields: required: true
- name: value value: -iVy$
value: "(((x|h)\\.?265)|(HEVC))"
- name: "release_iVy: iVy"
implementation: ReleaseGroupSpecification
negate: false
required: true
fields:
- name: value
value: "-iVy$"
@@ -1,9 +1,7 @@
include_custom_format_when_renaming: false include_custom_format_when_renaming: false
specifications: specifications:
- name: "AsmoFuscated " - name: 'AsmoFuscated '
implementation: ReleaseGroupSpecification implementation: ReleaseGroupSpecification
negate: false negate: false
required: false required: false
fields: value: AsmoFuscated$
- name: value
value: "AsmoFuscated$"
+5 -7
View File
@@ -1,9 +1,7 @@
include_custom_format_when_renaming: false include_custom_format_when_renaming: false
specifications: specifications:
- name: d3g - name: d3g
implementation: ReleaseGroupSpecification implementation: ReleaseGroupSpecification
negate: false negate: false
required: false required: false
fields: value: d3g$
- name: value
value: "d3g$"
+5 -7
View File
@@ -1,9 +1,7 @@
include_custom_format_when_renaming: false include_custom_format_when_renaming: false
specifications: specifications:
- name: iVy - name: iVy
implementation: ReleaseGroupSpecification implementation: ReleaseGroupSpecification
negate: false negate: false
required: false required: false
fields: value: iVy$
- name: value
value: "iVy$"
+5 -7
View File
@@ -1,9 +1,7 @@
include_custom_format_when_renaming: false include_custom_format_when_renaming: false
specifications: specifications:
- name: 1080p - name: 1080p
implementation: ResolutionSpecification implementation: ResolutionSpecification
negate: false negate: false
required: false required: false
fields: value: '1080'
- name: value
value: "1080"
+5 -7
View File
@@ -1,9 +1,7 @@
include_custom_format_when_renaming: false include_custom_format_when_renaming: false
specifications: specifications:
- name: 2160p - name: 2160p
implementation: ResolutionSpecification implementation: ResolutionSpecification
negate: false negate: false
required: false required: false
fields: value: '2160'
- name: value
value: "2160"
+5 -7
View File
@@ -1,9 +1,7 @@
include_custom_format_when_renaming: false include_custom_format_when_renaming: false
specifications: specifications:
- name: 720p - name: 720p
implementation: ResolutionSpecification implementation: ResolutionSpecification
negate: false negate: false
required: false required: false
fields: value: '720'
- name: value
value: "720"
+6 -9
View File
@@ -1,11 +1,8 @@
include_custom_format_when_renaming: false include_custom_format_when_renaming: false
specifications: specifications:
- name: size_0_800 - name: size_0_800
implementation: SizeSpecification implementation: SizeSpecification
negate: false negate: false
required: false required: false
fields: min: 0
- name: min max: 0.8
value: "0"
- name: max
value: "0.8"
+6 -9
View File
@@ -1,11 +1,8 @@
include_custom_format_when_renaming: false include_custom_format_when_renaming: false
specifications: specifications:
- name: size_1500_3000 - name: size_1500_3000
implementation: SizeSpecification implementation: SizeSpecification
negate: false negate: false
required: false required: false
fields: min: 1.5
- name: min max: 3
value: "1.5"
- name: max
value: "3"
+6 -9
View File
@@ -1,11 +1,8 @@
include_custom_format_when_renaming: false include_custom_format_when_renaming: false
specifications: specifications:
- name: size_3000_6000 - name: size_3000_6000
implementation: SizeSpecification implementation: SizeSpecification
negate: false negate: false
required: false required: false
fields: min: 3
- name: min max: 6
value: "3"
- name: max
value: "6"
+6 -9
View File
@@ -1,11 +1,8 @@
include_custom_format_when_renaming: false include_custom_format_when_renaming: false
specifications: specifications:
- name: size_6000_10000 - name: size_6000_10000
implementation: SizeSpecification implementation: SizeSpecification
negate: false negate: false
required: false required: false
fields: min: 6
- name: min max: 10
value: "6"
- name: max
value: "10"
+6 -9
View File
@@ -1,11 +1,8 @@
include_custom_format_when_renaming: false include_custom_format_when_renaming: false
specifications: specifications:
- name: size_800_1500 - name: size_800_1500
implementation: SizeSpecification implementation: SizeSpecification
negate: false negate: false
required: false required: false
fields: min: 0.8
- name: min max: 1.5
value: "0.8"
- name: max
value: "1.5"
+5 -7
View File
@@ -1,9 +1,7 @@
include_custom_format_when_renaming: false include_custom_format_when_renaming: false
specifications: specifications:
- name: bluray - name: bluray
implementation: SourceSpecification implementation: SourceSpecification
negate: false negate: false
required: false required: false
fields: value: '6'
- name: value
value: "6"
+5 -7
View File
@@ -1,9 +1,7 @@
include_custom_format_when_renaming: false include_custom_format_when_renaming: false
specifications: specifications:
- name: hdtv - name: hdtv
implementation: SourceSpecification implementation: SourceSpecification
negate: false negate: false
required: false required: false
fields: value: '1'
- name: value
value: "1"
+10 -14
View File
@@ -1,16 +1,12 @@
include_custom_format_when_renaming: false include_custom_format_when_renaming: false
specifications: specifications:
- name: webdl - name: webdl
implementation: SourceSpecification implementation: SourceSpecification
negate: false negate: false
required: false required: false
fields: value: '3'
- name: value - name: webrip
value: "3" implementation: SourceSpecification
- name: webrip negate: false
implementation: SourceSpecification required: false
negate: false value: '4'
required: false
fields:
- name: value
value: "4"
-1
View File
@@ -12,4 +12,3 @@ categories:
- 5070 - 5070
- 5080 - 5080
anime_categories: [] anime_categories: []
season_search_maximum_single_episode_age: 0
-1
View File
@@ -14,4 +14,3 @@ categories:
- 5050 - 5050
anime_categories: anime_categories:
- 5070 - 5070
season_search_maximum_single_episode_age: 0
+1
View File
@@ -0,0 +1 @@
export VAULT_ROLEID=3dd4f36f-222b-59e4-8f93-f7a39dec8cae
+25
View File
@@ -0,0 +1,25 @@
# This file is maintained automatically by "tofu init".
# Manual edits may be lost in future updates.
provider "registry.opentofu.org/devopsarr/sonarr" {
version = "3.4.2"
constraints = "3.4.2"
hashes = [
"h1:2XcXWqATWjGrdkC4lngY4LvqUgwxfy5pjpLWRlNVYcY=",
"zh:01d675253aef5586b165bc4749d006f91cda6ce65b24842c7911cc178fe7e09d",
"zh:2da242ee58c1726cff9ce9260bc94756bc8a775a717da5aec8e9a8bf60578ac6",
"zh:30acc52a3a31ac75387728c27b3193f0419dcb72ee7488e8dbcd407884921205",
"zh:47adaba9c7915c832a9d8dfb5d0a18dd08b60fd7c531a810b2642ab75d200ee1",
"zh:551b580729cd82cc7a303d836985286e79a26062f02629bf51081ba2e4edf471",
"zh:5e5c5b1614cf0c61aa154543da1d5bda295a405fda52746d9193b0b8db922ddb",
"zh:65ebe76847129677f747364ee20591f01f5df4a67b06c5dff1bf53b813ec613a",
"zh:67db823f6016e345f2cbceb5300d0cce595bdeb0da32b15a1743724f0a4f978f",
"zh:75f119f674b3b0988133d38c1645e97cf6f0aee62a4131dfd62c8462636c2a94",
"zh:7ca3d6cfd4ccc2a9fb008ca93362c97a98f2ae98b55a56a7902fd33030d64179",
"zh:82033841c5a3fceecc1e3b84ef7328f027e2bb4bf63dfc24886510fed9d8a843",
"zh:890df766e9b839623b1f0437355032a3c006226a6c200cd911e15ee1a9014e9f",
"zh:9aee54de9fcce6ef4f6b4f4f394a5628690d7d4849b03cd996ff991f8b29433a",
"zh:cda3fd66138de23856f869549aa06c82ce1f899474bc133d29d8463bfa032b16",
"zh:e4f8a67b8d08702056073a5ac8928dbb991767a52d3f36c3726399df0b5f2b96",
]
}
+46 -82
View File
@@ -1,61 +1,26 @@
resource "sonarr_custom_format" "this" { resource "sonarr_custom_format" "this" {
for_each = var.custom_formats for_each = var.custom_formats
name = each.key name = each.key
include_custom_format_when_renaming = lookup(each.value, "include_custom_format_when_renaming", false) include_custom_format_when_renaming = lookup(each.value, "include_custom_format_when_renaming", false)
specifications = each.value.specifications
dynamic "specifications" {
for_each = each.value.specifications
content {
name = specifications.value.name
implementation = specifications.value.implementation
negate = lookup(specifications.value, "negate", false)
required = lookup(specifications.value, "required", false)
dynamic "fields" {
for_each = lookup(specifications.value, "fields", [])
content {
name = fields.value.name
value = tostring(lookup(fields.value, "value", ""))
}
}
}
}
} }
resource "sonarr_quality_profile" "this" { resource "sonarr_quality_profile" "this" {
for_each = var.quality_profiles for_each = var.quality_profiles
name = each.key name = each.key
upgrade_allowed = lookup(each.value, "upgrade_allowed", false) upgrade_allowed = lookup(each.value, "upgrade_allowed", false)
cutoff = each.value.cutoff cutoff = each.value.cutoff
cutoff_format_score = lookup(each.value, "cutoff_format_score", 0) cutoff_format_score = lookup(each.value, "cutoff_format_score", 0)
min_format_score = lookup(each.value, "min_format_score", 0) min_format_score = lookup(each.value, "min_format_score", 0)
quality_groups = each.value.quality_groups
dynamic "quality_groups" { format_items = [
for_each = each.value.quality_groups for fi in lookup(each.value, "format_items", []) : {
content { name = fi.name
id = quality_groups.value.id format = sonarr_custom_format.this[fi.format].id
name = lookup(quality_groups.value, "name", null) score = fi.score
dynamic "qualities" {
for_each = quality_groups.value.qualities
content {
id = qualities.value.id
name = qualities.value.name
source = qualities.value.source
resolution = qualities.value.resolution
}
}
} }
} ]
dynamic "format_items" {
for_each = lookup(each.value, "format_items", [])
content {
name = format_items.value.name
format = format_items.value.format
score = format_items.value.score
}
}
} }
resource "sonarr_download_client_nzbget" "this" { resource "sonarr_download_client_nzbget" "this" {
@@ -74,18 +39,17 @@ resource "sonarr_download_client_nzbget" "this" {
} }
resource "sonarr_indexer_newznab" "this" { resource "sonarr_indexer_newznab" "this" {
for_each = var.indexers for_each = var.indexers
name = each.key name = each.key
enable_automatic_search = lookup(each.value, "enable_automatic_search", true) enable_automatic_search = lookup(each.value, "enable_automatic_search", true)
enable_interactive_search = lookup(each.value, "enable_interactive_search", true) enable_interactive_search = lookup(each.value, "enable_interactive_search", true)
enable_rss = lookup(each.value, "enable_rss", true) enable_rss = lookup(each.value, "enable_rss", true)
priority = lookup(each.value, "priority", 25) priority = lookup(each.value, "priority", 25)
base_url = each.value.base_url base_url = each.value.base_url
api_path = lookup(each.value, "api_path", "/api") api_path = lookup(each.value, "api_path", "/api")
api_key = lookup(each.value, "api_key", "") api_key = lookup(each.value, "api_key", "")
categories = lookup(each.value, "categories", []) categories = lookup(each.value, "categories", [])
anime_categories = lookup(each.value, "anime_categories", []) anime_categories = lookup(each.value, "anime_categories", [])
season_search_maximum_single_episode_age = lookup(each.value, "season_search_maximum_single_episode_age", 0)
} }
resource "sonarr_notification_emby" "this" { resource "sonarr_notification_emby" "this" {
@@ -94,32 +58,32 @@ resource "sonarr_notification_emby" "this" {
host = each.value.host host = each.value.host
port = each.value.port port = each.value.port
use_ssl = lookup(each.value, "use_ssl", false) use_ssl = lookup(each.value, "use_ssl", false)
api_key = lookup(each.value, "api_key", "") api_key = each.value.api_key
notify = lookup(each.value, "notify", false) notify = lookup(each.value, "notify", false)
update_library = lookup(each.value, "update_library", true) update_library = lookup(each.value, "update_library", true)
on_grab = lookup(each.value, "on_grab", true) on_grab = lookup(each.value, "on_grab", true)
on_download = lookup(each.value, "on_download", true) on_download = lookup(each.value, "on_download", true)
on_upgrade = lookup(each.value, "on_upgrade", true) on_upgrade = lookup(each.value, "on_upgrade", true)
on_rename = lookup(each.value, "on_rename", true) on_rename = lookup(each.value, "on_rename", true)
on_series_add = lookup(each.value, "on_series_add", true) on_series_add = lookup(each.value, "on_series_add", true)
on_series_delete = lookup(each.value, "on_series_delete", true) on_series_delete = lookup(each.value, "on_series_delete", true)
on_episode_file_delete = lookup(each.value, "on_episode_file_delete", true) on_episode_file_delete = lookup(each.value, "on_episode_file_delete", true)
on_episode_file_delete_for_upgrade = lookup(each.value, "on_episode_file_delete_for_upgrade", true) on_episode_file_delete_for_upgrade = lookup(each.value, "on_episode_file_delete_for_upgrade", true)
on_application_update = lookup(each.value, "on_application_update", true) on_application_update = lookup(each.value, "on_application_update", true)
} }
resource "sonarr_delay_profile" "this" { resource "sonarr_delay_profile" "this" {
for_each = var.delay_profiles for_each = var.delay_profiles
enable_usenet = lookup(each.value, "enable_usenet", true) enable_usenet = lookup(each.value, "enable_usenet", true)
enable_torrent = lookup(each.value, "enable_torrent", true) enable_torrent = lookup(each.value, "enable_torrent", true)
preferred_protocol = lookup(each.value, "preferred_protocol", "usenet") preferred_protocol = lookup(each.value, "preferred_protocol", "usenet")
usenet_delay = lookup(each.value, "usenet_delay", 0) usenet_delay = lookup(each.value, "usenet_delay", 0)
torrent_delay = lookup(each.value, "torrent_delay", 0) torrent_delay = lookup(each.value, "torrent_delay", 0)
bypass_if_highest_quality = lookup(each.value, "bypass_if_highest_quality", true) bypass_if_highest_quality = lookup(each.value, "bypass_if_highest_quality", true)
bypass_if_above_custom_format_score = lookup(each.value, "bypass_if_above_custom_format_score", false) bypass_if_above_custom_format_score = lookup(each.value, "bypass_if_above_custom_format_score", false)
minimum_custom_format_score = lookup(each.value, "minimum_custom_format_score", 0) minimum_custom_format_score = lookup(each.value, "minimum_custom_format_score", 0)
tags = lookup(each.value, "tags", []) tags = each.value.tags
} }
resource "sonarr_root_folder" "this" { resource "sonarr_root_folder" "this" {