-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtagarr_debug.sh
More file actions
executable file
·292 lines (248 loc) · 11.3 KB
/
tagarr_debug.sh
File metadata and controls
executable file
·292 lines (248 loc) · 11.3 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
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
#!/usr/bin/env bash
# -----------------------------------------------------------------------------
# Tagarr Debug — Radarr Connect Event Inspector
#
# Logs ALL environment variables and API data available during a Connect event.
# Install as a Radarr Connect handler alongside tagarr_import.sh to see exactly
# what data Radarr provides at the moment the event fires.
#
# Setup:
# Radarr > Settings > Connect > Custom Script
# Path: /scripts/tagarr_debug.sh
# Events: On Download, On Upgrade
#
# Output: /config/scripts/tagarr_debug.log (inside Radarr container)
# -----------------------------------------------------------------------------
SCRIPT_DIR=$(dirname "$(readlink -f "$0")")
LOG_FILE="${SCRIPT_DIR}/tagarr_debug.log"
# Radarr API config (same as import script)
RADARR_URL="http://192.168.86.22:7979"
RADARR_API_KEY="eaf913a9fc8542e3bf135881e98fb6a7"
RADARR_API="${RADARR_URL}/api/v3"
NOW=$(date '+%Y-%m-%d %H:%M:%S')
log() {
echo "[$NOW] $1" >> "$LOG_FILE"
}
divider() {
log "$(printf '=%.0s' {1..80})"
}
# Rotate log if > 1MB
if [ -f "$LOG_FILE" ] && [ "$(stat -f%z "$LOG_FILE" 2>/dev/null || stat -c%s "$LOG_FILE" 2>/dev/null)" -gt 1048576 ]; then
mv "$LOG_FILE" "${LOG_FILE}.old"
fi
divider
log "TAGARR DEBUG — Event captured at $NOW"
divider
########################################
# SECTION 1: ALL RADARR ENV VARIABLES
########################################
log ""
log "--- SECTION 1: RADARR ENVIRONMENT VARIABLES ---"
log ""
# Capture all radarr_* env vars (sorted)
env_count=0
while IFS= read -r line; do
log " $line"
env_count=$((env_count + 1))
done < <(env | grep -i '^radarr_' | sort)
log ""
log "Total radarr_* variables: $env_count"
# Highlight the key ones explicitly
log ""
log "--- KEY VARIABLES (explicit) ---"
log " radarr_eventtype = ${radarr_eventtype:-<not set>}"
log " radarr_movie_id = ${radarr_movie_id:-<not set>}"
log " radarr_movie_title = ${radarr_movie_title:-<not set>}"
log " radarr_movie_year = ${radarr_movie_year:-<not set>}"
log " radarr_movie_tmdbid = ${radarr_movie_tmdbid:-<not set>}"
log " radarr_moviefile_id = ${radarr_moviefile_id:-<not set>}"
log " radarr_moviefile_relativepath = ${radarr_moviefile_relativepath:-<not set>}"
log " radarr_moviefile_path = ${radarr_moviefile_path:-<not set>}"
log " radarr_moviefile_scenename = ${radarr_moviefile_scenename:-<not set>}"
log " radarr_moviefile_releasegroup = ${radarr_moviefile_releasegroup:-<not set>}"
log " radarr_release_releasegroup = ${radarr_release_releasegroup:-<not set>}"
log " radarr_release_title = ${radarr_release_title:-<not set>}"
log " radarr_release_quality = ${radarr_release_quality:-<not set>}"
log " radarr_release_indexer = ${radarr_release_indexer:-<not set>}"
log " radarr_download_id = ${radarr_download_id:-<not set>}"
log " radarr_download_client = ${radarr_download_client:-<not set>}"
log " radarr_isupgrade = ${radarr_isupgrade:-<not set>}"
log " radarr_deletedrelativepaths = ${radarr_deletedrelativepaths:-<not set>}"
log " radarr_deletedpaths = ${radarr_deletedpaths:-<not set>}"
MOVIE_ID="${radarr_movie_id:-0}"
if [ "$MOVIE_ID" = "0" ] || [ -z "$MOVIE_ID" ]; then
log ""
log "ERROR: No movie ID — cannot query API. Is this a Test event?"
divider
exit 0
fi
########################################
# SECTION 2: MOVIE API RESPONSE
########################################
log ""
log "--- SECTION 2: MOVIE API RESPONSE ---"
log ""
movie_json=$(curl -s "${RADARR_API}/movie/${MOVIE_ID}?apikey=${RADARR_API_KEY}")
if [ -n "$movie_json" ] && [ "$movie_json" != "null" ]; then
# Movie basics
log " title = $(echo "$movie_json" | jq -r '.title // "null"')"
log " year = $(echo "$movie_json" | jq -r '.year // "null"')"
log " tmdbId = $(echo "$movie_json" | jq -r '.tmdbId // "null"')"
log " hasFile = $(echo "$movie_json" | jq -r '.hasFile // "null"')"
# MovieFile details
log ""
log " --- movieFile ---"
log " movieFile.id = $(echo "$movie_json" | jq -r '.movieFile.id // "null"')"
log " movieFile.relativePath = $(echo "$movie_json" | jq -r '.movieFile.relativePath // "null"')"
log " movieFile.path = $(echo "$movie_json" | jq -r '.movieFile.path // "null"')"
log " movieFile.releaseGroup = $(echo "$movie_json" | jq -r '.movieFile.releaseGroup // "null"')"
log " movieFile.sceneName = $(echo "$movie_json" | jq -r '.movieFile.sceneName // "null"')"
log " movieFile.edition = $(echo "$movie_json" | jq -r '.movieFile.edition // "null"')"
log " movieFile.quality.name = $(echo "$movie_json" | jq -r '.movieFile.quality.quality.name // "null"')"
log " movieFile.quality.source = $(echo "$movie_json" | jq -r '.movieFile.quality.quality.source // "null"')"
log " movieFile.dateAdded = $(echo "$movie_json" | jq -r '.movieFile.dateAdded // "null"')"
log " movieFile.mediaInfo.audioCodec = $(echo "$movie_json" | jq -r '.movieFile.mediaInfo.audioCodec // "null"')"
MOVIEFILE_ID=$(echo "$movie_json" | jq -r '.movieFile.id // ""')
else
log " ERROR: Failed to fetch movie API response"
MOVIEFILE_ID=""
fi
########################################
# SECTION 3: MOVIEFILE API (direct)
########################################
if [ -n "$MOVIEFILE_ID" ] && [ "$MOVIEFILE_ID" != "null" ]; then
log ""
log "--- SECTION 3: MOVIEFILE API (direct fetch) ---"
log ""
moviefile_json=$(curl -s "${RADARR_API}/moviefile/${MOVIEFILE_ID}?apikey=${RADARR_API_KEY}")
if [ -n "$moviefile_json" ] && [ "$moviefile_json" != "null" ]; then
log " id = $(echo "$moviefile_json" | jq -r '.id // "null"')"
log " relativePath = $(echo "$moviefile_json" | jq -r '.relativePath // "null"')"
log " releaseGroup = $(echo "$moviefile_json" | jq -r '.releaseGroup // "null"')"
log " sceneName = $(echo "$moviefile_json" | jq -r '.sceneName // "null"')"
log " dateAdded = $(echo "$moviefile_json" | jq -r '.dateAdded // "null"')"
else
log " ERROR: Failed to fetch moviefile"
fi
fi
########################################
# SECTION 4: FULL HISTORY WITH TIMESTAMPS
########################################
log ""
log "--- SECTION 4: MOVIE HISTORY (all events, newest first) ---"
log ""
history_json=$(curl -s "${RADARR_API}/history/movie?movieId=${MOVIE_ID}&apikey=${RADARR_API_KEY}")
if [ -n "$history_json" ] && [ "$history_json" != "null" ] && [ "$history_json" != "[]" ]; then
event_count=$(echo "$history_json" | jq 'length')
log " Total history events: $event_count"
log ""
# Output each event with full detail
echo "$history_json" | jq -r '
sort_by(.date) | reverse | to_entries[] |
" [\(.key)] \(.value.date) \(.value.eventType)" +
"\n sourceTitle: \(.value.sourceTitle // "<none>")" +
"\n releaseGroup: \(.value.data.releaseGroup // "<none>")" +
"\n downloadId: \(.value.downloadId // "<none>")" +
"\n quality: \(.value.quality.quality.name // "<none>")" +
"\n droppedPath: \(.value.data.droppedPath // "<n/a>")" +
"\n importedPath: \(.value.data.importedPath // "<n/a>")" +
"\n reason: \(.value.data.reason // "<n/a>")" +
"\n message: \(.value.data.message // "<n/a>")" +
""
' | while IFS= read -r line; do
log "$line"
done
else
log " No history found"
fi
########################################
# SECTION 5: TIMING ANALYSIS
########################################
log ""
log "--- SECTION 5: TIMING ANALYSIS ---"
log ""
# Script execution time vs history event times
log " Script running at: $NOW (server local time)"
if [ -n "$history_json" ] && [ "$history_json" != "null" ] && [ "$history_json" != "[]" ]; then
# Show the newest 5 events with age relative to now
log ""
log " Newest events vs script execution:"
echo "$history_json" | jq -r '
sort_by(.date) | reverse | .[:5][] |
"\(.date) | \(.eventType) | rg=\(.data.releaseGroup // "<none>") | dl=\(.downloadId // "<none>")"
' | while IFS= read -r line; do
log " $line"
done
# Check: does the newest import have a matching grab with the same downloadId?
log ""
log " --- downloadId chain analysis ---"
newest_import_dlid=$(echo "$history_json" | jq -r '
sort_by(.date) | reverse |
[.[] | select(.eventType == "downloadFolderImported" or .eventType == "movieFileImported")] |
.[0].downloadId // "<none>"
')
log " Newest import downloadId: $newest_import_dlid"
if [ "$newest_import_dlid" != "<none>" ] && [ -n "$newest_import_dlid" ]; then
matching_grab=$(echo "$history_json" | jq -r --arg dlid "$newest_import_dlid" '
[.[] | select(.eventType == "grabbed" and .downloadId == $dlid)] |
.[0] // null |
if . == null then "<no matching grab>"
else "date=\(.date) rg=\(.data.releaseGroup // "<none>") src=\(.sourceTitle // "<none>")"
end
')
log " Matching grab: $matching_grab"
fi
# Also check: what does the env var downloadId match?
env_dlid="${radarr_download_id:-}"
if [ -n "$env_dlid" ]; then
log ""
log " --- env var download_id chain ---"
log " radarr_download_id: $env_dlid"
env_grab=$(echo "$history_json" | jq -r --arg dlid "$env_dlid" '
[.[] | select(.eventType == "grabbed" and .downloadId == $dlid)] |
.[0] // null |
if . == null then "<no matching grab>"
else "date=\(.date) rg=\(.data.releaseGroup // "<none>") src=\(.sourceTitle // "<none>")"
end
')
log " Matching grab: $env_grab"
else
log ""
log " radarr_download_id: <not set>"
fi
fi
########################################
# SECTION 6: WHAT IMPORT SCRIPT WOULD DO
########################################
log ""
log "--- SECTION 6: IMPORT SCRIPT DECISION SIMULATION ---"
log ""
api_rg=$(echo "$movie_json" | jq -r '.movieFile.releaseGroup // ""' 2>/dev/null)
event_rg="${radarr_release_releasegroup:-}"
file_rg="${radarr_moviefile_releasegroup:-}"
log " Source priority:"
log " 1. radarr_release_releasegroup (event var): '${event_rg:-<empty>}'"
log " 2. radarr_moviefile_releasegroup (file var): '${file_rg:-<empty>}'"
log " 3. movieFile.releaseGroup (API): '${api_rg:-<empty>}'"
if [ -n "$event_rg" ] && [ "$event_rg" != "null" ]; then
log ""
log " -> Event var available: '$event_rg'"
if [ -z "$api_rg" ] || [ "$api_rg" = "Unknown" ] || [ "$api_rg" = "null" ]; then
log " -> API has empty/Unknown -> import script WOULD use event var and patch"
else
log " -> API already has '$api_rg' -> import script would use API value (no recover)"
fi
else
log ""
log " -> Event var is EMPTY"
if [ -z "$api_rg" ] || [ "$api_rg" = "Unknown" ] || [ "$api_rg" = "null" ]; then
log " -> API also empty/Unknown -> RECOVER FROM HISTORY would trigger"
log " !! This is where the wrong release group gets picked up"
else
log " -> API has '$api_rg' -> no recover needed"
fi
fi
divider
log "END OF DEBUG CAPTURE"
divider
log ""