diff --git a/.gitignore b/.gitignore
index d172095..a2672ab 100644
--- a/.gitignore
+++ b/.gitignore
@@ -165,3 +165,6 @@ src/.idea/
# Ignore Jetbrains IntelliJ Workspace Directories
.idea/
+
+**/logs/
+**/MediaCover/
\ No newline at end of file
diff --git a/code/test/data/lidarr/config/asp/key-73140dfd-12c2-49d9-93d6-94dd1f0bc538.xml b/code/test/data/lidarr/config/asp/key-73140dfd-12c2-49d9-93d6-94dd1f0bc538.xml
new file mode 100644
index 0000000..dee749d
--- /dev/null
+++ b/code/test/data/lidarr/config/asp/key-73140dfd-12c2-49d9-93d6-94dd1f0bc538.xml
@@ -0,0 +1,16 @@
+
+
+ 2024-11-12T08:27:40.5991235Z
+ 2024-11-12T08:27:40.5870855Z
+ 2025-02-10T08:27:40.5870855Z
+
+
+
+
+
+
+ FJN9+ak89dkr+ZPZD/LymeCCwH/UI3kNdaMqxSnY6G8bui1yNjGtLpQQOJJlTOAdAyZvHUyPUvv99F70uZF7qg==
+
+
+
+
\ No newline at end of file
diff --git a/code/test/data/lidarr/config/lidarr.db b/code/test/data/lidarr/config/lidarr.db
new file mode 100644
index 0000000..198d8e5
Binary files /dev/null and b/code/test/data/lidarr/config/lidarr.db differ
diff --git a/code/test/data/lidarr/config/lidarr.pid b/code/test/data/lidarr/config/lidarr.pid
new file mode 100644
index 0000000..bc768da
--- /dev/null
+++ b/code/test/data/lidarr/config/lidarr.pid
@@ -0,0 +1 @@
+146
\ No newline at end of file
diff --git a/code/test/data/lidarr/config/logs.db b/code/test/data/lidarr/config/logs.db
new file mode 100644
index 0000000..cf4a911
Binary files /dev/null and b/code/test/data/lidarr/config/logs.db differ
diff --git a/code/test/data/lidarr/config/logs.db-shm b/code/test/data/lidarr/config/logs.db-shm
new file mode 100644
index 0000000..691b815
Binary files /dev/null and b/code/test/data/lidarr/config/logs.db-shm differ
diff --git a/code/test/data/lidarr/config/logs.db-wal b/code/test/data/lidarr/config/logs.db-wal
new file mode 100644
index 0000000..f7a5c5a
Binary files /dev/null and b/code/test/data/lidarr/config/logs.db-wal differ
diff --git a/code/test/data/nginx/radarr_bad.torrent b/code/test/data/nginx/radarr_bad.torrent
new file mode 100644
index 0000000..5d27c09
--- /dev/null
+++ b/code/test/data/nginx/radarr_bad.torrent
@@ -0,0 +1 @@
+d8:announce28:http://tracker:6969/announce10:created by26:Enhanced-CTorrent/dnh3.3.213:creation datei1731398141e4:infod6:lengthi4e4:name68:Speak.No.Evil.2024.2160p.MA.WEB-DL.DDP5.1.Atmos.H.265-HHWEB.mkv.zipx12:piece lengthi262144e6:pieces20:J̱Lsӑ釘/ee
\ No newline at end of file
diff --git a/code/test/data/nginx/radarr_bad.xml b/code/test/data/nginx/radarr_bad.xml
new file mode 100644
index 0000000..c484f90
--- /dev/null
+++ b/code/test/data/nginx/radarr_bad.xml
@@ -0,0 +1,25 @@
+
+
+ Test feed
+ http://nginx/custom/radarr_bad.xml
+
+ Test
+
+ en-CA
+ Test
+ Tue, 5 Nov 2024 22:02:13 -0400
+ Tue, 5 Nov 2024 22:02:13 -0400
+ https://validator.w3.org/feed/docs/rss2.html
+ 30
+ -
+ Speak.No.Evil.2024.2160p.MA.WEB-DL.DDP5.1.Atmos.H.265-HHWEB
+ Test
+ 4138858110
+ http://nginx/custom/radarr_bad.torrent
+
+ 174674a88c8947f6f9057ac3f81efde384ed216cade43564ec450f2cb4677554
+
+ Sat, 24 Sep 2022 22:02:13 -0300
+
+
+
\ No newline at end of file
diff --git a/code/test/data/nginx/sonarr_bad.torrent b/code/test/data/nginx/sonarr_bad.torrent
new file mode 100644
index 0000000..a8f6a95
--- /dev/null
+++ b/code/test/data/nginx/sonarr_bad.torrent
@@ -0,0 +1 @@
+d8:announce28:http://tracker:6969/announce10:created by26:Enhanced-CTorrent/dnh3.3.213:creation datei1731357387e4:infod6:lengthi5e4:name93:Agatha.All.Along.S01E01.Seekest.Thou.the.Road.2160p.APPS.WEB-DL.DDP5.1.Atmos.H.265-VARYG.zipx12:piece lengthi262144e6:pieces20:NC"nvºee
\ No newline at end of file
diff --git a/code/test/data/nginx/sonarr_bad.xml b/code/test/data/nginx/sonarr_bad.xml
new file mode 100644
index 0000000..7485927
--- /dev/null
+++ b/code/test/data/nginx/sonarr_bad.xml
@@ -0,0 +1,25 @@
+
+
+ Test feed
+ http://nginx/custom/sonarr_bad.xml
+
+ Test
+
+ en-CA
+ Test
+ Tue, 5 Nov 2024 22:02:13 -0400
+ Tue, 5 Nov 2024 22:02:13 -0400
+ https://validator.w3.org/feed/docs/rss2.html
+ 30
+ -
+ Agatha.All.Along.S01E01.Seekest.Thou.the.Road.2160p.APPS.WEB-DL.DDP5.1.Atmos.H.265-VARYG
+ Test
+ 4138858110
+ http://nginx/custom/sonarr_bad.torrent
+
+ 174674a88c8947f6f9057ac3f81efde384ed216cade43564ec450f2cb4677554
+
+ Sat, 24 Sep 2022 22:02:13 -0300
+
+
+
\ No newline at end of file
diff --git a/code/test/data/qbittorrent-bad/config/.bash_history b/code/test/data/qbittorrent-bad/config/.bash_history
new file mode 100644
index 0000000..84e7495
--- /dev/null
+++ b/code/test/data/qbittorrent-bad/config/.bash_history
@@ -0,0 +1,28 @@
+apt install ctorrent
+apt-get
+yum
+apk
+apk search ctorrent
+apk add ctorrent
+apk update
+apk add ctorrent
+exit
+apt
+apk
+apk update
+apk search ctorrent
+apk add ctorrent
+apk install apt
+apk add ctorrent-dnh
+apk search ctorrent
+apk search torrent
+apk search transmission
+apk install transmission-cli
+apk add transmission-cli
+transmission-create -o bad.torrent -t http://tracker:6969/announce /downloads/Agatha.All.Along.S01E01.Seekest.Thou.the.Road.2160p.APPS.WEB-DL.DDP5.1.Atmos.H.265-VARYG.mkv.zipx
+transmission-cli
+apk add transmission-create
+transmission-create
+apk add transmission
+transmission-create -o bad.torrent -t http://tracker:6969/announce /downloads/Agatha.All.Along.S01E01.Seekest.Thou.the.Road.2160p.APPS.WEB-DL.DDP5.1.Atmos.H.265-VARYG.mkv.zipx
+exit
diff --git a/code/test/data/qbittorrent-bad/config/qBittorrent/BT_backup/62a60318cd50e0597689d950627ecd971c33e6a8.fastresume b/code/test/data/qbittorrent-bad/config/qBittorrent/BT_backup/62a60318cd50e0597689d950627ecd971c33e6a8.fastresume
new file mode 100644
index 0000000..d043491
Binary files /dev/null and b/code/test/data/qbittorrent-bad/config/qBittorrent/BT_backup/62a60318cd50e0597689d950627ecd971c33e6a8.fastresume differ
diff --git a/code/test/data/qbittorrent-bad/config/qBittorrent/BT_backup/62a60318cd50e0597689d950627ecd971c33e6a8.torrent b/code/test/data/qbittorrent-bad/config/qBittorrent/BT_backup/62a60318cd50e0597689d950627ecd971c33e6a8.torrent
new file mode 100644
index 0000000..bcd0021
--- /dev/null
+++ b/code/test/data/qbittorrent-bad/config/qBittorrent/BT_backup/62a60318cd50e0597689d950627ecd971c33e6a8.torrent
@@ -0,0 +1 @@
+d10:created by26:Enhanced-CTorrent/dnh3.3.213:creation datei1731357387e4:infod6:lengthi5e4:name93:Agatha.All.Along.S01E01.Seekest.Thou.the.Road.2160p.APPS.WEB-DL.DDP5.1.Atmos.H.265-VARYG.zipx12:piece lengthi262144e6:pieces20:NC"nvºee
\ No newline at end of file
diff --git a/code/test/data/qbittorrent-bad/config/qBittorrent/BT_backup/c132c8bf59f25af11cf00c08ab61476fbc72b2c6.fastresume b/code/test/data/qbittorrent-bad/config/qBittorrent/BT_backup/c132c8bf59f25af11cf00c08ab61476fbc72b2c6.fastresume
new file mode 100644
index 0000000..7b22a71
Binary files /dev/null and b/code/test/data/qbittorrent-bad/config/qBittorrent/BT_backup/c132c8bf59f25af11cf00c08ab61476fbc72b2c6.fastresume differ
diff --git a/code/test/data/qbittorrent-bad/config/qBittorrent/BT_backup/c132c8bf59f25af11cf00c08ab61476fbc72b2c6.torrent b/code/test/data/qbittorrent-bad/config/qBittorrent/BT_backup/c132c8bf59f25af11cf00c08ab61476fbc72b2c6.torrent
new file mode 100644
index 0000000..d187333
--- /dev/null
+++ b/code/test/data/qbittorrent-bad/config/qBittorrent/BT_backup/c132c8bf59f25af11cf00c08ab61476fbc72b2c6.torrent
@@ -0,0 +1 @@
+d10:created by26:Enhanced-CTorrent/dnh3.3.213:creation datei1731398141e4:infod6:lengthi4e4:name68:Speak.No.Evil.2024.2160p.MA.WEB-DL.DDP5.1.Atmos.H.265-HHWEB.mkv.zipx12:piece lengthi262144e6:pieces20:J̱Lsӑ釘/ee
\ No newline at end of file
diff --git a/code/test/data/qbittorrent-bad/config/qBittorrent/BT_backup/queue b/code/test/data/qbittorrent-bad/config/qBittorrent/BT_backup/queue
new file mode 100644
index 0000000..58d02b1
--- /dev/null
+++ b/code/test/data/qbittorrent-bad/config/qBittorrent/BT_backup/queue
@@ -0,0 +1 @@
+c132c8bf59f25af11cf00c08ab61476fbc72b2c6
diff --git a/code/test/data/qbittorrent-bad/config/qBittorrent/GeoDB/dbip-country-lite.mmdb b/code/test/data/qbittorrent-bad/config/qBittorrent/GeoDB/dbip-country-lite.mmdb
new file mode 100644
index 0000000..5e65de0
Binary files /dev/null and b/code/test/data/qbittorrent-bad/config/qBittorrent/GeoDB/dbip-country-lite.mmdb differ
diff --git a/code/test/data/qbittorrent-bad/config/qBittorrent/categories.json b/code/test/data/qbittorrent-bad/config/qBittorrent/categories.json
new file mode 100644
index 0000000..2c63c08
--- /dev/null
+++ b/code/test/data/qbittorrent-bad/config/qBittorrent/categories.json
@@ -0,0 +1,2 @@
+{
+}
diff --git a/code/test/data/qbittorrent-bad/config/qBittorrent/qBittorrent-data.conf b/code/test/data/qbittorrent-bad/config/qBittorrent/qBittorrent-data.conf
new file mode 100644
index 0000000..5f2cb62
--- /dev/null
+++ b/code/test/data/qbittorrent-bad/config/qBittorrent/qBittorrent-data.conf
@@ -0,0 +1,2 @@
+[Stats]
+AllStats=@Variant(\0\0\0\x1c\0\0\0\x2\0\0\0\x12\0\x41\0l\0l\0t\0i\0m\0\x65\0\x44\0L\0\0\0\x4\0\0\0\0\0\x3\xae\x61\0\0\0\x12\0\x41\0l\0l\0t\0i\0m\0\x65\0U\0L\0\0\0\x4\0\0\0\0\0\x5?%)
diff --git a/code/test/data/qbittorrent-bad/config/qBittorrent/qBittorrent.conf b/code/test/data/qbittorrent-bad/config/qBittorrent/qBittorrent.conf
new file mode 100644
index 0000000..d2c44ba
--- /dev/null
+++ b/code/test/data/qbittorrent-bad/config/qBittorrent/qBittorrent.conf
@@ -0,0 +1,56 @@
+[Application]
+FileLogger\Age=1
+FileLogger\AgeType=1
+FileLogger\Backup=true
+FileLogger\DeleteOld=true
+FileLogger\Enabled=true
+FileLogger\MaxSizeBytes=66560
+FileLogger\Path=/config/qBittorrent/logs
+
+[AutoRun]
+enabled=false
+program=
+
+[BitTorrent]
+Session\AddTorrentStopped=false
+Session\DefaultSavePath=/downloads/
+Session\ExcludedFileNames=
+Session\Port=6881
+Session\QueueingSystemEnabled=true
+Session\SSL\Port=65325
+Session\ShareLimitAction=Stop
+Session\TempPath=/downloads/incomplete/
+
+[Core]
+AutoDeleteAddedTorrentFile=Never
+
+[LegalNotice]
+Accepted=true
+
+[Meta]
+MigrationVersion=6
+
+[Network]
+Cookies=@Invalid()
+PortForwardingEnabled=false
+Proxy\HostnameLookupEnabled=false
+Proxy\Profiles\BitTorrent=true
+Proxy\Profiles\Misc=true
+Proxy\Profiles\RSS=true
+
+[Preferences]
+Connection\PortRangeMin=6881
+Connection\UPnP=false
+Downloads\SavePath=/downloads/
+Downloads\TempPath=/downloads/incomplete/
+General\Locale=en
+MailNotification\req_auth=true
+WebUI\Address=*
+WebUI\Password_PBKDF2="@ByteArray(Y5qTn9Ckjd9EGunzNdr3fg==:i+l/UB3dqYrL5SbdbCjPcPUCehLb/w1nXr3oM7PgJI3d3KTISz0rWGS29mURaBC9kfuMrG3WEhR/kM2ykvcn3Q==)"
+WebUI\Port=8081
+WebUI\ServerDomains=*
+WebUI\Username=test
+
+[RSS]
+AutoDownloader\DownloadRepacks=true
+AutoDownloader\SmartEpisodeFilter=s(\\d+)e(\\d+), (\\d+)x(\\d+), "(\\d{4}[.\\-]\\d{1,2}[.\\-]\\d{1,2})", "(\\d{1,2}[.\\-]\\d{1,2}[.\\-]\\d{4})"
diff --git a/code/test/data/qbittorrent-bad/config/qBittorrent/rss/feeds.json b/code/test/data/qbittorrent-bad/config/qBittorrent/rss/feeds.json
new file mode 100644
index 0000000..2c63c08
--- /dev/null
+++ b/code/test/data/qbittorrent-bad/config/qBittorrent/rss/feeds.json
@@ -0,0 +1,2 @@
+{
+}
diff --git a/code/test/data/qbittorrent-bad/config/qBittorrent/watched_folders.json b/code/test/data/qbittorrent-bad/config/qBittorrent/watched_folders.json
new file mode 100644
index 0000000..2c63c08
--- /dev/null
+++ b/code/test/data/qbittorrent-bad/config/qBittorrent/watched_folders.json
@@ -0,0 +1,2 @@
+{
+}
diff --git a/code/test/data/qbittorrent-bad/downloads/Agatha.All.Along.S01E01.Seekest.Thou.the.Road.2160p.APPS.WEB-DL.DDP5.1.Atmos.H.265-VARYG.zipx b/code/test/data/qbittorrent-bad/downloads/Agatha.All.Along.S01E01.Seekest.Thou.the.Road.2160p.APPS.WEB-DL.DDP5.1.Atmos.H.265-VARYG.zipx
new file mode 100644
index 0000000..9daeafb
--- /dev/null
+++ b/code/test/data/qbittorrent-bad/downloads/Agatha.All.Along.S01E01.Seekest.Thou.the.Road.2160p.APPS.WEB-DL.DDP5.1.Atmos.H.265-VARYG.zipx
@@ -0,0 +1 @@
+test
diff --git a/code/test/data/qbittorrent-bad/downloads/Speak.No.Evil.2024.2160p.MA.WEB-DL.DDP5.1.Atmos.H.265-HHWEB.mkv.zipx b/code/test/data/qbittorrent-bad/downloads/Speak.No.Evil.2024.2160p.MA.WEB-DL.DDP5.1.Atmos.H.265-HHWEB.mkv.zipx
new file mode 100644
index 0000000..30d74d2
--- /dev/null
+++ b/code/test/data/qbittorrent-bad/downloads/Speak.No.Evil.2024.2160p.MA.WEB-DL.DDP5.1.Atmos.H.265-HHWEB.mkv.zipx
@@ -0,0 +1 @@
+test
\ No newline at end of file
diff --git a/code/test/data/qbittorrent-bad/downloads/radarr_bad.torrent b/code/test/data/qbittorrent-bad/downloads/radarr_bad.torrent
new file mode 100644
index 0000000..5d27c09
--- /dev/null
+++ b/code/test/data/qbittorrent-bad/downloads/radarr_bad.torrent
@@ -0,0 +1 @@
+d8:announce28:http://tracker:6969/announce10:created by26:Enhanced-CTorrent/dnh3.3.213:creation datei1731398141e4:infod6:lengthi4e4:name68:Speak.No.Evil.2024.2160p.MA.WEB-DL.DDP5.1.Atmos.H.265-HHWEB.mkv.zipx12:piece lengthi262144e6:pieces20:J̱Lsӑ釘/ee
\ No newline at end of file
diff --git a/code/test/data/qbittorrent-bad/downloads/sonarr_bad.torrent b/code/test/data/qbittorrent-bad/downloads/sonarr_bad.torrent
new file mode 100644
index 0000000..a8f6a95
--- /dev/null
+++ b/code/test/data/qbittorrent-bad/downloads/sonarr_bad.torrent
@@ -0,0 +1 @@
+d8:announce28:http://tracker:6969/announce10:created by26:Enhanced-CTorrent/dnh3.3.213:creation datei1731357387e4:infod6:lengthi5e4:name93:Agatha.All.Along.S01E01.Seekest.Thou.the.Road.2160p.APPS.WEB-DL.DDP5.1.Atmos.H.265-VARYG.zipx12:piece lengthi262144e6:pieces20:NC"nvºee
\ No newline at end of file
diff --git a/code/test/data/qbittorrent/config/.ash_history b/code/test/data/qbittorrent/config/.ash_history
new file mode 100644
index 0000000..88f13da
--- /dev/null
+++ b/code/test/data/qbittorrent/config/.ash_history
@@ -0,0 +1,7 @@
+wget http://nginx:8082/bad.torrent
+wget http://nginx:80
+wget http://nginx:80/bad.torrent
+wget http://nginx:80/bad.rss
+wget http://nginx:80/custom/bad.rss
+cat bad.rss
+exit
diff --git a/code/test/data/qbittorrent/config/qBittorrent/BT_backup/queue b/code/test/data/qbittorrent/config/qBittorrent/BT_backup/queue
new file mode 100644
index 0000000..e69de29
diff --git a/code/test/data/qbittorrent/config/qBittorrent/GeoDB/dbip-country-lite.mmdb b/code/test/data/qbittorrent/config/qBittorrent/GeoDB/dbip-country-lite.mmdb
new file mode 100644
index 0000000..5e65de0
Binary files /dev/null and b/code/test/data/qbittorrent/config/qBittorrent/GeoDB/dbip-country-lite.mmdb differ
diff --git a/code/test/data/qbittorrent/config/qBittorrent/categories.json b/code/test/data/qbittorrent/config/qBittorrent/categories.json
new file mode 100644
index 0000000..19e2935
--- /dev/null
+++ b/code/test/data/qbittorrent/config/qBittorrent/categories.json
@@ -0,0 +1,8 @@
+{
+ "radarr": {
+ "save_path": ""
+ },
+ "tv-sonarr": {
+ "save_path": ""
+ }
+}
diff --git a/code/test/data/qbittorrent/config/qBittorrent/qBittorrent-data.conf b/code/test/data/qbittorrent/config/qBittorrent/qBittorrent-data.conf
new file mode 100644
index 0000000..9a2e9da
--- /dev/null
+++ b/code/test/data/qbittorrent/config/qBittorrent/qBittorrent-data.conf
@@ -0,0 +1,2 @@
+[Stats]
+AllStats=@Variant(\0\0\0\x1c\0\0\0\x2\0\0\0\x12\0\x41\0l\0l\0t\0i\0m\0\x65\0\x44\0L\0\0\0\x4\0\0\0\0\0\x6\xe4\xdd\0\0\0\x12\0\x41\0l\0l\0t\0i\0m\0\x65\0U\0L\0\0\0\x4\0\0\0\0\0\b\xc3\xde)
diff --git a/code/test/data/qbittorrent/config/qBittorrent/qBittorrent.conf b/code/test/data/qbittorrent/config/qBittorrent/qBittorrent.conf
new file mode 100644
index 0000000..3393d25
--- /dev/null
+++ b/code/test/data/qbittorrent/config/qBittorrent/qBittorrent.conf
@@ -0,0 +1,56 @@
+[Application]
+FileLogger\Age=1
+FileLogger\AgeType=1
+FileLogger\Backup=true
+FileLogger\DeleteOld=true
+FileLogger\Enabled=true
+FileLogger\MaxSizeBytes=66560
+FileLogger\Path=/config/qBittorrent/logs
+
+[AutoRun]
+enabled=false
+program=
+
+[BitTorrent]
+ExcludedFileNamesEnabled=true
+Session\AddTorrentStopped=false
+Session\DefaultSavePath=/downloads/
+Session\ExcludedFileNames=*.apk, *.bat, *.bin, *.bmp, *.cmd, *.com, *.db, *.diz, *.dll, *.dmg, *.etc, *.exe, *.gif, *.htm, *.html, *.ico, *.ini, *.iso, *.jar, *.jpg, *.js, *.link, *.lnk, *.msi, *.nfo, *.perl, *.php, *.pl, *.png, *.ps1, *.psc1, *.psd1, *.psm1, *.py, *.pyd, *.rb, *.readme, *.reg, *.run, *.scr, *.sh, *.sql, *.text, *.thumb, *.torrent, *.txt, *.url, *.vbs, *.wsf, *.xml, *.zipx, *.7z, *.bdjo, *.bdmv, *.bin, *.bmp, *.cci, *.clpi, *.crt, *.dll, *.exe, *.html, *.idx, *.inf, *.jar, *.jpeg, *.jpg, *.lnk, *.m4a, *.mpls, *.msi, *.nfo, *.pdf, *.png, *.rar, *(sample).*, *sample.mkv, *sample.mp4, *.sfv, *.srt, *.sub, *.tbl, Trailer.*, *.txt, *.url, *.xig, *.xml, *.xrt, *.zip, *.zipx, *.Lnk
+Session\Port=6881
+Session\QueueingSystemEnabled=true
+Session\SSL\Port=15561
+Session\ShareLimitAction=Stop
+Session\TempPath=/downloads/incomplete/
+
+[Core]
+AutoDeleteAddedTorrentFile=Never
+
+[LegalNotice]
+Accepted=true
+
+[Meta]
+MigrationVersion=6
+
+[Network]
+Cookies=@Invalid()
+PortForwardingEnabled=false
+Proxy\HostnameLookupEnabled=false
+Proxy\Profiles\BitTorrent=true
+Proxy\Profiles\Misc=true
+Proxy\Profiles\RSS=true
+
+[Preferences]
+Connection\PortRangeMin=6881
+Connection\UPnP=false
+Downloads\SavePath=/downloads/
+Downloads\TempPath=/downloads/incomplete/
+General\Locale=en
+MailNotification\req_auth=true
+WebUI\Address=*
+WebUI\Password_PBKDF2="@ByteArray(yhRK9ENcAXgJ5b0HJ1ASwg==:ucqSEDxil3NqJlug8G4PjBXAz37Azo42jx8Vh3RtNkCYEK4RgjRmMeiUaIN9k4Pqxi7D1aBBVFOQ9vQJZMfUIQ==)"
+WebUI\ServerDomains=*
+WebUI\Username=test
+
+[RSS]
+AutoDownloader\DownloadRepacks=true
+AutoDownloader\SmartEpisodeFilter=s(\\d+)e(\\d+), (\\d+)x(\\d+), "(\\d{4}[.\\-]\\d{1,2}[.\\-]\\d{1,2})", "(\\d{1,2}[.\\-]\\d{1,2}[.\\-]\\d{4})"
diff --git a/code/test/data/qbittorrent/config/qBittorrent/rss/feeds.json b/code/test/data/qbittorrent/config/qBittorrent/rss/feeds.json
new file mode 100644
index 0000000..2c63c08
--- /dev/null
+++ b/code/test/data/qbittorrent/config/qBittorrent/rss/feeds.json
@@ -0,0 +1,2 @@
+{
+}
diff --git a/code/test/data/qbittorrent/config/qBittorrent/watched_folders.json b/code/test/data/qbittorrent/config/qBittorrent/watched_folders.json
new file mode 100644
index 0000000..2c63c08
--- /dev/null
+++ b/code/test/data/qbittorrent/config/qBittorrent/watched_folders.json
@@ -0,0 +1,2 @@
+{
+}
diff --git a/code/test/data/radarr/config/Sentry/E052B02F117E6BB423BE301CDA607148F4B3F8F6/.installation b/code/test/data/radarr/config/Sentry/E052B02F117E6BB423BE301CDA607148F4B3F8F6/.installation
new file mode 100644
index 0000000..65b5fcb
--- /dev/null
+++ b/code/test/data/radarr/config/Sentry/E052B02F117E6BB423BE301CDA607148F4B3F8F6/.installation
@@ -0,0 +1 @@
+92eba3c5-a8d0-44d5-836d-25bc4aa81a85
\ No newline at end of file
diff --git a/code/test/data/radarr/config/asp/key-729140b3-0296-4e14-8afa-60275fd797ca.xml b/code/test/data/radarr/config/asp/key-729140b3-0296-4e14-8afa-60275fd797ca.xml
new file mode 100644
index 0000000..627eafa
--- /dev/null
+++ b/code/test/data/radarr/config/asp/key-729140b3-0296-4e14-8afa-60275fd797ca.xml
@@ -0,0 +1,16 @@
+
+
+ 2024-11-12T08:27:39.8894479Z
+ 2024-11-12T08:27:39.879535Z
+ 2025-02-10T08:27:39.879535Z
+
+
+
+
+
+
+ aq0fbIABPzsLl4bnZllVq2NhmsOrjc5zPeiGbBSTc5DMPm8n5C86DzCTPX0HJtZFUgaVoc+3qjFQJ4UB0J31rA==
+
+
+
+
\ No newline at end of file
diff --git a/code/test/data/radarr/config/logs.db b/code/test/data/radarr/config/logs.db
new file mode 100644
index 0000000..4295d29
Binary files /dev/null and b/code/test/data/radarr/config/logs.db differ
diff --git a/code/test/data/radarr/config/logs.db-shm b/code/test/data/radarr/config/logs.db-shm
new file mode 100644
index 0000000..572e6c9
Binary files /dev/null and b/code/test/data/radarr/config/logs.db-shm differ
diff --git a/code/test/data/radarr/config/logs.db-wal b/code/test/data/radarr/config/logs.db-wal
new file mode 100644
index 0000000..3c247e0
Binary files /dev/null and b/code/test/data/radarr/config/logs.db-wal differ
diff --git a/code/test/data/radarr/config/radarr.db b/code/test/data/radarr/config/radarr.db
new file mode 100644
index 0000000..9f94391
Binary files /dev/null and b/code/test/data/radarr/config/radarr.db differ
diff --git a/code/test/data/radarr/config/radarr.pid b/code/test/data/radarr/config/radarr.pid
new file mode 100644
index 0000000..aca544d
--- /dev/null
+++ b/code/test/data/radarr/config/radarr.pid
@@ -0,0 +1 @@
+145
\ No newline at end of file
diff --git a/code/test/data/readarr/config/asp/key-7e009a79-6fb8-4487-a701-c71768df1f34.xml b/code/test/data/readarr/config/asp/key-7e009a79-6fb8-4487-a701-c71768df1f34.xml
new file mode 100644
index 0000000..3a89c0d
--- /dev/null
+++ b/code/test/data/readarr/config/asp/key-7e009a79-6fb8-4487-a701-c71768df1f34.xml
@@ -0,0 +1,16 @@
+
+
+ 2024-11-12T08:29:09.621896Z
+ 2024-11-12T08:29:09.6125365Z
+ 2025-02-10T08:29:09.6125365Z
+
+
+
+
+
+
+ 4XVtakA4x+z0lkubqw0sO0dANs6WlDqehgdJUaaf0W9u/lIIq404B1HhVEs+fOpiBuyJDBpjbauLC9KlAfj8NA==
+
+
+
+
\ No newline at end of file
diff --git a/code/test/data/readarr/config/cache.db b/code/test/data/readarr/config/cache.db
new file mode 100644
index 0000000..e055db8
Binary files /dev/null and b/code/test/data/readarr/config/cache.db differ
diff --git a/code/test/data/readarr/config/logs.db b/code/test/data/readarr/config/logs.db
new file mode 100644
index 0000000..ea25ff0
Binary files /dev/null and b/code/test/data/readarr/config/logs.db differ
diff --git a/code/test/data/readarr/config/logs.db-shm b/code/test/data/readarr/config/logs.db-shm
new file mode 100644
index 0000000..41cbb47
Binary files /dev/null and b/code/test/data/readarr/config/logs.db-shm differ
diff --git a/code/test/data/readarr/config/logs.db-wal b/code/test/data/readarr/config/logs.db-wal
new file mode 100644
index 0000000..2360a6a
Binary files /dev/null and b/code/test/data/readarr/config/logs.db-wal differ
diff --git a/code/test/data/readarr/config/readarr.db b/code/test/data/readarr/config/readarr.db
new file mode 100644
index 0000000..45c5b98
Binary files /dev/null and b/code/test/data/readarr/config/readarr.db differ
diff --git a/code/test/data/readarr/config/readarr.pid b/code/test/data/readarr/config/readarr.pid
new file mode 100644
index 0000000..aca544d
--- /dev/null
+++ b/code/test/data/readarr/config/readarr.pid
@@ -0,0 +1 @@
+145
\ No newline at end of file
diff --git a/code/test/data/sonarr/config/Sentry/07ADDC43B5669C4F6DB64F2EF2B23B3FEEDFE865/.installation b/code/test/data/sonarr/config/Sentry/07ADDC43B5669C4F6DB64F2EF2B23B3FEEDFE865/.installation
new file mode 100644
index 0000000..5f7b114
--- /dev/null
+++ b/code/test/data/sonarr/config/Sentry/07ADDC43B5669C4F6DB64F2EF2B23B3FEEDFE865/.installation
@@ -0,0 +1 @@
+1df9f2cc-17dc-4130-9753-9b694f82f1b5
\ No newline at end of file
diff --git a/code/test/data/sonarr/config/Sentry/07ADDC43B5669C4F6DB64F2EF2B23B3FEEDFE865/.session b/code/test/data/sonarr/config/Sentry/07ADDC43B5669C4F6DB64F2EF2B23B3FEEDFE865/.session
new file mode 100644
index 0000000..d7092f4
--- /dev/null
+++ b/code/test/data/sonarr/config/Sentry/07ADDC43B5669C4F6DB64F2EF2B23B3FEEDFE865/.session
@@ -0,0 +1 @@
+{"update":{"sid":"e87df0117b134d64b99f5b878e652b49","did":"1df9f2cc-17dc-4130-9753-9b694f82f1b5","init":true,"started":"2024-11-12T08:27:39.2729256+00:00","timestamp":"2024-11-12T08:27:39.2735692+00:00","seq":0,"duration":0,"errors":0,"attrs":{"release":"4.0.10.2544-main","environment":"main"}}}
\ No newline at end of file
diff --git a/code/test/data/sonarr/config/asp/key-460837be-4d61-409f-95f8-b78f2a65ed81.xml b/code/test/data/sonarr/config/asp/key-460837be-4d61-409f-95f8-b78f2a65ed81.xml
new file mode 100644
index 0000000..ad96c2b
--- /dev/null
+++ b/code/test/data/sonarr/config/asp/key-460837be-4d61-409f-95f8-b78f2a65ed81.xml
@@ -0,0 +1,16 @@
+
+
+ 2024-11-10T19:27:03.0013963Z
+ 2024-11-10T19:27:02.9916656Z
+ 2025-02-08T19:27:02.9916656Z
+
+
+
+
+
+
+ N6KEU+20is+M3ZH+mi+TYVIjTes0zQ8MJHE7npaP3B8FM8jN+5tMp3SKnu6II2jdWybEvBjAvoycoaRDRsDnZQ==
+
+
+
+
\ No newline at end of file
diff --git a/code/test/data/sonarr/config/logs.db b/code/test/data/sonarr/config/logs.db
new file mode 100644
index 0000000..76bc534
Binary files /dev/null and b/code/test/data/sonarr/config/logs.db differ
diff --git a/code/test/data/sonarr/config/logs.db-shm b/code/test/data/sonarr/config/logs.db-shm
new file mode 100644
index 0000000..44a7d06
Binary files /dev/null and b/code/test/data/sonarr/config/logs.db-shm differ
diff --git a/code/test/data/sonarr/config/logs.db-wal b/code/test/data/sonarr/config/logs.db-wal
new file mode 100644
index 0000000..bcdb626
Binary files /dev/null and b/code/test/data/sonarr/config/logs.db-wal differ
diff --git a/code/test/data/sonarr/config/sonarr.db b/code/test/data/sonarr/config/sonarr.db
new file mode 100644
index 0000000..31e7a08
Binary files /dev/null and b/code/test/data/sonarr/config/sonarr.db differ
diff --git a/code/test/data/sonarr/config/sonarr.db-shm b/code/test/data/sonarr/config/sonarr.db-shm
new file mode 100644
index 0000000..2a0d5e2
Binary files /dev/null and b/code/test/data/sonarr/config/sonarr.db-shm differ
diff --git a/code/test/data/sonarr/config/sonarr.db-wal b/code/test/data/sonarr/config/sonarr.db-wal
new file mode 100644
index 0000000..77455da
Binary files /dev/null and b/code/test/data/sonarr/config/sonarr.db-wal differ
diff --git a/code/test/data/sonarr/config/sonarr.pid b/code/test/data/sonarr/config/sonarr.pid
new file mode 100644
index 0000000..aca544d
--- /dev/null
+++ b/code/test/data/sonarr/config/sonarr.pid
@@ -0,0 +1 @@
+145
\ No newline at end of file
diff --git a/code/test/docker-compose.yml b/code/test/docker-compose.yml
new file mode 100644
index 0000000..e4dfcc3
--- /dev/null
+++ b/code/test/docker-compose.yml
@@ -0,0 +1,148 @@
+
+# user: test
+# pass: testing
+
+# use this to create torrent files
+# docker run --rm -it -v $(pwd)/data/qbittorrent-bad/downloads:/downloads --name debian debian:bookworm-slim
+# apt update && apt install ctorrent
+# ctorrent -t -u "http://tracker:6969/announce" -s example.torrent file_name
+
+# api keys
+# sonarr: 96736c3eb3144936b8f1d62d27be8cee
+# radarr: 705b553732ab4167ab23909305d60600
+# lidarr: 4bd467b8702a4ecf94f737922dac6481
+# readarr: 51c053efbea34bad90120d5c2237aa85
+
+services:
+ qbittorrent:
+ image: lscr.io/linuxserver/qbittorrent:4.6.7-libtorrentv1
+ container_name: qbittorrent
+ environment:
+ - PUID=1000
+ - PGID=1000
+ - TZ=Europe/London
+ - WEBUI_PORT=8080
+ volumes:
+ - ./data/qbittorrent/config:/config
+ - ./data/qbittorrent/downloads:/downloads
+ ports:
+ - 8080:8080
+ - 6881:6881
+ - 6881:6881/udp
+ restart: unless-stopped
+
+ qbittorrent-bad:
+ image: lscr.io/linuxserver/qbittorrent:4.6.7-libtorrentv1
+ container_name: qbittorrent-bad
+ environment:
+ - PUID=1000
+ - PGID=1000
+ - TZ=Europe/London
+ - WEBUI_PORT=8081
+ volumes:
+ - ./data/qbittorrent-bad/config:/config
+ - ./data/qbittorrent-bad/downloads:/downloads
+ ports:
+ - 8081:8081
+ - 6882:6881
+ - 6882:6881/udp
+ restart: unless-stopped
+
+ tracker:
+ image: wiltonsr/opentracker:open
+ container_name: opentracker
+ ports:
+ - 6969:6969/tcp
+ - 6969:6969/udp
+ restart: unless-stopped
+
+ nginx:
+ image: nginx:latest
+ container_name: nginx
+ volumes:
+ - ./data/nginx:/usr/share/nginx/html/custom
+ ports:
+ - 8082:80
+ restart: unless-stopped
+
+ sonarr:
+ image: lscr.io/linuxserver/sonarr:latest
+ container_name: sonarr
+ environment:
+ - PUID=1000
+ - PGID=1000
+ - TZ=Europe/London
+ volumes:
+ - ./data/sonarr/config:/config
+ - ./data/sonarr/tv:/tv
+ - ./data/qbittorrent/downloads:/downloads
+ ports:
+ - 8989:8989
+ restart: unless-stopped
+
+ radarr:
+ image: lscr.io/linuxserver/radarr:latest
+ container_name: radarr
+ environment:
+ - PUID=1000
+ - PGID=1000
+ - TZ=Europe/London
+ volumes:
+ - ./data/radarr/config:/config
+ - ./data/radarr/movies:/movies
+ - ./data/qbittorrent/downloads:/downloads
+ ports:
+ - 7878:7878
+ restart: unless-stopped
+
+ lidarr:
+ image: lscr.io/linuxserver/lidarr:latest
+ container_name: lidarr
+ environment:
+ - PUID=1000
+ - PGID=1000
+ - TZ=Europe/London
+ volumes:
+ - ./data/lidarr/config:/config
+ - ./data/lidarr/music:/music
+ - ./data/qbittorrent/downloads:/downloads
+ ports:
+ - 8686:8686
+ restart: unless-stopped
+
+ readarr:
+ image: lscr.io/linuxserver/readarr:develop
+ container_name: readarr
+ environment:
+ - PUID=1000
+ - PGID=1000
+ - TZ=Europe/London
+ volumes:
+ - ./data/readarr/config:/config
+ - ./data/readarr/books:/books
+ - ./data/qbittorrent/downloads:/downloads
+ ports:
+ - 8787:8787
+ restart: unless-stopped
+
+ cleanuperr:
+ image: flaminel/cleanuperr:1.1.0
+ container_name: cleanuperr
+ environment:
+ - TRIGGERS__QUEUECLEANER=0/30 * * * * ?
+ - QBITTORRENT__URL=http://qbittorrent:8080
+ - QBITTORRENT__USERNAME=test
+ - QBITTORRENT__PASSWORD=testing
+ - SONARR__ENABLED=true
+ - SONARR__INSTANCES__0__URL=http://sonarr:8989
+ - SONARR__INSTANCES__0__APIKEY=96736c3eb3144936b8f1d62d27be8cee
+ - RADARR__ENABLED=true
+ - RADARR__INSTANCES__0__URL=http://radarr:7878
+ - RADARR__INSTANCES__0__APIKEY=705b553732ab4167ab23909305d60600
+ restart: unless-stopped
+ depends_on:
+ - qbittorrent
+ - sonarr
+ - radarr
+ - lidarr
+ - readarr
\ No newline at end of file