Compare commits

..

301 Commits

Author SHA1 Message Date
Mark McDowall
5858c2dda6 Fixed: Limit redirects after login to local paths
(cherry picked from commit 14005d8d1054eafaba808337a109d5812f3e79e6)
2026-03-05 18:37:56 +00:00
retrodadson
ce315afb2a Updated Security Policy to match Radarr
Updated Security Policy to match Radarr
2026-03-05 08:57:45 +00:00
Bogdan
407acb6844 Shazbat fixes for searching and relogin if needed (#2607)
* Fixed: (Shazbat) Update searching

* Fixed: (Shazbat) Relogin on redirect to login page
2026-02-18 19:17:54 +01:00
Weblate
c3a7fbdd86 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: ole brum <wb@rebnord.org>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nb_NO/
Translation: Servarr/Prowlarr
2026-02-15 01:16:17 +01:00
Auggie
472c6f4273 Bump to 2.3.3 2026-02-14 22:27:45 +01:00
Weblate
baa4baf3ca Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Weblate <noreply-mt-weblate@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hu/
Translation: Servarr/Prowlarr
2026-02-08 09:56:37 +01:00
Casper Verswijvelt
852d62dcf0 Fixed: (Torrentday) fix category mapping for TVx265 and add TVUHD (#2593)
* Torrentday: fix category mapping for TVx265 and add TVUHD

* Add category mapping for Movies/Cam, move TV/4K to match torrentday order

* fix: torrentday category order of Movies/4K and Nintendo
2026-02-06 05:29:24 +01:00
Weblate
13493ddbce Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Ardenet <1213193613@qq.com>
Co-authored-by: Dani Talens <databio@gmail.com>
Co-authored-by: HanaO00 <lwin24452@gmail.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Lars <lars.erik.heloe@gmail.com>
Co-authored-by: Lorenz <github.hatred879@passmail.net>
Co-authored-by: Marco Ciotola <github@ciotola.dev>
Co-authored-by: Oleksandr Yurov <oyurov@icloud.com>
Co-authored-by: Oleksii Ilienko <assada.ua@gmail.com>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Surfoo <surfooo@gmail.com>
Co-authored-by: Weblate <noreply-mt-weblate@weblate.org>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Xanardi <xax@pc.707.to>
Co-authored-by: Yuval Yaron <yuvalyaron2011@gmail.com>
Co-authored-by: ctrl2027 <ctrl5862@gmail.com>
Co-authored-by: foXaCe <foxace66@gmail.com>
Co-authored-by: mugantronix <mugantronix@gmail.com>
Co-authored-by: ugyes <ferenc.bodi@live.com>
Co-authored-by: wangtelong777 <wangtelong777@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ar/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/bg/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ca/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/cs/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/da/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/el/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fa/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/he/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hi/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hr/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hu/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/id/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/is/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/it/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ja/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ko/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/lv/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nb_NO/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ro/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/sk/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/sv/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/th/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/uk/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/vi/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_Hans/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_TW/
Translation: Servarr/Prowlarr
2026-02-02 23:00:35 +01:00
Auggie
a4a8e890c1 Fixed: (BeyondHD) Add movie prefix to TMDB ID queries
fixes #2591
2026-01-31 09:02:01 +01:00
Bogdan
688434ced9 Bump BusyTimeout for SQLite to 1000ms 2026-01-11 17:25:08 +01:00
Bogdan
2ed910459f Avoid unique constraints for primary keys in SQLite migrations
(cherry picked from commit c70de927a5113a3029478c539ca0f7f3095e07e9)
2026-01-11 17:23:55 +01:00
segalll
878818e950 Fixed: Form data encoding for non-UTF8 indexers 2026-01-02 20:07:21 +01:00
Auggie
0884ac92ff Bump to 2.3.2 2025-12-29 05:10:15 +01:00
Bogdan
9508329b99 Fixed: (AB) Prevent false positives parsing seasons for "No. 8" 2025-12-28 21:22:15 +01:00
Bogdan
15a03007d9 Fixed: (Shazbat) More fixes to login form and parsing details 2025-12-28 21:14:13 +01:00
Auggie
b188746f1a Fixed: (Shazbat) Update login form and parsing details 2025-12-21 19:31:18 +01:00
Robin Dadswell
ed3b25b3d6 chore: updated build images 2025-11-14 23:14:55 +00:00
Robin Dadswell
c006079ce6 bump to 2.3.1 2025-11-14 22:58:29 +00:00
Mark McDowall
9437ff9498 Add private IPv6 networks
(cherry picked from commit 52972e7efcce800560cbbaa64f5f76aaef6cbe77)
2025-11-10 09:26:45 +00:00
bakerboy448
e4fb36e08f Bump to 2.3.0 2025-10-30 05:51:48 -05:00
Mark McDowall
ff22fdf7d3 Set known networks to RFC 1918 ranges during startup
(cherry picked from commit d10107739b9ed6a50165e5dd1dfae15c7e8aea56)
2025-10-29 23:42:00 +00:00
Polgonite
b3d46465ae Fixed: qBittorrent /login API success check 2025-10-29 17:59:58 -05:00
bakerboy448
eb57d20545 Bump to 2.2.0 2025-10-25 14:42:07 -05:00
bakerboy448
775b716c0f Fixed:(RuTracker) fix for Anime S01nd Episode N of N or N+N of N+N
Based on Jackett 5b712189fc55470dc94b56ea0d764e123e2dc432
2025-10-20 18:19:42 -05:00
bakerboy448
f7f3648dac Bump to 2.1.5 2025-10-13 19:42:22 -05:00
Bogdan
c669048767 Bump System.Data.SQLite, MailKit, Microsoft.Data.SqlClient, Newtonsoft.Json and Polly
(cherry picked from commit 86282d621b3edcbf3582d6321de8be4172d37ed2)
2025-10-05 12:18:14 -05:00
Bogdan
c282e4bef8 Pin System.Private.Uri to 4.3.2
(cherry picked from commit e0180e397d90db01e8cee0ee38419eb0b6bce989)
2025-10-05 12:18:14 -05:00
bakerboy448
574721bfb5 Bump to 2.1.4 2025-10-05 12:18:07 -05:00
bakerboy448
3c7575b58e fixup! Pin System.Drawing.Common to 8.0 (#2514) 2025-10-02 10:36:03 -05:00
Bogdan
93d8f81750 Fix code coverage on CI 2025-10-02 10:31:48 -05:00
Bogdan
364c7c9c7e Avoid rewriting file names in builds
Signed-off-by: bakerboy448 <55419169+bakerboy448@users.noreply.github.com>
2025-10-02 10:31:48 -05:00
Bogdan
54af7fd3d0 Bump coverlet.collector to official 6.0.4
Bump NUnit3TestAdapter to 5.1.0
Bump NunitXml.TestLogger to 3.1.20
2025-10-02 10:31:48 -05:00
bakerboy448
e6bc7fa062 Pin System.Drawing.Common to 8.0 (#2514) 2025-10-02 09:36:12 -05:00
bakerboy448
98608e75a6 Fixup theme selector App name 2025-10-01 10:21:22 -05:00
Bogdan
160320f3a2 Switch HttpProxySettingsProviderFixture to test cases
(cherry picked from commit 4e8fe6e81b1ac3f53135ad2e2b95d7aae811b87e)
2025-09-30 21:48:50 -05:00
Collin Heist
c9baaf634e Fixed: Prevent modals from overflowing screen width
(cherry picked from commit 6c581b7e3c5c74db350d7ba2aad04f2df77c7671)
2025-09-30 21:46:34 -05:00
Stevie Robinson
8bf2f68abe New: Switch theme automatically on system change
(cherry picked from commit 4904e85887b8455483e509b83abaa2c6517d45a0)
2025-09-30 21:46:32 -05:00
Bogdan
9434091912 New: Retry SQLite writes for database is locked errors
(cherry picked from commit 2e1289b9248a70ce50bde52a66d3a589f3dcb8f5)
2025-09-30 21:46:28 -05:00
Zac Bowling
2f7d821d45 Fixed: (RevolutionTT) New Domain (#2511)
* RevolutionTT switched domains

* fixup!

Co-authored-by: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com>

---------

Co-authored-by: bakerboy448 <55419169+bakerboy448@users.noreply.github.com>
Co-authored-by: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com>
2025-09-30 20:39:28 -05:00
Bogdan
471c9910a0 Bump System.Data.SQLite to official 2.0.1 2025-09-30 13:24:39 -05:00
Bogdan
98ff2f5cb6 Bump STJson, MailKit and Polly 2025-09-30 13:24:39 -05:00
bakerboy448
4d9982872a New: (PTP) Improve Error Handling 2025-09-30 11:43:56 -05:00
bakerboy448
ae9326480e fixup! New: Move CGPeers to Cardigann 2025-09-30 11:41:57 -05:00
Ryan S
624cbd548f Fixed: (Indexer) Shazbat added new site url
Moved old url to LegacyUrls
2025-09-30 11:28:09 -05:00
bakerboy448
f5f98e4f53 New: Move CGPeers to Cardigann 2025-09-25 09:36:56 -05:00
Weblate
8585dd447e Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Pazuzu6666 <fukscam978@gmail.com>
Co-authored-by: Weblate <noreply-mt-weblate@weblate.org>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_TW/
Translation: Servarr/Prowlarr
2025-09-25 09:29:25 -05:00
bakerboy448
dfffb3aa4e Bump to 2.1.3 2025-09-21 14:53:25 -05:00
bakerboy448
7eb2d956cf Bump to 2.1.2 2025-09-14 22:29:17 -05:00
thisaccountwillmakeprs
8da493dbaf Fixed: (BroadcasTheNet) Improve daily episode searching (#2500) 2025-09-13 10:37:29 -05:00
bakerboy448
f17cf6144f docs: Update bug report template for clarity
[skip ci]
2025-09-07 12:23:51 -05:00
bakerboy448
1b3adc4529 docs: Fix typos in bug report template labels and descriptions
[skip ci]
2025-09-07 12:08:30 -05:00
bakerboy448
389f049a8b docs: Update bug report template for clarity and accuracy
[skip ci]
2025-09-07 12:06:05 -05:00
bakerboy448
99b0fcd750 Bump to 2.1.1 2025-09-07 00:27:28 -05:00
bakerboy448
516b09ca91 Fixed: Rename (Newznab) nzb.su to nzb.life
rename ApiKeyWhiteList to ApiKeyAllowList

Co-authored-by: Stevie<stevie.robinson@gmail.com>
2025-09-06 21:15:04 -05:00
bakerboy448
770fd64013 Revert Various
Revert "Fixed: (HttpClient) Increase cookie limit per domain to 100"

This reverts commit f67c672ec7.

Revert "Add exclusive only"

This reverts commit 80425f5ea4.

Revert "GGn Snatched + Pagination"This reverts commit 758cae3f40.

Revert "Fixed: (PassThePopcorn) Generate titles for full discs"

This reverts commit fbf4ff6777.
2025-09-06 10:57:17 -05:00
Bogdan
f67c672ec7 Fixed: (HttpClient) Increase cookie limit per domain to 100 2025-09-06 07:15:05 -05:00
Bogdan
80425f5ea4 Add exclusive only 2025-09-06 07:14:55 -05:00
Bogdan
758cae3f40 GGn Snatched + Pagination 2025-09-06 07:14:43 -05:00
Bogdan
fbf4ff6777 Fixed: (PassThePopcorn) Generate titles for full discs 2025-09-06 07:14:32 -05:00
Bogdan
98ee9c1703 Fixed: Responsive add indexer modal layout filters 2025-09-06 07:14:20 -05:00
bakerboy448
c537e94f0f New: INTERNAL flag support for Cardigann Indexers based on Description 2025-09-05 16:12:03 -05:00
bakerboy448
9e5dd2a2e6 Fixed: (Newznab) nzb.su to nzb.life
Change url for built in defintion
2025-09-03 10:56:22 -05:00
bakerboy448
f601ff98a2 New: (FileList) Add Cat 31 and refresh urls 2025-09-01 14:27:33 -05:00
Weblate
540fafdebf Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Jeremi Florczyk <j.m.florczyk@gmail.com>
Co-authored-by: NanderTGA <nander.roobaert@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Xoores <servarr-35466@xoores.cz>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/cs/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pl/
Translation: Servarr/Prowlarr
2025-09-01 14:27:20 -05:00
bakerboy448
532bffe772 Bump to 2.1.0 2025-08-23 15:47:28 -05:00
bakerboy448
bf80f7916c Improve UX of indexer urls error logging 2025-08-21 14:48:05 -05:00
bakerboy448
2f6a9dfffb New: Improve Indexer Connection Failure Messaging (#2473) 2025-08-20 11:25:27 -05:00
Weblate
94477e9cf9 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Jeremi Florczyk <j.m.florczyk@gmail.com>
Co-authored-by: Marcin <ml.cichy@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pl/
Translation: Servarr/Prowlarr
2025-08-20 11:25:05 -05:00
ilike2burnthing
52e21b3dfc Fixed:(toloka) improve episode regex & trim (#2471)
toloka: improve episode regex & trim
2025-08-18 20:38:22 -05:00
Eugene Shatilo
cb4cc81ad0 Fixed:(RuTracker) corrected regexp for director’s name in the title to cover cases for Russian directors (#2470)
Corrected regexp for rutracker director's name in the title to cover cases for russian directors
2025-08-17 21:51:57 -05:00
bakerboy448
7ada036480 Fixed: Mobile add indexer modal layout (#2464)
* New: Add Indexer Filters are Collapsible

fixes #2431

* Fixed: Rename onToggleFilters to handleToggleFilters

* fix css lint
2025-08-17 21:46:59 -05:00
bakerboy448
f1c9ba40c4 Bump to 2.0.5 2025-08-17 14:43:48 -04:00
Mark McDowall
8664fc095d New: Move auth success logging to debug
Closes #7978
2025-08-11 22:38:25 -05:00
Mark McDowall
23b9973ef7 Don't log debug messages for API key validation
(cherry picked from commit 78ca30d1f81361a2dabaddd0036b764859b858af)
2025-08-11 18:34:24 -05:00
Weblate
d9f1d96e00 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Tim81 <tvdham@hotmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nl/
Translation: Servarr/Prowlarr
2025-08-11 18:26:34 -05:00
bakerboy448
d9d045a548 Bump version to 2.0.4 2025-08-10 23:24:55 -05:00
Robin Dadswell
c417c41133 Fixed: Saving Newznab indexer when redirect was true 2025-08-05 13:30:21 +01:00
Weblate
d5853735ac Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: ArLab1 <arnaud.laberge@hotmail.com>
Co-authored-by: Oleksii Ilienko <assada.ua@gmail.com>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/uk/
Translation: Servarr/Prowlarr
2025-08-05 06:12:08 -05:00
Robin Dadswell
dbc159f536 New: Force all usenet indexers to use Redirection 2025-08-04 10:39:45 +01:00
Robin Dadswell
231cc91f97 New: Updated all newznab indexers to be redirect 2025-08-04 10:39:45 +01:00
Mike Miller
1a075f201c Fixed: (Xpseeds) Update categories (#2458)
Sync with Jackett
2025-08-03 13:12:59 -05:00
bakerboy448
de7f42cf30 Bump version to 2.0.3 2025-07-23 08:50:43 -05:00
bakerboy448
fab74b58fa New: (Avistaz Sites) Use created_at_iso for release create date (#2437)
* New: (Avistaz Sites) Use created_at_iso for release create date

no longer have timezone headaches
all Staz sites except animetorrents support this new field.

* fix tests

* Remove AvistaZ TimezoneOffset
2025-07-19 07:43:26 -04:00
bakerboy448
2b332a00d7 Bump version to 2.0.2 2025-07-08 18:36:38 -05:00
Weblate
a0b0c1555c Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: averyv86 <averyv86@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/tr/
Translation: Servarr/Prowlarr
2025-07-08 17:31:08 -05:00
bakerboy448
86b81948af Sync UiAuthorizationPolicyProvider with upstream
* Revert "Fixed: Fallback to Forms for removed Basic auth method"

This reverts commit fe198352a3.

* AuthPolicy Var fixes
2025-07-02 10:10:40 -05:00
Mark McDowall
54918e0c30 Change authentication to Forms if set to Basic
(cherry picked from commit 8e08b0cc3df904d39da5be38bc345cc701412a9d)
2025-06-28 09:29:52 -05:00
Bogdan
01dd793c0a Bump version to 2.0.1 2025-06-15 09:25:06 +03:00
Bogdan
950949e4bc Bump Polly to 8.6.0 2025-06-12 09:56:52 +03:00
Bogdan
fe198352a3 Fixed: Fallback to Forms for removed Basic auth method 2025-06-11 20:13:03 +03:00
Bogdan
88502cd020 Fixed: (AnimeTosho) Mapping of Subcategory as Parent 2025-06-11 10:32:21 +03:00
Bogdan
4924b45b56 Fix various typos 2025-06-10 18:36:14 +03:00
Bogdan
aea8b7cd7e Fixed: Redirect loop for removed basic auth method 2025-06-10 12:33:52 +03:00
Bogdan
aafadb6111 Fix fullscreen automation screenshots 2025-06-09 22:08:00 +03:00
Mark McDowall
c82f904d49 New: Add exception to SSL Certificate validation message
(cherry picked from commit d84c4500949a530fac92d73f7f2f8e8462b37244)
2025-06-08 16:37:52 +03:00
Servarr
60740fa259 Automated API Docs update 2025-06-08 10:33:02 +03:00
Mark McDowall
d36b32f414 New: Remove Basic Auth
(cherry picked from commit 0f9e063e2146812f6e963363eee70a524612f354)
2025-06-07 19:23:03 +03:00
Bogdan
14ccd6d2a5 Fixed: Validation for tags label 2025-06-07 19:23:03 +03:00
Bogdan
bdc3b63df2 Upgrade StyleCop.Analyzers to Unstable 1.2.0.556 2025-06-07 19:23:03 +03:00
Bogdan
8eec321a0e Bump Swashbuckle to 8.1.4 2025-06-07 19:23:03 +03:00
Bogdan
06de2313ab Bump version to 2.0.0 2025-06-07 19:23:03 +03:00
Bogdan
a3f713bad8 New: Support removed for linux-x86 2025-06-07 19:23:03 +03:00
Bogdan
7a1fca5e23 New: Migrate appdata folder for .NET 8 on OSX 2025-06-07 19:23:03 +03:00
Bogdan
21c408a7da New: Bump to .NET 8 2025-06-07 19:23:03 +03:00
Weblate
0e92108970 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Ilbebino <tommasobellandi08@gmail.com>
Co-authored-by: Weblate <noreply-mt-weblate@weblate.org>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/it/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/
Translation: Servarr/Prowlarr
2025-06-06 14:41:02 +03:00
Bogdan
7d813ef97a Bump version to 1.38.0 2025-06-04 14:05:21 +03:00
Bogdan
c87995250a Fixed: Sync indexers with basic search to Radarr and Sonarr
Fixes #2404
2025-06-03 14:26:09 +03:00
Bogdan
a9f7a376c7 Bump version to 1.37.0 2025-05-25 17:00:17 +03:00
Bogdan
c3ee3f2320 Fix jump to character for Search page 2025-05-25 14:04:33 +03:00
Weblate
e8c26d0fea Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: thelooter <evekolb2204@gmail.com>
Co-authored-by: warkurre86 <tom.novo.86@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/cs/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/de/
Translation: Servarr/Prowlarr
2025-05-25 12:05:56 +03:00
Bogdan
9c936121e8 Fixed: Sync indexers with basic search to Lidarr and Readarr
Fixes #2402
2025-05-22 13:30:41 +03:00
Bogdan
40d2e40d94 Fail build on missing test results
Ignore missing test results failure on FreeBSD
2025-05-18 18:01:13 +03:00
Weblate
837f50c91c Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Fixer <ygj59783@zslsz.com>
Co-authored-by: Hugoren Martinako <aumpfbahn@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ca/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/el/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hu/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/it/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pl/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/uk/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/
Translation: Servarr/Prowlarr
2025-05-18 14:10:34 +03:00
Bogdan
f0a0202e5c Bump version to 1.36.3 2025-05-18 14:10:14 +03:00
Bogdan
708c94bc56 Fixed PTP test 2025-05-15 00:47:46 +03:00
Bogdan
5ed82eaf09 Fixed: (PTP) Download torrent files with API credentials 2025-05-14 22:44:26 +03:00
Bogdan
7d77ad68fd Bump caniuse db 2025-05-14 21:25:20 +03:00
Bogdan
6725358db5 Bump babel, fontawesome icons, react-use-measure, react-virtualized and react-window 2025-05-14 21:25:20 +03:00
Bogdan
c410e23460 Bump core-js to 3.42 2025-05-14 21:25:20 +03:00
Bogdan
903b86b9a2 Bump version to 1.36.2 2025-05-11 14:48:48 +03:00
Weblate
52a49e6a34 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Discover999 <13189912235@163.com>
Co-authored-by: GkhnGRBZ <gkhn.gurbuz@hotmail.com>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: ZijiYu <ziji.yu@stonybrook.edu>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/tr/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_Hans/
Translation: Servarr/Prowlarr
2025-05-11 00:07:11 +03:00
Bogdan
a7d99f351c Fixed: Parsing user agents without a version
Fixes #2392
2025-05-11 00:05:29 +03:00
Bogdan
b0212dd780 Add hourly limits as defaults for PTP 2025-05-10 11:55:11 +03:00
Bogdan
c8f5099423 Use the thrown exception in http timeout handling 2025-05-09 15:58:02 +03:00
Bogdan
5cc4c3f302 Bump version to 1.36.1 2025-05-04 21:06:28 +03:00
Bogdan
c0d2cb42e9 Fixed: (PTP) Sorting releases by time added 2025-05-01 17:06:17 +03:00
Bogdan
8081f13052 Clean logging messages in AppriseProxy 2025-05-01 12:12:47 +03:00
Bogdan
84b672e617 Fixed: Sync indexers to apps only if search is available 2025-05-01 01:34:09 +03:00
Bogdan
ed586c2d72 Update fixture file for PTP 2025-05-01 00:30:55 +03:00
Bogdan
233176e321 Improve error message when BHD's API responds with HTML 2025-04-30 22:12:30 +03:00
Bogdan
d1e3390bae Fixed: (PTP) Category mapping for search results 2025-04-30 22:12:30 +03:00
Bogdan
1cd60c7a40 Bump version to 1.36.0 2025-04-30 14:03:05 +03:00
Bogdan
c61cfcd312 Avoid logging the whole response in the exception when not finding JSON selectors in Cardigann 2025-04-30 12:36:34 +03:00
Weblate
5eb4d112ca Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Weblate <noreply-mt-weblate@weblate.org>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ca/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nb_NO/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/uk/
Translation: Servarr/Prowlarr
2025-04-29 11:05:21 +03:00
Mark McDowall
70f2361d69 Improve messaging when NZB contains invalid XML
(cherry picked from commit 728df146ada115a367bf1ce808482a4625e6098d)
2025-04-29 10:58:31 +03:00
Bogdan
1d6babaa15 Bump caniuse db 2025-04-29 10:23:51 +03:00
Bogdan
0427add8d0 Bump core-js to 3.41 2025-04-29 10:23:15 +03:00
Bogdan
010c2b836d Clean up formatted strings in log messages 2025-04-29 10:16:59 +03:00
Bogdan
22c4c1fc9a Pass messages with arguments to NLog in LoggerExtensions
(cherry picked from commit 9683b0af35220bb0af801779a06d73feaeba809a)
2025-04-29 10:14:32 +03:00
Bogdan
d5f6cc94b8 Fixed: (PTP) TV search capabilities removed 2025-04-29 10:04:40 +03:00
Bogdan
411e96ef2a New: Redirect enabled by default when adding new usenet indexers 2025-04-28 21:52:09 +03:00
Bogdan
2b0e52ebca Update default log level message 2025-04-27 21:22:37 +03:00
Bogdan
c6fa26ca7b Bump version to 1.35.1 2025-04-27 11:48:50 +03:00
blu3
c85f170d41 Bump license year 2025-04-23 11:34:19 +03:00
Bogdan
48a658571b Improve error messaging for not finding JSON selectors in Cardigann 2025-04-21 14:39:22 +03:00
Weblate
0b3a5c9bc4 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Hugoren Martinako <aumpfbahn@gmail.com>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ca/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/
Translation: Servarr/Prowlarr
2025-04-20 22:30:45 +03:00
Bogdan
356d07ef34 Bump version to 1.35.0 2025-04-20 22:30:15 +03:00
Bogdan
0322d70d63 Fixed: Handle 307 and 308 redirects for indexer download requests 2025-04-20 11:09:08 +03:00
Bogdan
362f3fe223 Bump version to 1.34.1 2025-04-13 09:48:04 +03:00
Bogdan
075fd24f96 Downgrade Microsoft.AspNetCore.WebUtilities 2025-04-12 17:23:45 +03:00
Bogdan
4ba72ea7f3 Bump Swashbuckle to 7.3.2 2025-04-12 14:54:56 +03:00
Bogdan
46f73c51bb Bump IPAddressRange, Npgsql, System.Text.Json 2025-04-12 14:54:01 +03:00
Bogdan
3287d45661 Update timezone offset for AvistaZ trackers 2025-04-12 14:42:25 +03:00
Bogdan
71937fa44c Update timezone offset for FL 2025-04-12 14:33:30 +03:00
Bogdan
6aefd46cd4 Fixed: (SecretCinema) Edition not being decoded 2025-04-12 14:31:29 +03:00
Bogdan
c8370c9e00 Bump version to 1.34.0 2025-04-09 20:59:15 +03:00
Servarr
6be4203b41 Automated API Docs update 2025-04-09 10:29:44 +03:00
Bogdan
1339373e43 Bump Selenium.WebDriver.ChromeDriver 2025-04-08 13:30:56 +03:00
Bogdan
fc9dfb0cf7 Fixed: Disallow tags creation with empty label 2025-04-08 13:30:03 +03:00
Mark McDowall
48301055ea Fixed: Set output encoding to UTF-8 when running external processes
(cherry picked from commit f8e57b09856278a6d0c65f18704e96a33459687d)
2025-04-08 13:29:32 +03:00
Mark McDowall
8a9518c9c1 Update WikiUrl type in API docs
(cherry picked from commit 9bd619ccfe074abe396bbf043a36a5be18a7ba4b)
2025-04-08 13:29:09 +03:00
Bogdan
de099c6770 Log delete statements only once 2025-04-08 13:28:52 +03:00
Bogdan
07711da4e0 Bump version to 1.33.3 2025-04-06 15:44:25 +03:00
MrE12345
7cb70716d0 Fixed: (NorBits) Change encoding to UTF8 (#2367) 2025-04-06 12:43:24 +03:00
Weblate
548dedad5c Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Ste <stefanucciu@gmail.com>
Co-authored-by: Weblate <noreply-mt-weblate@weblate.org>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ca/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/cs/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ru/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/uk/
Translation: Servarr/Prowlarr
2025-04-06 12:23:27 +03:00
Bogdan
7008626358 Fixed: (PassThePopcorn) Parse volume factors for neutral leech releases 2025-04-04 21:34:10 +03:00
Bogdan
f6f2a3b00d Bump linux agent to ubuntu-22.04 2025-04-02 00:10:40 +03:00
Weblate
2b16d93095 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Alex Mills <alex@alexmills.uk>
Co-authored-by: Lizandra Candido da Silva <lizandra.c.s@gmail.com>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Weblate <noreply-mt-weblate@weblate.org>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/bg/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ca/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/cs/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fa/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ko/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nb_NO/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/tr/
Translation: Servarr/Prowlarr
2025-03-30 10:30:41 +03:00
Bogdan
e63ee13d23 Bump version to 1.33.2 2025-03-30 10:30:03 +03:00
Bogdan
5c5a163151 Fixed: (AnimeBytes) Allow season searching for ONA 2025-03-28 13:39:19 +02:00
Bogdan
023eec0ec0 Update timezone offset for PrivateHD and CinemaZ 2025-03-25 13:04:07 +02:00
Bogdan
5bc5f0e6b8 New: Categories, genres, indexer flags and publish dates for webhook releases 2025-03-25 13:00:53 +02:00
Bogdan
5cbacc01eb Fixed: Publish dates timezone in history details for grabbed releases 2025-03-25 13:00:53 +02:00
Bogdan
f4f1b38324 New: On Grab notifications for CustomScript 2025-03-25 13:00:53 +02:00
Bogdan
758dddd4ad Bump version to 1.33.1 2025-03-23 09:45:33 +02:00
Bogdan
73ee695633 New: (BeyondHD) Parsing audio and subtitles languages 2025-03-22 21:01:22 +02:00
Bogdan
27fbd7ef7e Fixed: (RuTracker.org) Improve subtitles removal 2025-03-22 12:45:10 +02:00
Bogdan
5125f256fb Fixed: Priority validation for indexers and download clients 2025-03-20 20:38:13 +02:00
Mark McDowall
b99e8d0d65 Improve logging when login fails due to CryptographicException
(cherry picked from commit 1449941471cbb8885e9298317b9a30f2576d7941)
2025-03-16 13:10:09 +02:00
Bogdan
d20b2cc9c0 Bump NLog and Polly 2025-03-16 12:06:32 +02:00
Bogdan
8a1787bdb6 Bump version to 1.33.0 2025-03-16 11:42:07 +02:00
Mark McDowall
a19b8ea997 New: Truncate button text
Fixes #2352

(cherry picked from commit 093ee5b88db0470426f6132e66a5893e5cf89bab)
2025-03-10 20:07:15 +02:00
Mark McDowall
10ea6cd753 Improve wrapping of text in sidebar
(cherry picked from commit f58dfc5605738ebccdd6adc6f1ca2a7843c086b2)
2025-03-10 20:07:15 +02:00
Bogdan
2c1b464715 New: Recommend against using uTorrent
(cherry picked from commit 6d8c3f15b343a24fc31a212463af8ed2b5792508)
2025-03-10 20:07:15 +02:00
Bogdan
3263454041 Bump version to 1.32.2 2025-03-09 11:50:31 +02:00
Servarr
015db4a916 Translations update from Servarr Weblate (#2351)
Multiple Translations updated by Weblate

ignore-downstream







Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ko/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_Hans/
Translation: Servarr/Prowlarr

Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Fixer <ygj59783@zslsz.com>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Weblate <noreply-mt-weblate@weblate.org>
Co-authored-by: wangdj1314 <wangdj@risenenergy.com>
Co-authored-by: 葛磊磊 <geleilei198117@163.com>
2025-03-07 10:38:29 +02:00
Bogdan
49268f3b8d Fix timezone offset tests for AvistaZ trackers 2025-03-04 13:15:44 +02:00
Bogdan
f02a6f3e2c Update timezone offset for AvistaZ trackers 2025-03-03 17:17:29 +02:00
Bogdan
46b6124b97 Bump version to 1.32.1 2025-03-02 12:17:40 +02:00
Bogdan
53bc97b3be Fixed: (BeyondHd) Search daily episodes using year-month-day format 2025-03-01 17:34:58 +02:00
Bogdan
b09d4927cc Check instance name must contain application name with culture-insensitive 2025-03-01 13:38:34 +02:00
Bogdan
328f3c0423 Bump version to 1.32.0 2025-02-22 12:55:30 +02:00
Mark McDowall
635e76526a Cleanse console log messages
(cherry picked from commit 609e964794e17343f63e1ecff3fef323e3d284ff)
2025-02-19 15:59:34 +02:00
Stevie Robinson
790feed5ab Fixed: Fallback to Instance Name for Discord notifications
(cherry picked from commit b99e06acc0a3ecae2857d9225b35424c82c67a2b)
2025-02-19 15:55:42 +02:00
Mark McDowall
59b5d2fc78 Fixed: Drop downs flickering in some cases
(cherry picked from commit 3b024443c5447b7638a69a99809bf44b2419261f)
2025-02-18 17:09:56 +02:00
Bogdan
d5b12cf51a Fixed release guid for SpeedApp 2025-02-18 04:00:24 +02:00
Bogdan
2d584f7eb6 New: Support for exclusive indexer flag
Co-authored-by: zakkarry <zak@ary.dev>
2025-02-18 02:11:57 +02:00
Bogdan
0f1d647cd7 Fixed: (FileList) Download links when passkey contains spaces 2025-02-16 12:22:44 +02:00
zodihax
d6e8d89be4 Fixed: (NorBits) Update release category parsing (#2342)
Co-authored-by: Bogdan <mynameisbogdan@users.noreply.github.com>
2025-02-12 19:27:09 +02:00
Bogdan
8672129d5a Fixed: (AnimeTorrents) Switched to cookies login 2025-02-12 15:52:22 +02:00
Bogdan
44bdff8b8f Minor cleanup for AnimeTorrents 2025-02-12 15:52:22 +02:00
Bogdan
4df8fc02f1 Bump version to 1.31.2 2025-02-09 17:51:35 +02:00
Weblate
e101129cff Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Marius Nechifor <flm.marius@gmail.com>
Co-authored-by: Weblate <noreply-mt-weblate@weblate.org>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/bg/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ca/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/cs/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fa/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ko/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ro/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/
Translation: Servarr/Prowlarr
2025-02-07 19:14:29 -06:00
Bogdan
147e732c9c Building docs on ARM
Co-authored-by: Mark McDowall <mark@mcdowall.ca>
2025-02-06 00:36:13 +02:00
Bogdan
a12381fb1d Cleanse "rsskey" from logs 2025-02-05 20:06:51 +02:00
Bogdan
3a4de9cca1 Fixed: (MAM) Continue downloading if attempting to buy personal FL for VIP release 2025-02-05 19:59:48 +02:00
Bogdan
43c988d951 Fixed: (MAM) Use the latest cookies on release download 2025-02-05 19:51:20 +02:00
Bogdan
a036e0fc37 Fixed: (MAM) Updated property name for user class 2025-02-05 19:42:32 +02:00
Bogdan
56b9da16cf Fix release category selector on all themes for NorBits
Co-authored-by: Garfield69 <garfield69@outlook.com>
2025-02-05 19:24:36 +02:00
zodihax
887c262589 Update release category selector for NorBits (#2338) 2025-02-05 12:55:53 +02:00
zodihax
12ff612775 Fixed: (NorBits) Added main categories to avoid invalid releases (#2337)
NorBits also has these main categories in addition to the already configured sub-categories. This PR adds these main categories.

Prowlarr often return 0 query results even when there are query results, this is probably caused by all the results only having a main category (for instance "TV") and no sub-categories.

`|Warn|NorBits|Invalid Release: '<redacted>' from indexer: NorBits. No categories provided.`
2025-02-03 18:03:40 +02:00
Bogdan
0d3d27e46f Fixed: (HDB) Use release name for full discs and XXX content 2025-02-02 18:51:12 +02:00
Bogdan
d1846fde61 New: (Myanonamouse) Prevent downloads without FL tokens
Co-authored-by: Kalon Shannon-Innes <mav@hotmail.com.au>
2025-02-02 17:46:28 +02:00
Bogdan
e6901506a0 Fixed: (IPTorrents) Cleanup languages between brackets when possible 2025-02-02 17:44:31 +02:00
Weblate
08b4eddbc5 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Mailme Dashite <mailmedashite@protonmail.com>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: marapavelka <mara.pavelka@gmail.com>
Co-authored-by: 宿命 <331874545@qq.com>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/cs/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/
Translation: Servarr/Prowlarr
2025-02-02 16:13:56 +02:00
Bogdan
979db70e68 Bump version to 1.31.1 2025-02-02 12:47:52 +02:00
Bogdan
22834a852a Fixed: TV search with tmdbid for Newznab and Torznab 2025-01-29 18:39:22 +02:00
Bogdan
f0540a5f8b Bump version to 1.31.0 2025-01-24 17:33:38 +02:00
Weblate
1f7ac7d7d6 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: HanaO00 <lwin24452@gmail.com>
Co-authored-by: Lizandra Candido da Silva <lizandra.c.s@gmail.com>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/
Translation: Servarr/Prowlarr
2025-01-24 13:19:05 +02:00
Bogdan
8ac68240ad Revert "Improve error message on non-JSON responses for Nebulance"
This reverts commit 2c3621d25e.
2025-01-23 16:42:41 +02:00
Bogdan
b463a3f54b Update categories for RuTracker
Co-authored-by: Garfield69 <garfield69@outlook.com>
2025-01-23 15:27:45 +02:00
Bogdan
e15e57329e Update categories for XSpeeds
Co-authored-by: Garfield69 <garfield69@outlook.com>
2025-01-23 15:27:45 +02:00
Bogdan
d8354408a4 Update categories for AnimeTorrents
Co-authored-by: ilike2burnthing <59480337+ilike2burnthing@users.noreply.github.com>
2025-01-23 15:27:45 +02:00
bakerboy448
6d2d49f7bd Fixed: (PTP) Filtering non-freeleech releases when using Freeleech Only
Co-authored-by: Bogdan <mynameisbogdan@users.noreply.github.com>
2025-01-23 02:36:03 +02:00
Bogdan
37610eec40 Fixed: (TorrentDay) Improved error message for expired cookies 2025-01-22 19:44:49 +02:00
Steel City Phantom
ed51208116 Auto-detect building on macOS ARM
(cherry picked from commit 64122b4cfb3bf53bdbf5c924baee5e1b0814501a)
2025-01-21 01:04:44 +02:00
Bogdan
26e4dcad65 Bump version to 1.30.2 2025-01-19 17:14:44 +02:00
Bogdan
6eb21a02a1 Bump NLog, Polly, System.Memory and AngleSharp 2025-01-15 23:23:30 +02:00
Bogdan
8c2d5a404d Fixed BR-DISK detection for AnimeBytes 2025-01-15 01:56:48 +02:00
Bogdan
3b83a00eaf Fixed: (AnimeBytes) Improve M2TS and ISO titles for BR-DISK detection 2025-01-12 19:01:14 +02:00
Weblate
a5a86a6f86 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/
Translation: Servarr/Prowlarr
2025-01-12 15:15:03 +02:00
Bogdan
e7ed09a43d Bump version to 1.30.1 2025-01-12 15:14:09 +02:00
Bogdan
547bc2e58c New: (MyAnonamouse) Search by languages option
Fixes #2326
2025-01-10 22:36:11 +02:00
Weblate
8eb674c8d7 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Altair <villagermd@outlook.com>
Co-authored-by: Ano10 <Ano10@users.noreply.translate.servarr.com>
Co-authored-by: GkhnGRBZ <gkhn.gurbuz@hotmail.com>
Co-authored-by: Matti Meikäläinen <diefor-93@hotmail.com>
Co-authored-by: Mickaël O <mickael.ouillon@ac-bordeaux.fr>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Weblate <noreply-mt-weblate@weblate.org>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: marapavelka <mara.pavelka@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/cs/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/da/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/tr/
Translation: Servarr/Prowlarr
2025-01-08 13:07:07 +02:00
Bogdan
2c3621d25e Improve error message on non-JSON responses for Nebulance 2025-01-07 04:07:54 +02:00
Bogdan
2648f2c639 Fixed: (BTN) Improve M2TS and ISO titles for BR-DISK detection 2025-01-06 13:30:01 +02:00
Bogdan
f4d621063b Bump version to 1.30.0 2025-01-05 15:40:12 +02:00
Stevie Robinson
73494c462c Fixed: Listening on all IPv4 Addresses
(cherry picked from commit 035c474f10c257331a5f47e863d24af82537e335)
2025-01-05 14:27:33 +02:00
Bogdan
36f6896f30 Fixed: (PassThePopcorn) Increase rate limit 2025-01-02 23:20:39 +02:00
Bogdan
e01741a69e New: (AnimeBytes) Use error message from response 2024-12-31 16:33:19 +02:00
Bogdan
1dbff1235e Match single digits only in season number regex for AnimeBytes 2024-12-31 16:26:05 +02:00
Bogdan
1a9ad6b363 Suggest adding IP to RPC whitelist for on failed Transmission auth
(cherry picked from commit f05e552e8e6dc02cd26444073ab9a678dcb36492)
2024-12-31 12:23:32 +02:00
Bogdan
c88249300c Check if backup folder is writable on backup
(cherry picked from commit 8aad79fd3e14eb885724a5e5790803c289be2f25)
2024-12-31 12:23:09 +02:00
Qstick
7b8e352d87 Bump SonarCloud azure extension to 3.X 2024-12-30 22:49:24 -06:00
Bogdan
81f7a6cbab Word boundary in season number regex for AnimeBytes 2024-12-31 02:11:14 +02:00
Bogdan
523e46af2a Fixed: (AnimeBytes) Include year in release title for series with year in filenames 2024-12-31 01:55:55 +02:00
Bogdan
2b4a6def2a Fixed privacy level for Nebulance's API key 2024-12-30 00:59:48 +02:00
Bogdan
9097c0ef6d Bump version to 1.29.2 2024-12-30 00:59:35 +02:00
Bogdan
4321c1d40c Catch search engine related error messages for MyAnonaMouse 2024-12-28 23:42:14 +02:00
Mark McDowall
bb2548a08d Don't send session information to Sentry
(cherry picked from commit fae24e98fb9230c2f3701caef457332952c6723f)
2024-12-28 15:22:41 +02:00
Weblate
3a9b841fad Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: GkhnGRBZ <gkhn.gurbuz@hotmail.com>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Tommy Au <smarttommyau@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: marapavelka <mara.pavelka@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/cs/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/tr/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_TW/
Translation: Servarr/Prowlarr
2024-12-27 22:55:30 +02:00
Bogdan
31203d1370 Add more links for info FlareSolverr and category 8000 2024-12-27 22:53:53 +02:00
Bogdan
c8a910eaf4 Fixed: (RuTracker) Update categories
Co-authored-by: garfield69 <garfield69@outlook.com>
2024-12-27 22:53:53 +02:00
Bogdan
9ab3c3e6c7 Update how to get cookies info for Cardigann
Co-authored-by: garfield69 <garfield69@outlook.com>
2024-12-27 22:53:53 +02:00
Bogdan
4659cb706a Fixed: (Knaben) Update base url
Co-authored-by: garfield69 <garfield69@outlook.com>
2024-12-27 22:53:53 +02:00
Bogdan
500759bf1f Bump version to 1.29.1 2024-12-22 13:24:47 +02:00
Bogdan
43c7c43257 Bump Microsoft.Data.SqlClient to 2.1.7 2024-12-18 12:56:44 +02:00
Bogdan
9c2fced391 Bump System.Text.Json to 6.0.10 2024-12-18 02:34:29 +02:00
Bogdan
52ec5b6ff6 Bump MailKit to 4.8.0 2024-12-18 02:34:29 +02:00
zodihax
b46e657976 Fixed: (NorBits) Searching UTF-8 characters with full search disabled (#2305)
Co-authored-by: zodihaxx <parity.umpires-0m@icloud.com>
2024-12-17 23:04:05 +02:00
Bogdan
51fd30ba10 Use message from error response for Gazelle indexers 2024-12-17 15:30:25 +02:00
Mark McDowall
5fbb347108 Upgrade typescript-eslint packages to 8.181.1
(cherry picked from commit ed10b63fa0c161cac7e0a2084e53785ab1798208)
2024-12-17 14:09:24 +02:00
Mark McDowall
54d3d44620 Upgrade Font Awesome to 6.7.1
(cherry picked from commit 016b5718386593c030f14fcac307c93ee1ceeca6)
2024-12-17 14:04:46 +02:00
Mark McDowall
5ca18683ca Upgrade babel to 7.26.0
(cherry picked from commit bfcd017012730c97eb587ae2d2e91f72ee7a1de3)
2024-12-17 13:59:56 +02:00
Bogdan
6bdf5f5d69 Use error message from Redacted response 2024-12-16 22:25:55 +02:00
Bogdan
7cba7152f1 Bump version to 1.29.0 2024-12-16 22:11:18 +02:00
Bogdan
cf012eb001 Use minor version for core-js in babel/preset-env 2024-12-16 13:26:25 +02:00
Weblate
6b8a7993ff Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: GkhnGRBZ <gkhn.gurbuz@hotmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/tr/
Translation: Servarr/Prowlarr
2024-12-15 18:40:20 +02:00
Mark McDowall
c6440bb21b Upgrade TypeScript and core-js
(cherry picked from commit 148480909917f69ff3b2ca547ccb4716dd56606e)
2024-12-15 15:37:10 +02:00
Mark McDowall
b95eac98b9 Fixed: Error getting processes in some cases
(cherry picked from commit b552d4e9f7ca7388404aa0d52566010a54cb0244)
2024-12-15 15:37:10 +02:00
Bogdan
0eb19ce834 Bump version to 1.28.2 2024-12-15 10:05:45 +02:00
Weblate
4b8016d95d Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: GkhnGRBZ <gkhn.gurbuz@hotmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/tr/
Translation: Servarr/Prowlarr
2024-12-14 02:34:32 +02:00
Bogdan
31d8d2419a Fixed: Refresh backup list on deletion
Fixes #2300
2024-12-11 14:36:59 +02:00
Weblate
d29ccd7749 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Ardenet <1213193613@qq.com>
Co-authored-by: GkhnGRBZ <gkhn.gurbuz@hotmail.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Languages add-on <noreply-addon-languages@weblate.org>
Co-authored-by: Robin Dadswell <robin@robindadswell.tech>
Co-authored-by: Rodion <rodyon009@gmail.com>
Co-authored-by: Weblate <noreply-mt-weblate@weblate.org>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: farebyting <farelbyting@gmail.com>
Co-authored-by: hhjuhl <hans@kopula.dk>
Co-authored-by: keysuck <joshkkim@gmail.com>
Co-authored-by: mryx007 <mryx@mail.de>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/bg/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ca/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/da/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/id/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ko/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/tr/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/uk/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_HANS/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_Hans/
Translation: Servarr/Prowlarr
2024-12-10 14:12:15 +02:00
Mark McDowall
e789f4ec54 Sync TimeSpanConverter with upstream
(cherry picked from commit 1374240321f08d1400faf95e84217e4b7a2d116b)
2024-12-09 14:09:23 +02:00
Bogdan
58d495d618 Bump version to 1.28.1 2024-12-08 12:25:51 +02:00
Bogdan
f3328863e1 Fixed: (M-Team) IMDb removed from releases response 2024-12-07 14:08:48 +02:00
Bogdan
a23d792781 Fixed: Syncing Newznab indexers with expired VIP expiration dates to apps 2024-12-07 12:10:45 +02:00
Bogdan
f066cf399d Fixed: Link to TMDb shows in search history
Fixes #2294
2024-12-07 10:37:29 +02:00
Servarr
61e863cb31 Automated API Docs update 2024-12-03 00:26:48 -06:00
soup
b2afbc6872 New: Add config file setting for CGNAT authentication bypass
(cherry picked from commit 4c41a4f368046f73f82306bbd73bec992392938b)
2024-12-03 00:07:27 -06:00
Elias Benbourenane
aace65f88e Allow GetFileSize to follow symlinks
(cherry picked from commit ca0bb14027f3409014e7cf9ffa8e04e577001d77)

Don't fail if symlink target can't be resolved

(cherry picked from commit 8cb58a63d8ec1b290bc57ad2cf1e90809ceebce9)
2024-12-02 03:18:30 +02:00
Bogdan
9ab2d8b444 Bump IPAddressRange, Npgsql and Polly 2024-12-02 03:14:36 +02:00
Mark McDowall
bc314061ef Fixed: Prevent lack of internet from stopping all health checks from running
(cherry picked from commit dba3a8243988d3e9870b841696303191e1703a0d)
2024-12-02 03:10:32 +02:00
Mark McDowall
87b3dcd780 Support Postgres with non-standard version string
(cherry picked from commit 40f4ef27b22113c1dae0d0cbdee8205132bed68a)
2024-12-02 03:06:47 +02:00
Gylesie
f3b99f68f6 Remove unnecessary heap allocations in local IP check
(cherry picked from commit ed536a85ad5f2062bf6f01f80efddb19fa935f63)
2024-12-02 03:05:29 +02:00
Mark McDowall
c4a90e8ba4 Webpack web target
(cherry picked from commit a90866a73e6cff9a286c23e60c74672f4c0d317a)
2024-11-27 12:26:23 +02:00
Bogdan
41320ca2dc Bump version to 1.28.0 2024-11-26 19:27:15 +02:00
Bogdan
b8b32f8708 Fixed: (ImmortalSeed) Update relogin check 2024-11-24 11:45:55 +02:00
Weblate
30c4bb24e8 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Mizuyoru_TW <mizuyoru.tw@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_TW/
Translation: Servarr/Prowlarr
2024-11-24 07:44:46 +02:00
Alexander Bruun
b447db5d08 Fixed: (RED) Update indexer url (#2285)
* Updated RED CNAME record
* Added LegacyUrls
2024-11-23 22:41:21 -06:00
Weblate
299001a513 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: 4kwins <hanszimmerme@gmail.com>
Co-authored-by: GkhnGRBZ <gkhn.gurbuz@hotmail.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/tr/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/
Translation: Servarr/Prowlarr
2024-11-19 20:37:31 -06:00
Bogdan
2871f1f2a2 Bump version to 1.27.0 2024-11-19 03:11:37 +02:00
Bogdan
a9b93df0c9 Pin ReportGenerator in Azure Pipelines for .NET 6
(cherry picked from commit 50ce480abf043140e209d2d2959fbea8dd5dd2ab)
2024-11-15 15:43:29 -06:00
Weblate
2726787ee9 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Anonymous <noreply@weblate.org>
Co-authored-by: GkhnGRBZ <gkhn.gurbuz@hotmail.com>
Co-authored-by: My name is Svetoslav Kolev <slubchev@yahoo.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ar/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/bg/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/cs/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/da/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/el/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/he/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hi/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hu/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/id/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/is/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/it/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ja/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ko/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pl/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ro/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ru/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/sv/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/th/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/tr/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/uk/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/vi/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/
Translation: Servarr/Prowlarr
2024-11-14 20:56:24 -06:00
bakerboy448
b917932f19 Improve No Results Messaging 2024-11-14 19:30:12 -06:00
bakerboy448
06ae85e6d1 Fixed: Updates Page Translations 2024-11-12 21:14:38 -06:00
Weblate
b1c7e98664 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Anonymous <noreply@weblate.org>
Co-authored-by: Fixer <ygj59783@zslsz.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Lars <lars.erik.heloe@gmail.com>
Co-authored-by: Lizandra Candido da Silva <lizandra.c.s@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: mytelegrambot <lacsonluxur@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ar/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/bg/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/da/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/he/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hi/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hr/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/id/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/is/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ja/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ko/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nb_NO/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pl/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ro/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/sk/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/sv/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/th/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/vi/
Translation: Servarr/Prowlarr
2024-11-08 13:45:13 +02:00
Bogdan
62479737a7 Fixed: (Torrent RSS) Clear old cookies on edit
Fixes #2275
2024-11-04 14:23:29 +02:00
Bogdan
8e69415d64 Check for disabled till value in filtering blocked providers 2024-11-03 18:16:39 +02:00
Bogdan
222dfb1821 Bump version to 1.26.1 2024-11-03 11:43:41 +02:00
359 changed files with 8841 additions and 3754 deletions

View File

@@ -2,11 +2,11 @@
// README at: https://github.com/devcontainers/templates/tree/main/src/dotnet
{
"name": "Prowlarr",
"image": "mcr.microsoft.com/devcontainers/dotnet:1-6.0",
"image": "mcr.microsoft.com/devcontainers/dotnet:1-8.0",
"features": {
"ghcr.io/devcontainers/features/node:1": {
"nodeGypDependencies": true,
"version": "16",
"version": "20",
"nvmVersion": "latest"
}
},

View File

@@ -4,11 +4,18 @@ labels: ['Type: Bug', 'Status: Needs Triage']
body:
- type: checkboxes
attributes:
label: Is there an existing issue for this?
label: I attest that there is not an existing issue for this?
description: Please search to see if an open or closed issue already exists for the bug you encountered. If a bug exists and is closed note that it may only be fixed in an unstable branch.
options:
- label: I have searched the existing open and closed issues
required: true
- type: checkboxes
attributes:
label: I attest this is not related to a Cardigann YML Indexer.
description: Please search to see if this is for a tracker [that is yml-based (Cardigann)](https://github.com/Prowlarr/indexers) these are synced to Prowlarr/Indexers from Jackett/Jackett.
options:
- label: I confirm this is not related to a Cardigann YML Indexer
required: true
- type: textarea
attributes:
label: Current Behavior
@@ -73,8 +80,8 @@ body:
required: true
- type: checkboxes
attributes:
label: Trace Logs have been provided as applicable. Reports may be closed if the required logs are not provided.
label: I attest that Trace Logs have been provided as applicable. Reports will be closed if the required logs are not provided.
description: Trace logs are generally required for all bug reports and contain `trace`. Info logs are invalid for bug reports and do not contain `debug` nor `trace`
options:
- label: I have read and followed the steps in the wiki link above and provided the required trace logs - the logs contain `trace` - that are relevant and show this issue.
- label: I attest that I have read and followed the steps in the wiki link above and provided the required trace logs - the logs contain `trace` - that are relevant and show this issue.
required: true

2
.vscode/launch.json vendored
View File

@@ -10,7 +10,7 @@
"request": "launch",
"preLaunchTask": "build dotnet",
// If you have changed target frameworks, make sure to update the program path.
"program": "${workspaceFolder}/_output/net6.0/Prowlarr",
"program": "${workspaceFolder}/_output/net8.0/Prowlarr",
"args": [],
"cwd": "${workspaceFolder}",
// For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console

View File

@@ -78,6 +78,6 @@ Thank you to [<img src="https://resources.jetbrains.com/storage/products/company
### License
- [GNU GPL v3](http://www.gnu.org/licenses/gpl.html)
- Copyright 2010-2024
- Copyright 2010-2025
Icon Credit - [Box vector created by freepik - www.freepik.com](https://www.freepik.com/vectors/box)

8
SECURITY.md Normal file
View File

@@ -0,0 +1,8 @@
# Security Policy
## Reporting a Vulnerability
Please report (suspected) security vulnerabilities on Discord (preferred) to
any of the Servarr Dev role holders (red names) or via email: development@servarr.com. You will receive a response from
us within 72 hours. If the issue is confirmed, we will release a patch as soon
as possible depending on complexity/severity.

View File

@@ -9,18 +9,18 @@ variables:
testsFolder: './_tests'
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
majorVersion: '1.26.0'
majorVersion: '2.3.3'
minorVersion: $[counter('minorVersion', 1)]
prowlarrVersion: '$(majorVersion).$(minorVersion)'
buildName: '$(Build.SourceBranchName).$(prowlarrVersion)'
sentryOrg: 'servarr'
sentryUrl: 'https://sentry.servarr.com'
dotnetVersion: '6.0.427'
dotnetVersion: '8.0.405'
nodeVersion: '20.X'
innoVersion: '6.2.2'
windowsImage: 'windows-2022'
linuxImage: 'ubuntu-20.04'
macImage: 'macOS-13'
windowsImage: 'windows-2025'
linuxImage: 'ubuntu-24.04'
macImage: 'macOS-15'
trigger:
branches:
@@ -106,7 +106,7 @@ stages:
echo "Extra platforms already enabled"
else
echo "Enabling extra platform support"
sed -i.ORI 's/osx-x64/osx-x64;freebsd-x64;linux-x86/' $BUNDLEDVERSIONS
sed -i.ORI 's/osx-x64/osx-x64;freebsd-x64/' "$BUNDLEDVERSIONS"
fi
displayName: Enable Extra Platform Support
- bash: ./build.sh --backend --enable-extra-platforms
@@ -122,27 +122,23 @@ stages:
artifact: '$(osName)Backend'
displayName: Publish Backend
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- publish: '$(testsFolder)/net6.0/win-x64/publish'
- publish: '$(testsFolder)/net8.0/win-x64/publish'
artifact: win-x64-tests
displayName: Publish win-x64 Test Package
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- publish: '$(testsFolder)/net6.0/linux-x64/publish'
- publish: '$(testsFolder)/net8.0/linux-x64/publish'
artifact: linux-x64-tests
displayName: Publish linux-x64 Test Package
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- publish: '$(testsFolder)/net6.0/linux-x86/publish'
artifact: linux-x86-tests
displayName: Publish linux-x86 Test Package
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- publish: '$(testsFolder)/net6.0/linux-musl-x64/publish'
- publish: '$(testsFolder)/net8.0/linux-musl-x64/publish'
artifact: linux-musl-x64-tests
displayName: Publish linux-musl-x64 Test Package
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- publish: '$(testsFolder)/net6.0/freebsd-x64/publish'
- publish: '$(testsFolder)/net8.0/freebsd-x64/publish'
artifact: freebsd-x64-tests
displayName: Publish freebsd-x64 Test Package
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- publish: '$(testsFolder)/net6.0/osx-x64/publish'
- publish: '$(testsFolder)/net8.0/osx-x64/publish'
artifact: osx-x64-tests
displayName: Publish osx-x64 Test Package
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
@@ -189,7 +185,7 @@ stages:
artifact: '$(osName)Frontend'
displayName: Publish Frontend
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- stage: Installer
dependsOn:
- Build_Backend
@@ -259,21 +255,21 @@ stages:
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).windows-core-x64.zip'
archiveType: 'zip'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/win-x64/net6.0
rootFolderOrFile: $(artifactsFolder)/win-x64/net8.0
- task: ArchiveFiles@2
displayName: Create win-x86 zip
inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).windows-core-x86.zip'
archiveType: 'zip'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/win-x86/net6.0
rootFolderOrFile: $(artifactsFolder)/win-x86/net8.0
- task: ArchiveFiles@2
displayName: Create osx-x64 app
inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).osx-app-core-x64.zip'
archiveType: 'zip'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/osx-x64-app/net6.0
rootFolderOrFile: $(artifactsFolder)/osx-x64-app/net8.0
- task: ArchiveFiles@2
displayName: Create osx-x64 tar
inputs:
@@ -281,14 +277,14 @@ stages:
archiveType: 'tar'
tarCompression: 'gz'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/osx-x64/net6.0
rootFolderOrFile: $(artifactsFolder)/osx-x64/net8.0
- task: ArchiveFiles@2
displayName: Create osx-arm64 app
inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).osx-app-core-arm64.zip'
archiveType: 'zip'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/osx-arm64-app/net6.0
rootFolderOrFile: $(artifactsFolder)/osx-arm64-app/net8.0
- task: ArchiveFiles@2
displayName: Create osx-arm64 tar
inputs:
@@ -296,7 +292,7 @@ stages:
archiveType: 'tar'
tarCompression: 'gz'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/osx-arm64/net6.0
rootFolderOrFile: $(artifactsFolder)/osx-arm64/net8.0
- task: ArchiveFiles@2
displayName: Create linux-x64 tar
inputs:
@@ -304,7 +300,7 @@ stages:
archiveType: 'tar'
tarCompression: 'gz'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-x64/net6.0
rootFolderOrFile: $(artifactsFolder)/linux-x64/net8.0
- task: ArchiveFiles@2
displayName: Create linux-musl-x64 tar
inputs:
@@ -312,15 +308,7 @@ stages:
archiveType: 'tar'
tarCompression: 'gz'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-musl-x64/net6.0
- task: ArchiveFiles@2
displayName: Create linux-x86 tar
inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).linux-core-x86.tar.gz'
archiveType: 'tar'
tarCompression: 'gz'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-x86/net6.0
rootFolderOrFile: $(artifactsFolder)/linux-musl-x64/net8.0
- task: ArchiveFiles@2
displayName: Create linux-arm tar
inputs:
@@ -328,7 +316,7 @@ stages:
archiveType: 'tar'
tarCompression: 'gz'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-arm/net6.0
rootFolderOrFile: $(artifactsFolder)/linux-arm/net8.0
- task: ArchiveFiles@2
displayName: Create linux-musl-arm tar
inputs:
@@ -336,7 +324,7 @@ stages:
archiveType: 'tar'
tarCompression: 'gz'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-musl-arm/net6.0
rootFolderOrFile: $(artifactsFolder)/linux-musl-arm/net8.0
- task: ArchiveFiles@2
displayName: Create linux-arm64 tar
inputs:
@@ -344,7 +332,7 @@ stages:
archiveType: 'tar'
tarCompression: 'gz'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-arm64/net6.0
rootFolderOrFile: $(artifactsFolder)/linux-arm64/net8.0
- task: ArchiveFiles@2
displayName: Create linux-musl-arm64 tar
inputs:
@@ -352,7 +340,7 @@ stages:
archiveType: 'tar'
tarCompression: 'gz'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-musl-arm64/net6.0
rootFolderOrFile: $(artifactsFolder)/linux-musl-arm64/net8.0
- task: ArchiveFiles@2
displayName: Create freebsd-x64 tar
inputs:
@@ -360,7 +348,7 @@ stages:
archiveType: 'tar'
tarCompression: 'gz'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/freebsd-x64/net6.0
rootFolderOrFile: $(artifactsFolder)/freebsd-x64/net8.0
- publish: $(Build.ArtifactStagingDirectory)
artifact: 'Packages'
displayName: Publish Packages
@@ -391,7 +379,7 @@ stages:
SENTRY_AUTH_TOKEN: $(sentryAuthTokenServarr)
SENTRY_ORG: $(sentryOrg)
SENTRY_URL: $(sentryUrl)
- stage: Unit_Test
displayName: Unit Tests
dependsOn: Build_Backend
@@ -476,6 +464,7 @@ stages:
testResultsFiles: '**/TestResult.xml'
testRunTitle: '$(testName) Unit Tests'
failTaskOnFailedTests: true
failTaskOnMissingResultsFile: ne(variables['testName'], 'freebsd-x64')
- job: Unit_Docker
displayName: Unit Docker
@@ -487,29 +476,19 @@ stages:
testName: 'Musl Net Core'
artifactName: linux-musl-x64-tests
containerImage: ghcr.io/servarr/testimages:alpine
linux-x86:
testName: 'linux-x86'
artifactName: linux-x86-tests
containerImage: ghcr.io/servarr/testimages:linux-x86
pool:
vmImage: ${{ variables.linuxImage }}
container: $[ variables['containerImage'] ]
timeoutInMinutes: 10
steps:
- task: UseDotNet@2
displayName: 'Install .NET'
inputs:
version: $(dotnetVersion)
condition: and(succeeded(), ne(variables['testName'], 'linux-x86'))
- bash: |
SDKURL=$(curl -s https://api.github.com/repos/Servarr/dotnet-linux-x86/releases | jq -rc '.[].assets[].browser_download_url' | grep sdk-${DOTNETVERSION}.*gz$)
curl -fsSL $SDKURL | tar xzf - -C /opt/dotnet
displayName: 'Install .NET'
condition: and(succeeded(), eq(variables['testName'], 'linux-x86'))
- checkout: none
- task: DownloadPipelineArtifact@2
displayName: Download Test Artifact
@@ -532,7 +511,8 @@ stages:
testResultsFiles: '**/TestResult.xml'
testRunTitle: '$(testName) Unit Tests'
failTaskOnFailedTests: true
failTaskOnMissingResultsFile: true
- job: Unit_LinuxCore_Postgres14
displayName: Unit Native LinuxCore with Postgres14 Database
dependsOn: Prepare
@@ -549,7 +529,7 @@ stages:
vmImage: ${{ variables.linuxImage }}
timeoutInMinutes: 10
steps:
- task: UseDotNet@2
displayName: 'Install .net core'
@@ -585,6 +565,7 @@ stages:
testResultsFiles: '**/TestResult.xml'
testRunTitle: 'LinuxCore Postgres14 Unit Tests'
failTaskOnFailedTests: true
failTaskOnMissingResultsFile: true
- job: Unit_LinuxCore_Postgres15
displayName: Unit Native LinuxCore with Postgres15 Database
@@ -597,12 +578,12 @@ stages:
Prowlarr__Postgres__Port: '5432'
Prowlarr__Postgres__User: 'prowlarr'
Prowlarr__Postgres__Password: 'prowlarr'
pool:
vmImage: ${{ variables.linuxImage }}
timeoutInMinutes: 10
steps:
- task: UseDotNet@2
displayName: 'Install .net core'
@@ -638,6 +619,7 @@ stages:
testResultsFiles: '**/TestResult.xml'
testRunTitle: 'LinuxCore Postgres15 Unit Tests'
failTaskOnFailedTests: true
failTaskOnMissingResultsFile: true
- stage: Integration
displayName: Integration
@@ -681,7 +663,7 @@ stages:
pool:
vmImage: $(imageName)
steps:
- task: UseDotNet@2
displayName: 'Install .net core'
@@ -703,7 +685,7 @@ stages:
targetPath: $(Build.ArtifactStagingDirectory)
- task: ExtractFiles@1
inputs:
archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)'
archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)'
destinationFolder: '$(Build.ArtifactStagingDirectory)/bin'
displayName: Extract Package
- bash: |
@@ -720,6 +702,7 @@ stages:
testResultsFiles: '**/TestResult.xml'
testRunTitle: '$(testName) Integration Tests'
failTaskOnFailedTests: true
failTaskOnMissingResultsFile: true
displayName: Publish Test Results
- job: Integration_LinuxCore_Postgres14
@@ -757,7 +740,7 @@ stages:
targetPath: $(Build.ArtifactStagingDirectory)
- task: ExtractFiles@1
inputs:
archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)'
archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)'
destinationFolder: '$(Build.ArtifactStagingDirectory)/bin'
displayName: Extract Package
- bash: |
@@ -782,6 +765,7 @@ stages:
testResultsFiles: '**/TestResult.xml'
testRunTitle: 'Integration LinuxCore Postgres14 Database Integration Tests'
failTaskOnFailedTests: true
failTaskOnMissingResultsFile: true
displayName: Publish Test Results
@@ -820,7 +804,7 @@ stages:
targetPath: $(Build.ArtifactStagingDirectory)
- task: ExtractFiles@1
inputs:
archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)'
archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)'
destinationFolder: '$(Build.ArtifactStagingDirectory)/bin'
displayName: Extract Package
- bash: |
@@ -845,6 +829,7 @@ stages:
testResultsFiles: '**/TestResult.xml'
testRunTitle: 'Integration LinuxCore Postgres15 Database Integration Tests'
failTaskOnFailedTests: true
failTaskOnMissingResultsFile: true
displayName: Publish Test Results
- job: Integration_FreeBSD
@@ -891,6 +876,7 @@ stages:
testResultsFiles: '**/TestResult.xml'
testRunTitle: 'FreeBSD Integration Tests'
failTaskOnFailedTests: true
failTaskOnMissingResultsFile: false
displayName: Publish Test Results
- job: Integration_Docker
@@ -904,29 +890,18 @@ stages:
artifactName: linux-musl-x64-tests
containerImage: ghcr.io/servarr/testimages:alpine
pattern: 'Prowlarr.*.linux-musl-core-x64.tar.gz'
linux-x86:
testName: 'linux-x86'
artifactName: linux-x86-tests
containerImage: ghcr.io/servarr/testimages:linux-x86
pattern: 'Prowlarr.*.linux-core-x86.tar.gz'
pool:
vmImage: ${{ variables.linuxImage }}
container: $[ variables['containerImage'] ]
timeoutInMinutes: 15
steps:
- task: UseDotNet@2
displayName: 'Install .NET'
inputs:
version: $(dotnetVersion)
condition: and(succeeded(), ne(variables['testName'], 'linux-x86'))
- bash: |
SDKURL=$(curl -s https://api.github.com/repos/Servarr/dotnet-linux-x86/releases | jq -rc '.[].assets[].browser_download_url' | grep sdk-${DOTNETVERSION}.*gz$)
curl -fsSL $SDKURL | tar xzf - -C /opt/dotnet
displayName: 'Install .NET'
condition: and(succeeded(), eq(variables['testName'], 'linux-x86'))
- checkout: none
- task: DownloadPipelineArtifact@2
displayName: Download Test Artifact
@@ -943,7 +918,7 @@ stages:
targetPath: $(Build.ArtifactStagingDirectory)
- task: ExtractFiles@1
inputs:
archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)'
archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)'
destinationFolder: '$(Build.ArtifactStagingDirectory)/bin'
displayName: Extract Package
- bash: |
@@ -960,12 +935,13 @@ stages:
testResultsFiles: '**/TestResult.xml'
testRunTitle: '$(testName) Integration Tests'
failTaskOnFailedTests: true
failTaskOnMissingResultsFile: true
displayName: Publish Test Results
- stage: Automation
displayName: Automation
dependsOn: Packages
jobs:
- job: Automation
strategy:
@@ -991,7 +967,7 @@ stages:
pool:
vmImage: $(imageName)
steps:
- task: UseDotNet@2
displayName: 'Install .net core'
@@ -1013,7 +989,7 @@ stages:
targetPath: $(Build.ArtifactStagingDirectory)
- task: ExtractFiles@1
inputs:
archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)'
archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)'
destinationFolder: '$(Build.ArtifactStagingDirectory)/bin'
displayName: Extract Package
- bash: |
@@ -1041,6 +1017,7 @@ stages:
testResultsFiles: '**/TestResult.xml'
testRunTitle: '$(osName) Automation Tests'
failTaskOnFailedTests: $(failBuild)
failTaskOnMissingResultsFile: $(failBuild)
displayName: Publish Test Results
- stage: Analyze
@@ -1116,7 +1093,7 @@ stages:
- checkout: self
submodules: true
persistCredentials: true
fetchDepth: 1
fetchDepth: 1
- bash: ./docs.sh Windows
displayName: Create openapi.json
- bash: |
@@ -1169,34 +1146,35 @@ stages:
submodules: true
- powershell: Set-Service SCardSvr -StartupType Manual
displayName: Enable Windows Test Service
- task: SonarCloudPrepare@2
- task: SonarCloudPrepare@3
condition: eq(variables['System.PullRequest.IsFork'], 'False')
inputs:
SonarCloud: 'SonarCloud'
organization: 'prowlarr'
scannerMode: 'MSBuild'
scannerMode: 'dotnet'
projectKey: 'Prowlarr_Prowlarr'
projectName: 'Prowlarr'
projectVersion: '$(prowlarrVersion)'
extraProperties: |
sonar.exclusions=**/obj/**,**/*.dll,**/NzbDrone.Core.Test/Files/**/*,./frontend/**,**/ExternalModules/**,./src/Libraries/**
sonar.coverage.exclusions=**/Prowlarr.Api.V1/**/*
sonar.cs.opencover.reportsPaths=$(Build.SourcesDirectory)/CoverageResults/**/coverage.opencover.xml
sonar.cs.cobertura.reportsPaths=$(Build.SourcesDirectory)/CoverageResults/**/coverage.cobertura.xml
sonar.cs.nunit.reportsPaths=$(Build.SourcesDirectory)/TestResult.xml
- bash: |
./build.sh --backend -f net6.0 -r win-x64
TEST_DIR=_tests/net6.0/win-x64/publish/ ./test.sh Windows Unit Coverage
./build.sh --backend -f net8.0 -r win-x64
TEST_DIR=_tests/net8.0/win-x64/publish/ ./test.sh Windows Unit Coverage
displayName: Coverage Unit Tests
- task: SonarCloudAnalyze@2
- task: SonarCloudAnalyze@3
condition: eq(variables['System.PullRequest.IsFork'], 'False')
displayName: Publish SonarCloud Results
- task: reportgenerator@5
displayName: Generate Coverage Report
inputs:
reports: '$(Build.SourcesDirectory)/CoverageResults/**/coverage.opencover.xml'
reports: '$(Build.SourcesDirectory)/CoverageResults/**/coverage.cobertura.xml'
targetdir: '$(Build.SourcesDirectory)/CoverageResults/combined'
reporttypes: 'HtmlInline_AzurePipelines;Cobertura;Badges'
publishCodeCoverageResults: true
sourcedirs: src
- stage: Report_Out
dependsOn:
@@ -1228,4 +1206,3 @@ stages:
DISCORDCHANNELID: $(discordChannelId)
DISCORDWEBHOOKKEY: $(discordWebhookKey)
DISCORDTHREADID: $(discordThreadId)

View File

@@ -33,14 +33,14 @@ EnableExtraPlatformsInSDK()
echo "Extra platforms already enabled"
else
echo "Enabling extra platform support"
sed -i.ORI 's/osx-x64/osx-x64;freebsd-x64;linux-x86/' $BUNDLEDVERSIONS
sed -i.ORI 's/osx-x64/osx-x64;freebsd-x64/' "$BUNDLEDVERSIONS"
fi
}
EnableExtraPlatforms()
{
if grep -qv freebsd-x64 src/Directory.Build.props; then
sed -i'' -e "s^<RuntimeIdentifiers>\(.*\)</RuntimeIdentifiers>^<RuntimeIdentifiers>\1;freebsd-x64;linux-x86</RuntimeIdentifiers>^g" src/Directory.Build.props
sed -i'' -e "s^<RuntimeIdentifiers>\(.*\)</RuntimeIdentifiers>^<RuntimeIdentifiers>\1;freebsd-x64</RuntimeIdentifiers>^g" src/Directory.Build.props
fi
}
@@ -79,9 +79,9 @@ Build()
if [[ -z "$RID" || -z "$FRAMEWORK" ]];
then
dotnet msbuild -restore $slnFile -p:Configuration=Release -p:Platform=$platform -t:PublishAllRids
dotnet msbuild -restore $slnFile -p:SelfContained=True -p:Configuration=Release -p:Platform=$platform -t:PublishAllRids
else
dotnet msbuild -restore $slnFile -p:Configuration=Release -p:Platform=$platform -p:RuntimeIdentifiers=$RID -t:PublishAllRids
dotnet msbuild -restore $slnFile -p:SelfContained=True -p:Configuration=Release -p:Platform=$platform -p:RuntimeIdentifiers=$RID -t:PublishAllRids
fi
ProgressEnd 'Build'
@@ -137,7 +137,7 @@ PackageLinux()
echo "Adding Prowlarr.Mono to UpdatePackage"
cp $folder/Prowlarr.Mono.* $folder/Prowlarr.Update
if [ "$framework" = "net6.0" ]; then
if [ "$framework" = "net8.0" ]; then
cp $folder/Mono.Posix.NETStandard.* $folder/Prowlarr.Update
cp $folder/libMonoPosixHelper.* $folder/Prowlarr.Update
fi
@@ -165,7 +165,7 @@ PackageMacOS()
echo "Adding Prowlarr.Mono to UpdatePackage"
cp $folder/Prowlarr.Mono.* $folder/Prowlarr.Update
if [ "$framework" = "net6.0" ]; then
if [ "$framework" = "net8.0" ]; then
cp $folder/Mono.Posix.NETStandard.* $folder/Prowlarr.Update
cp $folder/libMonoPosixHelper.* $folder/Prowlarr.Update
fi
@@ -377,15 +377,14 @@ then
Build
if [[ -z "$RID" || -z "$FRAMEWORK" ]];
then
PackageTests "net6.0" "win-x64"
PackageTests "net6.0" "win-x86"
PackageTests "net6.0" "linux-x64"
PackageTests "net6.0" "linux-musl-x64"
PackageTests "net6.0" "osx-x64"
PackageTests "net8.0" "win-x64"
PackageTests "net8.0" "win-x86"
PackageTests "net8.0" "linux-x64"
PackageTests "net8.0" "linux-musl-x64"
PackageTests "net8.0" "osx-x64"
if [ "$ENABLE_EXTRA_PLATFORMS" = "YES" ];
then
PackageTests "net6.0" "freebsd-x64"
PackageTests "net6.0" "linux-x86"
PackageTests "net8.0" "freebsd-x64"
fi
else
PackageTests "$FRAMEWORK" "$RID"
@@ -413,20 +412,19 @@ then
if [[ -z "$RID" || -z "$FRAMEWORK" ]];
then
Package "net6.0" "win-x64"
Package "net6.0" "win-x86"
Package "net6.0" "linux-x64"
Package "net6.0" "linux-musl-x64"
Package "net6.0" "linux-arm64"
Package "net6.0" "linux-musl-arm64"
Package "net6.0" "linux-arm"
Package "net6.0" "linux-musl-arm"
Package "net6.0" "osx-x64"
Package "net6.0" "osx-arm64"
Package "net8.0" "win-x64"
Package "net8.0" "win-x86"
Package "net8.0" "linux-x64"
Package "net8.0" "linux-musl-x64"
Package "net8.0" "linux-arm64"
Package "net8.0" "linux-musl-arm64"
Package "net8.0" "linux-arm"
Package "net8.0" "linux-musl-arm"
Package "net8.0" "osx-x64"
Package "net8.0" "osx-arm64"
if [ "$ENABLE_EXTRA_PLATFORMS" = "YES" ];
then
Package "net6.0" "freebsd-x64"
Package "net6.0" "linux-x86"
Package "net8.0" "freebsd-x64"
fi
else
Package "$FRAMEWORK" "$RID"
@@ -436,7 +434,7 @@ fi
if [ "$INSTALLER" = "YES" ];
then
InstallInno
BuildInstaller "net6.0" "win-x64"
BuildInstaller "net6.0" "win-x86"
BuildInstaller "net8.0" "win-x64"
BuildInstaller "net8.0" "win-x86"
RemoveInno
fi

13
docs.sh
View File

@@ -1,17 +1,18 @@
#!/bin/bash
set -e
FRAMEWORK="net6.0"
FRAMEWORK="net8.0"
PLATFORM=$1
ARCHITECTURE="${2:-x64}"
if [ "$PLATFORM" = "Windows" ]; then
RUNTIME="win-x64"
RUNTIME="win-$ARCHITECTURE"
elif [ "$PLATFORM" = "Linux" ]; then
RUNTIME="linux-x64"
RUNTIME="linux-$ARCHITECTURE"
elif [ "$PLATFORM" = "Mac" ]; then
RUNTIME="osx-x64"
RUNTIME="osx-$ARCHITECTURE"
else
echo "Platform must be provided as first arguement: Windows, Linux or Mac"
echo "Platform must be provided as first argument: Windows, Linux or Mac"
exit 1
fi
@@ -37,7 +38,7 @@ dotnet clean $slnFile -c Release
dotnet msbuild -restore $slnFile -p:Configuration=Debug -p:Platform=$platform -p:RuntimeIdentifiers=$RUNTIME -t:PublishAllRids
dotnet new tool-manifest
dotnet tool install --version 6.6.2 Swashbuckle.AspNetCore.Cli
dotnet tool install --version 8.1.4 Swashbuckle.AspNetCore.Cli
dotnet tool run swagger tofile --output ./src/Prowlarr.Api.V1/openapi.json "$outputFolder/$FRAMEWORK/$RUNTIME/$application" v1 &

View File

@@ -25,6 +25,7 @@ module.exports = (env) => {
const config = {
mode: isProduction ? 'production' : 'development',
devtool: isProduction ? 'source-map' : 'eval-source-map',
target: 'web',
stats: {
children: false
@@ -169,7 +170,7 @@ module.exports = (env) => {
loose: true,
debug: false,
useBuiltIns: 'entry',
corejs: 3
corejs: '3.42'
}
]
]

View File

@@ -20,6 +20,8 @@ import HintedSelectInputSelectedValue from './HintedSelectInputSelectedValue';
import TextInput from './TextInput';
import styles from './EnhancedSelectInput.css';
const MINIMUM_DISTANCE_FROM_EDGE = 10;
function isArrowKey(keyCode) {
return keyCode === keyCodes.UP_ARROW || keyCode === keyCodes.DOWN_ARROW;
}
@@ -137,18 +139,9 @@ class EnhancedSelectInput extends Component {
// Listeners
onComputeMaxHeight = (data) => {
const {
top,
bottom
} = data.offsets.reference;
const windowHeight = window.innerHeight;
if ((/^botton/).test(data.placement)) {
data.styles.maxHeight = windowHeight - bottom;
} else {
data.styles.maxHeight = top;
}
data.styles.maxHeight = windowHeight - MINIMUM_DISTANCE_FROM_EDGE;
return data;
};
@@ -460,6 +453,10 @@ class EnhancedSelectInput extends Component {
order: 851,
enabled: true,
fn: this.onComputeMaxHeight
},
preventOverflow: {
enabled: true,
boundariesElement: 'viewport'
}
}}
>

View File

@@ -19,6 +19,7 @@
.modal {
position: relative;
display: flex;
max-width: 90%;
max-height: 90%;
border-radius: 6px;
opacity: 1;

View File

@@ -24,6 +24,7 @@
composes: link;
padding: 10px 24px;
padding-left: 35px;
}
.isActiveLink {
@@ -41,10 +42,6 @@
text-align: center;
}
.noIcon {
margin-left: 25px;
}
.status {
float: right;
}

View File

@@ -8,7 +8,6 @@ interface CssExports {
'isActiveParentLink': string;
'item': string;
'link': string;
'noIcon': string;
'status': string;
}
export const cssExports: CssExports;

View File

@@ -63,9 +63,7 @@ class PageSidebarItem extends Component {
</span>
}
<span className={isChildItem ? styles.noIcon : null}>
{typeof title === 'function' ? title() : title}
</span>
{typeof title === 'function' ? title() : title}
{
!!StatusComponent &&

View File

@@ -22,11 +22,14 @@
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
height: 24px;
}
.label {
padding: 0 3px;
max-width: 100%;
max-height: 100%;
color: var(--toolbarLabelColor);
font-size: $extraSmallFontSize;
line-height: calc($extraSmallFontSize + 1px);

View File

@@ -23,6 +23,7 @@ function PageToolbarButton(props) {
isDisabled && styles.isDisabled
)}
isDisabled={isDisabled || isSpinning}
title={label}
{...otherProps}
>
<Icon

View File

@@ -65,17 +65,30 @@ class VirtualTable extends Component {
if (this._grid && scrollTop !== undefined && scrollTop !== 0 && !scrollRestored) {
this.setState({ scrollRestored: true });
this._grid.scrollToPosition({ scrollTop });
this._gridScrollToPosition({ scrollTop });
}
if (scrollIndex != null && scrollIndex !== prevProps.scrollIndex) {
this._grid.scrollToCell({
this._gridScrollToCell({
rowIndex: scrollIndex,
columnIndex: 0
});
}
}
_gridScrollToCell = ({ rowIndex = 0, columnIndex = 0 }) => {
const scrollOffset = this._grid.getOffsetForCell({
rowIndex,
columnIndex
});
this._gridScrollToPosition(scrollOffset);
};
_gridScrollToPosition = ({ scrollTop = 0, scrollLeft = 0 }) => {
this.props.scroller?.scrollTo({ top: scrollTop, left: scrollLeft });
};
//
// Control

View File

@@ -0,0 +1,56 @@
import { useEffect, useState } from 'react';
import { useSelector } from 'react-redux';
import { createSelector } from 'reselect';
import AppState from 'App/State/AppState';
import themes from 'Styles/Themes';
function createThemeSelector() {
return createSelector(
(state: AppState) => state.settings.ui.item.theme || window.Prowlarr.theme,
(theme) => theme
);
}
const useTheme = () => {
const selectedTheme = useSelector(createThemeSelector());
const [resolvedTheme, setResolvedTheme] = useState(selectedTheme);
useEffect(() => {
if (selectedTheme !== 'auto') {
setResolvedTheme(selectedTheme);
return;
}
const applySystemTheme = () => {
setResolvedTheme(
window.matchMedia('(prefers-color-scheme: dark)').matches
? 'dark'
: 'light'
);
};
applySystemTheme();
window
.matchMedia('(prefers-color-scheme: dark)')
.addEventListener('change', applySystemTheme);
return () => {
window
.matchMedia('(prefers-color-scheme: dark)')
.removeEventListener('change', applySystemTheme);
};
}, [selectedTheme]);
return resolvedTheme;
};
export default useTheme;
export const useThemeColor = (color: string) => {
const theme = useTheme();
const themeVariables = themes[theme];
// @ts-expect-error - themeVariables is a string indexable type
return themeVariables[color];
};

View File

@@ -257,6 +257,7 @@ class HistoryRow extends Component {
key={parameter.key}
title={parameter.title}
value={data[parameter.key]}
queryType={data.queryType}
/>
);
}

View File

@@ -1,14 +1,16 @@
import React from 'react';
import Link from 'Components/Link/Link';
import { HistoryQueryType } from 'typings/History';
import styles from './HistoryRowParameter.css';
interface HistoryRowParameterProps {
title: string;
value: string;
queryType: HistoryQueryType;
}
function HistoryRowParameter(props: HistoryRowParameterProps) {
const { title, value } = props;
const { title, value, queryType } = props;
const type = title.toLowerCase();
@@ -18,7 +20,13 @@ function HistoryRowParameter(props: HistoryRowParameterProps) {
link = <Link to={`https://imdb.com/title/${value}/`}>{value}</Link>;
} else if (type === 'tmdb') {
link = (
<Link to={`https://www.themoviedb.org/movie/${value}`}>{value}</Link>
<Link
to={`https://www.themoviedb.org/${
queryType === 'tvsearch' ? 'tv' : 'movie'
}/${value}`}
>
{value}
</Link>
);
} else if (type === 'tvdb') {
link = (

View File

@@ -33,6 +33,7 @@
.scroller {
flex: 1 1 auto;
min-height: 400px;
}
.filterRow {
@@ -57,29 +58,68 @@
font-weight: bold;
}
.filtersToggle {
display: none;
align-items: center;
margin-bottom: 10px;
padding: 8px 12px;
border: 1px solid var(--borderColor);
border-radius: 4px;
background: transparent;
color: var(--textColor);
font-size: 14px;
cursor: pointer;
gap: 8px;
}
.filtersToggle:hover {
background-color: var(--hoverBackgroundColor);
}
@media only screen and (max-width: $breakpointSmall) {
.filterInput {
margin-bottom: 5px;
margin-bottom: 8px;
}
.alert {
.notice {
display: none;
}
.filtersToggle {
display: flex;
}
.filterRow {
display: block;
margin-bottom: 10px;
padding: 10px;
border: 1px solid var(--borderColor);
border-radius: 4px;
background-color: var(--cardBackgroundColor);
}
.filterRowCollapsed {
display: none !important;
}
.filterContainer {
margin-right: 0;
margin-bottom: 5px;
margin-bottom: 8px;
}
.filterContainer:last-child {
margin-bottom: 0;
}
.scroller {
margin-right: -30px;
margin-bottom: -30px;
margin-left: -30px;
margin-right: -15px;
margin-bottom: -15px;
margin-left: -15px;
min-height: 300px;
}
.modalBody {
padding: 15px;
}
}

View File

@@ -7,6 +7,8 @@ interface CssExports {
'filterInput': string;
'filterLabel': string;
'filterRow': string;
'filterRowCollapsed': string;
'filtersToggle': string;
'indexers': string;
'modalBody': string;
'modalFooter': string;

View File

@@ -1,3 +1,4 @@
import classNames from 'classnames';
import { some } from 'lodash';
import React, { useCallback, useEffect, useMemo, useState } from 'react';
import { useDispatch, useSelector } from 'react-redux';
@@ -7,6 +8,7 @@ import Alert from 'Components/Alert';
import EnhancedSelectInput from 'Components/Form/EnhancedSelectInput';
import NewznabCategorySelectInputConnector from 'Components/Form/NewznabCategorySelectInputConnector';
import TextInput from 'Components/Form/TextInput';
import Icon from 'Components/Icon';
import Button from 'Components/Link/Button';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import ModalBody from 'Components/Modal/ModalBody';
@@ -16,7 +18,7 @@ import ModalHeader from 'Components/Modal/ModalHeader';
import Scroller from 'Components/Scroller/Scroller';
import Table from 'Components/Table/Table';
import TableBody from 'Components/Table/TableBody';
import { kinds, scrollDirections } from 'Helpers/Props';
import { icons, kinds, scrollDirections } from 'Helpers/Props';
import Indexer, { IndexerCategory } from 'Indexer/Indexer';
import {
fetchIndexerSchema,
@@ -152,6 +154,7 @@ function AddIndexerModalContent(props: AddIndexerModalContentProps) {
const [filterLanguages, setFilterLanguages] = useState<string[]>([]);
const [filterPrivacyLevels, setFilterPrivacyLevels] = useState<string[]>([]);
const [filterCategories, setFilterCategories] = useState<number[]>([]);
const [isFiltersCollapsed, setIsFiltersCollapsed] = useState(true);
useEffect(
() => {
@@ -196,6 +199,10 @@ function AddIndexerModalContent(props: AddIndexerModalContentProps) {
[setFilterCategories]
);
const handleToggleFilters = useCallback(() => {
setIsFiltersCollapsed(!isFiltersCollapsed);
}, [isFiltersCollapsed]);
const onIndexerSelect = useCallback(
({
implementation,
@@ -322,7 +329,17 @@ function AddIndexerModalContent(props: AddIndexerModalContentProps) {
onChange={onFilterChange}
/>
<div className={styles.filterRow}>
<Button className={styles.filtersToggle} onPress={handleToggleFilters}>
<Icon name={isFiltersCollapsed ? icons.EXPAND : icons.COLLAPSE} />
{translate('Filters')}
</Button>
<div
className={classNames(
styles.filterRow,
isFiltersCollapsed && styles.filterRowCollapsed
)}
>
<div className={styles.filterContainer}>
<label className={styles.filterLabel}>
{translate('Protocol')}

View File

@@ -68,6 +68,7 @@ function IndexerHistoryRow(props: IndexerHistoryRowProps) {
key={parameter.key}
title={parameter.title}
value={data[parameter.key as keyof HistoryData].toString()}
queryType={data.queryType}
/>
);
})}

View File

@@ -21,7 +21,7 @@ function createMapStateToProps() {
) => {
// If a release is deleted this selector may fire before the parent
// selecors, which will result in an undefined release, if that happens
// selectors, which will result in an undefined release, if that happens
// we want to return early here and again in the render function to avoid
// trying to show a release that has no information available.

View File

@@ -30,7 +30,9 @@ export const authenticationMethodOptions = [
key: 'basic',
get value() {
return translate('AuthBasic');
}
},
isDisabled: true,
isHidden: true
},
{
key: 'forms',

View File

@@ -419,7 +419,7 @@ export const reducers = createHandleActions({
const items = newState.items;
const index = items.findIndex((item) => item.guid === guid);
// Don't try to update if there isnt a matching item (the user closed the modal)
// Don't try to update if there isn't a matching item (the user closed the modal)
if (index >= 0) {
const item = Object.assign({}, items[index], payload);

View File

@@ -2,8 +2,8 @@ import { createSelector } from 'reselect';
import { isCommandExecuting } from 'Utilities/Command';
import createCommandSelector from './createCommandSelector';
function createCommandExecutingSelector(name: string, contraints = {}) {
return createSelector(createCommandSelector(name, contraints), (command) => {
function createCommandExecutingSelector(name: string, constraints = {}) {
return createSelector(createCommandSelector(name, constraints), (command) => {
return isCommandExecuting(command);
});
}

View File

@@ -2,9 +2,9 @@ import { createSelector } from 'reselect';
import { findCommand } from 'Utilities/Command';
import createCommandsSelector from './createCommandsSelector';
function createCommandSelector(name: string, contraints = {}) {
function createCommandSelector(name: string, constraints = {}) {
return createSelector(createCommandsSelector(), (commands) => {
return findCommand(commands, { name, ...contraints });
return findCommand(commands, { name, ...constraints });
});
}

View File

@@ -17,7 +17,7 @@ export async function fetchTranslations(): Promise<boolean> {
translations = data.Strings;
resolve(true);
} catch (error) {
} catch {
resolve(false);
}
});

View File

@@ -1,5 +1,12 @@
import ModelBase from 'App/ModelBase';
export type HistoryQueryType =
| 'search'
| 'tvsearch'
| 'movie'
| 'book'
| 'music';
export interface HistoryData {
source: string;
host: string;
@@ -7,7 +14,7 @@ export interface HistoryData {
offset: number;
elapsedTime: number;
query: string;
queryType: string;
queryType: HistoryQueryType;
}
interface History extends ModelBase {

5
global.json Normal file
View File

@@ -0,0 +1,5 @@
{
"sdk": {
"version": "8.0.405"
}
}

View File

@@ -23,17 +23,17 @@
"defaults"
],
"dependencies": {
"@fortawesome/fontawesome-free": "6.6.0",
"@fortawesome/fontawesome-svg-core": "6.6.0",
"@fortawesome/free-regular-svg-icons": "6.6.0",
"@fortawesome/free-solid-svg-icons": "6.6.0",
"@fortawesome/fontawesome-free": "6.7.2",
"@fortawesome/fontawesome-svg-core": "6.7.2",
"@fortawesome/free-regular-svg-icons": "6.7.2",
"@fortawesome/free-solid-svg-icons": "6.7.2",
"@fortawesome/react-fontawesome": "0.2.2",
"@juggle/resize-observer": "3.4.0",
"@microsoft/signalr": "6.0.25",
"@microsoft/signalr": "8.0.7",
"@sentry/browser": "7.119.1",
"@sentry/integrations": "7.119.1",
"@types/node": "20.16.11",
"@types/react": "18.2.79",
"@types/react": "18.3.21",
"@types/react-dom": "18.2.25",
"chart.js": "4.4.4",
"classnames": "2.5.1",
@@ -71,9 +71,9 @@
"react-router-dom": "5.2.0",
"react-tabs": "4.3.0",
"react-text-truncate": "0.19.0",
"react-use-measure": "2.1.1",
"react-virtualized": "9.21.1",
"react-window": "1.8.10",
"react-use-measure": "2.1.7",
"react-virtualized": "9.22.6",
"react-window": "1.8.11",
"redux": "4.2.1",
"redux-actions": "2.6.5",
"redux-batched-actions": "0.5.0",
@@ -81,30 +81,30 @@
"redux-thunk": "2.4.2",
"reselect": "4.1.8",
"stacktrace-js": "2.0.2",
"typescript": "5.1.6"
"typescript": "5.7.2"
},
"devDependencies": {
"@babel/core": "7.25.8",
"@babel/eslint-parser": "7.25.8",
"@babel/plugin-proposal-export-default-from": "7.25.8",
"@babel/core": "7.27.1",
"@babel/eslint-parser": "7.27.1",
"@babel/plugin-proposal-export-default-from": "7.27.1",
"@babel/plugin-syntax-dynamic-import": "7.8.3",
"@babel/preset-env": "7.25.8",
"@babel/preset-react": "7.25.7",
"@babel/preset-typescript": "7.25.7",
"@babel/preset-env": "7.27.2",
"@babel/preset-react": "7.27.1",
"@babel/preset-typescript": "7.27.1",
"@types/lodash": "4.14.195",
"@types/react-document-title": "2.0.10",
"@types/react-router-dom": "5.3.3",
"@types/react-text-truncate": "0.19.0",
"@types/react-window": "1.8.8",
"@types/webpack-livereload-plugin": "2.3.6",
"@typescript-eslint/eslint-plugin": "6.21.0",
"@typescript-eslint/parser": "6.21.0",
"@typescript-eslint/eslint-plugin": "8.18.1",
"@typescript-eslint/parser": "8.18.1",
"are-you-es5": "2.1.2",
"autoprefixer": "10.4.20",
"babel-loader": "9.2.1",
"babel-plugin-inline-classnames": "2.0.1",
"babel-plugin-transform-react-remove-prop-types": "0.4.24",
"core-js": "3.38.1",
"core-js": "3.42.0",
"css-loader": "6.7.3",
"css-modules-typescript-loader": "4.0.1",
"eslint": "8.57.1",

View File

@@ -84,7 +84,7 @@
<Deterministic Condition="$(AssemblyVersion.EndsWith('*'))">False</Deterministic>
<PathMap>$(MSBuildProjectDirectory)=./$(MSBuildProjectName)/</PathMap>
<PathMap>$(MSBuildThisFileDirectory)=./</PathMap>
</PropertyGroup>
<!-- Set the AssemblyConfiguration attribute for projects -->
@@ -99,13 +99,6 @@
<RootNamespace Condition="'$(ProwlarrProject)'=='true'">$(MSBuildProjectName.Replace('Prowlarr','NzbDrone'))</RootNamespace>
</PropertyGroup>
<ItemGroup Condition="'$(TestProject)'!='true'">
<!-- Annotates .NET assemblies with repository information including SHA -->
<!-- Sentry uses this to link directly to GitHub at the exact version/file/line -->
<!-- This is built-in on .NET 8 and can be removed once the project is updated -->
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.1.1" PrivateAssets="All" />
</ItemGroup>
<!-- Sentry specific configuration: Only in Release mode -->
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
<!-- https://docs.sentry.io/platforms/dotnet/configuration/msbuild/ -->
@@ -130,14 +123,11 @@
<!-- Standard testing packages -->
<ItemGroup Condition="'$(TestProject)'=='true'">
<PackageReference Include="coverlet.collector" Version="6.0.4" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.10.0" />
<PackageReference Include="NUnit" Version="3.14.0" />
<PackageReference Include="NUnit3TestAdapter" Version="4.2.1" />
<PackageReference Include="NunitXml.TestLogger" Version="3.0.131" />
</ItemGroup>
<ItemGroup Condition="'$(TestProject)'=='true' and '$(TargetFramework)'=='net6.0'">
<PackageReference Include="coverlet.collector" Version="3.0.4-preview.27.ge7cb7c3b40" />
<PackageReference Include="NUnit3TestAdapter" Version="5.1.0" />
<PackageReference Include="NunitXml.TestLogger" Version="3.1.20" />
</ItemGroup>
<PropertyGroup Condition="'$(ProwlarrProject)'=='true' and '$(EnableAnalyzers)'=='false'">
@@ -148,9 +138,9 @@
<!-- Set up stylecop -->
<ItemGroup Condition="'$(ProwlarrProject)'=='true' and '$(EnableAnalyzers)'!='false'">
<!-- StyleCop analysis -->
<PackageReference Include="StyleCop.Analyzers" Version="1.1.118">
<PackageReference Include="StyleCop.Analyzers.Unstable" Version="1.2.0.556">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<AdditionalFiles Include="$(SolutionDir)stylecop.json" />
</ItemGroup>
@@ -221,7 +211,7 @@
<PropertyGroup Condition="'$(IsOSX)' == 'true' and
'$(RuntimeIdentifier)' == ''">
<_UsingDefaultRuntimeIdentifier>true</_UsingDefaultRuntimeIdentifier>
<RuntimeIdentifier>osx-x64</RuntimeIdentifier>
<RuntimeIdentifier>osx-$(Architecture)</RuntimeIdentifier>
</PropertyGroup>
</Project>

View File

@@ -5,8 +5,6 @@
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
<add key="dotnet-bsd-crossbuild" value="https://pkgs.dev.azure.com/Servarr/Servarr/_packaging/dotnet-bsd-crossbuild/nuget/v3/index.json" />
<add key="Mono.Posix.NETStandard" value="https://pkgs.dev.azure.com/Servarr/Servarr/_packaging/Mono.Posix.NETStandard/nuget/v3/index.json" />
<add key="SQLite" value="https://pkgs.dev.azure.com/Servarr/Servarr/_packaging/SQLite/nuget/v3/index.json" />
<add key="coverlet-nightly" value="https://pkgs.dev.azure.com/Servarr/coverlet/_packaging/coverlet-nightly/nuget/v3/index.json" />
<add key="FluentMigrator" value="https://pkgs.dev.azure.com/Servarr/Servarr/_packaging/FluentMigrator/nuget/v3/index.json" />
</packageSources>
</configuration>

View File

@@ -39,15 +39,16 @@ namespace NzbDrone.Automation.Test
var service = ChromeDriverService.CreateDefaultService();
// Timeout as windows automation tests seem to take alot longer to get going
driver = new ChromeDriver(service, options, new TimeSpan(0, 3, 0));
driver = new ChromeDriver(service, options, TimeSpan.FromMinutes(3));
driver.Manage().Window.Size = new System.Drawing.Size(1920, 1080);
driver.Manage().Window.FullScreen();
_runner = new NzbDroneRunner(LogManager.GetCurrentClassLogger(), null);
_runner.KillAll();
_runner.Start(true);
driver.Url = "http://localhost:9696";
driver.Navigate().GoToUrl("http://localhost:9696");
var page = new PageBase(driver);
page.WaitForNoSpinner();
@@ -67,7 +68,7 @@ namespace NzbDrone.Automation.Test
{
try
{
var image = ((ITakesScreenshot)driver).GetScreenshot();
var image = (driver as ITakesScreenshot).GetScreenshot();
image.SaveAsFile($"./{name}_test_screenshot.png", ScreenshotImageFormat.Png);
}
catch (Exception ex)

View File

@@ -7,12 +7,11 @@ namespace NzbDrone.Automation.Test.PageModel
{
public class PageBase
{
private readonly WebDriver _driver;
private readonly IWebDriver _driver;
public PageBase(WebDriver driver)
public PageBase(IWebDriver driver)
{
_driver = driver;
driver.Manage().Window.Maximize();
}
public IWebElement FindByClass(string className, int timeout = 5)

View File

@@ -1,10 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net6.0</TargetFrameworks>
<TargetFrameworks>net8.0</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Selenium.Support" Version="4.1.0" />
<PackageReference Include="Selenium.WebDriver.ChromeDriver" Version="99.0.4844.5100" />
<PackageReference Include="Selenium.WebDriver.ChromeDriver" Version="134.0.6998.16500" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NzbDrone.Test.Common\Prowlarr.Test.Common.csproj" />

View File

@@ -10,13 +10,13 @@ namespace NzbDrone.Common.Test.EnvironmentInfo
[Test]
public void should_return_version()
{
BuildInfo.Version.Major.Should().BeOneOf(0, 1, 10);
BuildInfo.Version.Major.Should().BeOneOf(0, 2, 10);
}
[Test]
public void should_get_branch()
{
BuildInfo.Branch.Should().NotBe("unknow");
BuildInfo.Branch.Should().NotBe("unknown");
BuildInfo.Branch.Should().NotBeNullOrWhiteSpace();
}
}

View File

@@ -21,9 +21,28 @@ namespace NzbDrone.Common.Test.ExtensionTests
[TestCase("1.2.3.4")]
[TestCase("172.55.0.1")]
[TestCase("192.55.0.1")]
[TestCase("100.64.0.1")]
[TestCase("100.127.255.254")]
public void should_return_false_for_public_ip_address(string ipAddress)
{
IPAddress.Parse(ipAddress).IsLocalAddress().Should().BeFalse();
}
[TestCase("100.64.0.1")]
[TestCase("100.127.255.254")]
[TestCase("100.100.100.100")]
public void should_return_true_for_cgnat_ip_address(string ipAddress)
{
IPAddress.Parse(ipAddress).IsCgnatIpAddress().Should().BeTrue();
}
[TestCase("1.2.3.4")]
[TestCase("192.168.5.1")]
[TestCase("100.63.255.255")]
[TestCase("100.128.0.0")]
public void should_return_false_for_non_cgnat_ip_address(string ipAddress)
{
IPAddress.Parse(ipAddress).IsCgnatIpAddress().Should().BeFalse();
}
}
}

View File

@@ -35,7 +35,7 @@ namespace NzbDrone.Common.Test.Http
private string _httpBinHost;
private string _httpBinHost2;
private System.Net.Http.HttpClient _httpClient = new ();
private System.Net.Http.HttpClient _httpClient = new();
[OneTimeSetUp]
public void FixtureSetUp()

View File

@@ -1,4 +1,5 @@
using System;
using System.Text;
using FluentAssertions;
using NUnit.Framework;
using NzbDrone.Common.Http;
@@ -9,6 +10,12 @@ namespace NzbDrone.Common.Test.Http
[TestFixture]
public class HttpRequestBuilderFixture : TestBase
{
[OneTimeSetUp]
public void RegisterEncodingProvider()
{
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
}
[TestCase("http://host/{seg}/some", "http://host/dir/some")]
[TestCase("http://host/some/{seg}", "http://host/some/dir")]
public void should_add_single_segment_url_segments(string url, string result)
@@ -36,5 +43,70 @@ namespace NzbDrone.Common.Test.Http
request.Url.FullUri.Should().Be("http://domain/v1/");
}
[Test]
public void should_encode_form_parameters_with_utf8_by_default()
{
var builder = new HttpRequestBuilder("http://domain/login")
.Post()
.AddFormParameter("username", "Привет");
var request = builder.Build();
var body = Encoding.UTF8.GetString(request.ContentData);
// UTF-8 encoding: Привет = %D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82
body.Should().Contain("username=%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82");
}
[Test]
public void should_encode_form_parameters_with_windows_1251_for_cyrillic()
{
var windows1251 = Encoding.GetEncoding("windows-1251");
var builder = new HttpRequestBuilder("http://domain/login")
.Post()
.SetEncoding(windows1251)
.AddFormParameter("username", "Привет");
var request = builder.Build();
var body = windows1251.GetString(request.ContentData);
// Windows-1251 encoding: Привет = %CF%F0%E8%E2%E5%F2
body.Should().Contain("username=%CF%F0%E8%E2%E5%F2");
}
[Test]
public void should_encode_form_parameters_with_iso_8859_1_for_extended_latin()
{
var iso88591 = Encoding.GetEncoding("iso-8859-1");
var builder = new HttpRequestBuilder("http://domain/login")
.Post()
.SetEncoding(iso88591)
.AddFormParameter("username", "café");
var request = builder.Build();
var body = iso88591.GetString(request.ContentData);
// ISO-8859-1 encoding: é = %E9
body.Should().Contain("username=caf%E9");
}
[Test]
public void should_encode_form_parameters_ascii_same_regardless_of_encoding()
{
var windows1251 = Encoding.GetEncoding("windows-1251");
var builder = new HttpRequestBuilder("http://domain/login")
.Post()
.SetEncoding(windows1251)
.AddFormParameter("username", "testuser")
.AddFormParameter("password", "pass123");
var request = builder.Build();
var body = windows1251.GetString(request.ContentData);
body.Should().Be("username=testuser&password=pass123");
}
}
}

View File

@@ -16,6 +16,8 @@ namespace NzbDrone.Common.Test.Http
[TestCase("Readarr/1.0.0.2300 (ubuntu 20.04)", "Readarr")]
[TestCase("Sonarr/3.0.6.9999 (ubuntu 20.04)", "Sonarr")]
[TestCase("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36", "Other")]
[TestCase("appbrr", "appbrr")]
[TestCase(" appbrr ", "appbrr")]
public void should_parse_user_agent(string userAgent, string parsedAgent)
{
UserAgentParser.ParseSource(userAgent).Should().Be(parsedAgent);

View File

@@ -30,6 +30,7 @@ namespace NzbDrone.Common.Test.InstrumentationTests
[TestCase(@"https://anthelion.me/api.php?api_key=2b51db35e1910123321025a12b9933d2&o=json&t=movie&q=&tmdb=&imdb=&cat=&limit=100&offset=0")]
[TestCase(@"https://avistaz.to/api/v1/jackett/auth: username=mySecret&password=mySecret&pid=mySecret")]
[TestCase(@"https://www.sharewood.tv/api/2b51db35e1910123321025a12b9933d2/last-torrents")]
[TestCase(@"https://example.org/rss/torrents?rsskey=2b51db35e1910123321025a12b9933d2&search=")]
// Indexer and Download Client Responses

View File

@@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net6.0</TargetFrameworks>
<TargetFrameworks>net8.0</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\NzbDrone.Host\Prowlarr.Host.csproj" />

View File

@@ -42,17 +42,18 @@ namespace NzbDrone.Common
public void CreateZip(string path, IEnumerable<string> files)
{
using (var zipFile = ZipFile.Create(path))
_logger.Debug("Creating archive {0}", path);
using var zipFile = ZipFile.Create(path);
zipFile.BeginUpdate();
foreach (var file in files)
{
zipFile.BeginUpdate();
foreach (var file in files)
{
zipFile.Add(file, Path.GetFileName(file));
}
zipFile.CommitUpdate();
zipFile.Add(file, Path.GetFileName(file));
}
zipFile.CommitUpdate();
}
private void ExtractZip(string compressedFile, string destination)

View File

@@ -1,6 +1,5 @@
using System;
using System.IO;
using System.Runtime.Serialization;
namespace NzbDrone.Common.Disk
{
@@ -24,10 +23,5 @@ namespace NzbDrone.Common.Disk
: base(message, innerException)
{
}
protected DestinationAlreadyExistsException(SerializationInfo info, StreamingContext context)
: base(info, context)
{
}
}
}

View File

@@ -189,6 +189,25 @@ namespace NzbDrone.Common.Disk
}
var fi = new FileInfo(path);
try
{
// If the file is a symlink, resolve the target path and get the size of the target file.
if (fi.Attributes.HasFlag(FileAttributes.ReparsePoint))
{
var targetPath = fi.ResolveLinkTarget(true)?.FullName;
if (targetPath != null)
{
fi = new FileInfo(targetPath);
}
}
}
catch (IOException ex)
{
Logger.Trace(ex, "Unable to resolve symlink target for {0}", path);
}
return fi.Length;
}

View File

@@ -295,7 +295,7 @@ namespace NzbDrone.Common.Disk
return _path.Split(new char[] { '\\', '/' }, StringSplitOptions.RemoveEmptyEntries);
}
public static OsPath Null => new (null);
public static OsPath Null => new(null);
public override string ToString()
{

View File

@@ -75,6 +75,17 @@ namespace NzbDrone.Common.EnvironmentInfo
{
try
{
if (OsInfo.IsOsx)
{
var userAppDataFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile, Environment.SpecialFolderOption.DoNotVerify), ".config", "Prowlarr");
if (_diskProvider.FolderExists(userAppDataFolder) && !_diskProvider.FileExists(_appFolderInfo.GetConfigPath()))
{
_diskTransferService.MirrorFolder(userAppDataFolder, _appFolderInfo.AppDataFolder);
_diskProvider.DeleteFolder(userAppDataFolder, true);
}
}
var oldDbFile = Path.Combine(_appFolderInfo.AppDataFolder, "nzbdrone.db");
if (_startupContext.Args.ContainsKey(StartupContext.APPDATA))
@@ -115,7 +126,7 @@ namespace NzbDrone.Common.EnvironmentInfo
catch (Exception ex)
{
_logger.Debug(ex, ex.Message);
throw new ProwlarrStartupException("Unable to migrate DB from nzbdrone.db to {0}. Migrate manually", _appFolderInfo.GetDatabase());
throw new ProwlarrStartupException(ex, "Unable to migrate DB from nzbdrone.db to {0}. Migrate manually", _appFolderInfo.GetDatabase());
}
}

View File

@@ -15,7 +15,7 @@ namespace NzbDrone.Common.EnvironmentInfo
var attributes = assembly.GetCustomAttributes(true);
Branch = "unknow";
Branch = "unknown";
var config = attributes.OfType<AssemblyConfigurationAttribute>().FirstOrDefault();
if (config != null)

View File

@@ -31,7 +31,7 @@ namespace NzbDrone.Common.Extensions
}
public static IDictionary<TNewKey, TNewValue> SelectDictionary<TKey, TValue, TNewKey, TNewValue>(this IDictionary<TKey, TValue> dictionary,
Func<KeyValuePair<TKey, TValue>, ValueTuple<TNewKey, TNewValue>> selection)
Func<KeyValuePair<TKey, TValue>, (TNewKey Item1, TNewValue Item2)> selection)
{
return dictionary.Select(selection).ToDictionary(t => t.Item1, t => t.Item2);
}

View File

@@ -39,18 +39,24 @@ namespace NzbDrone.Common.Extensions
private static bool IsLocalIPv4(byte[] ipv4Bytes)
{
// Link local (no IP assigned by DHCP): 169.254.0.0 to 169.254.255.255 (169.254.0.0/16)
bool IsLinkLocal() => ipv4Bytes[0] == 169 && ipv4Bytes[1] == 254;
var isLinkLocal = ipv4Bytes[0] == 169 && ipv4Bytes[1] == 254;
// Class A private range: 10.0.0.0 10.255.255.255 (10.0.0.0/8)
bool IsClassA() => ipv4Bytes[0] == 10;
var isClassA = ipv4Bytes[0] == 10;
// Class B private range: 172.16.0.0 172.31.255.255 (172.16.0.0/12)
bool IsClassB() => ipv4Bytes[0] == 172 && ipv4Bytes[1] >= 16 && ipv4Bytes[1] <= 31;
var isClassB = ipv4Bytes[0] == 172 && ipv4Bytes[1] >= 16 && ipv4Bytes[1] <= 31;
// Class C private range: 192.168.0.0 192.168.255.255 (192.168.0.0/16)
bool IsClassC() => ipv4Bytes[0] == 192 && ipv4Bytes[1] == 168;
var isClassC = ipv4Bytes[0] == 192 && ipv4Bytes[1] == 168;
return IsLinkLocal() || IsClassA() || IsClassC() || IsClassB();
return isLinkLocal || isClassA || isClassC || isClassB;
}
public static bool IsCgnatIpAddress(this IPAddress ipAddress)
{
var bytes = ipAddress.GetAddressBytes();
return bytes.Length == 4 && bytes[0] == 100 && bytes[1] >= 64 && bytes[1] <= 127;
}
}
}

View File

@@ -9,7 +9,7 @@ namespace NzbDrone.Common.Http
{
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie
// NOTE: we are not checking non-ascii characters and we should
private static readonly Regex CookieRegex = new (@"([^\(\)<>@,;:\\""/\[\]\?=\{\}\s]+)=([^,;\\""\s]+)");
private static readonly Regex CookieRegex = new(@"([^\(\)<>@,;:\\""/\[\]\?=\{\}\s]+)=([^,;\\""\s]+)");
private static readonly string[] FilterProps = { "COMMENT", "COMMENTURL", "DISCORD", "DOMAIN", "EXPIRES", "MAX-AGE", "PATH", "PORT", "SECURE", "VERSION", "HTTPONLY", "SAMESITE" };
private static readonly char[] InvalidKeyChars = { '(', ')', '<', '>', '@', ',', ';', ':', '\\', '"', '/', '[', ']', '?', '=', '{', '}', ' ', '\t', '\n' };
private static readonly char[] InvalidValueChars = { '"', ',', ';', '\\', ' ', '\t', '\n' };

View File

@@ -167,7 +167,7 @@ namespace NzbDrone.Common.Http.Dispatchers
}
catch (OperationCanceledException ex) when (cts.IsCancellationRequested)
{
throw new WebException("Http request timed out", ex.InnerException, WebExceptionStatus.Timeout, null);
throw new WebException("Http request timed out", ex, WebExceptionStatus.Timeout, null);
}
}

View File

@@ -97,7 +97,7 @@ namespace NzbDrone.Common.Http
// Save to add to final response
var responseCookies = response.Cookies;
// Update cookiecontainer for next request with any cookies recieved on last request
// Update cookie container for next request with any cookies received on last request
var responseContainer = HandleRedirectCookies(request, response);
response = await ExecuteRequestAsync(request, responseContainer);

View File

@@ -231,7 +231,7 @@ namespace NzbDrone.Common.Http
}
else
{
var parameters = FormData.Select(v => string.Format("{0}={1}", v.Name, Uri.EscapeDataString(Encoding.GetString(v.ContentData))));
var parameters = FormData.Select(v => string.Format("{0}={1}", v.Name, Encoding.GetString(v.ContentData).UrlEncode(Encoding)));
var urlencoded = string.Join("&", parameters);
var body = Encoding.GetBytes(urlencoded);

View File

@@ -9,7 +9,7 @@ namespace NzbDrone.Common.Http
{
public class HttpResponse
{
private static readonly Regex RegexRefresh = new ("^(.*?url)=(.*?)(?:;|$)", RegexOptions.Compiled);
private static readonly Regex RegexRefresh = new("^(.*?url)=(.*?)(?:;|$)", RegexOptions.Compiled);
public HttpResponse(HttpRequest request, HttpHeader headers, CookieCollection cookies, byte[] binaryData, long elapsedTime = 0, HttpStatusCode statusCode = HttpStatusCode.OK, Version version = null)
{

View File

@@ -1,15 +1,16 @@
using System;
using System.Text.RegularExpressions;
namespace NzbDrone.Common.Http
{
public static class UserAgentParser
{
private static readonly Regex AppSourceRegex = new Regex(@"(?<agent>[a-z0-9]*)\/.*(?:\(.*\))?",
private static readonly Regex AppSourceRegex = new(@"^(?<agent>[a-z0-9]+)(?:\/.+(?:\(.*\))?|$)",
RegexOptions.IgnoreCase | RegexOptions.Compiled);
public static string SimplifyUserAgent(string userAgent)
{
if (userAgent == null || userAgent.StartsWith("Mozilla/5.0"))
if (userAgent == null || userAgent.StartsWith("Mozilla/5.0", StringComparison.Ordinal))
{
return null;
}
@@ -19,14 +20,9 @@ namespace NzbDrone.Common.Http
public static string ParseSource(string userAgent)
{
var match = AppSourceRegex.Match(SimplifyUserAgent(userAgent) ?? string.Empty);
var match = AppSourceRegex.Match(SimplifyUserAgent(userAgent?.Trim()) ?? string.Empty);
if (match.Groups["agent"].Success)
{
return match.Groups["agent"].Value;
}
return "Other";
return match.Groups["agent"].Success ? match.Groups["agent"].Value : "Other";
}
}
}

View File

@@ -10,64 +10,64 @@ namespace NzbDrone.Common.Instrumentation
private static readonly Regex[] CleansingRules =
{
// Url
new (@"(?<=[?&: ;])(apikey|api_key|(?:(?:access|api)[-_]?)?token|pass(?:key|wd)?|auth|authkey|user|u?id|api|[a-z_]*apikey|account|pid|pwd)=(?<secret>[^&=""]+?)(?=[ ""&=]|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new (@"(?<=[?& ;])[^=]*?(_?(?<!use|get_)token|username|passwo?rd)=(?<secret>[^&=]+?)(?= |&|$|;)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new (@"rss(24h)?\.torrentleech\.org/(?!rss)(?<secret>[0-9a-z]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new (@"torrentleech\.org/rss/download/[0-9]+/(?<secret>[0-9a-z]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new (@"iptorrents\.com/[/a-z0-9?&;]*?(?:[?&;](u|tp)=(?<secret>[^&=;]+?))+(?= |;|&|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new (@"/fetch/[a-z0-9]{32}/(?<secret>[a-z0-9]{32})", RegexOptions.Compiled),
new (@"getnzb.*?(?<=\?|&)(r)=(?<secret>[^&=]+?)(?= |&|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new (@"\b(\w*)?(_?(?<!use|get_)token|username|passwo?rd)=(?<secret>[^&=]+?)(?= |&|$|;)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new (@"(?<=authkey = "")(?<secret>[^&=]+?)(?="")", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new (@"(?<=beyond-hd\.[a-z]+/api/torrents/)(?<secret>[^&=][a-z0-9]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new (@"(?<=beyond-hd\.[a-z]+/torrent/download/[\w\d-]+[.]\d+[.])(?<secret>[a-z0-9]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new (@"(?:sharewood)\.[a-z]{2,3}/api/(?<secret>[a-z0-9]{16,})/", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new(@"(?<=[?&: ;])(apikey|api_key|(?:(?:access|api)[-_]?)?token|pass(?:key|wd)?|auth|authkey|rsskey|user|u?id|api|[a-z_]*apikey|account|pid|pwd)=(?<secret>[^&=""]+?)(?=[ ""&=]|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new(@"(?<=[?& ;])[^=]*?(_?(?<!use|get_)token|username|passwo?rd)=(?<secret>[^&=]+?)(?= |&|$|;)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new(@"rss(24h)?\.torrentleech\.org/(?!rss)(?<secret>[0-9a-z]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new(@"torrentleech\.org/rss/download/[0-9]+/(?<secret>[0-9a-z]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new(@"iptorrents\.com/[/a-z0-9?&;]*?(?:[?&;](u|tp)=(?<secret>[^&=;]+?))+(?= |;|&|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new(@"/fetch/[a-z0-9]{32}/(?<secret>[a-z0-9]{32})", RegexOptions.Compiled),
new(@"getnzb.*?(?<=\?|&)(r)=(?<secret>[^&=]+?)(?= |&|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new(@"\b(\w*)?(_?(?<!use|get_)token|username|passwo?rd)=(?<secret>[^&=]+?)(?= |&|$|;)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new(@"(?<=authkey = "")(?<secret>[^&=]+?)(?="")", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new(@"(?<=beyond-hd\.[a-z]+/api/torrents/)(?<secret>[^&=][a-z0-9]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new(@"(?<=beyond-hd\.[a-z]+/torrent/download/[\w\d-]+[.]\d+[.])(?<secret>[a-z0-9]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new(@"(?:sharewood)\.[a-z]{2,3}/api/(?<secret>[a-z0-9]{16,})/", RegexOptions.Compiled | RegexOptions.IgnoreCase),
// UNIT3D
new (@"(?<=[a-z0-9-]+\.[a-z]+/torrent/download/\d+\.)(?<secret>[^&=][a-z0-9]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new(@"(?<=[a-z0-9-]+\.[a-z]+/torrent/download/\d+\.)(?<secret>[^&=][a-z0-9]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
// Path
new (@"""C:\\Users\\(?<secret>[^\""]+?)(\\|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new (@"""/(home|Users)/(?<secret>[^/""]+?)(/|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new(@"""C:\\Users\\(?<secret>[^\""]+?)(\\|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new(@"""/(home|Users)/(?<secret>[^/""]+?)(/|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
// Trackers Announce Keys; Designed for Qbit Json; should work for all in theory
new (@"announce(\.php)?(/|%2f|%3fpasskey%3d)(?<secret>[a-z0-9]{16,})|(?<secret>[a-z0-9]{16,})(/|%2f)announce", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new(@"announce(\.php)?(/|%2f|%3fpasskey%3d)(?<secret>[a-z0-9]{16,})|(?<secret>[a-z0-9]{16,})(/|%2f)announce", RegexOptions.Compiled | RegexOptions.IgnoreCase),
// NzbGet
new (@"""Name""\s*:\s*""[^""]*(username|password)""\s*,\s*""Value""\s*:\s*""(?<secret>[^""]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new(@"""Name""\s*:\s*""[^""]*(username|password)""\s*,\s*""Value""\s*:\s*""(?<secret>[^""]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
// Sabnzbd
new (@"""[^""]*(username|password|api_?key|nzb_key)""\s*:\s*""(?<secret>[^""]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new (@"""email_(account|to|from|pwd)""\s*:\s*""(?<secret>[^""]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new(@"""[^""]*(username|password|api_?key|nzb_key)""\s*:\s*""(?<secret>[^""]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new(@"""email_(account|to|from|pwd)""\s*:\s*""(?<secret>[^""]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
// uTorrent
new (@"\[""[a-z._]*(username|password)"",\d,""(?<secret>[^""]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new (@"\[""(boss_key|boss_key_salt|proxy\.proxy)"",\d,""(?<secret>[^""]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new(@"\[""[a-z._]*(username|password)"",\d,""(?<secret>[^""]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new(@"\[""(boss_key|boss_key_salt|proxy\.proxy)"",\d,""(?<secret>[^""]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
// Deluge
new (@"auth.login\(""(?<secret>[^""]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new(@"auth.login\(""(?<secret>[^""]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
// BroadcastheNet (;torrent_pass|torrents_notify_ is for MTV)
new (@"""?method""?\s*:\s*""(getTorrents)"",\s*""?params""?\s*:\s*\[\s*""(?<secret>[^""]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new (@"getTorrents\(""(?<secret>[^""]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new (@"(?<=\?|&|;|=)(authkey|torrent_pass|torrents_notify)[_=](?<secret>[^&=]+?)(?=""|&|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new(@"""?method""?\s*:\s*""(getTorrents)"",\s*""?params""?\s*:\s*\[\s*""(?<secret>[^""]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new(@"getTorrents\(""(?<secret>[^""]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new(@"(?<=\?|&|;|=)(authkey|torrent_pass|torrents_notify)[_=](?<secret>[^&=]+?)(?=""|&|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
// Plex
new (@"(?<=\?|&)(X-Plex-Client-Identifier|X-Plex-Token)=(?<secret>[^&=]+?)(?= |&|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new(@"(?<=\?|&)(X-Plex-Client-Identifier|X-Plex-Token)=(?<secret>[^&=]+?)(?= |&|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
// Indexer Responses
new (@"(?:avistaz|exoticaz|cinemaz|privatehd)\.[a-z]{2,3}/rss/download/(?<secret>[^&=]+?)/(?<secret>[^&=]+?)\.torrent", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new (@"(?:animebytes)\.[a-z]{2,3}/torrent/[0-9]+/download/(?<secret>[^&=]+?)[""]", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new (@"""(info_hash|token|((pass|rss)[- _]?key))"":""(?<secret>[^&=]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new(@"(?:avistaz|exoticaz|cinemaz|privatehd)\.[a-z]{2,3}/rss/download/(?<secret>[^&=]+?)/(?<secret>[^&=]+?)\.torrent", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new(@"(?:animebytes)\.[a-z]{2,3}/torrent/[0-9]+/download/(?<secret>[^&=]+?)[""]", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new(@"""(info_hash|token|((pass|rss)[- _]?key))"":""(?<secret>[^&=]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
// Applications
new (@"""name"":""apikey"",""value"":""(?<secret>[^&=]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new(@"""name"":""apikey"",""value"":""(?<secret>[^&=]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
// Discord
new (@"discord.com/api/webhooks/((?<secret>[\w-]+)/)?(?<secret>[\w-]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase)
new(@"discord.com/api/webhooks/((?<secret>[\w-]+)/)?(?<secret>[\w-]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase)
};
private static readonly Regex CleanseRemoteIPRegex = new (@"(?:Auth-\w+(?<!Failure|Unauthorized) ip|from) (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})", RegexOptions.Compiled);
private static readonly Regex CleanseRemoteIPRegex = new(@"(?:Auth-\w+(?<!Failure|Unauthorized) ip|from) (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})", RegexOptions.Compiled);
public static string Cleanse(string message)
{

View File

@@ -0,0 +1,21 @@
using System.Text;
using NLog;
using NLog.Layouts.ClefJsonLayout;
using NzbDrone.Common.EnvironmentInfo;
namespace NzbDrone.Common.Instrumentation;
public class CleansingClefLogLayout : CompactJsonLayout
{
protected override void RenderFormattedMessage(LogEventInfo logEvent, StringBuilder target)
{
base.RenderFormattedMessage(logEvent, target);
if (RuntimeInfo.IsProduction)
{
var result = CleanseLogMessage.Cleanse(target.ToString());
target.Clear();
target.Append(result);
}
}
}

View File

@@ -0,0 +1,26 @@
using System.Text;
using NLog;
using NLog.Layouts;
using NzbDrone.Common.EnvironmentInfo;
namespace NzbDrone.Common.Instrumentation;
public class CleansingConsoleLogLayout : SimpleLayout
{
public CleansingConsoleLogLayout(string format)
: base(format)
{
}
protected override void RenderFormattedMessage(LogEventInfo logEvent, StringBuilder target)
{
base.RenderFormattedMessage(logEvent, target);
if (RuntimeInfo.IsProduction)
{
var result = CleanseLogMessage.Cleanse(target.ToString());
target.Clear();
target.Append(result);
}
}
}

View File

@@ -4,7 +4,7 @@ using NLog.Targets;
namespace NzbDrone.Common.Instrumentation
{
public class NzbDroneFileTarget : FileTarget
public class CleansingFileTarget : FileTarget
{
protected override void RenderFormattedMessage(LogEventInfo logEvent, StringBuilder target)
{

View File

@@ -4,27 +4,27 @@ namespace NzbDrone.Common.Instrumentation.Extensions
{
public static class LoggerExtensions
{
[MessageTemplateFormatMethod("message")]
public static void ProgressInfo(this Logger logger, string message, params object[] args)
{
var formattedMessage = string.Format(message, args);
LogProgressMessage(logger, LogLevel.Info, formattedMessage);
LogProgressMessage(logger, LogLevel.Info, message, args);
}
[MessageTemplateFormatMethod("message")]
public static void ProgressDebug(this Logger logger, string message, params object[] args)
{
var formattedMessage = string.Format(message, args);
LogProgressMessage(logger, LogLevel.Debug, formattedMessage);
LogProgressMessage(logger, LogLevel.Debug, message, args);
}
[MessageTemplateFormatMethod("message")]
public static void ProgressTrace(this Logger logger, string message, params object[] args)
{
var formattedMessage = string.Format(message, args);
LogProgressMessage(logger, LogLevel.Trace, formattedMessage);
LogProgressMessage(logger, LogLevel.Trace, message, args);
}
private static void LogProgressMessage(Logger logger, LogLevel level, string message)
private static void LogProgressMessage(Logger logger, LogLevel level, string message, object[] parameters)
{
var logEvent = new LogEventInfo(level, logger.Name, message);
var logEvent = new LogEventInfo(level, logger.Name, null, message, parameters);
logEvent.Properties.Add("Status", "");
logger.Log(logEvent);

View File

@@ -3,7 +3,6 @@ using System.Diagnostics;
using System.IO;
using NLog;
using NLog.Config;
using NLog.Layouts.ClefJsonLayout;
using NLog.Targets;
using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Common.Extensions;
@@ -13,9 +12,11 @@ namespace NzbDrone.Common.Instrumentation
{
public static class NzbDroneLogger
{
private const string FILE_LOG_LAYOUT = @"${date:format=yyyy-MM-dd HH\:mm\:ss.f}|${level}|${logger}|${message}${onexception:inner=${newline}${newline}[v${assembly-version}] ${exception:format=ToString}${newline}${exception:format=Data}${newline}}";
public const string ConsoleLogLayout = "[${level}] ${logger}: ${message} ${onexception:inner=${newline}${newline}[v${assembly-version}] ${exception:format=ToString}${newline}${exception:format=Data}${newline}}";
public static CompactJsonLayout ClefLogLayout = new CompactJsonLayout();
private const string FileLogLayout = @"${date:format=yyyy-MM-dd HH\:mm\:ss.f}|${level}|${logger}|${message}${onexception:inner=${newline}${newline}[v${assembly-version}] ${exception:format=ToString}${newline}${exception:format=Data}${newline}}";
private const string ConsoleFormat = "[${level}] ${logger}: ${message} ${onexception:inner=${newline}${newline}[v${assembly-version}] ${exception:format=ToString}${newline}${exception:format=Data}${newline}}";
private static readonly CleansingConsoleLogLayout CleansingConsoleLayout = new(ConsoleFormat);
private static readonly CleansingClefLogLayout ClefLogLayout = new();
private static bool _isConfigured;
@@ -119,11 +120,7 @@ namespace NzbDrone.Common.Instrumentation
? formatEnumValue
: ConsoleLogFormat.Standard;
coloredConsoleTarget.Layout = logFormat switch
{
ConsoleLogFormat.Clef => ClefLogLayout,
_ => ConsoleLogLayout
};
ConfigureConsoleLayout(coloredConsoleTarget, logFormat);
var loggingRule = new LoggingRule("*", level, coloredConsoleTarget);
@@ -140,7 +137,7 @@ namespace NzbDrone.Common.Instrumentation
private static void RegisterAppFile(IAppFolderInfo appFolderInfo, string name, string fileName, int maxArchiveFiles, LogLevel minLogLevel)
{
var fileTarget = new NzbDroneFileTarget();
var fileTarget = new CleansingFileTarget();
fileTarget.Name = name;
fileTarget.FileName = Path.Combine(appFolderInfo.GetLogFolder(), fileName);
@@ -153,7 +150,7 @@ namespace NzbDrone.Common.Instrumentation
fileTarget.MaxArchiveFiles = maxArchiveFiles;
fileTarget.EnableFileDelete = true;
fileTarget.ArchiveNumbering = ArchiveNumberingMode.Rolling;
fileTarget.Layout = FILE_LOG_LAYOUT;
fileTarget.Layout = FileLogLayout;
var loggingRule = new LoggingRule("*", minLogLevel, fileTarget);
@@ -172,7 +169,7 @@ namespace NzbDrone.Common.Instrumentation
fileTarget.ConcurrentWrites = false;
fileTarget.ConcurrentWriteAttemptDelay = 50;
fileTarget.ConcurrentWriteAttempts = 100;
fileTarget.Layout = FILE_LOG_LAYOUT;
fileTarget.Layout = FileLogLayout;
var loggingRule = new LoggingRule("*", LogLevel.Trace, fileTarget);
@@ -205,6 +202,7 @@ namespace NzbDrone.Common.Instrumentation
c.ForLogger("Microsoft.*").WriteToNil(LogLevel.Warn);
c.ForLogger("Microsoft.Hosting.Lifetime*").WriteToNil(LogLevel.Info);
c.ForLogger("Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware").WriteToNil(LogLevel.Fatal);
c.ForLogger("Prowlarr.Http.Authentication.ApiKeyAuthenticationHandler").WriteToNil(LogLevel.Info);
});
}
@@ -217,6 +215,15 @@ namespace NzbDrone.Common.Instrumentation
{
return GetLogger(obj.GetType());
}
public static void ConfigureConsoleLayout(ColoredConsoleTarget target, ConsoleLogFormat format)
{
target.Layout = format switch
{
ConsoleLogFormat.Clef => NzbDroneLogger.ClefLogLayout,
_ => NzbDroneLogger.CleansingConsoleLayout
};
}
}
public enum ConsoleLogFormat

View File

@@ -119,7 +119,7 @@ namespace NzbDrone.Common.Instrumentation.Sentry
o.Environment = BuildInfo.Branch;
// Crash free run statistics (sends a ping for healthy and for crashes sessions)
o.AutoSessionTracking = true;
o.AutoSessionTracking = false;
// Caches files in the event device is offline
// Sentry creates a 'sentry' sub directory, no need to concat here
@@ -148,7 +148,7 @@ namespace NzbDrone.Common.Instrumentation.Sentry
_debounce = new SentryDebounce();
// initialize to true and reconfigure later
// Otherwise it will default to false and any errors occuring
// Otherwise it will default to false and any errors occurring
// before config file gets read will not be filtered
FilterEvents = true;
SentryEnabled = true;
@@ -207,9 +207,7 @@ namespace NzbDrone.Common.Instrumentation.Sentry
private void OnError(Exception ex)
{
var webException = ex as WebException;
if (webException != null)
if (ex is WebException webException)
{
var response = webException.Response as HttpWebResponse;
var statusCode = response?.StatusCode;

View File

@@ -6,4 +6,5 @@ public class AuthOptions
public bool? Enabled { get; set; }
public string Method { get; set; }
public string Required { get; set; }
public bool? TrustCgnatIpAddresses { get; set; }
}

View File

@@ -6,6 +6,7 @@ using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using NLog;
using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Common.Model;
@@ -117,7 +118,9 @@ namespace NzbDrone.Common.Processes
UseShellExecute = false,
RedirectStandardError = true,
RedirectStandardOutput = true,
RedirectStandardInput = true
RedirectStandardInput = true,
StandardOutputEncoding = Encoding.UTF8,
StandardErrorEncoding = Encoding.UTF8
};
if (environmentVariables != null)
@@ -313,7 +316,7 @@ namespace NzbDrone.Common.Processes
processInfo = new ProcessInfo();
processInfo.Id = process.Id;
processInfo.Name = process.ProcessName;
processInfo.StartPath = process.MainModule.FileName;
processInfo.StartPath = process.MainModule?.FileName;
if (process.Id != GetCurrentProcessId() && process.HasExited)
{

View File

@@ -1,27 +1,30 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net6.0</TargetFrameworks>
<TargetFrameworks>net8.0</TargetFrameworks>
<DefineConstants Condition="'$(RuntimeIdentifier)' == 'linux-musl-x64' or '$(RuntimeIdentifier)' == 'linux-musl-arm64'">ISMUSL</DefineConstants>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="DryIoc.dll" Version="5.4.3" />
<PackageReference Include="IPAddressRange" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.1" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.2" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="NLog" Version="5.3.3" />
<PackageReference Include="NLog.Layouts.ClefJsonLayout" Version="1.0.0" />
<PackageReference Include="NLog.Extensions.Logging" Version="5.3.12" />
<PackageReference Include="Npgsql" Version="7.0.8" />
<PackageReference Include="IPAddressRange" Version="6.2.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="8.0.1" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
<PackageReference Include="NLog" Version="5.4.0" />
<PackageReference Include="NLog.Layouts.ClefJsonLayout" Version="1.0.3" />
<PackageReference Include="NLog.Extensions.Logging" Version="5.4.0" />
<PackageReference Include="Npgsql" Version="9.0.3" />
<PackageReference Include="Sentry" Version="4.0.2" />
<PackageReference Include="NLog.Targets.Syslog" Version="7.0.0" />
<PackageReference Include="SharpZipLib" Version="1.4.2" />
<PackageReference Include="System.ValueTuple" Version="4.5.0" />
<PackageReference Include="System.Data.SQLite.Core.Servarr" Version="1.0.115.5-18" />
<PackageReference Include="System.Configuration.ConfigurationManager" Version="6.0.1" />
<PackageReference Include="SourceGear.sqlite3" Version="3.50.4.2" />
<PackageReference Include="System.Data.SQLite" Version="2.0.2" />
<PackageReference Include="System.Private.Uri" Version="4.3.2" />
<PackageReference Include="System.Text.Json" Version="8.0.6" />
<PackageReference Include="System.ValueTuple" Version="4.6.1" />
<PackageReference Include="System.Configuration.ConfigurationManager" Version="8.0.1" />
<PackageReference Include="System.IO.FileSystem.AccessControl" Version="5.0.0" />
<PackageReference Include="System.Runtime.Loader" Version="4.3.0" />
<PackageReference Include="System.ServiceProcess.ServiceController" Version="6.0.1" />
<PackageReference Include="System.ServiceProcess.ServiceController" Version="8.0.1" />
</ItemGroup>
<ItemGroup>
<Compile Update="EnsureThat\Resources\ExceptionMessages.Designer.cs">

View File

@@ -94,7 +94,8 @@ namespace NzbDrone.Common.TPL
{
_currentThreadIsProcessingItems = false;
}
}, null);
},
null);
}
/// <summary>Attempts to execute the specified task on the current thread.</summary>

View File

@@ -20,7 +20,8 @@ namespace NzbDrone.Common.TPL
Logger.Error(exception, "Task Error");
}
}
}, TaskContinuationOptions.OnlyOnFaulted);
},
TaskContinuationOptions.OnlyOnFaulted);
return task;
}

View File

@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFrameworks>net6.0</TargetFrameworks>
<TargetFrameworks>net8.0</TargetFrameworks>
<ApplicationIcon>..\NzbDrone.Host\Prowlarr.ico</ApplicationIcon>
</PropertyGroup>

View File

@@ -0,0 +1,43 @@
using System;
using System.Data.SQLite;
using FluentAssertions;
using NUnit.Framework;
using NzbDrone.Core.Datastore.Converters;
using NzbDrone.Core.Test.Framework;
namespace NzbDrone.Core.Test.Datastore.Converters;
[TestFixture]
public class TimeSpanConverterFixture : CoreTest<TimeSpanConverter>
{
private SQLiteParameter _param;
[SetUp]
public void Setup()
{
_param = new SQLiteParameter();
}
[Test]
public void should_return_string_when_saving_timespan_to_db()
{
var span = TimeSpan.FromMilliseconds(10);
Subject.SetValue(_param, span);
_param.Value.Should().Be(span.ToString());
}
[Test]
public void should_return_timespan_when_getting_string_from_db()
{
var span = TimeSpan.FromMilliseconds(10);
Subject.Parse(span.ToString()).Should().Be(span);
}
[Test]
public void should_return_zero_timespan_for_db_null_value_when_getting_from_db()
{
Subject.Parse(null).Should().Be(TimeSpan.Zero);
}
}

View File

@@ -0,0 +1,38 @@
using FluentAssertions;
using NUnit.Framework;
using NzbDrone.Core.Datastore;
namespace NzbDrone.Core.Test.Datastore;
[TestFixture]
public class DatabaseVersionParserFixture
{
[TestCase("3.44.2", 3, 44, 2)]
public void should_parse_sqlite_database_version(string serverVersion, int majorVersion, int minorVersion, int buildVersion)
{
var version = DatabaseVersionParser.ParseServerVersion(serverVersion);
version.Should().NotBeNull();
version.Major.Should().Be(majorVersion);
version.Minor.Should().Be(minorVersion);
version.Build.Should().Be(buildVersion);
}
[TestCase("14.8 (Debian 14.8-1.pgdg110+1)", 14, 8, null)]
[TestCase("16.3 (Debian 16.3-1.pgdg110+1)", 16, 3, null)]
[TestCase("16.3 - Percona Distribution", 16, 3, null)]
[TestCase("17.0 - Percona Server", 17, 0, null)]
public void should_parse_postgres_database_version(string serverVersion, int majorVersion, int minorVersion, int? buildVersion)
{
var version = DatabaseVersionParser.ParseServerVersion(serverVersion);
version.Should().NotBeNull();
version.Major.Should().Be(majorVersion);
version.Minor.Should().Be(minorVersion);
if (buildVersion.HasValue)
{
version.Build.Should().Be(buildVersion.Value);
}
}
}

View File

@@ -0,0 +1,192 @@
using System;
using System.Linq;
using FluentAssertions;
using NUnit.Framework;
using NzbDrone.Core.Datastore.Migration;
using NzbDrone.Core.Test.Framework;
namespace NzbDrone.Core.Test.Datastore.Migration
{
[TestFixture]
public class newznab_indexers_enable_redirectFixture : MigrationTest<newznab_indexers_enable_redirect>
{
[Test]
public void should_update_redirect_setting_to_true_if_false()
{
var db = WithMigrationTestDb(c =>
{
c.Insert.IntoTable("Indexers").Row(new
{
Id = 1,
Name = "Test",
Implementation = "Newznab",
Settings = "{\"baseUrl\":\"https://example.com\",\"apiKey\":\"testapikey\"}",
ConfigContract = "NewznabSettings",
Enable = true,
Priority = 1,
Added = System.DateTime.UtcNow,
Redirect = false,
AppProfileId = 1,
Tags = "[]",
DownloadClientId = 0
});
});
var items = db.Query<IndexerDefinition043>("SELECT * FROM \"Indexers\"");
items.Should().HaveCount(1);
items.First().Implementation.Should().Be("Newznab");
items.First().Redirect.Should().BeTrue(); // Validate Redirect is updated
}
[Test]
public void should_not_change_redirect_setting_if_already_true()
{
var db = WithMigrationTestDb(c =>
{
c.Insert.IntoTable("Indexers").Row(new
{
Id = 1,
Name = "Test",
Implementation = "Newznab",
Settings = "{\"baseUrl\":\"https://example.com\",\"apiKey\":\"testapikey\"}",
ConfigContract = "NewznabSettings",
Enable = true,
Priority = 2,
Added = System.DateTime.UtcNow,
Redirect = true,
AppProfileId = 1,
Tags = "[]",
DownloadClientId = 0
});
});
var items = db.Query<IndexerDefinition043>("SELECT * FROM \"Indexers\"");
items.Should().HaveCount(1);
items.First().Implementation.Should().Be("Newznab");
items.First().Redirect.Should().BeTrue(); // Validate Redirect remains true
}
[Test]
public void should_not_affect_non_newznab_indexers()
{
var db = WithMigrationTestDb(c =>
{
c.Insert.IntoTable("Indexers").Row(new
{
Id = 1,
Name = "Test",
Implementation = "OtherIndexer",
Settings = "{\"baseUrl\":\"https://otherindexer.com\"}",
ConfigContract = "OtherIndexerSettings",
Enable = true,
Priority = 3,
Added = System.DateTime.UtcNow,
Redirect = false,
AppProfileId = 1,
Tags = "[]",
DownloadClientId = 0
});
});
var items = db.Query<IndexerDefinition043>("SELECT * FROM \"Indexers\"");
items.Should().HaveCount(1);
items.First().Implementation.Should().Be("OtherIndexer");
items.First().Redirect.Should().BeFalse(); // Validate Redirect is not changed
}
[Test]
public void should_handle_multiple_indexers()
{
var db = WithMigrationTestDb(c =>
{
c.Insert.IntoTable("Indexers").Row(new
{
Id = 1,
Name = "Test 1",
Implementation = "Newznab",
Settings = "{\"baseUrl\":\"https://example1.com\",\"apiKey\":\"testapikey1\"}",
ConfigContract = "NewznabSettings",
Enable = true,
Priority = 4,
Added = System.DateTime.UtcNow,
Redirect = false,
AppProfileId = 1,
Tags = "[]",
DownloadClientId = 0
});
c.Insert.IntoTable("Indexers").Row(new
{
Id = 2,
Name = "Test 2",
Implementation = "Newznab",
Settings = "{\"baseUrl\":\"https://example2.com\",\"apiKey\":\"testapikey2\"}",
ConfigContract = "NewznabSettings",
Enable = true,
Priority = 5,
Added = System.DateTime.UtcNow,
Redirect = false,
AppProfileId = 1,
Tags = "[]",
DownloadClientId = 0
});
c.Insert.IntoTable("Indexers").Row(new
{
Id = 3,
Name = "Test 3",
Implementation = "Newznab",
Settings = "{\"baseUrl\":\"https://example3.com\",\"apiKey\":\"testapikey3\"}",
ConfigContract = "NewznabSettings",
Enable = true,
Priority = 6,
Added = System.DateTime.UtcNow,
Redirect = true,
AppProfileId = 1,
Tags = "[]",
DownloadClientId = 0
});
c.Insert.IntoTable("Indexers").Row(new
{
Id = 4,
Name = "Test 4",
Implementation = "OtherIndexer",
Settings = "{\"baseUrl\":\"https://otherindexer.com\"}",
ConfigContract = "OtherIndexerSettings",
Enable = true,
Priority = 7,
Added = System.DateTime.UtcNow,
Redirect = false,
AppProfileId = 1,
Tags = "[]",
DownloadClientId = 0
});
});
var items = db.Query<IndexerDefinition043>("SELECT * FROM \"Indexers\"");
items.Should().HaveCount(4);
items.First(i => i.Id == 1).Redirect.Should().BeTrue(); // Validate Redirect is updated
items.First(i => i.Id == 2).Redirect.Should().BeTrue(); // Validate Redirect is updated
items.First(i => i.Id == 3).Redirect.Should().BeTrue(); // Validate Redirect remains true
items.First(i => i.Id == 4).Redirect.Should().BeFalse(); // Validate Redirect is not changed
}
}
public class IndexerDefinition043
{
public int Id { get; set; }
public string Name { get; set; }
public string Implementation { get; set; }
public string Settings { get; set; }
public string ConfigContract { get; set; }
public bool Enable { get; set; }
public int Priority { get; set; }
public DateTime Added { get; set; }
public bool Redirect { get; set; }
public int AppProfileId { get; set; }
public string Tags { get; set; }
public int DownloadClientId { get; set; }
}
}

View File

@@ -149,7 +149,8 @@
}
],
"music_type": null,
"created_at": "2021-11-14 23:26:21"
"created_at": "2021-11-14 23:26:21",
"created_at_iso": "2021-11-14T23:26:21+02:00"
},
{
"id": 187239,
@@ -195,7 +196,8 @@
}
],
"music_type": null,
"created_at": "2021-11-14 23:11:49"
"created_at": "2021-11-14 23:11:49",
"created_at_iso": "2021-11-14T23:11:49+02:00"
},
{
"id": 187238,
@@ -241,7 +243,8 @@
}
],
"music_type": null,
"created_at": "2021-11-14 23:09:11"
"created_at": "2021-11-14 23:09:11",
"created_at_iso": "2021-11-14T23:09:11+02:00"
},
{
"id": 187237,
@@ -287,7 +290,8 @@
}
],
"music_type": null,
"created_at": "2021-11-14 23:05:30"
"created_at": "2021-11-14 23:05:30",
"created_at_iso": "2021-11-14T23:05:30+02:00"
},
{
"id": 187236,
@@ -333,7 +337,8 @@
}
],
"music_type": null,
"created_at": "2021-11-14 22:59:26"
"created_at": "2021-11-14 22:59:26",
"created_at_iso": "2021-11-14T22:59:26+02:00"
},
{
"id": 187234,
@@ -379,7 +384,8 @@
}
],
"music_type": null,
"created_at": "2021-11-14 22:38:33"
"created_at": "2021-11-14 22:38:33",
"created_at_iso": "2021-11-14T22:38:33+02:00"
},
{
"id": 187233,
@@ -425,7 +431,8 @@
}
],
"music_type": null,
"created_at": "2021-11-14 22:35:13"
"created_at": "2021-11-14 22:35:13",
"created_at_iso": "2021-11-14T22:35:13+02:00"
},
{
"id": 187231,
@@ -452,7 +459,7 @@
"imdb": "tt1143942",
"tmdb": "83665",
"tvdb": null,
"title": "Kaiky\u00f4",
"title": "Kaikyô",
"tv_season": 1,
"tv_episode": null,
"tv_full_season": true,
@@ -471,7 +478,8 @@
}
],
"music_type": null,
"created_at": "2021-11-14 18:02:28"
"created_at": "2021-11-14 18:02:28",
"created_at_iso": "2021-11-14T18:02:28+02:00"
},
{
"id": 187229,
@@ -517,7 +525,8 @@
}
],
"music_type": null,
"created_at": "2021-11-14 15:41:55"
"created_at": "2021-11-14 15:41:55",
"created_at_iso": "2021-11-14T15:41:55+02:00"
},
{
"id": 187225,
@@ -583,7 +592,8 @@
}
],
"music_type": null,
"created_at": "2021-11-14 13:49:11"
"created_at": "2021-11-14 13:49:11",
"created_at_iso": "2021-11-14T13:49:11+02:00"
},
{
"id": 187224,
@@ -633,7 +643,8 @@
}
],
"music_type": null,
"created_at": "2021-11-14 13:15:51"
"created_at": "2021-11-14 13:15:51",
"created_at_iso": "2021-11-14T13:15:51+02:00"
},
{
"id": 187223,
@@ -679,7 +690,8 @@
}
],
"music_type": null,
"created_at": "2021-11-14 12:56:09"
"created_at": "2021-11-14 12:56:09",
"created_at_iso": "2021-11-14T12:56:09+02:00"
},
{
"id": 187221,
@@ -720,7 +732,8 @@
],
"subtitle": null,
"music_type": null,
"created_at": "2021-11-14 11:47:24"
"created_at": "2021-11-14 11:47:24",
"created_at_iso": "2021-11-14T11:47:24+02:00"
},
{
"id": 187219,
@@ -798,7 +811,8 @@
}
],
"music_type": null,
"created_at": "2021-11-14 10:59:37"
"created_at": "2021-11-14 10:59:37",
"created_at_iso": "2021-11-14T10:59:37+02:00"
},
{
"id": 187218,
@@ -876,7 +890,8 @@
}
],
"music_type": null,
"created_at": "2021-11-14 10:58:36"
"created_at": "2021-11-14 10:58:36",
"created_at_iso": "2021-11-14T10:58:36+02:00"
},
{
"id": 187216,
@@ -917,7 +932,8 @@
],
"subtitle": null,
"music_type": null,
"created_at": "2021-11-14 10:31:45"
"created_at": "2021-11-14 10:31:45",
"created_at_iso": "2021-11-14T10:31:45+02:00"
},
{
"id": 187215,
@@ -967,7 +983,8 @@
}
],
"music_type": null,
"created_at": "2021-11-14 10:31:44"
"created_at": "2021-11-14 10:31:44",
"created_at_iso": "2021-11-14T10:31:44+02:00"
},
{
"id": 187214,
@@ -1008,7 +1025,8 @@
],
"subtitle": null,
"music_type": null,
"created_at": "2021-11-14 10:31:43"
"created_at": "2021-11-14 10:31:43",
"created_at_iso": "2021-11-14T10:31:43+02:00"
},
{
"id": 187213,
@@ -1049,7 +1067,8 @@
],
"subtitle": null,
"music_type": null,
"created_at": "2021-11-14 10:31:42"
"created_at": "2021-11-14 10:31:42",
"created_at_iso": "2021-11-14T10:31:42+02:00"
},
{
"id": 187212,
@@ -1095,7 +1114,8 @@
}
],
"music_type": null,
"created_at": "2021-11-14 10:28:11"
"created_at": "2021-11-14 10:28:11",
"created_at_iso": "2021-11-14T10:28:11+02:00"
},
{
"id": 187210,
@@ -1136,7 +1156,8 @@
],
"subtitle": null,
"music_type": null,
"created_at": "2021-11-14 10:28:10"
"created_at": "2021-11-14 10:28:10",
"created_at_iso": "2021-11-14T10:28:10+02:00"
},
{
"id": 187211,
@@ -1182,7 +1203,8 @@
}
],
"music_type": null,
"created_at": "2021-11-14 10:28:10"
"created_at": "2021-11-14 10:28:10",
"created_at_iso": "2021-11-14T10:28:10+02:00"
},
{
"id": 187209,
@@ -1223,7 +1245,8 @@
],
"subtitle": null,
"music_type": null,
"created_at": "2021-11-14 10:28:09"
"created_at": "2021-11-14 10:28:09",
"created_at_iso": "2021-11-14T10:28:09+02:00"
},
{
"id": 187208,
@@ -1269,7 +1292,8 @@
}
],
"music_type": null,
"created_at": "2021-11-14 09:24:47"
"created_at": "2021-11-14 09:24:47",
"created_at_iso": "2021-11-14T09:24:47+02:00"
},
{
"id": 187207,
@@ -1319,7 +1343,8 @@
}
],
"music_type": null,
"created_at": "2021-11-14 09:24:46"
"created_at": "2021-11-14 09:24:46",
"created_at_iso": "2021-11-14T09:24:46+02:00"
},
{
"id": 187206,
@@ -1360,7 +1385,8 @@
],
"subtitle": null,
"music_type": null,
"created_at": "2021-11-14 09:24:45"
"created_at": "2021-11-14 09:24:45",
"created_at_iso": "2021-11-14T09:24:45+02:00"
},
{
"id": 187205,
@@ -1401,7 +1427,8 @@
],
"subtitle": null,
"music_type": null,
"created_at": "2021-11-14 09:24:44"
"created_at": "2021-11-14 09:24:44",
"created_at_iso": "2021-11-14T09:24:44+02:00"
},
{
"id": 187204,
@@ -1447,7 +1474,8 @@
}
],
"music_type": null,
"created_at": "2021-11-14 09:20:56"
"created_at": "2021-11-14 09:20:56",
"created_at_iso": "2021-11-14T09:20:56+02:00"
},
{
"id": 187203,
@@ -1488,7 +1516,8 @@
],
"subtitle": null,
"music_type": null,
"created_at": "2021-11-14 09:20:55"
"created_at": "2021-11-14 09:20:55",
"created_at_iso": "2021-11-14T09:20:55+02:00"
},
{
"id": 187202,
@@ -1529,7 +1558,8 @@
],
"subtitle": null,
"music_type": null,
"created_at": "2021-11-14 09:20:54"
"created_at": "2021-11-14 09:20:54",
"created_at_iso": "2021-11-14T09:20:54+02:00"
},
{
"id": 187201,
@@ -1570,7 +1600,8 @@
],
"subtitle": null,
"music_type": null,
"created_at": "2021-11-14 09:20:53"
"created_at": "2021-11-14 09:20:53",
"created_at_iso": "2021-11-14T09:20:53+02:00"
},
{
"id": 187200,
@@ -1611,7 +1642,8 @@
],
"subtitle": null,
"music_type": null,
"created_at": "2021-11-14 09:17:35"
"created_at": "2021-11-14 09:17:35",
"created_at_iso": "2021-11-14T09:17:35+02:00"
},
{
"id": 187199,
@@ -1652,7 +1684,8 @@
],
"subtitle": null,
"music_type": null,
"created_at": "2021-11-14 09:17:34"
"created_at": "2021-11-14 09:17:34",
"created_at_iso": "2021-11-14T09:17:34+02:00"
},
{
"id": 187197,
@@ -1718,7 +1751,8 @@
}
],
"music_type": null,
"created_at": "2021-11-14 09:14:24"
"created_at": "2021-11-14 09:14:24",
"created_at_iso": "2021-11-14T09:14:24+02:00"
},
{
"id": 187196,
@@ -1764,7 +1798,8 @@
}
],
"music_type": null,
"created_at": "2021-11-14 09:08:42"
"created_at": "2021-11-14 09:08:42",
"created_at_iso": "2021-11-14T09:08:42+02:00"
},
{
"id": 187195,
@@ -1805,7 +1840,8 @@
],
"subtitle": null,
"music_type": null,
"created_at": "2021-11-14 09:08:29"
"created_at": "2021-11-14 09:08:29",
"created_at_iso": "2021-11-14T09:08:29+02:00"
},
{
"id": 187191,
@@ -1814,7 +1850,7 @@
"type_id": 2,
"type": "TV-Show",
"info_hash": "(removed)",
"file_name": "Beware of Your Bosom Buddies \u78a7\u8840\u6d17\u94f6\u67aa (1984) 720p Complete WEB-DL AAC H.264-CARMEE",
"file_name": "Beware of Your Bosom Buddies 碧血洗银枪 (1984) 720p Complete WEB-DL AAC H.264-CARMEE",
"file_size": 4075094335,
"file_count": 5,
"seed": 7,
@@ -1832,7 +1868,7 @@
"imdb": null,
"tmdb": "107936",
"tvdb": null,
"title": "\u78a7\u8840\u6d17\u94f6\u67aa",
"title": "碧血洗银枪",
"tv_season": null,
"tv_episode": null,
"tv_full_season": false,
@@ -1859,7 +1895,8 @@
}
],
"music_type": null,
"created_at": "2021-11-14 07:34:25"
"created_at": "2021-11-14 07:34:25",
"created_at_iso": "2021-11-14T07:34:25+02:00"
},
{
"id": 187190,
@@ -1929,7 +1966,8 @@
}
],
"music_type": null,
"created_at": "2021-11-14 07:24:31"
"created_at": "2021-11-14 07:24:31",
"created_at_iso": "2021-11-14T07:24:31+02:00"
},
{
"id": 187189,
@@ -1999,7 +2037,8 @@
}
],
"music_type": null,
"created_at": "2021-11-14 07:24:26"
"created_at": "2021-11-14 07:24:26",
"created_at_iso": "2021-11-14T07:24:26+02:00"
},
{
"id": 187188,
@@ -2073,7 +2112,8 @@
}
],
"music_type": null,
"created_at": "2021-11-14 07:12:25"
"created_at": "2021-11-14 07:12:25",
"created_at_iso": "2021-11-14T07:12:25+02:00"
},
{
"id": 187169,
@@ -2147,7 +2187,8 @@
}
],
"music_type": null,
"created_at": "2021-11-14 01:18:23"
"created_at": "2021-11-14 01:18:23",
"created_at_iso": "2021-11-14T01:18:23+02:00"
},
{
"id": 187168,
@@ -2193,7 +2234,8 @@
}
],
"music_type": null,
"created_at": "2021-11-14 00:57:43"
"created_at": "2021-11-14 00:57:43",
"created_at_iso": "2021-11-14T00:57:43+02:00"
},
{
"id": 187167,
@@ -2239,7 +2281,8 @@
}
],
"music_type": null,
"created_at": "2021-11-14 00:42:20"
"created_at": "2021-11-14 00:42:20",
"created_at_iso": "2021-11-14T00:42:20+02:00"
},
{
"id": 187165,
@@ -2285,7 +2328,8 @@
}
],
"music_type": null,
"created_at": "2021-11-14 00:03:50"
"created_at": "2021-11-14 00:03:50",
"created_at_iso": "2021-11-14T00:03:50+02:00"
},
{
"id": 187164,
@@ -2355,7 +2399,8 @@
}
],
"music_type": null,
"created_at": "2021-11-13 23:07:25"
"created_at": "2021-11-13 23:07:25",
"created_at_iso": "2021-11-13T23:07:25+02:00"
},
{
"id": 187163,
@@ -2382,7 +2427,7 @@
"imdb": null,
"tmdb": "138573",
"tvdb": null,
"title": "\u51b2\u51fb",
"title": "冲击",
"tv_season": null,
"tv_episode": null,
"tv_full_season": false,
@@ -2396,7 +2441,8 @@
],
"subtitle": null,
"music_type": null,
"created_at": "2021-11-13 22:46:14"
"created_at": "2021-11-13 22:46:14",
"created_at_iso": "2021-11-13T22:46:14+02:00"
},
{
"id": 187162,
@@ -2454,7 +2500,8 @@
}
],
"music_type": null,
"created_at": "2021-11-13 22:10:28"
"created_at": "2021-11-13 22:10:28",
"created_at_iso": "2021-11-13T22:10:28+02:00"
},
{
"id": 187158,
@@ -2500,7 +2547,8 @@
}
],
"music_type": null,
"created_at": "2021-11-13 20:58:54"
"created_at": "2021-11-13 20:58:54",
"created_at_iso": "2021-11-13T20:58:54+02:00"
},
{
"id": 187157,
@@ -2546,7 +2594,8 @@
}
],
"music_type": null,
"created_at": "2021-11-13 20:58:52"
"created_at": "2021-11-13 20:58:52",
"created_at_iso": "2021-11-13T20:58:52+02:00"
},
{
"id": 187156,
@@ -2592,7 +2641,8 @@
}
],
"music_type": null,
"created_at": "2021-11-13 20:58:49"
"created_at": "2021-11-13 20:58:49",
"created_at_iso": "2021-11-13T20:58:49+02:00"
},
{
"id": 187155,
@@ -2638,7 +2688,8 @@
}
],
"music_type": null,
"created_at": "2021-11-13 19:53:29"
"created_at": "2021-11-13 19:53:29",
"created_at_iso": "2021-11-13T19:53:29+02:00"
},
{
"id": 187150,
@@ -2684,7 +2735,8 @@
}
],
"music_type": null,
"created_at": "2021-11-13 17:04:28"
"created_at": "2021-11-13 17:04:28",
"created_at_iso": "2021-11-13T17:04:28+02:00"
},
{
"id": 187149,
@@ -2730,7 +2782,8 @@
}
],
"music_type": null,
"created_at": "2021-11-13 17:04:26"
"created_at": "2021-11-13 17:04:26",
"created_at_iso": "2021-11-13T17:04:26+02:00"
},
{
"id": 187148,
@@ -2776,7 +2829,8 @@
}
],
"music_type": null,
"created_at": "2021-11-13 17:04:23"
"created_at": "2021-11-13 17:04:23",
"created_at_iso": "2021-11-13T17:04:23+02:00"
},
{
"id": 187147,
@@ -2822,7 +2876,8 @@
}
],
"music_type": null,
"created_at": "2021-11-13 17:04:11"
"created_at": "2021-11-13 17:04:11",
"created_at_iso": "2021-11-13T17:04:11+02:00"
},
{
"id": 187146,
@@ -2868,7 +2923,8 @@
}
],
"music_type": null,
"created_at": "2021-11-13 16:59:50"
"created_at": "2021-11-13 16:59:50",
"created_at_iso": "2021-11-13T16:59:50+02:00"
},
{
"id": 187145,
@@ -2914,7 +2970,8 @@
}
],
"music_type": null,
"created_at": "2021-11-13 16:57:51"
"created_at": "2021-11-13 16:57:51",
"created_at_iso": "2021-11-13T16:57:51+02:00"
},
{
"id": 187144,
@@ -2960,7 +3017,8 @@
}
],
"music_type": null,
"created_at": "2021-11-13 16:54:53"
"created_at": "2021-11-13 16:54:53",
"created_at_iso": "2021-11-13T16:54:53+02:00"
},
{
"id": 187143,
@@ -3006,7 +3064,8 @@
}
],
"music_type": null,
"created_at": "2021-11-13 16:54:51"
"created_at": "2021-11-13 16:54:51",
"created_at_iso": "2021-11-13T16:54:51+02:00"
},
{
"id": 187142,
@@ -3052,7 +3111,8 @@
}
],
"music_type": null,
"created_at": "2021-11-13 16:54:49"
"created_at": "2021-11-13 16:54:49",
"created_at_iso": "2021-11-13T16:54:49+02:00"
},
{
"id": 187141,
@@ -3098,7 +3158,8 @@
}
],
"music_type": null,
"created_at": "2021-11-13 16:54:46"
"created_at": "2021-11-13 16:54:46",
"created_at_iso": "2021-11-13T16:54:46+02:00"
},
{
"id": 187140,
@@ -3144,7 +3205,8 @@
}
],
"music_type": null,
"created_at": "2021-11-13 16:54:43"
"created_at": "2021-11-13 16:54:43",
"created_at_iso": "2021-11-13T16:54:43+02:00"
},
{
"id": 187139,
@@ -3190,7 +3252,8 @@
}
],
"music_type": null,
"created_at": "2021-11-13 16:03:36"
"created_at": "2021-11-13 16:03:36",
"created_at_iso": "2021-11-13T16:03:36+02:00"
},
{
"id": 187138,
@@ -3236,7 +3299,8 @@
}
],
"music_type": null,
"created_at": "2021-11-13 16:03:31"
"created_at": "2021-11-13 16:03:31",
"created_at_iso": "2021-11-13T16:03:31+02:00"
},
{
"id": 187137,
@@ -3282,7 +3346,8 @@
}
],
"music_type": null,
"created_at": "2021-11-13 14:47:56"
"created_at": "2021-11-13 14:47:56",
"created_at_iso": "2021-11-13T14:47:56+02:00"
},
{
"id": 187136,
@@ -3328,7 +3393,8 @@
}
],
"music_type": null,
"created_at": "2021-11-13 13:54:18"
"created_at": "2021-11-13 13:54:18",
"created_at_iso": "2021-11-13T13:54:18+02:00"
},
{
"id": 187135,
@@ -3378,7 +3444,8 @@
}
],
"music_type": null,
"created_at": "2021-11-13 13:01:47"
"created_at": "2021-11-13 13:01:47",
"created_at_iso": "2021-11-13T13:01:47+02:00"
},
{
"id": 187134,
@@ -3424,7 +3491,8 @@
}
],
"music_type": null,
"created_at": "2021-11-13 12:57:53"
"created_at": "2021-11-13 12:57:53",
"created_at_iso": "2021-11-13T12:57:53+02:00"
},
{
"id": 187133,
@@ -3470,7 +3538,8 @@
}
],
"music_type": null,
"created_at": "2021-11-13 12:48:57"
"created_at": "2021-11-13 12:48:57",
"created_at_iso": "2021-11-13T12:48:57+02:00"
},
{
"id": 187132,
@@ -3528,7 +3597,8 @@
}
],
"music_type": null,
"created_at": "2021-11-13 12:10:57"
"created_at": "2021-11-13 12:10:57",
"created_at_iso": "2021-11-13T12:10:57+02:00"
},
{
"id": 187131,
@@ -3569,7 +3639,8 @@
],
"subtitle": null,
"music_type": null,
"created_at": "2021-11-13 11:35:53"
"created_at": "2021-11-13 11:35:53",
"created_at_iso": "2021-11-13T11:35:53+02:00"
},
{
"id": 187130,
@@ -3615,7 +3686,8 @@
}
],
"music_type": null,
"created_at": "2021-11-13 11:03:19"
"created_at": "2021-11-13 11:03:19",
"created_at_iso": "2021-11-13T11:03:19+02:00"
},
{
"id": 187129,
@@ -3656,7 +3728,8 @@
],
"subtitle": null,
"music_type": null,
"created_at": "2021-11-13 11:02:54"
"created_at": "2021-11-13 11:02:54",
"created_at_iso": "2021-11-13T11:02:54+02:00"
},
{
"id": 187128,
@@ -3706,7 +3779,8 @@
}
],
"music_type": null,
"created_at": "2021-11-13 11:00:29"
"created_at": "2021-11-13 11:00:29",
"created_at_iso": "2021-11-13T11:00:29+02:00"
},
{
"id": 187127,
@@ -3752,7 +3826,8 @@
}
],
"music_type": null,
"created_at": "2021-11-13 10:57:36"
"created_at": "2021-11-13 10:57:36",
"created_at_iso": "2021-11-13T10:57:36+02:00"
},
{
"id": 187126,
@@ -3802,7 +3877,8 @@
}
],
"music_type": null,
"created_at": "2021-11-13 10:55:31"
"created_at": "2021-11-13 10:55:31",
"created_at_iso": "2021-11-13T10:55:31+02:00"
},
{
"id": 187125,
@@ -3848,7 +3924,8 @@
}
],
"music_type": null,
"created_at": "2021-11-13 10:53:16"
"created_at": "2021-11-13 10:53:16",
"created_at_iso": "2021-11-13T10:53:16+02:00"
},
{
"id": 187124,
@@ -3889,7 +3966,8 @@
],
"subtitle": null,
"music_type": null,
"created_at": "2021-11-13 10:23:32"
"created_at": "2021-11-13 10:23:32",
"created_at_iso": "2021-11-13T10:23:32+02:00"
},
{
"id": 187123,
@@ -3939,7 +4017,8 @@
}
],
"music_type": null,
"created_at": "2021-11-13 10:23:31"
"created_at": "2021-11-13 10:23:31",
"created_at_iso": "2021-11-13T10:23:31+02:00"
},
{
"id": 187122,
@@ -3980,7 +4059,8 @@
],
"subtitle": null,
"music_type": null,
"created_at": "2021-11-13 10:23:30"
"created_at": "2021-11-13 10:23:30",
"created_at_iso": "2021-11-13T10:23:30+02:00"
},
{
"id": 187121,
@@ -4021,7 +4101,8 @@
],
"subtitle": null,
"music_type": null,
"created_at": "2021-11-13 10:23:29"
"created_at": "2021-11-13 10:23:29",
"created_at_iso": "2021-11-13T10:23:29+02:00"
},
{
"id": 187120,
@@ -4067,7 +4148,8 @@
}
],
"music_type": null,
"created_at": "2021-11-13 10:15:29"
"created_at": "2021-11-13 10:15:29",
"created_at_iso": "2021-11-13T10:15:29+02:00"
},
{
"id": 187119,
@@ -4113,7 +4195,8 @@
}
],
"music_type": null,
"created_at": "2021-11-13 10:15:28"
"created_at": "2021-11-13 10:15:28",
"created_at_iso": "2021-11-13T10:15:28+02:00"
},
{
"id": 187118,
@@ -4154,7 +4237,8 @@
],
"subtitle": null,
"music_type": null,
"created_at": "2021-11-13 10:15:27"
"created_at": "2021-11-13 10:15:27",
"created_at_iso": "2021-11-13T10:15:27+02:00"
},
{
"id": 187117,
@@ -4195,7 +4279,8 @@
],
"subtitle": null,
"music_type": null,
"created_at": "2021-11-13 10:15:26"
"created_at": "2021-11-13 10:15:26",
"created_at_iso": "2021-11-13T10:15:26+02:00"
},
{
"id": 187116,
@@ -4236,7 +4321,8 @@
],
"subtitle": null,
"music_type": null,
"created_at": "2021-11-13 09:54:52"
"created_at": "2021-11-13 09:54:52",
"created_at_iso": "2021-11-13T09:54:52+02:00"
},
{
"id": 187115,
@@ -4286,7 +4372,8 @@
}
],
"music_type": null,
"created_at": "2021-11-13 09:54:51"
"created_at": "2021-11-13 09:54:51",
"created_at_iso": "2021-11-13T09:54:51+02:00"
},
{
"id": 187114,
@@ -4327,7 +4414,8 @@
],
"subtitle": null,
"music_type": null,
"created_at": "2021-11-13 09:54:50"
"created_at": "2021-11-13 09:54:50",
"created_at_iso": "2021-11-13T09:54:50+02:00"
},
{
"id": 187113,
@@ -4368,7 +4456,8 @@
],
"subtitle": null,
"music_type": null,
"created_at": "2021-11-13 09:54:48"
"created_at": "2021-11-13 09:54:48",
"created_at_iso": "2021-11-13T09:54:48+02:00"
},
{
"id": 187112,
@@ -4409,7 +4498,8 @@
],
"subtitle": null,
"music_type": null,
"created_at": "2021-11-13 09:50:35"
"created_at": "2021-11-13 09:50:35",
"created_at_iso": "2021-11-13T09:50:35+02:00"
},
{
"id": 187111,
@@ -4463,7 +4553,8 @@
}
],
"music_type": null,
"created_at": "2021-11-13 09:50:34"
"created_at": "2021-11-13 09:50:34",
"created_at_iso": "2021-11-13T09:50:34+02:00"
},
{
"id": 187110,
@@ -4504,7 +4595,8 @@
],
"subtitle": null,
"music_type": null,
"created_at": "2021-11-13 09:50:32"
"created_at": "2021-11-13 09:50:32",
"created_at_iso": "2021-11-13T09:50:32+02:00"
},
{
"id": 187109,
@@ -4545,7 +4637,8 @@
],
"subtitle": null,
"music_type": null,
"created_at": "2021-11-13 09:50:31"
"created_at": "2021-11-13 09:50:31",
"created_at_iso": "2021-11-13T09:50:31+02:00"
},
{
"id": 187107,
@@ -4586,7 +4679,8 @@
],
"subtitle": null,
"music_type": null,
"created_at": "2021-11-13 09:44:55"
"created_at": "2021-11-13 09:44:55",
"created_at_iso": "2021-11-13T09:44:55+02:00"
},
{
"id": 187106,
@@ -4632,7 +4726,8 @@
}
],
"music_type": null,
"created_at": "2021-11-13 09:44:54"
"created_at": "2021-11-13 09:44:54",
"created_at_iso": "2021-11-13T09:44:54+02:00"
},
{
"id": 187105,
@@ -4673,7 +4768,8 @@
],
"subtitle": null,
"music_type": null,
"created_at": "2021-11-13 09:44:53"
"created_at": "2021-11-13 09:44:53",
"created_at_iso": "2021-11-13T09:44:53+02:00"
},
{
"id": 187104,
@@ -4714,7 +4810,8 @@
],
"subtitle": null,
"music_type": null,
"created_at": "2021-11-13 09:44:51"
"created_at": "2021-11-13 09:44:51",
"created_at_iso": "2021-11-13T09:44:51+02:00"
},
{
"id": 187103,
@@ -4760,7 +4857,8 @@
}
],
"music_type": null,
"created_at": "2021-11-13 09:40:07"
"created_at": "2021-11-13 09:40:07",
"created_at_iso": "2021-11-13T09:40:07+02:00"
},
{
"id": 187102,
@@ -4810,7 +4908,8 @@
}
],
"music_type": null,
"created_at": "2021-11-13 09:39:53"
"created_at": "2021-11-13 09:39:53",
"created_at_iso": "2021-11-13T09:39:53+02:00"
},
{
"id": 187101,
@@ -4856,7 +4955,8 @@
}
],
"music_type": null,
"created_at": "2021-11-13 09:39:52"
"created_at": "2021-11-13 09:39:52",
"created_at_iso": "2021-11-13T09:39:52+02:00"
}
],
"first_page_url": "https:\/\/avistaz.to\/api\/v1\/jackett\/torrents?type=2&page=1",
@@ -4869,4 +4969,4 @@
"prev_page_url": null,
"to": 100,
"total": 31393
}
}

View File

@@ -1,4 +1,4 @@
{
{
"current_page": 1,
"data": [
{
@@ -50,7 +50,8 @@
"images/torrent/1/4/0/mxgwdlpk4pt2.jpg"
],
"description": "<p>[SSIS-419] My first experience is Yua Mikami. From the day I lost my virginity, I was devoted to sex.</p>\n<p>Actress: Yua Mikami</p>\n<p>Studio: S1 NO.1 STYLE</p>\n<p>Runtime: 2:41:00</p>\n<p>Movies Genres: Minimal Mosaic,Cherry Boy,Documentary,Featured Actress,Idol &amp; Celebrity</p>",
"created_at": "2022-06-11 11:04:50"
"created_at": "2022-06-11 11:04:50",
"created_at_iso": "2022-06-11T11:04:50+02:00"
},
{
"id": 61953,
@@ -106,7 +107,8 @@
"images/torrent/0/4/0/gsuctius9zw2.jpg"
],
"description": "<p>https://www.r18.com/videos/vod/movies/detail/-/id=ssis00338/</p>\n<p>SSIS-338</p>\n<p>Ultimate Lover Swamp. Ideal Sex-Only Relationship That Is Not Disturbed By Work Or Family With Yua Mikami</p>",
"created_at": "2022-05-23 23:41:25"
"created_at": "2022-05-23 23:41:25",
"created_at_iso": "2022-05-23T23:41:25+02:00"
},
{
"id": 61947,
@@ -161,7 +163,8 @@
"images/torrent/0/0/e/g6tquwvlmfdx.jpg"
],
"description": "<p>https://www.r18.com/videos/vod/movies/detail/-/id=ssis00313/</p>\n<p>SSIS-313</p>\n<p>Yua Mikami's Ecstasy Lotion Special. Offering The Best-ever Slick Servicing To Work Cum Loads Out.</p>",
"created_at": "2022-05-23 08:34:34"
"created_at": "2022-05-23 08:34:34",
"created_at_iso": "2022-05-23T08:34:34+02:00"
},
{
"id": 61630,
@@ -223,7 +226,8 @@
"images/torrent/f/2/5/kdihq6gibacb.jpg"
],
"description": "<p>https://www.r18.com/videos/vod/movies/detail/-/id=ssis00287/</p>\n<p>SSIS-287</p>\n<p>Drool, The Effects Of A Few Sips, Her Face During Sex, And Peeing Released All At Once. Yua Mikami Flies Indecently.</p>",
"created_at": "2022-05-21 10:25:32"
"created_at": "2022-05-21 10:25:32",
"created_at_iso": "2022-05-21T10:25:32+02:00"
},
{
"id": 61514,
@@ -275,7 +279,8 @@
"images/torrent/e/2/a/ujrvmtgjakko.jpg"
],
"description": "<p>https://www.r18.com/videos/vod/movies/detail/-/id=ssis00241/</p>\n<p>SSIS-241</p>\n<p>Forbidden Teacher Love. Yua Mikami</p>",
"created_at": "2022-05-20 09:17:10"
"created_at": "2022-05-20 09:17:10",
"created_at_iso": "2022-05-20T09:17:10+02:00"
},
{
"id": 59929,
@@ -325,7 +330,8 @@
"images/torrent/c/4/a/hycbduxlw3ei.jpg"
],
"description": "<p><strong>[SSIS-392] Let's Do It At A Men's Massage Parlor. Yua Mikami</strong></p>\n<p><strong>+++ [FHD] SSIS-392 メンエスでしようよ 三上悠亜</strong></p>\n<p><strong>ID:</strong> SSIS-392<br><strong>Release Date:</strong> May 6, 2022<br><strong>Runtime:</strong> 1 hour 58 minutes 59 seconds [01:59:00]<br><strong>Studio:</strong> S1 NO.1 STYLE<br><strong>Label:</strong> S1 NO.1 STYLE<br><strong>Director:</strong> TAKE-D<br><strong>Series:</strong> A Super Gorgeous Men's Massage Parlor<br><strong>Actresses:</strong> Yua Mikami<br><strong>Categories:</strong> Featured Actress, Idol &amp; Celebrity, Massage Parlor, Lotion, Minimal Mosaic, Hi-Def, 4K<br><br></p>\n<p><strong>Website:</strong> https://s1s1s1.com/works/detail/SSIS392/ <br><strong>R18:</strong> https://www.r18.com/videos/vod/movies/detail/-/id=ssis00392/ <br><strong>DMM:</strong> https://www.dmm.co.jp/digital/videoa/-/detail/=/cid=ssis00392/</p>\n<p>Uploaded by a Bot</p>",
"created_at": "2022-05-06 03:48:23"
"created_at": "2022-05-06 03:48:23",
"created_at_iso": "2022-05-06T03:48:23+02:00"
},
{
"id": 58235,
@@ -374,7 +380,8 @@
"images/torrent/3/6/1/6fuhfb5kcbpz.jpg"
],
"description": "<p><strong>[SSIS-365] \"What!? We're Gonna Fuck Here?\" Sticking Close To Yua Mikami For A Whole Month, Taking Advantage Any Time There's A Chance For A Quick Fuck! Unprecedented Hidden Camera AV Primetime Challenge.</strong></p>\n <p><strong>+++ [HD] SSIS-365 「えっ!ここでヤルの?」三上悠亜に一ヶ月密着して隙あらばいきなり即ズボッ! 前代未聞ドッキリAV大作戦</strong></p>\n <p><strong>ID:</strong> SSIS-365<br>\n <strong>Release Date:</strong> Apr 8, 2022<br>\n <strong>Runtime:</strong> 2 hours 5 minutes 59 seconds\n [02:06:00]<br>\n <strong>Studio:</strong> S1 NO.1 STYLE<br>\n <strong>Label:</strong> S1 NO.1 STYLE<br>\n <strong>Director:</strong> Kyosei<br>\n <strong>Series:</strong> -<br>\n <strong>Actresses:</strong> Yua Mikami<br>\n <strong>Categories:</strong> Big Tits, Quickie, Featured Actress, Blowjob, Minimal Mosaic, Hi-Def<br><br>\n </p><p><strong>Website:</strong> https://s1s1s1.com/works/detail/SSIS365/</p>\n<p><strong>R18:</strong> https://www.r18.com/videos/vod/movies/detail/-/id=ssis00365/</p><p>Uploaded by a Bot</p>",
"created_at": "2022-04-08 06:31:27"
"created_at": "2022-04-08 06:31:27",
"created_at_iso": "2022-04-08T06:31:27+02:00"
},
{
"id": 57416,
@@ -640,7 +647,8 @@
"images/torrent/3/8/f/hxzly7alqt9f.jpg"
],
"description": null,
"created_at": "2022-03-29 20:58:49"
"created_at": "2022-03-29 20:58:49",
"created_at_iso": "2022-03-29T20:58:49+02:00"
},
{
"id": 56332,
@@ -690,7 +698,8 @@
"images/torrent/2/9/6/bw4kyn1ckz5u.jpg"
],
"description": "<p>De-censored with AI algorithm. </p>\n<p>Originated from [OFJE-304] Gorgeous Big Tits Bouncing All Over The Place! All G-Cup And Bigger Actresses Ride Dick Until They Cum 50 Rounds</p>\n<p>+++ [HD] OFJE-304 縦横無尽に神乳が揺れまくりっオールGcup超えS1女優のおっぱい激揺れ激イキ激ピスSEX50本番</p>\n<p>https://www.r18.com/videos/vod/movies/detail/-/id=ofje00304/</p>",
"created_at": "2022-03-10 09:06:27"
"created_at": "2022-03-10 09:06:27",
"created_at_iso": "2022-03-10T09:06:27+01:00"
},
{
"id": 56108,
@@ -742,7 +751,8 @@
"images/torrent/d/6/b/gexzyognkxeb.jpg"
],
"description": "<p><strong>[SSIS-338] Ultimate Lover Swamp. Ideal Sex-Only Relationship That Is Not Disturbed By Work Or Family With Yua Mikami</strong></p>\n <p><strong>+++ [HD] SSIS-338 最高の愛人沼 仕事にも家庭にも干渉してこない、セックスだけの理想関係を三上悠亜と…。</strong></p>\n <p><strong>ID:</strong> SSIS-338<br>\n <strong>Release Date:</strong> Mar 4, 2022<br>\n <strong>Runtime:</strong> 2 hours 25 minutes 59 seconds\n [02:26:00]<br>\n <strong>Studio:</strong> S1 NO.1 STYLE<br>\n <strong>Label:</strong> S1 NO.1 STYLE<br>\n <strong>Director:</strong> Amazing Meat<br>\n <strong>Series:</strong> -<br>\n <strong>Actresses:</strong> Yua Mikami<br>\n <strong>Categories:</strong> Adultery, Featured Actress, Cheating Wife, Drama, Minimal Mosaic, Hi-Def, 4K<br><br>\n </p><p><strong>Website:</strong> https://s1s1s1.com/works/detail/SSIS338/</p>\n<p><strong>R18:</strong> https://www.r18.com/videos/vod/movies/detail/-/id=ssis00338/</p><p>Uploaded by a Bot</p>",
"created_at": "2022-03-04 05:28:49"
"created_at": "2022-03-04 05:28:49",
"created_at_iso": "2022-03-04T05:28:49+01:00"
},
{
"id": 54324,
@@ -797,7 +807,8 @@
"images/torrent/9/7/d/ujzu5he0deum.jpg"
],
"description": "<p><strong>[SSIS-313] Yua Mikami's Ecstasy Lotion Special. Offering The Best-ever Slick Servicing To Work Cum Loads Out.</strong></p>\n<p><strong>SSIS-313 三上悠亜の有頂天ローションSP 人生最高ヌルヌルご奉仕で射精させてあげる</strong></p>\n<p><strong>ID:</strong> SSIS-313<br><strong>Release Date:</strong> Feb 4, 2022<br><strong>Runtime:</strong> 2 hours 27 minutes 59 seconds [02:28:00]<br><strong>Studio:</strong> S1 NO.1 STYLE<br><strong>Label:</strong> S1 NO.1 STYLE<br><strong>Director:</strong> TAKE-D<br><strong>Series:</strong> Ecstatic Lotion SP<br><strong>Actresses:</strong> Yua Mikami<br><strong>Categories:</strong> Big Tits, Featured Actress, Idol &amp; Celebrity, Titty Fuck, Lotion, Minimal Mosaic, Hi-Def, 4K<br><br></p>\n<p><strong>Website:</strong> https://s1s1s1.com/works/detail/SSIS313/</p>\n<p><strong>R18:</strong> https://www.r18.com/videos/vod/movies/detail/-/id=ssis00313/</p>",
"created_at": "2022-02-04 07:02:14"
"created_at": "2022-02-04 07:02:14",
"created_at_iso": "2022-02-04T07:02:14+01:00"
},
{
"id": 53526,
@@ -864,7 +875,8 @@
"images/torrent/7/d/0/w4lraenuqmos.jpg"
],
"description": "<p><strong>[OFJE-281] Yua Mikami x Shame Special This National-Grade Idol Is Getting Continuously Fucked 8 Hours</strong></p>\n <p><strong>+++ [HD] OFJE-281 三上悠亜×レ●プSpecial 国民的アイドルをひたすら犯し続ける8時間</strong></p>\n <p><strong>ID:</strong> OFJE-281<br>\n <strong>Release Date:</strong> Nov 6, 2020<br>\n <strong>Runtime:</strong> 7 hours 56 minutes 59 seconds\n [07:57:00]<br>\n <strong>Studio:</strong> S1 NO.1 STYLE<br>\n <strong>Label:</strong> S1 NO.1 STYLE<br>\n <strong>Director:</strong> <br>\n <strong>Series:</strong> S1 GIRLS COLLECTION<br>\n <strong>Actresses:</strong> Yua Mikami<br>\n <strong>Categories:</strong> Beautiful Girl, Featured Actress, Nymphomaniac, Idol &amp; Celebrity, Over 4 Hours, Hi-Def, Actress Best Compilation<br><br>\n </p><p><strong>Website:</strong> https://s1s1s1.com/works/detail/OFJE281/</p>\n<p><strong>R18:</strong> https://www.r18.com/videos/vod/movies/detail/-/id=ofje00281/</p><p>Uploaded by a Bot</p>",
"created_at": "2022-01-26 12:46:09"
"created_at": "2022-01-26 12:46:09",
"created_at_iso": "2022-01-26T12:46:09+01:00"
},
{
"id": 52648,
@@ -915,7 +927,8 @@
"images/torrent/8/7/2/92ph60ekxpkx.jpg"
],
"description": "<p>Actresses: Yua Mikami<br>Categories<br>Big TitsFeatured ActressNymphomaniacIdol &amp; CelebritySquirtingMinimal MosaicHi-Def4K<br>Studio: S1 NO.1 STYLE <br>Series: Release All At Once And Fly Vulgarly<br> Release date: Jan 7, 2022<br>Runtime: 150min<br>Director: Mon C<br>Label: S1 NO.1 STYLE<br>Content ID: ssis00287<br>DVD ID: SSIS-287<br>Languages: Japanese<br><br></p>",
"created_at": "2022-01-07 13:01:13"
"created_at": "2022-01-07 13:01:13",
"created_at_iso": "2022-01-07T13:01:13+01:00"
},
{
"id": 52438,
@@ -972,7 +985,8 @@
"images/torrent/0/9/2/yhdsjr2jrf2k.gif"
],
"description": "<p><a href=\"https://exoticaz.to/torrents?in=1&amp;search=KnickerZ&amp;uploader=&amp;verifier=\"><img src=\"https://i.exoticaz.to/images/torrent/e/3/9/i7bfled2kuss.jpg\" width=\"824\" height=\"300\" alt=\"i7bfled2kuss.jpg\"></a></p>\n<p>[SSIS-270] Yua Mikami - Earnestly Small Devil Chikubiti All-round 200 Minutes Nipple Licking Blame Rolling (4K)</p>\n<p>Scene 1: Yua plays with a toy boob<br>Scene 2: Yua seduces teacher, missionary and cums on tits<br>Various Sex Acts Included : Oral, Doggy, One on One sex, MF sex, Facials, Cumshots, Missionary Sex, Handjob, Blowjobs, Blowbangs, Handjobs, Cowgirl &amp; Reverse-Cowgirl, Deep-throat, Solo tease, Solo Masturbation, Toy/Dildo play, Kissing, etc</p>\n\n<p>                                        <img src=\"https://i.exoticaz.to/images/torrent/0/9/2/yhdsjr2jrf2k.gif\" alt=\"yhdsjr2jrf2k.gif\"></p>",
"created_at": "2022-01-03 12:59:46"
"created_at": "2022-01-03 12:59:46",
"created_at_iso": "2022-01-03T12:59:46+01:00"
},
{
"id": 52436,
@@ -1023,7 +1037,8 @@
"images/torrent/1/0/9/rj8pemdpmdce.gif"
],
"description": "<p><a href=\"https://exoticaz.to/torrents?in=1&amp;search=KnickerZ&amp;uploader=&amp;verifier=\"><img src=\"https://i.exoticaz.to/images/torrent/e/3/9/i7bfled2kuss.jpg\" width=\"824\" height=\"300\" alt=\"i7bfled2kuss.jpg\"></a></p>\n<p>[SSIS-211] Yua Mikami - You're At A Whore House, And One Of Japan's Top Pornstars Appears Right In Front Of You! Do You Fuck Her Or Fuck Off? (4K)</p>\n<p>Scene 1: Yua gives a handjob<br>Scene 2: Blowjob &amp; doggy<br>Various Sex Acts Included : Oral, Doggy, One on One sex, MF sex, Facials, Cumshots, Missionary Sex, Handjob, Blowjobs, Blowbangs, Handjobs, Cowgirl &amp; Reverse-Cowgirl, Deep-throat, Solo tease, Solo Masturbation, Toy/Dildo play, Kissing, etc</p>\n\n<p>                                                     <img src=\"https://i.exoticaz.to/images/torrent/1/0/9/rj8pemdpmdce.gif\" alt=\"rj8pemdpmdce.gif\"></p>",
"created_at": "2022-01-03 12:55:28"
"created_at": "2022-01-03 12:55:28",
"created_at_iso": "2022-01-03T12:55:28+01:00"
},
{
"id": 52434,
@@ -1074,7 +1089,8 @@
"images/torrent/9/0/6/jpoyeqdohhft.gif"
],
"description": "<p><a href=\"https://exoticaz.to/torrents?in=1&amp;search=KnickerZ&amp;uploader=&amp;verifier=\"><img src=\"https://i.exoticaz.to/images/torrent/e/3/9/i7bfled2kuss.jpg\" width=\"824\" height=\"300\" alt=\"i7bfled2kuss.jpg\"></a></p>\n<p>[SSIS-181] Yua Mikami - Getting A Lick Down From Step-dad. 3 Full Days Indecency While The Husband Is Away (4K)</p>\n<p>Scene 1: Yua while asleep gets tits sucked, missionary<br>Scene 2: Yua plays with toothbrush<br>Scene 3: Blowjob<br>Various Sex Acts Included : Oral, Doggy, One on One sex, MF sex, Facials, Cumshots, Missionary Sex, Handjob, Blowjobs, Blowbangs, Handjobs, Cowgirl &amp; Reverse-Cowgirl, Deep-throat, Solo tease, Solo Masturbation, Toy/Dildo play, Kissing, etc</p>\n\n<p>                                            <img src=\"https://i.exoticaz.to/images/torrent/9/0/6/jpoyeqdohhft.gif\" alt=\"jpoyeqdohhft.gif\"></p>",
"created_at": "2022-01-03 12:49:49"
"created_at": "2022-01-03 12:49:49",
"created_at_iso": "2022-01-03T12:49:49+01:00"
},
{
"id": 51414,
@@ -1125,7 +1141,8 @@
"images/torrent/7/a/2/v4bbhqrhfaic.jpg"
],
"description": "<p>Yua Mikami's Devilish 200 Minutes of All Round Nipple Licking, Teasing and Kneading</p>\n<p>Actresses: Yua Mikami<br>Studio: S1 NO.1 STYLE<br>Series: Just A Little Devil Chick.<br>Release date: Dec 10, 2021<br>Runtime: 197min<br>Director: ZAMPA<br>Label: S1 NO.1 STYLE<br>Content ID: ssis00270<br>DVD ID: SSIS-270<br>Languages: Japanese</p>",
"created_at": "2021-12-10 16:59:45"
"created_at": "2021-12-10 16:59:45",
"created_at_iso": "2021-12-10T16:59:45+01:00"
},
{
"id": 50935,
@@ -1178,7 +1195,8 @@
"images/torrent/4/d/2/8ppl4ibq95se.png"
],
"description": null,
"created_at": "2021-11-27 21:51:25"
"created_at": "2021-11-27 21:51:25",
"created_at_iso": "2021-11-27T21:51:25+01:00"
},
{
"id": 50154,
@@ -1244,7 +1262,8 @@
"images/torrent/a/7/7/t90zggbrwwf5.jpg"
],
"description": null,
"created_at": "2021-11-12 10:26:20"
"created_at": "2021-11-12 10:26:20",
"created_at_iso": "2021-11-12T10:26:20+01:00"
},
{
"id": 49718,
@@ -1312,7 +1331,8 @@
"images/torrent/5/9/9/7uo17medy6ib.jpg"
],
"description": null,
"created_at": "2021-11-02 11:39:32"
"created_at": "2021-11-02 11:39:32",
"created_at_iso": "2021-11-02T11:39:32+01:00"
},
{
"id": 49717,
@@ -1368,7 +1388,8 @@
"images/torrent/2/4/0/f99j7rtxwlni.jpg"
],
"description": null,
"created_at": "2021-11-02 11:25:47"
"created_at": "2021-11-02 11:25:47",
"created_at_iso": "2021-11-02T11:25:47+01:00"
},
{
"id": 49715,
@@ -1423,7 +1444,8 @@
"images/torrent/7/3/5/6e8mmocet7pq.jpg"
],
"description": null,
"created_at": "2021-11-02 11:16:12"
"created_at": "2021-11-02 11:16:12",
"created_at_iso": "2021-11-02T11:16:12+01:00"
},
{
"id": 49714,
@@ -1477,7 +1499,8 @@
"images/torrent/5/a/b/bchwfgrs4jm4.jpg"
],
"description": null,
"created_at": "2021-11-02 11:06:08"
"created_at": "2021-11-02 11:06:08",
"created_at_iso": "2021-11-02T11:06:08+01:00"
},
{
"id": 49712,
@@ -1532,7 +1555,8 @@
"images/torrent/d/8/0/n8wlosqiuz92.jpg"
],
"description": null,
"created_at": "2021-11-02 10:46:18"
"created_at": "2021-11-02 10:46:18",
"created_at_iso": "2021-11-02T10:46:18+01:00"
},
{
"id": 49647,
@@ -1588,7 +1612,8 @@
"images/torrent/c/5/f/nc1q6ejlvyqu.jpg"
],
"description": null,
"created_at": "2021-11-02 10:29:43"
"created_at": "2021-11-02 10:29:43",
"created_at_iso": "2021-11-02T10:29:43+01:00"
},
{
"id": 49646,
@@ -1640,7 +1665,8 @@
"images/torrent/c/5/8/c1wfncbm1eve.jpg"
],
"description": null,
"created_at": "2021-10-31 14:28:38"
"created_at": "2021-10-31 14:28:38",
"created_at_iso": "2021-10-31T14:28:38+01:00"
},
{
"id": 49645,
@@ -1696,7 +1722,8 @@
"images/torrent/8/4/e/wc4toojco9dx.jpg"
],
"description": null,
"created_at": "2021-10-31 14:17:13"
"created_at": "2021-10-31 14:17:13",
"created_at_iso": "2021-10-31T14:17:13+01:00"
},
{
"id": 49644,
@@ -1752,7 +1779,8 @@
"images/torrent/7/7/c/4qp3mqsokrnw.jpg"
],
"description": null,
"created_at": "2021-10-31 14:02:50"
"created_at": "2021-10-31 14:02:50",
"created_at_iso": "2021-10-31T14:02:50+01:00"
},
{
"id": 49643,
@@ -1804,7 +1832,8 @@
"images/torrent/0/9/f/fgwbfeqmzftr.jpg"
],
"description": null,
"created_at": "2021-10-31 13:50:27"
"created_at": "2021-10-31 13:50:27",
"created_at_iso": "2021-10-31T13:50:27+01:00"
},
{
"id": 49079,
@@ -1858,7 +1887,8 @@
"images/torrent/7/d/d/xe1gcbp5acwx.png"
],
"description": null,
"created_at": "2021-10-16 16:50:12"
"created_at": "2021-10-16 16:50:12",
"created_at_iso": "2021-10-16T16:50:12+02:00"
},
{
"id": 49056,
@@ -1912,7 +1942,8 @@
"images/torrent/e/1/1/yv3ablrdkgfv.jpg"
],
"description": null,
"created_at": "2021-10-16 07:10:29"
"created_at": "2021-10-16 07:10:29",
"created_at_iso": "2021-10-16T07:10:29+02:00"
},
{
"id": 49050,
@@ -1963,7 +1994,8 @@
"images/torrent/3/3/1/uorz1hpm1hld.jpg"
],
"description": null,
"created_at": "2021-10-16 02:11:54"
"created_at": "2021-10-16 02:11:54",
"created_at_iso": "2021-10-16T02:11:54+02:00"
},
{
"id": 49049,
@@ -2018,7 +2050,8 @@
"images/torrent/9/6/e/bahbhr2gaqeq.jpg"
],
"description": null,
"created_at": "2021-10-16 00:06:39"
"created_at": "2021-10-16 00:06:39",
"created_at_iso": "2021-10-16T00:06:39+02:00"
},
{
"id": 49048,
@@ -2073,7 +2106,8 @@
"images/torrent/7/8/b/eq1jkrz8icoi.jpg"
],
"description": null,
"created_at": "2021-10-16 00:01:42"
"created_at": "2021-10-16 00:01:42",
"created_at_iso": "2021-10-16T00:01:42+02:00"
},
{
"id": 49038,
@@ -2129,7 +2163,8 @@
"images/torrent/0/1/7/c2hcjiknuv26.jpg"
],
"description": null,
"created_at": "2021-10-15 14:15:16"
"created_at": "2021-10-15 14:15:16",
"created_at_iso": "2021-10-15T14:15:16+02:00"
},
{
"id": 49037,
@@ -2185,7 +2220,8 @@
"images/torrent/f/c/c/sir7gae1bnjv.jpg"
],
"description": null,
"created_at": "2021-10-15 13:58:51"
"created_at": "2021-10-15 13:58:51",
"created_at_iso": "2021-10-15T13:58:51+02:00"
},
{
"id": 48883,
@@ -2234,7 +2270,8 @@
"images/torrent/1/5/7/myv4v8tpa6d6.jpg"
],
"description": "<p>ISO: https://exoticaz.to/torrent/48124</p>",
"created_at": "2021-10-12 07:11:18"
"created_at": "2021-10-12 07:11:18",
"created_at_iso": "2021-10-12T07:11:18+02:00"
},
{
"id": 48364,
@@ -2276,7 +2313,8 @@
"images/torrent/f/b/f/lw6fcsf6fz9z.jpg"
],
"description": "<p>Somebody requested this separately from pack that is already on here.</p>",
"created_at": "2021-09-29 03:12:14"
"created_at": "2021-09-29 03:12:14",
"created_at_iso": "2021-09-29T03:12:14+02:00"
},
{
"id": 48189,
@@ -2331,7 +2369,8 @@
"images/torrent/6/3/2/5yvhovuhybyd.jpg"
],
"description": null,
"created_at": "2021-09-24 14:32:49"
"created_at": "2021-09-24 14:32:49",
"created_at_iso": "2021-09-24T14:32:49+02:00"
},
{
"id": 48186,
@@ -2388,7 +2427,8 @@
"images/torrent/6/0/8/e6jahgfjtvkf.jpg"
],
"description": null,
"created_at": "2021-09-24 14:17:46"
"created_at": "2021-09-24 14:17:46",
"created_at_iso": "2021-09-24T14:17:46+02:00"
},
{
"id": 48184,
@@ -2444,7 +2484,8 @@
"images/torrent/9/a/b/msjcjdcarxj2.jpg"
],
"description": null,
"created_at": "2021-09-24 13:59:44"
"created_at": "2021-09-24 13:59:44",
"created_at_iso": "2021-09-24T13:59:44+02:00"
},
{
"id": 48181,
@@ -2500,7 +2541,8 @@
"images/torrent/f/c/c/hkmy2iaaessw.jpg"
],
"description": null,
"created_at": "2021-09-24 13:46:50"
"created_at": "2021-09-24 13:46:50",
"created_at_iso": "2021-09-24T13:46:50+02:00"
},
{
"id": 48179,
@@ -2555,7 +2597,8 @@
"images/torrent/9/8/3/fw84szdvrmk4.jpg"
],
"description": null,
"created_at": "2021-09-24 13:34:17"
"created_at": "2021-09-24 13:34:17",
"created_at_iso": "2021-09-24T13:34:17+02:00"
},
{
"id": 48178,
@@ -2611,7 +2654,8 @@
"images/torrent/5/c/5/y7fjqvupby01.jpg"
],
"description": null,
"created_at": "2021-09-24 13:22:30"
"created_at": "2021-09-24 13:22:30",
"created_at_iso": "2021-09-24T13:22:30+02:00"
},
{
"id": 48125,
@@ -2666,7 +2710,8 @@
"images/torrent/f/2/1/wj8axuerttva.jpg"
],
"description": null,
"created_at": "2021-09-23 06:34:55"
"created_at": "2021-09-23 06:34:55",
"created_at_iso": "2021-09-23T06:34:55+02:00"
},
{
"id": 48124,
@@ -2721,7 +2766,8 @@
"images/torrent/b/6/8/qa5nfh9blige.jpg"
],
"description": null,
"created_at": "2021-09-23 05:38:43"
"created_at": "2021-09-23 05:38:43",
"created_at_iso": "2021-09-23T05:38:43+02:00"
},
{
"id": 46870,
@@ -2770,7 +2816,8 @@
"images/torrent/d/4/1/rpn5ywrgch3m.jpg"
],
"description": null,
"created_at": "2021-09-01 13:28:55"
"created_at": "2021-09-01 13:28:55",
"created_at_iso": "2021-09-01T13:28:55+02:00"
},
{
"id": 46193,
@@ -2826,7 +2873,8 @@
"images/torrent/7/6/8/o87ujrsbmehp.jpg"
],
"description": null,
"created_at": "2021-08-19 09:44:36"
"created_at": "2021-08-19 09:44:36",
"created_at_iso": "2021-08-19T09:44:36+02:00"
},
{
"id": 45171,
@@ -2874,7 +2922,8 @@
"images/torrent/6/d/b/wm8ikfbzpecs.jpg"
],
"description": "<p>I don't know why the source was 25 fps</p>",
"created_at": "2021-07-30 14:34:43"
"created_at": "2021-07-30 14:34:43",
"created_at_iso": "2021-07-30T14:34:43+02:00"
},
{
"id": 43663,
@@ -2923,7 +2972,8 @@
"images/torrent/b/7/d/qswq8vdshnyb.jpg"
],
"description": "<p>Yua Mikami 4th Anniversary Memorial Best - Her 12 Latest Titles In Full, 72 Scenes, 480 Minutes Special</p>\n<p>Release Date: Mar. 06, 2021<br>Runtime: 477min. (HD: 477min.)<br>Director: ----<br>Studio: S1 NO.1 STYLE<br>Label: S1 NO.1 STYLE</p>\n<p>Channel: ----<br>Content ID: ofje00300<br>DVD ID: OFJE-300<br>Series: S1 GIRLS COLLECTION<br>Languages: Japanese</p>\n<p>Actress(es): Yua Mikami</p>",
"created_at": "2021-07-04 16:17:44"
"created_at": "2021-07-04 16:17:44",
"created_at_iso": "2021-07-04T16:17:44+02:00"
},
{
"id": 39515,
@@ -3001,7 +3051,8 @@
"images/torrent/a/0/c/5dgyfrjx6x7p.png"
],
"description": "<pre>+++ [HD] SSIS-013 アナタの五感を刺激する三上悠亜のシコシコサポートラグジュアリー 脳をエロスで満たす6つの癒され勃起シチュエーション</pre>\n<p><strong>Full title:</strong> <em>Yua Mikami Will Stimulate Your Five Senses In A Soothing, Stroking, Masturbatory Luxury Support Role 6 Soothing Erection Situations Of Fully Satisfying Eros Company Excitement To Blow Your Mind</em></p>\n<p><strong>Release Date:</strong> Mar. 18, 2021</p>\n<p><strong>R18:</strong> https://www.r18.com/videos/vod/movies/detail/-/id=ssis00013/</p>\n<p><strong>Studio:</strong> https://www.s1s1s1.com/works/detail/ssis013/</p>",
"created_at": "2021-03-22 14:40:56"
"created_at": "2021-03-22 14:40:56",
"created_at_iso": "2021-03-22T14:40:56+01:00"
},
{
"id": 39245,
@@ -3049,7 +3100,8 @@
"images/torrent/f/5/1/nqjy8fpqskdj.jpg"
],
"description": "<p>BDISO: https://exoticaz.to/torrent/34023</p>",
"created_at": "2021-03-17 01:27:10"
"created_at": "2021-03-17 01:27:10",
"created_at_iso": "2021-03-17T01:27:10+01:00"
},
{
"id": 38628,
@@ -3098,7 +3150,8 @@
"images/torrent/6/f/e/juc07vprbndp.jpg"
],
"description": null,
"created_at": "2021-02-28 08:42:42"
"created_at": "2021-02-28 08:42:42",
"created_at_iso": "2021-02-28T08:42:42+01:00"
},
{
"id": 38281,
@@ -3159,7 +3212,8 @@
"images/torrent/8/6/8/vazvb4ycnmb8.jpg"
],
"description": "<p><strong>During Her Business Trip, To Her Surprise, She Was Booked Into The Same Hotel Room With Her Asshole Boss (Whom She Hates With A Passion) ... So He Banged Her With Excessive Lust And Relentless Piston-Pounding Thrusts And Kept This Big Tits Office Lady Cumming All Night Long Yua Mikami</strong></p>\n<p><strong>Website:</strong> https://www.s1s1s1.com/works/detail/ssni989/</p>\n<p><strong>R18:</strong> https://www.r18.com/videos/vod/movies/detail/-/id=ssni00989/</p>\n<p>+++ [HD] SSNI-989 出張先の旅館で大嫌いなセクハラ上司とまさかの相部屋に…絶倫過ぎる粘着ピストンで一晩中イカされ続けた巨乳OL 三上悠亜</p>",
"created_at": "2021-02-17 22:42:58"
"created_at": "2021-02-17 22:42:58",
"created_at_iso": "2021-02-17T22:42:58+01:00"
},
{
"id": 37072,
@@ -3215,7 +3269,8 @@
"images/torrent/6/6/9/1ms8yiiif82h.jpg"
],
"description": "<p><strong>Website:</strong> https://www.s1s1s1.com/works/detail/ssni963/</p>\n<p><strong>R18:</strong> https://www.r18.com/videos/vod/movies/detail/-/id=ssni00963/</p>\n<p>+++ [HD] SSNI-963 日本一のSEXコスプレイヤー 三上悠亜</p>",
"created_at": "2021-01-16 02:52:11"
"created_at": "2021-01-16 02:52:11",
"created_at_iso": "2021-01-16T02:52:11+01:00"
},
{
"id": 36791,
@@ -3269,7 +3324,8 @@
"images/torrent/b/b/4/pampaacdzpoa.jpg"
],
"description": "<p>credits to perfectcanary</p>",
"created_at": "2021-01-09 03:44:31"
"created_at": "2021-01-09 03:44:31",
"created_at_iso": "2021-01-09T03:44:31+01:00"
},
{
"id": 36790,
@@ -3324,7 +3380,8 @@
"images/torrent/a/a/c/hyaed34gxuic.jpg"
],
"description": "<p>credits to perfectcanary</p>",
"created_at": "2021-01-09 03:44:02"
"created_at": "2021-01-09 03:44:02",
"created_at_iso": "2021-01-09T03:44:02+01:00"
},
{
"id": 36789,
@@ -3379,7 +3436,8 @@
"images/torrent/7/8/6/3uotc2hw7s6l.jpg"
],
"description": "<p>credits to perfectcanary</p>",
"created_at": "2021-01-09 03:42:52"
"created_at": "2021-01-09 03:42:52",
"created_at_iso": "2021-01-09T03:42:52+01:00"
},
{
"id": 36465,
@@ -3436,7 +3494,8 @@
"images/torrent/1/1/a/x6yztt33psfz.jpg"
],
"description": "<p>配信開始日: 2020/02/07<br>商品発売日: 2020/02/07<br>収録時間: 87分 HQ版87分<br>出演者: 三上悠亜<br>監督: ZAMPA<br>シリーズ: S1 VR<br>メーカー: エスワン ナンバーワンスタイル<br>レーベル: S1 VR<br>コンテンツタイプ: 3D<br>ジャンル: ハイクオリティVR 独占配信 単体作品 VR専用 騎乗位 巨乳 アイドル・芸能人 主観<br>品番: sivr00067</p>\n<p>待望のHQ超なめらか高画質VRで三上悠亜とボクのエッチで可愛すぎる神同棲生活「僕の彼女はトップAVアイドルの、あの三上悠亜.・」超多忙なトップAVアイドルでありながら、実はこっそりボクと付き合っている夢のような展開愛されて、心配されて、嫉妬されて、普段は見れない等身大のアイドルの素顔を完全独占最高の距離感で四六時中SEXに明け暮れる究極同棲VR</p>",
"created_at": "2020-12-30 13:29:53"
"created_at": "2020-12-30 13:29:53",
"created_at_iso": "2020-12-30T13:29:53+01:00"
},
{
"id": 36096,
@@ -3491,7 +3550,8 @@
"images/torrent/1/9/e/dtxkxrwdpf3m.jpg"
],
"description": "<p><strong>Website:</strong> https://www.s1s1s1.com/works/detail/ssni939/</p>\n<p><strong>R18:</strong> https://www.r18.com/videos/vod/movies/detail/-/id=ssni00939/</p>\n<p><strong>1080p</strong> : https://exoticaz.to/torrent/35862</p>",
"created_at": "2020-12-22 00:57:11"
"created_at": "2020-12-22 00:57:11",
"created_at_iso": "2020-12-22T00:57:11+01:00"
},
{
"id": 35862,
@@ -3546,7 +3606,8 @@
"images/torrent/a/9/4/ksgywpxmjg9h.jpg"
],
"description": "<p><strong>Website:</strong> https://www.s1s1s1.com/works/detail/ssni939/</p>\n<p><strong>R18:</strong> https://www.r18.com/videos/vod/movies/detail/-/id=ssni00939/</p>\n<p>+++ [HD] SSNI-939 執拗な焦らしと寸止めで極限まで感度を高めた恍惚キメセク大絶頂FUCK 三上悠亜</p>",
"created_at": "2020-12-17 03:16:29"
"created_at": "2020-12-17 03:16:29",
"created_at_iso": "2020-12-17T03:16:29+01:00"
},
{
"id": 34686,
@@ -3608,7 +3669,8 @@
"images/torrent/3/0/4/dtb70p4cfkhi.jpg"
],
"description": "<p><strong>Website:</strong> https://www.s1s1s1.com/works/detail/ssni916/</p>\n<p><strong>R18:</strong> https://www.r18.com/videos/vod/movies/detail/-/id=ssni00916/</p>\n<p>+++ [HD] SSNI-916 スク水巨乳の水泳部顧問は元グラビアアイドル…濡れ透ける先生の巨乳に我慢できなくて、じっとり汗だくひたすら密着交尾 三上悠亜</p>\n<p>Play with the water in the classroom or in the pool.... Wet nipples, spilling god milk, high leg that eats into the crotch. Meat feeling Sk water dynamite to nail the students! Healthy BODY and Rodro Special SEX Bathed In The Shining Midsummer Sun! Unstoppable sexual desire of the unending men flocking to the squiring big that attach perfectly with dripping sweat! The Swimsuit Big That Shake Violently Is While Wearing It! All boys love their teachers.</p>\n<p>Release Date:<br>Nov. 19, 2020</p>\n<p>Runtime:<br>145min.  (HD: 145min.)</p>\n<p>Director:<br>ZAMPA</p>\n<p>Studio:<br>S1 NO.1 STYLE</p>\n<p>Label:<br>S1 NO.1 STYLE</p>\n<p>Channel:<br>----</p>\n<p>Content ID:<br>ssni00916</p>\n<p>DVD ID:<br>SSNI-916</p>\n<p>Series:<br>----</p>\n<p>Languages:<br>Japanese</p>",
"created_at": "2020-11-18 23:55:07"
"created_at": "2020-11-18 23:55:07",
"created_at_iso": "2020-11-18T23:55:07+01:00"
},
{
"id": 34051,
@@ -3660,7 +3722,8 @@
"images/torrent/9/e/9/0ocpe6n3lsc6.jpg"
],
"description": "<p>Title: Ever Since That Day When My Father-In-Law Raped Me… Yua Mikami</p>\n<p>Date: October 22, 2019  </p>\n<p>Time: 02:29:00<br><br>Pornstars: Yua Mikami</p>\n<p>Studio: S1 NO.1 Style</p>",
"created_at": "2020-11-03 06:16:30"
"created_at": "2020-11-03 06:16:30",
"created_at_iso": "2020-11-03T06:16:30+01:00"
},
{
"id": 34049,
@@ -3713,7 +3776,8 @@
"images/torrent/9/0/4/5yho2mvumies.jpg"
],
"description": "<p>Title: TEK-072 Climax x 4 Hardcore Scenes Yua Mikami</p>\n<p>Date: August 1, 2020</p>\n<p>Time: 02:55:00</p>\n<p>Pornstars: Yua Mikami</p>\n<p>Studio: MUTEKI</p>\n<p>https://www.javlibrary.com/en/?v=javlild2tm</p>",
"created_at": "2020-11-03 06:06:51"
"created_at": "2020-11-03 06:06:51",
"created_at_iso": "2020-11-03T06:06:51+01:00"
},
{
"id": 34024,
@@ -3764,7 +3828,8 @@
"images/torrent/d/3/2/qeylkbizibzy.jpg"
],
"description": "<p>Titile: Yua Mikami Is Completely Tied Down And Unable To Move Unlimited Piston Pounding Fucks That</p>\n<p>Date: October 22, 2019  </p>\n<p>Time: 02:34:00</p>\n<p>Pornstars: Yua Mikami</p>\n<p>Studio: S1 NO.1 Style</p>",
"created_at": "2020-11-02 05:13:10"
"created_at": "2020-11-02 05:13:10",
"created_at_iso": "2020-11-02T05:13:10+01:00"
},
{
"id": 34023,
@@ -3813,7 +3878,8 @@
"images/torrent/c/0/2/pvoql1zscpdl.jpg"
],
"description": "<p>Title: SSNI-388 Yua Mikami In A 16-Consecutive Cum Shot Slut Assault Shes Tied Up Men For Some</p>\n<p>Date: October 22, 2019</p>\n<p>Pornstars: Yua Mikami</p>\n<p>Studio: S1 NO.1 Style</p>\n<p>Time: 02:04:00</p>",
"created_at": "2020-11-02 04:57:51"
"created_at": "2020-11-02 04:57:51",
"created_at_iso": "2020-11-02T04:57:51+01:00"
},
{
"id": 33466,
@@ -3870,7 +3936,8 @@
"images/torrent/1/6/0/bwivpujoltwr.jpg"
],
"description": "<p><strong>Website:</strong> https://www.s1s1s1.com/works/detail/ssni888/</p>\n<p><strong>R18:</strong> https://www.r18.com/videos/vod/movies/detail/-/id=ssni00888/</p>\n<p>+++ [HD] SSNI-888 絶頂の向こう側でイッてイッてイキまくる確変オーガズム状態のまま48時間耐久で一生分ハメまくった三上悠亜のヤバい性交</p>",
"created_at": "2020-10-17 01:29:36"
"created_at": "2020-10-17 01:29:36",
"created_at_iso": "2020-10-17T01:29:36+02:00"
},
{
"id": 32469,
@@ -3925,7 +3992,8 @@
"images/torrent/7/f/4/qn6q2w8bgjzg.jpg"
],
"description": "<p><strong>Website:</strong> https://www.s1s1s1.com/works/detail/ssni865/</p>\n<p><strong>R18:</strong> https://www.r18.com/videos/vod/movies/detail/-/id=ssni00865/</p>\n<p>+++ [HD] SSNI-865 巨乳OLと絶倫童貞上司の毎週エスカレートする週末のセックス残業 三上悠亜</p>",
"created_at": "2020-09-17 03:27:12"
"created_at": "2020-09-17 03:27:12",
"created_at_iso": "2020-09-17T03:27:12+02:00"
},
{
"id": 31490,
@@ -4118,7 +4186,8 @@
"images/torrent/1/0/d/9wmpejovzbg7.jpg"
],
"description": "<p>A quarter terabyte of Yua Mikami videos. Pretty close to a complete solo discography as of this date. Mostly 1080p, a few 720p. No super loud Chinese language ads at the beginnings of any videos, mostly unobtrusive watermarks. A few of the Muteki vids are decensored with the sorta annoying JAVPlayer watermark.</p>",
"created_at": "2020-08-20 00:49:29"
"created_at": "2020-08-20 00:49:29",
"created_at_iso": "2020-08-20T00:49:29+02:00"
},
{
"id": 31465,
@@ -4175,7 +4244,8 @@
"images/torrent/7/4/f/npjdewgqw8bj.jpg"
],
"description": "<p><strong>Website:</strong> https://www.s1s1s1.com/works/detail/ssni802/</p>\n<p><strong>R18:</strong> https://www.r18.com/videos/vod/movies/detail/-/id=ssni00802/</p>\n<p>+++ [HD] SSNI-802 『教師失格』帰宅困難になったあの日、嵐が過ぎるまでひたすら男子生徒とハメまくりました…。 三上悠亜</p>\n<p>Release Date: June 14, 2020<br>Runtime: 117min.  (HD: 117min.)<br>Director: Amazing Meat<br>Studio: S1 NO.1 STYLE<br>Label: S1 NO.1 STYLE</p>\n<p>I'm a slut priest... On that day when a large typhoon hit directly, the two broke their line... On the night when it was difficult to return home, the unstoppable desire of a female teacher who shakes her big tits until the morning and gets turbulent like a storm. \"Much more... messed up... Ah... No... Iku...!!!\" \"Before I am a teacher, I am a woman...\"</p>",
"created_at": "2020-08-19 12:04:41"
"created_at": "2020-08-19 12:04:41",
"created_at_iso": "2020-08-19T12:04:41+02:00"
},
{
"id": 30383,
@@ -4220,7 +4290,8 @@
"images/torrent/9/9/9/i3ciw7xmwson.jpg"
],
"description": "<p>[SSNI-826] Yua Mikami 三上悠亜のPLATINUM SOAP 三上悠亞</p>\n<p>The finest customs to serve with the best body and best service! No matter how many times I ejaculate, the full erection doesnt stop… I just ejaculated, but Im jealous of any number of shots! Unlimited firing within the time. “Please give out as many shots as you want today.” Yuas awesome technique will fulfill all your desires. For a while, Onakura, mens esthetic, pin salo, SM club, finest soap. Platinum BODY and the finest service a total of 15 shots will ejaculate a special sex custom!</p>",
"created_at": "2020-07-27 10:51:58"
"created_at": "2020-07-27 10:51:58",
"created_at_iso": "2020-07-27T10:51:58+02:00"
},
{
"id": 29815,
@@ -4269,7 +4340,8 @@
"images/torrent/b/9/3/wvu3uhkwmxbz.jpg"
],
"description": "<p>【VR】エスワン15周年スペシャル共演 日本一のAV女優2人と超豪華ハーレム逆3P体験</p>\n<p>【VR】 15th Anniversary Of Esuan Special Co-starring 2 Best AV Actresses In Japan And A Super Luxury Harem Reverse 3P Experience</p>",
"created_at": "2020-07-14 07:28:09"
"created_at": "2020-07-14 07:28:09",
"created_at_iso": "2020-07-14T07:28:09+02:00"
},
{
"id": 29356,
@@ -4315,7 +4387,8 @@
"images/torrent/5/6/4/kdkmgw9mxjiy.jpg"
],
"description": "<p>Title: TEK-067 Princess Peach Mikami YuA</p>\n<p>ID: TEK-067<br>Release Date: 2015-06-01<br>Length: 180 min(s)<br>Director: ----<br>Maker: Muteki  <br>Label: Muteki </p>\n<p>Ps: It was claimed to be the first real porn that Yua Mikami participated.</p>",
"created_at": "2020-07-08 01:32:21"
"created_at": "2020-07-08 01:32:21",
"created_at_iso": "2020-07-08T01:32:21+02:00"
},
{
"id": 29261,
@@ -4366,7 +4439,8 @@
"images/torrent/9/a/c/hocvufnx1xxg.jpg"
],
"description": "<p><span style=\"font-size:20px;\"><strong>Full Title</strong></span>:  <span style=\"font-size:20px;\"><strong>Massive Cocks x Follow-Up Fucks x Large Orgies These 24 Massive Cocks Will Relentlessly Pump These Twitching And Cumming Pussies In A Furious Follow-Up Piston Pumping Ultra Large Orgies Special Yua Mikami<br></strong><br><span style=\"font-size:18px;\">Release Date: Oct. 18, 2018</span><br><span style=\"font-size:18px;\">Runtime: 117min.  (HD: 117min.)</span><br><span style=\"font-size:18px;\">Director: ZAMPA</span><br><span style=\"font-size:18px;\">Studio: S1 NO.1 STYLE</span><br><span style=\"font-size:18px;\">Label: S1 NO.1 STYLE<br>Channel: S1 NO.1 STYLE, PRIME<br>Content ID: ssni00322<br>DVD ID: SSNI-322<br><br><a href=\"https://awscc3001.r18.com/litevideo/freepv/s/ssn/ssni00322/ssni00322_dmb_w.mp4\">Trailer</a></span></span></p>",
"created_at": "2020-07-06 02:25:40"
"created_at": "2020-07-06 02:25:40",
"created_at_iso": "2020-07-06T02:25:40+02:00"
},
{
"id": 27208,
@@ -4419,7 +4493,8 @@
"images/torrent/8/6/3/br1smc0lvdfy.png"
],
"description": null,
"created_at": "2020-05-31 03:07:27"
"created_at": "2020-05-31 03:07:27",
"created_at_iso": "2020-05-31T03:07:27+02:00"
},
{
"id": 26018,
@@ -4464,7 +4539,8 @@
"images/torrent/c/e/d/fjzmigqdm3qt.jpg"
],
"description": "<p><strong>Yua Mikami in awesome POV scene working as a 5star soapland popstar girI</strong></p>\n<p><strong>Infiltrate the soapland where the strongest national idol you have ever dreamed of works! ! Immediate scale blowjob &amp; immediate etch of greeting unwashed cock! Full body lip to anal &amp; toes! Vacuum periscope Blow while bathing in the bath! Adhesive slimy mat that will serve hard! Full charter feeling full course 180 minutes unlimited firing! \"Please go and enjoy today!\"</strong></p>\n<p><a href=\"https://www.r18.com/videos/vod/movies/detail/-/id=tek00076/?i3_ref=search&amp;i3_ord=1\">https://www.r18.com/videos/vod/movies/detail/-/id=tek00076/?i3_ref=search&amp;i3_ord=1</a></p>",
"created_at": "2020-03-16 20:11:31"
"created_at": "2020-03-16 20:11:31",
"created_at_iso": "2020-03-16T20:11:31+01:00"
},
{
"id": 26005,
@@ -4510,7 +4586,8 @@
"images/torrent/6/5/4/lhkdfbqlsqlu.jpg"
],
"description": "<p>One day before summer vacation, I had a crazy sex in the classroom at sunset when no one was there. Push down to the bed in the nurse's room, fill the face in the skirt, and rub the young and tender big tits and peach ass. Titty fuck and fellatio into school swimsuit. The best girl in school, take off the uniform of a national idol school girl who is too angelic and roll up after school! Youth school sex! \"It's a secret to everyone.\"</p>\n<p><a href=\"https://www.r18.com/videos/vod/movies/detail/-/id=tek00079/\">https://www.r18.com/videos/vod/movies/detail/-/id=tek00079/</a></p>",
"created_at": "2020-03-16 05:22:31"
"created_at": "2020-03-16 05:22:31",
"created_at_iso": "2020-03-16T05:22:31+01:00"
},
{
"id": 26004,
@@ -4553,7 +4630,8 @@
"images/torrent/c/5/d/n5ciceiboq1l.jpg"
],
"description": "<p>\"More ... more kiss ...\" The obscene and hot sexy Kiss that the national idol Yua Mikami shows for the first time and the passion SEX that burns up! Temptation hot Licking Handjob &amp; Footjob With A Lot Of drips. Saliva and pussy juice are intertwined and the pussy gets wet so shamefully! The climax FUCK of an odious kiss that licks the whole body of the idol! The most erotic idol of the strongest idol who pulls a string in love popularity sweaty kissing sex! !</p>\n<p><a href=\"https://www.r18.com/videos/vod/movies/detail/-/id=tek00080/\">https://www.r18.com/videos/vod/movies/detail/-/id=tek00080/</a></p>",
"created_at": "2020-03-16 05:15:51"
"created_at": "2020-03-16 05:15:51",
"created_at_iso": "2020-03-16T05:15:51+01:00"
},
{
"id": 25958,
@@ -4598,7 +4676,8 @@
"images/torrent/e/5/b/dtmfbfmqsekh.jpg"
],
"description": "<p>Yua Mikami is my one of my favourite JAV Actress, she is so pretty and have killer body. In this video she acts as your girlfriend.<br>she waits you at home, wash your dick and handjob it. she likes to kiss. in the bedroom she HJ you and you fingering her then she rides you cow girl style, missionary and doggy style. she likes travelling with you and give you nice service in the bathroom during vacation and fucks around in the bathtub then continue fucking in the bedroom hotels.</p>",
"created_at": "2020-03-10 04:08:49"
"created_at": "2020-03-10 04:08:49",
"created_at_iso": "2020-03-10T04:08:49+01:00"
},
{
"id": 25204,
@@ -4646,7 +4725,8 @@
"images/torrent/f/c/a/5rsj5fnyw7sy.jpg"
],
"description": "<p>Release Date: Oct. 12, 2019<br>Runtime: 149min.  (HD: 149min.)<br>Director: Mon C<br>Studio: S1 NO.1 STYLE<br>Label: S1 NO.1 STYLE<br>Content ID: ssni00589<br>DVD ID: SSNI-589<br>Series: Full-Power Cumming Cowgirl<br>Languages: Japanese</p>\n<p>三上悠亜の全力イクイク騎乗位マニアックス 三上悠亜</p>\n<p>「ほら、おま●こに挿ってるの丸見えだよ…」国民的アイドルの大胆騎乗位マニアックス前後左右360°尻肉揺れまくり徹底アングルクビレ腰と肉弾ヒップを一心不乱に振りまくる男根を咥え込む騎乗位の乱舞イッてもイッても止めない高速グラインドイキまくるクビレ、尻肉大迫力神アングル絶頂汁を撒き散らしそれでも振り続けるアグレッシブFUCK ※こちらはBlu-ray Disc専用ソフトです。対応プレイヤー以外では再生できませんのでご注意ください。 ★アダルトブック「三上悠亜写真集」の商品ご購入はこちらから★ 「コンビニ受取」対象商品です。詳しくはこちらをご覧ください。</p>",
"created_at": "2019-12-13 00:30:33"
"created_at": "2019-12-13 00:30:33",
"created_at_iso": "2019-12-13T00:30:33+01:00"
},
{
"id": 24777,
@@ -4729,7 +4809,8 @@
"images/torrent/4/0/1/qiq9l0g9b4lb.jpg"
],
"description": null,
"created_at": "2019-10-12 07:37:42"
"created_at": "2019-10-12 07:37:42",
"created_at_iso": "2019-10-12T07:37:42+02:00"
},
{
"id": 24714,
@@ -4793,7 +4874,8 @@
"images/torrent/0/0/c/pz6a1om1zcj6.jpg"
],
"description": null,
"created_at": "2019-10-03 07:22:22"
"created_at": "2019-10-03 07:22:22",
"created_at_iso": "2019-10-03T07:22:22+02:00"
},
{
"id": 24432,
@@ -4832,7 +4914,8 @@
"images/torrent/c/3/e/ivi2v3xvuxvf.png"
],
"description": "<p>Yua mikami (mosaic removed) not exactly more like digitally altered person seems to have done a good job albeit the quality is not the greatest.</p>",
"created_at": "2019-08-06 05:01:10"
"created_at": "2019-08-06 05:01:10",
"created_at_iso": "2019-08-06T05:01:10+02:00"
},
{
"id": 22633,
@@ -4880,7 +4963,8 @@
"images/torrent/d/1/d/siepkvzdjdjm.png"
],
"description": null,
"created_at": "2019-02-16 01:52:32"
"created_at": "2019-02-16 01:52:32",
"created_at_iso": "2019-02-16T01:52:32+01:00"
},
{
"id": 22606,
@@ -4926,7 +5010,8 @@
"images/torrent/f/9/9/scjrral5midb.png"
],
"description": null,
"created_at": "2019-02-14 09:58:29"
"created_at": "2019-02-14 09:58:29",
"created_at_iso": "2019-02-14T09:58:29+01:00"
},
{
"id": 21647,
@@ -4975,7 +5060,8 @@
"images/torrent/1/e/9/zb4gphrposw0.gif"
],
"description": "<p>no sexual activity in the show.</p>\n<p>for details : http://www.r18.com/videos/vod/movies/detail/-/id=oae00165/?i3_ref=search&amp;i3_ord=1</p>",
"created_at": "2018-12-16 20:31:03"
"created_at": "2018-12-16 20:31:03",
"created_at_iso": "2018-12-16T20:31:03+01:00"
},
{
"id": 21564,
@@ -5021,7 +5107,8 @@
"images/torrent/b/5/f/r0ml2pj3xrvq.jpg"
],
"description": "<p>MUTEKI 10th Anniversary Special Project.</p>",
"created_at": "2018-12-06 02:16:35"
"created_at": "2018-12-06 02:16:35",
"created_at_iso": "2018-12-06T02:16:35+01:00"
},
{
"id": 21561,
@@ -5075,7 +5162,8 @@
"images/torrent/7/c/3/kvjyuskn3mkf.jpg"
],
"description": null,
"created_at": "2018-12-05 19:43:15"
"created_at": "2018-12-05 19:43:15",
"created_at_iso": "2018-12-05T19:43:15+01:00"
},
{
"id": 20515,
@@ -5200,7 +5288,8 @@
"images/torrent/a/1/9/5ngcygiazvrv.jpg"
],
"description": null,
"created_at": "2018-09-07 07:56:21"
"created_at": "2018-09-07 07:56:21",
"created_at_iso": "2018-09-07T07:56:21+02:00"
},
{
"id": 15261,
@@ -5241,7 +5330,8 @@
"images/torrent/e/f/6/ubgilv5db5mo.jpg"
],
"description": null,
"created_at": "2018-06-02 17:44:49"
"created_at": "2018-06-02 17:44:49",
"created_at_iso": "2018-06-02T17:44:49+02:00"
},
{
"id": 4333,
@@ -5282,7 +5372,8 @@
"images/torrent/c/9/c/3qxdyhvuefwu.jpg"
],
"description": "<pre><br>General<br>Complete name : Tek081.mp4<br>Format : MPEG-4<br>Format profile : Base Media / Version 2<br>Codec ID : mp42 (isom/iso2/mp41)<br>File size : 1.49 GiB<br>Duration : 2 h 51 min<br>Overall bit rate mode : Variable<br>Overall bit rate : 1 243 kb/s<br>Encoded date : UTC 2017-02-12 20:24:00<br>Tagged date : UTC 2017-02-12 20:24:00<br>Writing application : HandBrake 1.0.2 2017012200<br><br>Video<br>ID : 1<br>Format : HEVC<br>Format/Info : High Efficiency Video Coding<br>Format profile : Main@L3.1@Main<br>Codec ID : hev1<br>Codec ID/Info : High Efficiency Video Coding<br>Duration : 2 h 51 min<br>Bit rate : 1 139 kb/s<br>Width : 1 280 pixels<br>Height : 720 pixels<br>Display aspect ratio : 16:9<br>Frame rate mode : Variable<br>Frame rate : 28.707 FPS<br>Minimum frame rate : 11.446 FPS<br>Maximum frame rate : 195.652 FPS<br>Color space : YUV<br>Chroma subsampling : 4:2:0<br>Bit depth : 8 bits<br>Bits/(Pixel*Frame) : 0.043<br>Stream size : 1.36 GiB (92%)<br>Writing library : x265 2.1:[Windows][GCC 5.4.0][64 bit] 8bit<br>Encoding settings : wpp / ctu=64 / min-cu-size=8 / max-tu-size=32 / tu-intra-depth=1 / tu-inter-depth=1 / me=1 / subme=2 / merange=57 / no-rect / no-amp / max-merge=2 / temporal-mvp / no-early-skip / rskip / rdpenalty=0 / no-tskip / no-tskip-fast / strong-intra-smoothing / no-lossless / no-cu-lossless / no-constrained-intra / no-fast-intra / open-gop / no-temporal-layers / interlace=0 / keyint=290 / min-keyint=29 / scenecut=40 / rc-lookahead=20 / lookahead-slices=4 / bframes=4 / bframe-bias=0 / b-adapt=2 / ref=3 / limit-refs=3 / no-limit-modes / weightp / no-weightb / aq-mode=1 / qg-size=32 / aq-strength=1.00 / cbqpoffs=0 / crqpoffs=0 / rd=3 / psy-rd=2.00 / rdoq-level=0 / psy-rdoq=0.00 / log2-max-poc-lsb=8 / no-rd-refine / signhide / deblock=0:0 / sao / no-sao-non-deblock / b-pyramid / cutree / no-intra-refresh / rc=crf / crf=22.0 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / ipratio=1.40 / pbratio=1.30<br>Encoded date : UTC 2017-02-12 20:24:00<br>Tagged date : UTC 2017-02-12 20:24:00<br>Color range : Limited<br>Color primaries : BT.709<br>Transfer characteristics : BT.709<br>Matrix coefficients : BT.709<br><br>Audio<br>ID : 2<br>Format : AAC<br>Format/Info : Advanced Audio Codec<br>Format profile : LC<br>Codec ID : mp4a-40-2<br>Duration : 2 h 51 min<br>Bit rate mode : Variable<br>Bit rate : 96.0 kb/s<br>Channel(s) : 2 channels<br>Channel positions : Front: L R<br>Sampling rate : 48.0 kHz<br>Frame rate : 46.875 FPS (1024 SPF)<br>Compression mode : Lossy<br>Stream size : 118 MiB (8%)<br>Title : Stereo / Stereo<br>Language : English<br>Default : Yes<br>Alternate group : 1<br>Encoded date : UTC 2017-02-12 20:24:00<br>Tagged date : UTC 2017-02-12 20:24:00<br><br></pre>",
"created_at": "2018-03-19 06:01:40"
"created_at": "2018-03-19 06:01:40",
"created_at_iso": "2018-03-19T06:01:40+01:00"
},
{
"id": 4241,
@@ -5323,7 +5414,8 @@
"images/torrent/c/4/4/o8jsphfh7rr9.jpg"
],
"description": null,
"created_at": "2018-02-20 02:46:45"
"created_at": "2018-02-20 02:46:45",
"created_at_iso": "2018-02-20T02:46:45+01:00"
},
{
"id": 4191,
@@ -5364,7 +5456,8 @@
"images/torrent/9/6/1/c1szrkxbf6fn.jpg"
],
"description": null,
"created_at": "2018-02-05 05:39:41"
"created_at": "2018-02-05 05:39:41",
"created_at_iso": "2018-02-05T05:39:41+01:00"
},
{
"id": 4101,
@@ -5405,7 +5498,8 @@
"images/torrent/7/4/6/9r3ars6pa9cn.jpg"
],
"description": "<pre><br><br>General<br>Complete name : snis896.mp4<br>Format : MPEG-4<br>Format profile : Base Media / Version 2<br>Codec ID : mp42 (isom/iso2/mp41)<br>File size : 1.40 GiB<br>Duration : 1 h 58 min<br>Overall bit rate mode : Variable<br>Overall bit rate : 1 691 kb/s<br>Encoded date : UTC 2017-05-31 19:30:00<br>Tagged date : UTC 2017-05-31 19:30:00<br>Writing application : HandBrake 1.0.7 2017040900<br><br>Video<br>ID : 1<br>Format : HEVC<br>Format/Info : High Efficiency Video Coding<br>Format profile : Main@L3.1@Main<br>Codec ID : hev1<br>Codec ID/Info : High Efficiency Video Coding<br>Duration : 1 h 58 min<br>Bit rate : 1 588 kb/s<br>Width : 1 280 pixels<br>Height : 720 pixels<br>Display aspect ratio : 16:9<br>Frame rate mode : Constant<br>Frame rate : 30.000 FPS<br>Color space : YUV<br>Chroma subsampling : 4:2:0<br>Bit depth : 8 bits<br>Bits/(Pixel*Frame) : 0.057<br>Stream size : 1.32 GiB (94%)<br>Writing library : x265 2.1:[Windows][GCC 5.3.1][64 bit] 8bit<br>Encoding settings : wpp / ctu=64 / min-cu-size=8 / max-tu-size=32 / tu-intra-depth=1 / tu-inter-depth=1 / me=1 / subme=2 / merange=57 / no-rect / no-amp / max-merge=2 / temporal-mvp / no-early-skip / rskip / rdpenalty=0 / no-tskip / no-tskip-fast / strong-intra-smoothing / no-lossless / no-cu-lossless / no-constrained-intra / no-fast-intra / open-gop / no-temporal-layers / interlace=0 / keyint=300 / min-keyint=30 / scenecut=40 / rc-lookahead=20 / lookahead-slices=4 / bframes=4 / bframe-bias=0 / b-adapt=2 / ref=3 / limit-refs=3 / no-limit-modes / weightp / no-weightb / aq-mode=1 / qg-size=32 / aq-strength=1.00 / cbqpoffs=0 / crqpoffs=0 / rd=3 / psy-rd=2.00 / rdoq-level=0 / psy-rdoq=0.00 / log2-max-poc-lsb=8 / no-rd-refine / signhide / deblock=0:0 / sao / no-sao-non-deblock / b-pyramid / cutree / no-intra-refresh / rc=crf / crf=20.0 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / ipratio=1.40 / pbratio=1.30<br>Encoded date : UTC 2017-05-31 19:30:00<br>Tagged date : UTC 2017-05-31 19:30:00<br>Color range : Limited<br>Color primaries : BT.709<br>Transfer characteristics : BT.709<br>Matrix coefficients : BT.709<br><br>Audio<br>ID : 2<br>Format : AAC<br>Format/Info : Advanced Audio Codec<br>Format profile : LC<br>Codec ID : 40<br>Duration : 1 h 58 min<br>Bit rate mode : Variable<br>Bit rate : 96.0 kb/s<br>Channel(s) : 2 channels<br>Channel positions : Front: L R<br>Sampling rate : 48.0 kHz<br>Frame rate : 46.875 FPS (1024 spf)<br>Compression mode : Lossy<br>Stream size : 81.6 MiB (6%)<br>Title : Stereo / Stereo<br>Default : Yes<br>Alternate group : 1<br>Encoded date : UTC 2017-05-31 19:30:00<br>Tagged date : UTC 2017-05-31 19:30:00<br><br></pre>",
"created_at": "2017-12-24 02:51:02"
"created_at": "2017-12-24 02:51:02",
"created_at_iso": "2017-12-24T02:51:02+01:00"
},
{
"id": 4002,
@@ -5446,7 +5540,8 @@
"images/torrent/7/d/3/wj64npz8aizr.jpg"
],
"description": "<p>三上悠亜<br>TEK-071 快感MUTEKI2016年1月1日</p>",
"created_at": "2017-11-16 03:02:55"
"created_at": "2017-11-16 03:02:55",
"created_at_iso": "2017-11-16T03:02:55+01:00"
},
{
"id": 3951,
@@ -5487,7 +5582,8 @@
"images/torrent/c/1/7/herqbzuq6jj4.jpg"
],
"description": "<p>三上悠亜<br>TEK-067 Princess PeachMUTEKI2015年6月1日</p>",
"created_at": "2017-11-12 14:47:18"
"created_at": "2017-11-12 14:47:18",
"created_at_iso": "2017-11-12T14:47:18+01:00"
},
{
"id": 16896,
@@ -5535,7 +5631,8 @@
"images/torrent/8/a/a/ena0fdra1rif.jpg"
],
"description": "<p>[SSNI-030] Mikami Yua Fan Thanksgiving National Idol x General Users 20 People 'Guttyfan and SEX Economy' Hime Meakuri Special<br><br></p>\n<pre><br><br></pre>",
"created_at": "2017-10-15 06:46:48"
"created_at": "2017-10-15 06:46:48",
"created_at_iso": "2017-10-15T06:46:48+02:00"
},
{
"id": 15273,
@@ -5577,7 +5674,8 @@
"images/torrent/f/6/5/srlry3vu9kas.jpg"
],
"description": "<p>SSNI-009 National Idol Life First First Freak!Big Caps 23 Endless Unlimited Sex - Yua Mikami<br><br></p>",
"created_at": "2017-10-11 02:33:59"
"created_at": "2017-10-11 02:33:59",
"created_at_iso": "2017-10-11T02:33:59+02:00"
},
{
"id": 17757,
@@ -5623,7 +5721,8 @@
"images/torrent/3/1/6/21sudpyouj3f.jpg"
],
"description": "SSNI-009 Our National Idol First Gangbang! Three raw scenes. 23 big cocks endless unlimited sex ~ Yua Mikami<br><br><pre><br><br></pre>",
"created_at": "2017-09-14 01:19:43"
"created_at": "2017-09-14 01:19:43",
"created_at_iso": "2017-09-14T01:19:43+02:00"
},
{
"id": 17364,
@@ -5668,7 +5767,8 @@
"images/torrent/f/a/b/tvqctziuy8k2.jpg"
],
"description": "SNIS-964 Covered In Sweat, ?**, And Saliva: Dripping Wet Sex With A National Pop Star ~ YuA Mikami<br><br><pre><br><br></pre>",
"created_at": "2017-09-01 22:56:53"
"created_at": "2017-09-01 22:56:53",
"created_at_iso": "2017-09-01T22:56:53+02:00"
}
],
"first_page_url": "https://exoticaz.to/api/v1/jackett/torrents?search=yua%20mikami&page=1",

File diff suppressed because one or more lines are too long

View File

@@ -109,7 +109,8 @@
}
],
"music_type": null,
"created_at": "2021-03-21 00:24:49"
"created_at": "2021-03-21 00:24:49",
"created_at_iso": "2021-03-21T00:24:49-04:00"
},
{
"id": 78501,
@@ -159,7 +160,8 @@
}
],
"music_type": null,
"created_at": "2021-03-19 21:52:21"
"created_at": "2021-03-19 21:52:21",
"created_at_iso": "2021-03-19T21:52:21-04:00"
},
{
"id": 78496,
@@ -209,7 +211,8 @@
}
],
"music_type": null,
"created_at": "2021-03-19 01:57:43"
"created_at": "2021-03-19 01:57:43",
"created_at_iso": "2021-03-19T01:57:43-04:00"
},
{
"id": 78494,
@@ -259,7 +262,8 @@
}
],
"music_type": null,
"created_at": "2021-03-18 14:36:10"
"created_at": "2021-03-18 14:36:10",
"created_at_iso": "2021-03-18T14:36:10-04:00"
},
{
"id": 78491,
@@ -305,7 +309,8 @@
}
],
"music_type": null,
"created_at": "2021-03-18 09:26:08"
"created_at": "2021-03-18 09:26:08",
"created_at_iso": "2021-03-18T09:26:08-04:00"
},
{
"id": 78490,
@@ -351,7 +356,8 @@
}
],
"music_type": null,
"created_at": "2021-03-18 09:05:55"
"created_at": "2021-03-18 09:05:55",
"created_at_iso": "2021-03-18T09:05:55-04:00"
},
{
"id": 78488,
@@ -465,7 +471,8 @@
}
],
"music_type": null,
"created_at": "2021-03-18 07:29:18"
"created_at": "2021-03-18 07:29:18",
"created_at_iso": "2021-03-18T07:29:18-04:00"
},
{
"id": 78486,
@@ -511,7 +518,8 @@
}
],
"music_type": null,
"created_at": "2021-03-18 07:09:34"
"created_at": "2021-03-18 07:09:34",
"created_at_iso": "2021-03-18T07:09:34-04:00"
},
{
"id": 78485,
@@ -569,7 +577,8 @@
}
],
"music_type": null,
"created_at": "2021-03-18 06:22:28"
"created_at": "2021-03-18 06:22:28",
"created_at_iso": "2021-03-18T06:22:28-04:00"
},
{
"id": 78483,
@@ -615,7 +624,8 @@
}
],
"music_type": null,
"created_at": "2021-03-18 04:28:51"
"created_at": "2021-03-18 04:28:51",
"created_at_iso": "2021-03-18T04:28:51-04:00"
},
{
"id": 78481,
@@ -801,7 +811,8 @@
}
],
"music_type": null,
"created_at": "2021-03-18 03:25:16"
"created_at": "2021-03-18 03:25:16",
"created_at_iso": "2021-03-18T03:25:16-04:00"
},
{
"id": 78480,
@@ -855,7 +866,8 @@
}
],
"music_type": null,
"created_at": "2021-03-18 02:02:22"
"created_at": "2021-03-18 02:02:22",
"created_at_iso": "2021-03-18T02:02:22-04:00"
},
{
"id": 78476,
@@ -909,7 +921,8 @@
}
],
"music_type": null,
"created_at": "2021-03-17 20:31:08"
"created_at": "2021-03-17 20:31:08",
"created_at_iso": "2021-03-17T20:31:08-04:00"
},
{
"id": 78472,
@@ -995,7 +1008,8 @@
}
],
"music_type": null,
"created_at": "2021-03-17 12:01:05"
"created_at": "2021-03-17 12:01:05",
"created_at_iso": "2021-03-17T12:01:05-04:00"
},
{
"id": 78468,
@@ -1045,7 +1059,8 @@
}
],
"music_type": null,
"created_at": "2021-03-16 22:47:11"
"created_at": "2021-03-16 22:47:11",
"created_at_iso": "2021-03-16T22:47:11-04:00"
},
{
"id": 78467,
@@ -1099,7 +1114,8 @@
}
],
"music_type": null,
"created_at": "2021-03-16 22:20:53"
"created_at": "2021-03-16 22:20:53",
"created_at_iso": "2021-03-16T22:20:53-04:00"
},
{
"id": 78466,
@@ -1153,7 +1169,8 @@
}
],
"music_type": null,
"created_at": "2021-03-16 22:01:24"
"created_at": "2021-03-16 22:01:24",
"created_at_iso": "2021-03-16T22:01:24-04:00"
},
{
"id": 78465,
@@ -1203,7 +1220,8 @@
}
],
"music_type": null,
"created_at": "2021-03-16 21:55:29"
"created_at": "2021-03-16 21:55:29",
"created_at_iso": "2021-03-16T21:55:29-04:00"
},
{
"id": 78460,
@@ -1257,7 +1275,8 @@
}
],
"music_type": null,
"created_at": "2021-03-16 14:51:45"
"created_at": "2021-03-16 14:51:45",
"created_at_iso": "2021-03-16T14:51:45-04:00"
},
{
"id": 78459,
@@ -1311,7 +1330,8 @@
}
],
"music_type": null,
"created_at": "2021-03-16 12:44:15"
"created_at": "2021-03-16 12:44:15",
"created_at_iso": "2021-03-16T12:44:15-04:00"
},
{
"id": 78458,
@@ -1361,7 +1381,8 @@
}
],
"music_type": null,
"created_at": "2021-03-16 10:18:22"
"created_at": "2021-03-16 10:18:22",
"created_at_iso": "2021-03-16T10:18:22-04:00"
},
{
"id": 78453,
@@ -1415,7 +1436,8 @@
}
],
"music_type": null,
"created_at": "2021-03-15 20:10:22"
"created_at": "2021-03-15 20:10:22",
"created_at_iso": "2021-03-15T20:10:22-04:00"
},
{
"id": 78446,
@@ -1477,7 +1499,8 @@
}
],
"music_type": null,
"created_at": "2021-03-15 16:37:11"
"created_at": "2021-03-15 16:37:11",
"created_at_iso": "2021-03-15T16:37:11-04:00"
},
{
"id": 78445,
@@ -1523,7 +1546,8 @@
}
],
"music_type": null,
"created_at": "2021-03-15 15:18:32"
"created_at": "2021-03-15 15:18:32",
"created_at_iso": "2021-03-15T15:18:32-04:00"
},
{
"id": 78412,
@@ -1569,7 +1593,8 @@
}
],
"music_type": null,
"created_at": "2021-03-14 17:15:26"
"created_at": "2021-03-14 17:15:26",
"created_at_iso": "2021-03-14T17:15:26-04:00"
},
{
"id": 78408,
@@ -1610,7 +1635,8 @@
],
"subtitle": null,
"music_type": null,
"created_at": "2021-03-14 09:19:49"
"created_at": "2021-03-14 09:19:49",
"created_at_iso": "2021-03-14T09:19:49-04:00"
},
{
"id": 78406,
@@ -1656,7 +1682,8 @@
}
],
"music_type": null,
"created_at": "2021-03-14 05:47:02"
"created_at": "2021-03-14 05:47:02",
"created_at_iso": "2021-03-14T05:47:02-04:00"
},
{
"id": 78398,
@@ -1742,7 +1769,8 @@
}
],
"music_type": null,
"created_at": "2021-03-13 16:17:07"
"created_at": "2021-03-13 16:17:07",
"created_at_iso": "2021-03-13T16:17:07-04:00"
},
{
"id": 78396,
@@ -1828,7 +1856,8 @@
}
],
"music_type": null,
"created_at": "2021-03-13 15:44:33"
"created_at": "2021-03-13 15:44:33",
"created_at_iso": "2021-03-13T15:44:33-04:00"
},
{
"id": 78395,
@@ -1958,7 +1987,8 @@
}
],
"music_type": null,
"created_at": "2021-03-13 15:22:23"
"created_at": "2021-03-13 15:22:23",
"created_at_iso": "2021-03-13T15:22:23-04:00"
},
{
"id": 78393,
@@ -2044,7 +2074,8 @@
}
],
"music_type": null,
"created_at": "2021-03-13 14:50:50"
"created_at": "2021-03-13 14:50:50",
"created_at_iso": "2021-03-13T14:50:50-04:00"
},
{
"id": 78391,
@@ -2098,7 +2129,8 @@
}
],
"music_type": null,
"created_at": "2021-03-13 12:35:34"
"created_at": "2021-03-13 12:35:34",
"created_at_iso": "2021-03-13T12:35:34-04:00"
},
{
"id": 78390,
@@ -2144,7 +2176,8 @@
}
],
"music_type": null,
"created_at": "2021-03-13 12:11:32"
"created_at": "2021-03-13 12:11:32",
"created_at_iso": "2021-03-13T12:11:32-04:00"
},
{
"id": 78389,
@@ -2190,7 +2223,8 @@
}
],
"music_type": null,
"created_at": "2021-03-13 11:43:17"
"created_at": "2021-03-13 11:43:17",
"created_at_iso": "2021-03-13T11:43:17-04:00"
},
{
"id": 78388,
@@ -2336,7 +2370,8 @@
}
],
"music_type": null,
"created_at": "2021-03-13 11:37:52"
"created_at": "2021-03-13 11:37:52",
"created_at_iso": "2021-03-13T11:37:52-04:00"
},
{
"id": 78387,
@@ -2390,7 +2425,8 @@
}
],
"music_type": null,
"created_at": "2021-03-13 11:24:07"
"created_at": "2021-03-13 11:24:07",
"created_at_iso": "2021-03-13T11:24:07-04:00"
},
{
"id": 78386,
@@ -2436,7 +2472,8 @@
}
],
"music_type": null,
"created_at": "2021-03-13 09:18:58"
"created_at": "2021-03-13 09:18:58",
"created_at_iso": "2021-03-13T09:18:58-04:00"
},
{
"id": 78385,
@@ -2622,7 +2659,8 @@
}
],
"music_type": null,
"created_at": "2021-03-13 08:57:00"
"created_at": "2021-03-13 08:57:00",
"created_at_iso": "2021-03-13T08:57:00-04:00"
},
{
"id": 78384,
@@ -2808,7 +2846,8 @@
}
],
"music_type": null,
"created_at": "2021-03-13 07:51:16"
"created_at": "2021-03-13 07:51:16",
"created_at_iso": "2021-03-13T07:51:16-04:00"
},
{
"id": 78379,
@@ -2854,7 +2893,8 @@
}
],
"music_type": null,
"created_at": "2021-03-13 00:49:43"
"created_at": "2021-03-13 00:49:43",
"created_at_iso": "2021-03-13T00:49:43-04:00"
},
{
"id": 78378,
@@ -2972,7 +3012,8 @@
}
],
"music_type": null,
"created_at": "2021-03-13 00:41:28"
"created_at": "2021-03-13 00:41:28",
"created_at_iso": "2021-03-13T00:41:28-04:00"
},
{
"id": 78374,
@@ -3050,7 +3091,8 @@
}
],
"music_type": null,
"created_at": "2021-03-12 15:14:14"
"created_at": "2021-03-12 15:14:14",
"created_at_iso": "2021-03-12T15:14:14-04:00"
},
{
"id": 78373,
@@ -3212,7 +3254,8 @@
}
],
"music_type": null,
"created_at": "2021-03-12 14:43:58"
"created_at": "2021-03-12 14:43:58",
"created_at_iso": "2021-03-12T14:43:58-04:00"
},
{
"id": 78339,
@@ -3262,7 +3305,8 @@
}
],
"music_type": null,
"created_at": "2021-03-11 18:48:35"
"created_at": "2021-03-11 18:48:35",
"created_at_iso": "2021-03-11T18:48:35-04:00"
},
{
"id": 78332,
@@ -3303,7 +3347,8 @@
],
"subtitle": null,
"music_type": null,
"created_at": "2021-03-11 13:46:59"
"created_at": "2021-03-11 13:46:59",
"created_at_iso": "2021-03-11T13:46:59-04:00"
},
{
"id": 78329,
@@ -3353,7 +3398,8 @@
}
],
"music_type": null,
"created_at": "2021-03-11 12:31:05"
"created_at": "2021-03-11 12:31:05",
"created_at_iso": "2021-03-11T12:31:05-04:00"
},
{
"id": 78328,
@@ -3394,7 +3440,8 @@
],
"subtitle": null,
"music_type": null,
"created_at": "2021-03-11 12:28:38"
"created_at": "2021-03-11 12:28:38",
"created_at_iso": "2021-03-11T12:28:38-04:00"
},
{
"id": 78320,
@@ -3464,7 +3511,8 @@
}
],
"music_type": null,
"created_at": "2021-03-10 20:38:19"
"created_at": "2021-03-10 20:38:19",
"created_at_iso": "2021-03-10T20:38:19-04:00"
},
{
"id": 78319,
@@ -3510,7 +3558,8 @@
}
],
"music_type": null,
"created_at": "2021-03-10 19:26:47"
"created_at": "2021-03-10 19:26:47",
"created_at_iso": "2021-03-10T19:26:47-04:00"
},
{
"id": 78318,
@@ -3588,7 +3637,8 @@
}
],
"music_type": null,
"created_at": "2021-03-10 18:26:23"
"created_at": "2021-03-10 18:26:23",
"created_at_iso": "2021-03-10T18:26:23-04:00"
},
{
"id": 78317,
@@ -3674,7 +3724,8 @@
}
],
"music_type": null,
"created_at": "2021-03-10 16:26:24"
"created_at": "2021-03-10 16:26:24",
"created_at_iso": "2021-03-10T16:26:24-04:00"
},
{
"id": 78315,
@@ -3724,7 +3775,8 @@
}
],
"music_type": null,
"created_at": "2021-03-10 13:15:55"
"created_at": "2021-03-10 13:15:55",
"created_at_iso": "2021-03-10T13:15:55-04:00"
},
{
"id": 78313,
@@ -3774,7 +3826,8 @@
}
],
"music_type": null,
"created_at": "2021-03-10 11:37:21"
"created_at": "2021-03-10 11:37:21",
"created_at_iso": "2021-03-10T11:37:21-04:00"
},
{
"id": 78309,
@@ -3828,7 +3881,8 @@
}
],
"music_type": null,
"created_at": "2021-03-10 06:26:47"
"created_at": "2021-03-10 06:26:47",
"created_at_iso": "2021-03-10T06:26:47-04:00"
},
{
"id": 78308,
@@ -3890,7 +3944,8 @@
}
],
"music_type": null,
"created_at": "2021-03-10 06:19:15"
"created_at": "2021-03-10 06:19:15",
"created_at_iso": "2021-03-10T06:19:15-04:00"
},
{
"id": 78307,
@@ -3972,7 +4027,8 @@
}
],
"music_type": null,
"created_at": "2021-03-10 06:08:57"
"created_at": "2021-03-10 06:08:57",
"created_at_iso": "2021-03-10T06:08:57-04:00"
},
{
"id": 78305,
@@ -4018,7 +4074,8 @@
}
],
"music_type": null,
"created_at": "2021-03-10 04:45:48"
"created_at": "2021-03-10 04:45:48",
"created_at_iso": "2021-03-10T04:45:48-04:00"
},
{
"id": 78304,
@@ -4059,7 +4116,8 @@
],
"subtitle": null,
"music_type": null,
"created_at": "2021-03-10 04:45:25"
"created_at": "2021-03-10 04:45:25",
"created_at_iso": "2021-03-10T04:45:25-04:00"
},
{
"id": 78292,
@@ -4109,7 +4167,8 @@
}
],
"music_type": null,
"created_at": "2021-03-10 02:20:29"
"created_at": "2021-03-10 02:20:29",
"created_at_iso": "2021-03-10T02:20:29-04:00"
},
{
"id": 78291,
@@ -4159,7 +4218,8 @@
}
],
"music_type": null,
"created_at": "2021-03-09 21:07:52"
"created_at": "2021-03-09 21:07:52",
"created_at_iso": "2021-03-09T21:07:52-04:00"
},
{
"id": 78290,
@@ -4209,7 +4269,8 @@
}
],
"music_type": null,
"created_at": "2021-03-09 12:35:54"
"created_at": "2021-03-09 12:35:54",
"created_at_iso": "2021-03-09T12:35:54-04:00"
},
{
"id": 78289,
@@ -4259,7 +4320,8 @@
}
],
"music_type": null,
"created_at": "2021-03-09 11:39:51"
"created_at": "2021-03-09 11:39:51",
"created_at_iso": "2021-03-09T11:39:51-04:00"
},
{
"id": 78287,
@@ -4300,7 +4362,8 @@
],
"subtitle": null,
"music_type": null,
"created_at": "2021-03-09 09:12:02"
"created_at": "2021-03-09 09:12:02",
"created_at_iso": "2021-03-09T09:12:02-04:00"
},
{
"id": 78279,
@@ -4346,7 +4409,8 @@
}
],
"music_type": null,
"created_at": "2021-03-08 11:47:40"
"created_at": "2021-03-08 11:47:40",
"created_at_iso": "2021-03-08T11:47:40-04:00"
},
{
"id": 78278,
@@ -4392,7 +4456,8 @@
}
],
"music_type": null,
"created_at": "2021-03-08 10:31:18"
"created_at": "2021-03-08 10:31:18",
"created_at_iso": "2021-03-08T10:31:18-04:00"
},
{
"id": 78252,
@@ -4442,7 +4507,8 @@
}
],
"music_type": null,
"created_at": "2021-03-07 22:14:12"
"created_at": "2021-03-07 22:14:12",
"created_at_iso": "2021-03-07T22:14:12-04:00"
},
{
"id": 78251,
@@ -4488,7 +4554,8 @@
}
],
"music_type": null,
"created_at": "2021-03-07 19:17:10"
"created_at": "2021-03-07 19:17:10",
"created_at_iso": "2021-03-07T19:17:10-04:00"
},
{
"id": 78250,
@@ -4534,7 +4601,8 @@
}
],
"music_type": null,
"created_at": "2021-03-07 17:45:21"
"created_at": "2021-03-07 17:45:21",
"created_at_iso": "2021-03-07T17:45:21-04:00"
},
{
"id": 78247,
@@ -4580,7 +4648,8 @@
}
],
"music_type": null,
"created_at": "2021-03-07 16:30:21"
"created_at": "2021-03-07 16:30:21",
"created_at_iso": "2021-03-07T16:30:21-04:00"
},
{
"id": 78246,
@@ -4726,7 +4795,8 @@
}
],
"music_type": null,
"created_at": "2021-03-07 16:06:55"
"created_at": "2021-03-07 16:06:55",
"created_at_iso": "2021-03-07T16:06:55-04:00"
},
{
"id": 78244,
@@ -4780,7 +4850,8 @@
}
],
"music_type": null,
"created_at": "2021-03-07 15:33:16"
"created_at": "2021-03-07 15:33:16",
"created_at_iso": "2021-03-07T15:33:16-04:00"
},
{
"id": 78243,
@@ -4830,7 +4901,8 @@
}
],
"music_type": null,
"created_at": "2021-03-07 15:27:18"
"created_at": "2021-03-07 15:27:18",
"created_at_iso": "2021-03-07T15:27:18-04:00"
},
{
"id": 78240,
@@ -4876,7 +4948,8 @@
}
],
"music_type": null,
"created_at": "2021-03-07 14:26:53"
"created_at": "2021-03-07 14:26:53",
"created_at_iso": "2021-03-07T14:26:53-04:00"
},
{
"id": 78239,
@@ -4922,7 +4995,8 @@
}
],
"music_type": null,
"created_at": "2021-03-07 14:21:46"
"created_at": "2021-03-07 14:21:46",
"created_at_iso": "2021-03-07T14:21:46-04:00"
},
{
"id": 78238,
@@ -4968,7 +5042,8 @@
}
],
"music_type": null,
"created_at": "2021-03-07 13:32:16"
"created_at": "2021-03-07 13:32:16",
"created_at_iso": "2021-03-07T13:32:16-04:00"
},
{
"id": 78237,
@@ -5014,7 +5089,8 @@
}
],
"music_type": null,
"created_at": "2021-03-07 12:49:22"
"created_at": "2021-03-07 12:49:22",
"created_at_iso": "2021-03-07T12:49:22-04:00"
},
{
"id": 78236,
@@ -5060,7 +5136,8 @@
}
],
"music_type": null,
"created_at": "2021-03-07 09:58:14"
"created_at": "2021-03-07 09:58:14",
"created_at_iso": "2021-03-07T09:58:14-04:00"
},
{
"id": 78235,
@@ -5110,7 +5187,8 @@
}
],
"music_type": null,
"created_at": "2021-03-07 06:23:54"
"created_at": "2021-03-07 06:23:54",
"created_at_iso": "2021-03-07T06:23:54-04:00"
},
{
"id": 78216,
@@ -5156,7 +5234,8 @@
}
],
"music_type": null,
"created_at": "2021-03-06 15:51:20"
"created_at": "2021-03-06 15:51:20",
"created_at_iso": "2021-03-06T15:51:20-04:00"
},
{
"id": 78215,
@@ -5202,7 +5281,8 @@
}
],
"music_type": null,
"created_at": "2021-03-06 14:47:47"
"created_at": "2021-03-06 14:47:47",
"created_at_iso": "2021-03-06T14:47:47-04:00"
},
{
"id": 78214,
@@ -5248,7 +5328,8 @@
}
],
"music_type": null,
"created_at": "2021-03-06 14:03:22"
"created_at": "2021-03-06 14:03:22",
"created_at_iso": "2021-03-06T14:03:22-04:00"
},
{
"id": 78213,
@@ -5294,7 +5375,8 @@
}
],
"music_type": null,
"created_at": "2021-03-06 13:39:59"
"created_at": "2021-03-06 13:39:59",
"created_at_iso": "2021-03-06T13:39:59-04:00"
},
{
"id": 78212,
@@ -5344,7 +5426,8 @@
}
],
"music_type": null,
"created_at": "2021-03-06 12:44:05"
"created_at": "2021-03-06 12:44:05",
"created_at_iso": "2021-03-06T12:44:05-04:00"
},
{
"id": 78210,
@@ -5530,7 +5613,8 @@
}
],
"music_type": null,
"created_at": "2021-03-06 11:15:35"
"created_at": "2021-03-06 11:15:35",
"created_at_iso": "2021-03-06T11:15:35-04:00"
},
{
"id": 78208,
@@ -5576,7 +5660,8 @@
}
],
"music_type": null,
"created_at": "2021-03-06 10:01:38"
"created_at": "2021-03-06 10:01:38",
"created_at_iso": "2021-03-06T10:01:38-04:00"
},
{
"id": 78206,
@@ -5666,7 +5751,8 @@
}
],
"music_type": null,
"created_at": "2021-03-06 07:31:39"
"created_at": "2021-03-06 07:31:39",
"created_at_iso": "2021-03-06T07:31:39-04:00"
},
{
"id": 78204,
@@ -5764,7 +5850,8 @@
}
],
"music_type": null,
"created_at": "2021-03-06 02:05:40"
"created_at": "2021-03-06 02:05:40",
"created_at_iso": "2021-03-06T02:05:40-04:00"
},
{
"id": 78203,
@@ -5810,7 +5897,8 @@
}
],
"music_type": null,
"created_at": "2021-03-06 01:01:33"
"created_at": "2021-03-06 01:01:33",
"created_at_iso": "2021-03-06T01:01:33-04:00"
},
{
"id": 78201,
@@ -5860,7 +5948,8 @@
}
],
"music_type": null,
"created_at": "2021-03-05 21:38:15"
"created_at": "2021-03-05 21:38:15",
"created_at_iso": "2021-03-05T21:38:15-04:00"
},
{
"id": 78197,
@@ -5910,7 +5999,8 @@
}
],
"music_type": null,
"created_at": "2021-03-05 15:09:48"
"created_at": "2021-03-05 15:09:48",
"created_at_iso": "2021-03-05T15:09:48-04:00"
},
{
"id": 78185,
@@ -5956,7 +6046,8 @@
}
],
"music_type": null,
"created_at": "2021-03-05 09:22:10"
"created_at": "2021-03-05 09:22:10",
"created_at_iso": "2021-03-05T09:22:10-04:00"
},
{
"id": 78184,
@@ -6046,7 +6137,8 @@
}
],
"music_type": null,
"created_at": "2021-03-05 08:09:13"
"created_at": "2021-03-05 08:09:13",
"created_at_iso": "2021-03-05T08:09:13-04:00"
},
{
"id": 78182,
@@ -6092,7 +6184,8 @@
}
],
"music_type": null,
"created_at": "2021-03-05 06:56:38"
"created_at": "2021-03-05 06:56:38",
"created_at_iso": "2021-03-05T06:56:38-04:00"
},
{
"id": 78181,
@@ -6138,7 +6231,8 @@
}
],
"music_type": null,
"created_at": "2021-03-05 06:55:19"
"created_at": "2021-03-05 06:55:19",
"created_at_iso": "2021-03-05T06:55:19-04:00"
},
{
"id": 78177,
@@ -6184,7 +6278,8 @@
}
],
"music_type": null,
"created_at": "2021-03-05 05:35:07"
"created_at": "2021-03-05 05:35:07",
"created_at_iso": "2021-03-05T05:35:07-04:00"
},
{
"id": 78176,
@@ -6230,7 +6325,8 @@
}
],
"music_type": null,
"created_at": "2021-03-05 05:26:24"
"created_at": "2021-03-05 05:26:24",
"created_at_iso": "2021-03-05T05:26:24-04:00"
},
{
"id": 78159,
@@ -6271,7 +6367,8 @@
],
"subtitle": null,
"music_type": null,
"created_at": "2021-03-04 23:08:06"
"created_at": "2021-03-04 23:08:06",
"created_at_iso": "2021-03-04T23:08:06-04:00"
},
{
"id": 78158,
@@ -6409,7 +6506,8 @@
}
],
"music_type": null,
"created_at": "2021-03-04 21:55:45"
"created_at": "2021-03-04 21:55:45",
"created_at_iso": "2021-03-04T21:55:45-04:00"
},
{
"id": 78157,
@@ -6547,7 +6645,8 @@
}
],
"music_type": null,
"created_at": "2021-03-04 21:32:31"
"created_at": "2021-03-04 21:32:31",
"created_at_iso": "2021-03-04T21:32:31-04:00"
},
{
"id": 78153,
@@ -6593,7 +6692,8 @@
}
],
"music_type": null,
"created_at": "2021-03-04 09:22:51"
"created_at": "2021-03-04 09:22:51",
"created_at_iso": "2021-03-04T09:22:51-04:00"
}
],
"first_page_url": "https:\/\/privatehd.to\/api\/v1\/jackett\/torrents?type=1&page=1",

View File

@@ -1,15 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<caps>
<server version="1.0" title="Anime Tosho" strapline="Anime NZB/DDL mirror" url="https://animetosho.org/"/>
<limits max="200" default="75"/>
<retention days="9999"/>
<registration available="no" open="yes" />
<searching>
<search available="yes" supportedParams="q" />
<tv-search available="no" supportedParams="q" />
<movie-search available="no" supportedParams="q" />
</searching>
<categories>
<category id="5070" name="Anime" description="Anime"/>
</categories>
</caps>
<server version="1.0" title="Anime Tosho" strapline="Anime NZB/DDL mirror" url="https://animetosho.org/" />
<limits max="200" default="75" />
<retention days="9999" />
<registration available="no" open="yes" />
<searching>
<search available="yes" supportedParams="q" />
<tv-search available="no" supportedParams="q" />
<movie-search available="no" supportedParams="q" />
</searching>
<categories>
<category id="5070" name="Anime" description="Anime" />
<category id="2020" name="Movies/Other" description="Movies (Anime)" />
</categories>
</caps>

View File

@@ -15,24 +15,24 @@ namespace NzbDrone.Core.Test.Http
return new HttpProxySettings(ProxyType.Socks5, "localhost", 8080, "*.httpbin.org,google.com,172.16.0.0/12", true, null, null);
}
[Test]
public void should_bypass_proxy()
[TestCase("http://eu.httpbin.org/get")]
[TestCase("http://google.com/get")]
[TestCase("http://localhost:8654/get")]
[TestCase("http://172.21.0.1:8989/api/v3/indexer/schema")]
public void should_bypass_proxy(string url)
{
var settings = GetProxySettings();
Subject.ShouldProxyBeBypassed(settings, new HttpUri("http://eu.httpbin.org/get")).Should().BeTrue();
Subject.ShouldProxyBeBypassed(settings, new HttpUri("http://google.com/get")).Should().BeTrue();
Subject.ShouldProxyBeBypassed(settings, new HttpUri("http://localhost:8654/get")).Should().BeTrue();
Subject.ShouldProxyBeBypassed(settings, new HttpUri("http://172.21.0.1:8989/api/v3/indexer/schema")).Should().BeTrue();
Subject.ShouldProxyBeBypassed(settings, new HttpUri(url)).Should().BeTrue();
}
[Test]
public void should_not_bypass_proxy()
[TestCase("http://bing.com/get")]
[TestCase("http://172.3.0.1:8989/api/v3/indexer/schema")]
public void should_not_bypass_proxy(string url)
{
var settings = GetProxySettings();
Subject.ShouldProxyBeBypassed(settings, new HttpUri("http://bing.com/get")).Should().BeFalse();
Subject.ShouldProxyBeBypassed(settings, new HttpUri("http://172.3.0.1:8989/api/v3/indexer/schema")).Should().BeFalse();
Subject.ShouldProxyBeBypassed(settings, new HttpUri(url)).Should().BeFalse();
}
}
}

View File

@@ -122,7 +122,7 @@ namespace NzbDrone.Core.Test.IndexerTests.AnimeBytesTests
var fifthTorrentInfo = releases.ElementAt(28) as TorrentInfo;
fifthTorrentInfo.Title.Should().Be("[-ZR-] Dr. STONE: STONE WARS S02 [Web][MKV][h264][1080p][AAC 2.0][Dual Audio][Softsubs (-ZR-)]");
fifthTorrentInfo.Title.Should().Be("[-ZR-] Dr. STONE: STONE WARS 2021 S02 [Web][MKV][h264][1080p][AAC 2.0][Dual Audio][Softsubs (-ZR-)]");
fifthTorrentInfo.DownloadProtocol.Should().Be(DownloadProtocol.Torrent);
fifthTorrentInfo.DownloadUrl.Should().Be("https://animebytes.tv/torrent/944509/download/somepass");
fifthTorrentInfo.InfoUrl.Should().Be("https://animebytes.tv/torrent/944509/group");

View File

@@ -140,7 +140,7 @@ namespace NzbDrone.Core.Test.IndexerTests.BroadcastheNetTests
query.Tvrage.Should().BeNull();
query.Search.Should().BeNull();
query.Category.Should().Be("Episode");
query.Name.Should().Be("2023.01.03");
query.Name.Should().Be("2023.01.03%");
}
[Test]
@@ -275,7 +275,7 @@ namespace NzbDrone.Core.Test.IndexerTests.BroadcastheNetTests
query.Tvrage.Should().BeNull();
query.Search.Should().Be("The%Late%Show%with%Stephen%Colbert");
query.Category.Should().Be("Episode");
query.Name.Should().Be("2023.01.03");
query.Name.Should().Be("2023.01.03%");
}
private static BroadcastheNetTorrentQuery ParseTorrentQueryFromRequest(HttpRequest httpRequest)

View File

@@ -55,7 +55,7 @@ namespace NzbDrone.Core.Test.IndexerTests.FileListTests
torrentInfo.InfoUrl.Should().Be("https://filelist.io/details.php?id=665873");
torrentInfo.CommentUrl.Should().BeNullOrEmpty();
torrentInfo.Indexer.Should().Be(Subject.Definition.Name);
torrentInfo.PublishDate.Should().Be(DateTime.Parse("2020-01-25 20:20:19"));
torrentInfo.PublishDate.Should().Be(DateTime.Parse("2020-01-25 19:20:19"));
torrentInfo.Size.Should().Be(8300512414);
torrentInfo.InfoHash.Should().Be(null);
torrentInfo.MagnetUrl.Should().Be(null);

View File

@@ -26,15 +26,15 @@ namespace NzbDrone.Core.Test.IndexerTests.HDBitsTests
[SetUp]
public void Setup()
{
Subject.Definition = new IndexerDefinition()
Subject.Definition = new IndexerDefinition
{
Name = "HdBits",
Settings = new HDBitsSettings() { ApiKey = "fakekey" }
Settings = new HDBitsSettings { ApiKey = "fakekey" }
};
_movieSearchCriteria = new MovieSearchCriteria
{
Categories = new int[] { 2000, 2010 },
Categories = new[] { 2000, 2010 },
ImdbId = "0076759"
};
}
@@ -52,7 +52,7 @@ namespace NzbDrone.Core.Test.IndexerTests.HDBitsTests
var torrents = (await Subject.Fetch(_movieSearchCriteria)).Releases;
torrents.Should().HaveCount(2);
torrents.First().Should().BeOfType<HDBitsInfo>();
torrents.First().Should().BeOfType<TorrentInfo>();
var first = torrents.First() as TorrentInfo;

View File

@@ -83,17 +83,18 @@ namespace NzbDrone.Core.Test.IndexerTests.NewznabTests
bookCats.Should().Contain("8000");
}
[Test]
public void should_find_sub_categories_as_main_categories()
[TestCase(5070)]
[TestCase(2020)]
public void should_find_sub_categories_as_main_categories(int category)
{
GivenCapsResponse(ReadAllText("Files/Indexers/Torznab/torznab_animetosho_caps.xml"));
var caps = Subject.GetCapabilities(_settings, _definition);
var bookCats = caps.Categories.MapTrackerCatToNewznab("5070");
var indexerCategories = caps.Categories.MapTrackerCatToNewznab(category.ToString());
bookCats.Count.Should().Be(2);
bookCats.First().Id.Should().Be(5070);
indexerCategories.Count.Should().Be(2);
indexerCategories.First().Id.Should().Be(category);
}
[Test]

View File

@@ -50,7 +50,7 @@ namespace NzbDrone.Core.Test.IndexerTests.PTPTests
first.Guid.Should().Be("PassThePopcorn-452135");
first.Title.Should().Be("The.Night.Of.S01.BluRay.AAC2.0.x264-DEPTH");
first.DownloadProtocol.Should().Be(DownloadProtocol.Torrent);
first.DownloadUrl.Should().Be("https://passthepopcorn.me/torrents.php?action=download&id=452135&authkey=00000000000000000000000000000000&torrent_pass=00000000000000000000000000000000");
first.DownloadUrl.Should().Be("https://passthepopcorn.me/torrents.php?action=download&id=452135");
first.InfoUrl.Should().Be("https://passthepopcorn.me/torrents.php?id=148131&torrentid=452135");
//first.PublishDate.Should().Be(DateTime.Parse("2017-04-17T12:13:42+0000").ToUniversalTime()); stupid timezones

View File

@@ -46,8 +46,8 @@ namespace NzbDrone.Core.Test.IndexerTests.RedactedTests
torrentInfo.Title.Should().Be("Red Hot Chili Peppers - Californication (1999) [Album] [US / Reissue 2020] [FLAC 24bit Lossless / Vinyl]");
torrentInfo.DownloadProtocol.Should().Be(DownloadProtocol.Torrent);
torrentInfo.DownloadUrl.Should().Be("https://redacted.ch/ajax.php?action=download&id=3892313");
torrentInfo.InfoUrl.Should().Be("https://redacted.ch/torrents.php?id=16720&torrentid=3892313");
torrentInfo.DownloadUrl.Should().Be("https://redacted.sh/ajax.php?action=download&id=3892313");
torrentInfo.InfoUrl.Should().Be("https://redacted.sh/torrents.php?id=16720&torrentid=3892313");
torrentInfo.CommentUrl.Should().BeNullOrEmpty();
torrentInfo.Indexer.Should().Be(Subject.Definition.Name);
torrentInfo.PublishDate.Should().Be(DateTime.Parse("2022-12-17 08:02:35"));

View File

@@ -1,12 +1,11 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net6.0</TargetFrameworks>
<TargetFrameworks>net8.0</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Dapper" Version="2.0.151" />
<PackageReference Include="Dapper" Version="2.1.66" />
<PackageReference Include="NBuilder" Version="6.1.0" />
<PackageReference Include="System.Data.SQLite.Core.Servarr" Version="1.0.115.5-18" />
<PackageReference Include="YamlDotNet" Version="13.1.1" />
<PackageReference Include="YamlDotNet" Version="16.3.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NzbDrone.Test.Common\Prowlarr.Test.Common.csproj" />

View File

@@ -16,7 +16,7 @@ namespace NzbDrone.Core.Applications
protected readonly IAppIndexerMapService _appIndexerMapService;
protected readonly Logger _logger;
protected static readonly Regex AppIndexerRegex = new (@"\/(?<indexer>\d{1,3})(?:\/(?:api)?\/?)?$", RegexOptions.IgnoreCase | RegexOptions.Compiled);
protected static readonly Regex AppIndexerRegex = new(@"\/(?<indexer>\d{1,3})(?:\/(?:api)?\/?)?$", RegexOptions.IgnoreCase | RegexOptions.Compiled);
public abstract string Name { get; }

View File

@@ -53,7 +53,7 @@ namespace NzbDrone.Core.Applications
foreach (var application in applications)
{
if (blockedApplications.TryGetValue(application.Definition.Id, out var blockedApplicationStatus))
if (blockedApplications.TryGetValue(application.Definition.Id, out var blockedApplicationStatus) && blockedApplicationStatus.DisabledTill.HasValue)
{
_logger.Debug("Temporarily ignoring application {0} till {1} due to recent failures.", application.Definition.Name, blockedApplicationStatus.DisabledTill.Value.ToLocalTime());
continue;

View File

@@ -19,7 +19,7 @@ namespace NzbDrone.Core.Applications.LazyLibrarian
public class LazyLibrarianSettings : IApplicationSettings
{
private static readonly LazyLibrarianSettingsValidator Validator = new ();
private static readonly LazyLibrarianSettingsValidator Validator = new();
public LazyLibrarianSettings()
{

View File

@@ -121,9 +121,16 @@ namespace NzbDrone.Core.Applications.Lidarr
{
var indexerCapabilities = GetIndexerCapabilities(indexer);
if (!indexerCapabilities.MusicSearchAvailable && !indexerCapabilities.SearchAvailable)
{
_logger.Debug("Skipping add for indexer {0} [{1}] due to missing music or basic search support by the indexer", indexer.Name, indexer.Id);
return;
}
if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Empty())
{
_logger.Trace("Skipping add for indexer {0} [{1}] due to no app Sync Categories supported by the indexer", indexer.Name, indexer.Id);
_logger.Debug("Skipping add for indexer {0} [{1}] due to no app Sync Categories supported by the indexer", indexer.Name, indexer.Id);
return;
}
@@ -178,7 +185,8 @@ namespace NzbDrone.Core.Applications.Lidarr
{
_logger.Debug("Syncing remote indexer with current settings");
if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any())
if ((indexerCapabilities.MusicSearchAvailable || indexerCapabilities.SearchAvailable) &&
indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any())
{
// Retain user fields not-affiliated with Prowlarr
lidarrIndexer.Fields.AddRange(remoteIndexer.Fields.Where(f => lidarrIndexer.Fields.All(s => s.Name != f.Name)));
@@ -204,7 +212,8 @@ namespace NzbDrone.Core.Applications.Lidarr
{
_appIndexerMapService.Delete(indexerMapping.Id);
if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any())
if ((indexerCapabilities.MusicSearchAvailable || indexerCapabilities.SearchAvailable) &&
indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any())
{
_logger.Debug("Remote indexer not found, re-adding {0} [{1}] to Lidarr", indexer.Name, indexer.Id);
lidarrIndexer.Id = 0;

View File

@@ -18,7 +18,7 @@ namespace NzbDrone.Core.Applications.Lidarr
public class LidarrSettings : IApplicationSettings
{
private static readonly LidarrSettingsValidator Validator = new ();
private static readonly LidarrSettingsValidator Validator = new();
public LidarrSettings()
{

View File

@@ -23,7 +23,7 @@ namespace NzbDrone.Core.Applications.Lidarr
public class LidarrV1Proxy : ILidarrV1Proxy
{
private static Version MinimumApplicationVersion => new (1, 0, 2, 0);
private static Version MinimumApplicationVersion => new(1, 0, 2, 0);
private const string AppApiRoute = "/api/v1";
private const string AppIndexerApiRoute = $"{AppApiRoute}/indexer";

View File

@@ -19,7 +19,7 @@ namespace NzbDrone.Core.Applications.Mylar
public class MylarSettings : IApplicationSettings
{
private static readonly MylarSettingsValidator Validator = new ();
private static readonly MylarSettingsValidator Validator = new();
public MylarSettings()
{

View File

@@ -121,9 +121,16 @@ namespace NzbDrone.Core.Applications.Radarr
{
var indexerCapabilities = GetIndexerCapabilities(indexer);
if (!indexerCapabilities.MovieSearchAvailable && !indexerCapabilities.SearchAvailable)
{
_logger.Debug("Skipping add for indexer {0} [{1}] due to missing movie or basic search support by the indexer", indexer.Name, indexer.Id);
return;
}
if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Empty())
{
_logger.Trace("Skipping add for indexer {0} [{1}] due to no app Sync Categories supported by the indexer", indexer.Name, indexer.Id);
_logger.Debug("Skipping add for indexer {0} [{1}] due to no app Sync Categories supported by the indexer", indexer.Name, indexer.Id);
return;
}
@@ -176,7 +183,8 @@ namespace NzbDrone.Core.Applications.Radarr
if (!radarrIndexer.Equals(remoteIndexer) || forceSync)
{
if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any())
if ((indexerCapabilities.MovieSearchAvailable || indexerCapabilities.SearchAvailable) &&
indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any())
{
// Retain user fields not-affiliated with Prowlarr
radarrIndexer.Fields.AddRange(remoteIndexer.Fields.Where(f => radarrIndexer.Fields.All(s => s.Name != f.Name)));
@@ -202,7 +210,8 @@ namespace NzbDrone.Core.Applications.Radarr
{
_appIndexerMapService.Delete(indexerMapping.Id);
if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any())
if ((indexerCapabilities.MovieSearchAvailable || indexerCapabilities.SearchAvailable) &&
indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any())
{
_logger.Debug("Remote indexer not found, re-adding {0} [{1}] to Radarr", indexer.Name, indexer.Id);
radarrIndexer.Id = 0;

View File

@@ -19,7 +19,7 @@ namespace NzbDrone.Core.Applications.Radarr
public class RadarrSettings : IApplicationSettings
{
private static readonly RadarrSettingsValidator Validator = new ();
private static readonly RadarrSettingsValidator Validator = new();
public RadarrSettings()
{

View File

@@ -23,8 +23,8 @@ namespace NzbDrone.Core.Applications.Radarr
public class RadarrV3Proxy : IRadarrV3Proxy
{
private static Version MinimumApplicationV4Version => new (4, 0, 4, 0);
private static Version MinimumApplicationV3Version => new (3, 1, 1, 0);
private static Version MinimumApplicationV4Version => new(4, 0, 4, 0);
private static Version MinimumApplicationV3Version => new(3, 1, 1, 0);
private const string AppApiRoute = "/api/v3";
private const string AppIndexerApiRoute = $"{AppApiRoute}/indexer";

View File

@@ -121,9 +121,16 @@ namespace NzbDrone.Core.Applications.Readarr
{
var indexerCapabilities = GetIndexerCapabilities(indexer);
if (!indexerCapabilities.BookSearchAvailable && !indexerCapabilities.SearchAvailable)
{
_logger.Debug("Skipping add for indexer {0} [{1}] due to missing book or basic search support by the indexer", indexer.Name, indexer.Id);
return;
}
if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Empty())
{
_logger.Trace("Skipping add for indexer {0} [{1}] due to no app Sync Categories supported by the indexer", indexer.Name, indexer.Id);
_logger.Debug("Skipping add for indexer {0} [{1}] due to no app Sync Categories supported by the indexer", indexer.Name, indexer.Id);
return;
}
@@ -178,7 +185,8 @@ namespace NzbDrone.Core.Applications.Readarr
{
_logger.Debug("Syncing remote indexer with current settings");
if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any())
if ((indexerCapabilities.BookSearchAvailable || indexerCapabilities.SearchAvailable) &&
indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any())
{
// Retain user fields not-affiliated with Prowlarr
readarrIndexer.Fields.AddRange(remoteIndexer.Fields.Where(f => readarrIndexer.Fields.All(s => s.Name != f.Name)));
@@ -204,7 +212,8 @@ namespace NzbDrone.Core.Applications.Readarr
{
_appIndexerMapService.Delete(indexerMapping.Id);
if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any())
if ((indexerCapabilities.BookSearchAvailable || indexerCapabilities.SearchAvailable) &&
indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any())
{
_logger.Debug("Remote indexer not found, re-adding {0} [{1}] to Readarr", indexer.Name, indexer.Id);
readarrIndexer.Id = 0;

Some files were not shown because too many files have changed in this diff Show More