Compare commits

...

145 Commits

Author SHA1 Message Date
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
262 changed files with 4137 additions and 2198 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)

View File

@@ -9,17 +9,17 @@ variables:
testsFolder: './_tests'
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
majorVersion: '1.33.1'
majorVersion: '2.1.5'
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'
linuxImage: 'ubuntu-22.04'
macImage: 'macOS-13'
trigger:
@@ -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: |
@@ -1181,22 +1158,23 @@ stages:
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@3
condition: eq(variables['System.PullRequest.IsFork'], 'False')
displayName: Publish SonarCloud Results
- task: reportgenerator@5.3.11
- 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

View File

@@ -1,7 +1,7 @@
#!/bin/bash
set -e
FRAMEWORK="net6.0"
FRAMEWORK="net8.0"
PLATFORM=$1
ARCHITECTURE="${2:-x64}"
@@ -38,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

@@ -170,7 +170,7 @@ module.exports = (env) => {
loose: true,
debug: false,
useBuiltIns: 'entry',
corejs: '3.39'
corejs: '3.42'
}
]
]

View File

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

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

@@ -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

@@ -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 });
});
}

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.7.1",
"@fortawesome/fontawesome-svg-core": "6.7.1",
"@fortawesome/free-regular-svg-icons": "6.7.1",
"@fortawesome/free-solid-svg-icons": "6.7.1",
"@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",
@@ -84,13 +84,13 @@
"typescript": "5.7.2"
},
"devDependencies": {
"@babel/core": "7.26.0",
"@babel/eslint-parser": "7.25.9",
"@babel/plugin-proposal-export-default-from": "7.25.9",
"@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.26.0",
"@babel/preset-react": "7.26.3",
"@babel/preset-typescript": "7.26.0",
"@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",
@@ -104,7 +104,7 @@
"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.39.0",
"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>

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

@@ -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

@@ -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

@@ -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

@@ -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

@@ -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

@@ -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

@@ -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|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),
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

@@ -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

@@ -15,8 +15,8 @@ namespace NzbDrone.Common.Instrumentation
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 readonly CleansingConsoleLogLayout CleansingConsoleLayout = new(ConsoleFormat);
private static readonly CleansingClefLogLayout ClefLogLayout = new();
private static bool _isConfigured;
@@ -202,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);
});
}

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)

View File

@@ -1,28 +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.1.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="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="7.0.9" />
<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.Text.Json" Version="6.0.10" />
<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,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

@@ -51,7 +51,7 @@ namespace NzbDrone.Core.Test.IndexerTests.AvistazTests
torrentInfo.InfoUrl.Should().Be("https://avistaz.to/torrent/187240-japan-sinks-people-of-hope-2021-s01e05-720p-nf-web-dl-ddp20-x264-seikel");
torrentInfo.CommentUrl.Should().BeNullOrEmpty();
torrentInfo.Indexer.Should().Be(Subject.Definition.Name);
torrentInfo.PublishDate.Should().Be(DateTime.Parse("2021-11-14 22:26:21"));
torrentInfo.PublishDate.Should().Be(DateTime.Parse("2021-11-14 21:26:21"));
torrentInfo.Size.Should().Be(935127615);
torrentInfo.InfoHash.Should().Be("a879261d4e6e792402f92401141a21de70d51bf2");
torrentInfo.MagnetUrl.Should().Be(null);

View File

@@ -51,7 +51,7 @@ namespace NzbDrone.Core.Test.IndexerTests.AvistazTests
torrentInfo.InfoUrl.Should().Be("https://exoticaz.to/torrent/64040-ssis-419-my-first-experience-is-yua-mikami-from-the-day-i-lost-my-virginity-i-was-devoted-to-sex");
torrentInfo.CommentUrl.Should().BeNullOrEmpty();
torrentInfo.Indexer.Should().Be(Subject.Definition.Name);
torrentInfo.PublishDate.Should().Be(DateTime.Parse("2022-06-11 10:04:50"));
torrentInfo.PublishDate.Should().Be(DateTime.Parse("2022-06-11 09:04:50"));
torrentInfo.Size.Should().Be(7085405541);
torrentInfo.InfoHash.Should().Be("asdjfiasdf54asd7f4a2sdf544asdf");
torrentInfo.MagnetUrl.Should().Be(null);

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

@@ -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

@@ -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

@@ -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;

View File

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

View File

@@ -125,10 +125,17 @@ namespace NzbDrone.Core.Applications.Sonarr
{
var indexerCapabilities = GetIndexerCapabilities(indexer);
if (!indexerCapabilities.TvSearchAvailable && !indexerCapabilities.SearchAvailable)
{
_logger.Debug("Skipping add for indexer {0} [{1}] due to missing TV or basic search support by the indexer", indexer.Name, indexer.Id);
return;
}
if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Empty() &&
indexerCapabilities.Categories.SupportedCategories(Settings.AnimeSyncCategories.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;
}
@@ -183,7 +190,8 @@ namespace NzbDrone.Core.Applications.Sonarr
{
_logger.Debug("Syncing remote indexer with current settings");
if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any() || indexerCapabilities.Categories.SupportedCategories(Settings.AnimeSyncCategories.ToArray()).Any())
if ((indexerCapabilities.TvSearchAvailable || indexerCapabilities.SearchAvailable) &&
(indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any() || indexerCapabilities.Categories.SupportedCategories(Settings.AnimeSyncCategories.ToArray()).Any()))
{
// Retain user fields not-affiliated with Prowlarr
sonarrIndexer.Fields.AddRange(remoteIndexer.Fields.Where(f => sonarrIndexer.Fields.All(s => s.Name != f.Name)));
@@ -210,7 +218,8 @@ namespace NzbDrone.Core.Applications.Sonarr
{
_appIndexerMapService.Delete(indexerMapping.Id);
if (indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any() || indexerCapabilities.Categories.SupportedCategories(Settings.AnimeSyncCategories.ToArray()).Any())
if ((indexerCapabilities.TvSearchAvailable || indexerCapabilities.SearchAvailable) &&
(indexerCapabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray()).Any() || indexerCapabilities.Categories.SupportedCategories(Settings.AnimeSyncCategories.ToArray()).Any()))
{
_logger.Debug("Remote indexer not found, re-adding {0} [{1}] to Sonarr", indexer.Name, indexer.Id);
sonarrIndexer.Id = 0;

View File

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

View File

@@ -23,7 +23,7 @@ namespace NzbDrone.Core.Applications.Sonarr
public class SonarrV3Proxy : ISonarrV3Proxy
{
private static Version MinimumApplicationVersion => new (3, 0, 5, 0);
private static Version MinimumApplicationVersion => new(3, 0, 5, 0);
private const string AppApiRoute = "/api/v3";
private const string AppIndexerApiRoute = $"{AppApiRoute}/indexer";

View File

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

View File

@@ -1,8 +1,11 @@
using System;
namespace NzbDrone.Core.Authentication
{
public enum AuthenticationType
{
None = 0,
[Obsolete("Use Forms authentication instead")]
Basic = 1,
Forms = 2,
External = 3

View File

@@ -207,13 +207,24 @@ namespace NzbDrone.Core.Configuration
if (enabled)
{
SetValue("AuthenticationMethod", AuthenticationType.Basic);
return AuthenticationType.Basic;
SetValue("AuthenticationMethod", AuthenticationType.Forms);
return AuthenticationType.Forms;
}
return Enum.TryParse<AuthenticationType>(_authOptions.Method, out var enumValue)
var value = Enum.TryParse<AuthenticationType>(_authOptions.Method, out var enumValue)
? enumValue
: GetValueEnum("AuthenticationMethod", AuthenticationType.None);
#pragma warning disable CS0618 // Type or member is obsolete
if (value == AuthenticationType.Basic)
#pragma warning restore CS0618 // Type or member is obsolete
{
SetValue("AuthenticationMethod", AuthenticationType.Forms);
return AuthenticationType.Forms;
}
return value;
}
}
@@ -389,6 +400,12 @@ namespace NzbDrone.Core.Configuration
{
SetValue("EnableSsl", false);
}
#pragma warning disable CS0618 // Type or member is obsolete
if (AuthenticationMethod == AuthenticationType.Basic)
#pragma warning restore CS0618 // Type or member is obsolete
{
SetValue("AuthenticationMethod", AuthenticationType.Forms);
}
}
private void DeleteOldValues()

View File

@@ -1,13 +1,18 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SQLite;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
using Dapper;
using NLog;
using NzbDrone.Common.Instrumentation;
using NzbDrone.Core.Datastore.Events;
using NzbDrone.Core.Messaging.Events;
using Polly;
using Polly.Retry;
namespace NzbDrone.Core.Datastore
{
@@ -40,12 +45,31 @@ namespace NzbDrone.Core.Datastore
public class BasicRepository<TModel> : IBasicRepository<TModel>
where TModel : ModelBase, new()
{
private static readonly ILogger Logger = NzbDroneLogger.GetLogger(typeof(BasicRepository<TModel>));
private readonly IEventAggregator _eventAggregator;
private readonly PropertyInfo _keyProperty;
private readonly List<PropertyInfo> _properties;
private readonly string _updateSql;
private readonly string _insertSql;
private static ResiliencePipeline RetryStrategy => new ResiliencePipelineBuilder()
.AddRetry(new RetryStrategyOptions
{
ShouldHandle = new PredicateBuilder().Handle<SQLiteException>(ex => ex.ResultCode == SQLiteErrorCode.Busy),
Delay = TimeSpan.FromMilliseconds(100),
MaxRetryAttempts = 3,
BackoffType = DelayBackoffType.Exponential,
UseJitter = true,
OnRetry = args =>
{
Logger.Warn(args.Outcome.Exception, "Failed writing to database. Retry #{0}", args.AttemptNumber);
return default;
}
})
.Build();
protected readonly IDatabase _database;
protected readonly string _table;
@@ -186,7 +210,9 @@ namespace NzbDrone.Core.Datastore
private TModel Insert(IDbConnection connection, IDbTransaction transaction, TModel model)
{
SqlBuilderExtensions.LogQuery(_insertSql, model);
var multi = connection.QueryMultiple(_insertSql, model, transaction);
var multi = RetryStrategy.Execute(static (state, _) => state.connection.QueryMultiple(state._insertSql, state.model, state.transaction), (connection, _insertSql, model, transaction));
var multiRead = multi.Read();
var id = (int)(multiRead.First().id ?? multiRead.First().Id);
_keyProperty.SetValue(model, id);
@@ -254,7 +280,7 @@ namespace NzbDrone.Core.Datastore
protected void Delete(SqlBuilder builder)
{
var sql = builder.AddDeleteTemplate(typeof(TModel)).LogQuery();
var sql = builder.AddDeleteTemplate(typeof(TModel));
using (var conn = _database.OpenConnection())
{
@@ -383,7 +409,7 @@ namespace NzbDrone.Core.Datastore
SqlBuilderExtensions.LogQuery(sql, model);
connection.Execute(sql, model, transaction: transaction);
RetryStrategy.Execute(static (state, _) => state.connection.Execute(state.sql, state.model, transaction: state.transaction), (connection, sql, model, transaction));
}
private void UpdateFields(IDbConnection connection, IDbTransaction transaction, IList<TModel> models, List<PropertyInfo> propertiesToUpdate)
@@ -395,7 +421,7 @@ namespace NzbDrone.Core.Datastore
SqlBuilderExtensions.LogQuery(sql, model);
}
connection.Execute(sql, models, transaction: transaction);
RetryStrategy.Execute(static (state, _) => state.connection.Execute(state.sql, state.models, transaction: state.transaction), (connection, sql, models, transaction));
}
protected virtual SqlBuilder PagedBuilder() => Builder();

View File

@@ -5,7 +5,7 @@ namespace NzbDrone.Core.Datastore;
public static class DatabaseVersionParser
{
private static readonly Regex VersionRegex = new (@"^[^ ]+", RegexOptions.Compiled);
private static readonly Regex VersionRegex = new(@"^[^ ]+", RegexOptions.Compiled);
public static Version ParseServerVersion(string serverVersion)
{

View File

@@ -27,7 +27,7 @@ namespace NzbDrone.Core.Datastore
switch (expression.NodeType)
{
case ExpressionType.Lambda:
return VisitLamda((LambdaExpression)expression);
return VisitLambda((LambdaExpression)expression);
case ExpressionType.ArrayLength:
case ExpressionType.Convert:
case ExpressionType.ConvertChecked:
@@ -87,7 +87,7 @@ namespace NzbDrone.Core.Datastore
}
/// <summary>
/// Visits the memeber access expression. To be implemented by user.
/// Visits the member access expression. To be implemented by user.
/// </summary>
/// <param name="expression"></param>
/// <returns></returns>
@@ -130,11 +130,11 @@ namespace NzbDrone.Core.Datastore
}
/// <summary>
/// Visits the lamda expression.
/// Visits the lambda expression.
/// </summary>
/// <param name="lambdaExpression"></param>
/// <returns></returns>
protected virtual Expression VisitLamda(LambdaExpression lambdaExpression)
protected virtual Expression VisitLambda(LambdaExpression lambdaExpression)
{
Visit(lambdaExpression.Body);
return lambdaExpression;

View File

@@ -0,0 +1,22 @@
using System.Data;
using Dapper;
using FluentMigrator;
using NzbDrone.Core.Datastore.Migration.Framework;
namespace NzbDrone.Core.Datastore.Migration
{
[Migration(043)]
public class newznab_indexers_enable_redirect : NzbDroneMigrationBase
{
protected override void MainDbUpgrade()
{
Execute.WithConnection(UpdateNewznabRedirectSetting);
}
private void UpdateNewznabRedirectSetting(IDbConnection conn, IDbTransaction tran)
{
var updateSql = "UPDATE \"Indexers\" SET \"Redirect\" = @Redirect WHERE \"Implementation\" = 'Newznab' AND \"Redirect\" = false";
conn.Execute(updateSql, new { Redirect = true }, transaction: tran);
}
}
}

View File

@@ -36,7 +36,7 @@ namespace NzbDrone.Core.Download.Clients.FreeboxDownload
public class FreeboxDownloadSettings : IProviderConfig
{
private static readonly FreeboxDownloadSettingsValidator Validator = new ();
private static readonly FreeboxDownloadSettingsValidator Validator = new();
public FreeboxDownloadSettings()
{

View File

@@ -76,7 +76,7 @@ namespace NzbDrone.Core.Download.Clients.UTorrent
public override string Name => "uTorrent";
public override ProviderMessage Message => new (_localizationService.GetLocalizedString("DownloadClientUTorrentProviderMessage"), ProviderMessageType.Warning);
public override ProviderMessage Message => new(_localizationService.GetLocalizedString("DownloadClientUTorrentProviderMessage"), ProviderMessageType.Warning);
public override bool SupportsCategories => true;

View File

@@ -1,3 +1,4 @@
using System;
using System.IO;
using System.Linq;
using System.Xml;
@@ -15,39 +16,53 @@ namespace NzbDrone.Core.Download
{
public void Validate(byte[] fileContent)
{
var reader = new StreamReader(new MemoryStream(fileContent));
using (var xmlTextReader = XmlReader.Create(reader, new XmlReaderSettings { DtdProcessing = DtdProcessing.Ignore, IgnoreComments = true }))
try
{
var xDoc = XDocument.Load(xmlTextReader);
var nzb = xDoc.Root;
var reader = new StreamReader(new MemoryStream(fileContent));
if (nzb == null)
using (var xmlTextReader = XmlReader.Create(reader,
new XmlReaderSettings { DtdProcessing = DtdProcessing.Ignore, IgnoreComments = true }))
{
throw new InvalidNzbException("Invalid NZB: No Root element");
}
var xDoc = XDocument.Load(xmlTextReader);
var nzb = xDoc.Root;
// nZEDb has an bug in their error reporting code spitting out invalid http status codes
if (nzb.Name.LocalName.Equals("error") &&
nzb.TryGetAttributeValue("code", out var code) &&
nzb.TryGetAttributeValue("description", out var description))
{
throw new InvalidNzbException("Invalid NZB: Contains indexer error: {0} - {1}", code, description);
}
if (nzb == null)
{
throw new InvalidNzbException("Invalid NZB: No Root element");
}
if (!nzb.Name.LocalName.Equals("nzb"))
{
throw new InvalidNzbException("Invalid NZB: Unexpected root element. Expected 'nzb' found '{0}'", nzb.Name.LocalName);
}
// nZEDb has a bug in their error reporting code spitting out invalid http status codes
if (nzb.Name.LocalName.Equals("error") &&
nzb.TryGetAttributeValue("code", out var code) &&
nzb.TryGetAttributeValue("description", out var description))
{
throw new InvalidNzbException("Invalid NZB: Contains indexer error: {0} - {1}", code, description);
}
var ns = nzb.Name.Namespace;
var files = nzb.Elements(ns + "file").ToList();
if (!nzb.Name.LocalName.Equals("nzb"))
{
throw new InvalidNzbException(
"Invalid NZB: Unexpected root element. Expected 'nzb' found '{0}'", nzb.Name.LocalName);
}
if (files.Empty())
{
throw new InvalidNzbException("Invalid NZB: No files");
var ns = nzb.Name.Namespace;
var files = nzb.Elements(ns + "file").ToList();
if (files.Empty())
{
throw new InvalidNzbException("Invalid NZB: No files");
}
}
}
catch (InvalidNzbException)
{
// Throw the original exception
throw;
}
catch (Exception ex)
{
throw new InvalidNzbException("Invalid NZB: Unable to parse", ex);
}
}
}
}

View File

@@ -10,7 +10,7 @@ namespace NzbDrone.Core.Http.CloudFlare
{
public class CloudFlareDetectionService
{
private static readonly HashSet<string> CloudflareServerNames = new () { "cloudflare", "cloudflare-nginx", "ddos-guard" };
private static readonly HashSet<string> CloudflareServerNames = new() { "cloudflare", "cloudflare-nginx", "ddos-guard" };
private readonly Logger _logger;
public CloudFlareDetectionService(Logger logger)

View File

@@ -7,8 +7,8 @@ namespace NzbDrone.Core.IndexerSearch.Definitions
{
public abstract class SearchCriteriaBase
{
private static readonly Regex StandardizeDashesRegex = new (@"\p{Pd}+", RegexOptions.IgnoreCase | RegexOptions.Compiled);
private static readonly Regex StandardizeSingleQuotesRegex = new (@"[\u0060\u00B4\u2018\u2019]", RegexOptions.IgnoreCase | RegexOptions.Compiled);
private static readonly Regex StandardizeDashesRegex = new(@"\p{Pd}+", RegexOptions.IgnoreCase | RegexOptions.Compiled);
private static readonly Regex StandardizeSingleQuotesRegex = new(@"[\u0060\u00B4\u2018\u2019]", RegexOptions.IgnoreCase | RegexOptions.Compiled);
public virtual bool InteractiveSearch { get; set; }
public List<int> IndexerIds { get; set; }

View File

@@ -5,10 +5,10 @@ namespace NzbDrone.Core.IndexerSearch
{
public class NewznabRequest
{
private static readonly Regex TvRegex = new (@"\{((?:imdbid\:)(?<imdbid>[^{]+)|(?:rid\:)(?<rid>[^{]+)|(?:tvdbid\:)(?<tvdbid>[^{]+)|(?:tmdbid\:)(?<tmdbid>[^{]+)|(?:tvmazeid\:)(?<tvmazeid>[^{]+)|(?:doubanid\:)(?<doubanid>[^{]+)|(?:season\:)(?<season>[^{]+)|(?:episode\:)(?<episode>[^{]+)|(?:year\:)(?<year>[^{]+)|(?:genre\:)(?<genre>[^{]+))\}", RegexOptions.Compiled | RegexOptions.IgnoreCase);
private static readonly Regex MovieRegex = new (@"\{((?:imdbid\:)(?<imdbid>[^{]+)|(?:doubanid\:)(?<doubanid>[^{]+)|(?:tmdbid\:)(?<tmdbid>[^{]+)|(?:traktid\:)(?<traktid>[^{]+)|(?:year\:)(?<year>[^{]+)|(?:genre\:)(?<genre>[^{]+))\}", RegexOptions.Compiled | RegexOptions.IgnoreCase);
private static readonly Regex MusicRegex = new (@"\{((?:artist\:)(?<artist>[^{]+)|(?:album\:)(?<album>[^{]+)|(?:track\:)(?<track>[^{]+)|(?:label\:)(?<label>[^{]+)|(?:year\:)(?<year>[^{]+)|(?:genre\:)(?<genre>[^{]+))\}", RegexOptions.Compiled | RegexOptions.IgnoreCase);
private static readonly Regex BookRegex = new (@"\{((?:author\:)(?<author>[^{]+)|(?:publisher\:)(?<publisher>[^{]+)|(?:title\:)(?<title>[^{]+)|(?:year\:)(?<year>[^{]+)|(?:genre\:)(?<genre>[^{]+))\}", RegexOptions.Compiled | RegexOptions.IgnoreCase);
private static readonly Regex TvRegex = new(@"\{((?:imdbid\:)(?<imdbid>[^{]+)|(?:rid\:)(?<rid>[^{]+)|(?:tvdbid\:)(?<tvdbid>[^{]+)|(?:tmdbid\:)(?<tmdbid>[^{]+)|(?:tvmazeid\:)(?<tvmazeid>[^{]+)|(?:doubanid\:)(?<doubanid>[^{]+)|(?:season\:)(?<season>[^{]+)|(?:episode\:)(?<episode>[^{]+)|(?:year\:)(?<year>[^{]+)|(?:genre\:)(?<genre>[^{]+))\}", RegexOptions.Compiled | RegexOptions.IgnoreCase);
private static readonly Regex MovieRegex = new(@"\{((?:imdbid\:)(?<imdbid>[^{]+)|(?:doubanid\:)(?<doubanid>[^{]+)|(?:tmdbid\:)(?<tmdbid>[^{]+)|(?:traktid\:)(?<traktid>[^{]+)|(?:year\:)(?<year>[^{]+)|(?:genre\:)(?<genre>[^{]+))\}", RegexOptions.Compiled | RegexOptions.IgnoreCase);
private static readonly Regex MusicRegex = new(@"\{((?:artist\:)(?<artist>[^{]+)|(?:album\:)(?<album>[^{]+)|(?:track\:)(?<track>[^{]+)|(?:label\:)(?<label>[^{]+)|(?:year\:)(?<year>[^{]+)|(?:genre\:)(?<genre>[^{]+))\}", RegexOptions.Compiled | RegexOptions.IgnoreCase);
private static readonly Regex BookRegex = new(@"\{((?:author\:)(?<author>[^{]+)|(?:publisher\:)(?<publisher>[^{]+)|(?:title\:)(?<title>[^{]+)|(?:year\:)(?<year>[^{]+)|(?:genre\:)(?<genre>[^{]+))\}", RegexOptions.Compiled | RegexOptions.IgnoreCase);
public string t { get; set; }
public string q { get; set; }

View File

@@ -33,7 +33,7 @@ namespace NzbDrone.Core.IndexerVersions
private const int DEFINITION_VERSION = 11;
// Used when moving yml to C#
private readonly List<string> _definitionBlocklist = new ()
private readonly List<string> _definitionBlocklist = new()
{
"aither",
"animeworld",
@@ -251,8 +251,8 @@ namespace NzbDrone.Core.IndexerVersions
{
definition.Settings = new List<SettingsField>
{
new () { Name = "username", Label = "Username", Type = "text" },
new () { Name = "password", Label = "Password", Type = "password" }
new() { Name = "username", Label = "Username", Type = "text" },
new() { Name = "password", Label = "Password", Type = "password" }
};
}

View File

@@ -252,7 +252,7 @@ namespace NzbDrone.Core.Indexers.Definitions
private readonly IIndexerHttpClient _httpClient;
private readonly Logger _logger;
private static Dictionary<string, string> CategoriesMap => new ()
private static Dictionary<string, string> CategoriesMap => new()
{
{ "/anime_tv/full", "14" },
{ "/anime_tv/anime_ongoing", "10" },

View File

@@ -149,7 +149,7 @@ namespace NzbDrone.Core.Indexers.Definitions
private readonly AnimeBytesSettings _settings;
private readonly IndexerCapabilities _capabilities;
private static Regex YearRegex => new (@"\b((?:19|20)\d{2})$", RegexOptions.Compiled);
private static Regex YearRegex => new(@"\b((?:19|20)\d{2})$", RegexOptions.Compiled);
public AnimeBytesRequestGenerator(AnimeBytesSettings settings, IndexerCapabilities capabilities)
{
@@ -290,16 +290,16 @@ namespace NzbDrone.Core.Indexers.Definitions
public class AnimeBytesParser : IParseIndexerResponse
{
private static readonly HashSet<string> ExcludedProperties = new (StringComparer.OrdinalIgnoreCase) { "Freeleech" };
private static readonly HashSet<string> RemuxResolutions = new (StringComparer.OrdinalIgnoreCase) { "1080i", "1080p", "2160p", "4K" };
private static readonly HashSet<string> CommonReleaseGroupsProperties = new (StringComparer.OrdinalIgnoreCase)
private static readonly HashSet<string> ExcludedProperties = new(StringComparer.OrdinalIgnoreCase) { "Freeleech" };
private static readonly HashSet<string> RemuxResolutions = new(StringComparer.OrdinalIgnoreCase) { "1080i", "1080p", "2160p", "4K" };
private static readonly HashSet<string> CommonReleaseGroupsProperties = new(StringComparer.OrdinalIgnoreCase)
{
"Softsubs",
"Hardsubs",
"RAW",
"Translated"
};
private static readonly HashSet<string> ExcludedFileExtensions = new (StringComparer.OrdinalIgnoreCase) { ".mka", ".mds", ".md5", ".nfo", ".sfv", ".ass", ".mks", ".srt", ".ssa", ".sup", ".jpeg", ".jpg", ".png", ".otf", ".ttf" };
private static readonly HashSet<string> ExcludedFileExtensions = new(StringComparer.OrdinalIgnoreCase) { ".mka", ".mds", ".md5", ".nfo", ".sfv", ".ass", ".mks", ".srt", ".ssa", ".sup", ".jpeg", ".jpg", ".png", ".otf", ".ttf" };
private static readonly string[] PropertiesSeparator = { " | ", " / " };
@@ -712,7 +712,7 @@ namespace NzbDrone.Core.Indexers.Definitions
public class AnimeBytesSettings : NoAuthTorrentBaseSettings
{
private static readonly AnimeBytesSettingsValidator Validator = new ();
private static readonly AnimeBytesSettingsValidator Validator = new();
public AnimeBytesSettings()
{

View File

@@ -237,13 +237,13 @@ namespace NzbDrone.Core.Indexers.Definitions
return _categories.MapTrackerCatDescToNewznab("OVA/ONA/Special");
}
// Check movies then, cause some of releases could be movies dorama and should go to movies category
// Check movies then, cause some of the releases could be movies dorama and should go to movies category
if (CategorieMovieRegex.IsMatch(rName) || CategorieMovieRegex.IsMatch(rDesc))
{
return _categories.MapTrackerCatDescToNewznab("Movies");
}
// Check dorama. Most of doramas are flaged as doramas in type info, but type info could have a lot of types at same time (movie, etc)
// Check dorama. Most of doramas are flagged as doramas in type info, but type info could have a lot of types at same time (movie, etc)
if (CategorieDoramaRegex.IsMatch(rName) || CategorieDoramaRegex.IsMatch(type))
{
return _categories.MapTrackerCatDescToNewznab("Dorama");

View File

@@ -37,11 +37,6 @@ namespace NzbDrone.Core.Indexers.Definitions
};
}
public override IParseIndexerResponse GetParser()
{
return new AvistaZParser();
}
protected override IndexerCapabilities SetCapabilities()
{
var caps = new IndexerCapabilities
@@ -81,9 +76,4 @@ namespace NzbDrone.Core.Indexers.Definitions
: $"{searchCriteria.EpisodeSearchString}";
}
}
public class AvistaZParser : AvistazParserBase
{
protected override string TimezoneOffset => "+01:00";
}
}

View File

@@ -15,6 +15,9 @@ namespace NzbDrone.Core.Indexers.Definitions.Avistaz
[JsonPropertyName("created_at")]
public string CreatedAt { get; set; }
[JsonPropertyName("created_at_iso")]
public string CreatedAtIso { get; set; }
[JsonPropertyName("file_name")]
public string FileName { get; set; }

View File

@@ -14,8 +14,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Avistaz
{
public class AvistazParserBase : IParseIndexerResponse
{
protected virtual string TimezoneOffset => "-04:00"; // Avistaz does not specify a timezone & returns server time
private readonly HashSet<string> _hdResolutions = new () { "1080p", "1080i", "720p" };
private readonly HashSet<string> _hdResolutions = new() { "1080p", "1080i", "720p" };
public Action<IDictionary<string, string>, DateTime?> CookiesUpdater { get; set; }
@@ -66,7 +65,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Avistaz
InfoUrl = details,
Guid = details,
Categories = cats,
PublishDate = DateTime.Parse($"{row.CreatedAt} {TimezoneOffset}", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal),
PublishDate = DateTime.Parse(row.CreatedAtIso, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal),
Size = row.FileSize,
Files = row.FileCount,
Grabs = row.Completed,

View File

@@ -17,7 +17,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Avistaz
public class AvistazSettings : NoAuthTorrentBaseSettings
{
private static readonly AvistazSettingsValidator Validator = new ();
private static readonly AvistazSettingsValidator Validator = new();
public AvistazSettings()
{

View File

@@ -234,7 +234,7 @@ namespace NzbDrone.Core.Indexers.Definitions
{
private readonly BakaBTSettings _settings;
private readonly IndexerCapabilitiesCategories _categories;
private readonly List<IndexerCategory> _defaultCategories = new () { NewznabStandardCategory.TVAnime };
private readonly List<IndexerCategory> _defaultCategories = new() { NewznabStandardCategory.TVAnime };
public BakaBTParser(BakaBTSettings settings, IndexerCapabilitiesCategories categories)
{

View File

@@ -255,6 +255,11 @@ namespace NzbDrone.Core.Indexers.Definitions
throw new IndexerException(indexerResponse, $"Unexpected response status {indexerHttpResponse.StatusCode} code from indexer request");
}
if (indexerHttpResponse.Headers.ContentType.Contains("text/html"))
{
throw new IndexerException(indexerResponse, $"Indexer responded with HTML content. {(indexerHttpResponse.Content.ContainsIgnoreCase("site maintenance") ? "Site is under maintenance." : "Site is likely blocked or unavailable.")}");
}
if (!indexerHttpResponse.Headers.ContentType.Contains(HttpAccept.Json.Value))
{
throw new IndexerException(indexerResponse, $"Unexpected response header {indexerHttpResponse.Headers.ContentType} from indexer request, expected {HttpAccept.Json.Value}");
@@ -355,7 +360,7 @@ namespace NzbDrone.Core.Indexers.Definitions
public class BeyondHDSettings : NoAuthTorrentBaseSettings
{
private static readonly BeyondHDSettingsValidator Validator = new ();
private static readonly BeyondHDSettingsValidator Validator = new();
public BeyondHDSettings()
{

View File

@@ -216,7 +216,7 @@ namespace NzbDrone.Core.Indexers.Definitions
public string BaseUrl { get; set; }
[FieldDefinition(2)]
public IndexerBaseSettings BaseSettings { get; set; } = new ();
public IndexerBaseSettings BaseSettings { get; set; } = new();
public NzbDroneValidationResult Validate()
{

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