Compare commits

...

306 Commits

Author SHA1 Message Date
Bogdan 5d1f79f3a3 Bump FluentMigrator to official 6.2.0
(cherry picked from commit de722539d098ba67a605cc369e55209667760692)
2025-10-30 09:42:29 -05:00
Bogdan 0ef9f4c869 Fix newznab redirect database migration
(cherry picked from commit f67bc52f85fa0677f4cda5b7b7dcb30dfe31468a)
2025-10-30 09:42:03 -05:00
bakerboy448 e4fb36e08f Bump to 2.3.0 2025-10-30 05:51:48 -05:00
Mark McDowall ff22fdf7d3 Set known networks to RFC 1918 ranges during startup
(cherry picked from commit d10107739b9ed6a50165e5dd1dfae15c7e8aea56)
2025-10-29 23:42:00 +00:00
Polgonite b3d46465ae Fixed: qBittorrent /login API success check 2025-10-29 17:59:58 -05:00
bakerboy448 eb57d20545 Bump to 2.2.0 2025-10-25 14:42:07 -05:00
bakerboy448 775b716c0f Fixed:(RuTracker) fix for Anime S01nd Episode N of N or N+N of N+N
Based on Jackett 5b712189fc55470dc94b56ea0d764e123e2dc432
2025-10-20 18:19:42 -05:00
bakerboy448 f7f3648dac Bump to 2.1.5 2025-10-13 19:42:22 -05:00
Bogdan c669048767 Bump System.Data.SQLite, MailKit, Microsoft.Data.SqlClient, Newtonsoft.Json and Polly
(cherry picked from commit 86282d621b3edcbf3582d6321de8be4172d37ed2)
2025-10-05 12:18:14 -05:00
Bogdan c282e4bef8 Pin System.Private.Uri to 4.3.2
(cherry picked from commit e0180e397d90db01e8cee0ee38419eb0b6bce989)
2025-10-05 12:18:14 -05:00
bakerboy448 574721bfb5 Bump to 2.1.4 2025-10-05 12:18:07 -05:00
bakerboy448 3c7575b58e fixup! Pin System.Drawing.Common to 8.0 (#2514) 2025-10-02 10:36:03 -05:00
Bogdan 93d8f81750 Fix code coverage on CI 2025-10-02 10:31:48 -05:00
Bogdan 364c7c9c7e Avoid rewriting file names in builds
Signed-off-by: bakerboy448 <55419169+bakerboy448@users.noreply.github.com>
2025-10-02 10:31:48 -05:00
Bogdan 54af7fd3d0 Bump coverlet.collector to official 6.0.4
Bump NUnit3TestAdapter to 5.1.0
Bump NunitXml.TestLogger to 3.1.20
2025-10-02 10:31:48 -05:00
bakerboy448 e6bc7fa062 Pin System.Drawing.Common to 8.0 (#2514) 2025-10-02 09:36:12 -05:00
bakerboy448 98608e75a6 Fixup theme selector App name 2025-10-01 10:21:22 -05:00
Bogdan 160320f3a2 Switch HttpProxySettingsProviderFixture to test cases
(cherry picked from commit 4e8fe6e81b1ac3f53135ad2e2b95d7aae811b87e)
2025-09-30 21:48:50 -05:00
Collin Heist c9baaf634e Fixed: Prevent modals from overflowing screen width
(cherry picked from commit 6c581b7e3c5c74db350d7ba2aad04f2df77c7671)
2025-09-30 21:46:34 -05:00
Stevie Robinson 8bf2f68abe New: Switch theme automatically on system change
(cherry picked from commit 4904e85887b8455483e509b83abaa2c6517d45a0)
2025-09-30 21:46:32 -05:00
Bogdan 9434091912 New: Retry SQLite writes for database is locked errors
(cherry picked from commit 2e1289b9248a70ce50bde52a66d3a589f3dcb8f5)
2025-09-30 21:46:28 -05:00
Zac Bowling 2f7d821d45 Fixed: (RevolutionTT) New Domain (#2511)
* RevolutionTT switched domains

* fixup!

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

---------

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

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

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

This reverts commit f67c672ec7.

Revert "Add exclusive only"

This reverts commit 80425f5ea4.

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

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

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

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

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

fixes #2431

* Fixed: Rename onToggleFilters to handleToggleFilters

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

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

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

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

* fix tests

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

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

This reverts commit fe198352a3.

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

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

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

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

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

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

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

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

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

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

ignore-downstream







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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Co-authored-by: Anonymous <noreply@weblate.org>
Co-authored-by: Ardenet <1213193613@qq.com>
Co-authored-by: GkhnGRBZ <gkhn.gurbuz@hotmail.com>
Co-authored-by: HUi <huynguyeexn@gmail.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Kuzmich <kuzmich55@gmail.com>
Co-authored-by: Moon55 <dylan.gurdak@protonmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: fordas <fordas15@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ru/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/tr/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/vi/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/
Translation: Servarr/Prowlarr
2024-11-02 21:13:55 +02:00
Bogdan 903a88c121 Update timezone offset for FL 2024-11-01 17:56:47 +02:00
Bogdan 9690ab6883 Fixed: (IPTorrents) Search IMDb ID in descriptions 2024-11-01 17:19:28 +02:00
Bogdan 1e1a2b3b4a Fixed: (BeyondHD) Enforce length for API and RSS keys 2024-11-01 12:59:11 +02:00
bakerboy448 9dc2d3669c Fixed: NzbIndex removed, API not supported 2024-10-31 09:31:25 +02:00
Bogdan 511c76e219 Update JetBrains logos 2024-10-29 10:06:00 +02:00
Bogdan 78329b7b92 Improve exception message for invalid torrent files 2024-10-28 17:35:17 +02:00
Bogdan 4240048853 Add Knaben as native indexer 2024-10-28 08:23:42 +02:00
Bogdan 432af42ffd Fixed indexer names for no definitions check 2024-10-27 16:04:17 +02:00
Weblate 0d6c03f8d4 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Ardenet <1213193613@qq.com>
Co-authored-by: fordas <fordas15@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/
Translation: Servarr/Prowlarr
2024-10-27 16:02:41 +02:00
Bogdan 96830f975e Cleaning paths for top level root folders
(cherry picked from commit a00121695715feb2cf8f04da246dc18262ab3237)
2024-10-27 15:12:00 +02:00
Mark McDowall 13c538ff58 Ignore extra spaces in path when not running on Windows
(cherry picked from commit 6d0f10b877912edef21232c64339cc6548d9690e)
2024-10-27 15:10:34 +02:00
Mark McDowall 14250e9634 Fixed getting parents from different OS paths
(cherry picked from commit e791f4b743d9660b0ad1decc4c5ed0e864f3b243)
2024-10-27 15:08:13 +02:00
Hadrien Patte e2f7890d76 Use OperatingSystem class to get OS information
(cherry picked from commit 135b5c2ddd8f0a274b0d59eb07f75aaf1446b9da)
2024-10-27 09:06:21 +02:00
Bogdan 257d38de66 Inherit trigger from pushed command models
(cherry picked from commit 0bc4903954b955fce0c368ef7fd2a6f3761d6a93)
2024-10-27 09:05:38 +02:00
Bogdan fd2a14e01b Fix settings fetching failure for updates 2024-10-27 09:01:07 +02:00
Bogdan b4d76c7138 Fixed: Initial state for qBittorrent v5.0
(cherry picked from commit ff724b7f4099284b8062f1625cf07b7822782edf)
2024-10-27 08:57:54 +02:00
Bogdan 9655f37fa8 Trim directory separators in GetRelativePath
(cherry picked from commit 240a0339bee7d407e564df6b6575a2ade6ac03cd)
2024-10-27 08:56:57 +02:00
Bogdan 246fb9b855 Update check returns error if build older than 180 days 2024-10-24 08:14:07 +03:00
Bogdan 25afadc9b2 Bump version to 1.26.0 2024-10-22 05:51:30 +03:00
Bogdan 3f547f0856 Cleanse exceptions in event logs 2024-10-20 13:39:43 +03:00
Bogdan 11e322b6d7 Bump version to 1.25.4 2024-10-20 08:05:32 +03:00
373 changed files with 8031 additions and 3925 deletions
+2 -2
View File
@@ -2,11 +2,11 @@
// README at: https://github.com/devcontainers/templates/tree/main/src/dotnet // README at: https://github.com/devcontainers/templates/tree/main/src/dotnet
{ {
"name": "Prowlarr", "name": "Prowlarr",
"image": "mcr.microsoft.com/devcontainers/dotnet:1-6.0", "image": "mcr.microsoft.com/devcontainers/dotnet:1-8.0",
"features": { "features": {
"ghcr.io/devcontainers/features/node:1": { "ghcr.io/devcontainers/features/node:1": {
"nodeGypDependencies": true, "nodeGypDependencies": true,
"version": "16", "version": "20",
"nvmVersion": "latest" "nvmVersion": "latest"
} }
}, },
+10 -3
View File
@@ -4,11 +4,18 @@ labels: ['Type: Bug', 'Status: Needs Triage']
body: body:
- type: checkboxes - type: checkboxes
attributes: 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. 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: options:
- label: I have searched the existing open and closed issues - label: I have searched the existing open and closed issues
required: true 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 - type: textarea
attributes: attributes:
label: Current Behavior label: Current Behavior
@@ -73,8 +80,8 @@ body:
required: true required: true
- type: checkboxes - type: checkboxes
attributes: 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` 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: 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 required: true
+1 -1
View File
@@ -10,7 +10,7 @@
"request": "launch", "request": "launch",
"preLaunchTask": "build dotnet", "preLaunchTask": "build dotnet",
// If you have changed target frameworks, make sure to update the program path. // 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": [], "args": [],
"cwd": "${workspaceFolder}", "cwd": "${workspaceFolder}",
// For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console // For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console
-33
View File
@@ -1,33 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="70px" height="70px" viewBox="0 0 70 70" style="enable-background:new 0 0 70 70;" xml:space="preserve">
<g>
<g>
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-1.3318" y1="43.7371" x2="67.0419" y2="26.0967">
<stop offset="0.1237" style="stop-color:#7866FF"/>
<stop offset="0.5376" style="stop-color:#FE2EB6"/>
<stop offset="0.8548" style="stop-color:#FD0486"/>
</linearGradient>
<polygon style="fill:url(#SVGID_1_);" points="67.3,16 43.7,0 0,31.1 11.1,70 58.9,60.3 "/>
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="45.9148" y1="38.9098" x2="67.6577" y2="9.0989">
<stop offset="0.1237" style="stop-color:#FF0080"/>
<stop offset="0.2587" style="stop-color:#FE0385"/>
<stop offset="0.4109" style="stop-color:#FA0C92"/>
<stop offset="0.5713" style="stop-color:#F41BA9"/>
<stop offset="0.7363" style="stop-color:#EB2FC8"/>
<stop offset="0.8656" style="stop-color:#E343E6"/>
</linearGradient>
<polygon style="fill:url(#SVGID_2_);" points="67.3,16 43.7,0 38,15.7 38,47.8 70,47.8 "/>
</g>
<g>
<rect x="13.4" y="13.4" style="fill:#000000;" width="43.2" height="43.2"/>
<rect x="17.4" y="48.5" style="fill:#FFFFFF;" width="16.2" height="2.7"/>
<g>
<path style="fill:#FFFFFF;" d="M17.4,19.1h6.9c5.6,0,9.5,3.8,9.5,8.9V28c0,5-3.9,8.9-9.5,8.9h-6.9V19.1z M21.4,22.7v10.7h3
c3.2,0,5.4-2.2,5.4-5.3V28c0-3.2-2.2-5.4-5.4-5.4H21.4z"/>
<polygon style="fill:#FFFFFF;" points="40.3,22.7 34.9,22.7 34.9,19.1 49.6,19.1 49.6,22.7 44.2,22.7 44.2,37 40.3,37 "/>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

-66
View File
@@ -1,66 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="120.1px" height="130.2px" viewBox="0 0 120.1 130.2" style="enable-background:new 0 0 120.1 130.2;" xml:space="preserve"
>
<g>
<linearGradient id="XMLID_2_" gradientUnits="userSpaceOnUse" x1="31.8412" y1="120.5578" x2="110.2402" y2="73.24">
<stop offset="0" style="stop-color:#FCEE39"/>
<stop offset="1" style="stop-color:#F37B3D"/>
</linearGradient>
<path id="XMLID_3041_" style="fill:url(#XMLID_2_);" d="M118.6,71.8c0.9-0.8,1.4-1.9,1.5-3.2c0.1-2.6-1.8-4.7-4.4-4.9
c-1.2-0.1-2.4,0.4-3.3,1.1l0,0l-83.8,45.9c-1.9,0.8-3.6,2.2-4.7,4.1c-2.9,4.8-1.3,11,3.6,13.9c3.4,2,7.5,1.8,10.7-0.2l0,0l0,0
c0.2-0.2,0.5-0.3,0.7-0.5l78-54.8C117.3,72.9,118.4,72.1,118.6,71.8L118.6,71.8L118.6,71.8z"/>
<linearGradient id="XMLID_3_" gradientUnits="userSpaceOnUse" x1="48.3607" y1="6.9083" x2="119.9179" y2="69.5546">
<stop offset="0" style="stop-color:#EF5A6B"/>
<stop offset="0.57" style="stop-color:#F26F4E"/>
<stop offset="1" style="stop-color:#F37B3D"/>
</linearGradient>
<path id="XMLID_3049_" style="fill:url(#XMLID_3_);" d="M118.8,65.1L118.8,65.1L55,2.5C53.6,1,51.6,0,49.3,0
c-4.3,0-7.7,3.5-7.7,7.7v0c0,2.1,0.8,3.9,2.1,5.3l0,0l0,0c0.4,0.4,0.8,0.7,1.2,1l67.4,57.7l0,0c0.8,0.7,1.8,1.2,3,1.3
c2.6,0.1,4.7-1.8,4.9-4.4C120.2,67.3,119.7,66,118.8,65.1z"/>
<linearGradient id="XMLID_4_" gradientUnits="userSpaceOnUse" x1="52.9467" y1="63.6407" x2="10.5379" y2="37.1562">
<stop offset="0" style="stop-color:#7C59A4"/>
<stop offset="0.3852" style="stop-color:#AF4C92"/>
<stop offset="0.7654" style="stop-color:#DC4183"/>
<stop offset="0.957" style="stop-color:#ED3D7D"/>
</linearGradient>
<path id="XMLID_3042_" style="fill:url(#XMLID_4_);" d="M57.1,59.5C57,59.5,17.7,28.5,16.9,28l0,0l0,0c-0.6-0.3-1.2-0.6-1.8-0.9
c-5.8-2.2-12.2,0.8-14.4,6.6c-1.9,5.1,0.2,10.7,4.6,13.4l0,0l0,0C6,47.5,6.6,47.8,7.3,48c0.4,0.2,45.4,18.8,45.4,18.8l0,0
c1.8,0.8,3.9,0.3,5.1-1.2C59.3,63.7,59,61,57.1,59.5z"/>
<linearGradient id="XMLID_5_" gradientUnits="userSpaceOnUse" x1="52.1736" y1="3.7019" x2="10.7706" y2="37.8971">
<stop offset="0" style="stop-color:#EF5A6B"/>
<stop offset="0.364" style="stop-color:#EE4E72"/>
<stop offset="1" style="stop-color:#ED3D7D"/>
</linearGradient>
<path id="XMLID_3057_" style="fill:url(#XMLID_5_);" d="M49.3,0c-1.7,0-3.3,0.6-4.6,1.5L4.9,28.3c-0.1,0.1-0.2,0.1-0.2,0.2l-0.1,0
l0,0c-1.7,1.2-3.1,3-3.9,5.1C-1.5,39.4,1.5,45.9,7.3,48c3.6,1.4,7.5,0.7,10.4-1.4l0,0l0,0c0.7-0.5,1.3-1,1.8-1.6l34.6-31.2l0,0
c1.8-1.4,3-3.6,3-6.1v0C57.1,3.5,53.6,0,49.3,0z"/>
<g id="XMLID_3008_">
<rect id="XMLID_3033_" x="34.6" y="37.4" style="fill:#000000;" width="51" height="51"/>
<rect id="XMLID_3032_" x="39" y="78.8" style="fill:#FFFFFF;" width="19.1" height="3.2"/>
<g id="XMLID_3009_">
<path id="XMLID_3030_" style="fill:#FFFFFF;" d="M38.8,50.8l1.5-1.4c0.4,0.5,0.8,0.8,1.3,0.8c0.6,0,0.9-0.4,0.9-1.2l0-5.3l2.3,0
l0,5.3c0,1-0.3,1.8-0.8,2.3c-0.5,0.5-1.3,0.8-2.3,0.8C40.2,52.2,39.4,51.6,38.8,50.8z"/>
<path id="XMLID_3028_" style="fill:#FFFFFF;" d="M45.3,43.8l6.7,0v1.9l-4.4,0V47l4,0l0,1.8l-4,0l0,1.3l4.5,0l0,2l-6.7,0
L45.3,43.8z"/>
<path id="XMLID_3026_" style="fill:#FFFFFF;" d="M55,45.8l-2.5,0l0-2l7.3,0l0,2l-2.5,0l0,6.3l-2.3,0L55,45.8z"/>
<path id="XMLID_3022_" style="fill:#FFFFFF;" d="M39,54l4.3,0c1,0,1.8,0.3,2.3,0.7c0.3,0.3,0.5,0.8,0.5,1.4v0
c0,1-0.5,1.5-1.3,1.9c1,0.3,1.6,0.9,1.6,2v0c0,1.4-1.2,2.3-3.1,2.3l-4.3,0L39,54z M43.8,56.6c0-0.5-0.4-0.7-1-0.7l-1.5,0l0,1.5
l1.4,0C43.4,57.3,43.8,57.1,43.8,56.6L43.8,56.6z M43,59l-1.8,0l0,1.5H43c0.7,0,1.1-0.3,1.1-0.8v0C44.1,59.2,43.7,59,43,59z"/>
<path id="XMLID_3019_" style="fill:#FFFFFF;" d="M46.8,54l3.9,0c1.3,0,2.1,0.3,2.7,0.9c0.5,0.5,0.7,1.1,0.7,1.9v0
c0,1.3-0.7,2.1-1.7,2.6l2,2.9l-2.6,0l-1.7-2.5h-1l0,2.5l-2.3,0L46.8,54z M50.6,58c0.8,0,1.2-0.4,1.2-1v0c0-0.7-0.5-1-1.2-1
l-1.5,0v2H50.6z"/>
<path id="XMLID_3016_" style="fill:#FFFFFF;" d="M56.8,54l2.2,0l3.5,8.4l-2.5,0l-0.6-1.5l-3.2,0l-0.6,1.5l-2.4,0L56.8,54z
M58.8,59l-0.9-2.3L57,59L58.8,59z"/>
<path id="XMLID_3014_" style="fill:#FFFFFF;" d="M62.8,54l2.3,0l0,8.3l-2.3,0L62.8,54z"/>
<path id="XMLID_3012_" style="fill:#FFFFFF;" d="M65.7,54l2.1,0l3.4,4.4l0-4.4l2.3,0l0,8.3l-2,0L68,57.8l0,4.6l-2.3,0L65.7,54z"
/>
<path id="XMLID_3010_" style="fill:#FFFFFF;" d="M73.7,61.1l1.3-1.5c0.8,0.7,1.7,1,2.7,1c0.6,0,1-0.2,1-0.6v0
c0-0.4-0.3-0.5-1.4-0.8c-1.8-0.4-3.1-0.9-3.1-2.6v0c0-1.5,1.2-2.7,3.2-2.7c1.4,0,2.5,0.4,3.4,1.1l-1.2,1.6
c-0.8-0.5-1.6-0.8-2.3-0.8c-0.6,0-0.8,0.2-0.8,0.5v0c0,0.4,0.3,0.5,1.4,0.8c1.9,0.4,3.1,1,3.1,2.6v0c0,1.7-1.3,2.7-3.4,2.7
C76.1,62.5,74.7,62,73.7,61.1z"/>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.8 KiB

-50
View File
@@ -1,50 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="70px" height="70px" viewBox="0 0 70 70" style="enable-background:new 0 0 70 70;" xml:space="preserve">
<g>
<g>
<g>
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="22.9451" y1="75.7869" x2="74.7868" y2="20.6415">
<stop offset="1.612903e-002" style="stop-color:#B35BA3"/>
<stop offset="0.4044" style="stop-color:#C41E57"/>
<stop offset="0.4677" style="stop-color:#C41E57"/>
<stop offset="0.6505" style="stop-color:#EB8523"/>
<stop offset="0.9516" style="stop-color:#FEBD11"/>
</linearGradient>
<polygon style="fill:url(#SVGID_1_);" points="49.8,15.2 36,36.7 58.4,70 70,23.1 "/>
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="17.7187" y1="73.2922" x2="69.5556" y2="18.1519">
<stop offset="1.612903e-002" style="stop-color:#B35BA3"/>
<stop offset="0.4044" style="stop-color:#C41E57"/>
<stop offset="0.4677" style="stop-color:#C41E57"/>
<stop offset="0.7043" style="stop-color:#EB8523"/>
</linearGradient>
<polygon style="fill:url(#SVGID_2_);" points="51.1,15.7 49,0 18.8,33.6 27.6,42.3 20.8,70 58.4,70 "/>
</g>
<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="1.8281" y1="53.4275" x2="48.8245" y2="9.2255">
<stop offset="1.612903e-002" style="stop-color:#B35BA3"/>
<stop offset="0.6613" style="stop-color:#C41E57"/>
</linearGradient>
<polygon style="fill:url(#SVGID_3_);" points="49,0 11.6,0 0,47.1 55.6,47.1 "/>
<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="49.8935" y1="-11.5569" x2="48.8588" y2="24.0352">
<stop offset="0.5" style="stop-color:#C41E57"/>
<stop offset="0.6668" style="stop-color:#D13F48"/>
<stop offset="0.7952" style="stop-color:#D94F39"/>
<stop offset="0.8656" style="stop-color:#DD5433"/>
</linearGradient>
<polygon style="fill:url(#SVGID_4_);" points="55.3,47.1 51.1,15.7 49,0 41.7,23 "/>
</g>
<g>
<rect x="13.4" y="13.5" transform="matrix(-1 2.577289e-003 -2.577289e-003 -1 70.0288 70.081)" style="fill:#000000;" width="43.2" height="43.2"/>
<rect x="17.6" y="48.6" transform="matrix(1 -2.577289e-003 2.577289e-003 1 -0.1287 6.634109e-002)" style="fill:#FFFFFF;" width="16.2" height="2.7"/>
<path style="fill:#FFFFFF;" d="M17.4,19.1l8.2,0c2.3,0,4,0.6,5.2,1.8c1,1,1.5,2.4,1.5,4.1l0,0.1c0,1.5-0.3,2.6-1.1,3.5
c-0.7,0.9-1.6,1.6-2.8,2l4.4,6.4l-4.6,0l-3.7-5.5l-3.3,0l0,5.5l-3.9,0L17.4,19.1z M25.3,27.8c1,0,1.7-0.2,2.2-0.7
c0.5-0.5,0.8-1.1,0.8-1.8l0-0.1c0-0.9-0.3-1.5-0.8-1.9c-0.5-0.4-1.3-0.6-2.3-0.6l-3.9,0l0,5.1L25.3,27.8z"/>
<path style="fill:#FFFFFF;" d="M36,33.2l-1.9,0l0-3.3l2.5,0l0.6-3.8l-2.3,0l0-3.3l2.8,0l0.6-3.7l3.4,0l-0.6,3.7l3.7,0l0.6-3.7
l3.4,0l-0.6,3.7l1.9,0l0,3.3l-2.5,0L47,29.9l2.3,0l0,3.3l-2.8,0L45.8,37l-3.4,0l0.7-3.8l-3.7,0L38.7,37l-3.4,0L36,33.2z
M43.7,29.9l0.6-3.8l-3.7,0L40,29.9L43.7,29.9z"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.1 KiB

-42
View File
@@ -1,42 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="70px" height="70px" viewBox="0 0 70 70" style="enable-background:new 0 0 70 70;" xml:space="preserve">
<defs>
<linearGradient id="linear-gradient" x1="70.22612" y1="27.79912" x2="-5.13024" y2="63.12242" gradientTransform="matrix(1, 0, 0, -1, 0, 71.27997)" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#c90f5e"/>
<stop offset="0.22111" stop-color="#c90f5e"/>
<stop offset="0.2356" stop-color="#c90f5e"/>
<stop offset="0.35559" stop-color="#ca135c"/>
<stop offset="0.46633" stop-color="#ce1e57"/>
<stop offset="0.5735" stop-color="#d4314e"/>
<stop offset="0.67844" stop-color="#dc4b41"/>
<stop offset="0.78179" stop-color="#e66d31"/>
<stop offset="0.88253" stop-color="#f3961d"/>
<stop offset="0.94241" stop-color="#fcb20f"/>
</linearGradient>
<linearGradient id="linear-gradient-2" x1="24.65904" y1="61.99608" x2="46.04762" y2="2.93445" gradientTransform="matrix(1, 0, 0, -1, 0, 71.27997)" gradientUnits="userSpaceOnUse">
<stop offset="0.04188" stop-color="#077cfb"/>
<stop offset="0.44503" stop-color="#c90f5e"/>
<stop offset="0.95812" stop-color="#077cfb"/>
</linearGradient>
<linearGradient id="linear-gradient-3" x1="17.39552" y1="63.34592" x2="33.19389" y2="7.20092" gradientTransform="matrix(1, 0, 0, -1, 0, 71.27997)" gradientUnits="userSpaceOnUse">
<stop offset="0.27749" stop-color="#c90f5e"/>
<stop offset="0.97382" stop-color="#fcb20f"/>
</linearGradient>
</defs>
<title>rider</title>
<g>
<polygon points="70 27.237 63.391 23.75 20.926 0 3.827 17.921 21.619 41.068 60.537 44.397 70 27.237" fill="url(#linear-gradient)"/>
<polygon points="50.423 16.132 44.271 1.107 27.643 17.471 11.768 50.194 49.411 70 70 57.98 50.423 16.132" fill="url(#linear-gradient-2)"/>
<polygon points="20.926 0 0 14.095 7.779 62.172 27.848 69.889 53.78 48.823 20.926 0" fill="url(#linear-gradient-3)"/>
</g>
<g>
<rect x="13.30219" y="13.19311" width="43.61371" height="43.61371"/>
<g>
<path d="M17.22741,18.86293h8.39564a7.38416,7.38416,0,0,1,5.34268,1.85358,5.86989,5.86989,0,0,1,1.52648,4.1433h0A5.74339,5.74339,0,0,1,28.567,30.5296l4.47041,6.54206H28.34891L24.42368,31.1838h-3.162v5.88785H17.22741V18.86293h0ZM25.296,27.69471c1.96262,0,3.053-1.09034,3.053-2.61682h0c0-1.74455-1.19938-2.61682-3.162-2.61682H21.15265v5.23365H25.296Z" fill="#fff"/>
<path d="M36.09034,18.86293H43.2866c5.77882,0,9.70405,3.92523,9.70405,9.15888h0c0,5.12461-3.92523,9.15888-9.70405,9.15888H36.09034V18.86293Zm4.03427,3.59813V33.47352h3.162a5.23727,5.23727,0,0,0,5.56075-5.45171h0a5.26493,5.26493,0,0,0-5.56075-5.56075h-3.162Z" fill="#fff"/>
</g>
<rect x="17.22741" y="48.62925" width="16.35514" height="2.72586" fill="#fff"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.0 KiB

-36
View File
@@ -1,36 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="70px" height="70px" viewBox="0 0 70 70" style="enable-background:new 0 0 70 70;" xml:space="preserve">
<g>
<g>
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="25.0676" y1="1.4599" x2="43.1829" y2="66.675">
<stop offset="0.2849" style="stop-color:#00CDD7"/>
<stop offset="0.9409" style="stop-color:#2086D7"/>
</linearGradient>
<polygon style="fill:url(#SVGID_1_);" points="9.4,63.3 0,7.3 17.5,0.1 28.6,6.7 38.8,1.2 60.1,9.4 48.1,70 "/>
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="30.7199" y1="9.7343" x2="61.365" y2="54.6713">
<stop offset="0.1398" style="stop-color:#FFF045"/>
<stop offset="0.3656" style="stop-color:#00CDD7"/>
</linearGradient>
<polygon style="fill:url(#SVGID_2_);" points="70,23.7 61,1.4 44.6,0 19.3,24.3 26.1,55.6 38.8,64.6 70,46 62.3,31.7 "/>
<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="61.0819" y1="15.2899" x2="65.1065" y2="29.5436">
<stop offset="0.2849" style="stop-color:#00CDD7"/>
<stop offset="0.9409" style="stop-color:#2086D7"/>
</linearGradient>
<polygon style="fill:url(#SVGID_3_);" points="56,20.4 62.3,31.7 70,23.7 64.4,9.8 "/>
</g>
<g>
<g>
<rect x="13.4" y="13.4" style="fill:#000000;" width="43.2" height="43.2"/>
<rect x="17.5" y="48.5" style="fill:#FFFFFF;" width="16.2" height="2.7"/>
<path style="fill:#FFFFFF;" d="M38.7,34.3l2.3-2.8c1.6,1.3,3.3,2.2,5.3,2.2c1.6,0,2.5-0.6,2.5-1.7v-0.1c0-1-0.6-1.5-3.6-2.3
c-3.6-0.9-5.8-1.9-5.8-5.5v-0.1c0-3.3,2.6-5.4,6.2-5.4c2.6,0,4.8,0.8,6.6,2.3l-2,3c-1.6-1.1-3.1-1.8-4.6-1.8
c-1.5,0-2.3,0.7-2.3,1.6v0.1c0,1.2,0.8,1.6,3.8,2.4c3.6,1,5.6,2.3,5.6,5.4v0.1c0,3.6-2.7,5.6-6.5,5.6
C43.5,37.2,40.8,36.2,38.7,34.3"/>
</g>
<polygon style="fill:#FFFFFF;" points="35.2,19 32.5,29.4 29.5,19 26.5,19 23.4,29.4 20.7,19 16.6,19 21.7,36.9 25,36.9 28,26.5
30.9,36.9 34.3,36.9 39.4,19 "/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.1 KiB

+6 -6
View File
@@ -68,16 +68,16 @@ Support this project by becoming a sponsor. Your logo will show up here with a l
## JetBrains ## JetBrains
Thank you to [<img src="/Logo/jetbrains.svg" alt="JetBrains" width="32"> JetBrains](http://www.jetbrains.com/) for providing us with free licenses to their great tools. Thank you to [<img src="https://resources.jetbrains.com/storage/products/company/brand/logos/jetbrains.png" alt="JetBrains" width="96">](http://www.jetbrains.com/) for providing us with free licenses to their great tools.
- [<img src="/Logo/resharper.svg" alt="ReSharper" width="32"> ReSharper](http://www.jetbrains.com/resharper/) * [<img src="https://resources.jetbrains.com/storage/products/company/brand/logos/ReSharper_icon.png" alt="ReSharper" width="32"> ReSharper](http://www.jetbrains.com/resharper/)
- [<img src="/Logo/webstorm.svg" alt="WebStorm" width="32"> WebStorm](http://www.jetbrains.com/webstorm/) * [<img src="https://resources.jetbrains.com/storage/products/company/brand/logos/WebStorm_icon.png" alt="WebStorm" width="32"> WebStorm](http://www.jetbrains.com/webstorm/)
- [<img src="/Logo/rider.svg" alt="Rider" width="32"> Rider](http://www.jetbrains.com/rider/) * [<img src="https://resources.jetbrains.com/storage/products/company/brand/logos/Rider_icon.png" alt="Rider" width="32"> Rider](http://www.jetbrains.com/rider/)
- [<img src="/Logo/dottrace.svg" alt="dotTrace" width="32"> dotTrace](http://www.jetbrains.com/dottrace/) * [<img src="https://resources.jetbrains.com/storage/products/company/brand/logos/dotTrace_icon.png" alt="dotTrace" width="32"> dotTrace](http://www.jetbrains.com/dottrace/)
### License ### License
- [GNU GPL v3](http://www.gnu.org/licenses/gpl.html) - [GNU GPL v3](http://www.gnu.org/licenses/gpl.html)
- Copyright 2010-2022 - Copyright 2010-2025
Icon Credit - [Box vector created by freepik - www.freepik.com](https://www.freepik.com/vectors/box) Icon Credit - [Box vector created by freepik - www.freepik.com](https://www.freepik.com/vectors/box)
+58 -81
View File
@@ -9,17 +9,17 @@ variables:
testsFolder: './_tests' testsFolder: './_tests'
yarnCacheFolder: $(Pipeline.Workspace)/.yarn yarnCacheFolder: $(Pipeline.Workspace)/.yarn
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
majorVersion: '1.25.3' majorVersion: '2.3.0'
minorVersion: $[counter('minorVersion', 1)] minorVersion: $[counter('minorVersion', 1)]
prowlarrVersion: '$(majorVersion).$(minorVersion)' prowlarrVersion: '$(majorVersion).$(minorVersion)'
buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)'
sentryOrg: 'servarr' sentryOrg: 'servarr'
sentryUrl: 'https://sentry.servarr.com' sentryUrl: 'https://sentry.servarr.com'
dotnetVersion: '6.0.427' dotnetVersion: '8.0.405'
nodeVersion: '20.X' nodeVersion: '20.X'
innoVersion: '6.2.2' innoVersion: '6.2.2'
windowsImage: 'windows-2022' windowsImage: 'windows-2022'
linuxImage: 'ubuntu-20.04' linuxImage: 'ubuntu-22.04'
macImage: 'macOS-13' macImage: 'macOS-13'
trigger: trigger:
@@ -106,7 +106,7 @@ stages:
echo "Extra platforms already enabled" echo "Extra platforms already enabled"
else else
echo "Enabling extra platform support" 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 fi
displayName: Enable Extra Platform Support displayName: Enable Extra Platform Support
- bash: ./build.sh --backend --enable-extra-platforms - bash: ./build.sh --backend --enable-extra-platforms
@@ -122,27 +122,23 @@ stages:
artifact: '$(osName)Backend' artifact: '$(osName)Backend'
displayName: Publish Backend displayName: Publish Backend
condition: and(succeeded(), eq(variables['osName'], 'Windows')) 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 artifact: win-x64-tests
displayName: Publish win-x64 Test Package displayName: Publish win-x64 Test Package
condition: and(succeeded(), eq(variables['osName'], 'Windows')) 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 artifact: linux-x64-tests
displayName: Publish linux-x64 Test Package displayName: Publish linux-x64 Test Package
condition: and(succeeded(), eq(variables['osName'], 'Windows')) condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- publish: '$(testsFolder)/net6.0/linux-x86/publish' - publish: '$(testsFolder)/net8.0/linux-musl-x64/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'
artifact: linux-musl-x64-tests artifact: linux-musl-x64-tests
displayName: Publish linux-musl-x64 Test Package displayName: Publish linux-musl-x64 Test Package
condition: and(succeeded(), eq(variables['osName'], 'Windows')) 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 artifact: freebsd-x64-tests
displayName: Publish freebsd-x64 Test Package displayName: Publish freebsd-x64 Test Package
condition: and(succeeded(), eq(variables['osName'], 'Windows')) 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 artifact: osx-x64-tests
displayName: Publish osx-x64 Test Package displayName: Publish osx-x64 Test Package
condition: and(succeeded(), eq(variables['osName'], 'Windows')) condition: and(succeeded(), eq(variables['osName'], 'Windows'))
@@ -189,7 +185,7 @@ stages:
artifact: '$(osName)Frontend' artifact: '$(osName)Frontend'
displayName: Publish Frontend displayName: Publish Frontend
condition: and(succeeded(), eq(variables['osName'], 'Windows')) condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- stage: Installer - stage: Installer
dependsOn: dependsOn:
- Build_Backend - Build_Backend
@@ -259,21 +255,21 @@ stages:
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).windows-core-x64.zip' archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).windows-core-x64.zip'
archiveType: 'zip' archiveType: 'zip'
includeRootFolder: false includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/win-x64/net6.0 rootFolderOrFile: $(artifactsFolder)/win-x64/net8.0
- task: ArchiveFiles@2 - task: ArchiveFiles@2
displayName: Create win-x86 zip displayName: Create win-x86 zip
inputs: inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).windows-core-x86.zip' archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).windows-core-x86.zip'
archiveType: 'zip' archiveType: 'zip'
includeRootFolder: false includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/win-x86/net6.0 rootFolderOrFile: $(artifactsFolder)/win-x86/net8.0
- task: ArchiveFiles@2 - task: ArchiveFiles@2
displayName: Create osx-x64 app displayName: Create osx-x64 app
inputs: inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).osx-app-core-x64.zip' archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).osx-app-core-x64.zip'
archiveType: 'zip' archiveType: 'zip'
includeRootFolder: false includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/osx-x64-app/net6.0 rootFolderOrFile: $(artifactsFolder)/osx-x64-app/net8.0
- task: ArchiveFiles@2 - task: ArchiveFiles@2
displayName: Create osx-x64 tar displayName: Create osx-x64 tar
inputs: inputs:
@@ -281,14 +277,14 @@ stages:
archiveType: 'tar' archiveType: 'tar'
tarCompression: 'gz' tarCompression: 'gz'
includeRootFolder: false includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/osx-x64/net6.0 rootFolderOrFile: $(artifactsFolder)/osx-x64/net8.0
- task: ArchiveFiles@2 - task: ArchiveFiles@2
displayName: Create osx-arm64 app displayName: Create osx-arm64 app
inputs: inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).osx-app-core-arm64.zip' archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).osx-app-core-arm64.zip'
archiveType: 'zip' archiveType: 'zip'
includeRootFolder: false includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/osx-arm64-app/net6.0 rootFolderOrFile: $(artifactsFolder)/osx-arm64-app/net8.0
- task: ArchiveFiles@2 - task: ArchiveFiles@2
displayName: Create osx-arm64 tar displayName: Create osx-arm64 tar
inputs: inputs:
@@ -296,7 +292,7 @@ stages:
archiveType: 'tar' archiveType: 'tar'
tarCompression: 'gz' tarCompression: 'gz'
includeRootFolder: false includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/osx-arm64/net6.0 rootFolderOrFile: $(artifactsFolder)/osx-arm64/net8.0
- task: ArchiveFiles@2 - task: ArchiveFiles@2
displayName: Create linux-x64 tar displayName: Create linux-x64 tar
inputs: inputs:
@@ -304,7 +300,7 @@ stages:
archiveType: 'tar' archiveType: 'tar'
tarCompression: 'gz' tarCompression: 'gz'
includeRootFolder: false includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-x64/net6.0 rootFolderOrFile: $(artifactsFolder)/linux-x64/net8.0
- task: ArchiveFiles@2 - task: ArchiveFiles@2
displayName: Create linux-musl-x64 tar displayName: Create linux-musl-x64 tar
inputs: inputs:
@@ -312,15 +308,7 @@ stages:
archiveType: 'tar' archiveType: 'tar'
tarCompression: 'gz' tarCompression: 'gz'
includeRootFolder: false includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-musl-x64/net6.0 rootFolderOrFile: $(artifactsFolder)/linux-musl-x64/net8.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
- task: ArchiveFiles@2 - task: ArchiveFiles@2
displayName: Create linux-arm tar displayName: Create linux-arm tar
inputs: inputs:
@@ -328,7 +316,7 @@ stages:
archiveType: 'tar' archiveType: 'tar'
tarCompression: 'gz' tarCompression: 'gz'
includeRootFolder: false includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-arm/net6.0 rootFolderOrFile: $(artifactsFolder)/linux-arm/net8.0
- task: ArchiveFiles@2 - task: ArchiveFiles@2
displayName: Create linux-musl-arm tar displayName: Create linux-musl-arm tar
inputs: inputs:
@@ -336,7 +324,7 @@ stages:
archiveType: 'tar' archiveType: 'tar'
tarCompression: 'gz' tarCompression: 'gz'
includeRootFolder: false includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-musl-arm/net6.0 rootFolderOrFile: $(artifactsFolder)/linux-musl-arm/net8.0
- task: ArchiveFiles@2 - task: ArchiveFiles@2
displayName: Create linux-arm64 tar displayName: Create linux-arm64 tar
inputs: inputs:
@@ -344,7 +332,7 @@ stages:
archiveType: 'tar' archiveType: 'tar'
tarCompression: 'gz' tarCompression: 'gz'
includeRootFolder: false includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-arm64/net6.0 rootFolderOrFile: $(artifactsFolder)/linux-arm64/net8.0
- task: ArchiveFiles@2 - task: ArchiveFiles@2
displayName: Create linux-musl-arm64 tar displayName: Create linux-musl-arm64 tar
inputs: inputs:
@@ -352,7 +340,7 @@ stages:
archiveType: 'tar' archiveType: 'tar'
tarCompression: 'gz' tarCompression: 'gz'
includeRootFolder: false includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-musl-arm64/net6.0 rootFolderOrFile: $(artifactsFolder)/linux-musl-arm64/net8.0
- task: ArchiveFiles@2 - task: ArchiveFiles@2
displayName: Create freebsd-x64 tar displayName: Create freebsd-x64 tar
inputs: inputs:
@@ -360,7 +348,7 @@ stages:
archiveType: 'tar' archiveType: 'tar'
tarCompression: 'gz' tarCompression: 'gz'
includeRootFolder: false includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/freebsd-x64/net6.0 rootFolderOrFile: $(artifactsFolder)/freebsd-x64/net8.0
- publish: $(Build.ArtifactStagingDirectory) - publish: $(Build.ArtifactStagingDirectory)
artifact: 'Packages' artifact: 'Packages'
displayName: Publish Packages displayName: Publish Packages
@@ -391,7 +379,7 @@ stages:
SENTRY_AUTH_TOKEN: $(sentryAuthTokenServarr) SENTRY_AUTH_TOKEN: $(sentryAuthTokenServarr)
SENTRY_ORG: $(sentryOrg) SENTRY_ORG: $(sentryOrg)
SENTRY_URL: $(sentryUrl) SENTRY_URL: $(sentryUrl)
- stage: Unit_Test - stage: Unit_Test
displayName: Unit Tests displayName: Unit Tests
dependsOn: Build_Backend dependsOn: Build_Backend
@@ -476,6 +464,7 @@ stages:
testResultsFiles: '**/TestResult.xml' testResultsFiles: '**/TestResult.xml'
testRunTitle: '$(testName) Unit Tests' testRunTitle: '$(testName) Unit Tests'
failTaskOnFailedTests: true failTaskOnFailedTests: true
failTaskOnMissingResultsFile: ne(variables['testName'], 'freebsd-x64')
- job: Unit_Docker - job: Unit_Docker
displayName: Unit Docker displayName: Unit Docker
@@ -487,29 +476,19 @@ stages:
testName: 'Musl Net Core' testName: 'Musl Net Core'
artifactName: linux-musl-x64-tests artifactName: linux-musl-x64-tests
containerImage: ghcr.io/servarr/testimages:alpine containerImage: ghcr.io/servarr/testimages:alpine
linux-x86:
testName: 'linux-x86'
artifactName: linux-x86-tests
containerImage: ghcr.io/servarr/testimages:linux-x86
pool: pool:
vmImage: ${{ variables.linuxImage }} vmImage: ${{ variables.linuxImage }}
container: $[ variables['containerImage'] ] container: $[ variables['containerImage'] ]
timeoutInMinutes: 10 timeoutInMinutes: 10
steps: steps:
- task: UseDotNet@2 - task: UseDotNet@2
displayName: 'Install .NET' displayName: 'Install .NET'
inputs: inputs:
version: $(dotnetVersion) 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 - checkout: none
- task: DownloadPipelineArtifact@2 - task: DownloadPipelineArtifact@2
displayName: Download Test Artifact displayName: Download Test Artifact
@@ -532,7 +511,8 @@ stages:
testResultsFiles: '**/TestResult.xml' testResultsFiles: '**/TestResult.xml'
testRunTitle: '$(testName) Unit Tests' testRunTitle: '$(testName) Unit Tests'
failTaskOnFailedTests: true failTaskOnFailedTests: true
failTaskOnMissingResultsFile: true
- job: Unit_LinuxCore_Postgres14 - job: Unit_LinuxCore_Postgres14
displayName: Unit Native LinuxCore with Postgres14 Database displayName: Unit Native LinuxCore with Postgres14 Database
dependsOn: Prepare dependsOn: Prepare
@@ -549,7 +529,7 @@ stages:
vmImage: ${{ variables.linuxImage }} vmImage: ${{ variables.linuxImage }}
timeoutInMinutes: 10 timeoutInMinutes: 10
steps: steps:
- task: UseDotNet@2 - task: UseDotNet@2
displayName: 'Install .net core' displayName: 'Install .net core'
@@ -585,6 +565,7 @@ stages:
testResultsFiles: '**/TestResult.xml' testResultsFiles: '**/TestResult.xml'
testRunTitle: 'LinuxCore Postgres14 Unit Tests' testRunTitle: 'LinuxCore Postgres14 Unit Tests'
failTaskOnFailedTests: true failTaskOnFailedTests: true
failTaskOnMissingResultsFile: true
- job: Unit_LinuxCore_Postgres15 - job: Unit_LinuxCore_Postgres15
displayName: Unit Native LinuxCore with Postgres15 Database displayName: Unit Native LinuxCore with Postgres15 Database
@@ -597,12 +578,12 @@ stages:
Prowlarr__Postgres__Port: '5432' Prowlarr__Postgres__Port: '5432'
Prowlarr__Postgres__User: 'prowlarr' Prowlarr__Postgres__User: 'prowlarr'
Prowlarr__Postgres__Password: 'prowlarr' Prowlarr__Postgres__Password: 'prowlarr'
pool: pool:
vmImage: ${{ variables.linuxImage }} vmImage: ${{ variables.linuxImage }}
timeoutInMinutes: 10 timeoutInMinutes: 10
steps: steps:
- task: UseDotNet@2 - task: UseDotNet@2
displayName: 'Install .net core' displayName: 'Install .net core'
@@ -638,6 +619,7 @@ stages:
testResultsFiles: '**/TestResult.xml' testResultsFiles: '**/TestResult.xml'
testRunTitle: 'LinuxCore Postgres15 Unit Tests' testRunTitle: 'LinuxCore Postgres15 Unit Tests'
failTaskOnFailedTests: true failTaskOnFailedTests: true
failTaskOnMissingResultsFile: true
- stage: Integration - stage: Integration
displayName: Integration displayName: Integration
@@ -681,7 +663,7 @@ stages:
pool: pool:
vmImage: $(imageName) vmImage: $(imageName)
steps: steps:
- task: UseDotNet@2 - task: UseDotNet@2
displayName: 'Install .net core' displayName: 'Install .net core'
@@ -703,7 +685,7 @@ stages:
targetPath: $(Build.ArtifactStagingDirectory) targetPath: $(Build.ArtifactStagingDirectory)
- task: ExtractFiles@1 - task: ExtractFiles@1
inputs: inputs:
archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)' archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)'
destinationFolder: '$(Build.ArtifactStagingDirectory)/bin' destinationFolder: '$(Build.ArtifactStagingDirectory)/bin'
displayName: Extract Package displayName: Extract Package
- bash: | - bash: |
@@ -720,6 +702,7 @@ stages:
testResultsFiles: '**/TestResult.xml' testResultsFiles: '**/TestResult.xml'
testRunTitle: '$(testName) Integration Tests' testRunTitle: '$(testName) Integration Tests'
failTaskOnFailedTests: true failTaskOnFailedTests: true
failTaskOnMissingResultsFile: true
displayName: Publish Test Results displayName: Publish Test Results
- job: Integration_LinuxCore_Postgres14 - job: Integration_LinuxCore_Postgres14
@@ -757,7 +740,7 @@ stages:
targetPath: $(Build.ArtifactStagingDirectory) targetPath: $(Build.ArtifactStagingDirectory)
- task: ExtractFiles@1 - task: ExtractFiles@1
inputs: inputs:
archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)' archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)'
destinationFolder: '$(Build.ArtifactStagingDirectory)/bin' destinationFolder: '$(Build.ArtifactStagingDirectory)/bin'
displayName: Extract Package displayName: Extract Package
- bash: | - bash: |
@@ -782,6 +765,7 @@ stages:
testResultsFiles: '**/TestResult.xml' testResultsFiles: '**/TestResult.xml'
testRunTitle: 'Integration LinuxCore Postgres14 Database Integration Tests' testRunTitle: 'Integration LinuxCore Postgres14 Database Integration Tests'
failTaskOnFailedTests: true failTaskOnFailedTests: true
failTaskOnMissingResultsFile: true
displayName: Publish Test Results displayName: Publish Test Results
@@ -820,7 +804,7 @@ stages:
targetPath: $(Build.ArtifactStagingDirectory) targetPath: $(Build.ArtifactStagingDirectory)
- task: ExtractFiles@1 - task: ExtractFiles@1
inputs: inputs:
archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)' archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)'
destinationFolder: '$(Build.ArtifactStagingDirectory)/bin' destinationFolder: '$(Build.ArtifactStagingDirectory)/bin'
displayName: Extract Package displayName: Extract Package
- bash: | - bash: |
@@ -845,6 +829,7 @@ stages:
testResultsFiles: '**/TestResult.xml' testResultsFiles: '**/TestResult.xml'
testRunTitle: 'Integration LinuxCore Postgres15 Database Integration Tests' testRunTitle: 'Integration LinuxCore Postgres15 Database Integration Tests'
failTaskOnFailedTests: true failTaskOnFailedTests: true
failTaskOnMissingResultsFile: true
displayName: Publish Test Results displayName: Publish Test Results
- job: Integration_FreeBSD - job: Integration_FreeBSD
@@ -891,6 +876,7 @@ stages:
testResultsFiles: '**/TestResult.xml' testResultsFiles: '**/TestResult.xml'
testRunTitle: 'FreeBSD Integration Tests' testRunTitle: 'FreeBSD Integration Tests'
failTaskOnFailedTests: true failTaskOnFailedTests: true
failTaskOnMissingResultsFile: false
displayName: Publish Test Results displayName: Publish Test Results
- job: Integration_Docker - job: Integration_Docker
@@ -904,29 +890,18 @@ stages:
artifactName: linux-musl-x64-tests artifactName: linux-musl-x64-tests
containerImage: ghcr.io/servarr/testimages:alpine containerImage: ghcr.io/servarr/testimages:alpine
pattern: 'Prowlarr.*.linux-musl-core-x64.tar.gz' 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: pool:
vmImage: ${{ variables.linuxImage }} vmImage: ${{ variables.linuxImage }}
container: $[ variables['containerImage'] ] container: $[ variables['containerImage'] ]
timeoutInMinutes: 15 timeoutInMinutes: 15
steps: steps:
- task: UseDotNet@2 - task: UseDotNet@2
displayName: 'Install .NET' displayName: 'Install .NET'
inputs: inputs:
version: $(dotnetVersion) 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 - checkout: none
- task: DownloadPipelineArtifact@2 - task: DownloadPipelineArtifact@2
displayName: Download Test Artifact displayName: Download Test Artifact
@@ -943,7 +918,7 @@ stages:
targetPath: $(Build.ArtifactStagingDirectory) targetPath: $(Build.ArtifactStagingDirectory)
- task: ExtractFiles@1 - task: ExtractFiles@1
inputs: inputs:
archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)' archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)'
destinationFolder: '$(Build.ArtifactStagingDirectory)/bin' destinationFolder: '$(Build.ArtifactStagingDirectory)/bin'
displayName: Extract Package displayName: Extract Package
- bash: | - bash: |
@@ -960,12 +935,13 @@ stages:
testResultsFiles: '**/TestResult.xml' testResultsFiles: '**/TestResult.xml'
testRunTitle: '$(testName) Integration Tests' testRunTitle: '$(testName) Integration Tests'
failTaskOnFailedTests: true failTaskOnFailedTests: true
failTaskOnMissingResultsFile: true
displayName: Publish Test Results displayName: Publish Test Results
- stage: Automation - stage: Automation
displayName: Automation displayName: Automation
dependsOn: Packages dependsOn: Packages
jobs: jobs:
- job: Automation - job: Automation
strategy: strategy:
@@ -991,7 +967,7 @@ stages:
pool: pool:
vmImage: $(imageName) vmImage: $(imageName)
steps: steps:
- task: UseDotNet@2 - task: UseDotNet@2
displayName: 'Install .net core' displayName: 'Install .net core'
@@ -1013,7 +989,7 @@ stages:
targetPath: $(Build.ArtifactStagingDirectory) targetPath: $(Build.ArtifactStagingDirectory)
- task: ExtractFiles@1 - task: ExtractFiles@1
inputs: inputs:
archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)' archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)'
destinationFolder: '$(Build.ArtifactStagingDirectory)/bin' destinationFolder: '$(Build.ArtifactStagingDirectory)/bin'
displayName: Extract Package displayName: Extract Package
- bash: | - bash: |
@@ -1041,6 +1017,7 @@ stages:
testResultsFiles: '**/TestResult.xml' testResultsFiles: '**/TestResult.xml'
testRunTitle: '$(osName) Automation Tests' testRunTitle: '$(osName) Automation Tests'
failTaskOnFailedTests: $(failBuild) failTaskOnFailedTests: $(failBuild)
failTaskOnMissingResultsFile: $(failBuild)
displayName: Publish Test Results displayName: Publish Test Results
- stage: Analyze - stage: Analyze
@@ -1116,7 +1093,7 @@ stages:
- checkout: self - checkout: self
submodules: true submodules: true
persistCredentials: true persistCredentials: true
fetchDepth: 1 fetchDepth: 1
- bash: ./docs.sh Windows - bash: ./docs.sh Windows
displayName: Create openapi.json displayName: Create openapi.json
- bash: | - bash: |
@@ -1169,34 +1146,35 @@ stages:
submodules: true submodules: true
- powershell: Set-Service SCardSvr -StartupType Manual - powershell: Set-Service SCardSvr -StartupType Manual
displayName: Enable Windows Test Service displayName: Enable Windows Test Service
- task: SonarCloudPrepare@2 - task: SonarCloudPrepare@3
condition: eq(variables['System.PullRequest.IsFork'], 'False') condition: eq(variables['System.PullRequest.IsFork'], 'False')
inputs: inputs:
SonarCloud: 'SonarCloud' SonarCloud: 'SonarCloud'
organization: 'prowlarr' organization: 'prowlarr'
scannerMode: 'MSBuild' scannerMode: 'dotnet'
projectKey: 'Prowlarr_Prowlarr' projectKey: 'Prowlarr_Prowlarr'
projectName: 'Prowlarr' projectName: 'Prowlarr'
projectVersion: '$(prowlarrVersion)' projectVersion: '$(prowlarrVersion)'
extraProperties: | extraProperties: |
sonar.exclusions=**/obj/**,**/*.dll,**/NzbDrone.Core.Test/Files/**/*,./frontend/**,**/ExternalModules/**,./src/Libraries/** sonar.exclusions=**/obj/**,**/*.dll,**/NzbDrone.Core.Test/Files/**/*,./frontend/**,**/ExternalModules/**,./src/Libraries/**
sonar.coverage.exclusions=**/Prowlarr.Api.V1/**/* 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 sonar.cs.nunit.reportsPaths=$(Build.SourcesDirectory)/TestResult.xml
- bash: | - bash: |
./build.sh --backend -f net6.0 -r win-x64 ./build.sh --backend -f net8.0 -r win-x64
TEST_DIR=_tests/net6.0/win-x64/publish/ ./test.sh Windows Unit Coverage TEST_DIR=_tests/net8.0/win-x64/publish/ ./test.sh Windows Unit Coverage
displayName: Coverage Unit Tests displayName: Coverage Unit Tests
- task: SonarCloudAnalyze@2 - task: SonarCloudAnalyze@3
condition: eq(variables['System.PullRequest.IsFork'], 'False') condition: eq(variables['System.PullRequest.IsFork'], 'False')
displayName: Publish SonarCloud Results displayName: Publish SonarCloud Results
- task: reportgenerator@5 - task: reportgenerator@5
displayName: Generate Coverage Report displayName: Generate Coverage Report
inputs: inputs:
reports: '$(Build.SourcesDirectory)/CoverageResults/**/coverage.opencover.xml' reports: '$(Build.SourcesDirectory)/CoverageResults/**/coverage.cobertura.xml'
targetdir: '$(Build.SourcesDirectory)/CoverageResults/combined' targetdir: '$(Build.SourcesDirectory)/CoverageResults/combined'
reporttypes: 'HtmlInline_AzurePipelines;Cobertura;Badges' reporttypes: 'HtmlInline_AzurePipelines;Cobertura;Badges'
publishCodeCoverageResults: true publishCodeCoverageResults: true
sourcedirs: src
- stage: Report_Out - stage: Report_Out
dependsOn: dependsOn:
@@ -1228,4 +1206,3 @@ stages:
DISCORDCHANNELID: $(discordChannelId) DISCORDCHANNELID: $(discordChannelId)
DISCORDWEBHOOKKEY: $(discordWebhookKey) DISCORDWEBHOOKKEY: $(discordWebhookKey)
DISCORDTHREADID: $(discordThreadId) DISCORDTHREADID: $(discordThreadId)
+25 -27
View File
@@ -33,14 +33,14 @@ EnableExtraPlatformsInSDK()
echo "Extra platforms already enabled" echo "Extra platforms already enabled"
else else
echo "Enabling extra platform support" 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 fi
} }
EnableExtraPlatforms() EnableExtraPlatforms()
{ {
if grep -qv freebsd-x64 src/Directory.Build.props; then 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 fi
} }
@@ -79,9 +79,9 @@ Build()
if [[ -z "$RID" || -z "$FRAMEWORK" ]]; if [[ -z "$RID" || -z "$FRAMEWORK" ]];
then 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 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 fi
ProgressEnd 'Build' ProgressEnd 'Build'
@@ -137,7 +137,7 @@ PackageLinux()
echo "Adding Prowlarr.Mono to UpdatePackage" echo "Adding Prowlarr.Mono to UpdatePackage"
cp $folder/Prowlarr.Mono.* $folder/Prowlarr.Update 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/Mono.Posix.NETStandard.* $folder/Prowlarr.Update
cp $folder/libMonoPosixHelper.* $folder/Prowlarr.Update cp $folder/libMonoPosixHelper.* $folder/Prowlarr.Update
fi fi
@@ -165,7 +165,7 @@ PackageMacOS()
echo "Adding Prowlarr.Mono to UpdatePackage" echo "Adding Prowlarr.Mono to UpdatePackage"
cp $folder/Prowlarr.Mono.* $folder/Prowlarr.Update 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/Mono.Posix.NETStandard.* $folder/Prowlarr.Update
cp $folder/libMonoPosixHelper.* $folder/Prowlarr.Update cp $folder/libMonoPosixHelper.* $folder/Prowlarr.Update
fi fi
@@ -377,15 +377,14 @@ then
Build Build
if [[ -z "$RID" || -z "$FRAMEWORK" ]]; if [[ -z "$RID" || -z "$FRAMEWORK" ]];
then then
PackageTests "net6.0" "win-x64" PackageTests "net8.0" "win-x64"
PackageTests "net6.0" "win-x86" PackageTests "net8.0" "win-x86"
PackageTests "net6.0" "linux-x64" PackageTests "net8.0" "linux-x64"
PackageTests "net6.0" "linux-musl-x64" PackageTests "net8.0" "linux-musl-x64"
PackageTests "net6.0" "osx-x64" PackageTests "net8.0" "osx-x64"
if [ "$ENABLE_EXTRA_PLATFORMS" = "YES" ]; if [ "$ENABLE_EXTRA_PLATFORMS" = "YES" ];
then then
PackageTests "net6.0" "freebsd-x64" PackageTests "net8.0" "freebsd-x64"
PackageTests "net6.0" "linux-x86"
fi fi
else else
PackageTests "$FRAMEWORK" "$RID" PackageTests "$FRAMEWORK" "$RID"
@@ -413,20 +412,19 @@ then
if [[ -z "$RID" || -z "$FRAMEWORK" ]]; if [[ -z "$RID" || -z "$FRAMEWORK" ]];
then then
Package "net6.0" "win-x64" Package "net8.0" "win-x64"
Package "net6.0" "win-x86" Package "net8.0" "win-x86"
Package "net6.0" "linux-x64" Package "net8.0" "linux-x64"
Package "net6.0" "linux-musl-x64" Package "net8.0" "linux-musl-x64"
Package "net6.0" "linux-arm64" Package "net8.0" "linux-arm64"
Package "net6.0" "linux-musl-arm64" Package "net8.0" "linux-musl-arm64"
Package "net6.0" "linux-arm" Package "net8.0" "linux-arm"
Package "net6.0" "linux-musl-arm" Package "net8.0" "linux-musl-arm"
Package "net6.0" "osx-x64" Package "net8.0" "osx-x64"
Package "net6.0" "osx-arm64" Package "net8.0" "osx-arm64"
if [ "$ENABLE_EXTRA_PLATFORMS" = "YES" ]; if [ "$ENABLE_EXTRA_PLATFORMS" = "YES" ];
then then
Package "net6.0" "freebsd-x64" Package "net8.0" "freebsd-x64"
Package "net6.0" "linux-x86"
fi fi
else else
Package "$FRAMEWORK" "$RID" Package "$FRAMEWORK" "$RID"
@@ -436,7 +434,7 @@ fi
if [ "$INSTALLER" = "YES" ]; if [ "$INSTALLER" = "YES" ];
then then
InstallInno InstallInno
BuildInstaller "net6.0" "win-x64" BuildInstaller "net8.0" "win-x64"
BuildInstaller "net6.0" "win-x86" BuildInstaller "net8.0" "win-x86"
RemoveInno RemoveInno
fi fi
+7 -6
View File
@@ -1,17 +1,18 @@
#!/bin/bash #!/bin/bash
set -e set -e
FRAMEWORK="net6.0" FRAMEWORK="net8.0"
PLATFORM=$1 PLATFORM=$1
ARCHITECTURE="${2:-x64}"
if [ "$PLATFORM" = "Windows" ]; then if [ "$PLATFORM" = "Windows" ]; then
RUNTIME="win-x64" RUNTIME="win-$ARCHITECTURE"
elif [ "$PLATFORM" = "Linux" ]; then elif [ "$PLATFORM" = "Linux" ]; then
RUNTIME="linux-x64" RUNTIME="linux-$ARCHITECTURE"
elif [ "$PLATFORM" = "Mac" ]; then elif [ "$PLATFORM" = "Mac" ]; then
RUNTIME="osx-x64" RUNTIME="osx-$ARCHITECTURE"
else else
echo "Platform must be provided as first arguement: Windows, Linux or Mac" echo "Platform must be provided as first argument: Windows, Linux or Mac"
exit 1 exit 1
fi fi
@@ -37,7 +38,7 @@ dotnet clean $slnFile -c Release
dotnet msbuild -restore $slnFile -p:Configuration=Debug -p:Platform=$platform -p:RuntimeIdentifiers=$RUNTIME -t:PublishAllRids dotnet msbuild -restore $slnFile -p:Configuration=Debug -p:Platform=$platform -p:RuntimeIdentifiers=$RUNTIME -t:PublishAllRids
dotnet new tool-manifest 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 & dotnet tool run swagger tofile --output ./src/Prowlarr.Api.V1/openapi.json "$outputFolder/$FRAMEWORK/$RUNTIME/$application" v1 &
+2 -1
View File
@@ -25,6 +25,7 @@ module.exports = (env) => {
const config = { const config = {
mode: isProduction ? 'production' : 'development', mode: isProduction ? 'production' : 'development',
devtool: isProduction ? 'source-map' : 'eval-source-map', devtool: isProduction ? 'source-map' : 'eval-source-map',
target: 'web',
stats: { stats: {
children: false children: false
@@ -169,7 +170,7 @@ module.exports = (env) => {
loose: true, loose: true,
debug: false, debug: false,
useBuiltIns: 'entry', useBuiltIns: 'entry',
corejs: 3 corejs: '3.42'
} }
] ]
] ]
@@ -20,6 +20,8 @@ import HintedSelectInputSelectedValue from './HintedSelectInputSelectedValue';
import TextInput from './TextInput'; import TextInput from './TextInput';
import styles from './EnhancedSelectInput.css'; import styles from './EnhancedSelectInput.css';
const MINIMUM_DISTANCE_FROM_EDGE = 10;
function isArrowKey(keyCode) { function isArrowKey(keyCode) {
return keyCode === keyCodes.UP_ARROW || keyCode === keyCodes.DOWN_ARROW; return keyCode === keyCodes.UP_ARROW || keyCode === keyCodes.DOWN_ARROW;
} }
@@ -137,18 +139,9 @@ class EnhancedSelectInput extends Component {
// Listeners // Listeners
onComputeMaxHeight = (data) => { onComputeMaxHeight = (data) => {
const {
top,
bottom
} = data.offsets.reference;
const windowHeight = window.innerHeight; const windowHeight = window.innerHeight;
if ((/^botton/).test(data.placement)) { data.styles.maxHeight = windowHeight - MINIMUM_DISTANCE_FROM_EDGE;
data.styles.maxHeight = windowHeight - bottom;
} else {
data.styles.maxHeight = top;
}
return data; return data;
}; };
@@ -460,6 +453,10 @@ class EnhancedSelectInput extends Component {
order: 851, order: 851,
enabled: true, enabled: true,
fn: this.onComputeMaxHeight fn: this.onComputeMaxHeight
},
preventOverflow: {
enabled: true,
boundariesElement: 'viewport'
} }
}} }}
> >
+1
View File
@@ -19,6 +19,7 @@
.modal { .modal {
position: relative; position: relative;
display: flex; display: flex;
max-width: 90%;
max-height: 90%; max-height: 90%;
border-radius: 6px; border-radius: 6px;
opacity: 1; opacity: 1;
@@ -24,6 +24,7 @@
composes: link; composes: link;
padding: 10px 24px; padding: 10px 24px;
padding-left: 35px;
} }
.isActiveLink { .isActiveLink {
@@ -41,10 +42,6 @@
text-align: center; text-align: center;
} }
.noIcon {
margin-left: 25px;
}
.status { .status {
float: right; float: right;
} }
@@ -8,7 +8,6 @@ interface CssExports {
'isActiveParentLink': string; 'isActiveParentLink': string;
'item': string; 'item': string;
'link': string; 'link': string;
'noIcon': string;
'status': string; 'status': string;
} }
export const cssExports: CssExports; export const cssExports: CssExports;
@@ -63,9 +63,7 @@ class PageSidebarItem extends Component {
</span> </span>
} }
<span className={isChildItem ? styles.noIcon : null}> {typeof title === 'function' ? title() : title}
{typeof title === 'function' ? title() : title}
</span>
{ {
!!StatusComponent && !!StatusComponent &&
@@ -22,11 +22,14 @@
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
overflow: hidden;
height: 24px; height: 24px;
} }
.label { .label {
padding: 0 3px; padding: 0 3px;
max-width: 100%;
max-height: 100%;
color: var(--toolbarLabelColor); color: var(--toolbarLabelColor);
font-size: $extraSmallFontSize; font-size: $extraSmallFontSize;
line-height: calc($extraSmallFontSize + 1px); line-height: calc($extraSmallFontSize + 1px);
@@ -23,6 +23,7 @@ function PageToolbarButton(props) {
isDisabled && styles.isDisabled isDisabled && styles.isDisabled
)} )}
isDisabled={isDisabled || isSpinning} isDisabled={isDisabled || isSpinning}
title={label}
{...otherProps} {...otherProps}
> >
<Icon <Icon
+15 -2
View File
@@ -65,17 +65,30 @@ class VirtualTable extends Component {
if (this._grid && scrollTop !== undefined && scrollTop !== 0 && !scrollRestored) { if (this._grid && scrollTop !== undefined && scrollTop !== 0 && !scrollRestored) {
this.setState({ scrollRestored: true }); this.setState({ scrollRestored: true });
this._grid.scrollToPosition({ scrollTop }); this._gridScrollToPosition({ scrollTop });
} }
if (scrollIndex != null && scrollIndex !== prevProps.scrollIndex) { if (scrollIndex != null && scrollIndex !== prevProps.scrollIndex) {
this._grid.scrollToCell({ this._gridScrollToCell({
rowIndex: scrollIndex, rowIndex: scrollIndex,
columnIndex: 0 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 // Control
+56
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];
};
+1
View File
@@ -257,6 +257,7 @@ class HistoryRow extends Component {
key={parameter.key} key={parameter.key}
title={parameter.title} title={parameter.title}
value={data[parameter.key]} value={data[parameter.key]}
queryType={data.queryType}
/> />
); );
} }
+10 -2
View File
@@ -1,14 +1,16 @@
import React from 'react'; import React from 'react';
import Link from 'Components/Link/Link'; import Link from 'Components/Link/Link';
import { HistoryQueryType } from 'typings/History';
import styles from './HistoryRowParameter.css'; import styles from './HistoryRowParameter.css';
interface HistoryRowParameterProps { interface HistoryRowParameterProps {
title: string; title: string;
value: string; value: string;
queryType: HistoryQueryType;
} }
function HistoryRowParameter(props: HistoryRowParameterProps) { function HistoryRowParameter(props: HistoryRowParameterProps) {
const { title, value } = props; const { title, value, queryType } = props;
const type = title.toLowerCase(); const type = title.toLowerCase();
@@ -18,7 +20,13 @@ function HistoryRowParameter(props: HistoryRowParameterProps) {
link = <Link to={`https://imdb.com/title/${value}/`}>{value}</Link>; link = <Link to={`https://imdb.com/title/${value}/`}>{value}</Link>;
} else if (type === 'tmdb') { } else if (type === 'tmdb') {
link = ( link = (
<Link to={`https://www.themoviedb.org/movie/${value}`}>{value}</Link> <Link
to={`https://www.themoviedb.org/${
queryType === 'tvsearch' ? 'tv' : 'movie'
}/${value}`}
>
{value}
</Link>
); );
} else if (type === 'tvdb') { } else if (type === 'tvdb') {
link = ( link = (
@@ -33,6 +33,7 @@
.scroller { .scroller {
flex: 1 1 auto; flex: 1 1 auto;
min-height: 400px;
} }
.filterRow { .filterRow {
@@ -57,29 +58,68 @@
font-weight: bold; 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) { @media only screen and (max-width: $breakpointSmall) {
.filterInput { .filterInput {
margin-bottom: 5px; margin-bottom: 8px;
} }
.alert { .notice {
display: none; display: none;
} }
.filtersToggle {
display: flex;
}
.filterRow { .filterRow {
display: block; display: block;
margin-bottom: 10px; margin-bottom: 10px;
padding: 10px;
border: 1px solid var(--borderColor);
border-radius: 4px;
background-color: var(--cardBackgroundColor);
}
.filterRowCollapsed {
display: none !important;
} }
.filterContainer { .filterContainer {
margin-right: 0; margin-right: 0;
margin-bottom: 5px; margin-bottom: 8px;
}
.filterContainer:last-child {
margin-bottom: 0;
} }
.scroller { .scroller {
margin-right: -30px; margin-right: -15px;
margin-bottom: -30px; margin-bottom: -15px;
margin-left: -30px; margin-left: -15px;
min-height: 300px;
}
.modalBody {
padding: 15px;
} }
} }
@@ -7,6 +7,8 @@ interface CssExports {
'filterInput': string; 'filterInput': string;
'filterLabel': string; 'filterLabel': string;
'filterRow': string; 'filterRow': string;
'filterRowCollapsed': string;
'filtersToggle': string;
'indexers': string; 'indexers': string;
'modalBody': string; 'modalBody': string;
'modalFooter': string; 'modalFooter': string;
@@ -1,3 +1,4 @@
import classNames from 'classnames';
import { some } from 'lodash'; import { some } from 'lodash';
import React, { useCallback, useEffect, useMemo, useState } from 'react'; import React, { useCallback, useEffect, useMemo, useState } from 'react';
import { useDispatch, useSelector } from 'react-redux'; import { useDispatch, useSelector } from 'react-redux';
@@ -7,6 +8,7 @@ import Alert from 'Components/Alert';
import EnhancedSelectInput from 'Components/Form/EnhancedSelectInput'; import EnhancedSelectInput from 'Components/Form/EnhancedSelectInput';
import NewznabCategorySelectInputConnector from 'Components/Form/NewznabCategorySelectInputConnector'; import NewznabCategorySelectInputConnector from 'Components/Form/NewznabCategorySelectInputConnector';
import TextInput from 'Components/Form/TextInput'; import TextInput from 'Components/Form/TextInput';
import Icon from 'Components/Icon';
import Button from 'Components/Link/Button'; import Button from 'Components/Link/Button';
import LoadingIndicator from 'Components/Loading/LoadingIndicator'; import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import ModalBody from 'Components/Modal/ModalBody'; import ModalBody from 'Components/Modal/ModalBody';
@@ -16,7 +18,7 @@ import ModalHeader from 'Components/Modal/ModalHeader';
import Scroller from 'Components/Scroller/Scroller'; import Scroller from 'Components/Scroller/Scroller';
import Table from 'Components/Table/Table'; import Table from 'Components/Table/Table';
import TableBody from 'Components/Table/TableBody'; 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 Indexer, { IndexerCategory } from 'Indexer/Indexer';
import { import {
fetchIndexerSchema, fetchIndexerSchema,
@@ -152,6 +154,7 @@ function AddIndexerModalContent(props: AddIndexerModalContentProps) {
const [filterLanguages, setFilterLanguages] = useState<string[]>([]); const [filterLanguages, setFilterLanguages] = useState<string[]>([]);
const [filterPrivacyLevels, setFilterPrivacyLevels] = useState<string[]>([]); const [filterPrivacyLevels, setFilterPrivacyLevels] = useState<string[]>([]);
const [filterCategories, setFilterCategories] = useState<number[]>([]); const [filterCategories, setFilterCategories] = useState<number[]>([]);
const [isFiltersCollapsed, setIsFiltersCollapsed] = useState(true);
useEffect( useEffect(
() => { () => {
@@ -196,6 +199,10 @@ function AddIndexerModalContent(props: AddIndexerModalContentProps) {
[setFilterCategories] [setFilterCategories]
); );
const handleToggleFilters = useCallback(() => {
setIsFiltersCollapsed(!isFiltersCollapsed);
}, [isFiltersCollapsed]);
const onIndexerSelect = useCallback( const onIndexerSelect = useCallback(
({ ({
implementation, implementation,
@@ -322,7 +329,17 @@ function AddIndexerModalContent(props: AddIndexerModalContentProps) {
onChange={onFilterChange} 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}> <div className={styles.filterContainer}>
<label className={styles.filterLabel}> <label className={styles.filterLabel}>
{translate('Protocol')} {translate('Protocol')}
@@ -68,6 +68,7 @@ function IndexerHistoryRow(props: IndexerHistoryRowProps) {
key={parameter.key} key={parameter.key}
title={parameter.title} title={parameter.title}
value={data[parameter.key as keyof HistoryData].toString()} value={data[parameter.key as keyof HistoryData].toString()}
queryType={data.queryType}
/> />
); );
})} })}
@@ -21,7 +21,7 @@ function createMapStateToProps() {
) => { ) => {
// If a release is deleted this selector may fire before the parent // 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 // we want to return early here and again in the render function to avoid
// trying to show a release that has no information available. // trying to show a release that has no information available.
@@ -30,7 +30,9 @@ export const authenticationMethodOptions = [
key: 'basic', key: 'basic',
get value() { get value() {
return translate('AuthBasic'); return translate('AuthBasic');
} },
isDisabled: true,
isHidden: true
}, },
{ {
key: 'forms', key: 'forms',
+1 -1
View File
@@ -419,7 +419,7 @@ export const reducers = createHandleActions({
const items = newState.items; const items = newState.items;
const index = items.findIndex((item) => item.guid === guid); 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) { if (index >= 0) {
const item = Object.assign({}, items[index], payload); const item = Object.assign({}, items[index], payload);
@@ -2,8 +2,8 @@ import { createSelector } from 'reselect';
import { isCommandExecuting } from 'Utilities/Command'; import { isCommandExecuting } from 'Utilities/Command';
import createCommandSelector from './createCommandSelector'; import createCommandSelector from './createCommandSelector';
function createCommandExecutingSelector(name: string, contraints = {}) { function createCommandExecutingSelector(name: string, constraints = {}) {
return createSelector(createCommandSelector(name, contraints), (command) => { return createSelector(createCommandSelector(name, constraints), (command) => {
return isCommandExecuting(command); return isCommandExecuting(command);
}); });
} }
@@ -2,9 +2,9 @@ import { createSelector } from 'reselect';
import { findCommand } from 'Utilities/Command'; import { findCommand } from 'Utilities/Command';
import createCommandsSelector from './createCommandsSelector'; import createCommandsSelector from './createCommandsSelector';
function createCommandSelector(name: string, contraints = {}) { function createCommandSelector(name: string, constraints = {}) {
return createSelector(createCommandsSelector(), (commands) => { return createSelector(createCommandsSelector(), (commands) => {
return findCommand(commands, { name, ...contraints }); return findCommand(commands, { name, ...constraints });
}); });
} }
+1 -1
View File
@@ -270,7 +270,7 @@ function Updates() {
{generalSettingsError ? ( {generalSettingsError ? (
<Alert kind={kinds.DANGER}> <Alert kind={kinds.DANGER}>
{translate('FailedToUpdateSettings')} {translate('FailedToFetchSettings')}
</Alert> </Alert>
) : null} ) : null}
+1 -1
View File
@@ -17,7 +17,7 @@ export async function fetchTranslations(): Promise<boolean> {
translations = data.Strings; translations = data.Strings;
resolve(true); resolve(true);
} catch (error) { } catch {
resolve(false); resolve(false);
} }
}); });
+8 -1
View File
@@ -1,5 +1,12 @@
import ModelBase from 'App/ModelBase'; import ModelBase from 'App/ModelBase';
export type HistoryQueryType =
| 'search'
| 'tvsearch'
| 'movie'
| 'book'
| 'music';
export interface HistoryData { export interface HistoryData {
source: string; source: string;
host: string; host: string;
@@ -7,7 +14,7 @@ export interface HistoryData {
offset: number; offset: number;
elapsedTime: number; elapsedTime: number;
query: string; query: string;
queryType: string; queryType: HistoryQueryType;
} }
interface History extends ModelBase { interface History extends ModelBase {
+5
View File
@@ -0,0 +1,5 @@
{
"sdk": {
"version": "8.0.405"
}
}
+19 -19
View File
@@ -23,17 +23,17 @@
"defaults" "defaults"
], ],
"dependencies": { "dependencies": {
"@fortawesome/fontawesome-free": "6.6.0", "@fortawesome/fontawesome-free": "6.7.2",
"@fortawesome/fontawesome-svg-core": "6.6.0", "@fortawesome/fontawesome-svg-core": "6.7.2",
"@fortawesome/free-regular-svg-icons": "6.6.0", "@fortawesome/free-regular-svg-icons": "6.7.2",
"@fortawesome/free-solid-svg-icons": "6.6.0", "@fortawesome/free-solid-svg-icons": "6.7.2",
"@fortawesome/react-fontawesome": "0.2.2", "@fortawesome/react-fontawesome": "0.2.2",
"@juggle/resize-observer": "3.4.0", "@juggle/resize-observer": "3.4.0",
"@microsoft/signalr": "6.0.25", "@microsoft/signalr": "8.0.7",
"@sentry/browser": "7.119.1", "@sentry/browser": "7.119.1",
"@sentry/integrations": "7.119.1", "@sentry/integrations": "7.119.1",
"@types/node": "20.16.11", "@types/node": "20.16.11",
"@types/react": "18.2.79", "@types/react": "18.3.21",
"@types/react-dom": "18.2.25", "@types/react-dom": "18.2.25",
"chart.js": "4.4.4", "chart.js": "4.4.4",
"classnames": "2.5.1", "classnames": "2.5.1",
@@ -71,9 +71,9 @@
"react-router-dom": "5.2.0", "react-router-dom": "5.2.0",
"react-tabs": "4.3.0", "react-tabs": "4.3.0",
"react-text-truncate": "0.19.0", "react-text-truncate": "0.19.0",
"react-use-measure": "2.1.1", "react-use-measure": "2.1.7",
"react-virtualized": "9.21.1", "react-virtualized": "9.22.6",
"react-window": "1.8.10", "react-window": "1.8.11",
"redux": "4.2.1", "redux": "4.2.1",
"redux-actions": "2.6.5", "redux-actions": "2.6.5",
"redux-batched-actions": "0.5.0", "redux-batched-actions": "0.5.0",
@@ -81,30 +81,30 @@
"redux-thunk": "2.4.2", "redux-thunk": "2.4.2",
"reselect": "4.1.8", "reselect": "4.1.8",
"stacktrace-js": "2.0.2", "stacktrace-js": "2.0.2",
"typescript": "5.1.6" "typescript": "5.7.2"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "7.25.8", "@babel/core": "7.27.1",
"@babel/eslint-parser": "7.25.8", "@babel/eslint-parser": "7.27.1",
"@babel/plugin-proposal-export-default-from": "7.25.8", "@babel/plugin-proposal-export-default-from": "7.27.1",
"@babel/plugin-syntax-dynamic-import": "7.8.3", "@babel/plugin-syntax-dynamic-import": "7.8.3",
"@babel/preset-env": "7.25.8", "@babel/preset-env": "7.27.2",
"@babel/preset-react": "7.25.7", "@babel/preset-react": "7.27.1",
"@babel/preset-typescript": "7.25.7", "@babel/preset-typescript": "7.27.1",
"@types/lodash": "4.14.195", "@types/lodash": "4.14.195",
"@types/react-document-title": "2.0.10", "@types/react-document-title": "2.0.10",
"@types/react-router-dom": "5.3.3", "@types/react-router-dom": "5.3.3",
"@types/react-text-truncate": "0.19.0", "@types/react-text-truncate": "0.19.0",
"@types/react-window": "1.8.8", "@types/react-window": "1.8.8",
"@types/webpack-livereload-plugin": "2.3.6", "@types/webpack-livereload-plugin": "2.3.6",
"@typescript-eslint/eslint-plugin": "6.21.0", "@typescript-eslint/eslint-plugin": "8.18.1",
"@typescript-eslint/parser": "6.21.0", "@typescript-eslint/parser": "8.18.1",
"are-you-es5": "2.1.2", "are-you-es5": "2.1.2",
"autoprefixer": "10.4.20", "autoprefixer": "10.4.20",
"babel-loader": "9.2.1", "babel-loader": "9.2.1",
"babel-plugin-inline-classnames": "2.0.1", "babel-plugin-inline-classnames": "2.0.1",
"babel-plugin-transform-react-remove-prop-types": "0.4.24", "babel-plugin-transform-react-remove-prop-types": "0.4.24",
"core-js": "3.38.1", "core-js": "3.42.0",
"css-loader": "6.7.3", "css-loader": "6.7.3",
"css-modules-typescript-loader": "4.0.1", "css-modules-typescript-loader": "4.0.1",
"eslint": "8.57.1", "eslint": "8.57.1",
+7 -17
View File
@@ -84,7 +84,7 @@
<Deterministic Condition="$(AssemblyVersion.EndsWith('*'))">False</Deterministic> <Deterministic Condition="$(AssemblyVersion.EndsWith('*'))">False</Deterministic>
<PathMap>$(MSBuildProjectDirectory)=./$(MSBuildProjectName)/</PathMap> <PathMap>$(MSBuildThisFileDirectory)=./</PathMap>
</PropertyGroup> </PropertyGroup>
<!-- Set the AssemblyConfiguration attribute for projects --> <!-- Set the AssemblyConfiguration attribute for projects -->
@@ -99,13 +99,6 @@
<RootNamespace Condition="'$(ProwlarrProject)'=='true'">$(MSBuildProjectName.Replace('Prowlarr','NzbDrone'))</RootNamespace> <RootNamespace Condition="'$(ProwlarrProject)'=='true'">$(MSBuildProjectName.Replace('Prowlarr','NzbDrone'))</RootNamespace>
</PropertyGroup> </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 --> <!-- Sentry specific configuration: Only in Release mode -->
<PropertyGroup Condition="'$(Configuration)' == 'Release'"> <PropertyGroup Condition="'$(Configuration)' == 'Release'">
<!-- https://docs.sentry.io/platforms/dotnet/configuration/msbuild/ --> <!-- https://docs.sentry.io/platforms/dotnet/configuration/msbuild/ -->
@@ -130,14 +123,11 @@
<!-- Standard testing packages --> <!-- Standard testing packages -->
<ItemGroup Condition="'$(TestProject)'=='true'"> <ItemGroup Condition="'$(TestProject)'=='true'">
<PackageReference Include="coverlet.collector" Version="6.0.4" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.10.0" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.10.0" />
<PackageReference Include="NUnit" Version="3.14.0" /> <PackageReference Include="NUnit" Version="3.14.0" />
<PackageReference Include="NUnit3TestAdapter" Version="4.2.1" /> <PackageReference Include="NUnit3TestAdapter" Version="5.1.0" />
<PackageReference Include="NunitXml.TestLogger" Version="3.0.131" /> <PackageReference Include="NunitXml.TestLogger" Version="3.1.20" />
</ItemGroup>
<ItemGroup Condition="'$(TestProject)'=='true' and '$(TargetFramework)'=='net6.0'">
<PackageReference Include="coverlet.collector" Version="3.0.4-preview.27.ge7cb7c3b40" />
</ItemGroup> </ItemGroup>
<PropertyGroup Condition="'$(ProwlarrProject)'=='true' and '$(EnableAnalyzers)'=='false'"> <PropertyGroup Condition="'$(ProwlarrProject)'=='true' and '$(EnableAnalyzers)'=='false'">
@@ -148,9 +138,9 @@
<!-- Set up stylecop --> <!-- Set up stylecop -->
<ItemGroup Condition="'$(ProwlarrProject)'=='true' and '$(EnableAnalyzers)'!='false'"> <ItemGroup Condition="'$(ProwlarrProject)'=='true' and '$(EnableAnalyzers)'!='false'">
<!-- StyleCop analysis --> <!-- StyleCop analysis -->
<PackageReference Include="StyleCop.Analyzers" Version="1.1.118"> <PackageReference Include="StyleCop.Analyzers.Unstable" Version="1.2.0.556">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<AdditionalFiles Include="$(SolutionDir)stylecop.json" /> <AdditionalFiles Include="$(SolutionDir)stylecop.json" />
</ItemGroup> </ItemGroup>
@@ -221,7 +211,7 @@
<PropertyGroup Condition="'$(IsOSX)' == 'true' and <PropertyGroup Condition="'$(IsOSX)' == 'true' and
'$(RuntimeIdentifier)' == ''"> '$(RuntimeIdentifier)' == ''">
<_UsingDefaultRuntimeIdentifier>true</_UsingDefaultRuntimeIdentifier> <_UsingDefaultRuntimeIdentifier>true</_UsingDefaultRuntimeIdentifier>
<RuntimeIdentifier>osx-x64</RuntimeIdentifier> <RuntimeIdentifier>osx-$(Architecture)</RuntimeIdentifier>
</PropertyGroup> </PropertyGroup>
</Project> </Project>
-3
View File
@@ -5,8 +5,5 @@
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" /> <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="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="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> </packageSources>
</configuration> </configuration>
@@ -39,15 +39,16 @@ namespace NzbDrone.Automation.Test
var service = ChromeDriverService.CreateDefaultService(); var service = ChromeDriverService.CreateDefaultService();
// Timeout as windows automation tests seem to take alot longer to get going // 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.Size = new System.Drawing.Size(1920, 1080);
driver.Manage().Window.FullScreen();
_runner = new NzbDroneRunner(LogManager.GetCurrentClassLogger(), null); _runner = new NzbDroneRunner(LogManager.GetCurrentClassLogger(), null);
_runner.KillAll(); _runner.KillAll();
_runner.Start(true); _runner.Start(true);
driver.Url = "http://localhost:9696"; driver.Navigate().GoToUrl("http://localhost:9696");
var page = new PageBase(driver); var page = new PageBase(driver);
page.WaitForNoSpinner(); page.WaitForNoSpinner();
@@ -67,7 +68,7 @@ namespace NzbDrone.Automation.Test
{ {
try try
{ {
var image = ((ITakesScreenshot)driver).GetScreenshot(); var image = (driver as ITakesScreenshot).GetScreenshot();
image.SaveAsFile($"./{name}_test_screenshot.png", ScreenshotImageFormat.Png); image.SaveAsFile($"./{name}_test_screenshot.png", ScreenshotImageFormat.Png);
} }
catch (Exception ex) catch (Exception ex)
@@ -7,12 +7,11 @@ namespace NzbDrone.Automation.Test.PageModel
{ {
public class PageBase public class PageBase
{ {
private readonly WebDriver _driver; private readonly IWebDriver _driver;
public PageBase(WebDriver driver) public PageBase(IWebDriver driver)
{ {
_driver = driver; _driver = driver;
driver.Manage().Window.Maximize();
} }
public IWebElement FindByClass(string className, int timeout = 5) public IWebElement FindByClass(string className, int timeout = 5)
@@ -1,10 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>net6.0</TargetFrameworks> <TargetFrameworks>net8.0</TargetFrameworks>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Selenium.Support" Version="4.1.0" /> <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>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\NzbDrone.Test.Common\Prowlarr.Test.Common.csproj" /> <ProjectReference Include="..\NzbDrone.Test.Common\Prowlarr.Test.Common.csproj" />
@@ -10,13 +10,13 @@ namespace NzbDrone.Common.Test.EnvironmentInfo
[Test] [Test]
public void should_return_version() public void should_return_version()
{ {
BuildInfo.Version.Major.Should().BeOneOf(0, 1, 10); BuildInfo.Version.Major.Should().BeOneOf(0, 2, 10);
} }
[Test] [Test]
public void should_get_branch() public void should_get_branch()
{ {
BuildInfo.Branch.Should().NotBe("unknow"); BuildInfo.Branch.Should().NotBe("unknown");
BuildInfo.Branch.Should().NotBeNullOrWhiteSpace(); BuildInfo.Branch.Should().NotBeNullOrWhiteSpace();
} }
} }
@@ -21,9 +21,28 @@ namespace NzbDrone.Common.Test.ExtensionTests
[TestCase("1.2.3.4")] [TestCase("1.2.3.4")]
[TestCase("172.55.0.1")] [TestCase("172.55.0.1")]
[TestCase("192.55.0.1")] [TestCase("192.55.0.1")]
[TestCase("100.64.0.1")]
[TestCase("100.127.255.254")]
public void should_return_false_for_public_ip_address(string ipAddress) public void should_return_false_for_public_ip_address(string ipAddress)
{ {
IPAddress.Parse(ipAddress).IsLocalAddress().Should().BeFalse(); IPAddress.Parse(ipAddress).IsLocalAddress().Should().BeFalse();
} }
[TestCase("100.64.0.1")]
[TestCase("100.127.255.254")]
[TestCase("100.100.100.100")]
public void should_return_true_for_cgnat_ip_address(string ipAddress)
{
IPAddress.Parse(ipAddress).IsCgnatIpAddress().Should().BeTrue();
}
[TestCase("1.2.3.4")]
[TestCase("192.168.5.1")]
[TestCase("100.63.255.255")]
[TestCase("100.128.0.0")]
public void should_return_false_for_non_cgnat_ip_address(string ipAddress)
{
IPAddress.Parse(ipAddress).IsCgnatIpAddress().Should().BeFalse();
}
} }
} }
@@ -35,7 +35,7 @@ namespace NzbDrone.Common.Test.Http
private string _httpBinHost; private string _httpBinHost;
private string _httpBinHost2; private string _httpBinHost2;
private System.Net.Http.HttpClient _httpClient = new (); private System.Net.Http.HttpClient _httpClient = new();
[OneTimeSetUp] [OneTimeSetUp]
public void FixtureSetUp() public void FixtureSetUp()
@@ -16,6 +16,8 @@ namespace NzbDrone.Common.Test.Http
[TestCase("Readarr/1.0.0.2300 (ubuntu 20.04)", "Readarr")] [TestCase("Readarr/1.0.0.2300 (ubuntu 20.04)", "Readarr")]
[TestCase("Sonarr/3.0.6.9999 (ubuntu 20.04)", "Sonarr")] [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("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) public void should_parse_user_agent(string userAgent, string parsedAgent)
{ {
UserAgentParser.ParseSource(userAgent).Should().Be(parsedAgent); UserAgentParser.ParseSource(userAgent).Should().Be(parsedAgent);
@@ -30,6 +30,7 @@ namespace NzbDrone.Common.Test.InstrumentationTests
[TestCase(@"https://anthelion.me/api.php?api_key=2b51db35e1910123321025a12b9933d2&o=json&t=movie&q=&tmdb=&imdb=&cat=&limit=100&offset=0")] [TestCase(@"https://anthelion.me/api.php?api_key=2b51db35e1910123321025a12b9933d2&o=json&t=movie&q=&tmdb=&imdb=&cat=&limit=100&offset=0")]
[TestCase(@"https://avistaz.to/api/v1/jackett/auth: username=mySecret&password=mySecret&pid=mySecret")] [TestCase(@"https://avistaz.to/api/v1/jackett/auth: username=mySecret&password=mySecret&pid=mySecret")]
[TestCase(@"https://www.sharewood.tv/api/2b51db35e1910123321025a12b9933d2/last-torrents")] [TestCase(@"https://www.sharewood.tv/api/2b51db35e1910123321025a12b9933d2/last-torrents")]
[TestCase(@"https://example.org/rss/torrents?rsskey=2b51db35e1910123321025a12b9933d2&search=")]
// Indexer and Download Client Responses // Indexer and Download Client Responses
@@ -133,11 +133,16 @@ namespace NzbDrone.Common.Test
[TestCase(@"C:\test\", @"C:\Test\mydir")] [TestCase(@"C:\test\", @"C:\Test\mydir")]
[TestCase(@"C:\test", @"C:\Test\mydir\")] [TestCase(@"C:\test", @"C:\Test\mydir\")]
public void path_should_be_parent_on_windows_only(string parentPath, string childPath) public void windows_path_should_be_parent(string parentPath, string childPath)
{ {
var expectedResult = OsInfo.IsWindows; parentPath.IsParentPath(childPath).Should().Be(true);
}
parentPath.IsParentPath(childPath).Should().Be(expectedResult); [TestCase("/test", "/test/mydir/")]
[TestCase("/test/", "/test/mydir")]
public void posix_path_should_be_parent(string parentPath, string childPath)
{
parentPath.IsParentPath(childPath).Should().Be(true);
} }
[TestCase(@"C:\Test\mydir", @"C:\Test")] [TestCase(@"C:\Test\mydir", @"C:\Test")]
@@ -145,20 +150,57 @@ namespace NzbDrone.Common.Test
[TestCase(@"C:\", null)] [TestCase(@"C:\", null)]
[TestCase(@"\\server\share", null)] [TestCase(@"\\server\share", null)]
[TestCase(@"\\server\share\test", @"\\server\share")] [TestCase(@"\\server\share\test", @"\\server\share")]
public void path_should_return_parent_windows(string path, string parentPath) public void windows_path_should_return_parent(string path, string parentPath)
{ {
WindowsOnly();
path.GetParentPath().Should().Be(parentPath); path.GetParentPath().Should().Be(parentPath);
} }
[TestCase(@"/", null)] [TestCase(@"/", null)]
[TestCase(@"/test", "/")] [TestCase(@"/test", "/")]
public void path_should_return_parent_mono(string path, string parentPath) [TestCase(@"/test/tv", "/test")]
public void unix_path_should_return_parent(string path, string parentPath)
{ {
PosixOnly();
path.GetParentPath().Should().Be(parentPath); path.GetParentPath().Should().Be(parentPath);
} }
[TestCase(@"C:\Test\mydir", "Test")]
[TestCase(@"C:\Test\", @"C:\")]
[TestCase(@"C:\Test", @"C:\")]
[TestCase(@"C:\", null)]
[TestCase(@"\\server\share", null)]
[TestCase(@"\\server\share\test", @"\\server\share")]
public void path_should_return_parent_name_windows(string path, string parentPath)
{
path.GetParentName().Should().Be(parentPath);
}
[TestCase(@"/", null)]
[TestCase(@"/test", "/")]
[TestCase(@"/test/tv", "test")]
public void path_should_return_parent_name_mono(string path, string parentPath)
{
path.GetParentName().Should().Be(parentPath);
}
[TestCase(@"C:\Test\mydir", "mydir")]
[TestCase(@"C:\Test\", "Test")]
[TestCase(@"C:\Test", "Test")]
[TestCase(@"C:\", "C:\\")]
[TestCase(@"\\server\share", @"\\server\share")]
[TestCase(@"\\server\share\test", "test")]
public void path_should_return_directory_name_windows(string path, string parentPath)
{
path.GetDirectoryName().Should().Be(parentPath);
}
[TestCase(@"/", "/")]
[TestCase(@"/test", "test")]
[TestCase(@"/test/tv", "tv")]
public void path_should_return_directory_name_mono(string path, string parentPath)
{
path.GetDirectoryName().Should().Be(parentPath);
}
[Test] [Test]
public void path_should_return_parent_for_oversized_path() public void path_should_return_parent_for_oversized_path()
{ {
@@ -166,7 +208,7 @@ namespace NzbDrone.Common.Test
// This test will fail on Windows if long path support is not enabled: https://www.howtogeek.com/266621/how-to-make-windows-10-accept-file-paths-over-260-characters/ // This test will fail on Windows if long path support is not enabled: https://www.howtogeek.com/266621/how-to-make-windows-10-accept-file-paths-over-260-characters/
// It will also fail if the app isn't configured to use long path (such as resharper): https://blogs.msdn.microsoft.com/jeremykuhne/2016/07/30/net-4-6-2-and-long-paths-on-windows-10/ // It will also fail if the app isn't configured to use long path (such as resharper): https://blogs.msdn.microsoft.com/jeremykuhne/2016/07/30/net-4-6-2-and-long-paths-on-windows-10/
var path = @"C:\media\2e168617-f2ae-43fb-b88c-3663af1c8eea\downloads\sabnzbd\nzbdrone\Some.Real.Big.Thing\With.Alot.Of.Nested.Directories\Some.Real.Big.Thing\With.Alot.Of.Nested.Directories\Some.Real.Big.Thing\With.Alot.Of.Nested.Directories\Some.Real.Big.Thing\With.Alot.Of.Nested.Directories\Some.Real.Big.Thing\With.Alot.Of.Nested.Directories".AsOsAgnostic(); var path = @"C:\media\2e168617-f2ae-43fb-b88c-3663af1c8eea\downloads\sabnzbd\nzbdrone\Some.Real.Big.Thing\With.Alot.Of.Nested.Directories\Some.Real.Big.Thing\With.Alot.Of.Nested.Directories\Some.Real.Big.Thing\With.Alot.Of.Nested.Directories\Some.Real.Big.Thing\With.Alot.Of.Nested.Directories\Some.Real.Big.Thing\With.Alot.Of.Nested.Directories".AsOsAgnostic();
var parentPath = @"C:\media\2e168617-f2ae-43fb-b88c-3663af1c8eea\downloads\sabnzbd\nzbdrone\Some.Real.Big.Thing\With.Alot.Of.Nested.Directories\Some.Real.Big.Thing\With.Alot.Of.Nested.Directories\Some.Real.Big.Thing\With.Alot.Of.Nested.Directories\Some.Real.Big.Thing\With.Alot.Of.Nested.Directories\Some.Real.Big.Thing".AsOsAgnostic(); var parentPath = @"C:\media\2e168617-f2ae-43fb-b88c-3663af1c8eea\downloads\sabnzbd\nzbdrone\Some.Real.Big.Thing\With.Alot.Of.Nested.Directories\Some.Real.Big.Thing\With.Alot.Of.Nested.Directories\Some.Real.Big.Thing\With.Alot.Of.Nested.Directories\Some.Real.Big.Thing\With.Alot.Of.Nested.Directories\Some.Real.Big.Thing".AsOsAgnostic();
path.GetParentPath().Should().Be(parentPath); path.GetParentPath().Should().Be(parentPath);
@@ -350,5 +392,46 @@ namespace NzbDrone.Common.Test
PosixOnly(); PosixOnly();
path.AsOsAgnostic().IsPathValid(PathValidationType.CurrentOs).Should().BeFalse(); path.AsOsAgnostic().IsPathValid(PathValidationType.CurrentOs).Should().BeFalse();
} }
[TestCase(@"C:\", @"C:\")]
[TestCase(@"C:\\", @"C:\")]
[TestCase(@"C:\Test", @"C:\Test")]
[TestCase(@"C:\Test\", @"C:\Test")]
[TestCase(@"\\server\share", @"\\server\share")]
[TestCase(@"\\server\share\", @"\\server\share")]
public void windows_path_should_return_clean_path(string path, string cleanPath)
{
path.GetCleanPath().Should().Be(cleanPath);
}
[TestCase("/", "/")]
[TestCase("//", "/")]
[TestCase("/test", "/test")]
[TestCase("/test/", "/test")]
[TestCase("/test//", "/test")]
public void unix_path_should_return_clean_path(string path, string cleanPath)
{
path.GetCleanPath().Should().Be(cleanPath);
}
[TestCase(@"C:\Test\", @"C:\Test\Series Title", "Series Title")]
[TestCase(@"C:\Test\", @"C:\Test\Collection\Series Title", @"Collection\Series Title")]
[TestCase(@"C:\Test\mydir\", @"C:\Test\mydir\Collection\Series Title", @"Collection\Series Title")]
[TestCase(@"\\server\share", @"\\server\share\Series Title", "Series Title")]
[TestCase(@"\\server\share\mydir\", @"\\server\share\mydir\/Collection\Series Title", @"Collection\Series Title")]
public void windows_path_should_return_relative_path(string parentPath, string childPath, string relativePath)
{
parentPath.GetRelativePath(childPath).Should().Be(relativePath);
}
[TestCase(@"/test", "/test/Series Title", "Series Title")]
[TestCase(@"/test/", "/test/Collection/Series Title", "Collection/Series Title")]
[TestCase(@"/test/mydir", "/test/mydir/Series Title", "Series Title")]
[TestCase(@"/test/mydir/", "/test/mydir/Collection/Series Title", "Collection/Series Title")]
[TestCase(@"/test/mydir/", @"/test/mydir/\Collection/Series Title", "Collection/Series Title")]
public void unix_path_should_return_relative_path(string parentPath, string childPath, string relativePath)
{
parentPath.GetRelativePath(childPath).Should().Be(relativePath);
}
} }
} }
@@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>net6.0</TargetFrameworks> <TargetFrameworks>net8.0</TargetFrameworks>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\NzbDrone.Host\Prowlarr.Host.csproj" /> <ProjectReference Include="..\NzbDrone.Host\Prowlarr.Host.csproj" />
+10 -9
View File
@@ -42,17 +42,18 @@ namespace NzbDrone.Common
public void CreateZip(string path, IEnumerable<string> files) public void CreateZip(string path, IEnumerable<string> files)
{ {
using (var zipFile = ZipFile.Create(path)) _logger.Debug("Creating archive {0}", path);
using var zipFile = ZipFile.Create(path);
zipFile.BeginUpdate();
foreach (var file in files)
{ {
zipFile.BeginUpdate(); zipFile.Add(file, Path.GetFileName(file));
foreach (var file in files)
{
zipFile.Add(file, Path.GetFileName(file));
}
zipFile.CommitUpdate();
} }
zipFile.CommitUpdate();
} }
private void ExtractZip(string compressedFile, string destination) private void ExtractZip(string compressedFile, string destination)
@@ -1,6 +1,5 @@
using System; using System;
using System.IO; using System.IO;
using System.Runtime.Serialization;
namespace NzbDrone.Common.Disk namespace NzbDrone.Common.Disk
{ {
@@ -24,10 +23,5 @@ namespace NzbDrone.Common.Disk
: base(message, innerException) : base(message, innerException)
{ {
} }
protected DestinationAlreadyExistsException(SerializationInfo info, StreamingContext context)
: base(info, context)
{
}
} }
} }
@@ -189,6 +189,25 @@ namespace NzbDrone.Common.Disk
} }
var fi = new FileInfo(path); var fi = new FileInfo(path);
try
{
// If the file is a symlink, resolve the target path and get the size of the target file.
if (fi.Attributes.HasFlag(FileAttributes.ReparsePoint))
{
var targetPath = fi.ResolveLinkTarget(true)?.FullName;
if (targetPath != null)
{
fi = new FileInfo(targetPath);
}
}
}
catch (IOException ex)
{
Logger.Trace(ex, "Unable to resolve symlink target for {0}", path);
}
return fi.Length; return fi.Length;
} }
+110 -3
View File
@@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text.RegularExpressions;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
namespace NzbDrone.Common.Disk namespace NzbDrone.Common.Disk
@@ -9,6 +10,8 @@ namespace NzbDrone.Common.Disk
private readonly string _path; private readonly string _path;
private readonly OsPathKind _kind; private readonly OsPathKind _kind;
private static readonly Regex UncPathRegex = new Regex(@"(?<unc>^\\\\(?:\?\\UNC\\)?[^\\]+\\[^\\]+)(?:\\|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
public OsPath(string path) public OsPath(string path)
{ {
if (path == null) if (path == null)
@@ -96,6 +99,29 @@ namespace NzbDrone.Common.Disk
return path; return path;
} }
private static string TrimTrailingSlash(string path, OsPathKind kind)
{
switch (kind)
{
case OsPathKind.Windows when !path.EndsWith(":\\"):
while (!path.EndsWith(":\\") && path.EndsWith('\\'))
{
path = path[..^1];
}
return path;
case OsPathKind.Unix when path != "/":
while (path != "/" && path.EndsWith('/'))
{
path = path[..^1];
}
return path;
}
return path;
}
public OsPathKind Kind => _kind; public OsPathKind Kind => _kind;
public bool IsWindowsPath => _kind == OsPathKind.Windows; public bool IsWindowsPath => _kind == OsPathKind.Windows;
@@ -130,7 +156,19 @@ namespace NzbDrone.Common.Disk
if (index == -1) if (index == -1)
{ {
return new OsPath(null); return Null;
}
var rootLength = GetRootLength();
if (rootLength == _path.Length)
{
return Null;
}
if (rootLength > index + 1)
{
return new OsPath(_path.Substring(0, rootLength));
} }
return new OsPath(_path.Substring(0, index), _kind).AsDirectory(); return new OsPath(_path.Substring(0, index), _kind).AsDirectory();
@@ -139,6 +177,8 @@ namespace NzbDrone.Common.Disk
public string FullPath => _path; public string FullPath => _path;
public string PathWithoutTrailingSlash => TrimTrailingSlash(_path, _kind);
public string FileName public string FileName
{ {
get get
@@ -161,6 +201,29 @@ namespace NzbDrone.Common.Disk
} }
} }
public string Name
{
// Meant to behave similar to DirectoryInfo.Name
get
{
var index = GetFileNameIndex();
if (index == -1)
{
return PathWithoutTrailingSlash;
}
var rootLength = GetRootLength();
if (rootLength > index + 1)
{
return _path.Substring(0, rootLength);
}
return TrimTrailingSlash(_path.Substring(index).TrimStart('/', '\\'), _kind);
}
}
public bool IsValid => _path.IsPathValid(PathValidationType.CurrentOs); public bool IsValid => _path.IsPathValid(PathValidationType.CurrentOs);
private int GetFileNameIndex() private int GetFileNameIndex()
@@ -190,11 +253,50 @@ namespace NzbDrone.Common.Disk
return index; return index;
} }
private int GetRootLength()
{
if (!IsRooted)
{
return 0;
}
if (_kind == OsPathKind.Unix)
{
return 1;
}
if (_kind == OsPathKind.Windows)
{
if (HasWindowsDriveLetter(_path))
{
return 3;
}
var uncMatch = UncPathRegex.Match(_path);
// \\?\UNC\server\share\ or \\server\share
if (uncMatch.Success)
{
return uncMatch.Groups["unc"].Length;
}
// \\?\C:\
if (_path.StartsWith(@"\\?\"))
{
return 7;
}
}
return 0;
}
private string[] GetFragments() private string[] GetFragments()
{ {
return _path.Split(new char[] { '\\', '/' }, StringSplitOptions.RemoveEmptyEntries); return _path.Split(new char[] { '\\', '/' }, StringSplitOptions.RemoveEmptyEntries);
} }
public static OsPath Null => new(null);
public override string ToString() public override string ToString()
{ {
return _path; return _path;
@@ -267,6 +369,11 @@ namespace NzbDrone.Common.Disk
} }
public bool Equals(OsPath other) public bool Equals(OsPath other)
{
return Equals(other, false);
}
public bool Equals(OsPath other, bool ignoreTrailingSlash)
{ {
if (ReferenceEquals(other, null)) if (ReferenceEquals(other, null))
{ {
@@ -278,8 +385,8 @@ namespace NzbDrone.Common.Disk
return true; return true;
} }
var left = _path; var left = ignoreTrailingSlash ? PathWithoutTrailingSlash : _path;
var right = other._path; var right = ignoreTrailingSlash ? other.PathWithoutTrailingSlash : other._path;
if (Kind == OsPathKind.Windows || other.Kind == OsPathKind.Windows) if (Kind == OsPathKind.Windows || other.Kind == OsPathKind.Windows)
{ {
@@ -75,6 +75,17 @@ namespace NzbDrone.Common.EnvironmentInfo
{ {
try 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"); var oldDbFile = Path.Combine(_appFolderInfo.AppDataFolder, "nzbdrone.db");
if (_startupContext.Args.ContainsKey(StartupContext.APPDATA)) if (_startupContext.Args.ContainsKey(StartupContext.APPDATA))
@@ -115,7 +126,7 @@ namespace NzbDrone.Common.EnvironmentInfo
catch (Exception ex) catch (Exception ex)
{ {
_logger.Debug(ex, ex.Message); _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());
} }
} }
@@ -15,7 +15,7 @@ namespace NzbDrone.Common.EnvironmentInfo
var attributes = assembly.GetCustomAttributes(true); var attributes = assembly.GetCustomAttributes(true);
Branch = "unknow"; Branch = "unknown";
var config = attributes.OfType<AssemblyConfigurationAttribute>().FirstOrDefault(); var config = attributes.OfType<AssemblyConfigurationAttribute>().FirstOrDefault();
if (config != null) if (config != null)
+18 -69
View File
@@ -1,6 +1,5 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using NLog; using NLog;
@@ -25,22 +24,25 @@ namespace NzbDrone.Common.EnvironmentInfo
static OsInfo() static OsInfo()
{ {
var platform = Environment.OSVersion.Platform; if (OperatingSystem.IsWindows())
switch (platform)
{ {
case PlatformID.Win32NT: Os = Os.Windows;
{ }
Os = Os.Windows; else if (OperatingSystem.IsMacOS())
break; {
} Os = Os.Osx;
}
case PlatformID.MacOSX: else if (OperatingSystem.IsFreeBSD())
case PlatformID.Unix: {
{ Os = Os.Bsd;
Os = GetPosixFlavour(); }
break; else
} {
#if ISMUSL
Os = Os.LinuxMusl;
#else
Os = Os.Linux;
#endif
} }
} }
@@ -84,59 +86,6 @@ namespace NzbDrone.Common.EnvironmentInfo
IsDocker = true; IsDocker = true;
} }
} }
private static Os GetPosixFlavour()
{
var output = RunAndCapture("uname", "-s");
if (output.StartsWith("Darwin"))
{
return Os.Osx;
}
else if (output.Contains("BSD"))
{
return Os.Bsd;
}
else
{
#if ISMUSL
return Os.LinuxMusl;
#else
return Os.Linux;
#endif
}
}
private static string RunAndCapture(string filename, string args)
{
var processStartInfo = new ProcessStartInfo
{
FileName = filename,
Arguments = args,
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardOutput = true
};
var output = string.Empty;
try
{
using (var p = Process.Start(processStartInfo))
{
// To avoid deadlocks, always read the output stream first and then wait.
output = p.StandardOutput.ReadToEnd();
p.WaitForExit(1000);
}
}
catch (Exception)
{
output = string.Empty;
}
return output;
}
} }
public interface IOsInfo public interface IOsInfo
@@ -31,7 +31,7 @@ namespace NzbDrone.Common.Extensions
} }
public static IDictionary<TNewKey, TNewValue> SelectDictionary<TKey, TValue, TNewKey, TNewValue>(this IDictionary<TKey, TValue> dictionary, 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); return dictionary.Select(selection).ToDictionary(t => t.Item1, t => t.Item2);
} }
@@ -39,18 +39,24 @@ namespace NzbDrone.Common.Extensions
private static bool IsLocalIPv4(byte[] ipv4Bytes) private static bool IsLocalIPv4(byte[] ipv4Bytes)
{ {
// Link local (no IP assigned by DHCP): 169.254.0.0 to 169.254.255.255 (169.254.0.0/16) // Link local (no IP assigned by DHCP): 169.254.0.0 to 169.254.255.255 (169.254.0.0/16)
bool IsLinkLocal() => ipv4Bytes[0] == 169 && ipv4Bytes[1] == 254; var isLinkLocal = ipv4Bytes[0] == 169 && ipv4Bytes[1] == 254;
// Class A private range: 10.0.0.0 10.255.255.255 (10.0.0.0/8) // Class A private range: 10.0.0.0 10.255.255.255 (10.0.0.0/8)
bool IsClassA() => ipv4Bytes[0] == 10; var isClassA = ipv4Bytes[0] == 10;
// Class B private range: 172.16.0.0 172.31.255.255 (172.16.0.0/12) // Class B private range: 172.16.0.0 172.31.255.255 (172.16.0.0/12)
bool IsClassB() => ipv4Bytes[0] == 172 && ipv4Bytes[1] >= 16 && ipv4Bytes[1] <= 31; var isClassB = ipv4Bytes[0] == 172 && ipv4Bytes[1] >= 16 && ipv4Bytes[1] <= 31;
// Class C private range: 192.168.0.0 192.168.255.255 (192.168.0.0/16) // Class C private range: 192.168.0.0 192.168.255.255 (192.168.0.0/16)
bool IsClassC() => ipv4Bytes[0] == 192 && ipv4Bytes[1] == 168; var isClassC = ipv4Bytes[0] == 192 && ipv4Bytes[1] == 168;
return IsLinkLocal() || IsClassA() || IsClassC() || IsClassB(); return isLinkLocal || isClassA || isClassC || isClassB;
}
public static bool IsCgnatIpAddress(this IPAddress ipAddress)
{
var bytes = ipAddress.GetAddressBytes();
return bytes.Length == 4 && bytes[0] == 100 && bytes[1] >= 64 && bytes[1] <= 127;
} }
} }
} }
@@ -25,8 +25,6 @@ namespace NzbDrone.Common.Extensions
private static readonly string UPDATE_CLIENT_FOLDER_NAME = "Prowlarr.Update" + Path.DirectorySeparatorChar; private static readonly string UPDATE_CLIENT_FOLDER_NAME = "Prowlarr.Update" + Path.DirectorySeparatorChar;
private static readonly string UPDATE_LOG_FOLDER_NAME = "UpdateLogs" + Path.DirectorySeparatorChar; private static readonly string UPDATE_LOG_FOLDER_NAME = "UpdateLogs" + Path.DirectorySeparatorChar;
private static readonly Regex PARENT_PATH_END_SLASH_REGEX = new Regex(@"(?<!:)\\$", RegexOptions.Compiled);
public static string CleanFilePath(this string path) public static string CleanFilePath(this string path)
{ {
if (path.IsNotNullOrWhiteSpace()) if (path.IsNotNullOrWhiteSpace())
@@ -87,55 +85,50 @@ namespace NzbDrone.Common.Extensions
throw new NotParentException("{0} is not a child of {1}", childPath, parentPath); throw new NotParentException("{0} is not a child of {1}", childPath, parentPath);
} }
return childPath.Substring(parentPath.Length).Trim(Path.DirectorySeparatorChar); return childPath.Substring(parentPath.Length).Trim('\\', '/');
} }
public static string GetParentPath(this string childPath) public static string GetParentPath(this string childPath)
{ {
var cleanPath = OsInfo.IsWindows var path = new OsPath(childPath).Directory;
? PARENT_PATH_END_SLASH_REGEX.Replace(childPath, "")
: childPath.TrimEnd(Path.DirectorySeparatorChar);
if (cleanPath.IsNullOrWhiteSpace()) return path == OsPath.Null ? null : path.PathWithoutTrailingSlash;
{ }
return null;
}
return Directory.GetParent(cleanPath)?.FullName; public static string GetParentName(this string childPath)
{
var path = new OsPath(childPath).Directory;
return path == OsPath.Null ? null : path.Name;
}
public static string GetDirectoryName(this string childPath)
{
var path = new OsPath(childPath);
return path == OsPath.Null ? null : path.Name;
} }
public static string GetCleanPath(this string path) public static string GetCleanPath(this string path)
{ {
var cleanPath = OsInfo.IsWindows var osPath = new OsPath(path);
? PARENT_PATH_END_SLASH_REGEX.Replace(path, "")
: path.TrimEnd(Path.DirectorySeparatorChar);
return cleanPath; return osPath == OsPath.Null ? null : osPath.PathWithoutTrailingSlash;
} }
public static bool IsParentPath(this string parentPath, string childPath) public static bool IsParentPath(this string parentPath, string childPath)
{ {
if (parentPath != "/" && !parentPath.EndsWith(":\\")) var parent = new OsPath(parentPath);
{ var child = new OsPath(childPath);
parentPath = parentPath.TrimEnd(Path.DirectorySeparatorChar);
}
if (childPath != "/" && !parentPath.EndsWith(":\\")) while (child.Directory != OsPath.Null)
{ {
childPath = childPath.TrimEnd(Path.DirectorySeparatorChar); if (child.Directory.Equals(parent, true))
}
var parent = new DirectoryInfo(parentPath);
var child = new DirectoryInfo(childPath);
while (child.Parent != null)
{
if (child.Parent.FullName.Equals(parent.FullName, DiskProviderBase.PathStringComparison))
{ {
return true; return true;
} }
child = child.Parent; child = child.Directory;
} }
return false; return false;
@@ -150,14 +143,14 @@ namespace NzbDrone.Common.Extensions
return false; return false;
} }
if (path.Trim() != path)
{
return false;
}
// Only check for leading or trailing spaces for path when running on Windows. // Only check for leading or trailing spaces for path when running on Windows.
if (OsInfo.IsWindows) if (OsInfo.IsWindows)
{ {
if (path.Trim() != path)
{
return false;
}
var directoryInfo = new DirectoryInfo(path); var directoryInfo = new DirectoryInfo(path);
while (directoryInfo != null) while (directoryInfo != null)
+1 -1
View File
@@ -9,7 +9,7 @@ namespace NzbDrone.Common.Http
{ {
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie
// NOTE: we are not checking non-ascii characters and we should // 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 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[] InvalidKeyChars = { '(', ')', '<', '>', '@', ',', ';', ':', '\\', '"', '/', '[', ']', '?', '=', '{', '}', ' ', '\t', '\n' };
private static readonly char[] InvalidValueChars = { '"', ',', ';', '\\', ' ', '\t', '\n' }; private static readonly char[] InvalidValueChars = { '"', ',', ';', '\\', ' ', '\t', '\n' };
@@ -167,7 +167,7 @@ namespace NzbDrone.Common.Http.Dispatchers
} }
catch (OperationCanceledException ex) when (cts.IsCancellationRequested) 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);
} }
} }
+1 -1
View File
@@ -97,7 +97,7 @@ namespace NzbDrone.Common.Http
// Save to add to final response // Save to add to final response
var responseCookies = response.Cookies; 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); var responseContainer = HandleRedirectCookies(request, response);
response = await ExecuteRequestAsync(request, responseContainer); response = await ExecuteRequestAsync(request, responseContainer);
+1 -1
View File
@@ -9,7 +9,7 @@ namespace NzbDrone.Common.Http
{ {
public class HttpResponse 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) public HttpResponse(HttpRequest request, HttpHeader headers, CookieCollection cookies, byte[] binaryData, long elapsedTime = 0, HttpStatusCode statusCode = HttpStatusCode.OK, Version version = null)
{ {
+5 -9
View File
@@ -1,15 +1,16 @@
using System;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
namespace NzbDrone.Common.Http namespace NzbDrone.Common.Http
{ {
public static class UserAgentParser 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); RegexOptions.IgnoreCase | RegexOptions.Compiled);
public static string SimplifyUserAgent(string userAgent) 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; return null;
} }
@@ -19,14 +20,9 @@ namespace NzbDrone.Common.Http
public static string ParseSource(string userAgent) 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"].Success ? match.Groups["agent"].Value : "Other";
{
return match.Groups["agent"].Value;
}
return "Other";
} }
} }
} }
@@ -10,64 +10,64 @@ namespace NzbDrone.Common.Instrumentation
private static readonly Regex[] CleansingRules = private static readonly Regex[] CleansingRules =
{ {
// Url // Url
new (@"(?<=[?&: ;])(apikey|api_key|(?:(?:access|api)[-_]?)?token|pass(?:key|wd)?|auth|authkey|user|u?id|api|[a-z_]*apikey|account|pid|pwd)=(?<secret>[^&=""]+?)(?=[ ""&=]|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase), new(@"(?<=[?&: ;])(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(@"(?<=[?& ;])[^=]*?(_?(?<!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(@"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(@"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(@"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(@"/fetch/[a-z0-9]{32}/(?<secret>[a-z0-9]{32})", RegexOptions.Compiled),
new (@"getnzb.*?(?<=\?|&)(r)=(?<secret>[^&=]+?)(?= |&|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase), new(@"getnzb.*?(?<=\?|&)(r)=(?<secret>[^&=]+?)(?= |&|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new (@"\b(\w*)?(_?(?<!use|get_)token|username|passwo?rd)=(?<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(@"(?<=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]+/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(@"(?<=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(@"(?:sharewood)\.[a-z]{2,3}/api/(?<secret>[a-z0-9]{16,})/", RegexOptions.Compiled | RegexOptions.IgnoreCase),
// UNIT3D // 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 // Path
new (@"""C:\\Users\\(?<secret>[^\""]+?)(\\|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase), new(@"""C:\\Users\\(?<secret>[^\""]+?)(\\|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new (@"""/(home|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 // 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 // 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 // Sabnzbd
new (@"""[^""]*(username|password|api_?key|nzb_key)""\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), new(@"""email_(account|to|from|pwd)""\s*:\s*""(?<secret>[^""]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
// uTorrent // uTorrent
new (@"\[""[a-z._]*(username|password)"",\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), new(@"\[""(boss_key|boss_key_salt|proxy\.proxy)"",\d,""(?<secret>[^""]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
// Deluge // 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) // BroadcastheNet (;torrent_pass|torrents_notify_ is for MTV)
new (@"""?method""?\s*:\s*""(getTorrents)"",\s*""?params""?\s*:\s*\[\s*""(?<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(@"getTorrents\(""(?<secret>[^""]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
new (@"(?<=\?|&|;|=)(authkey|torrent_pass|torrents_notify)[_=](?<secret>[^&=]+?)(?=""|&|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase), new(@"(?<=\?|&|;|=)(authkey|torrent_pass|torrents_notify)[_=](?<secret>[^&=]+?)(?=""|&|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
// Plex // 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 // Indexer Responses
new (@"(?:avistaz|exoticaz|cinemaz|privatehd)\.[a-z]{2,3}/rss/download/(?<secret>[^&=]+?)/(?<secret>[^&=]+?)\.torrent", 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(@"(?: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(@"""(info_hash|token|((pass|rss)[- _]?key))"":""(?<secret>[^&=]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
// Applications // Applications
new (@"""name"":""apikey"",""value"":""(?<secret>[^&=]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase), new(@"""name"":""apikey"",""value"":""(?<secret>[^&=]+?)""", RegexOptions.Compiled | RegexOptions.IgnoreCase),
// Discord // 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) public static string Cleanse(string message)
{ {
@@ -0,0 +1,21 @@
using System.Text;
using NLog;
using NLog.Layouts.ClefJsonLayout;
using NzbDrone.Common.EnvironmentInfo;
namespace NzbDrone.Common.Instrumentation;
public class CleansingClefLogLayout : CompactJsonLayout
{
protected override void RenderFormattedMessage(LogEventInfo logEvent, StringBuilder target)
{
base.RenderFormattedMessage(logEvent, target);
if (RuntimeInfo.IsProduction)
{
var result = CleanseLogMessage.Cleanse(target.ToString());
target.Clear();
target.Append(result);
}
}
}
@@ -0,0 +1,26 @@
using System.Text;
using NLog;
using NLog.Layouts;
using NzbDrone.Common.EnvironmentInfo;
namespace NzbDrone.Common.Instrumentation;
public class CleansingConsoleLogLayout : SimpleLayout
{
public CleansingConsoleLogLayout(string format)
: base(format)
{
}
protected override void RenderFormattedMessage(LogEventInfo logEvent, StringBuilder target)
{
base.RenderFormattedMessage(logEvent, target);
if (RuntimeInfo.IsProduction)
{
var result = CleanseLogMessage.Cleanse(target.ToString());
target.Clear();
target.Append(result);
}
}
}
@@ -4,7 +4,7 @@ using NLog.Targets;
namespace NzbDrone.Common.Instrumentation namespace NzbDrone.Common.Instrumentation
{ {
public class NzbDroneFileTarget : FileTarget public class CleansingFileTarget : FileTarget
{ {
protected override void RenderFormattedMessage(LogEventInfo logEvent, StringBuilder target) protected override void RenderFormattedMessage(LogEventInfo logEvent, StringBuilder target)
{ {
@@ -4,27 +4,27 @@ namespace NzbDrone.Common.Instrumentation.Extensions
{ {
public static class LoggerExtensions public static class LoggerExtensions
{ {
[MessageTemplateFormatMethod("message")]
public static void ProgressInfo(this Logger logger, string message, params object[] args) public static void ProgressInfo(this Logger logger, string message, params object[] args)
{ {
var formattedMessage = string.Format(message, args); LogProgressMessage(logger, LogLevel.Info, message, args);
LogProgressMessage(logger, LogLevel.Info, formattedMessage);
} }
[MessageTemplateFormatMethod("message")]
public static void ProgressDebug(this Logger logger, string message, params object[] args) public static void ProgressDebug(this Logger logger, string message, params object[] args)
{ {
var formattedMessage = string.Format(message, args); LogProgressMessage(logger, LogLevel.Debug, message, args);
LogProgressMessage(logger, LogLevel.Debug, formattedMessage);
} }
[MessageTemplateFormatMethod("message")]
public static void ProgressTrace(this Logger logger, string message, params object[] args) public static void ProgressTrace(this Logger logger, string message, params object[] args)
{ {
var formattedMessage = string.Format(message, args); LogProgressMessage(logger, LogLevel.Trace, message, args);
LogProgressMessage(logger, LogLevel.Trace, formattedMessage);
} }
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", ""); logEvent.Properties.Add("Status", "");
logger.Log(logEvent); logger.Log(logEvent);
@@ -3,7 +3,6 @@ using System.Diagnostics;
using System.IO; using System.IO;
using NLog; using NLog;
using NLog.Config; using NLog.Config;
using NLog.Layouts.ClefJsonLayout;
using NLog.Targets; using NLog.Targets;
using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
@@ -13,9 +12,11 @@ namespace NzbDrone.Common.Instrumentation
{ {
public static class NzbDroneLogger public static class NzbDroneLogger
{ {
private const string FILE_LOG_LAYOUT = @"${date:format=yyyy-MM-dd HH\:mm\:ss.f}|${level}|${logger}|${message}${onexception:inner=${newline}${newline}[v${assembly-version}] ${exception:format=ToString}${newline}${exception:format=Data}${newline}}"; 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}}";
public const string ConsoleLogLayout = "[${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}}";
public static CompactJsonLayout ClefLogLayout = new CompactJsonLayout();
private static readonly CleansingConsoleLogLayout CleansingConsoleLayout = new(ConsoleFormat);
private static readonly CleansingClefLogLayout ClefLogLayout = new();
private static bool _isConfigured; private static bool _isConfigured;
@@ -119,11 +120,7 @@ namespace NzbDrone.Common.Instrumentation
? formatEnumValue ? formatEnumValue
: ConsoleLogFormat.Standard; : ConsoleLogFormat.Standard;
coloredConsoleTarget.Layout = logFormat switch ConfigureConsoleLayout(coloredConsoleTarget, logFormat);
{
ConsoleLogFormat.Clef => ClefLogLayout,
_ => ConsoleLogLayout
};
var loggingRule = new LoggingRule("*", level, coloredConsoleTarget); var loggingRule = new LoggingRule("*", level, coloredConsoleTarget);
@@ -140,7 +137,7 @@ namespace NzbDrone.Common.Instrumentation
private static void RegisterAppFile(IAppFolderInfo appFolderInfo, string name, string fileName, int maxArchiveFiles, LogLevel minLogLevel) private static void RegisterAppFile(IAppFolderInfo appFolderInfo, string name, string fileName, int maxArchiveFiles, LogLevel minLogLevel)
{ {
var fileTarget = new NzbDroneFileTarget(); var fileTarget = new CleansingFileTarget();
fileTarget.Name = name; fileTarget.Name = name;
fileTarget.FileName = Path.Combine(appFolderInfo.GetLogFolder(), fileName); fileTarget.FileName = Path.Combine(appFolderInfo.GetLogFolder(), fileName);
@@ -153,7 +150,7 @@ namespace NzbDrone.Common.Instrumentation
fileTarget.MaxArchiveFiles = maxArchiveFiles; fileTarget.MaxArchiveFiles = maxArchiveFiles;
fileTarget.EnableFileDelete = true; fileTarget.EnableFileDelete = true;
fileTarget.ArchiveNumbering = ArchiveNumberingMode.Rolling; fileTarget.ArchiveNumbering = ArchiveNumberingMode.Rolling;
fileTarget.Layout = FILE_LOG_LAYOUT; fileTarget.Layout = FileLogLayout;
var loggingRule = new LoggingRule("*", minLogLevel, fileTarget); var loggingRule = new LoggingRule("*", minLogLevel, fileTarget);
@@ -172,7 +169,7 @@ namespace NzbDrone.Common.Instrumentation
fileTarget.ConcurrentWrites = false; fileTarget.ConcurrentWrites = false;
fileTarget.ConcurrentWriteAttemptDelay = 50; fileTarget.ConcurrentWriteAttemptDelay = 50;
fileTarget.ConcurrentWriteAttempts = 100; fileTarget.ConcurrentWriteAttempts = 100;
fileTarget.Layout = FILE_LOG_LAYOUT; fileTarget.Layout = FileLogLayout;
var loggingRule = new LoggingRule("*", LogLevel.Trace, fileTarget); var loggingRule = new LoggingRule("*", LogLevel.Trace, fileTarget);
@@ -205,6 +202,7 @@ namespace NzbDrone.Common.Instrumentation
c.ForLogger("Microsoft.*").WriteToNil(LogLevel.Warn); c.ForLogger("Microsoft.*").WriteToNil(LogLevel.Warn);
c.ForLogger("Microsoft.Hosting.Lifetime*").WriteToNil(LogLevel.Info); c.ForLogger("Microsoft.Hosting.Lifetime*").WriteToNil(LogLevel.Info);
c.ForLogger("Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware").WriteToNil(LogLevel.Fatal); c.ForLogger("Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware").WriteToNil(LogLevel.Fatal);
c.ForLogger("Prowlarr.Http.Authentication.ApiKeyAuthenticationHandler").WriteToNil(LogLevel.Info);
}); });
} }
@@ -217,6 +215,15 @@ namespace NzbDrone.Common.Instrumentation
{ {
return GetLogger(obj.GetType()); return GetLogger(obj.GetType());
} }
public static void ConfigureConsoleLayout(ColoredConsoleTarget target, ConsoleLogFormat format)
{
target.Layout = format switch
{
ConsoleLogFormat.Clef => NzbDroneLogger.ClefLogLayout,
_ => NzbDroneLogger.CleansingConsoleLayout
};
}
} }
public enum ConsoleLogFormat public enum ConsoleLogFormat
@@ -119,7 +119,7 @@ namespace NzbDrone.Common.Instrumentation.Sentry
o.Environment = BuildInfo.Branch; o.Environment = BuildInfo.Branch;
// Crash free run statistics (sends a ping for healthy and for crashes sessions) // Crash free run statistics (sends a ping for healthy and for crashes sessions)
o.AutoSessionTracking = true; o.AutoSessionTracking = false;
// Caches files in the event device is offline // Caches files in the event device is offline
// Sentry creates a 'sentry' sub directory, no need to concat here // Sentry creates a 'sentry' sub directory, no need to concat here
@@ -148,7 +148,7 @@ namespace NzbDrone.Common.Instrumentation.Sentry
_debounce = new SentryDebounce(); _debounce = new SentryDebounce();
// initialize to true and reconfigure later // initialize to true and reconfigure later
// Otherwise it will default to false and any errors occuring // Otherwise it will default to false and any errors occurring
// before config file gets read will not be filtered // before config file gets read will not be filtered
FilterEvents = true; FilterEvents = true;
SentryEnabled = true; SentryEnabled = true;
@@ -207,9 +207,7 @@ namespace NzbDrone.Common.Instrumentation.Sentry
private void OnError(Exception ex) private void OnError(Exception ex)
{ {
var webException = ex as WebException; if (ex is WebException webException)
if (webException != null)
{ {
var response = webException.Response as HttpWebResponse; var response = webException.Response as HttpWebResponse;
var statusCode = response?.StatusCode; var statusCode = response?.StatusCode;
@@ -6,4 +6,5 @@ public class AuthOptions
public bool? Enabled { get; set; } public bool? Enabled { get; set; }
public string Method { get; set; } public string Method { get; set; }
public string Required { get; set; } public string Required { get; set; }
public bool? TrustCgnatIpAddresses { get; set; }
} }
@@ -6,6 +6,7 @@ using System.ComponentModel;
using System.Diagnostics; using System.Diagnostics;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Text;
using NLog; using NLog;
using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Common.Model; using NzbDrone.Common.Model;
@@ -117,7 +118,9 @@ namespace NzbDrone.Common.Processes
UseShellExecute = false, UseShellExecute = false,
RedirectStandardError = true, RedirectStandardError = true,
RedirectStandardOutput = true, RedirectStandardOutput = true,
RedirectStandardInput = true RedirectStandardInput = true,
StandardOutputEncoding = Encoding.UTF8,
StandardErrorEncoding = Encoding.UTF8
}; };
if (environmentVariables != null) if (environmentVariables != null)
@@ -313,7 +316,7 @@ namespace NzbDrone.Common.Processes
processInfo = new ProcessInfo(); processInfo = new ProcessInfo();
processInfo.Id = process.Id; processInfo.Id = process.Id;
processInfo.Name = process.ProcessName; processInfo.Name = process.ProcessName;
processInfo.StartPath = process.MainModule.FileName; processInfo.StartPath = process.MainModule?.FileName;
if (process.Id != GetCurrentProcessId() && process.HasExited) if (process.Id != GetCurrentProcessId() && process.HasExited)
{ {
+16 -13
View File
@@ -1,27 +1,30 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>net6.0</TargetFrameworks> <TargetFrameworks>net8.0</TargetFrameworks>
<DefineConstants Condition="'$(RuntimeIdentifier)' == 'linux-musl-x64' or '$(RuntimeIdentifier)' == 'linux-musl-arm64'">ISMUSL</DefineConstants> <DefineConstants Condition="'$(RuntimeIdentifier)' == 'linux-musl-x64' or '$(RuntimeIdentifier)' == 'linux-musl-arm64'">ISMUSL</DefineConstants>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="DryIoc.dll" Version="5.4.3" /> <PackageReference Include="DryIoc.dll" Version="5.4.3" />
<PackageReference Include="IPAddressRange" Version="6.0.0" /> <PackageReference Include="IPAddressRange" Version="6.2.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.1" /> <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.2" /> <PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="8.0.1" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
<PackageReference Include="NLog" Version="5.3.3" /> <PackageReference Include="NLog" Version="5.4.0" />
<PackageReference Include="NLog.Layouts.ClefJsonLayout" Version="1.0.0" /> <PackageReference Include="NLog.Layouts.ClefJsonLayout" Version="1.0.3" />
<PackageReference Include="NLog.Extensions.Logging" Version="5.3.12" /> <PackageReference Include="NLog.Extensions.Logging" Version="5.4.0" />
<PackageReference Include="Npgsql" Version="7.0.8" /> <PackageReference Include="Npgsql" Version="9.0.3" />
<PackageReference Include="Sentry" Version="4.0.2" /> <PackageReference Include="Sentry" Version="4.0.2" />
<PackageReference Include="NLog.Targets.Syslog" Version="7.0.0" /> <PackageReference Include="NLog.Targets.Syslog" Version="7.0.0" />
<PackageReference Include="SharpZipLib" Version="1.4.2" /> <PackageReference Include="SharpZipLib" Version="1.4.2" />
<PackageReference Include="System.ValueTuple" Version="4.5.0" /> <PackageReference Include="SourceGear.sqlite3" Version="3.50.4.2" />
<PackageReference Include="System.Data.SQLite.Core.Servarr" Version="1.0.115.5-18" /> <PackageReference Include="System.Data.SQLite" Version="2.0.2" />
<PackageReference Include="System.Configuration.ConfigurationManager" Version="6.0.1" /> <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.IO.FileSystem.AccessControl" Version="5.0.0" />
<PackageReference Include="System.Runtime.Loader" Version="4.3.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>
<ItemGroup> <ItemGroup>
<Compile Update="EnsureThat\Resources\ExceptionMessages.Designer.cs"> <Compile Update="EnsureThat\Resources\ExceptionMessages.Designer.cs">
@@ -94,7 +94,8 @@ namespace NzbDrone.Common.TPL
{ {
_currentThreadIsProcessingItems = false; _currentThreadIsProcessingItems = false;
} }
}, null); },
null);
} }
/// <summary>Attempts to execute the specified task on the current thread.</summary> /// <summary>Attempts to execute the specified task on the current thread.</summary>
+2 -1
View File
@@ -20,7 +20,8 @@ namespace NzbDrone.Common.TPL
Logger.Error(exception, "Task Error"); Logger.Error(exception, "Task Error");
} }
} }
}, TaskContinuationOptions.OnlyOnFaulted); },
TaskContinuationOptions.OnlyOnFaulted);
return task; return task;
} }
+1 -1
View File
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<OutputType>Exe</OutputType> <OutputType>Exe</OutputType>
<TargetFrameworks>net6.0</TargetFrameworks> <TargetFrameworks>net8.0</TargetFrameworks>
<ApplicationIcon>..\NzbDrone.Host\Prowlarr.ico</ApplicationIcon> <ApplicationIcon>..\NzbDrone.Host\Prowlarr.ico</ApplicationIcon>
</PropertyGroup> </PropertyGroup>
@@ -0,0 +1,43 @@
using System;
using System.Data.SQLite;
using FluentAssertions;
using NUnit.Framework;
using NzbDrone.Core.Datastore.Converters;
using NzbDrone.Core.Test.Framework;
namespace NzbDrone.Core.Test.Datastore.Converters;
[TestFixture]
public class TimeSpanConverterFixture : CoreTest<TimeSpanConverter>
{
private SQLiteParameter _param;
[SetUp]
public void Setup()
{
_param = new SQLiteParameter();
}
[Test]
public void should_return_string_when_saving_timespan_to_db()
{
var span = TimeSpan.FromMilliseconds(10);
Subject.SetValue(_param, span);
_param.Value.Should().Be(span.ToString());
}
[Test]
public void should_return_timespan_when_getting_string_from_db()
{
var span = TimeSpan.FromMilliseconds(10);
Subject.Parse(span.ToString()).Should().Be(span);
}
[Test]
public void should_return_zero_timespan_for_db_null_value_when_getting_from_db()
{
Subject.Parse(null).Should().Be(TimeSpan.Zero);
}
}
@@ -0,0 +1,38 @@
using FluentAssertions;
using NUnit.Framework;
using NzbDrone.Core.Datastore;
namespace NzbDrone.Core.Test.Datastore;
[TestFixture]
public class DatabaseVersionParserFixture
{
[TestCase("3.44.2", 3, 44, 2)]
public void should_parse_sqlite_database_version(string serverVersion, int majorVersion, int minorVersion, int buildVersion)
{
var version = DatabaseVersionParser.ParseServerVersion(serverVersion);
version.Should().NotBeNull();
version.Major.Should().Be(majorVersion);
version.Minor.Should().Be(minorVersion);
version.Build.Should().Be(buildVersion);
}
[TestCase("14.8 (Debian 14.8-1.pgdg110+1)", 14, 8, null)]
[TestCase("16.3 (Debian 16.3-1.pgdg110+1)", 16, 3, null)]
[TestCase("16.3 - Percona Distribution", 16, 3, null)]
[TestCase("17.0 - Percona Server", 17, 0, null)]
public void should_parse_postgres_database_version(string serverVersion, int majorVersion, int minorVersion, int? buildVersion)
{
var version = DatabaseVersionParser.ParseServerVersion(serverVersion);
version.Should().NotBeNull();
version.Major.Should().Be(majorVersion);
version.Minor.Should().Be(minorVersion);
if (buildVersion.HasValue)
{
version.Build.Should().Be(buildVersion.Value);
}
}
}
@@ -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; }
}
}
@@ -149,7 +149,8 @@
} }
], ],
"music_type": null, "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, "id": 187239,
@@ -195,7 +196,8 @@
} }
], ],
"music_type": null, "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, "id": 187238,
@@ -241,7 +243,8 @@
} }
], ],
"music_type": null, "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, "id": 187237,
@@ -287,7 +290,8 @@
} }
], ],
"music_type": null, "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, "id": 187236,
@@ -333,7 +337,8 @@
} }
], ],
"music_type": null, "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, "id": 187234,
@@ -379,7 +384,8 @@
} }
], ],
"music_type": null, "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, "id": 187233,
@@ -425,7 +431,8 @@
} }
], ],
"music_type": null, "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, "id": 187231,
@@ -452,7 +459,7 @@
"imdb": "tt1143942", "imdb": "tt1143942",
"tmdb": "83665", "tmdb": "83665",
"tvdb": null, "tvdb": null,
"title": "Kaiky\u00f4", "title": "Kaikyô",
"tv_season": 1, "tv_season": 1,
"tv_episode": null, "tv_episode": null,
"tv_full_season": true, "tv_full_season": true,
@@ -471,7 +478,8 @@
} }
], ],
"music_type": null, "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, "id": 187229,
@@ -517,7 +525,8 @@
} }
], ],
"music_type": null, "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, "id": 187225,
@@ -583,7 +592,8 @@
} }
], ],
"music_type": null, "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, "id": 187224,
@@ -633,7 +643,8 @@
} }
], ],
"music_type": null, "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, "id": 187223,
@@ -679,7 +690,8 @@
} }
], ],
"music_type": null, "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, "id": 187221,
@@ -720,7 +732,8 @@
], ],
"subtitle": null, "subtitle": null,
"music_type": 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, "id": 187219,
@@ -798,7 +811,8 @@
} }
], ],
"music_type": null, "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, "id": 187218,
@@ -876,7 +890,8 @@
} }
], ],
"music_type": null, "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, "id": 187216,
@@ -917,7 +932,8 @@
], ],
"subtitle": null, "subtitle": null,
"music_type": 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, "id": 187215,
@@ -967,7 +983,8 @@
} }
], ],
"music_type": null, "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, "id": 187214,
@@ -1008,7 +1025,8 @@
], ],
"subtitle": null, "subtitle": null,
"music_type": 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, "id": 187213,
@@ -1049,7 +1067,8 @@
], ],
"subtitle": null, "subtitle": null,
"music_type": 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, "id": 187212,
@@ -1095,7 +1114,8 @@
} }
], ],
"music_type": null, "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, "id": 187210,
@@ -1136,7 +1156,8 @@
], ],
"subtitle": null, "subtitle": null,
"music_type": 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, "id": 187211,
@@ -1182,7 +1203,8 @@
} }
], ],
"music_type": 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": 187209, "id": 187209,
@@ -1223,7 +1245,8 @@
], ],
"subtitle": null, "subtitle": null,
"music_type": 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, "id": 187208,
@@ -1269,7 +1292,8 @@
} }
], ],
"music_type": null, "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, "id": 187207,
@@ -1319,7 +1343,8 @@
} }
], ],
"music_type": null, "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, "id": 187206,
@@ -1360,7 +1385,8 @@
], ],
"subtitle": null, "subtitle": null,
"music_type": 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, "id": 187205,
@@ -1401,7 +1427,8 @@
], ],
"subtitle": null, "subtitle": null,
"music_type": 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, "id": 187204,
@@ -1447,7 +1474,8 @@
} }
], ],
"music_type": null, "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, "id": 187203,
@@ -1488,7 +1516,8 @@
], ],
"subtitle": null, "subtitle": null,
"music_type": 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, "id": 187202,
@@ -1529,7 +1558,8 @@
], ],
"subtitle": null, "subtitle": null,
"music_type": 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, "id": 187201,
@@ -1570,7 +1600,8 @@
], ],
"subtitle": null, "subtitle": null,
"music_type": 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, "id": 187200,
@@ -1611,7 +1642,8 @@
], ],
"subtitle": null, "subtitle": null,
"music_type": 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, "id": 187199,
@@ -1652,7 +1684,8 @@
], ],
"subtitle": null, "subtitle": null,
"music_type": 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, "id": 187197,
@@ -1718,7 +1751,8 @@
} }
], ],
"music_type": null, "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, "id": 187196,
@@ -1764,7 +1798,8 @@
} }
], ],
"music_type": null, "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, "id": 187195,
@@ -1805,7 +1840,8 @@
], ],
"subtitle": null, "subtitle": null,
"music_type": 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, "id": 187191,
@@ -1814,7 +1850,7 @@
"type_id": 2, "type_id": 2,
"type": "TV-Show", "type": "TV-Show",
"info_hash": "(removed)", "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_size": 4075094335,
"file_count": 5, "file_count": 5,
"seed": 7, "seed": 7,
@@ -1832,7 +1868,7 @@
"imdb": null, "imdb": null,
"tmdb": "107936", "tmdb": "107936",
"tvdb": null, "tvdb": null,
"title": "\u78a7\u8840\u6d17\u94f6\u67aa", "title": "碧血洗银枪",
"tv_season": null, "tv_season": null,
"tv_episode": null, "tv_episode": null,
"tv_full_season": false, "tv_full_season": false,
@@ -1859,7 +1895,8 @@
} }
], ],
"music_type": null, "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, "id": 187190,
@@ -1929,7 +1966,8 @@
} }
], ],
"music_type": null, "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, "id": 187189,
@@ -1999,7 +2037,8 @@
} }
], ],
"music_type": null, "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, "id": 187188,
@@ -2073,7 +2112,8 @@
} }
], ],
"music_type": null, "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, "id": 187169,
@@ -2147,7 +2187,8 @@
} }
], ],
"music_type": null, "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, "id": 187168,
@@ -2193,7 +2234,8 @@
} }
], ],
"music_type": null, "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, "id": 187167,
@@ -2239,7 +2281,8 @@
} }
], ],
"music_type": null, "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, "id": 187165,
@@ -2285,7 +2328,8 @@
} }
], ],
"music_type": null, "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, "id": 187164,
@@ -2355,7 +2399,8 @@
} }
], ],
"music_type": null, "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, "id": 187163,
@@ -2382,7 +2427,7 @@
"imdb": null, "imdb": null,
"tmdb": "138573", "tmdb": "138573",
"tvdb": null, "tvdb": null,
"title": "\u51b2\u51fb", "title": "冲击",
"tv_season": null, "tv_season": null,
"tv_episode": null, "tv_episode": null,
"tv_full_season": false, "tv_full_season": false,
@@ -2396,7 +2441,8 @@
], ],
"subtitle": null, "subtitle": null,
"music_type": 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, "id": 187162,
@@ -2454,7 +2500,8 @@
} }
], ],
"music_type": null, "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, "id": 187158,
@@ -2500,7 +2547,8 @@
} }
], ],
"music_type": null, "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, "id": 187157,
@@ -2546,7 +2594,8 @@
} }
], ],
"music_type": null, "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, "id": 187156,
@@ -2592,7 +2641,8 @@
} }
], ],
"music_type": null, "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, "id": 187155,
@@ -2638,7 +2688,8 @@
} }
], ],
"music_type": null, "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, "id": 187150,
@@ -2684,7 +2735,8 @@
} }
], ],
"music_type": null, "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, "id": 187149,
@@ -2730,7 +2782,8 @@
} }
], ],
"music_type": null, "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, "id": 187148,
@@ -2776,7 +2829,8 @@
} }
], ],
"music_type": null, "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, "id": 187147,
@@ -2822,7 +2876,8 @@
} }
], ],
"music_type": null, "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, "id": 187146,
@@ -2868,7 +2923,8 @@
} }
], ],
"music_type": null, "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, "id": 187145,
@@ -2914,7 +2970,8 @@
} }
], ],
"music_type": null, "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, "id": 187144,
@@ -2960,7 +3017,8 @@
} }
], ],
"music_type": null, "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, "id": 187143,
@@ -3006,7 +3064,8 @@
} }
], ],
"music_type": null, "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, "id": 187142,
@@ -3052,7 +3111,8 @@
} }
], ],
"music_type": null, "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, "id": 187141,
@@ -3098,7 +3158,8 @@
} }
], ],
"music_type": null, "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, "id": 187140,
@@ -3144,7 +3205,8 @@
} }
], ],
"music_type": null, "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, "id": 187139,
@@ -3190,7 +3252,8 @@
} }
], ],
"music_type": null, "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, "id": 187138,
@@ -3236,7 +3299,8 @@
} }
], ],
"music_type": null, "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, "id": 187137,
@@ -3282,7 +3346,8 @@
} }
], ],
"music_type": null, "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, "id": 187136,
@@ -3328,7 +3393,8 @@
} }
], ],
"music_type": null, "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, "id": 187135,
@@ -3378,7 +3444,8 @@
} }
], ],
"music_type": null, "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, "id": 187134,
@@ -3424,7 +3491,8 @@
} }
], ],
"music_type": null, "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, "id": 187133,
@@ -3470,7 +3538,8 @@
} }
], ],
"music_type": null, "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, "id": 187132,
@@ -3528,7 +3597,8 @@
} }
], ],
"music_type": null, "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, "id": 187131,
@@ -3569,7 +3639,8 @@
], ],
"subtitle": null, "subtitle": null,
"music_type": 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, "id": 187130,
@@ -3615,7 +3686,8 @@
} }
], ],
"music_type": null, "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, "id": 187129,
@@ -3656,7 +3728,8 @@
], ],
"subtitle": null, "subtitle": null,
"music_type": 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, "id": 187128,
@@ -3706,7 +3779,8 @@
} }
], ],
"music_type": null, "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, "id": 187127,
@@ -3752,7 +3826,8 @@
} }
], ],
"music_type": null, "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, "id": 187126,
@@ -3802,7 +3877,8 @@
} }
], ],
"music_type": null, "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, "id": 187125,
@@ -3848,7 +3924,8 @@
} }
], ],
"music_type": null, "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, "id": 187124,
@@ -3889,7 +3966,8 @@
], ],
"subtitle": null, "subtitle": null,
"music_type": 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, "id": 187123,
@@ -3939,7 +4017,8 @@
} }
], ],
"music_type": null, "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, "id": 187122,
@@ -3980,7 +4059,8 @@
], ],
"subtitle": null, "subtitle": null,
"music_type": 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, "id": 187121,
@@ -4021,7 +4101,8 @@
], ],
"subtitle": null, "subtitle": null,
"music_type": 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, "id": 187120,
@@ -4067,7 +4148,8 @@
} }
], ],
"music_type": null, "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, "id": 187119,
@@ -4113,7 +4195,8 @@
} }
], ],
"music_type": null, "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, "id": 187118,
@@ -4154,7 +4237,8 @@
], ],
"subtitle": null, "subtitle": null,
"music_type": 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, "id": 187117,
@@ -4195,7 +4279,8 @@
], ],
"subtitle": null, "subtitle": null,
"music_type": 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, "id": 187116,
@@ -4236,7 +4321,8 @@
], ],
"subtitle": null, "subtitle": null,
"music_type": 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, "id": 187115,
@@ -4286,7 +4372,8 @@
} }
], ],
"music_type": null, "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, "id": 187114,
@@ -4327,7 +4414,8 @@
], ],
"subtitle": null, "subtitle": null,
"music_type": 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, "id": 187113,
@@ -4368,7 +4456,8 @@
], ],
"subtitle": null, "subtitle": null,
"music_type": 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, "id": 187112,
@@ -4409,7 +4498,8 @@
], ],
"subtitle": null, "subtitle": null,
"music_type": 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, "id": 187111,
@@ -4463,7 +4553,8 @@
} }
], ],
"music_type": null, "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, "id": 187110,
@@ -4504,7 +4595,8 @@
], ],
"subtitle": null, "subtitle": null,
"music_type": 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, "id": 187109,
@@ -4545,7 +4637,8 @@
], ],
"subtitle": null, "subtitle": null,
"music_type": 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, "id": 187107,
@@ -4586,7 +4679,8 @@
], ],
"subtitle": null, "subtitle": null,
"music_type": 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, "id": 187106,
@@ -4632,7 +4726,8 @@
} }
], ],
"music_type": null, "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, "id": 187105,
@@ -4673,7 +4768,8 @@
], ],
"subtitle": null, "subtitle": null,
"music_type": 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, "id": 187104,
@@ -4714,7 +4810,8 @@
], ],
"subtitle": null, "subtitle": null,
"music_type": 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, "id": 187103,
@@ -4760,7 +4857,8 @@
} }
], ],
"music_type": null, "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, "id": 187102,
@@ -4810,7 +4908,8 @@
} }
], ],
"music_type": null, "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, "id": 187101,
@@ -4856,7 +4955,8 @@
} }
], ],
"music_type": null, "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", "first_page_url": "https:\/\/avistaz.to\/api\/v1\/jackett\/torrents?type=2&page=1",
@@ -4869,4 +4969,4 @@
"prev_page_url": null, "prev_page_url": null,
"to": 100, "to": 100,
"total": 31393 "total": 31393
} }
@@ -1,4 +1,4 @@
{ {
"current_page": 1, "current_page": 1,
"data": [ "data": [
{ {
@@ -50,7 +50,8 @@
"images/torrent/1/4/0/mxgwdlpk4pt2.jpg" "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>", "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, "id": 61953,
@@ -106,7 +107,8 @@
"images/torrent/0/4/0/gsuctius9zw2.jpg" "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>", "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, "id": 61947,
@@ -161,7 +163,8 @@
"images/torrent/0/0/e/g6tquwvlmfdx.jpg" "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>", "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, "id": 61630,
@@ -223,7 +226,8 @@
"images/torrent/f/2/5/kdihq6gibacb.jpg" "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>", "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, "id": 61514,
@@ -275,7 +279,8 @@
"images/torrent/e/2/a/ujrvmtgjakko.jpg" "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>", "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, "id": 59929,
@@ -325,7 +330,8 @@
"images/torrent/c/4/a/hycbduxlw3ei.jpg" "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>", "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, "id": 58235,
@@ -374,7 +380,8 @@
"images/torrent/3/6/1/6fuhfb5kcbpz.jpg" "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>", "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, "id": 57416,
@@ -640,7 +647,8 @@
"images/torrent/3/8/f/hxzly7alqt9f.jpg" "images/torrent/3/8/f/hxzly7alqt9f.jpg"
], ],
"description": null, "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, "id": 56332,
@@ -690,7 +698,8 @@
"images/torrent/2/9/6/bw4kyn1ckz5u.jpg" "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>", "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, "id": 56108,
@@ -742,7 +751,8 @@
"images/torrent/d/6/b/gexzyognkxeb.jpg" "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>", "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, "id": 54324,
@@ -797,7 +807,8 @@
"images/torrent/9/7/d/ujzu5he0deum.jpg" "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>", "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, "id": 53526,
@@ -864,7 +875,8 @@
"images/torrent/7/d/0/w4lraenuqmos.jpg" "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>", "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, "id": 52648,
@@ -915,7 +927,8 @@
"images/torrent/8/7/2/92ph60ekxpkx.jpg" "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>", "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, "id": 52438,
@@ -972,7 +985,8 @@
"images/torrent/0/9/2/yhdsjr2jrf2k.gif" "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>", "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, "id": 52436,
@@ -1023,7 +1037,8 @@
"images/torrent/1/0/9/rj8pemdpmdce.gif" "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>", "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, "id": 52434,
@@ -1074,7 +1089,8 @@
"images/torrent/9/0/6/jpoyeqdohhft.gif" "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>", "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, "id": 51414,
@@ -1125,7 +1141,8 @@
"images/torrent/7/a/2/v4bbhqrhfaic.jpg" "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>", "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, "id": 50935,
@@ -1178,7 +1195,8 @@
"images/torrent/4/d/2/8ppl4ibq95se.png" "images/torrent/4/d/2/8ppl4ibq95se.png"
], ],
"description": null, "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, "id": 50154,
@@ -1244,7 +1262,8 @@
"images/torrent/a/7/7/t90zggbrwwf5.jpg" "images/torrent/a/7/7/t90zggbrwwf5.jpg"
], ],
"description": null, "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, "id": 49718,
@@ -1312,7 +1331,8 @@
"images/torrent/5/9/9/7uo17medy6ib.jpg" "images/torrent/5/9/9/7uo17medy6ib.jpg"
], ],
"description": null, "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, "id": 49717,
@@ -1368,7 +1388,8 @@
"images/torrent/2/4/0/f99j7rtxwlni.jpg" "images/torrent/2/4/0/f99j7rtxwlni.jpg"
], ],
"description": null, "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, "id": 49715,
@@ -1423,7 +1444,8 @@
"images/torrent/7/3/5/6e8mmocet7pq.jpg" "images/torrent/7/3/5/6e8mmocet7pq.jpg"
], ],
"description": null, "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, "id": 49714,
@@ -1477,7 +1499,8 @@
"images/torrent/5/a/b/bchwfgrs4jm4.jpg" "images/torrent/5/a/b/bchwfgrs4jm4.jpg"
], ],
"description": null, "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, "id": 49712,
@@ -1532,7 +1555,8 @@
"images/torrent/d/8/0/n8wlosqiuz92.jpg" "images/torrent/d/8/0/n8wlosqiuz92.jpg"
], ],
"description": null, "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, "id": 49647,
@@ -1588,7 +1612,8 @@
"images/torrent/c/5/f/nc1q6ejlvyqu.jpg" "images/torrent/c/5/f/nc1q6ejlvyqu.jpg"
], ],
"description": null, "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, "id": 49646,
@@ -1640,7 +1665,8 @@
"images/torrent/c/5/8/c1wfncbm1eve.jpg" "images/torrent/c/5/8/c1wfncbm1eve.jpg"
], ],
"description": null, "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, "id": 49645,
@@ -1696,7 +1722,8 @@
"images/torrent/8/4/e/wc4toojco9dx.jpg" "images/torrent/8/4/e/wc4toojco9dx.jpg"
], ],
"description": null, "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, "id": 49644,
@@ -1752,7 +1779,8 @@
"images/torrent/7/7/c/4qp3mqsokrnw.jpg" "images/torrent/7/7/c/4qp3mqsokrnw.jpg"
], ],
"description": null, "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, "id": 49643,
@@ -1804,7 +1832,8 @@
"images/torrent/0/9/f/fgwbfeqmzftr.jpg" "images/torrent/0/9/f/fgwbfeqmzftr.jpg"
], ],
"description": null, "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, "id": 49079,
@@ -1858,7 +1887,8 @@
"images/torrent/7/d/d/xe1gcbp5acwx.png" "images/torrent/7/d/d/xe1gcbp5acwx.png"
], ],
"description": null, "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, "id": 49056,
@@ -1912,7 +1942,8 @@
"images/torrent/e/1/1/yv3ablrdkgfv.jpg" "images/torrent/e/1/1/yv3ablrdkgfv.jpg"
], ],
"description": null, "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, "id": 49050,
@@ -1963,7 +1994,8 @@
"images/torrent/3/3/1/uorz1hpm1hld.jpg" "images/torrent/3/3/1/uorz1hpm1hld.jpg"
], ],
"description": null, "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, "id": 49049,
@@ -2018,7 +2050,8 @@
"images/torrent/9/6/e/bahbhr2gaqeq.jpg" "images/torrent/9/6/e/bahbhr2gaqeq.jpg"
], ],
"description": null, "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, "id": 49048,
@@ -2073,7 +2106,8 @@
"images/torrent/7/8/b/eq1jkrz8icoi.jpg" "images/torrent/7/8/b/eq1jkrz8icoi.jpg"
], ],
"description": null, "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, "id": 49038,
@@ -2129,7 +2163,8 @@
"images/torrent/0/1/7/c2hcjiknuv26.jpg" "images/torrent/0/1/7/c2hcjiknuv26.jpg"
], ],
"description": null, "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, "id": 49037,
@@ -2185,7 +2220,8 @@
"images/torrent/f/c/c/sir7gae1bnjv.jpg" "images/torrent/f/c/c/sir7gae1bnjv.jpg"
], ],
"description": null, "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, "id": 48883,
@@ -2234,7 +2270,8 @@
"images/torrent/1/5/7/myv4v8tpa6d6.jpg" "images/torrent/1/5/7/myv4v8tpa6d6.jpg"
], ],
"description": "<p>ISO: https://exoticaz.to/torrent/48124</p>", "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, "id": 48364,
@@ -2276,7 +2313,8 @@
"images/torrent/f/b/f/lw6fcsf6fz9z.jpg" "images/torrent/f/b/f/lw6fcsf6fz9z.jpg"
], ],
"description": "<p>Somebody requested this separately from pack that is already on here.</p>", "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, "id": 48189,
@@ -2331,7 +2369,8 @@
"images/torrent/6/3/2/5yvhovuhybyd.jpg" "images/torrent/6/3/2/5yvhovuhybyd.jpg"
], ],
"description": null, "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, "id": 48186,
@@ -2388,7 +2427,8 @@
"images/torrent/6/0/8/e6jahgfjtvkf.jpg" "images/torrent/6/0/8/e6jahgfjtvkf.jpg"
], ],
"description": null, "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, "id": 48184,
@@ -2444,7 +2484,8 @@
"images/torrent/9/a/b/msjcjdcarxj2.jpg" "images/torrent/9/a/b/msjcjdcarxj2.jpg"
], ],
"description": null, "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, "id": 48181,
@@ -2500,7 +2541,8 @@
"images/torrent/f/c/c/hkmy2iaaessw.jpg" "images/torrent/f/c/c/hkmy2iaaessw.jpg"
], ],
"description": null, "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, "id": 48179,
@@ -2555,7 +2597,8 @@
"images/torrent/9/8/3/fw84szdvrmk4.jpg" "images/torrent/9/8/3/fw84szdvrmk4.jpg"
], ],
"description": null, "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, "id": 48178,
@@ -2611,7 +2654,8 @@
"images/torrent/5/c/5/y7fjqvupby01.jpg" "images/torrent/5/c/5/y7fjqvupby01.jpg"
], ],
"description": null, "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, "id": 48125,
@@ -2666,7 +2710,8 @@
"images/torrent/f/2/1/wj8axuerttva.jpg" "images/torrent/f/2/1/wj8axuerttva.jpg"
], ],
"description": null, "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, "id": 48124,
@@ -2721,7 +2766,8 @@
"images/torrent/b/6/8/qa5nfh9blige.jpg" "images/torrent/b/6/8/qa5nfh9blige.jpg"
], ],
"description": null, "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, "id": 46870,
@@ -2770,7 +2816,8 @@
"images/torrent/d/4/1/rpn5ywrgch3m.jpg" "images/torrent/d/4/1/rpn5ywrgch3m.jpg"
], ],
"description": null, "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, "id": 46193,
@@ -2826,7 +2873,8 @@
"images/torrent/7/6/8/o87ujrsbmehp.jpg" "images/torrent/7/6/8/o87ujrsbmehp.jpg"
], ],
"description": null, "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, "id": 45171,
@@ -2874,7 +2922,8 @@
"images/torrent/6/d/b/wm8ikfbzpecs.jpg" "images/torrent/6/d/b/wm8ikfbzpecs.jpg"
], ],
"description": "<p>I don't know why the source was 25 fps</p>", "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, "id": 43663,
@@ -2923,7 +2972,8 @@
"images/torrent/b/7/d/qswq8vdshnyb.jpg" "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>", "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, "id": 39515,
@@ -3001,7 +3051,8 @@
"images/torrent/a/0/c/5dgyfrjx6x7p.png" "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>", "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, "id": 39245,
@@ -3049,7 +3100,8 @@
"images/torrent/f/5/1/nqjy8fpqskdj.jpg" "images/torrent/f/5/1/nqjy8fpqskdj.jpg"
], ],
"description": "<p>BDISO: https://exoticaz.to/torrent/34023</p>", "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, "id": 38628,
@@ -3098,7 +3150,8 @@
"images/torrent/6/f/e/juc07vprbndp.jpg" "images/torrent/6/f/e/juc07vprbndp.jpg"
], ],
"description": null, "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, "id": 38281,
@@ -3159,7 +3212,8 @@
"images/torrent/8/6/8/vazvb4ycnmb8.jpg" "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>", "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, "id": 37072,
@@ -3215,7 +3269,8 @@
"images/torrent/6/6/9/1ms8yiiif82h.jpg" "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>", "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, "id": 36791,
@@ -3269,7 +3324,8 @@
"images/torrent/b/b/4/pampaacdzpoa.jpg" "images/torrent/b/b/4/pampaacdzpoa.jpg"
], ],
"description": "<p>credits to perfectcanary</p>", "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, "id": 36790,
@@ -3324,7 +3380,8 @@
"images/torrent/a/a/c/hyaed34gxuic.jpg" "images/torrent/a/a/c/hyaed34gxuic.jpg"
], ],
"description": "<p>credits to perfectcanary</p>", "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, "id": 36789,
@@ -3379,7 +3436,8 @@
"images/torrent/7/8/6/3uotc2hw7s6l.jpg" "images/torrent/7/8/6/3uotc2hw7s6l.jpg"
], ],
"description": "<p>credits to perfectcanary</p>", "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, "id": 36465,
@@ -3436,7 +3494,8 @@
"images/torrent/1/1/a/x6yztt33psfz.jpg" "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>", "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, "id": 36096,
@@ -3491,7 +3550,8 @@
"images/torrent/1/9/e/dtxkxrwdpf3m.jpg" "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>", "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, "id": 35862,
@@ -3546,7 +3606,8 @@
"images/torrent/a/9/4/ksgywpxmjg9h.jpg" "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>", "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, "id": 34686,
@@ -3608,7 +3669,8 @@
"images/torrent/3/0/4/dtb70p4cfkhi.jpg" "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>", "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, "id": 34051,
@@ -3660,7 +3722,8 @@
"images/torrent/9/e/9/0ocpe6n3lsc6.jpg" "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>", "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, "id": 34049,
@@ -3713,7 +3776,8 @@
"images/torrent/9/0/4/5yho2mvumies.jpg" "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>", "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, "id": 34024,
@@ -3764,7 +3828,8 @@
"images/torrent/d/3/2/qeylkbizibzy.jpg" "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>", "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, "id": 34023,
@@ -3813,7 +3878,8 @@
"images/torrent/c/0/2/pvoql1zscpdl.jpg" "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>", "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, "id": 33466,
@@ -3870,7 +3936,8 @@
"images/torrent/1/6/0/bwivpujoltwr.jpg" "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>", "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, "id": 32469,
@@ -3925,7 +3992,8 @@
"images/torrent/7/f/4/qn6q2w8bgjzg.jpg" "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>", "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, "id": 31490,
@@ -4118,7 +4186,8 @@
"images/torrent/1/0/d/9wmpejovzbg7.jpg" "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>", "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, "id": 31465,
@@ -4175,7 +4244,8 @@
"images/torrent/7/4/f/npjdewgqw8bj.jpg" "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>", "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, "id": 30383,
@@ -4220,7 +4290,8 @@
"images/torrent/9/9/9/i3ciw7xmwson.jpg" "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>", "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, "id": 29815,
@@ -4269,7 +4340,8 @@
"images/torrent/b/9/3/wvu3uhkwmxbz.jpg" "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>", "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, "id": 29356,
@@ -4315,7 +4387,8 @@
"images/torrent/5/6/4/kdkmgw9mxjiy.jpg" "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>", "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, "id": 29261,
@@ -4366,7 +4439,8 @@
"images/torrent/9/a/c/hocvufnx1xxg.jpg" "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>", "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, "id": 27208,
@@ -4419,7 +4493,8 @@
"images/torrent/8/6/3/br1smc0lvdfy.png" "images/torrent/8/6/3/br1smc0lvdfy.png"
], ],
"description": null, "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, "id": 26018,
@@ -4464,7 +4539,8 @@
"images/torrent/c/e/d/fjzmigqdm3qt.jpg" "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>", "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, "id": 26005,
@@ -4510,7 +4586,8 @@
"images/torrent/6/5/4/lhkdfbqlsqlu.jpg" "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>", "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, "id": 26004,
@@ -4553,7 +4630,8 @@
"images/torrent/c/5/d/n5ciceiboq1l.jpg" "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>", "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, "id": 25958,
@@ -4598,7 +4676,8 @@
"images/torrent/e/5/b/dtmfbfmqsekh.jpg" "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>", "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, "id": 25204,
@@ -4646,7 +4725,8 @@
"images/torrent/f/c/a/5rsj5fnyw7sy.jpg" "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>", "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, "id": 24777,
@@ -4729,7 +4809,8 @@
"images/torrent/4/0/1/qiq9l0g9b4lb.jpg" "images/torrent/4/0/1/qiq9l0g9b4lb.jpg"
], ],
"description": null, "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, "id": 24714,
@@ -4793,7 +4874,8 @@
"images/torrent/0/0/c/pz6a1om1zcj6.jpg" "images/torrent/0/0/c/pz6a1om1zcj6.jpg"
], ],
"description": null, "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, "id": 24432,
@@ -4832,7 +4914,8 @@
"images/torrent/c/3/e/ivi2v3xvuxvf.png" "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>", "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, "id": 22633,
@@ -4880,7 +4963,8 @@
"images/torrent/d/1/d/siepkvzdjdjm.png" "images/torrent/d/1/d/siepkvzdjdjm.png"
], ],
"description": null, "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, "id": 22606,
@@ -4926,7 +5010,8 @@
"images/torrent/f/9/9/scjrral5midb.png" "images/torrent/f/9/9/scjrral5midb.png"
], ],
"description": null, "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, "id": 21647,
@@ -4975,7 +5060,8 @@
"images/torrent/1/e/9/zb4gphrposw0.gif" "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>", "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, "id": 21564,
@@ -5021,7 +5107,8 @@
"images/torrent/b/5/f/r0ml2pj3xrvq.jpg" "images/torrent/b/5/f/r0ml2pj3xrvq.jpg"
], ],
"description": "<p>MUTEKI 10th Anniversary Special Project.</p>", "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, "id": 21561,
@@ -5075,7 +5162,8 @@
"images/torrent/7/c/3/kvjyuskn3mkf.jpg" "images/torrent/7/c/3/kvjyuskn3mkf.jpg"
], ],
"description": null, "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, "id": 20515,
@@ -5200,7 +5288,8 @@
"images/torrent/a/1/9/5ngcygiazvrv.jpg" "images/torrent/a/1/9/5ngcygiazvrv.jpg"
], ],
"description": null, "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, "id": 15261,
@@ -5241,7 +5330,8 @@
"images/torrent/e/f/6/ubgilv5db5mo.jpg" "images/torrent/e/f/6/ubgilv5db5mo.jpg"
], ],
"description": null, "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, "id": 4333,
@@ -5282,7 +5372,8 @@
"images/torrent/c/9/c/3qxdyhvuefwu.jpg" "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>", "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, "id": 4241,
@@ -5323,7 +5414,8 @@
"images/torrent/c/4/4/o8jsphfh7rr9.jpg" "images/torrent/c/4/4/o8jsphfh7rr9.jpg"
], ],
"description": null, "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, "id": 4191,
@@ -5364,7 +5456,8 @@
"images/torrent/9/6/1/c1szrkxbf6fn.jpg" "images/torrent/9/6/1/c1szrkxbf6fn.jpg"
], ],
"description": null, "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, "id": 4101,
@@ -5405,7 +5498,8 @@
"images/torrent/7/4/6/9r3ars6pa9cn.jpg" "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>", "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, "id": 4002,
@@ -5446,7 +5540,8 @@
"images/torrent/7/d/3/wj64npz8aizr.jpg" "images/torrent/7/d/3/wj64npz8aizr.jpg"
], ],
"description": "<p>三上悠亜<br>TEK-071 快感(MUTEKI2016年1月1日)</p>", "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, "id": 3951,
@@ -5487,7 +5582,8 @@
"images/torrent/c/1/7/herqbzuq6jj4.jpg" "images/torrent/c/1/7/herqbzuq6jj4.jpg"
], ],
"description": "<p>三上悠亜<br>TEK-067 Princess PeachMUTEKI2015年6月1日)</p>", "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, "id": 16896,
@@ -5535,7 +5631,8 @@
"images/torrent/8/a/a/ena0fdra1rif.jpg" "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>", "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, "id": 15273,
@@ -5577,7 +5674,8 @@
"images/torrent/f/6/5/srlry3vu9kas.jpg" "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>", "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, "id": 17757,
@@ -5623,7 +5721,8 @@
"images/torrent/3/1/6/21sudpyouj3f.jpg" "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>", "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, "id": 17364,
@@ -5668,7 +5767,8 @@
"images/torrent/f/a/b/tvqctziuy8k2.jpg" "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>", "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", "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
@@ -109,7 +109,8 @@
} }
], ],
"music_type": null, "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, "id": 78501,
@@ -159,7 +160,8 @@
} }
], ],
"music_type": null, "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, "id": 78496,
@@ -209,7 +211,8 @@
} }
], ],
"music_type": null, "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, "id": 78494,
@@ -259,7 +262,8 @@
} }
], ],
"music_type": null, "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, "id": 78491,
@@ -305,7 +309,8 @@
} }
], ],
"music_type": null, "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, "id": 78490,
@@ -351,7 +356,8 @@
} }
], ],
"music_type": null, "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, "id": 78488,
@@ -465,7 +471,8 @@
} }
], ],
"music_type": null, "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, "id": 78486,
@@ -511,7 +518,8 @@
} }
], ],
"music_type": null, "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, "id": 78485,
@@ -569,7 +577,8 @@
} }
], ],
"music_type": null, "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, "id": 78483,
@@ -615,7 +624,8 @@
} }
], ],
"music_type": null, "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, "id": 78481,
@@ -801,7 +811,8 @@
} }
], ],
"music_type": null, "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, "id": 78480,
@@ -855,7 +866,8 @@
} }
], ],
"music_type": null, "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, "id": 78476,
@@ -909,7 +921,8 @@
} }
], ],
"music_type": null, "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, "id": 78472,
@@ -995,7 +1008,8 @@
} }
], ],
"music_type": null, "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, "id": 78468,
@@ -1045,7 +1059,8 @@
} }
], ],
"music_type": null, "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, "id": 78467,
@@ -1099,7 +1114,8 @@
} }
], ],
"music_type": null, "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, "id": 78466,
@@ -1153,7 +1169,8 @@
} }
], ],
"music_type": null, "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, "id": 78465,
@@ -1203,7 +1220,8 @@
} }
], ],
"music_type": null, "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, "id": 78460,
@@ -1257,7 +1275,8 @@
} }
], ],
"music_type": null, "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, "id": 78459,
@@ -1311,7 +1330,8 @@
} }
], ],
"music_type": null, "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, "id": 78458,
@@ -1361,7 +1381,8 @@
} }
], ],
"music_type": null, "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, "id": 78453,
@@ -1415,7 +1436,8 @@
} }
], ],
"music_type": null, "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, "id": 78446,
@@ -1477,7 +1499,8 @@
} }
], ],
"music_type": null, "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, "id": 78445,
@@ -1523,7 +1546,8 @@
} }
], ],
"music_type": null, "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, "id": 78412,
@@ -1569,7 +1593,8 @@
} }
], ],
"music_type": null, "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, "id": 78408,
@@ -1610,7 +1635,8 @@
], ],
"subtitle": null, "subtitle": null,
"music_type": 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, "id": 78406,
@@ -1656,7 +1682,8 @@
} }
], ],
"music_type": null, "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, "id": 78398,
@@ -1742,7 +1769,8 @@
} }
], ],
"music_type": null, "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, "id": 78396,
@@ -1828,7 +1856,8 @@
} }
], ],
"music_type": null, "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, "id": 78395,
@@ -1958,7 +1987,8 @@
} }
], ],
"music_type": null, "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, "id": 78393,
@@ -2044,7 +2074,8 @@
} }
], ],
"music_type": null, "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, "id": 78391,
@@ -2098,7 +2129,8 @@
} }
], ],
"music_type": null, "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, "id": 78390,
@@ -2144,7 +2176,8 @@
} }
], ],
"music_type": null, "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, "id": 78389,
@@ -2190,7 +2223,8 @@
} }
], ],
"music_type": null, "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, "id": 78388,
@@ -2336,7 +2370,8 @@
} }
], ],
"music_type": null, "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, "id": 78387,
@@ -2390,7 +2425,8 @@
} }
], ],
"music_type": null, "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, "id": 78386,
@@ -2436,7 +2472,8 @@
} }
], ],
"music_type": null, "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, "id": 78385,
@@ -2622,7 +2659,8 @@
} }
], ],
"music_type": null, "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, "id": 78384,
@@ -2808,7 +2846,8 @@
} }
], ],
"music_type": null, "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, "id": 78379,
@@ -2854,7 +2893,8 @@
} }
], ],
"music_type": null, "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, "id": 78378,
@@ -2972,7 +3012,8 @@
} }
], ],
"music_type": null, "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, "id": 78374,
@@ -3050,7 +3091,8 @@
} }
], ],
"music_type": null, "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, "id": 78373,
@@ -3212,7 +3254,8 @@
} }
], ],
"music_type": null, "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, "id": 78339,
@@ -3262,7 +3305,8 @@
} }
], ],
"music_type": null, "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, "id": 78332,
@@ -3303,7 +3347,8 @@
], ],
"subtitle": null, "subtitle": null,
"music_type": 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, "id": 78329,
@@ -3353,7 +3398,8 @@
} }
], ],
"music_type": null, "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, "id": 78328,
@@ -3394,7 +3440,8 @@
], ],
"subtitle": null, "subtitle": null,
"music_type": 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, "id": 78320,
@@ -3464,7 +3511,8 @@
} }
], ],
"music_type": null, "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, "id": 78319,
@@ -3510,7 +3558,8 @@
} }
], ],
"music_type": null, "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, "id": 78318,
@@ -3588,7 +3637,8 @@
} }
], ],
"music_type": null, "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, "id": 78317,
@@ -3674,7 +3724,8 @@
} }
], ],
"music_type": null, "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, "id": 78315,
@@ -3724,7 +3775,8 @@
} }
], ],
"music_type": null, "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, "id": 78313,
@@ -3774,7 +3826,8 @@
} }
], ],
"music_type": null, "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, "id": 78309,
@@ -3828,7 +3881,8 @@
} }
], ],
"music_type": null, "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, "id": 78308,
@@ -3890,7 +3944,8 @@
} }
], ],
"music_type": null, "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, "id": 78307,
@@ -3972,7 +4027,8 @@
} }
], ],
"music_type": null, "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, "id": 78305,
@@ -4018,7 +4074,8 @@
} }
], ],
"music_type": null, "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, "id": 78304,
@@ -4059,7 +4116,8 @@
], ],
"subtitle": null, "subtitle": null,
"music_type": 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, "id": 78292,
@@ -4109,7 +4167,8 @@
} }
], ],
"music_type": null, "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, "id": 78291,
@@ -4159,7 +4218,8 @@
} }
], ],
"music_type": null, "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, "id": 78290,
@@ -4209,7 +4269,8 @@
} }
], ],
"music_type": null, "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, "id": 78289,
@@ -4259,7 +4320,8 @@
} }
], ],
"music_type": null, "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, "id": 78287,
@@ -4300,7 +4362,8 @@
], ],
"subtitle": null, "subtitle": null,
"music_type": 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, "id": 78279,
@@ -4346,7 +4409,8 @@
} }
], ],
"music_type": null, "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, "id": 78278,
@@ -4392,7 +4456,8 @@
} }
], ],
"music_type": null, "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, "id": 78252,
@@ -4442,7 +4507,8 @@
} }
], ],
"music_type": null, "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, "id": 78251,
@@ -4488,7 +4554,8 @@
} }
], ],
"music_type": null, "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, "id": 78250,
@@ -4534,7 +4601,8 @@
} }
], ],
"music_type": null, "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, "id": 78247,
@@ -4580,7 +4648,8 @@
} }
], ],
"music_type": null, "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, "id": 78246,
@@ -4726,7 +4795,8 @@
} }
], ],
"music_type": null, "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, "id": 78244,
@@ -4780,7 +4850,8 @@
} }
], ],
"music_type": null, "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, "id": 78243,
@@ -4830,7 +4901,8 @@
} }
], ],
"music_type": null, "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, "id": 78240,
@@ -4876,7 +4948,8 @@
} }
], ],
"music_type": null, "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, "id": 78239,
@@ -4922,7 +4995,8 @@
} }
], ],
"music_type": null, "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, "id": 78238,
@@ -4968,7 +5042,8 @@
} }
], ],
"music_type": null, "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, "id": 78237,
@@ -5014,7 +5089,8 @@
} }
], ],
"music_type": null, "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, "id": 78236,
@@ -5060,7 +5136,8 @@
} }
], ],
"music_type": null, "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, "id": 78235,
@@ -5110,7 +5187,8 @@
} }
], ],
"music_type": null, "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, "id": 78216,
@@ -5156,7 +5234,8 @@
} }
], ],
"music_type": null, "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, "id": 78215,
@@ -5202,7 +5281,8 @@
} }
], ],
"music_type": null, "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, "id": 78214,
@@ -5248,7 +5328,8 @@
} }
], ],
"music_type": null, "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, "id": 78213,
@@ -5294,7 +5375,8 @@
} }
], ],
"music_type": null, "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, "id": 78212,
@@ -5344,7 +5426,8 @@
} }
], ],
"music_type": null, "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, "id": 78210,
@@ -5530,7 +5613,8 @@
} }
], ],
"music_type": null, "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, "id": 78208,
@@ -5576,7 +5660,8 @@
} }
], ],
"music_type": null, "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, "id": 78206,
@@ -5666,7 +5751,8 @@
} }
], ],
"music_type": null, "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, "id": 78204,
@@ -5764,7 +5850,8 @@
} }
], ],
"music_type": null, "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, "id": 78203,
@@ -5810,7 +5897,8 @@
} }
], ],
"music_type": null, "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, "id": 78201,
@@ -5860,7 +5948,8 @@
} }
], ],
"music_type": null, "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, "id": 78197,
@@ -5910,7 +5999,8 @@
} }
], ],
"music_type": null, "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, "id": 78185,
@@ -5956,7 +6046,8 @@
} }
], ],
"music_type": null, "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, "id": 78184,
@@ -6046,7 +6137,8 @@
} }
], ],
"music_type": null, "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, "id": 78182,
@@ -6092,7 +6184,8 @@
} }
], ],
"music_type": null, "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, "id": 78181,
@@ -6138,7 +6231,8 @@
} }
], ],
"music_type": null, "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, "id": 78177,
@@ -6184,7 +6278,8 @@
} }
], ],
"music_type": null, "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, "id": 78176,
@@ -6230,7 +6325,8 @@
} }
], ],
"music_type": null, "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, "id": 78159,
@@ -6271,7 +6367,8 @@
], ],
"subtitle": null, "subtitle": null,
"music_type": 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, "id": 78158,
@@ -6409,7 +6506,8 @@
} }
], ],
"music_type": null, "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, "id": 78157,
@@ -6547,7 +6645,8 @@
} }
], ],
"music_type": null, "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, "id": 78153,
@@ -6593,7 +6692,8 @@
} }
], ],
"music_type": null, "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", "first_page_url": "https:\/\/privatehd.to\/api\/v1\/jackett\/torrents?type=1&page=1",
@@ -1,15 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<caps> <caps>
<server version="1.0" title="Anime Tosho" strapline="Anime NZB/DDL mirror" url="https://animetosho.org/"/> <server version="1.0" title="Anime Tosho" strapline="Anime NZB/DDL mirror" url="https://animetosho.org/" />
<limits max="200" default="75"/> <limits max="200" default="75" />
<retention days="9999"/> <retention days="9999" />
<registration available="no" open="yes" /> <registration available="no" open="yes" />
<searching> <searching>
<search available="yes" supportedParams="q" /> <search available="yes" supportedParams="q" />
<tv-search available="no" supportedParams="q" /> <tv-search available="no" supportedParams="q" />
<movie-search available="no" supportedParams="q" /> <movie-search available="no" supportedParams="q" />
</searching> </searching>
<categories> <categories>
<category id="5070" name="Anime" description="Anime"/> <category id="5070" name="Anime" description="Anime" />
</categories> <category id="2020" name="Movies/Other" description="Movies (Anime)" />
</caps> </categories>
</caps>
@@ -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); return new HttpProxySettings(ProxyType.Socks5, "localhost", 8080, "*.httpbin.org,google.com,172.16.0.0/12", true, null, null);
} }
[Test] [TestCase("http://eu.httpbin.org/get")]
public void should_bypass_proxy() [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(); var settings = GetProxySettings();
Subject.ShouldProxyBeBypassed(settings, new HttpUri("http://eu.httpbin.org/get")).Should().BeTrue(); Subject.ShouldProxyBeBypassed(settings, new HttpUri(url)).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();
} }
[Test] [TestCase("http://bing.com/get")]
public void should_not_bypass_proxy() [TestCase("http://172.3.0.1:8989/api/v3/indexer/schema")]
public void should_not_bypass_proxy(string url)
{ {
var settings = GetProxySettings(); var settings = GetProxySettings();
Subject.ShouldProxyBeBypassed(settings, new HttpUri("http://bing.com/get")).Should().BeFalse(); Subject.ShouldProxyBeBypassed(settings, new HttpUri(url)).Should().BeFalse();
Subject.ShouldProxyBeBypassed(settings, new HttpUri("http://172.3.0.1:8989/api/v3/indexer/schema")).Should().BeFalse();
} }
} }
} }
@@ -122,7 +122,7 @@ namespace NzbDrone.Core.Test.IndexerTests.AnimeBytesTests
var fifthTorrentInfo = releases.ElementAt(28) as TorrentInfo; var fifthTorrentInfo = releases.ElementAt(28) as TorrentInfo;
fifthTorrentInfo.Title.Should().Be("[-ZR-] Dr. STONE: STONE WARS S02 [Web][MKV][h264][1080p][AAC 2.0][Dual Audio][Softsubs (-ZR-)]"); fifthTorrentInfo.Title.Should().Be("[-ZR-] Dr. STONE: STONE WARS 2021 S02 [Web][MKV][h264][1080p][AAC 2.0][Dual Audio][Softsubs (-ZR-)]");
fifthTorrentInfo.DownloadProtocol.Should().Be(DownloadProtocol.Torrent); fifthTorrentInfo.DownloadProtocol.Should().Be(DownloadProtocol.Torrent);
fifthTorrentInfo.DownloadUrl.Should().Be("https://animebytes.tv/torrent/944509/download/somepass"); fifthTorrentInfo.DownloadUrl.Should().Be("https://animebytes.tv/torrent/944509/download/somepass");
fifthTorrentInfo.InfoUrl.Should().Be("https://animebytes.tv/torrent/944509/group"); fifthTorrentInfo.InfoUrl.Should().Be("https://animebytes.tv/torrent/944509/group");
@@ -140,7 +140,7 @@ namespace NzbDrone.Core.Test.IndexerTests.BroadcastheNetTests
query.Tvrage.Should().BeNull(); query.Tvrage.Should().BeNull();
query.Search.Should().BeNull(); query.Search.Should().BeNull();
query.Category.Should().Be("Episode"); query.Category.Should().Be("Episode");
query.Name.Should().Be("2023.01.03"); query.Name.Should().Be("2023.01.03%");
} }
[Test] [Test]
@@ -275,7 +275,7 @@ namespace NzbDrone.Core.Test.IndexerTests.BroadcastheNetTests
query.Tvrage.Should().BeNull(); query.Tvrage.Should().BeNull();
query.Search.Should().Be("The%Late%Show%with%Stephen%Colbert"); query.Search.Should().Be("The%Late%Show%with%Stephen%Colbert");
query.Category.Should().Be("Episode"); 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) private static BroadcastheNetTorrentQuery ParseTorrentQueryFromRequest(HttpRequest httpRequest)
@@ -26,15 +26,15 @@ namespace NzbDrone.Core.Test.IndexerTests.HDBitsTests
[SetUp] [SetUp]
public void Setup() public void Setup()
{ {
Subject.Definition = new IndexerDefinition() Subject.Definition = new IndexerDefinition
{ {
Name = "HdBits", Name = "HdBits",
Settings = new HDBitsSettings() { ApiKey = "fakekey" } Settings = new HDBitsSettings { ApiKey = "fakekey" }
}; };
_movieSearchCriteria = new MovieSearchCriteria _movieSearchCriteria = new MovieSearchCriteria
{ {
Categories = new int[] { 2000, 2010 }, Categories = new[] { 2000, 2010 },
ImdbId = "0076759" ImdbId = "0076759"
}; };
} }
@@ -52,7 +52,7 @@ namespace NzbDrone.Core.Test.IndexerTests.HDBitsTests
var torrents = (await Subject.Fetch(_movieSearchCriteria)).Releases; var torrents = (await Subject.Fetch(_movieSearchCriteria)).Releases;
torrents.Should().HaveCount(2); torrents.Should().HaveCount(2);
torrents.First().Should().BeOfType<HDBitsInfo>(); torrents.First().Should().BeOfType<TorrentInfo>();
var first = torrents.First() as TorrentInfo; var first = torrents.First() as TorrentInfo;
@@ -83,17 +83,18 @@ namespace NzbDrone.Core.Test.IndexerTests.NewznabTests
bookCats.Should().Contain("8000"); bookCats.Should().Contain("8000");
} }
[Test] [TestCase(5070)]
public void should_find_sub_categories_as_main_categories() [TestCase(2020)]
public void should_find_sub_categories_as_main_categories(int category)
{ {
GivenCapsResponse(ReadAllText("Files/Indexers/Torznab/torznab_animetosho_caps.xml")); GivenCapsResponse(ReadAllText("Files/Indexers/Torznab/torznab_animetosho_caps.xml"));
var caps = Subject.GetCapabilities(_settings, _definition); var caps = Subject.GetCapabilities(_settings, _definition);
var bookCats = caps.Categories.MapTrackerCatToNewznab("5070"); var indexerCategories = caps.Categories.MapTrackerCatToNewznab(category.ToString());
bookCats.Count.Should().Be(2); indexerCategories.Count.Should().Be(2);
bookCats.First().Id.Should().Be(5070); indexerCategories.First().Id.Should().Be(category);
} }
[Test] [Test]
@@ -50,7 +50,7 @@ namespace NzbDrone.Core.Test.IndexerTests.PTPTests
first.Guid.Should().Be("PassThePopcorn-452135"); first.Guid.Should().Be("PassThePopcorn-452135");
first.Title.Should().Be("The.Night.Of.S01.BluRay.AAC2.0.x264-DEPTH"); first.Title.Should().Be("The.Night.Of.S01.BluRay.AAC2.0.x264-DEPTH");
first.DownloadProtocol.Should().Be(DownloadProtocol.Torrent); 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.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 //first.PublishDate.Should().Be(DateTime.Parse("2017-04-17T12:13:42+0000").ToUniversalTime()); stupid timezones
@@ -46,8 +46,8 @@ namespace NzbDrone.Core.Test.IndexerTests.RedactedTests
torrentInfo.Title.Should().Be("Red Hot Chili Peppers - Californication (1999) [Album] [US / Reissue 2020] [FLAC 24bit Lossless / Vinyl]"); torrentInfo.Title.Should().Be("Red Hot Chili Peppers - Californication (1999) [Album] [US / Reissue 2020] [FLAC 24bit Lossless / Vinyl]");
torrentInfo.DownloadProtocol.Should().Be(DownloadProtocol.Torrent); torrentInfo.DownloadProtocol.Should().Be(DownloadProtocol.Torrent);
torrentInfo.DownloadUrl.Should().Be("https://redacted.ch/ajax.php?action=download&id=3892313"); torrentInfo.DownloadUrl.Should().Be("https://redacted.sh/ajax.php?action=download&id=3892313");
torrentInfo.InfoUrl.Should().Be("https://redacted.ch/torrents.php?id=16720&torrentid=3892313"); torrentInfo.InfoUrl.Should().Be("https://redacted.sh/torrents.php?id=16720&torrentid=3892313");
torrentInfo.CommentUrl.Should().BeNullOrEmpty(); torrentInfo.CommentUrl.Should().BeNullOrEmpty();
torrentInfo.Indexer.Should().Be(Subject.Definition.Name); torrentInfo.Indexer.Should().Be(Subject.Definition.Name);
torrentInfo.PublishDate.Should().Be(DateTime.Parse("2022-12-17 08:02:35")); torrentInfo.PublishDate.Should().Be(DateTime.Parse("2022-12-17 08:02:35"));
@@ -1,12 +1,11 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>net6.0</TargetFrameworks> <TargetFrameworks>net8.0</TargetFrameworks>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Dapper" Version="2.0.151" /> <PackageReference Include="Dapper" Version="2.1.66" />
<PackageReference Include="NBuilder" Version="6.1.0" /> <PackageReference Include="NBuilder" Version="6.1.0" />
<PackageReference Include="System.Data.SQLite.Core.Servarr" Version="1.0.115.5-18" /> <PackageReference Include="YamlDotNet" Version="16.3.0" />
<PackageReference Include="YamlDotNet" Version="13.1.1" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\NzbDrone.Test.Common\Prowlarr.Test.Common.csproj" /> <ProjectReference Include="..\NzbDrone.Test.Common\Prowlarr.Test.Common.csproj" />
@@ -16,7 +16,7 @@ namespace NzbDrone.Core.Applications
protected readonly IAppIndexerMapService _appIndexerMapService; protected readonly IAppIndexerMapService _appIndexerMapService;
protected readonly Logger _logger; 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; } public abstract string Name { get; }
@@ -53,7 +53,7 @@ namespace NzbDrone.Core.Applications
foreach (var application in applications) foreach (var application in applications)
{ {
if (blockedApplications.TryGetValue(application.Definition.Id, out var blockedApplicationStatus)) if (blockedApplications.TryGetValue(application.Definition.Id, out var blockedApplicationStatus) && blockedApplicationStatus.DisabledTill.HasValue)
{ {
_logger.Debug("Temporarily ignoring application {0} till {1} due to recent failures.", application.Definition.Name, blockedApplicationStatus.DisabledTill.Value.ToLocalTime()); _logger.Debug("Temporarily ignoring application {0} till {1} due to recent failures.", application.Definition.Name, blockedApplicationStatus.DisabledTill.Value.ToLocalTime());
continue; continue;
@@ -19,7 +19,7 @@ namespace NzbDrone.Core.Applications.LazyLibrarian
public class LazyLibrarianSettings : IApplicationSettings public class LazyLibrarianSettings : IApplicationSettings
{ {
private static readonly LazyLibrarianSettingsValidator Validator = new (); private static readonly LazyLibrarianSettingsValidator Validator = new();
public LazyLibrarianSettings() public LazyLibrarianSettings()
{ {
@@ -121,9 +121,16 @@ namespace NzbDrone.Core.Applications.Lidarr
{ {
var indexerCapabilities = GetIndexerCapabilities(indexer); 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()) 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; return;
} }
@@ -178,7 +185,8 @@ namespace NzbDrone.Core.Applications.Lidarr
{ {
_logger.Debug("Syncing remote indexer with current settings"); _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 // Retain user fields not-affiliated with Prowlarr
lidarrIndexer.Fields.AddRange(remoteIndexer.Fields.Where(f => lidarrIndexer.Fields.All(s => s.Name != f.Name))); 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); _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); _logger.Debug("Remote indexer not found, re-adding {0} [{1}] to Lidarr", indexer.Name, indexer.Id);
lidarrIndexer.Id = 0; lidarrIndexer.Id = 0;
@@ -18,7 +18,7 @@ namespace NzbDrone.Core.Applications.Lidarr
public class LidarrSettings : IApplicationSettings public class LidarrSettings : IApplicationSettings
{ {
private static readonly LidarrSettingsValidator Validator = new (); private static readonly LidarrSettingsValidator Validator = new();
public LidarrSettings() public LidarrSettings()
{ {
@@ -23,7 +23,7 @@ namespace NzbDrone.Core.Applications.Lidarr
public class LidarrV1Proxy : ILidarrV1Proxy 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 AppApiRoute = "/api/v1";
private const string AppIndexerApiRoute = $"{AppApiRoute}/indexer"; private const string AppIndexerApiRoute = $"{AppApiRoute}/indexer";

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