Compare commits

...

117 Commits

Author SHA1 Message Date
Daniel Jacobs
c687bdb1fb Fixed: Don't send limit=0 to Newznab indexers (#2654)
* Fixed: Don't send limit=0 to Newznab indexers

When searching via the internal API, SearchResource.Limit defaults
to 0 because it's a non-nullable int. This gets passed through to
the Newznab request generator, which emits &limit=0 in the query URL.

Indexers that follow the Newznab spec honor limit=0 literally and
return zero results. Confirmed affected: DrunkenSlug and NZBGeek.

Changed Limit and Offset on SearchResource to int? so they default
to null when omitted, matching the existing behavior in NewznabRequest.
Also guard against emitting limit=0 in the request
generators.

Co-authored-by: Daniel Jacobs <danielj@certida.com>
Co-authored-by: Bogdan <mynameisbogdan@users.noreply.github.com>
2026-04-11 11:18:29 +02:00
ilike2burnthing
b2d49164bc Fixed: (ZonaQ) Obsolete per site policy 2026-04-08 21:31:22 +02:00
ilike2burnthing
28bd80d3aa Fixed: (SceneTime) Obsolete - migrated to YAML for Torznab API 2026-04-08 21:27:54 +02:00
RobinDadswell
0ffcfccf1d Version bump to 2.3.6 2026-04-02 20:50:24 +01:00
Bogdan
3c4efa0226 Update browserlist db 2026-03-30 14:01:13 +01:00
Mark McDowall
50d31d0c5e Fixed: Downloading backups when path contains a trailing slash
(cherry picked from commit 31c7647eacb3c3a50e55550880287e00302a9881)
2026-03-30 14:01:13 +01:00
Mark McDowall
f48c9f9f88 Improve HTTP file mappers
(cherry picked from commit f30207c3d130c1a37f29e214101c8ec9613d18ee)
2026-03-30 14:01:13 +01:00
Mark McDowall
1ba2f26649 New: Use instance name in PWA manifest
(cherry picked from commit 1fcfb88d2aa0126c4b3c878c8e310311ea57d04d)
2026-03-30 14:01:13 +01:00
Mark McDowall
c880b6c09c Fixed: PWA Manifest with URL base
(cherry picked from commit aedcd046fc4fc621dae4b231cc80d4b269a69177)
2026-03-30 14:01:13 +01:00
Bogdan
6fca0d0b6c Sync static resource mapper with upstream 2026-03-30 14:01:13 +01:00
Mark McDowall
9907342055 Close issues that don't follow issue templates
(cherry picked from commit c8f15ae1989cfb7d83cc580409a972e9fdd44a7c)
2026-03-29 11:47:37 +01:00
Auggie
71d1a59008 chore: Fix Innosetup download URI and bump Innosetup version 2026-03-29 01:34:30 +01:00
Bogdan
33fa39dc84 Fixed: (SceneTime) Update layout selectors 2026-03-29 00:36:43 +01:00
Auggie
d133c82537 Revert incorrectly deleted function in MigrationExtension 2026-03-29 00:35:53 +01:00
Auggie
6b446e1404 chore: Clean up unused NuGet dependencies 2026-03-28 14:24:34 +01:00
Bogdan
b0e879da5c fixed: Loading native libraries on FreeBSD and Linux 2026-03-28 14:24:04 +01:00
Bogdan
5edde8d9bd Switch to FluentMigrator.Runner.Core to avoid extranous platform runners 2026-03-24 20:14:46 +01:00
Bogdan
ef5d670c39 Fallback to host sqlite3 on FreeBSD and Linux 2026-03-24 20:13:46 +01:00
Bogdan
f568906876 Bump FluentMigrator to official 6.2.0 2026-03-24 20:13:46 +01:00
Auggie
331e92ac62 Bump to 2.3.5 2026-03-22 21:21:21 +01:00
Weblate
ec46b25be2 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: 康小广 <kenkangxgwe@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/
Translation: Servarr/Prowlarr
2026-03-22 01:33:26 +01:00
Bogdan
8b3837cb6e Fixed: Parsing URLs on some systems due to Locale 2026-03-15 00:59:58 +01:00
Weblate
ade5aee4a9 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Jurrendel van Delden <wieiscool@hotmail.com>
Co-authored-by: Lizandra Candido da Silva <lizandra.c.s@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Whoman <whoman0981@proton.me>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ro/
Translation: Servarr/Prowlarr
2026-03-15 00:55:28 +01:00
Bogdan
c486013113 Fixed: (SceneTime) Update layout selectors and clean titles 2026-03-15 00:49:51 +01:00
Bogdan
c512cafb4a New: Add AnimeZ 2026-03-15 00:49:39 +01:00
Auggie
454641e8b5 Bump to 2.3.4 2026-03-15 00:49:20 +01:00
Bogdan
7cac3fc174 Fixed: (Nebulance) Update API call 2026-03-13 19:03:52 +01:00
Weblate
43aca69840 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Andreu Punsola Soler <andreu4ps@gmail.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Jonas <Sjokoladeergodt@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: ugyes <ferenc.bodi@live.com>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ca/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hu/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nb_NO/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/
Translation: Servarr/Prowlarr
2026-03-08 00:09:33 +01:00
Auggie
e8d4415a5c fixed: (Scenetime) fix table selectors 2026-03-08 00:08:03 +01:00
Mark McDowall
5858c2dda6 Fixed: Limit redirects after login to local paths
(cherry picked from commit 14005d8d1054eafaba808337a109d5812f3e79e6)
2026-03-05 18:37:56 +00:00
retrodadson
ce315afb2a Updated Security Policy to match Radarr
Updated Security Policy to match Radarr
2026-03-05 08:57:45 +00:00
Bogdan
407acb6844 Shazbat fixes for searching and relogin if needed (#2607)
* Fixed: (Shazbat) Update searching

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

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

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

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

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

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

* fixup!

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

---------

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

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

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

This reverts commit f67c672ec7.

Revert "Add exclusive only"

This reverts commit 80425f5ea4.

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

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

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

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

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

fixes #2431

* Fixed: Rename onToggleFilters to handleToggleFilters

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

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

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

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

* fix tests

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

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

This reverts commit fe198352a3.

* AuthPolicy Var fixes
2025-07-02 10:10:40 -05:00
Mark McDowall
54918e0c30 Change authentication to Forms if set to Basic
(cherry picked from commit 8e08b0cc3df904d39da5be38bc345cc701412a9d)
2025-06-28 09:29:52 -05:00
Bogdan
01dd793c0a Bump version to 2.0.1 2025-06-15 09:25:06 +03:00
144 changed files with 4427 additions and 1681 deletions

View File

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

View File

@@ -0,0 +1,26 @@
name: Close issues without labels
on:
issues:
types:
- opened
- reopened
jobs:
close-issue:
runs-on: ubuntu-latest
permissions:
issues: write
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
sparse-checkout: |
.github
- name: Close issue if no labels found
if: join(github.event.issue.labels) == ''
run: |
gh issue comment ${{ github.event.issue.number }} --body ":wave: @${{ github.event.issue.user.login }}, this issue was closed automatically because it was created without following an issue template. Please update the issue following the correct template for this issue. Once updated please reply to this issue so we can review and re-open. In the future, use the [issue templates](https://github.com/${{ github.repository }}/issues/new/choose) instead of creating your own."
gh issue close ${{ github.event.issue.number }} --reason "not planned"
env:
GH_TOKEN: ${{ github.token }}

8
SECURITY.md Normal file
View File

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

View File

@@ -9,7 +9,7 @@ variables:
testsFolder: './_tests'
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
majorVersion: '2.0.0'
majorVersion: '2.3.6'
minorVersion: $[counter('minorVersion', 1)]
prowlarrVersion: '$(majorVersion).$(minorVersion)'
buildName: '$(Build.SourceBranchName).$(prowlarrVersion)'
@@ -17,10 +17,10 @@ variables:
sentryUrl: 'https://sentry.servarr.com'
dotnetVersion: '8.0.405'
nodeVersion: '20.X'
innoVersion: '6.2.2'
windowsImage: 'windows-2022'
linuxImage: 'ubuntu-22.04'
macImage: 'macOS-13'
innoVersion: '6.7.1'
windowsImage: 'windows-2025'
linuxImage: 'ubuntu-24.04'
macImage: 'macOS-15'
trigger:
branches:
@@ -1158,7 +1158,7 @@ stages:
extraProperties: |
sonar.exclusions=**/obj/**,**/*.dll,**/NzbDrone.Core.Test/Files/**/*,./frontend/**,**/ExternalModules/**,./src/Libraries/**
sonar.coverage.exclusions=**/Prowlarr.Api.V1/**/*
sonar.cs.opencover.reportsPaths=$(Build.SourcesDirectory)/CoverageResults/**/coverage.opencover.xml
sonar.cs.cobertura.reportsPaths=$(Build.SourcesDirectory)/CoverageResults/**/coverage.cobertura.xml
sonar.cs.nunit.reportsPaths=$(Build.SourcesDirectory)/TestResult.xml
- bash: |
./build.sh --backend -f net8.0 -r win-x64
@@ -1170,10 +1170,11 @@ stages:
- task: reportgenerator@5
displayName: Generate Coverage Report
inputs:
reports: '$(Build.SourcesDirectory)/CoverageResults/**/coverage.opencover.xml'
reports: '$(Build.SourcesDirectory)/CoverageResults/**/coverage.cobertura.xml'
targetdir: '$(Build.SourcesDirectory)/CoverageResults/combined'
reporttypes: 'HtmlInline_AzurePipelines;Cobertura;Badges'
publishCodeCoverageResults: true
sourcedirs: src
- stage: Report_Out
dependsOn:

View File

@@ -253,8 +253,10 @@ InstallInno()
{
ProgressStart "Installing portable Inno Setup"
INNOVERSION=${INNOVERSION:-6.7.1}
rm -rf _inno
curl -s --output innosetup.exe "https://files.jrsoftware.org/is/6/innosetup-${INNOVERSION:-6.2.2}.exe"
curl -s -L --output innosetup.exe "https://github.com/jrsoftware/issrc/releases/download/is-${INNOVERSION//./_}/innosetup-${INNOVERSION}.exe"
mkdir _inno
./innosetup.exe //portable=1 //silent //currentuser //dir=.\\_inno
rm innosetup.exe

View File

@@ -133,6 +133,12 @@ module.exports = (env) => {
{
source: 'frontend/src/Content/robots.txt',
destination: path.join(distFolder, 'Content/robots.txt')
},
// manifest.json and browserconfig.xml
{
source: 'frontend/src/Content/*.(json|xml)',
destination: path.join(distFolder, 'Content')
}
]
}

View File

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

View File

@@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<browserconfig>
<msapplication>
<tile>
<square150x150logo src="/Content/Images/Icons/mstile-150x150.png"/>
<TileColor>#00ccff</TileColor>
</tile>
</msapplication>
</browserconfig>

View File

@@ -1,19 +0,0 @@
{
"name": "Prowlarr",
"icons": [
{
"src": "android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "android-chrome-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
],
"start_url": "../../../../",
"theme_color": "#3a3f51",
"background_color": "#3a3f51",
"display": "standalone"
}

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<browserconfig>
<msapplication>
<tile>
<square150x150logo src="__URL_BASE__/Content/Images/Icons/mstile-150x150.png" />
<TileColor>
#00ccff
</TileColor>
</tile>
</msapplication>
</browserconfig>

View File

@@ -0,0 +1,19 @@
{
"name": "__INSTANCE_NAME__",
"icons": [
{
"src": "android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "android-chrome-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
],
"start_url": "__URL_BASE__/",
"theme_color": "#3a3f51",
"background_color": "#3a3f51",
"display": "standalone"
}

View File

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

View File

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

View File

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

View File

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

View File

@@ -33,7 +33,7 @@
sizes="16x16"
href="/Content/Images/Icons/favicon-16x16.png"
/>
<link rel="manifest" href="/Content/Images/Icons/manifest.json" crossorigin="use-credentials" />
<link rel="manifest" href="/Content/manifest.json" crossorigin="use-credentials" />
<link
rel="mask-icon"
href="/Content/Images/Icons/safari-pinned-tab.svg"
@@ -47,7 +47,7 @@
/>
<meta
name="msapplication-config"
content="/Content/Images/Icons/browserconfig.xml"
content="/Content/browserconfig.xml"
/>
<link rel="stylesheet" type="text/css" href="/Content/Fonts/fonts.css">

View File

@@ -11,8 +11,11 @@
<!-- Android/Apple Phone -->
<meta name="mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="format-detection" content="telephone=no">
<meta
name="apple-mobile-web-app-status-bar-style"
content="black-translucent"
/>
<meta name="format-detection" content="telephone=no" />
<meta name="description" content="Prowlarr" />
@@ -33,7 +36,11 @@
sizes="16x16"
href="/Content/Images/Icons/favicon-16x16.png"
/>
<link rel="manifest" href="/Content/Images/Icons/manifest.json" crossorigin="use-credentials" />
<link
rel="manifest"
href="/Content/manifest.json"
crossorigin="use-credentials"
/>
<link
rel="mask-icon"
href="/Content/Images/Icons/safari-pinned-tab.svg"
@@ -45,10 +52,7 @@
href="/favicon.ico"
data-no-hash
/>
<meta
name="msapplication-config"
content="/Content/Images/Icons/browserconfig.xml"
/>
<meta name="msapplication-config" content="/Content/browserconfig.xml" />
<link rel="stylesheet" type="text/css" href="/Content/styles.css" />
<link rel="stylesheet" type="text/css" href="/Content/Fonts/fonts.css" />
@@ -59,7 +63,7 @@
body {
background-color: var(--pageBackground);
color: var(--textColor);
font-family: "Roboto", "open sans", "Helvetica Neue", Helvetica, Arial,
font-family: 'Roboto', 'open sans', 'Helvetica Neue', Helvetica, Arial,
sans-serif;
}
@@ -209,9 +213,7 @@
</div>
<div class="panel-body">
<div class="sign-in">
SIGN IN TO CONTINUE
</div>
<div class="sign-in">SIGN IN TO CONTINUE</div>
<form
role="form"
@@ -230,8 +232,8 @@
pattern=".{1,}"
required
title="User name is required"
autoFocus="true"
autoCapitalize="false"
autofocus="true"
autocapitalize="false"
/>
</div>
@@ -282,16 +284,16 @@
</body>
<script type="text/javascript">
var yearSpan = document.getElementById("year");
yearSpan.innerHTML = "2010-" + new Date().getFullYear();
var yearSpan = document.getElementById('year');
yearSpan.innerHTML = '2010-' + new Date().getFullYear();
var copyDiv = document.getElementById("copy");
copyDiv.classList.remove("hidden");
var copyDiv = document.getElementById('copy');
copyDiv.classList.remove('hidden');
if (window.location.search.indexOf("loginFailed=true") > -1) {
var loginFailedDiv = document.getElementById("login-failed");
if (window.location.search.indexOf('loginFailed=true') > -1) {
var loginFailedDiv = document.getElementById('login-failed');
loginFailedDiv.classList.remove("hidden");
loginFailedDiv.classList.remove('hidden');
}
var light = {
@@ -311,7 +313,7 @@
primaryHoverBorderColor: '#3483e7',
failedColor: '#f05050',
forgotPasswordColor: '#909fa7',
forgotPasswordAltColor: '#748690'
forgotPasswordAltColor: '#748690',
};
var dark = {
@@ -331,21 +333,16 @@
primaryHoverBorderColor: '#3483e7',
failedColor: '#f05050',
forgotPasswordColor: '#737d83',
forgotPasswordAltColor: '#546067'
forgotPasswordAltColor: '#546067',
};
var theme = "_THEME_";
var theme = '_THEME_';
var defaultDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
var finalTheme = theme === 'dark' || (theme === 'auto' && defaultDark) ?
dark :
light;
var finalTheme =
theme === 'dark' || (theme === 'auto' && defaultDark) ? dark : light;
Object.entries(finalTheme).forEach(([key, value]) => {
document.documentElement.style.setProperty(
`--${key}`,
value
);
document.documentElement.style.setProperty(`--${key}`, value);
});
</script>
</html>

View File

@@ -84,7 +84,7 @@
<Deterministic Condition="$(AssemblyVersion.EndsWith('*'))">False</Deterministic>
<PathMap>$(MSBuildProjectDirectory)=./$(MSBuildProjectName)/</PathMap>
<PathMap>$(MSBuildThisFileDirectory)=./</PathMap>
</PropertyGroup>
<!-- Set the AssemblyConfiguration attribute for projects -->
@@ -123,14 +123,11 @@
<!-- Standard testing packages -->
<ItemGroup Condition="'$(TestProject)'=='true'">
<PackageReference Include="coverlet.collector" Version="6.0.4" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.10.0" />
<PackageReference Include="NUnit" Version="3.14.0" />
<PackageReference Include="NUnit3TestAdapter" Version="4.2.1" />
<PackageReference Include="NunitXml.TestLogger" Version="3.0.131" />
</ItemGroup>
<ItemGroup Condition="'$(TestProject)'=='true' and '$(TargetFramework)'=='net8.0'">
<PackageReference Include="coverlet.collector" Version="3.0.4-preview.27.ge7cb7c3b40" />
<PackageReference Include="NUnit3TestAdapter" Version="5.1.0" />
<PackageReference Include="NunitXml.TestLogger" Version="3.1.20" />
</ItemGroup>
<PropertyGroup Condition="'$(ProwlarrProject)'=='true' and '$(EnableAnalyzers)'=='false'">

View File

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

View File

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

View File

@@ -14,7 +14,6 @@ namespace NzbDrone.Common.Composition
static AssemblyLoader()
{
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(ContainerResolveEventHandler);
RegisterSQLiteResolver();
}
public static IList<Assembly> Load(IList<string> assemblyNames)
@@ -23,6 +22,10 @@ namespace NzbDrone.Common.Composition
toLoad.Add("Prowlarr.Common");
toLoad.Add(OsInfo.IsWindows ? "Prowlarr.Windows" : "Prowlarr.Mono");
var toRegisterResolver = new List<string> { "System.Data.SQLite" };
toRegisterResolver.AddRange(assemblyNames.Intersect(new[] { "Prowlarr.Core" }));
RegisterNativeResolver(toRegisterResolver);
var startupPath = AppDomain.CurrentDomain.BaseDirectory;
return toLoad
@@ -43,27 +46,46 @@ namespace NzbDrone.Common.Composition
return AssemblyLoadContext.Default.LoadFromAssemblyPath(assemblyPath);
}
public static void RegisterSQLiteResolver()
public static void RegisterNativeResolver(IEnumerable<string> assemblyNames)
{
// This ensures we look for sqlite3 using libsqlite3.so.0 on Linux and not libsqlite3.so which
// is less likely to exist.
var sqliteAssembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "System.Data.SQLite.dll"));
foreach (var name in assemblyNames)
{
// This ensures we look for sqlite3 using libsqlite3.so.0 on Linux and not libsqlite3.so which
// is less likely to exist.
var assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"{name}.dll"));
try
{
NativeLibrary.SetDllImportResolver(sqliteAssembly, LoadSqliteNativeLib);
}
catch (InvalidOperationException)
{
// This can only be set once per assembly
// Catch required for NzbDrone.Host tests
try
{
NativeLibrary.SetDllImportResolver(assembly, LoadNativeLib);
}
catch (InvalidOperationException)
{
// This can only be set once per assembly
// Catch required for NzbDrone.Host tests
}
}
}
private static IntPtr LoadSqliteNativeLib(string libraryName, Assembly assembly, DllImportSearchPath? dllImportSearchPath)
private static IntPtr LoadNativeLib(string libraryName, Assembly assembly, DllImportSearchPath? dllImportSearchPath)
{
var mappedName = OsInfo.IsLinux && libraryName == "sqlite3" ? "libsqlite3.so.0" : libraryName;
ArgumentException.ThrowIfNullOrWhiteSpace(libraryName);
var mappedName = libraryName;
if (libraryName is "sqlite3" or "e_sqlite3")
{
if (OsInfo.IsLinux)
{
if (NativeLibrary.TryLoad(libraryName, assembly, dllImportSearchPath, out var libHandle))
{
return libHandle;
}
mappedName = "libsqlite3.so.0";
}
}
return NativeLibrary.Load(mappedName, assembly, dllImportSearchPath);
}
}

View File

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

View File

@@ -6,13 +6,14 @@ using NzbDrone.Common.Extensions;
namespace NzbDrone.Common.Http
{
public class HttpUri : IEquatable<HttpUri>
public partial class HttpUri : IEquatable<HttpUri>
{
private static readonly Regex RegexUri = new Regex(@"^(?:(?<scheme>[a-z]+):)?(?://(?<host>[-_A-Z0-9.]+|\[[[A-F0-9:]+\])(?::(?<port>[0-9]{1,5}))?)?(?<path>(?:(?:(?<=^)|/+)[^/?#\r\n]+)+/*|/+)?(?:\?(?<query>[^#\r\n]*))?(?:\#(?<fragment>.*))?$", RegexOptions.Compiled | RegexOptions.IgnoreCase);
private readonly string _uri;
public string FullUri => _uri;
[GeneratedRegex(@"^(?:(?<scheme>[a-z]+):)?(?://(?<host>[-_A-Z0-9.]+|\[[[A-F0-9:]+\])(?::(?<port>[0-9]{1,5}))?)?(?<path>(?:(?:(?<=^)|/+)[^/?#\r\n]+)+/*|/+)?(?:\?(?<query>[^#\r\n]*))?(?:\#(?<fragment>.*))?$", RegexOptions.IgnoreCase | RegexOptions.Compiled)]
private static partial Regex UriRegex();
public HttpUri(string uri)
{
_uri = uri ?? string.Empty;
@@ -70,9 +71,9 @@ namespace NzbDrone.Common.Http
private void Parse()
{
var parseSuccess = Uri.TryCreate(_uri, UriKind.RelativeOrAbsolute, out var uri);
var parseSuccess = Uri.TryCreate(_uri, UriKind.RelativeOrAbsolute, out _);
var match = RegexUri.Match(_uri);
var match = UriRegex().Match(_uri);
var scheme = match.Groups["scheme"];
var host = match.Groups["host"];

View File

@@ -202,6 +202,7 @@ namespace NzbDrone.Common.Instrumentation
c.ForLogger("Microsoft.*").WriteToNil(LogLevel.Warn);
c.ForLogger("Microsoft.Hosting.Lifetime*").WriteToNil(LogLevel.Info);
c.ForLogger("Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware").WriteToNil(LogLevel.Fatal);
c.ForLogger("Prowlarr.Http.Authentication.ApiKeyAuthenticationHandler").WriteToNil(LogLevel.Info);
});
}

View File

@@ -8,7 +8,7 @@
<PackageReference Include="IPAddressRange" Version="6.2.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="8.0.1" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
<PackageReference Include="NLog" Version="5.4.0" />
<PackageReference Include="NLog.Layouts.ClefJsonLayout" Version="1.0.3" />
<PackageReference Include="NLog.Extensions.Logging" Version="5.4.0" />
@@ -16,9 +16,11 @@
<PackageReference Include="Sentry" Version="4.0.2" />
<PackageReference Include="NLog.Targets.Syslog" Version="7.0.0" />
<PackageReference Include="SharpZipLib" Version="1.4.2" />
<PackageReference Include="System.Text.Json" Version="8.0.5" />
<PackageReference Include="SourceGear.sqlite3" Version="3.50.4.2" />
<PackageReference Include="System.Data.SQLite" Version="2.0.2" />
<PackageReference Include="System.Private.Uri" Version="4.3.2" />
<PackageReference Include="System.Text.Json" Version="8.0.6" />
<PackageReference Include="System.ValueTuple" Version="4.6.1" />
<PackageReference Include="System.Data.SQLite.Core.Servarr" Version="1.0.115.5-18" />
<PackageReference Include="System.Configuration.ConfigurationManager" Version="8.0.1" />
<PackageReference Include="System.IO.FileSystem.AccessControl" Version="5.0.0" />
<PackageReference Include="System.Runtime.Loader" Version="4.3.0" />

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -5,7 +5,6 @@
<ItemGroup>
<PackageReference Include="Dapper" Version="2.1.66" />
<PackageReference Include="NBuilder" Version="6.1.0" />
<PackageReference Include="System.Data.SQLite.Core.Servarr" Version="1.0.115.5-18" />
<PackageReference Include="YamlDotNet" Version="16.3.0" />
</ItemGroup>
<ItemGroup>

View File

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

View File

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

View File

@@ -49,7 +49,7 @@ namespace NzbDrone.Core.Datastore
JournalMode = OsInfo.IsOsx ? SQLiteJournalModeEnum.Truncate : SQLiteJournalModeEnum.Wal,
Pooling = true,
Version = 3,
BusyTimeout = 100
BusyTimeout = 1000
};
if (OsInfo.IsOsx)

View File

@@ -7,7 +7,7 @@ using NzbDrone.Common.Instrumentation;
namespace NzbDrone.Core.Datastore.Migration
{
[Maintenance(MigrationStage.BeforeAll, TransactionBehavior.None)]
public class DatabaseEngineVersionCheck : FluentMigrator.Migration
public class DatabaseEngineVersionCheck : ForwardOnlyMigration
{
protected readonly Logger _logger;
@@ -22,11 +22,6 @@ namespace NzbDrone.Core.Datastore.Migration
IfDatabase("postgres").Execute.WithConnection(LogPostgresVersion);
}
public override void Down()
{
// No-op
}
private void LogSqliteVersion(IDbConnection conn, IDbTransaction tran)
{
using (var versionCmd = conn.CreateCommand())

View File

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

View File

@@ -6,7 +6,6 @@ using FluentMigrator.Runner.Generators;
using FluentMigrator.Runner.Initialization;
using FluentMigrator.Runner.Processors;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using NLog;
using NLog.Extensions.Logging;
@@ -20,13 +19,10 @@ namespace NzbDrone.Core.Datastore.Migration.Framework
public class MigrationController : IMigrationController
{
private readonly Logger _logger;
private readonly ILoggerProvider _migrationLoggerProvider;
public MigrationController(Logger logger,
ILoggerProvider migrationLoggerProvider)
public MigrationController(Logger logger)
{
_logger = logger;
_migrationLoggerProvider = migrationLoggerProvider;
}
public void Migrate(string connectionString, MigrationContext migrationContext, DatabaseType databaseType)
@@ -35,16 +31,13 @@ namespace NzbDrone.Core.Datastore.Migration.Framework
_logger.Info("*** Migrating {0} ***", connectionString);
ServiceProvider serviceProvider;
var db = databaseType == DatabaseType.SQLite ? "sqlite" : "postgres";
serviceProvider = new ServiceCollection()
var serviceProvider = new ServiceCollection()
.AddLogging(b => b.AddNLog())
.AddFluentMigratorCore()
.Configure<RunnerOptions>(cfg => cfg.IncludeUntaggedMaintenances = true)
.ConfigureRunner(
builder => builder
.ConfigureRunner(builder => builder
.AddPostgres()
.AddNzbDroneSQLite()
.WithGlobalConnectionString(connectionString)

View File

@@ -1,11 +1,17 @@
using FluentMigrator;
using System.Data;
using FluentMigrator;
using FluentMigrator.Builders.Create;
using FluentMigrator.Builders.Create.Table;
using FluentMigrator.Runner;
using FluentMigrator.Runner.BatchParser;
using FluentMigrator.Runner.Generators;
using FluentMigrator.Runner.Generators.SQLite;
using FluentMigrator.Runner.Initialization;
using FluentMigrator.Runner.Processors;
using FluentMigrator.Runner.Processors.SQLite;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
namespace NzbDrone.Core.Datastore.Migration.Framework
{
@@ -16,23 +22,49 @@ namespace NzbDrone.Core.Datastore.Migration.Framework
return expressionRoot.Table(name).WithColumn("Id").AsInt32().PrimaryKey().Identity();
}
public static void AddParameter(this System.Data.IDbCommand command, object value)
public static IDbCommand CreateCommand(this IDbConnection conn, IDbTransaction tran, string query)
{
var command = conn.CreateCommand();
command.Transaction = tran;
command.CommandText = query;
return command;
}
public static void AddParameter(this IDbCommand command, object value)
{
var parameter = command.CreateParameter();
parameter.Value = value;
command.Parameters.Add(parameter);
}
public static IMigrationRunnerBuilder AddNzbDroneSQLite(this IMigrationRunnerBuilder builder)
public static IMigrationRunnerBuilder AddNzbDroneSQLite(this IMigrationRunnerBuilder builder, bool binaryGuid = false, bool useStrictTables = false)
{
builder.Services
.AddTransient<SQLiteBatchParser>()
.AddScoped<SQLiteDbFactory>()
.AddScoped<NzbDroneSQLiteProcessor>()
.AddScoped<NzbDroneSQLiteProcessor>(sp =>
{
var factory = sp.GetService<SQLiteDbFactory>();
var logger = sp.GetService<ILogger<NzbDroneSQLiteProcessor>>();
var options = sp.GetService<IOptionsSnapshot<ProcessorOptions>>();
var connectionStringAccessor = sp.GetService<IConnectionStringAccessor>();
var sqliteQuoter = new SQLiteQuoter(false);
return new NzbDroneSQLiteProcessor(factory, sp.GetService<SQLiteGenerator>(), logger, options, connectionStringAccessor, sp, sqliteQuoter);
})
.AddScoped<ISQLiteTypeMap>(_ => new NzbDroneSQLiteTypeMap(useStrictTables))
.AddScoped<IMigrationProcessor>(sp => sp.GetRequiredService<NzbDroneSQLiteProcessor>())
.AddScoped<SQLiteQuoter>()
.AddScoped<SQLiteGenerator>()
.AddScoped(
sp =>
{
var typeMap = sp.GetRequiredService<ISQLiteTypeMap>();
return new SQLiteGenerator(
new SQLiteQuoter(binaryGuid),
typeMap,
new OptionsWrapper<GeneratorOptions>(new GeneratorOptions()));
})
.AddScoped<IMigrationGenerator>(sp => sp.GetRequiredService<SQLiteGenerator>());
return builder;
}
}

View File

@@ -15,6 +15,8 @@ namespace NzbDrone.Core.Datastore.Migration.Framework
{
public class NzbDroneSQLiteProcessor : SQLiteProcessor
{
private readonly SQLiteQuoter _quoter;
public NzbDroneSQLiteProcessor(SQLiteDbFactory factory,
SQLiteGenerator generator,
ILogger<NzbDroneSQLiteProcessor> logger,
@@ -24,6 +26,7 @@ namespace NzbDrone.Core.Datastore.Migration.Framework
SQLiteQuoter quoter)
: base(factory, generator, logger, options, connectionStringAccessor, serviceProvider, quoter)
{
_quoter = quoter;
}
public override void Process(AlterColumnExpression expression)
@@ -35,7 +38,7 @@ namespace NzbDrone.Core.Datastore.Migration.Framework
if (columnIndex == -1)
{
throw new ApplicationException(string.Format("Column {0} does not exist on table {1}.", expression.Column.Name, expression.TableName));
throw new ApplicationException($"Column {expression.Column.Name} does not exist on table {expression.TableName}.");
}
columnDefinitions[columnIndex] = expression.Column;
@@ -45,6 +48,28 @@ namespace NzbDrone.Core.Datastore.Migration.Framework
ProcessAlterTable(tableDefinition);
}
public override void Process(AlterDefaultConstraintExpression expression)
{
var tableDefinition = GetTableSchema(expression.TableName);
var columnDefinitions = tableDefinition.Columns.ToList();
var columnIndex = columnDefinitions.FindIndex(c => c.Name == expression.ColumnName);
if (columnIndex == -1)
{
throw new ApplicationException($"Column {expression.ColumnName} does not exist on table {expression.TableName}.");
}
var changedColumn = columnDefinitions[columnIndex];
changedColumn.DefaultValue = expression.DefaultValue;
columnDefinitions[columnIndex] = changedColumn;
tableDefinition.Columns = columnDefinitions;
ProcessAlterTable(tableDefinition);
}
public override void Process(DeleteColumnExpression expression)
{
var tableDefinition = GetTableSchema(expression.TableName);
@@ -62,7 +87,7 @@ namespace NzbDrone.Core.Datastore.Migration.Framework
if (columnsToRemove.Any())
{
throw new ApplicationException(string.Format("Column {0} does not exist on table {1}.", columnsToRemove.First(), expression.TableName));
throw new ApplicationException($"Column {columnsToRemove.First()} does not exist on table {expression.TableName}.");
}
ProcessAlterTable(tableDefinition);
@@ -78,12 +103,12 @@ namespace NzbDrone.Core.Datastore.Migration.Framework
if (columnIndex == -1)
{
throw new ApplicationException(string.Format("Column {0} does not exist on table {1}.", expression.OldName, expression.TableName));
throw new ApplicationException($"Column {expression.OldName} does not exist on table {expression.TableName}.");
}
if (columnDefinitions.Any(c => c.Name == expression.NewName))
{
throw new ApplicationException(string.Format("Column {0} already exists on table {1}.", expression.NewName, expression.TableName));
throw new ApplicationException($"Column {expression.NewName} already exists on table {expression.TableName}.");
}
oldColumnDefinitions[columnIndex] = (ColumnDefinition)columnDefinitions[columnIndex].Clone();
@@ -128,21 +153,20 @@ namespace NzbDrone.Core.Datastore.Migration.Framework
}
// What is the cleanest way to do this? Add function to Generator?
var quoter = new SQLiteQuoter();
var columnsToInsert = string.Join(", ", tableDefinition.Columns.Select(c => quoter.QuoteColumnName(c.Name)));
var columnsToFetch = string.Join(", ", (oldColumnDefinitions ?? tableDefinition.Columns).Select(c => quoter.QuoteColumnName(c.Name)));
var columnsToInsert = string.Join(", ", tableDefinition.Columns.Select(c => _quoter.QuoteColumnName(c.Name)));
var columnsToFetch = string.Join(", ", (oldColumnDefinitions ?? tableDefinition.Columns).Select(c => _quoter.QuoteColumnName(c.Name)));
Process(new CreateTableExpression() { TableName = tempTableName, Columns = tableDefinition.Columns.ToList() });
Process(new CreateTableExpression { TableName = tempTableName, Columns = tableDefinition.Columns.ToList() });
Process(string.Format("INSERT INTO {0} ({1}) SELECT {2} FROM {3}", quoter.QuoteTableName(tempTableName), columnsToInsert, columnsToFetch, quoter.QuoteTableName(tableName)));
Process($"INSERT INTO {_quoter.QuoteTableName(tempTableName)} ({columnsToInsert}) SELECT {columnsToFetch} FROM {_quoter.QuoteTableName(tableName)}");
Process(new DeleteTableExpression() { TableName = tableName });
Process(new DeleteTableExpression { TableName = tableName });
Process(new RenameTableExpression() { OldName = tempTableName, NewName = tableName });
Process(new RenameTableExpression { OldName = tempTableName, NewName = tableName });
foreach (var index in tableDefinition.Indexes)
{
Process(new CreateIndexExpression() { Index = index });
Process(new CreateIndexExpression { Index = index });
}
}
}

View File

@@ -0,0 +1,76 @@
using System.Data;
using FluentMigrator.Runner.Generators.Base;
using FluentMigrator.Runner.Generators.SQLite;
namespace NzbDrone.Core.Datastore.Migration.Framework;
// Based on https://github.com/fluentmigrator/fluentmigrator/blob/v6.2.0/src/FluentMigrator.Runner.SQLite/Generators/SQLite/SQLiteTypeMap.cs
public sealed class NzbDroneSQLiteTypeMap : TypeMapBase, ISQLiteTypeMap
{
public bool UseStrictTables { get; }
public NzbDroneSQLiteTypeMap(bool useStrictTables = false)
{
UseStrictTables = useStrictTables;
SetupTypeMaps();
}
// Must be kept in sync with upstream
protected override void SetupTypeMaps()
{
SetTypeMap(DbType.Binary, "BLOB");
SetTypeMap(DbType.Byte, "INTEGER");
SetTypeMap(DbType.Int16, "INTEGER");
SetTypeMap(DbType.Int32, "INTEGER");
SetTypeMap(DbType.Int64, "INTEGER");
SetTypeMap(DbType.SByte, "INTEGER");
SetTypeMap(DbType.UInt16, "INTEGER");
SetTypeMap(DbType.UInt32, "INTEGER");
SetTypeMap(DbType.UInt64, "INTEGER");
if (!UseStrictTables)
{
SetTypeMap(DbType.Currency, "NUMERIC");
SetTypeMap(DbType.Decimal, "NUMERIC");
SetTypeMap(DbType.Double, "NUMERIC");
SetTypeMap(DbType.Single, "NUMERIC");
SetTypeMap(DbType.VarNumeric, "NUMERIC");
SetTypeMap(DbType.Date, "DATETIME");
SetTypeMap(DbType.DateTime, "DATETIME");
SetTypeMap(DbType.DateTime2, "DATETIME");
SetTypeMap(DbType.Time, "DATETIME");
SetTypeMap(DbType.Guid, "UNIQUEIDENTIFIER");
// Custom so that we can use DateTimeOffset in Postgres for appropriate DB typing
SetTypeMap(DbType.DateTimeOffset, "DATETIME");
}
else
{
SetTypeMap(DbType.Currency, "TEXT");
SetTypeMap(DbType.Decimal, "TEXT");
SetTypeMap(DbType.Double, "REAL");
SetTypeMap(DbType.Single, "REAL");
SetTypeMap(DbType.VarNumeric, "TEXT");
SetTypeMap(DbType.Date, "TEXT");
SetTypeMap(DbType.DateTime, "TEXT");
SetTypeMap(DbType.DateTime2, "TEXT");
SetTypeMap(DbType.Time, "TEXT");
SetTypeMap(DbType.Guid, "TEXT");
// Custom so that we can use DateTimeOffset in Postgres for appropriate DB typing
SetTypeMap(DbType.DateTimeOffset, "TEXT");
}
SetTypeMap(DbType.AnsiString, "TEXT");
SetTypeMap(DbType.String, "TEXT");
SetTypeMap(DbType.AnsiStringFixedLength, "TEXT");
SetTypeMap(DbType.StringFixedLength, "TEXT");
SetTypeMap(DbType.Boolean, "INTEGER");
}
public override string GetTypeMap(DbType type, int? size, int? precision)
{
return base.GetTypeMap(type, size: null, precision: null);
}
}

View File

@@ -120,7 +120,7 @@ namespace NzbDrone.Core.Datastore.Migration.Framework
column.IsPrimaryKey = upper.Contains("PRIMARY KEY");
column.IsIdentity = upper.Contains("AUTOINCREMENT");
column.IsNullable = !upper.Contains("NOT NULL") && !upper.Contains("PRIMARY KEY");
column.IsUnique = upper.Contains("UNIQUE") || upper.Contains("PRIMARY KEY");
column.IsUnique = upper.Contains("UNIQUE");
}
return column;

View File

@@ -424,8 +424,8 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
}
catch (HttpException ex)
{
_logger.Debug("qbitTorrent authentication failed.");
if (ex.Response.StatusCode == HttpStatusCode.Forbidden)
_logger.Debug(ex, "qbitTorrent authentication failed.");
if (ex.Response.StatusCode is HttpStatusCode.Unauthorized or HttpStatusCode.Forbidden)
{
throw new DownloadClientAuthenticationException("Failed to authenticate with qBittorrent.", ex);
}
@@ -437,9 +437,9 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
throw new DownloadClientUnavailableException("Failed to connect to qBittorrent, please check your settings.", ex);
}
if (response.Content != "Ok.")
// returns "Fails." on bad login
if (response.Content.IsNotNullOrWhiteSpace() && response.Content != "Ok.")
{
// returns "Fails." on bad login
_logger.Debug("qbitTorrent authentication failed.");
throw new DownloadClientAuthenticationException("Failed to authenticate with qBittorrent.");
}

View File

@@ -669,7 +669,7 @@ namespace NzbDrone.Core.Indexers.Definitions
{
var advancedSeasonRegex = new Regex(@"\b(?:(?<season>\d+)(?:st|nd|rd|th) Season|Season (?<season>\d+))\b", RegexOptions.Compiled | RegexOptions.IgnoreCase);
var seasonCharactersRegex = new Regex(@"(I{2,})$", RegexOptions.Compiled);
var seasonNumberRegex = new Regex(@"\b(?<!Part[- ._])(?<!\d[/])(?:S)?(?<season>[2-9])$", RegexOptions.Compiled);
var seasonNumberRegex = new Regex(@"\b(?<!(Part|No\.)[- ._])(?<!\d[/])(?<!\#)(?:S)?(?<season>[2-9])$", RegexOptions.Compiled);
foreach (var title in titles)
{

View File

@@ -1,341 +0,0 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text.RegularExpressions;
using AngleSharp.Html.Parser;
using NLog;
using NzbDrone.Common.Extensions;
using NzbDrone.Common.Http;
using NzbDrone.Core.Annotations;
using NzbDrone.Core.Configuration;
using NzbDrone.Core.Indexers.Exceptions;
using NzbDrone.Core.Indexers.Settings;
using NzbDrone.Core.IndexerSearch.Definitions;
using NzbDrone.Core.Messaging.Events;
using NzbDrone.Core.Parser;
using NzbDrone.Core.Parser.Model;
namespace NzbDrone.Core.Indexers.Definitions
{
public class AnimeTorrents : TorrentIndexerBase<AnimeTorrentsSettings>
{
public override string Name => "AnimeTorrents";
public override string[] IndexerUrls => new[] { "https://animetorrents.me/" };
public override string Description => "Definitive source for anime and manga";
public override IndexerPrivacy Privacy => IndexerPrivacy.Private;
public override bool SupportsPagination => true;
public override TimeSpan RateLimit => TimeSpan.FromSeconds(4);
public override IndexerCapabilities Capabilities => SetCapabilities();
public AnimeTorrents(IIndexerHttpClient httpClient, IEventAggregator eventAggregator, IIndexerStatusService indexerStatusService, IConfigService configService, Logger logger)
: base(httpClient, eventAggregator, indexerStatusService, configService, logger)
{
}
public override IIndexerRequestGenerator GetRequestGenerator()
{
return new AnimeTorrentsRequestGenerator(Settings, Capabilities);
}
public override IParseIndexerResponse GetParser()
{
return new AnimeTorrentsParser(Settings, Capabilities.Categories);
}
protected override bool CheckIfLoginNeeded(HttpResponse httpResponse)
{
if (httpResponse.Content.Contains("Access Denied!") || httpResponse.Content.Contains("login.php"))
{
throw new IndexerAuthException("AnimeTorrents authentication with cookies failed.");
}
return false;
}
protected override IDictionary<string, string> GetCookies()
{
return CookieUtil.CookieHeaderToDictionary(Settings.Cookie);
}
private IndexerCapabilities SetCapabilities()
{
var caps = new IndexerCapabilities
{
TvSearchParams = new List<TvSearchParam>
{
TvSearchParam.Q, TvSearchParam.Season, TvSearchParam.Ep
},
MovieSearchParams = new List<MovieSearchParam>
{
MovieSearchParam.Q
}
};
caps.Categories.AddCategoryMapping(1, NewznabStandardCategory.MoviesSD, "Anime Movie");
caps.Categories.AddCategoryMapping(6, NewznabStandardCategory.MoviesHD, "Anime Movie HD");
caps.Categories.AddCategoryMapping(2, NewznabStandardCategory.TVAnime, "Anime Series");
caps.Categories.AddCategoryMapping(7, NewznabStandardCategory.TVAnime, "Anime Series HD");
caps.Categories.AddCategoryMapping(5, NewznabStandardCategory.XXXDVD, "Hentai (censored)");
caps.Categories.AddCategoryMapping(9, NewznabStandardCategory.XXXDVD, "Hentai (censored) HD");
caps.Categories.AddCategoryMapping(4, NewznabStandardCategory.XXXDVD, "Hentai (un-censored)");
caps.Categories.AddCategoryMapping(8, NewznabStandardCategory.XXXDVD, "Hentai (un-censored) HD");
caps.Categories.AddCategoryMapping(13, NewznabStandardCategory.BooksForeign, "Light Novel");
caps.Categories.AddCategoryMapping(3, NewznabStandardCategory.BooksComics, "Manga");
caps.Categories.AddCategoryMapping(10, NewznabStandardCategory.BooksComics, "Manga 18+");
caps.Categories.AddCategoryMapping(11, NewznabStandardCategory.TVAnime, "OVA");
caps.Categories.AddCategoryMapping(12, NewznabStandardCategory.TVAnime, "OVA HD");
caps.Categories.AddCategoryMapping(14, NewznabStandardCategory.BooksComics, "Doujin Anime");
caps.Categories.AddCategoryMapping(15, NewznabStandardCategory.XXXDVD, "Doujin Anime 18+");
caps.Categories.AddCategoryMapping(16, NewznabStandardCategory.AudioForeign, "Doujin Music");
caps.Categories.AddCategoryMapping(17, NewznabStandardCategory.BooksComics, "Doujinshi");
caps.Categories.AddCategoryMapping(18, NewznabStandardCategory.BooksComics, "Doujinshi 18+");
caps.Categories.AddCategoryMapping(19, NewznabStandardCategory.Audio, "OST");
caps.Categories.AddCategoryMapping(20, NewznabStandardCategory.AudioAudiobook, "Audiobooks");
return caps;
}
}
public class AnimeTorrentsRequestGenerator : IIndexerRequestGenerator
{
private readonly AnimeTorrentsSettings _settings;
private readonly IndexerCapabilities _capabilities;
public AnimeTorrentsRequestGenerator(AnimeTorrentsSettings settings, IndexerCapabilities capabilities)
{
_settings = settings;
_capabilities = capabilities;
}
public IndexerPageableRequestChain GetSearchRequests(MovieSearchCriteria searchCriteria)
{
var pageableRequests = new IndexerPageableRequestChain();
var searchTerm = $"{searchCriteria.SanitizedSearchTerm}";
foreach (var category in GetTrackerCategories(searchTerm, searchCriteria))
{
pageableRequests.Add(GetPagedRequests(searchTerm, category, searchCriteria));
}
return pageableRequests;
}
public IndexerPageableRequestChain GetSearchRequests(MusicSearchCriteria searchCriteria)
{
var pageableRequests = new IndexerPageableRequestChain();
var searchTerm = $"{searchCriteria.SanitizedSearchTerm}";
foreach (var category in GetTrackerCategories(searchTerm, searchCriteria))
{
pageableRequests.Add(GetPagedRequests(searchTerm, category, searchCriteria));
}
return pageableRequests;
}
public IndexerPageableRequestChain GetSearchRequests(TvSearchCriteria searchCriteria)
{
var pageableRequests = new IndexerPageableRequestChain();
var searchTerm = $"{searchCriteria.SanitizedSearchTerm}";
foreach (var category in GetTrackerCategories(searchTerm, searchCriteria))
{
pageableRequests.Add(GetPagedRequests(searchTerm, category, searchCriteria));
}
return pageableRequests;
}
public IndexerPageableRequestChain GetSearchRequests(BookSearchCriteria searchCriteria)
{
var pageableRequests = new IndexerPageableRequestChain();
var searchTerm = $"{searchCriteria.SanitizedSearchTerm}";
foreach (var category in GetTrackerCategories(searchTerm, searchCriteria))
{
pageableRequests.Add(GetPagedRequests(searchTerm, category, searchCriteria));
}
return pageableRequests;
}
public IndexerPageableRequestChain GetSearchRequests(BasicSearchCriteria searchCriteria)
{
var pageableRequests = new IndexerPageableRequestChain();
var searchTerm = $"{searchCriteria.SanitizedSearchTerm}";
foreach (var category in GetTrackerCategories(searchTerm, searchCriteria))
{
pageableRequests.Add(GetPagedRequests(searchTerm, category, searchCriteria));
}
return pageableRequests;
}
private IEnumerable<IndexerRequest> GetPagedRequests(string term, string category, SearchCriteriaBase searchCriteria)
{
var searchUrl = _settings.BaseUrl + "ajax/torrents_data.php";
// replace non-word characters with % (wildcard)
var searchString = Regex.Replace(term.Trim(), @"[\W]+", "%");
var page = searchCriteria.Limit is > 0 && searchCriteria.Offset is > 0 ? (int)(searchCriteria.Offset / searchCriteria.Limit) + 1 : 1;
var refererUri = new HttpUri(_settings.BaseUrl)
.CombinePath("/torrents.php")
.AddQueryParam("cat", $"{category}");
if (_settings.DownloadableOnly)
{
refererUri = refererUri.AddQueryParam("dlable", "1");
}
var requestBuilder = new HttpRequestBuilder(searchUrl)
.AddQueryParam("total", "100") // Assuming the total number of pages
.AddQueryParam("cat", $"{category}")
.AddQueryParam("searchin", "filename")
.AddQueryParam("search", searchString)
.AddQueryParam("page", page)
.SetHeader("X-Requested-With", "XMLHttpRequest")
.SetHeader("Referer", refererUri.FullUri)
.Accept(HttpAccept.Html);
if (_settings.DownloadableOnly)
{
requestBuilder.AddQueryParam("dlable", "1");
}
yield return new IndexerRequest(requestBuilder.Build());
}
private List<string> GetTrackerCategories(string term, SearchCriteriaBase searchCriteria)
{
var searchTerm = term.Trim();
var categoryMapping = _capabilities.Categories
.MapTorznabCapsToTrackers(searchCriteria.Categories)
.Distinct()
.ToList();
return searchTerm.IsNullOrWhiteSpace() && categoryMapping.Count == 2
? categoryMapping
: new List<string> { categoryMapping.FirstIfSingleOrDefault("0") };
}
public Func<IDictionary<string, string>> GetCookies { get; set; }
public Action<IDictionary<string, string>, DateTime?> CookiesUpdater { get; set; }
}
public class AnimeTorrentsParser : IParseIndexerResponse
{
private readonly AnimeTorrentsSettings _settings;
private readonly IndexerCapabilitiesCategories _categories;
public AnimeTorrentsParser(AnimeTorrentsSettings settings, IndexerCapabilitiesCategories categories)
{
_settings = settings;
_categories = categories;
}
public IList<ReleaseInfo> ParseResponse(IndexerResponse indexerResponse)
{
var releaseInfos = new List<ReleaseInfo>();
var parser = new HtmlParser();
using var dom = parser.ParseDocument(indexerResponse.Content);
var rows = dom.QuerySelectorAll("table tr");
foreach (var (row, index) in rows.Skip(1).Select((v, i) => (v, i)))
{
var downloadVolumeFactor = row.QuerySelector("img[alt=\"Gold Torrent\"]") != null ? 0 : row.QuerySelector("img[alt=\"Silver Torrent\"]") != null ? 0.5 : 1;
// skip non-freeleech results when freeleech only is set
if (_settings.FreeleechOnly && downloadVolumeFactor != 0)
{
continue;
}
var qTitleLink = row.QuerySelector("td:nth-of-type(2) a:nth-of-type(1)");
var title = qTitleLink?.TextContent.Trim();
// If we search and get no results, we still get a table just with no info.
if (title.IsNullOrWhiteSpace())
{
break;
}
var infoUrl = qTitleLink?.GetAttribute("href");
// newbie users don't see DL links
// use details link as placeholder
// skipping the release prevents newbie users from adding the tracker (empty result)
var downloadUrl = row.QuerySelector("td:nth-of-type(3) a")?.GetAttribute("href") ?? infoUrl;
var connections = row.QuerySelector("td:nth-of-type(8)").TextContent.Trim().Split('/', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
var seeders = ParseUtil.CoerceInt(connections[0]);
var leechers = ParseUtil.CoerceInt(connections[1]);
var grabs = ParseUtil.CoerceInt(connections[2]);
var categoryLink = row.QuerySelector("td:nth-of-type(1) a")?.GetAttribute("href") ?? string.Empty;
var categoryId = ParseUtil.GetArgumentFromQueryString(categoryLink, "cat");
var publishedDate = DateTime.ParseExact(row.QuerySelector("td:nth-of-type(5)").TextContent, "dd MMM yy", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);
if (publishedDate.Date == DateTime.Today)
{
publishedDate = publishedDate.Date + DateTime.Now.TimeOfDay - TimeSpan.FromMinutes(index);
}
var release = new TorrentInfo
{
Guid = infoUrl,
InfoUrl = infoUrl,
DownloadUrl = downloadUrl,
Title = title,
Categories = _categories.MapTrackerCatToNewznab(categoryId),
PublishDate = publishedDate,
Size = ParseUtil.GetBytes(row.QuerySelector("td:nth-of-type(6)").TextContent.Trim()),
Seeders = seeders,
Peers = leechers + seeders,
Grabs = grabs,
DownloadVolumeFactor = downloadVolumeFactor,
UploadVolumeFactor = 1,
Genres = row.QuerySelectorAll("td:nth-of-type(2) a.tortags").Select(t => t.TextContent.Trim()).ToList()
};
var uploadFactor = row.QuerySelector("img[alt*=\"x Multiplier Torrent\"]")?.GetAttribute("alt");
if (uploadFactor != null)
{
release.UploadVolumeFactor = ParseUtil.CoerceDouble(uploadFactor.Split('x')[0]);
}
releaseInfos.Add(release);
}
return releaseInfos.ToArray();
}
public Action<IDictionary<string, string>, DateTime?> CookiesUpdater { get; set; }
}
public class AnimeTorrentsSettings : CookieTorrentBaseSettings
{
public AnimeTorrentsSettings()
{
FreeleechOnly = false;
DownloadableOnly = false;
}
[FieldDefinition(4, Label = "Freeleech Only", Type = FieldType.Checkbox, HelpText = "Show freeleech torrents only")]
public bool FreeleechOnly { get; set; }
[FieldDefinition(5, Label = "Downloadable Only", Type = FieldType.Checkbox, HelpText = "Search downloadable torrents only (enable this only if your account class is Newbie)", Advanced = true)]
public bool DownloadableOnly { get; set; }
}
}

View File

@@ -0,0 +1,156 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using NLog;
using NzbDrone.Common.Extensions;
using NzbDrone.Common.Http;
using NzbDrone.Core.Configuration;
using NzbDrone.Core.Exceptions;
using NzbDrone.Core.Indexers.Definitions.Avistaz;
using NzbDrone.Core.IndexerSearch.Definitions;
using NzbDrone.Core.Messaging.Events;
namespace NzbDrone.Core.Indexers.Definitions;
public class AnimeZ : AvistazBase
{
public override string Name => "AnimeZ";
public override string[] IndexerUrls => new[] { "https://animez.to/" };
public override string Description => "AnimeZ (ex-AnimeTorrents) is a Private Torrent Tracker for ANIME / MANGA";
public override IndexerPrivacy Privacy => IndexerPrivacy.Private;
public AnimeZ(IIndexerRepository indexerRepository,
IIndexerHttpClient httpClient,
IEventAggregator eventAggregator,
IIndexerStatusService indexerStatusService,
IConfigService configService,
Logger logger)
: base(indexerRepository, httpClient, eventAggregator, indexerStatusService, configService, logger)
{
}
public override IIndexerRequestGenerator GetRequestGenerator()
{
return new AnimeZRequestGenerator
{
Settings = Settings,
Capabilities = Capabilities,
PageSize = PageSize,
HttpClient = _httpClient,
Logger = _logger
};
}
public override IParseIndexerResponse GetParser()
{
return new AnimeZParser(Capabilities.Categories);
}
public override async Task<IndexerDownloadResponse> Download(Uri link)
{
try
{
return await base.Download(link).ConfigureAwait(false);
}
catch (ReleaseDownloadException ex) when (ex.InnerException is HttpException httpException &&
httpException.Response.StatusCode is HttpStatusCode.Unauthorized)
{
await DoLogin().ConfigureAwait(false);
}
return await base.Download(link).ConfigureAwait(false);
}
protected override Task<HttpRequest> GetDownloadRequest(Uri link)
{
var request = new HttpRequestBuilder(link.AbsoluteUri)
.Accept(HttpAccept.Json)
.SetHeader("Authorization", $"Bearer {Settings.Token}")
.Build();
return Task.FromResult(request);
}
protected override IndexerCapabilities SetCapabilities()
{
var caps = new IndexerCapabilities
{
LimitsDefault = PageSize,
LimitsMax = PageSize,
TvSearchParams = new List<TvSearchParam>
{
TvSearchParam.Q, TvSearchParam.Season, TvSearchParam.Ep
},
MovieSearchParams = new List<MovieSearchParam>
{
MovieSearchParam.Q
},
BookSearchParams = new List<BookSearchParam>
{
BookSearchParam.Q,
}
};
caps.Categories.AddCategoryMapping("TV", NewznabStandardCategory.TVAnime, "Anime > TV");
caps.Categories.AddCategoryMapping("TV_SHORT", NewznabStandardCategory.TVAnime, "Anime > TV Short");
caps.Categories.AddCategoryMapping("MOVIE", NewznabStandardCategory.Movies, "Anime > Movie");
caps.Categories.AddCategoryMapping("SPECIAL", NewznabStandardCategory.TVAnime, "Anime > Special");
caps.Categories.AddCategoryMapping("OVA", NewznabStandardCategory.TVAnime, "Anime > OVA");
caps.Categories.AddCategoryMapping("ONA", NewznabStandardCategory.TVAnime, "Anime > ONA");
caps.Categories.AddCategoryMapping("MUSIC", NewznabStandardCategory.TVAnime, "Anime > Music");
caps.Categories.AddCategoryMapping("MANGA", NewznabStandardCategory.BooksComics, "Manga > Manga");
caps.Categories.AddCategoryMapping("NOVEL", NewznabStandardCategory.BooksForeign, "Manga > Novel");
caps.Categories.AddCategoryMapping("ONE_SHOT", NewznabStandardCategory.BooksForeign, "Manga > One-Shot");
return caps;
}
}
public class AnimeZRequestGenerator : AvistazRequestGenerator
{
protected override List<KeyValuePair<string, string>> GetBasicSearchParameters(SearchCriteriaBase searchCriteria, string genre = null)
{
var parameters = new List<KeyValuePair<string, string>>
{
{ "limit", Math.Min(PageSize, searchCriteria.Limit.GetValueOrDefault(PageSize)).ToString() }
};
var categoryMappings = Capabilities.Categories.MapTorznabCapsToTrackers(searchCriteria.Categories).Distinct().ToList();
if (categoryMappings.Any())
{
foreach (var category in categoryMappings)
{
parameters.Add("format[]", category);
}
}
if (searchCriteria.Limit is > 0 && searchCriteria.Offset is > 0)
{
var page = (int)(searchCriteria.Offset / searchCriteria.Limit) + 1;
parameters.Add("page", page.ToString());
}
if (Settings.FreeleechOnly)
{
parameters.Add("freeleech", "1");
}
return parameters;
}
}
public class AnimeZParser(IndexerCapabilitiesCategories categories) : AvistazParserBase
{
protected override List<IndexerCategory> ParseCategories(AvistazRelease row)
{
return categories.MapTrackerCatToNewznab(row.Format).ToList();
}
protected override string ParseTitle(AvistazRelease row)
{
return row.ReleaseTitle.IsNotNullOrWhiteSpace() ? row.ReleaseTitle : row.FileName;
}
}

View File

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

View File

@@ -5,69 +5,77 @@ namespace NzbDrone.Core.Indexers.Definitions.Avistaz
{
public class AvistazRelease
{
public string Url { get; set; }
public string Download { get; set; }
public Dictionary<string, string> Category { get; set; }
public string Url { get; init; }
public string Download { get; init; }
public Dictionary<string, string> Category { get; init; }
[JsonPropertyName("movie_tv")]
public AvistazIdInfo MovieTvinfo { get; set; }
public AvistazIdInfo MovieTvinfo { get; init; }
[JsonPropertyName("created_at")]
public string CreatedAt { get; set; }
[JsonPropertyName("created_at_iso")]
public string CreatedAtIso { get; init; }
[JsonPropertyName("file_name")]
public string FileName { get; set; }
public string FileName { get; init; }
[JsonPropertyName("release_title")]
public string ReleaseTitle { get; init; }
[JsonPropertyName("info_hash")]
public string InfoHash { get; set; }
public int? Leech { get; set; }
public int? Completed { get; set; }
public int? Seed { get; set; }
public string InfoHash { get; init; }
public int? Leech { get; init; }
public int? Completed { get; init; }
public int? Seed { get; init; }
[JsonPropertyName("file_size")]
public long? FileSize { get; set; }
public long? FileSize { get; init; }
[JsonPropertyName("file_count")]
public int? FileCount { get; set; }
public int? FileCount { get; init; }
[JsonPropertyName("download_multiply")]
public double? DownloadMultiply { get; set; }
public double? DownloadMultiply { get; init; }
[JsonPropertyName("upload_multiply")]
public double? UploadMultiply { get; set; }
public double? UploadMultiply { get; init; }
[JsonPropertyName("video_quality")]
public string VideoQuality { get; set; }
public string Type { get; set; }
public List<AvistazLanguage> Audio { get; set; }
public List<AvistazLanguage> Subtitle { get; set; }
public string VideoQuality { get; init; }
public string Type { get; init; }
public string Format { get; init; }
public IReadOnlyCollection<AvistazLanguage> Audio { get; init; }
public IReadOnlyCollection<AvistazLanguage> Subtitle { get; init; }
}
public class AvistazLanguage
{
public int Id { get; set; }
public string Language { get; set; }
public int Id { get; init; }
public string Language { get; init; }
}
public class AvistazResponse
{
public List<AvistazRelease> Data { get; set; }
public IReadOnlyCollection<AvistazRelease> Data { get; init; }
}
public class AvistazErrorResponse
{
public string Message { get; set; }
public string Message { get; init; }
}
public class AvistazIdInfo
{
public string Tmdb { get; set; }
public string Tvdb { get; set; }
public string Imdb { get; set; }
public string Tmdb { get; init; }
public string Tvdb { get; init; }
public string Imdb { get; init; }
}
public class AvistazAuthResponse
{
public string Token { get; set; }
public string Token { get; init; }
}
}

View File

@@ -1,6 +1,5 @@
using System;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using FluentValidation.Results;
using NLog;
@@ -21,7 +20,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Avistaz
public override TimeSpan RateLimit => TimeSpan.FromSeconds(6);
public override IndexerCapabilities Capabilities => SetCapabilities();
protected virtual string LoginUrl => Settings.BaseUrl + "api/v1/jackett/auth";
private IIndexerRepository _indexerRepository;
private readonly IIndexerRepository _indexerRepository;
public AvistazBase(IIndexerRepository indexerRepository,
IIndexerHttpClient httpClient,
@@ -57,7 +56,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Avistaz
{
try
{
Settings.Token = await GetToken();
Settings.Token = await GetToken().ConfigureAwait(false);
if (Definition.Id > 0)
{
@@ -66,7 +65,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Avistaz
_logger.Debug("Avistaz authentication succeeded.");
}
catch (HttpException ex) when (ex.Response.StatusCode == HttpStatusCode.Unauthorized)
catch (HttpException ex) when (ex.Response.StatusCode is HttpStatusCode.Unauthorized or HttpStatusCode.UnprocessableEntity)
{
_logger.Warn(ex, "Failed to authenticate with Avistaz");
@@ -90,11 +89,11 @@ namespace NzbDrone.Core.Indexers.Definitions.Avistaz
{
try
{
await GetToken();
await GetToken().ConfigureAwait(false);
}
catch (HttpException ex)
{
if (ex.Response.StatusCode == HttpStatusCode.Unauthorized)
if (ex.Response.StatusCode is HttpStatusCode.Unauthorized or HttpStatusCode.UnprocessableEntity)
{
_logger.Warn(ex, "Unauthorized request to indexer");
@@ -110,10 +109,10 @@ namespace NzbDrone.Core.Indexers.Definitions.Avistaz
{
_logger.Warn(ex, "Unable to connect to indexer");
return new ValidationFailure(string.Empty, "Unable to connect to indexer, check the log above the ValidationFailure for more details");
return new ValidationFailure(string.Empty, "Unable to connect to indexer, check the log above the ValidationFailure for more details. " + ex.Message);
}
return await base.TestConnection();
return await base.TestConnection().ConfigureAwait(false);
}
private async Task<string> GetToken()
@@ -121,18 +120,17 @@ namespace NzbDrone.Core.Indexers.Definitions.Avistaz
var requestBuilder = new HttpRequestBuilder(LoginUrl)
{
LogResponseContent = true,
Method = HttpMethod.Post
};
// TODO: Change to HttpAccept.Json after they fix the issue with missing headers
var authLoginRequest = requestBuilder
.Post()
.AddFormParameter("username", Settings.Username)
.AddFormParameter("password", Settings.Password)
.AddFormParameter("pid", Settings.Pid.Trim())
.Accept(HttpAccept.Html)
.Accept(HttpAccept.Json)
.Build();
var response = await ExecuteAuth(authLoginRequest);
var response = await ExecuteAuth(authLoginRequest).ConfigureAwait(false);
if (!STJson.TryDeserialize<AvistazAuthResponse>(response.Content, out var authResponse))
{

View File

@@ -14,7 +14,6 @@ namespace NzbDrone.Core.Indexers.Definitions.Avistaz
{
public class AvistazParserBase : IParseIndexerResponse
{
protected virtual string TimezoneOffset => "-04:00"; // Avistaz does not specify a timezone & returns server time
private readonly HashSet<string> _hdResolutions = new() { "1080p", "1080i", "720p" };
public Action<IDictionary<string, string>, DateTime?> CookiesUpdater { get; set; }
@@ -25,7 +24,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Avistaz
if (indexerResponse.HttpResponse.StatusCode == HttpStatusCode.NotFound)
{
return releaseInfos.ToArray();
return releaseInfos;
}
if (indexerResponse.HttpResponse.StatusCode == HttpStatusCode.TooManyRequests)
@@ -53,31 +52,28 @@ namespace NzbDrone.Core.Indexers.Definitions.Avistaz
foreach (var row in jsonResponse.Data)
{
var details = row.Url;
var link = row.Download;
var cats = ParseCategories(row);
var detailsUrl = row.Url;
var release = new TorrentInfo
{
Title = row.FileName,
DownloadUrl = link,
Guid = detailsUrl,
InfoUrl = detailsUrl,
Title = ParseTitle(row),
DownloadUrl = row.Download,
Categories = ParseCategories(row).ToList(),
InfoHash = row.InfoHash,
InfoUrl = details,
Guid = details,
Categories = cats,
PublishDate = DateTime.Parse($"{row.CreatedAt} {TimezoneOffset}", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal),
Size = row.FileSize,
Files = row.FileCount,
Grabs = row.Completed,
Seeders = row.Seed,
Peers = row.Leech + row.Seed,
PublishDate = DateTime.Parse(row.CreatedAtIso, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal),
DownloadVolumeFactor = row.DownloadMultiply,
UploadVolumeFactor = row.UploadMultiply,
MinimumRatio = 1,
MinimumSeedTime = 259200, // 72 hours
Languages = row.Audio?.Select(x => x.Language).ToList() ?? new List<string>(),
Subs = row.Subtitle?.Select(x => x.Language).ToList() ?? new List<string>()
Languages = row.Audio?.Select(x => x.Language).ToList() ?? [],
Subs = row.Subtitle?.Select(x => x.Language).ToList() ?? []
};
if (row.FileSize is > 0)
@@ -91,54 +87,57 @@ namespace NzbDrone.Core.Indexers.Definitions.Avistaz
};
}
if (row.MovieTvinfo != null)
if (row.MovieTvinfo is not null)
{
release.ImdbId = ParseUtil.GetImdbId(row.MovieTvinfo.Imdb).GetValueOrDefault();
release.TmdbId = row.MovieTvinfo.Tmdb.IsNullOrWhiteSpace() ? 0 : ParseUtil.TryCoerceInt(row.MovieTvinfo.Tmdb, out var tmdbResult) ? tmdbResult : 0;
release.TvdbId = row.MovieTvinfo.Tvdb.IsNullOrWhiteSpace() ? 0 : ParseUtil.TryCoerceInt(row.MovieTvinfo.Tvdb, out var tvdbResult) ? tvdbResult : 0;
release.TmdbId = row.MovieTvinfo.Tmdb.IsNotNullOrWhiteSpace() && ParseUtil.TryCoerceInt(row.MovieTvinfo.Tmdb, out var tmdbResult) ? tmdbResult : 0;
release.TvdbId = row.MovieTvinfo.Tvdb.IsNotNullOrWhiteSpace() && ParseUtil.TryCoerceInt(row.MovieTvinfo.Tvdb, out var tvdbResult) ? tvdbResult : 0;
}
releaseInfos.Add(release);
}
// order by date
return releaseInfos
.OrderByDescending(o => o.PublishDate)
.ToArray();
}
// hook to adjust category parsing
protected virtual List<IndexerCategory> ParseCategories(AvistazRelease row)
protected virtual IReadOnlyList<IndexerCategory> ParseCategories(AvistazRelease row)
{
var cats = new List<IndexerCategory>();
var resolution = row.VideoQuality;
var categories = new List<IndexerCategory>();
var videoQuality = row.VideoQuality;
switch (row.Type)
switch (row.Type.ToUpperInvariant())
{
case "Movie":
cats.Add(resolution switch
case "MOVIE":
categories.Add(videoQuality switch
{
var res when _hdResolutions.Contains(res) => NewznabStandardCategory.MoviesHD,
"2160p" => NewznabStandardCategory.MoviesUHD,
_ => NewznabStandardCategory.MoviesSD
});
break;
case "TV-Show":
cats.Add(resolution switch
case "TV-SHOW":
categories.Add(videoQuality switch
{
var res when _hdResolutions.Contains(res) => NewznabStandardCategory.TVHD,
"2160p" => NewznabStandardCategory.TVUHD,
_ => NewznabStandardCategory.TVSD
});
break;
case "Music":
cats.Add(NewznabStandardCategory.Audio);
case "MUSIC":
categories.Add(NewznabStandardCategory.Audio);
break;
default:
throw new Exception($"Error parsing Avistaz category type {row.Type}");
throw new Exception($"Error parsing Avistaz category type \"{row.Type}\"");
}
return cats;
return categories;
}
protected virtual string ParseTitle(AvistazRelease row)
{
return row.FileName;
}
}
}

View File

@@ -82,11 +82,10 @@ namespace NzbDrone.Core.Indexers.Definitions.Avistaz
{
var searchUrl = SearchUrl + "?" + searchParameters.GetQueryString();
// TODO: Change to HttpAccept.Json after they fix the issue with missing headers
var request = new IndexerRequest(searchUrl, HttpAccept.Html);
request.HttpRequest.Headers.Add("Authorization", $"Bearer {Settings.Token}");
var request = new IndexerRequest(searchUrl, HttpAccept.Json);
request.HttpRequest.Headers.Set("Authorization", $"Bearer {Settings.Token}");
request.HttpRequest.SuppressHttpErrorStatusCodes = new[] { HttpStatusCode.NotFound };
request.HttpRequest.SuppressHttpErrorStatusCodes = [HttpStatusCode.NotFound];
yield return request;
}

View File

@@ -19,13 +19,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Avistaz
{
private static readonly AvistazSettingsValidator Validator = new();
public AvistazSettings()
{
Token = "";
FreeleechOnly = false;
}
public string Token { get; set; }
public string Token { get; set; } = string.Empty;
[FieldDefinition(2, Label = "Username", HelpText = "IndexerAvistazSettingsUsernameHelpText", HelpTextWarning = "IndexerAvistazSettingsUsernameHelpTextWarning", Privacy = PrivacyLevel.UserName)]
public string Username { get; set; }

View File

@@ -126,7 +126,7 @@ namespace NzbDrone.Core.Indexers.Definitions
}
else if (tmdbId > 0)
{
body.Add("tmdb_id", tmdbId);
body.Add("tmdb_id", $"movie/{tmdbId}");
}
if (searchTerm.IsNotNullOrWhiteSpace())

View File

@@ -74,7 +74,7 @@ namespace NzbDrone.Core.Indexers.BroadcastheNet
else if (DateTime.TryParseExact($"{searchCriteria.Season} {searchCriteria.Episode}", "yyyy MM/dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out var showDate))
{
// Daily Episode
parameters.Name = showDate.ToString("yyyy.MM.dd", CultureInfo.InvariantCulture);
parameters.Name = showDate.ToString("yyyy.MM.dd", CultureInfo.InvariantCulture) + "%";
parameters.Category = "Episode";
pageableRequests.Add(GetPagedRequests(parameters, btnResults, btnOffset));
}

View File

@@ -1,3 +1,4 @@
using System;
using NLog;
using NzbDrone.Core.Configuration;
using NzbDrone.Core.Indexers.Definitions.Gazelle;
@@ -5,6 +6,7 @@ using NzbDrone.Core.Messaging.Events;
namespace NzbDrone.Core.Indexers.Definitions;
[Obsolete("Moved to YML for Cardigann")]
public class CGPeers : GazelleBase<GazelleSettings>
{
public override string Name => "CGPeers";

View File

@@ -426,6 +426,12 @@ namespace NzbDrone.Core.Indexers.Definitions.Cardigann
{
((TorrentInfo)c).InfoHash = MagnetLinkBuilder.GetInfoHashFromMagnet(((TorrentInfo)c).MagnetUrl);
}
// Add Internal flag if description starts with Internal
if (c.Description.IsNotNullOrWhiteSpace() && c.Description.StartsWith("Internal"))
{
c.IndexerFlags.Add(IndexerFlag.Internal);
}
});
_logger.Trace("Cardigann ({0}): Got {1} releases", _definition.Id, releases.Count);

View File

@@ -54,8 +54,6 @@ namespace NzbDrone.Core.Indexers.Definitions
{
private readonly IndexerCapabilitiesCategories _categories;
protected override string TimezoneOffset => "+02:00";
public ExoticaZParser(IndexerCapabilitiesCategories categories)
{
_categories = categories;

View File

@@ -11,10 +11,17 @@ namespace NzbDrone.Core.Indexers.Definitions.FileList;
public class FileList : TorrentIndexerBase<FileListSettings>
{
public override string Name => "FileList.io";
public override string[] IndexerUrls => new[] { "https://filelist.io/" };
public override string[] IndexerUrls => new[]
{
"https://filelist.io/",
"https://thefl.org/",
};
public override string[] LegacyUrls => new[]
{
"https://filelist.io",
"https://filelist.ro/",
"http://filelist.ro/",
"http://flro.org/",
"https://flro.org/"
};
public override string Description => "FileList (FL) is a ROMANIAN Private Torrent Tracker for 0DAY / GENERAL";
@@ -105,6 +112,7 @@ public class FileList : TorrentIndexerBase<FileListSettings>
caps.Categories.AddCategoryMapping(27, NewznabStandardCategory.TVUHD, "Seriale 4K");
caps.Categories.AddCategoryMapping(28, NewznabStandardCategory.MoviesForeign, "RO Dubbed");
caps.Categories.AddCategoryMapping(28, NewznabStandardCategory.TVForeign, "RO Dubbed");
caps.Categories.AddCategoryMapping(31, NewznabStandardCategory.TVForeign, "K-Drama");
return caps;
}

View File

@@ -58,6 +58,7 @@ public class FunFile : TorrentIndexerBase<UserPassTorrentBaseSettings>
};
var authLoginRequest = requestBuilder
.SetEncoding(Encoding)
.AddFormParameter("username", Settings.Username)
.AddFormParameter("password", Settings.Password)
.AddFormParameter("returnto", "")

View File

@@ -120,7 +120,7 @@ namespace NzbDrone.Core.Indexers.Headphones
baseUrl += "&apikey=" + Settings.ApiKey;
}
if (searchCriteria.Limit.HasValue)
if (searchCriteria.Limit is > 0)
{
parameters.Add("limit", searchCriteria.Limit.ToString());
}

View File

@@ -1,12 +1,11 @@
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Globalization;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
using Newtonsoft.Json;
using NLog;
using NzbDrone.Common.Extensions;
using NzbDrone.Common.Http;
@@ -112,25 +111,26 @@ namespace NzbDrone.Core.Indexers.Definitions
{
var pageableRequests = new IndexerPageableRequestChain();
var queryParams = new NebulanceQuery
var queryParams = new NameValueCollection
{
Age = ">0"
{ "action", "search" },
{ "age", ">0" },
};
if (searchCriteria.TvMazeId is > 0)
{
queryParams.TvMaze = searchCriteria.TvMazeId.Value;
queryParams.Set("tvmaze", searchCriteria.TvMazeId.ToString());
}
else if (searchCriteria.ImdbId.IsNotNullOrWhiteSpace())
{
queryParams.Imdb = searchCriteria.FullImdbId;
queryParams.Set("imdb", searchCriteria.FullImdbId);
}
var searchQuery = searchCriteria.SanitizedSearchTerm.Trim();
if (searchQuery.IsNotNullOrWhiteSpace())
{
queryParams.Release = searchQuery;
queryParams.Set("release", searchQuery);
}
if (searchCriteria.Season.HasValue &&
@@ -139,43 +139,43 @@ namespace NzbDrone.Core.Indexers.Definitions
{
if (searchQuery.IsNotNullOrWhiteSpace())
{
queryParams.Name = searchQuery;
queryParams.Set("name", searchQuery);
}
queryParams.Release = showDate.ToString("yyyy.MM.dd", CultureInfo.InvariantCulture);
queryParams.Set("release", showDate.ToString("yyyy.MM.dd", CultureInfo.InvariantCulture));
}
else
{
if (searchCriteria.Season.HasValue)
{
queryParams.Season = searchCriteria.Season.Value;
queryParams.Set("season", searchCriteria.Season.Value.ToString());
}
if (searchCriteria.Episode.IsNotNullOrWhiteSpace() && int.TryParse(searchCriteria.Episode, out var episodeNumber))
{
queryParams.Episode = episodeNumber;
queryParams.Set("episode", episodeNumber.ToString());
}
}
if ((queryParams.Season.HasValue || queryParams.Episode.HasValue) &&
queryParams.Name.IsNullOrWhiteSpace() &&
queryParams.Release.IsNullOrWhiteSpace() &&
!queryParams.TvMaze.HasValue &&
queryParams.Imdb.IsNullOrWhiteSpace())
if ((queryParams.Get("season").IsNotNullOrWhiteSpace() || queryParams.Get("episode").IsNotNullOrWhiteSpace()) &&
queryParams.Get("name").IsNullOrWhiteSpace() &&
queryParams.Get("release").IsNullOrWhiteSpace() &&
queryParams.Get("tvmaze").IsNullOrWhiteSpace() &&
queryParams.Get("imdb").IsNullOrWhiteSpace())
{
_logger.Debug("NBL API does not support season calls without name, series, id, imdb, tvmaze, or time keys.");
_logger.Warn("NBL API does not support season calls without name, series, id, imdb, tvmaze, or time keys.");
return new IndexerPageableRequestChain();
}
if (queryParams.Name is { Length: > 0 and < 3 } || queryParams.Release is { Length: > 0 and < 3 })
if (queryParams.Get("name") is { Length: > 0 and < 3 } || queryParams.Get("release") is { Length: > 0 and < 3 })
{
_logger.Debug("NBL API does not support release calls that are 2 characters or fewer.");
_logger.Warn("NBL API does not support release calls that are 2 characters or fewer.");
return new IndexerPageableRequestChain();
}
pageableRequests.Add(GetPagedRequests(queryParams, searchCriteria.Limit, searchCriteria.Offset));
pageableRequests.Add(GetPagedRequests(queryParams, searchCriteria));
return pageableRequests;
}
@@ -189,40 +189,45 @@ namespace NzbDrone.Core.Indexers.Definitions
{
var pageableRequests = new IndexerPageableRequestChain();
var queryParams = new NebulanceQuery
var queryParams = new NameValueCollection
{
Age = ">0"
{ "action", "search" },
{ "age", ">0" },
};
var searchQuery = searchCriteria.SanitizedSearchTerm.Trim();
if (searchQuery.IsNotNullOrWhiteSpace())
{
queryParams.Release = searchQuery;
queryParams.Set("release", searchQuery);
}
if (queryParams.Release is { Length: > 0 and < 3 })
if (queryParams.Get("release") is { Length: > 0 and < 3 })
{
_logger.Debug("NBL API does not support release calls that are 2 characters or fewer.");
return new IndexerPageableRequestChain();
}
pageableRequests.Add(GetPagedRequests(queryParams, searchCriteria.Limit, searchCriteria.Offset));
pageableRequests.Add(GetPagedRequests(queryParams, searchCriteria));
return pageableRequests;
}
private IEnumerable<IndexerRequest> GetPagedRequests(NebulanceQuery parameters, int? results, int? offset)
private IEnumerable<IndexerRequest> GetPagedRequests(NameValueCollection parameters, SearchCriteriaBase searchCriteria)
{
var apiUrl = _settings.BaseUrl + "api.php";
parameters.Set("api_key", _settings.ApiKey);
parameters.Set("per_page", searchCriteria.Limit.GetValueOrDefault(100).ToString());
var builder = new JsonRpcRequestBuilder(apiUrl)
.Call("getTorrents", _settings.ApiKey, parameters, results ?? 100, offset ?? 0);
if (searchCriteria.Limit > 0 && searchCriteria.Offset > 0)
{
var page = searchCriteria.Offset / searchCriteria.Limit;
parameters.Set("page", page.ToString());
}
builder.SuppressHttpError = true;
var apiUrl = $"{_settings.BaseUrl}api.php?{parameters.GetQueryString()}";
yield return new IndexerRequest(builder.Build());
yield return new IndexerRequest(apiUrl, HttpAccept.Json);
}
public Func<IDictionary<string, string>> GetCookies { get; set; }
@@ -244,16 +249,14 @@ namespace NzbDrone.Core.Indexers.Definitions
if (indexerResponse.HttpResponse.StatusCode != HttpStatusCode.OK)
{
STJson.TryDeserialize<JsonRpcResponse<NebulanceErrorResponse>>(indexerResponse.HttpResponse.Content, out var errorResponse);
throw new IndexerException(indexerResponse, "Unexpected response status '{0}' code from indexer request: {1}", indexerResponse.HttpResponse.StatusCode, errorResponse?.Result?.Error?.Message ?? "Check the logs for more information.");
throw new IndexerException(indexerResponse, "Unexpected response status '{0}' code from indexer request. Check the logs for more information.", indexerResponse.HttpResponse.StatusCode);
}
JsonRpcResponse<NebulanceResponse> jsonResponse;
NebulanceResponse jsonResponse;
try
{
jsonResponse = STJson.Deserialize<JsonRpcResponse<NebulanceResponse>>(indexerResponse.HttpResponse.Content);
jsonResponse = STJson.Deserialize<NebulanceResponse>(indexerResponse.HttpResponse.Content);
}
catch (Exception ex)
{
@@ -262,19 +265,17 @@ namespace NzbDrone.Core.Indexers.Definitions
throw new IndexerException(indexerResponse, "Unexpected response from indexer request: {0}", ex, response?.Result ?? ex.Message);
}
if (jsonResponse.Error != null || jsonResponse.Result == null)
if (jsonResponse.Error != null)
{
throw new IndexerException(indexerResponse, "Indexer API call returned an error [{0}]", jsonResponse.Error);
throw new IndexerException(indexerResponse, "Indexer API call returned an error [{0}]", jsonResponse.Error?.Message);
}
if (jsonResponse.Result?.Items == null || jsonResponse.Result.Items.Count == 0)
if (jsonResponse.TotalResults == 0 || jsonResponse.Items == null || jsonResponse.Items.Count == 0)
{
return torrentInfos;
}
var rows = jsonResponse.Result.Items;
foreach (var row in rows)
foreach (var row in jsonResponse.Items)
{
var details = _settings.BaseUrl + "torrents.php?id=" + row.TorrentId;
@@ -284,26 +285,30 @@ namespace NzbDrone.Core.Indexers.Definitions
{
Guid = details,
InfoUrl = details,
DownloadUrl = row.Download,
DownloadUrl = row.DownloadLink,
Title = title.Trim(),
Categories = new List<IndexerCategory> { TvCategoryFromQualityParser.ParseTvShowQuality(row.ReleaseTitle) },
Size = ParseUtil.CoerceLong(row.Size),
Files = row.FileList.Count(),
Size = row.Size,
Files = row.FileList.Count,
PublishDate = DateTime.Parse(row.PublishDateUtc, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal),
Grabs = ParseUtil.CoerceInt(row.Snatch),
Seeders = ParseUtil.CoerceInt(row.Seed),
Peers = ParseUtil.CoerceInt(row.Seed) + ParseUtil.CoerceInt(row.Leech),
Grabs = row.Snatch,
Seeders = row.Seed,
Peers = row.Seed + row.Leech,
Scene = row.Tags?.ContainsIgnoreCase("scene"),
MinimumRatio = 0, // ratioless
MinimumSeedTime = row.Category.ToLower() == "season" ? 432000 : 86400, // 120 hours for seasons and 24 hours for episodes
MinimumSeedTime = row.Category.ToUpperInvariant() == "SEASON" ? 432000 : 86400, // 120 hours for seasons and 24 hours for episodes
DownloadVolumeFactor = 0, // ratioless tracker
UploadVolumeFactor = 1,
PosterUrl = row.Banner
};
if (row.TvMazeId.IsNotNullOrWhiteSpace())
if (row.ImdbId.IsNotNullOrWhiteSpace())
{
release.TvMazeId = ParseUtil.CoerceInt(row.TvMazeId);
release.ImdbId = ParseUtil.GetImdbId(row.ImdbId).GetValueOrDefault();
}
if (row.TvMazeId is > 0)
{
release.TvMazeId = row.TvMazeId.Value;
}
torrentInfos.Add(release);
@@ -326,100 +331,55 @@ namespace NzbDrone.Core.Indexers.Definitions
public string ApiKey { get; set; }
}
public class NebulanceQuery
{
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Id { get; set; }
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Time { get; set; }
[JsonProperty(PropertyName="age", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Age { get; set; }
[JsonProperty(PropertyName="tvmaze", DefaultValueHandling = DefaultValueHandling.Ignore)]
public int? TvMaze { get; set; }
[JsonProperty(PropertyName="imdb", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Imdb { get; set; }
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Hash { get; set; }
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
public string[] Tags { get; set; }
[JsonProperty(PropertyName="name", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Name { get; set; }
[JsonProperty(PropertyName="release", DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Release { get; set; }
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Category { get; set; }
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Series { get; set; }
[JsonProperty(PropertyName="season", DefaultValueHandling = DefaultValueHandling.Ignore)]
public int? Season { get; set; }
[JsonProperty(PropertyName="episode", DefaultValueHandling = DefaultValueHandling.Ignore)]
public int? Episode { get; set; }
public NebulanceQuery Clone()
{
return MemberwiseClone() as NebulanceQuery;
}
}
public class NebulanceResponse
{
public List<NebulanceTorrent> Items { get; set; }
[JsonPropertyName("total_results")]
public int TotalResults { get; init; }
public IReadOnlyCollection<NebulanceTorrent> Items { get; init; }
public NebulanceErrorMessage Error { get; init; }
}
public class NebulanceTorrent
{
[JsonPropertyName("rls_name")]
public string ReleaseTitle { get; set; }
public string ReleaseTitle { get; init; }
[JsonPropertyName("cat")]
public string Category { get; set; }
public string Category { get; init; }
public string Size { get; set; }
public string Seed { get; set; }
public string Leech { get; set; }
public string Snatch { get; set; }
public string Download { get; set; }
public long Size { get; init; }
public int Seed { get; init; }
public int Leech { get; init; }
public int Snatch { get; init; }
[JsonPropertyName("download")]
public string DownloadLink { get; init; }
[JsonPropertyName("file_list")]
public IEnumerable<string> FileList { get; set; } = Array.Empty<string>();
public IReadOnlyCollection<string> FileList { get; init; } = [];
[JsonPropertyName("group_name")]
public string GroupName { get; set; }
[JsonPropertyName("series_banner")]
public string Banner { get; set; }
public string GroupName { get; init; }
[JsonPropertyName("group_id")]
public string TorrentId { get; set; }
public int TorrentId { get; init; }
[JsonPropertyName("series_id")]
public string TvMazeId { get; set; }
[JsonPropertyName("imdb_id")]
public string ImdbId { get; init; }
[JsonPropertyName("tvmaze_id")]
public int? TvMazeId { get; init; }
[JsonPropertyName("rls_utc")]
public string PublishDateUtc { get; set; }
public string PublishDateUtc { get; init; }
public IEnumerable<string> Tags { get; set; } = Array.Empty<string>();
}
public class NebulanceErrorResponse
{
public NebulanceErrorMessage Error { get; set; }
public IReadOnlyCollection<string> Tags { get; init; } = [];
}
public class NebulanceErrorMessage
{
public string Message { get; set; }
public string Message { get; init; }
}
}

View File

@@ -100,7 +100,7 @@ namespace NzbDrone.Core.Indexers.Newznab
yield return GetDefinition("Miatrix", GetSettings("https://www.miatrix.com"), categories: new[] { 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000 });
yield return GetDefinition("Newz69", GetSettings("https://newz69.keagaming.com"), categories: new[] { 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000 });
yield return GetDefinition("NinjaCentral", GetSettings("https://ninjacentral.co.za"), categories: new[] { 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000 });
yield return GetDefinition("Nzb.su", GetSettings("https://api.nzb.su"), categories: new[] { 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000 });
yield return GetDefinition("Nzb.life", GetSettings("https://api.nzb.life"), categories: new[] { 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000 });
yield return GetDefinition("NZBCat", GetSettings("https://nzb.cat"), categories: new[] { 1000, 2000, 3000, 4000, 5000, 6000, 7000 });
yield return GetDefinition("NZBFinder", GetSettings("https://nzbfinder.ws"), categories: new[] { 2000, 3000, 5000, 6000, 7000 });
yield return GetDefinition("NZBgeek", GetSettings("https://api.nzbgeek.info"), categories: new[] { 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000 });

View File

@@ -263,7 +263,7 @@ namespace NzbDrone.Core.Indexers.Newznab
searchUrl += "&apikey=" + Settings.ApiKey;
}
if (searchCriteria.Limit.HasValue)
if (searchCriteria.Limit is > 0)
{
parameters.Set("limit", searchCriteria.Limit.ToString());
}

View File

@@ -9,10 +9,10 @@ namespace NzbDrone.Core.Indexers.Newznab
{
public class NewznabSettingsValidator : AbstractValidator<NewznabSettings>
{
private static readonly string[] ApiKeyWhiteList =
private static readonly string[] ApiKeyAllowList =
{
"nzbs.org",
"nzb.su",
"nzb.life",
"dognzb.cr",
"nzbplanet.net",
"nzbid.org",
@@ -22,7 +22,7 @@ namespace NzbDrone.Core.Indexers.Newznab
private static bool ShouldHaveApiKey(NewznabSettings settings)
{
return settings.BaseUrl != null && ApiKeyWhiteList.Any(c => settings.BaseUrl.ToLowerInvariant().Contains(c));
return settings.BaseUrl != null && ApiKeyAllowList.Any(c => settings.BaseUrl.ToLowerInvariant().Contains(c));
}
private static readonly Regex AdditionalParametersRegex = new Regex(@"(&.+?\=.+?)+", RegexOptions.Compiled);

View File

@@ -35,6 +35,16 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn
throw new RequestLimitReachedException(indexerResponse, "PTP Query Limit Reached. Please try again later.");
}
if (httpResponse.StatusCode == HttpStatusCode.TooManyRequests && indexerResponse.Content.Contains("We are not a TV indexer"))
{
throw new IndexerException(indexerResponse, "Invalid indexer request: We are not a TV indexer", HttpStatusCode.BadRequest);
}
if (httpResponse.StatusCode == HttpStatusCode.TooManyRequests)
{
throw new RequestLimitReachedException(indexerResponse, "PTP Request Limit Reached. Please try again later.");
}
throw new IndexerException(indexerResponse, $"Unexpected response status {indexerResponse.HttpResponse.StatusCode} code from indexer request");
}

View File

@@ -2,6 +2,7 @@ using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Net;
using NzbDrone.Common.Extensions;
using NzbDrone.Common.Http;
using NzbDrone.Core.IndexerSearch.Definitions;
@@ -115,6 +116,7 @@ namespace NzbDrone.Core.Indexers.Definitions.PassThePopcorn
var request = new IndexerRequest(searchUrl, HttpAccept.Json);
request.HttpRequest.Headers.Add("ApiUser", _settings.APIUser);
request.HttpRequest.Headers.Add("ApiKey", _settings.APIKey);
request.HttpRequest.SuppressHttpErrorStatusCodes = new[] { HttpStatusCode.TooManyRequests };
yield return request;
}

View File

@@ -57,6 +57,7 @@ namespace NzbDrone.Core.Indexers.Definitions
};
var authLoginRequest = requestBuilder
.SetEncoding(Encoding)
.AddFormParameter("login_username", Settings.Username)
.AddFormParameter("login_password", Settings.Password)
.AddFormParameter("login", "Login")

View File

@@ -66,6 +66,7 @@ public class PreToMe : TorrentIndexerBase<PreToMeSettings>
};
var authLoginRequest = requestBuilder
.SetEncoding(Encoding)
.SetCookies(loginPage.GetCookies())
.AddFormParameter("username", Settings.Username)
.AddFormParameter("password", Settings.Password)

View File

@@ -10,7 +10,7 @@ namespace NzbDrone.Core.Indexers.Definitions
{
public override string Name => "PrivateHD";
public override string[] IndexerUrls => new[] { "https://privatehd.to/" };
public override string Description => "PrivateHD (PHD) is a Private Torrent Tracker for HD MOVIES / TV and the sister-site of AvistaZ, CinemaZ, ExoticaZ, and AnimeTorrents";
public override string Description => "PrivateHD (PHD) is a Private Torrent Tracker for HD MOVIES / TV and the sister-site of AvistaZ, CinemaZ, ExoticaZ, and AnimeZ";
public override IndexerPrivacy Privacy => IndexerPrivacy.Private;
public PrivateHD(IIndexerRepository indexerRepository,

View File

@@ -23,7 +23,8 @@ namespace NzbDrone.Core.Indexers.Definitions
{
public override string Name => "RevolutionTT";
public override string[] IndexerUrls => new[] { "https://revolutiontt.me/" };
public override string[] IndexerUrls => new[] { "https://revott.me/" };
public override string[] LegacyUrls => new[] { "https://revolutiontt.me/" };
public override string Description => "The Revolution has begun";
private string LoginUrl => Settings.BaseUrl + "takelogin.php";
public override IndexerPrivacy Privacy => IndexerPrivacy.Private;

View File

@@ -91,6 +91,7 @@ namespace NzbDrone.Core.Indexers.Definitions
Cookies = null;
var authLoginRequest = requestBuilder.Post()
.SetEncoding(Encoding)
.AddFormParameter("login_username", Settings.Username)
.AddFormParameter("login_password", Settings.Password)
.AddFormParameter("login", "Login")
@@ -1541,7 +1542,7 @@ namespace NzbDrone.Core.Indexers.Definitions
if (season != 0)
{
searchString += " Сезон: " + season;
searchString += " ТВ | Сезон: " + season;
}
parameters.Set("nm", searchString);
@@ -1712,6 +1713,8 @@ namespace NzbDrone.Core.Indexers.Definitions
private readonly Regex _tvTitleRusSeasonRegex = new(@"Сезон\s*[:]*\s+(\d+(?:-\d+)?)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
private readonly Regex _tvTitleRusEpisodeOfRegex = new(@"(?:Серии|Эпизод|Выпуски)+\s*[:]*\s+(\d+(?:-\d+)?)\s*из\s*([\w?])", RegexOptions.Compiled | RegexOptions.IgnoreCase);
private readonly Regex _tvTitleRusEpisodeRegex = new(@"(?:Серии|Эпизод|Выпуски)+\s*[:]*\s+(\d+(?:-\d+)?)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
private readonly Regex _tvTitleRusSeasonAnimeRegex = new(@"ТВ[-]*(?:(\d+))", RegexOptions.Compiled | RegexOptions.IgnoreCase);
private readonly Regex _tvTitleRusEpisodeAnimeOfRegex = new(@"\[(\d+(\+\d+)?)\s+из\s+(\d+(\+\d+)?)\]", RegexOptions.Compiled | RegexOptions.IgnoreCase);
public string Parse(string title,
ICollection<IndexerCategory> categories,
@@ -1736,6 +1739,8 @@ namespace NzbDrone.Core.Indexers.Definitions
title = _tvTitleRusSeasonRegex.Replace(title, "S$1");
title = _tvTitleRusEpisodeOfRegex.Replace(title, "E$1 of $2");
title = _tvTitleRusEpisodeRegex.Replace(title, "E$1");
title = _tvTitleRusSeasonAnimeRegex.Replace(title, "S$1");
title = _tvTitleRusEpisodeAnimeOfRegex.Replace(title, "E$1 of $3");
}
else if (IsAnyMovieCategory(categories))
{
@@ -1749,7 +1754,7 @@ namespace NzbDrone.Core.Indexers.Definitions
// rutracker movies titles look like: russian name / english name (russian director / english director) other stuff
// Ирландец / The Irishman (Мартин Скорсезе / Martin Scorsese) [2019, США, криминал, драма, биография, WEB-DL 1080p] Dub (Пифагор) + MVO (Jaskier) + AVO (Юрий Сербин) + Sub Rus, Eng + Original Eng
// this part should be removed: (Мартин Скорсезе / Martin Scorsese)
title = Regex.Replace(title, @"(\([\p{IsCyrillic}\W]+)\s/\s(.+?)\)", string.Empty, RegexOptions.Compiled | RegexOptions.IgnoreCase);
title = Regex.Replace(title, @"(\([\p{IsCyrillic}\W]+)(?:\s/\s(.+?))?\)", string.Empty, RegexOptions.Compiled | RegexOptions.IgnoreCase);
// Remove VO, MVO and DVO from titles
var vo = new Regex(@"((?:\dx\s)?(?:[A-Z])?VO\s\(.+?\))");

View File

@@ -19,6 +19,7 @@ using NzbDrone.Core.Parser.Model;
namespace NzbDrone.Core.Indexers.Definitions
{
[Obsolete("Migrated to YAML for Torznab API")]
public class SceneTime : TorrentIndexerBase<SceneTimeSettings>
{
public override string Name => "SceneTime";
@@ -41,7 +42,7 @@ namespace NzbDrone.Core.Indexers.Definitions
public override IParseIndexerResponse GetParser()
{
return new SceneTimeParser(Settings, Capabilities.Categories);
return new SceneTimeParser(Settings, Capabilities.Categories, _logger);
}
protected override bool CheckIfLoginNeeded(HttpResponse httpResponse)
@@ -59,7 +60,7 @@ namespace NzbDrone.Core.Indexers.Definitions
return CookieUtil.CookieHeaderToDictionary(Settings.Cookie);
}
private IndexerCapabilities SetCapabilities()
private static IndexerCapabilities SetCapabilities()
{
var caps = new IndexerCapabilities
{
@@ -213,11 +214,13 @@ namespace NzbDrone.Core.Indexers.Definitions
{
private readonly SceneTimeSettings _settings;
private readonly IndexerCapabilitiesCategories _categories;
private readonly Logger _logger;
public SceneTimeParser(SceneTimeSettings settings, IndexerCapabilitiesCategories categories)
public SceneTimeParser(SceneTimeSettings settings, IndexerCapabilitiesCategories categories, Logger logger)
{
_settings = settings;
_categories = categories;
_logger = logger;
}
public IList<ReleaseInfo> ParseResponse(IndexerResponse indexerResponse)
@@ -227,29 +230,30 @@ namespace NzbDrone.Core.Indexers.Definitions
var parser = new HtmlParser();
using var dom = parser.ParseDocument(indexerResponse.Content);
var table = dom.QuerySelector("table.movehere");
var table = dom.QuerySelector("table#torrenttable");
if (table == null)
{
return releaseInfos; // no results
_logger.Error("No results, table element is not present in page.");
return releaseInfos;
}
var headerColumns = table.QuerySelectorAll("tbody > tr > td.cat_Head").Select(x => x.TextContent).ToList();
var categoryIndex = headerColumns.FindIndex(x => x.Equals("Type"));
var nameIndex = headerColumns.FindIndex(x => x.Equals("Name"));
var sizeIndex = headerColumns.FindIndex(x => x.Equals("Size"));
var seedersIndex = headerColumns.FindIndex(x => x.Equals("Seeders"));
var leechersIndex = headerColumns.FindIndex(x => x.Equals("Leechers"));
var headerColumns = table.QuerySelectorAll("thead > tr > th")
.Select(x => x.GetAttribute("title") ?? x.QuerySelector("a[title]")?.GetAttribute("title") ?? x.TextContent)
.ToList();
var rows = dom.QuerySelectorAll("tr.browse");
var categoryIndex = headerColumns.FindIndex(x => x.Equals("Type", StringComparison.OrdinalIgnoreCase));
var nameIndex = headerColumns.FindIndex(x => x.Equals("Name", StringComparison.OrdinalIgnoreCase));
var sizeIndex = headerColumns.FindIndex(x => x.Equals("Size", StringComparison.OrdinalIgnoreCase));
var seedersIndex = headerColumns.FindIndex(x => x.Equals("Seeders", StringComparison.OrdinalIgnoreCase));
var leechersIndex = headerColumns.FindIndex(x => x.Equals("Leechers", StringComparison.OrdinalIgnoreCase));
var rows = table.QuerySelectorAll("tbody > tr");
foreach (var row in rows)
{
var qDescCol = row.Children[nameIndex];
var qLink = qDescCol.QuerySelector("a");
// Clean up title
qLink.QuerySelectorAll("font[color=\"green\"]").ToList().ForEach(e => e.Remove());
var title = qLink.TextContent.Trim();
var title = qLink.QuerySelector("span.bw-torrent-name").TextContent.Trim();
var infoUrl = _settings.BaseUrl + qLink.GetAttribute("href")?.TrimStart('/');
var torrentId = ParseUtil.GetArgumentFromQueryString(infoUrl, "id");
@@ -274,7 +278,7 @@ namespace NzbDrone.Core.Indexers.Definitions
Size = ParseUtil.GetBytes(row.Children[sizeIndex].TextContent),
Seeders = seeders,
Peers = ParseUtil.CoerceInt(row.Children[leechersIndex].TextContent.Trim()) + seeders,
DownloadVolumeFactor = row.QuerySelector("font > b:contains(Freeleech)") != null ? 0 : 1,
DownloadVolumeFactor = row.QuerySelector("span.tag.free") is not null ? 0 : 1,
UploadVolumeFactor = 1,
MinimumRatio = 1,
MinimumSeedTime = 259200 // 72 hours

View File

@@ -27,7 +27,8 @@ namespace NzbDrone.Core.Indexers.Definitions;
public class Shazbat : TorrentIndexerBase<ShazbatSettings>
{
public override string Name => "Shazbat";
public override string[] IndexerUrls => new[] { "https://www.shazbat.tv/" };
public override string[] IndexerUrls => new[] { "https://www.shazbat.tube/" };
public override string[] LegacyUrls => new[] { "https://www.shazbat.tv/" };
public override string Description => "Shazbat is a PRIVATE Torrent Tracker with highly curated TV content";
public override string Language => "en-US";
public override Encoding Encoding => Encoding.UTF8;
@@ -68,8 +69,8 @@ public class Shazbat : TorrentIndexerBase<ShazbatSettings>
.AddFormParameter("referer", "")
.AddFormParameter("query", "")
.AddFormParameter("tv_timezone", "0")
.AddFormParameter("tv_login", Settings.Username)
.AddFormParameter("tv_password", Settings.Password)
.AddFormParameter("username", Settings.Username)
.AddFormParameter("password", Settings.Password)
.SetHeader("Content-Type", "application/x-www-form-urlencoded")
.SetHeader("Referer", loginUrl)
.Build();
@@ -91,9 +92,11 @@ public class Shazbat : TorrentIndexerBase<ShazbatSettings>
_logger.Debug("Authentication succeeded.");
}
protected override bool CheckIfLoginNeeded(HttpResponse response)
protected override bool CheckIfLoginNeeded(HttpResponse httpResponse)
{
return response.Content.ContainsIgnoreCase("sign in now");
return (httpResponse.HasHttpRedirect && httpResponse.RedirectUrl.ContainsIgnoreCase("login")) ||
httpResponse.Content.ContainsIgnoreCase("sign in now") ||
(httpResponse.Content.ContainsIgnoreCase("fullRedirect") && httpResponse.Content.ContainsIgnoreCase("login"));
}
private IndexerCapabilities SetCapabilities()
@@ -167,9 +170,9 @@ public class ShazbatRequestGenerator : IIndexerRequestGenerator
if (term.IsNotNullOrWhiteSpace())
{
var request = new HttpRequestBuilder(_settings.BaseUrl + "search").Post()
.AddFormParameter("search", term)
.SetHeader("Content-Type", "application/x-www-form-urlencoded")
var request = new HttpRequestBuilder(_settings.BaseUrl + "search")
.AddQueryParam("search", term)
.AddQueryParam("portlet", "true")
.SetHeader("X-Requested-With", "XMLHttpRequest")
.SetHeader("Referer", _settings.BaseUrl)
.Accept(HttpAccept.Html)
@@ -194,14 +197,14 @@ public class ShazbatRequestGenerator : IIndexerRequestGenerator
term = Regex.Replace(term, @"(.+)\b\d{4}(\.\d{2}\.\d{2})?\b", "$1");
term = Regex.Replace(term, @"[\.\s\(\)\[\]]+", " ");
return term.ToLower().Trim();
return term.ToLowerInvariant().Trim();
}
public Func<IDictionary<string, string>> GetCookies { get; set; }
public Action<IDictionary<string, string>, DateTime?> CookiesUpdater { get; set; }
}
public class ShazbatParser : IParseIndexerResponse
public partial class ShazbatParser : IParseIndexerResponse
{
private readonly ProviderDefinition _definition;
private readonly ShazbatSettings _settings;
@@ -209,8 +212,10 @@ public class ShazbatParser : IParseIndexerResponse
private readonly IIndexerHttpClient _httpClient;
private readonly Logger _logger;
private readonly Regex _torrentInfoRegex = new(@"\((?<size>\d+)\):(?<seeders>\d+) \/ :(?<leechers>\d+)$", RegexOptions.Compiled);
private readonly HashSet<string> _hdResolutions = new() { "1080p", "1080i", "720p" };
private readonly HashSet<string> _hdResolutions = ["1080p", "1080i", "720p"];
[GeneratedRegex(@"\((?<size>\d+)\)\s*:(?<seeders>\d+) \/ :(?<leechers>\d+)$", RegexOptions.Compiled)]
private static partial Regex TorrentInfoRegex();
public ShazbatParser(ProviderDefinition definition, ShazbatSettings settings, TimeSpan rateLimit, IIndexerHttpClient httpClient, Logger logger)
{
@@ -257,15 +262,15 @@ public class ShazbatParser : IParseIndexerResponse
var showPageUrl = new HttpRequestBuilder(_settings.BaseUrl + "show")
.AddQueryParam("id", show.GetAttribute("data-id"))
.Build()
.Url.FullUri;
.Url
.FullUri;
var showRequest = new HttpRequestBuilder(_settings.BaseUrl + "show").Post()
var showRequest = new HttpRequestBuilder(_settings.BaseUrl + "show")
.SetCookies(indexerResponse.HttpResponse.GetCookies() ?? new Dictionary<string, string>())
.AddQueryParam("id", show.GetAttribute("data-id"))
.AddQueryParam("show_mode", "torrents")
.AddFormParameter("portlet", "true")
.AddFormParameter("tab", "true")
.SetHeader("Content-Type", "application/x-www-form-urlencoded")
.AddQueryParam("portlet", "true")
.AddQueryParam("tab", "true")
.SetHeader("X-Requested-With", "XMLHttpRequest")
.SetHeader("Referer", showPageUrl)
.Accept(HttpAccept.Html)
@@ -277,7 +282,8 @@ public class ShazbatParser : IParseIndexerResponse
var releaseRequest = new IndexerRequest(showRequest);
var releaseResponse = new IndexerResponse(releaseRequest, _httpClient.ExecuteProxied(releaseRequest.HttpRequest, _definition));
if (releaseResponse.HttpResponse.Content.ContainsIgnoreCase("sign in now"))
if ((releaseResponse.HttpResponse.HasHttpRedirect && releaseResponse.HttpResponse.RedirectUrl.ContainsIgnoreCase("login")) ||
releaseResponse.HttpResponse.Content.ContainsIgnoreCase("sign in now"))
{
// Remove cookie cache
CookiesUpdater(null, null);
@@ -323,13 +329,15 @@ public class ShazbatParser : IParseIndexerResponse
var title = ParseTitle(row.QuerySelector("td:nth-of-type(3)"));
var infoString = row.QuerySelector("td:nth-of-type(4)")?.TextContent.Trim() ?? string.Empty;
var matchInfo = _torrentInfoRegex.Match(infoString);
var matchInfo = TorrentInfoRegex().Match(infoString);
var size = matchInfo.Groups["size"].Success && long.TryParse(matchInfo.Groups["size"].Value, out var outSize) ? outSize : 0;
var seeders = matchInfo.Groups["seeders"].Success && int.TryParse(matchInfo.Groups["seeders"].Value, out var outSeeders) ? outSeeders : 0;
var leechers = matchInfo.Groups["leechers"].Success && int.TryParse(matchInfo.Groups["leechers"].Value, out var outLeechers) ? outLeechers : 0;
var dateTimestamp = row.QuerySelector(".datetime[data-timestamp]")?.GetAttribute("data-timestamp");
publishDate = dateTimestamp != null && ParseUtil.TryCoerceDouble(dateTimestamp, out var timestamp) ? DateTimeUtil.UnixTimestampToDateTime(timestamp) : publishDate.AddMinutes(-1);
publishDate = dateTimestamp != null && ParseUtil.TryCoerceLong(dateTimestamp, out var timestamp)
? DateTimeUtil.UnixTimestampToDateTime(timestamp)
: publishDate.AddMinutes(-1);
var release = new TorrentInfo
{
@@ -363,10 +371,10 @@ public class ShazbatParser : IParseIndexerResponse
return title?.TextContent.Trim();
}
protected virtual List<IndexerCategory> ParseCategories(string title)
private List<IndexerCategory> ParseCategories(string title)
{
var categories = new List<IndexerCategory>
{
return
[
NewznabStandardCategory.TV,
title switch
{
@@ -374,9 +382,7 @@ public class ShazbatParser : IParseIndexerResponse
_ when title.Contains("2160p") => NewznabStandardCategory.TVUHD,
_ => NewznabStandardCategory.TVSD
}
};
return categories;
];
}
public Action<IDictionary<string, string>, DateTime?> CookiesUpdater { get; set; }

View File

@@ -448,11 +448,11 @@ namespace NzbDrone.Core.Indexers.Definitions
private readonly Regex _tvTitleMultipleSeasonsRegex = new(@"(?:Сезон|Seasons?)\s*[:]*\s+(\d+-\d+)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
private readonly Regex _tvTitleUkrSeasonEpisodeOfRegex = new(@"Сезон\s*[:]*\s+(\d+).+(?:Серії|Серія|Серій|Епізод)+\s*[:]*\s+(\d+(?:-\d+)?)\s*з\s*([\w?])", RegexOptions.Compiled | RegexOptions.IgnoreCase);
private readonly Regex _tvTitleUkrSeasonEpisodeRegex = new(@"Сезон\s*[:]*\s+(\d+).+(?:Серії|Серія|Серій|Епізод)+\s*[:]*\s+(\d+(?:-\d+)?)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
private readonly Regex _tvTitleUkrSeasonEpisodeOfRegex = new(@"Сезон\s*[:]*\s+(\d+).+(?:Серії|Серія|Серій|Епізоди?)+\s*[:]*\s+(\d+(?:-\d+)?)\s*з\s*([\w?])", RegexOptions.Compiled | RegexOptions.IgnoreCase);
private readonly Regex _tvTitleUkrSeasonEpisodeRegex = new(@"Сезон\s*[:]*\s+(\d+).+(?:Серії|Серія|Серій|Епізоди?)+\s*[:]*\s+(\d+(?:-\d+)?)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
private readonly Regex _tvTitleUkrSeasonRegex = new(@"Сезон\s*[:]*\s+(\d+)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
private readonly Regex _tvTitleUkrEpisodeOfRegex = new(@"(?:Серії|Серія|Серій|Епізод)+\s*[:]*\s+(\d+(?:-\d+)?)\s*з\s*([\w?])", RegexOptions.Compiled | RegexOptions.IgnoreCase);
private readonly Regex _tvTitleUkrEpisodeRegex = new(@"(?:Серії|Серія|Серій|Епізод)+\s*[:]*\s+(\d+(?:-\d+)?)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
private readonly Regex _tvTitleUkrEpisodeOfRegex = new(@"(?:Серії|Серія|Серій|Епізоди?)+\s*[:]*\s+(\d+(?:-\d+)?)\s*з\s*([\w?])", RegexOptions.Compiled | RegexOptions.IgnoreCase);
private readonly Regex _tvTitleUkrEpisodeRegex = new(@"(?:Серії|Серія|Серій|Епізоди?)+\s*[:]*\s+(\d+(?:-\d+)?)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
private readonly Regex _tvTitleEngSeasonEpisodeOfRegex = new(@"Season\s*[:]*\s+(\d+).+(?:Episodes?)+\s*[:]*\s+(\d+(?:-\d+)?)\s*of\s*([\w?])", RegexOptions.Compiled | RegexOptions.IgnoreCase);
private readonly Regex _tvTitleEngSeasonEpisodeRegex = new(@"Season\s*[:]*\s+(\d+).+(?:Episodes?)+\s*[:]*\s+(\d+(?:-\d+)?)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
@@ -506,7 +506,7 @@ namespace NzbDrone.Core.Indexers.Definitions
title = Regex.Replace(title, @"[\[\(]\s*[\)\]]", "", RegexOptions.Compiled);
title = title.Trim(' ', '&', ',', '.', '!', '?', '+', '-', '_', '|', '/', '\\', ':');
title = title.Trim(' ', '&', ',', '.', '!', '?', '+', '-', '_', '|', '/', '\\', ':', ';', 'ʼ', '`');
// replace multiple spaces with a single space
title = Regex.Replace(title, @"\s+", " ");
@@ -521,7 +521,7 @@ namespace NzbDrone.Core.Indexers.Definitions
private static string MoveFirstTagsToEndOfReleaseTitle(string input)
{
var output = input;
var output = input.Trim(' ', '&', ',', '.', '!', '?', '+', '-', '_', '|', '/', '\\', ':', ';', 'ʼ', '`');
foreach (var findTagsRegex in FindTagsInTitlesRegexList)
{
var expectedIndex = 0;

View File

@@ -58,6 +58,7 @@ namespace NzbDrone.Core.Indexers.Definitions
Cookies = null;
var authLoginRequest = requestBuilder
.SetEncoding(Encoding)
.AddFormParameter("username", Settings.Username)
.AddFormParameter("password", Settings.Password)
.AddFormParameter("returnto", "/")

View File

@@ -83,10 +83,11 @@ namespace NzbDrone.Core.Indexers.Definitions
}
};
caps.Categories.AddCategoryMapping(96, NewznabStandardCategory.MoviesUHD, "Movie/4K");
caps.Categories.AddCategoryMapping(25, NewznabStandardCategory.MoviesSD, "Movies/480p");
caps.Categories.AddCategoryMapping(96, NewznabStandardCategory.MoviesUHD, "Movie/4K");
caps.Categories.AddCategoryMapping(11, NewznabStandardCategory.MoviesBluRay, "Movies/Bluray");
caps.Categories.AddCategoryMapping(5, NewznabStandardCategory.MoviesBluRay, "Movies/Bluray-Full");
caps.Categories.AddCategoryMapping(103, NewznabStandardCategory.MoviesSD, "Movies/Cam");
caps.Categories.AddCategoryMapping(3, NewznabStandardCategory.MoviesDVD, "Movies/DVD-R");
caps.Categories.AddCategoryMapping(21, NewznabStandardCategory.MoviesSD, "Movies/MP4");
caps.Categories.AddCategoryMapping(22, NewznabStandardCategory.MoviesForeign, "Movies/Non-English");
@@ -96,6 +97,7 @@ namespace NzbDrone.Core.Indexers.Definitions
caps.Categories.AddCategoryMapping(1, NewznabStandardCategory.MoviesSD, "Movies/XviD");
caps.Categories.AddCategoryMapping(24, NewznabStandardCategory.TVSD, "TV/480p");
caps.Categories.AddCategoryMapping(104, NewznabStandardCategory.TVUHD, "TV/4K");
caps.Categories.AddCategoryMapping(32, NewznabStandardCategory.TVHD, "TV/Bluray");
caps.Categories.AddCategoryMapping(31, NewznabStandardCategory.TVSD, "TV/DVD-R");
caps.Categories.AddCategoryMapping(33, NewznabStandardCategory.TVSD, "TV/DVD-Rip");
@@ -104,13 +106,13 @@ namespace NzbDrone.Core.Indexers.Definitions
caps.Categories.AddCategoryMapping(14, NewznabStandardCategory.TV, "TV/Packs");
caps.Categories.AddCategoryMapping(26, NewznabStandardCategory.TVSD, "TV/SD/x264");
caps.Categories.AddCategoryMapping(7, NewznabStandardCategory.TVHD, "TV/x264");
caps.Categories.AddCategoryMapping(34, NewznabStandardCategory.TVUHD, "TV/x265");
caps.Categories.AddCategoryMapping(34, NewznabStandardCategory.TVx265, "TV/x265");
caps.Categories.AddCategoryMapping(2, NewznabStandardCategory.TVSD, "TV/XviD");
caps.Categories.AddCategoryMapping(10, NewznabStandardCategory.ConsoleNDS, "Nintendo");
caps.Categories.AddCategoryMapping(4, NewznabStandardCategory.PCGames, "PC/Games");
caps.Categories.AddCategoryMapping(18, NewznabStandardCategory.ConsolePS3, "PS");
caps.Categories.AddCategoryMapping(8, NewznabStandardCategory.ConsolePSP, "PSP");
caps.Categories.AddCategoryMapping(10, NewznabStandardCategory.ConsoleNDS, "Nintendo");
caps.Categories.AddCategoryMapping(9, NewznabStandardCategory.ConsoleXBox, "Xbox");
caps.Categories.AddCategoryMapping(17, NewznabStandardCategory.AudioMP3, "Music/Audio");

View File

@@ -11,11 +11,11 @@ namespace NzbDrone.Core.Indexers.Torznab
{
public class TorznabSettingsValidator : AbstractValidator<TorznabSettings>
{
private static readonly string[] ApiKeyWhiteList = Array.Empty<string>();
private static readonly string[] ApiKeyAllowList = Array.Empty<string>();
private static bool ShouldHaveApiKey(TorznabSettings settings)
{
return settings.BaseUrl != null && ApiKeyWhiteList.Any(c => settings.BaseUrl.ToLowerInvariant().Contains(c));
return settings.BaseUrl != null && ApiKeyAllowList.Any(c => settings.BaseUrl.ToLowerInvariant().Contains(c));
}
private static readonly Regex AdditionalParametersRegex = new Regex(@"(&.+?\=.+?)+", RegexOptions.Compiled);

View File

@@ -121,53 +121,49 @@ public class XSpeeds : TorrentIndexerBase<XSpeedsSettings>
caps.Categories.AddCategoryMapping(112, NewznabStandardCategory.MoviesOther, "Anime Movies");
caps.Categories.AddCategoryMapping(111, NewznabStandardCategory.MoviesOther, "Anime TV");
caps.Categories.AddCategoryMapping(150, NewznabStandardCategory.PC, "Apps");
caps.Categories.AddCategoryMapping(156, NewznabStandardCategory.TV, "AV1");
caps.Categories.AddCategoryMapping(156, NewznabStandardCategory.Movies, "AV1");
caps.Categories.AddCategoryMapping(159, NewznabStandardCategory.Movies, "Movie Boxsets AV1");
caps.Categories.AddCategoryMapping(158, NewznabStandardCategory.Movies, "Movies AV1");
caps.Categories.AddCategoryMapping(157, NewznabStandardCategory.TV, "TV AV1");
caps.Categories.AddCategoryMapping(160, NewznabStandardCategory.TV, "TV Boxsets AV1");
caps.Categories.AddCategoryMapping(153, NewznabStandardCategory.Books, "Books");
caps.Categories.AddCategoryMapping(154, NewznabStandardCategory.AudioAudiobook, "Audiobooks");
caps.Categories.AddCategoryMapping(155, NewznabStandardCategory.Books, "Books & Magazines");
caps.Categories.AddCategoryMapping(154, NewznabStandardCategory.AudioAudiobook, "Books Audiobooks");
caps.Categories.AddCategoryMapping(155, NewznabStandardCategory.Books, "Books eBooks & Magazines");
caps.Categories.AddCategoryMapping(68, NewznabStandardCategory.MoviesOther, "Cams/TS");
caps.Categories.AddCategoryMapping(140, NewznabStandardCategory.TVDocumentary, "Documentary");
caps.Categories.AddCategoryMapping(10, NewznabStandardCategory.MoviesDVD, "DVDR");
caps.Categories.AddCategoryMapping(109, NewznabStandardCategory.MoviesBluRay, "Bluray Disc");
caps.Categories.AddCategoryMapping(109, NewznabStandardCategory.MoviesBluRay, "DVDR Bluray Disc");
caps.Categories.AddCategoryMapping(131, NewznabStandardCategory.TVSport, "Fighting");
caps.Categories.AddCategoryMapping(134, NewznabStandardCategory.TVSport, "Fighting/Boxing");
caps.Categories.AddCategoryMapping(133, NewznabStandardCategory.TVSport, "Fighting/MMA");
caps.Categories.AddCategoryMapping(132, NewznabStandardCategory.TVSport, "Fighting/Wrestling");
caps.Categories.AddCategoryMapping(134, NewznabStandardCategory.TVSport, "Fighting Boxing");
caps.Categories.AddCategoryMapping(133, NewznabStandardCategory.TVSport, "Fighting MMA");
caps.Categories.AddCategoryMapping(132, NewznabStandardCategory.TVSport, "Fighting Wrestling");
caps.Categories.AddCategoryMapping(72, NewznabStandardCategory.MoviesForeign, "Foreign");
caps.Categories.AddCategoryMapping(116, NewznabStandardCategory.TVForeign, "Foreign Boxsets");
caps.Categories.AddCategoryMapping(114, NewznabStandardCategory.MoviesForeign, "Foreign Movies");
caps.Categories.AddCategoryMapping(115, NewznabStandardCategory.TVForeign, "Foreign TV");
caps.Categories.AddCategoryMapping(103, NewznabStandardCategory.ConsoleOther, "Games Console");
caps.Categories.AddCategoryMapping(105, NewznabStandardCategory.ConsoleOther, "Games Console/Nintendo");
caps.Categories.AddCategoryMapping(104, NewznabStandardCategory.ConsolePS4, "Games Console/Playstation");
caps.Categories.AddCategoryMapping(106, NewznabStandardCategory.ConsoleXBox, "Games Console/XBOX");
caps.Categories.AddCategoryMapping(105, NewznabStandardCategory.ConsoleOther, "Games Console Nintendo");
caps.Categories.AddCategoryMapping(104, NewznabStandardCategory.ConsolePS4, "Games Console Playstation");
caps.Categories.AddCategoryMapping(106, NewznabStandardCategory.ConsoleXBox, "Games Console XBOX");
caps.Categories.AddCategoryMapping(6, NewznabStandardCategory.PCGames, "Games PC");
caps.Categories.AddCategoryMapping(108, NewznabStandardCategory.PC, "Games PC/Linux");
caps.Categories.AddCategoryMapping(107, NewznabStandardCategory.PCMac, "Games PC/Mac");
caps.Categories.AddCategoryMapping(108, NewznabStandardCategory.PC, "Games PC Linux");
caps.Categories.AddCategoryMapping(107, NewznabStandardCategory.PCMac, "Games PC Mac");
caps.Categories.AddCategoryMapping(11, NewznabStandardCategory.Movies, "Movie Boxsets");
caps.Categories.AddCategoryMapping(118, NewznabStandardCategory.MoviesUHD, "Movie Boxsets/Boxset 4K");
caps.Categories.AddCategoryMapping(143, NewznabStandardCategory.MoviesHD, "Movie Boxsets/Boxset HD");
caps.Categories.AddCategoryMapping(119, NewznabStandardCategory.MoviesHD, "Movie Boxsets/Boxset HEVC");
caps.Categories.AddCategoryMapping(144, NewznabStandardCategory.MoviesSD, "Movie Boxsets/Boxset SD");
caps.Categories.AddCategoryMapping(118, NewznabStandardCategory.MoviesUHD, "Movie Boxsets 4K");
caps.Categories.AddCategoryMapping(162, NewznabStandardCategory.MoviesHD, "Movie Boxsets AV1");
caps.Categories.AddCategoryMapping(143, NewznabStandardCategory.MoviesHD, "Movie Boxsets HD");
caps.Categories.AddCategoryMapping(119, NewznabStandardCategory.MoviesHD, "Movie Boxsets HEVC");
caps.Categories.AddCategoryMapping(144, NewznabStandardCategory.MoviesSD, "Movie Boxsets SD");
caps.Categories.AddCategoryMapping(12, NewznabStandardCategory.Movies, "Movies");
caps.Categories.AddCategoryMapping(117, NewznabStandardCategory.MoviesUHD, "Movies 4K");
caps.Categories.AddCategoryMapping(163, NewznabStandardCategory.MoviesHD, "Movies AV1");
caps.Categories.AddCategoryMapping(145, NewznabStandardCategory.MoviesHD, "Movies HD");
caps.Categories.AddCategoryMapping(100, NewznabStandardCategory.MoviesHD, "Movies HEVC");
caps.Categories.AddCategoryMapping(146, NewznabStandardCategory.MoviesSD, "Movies SD");
caps.Categories.AddCategoryMapping(13, NewznabStandardCategory.Audio, "Music");
caps.Categories.AddCategoryMapping(135, NewznabStandardCategory.AudioLossless, "Music/FLAC");
caps.Categories.AddCategoryMapping(151, NewznabStandardCategory.Audio, "Karaoke");
caps.Categories.AddCategoryMapping(135, NewznabStandardCategory.AudioLossless, "Music FLAC");
caps.Categories.AddCategoryMapping(151, NewznabStandardCategory.Audio, "Music Karaoke");
caps.Categories.AddCategoryMapping(136, NewznabStandardCategory.Audio, "Music Boxset");
caps.Categories.AddCategoryMapping(148, NewznabStandardCategory.AudioVideo, "Music Videos");
caps.Categories.AddCategoryMapping(9, NewznabStandardCategory.Other, "Other");
caps.Categories.AddCategoryMapping(125, NewznabStandardCategory.Other, "Other/Pictures");
caps.Categories.AddCategoryMapping(54, NewznabStandardCategory.TVOther, "Soaps");
caps.Categories.AddCategoryMapping(83, NewznabStandardCategory.TVOther, "Specials");
caps.Categories.AddCategoryMapping(125, NewznabStandardCategory.Other, "Other Pictures");
caps.Categories.AddCategoryMapping(54, NewznabStandardCategory.TVOther, "Other Soaps");
caps.Categories.AddCategoryMapping(83, NewznabStandardCategory.TVOther, "Other Specials");
caps.Categories.AddCategoryMapping(139, NewznabStandardCategory.TV, "TOTM (Freeleech)");
caps.Categories.AddCategoryMapping(138, NewznabStandardCategory.TV, "TOTW (x2 upload)");
caps.Categories.AddCategoryMapping(139, NewznabStandardCategory.Movies, "TOTM (Freeleech)");
@@ -177,16 +173,18 @@ public class XSpeeds : TorrentIndexerBase<XSpeedsSettings>
caps.Categories.AddCategoryMapping(86, NewznabStandardCategory.TVSport, "Sports/MotorSports");
caps.Categories.AddCategoryMapping(89, NewznabStandardCategory.TVSport, "Sports/Olympics");
caps.Categories.AddCategoryMapping(126, NewznabStandardCategory.TV, "TV");
caps.Categories.AddCategoryMapping(149, NewznabStandardCategory.TV, "TV Specials");
caps.Categories.AddCategoryMapping(127, NewznabStandardCategory.TVUHD, "TV 4K");
caps.Categories.AddCategoryMapping(164, NewznabStandardCategory.TVHD, "TV AV1");
caps.Categories.AddCategoryMapping(129, NewznabStandardCategory.TVHD, "TV HD");
caps.Categories.AddCategoryMapping(130, NewznabStandardCategory.TVHD, "TV HEVC");
caps.Categories.AddCategoryMapping(128, NewznabStandardCategory.TVSD, "TV SD");
caps.Categories.AddCategoryMapping(149, NewznabStandardCategory.TV, "TV Specials");
caps.Categories.AddCategoryMapping(21, NewznabStandardCategory.TVSD, "TV Boxsets");
caps.Categories.AddCategoryMapping(120, NewznabStandardCategory.TVUHD, "Boxset TV 4K");
caps.Categories.AddCategoryMapping(76, NewznabStandardCategory.TVHD, "Boxset TV HD");
caps.Categories.AddCategoryMapping(97, NewznabStandardCategory.TVHD, "Boxset TV HEVC");
caps.Categories.AddCategoryMapping(147, NewznabStandardCategory.TVSD, "Boxset TV SD");
caps.Categories.AddCategoryMapping(120, NewznabStandardCategory.TVUHD, "TV Boxset 4K");
caps.Categories.AddCategoryMapping(165, NewznabStandardCategory.TVUHD, "TV Boxset AV1");
caps.Categories.AddCategoryMapping(76, NewznabStandardCategory.TVHD, "TV Boxset HD");
caps.Categories.AddCategoryMapping(97, NewznabStandardCategory.TVHD, "TV Boxset HEVC");
caps.Categories.AddCategoryMapping(147, NewznabStandardCategory.TVSD, "TV Boxset SD");
return caps;
}

View File

@@ -23,6 +23,7 @@ using NzbDrone.Core.Parser.Model;
namespace NzbDrone.Core.Indexers.Definitions
{
[Obsolete("Site does not allow automation")]
public class ZonaQ : TorrentIndexerBase<UserPassTorrentBaseSettings>
{
public override string Name => "ZonaQ";

View File

@@ -503,14 +503,14 @@ namespace NzbDrone.Core.Indexers
catch (IndexerAuthException ex)
{
_indexerStatusService.RecordFailure(Definition.Id);
_logger.Warn(ex, "Invalid Credentials for {0} {1}", this, url);
_logger.Warn(ex, "Invalid Credentials for {0} [{1}]", this, url);
}
catch (CloudFlareProtectionException ex)
{
result.Queries.Add(new IndexerQueryResult { Response = ex.Response });
_indexerStatusService.RecordFailure(Definition.Id);
ex.WithData("FeedUrl", url);
_logger.Error(ex, "Cloudflare protection detected for {0}, Flaresolverr may be required.", this);
_logger.Error(ex, "Cloudflare protection detected for [{0}], Flaresolverr may be required.", this);
}
catch (IndexerException ex)
{
@@ -521,18 +521,18 @@ namespace NzbDrone.Core.Indexers
catch (HttpRequestException ex)
{
_indexerStatusService.RecordFailure(Definition.Id);
_logger.Warn(ex, "Unable to connect to indexer, please check your DNS settings and ensure IPv6 is working or disabled. {0}", url);
_logger.Warn(ex, "Unable to connect to indexer [{0}]. This is typically caused by DNS/SSL issues. Check DNS settings, ensure IPv6 is working or disabled, and consider using different DNS servers or a VPN. See: 'https://wiki.servarr.com/prowlarr/troubleshooting#dns-ssl-connection-issues'", url);
}
catch (TaskCanceledException ex)
{
_indexerStatusService.RecordFailure(Definition.Id);
_logger.Warn(ex, "Unable to connect to indexer, possibly due to a timeout. {0}", url);
_logger.Warn(ex, "Unable to connect to indexer, possibly due to a timeout. [{0}]", url);
}
catch (Exception ex)
{
_indexerStatusService.RecordFailure(Definition.Id);
ex.WithData("FeedUrl", url);
_logger.Error(ex, "An error occurred while processing indexer feed. {0}", url);
_logger.Error(ex, "An error occurred while processing indexer feed. [{0}]", url);
}
result.Releases = CleanupReleases(releases, searchCriteria);
@@ -816,7 +816,7 @@ namespace NzbDrone.Core.Indexers
{
_logger.Warn(ex, "Unable to connect to indexer");
return new NzbDroneValidationFailure(string.Empty, "Unable to connect to indexer, please check your DNS settings and ensure IPv6 is working or disabled. " + ex.Message)
return new NzbDroneValidationFailure(string.Empty, "Unable to connect to indexer. This is typically caused by DNS/SSL issues. Check DNS settings, ensure IPv6 is working or disabled, consider using different DNS servers, or try a VPN/proxy if needed. See: 'https://wiki.servarr.com/prowlarr/troubleshooting#dns-ssl-connection-issues' " + ex.Message)
{
DetailedDescription = ex.InnerException?.Message
};

View File

@@ -375,5 +375,47 @@
"Stats": "الحالة",
"CurrentlyInstalled": "مثبتة حاليا",
"Season": "السبب",
"Mixed": "ثابت"
"Mixed": "ثابت",
"Destination": "مسار الوجهة",
"AddConnection": "الإتصال",
"Notification": "شهادة",
"DeleteClientCategory": "حذف Download Client",
"DeleteIndexerProxy": "حذف المفهرس",
"IndexerHDBitsSettingsOrigins": "أصلي",
"IndexerStatus": "إعدادات المفهرس",
"ManageDownloadClients": "تحميل العملاء",
"Proxies": "مظهر",
"TvSearch": "بحث",
"UnableToLoadAppProfiles": "تعذر تحميل ملفات تعريف التأخير",
"DeleteSelectedIndexersMessageText": "هل أنت متأكد أنك تريد حذف ملفات الأفلام المحددة؟",
"SelectIndexers": "حذف المفهرس",
"EditSelectedDownloadClients": "حذف Download Client",
"EditSyncProfile": "تحرير ملف تعريف التأخير",
"Donate": "تاريخ",
"UnableToLoadIndexerProxies": "تعذر تحميل المفهرسات",
"IndexerProxy": "أولوية المفهرس",
"MovieSearch": "البحث الشامل عن الأفلام",
"UnableToLoadDevelopmentSettings": "تعذر تحميل الإعدادات العامة",
"AddNewIndexer": "أضف مفهرس",
"IndexerId": "مفهرس",
"AddCustomFilter": "مرشحات مخصصة",
"AuthenticationMethod": "المصادقة",
"Connect": "شهادة",
"DeleteSelectedApplicationsMessageText": "هل أنت متأكد أنك تريد حذف ملفات الأفلام المحددة؟",
"DeleteSelectedIndexer": "حذف المفهرس",
"DeleteSelectedIndexers": "حذف المفهرس",
"DownloadClientCategory": "حذف Download Client",
"IndexerInfo": "مفهرس",
"IndexerProxies": "أولوية المفهرس",
"MovieSearchTypes": "البحث الشامل عن الأفلام",
"SyncProfile": "تحرير ملف تعريف التأخير",
"SearchIndexers": "حذف المفهرس",
"AddIndexerProxy": "أولوية المفهرس",
"EditSelectedIndexers": "حذف المفهرس",
"Notifications": "شهادة",
"DeleteSelectedApplications": "حذف ملفات الأفلام المحددة",
"DeleteSelectedDownloadClientsMessageText": "هل أنت متأكد أنك تريد حذف ملفات الأفلام المحددة؟",
"AddSyncProfile": "تحرير ملف تعريف التأخير",
"SyncProfiles": "تحرير ملف تعريف التأخير",
"FilterPlaceHolder": "حذف المفهرس"
}

View File

@@ -417,5 +417,59 @@
"AddCustomFilter": "Добави персонализиран филтър",
"AuthenticationMethod": "Метод за удостоверяване",
"AuthenticationMethodHelpTextWarning": "Моля, изберете валиден метод за удостоверяване",
"BlackholeFolderHelpText": "Папка, в която {appName} ще съхранява файла {extension}"
"BlackholeFolderHelpText": "Папка, в която {appName} ще съхранява файла {extension}",
"Author": "Авто",
"AddApplicationImplementation": "Добави условие - {implementationName}",
"AddCategory": "Категория",
"AddIndexerProxyImplementation": "Добави индексатор - {implementationName}",
"Notification": "Сертифициране",
"DeleteClientCategory": "Изтриване на клиент за изтегляне",
"DeleteIndexerProxy": "Изтрийте Indexer",
"DeleteSelectedIndexersMessageText": "Наистина ли искате да изтриете избраните филмови файлове?",
"DownloadClientRTorrentSettingsDirectoryHelpText": "Незадължително локация за изтеглянията, оставете празно, за да използвате локацията по подразбиране на Aria2",
"DownloadClientTransmissionSettingsDirectoryHelpText": "Незадължително локация за изтеглянията, оставете празно, за да използвате локацията по подразбиране на Aria2",
"EditSyncProfile": "Редактиране на профил за забавяне",
"ManageDownloadClients": "Изтеглете клиенти",
"UnableToLoadDevelopmentSettings": "Не може да се заредят общи настройки",
"EditConnectionImplementation": "Добави връзка - {implementationName}",
"EditDownloadClientImplementation": "Добави клиент за изтегляне - {implementationName}",
"EditIndexerImplementation": "Добави индексатор - {implementationName}",
"EditIndexerProxyImplementation": "Добави индексатор - {implementationName}",
"IndexerHDBitsSettingsCodecs": "Кодек",
"IndexerHDBitsSettingsOrigins": "Оригинал",
"IndexerId": "Индексатор",
"MovieSearch": "Масово търсене на филми",
"SelectIndexers": "Изтрийте Indexer",
"UnableToLoadIndexerProxies": "Индексаторите не могат да се заредят",
"EditSelectedDownloadClients": "Изтриване на клиент за изтегляне",
"Application": "Приложения",
"AddNewIndexer": "Добавете Indexer",
"TvSearch": "Търсене",
"Proxies": "Профили",
"IndexerProxy": "Индексатор Приоритет",
"Stats": "Статус",
"UnableToLoadAppProfiles": "Профилите за забавяне не могат да се заредят",
"EditApplicationImplementation": "Добави условие - {implementationName}",
"Mixed": "Фиксирана",
"IndexerStatus": "Настройки на индексатора",
"DeleteSelectedApplicationsMessageText": "Наистина ли искате да изтриете избраните филмови файлове?",
"DeleteSelectedApplications": "Изтриване на избрани филмови файлове",
"DeleteSelectedIndexers": "Изтрийте Indexer",
"DownloadClientCategory": "Изтриване на клиент за изтегляне",
"EditCategory": "Категория",
"Notifications": "Сертифициране",
"SearchIndexers": "Изтрийте Indexer",
"SyncProfile": "Редактиране на профил за забавяне",
"MovieSearchTypes": "Масово търсене на филми",
"DeleteSelectedDownloadClientsMessageText": "Наистина ли искате да изтриете избраните филмови файлове?",
"DeleteSelectedIndexer": "Изтрийте Indexer",
"EditSelectedIndexers": "Изтрийте Indexer",
"Connect": "Сертифициране",
"AddIndexerProxy": "Индексатор Приоритет",
"IndexerProxies": "Индексатор Приоритет",
"IndexerInfo": "Индексатор",
"SyncProfiles": "Редактиране на профил за забавяне",
"AddSyncProfile": "Редактиране на профил за забавяне",
"Auth": "Авто",
"FilterPlaceHolder": "Изтрийте Indexer"
}

View File

@@ -487,7 +487,7 @@
"AllSearchResultsHiddenByFilter": "Tots els resultats estan ocults pel filtre aplicat.",
"HealthMessagesInfoBox": "Podeu trobar més informació sobre la causa d'aquests missatges de comprovació de salut fent clic a l'enllaç wiki (icona del llibre) al final de la fila o consultant els vostres [registres]({link}). Si teniu problemes per a interpretar aquests missatges, podeu posar-vos en contacte amb el nostre suport als enllaços següents.",
"AptUpdater": "Utilitzeu apt per a instal·lar l'actualització",
"DockerUpdater": "actualitzeu el contenidor Docker per a rebre l'actualització",
"DockerUpdater": "Actualitzeu el contenidor Docker per actualitzar",
"Download": "Baixa",
"ErrorRestoringBackup": "S'ha produït un error en restaurar la còpia de seguretat",
"ExternalUpdater": "{appName} està configurat per a utilitzar un mecanisme d'actualització extern",
@@ -804,7 +804,7 @@
"DownloadClientRTorrentSettingsAddStopped": "Afegeix aturat",
"DownloadClientRTorrentSettingsAddStoppedHelpText": "En activar s'afegiran torrents i imants a rTorrent en un estat aturat. Això pot trencar els fitxers magnet.",
"DownloadClientFreeboxSettingsAppTokenHelpText": "S'ha recuperat el testimoni de l'aplicació en crear l'accés a l'API de Freebox (ex: 'app_token')",
"DownloadClientUTorrentProviderMessage": "uTorrent té un historial d'inclusió de criptominers, programari maliciós i anuncis, us animem a triar un client diferent.",
"DownloadClientUTorrentProviderMessage": "uTorrent té historial d'incloure criptominers, malware i anuncis, suggerim fortament que escolleixis un client diferent.",
"DownloadClientQbittorrentSettingsInitialStateHelpText": "Estat inicial dels torrents afegits a qBittorrent. Tingueu en compte que els torrents forçats no compleixen amb les restriccions de llavors",
"LogSizeLimit": "Límit de la mida del registre",
"SelectDownloadClientModalTitle": "{modalTitle} - Seleccioneu el client de baixada"

View File

@@ -491,7 +491,7 @@
"EnableRssHelpText": "Povolit kanál RSS pro indexer",
"DeleteApplication": "Odstranit aplikaci",
"DeleteSelectedApplications": "Odstranit vybrané aplikace",
"DeleteSelectedIndexers": "Odstranit vybrané indexery",
"DeleteSelectedIndexers": "Smazat vybrané indexery",
"DevelopmentSettings": "Nastavení pro vývoj",
"DisabledUntil": "Zakázáno do",
"DownloadClientCategory": "Kategorie klienta pro stahování",
@@ -639,5 +639,30 @@
"DownloadClientUTorrentProviderMessage": "uTorrent má historii zahrnování kryptoměnových těžařů, malwaru a reklam, důrazně vám doporučujeme zvolit jiného klienta.",
"IndexerSettingsBaseUrlHelpText": "Vyberte, jakou základní URL bude {appName} používat pro požadavky na web",
"IndexerSettingsPackSeedTimeIndexerHelpText": "Doba, po kterou by měl být balíček (sezóna nebo diskografie) torrentu seedován před zastavením, prázdné pole znamená výchozí nastavení aplikace",
"PackSeedTimeHelpText": "Doba, po kterou by měl být balíček (sezóna nebo diskografie) torrentu seedován před zastavením, prázdné pole znamená výchozí nastavení aplikace"
"PackSeedTimeHelpText": "Doba, po kterou by měl být balíček (sezóna nebo diskografie) torrentu seedován před zastavením, prázdné pole znamená výchozí nastavení aplikace",
"OnApplicationUpdateHelpText": "Při aktualizaci aplikace",
"SeedTime": "Doba sdílení",
"OnHealthRestoredHelpText": "Při obnovení zdraví",
"SeedRatio": "Poměr sdílení",
"ThemeHelpText": "Změnit motiv UI, možnost „Auto“ kopíruje nastavení OS pro výběr tmavého nebo světlého režimu. Inspirováno {inspiredBy}.",
"SearchType": "Hledat typy",
"UnableToLoadDevelopmentSettings": "Nelze načíst obecná nastavení",
"SeedTimeHelpText": "Doba, po kterou bude torrent sdílen před zastavením, prázdná hodnota použije výchozí hodnotu klienta stahování",
"IndexerHDBitsSettingsOrigins": "Originál",
"SelectIndexers": "Vybrat příznaky indexeru",
"IndexerTagsHelpTextWarning": "Štítky je potřeba používat opatrně, mohou mít nechtěné účinky. Aplikace se štítkem se bude synchronizovat pouze s indexery se stejným štítkem.",
"MinimumSeeders": "Minimální počet seederů aplikací",
"SearchAllIndexers": "Hledat indexery",
"SyncProfile": "Přidat synchronizační profil",
"TvSearch": "Vyhledávání",
"UnableToLoadAppProfiles": "Nelze načíst profily zpoždění",
"UnableToLoadIndexerProxies": "Nelze načíst indexery",
"SyncProfiles": "Přidat synchronizační profil",
"TVSearchTypes": "Hledat typy",
"Proxies": "Profily",
"MovieSearchTypes": "Hledat typy",
"MusicSearchTypes": "Hledat typy",
"IndexerStatus": "Nastavení indexeru",
"MovieSearch": "Hromadné vyhledávání filmů",
"SeedRatioHelpText": "Doba, po kterou bude torrent sdílen před zastavením, prázdná hodnota použije výchozí hodnotu klienta stahování"
}

View File

@@ -428,5 +428,39 @@
"Episode": "afsnit",
"Artist": "kunstner",
"Id": "ID",
"Encoding": "Indkodning"
"Encoding": "Indkodning",
"Destination": "Destinationssti",
"IndexerId": "Indekser",
"MovieSearch": "Massefilmsøgning",
"CountIndexersSelected": "{count} film er valgt",
"EditCategory": "Tilføj Kategori",
"EditSelectedDownloadClients": "Slet Download Client",
"ManageDownloadClients": "Download Klienter",
"SyncProfile": "Tilføj synkroniseringsprofil",
"SyncProfiles": "Tilføj synkroniseringsprofil",
"UnableToLoadAppProfiles": "Kunne ikke indlæse forsinkelsesprofiler",
"ApplicationURL": "Applikationer",
"IndexerProxy": "Tilføj en indeksørproxy",
"Proxies": "Profiler",
"DeleteClientCategory": "Slet Download Client",
"IndexerStatus": "Indekseringsindstillinger",
"TvSearch": "Søg",
"UnableToLoadIndexerProxies": "Kan ikke indlæse indeksørerne",
"DeleteIndexerProxy": "Slet Indexer",
"UnableToLoadDevelopmentSettings": "Kan ikke indlæse generelle indstillinger",
"Donate": "Dato",
"IndexerHDBitsSettingsOrigins": "Original",
"SelectIndexers": "Slet Indexer",
"AuthenticationMethod": "Godkendelse",
"Category": "Tilføj Kategori",
"SearchIndexers": "Slet Indexer",
"IndexerProxies": "Tilføj en indeksørproxy",
"IndexerInfo": "Indekser",
"MovieSearchTypes": "Massefilmsøgning",
"DownloadClientCategory": "Slet Download Client",
"DeleteSelectedApplications": "Slet valgte filmfiler",
"DeleteSelectedIndexer": "Slet Indexer",
"DeleteSelectedIndexers": "Slet Indexer",
"EditSelectedIndexers": "Slet Indexer",
"FilterPlaceHolder": "Slet Indexer"
}

View File

@@ -137,7 +137,7 @@
"Exception": "Ausnahme",
"ExistingTag": "Vorhandener Tag",
"Failed": "Fehlgeschlagen",
"FeatureRequests": "Feature Anfragen",
"FeatureRequests": "Funktion anfragen",
"Filename": "Dateiname",
"Files": "Dateien",
"Filter": "Filter",

View File

@@ -540,5 +540,28 @@
"AptUpdater": "Χρησιμοποιήστε το apt για να εγκαταστήσετε την ενημέρωση",
"InstallLatest": "Εγκατάσταση πιο πρόσφατου",
"CurrentlyInstalled": "Εγκατεστημένο αυτήν τη στιγμή",
"Mixed": "Σταθερός"
"Mixed": "Σταθερός",
"Destination": "Διαδρομή προορισμού",
"AddCategory": "Κατηγορία",
"AddDownloadClientImplementation": "Προσθήκη - {implementationName}",
"LogSizeLimit": "Όριο μεγέθους",
"IndexerStatus": "Ρυθμίσεις ευρετηρίου",
"IndexerId": "Ευρετήριο",
"EditSelectedIndexers": "Αναζήτηση ευρετηρίων",
"AppsMinimumSeeders": "Ελάχιστοι σπαρτήρες",
"AuthenticationMethod": "Αυθεντικοποίηση",
"EditDownloadClientImplementation": "Προσθήκη",
"EditSelectedDownloadClients": "Διαγραφή προγράμματος-πελάτη λήψης",
"SearchAllIndexers": "Αναζήτηση ευρετηριαστών",
"ManageDownloadClients": "Προγράμματα Λήψης",
"DeleteSelectedApplications": "Διαγραφή επιλεγμένου καλλιτέχνη",
"Donate": "Ημερομηνία",
"IndexerDownloadClientHelpText": "Καθορίστε ποιο πρόγραμμα-πελάτη λήψης χρησιμοποιείται για αρπαγές από αυτό το ευρετήριο",
"IndexerHDBitsSettingsOrigins": "Πρωτότυπο",
"AddCustomFilter": "Custom Φιλτρα",
"AddApplication": "Εφαρμογή",
"IndexerSettingsAppsMinimumSeeders": "Ελάχιστοι σπαρτήρες",
"DeleteSelectedIndexer": "Αναζήτηση ευρετηρίων",
"DeleteSelectedIndexers": "Αναζήτηση ευρετηρίων",
"EditCategory": "Κατηγορία"
}

View File

@@ -9,5 +9,23 @@
"AddConnectionImplementation": "افزودن پیوند - {implementationName}",
"AddDownloadClientImplementation": "افزودن کلاینت دانلود - {implementationName}",
"Torrents": "تورنت ها",
"Usenet": "Usenet"
"Usenet": "Usenet",
"AddIndexerImplementation": "افزودن شرط - {implementationName}",
"UnableToAddANewNotificationPleaseTryAgain": "افزودن شرط جدید ناموفق بود، لطفا مجددا تلاش کنید.",
"EditApplicationImplementation": "افزودن شرط - {implementationName}",
"EditDownloadClientImplementation": "افزودن کلاینت دانلود - {implementationName}",
"UnableToAddANewApplicationPleaseTryAgain": "افزودن شرط جدید ناموفق بود، لطفا مجددا تلاش کنید.",
"UnableToAddANewDownloadClientPleaseTryAgain": "افزودن شرط جدید ناموفق بود، لطفا مجددا تلاش کنید.",
"UnableToAddANewIndexerProxyPleaseTryAgain": "افزودن نمایه تاخیر جدید ناموفق بود، لطفا مجددا تلاش کنید.",
"Connections": "افزودن پیوند",
"EditConnectionImplementation": "افزودن پیوند - {implementationName}",
"AddApplicationImplementation": "افزودن شرط - {implementationName}",
"UnableToAddANewIndexerPleaseTryAgain": "افزودن شرط جدید ناموفق بود، لطفا مجددا تلاش کنید.",
"Torrent": "تورنت ها",
"UnableToAddANewAppProfilePleaseTryAgain": "افزودن نمایه تاخیر جدید ناموفق بود، لطفا مجددا تلاش کنید.",
"ConnectionLost": "افزودن پیوند",
"EditSyncProfile": "افزودن نمایه تاخیر",
"AddIndexerProxyImplementation": "افزودن شرط - {implementationName}",
"EditIndexerImplementation": "افزودن شرط - {implementationName}",
"EditIndexerProxyImplementation": "افزودن شرط - {implementationName}"
}

View File

@@ -285,7 +285,7 @@
"NoLogFiles": "Lokitiedostoja ei ole",
"SSLCertPasswordHelpText": "PFX-tiedoston salasana",
"SSLCertPath": "SSL-varmenteen sijainti",
"SSLCertPathHelpText": "PFX-tiedoston sijainti",
"SSLCertPathHelpText": "Pfx- tai pem-tiedoston sijainti.",
"Status": "Tila",
"NotificationTriggers": "Ilmoituksen laukaisijat",
"NoUpdatesAreAvailable": "Päivityksiä ei ole saatavilla",
@@ -622,7 +622,7 @@
"IndexerBeyondHDSettingsSearchTypes": "Etsittävät tyypit",
"IndexerSettingsSeedRatio": "Jakosuhde",
"IndexerSettingsSeedTime": "Jakoaika",
"IndexerSettingsSeedTimeHelpText": "Aika, joka torrentia tulee jakaa ennen sen pysäytystä. Käytä latauspalvelun oletusta jättämällä tyhjäksi.",
"IndexerSettingsSeedTimeHelpText": "Aika, joka torrentia tulee jakaa ennen kuin se pysäytetään. Käytä latauspalvelun oletusta jättämällä tyhjäksi.",
"IndexerSettingsVipExpiration": "VIP-erääntyy",
"Destination": "Kohde",
"Directory": "Kansio",
@@ -647,7 +647,7 @@
"IndexerSettingsCookie": "Eväste",
"IndexerSettingsPackSeedTime": "Paketin jakoaika",
"IndexerSettingsPackSeedTimeIndexerHelpText": "Aika, joka koostepaketin (kuten sarjan tuotantokauden tai esittäjän diskografian) sisältävää torrentia tulee jakaa. Käytä sovelluksen oletusta jättämällä tyhjäksi.",
"IndexerSettingsSeedRatioHelpText": "Suhde, joka torrentin tulee saavuttaa ennen sen pysäytystä. Käytä latauspalvelun oletusta jättämällä tyhjäksi. Suhteen tulisi olla ainakin 1.0 ja noudattaa hakupalvelun sääntöjä.",
"IndexerSettingsSeedRatioHelpText": "Jakosuhde, joka torrentin tulee saavuttaa ennen kuin se pysäytetään. Käytä latauspalvelun oletusta jättämällä tyhjäksi. Suhteen tulisi olla vähintään 1.0 ja noudattaa hakupalvelun sääntöjä.",
"SecretToken": "Salainen tunniste",
"TorrentBlackholeSaveMagnetFiles": "Tallenna magnet-tiedostot",
"UseSsl": "Käytä SSL-salausta",
@@ -661,14 +661,14 @@
"XmlRpcPath": "XML RPC -sijainti",
"DownloadClientSettingsUrlBaseHelpText": "Lisää lataustuökalun {clientName} URL-osoitteeseen etuliitteen, esim. \"{url}\".",
"DownloadClientFloodSettingsUrlBaseHelpText": "Lisää Flood-rajapintaan etuliitteen, esim. \"{url}\".",
"DownloadClientDownloadStationSettingsDirectoryHelpText": "Vaihtoehtoinen jaettu kansio latauksille. Käytä Download Stationin oletussijaintia jättämällä tyhjäksi.",
"DownloadClientDownloadStationSettingsDirectoryHelpText": "Vaihtoehtoinen jaettu kansio latauksille. Käytä Download Stationin oletusta jättämällä tyhjäksi.",
"DownloadClientFreeboxSettingsApiUrlHelpText": "Määritä Freebox-rajapinnan perus-URL rajapinnan versiolla, esim. \"{url}\". Oletus on \"{defaultApiUrl}\".",
"DownloadClientQbittorrentSettingsFirstAndLastFirst": "Ensimmäinen ja viimeinen ensin",
"DownloadClientFreeboxSettingsAppId": "Sovelluksen ID",
"DownloadClientFreeboxSettingsPortHelpText": "Freebox-liittymän portti. Oletus on {port}.",
"DownloadClientPneumaticSettingsNzbFolder": "NZB-kansio",
"DownloadClientQbittorrentSettingsSequentialOrder": "Peräkkäinen järjestys",
"CustomFilter": "Oma suodatin",
"CustomFilter": "Mukautettu suodatin",
"DownloadClientFreeboxSettingsAppIdHelpText": "Freebox-rajapinnan käyttöoikeutta määritettäessä käytettävä App ID -sovellustunniste.",
"DownloadClientFreeboxSettingsAppToken": "Sovellustietue",
"DownloadClientNzbgetSettingsAddPausedHelpText": "Tämä vaatii vähintään NzbGetin version 16.0.",

View File

@@ -3,7 +3,7 @@
"Indexers": "Indexeurs",
"Host": "Hôte",
"History": "Historique",
"HideAdvanced": "Masquer les Options Avancées",
"HideAdvanced": "Masquer les options avancées",
"Health": "Santé",
"General": "Général",
"Folder": "Dossier",
@@ -12,7 +12,7 @@
"Events": "Événements",
"Edit": "Modifier",
"DownloadClientStatusAllClientHealthCheckMessage": "Aucun client de téléchargement n'est disponible en raison d'échecs",
"DownloadClients": "Clients de télécharg.",
"DownloadClients": "Téléchargement",
"Dates": "Dates",
"Date": "Date",
"Delete": "Supprimer",
@@ -22,20 +22,20 @@
"Clear": "Effacer",
"BackupNow": "Sauvegarder maintenant",
"Backup": "Sauvegarde",
"AppDataLocationHealthCheckMessage": "La mise à jour ne sera pas possible afin empêcher la suppression de AppData lors de la mise à jour",
"AppDataLocationHealthCheckMessage": "La mise à jour ne sera pas possible afin d'éviter la suppression des données d'application (AppData)",
"Analytics": "Statistiques",
"All": "Tout",
"About": "À propos",
"IndexerStatusUnavailableHealthCheckMessage": "Indexeurs indisponibles en raison d'échecs : {indexerNames}",
"DownloadClientStatusSingleClientHealthCheckMessage": "Clients de Téléchargement indisponibles en raison d'échecs: {downloadClientNames}",
"SetTags": "Définir des étiquettes",
"SetTags": "Définir les étiquettes",
"ReleaseStatus": "Statut de la version",
"UpdateUiNotWritableHealthCheckMessage": "Impossible d'installer la mise à jour car le dossier d'interface utilisateur '{uiFolder}' n'est pas accessible en écriture par l'utilisateur '{userName}'.",
"UpdateStartupTranslocationHealthCheckMessage": "Impossible d'installer la mise à jour car le dossier de démarrage '{startupFolder}' se trouve dans un dossier App Translocation.",
"UpdateStartupNotWritableHealthCheckMessage": "Impossible d'installer la mise à jour car le dossier de démarrage '{startupFolder}' n'est pas accessible en écriture par l'utilisateur '{userName}'.",
"UnselectAll": "Tout désélectionner",
"UISettingsSummary": "Date, langue, et perceptions des couleurs",
"TagsSettingsSummary": "Voir toutes les étiquettes et comment elles sont utilisées. Les étiquettes inutilisées peuvent être supprimées",
"TagsSettingsSummary": "Voir toutes les étiquettes et leur utilisation. Les étiquettes inutilisées peuvent être supprimées",
"Style": "Style",
"Status": "État",
"Sort": "Trier",
@@ -60,7 +60,7 @@
"NoChanges": "Aucun changement",
"NoChange": "Pas de changement",
"MoreInfo": "Plus d'informations",
"Grabbed": "Saisie",
"Grabbed": "Récupération",
"DownloadClientsSettingsSummary": "Configuration des clients de téléchargement pour intégration dans la recherche de l'interface utilisateur de {appName}",
"DownloadClient": "Client de téléchargement",
"Logging": "Enregistrement",
@@ -69,7 +69,7 @@
"Updates": "Mises à jour",
"UI": "UI",
"Tasks": "Tâches",
"Tags": "Tags",
"Tags": "Étiquettes",
"System": "Système",
"LastWriteTime": "Heure de la dernière écriture",
"Language": "Langue",
@@ -106,7 +106,7 @@
"Restart": "Redémarrer",
"Reload": "Recharger",
"Peers": "Peers",
"PageSize": "Pagination",
"PageSize": "Taille de la page",
"Ok": "OK",
"OAuthPopupMessage": "Les pop-ups sont bloquées par votre navigateur",
"Name": "Nom",
@@ -128,7 +128,7 @@
"PendingChangesStayReview": "Rester et vérifier les modifications",
"PendingChangesMessage": "Vous avez des modifications non sauvegardées, voulez-vous vraiment quitter cette page ?",
"PendingChangesDiscardChanges": "Abandonner les modifications et quitter",
"CloneProfile": "Dupliqué le profil",
"CloneProfile": "Dupliquer le profil",
"ClientPriority": "Priorité du client",
"ChangeHasNotBeenSavedYet": "Les changements n'ont pas encore été sauvegardés",
"CertificateValidationHelpText": "Change la rigueur de la vérification du certificat HTTPS",
@@ -221,8 +221,8 @@
"TagIsNotUsedAndCanBeDeleted": "L'étiquette n'est pas utilisée et peut être supprimée",
"TagsHelpText": "S'applique aux indexeurs avec au moins une étiquette correspondante",
"StartTypingOrSelectAPathBelow": "Commencer à écrire ou sélectionner un chemin ci-dessous",
"NoTagsHaveBeenAddedYet": "Aucune identification n'a été ajoutée pour l'instant",
"IndexerFlags": "Drapeaux de l'indexeur",
"NoTagsHaveBeenAddedYet": "Aucune étiquette n'a encore été ajoutée",
"IndexerFlags": "Indicateurs de l'indexeur",
"DeleteTagMessageText": "Voulez-vous vraiment supprimer l'étiquette '{label}' ?",
"UISettings": "Paramètres UI",
"UILanguageHelpTextWarning": "Rechargement du navigateur requis",
@@ -250,8 +250,8 @@
"RestartNow": "Redémarrer maintenant",
"ResetAPIKey": "Réinitialiser la clé API",
"Reset": "Réinitialiser",
"RemovingTag": "Supprimer la balise",
"ExistingTag": "Balise existante",
"RemovingTag": "Suppression de l'étiquette",
"ExistingTag": "Étiquette existante",
"RemoveFilter": "Supprimer le filtre",
"RemovedFromTaskQueue": "Supprimé de la file d'attente des tâches",
"RefreshMovie": "Actualiser le film",
@@ -259,8 +259,8 @@
"ProwlarrSupportsAnyIndexer": "{appName} prend en charge de nombreux indexeurs en plus de tout indexeur qui utilise la norme Newznab/Torznab en utilisant « Generic Newznab » (pour usenet) ou « Generic Torznab » (pour les torrents). Recherchez et sélectionnez votre indexeur ci-dessous.",
"ProwlarrSupportsAnyDownloadClient": "{appName} prend en charge tout client de téléchargement qui utilise le standard Newznab, ainsi que d'autres clients de téléchargement répertoriés ci-dessous.",
"ProxyUsernameHelpText": "Il vous suffit de saisir un nom d'utilisateur et un mot de passe si nécessaire. Sinon, laissez-les vides.",
"ProxyType": "Type de mandataire",
"ProxyPasswordHelpText": "Il vous suffit de saisir un nom d'utilisateur et un mot de passe si nécessaire. Sinon, laissez-les vides.",
"ProxyType": "Type de proxy",
"ProxyPasswordHelpText": "Saisissez un nom d'utilisateur et un mot de passe uniquement s'ils sont requis. Sinon, laissez ces champs vides.",
"Priority": "Priorité",
"PortNumber": "Numéro de port",
"Port": "Port",
@@ -274,11 +274,11 @@
"NoLeaveIt": "Non, laisse tomber",
"NoBackupsAreAvailable": "Aucune sauvegarde n'est disponible",
"New": "Nouveau",
"NetCore": ".NET Core",
"NetCore": ".NET",
"MovieIndexScrollTop": "Index des films : faire défiler vers le haut",
"MovieIndexScrollBottom": "Index des films : faire défiler vers le bas",
"MIA": "MIA",
"LaunchBrowserHelpText": " Ouvrer un navigateur Web et accéder à la page d'accueil de {appName} au démarrage de l'application.",
"MIA": "Indisponible",
"LaunchBrowserHelpText": " Ouvrir un navigateur Web et accéder à la page d'accueil de {appName} au démarrage de l'application.",
"CloseCurrentModal": "Fermer cette fenêtre modale",
"AddingTag": "Ajout d'une étiquette",
"OnHealthIssueHelpText": "Sur un problème de santé",
@@ -318,8 +318,8 @@
"ApplicationStatusCheckSingleClientMessage": "Applications indisponibles en raison de dysfonctionnements : {0}",
"ApplicationStatusCheckAllClientMessage": "Toutes les applications sont indisponibles en raison de dysfonctionnements",
"AllIndexersHiddenDueToFilter": "Tous les indexeurs sont cachés en raison du filtre appliqué.",
"AddToDownloadClient": "Ajouter un release au client",
"AddedToDownloadClient": "Release ajoutée au client",
"AddToDownloadClient": "Ajouter une version au client",
"AddedToDownloadClient": "Version ajoutée au client",
"AddNewIndexer": "Ajouter un nouvel indexeur",
"Wiki": "Wiki",
"Rss": "RSS",
@@ -344,7 +344,7 @@
"Description": "Description",
"Donations": "Dons",
"Enabled": "Activé",
"Grabs": "Complétés",
"Grabs": "Récupérations",
"Id": "ID",
"Presets": "Préconfigurations",
"Privacy": "Visibilité",
@@ -360,7 +360,7 @@
"SyncLevel": "Niveau de synchronisation",
"FullSync": "Synchronisation complète",
"AddRemoveOnly": "Ajouter et supprimer uniquement",
"AddDownloadClientToProwlarr": "L'ajout d'un client de téléchargement permet à {appName} d'envoyer des fichers directement depuis l'interface utilisateur tout en effectuant une recherche manuelle.",
"AddDownloadClientToProwlarr": "L'ajout d'un client de téléchargement permet à {appName} d'envoyer des fichiers directement depuis l'interface utilisateur tout en effectuant une recherche manuelle.",
"NoSearchResultsFound": "Aucun résultat de recherche trouvé, essayez d'effectuer une nouvelle recherche ci-dessous.",
"DeleteIndexerProxy": "Supprimer le proxy indexeur",
"DeleteIndexerProxyMessageText": "Voulez-vous supprimer le proxy d'indexeur « {name} » ?",
@@ -382,7 +382,7 @@
"Filters": "Filtres",
"HistoryCleanupDaysHelpText": "Définir sur 0 pour désactiver le nettoyage automatique",
"HistoryCleanupDaysHelpTextWarning": "Les fichiers dans la corbeille plus anciens que le nombre de jours sélectionné seront nettoyés automatiquement",
"OnGrab": "Récupéré à la sortie",
"OnGrab": "Lors de la récupération",
"OnHealthIssue": "Lors de problème de santé",
"TestAllIndexers": "Tester tous les indexeurs",
"UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent fourni par l'application qui a appelé l'API",
@@ -410,7 +410,7 @@
"MovieSearch": "Recherche de films",
"TvSearch": "Recherche de séries TV",
"Application": "Applications",
"GrabReleases": "Télécharger la/les version(s)",
"GrabReleases": "Récupérer la/les version(s)",
"Link": "Lien",
"No": "Non",
"SearchTypes": "Types de recherche",
@@ -444,7 +444,7 @@
"SyncProfile": "Profil de synchronisation",
"SyncProfiles": "Profils de synchronisation",
"MinimumSeeders": "Nombre minimum de seeders",
"MinimumSeedersHelpText": "Nombre minimum de seeders requis par l'application pour que lindexer puisse saisir",
"MinimumSeedersHelpText": "Nombre minimum de seeders requis par l'application pour que l'indexeur effectue une récupération",
"AreYouSureYouWantToDeleteCategory": "Êtes-vous sûr de vouloir supprimer la catégorie mappée ?",
"ElapsedTime": "Temps écoulé",
"Parameters": "Paramètres",
@@ -461,8 +461,8 @@
"OnLatestVersion": "La dernière version de {appName} est déjà installée",
"AddCustomFilter": "Ajouter filtre personnalisé",
"AddApplication": "Ajouter une application",
"IncludeManualGrabsHelpText": "Inclure les saisies manuelles effectuées dans {appName}",
"OnGrabHelpText": "Récupéré à la sortie",
"IncludeManualGrabsHelpText": "Inclure les récupérations manuelles effectuées dans {appName}",
"OnGrabHelpText": "Lors de la récupération",
"RssFeed": "Flux RSS",
"VipExpiration": "Expiration VIP",
"DisabledUntil": "Désactivé jusqu'à",
@@ -475,8 +475,8 @@
"HistoryDetails": "Détails de l'historique",
"RepeatSearch": "Répéter la recherche",
"Theme": "Thème",
"TotalHostGrabs": "Total des captures d'hôte",
"TotalUserAgentGrabs": "Total des captures d'agent utilisateur",
"TotalHostGrabs": "Total des récupérations d'hôte",
"TotalUserAgentGrabs": "Total des récupérations d'agent utilisateur",
"Book": "Livre",
"Artist": "Artiste",
"Author": "Auteur",
@@ -488,7 +488,7 @@
"Season": "Saison",
"TotalHostQueries": "Nombre total de requêtes d'hôte",
"TotalIndexerQueries": "Requêtes totales d'indexeur",
"TotalIndexerSuccessfulGrabs": "Total des saisies réussies de l'indexeur",
"TotalIndexerSuccessfulGrabs": "Total des récupérations réussies de l'indexeur",
"TotalUserAgentQueries": "Nombre total de requêtes d'agent utilisateur",
"Track": "Piste",
"Year": "Année",
@@ -504,8 +504,8 @@
"DownloadClientPriorityHelpText": "Donnez la priorité à plusieurs clients de téléchargement. Le Round-Robin est utilisé pour les clients ayant la même priorité.",
"SelectIndexers": "Sélectionner les indexeurs",
"ApplyTagsHelpTextHowToApplyIndexers": "Comment appliquer des étiquettes aux indexeurs sélectionnés",
"ApplyTagsHelpTextRemove": "Supprimer : supprime les étiquettes renseignées",
"ApplyTagsHelpTextReplace": "Remplacer : remplace les étiquettes par les étiquettes renseignées (ne pas renseigner d'étiquette pour toutes les effacer)",
"ApplyTagsHelpTextRemove": "Supprimer : Supprimer les étiquettes saisies",
"ApplyTagsHelpTextReplace": "Remplacer : Remplacer les étiquettes par celles saisies (ne saisissez aucune étiquette pour tout effacer)",
"DeleteSelectedDownloadClients": "Supprimer le(s) client(s) de téléchargement",
"DeleteSelectedDownloadClientsMessageText": "Voulez-vous vraiment supprimer {count} client(s) de téléchargement sélectionné(s) ?",
"StopSelecting": "Effacer la sélection",
@@ -513,7 +513,7 @@
"AdvancedSettingsHiddenClickToShow": "Paramètres avancés masqués, cliquez pour afficher",
"AdvancedSettingsShownClickToHide": "Paramètres avancés affichés, cliquez pour masquer",
"AppsMinimumSeeders": "Apps avec le nombre minimum de seeders disponibles",
"AppsMinimumSeedersHelpText": "Minimum de seeders requis par les applications pour que lindexeur les récupère, laisser vide utilise la valeur par défaut du profil Sync",
"AppsMinimumSeedersHelpText": "Nombre minimum de seeders requis par l'application pour que l'indexeur effectue une récupération. Si vide, la valeur par défaut du profil de synchronisation est utilisée",
"BasicSearch": "Recherche de base",
"CountIndexersAvailable": "{count} indexeur(s) disponible(s)",
"DeleteSelectedApplications": "Supprimer les applications sélectionnées",
@@ -558,7 +558,7 @@
"NoDownloadClientsFound": "Aucun client de téléchargement n'a été trouvé",
"AppUpdated": "{appName} mis à jour",
"AppUpdatedVersion": "{appName} a été mis à jour vers la version `{version}`, pour profiter des derniers changements, vous devrez relancer {appName}",
"IndexerDownloadClientHelpText": "Préciser quel client de téléchargement est utilisé pour les saisies créées au sein de {appName} provenant de cet indexeur",
"IndexerDownloadClientHelpText": "Spécifiez quel client de téléchargement utiliser pour les récupérations effectuées dans {appName} depuis cet indexeur",
"Implementation": "Mise en œuvre",
"SearchCountIndexers": "Rechercher {count} indexeur(s)",
"SearchAllIndexers": "Rechercher tous les indexeurs",
@@ -572,17 +572,17 @@
"EditCategory": "Modifier la catégorie",
"EditDownloadClientImplementation": "Modifier le client de téléchargement - {implementationName}",
"External": "Externe",
"FoundCountReleases": "{itemCount} release(s) trouvée(s)",
"FoundCountReleases": "{itemCount} version(s) trouvée(s)",
"IndexerHistoryLoadError": "Erreur lors du chargement de l'historique de l'indexeur",
"IndexerTagsHelpTextWarning": "Les étiquettes doivent être utilisées avec prudence, elles peuvent avoir des effets indésirables. Un indexeur avec une étiquette va uniquement synchroniser les applications ayant la même étiquette.",
"NoIndexerHistory": "Aucun historique n'a été trouvé pour cet indexeur",
"PackSeedTimeHelpText": "Le temps qu'un pack (saison ou discographie) doit être seedé avant de s'arrêter, la valeur vide est la valeur par défaut de l'application",
"SeedRatioHelpText": "Le ratio qu'un torrent doit atteindre avant de s'arrêter, une valeur vide est la valeur par défaut de l'application",
"TorznabUrl": "URL Torznab",
"TotalGrabs": "Récupéré au total",
"TotalGrabs": "Total des récupérations",
"TotalQueries": "Requêtes totales",
"SeedRatio": "Ratio de seed",
"SelectedCountOfCountReleases": "{selectedCount} sur {itemCount} releases sélectionnées",
"SelectedCountOfCountReleases": "{selectedCount} sur {itemCount} versions sélectionnées",
"AddCategory": "Ajouter une catégorie",
"AddDownloadClientImplementation": "Ajouter un client de téléchargement - {implementationName}",
"ManageDownloadClients": "Gérer les clients de téléchargement",
@@ -596,7 +596,7 @@
"Clone": "Dupliquer",
"PackSeedTime": "Temps de Seed",
"ApplicationTagsHelpText": "Synchroniser les indexeurs avec cette application qui n'ont aucune étiquette ou qui ont une ou plusieurs étiquettes correspondantes. Si aucune étiquette n'est listée ici, aucun indexeur ne sera empêché de se synchroniser en raison de ses étiquettes.",
"OnHealthRestored": "Sur la santé restaurée",
"OnHealthRestored": "Quand le système redevient opérationnel",
"OnHealthRestoredHelpText": "Sur la santé restaurée",
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirmer le nouveau mot de passe",
"PasswordConfirmation": "Confirmation du mot de passe",
@@ -639,7 +639,7 @@
"IndexerSettingsApiUser": "Utilisateur de l'API",
"IndexerSettingsAppsMinimumSeeders": "Apps avec le nombre minimum de seeders disponibles",
"IndexerSettingsFreeleechOnly": "Freeleech seulement",
"IndexerSettingsGrabLimit": "Limite de saisie",
"IndexerSettingsGrabLimit": "Limite de récupération",
"IndexerSettingsQueryLimit": "Limite de requête",
"IndexerSettingsQueryLimitHelpText": "Le nombre de requêtes maximales tel que spécifié par l'unité respective que {appName} autorisera au site",
"IndexerSettingsRssKey": "Clé RSS",
@@ -649,10 +649,10 @@
"BlackholeFolderHelpText": "Dossier dans lequel {appName} stockera le fichier {extension}",
"DefaultCategory": "Catégorie par défaut",
"DownloadClientFloodSettingsAdditionalTags": "Étiquette supplémentaire",
"DownloadClientFloodSettingsAdditionalTagsHelpText": "Ajoute les propriétés des médias sous forme d'étiquette. Les conseils sont des exemples.",
"DownloadClientFloodSettingsAdditionalTagsHelpText": "Ajoute les propriétés du média sous forme d'étiquettes. Les indices sont donnés à titre d'exemple.",
"DownloadClientFreeboxSettingsApiUrl": "URL DE L'API",
"DownloadClientFreeboxSettingsApiUrlHelpText": "Définir l'URL de base de l'API Freebox avec la version de l'API, par exemple '{url}', par défaut '{defaultApiUrl}'",
"DownloadClientFloodSettingsTagsHelpText": "Étiquettes initiales d'un téléchargement. Pour être reconnu, un téléchargement doit avoir toutes les étiquettes initiales. Cela permet d'éviter les conflits avec des téléchargements non apparentés.",
"DownloadClientFloodSettingsTagsHelpText": "Étiquettes initiales d'un téléchargement. Pour être reconnu, un téléchargement doit posséder toutes les étiquettes initiales. Cela évite les conflits avec des téléchargements non liés.",
"DownloadClientFloodSettingsUrlBaseHelpText": "Ajoute d'un préfixe à l'API Flood, tel que {url}",
"DownloadClientFreeboxSettingsPortHelpText": "Port utilisé pour accéder à l'interface de la Freebox, la valeur par défaut est '{port}'",
"DownloadClientNzbgetSettingsAddPausedHelpText": "Cette option nécessite au moins la version 16.0 de NzbGet",
@@ -660,7 +660,7 @@
"DownloadClientFreeboxSettingsAppTokenHelpText": "Le jeton de l'application récupéré lors de la création de l'accès à l'API Freebox (c'est-à-dire 'app_token')",
"DownloadClientFreeboxSettingsHostHelpText": "Nom d'hôte ou adresse IP de la Freebox, par défaut '{url}' (ne fonctionnera que si elle est sur le même réseau)",
"DownloadClientSettingsInitialState": "État initial",
"DownloadClientSettingsPriorityItemHelpText": "Priorité à utiliser lors de la saisie des articles",
"DownloadClientSettingsPriorityItemHelpText": "Priorité à utiliser lors de la récupération des éléments",
"DownloadClientSettingsUrlBaseHelpText": "Ajoute un préfixe à l'url {clientName}, tel que {url}",
"DownloadClientSettingsUseSslHelpText": "Utiliser une connexion sécurisée lors de la connexion à {clientName}",
"DownloadClientSettingsInitialStateHelpText": "État initial pour les torrents ajoutés à {clientName}",
@@ -687,7 +687,7 @@
"IndexerOrpheusSettingsApiKeyHelpText": "Clé API du site (dans Paramètres => Paramètres d'accès)",
"IndexerPassThePopcornSettingsApiKeyHelpText": "Clé API du site",
"IndexerPassThePopcornSettingsApiUserHelpText": "Ces paramètres se trouvent dans les paramètres de sécurité de PassThePopcorn (Modifier le profil > Sécurité).",
"IndexerSettingsGrabLimitHelpText": "Le nombre de prises maximales tel que spécifié par l'unité respective que {appName} autorisera sur le site",
"IndexerSettingsGrabLimitHelpText": "Le nombre maximum de récupérations autorisé par {appName} pour ce site, selon l'unité spécifiée",
"IndexerSettingsLimitsUnit": "Limites d'unité",
"IndexerSettingsCookie": "Cookie",
"IndexerSettingsCookieHelpText": "Cookie du site",
@@ -723,7 +723,7 @@
"IndexerHDBitsSettingsUseFilenames": "Utiliser les noms de fichiers",
"IndexerIPTorrentsSettingsFreeleechOnlyHelpText": "Rechercher les publications freeleech uniquement",
"IndexerSettingsApiPath": "Chemin d'accès à l'API",
"IndexerSettingsAppsMinimumSeedersHelpText": "Nombre minimum de seeders requis par les applications pour que l'indexeur s'en saisisse, vide est la valeur par défaut du profil Sync",
"IndexerSettingsAppsMinimumSeedersHelpText": "Nombre minimum de seeders requis par l'application pour que l'indexeur effectue une récupération. Si vide, la valeur par défaut du profil de synchronisation sera utilisée",
"IndexerSettingsBaseUrl": "Url de base",
"IndexerSettingsBaseUrlHelpText": "Sélectionnez l'url de base que {appName} utilisera pour les requêtes vers le site",
"IndexerSettingsLimitsUnitHelpText": "L'unité de temps pour le comptage des limites par indexeur",
@@ -742,7 +742,7 @@
"Donate": "Donation",
"Menu": "Menu",
"Mixed": "Mixte",
"ApplicationSettingsSyncRejectBlocklistedTorrentHashes": "Synchroniser le rejet des hachages torrent sur liste bloquée lors de la saisie",
"ApplicationSettingsSyncRejectBlocklistedTorrentHashes": "Synchroniser le rejet des hashs de torrents en liste de blocage lors de la récupération",
"ClickToChangeQueryOptions": "Cliquez pour modifier les options de la requête",
"ApplicationSettingsSyncRejectBlocklistedTorrentHashesHelpText": "Si un torrent est bloqué par le hachage, il peut ne pas être correctement rejeté pendant le RSS/recherche pour certains indexeurs. L'activation de cette fonction permet de le rejeter après que le torrent a été saisi, mais avant qu'il ne soit envoyé au client.",
"ProwlarrDownloadClientsAlert": "Si vous avez l'intention d'effectuer des recherches directement dans {appName}, vous devez ajouter les clients de téléchargement. Sinon, vous n'avez pas besoin de les ajouter ici. Pour les recherches à partir de vos applications, les clients de téléchargement qui y sont configurés sont utilisés à la place.",
@@ -758,8 +758,8 @@
"ProxyValidationBadRequest": "Échec du test du proxy. Code d'état : {statusCode}",
"ProxyValidationUnableToConnect": "Impossible de se connecter à l'indexeur : {exceptionMessage}. Vérifiez le journal pour plus de détails sur cette erreur",
"Default": "Par défaut",
"GrabRelease": "Saisir Release",
"ManualGrab": "Saisie manuelle",
"GrabRelease": "Récupérer la version",
"ManualGrab": "Récupération manuelle",
"Open": "Ouvrir",
"Any": "Tous",
"BuiltIn": "Intégré",
@@ -768,7 +768,7 @@
"Redirected": "Rediriger",
"PublishedDate": "Date de publication",
"AllSearchResultsHiddenByFilter": "Tous les résultats sont masqués par le filtre appliqué.",
"AverageGrabs": "Prises moyennes",
"AverageGrabs": "Récupérations moyennes",
"AverageQueries": "Requêtes moyennes",
"PackageVersionInfo": "{packageVersion} par {packageAuthor}",
"HealthMessagesInfoBox": "Vous pouvez trouver plus d'informations sur la cause de ces messages de contrôle de santé en cliquant sur le lien wiki (icône de livre) à la fin de la ligne, ou en vérifiant vos [journaux]({link}). Si vous rencontrez des difficultés pour interpréter ces messages, vous pouvez contacter notre support, via les liens ci-dessous.",
@@ -785,7 +785,7 @@
"Logout": "Se déconnecter",
"NoEventsFound": "Aucun événement trouvé",
"RestartReloadNote": "Remarque : {appName} redémarrera et rechargera automatiquement l'interface utilisateur pendant le processus de restauration.",
"TheLogLevelDefault": "Le niveau de journalisation est par défaut à « Information » et peut être modifié dans les [paramètres généraux](/settings/general)",
"TheLogLevelDefault": "Le niveau de journalisation est par défaut à «Debug» et peut être modifié dans les [paramètres généraux](/settings/general)",
"UpdateAppDirectlyLoadError": "Impossible de mettre à jour directement {appName},",
"UpdaterLogFiles": "Journaux du programme de mise à jour",
"WouldYouLikeToRestoreBackup": "Souhaitez-vous restaurer la sauvegarde « {name} » ?",

View File

@@ -432,5 +432,43 @@
"CurrentlyInstalled": "מותקן כעת",
"Stats": "סטָטוּס",
"Season": "סיבה",
"Mixed": "תוקן"
"Mixed": "תוקן",
"SearchTypes": "סוגי חיפוש ספר",
"IndexerId": "אינדקסר",
"SyncProfile": "הוספת פרופיל סינכרון",
"TVSearchTypes": "סוגי חיפוש ספר",
"UnableToLoadAppProfiles": "לא ניתן לטעון פרופילי עיכוב",
"IndexerHDBitsSettingsOrigins": "מְקוֹרִי",
"SelectIndexers": "מחק את אינדקס",
"ApplicationURL": "אפליקציה",
"IndexerProxy": "הוספת פרוקסי לאינדקסר",
"Proxies": "פרופילים",
"SyncProfiles": "הוספת פרופיל סינכרון",
"ManageDownloadClients": "הורד לקוחות",
"UnableToLoadDevelopmentSettings": "לא ניתן לטעון את ההגדרות הכלליות",
"UnableToLoadIndexerProxies": "לא ניתן לטעון אינדקסים",
"TvSearch": "לחפש",
"AuthenticationMethod": "אימות",
"EditSelectedDownloadClients": "מחק את לקוח ההורדות",
"Donate": "תַאֲרִיך",
"MovieSearch": "חיפוש סרטים המוני",
"MovieSearchTypes": "סוגי חיפוש ספר",
"Destination": "נתיב יעד",
"IndexerBeyondHDSettingsSearchTypes": "סוגי חיפוש ספר",
"IndexerDownloadClientHelpText": "ציין איזה קליינט הורדה משתמש באינדקסר הזה להורדה",
"IndexerStatus": "הגדרות אינדקס",
"Author": "אוטו'",
"AddConnection": "הוסף חיבור",
"EditCategory": "הוסף קטגוריה",
"SearchIndexers": "מחק את אינדקס",
"IndexerProxies": "הוספת פרוקסי לאינדקסר",
"SearchType": "סוגי חיפוש ספר",
"IndexerInfo": "אינדקסר",
"MusicSearchTypes": "סוגי חיפוש ספר",
"DeleteSelectedApplications": "מחק קבצי סרטים שנבחרו",
"DeleteSelectedIndexer": "מחק את אינדקס",
"DeleteSelectedIndexers": "מחק את אינדקס",
"EditSelectedIndexers": "מחק את אינדקס",
"FilterPlaceHolder": "מחק את אינדקס",
"AddConnectionImplementation": "הוסף חיבור - {implementationName}"
}

View File

@@ -373,5 +373,47 @@
"CurrentlyInstalled": "वर्तमान में स्थापित है",
"Mixed": "फिक्स्ड",
"Season": "कारण",
"Stats": "स्थिति"
"Stats": "स्थिति",
"AuthenticationMethod": "प्रमाणीकरण",
"UnableToLoadIndexerProxies": "अनुक्रमणिका लोड करने में असमर्थ",
"IndexerHDBitsSettingsOrigins": "मूल",
"IndexerId": "इंडेक्सर",
"DeleteClientCategory": "डाउनलोड क्लाइंट हटाएं",
"Destination": "गंतव्य पथ",
"Donate": "दिनांक",
"ManageDownloadClients": "ग्राहक डाउनलोड करें",
"IndexerProxy": "सूचकांक प्राथमिकता",
"DeleteIndexerProxy": "अनुक्रमणिका हटाएं",
"EditSyncProfile": "देरी प्रोफ़ाइल संपादित करें",
"EditSelectedDownloadClients": "डाउनलोड क्लाइंट हटाएं",
"IndexerStatus": "अनुक्रमणिका सेटिंग्स",
"SelectIndexers": "अनुक्रमणिका हटाएं",
"TvSearch": "खोज",
"AddCustomFilter": "कस्टम फ़िल्टर",
"AddNewIndexer": "सूचकांक जोड़ें",
"MovieSearch": "मास मूवी सर्च",
"DeleteSelectedIndexersMessageText": "क्या आप वाकई चयनित मूवी फ़ाइलों को हटाना चाहते हैं?",
"Proxies": "प्रोफाइल",
"UnableToLoadAppProfiles": "विलंब प्रोफाइल लोड करने में असमर्थ",
"Notification": "प्रमाणीकरण",
"UnableToLoadDevelopmentSettings": "सामान्य सेटिंग्स लोड करने में असमर्थ",
"AddConnection": "संबंध",
"SyncProfiles": "देरी प्रोफ़ाइल संपादित करें",
"DeleteSelectedApplications": "चयनित मूवी फ़ाइलें हटाएं",
"DeleteSelectedIndexers": "अनुक्रमणिका हटाएं",
"DownloadClientCategory": "डाउनलोड क्लाइंट हटाएं",
"SearchIndexers": "अनुक्रमणिका हटाएं",
"SyncProfile": "देरी प्रोफ़ाइल संपादित करें",
"EditSelectedIndexers": "अनुक्रमणिका हटाएं",
"IndexerProxies": "सूचकांक प्राथमिकता",
"AddIndexerProxy": "सूचकांक प्राथमिकता",
"Notifications": "प्रमाणीकरण",
"IndexerInfo": "इंडेक्सर",
"DeleteSelectedDownloadClientsMessageText": "क्या आप वाकई चयनित मूवी फ़ाइलों को हटाना चाहते हैं?",
"DeleteSelectedApplicationsMessageText": "क्या आप वाकई चयनित मूवी फ़ाइलों को हटाना चाहते हैं?",
"AddSyncProfile": "देरी प्रोफ़ाइल संपादित करें",
"MovieSearchTypes": "मास मूवी सर्च",
"DeleteSelectedIndexer": "अनुक्रमणिका हटाएं",
"Connect": "प्रमाणीकरण",
"FilterPlaceHolder": "अनुक्रमणिका हटाएं"
}

View File

@@ -212,5 +212,35 @@
"EditApplicationImplementation": "Dodaj Vezu - {implementationName}",
"AptUpdater": "Koristi apt kako bi instalirao ažuriranje",
"EditIndexerProxyImplementation": "Dodaj Indexer - {implementationName}",
"Clone": "Zatvori"
"Clone": "Zatvori",
"GrabRelease": "verzija",
"ManageDownloadClients": "Klijent za preuzimanje",
"TvSearch": "Traži",
"IndexerId": "Indekser",
"CustomFilter": "Dodaj proizvoljan filter",
"CustomFilters": "Dodaj proizvoljan filter",
"DeleteDownloadClient": "Klijent za preuzimanje",
"UISettings": "Postavke",
"AddApplication": "Aplikacije",
"AddNewIndexer": "Dodaj Indexer",
"EnableAutomaticSearch": "Automatska Pretraga",
"EditSyncProfile": "Dodaj Profil Odgode",
"Tags": "Oznaka",
"UILanguage": "jezik",
"NoChange": "Promijeni",
"ConnectionLost": "Veze",
"DownloadClientSettings": "Klijent za preuzimanje",
"UnsavedChanges": "Spremi izmjene",
"Author": "Automatski",
"AddSyncProfile": "Dodaj Profil Odgode",
"Auth": "Automatski",
"DeleteClientCategory": "Klijent za preuzimanje",
"GrabReleases": "verzija",
"IndexerInfo": "Indekser",
"NoChanges": "Promijeni",
"SyncProfile": "Dodaj Profil Odgode",
"SyncProfiles": "Dodaj Profil Odgode",
"DeleteSelectedDownloadClients": "Klijent za preuzimanje",
"EditSelectedDownloadClients": "Klijent za preuzimanje",
"Download": "Ponovno preuzimanje neuspješno"
}

View File

@@ -6,23 +6,23 @@
"Error": "Hiba",
"DeleteTag": "Címke törlése",
"EnableAutomaticSearchHelpText": "Akkor lesz használatos, ha automatikus keresést hajt végre a felhasználói felületen vagy a(z) {appName} alkalmazáson keresztül",
"EnableAutomaticSearch": "Engedélyezd az Automatikus Keresést",
"EnableAutomaticSearch": "Automatikus keresés engedélyezése",
"Enable": "Aktiválás",
"EditIndexer": "Indexer Szerkesztése",
"Edit": "Szerkeszt",
"DownloadClientStatusSingleClientHealthCheckMessage": "Letöltőkliens hiba miatt nem elérhető: {downloadClientNames}",
"EditIndexer": "Indexe Szerkesztése",
"Edit": "Szerkesztés",
"DownloadClientStatusSingleClientHealthCheckMessage": "Letöltő kliensek elérhetetlenek meghibásodások miatt: {downloadClientNames}",
"DownloadClientStatusAllClientHealthCheckMessage": "Az összes letöltőkliens elérhetetlen, hiba miatt",
"DownloadClientsSettingsSummary": "Letöltőkliens konfigurációja a {appName} felhasználói felület keresésbe történő integráláshoz",
"DownloadClientSettings": "Letöltőkliens Beállítások",
"DownloadClientSettings": "Letöltőkliens beállítások",
"DownloadClients": "Letöltő kliensek",
"DownloadClient": "Letöltési kliens",
"DownloadClient": "Letöltő kliens",
"Docker": "Docker",
"Disabled": "Tiltva",
"Details": "részletek",
"Details": "Részletek",
"DeleteTagMessageText": "Biztosan törli a „{label}” címkét?",
"DeleteNotificationMessageText": "Biztosan törli a(z) „{name}” értesítést?",
"DeleteNotification": "Értesítés törlése",
"DeleteDownloadClientMessageText": "Biztosan törli a(z) \"{name}\" letöltési klienst?",
"DeleteDownloadClientMessageText": "Biztosan törli a(z) \"{name}\" letöltő klienst?",
"DeleteDownloadClient": "Letöltőkliens törlése",
"DeleteBackupMessageText": "Biztosan törli a '{name}' biztonsági mentést?",
"DeleteBackup": "Biztonsági Mentés törlése",
@@ -32,7 +32,7 @@
"Date": "Dátum",
"CustomFilters": "Egyedi Szűrők",
"ConnectSettingsSummary": "Értesítések és egyéni szkriptek",
"ConnectSettings": "Csatlakozási beállítások",
"ConnectSettings": "Kapcsolati beállítások",
"Connections": "Kapcsolatok",
"ConnectionLost": "A kapcsolat megszakadt",
"Connect": "Értesítések",
@@ -49,35 +49,35 @@
"CancelPendingTask": "Biztosan törölni szeretné ezt a függőben lévő feladatot?",
"Cancel": "Mégse",
"BypassProxyForLocalAddresses": "Proxy megkerülése a helyi hálózatos címekhez",
"BranchUpdateMechanism": "Külső frissítési mechanizmus által használt ág",
"BranchUpdate": "A(z) {appName} frissítéséhez használt fiók",
"Branch": "Ágazat",
"BranchUpdateMechanism": "Külső frissítési mechanizmus által használt kiadási csatorna (ág)",
"BranchUpdate": "A {appName} frissítéséhez használt kiadási csatorna (ág)",
"Branch": "Kiadási csatorna",
"BindAddressHelpText": "Érvényes IP-cím, localhost vagy '*' minden interfészhez",
"BindAddress": "Kötési cím",
"BeforeUpdate": "Frissítés előtt",
"Backups": "Biztonsági mentések",
"BackupRetentionHelpText": "A megőrzési időszaknál régebbi automatikus biztonsági másolatok automatikusan törlődnek",
"BackupNow": "Biztonsági Mentés",
"BackupNow": "Mentés most",
"BackupIntervalHelpText": "Az automatikus biztonsági mentések közötti időköz",
"BackupFolderHelpText": "A relatív elérési utak a(z) {appName} AppData könyvtárában találhatók",
"BackupFolderHelpText": "A relatív elérési utak a {appName} AppData könyvtárában találhatók",
"Backup": "Biztonsági mentés",
"AutomaticSearch": "Automatikus keresés",
"Automatic": "Automatikus",
"AnalyticsEnabledHelpText": "Névtelen használati és hibainformáció küldése {appName} szervereinek. Ez magában foglalja a böngészővel kapcsolatos információkat, a használt {appName} WebUI oldalakat, a hibajelentéseket, valamint az operációs rendszert és a futásidejű verziót. Ezeket az információkat a funkciók és a hibajavítások fontossági sorrendjének meghatározására fogjuk használni.",
"AuthenticationMethodHelpText": "Felhasználónév és jelszó szükséges a(z) {appName} eléréséhez",
"AuthenticationMethodHelpText": "Felhasználónév és jelszó szükséges a {appName} eléréséhez",
"Authentication": "Hitelesítés",
"ApplyTags": "Címkék alkalmazása",
"Age": "Kor",
"ApiKey": "API Kulcs",
"All": "Összes",
"AcceptConfirmationModal": "Változás Megerősítése",
"Apply": "Alkamaz",
"AppDataLocationHealthCheckMessage": "A frissítés nem lehetséges az alkalmazás adatok törlése nélkül",
"AppDataDirectory": "AppData Könyvtár",
"Apply": "Alkalmaz",
"AppDataLocationHealthCheckMessage": "A frissítés nem hajtható végre, hogy elkerüljük az alkalmazás adatainak törlését",
"AppDataDirectory": "AppData könyvtár",
"Added": "Hozzáadva",
"Actions": "Teendők",
"History": "Előzmény",
"HideAdvanced": "Haladó Elrejtése",
"HideAdvanced": "Haladó beállítások elrejtése",
"NoIssuesWithYourConfiguration": "Nincs hiba a konfigurációval",
"Health": "Egészség",
"GeneralSettingsSummary": "Port, SSL, felhasználónév / jelszó, proxy, elemzések, és frissítések",
@@ -85,10 +85,10 @@
"Folder": "Mappa",
"FocusSearchBox": "Fókusz Keresőmező",
"Fixed": "Rögzített",
"FilterPlaceHolder": "Filmek Keresése",
"FilterPlaceHolder": "Indexelők keresése",
"Filter": "Szűrő",
"Files": "Fájlok",
"Filename": "Fájl név",
"Filename": "Fájlnév",
"Failed": "Nem sikerült",
"ExistingTag": "Létező címke",
"Exception": "Kivétel",
@@ -113,9 +113,9 @@
"Source": "Forrás",
"Sort": "Fajta",
"Size": "Méret",
"Shutdown": "Leállitás",
"Shutdown": "Leállítás",
"ShowSearchHelpText": "Keresés gomb megjelenítése az egérrel",
"ShowAdvanced": "Haladó nézet",
"ShowAdvanced": "Haladó beállítások megjelenítése",
"SettingsTimeFormat": "Időformátum",
"SettingsShowRelativeDatesHelpText": "Relatív (Ma / Tegnap / stb.) vagy valós dátumok megjelenítése",
"SettingsShowRelativeDates": "Relatív dátumok megjelenítése",
@@ -129,13 +129,13 @@
"Seeders": "Seederek",
"Security": "Biztonság",
"Search": "Keresés",
"ScriptPath": "Script útvonal",
"ScriptPath": "Szkriptútvonal",
"Scheduled": "Ütemezve",
"SaveSettings": "Beállítások mentése",
"SaveChanges": "Változtatások mentése",
"Save": "Mentés",
"RssIsNotSupportedWithThisIndexer": "Ez az indexelő nem támogatja az RSS-t",
"Retention": "Visszatartás",
"Retention": "Megőrzési idő",
"Result": "Eredmény",
"RestoreBackup": "Biztonsági mentés visszaállítása",
"Restore": "Visszaállít",
@@ -146,11 +146,11 @@
"ResetAPIKey": "API Kulcs Visszaállítása",
"Reset": "Visszaállítás",
"RemovingTag": "Címke eltávolítása",
"RemoveFilter": "Szűrő Eltávolítás",
"RemoveFilter": "Szűrő eltávolítása",
"RemovedFromTaskQueue": "Eltávolítva a feladatsorból",
"Reload": "Újratölt",
"ReleaseStatus": "Kiadás státusza",
"ReleaseBranchCheckOfficialBranchMessage": "A(z) {0} nem érvényes {appName} frissítési ágazat, ezért nem kap frissítéseket",
"ReleaseBranchCheckOfficialBranchMessage": "A(z) {0} nem érvényes {appName} kiadási csatorna (ág), ezért nem kap további frissítéseket",
"RefreshMovie": "Film frissítése",
"Refresh": "Frissítés",
"ReadTheWikiForMoreInformation": "További információkért olvassa el a Wikit",
@@ -162,7 +162,7 @@
"ProxyPasswordHelpText": "Csak akkor kell megadnia egy felhasználónevet és jelszót, ha szükséges. Ellenkező esetben hagyja üresen.",
"ProxyResolveIpHealthCheckMessage": "Nem sikerült megoldani a konfigurált proxykiszolgáló IP-címét {proxyHostName}",
"ProxyFailedToTestHealthCheckMessage": "Proxy tesztelése sikertelen: {url}",
"ProxyBadRequestHealthCheckMessage": "Proxy tesztelése sikertelen. Állapotkód: {statusCode}",
"ProxyBadRequestHealthCheckMessage": "Sikertelen proxy teszt. Állapotkód: {statusCode}",
"ProxyBypassFilterHelpText": "Használja a ',' jelet elválasztóként és a '*' jelet. helyettesítő karakterként az aldomainekhez",
"Proxy": "Proxy",
"Protocol": "Protokoll",
@@ -170,7 +170,7 @@
"PortNumber": "Port száma",
"Port": "Port",
"PendingChangesStayReview": "Maradjon és tekintse át a változtatásokat",
"PendingChangesMessage": "Vannak nem mentett módosításai. Biztosan elhagyja ezt az oldalt?",
"PendingChangesMessage": "Nem mentett módosításai vannak. Biztosan elhagyja ezt az oldalt?",
"PendingChangesDiscardChanges": "Vesse el a változtatásokat, és lépjen ki",
"Peers": "Peerek",
"Password": "Jelszó",
@@ -184,7 +184,7 @@
"Ok": "Ok",
"OAuthPopupMessage": "A böngésződ blokkolja az előugró ablakokat",
"NoUpdatesAreAvailable": "Nem érhetők el frissítések",
"NoTagsHaveBeenAddedYet": "Még nem adtak hozzá címkéket",
"NoTagsHaveBeenAddedYet": "Még nincsenek címkék hozzáadva",
"NoLogFiles": "Nincsenek naplófájlok",
"NoLeaveIt": "Nem, Hagyd",
"NoChanges": "Nincs változás",
@@ -199,13 +199,13 @@
"Mode": "Mód",
"MIA": "MIA",
"Message": "Üzenet",
"Mechanism": "Gépezet",
"Mechanism": "Működési mód",
"Manual": "Kézi",
"MaintenanceRelease": "Karbantartási kiadás: hibajavítások és egyéb fejlesztések. További részletekért lásd: Github Commit History",
"Logs": "Naplók",
"LogLevelTraceHelpTextWarning": "A nyomkövetési naplózást csak ideiglenesen szabad engedélyezni",
"LogLevel": "Napló szint",
"Logging": "Loggolás",
"Logging": "Naplózás",
"LogFiles": "Naplófájlok",
"Level": "Szint",
"LaunchBrowserHelpText": " Nyisson meg egy böngészőt, és az alkalmazás indításakor lépjen a {appName} kezdőlapjára.",
@@ -218,7 +218,7 @@
"IndexerStatusUnavailableHealthCheckMessage": "Indexerek elérhetetlenek a következő hiba miatt: {indexerNames}",
"Hostname": "Hosztnév",
"Host": "Hoszt",
"Grabbed": "Megragadta",
"Grabbed": "Megragadva",
"GeneralSettings": "Általános Beállítások",
"General": "Általános",
"UnableToLoadHistory": "Nem sikerült betölteni az előzményeket",
@@ -232,8 +232,8 @@
"UISettings": "A felhasználói felület beállításai",
"UILanguageHelpTextWarning": "Böngésző újratöltése szükséges",
"UILanguageHelpText": "A {appName} által a felhasználói felülethez használt nyelv",
"UILanguage": "Felület nyelve",
"UI": "Felület",
"UILanguage": "Felhasználói felület nyelve",
"UI": "Felhasználói felület",
"Type": "Típus",
"Torrents": "Torrentek",
"Title": "Cím",
@@ -249,11 +249,11 @@
"TagCannotBeDeletedWhileInUse": "Használat közben nem törölhető",
"TableOptionsColumnsMessage": "Válasszd ki, mely oszlopok legyenek láthatóak, és milyen sorrendben jelenjenek meg",
"SystemTimeHealthCheckMessage": "A rendszeridő több mint 1 napja nem frissült. Előfordulhat, hogy az ütemezett feladatok az idő kijavításáig nem futnak megfelelően",
"IndexerStatusAllUnavailableHealthCheckMessage": "Az összes indexer elérhetetlen hiba miatt",
"Indexers": "Indexerek",
"IndexerStatusAllUnavailableHealthCheckMessage": "Az összes indexe elérhetetlen hiba miatt",
"Indexers": "Indexek",
"IndexerPriorityHelpText": "Indexelő prioritás 1-től (legmagasabb) 50-ig (legalacsonyabb). Alapértelmezés: 25.",
"IndexerPriority": "Indexer Prioritása",
"IndexerFlags": "Indexer Zászló",
"IndexerPriority": "Indexelő prioritása",
"IndexerFlags": "Indexelő jelzők",
"Indexer": "Indexelő",
"IncludeHealthWarningsHelpText": "Tartalmazza a Állapot Figyelmeztetéseket",
"IllRestartLater": "Később Újraindítom",
@@ -266,9 +266,9 @@
"UseProxy": "Proxy használata",
"Usenet": "Usenet",
"UrlBaseHelpText": "Fordított proxy támogatás esetén az alapértelmezett érték üres",
"URLBase": "URL Bázis",
"URLBase": "Alap URL",
"Uptime": "Üzemidő",
"UpdateScriptPathHelpText": "Keresse meg az egyéni parancsfájl elérési útját, amely kibontott frissítési csomagot vesz fel, és kezeli a frissítési folyamat fennmaradó részét",
"UpdateScriptPathHelpText": "Egy szkript elérési útja, amely átveszi a kicsomagolt frissítési csomagot, és elvégzi a frissítési folyamat hátralévő részét",
"Updates": "Frissítések",
"UpdateMechanismHelpText": "Használja a {appName} beépített frissítőjét vagy szkriptjét",
"UpdateUiNotWritableHealthCheckMessage": "Nem lehet telepíteni a frissítést, mert a(z) „{uiFolder}” felhasználói felület mappát nem írhatja a „{userName}” felhasználó.",
@@ -281,13 +281,13 @@
"UnableToLoadTags": "Nem sikerült betölteni a címkéket",
"UnableToLoadNotifications": "Nem sikerült betölteni az Értesítéseket",
"TableOptions": "Táblázat Beállítások",
"ShowSearch": "Keresés mutatása",
"ShowSearch": "Keresés megjelenítése",
"SetTags": "Címkék beállítása",
"NotificationTriggers": "Értesítési triggerek",
"IndexerLongTermStatusUnavailableHealthCheckMessage": "Az összes indexer elérhetetlen több mint 6 órája, meghibásodás miatt: {indexerNames}",
"IndexerLongTermStatusAllUnavailableHealthCheckMessage": "Az összes indexer elérhetetlen több mint 6 órája, meghibásodás miatt",
"IndexerLongTermStatusAllUnavailableHealthCheckMessage": "Az összes indexe elérhetetlen több mint 6 órája, meghibásodás miatt",
"SettingsLogSql": "SQL naplózás",
"IndexerRss": "Indexer Rss",
"IndexerRss": "Indexelő RSS",
"IndexerAuth": "Indexelő auth",
"Yesterday": "Tegnap",
"UnableToLoadDevelopmentSettings": "Nem sikerült betölteni a fejlesztési beállításokat",
@@ -309,18 +309,18 @@
"EnableIndexer": "Indexelő engedélyezése",
"IndexerObsoleteCheckMessage": "Az indexelők elavultak vagy frissültek: {0}. Kérjük, távolítsa el és (vagy) add újra a hozzá a {appName}-ba",
"DevelopmentSettings": "Fejlesztési beállítások",
"DeleteApplicationMessageText": "Biztosan törli a(z) „{0}” alkalmazást?",
"DeleteApplicationMessageText": "Biztosan törli a(z) „{name}” alkalmazást?",
"DeleteApplication": "Alkalmazás törlése",
"ClearHistoryMessageText": "Biztosan törlöd a {appName} összes előzményét?",
"ClearHistory": "Előzmények törlése",
"ApplicationStatusCheckSingleClientMessage": "Az alkalmazás nem áll rendelkezésre az alábbi hibák miatt: {0}",
"ApplicationStatusCheckAllClientMessage": "Összes alkalmazás elérhetetlen hiba miatt",
"AllIndexersHiddenDueToFilter": "Az összes indexelő rejtve van az alkalmazott szűrő miatt.",
"AddToDownloadClient": "Kiadás hozzáadása a kliens letöltéséhez",
"AddToDownloadClient": "Kiadás hozzáadása a letöltőklienshez",
"AddNewIndexer": "Új indexelő hozzáadása",
"AddedToDownloadClient": "Kiadás hozzáadva a klienshez",
"EnableRssHelpText": "RSS Engedélyezése az Indexerekhez",
"EnableRss": "RSS Aktiválás",
"EnableRssHelpText": "RSS engedélyezése indexekhöz",
"EnableRss": "RSS engedélyezése",
"Wiki": "Wiki",
"Rss": "RSS",
"RedirectHelpText": "Átirányítja a bejövő letöltési kérelmet az indexelő számára, és közvetlenül adja át a fájlt ahelyett, hogy a kérést a {appName}-en keresztül proxyba tenné",
@@ -332,7 +332,7 @@
"AppProfileSelectHelpText": "Az alkalmazásprofilok az RSS vezérlésére szolgálnak, Automatikus keresés és Interaktív keresés beállításai az alkalmazás szinkronizálásakor",
"UnableToAddANewApplicationPleaseTryAgain": "Nem lehet új alkalmazást hozzáadni, próbálkozzon újra.",
"UnableToAddANewAppProfilePleaseTryAgain": "Nem lehet új alkalmazásprofilt hozzáadni, próbálkozzon újra.",
"AddDownloadClient": "Letöltési kliens hozzáadása",
"AddDownloadClient": "Letöltőkliens hozzáadása",
"Applications": "Alkalmazások",
"AppProfileInUse": "Használatban lévő alkalmazásprofil",
"Apps": "Appok",
@@ -349,7 +349,7 @@
"Id": "Azonosító",
"NotificationTriggersHelpText": "Válassza ki, hogy mely események váltsák ki ezt az értesítést",
"Presets": "Előbeállítások",
"Privacy": "Titkosítás",
"Privacy": "Adatvédelem",
"Query": "Lekérdezés",
"Stats": "Statisztikák",
"Torrent": "Torrent",
@@ -364,13 +364,13 @@
"NoSearchResultsFound": "Nincs találat. Próbálkozzon új kereséssel.",
"AppSettingsSummary": "Alkalmazások és beállítások a {appName} interakciójának beállításához a PVR programjaiddal",
"DeleteIndexerProxy": "Indexer Proxy törlése",
"DeleteIndexerProxyMessageText": "Biztosan törlöd a(z) „{0}” proxyt?",
"DeleteIndexerProxyMessageText": "Biztosan törli a(z) „{name}” indexelő proxyt?",
"IndexerProxies": "Indexer Proxy(k)",
"IndexerProxyStatusAllUnavailableHealthCheckMessage": "Az összes Proxy elérhetetlen, hiba miatt",
"IndexerProxyStatusAllUnavailableHealthCheckMessage": "Az összes indexelő-proxy elérhetetlen, hiba miatt",
"IndexerProxyStatusUnavailableHealthCheckMessage": "Proxyk elérhetetlenek az alábbi hibák miatt: {indexerProxyNames}",
"IndexerTagsHelpText": "Címkék segítségével megadhatod az indexer proxykat amelyekkel az indexer szinkronizálva van, vagy egyszerűen az indexelők rendszerezéséhez.",
"IndexerTagsHelpText": "Címkékkel adhatja meg, mely indexe proxykat használja az indexelő, illetve mely alkalmazásokkal legyen szinkronizálva.",
"UnableToLoadIndexerProxies": "Nem lehet betölteni az Indexer Proxyt",
"AddIndexerProxy": "Indexer Proxy hozzáadása",
"AddIndexerProxy": "Indexelő-proxy hozzáadása",
"IndexerSettingsSummary": "Konfigurálja a különböző globális indexer beállításokat, beleértve a proxykat is.",
"Notifications": "Értesítések",
"UnableToAddANewIndexerProxyPleaseTryAgain": "Nem lehet új Indexer Proxyt hozzáadni, próbálja újra.",
@@ -393,18 +393,18 @@
"HistoryCleanupDaysHelpTextWarning": "A kiválasztott napszámnál régebbi előzmények automatikusan törlődnek",
"IndexerAlreadySetup": "Az indexelő legalább egy példánya már be van állítva",
"IndexerInfo": "Indexer információ",
"IndexerNoDefinitionCheckHealthCheckMessage": "Az indexereknek nincs definíciójuk, és nem működnek: {indexerNames}. Kérjük, távolítsa el és (vagy) adja hozzá újra a {appName}hoz",
"IndexerNoDefinitionCheckHealthCheckMessage": "Az indexeknek nincs definíciójuk, és nem működnek: {indexerNames}. Kérjük, távolítsa el és (vagy) adja hozzá újra a {appName}-hoz.",
"MassEditor": "Tömeges szerkesztő",
"OnApplicationUpdate": "Alkalmazásfrissítésről",
"OnApplicationUpdate": "Alkalmazásfrissítéskor",
"OnApplicationUpdateHelpText": "Alkalmazásfrissítésről",
"OnGrab": "Kiválasztás alatt",
"OnHealthIssue": "Állapotprobléma",
"OnGrab": "A kiadás megragadásakor",
"OnHealthIssue": "Állapotproblémakor",
"Private": "Privát",
"Proxies": "Proxyk",
"Public": "Publikus",
"QueryResults": "Lekérdezési eredmények",
"SemiPrivate": "Fél-Privát",
"TestAllIndexers": "Tesztelje az összes indexelőt",
"SemiPrivate": "Félig privát",
"TestAllIndexers": "Minden indexelő tesztelése",
"ApplicationsLoadError": "Nem sikerült betölteni az alkalmazáslistát",
"Url": "URL",
"UserAgentProvidedByTheAppThatCalledTheAPI": "Az API-t hívó alkalmazás biztosítja a User-Agent szolgáltatást",
@@ -433,13 +433,13 @@
"AddSyncProfile": "Szinkronizálási profil hozzáadása",
"EditSyncProfile": "Szinkronizálási profil szerkesztése",
"MinimumSeedersHelpText": "Az alkalmazás által megkövetelt minimális Seeder az indexer számára",
"InstanceName": "Példány Neve",
"InstanceNameHelpText": "Példánynév a böngésző lapon és a syslog alkalmazás neve",
"ThemeHelpText": "Változtasd meg az alkalmazás felhasználói felület témáját. Az „Auto” téma az operációs rendszer témáját használja a Világos vagy Sötét mód beállításához. Ihlette: {0}",
"InstanceName": "Példány neve",
"InstanceNameHelpText": "Instancia név a fülön és a Syslog alkalmazásnévhez",
"ThemeHelpText": "Alkalmazás UItémájának módosítása. Az „Automatikus” téma az operációs rendszer témáját használja a világos vagy sötét mód beállításához. Inspirálta: {inspiredBy}.",
"Duration": "Időtartam",
"ElapsedTime": "Eltelt idő",
"EnabledRedirected": "Engedélyezve, átirányítva",
"Ended": "Vége lett",
"Ended": "Véget ért",
"GrabTitle": "Cím megragadása",
"LastDuration": "Utolsó időtartam",
"LastExecution": "Utolsó végrehajtás",
@@ -455,12 +455,12 @@
"DownloadClientCategory": "Letöltési kliens kategória",
"AuthenticationRequired": "Azonosítás szükséges",
"AuthenticationRequiredHelpText": "Módosítsa, hogy mely kérésekhez van szükség hitelesítésre. Ne változtasson, hacsak nem érti a kockázatokat.",
"AuthenticationRequiredWarning": "A hitelesítés nélküli távoli hozzáférés megakadályozása érdekében a(z) {appName} alkalmazásnak engedélyeznie kell a hitelesítést. Opcionálisan letilthatja a helyi címekről történő hitelesítést.",
"OnLatestVersion": "A {appName} legújabb verziója már telepítva van",
"AuthenticationRequiredWarning": "A hitelesítés nélküli távoli hozzáférés megakadályozása érdekében a {appName} alkalmazásnak engedélyeznie kell a hitelesítést. Opcionálisan letilthatja a helyi címekről történő hitelesítést.",
"OnLatestVersion": "A {appName} legújabb verziója már telepítve van",
"Remove": "Eltávolítás",
"Replace": "Kicserél",
"ApplicationURL": "Alkalmazás URL",
"ApplicationUrlHelpText": "Ennek az alkalmazásnak a külső URL-címe, beleértve a http-eket",
"ApplicationUrlHelpText": "Az alkalmazás külső URLje, beleértve a http(s):// előtagot, a portot és az URLalapot",
"More": "Több",
"Publisher": "Kiadó",
"ApplyChanges": "Változások alkalmazása",
@@ -469,19 +469,19 @@
"ApplyTagsHelpTextAdd": "Hozzáadás: Adja hozzá a címkéket a meglévő címkék listájához",
"ApplyTagsHelpTextHowToApplyApplications": "Hogyan adjunk hozzá címkéket a kiválasztott filmhez",
"ApplyTagsHelpTextHowToApplyIndexers": "Címkék alkalmazása a kiválasztott indexelőkre",
"ApplyTagsHelpTextRemove": "Eltávolítás: Távolítsa el a beírt címkéket",
"CountIndexersSelected": "{count} indexelő(k) kiválasztva",
"DeleteSelectedDownloadClients": "Letöltési kliens(ek) törlése",
"ApplyTagsHelpTextRemove": "Eltávolítás: a megadott címkék eltávolítása",
"CountIndexersSelected": "{count} indexelő kiválasztva",
"DeleteSelectedDownloadClients": "Letöltő kliens(ek) törlése",
"DownloadClientPriorityHelpText": "Priorizálj több letöltési klienst. A Round-Robint azonos prioritású letöltőkliensek használják.",
"EditSelectedDownloadClients": "Kijelölt letöltési kliensek szerkesztése",
"EditSelectedDownloadClients": "Kijelölt letöltő kliensek szerkesztése",
"Label": "Címke",
"SelectIndexers": "Indexelők keresése",
"ApiKeyValidationHealthCheckMessage": "Kérlek frissítsd az API kulcsot, ami legalább {length} karakter hosszú. Ezt megteheted a Beállításokban, vagy a config file-ban",
"SelectIndexers": "Indexelők kiválasztása",
"ApiKeyValidationHealthCheckMessage": "Kérjük, frissítse API-kulcsát úgy, hogy az legalább {length} karakter hosszú legyen. Ezt a beállítások vagy a konfigurációs fájl segítségével teheti meg",
"Episode": "Epizód",
"Genre": "Műfajok",
"Genre": "Műfaj",
"Theme": "Téma",
"Track": "Dal",
"UpdateAvailableHealthCheckMessage": "Új frissítés elérhető: {version}",
"UpdateAvailableHealthCheckMessage": "Új frissítés érhető el: {version}",
"Year": "Év",
"Book": "Könyv",
"Season": "Évad",
@@ -489,12 +489,12 @@
"Artist": "Előadó",
"Author": "Szerző",
"ConnectionLostReconnect": "A(z) {appName} automatikusan megpróbál csatlakozni, vagy kattintson az újratöltés gombra lent.",
"DeleteAppProfileMessageText": "Biztosan törli a {0} minőségi profilt?",
"DeleteAppProfileMessageText": "Biztosan törli a(z) {name} app profilt?",
"RecentChanges": "Friss változások",
"WhatsNew": "Mi az újdonság?",
"WhatsNew": "Újdonságok",
"ConnectionLostToBackend": "A(z) {appName} megszakadt a kapcsolat a háttérrendszerrel, ezért újra kell tölteni a működés visszaállításához.",
"minutes": "percek",
"AddConnection": "Csatlakozás hozzáadása",
"AddConnection": "Kapcsolat hozzáadása",
"NotificationStatusAllClientHealthCheckMessage": "Az összes értesítés nem érhető el hibák miatt",
"NotificationStatusSingleClientHealthCheckMessage": "Az alkalmazás nem áll rendelkezésre az alábbi hibák miatt: {notificationNames}",
"AuthBasic": "Alap (böngésző előugró ablak)",
@@ -509,56 +509,56 @@
"AddCustomFilter": "Egyéni szűrő hozzáadása",
"Clone": "Klón",
"Implementation": "Végrehajtás",
"AddConnectionImplementation": "Csatlakozás hozzáadása - {implementationName}",
"AddDownloadClientImplementation": "Letöltési kliens hozzáadása {implementationName}",
"AddConnectionImplementation": "Kapcsolat hozzáadása - {implementationName}",
"AddDownloadClientImplementation": "Letöltőkliens hozzáadása {implementationName}",
"AddIndexerImplementation": "Indexelő hozzáadása - {implementationName}",
"ActiveApps": "Aktív alkalmazások",
"ActiveIndexers": "Indexerek",
"AuthenticationMethod": "Hitelesítési Módszer",
"AuthenticationMethodHelpTextWarning": "Kérjük, válasszon érvényes hitelesítési módot",
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Erősítsd meg az új jelszót",
"ActiveIndexers": "Aktív indexek",
"AuthenticationMethod": "Hitelesítési módszer",
"AuthenticationMethodHelpTextWarning": "Kérjük, válasszon érvényes hitelesítési módszert",
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Erősítse meg az új jelszót",
"DefaultNameCopiedProfile": "{name} - Másolat",
"EditConnectionImplementation": "Kapcsolat szerkesztése - {implementationName}",
"EditIndexerProxyImplementation": "Indexelő hozzáadása - {megvalósítás neve}",
"AddApplicationImplementation": "Csatlakozás hozzáadása - {implementationName}",
"AddIndexerProxyImplementation": "Indexelő hozzáadása - {implementationName}",
"EditIndexerProxyImplementation": "Indexelő proxy-jának szerkesztése - {implementationName}",
"AddApplicationImplementation": "Alkalmazás hozzáadása - {implementationName}",
"AddIndexerProxyImplementation": "Indexelő-proxy hozzáadása - {implementationName}",
"EditIndexerImplementation": "Indexelő szerkesztése {implementationName}",
"EditApplicationImplementation": "Csatlakozás hozzáadása - {megvalósítás neve}",
"EditDownloadClientImplementation": "Letöltési kliens szerkesztése {implementationName}",
"EditApplicationImplementation": "Applikáció szerkesztése - {implementationName}",
"EditDownloadClientImplementation": "Letöltő kliens szerkesztése {implementationName}",
"NoIndexersFound": "Nem található indexelő",
"NoDownloadClientsFound": "Nem találhatók letöltő kliensek",
"AdvancedSettingsShownClickToHide": "Haladó beállítások megjelenítve, kattints az elrejtéshez",
"AdvancedSettingsHiddenClickToShow": "Haladó beállítások rejtve, kattints a megjelenítéshez",
"AppUpdatedVersion": "{appName} frissítve lett `{version}` verzióra, ahhoz hogy a legutóbbi változtatások életbelépjenek, töltsd újra a {appName}-t",
"AppUpdatedVersion": "{appName} frissítve lett `{version}` verzióra, ahhoz hogy a legutóbbi változtatások életbelépjenek, töltse újra a {appName}-t",
"AddCategory": "Kategória hozzáadása",
"External": "Külső",
"NoHistoryFound": "Nem található előzmény",
"InvalidUILanguage": "A felhasználói felület érvénytelen nyelvre van állítva, javítsa ki, és mentse el a beállításait",
"ManageDownloadClients": "Letöltési kliensek kezelése",
"ManageDownloadClients": "Letöltő kliensek kezelése",
"DownloadClientAriaSettingsDirectoryHelpText": "Választható hely a letöltések elhelyezéséhez, hagyja üresen az alapértelmezett Aria2 hely használatához",
"DeleteSelectedIndexersMessageText": "Biztosan törölni szeretne {count} kiválasztott indexelőt?",
"DownloadClientQbittorrentSettingsContentLayout": "Tartalom elrendezése",
"DownloadClientQbittorrentSettingsContentLayoutHelpText": "Függetlenül attól, hogy a qBittorrent konfigurált tartalomelrendezését használja, az eredeti elrendezést a torrentből, vagy mindig hozzon létre egy almappát (qBittorrent 4.3.2)",
"DeleteSelectedDownloadClientsMessageText": "Biztosan törölni szeretné a kiválasztott {count} letöltési klienst?",
"CountDownloadClientsSelected": "{count} letöltési kliens kiválasztva",
"DeleteSelectedDownloadClientsMessageText": "Biztosan törölni szeretné a kiválasztott {count} letöltő klienst?",
"CountDownloadClientsSelected": "{count} letöltő kliens kiválasztva",
"StopSelecting": "Kiválasztás leállítása",
"days": "napok",
"DeleteSelectedApplicationsMessageText": "Biztosan törölni szeretne {count} kiválasztott importlistát?",
"CountApplicationsSelected": "{count} Gyűjtemény(ek) kiválasztva",
"ManageClients": "Ügyfelek kezelése",
"IndexerDownloadClientHealthCheckMessage": "Indexelők érvénytelen letöltési kliensekkel: {indexerNames}.",
"IndexerDownloadClientHealthCheckMessage": "Indexelők érvénytelen letöltő kliensekkel: {indexerNames}.",
"PasswordConfirmation": "Jelszó megerősítése",
"SecretToken": "Titkos token",
"UseSsl": "SSL használata",
"Donate": "Adományoz",
"IndexerBeyondHDSettingsSearchTypes": "Keresés típusa",
"Mixed": "Mixed",
"Mixed": "Vegyes",
"TorrentBlackholeSaveMagnetFiles": "Magnet fájlok mentése",
"DownloadClientSettingsInitialState": "Kezdeti állapot",
"DownloadClientSettingsInitialStateHelpText": "A torrentek kezdeti állapota hozzáadva a következőhöz {clientName}",
"DownloadClientTransmissionSettingsDirectoryHelpText": "Választható hely a letöltések elhelyezéséhez, hagyja üresen az alapértelmezett Aria2 hely használatához",
"IndexerHDBitsSettingsCodecs": "Kodek",
"IndexerHDBitsSettingsMediums": "Közepes",
"DownloadClientTransmissionSettingsDirectoryHelpText": "Opcionális hely a letöltések elhelyezéséhez, hagyja üresen az alapértelmezett Transmission hely használatához",
"IndexerHDBitsSettingsCodecs": "Kodekek",
"IndexerHDBitsSettingsMediums": "Médiumok",
"BlackholeFolderHelpText": "Mappa, amelyben az {appName} tárolja az {extension} fájlt",
"Destination": "Rendeltetési hely",
"Directory": "Könyvtár",
@@ -567,11 +567,11 @@
"TorrentBlackholeSaveMagnetFilesExtension": "Magnet Files kiterjesztés mentése",
"TorrentBlackholeTorrentFolder": "Torrent mappa",
"DownloadClientDelugeSettingsUrlBaseHelpText": "Előtagot ad a deluge json URL-hez, lásd: {url}",
"CustomFilter": "Egyedi Szűrők",
"CustomFilter": "Egyedi szűrő",
"DownloadClientDownloadStationSettingsDirectoryHelpText": "Opcionális megosztott mappa a letöltések elhelyezéséhez, hagyja üresen az alapértelmezett Download Station hely használatához",
"DownloadClientRTorrentSettingsDirectoryHelpText": "Választható hely a letöltések elhelyezéséhez, hagyja üresen az alapértelmezett Aria2 hely használatához",
"DownloadClientRTorrentSettingsDirectoryHelpText": "Választható hely a letöltések elhelyezéséhez, hagyja üresen az alapértelmezett rTorrent hely használatához",
"DownloadClientSettingsUseSslHelpText": "Biztonságos kapcsolat használata, amikor a(z) {clientName} szolgáltatással csatlakozik",
"GrabRelease": "Release megragadása",
"GrabRelease": "Kiadás megragadása",
"ManualGrab": "Megfog",
"PrioritySettings": "Prioritás: {priority}",
"ProxyValidationBadRequest": "Proxy tesztelése sikertelen. Állapotkód: {statusCode}",
@@ -580,8 +580,8 @@
"Script": "Szkript",
"Any": "Bármi",
"PublishedDate": "Közzététel dátuma",
"Redirected": "Átirányítás",
"AllSearchResultsHiddenByFilter": "Az alkalmazott szűrők miatt, az összes keresési eredmény rejtve marad",
"Redirected": "Átirányítva",
"AllSearchResultsHiddenByFilter": "Az alkalmazott szűrők miatt, az összes keresési eredmény rejtve marad.",
"HealthMessagesInfoBox": "Az állapotfelmérés okáról további információkat találhat, ha a sor végén található wikilinkre (könyv ikonra) kattint, vagy megnézi [logs] ({link}). Ha nehézségei vannak ezen üzenetek értelmezése során, forduljon ügyfélszolgálatunkhoz az alábbi linkeken.",
"AptUpdater": "A frissítés telepítéséhez használja az apt-t",
"DockerUpdater": "Frissítse a docker-tárolót a frissítés fogadásához",
@@ -592,10 +592,123 @@
"LogFilesLocation": "A naplófájlok itt találhatók: {location}",
"Logout": "Kijelentkezés",
"NoEventsFound": "Nem található események",
"RestartReloadNote": "Megjegyzés: A {appName} automatikusan újraindítja és újratölti a felületet a visszaállítási folyamatban.",
"UpdateAppDirectlyLoadError": "Nem lehetséges közvetlenül frissíteni a {appName}-t",
"RestartReloadNote": "Megjegyzés: A {appName} automatikusan újraindítja és újratölti a felhasználói felületet a visszaállítási folyamatban.",
"UpdateAppDirectlyLoadError": "Nem lehetséges közvetlenül frissíteni a {appName}-t,",
"WouldYouLikeToRestoreBackup": "Szeretné visszaállítani a(z) „{name}” biztonsági másolatot?",
"InstallLatest": "Legfrissebb telepítése",
"CurrentlyInstalled": "Jelenleg telepítve",
"PreviouslyInstalled": "Korábban telepítve"
"PreviouslyInstalled": "Korábban telepítve",
"IndexerId": "Indexelő",
"FailedToFetchSettings": "A beállítások lekérése sikertelen",
"IndexerBeyondHDSettingsRewindOnly": "Csak olvasható",
"IndexerSettingsAppsMinimumSeeders": "Minimális Seederek Száma",
"EditCategory": "Kategória szerkesztése",
"IndexerHDBitsSettingsOrigins": "Eredet",
"LogSizeLimit": "Logfájl méretkorlátja",
"DeleteSelectedApplications": "A kiválasztott előadó(k) törlése",
"DeleteSelectedIndexer": "Kiválasztott indexelők szerkesztése",
"SearchAllIndexers": "Filmek Keresése",
"AppsMinimumSeeders": "Minimális Seederek Száma",
"DeleteSelectedIndexers": "Kiválasztott indexelők szerkesztése",
"IndexerStatus": "Indexer Beállítások",
"IndexerDownloadClientHelpText": "Adja meg, melyik letöltési kliens legyen használva a {appName} által erről az indexelőről indított letöltésekhez",
"IndexerBeyondHDSettingsRefundOnly": "Csak visszatérítésre",
"DownloadClientFloodSettingsTagsHelpText": "A letöltés induló címkéi. A rendszer csak akkor ismeri fel a letöltést, ha az összes megadott induló címkét tartalmazza. Ez segít megelőzni az ütközéseket más, nem kapcsolódó letöltésekkel.",
"DownloadClientFreeboxSettingsApiUrl": "API URL",
"DownloadClientFreeboxSettingsAppId": "Alkalmazás ID",
"DownloadClientFreeboxSettingsAppToken": "Alkalmazás token",
"XmlRpcPath": "XML RPC útvonal",
"NotificationsEmailSettingsUseEncryptionHelpText": "Meghatározza, hogy a rendszer a szerver beállításaitól függően előnyben részesítsee a titkosítást, mindig titkosítást használjon (SSL: csak 465ös port, StartTLS: más portok), vagy egyáltalán ne alkalmazzon titkosítást",
"DownloadClientNzbgetSettingsAddPausedHelpText": "Ez az opció legalább 16.0-s NzbGet verziót igényel",
"DownloadClientPneumaticSettingsNzbFolder": "Nzb mappa",
"DownloadClientPneumaticSettingsStrmFolder": "Strm mappa",
"DownloadClientQbittorrentSettingsUseSslHelpText": "Biztonságos kapcsolatot használjon. Ld. Opciók -> Web UI -> \"HTTPS használata HTTP helyett\" qBittorentben.",
"DownloadClientRTorrentSettingsUrlPath": "Url útvonal",
"DownloadClientFloodSettingsUrlBaseHelpText": "Előtag hozzáadása a Flood APIhoz (pl. {url})",
"DownloadClientFreeboxSettingsApiUrlHelpText": "Adja meg a Freebox API alap URLjét az APIverzióval együtt, pl. '{url}', alapértelmezés: '{defaultApiUrl}'",
"DownloadClientFreeboxSettingsAppIdHelpText": "A Freebox APIhoz való hozzáférés létrehozásakor megadott App ID (például „app_id”)",
"DownloadClientFreeboxSettingsAppTokenHelpText": "A Freebox APIhozzáférés létrehozásakor kapott alkalmazástoken (pl. „app_token”)",
"DownloadClientFreeboxSettingsHostHelpText": "A Freebox hostneve vagy IPcíme (alapértelmezés: '{url}'; csak ugyanazon a hálózaton működik)",
"DownloadClientFreeboxSettingsPortHelpText": "A Freebox interfész által használt port, alapértelmezés: '{port}'",
"DownloadClientPneumaticSettingsNzbFolderHelpText": "Ennek a mappának elérhetőnek kell lennie az XBMC számára",
"DownloadClientQbittorrentSettingsFirstAndLastFirst": "Első és utolsó először",
"DownloadClientQbittorrentSettingsFirstAndLastFirstHelpText": "Először a fájl elejének és a végének letöltése (qBittorrent 4.1.0+)",
"DownloadClientQbittorrentSettingsInitialStateHelpText": "qBittorrenthez hozzáadott torrentek alapértelmezett állapota. Fontos: a kényszerített torrentek figyelmen kívül hagyják a seedelési szabályokat",
"DownloadClientQbittorrentSettingsSequentialOrder": "Szekvenciális sorrend",
"DownloadClientQbittorrentSettingsSequentialOrderHelpText": "Letöltés szekvenciális sorrendben (qBittorrent 4.1.0+)",
"DownloadClientSettingsAddPaused": "Hozzáadás szüneltetettként",
"UsenetBlackholeNzbFolder": "Nzb mappa",
"DownloadClientRTorrentSettingsAddStopped": "Hozzáadás megállítvaként",
"DownloadClientRTorrentSettingsAddStoppedHelpText": "Engedélyezés esetén a torrentek és magnet linkek megállítva állapotban kerülnek be az rTorrentbe, ami a magnet fájlok hibás működéséhez vezethet.",
"DownloadClientRTorrentSettingsUrlPathHelpText": "Az XMLRPC végpont elérési útja, lásd: {url}. ruTorrent használata esetén ez általában az RPC2 vagy a [ruTorrent elérési útvonala]{url2}.",
"DownloadClientSettingsDestinationHelpText": "A letöltési útvonal kézi beállítása. Ha üresen marad, az alapértelmezett lesz használva",
"DownloadClientSettingsUrlBaseHelpText": "Prefixet ad a(z) {clientName} hivatkozáshoz, például: {url}",
"DownloadClientUTorrentProviderMessage": "A uTorrent múltjában előfordult, hogy kriptobányászót, kártevőket és reklámokat tartalmazott, ezért erősen javasoljuk, hogy válasszon egy másik klienst.",
"TheLogLevelDefault": "A naplózási szint alapértéke a 'Debug', ez megváltoztatható az Általános beállítások/beállítások/általános menüpontban",
"IndexerHDBitsSettingsCodecsHelpText": "Ha nincs megadva, minden lehetőség felhasználásra kerül.",
"IndexerHDBitsSettingsMediumsHelpText": "Ha nincs megadva, minden lehetőség felhasználásra kerül.",
"IndexerNewznabSettingsAdditionalParametersHelpText": "Kiegészítő Newznab paraméterek",
"IndexerPassThePopcornSettingsApiUserHelpText": "Ezek a beállítások megtalálhatók a PassThePopcorn-jának biztonsági beállításaiban (Profil szerkesztése > Biztonság).",
"IndexerSettingsAdditionalParameters": "Kiegészítő paraméterek",
"IndexerSettingsApiPath": "API útvonal",
"IndexerSettingsApiPathHelpText": "Az API elérési útja, általában: {url}",
"IndexerSettingsApiUser": "API felhasználó",
"IndexerSettingsCookie": "Süti",
"IndexerSettingsSeedRatio": "Megosztási arány",
"IndexerSettingsSeedRatioHelpText": "Az az arány, amelyet a torrentnek el kell érnie a leállítás előtt. Üresen hagyva a letöltő kliens alapértelmezett értékét használja. Az aránynak legalább 1.0nak kell lennie, és meg kell felelnie az indexelő szabályainak",
"IndexerSettingsSeedTime": "Megosztási idő",
"IndexerSettingsSeedTimeHelpText": "Az az időtartam, ameddig a torrentet seedelni kell a leállítás előtt. Üresen hagyva a letöltő kliens alapértelmezett értékét használja",
"InfoUrl": "Infó URL",
"InstallMajorVersionUpdate": "Frissítés telepítése",
"InstallMajorVersionUpdateMessage": "Ez a frissítés egy új főverziót telepít, és előfordulhat, hogy nem kompatibilis a rendszerével. Biztosan telepíteni szeretné ezt a frissítést?",
"LogSizeLimitHelpText": "Archiválás előtti maximális log fájl méret MB-ben. Alapértelmezetten 1MB.",
"Menu": "Menü",
"SelectDownloadClientModalTitle": "{modalTitle} - Letöltő kliens kiválasztása",
"DownloadClientTransmissionSettingsUrlBaseHelpText": "Előtagot ad a(z) {clientName} RPCURLjéhez, például {url}; alapértelmezetten: '{defaultUrl}'",
"Install": "Telepítés",
"InstallMajorVersionUpdateMessageLink": "További információért látogasson el ide: [{domain}]({url}).",
"LabelIsRequired": "Címke kötelező",
"TorrentBlackholeSaveMagnetFilesHelpText": "Magnet link mentése, ha nem érhető el .torrent fájl (csak akkor hasznos, ha a letöltő kliens támogatja a fájlba mentett magnete­ket)",
"TorrentBlackholeSaveMagnetFilesExtensionHelpText": "A magnet linkekhez használandó kiterjesztés, alapértelmezés szerint: \".magnet\"",
"PackageVersionInfo": "{packageVersion} {packageAuthor}-tól/től",
"NotificationsEmailSettingsUseEncryption": "Titkosítás használata",
"NotificationsTelegramSettingsIncludeAppName": "Csatolja a {appName} nevet a címbe",
"NotificationsTelegramSettingsIncludeAppNameHelpText": "Az üzenet címének opcionális kiegészítése a {appName}-ral, hogy megkülönböztesse az értesítéseket más alkalmazásoktól",
"OverrideGrabModalTitle": "Felülírás és megragadás - {title}",
"OnHealthRestored": "Az állapot stabilizálódásakor",
"DownloadClientPneumaticSettingsStrmFolderHelpText": "A mappában lévő .strm fájlokat a Drone fogja importálni",
"UpdaterLogFiles": "A frissítő naplófájljai",
"CountIndexersAvailable": "{count} indexelő elérhető",
"PreferMagnetUrlHelpText": "Ha engedélyett, ez az indexelő előnyben részesíti a magnet URL-ek használatát a letöltésekhez, és ha ez nem lehetséges, visszatér a torrent linkekhez",
"IndexerSettingsPreferMagnetUrlHelpText": "Ha engedélyett, ez az indexelő előnyben részesíti a magnet URL-ek használatát a letöltésekhez, és ha ez nem lehetséges, visszatér a torrent linkekhez",
"IndexerHDBitsSettingsUseFilenames": "Fájlneveket használjon",
"TorznabUrl": "Torznab URL",
"IndexerGazelleGamesSettingsApiKeyHelpText": "APIkulcs az oldalról (a Beállítások => Hozzáférési beállítások menüben található)",
"IndexerOrpheusSettingsApiKeyHelpText": "APIkulcs az oldalról (a Beállítások => Hozzáférési beállítások menüben található)",
"IndexerRedactedSettingsApiKeyHelpText": "APIkulcs az oldalról (a Beállítások => Hozzáférési beállítások menüben található)",
"IndexerMTeamTpSettingsApiKeyHelpText": "APIkulcs az oldalról (a Vezérlőpult => Biztonság => Laboratórium menüben található)",
"IndexerSettingsBaseUrl": "Alap URL",
"DefaultCategory": "Alapértelmezett kategória",
"FoundCountReleases": "{itemCount} kiadást talált",
"ApplicationSettingsSyncRejectBlocklistedTorrentHashesHelpText": "Ha egy torrent hash alapján blokkolt, előfordulhat, hogy egyes indexelőknél nem kerül megfelelően elutasításra RSSben vagy keresés közben. Ennek engedélyezésével a torrent a lekérés után, de még a kliensnek való továbbítás előtt elutasítható.",
"IndexerHDBitsSettingsOriginsHelpText": "Ha nincs megadva, minden lehetőség felhasználásra kerül.",
"SeedTimeHelpText": "z az időtartam, ameddig a torrentet seedelni kell a leállítás előtt, üresen hagyva az app alapértelmezett értéke",
"NewznabUrl": "Newznab URL",
"RepeatSearch": "Keresés megismétlése",
"IndexerAlphaRatioSettingsFreeleechOnlyHelpText": "Csak freeleech kiadások keresése",
"IndexerBeyondHDSettingsFreeleechOnlyHelpText": "Csak freeleech kiadások keresése",
"IndexerFileListSettingsFreeleechOnlyHelpText": "Csak freeleech kiadások keresése",
"IndexerIPTorrentsSettingsFreeleechOnlyHelpText": "Csak freeleech kiadások keresése",
"IndexerPassThePopcornSettingsFreeleechOnlyHelpText": "Csak freeleech kiadások keresése",
"IndexerMTeamTpSettingsFreeleechOnlyHelpText": "Csak freeleech kiadások keresése",
"IndexerGazelleGamesSettingsFreeleechOnlyHelpText": "Csak freeleech kiadások keresése",
"IndexerAvistazSettingsFreeleechOnlyHelpText": "Csak freeleech kiadások keresése",
"SeedRatio": "Megosztási arány",
"SeedTime": "Megosztási idő",
"IndexerNewznabSettingsApiKeyHelpText": "Webhely API-kulcsa",
"IndexerNzbIndexSettingsApiKeyHelpText": "Webhely API-kulcsa",
"IndexerPassThePopcornSettingsApiKeyHelpText": "Webhely API-kulcsa",
"IndexerTorrentSyndikatSettingsApiKeyHelpText": "Webhely API-kulcsa",
"OnGrabHelpText": "A kiadás megragadásakor",
"OnHealthRestoredHelpText": "Az állapot stabilizálódásakor"
}

View File

@@ -89,5 +89,51 @@
"AptUpdater": "Gunakan apt untuk memasang pembaruan",
"Clone": "Tutup",
"EnableSSL": "Aktifkan RSS",
"CurrentlyInstalled": "Saat Ini Terpasang"
"CurrentlyInstalled": "Saat Ini Terpasang",
"Author": "Otomatis",
"CustomFilters": "tambah filter khusus",
"AddCategory": "Kategori",
"AddDownloadClientImplementation": "tambah persyaratan {implementationName}",
"AddIndexerImplementation": "tambah persyaratan {implementationName}",
"Applications": "URL Aplikasi",
"Proxies": "Profil",
"IndexerId": "Pengindeks",
"UnableToAddANewAppProfilePleaseTryAgain": "tidak dapat menambahkan persyaratan baru, coba lagi..",
"CustomFilter": "tambah filter khusus",
"DownloadClient": "Tambahkan Download Client",
"EditApplicationImplementation": "tambah persyaratan {implementationName}",
"EditConnectionImplementation": "tambah koneksi - {implementationName}",
"Filter": "File",
"UILanguage": "Bahasa",
"UnableToAddANewApplicationPleaseTryAgain": "tidak dapat menambahkan persyaratan baru, coba lagi..",
"UnableToAddANewDownloadClientPleaseTryAgain": "tidak dapat menambahkan persyaratan baru, coba lagi..",
"UnableToAddANewIndexerPleaseTryAgain": "tidak dapat menambahkan persyaratan baru, coba lagi..",
"CountIndexersSelected": "{count} serial dipilih",
"UnableToAddANewIndexerProxyPleaseTryAgain": "tidak dapat menambahkan persyaratan baru, coba lagi..",
"InteractiveSearch": "Aktifkan Penelusuran Interaktif",
"UnableToAddANewNotificationPleaseTryAgain": "tidak dapat menambahkan persyaratan baru, coba lagi..",
"Application": "URL Aplikasi",
"Donate": "Tanggal",
"AddNewIndexer": "Tambahkan Pengindeks",
"DownloadClients": "Tambahkan Download Client",
"AddApplicationImplementation": "tambah persyaratan {implementationName}",
"TvSearch": "Cari",
"AddIndexerProxyImplementation": "tambah persyaratan {implementationName}",
"ManageDownloadClients": "Tambahkan Download Client",
"Download": "Pengunduhan Ulang Gagal",
"DownloadClientSettings": "Tambahkan Download Client",
"EditSelectedDownloadClients": "Tambahkan Download Client",
"IndexerInfo": "Pengindeks",
"DeleteSelectedDownloadClients": "Tambahkan Download Client",
"Filters": "File",
"AddApplication": "URL Aplikasi",
"CountApplicationsSelected": "{count} serial dipilih",
"EditCategory": "Kategori",
"EditDownloadClientImplementation": "tambah persyaratan {implementationName}",
"EditIndexerImplementation": "tambah persyaratan {implementationName}",
"Auth": "Otomatis",
"DeleteClientCategory": "Tambahkan Download Client",
"DeleteDownloadClient": "Tambahkan Download Client",
"EditSyncProfile": "Tambah Delay Profile",
"EditIndexerProxyImplementation": "tambah persyaratan {implementationName}"
}

View File

@@ -375,5 +375,47 @@
"CurrentlyInstalled": "Nú sett upp",
"Stats": "Staða",
"Mixed": "Fastur",
"Season": "Ástæða"
"Season": "Ástæða",
"Destination": "Áfangastaður Slóð",
"AuthenticationMethod": "Auðkenning",
"UnableToLoadDevelopmentSettings": "Ekki er hægt að hlaða almennar stillingar",
"UnableToLoadIndexerProxies": "Ekki er hægt að hlaða Indexers",
"IndexerHDBitsSettingsOrigins": "Frumlegt",
"IndexerId": "Indexer",
"IndexerProxy": "Forgangur indexers",
"AddNewIndexer": "Bættu við Indexer",
"UnableToLoadAppProfiles": "Ekki er hægt að hlaða seinkunarsnið",
"Notification": "Vottun",
"Proxies": "Snið",
"TvSearch": "Leitaðu",
"SelectIndexers": "Eyða Indexer",
"AddCustomFilter": "Sérsniðin síur",
"Donate": "Dagsetning",
"DeleteClientCategory": "Eyða niðurhals viðskiptavinur",
"EditSyncProfile": "Breyta seinkunarprófíl",
"DeleteSelectedIndexersMessageText": "Ertu viss um að þú viljir eyða völdum kvikmyndaskrám?",
"EditSelectedDownloadClients": "Eyða niðurhals viðskiptavinur",
"IndexerStatus": "Stillingar flokkara",
"MovieSearch": "Fjöldamyndaleit",
"AddConnection": "Tenging",
"ManageDownloadClients": "Sækja viðskiptavini",
"DeleteIndexerProxy": "Eyða Indexer",
"DeleteSelectedApplications": "Eyða völdum kvikmyndaskrám",
"DeleteSelectedApplicationsMessageText": "Ertu viss um að þú viljir eyða völdum kvikmyndaskrám?",
"DeleteSelectedDownloadClientsMessageText": "Ertu viss um að þú viljir eyða völdum kvikmyndaskrám?",
"IndexerInfo": "Indexer",
"MovieSearchTypes": "Fjöldamyndaleit",
"Notifications": "Vottun",
"SearchIndexers": "Eyða Indexer",
"SyncProfile": "Breyta seinkunarprófíl",
"Connect": "Vottun",
"AddIndexerProxy": "Forgangur indexers",
"SyncProfiles": "Breyta seinkunarprófíl",
"DeleteSelectedIndexer": "Eyða Indexer",
"EditSelectedIndexers": "Eyða Indexer",
"AddSyncProfile": "Breyta seinkunarprófíl",
"DownloadClientCategory": "Eyða niðurhals viðskiptavinur",
"IndexerProxies": "Forgangur indexers",
"DeleteSelectedIndexers": "Eyða Indexer",
"FilterPlaceHolder": "Eyða Indexer"
}

View File

@@ -11,7 +11,7 @@
"NoChanges": "Nessun Cambiamento",
"NoChange": "Nessun Cambio",
"LastWriteTime": "Orario di Ultima Scrittura",
"Indexer": "Indicizzatore",
"Indexer": "Indice",
"HideAdvanced": "Nascondi Avanzate",
"Health": "Salute",
"Grabbed": "Preso",
@@ -50,11 +50,11 @@
"Logging": "Logging",
"LogFiles": "File di Log",
"Language": "Lingua",
"IndexerStatusUnavailableHealthCheckMessage": "Indicizzatori non disponibili a causa di errori: {indexerNames}",
"IndexerStatusAllUnavailableHealthCheckMessage": "Nessun Indicizzatore disponibile a causa di errori",
"Indexers": "Indicizzatori",
"IndexerStatusUnavailableHealthCheckMessage": "Indici non disponibili a causa di errori: {indexerNames}",
"IndexerStatusAllUnavailableHealthCheckMessage": "Nessun indice disponibile a causa di errori",
"Indexers": "Indici",
"Host": "Host",
"History": "Storia",
"History": "Storico",
"GeneralSettingsSummary": "Porta, SSL, nome utente/password, proxy, analitiche, e aggiornamenti",
"General": "Generale",
"Folder": "Cartella",
@@ -90,7 +90,7 @@
"CertificateValidationHelpText": "Cambia quanto è rigorosa la convalida del certificato HTTPS",
"CertificateValidation": "Convalida del Certificato",
"Cancel": "Annulla",
"BypassProxyForLocalAddresses": "Evita il Proxy per gli Indirizzi Locali",
"BypassProxyForLocalAddresses": "Ignora il Proxy per Indirizzi Locali",
"Branch": "Branca",
"BindAddressHelpText": "Indirizzi IP validi, localhost o '*' per tutte le interfacce",
"BindAddress": "Indirizzo di Ascolto",
@@ -156,13 +156,13 @@
"Logs": "Logs",
"Hostname": "Nome Host",
"MIA": "MIA",
"IndexerFlags": "Flags dell'Indicizzatore",
"IndexerFlags": "Etichette dell'Indice",
"EnableSSL": "Abilita SSL",
"SettingsLongDateFormat": "Formato Data Esteso",
"SettingsEnableColorImpairedMode": "Abilità la Modalità Daltonica",
"SendAnonymousUsageData": "Invia dati anonimi sull'uso",
"ScriptPath": "Percorso dello script",
"RssIsNotSupportedWithThisIndexer": "RSS non è supportato con questo indicizzatore",
"RssIsNotSupportedWithThisIndexer": "RSS non supportato con questo indice",
"Retention": "Ritenzione",
"Result": "Risultato",
"Restore": "Ripristina",
@@ -173,10 +173,10 @@
"Reset": "Reimposta",
"RemovingTag": "Eliminando l'etichetta",
"RemoveFilter": "Rimuovi filtro",
"RemovedFromTaskQueue": "Rimosso dalla coda lavori",
"RemovedFromTaskQueue": "Rimosso dalla coda",
"RefreshMovie": "Aggiorna il Film",
"ReadTheWikiForMoreInformation": "Leggi la Wiki per più informazioni",
"ProwlarrSupportsAnyIndexer": "{appName} supporta molti indicizzatori oltre a qualsiasi indicizzatore che utilizza lo standard Newznab/Torznab utilizzando \"Generic Newznab\" (per usenet) o \"Generic Torznab\" (per torrent). Cerca e seleziona il tuo indicizzatore da qua sotto.",
"ProwlarrSupportsAnyIndexer": "{appName} supporta molti indici oltre a qualsiasi indice che utilizza gli standard Newznab/Torznab utilizzando \"Newznab Generico\" (per usenet) o \"Torznab Generico\" (per torrent). Cerca e seleziona il tuo indice da qua sotto.",
"ProwlarrSupportsAnyDownloadClient": "{appName} supporta qualunque client di download elencato sotto.",
"ProxyUsernameHelpText": "Devi inserire nome utente e password solo se richiesto. Altrimenti lascia vuoto.",
"ProxyType": "Tipo Proxy",
@@ -209,7 +209,7 @@
"IgnoredAddresses": "Indirizzi Ignorati",
"GeneralSettings": "Impostazioni Generali",
"ForMoreInformationOnTheIndividualDownloadClients": "Per più informazioni sui singoli client di download clicca sui pulsanti info.",
"FilterPlaceHolder": "Cerca indicizzatori",
"FilterPlaceHolder": "Cerca indici",
"ExistingTag": "Etichetta esistente",
"Exception": "Eccezione",
"ErrorLoadingContents": "Errore nel caricare i contenuti",
@@ -242,7 +242,7 @@
"DownloadClientsLoadError": "Impossibile caricare i client di download",
"BackupsLoadError": "Impossibile caricare i backup",
"UnableToAddANewNotificationPleaseTryAgain": "Impossibile aggiungere una nuova notifica, riprova.",
"UnableToAddANewIndexerPleaseTryAgain": "Impossibile aggiungere un nuovo Indicizzatore, riprova.",
"UnableToAddANewIndexerPleaseTryAgain": "Impossibile aggiungere un nuovo indice, riprova.",
"UnableToAddANewDownloadClientPleaseTryAgain": "Impossibile aggiungere un nuovo client di download, riprova.",
"UISettings": "Impostazioni Interfaccia",
"UILanguageHelpTextWarning": "Ricaricamento del browser richiesto",
@@ -250,7 +250,7 @@
"UILanguage": "Lingua dell'Interfaccia",
"Torrents": "Torrents",
"TestAllClients": "Testa tutti i client",
"TagsHelpText": "Si applica agli Indicizzatori con almeno un etichetta corrispondente",
"TagsHelpText": "Si applica agli indici con almeno un'etichetta corrispondente",
"TagIsNotUsedAndCanBeDeleted": "L'etichetta non è in uso e può essere eliminata",
"TagCannotBeDeletedWhileInUse": "Non può essere cancellato mentre è in uso",
"SuggestTranslationChange": "Suggerisci un cambio nella traduzione",
@@ -270,12 +270,12 @@
"SettingsEnableColorImpairedModeHelpText": "Stile alterato per permettere agli utenti daltonici di distinguere meglio le informazioni codificate a colori",
"Priority": "Priorità",
"InteractiveSearch": "Ricerca interattiva",
"IndexerPriorityHelpText": "Priorità dell'Indicizzatore da 1 (più alto) a 50 (più basso). Predefinita: 25.",
"IndexerPriority": "Priorità dell'Indicizzatore",
"EditIndexer": "Modifica Indicizzatore",
"IndexerPriorityHelpText": "Priorità dell'Indice da 1 (più alta) a 50 (più bassa). Predefinita: 25.",
"IndexerPriority": "Priorità dell'Indice",
"EditIndexer": "Modifica Indice",
"Disabled": "Disabilitato",
"AutomaticSearch": "Ricerca Automatica",
"AddIndexer": "Aggiungi Indexer",
"AddIndexer": "Aggiungi Indice",
"SaveSettings": "Salva Impostazioni",
"OpenThisModal": "Apri questa Modale",
"MovieIndexScrollTop": "Indice film: scorri in alto",
@@ -283,24 +283,24 @@
"FocusSearchBox": "Evidenzia casella di ricerca",
"CloseCurrentModal": "Chiudi la Modale Attuale",
"AcceptConfirmationModal": "Accetta Conferma Modale",
"IndexerLongTermStatusUnavailableHealthCheckMessage": "Alcuni Indicizzatori non sono disponibili da più di 6 ore a causa di errori: {indexerNames}",
"IndexerLongTermStatusAllUnavailableHealthCheckMessage": "Nessun Indicizzatore è disponibile da più di 6 ore a causa di errori",
"IndexerLongTermStatusUnavailableHealthCheckMessage": "Alcuni indici non sono disponibili da più di 6 ore a causa di errori: {indexerNames}",
"IndexerLongTermStatusAllUnavailableHealthCheckMessage": "Nessun indice è disponibile da più di 6 ore a causa di errori",
"Description": "Descrizione",
"Add": "Aggiungi",
"Enabled": "Abilitato",
"Encoding": "Codifica",
"EnableIndexer": "Abilita Indicizzatore",
"EnableIndexer": "Abilita Indice",
"AddNewIndexer": "Aggiungi nuovo Indexer",
"IndexerAuth": "Autenticazione dell'Indicizzatore",
"IndexerAuth": "Autenticazione dell'Indice",
"AddDownloadClient": "Aggiungi Client di Download",
"Category": "Categoria",
"ClearHistory": "Cancella cronologia",
"ClearHistoryMessageText": "Sei sicuro di voler cancellare tutta la cronologia di {appName}?",
"Donations": "Donazioni",
"EnableRssHelpText": "Abilita feed RSS per l'Indicizzatore",
"EnableRssHelpText": "Abilita feed RSS per l'Indice",
"HomePage": "Pagina Iniziale",
"Id": "ID",
"IndexerHealthCheckNoIndexers": "Nessun Indicizzatore abilitato, {appName} non restituirà risultati di ricerca",
"IndexerHealthCheckNoIndexers": "Nessun indice abilitato, {appName} non restituirà risultati di ricerca",
"EnableRss": "Abilita RSS",
"NoLinks": "Nessun Collegamento",
"Rss": "RSS",
@@ -309,8 +309,8 @@
"DeleteApplicationMessageText": "Sei sicuro di voler eliminare l'applicazione '{name}'?",
"DeleteIndexerProxyMessageText": "Sei sicuro di voler eliminare il proxy '{name}'?",
"Presets": "Preset",
"SearchIndexers": "Cerca Indicizzatori",
"UnableToAddANewIndexerProxyPleaseTryAgain": "Impossibile aggiungere un nuovo proxy per l'Indicizzatore, riprova.",
"SearchIndexers": "Cerca negli indici",
"UnableToAddANewIndexerProxyPleaseTryAgain": "Impossibile aggiungere un nuovo proxy per l'indice, riprova.",
"Yesterday": "Ieri",
"ApplicationStatusCheckSingleClientMessage": "Applicazioni non disponibili a causa di errori: {0}",
"Today": "Oggi",
@@ -334,13 +334,13 @@
"OnApplicationUpdateHelpText": "All'aggiornamento dell'applicazione",
"OnGrab": "Al Prelievo",
"OnHealthIssue": "Quando c'è un problema",
"TestAllIndexers": "Prova tutti gli indicizzatori",
"TestAllIndexers": "Prova tutti gli Indici",
"UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent fornito dalla app che ha chiamato la API",
"GrabReleases": "Prendi Release(s)",
"Link": "Collegamenti",
"MappedDrivesRunningAsService": "Le unità di rete mappate non sono disponibili eseguendo come servizio di Windows. Vedere le FAQ per maggiori informazioni",
"No": "No",
"UnableToLoadIndexers": "Impossibile caricare gli Indicizzatori",
"UnableToLoadIndexers": "Impossibile caricare gli Indici",
"Yes": "Sì",
"AddIndexerProxy": "Aggiungi proxy dell'Indexer",
"AudioSearch": "Ricerca Audio",
@@ -353,7 +353,7 @@
"AddToDownloadClient": "Aggiungi release al client di download",
"Categories": "Categorie",
"Database": "Database",
"DeleteIndexerProxy": "Cancella il Proxy dell'Indicizzatore",
"DeleteIndexerProxy": "Cancella il Proxy dell'Indice",
"Auth": "Auth",
"AddDownloadClientToProwlarr": "L'aggiunta di un client di download permette a {appName} di inviare le release direttamente dall'interfaccia mentre si fa una ricerca manuale.",
"Applications": "Applicazioni",
@@ -363,33 +363,33 @@
"AppSettingsSummary": "Applicazioni e impostazioni per configurare come {appName} interagisce con i tuoi programmi PVR",
"Apps": "Le App",
"DevelopmentSettings": "Impostazioni di Sviluppo",
"RedirectHelpText": "Reindirizza le richieste di download per l'Indicizzatore e passa il prelievo direttamente invece di inoltrare la richiesta tramite {appName}",
"IndexerVipExpiredHealthCheckMessage": "I benefici VIP dell'Indicizzatore sono scaduti: {indexerNames}",
"IndexerVipExpiringHealthCheckMessage": "I benefici VIP dell'Indicizzatore scadranno a breve: {indexerNames}",
"IndexerProxies": "Proxy degli Indicizzatori",
"RedirectHelpText": "Reindirizza le richieste di download per l'indice e inoltra il recupero direttamente invece di far passare la richiesta tramite {appName}",
"IndexerVipExpiredHealthCheckMessage": "I benefici VIP dell'Indice sono scaduti: {indexerNames}",
"IndexerVipExpiringHealthCheckMessage": "I benefici VIP dell'Indice scadranno a breve: {indexerNames}",
"IndexerProxies": "Proxy degli Indici",
"Stats": "Statistiche",
"SyncAppIndexers": "Sincronizza tutti gli indicizzatori",
"SyncAppIndexers": "Sincronizza tutti gli indici",
"SyncLevel": "Livello Sincronizzazione",
"IndexerProxy": "Proxy dell'Indicizzatore",
"IndexerProxy": "Proxy dell'Indice",
"Proxies": "Proxy",
"ApplicationsLoadError": "Impossibile careicare la lista applicazioni",
"Website": "Sito",
"Privacy": "Privacy",
"SettingsIndexerLogging": "Logging Migliorato dell'Indicizzatore",
"SettingsIndexerLogging": "Logging dettagliato dell'indice",
"TestAllApps": "Prova Tutte le App",
"UnableToLoadAppProfiles": "Impossibile caricare i profili delle app",
"UnableToLoadIndexerProxies": "Impossibile caricare i Proxy degli Indicizzatori",
"UnableToLoadIndexerProxies": "Impossibile caricare i Proxy degli Indici",
"FullSync": "Sincronizzazione completa",
"IndexerAlreadySetup": "Almeno un'istanza dell'indicizzatore è già configurata",
"IndexerDetails": "Dettagli dell'Indicizzatore",
"IndexerInfo": "Info sull'Indicizzatore",
"IndexerName": "Nome dell'Indicizzatore",
"IndexerNoDefinitionCheckHealthCheckMessage": "Gli indicizzatori non hanno una definizione e non funzioneranno: {indexerNames}. Si prega di rimuoverli e/o di riaggiungerli a {appName}",
"IndexerAlreadySetup": "Almeno un'istanza dell'indice è già configurata",
"IndexerDetails": "Dettagli Indice",
"IndexerInfo": "Info sull'Indice",
"IndexerName": "Nome dell'Indice",
"IndexerNoDefinitionCheckHealthCheckMessage": "Indici senza definizione che non funzioneranno: {indexerNames}. Si prega di rimuoverli e/o di riaggiungerli a {appName}.",
"HistoryCleanup": "Pulizia della Cronologia",
"IndexerRss": "RSS dell'Indicizzatore",
"IndexerSite": "Sito dell'Indicizzatore",
"IndexerRss": "Indice RSS",
"IndexerSite": "Sito dell'Indice",
"MassEditor": "Editor di Massa",
"IndexerTagsHelpText": "Usa le etichette per specificare i Proxy degli Indicizzatori, con che app un indicizzatore si sincronizza o semplicemente per organizzarli.",
"IndexerTagsHelpText": "Usa le etichette per specificare i Proxy degli Indici, o con che app un indice si sincronizza.",
"MovieSearch": "Ricerca Film",
"MovieSearchTypes": "Tipi di Ricerca Film",
"MusicSearchTypes": "Tipi di Ricerca Musica",
@@ -416,16 +416,16 @@
"Url": "Url",
"NoSearchResultsFound": "Nessun risultato di ricerca trovato, prova a eseguire una nuova ricerca qui sotto.",
"SettingsConsoleLogLevel": "Livello di Log della Console",
"IndexerObsoleteCheckMessage": "Gli indicizzatori sono obsoleti e sono stati aggiornati: {0}. Si prega di rimuoverli e/o di riaggiungerli a {appName}",
"IndexerQuery": "Query dell'Indicizzatore",
"IndexerSettingsSummary": "Configura varie impostazioni globali degli Indicizzatori, anche i Proxy.",
"IndexerObsoleteCheckMessage": "Indici obsoleti o aggiornati: {0}. Si prega di rimuoverli e/o di riaggiungerli a {appName}",
"IndexerQuery": "Query dell'Indice",
"IndexerSettingsSummary": "Configura varie impostazioni globali degli Indici, inclusi i Proxy.",
"Query": "Query",
"SearchCapabilities": "Capacità di Ricerca",
"SettingsIndexerLoggingHelpText": "Logga i dati aggiuntivi dell'indicizzatore includendo la risposta",
"SettingsIndexerLoggingHelpText": "Registra informazioni aggiuntive dell'indice includendo la risposta",
"SettingsSqlLoggingHelpText": "Scrivi a log tutte le query SQL di {appName}",
"SyncLevelAddRemove": "Solo aggiunte e rimozioni: Quando gli indicizzatori vengono aggiunti o rimossi da {appName}, verrà aggiornata questa applicazione remota.",
"SyncLevelFull": "Sincronizzazione completa: Mantiene gli indicizzatori dell'app completamente sincronizzati. Le modifiche apportate agli indicizzatori in {appName} sono sincronizzate in questa app. Qualsiasi cambiamento fatto agli indicizzatori da remoto all'interno di questa applicazione verrà sovrascritto da {appName} alla prossima sincronizzazione.",
"MinimumSeedersHelpText": "Seeder minimi richiesti dall'Applicazione per far sì che l'indicizzatore li prenda",
"SyncLevelAddRemove": "Solo aggiunte e rimozioni: quando gli indici vengono aggiunti o rimossi da {appName}, questa applicazione remota verrà aggiornata.",
"SyncLevelFull": "Sincronizzazione completa: mantiene gli indici di questa applicazione completamente sincronizzati. Le modifiche agli indici fatte in {appName} sono sincronizzate in questa applicazione. Qualsiasi cambiamento fatto agli indici da remoto all'interno di questa applicazione verrà sovrascritto da {appName} alla prossima sincronizzazione.",
"MinimumSeedersHelpText": "Seeder minimi richiesti dall'applicazione per far sì che l'indice li recupera",
"SyncProfile": "Profilo Sincronizzazione",
"SyncProfiles": "Profili di sincronizzazione",
"AddSyncProfile": "Aggiungi Profilo di Sincronizzazione",
@@ -464,11 +464,11 @@
"Publisher": "Editore",
"ApplyTagsHelpTextAdd": "Aggiungi: Aggiunge le etichette alla lista esistente di etichette",
"ApplyTagsHelpTextHowToApplyApplications": "Come applicare etichette agli autori selezionati",
"ApplyTagsHelpTextHowToApplyIndexers": "Come applicare etichette agli indicizzatori selezionati",
"CountIndexersSelected": "{count} indicizzatore(i) selezionato(i)",
"ApplyTagsHelpTextHowToApplyIndexers": "Come applicare etichette agli indici selezionati",
"CountIndexersSelected": "{count} indice/i selezionato/i",
"DeleteSelectedApplicationsMessageText": "Sei sicuro di voler eliminare {count} applicazione(i) selezionata(e)?",
"DeleteSelectedDownloadClientsMessageText": "Sei sicuro di voler eliminare i '{count}' client di download selezionato/i?",
"SelectIndexers": "Cerca Indicizzatori",
"SelectIndexers": "Seleziona indici",
"Track": "Traccia",
"Book": "Libro",
"Theme": "Tema",
@@ -482,7 +482,7 @@
"More": "Altro",
"Season": "Stagione",
"Year": "Anno",
"UpdateAvailableHealthCheckMessage": "Nuovo aggiornamento disponibile: {version}",
"UpdateAvailableHealthCheckMessage": "Aggiornamento disponibile: {version}",
"Author": "Autore",
"ApplyChanges": "Applica Cambiamenti",
"ApiKeyValidationHealthCheckMessage": "Aggiorna la tua chiave API in modo che abbia una lunghezza di almeno {length} caratteri. Puoi farlo dalle impostazioni o dal file di configurazione",
@@ -505,7 +505,7 @@
"AddCustomFilter": "Aggiungi Filtro Personalizzato",
"AddConnectionImplementation": "Aggiungi Connessione - {implementationName}",
"AddDownloadClientImplementation": "Aggiungi un Client di Download - {implementationName}",
"AddIndexerImplementation": "Aggiungi indicizzatore - {implementationName}",
"AddIndexerImplementation": "Aggiungi Indice - {implementationName}",
"AuthenticationRequiredUsernameHelpTextWarning": "Inserisci username",
"AuthenticationMethod": "Metodo di Autenticazione",
"AuthenticationMethodHelpTextWarning": "Selezione un metodo di autenticazione valido",
@@ -515,19 +515,19 @@
"DefaultNameCopiedProfile": "{name} - Copia",
"AppUpdatedVersion": "{appName} è stato aggiornato alla versione `{version}`, per vedere le modifiche devi ricaricare {appName}",
"AddApplicationImplementation": "Aggiungi Connessione - {implementationName}",
"AddIndexerProxyImplementation": "Aggiungi indicizzatore - {implementationName}",
"AddIndexerProxyImplementation": "Aggiungi Proxy per Indice - {implementationName}",
"EditApplicationImplementation": "Aggiungi Condizione - {implementationName}",
"CountApplicationsSelected": "{count} Collezione(i) Selezionate",
"EditConnectionImplementation": "Modifica Connessione - {implementationName}",
"EditDownloadClientImplementation": "Modifica Client di Download - {implementationName}",
"EditIndexerImplementation": "Modifica Indicizzatore - {implementationName}",
"EditIndexerProxyImplementation": "Aggiungi indicizzatore - {implementationName}",
"EditIndexerImplementation": "Modifica Indice - {implementationName}",
"EditIndexerProxyImplementation": "Modifica Proxy per Indice - {implementationName}",
"AdvancedSettingsShownClickToHide": "Impostazioni avanzate mostrate, clicca per nasconderle",
"AdvancedSettingsHiddenClickToShow": "Impostazioni avanzate nascoste, clicca per mostrarle",
"AddApplication": "Aggiungi Applicazione",
"AddCategory": "Aggiungi Categoria",
"ActiveApps": "App Attive",
"ActiveIndexers": "Indicizzatori Attivi",
"ActiveIndexers": "Indici Attivi",
"IndexerBeyondHDSettingsSearchTypes": "Tipi di Ricerca",
"Directory": "Cartella",
"CustomFilter": "Filtro Personalizzato",
@@ -549,7 +549,7 @@
"IndexerDisabled": "Indexer Disattivato",
"GoToApplication": "Vai all'applicazione",
"AreYouSureYouWantToDeleteIndexer": "Sei sicuro di voler eliminare '{name}' da {appName}?",
"IndexerStatus": "Stato Indicizzatore",
"IndexerStatus": "Stato Indice",
"XmlRpcPath": "Percorso XML RPC",
"EditCategory": "Modifica Categoria",
"IndexerSettingsAdditionalParameters": "Parametri Addizionali",
@@ -568,36 +568,36 @@
"CountDownloadClientsSelected": "{count} client di download selezionato/i",
"NotificationsTelegramSettingsIncludeAppName": "Includi {appName} nel Titolo",
"Menu": "Menu",
"NoIndexersFound": "Nessun indicizzatore trovato",
"NoIndexersFound": "Nessun indice trovato",
"PasswordConfirmation": "Conferma Password",
"NoHistoryFound": "Nessun storico trovato",
"DeleteSelectedIndexersMessageText": "Sei sicuro di voler eliminare {count} applicazione(i) selezionata(e)?",
"DeleteSelectedIndexersMessageText": "Confermi di voler eliminare i {count} indici selezionati?",
"UsenetBlackholeNzbFolder": "Cartella Nzb",
"VipExpiration": "Scadenza VIP",
"OverrideAndAddToDownloadClient": "Sovrascrivi e aggiungi alla coda di download",
"BasicSearch": "Ricerca basica",
"CountIndexersAvailable": "{count} indicizzatore/i disponibili",
"EditSelectedIndexers": "Modifica Indicizzatori Selezionati",
"CountIndexersAvailable": "{count} indice/i disponibile/i",
"EditSelectedIndexers": "Modifica Indici Selezionati",
"FoundCountReleases": "Trovate {itemCount} release",
"ManageApplications": "Gestisci Applicazioni",
"ManageDownloadClients": "Gestisci Clients di Download",
"HistoryDetails": "Dettagli Storico",
"NotificationsEmailSettingsUseEncryption": "Usa Crittografia",
"SearchAllIndexers": "Cerca tutti gli indicizzatori",
"SearchCountIndexers": "Cerca {count} indicizzatore/i",
"SearchAllIndexers": "Cerca in tutti gli indici",
"SearchCountIndexers": "Cerca in {count} indice/i",
"SearchQueries": "Cerca Richieste",
"SeedRatio": "Rapporto Seed",
"TorznabUrl": "Url Torznab",
"TorrentBlackholeTorrentFolder": "Cartella Torrent",
"UseSsl": "Usa SSL",
"days": "giorni",
"IndexerCategories": "Categorie degli Indicizzatori",
"IndexerCategories": "Categorie degli Indici",
"IndexerTorrentSyndikatSettingsApiKeyHelpText": "API Key Sito",
"LabelIsRequired": "Etichetta richiesta",
"NoIndexerHistory": "Nessun storico trovato per questo indicizzatore",
"NoIndexerHistory": "Nessun storico trovato per questo indice",
"RssFeed": "Feed RSS",
"AverageResponseTimesMs": "Tempo di Risposta Medio dell'Indicizzatore (ms)",
"DeleteSelectedIndexer": "Elimina Indicizzatore Selezionato",
"AverageResponseTimesMs": "Tempo di risposta medio dell'Indice (ms)",
"DeleteSelectedIndexer": "Elimina l'Indice Selezionato",
"DisabledUntil": "Disattiva fino",
"DownloadClientDelugeSettingsUrlBaseHelpText": "Aggiungi un prefisso all'url del json di deluge, vedi {url}",
"Implementation": "Implementazione",
@@ -605,7 +605,7 @@
"NewznabUrl": "Url Newznab",
"NoApplicationsFound": "Nessuna applicazione trovata",
"IndexerSettingsBaseUrl": "Url Base",
"IndexerId": "ID Indicizzatore",
"IndexerId": "ID Indice",
"NoDownloadClientsFound": "Nessun client di download trovato",
"BlackholeFolderHelpText": "Cartella nella quale {appName} salverà i file di tipo {extension}",
"DownloadClientNzbgetSettingsAddPausedHelpText": "Questa opzione richiede almeno la versione 16.0 di NzbGet",
@@ -619,12 +619,12 @@
"IndexerIPTorrentsSettingsCookieUserAgent": "Cookie User-Agent",
"IndexerSettingsApiPathHelpText": "Percorso API, solitamente {url}",
"IndexerSettingsBaseUrlHelpText": "Seleziona quale url base {appName} userà per le richieste al sito",
"NoIndexerCategories": "Nessuna categoria trovata per questo indicizzatore",
"NoIndexerCategories": "Nessuna categoria trovata per questo indice",
"SecretToken": "Secret Token",
"SeedRatioHelpText": "Il rapporto che un torrent dovrebbe raggiungere prima di essere fermato, vuoto è il predefinito dell'app",
"TotalQueries": "Totale Richieste",
"IndexerHistoryLoadError": "Errore caricando lo storico dell'indicizzatore",
"DeleteSelectedIndexers": "Elimina Indicizzatori Selezionati",
"IndexerHistoryLoadError": "Errore caricando lo storico dell'indice",
"DeleteSelectedIndexers": "Elimina Indici Selezionati",
"InvalidUILanguage": "L'interfaccia è impostata in una lingua non valida, correggi e salva le tue impostazioni",
"IndexerSettingsSeedRatio": "Rapporto Seed",
"IndexerSettingsRssKey": "Chiave RSS",
@@ -634,7 +634,7 @@
"IndexerNewznabSettingsAdditionalParametersHelpText": "Parametri Newznab addizionali",
"SelectDownloadClientModalTitle": "{modalTitle} - Seleziona Client di Download",
"DownloadClientSettingsDestinationHelpText": "Specifica manualmente la destinazione dei download, lascia vuoti per usare la predefinita",
"IndexerDownloadClientHealthCheckMessage": "Indicizzatori con client di download non validi: {indexerNames}.",
"IndexerDownloadClientHealthCheckMessage": "Indici con client di download non validi: {indexerNames}.",
"SeedTimeHelpText": "Il rapporto che un torrent dovrebbe raggiungere prima di essere fermato, vuoto è il predefinito dell'app",
"IndexerPassThePopcornSettingsApiKeyHelpText": "API Key Sito",
"IndexerNzbIndexSettingsApiKeyHelpText": "API Key Sito",
@@ -667,5 +667,17 @@
"AuthQueries": "Query di autenticazione",
"ApplicationSettingsSyncRejectBlocklistedTorrentHashesHelpText": "Se un torrent è bloccato tramite hash, potrebbe non essere correttamente rifiutato durante luso di RSS/Ricerca con alcuni indexer. Abilitando questa opzione, il torrent verrà rifiutato dopo essere stato acquisito, ma prima di essere inviato al client.",
"AppsMinimumSeedersHelpText": "Numero minimo di seeders richiesti dallapplicazione affinché lindexer possa acquisire il torrent; se vuoto, viene utilizzato il valore predefinito del profilo di sincronizzazione",
"IndexerSettingsAppsMinimumSeedersHelpText": "Numero minimo di seeders richiesti dallapplicazione affinché lindexer possa acquisire il torrent; se vuoto, viene utilizzato il valore predefinito del profilo di sincronizzazione"
"IndexerSettingsAppsMinimumSeedersHelpText": "Numero minimo di seeders richiesti dallapplicazione affinché lindexer possa acquisire il torrent; se vuoto, viene utilizzato il valore predefinito del profilo di sincronizzazione",
"TotalHostQueries": "Totale Richieste",
"AppsMinimumSeeders": "Seeder Minimi",
"PackSeedTimeHelpText": "Il rapporto che un torrent dovrebbe raggiungere prima di essere fermato, vuoto è il predefinito dell'app",
"IndexerTagsHelpTextWarning": "I tag devono essere usati con cautela, poiché possono avere effetti indesiderati. Un'app con un tag si sincronizzerà solo con gli indexer che hanno lo stesso tag.",
"IndexerBeyondHDSettingsRefundOnly": "Solo Lettura",
"IndexerBeyondHDSettingsRewindOnly": "Solo Lettura",
"IndexerSettingsAppsMinimumSeeders": "Seeder Minimi",
"IndexerSettingsPackSeedTimeIndexerHelpText": "Il rapporto che un torrent dovrebbe raggiungere prima di essere fermato, vuoto è il predefinito dell'app",
"IndexerSettingsSeedTimeHelpText": "Il rapporto che un torrent dovrebbe raggiungere prima di essere fermato, vuoto è il predefinito dell'app",
"LogSizeLimit": "Limite Dimensione",
"TheLogLevelDefault": "Il livello di log predefinito è 'Debug' e può essere modificato nelle [Impostazioni Generali](settings/general)",
"DownloadClientSettingsUrlBaseHelpText": "Aggiunge un prefisso all'url della {connectionName}, come {url}"
}

View File

@@ -375,5 +375,48 @@
"Mixed": "修繕",
"CurrentlyInstalled": "現在インストール中",
"Stats": "状態",
"Season": "理由"
"Season": "理由",
"UnableToLoadIndexerProxies": "インデクサーを読み込めません",
"AddConnection": "接続を追加",
"AuthenticationMethod": "認証",
"IndexerId": "インデクサー",
"DeleteClientCategory": "ダウンロードクライアントを削除する",
"DeleteSelectedIndexersMessageText": "選択したムービーファイルを削除してもよろしいですか?",
"Destination": "宛先パス",
"UnableToLoadDevelopmentSettings": "一般設定を読み込めません",
"EditSyncProfile": "遅延プロファイルの編集",
"MovieSearch": "マスムービー検索",
"TvSearch": "探す",
"UnableToLoadAppProfiles": "遅延プロファイルを読み込めません",
"IndexerProxy": "インデクサの優先順位",
"AddCustomFilter": "カスタムフィルターを追加",
"AddNewIndexer": "インデクサーを追加",
"DeleteIndexerProxy": "インデクサーを削除する",
"Notification": "認証",
"EditSelectedDownloadClients": "ダウンロードクライアントを削除する",
"IndexerStatus": "インデクサ設定",
"Proxies": "プロファイル",
"IndexerHDBitsSettingsOrigins": "元の",
"ManageDownloadClients": "クライアントのダウンロード",
"Donate": "日付",
"SelectIndexers": "インデクサーを削除する",
"DeleteSelectedIndexer": "インデクサーを削除する",
"SyncProfile": "遅延プロファイルの編集",
"SyncProfiles": "遅延プロファイルの編集",
"DeleteSelectedDownloadClientsMessageText": "選択したムービーファイルを削除してもよろしいですか?",
"DeleteSelectedIndexers": "インデクサーを削除する",
"MovieSearchTypes": "マスムービー検索",
"SearchIndexers": "インデクサーを削除する",
"AddSyncProfile": "遅延プロファイルの編集",
"Connect": "認証",
"Notifications": "認証",
"DeleteSelectedApplicationsMessageText": "選択したムービーファイルを削除してもよろしいですか?",
"EditSelectedIndexers": "インデクサーを削除する",
"AddIndexerProxy": "インデクサの優先順位",
"IndexerProxies": "インデクサの優先順位",
"IndexerInfo": "インデクサー",
"DeleteSelectedApplications": "選択したムービーファイルを削除する",
"DownloadClientCategory": "ダウンロードクライアントを削除する",
"FilterPlaceHolder": "インデクサーを削除する",
"IndexerNoDefinitionCheckHealthCheckMessage": "インデクサーの定義が設定されておらず、機能していません: {indexerNames}。 {appName} から削除、もしくは再追加してください。"
}

View File

@@ -506,5 +506,50 @@
"DownloadClientSettingsAddPaused": "일시 중지 추가",
"SecretToken": "비밀 토큰",
"NoDownloadClientsFound": "다운로드 클라이언트를 찾을 수 없음",
"PrioritySettings": "우선 순위: {0}"
"PrioritySettings": "우선 순위: {0}",
"IndexerId": "인덱서",
"IndexerBeyondHDSettingsRefundOnly": "읽기 전용",
"SeedTimeHelpText": "토런트가 중지되기 전에 시드되어야 하는 시간, 비어 있으면 다운로드 클라이언트의 기본값을 사용합니다.",
"DownloadClientSettingsDefaultCategoryHelpText": "{appName}에 대한 특정 카테고리를 추가하면 관련 없는 {appName}가 아니 다운로드와의 충돌을 피할 수 있습니다. 카테고리 사용은 선택 사항이지만 강력히 권장됩니다.",
"DownloadClientSettingsDefaultCategorySubFolderHelpText": "{appName}에 대한 특정 카테고리를 추가하면 관련 없는 비{appName} 다운로드와의 충돌을 피할 수 있습니다. 카테고리 사용은 선택 사항이지만 강력히 권장됩니다. 출력 디렉토리에 [카테고리] 하위 디렉토리를 만듭니다.",
"EditCategory": "카테고리 추가",
"EditSelectedIndexers": "선택된 영화 수정하기",
"IndexerBeyondHDSettingsRewindOnly": "읽기 전용",
"IndexerDownloadClientHelpText": "이 인덱서에서 가져온 것을 가져오는 데 사용되는 다운로드 클라이언트를 지정합니다.",
"IndexerHDBitsSettingsOrigins": "원본",
"IndexerProxy": "인덱서 프록시 추가",
"SelectIndexers": "인덱서 플래그 선택",
"UnableToLoadDevelopmentSettings": "일반 설정을 불러올 수 없",
"LogSizeLimit": "크기 제한",
"DownloadClientAriaSettingsDirectoryHelpText": "다운로드를 넣을 위치 (선택 사항), 기본 rTorrent 위치를 사용하려면 비워두세요",
"CountApplicationsSelected": "{count}개의 컬렉션을 선택함",
"ManageDownloadClients": "클라이언트 다운로드",
"UnableToLoadIndexerProxies": "인덱서를 로드할 수 없음",
"UnableToLoadAppProfiles": "지연 프로필을 불러올 수 없",
"DeleteIndexerProxy": "인덱서 삭제",
"Auth": "저작자",
"Notification": "인증",
"Proxies": "프로필",
"SyncProfiles": "동기화 프로필 추가",
"SyncProfile": "동기화 프로필 추가",
"IndexerStatus": "인덱스 설정",
"EditSelectedDownloadClients": "다운로드 클라이언트 삭제",
"TvSearch": "검색",
"DeleteClientCategory": "다운로드 클라이언트 삭제",
"IndexerNewznabSettingsAdditionalParametersHelpText": "매개 변수 추가",
"ThemeHelpText": "애플리케이션 UI 테마 변경, '자동' 테마는 OS 테마를 사용하여 라이트 또는 다크 모드를 설정합니다. Theme.Park에서 영감을 받음",
"ProxyValidationUnableToConnect": "인덱서에 연결할 수 없음: {exceptionMessage}. 상세 내용은 이 오류를 둘러싼 로그를 확인하세요",
"Connect": "인증",
"SearchIndexers": "인덱서 플래그 선택",
"IndexerProxies": "인덱서 프록시 추가",
"Notifications": "인증",
"IndexerInfo": "인덱서",
"DownloadClientCategory": "다운로드 클라이언트 삭제",
"DeleteSelectedApplications": "선택된 것을 삭제",
"DeleteSelectedIndexer": "선택된 영화 수정하기",
"DeleteSelectedIndexers": "선택된 영화 수정하기",
"PackSeedTimeHelpText": "토런트가 중지되기 전에 시드되어야 하는 시간, 비어 있으면 다운로드 클라이언트의 기본값을 사용합니다.",
"SeedRatioHelpText": "토런트가 중지되기 전에 시드되어야 하는 시간, 비어 있으면 다운로드 클라이언트의 기본값을 사용합니다.",
"IndexerSettingsPackSeedTimeIndexerHelpText": "토런트가 중지되기 전에 시드되어야 하는 시간, 비어 있으면 다운로드 클라이언트의 기본값을 사용합니다.",
"FilterPlaceHolder": "인덱서 플래그 선택"
}

View File

@@ -16,5 +16,21 @@
"AddIndexerImplementation": "Pievienot Nosacījumu - {implementationName}",
"AddIndexerProxyImplementation": "Pievienot Nosacījumu - {implementationName}",
"AddApplicationImplementation": "Pievienot Savienojumu - {implementationName}",
"EditIndexerProxyImplementation": "Pievienot Nosacījumu - {implementationName}"
"EditIndexerProxyImplementation": "Pievienot Nosacījumu - {implementationName}",
"Connections": "Pievienot Savienojumu",
"DownloadClient": "Pievienot Lejupielādes Klientu",
"DownloadClients": "Pievienot Lejupielādes Klientu",
"EditSyncProfile": "Pievienot Aizkaves Profilu",
"AddDownloadClientImplementation": "Pievienot Nosacījumu - {implementationName}",
"EditDownloadClientImplementation": "Pievienot Nosacījumu - {implementationName}",
"AddSyncProfile": "Pievienot Aizkaves Profilu",
"ConnectionLost": "Pievienot Savienojumu",
"DeleteDownloadClient": "Pievienot Lejupielādes Klientu",
"DownloadClientSettings": "Pievienot Lejupielādes Klientu",
"SyncProfile": "Pievienot Aizkaves Profilu",
"SyncProfiles": "Pievienot Aizkaves Profilu",
"DeleteClientCategory": "Pievienot Lejupielādes Klientu",
"DeleteSelectedDownloadClients": "Pievienot Lejupielādes Klientu",
"EditSelectedDownloadClients": "Pievienot Lejupielādes Klientu",
"ManageDownloadClients": "Pievienot Lejupielādes Klientu"
}

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