-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathplugin.json
More file actions
184 lines (184 loc) · 8.82 KB
/
Copy pathplugin.json
File metadata and controls
184 lines (184 loc) · 8.82 KB
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
{
"name": "VOD Merge",
"version": "1.3.0",
"description": "Durably merges duplicate VOD titles from providers that omit TMDB ids, by matching metadata like poster artwork and plot text to a title you already have. Works only with XC accounts.",
"author": "andyj682",
"help_url": "https://github.com/andyj682/dispatcharr_vod_merge",
"fields": [
{
"id": "dry_run",
"label": "Dry run (report only)",
"type": "boolean",
"default": true,
"help_text": "Report what would merge, but inject nothing. Best used on first setup: check 'Series merge status' and 'Movie merge status', then turn this off. NOT a pause switch once you have merged -- merges are re-derived on every VOD scan, so turning this back on and running a scan lets already-merged titles split apart again."
},
{
"id": "merge_series",
"label": "Merge series",
"type": "boolean",
"default": true,
"help_text": ""
},
{
"id": "merge_movies",
"label": "Merge movies",
"type": "boolean",
"default": false,
"help_text": ""
},
{
"id": "protect_merges",
"label": "Prevent destructive movie merges",
"type": "boolean",
"default": true,
"help_text": "Ensures duplicate movies are merged into established entries instead of the other way around, fixing an existing Dispatcharr bug. Applies even in \"dry run\" mode."
},
{
"id": "preserve_detail",
"label": "Preserve essential movie detail",
"type": "boolean",
"default": true,
"help_text": "Preserves TMDB id and video and audio details for a library item even if a provider returns less detail on one call than it did on the last. Dispatcharr's default allows empty data to overwrite existing data. A value the provider actually sent always wins -- this only refills what went missing. Applies even in \"dry run\" mode."
},
{
"id": "protect_prune",
"label": "Prevent catalogue deletion after an empty listing",
"type": "boolean",
"default": true,
"help_text": "Blocks Dispatcharr's post-scan cleanup when a provider returns an empty listing, which otherwise deletes that account's entire catalogue and every title only it supplies. Cleanup resumes on the next scan that sees content. Applies even in \"dry run\" mode."
},
{
"id": "allowed_accounts",
"label": "Limit series merging to accounts",
"type": "string",
"default": "",
"help_text": "Comma-separated M3U account names FROM which to merge series. Empty means every account."
},
{
"id": "movie_accounts",
"label": "Limit movie merging to accounts",
"type": "string",
"default": "",
"help_text": "Comma-separated M3U account names FROM which to merge movies, exactly parallel to the series setting above. Empty means every account."
},
{
"id": "tag_unique_movies",
"label": "Tag movies no other providers have",
"type": "boolean",
"default": false,
"help_text": "Inject a TMDB tag even for movies no other provider has, to reduce future churn and let later copies merge properly. Changes those movies' Dispatcharr ids now, and they revert if this is turned off."
},
{
"id": "scheduled_sweep",
"label": "Fetch movie details nightly",
"type": "boolean",
"default": false,
"help_text": "Run a nightly timer to sweep details for all movies without an existing merge signal. Use 'Movie merge status' to see the backlog size. To fetch details in smaller batches, use the manual sweep action and the 'Movie details per manual run' setting below."
},
{
"id": "sweep_hour",
"label": "Nightly sweep hour (0-23)",
"type": "number",
"default": 4,
"help_text": "Hour the nightly sweep runs, in Dispatcharr's configured system timezone. Put it before your VOD refresh so newly fetched detail is used by the next scan."
},
{
"id": "approved_matches",
"label": "Approve manually",
"type": "string",
"default": "",
"help_text": "Manually specify a TMDB ID for movies or series with no signal so that they can merge as necessary. Comma-separated list. Format is '<account>:<id>=<tmdb_id>' -- the id is the external series id for series, the stream id for movies. Overrides any derived matches, but never overrides 'Never merge'. See the README for how to find the ids."
},
{
"id": "denylist",
"label": "Never merge",
"type": "string",
"default": "",
"help_text": "Comma-separated escape hatch for a bad match. Either 'tmdb:<id>' (never merge anything INTO that title) or '<account>:<id>' (never merge that one provider entry) -- the id is the external series id for series, the stream id for movies. Overrides everything, including manual approvals. Read the ids off a preview or the log."
},
{
"id": "variant_pattern",
"label": "Variant edition pattern (regex)",
"type": "string",
"default": "\\[[^\\]]*(?:b\\s*&\\s*w|black\\s*/?\\s*white|colou?ri[sz]ed)[^\\]]*\\]",
"help_text": "Entries whose name matches are never merged, so an alternate edition stays its own library entry even when metadata signals match another title. Empty disables the check."
},
{
"id": "sweep_limit",
"label": "Movie details per manual run",
"type": "number",
"default": 50,
"help_text": "How many movie detail lookups 'Fetch movie details' does in one go. Only movies without any existing merge signal are swept. 0 means no limit. Does not apply to the nightly auto-run."
},
{
"id": "sweep_delay_ms",
"label": "Delay between detail calls (ms)",
"type": "number",
"default": 200,
"help_text": "Spacing between provider calls during the movie detail sweep, to stay friendly with provider rate limits. Worth raising before you enable a large new category, not after a rate-limit."
},
{
"id": "schedule_queue",
"label": "Schedule queue (advanced)",
"type": "string",
"default": "dvr",
"help_text": "Advanced: the Celery queue the nightly sweep is dispatched to. It must be served by a worker that loads plugins -- on a stock Dispatcharr that is the threads-pool 'dvr' worker, because the default prefork worker's consumer never imports plugins and rejects the task as unregistered. Change only if your worker layout differs."
},
{
"id": "index_ttl_seconds",
"label": "Index cache (seconds)",
"type": "number",
"default": 600,
"help_text": "How long the poster and plot indexes are reused within a worker before being rebuilt from the database. One VOD scan's batches all fall inside the default. Lower it only if you are debugging."
}
],
"actions": [
{
"id": "status",
"label": "Show status",
"description": "Report whether the wrapper is active in this worker, the settings in force, and both index sizes.",
"button_label": "Check status",
"button_variant": "outline"
},
{
"id": "preview",
"label": "Series merge status",
"description": "What would be merged for SERIES on the next scan, and by which signal. Read-only, no provider calls. The full list is written to series_status.json in the plugin's config folder.",
"button_label": "Series status",
"button_variant": "outline"
},
{
"id": "movie_status",
"label": "Movie merge status",
"description": "What would be merged for MOVIES on the next scan, plus how much of the detail backlog is left to sweep. Read-only, no provider calls. The full list is written to movie_status.json in the plugin's config folder.",
"button_label": "Movie status",
"button_variant": "outline"
},
{
"id": "sweep_movies",
"label": "Fetch movie details",
"description": "Look up provider detail for id-less movies and store it. Collects data only; merges nothing. Use 'Movie details per manual run' to adjust the number fetched each run. Resumable, so run it again to continue.",
"button_label": "Fetch details",
"button_variant": "filled"
},
{
"id": "list_log",
"label": "Show injection log",
"description": "List recorded merges and skipped variants. Also writes to injection_log.json in the plugin's config folder.",
"button_label": "Show log",
"button_variant": "outline"
},
{
"id": "clear_log",
"label": "Clear injection log",
"description": "Forget the recorded merge history. Does not undo any merge; entries reappear as the next scan re-derives them.",
"button_label": "Clear log",
"button_variant": "light",
"button_color": "red",
"confirm": {
"title": "Clear the injection log?",
"message": "This only clears the audit trail. Merges already made are unaffected and will be re-derived on the next scan."
}
}
]
}