diff --git a/README.md b/README.md index ecfc16f..2b75d19 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ ```mermaid graph LR - 1[Jellyseerr] == 手动请求电视剧/综艺/动漫 ==> 2[Sonarr] == 自动搜索/下载 ==> 3[JProxy] == 自动搜索 ==> 4[Jackett] + 1[Jellyseerr] == 手动请求电视剧/综艺/动漫 ==> 2[Sonarr] == 自动搜索/下载 ==> 3[JProxy] == 自动搜索 ==> 4[Prowlarr] 1[Jellyseerr] == 手动请求电影 ==> 6[Radarr] == 自动搜索/下载 ==> 3[JProxy] 3[JProxy] == 自动下载 ==> 5[qBittorrentee] 2[Sonarr] == 自动导入 ==> 7[Emby] @@ -48,9 +48,9 @@ graph LR | [Jellyseerr](https://github.com/Fallenbagel/jellyseerr) | 聚合搜索 | ⭕ | 搜索并推送到 Sonarr / Radarr | | [Radarr](https://github.com/Radarr/Radarr) | 电影订阅系统 | ⭕ | 定时搜索,下载,重命名并导入 | | [Sonarr](https://github.com/Sonarr/Sonarr) | 电视剧和动漫订阅系统 | ❌ | 定时搜索,下载,重命名并导入 | -| [Jackett](https://github.com/Jackett/Jackett) | 种子站代理 | ❌ | 可添加种子站,提供种子搜索,支持结果缓存 | -| [FlareSolverr](https://github.com/FlareSolverr/FlareSolverr) | 绕过 Cloudflare 和 DDoS-GUARD | - | Jackett 已配置,无其他操作 | -| [JProxy](https://github.com/LuckyPuppy514/jproxy) | 种子站代理过滤 | ⭕ | 介于 Sonarr / Radarr 和 Jackett / Prowlarr 之间的代理,主要用于优化查询和提升识别率 | +| [Prowlarr](https://github.com/Prowlarr/Prowlarr) | 种子站代理 | ❌ | 可添加种子站,提供种子搜索,支持结果缓存 | +| [FlareSolverr](https://github.com/FlareSolverr/FlareSolverr) | 绕过 Cloudflare 和 DDoS-GUARD | - | Prowlarr 已配置,无其他操作 | +| [JProxy](https://github.com/LuckyPuppy514/jproxy) | 种子站代理过滤 | ⭕ | 介于 Sonarr / Radarr 和 Prowlarr / Prowlarr 之间的代理,主要用于优化查询和提升识别率 | | [qBittorrent](https://github.com/qbittorrent/qBittorrent) | 下载客户端 | ⭕ | qBittorrent | | [ChineseSubFinder](https://github.com/ChineseSubFinder/ChineseSubFinder) | 字幕下载 | ⭕ | 自动下载电影和电视剧字幕 | @@ -72,8 +72,8 @@ Radarr Sonarr ![Sonarr_tuya](https://cdn.jsdelivr.net/gh/LuckyPuppy514/pic-bed/common/Sonarr_tuya.jpg) -Jackett -![Jackett_tuya](https://cdn.jsdelivr.net/gh/LuckyPuppy514/pic-bed/common/Jackett_tuya.jpg) +Prowlarr +![Prowlarr_tuya](https://cdn.jsdelivr.net/gh/LuckyPuppy514/pic-bed/common/Prowlarr_tuya.jpg) JProxy ![20230414184607](https://github.com/LuckyPuppy514/image/raw/main/2023/2023-04-14/20230414184607.webp) @@ -250,11 +250,11 @@ graph LR | Heimdall | `https://ip:60211` | - | - | | Portainer | `http://ip:60212` | atm | atm@20230101 | | FlareSolverr | `http://ip:60213` | - | - | -| Jackett | `http://ip:60214` | - | - | +| Prowlarr | `http://ip:60223` | atm | atm@20230101 | | JProxy | `http://ip:60215` | atm | atm@20230101 | | Jellyseerr | `http://ip:60216` | atm | atm@20230101 | -| Radarr | `http://ip:60217` | - | - | -| Sonarr | `http://ip:60218` | - | - | +| Radarr | `http://ip:60217` | atm | atm@20230101 | +| Sonarr | `http://ip:60218` | atm | atm@20230101 | | qBittorrent | `http://ip:60219` | atm | atm@20230101 | | ChineseSubFinder | `http://ip:60221` | atm | atm@20230101 | | Emby | `http://ip:60220` | atm | atm@20230101 | diff --git a/config/chinesesubfinder/ChineseSubFinder-Cache.db b/config/chinesesubfinder/ChineseSubFinder-Cache.db index 4087da8..4cd88b0 100644 Binary files a/config/chinesesubfinder/ChineseSubFinder-Cache.db and b/config/chinesesubfinder/ChineseSubFinder-Cache.db differ diff --git a/config/chinesesubfinder/ChineseSubFinderSettings.json b/config/chinesesubfinder/ChineseSubFinderSettings.json index d6e9cc4..664293e 100644 --- a/config/chinesesubfinder/ChineseSubFinderSettings.json +++ b/config/chinesesubfinder/ChineseSubFinderSettings.json @@ -1 +1 @@ -{"SpeedDevMode":false,"user_info":{"username":"atm","password":"atm@20230101"},"common_settings":{"interval_or_assign_or_custom":0,"scan_interval":"@every 6h","threads":1,"run_scan_at_start_up":false,"movie_paths":["/media/video/movie"],"series_paths":["/media/video/serial"],"local_static_file_port":"19037"},"subtitle_sources":{"assrt_settings":{"enabled":false,"token":""},"subtitle_best_settings":{"enabled":false,"api_key":""}},"advanced_settings":{"proxy_settings":{"use_proxy":false,"use_which_proxy_protocol":"http","local_http_proxy_server_port":"19036","input_proxy_address":"127.0.0.1","input_proxy_port":"10809","need_pwd":false,"input_proxy_username":"","input_proxy_password":""},"tmdb_api_settings":{"enable":false,"api_key":""},"debug_mode":false,"save_full_season_tmp_subtitles":false,"sub_type_priority":0,"sub_name_formatter":0,"save_multi_sub":false,"custom_video_exts":[],"fix_time_line":false,"topic":1,"suppliers_settings":{"xunlei":{"name":"xunlei","root_url":"http://sub.xmp.sandai.net:8000/subxl/%s.json","search_url":"","daily_download_limit":-1},"shooter":{"name":"shooter","root_url":"https://www.shooter.cn/api/subapi.php","search_url":"","daily_download_limit":-1},"assrt":{"name":"assrt","root_url":"https://api.assrt.net/v1","search_url":"","daily_download_limit":-1},"a4k":{"name":"a4k","root_url":"https://www.a4k.net","search_url":"/search?term=","daily_download_limit":-1},"subhd":{"name":"subhd","root_url":"https://subhd.tv","search_url":"/search/%s","daily_download_limit":20},"zimuku":{"name":"zimuku","root_url":"https://zimuku.org","search_url":"/search?q=%s","daily_download_limit":20},"subtitle_best":{"name":"subtitle_best","root_url":"https://api.subtitle.best/share-sub/v1","search_url":"/search-movie","daily_download_limit":-1}},"scan_logic":{"skip_chinese_movie":true,"skip_chinese_series":true},"task_queue":{"max_retry_times":3,"one_job_time_out":300,"interval":10,"expiration_time":90,"download_sub_during_x_days":7,"one_sub_download_interval":12,"check_pulic_ip_target_site":""},"download_file_cache":{"ttl":4320,"unit":"hour"}},"emby_settings":{"enable":true,"address_url":"http://172.128.2.20:8096","api_key":"1ae1f02413e5452085150e66b03cfb4f","max_request_video_number":3000,"skip_watched":true,"movie_paths_mapping":{"/media/video/movie":""},"series_paths_mapping":{"/media/video/serial":""},"auto_or_manual":true,"threads":4},"developer_settings":{"enable":false,"bark_server_address":""},"timeline_fixer_settings":{"max_offset_time":700,"min_offset":0.2},"experimental_function":{"auto_change_sub_encode":{"enable":false,"des_encode_type":0},"chs_cht_changer":{"enable":false,"des_chinese_language_type":0},"remote_chrome_settings":{"enable":false,"remote_docker_url":"","remote_adblock_path":"","remote_user_data_dir":""},"api_key_settings":{"enabled":false,"key":""},"local_chrome_settings":{"enabled":false,"local_chrome_exe_f_path":""},"share_sub_settings":{"share_sub_enabled":false},"extend_log":{"SysLog":{"enable":false,"network":"","address":"","priority":0,"tag":""}}}} \ No newline at end of file +{"SpeedDevMode":false,"user_info":{"username":"atm","password":"atm@20230101"},"common_settings":{"interval_or_assign_or_custom":0,"scan_interval":"@every 6h","threads":1,"run_scan_at_start_up":false,"movie_paths":["/media/video/movie"],"series_paths":["/media/video/serial"],"local_static_file_port":"19037"},"subtitle_sources":{"assrt_settings":{"enabled":false,"token":""},"subtitle_best_settings":{"enabled":false,"api_key":""}},"advanced_settings":{"proxy_settings":{"use_proxy":false,"use_which_proxy_protocol":"http","local_http_proxy_server_port":"19036","input_proxy_address":"127.0.0.1","input_proxy_port":"10809","need_pwd":false,"input_proxy_username":"","input_proxy_password":""},"tmdb_api_settings":{"enable":false,"api_key":"","use_alternate_base_url":false},"debug_mode":false,"save_full_season_tmp_subtitles":false,"sub_type_priority":0,"sub_name_formatter":0,"save_multi_sub":false,"custom_video_exts":[],"fix_time_line":false,"topic":1,"suppliers_settings":{"xunlei":{"name":"xunlei","root_url":"http://sub.xmp.sandai.net:8000/subxl/%s.json","search_url":"","daily_download_limit":-1},"shooter":{"name":"shooter","root_url":"https://www.shooter.cn/api/subapi.php","search_url":"","daily_download_limit":-1},"assrt":{"name":"assrt","root_url":"https://api.assrt.net/v1","search_url":"","daily_download_limit":-1},"a4k":{"name":"a4k","root_url":"https://www.a4k.net","search_url":"/search?keyword=","daily_download_limit":-1},"subhd":{"name":"subhd","root_url":"https://subhd.tv","search_url":"/search/%s","daily_download_limit":20},"zimuku":{"name":"zimuku","root_url":"https://zimuku.org","search_url":"/search?q=%s","daily_download_limit":20},"subtitle_best":{"name":"subtitle_best","root_url":"https://api.subtitle.best/share-sub/v1","search_url":"/search-movie","daily_download_limit":-1}},"scan_logic":{"skip_chinese_movie":true,"skip_chinese_series":true},"task_queue":{"max_retry_times":3,"one_job_time_out":300,"interval":10,"expiration_time":90,"download_sub_during_x_days":7,"one_sub_download_interval":12,"check_pulic_ip_target_site":""},"download_file_cache":{"ttl":4320,"unit":"hour"}},"emby_settings":{"enable":true,"address_url":"http://172.128.2.20:8096","api_key":"1ae1f02413e5452085150e66b03cfb4f","max_request_video_number":3000,"skip_watched":true,"movie_paths_mapping":{"/media/video/movie":""},"series_paths_mapping":{"/media/video/serial":""},"auto_or_manual":true,"threads":4},"developer_settings":{"enable":false,"bark_server_address":""},"timeline_fixer_settings":{"max_offset_time":700,"min_offset":0.2,"thread_count":5},"experimental_function":{"auto_change_sub_encode":{"enable":false,"des_encode_type":0},"chs_cht_changer":{"enable":false,"des_chinese_language_type":0},"remote_chrome_settings":{"enable":false,"remote_docker_url":"","remote_adblock_path":"","remote_user_data_dir":""},"api_key_settings":{"enabled":false,"key":""},"local_chrome_settings":{"enabled":false,"local_chrome_exe_f_path":""},"share_sub_settings":{"share_sub_enabled":false},"extend_log":{"SysLog":{"enable":false,"network":"","address":"","priority":0,"tag":""}}}} \ No newline at end of file diff --git a/config/emby/config/system.xml b/config/emby/config/system.xml index 9283c29..aeb24f8 100644 --- a/config/emby/config/system.xml +++ b/config/emby/config/system.xml @@ -31,12 +31,10 @@ true Compatible true - true ATM + InterNetwork zh-CN - false 0 - true true @@ -49,17 +47,19 @@ true false - false + true 0 128 false - true - true - true - true - true + true + true true true 400 false + true + true + true + false + RemoteAddressesOnly \ No newline at end of file diff --git a/config/emby/data/ScheduledTasks/1c8ede62-c521-bea0-bf85-1344f5b8ca40.js b/config/emby/data/ScheduledTasks/1c8ede62-c521-bea0-bf85-1344f5b8ca40.js index 6f0ad6a..df319ab 100644 --- a/config/emby/data/ScheduledTasks/1c8ede62-c521-bea0-bf85-1344f5b8ca40.js +++ b/config/emby/data/ScheduledTasks/1c8ede62-c521-bea0-bf85-1344f5b8ca40.js @@ -1 +1 @@ -{"StartTimeUtc":"2023-04-14T10:24:43.1766129Z","EndTimeUtc":"2023-04-14T10:24:43.1791437Z","Status":"Completed","Name":"Log file cleanup","Key":"CleanLogFiles","Id":"1c8ede62c521bea0bf851344f5b8ca40"} \ No newline at end of file +{"StartTimeUtc":"2024-01-14T06:40:02.7028232Z","EndTimeUtc":"2024-01-14T06:40:02.7043999Z","Status":"Completed","Name":"Log file cleanup","Key":"CleanLogFiles","Id":"1c8ede62c521bea0bf851344f5b8ca40"} \ No newline at end of file diff --git a/config/emby/data/ScheduledTasks/1cc2f60a-05be-fec8-b153-2ac44630a00f.js b/config/emby/data/ScheduledTasks/1cc2f60a-05be-fec8-b153-2ac44630a00f.js index 5f9c36a..ec28870 100644 --- a/config/emby/data/ScheduledTasks/1cc2f60a-05be-fec8-b153-2ac44630a00f.js +++ b/config/emby/data/ScheduledTasks/1cc2f60a-05be-fec8-b153-2ac44630a00f.js @@ -1 +1 @@ -{"StartTimeUtc":"2023-04-14T10:24:43.1774351Z","EndTimeUtc":"2023-04-14T10:24:43.3594652Z","Status":"Completed","Name":"Check for application updates","Key":"SystemUpdateTask","Id":"1cc2f60a05befec8b1532ac44630a00f"} \ No newline at end of file +{"StartTimeUtc":"2024-01-14T08:40:02.6992843Z","EndTimeUtc":"2024-01-14T08:40:03.3733225Z","Status":"Completed","Name":"Check for application updates","Key":"SystemUpdateTask","Id":"1cc2f60a05befec8b1532ac44630a00f"} \ No newline at end of file diff --git a/config/emby/data/ScheduledTasks/241d4fcb-19a1-d557-ee62-428e411da609.js b/config/emby/data/ScheduledTasks/241d4fcb-19a1-d557-ee62-428e411da609.js index 39b4f3d..7a5def1 100644 --- a/config/emby/data/ScheduledTasks/241d4fcb-19a1-d557-ee62-428e411da609.js +++ b/config/emby/data/ScheduledTasks/241d4fcb-19a1-d557-ee62-428e411da609.js @@ -1 +1 @@ -{"StartTimeUtc":"2023-04-14T10:24:43.1364572Z","EndTimeUtc":"2023-04-14T10:24:43.1433335Z","Status":"Completed","Name":"Cache file cleanup","Key":"DeleteCacheFiles","Id":"241d4fcb19a1d557ee62428e411da609"} \ No newline at end of file +{"StartTimeUtc":"2024-01-14T06:40:02.7003079Z","EndTimeUtc":"2024-01-14T06:40:02.7025501Z","Status":"Completed","Name":"Cache file cleanup","Key":"DeleteCacheFiles","Id":"241d4fcb19a1d557ee62428e411da609"} \ No newline at end of file diff --git a/config/emby/data/ScheduledTasks/4ccba258-b890-b2b7-3ee3-e1d0ceec11e9.js b/config/emby/data/ScheduledTasks/4ccba258-b890-b2b7-3ee3-e1d0ceec11e9.js index 5b10e12..992bfeb 100644 --- a/config/emby/data/ScheduledTasks/4ccba258-b890-b2b7-3ee3-e1d0ceec11e9.js +++ b/config/emby/data/ScheduledTasks/4ccba258-b890-b2b7-3ee3-e1d0ceec11e9.js @@ -1 +1 @@ -{"StartTimeUtc":"2023-04-14T10:23:47.3045499Z","EndTimeUtc":"2023-04-14T10:23:49.0607527Z","Status":"Completed","Name":"Hardware Detection","Key":"HardwareDetection","Id":"4ccba258b890b2b73ee3e1d0ceec11e9"} \ No newline at end of file +{"StartTimeUtc":"2024-01-14T06:39:05.8664610Z","EndTimeUtc":"2024-01-14T06:39:07.3666427Z","Status":"Completed","Name":"Hardware Detection","Key":"HardwareDetection","Id":"4ccba258b890b2b73ee3e1d0ceec11e9"} \ No newline at end of file diff --git a/config/emby/data/ScheduledTasks/7a7448c2-61fa-47f3-46b4-c061a5d5c163.js b/config/emby/data/ScheduledTasks/7a7448c2-61fa-47f3-46b4-c061a5d5c163.js index 632f351..a3d7525 100644 --- a/config/emby/data/ScheduledTasks/7a7448c2-61fa-47f3-46b4-c061a5d5c163.js +++ b/config/emby/data/ScheduledTasks/7a7448c2-61fa-47f3-46b4-c061a5d5c163.js @@ -1 +1 @@ -{"StartTimeUtc":"2023-04-14T10:24:43.1778609Z","EndTimeUtc":"2023-04-14T10:24:43.3420209Z","Status":"Completed","Name":"Refresh Users","Key":"RefreshUsers","Id":"7a7448c261fa47f346b4c061a5d5c163"} \ No newline at end of file +{"StartTimeUtc":"2024-01-14T06:40:02.7082565Z","EndTimeUtc":"2024-01-14T06:40:02.7198066Z","Status":"Completed","Name":"Refresh Users","Key":"RefreshUsers","Id":"7a7448c261fa47f346b4c061a5d5c163"} \ No newline at end of file diff --git a/config/emby/data/ScheduledTasks/82280a18-c237-acd2-4570-a386d598c3ba.js b/config/emby/data/ScheduledTasks/82280a18-c237-acd2-4570-a386d598c3ba.js new file mode 100644 index 0000000..6b995b5 --- /dev/null +++ b/config/emby/data/ScheduledTasks/82280a18-c237-acd2-4570-a386d598c3ba.js @@ -0,0 +1 @@ +{"StartTimeUtc":"2024-01-14T07:39:02.7050990Z","EndTimeUtc":"2024-01-14T07:39:02.7055846Z","Status":"Completed","Name":"Vacuum Database","Key":"VacuumDatabase","Id":"82280a18c237acd24570a386d598c3ba"} \ No newline at end of file diff --git a/config/emby/data/ScheduledTasks/9120755a-f992-e23c-502f-998cc55e54ac.js b/config/emby/data/ScheduledTasks/9120755a-f992-e23c-502f-998cc55e54ac.js index 6663636..68bfa2c 100644 --- a/config/emby/data/ScheduledTasks/9120755a-f992-e23c-502f-998cc55e54ac.js +++ b/config/emby/data/ScheduledTasks/9120755a-f992-e23c-502f-998cc55e54ac.js @@ -1 +1 @@ -{"StartTimeUtc":"2023-01-15T15:32:20.6507575Z","EndTimeUtc":"2023-01-15T15:32:20.6519642Z","Status":"Completed","Name":"Refresh Emby Connect Data","Key":"RefreshAuthorizationsScheduledTask","Id":"9120755af992e23c502f998cc55e54ac"} \ No newline at end of file +{"StartTimeUtc":"2024-01-14T06:40:02.7380692Z","EndTimeUtc":"2024-01-14T06:40:02.7393384Z","Status":"Completed","Name":"Refresh Emby Connect Data","Key":"RefreshAuthorizationsScheduledTask","Id":"9120755af992e23c502f998cc55e54ac"} \ No newline at end of file diff --git a/config/emby/data/ScheduledTasks/9492d30c-70f7-f1be-c375-7c9d0a4feb45.js b/config/emby/data/ScheduledTasks/9492d30c-70f7-f1be-c375-7c9d0a4feb45.js index bdd0f81..ee4eff3 100644 --- a/config/emby/data/ScheduledTasks/9492d30c-70f7-f1be-c375-7c9d0a4feb45.js +++ b/config/emby/data/ScheduledTasks/9492d30c-70f7-f1be-c375-7c9d0a4feb45.js @@ -1 +1 @@ -{"StartTimeUtc":"2023-04-14T10:24:43.2609360Z","EndTimeUtc":"2023-04-14T10:24:43.3649462Z","Status":"Completed","Name":"Refresh Guide","Key":"RefreshGuide","Id":"9492d30c70f7f1bec3757c9d0a4feb45"} \ No newline at end of file +{"StartTimeUtc":"2024-01-14T06:40:02.7232438Z","EndTimeUtc":"2024-01-14T06:40:02.7377373Z","Status":"Completed","Name":"Refresh Guide","Key":"RefreshGuide","Id":"9492d30c70f7f1bec3757c9d0a4feb45"} \ No newline at end of file diff --git a/config/emby/data/ScheduledTasks/a27c5425-9520-b2e5-c509-def68c8f4c45.js b/config/emby/data/ScheduledTasks/a27c5425-9520-b2e5-c509-def68c8f4c45.js new file mode 100644 index 0000000..eada600 --- /dev/null +++ b/config/emby/data/ScheduledTasks/a27c5425-9520-b2e5-c509-def68c8f4c45.js @@ -0,0 +1 @@ +{"StartTimeUtc":"2024-01-14T07:39:02.7050980Z","EndTimeUtc":"2024-01-14T07:39:02.7053049Z","Status":"Completed","Name":"Refresh Internet Channels","Key":"RefreshInternetChannels","Id":"a27c54259520b2e5c509def68c8f4c45"} \ No newline at end of file diff --git a/config/emby/data/ScheduledTasks/c27fda37-dfb6-e39b-e141-191aaa1c3060.js b/config/emby/data/ScheduledTasks/c27fda37-dfb6-e39b-e141-191aaa1c3060.js index 2be3c43..d7cb341 100644 --- a/config/emby/data/ScheduledTasks/c27fda37-dfb6-e39b-e141-191aaa1c3060.js +++ b/config/emby/data/ScheduledTasks/c27fda37-dfb6-e39b-e141-191aaa1c3060.js @@ -1 +1 @@ -{"StartTimeUtc":"2023-04-14T10:24:43.1257342Z","EndTimeUtc":"2023-04-14T10:24:44.9793997Z","Status":"Completed","Name":"Check for plugin updates","Key":"PluginUpdates","Id":"c27fda37dfb6e39be141191aaa1c3060"} \ No newline at end of file +{"StartTimeUtc":"2024-01-14T06:40:02.6962433Z","EndTimeUtc":"2024-01-14T06:40:07.5918459Z","Status":"Completed","Name":"Check for plugin updates","Key":"PluginUpdates","Id":"c27fda37dfb6e39be141191aaa1c3060"} \ No newline at end of file diff --git a/config/emby/data/ScheduledTasks/d0036b2c-a251-638a-42fb-751cc0701b6c.js b/config/emby/data/ScheduledTasks/d0036b2c-a251-638a-42fb-751cc0701b6c.js index f903aa6..a7ae4b9 100644 --- a/config/emby/data/ScheduledTasks/d0036b2c-a251-638a-42fb-751cc0701b6c.js +++ b/config/emby/data/ScheduledTasks/d0036b2c-a251-638a-42fb-751cc0701b6c.js @@ -1 +1 @@ -{"StartTimeUtc":"2023-04-14T10:24:43.2197768Z","EndTimeUtc":"2023-04-14T10:24:43.2372298Z","Status":"Completed","Name":"Refresh Internet Channels","Key":"RefreshInternetChannels","Id":"d0036b2ca251638a42fb751cc0701b6c"} \ No newline at end of file +{"StartTimeUtc":"2024-01-08T13:43:27.0623058Z","EndTimeUtc":"2024-01-08T13:43:27.0676887Z","Status":"Completed","Name":"Refresh Internet Channels","Key":"RefreshInternetChannels","Id":"d0036b2ca251638a42fb751cc0701b6c"} \ No newline at end of file diff --git a/config/emby/data/ScheduledTasks/d875342e-9b1b-1996-91b8-9f7a79c0f960.js b/config/emby/data/ScheduledTasks/d875342e-9b1b-1996-91b8-9f7a79c0f960.js index d3fc090..5708738 100644 --- a/config/emby/data/ScheduledTasks/d875342e-9b1b-1996-91b8-9f7a79c0f960.js +++ b/config/emby/data/ScheduledTasks/d875342e-9b1b-1996-91b8-9f7a79c0f960.js @@ -1 +1 @@ -{"StartTimeUtc":"2023-04-14T10:23:46.1976376Z","EndTimeUtc":"2023-04-14T10:23:46.6418450Z","Status":"Completed","Name":"Download OCR Data","Key":"DownloadOcr","Id":"d875342e9b1b199691b89f7a79c0f960"} \ No newline at end of file +{"StartTimeUtc":"2024-01-14T06:39:05.7473835Z","EndTimeUtc":"2024-01-14T06:39:05.8377430Z","Status":"Completed","Name":"Download OCR Data","Key":"DownloadOcr","Id":"d875342e9b1b199691b89f7a79c0f960"} \ No newline at end of file diff --git a/config/emby/data/activitylog.db-shm b/config/emby/data/activitylog.db-shm index b14204b..658790e 100644 Binary files a/config/emby/data/activitylog.db-shm and b/config/emby/data/activitylog.db-shm differ diff --git a/config/emby/data/activitylog.db-wal b/config/emby/data/activitylog.db-wal index 98c2a44..fcdc1d1 100644 Binary files a/config/emby/data/activitylog.db-wal and b/config/emby/data/activitylog.db-wal differ diff --git a/config/emby/data/authentication.db-shm b/config/emby/data/authentication.db-shm index 4eaebb6..c49acc1 100644 Binary files a/config/emby/data/authentication.db-shm and b/config/emby/data/authentication.db-shm differ diff --git a/config/emby/data/authentication.db-wal b/config/emby/data/authentication.db-wal index 24ef80a..f543654 100644 Binary files a/config/emby/data/authentication.db-wal and b/config/emby/data/authentication.db-wal differ diff --git a/config/emby/data/lastversion.txt b/config/emby/data/lastversion.txt index 98317ff..96a4a69 100644 --- a/config/emby/data/lastversion.txt +++ b/config/emby/data/lastversion.txt @@ -1 +1 @@ -4.7.11.0 \ No newline at end of file +4.8.0.69 \ No newline at end of file diff --git a/config/emby/data/library.db b/config/emby/data/library.db index 2aeb69c..5052f47 100644 Binary files a/config/emby/data/library.db and b/config/emby/data/library.db differ diff --git a/config/emby/data/library.db-shm b/config/emby/data/library.db-shm index ca19321..3d77392 100644 Binary files a/config/emby/data/library.db-shm and b/config/emby/data/library.db-shm differ diff --git a/config/emby/data/library.db-wal b/config/emby/data/library.db-wal index f4ed2a0..bf80f83 100644 Binary files a/config/emby/data/library.db-wal and b/config/emby/data/library.db-wal differ diff --git a/config/emby/data/users.db-shm b/config/emby/data/users.db-shm index 0e76c3f..1785076 100644 Binary files a/config/emby/data/users.db-shm and b/config/emby/data/users.db-shm differ diff --git a/config/emby/data/users.db-wal b/config/emby/data/users.db-wal index 93db496..51a14c9 100644 Binary files a/config/emby/data/users.db-wal and b/config/emby/data/users.db-wal differ diff --git a/config/emby/data/wan.dat b/config/emby/data/wan.dat index 1b1c934..6d5bd81 100644 --- a/config/emby/data/wan.dat +++ b/config/emby/data/wan.dat @@ -1 +1 @@ -MTAzLjE0OS4yNDkuMjI4 \ No newline at end of file +MTAzLjg0LjIxNy40MQ== \ No newline at end of file diff --git a/config/emby/metadata/people/c/Chiaki Kobayashi-tmdb-2279389/folder.jpg b/config/emby/metadata/people/c/Chiaki Kobayashi-tmdb-2279389/folder.jpg new file mode 100644 index 0000000..b92c669 Binary files /dev/null and b/config/emby/metadata/people/c/Chiaki Kobayashi-tmdb-2279389/folder.jpg differ diff --git a/config/emby/metadata/people/h/Hiroaki Hirata-tmdb-84505/folder.jpg b/config/emby/metadata/people/h/Hiroaki Hirata-tmdb-84505/folder.jpg new file mode 100644 index 0000000..9b7af98 Binary files /dev/null and b/config/emby/metadata/people/h/Hiroaki Hirata-tmdb-84505/folder.jpg differ diff --git a/config/emby/metadata/people/k/Kaito Ishikawa-tmdb-1324666/folder.jpg b/config/emby/metadata/people/k/Kaito Ishikawa-tmdb-1324666/folder.jpg new file mode 100644 index 0000000..f63b718 Binary files /dev/null and b/config/emby/metadata/people/k/Kaito Ishikawa-tmdb-1324666/folder.jpg differ diff --git a/config/emby/metadata/people/r/Reina Ueda-tmdb-1452028/folder.jpg b/config/emby/metadata/people/r/Reina Ueda-tmdb-1452028/folder.jpg new file mode 100644 index 0000000..00b7343 Binary files /dev/null and b/config/emby/metadata/people/r/Reina Ueda-tmdb-1452028/folder.jpg differ diff --git a/config/emby/metadata/people/t/Takuya Eguchi-tmdb-1248374/folder.jpg b/config/emby/metadata/people/t/Takuya Eguchi-tmdb-1248374/folder.jpg new file mode 100644 index 0000000..c1d3523 Binary files /dev/null and b/config/emby/metadata/people/t/Takuya Eguchi-tmdb-1248374/folder.jpg differ diff --git a/config/emby/plugins/BlurayMounter.dll b/config/emby/plugins/BlurayMounter.dll index be15d9f..9155bfc 100644 Binary files a/config/emby/plugins/BlurayMounter.dll and b/config/emby/plugins/BlurayMounter.dll differ diff --git a/config/emby/plugins/Emby.Dlna.dll b/config/emby/plugins/Emby.Dlna.dll index 8d78573..b704cd4 100644 Binary files a/config/emby/plugins/Emby.Dlna.dll and b/config/emby/plugins/Emby.Dlna.dll differ diff --git a/config/emby/plugins/Emby.M3UTuner.dll b/config/emby/plugins/Emby.M3UTuner.dll index 05fe7d0..7a5aeb9 100644 Binary files a/config/emby/plugins/Emby.M3UTuner.dll and b/config/emby/plugins/Emby.M3UTuner.dll differ diff --git a/config/emby/plugins/Emby.PortMapper.dll b/config/emby/plugins/Emby.PortMapper.dll index 7531b8e..4d39f18 100644 Binary files a/config/emby/plugins/Emby.PortMapper.dll and b/config/emby/plugins/Emby.PortMapper.dll differ diff --git a/config/emby/plugins/Emby.Server.CinemaMode.dll b/config/emby/plugins/Emby.Server.CinemaMode.dll index 8e4ddfb..f18b98f 100644 Binary files a/config/emby/plugins/Emby.Server.CinemaMode.dll and b/config/emby/plugins/Emby.Server.CinemaMode.dll differ diff --git a/config/emby/plugins/Emby.Webhooks.dll b/config/emby/plugins/Emby.Webhooks.dll index 33b48b3..d450b02 100644 Binary files a/config/emby/plugins/Emby.Webhooks.dll and b/config/emby/plugins/Emby.Webhooks.dll differ diff --git a/config/emby/plugins/Emby.XmlTV.dll b/config/emby/plugins/Emby.XmlTV.dll index 38fd835..ab77fde 100644 Binary files a/config/emby/plugins/Emby.XmlTV.dll and b/config/emby/plugins/Emby.XmlTV.dll differ diff --git a/config/emby/plugins/EmbyGuideData.dll b/config/emby/plugins/EmbyGuideData.dll index a96d1cf..0d270a1 100644 Binary files a/config/emby/plugins/EmbyGuideData.dll and b/config/emby/plugins/EmbyGuideData.dll differ diff --git a/config/emby/plugins/Fanart.dll b/config/emby/plugins/Fanart.dll index 95bb09e..284fc1c 100644 Binary files a/config/emby/plugins/Fanart.dll and b/config/emby/plugins/Fanart.dll differ diff --git a/config/emby/plugins/MBBackup.dll b/config/emby/plugins/MBBackup.dll new file mode 100644 index 0000000..2c37eec Binary files /dev/null and b/config/emby/plugins/MBBackup.dll differ diff --git a/config/emby/plugins/MovieDb.dll b/config/emby/plugins/MovieDb.dll index 8214e86..ccb9f8d 100644 Binary files a/config/emby/plugins/MovieDb.dll and b/config/emby/plugins/MovieDb.dll differ diff --git a/config/emby/plugins/NfoMetadata.dll b/config/emby/plugins/NfoMetadata.dll index a140d14..8e19250 100644 Binary files a/config/emby/plugins/NfoMetadata.dll and b/config/emby/plugins/NfoMetadata.dll differ diff --git a/config/emby/plugins/OMDb.dll b/config/emby/plugins/OMDb.dll index cb29c19..feaee6b 100644 Binary files a/config/emby/plugins/OMDb.dll and b/config/emby/plugins/OMDb.dll differ diff --git a/config/emby/plugins/OpenSubtitles.dll b/config/emby/plugins/OpenSubtitles.dll index 20ac387..4ce881a 100644 Binary files a/config/emby/plugins/OpenSubtitles.dll and b/config/emby/plugins/OpenSubtitles.dll differ diff --git a/config/emby/plugins/Tvdb.dll b/config/emby/plugins/Tvdb.dll index 7824cfb..cf34d45 100644 Binary files a/config/emby/plugins/Tvdb.dll and b/config/emby/plugins/Tvdb.dll differ diff --git a/config/heimdall/nginx/nginx.conf.sample b/config/heimdall/nginx/nginx.conf.sample index 561260b..40bdfd3 100644 --- a/config/heimdall/nginx/nginx.conf.sample +++ b/config/heimdall/nginx/nginx.conf.sample @@ -1,4 +1,4 @@ -## Version 2022/08/16 - Changelog: https://github.com/linuxserver/docker-baseimage-alpine-nginx/commits/master/root/defaults/nginx/nginx.conf.sample +## Version 2023/04/13 - Changelog: https://github.com/linuxserver/docker-baseimage-alpine-nginx/commits/master/root/defaults/nginx/nginx.conf.sample ### Based on alpine defaults # https://git.alpinelinux.org/aports/tree/main/nginx/nginx.conf?h=3.15-stable @@ -55,7 +55,7 @@ http { tcp_nopush on; # all ssl related config moved to ssl.conf - include /config/nginx/ssl.conf; + # included in server blocks where listen 443 is defined # Enable gzipping of responses. #gzip on; diff --git a/config/heimdall/nginx/site-confs/default.conf.sample b/config/heimdall/nginx/site-confs/default.conf.sample index 22ca85a..6ad00c2 100644 --- a/config/heimdall/nginx/site-confs/default.conf.sample +++ b/config/heimdall/nginx/site-confs/default.conf.sample @@ -1,4 +1,4 @@ -## Version 2022/11/14 - Changelog: https://github.com/linuxserver/docker-heimdall/commits/master/root/defaults/nginx/site-confs/default.conf.sample +## Version 2023/04/13 - Changelog: https://github.com/linuxserver/docker-heimdall/commits/master/root/defaults/nginx/site-confs/default.conf.sample server { listen 80 default_server; @@ -9,6 +9,8 @@ server { server_name _; + include /config/nginx/ssl.conf; + root /app/www/public; index index.html index.htm index.php; diff --git a/config/heimdall/nginx/ssl.conf.sample b/config/heimdall/nginx/ssl.conf.sample index 2cc2368..f1483ad 100644 --- a/config/heimdall/nginx/ssl.conf.sample +++ b/config/heimdall/nginx/ssl.conf.sample @@ -1,8 +1,8 @@ -## Version 2022/08/20 - Changelog: https://github.com/linuxserver/docker-baseimage-alpine-nginx/commits/master/root/defaults/nginx/ssl.conf.sample +## Version 2023/08/13 - Changelog: https://github.com/linuxserver/docker-baseimage-alpine-nginx/commits/master/root/defaults/nginx/ssl.conf.sample ### Mozilla Recommendations -# generated 2022-08-05, Mozilla Guideline v5.6, nginx 1.17.7, OpenSSL 1.1.1k, intermediate configuration -# https://ssl-config.mozilla.org/#server=nginx&version=1.17.7&config=intermediate&openssl=1.1.1k&guideline=5.6 +# generated 2023-06-25, Mozilla Guideline v5.7, nginx 1.24.0, OpenSSL 3.1.1, intermediate configuration +# https://ssl-config.mozilla.org/#server=nginx&version=1.24.0&config=intermediate&openssl=3.1.1&guideline=5.7 ssl_certificate /config/keys/cert.crt; ssl_certificate_key /config/keys/cert.key; @@ -15,7 +15,7 @@ ssl_dhparam /config/nginx/dhparams.pem; # intermediate configuration ssl_protocols TLSv1.2 TLSv1.3; -ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; +ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305; ssl_prefer_server_ciphers off; # HSTS (ngx_http_headers_module is required) (63072000 seconds) @@ -30,8 +30,8 @@ ssl_prefer_server_ciphers off; # Optional additional headers #add_header Cache-Control "no-transform" always; -#add_header Content-Security-Policy "upgrade-insecure-requests; frame-ancestors 'self'"; -#add_header Permissions-Policy "interest-cohort=()"; +#add_header Content-Security-Policy "upgrade-insecure-requests; frame-ancestors 'self'" always; +#add_header Permissions-Policy "interest-cohort=()" always; #add_header Referrer-Policy "same-origin" always; #add_header X-Content-Type-Options "nosniff" always; #add_header X-Frame-Options "SAMEORIGIN" always; diff --git a/config/heimdall/www/SupportedApps/Prowlarr/Prowlarr.php b/config/heimdall/www/SupportedApps/Prowlarr/Prowlarr.php new file mode 100644 index 0000000..b9b3a1a --- /dev/null +++ b/config/heimdall/www/SupportedApps/Prowlarr/Prowlarr.php @@ -0,0 +1,54 @@ +jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set + } + + public function test() + { + $test = parent::appTest($this->url("system/status")); + echo $test->status; + } + + public function livestats() + { + $status = "inactive"; + + $indexers = json_decode( + parent::execute($this->url("indexer"))->getBody() + ); + $failures = json_decode( + parent::execute($this->url("indexerstatus"))->getBody() + ); + + $collect = collect($indexers); + $enabled = $collect->where("enable", true); + + $data = []; + if ($indexers || $failures) { + $data["enabled_count"] = $enabled->count() ?? 0; + $data["indexer_count"] = count($indexers) ?? 0; + $data["failure_count"] = count($failures) ?? 0; + } + + return parent::getLiveStats($status, $data); + } + public function url($endpoint) + { + $api_url = + parent::normaliseurl($this->config->url) . + "api/v1/" . + $endpoint . + "?apikey=" . + $this->config->apikey; + return $api_url; + } +} diff --git a/config/heimdall/www/SupportedApps/Prowlarr/app.json b/config/heimdall/www/SupportedApps/Prowlarr/app.json new file mode 100644 index 0000000..fe0c7ac --- /dev/null +++ b/config/heimdall/www/SupportedApps/Prowlarr/app.json @@ -0,0 +1,10 @@ +{ + "appid": "de6ff49c94538e6e13a77f75991141a4fe9af8bf", + "name": "Prowlarr", + "website": "https://prowlarr.com", + "license": "GNU General Public License v3.0 only", + "description": "Prowlarr is a indexer manager/proxy built on the popular arr .net/reactjs base stack to integrate with your various PVR apps. Prowlarr supports both Torrent Trackers and Usenet Indexers. It integrates seamlessly with Sonarr, Radarr, Lidarr, and Readarr offering complete management of your indexers with no per app Indexer setup required (we do it all).", + "enhanced": true, + "tile_background": "dark", + "icon": "prowlarr.svg" +} diff --git a/config/heimdall/www/SupportedApps/Prowlarr/config.blade.php b/config/heimdall/www/SupportedApps/Prowlarr/config.blade.php new file mode 100644 index 0000000..4a8082c --- /dev/null +++ b/config/heimdall/www/SupportedApps/Prowlarr/config.blade.php @@ -0,0 +1,14 @@ +

{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')

+
+
+ + {!! Form::text('config[override_url]', isset($item) ? $item->getconfig()->override_url : null, ['placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control']) !!} +
+
+ + {!! Form::text('config[apikey]', isset($item) ? $item->getconfig()->apikey : null, ['placeholder' => __('app.apps.apikey'), 'data-config' => 'apikey', 'class' => 'form-control config-item']) !!} +
+
+ +
+
diff --git a/config/heimdall/www/SupportedApps/Prowlarr/livestats.blade.php b/config/heimdall/www/SupportedApps/Prowlarr/livestats.blade.php new file mode 100644 index 0000000..c5532f9 --- /dev/null +++ b/config/heimdall/www/SupportedApps/Prowlarr/livestats.blade.php @@ -0,0 +1,10 @@ +
    +
  • + Enabled + {!! $enabled_count !!}/{!! $indexer_count !!} +
  • +
  • + Failed + {!! $failure_count !!} +
  • +
diff --git a/config/heimdall/www/app.sqlite b/config/heimdall/www/app.sqlite index 2901f3e..1443ea7 100644 Binary files a/config/heimdall/www/app.sqlite and b/config/heimdall/www/app.sqlite differ diff --git a/config/heimdall/www/icons/prowlarr.svg b/config/heimdall/www/icons/prowlarr.svg new file mode 100644 index 0000000..a25fdb3 --- /dev/null +++ b/config/heimdall/www/icons/prowlarr.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/config/jackett/Jackett/Indexers/1337x.json b/config/jackett/Jackett/Indexers/1337x.json deleted file mode 100644 index e456009..0000000 --- a/config/jackett/Jackett/Indexers/1337x.json +++ /dev/null @@ -1,67 +0,0 @@ -[ - { - "id": "sitelink", - "type": "inputstring", - "name": "Site Link", - "value": "https://1337x.to/" - }, - { - "id": "cookieheader", - "type": "hiddendata", - "name": "CookieHeader", - "value": "" - }, - { - "id": "lasterror", - "type": "hiddendata", - "name": "LastError", - "value": null - }, - { - "id": "downloadlink", - "type": "inputselect", - "name": "Download link", - "value": "http://itorrents.org/", - "options": { - "http://itorrents.org/": "iTorrents.org", - "magnet:": "magnet" - } - }, - { - "id": "downloadlink(fallback)", - "type": "inputselect", - "name": "Download link (fallback)", - "value": "magnet:", - "options": { - "http://itorrents.org/": "iTorrents.org", - "magnet:": "magnet" - } - }, - { - "id": "sortrequestedfromsite", - "type": "inputselect", - "name": "Sort requested from site", - "value": "time", - "options": { - "time": "created", - "seeders": "seeders", - "size": "size" - } - }, - { - "id": "orderrequestedfromsite", - "type": "inputselect", - "name": "Order requested from site", - "value": "desc", - "options": { - "desc": "desc", - "asc": "asc" - } - }, - { - "id": "tags", - "type": "inputtags", - "name": "Tags", - "value": "" - } -] \ No newline at end of file diff --git a/config/jackett/Jackett/Indexers/acgrip.json b/config/jackett/Jackett/Indexers/acgrip.json deleted file mode 100644 index 344144a..0000000 --- a/config/jackett/Jackett/Indexers/acgrip.json +++ /dev/null @@ -1,26 +0,0 @@ -[ - { - "id": "sitelink", - "type": "inputstring", - "name": "Site Link", - "value": "https://acg.rip/" - }, - { - "id": "cookieheader", - "type": "hiddendata", - "name": "CookieHeader", - "value": "_kanako_session=XUTk7MDo47o24bNcrcSVZhrG6ATB%2BL9KAeYjSIIRx0G1NChGA0LehnS2GYM3i0lOn2diT02r%2FlLt487KVxpGtdKv4XSeJDYLgTlfFXJV2rM%2FoeWocVj%2Fb2KG98CajjDOyO2Nbf2Ia1eBudOz1gbyfEe02X7GqykCEB65uc9QXJctyanuBwYXtqje8Pg2P%2FCnRbW0wj02vvfug8xu7uVg%2FgFSGKqjujRzfzcrhkFxkLeT9%2Fq%2FMjocu9JKPtdNv3uaqFyWti5AZ9l3Ik3od02pAyBvCLFqcjY%3D--9Ol1V%2BjeEb0J2vcF--q2UCYC4g02r5VTQDimLMzQ%3D%3D" - }, - { - "id": "lasterror", - "type": "hiddendata", - "name": "LastError", - "value": "Exception (acgrip): Connection refused: Connection refused (acg.rip:443)" - }, - { - "id": "tags", - "type": "inputtags", - "name": "Tags", - "value": "" - } -] \ No newline at end of file diff --git a/config/jackett/Jackett/Indexers/acgsou.json b/config/jackett/Jackett/Indexers/acgsou.json deleted file mode 100644 index b68d00c..0000000 --- a/config/jackett/Jackett/Indexers/acgsou.json +++ /dev/null @@ -1,26 +0,0 @@ -[ - { - "id": "sitelink", - "type": "inputstring", - "name": "Site Link", - "value": "https://www.36dm.club/" - }, - { - "id": "cookieheader", - "type": "hiddendata", - "name": "CookieHeader", - "value": "search_state=1680821204%7C0cf95e38e2c2b940c0a862a885bf3b80; Hm_lpvt_dfa59ae97c988b755b7dfc45bbf122ae=1681467864; Hm_lvt_dfa59ae97c988b755b7dfc45bbf122ae=1681467864" - }, - { - "id": "lasterror", - "type": "hiddendata", - "name": "LastError", - "value": null - }, - { - "id": "tags", - "type": "inputtags", - "name": "Tags", - "value": "" - } -] \ No newline at end of file diff --git a/config/jackett/Jackett/Indexers/acgsou.json.bak b/config/jackett/Jackett/Indexers/acgsou.json.bak deleted file mode 100644 index 9d148aa..0000000 --- a/config/jackett/Jackett/Indexers/acgsou.json.bak +++ /dev/null @@ -1,26 +0,0 @@ -[ - { - "id": "sitelink", - "type": "inputstring", - "name": "Site Link", - "value": "https://www.36dm.club/" - }, - { - "id": "cookieheader", - "type": "hiddendata", - "name": "CookieHeader", - "value": "search_state=1680821204%7C0cf95e38e2c2b940c0a862a885bf3b80; Hm_lpvt_dfa59ae97c988b755b7dfc45bbf122ae=1681467859; Hm_lvt_dfa59ae97c988b755b7dfc45bbf122ae=1681467859" - }, - { - "id": "lasterror", - "type": "hiddendata", - "name": "LastError", - "value": null - }, - { - "id": "tags", - "type": "inputtags", - "name": "Tags", - "value": "" - } -] \ No newline at end of file diff --git a/config/jackett/Jackett/Indexers/bangumi-moe.json b/config/jackett/Jackett/Indexers/bangumi-moe.json deleted file mode 100644 index ddba0f0..0000000 --- a/config/jackett/Jackett/Indexers/bangumi-moe.json +++ /dev/null @@ -1,26 +0,0 @@ -[ - { - "id": "sitelink", - "type": "inputstring", - "name": "Site Link", - "value": "https://bangumi.moe/" - }, - { - "id": "cookieheader", - "type": "hiddendata", - "name": "CookieHeader", - "value": "" - }, - { - "id": "lasterror", - "type": "hiddendata", - "name": "LastError", - "value": null - }, - { - "id": "tags", - "type": "inputtags", - "name": "Tags", - "value": "" - } -] \ No newline at end of file diff --git a/config/jackett/Jackett/Indexers/comicat.json b/config/jackett/Jackett/Indexers/comicat.json deleted file mode 100644 index b50bca6..0000000 --- a/config/jackett/Jackett/Indexers/comicat.json +++ /dev/null @@ -1,26 +0,0 @@ -[ - { - "id": "sitelink", - "type": "inputstring", - "name": "Site Link", - "value": "https://www.comicat.org/" - }, - { - "id": "cookieheader", - "type": "hiddendata", - "name": "CookieHeader", - "value": "search_state=1680821209%7Cddc30144a1a06f74302701cb3fc7f847" - }, - { - "id": "lasterror", - "type": "hiddendata", - "name": "LastError", - "value": null - }, - { - "id": "tags", - "type": "inputtags", - "name": "Tags", - "value": "" - } -] \ No newline at end of file diff --git a/config/jackett/Jackett/Indexers/comicat.json.bak b/config/jackett/Jackett/Indexers/comicat.json.bak deleted file mode 100644 index 2bd82d7..0000000 --- a/config/jackett/Jackett/Indexers/comicat.json.bak +++ /dev/null @@ -1,26 +0,0 @@ -[ - { - "id": "sitelink", - "type": "inputstring", - "name": "Site Link", - "value": "https://www.comicat.org/" - }, - { - "id": "cookieheader", - "type": "hiddendata", - "name": "CookieHeader", - "value": "search_state=1680821203%7C29f7279816496b2cea78c17878c4f49e" - }, - { - "id": "lasterror", - "type": "hiddendata", - "name": "LastError", - "value": null - }, - { - "id": "tags", - "type": "inputtags", - "name": "Tags", - "value": "" - } -] \ No newline at end of file diff --git a/config/jackett/Jackett/Indexers/dmhy.json b/config/jackett/Jackett/Indexers/dmhy.json deleted file mode 100644 index 928844e..0000000 --- a/config/jackett/Jackett/Indexers/dmhy.json +++ /dev/null @@ -1,26 +0,0 @@ -[ - { - "id": "sitelink", - "type": "inputstring", - "name": "Site Link", - "value": "https://share.dmhy.org/" - }, - { - "id": "cookieheader", - "type": "hiddendata", - "name": "CookieHeader", - "value": "" - }, - { - "id": "lasterror", - "type": "hiddendata", - "name": "LastError", - "value": null - }, - { - "id": "tags", - "type": "inputtags", - "name": "Tags", - "value": "" - } -] \ No newline at end of file diff --git a/config/jackett/Jackett/Indexers/eztv.json b/config/jackett/Jackett/Indexers/eztv.json deleted file mode 100644 index 6ae38f7..0000000 --- a/config/jackett/Jackett/Indexers/eztv.json +++ /dev/null @@ -1,26 +0,0 @@ -[ - { - "id": "sitelink", - "type": "inputstring", - "name": "Site Link", - "value": "https://eztv.re/" - }, - { - "id": "cookieheader", - "type": "hiddendata", - "name": "CookieHeader", - "value": "PHPSESSID=38c53a7f1c9b5adcb95046b6fad5925c" - }, - { - "id": "lasterror", - "type": "hiddendata", - "name": "LastError", - "value": null - }, - { - "id": "tags", - "type": "inputtags", - "name": "Tags", - "value": "" - } -] \ No newline at end of file diff --git a/config/jackett/Jackett/Indexers/mikan.json b/config/jackett/Jackett/Indexers/mikan.json deleted file mode 100644 index cc1e2af..0000000 --- a/config/jackett/Jackett/Indexers/mikan.json +++ /dev/null @@ -1,26 +0,0 @@ -[ - { - "id": "sitelink", - "type": "inputstring", - "name": "Site Link", - "value": "https://mikanani.me/" - }, - { - "id": "cookieheader", - "type": "hiddendata", - "name": "CookieHeader", - "value": ".AspNetCore.Antiforgery.dIJyUX9c7XY=CfDJ8AjLlBxdqr9InpJYHXb7e4jrHZsoUJv0LwL7b9JxRwM2_SVCryMeAdg1dAxICBPBCgDB-PtGl6zylq-WMigRJAwp9A24gI6YAxuRsPwOQVfmGgOuChfoLtQIMMwhU_B4taNA7YfjRV9iE1DO0OHkl5I; .AspNetCore.Session=CfDJ8AjLlBxdqr9InpJYHXb7e4jFunbjkS5xxdMvo9mf1%2BMkoKv8Q%2F7%2FVUPmGGbR%2FidoKANJsjvbDiWwCG761EPgQVEFRje60lxIHgFAQfj%2FHUwYjHhHterG2yINTcsAd37d5AY8RTCMEaikfzeoKdb8SQ%2FC8qlvwaM1Xkh5rni0IUb%2F" - }, - { - "id": "lasterror", - "type": "hiddendata", - "name": "LastError", - "value": null - }, - { - "id": "tags", - "type": "inputtags", - "name": "Tags", - "value": "" - } -] \ No newline at end of file diff --git a/config/jackett/Jackett/Indexers/miobt.json b/config/jackett/Jackett/Indexers/miobt.json deleted file mode 100644 index ee2b11b..0000000 --- a/config/jackett/Jackett/Indexers/miobt.json +++ /dev/null @@ -1,26 +0,0 @@ -[ - { - "id": "sitelink", - "type": "inputstring", - "name": "Site Link", - "value": "https://miobt.com/" - }, - { - "id": "cookieheader", - "type": "hiddendata", - "name": "CookieHeader", - "value": "search_state=1680821197%7Cddc30144a1a06f74302701cb3fc7f847" - }, - { - "id": "lasterror", - "type": "hiddendata", - "name": "LastError", - "value": null - }, - { - "id": "tags", - "type": "inputtags", - "name": "Tags", - "value": "" - } -] \ No newline at end of file diff --git a/config/jackett/Jackett/Indexers/miobt.json.bak b/config/jackett/Jackett/Indexers/miobt.json.bak deleted file mode 100644 index a55d0f4..0000000 --- a/config/jackett/Jackett/Indexers/miobt.json.bak +++ /dev/null @@ -1,26 +0,0 @@ -[ - { - "id": "sitelink", - "type": "inputstring", - "name": "Site Link", - "value": "https://miobt.com/" - }, - { - "id": "cookieheader", - "type": "hiddendata", - "name": "CookieHeader", - "value": "search_state=1680821195%7C29f7279816496b2cea78c17878c4f49e" - }, - { - "id": "lasterror", - "type": "hiddendata", - "name": "LastError", - "value": null - }, - { - "id": "tags", - "type": "inputtags", - "name": "Tags", - "value": "" - } -] \ No newline at end of file diff --git a/config/jackett/Jackett/Indexers/nyaasi.json b/config/jackett/Jackett/Indexers/nyaasi.json deleted file mode 100644 index 1858f59..0000000 --- a/config/jackett/Jackett/Indexers/nyaasi.json +++ /dev/null @@ -1,90 +0,0 @@ -[ - { - "id": "sitelink", - "type": "inputstring", - "name": "Site Link", - "value": "https://nyaa.si/" - }, - { - "id": "cookieheader", - "type": "hiddendata", - "name": "CookieHeader", - "value": "__ddg1_=QVXf91LHQEDt5jDw07Wm" - }, - { - "id": "lasterror", - "type": "hiddendata", - "name": "LastError", - "value": null - }, - { - "id": "filter", - "type": "inputselect", - "name": "Filter", - "value": "0", - "options": { - "0": "No filter", - "1": "No remakes", - "2": "Trusted only" - } - }, - { - "id": "category", - "type": "inputselect", - "name": "Category", - "value": "0_0", - "options": { - "0_0": "All categories", - "1_0": "Anime", - "1_1": "Anime - Anime Music Video", - "1_2": "Anime - English-translated", - "1_3": "Anime - Non-English-translated", - "1_4": "Anime - Raw", - "2_0": "Audio", - "2_1": "Audio - Lossless", - "2_2": "Audio - Lossy", - "3_0": "Literature", - "3_1": "Literature - English-translated", - "3_2": "Literature - Non-English-translated", - "3_3": "Literature - Lossy", - "4_0": "Live Action", - "4_1": "Live Action - English", - "4_2": "Live Action - Idol/PV", - "4_3": "Live Action - Non-English", - "4_4": "Live Action - Raw", - "5_0": "Pictures", - "5_1": "Pictures - Graphics", - "5_2": "Pictures - Photos", - "6_0": "Software", - "6_1": "Software - Applications", - "6_2": "Software - Games" - } - }, - { - "id": "sortrequestedfromsite", - "type": "inputselect", - "name": "Sort requested from site", - "value": "id", - "options": { - "id": "created", - "seeders": "seeders", - "size": "size" - } - }, - { - "id": "orderrequestedfromsite", - "type": "inputselect", - "name": "Order requested from site", - "value": "desc", - "options": { - "desc": "desc", - "asc": "asc" - } - }, - { - "id": "tags", - "type": "inputtags", - "name": "Tags", - "value": "" - } -] \ No newline at end of file diff --git a/config/jackett/Jackett/Indexers/rarbg.json b/config/jackett/Jackett/Indexers/rarbg.json deleted file mode 100644 index def673b..0000000 --- a/config/jackett/Jackett/Indexers/rarbg.json +++ /dev/null @@ -1,57 +0,0 @@ -[ - { - "id": "sitelink", - "type": "inputstring", - "name": "Site Link", - "value": "https://rarbg.to/" - }, - { - "id": "cookieheader", - "type": "hiddendata", - "name": "CookieHeader", - "value": "" - }, - { - "id": "lasterror", - "type": "hiddendata", - "name": "LastError", - "value": null - }, - { - "id": "apiurl", - "type": "inputstring", - "name": "API URL", - "value": "https://torrentapi.org/pubapi_v2.php" - }, - { - "id": "sortrequestedfromsite", - "type": "inputselect", - "name": "Sort requested from site", - "value": "last", - "options": { - "last": "created", - "seeders": "seeders", - "leechers": "leechers" - } - }, - { - "id": "numberofretries", - "type": "inputselect", - "name": "Number of retries", - "value": "5", - "options": { - "0": "No retries (fail fast)", - "1": "1 retry (0.5s delay)", - "2": "2 retries (1s delay)", - "3": "3 retries (2s delay)", - "4": "4 retries (4s delay)", - "5": "5 retries (8s delay)" - } - }, - { - "id": "tags", - "type": "inputtags", - "name": "Tags", - "value": "" - } -] \ No newline at end of file diff --git a/config/jackett/Jackett/Indexers/showrss.json b/config/jackett/Jackett/Indexers/showrss.json deleted file mode 100644 index 2f1651b..0000000 --- a/config/jackett/Jackett/Indexers/showrss.json +++ /dev/null @@ -1,26 +0,0 @@ -[ - { - "id": "sitelink", - "type": "inputstring", - "name": "Site Link", - "value": "https://showrss.info/" - }, - { - "id": "cookieheader", - "type": "hiddendata", - "name": "CookieHeader", - "value": "" - }, - { - "id": "lasterror", - "type": "hiddendata", - "name": "LastError", - "value": null - }, - { - "id": "tags", - "type": "inputtags", - "name": "Tags", - "value": "" - } -] \ No newline at end of file diff --git a/config/jackett/Jackett/Indexers/thepiratebay.json b/config/jackett/Jackett/Indexers/thepiratebay.json deleted file mode 100644 index c851507..0000000 --- a/config/jackett/Jackett/Indexers/thepiratebay.json +++ /dev/null @@ -1,26 +0,0 @@ -[ - { - "id": "sitelink", - "type": "inputstring", - "name": "Site Link", - "value": "https://pirate-proxy.page/" - }, - { - "id": "cookieheader", - "type": "hiddendata", - "name": "CookieHeader", - "value": "" - }, - { - "id": "lasterror", - "type": "hiddendata", - "name": "LastError", - "value": null - }, - { - "id": "tags", - "type": "inputtags", - "name": "Tags", - "value": "" - } -] \ No newline at end of file diff --git a/config/jackett/Jackett/Indexers/yts.json b/config/jackett/Jackett/Indexers/yts.json deleted file mode 100644 index b02f4c0..0000000 --- a/config/jackett/Jackett/Indexers/yts.json +++ /dev/null @@ -1,26 +0,0 @@ -[ - { - "id": "sitelink", - "type": "inputstring", - "name": "Site Link", - "value": "https://yts.mx/" - }, - { - "id": "cookieheader", - "type": "hiddendata", - "name": "CookieHeader", - "value": "PHPSESSID=60bj0p4qdn20b5v7j12h6pk9u8" - }, - { - "id": "lasterror", - "type": "hiddendata", - "name": "LastError", - "value": null - }, - { - "id": "tags", - "type": "inputtags", - "name": "Tags", - "value": "" - } -] \ No newline at end of file diff --git a/config/jackett/Jackett/ServerConfig.json b/config/jackett/Jackett/ServerConfig.json deleted file mode 100644 index e0e536a..0000000 --- a/config/jackett/Jackett/ServerConfig.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "Port": 9117, - "AllowExternal": true, - "AllowCORS": false, - "APIKey": "g2l8aplaaexyyeb96ta1th9znue2t0sf", - "AdminPassword": null, - "InstanceId": "pxioeyq531airogp6mgm4yk8wtt9ft9oy2dmksif1qqp21wbruoueexxdfc2owd9", - "BlackholeDir": "", - "UpdateDisabled": false, - "UpdatePrerelease": false, - "BasePathOverride": "", - "BaseUrlOverride": "", - "CacheEnabled": true, - "CacheTtl": 2100, - "CacheMaxResultsPerIndexer": 1000, - "FlareSolverrUrl": "http://172.128.2.13:8191", - "FlareSolverrMaxTimeout": 55000, - "OmdbApiKey": "", - "OmdbApiUrl": "", - "ProxyType": -1, - "ProxyUrl": "", - "ProxyPort": null, - "ProxyUsername": "", - "ProxyPassword": "", - "ProxyIsAnonymous": true -} \ No newline at end of file diff --git a/config/jellyseerr/db/db.sqlite3 b/config/jellyseerr/db/db.sqlite3 index b75dec4..a879241 100644 Binary files a/config/jellyseerr/db/db.sqlite3 and b/config/jellyseerr/db/db.sqlite3 differ diff --git a/config/jellyseerr/db/db.sqlite3-shm b/config/jellyseerr/db/db.sqlite3-shm index a30f557..391ec08 100644 Binary files a/config/jellyseerr/db/db.sqlite3-shm and b/config/jellyseerr/db/db.sqlite3-shm differ diff --git a/config/jellyseerr/db/db.sqlite3-wal b/config/jellyseerr/db/db.sqlite3-wal index d569c4b..7cd054e 100644 Binary files a/config/jellyseerr/db/db.sqlite3-wal and b/config/jellyseerr/db/db.sqlite3-wal differ diff --git a/config/jellyseerr/settings.json b/config/jellyseerr/settings.json index 26d0ab4..08bf669 100644 --- a/config/jellyseerr/settings.json +++ b/config/jellyseerr/settings.json @@ -36,20 +36,20 @@ "externalHostname": "", "libraries": [ { - "id": "3227ce1e069754c594af25ea66d69fc7", - "name": "电影", + "id": "11", + "name": "🌟 动漫剧集 🌟", "enabled": true, - "type": "movie" + "type": "show" }, { - "id": "040d82c4cf758c8db8263882bcad9c70", - "name": "电视节目", + "id": "5", + "name": "🎞️ 电影 🎞️", "enabled": true, - "type": "show" + "type": "movie" }, { - "id": "00f4e72f6c222cd20f10e5f9771cfabf", - "name": "动漫", + "id": "9", + "name": "📺 剧集 📺", "enabled": true, "type": "show" } @@ -65,15 +65,18 @@ "apiKey": "ca7d9fcbaae64526b24adf580e32fe41", "useSsl": false, "baseUrl": "", - "activeProfileId": 10, - "activeProfileName": "UHD-2160p HDR", + "activeProfileId": 14, + "activeProfileName": "2️⃣1️⃣6️⃣0️⃣🅿️", "activeDirectory": "/media/video/movie", "is4k": false, - "minimumAvailability": "announced", - "tags": [], + "minimumAvailability": "inCinemas", + "tags": [ + 1 + ], "isDefault": true, "syncEnabled": true, "preventSearch": false, + "tagRequests": false, "id": 0 } ], @@ -85,25 +88,26 @@ "apiKey": "43cc956985c343998f815949250c2a34", "useSsl": false, "baseUrl": "", - "activeProfileId": 7, + "activeProfileId": 10, "activeLanguageProfileId": 3, - "activeProfileName": "UHD-2160p", + "activeProfileName": "2️⃣1️⃣6️⃣0️⃣🅿️", "activeDirectory": "/media/video/serial", - "activeAnimeProfileId": 4, + "activeAnimeProfileId": 9, "activeAnimeLanguageProfileId": 2, - "activeAnimeProfileName": "HD-1080p", + "activeAnimeProfileName": "1️⃣0️⃣8️⃣0️⃣🅿️💤", "activeAnimeDirectory": "/media/video/anime", "tags": [ - 1 + 3 ], "animeTags": [ - 2 + 4 ], "is4k": false, "isDefault": true, "enableSeasonFolders": true, "syncEnabled": true, - "preventSearch": false, + "preventSearch": true, + "tagRequests": false, "id": 0 } ], @@ -210,6 +214,9 @@ "sonarr-scan": { "schedule": "0 30 4 * * *" }, + "availability-sync": { + "schedule": "0 0 5 * * *" + }, "download-sync": { "schedule": "0 * * * * *" }, diff --git a/config/jproxy/database/jproxy.db b/config/jproxy/database/jproxy.db index f56aeb2..12b4ec1 100644 Binary files a/config/jproxy/database/jproxy.db and b/config/jproxy/database/jproxy.db differ diff --git a/config/portainer/backups/common/portainer.db.2.16.0.20240108134219 b/config/portainer/backups/common/portainer.db.2.16.0.20240108134219 new file mode 100644 index 0000000..308020e Binary files /dev/null and b/config/portainer/backups/common/portainer.db.2.16.0.20240108134219 differ diff --git a/config/portainer/chisel/private-key.pem b/config/portainer/chisel/private-key.pem new file mode 100644 index 0000000..5a23db1 --- /dev/null +++ b/config/portainer/chisel/private-key.pem @@ -0,0 +1,5 @@ +-----BEGIN EC PRIVATE KEY----- +MHcCAQEEIJ+RuV97fXl8QOHmQoIybDM0qzgjZq3wDo/ruGmh9vkmoAoGCCqGSM49 +AwEHoUQDQgAEiShbfdwqePhBNY5WBvYYwGQDvszEiodvLuWX5RQTBidaW5ahO2Ew +TttdpAL5aT3q2vNTaE9xfCzE7DKX4kZqtA== +-----END EC PRIVATE KEY----- diff --git a/config/portainer/docker_config/config.json b/config/portainer/docker_config/config.json index 240fc93..a57788e 100644 --- a/config/portainer/docker_config/config.json +++ b/config/portainer/docker_config/config.json @@ -1 +1 @@ -{"HttpHeaders":{"X-PortainerAgent-ManagerOperation":"1","X-PortainerAgent-PublicKey":"3059301306072a8648ce3d020106082a8648ce3d030107034200048a9c5091de68d684a78610e1336bc7f4701cd11e03f6b5f81c2887f9ea629f55eb98c5b8971e6488e0e3597aa113fa02fae50f42e785cbfa20a239054627c36a","X-PortainerAgent-Signature":"WSFRYRsiUH7CFEEyAUOIWnsyfYMZSlaYbCwsWoEqZLCjEQLidt6cfkwyu6tWPozTASv8VB1DNgxWaamxTY9STA"}} \ No newline at end of file +{"HttpHeaders":{"X-PortainerAgent-ManagerOperation":"1","X-PortainerAgent-PublicKey":"3059301306072a8648ce3d020106082a8648ce3d030107034200048a9c5091de68d684a78610e1336bc7f4701cd11e03f6b5f81c2887f9ea629f55eb98c5b8971e6488e0e3597aa113fa02fae50f42e785cbfa20a239054627c36a","X-PortainerAgent-Signature":"mKkKkZWAhYzk49APsqnbOiPEeWYUm2s/ctJhFbLZhpe3GhmM+WVqGkkkKiM6eG45kTw3Dfz4tkvPFDy0QXXIFQ"}} \ No newline at end of file diff --git a/config/portainer/portainer.db b/config/portainer/portainer.db index b6b1917..65fa2e4 100644 Binary files a/config/portainer/portainer.db and b/config/portainer/portainer.db differ diff --git a/config/prowlarr/Definitions/0daykiev.yml b/config/prowlarr/Definitions/0daykiev.yml new file mode 100644 index 0000000..9fdc8ae --- /dev/null +++ b/config/prowlarr/Definitions/0daykiev.yml @@ -0,0 +1,214 @@ +--- +id: 0daykiev +name: 0day.kiev +description: "0day.kiev.ua is a UKRAINIAN Private Torrent Tracker for MOVIES / TV / GENERAL" +language: uk-UA +type: private +encoding: windows-1251 +links: + - https://tracker.0day.community/ +legacylinks: + - https://tracker.0day.kiev.ua/ + +caps: + categorymappings: + - {id: 10, cat: Movies, desc: "Фильмы (Movies)"} + - {id: 16, cat: Movies/HD, desc: "HD / Фильмы (HD / Movies)"} + - {id: 30, cat: TV/HD, desc: "HD / Сериалы (HD / TV Shows)"} + - {id: 27, cat: TV/HD, desc: "HD / Мультфильмы (HD / Cartoons)"} + - {id: 17, cat: PC/Games, desc: "Игры / ПК (Games / PC)"} + - {id: 14, cat: Audio, desc: "Музыка / Аудио (Music / Audio)"} + - {id: 29, cat: TV, desc: "Мультсериалы (TV Series)"} + - {id: 11, cat: TV, desc: "Мультфильмы (Cartoons)"} + - {id: 28, cat: TV/HD, desc: "HD / Документальное (HD / Documentary)"} + - {id: 18, cat: PC/0day, desc: "Софт / Windows (Software / Windows)"} + - {id: 19, cat: TV, desc: "TV / Сериалы (TV shows)"} + - {id: 31, cat: Other, desc: "Прочее (Other)"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: stripcyrillic + type: checkbox + label: Strip Cyrillic Letters + default: true + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + returnto: "/browse.php" + error: + - selector: div.maintitle:contains("Ошибка") + message: + selector: div.borderwrap table.embedded + test: + path: browse.php + selector: a[href="/logout.php"] + +search: + paths: + # https://tracker.0day.kiev.ua/browse.php?c10=1&c27=1&search=endgame&incldead=1&where=0 + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 active, 1 incldead, 2 onlydead, 3 gold, 4 noseed, 5 silver + incldead: "{{ if .Config.freeleech }}3{{ else }}1{{ end }}" + # 0 title, 1 title and descr + where: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + + keywordsfilters: + - name: diacritics + args: replace + - name: re_replace # S01 to сезон 1 + args: ["(?i)\\bS0*(\\d+)\\b", "сезон $1"] + - name: re_replace # E01 to сері 1 + args: ["(?i)\\bE0*(\\d+)\\b", "сері $1"] + - name: re_replace # S01E01 to сезон 1 сері 1 + args: ["(?i)\\bS0*(\\d+)E0*(\\d+)\\b", "сезон $1 сері $2"] + + rows: + selector: table > tbody > tr.rowtorrentinfo + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + filters: + # normalize to SXXEYY format + - name: re_replace + args: ["(?i)[CС]езони?[\\s:]*(\\d+(?:-\\d+)?).+?(?:[CС]ері[їяй]|Епізоди?)[\\s:]*(\\d+(?:-\\d+)?)\\s*з\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езони?.+?(\\d+(?:-\\d+)?)\\s*з\\s*(\\w?)(?:\\s*(?:[CС]ері[їяй]|Епізоди?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езони?.+?(\\d+(?:-\\d+)?)\\s*(?:[CС]ері[їяй]|Епізоди?)\\s+з\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езони?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*з\\s*(\\w?)(?:\\s*(?:[CС]ері[їяй]|Епізоди?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езони?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*(?:[CС]ері[їяй]|Епізоди?)\\s+з\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езони?[\\s:]*(\\d+(?:-\\d+)?).+?(?:[CС]ері[їяй]|Епізоди?)[\\s:]*(\\d+(?:-\\d+)?)", "S$1E$2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езони?.+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ері[їяй]|Епізоди?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езони?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ері[їяй]|Епізоди?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езони?[\\s:]*(\\d+(?:-\\d+)?)", "S$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+[CС]езони?", "S$1"] + - name: re_replace + args: ["(?i)(?:[CС]ері[їяй]|Епізоди?)[\\s:]*(\\d+(?:-\\d+)?)\\s*з\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*з\\s*(\\w?)(?:\\s*(?:[CС]ері[їяй]|Епізоди?))", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:[CС]ері[їяй]|Епізоди?)\\s+з\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(?:[CС]ері[їяй]|Епізоди?)[\\s:]*(\\d+(?:-\\d+)?)", "E$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:[CС]ері[їяй]|Епізоди?)", "E$1"] + - name: re_replace + args: ["(\\([\\p{IsCyrillic}\\W]+\\))|(^[\\p{IsCyrillic}\\W\\d]+\\/ )|([\\p{IsCyrillic} \\-]+,+)|([\\p{IsCyrillic}]+)", "{{ if .Config.stripcyrillic }}{{ else }}$1$2$3$4{{ end }}"] + - name: re_replace + args: ["(?i)\\bHDTV\\s?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bSAT\\s?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bWEB\\s?DL\\s?Rip\\b", "WEBDL"] + - name: re_replace + args: ["(?i)\\bWEB Rip\\b", "WEBRip"] + - name: re_replace + args: ["(?i)\\bWEB DL\\b", "WEBDL"] + - name: re_replace + args: ["[\\[\\(\\{<«][\\s\\W]*[\\]\\)\\}>»]", ""] + - name: re_replace + args: ["^[\\s&,\\.!\\?\\+\\-_\\|\\/':]+", ""] + - name: re_replace + args: ["(?i)^\\(\\s*([SE]\\d+.*?)\\s*\\)[\\s\\/\\|]*(.+)", "$2 $1"] + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + date: + selector: td:nth-child(2) i + filters: + - name: append + args: " +02:00" # EET + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + size: + selector: td:nth-child(4) + filters: + - name: replace + args: ["ТБ", "TB"] + - name: replace + args: ["ГБ", "GB"] + - name: replace + args: ["МБ", "MB"] + - name: replace + args: ["КБ", "KB"] + grabs: + selector: td:nth-child(5) + seeders: + selector: td:nth-child(6) + filters: + - name: split + args: ["|", 0] + leechers: + selector: td:nth-child(6) + filters: + - name: split + args: ["|", 1] + downloadvolumefactor: + case: + img[src="pic/freedownload.gif"]: 0 + img[src="pic/silverdownload.gif"]: 0.5 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 0.2 + description: + selector: a[href^="details.php?id="] +# engine n/a diff --git a/config/prowlarr/Definitions/0magnet.yml b/config/prowlarr/Definitions/0magnet.yml new file mode 100644 index 0000000..1e6be3c --- /dev/null +++ b/config/prowlarr/Definitions/0magnet.yml @@ -0,0 +1,76 @@ +--- +id: 0magnet +name: 0Magnet +description: "ØMagnet is a CHINESE Public tracker for Asian 3X (JAV)" +language: en-US +type: public +encoding: UTF-8 +links: + - https://0magnet.co/ + - https://13mag.net/ + - https://16mag.net/ +legacylinks: + - https://0magnet.com/ + - https://9mag.net/ + +caps: + categories: + XXX: XXX + + modes: + search: [q] + +settings: [] + +download: + infohash: + hash: + selector: a[href^="magnet:?xt"] + attribute: href + filters: + - name: regexp + args: ([A-F|a-f|0-9]{40}) + title: + selector: a[href^="magnet:?xt"] + attribute: href + filters: + - name: regexp + args: "&dn=(.+?)&" + - name: validfilename + +search: + paths: + - path: search + inputs: + q: "{{ if .Keywords }}{{ .Keywords }}{{ else }}{{ .Today.Year }}{{ end }}" + + rows: + selector: table > tbody > tr:has(td) + filters: + - name: andmatch + + fields: + category: + text: XXX + title: + selector: a + remove: p + details: + selector: a + attribute: href + download: + selector: a + attribute: href + date: + text: now + size: + selector: td.td-size + seeders: + text: 1 + leechers: + text: 1 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/1337x.yml b/config/prowlarr/Definitions/1337x.yml new file mode 100644 index 0000000..9119f87 --- /dev/null +++ b/config/prowlarr/Definitions/1337x.yml @@ -0,0 +1,298 @@ +--- +id: 1337x +name: 1337x +description: "1337X is a Public torrent site that offers verified torrent downloads" +language: en-US +type: public +encoding: UTF-8 +requestDelay: 2 +links: + - https://1337x.to/ + - https://1337x.st/ + - https://x1337x.ws/ + - https://x1337x.eu/ + - https://x1337x.se/ + - https://1337x.so/ + - https://1337x.unblockit.date/ + - https://1337x.ninjaproxy1.com/ + - https://1337x.mrunblock.bond/ +legacylinks: + - https://1337x.is/ + - https://1337x.nocensor.work/ + - https://1337x.nocensor.biz/ + - https://1337x.gd/ + - https://1337x.nocensor.sbs/ + - https://1337x.unblockit.nz/ + - https://1337x.nocensor.world/ + - https://1337x.unblockit.page/ + - https://1337x.unblockit.pet/ + - https://1337x.nocensor.lol/ + - https://1337x.unblockit.ink/ + - https://1337x.nocensor.art/ + - https://1337x.unblockit.bio/ + - https://1337x.unblockit.boo/ + - https://1337x.mrunblock.guru/ + - https://1337x.mrunblock.life/ # cloudflare 403 + - https://1337x.unblockit.click/ + - https://1337x.unblockit.asia/ + - https://1337x.unblockit.mov/ + - https://1337x.unblockit.rsvp/ + - https://1337x.unblockninja.com/ + - https://1337x.unblockit.vegas/ + - https://1337x.unblockit.esq/ + - https://1337x.unblockit.zip/ + - https://1337x.unblockit.foo/ + - https://1337x.unblockit.ing/ + +caps: + categorymappings: + # Anime + - {id: 28, cat: TV/Anime, desc: "Anime/Anime"} + - {id: 78, cat: TV/Anime, desc: "Anime/Dual Audio"} + - {id: 79, cat: TV/Anime, desc: "Anime/Dubbed"} + - {id: 80, cat: TV/Anime, desc: "Anime/Subbed"} + - {id: 81, cat: TV/Anime, desc: "Anime/Raw"} + # Audio + - {id: 22, cat: Audio/MP3, desc: "Music/MP3"} + - {id: 23, cat: Audio/Lossless, desc: "Music/Lossless"} + - {id: 24, cat: Audio, desc: "Music/DVD"} + - {id: 25, cat: Audio/Video, desc: "Music/Video"} + - {id: 26, cat: Audio, desc: "Music/Radio"} + - {id: 27, cat: Audio/Other, desc: "Music/Other"} + - {id: 53, cat: Audio, desc: "Music/Album"} + - {id: 58, cat: Audio, desc: "Music/Box set"} + - {id: 59, cat: Audio, desc: "Music/Discography"} + - {id: 60, cat: Audio, desc: "Music/Single"} + - {id: 68, cat: Audio, desc: "Music/Concerts"} + - {id: 69, cat: Audio, desc: "Music/AAC"} + # Movies + - {id: 1, cat: Movies/DVD, desc: "Movies/DVD"} + - {id: 2, cat: Movies/SD, desc: "Movies/Divx/Xvid"} + - {id: 3, cat: Movies, desc: "Movies/SVCD/VCD"} + - {id: 4, cat: Movies/Foreign, desc: "Movies/Dubs/Dual Audio"} + - {id: 42, cat: Movies/HD, desc: "Movies/HD"} + - {id: 54, cat: Movies/HD, desc: "Movies/h.264/x264"} + - {id: 55, cat: Movies, desc: "Movies/Mp4"} + - {id: 66, cat: Movies/3D, desc: "Movies/3D"} + - {id: 70, cat: Movies/HD, desc: "Movies/HEVC/x265"} + - {id: 73, cat: Movies, desc: "Movies/Bollywood"} + - {id: 76, cat: Movies/UHD, desc: "Movies/UHD"} + # TV + - {id: 5, cat: TV, desc: "TV/DVD"} + - {id: 6, cat: TV, desc: "TV/Divx/Xvid"} + - {id: 7, cat: TV, desc: "TV/SVCD/VCD"} + - {id: 41, cat: TV/HD, desc: "TV/HD"} + - {id: 71, cat: TV, desc: "TV/HEVC/x265"} + - {id: 74, cat: TV, desc: "TV/Cartoons"} + - {id: 75, cat: TV/SD, desc: "TV/SD"} + - {id: 9, cat: TV/Documentary, desc: "TV/Documentary"} + # Apps + - {id: 18, cat: PC, desc: "Apps/PC Software"} + - {id: 19, cat: PC/Mac, desc: "Apps/Mac"} + - {id: 20, cat: PC, desc: "Apps/Linux"} + - {id: 21, cat: PC, desc: "Apps/Other"} + - {id: 56, cat: PC/Mobile-Android, desc: "Apps/Android"} + - {id: 57, cat: PC/Mobile-iOS, desc: "Apps/iOS"} + # Games + - {id: 10, cat: PC/Games, desc: "Games/PC Game"} + - {id: 11, cat: Console/PS3, desc: "Games/PS2"} + - {id: 12, cat: Console/PSP, desc: "Games/PSP"} + - {id: 13, cat: Console/XBox, desc: "Games/Xbox"} + - {id: 14, cat: Console/XBox 360, desc: "Games/Xbox360"} + - {id: 15, cat: Console/PS3, desc: "Games/PS1"} + - {id: 16, cat: Console/Other, desc: "Games/Dreamcast"} + - {id: 17, cat: PC/Mobile-Other, desc: "Games/Other"} + - {id: 43, cat: Console/PS3, desc: "Games/PS3"} + - {id: 44, cat: Console/Wii, desc: "Games/Wii"} + - {id: 45, cat: Console/NDS, desc: "Games/DS"} + - {id: 46, cat: Console/Other, desc: "Games/GameCube"} + - {id: 72, cat: Console/3DS, desc: "Games/3DS"} + - {id: 77, cat: Console/PS4, desc: "Games/PS4"} + - {id: 82, cat: Console/Other, desc: "Games/Switch"} + # XXX + - {id: 48, cat: XXX/DVD, desc: "XXX/Video"} + - {id: 49, cat: XXX/ImageSet, desc: "XXX/Picture"} + - {id: 50, cat: XXX, desc: "XXX/Magazine"} + - {id: 51, cat: XXX, desc: "XXX/Hentai"} + - {id: 67, cat: XXX, desc: "XXX/Games"} + # Other + - {id: 33, cat: Other, desc: "Other/Emulation"} + - {id: 34, cat: Books, desc: "Other/Tutorial"} + - {id: 35, cat: Other, desc: "Other/Sounds"} + - {id: 36, cat: Books/EBook, desc: "Other/E-books"} + - {id: 37, cat: Other, desc: "Other/Images"} + - {id: 38, cat: Other, desc: "Other/Mobile Phone"} + - {id: 39, cat: Books/Comics, desc: "Other/Comics"} + - {id: 40, cat: Other/Misc, desc: "Other/Other"} + - {id: 47, cat: Other, desc: "Other/Nulled Script"} + - {id: 52, cat: Audio/Audiobook, desc: "Other/Audiobook"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q, album, artist] + book-search: [q] + allowrawsearch: true + +settings: + - name: flaresolverr + type: info + label: FlareSolverr + default: This site may use Cloudflare DDoS Protection, therefore Prowlarr requires FlareSolverr to access it. + - name: downloadlink + type: select + label: Download link + default: "http://itorrents.org/" + options: + "http://itorrents.org/": iTorrents.org + "magnet:": magnet + - name: downloadlink2 + type: select + label: Download link (fallback) + default: "magnet:" + options: + "http://itorrents.org/": iTorrents.org + "magnet:": magnet + - name: info_download + type: info + label: About the Download links + default: As the iTorrents .torrent download link on this site is known to fail from time to time, we suggest using the magnet link as a fallback. The BTCache and Torrage services are not supported because they require additional user interaction (a captcha for BTCache and a download button on Torrage.) + - name: sort + type: select + label: Sort requested from site + default: time + options: + time: created + seeders: seeders + size: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +download: + # the .torrent URL and magnet URI are on the details page + selectors: + - selector: ul li a[href^="{{ .Config.downloadlink }}"] + attribute: href + - selector: ul li a[href^="{{ .Config.downloadlink2 }}"] + attribute: href + +search: + paths: + # present first page of movies tv and music results if there are no search parms supplied (20 hits per page) + - path: "{{ if or .Query.Album .Query.Artist .Keywords }}sort-search{{ else }}cat/Movies{{ end }}{{ if or .Query.Album .Query.Artist }}/{{ or .Query.Album .Query.Artist }}{{ else }}/{{ .Keywords }}{{ end }}{{ if or .Query.Album .Query.Artist .Keywords }}/{{ else }}{{ end }}{{ .Config.sort }}/{{ .Config.type }}/1/" + - path: "{{ if or .Query.Album .Query.Artist .Keywords }}sort-search{{ else }}cat/TV{{ end }}{{ if or .Query.Album .Query.Artist }}/{{ or .Query.Album .Query.Artist }}{{ else }}/{{ .Keywords }}{{ end }}{{ if or .Query.Album .Query.Artist .Keywords }}/{{ else }}{{ end }}{{ .Config.sort }}/{{ .Config.type }}/{{ if or .Query.Album .Query.Artist .Keywords }}2{{ else }}1{{ end }}/" + - path: "{{ if or .Query.Album .Query.Artist .Keywords }}sort-search{{ else }}cat/Music{{ end }}{{ if or .Query.Album .Query.Artist }}/{{ or .Query.Album .Query.Artist }}{{ else }}/{{ .Keywords }}{{ end }}{{ if or .Query.Album .Query.Artist .Keywords }}/{{ else }}{{ end }}{{ .Config.sort }}/{{ .Config.type }}/{{ if or .Query.Album .Query.Artist .Keywords }}3{{ else }}1{{ end }}/" + - path: "{{ if or .Query.Album .Query.Artist .Keywords }}sort-search{{ else }}cat/Other{{ end }}{{ if or .Query.Album .Query.Artist }}/{{ or .Query.Album .Query.Artist }}{{ else }}/{{ .Keywords }}{{ end }}{{ if or .Query.Album .Query.Artist .Keywords }}/{{ else }}{{ end }}{{ .Config.sort }}/{{ .Config.type }}/{{ if or .Query.Album .Query.Artist .Keywords }}4{{ else }}1{{ end }}/" + + keywordsfilters: + - name: re_replace # daily standard S2023 > 2023 + args: ["\\bS(20\\d{2})\\b", "$1"] + + rows: + selector: tr:has(a[href^="/torrent/"]) + + fields: + title_default: + # the movies, tv and music pages abbreviate the title + selector: td[class^="coll-1"] a[href^="/torrent/"] + title_optional: + # the movies, tv and music pages abbreviate the title so we process the href instead. #8137 + optional: true + selector: td[class^="coll-1"] a[href^="/torrent/"]:contains("...") + attribute: href + filters: + - name: urldecode + - name: split + args: ["/", 3] + title: + # title_optional can be empty so use the title_default instead #8586 + text: "{{ if .Result.title_optional }}{{ .Result.title_optional }}{{ else }}{{ .Result.title_default }}{{ end }}" + filters: + - name: re_replace + args: ["-([\\w]+(?:[\\[\\]\\(\\)\\w]+)?)$", "~$1"] + - name: replace + args: ["-", " "] + - name: re_replace + args: ["~([\\w]+(?:[\\[\\]\\(\\)\\w]+)?)$", "-$1"] + - name: replace + args: ["\u000f", ""] # get rid of unwanted character #6582 + # cleanup for Sonarr + - name: re_replace # EP 3 4 to E3-4 + args: ["(?i)\\sEP\\s(\\d{1,2})\\s(E?\\s?\\d{1,2})\\s", " E$1-$2 "] + - name: re_replace # S02E04 05 to S02E04-05 + args: ["(?i)\\sS(\\d{1,2})\\s?E\\s?(\\d{1,2})\\s(E?\\s?\\d{1,2})\\s", " S$1E$2-$3 "] + - name: re_replace + args: ["(?i)AC3\\s?(\\d)\\s(\\d)", "AC3 $1.$2"] + - name: re_replace + args: ["(?i) DD\\s?(\\d)\\s(\\d)", " DD $1.$2"] + - name: re_replace + args: ["(?i) DDP\\s?(\\d)\\s(\\d)", " DDP $1.$2"] + - name: re_replace + args: ["(?i)\\sE\\s?AC3", " EAC3"] + - name: re_replace + args: ["(?i)WEB\\sDL", "WEB-DL"] + - name: re_replace + args: ["(?i)HDTVRIP", "HDTV"] + category_sub: + optional: true + selector: td[class^="coll-1"] a[href^="/sub/"] + attribute: href + filters: + # extract the third part + - name: split + args: ["/", 2] + category: + text: "{{ if .Result.category_sub }}{{ .Result.category_sub }}{{ else }}40{{ end }}" + details: + selector: td[class^="coll-1"] a[href^="/torrent/"] + attribute: href + download: + # .torrent link is on the details page + selector: td[class^="coll-1"] a[href^="/torrent/"] + attribute: href + # dates come in three flavours: + date_year: + # (within this year) 7am Sep. 14th + optional: true + selector: td[class^="coll-date"]:not(:contains(":")):not(:contains("'")) + filters: + - name: re_replace + args: ["st|nd|rd|th", ""] + - name: dateparse + args: "htt MMM. d" + date_years: + # (more than a year ago) Apr. 18th '11 + optional: true + selector: td[class^="coll-date"]:contains("'") + filters: + - name: replace + args: ["'", ""] + - name: re_replace + args: ["st|nd|rd|th", ""] + - name: dateparse + args: "MMM. d yy" + date_today: + # (today) 12:25am + optional: true + selector: td[class^="coll-date"]:contains(":") + filters: + - name: fuzzytime + date: + text: "{{ if or .Result.date_year .Result.date_years .Result.date_today }}{{ or .Result.date_year .Result.date_years .Result.date_today }}{{ else }}now{{ end }}" + size: + selector: td[class^="coll-4"] + seeders: + selector: td[class^="coll-2"] + leechers: + selector: td[class^="coll-3"] + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/1ptbar.yml b/config/prowlarr/Definitions/1ptbar.yml new file mode 100644 index 0000000..31aaa3f --- /dev/null +++ b/config/prowlarr/Definitions/1ptbar.yml @@ -0,0 +1,192 @@ +--- +id: 1ptbar +name: 1ptbar +description: "1ptbar is a CHINESE Private Torrent Tracker for MOVIES / TV / E-LEARNING" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://1ptba.com/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "Movies/电影"} + - {id: 404, cat: TV/Documentary, desc: "Documentaries/纪录片"} + - {id: 405, cat: TV/Anime, desc: "Animations/动漫"} + - {id: 402, cat: TV, desc: "TV Series/电视剧"} + - {id: 403, cat: TV, desc: "TV Shows/综艺节目"} + - {id: 406, cat: Audio/Video, desc: "Music Videos/音乐MV"} + - {id: 407, cat: TV/Sport, desc: "Sports/体育"} + - {id: 409, cat: Other, desc: "Misc/其他"} + - {id: 408, cat: Audio, desc: "HQ Audio/高品质音频"} + - {id: 412, cat: Other, desc: "Edu/教育"} + - {id: 411, cat: PC/Games, desc: "Games/游戏"} + - {id: 410, cat: PC/0day, desc: "Software/软件"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: 2facode + type: text + label: 2FA code + - name: info_2fa + type: info + label: "About 2FA code" + default: "Only fill in the 2FA code box if you have enabled 2FA on the 1ptbar Web Site. Otherwise just leave it empty." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + secret: "" + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + two_step_code: "{{ .Config.2facode }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("失败")) + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl + search_area: "{{ if .Query.IMDBID }}4{{ else }}{{ end }}{{ if .Query.DoubanID }}1{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }}{{ else }}0{{ end }}" + # 0 AND, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: img[data-src] + attribute: data-src + imdbid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="imdb.com/title/tt"] + attribute: href + doubanid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="movie.douban.com/subject/"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-last-of-type(6) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-last-of-type(6):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-last-of-type(5) + seeders: + selector: td.rowfollow:nth-last-of-type(4) + leechers: + selector: td.rowfollow:nth-last-of-type(3) + grabs: + selector: td.rowfollow:nth-last-of-type(2) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + description: + selector: td:nth-child(2) + remove: a, b, font, img, span +# NexusPHP v1.8.9 2023-11-15 diff --git a/config/prowlarr/Definitions/2fast4you.yml b/config/prowlarr/Definitions/2fast4you.yml new file mode 100644 index 0000000..6a0413f --- /dev/null +++ b/config/prowlarr/Definitions/2fast4you.yml @@ -0,0 +1,227 @@ +--- +id: 2fast4you +name: 2 Fast 4 You +description: "2 Fast 4 You is a FRENCH Private site for TV / MOVIES / GENERAL" +language: fr-FR +type: private +encoding: UTF-8 +links: + - https://2f4y.me/ +legacylinks: + - http://www.2f4y.me/ + - https://www.2f4y.me/ + +caps: + categorymappings: + - {id: 10, cat: TV/Anime, desc: "Animation: HD720P"} + - {id: 11, cat: TV/Anime, desc: "Animation: HD1080P"} + - {id: 56, cat: TV/Anime, desc: "Animation: DVDRip"} + - {id: 18, cat: PC/0day, desc: "Applications: PC"} + - {id: 16, cat: PC/Games, desc: "Applications: Jeux"} + - {id: 19, cat: PC/Mobile-Android, desc: "Applications: Android"} + - {id: 17, cat: PC/0day, desc: "Applications: Autres"} + - {id: 67, cat: TV, desc: "Autres: Emission TV"} + - {id: 68, cat: TV/Sport, desc: "Autres: Sport"} + - {id: 40, cat: Other, desc: "Autres: Autres"} + - {id: 14, cat: TV/Documentary, desc: "Documentaires: DivX"} + - {id: 15, cat: TV/Documentary, desc: "Documentaires: HD"} + - {id: 76, cat: TV/Documentary, desc: "Documentaires: TVRip"} + - {id: 62, cat: Audio/Audiobook, desc: "E-Books: E-Books Audio"} + - {id: 50, cat: Books, desc: "E-Books: Manuel Français"} + - {id: 49, cat: Books, desc: "E-Books: Manuel Anglais"} + - {id: 36, cat: Books, desc: "E-Books: Livres Français"} + - {id: 53, cat: Books, desc: "E-Books: Livre Anglais"} + - {id: 52, cat: Books, desc: "E-Books: Revue - Journaux"} + - {id: 51, cat: Books, desc: "E-Books: BD"} + - {id: 95, cat: Movies, desc: "Films: Film Divx XviD"} + - {id: 66, cat: Movies, desc: "Films: VOSTFR"} + - {id: 71, cat: Movies/WEB-DL, desc: "Films: WEB-DL"} + - {id: 65, cat: Movies, desc: "Films: VO"} + - {id: 72, cat: Movies/SD, desc: "Films: TVRip/HDTV"} + - {id: 70, cat: Movies/HD, desc: "Films: MHD X265"} + - {id: 57, cat: Movies/SD, desc: "Films: TS/CAM"} + - {id: 59, cat: Movies, desc: "Films: Spectacle"} + - {id: 55, cat: Movies/HD, desc: "Films: MHD 720P"} + - {id: 54, cat: Movies/HD, desc: "Films: MHD 1080P"} + - {id: 1, cat: Movies/HD, desc: "Films: HD720P"} + - {id: 2, cat: Movies/HD, desc: "Films: HD1080P"} + - {id: 90, cat: Movies/HD, desc: "Films: HD X265"} + - {id: 92, cat: Movies/HD, desc: "Films: 4K"} + - {id: 69, cat: Movies/3D, desc: "Films: Film 3D"} + - {id: 3, cat: Movies/DVD, desc: "Films: DVDRIP"} + - {id: 5, cat: Movies/DVD, desc: "Films: DVD9"} + - {id: 91, cat: Movies/HD, desc: "Films: RemuX"} + - {id: 89, cat: Movies/HD, desc: "Films: BD/BR Rip"} + - {id: 88, cat: Movies/BluRay, desc: "Films: Full BD/BR"} + - {id: 97, cat: Movies, desc: "Films: Cours Métrage"} + - {id: 79, cat: TV/Anime, desc: "Mangas: HD"} + - {id: 81, cat: TV/Anime, desc: "Mangas: HD VOSTFR"} + - {id: 85, cat: TV/Anime, desc: "Mangas: Web-DL"} + - {id: 86, cat: TV/Anime, desc: "Mangas: TV-RIP"} + - {id: 75, cat: Audio, desc: "Musique: Concert TVRip"} + - {id: 25, cat: Audio/MP3, desc: "Musique: Single MP3"} + - {id: 24, cat: Audio/Lossless, desc: "Musique: Single Flac"} + - {id: 22, cat: Audio/MP3, desc: "Musique: Album MP3"} + - {id: 23, cat: Audio/Lossless, desc: "Musique: Album Flac"} + - {id: 64, cat: Audio, desc: "Musique: Mégamix Maison"} + - {id: 96, cat: Audio/MP3, desc: "Musique: PlayList MP3"} + - {id: 94, cat: Audio, desc: "Musique: Podcast"} + - {id: 58, cat: Audio, desc: "Musique: Concert"} + - {id: 93, cat: TV, desc: "Serie TV: Saison VOSTFR"} + - {id: 61, cat: TV, desc: "Serie TV: Episode VOSTFR"} + - {id: 63, cat: TV, desc: "Serie TV: Episode VO"} + - {id: 12, cat: TV/Anime, desc: "Serie TV: Animation"} + - {id: 74, cat: TV, desc: "Serie TV: TVRip"} + - {id: 73, cat: TV/WEB-DL, desc: "Serie TV: WEB-DL"} + - {id: 7, cat: TV, desc: "Serie TV: Episode FR"} + - {id: 6, cat: TV, desc: "Serie TV: Saison FR"} + - {id: 98, cat: TV/Anime, desc: "Serie TV: Manga VOSTFR"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: multilang + type: checkbox + label: Replace MULTi by another language in release name + default: false + - name: multilanguage + type: select + label: Replace MULTi by this language + default: FRENCH + options: + FRENCH: FRENCH + MULTi FRENCH: MULTi FRENCH + ENGLISH: ENGLISH + MULTi ENGLISH: MULTi ENGLISH + VOSTFR: VOSTFR + MULTi VOSTFR: MULTi VOSTFR + - name: vostfr + type: checkbox + label: Replace VOSTFR and SUBFRENCH with ENGLISH + default: false + - name: sort + type: select + label: Sort requested from site + default: id + options: + id: created + seeders: seeders + size: size + name: title + - name: order + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: account-login.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: form:contains("Erreur") + message: + selector: form + remove: table + test: + path: torrents-search.php + selector: a[href="account-logout.php"] + +search: + paths: + - path: torrents-search.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 active, 1 incldead, 2 onlydead + incldead: 1 + # 0 all, 1 notfree, 2 onlyfree + freeleech: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 any, 1 French, 2 English, 3 Multi, 4-8 32-41 + lang: 0 + sort: "{{ .Config.sort}}" + order: "{{ .Config.order}}" + keywordsfilters: + - name: re_replace + args: ["^$", "%"] # replace empty search string with % + + rows: + selector: table.ttable_headinner > tbody > tr[class^="t-row"] + + fields: + category: + selector: a[href^="torrents.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_phase1: + selector: a[href^="torrents-details.php?id="] + filters: + - name: replace + args: [" - (Nouveau!)", ""] + title_vostfr: + text: "{{ .Result.title_phase1 }}" + filters: + - name: re_replace + args: ["(?i)\\b(vostfr|subfrench)\\b", "ENGLISH"] + title_phase2: + text: "{{ if .Config.vostfr }}{{ .Result.title_vostfr }}{{ else }}{{ .Result.title_phase1 }}{{ end }}" + title_multilang: + text: "{{ .Result.title_phase2 }}" + filters: + - name: re_replace + args: ["(?i)\\b(MULTI(?!.*(?:FRENCH|ENGLISH|VOSTFR)))\\b", "{{ .Config.multilanguage }}"] + title: + text: "{{ if .Config.multilang }}{{ .Result.title_multilang }}{{ else }}{{ .Result.title_phase2 }}{{ end }}" + details: + selector: a[href^="torrents-details.php?id="] + attribute: href + download: + selector: a[href^="torrents-details.php?id="] + attribute: href + filters: + - name: replace + args: ["torrents-details.php", "download.php"] + poster: + selector: img.rounded-img + attribute: src + size: + selector: td:nth-child(5) + grabs: + selector: td:nth-child(6) + seeders: + selector: td:nth-child(7) + leechers: + selector: td:nth-child(8) + date: + text: now + downloadvolumefactor: + case: + img[title="freeleech"]: 0 + "*": 1 + uploadvolumefactor: + case: + "*": 1 + minimumratio: + text: 0.75 +# engine n/a diff --git a/config/prowlarr/Definitions/2xfree.yml b/config/prowlarr/Definitions/2xfree.yml new file mode 100644 index 0000000..182bbb4 --- /dev/null +++ b/config/prowlarr/Definitions/2xfree.yml @@ -0,0 +1,195 @@ +--- +id: 2xfree +name: 2xFree +description: "2xFree is a CHINESE Private Torrent Tracker for 3D MOVIES / TV" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://pt.2xfree.org/ + +caps: + categorymappings: + + # torrents.php + - {id: 526, cat: Movies, desc: "3DMovies(3D电影)"} + - {id: 527, cat: TV, desc: "3DSeries(3D剧集)"} + - {id: 533, cat: Movies, desc: "VRMovies(VR电影)"} + - {id: 534, cat: TV, desc: "VRSeries(VR剧集)"} + - {id: 537, cat: TV, desc: "VRShows(VR演出)"} + - {id: 530, cat: Console, desc: "VRGame(VR一体机游戏)"} + - {id: 531, cat: PC/Games, desc: "PCVRGame(PCVR游戏)"} + - {id: 532, cat: Other, desc: "VRTools(VR工具软件)"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: 2facode + type: text + label: 2FA code + - name: info_2fa + type: info + label: "About 2FA code" + default: "Only fill in the 2FA code box if you have enabled 2FA on the 2xFree Web Site. Otherwise just leave it empty." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + - name: info_ulslr + type: info + label: Upload Speed Limit Rule + default: The upload bandwidth shall not exceed 120Mbps, that is, the upload speed shall not exceed 15MB/s. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + secret: "" + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + two_step_code: "{{ .Config.2facode }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("失败")) + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl (4 does not appear to work) + search_area: "{{ if or .Query.IMDBID .Query.DoubanID }}1{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(a[href^="details.php?id="]) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: img[data-src] + attribute: data-src + imdbid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="imdb.com/title/tt"] + attribute: href + doubanid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="movie.douban.com/subject/"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-child(5) + seeders: + selector: td.rowfollow:nth-child(6) + leechers: + selector: td.rowfollow:nth-child(7) + grabs: + selector: td.rowfollow:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumratio: + text: 0.8 + description: + selector: td.rowfollow:nth-child(2) + remove: a, b, font, img, span +# NexusPHP v1.8.6 2023-06-18 diff --git a/config/prowlarr/Definitions/3changtrai.yml b/config/prowlarr/Definitions/3changtrai.yml new file mode 100644 index 0000000..bd4ae1a --- /dev/null +++ b/config/prowlarr/Definitions/3changtrai.yml @@ -0,0 +1,182 @@ +--- +id: 3changtrai +name: 3ChangTrai +description: "3ChangTrai (3CT) is a VIETNAMESE Private Torrent Tracker for HD MOVIES / TV / GENERAL" +language: vi-VN +type: private +encoding: UTF-8 +links: + - https://3changtrai.com/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "Movies"} + - {id: 402, cat: TV, desc: "TV Series"} + - {id: 403, cat: TV, desc: "TV Shows"} + - {id: 404, cat: TV/Documentary, desc: "Documentaries"} + - {id: 405, cat: TV/Anime, desc: "Animations"} + - {id: 406, cat: Audio/Video, desc: "Music Videos"} + - {id: 407, cat: TV/Sport, desc: "Sports"} + - {id: 408, cat: Audio, desc: "HQ Audio"} + - {id: 410, cat: PC, desc: "Software"} + - {id: 411, cat: Books, desc: "Documents"} + - {id: 412, cat: PC/Games, desc: "Games"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("Đăng nhập thất bại!")) # Login failed! + - selector: td.embedded:has(h2:contains("Thất bại")) # Failure (captcha) + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl + search_area: "{{ if .Query.IMDBID }}4{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: img[data-src] + attribute: data-src + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-child(5) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +07:00" # ICT + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-child(5):not(:has(span)) + optional: true + filters: + - name: append + args: " +07:00" # ICT + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-child(6) + seeders: + selector: td.rowfollow:nth-child(7) + leechers: + selector: td.rowfollow:nth-child(8) + grabs: + selector: td.rowfollow:nth-child(9) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumseedtime: + # 3 days (as seconds = 3 x 24 x 60 x 60) + text: 259200 + description: + selector: td:nth-child(3) + remove: a, b, font, img, span +# NexusPHP 3ChangTrai v3.0 2020-04-30 diff --git a/config/prowlarr/Definitions/3dtorrents.yml b/config/prowlarr/Definitions/3dtorrents.yml new file mode 100644 index 0000000..149c77b --- /dev/null +++ b/config/prowlarr/Definitions/3dtorrents.yml @@ -0,0 +1,160 @@ +--- +id: 3dtorrents +name: 3D Torrents +description: "3D Torrents (3DT) is a Private Torrent Tracker for 3D HD / BLURAY MOVIES" +language: en-US +type: private +encoding: UTF-8 +links: + - http://www.3dtorrents.org/ # site does not support https ERR_CONNECTION_CLOSED + +caps: + categorymappings: + - {id: 14, cat: Movies/SD, desc: "Movies XviD"} + - {id: 15, cat: Movies/DVD, desc: "Movies DVD-R"} + - {id: 11, cat: Movies/HD, desc: "Movies 720p"} + - {id: 13, cat: Movies/HD, desc: "Movies 1080p"} + - {id: 16, cat: Movies/3D, desc: "Movies 3DTV"} + - {id: 17, cat: Movies/BluRay, desc: "Movies Blu-ray"} + - {id: 27, cat: Movies/BluRay, desc: "Movies BD25 Encode"} + - {id: 33, cat: Movies/BluRay, desc: "Movies BD9 AVCHD"} + - {id: 22, cat: Movies, desc: "Movies 2D to 3D Conv"} + - {id: 32, cat: Movies, desc: "Bluray MKV Remux"} + - {id: 23, cat: Movies/3D, desc: "Movies Evo 3D"} + - {id: 36, cat: Movies/UHD, desc: "Movies 4K UHD Bluray"} + - {id: 37, cat: Movies/UHD, desc: "Movies 4K UHD Encode"} + - {id: 21, cat: PC, desc: "3D Software"} + - {id: 28, cat: XXX, desc: "Adult 720p"} + - {id: 29, cat: XXX, desc: "Adult 1080p"} + - {id: 30, cat: XXX, desc: "Adult Blu-ray"} + - {id: 31, cat: Other, desc: "Misc"} + - {id: 19, cat: Audio, desc: "Audio Packs"} + + modes: + search: [q] + movie-search: [q] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 3 + options: + 3: created + 5: seeders + 2: title + - name: type + type: select + label: Order requested from site + default: 2 + options: + 1: desc + 2: asc + - name: info + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: index.php?page=login + method: form + form: form + inputs: + uid: "{{ .Config.username }}" + pwd: "{{ .Config.password }}" + captcha: + type: image + selector: img.captcha + input: private_key + error: + - selector: span.errormsg + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: index.php + inputs: + $raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}" + search: "{{ .Keywords }}" + page: torrents + category: 0 + # 0 all, 1 Anaglyph 3D, 2 Side by Side,3 Over Under + 3dformat: 0 + # 0 all, 1 active only, 2 dead only + active: 0 + order: "{{ .Config.sort }}" + by: "{{ .Config.type }}" + + rows: + selector: "table[cellspacing!=\"1\"].lista > tbody > tr:has(a[href^=\"index.php?page=torrents&category=\"]){{ if .Config.freeleech }}:has(img[src=\"images/sign_free.png\"]){{ else }}{{ end }}" + + fields: + category: + selector: a[href^="index.php?page=torrents&category="] + attribute: href + filters: + - name: querystring + args: category + - name: re_replace + args: ["(\\b0\\b)", "31"] + title: + selector: a[href^="index.php?page=torrent-details&id="] + details: + selector: a[href^="index.php?page=torrent-details&id="] + attribute: href + download: + selector: a[href^="index.php?page=torrent-details&id="] + attribute: href + filters: + - name: replace + args: ["index.php?page=torrent-details&id=", "download.php?id="] + poster: + selector: a[href^="index.php?page=torrent-details&id="] + attribute: onmouseover + filters: + - name: regexp + args: ",\\'(.+?)\\'" + genre: + selector: td:nth-child(2) span + description: + text: "{{ .Result.genre }}" + date: + selector: td:nth-last-child(5) + filters: + - name: append + args: " -07:00" # PDT + - name: dateparse + args: "dd/MM/yyyy zzz" + size: + selector: td:nth-last-child(4) + seeders: + selector: a[href^="index.php?page=peers"] + leechers: + selector: td:has(a[href^="index.php?page=peers"]) + td + grabs: + selector: a[href^="index.php?page=torrent_history"] + optional: true + default: 0 + downloadvolumefactor: + case: + img[src="images/sign_free.png"]: 0 + img[src="images/50off.png"]: 0.5 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 +# xbtit diff --git a/config/prowlarr/Definitions/3wmg.yml b/config/prowlarr/Definitions/3wmg.yml new file mode 100644 index 0000000..b853c4e --- /dev/null +++ b/config/prowlarr/Definitions/3wmg.yml @@ -0,0 +1,200 @@ +--- +id: 3wmg +name: 3Wmg +description: "3Wmg is a CHINESE Private Torrent Tracker for MOVIES / TV / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +requestDelay: 2 +links: + - https://www.3wmg.com/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "Movies/电影", default: true} + - {id: 402, cat: TV, desc: "TV Series/电视剧", default: true} + - {id: 403, cat: TV, desc: "TV Shows/综艺", default: true} + - {id: 404, cat: TV/Documentary, desc: "Documentaries/纪录片", default: true} + - {id: 405, cat: TV/Anime, desc: "Animations/动漫", default: true} + - {id: 406, cat: Audio, desc: "Music/音乐", default: true} + - {id: 407, cat: Other/Misc, desc: "Leanrning学习", default: true} + - {id: 409, cat: Books, desc: "Ebook电子书", default: true} + - {id: 410, cat: Other, desc: "Misc/其他", default: true} + # special + - {id: 411, cat: XXX, desc: "Uncensored无码", default: false} + - {id: 412, cat: XXX, desc: "Censored有码", default: false} + - {id: 413, cat: XXX, desc: "Lgbt同志", default: false} + - {id: 414, cat: XXX, desc: "III三级、写真", default: false} + - {id: 415, cat: XXX, desc: "Animations动漫", default: false} + - {id: 416, cat: XXX, desc: "Other其他", default: false} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: 2facode + type: text + label: 2FA code + - name: info_2fa + type: info + label: "About 2FA code" + default: "Only fill in the 2FA code box if you have enabled 2FA on the 3Wmg Web Site. Otherwise just leave it empty." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + secret: "" + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + two_step_code: "{{ .Config.2facode }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("失敗")) + - selector: td.embedded:has(h2:contains("失败")) + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + categories: [401, 402, 403, 404, 405, 406, 407, 409, 410] + - path: special.php + categories: [411, 412, 413, 414, 415, 416] + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl + search_area: "{{ if .Query.IMDBID }}4{{ else }}{{ end }}{{ if .Query.DoubanID }}1{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }}{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(a[href^="details.php?id="]) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + imdbid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="imdb.com/title/tt"] + attribute: href + doubanid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="movie.douban.com/subject/"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-child(5) + seeders: + selector: td.rowfollow:nth-child(6) + leechers: + selector: td.rowfollow:nth-child(7) + grabs: + selector: td.rowfollow:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumratio: + text: 1.0 + description: + selector: td.rowfollow:nth-child(2) + remove: a, b, font, img, span +# NexusPHP v1.8.5 2023-07-29 diff --git a/config/prowlarr/Definitions/4thd.yml b/config/prowlarr/Definitions/4thd.yml new file mode 100644 index 0000000..aaa1801 --- /dev/null +++ b/config/prowlarr/Definitions/4thd.yml @@ -0,0 +1,149 @@ +--- +id: 4thd +name: 4thD +description: "4th Dimension is a Private Torrent Tracker for MOVIES / TV / GENERAL" +language: en-US +encoding: UTF-8 +type: private +links: + - https://4thd.xyz/ + +caps: + categorymappings: + - {id: 38, cat: Movies, desc: "Movie Pack"} + - {id: 36, cat: Movies, desc: "Movies/Classic Films"} + - {id: 13, cat: Movies, desc: "Movies/Documentary"} + - {id: 21, cat: Movies/Foreign, desc: "Movies/Foreign"} + - {id: 27, cat: Movies/HD, desc: "MoviesHD"} + - {id: 29, cat: Movies/SD, desc: "Movies/SD"} + - {id: 26, cat: Movies/SD, desc: "Movies/XviD"} + - {id: 45, cat: Movies, desc: "Movies/Kids"} + - {id: 41, cat: TV/Foreign, desc: "Foreign tv"} + - {id: 40, cat: TV, desc: "Mini-Series"} + - {id: 43, cat: TV/HD, desc: "TV H265"} + - {id: 42, cat: TV, desc: "TV Movie"} + - {id: 4, cat: TV/HD, desc: "TV/HD-x720"} + - {id: 14, cat: TV, desc: "TV/Packs"} + - {id: 2, cat: TV/SD, desc: "TV/SD MP4/mkv"} + - {id: 31, cat: TV/SD, desc: "TV/XviD"} + - {id: 18, cat: PC/Games, desc: "Games/PC"} + - {id: 44, cat: Audio, desc: "Music/Pack"} + - {id: 12, cat: Audio/Lossless, desc: "Music/FLAC"} + - {id: 15, cat: Audio/MP3, desc: "Music/MP3"} + - {id: 37, cat: Audio, desc: "Radio"} + - {id: 9, cat: PC/0day, desc: "Apps/PC"} + - {id: 34, cat: Audio/Audiobook, desc: "Audiobooks"} + - {id: 25, cat: Books/EBook, desc: "eBooks"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: time + options: + time: created + seeders: seeders + size: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: login.php + method: form + form: form#loginform + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + keeplogged: 1 + error: + - selector: form#loginform .warning + test: + path: index.php + selector: a[href^="logout.php?auth="] + +search: + paths: + # https://4thd.xyz/torrents.php?order_by=time&order_way=desc&filter_freeleech=1&title=twilight+zone&search_type=1&taglist=&tags_type=0 + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}" + order_by: "{{ .Config.sort }}" + order_way: "{{ .Config.type }}" + # 0 all, 1 onlyfree + filter_freeleech: "{{ if .Config.freeleech }}1{{ else }}0{{ end }}" + title: "{{ .Keywords }}" + search_type: 1 + taglist: "" + tags_type: 0 + + rows: + selector: table#torrent_table > tbody > tr.torrent:has(a[href^="torrents.php?action=download&id="]) + + fields: + category: + selector: td.cats_col div a + attribute: href + filters: + - name: regexp + args: \[(\d+)\] + title: + selector: a[href^="torrents.php?id="] + details: + selector: a[href^="torrents.php?id="] + attribute: href + download: + selector: a[href^="torrents.php?action=download&id="] + attribute: href + description: + selector: div.tags + poster: + selector: td:nth-child(2) script + filters: + - name: regexp + args: "src=(.*?)>" + - name: re_replace + args: ["\\\\", ""] + files: + selector: td:nth-child(3) + date: + selector: td:nth-child(5) + filters: + - name: replace + args: ["Never", "99 years ago"] + size: + selector: td:nth-child(6) + grabs: + selector: td:nth-child(7) + seeders: + selector: td:nth-child(8) + leechers: + selector: td:nth-child(9) + downloadvolumefactor: + case: + img[src$="/freedownload.gif"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 +# Engine n/a diff --git a/config/prowlarr/Definitions/52pt.yml b/config/prowlarr/Definitions/52pt.yml new file mode 100644 index 0000000..170f26b --- /dev/null +++ b/config/prowlarr/Definitions/52pt.yml @@ -0,0 +1,179 @@ +--- +id: 52pt +name: 52PT +description: "52PT is a CHINESE Private Torrent Tracker for HD MOVIES / TV" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://52pt.site/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "Movies/电影"} + - {id: 404, cat: TV/Documentary, desc: "Documentaries/纪录片"} + - {id: 405, cat: TV/Anime, desc: "Animations/动漫"} + - {id: 402, cat: TV, desc: "TV Series/剧集"} + - {id: 403, cat: TV, desc: "TV Shows/综艺"} + - {id: 406, cat: Audio/Video, desc: "MusicVideo/音乐MV"} + - {id: 407, cat: TV/Sport, desc: "Sports/运体"} + - {id: 409, cat: Other, desc: "Misc/其他"} + - {id: 410, cat: Other, desc: "Opera/戏曲 曲艺"} + - {id: 408, cat: Audio, desc: "HQ Audio/无损音乐"} + - {id: 411, cat: XXX, desc: "Erotic/情色"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + secret: "" + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("失败")) + test: + path: index.php + selector: a[href="usercp.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + # currently supports only one query id at one time. + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl + search_area: "{{ if .Query.IMDBID }}4{{ else }}{{ end }}{{ if .Query.DoubanID }}1{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }}{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + # does not return imdb or doubanid in results + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td:nth-child(5) + seeders: + selector: td:nth-child(6) + leechers: + selector: td:nth-child(7) + grabs: + selector: td:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumratio: + text: 1 + minimumseedtime: + # 1 day (as seconds = 24 x 60 x 60) + text: 86400 + description: + selector: td:nth-child(2) + remove: a, b, font, img, span +# NexusPHP Standard v1.5 Beta 4 diff --git a/config/prowlarr/Definitions/Bittorrentfiles.yml b/config/prowlarr/Definitions/Bittorrentfiles.yml new file mode 100644 index 0000000..014f463 --- /dev/null +++ b/config/prowlarr/Definitions/Bittorrentfiles.yml @@ -0,0 +1,236 @@ +--- +id: Bittorrentfiles +name: Bittorrentfiles +description: "Bittorrentfiles is a Private GERMAN tracker" +language: de-DE +type: private +encoding: UTF-8 +links: + - https://bittorrentfiles.me/ +legacylinks: + - https://www.Bittorrentfiles.me/ + +caps: + categorymappings: + # Movie + - {id: 48, cat: Movies/HD, desc: "Movie 1080p"} + - {id: 31, cat: Movies/3D, desc: "Movie 3D"} + - {id: 21, cat: Movies/HD, desc: "Movie 720p"} + - {id: 28, cat: Movies/SD, desc: "Movie AVI"} + - {id: 20, cat: Movies/DVD, desc: "Movie DVD-R"} + - {id: 40, cat: Movies/HD, desc: Movie "h264/x264"} + - {id: 30, cat: Movies/HD, desc: "Movie HD/BD"} + - {id: 49, cat: Movies/Foreign, desc: "Movie International"} + - {id: 78, cat: Movies/UHD, desc: "Movie UHD"} + - {id: 85, cat: Movies/HD, desc: "Movie x265"} + # Serien + - {id: 79, cat: TV/HD, desc: "Staffeln HD"} + - {id: 56, cat: TV/SD, desc: "Staffeln SD"} + - {id: 88, cat: TV/UHD, desc: "Staffeln UHD"} + - {id: 86, cat: TV/UHD, desc: "Folgen UHD"} + - {id: 54, cat: TV/HD, desc: "Folgen HD"} + - {id: 80, cat: TV/HD, desc: "Folgen HD/BD"} + - {id: 7, cat: TV/SD, desc: "Folgen SD"} + - {id: 55, cat: TV/Foreign, desc: "Folgen International"} + # Doku + - {id: 91, cat: TV/Documentary, desc: "Doku UHD"} + - {id: 64, cat: TV/Documentary, desc: "Doku HD"} + - {id: 36, cat: TV/Documentary, desc: "Doku SD"} + - {id: 81, cat: TV/Documentary, desc: "Doku 3D"} + - {id: 82, cat: TV/Documentary, desc: "Doku Packs"} + # Spiele + - {id: 4, cat: PC/Games, desc: "Spiele Windows"} + - {id: 92, cat: PC/Mac, desc: "Spiele Mac"} + - {id: 93, cat: PC, desc: "Spiele Linux"} + - {id: 97, cat: Console/XBox, desc: "Spiele XBOX"} + - {id: 94, cat: PC/Mobile-Other, desc: "Spiele Mobile"} + - {id: 95, cat: Console/NDS, desc: "Spiele Nintendo"} + - {id: 96, cat: Console/PSP, desc: "Spiele Playstation"} + - {id: 42, cat: Console/Other, desc: "Spiele Andere"} + # Musik + - {id: 66, cat: Audio, desc: "Musik Alben"} + - {id: 75, cat: Audio, desc: "Musik Singles"} + - {id: 50, cat: Audio, desc: "Musik Charts"} + - {id: 52, cat: Audio, desc: "Musik Packs"} + - {id: 53, cat: Audio/Video, desc: "Musik Video"} + - {id: 61, cat: Audio/Video, desc: "Musik DVD-R"} + - {id: 83, cat: Audio/Lossless, desc: "Musik Flac"} + - {id: 68, cat: Audio, desc: "Musik Live"} + - {id: 6, cat: Audio, desc: "Musik Misc"} + - {id: 51, cat: Audio, desc: "Musik OST"} + - {id: 67, cat: Audio, desc: "Musik Sampler"} + # App + - {id: 98, cat: PC/0day, desc: "App Windows"} + - {id: 62, cat: PC/Mac, desc: "App Mac OS"} + - {id: 63, cat: PC/0day, desc: "App Linux"} + - {id: 34, cat: PC, desc: "App Andere"} + # Sport + - {id: 74, cat: TV/Sport, desc: "Sport HD"} + - {id: 39, cat: TV/Sport, desc: "Sport SD"} + # Sonstiges + - {id: 41, cat: Audio/Audiobook, desc: "Sonstiges A-Book"} + - {id: 33, cat: TV/Anime, desc: "Sonstiges Anime"} + - {id: 35, cat: Books/EBook, desc: "Sonstiges e-Book-DE"} + - {id: 90, cat: Books/EBook, desc: "Sonstiges e-Book-INT"} + - {id: 65, cat: Other, desc: "Sonstiges E-Learning"} + - {id: 37, cat: PC, desc: "Sonstiges Mobile"} + - {id: 87, cat: Books/Mags, desc: "Sonstiges E-Paper"} + - {id: 38, cat: Other, desc: "Sonstiges Kids"} + - {id: 47, cat: Other, desc: "Sonstiges Line"} + - {id: 9, cat: Other, desc: "Sonstiges Andere"} + # XXX + - {id: 58, cat: XXX/x264, desc: "XXX HD"} + - {id: 46, cat: XXX, desc: "XXX Hentai"} + - {id: 59, cat: XXX/Pack, desc: "XXX Pack"} + - {id: 27, cat: XXX/SD, desc: "XXX SD"} + - {id: 76, cat: XXX, desc: "XXX Andere"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: user + type: text + label: Username + - name: pass + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeds: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_account + type: info + label: Account Settings + default: In order to see the correct date and size in the torrent rows, change the Torrentliste: setting to Modern on your account profile. + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: signin.php + method: post + inputs: + user: "{{ .Config.user }}" + pass: "{{ .Config.pass }}" + returnto: "%2Fbrowse.php" + error: + - selector: .error + test: + path: index.php + selector: a[href^="/logout.php?c="] + +search: + path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # 0=title, 1=descr, 2=nfo, 3=all, 4=imdb + search_where: "{{ if .Query.IMDBID }}3{{ else }}0{{ end }}" + # 0=active, 1=all, 2=onlydead, 4=only upload, 5=doubleup, 6=halfdown, 7=highlight, 8=request + status: "{{ if .Config.freeleech }}4{{ else }}1{{ end }}" + orderby: "{{ .Config.sort }}" + sort: "{{ .Config.type }}" + + rows: + selector: table.tableinborder > tbody > tr:has(a[href^="/download.php"]) + + fields: + category: + selector: a[href^="/browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php"] + attribute: title + details: + selector: a[href^="details.php"] + attribute: href + download: + selector: a[href^="/download.php"] + attribute: href + grabs: + selector: a[title="Snatcher"] + optional: true + default: 0 + files: + selector: a[title="Files"] + optional: true + default: 0 + size: + selector: td:nth-child(6) + seeders: + selector: a[title="Seeder"] + optional: true + default: 0 + leechers: + selector: a[title="Leecher"] + optional: true + default: 0 + # 2 flavours of dates + date_day: + # Heute 13:30:04 + # Gestern 09:10:10 + selector: td:nth-child(10):contains("Heute"), td:nth-child(10):contains("Gestern") + optional: true + filters: + - name: split + args: ["b", 0] + - name: replace + args: ["Heute", "Today"] + - name: replace + args: ["Gestern", "Yesterday"] + - name: append + args: " +01:00" # CET + date_year: + # 30.02.2018 23:12:50 + selector: td:nth-child(10):contains("."):contains(":") + optional: true + filters: + - name: split + args: ["b", 0] + - name: append + args: " +01:00" # CET + - name: dateparse + args: "dd.MM.yyyy HH:mm:ss zzz" + date: + text: "{{ if or .Result.date_year .Result.date_day }}{{ or .Result.date_year .Result.date_day }}{{ else }}now{{ end }}" + downloadvolumefactor: + case: + img[alt="OU"]: 0 + img[alt="D/2"]: 0.5 + img[alt="D / 2"]: 0.5 + "*": 1 + uploadvolumefactor: + case: + img[alt="2xU"]: 2 + "*": 1 + minimumratio: + text: 0.8 + minimumseedtime: + # 60 hours (as seconds = 60 x 60 x 60) + text: 216000 +# engine n/a diff --git a/config/prowlarr/Definitions/abnormal.yml b/config/prowlarr/Definitions/abnormal.yml new file mode 100644 index 0000000..8c914af --- /dev/null +++ b/config/prowlarr/Definitions/abnormal.yml @@ -0,0 +1,173 @@ +--- +id: abnormal +name: Abnormal +description: "General French Private Tracker" +language: fr-FR +type: private +encoding: UTF-8 +requestDelay: 2.1 +links: + - https://abn.lol/ +legacylinks: + - https://abnormal.ws + +caps: + categorymappings: + - {id: 1, cat: TV, desc: "Series"} + - {id: 2, cat: Movies, desc: "Movies"} + - {id: 3, cat: TV/Documentary, desc: "Documentaries"} + - {id: 4, cat: TV/Anime, desc: "Anime"} + - {id: 5, cat: PC/Games, desc: "Games"} + - {id: 6, cat: PC, desc: "Applications"} + - {id: 7, cat: Books/EBook, desc: "Ebooks"} + - {id: 9, cat: TV, desc: "Emissions"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: multilang + type: checkbox + label: Replace MULTi by another language in release name + default: false + - name: multilanguage + type: select + label: Replace MULTi by this language + default: FRENCH + options: + FRENCH: FRENCH + MULTi.FRENCH: MULTi.FRENCH + ENGLISH: ENGLISH + MULTi.ENGLISH: MULTi.ENGLISH + VOSTFR: VOSTFR + MULTi.VOSTFR: MULTi.VOSTFR + - name: vostfr + type: checkbox + label: Replace VOSTFR and SUBFRENCH with ENGLISH + default: false + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: Created + options: + Created: created + Seeders: seeders + Size: size + ReleaseName: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + method: form + path: Home/Login + form: "#account" + inputs: + Username: "{{ .Config.username }}" + Password: "{{ .Config.password }}" + RememberMe: true + selectorinputs: + __RequestVerificationToken: + selector: input[name="__RequestVerificationToken"] + attribute: value + error: + - selector: div.validation-summary-errors[data-valmsg-summary="true"] + message: + text: " - Bad username/password." + test: + path: / + selector: form#logoutForm + +search: + paths: + - path: Torrent + inputs: + $raw: "{{ range .Categories }}SelectedCats={{.}}&{{end}}" + Search: "{{ .Keywords }}" + UserId: "" + YearOperator: ≥ + Year: "" + RatingOperator: ≥ + Rating: "" + Pending: "" + Pack: "" + Scene: "" + Freeleech: "{{ if .Config.freeleech }}true{{ else }}{{ end }}" + SortOn: "{{ .Config.sort }}" + SortOrder: "{{ .Config.type }}" + + rows: + selector: table.table-rows > tbody > tr:has(a[href^="/Torrent/Download?ReleaseId="]) + + fields: + category: + selector: a[href^="/Torrent?SelectedCats="] + attribute: href + filters: + - name: querystring + args: SelectedCats + title_phase1: + selector: td.grid-release-column > a + title_vostfr: + text: "{{ .Result.title_phase1 }}" + filters: + - name: re_replace + args: ["(?i)\\b(vostfr|subfrench)\\b", "ENGLISH"] + title_phase2: + text: "{{ if .Config.vostfr }}{{ .Result.title_vostfr }}{{ else }}{{ .Result.title_phase1 }}{{ end }}" + title_multilang: + text: "{{ .Result.title_phase2 }}" + filters: + - name: re_replace + args: ["(?i)\\b(MULTI(?!.*(?:FRENCH|ENGLISH|VOSTFR)))\\b", "{{ .Config.multilanguage }}"] + title: + text: "{{ if .Config.multilang }}{{ .Result.title_multilang }}{{ else }}{{ .Result.title_phase2 }}{{ end }}" + details: + selector: a[href^="/Torrent/Details?ReleaseId="] + attribute: href + download: + selector: a[href^="/Torrent/Download?ReleaseId="] + attribute: href + date: + text: now + size: + selector: td:nth-child(6) + filters: + - name: re_replace + args: [",", "."] + - name: replace + args: ["o", "B"] + seeders: + selector: td:nth-child(7) + leechers: + selector: td:nth-child(8) + downloadvolumefactor: + case: + img[title="Freeleech"]: 0 + "*": 1 + uploadvolumefactor: + case: + "*": 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 4 days (as seconds = 4 x 24 x 60 x 60) + text: 345600 +# Gazelle diff --git a/config/prowlarr/Definitions/abtorrents.yml b/config/prowlarr/Definitions/abtorrents.yml new file mode 100644 index 0000000..f70efd6 --- /dev/null +++ b/config/prowlarr/Definitions/abtorrents.yml @@ -0,0 +1,178 @@ +--- +id: abtorrents +name: ABtorrents +description: "ABtorrents (ABT) is a Private Torrent Tracker for AUDIOBOOKS" +language: en-US +type: private +encoding: UTF-8 +links: + - https://abtorrents.me/ + +caps: + categorymappings: + - {id: 10, cat: Audio/Audiobook, desc: "Action/Adventure"} + - {id: 20, cat: Audio/Audiobook, desc: "Biography/Memoirs"} + - {id: 30, cat: Audio/Audiobook, desc: "Business "} + - {id: 40, cat: Audio/Audiobook, desc: "Childrens"} + - {id: 50, cat: Audio/Audiobook, desc: "Humor (Comedy)"} + - {id: 60, cat: Audio/Audiobook, desc: "Comics"} + - {id: 70, cat: Audio/Audiobook, desc: "Computers "} + - {id: 80, cat: Audio/Audiobook, desc: "Adult/Erotica"} + - {id: 90, cat: Audio/Audiobook, desc: "Fantasy-General"} + - {id: 100, cat: Audio/Audiobook, desc: "Fantasy-Youth"} + - {id: 110, cat: Audio/Audiobook, desc: "Files"} + - {id: 120, cat: Audio/Audiobook, desc: "Foreign Language"} + - {id: 130, cat: Audio/Audiobook, desc: "General Fiction"} + - {id: 140, cat: Audio/Audiobook, desc: "Historical Fiction"} + - {id: 150, cat: Audio/Audiobook, desc: "History"} + - {id: 160, cat: Audio/Audiobook, desc: "Horror"} + - {id: 170, cat: Audio/Audiobook, desc: "Literature"} + - {id: 175, cat: Audio/Audiobook, desc: "LitRPG"} + - {id: 180, cat: Audio/Audiobook, desc: "Mystery "} + - {id: 190, cat: Audio/Audiobook, desc: "Non-Fiction"} + - {id: 200, cat: Audio/Audiobook, desc: "Radio Drama"} + - {id: 210, cat: Audio/Audiobook, desc: "Romance"} + - {id: 220, cat: Audio/Audiobook, desc: "Science"} + - {id: 230, cat: Audio/Audiobook, desc: "Science Fiction "} + - {id: 240, cat: Audio/Audiobook, desc: "Sci-Fi Apocalypse"} + - {id: 250, cat: Audio/Audiobook, desc: "Self Improvement"} + - {id: 270, cat: Audio/Audiobook, desc: "Suspense"} + - {id: 280, cat: Audio/Audiobook, desc: "Talk Radio"} + - {id: 260, cat: Audio/Audiobook, desc: "Crime/Thriller/Mystery"} + - {id: 290, cat: Audio/Audiobook, desc: "Urban Fantasy"} + - {id: 300, cat: Audio/Audiobook, desc: "Western"} + - {id: 400, cat: Books/EBook, desc: "[E] Action/Adventure"} + - {id: 410, cat: Books/EBook, desc: "[E] Adult / Erotica"} + - {id: 420, cat: Books/EBook, desc: "[E] Arts & Crafts (Hobbies)"} + - {id: 430, cat: Books/EBook, desc: "[E] Biography/Memoirs"} + - {id: 730, cat: Books/EBook, desc: "[E] Collections"} + - {id: 440, cat: Books/EBook, desc: "[E] Comic Books"} + - {id: 450, cat: Books/EBook, desc: "[E] Computer Learning"} + - {id: 460, cat: Books/EBook, desc: "[E] Cookery"} + - {id: 470, cat: Books/EBook, desc: "[E] Crime/Thriller/Mystery"} + - {id: 480, cat: Books/EBook, desc: "[E] Fantasy"} + - {id: 490, cat: Books/EBook, desc: "[E] Forteana"} + - {id: 500, cat: Books/EBook, desc: "[E] General Fiction"} + - {id: 510, cat: Books/EBook, desc: "[E] Historical Fiction"} + - {id: 520, cat: Books/EBook, desc: "[E] History/Documentary"} + - {id: 530, cat: Books/EBook, desc: "[E] Horror"} + - {id: 540, cat: Books/EBook, desc: "[E] Humor (Comedy)"} + - {id: 550, cat: Books/EBook, desc: "[E] LGBT"} + - {id: 560, cat: Books/EBook, desc: "[E] Literary Fiction"} + - {id: 565, cat: Books/EBook, desc: "[E] LitRPG"} + - {id: 570, cat: Books/EBook, desc: "[E] Magazines - all"} + - {id: 580, cat: Books/EBook, desc: "[E] Non-Fiction"} + - {id: 585, cat: Books/EBook, desc: "[E] Other Languages"} + - {id: 590, cat: Books/EBook, desc: "[E] Paranormal Romance"} + - {id: 600, cat: Books/EBook, desc: "[E] Reference/Educational"} + - {id: 610, cat: Books/EBook, desc: "[E] Religion and Spirituality"} + - {id: 620, cat: Books/EBook, desc: "[E] Romance"} + - {id: 630, cat: Books/EBook, desc: "[E] Sci-Fi"} + - {id: 640, cat: Books/EBook, desc: "[E] Sci-Fi/Apocalyptic"} + - {id: 650, cat: Books/EBook, desc: "[E] Self-Help"} + - {id: 660, cat: Books/EBook, desc: "[E] Sports/Fitness"} + - {id: 670, cat: Books/EBook, desc: "[E] Travel"} + - {id: 680, cat: Books/EBook, desc: "[E] Unsorted"} + - {id: 690, cat: Books/EBook, desc: "[E] Urban Fantasy/Paranormal"} + - {id: 700, cat: Books/EBook, desc: "[E] Western"} + - {id: 710, cat: Books/EBook, desc: "[E] Young Adult"} + - {id: 720, cat: Books/EBook, desc: "[E] Young Children"} + + modes: + search: [q] + book-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: info_results + type: info + label: Search results + default: "If you are getting the error Login Failed, got redirected then access the site with your browser and mark as read all PMs." + +login: + method: cookie + test: + path: index.php + selector: a[href*="logout.php?hash_please="] + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # title, descr + searchin: title + # 0 active, 1 incldead, 2 onlydead + incldead: 1 + # 1 onlyfree, null all + only_free: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + + rows: + selector: table.table-striped > tbody > tr:has(a[href^="download.php?torrent="]) + + fields: # some users (rank specific?) have an extra column (td:nth-child(4)) with bookmark features + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + remove: span + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?torrent="] + attribute: href + files: + selector: a[href^="filelist.php?id="] + date_day: + # auto adjusted by site account profile + # Yesterday, 6:00 AM + selector: td:nth-last-child(5) > span[title*="day"] + attribute: title + optional: true + filters: + - name: fuzzytime + date_year: + # auto adjusted by site account profile + # Aug 6 2021, 7:25 PM + selector: td:nth-last-child(5) > span[title]:not([title*="day"]) + attribute: title + optional: true + filters: + - name: dateparse + args: "MMM d yyyy, h:mm tt" + date: + text: "{{ if or .Result.date_day .Result.date_year }}{{ or .Result.date_day .Result.date_year }}{{ else }}now{{ end }}" + size: + selector: td:nth-last-child(4) + grabs: + selector: a[href^="snatches.php?id="] + seeders: + selector: td:nth-last-child(3) div:nth-last-child(2) + leechers: + selector: td:nth-last-child(3) div:last-child + downloadvolumefactor: + case: + tr.freeleech_color: 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumseedtime: + # 14 days (as seconds = 14 x 24 x 60 x 60) + text: 1209600 +# U-232 V4.5 diff --git a/config/prowlarr/Definitions/acgrip.yml b/config/prowlarr/Definitions/acgrip.yml new file mode 100644 index 0000000..42f2f39 --- /dev/null +++ b/config/prowlarr/Definitions/acgrip.yml @@ -0,0 +1,59 @@ +--- +id: acgrip +name: ACG.RIP +description: "ACG.RIP is a CHINESE Public torrent tracker for the latest anime and Japanese related torrents" +language: zh-CN +type: public +followredirect: true +encoding: UTF-8 +links: + - https://acg.rip/ + +caps: + categories: + 1: TV + + modes: + search: [q] + tv-search: [q, season, ep] + +settings: [] + +search: + paths: + - path: / + inputs: + term: "{{ .Keywords }}" + + rows: + selector: tbody tr + + fields: + title: + selector: td.title > span.title a + category: + text: 1 + details: + selector: td.title > span.title a + attribute: href + download: + selector: td.action a + attribute: href + size: + selector: td.size + seeders: + selector: td.peers div.seed + leechers: + selector: td.peers div.leech + grabs: + selector: td.peers div.done + date: + selector: td.date time + attribute: datetime + filters: + - name: fuzzytime + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/acidlounge.yml b/config/prowlarr/Definitions/acidlounge.yml new file mode 100644 index 0000000..128833d --- /dev/null +++ b/config/prowlarr/Definitions/acidlounge.yml @@ -0,0 +1,186 @@ +--- +id: acidlounge +name: Acid-Lounge +description: "Acid Lounge (A-L) is a Private Torrent Tracker for 0DAY / GENERAL" +language: en-US +type: private +encoding: UTF-8 +certificates: + - ed11f0187f4aafad54382796f112ecf4bec5d76b # Expired 28 Oct 2023 +links: + - https://www.acid-lounge.org.uk/ + +caps: + categorymappings: + - {id: 79, cat: PC/Mobile-Android, desc: "Android"} + - {id: 61, cat: TV/Anime, desc: "Anime"} + - {id: 55, cat: PC/0day, desc: "Appz/0-Day"} + - {id: 59, cat: PC/Mac, desc: "Appz/Mac"} + - {id: 22, cat: PC, desc: "Appz/Misc"} + - {id: 32, cat: PC, desc: "Appz/PC"} + - {id: 48, cat: Audio/Audiobook, desc: "Audio/Books"} + - {id: 84, cat: Other, desc: "Damaged Torrent"} + - {id: 14, cat: Books/EBook, desc: "eBooks"} + - {id: 82, cat: Books/Comics, desc: "eBooks/Comics"} + - {id: 81, cat: Books/Mags, desc: "eBooks/Mags"} + - {id: 60, cat: PC/Mac, desc: "Games/Mac"} + - {id: 54, cat: Console/NDS, desc: "Games/NDS"} + - {id: 4, cat: PC/Games, desc: "Games/PC"} + - {id: 42, cat: Console/PS3, desc: "Games/PS3"} + - {id: 56, cat: Console/Wii, desc: "Games/Wii"} + - {id: 36, cat: Console/XBox 360, desc: "Games/xbox360"} + - {id: 69, cat: Other, desc: "Halloween"} + - {id: 80, cat: PC/Mobile-iOS, desc: "iPhone / iPad"} + - {id: 46, cat: Other, desc: "Kids"} + - {id: 63, cat: PC, desc: "Linux"} + - {id: 49, cat: Other, desc: "Misc"} + - {id: 77, cat: Movies/3D, desc: "Movies/3D BLURAY"} + - {id: 73, cat: Movies/HD, desc: "Movies/Boxsets HD"} + - {id: 74, cat: Movies/SD, desc: "Movies/Boxsets SD"} + - {id: 25, cat: Movies/DVD, desc: "Movies/DVD-R"} + - {id: 51, cat: Movies/HD, desc: "Movies/HD"} + - {id: 26, cat: Movies, desc: "Movies/Retro"} + - {id: 29, cat: Movies/SD, desc: "Movies/SD"} + - {id: 52, cat: Movies/SD, desc: "Movies/WMV"} + - {id: 85, cat: Movies/HD, desc: "Movies/X265"} + - {id: 66, cat: Audio/Lossless, desc: "Music/Flac"} + - {id: 35, cat: Audio/MP3, desc: "Music/MP3"} + - {id: 31, cat: Audio/Video, desc: "Music/Videos"} + - {id: 72, cat: Movies, desc: "Sci-Fi"} + - {id: 83, cat: Movies, desc: "Tribute Packs"} + - {id: 30, cat: TV, desc: "TV"} + - {id: 50, cat: TV/HD, desc: "TV-HD/X264"} + - {id: 71, cat: TV/SD, desc: "TV-SD/X264"} + - {id: 75, cat: TV/HD, desc: "TV/Boxsets HD"} + - {id: 76, cat: TV/SD, desc: "TV/Boxsets SD"} + - {id: 37, cat: XXX, desc: "XXX"} + - {id: 68, cat: XXX, desc: "XXX/0-Day"} + - {id: 78, cat: XXX, desc: "XXX/3D"} + - {id: 67, cat: XXX/ImageSet, desc: "XXX/Imagesets"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: dateAdded + options: + dateAdded: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: Main/?act=Login + method: form + form: form#login + captcha: + type: image + selector: img[alt="Security code"] + input: code + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: div.errorWrap + test: + path: index.php + selector: a[href$="logout.php"] + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}cat[]={{.}}&{{end}}" + search: "{{ .Keywords }}" + # alive, aliveanddead, nobot, dead, free, nuked + status: "{{ if .Config.freeleech }}free{{ else }}aliveanddead{{ end }}" + # title, desc, both + search_type: title + sort: "{{ .Config.sort }}" + order: "{{ .Config.type }}" + + rows: + selector: table#browse_torrents_table > tbody > tr[id^="torrent_row_"] + + fields: + category: + selector: a[href^="browse.php?cat[]="] + attribute: href + filters: + - name: querystring + args: cat[] + title: + selector: a.torrent_name + attribute: title + details: + selector: a.torrent_name + attribute: href + download: + selector: a[href^="download.php?"] + attribute: href + description: + selector: span.torrent_small_desc + genre: + selector: span.torrent_small_desc + filters: + - name: regexp + args: "\\[.+?\\] \\[(.+?)\\]" + - name: replace + args: [" ", "_"] + files: + selector: td.torrent_table_files + date: + selector: td.torrent_table_dateAdded + filters: + - name: append + args: " +01:00" # CET + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + size: + selector: td.torrent_table_size + grabs: + selector: td.torrent_table_snatched + filters: + - name: regexp + args: (\d+) + seeders: + selector: td.torrent_table_seeders + leechers: + selector: td.torrent_table_leechers + downloadvolumefactor: + case: + ":root div#notice_ratioBoostingMadness": 0 + img[src$="images/freedownload.gif"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 5 day (as seconds = 5 x 24 x 60 x 60) + text: 432000 # 3 days for torrents under 20GB +# engine n/a diff --git a/config/prowlarr/Definitions/acrossthetasman.yml b/config/prowlarr/Definitions/acrossthetasman.yml new file mode 100644 index 0000000..5e46c4a --- /dev/null +++ b/config/prowlarr/Definitions/acrossthetasman.yml @@ -0,0 +1,90 @@ +--- +id: acrossthetasman +name: Across The Tasman +description: "ATT is a torrent site for Rugby and other sports played in Australia" +language: en-AU +type: private +encoding: UTF-8 +links: + - https://acrossthetasman.com/ + +caps: + categories: + 1: TV/Sport + + modes: + search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: sort + type: select + label: Sort requested from site + default: date + options: + date: created + filename: title + size: size + seeders: seeders + - name: order + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + method: post + path: login.php + inputs: + vb_login_username: "{{ .Config.username }}" + vb_login_password: "{{ .Config.password }}" + cookieuser: 1 + do: login + test: + path: torrents.php + selector: a[href*="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + sort: "{{ .Config.sort }}" + order: "{{ .Config.order }}" + query: "{{ .Keywords }}" + + rows: + selector: table[width='100%'][align='center']:not([class]) > tbody > tr + + fields: + category: + text: 1 + date: + # Feb 12, 2021 + selector: td:nth-child(1) + filters: + - name: dateparse + args: "MMM dd, yyyy" + title: + selector: td:nth-child(4) > span:nth-child(1) + filters: + - name: re_replace + args: ["[\\s]+Uploaded.*", ""] + download: + selector: a[href*="attachment.php?attachmentid="] + attribute: href + seeders: + selector: td:nth-child(5) + leechers: + selector: td:nth-child(6) + grabs: + selector: td:nth-child(7) + size: + selector: td:nth-child(10) +# engine n/a diff --git a/config/prowlarr/Definitions/aftershock.yml b/config/prowlarr/Definitions/aftershock.yml new file mode 100644 index 0000000..2f6ac49 --- /dev/null +++ b/config/prowlarr/Definitions/aftershock.yml @@ -0,0 +1,182 @@ +--- +id: aftershock +name: Aftershock +description: "Aftershock is a HUNGARIAN Private Torrent Tracker for MOVIES / GENERAL" +language: hu-HU +type: private +encoding: iso-8859-1 +links: + - https://aftershock-tracker.net/ +legacylinks: + - https://aftershock-tracker.eu/ + +caps: + categorymappings: + - {id: 7, cat: Movies/SD, desc: "XvidEng"} + - {id: 2, cat: Movies, desc: "AfterShock Release"} + - {id: 190, cat: Movies/DVD, desc: "DVD-9Eng"} + - {id: 191, cat: Movies/DVD, desc: "DVD-9Hun"} + - {id: 1, cat: Movies/DVD, desc: "DVDEng"} + - {id: 4, cat: Movies/DVD, desc: "DVDHun"} + - {id: 23, cat: Books/EBook, desc: "E-Book"} + - {id: 3, cat: Movies, desc: "Film Pack"} + - {id: 185, cat: Audio/Lossless, desc: "FLACeng"} + - {id: 188, cat: Audio/Lossless, desc: "FLAChu"} + - {id: 173, cat: Audio/Audiobook, desc: "Hangoskönyv"} + - {id: 34, cat: Movies/HD, desc: "HDEng"} + - {id: 33, cat: Movies/HD, desc: "HDHun"} + - {id: 182, cat: XXX/x264, desc: "HDXXX"} + - {id: 12, cat: PC/Games, desc: "JátékIso"} + - {id: 130, cat: Console, desc: "JátékKonzol"} + - {id: 38, cat: Console/PSP, desc: "JátékPS2"} + - {id: 44, cat: Console, desc: "Jatekrip"} + - {id: 131, cat: Console/XBox, desc: "JátékX-box"} + - {id: 140, cat: Other, desc: "Képek"} + - {id: 141, cat: Other, desc: "Klipek"} + - {id: 154, cat: Other, desc: "MeseEng"} + - {id: 155, cat: Other, desc: "MeseHun"} + - {id: 176, cat: Other, desc: "Mikro HDEng"} + - {id: 174, cat: Other, desc: "Mikro HDHun"} + - {id: 37, cat: PC/Mobile-Other, desc: "MobilPDA"} + - {id: 35, cat: PC, desc: "ProgramEgyéb"} + - {id: 170, cat: PC/ISO, desc: "ProgramIso"} + - {id: 24, cat: TV, desc: "Sorozat Eng"} + - {id: 25, cat: TV, desc: "Sorozat Hun"} + - {id: 167, cat: Movies/SD, desc: "Xvid CamEng"} + - {id: 166, cat: Movies/SD, desc: "Xvid CamHun"} + - {id: 9, cat: Movies/SD, desc: "XvidHun"} + - {id: 169, cat: XXX/ImageSet, desc: "XXX Képek"} + - {id: 39, cat: XXX, desc: "XXXFilm"} + - {id: 28, cat: Audio, desc: "ZeneEng"} + - {id: 29, cat: Audio, desc: "ZeneHun"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 0 + options: + 0: created + 6: seeders + 4: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: td.text:contains("Hiba") + message: + selector: td.text + test: + path: / + selector: a[href="/logout.php"] + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 active, 1 incldead, 2 onlydead, 3 freeleech, 4 2x, 5 server + incldead: "{{ if .Config.freeleech }}3{{ else }}1{{ end }}" + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + + rows: + selector: table tbody#torrent_background tr:has(a.index) + filters: + - name: andmatch + + fields: + title: + selector: a.index + attribute: href + filters: + - name: querystring + args: name + - name: urldecode + category: + selector: td a[href^="/browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + details: + selector: a.index + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + filters: + - name: urldecode + poster: + selector: a[onmouseover] + attribute: onmouseover + filters: + - name: regexp + args: src=([^\s]+) + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + genre: + selector: span.box + description: + text: "{{ .Result.genre }}" + files: + selector: td:nth-last-child(6) + size: + selector: td:nth-last-child(5) + seeders: + selector: td:nth-last-child(4) + leechers: + selector: td:nth-last-child(3) + grabs: + selector: td:nth-last-child(2) + date: + selector: td font + filters: + - name: re_replace + args: ["\\s", " "] + - name: append + args: " +01:00" # CET + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + downloadvolumefactor: + case: + span.icon_gift: 0 + "*": 1 + uploadvolumefactor: + case: + span.icon_upload: 2 + "*": 1 + minimumratio: + text: 0.31 +# XBT v3 diff --git a/config/prowlarr/Definitions/agsvpt.yml b/config/prowlarr/Definitions/agsvpt.yml new file mode 100644 index 0000000..7fa43e8 --- /dev/null +++ b/config/prowlarr/Definitions/agsvpt.yml @@ -0,0 +1,205 @@ +--- +id: agsvpt +name: AGSVPT +description: "AGSVPT (Arctic Global Seed Vault) is a CHINESE Private Torrent Tracker for MOVIES / TV / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +requestDelay: 2 +links: + - https://abroad.agsvpt.com/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "Movie(电影)", default: true} + - {id: 402, cat: TV, desc: "TV Series(电视剧)", default: true} + - {id: 403, cat: TV, desc: "TV Shows(综艺)", default: true} + - {id: 405, cat: TV/Anime, desc: "Anime(动漫)", default: true} + - {id: 404, cat: TV/Documentary, desc: "Documentaries(纪录片)", default: true} + - {id: 419, cat: TV, desc: "Playlet(短剧)", default: true} + - {id: 411, cat: Audio, desc: "Music(音乐))", default: true} + - {id: 406, cat: Audio/Video, desc: "MV(演唱", default: true} + - {id: 407, cat: TV/Sport, desc: "Sports(体育)", default: true} + - {id: 408, cat: Audio/Audiobook, desc: "Audio(音频)", default: true} + # special + - {id: 413, cat: PC/Games, desc: "Game(游戏)", default: false} + - {id: 416, cat: Books/Comics, desc: "Comic(漫画)", default: false} + - {id: 412, cat: PC/0day, desc: "Software(软件)", default: false} + - {id: 418, cat: Other, desc: "Picture(图片)", default: false} + - {id: 415, cat: Books/EBook, desc: "E-Book(电子书/有声书)", default: false} + - {id: 417, cat: Other, desc: "Education(学习资料)", default: false} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: 2facode + type: text + label: 2FA code + - name: info_2fa + type: info + label: "About 2FA code" + default: "Only fill in the 2FA code box if you have enabled 2FA on the AGSVPT Web Site. Otherwise just leave it empty." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the 每页种子数:每页显示(Torrents per page:) setting to 100 on your account profile. + +login: + path: agsvpt + method: form + form: form[action="takelogin.php"] + inputs: + secret: "" + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + two_step_code: "{{ .Config.2facode }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("失败")) + message: + selector: td.text + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + categories: [401, 402, 403, 405, 404, 419, 411, 406, 407, 408] + - path: special.php + categories: [413, 416, 412, 418, 415, 417] + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl + search_area: "{{ if .Query.IMDBID }}4{{ else }}{{ end }}{{ if .Query.DoubanID }}1{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }}{{ else }}0{{ end }}" + # 0 AND, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: img[data-src] + attribute: data-src + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-child(5) + seeders: + selector: td.rowfollow:nth-child(6) + leechers: + selector: td.rowfollow:nth-child(7) + grabs: + selector: td.rowfollow:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 3 days (as seconds = 3 x 24 x 60 x 60) + text: 259200 + description_verified: + case: + span[title="通过"]: "Verified:" + span[title="未审"]: "Unverified:" + span[title="拒绝"]: "Banned:" + description: + selector: td.rowfollow:nth-child(2) + remove: a, b, font, img, span + filters: + - name: prepend + args: "{{ .Result.description_verified }} " +# NexusPHP v1.8.8 2023-09-25 diff --git a/config/prowlarr/Definitions/aidoruonline.yml b/config/prowlarr/Definitions/aidoruonline.yml new file mode 100644 index 0000000..fb4b7eb --- /dev/null +++ b/config/prowlarr/Definitions/aidoruonline.yml @@ -0,0 +1,133 @@ +--- +id: aidoruonline +name: Aidoru!Online +description: "Aidoru!Online is a Private Torrent Tracker for Female Japanese Idol related files" +language: en-US +type: private +encoding: UTF-8 +links: + - https://aidoru-online.me/ +legacylinks: + - https://aidoru-online.org/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "BD/DVDISO"} + - {id: 2, cat: Movies, desc: "BD/DVD-RIP"} + - {id: 3, cat: TV, desc: "TV"} + - {id: 4, cat: TV, desc: "Perf"} + - {id: 5, cat: TV, desc: "PV"} + - {id: 6, cat: TV, desc: "Webstream"} + - {id: 7, cat: Other, desc: "Image"} + - {id: 8, cat: Audio, desc: "Audio"} + - {id: 9, cat: Audio, desc: "Album"} + - {id: 10, cat: Audio, desc: "Single"} + - {id: 11, cat: Audio, desc: "Radio"} + - {id: 12, cat: Other, desc: "Misc"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: id + options: + id: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: / + selector: a[href^="torrents-details.php?id="] + +search: + paths: + # https://aidoru-online.me/get_ttable.php?pcat=Show+All&scat=3%2C4%2C5%2C6&subbed=&fl=&resd=&p=0&searchstr=peace&deadlive=0&sortcol=id&sortorder=desc&startdt=&enddt= + - path: get_ttable.php + inputs: + pcat: "Show+All" + scat: "{{ join .Categories \",\" }}" + subbed: "" + fl: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + resd: "" + p: 0 + searchstr: "{{ .Keywords }}" + deadlive: 1 + sortcol: "{{ .Config.sort }}" + sortorder: "{{ .Config.type }}" + startdt: "" + enddt: "" + # does not support imdbid search and does not return imdb link in results + + rows: + selector: table.ttable_headinner tr.t-row:has(a[href^="download.php?id="]) + + fields: + categorydesc: + selector: a.category-link + filters: + - name: split + args: [" ", 1] + title: + selector: a[href^="torrents-details.php?id="] + attribute: title + details: + selector: a[href^="torrents-details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + size: + selector: td.ttable_size + seeders: + selector: td:nth-last-child(4) + leechers: + selector: td:nth-last-child(3) + grabs: + selector: td:nth-last-child(2) + date: + selector: td:last-child + # auto adjusted by site account profile + filters: + - name: dateparse + args: "yyMMdd HH:mm:ss" + downloadvolumefactor: + case: + img[src="images/freeleech.png"]: 0 # dl not counted + img[src="images/freeleech2.png"]: 0 # dl not counted & upload 2x + "*": 1 + uploadvolumefactor: + case: + img[src="images/freeleech2.png"]: 2 + "*": 1 + minimumratio: + text: 0.8 +# TorrentTrader v2-svn diff --git a/config/prowlarr/Definitions/aither-api.yml b/config/prowlarr/Definitions/aither-api.yml new file mode 100644 index 0000000..57911bd --- /dev/null +++ b/config/prowlarr/Definitions/aither-api.yml @@ -0,0 +1,169 @@ +--- +id: aither-api +name: Aither (API) +description: "Aither is a Private Torrent Tracker for HD MOVIES / TV" +language: en-US +type: private +encoding: UTF-8 +links: + - https://aither.cc/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Movie"} + - {id: 9, cat: TV/Sport, desc: "Sport"} + - {id: 2, cat: TV, desc: "TV"} + - {id: 3, cat: Audio, desc: "Music"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + music-search: [q] + book-search: [q] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your Aither account My Settings page and clicking on the API Key tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + inputs: {} # TODO: remove in v10 + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: "/api/torrents/filter" + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + # if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6 + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + seasonNumber: "{{ .Query.Season }}" + episodeNumber: "{{ .Query.Ep }}" + imdbId: "{{ .Query.IMDBIDShort }}" + tmdbId: "{{ .Query.TMDBID }}" + tvdbId: "{{ .Query.TVDBID }}" + "free[]": "{{ if .Config.freeleech }}100{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + + rows: + selector: data + attribute: attributes + + fields: + category: + selector: category_id + title: + selector: name + details: + selector: details_link + download: + selector: download_link + infohash: + selector: info_hash + poster: + selector: meta.poster + filters: + - name: replace + args: ["https://via.placeholder.com/90x135", ""] + imdbid: + selector: imdb_id + tmdbid: + selector: tmdb_id + tvdbid: + selector: tvdb_id + genre: + selector: meta.genres + filters: + - name: re_replace + args: ["(?i)(Science Fiction)", "Science_Fiction"] + - name: re_replace + args: ["(?i)(TV Movie)", "TV_Movie"] + - name: replace + args: [" & ", "_&_"] + description: + text: "{{ .Result.genre }}" + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0%, 25%, 50%, 75%, 100% + selector: freeleech + case: + 0%: 1 # not free + 25%: 0.75 + 50%: 0.5 + 75%: 0.25 + 100%: 0 # freeleech + "*": 0 # catch errors + uploadvolumefactor: + # api returns False, True + selector: double_upload + case: + False: 1 # normal + True: 2 # double +# global MR is 0.4 but torrents must be seeded for 5 days regardless of ratio +# minimumratio: +# text: 0.4 + minimumseedtime: + # 5 days (as seconds = 3 x 24 x 60 x 60) + text: 432000 +# json UNIT3D 7.1.2 diff --git a/config/prowlarr/Definitions/amigosshare.yml b/config/prowlarr/Definitions/amigosshare.yml new file mode 100644 index 0000000..b45c9ce --- /dev/null +++ b/config/prowlarr/Definitions/amigosshare.yml @@ -0,0 +1,331 @@ +--- +id: amigosshare +name: Amigos Share Club +description: "Amigos Share Club is a Brazilian Private site for TV / MOVIES / GENERAL" +language: pt-BR +type: private +encoding: UTF-8 +requestDelay: 2 +links: + - https://cliente.amigos-share.club/ +legacylinks: + - http://amigos-share.club/ + - https://amigos-share.club/ + +caps: + categorymappings: + - {id: 107, cat: XXX, desc: "Adultos: Gay"} + - {id: 75, cat: XXX, desc: "Adultos: Hentai"} + - {id: 108, cat: XXX, desc: "Adultos: Transex/Female"} + - {id: 74, cat: XXX, desc: "Adultos: XXX"} + - {id: 69, cat: TV/Anime, desc: "Anime: Anime"} + - {id: 116, cat: TV/Anime, desc: "Anime: Filmes"} + - {id: 118, cat: TV/Anime, desc: "Anime: Séries"} + - {id: 23, cat: PC/Mobile-Android, desc: "Aplicativos: Android"} + - {id: 27, cat: PC/Mobile-iOS, desc: "Aplicativos: iPad"} + - {id: 26, cat: PC/Mobile-iOS, desc: "Aplicativos: iPhone"} + - {id: 28, cat: PC/Mobile-iOS, desc: "Aplicativos: iPod"} + - {id: 25, cat: PC, desc: "Aplicativos: Linux"} + - {id: 22, cat: PC/Mac, desc: "Aplicativos: Mac"} + - {id: 21, cat: PC/0day, desc: "Aplicativos: Windows"} + - {id: 72, cat: Books, desc: "Apostila: Apostila"} + - {id: 71, cat: Books, desc: "Apostila: Cursos"} + - {id: 121, cat: Audio/Audiobook, desc: "Ebook: Audio-book"} + - {id: 112, cat: Books, desc: "Ebook: HQs"} + - {id: 67, cat: Books, desc: "Ebook: Livros"} + - {id: 68, cat: Books, desc: "Ebook: Revistas"} + - {id: 119, cat: Movies, desc: "Filmes:"} + - {id: 70, cat: XXX, desc: "Fotos: XXX"} + - {id: 57, cat: Console, desc: "Jogos: Android"} + - {id: 52, cat: Console, desc: "Jogos: Dreamcast"} + - {id: 109, cat: Console, desc: "Jogos: Emulação"} + - {id: 61, cat: Console, desc: "Jogos: Emuladores e Roms"} + - {id: 48, cat: PC/Mac, desc: "Jogos: Mac"} + - {id: 58, cat: Console/NDS, desc: "Jogos: Nintendo DS"} + - {id: 110, cat: Console, desc: "Jogos: Nintendo Switch"} + - {id: 47, cat: PC/Games, desc: "Jogos: Pc"} + - {id: 49, cat: Console, desc: "Jogos: Ps1"} + - {id: 50, cat: Console, desc: "Jogos: Ps2"} + - {id: 51, cat: Console/PS3, desc: "Jogos: Ps3"} + - {id: 79, cat: Console/PS4, desc: "Jogos: Ps4"} + - {id: 82, cat: Console/PSP, desc: "Jogos: PSP"} + - {id: 55, cat: Console/Wii, desc: "Jogos: Wii"} + - {id: 54, cat: Console/XBox 360, desc: "Jogos: Xbox360"} + - {id: 56, cat: Console/XBox, desc: "Jogos: Xbox"} + - {id: 78, cat: Console/XBox One, desc: "Jogos: Xbox One"} + - {id: 29, cat: Audio, desc: "Musica: Axé"} + - {id: 38, cat: Audio, desc: "Musica: Blues"} + - {id: 39, cat: Audio, desc: "Musica: Dance"} + - {id: 40, cat: Audio, desc: "Musica: Discografia"} + - {id: 43, cat: Audio, desc: "Musica: Dubstep"} + - {id: 30, cat: Audio, desc: "Musica: Eletronica"} + - {id: 41, cat: Audio, desc: "Musica: Erudita"} + - {id: 42, cat: Audio, desc: "Musica: Forró"} + - {id: 31, cat: Audio, desc: "Musica: Funk"} + - {id: 84, cat: Audio, desc: "Musica: Game (OST)"} + - {id: 83, cat: Audio, desc: "Musica: Gospel"} + - {id: 37, cat: Audio, desc: "Musica: Hard Rock"} + - {id: 33, cat: Audio, desc: "Musica: Hip-Hop"} + - {id: 114, cat: Audio, desc: "Musica: MPB"} + - {id: 77, cat: Audio, desc: "Musica: Outros"} + - {id: 32, cat: Audio, desc: "Musica: Pagode"} + - {id: 115, cat: Audio, desc: "Musica: POP"} + - {id: 34, cat: Audio, desc: "Musica: Rap"} + - {id: 76, cat: Audio, desc: "Musica: Reggae"} + - {id: 36, cat: Audio, desc: "Musica: Rock"} + - {id: 45, cat: Audio, desc: "Musica: Samba"} + - {id: 46, cat: Audio, desc: "Musica: Sertanejo"} + - {id: 120, cat: TV, desc: "Series:"} + - {id: 65, cat: TV, desc: "Shows: Show"} + - {id: 63, cat: TV, desc: "Tv: Aberta"} + - {id: 62, cat: TV/Sport, desc: "Tv: Esportes"} + - {id: 64, cat: TV, desc: "Tv: Fechada"} + - {id: 73, cat: TV, desc: "Video Aula: Video Aula"} + - {id: 127, cat: Other, desc: "Outros: Add-ons"} + - {id: 126, cat: Other, desc: "Outros: Extensões"} + - {id: 129, cat: Other, desc: "Outros: Fonts"} + - {id: 130, cat: Other, desc: "Outros: MOD"} + - {id: 125, cat: Other, desc: "Outros: Pack de Imagens"} + - {id: 122, cat: Other, desc: "Outros: Plug-ins"} + - {id: 128, cat: Other, desc: "Outros: Scripts"} + - {id: 124, cat: Other, desc: "Outros: Vetores"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: info_results + type: info + label: "Search results" + default: "Set Exibição De Torrents to Lista in your Minhas Configurações.
Using Capas is not supported and will return 0 results." + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: id + options: + id: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: account-login.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + remember: yes + error: + - selector: div.alert-error + test: + path: torrents-search.php + selector: a[href="account-logout.php"] + +search: + paths: + # http://amigos-share.club/torrents-search.php?search=&sort=id&order=desc&page=1 + - path: torrents-search.php + # site displays just 20 results, no profile options found to change this, so we attempt to fetch 5 pages + - path: torrents-search.php + inputs: + page: 1 + - path: torrents-search.php + inputs: + page: 2 + - path: torrents-search.php + inputs: + page: 3 + - path: torrents-search.php + inputs: + page: 4 + inputs: + # note: site does not support multi cat search. + # replace spaces with wildcard (percent symbol) as site's default search is exact string. + search: "{{ re_replace .Keywords \"[\\s]+\" \"%\" }}" + sort: "{{ .Config.sort }}" + order: "{{ .Config.type }}" + # torrents-search.php does not support imdbid search or return imdb links. + keywordsfilters: + # drop the year from searches since site titles do not include year + - name: re_replace + args: ["(19|20[0-9]{2})", ""] + + rows: + selector: "div#fancy-list-group ul.list-group li.list-group-item{{ if .Config.freeleech }}:has(span.badge-success:contains(\"FREE\")){{ else }}{{ end }}" + + fields: + _quality: + selector: div.list-group-item-content p.m-0 span.badge-primary:contains("1080p"), div.list-group-item-content p.m-0 span.badge-primary:contains("720p"), div.list-group-item-content p.m-0 span.badge-primary:contains("4k") + optional: true + filters: + - name: replace + args: ["4k", "2160p"] + _year: + selector: div.list-group-item-content p.m-0 span.badge-primary[style$="#246AB6;"] + optional: true + _type: + selector: div.list-group-item-content p.m-0 span.badge-info:contains("Rip"), div.list-group-item-content p.m-0 span.badge-info:contains("WEB-"), div.list-group-item-content p.m-0 span.badge-info:contains("TV"), div.list-group-item-content p.m-0 span.badge-info:contains("Blu-Ray"), div.list-group-item-content p.m-0 span.badge-info:contains("BD50"), div.list-group-item-content p.m-0 span.badge-info:contains("MUX"), div.list-group-item-content p.m-0 span.badge-info:contains("DVD"), div.list-group-item-content p.m-0 span.badge-info:contains("320"), div.list-group-item-content p.m-0 span.badge-info:contains("CAM"), div.list-group-item-content p.m-0 span.badge-info:contains("rip") + optional: true + _language: + selector: div.list-group-item-content p.m-0 span.badge-primary[style$="#b6249d;"] + optional: true + genre: + selector: div.list-group-item-content p.m-0 span.badge-primary[style$="#1c38c2;"] + description: + text: "{{ .Result.genre }}" + title: + selector: a[href*="torrents-details.php?id="], a[href*="details-misc.php?id="] + filters: + # strip out the non-english title [to the left of the brackets] and drop the brackets enclosing the english title + - name: re_replace + args: ["^(.*?)[\\(](.*?)[\\)](.*?)$", "$2$3"] + # add the year to the title + - name: append + args: "{{ if .Result._year }} {{ .Result._year }}{{ else }}{{ end }}" + # add the quality to the title + - name: append + args: "{{ if .Result._quality }} {{ .Result._quality }}{{ else }}{{ end }}" + # add the type to the title + - name: append + args: "{{ if .Result._type }} {{ .Result._type }}{{ else }}{{ end }}" + # add audio to the title + - name: append + args: "{{ if .Result._language }} {{ .Result._language }}{{ else }}{{ end }}" + - name: re_replace + args: ["(Dual|[Nn]acional|[Dd]ublado)", "Brazilian $1"] + details: + selector: a[href*="torrents-details.php?id="], a[href*="details-misc.php?id="] + attribute: href + download: + selector: a[href*="download.php?id="] + attribute: href + category: + selector: div.list-group-item-addon img + attribute: src + case: + # unfortunately the site does not have category numbers on the results page, just a image which can apply to both movies and tv. + # therefore I've order the list to favour movies. + # also, not all images have been verified as the site has many empty categories. their image names have been extrapolated from the cat desc. + "[src$=\"/Adultos.fw.png\"]": 74 + "[src$=\"/Gay.jpeg\"]": 107 + "[src$=\"/Trans.jpeg\"]": 108 + "[src$=\"/Hentai.png\"]": 75 + "[src$=\"/Anime2.fw.png\"]": 69 + "[src$=\"/aplicativos.fw.png\"]": 21 + "[src$=\"/Mac.png\"]": 22 + "[src$=\"/Android.png\"]": 23 + "[src$=\"/Linux.png\"]": 25 + "[src$=\"/iPhone.png\"]": 26 + "[src$=\"/iPad.png\"]": 27 + "[src$=\"/iPod.png\"]": 28 + "[src$=\"/Cursos.png\"]": 71 + "[src$=\"/Apostila.png\"]": 72 + "[src$=\"/E-books.png\"]": 67 + "[src$=\"/Revista.png\"]": 68 + "[src$=\"/HQ.png\"]": 112 + "[src$=\"/filmes2.fw.png\"]": 119 + "[src$=\"/Revistas-XXX.png\"]": 70 + "[src$=\"/PS4.png\"]": 79 + "[src$=\"/Jogos-PC.png\"]": 47 + "[src$=\"/Emulador.png\"]": 61 + "[src$=\"/Emulacao.png\"]": 109 + "[src$=\"/Jogos-Mac.png\"]": 48 + "[src$=\"/Jogos-PS1.png\"]": 49 + "[src$=\"/Jogos-PS2.png\"]": 50 + "[src$=\"/Jogos-PS3.png\"]": 51 + "[src$=\"/Jogos-Dreamcast.png\"]": 52 + "[src$=\"/Jogos-Xbox360.png\"]": 54 + "[src$=\"/Jogos-Xbox.png\"]": 56 + "[src$=\"/Jogos-Wii.png\"]": 55 + "[src$=\"/Jogos-DS.png\"]": 58 + "[src$=\"/jogosandroid.png\"]": 57 + "[src$=\"/PSP.png\"]": 82 + "[src$=\"/Jogos-NS.png\"]": 110 + "[src$=\"/Jogos-XboxOne.png\"]": 78 + "[src$=\"/Axe.png\"]": 29 + "[src$=\"/Eletronica.png\"]": 30 + "[src$=\"/Funk.png\"]": 31 + "[src$=\"/Pagode.png\"]": 32 + "[src$=\"/HIP_HOP.png\"]": 33 + "[src$=\"/Rap.png\"]": 34 + "[src$=\"/Rock.png\"]": 36 + "[src$=\"/Hard-Rock.png\"]": 37 + "[src$=\"/Blues.png\"]": 38 + "[src$=\"/Dance.png\"]": 39 + "[src$=\"/Discografia.png\"]": 40 + "[src$=\"/Erudita.png\"]": 41 + "[src$=\"/Forro.png\"]": 42 + "[src$=\"/Dubstep.png\"]": 43 + "[src$=\"/Sertanejo.png\"]": 46 + "[src$=\"/Samba.png\"]": 45 + "[src$=\"/Musica-Outros.png\"]": 77 + "[src$=\"/Reggae.png\"]": 76 + "[src$=\"/Gospel.png\"]": 83 + "[src$=\"/POP.png\"]": 115 + "[src$=\"/MPB.png\"]": 114 + "[src$=\"/OST.png\"]": 84 + "[src$=\"/seriados.fw.png\"]": 120 + "[src$=\"/show.fw.png\"]": 65 + "[src$=\"/Aberta.png\"]": 63 + "[src$=\"/Esporte.png\"]": 62 + "[src$=\"/Fechada.png\"]": 64 + "[src$=\"/video aula4.fw.png\"]": 73 + "[src$=\"/Add-ons.png\"]": 127 + "[src$=\"/Extensões.png\"]": 126 + "[src$=\"/Fonts.png\"]": 129 + "[src$=\"/MOD.png\"]": 130 + "[src$=\"/Imagens.png\"]": 125 + "[src$=\"/Plug-ins.png\"]": 122 + "[src$=\"/Scripts.png\"]": 128 + "[src$=\"/Vetores.png\"]": 124 + "[src$=\"/outros2.png\"]": 130 + date: + selector: p:contains("Lançado:") + # auto adjusted by site account profile + optional: true + default: now + filters: + - name: regexp + args: "Lançado: (.+?)$" + - name: re_replace + args: [" (\\d:)", " 0$1"] + - name: dateparse + args: "dd/MM/yy HH:mm:ss" + size: + selector: div.list-group-item-content p.m-0 span.badge-info + seeders: + selector: div.list-group-item-controls a:nth-child(1) + leechers: + selector: div.list-group-item-controls a:nth-child(2) + grabs: + selector: div.list-group-item-controls a:nth-child(3) + downloadvolumefactor: + case: + "span.badge-success:contains(\"FREE\")": 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 +# engine n/a diff --git a/config/prowlarr/Definitions/anilibria.yml b/config/prowlarr/Definitions/anilibria.yml new file mode 100644 index 0000000..491aa9b --- /dev/null +++ b/config/prowlarr/Definitions/anilibria.yml @@ -0,0 +1,120 @@ +--- +id: anilibria +name: AniLibria +description: "AniLibria is a Public torrent tracker for anime, voiced on russian by AniLibria team" +language: ru-RU +type: public +encoding: UTF-8 +links: + - https://www.anilibria.tv/ + +caps: + categories: + Anime: TV/Anime + Movies: Movies/Other + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + +settings: + - name: stripcyrillic + type: checkbox + label: Strip Cyrillic Letters + default: false + - name: addrussiantotitle + type: checkbox + label: Add RUS to end of all titles to improve language detection by Sonarr and Radarr. Will cause English-only results to be misidentified. + default: false + +search: + paths: + # https://github.com/anilibria/docs/blob/master/api_v3.md + - path: "https://api.anilibria.tv/v3/title/{{ if .Keywords }}search{{ else }}updates{{ end }}" + response: + type: json + + inputs: + search: "{{ .Keywords }}" + filter: "names,posters.small.url,code,torrents.list,season.year,description" + limit: 100 + + keywordsfilters: + # strip season and/or ep + - name: re_replace + args: ["(?i)\\b(?:[SE]\\d{1,4}){1,2}\\b\\s?", ""] + + rows: + selector: list + attribute: torrents.list + multiple: true + + fields: + _episodes: + selector: episodes.string + optional: true + category: + text: "{{ if eq .Result._episodes \"Фильм\" }}Movies{{ else }}Anime{{ end }}" + title_ru: + selector: ..names.ru + title_en: + selector: ..names.en + title_alternative: + selector: ..names.alternative + optional: true + filters: + - name: re_replace + args: ["(\\([\\p{IsCyrillic}\\W]+\\))|(^[\\p{IsCyrillic}\\W\\d]+\\/ )|([\\p{IsCyrillic} \\-]+,+)|([\\p{IsCyrillic}]+)", "{{ if .Config.stripcyrillic }}{{ else }}$1$2$3$4{{ end }}"] + - name: re_replace + args: ["[\\[\\(\\{<«][\\s\\W]*[\\]\\)\\}>»]", ""] + - name: re_replace + args: ["^[\\s&,\\.!\\?\\+\\-_\\|\\/':]+", ""] + - name: re_replace + args: ["^OVA$", ""] + year: + selector: ..season.year + _quality: + selector: quality.string + title: + text: "{{ if .Config.stripcyrillic }}{{ else }}{{ .Result.title_ru }} / {{ end }}{{ .Result.title_en }}{{ if .Result.title_alternative }} / AKA {{ .Result.title_alternative }}{{ else }}{{ end }} ({{ .Result.year }}) [{{ .Result._quality }}]{{ if .Result._episodes }} - E{{ .Result._episodes }}{{ else }}{{ end }}" + filters: + - name: re_replace + args: [" - \\bEФильм\\b", " - MOVIE"] + - name: re_replace + args: [" - \\bEOVA\\b", " - OVA"] + - name: append + args: "{{ if .Config.addrussiantotitle }} - RUS{{ else }}{{ end }}" + _code: + selector: ..code + details: + text: "{{ .Config.sitelink }}release/{{ .Result._code }}.html" + download_url: + selector: url + download: + text: "{{ .Config.sitelink }}{{ .Result.download_url }}" + magnet: + selector: magnet + poster: + selector: ..posters.small.url + filters: + - name: prepend + args: "https://static.anilibria.tv" + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: downloads + date: + # unix + selector: uploaded_timestamp + size: + selector: total_size + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 + description: + selector: ..description +# json api v3 diff --git a/config/prowlarr/Definitions/anime-free.yml b/config/prowlarr/Definitions/anime-free.yml new file mode 100644 index 0000000..f3627ad --- /dev/null +++ b/config/prowlarr/Definitions/anime-free.yml @@ -0,0 +1,144 @@ +--- +id: anime-free +name: Anime-Free +description: "Anime-Free is a RUSSIAN Semi-Private Torrent Tracker for Hentai manga, eroge and flash porn games" +language: ru-RU +type: semi-private +encoding: windows-1251 +testlinktorrent: false +links: + - https://anime-free.one/ +legacylinks: + - https://anime-free.net/ # redirects to *.biz + - https://anime-free.biz/ + - http://anime-free.one/ + +caps: + categorymappings: + - {id: 14, cat: TV/Anime, desc: "Аниме хентай"} + - {id: 47, cat: TV/Anime, desc: " Хентай на Русском языке"} + - {id: 48, cat: TV/Anime, desc: " Хентай Без русского перевода"} + - {id: 45, cat: TV/Anime, desc: " Хентай Без цензуры"} + - {id: 46, cat: TV/Anime, desc: " Хентай с цензурой"} + - {id: 54, cat: Other, desc: "Косплей"} + - {id: 51, cat: TV/Anime, desc: "[3D] хентай и анимация"} + - {id: 5, cat: Books/Comics, desc: "Хентай манга"} + - {id: 56, cat: Console, desc: "Игры"} + - {id: 10, cat: Console, desc: " Эротические и хентай игры"} + - {id: 55, cat: Console, desc: " 3DCG/3D-Animation игры"} + - {id: 57, cat: Console, desc: " Игры на русском языке"} + - {id: 58, cat: Other, desc: " Онлайн игры"} + - {id: 52, cat: Books/Comics, desc: "Порно комиксы"} + - {id: 49, cat: XXX/ImageSet, desc: "Хентай картинки, иллюстрации, обои и Art "} + - {id: 43, cat: TV/Anime, desc: "Эччи (Легкая эротика)"} + - {id: 4, cat: TV/Anime, desc: "Аниме Хентай"} + - {id: 50, cat: Other, desc: "Хентай Онлайн"} + + modes: + search: [q] + +settings: + - name: email + type: text + label: Email + - name: password + type: password + label: Password + +login: + path: / + method: form + form: form.login-form + inputs: + login_name: "{{ .Config.email }}" + login_password: "{{ .Config.password }}" + error: + - selector: div.berrors + test: + path: / + selector: a[href$="/index.php?action=logout"] + +download: + selectors: + - selector: a[href*="/engine/download.php?id="] + attribute: href + +search: + # https://anime-free.biz/index.php?do=search&subaction=search&search_start=0&full_search=1&result_from=1&story=slaves+to+passion&all_word_seach=1&titleonly=3&searchuser=&replyless=0&replylimit=0&searchdate=0&beforeafter=after&sortby=date&resorder=desc&showposts=0&catlist[]=0 + paths: + - path: index.php + inputs: + $raw: "{{ range .Categories }}catlist[]={{.}}&{{end}}" + do: search + subaction: search + search_start: 0 + full_search: 1 + result_from: 1 + showposts: 0 + all_word_seach: 1 + # 0 article, 1 comments, 2 static pages, 3 article titles + titleonly: "{{ if .Keywords }}3{{ else }}0{{ end }}" + searchdate: 0 + searchuser: "" + story: "{{ if .Keywords }}{{ .Keywords }}{{ else }}{{ .Today.Year }}{{ end }}" + sortby: date + resorder: desc + + rows: + selector: article + + fields: + category: + selector: a[href*="category="] + attribute: href + optional: true + default: 54 + case: + a[href$="3d_hentai"]: 51 + a[href$="3dcg_game"]: 55 + a[href$="censored"]: 46 + a[href$="comics"]: 52 + a[href$="cosplay"]: 54 + a[href$="etty"]: 43 + a[href$="h-game"]: 10 + a[href$="h-online"]: 50 + a[href$="hentai"]: 4 + a[href$="hentai_games"]: 56 + a[href$="hentai_manga"]: 5 + a[href$="hentai_raznoe"]: 49 + a[href$="hentai_rus"]: 47 + a[href$="online_games"]: 58 + a[href$="original_hentai"]: 48 + a[href$="rus-game"]: 57 + a[href$="uncensored"]: 45 + title: + selector: h2.title a + details: + selector: h2.title a + attribute: href + download: + selector: h2.title a + attribute: href + poster: + selector: img.entry-image + attribute: src + description: + selector: div[itemprop="description"] + date: + selector: li:has(img#adddate) + filters: + - name: dateparse + args: "dd-MM-yyyy, HH:mm" + seeders: + text: 1 + leechers: + text: 1 + size: + selector: b.file_size + optional: true + default: 0 B + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/animelayer.yml b/config/prowlarr/Definitions/animelayer.yml new file mode 100644 index 0000000..ed052ae --- /dev/null +++ b/config/prowlarr/Definitions/animelayer.yml @@ -0,0 +1,201 @@ +--- +id: animelayer +name: AnimeLayer +description: "AnimeLayer is a RUSSIAN Semi-Private Torrent Tracker for ANIME" +language: ru-RU +type: semi-private +encoding: UTF-8 +links: + - https://www.animelayer.ru/ + +caps: + categorymappings: + - {id: аниме, cat: TV/Anime, desc: Аниме} + - {id: музыка, cat: Audio, desc: Музыка} + - {id: манга, cat: Books, desc: Манга} + - {id: дорама, cat: TV, desc: Дорама} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: category-id + type: select + label: Category + default: anime + options: + anime: Аниме + music: Музыка + manga: Манга + dorama: Дорама + +login: + path: login.php + method: form + form: form#loginForm + inputs: + login: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: div.error + test: + path: / + selector: a[href^="/auth/logout/"] + +search: + paths: + - path: "torrents/{{ .Config.category-id }}/" + inputs: + q: "{{ .Keywords }}" + + rows: + selector: ul.torrents-list li.torrent-item:has(a[href^="/torrent/"]) + + fields: + category: + selector: label.category + _resolution: + selector: div.description + filters: + - name: regexp + args: "Разрешение:\\s+\\d{3,4}\\D(\\d{3,4})" + title: + selector: img + attribute: alt + filters: + - name: append + args: "{{ if .Result._resolution }} [{{ .Result._resolution }}p]{{ else }}{{ end }}" + details: + selector: a[href^="/torrent/"] + attribute: href + download: + selector: a[href^="/torrent/"] + attribute: href + filters: + - name: append + args: download/ + poster: + selector: img + attribute: data-original + size: + selector: div.info + filters: + - name: split + args: ["|", 2] + date_noyear: + # Добавлен: 18 августа в 21:39 + selector: div.info + filters: + - name: regexp + args: "н:\\s(\\d{1,2} \\D{3,8} в\\s\\d{1,2}:\\d{2})" + - name: replace + args: ["\xA0", " "] + - name: replace + args: ["Обновлён:", ""] + - name: replace + args: ["Добавлен:", ""] + - name: replace + args: [" в ", " "] + - name: replace + args: ["января", "January {{ .Today.Year }}"] + - name: replace + args: ["февраля", "February {{ .Today.Year }}"] + - name: replace + args: ["марта", "March {{ .Today.Year }}"] + - name: replace + args: ["апреля", "April {{ .Today.Year }}"] + - name: replace + args: ["мая", "May {{ .Today.Year }}"] + - name: replace + args: ["июня", "June {{ .Today.Year }}"] + - name: replace + args: ["июля", "July {{ .Today.Year }}"] + - name: replace + args: ["августа", "August {{ .Today.Year }}"] + - name: replace + args: ["сентября", "September {{ .Today.Year }}"] + - name: replace + args: ["октября", "October {{ .Today.Year }}"] + - name: replace + args: ["ноября", "November {{ .Today.Year }}"] + - name: replace + args: ["декабря", "December {{ .Today.Year }}"] + - name: re_replace + args: ["\\s(\\d\\:)", " 0$1"] + date_year: + # Обновлён: 3 октября 2019 в 6:02 + selector: div.info + filters: + - name: regexp + args: "н:\\s(\\d{1,2} \\D{3,8} \\d{4} в\\s\\d{1,2}:\\d{2})" + - name: replace + args: ["\xA0", " "] + - name: replace + args: ["Обновлён:", ""] + - name: replace + args: ["Добавлен:", ""] + - name: replace + args: [" в ", " "] + - name: replace + args: ["января", "January"] + - name: replace + args: ["февраля", "February"] + - name: replace + args: ["марта", "March"] + - name: replace + args: ["апреля", "April"] + - name: replace + args: ["мая", "May"] + - name: replace + args: ["июня", "June"] + - name: replace + args: ["июля", "July"] + - name: replace + args: ["августа", "August"] + - name: replace + args: ["сентября", "September"] + - name: replace + args: ["октября", "October"] + - name: replace + args: ["ноября", "November"] + - name: replace + args: ["декабря", "December"] + - name: re_replace + args: ["\\s(\\d\\:)", " 0$1"] + date: + text: "{{ if or .Result.date_year .Result.date_noyear }}{{ or .Result.date_year .Result.date_noyear }}{{ else }}now{{ end }}" + seeders: + selector: div.info + filters: + - name: split + args: ["|", 0] + leechers: + selector: div.info + filters: + - name: split + args: ["|", 1] + _subtitles: + filters: + - name: regexp + args: "Субтитры:(.+?)\\n" + _language: + filters: + - name: regexp + args: "Язык:(.+?)\\n" + description: + text: "{{ if .Result._subtitles }}Субтитры: {{ .Result._subtitles }}{{ else }}{{ end }} - {{ if .Result._language }}Язык: {{ .Result._language }}{{ else }}{{ end }}" + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/animetime.yml b/config/prowlarr/Definitions/animetime.yml new file mode 100644 index 0000000..d5916db --- /dev/null +++ b/config/prowlarr/Definitions/animetime.yml @@ -0,0 +1,69 @@ +--- +id: animetime +name: Anime Time +description: "Anime Time is a PUBLIC torrent tracker for ANIME" +language: en-US +type: public +encoding: UTF-8 +requestDelay: 2 +links: + - https://animetime.cc/ + +caps: + categories: + Anime: TV/Anime + + modes: + search: [q] + tv-search: [q, season, ep] + +settings: [] + +search: + paths: + # https://animetime.cc/search?query= + - path: "{{ if .Keywords }}search{{ else }}{{ end }}" + + inputs: + query: "{{ .Keywords }}" + + keywordsfilters: + - name: trim + - name: re_replace + args: ["\\W+", "%"] + + rows: + selector: div.flow-root > div.divide-y > div.p-2.space-y-2 + + fields: + category: + text: Anime + title: + selector: div.flex.flex-wrap ~ p + details: + text: / + download: + selector: a[href*="/download/"] + attribute: href + magnet: + selector: a[href^="magnet:?xt="] + attribute: href + date: + selector: span[data-tip] + attribute: data-tip + filters: + - name: append + args: " +02:00" # EET + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + size: + selector: span.badge.badge-ghost + seeders: + text: 1 + leechers: + text: 1 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/animetorrentsro.yml b/config/prowlarr/Definitions/animetorrentsro.yml new file mode 100644 index 0000000..50cf7ab --- /dev/null +++ b/config/prowlarr/Definitions/animetorrentsro.yml @@ -0,0 +1,153 @@ +--- +id: animetorrentsro +name: AnimeTorrents.ro +description: "AnimeTorrents.ro (Anime Torrents Romania) is a ROMANIAN Private Torrent Tracker for ANIME / MANGA" +language: ro-RO +type: private +encoding: UTF-8 +links: + - https://animetorrents.ro/ + +caps: + categorymappings: + - {id: 1, cat: TV/Anime, desc: "ANIME"} + - {id: 1, cat: Movies/Other, desc: "ANIME"} # for Radarr + - {id: 2, cat: Books/Comics, desc: "MANGA"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: cat-id + type: select + label: Category + default: 0 + options: + 0: All categories + 1: Anime + 2: Manga + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + x: 0 + y: 0 + referer: / + error: + - selector: table.main:contains("esuat") + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + # https://animetorrents.ro/browse.php?search=2023&incldead=1&blah=0&cat=0 + - path: browse.php + inputs: + search: "{{ .Keywords }}" + # 0 active, 1 all, 2 dead, 3 free + incldead: "{{ if .Config.freeleech }}3{{ else }}1{{ end }}" + # 0 name, 1 genre + blah: 0 + # site does not support multiple cats + cat: "{{ .Config.cat-id }}" + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + # does not support imdbid search + + rows: + selector: td > table > tbody > tr:has(a[href^="download.php/"]) + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + filters: + - name: re_replace + args: ["^(\\[.+?\\]).(.+)", "$2.$1"] + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php/"] + attribute: href + poster: + selector: a[onmouseover] + attribute: onmouseover + filters: + - name: regexp + args: "src=(.+?) width" + files: + selector: td:nth-last-child(8) + date: + selector: td:nth-last-child(6) + filters: + - name: append + args: " +00:00" # auto adjusted by site account profile + - name: dateparse + args: "dd-MM-yyyyHH:mm:ss zzz" + size: + selector: td:nth-last-child(5) + grabs: + selector: td:nth-last-child(4) + seeders: + selector: td:nth-last-child(3) + leechers: + selector: td:nth-last-child(2) + downloadvolumefactor: + case: + img[alt="Free"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + genre: + selector: a[href^="download.php/"] + description: + text: "{{ .Result.genre }}" + minimumratio: + text: 1.0 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# engine n/a diff --git a/config/prowlarr/Definitions/animeworld-api.yml b/config/prowlarr/Definitions/animeworld-api.yml new file mode 100644 index 0000000..0e3da94 --- /dev/null +++ b/config/prowlarr/Definitions/animeworld-api.yml @@ -0,0 +1,177 @@ +--- +id: animeworld-api +name: AnimeWorld (API) +description: "AnimeWorld (AW) is a GERMAN Private site for ANIME / MANGA / HENTAI" +language: de-DE +type: private +encoding: UTF-8 +links: + - https://animeworld.cx/ + +caps: + categorymappings: + - {id: 1, cat: Movies/Other, desc: "Anime Filme"} + - {id: 2, cat: TV/Anime, desc: "Anime Serien"} + - {id: 3, cat: Audio, desc: "Anime Musik / OSTs"} + - {id: 4, cat: PC/Games, desc: "Anime Spiele"} + - {id: 5, cat: XXX, desc: "Anime Hentai"} + - {id: 6, cat: PC, desc: "Software"} + - {id: 7, cat: Other, desc: "Sonstiges"} + - {id: 8, cat: Movies, desc: "Filme"} + - {id: 9, cat: TV, desc: "Serien"} + - {id: 10, cat: PC/Games, desc: "Spiele"} + - {id: 11, cat: Audio, desc: "Musik"} + - {id: 12, cat: Books, desc: "Manga"} + - {id: 13, cat: Movies, desc: "Cartoon Filme"} + - {id: 14, cat: TV, desc: "Cartoon Serie"} + - {id: 15, cat: XXX, desc: "H-Manga / Doujinshi"} + + modes: + search: [q] + tv-search: [q, season, ep, tvdbid, tmdbid] + movie-search: [q, tmdbid] + music-search: [q] + book-search: [q] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your AnimeWorld account My Security page and clicking on the API Token tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + inputs: {} # TODO: remove in v10 + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: "/api/torrents/filter" + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + # if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6 + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + seasonNumber: "{{ .Query.Season }}" + episodeNumber: "{{ .Query.Ep }}" + # imdbId: "{{ .Query.IMDBIDShort }}" # disabled due to #14776 + tmdbId: "{{ .Query.TMDBID }}" + tvdbId: "{{ .Query.TVDBID }}" + "free[]": "{{ if .Config.freeleech }}100{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + + rows: + selector: data + attribute: attributes + + fields: + category: + selector: category_id + title: + selector: name + details: + selector: details_link + download: + selector: download_link + infohash: + selector: info_hash + poster: + selector: meta.poster + filters: + - name: replace + args: ["https://via.placeholder.com/90x135", ""] + imdbid: + selector: imdb_id + tmdbid: + selector: tmdb_id + tvdbid: + selector: tvdb_id + genre: + selector: meta.genres + filters: + - name: re_replace + args: ["(?i)(Cinema TV)", "Cinema_TV"] + - name: re_replace + args: ["(?i)(Ficção científica)", "Ficção_científica"] + - name: replace + args: [" & ", "_&_"] + description: + text: "{{ .Result.genre }}" + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0%, 25%, 50%, 75%, 100% + selector: freeleech + case: + 0%: 1 # not free + 25%: 0.75 + 50%: 0.5 + 75%: 0.25 + 100%: 0 # freeleech + "*": 0 # catch errors + uploadvolumefactor: + # api returns 0=false, 1=true + selector: double_upload + case: + 0: 1 # normal + 1: 2 # double + minimumseedtime: + # 7 day (as seconds = 7 x 24 x 60 x 60) + text: 604800 +# json UNIT3D 6.5.0 diff --git a/config/prowlarr/Definitions/anirena.yml b/config/prowlarr/Definitions/anirena.yml new file mode 100644 index 0000000..7183398 --- /dev/null +++ b/config/prowlarr/Definitions/anirena.yml @@ -0,0 +1,89 @@ +--- +id: aniRena +name: AniRena +description: "AniRena is a Public torrent tracker for the latest anime and Japanese related torrents" +language: en-US +type: public +encoding: UTF-8 +links: + - https://www.anirena.com/ + +settings: + - name: flaresolverr + type: info + label: FlareSolverr + default: This site may use Cloudflare DDoS Protection, therefore Prowlarr requires FlareSolverr to access it. + +caps: + categorymappings: + # Anime + - {id: 1, cat: TV/Anime, desc: "Raw Animes"} + - {id: 2, cat: TV/Anime, desc: "Anime"} + - {id: 3, cat: TV/Anime, desc: "Hentai"} + - {id: 4, cat: TV/Anime, desc: "Drama"} + - {id: 9, cat: TV/Anime, desc: "Anime Music Videos"} + - {id: 10, cat: TV/Anime, desc: "Non-English"} + # Software + - {id: 5, cat: PC/ISO, desc: "DVD/ISO"} + - {id: 6, cat: PC, desc: "Hentai-Game"} + # Literature + - {id: 7, cat: Books, desc: "Manga"} + # Audio + - {id: 8, cat: Audio, desc: "Audio"} + # Other + - {id: 11, cat: Other, desc: "Other"} + + modes: + search: [q] + tv-search: [q, season, ep] + music-search: [q] + book-search: [q] + +search: + paths: + - path: / + inputs: + s: "{{ .Keywords }}" + + rows: + selector: table tbody tr:has(td.torrents_small_type_data1) + + fields: + title: + selector: .torrents_small_info_data1 div + download: + selector: .torrents_small_info_data2 a[title="Download Torrent"] + attribute: href + magnet: + selector: .torrents_small_info_data2 a[title="Magnet Link"] + attribute: href + date: + text: now + size: + selector: .torrents_small_size_data1 + seeders: + selector: .torrents_small_seeders_data1 b big + leechers: + selector: .torrents_small_leechers_data1 b big + grabs: + selector: .torrents_small_downloads_data1 + category: + selector: .torrents_small_type_data1 img + attribute: src + case: + "[src=\"./styles/tracker/imageset/cat_raw_small.png\"]": 1 + "[src=\"./styles/tracker/imageset/cat_anime_small.png\"]": 2 + "[src=\"./styles/tracker/imageset/cat_hentai_small.png\"]": 3 + "[src=\"./styles/tracker/imageset/cat_drama_small.png\"]": 4 + "[src=\"./styles/tracker/imageset/cat_dvd_small.png\"]": 5 + "[src=\"./styles/tracker/imageset/cat_hgame2_small.png\"]": 6 + "[src=\"./styles/tracker/imageset/cat_manga_small.png\"]": 7 + "[src=\"./styles/tracker/imageset/cat_music_small.png\"]": 8 + "[src=\"./styles/tracker/imageset/cat_musicvid_small.png\"]": 9 + "[src=\"./styles/tracker/imageset/cat_noneng_small.png\"]": 10 + "[src=\"./styles/tracker/imageset/cat_other_small.png\"]": 11 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/anisource.yml b/config/prowlarr/Definitions/anisource.yml new file mode 100644 index 0000000..25043c8 --- /dev/null +++ b/config/prowlarr/Definitions/anisource.yml @@ -0,0 +1,87 @@ +--- +id: anisource +name: AniSource +description: "AniSource is a Public site for HD Anime raws." +language: en-US +type: public +encoding: UTF-8 +requestDelay: 5 +links: + - https://asnet.pw/ + +settings: [] + +caps: + categorymappings: + - {id: 1, cat: TV/Anime, desc: "Raw Animes"} + + modes: + search: [q] + tv-search: [q, season, ep] + +search: + paths: + - path: / + - path: / + inputs: + tpage: 2 + inputs: + search: "{{ .Keywords }}" + + headers: + # site blocks Jackett's User-Agents, so slightly alter it here (e.g. Chrome/87.0. > Chrome/97.0.) + User-Agent: ["Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4280.88 Safari/537.36"] + + rows: + selector: div[class^="item"] + + fields: + category: + text: 1 + title: + selector: a[href*="/showprofile/"] + filters: + # move group to the end + - name: re_replace + args: ["^(\\[.+?\\]) (.+?)$", "$2 $1"] + details: + selector: a[href*="/showprofile/"] + attribute: href + infohash: + selector: a[href*="/showprofile/"] + attribute: href + filters: + - name: regexp + args: ([A-F|a-f|0-9]{40}) + date: + selector: font[color="Black"] + filters: + - name: regexp + args: "Date: (.+?) Central" + - name: replace + args: [" at ", " "] + - name: append + args: " -09:00" # CUS + - name: dateparse + args: "yyyy-MM-dd HH:mm zzz" + size: + selector: font[color="Black"] + filters: + - name: regexp + args: "Size: (.+?) \\|" + - name: replace + args: ["b", "B"] + files: + selector: font[color="Black"] + filters: + - name: regexp + args: (\d+)$ + seeders: + text: 1 + leechers: + text: 1 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/anitoons.yml b/config/prowlarr/Definitions/anitoons.yml new file mode 100644 index 0000000..ba1944f --- /dev/null +++ b/config/prowlarr/Definitions/anitoons.yml @@ -0,0 +1,164 @@ +--- +id: anitoons +name: AniToons +description: "AniToons is a BRAZILIAN Private Torrent Tracker for ANIME / CARTOONS" +language: pt-BR +type: private +encoding: UTF-8 +links: + - https://anitoons.xyz/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Movies"} + - {id: 2, cat: TV, desc: "TV"} + - {id: 6, cat: XXX, desc: "Adult"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your AniToons account My Settings page and clicking on the API Key tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + inputs: {} # TODO: remove in v10 + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: "/api/torrents/filter" + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + # if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6 + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + seasonNumber: "{{ .Query.Season }}" + episodeNumber: "{{ .Query.Ep }}" + imdbId: "{{ .Query.IMDBIDShort }}" + tmdbId: "{{ .Query.TMDBID }}" + tvdbId: "{{ .Query.TVDBID }}" + "free[]": "{{ if .Config.freeleech }}100{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + + rows: + selector: data + attribute: attributes + + fields: + category: + selector: category_id + title: + selector: name + details: + selector: details_link + download: + selector: download_link + infohash: + selector: info_hash + poster: + selector: meta.poster + filters: + - name: replace + args: ["https://via.placeholder.com/90x135", ""] + imdbid: + selector: imdb_id + tmdbid: + selector: tmdb_id + tvdbid: + selector: tvdb_id + genre: + selector: meta.genres + filters: + - name: re_replace + args: ["(?i)(Ficção científica)", "Ficção_científica"] + - name: replace + args: [" & ", "_&_"] + description: + text: "{{ .Result.genre }}" + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0%, 25%, 50%, 75%, 100% + selector: freeleech + case: + 0%: 1 # not free + 25%: 0.75 + 50%: 0.5 + 75%: 0.25 + 100%: 0 # freeleech + "*": 0 # catch errors + uploadvolumefactor: + # api returns False, True + selector: double_upload + case: + False: 1 # normal + True: 2 # double +# global MR is 0.4 but torrents must be seeded for 5 days regardless of ratio +# minimumratio: +# text: 0.4 + minimumseedtime: + # 5 days (as seconds = 5 x 24 x 60 x 60) + text: 432000 +# json UNIT3D 7.0.3 diff --git a/config/prowlarr/Definitions/anthelion-api.yml b/config/prowlarr/Definitions/anthelion-api.yml new file mode 100644 index 0000000..f281709 --- /dev/null +++ b/config/prowlarr/Definitions/anthelion-api.yml @@ -0,0 +1,166 @@ +--- +id: anthelion-api +name: Anthelion (API) +description: "Anthelion is a Private MOVIES tracker" +language: en-US +type: private +encoding: UTF-8 +links: + - https://anthelion.me/ + +caps: + categorymappings: + - {id: 2000, cat: Movies} + - {id: 2030, cat: Movies/SD} + - {id: 2040, cat: Movies/HD} + - {id: 2045, cat: Movies/UHD} + - {id: 2050, cat: Movies/BluRay} + - {id: 2080, cat: Movies/WEB-DL} + - {id: 8000, cat: Other} + + modes: + search: [q] + movie-search: [q, imdbid, tmdbid] + # note: the api any supports movie search so there is no tv season/episode support. + # not using year search because torznab adds it to the q= which results in &q=keyword+2022&year=2022 sent to api !?! + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Key by accessing your Anthelion account Settings page and scrolling down to the API Key section.
Tick the Search and Download checkboxes and click the save profile button to generate the key." + +login: + path: api.php + method: get + inputs: + api_key: "{{ .Config.apikey }}" + error: + - selector: ":root:contains(\"Unrecognized key\")" + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + - selector: ":root:contains(\"No API_KEY provided\")" + message: + text: "You did not enter an API key." + +search: + paths: + # docs: https://anthelion.me/forums.php?action=viewthread&threadid=1026 + - path: api.php + response: + type: json + + inputs: + api_key: "{{ .Config.apikey }}" + o: json + t: movie + q: "{{ .Keywords }}" + tmdb: "{{ .Query.TMDBID }}" + imdb: "{{ .Query.IMDBIDShort }}" + # category filtering is disabled since it seems to rely on the AND operator that prevents some releases to show on search. + # cat: "{{ join .Categories \",\" }}" + limit: 100 + offset: 0 + + rows: + selector: item + count: + selector: response.total + + fields: + category: + selector: category + filters: + - name: split + args: [",", -1] + year: + selector: year + optional: true + _codec: + selector: codec + _container: + selector: container + _media: + selector: media + filters: + - name: replace + args: ["WEB", "WEB-DL"] + _resolution: + selector: resolution + _audioFormat: + selector: audioFormat + _subbing: + selector: subbing + optional: true + _flags: + selector: flags + optional: true + filters: + - name: replace + args: [",", " "] + _language: + selector: language + optional: true + _releaseGroup: + selector: releaseGroup + optional: true + filters: + - name: trim + title_optional: + selector: title + filters: + - name: htmldecode + - name: append + args: " {{ .Result.year }} {{ .Result._codec }} {{ .Result._container }} {{ .Result._media }} {{ .Result._resolution }} {{ .Result._audioFormat }}{{ if .Result._subbing }} Subs{{ else }}{{ end }}{{ if .Result._flags }} {{ .Result._flags }}{{ else }}{{ end }}{{ if .Result._language }} {{ .Result._language }}{{ else }}{{ end }}{{ if and (.Result._releaseGroup) (ne .Result._releaseGroup \"NULL\") }}-{{ .Result._releaseGroup }}{{ else }}{{ end }}" + details: + selector: guid + download: + selector: link + filters: + - name: htmldecode + infohash: + selector: infohash + imdbid: + selector: imdb + tmdbid: + selector: tmdb + genre: + selector: tags + filters: + - name: replace + args: [".", "_"] + description: + text: "{{ .Result.genre }}" + files: + selector: fileCount + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: grabs + date: + # 2022-08-07T20:56:06+0200 + selector: pubDate + size: + selector: size + downloadvolumefactor: + text: 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 3 day (as seconds = 3 x 24 x 60 x 60) + text: 259200 + _filename: + selector: "files[0].name" + filters: + - name: htmldecode + optional: true + title: + text: "{{ if and (eq .Result.files \"1\") (.Result._filename) }}{{ .Result._filename }}{{ else }}{{ .Result.title_optional }}{{ end }}" +# json api diff --git a/config/prowlarr/Definitions/arabafenice.yml b/config/prowlarr/Definitions/arabafenice.yml new file mode 100644 index 0000000..fc7beb7 --- /dev/null +++ b/config/prowlarr/Definitions/arabafenice.yml @@ -0,0 +1,235 @@ +--- +id: arabafenice +name: ArabaFenice +description: "Araba Fenice (Phoenix) is an ITALIAN Private site for TV / MOVIES / GENERAL" +language: it-IT +type: private +encoding: UTF-8 +links: + - https://www.arabafenice.me/ +legacylinks: + - http://www.arabafenice.me/ + +caps: + categorymappings: + # HRS + - {id: 34, cat: Movies/HD, desc: "1080p HRS x264"} + - {id: 47, cat: Movies/UHD, desc: "2160p 4K UHD HRS"} + - {id: 35, cat: TV, desc: "Serie TV HRS"} + - {id: 36, cat: Movies/SD, desc: "DVDRip HRS"} + - {id: 41, cat: Movies/SD, desc: "BDRip 576p HRS"} + - {id: 39, cat: Movies/HD, desc: "1080p HRS x265 HEVC"} + # AREA SuperVip + - {id: 33, cat: Movies/HD, desc: "[DD] Film 720p MP4"} + - {id: 54, cat: Movies/HD, desc: "[DD] 1080p V.U. MKV"} + - {id: 55, cat: Movies/BluRay, desc: "[DD] FULL BluRay"} + - {id: 57, cat: Movies/UHD, desc: "[DD] 4K FULL BluRay"} + - {id: 58, cat: XXX, desc: "[DD] XXX 1080p"} + - {id: 59, cat: XXX, desc: "[DD] XXX 4K 2160p"} + - {id: 60, cat: XXX, desc: "[DD] XXX 720p"} + # VIDEO + - {id: 1, cat: Movies, desc: "News Cinema"} + - {id: 40, cat: TV/UHD, desc: "4K Video Untouched"} + - {id: 2, cat: Movies/SD, desc: "BD-DVDRip"} + - {id: 3, cat: Movies/DVD, desc: "DVD 5"} + - {id: 50, cat: Movies/UHD, desc: "4K 2160p UHD"} + - {id: 6, cat: Movies/BluRay, desc: "BluRay Full"} + - {id: 4, cat: Movies/HD, desc: "1080p 3D x264"} + - {id: 7, cat: Movies/HD, desc: "1080p x264"} + - {id: 46, cat: Movies/HD, desc: "1080p VideoUntouched"} + - {id: 44, cat: Movies/HD, desc: "1080p x265 HEVC"} + - {id: 5, cat: Movies/DVD, desc: "DVD 9"} + - {id: 9, cat: TV/Anime, desc: "Cartoons"} + - {id: 8, cat: TV/Anime, desc: "720p x264"} + - {id: 12, cat: TV, desc: "Stagioni Concluse"} + - {id: 13, cat: TV, desc: "Stagioni in Onda"} + - {id: 14, cat: TV, desc: "TV Show"} + - {id: 42, cat: TV, desc: "Serie Tv Sub Ita"} + - {id: 15, cat: TV/Documentary, desc: "Documentari"} + - {id: 53, cat: TV/HD, desc: "VIDEO MP4 720p"} + - {id: 38, cat: XXX, desc: "xXx"} + - {id: 43, cat: Other, desc: "Araba per il sociale"} + # MUSICA + - {id: 17, cat: Audio, desc: "Musica Italiana"} + - {id: 45, cat: Audio, desc: "Discografie"} + - {id: 18, cat: Audio, desc: "MusicaInternazionale"} + - {id: 19, cat: Audio, desc: "Compilation"} + # PDF + - {id: 21, cat: Books, desc: "Ebook"} + - {id: 22, cat: Books/Comics, desc: "Comics"} + - {id: 23, cat: Books, desc: "Newsstand"} + - {id: 56, cat: Books/Mags, desc: "Riviste"} + - {id: 48, cat: XXX/Other, desc: "Riviste xXx"} + - {id: 49, cat: XXX/Other, desc: "Fumetti xXx"} + # GAMES + - {id: 25, cat: Console/PS4, desc: "Sony Games"} + - {id: 26, cat: Console/XBox, desc: "XboX Games"} + - {id: 27, cat: Console/Other, desc: "Nintendo Games"} + - {id: 28, cat: PC/Games, desc: "PC Games"} + # SOFTWARE + - {id: 30, cat: PC/ISO, desc: "Windows APP"} + - {id: 31, cat: PC/Mobile-iOS, desc: "Apple APP"} + - {id: 32, cat: PC/Mobile-Android, desc: "Android APP"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: sort + type: select + label: Sort requested from site + default: 3 + options: + 3: created + 5: seeders + 4: size + 2: title + - name: type + type: select + label: Order requested from site + default: 2 + options: + 2: desc + 1: asc + - name: info + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: index.php?page=login + method: post + inputs: + uid: "{{ .Config.username }}" + pwd: "{{ .Config.password }}" + error: + - selector: body[onLoad^="makeAlert('"] + message: + selector: body[onLoad^="makeAlert('"] + attribute: onLoad + filters: + - name: replace + args: ["makeAlert('Error' , '", ""] + - name: replace + args: ["');", ""] + test: + path: index.php + selector: a[href="logout.php"] + +download: + before: + path: thanks.php + method: post + inputs: + infohash: "{{ .DownloadUri.Query.id }}" + thanks: 1 + rndval: "1487013827343" + selectors: + - selector: a[href^="download.php?id="] + attribute: href + filters: + - name: regexp + args: "^(.+?)&key=" + +search: + paths: + - path: index.php + keywordsfilters: + - name: diacritics + args: replace + - name: re_replace # S01 to 1 + args: ["(?i)\\bS0*(\\d+)\\b", "$1"] + - name: re_replace # S01E01 to 1 1 + args: ["(?i)\\bS0*(\\d+)E0*(\\d+)\\b", "$1 $2"] + inputs: + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBIDShort }}{{ else }}{{ .Keywords }}{{ end }}" + page: torrents + category: "{{ range .Categories }}{{.}};{{end}}" + options: "{{ if .Query.IMDBID }}4{{ else }}0{{ end }}" + active: 0 + order: "{{ .Config.sort }}" + by: "{{ .Config.type }}" + + rows: + selector: table > tbody > tr > td > table.lista > tbody > tr:has(a[href^="index.php?page=torrent-details&id="]) + + fields: + download: + selector: a[href^="index.php?page=downloadcheck&id="] + attribute: href + title: + selector: a[onmouseover][href^="index.php?page=torrent-details&id="] + filters: + - name: re_replace # S01 E01 to S01E01 + args: ["(?i)\\bS(\\d+)\\sE(\\d+)\\b", "S$1E$2"] + - name: re_replace # 01x01 to S01E01 + args: ["(?i)(\\d{2})x(\\d+)", "S$1E$2"] + - name: re_replace # 1x01 to S01E01 + args: ["(?i)\\b(\\d{1})x(\\d+)", "S0$1E$2"] + - name: re_replace # Stagione X --> S0X + args: ["(?i)\\bStagion[ei]\\s?(\\d{1})\\b|\\bSeason'?s?\\s?(\\d{1})\\b", "S0$1$2"] + - name: re_replace # Stagione XX --> SXX + args: ["(?i)\\bStagion[ei]\\s?(\\d{2,})\\b|\\bSeason'?s?\\s?(\\d{2,})\\b", "S$1$2"] + - name: re_replace # Episodio 4 to E4 + args: ["(?i)\\b(?:[\\/\\|]?Episodio\\s?(\\d+)|Puntata\\s?(\\d+))", "E$1$2"] + - name: re_replace # Episodi 4 5 to E04-05 + args: ["(?i)\\b(?:Puntate\\s*)(\\d+)\\s?(\\d+)", "E0$1-0$2"] + poster: + selector: a[onmouseover][href^="index.php?page=torrent-details&id="] + attribute: onmouseover + filters: + - name: regexp + args: "src=(.*?) " + category: + selector: a[href^="index.php?page=torrents&category="] + attribute: href + filters: + - name: querystring + args: category + details: + selector: a[onmouseover][href^="index.php?page=torrent-details&id="] + attribute: href + size: + selector: td:nth-last-child(4) + date: + selector: td:nth-last-child(9) + filters: + - name: append + args: " +01:00" # CET + - name: dateparse + args: "dd/MM/yyyy zzz" + grabs: + selector: td:nth-last-child(6) + seeders: + selector: td:nth-last-child(8) + leechers: + selector: td:nth-last-child(7) + downloadvolumefactor: + case: + img[alt="Gold 100% Free"]: 0 + img[alt="Silver 50% Free"]: 0.5 + img[alt="Bronze 25% Free"]: 0.75 + "*": 1 + uploadvolumefactor: + case: + img[alt="2x Upload Multiplier"]: 2 + img[alt="3x Upload Multiplier"]: 3 + img[alt="4x Upload Multiplier"]: 4 + img[alt="5x Upload Multiplier"]: 5 + img[alt="6x Upload Multiplier"]: 6 + img[alt="7x Upload Multiplier"]: 7 + img[alt="8x Upload Multiplier"]: 8 + img[alt="9x Upload Multiplier"]: 9 + img[alt="10x Upload Multiplier"]: 10 + "*": 1 +# xbtitFM v1.16 diff --git a/config/prowlarr/Definitions/arabp2p.yml b/config/prowlarr/Definitions/arabp2p.yml new file mode 100644 index 0000000..aa8496a --- /dev/null +++ b/config/prowlarr/Definitions/arabp2p.yml @@ -0,0 +1,171 @@ +--- +id: arabp2p +name: ArabP2P +description: "ArabP2P is an ARABIC Private Torrent Tracker for MOVIES / TV / GENERAL" +language: ar-AE +type: private +encoding: UTF-8 +links: + - https://www.arabp2p.net/ +legacylinks: + - http://www.arabp2p.com/ + - https://www.arabp2p.com/ + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: sort + type: select + label: Sort requested from site + default: 3 + options: + 3: created + 5: seeders + 4: size + 2: title + - name: type + type: select + label: Order requested from site + default: 2 + options: + 2: desc + 1: asc + +caps: + categorymappings: + # المرئيات العربية Arabic Movies + - {id: 14, cat: Movies, desc: "اسلامي (Islamic)"} + - {id: 19, cat: TV/Documentary, desc: "وثائقي (Documentary)"} + - {id: 70, cat: TV, desc: "تعليمي (Educational)"} + - {id: 41, cat: Movies, desc: "افلام عربيه (Arabic Movies)"} + - {id: 88, cat: Movies, desc: "افلام مدبلجه عربي (Arabic Dubbed Movies)"} + - {id: 44, cat: TV, desc: "مسلسلات عربية (Arabic Series)"} + - {id: 89, cat: TV, desc: "مسلسلات عربية كامله (Full Arabic Series)"} + - {id: 52, cat: TV, desc: "مسرحيات (Plays)"} + - {id: 71, cat: TV, desc: "مسلسلات مدبلجه عربي (Arabic Dubbed Series)"} + - {id: 90, cat: TV, desc: "برامج ومسابقات (Shows)"} + # المرئيات الاجنبية Foreign Movies + - {id: 92, cat: TV/Foreign, desc: "تعليمي (Educational)"} + - {id: 93, cat: TV/Documentary, desc: "وثائقي (Documentary)"} + - {id: 45, cat: TV/Foreign, desc: "مسلسلات وبرامج اجنبيه (Serials)"} + - {id: 57, cat: TV/Foreign, desc: "مسلسلات آسيوية (Asian Series)"} + - {id: 42, cat: Movies/Foreign, desc: "افلام اجنبيه (Foreign)"} + - {id: 74, cat: Movies/HD, desc: "جودة عالية HD"} + - {id: 76, cat: Movies/3D, desc: "ثلاثي الابعاد (3D)"} + - {id: 59, cat: Movies/Foreign, desc: "افلام آسيوية (Asian Movies)"} + - {id: 86, cat: Movies/Foreign, desc: "افلام هنديه (Indian Movies)"} + # انمي مدبلج عربي Anime Arabic dubbed + - {id: 98, cat: TV/Anime, desc: "افلام (Movies)"} + - {id: 100, cat: TV/Anime, desc: "مسلسلات (Series)"} + - {id: 102, cat: TV/Anime, desc: "حلقات (Episdoes)"} + # انمي مترجم عربي Anime Arabic translator + - {id: 99, cat: TV/Anime, desc: "افلام (Movies)"} + - {id: 101, cat: TV/Anime, desc: "مسلسلات (Series)"} + - {id: 103, cat: TV/Anime, desc: "حلقات (Episodes)"} + - {id: 85, cat: TV/Anime, desc: "الكارتون الصامت والكلاسيكي (Cartoons)"} + # صوتيات Audio + - {id: 25, cat: Audio, desc: "القران الكريم (The Holy Quran)"} + - {id: 27, cat: Audio, desc: "محاضرات (Lectures)"} + - {id: 26, cat: Audio, desc: "اناشيد (Chants)"} + # برامج Software + - {id: 22, cat: PC, desc: "برامج عربية (Arabic Software)"} + - {id: 23, cat: PC, desc: "برامج عامه (Public Software)"} + - {id: 78, cat: PC/Mobile-iOS, desc: "iPad/iPhone"} + - {id: 79, cat: PC/Mobile-Android, desc: "android"} + # العاب Games + - {id: 30, cat: PC/Games, desc: "PC"} + - {id: 31, cat: Console/PS3, desc: "PS2"} + - {id: 53, cat: Console/Wii, desc: "wii"} + - {id: 55, cat: Console/PSP, desc: "PSP"} + - {id: 63, cat: Console/XBox, desc: "XBOX"} + - {id: 64, cat: Console/PS3, desc: "PS3"} + # اخرى Other + - {id: 17, cat: Books, desc: "كتب (Books)"} + - {id: 65, cat: Other, desc: "صور (Images)"} + - {id: 56, cat: Other, desc: "رياضي (Sport)"} + - {id: 46, cat: Other, desc: "منوع (Misc)"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +login: + path: index.php + method: form + form: form[action^="index.php?page=login"] + inputs: + uid: "{{ .Config.username }}" + pwd: "{{ .Config.password }}" + error: + - selector: tr td span[style="color:#FF0000;"] + test: + path: index.php + selector: a[href^="logout.php?t="] + +search: + paths: + # https://www.arabp2p.com/index.php?page=torrents&search=&category=0&active=0&internel=0 + - path: index.php + inputs: + page: torrents + search: "{{ .Keywords }}" + category: "{{ if .Categories }}{{ range .Categories }}{{.}};{{end}}{{ else }}0{{ end }}" + # 0 all 1 activeonly 2 deadonly + active: 0 + # 0 all 1 internal 2 external + internel: 0 + order: "{{ .Config.sort }}" + by: "{{ .Config.type }}" + # does not support imdbid search or provide imdb link in results + + rows: + selector: table.torrent tr.torrent + filters: + - name: andmatch + + fields: + category: + selector: td a[href^="index.php?page=torrents&category="] + attribute: href + filters: + - name: querystring + args: category + title: + selector: td a[href^="index.php?page=torrent-details"] + details: + selector: td a[href^="index.php?page=torrent-details"] + attribute: href + download: + selector: td a[href^="download.php"] + attribute: href + date: + selector: td:nth-child(4) span + attribute: title + # auto adjusted by site account profile + filters: + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss" + seeders: + selector: td:nth-child(5) + leechers: + selector: td:nth-child(6) + size: + selector: td:nth-child(7) + downloadvolumefactor: + case: + span.free: 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 0.8 + minimumseedtime: + text: 259200 # 3 days +# xbtit diff --git a/config/prowlarr/Definitions/arabtorrents.yml b/config/prowlarr/Definitions/arabtorrents.yml new file mode 100644 index 0000000..f8813d2 --- /dev/null +++ b/config/prowlarr/Definitions/arabtorrents.yml @@ -0,0 +1,221 @@ +--- +id: arabtorrents +name: ArabTorrents +description: "ArabTorrents is an ARABIC Private Torrent Tracker for MOVIES / TV / GENERAL" +language: ar-AE +type: private +encoding: windows-1256 +requestDelay: 2 +links: + - https://arab-torrents.net/ + +caps: + categorymappings: + # Movies + - {id: 36, cat: Movies, desc: "Movies/Dubbed"} + - {id: 134, cat: Movies, desc: "HD Section"} + - {id: 135, cat: Movies/HD, desc: "Movies/HD Section"} + - {id: 204, cat: Movies/HD, desc: "R5/HD Section"} + - {id: 119, cat: Movies/SD, desc: "Movies/SD TV"} + - {id: 205, cat: Movies/Foreign, desc: "Foreign"} + - {id: 208, cat: Movies/Foreign, desc: "Stranger/Foreign"} + - {id: 209, cat: Movies/Foreign, desc: "Turkish/Foreign"} + - {id: 207, cat: Movies/Foreign, desc: "Indian/Foreign"} + - {id: 191, cat: Movies, desc: "Movies/Golden-VIP"} + - {id: 190, cat: Movies, desc: "Movies/Super VIP"} + - {id: 212, cat: Movies, desc: "Movies/VIP"} + - {id: 181, cat: Movies, desc: "Classic Movies/WEB-DL"} + - {id: 167, cat: Movies, desc: "Movies/WEB-DL"} + # Shows + - {id: 186, cat: TV, desc: "Dubbed"} + - {id: 166, cat: TV/WEB-DL, desc: "WEB-DL"} + - {id: 168, cat: TV/WEB-DL, desc: "Series/WEB-DL"} + - {id: 171, cat: TV/WEB-DL, desc: "TV Shows/WEB-DL"} + - {id: 180, cat: TV/WEB-DL, desc: "Classic Series/WEB-DL"} + - {id: 169, cat: TV/WEB-DL, desc: "Full-Pack/WEB-DL"} + - {id: 210, cat: Other, desc: "VIP"} + - {id: 211, cat: TV, desc: "TV Shows/VIP"} + - {id: 213, cat: TV, desc: "Full-Pack/VIP"} + - {id: 94, cat: TV, desc: "Super VIP"} + - {id: 189, cat: TV, desc: "TV Shows/Super VIP"} + - {id: 201, cat: TV, desc: "Full-Pack/Super VIP"} + - {id: 197, cat: TV, desc: "TV Shows/Ramadan 2022"} + - {id: 148, cat: TV/Other, desc: "Series/OSN"} + - {id: 149, cat: TV/Other, desc: "TV Show/OSN"} + - {id: 165, cat: TV, desc: "Golden-VIP"} + - {id: 185, cat: TV, desc: "Series/Golden-VIP"} + - {id: 200, cat: TV, desc: "Full-Pack/Golden-VIP"} + - {id: 26, cat: TV/SD, desc: "SD TV"} + - {id: 78, cat: TV/SD, desc: "Series/SD TV"} + - {id: 124, cat: TV/SD, desc: "FullPack/SD TV"} + - {id: 136, cat: TV/HD, desc: "Series/HD Section"} + - {id: 137, cat: TV/HD, desc: "TV Shows/HD Section"} + - {id: 182, cat: TV/HD, desc: "Full Pack/HD Section"} + - {id: 187, cat: TV/Foreign, desc: "TV Shows/Dubbed"} + - {id: 188, cat: TV/Foreign, desc: "Full-Pack/Dubbed"} + # Anime + - {id: 33, cat: TV/Anime, desc: "Anime"} + - {id: 51, cat: TV/Anime, desc: "Series/Anime"} + - {id: 129, cat: Movies/BluRay, desc: "Blu-Ray/Anime"} + - {id: 125, cat: TV, desc: "Full-Pack/Anime"} + - {id: 50, cat: Movies, desc: "Movies/Anime"} + # Islamic + - {id: 67, cat: Other, desc: "Islamic"} + - {id: 126, cat: TV, desc: "Full-Packs/Islamic"} + - {id: 91, cat: Audio/MP3, desc: "MP3/Islamic"} + - {id: 92, cat: Other, desc: "Video/Islamic"} + # Music + - {id: 16, cat: Audio, desc: "Music"} + - {id: 177, cat: Audio, desc: "Flac/Music"} + - {id: 127, cat: Audio, desc: "Full-Packs/Music"} + - {id: 17, cat: Audio/MP3, desc: "MP3/Music"} + - {id: 19, cat: Audio/Video, desc: "Videos/Music"} + # OSN + - {id: 146, cat: TV/Other, desc: "OSN"} + - {id: 147, cat: TV/Other, desc: "Arabic/OSN"} + - {id: 153, cat: TV/Other, desc: "English/OSN"} + - {id: 179, cat: TV/Other, desc: "Old/OSN"} + # Ramadan 2022 + - {id: 192, cat: Other, desc: "Ramadan 2022"} + - {id: 198, cat: Other, desc: "Full Pack/Ramadan 2022"} + - {id: 193, cat: Other, desc: "Ramadan HD/Ramadan 2022"} + - {id: 195, cat: Other, desc: "Ramadan Khaliji/Ramadan 2022"} + - {id: 194, cat: Other, desc: "Ramadan SD/Ramadan 2022"} + - {id: 196, cat: Other, desc: "Ramadan Web/Ramadan 2022"} + # Sports + - {id: 120, cat: TV/Sport, desc: "Sports"} + - {id: 159, cat: TV/Sport, desc: "Full Matches/Sports"} + - {id: 155, cat: TV/Sport, desc: "Goals/Sports"} + # Rest + - {id: 102, cat: TV/Other, desc: "Other/SD TV"} + - {id: 202, cat: Other, desc: "AT"} + - {id: 203, cat: Other, desc: "AT/AT"} + - {id: 34, cat: Other, desc: "Misc"} + - {id: 132, cat: PC/Mobile-Android, desc: "Android/Misc"} + - {id: 163, cat: TV/Documentary, desc: "Documentary/Misc"} + - {id: 122, cat: Other, desc: "Other/Misc"} + - {id: 121, cat: Other, desc: "Theater/Misc"} + - {id: 214, cat: Other, desc: "Other/VIP"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: table:has(td.thead:contains("حدث خطأ")) + test: + path: index.php + selector: a[href*="logout.php"] + +download: + before: + path: takethanks.php + method: post + inputs: + torrentid: "{{ re_replace .DownloadUri.PathAndQuery \".*download-torrent-(\\d+).*\" \"$1\"}}" + +search: + paths: + - path: browse.php + + inputs: + do: search + keywords: "{{ .Keywords }}" + # t_name, t_description, t_both, t_uploader, t_genre + search_type: t_both + # does not support multi category searching so defaulting to all. + category: 0 + include_dead_torrents: yes + sort: "{{ .Config.sort }}" + order: "{{ .Config.type }}" + + keywordsfilters: + - name: re_replace + args: ["\\W+", "*"] + - name: re_replace + args: ["^(.+)$", "*$1*"] + + rows: + selector: table#sortabletable > tbody > tr:has(span > a[href*="details.php?id="]) + + fields: + category: + selector: td a[href*="/torrent-category-"] + attribute: href + filters: + - name: regexp + args: "torrent-category-(\\d+)\/" + title: + selector: td div.tooltip-target + details: + selector: span a[href*="/details.php?id="] + attribute: href + download: + selector: a[href*="/download-torrent-"] + attribute: href + date: + selector: td:nth-child(2) > div:nth-child(3) + filters: + - name: regexp + args: "(\\d{2}-\\d{2}-\\d{4} \\d{2}:\\d{2})" + - name: dateparse + args: "dd-MM-yyyy HH:mm" + size: + selector: td:nth-child(5) + grabs: + selector: td:nth-child(6) + seeders: + selector: td:nth-child(7) + leechers: + selector: td:nth-child(8) + poster: + selector: div.tooltip-content > img[src*="/torrents/"] + attribute: src + downloadvolumefactor: + case: + img[src$="torrent_flags/freedownload.gif"]: 0 + img[src$="torrent_flags/silverdownload.gif"]: 0.5 + "*": 1 + uploadvolumefactor: + case: + img[src$="torrent_flags/x2.gif"]: 2 + "*": 1 + minimumratio: + text: 1.05 + minimumseedtime: + # 3 days (as seconds = 3 x 24 x 60 x 60) + text: 259200 +# TS Special Edition v.7.4 diff --git a/config/prowlarr/Definitions/arenabg.yml b/config/prowlarr/Definitions/arenabg.yml new file mode 100644 index 0000000..1e108fd --- /dev/null +++ b/config/prowlarr/Definitions/arenabg.yml @@ -0,0 +1,200 @@ +--- +id: arenabg +name: ArenaBG +description: "ArenaBG is a BULGARIAN Semi-Private Torrent Tracker for 0DAY / GENERAL" +language: bg-BG +type: semi-private +encoding: UTF-8 +links: + - https://arenabg.com/ +legacylinks: + - https://arenabg.ch/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Movies"} + - {id: 8, cat: Movies, desc: "Movies / ArenaBG.TV"} + - {id: 9, cat: Movies/SD, desc: "Movies / XviD"} + - {id: 10, cat: Movies/DVD, desc: "Movies / DVD-R"} + - {id: 11, cat: Movies/HD, desc: "Movies / x264"} + - {id: 12, cat: TV/Anime, desc: "Movies / Anime & Manga"} + - {id: 13, cat: TV/Documentary, desc: "Movies / Documentaries"} + - {id: 14, cat: Movies/BluRay, desc: "Movies / Blu-ray"} + - {id: 15, cat: Movies, desc: "Movies / Weekend"} + - {id: 16, cat: Movies, desc: "Movies / Boxset"} + - {id: 17, cat: Movies/HD, desc: "Movies / x264 Boxset"} + - {id: 18, cat: Movies/HD, desc: "Movies / HDTV"} + - {id: 19, cat: Movies/3D, desc: "Movies / 3D"} + - {id: 20, cat: Movies/HD, desc: "Movies / Movies HD"} + - {id: 21, cat: Movies/HD, desc: "Movies / x265"} + - {id: 22, cat: Movies/UHD, desc: "Movies / 4K"} + - {id: 59, cat: Movies/HD, desc: "Movies / AV1"} + - {id: 2, cat: TV, desc: "Series"} + - {id: 23, cat: TV/HD, desc: "Series / TV Episodes HD"} + - {id: 24, cat: TV, desc: "Series / TV Episodes"} + - {id: 25, cat: TV, desc: "Series / TV Boxset"} + - {id: 26, cat: TV/HD, desc: "Series / TV Boxset HD"} + - {id: 3, cat: Audio, desc: "Music"} + - {id: 27, cat: Audio/MP3, desc: "Music / MP3"} + - {id: 28, cat: Audio/Video, desc: "Music / Video"} + - {id: 29, cat: Audio/Lossless, desc: "Music / FLAC"} + - {id: 30, cat: Audio, desc: "Music / DVD"} + - {id: 31, cat: Audio/Lossless, desc: "Music / APE"} + - {id: 32, cat: Audio, desc: "Music / DTS"} + - {id: 33, cat: Audio, desc: "Music / WavePack"} + - {id: 34, cat: Audio, desc: "Music / OST"} + - {id: 4, cat: PC/Games, desc: "Games"} + - {id: 35, cat: PC/Games, desc: "Games / PC ISO"} + - {id: 36, cat: PC, desc: "Games / PC RIP"} + - {id: 37, cat: Console, desc: "Games / PS2"} + - {id: 38, cat: Console/PSP, desc: "Games / PSP"} + - {id: 39, cat: Console/XBox, desc: "Games / XBOX"} + - {id: 40, cat: Console/XBox 360, desc: "Games / XBOX-360"} + - {id: 41, cat: Console/PS3, desc: "Games / PS3"} + - {id: 42, cat: Console/Wii, desc: "Games / WII"} + - {id: 43, cat: Console/NDS, desc: "Games / NDS"} + - {id: 44, cat: Console/PS4, desc: "Games / PS4"} + - {id: 5, cat: PC, desc: "Software"} + - {id: 45, cat: PC/ISO, desc: "Software / PC ISO"} + - {id: 46, cat: PC/Mobile-Other, desc: "Software / Smartphone"} + - {id: 47, cat: PC, desc: "Software / Tutorial"} + - {id: 48, cat: PC/Mac, desc: "Software / MAC"} + - {id: 49, cat: PC/Mobile-Android, desc: "Software / Android"} + - {id: 50, cat: PC/Mobile-iOS, desc: "Software / iOS"} + - {id: 51, cat: PC/Mobile-Other, desc: "Software / WM7"} + - {id: 6, cat: XXX, desc: "XXX"} + - {id: 52, cat: XXX, desc: "XXX / Porn"} + - {id: 53, cat: XXX, desc: "XXX / XXX HD"} + - {id: 7, cat: Other, desc: "Misc"} + - {id: 54, cat: Other/Misc, desc: "Misc / Other"} + - {id: 55, cat: Books/EBook, desc: "Misc / e-Books"} + - {id: 56, cat: Other, desc: "Misc / Banned"} + - {id: 57, cat: TV/Sport, desc: "Misc / Sports"} + - {id: 58, cat: PC/0day, desc: "Misc / 0-Day"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: downloadlink + type: select + label: Download link + default: "magnet:?xt=" + options: + "/en/torrents/download/?key=": ".torrent" + "magnet:?xt=": "magnet" + - name: downloadlink2 + type: select + label: Download link (fallback) + default: "/en/torrents/download/?key=" + options: + "/en/torrents/download/?key=": ".torrent" + "magnet:?xt=": "magnet" + - name: info_download + type: info + label: About the Download links + default: You can optionally set as a fallback an automatic alternate link, so if the .torrent download link fails your download will still be successful. + +login: + path: en/users/signin/ + method: form + form: form[action="/en/users/signin/"] + inputs: + username_or_email: "{{ .Config.username }}" + password: "{{ .Config.password }}" + captcha: + type: image + selector: img[src="/captcha.php"] + input: captcha + error: + - selector: div.row div#container div.alert + test: + path: en/ + selector: a[href="/en/users/logout/"] + +download: + selectors: + - selector: a[href^="{{ .Config.downloadlink }}"] + attribute: href + - selector: a[href^="{{ .Config.downloadlink2 }}"] + attribute: href + +search: + paths: + # https://arenabg.com/en/torrents/?text=ice+s01e01 + - path: en/torrents/ + inputs: + text: "{{ .Keywords }}" + subtitles: "" + audio: "" + # does not support multi-cats so defaulting to all + category: "" + + rows: + selector: tr:has(a[href^="/en/torrents/?category="]) + + fields: + category: + selector: td.category a[href^="/en/torrents/?category="]:last-of-type + attribute: href + filters: + - name: querystring + args: category + _english: + selector: span[title="English"] + attribute: title + optional: true + _bulgarian: + selector: span[title="Bulgarian"] + attribute: title + optional: true + title: + selector: td.filename a.title + filters: + - name: append + args: "{{ if .Result._bulgarian }} {{ .Result._bulgarian }}{{ else }}{{ end }}{{ if .Result._english }} {{ .Result._english }}{{ else }}{{ end }}" + details: + selector: td.filename a.title + attribute: href + download: + selector: td.filename a.title + attribute: href + poster: + selector: td.filename a.title + attribute: onmouseover + filters: + - name: regexp + args: "\"(.+?)\"" + - name: replace + args: ["\\", ""] + date: + # 2 January 2021, Saturday @ 20:46 + selector: small + filters: + - name: regexp + args: "(.+?, .+? @ [0-9]{2}:[0-9]{2})" + - name: append + args: " +02:00" # EET + - name: dateparse + args: "d MMMM yyyy, dddd @ HH:mm zzz" + size: + selector: td:nth-child(3) + seeders: + selector: td:nth-child(4) + leechers: + selector: td:nth-child(5) + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/asiancinema.yml b/config/prowlarr/Definitions/asiancinema.yml new file mode 100644 index 0000000..659ae1b --- /dev/null +++ b/config/prowlarr/Definitions/asiancinema.yml @@ -0,0 +1,187 @@ +--- +id: asiancinema +name: AsianCinema +description: "Tracker Movies/TV/Music" +language: en-US +type: private +encoding: UTF-8 +links: + - https://asiancinema.me/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Movies"} + - {id: 2, cat: TV, desc: "TV"} + - {id: 3, cat: Audio, desc: "Music"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: login + method: form + form: form[action$="/login"] + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + remember: on + selectorinputs: + _token: + selector: input[name="_token"] + attribute: value + error: + - selector: div#ERROR_COPY +# test: +# path: / +# selector: a[href$="/logout"] + +search: + paths: + - path: torrents/filter + inputs: + $raw: "{{ range .Categories }}categories[]={{.}}&{{end}}" + search: "{{ if .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" # for dashboard imdbid search + imdb: "{{ .Query.IMDBIDShort }}" + tvdb: "{{ .Query.TVDBID }}" + tmdb: "{{ .Query.TMDBID }}" + sorting: "{{ .Config.sort }}" + direction: "{{ .Config.type }}" + qty: 100 + freeleech: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + # can support genre search but you need to know the id. &genre[]=10759 for Action & Adventure + # does not have genre in results, they are on the details page. + + rows: + selector: table > tbody > tr + + fields: + category: + selector: a[href*="/categories/"] + attribute: href + filters: + - name: regexp + args: "/categories/(\\d+)" + title: + selector: a.view-torrent + download: + selector: a[href*="/download/"] + attribute: href + details: + selector: a.view-torrent + attribute: href + poster: + selector: div.torrent-poster img + attribute: src + filters: + - name: prepend + args: "https://images.weserv.nl/?url=" # for display on dashboard + - name: append + args: "&w=180&h=270" # for display on dashboard + - name: replace + args: ["https://images.weserv.nl/?url=https://via.placeholder.com/600x900&w=180&h=270", ""] + size: + selector: td:nth-last-child(4) + seeders: + selector: td:nth-last-child(3) + leechers: + selector: td:nth-last-child(2) + grabs: + selector: td:nth-last-child(1) + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + tmdbid: + selector: a[href*="themoviedb.org/movie/"], a[href*="themoviedb.org/tv/"] + attribute: href + date: + selector: time + filters: + # translations for Turkish|Estonian|Danish|Italian|Polish|Norwegian|Portuguese|Czech|Russian|Romanian|Spanish|French|German|Bulgarian|Dutch|Chinese|Japanese|Swedish + - name: re_replace + args: ["(?i)(önce|tagasi|geleden|fa|temu|siden|há|atrás|nazpět|назад|acum|în urmă|hace|il y a|vor|преди|前|sedan)", " ago"] + - name: re_replace + args: ["(?i)(saniye|sekundit|sekunder|secondi|sekund|segundos|sekundami|секунд|secunde|secondes|Sekunden|секунди|seconden|秒前)", "seconds"] + - name: re_replace + args: ["(?i)(minutit|minutter|minuti|minuty|minutos|минуты|минут|Minuten|минути|minuten|minuter)", "minutes"] + - name: re_replace + args: ["(?i)(dakika|minut|minuto|minuta|minutt|минута|Minute|minuut|分钟|分)", " minute"] + - name: re_replace + args: ["(?i)(tundi|timer|ore|godziny|horas|hodiny|hoden|часа|часов|ore|heures|Stunden|timmar)", "hours"] + - name: re_replace + args: ["(?i)(saat|tund|time|ora|godzina|hora|hodina|час|oră|heure|Stunde|uur|小时|時間|timme)", " hour"] + - name: re_replace + args: ["(?i)(päeva|dage|giorni|dni|dias|dny|дня|дней|zile|días|jours|Tagen|дни|dagen|dagar)", "days"] + - name: re_replace + args: ["(?i)(gün|päev|dag|giorno|dzień|dia|den|день|zi|día|jour|Tag|ден|天|日)", " day"] + - name: re_replace + args: ["(?i)(nädalat|uger|settimane|tygodnie|uker|semanas|týdny|недели|недель|săptămâni|semaines|Wochen|седмици|weken|veckor)", "weeks"] + - name: re_replace + args: ["(?i)(hafta|nädal|uge|settimana|tydzień|uke|semana|týden|неделю|săptămână|semaine|Woche|седмица|周|週間|vecka)", " week"] + - name: re_replace + args: ["(?i) (ay)", "month"] + - name: re_replace + args: ["(?i)(kuud|måneder|mesi|miesiące|meses|měsíce|месяца|месяцев|luni|meses|mois|Monaten|месеца|maanden|månader)", "months"] + - name: re_replace + args: ["(?i)(kuu|måned|mese|miesiąc|mês|měsíc|месяц|lună|mes|Monat|месец|maand|个月|ヶ月|månad)", " month"] + - name: re_replace + args: ["(?i)(aastat|anni|lata|anos|roky|года|ani|años|ans|Jahren|години)", " years"] + - name: re_replace + args: ["(?i)(yil|aasta|år|anno|rok|ano|год|año|Jahr|година|jaar|年)", " year"] + - name: re_replace + args: ["(?i) (an)", "year"] + - name: re_replace + args: ["(?i)(För |und)", ""] # Misc removals + - name: timeago + downloadvolumefactor: + case: + i[class*="fa-id-badge text-orange"]: 0 # 24 Hour FreeLeech From BON Store + i[class*="fa-trophy text-purple"]: 0 # Special FreeLeech For Certain User Groups + i[class*="fa-star text-bold"]: 0 # Freeleech From Token + i[class*="fa-coins text-bold"]: 0 # Freeleech From Token + i[class*="fa-globe text-blue"]: 0 # Global Freeleech + i[class*="fa-star text-gold"]: 0 # Freeleech + i[class*="fa-certificate text-pink"]: 0 # Featured Torrent + "*": 1 + uploadvolumefactor: + case: + i[class*="fa-gem text-green"]: 2 # Single Torrent Double Upload + i[class*="fa-globe text-green"]: 2 # Global Double Upload + i[class*="fa-certificate text-pink"]: 2 # Featured Torrent + "*": 1 + minimumratio: + text: 0.4 + minimumseedtime: + # 7 days (as seconds = 7 x 24 x 60 x 60) + text: 604800 +# UNIT3D 3.0.0 diff --git a/config/prowlarr/Definitions/asiandvdclub.yml b/config/prowlarr/Definitions/asiandvdclub.yml new file mode 100644 index 0000000..6ea4cf8 --- /dev/null +++ b/config/prowlarr/Definitions/asiandvdclub.yml @@ -0,0 +1,157 @@ +--- +id: asiandvdclub +name: AsianDVDClub +description: "AsianDVDClub (ADC) is a Private Torrent Tracker for Asian DVD and BluRay" +language: en-US +type: private +encoding: UTF-8 +links: + - https://asiandvdclub.org/ + +caps: + categorymappings: + - {id: 1, cat: TV/Anime, desc: "Anime"} + - {id: 3, cat: Movies, desc: "Japan"} + - {id: 5, cat: Movies, desc: "China"} + - {id: 4, cat: Movies, desc: "Korea"} + - {id: 2, cat: Movies, desc: "Hong Kong"} + - {id: 6, cat: Movies, desc: "Philippines"} + - {id: 7, cat: Movies, desc: "Taiwan"} + - {id: 8, cat: Movies, desc: "Thailand"} + - {id: 9, cat: Movies, desc: "Vietnam"} + - {id: 10, cat: Movies, desc: "Malaysia"} + - {id: 11, cat: Movies, desc: "Other Asian"} + - {id: 12, cat: Other, desc: "Miscellaneous"} + - {id: 15, cat: TV, desc: "TV Series"} + - {id: 16, cat: Audio, desc: "Music/OST"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + up: seeders + size: size + title: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login + method: post + inputs: + apple: evil + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: b:contains("Try again") + test: + path: index.php + selector: a[href="/logout"] + +search: + paths: + - path: torrents/ + inputs: + $raw: "{{ range .Categories }}countries[]={{.}}&{{end}}" + searchbox: "{{ .Keywords }}" + search: Search + golden: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + column: "{{ .Config.sort }}" + order: "{{ .Config.type }}" + + rows: + selector: table.torrenttable_helper > tbody > tr:has(img) + + fields: + category: + selector: img[class^="cat-"] + attribute: class + optional: true + default: 12 + case: + img.cat-anime: 1 + img.cat-hk: 2 + img.cat-japan: 3 + img.cat-korea: 4 + img.cat-china: 5 + img.cat-phil: 6 + img.cat-taiwan: 7 + img.cat-thai: 8 + img.cat-viet: 9 + img.cat-malaysia: 10 + img.cat-rest: 11 + img.cat-india: 11 + img.cat-misc: 12 + img.cat-pinku: 12 + img.cat-drama: 15 + img.cat-ost: 16 + title: + selector: span[id] + details: + selector: a[href^="/torrent/"] + attribute: href + download: + selector: a[href^="/torrent/"] + attribute: href + filters: + - name: replace + args: ["torrent", "download"] + poster: + selector: span[id] + attribute: data-ot + filters: + - name: regexp + args: src='(.+?)' + size: + selector: td:nth-child(6) + seeders: + selector: td:nth-child(7) + leechers: + selector: td:nth-child(8) + date: + selector: td:nth-child(9) span.small + filters: + - name: timeago + grabs: + selector: td:nth-child(10) + downloadvolumefactor: + case: + img[src$="images/golden.gif"]: 0 + img[src$="images/silver.gif"]: 0.5 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.5 + minimumseedtime: + # 45 days (as seconds = 45 x 24 x 60 x 60) + text: 3888000 +# Engine n/a diff --git a/config/prowlarr/Definitions/audiences.yml b/config/prowlarr/Definitions/audiences.yml new file mode 100644 index 0000000..a79e66e --- /dev/null +++ b/config/prowlarr/Definitions/audiences.yml @@ -0,0 +1,167 @@ +--- +id: audiences +name: Audiences +description: "Audiences is a CHINESE Private Torrent Tracker for MOVIES / TV / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://audiences.me/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "电影/Movies"} + - {id: 402, cat: TV, desc: "剧集/TV-Series"} + - {id: 403, cat: TV, desc: "综艺/TV-Show"} + - {id: 406, cat: TV/Documentary, desc: "纪录片/Documentary"} + - {id: 408, cat: Audio, desc: "音乐/Music"} + - {id: 404, cat: Audio/Audiobook, desc: "有声书/Audiobook"} + - {id: 405, cat: Books, desc: "电子书/Ebook"} + - {id: 407, cat: TV/Sport, desc: "体育/Sports"} + - {id: 410, cat: PC/Games, desc: "游戏/Game"} + - {id: 411, cat: PC/0day, desc: "软件/Software"} + - {id: 410, cat: TV, desc: "学习/Study"} + - {id: 409, cat: Other, desc: "其他/Other"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 incldead, 1 active, 2 justdead + incldead: 0 + # promotion: 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x 50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 2 title or imdb or douban url, 3 uploader, 4 imdb + search_area: "{{ if or .Query.IMDBID .Query.DoubanID }}2{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[title][href^="details.php?id="] + attribute: title + details: + selector: a[title][href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + doubanid: + selector: a[href*="movie.douban.com/subject/"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-child(5) + seeders: + selector: td.rowfollow:nth-child(6) + leechers: + selector: td.rowfollow:nth-child(7) + grabs: + selector: td.rowfollow:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 + description: + selector: td:nth-child(2) + remove: a, img +# NexusPHP Standard v1.5 Beta 4 diff --git a/config/prowlarr/Definitions/audionews.yml b/config/prowlarr/Definitions/audionews.yml new file mode 100644 index 0000000..b6dadfd --- /dev/null +++ b/config/prowlarr/Definitions/audionews.yml @@ -0,0 +1,330 @@ +--- +id: audionews +name: AudioNews +description: "AudioNews (AN) is a Private Torrent Tracker for AUDIO SOFTWARE / SAMPLES / ETC" +language: en-US +type: private +encoding: UTF-8 +links: + - https://audionews.org/ + +caps: + categorymappings: + - {id: 106, cat: PC/Mobile-Other, desc: "Mobile Apps"} + - {id: 161, cat: PC/Mobile-iOS, desc: "Mobile Apps iOS"} + - {id: 160, cat: PC/Mobile-Android, desc: "Mobile Apps Android"} + - {id: 12, cat: PC, desc: "AUDIOAPPS"} + - {id: 32, cat: PC, desc: "AUDIOAPPS DAW Apps"} + - {id: 175, cat: PC, desc: "AUDIOAPPS Ableton"} + - {id: 177, cat: PC, desc: "AUDIOAPPS Cakewalk"} + - {id: 176, cat: PC, desc: "AUDIOAPPS REAPER"} + - {id: 174, cat: PC, desc: "AUDIOAPPS Steinberg"} + - {id: 34, cat: PC, desc: "AUDIOAPPS Mastering &Audio Editor Apps"} + - {id: 37, cat: PC, desc: "AUDIOAPPS DJ Apps"} + - {id: 13, cat: Audio, desc: "SAMPLE LIBRARIES"} + - {id: 62, cat: Audio, desc: "SAMPLE LIBRARIES AMG"} + - {id: 117, cat: Audio, desc: "SAMPLE LIBRARIES Bela D Media"} + - {id: 118, cat: Audio, desc: "SAMPLE LIBRARIES Beta Monkey Music"} + - {id: 51, cat: Audio, desc: "SAMPLE LIBRARIES Best Service"} + - {id: 46, cat: Audio, desc: "SAMPLE LIBRARIES Big Fish"} + - {id: 66, cat: Audio, desc: "SAMPLE LIBRARIES Bigga Giggas"} + - {id: 122, cat: Audio, desc: "SAMPLE LIBRARIES Bluezone Corporation"} + - {id: 123, cat: Audio, desc: "SAMPLE LIBRARIES Bunker 8"} + - {id: 126, cat: Audio, desc: "SAMPLE LIBRARIES Cinematique Instruments"} + - {id: 127, cat: Audio, desc: "SAMPLE LIBRARIES CineSamples"} + - {id: 128, cat: Audio, desc: "SAMPLE LIBRARIES ClusterSound"} + - {id: 121, cat: Audio, desc: "SAMPLE LIBRARIES Dan Dean"} + - {id: 195, cat: Audio, desc: "SAMPLE LIBRARIES Diginoiz"} + - {id: 52, cat: Audio, desc: "SAMPLE LIBRARIES Digital Juice"} + - {id: 134, cat: Audio, desc: "SAMPLE LIBRARIES Digital-Redux"} + - {id: 65, cat: Audio, desc: "SAMPLE LIBRARIES Digital Vision"} + - {id: 59, cat: Audio, desc: "SAMPLE LIBRARIES Discovery Firm"} + - {id: 61, cat: Audio, desc: "SAMPLE LIBRARIES Drumdrops"} + - {id: 40, cat: Audio, desc: "SAMPLE LIBRARIES East West"} + - {id: 74, cat: Audio, desc: "SAMPLE LIBRARIES Electronisounds"} + - {id: 80, cat: Audio, desc: "SAMPLE LIBRARIES EMU format"} + - {id: 82, cat: Audio, desc: "SAMPLE LIBRARIES ENSONIQ format"} + - {id: 111, cat: Audio, desc: "SAMPLE LIBRARIES Fatloud"} + - {id: 135, cat: Audio, desc: "SAMPLE LIBRARIES Fox Samples"} + - {id: 41, cat: Audio, desc: "SAMPLE LIBRARIES FxPansion"} + - {id: 130, cat: Audio, desc: "SAMPLE LIBRARIES Goldbaby"} + - {id: 54, cat: Audio, desc: "SAMPLE LIBRARIES Hollywood Edge"} + - {id: 64, cat: Audio, desc: "SAMPLE LIBRARIES IK Multimedia"} + - {id: 75, cat: Audio, desc: "SAMPLE LIBRARIES Ilio"} + - {id: 108, cat: Audio, desc: "SAMPLE LIBRARIES Industrial Strength Records"} + - {id: 81, cat: Audio, desc: "SAMPLE LIBRARIES KURZWEIL format"} + - {id: 91, cat: Audio, desc: "SAMPLE LIBRARIES Loopmasters"} + - {id: 92, cat: Audio, desc: "SAMPLE LIBRARIES Masterbits"} + - {id: 58, cat: Audio, desc: "SAMPLE LIBRARIES M-Audio"} + - {id: 112, cat: Audio, desc: "SAMPLE LIBRARIES Mutekki"} + - {id: 137, cat: Audio, desc: "SAMPLE LIBRARIES Mystic Kingz"} + - {id: 47, cat: Audio, desc: "SAMPLE LIBRARIES Native Instruments"} + - {id: 60, cat: Audio, desc: "SAMPLE LIBRARIES Nine Volt Audio"} + - {id: 129, cat: Audio, desc: "SAMPLE LIBRARIES OrangeTree"} + - {id: 203, cat: Audio, desc: "SAMPLE LIBRARIES Origin Sound"} + - {id: 154, cat: Audio, desc: "SAMPLE LIBRARIES P5Audio"} + - {id: 133, cat: Audio, desc: "SAMPLE LIBRARIES Peace Love Productions"} + - {id: 140, cat: Audio, desc: "SAMPLE LIBRARIES Pound Audio"} + - {id: 110, cat: Audio, desc: "SAMPLE LIBRARIES Prime Loops"} + - {id: 180, cat: Audio, desc: "SAMPLE LIBRARIES Producer Loops"} + - {id: 50, cat: Audio, desc: "SAMPLE LIBRARIES Prominy"} + - {id: 171, cat: Audio, desc: "SAMPLE LIBRARIES Pulsed Records"} + - {id: 132, cat: Audio, desc: "SAMPLE LIBRARIES Puremagnetik"} + - {id: 49, cat: Audio, desc: "SAMPLE LIBRARIES Refills"} + - {id: 99, cat: Audio, desc: "SAMPLE LIBRARIES reFX Nexus"} + - {id: 125, cat: Audio, desc: "SAMPLE LIBRARIES Realsamples"} + - {id: 83, cat: Audio, desc: "SAMPLE LIBRARIES ROLAND format"} + - {id: 109, cat: Audio, desc: "SAMPLE LIBRARIES Sample Magic"} + - {id: 136, cat: Audio, desc: "SAMPLE LIBRARIES Samplephonics"} + - {id: 43, cat: Audio, desc: "SAMPLE LIBRARIES Sampletekk"} + - {id: 48, cat: Audio, desc: "SAMPLE LIBRARIES Scarbee"} + - {id: 178, cat: Audio, desc: "SAMPLE LIBRARIES SFX (Sound FX libraries)"} + - {id: 90, cat: Audio, desc: "SAMPLE LIBRARIES Smartsound"} + - {id: 172, cat: Audio, desc: "SAMPLE LIBRARIES Sonart Audio"} + - {id: 116, cat: Audio, desc: "SAMPLE LIBRARIES SonicCouture"} + - {id: 42, cat: Audio, desc: "SAMPLE LIBRARIES Sonic Implants"} + - {id: 115, cat: Audio, desc: "SAMPLE LIBRARIES Sonic Reality"} + - {id: 53, cat: Audio, desc: "SAMPLE LIBRARIES Sound Ideas"} + - {id: 56, cat: Audio, desc: "SAMPLE LIBRARIES Sony"} + - {id: 139, cat: Audio, desc: "SAMPLE LIBRARIES Sounds To Sample"} + - {id: 76, cat: Audio, desc: "SAMPLE LIBRARIES Spectrasonics"} + - {id: 162, cat: Audio, desc: "SAMPLE LIBRARIES Spitfire Audio"} + - {id: 193, cat: Audio, desc: "SAMPLE LIBRARIES studiolinked"} + - {id: 68, cat: Audio, desc: "SAMPLE LIBRARIES Synthogy"} + - {id: 179, cat: Audio, desc: "SAMPLE LIBRARIES The Loop Loft"} + - {id: 96, cat: Audio, desc: "SAMPLE LIBRARIES Tonehammer, 8dio, SoundIron"} + - {id: 67, cat: Audio, desc: "SAMPLE LIBRARIES Toontrack, Drumkit From Hell, DFHS"} + - {id: 69, cat: Audio, desc: "SAMPLE LIBRARIES Ueberschall"} + - {id: 157, cat: Audio, desc: "SAMPLE LIBRARIES USB Soundscan"} + - {id: 120, cat: Audio, desc: "SAMPLE LIBRARIES Valentino Production"} + - {id: 173, cat: Audio, desc: "SAMPLE LIBRARIES vandalism sounds"} + - {id: 170, cat: Audio, desc: "SAMPLE LIBRARIES Vanilla Groove Studios"} + - {id: 119, cat: Audio, desc: "SAMPLE LIBRARIES Vengeance Sound"} + - {id: 114, cat: Audio, desc: "SAMPLE LIBRARIES Video Helper"} + - {id: 44, cat: Audio, desc: "SAMPLE LIBRARIES Vienna"} + - {id: 77, cat: Audio, desc: "SAMPLE LIBRARIES Vipzone"} + - {id: 131, cat: Audio, desc: "SAMPLE LIBRARIES Wavesfactory"} + - {id: 89, cat: Audio, desc: "SAMPLE LIBRARIES West one"} + - {id: 113, cat: Audio, desc: "SAMPLE LIBRARIES Wusik.com"} + - {id: 78, cat: Audio, desc: "SAMPLE LIBRARIES Yellowtools"} + - {id: 138, cat: Audio, desc: "SAMPLE LIBRARIES YnK.Audio"} + - {id: 100, cat: Audio, desc: "SAMPLE LIBRARIES Zenhiser"} + - {id: 57, cat: Audio, desc: "SAMPLE LIBRARIES Zero-G"} + - {id: 15, cat: PC, desc: "VSTi + FX"} + - {id: 72, cat: PC, desc: "VSTi + FX FX"} + - {id: 181, cat: PC, desc: "VSTi + FX VSTi"} + - {id: 18, cat: PC/Mac, desc: "MAC"} + - {id: 186, cat: PC/Mac, desc: "MAC Apps"} + - {id: 188, cat: PC/Mac, desc: "MAC FX"} + - {id: 189, cat: PC/Mac, desc: "MAC Instruments"} + - {id: 190, cat: PC/Mac, desc: "MAC TUTORIAL"} + - {id: 187, cat: PC/Mac, desc: "MAC Samples"} + - {id: 19, cat: Other, desc: "MISC"} + - {id: 185, cat: Other, desc: "MISC Utilities"} + - {id: 84, cat: Books, desc: "SHEET MUSIC"} + - {id: 87, cat: Books, desc: "SHEET MUSIC Full Score"} + - {id: 86, cat: Books, desc: "SHEET MUSIC Guitar"} + - {id: 88, cat: Books, desc: "SHEET MUSIC Other instruments"} + - {id: 85, cat: Books, desc: "SHEET MUSIC Piano"} + - {id: 20, cat: Books, desc: "LEARNING"} + - {id: 197, cat: Books, desc: "LEARNING Academy.FM"} + - {id: 183, cat: Books, desc: "LEARNING ADSR"} + - {id: 141, cat: Books, desc: "LEARNING Alfred"} + - {id: 142, cat: Books, desc: "LEARNING Ask Video"} + - {id: 27, cat: Books, desc: "LEARNING Books"} + - {id: 143, cat: Books, desc: "LEARNING FaderPro"} + - {id: 144, cat: Books, desc: "LEARNING Groove3"} + - {id: 145, cat: Books, desc: "LEARNING Hal Leonard"} + - {id: 105, cat: Books, desc: "LEARNING Hardware manuals"} + - {id: 196, cat: Books, desc: "LEARNING Jam Track Central"} + - {id: 146, cat: Books, desc: "LEARNING Lick Library"} + - {id: 147, cat: Books, desc: "LEARNING Lynda.com"} + - {id: 148, cat: Books, desc: "LEARNING MacProVideo"} + - {id: 101, cat: Books, desc: "LEARNING Magazines"} + - {id: 93, cat: Books, desc: "LEARNING Music Video (Concerts, DVD, DVDrip)"} + - {id: 199, cat: Books, desc: "LEARNING PUREMIX"} + - {id: 149, cat: Books, desc: "LEARNING Riff Interactive"} + - {id: 194, cat: Books, desc: "LEARNING SkillShare"} + - {id: 150, cat: Books, desc: "LEARNING Sonic Academy"} + - {id: 151, cat: Books, desc: "LEARNING Total training"} + - {id: 152, cat: Books, desc: "LEARNING TrueFire"} + - {id: 182, cat: Books, desc: "LEARNING Udemy"} + - {id: 28, cat: Books, desc: "LEARNING Video"} + - {id: 153, cat: Books, desc: "LEARNING VTC"} + - {id: 29, cat: Audio/Other, desc: "PRESETS"} + - {id: 167, cat: Audio/Other, desc: "PRESETS Ableton Live"} + - {id: 184, cat: Audio/Other, desc: "PRESETS Impulse Responses"} + - {id: 166, cat: Audio/Other, desc: "PRESETS Massive"} + - {id: 163, cat: Audio/Other, desc: "PRESETS Nebula"} + - {id: 200, cat: Audio/Other, desc: "PRESETS Omnisphere"} + - {id: 165, cat: Audio/Other, desc: "PRESETS Reaktor"} + - {id: 201, cat: Audio/Other, desc: "PRESETS Xfer Serum"} + - {id: 164, cat: Audio/Other, desc: "PRESETS Sylenth"} + - {id: 168, cat: Audio/Other, desc: "PRESETS Toontrack"} + - {id: 239, cat: Books, desc: "Service Manuals"} + - {id: 21, cat: Other, desc: "UPDATE"} + - {id: 222, cat: Other, desc: "GFXNEWS 3D"} + - {id: 235, cat: Other, desc: "GFXNEWS APPS ANDROID & IOS"} + - {id: 207, cat: Other, desc: "GFXNEWS APPS WIN"} + - {id: 215, cat: Other, desc: "GFXNEWS APPS LINUX"} + - {id: 214, cat: Other, desc: "GFXNEWS APPS MAC"} + - {id: 211, cat: Other, desc: "GFXNEWS BOOKS"} + - {id: 224, cat: Other, desc: "GFXNEWS CAD/CAM"} + - {id: 237, cat: Other, desc: "GFXNEWS DAZ3D"} + - {id: 212, cat: Other, desc: "GFXNEWS FONTS"} + - {id: 213, cat: Other, desc: "GFXNEWS FOOTAGE"} + - {id: 233, cat: Other, desc: "GFXNEWS GAME DEVELOPMENT"} + - {id: 226, cat: Other, desc: "GFXNEWS MAGAZINE"} + - {id: 234, cat: Other, desc: "GFXNEWS MATERIAL"} + - {id: 243, cat: Other, desc: "GFXNEWS OTHER GRAPHICS"} + - {id: 244, cat: Other, desc: "GFXNEWS OTHER GRAPHICS Zbrush, Substance tools"} + - {id: 216, cat: Other, desc: "GFXNEWS PHOTOSTOCK"} + - {id: 220, cat: Other, desc: "GFXNEWS PHOTOGRAPHY - ART"} + - {id: 227, cat: Other, desc: "GFXNEWS 2D Graphics"} + - {id: 250, cat: Other, desc: "GFXNEWS 2D Graphics Effects"} + - {id: 228, cat: Other, desc: "GFXNEWS 2D Graphics Actions, Pattern & Styles"} + - {id: 229, cat: Other, desc: "GFXNEWS 2D Graphics Background & PSD Source"} + - {id: 230, cat: Other, desc: "GFXNEWS 2D Graphics Brushes & Gradient"} + - {id: 246, cat: Other, desc: "GFXNEWS 2D Graphics Mockup"} + - {id: 247, cat: Other, desc: "GFXNEWS 2D Graphics Overlays"} + - {id: 249, cat: Other, desc: "GFXNEWS 2D Graphics Preset"} + - {id: 231, cat: Other, desc: "GFXNEWS 2D Graphics Toolkits, Papers & Objects"} + - {id: 245, cat: Other, desc: "GFXNEWS GFX Plugins"} + - {id: 210, cat: Other, desc: "GFXNEWS PLUGINS WIN"} + - {id: 223, cat: Other, desc: "GFXNEWS PLUGINS MAC"} + - {id: 225, cat: Other, desc: "GFXNEWS PLUGINS LINUX"} + - {id: 217, cat: Other, desc: "GFXNEWS SCRIPTS - WEB PROGRAMMING"} + - {id: 218, cat: Other, desc: "GFXNEWS TEMPLATES"} + - {id: 232, cat: Other, desc: "GFXNEWS TEXTURES"} + - {id: 219, cat: Other, desc: "GFXNEWS TUTORIALS"} + - {id: 238, cat: Other, desc: "GFXNEWS VECTOR GRAPHICS"} + - {id: 221, cat: Other, desc: "GFXNEWS VIDEO PRODUCTION"} + + modes: + search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: sort + type: select + label: Sort requested from site + default: 1 + options: + 1: created + 10: seeders + 7: size + 2: title + - name: type + type: select + label: Order requested from site + default: 2 + options: + 2: desc + 1: asc + +login: + path: login.php + method: post + inputs: + "login_username": "{{ .Config.username }}" + "login_password": "{{ .Config.password }}" + autologin: 1 + login: "Log in" + redirect: "/" + error: + - selector: table.error + message: + selector: table.error tr td div.msg + test: + path: / + selector: li a[href^="./login.php?logout=1"] + +search: + paths: + - path: tracker.php + method: post + inputs: + $raw: "{{ if .Categories }}{{ range .Categories }}f[]={{.}}&{{end}}{{ else }}f[]=-1{{ end }}" + prev_allw: 1 + prev_a: 0 + prev_dla: 0 + prev_dlc: 0 + prev_dld: 0 + prev_dlw: 0 + prev_my: 0 + prev_new: 0 + prev_sd: 0 + prev_da: 1 + prev_dc: 0 + prev_df: 1 + prev_ds: 0 + pre_tor_type: 0 + prev_date_from: "" + prev_date_to: "" + prev_hide_rereg: 0 + o: "{{ .Config.sort }}" + s: "{{ .Config.type }}" + df: 1 + da: 1 + nm: "{{ .Keywords }}" + pn: "" + submit: "Search" + + rows: + selector: table.forumline > tbody > tr:has(a[href*="/dl.php?id="]) + dateheaders: + selector: td[colspan="20"] > strong + filters: + - name: append + args: " -07:00" # PDT + - name: dateparse + args: "MM-dd-yyyy zzz" + + fields: + title: + selector: td a[href*="/viewtopic.php?t="] + details: + selector: td a[href*="/viewtopic.php?t="] + attribute: href + download: + selector: td a[href*="/dl.php?id="] + attribute: href + category: + selector: td a[href*="/tracker.php?f="] + attribute: href + filters: + - name: querystring + args: f + size: + selector: td:contains(\00a0GB), td:contains(\00a0MB), td:contains(\00a0kB), td:contains(\00a0B) + optional: true + default: 0 + seeders: + selector: td[title="Seeders"] + optional: true + default: 0 + leechers: + selector: td[title="Leechers"] + optional: true + default: 0 + grabs: + selector: td[title^="Replies:"] + optional: true + default: 0 + description: + case: + span.tor-approved: Verified + span.tor-not-approved: Unverified + downloadvolumefactor: + text: 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 0.8 +# engine n/a diff --git a/config/prowlarr/Definitions/aussierules.yml b/config/prowlarr/Definitions/aussierules.yml new file mode 100644 index 0000000..5856ef2 --- /dev/null +++ b/config/prowlarr/Definitions/aussierules.yml @@ -0,0 +1,92 @@ +--- +id: aussierules +name: Aussierul.es +description: "Aussierul.es is a torrent site for Aussie Rules Football played in Australia" +language: en-AU +type: private +encoding: UTF-8 +links: + - https://aussierul.es/ + +caps: + categories: + 1: TV/Sport + + modes: + search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: type + label: Search Type + type: select + default: t_name + options: + t_name: Torrent Name + t_description: Torrent Description + t_both: Name & Description + t_uploader: Uploader + t_genre: IMDB Genre + - name: dead + label: Include Dead Torrents + type: select + default: No + options: + yes: Yes + no: No + +login: + method: form + form: form + path: login.php + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: table:contains("An error has occured!") + test: + path: browse.php + selector: a[href*="logout.php"] + +search: + paths: + - path: browse.php + inputs: + search_type: "{{ .Config.type }}" + include_dead_torrents: "{{ .Config.dead }}" + keywords: "{{ .Keywords }}" + + rows: + selector: table#sortabletable > tbody > tr:not(:first-child) + + fields: + category: + text: 1 + title: + selector: td:nth-child(2) > div:nth-child(1) > a > strong + details: + selector: td:nth-child(2) > div:nth-child(1) > a + attribute: href + download: + selector: a[href*="download.php?id="] + attribute: href + date: + # 27-03-2021 18:34 + selector: td:nth-child(2) > div:nth-child(2) + filters: + - name: dateparse + args: "d-MM-yyyy HH:mm" + size: + selector: td:nth-child(5) + grabs: + selector: td:nth-child(6) + seeders: + selector: td:nth-child(7) + leechers: + selector: td:nth-child(8) +# TS Special Edition v.7.4 diff --git a/config/prowlarr/Definitions/azusa.yml b/config/prowlarr/Definitions/azusa.yml new file mode 100644 index 0000000..85693be --- /dev/null +++ b/config/prowlarr/Definitions/azusa.yml @@ -0,0 +1,173 @@ +--- +id: azusa +name: Azusa +description: "Azusa is a CHINESE Torrent Tracker focusing on Comics" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://azusa.wiki/ + +caps: + categorymappings: + - {id: 404, cat: PC/Games, desc: "Game"} + - {id: 402, cat: Books/Comics, desc: "Comic"} + - {id: 403, cat: Books/EBook, desc: "Light Novel"} + - {id: 407, cat: Other, desc: "CG"} + - {id: 409, cat: Audio, desc: "Music"} + + modes: + search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: 2facode + type: text + label: 2FA code + - name: info_2fa + type: info + label: "About 2FA code" + default: "Only fill in the 2FA code box if you have enabled 2FA on the Uploads Web Site. Otherwise just leave it empty." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + secret: "" + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + two_step_code: "{{ .Config.2facode }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: "" + error: + - selector: td.embedded:has(h2:contains("失败")) + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl + search_area: 0 + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-child(5) + seeders: + selector: td.rowfollow:nth-child(6) + leechers: + selector: td.rowfollow:nth-child(7) + grabs: + selector: td.rowfollow:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + description: + selector: td:nth-child(2) + remove: a, b, font, img, span +# NexusPHP v1.7.20 2022-08-05 diff --git a/config/prowlarr/Definitions/backups.yml b/config/prowlarr/Definitions/backups.yml new file mode 100644 index 0000000..9609f94 --- /dev/null +++ b/config/prowlarr/Definitions/backups.yml @@ -0,0 +1,167 @@ +--- +id: backups +name: Back-ups +description: "Back-Ups is a Private Torrent Tracker for MOVIES / TV / GENERAL" +language: en-US +type: private +encoding: UTF-8 +links: + - https://back-ups.me/ + +caps: + categorymappings: + - {id: 15, cat: PC/Mobile-Android, desc: "Android"} + - {id: 35, cat: TV/Anime, desc: "Anime"} + - {id: 51, cat: PC/Mac, desc: "Apple"} + - {id: 3, cat: PC, desc: "Apps"} + - {id: 64, cat: Audio/Audiobook, desc: "Audiobooks"} + - {id: 71, cat: Console, desc: "Batocera"} + - {id: 4, cat: Movies/BluRay, desc: "Blu-Ray"} + - {id: 22, cat: Console, desc: "CoinOps"} + - {id: 42, cat: Console, desc: "CoinOPS Official"} + - {id: 65, cat: Console, desc: "CoinOps Unofficial"} + - {id: 63, cat: Books/Comics, desc: "Comics"} + - {id: 60, cat: Console, desc: "Core"} + - {id: 72, cat: Console, desc: "CORE Community"} + - {id: 44, cat: Console, desc: "CP78"} + - {id: 16, cat: TV/Documentary, desc: "Docu"} + - {id: 41, cat: Console, desc: "Dragon"} + - {id: 5, cat: Books, desc: "EBooks"} + - {id: 61, cat: Console, desc: "emuxtras"} + - {id: 69, cat: TV, desc: "Entertainment"} + - {id: 34, cat: TV, desc: "Kids"} + - {id: 43, cat: Console, desc: "LB No Intro"} + - {id: 33, cat: TV/Sport, desc: "MMA/Boxing"} + - {id: 32, cat: Movies, desc: "Movie Pack"} + - {id: 6, cat: Movies, desc: "Movies/XVID"} + - {id: 7, cat: Audio, desc: "Music"} + - {id: 31, cat: Console, desc: "Nintendo"} + - {id: 59, cat: Console, desc: "P-R-U"} + - {id: 8, cat: PC/Games, desc: "PC Games"} + - {id: 50, cat: Console, desc: "PlayBox"} + - {id: 30, cat: Console, desc: "Playstation"} + - {id: 62, cat: Console, desc: "RaspberryPi"} + - {id: 56, cat: Console, desc: "Retro Minis"} + - {id: 67, cat: Console, desc: "Retrobat"} + - {id: 27, cat: Console, desc: "Roms and Emulators"} + - {id: 68, cat: Console, desc: "Schmoomer's"} + - {id: 57, cat: Console, desc: "Sega"} + - {id: 40, cat: TV, desc: "Soaps"} + - {id: 29, cat: TV/Sport, desc: "Sport"} + - {id: 9, cat: TV, desc: "TV-Boxsets"} + - {id: 11, cat: TV, desc: "TV/x264"} + - {id: 10, cat: TV, desc: "TV/Xvid"} + - {id: 14, cat: TV/Sport, desc: "WWE"} + - {id: 26, cat: Console, desc: "Xbox"} + - {id: 12, cat: Console, desc: "XBOX360"} + - {id: 23, cat: XXX, desc: "xxx18+"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 40 on your account profile. + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: td:contains("remaining tries") + test: + path: browse.php + selector: a[href*="/logout.php"] + +search: + paths: + - path: browse.php + keywordsfilters: + # remove words <= 3 characters and surrounding special characters + - name: re_replace + args: ["(?:^|\\s)[_\\+\\/\\.\\-\\(\\)]*[\\S]{0,3}[_\\+\\/\\.\\-\\(\\)]*(?:\\s|$)", " "] + inputs: + do: search + keywords: "{{ .Keywords }}" + # t_name, t_description, t_both, t_uploader, t_genre + search_type: t_name + category: 0 # multi cat search not supported + # yes, no + include_dead_torrents: yes + # sort is done via do=quick_sort, and freeleech sorting is part of that set + + rows: + selector: "table#sortabletable > tbody > tr:has(a[href*=\"/details.php?id=\"]){{ if .Config.freeleech }}:has(img[src$=\"freedownload.gif\"]){{ else }}{{ end }}" + filters: + - name: andmatch + args: 66 + + fields: + category: + selector: a[href*="/browse.php?category="] + attribute: href + filters: + - name: querystring + args: category + title_default: + selector: a[href*="/details.php?id="] + title: + selector: div.tooltip-content > div + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href*="/details.php?id="] + attribute: href + download: + selector: a[href*="/download.php?id="] + attribute: href + magnet: + selector: a[href^="magnet:?xt="] + attribute: href + size: + selector: td:nth-child(5) + grabs: + selector: td:nth-child(6) + seeders: + selector: td:nth-child(7) + leechers: + selector: td:nth-child(8) + poster: + selector: div.tooltip-content > img + attribute: src + downloadvolumefactor: + case: + img[src$="freedownload.gif"]: 0 + img[src$="silverdownload.gif"]: 0.5 + "*": 1 + uploadvolumefactor: + case: + img[src$="x2.gif"]: 2 + "*": 1 + date: + selector: "td:nth-child(2) > div:has(span[style=\"float: right;\"])" + remove: span + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "dd-MM-yyyy HH:mm zzz" +# TS Special Edition v.8.0 diff --git a/config/prowlarr/Definitions/badasstorrents.yml b/config/prowlarr/Definitions/badasstorrents.yml new file mode 100644 index 0000000..ad36f18 --- /dev/null +++ b/config/prowlarr/Definitions/badasstorrents.yml @@ -0,0 +1,104 @@ +--- +id: badasstorrents +name: Badass Torrents +description: "Badass Torrents is a Public torrent site for MOVIES / TV / GENERAL" +language: en-US +type: public +encoding: UTF-8 +requestDelay: 5 +links: + - https://badasstorrents.com/ + - https://badasstorrents.mrunblock.bond/ + - https://badasstorrents.nocensor.cloud/ +legacylinks: + - https://badasstorrents.nocensor.work/ + - https://badasstorrents.nocensor.biz/ + - https://badasstorrents.nocensor.sbs/ + - https://badasstorrents.nocensor.world/ + - https://badasstorrents.nocensor.lol/ + - https://badasstorrents.nocensor.art/ + - https://badasstorrents.mrunblock.guru/ + - https://badasstorrents.mrunblock.life/ + - https://badasstorrents.nocensor.click/ + +caps: + categories: + Anime: TV/Anime + Apps: PC + Books: Books + Games: PC/Games + Movies: Movies + Music: Audio + Other: Other + TV: TV + XXX: XXX + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q, album, artist] + book-search: [q] +settings: + - name: downloadlink + type: select + label: Download link + default: "magnet:?xt=" + options: + "/download/": ".torrent" + "magnet:?xt=": "magnet" + - name: downloadlink2 + type: select + label: Download link (fallback) + default: "/download/" + options: + "/download/": ".torrent" + "magnet:?xt=": "magnet" + - name: info_download + type: info + label: About the Download links + default: You can optionally set as a fallback an automatic alternate link, so if the .torrent download link fails your download will still be successful. + +download: + selectors: + - selector: a[href*="{{ .Config.downloadlink }}"] + attribute: href + - selector: a[href*="{{ .Config.downloadlink2 }}"] + attribute: href + +search: + paths: + - path: "torrents{{ if .Keywords }}/search/{{ .Keywords }}{{ else }}{{ end }}" + - path: "torrents{{ if .Keywords }}/search/{{ .Keywords }}{{ else }}{{ end }}/26" + + rows: + selector: table.table-hover > tbody > tr:has(a[href*="/torrent/"]) + filters: + - name: andmatch + + fields: + category: + selector: a[href*="/cat/"] + title: + selector: a[href*="/torrent/"] + details: + selector: a[href*="/torrent/"] + attribute: href + download: + selector: a[href*="/torrent/"] + attribute: href + date: + selector: td:nth-child(4) + filters: + - name: timeago + size: + selector: td:nth-child(5) + seeders: + selector: td:nth-child(6) + leechers: + selector: td:nth-child(7) + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/bangumi-moe.yml b/config/prowlarr/Definitions/bangumi-moe.yml new file mode 100644 index 0000000..4a7c4aa --- /dev/null +++ b/config/prowlarr/Definitions/bangumi-moe.yml @@ -0,0 +1,81 @@ +--- +id: bangumi-moe +name: Bangumi Moe +description: "Bangumi Moe is a Public torrent site for ANIME" +language: en-US +type: public +encoding: UTF-8 +requestDelay: 3 +links: + - https://bangumi.moe/ + +caps: + categorymappings: + - {id: 549ef207fe682f7549f1ea90, cat: TV/Anime, desc: "Anime"} + - {id: 54967e14ff43b99e284d0bf7, cat: TV/Anime, desc: "Anime Pack"} + - {id: 549cc9369310bc7d04cddf9f, cat: Movies, desc: "Anime Movie"} + - {id: 549eef6ffe682f7549f1ea8b, cat: Audio, desc: "Music"} + - {id: 549eefebfe682f7549f1ea8c, cat: Books/Comics, desc: "Comic"} + - {id: 549ef015fe682f7549f1ea8d, cat: Console, desc: "Game"} + - {id: 549ef250fe682f7549f1ea91, cat: Other, desc: "Other"} + - {id: 549ff1db30bcfc225bf9e607, cat: Console, desc: "Dorama"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: [] + +search: + paths: + # https://bangumi.moe/api/torrent/latest + # https://bangumi.moe/api/v2/torrent/search + - path: "{{ if .Keywords }}api/v2/torrent/search{{ else }}api/torrent/latest{{ end }}" + method: "{{ if .Keywords }}post{{ else }}get{{ end }}" + response: + type: json + + inputs: +# $raw: "{{ if .Keywords }}query={{ .Keywords }}{{ else }}{{ end }}" + query: "{{ .Keywords }}" + + rows: + selector: torrents + + fields: + category: + selector: category_tag_id + title: + selector: title + details: + text: / + infohash: + selector: infoHash + poster: + selector: introduction + filters: + - name: regexp + args: "src=\\\"(.+?)\\\"" + description: + selector: category_tag.locale.en + date: + # 2021-10-19T06:10:15.772Z + selector: publish_time + size: + selector: size + optional: true + default: 0 B + grabs: + selector: downloads + seeders: + selector: seeders + leechers: + selector: leechers + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# json api v2 diff --git a/config/prowlarr/Definitions/beitai.yml b/config/prowlarr/Definitions/beitai.yml new file mode 100644 index 0000000..2a813cc --- /dev/null +++ b/config/prowlarr/Definitions/beitai.yml @@ -0,0 +1,167 @@ +--- +id: beitai +name: BeiTai +description: "BeiTai is a CHINESE Private Torrent Tracker for HD MOVIES / TV" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://www.beitai.pt/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "Movies/电影"} + - {id: 404, cat: TV/Documentary, desc: "Documentaries/纪录片"} + - {id: 405, cat: TV/Anime, desc: "Animations/动漫"} + - {id: 402, cat: TV, desc: "TV Series/剧集"} + - {id: 403, cat: TV, desc: "TV Shows/综艺"} + - {id: 406, cat: Audio/Video, desc: "MusicVideo/音乐MV"} + - {id: 407, cat: TV/Sport, desc: "Sports/运体"} + - {id: 409, cat: Other, desc: "Misc/其他"} + - {id: 408, cat: Audio, desc: "HQ Audio/无损音乐"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("失败")) + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if .Query.DoubanID }}/{{ .Query.DoubanID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }}{{ else }}{{ .Keywords }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl (4 does not appear to work). + search_area: "{{ if or .Query.IMDBID .Query.DoubanID }}1{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + imdbid: + selector: div.imdb_100 > a + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td:nth-child(5) + seeders: + selector: td:nth-child(6) + leechers: + selector: td:nth-child(7) + grabs: + selector: td:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + description: + selector: td:nth-child(2) + remove: a, b, font, img, span +# NexusPHP Standard v1.5 Beta 4 diff --git a/config/prowlarr/Definitions/beload.yml b/config/prowlarr/Definitions/beload.yml new file mode 100644 index 0000000..2c67136 --- /dev/null +++ b/config/prowlarr/Definitions/beload.yml @@ -0,0 +1,161 @@ +--- +id: beload +name: Beload +description: "Beload is a HUNGARIAN Private Torrent Tracker for MOVIES / TV / GENERAL" +language: hu-HU +type: private +encoding: UTF-8 +links: + - https://beload.org/ + +caps: + categorymappings: + - {id: 27, cat: Movies/DVD, desc: "Animáció/DVD/Eng"} + - {id: 26, cat: Movies/DVD, desc: "Animáció/DVD/Hun"} + - {id: 25, cat: Movies/HD, desc: "Animáció/HD/Eng"} + - {id: 24, cat: Movies/HD, desc: "Animáció/HD/Hun"} + - {id: 28, cat: Movies/SD, desc: "Animáció/SD/Hun"} + - {id: 12, cat: Movies/SD, desc: "Film/Cam/Eng"} + - {id: 11, cat: Movies/SD, desc: "Film/Cam/Hun"} + - {id: 4, cat: Movies/DVD, desc: "Film/DVD-R/Eng"} + - {id: 3, cat: Movies/DVD, desc: "Film/DVD-R/Hun"} + - {id: 6, cat: Movies/DVD, desc: "Film/DVD9/Eng"} + - {id: 5, cat: Movies/DVD, desc: "Film/DVD9/Hun"} + - {id: 2, cat: Movies/Foreign, desc: "Film/HD/Eng"} + - {id: 1, cat: Movies/HD, desc: "Film/HD/Hun"} + - {id: 8, cat: Movies/Foreign, desc: "Film/SD/Eng"} + - {id: 7, cat: Movies/SD, desc: "Film/SD/Hun"} + - {id: 10, cat: Movies/Foreign, desc: "Film/XviD/Eng"} + - {id: 9, cat: Movies/SD, desc: "Film/XviD/Hun"} + - {id: 31, cat: Audio/Audiobook, desc: "Hangoskönyv"} + - {id: 42, cat: PC/Games, desc: "Játék/ISO"} + - {id: 43, cat: PC/Games, desc: "Játék/RIP"} + - {id: 30, cat: Books/Foreign, desc: "Könyv/Eng"} + - {id: 29, cat: Books/EBook, desc: "Könyv/Hun"} + - {id: 44, cat: PC/ISO, desc: "Program/ISO"} + - {id: 45, cat: PC, desc: "Program/RIP"} + - {id: 14, cat: TV/Foreign, desc: "Sorozat/HD/Eng"} + - {id: 13, cat: TV/HD, desc: "Sorozat/HD/Hun"} + - {id: 16, cat: TV/Foreign, desc: "Sorozat/SD/Eng"} + - {id: 15, cat: TV/SD, desc: "Sorozat/SD/hun"} + - {id: 38, cat: XXX/SD, desc: "XXX/HD"} + - {id: 41, cat: XXX/ImageSet, desc: "XXX/Kép"} + - {id: 40, cat: XXX/SD, desc: "XXX/SD"} + - {id: 20, cat: Audio/Foreign, desc: "Zene/Mp3/Eng"} + - {id: 19, cat: Audio/MP3, desc: "Zene/Mp3/Hun"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 1: title + 4: created + 7: seeders + 5: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: index.php + selector: a[href="/logout.php"] + +search: + paths: + - path: browse.php + + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 active, 1 both, 2 dead, 3 my uploa, 4 waiting for seeds + incldead: 1 + sort: "{{ .Config.sort }}" + order: "{{ .Config.type }}" + # does not support imdbid searches + + rows: + selector: "td.text table tbody tr:has(a[href^=\"details.php?id=\"]):not(:has(a[href=\"browse.php?cat=0\"]))" + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + attribute: title + filters: + - name: regexp + args: "Név: (.+?)(\\n|$)" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?torrent="] + attribute: href + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + poster: + selector: a.preview + attribute: href + date: + selector: td:nth-last-child(5) + filters: + - name: append + args: " +01:00" # CET + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + files: + selector: td:nth-last-child(7) + size: + selector: td:nth-last-child(4) b + grabs: + selector: td:nth-last-child(3) + seeders: + selector: td:nth-last-child(2) + leechers: + selector: td:nth-last-child(1) + description: + case: + i.fa-check: Verified + i.fa-question: Unverified + downloadvolumefactor: + case: + font:contains("x0"): 0 + "*": 1 + uploadvolumefactor: + case: + font:contains("x2"): 2 + font:contains("x4"): 4 + "*": 1 + minimumseedtime: + # 3 days (as seconds = 3 x 24 x 60 x 60) + text: 259200 +# engine n/a diff --git a/config/prowlarr/Definitions/bestcore.yml b/config/prowlarr/Definitions/bestcore.yml new file mode 100644 index 0000000..6e9a2bc --- /dev/null +++ b/config/prowlarr/Definitions/bestcore.yml @@ -0,0 +1,202 @@ +--- +id: bestcore +name: Best-Core +description: "Best-Core is a HUNGARIAN Private Tracker for MOVIES / TV" +language: hu-HU +type: private +encoding: ISO-8859-2 +links: + - https://best-core.info/ + +caps: + categorymappings: + - {id: 81, cat: Movies/3D, desc: "3D"} + - {id: 83, cat: Movies/UHD, desc: "4K/UHD"} + - {id: 80, cat: Movies/Other, desc: "Best-Core"} + - {id: 51, cat: Books/EBook, desc: "E-book"} + - {id: 88, cat: Audio/Audiobook, desc: "E-book/Hangoskönyv"} + - {id: 77, cat: Movies/HD, desc: "Film/BDRip/Eng"} + - {id: 86, cat: Movies/HD, desc: "Film/BDRip/Ger"} + - {id: 76, cat: Movies/HD, desc: "Film/BDRip/Hun"} + - {id: 75, cat: Movies/BluRay, desc: "Film/Blu-ray/Eng"} + - {id: 74, cat: Movies/BluRay, desc: "Film/Blu-ray/Hun"} + - {id: 25, cat: Movies/DVD, desc: "Film/DVD/Eng"} + - {id: 24, cat: Movies/DVD, desc: "Film/DVD/Hun"} + - {id: 85, cat: Movies/DVD, desc: "Film/DVD9"} + - {id: 21, cat: Movies/HD, desc: "Film/HD/Eng"} + - {id: 53, cat: Movies/HD, desc: "Film/HD/Hun"} + - {id: 20, cat: Movies/SD, desc: "Film/XviD/Eng"} + - {id: 34, cat: Movies/SD, desc: "Film/XviD/Hun"} + - {id: 90, cat: Movies/SD, desc: "Film/XviD/Pack"} + - {id: 26, cat: PC/Games, desc: "Játék/ISO"} + - {id: 52, cat: PC/Games, desc: "Játék/Rip"} + - {id: 89, cat: Movies/SD, desc: "Kamerás/Eng"} + - {id: 82, cat: Movies/SD, desc: "Kamerás/Hun"} + - {id: 38, cat: Other, desc: "Képek"} + - {id: 43, cat: Console/PS3, desc: "Konzol/PS"} + - {id: 45, cat: Console/PSP, desc: "Konzol/PSP"} + - {id: 44, cat: Console/XBox, desc: "Konzol/Xbox"} + - {id: 73, cat: TV/Anime, desc: "Mese/Eng"} + - {id: 70, cat: TV/Anime, desc: "Mese/Hun"} + - {id: 37, cat: PC/Mobile-Other, desc: "Mobil"} + - {id: 1, cat: PC/ISO, desc: "Program/ISO"} + - {id: 22, cat: PC/0day, desc: "Program/Rip"} + - {id: 54, cat: TV/SD, desc: "Sorozat/DVD/Eng"} + - {id: 55, cat: TV/SD, desc: "Sorozat/DVD/Hun"} + - {id: 58, cat: TV/SD, desc: "Sorozat/Xvid/Eng"} + - {id: 7, cat: TV/SD, desc: "Sorozat/Xvid/Hun"} + - {id: 62, cat: Audio/Video, desc: "Videoklip"} + - {id: 64, cat: XXX/DVD, desc: "XXX/DVD"} + - {id: 48, cat: XXX/ImageSet, desc: "XXX/Képek"} + - {id: 9, cat: XXX/XviD, desc: "XXX/Xvid"} + - {id: 40, cat: Audio/MP3, desc: "Zene/Eng"} + - {id: 6, cat: Audio/MP3, desc: "Zene/Hun"} + - {id: 87, cat: Audio/Lossless, desc: "Zene/Lossless"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + book-search: [q] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search FreeLeech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 1: title + 4: added + 5: size + 7: seeders + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrent oldalankén: setting to 100 on your account profile. + - name: info_login + type: info + label: About login error + default: If you get a Login Failed, got redirected. error during your config save then most likely you have used an incorrect username or password. + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + test: + path: index.php + selector: a[href^="logout.php?c="] + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" # for dashboard imdbid search + # 0 active, 1 all, 2 deadonly, 3 freeleech + incldead: "{{ if .Config.freeleech }}3{{ else }}1{{ end }}" + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + + rows: + selector: tr.torrent_h + filters: + - name: andmatch + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + optional: true + default: 38 + filters: + - name: querystring + args: cat + title_default: + # can be abbreviated + selector: a[href^="details.php?id="] + title: + # usually full length + selector: a[href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + poster: + selector: a[onmouseover] + attribute: onmouseover + filters: + - name: regexp + args: "src=(.*?) " + - name: replace + args: ["https://i.kek.sh/null", ""] + download: + selector: a[href^="download.php?id="] + attribute: href + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + date: + selector: td:nth-child(2) + filters: + - name: regexp + args: "(\\d{4}-\\d{2}-\\d{2}\\s\\d{2}:\\d{2}:\\d{2})" + - name: append + args: " +01:00" # CET + - name: replace + args: ["\xA0", " "] + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + files: + selector: td:nth-child(5) + size: + selector: td:nth-child(7) + grabs: + selector: td:nth-child(7) + filters: + - name: regexp + args: x \d(\d+) x$ + seeders: + selector: td:nth-child(8) + leechers: + selector: td:nth-child(9) + description: + case: + img[src="pic/yes.png"]: Verified + img[src="pic/nincs.png"]: Unverified + downloadvolumefactor: + case: + img[src="pic/free.png"]: 0 + "*": 1 + uploadvolumefactor: + selector: td:nth-child(7) b + filters: + - name: regexp + args: (\d+) + minimumratio: + text: 0.8 + minimumseedtime: + # 3 days (as seconds = 3 x 24 x 60 x 60) + text: 259200 +# custom v3.0 diff --git a/config/prowlarr/Definitions/beyond-hd.yml b/config/prowlarr/Definitions/beyond-hd.yml new file mode 100644 index 0000000..4281bcd --- /dev/null +++ b/config/prowlarr/Definitions/beyond-hd.yml @@ -0,0 +1,133 @@ +--- +id: beyond-hd +name: Beyond-HD +description: "Without BeyondHD, your HDTV is just a TV" +language: en-US +type: private +encoding: UTF-8 +links: + - https://beyond-hd.me/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Movies"} + - {id: 2, cat: TV, desc: "TV"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + +settings: + - name: info_oid + type: info + label: "About 2FA" + default: "If you want to enable 2FA then use the Beyond-HD (API) indexer instead." + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: login + method: form + form: form[action$="/login"] + captcha: + type: image + selector: img[src^="/captcha?_CAPTCHA"] + input: key + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + remember: on + selectorinputs: + _token: + selector: input[name="_token"] + attribute: value + error: + - selector: form[action$="/login"] .text-red + - selector: script:contains("toastr.error") + message: + selector: script:contains("toastr.error") +# test: +# path: torrents + +search: + paths: + - path: torrents + inputs: + $raw: "{{ range .Categories }}categories[]={{.}}&{{end}}" + search: "{{ if .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" # for dashboard imdbid search + imdb: "{{ .Query.IMDBIDShort }}" + tmdb: "{{ .Query.TMDBID }}" + sorting: "{{ .Config.sort }}" + direction: "{{ .Config.type }}" + qty: 100 + + rows: + selector: div.table-torrents > table > tbody > tr[id^="torrentposter"] + + fields: + category: + selector: a[href*="/categories/"] + attribute: href + optional: true + default: 1 + filters: + - name: regexp + args: "/categories/.*?\\.(\\d+)" + title: + selector: a.torrent-name + details: + selector: a.torrent-name + attribute: href + download: + selector: a[href*="/download/"] + attribute: href + date: + selector: td:not(a[href$="/history"]) span.text-orange + filters: + - name: timeago + size: + selector: td span.text-blue + seeders: + selector: a[href$="/peers"] span.text-green + leechers: + selector: a[href$="/peers"] span.text-red + grabs: + selector: a[href$="/history"] + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + tmdbid: + selector: a[href*="themoviedb.org/movie/"], a[href*="themoviedb.org/tv/"] + attribute: href + downloadvolumefactor: + case: + i[data-original-title="100% Free"]: 0 + i[data-original-title="100% Free (Limited UL)"]: 0 + i[data-original-title="25% Promo"]: 0.75 + i[data-original-title="50% Promo"]: 0.5 + i[data-original-title="75% Promo"]: 0.25 + "*": 1 + uploadvolumefactor: + text: 1 +# UNIT3D (custom) diff --git a/config/prowlarr/Definitions/bibliotik.yml b/config/prowlarr/Definitions/bibliotik.yml new file mode 100644 index 0000000..eb4f2d5 --- /dev/null +++ b/config/prowlarr/Definitions/bibliotik.yml @@ -0,0 +1,141 @@ +--- +id: bibliotik +name: Bibliotik +description: "Bibliotik is a private site for eBooks and audiobooks" +language: en-US +type: private +encoding: UTF-8 +links: + - https://bibliotik.me/ + +caps: + categorymappings: + - {id: 1, cat: PC, desc: "Applications"} + - {id: 3, cat: Audio/Audiobook, desc: "Audiobooks"} + - {id: 4, cat: Books/Comics, desc: "Comics"} + - {id: 5, cat: Books/EBook, desc: "eBooks"} + - {id: 7, cat: Books/Mags, desc: "Magazines"} + + modes: + search: [q] + book-search: [q, title, author] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: orderby + type: select + label: Sort requested from site + default: added + options: + "@relevance": relevance + title: title + size: size + added: added + seeders: seeders + - name: order + type: select + label: Order requested from site + default: DESC + options: + DESC: desc + ASC: asc + +login: + path: / + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + keeplogged: 1 + login: "Log In!" + error: + - selector: center:first-of-type + test: + path: torrents/ + selector: div#pre_header + +search: + paths: + - path: torrents/ + inputs: + search: "{{ if .Query.Author }} @authors {{ .Query.Author }}{{ else }}{{ end }}{{ if .Query.Title }} @title {{ .Query.Title }}{{ else }}{{ end }}{{ .Keywords }}" + $raw: "{{ range .Categories }}cat[]={{.}}&{{end}}" + orderby: "{{ .Config.orderby }}" + order: "{{ .Config.order }}" + + rows: + selector: table#torrents_table > tbody > tr:has(.title) + + fields: + category: + selector: td:first-child + case: + div[title="Applications"]: 1 + div[title="Audiobooks"]: 3 + div[title="Comics"]: 4 + div[title="Ebooks"]: 5 + div[title="Magazines"]: 7 + _editor: + selector: .editorLink + optional: true + author: + selector: .authorLink + optional: true + default: "{{ .Result._editor }}" + year: + selector: .torYear + optional: true + _filetype: + selector: .torFormat + optional: true + _retail: + selector: .torRetail + optional: true + booktitle: + selector: .title a + title: + text: "{{ .Result.booktitle }}" + filters: + - name: append + args: "{{ if .Result.author }} by {{ .Result.author }}{{ else }}{{ end }}{{ if .Result.year }} {{ .Result.year }}{{ else }}{{ end }}{{ if .Result._filetype }} {{ .Result._filetype }}{{ else }}{{ end }}{{ if .Result._retail }} {{ .Result._retail }}{{ else }}{{ end }}" + details: + selector: .title a + attribute: href + date: + selector: .t_files_size_added time + attribute: datetime + optional: true + default: now + download: + selector: a[title="Download"] + attribute: href + files: + selector: .t_files_size_added + filters: + - name: regexp + args: "^\\s*(\\d+)\\s*file" + size: + selector: .t_files_size_added span + attribute: data-bytecount + seeders: + selector: .seeders + optional: true + default: 0 + leechers: + selector: .leechers + optional: true + default: 0 + grabs: + selector: .snatches + optional: true + default: 0 + downloadvolumefactor: + text: 1 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/bigfangroup.yml b/config/prowlarr/Definitions/bigfangroup.yml new file mode 100644 index 0000000..4f10e65 --- /dev/null +++ b/config/prowlarr/Definitions/bigfangroup.yml @@ -0,0 +1,235 @@ +--- +id: bigfangroup +name: BigFANGroup +description: "BigFANGroup is a RUSSIAN Public Torrent Tracker for MOVIES / TV" +language: ru-RU +type: public +encoding: windows-1251 +links: + - https://bigfangroup.org/ + - https://www.freebfg.org/ + +caps: + categorymappings: + - {id: 51, cat: Movies/3D, desc: "3D"} + - {id: 12, cat: TV, desc: "Анимация"} + - {id: 35, cat: Audio/Audiobook, desc: "Аудио-книги"} + - {id: 13, cat: Movies, desc: "Боевик"} + - {id: 52, cat: Movies, desc: "Биография"} + - {id: 33, cat: Movies, desc: "Военный"} + - {id: 45, cat: Audio/Video, desc: "Видеоклипы"} + - {id: 48, cat: Movies, desc: "Вестерн"} + - {id: 21, cat: Movies, desc: "Драма"} + - {id: 32, cat: TV/Documentary, desc: "Документальный"} + - {id: 39, cat: Movies, desc: "Детектив"} + - {id: 44, cat: Audio, desc: "Зарубежная музыка"} + - {id: 5, cat: PC/Games, desc: "Игры"} + - {id: 28, cat: Movies, desc: "Исторический"} + - {id: 18, cat: Movies, desc: "Катастрофа"} + - {id: 24, cat: Movies, desc: "Комедия"} + - {id: 36, cat: Movies, desc: "Криминал"} + - {id: 38, cat: Books, desc: "Книги и журналы"} + - {id: 53, cat: Movies, desc: "Классика"} + - {id: 54, cat: Audio, desc: "Классическая музыка"} + - {id: 19, cat: Movies, desc: "Мелодрама"} + - {id: 20, cat: Movies, desc: "Мультфильм"} + - {id: 31, cat: Movies, desc: "Мистика"} + - {id: 46, cat: Audio, desc: "Муз. сборники"} + - {id: 29, cat: Movies/Foreign, desc: "Наше кино"} + - {id: 49, cat: TV, desc: "Научно-популярное"} + - {id: 50, cat: TV, desc: "Новости"} + - {id: 27, cat: Movies, desc: "Приключения"} + - {id: 9, cat: Other, desc: "Разное"} + - {id: 43, cat: Audio/Foreign, desc: "Русская музыка"} + - {id: 1, cat: PC, desc: "Софт"} + - {id: 11, cat: TV, desc: "Сериалы"} + - {id: 37, cat: TV/Sport, desc: "Спорт"} + - {id: 47, cat: Movies, desc: "Сказки"} + - {id: 55, cat: Audio, desc: "Саундтрек"} + - {id: 25, cat: TV, desc: "ТВ-шоу"} + - {id: 22, cat: Movies, desc: "Триллер"} + - {id: 26, cat: Movies, desc: "Ужасы"} + - {id: 23, cat: Movies, desc: "Фантастика"} + - {id: 30, cat: Movies, desc: "Фэнтази"} + - {id: 42, cat: XXX, desc: "Эротика"} + - {id: 14, cat: Movies/HD, desc: "HDTV"} + - {id: 15, cat: Movies/DVD, desc: "DVD"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: stripcyrillic + type: checkbox + label: Strip Cyrillic Letters + default: false + - name: addrussiantotitle + type: checkbox + label: Add RUS to end of all titles to improve language detection by Sonarr and Radarr. Will cause English-only results to be misidentified. + default: false + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seed: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +search: + # https://bigfangroup.org/browse.php?search=black+lightning&cat=0&incldead=0&year=0&format=0 + headers: + Referer: ["{{ .Config.sitelink }}browse.php?search={{ .Keywords }}&cat=0&incldead=1&year=0&format=0"] + paths: + # https://bigfangroup.org/browse.php?ajax=1&search=the+librarian&cat=0&incldead=0&year=0&format=0 + - path: browse.php + inputs: + ajax: 1 + search: "{{ .Keywords }}" + cat: 0 + # 0 active, 1 incldead, 2 onlydead, 3 gold, 4 noseed, 5 silver, 7 BFG + incldead: 1 + year: 0 + format: 0 + s: "{{ .Config.sort }}" + d: "{{ .Config.type }}" + + keywordsfilters: + # strip season and/or ep + - name: re_replace + args: ["(?i)\\b(?:[SE]\\d{1,4}){1,2}\\b\\s?", ""] + + rows: + selector: table > tbody#highlighted > tr:has(a[href^="browse.php?cat="]) + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + filters: + # normalize to SXXEYY format + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)\\s*(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)", "S$1E$2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?)", "S$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+[CС]езоны?", "S$1"] + - name: re_replace + args: ["(?i)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)", "E$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "E$1"] + - name: re_replace + args: ["(?i)\\s\\|\\sот\\s([\\w\\p{P}\\p{S}]+)$", "-$1"] + - name: re_replace + args: ["\\s\\|\\s(\\w{4,})$", "-$1"] + - name: re_replace + args: ["(\\([\\p{IsCyrillic}\\W]+\\))|(^[\\p{IsCyrillic}\\W\\d]+\\/ )|([\\p{IsCyrillic} \\-]+,+)|([\\p{IsCyrillic}]+)", "{{ if .Config.stripcyrillic }}{{ else }}$1$2$3$4{{ end }}"] + - name: re_replace + args: ["(?i)\\bHDTV[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bSAT[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bWEB[-\\s]?DL[-\\s]?Rip\\b", "WEB-DL"] + - name: re_replace + args: ["(?i)\\bWEB\\sRip\\b", "WEBRip"] + - name: re_replace + args: ["(?i)\\bWEB\\sDL\\b", "WEB-DL"] + - name: re_replace + args: ["[\\[\\(\\{<«][\\s\\W]*[\\]\\)\\}>»]", ""] + - name: re_replace + args: ["^[\\s&,\\.!\\?\\+\\-_\\|\\/':]+", ""] + - name: append + args: "{{ if .Config.addrussiantotitle }} RUS{{ else }}{{ end }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="details.php?id="] + attribute: href + filters: + - name: replace + args: ["details", "download"] + size: + selector: td:nth-child(6) + seeders: + selector: td:nth-child(7) + leechers: + selector: td:nth-child(8) + date: + selector: img[src="pic/time.png"] + attribute: title + filters: + - name: replace + args: [" в ", " "] + - name: replace + args: ["января", "January"] + - name: replace + args: ["февраля", "February"] + - name: replace + args: ["марта", "March"] + - name: replace + args: ["апреля", "April"] + - name: replace + args: ["мая", "May"] + - name: replace + args: ["июня", "June"] + - name: replace + args: ["июля", "July"] + - name: replace + args: ["августа", "August"] + - name: replace + args: ["сентября", "September"] + - name: replace + args: ["октября", "October"] + - name: replace + args: ["ноября", "November"] + - name: replace + args: ["декабря", "December"] + - name: append + args: " +03:00" # MSK + - name: dateparse + args: "d MMMM yyyy HH:mm:ss zzz" + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 + description: + selector: a[href^="details.php?id="] +# engine n/a diff --git a/config/prowlarr/Definitions/bitbazis.yml b/config/prowlarr/Definitions/bitbazis.yml new file mode 100644 index 0000000..7d7c83e --- /dev/null +++ b/config/prowlarr/Definitions/bitbazis.yml @@ -0,0 +1,189 @@ +--- +id: bitbazis +name: Bit-Bázis +description: "Bit-Bázis is a HUNGARIAN Private Tracker for MOVIES / TV" +language: hu-HU +type: private +encoding: UTF-8 +requestDelay: 2 +links: + - https://bitbazis.net/ + +caps: + categorymappings: + - {id: 85, cat: Movies/SD, desc: "Film-Cam", default: true} + - {id: 15, cat: Movies/SD, desc: "Film-SD", default: true} + - {id: 17, cat: Movies/DVD, desc: "Film-DVD", default: true} + - {id: 83, cat: Movies/HD, desc: "Film-HD", default: true} + - {id: 94, cat: Movies/HD, desc: "Film-FHD", default: true} + - {id: 92, cat: Movies/UHD, desc: "Film-UHD", default: true} + - {id: 22, cat: TV, desc: "Sorozat-Hun", default: true} + - {id: 64, cat: Movies, desc: "Film-Pack", default: true} + - {id: 24, cat: Audio/Video, desc: "Klip", default: true} + - {id: 70, cat: Audio/Audiobook, desc: "Hangoskönyv", default: true} + - {id: 27, cat: Books/EBook, desc: "Könyv", default: true} + - {id: 69, cat: TV/Anime, desc: "Mese-SD", default: true} + - {id: 91, cat: TV/Anime, desc: "Mese-HD", default: true} + - {id: 25, cat: Audio/MP3, desc: "Mp3-Hun", default: true} + - {id: 26, cat: Audio/MP3, desc: "Mp3-Eng", default: true} + - {id: 84, cat: Audio/Lossless, desc: "FLAC-Hun", default: true} + - {id: 71, cat: Audio/Lossless, desc: "FLAC-Eng", default: true} + - {id: 31, cat: PC/Games, desc: "Játék", default: true} + - {id: 81, cat: PC/0day, desc: "Program", default: true} + - {id: 14, cat: Other, desc: "Egyéb", default: true} + - {id: 66, cat: XXX/ImageSet, desc: "XXX", default: false} + - {id: 33, cat: XXX/SD, desc: "XXX-SD", default: false} + - {id: 89, cat: XXX/x264, desc: "XXX-HD", default: false} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + book-search: [q] + music-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 1: title + 4: added + 5: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrentek száma egy oldalon: setting to 50 on your account profile. + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: index.php + selector: li[onclick^="window.open('logout.php?k="] + +search: + paths: + - path: browse.php + categories: [85, 86, 15, 16, 17, 19, 83, 82, 94, 95, 92, 93, 22, 58, 64, 24, 70, 27, 50, 69, 68, 91, 25, 26, 84, 71, 31, 54, 81, 67, 49, 14, 65, 97] + inputs: + # 0 all, 1 active, 2 deadonly, 3 myuploads, 4 zeroseed, 6 re-seeded + incldead: 0 + - path: browse_xxx.php + categories: [33, 66, 89] + inputs: + # 0 active, 1 all, 2 deadonly, 3 myuploads, 4 zeroseed, 6 re-seeded + incldead: 1 + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + # site does not support imdbid searching + # can support genre searching but you need to know the id, eg &genre23=1 for Comedy (id is 23) + + rows: + selector: "tr[class^=\"toriadatok\"]{{ if .Config.freeleech }}:has(i:contains(\"(Free)\")){{ else }}{{ end }}" + + fields: + categorydesc: + selector: td[class^="catpic_"] + attribute: class + filters: + - name: replace + args: ["catpic_", ""] + title: + selector: font[class="tori"], a.preview + _id: + selector: td.tori_infok + attribute: id + optional: true + filters: + - name: regexp + args: (\d+) + details: + selector: a[href^="details.php?id="] + attribute: href + optional: true + default: "details.php?id={{ .Result._id }}#adatlap" + download: + text: "download.php?torrent={{ .Result._id }}" + poster: + selector: a.preview + attribute: href + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + size: + selector: td[id^="tsize"] + date: + # 36 perce + # 13 órája és 59 perce + # 2 napja és 10 órája + # 1 hete és 1 napja + # 1 éve és 30 hete + selector: span.ellenorzes + filters: + - name: replace + args: ["és ", " "] + - name: replace + args: ["perce", "minute"] + - name: replace + args: ["órája", "hour"] + - name: replace + args: ["napja", "day"] + - name: replace + args: ["hete", "week"] + - name: replace + args: ["éve", "year"] + - name: timeago + grabs: + selector: td.letoltok + optional: true + default: 0 + seeders: + selector: td.seeders + optional: true + default: 0 + leechers: + selector: td.leechers + optional: true + default: 0 + genre: + selector: span[style="font-size:small;"] + description: + text: "{{ .Result.genre }}" + downloadvolumefactor: + case: + "i:contains(\"(Free)\")": 0 + "*": 1 + uploadvolumefactor: + case: + "i:contains(\"(2x)\")": 2 + "i:contains(\"(3x)\")": 3 + "i:contains(\"(4x)\")": 4 + "*": 1 + minimumseedtime: + # 1 day (as seconds = 1 x 24 x 60 x 60) + text: 86400 +# engine n/a diff --git a/config/prowlarr/Definitions/bitded.yml b/config/prowlarr/Definitions/bitded.yml new file mode 100644 index 0000000..7e58d00 --- /dev/null +++ b/config/prowlarr/Definitions/bitded.yml @@ -0,0 +1,146 @@ +--- +id: bitded +name: Bitded +description: "Bitded is a THAI Private Torrent Tracker for MOVIES / TV / GENERAL" +language: th-TH +type: private +encoding: UTF-8 +links: + - https://www.dedbit.com/ + +caps: + categorymappings: + - {id: 1, cat: Other, desc: "ในพระราชสำนัก (in the royal court)"} + - {id: 4, cat: TV, desc: "รายการทีวี (TV)"} + - {id: 7, cat: TV, desc: "ภาพยนตร์ชุด (Series)"} + - {id: 12, cat: Books/EBook, desc: "หนังสือ สื่อการสอน (Books)"} + - {id: 13, cat: Other/Misc, desc: "ทั่วไป (General)"} + - {id: 14, cat: TV/Sport, desc: "กีฬา (Sport)"} + - {id: 16, cat: TV/Documentary, desc: "สารคดี (Documentary)"} + - {id: 18, cat: TV/Other, desc: "ธรรมะ (Dharma)"} + - {id: 21, cat: Books/Comics, desc: "หนังสือการ์ตูน (Comics)"} + - {id: 22, cat: TV/Anime, desc: "การ์ตูนอนิเมชั่น (Anime)"} + - {id: 31, cat: Movies, desc: "ภาพยนตร์ (Movies)"} + - {id: 34, cat: Movies/DVD, desc: "ภาพยนตร์ DVD (Movies DVD)"} + - {id: 35, cat: Movies/HD, desc: "วีดีโอความละเอียดสูง (Movies HD)"} + - {id: 41, cat: Audio/MP3, desc: "เพลง (Music)"} + - {id: 43, cat: Audio/Video, desc: "มิวสิควีดีโอ (Music video)"} + - {id: 53, cat: PC/0day, desc: "โปรแกรม/Windows (Software Windows)"} + - {id: 54, cat: PC/Mac, desc: "โปรแกรม/Mac, Linux (Software Mac/Linux)"} + - {id: 55, cat: PC/Mobile-Other, desc: "โปรแกรม/Mobile (Software Mobile)"} + - {id: 61, cat: PC/Games, desc: "เกม-Computer (PC Games)"} + - {id: 62, cat: Console, desc: "เกม-Console (Console)"} + - {id: 63, cat: Console, desc: "เกมส์-พกพา (Console portable)"} + - {id: 72, cat: Other, desc: "รูปภาพ (Pics)"} + - {id: 74, cat: Other, desc: "J-IDOL"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: DESC + options: + DESC: desc + ASC: asc + +login: + path: takelogin.php + method: post + inputs: + x: axion + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: td.embedded:contains("Login failed!") + test: + path: my.php + selector: a[href="logout.php"] + +search: + paths: + # https://www.dedbit.com/browse.php?c12=1&c13=1&incldead=1&freeload=1&search=&sort=added&h=6&d=DESC + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + # 0 active, 1 incldead, 2 onlydead + incldead: 1 + freeload: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + search: "{{ .Keywords }}" + sort: "{{ .Config.sort }}" + d: "{{ .Config.type }}" + # site does not support imdbid searching and does not display imdb links in results. + + rows: + selector: table.torrenttable tbody tr:has(a[href^="download.php"]) + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php"] + attribute: href + files: + selector: td:nth-last-child(9) + date: + selector: td:nth-last-child(7) + filters: + - name: append + args: " +07:00" # ICT + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + size: + selector: td:nth-last-child(5) + grabs: + selector: td:nth-last-child(4) + seeders: + selector: td:nth-last-child(3) + leechers: + selector: td:nth-last-child(2) + downloadvolumefactor: + case: + img[src$="pic/freeload.png"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 +# engine n/a diff --git a/config/prowlarr/Definitions/bithorlo.yml b/config/prowlarr/Definitions/bithorlo.yml new file mode 100644 index 0000000..a4fe6b8 --- /dev/null +++ b/config/prowlarr/Definitions/bithorlo.yml @@ -0,0 +1,172 @@ +--- +id: bithorlo +name: Bithorlo +description: "Bithorlo (BHO) is a HUNGARIAN Private Torrent Tracker for MOVIES / GENERAL" +language: hu-HU +type: private +encoding: ISO-8859-2 +links: + - https://www.bithorlo.info/ + +caps: + categorymappings: + # E-book + - {id: 40, cat: Books, desc: "E-book/Eng"} + - {id: 19, cat: Books, desc: "E-book/Hun"} + # Játék + - {id: 38, cat: Console, desc: "Játék/Consol"} + - {id: 15, cat: PC/Games, desc: "Játék/ISO"} + - {id: 37, cat: PC/Games, desc: "Játék/Rip"} + # Filmek + - {id: 51, cat: Movies/SD, desc: "Cam/Eng"} + - {id: 50, cat: Movies/SD, desc: "Cam/Hun"} + - {id: 2, cat: Movies/DVD, desc: "DVD/Eng"} + - {id: 1, cat: Movies/DVD, desc: "DVD/Hun"} + - {id: 42, cat: Movies/DVD, desc: "Dvd9/Eng"} + - {id: 41, cat: Movies/DVD, desc: "Dvd9/Hun"} + - {id: 29, cat: Movies/HD, desc: "HD/Eng"} + - {id: 28, cat: Movies/HD, desc: "HD/Hun"} + - {id: 33, cat: TV, desc: "Sorozat/Eng"} + - {id: 5, cat: TV, desc: "Sorozat/Hun"} + - {id: 52, cat: TV/HD, desc: "Sorozat/Eng/HD"} + - {id: 53, cat: TV/HD, desc: "Sorozat/Hun/HD"} + - {id: 4, cat: Movies/SD, desc: "Xvid/Eng"} + - {id: 3, cat: Movies/SD, desc: "Xvid/Hun"} + # Zene + - {id: 12, cat: Audio, desc: "Zene/Eng"} + - {id: 13, cat: Audio, desc: "Zene/Hun"} + # Egyéb + - {id: 20, cat: Other, desc: "Képek"} + - {id: 21, cat: PC/Mobile-Other, desc: "Mobil"} + # Program + - {id: 54, cat: PC/0day, desc: "Win/Program/ISO"} + - {id: 23, cat: PC/0day, desc: "Win/Program/Rip"} + # Felnőtt tartalom + - {id: 9, cat: XXX, desc: "XXX/Film"} + - {id: 10, cat: XXX, desc: "XXX/Kép"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: useragent + type: text + label: User-Agent + - name: info_useragent + type: info + label: How to get the User-Agent + default: "
  1. From the same place you fetched the cookie,
  2. Find 'user-agent:' in the Request Headers section
  3. Select and Copy the whole user-agent string (everything after 'user-agent: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 active, 1 incldead, 2 onlydead, 3 freeleech + incldead: "{{ if .Config.freeleech }}3{{ else }}1{{ end }}" + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + + headers: + User-Agent: ["{{ .Config.useragent }}"] + + rows: + selector: tr[class^="browse"] + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + - name: trim # some torrents have an extra space + title: + selector: a[href^="torrent.php?id="] + attribute: title + details: + selector: a[href^="torrent.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: a[href^="torrent.php?id="][onmouseover] + attribute: onmouseover + filters: + - name: regexp + args: ", '(.*)'" + size: + selector: td:nth-child(4) + grabs: + selector: td:nth-child(5) + seeders: + selector: td:nth-child(6) + leechers: + selector: td:nth-child(7) + date: + selector: "a[style=\"font-size: 8pt;cursor: pointer;\"][title]" + filters: + - name: append + args: " +01:00" # CET + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + description: + case: + img[src="./themes/Born/nemlatta.png"]: Unverified + "*": Verified + downloadvolumefactor: + case: + img[title="Ingyenes letöltés"]: 0 + "*": 1 + uploadvolumefactor: + selector: span:contains("Feltöltési szorzó") + filters: + - name: replace + args: ["Feltöltési szorzó × ", ""] + minimumratio: + text: 1.0 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# engine n/a diff --git a/config/prowlarr/Definitions/bithumen.yml b/config/prowlarr/Definitions/bithumen.yml new file mode 100644 index 0000000..d1a6689 --- /dev/null +++ b/config/prowlarr/Definitions/bithumen.yml @@ -0,0 +1,160 @@ +--- +id: bithumen +name: BitHUmen +description: "BitHUmen is a Hungarian Private site for TV / MOVIES / GENERAL" +language: hu-HU +type: private +encoding: ISO-8859-2 +links: + - https://bithumen.be/ + +caps: + categorymappings: + - {id: 23, cat: Movies/SD, desc: "Film/Hun/SD"} + - {id: 24, cat: Movies/DVD, desc: "Film/Hun/DVD-R"} + - {id: 25, cat: Movies/HD, desc: "Film/Hun/720p"} + - {id: 37, cat: Movies/HD, desc: "Film/Hun/1080p"} + - {id: 33, cat: Movies/BluRay, desc: "Film/Hun/Blu-ray"} + - {id: 30, cat: XXX, desc: "XXX/SD"} + - {id: 19, cat: Movies/SD, desc: "Film/Eng/SD"} + - {id: 20, cat: Movies/DVD, desc: "Film/Eng/DVD-R"} + - {id: 5, cat: Movies/HD, desc: "Film/Eng/720p"} + - {id: 39, cat: Movies/HD, desc: "Film/Eng/1080p"} + - {id: 40, cat: Movies/BluRay, desc: "Film/Eng/Blu-ray"} + - {id: 34, cat: XXX, desc: "XXX/HD"} + - {id: 7, cat: TV/SD, desc: "Sorozat/Hun/SD"} + - {id: 41, cat: TV/HD, desc: "Sorozat/Hun/HD"} + - {id: 26, cat: TV/SD, desc: "Sorozat/Eng/SD"} + - {id: 42, cat: TV/HD, desc: "Sorozat/Eng/HD"} + - {id: 28, cat: Books, desc: "eBook/Hun"} + - {id: 29, cat: Books, desc: "eBook/Eng"} + - {id: 9, cat: Audio/MP3, desc: "Mp3/Hun"} + - {id: 35, cat: Audio/Lossless, desc: "Lossless/Hun"} + - {id: 1, cat: PC/0day, desc: "Programok/ISO"} + - {id: 4, cat: PC/Games, desc: "Játékok/ISO"} + - {id: 31, cat: Console/PS4, desc: "Játékok/PS"} + - {id: 36, cat: Console/Wii, desc: "Játékok/Wii"} + - {id: 6, cat: Audio/MP3, desc: "Mp3/Eng"} + - {id: 38, cat: Audio/Lossless, desc: "Lossless/Eng"} + - {id: 22, cat: PC, desc: "Programok/egyéb"} + - {id: 21, cat: PC, desc: "Játékok/Rip/Dox"} + - {id: 32, cat: Console/XBox 360, desc: "Játékok/Xbox360"} + - {id: 27, cat: Other, desc: "Klipek"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: td.embedded:has(h2:contains("bejelentkezés")) + test: + path: browse.php + selector: a[href*="logout.php"] + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" # for dashboard imdbid search + incldead: 1 + + rows: + selector: table#torrenttable > tbody > tr:has(a[href^="details.php?id="]) + filters: + - name: andmatch + + fields: +# download button can be disbled in the profile, use details link instead +# download: +# selector: a[href^="download.php/"] +# attribute: href + download: + selector: a[href^="details.php?id="] + attribute: href + filters: + - name: replace + args: ["details.php?id=", "download.php/"] + - name: append + args: "/invalid.torrent" + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + poster: + selector: a[onmouseover^="bithumen.UI.images.coverShow"] + attribute: onmouseover + filters: + - name: regexp + args: "\"(.*?)\"" + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + seeders: + selector: td:nth-child(8) + leechers: + selector: td:nth-child(9) + filters: + - name: regexp + args: /\s*([\d,]+) + grabs: + selector: td:nth-child(7) + files: + selector: td:nth-child(3) + size: + selector: td:nth-child(6) > u + downloadvolumefactor: + text: 0 + uploadvolumefactor: + selector: td:nth-child(5) > nobr > font:contains(" × ") + optional: true + default: 1 + filters: + - name: replace + args: ["×", ""] + date_year: + selector: td:nth-child(5):contains('.') + optional: true + remove: font + filters: + - name: replace + args: [". ", " "] + - name: prepend + args: "{{ .Today.Year }}." + - name: re_replace + args: ["([0-9]{4}).([0-9]+).([0-9]+) (.*)", "$2.$3.$1 $4"] + date_day: + selector: td:nth-child(5):contains('ma'), td:nth-child(5):contains("tegnap"), td:nth-child(5):contains('-') + optional: true + remove: font + filters: + - name: replace + args: ["ma", "today"] + - name: replace + args: ["tegnap", "yesterday"] + date: + text: "{{ if or .Result.date_day .Result.date_year }}{{ or .Result.date_day .Result.date_year }}{{ else }}now{{ end }}" + description: + selector: td:nth-child(2) > div +# engine tbd diff --git a/config/prowlarr/Definitions/bitporn.yml b/config/prowlarr/Definitions/bitporn.yml new file mode 100644 index 0000000..e75d04c --- /dev/null +++ b/config/prowlarr/Definitions/bitporn.yml @@ -0,0 +1,205 @@ +--- +id: bitporn +name: BitPorn +description: "BitPorn is a HUNGARIAN Private Torrent Tracker for 3X" +language: hu-HU +type: private +encoding: UTF-8 +links: + - https://bitporn.eu/ + +caps: + categorymappings: + - {id: 418, cat: XXX, desc: "Amateur"} + - {id: 410, cat: XXX, desc: "Anal"} + - {id: 414, cat: XXX, desc: "Animal"} + - {id: 415, cat: XXX, desc: "Asian"} + - {id: 416, cat: XXX, desc: "BBW"} + - {id: 417, cat: XXX, desc: "BDSM"} + - {id: 419, cat: XXX, desc: "Big Ass"} + - {id: 420, cat: XXX, desc: "Big Tits"} + - {id: 421, cat: XXX, desc: "Black"} + - {id: 447, cat: XXX, desc: "Cartoon"} + - {id: 448, cat: XXX, desc: "Casting"} + - {id: 422, cat: XXX, desc: "Classic"} + - {id: 434, cat: XXX, desc: "Collection"} + - {id: 423, cat: XXX, desc: "Creampie"} + - {id: 424, cat: XXX, desc: "Cumshot"} + - {id: 451, cat: XXX, desc: "Deepthroat"} + - {id: 455, cat: XXX, desc: "Extreme"} + - {id: 454, cat: XXX, desc: "Family"} + - {id: 425, cat: XXX, desc: "Feature"} + - {id: 426, cat: XXX, desc: "Fetish"} + - {id: 457, cat: XXX, desc: "Fisting"} + - {id: 453, cat: XXX, desc: "Gangbang"} + - {id: 427, cat: XXX, desc: "Gay / Bi"} + - {id: 412, cat: XXX, desc: "Hair"} + - {id: 411, cat: XXX, desc: "Hardcore"} + - {id: 456, cat: XXX, desc: "HiddenCam"} + - {id: 428, cat: XXX, desc: "Homemade"} + - {id: 429, cat: XXX, desc: "Interracial"} + - {id: 430, cat: XXX, desc: "Lesbian"} + - {id: 431, cat: XXX, desc: "Magyar"} + - {id: 432, cat: XXX, desc: "Masturbation"} + - {id: 433, cat: XXX, desc: "Mature"} + - {id: 435, cat: XXX, desc: "Milf"} + - {id: 436, cat: XXX, desc: "Old and Young"} + - {id: 437, cat: XXX, desc: "Parody"} + - {id: 449, cat: XXX, desc: "Pictures"} + - {id: 438, cat: XXX, desc: "Pissing"} + - {id: 439, cat: XXX, desc: "POV"} + - {id: 440, cat: XXX, desc: "Pregnant"} + - {id: 452, cat: XXX, desc: "Public"} + - {id: 441, cat: XXX, desc: "Shemale"} + - {id: 442, cat: XXX, desc: "Softcore"} + - {id: 443, cat: XXX, desc: "Squirt"} + - {id: 444, cat: XXX, desc: "Straight"} + - {id: 445, cat: XXX, desc: "Teen"} + - {id: 450, cat: XXX, desc: "Threesome"} + - {id: 446, cat: XXX, desc: "VR"} + - {id: 458, cat: XXX, desc: "Uncategorized"} + + modes: + search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: takelogin.php + method: post + inputs: + secret: "" + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: td.embedded:has(h2:contains("Bejelentkezés sikertelen!")) + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl + search_area: 0 + # 0 AND, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(a[href^="details.php?id="]) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: img[data-src] + attribute: data-src + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +01:00" # CET + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +01:00" # CET + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-child(5) + seeders: + selector: td.rowfollow:nth-child(6) + leechers: + selector: td.rowfollow:nth-child(7) + grabs: + selector: td.rowfollow:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 48 hours (as seconds = 2 x 24 x 60 x 60) + text: 172800 + description: + selector: td.rowfollow:nth-child(2) + remove: a, b, font, img, span +# NexusPHP v1.8.5 2023-07-06 diff --git a/config/prowlarr/Definitions/bitru.yml b/config/prowlarr/Definitions/bitru.yml new file mode 100644 index 0000000..ba11fe3 --- /dev/null +++ b/config/prowlarr/Definitions/bitru.yml @@ -0,0 +1,214 @@ +--- +id: bitru +name: BitRu +description: "BitRu is a RUSSIAN Public Torrent Tracker for MOVIES / TV / GENERAL" +language: ru-RU +type: public +encoding: UTF-8 +links: + - https://bitru.org/ +legacylinks: + - http://bitru.org/ # site forces https + +caps: + categorymappings: + - {id: movie, cat: Movies, desc: Movie} + - {id: serial, cat: TV, desc: Serial} + - {id: music, cat: Audio, desc: Music} + - {id: game, cat: PC/Games, desc: Game} + - {id: soft, cat: PC, desc: Software} + - {id: literature, cat: Books, desc: Literature} + - {id: audiobook, cat: Audio/Audiobook, desc: Audiobook} + - {id: video, cat: Movies, desc: Movies} + - {id: image, cat: Other, desc: Image} + - {id: xxx, cat: XXX, desc: xxx} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: stripcyrillic + type: checkbox + label: Strip Russian Letters + default: false + - name: addrussiantotitle + type: checkbox + label: Add RUS to end of all titles to improve language detection by Sonarr and Radarr. Will cause English-only results to be misidentified. + default: false + - name: adverts + type: checkbox + label: Include Advertising + default: true + - name: sort + type: select + label: Sort requested from site + default: _ + options: + _: created + seeders: seeders + size: size + +search: + paths: + - path: browse.php + inputs: + s: "{{ .Keywords }}" + sort: "{{ re_replace .Config.sort \"_\" \"\" }}" + rek: "{{ if .Config.adverts }}{{ else }}no{{ end }}" + + keywordsfilters: + - name: re_replace # S01 or S01E01 to 1 сезон + args: ["(?i)\\bS0*(\\d+)(?:E0*(\\d+))?\\b", "$1 сезон"] + + rows: + selector: table.browse-list > tbody > tr + + fields: + category: + selector: td:nth-child(1) a + attribute: href + filters: + - name: querystring + args: tmp + title: + selector: a[href^="details.php?id="] + filters: + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+[CС]езоны?\\s*[:]*.+?\\((\\d+(?:-\\d+)?)\\s*из\\s*(\\d+)\\)", "(S$1E$2 of $3)"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+[CС]езоны?\\s*[:]*.+?\\((\\d+(?:-\\d+)?)\\)", "(S$1E$2)"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+[CС]езоны?", "(S$1)"] + - name: re_replace + args: ["(?i)\\((\\d+(?:-\\d+)?)\\s*из\\s*(\\d+)\\)", "(E$1 of $2)"] + - name: re_replace + args: ["(?i)\\bселезень\\b", "selezen"] + - name: re_replace + args: ["(?i)\\bFiles-х\\b", "Files-x"] + - name: re_replace + args: ["(?i)\\s\\|\\sот\\s([\\w\\p{P}\\p{S}]+)$", "-$1"] + - name: re_replace + args: ["\\s\\|\\s(\\w{4,})$", "-$1"] + - name: re_replace + args: ["(\\([\\p{IsCyrillic}\\W]+\\))|(^[\\p{IsCyrillic}\\W\\d]+\\/ )|([\\p{IsCyrillic} \\-]+,+)|([\\p{IsCyrillic}]+)", "{{ if .Config.stripcyrillic }}{{ else }}$1$2$3$4{{ end }}"] + - name: re_replace + args: ["(?i)\\bHDTV[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bSAT[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bWEB[-\\s]?DL[-\\s]?Rip\\b", "WEB-DL"] + - name: re_replace + args: ["(?i)\\bWEB\\sRip\\b", "WEBRip"] + - name: re_replace + args: ["(?i)\\bWEB\\sDL\\b", "WEB-DL"] + - name: re_replace + args: ["[\\[\\(\\{<«][\\s\\W]*[\\]\\)\\}>»]", ""] + - name: re_replace + args: ["^[\\s&,\\.!\\?\\+\\-_\\|\\/':]+", ""] + - name: re_replace + args: ["(?i)^\\(\\s*([SE]\\d+.*?)\\s*\\)[\\s\\/\\|]*(.+)(-[\\w\\p{P}\\p{S}]*)$", "$2 $1$3"] + - name: re_replace + args: ["(?i)^\\(\\s*([SE]\\d+.*?)\\s*\\)[\\s\\/\\|]*(.+)", "$2 $1"] + - name: append + args: "{{ if .Config.addrussiantotitle }} RUS{{ else }}{{ end }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="details.php?id="] + attribute: href + filters: + - name: replace + args: ["details", "download"] + description: + selector: i.fa-ad + attribute: title + filters: + - name: replace + args: ["Присутствует реклама", "[Contains Adverts] "] + description|append: + selector: a[href^="details.php?id="] + poster: + selector: div.it-image > img + attribute: src + date_today: + # Сегодня в 09:09 от + # Вчера в 22:47 от + selector: td:nth-child(2) div.b-info div span:nth-child(1):contains("Сегодня"), td:nth-child(2) div.b-info div span:nth-child(1):contains("Вчера") + optional: true + filters: + - name: regexp + args: "(.*?) от " + - name: replace + args: ["Сегодня в", "Today"] + - name: replace + args: ["Вчера в", "Yesterday"] + date_year: + # 08 ноября 2019 в 23:53 от + selector: td:nth-child(2) div.b-info div span:nth-child(1):not(:contains("Сегодня")):not(:contains("Вчера")) + optional: true + filters: + - name: regexp + args: "(.*?) от " + - name: replace + args: [" в ", " "] + - name: replace + args: ["января", "January"] + - name: replace + args: ["февраля", "February"] + - name: replace + args: ["марта", "March"] + - name: replace + args: ["апреля", "April"] + - name: replace + args: ["мая", "May"] + - name: replace + args: ["июня", "June"] + - name: replace + args: ["июля", "July"] + - name: replace + args: ["августа", "August"] + - name: replace + args: ["сентября", "September"] + - name: replace + args: ["октября", "October"] + - name: replace + args: ["ноября", "November"] + - name: replace + args: ["декабря", "December"] + - name: append + args: " +03:00" # MSK + - name: dateparse + args: "dd MMMM yyyy HH:mm zzz" + date: + text: "{{ if or .Result.date_today .Result.date_year }}{{ or .Result.date_today .Result.date_year }}{{ else }}now{{ end }}" + size: + selector: td:nth-child(3) + filters: + - name: replace + args: ["ТБ", "TB"] + - name: replace + args: ["ГБ", "GB"] + - name: replace + args: ["МБ", "MB"] + - name: replace + args: ["КБ", "KB"] + seeders: + selector: td:nth-child(4) + filters: + - name: replace + args: ["?", "1"] + leechers: + selector: td:nth-child(5) + filters: + - name: replace + args: ["?", "0"] + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/bitsearch.yml b/config/prowlarr/Definitions/bitsearch.yml new file mode 100644 index 0000000..f1a753b --- /dev/null +++ b/config/prowlarr/Definitions/bitsearch.yml @@ -0,0 +1,182 @@ +--- +id: bitsearch +name: BitSearch +description: "BitSearch is a Public torrent meta-search engine" +language: en-US +type: public +encoding: UTF-8 +requestDelay: 2 +links: + - https://bitsearch.to/ + - https://bitsearch.nocensor.cloud/ + - https://bitsearch.mrunblock.bond/ +legacylinks: + - https://bitsearch.nocensor.biz/ + - https://bitsearch.nocensor.sbs/ + - https://bitsearch.nocensor.world/ + - https://bitsearch.nocensor.lol/ + - https://bitsearch.mrunblock.guru/ + - https://bitsearch.mrunblock.life/ # This web property is not accessible via this address. + - https://bitsearch.nocensor.click/ + +caps: + categories: + AudioBook: Audio/Audiobook + eBook: Books/EBook + "Ebook/Course": Books/EBook + Games: PC/Games + "Games/PC": PC/Games + Movies: Movies + Music: Audio + "Music/Album": Audio + "Music/mp3": Audio/MP3 + "Music/Lossless": Audio/Lossless + "Music/Video": Audio/Video + Other: Other + "Other/Android": PC/Mobile-Android + "Other/Archive": Other + "Other/Audio": Audio + "Other/Database": PC + "Other/DiskImage": PC/ISO + "Other/Document": Books/Comics + "Other/Image": Other/Misc + "Other/Program": PC/0day + "Other/Sourcecode": PC + "Other/Source Code": PC + "Other/Video": TV + Softwares: PC/0day + "Softwares/Windows": PC/0day + TV: TV + Unknown: Other + XXX: XXX + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: sort + type: select + label: Sort requested from site + default: date + options: + date: created + seeders: seeders + size: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +search: + paths: + # https://bitsearch.to/search?q=&sort=date&order=desc + - path: search + inputs: + q: "{{ .Keywords }}" + sort: "{{ .Config.sort }}" + order: "{{ .Config.type }}" + limit: 100 + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + + rows: + selector: div.search-result:has(a.dl-torrent), li.search-result:has(a.dl-torrent) + + fields: + category: + selector: a.category + title: + selector: h5 a + details: + selector: h5 a + attribute: href + download: + selector: a.dl-torrent + attribute: href + infohash: + selector: a[href^="magnet:?xt"] + attribute: href + filters: + - name: regexp + args: ([A-F|a-f|0-9]{40}) + grabs_dot: + selector: div.stats div:has(img[alt="Download"]):contains(".") + optional: true + filters: + - name: replace + args: [".", ""] + - name: replace + args: ["K", "00"] + - name: replace + args: ["M", "00000"] + grabs_nodot: + selector: div.stats div:has(img[alt="Download"]):not(:contains(".")) + optional: true + filters: + - name: replace + args: ["K", "000"] + - name: replace + args: ["M", "000000"] + grabs: + text: "{{ if or .Result.grabs_dot .Result.grabs_nodot }}{{ or .Result.grabs_dot .Result.grabs_nodot }}{{ else }}0{{ end }}" + size: + selector: div.stats div:has(img[alt="Size"]) + seeders_dot: + selector: div.stats div:has(img[alt="Seeder"]):contains(".") + optional: true + filters: + - name: replace + args: [".", ""] + - name: replace + args: ["K", "00"] + - name: replace + args: ["M", "00000"] + seeders_nodot: + selector: div.stats div:has(img[alt="Seeder"]):not(:contains(".")) + optional: true + filters: + - name: replace + args: ["K", "000"] + - name: replace + args: ["M", "000000"] + seeders: + text: "{{ if or .Result.seeders_dot .Result.seeders_nodot }}{{ or .Result.seeders_dot .Result.seeders_nodot }}{{ else }}0{{ end }}" + leechers_dot: + selector: div.stats div:has(img[alt="Leecher"]):contains(".") + optional: true + filters: + - name: replace + args: [".", ""] + - name: replace + args: ["K", "00"] + - name: replace + args: ["M", "00000"] + leechers_nodot: + selector: div.stats div:has(img[alt="Leecher"]):not(:contains(".")) + optional: true + filters: + - name: replace + args: ["K", "000"] + - name: replace + args: ["M", "000000"] + leechers: + text: "{{ if or .Result.leechers_dot .Result.leechers_nodot }}{{ or .Result.leechers_dot .Result.leechers_nodot }}{{ else }}0{{ end }}" + date: + selector: div.stats div:has(img[alt="Date"]) + filters: + - name: dateparse + args: "MMM d, yyyy" + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/bitsexy.yml b/config/prowlarr/Definitions/bitsexy.yml new file mode 100644 index 0000000..869f63d --- /dev/null +++ b/config/prowlarr/Definitions/bitsexy.yml @@ -0,0 +1,186 @@ +--- +id: bitsexy +name: BitSexy +description: "BitSexy is a Private Torrent Tracker for 3X" +language: en-US +type: private +encoding: UTF-8 +links: + - https://bitsexy.org/ + +caps: + categorymappings: + - {id: 33, cat: XXX, desc: "Amateur"} + - {id: 19, cat: XXX, desc: "Anal"} + - {id: 16, cat: XXX, desc: "Anime"} + - {id: 17, cat: XXX, desc: "Asian"} + - {id: 26, cat: XXX, desc: "BBW"} + - {id: 22, cat: XXX, desc: "BDSM"} + - {id: 18, cat: XXX, desc: "Big Tits"} + - {id: 43, cat: XXX, desc: "Black"} + - {id: 46, cat: XXX, desc: "Classic"} + - {id: 41, cat: XXX, desc: "Creampie"} + - {id: 28, cat: XXX, desc: "DVD-R"} + - {id: 21, cat: XXX, desc: "Ebony"} + - {id: 20, cat: XXX, desc: "Extreme"} + - {id: 44, cat: XXX, desc: "Feature"} + - {id: 31, cat: XXX, desc: "Fetish"} + - {id: 35, cat: XXX, desc: "Foreign"} + - {id: 53, cat: XXX, desc: "Gay"} + - {id: 30, cat: XXX, desc: "Gonzo"} + - {id: 51, cat: XXX, desc: "Handjob"} + - {id: 36, cat: XXX, desc: "Hardcore"} + - {id: 24, cat: XXX, desc: "Interracial"} + - {id: 37, cat: XXX, desc: "Latina"} + - {id: 25, cat: XXX, desc: "Lesbian"} + - {id: 52, cat: XXX, desc: "Magazines"} + - {id: 49, cat: XXX, desc: "Masturbation"} + - {id: 23, cat: XXX, desc: "Mature"} + - {id: 40, cat: XXX, desc: "MILF"} + - {id: 38, cat: XXX, desc: "Oral"} + - {id: 42, cat: XXX, desc: "Orgy"} + - {id: 29, cat: XXX, desc: "Other"} + - {id: 39, cat: XXX, desc: "Packs"} + - {id: 27, cat: XXX, desc: "PC Games"} + - {id: 15, cat: XXX, desc: "Pics"} + - {id: 48, cat: XXX, desc: "POV"} + - {id: 50, cat: XXX, desc: "Public"} + - {id: 14, cat: XXX, desc: "Reality"} + - {id: 47, cat: XXX, desc: "Shemale"} + - {id: 45, cat: XXX, desc: "Softcore"} + - {id: 55, cat: XXX, desc: "Solo"} + - {id: 54, cat: XXX, desc: "Squirt"} + - {id: 32, cat: XXX, desc: "Teens"} + - {id: 34, cat: XXX, desc: "Virtual"} + + modes: + search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img.cimage + input: captcha + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: table.main:contains("failed") + test: + path: my.php + selector: a[href$="logout.php"] + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 active, 1 incldead, 2 onlydead, 3 freeleech, 4 480p, 5 720p, 6 1080p, 7 4k + incldead: "{{ if .Config.freeleech }}3{{ else }}1{{ end }}" + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + + keywordsfilters: + - name: re_replace + args: ["(\\w+)", "+$1"] # prepend + to each word + + rows: + selector: div.torrentrow:has(a[href^="download.php?torrent="]) + filters: + - name: andmatch + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?torrent="] + attribute: href + poster: + selector: a[onmouseover] + attribute: onmouseover + filters: + - name: regexp + args: "src=(.*?) width" + files: + selector: div.torrenttable:nth-last-child(7) + date_day: + # Today 02:40 PM + # Yesterday 09:10 AM + selector: div.torrenttable:nth-last-child(5):contains("day") + # auto adjusted by site account profile + optional: true + date_year: + # Jul 4 2019 08:04 AM + selector: div.torrenttable:nth-last-child(5):not(:contains("day")) + # auto adjusted by site account profile + optional: true + filters: + - name: dateparse + args: "MMM d yyyy hh:mm tt" + date: + text: "{{ if or .Result.date_day .Result.date_year }}{{ or .Result.date_day .Result.date_year }}{{ else }}now{{ end }}" + size: + selector: div.torrenttable:nth-last-child(4) + grabs: + selector: div.torrenttable:nth-last-child(3) + seeders: + selector: div.torrenttable:nth-last-child(2) + leechers: + selector: div.torrenttable:nth-last-child(1) + downloadvolumefactor: + case: + img[src$="/pic/freeleech.gif"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 1 days (as seconds = 1 x 24 x 60 x 60) + text: 86400 +# TBdev diff --git a/config/prowlarr/Definitions/bitspyder.yml b/config/prowlarr/Definitions/bitspyder.yml new file mode 100644 index 0000000..8821245 --- /dev/null +++ b/config/prowlarr/Definitions/bitspyder.yml @@ -0,0 +1,182 @@ +--- +id: bitspyder +name: Bitspyder +description: "Bitspyder is a Private site for Educational BOOKS / AUDIO" +language: en-US +type: private +encoding: iso-8859-1 +links: + - https://bitspyder.net/ +legacylinks: + - http://bitspyder.net/ + +caps: + categorymappings: + - {id: 61, cat: Books, desc: "3D"} + - {id: 69, cat: Books, desc: "Anim|GFX"} + - {id: 56, cat: Books, desc: "Art"} + - {id: 40, cat: Audio/Audiobook, desc: "Audio Books"} + - {id: 55, cat: Books, desc: "Business"} + - {id: 46, cat: Books, desc: "Career"} + - {id: 2, cat: Books, desc: "CBTs"} + - {id: 39, cat: Books, desc: "Cert QA"} + - {id: 63, cat: Books, desc: "College"} + - {id: 53, cat: Books, desc: "Cooking"} + - {id: 35, cat: Books, desc: "Developer"} + - {id: 42, cat: Books, desc: "Documentary"} + - {id: 37, cat: Books/EBook, desc: "e-Books"} + - {id: 65, cat: Books, desc: "Engineering"} + - {id: 45, cat: Books, desc: "Ethical hacking"} + - {id: 54, cat: Books, desc: "Health-Fitness"} + - {id: 64, cat: Books, desc: "Kids"} + - {id: 47, cat: Books, desc: "Languages"} + - {id: 49, cat: Books, desc: "Linux CBTs"} + - {id: 43, cat: Books, desc: "Lynda.com"} + - {id: 57, cat: Books/Mags, desc: "Magazines"} + - {id: 60, cat: Books, desc: "Medical"} + - {id: 44, cat: Books, desc: "Misc Learning"} + - {id: 51, cat: Books, desc: "Music Learning"} + - {id: 41, cat: Books, desc: "Others"} + - {id: 58, cat: Books, desc: "Packt"} + - {id: 52, cat: Books, desc: "Photography"} + - {id: 71, cat: Books, desc: "Pluralsight"} + - {id: 68, cat: Books, desc: "Self Growth"} + - {id: 72, cat: Books, desc: "Templates"} + - {id: 38, cat: Books, desc: "Udemy"} + - {id: 59, cat: Books, desc: "WEB | SocialMedia"} + + modes: + search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: sort + type: select + label: Sort requested from site + default: 8 + options: + 8: created + 6: seeders + 4: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: td.msg_info > font > b + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 active, 1 incldead, 2 onlydead + incldead: 1 + # 0 title, 1 default + scope: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + + keywordsfilters: + - name: re_replace + args: ["\\s+", " "] # More than 1 space to 1 space + - name: re_replace + args: ["(\\w+)", "+$1"] # prepend + to each word + - name: trim + + rows: + selector: table > tbody > tr[class] + + fields: + # there are two styles, we support both + title: + selector: a[href^="details.php?id="] + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="details.php?id="] + attribute: href + filters: + - name: replace + args: ["details.php?id=", "download.php/"] + - name: replace + args: ["&hit=1", "/dummy.torrent"] + size: + selector: td.rowcol:nth-child(6):has(br), font:contains("Size:") + font + files: + selector: a[href*="&filelist=1"] + grabs: + selector: td.rowcol:nth-child(7):has(br), td.clear:nth-child(4) + seeders: + selector: td.rowcol:nth-last-child(3) + leechers: + selector: td.rowcol:nth-last-child(2) + date_added: + optional: true + selector: font[color="5F5F5F"] + filters: + - name: split + args: [" (", 0] + - name: replace + args: ["\xA0", " "] + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_upload: + optional: true + selector: a[title^="Upploaded at"] + attribute: title + filters: + - name: replace + args: ["Upploaded at - ", ""] + - name: replace + args: ["\xA0", " "] + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date: + text: "{{ if or .Result.date_upload .Result.date_added }}{{ or .Result.date_upload .Result.date_added }}{{ else }}now{{ end }}" + downloadvolumefactor: + text: 1 + uploadvolumefactor: + text: 1 + description: + selector: font[color="#990000"] + minimumratio: + text: 1.0 +# custom v4 diff --git a/config/prowlarr/Definitions/bitturk.yml b/config/prowlarr/Definitions/bitturk.yml new file mode 100644 index 0000000..188116b --- /dev/null +++ b/config/prowlarr/Definitions/bitturk.yml @@ -0,0 +1,229 @@ +--- +id: bitturk +name: BiTTuRK +description: "BiTTuRK is a Turkish Private Torrent Tracker for HD MOVIES / TV / GENERAL. This Indexer is for English only." +language: en-US +type: private +encoding: UTF-8 +links: + - https://bitturk.net/ +legacylinks: + - http://www.bitturk.net/ + - http://bitturk.net/ + +caps: + categorymappings: + - {id: 56, cat: Movies, desc: "BTRG"} + - {id: 95, cat: Movies, desc: "BTRG HMAX"} + - {id: 57, cat: Movies, desc: "Yerli Dizi"} + - {id: 62, cat: Movies, desc: "Yab@ncı Dizi"} + - {id: 63, cat: Movies, desc: "Türkçe Film"} + - {id: 64, cat: Movies, desc: "Türk Filmi"} + - {id: 66, cat: Movies/HD, desc: "x265"} + - {id: 67, cat: XXX, desc: "XxX"} + - {id: 68, cat: Movies, desc: "Dual (TR-~)"} + - {id: 71, cat: Movies, desc: "NFLIX"} + - {id: 78, cat: TV, desc: "EXXEN"} + - {id: 79, cat: TV, desc: "BLUTV"} + - {id: 90, cat: TV, desc: "Disney+"} + - {id: 91, cat: TV, desc: "Prime Video"} + - {id: 93, cat: TV, desc: "Gain"} + - {id: 94, cat: TV, desc: "ATVP"} + - {id: 58, cat: Movies, desc: "Film"} + - {id: 72, cat: Movies, desc: "Belgesel"} + - {id: 60, cat: Movies/3D, desc: "3D"} + - {id: 76, cat: Movies/UHD, desc: "4K UHD"} + - {id: 80, cat: TV/Sport, desc: "Formula-1"} + - {id: 45, cat: Other, desc: "Eğitim / Prog"} + - {id: 1, cat: Movies, desc: "Filmler"} + - {id: 14, cat: Movies/3D, desc: "3D Film"} + - {id: 77, cat: Movies/UHD, desc: "4K UHD"} + - {id: 16, cat: Movies, desc: "Animasyon"} + - {id: 17, cat: TV/Anime, desc: "Anime"} + - {id: 31, cat: Movies, desc: "Belgesel"} + - {id: 32, cat: Movies/BluRay, desc: "Bluray"} + - {id: 33, cat: Movies/HD, desc: "BRRiP"} + - {id: 34, cat: Movies, desc: "Çizgi Film"} + - {id: 35, cat: Movies, desc: "D-Z0N3"} + - {id: 36, cat: Movies/DVD, desc: "DVD"} + - {id: 37, cat: Movies, desc: "MP4"} + - {id: 38, cat: Movies, desc: "Türk Filmi"} + - {id: 39, cat: Movies, desc: "Türkçe BoX"} + - {id: 40, cat: Movies, desc: "Türkçe Film"} + - {id: 41, cat: Movies, desc: "ViP"} + - {id: 42, cat: Movies/SD, desc: "XviD"} + - {id: 43, cat: Movies/SD, desc: "XviD BoX"} + - {id: 55, cat: Movies/WEB-DL, desc: "WEB-DL"} + - {id: 7, cat: Audio, desc: "Müzik"} + - {id: 20, cat: Audio, desc: "Türkçe MüziK"} + - {id: 46, cat: Audio, desc: "Yab@ncı MüziK"} + - {id: 21, cat: Audio/Video, desc: "Video Klipler"} + - {id: 2, cat: Console, desc: "Oyun"} + - {id: 74, cat: PC/Games, desc: "Oyun PC"} + - {id: 84, cat: Console/PS3, desc: "Oyun Playstation"} + - {id: 82, cat: Console/PSP, desc: " Oyun PSP"} + - {id: 83, cat: Console/Other, desc: "Oyun Gameboy"} + - {id: 87, cat: Console/XBox, desc: "Oyun XBOX"} + - {id: 88, cat: Console/Other, desc: "Oyun NEO-GEO"} + - {id: 89, cat: Console/Wii, desc: "Oyun Nintendo Wii"} + - {id: 6, cat: PC/0day, desc: "Program"} + - {id: 92, cat: PC/Mobile-Android, desc: "Android"} + - {id: 47, cat: Other, desc: "Resimler"} + - {id: 48, cat: TV, desc: "Televizyon"} + - {id: 49, cat: TV/HD, desc: "Tv HD"} + - {id: 50, cat: TV, desc: "Yab@ncı Dizi"} + - {id: 51, cat: TV, desc: "Yerli Dizi"} + - {id: 44, cat: Books, desc: "E-BooK"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + - name: info + type: info + label: Layout + default: "
  1. Only the English Classic profile is supported.
  2. Make sure to set the Torrent Listing (Listeleme Biçimi) option in your profile to Classic (Klasik)
  3. And set the Language (Dil) to English
  4. Using the Modern theme will prevent results, and using Turkish will prevent upload dates.
" + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeders: seeders + size: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: ?p=home&pid=1 + method: form + form: form#loginbox_form + submitpath: ajax/login.php + inputs: + action: login + loginbox_membername: "{{ .Config.username }}" + loginbox_password: "{{ .Config.password }}" + loginbox_remember: 1 + selectorinputs: + securitytoken: + selector: "script:contains(\"stKey: \")" + filters: + - name: regexp + args: "stKey: \"(.+?)\"," + error: + - selector: ":contains(\"-ERROR-\")" + test: + path: ?p=home&pid=1 + selector: a[href*="/?p=logout&"] + +search: + paths: + - path: / + keywordsfilters: + - name: re_replace + args: ["[^a-zA-Z0-9]+", "%25"] + inputs: + p: torrents + pid: 32 + $raw: "{{ range .Categories }}cid[]={{.}}&{{end}}" + keywords: "{{ .Keywords }}" + # name, description, both, uploader + search_type: name + searchin: title + "sortOptions[sortBy]": "{{ .Config.sort }}" + "sortOptions[sortOrder]": "{{ .Config.type }}" +# Drop error trap to stop Sonarr disabling indexer, see https://github.com/Jackett/Jackett/issues/1415 +# error: +# - selector: div.error:not(:contains("Gösterilecek sonuç bulunamadı.")) + + rows: + selector: "table#torrents_table_classic tr:has(td.torrent_name){{ if .Config.freeleech }}:has(img[src$=\"/torrent_free.png\"]){{ else }}{{ end }}" + + fields: + title: + selector: a[href*="?p=torrents&pid=10&action=details"] + category: + selector: div.category_image > a + attribute: href + filters: + - name: querystring + args: cid + details: + selector: a[href*="?p=torrents&pid=10&action=details"] + attribute: href + download: + selector: a[href*="?p=torrents&pid=10&action=download"] + attribute: href + date_day: + # Uploaded Friday at 05:11 by + # Uploaded Today at 00:48 by + # Uploaded Yesterday at 23:57 by + selector: td.torrent_name:contains(" at "):not(:has(abbr[data-time])) + # auto adjusted by site account profile + optional: true + filters: + - name: regexp + args: "Uploaded (.+?) by" + - name: fuzzytime + date_year: + # Uploaded 30-01-2019 15:02 by + selector: td.torrent_name:not(:contains(" at ")):not(:has(abbr[data-time])) + # auto adjusted by site account profile + optional: true + filters: + - name: regexp + args: "Uploaded (.+?) by" + - name: dateparse + args: "dd-MM-yyyy HH:mm" + date_unix: + # within the hour (unix) + selector: abbr[data-time] + attribute: data-time + optional: true + date: + text: "{{ if or .Result.date_day .Result.date_year .Result.date_unix }}{{ or .Result.date_day .Result.date_year .Result.date_unix }}{{ else }}now{{ end }}" + size: + selector: a[rel="torrent_size"] + seeders: + selector: a[rel="torrent_seeders"] + leechers: + selector: a[rel="torrent_leechers"] + grabs: + selector: a[rel="times_completed"] + poster: + selector: a[rel="fancybox"] + attribute: href + downloadvolumefactor: + case: + "img[src$=\"/silver.gif\"]": 0.5 + "img[src$=\"/torrent_free.png\"]": 0 + "*": 1 + uploadvolumefactor: + case: + "img[src$=\"/torrent_multiple_upload.png\"]": 2 + "*": 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 3 day (as seconds = 3 x 24 x 60 x 60) + text: 259200 +# TSUE 2.2 diff --git a/config/prowlarr/Definitions/bjshare.yml b/config/prowlarr/Definitions/bjshare.yml new file mode 100644 index 0000000..18edbbd --- /dev/null +++ b/config/prowlarr/Definitions/bjshare.yml @@ -0,0 +1,199 @@ +--- +id: bjshare +name: Bj-Share +description: "Private PT-BR torrent" +language: pt-BR +type: private +encoding: UTF-8 +links: + - https://bj-share.info/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Filmes"} + - {id: 2, cat: TV, desc: "TV"} + - {id: 3, cat: PC, desc: "Aplicativos"} + - {id: 4, cat: PC/Games, desc: "Jogos"} + - {id: 5, cat: Books/Comics, desc: "Mangás"} + - {id: 6, cat: TV, desc: "Vídeos de TV"} + - {id: 7, cat: Other, desc: "Outros"} + - {id: 8, cat: TV/Sport, desc: "Esportes"} + - {id: 9, cat: Books/Mags, desc: "Revistas"} + - {id: 10, cat: Books, desc: "E-Books"} + - {id: 11, cat: Audio/Audiobook, desc: "Audiobook"} + - {id: 12, cat: Books/Comics, desc: "Histórias em Quadrinhos"} + - {id: 13, cat: TV, desc: "Stand Up Comedy"} + - {id: 14, cat: TV, desc: "TV/Anime"} # Anime format is equal to TV Show (SXXEXX) except old ones like one piece + - {id: 15, cat: XXX/ImageSet, desc: "Fotos Adultas"} + - {id: 16, cat: TV/Other, desc: "Desenho Animado"} + - {id: 17, cat: TV/Documentary, desc: "Documentários"} + - {id: 18, cat: Other, desc: "Cursos"} + - {id: 19, cat: XXX, desc: "Filmes Adultos"} + - {id: 20, cat: XXX/Other, desc: "Jogos Adultos"} + - {id: 21, cat: XXX/Other, desc: "Mangás Adultos"} + - {id: 22, cat: XXX/Other, desc: "Animes Adultos"} + - {id: 23, cat: XXX/Other, desc: "HQ Adultos"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info_cookie + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: index.php + selector: a[href^="/logout.php?auth="] + +search: + # https://bj-share.info/torrents.php?searchstr=aves+de+rapina&filter_cat%5B1%5D=1 + paths: + - path: torrents.php + + inputs: + $raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}" + searchstr: "{{ .Keywords }}" + freetorrent: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + + keywordsfilters: + - name: re_replace + args: ["(S[0-9]+E[0-9]+|S[0-9]+)", ""] # remove SXXEXX or SXX from search + + rows: + # If the category is a TV show/Anime, there's a necessity to filter the results by season/episode to not show all of them + selector: "table.torrent_table > tbody > tr:not(tr.colhead).group, + table.torrent_table tbody tr:not(tr.colhead):contains('{{ .Query.Episode }}')" + filters: + - name: andmatch + + fields: + download: + selector: a[title="Baixar"] + attribute: href + + _singleTorrentInfo: + selector: div.torrent_info + + _multipleTorrentInfo: + selector: a[href^="torrents.php?id="] + + _info: # example [MKV / x265 / WEB-DL / Legendado / 4K / Free] + text: "{{ if .Result._singleTorrentInfo }}{{.Result._singleTorrentInfo}}{{ else }}{{.Result._multipleTorrentInfo}}{{ end }}" + filters: + - name: replace + args: ["Full HD", "1080p"] + - name: replace + args: ["4K", "2160p"] + - name: replace + args: ["SD", "480p"] + - name: replace + args: ["/ HD]", "720p"] + - name: replace + args: ["/ HD /", "720p"] + - name: replace + args: ["/ Free", ""] + - name: re_replace + args: ["[\\[\\]]+", ""] + + _rawTitle: + selector: div.group_info + filters: + - name: re_replace + args: ["(\n.*)", ""] # remove everything after newline + - name: re_replace + args: [" |\t", ""] # remove double space and tabs + + _year: + text: "{{ .Result._rawTitle }}" + filters: + - name: regexp + args: "\\[([0-9]*)\\]" + + details: + selector: a[href^="torrents.php?id="]:not(.tooltip) + attribute: href + + title_MovieTV: # Movie and TV Format + # Title defined as: + # PT-BR/Japanese title [en-US title] [year] + text: "{{ .Result._rawTitle }}" + filters: + - name: re_replace + args: ["\\[[0-9]*\\].*", ""] # Removes the year and everything after + - name: re_replace + args: ["(.*)\\[(!?[^/]*?)\\]", "$2"] # Parse only en-us title, when available + - name: append + args: "{{ .Result._year }}" + - name: append + args: " {{ .Result._info }}" + + title_Other: + # Only remove brackets + text: "{{ .Result._rawTitle }}" + filters: + - name: re_replace + args: ["\\[|\\]", " "] # Remove Brackets + + title_details: + # Title defined as: + # PT-BR/Japanese title [en-US title] [year] + text: "{{ .Result._rawTitle }}" + filters: + - name: re_replace + args: ["\\[[0-9]*\\].*", ""] # Removes the year and everything after + - name: re_replace + args: ["(.*)\\[(!?[^/]*?)\\]", "$2"] # Parse only en-us title, when available + + category_details: + selector: td.cats_col > a + attribute: href + filters: + - name: regexp + args: "%5b(\\d+?)%5d" + + category: + text: "{{ .Result.category_details }}" + + title: + text: "{{ if + or (eq .Result.category_details \"1\") + (or (eq .Result.category_details \"2\") (or (eq .Result.category_details \"14\") + (or (eq .Result.category_details \"16\") (or (eq .Result.category_details \"17\") + (or eq .Result.category_details \"8\") + (or (eq .Result.category_details \"13\") (eq .Result.category_details \"6\"))))))) + }}{{.Result.title_MovieTV}}{{ else }}{{.Result.title_Other}}{{ end }}" + + size: + selector: td:nth-last-child(4) + grabs: + selector: td:nth-last-child(3) + seeders: + selector: td:nth-last-child(2) + leechers: + selector: td:nth-last-child(1) + downloadvolumefactor: + case: + strong[title*="Free"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 7 days (as seconds = 7 x 24 x 60 x 60) + text: 604800 diff --git a/config/prowlarr/Definitions/bluebird.yml b/config/prowlarr/Definitions/bluebird.yml new file mode 100644 index 0000000..9f0151c --- /dev/null +++ b/config/prowlarr/Definitions/bluebird.yml @@ -0,0 +1,147 @@ +--- +id: bluebirdhd +name: BlueBird +description: "BlueBird is a RUSSIAN Private Torrent Tracker for HD MOVIES" +language: ru-RU +type: private +encoding: windows-1251 +links: + - https://bluebird-hd.org/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Фильмы Films"} + - {id: 2, cat: TV/Anime, desc: "Мультфильмы Cartoons"} + - {id: 3, cat: TV/Documentary, desc: "Документалистика Documentary"} + - {id: 4, cat: Audio, desc: "Шоу/Музыка Show/Music"} + - {id: 5, cat: TV/Sport, desc: "Спорт Sport"} + - {id: 6, cat: TV, desc: "Сериалы TV Series"} + - {id: 7, cat: XXX, desc: "Эротика Erotica"} + - {id: 8, cat: Other, desc: "Дэмо/Misc Demo/Misc"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: div.error + message: + text: "Error during login. Its likely your username or password is incorrect." + test: + path: / + selector: a[href="logout.php"] + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + # search in title + search: "{{ if .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # search in description + dsearch: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}" + # 0 active, 1 incldead, 2 onlydead, 3 gold, 5 diamond, 4 without seeders + incldead: "{{ if .Config.freeleech }}3{{ else }}1{{ end }}" + genre: "{{ .Query.Genre }}" + # or, and + stype: and + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + + rows: + selector: table[class="embedded"][cellspacing="0"][cellpadding="5"][width="100%"] > tbody#highlighted > tr:has(a[href^="details.php?id="]) + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + grabs: + selector: td:nth-child(7) > nobr > a, td:nth-child(7) > nobr > b + date: + selector: div#frame > div#cleft + remove: a + filters: + - name: append + args: " +03:00" # MSK + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + size: + selector: td:nth-child(7) + remove: a + seeders: + selector: td:nth-child(5) + leechers: + selector: td:nth-child(6) + genre: + selector: div#cleft + filters: + - name: replace + args: ["Жанр:", ""] + description: + text: "{{ .Result.genre }}" + downloadvolumefactor: + case: + img[src="pic/diamond.png"]: 0 + img[src="pic/freedownload.gif"]: 0 + img[src="pic/silver.gif"]: 0.5 + img[src="pic/bronze.gif"]: 0.75 + "*": 1 + uploadvolumefactor: + case: + img[src="pic/diamond.png"]: 2 + "*": 1 +# TBDev v2.1.12 diff --git a/config/prowlarr/Definitions/blutopia-api.yml b/config/prowlarr/Definitions/blutopia-api.yml new file mode 100644 index 0000000..d7f7589 --- /dev/null +++ b/config/prowlarr/Definitions/blutopia-api.yml @@ -0,0 +1,169 @@ +--- +id: blutopia-api +name: Blutopia (API) +description: "Blutopia (BLU) is a Private Torrent Tracker for HD MOVIES / TV" +language: en-US +type: private +encoding: UTF-8 +links: + - https://blutopia.cc/ +legacylinks: + - https://blutopia.xyz/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Movie"} + - {id: 2, cat: TV, desc: "TV Show"} + - {id: 3, cat: Movies/Other, desc: "FANRES"} + - {id: 5, cat: Movies/Other, desc: "Trailer"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your Blutopia account My Settings page and clicking on the API Key tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + inputs: {} # TODO: remove in v10 + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: "/api/torrents/filter" + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + # if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6 + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + seasonNumber: "{{ .Query.Season }}" + episodeNumber: "{{ .Query.Ep }}" + imdbId: "{{ .Query.IMDBIDShort }}" + tmdbId: "{{ .Query.TMDBID }}" + tvdbId: "{{ .Query.TVDBID }}" + "free[]": "{{ if .Config.freeleech }}100{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + + rows: + selector: data + attribute: attributes + + fields: + category: + selector: category_id + title: + selector: name + details: + selector: details_link + download: + selector: download_link + infohash: + selector: info_hash + poster: + selector: meta.poster + filters: + - name: replace + args: ["https://via.placeholder.com/90x135", ""] + imdbid: + selector: imdb_id + tmdbid: + selector: tmdb_id + tvdbid: + selector: tvdb_id + genre: + selector: meta.genres + filters: + - name: re_replace + args: ["(?i)(Science Fiction)", "Science_Fiction"] + - name: re_replace + args: ["(?i)(TV Movie)", "TV_Movie"] + - name: replace + args: [" & ", "_&_"] + description: + text: "{{ .Result.genre }}" + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0%, 25%, 50%, 75%, 100% + selector: freeleech + case: + 0%: 1 # not free + 25%: 0.75 + 50%: 0.5 + 75%: 0.25 + 100%: 0 # freeleech + "*": 0 # catch errors + uploadvolumefactor: + # api returns False, True + selector: double_upload + case: + False: 1 # normal + True: 2 # double +# global MR is 0.4 but torrents must be seeded for 7 days regardless of ratio +# minimumratio: +# text: 0.4 + minimumseedtime: + # 7 day (as seconds = 7 x 24 x 60 x 60) + text: 604800 +# json UNIT3D 7.1.3 diff --git a/config/prowlarr/Definitions/booktracker.yml b/config/prowlarr/Definitions/booktracker.yml new file mode 100644 index 0000000..749c6d4 --- /dev/null +++ b/config/prowlarr/Definitions/booktracker.yml @@ -0,0 +1,102 @@ +--- +id: booktracker +name: BookTracker +description: "BookTracker is a RUSSIAN Semi-Private Torrent Tracker for EBOOKS" +language: ru-RU +type: semi-private +encoding: UTF-8 +links: + - https://booktracker.org/ + +caps: + categorymappings: + - {id: 1, cat: Books/EBook, desc: "Ebooks"} + + modes: + search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: sort + type: select + label: Sort requested from site + default: 1 + options: + 1: created + 10: seeders + 7: size + 2: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: login.php + method: form + form: form[action$="/login.php"] + inputs: + login_username: "{{ .Config.username }}" + login_password: "{{ .Config.password }}" + redirect: "index.php" + autologin: 1 + selectorinputs: + cookie_test: + selector: input[name="cookie_test"] + attribute: value + error: + - selector: h4.warnColor1 + test: + path: index.php + selector: a[href="./login.php?logout=1"] + +search: + paths: + - path: tracker.php + inputs: + nm: "{{ .Keywords }}" + o: "{{ .Config.sort }}" + s: "{{ .Config.type }}" + tm: -1 + sns: -1 + + rows: + selector: tr[id^="tor_"]:has(a[href^="./download.php?id="]) + filters: + - name: andmatch + + fields: + category: + text: 1 + title: + selector: a.tLink + details: + selector: a.tLink + attribute: href + download: + selector: a[href^="./download.php?id="] + attribute: href + size: + selector: td:nth-child(6) > u + seeders: + selector: td.seedmed > b + leechers: + selector: td.leechmed > b + grabs: + selector: td:nth-child(9) + date: + selector: td:last-child > u + downloadvolumefactor: + text: 1 + uploadvolumefactor: + text: 1 +# TorrentPier diff --git a/config/prowlarr/Definitions/bootytape.yml b/config/prowlarr/Definitions/bootytape.yml new file mode 100644 index 0000000..b003ca3 --- /dev/null +++ b/config/prowlarr/Definitions/bootytape.yml @@ -0,0 +1,135 @@ +--- +id: bootytape +name: BootyTape +description: "BootyTape is a Semi-Private site for 3X" +language: en-US +type: semi-private +encoding: UTF-8 +links: + - https://ssl.bootytape.com/ + +caps: + categorymappings: + - {id: 70, cat: XXX, desc: "Animation"} + - {id: 22, cat: XXX, desc: "Girl on Girl"} + - {id: 43, cat: XXX, desc: "Images"} + - {id: 52, cat: XXX, desc: "Straight"} + - {id: 82, cat: XXX, desc: "X Play Hard"} + - {id: 92, cat: XXX, desc: "X Play Soft"} + + modes: + search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: post + inputs: + take_login: 1 + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: td.mainouter2:has(h1:contains("Failed")) + test: + path: my.php + selector: a[href="logout.php"] + +search: + paths: + # https://ssl.bootytape.com/torrents.php?search=onlyfans&tagsearch=&cat=0&tags=1 + - path: torrents.php + inputs: + search: "{{ .Keywords }}" + tagsearch: "" + # 0 all + cat: 0 + freeleech: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + # tags search mode: 1 AND, 2 OR + tags: 1 + # incldead=2 for search unseeded + # descr=1 for search description + # double=1 for search double seed bonus + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + + rows: + selector: table.red > tbody > tr:not(:has(th)) + + fields: + category: + selector: a[href^="torrents.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + description: + selector: div.specg + poster: + selector: img[src*="/thbx/imgx/"] + attribute: src + files: + selector: a[href$="filelist=1"] + optional: true + default: 1 + size: + selector: td:nth-child(3) + optional: true + default: 0 + seeders: + selector: a[href$="toseeders=1"] + optional: true + default: 0 + leechers: + selector: a[href$="todlers=1"] + optional: true + default: 0 + date: + text: now + downloadvolumefactor: + case: + "img[src$=\"pic/freedownload.gif\"]": 0 + "*": 1 + uploadvolumefactor: + case: + "img[src$=\"pic/double-upload.gif\"]": 2 + "*": 1 +# engine n/a diff --git a/config/prowlarr/Definitions/borgzelle.yml b/config/prowlarr/Definitions/borgzelle.yml new file mode 100644 index 0000000..1777524 --- /dev/null +++ b/config/prowlarr/Definitions/borgzelle.yml @@ -0,0 +1,199 @@ +--- +id: borgzelle +name: Borgzelle +description: "Borgzelle is a GERMAN Private Torrent Tracker for MOVIES / TV / GENERAL" +language: de-DE +type: private +encoding: UTF-8 +links: + - https://borgzelle.borg/ +certificates: + - a3f8822c97fbfe5bd00760cf8e6b75c4284f657d # self signed + +caps: + categorymappings: + - {id: 17, cat: TV/Sport, desc: "Sport"} + - {id: 32, cat: TV, desc: "Serien-Pakete"} + - {id: 12, cat: TV, desc: "Serien"} + - {id: 14, cat: Audio/Video, desc: "Musikvideo"} + - {id: 15, cat: TV/Documentary, desc: "Doku"} + - {id: 16, cat: TV/Other, desc: "Comedy"} + - {id: 18, cat: TV/Anime, desc: "Anime"} + - {id: 6, cat: Movies/SD, desc: "Movie XviD/DivX"} + - {id: 34, cat: Movies/UHD, desc: "Movie UHD"} + - {id: 13, cat: Movies, desc: "Movie Kinder"} + - {id: 11, cat: Movies/HD, desc: "Movie HD2DVD"} + - {id: 9, cat: Movies/HD, desc: "Movie HD"} + - {id: 33, cat: Movies/HD, desc: "Movie h265"} + - {id: 7, cat: Movies/HD, desc: "Movie h264"} + - {id: 10, cat: Movies/DVD, desc: "Movie DVD"} + - {id: 28, cat: PC/Games, desc: "Spiele PDA/Handy"} + - {id: 25, cat: PC/Games, desc: "Spiele PC"} + - {id: 27, cat: PC/Games, desc: "Spiele MAC"} + - {id: 26, cat: Console, desc: "Spiele Konsolen"} + - {id: 30, cat: Other, desc: "Diverse Wallpaper"} + - {id: 31, cat: Other, desc: "Sonstiges"} + - {id: 29, cat: Books/EBook, desc: "E-Book"} + - {id: 19, cat: Audio, desc: "Musik"} + - {id: 20, cat: Audio/Audiobook, desc: "Hörbuch"} + - {id: 21, cat: PC/0day, desc: "Software Windows"} + - {id: 23, cat: PC/Mobile-Other, desc: "Software PDA/Handy"} + - {id: 22, cat: PC/Mac, desc: "Software MAC"} + - {id: 24, cat: PC, desc: "Software Linux"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: info_sitelink + type: info + label: About Site Link + default: If the Site Link domain returns a DNS error then you have not yet been assimilated. + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeds: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: login.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + keeplogged: 1 + error: + - selector: font[color="red"] + test: + path: index.php + selector: a[href^="logout.php?auth="] + +search: + paths: + # https://borgzelle.borg/browse.php?action=browse&showsearch=1&c34=1&c9=1&search=&incldead=0&orderby=added&sort=desc + - path: browse.php + inputs: + action: browse + showsearch: 1 + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 all, 1 active, 2 dead + incldead: 0 + orderby: "{{ .Config.sort }}" + sort: "{{ .Config.type }}" + # the site does not support imdbid searching or present imdb links in results + + rows: + selector: "table[style=\"width: 100%;\"] > tbody > tr{{ if .Config.freeleech }}:has(span:contains(\"[OnlyUpload]\")){{ else }}{{ end }}" + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="torrents.php?torrentid="] + details: + selector: a[href^="torrents.php?torrentid="] + attribute: href + download: + selector: a[href^="torrents.php?action=download&id="] + attribute: href + poster: + selector: a[href^="torrents.php?torrentid="] span img + attribute: src + date: + # 17.10. 18:34 (vor 2 Stunden und 57 Minuten) + selector: td:nth-child(2) > table > tbody > tr > td:nth-child(2) + filters: + - name: regexp + args: "\\((.+?)\\)" + # translations for Turkish|Estonian|Danish|Italian|Polish|Norwegian|Portuguese|Czech|Russian|Romanian|Spanish|French|German|Bulgarian|Dutch|Chinese|Japanese|Swedish + - name: re_replace + args: ["(?i)(önce|tagasi|geleden|fa|temu|siden|há|atrás|nazpět|назад|acum|în urmă|hace|il y a|vor|преди|前|sedan)", " ago"] + - name: re_replace + args: ["(?i)(saniye|sekundit|sekunder|secondi|sekund|segundos|sekundami|секунд|secunde|secondes|Sekunden|секунди|seconden|秒前)", "seconds"] + - name: re_replace + args: ["(?i)(minutit|minutter|minuti|minuty|minutos|минуты|минут|Minuten|минути|minuten|minuter)", "minutes"] + - name: re_replace + args: ["(?i)(dakika|minut|minuto|minuta|minutt|минута|Minute|minuut|分钟|分)", " minute"] + - name: re_replace + args: ["(?i)(tundi|timer|ore|godziny|horas|hodiny|hoden|часа|часов|ore|heures|Stunden|timmar)", "hours"] + - name: re_replace + args: ["(?i)(saat|tund|time|ora|godzina|hora|hodina|час|oră|heure|Stunde|uur|小时|時間|timme)", " hour"] + - name: re_replace + args: ["(?i)(päeva|dage|giorni|dni|dias|dny|дня|дней|zile|días|jours|Tagen|дни|dagen|dagar)", "days"] + - name: re_replace + args: ["(?i)(gün|päev|dag|giorno|dzień|dia|den|день|zi|día|jour|Tag|ден|天|日)", " day"] + - name: re_replace + args: ["(?i)(nädalat|uger|settimane|tygodnie|uker|semanas|týdny|недели|недель|săptămâni|semaines|Wochen|седмици|weken|veckor)", "weeks"] + - name: re_replace + args: ["(?i)(hafta|nädal|uge|settimana|tydzień|uke|semana|týden|неделю|săptămână|semaine|Woche|седмица|周|週間|vecka)", " week"] + - name: re_replace + args: ["(?i) (ay)", "month"] + - name: re_replace + args: ["(?i)(kuud|måneder|mesi|miesiące|meses|měsíce|месяца|месяцев|luni|meses|mois|Monaten|месеца|maanden|månader)", "months"] + - name: re_replace + args: ["(?i)(kuu|måned|mese|miesiąc|mês|měsíc|месяц|lună|mes|Monat|месец|maand|个月|ヶ月|månad)", " month"] + - name: re_replace + args: ["(?i)(aastat|anni|lata|anos|roky|года|ani|años|ans|Jahren|години)", " years"] + - name: re_replace + args: ["(?i)(yil|aasta|år|anno|rok|ano|год|año|Jahr|година|jaar|年)", " year"] + - name: re_replace + args: ["(?i) (an)", "year"] + - name: re_replace + args: ["(?i)(För |und)", ""] # Misc removals + - name: timeago + size: + selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(1) b + files: + selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(1) a span + seeders: + selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(2) a span + leechers: + selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(2) a span:nth-child(2) + grabs: + selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td:nth-child(3) a span + downloadvolumefactor: + case: + "span:contains(\"[OnlyUpload]\")": 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 0.7 + minimumseedtime: + # 3 days (as seconds = 3 x 24 x 60 x 60) + text: 259200 +# Gazelle diff --git a/config/prowlarr/Definitions/boxingtorrents.yml b/config/prowlarr/Definitions/boxingtorrents.yml new file mode 100644 index 0000000..aad0a54 --- /dev/null +++ b/config/prowlarr/Definitions/boxingtorrents.yml @@ -0,0 +1,146 @@ +--- +id: boxingtorrents +name: Boxing Torrents +description: "Boxing Torrents is a Private Torrent Tracker for BOXING" +language: en-US +type: private +encoding: UTF-8 +links: + - https://tc-boxing.com/ + +caps: + categorymappings: + - {id: 17, cat: TV/Sport, desc: "4K"} + - {id: 15, cat: TV/Sport, desc: "3D"} + - {id: 9, cat: TV/Sport, desc: "Amateur - Full"} + - {id: 16, cat: TV/Sport, desc: "Blu-ray"} + - {id: 13, cat: TV/Sport, desc: "Career Set"} + - {id: 8, cat: TV/Sport, desc: "DVD"} + - {id: 10, cat: TV/Sport, desc: "Foreign - Excellent"} + - {id: 11, cat: TV/Sport, desc: "Foreign - Fair"} + - {id: 6, cat: TV/Sport, desc: "Foreign - Good"} + - {id: 12, cat: TV/Sport, desc: "Foreign - Poor"} + - {id: 1, cat: TV/Sport, desc: "Full - Excellent"} + - {id: 3, cat: TV/Sport, desc: "Full - Fair"} + - {id: 2, cat: TV/Sport, desc: "Full - Good"} + - {id: 4, cat: TV/Sport, desc: "Full - Poor"} + - {id: 14, cat: TV/Sport, desc: "HD"} + - {id: 7, cat: TV/Sport, desc: "Misc"} + - {id: 18, cat: TV/Sport, desc: "Instructional"} + - {id: 19, cat: TV/Documentary, desc: "Documentary"} + + modes: + search: [q] + tv-search: [q, season, ep] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: DESC + options: + DESC: desc + ASC: asc + - name: info_download + type: info + label: "Download Restrictions" + default: "You must have uploaded at least 10GB before you are able to access all torrent sizes. Until then, you are restricted to torrents no larger than 2.5GB." + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: td.embedded:contains("Login failed!") + test: + path: browse.php + selector: a[href="logout.php"] + +download: + selectors: + - selector: a[href^="download.php"] + attribute: href + +search: + paths: + # https://tc-boxing.com/browse.php?c16=1&c8=1&c14=1&incldead=1 + # https://tc-boxing.com/browse.php?search=tyson&cat=0&incldead=1 + - path: browse.php + inputs: + $raw: "{{ if .Categories }}{{ range .Categories }}c{{.}}=1&{{end}}{{ else }}cat=0{{ end }}" + # 1 incldead, null active + incldead: 1 + # 1 freeleech only, null all + free: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + search: "{{ .Keywords }}" + sort: "{{ .Config.sort }}" + d: "{{ .Config.type }}" + + rows: + selector: table[border="1"][cellspacing="0"][cellpadding="5"] tr:has(a[href^="details.php?id="]) + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="details.php?id="] + attribute: href + files: + selector: td:nth-last-child(8) + date: + selector: td:nth-last-child(6) + filters: + - name: append + args: " -07:00" # PDT + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + size: + selector: td:nth-last-child(5) + grabs: + selector: td:nth-last-child(4) + seeders: + selector: td:nth-last-child(3) + leechers: + selector: td:nth-last-child(2) + downloadvolumefactor: + case: + "b:contains(\"FreeLeech\")": 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 3 day (as seconds = 3 x 24 x 60 x 60) + text: 259200 +# engine n/a diff --git a/config/prowlarr/Definitions/brasiltracker.yml b/config/prowlarr/Definitions/brasiltracker.yml new file mode 100644 index 0000000..855b569 --- /dev/null +++ b/config/prowlarr/Definitions/brasiltracker.yml @@ -0,0 +1,135 @@ +--- +id: brasiltracker +name: BrasilTracker +description: "BrasilTracker is a BRAZILIAN Private Torrent Tracker for MOVIES / TV / GENERAL" +language: pt-BR +encoding: UTF-8 +type: private +links: + - https://brasiltracker.org/ + +caps: + categories: + Other: Other + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q, imdbid] + +settings: + - name: cookie + type: text + label: Cookie + - name: info_cookie + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: info_8000 + type: info + label: About BrasilTracker Categories + default: BrasilTracker does not return categories in its search results.
To add to your Apps' Torznab indexer, replace all categories with 8000(Other). + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: time + options: + time: created + seeders: seeders + size: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: index.php + selector: a[href^="logout.php?auth="] + +search: + paths: + # https://brasiltracker.org/torrents.php?order_by=time&order_way=desc&freetorrent=1&filter_cat[6]=1&filter_cat[3]=1&action=basic&searchsubmit=1 + # https://brasiltracker.org/torrents.php?searchstr=mandalorain&order_by=size&order_way=desc&action=basic&searchsubmit=1 + # https://brasiltracker.org/torrents.php?searchstr=tt8179024&order_by=time&order_way=desc&action=basic&searchsubmit=1 + - path: torrents.php + inputs: + searchstr: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + order_by: "{{ .Config.sort }}" + order_way: "{{ .Config.type }}" + group_results: 0 + action: basic + freetorrent: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + searchsubmit: 1 + + rows: + selector: table#torrent_table > tbody > tr.torrent + + fields: + category: + text: Other + details: + selector: a[href^="torrents.php?id="] + attribute: href + download: + selector: a[href^="torrents.php?action=download&id="] + attribute: href + description: + selector: div.tags + poster: + selector: img[alt="Cover"] + attribute: src + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + tmdbid: + selector: a[href*="themoviedb.org/movie/"], a[href*="themoviedb.org/tv/"] + attribute: href + files: + selector: td:nth-child(3) + date: + selector: span.time + attribute: title + filters: + - name: append + args: " -03:00" # BRT + - name: dateparse + args: "MMM d yyyy, HH:mm zzz" + size: + selector: td:nth-child(5) + grabs: + selector: td:nth-child(6) + seeders: + selector: td:nth-child(7) + leechers: + selector: td:nth-child(8) + downloadvolumefactor: + case: + strong.tl_free: 0 + "*": 1 + uploadvolumefactor: + text: 1 + title_details: + selector: div.torrent_info + remove: strong + title: + selector: a[href^="torrents.php?id="] + filters: + - name: append + args: " {{ .Result.title_details }}" + minimumratio: + text: 1.0 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# Project Gazelle diff --git a/config/prowlarr/Definitions/broadcity.yml b/config/prowlarr/Definitions/broadcity.yml new file mode 100644 index 0000000..8512387 --- /dev/null +++ b/config/prowlarr/Definitions/broadcity.yml @@ -0,0 +1,139 @@ +--- +id: broadcity +name: BroadCity +description: "BroadCity is a TURKISH Private Torrent Tracker for MOVIES and TV" +language: tr-TR +type: private +encoding: UTF-8 +links: + - https://broadcity.in/ # site is forcing to https +legacylinks: + - http://broadcity.in/ + +caps: + categorymappings: + - {id: 1, cat: Movies/UHD, desc: "UHD"} + - {id: 2, cat: Movies/UHD, desc: "UHD - BluRay"} + - {id: 8, cat: Movies/UHD, desc: "UHD - TV"} + - {id: 6, cat: Movies/WEB-DL, desc: "UHD - WEB-DL"} + - {id: 16, cat: Movies/UHD, desc: "UHD - WEBRip"} + - {id: 31, cat: Movies/BluRay, desc: "BluRay Disk"} + - {id: 3, cat: Movies/HD, desc: "HD"} + - {id: 25, cat: Movies/3D, desc: "HD - 3D"} + - {id: 4, cat: Movies/HD, desc: "HD - BluRay"} + - {id: 7, cat: Movies/HD, desc: "HD - TV"} + - {id: 5, cat: Movies/WEB-DL, desc: "HD - WEB-DL"} + - {id: 14, cat: Movies/HD, desc: "HD - WEBRip"} + - {id: 40, cat: Movies/HD, desc: "PTer"} + - {id: 9, cat: Movies/SD, desc: "SD"} + - {id: 23, cat: Movies/SD, desc: "SD - BluRay"} + - {id: 10, cat: Movies/DVD, desc: "SD - DVD"} + - {id: 36, cat: Movies/SD, desc: "SD - DVDRip"} + - {id: 12, cat: Movies/SD, desc: "SD - TV"} + - {id: 13, cat: Movies/WEB-DL, desc: "SD - WEB-DL"} + - {id: 15, cat: Movies/SD, desc: "SD - WEBRip"} + - {id: 17, cat: TV, desc: "TV"} + - {id: 26, cat: TV/Other, desc: "TV - TV Program"} + - {id: 19, cat: TV, desc: "TV - Yabanci Dizi"} + - {id: 18, cat: TV, desc: "TV - Yerli Dizi"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: index.php + selector: a[href*="/logout.php?logouthash="] + +download: + before: + path: takethanks.php + method: post + inputs: + torrentid: "{{ .DownloadUri.Query.id }}" + selectors: + - selector: a[href*="download.php?id="] + attribute: href + +search: + paths: + - path: browse.php + inputs: + # does not support multi categories so defaulting to ALL + do: search + keywords: "{{ .Keywords }}" + category: 0 + search_type: t_name + include_dead_torrents: yes + + rows: + selector: "table#sortabletable tbody tr:has(div[id^=\"port-target-\"]){{ if .Config.freeleech }}:has(img[src$=\"/freedownload.gif\"]){{ else }}{{ end }}" + + fields: + category: + selector: a[href*="browse.php?category="] + attribute: href + filters: + - name: querystring + args: category + title: + selector: div[id^="port-target-"] a + details: + selector: div[id^="port-target-"] a + attribute: href + download: + selector: div[id^="port-target-"] a + attribute: href + poster: + selector: div[id^="port-content-"] img + attribute: src + date: + selector: td:nth-child(2) + filters: + - name: regexp + args: (\d{2}-\d{2}-\d{4} \d{2}:\d{2}) + - name: append + args: " +03:00" # TRT + - name: dateparse + args: "dd-MM-yyyy HH:mm zzz" + size: + selector: td:nth-child(5) + grabs: + selector: td:nth-child(6) + seeders: + selector: td:nth-child(7) + leechers: + selector: td:nth-child(8) + downloadvolumefactor: + case: + img[src$="/freedownload.gif"]: 0 + img[src$="/silverdownload.gif"]: 0.5 + "*": 1 + uploadvolumefactor: + case: + img[src$="/x2.gif"]: 2 + "*": 1 + minimumratio: + text: 0.5 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# TS Special Edition v.7.5 diff --git a/config/prowlarr/Definitions/brsociety-api.yml b/config/prowlarr/Definitions/brsociety-api.yml new file mode 100644 index 0000000..fe19c9a --- /dev/null +++ b/config/prowlarr/Definitions/brsociety-api.yml @@ -0,0 +1,145 @@ +--- +id: brsociety-api +name: BrSociety (API) +description: "BrSociety (SemeandoCC) is a BRAZILIAN Private Torrent Tracker for E-LEARNING" +language: pt-BR +type: private +encoding: UTF-8 +links: + - https://brsociety.club/ + +caps: + categorymappings: + - {id: 1, cat: Other, desc: "Cursos"} + - {id: 2, cat: Books/EBook, desc: "eBooks"} + - {id: 5, cat: Books/Mags, desc: "Revistas"} + - {id: 3, cat: Audio/Audiobook, desc: "Audiobooks"} + - {id: 4, cat: Other, desc: "Arquivos de Auxilio"} + - {id: 6, cat: Other, desc: "Graduação"} + - {id: 7, cat: TV/Documentary, desc: "Documentários"} + + modes: + search: [q] + tv-search: [q, season, ep] + book-search: [q] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your BrSociety account My Settings page and clicking on the API Key tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + inputs: {} # TODO: remove in v10 + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: "/api/torrents/filter" + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + "free[]": "{{ if .Config.freeleech }}100{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + + rows: + selector: data + attribute: attributes + + fields: + category: + selector: category_id + title: + selector: name + details: + selector: details_link + download: + selector: download_link + magnet: + selector: magnet_link + optional: true + infohash: + selector: info_hash + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0%, 25%, 50%, 75%, 100% + selector: freeleech + case: + 0%: 1 # not free + 25%: 0.75 + 50%: 0.5 + 75%: 0.25 + 100%: 0 # freeleech + "*": 0 # catch errors + uploadvolumefactor: + # api returns False, True + selector: double_upload + case: + False: 1 # normal + True: 2 # double +# global MR is 0.7 but torrents must be seeded for 4 days regardless of ratio +# minimumratio: +# text: 0.7 + minimumseedtime: + # 4 days (as seconds = 4 x 24 x 60 x 60) + text: 345600 +# json UNIT3D 7.1.3 (custom) diff --git a/config/prowlarr/Definitions/btarg.yml b/config/prowlarr/Definitions/btarg.yml new file mode 100644 index 0000000..2f76dd2 --- /dev/null +++ b/config/prowlarr/Definitions/btarg.yml @@ -0,0 +1,234 @@ +--- +id: btarg +name: BTArg +description: "BTArg is an ARGENTINIAN Private Torrent Tracker for MOVIES / TV / GENERAL" +language: es-AR +type: private +encoding: iso-8859-1 +links: + - https://www.btarg.com.ar/ + +caps: + # use upload page when updating cats, browse.php uses 0a, 0b, etc for cats >10 + categorymappings: + - {id: 01, cat: Movies, desc: "Cine Arg."} + - {id: 02, cat: Movies/Foreign, desc: "Cine Int."} + - {id: 03, cat: TV, desc: "TV Arg."} + - {id: 04, cat: TV/Foreign, desc: "TV Int."} + - {id: 05, cat: XXX, desc: "XXX"} + - {id: 06, cat: TV/Anime, desc: "Anime"} + - {id: 07, cat: TV/Sport, desc: "Deportes"} + - {id: 08, cat: Audio/Video, desc: "Video Clips"} + - {id: 09, cat: Audio, desc: "Musica Arg."} + - {id: 10, cat: Audio/Foreign, desc: "Musica Int."} + - {id: 11, cat: Movies/DVD, desc: "DVD-R"} + - {id: 12, cat: PC/Games, desc: "Juegos"} + - {id: 13, cat: PC/0day, desc: "Software Arg."} + - {id: 14, cat: PC/0day, desc: "Software Int."} + - {id: 15, cat: Other, desc: "Otros"} + - {id: 16, cat: Other, desc: "Subpacks"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + DESC: desc + ASC: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Por página Torrents: setting to 100 on your account profile. + +login: + path: tracker/takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: td.embedded:has(h2:contains("fallado")) + test: + path: tracker/index.php + selector: a[href="logout.php"], a[href^="download.php/"] + +search: + paths: + - path: tracker/browse.php + inputs: + $raw: "{{ range .Categories }}cat[]={{.}}&{{end}}" + keywords: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # 0 title, 1 title+descr, 2 descr + type: "{{ if .Query.IMDBID }}2{{ else }}0{{ end }}" + # 0 active, 1 incldead, 2 dead + incldead: 0 # dead results don't have torrents + # 0 all, 1 free, 2 normal + inclfree: "{{ if .Config.freeleech }}1{{ else }}0{{ end }}" + sort: "{{ .Config.sort }}" + d: "{{ .Config.type }}" + list: 1 + + keywordsfilters: + - name: re_replace + args: ["(?i)(S(\\d{1,3}))(?![\\dE])", "Temporada"] + - name: re_replace + args: ["(\\w+)", "+$1"] # prepend + to each word + + rows: + selector: table > tbody > tr:not(tr:first-child):not(tr.browse) + after: 1 + + fields: + categorydesc: + selector: a[href*="?cat="] img + attribute: title + title_default: + selector: a[href^="details.php?id="] + filters: + - name: re_replace + args: ["(?i)(Primera Temporada)", "S01"] + - name: re_replace + args: ["(?i)(Segunda Temporada)", "S02"] + - name: re_replace + args: ["(?i)(Tercera Temporada)", "S03"] + - name: re_replace + args: ["(?i)(Cuarta Temporada)", "S04"] + - name: re_replace + args: ["(?i)(Quinta Temporada)", "S05"] + - name: re_replace + args: ["(?i)(Sexta Temporada)", "S06"] + - name: re_replace + args: ["(?i)(Septima Temporada)", "S07"] + - name: re_replace + args: ["(?i)(Octava Temporada)", "S08"] + - name: re_replace + args: ["(?i)(Novena Temporada)", "S09"] + - name: re_replace + args: ["(?i)(Decima Temporada)", "S10"] + - name: re_replace + args: ["(?i)(Onceava Temporada)", "S11"] + - name: re_replace + args: ["(?i)(Decimosegunda Temporada)", "S12"] + - name: re_replace + args: ["(?i)Temporada (\\d{1,3})\\s*y\\s*(\\d{1,3})", "S$1-$2"] + - name: re_replace + args: ["(?i)Temporada (\\d{1,3})", "S$1"] + # move ARG tag to end + - name: re_replace + args: ["^(\\[ARG\\]) (.+?)$", "$2 $1"] + # move quality tags to end + - name: re_replace + args: ["^(\\[.+?\\]) (.+?)$", "$2 $1"] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + filters: + - name: re_replace + args: ["(?i)(Primera Temporada)", "S01"] + - name: re_replace + args: ["(?i)(Segunda Temporada)", "S02"] + - name: re_replace + args: ["(?i)(Tercera Temporada)", "S03"] + - name: re_replace + args: ["(?i)(Cuarta Temporada)", "S04"] + - name: re_replace + args: ["(?i)(Quinta Temporada)", "S05"] + - name: re_replace + args: ["(?i)(Sexta Temporada)", "S06"] + - name: re_replace + args: ["(?i)(Septima Temporada)", "S07"] + - name: re_replace + args: ["(?i)(Octava Temporada)", "S08"] + - name: re_replace + args: ["(?i)(Novena Temporada)", "S09"] + - name: re_replace + args: ["(?i)(Decima Temporada)", "S10"] + - name: re_replace + args: ["(?i)(Onceava Temporada)", "S11"] + - name: re_replace + args: ["(?i)(Decimosegunda Temporada)", "S12"] + - name: re_replace + args: ["(?i)Temporada (\\d{1,3})\\s*y\\s*(\\d{1,3})", "S$1-$2"] + - name: re_replace + args: ["(?i)Temporada (\\d{1,3})", "S$1"] + # move ARG tag to end + - name: re_replace + args: ["^(\\[ARG\\]) (.+?)$", "$2 $1"] + # move quality tags to end + - name: re_replace + args: ["^(\\[.+?\\]) (.+?)$", "$2 $1"] + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php/"] + attribute: href + date: + selector: td:nth-child(5) + remove: font + filters: + - name: append + args: " +00:00" # auto adjusted by site account profile + - name: dateparse + args: "yyyy-MM-dd zzz" + size: + selector: td:nth-child(3) + seeders: + selector: td:nth-child(8) + filters: + - name: regexp + args: "^(\\d+) \/" + leechers: + selector: td:nth-child(8) + filters: + - name: regexp + args: "\/ (\\d+)$" + grabs: + selector: td:nth-child(9) + filters: + - name: regexp + args: "\\\xA0(\\d+)\\\xA0" + downloadvolumefactor: + case: + "font[color=\"red\"]:contains(\"FREE!\")": 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 0.5 + description_default: + selector: a[href^="details.php?id="] + description: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.description_default }}" +# engine tbd diff --git a/config/prowlarr/Definitions/btetree.yml b/config/prowlarr/Definitions/btetree.yml new file mode 100644 index 0000000..513f759 --- /dev/null +++ b/config/prowlarr/Definitions/btetree.yml @@ -0,0 +1,77 @@ +--- +id: btetree +name: BT.etree +description: "BT.etree is a Public Tracker dedicated to Bootleg FLAC MUSIC" +language: en-US +type: public +encoding: UTF-8 +links: + - https://bt.etree.org/ +legacylinks: + - http://bt.etree.org/ + +caps: + categories: + Music: Audio/Lossless + + modes: + search: [q] + music-search: [q, artist] + +settings: + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeders: seeders + name: title + +search: + paths: + # http://bt.etree.org/?searchzzzz=&cat=0 + - path: / + inputs: + searchzzzz: "{{ if .Query.Artist }}{{ .Query.Artist }}{{ else }}{{ .Keywords }}{{ end }}" + cat: 0 + sort: "{{ .Config.sort }}" + + rows: + selector: table[bgcolor="#CCCCCC"] tbody tr:has(a[href^="download.php"]) + filters: + - name: andmatch + + fields: + category: + text: Music + title: + selector: a.details_link + details: + selector: a.details_link + attribute: href + download: + selector: a[href^="download.php"] + attribute: href + files: + selector: td:nth-child(4) + date: + selector: td:nth-child(5) + filters: + - name: replace + args: [" ", " 0"] + - name: dateparse + args: "MM/dd HH:mm" + size: + selector: td:nth-child(6) + grabs: + selector: td:nth-child(7) + seeders: + selector: td:nth-child(8) + leechers: + selector: td:nth-child(9) + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/btmet.yml b/config/prowlarr/Definitions/btmet.yml new file mode 100644 index 0000000..74f9a34 --- /dev/null +++ b/config/prowlarr/Definitions/btmet.yml @@ -0,0 +1,105 @@ +--- +id: btmet +name: BTMET +description: "BTMET is a Public magnet indexer" +language: en-US +type: public +encoding: UTF-8 +links: + - https://btmet.com/ + +caps: + categories: + Audio: Audio + Compressed: Other + Document: Books + Image: Other + Installation: PC + Other: Other + TV: TV # dummy cat to allow both Movies,TV to be categorised when Video is found. + Video: Movies + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + +settings: + - name: sort + type: select + label: Sort requested from site + default: 0 + options: + 0: relevance + 1: created + 2: size + +search: + paths: + # https://btmet.com/search.php?q=2022&c=&l=&o=1 + - path: search.php + inputs: + q: "{{ if .Keywords }}{{ .Keywords }}{{ else }}{{ .Today.Year }}{{ end }}" + # does not support multi cats so defaulting to all + c: "" + # 1 Chinese, 2 Japanese, 3 Korean + l: "" + o: "{{ if .Keywords }}{{ .Config.sort }}{{ else }}1{{ end }}" + + rows: + selector: div.search-item:has(a[href^="magnet"]) + filters: + - name: andmatch + + fields: + category: + selector: div.item-bar > span[class="cpill blue-pill"] + category|append: + # add tv to video + optional: true + selector: div.item-bar > span[class="cpill blue-pill"] + filters: + - name: replace + args: ["Video", "TV"] + title: + selector: a.smashTitle > script + filters: + - name: urldecode + - name: replace + args: ['document.write(decodeURIComponent("', ""] + - name: replace + args: ['"));', ""] + - name: replace + args: ["", ""] + - name: replace + args: ["", ""] + details: + selector: a.smashTitle + attribute: href + infohash: + selector: a[href^="magnet:?xt="] + attribute: href + filters: + - name: regexp + args: ([a-f|0-9]{40}) + date: + # unix + selector: div.item-bar > span:nth-child(2) > b + attribute: t + filters: + - name: regexp + args: (\d{10}) + size: + selector: div.item-bar > span:nth-child(3) > b + files: + selector: div.item-bar > span:nth-child(4) > b + seeders: + selector: div.item-bar > span:nth-child(5) > b + leechers: + text: 1 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/btnext.yml b/config/prowlarr/Definitions/btnext.yml new file mode 100644 index 0000000..bd51385 --- /dev/null +++ b/config/prowlarr/Definitions/btnext.yml @@ -0,0 +1,278 @@ +--- +id: btnext +name: BTNext +description: "BTNext (BTNT) is a PORTUGUESE Private Torrent Tracker for 0DAY / GENERAL" +language: pt-PT +type: private +encoding: UTF-8 +links: + - https://tracker.btnext.com/ # site forces https +legacylinks: + - http://tracker.btnext.com/ + +caps: + categorymappings: + - {id: 86, cat: Other, desc: "Freeleech"} + - {id: 88, cat: Movies, desc: "Movies"} + - {id: 89, cat: Console, desc: "Games"} + - {id: 87, cat: TV, desc: "Series"} + - {id: 93, cat: Audio, desc: "Musica"} + - {id: 108, cat: Movies, desc: "ViP"} + - {id: 1, cat: Movies, desc: "Movies"} + - {id: 70, cat: Movies/3D, desc: "Movies 3D"} + - {id: 71, cat: Movies/SD, desc: "Movies 480p"} + - {id: 72, cat: Movies/BluRay, desc: "Movies BD-R"} + - {id: 31, cat: Movies/HD, desc: "Movies BDRIP/BRRip"} + - {id: 16, cat: Movies/SD, desc: "Movies CAM"} + - {id: 74, cat: Movies/DVD, desc: "Movies DvD-R"} + - {id: 76, cat: Movies, desc: "Movies Packs"} + - {id: 115, cat: Movies/Other, desc: "Movies Kids"} + - {id: 91, cat: Movies/Other, desc: "Movies Kids Inglês"} + - {id: 113, cat: Movies/Other, desc: "Movies Kids PT-BR"} + - {id: 114, cat: Movies/Other, desc: "Movies Kids PT-PT"} + - {id: 77, cat: Movies/WEB-DL, desc: "Movies WEB-DL"} + - {id: 85, cat: Movies/DVD, desc: "Movies Custom-DVDR"} + - {id: 14, cat: Movies/SD, desc: "Movies DVDRip/XViD"} + - {id: 98, cat: Movies/Other, desc: "Movies Juvenil"} + - {id: 104, cat: Movies/UHD, desc: "Movies Bluray-UHD"} + - {id: 102, cat: Movies/HD, desc: "Movies HD-720p"} + - {id: 101, cat: Movies/HD, desc: "Movies HD-1080p"} + - {id: 103, cat: Movies/UHD, desc: "Movies HD-2160p"} + - {id: 42, cat: TV, desc: "TV Series"} + - {id: 45, cat: TV/Documentary, desc: "Documentaries"} + - {id: 46, cat: TV/Sport, desc: "Sports"} + - {id: 47, cat: TV/HD, desc: "TV Bluray"} + - {id: 48, cat: TV/SD, desc: "TV Dvd-R"} + - {id: 49, cat: TV/SD, desc: "TV DVDRiP"} + - {id: 50, cat: TV, desc: "TV Packs"} + - {id: 92, cat: TV, desc: "TV Kids"} + - {id: 112, cat: TV, desc: "TV Juvenil"} + - {id: 52, cat: TV/SD, desc: "TV SDx264"} + - {id: 53, cat: TV/WEB-DL, desc: "TV WEB-DL"} + - {id: 55, cat: TV/HD, desc: "TV X264"} + - {id: 56, cat: TV/SD, desc: "TV-XViD"} + - {id: 7, cat: Audio, desc: "Music"} + - {id: 20, cat: Audio/Video, desc: "Music MVideo"} + - {id: 21, cat: Audio/MP3, desc: "Music MP3"} + - {id: 33, cat: Audio/Video, desc: "Music MP4"} + - {id: 32, cat: Audio/Lossless, desc: "Music FLAC"} + - {id: 2, cat: Console, desc: "Games"} + - {id: 78, cat: PC/Games, desc: "Games Linux"} + - {id: 79, cat: PC/Mac, desc: "Games MacOSX"} + - {id: 28, cat: Console/NDS, desc: "Games Nintendo DS"} + - {id: 27, cat: PC/Games, desc: "Games PC/Windows"} + - {id: 111, cat: Console, desc: "Games Nintendo Sw"} + - {id: 80, cat: Console/PS3, desc: "Games PS2"} + - {id: 81, cat: Console/PS3, desc: "Games PS3"} + - {id: 82, cat: Console/PS4, desc: "Games PS4"} + - {id: 83, cat: Console/PSP, desc: "Games PSP"} + - {id: 95, cat: Console/PS Vita, desc: "Games PSVITA"} + - {id: 4, cat: Console/Wii, desc: "Games Wii"} + - {id: 26, cat: Console/XBox 360, desc: "Games XBOX360"} + - {id: 84, cat: Console/XBox, desc: "Games XONE"} + - {id: 6, cat: PC, desc: "Applications"} + - {id: 18, cat: PC/ISO, desc: "Applications PC"} + - {id: 19, cat: PC/Mac, desc: "Applications Macintosh"} + - {id: 34, cat: PC/ISO, desc: "Applications Linux"} + - {id: 44, cat: Other, desc: "Miscellaneous"} + - {id: 54, cat: Audio/Audiobook, desc: "Books Audiobook"} + - {id: 57, cat: Books/EBook, desc: "Books E-Books"} + - {id: 58, cat: Books/Comics, desc: "Books Comics"} + - {id: 59, cat: Books, desc: "Books Educational"} + - {id: 60, cat: Books/Mags, desc: "Books Magazines/Journals"} + - {id: 61, cat: Other, desc: "Pics/Wallpapers"} + - {id: 62, cat: PC/Mobile-Android, desc: "Android"} + - {id: 63, cat: PC/Mobile-iOS, desc: "iOS"} + - {id: 66, cat: PC/Mobile-Other, desc: "WindowsPhone"} + - {id: 90, cat: Other, desc: "GPS"} + - {id: 68, cat: Other, desc: "Others"} + - {id: 100, cat: Other, desc: "Revistas"} + - {id: 109, cat: TV/Anime, desc: "Anime"} + - {id: 51, cat: TV/Anime, desc: "Anime Filmes"} + - {id: 99, cat: TV/Anime, desc: "Anime Hentai"} + - {id: 110, cat: TV/Anime, desc: "Anime TV Séries"} + - {id: 41, cat: XXX, desc: "XXX"} + - {id: 64, cat: XXX, desc: "XXX-Magazines"} + - {id: 65, cat: XXX, desc: "XXX-Movies"} + - {id: 67, cat: XXX/Pack, desc: "XXX-Packs"} + - {id: 69, cat: XXX/ImageSet, desc: "XXX-Pics/Wallpapers"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: info + type: info + label: Layout + default: "
  1. Only the English Classic profile is supported.
  2. Make sure to set the Torrent Listing (Lista de Torrents) option in your profile to Classic (Clássico)
  3. Using the Moderna theme will prevent results.
" + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeders: seeders + size: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_results + type: info + label: Search results + default: "If you get 0 results check the log for error: An error has occurred!You can't view this page unless you read all your unread messages, then access the site with your browser and mark as read all PMs." + +login: + path: ?p=home&pid=1 + method: form + form: form#loginbox_form + submitpath: /ajax/login.php + inputs: + action: login + loginbox_membername: "{{ .Config.username }}" + loginbox_password: "{{ .Config.password }}" + loginbox_remember: 1 + selectorinputs: + securitytoken: + selector: "script:contains(\"stKey: \")" + filters: + - name: regexp + args: "stKey: \"(.+?)\"," + error: + - selector: ":contains(\"-ERROR-\")" + test: + path: ?p=torrents&pid=32 + selector: a#logout + +search: + paths: + - path: / + keywordsfilters: + - name: re_replace + args: ["[^a-zA-Z0-9]+", "%25"] + inputs: + p: torrents + pid: 32 + $raw: "{{ range .Categories }}cid[]={{.}}&{{end}}" + keywords: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # name, description, both, uploader + search_type: "{{ if .Query.IMDBID }}description{{ else }}name{{ end }}" + "sortOptions[sortBy]": "{{ .Config.sort }}" + "sortOptions[sortOrder]": "{{ .Config.type }}" + error: + - selector: div.error:not(:contains("Não existem resultados encontrados.")):not(:contains("There are no results found.")) + + rows: + selector: table#torrents_table_classic > tbody > tr:has(td.torrent_name) + + fields: + category: + selector: div.category_image > a + attribute: href + filters: + - name: querystring + args: cid + title: + selector: a[href*="?p=torrents&pid=10&action=details"] + details: + selector: a[href*="?p=torrents&pid=10&action=details"] + attribute: href + download: + selector: a[href*="?p=torrents&pid=10&action=download"] + attribute: href + size: + selector: a[rel="torrent_size"] + seeders: + selector: a[rel="torrent_seeders"] + leechers: + selector: a[rel="torrent_leechers"] + grabs: + selector: a[rel="times_completed"] + poster: + selector: a[rel="fancybox"] + attribute: href + imdbid: + # a href="http://tracker.btnext.com/data/torrents/imdb/tt0249677.jpg" + selector: a[href*="/imdb/tt"] + attribute: href + downloadvolumefactor: + case: + "img[title=\"FREE!\"]": 0 + "*": 1 + uploadvolumefactor: + text: 1 + date_ago: + selector: td.torrent_name > abbr.timeago + optional: true + attribute: data-time + date_year: + selector: td.torrent_name:not(:has(abbr.timeago)):not(:contains("day")):not(:contains("Domingo")):not(:contains("Sábado")):not(:contains("Sexta")):not(:contains("Quinta")):not(:contains("Quarta")):not(:contains("Terça")):not(:contains("Segunda")):not(:contains("ontem")):not(:contains("Hoje")) + optional: true + remove: span, a, br + filters: + - name: replace + args: ["Enviado ", ""] # Uploaded + - name: replace + args: ["Uploaded ", ""] + - name: replace + args: [" por", ""] # by + - name: replace + args: [" by", ""] + - name: replace + args: ["às ", ""] # at + - name: replace + args: ["at ", ""] + - name: append + args: " +00:00" # WET + - name: dateparse + args: "dd-MM-yyyy HH:mm zzz" + date_day: + selector: td.torrent_name:not(:has(abbr.timeago)):contains("day"), td.torrent_name:not(:has(abbr.timeago)):contains("Domingo"), td.torrent_name:not(:has(abbr.timeago)):contains("Sábado"), td.torrent_name:not(:has(abbr.timeago)):contains("Quinta"), td.torrent_name:not(:has(abbr.timeago)):contains("Sexta"), td.torrent_name:not(:has(abbr.timeago)):contains("Quarta"), td.torrent_name:not(:has(abbr.timeago)):contains("Terça"), td.torrent_name:not(:has(abbr.timeago)):contains("Segunda"), td.torrent_name:not(:has(abbr.timeago)):contains("ontem"), td.torrent_name:not(:has(abbr.timeago)):contains("Hoje") + optional: true + remove: span, a, br + filters: + - name: replace + args: ["Enviado ", ""] # Uploaded + - name: replace + args: ["Uploaded ", ""] + - name: replace + args: [" por", ""] # by + - name: replace + args: [" by", ""] + - name: replace + args: ["às ", "at "] + - name: replace + args: ["Hoje", "Today"] + - name: replace + args: ["ontem", "Yesterday"] + - name: replace + args: ["Segunda", "Monday"] + - name: replace + args: ["Terça", "Tuesday"] + - name: replace + args: ["Quarta", "Wednesday"] + - name: replace + args: ["Quinta", "Thursday"] + - name: replace + args: ["Sexta", "Friday"] + - name: replace + args: ["Sábado", "Saturday"] + - name: replace + args: ["Domingo", "Sunday"] + - name: fuzzytime + date: + text: "{{ if or .Result.date_year .Result.date_day .Result.date_ago }}{{ or .Result.date_year .Result.date_day .Result.date_ago }}{{ else }}now{{ end }}" +# TSUE 2.2 diff --git a/config/prowlarr/Definitions/btschool.yml b/config/prowlarr/Definitions/btschool.yml new file mode 100644 index 0000000..baf28d1 --- /dev/null +++ b/config/prowlarr/Definitions/btschool.yml @@ -0,0 +1,154 @@ +--- +id: btschool +name: BTSCHOOL +description: "BTSCHOOL is a CHINESE Private Torrent Tracker for MOVIES / TV / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://pt.btschool.club/ + +caps: + categorymappings: + - {id: 405, cat: Movies, desc: "电影/Movies"} + - {id: 406, cat: TV, desc: "连续剧/TV-Series"} + - {id: 407, cat: TV/Anime, desc: "动漫/Animation"} + - {id: 408, cat: TV/Documentary, desc: "纪录片/Documentary"} + - {id: 412, cat: TV, desc: "综艺/TV-Show"} + - {id: 404, cat: PC/0day, desc: "软件/Software"} + - {id: 402, cat: TV, desc: "资料/Education"} + - {id: 411, cat: PC/Games, desc: "游戏/Game"} + - {id: 409, cat: Audio, desc: "音乐/Music"} + - {id: 410, cat: TV/Sport, desc: "体育/Sports"} + - {id: 415, cat: Other, desc: "其他/Other"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: flaresolverr + type: info + label: FlareSolverr + default: This site may use Cloudflare DDoS Protection, therefore Prowlarr requires FlareSolverr to access it. + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: td.embedded:has(h2:contains("登錄失敗")) + - selector: td.embedded:has(h2:contains("失败")) + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # 0 incldead, 1 active, 2 justdead + incldead: 0 + # promotion: 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x 50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdb + search_area: "{{ if .Query.IMDBID }}4{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: 4 + type: desc + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[title][href^="details.php?id="] + attribute: title + details: + selector: a[title][href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-child(5) + seeders: + selector: td.rowfollow:nth-child(6) + leechers: + selector: td.rowfollow:nth-child(7) + grabs: + selector: td.rowfollow:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumratio: + text: 1.0 + description: + selector: td:nth-child(2) + remove: a, b, font, img, span +# NexusPHP Standard v1.5 Beta 4 diff --git a/config/prowlarr/Definitions/btsow.yml b/config/prowlarr/Definitions/btsow.yml new file mode 100644 index 0000000..c572199 --- /dev/null +++ b/config/prowlarr/Definitions/btsow.yml @@ -0,0 +1,90 @@ +--- +id: btsow +name: BTSOW +description: "BTSOW is a Public torrent indexer" +language: en-US +type: public +encoding: UTF-8 +# use https://tellme.pw/btsow to find the new domain +links: + - https://btsow.motorcycles/ +legacylinks: + - https://btsow.rest/ + - https://btsow.bar/ + - https://btsow.click/ + - https://btsow.cfd/ + - https://btsow.sbs/ + - https://btsow.quest/ + - https://btsow.autos/ + - https://btsow.beauty/ + - https://btsow.mom/ + - https://btsow.boats/ + - https://btsow.hair/ + - https://btsow.bond/ + - https://btsow.skin/ + - https://btsow.makeup/ + - https://btsow.homes/ + +caps: + categories: + Other: Other + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: info_8000 + type: info + label: About BTSOW Categories + default: BTSOW does not return categories in its search results.
To add to your Apps' Torznab indexer, replace all categories with 8000(Other). + +download: + selectors: + - selector: a#magnetOpen + attribute: href + +search: + paths: + - path: "search/{{ if .Keywords }}{{ .Keywords }}{{ else }}{{ .Today.Year }}{{ end }}" + + headers: + # site blocks Jackett's User-Agents, so slightly alter it here (e.g. Safari/537.36 > Safari/537.35) + User-Agent: ["Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.35"] + + rows: + selector: div.row:has(a[href*="/detail/hash/"]) + + fields: + category: + text: Other + title: + selector: a[href*="/detail/hash/"] + attribute: title + details: + selector: a[href*="/detail/hash/"] + attribute: href + download: + selector: a[href*="/detail/hash/"] + attribute: href + date: + selector: div.date + filters: + - name: append + args: " -00:00" # GMT + - name: dateparse + args: "yyyy-MM-dd zzz" + size: + selector: div.size + seeders: + text: 1 + leechers: + text: 1 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/bwtorrents.yml b/config/prowlarr/Definitions/bwtorrents.yml new file mode 100644 index 0000000..186abab --- /dev/null +++ b/config/prowlarr/Definitions/bwtorrents.yml @@ -0,0 +1,231 @@ +--- +id: bwtorrents +name: BwTorrents +description: "BwTorrents is a Private Torrent Tracker for BollyWood MOVIES / TV / GENERAL" +language: en-US +type: private +encoding: UTF-8 +links: + - https://bwtorrents.tv/ + - https://bwtorrents.co/ + - https://bwtorrents.cc/ +legacylinks: + - https://bwtorrents.fun/ + - https://bwtorrents.xyz/ + - https://bwtorrents.us/ + - https://bwtorrents.live/ + +caps: + categorymappings: + # note: to update cats for this site its easier to use my.php and sort by cat integer + # also cat 187 is undocumented but exists + - {id: 113, cat: Movies, desc: "Bollywood-Pre-Release"} + - {id: 114, cat: Movies/UHD, desc: "Bollywood-4K Ultra HD / Upscaled"} + - {id: 115, cat: Movies/BluRay, desc: "Bollywood-Untouched BluRay"} + - {id: 116, cat: Movies/HD, desc: "Bollywood-1080p BluRay Rips"} + - {id: 117, cat: Movies/HD, desc: "Bollywood-720p BluRay Rips"} + - {id: 118, cat: Movies, desc: "Bollywood-Remuxes BluRay"} + - {id: 119, cat: Movies/WEB-DL, desc: "Bollywood-Untouched WEB-DLs"} + - {id: 120, cat: Movies/WEB-DL, desc: "Bollywood-1080p WEB-Rips"} + - {id: 121, cat: Movies/DVD, desc: "Bollywood-Untouched DVDs"} + - {id: 122, cat: Movies/WEB-DL, desc: "Bollywood-DVDRips 1080p/720p"} + - {id: 123, cat: Movies/WEB-DL, desc: "Bollywood-SDRips WEB/DVD"} + - {id: 124, cat: Movies/3D, desc: "Bollywood-3D-Movies"} + - {id: 125, cat: Movies/WEB-DL, desc: "Bollywood-Web Series"} + - {id: 126, cat: Movies/UHD, desc: "Hollywood-4K Ultra HD / Upscaled"} + - {id: 127, cat: Movies/BluRay, desc: "Hollywood-Untouched BluRay"} + - {id: 128, cat: Movies/HD, desc: "Hollywood-1080p BluRay Rips"} + - {id: 129, cat: Movies/HD, desc: "Hollywood-720p BluRay Rips"} + - {id: 130, cat: Movies, desc: "Hollywood-BluRay Remuxes"} + - {id: 131, cat: Movies/WEB-DL, desc: "Hollywood-Untouched WEB-DLs"} + - {id: 132, cat: Movies, desc: "Hollywood-1080p WEB-Rips"} + - {id: 133, cat: Movies/DVD, desc: "Hollywood-Untouched DVDs"} + - {id: 134, cat: Movies/WEB-DL, desc: "Hollywood-DVDRips 1080p/720p"} + - {id: 135, cat: Movies/3D, desc: "Hollywood-3D-Movies"} + - {id: 136, cat: Movies, desc: "Hollywood-Pre-Release"} + - {id: 137, cat: Movies, desc: "Malayalam-Movies"} + - {id: 140, cat: Movies, desc: "Punjabi-Movies"} + - {id: 141, cat: Movies, desc: "Kannada-Movies"} + - {id: 142, cat: Movies, desc: "Lollywood-Movies"} + - {id: 143, cat: Movies, desc: "Bhoipuri-Movies"} + - {id: 144, cat: Movies, desc: "Marathi-Movies"} + - {id: 145, cat: Movies, desc: "Bangla-Movies"} + - {id: 146, cat: TV, desc: "TV-Colors"} + - {id: 147, cat: TV, desc: "TV-TV"} + - {id: 148, cat: TV, desc: "TV-Life OK"} + - {id: 149, cat: TV, desc: "TV-Pakistan Drams"} + - {id: 150, cat: TV, desc: "TV-Sab TV"} + - {id: 151, cat: TV, desc: "TV-Sony"} + - {id: 152, cat: TV, desc: "TV-Star Bharat"} + - {id: 153, cat: TV, desc: "TV-Star Plus"} + - {id: 154, cat: TV, desc: "TV-Zee TV"} + - {id: 155, cat: TV/Sport, desc: "TV-Sports"} + - {id: 156, cat: TV/Documentary, desc: "TV-Documentaries"} + - {id: 157, cat: TV, desc: "TV-Hollywood Tv Shows"} + - {id: 158, cat: TV, desc: "TV-Other Tv Shows"} + - {id: 159, cat: Audio, desc: "Music-Religion & Spirituality"} + - {id: 160, cat: Audio, desc: "Music-Classical"} + - {id: 161, cat: Audio/Lossless, desc: "Music-Flacs"} + - {id: 162, cat: Audio, desc: "Music-Ghazals"} + - {id: 163, cat: Audio, desc: "Music-Hindi OSTs"} + - {id: 164, cat: Audio, desc: "Music-Instrumental"} + - {id: 165, cat: Audio, desc: "Music-Kannada"} + - {id: 166, cat: Audio, desc: "Music-Lollywood"} + - {id: 167, cat: Audio, desc: "Music-Malayalam"} + - {id: 168, cat: Audio, desc: "Music-Marathi"} + - {id: 169, cat: Audio/Video, desc: "Music-Videos"} + - {id: 170, cat: Audio, desc: "Music-Pop"} + - {id: 171, cat: Audio, desc: "Music-Punjabi"} + - {id: 172, cat: Audio, desc: "Music-Remix"} + - {id: 173, cat: Audio, desc: "Music-Tamil"} + - {id: 174, cat: Audio, desc: "Music-Telugu"} + - {id: 175, cat: Books/EBook, desc: "Ebooks"} + - {id: 176, cat: PC/Games, desc: "Games PC"} + - {id: 177, cat: Console, desc: "Games Console"} + - {id: 178, cat: TV/Anime, desc: "Anime"} + - {id: 179, cat: PC, desc: "Appz"} + - {id: 180, cat: PC/Mobile-Other, desc: "Mobile Stuff"} + - {id: 181, cat: Other, desc: "Pics/Wallpapers"} + - {id: 182, cat: Movies, desc: "Other Movies"} + - {id: 183, cat: Movies, desc: "English Hindi Dubbed"} + - {id: 184, cat: Movies, desc: "South Hindi Dubbed"} + - {id: 185, cat: Movies, desc: "Gujarati-Movies"} + - {id: 186, cat: TV, desc: "TV-Dangal Tv"} + - {id: 187, cat: XXX, desc: "Adult XXX 18+"} + - {id: 188, cat: Movies/WEB-DL, desc: "Bollywood-720p WEB-Rips"} + - {id: 189, cat: Movies/DVD, desc: "Bollywood-Encoded DVDs"} + - {id: 190, cat: Movies, desc: "Bollywood-Movie packs"} + - {id: 191, cat: Movies/WEB-DL, desc: "Hollywood-Encoded DVDs"} + - {id: 192, cat: Movies, desc: "Hollywood-720p WEB-Rips"} + - {id: 193, cat: Movies/SD, desc: "Hollywood-SDRips - WEB/DVD"} + - {id: 194, cat: Movies, desc: "Hollywood-Movie packs"} + - {id: 195, cat: TV, desc: "TV-Tv Packs"} + - {id: 196, cat: Audio, desc: "Music-Packs"} + - {id: 197, cat: Movies, desc: "Turkish Hindi Dubbed"} + - {id: 198, cat: Movies, desc: "TV-MTV"} + - {id: 199, cat: Movies, desc: "Telgu-Movies | 4K Ultra HD - Upscaled"} + - {id: 200, cat: Movies, desc: "Telgu-Movies | Untouched WEB-DLs"} + - {id: 201, cat: Movies, desc: "Telgu-Movies | 1080p/720p WEBRips"} + - {id: 202, cat: Movies, desc: "Telgu-Movies | Untouched BluRay"} + - {id: 203, cat: Movies, desc: "Telgu-Movies | Untouched DVDs"} + - {id: 204, cat: Movies, desc: "Telgu-Movies | SD-WEBRips / DVDRips"} + - {id: 205, cat: Movies, desc: "Telgu-Movies | Movie Packs"} + - {id: 207, cat: Movies, desc: "Telgu-Movies | BluRay Rips"} + - {id: 208, cat: Movies, desc: "Telgu-Movies | Remuxes BluRay"} + - {id: 209, cat: Movies, desc: "Tamil-Movies | 4K Ultra HD - Upscaled"} + - {id: 210, cat: Movies, desc: "Tamil-Movies | Untouched WEB-DLs"} + - {id: 211, cat: Movies, desc: "Tamil-Movies | 1080p/720p WEBRips"} + - {id: 212, cat: Movies, desc: "Tamil-Movies | Untouched BluRay"} + - {id: 213, cat: Movies, desc: "Tamil-Movies | Untouched DVDs"} + - {id: 214, cat: Movies, desc: "Tamil-Movies | SD-WEBRips / DVDRips"} + - {id: 215, cat: Movies, desc: "Tamil-Movies | Movie Packs"} + - {id: 216, cat: Movies, desc: "Tamil-Movies | BluRay Rips"} + - {id: 217, cat: Movies, desc: "Tamil-Movies | Remuxes BluRay"} + - {id: 218, cat: TV, desc: "TV-Ishara TV"} + - {id: 219, cat: TV, desc: "TV-Bengali Tv"} + - {id: 220, cat: TV, desc: "TV-Shemaroo Umang"} + - {id: 221, cat: TV, desc: "TV-JioTv"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: td.embedded:has(h2:contains("failed")) + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + # https://bwtorrents.tv/index.php?search=&blah=0&c120=1&c119=1&incldead=1 + - path: index.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 1 all, 2 onlydead, 3 free + incldead: "{{ if .Config.freeleech }}3{{ else }}1{{ end }}" + # 0 name, 1 descr, 2 both + blah: 0 + # does not support imdbid searches and does not have imdb links in results. + + rows: + selector: table[width="1200"] > tbody > tr:has(a[href^="download.php/"]) + + fields: + category: + selector: a[href^="index.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] b + details: + selector: a[href^="details.php?id="] + attribute: href + files: + selector: td:nth-child(3) + date: + selector: td:nth-child(5) + # auto adjusted by site account profile + filters: + - name: dateparse + args: "dd-MM-yyyyHH:mm:ss" + size: + selector: td:nth-child(6) + download: + selector: a[href^="download.php/"] + attribute: href + seeders: + selector: td:nth-child(8) + leechers: + selector: td:nth-child(9) + grabs: + selector: td:nth-child(9) + downloadvolumefactor: + case: + "font:contains(\"FreeLeech\")": 0 + "*": 1 + uploadvolumefactor: + case: + img[src="pic/double_upload.png"]: 2 + "*": 1 + genre: + selector: td:nth-child(2) + filters: + - name: regexp + args: "Genre:\\s(.+?)$" + - name: replace + args: [", ", ","] + - name: replace + args: [" ", "_"] + description: + text: "{{ .Result.genre }}" + minimumratio: + text: 1.0 + minimumseedtime: + # 3 day (as seconds = 3 x 24 x 60 x 60) + text: 259200 +# AEON diff --git a/config/prowlarr/Definitions/byrbt.yml b/config/prowlarr/Definitions/byrbt.yml new file mode 100644 index 0000000..4757346 --- /dev/null +++ b/config/prowlarr/Definitions/byrbt.yml @@ -0,0 +1,172 @@ +--- +id: byrbt +name: BYRBT +description: "BYRBT is a CHINESE Private Torrent Tracker for HD MOVIES / TV / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://byr.pt/ + +caps: + categorymappings: + - {id: 408, cat: Movies, desc: "电影Movies"} + - {id: 401, cat: TV, desc: "剧集TV Series"} + - {id: 404, cat: TV/Anime, desc: "动漫Animations"} + - {id: 402, cat: Audio, desc: "音乐Music"} + - {id: 405, cat: Other, desc: "综艺Arts"} + - {id: 403, cat: Console, desc: "游戏Games"} + - {id: 406, cat: PC, desc: "软件Software"} + - {id: 407, cat: TV/Documentary, desc: "资料Documentaries"} + - {id: 409, cat: TV/Sport, desc: "体育Sports"} + - {id: 410, cat: Other/Misc, desc: "纪录Records"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + inputs: + logintype: username + userinput: "{{ .Config.username }}" + password: "{{ .Config.password }}" + autologin: yes + error: + - selector: td.embedded:has(h2:contains("失败")) + test: + path: index.php + selector: a[href^="logout.php?key="] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if .Query.DoubanID }}/{{ .Query.DoubanID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }}{{ else }}{{ .Keywords }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl + search_area: "{{ if .Query.IMDBID }}4{{ else }}{{ end }}{{ if .Query.DoubanID }}1{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }}{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 exact, 3 NOT + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href^="torrents.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-last-of-type(6) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-last-of-type(6):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-last-of-type(5) + seeders: + selector: td.rowfollow:nth-last-of-type(4) + leechers: + selector: td.rowfollow:nth-last-of-type(3) + grabs: + selector: td.rowfollow:nth-last-of-type(2) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 1 day (as seconds = 1 x 24 x 60 x 60) + text: 86400 + description: + selector: td:nth-child(2) + remove: a, b, font, img, span +# NexusPHP v1.5 beta 5 20120707 diff --git a/config/prowlarr/Definitions/byrutor.yml b/config/prowlarr/Definitions/byrutor.yml new file mode 100644 index 0000000..5fd48a3 --- /dev/null +++ b/config/prowlarr/Definitions/byrutor.yml @@ -0,0 +1,414 @@ +--- +id: byrutor +name: Byrutor +description: "Byrutor is a RUSSIAN Public Torrent Tracker for GAMES" +language: ru-RU +type: public +encoding: UTF-8 +links: + - https://thebyrut.org/ +legacylinks: + - https://byrutor.org/ + - https://byrutdb.org/ + - https://byrut.org/ + +caps: + categorymappings: + - {id: 1, cat: PC/Games, desc: "Экшены"} + - {id: 2, cat: PC/Games, desc: "Приключения"} + - {id: 3, cat: PC/Games, desc: "Гонки"} + - {id: 4, cat: PC/Games, desc: "RPG"} + - {id: 5, cat: PC/Games, desc: "Головоломка"} + - {id: 6, cat: PC/Games, desc: "Инди"} + - {id: 7, cat: PC/Games, desc: "Стратегии"} + - {id: 8, cat: PC/Games, desc: "Выживание"} + - {id: 9, cat: PC/Games, desc: "Шутеры"} + - {id: 10, cat: PC/Games, desc: "Симуляторы"} + - {id: 11, cat: PC/Games, desc: "Спортивные"} + - {id: 12, cat: PC/Games, desc: "Аркады"} + - {id: 13, cat: PC/Games, desc: "Файтинги"} + - {id: 14, cat: PC/Games, desc: "Хорроры"} + - {id: 15, cat: PC/Games, desc: "Открытый мир"} + - {id: 16, cat: PC/Games, desc: "Аниме"} + - {id: 248, cat: PC/Games, desc: "Repack от Chovka"} + - {id: 17, cat: PC/Games, desc: "Repack от Механики"} + - {id: 20, cat: PC/Games, desc: "RePack от FitGirl"} + - {id: 18, cat: PC/Games, desc: "Repack от Xatab"} + - {id: 232, cat: PC/Games, desc: "RePack от SpaceX"} + - {id: 233, cat: PC/Games, desc: "RePack от Pioneer"} + - {id: 19, cat: PC/Games, desc: "Repack от Catalyst"} + - {id: 249, cat: PC/Games, desc: "GOG игры"} + - {id: 22, cat: PC/Games, desc: "Русская озвучка"} + - {id: 25, cat: PC/Games, desc: "Старые игры"} + - {id: 26, cat: PC/Games, desc: "Игры с геймпадом"} + - {id: 27, cat: PC/Games, desc: "Мультиплеер"} + - {id: 28, cat: PC/Games, desc: "На двоих"} + - {id: 29, cat: PC/Games, desc: "Рогалик"} + - {id: 30, cat: PC/Games, desc: "Слэшер"} + - {id: 31, cat: PC/Games, desc: "Стелс"} + - {id: 32, cat: PC/Games, desc: "Фэнтези"} + - {id: 33, cat: PC/Games, desc: "Платформер"} + - {id: 34, cat: PC/Games, desc: "Песочница"} + - {id: 35, cat: PC/Games, desc: "Игры в 2D"} + - {id: 36, cat: PC/Games, desc: "Казуальная"} + - {id: 37, cat: PC/Games, desc: "Point and click"} + - {id: 38, cat: PC/Games, desc: "Вид сбоку"} + - {id: 39, cat: PC/Games, desc: "Вид сверху"} + - {id: 40, cat: PC/Games, desc: "Tower Defense"} + - {id: 41, cat: PC/Games, desc: "Экономика"} + - {id: 42, cat: PC/Games, desc: "Тактика"} + - {id: 43, cat: PC/Games, desc: "Пошаговые стратегии (TBS)"} + - {id: 44, cat: PC/Games, desc: "Глобальные стратегии"} + - {id: 45, cat: PC/Games, desc: "Стратегии в реальном времени"} + - {id: 48, cat: PC/Games, desc: "Для взрослых"} + - {id: 49, cat: PC/Games, desc: "От первого лица"} + - {id: 50, cat: PC/Games, desc: "От третьего лица"} + - {id: 51, cat: PC/Games, desc: "Шутер от первого лица"} + - {id: 52, cat: PC/Games, desc: "Шутер от третьего лица"} + - {id: 53, cat: PC/Games, desc: "Игры для слабых ПК"} + - {id: 58, cat: PC/Games, desc: "Психологический хоррор"} + - {id: 59, cat: PC/Games, desc: "Хоррор на выживание"} + - {id: 60, cat: PC/Games, desc: "Ролевой экшен"} + - {id: 61, cat: PC/Games, desc: "Приключенческий экшен"} + - {id: 63, cat: PC/Games, desc: "Головоломка-платформер"} + - {id: 64, cat: PC/Games, desc: "Скролл-шутер"} + - {id: 65, cat: PC/Games, desc: "Шутер с видом сверху"} + - {id: 66, cat: PC/Games, desc: "Градостроительный симулятор"} + - {id: 67, cat: PC/Games, desc: "Космический симулятор"} + - {id: 68, cat: PC/Games, desc: "Научная фантастика"} + - {id: 69, cat: PC/Games, desc: "Ролевая стратегия"} + - {id: 70, cat: PC/Games, desc: "Тактическая ролевая игра"} + - {id: 71, cat: PC/Games, desc: "Тактика в реальном времени"} + - {id: 72, cat: PC/Games, desc: "Японская ролевая игра"} + - {id: 73, cat: PC/Games, desc: "Тёмное фэнтези"} + - {id: 74, cat: PC/Games, desc: "Сложная"} + - {id: 75, cat: PC/Games, desc: "Атмосфера"} + - {id: 76, cat: PC/Games, desc: "Смешная"} + - {id: 77, cat: PC/Games, desc: "Пиксельная графика"} + - {id: 78, cat: PC/Games, desc: "Юмор"} + - {id: 79, cat: PC/Games, desc: "Классика"} + - {id: 80, cat: PC/Games, desc: "Космос"} + - {id: 81, cat: PC/Games, desc: "Зомби"} + - {id: 82, cat: PC/Games, desc: "Мрачная"} + - {id: 83, cat: PC/Games, desc: "Тайна"} + - {id: 84, cat: PC/Games, desc: "Физика"} + - {id: 85, cat: PC/Games, desc: "Реализм"} + - {id: 86, cat: PC/Games, desc: "Короткая"} + - {id: 87, cat: PC/Games, desc: "Строительство"} + - {id: 88, cat: PC/Games, desc: "Война"} + - {id: 89, cat: PC/Games, desc: "Крафтинг"} + - {id: 90, cat: PC/Games, desc: "Будущее"} + - {id: 91, cat: PC/Games, desc: "Средневековье"} + - {id: 92, cat: PC/Games, desc: "Затягивающая"} + - {id: 93, cat: PC/Games, desc: "Строительство базы"} + - {id: 94, cat: PC/Games, desc: "Управление ресурсами"} + - {id: 95, cat: PC/Games, desc: "Насилие"} + - {id: 96, cat: PC/Games, desc: "Для всей семьи"} + - {id: 97, cat: PC/Games, desc: "Исследование"} + - {id: 98, cat: PC/Games, desc: "Расслабляющая"} + - {id: 99, cat: PC/Games, desc: "Реиграбельность"} + - {id: 100, cat: PC/Games, desc: "Поиск предметов"} + - {id: 101, cat: PC/Games, desc: "Пост-апокалипсис"} + - {id: 102, cat: PC/Games, desc: "Вторая мировая война"} + - {id: 103, cat: PC/Games, desc: "Военные действия"} + - {id: 105, cat: PC/Games, desc: "Вождение"} + - {id: 189, cat: PC/Games, desc: "Пошаговая"} + - {id: 106, cat: PC/Games, desc: "Пошаговая тактика"} + - {id: 328, cat: PC/Games, desc: "2D-платформер"} + - {id: 107, cat: PC/Games, desc: "3D-платформер"} + - {id: 108, cat: PC/Games, desc: "Одна жизнь"} + - {id: 109, cat: PC/Games, desc: "Паркур"} + - {id: 110, cat: PC/Games, desc: "Детектив"} + - {id: 111, cat: PC/Games, desc: "Криминал"} + - {id: 112, cat: PC/Games, desc: "Разрушения"} + - {id: 113, cat: PC/Games, desc: "90-е"} + - {id: 114, cat: PC/Games, desc: "80-е"} + - {id: 115, cat: PC/Games, desc: "Разделение экрана"} + - {id: 116, cat: PC/Games, desc: "Военные конфликты"} + - {id: 117, cat: PC/Games, desc: "Драконы"} + - {id: 118, cat: PC/Games, desc: "Пираты"} + - {id: 119, cat: PC/Games, desc: "Ниндзя"} + - {id: 120, cat: PC/Games, desc: "Поезда"} + - {id: 121, cat: PC/Games, desc: "Динозавры"} + - {id: 122, cat: PC/Games, desc: "Раннер"} + - {id: 123, cat: PC/Games, desc: "Супергерои"} + - {id: 124, cat: PC/Games, desc: "По комиксу"} + - {id: 125, cat: PC/Games, desc: "Хакерство"} + - {id: 126, cat: PC/Games, desc: "Эмоциональная"} + - {id: 127, cat: PC/Games, desc: "Футбол"} + - {id: 128, cat: PC/Games, desc: "Рыбалка"} + - {id: 129, cat: PC/Games, desc: "Бездорожье"} + - {id: 130, cat: PC/Games, desc: "Программирование"} + - {id: 131, cat: PC/Games, desc: "Вампиры"} + - {id: 132, cat: PC/Games, desc: "Снайпер"} + - {id: 133, cat: PC/Games, desc: "Ремейк"} + - {id: 134, cat: PC/Games, desc: "Отличный саундтрек"} + - {id: 135, cat: PC/Games, desc: "Глубокий сюжет"} + - {id: 136, cat: PC/Games, desc: "Женщина-протагонист"} + - {id: 137, cat: PC/Games, desc: "Кровь"} + - {id: 138, cat: PC/Games, desc: "Киберпанк"} + - {id: 139, cat: PC/Games, desc: "Эпичная"} + - {id: 140, cat: PC/Games, desc: "Мясо"} + - {id: 141, cat: PC/Games, desc: "Нагота"} + - {id: 142, cat: PC/Games, desc: "Цветастая"} + - {id: 143, cat: PC/Games, desc: "Education"} + - {id: 144, cat: PC/Games, desc: "Менеджмент"} + - {id: 145, cat: PC/Games, desc: "Упрощённый рогалик"} + - {id: 146, cat: PC/Games, desc: "Музыка"} + - {id: 147, cat: PC/Games, desc: "Кастомизация персонажа"} + - {id: 148, cat: PC/Games, desc: "История"} + - {id: 149, cat: PC/Games, desc: "Охота"} + - {id: 150, cat: PC/Games, desc: "По мотивам книги"} + - {id: 151, cat: PC/Games, desc: "Первая мировая война"} + - {id: 152, cat: PC/Games, desc: "Тайм-менеджмент"} + - {id: 153, cat: PC/Games, desc: "Психоделия"} + - {id: 154, cat: PC/Games, desc: "Наука"} + - {id: 155, cat: PC/Games, desc: "Морские бои"} + - {id: 156, cat: PC/Games, desc: "Сельское хозяйство"} + - {id: 157, cat: PC/Games, desc: "Кинематографичная"} + - {id: 158, cat: PC/Games, desc: "Вестерн"} + - {id: 159, cat: PC/Games, desc: "Три в ряд"} + - {id: 160, cat: PC/Games, desc: "Стимпанк"} + - {id: 161, cat: PC/Games, desc: "Редактор уровней"} + - {id: 162, cat: PC/Games, desc: "Культовая классика"} + - {id: 163, cat: PC/Games, desc: "Минимализм"} + - {id: 164, cat: PC/Games, desc: "Shoot'em up"} + - {id: 165, cat: PC/Games, desc: "Решения с последствиями"} + - {id: 166, cat: PC/Games, desc: "Процедурная генерация"} + - {id: 167, cat: PC/Games, desc: "Мультипликация"} + - {id: 168, cat: PC/Games, desc: "Мультфильм"} + - {id: 169, cat: PC/Games, desc: "Пошаговые сражения"} + - {id: 170, cat: PC/Games, desc: "Магия"} + - {id: 171, cat: PC/Games, desc: "Изометрия"} + - {id: 172, cat: PC/Games, desc: "Карточная игра"} + - {id: 173, cat: PC/Games, desc: "Чёрный юмор"} + - {id: 174, cat: PC/Games, desc: "Beat'em up"} + - {id: 175, cat: PC/Games, desc: "Свобода выбора"} + - {id: 176, cat: PC/Games, desc: "Рисованная графика"} + - {id: 177, cat: PC/Games, desc: "Инопланетяне"} + - {id: 178, cat: PC/Games, desc: "Твин-стик шутер"} + - {id: 179, cat: PC/Games, desc: "Настольная игра"} + - {id: 180, cat: PC/Games, desc: "Полёты"} + - {id: 181, cat: PC/Games, desc: "Лут"} + - {id: 183, cat: PC/Games, desc: "MOBA"} + - {id: 184, cat: PC/Games, desc: "Демоны"} + - {id: 185, cat: PC/Games, desc: "Расследование"} + - {id: 186, cat: PC/Games, desc: "Мифология"} + - {id: 187, cat: PC/Games, desc: "VR"} + - {id: 191, cat: PC/Games, desc: "Психологическая"} + - {id: 193, cat: PC/Games, desc: "Подземелье"} + - {id: 196, cat: PC/Games, desc: "Шедевр"} + - {id: 197, cat: PC/Games, desc: "Ретро"} + - {id: 198, cat: PC/Games, desc: "Олдскул"} + - {id: 251, cat: PC/Games, desc: "Визуальная новелла"} + - {id: 252, cat: PC/Games, desc: "Образование"} + - {id: 253, cat: PC/Games, desc: "Партийная RPG"} + - {id: 254, cat: PC/Games, desc: "Симулятор ходьбы"} + - {id: 255, cat: PC/Games, desc: "Симулятор жизни"} + - {id: 256, cat: PC/Games, desc: "Автосимулятор"} + - {id: 257, cat: PC/Games, desc: "Ритм-игра"} + - {id: 258, cat: PC/Games, desc: "Королевская битва"} + - {id: 259, cat: PC/Games, desc: "Симулятор колонии"} + - {id: 260, cat: PC/Games, desc: "Симулятор фермы"} + - {id: 261, cat: PC/Games, desc: "Иммерсивный симулятор"} + - {id: 262, cat: PC/Games, desc: "Кликер"} + - {id: 263, cat: PC/Games, desc: "Арена-шутер"} + - {id: 264, cat: PC/Games, desc: "Платформер на точность"} + - {id: 265, cat: PC/Games, desc: "Метроидвания"} + - {id: 266, cat: PC/Games, desc: "Похожа на Dark Souls"} + - {id: 267, cat: PC/Games, desc: "Коллектатон"} + - {id: 268, cat: PC/Games, desc: "Idle-игра"} + - {id: 269, cat: PC/Games, desc: "Поиск существ"} + - {id: 270, cat: PC/Games, desc: "Зрелищные сражения"} + - {id: 271, cat: PC/Games, desc: "Пасьянс"} + - {id: 272, cat: PC/Games, desc: "Боевые гонки"} + - {id: 273, cat: PC/Games, desc: "Лутер-шутер"} + - {id: 274, cat: PC/Games, desc: "Политический симулятор"} + - {id: 275, cat: PC/Games, desc: "Традиционный рогалик"} + - {id: 276, cat: PC/Games, desc: "Милая"} + - {id: 277, cat: PC/Games, desc: "Стилизация"} + - {id: 278, cat: PC/Games, desc: "Псевдотрёхмерность"} + - {id: 279, cat: PC/Games, desc: "Абстрактная"} + - {id: 280, cat: PC/Games, desc: "Красивая"} + - {id: 281, cat: PC/Games, desc: "Воксельная графика"} + - {id: 282, cat: PC/Games, desc: "Логика"} + - {id: 283, cat: PC/Games, desc: "Драма"} + - {id: 284, cat: PC/Games, desc: "Романтика"} + - {id: 285, cat: PC/Games, desc: "Сюрреалистичная"} + - {id: 286, cat: PC/Games, desc: "Мемы"} + - {id: 287, cat: PC/Games, desc: "Природа"} + - {id: 288, cat: PC/Games, desc: "Роботы"} + - {id: 289, cat: PC/Games, desc: "Проработанная вселенная"} + - {id: 290, cat: PC/Games, desc: "Триллер"} + - {id: 291, cat: PC/Games, desc: "Антиутопия"} + - {id: 292, cat: PC/Games, desc: "Сверхъестественное"} + - {id: 293, cat: PC/Games, desc: "Альтернативная история"} + - {id: 294, cat: PC/Games, desc: "Сражения на мечах"} + - {id: 295, cat: PC/Games, desc: "Котики"} + - {id: 296, cat: PC/Games, desc: "Америка"} + - {id: 297, cat: PC/Games, desc: "Иллюминаты"} + - {id: 298, cat: PC/Games, desc: "Капитализм"} + - {id: 299, cat: PC/Games, desc: "Заговор"} + - {id: 300, cat: PC/Games, desc: "Сатира"} + - {id: 301, cat: PC/Games, desc: "Готика"} + - {id: 303, cat: PC/Games, desc: "Шахты"} + - {id: 304, cat: PC/Games, desc: "Боевые искусства"} + - {id: 305, cat: PC/Games, desc: "Танки"} + - {id: 306, cat: PC/Games, desc: "Подводный мир"} + - {id: 307, cat: PC/Games, desc: "Кулинария"} + - {id: 308, cat: PC/Games, desc: "Флот"} + - {id: 309, cat: PC/Games, desc: "Транспорт"} + - {id: 311, cat: PC/Games, desc: "Марс"} + - {id: 312, cat: PC/Games, desc: "Оборотни"} + - {id: 313, cat: PC/Games, desc: "Бой"} + - {id: 314, cat: PC/Games, desc: "Несколько концовок"} + - {id: 315, cat: PC/Games, desc: "Игра против ИИ"} + - {id: 316, cat: PC/Games, desc: "Линейная"} + - {id: 192, cat: PC/Games, desc: "Нелинейная"} + - {id: 317, cat: PC/Games, desc: "Повествовательная"} + - {id: 318, cat: PC/Games, desc: "Набор очков"} + - {id: 319, cat: PC/Games, desc: "Менеджмент инвентаря"} + - {id: 320, cat: PC/Games, desc: "Перемещение по сетке"} + - {id: 321, cat: PC/Games, desc: "Разделение на классы"} + - {id: 322, cat: PC/Games, desc: "Кастомизация оружия"} + - {id: 323, cat: PC/Games, desc: "Построение колоды"} + - {id: 324, cat: PC/Games, desc: "Гонки на выживание"} + - {id: 325, cat: PC/Games, desc: "Свобода движения"} + - {id: 326, cat: PC/Games, desc: "Замедление времени"} + - {id: 327, cat: PC/Games, desc: "Динамическое повествование"} + - {id: 238, cat: PC/Games, desc: "Игры 2024 года"} + - {id: 237, cat: PC/Games, desc: "Игры 2023 года"} + - {id: 236, cat: PC/Games, desc: "Игры 2022 года"} + - {id: 235, cat: PC/Games, desc: "Игры 2021 года"} + - {id: 199, cat: PC/Games, desc: "Игры 2020 года"} + - {id: 200, cat: PC/Games, desc: "Игры 2019 года"} + - {id: 201, cat: PC/Games, desc: "Игры 2018 года"} + - {id: 202, cat: PC/Games, desc: "Игры 2017 года"} + - {id: 203, cat: PC/Games, desc: "Игры 2016 года"} + - {id: 204, cat: PC/Games, desc: "Игры 2015 года"} + - {id: 205, cat: PC/Games, desc: "Игры 2014 года"} + - {id: 206, cat: PC/Games, desc: "Игры 2013 года"} + - {id: 207, cat: PC/Games, desc: "Игры 2012 года"} + - {id: 208, cat: PC/Games, desc: "Игры 2011 года"} + - {id: 209, cat: PC/Games, desc: "Игры 2010 года"} + - {id: 210, cat: PC/Games, desc: "Игры 2009 года"} + - {id: 211, cat: PC/Games, desc: "Игры 2008 года"} + - {id: 212, cat: PC/Games, desc: "Игры 2007 года"} + - {id: 213, cat: PC/Games, desc: "Игры 2006 года"} + - {id: 214, cat: PC/Games, desc: "Игры 2005 года"} + - {id: 215, cat: PC/Games, desc: "Игры 2004 года"} + - {id: 216, cat: PC/Games, desc: "Игры 2003 года"} + - {id: 217, cat: PC/Games, desc: "Игры 2002 года"} + - {id: 218, cat: PC/Games, desc: "Игры 2001 года"} + - {id: 219, cat: PC/Games, desc: "Игры 2000 года"} + - {id: 220, cat: PC/Games, desc: "Игры 1999 года"} + - {id: 221, cat: PC/Games, desc: "Игры 1998 года"} + - {id: 222, cat: PC/Games, desc: "Игры 1997 года"} + - {id: 223, cat: PC/Games, desc: "Игры 1996 года"} + - {id: 224, cat: PC/Games, desc: "Игры 1995 года"} + - {id: 225, cat: PC/Games, desc: "Игры 1994 года"} + - {id: 226, cat: PC/Games, desc: "Игры 1993 года"} + - {id: 227, cat: PC/Games, desc: "Игры 1992 года"} + - {id: 228, cat: PC/Games, desc: "Игры 1991 года"} + - {id: 229, cat: PC/Games, desc: "Игры 1990 года"} + - {id: 231, cat: PC/Games, desc: "Дополнения"} + - {id: 250, cat: PC/Games, desc: "Модификации"} + - {id: 23, cat: PC/Games, desc: "Ранний Доступ"} + - {id: 246, cat: PC/Games, desc: "Обновление"} + - {id: 230, cat: PC/Games, desc: "Все Топ игры"} + - {id: 329, cat: PC/Games, desc: "Актуальные Топ игры"} + - {id: 24, cat: PC/Games, desc: "Новинка"} + - {id: 194, cat: PC/Games, desc: "Игры по сети"} + + modes: + search: [q] + +settings: [] + +download: + selectors: + - selector: a.itemdown_games + attribute: href + +search: + # keywords (article titles only search) + # do=search&subaction=search&story=five+freddy&titleonly=3&searchdate=0&sortby=date&resorder=desc&catlist[]=1&catlist[]=2&catlist[]=3 + # keywordless (article body search) query=game + # do=search&subaction=search&story=game&titleonly=0&searchdate=0&sortby=date&resorder=desc&catlist[]=0 + paths: + - path: index.php + inputs: + $raw: "{{ range .Categories }}catlist[]={{.}}&{{end}}" + do: search + subaction: search + search_start: 0 + full_search: 1 + result_from: 1 + showposts: 1 + # 0 article, 1 comments, 2 static pages, 3 article titles + titleonly: "{{ if .Keywords }}3{{ else }}0{{ end }}" + searchdate: 0 + story: "{{ if .Keywords }}{{ .Keywords }}{{ else }}game{{ end }}" + sortby: date + resorder: desc + + rows: + # results without sizes are just pre-release announcements + selector: div.short_search:has(div.shor_subtitles span:nth-child(2):contains(" ")) + + fields: + category: + text: 1 + year: + selector: div.shor_subtitles span + filters: + - name: regexp + args: (\d+) + title: + selector: div.short_titles > a + filters: + - name: append + args: " [{{ .Result.year }}]" + details: + selector: div.short_titles > a + attribute: href + download: + selector: div.short_titles > a + attribute: href + poster: + selector: img + attribute: src + date: + selector: img + attribute: src + filters: + - name: regexp + args: ".*/(\\d{4}-\\d{2})/.*" + - name: dateparse + args: "yyyy-MM" + seeders: + text: 1 + leechers: + text: 1 + size_rus: + selector: div.shor_subtitles span:nth-child(2):contains("Б") + optional: true + default: "0 B" + filters: + - name: replace + args: ["ТБ", "TB"] + - name: replace + args: ["ГБ", "GB"] + - name: replace + args: ["МБ", "MB"] + - name: replace + args: ["КБ", "KB"] + size: + selector: div.shor_subtitles span:nth-child(2):contains("B") + optional: true + default: "{{ .Result.size_rus }}" + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/carpathians.yml b/config/prowlarr/Definitions/carpathians.yml new file mode 100644 index 0000000..eb2137e --- /dev/null +++ b/config/prowlarr/Definitions/carpathians.yml @@ -0,0 +1,167 @@ +--- +id: carpathians +name: Carpathians +description: "Carpathians is a HUNGARIAN Private Torrent Tracker for 0DAY / GENERAL" +language: hu-HU +type: private +encoding: UTF-8 +links: + - https://mycarpathians.net/ + +caps: + categorymappings: + - {id: 186, cat: Books/EBook, desc: "E-book"} + - {id: 199, cat: Movies/SD, desc: "Film/Bluray/Hun"} + - {id: 194, cat: Movies/SD, desc: "Film/CAM"} + - {id: 60, cat: Movies/DVD, desc: "Film/DVD-R/Eng"} + - {id: 10, cat: Movies/DVD, desc: "Film/DVD-R/Hun"} + - {id: 20, cat: Movies/DVD, desc: "Film/DVD9/Hun"} + - {id: 181, cat: Movies/HD, desc: "Film/HD/Eng"} + - {id: 183, cat: Movies/HD, desc: "Film/HD/Hun"} + - {id: 200, cat: Movies/UHD, desc: "Film/UHD/Hun"} + - {id: 192, cat: Movies/HD, desc: "Film/x264/Eng"} + - {id: 190, cat: Movies/HD, desc: "Film/x264/Hun"} + - {id: 70, cat: Movies/SD, desc: "Film/XviD/Eng"} + - {id: 30, cat: Movies/SD, desc: "Film/XviD/Hun"} + - {id: 150, cat: Console, desc: "Játék/Konzol"} + - {id: 130, cat: PC/Games, desc: "Játék/PC"} + - {id: 182, cat: Audio/Lossless, desc: "Lossless"} + - {id: 90, cat: Audio/MP3, desc: "Mp3/Eng"} + - {id: 50, cat: Audio/MP3, desc: "Mp3/Hun"} + - {id: 100, cat: Audio/Video, desc: "Music-Video"} + - {id: 180, cat: PC/Mobile-Other, desc: "Program/Mobil"} + - {id: 170, cat: PC/0day, desc: "Program/PC"} + - {id: 80, cat: TV, desc: "Sorozat/Eng"} + - {id: 40, cat: TV, desc: "Sorozat/Hun"} + - {id: 110, cat: XXX, desc: "XXX"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: sort + type: select + label: Sort requested from site + default: 5 + options: + 5: created + 8: seeders + 6: size + 2: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + test: + path: index.php + selector: a[href^="logout.php"] + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}https://www.imdb.com/title/{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" # for dashboard imdbid search + # 0 both, 1 only active, 2 only dead + incldead: 0 + onlyname: 1 + onlyname2: true + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + # can search by genre but you need the id. &imdbcat=1 for Akció. + + rows: + selector: table[id!="torrent_ajanlo"] > tbody > tr[id] + + fields: + download: + selector: a[href^="download.php/"] + attribute: href + title: + selector: a[id][href^="details.php?"] + attribute: title + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + details: + selector: a[id][href^="details.php?"] + attribute: href + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + poster: + selector: a[rel^="prettyPhoto["] + attribute: href + genre: + selector: font.line + filters: + - name: validate + args: "Akció, Animáció, Beszélgetős, Családi, Dokumentum, Dráma, Életrajzi, Fantasztikus, Film-Noir, Game-Show, Háborús, Horror, Kaland, Krimi, Misztikus, Musical, News, Reality-TV, Romantikus, Rövidfilm, Sci-Fi, Sport, Thriller, Történelmi, Vígjáték, Western, Zene" + description: + text: "{{ .Result.genre }}" + files: + selector: td:nth-child(4) + size: + selector: td:nth-child(6) + grabs: + selector: td:nth-child(7) + seeders: + selector: td:nth-child(8) + leechers: + selector: td:nth-child(9) + date: + selector: font.line + filters: + - name: split + args: ["|", 0] + - name: replace + args: ["Feltöltve: ", ""] + - name: replace + args: ["Feltöltve : ", ""] + - name: replace + args: ["perce", "minute"] + - name: replace + args: ["órája", "hour"] + - name: replace + args: ["napja", "day"] + - name: replace + args: ["hete", "week"] + - name: replace + args: ["éve", "year"] + - name: timeago + downloadvolumefactor: + text: 0 + uploadvolumefactor: + case: + img[src="pic/double.png"]: 2 + img[src="pic/doubledouble2.png"]: 4 + "*": 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# TBDev & XBTT diff --git a/config/prowlarr/Definitions/carphunter.yml b/config/prowlarr/Definitions/carphunter.yml new file mode 100644 index 0000000..bfa03a8 --- /dev/null +++ b/config/prowlarr/Definitions/carphunter.yml @@ -0,0 +1,184 @@ +--- +id: carphunter +name: Carp-Hunter +description: "Carp-Hunter is a HUNGARIAN Private Torrent Tracker for MOVIES / TV / GENERAL" +language: hu-HU +type: private +encoding: UTF-8 +requestDelay: 2 +links: + - https://carp-hunter.hu/ + +caps: + categorymappings: + - {id: 1, cat: Movies/SD, desc: "Film/Cam/Eng", default: true} + - {id: 2, cat: Movies/SD, desc: "Film/Cam/Hun", default: true} + - {id: 8, cat: Movies/DVD, desc: "Film/DVD/Eng", default: true} + - {id: 7, cat: Movies/DVD, desc: "Film/DVD/Hun", default: true} + - {id: 16, cat: Movies/HD, desc: "Film/HD1080P/Eng", default: true} + - {id: 15, cat: Movies/HD, desc: "Film/HD1080P/Hun", default: true} + - {id: 14, cat: Movies/HD, desc: "Film/HD720P/Eng", default: true} + - {id: 13, cat: Movies/HD, desc: "Film/HD720P/Hun", default: true} + - {id: 4, cat: Movies/SD, desc: "Film/SD/Eng", default: true} + - {id: 3, cat: Movies/SD, desc: "Film/SD/Hun", default: true} + - {id: 18, cat: Movies/UHD, desc: "Film/UHD/Eng", default: true} + - {id: 17, cat: Movies/UHD, desc: "Film/UHD/Hun", default: true} + - {id: 23, cat: Audio/Audiobook, desc: "Hangosköny", default: true} + - {id: 19, cat: PC/Games, desc: "Játék/ISO", default: true} + - {id: 20, cat: PC/Games, desc: "Játék/RIP", default: true} + - {id: 24, cat: Other, desc: "Képek", default: true} + - {id: 21, cat: Books, desc: "Könyv/Eng", default: true} + - {id: 22, cat: Books, desc: "Könyv/Hun", default: true} + - {id: 35, cat: TV/Anime, desc: "Mese/Eng", default: true} + - {id: 36, cat: TV/Anime, desc: "Mese/Hun", default: true} + - {id: 25, cat: PC/Mobile-Other, desc: "Mobil", default: true} + - {id: 30, cat: PC/ISO, desc: "Programok/ISO", default: true} + - {id: 31, cat: PC/0day, desc: "Programok/RIP", default: true} + - {id: 33, cat: TV, desc: "Sorozat/Eng", default: true} + - {id: 32, cat: TV, desc: "Sorozat/Hun", default: true} + - {id: 29, cat: Audio/Lossless, desc: "Zene/FLAC/Eng", default: true} + - {id: 28, cat: Audio/Lossless, desc: "Zene/FLAC/Hun", default: true} + - {id: 27, cat: Audio/MP3, desc: "Zene/MP3/Eng", default: true} + - {id: 26, cat: Audio/MP3, desc: "Zene/MP3/Hun", default: true} + - {id: 34, cat: XXX, desc: "XXX/Filmek", default: false} + - {id: 39, cat: XXX/ImageSet, desc: "XXX/Képek", default: false} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: index.php + selector: a[href^="logout.php"] + +search: + paths: + - path: browse.php + categories: [1, 2, 8, 7, 16, 15, 14, 13, 4, 3, 18, 17, 23, 19, 20, 24, 21, 22, 35, 36, 25, 30, 31, 33, 32, 29, 28, 27, 26] + - path: browse.php + categories: [34, 39] + inputs: + xxx: 1 + keywordsfilters: + # the site uses % for wildcard + - name: re_replace + args: ["[^a-zA-Z0-9]+", "%"] + inputs: + $raw: "{{ range .Categories }}cat[]={{.}}&{{end}}" + search: "{{ .Keywords }}" + # 0 both, 1 onlyactive, 2 onlydead, 3 onlyfree, 4 x2 torrents, 5 mytorrents, 6 waiting for seeds + incldead: "{{ if .Config.freeleech }}3{{ else }}0{{ end }}" + sort: "{{ .Config.sort }}" + order: "{{ .Config.type }}" + # does not support imdbid searches + # can support genre searching but you need to know the id, eg &genre2=1 for Comedy (id is 2) + + rows: + selector: "table[cellpadding=\"3\"][style=\"width: 920px;\"] > tbody > tr:has(a[href^=\"browse.php?cat=\"])" + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href*="/details.php?id="] + attribute: title + details: + selector: a[href*="/details.php?id="] + attribute: href + download: + selector: a[href*="/details.php?id="] + attribute: href + filters: + - name: replace + args: ["/details", "/download"] + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + genre: + selector: small[title] + attribute: title + description: + case: + img[src="/pic/yes.png"]: "Verified: {{ .Result.genre }}" + img[src="/pic/nincs.png"]: "Unverified: {{ .Result.genre }}" + poster: + selector: a[onmouseover] + attribute: onmouseover + filters: + - name: regexp + args: "showTorrentThumb\\('(.*?)', " + date: + selector: td:nth-last-child(8) + filters: + - name: regexp + args: (\d{4}-\d{2}-\d{2}.\d{2}:\d{2}:\d{2}) + - name: replace + args: ["\u00a0", " "] + - name: append + args: " +01:00" # CET + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + files: + selector: td:nth-last-child(7) + size: + selector: td:nth-last-child(5) + grabs: + selector: td:nth-last-child(4) + seeders: + selector: td:nth-last-child(3) + leechers: + selector: td:nth-last-child(2) + downloadvolumefactor: + case: + font:contains("x0"): 0 + "*": 1 + uploadvolumefactor: + case: + font:contains("x2"): 2 + font:contains("x4"): 4 + "*": 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# engine n/a diff --git a/config/prowlarr/Definitions/carpt.yml b/config/prowlarr/Definitions/carpt.yml new file mode 100644 index 0000000..a1a6dc4 --- /dev/null +++ b/config/prowlarr/Definitions/carpt.yml @@ -0,0 +1,192 @@ +--- +id: carpt +name: CarPT +description: "CarPT is a CHINESE Private Torrent Tracker for HD MOVIES / TV" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://carpt.net/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "Movies/电影"} + - {id: 402, cat: TV, desc: "TV Series/连续剧"} + - {id: 403, cat: TV/Anime, desc: "Animations/动漫"} + - {id: 404, cat: TV/Documentary, desc: "Documentaries/纪录片"} + - {id: 405, cat: TV, desc: "TV Shows/综艺"} + - {id: 406, cat: Audio, desc: "Music/音乐"} + - {id: 407, cat: Other, desc: "Misc/其他"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: 2facode + type: text + label: 2FA code + - name: info_2fa + type: info + label: "About 2FA code" + default: "Only fill in the 2FA code box if you have enabled 2FA on the CarPT Web Site. Otherwise just leave it empty." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + secret: "" + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + two_step_code: "{{ .Config.2facode }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("失败")) + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl + search_area: "{{ if .Query.IMDBID }}4{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(a[href^="details.php?id="]) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: img[data-src] + attribute: data-src + imdbid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="imdb.com/title/tt"] + attribute: href + doubanid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="movie.douban.com/subject/"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-child(5) + seeders: + selector: td.rowfollow:nth-child(6) + leechers: + selector: td.rowfollow:nth-child(7) + grabs: + selector: td.rowfollow:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 1 day (as seconds = 24 x 60 x 60) + text: 86400 + description: + selector: td.rowfollow:nth-child(2) + remove: a, b, font, img, span +# NexusPHP v1.8.8 2023-09-25 diff --git a/config/prowlarr/Definitions/cartoonchaos.yml b/config/prowlarr/Definitions/cartoonchaos.yml new file mode 100644 index 0000000..6c2a6b7 --- /dev/null +++ b/config/prowlarr/Definitions/cartoonchaos.yml @@ -0,0 +1,196 @@ +--- +id: cartoonchaos +name: CartoonChaos +description: "CartoonChaos (CC) is a Private Torrent Tracker for ANIMATED MOVIES / TV" +language: en-US +type: private +encoding: UTF-8 +links: + - http://www.cartoonchaos.org/ # site does not support https NET::ERR_CERT_AUTHORITY_INVALID + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + - name: info_results + type: info + label: "Search results" + default: "Only the xBtit_Default style is supported with this indexer.
For best results, increase the torrents number in your profile to 100.
Default is 15." + - name: sort + type: select + label: Sort requested from site + default: 3 + options: + 3: created + 5: seeders + 4: size + 2: title + - name: type + type: select + label: Order requested from site + default: 2 + options: + 2: desc + 1: asc + +caps: + categorymappings: + - {id: 30, cat: TV, desc: "Complete Sets"} + - {id: 15, cat: TV, desc: "Educational"} + - {id: 16, cat: TV, desc: "Kids"} + - {id: 17, cat: TV, desc: "Mature Cartoons"} + - {id: 41, cat: TV, desc: "Shorts"} + - {id: 20, cat: TV/Anime, desc: "Anime Movies"} + - {id: 21, cat: TV/Anime, desc: "Anime Series"} + - {id: 26, cat: Movies, desc: "Animated Movies"} + - {id: 23, cat: Audio, desc: "Sound Tracks"} + - {id: 24, cat: Audio, desc: "Theme Tunes"} + - {id: 43, cat: Audio/Other, desc: "Misc Audio"} + - {id: 14, cat: TV, desc: "Banned"} + - {id: 29, cat: TV, desc: "Public Domain"} + - {id: 42, cat: TV/Foreign, desc: "Foreign Language"} + - {id: 28, cat: TV, desc: "Animated Adverts"} + - {id: 45, cat: TV/Documentary, desc: "Documentaries"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + +login: + path: index.php?page=login + method: form + form: form[action^="index.php?page=login"] + inputs: + uid: "{{ .Config.username }}" + pwd: "{{ .Config.password }}" + error: + - selector: tr td span[style="color:#FF0000;"] + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + # http://www.cartoonchaos.org/index.php?page=torrents&search=transformers&category=30;21;20;26;15;16;17&options=0&active=0 + - path: index.php + keywordsfilters: + # if searching for season packs switch S01 to season 1 #11775 + - name: re_replace + args: ["(?i)(S0)(\\d{1,2})$", "season $2"] + - name: re_replace + args: ["(?i)(S)(\\d{1,3})$", "season $2"] + inputs: + page: torrents + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + category: "{{ if .Categories }}{{ range .Categories }}{{.}};{{end}}{{ else }}0{{ end }}" + # 0=title, 1=title&descr, 2=descr + options: "{{ if .Query.IMDBID }}2{{ else }}0{{ end }}" + # 0 all, 1 activeonly, 2 deadonly + active: 0 + order: "{{ .Config.sort }}" + by: "{{ .Config.type }}" + + rows: + selector: "table.lista tr td table.lista tr:has(a[href^=\"index.php?page=torrent-details\"]):not(:has(a[href=\"index.php?page=torrents&category=0\"])){{ if .Config.freeleech }}:has(img[src=\"gold/gold.gif\"]){{ else }}{{ end }}" + + fields: + title_torrent: + selector: a[href^="download.php?id="] + attribute: href + filters: + - name: querystring + args: f + - name: htmldecode + - name: re_replace + args: ["(?i)\\.torrent$", ""] + title_text: + selector: td a[href^="index.php?page=torrent-details"] + category: + selector: td a[href^="index.php?page=torrents&category="] + attribute: href + filters: + - name: querystring + args: category + title: + text: "{{ if .Result.title_torrent }}{{ .Result.title_torrent }}{{ else }}{{ .Result.title_text }}{{ end }}" + filters: + # #11775 + - name: re_replace # Seasons X-Y --> S0X-S0Y + args: ["(?i)\\bSeasons?[-.\\s]*(\\d)[-.\\s]*(?:-|to)[-.\\s]*(\\d)\\b", "S0$1-S0$2"] + - name: re_replace # Seasons X-YY --> S0X-SYY + args: ["(?i)\\bSeasons?[-.\\s]*(\\d)[-.\\s]*(?:-|to)[-.\\s]*(\\d+)\\b", "S0$1-S$2"] + - name: re_replace # Seasons XX-YY --> SXX-SYY + args: ["(?i)\\bSeasons?[-.\\s]*(\\d+)[-.\\s]*(?:-|to)[-.\\s]*(\\d+)\\b", "S$1-S$2"] + - name: re_replace # Season X --> S0X + args: ["(?i)\\bSeasons?[-.\\s]*(\\d)\\b", "S0$1"] + - name: re_replace # Season XX --> SXX + args: ["(?i)\\bSeasons?[-.\\s]*(\\d+)\\b", "S$1"] + details: + selector: td a[href^="index.php?page=torrent-details"] + attribute: href + download: + selector: td a[href^="download.php"] + attribute: href + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + filters: + # http://anonym.to?javascript:popdetails('http://www.imdb.com/title/tt0086817'); + - name: regexp + args: tt(\d+) + poster: + selector: td a[href^="index.php?page=torrent-details"]:not(a[onmouseover*="torrentimg/nocover.jpg"]) + attribute: onmouseover + filters: + - name: regexp + args: src=([^\s]+) + size: + selector: td:nth-child(10) + # two flavours of dates + date_day: + # Yesterday at 10:03:30 PM + selector: td:nth-child(5):contains("day") + # auto adjusted by site account profile + optional: true + filters: + - name: re_replace + args: ["[ ]at|[//\xa0\\s,]+", " "] + date_year: + # February 09, 2019, 06:35:08 AM + selector: td:nth-child(5):not(:contains("day")) + # auto adjusted by site account profile + optional: true + filters: + - name: re_replace + args: ["[//\xa0\\s,]+", " "] + - name: dateparse + args: "MMMM dd yyyy hh:mm:ss tt" + date: + text: "{{ if or .Result.date_day .Result.date_year }}{{ or .Result.date_day .Result.date_year }}{{ else }}now{{ end }}" + seeders: + selector: td:nth-child(6) + leechers: + selector: td:nth-child(7) + grabs: + selector: td:nth-child(8) + downloadvolumefactor: + case: + img[src="gold/gold.gif"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 7 day (as seconds = 7 x 24 x 60 x 60) + text: 604800 +# xbtit 2.0.0 diff --git a/config/prowlarr/Definitions/cathoderaytube.yml b/config/prowlarr/Definitions/cathoderaytube.yml new file mode 100644 index 0000000..0b75bbe --- /dev/null +++ b/config/prowlarr/Definitions/cathoderaytube.yml @@ -0,0 +1,172 @@ +--- +id: cathoderaytube +name: Cathode-Ray.Tube +description: "Cathode-Ray.Tube (CRT) is a Private Torrent Tracker for CLASSIC MOVIES / TV" +language: en-GB +type: private +encoding: UTF-8 +links: + - https://www.cathode-ray.tube/ + +caps: + categorymappings: + - {id: 13, cat: PC/Games, desc: "Games"} + - {id: 4, cat: Other, desc: "Misc"} + - {id: 1, cat: Movies, desc: "Movies"} + - {id: 2, cat: TV, desc: "TV"} + - {id: 3, cat: Other, desc: "WOC"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, genre] + movie-search: [q, imdbid, genre] + +settings: + - name: info_2fa + type: info + label: "About 2FA" + default: "If you want to enable 2FA then use the CRT2FA indexer instead." + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + - name: sort + type: select + label: Sort requested from site + default: time + options: + time: created + seeders: seeders + size: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: login + method: form + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + cinfo: "2550|1350|1.25|24|-60" + iplocked: 0 + keeploggedin: 1 + error: + - selector: div.error + test: + path: / + selector: "#nav_userinfo" + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}" + searchtext: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + order_by: "{{ .Config.sort }}" + order_way: "{{ .Config.type }}" + action: advanced + filter_freeleech: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + taglist: "{{ .Query.Genre }}" + + keywordsfilters: + - name: re_replace + args: ["(?i)\\bS0*(\\d+)\\b", "$1"] + - name: re_replace + args: ["(?i)\\bS0*(\\d+)E0*(\\d+)\\b", "$1"] + + rows: + selector: table#torrent_table > tbody > tr[class^="torrent row"]:has(a[href*="action=download"]) + + fields: + category: + selector: a[href^="/torrents.php?filter_cat"] + attribute: href + filters: + - name: regexp + args: \[(\d+)\] + title: + selector: a[href^="/torrents.php?id="] + filters: + - name: re_replace # Seasons X-Y --> S0X-S0Y + args: ["(?i)\\bSeasons?\\s*(\\d)\\s*-\\s*(\\d)\\b", "S0$1-S0$2"] + - name: re_replace # Seasons X-YY --> S0X-SYY + args: ["(?i)\\bSeasons?\\s*(\\d)\\s*-\\s*(\\d+)\\b", "S0$1-S$2"] + - name: re_replace # Seasons XX-YY --> SXX-SYY + args: ["(?i)\\bSeasons?\\s*(\\d+)\\s*-\\s*(\\d+)\\b", "S$1-S$2"] + - name: re_replace # Season X --> S0X + args: ["(?i)\\bSeasons?\\s*(\\d)\\b", "S0$1"] + - name: re_replace # Season XX --> SXX + args: ["(?i)\\bSeasons?\\s*(\\d+)\\b", "S$1"] + - name: re_replace + args: ["(?i)\\bComplete\\s+Series\\b", ""] + details: + selector: a[href^="/torrents.php?id="] + attribute: href + download: + selector: a[href^="torrents.php?action=download&id="] + attribute: href + genre: + selector: div.tags + filters: + - name: validate + args: "Action, Adventure, Animation, Comedy, Crime, Documentary, Drama, Family, Fantasy, History, Horror, Kids, Music, Mystery, News, Reality, Romance, SciFi, Soap, Talk, Thriller, War, Western" + description_tags: + selector: div.tags + description: + case: + span.icon_okay: "Verified: {{ .Result.description_tags }}" + "*": "Unverified: {{ .Result.description_tags }}" + poster: + selector: td:nth-child(2) > script + filters: + - name: regexp + args: "src=\\\\\"(.*?)\\\\\"" + - name: re_replace + args: ["\\\\(.)", "$1"] + - name: replace + args: ["/static/styles/modern/crt.png", ""] + files: + selector: td:nth-child(3) + date: + selector: td:nth-child(5) > span + attribute: title + # auto adjusted by site account profile + filters: + - name: dateparse + args: "MMM dd yyyy, HH:mm" + size: + selector: td:nth-child(6) + grabs: + selector: td:nth-child(7) + seeders: + selector: td:nth-child(8) + leechers: + selector: td:nth-child(9) + downloadvolumefactor: + case: + span.icon[title*="Freeleech"]: 0 + "img[alt=\"Freeleech\"]": 0 + "*": 1 + uploadvolumefactor: + case: + span.icon[title*="DoubleSeed"]: 2 + "img[alt=\"DoubleSeed\"]": 2 + "*": 1 + minimumratio: + text: 1.0 +# Luminance diff --git a/config/prowlarr/Definitions/catorrent.yml b/config/prowlarr/Definitions/catorrent.yml new file mode 100644 index 0000000..75295fd --- /dev/null +++ b/config/prowlarr/Definitions/catorrent.yml @@ -0,0 +1,108 @@ +--- +id: catorrent +name: Catorrent +description: "Catorrent is a RUSSIAN Semi-Private Torrent Tracker for GAMES" +language: ru-RU +type: semi-private +encoding: UTF-8 +links: + - https://catorrent.org/ + +caps: + categorymappings: + - {id: PC, cat: PC/Games, desc: "PC"} + - {id: PS1, cat: Console/Other, desc: "Playstation 1"} + - {id: PS2, cat: Console/Other, desc: "Playstation 2"} + - {id: PS3, cat: Console/PS3, desc: "Playstation 3"} + - {id: PS4, cat: Console/PS4, desc: "Playstation 4"} + - {id: PS5, cat: Console/Other, desc: "Playstation 5"} + - {id: SWITCH, cat: Console/Other, desc: "Nintendo Switch"} + - {id: PSP, cat: Console/PSP, desc: "Playstation (portable) PSP"} + - {id: PSVITA, cat: Console/PS Vita, desc: "Playstation Vita"} + - {id: XONE, cat: Console/XBox One, desc: "Xbox ONE"} + - {id: X360, cat: Console/XBox 360, desc: "Xbox 360"} + - {id: WIIU, cat: Console/WiiU, desc: "Nintendo WIIU"} + - {id: WII, cat: Console/Wii, desc: "Nintendo WII"} + - {id: 3DS, cat: Console/3DS, desc: "Nintendo 3DS"} + - {id: NDS, cat: Console/NDS, desc: "Nintendo DS"} + - {id: N64, cat: Console/Other, desc: "Nintendo 64"} + - {id: NGC, cat: Console/Other, desc: "Nintendo Game Cube"} + - {id: DREAMCAST, cat: Console/Other, desc: "Dreamcast"} + - {id: SAT, cat: Console/Other, desc: "Sega Saturn"} + + modes: + search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + +login: + path: index.php + method: form + form: form[action=""] + inputs: + login_name: "{{ .Config.username }}" + login_password: "{{ .Config.password }}" + login_not_save: "" + login: submit + error: + - selector: div.berrors + test: + path: / + selector: a[href$="/index.php?action=logout"] + +download: + selectors: + - selector: a[href*="/index.php?do=download&id="] + attribute: href + +search: + # https://catorrent.org/index.php?do=search&subaction=search&story=lovelot + paths: + - path: index.php + inputs: + do: search + subaction: search + search_start: 0 + result_from: 1 + story: "{{ if .Keywords }}{{ .Keywords }}{{ else }}{{ .Today.Year }}{{ end }}" + + rows: + selector: div.short_game_search + + fields: + category: + selector: div.icon_default + title: + selector: div.short_game_title + details: + selector: a[href$=".html"] + attribute: href + download: + selector: a[href$=".html"] + attribute: href + poster: + selector: img + attribute: src + genre: + selector: div.short_game_genre + description: + text: "{{ .Result.genre }}" + date: + text: now + seeders: + text: 1 + leechers: + text: 1 + size: + text: "512 MB" + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/centraltorrent.yml b/config/prowlarr/Definitions/centraltorrent.yml new file mode 100644 index 0000000..ae60de4 --- /dev/null +++ b/config/prowlarr/Definitions/centraltorrent.yml @@ -0,0 +1,159 @@ +--- +id: centraltorrent +name: Central Torrent +description: "Central Torrent is a POLISH Private Torrent Tracker for MOVIES / MUSIC" +language: pl-PL +type: private +encoding: ISO-8859-2 +links: + - http://central-torrent.eu/ # site does not support https NET::ERR_CERT_AUTHORITY_INVALID + +caps: + categorymappings: + - {id: 23, cat: TV/Anime, desc: "Animowane"} + - {id: 1, cat: PC, desc: "Aplikacje"} + - {id: 26, cat: Movies, desc: "Dzieci/Bajki"} + - {id: 29, cat: Books/EBook, desc: "E-books"} + - {id: 20, cat: Movies/SD, desc: "Filmy/DVD"} + - {id: 22, cat: Movies/SD, desc: "Filmy/RMVB"} + - {id: 35, cat: Movies/UHD, desc: "Filmy/UHD"} + - {id: 24, cat: Movies/HD, desc: "Filmy/x264"} + - {id: 36, cat: Movies/HD, desc: "Filmy/x265"} + - {id: 19, cat: Movies/SD, desc: "Filmy/XviD"} + - {id: 21, cat: Movies/SD, desc: "Filmy/XviD PL"} + - {id: 12, cat: PC/Games, desc: "Gry"} + - {id: 17, cat: PC/Games, desc: "Gry/Konsole"} + - {id: 4, cat: PC/Games, desc: "Gry/PC ISO"} + - {id: 28, cat: Other, desc: "GSM/PDA"} + - {id: 32, cat: Movies/BluRay, desc: "HD/Blu-ray"} + - {id: 31, cat: Audio/Lossless, desc: "Music/Lossless"} + - {id: 6, cat: Audio, desc: "Muzyka"} + - {id: 30, cat: Other, desc: "Rozne"} + - {id: 25, cat: TV/Sport, desc: "Sport"} + - {id: 27, cat: Audio/Video, desc: "Teledyski"} + - {id: 7, cat: TV, desc: "TV/Seriale"} + - {id: 9, cat: XXX, desc: "XXX"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + captcha: + type: image + selector: img.cimage + input: captcha + error: + - selector: td.embedded:has(h2:contains("failed")) + - selector: td.embedded:has(h2:contains("Error")) + - selector: form[action="takelogin.php"] + message: + text: "Login page detected at {{ .Config.sitelink }}." + test: + path: index.php + selector: a[href="/my.php"] + +download: + selectors: + - selector: a[href^="download.php/"] + attribute: href + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 active, 1 all, 2 dead, 3 freeleech + incldead: "{{ if .Config.freeleech }}3{{ else }}1{{ end }}" + # 0 all, 1 polish, 2 non-polish + polish: 0 + # 0 name + blah: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + + rows: + selector: table[onMouseover] > tbody > tr:has(a[href^="details.php?id="]) + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="details.php?id="] + attribute: href + files: + selector: td:nth-child(3) + date: + selector: td:nth-child(5) + # auto adjusted by site account profile + filters: + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss" + size: + selector: td:nth-child(7) + grabs: + selector: td:nth-child(8) + seeders: + selector: td:nth-child(9) + leechers: + selector: td:nth-child(10) + downloadvolumefactor: + case: + img[src="pic/freedownload.gif"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 +# tbsource diff --git a/config/prowlarr/Definitions/ceskeforum.yml b/config/prowlarr/Definitions/ceskeforum.yml new file mode 100644 index 0000000..1021276 --- /dev/null +++ b/config/prowlarr/Definitions/ceskeforum.yml @@ -0,0 +1,180 @@ +--- +id: ceskeforum +name: CeskeForum +description: "CeskeForum is a CZECH Private Torrent Tracker for MOVIES / TV / GENERAL" +language: cs-CZ +type: private +encoding: UTF-8 +links: + - https://t.ceskeforum.com/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "Filmy (Movies)"} + - {id: 403, cat: TV, desc: "TV pořady (TV Shows)"} + - {id: 404, cat: TV/Documentary, desc: "TV dokumenty (Documentaries)"} + - {id: 408, cat: TV, desc: "TV seriály - kompletní série (TV Series complete)"} + - {id: 402, cat: TV, desc: "TV seriály - jednotlivé díly (TV Series episodes)"} + - {id: 407, cat: TV/Sport, desc: "Sport"} + - {id: 411, cat: Books, desc: "Knihy (Books)"} + - {id: 413, cat: Audio/Audiobook, desc: "Knihy ve zvukové podobě (AudioBooks)"} + - {id: 406, cat: Audio, desc: "Hudba (Music)"} + - {id: 410, cat: PC, desc: "Software"} + - {id: 412, cat: PC/Games, desc: "Software - Hry (Games)"} + - {id: 409, cat: Other, desc: "Nezařazené (Misc)"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("Přihlášení selhalo!")) + message: + selector: td.text + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # 0=incldead, 1=active, 2=dead + incldead: 0 + # show promotions: 0=all, 1=normal, 2=free, 3=2x, 4=2xFree, 5=50%, 6=2x50%, 7=30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0=title, 1=descr, 3=uploader, 4=imdb URL + search_area: "{{ if .Query.IMDBID }}4{{ else }}0{{ end }}" + # 0=AND, 1=OR, 2=Exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + # can support genre searching but you need to know the id, eg &team10=1 for Drama (id is 10) + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +02:00" # EET + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +02:00" # EET + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-child(5) + seeders: + selector: td.rowfollow:nth-child(6) + leechers: + selector: td.rowfollow:nth-child(7) + grabs: + selector: td.rowfollow:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + description: + selector: td.rowfollow:nth-child(2) + remove: a, b, font, img, span + genre: + selector: table.torrentname > tbody > tr > td:first-child + remove: a + filters: + - name: validate + args: "Akční, Animovaný, Dobrodružný, Dokumentární, Drama, Fantasy, Horor, Komedie, Krimi, Pohádka, Rodinný, Romantický, Sci-Fi, Thriller, Válečný, Western" +# NexusPHP Standard v1.5 Beta 4 diff --git a/config/prowlarr/Definitions/chdbits.yml b/config/prowlarr/Definitions/chdbits.yml new file mode 100644 index 0000000..1f53f00 --- /dev/null +++ b/config/prowlarr/Definitions/chdbits.yml @@ -0,0 +1,172 @@ +--- +id: chdbits +name: CHDBits +description: "CHDBits is a CHINESE Private Torrent Tracker for HD MOVIES / TV" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://ptchdbits.co/ +legacylinks: + - https://chdbits.co/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "Movies"} + - {id: 404, cat: TV/Documentary, desc: "Documentaries"} + - {id: 405, cat: TV/Anime, desc: "Animations"} + - {id: 402, cat: TV, desc: "TV Series"} + - {id: 403, cat: TV, desc: "TV Shows"} + - {id: 406, cat: Audio/Video, desc: "Music Videos"} + - {id: 407, cat: TV/Sport, desc: "Sports"} + - {id: 409, cat: Other, desc: "Misc"} + - {id: 408, cat: Audio, desc: "HQ Audio"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("失败")) + - selector: td.embedded:has(h2:contains("failed")) + test: + path: torrents.php + selector: a[href*="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + incldead: 1 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl + search_area: "{{ if .Query.IMDBID }}4{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + size: + selector: td:nth-child(5) + grabs: + selector: td:nth-child(8) + seeders: + selector: td:nth-child(6) + leechers: + selector: td:nth-child(7) + date_elapsed: + # time type: time elapsed (default) + selector: td:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + description: + selector: td:nth-child(2) + remove: a, b, font, img, span +# NexusPHP 73f201530b 2023-08-07 diff --git a/config/prowlarr/Definitions/cheggit.yml b/config/prowlarr/Definitions/cheggit.yml new file mode 100644 index 0000000..dca75cc --- /dev/null +++ b/config/prowlarr/Definitions/cheggit.yml @@ -0,0 +1,165 @@ +--- +id: cheggit +name: cheggit +description: "cheggit is a Private site for 3X" +language: en-US +type: private +encoding: UTF-8 +links: + - https://www.cheggit.me/ + +caps: + categorymappings: + - {id: 1, cat: XXX, desc: "Amateur"} + - {id: 2, cat: XXX, desc: "Anal"} + - {id: 5, cat: XXX, desc: "Asian"} + - {id: 6, cat: XXX, desc: "BBW"} + - {id: 30, cat: XXX, desc: "BDSM"} + - {id: 36, cat: XXX, desc: "Big Ass"} + - {id: 8, cat: XXX, desc: "Big Tits"} + - {id: 7, cat: XXX, desc: "Black"} + - {id: 9, cat: XXX, desc: "Classic"} + - {id: 37, cat: XXX, desc: "Creampie"} + - {id: 10, cat: XXX, desc: "Cumshot"} + - {id: 11, cat: XXX, desc: "DVD-R"} + - {id: 12, cat: XXX, desc: "Fetish"} + - {id: 14, cat: XXX, desc: "Gang Bang / Orgy"} + - {id: 39, cat: XXX, desc: "Gay / Bi"} + - {id: 56, cat: XXX, desc: "Hairy"} + - {id: 35, cat: XXX, desc: "Hardcore"} + - {id: 44, cat: XXX, desc: "HD Porn"} + - {id: 3, cat: XXX, desc: "Hentai / 3D"} + - {id: 25, cat: XXX, desc: "Homemade"} + - {id: 43, cat: XXX, desc: "Interracial"} + - {id: 16, cat: XXX, desc: "Latina"} + - {id: 23, cat: XXX, desc: "Lesbian"} + - {id: 52, cat: XXX, desc: "Lingerie"} + - {id: 27, cat: XXX, desc: "Magazines"} + - {id: 53, cat: XXX, desc: "Manga / Comic"} + - {id: 18, cat: XXX, desc: "Masturbation"} + - {id: 26, cat: XXX, desc: "Mature"} + - {id: 40, cat: XXX, desc: "Megapack"} + - {id: 41, cat: XXX, desc: "Natural Tits"} + - {id: 17, cat: XXX, desc: "Oral"} + - {id: 29, cat: XXX, desc: "Other"} + - {id: 47, cat: XXX, desc: "Parody"} + - {id: 21, cat: XXX, desc: "Pictures / Images"} + - {id: 50, cat: XXX, desc: "Piss"} + - {id: 55, cat: XXX, desc: "Porn Music Videos"} + - {id: 46, cat: XXX, desc: "Pregnant / Preggo"} + - {id: 15, cat: XXX, desc: "Shemale / TS"} + - {id: 22, cat: XXX, desc: "Siterip"} + - {id: 20, cat: XXX, desc: "Softcore"} + - {id: 49, cat: XXX, desc: "Squirt"} + - {id: 34, cat: XXX, desc: "Straight"} + - {id: 19, cat: XXX, desc: "Teen"} + - {id: 45, cat: XXX, desc: "Voyeur"} + - {id: 13, cat: PC/Games, desc: "XXX Games / Apps"} + + modes: + search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: time + options: + time: created + seeders: seeders + size: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + keeplogged: 1 + error: + - selector: span.warning:contains(" was incorrect.") + test: + path: index.php + selector: a[href^="logout.php?auth="] + +search: + paths: + # https://www.cheggit.me/torrents.php?filter_cat[1]=1&order_by=time&order_way=desc&filter_freeleech=1&searchtext=&search_type=0&taglist=&tags_type=0 + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}" + order_by: "{{ .Config.sort }}" + order_way: "{{ .Config.type }}" + filter_freeleech: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + searchtext: "{{ .Keywords }}" + # 0=any, 1=all + search_type: 1 + + rows: + selector: table#torrent_table > tbody > tr:not(tr.colhead) + + fields: + category: + selector: a[href^="torrents.php?filter_cat"] + attribute: href + filters: + - name: regexp + args: \[(\d+)\] + title: + selector: a[href^="torrents.php?id="] + details: + selector: a[href^="torrents.php?id="] + attribute: href + download: + selector: a[href^="torrents.php?action=download"] + attribute: href + description: + selector: div.tags + files: + selector: td:nth-child(3) + date: + selector: span.time + attribute: title + filters: + - name: append + args: " +00:00" # auto adjusted by site account profile + - name: dateparse + args: "MMM dd yyyy, HH:mm zzz" + size: + selector: td:nth-child(6) + grabs: + selector: td:nth-child(7) + seeders: + selector: td:nth-child(8) + leechers: + selector: td:nth-child(9) + downloadvolumefactor: + case: + img[src$="/freedownload.gif"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 0.51 +# engine n/a diff --git a/config/prowlarr/Definitions/chilebt.yml b/config/prowlarr/Definitions/chilebt.yml new file mode 100644 index 0000000..dfabb6b --- /dev/null +++ b/config/prowlarr/Definitions/chilebt.yml @@ -0,0 +1,211 @@ +--- +id: chilebt +name: ChileBT +description: "ChileBT is a CHILEAN Private Torrent Tracker for MOVIES / TV / GENERAL" +language: es-CL +type: private +encoding: UTF-8 +links: + - https://chilebt.com/ + +caps: + categorymappings: + - {id: 10, cat: Movies, desc: "Movies"} + - {id: 11, cat: TV, desc: "TV"} + - {id: 9, cat: Audio, desc: "Music"} + - {id: 7, cat: Other, desc: "Cultura / Educativos"} + - {id: 8, cat: PC/Games, desc: "Juegos"} + - {id: 6, cat: Books, desc: "EBook"} + - {id: 4, cat: TV/Anime, desc: "Anime"} + - {id: 5, cat: PC/0day, desc: "Aplicaciones / Programas"} + - {id: 14, cat: Movies, desc: "Infantil"} + - {id: 12, cat: Other/Misc, desc: "VIP"} + - {id: 13, cat: XXX, desc: "XXX"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: login + method: form + form: form[action$="/login"] + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + remember: on + selectorinputs: + _token: + selector: input[name="_token"] + attribute: value + error: + - selector: script[nonce]:contains("Error") + message: + selector: script[nonce]:contains("Error") +# test: +# path: / +# selector: a[href$="/logout"] + +search: + paths: + - path: filterTorrents + inputs: + $raw: "{{ range .Categories }}categories[]={{.}}&{{end}}" + search: "{{ if .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" # for dashboard imdbid search + imdb: "{{ .Query.IMDBIDShort }}" + tvdb: "{{ .Query.TVDBID }}" + tmdb: "{{ .Query.TMDBID }}" + sorting: "{{ .Config.sort }}" + direction: "{{ .Config.type }}" + qty: 50 + page: 0 + view: list + freeleech: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + # can search by genre but need range support. &genres[]=Action&genres[]=Comedy for Action and Comedy + + rows: + selector: table > tbody > tr + + fields: + category: + selector: a[href*="/categories/"] + attribute: href + filters: + - name: regexp + args: "/categories/.*?\\.(\\d+)" + title: + selector: a.view-torrent + download: + selector: a[href*="/download/"] + attribute: href + details: + selector: a.view-torrent + attribute: href + poster: + selector: div.torrent-poster img + attribute: src + filters: + - name: prepend + args: "https://images.weserv.nl/?url=" # for display on dashboard + - name: append + args: "&w=180&h=270" # for display on dashboard + - name: replace + args: ["https://images.weserv.nl/?url=https://via.placeholder.com/600x900&w=180&h=270", ""] + genre: + selector: td:nth-last-child(6) + filters: + - name: replace + args: ["\n", ""] + - name: re_replace + args: ["(?i)(Science Fiction)", "Science_Fiction"] + - name: validate + args: "Action, Adventure, Animation, Biography, Comedy, Crime, Documentary, Drama, Family, Fantasy, Game-Show, History, Horror, Music, Musical, Mystery, News, Reality-TV, Romance, Science_Fiction, Sitcom, Sport, Talk-Show, Thriller, War, Western" + description: + text: "{{ .Result.genre }}" + size: + selector: td:nth-last-child(4) + seeders: + selector: td:nth-last-child(3) + leechers: + selector: td:nth-last-child(2) + grabs: + selector: td:nth-last-child(1) + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + tmdbid: + selector: a[href*="themoviedb.org/movie/"], a[href*="themoviedb.org/tv/"] + attribute: href + date: + selector: time + filters: + # translations for Turkish|Estonian|Danish|Italian|Polish|Norwegian|Portuguese|Czech|Russian|Romanian|Spanish|French|German|Bulgarian|Dutch|Chinese|Japanese|Swedish + - name: re_replace + args: ["(?i)(önce|tagasi|geleden|fa|temu|siden|há|atrás|nazpět|назад|acum|în urmă|hace|il y a|vor|преди|前|sedan)", " ago"] + - name: re_replace + args: ["(?i)(saniye|sekundit|sekunder|secondi|sekund|segundos|sekundami|секунд|secunde|secondes|Sekunden|секунди|seconden|秒前)", "seconds"] + - name: re_replace + args: ["(?i)(minutit|minutter|minuti|minuty|minutos|минуты|минут|Minuten|минути|minuten|minuter)", "minutes"] + - name: re_replace + args: ["(?i)(dakika|minut|minuto|minuta|minutt|минута|Minute|minuut|分钟|分)", " minute"] + - name: re_replace + args: ["(?i)(tundi|timer|ore|godziny|horas|hodiny|hoden|часа|часов|ore|heures|Stunden|timmar)", "hours"] + - name: re_replace + args: ["(?i)(saat|tund|time|ora|godzina|hora|hodina|час|oră|heure|Stunde|uur|小时|時間|timme)", " hour"] + - name: re_replace + args: ["(?i)(päeva|dage|giorni|dni|dias|dny|дня|дней|zile|días|jours|Tagen|дни|dagen|dagar)", "days"] + - name: re_replace + args: ["(?i)(gün|päev|dag|giorno|dzień|dia|den|день|zi|día|jour|Tag|ден|天|日)", " day"] + - name: re_replace + args: ["(?i)(nädalat|uger|settimane|tygodnie|uker|semanas|týdny|недели|недель|săptămâni|semaines|Wochen|седмици|weken|veckor)", "weeks"] + - name: re_replace + args: ["(?i)(hafta|nädal|uge|settimana|tydzień|uke|semana|týden|неделю|săptămână|semaine|Woche|седмица|周|週間|vecka)", " week"] + - name: re_replace + args: ["(?i) (ay)", "month"] + - name: re_replace + args: ["(?i)(kuud|måneder|mesi|miesiące|meses|měsíce|месяца|месяцев|luni|meses|mois|Monaten|месеца|maanden|månader)", "months"] + - name: re_replace + args: ["(?i)(kuu|måned|mese|miesiąc|mês|měsíc|месяц|lună|mes|Monat|месец|maand|个月|ヶ月|månad)", " month"] + - name: re_replace + args: ["(?i)(aastat|anni|lata|anos|roky|года|ani|años|ans|Jahren|години)", " years"] + - name: re_replace + args: ["(?i)(yil|aasta|år|anno|rok|ano|год|año|Jahr|година|jaar|年)", " year"] + - name: re_replace + args: ["(?i) (an)", "year"] + - name: re_replace + args: ["(?i)(För |und)", ""] # Misc removals + - name: timeago + downloadvolumefactor: + case: + i[class*="fa-id-badge text-orange"]: 0 # 24 Hour FreeLeech From BON Store + i[class*="fa-trophy text-purple"]: 0 # Special FreeLeech For Certain User Groups + i[class*="fa-star text-bold"]: 0 # Freeleech From Token + i[class*="fa-coins text-bold"]: 0 # Freeleech From Token + i[class*="fa-globe text-blue"]: 0 # Global Freeleech + i[class*="fa-star text-gold"]: 0 # Freeleech + i[class*="fa-certificate text-pink"]: 0 # Featured Torrent + "*": 1 + uploadvolumefactor: + case: + i[class*="fa-gem text-green"]: 2 # Single Torrent Double Upload + i[class*="fa-globe text-green"]: 2 # Global Double Upload + i[class*="fa-certificate text-pink"]: 2 # Featured Torrent + "*": 1 +# global MR is 0.5 but torrents must be seeded for 7 days regardless of ratio +# minimumratio: +# text: 0.5 + minimumseedtime: + # 7 day (as seconds = 7 x 24 x 60 x 60) + text: 604800 +# UNIT3D 1.9.3 diff --git a/config/prowlarr/Definitions/cinemageddon.yml b/config/prowlarr/Definitions/cinemageddon.yml new file mode 100644 index 0000000..ccd16e6 --- /dev/null +++ b/config/prowlarr/Definitions/cinemageddon.yml @@ -0,0 +1,120 @@ +--- +id: cinemageddon +name: Cinemageddon +description: "B-movie tracker" +language: en-US +type: private +encoding: UTF-8 +links: + - https://cinemageddon.net/ +legacylinks: + - http://cinemageddon.net/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Action"} + - {id: 2, cat: Movies, desc: "Horror"} + - {id: 3, cat: Movies, desc: "Martial Arts"} + - {id: 4, cat: Movies, desc: "Comedy"} + - {id: 5, cat: Movies, desc: "Other"} + - {id: 6, cat: Movies, desc: "Hidden Gems"} + - {id: 7, cat: Movies, desc: "Sci-Fi"} + - {id: 8, cat: Movies, desc: "Gore"} + - {id: 9, cat: Movies, desc: "Exploitation"} + - {id: 11, cat: Movies, desc: "OST"} + - {id: 12, cat: Movies, desc: "XXX"} + - {id: 13, cat: Movies, desc: "Thriller"} + - {id: 14, cat: Movies, desc: "Adventure"} + - {id: 15, cat: Movies, desc: "Documentary"} + - {id: 16, cat: Movies, desc: "Western"} + - {id: 17, cat: Movies, desc: "Family"} + - {id: 18, cat: Movies, desc: "Drama"} + - {id: 19, cat: Movies, desc: "Ebooks"} + - {id: 20, cat: Movies, desc: "Softcore"} + - {id: 21, cat: Movies, desc: "Tinfoil Hat"} + - {id: 22, cat: Movies, desc: "Trailers"} + + modes: + search: [q] + movie-search: [q, imdbid] + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: table:contains("Login failed!") + test: + path: index.php + selector: a[href$="/logout.php"] + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + + rows: + selector: table.torrenttable > tbody > tr:has(a[href*="browse.php?cat="]) + + fields: + category: + selector: a[href*="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href*="details.php?id="] + details: + selector: a[href*="details.php?id="] + attribute: href + download: + selector: a[href*="download.php?id="] + attribute: href + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + date: + selector: td:nth-child(4) + filters: + - name: append + args: " -07:00" # PDT + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + size: + selector: td:nth-child(5) + filters: + - name: regexp + args: (\d+.*(MB|GB)+) + files: + selector: td:nth-child(5) + filters: + - name: regexp + args: (\d+)\s+file + grabs: + selector: td:nth-child(6) + seeders: + selector: td:nth-child(7) + leechers: + selector: td:nth-child(8) + downloadvolumefactor: + case: + img[src$="/golden10.gif"]: 0 # freeleech + img[src$="/golden1.gif"]: 0.9 # grey coin possibly 10% discount + img[src$="/golden2.gif"]: 0.8 # bronze coin 20% discount + img[src$="/golden3.gif"]: 0.7 # siver coin 30% discount + img[src$="/golden4.gif"]: 0.6 # gold coin 40% discount + "*": 1 + uploadvolumefactor: + case: + img[src$="/golden10.gif"]: 2 # freeleech 2x bonus + img[src$="/golden1.gif"]: 1.1 # gray coin possibly 10% bonus + img[src$="/golden2.gif"]: 1.2 # bronze coin 20% bonus + img[src$="/golden3.gif"]: 1.3 # silver coin 30% bonus + img[src$="/golden4.gif"]: 1.4 # gold coin 40% bonus + "*": 1 +# engine n/a diff --git a/config/prowlarr/Definitions/cinemamovies.yml b/config/prowlarr/Definitions/cinemamovies.yml new file mode 100644 index 0000000..7cd98f8 --- /dev/null +++ b/config/prowlarr/Definitions/cinemamovies.yml @@ -0,0 +1,195 @@ +--- +id: cinemamovies +name: CinemaMovieS_ZT +description: "CinemaMovieS_ZT is a POLISH Private Torrent Tracker for MOVIES / TV / GENERAL" +language: pl-PL +type: private +encoding: ISO-8859-2 +links: + - https://cinemamovies.pl/ + +caps: + categorymappings: + - {id: 3, cat: Movies/BluRay, desc: "Filmy BD25/50_5/9"} + - {id: 5, cat: Movies/3D, desc: "Filmy 3D"} + - {id: 6, cat: Movies/DVD, desc: "Filmy DVD5/9"} + - {id: 8, cat: Movies/HD, desc: "Filmy HD"} + - {id: 11, cat: Movies/SD, desc: "Filmy SD"} + - {id: 12, cat: Movies/Other, desc: "Filmy Inne"} + - {id: 32, cat: Movies/UHD, desc: "Filmy UHD 4K"} + - {id: 33, cat: TV/UHD, desc: "TV UHD"} + - {id: 2, cat: TV/Anime, desc: "Bajki/Anime"} + - {id: 10, cat: TV/Documentary, desc: "TV Dokumentalne"} + - {id: 20, cat: TV, desc: "TV Paczki"} + - {id: 22, cat: TV/Sport, desc: "TV Sport"} + - {id: 24, cat: TV/HD, desc: "TV HD"} + - {id: 25, cat: TV/SD, desc: "TV SD"} + - {id: 1, cat: PC, desc: "Aplikacje"} + - {id: 15, cat: PC/Games, desc: "Gry"} + - {id: 16, cat: PC/Mobile-Other, desc: "Mobile"} + - {id: 17, cat: Other, desc: "Inne"} + - {id: 19, cat: Audio, desc: "Muzyka"} + - {id: 21, cat: Books, desc: "Book"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: drop_polish_prefix + type: checkbox + label: Drop the Polish title prefix + default: false + - name: multilang + type: checkbox + label: Replace MULTi by another language in release name + default: false + - name: multilanguage + type: select + label: Replace MULTi by this language + default: POLISH + options: + POLISH: POLISH + MULTi POLISH: MULTi POLISH + - name: sort + type: select + label: Sort requested from site + default: 2 + options: + 2: created + 5: seeders + 3: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: index.php + selector: a[href^="/logout.php"] + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # 0 active, 1 all, 4 requests, 5 onlydead, 6 polish, 8 free, 10 doubleup, 11 premier, 13 VOD + incldead: "{{ if .Config.freeleech }}8{{ else }}1{{ end }}" + # 0 title, 1 descr + blah: "{{ if .Query.IMDBID }}1{{ else }}0{{ end }}" + gatunek: 0 + quality: none + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + # can search by a genre, (gatunek), but you need to know the id: &gatunek=64 to search Sci-Fi + + rows: + selector: table[width="100%"] > tbody > tr:has(a[href^="browse.php?cat="]) + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_raw: + selector: a[href^="details.php?id="] + title_multilang: + text: "{{ .Result.title_raw }}" + filters: + - name: re_replace + args: ["(?i)\\b(MULTI(?!.*(?:POLISH|ENGLISH|\\bPL\\b)))\\b", "{{ .Config.multilanguage }}"] + - name: re_replace + args: ["(?i)\\b(pl)\\b", "POLISH"] + title_phase1: + text: "{{ if .Config.multilang }}{{ .Result.title_multilang }}{{ else }}{{ .Result.title_raw }}{{ end }}" + title_stripped: + text: "{{ .Result.title_phase1 }}" + filters: + - name: re_replace + args: ["^(.* / )(.*)$", "$2"] + title: + text: "{{ if .Config.drop_polish_prefix }}{{ .Result.title_stripped }}{{ else }}{{ .Result.title_phase1 }}{{ end }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php/"] + attribute: href + poster: + selector: a[href^="details.php?id="] + attribute: onmouseover + filters: + - name: regexp + args: "src=(.+?) " + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + genre: + selector: td[align="right"][width="66%"][valign="bottom"] + filters: + - name: replace + args: ["\xA0", " "] + - name: validate + args: "Akcja, Animacja, Anime, Basn, Biblijny, Biograficzny, Czarna komedia, Dla dzieci, Dla mlodziezy, Dokumentalizowany, Dokumentalny, Dramat, Dramat historyczny, Dramat obyczajowy, Dramat sadowy, Dramat spoleczny, Dreszczowiec, Edukacyjny, Erotyczny, Etiuda, Fabularyzowany dok., Familijny, Fantasy, Film-Noir, Gangsterski, Groteska filmowa, Historyczny, Horror, Karate, Katastroficzny, Komedia, Komedia dokumentalna, Komedia kryminalna, Komedia obycz., Komedia rom., Kostiumowy, Krótkometrażowy, Kryminał, Melodramat, Motoryzacyjny, Musical, Muzyczny, Kulinarny, Nowele filmowe, Obyczajowy, Poetycki, Polityczny, Prawniczy, Przygodowy, Przyrodniczy, Psychologiczny, Plaszcza i szpady, Religijny, Romans, Rozrywka, Satyra, Sci-Fi, Sensacyjny, Sportowy, Surreallistyczny, Szpiegowski, Sztuki walki, Świąteczne, Thriller, Western, Wojenny, Kabaret, Action, Adventure, Arcade, Fps, Fighting, MMO, Puzzle, Racing, Rpg, RTS, Shooter, Simulation, Stealth, Strategy, Sport , Tps, Early Access, DOX, PC, X360, PlayStation, PSP, Alternative, Ambient, Classical, Dubstep, Drum and bass, Dance, Disco polo, Disco, Dla dzieci, Electronic, Folc, Hardstyle, Hardcore, Hip-hop, House, Jazz, Kompilacje muzyczne, Metal, Progressive house, Pop, Punk, Rap, Reggae, Rnb, Rock, Soul, Techno, Trance, Breaks, Chill out, Club, Deep house, Electro house, Tech house, GOA/PSY, Instrumental, Minimal, Soundtrack, Sety, Prasa, Czasopisma, Książka, Audiobook, Polskie, Klasyka, Poezja, Literatura piękna, Literatura faktu, Autobiografia, Pamiętnik" + description: + selector: img[src="pic/Poland.png"] + attribute: src + filters: + - name: prepend + args: "{{ if .Result.genre }}{{ .Result.genre }} - {{ else }}{{ end }}" + - name: replace + args: ["pic/Poland.png", "Polish"] + date: + selector: td[width="66%"] > span > span + filters: + - name: append + args: " +02:00" # EET + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + size: + selector: td:nth-child(4) + seeders: + selector: a[href$="#seedy"] + leechers: + selector: a[href$="#leechy"] + grabs: + selector: td:last-child > small> span + downloadvolumefactor: + case: + img[src="pic/free.png"]: 0 + "*": 1 + uploadvolumefactor: + case: + img[src="pic/double.png"]: 2 + "*": 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 3 days (as seconds = 3 x 24 x 60 x 60) + text: 259200 +# engine n/a diff --git a/config/prowlarr/Definitions/cinematik.yml b/config/prowlarr/Definitions/cinematik.yml new file mode 100644 index 0000000..9363dc7 --- /dev/null +++ b/config/prowlarr/Definitions/cinematik.yml @@ -0,0 +1,126 @@ +--- +id: cinematik +name: Cinematik +description: "A tracker for full BD and DVD discs of non-mainstream movies, niche cinema and arthouse." +language: en-US +type: private +encoding: UTF-8 +links: + - https://www.cinematik.net/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Comedy"} + - {id: 4, cat: Movies, desc: "Action"} + - {id: 5, cat: Movies, desc: "Horror"} + - {id: 6, cat: Movies, desc: "Drama"} + - {id: 7, cat: Movies, desc: "Documentary"} + - {id: 9, cat: Movies, desc: "Crime"} + - {id: 12, cat: Movies, desc: "Sci-Fi"} + - {id: 17, cat: Movies, desc: "War"} + - {id: 21, cat: Movies, desc: "Silent Films"} + - {id: 23, cat: Movies, desc: "TV-Series"} + - {id: 24, cat: Movies, desc: "Animation"} + - {id: 25, cat: Movies, desc: "Exploitation"} + - {id: 26, cat: Movies, desc: "Experimental"} + - {id: 27, cat: Movies, desc: "Fantasy"} + - {id: 29, cat: Movies, desc: "Short"} + - {id: 30, cat: Movies, desc: "Western"} + - {id: 32, cat: Movies, desc: "Foreign Languages"} + - {id: 33, cat: Movies, desc: "Thriller"} + - {id: 34, cat: Movies, desc: "Opera and Musical"} + + modes: + search: [q] + movie-search: [q, imdbid] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: incldead + type: select + label: Status + default: 1 + options: + 0: Active + 1: "Active and Inactive" + 2: Inactive + - name: dropbumped + type: checkbox + label: Ignore Bumped Torrents + default: false + - name: info_results + type: info + label: Results Per Page + default: "For best results, change the Torrents per page: setting to 100 on your account profile.
Default is 15." + +login: + method: form + path: login.php + submitpath: takelogin.php + form: form[action="takelogin.php"] + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: table:contains("Login failed!") + test: + path: my.php + selector: a[href="logout.php"] + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + incldead: "{{ .Config.incldead }}" + srchdtls: "{{ if .Query.IMDBID }}1{{ else }}0{{ end }}" + + rows: + selector: "table[border=\"1\"] tr:not(:first-child){{ if .Config.dropbumped }}:not(:has(span.bumped)){{ else }}{{ end }}" + + fields: + category: + text: 1 + title: + selector: td:nth-child(2) a + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="details.php?id="] + attribute: href + filters: + - name: replace + args: ["details.php?id=", "download.php?id="] + files: + selector: td:nth-child(5) + size: + selector: td:nth-child(7) + grabs: + selector: td:nth-child(8) + filters: + - name: regexp + args: ([\d,]+) + seeders: + selector: td:nth-child(9) + leechers: + selector: td:nth-child(10) + date: + selector: td:nth-child(11) div.addedtor + downloadvolumefactor: + case: + img[title^="Golden Torrent"]: 0 + img[title^="Silver Torrent"]: 0.25 + img[title^="Platinum Torrent"]: 0 + "*": 1 + uploadvolumefactor: + case: + img[title^="Platinum Torrent"]: 2 + "*": 1 +# Engine n/a diff --git a/config/prowlarr/Definitions/classix.yml b/config/prowlarr/Definitions/classix.yml new file mode 100644 index 0000000..893abb6 --- /dev/null +++ b/config/prowlarr/Definitions/classix.yml @@ -0,0 +1,186 @@ +--- +id: classix +name: Classix +description: "Classix is a Private Torrent Tracker for classic MOVIES / TV / GENERAL" +language: en-US +type: private +encoding: UTF-8 +links: + - http://classix-unlimited.co.uk/ # site does not support https ERR_CONNECTION_CLOSED + +caps: + categorymappings: + - {id: 59, cat: PC/0day, desc: "Apps: Movies: Misc"} + - {id: 55, cat: PC/0day, desc: "Apps: Graphics Editing GNU/Linux"} + - {id: 53, cat: PC/0day, desc: "Apps: Apps DVD/Blu-Ray Copy Mac"} + - {id: 57, cat: PC/0day, desc: "Apps: DVD/Blu-Ray Copy GNU/Linux"} + - {id: 51, cat: PC/0day, desc: "Apps: Graphics Editing Mac"} + - {id: 58, cat: PC/0day, desc: "Apps: Music Editing & Recording GNU/"} + - {id: 52, cat: PC/0day, desc: "Apps: Apps DVD Editing Mac"} + - {id: 56, cat: PC/0day, desc: "Apps: DVD Editing GNU/Linux"} + - {id: 54, cat: PC/0day, desc: "Apps: Music Editing & Recording Mac"} + - {id: 18, cat: PC/0day, desc: "Apps: Graphics Editing PC"} + - {id: 19, cat: PC/0day, desc: "Apps: DVD Editing PC"} + - {id: 20, cat: PC/0day, desc: "Apps: DVD/Blu-Ray Copying PC"} + - {id: 21, cat: PC/0day, desc: "Apps: Music Editing & Recording PC"} + - {id: 66, cat: Other, desc: "grumpyman: pending torrents"} + - {id: 67, cat: Books/EBook, desc: "Media: pdf"} + - {id: 49, cat: Movies/HD, desc: "Movies: HD-Compressed Or Stripped"} + - {id: 47, cat: Movies/Other, desc: "Movies: Covers & Artwork"} + - {id: 48, cat: Movies/SD, desc: "Movies: DVD-Compressed Or Stripped"} + - {id: 1, cat: Movies/DVD, desc: "Movies: DVD-Untouched"} + - {id: 50, cat: Movies, desc: "Movies: Made For TV"} + - {id: 2, cat: Movies/SD, desc: "Movies: Divx/Xvid/Avi"} + - {id: 60, cat: Movies/HD, desc: "Movies: HD-mkv/mts"} + - {id: 65, cat: Movies/Foreign, desc: "Movies: Movies - w/additional lang/sub"} + - {id: 42, cat: Movies/HD, desc: "Movies: HD-Untouched"} + - {id: 3, cat: Movies/SD, desc: "Movies: SVCD/VCD"} + - {id: 71, cat: Movies/UHD, desc: "Movies: 4K-Untouched"} + - {id: 4, cat: Movies/Other, desc: "Movies: Other"} + - {id: 22, cat: Audio/MP3, desc: "Music: MP3"} + - {id: 23, cat: Audio/Lossless, desc: "Music: Lossless"} + - {id: 24, cat: Audio/Video, desc: "Music: DVD"} + - {id: 70, cat: Audio/Video, desc: "Music: HD"} + - {id: 25, cat: Audio/Video, desc: "Music: Video"} + - {id: 27, cat: Audio/Other, desc: "Music: Other"} + - {id: 63, cat: Other, desc: "Other: Educational/Instructional"} + - {id: 61, cat: Books/EBook, desc: "Other: Related Material"} + - {id: 37, cat: Other, desc: "Other: Images"} + - {id: 62, cat: TV, desc: "TV: Mini-Series"} + - {id: 64, cat: TV/Other, desc: "TV: Covers & Art Work"} + - {id: 69, cat: TV/SD, desc: "TV: Series - Compressed"} + - {id: 5, cat: TV/SD, desc: "TV: Series: DVD"} + - {id: 73, cat: TV/HD, desc: "TV: Complete Series HD"} + - {id: 72, cat: TV/SD, desc: "TV: Complete Series DVD"} + - {id: 41, cat: TV/HD, desc: "TV: Series: HD"} + - {id: 74, cat: TV, desc: "TV: Series Compilation: DVD or HD"} + - {id: 6, cat: TV/SD, desc: "TV: Divx/Xvid/AVI"} + - {id: 7, cat: TV/SD, desc: "TV: SVCD/VCD"} + - {id: 68, cat: TV, desc: "TV: .mkv"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: info_free + type: info + label: About Freeleech at Classix + default: This appears to only be uploads by the admin grumpyman57. + - name: sort + type: select + label: Sort requested from site + default: id + options: + id: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: account-login.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: div.myContent:contains("Access Denied") + test: + path: index.php + selector: a[href="account-logout.php"] + +search: + paths: + - path: torrents-search.php + inputs: +# category search returns results from unrelated categories +# $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + cat: 0 + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 notfree, 2 onlyfree + freeleech: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 all, 1 english, etc + lang: 0 + sort: "{{ .Config.sort }}" + order: "{{ .Config.type }}" + # does not support imdbid search and does not return imdb link in results + + keywordsfilters: + - name: re_replace + args: ["(\\w+)", "+$1"] # prepend + to each word + + rows: + selector: table > tbody > tr:has(a[href^="torrents.php?cat="]) + + fields: + category: + selector: a[href^="torrents.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="torrents-details.php?id="] + details: + selector: a[href^="torrents-details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: a[href^="torrents-details.php?id="] + attribute: onmouseover + filters: + - name: regexp + args: "src=(.+?)>" + date: + selector: a[href^="torrents-details.php?id="] + attribute: onmouseover + filters: + - name: regexp + args: "Date Added: (\\d{2}-\\d{2}-\\d{4})
" + - name: dateparse + args: "MM-dd-yyyy" + size: + selector: td:nth-child(7) + seeders: + selector: td:nth-child(8) + leechers: + selector: td:nth-child(9) + genre: + selector: a[href^="torrents.php?gen="] + description: + text: "{{ .Result.genre }}" + downloadvolumefactor: + # returned results not marked as freeleech + text: "{{ if .Config.freeleech }}0{{ else }}1{{ end }}" + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 2 day (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# engine TorrentTrader v2-svn diff --git a/config/prowlarr/Definitions/coastalcrew.yml b/config/prowlarr/Definitions/coastalcrew.yml new file mode 100644 index 0000000..34e8299 --- /dev/null +++ b/config/prowlarr/Definitions/coastalcrew.yml @@ -0,0 +1,177 @@ +--- +id: coastalcrew +name: Coastal-Crew +description: "Coastal-Crew is a GERMAN Private Torrent Tracker for MOVIES / TV / GENERAL" +language: de-DE +type: private +encoding: UTF-8 +links: + - https://coastal-crew.bounceme.net/ + +caps: + categorymappings: + - {id: 30, cat: TV/Anime, desc: "Filme - Animie"} + - {id: 28, cat: Movies/BluRay, desc: "Filme - Bluray"} + - {id: 31, cat: Movies/Other, desc: "Filme - Bollywood"} + - {id: 77, cat: TV/Documentary, desc: "Filme - DokusHD"} + - {id: 32, cat: Movies/DVD, desc: "Filme - DVD"} + - {id: 33, cat: Movies/HD, desc: "Filme - HD"} + - {id: 34, cat: Movies, desc: "Filme - Klassiker"} + - {id: 35, cat: Movies, desc: "Filme - Pack"} + - {id: 36, cat: Movies/SD, desc: "Filme - SD"} + - {id: 37, cat: Movies/UHD, desc: "Filme - UHD"} + - {id: 38, cat: Movies/HD, desc: "Filme - x264"} + - {id: 39, cat: Audio, desc: "Musik - Alben"} + - {id: 72, cat: Audio, desc: "Musik - Charts"} + - {id: 40, cat: Audio, desc: "Musik - Diskografie"} + - {id: 75, cat: Audio/Lossless, desc: "Musik - Flac"} + - {id: 41, cat: Audio/Audiobook, desc: "Musik - Hoerbuch"} + - {id: 74, cat: Audio/Other, desc: "Musik - Kids"} + - {id: 42, cat: Audio, desc: "Musik - Mixe"} + - {id: 66, cat: Audio, desc: "Musik - Pack"} + - {id: 70, cat: Audio, desc: "Musik - Sampler Deu."} + - {id: 71, cat: Audio, desc: "Musik - Sampler Int."} + - {id: 76, cat: Audio/Other, desc: "Musik - Soundtrack"} + - {id: 44, cat: Audio/Video, desc: "Musik - Video"} + - {id: 45, cat: PC, desc: "Programme - Linux"} + - {id: 48, cat: PC/Mac, desc: "Programme - Mac"} + - {id: 49, cat: PC/0day, desc: "Programme - Windows"} + - {id: 65, cat: TV, desc: "Serien - Allgemein"} + - {id: 50, cat: TV/Documentary, desc: "Serien - Dokus"} + - {id: 51, cat: TV, desc: "Serien - Klassiker"} + - {id: 52, cat: TV, desc: "Serien - Pack"} + - {id: 53, cat: TV/Sport, desc: "Serien - Sport"} + - {id: 62, cat: Books/EBook, desc: "EBook"} + - {id: 63, cat: Movies, desc: "Fuer Unsere Kleinsten"} + - {id: 64, cat: PC/Mobile-Other, desc: "Handy-Stuff"} + - {id: 60, cat: Other, desc: "Sonstiges"} + - {id: 69, cat: Books/Mags, desc: "Zeitung"} + - {id: 54, cat: PC/Mobile-Other, desc: "Spiele - Handy"} + - {id: 55, cat: Console, desc: "Spiele - Konsolen"} + - {id: 57, cat: PC/Games, desc: "Spiele - Mac / Linux / PC"} + - {id: 58, cat: Console/Other, desc: "Spiele - Wimmel"} + - {id: 59, cat: XXX, desc: "XXX"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Filter FreeLeech only + default: false + - name: onlyupload + type: checkbox + label: Filter OnlyUpload only + default: false + - name: info_free + type: info + label: About Freeleech and OnlyUpload at Coastal Crew + default: "
  • FreeLeech are torrents where neither the download or upload is counted. (On the Prowlarr search results page these are tagged as NoUpload).
  • OnlyUpload are torrents where download is not counted but upload is. Good for building your Ratio up. (On the Prowlarr search results page these are tagged as Freeleech).
" + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeds: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents pro Seite: setting to 100 on your Control Panel. The default is 15. + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: .tablea:contains("Fehler") + test: + path: index.php + selector: a[href="logout.php"] + +search: + # https://coastal-crew.bounceme.net/browse.php?showsearch=1&c62=1&c33=1&search=&incldead=1&orderby=added&sort=desc + path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + showsearch: 1 + search: "{{ .Keywords }}" + # 0 active, 1 all, 2 dead + incldead: 1 + orderby: "{{ .Config.sort }}" + sort: "{{ .Config.type }}" + # site does not support imdbid search from the browse.php page or return imdb links in results + + rows: + selector: "table.tableinborder[cellspacing=\"1\"][cellpadding=\"0\"]:not(:has(a[href=\"index.php\"])) > tbody > tr:has(a[href^=\"download.php\"]){{ if .Config.onlyupload }}:has(img[src=\"pic/oupic.gif\"]){{ else }}{{ end }}" + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php"] + details: + selector: a[href^="details.php"] + attribute: href + download: + selector: a[href^="download.php"] + attribute: href + poster: + selector: img[id="img-1"] + attribute: src + size: + selector: td.tablea table tbody tr:nth-child(2) td:nth-child(1) b:nth-child(1) + files: + selector: td.tablea table tbody tr:nth-child(2) td:nth-child(1) b:nth-child(2) + seeders: + selector: td.tablea table tbody tr:nth-child(2) td:nth-child(2) b:nth-child(1) + leechers: + selector: td.tablea table tbody tr:nth-child(2) td:nth-child(2) > b:nth-of-type(2) + grabs: + selector: td.tablea table tbody tr:nth-child(2) td:nth-child(3) b:nth-child(1) + date: + selector: td.tablea table tbody tr:nth-child(2) td:nth-child(5) + filters: + - name: append + args: " +01:00" # CET + - name: replace + args: ["\xA0", " "] + - name: dateparse + args: "dd.MM.yyyy HH:mm:ss zzz" + downloadvolumefactor: + case: + img[src="pic/oupic.gif"]: 0 # only upload is counted + "*": 1 + uploadvolumefactor: + case: + img[src="pic/freeleech.gif"]: 0 # nothing is counted + "*": 1 + minimumratio: + text: 0.7 +# engine n/a diff --git a/config/prowlarr/Definitions/comicat.yml b/config/prowlarr/Definitions/comicat.yml new file mode 100644 index 0000000..f333ab3 --- /dev/null +++ b/config/prowlarr/Definitions/comicat.yml @@ -0,0 +1,105 @@ +--- +id: comicat +name: comicat +description: "comicat is a CHINESE Public tracker for Anime / Hentai / Manga" +language: zh-CN +type: public +encoding: UTF-8 +requestDelay: 2 +links: + - https://www.comicat.org/ + +settings: [] + +caps: + categorymappings: + - {id: 1, cat: TV/Anime, desc: "动画(Anime)"} + - {id: 2, cat: Books/Comics, desc: "漫画(Manga)"} + - {id: 3, cat: Audio, desc: "音乐(Music)"} + - {id: 4, cat: TV/Anime, desc: "周边(Peripheral)"} + - {id: 5, cat: Other, desc: "其它(Other)"} + - {id: 6, cat: TV/Anime, desc: "Raw"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +search: + paths: + # https://www.comicat.org/ (latest) + # https://www.comicat.org/search.php?keyword=720p+2020 (search) + # sort_id: filters by a single category, multi cats is not supported so we cannot use it. + - path: "{{ if .Keywords }}/search.php?keyword={{ .Keywords }}{{ else }}{{ end }}" + - path: "{{ if .Keywords }}/search.php?keyword={{ .Keywords }}&page=2{{ else }}2.html{{ end }}" + + rows: + selector: tr[class^="alt"]:has(a[href^="sort"]) + + fields: + category: + selector: a[href^="sort"] + attribute: href + filters: + - name: regexp + args: "-(\\d)-" + title: + selector: a[href^="show"] + details: + selector: a[href^="show"] + attribute: href + infohash: + selector: a[href^="show"] + attribute: href + filters: + - name: regexp + args: "-(\\w+).html" + size: + selector: td:nth-child(4) + grabs: + selector: td:nth-child(7) span + date_year: + selector: td:nth-child(1):contains("/") + optional: true + filters: + - name: append + args: " +08:00" # CST (China) + - name: dateparse + args: "yyyy/MM/dd zzz" + date_today: + selector: td:nth-child(1):contains("今天") + optional: true + filters: + - name: replace + args: ["今天", ""] + - name: append + args: " +08:00" # CST (China) + - name: timeparse + args: "HH:mm zzz" + date_yday: + selector: td:nth-child(1):contains("昨天") + optional: true + filters: + - name: re_replace + args: [".+", "yesterday"] + - name: fuzzytime + date_ago: + selector: td:nth-child(1):contains("前天") + optional: true + filters: + - name: re_replace + args: [".+", "2 days"] + - name: timeago + date: + text: "{{ if or .Result.date_year .Result.date_today .Result.date_yday .Result.date_ago }}{{ or .Result.date_year .Result.date_today .Result.date_yday .Result.date_ago }}{{ else }}now{{ end }}" + seeders: + selector: td:nth-child(5) span + leechers: + selector: td:nth-child(6) span + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/concen.yml b/config/prowlarr/Definitions/concen.yml new file mode 100644 index 0000000..2e498b7 --- /dev/null +++ b/config/prowlarr/Definitions/concen.yml @@ -0,0 +1,84 @@ +--- +id: concen +name: ConCen +description: "ConCen (Conspiracy Central) is a Public conspiracy related torrent index" +language: en-US +type: public +encoding: UTF-8 +links: + - https://concen.org/ + +caps: + categories: + 1: Other + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + book-search: [q] + +settings: + - name: sort + type: select + label: Sort requested from site + default: created + options: + created: created + seeds: seeders + size: size + title: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +search: + paths: + # https://concen.org/torrents?title_op=allwords&title=cbc+national&title_1_op=not&title_1=&seeds=1 + - path: torrents + inputs: + title_op: allwords + title: "{{ .Keywords }}" + title_1_op: not + title_1: "" + seeds: All + order: "{{ .Config.sort }}" + sort: "{{ .Config.type }}" + + rows: + selector: table > tbody > tr:has(td.views-field-title) + + fields: + title: + selector: td.views-field-title a + category: + text: 1 + details: + selector: td.views-field-title a + attribute: href + download: + selector: td.views-field-field-torrent a + attribute: href + magnet: + selector: td.views-field-name a + attribute: href + date: + # 3 hours 27 min + selector: td.views-field-created + size: + selector: td.views-field-size + seeders: + selector: td.views-field-seeds + leechers: + selector: td.views-field-peers + grabs: + selector: td.views-field-completed + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# Drupal 7 diff --git a/config/prowlarr/Definitions/concertos.yml b/config/prowlarr/Definitions/concertos.yml new file mode 100644 index 0000000..322f718 --- /dev/null +++ b/config/prowlarr/Definitions/concertos.yml @@ -0,0 +1,132 @@ +--- +id: concertos +name: Concertos +description: "Concertos - Private site for Live Concerts with Strict Quality Control" +language: en-US +type: private +encoding: UTF-8 +links: + - https://concertos.live/ + +caps: + categorymappings: + - {id: 1, cat: TV, desc: "Live Concert"} + - {id: 2, cat: Audio/Video, desc: "Music Video"} + - {id: 4, cat: TV, desc: "Music Documentary"} + - {id: 5, cat: Audio/Lossless, desc: "Pure Audio"} + - {id: 7, cat: TV, desc: "Opera"} + - {id: 8, cat: TV, desc: "Musical"} + - {id: 9, cat: Audio, desc: "Podcast"} + + modes: + search: [q] + tv-search: [q, imdbid] + movie-search: [q, imdbid] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: login + method: form + form: form[action$="/login"] + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + remember: on + selectorinputs: + _token: + selector: input[name="_token"] + attribute: value + error: + - selector: form[action$="/login"] .text-red +# test: +# path: / +# selector: a[href$="/logout"] + +search: + paths: + - path: torrents + inputs: + $raw: "{{ range .Categories }}categories[]={{.}}&{{end}}" + title: "{{ if .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" # for dashboard imdbid search + imdb: "{{ .Query.IMDBIDShort }}" + freeleech: "{{ if .Config.freeleech }}on{{ else }}{{ end }}" + order_by: "{{ .Config.sort }}" + direction: "{{ .Config.type }}" + + rows: + selector: table > tbody > tr + + fields: + category: + selector: a[href*="?category_"] + attribute: href + filters: + - name: regexp + args: "category_(\\d+)" + title: + selector: a[href*="/torrent/"] + details: + selector: a[href*="/torrent/"] + attribute: href + download: + selector: a[href*="/torrent/"] + attribute: href + filters: + - name: append + args: "/download" + size: + selector: td.torrents__size + date: + selector: td.torrents__age + seeders: + selector: td:nth-last-child(3) + leechers: + selector: td:nth-last-child(2) + grabs: + selector: td:nth-last-child(1) + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + downloadvolumefactor: + case: + i.fa-star: 0 # Freeleech + i.fa-certificate: 0 # Featured + "*": 1 + uploadvolumefactor: + case: + i.fa-certificate: 2 # Featured + i.fa-gem: 2 # Double Upload + "*": 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 7 day (as seconds = 7 x 24 x 60 x 60) + text: 604800 +# UNIT3D diff --git a/config/prowlarr/Definitions/cpabien.yml b/config/prowlarr/Definitions/cpabien.yml new file mode 100644 index 0000000..a22cb63 --- /dev/null +++ b/config/prowlarr/Definitions/cpabien.yml @@ -0,0 +1,149 @@ +--- +id: cpasbien +name: cpasbien +description: "cpasbien is a FRENCH Public site for TV / MOVIES / GENERAL" +language: fr-FR +type: public +encoding: UTF-8 +followredirect: true +links: + - https://cpasbien-vf.fr/ +legacylinks: + - https://www.cpasbiens.cz/ + - https://www.cpasbiens.bz/ + - https://www.cpasbien.vg/ + - https://www.cpasbien.lol/ + - https://www.gktorrent.biz/ + - https://vww.cpasbien-fr.fr/ + - https://wvw.cpasbien-fr.fr/ + - https://wwwv.cpasbien-fr.fr/ + - https://www2.cpasbien-fr.fr/ + - https://www.cpasbien-fr.nz/ + - https://vwwvwvwvvw.cpasbien-fr.nz/ + - https://cpasbiens3.fr/ + - https://labastidevivante.fr/ + - https://cpasbiens911.fr/ + - https://jardattraction.fr/ + +caps: + categories: + Other: Other + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + +settings: + - name: flaresolverr + type: info + label: FlareSolverr + default: This site may use Cloudflare DDoS Protection, therefore Prowlarr requires FlareSolverr to access it. + - name: info_8000 + type: info + label: About cpasbien Categories + default: cpasbien does not return categories in its search results. To sync to your apps, include 8000(Other) in your Apps' Sync Categories. + - name: multilang + type: checkbox + label: Replace MULTi by another language in release name + default: false + - name: multilanguage + type: select + label: Replace MULTi by this language + default: FRENCH + options: + FRENCH: FRENCH + MULTi FRENCH: MULTi FRENCH + ENGLISH: ENGLISH + MULTi ENGLISH: MULTi ENGLISH + VOSTFR: VOSTFR + MULTi VOSTFR: MULTi VOSTFR + - name: vostfr + type: checkbox + label: Replace VOSTFR and SUBFRENCH with ENGLISH + default: false + +download: + selectors: + - selector: a[href^="magnet:?xt="] + attribute: href + +search: + paths: + - path: "{{ if .Keywords }}index.php?do=search&subaction=search{{ else }}{{ end }}" + method: post + # postData is mandatory FlareSolverr/FlareSolverr#789 + allowEmptyInputs: true + inputs: + story: "{{ if .Keywords }}{{ .Keywords }}{{ else }}{{ end }}" + # does not support imdbid search and does not return imdb link in results. + keywordsfilters: + # if searching for season packs with S01 to saison 1 #9712 + - name: re_replace + args: ["(?i)\\b(?:S0?)(\\d{1,3})\\b", "saison $1"] + + rows: + selector: div#gauche > table > tbody > tr:has(a), div#dle-content > a.cover2 + + fields: + category: + text: Other + title_phase1_title: + selector: a + title_phase1_url: + selector: a + attribute: href + filters: + - name: regexp + args: torrents\d+\/(.+?)\/ + - name: replace + args: ["-", " "] + title_phase1: + text: "{{ if .Result.title_phase1_title }}{{ .Result.title_phase1_title }}{{ else }}{{ .Result.title_phase1_url }}{{ end }}" + filters: + - name: re_replace + args: ["(?i)\\b(FRENCH|MULTI|TRUEFRENCH|VOSTFR|SUBFRENCH)\\b(.+?)(\\b(19|20\\d{2})\\b)$", "$3 $1$2"] + title_vostfr: + text: "{{ .Result.title_phase1 }}" + filters: + - name: re_replace + args: ["(?i)\\b(vostfr|subfrench)\\b", "ENGLISH"] + title_phase2: + text: "{{ if .Config.vostfr }}{{ .Result.title_vostfr }}{{ else }}{{ .Result.title_phase1 }}{{ end }}" + title_multilang: + text: "{{ .Result.title_phase2 }}" + filters: + - name: re_replace + args: ["(?i)\\b(MULTI(?!.*(?:FRENCH|ENGLISH|VOSTFR)))\\b", "{{ .Config.multilanguage }}"] + title: + text: "{{ if .Config.multilang }}{{ .Result.title_multilang }}{{ else }}{{ .Result.title_phase2 }}{{ end }}" + details: + selector: a + attribute: href + download: + selector: a + attribute: href + poster: + selector: img + attribute: src + size: + selector: div.poid + optional: true + default: "512 MB" + date: + text: now + seeders_optional: + selector: div.up + optional: true + seeders: + text: "{{ if .Result.seeders_optional }}{{ .Result.seeders_optional }}{{ else }}0{{ end }}" + leechers_optional: + selector: div.down + optional: true + leechers: + text: "{{ if .Result.leechers_optional }}{{ .Result.leechers_optional }}{{ else }}0{{ end }}" + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/cpasbienclone.yml b/config/prowlarr/Definitions/cpasbienclone.yml new file mode 100644 index 0000000..8b31c3a --- /dev/null +++ b/config/prowlarr/Definitions/cpasbienclone.yml @@ -0,0 +1,139 @@ +--- +id: cpasbienclone +name: cpasbien clone +description: "cpasbien clone is a FRENCH Public site for TV / MOVIES / GENERAL" +language: fr-FR +type: public +encoding: UTF-8 +followredirect: true +links: + - https://www.cpasbien.tw/ +legacylinks: + - https://www1.cpasbiens.ws/ + - https://www2.cpasbiens.ws/ + - https://cpasbiens.cm/ + - https://www1.cpasbiens.cm/ + - https://wwv.cpasbien.to/ + - https://cpasbiens.black-mirror.xyz/ + - https://cpasbiens.unblocked.casa/ + - https://cpasbiens.proxyportal.fun/ + - https://cpasbiens.uk-unblock.xyz/ + - https://cpasbiens.ind-unblock.xyz/ + - https://www.cpasbien.gg/ + - https://www.cpasbien.vip/ + - https://cpasbien.to/ + +caps: + categories: + Other: Other + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + allowrawsearch: true + +settings: + - name: info_8000 + type: info + label: About cpasbienclone Categories + default: cpasbienclone does not return categories in its search results. To sync to your apps, include 8000(Other) in your Apps' Sync Categories. + - name: multilang + type: checkbox + label: Replace MULTi by another language in release name + default: false + - name: multilanguage + type: select + label: Replace MULTi by this language + default: FRENCH + options: + FRENCH: FRENCH + MULTi FRENCH: MULTi FRENCH + ENGLISH: ENGLISH + MULTi ENGLISH: MULTi ENGLISH + VOSTFR: VOSTFR + MULTi VOSTFR: MULTi VOSTFR + - name: vostfr + type: checkbox + label: Replace VOSTFR and SUBFRENCH with ENGLISH + default: false + - name: sort + type: select + label: Sort requested from site (Works only for searches with Keywords) + default: trie-date-d + options: + trie-date-d: created desc + trie-date-a: created asc + trie-seeds-d: seeders desc + trie-seeds-a: seeders asc + trie-poid-d: size desc + trie-poid-a: size asc + trie-nom-d: title desc + trie-nom-a: title asc + +download: + before: + # request target + path: "download_magnet?id={{ re_replace .DownloadUri.AbsoluteUri \"^.*-(\\d+)\\.html\" \"$1\" }}" + selectors: + - selector: body + usebeforeresponse: true + +search: + paths: + - path: "{{ if .Keywords }}search_torrent/{{ .Keywords }}.html,{{ .Config.sort }}{{ else }}home/{{ end }}" + + rows: + selector: table.table-corps > tbody > tr:has(a) + + fields: + category: + text: Other + title_phase1: + selector: a + filters: + - name: re_replace + args: ["(?i)\\b(FRENCH|MULTI|TRUEFRENCH|VOSTFR|SUBFRENCH)\\b(.+?)(\\b(19|20\\d{2})\\b)$", "$3 $1$2"] + title_vostfr: + text: "{{ .Result.title_phase1 }}" + filters: + - name: re_replace + args: ["(?i)\\b(vostfr|subfrench)\\b", "ENGLISH"] + title_phase2: + text: "{{ if .Config.vostfr }}{{ .Result.title_vostfr }}{{ else }}{{ .Result.title_phase1 }}{{ end }}" + title_multilang: + text: "{{ .Result.title_phase2 }}" + filters: + - name: re_replace + args: ["(?i)\\b(MULTI(?!.*(?:FRENCH|ENGLISH|VOSTFR)))\\b", "{{ .Config.multilanguage }}"] + title: + text: "{{ if .Config.multilang }}{{ .Result.title_multilang }}{{ else }}{{ .Result.title_phase2 }}{{ end }}" + details: + selector: a + attribute: href + download: + selector: a + attribute: href + size: + selector: div.poid + filters: + - name: re_replace + args: ["(\\w)o", "$1B"] + # keyword search returns nnnnn.n in MB but without unit indicator + - name: re_replace + args: ["(\\d+\\.\\d)$", "$1MB"] + date: + text: now + seeders: + selector: div.up + optional: true + default: 0 + leechers: + selector: div.down + optional: true + default: 0 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/crackingpatching.yml b/config/prowlarr/Definitions/crackingpatching.yml new file mode 100644 index 0000000..1250be9 --- /dev/null +++ b/config/prowlarr/Definitions/crackingpatching.yml @@ -0,0 +1,102 @@ +--- +id: crackingpatching +name: CrackingPatching +description: "CrackingPatching is a Public tracker for Software and Apps" +language: en-US +type: public +encoding: UTF-8 +links: + - https://crackingpatching.com/ + +caps: + categorymappings: + - {id: "adobe-software", cat: PC, desc: "Adobe Software"} + - {id: "adobe-tools", cat: PC, desc: "Adobe Tools"} + - {id: "android", cat: PC/Mobile-Android, desc: "Android"} + - {id: "animations-3d-graphics", cat: PC, desc: "Animations/ 3D Graphics"} + - {id: "antivirus", cat: PC, desc: "Antivirus"} + - {id: "cd-dvd-burners", cat: PC, desc: "CD/ DVD Burners"} + - {id: "compression-tools", cat: PC, desc: "Compression Tools"} + - {id: "converters", cat: PC, desc: "Converters"} + - {id: "crack-serials", cat: PC, desc: "Crack & Serials"} + - {id: "downloader", cat: PC, desc: "Downloader"} + - {id: "drivers-update", cat: PC, desc: "Drivers Update"} + - {id: "games", cat: PC/Games, desc: "Games"} + - {id: "home", cat: PC, desc: "Home"} + - {id: "idm", cat: PC, desc: "IDM"} + - {id: "idm-crack-patch", cat: PC, desc: "IDM Crack/ Patch"} + - {id: "ios-mac-os-x-2", cat: PC/Mac, desc: "iOS/ MAC OS X"} + - {id: "keygen-loader", cat: PC, desc: "Keygen / Loader"} + - {id: "keygen-serial", cat: PC, desc: "KeyGen / Serial"} + - {id: "microsoft-office", cat: PC, desc: "Microsoft Office"} + - {id: "multimedia", cat: PC, desc: "Multimedia"} + - {id: "other", cat: Other, desc: "Other"} + - {id: "pdf-tools", cat: PC, desc: "PDF Tools"} + - {id: "photo-editing-tools", cat: PC, desc: "Photo Editing Tools"} + - {id: "recovery-software", cat: PC, desc: "Recovery Software"} + - {id: "request-crack-patch", cat: PC, desc: "Request Crack/ Patch"} + - {id: "screen-recorders", cat: PC, desc: "Screen Recorders"} + - {id: "security", cat: PC, desc: "Security"} + - {id: "system-optimizers", cat: PC, desc: "System Optimizers"} + - {id: "uncategorized", cat: Other, desc: "Uncategorized"} + - {id: "vpn", cat: PC, desc: "VPN"} + - {id: "windows", cat: PC, desc: "Windows"} + - {id: "windows-app", cat: PC, desc: "Windows App"} + + modes: + search: [q] + +settings: [] + +download: + selectors: + - selector: a[href^="magnet:?xt="] + attribute: href + +search: + paths: + - path: / + inputs: + s: "{{ .Keywords }}" + + rows: + selector: article.post-entry + filters: + - name: andmatch + + fields: + category: + selector: article.post-entry + attribute: class + optional: true + default: other + filters: + - name: regexp + args: "category-(.+?) " + title: + selector: h2 > a + details: + selector: h2 > a + attribute: href + download: + selector: h2 > a + attribute: href + poster: + selector: img + attribute: src + date: + text: now + size: + text: "512 MB" + description: + selector: p + remove: a + seeders: + text: 1 + leechers: + text: 1 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# WordPress 5.9.1 diff --git a/config/prowlarr/Definitions/crazyspirits.yml b/config/prowlarr/Definitions/crazyspirits.yml new file mode 100644 index 0000000..a9aaac6 --- /dev/null +++ b/config/prowlarr/Definitions/crazyspirits.yml @@ -0,0 +1,293 @@ +--- +id: crazyspirits +name: CrazySpirits +description: "Crazy Spirits is a FRENCH Private Torrent Tracker for MOVIES / TV / GENERAL" +language: fr-FR +type: private +encoding: UTF-8 +links: + - https://www.crazyspirits.com/ + +caps: + categorymappings: + # Films + - {id: 49, cat: Movies/3D, desc: "Films 3D"} + - {id: 1, cat: XXX, desc: "Films 3X"} + - {id: 48, cat: XXX/x264, desc: "Films 3X HD1080p"} + - {id: 47, cat: XXX/x264, desc: "Films 3X HD720p"} + - {id: 140, cat: XXX, desc: "Films 3X Video"} + - {id: 50, cat: Movies/UHD, desc: "Films 4K"} + - {id: 51, cat: TV/UHD, desc: "Films 4K UHDTV"} + - {id: 57, cat: Movies/BluRay, desc: "Films BD-Rip"} + - {id: 56, cat: Movies/BluRay, desc: "Films Blu-Ray"} + - {id: 58, cat: Movies/BluRay, desc: "Films BR-Rip"} + - {id: 66, cat: Movies/SD, desc: "Films Cam-TS"} + - {id: 96, cat: TV/Documentary, desc: "Docus TV"} + - {id: 59, cat: Movies/DVD, desc: "Films DVDR"} + - {id: 60, cat: Movies/DVD, desc: "Films DVDRip"} + - {id: 98, cat: Movies/Other, desc: "Films Animé"} + - {id: 126, cat: TV/HD, desc: "Films HDTV"} + - {id: 124, cat: TV/Documentary, desc: "Formation Vidéo"} + - {id: 65, cat: Movies, desc: "Films FSCR"} + - {id: 53, cat: Movies/HD, desc: "Films HD1080p"} + - {id: 52, cat: Movies/HD, desc: "Films HD 720p"} + - {id: 137, cat: Movies/UHD, desc: "Films HDR 2160p"} + - {id: 61, cat: Movies/HD, desc: "Films HDRip"} + - {id: 63, cat: Movies/HD, desc: "Films MHD"} + - {id: 67, cat: Movies, desc: "Films Pack Films"} + - {id: 129, cat: Movies, desc: "Films QC~Film"} + - {id: 64, cat: Movies, desc: "Films R5"} + - {id: 99, cat: Movies, desc: "Films Remux"} + - {id: 69, cat: Movies, desc: "Films VO"} + - {id: 68, cat: Movies, desc: "Films Vost-FR"} + - {id: 122, cat: Movies/WEB-DL, desc: "Films Web-DL 1080P"} + - {id: 138, cat: Movies/WEB-DL, desc: "Films WEB-DL 2160p"} + - {id: 123, cat: Movies/WEB-DL, desc: "Films WEB-DL 720p"} + - {id: 143, cat: Movies/WEB-DL, desc: "Films WEB-DL-SD"} + - {id: 139, cat: Movies/WEB-DL, desc: "Films WEB-RIP 2160p"} + - {id: 73, cat: Movies/WEB-DL, desc: "Films Webrip"} + - {id: 70, cat: Movies/WEB-DL, desc: "Films WebRip 1080p"} + - {id: 71, cat: Movies/WEB-DL, desc: "Films WebRip 720p"} + - {id: 72, cat: Movies/WEB-DL, desc: "Films WEBRip-DL"} + # Jeux + - {id: 114, cat: PC/Games, desc: "Jeux PC"} + - {id: 115, cat: Console/PS3, desc: "Jeux PS3"} + - {id: 116, cat: Console/PSP, desc: "Jeux PSP- PSX"} + - {id: 117, cat: Console, desc: "Jeux Roms"} + - {id: 118, cat: Console, desc: "Jeux Switch"} + - {id: 119, cat: Console/Wii, desc: "Jeux Wii"} + - {id: 120, cat: Console/WiiU, desc: "Jeux WiiU"} + - {id: 121, cat: Console/XBox, desc: "Jeux Xbox"} + # Livre + - {id: 100, cat: Audio/Audiobook, desc: "Livre Audio"} + - {id: 101, cat: Books/EBook, desc: "Livre Epub"} + - {id: 102, cat: Books, desc: "Livre Mangas"} + - {id: 135, cat: Books, desc: "Livre Québéçois"} + - {id: 103, cat: Books, desc: "Livres BD"} + - {id: 104, cat: Books/Comics, desc: "Livres Comics"} + - {id: 105, cat: Books/Mags, desc: "Livres Press"} + - {id: 106, cat: Books, desc: "Livres Romans"} + # Logiciel + - {id: 113, cat: PC/Mobile-iOS, desc: "Logiciel Apple"} + - {id: 111, cat: PC, desc: "Logiciel Linux"} + - {id: 112, cat: PC/Mobile-Other, desc: "Logiciel Smart Phone"} + - {id: 110, cat: PC/0day, desc: "Logiciel Windows"} + # Musiques + - {id: 108, cat: Audio/Lossless, desc: "Musiques FLAC"} + - {id: 107, cat: Audio/MP3, desc: "Musiques MP3"} + - {id: 141, cat: Audio, desc: "Musiques Pack Album"} + - {id: 125, cat: Audio/Video, desc: "Musiques Videos Pack"} + - {id: 132, cat: Audio, desc: "Musiques QC~Musique"} + - {id: 109, cat: Audio, desc: "Musiques WMA"} + # Séries + - {id: 130, cat: TV, desc: "Séries QC~Serie"} + - {id: 97, cat: TV/Anime, desc: "Séries Animée"} + - {id: 84, cat: TV/HD, desc: "Séries Épisodes HD"} + - {id: 85, cat: TV/SD, desc: "Séries Épisodes SD"} + - {id: 77, cat: TV/HD, desc: "Séries HDTV"} + - {id: 88, cat: TV, desc: "Séries Pack HD"} + - {id: 128, cat: TV, desc: "Séries Pack SD"} + # Spéctacle + - {id: 131, cat: TV/Other, desc: "Spectacle QC~Spectacle"} + - {id: 90, cat: TV/Other, desc: "Spectacle 1080p"} + - {id: 91, cat: TV/Other, desc: "Spectacle 720p"} + - {id: 142, cat: TV/Other, desc: "Spectacle QC"} + - {id: 136, cat: TV/Other, desc: "Spectacle SD"} + # Télévision + - {id: 133, cat: TV, desc: "TV QC~Tv"} + - {id: 94, cat: TV, desc: "TV Animation"} + - {id: 93, cat: TV/Documentary, desc: "TV Documentaires"} + - {id: 92, cat: TV/Other, desc: "TV Spectacles"} + - {id: 95, cat: TV/Sport, desc: "TV Sports"} + - {id: 74, cat: TV/HD, desc: "TV TVHD"} + - {id: 75, cat: TV, desc: "TV TVRip"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: multilang + type: checkbox + label: Replace MULTi by another language in release name + default: false + - name: multilanguage + type: select + label: Replace MULTi by this language + default: FRENCH + options: + FRENCH: FRENCH + MULTi FRENCH: MULTi FRENCH + ENGLISH: ENGLISH + MULTi ENGLISH: MULTi ENGLISH + VOSTFR: VOSTFR + MULTi VOSTFR: MULTi VOSTFR + - name: vostfr + type: checkbox + label: Replace VOSTFR and SUBFRENCH with ENGLISH + default: false + - name: sort + type: select + label: Sort requested from site + default: id + options: + id: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: torrents-search.php + selector: a[href="account-logout.php"] + +download: + before: + path: thanks.php + inputs: + id: "{{ .DownloadUri.Query.id }}" + to: give + torrent: "{{ .DownloadUri.Query.id }}" + selectors: + - selector: a[href^="download.php?id="] + attribute: href + +search: + paths: + # https://www.crazyspirits.com/torrents-search.php?search=&cat=0&incldead=1&freeleech=0&recommended=0&lang=0 + - path: torrents-search.php + inputs: +# using multi cat search causes http 500 internal server error +# $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + cat: 0 + # 0 active, 1 incldead, 2 onlydead + incldead: 1 + # 0 all, 1 nofree, 2 onlyfree + freeleech: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 all, 1 not recommended, 2 only recommended + recommended: 0 + # 0 all, 1 french, 2 english, etc + lang: 0 + sort: "{{ .Config.sort }}" + order: "{{ .Config.type }}" + # imdb search not supported and imdb links not in results. + + rows: + selector: table.border_table > tbody > tr.t-row + + fields: + title_phase0: + # title can be abbreviated + selector: a[href^="torrents-details.php?id="] b + title_phase1: + # if available, the youtube link has a full title + selector: a[rel="prettyPhoto"] img + attribute: alt + optional: true + filters: + - name: replace + args: ["-NoTag", ""] + title_phase2: + text: "{{ if .Result.title_phase1 }}{{ .Result.title_phase1 }}{{ else }}{{ .Result.title_phase0 }}{{ end }}" + title_vostfr: + text: "{{ .Result.title_phase2 }}" + filters: + - name: re_replace + args: ["(?i)\\b(vostfr|subfrench)\\b", "ENGLISH"] + title_phase3: + text: "{{ if .Config.vostfr }}{{ .Result.title_vostfr }}{{ else }}{{ .Result.title_phase2 }}{{ end }}" + title_multilang: + text: "{{ .Result.title_phase3 }}" + filters: + - name: re_replace + args: ["(?i)\\b(MULTI(?!.*(?:FRENCH|ENGLISH|VOSTFR)))\\b", "{{ .Config.multilanguage }}"] + title: + text: "{{ if .Config.multilang }}{{ .Result.title_multilang }}{{ else }}{{ .Result.title_phase3 }}{{ end }}" + category: + selector: a[href^="torrents.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + details: + selector: a[href^="torrents-details.php?id="] + attribute: href + download: + selector: a[href^="torrents-details.php?id="] + attribute: href + poster: + selector: a[onmouseover][href^="torrents-details.php?id="] + attribute: onmouseover + filters: + - name: regexp + args: "src=(.*?)><" + grabs: + selector: a[onmouseover][href^="torrents-details.php?id="] + attribute: onmouseover + filters: + - name: regexp + args: "Completé : (\\d+)<" + seeders: + selector: a[onmouseover][href^="torrents-details.php?id="] + attribute: onmouseover + filters: + - name: regexp + args: "=greene>(\\d+)<" + leechers: + selector: a[onmouseover][href^="torrents-details.php?id="] + attribute: onmouseover + filters: + - name: regexp + args: "=red>(\\d+)<" + size: + selector: a[onmouseover][href^="torrents-details.php?id="] + attribute: onmouseover + filters: + - name: regexp + args: "Taille : (.*?)(.*?)08:10 AM + # Juče
06:44 PM + selector: td:nth-of-type(6):contains("Danas"), td:nth-of-type(6):contains("Juče") + # auto adjusted by site account profile + optional: true + filters: + - name: replace + args: ["Danas", "Today"] + - name: replace + args: ["Juče", "Yesterday"] + date_year: + # Feb 14 2019
10:20 AM + selector: td:nth-of-type(6):not(:contains("Juče")):not(:contains("Danas")) + # auto adjusted by site account profile + optional: true + filters: + - name: dateparse + args: "MMM d yyyy hh:mm tt" + date: + text: "{{ if or .Result.date_day .Result.date_year }}{{ or .Result.date_day .Result.date_year }}{{ else }}now{{ end }}" + size: + selector: td:nth-of-type(7) + grabs: + selector: td:nth-of-type(8) a + filters: + - name: regexp + args: ([\d]+) + seeders: + selector: td:nth-of-type(9) + leechers: + selector: td:nth-of-type(10) + downloadvolumefactor: + case: + "img[src$=\"/pic/freedownload.gif\"]": 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 7 day (as seconds = 7 x 24 x 60 x 60) + text: 604800 +# U-232 diff --git a/config/prowlarr/Definitions/crt2fa.yml b/config/prowlarr/Definitions/crt2fa.yml new file mode 100644 index 0000000..f35de92 --- /dev/null +++ b/config/prowlarr/Definitions/crt2fa.yml @@ -0,0 +1,162 @@ +--- +id: crt2fa +name: CRT2FA +description: "Cathode-Ray.Tube (CRT) is a Private Torrent Tracker for CLASSIC MOVIES / TV. Cookie Login for 2FA use." +language: en-GB +type: private +encoding: UTF-8 +links: + - https://www.cathode-ray.tube/ + +caps: + categorymappings: + - {id: 13, cat: PC/Games, desc: "Games"} + - {id: 4, cat: Other, desc: "Misc"} + - {id: 1, cat: Movies, desc: "Movies"} + - {id: 2, cat: TV, desc: "TV"} + - {id: 3, cat: Other, desc: "WOC"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, genre] + movie-search: [q, imdbid, genre] + +settings: + - name: cookie + type: text + label: Cookie + - name: info_cookie + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + - name: sort + type: select + label: Sort requested from site + default: time + options: + time: created + seeders: seeders + size: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: / + selector: "#nav_userinfo" + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}" + searchtext: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + order_by: "{{ .Config.sort }}" + order_way: "{{ .Config.type }}" + action: advanced + filter_freeleech: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + taglist: "{{ .Query.Genre }}" + + keywordsfilters: + - name: re_replace + args: ["(?i)\\bS0*(\\d+)\\b", "$1"] + - name: re_replace + args: ["(?i)\\bS0*(\\d+)E0*(\\d+)\\b", "$1"] + + rows: + selector: table#torrent_table > tbody > tr[class^="torrent row"]:has(a[href*="action=download"]) + + fields: + category: + selector: a[href^="/torrents.php?filter_cat"] + attribute: href + filters: + - name: regexp + args: \[(\d+)\] + title: + selector: a[href^="/torrents.php?id="] + filters: + - name: re_replace # Seasons X-Y --> S0X-S0Y + args: ["(?i)\\bSeasons?\\s*(\\d)\\s*-\\s*(\\d)\\b", "S0$1-S0$2"] + - name: re_replace # Seasons X-YY --> S0X-SYY + args: ["(?i)\\bSeasons?\\s*(\\d)\\s*-\\s*(\\d+)\\b", "S0$1-S$2"] + - name: re_replace # Seasons XX-YY --> SXX-SYY + args: ["(?i)\\bSeasons?\\s*(\\d+)\\s*-\\s*(\\d+)\\b", "S$1-S$2"] + - name: re_replace # Season X --> S0X + args: ["(?i)\\bSeasons?\\s*(\\d)\\b", "S0$1"] + - name: re_replace # Season XX --> SXX + args: ["(?i)\\bSeasons?\\s*(\\d+)\\b", "S$1"] + - name: re_replace + args: ["(?i)\\bComplete\\s+Series\\b", ""] + details: + selector: a[href^="/torrents.php?id="] + attribute: href + download: + selector: a[href^="torrents.php?action=download&id="] + attribute: href + genre: + selector: div.tags + filters: + - name: validate + args: "Action, Adventure, Animation, Comedy, Crime, Documentary, Drama, Family, Fantasy, History, Horror, Kids, Music, Mystery, News, Reality, Romance, SciFi, Soap, Talk, Thriller, War, Western" + description_tags: + selector: div.tags + description: + case: + span.icon_okay: "Verified: {{ .Result.description_tags }}" + "*": "Unverified: {{ .Result.description_tags }}" + poster: + selector: td:nth-child(2) > script + filters: + - name: regexp + args: "src=\\\\\"(.*?)\\\\\"" + - name: re_replace + args: ["\\\\(.)", "$1"] + - name: replace + args: ["/static/styles/modern/crt.png", ""] + files: + selector: td:nth-child(3) + date: + selector: td:nth-child(5) > span + attribute: title + # auto adjusted by site account profile + filters: + - name: dateparse + args: "MMM dd yyyy, HH:mm" + size: + selector: td:nth-child(6) + grabs: + selector: td:nth-child(7) + seeders: + selector: td:nth-child(8) + leechers: + selector: td:nth-child(9) + downloadvolumefactor: + case: + span.icon[title*="Freeleech"]: 0 + "img[alt=\"Freeleech\"]": 0 + "*": 1 + uploadvolumefactor: + case: + span.icon[title*="DoubleSeed"]: 2 + "img[alt=\"DoubleSeed\"]": 2 + "*": 1 + minimumratio: + text: 1.0 +# Luminance diff --git a/config/prowlarr/Definitions/dajiao.yml b/config/prowlarr/Definitions/dajiao.yml new file mode 100644 index 0000000..11c6331 --- /dev/null +++ b/config/prowlarr/Definitions/dajiao.yml @@ -0,0 +1,194 @@ +--- +id: dajiao +name: Dajiao +description: "Dajiao (打胶) is a CHINESE Private Torrent Tracker for MOVIES / TV / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://dajiao.cyou/ + +caps: + categorymappings: + - {id: 414, cat: Console, desc: "Games/游戏"} + - {id: 412, cat: Audio/Audiobook, desc: "Audio Books/有声书"} + - {id: 409, cat: Other, desc: "Others/音乐"} + - {id: 411, cat: Books/Comics, desc: "Manga/漫画"} + - {id: 413, cat: Books/EBook, desc: "E-Books/电子书"} + - {id: 404, cat: TV/Documentary, desc: "Documentaries/纪录片"} + - {id: 403, cat: TV, desc: "TV Variety Shows/综艺"} + - {id: 405, cat: TV/Anime, desc: "Animations/动漫"} + - {id: 402, cat: TV, desc: "TV Series/电视剧"} + - {id: 401, cat: Movies, desc: "Movies/电影"} + - {id: 416, cat: TV, desc: "TV Shows/电视节目"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: 2facode + type: text + label: 2FA code + - name: info_2fa + type: info + label: "About 2FA code" + default: "Only fill in the 2FA code box if you have enabled 2FA on the Kufei Web Site. Otherwise just leave it empty." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + secret: "" + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + two_step_code: "{{ .Config.2facode }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("失败")) + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl + search_area: "{{ if .Query.IMDBID }}4{{ else }}{{ end }}{{ if .Query.DoubanID }}1{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }}{{ else }}0{{ end }}" + # 0 AND, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: img[data-src] + attribute: data-src + imdbid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="imdb.com/title/tt"] + attribute: href + doubanid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="movie.douban.com/subject/"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-child(5) + seeders: + selector: td.rowfollow:nth-child(6) + leechers: + selector: td.rowfollow:nth-child(7) + grabs: + selector: td.rowfollow:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumratio: + text: 1.0 + description: + selector: td:nth-child(2) + remove: a, b, font, img, span +# NexusPHP v1.8.4 2023-06-13 diff --git a/config/prowlarr/Definitions/danishbytes-api.yml b/config/prowlarr/Definitions/danishbytes-api.yml new file mode 100644 index 0000000..70a958b --- /dev/null +++ b/config/prowlarr/Definitions/danishbytes-api.yml @@ -0,0 +1,170 @@ +--- +id: danishbytes-api +name: DanishBytes (API) +description: "DanishBytes is a Private Danish Tracker" +language: en-US +type: private +encoding: UTF-8 +links: + - https://danishbytes.club/ + - https://danishbytes2.org/ + - https://dbytes.org/ + - https://danishbytes.art/ +legacylinks: + - https://danishbytes.org/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Movies"} + - {id: 2, cat: TV, desc: "TV"} + - {id: 3, cat: Audio, desc: "Sound"} + - {id: 4, cat: PC/Games, desc: "Games"} + - {id: 5, cat: PC/0day, desc: "Appz"} + - {id: 8, cat: Books, desc: "Bookz"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + music-search: [q] + book-search: [q] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_apikey + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your DanishBytes account My Security page and clicking on the API Token tab." + - name: rsskey + type: text + label: RSSKey + - name: info_rsskey + type: info + label: About your RSS key + default: "Find or Generate a new RSS key by accessing your DanishBytes account My Security page and clicking on the RSS Key (RID) tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + inputs: {} # TODO: remove in v10 + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + - path: api/torrents/v2/filter + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + search: "{{ .Keywords }}" + imdb: "{{ .Query.IMDBIDShort }}" + tmdb: "{{ .Query.TMDBID }}" + tvdb: "{{ .Query.TVDBID }}" + freeleech: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + sorting: "{{ .Config.sort }}" + direction: "{{ .Config.type }}" + qty: 100 + page: 1 + + rows: + selector: torrents + count: + selector: $.resultsCount + + fields: + _id: + selector: .id + category: + selector: category_id + title: + selector: name + details: + text: "/torrents/{{ .Result._id }}" + download: + text: "/torrent/download/{{ .Result._id }}.{{ .Config.rsskey }}" + infohash: + selector: info_hash + poster: + selector: poster_image + genre: + selector: meta_genres + filters: + - name: re_replace + args: ["(?i)(Action og eventyr)", "Action_og_eventyr"] + - name: re_replace + args: ["(?i)(Sci-fi og Fantasy)", "Sci-fi_og_Fantasy"] + - name: re_replace + args: ["(?i)(Stand-Up Comedy)", "Stand-Up_Comedy"] + - name: replace + args: [" & ", "_&_"] + description: + text: "{{ .Result.genre }}" + imdbid: + selector: imdb + tmdbid: + selector: tmdb + tvdbid: + selector: tvdb + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0=false, 1=true + selector: free + case: + 0: 1 # not free + 1: 0 # freeleech + uploadvolumefactor: + # api returns 0=false, 1=true + selector: doubleup + case: + 0: 1 # normal + 1: 2 # double + minimumratio: + text: 1.0 + minimumseedtime: + # 2 day (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# json DBy v0.96 diff --git a/config/prowlarr/Definitions/dark-shadow.yml b/config/prowlarr/Definitions/dark-shadow.yml new file mode 100644 index 0000000..5cd572b --- /dev/null +++ b/config/prowlarr/Definitions/dark-shadow.yml @@ -0,0 +1,205 @@ +--- +id: dark-shadow +name: Dark-Shadow +description: "Dark-Shadow is a GERMAN Private site for TV / MOVIES / GENERAL" +language: de-DE +type: private +encoding: UTF-8 +links: + - https://dark-shadow.me/ +legacylinks: + - https://dark-shadow.ml/ + - https://projekt.dark-shadow.me/ + +caps: + categorymappings: + # Movie + - {id: 32, cat: Movies/HD, desc: "Filme HD"} + - {id: 114, cat: Movies/UHD, desc: "Filme UHD"} + - {id: 140, cat: Movies/BluRay, desc: "Filme BluRay"} + - {id: 28, cat: Movies/SD, desc: "Filme SD"} + - {id: 138, cat: Movies, desc: "Filme Pack`s"} + # Serien + - {id: 57, cat: TV/HD, desc: "Serien HD"} + - {id: 139, cat: TV/UHD, desc: "Serien UHD"} + - {id: 60, cat: TV/SD, desc: "Serien SD"} + - {id: 59, cat: TV, desc: "Serien Pack`s"} + # Audio + - {id: 110, cat: Audio/MP3, desc: "Audio MP3"} + - {id: 48, cat: Audio/Lossless, desc: "Audio Flac"} + - {id: 52, cat: Audio, desc: "Audio Pack"} + - {id: 63, cat: Audio/Audiobook, desc: "Audio Hörbuch"} + - {id: 120, cat: Audio/Video, desc: "Audio Videos"} + # Apps + - {id: 12, cat: PC/0day, desc: "Apps Windows"} + - {id: 125, cat: PC/Mac, desc: "Apps Mac-OSX"} + - {id: 11, cat: PC/Mobile-Other, desc: "Apps Mobil"} + - {id: 141, cat: PC/ISO, desc: "Apps Other"} + # Doku + - {id: 14, cat: TV/Documentary, desc: "Doku HD"} + - {id: 15, cat: TV/Documentary, desc: "Doku SD"} + - {id: 123, cat: TV/Documentary, desc: "Doku Pack`s"} + # Spiel + - {id: 17, cat: PC/Games, desc: "Spiel PC"} + - {id: 24, cat: Console, desc: "Spiel Konsole"} + - {id: 126, cat: Console/Other, desc: "Spiel Mobil"} + - {id: 121, cat: Console, desc: "Spiel Wimmelbild"} + # Sport + - {id: 61, cat: TV/Sport, desc: "Sport HD"} + - {id: 62, cat: TV/Sport, desc: "Sport SD"} + - {id: 144, cat: TV/Sport, desc: "Sport Wrestling"} + # ePaper + - {id: 96, cat: Books/Mags, desc: "ePaper Zeitungen"} + - {id: 136, cat: Books/EBook, desc: "ePaper E-Book"} + - {id: 137, cat: Books/Comics, desc: "ePaper Comics"} + # XXX + - {id: 143, cat: XXX/x264, desc: "XXX HD / SD"} + - {id: 75, cat: XXX/Pack, desc: "XXX Pack's"} + - {id: 142, cat: XXX/ImageSet, desc: "XXX Pic's"} + # Internal + - {id: 128, cat: Movies/HD, desc: "Internal Film HD"} + - {id: 129, cat: Movies/SD, desc: "Internal Film SD"} + - {id: 130, cat: TV/HD, desc: "Internal Serien HD"} + - {id: 131, cat: TV/SD, desc: "Internal Serie SD"} + - {id: 132, cat: Other, desc: "Internal Sonstiges"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeds: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: login.php + method: form + form: form[action="/login.php"] + cookies: ["JAVA=OK"] # avoid jscheck redirect + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: div#login_error + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: selection.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 name, 1 descr, 2 both + blah: 0 + orderby: "{{ .Config.sort }}" + sort: "{{ .Config.type }}" + keywordsfilters: + # prefix and postfix percent wildcard as well as replacing spaces between words + - name: re_replace + args: ["\\W+", "%"] + - name: re_replace + args: ["^(.+)$", "%$1%"] + + rows: + selector: "div.selection_wrap{{ if .Config.freeleech }}:root:has(div.onlyup){{ else }}{{ end }}" + + fields: + category_p1: + selector: div.kat_cat_pic_name + category_p2: + selector: div.kat_cat_pic_name_b + categorydesc: + text: "{{ .Result.category_p1 }} {{ .Result.category_p2 }}" + optional: true + default: Internal Sonstiges + title: + selector: a.selection_a + filters: + # remove [REQ] and anything else in [] that prefixes titles + - name: re_replace + args: ["^(\\[.*\\])(.*)", "$2"] + details: + selector: a.selection_a + attribute: href + download: + selector: a[href^="download_ssl.php?torrent="] + attribute: href + poster: + selector: div[id^="details"] img + attribute: src + size: + selector: div.selection_unter_ad + grabs: + selector: div.selection_unter_ae + date_day: + # Heute 13:30:04 + # Gestern 09:10:10 + selector: div.selection_unter_ab:not(:contains(".")) + optional: true + filters: + - name: replace + args: ["Heute", "Today"] + - name: replace + args: ["Gestern", "Yesterday"] + - name: append + args: " +01:00" # CET + date_year: + # 30.02.2018 um 23:12:50 + selector: div.selection_unter_ab:contains(".") + optional: true + filters: + - name: replace + args: [" um", ""] + - name: append + args: " +01:00" # CET + - name: dateparse + args: "dd.MM.yyyy HH:mm:ss zzz" + date: + text: "{{ if or .Result.date_year .Result.date_day }}{{ or .Result.date_year .Result.date_day }}{{ else }}now{{ end }}" + description: + selector: selection_unter_af + seeders: + selector: div.selection_unter_aa + leechers: + selector: div.selection_unter_aaa + downloadvolumefactor: + case: + ":root:has(div.onlyup)": 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 36 hours (as seconds = 36 x 60 x 60) + text: 129600 +# 3xT diff --git a/config/prowlarr/Definitions/datascene-api.yml b/config/prowlarr/Definitions/datascene-api.yml new file mode 100644 index 0000000..f36703a --- /dev/null +++ b/config/prowlarr/Definitions/datascene-api.yml @@ -0,0 +1,200 @@ +--- +id: datascene-api +name: DataScene (API) +description: "DataScene (DS) is a ROMANIAN Private Torrent Tracker for MOVIES / TV / GENERAL" +language: en-US +type: private +encoding: UTF-8 +links: + - https://datascene.xyz/ +legacylinks: + - http://datascene.net/ + - https://datascene.net/ + +caps: + categorymappings: + - {id: 1, cat: Movies/HD, desc: "Movie HD"} + - {id: 23, cat: Movies/HD, desc: "Movies HD Ro"} + - {id: 11, cat: Movies/UHD, desc: "Movies 4K"} + - {id: 12, cat: Movies/UHD, desc: "Movies 4K Ro"} + - {id: 14, cat: Movies/BluRay, desc: "Movies Bluray"} + - {id: 15, cat: Movies/BluRay, desc: "Movies Bluray Ro"} + - {id: 27, cat: Movies/DVD, desc: "DVD"} + - {id: 28, cat: Movies/DVD, desc: "DVD Ro"} + - {id: 19, cat: Movies/SD, desc: "SD"} + - {id: 20, cat: Movies/SD, desc: "SD Ro"} + - {id: 2, cat: TV/HD, desc: "TV HD"} + - {id: 18, cat: TV/HD, desc: "TV HD Ro"} + - {id: 26, cat: TV/SD, desc: "TV SD"} + - {id: 10, cat: TV/SD, desc: "TV SD Ro"} + - {id: 31, cat: TV/SD, desc: "DVD"} + - {id: 32, cat: TV/SD, desc: "DVD Ro"} + - {id: 29, cat: TV/UHD, desc: "TV 4K"} + - {id: 30, cat: TV/UHD, desc: "TV 4K Ro"} + - {id: 22, cat: TV, desc: "TV Pack"} + - {id: 33, cat: TV, desc: "TV Pack Ro"} + - {id: 4, cat: PC/Games, desc: "Game"} + - {id: 3, cat: Audio, desc: "Music"} + - {id: 21, cat: Audio/Video, desc: "Music Video"} + - {id: 7, cat: PC/Mobile-Other, desc: "Mobile"} + - {id: 24, cat: PC, desc: "Linux"} + - {id: 8, cat: Books/EBook, desc: "E-Book"} + - {id: 25, cat: TV/Sport, desc: "Sport"} + - {id: 5, cat: PC/0day, desc: "Application"} + - {id: 13, cat: TV/Anime, desc: "Anime"} + - {id: 6, cat: XXX, desc: "XXX"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + music-search: [q] + book-search: [q] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your DataScene account My Settings page and clicking on the API Key tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + inputs: {} # TODO: remove in v10 + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: "/api/torrents/filter" + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + # if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6 + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + seasonNumber: "{{ .Query.Season }}" + episodeNumber: "{{ .Query.Ep }}" + imdbId: "{{ .Query.IMDBIDShort }}" + tmdbId: "{{ .Query.TMDBID }}" + tvdbId: "{{ .Query.TVDBID }}" + "free[]": "{{ if .Config.freeleech }}100{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + + rows: + selector: data + attribute: attributes + + fields: + category: + selector: category_id + title: + selector: name + details: + selector: details_link + download: + selector: download_link + infohash: + selector: info_hash + poster: + selector: meta.poster + filters: + - name: replace + args: ["https://via.placeholder.com/90x135", ""] + imdbid: + selector: imdb_id + tmdbid: + selector: tmdb_id + tvdbid: + selector: tvdb_id + genre: + selector: meta.genres + filters: + - name: re_replace + args: ["(?i)(All Sex)", "All_Sex"] + - name: re_replace + args: ["(?i)(Science Fiction)", "Science_Fiction"] + - name: re_replace + args: ["(?i)(TV Movie)", "TV_Movie"] + - name: replace + args: [" & ", "_&_"] + description: + text: "{{ .Result.genre }}" + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0%, 25%, 50%, 75%, 100% + selector: freeleech + case: + 0%: 1 # not free + 25%: 0.75 + 50%: 0.5 + 75%: 0.25 + 100%: 0 # freeleech + "*": 0 # catch errors + uploadvolumefactor: + # api returns False, True + selector: double_upload + case: + False: 1 # normal + True: 2 # double +# global MR is 0.4 but torrents must be seeded for 7 days regardless of ratio +# minimumratio: +# text: 0.4 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# json UNIT3D 7.2.0 diff --git a/config/prowlarr/Definitions/deildu.yml b/config/prowlarr/Definitions/deildu.yml new file mode 100644 index 0000000..0b0347a --- /dev/null +++ b/config/prowlarr/Definitions/deildu.yml @@ -0,0 +1,125 @@ +--- +id: deildu +name: Deildu +description: "Deildu is an Icelandic Semi-Private site for TV / MOVIES / GENERAL" +language: is-IS +type: semi-private +encoding: iso-8859-1 +links: + - https://deildu.net/ + +caps: + categorymappings: + - {id: 15, cat: TV/Anime, desc: "Anime"} + - {id: 1, cat: Other, desc: "Other"} + - {id: 5, cat: Movies/DVD, desc: "Movies DVDR"} + - {id: 9, cat: TV/Documentary, desc: "TV - Documentaries"} + - {id: 12, cat: TV/HD, desc: "TV HD"} + - {id: 2, cat: TV/Sport, desc: "Sports"} + - {id: 6, cat: Movies, desc: "Movies"} + - {id: 10, cat: PC/Games, desc: "Games"} + - {id: 3, cat: PC/Mac, desc: "Mac"} + - {id: 7, cat: Movies/Other, desc: "Cartoons"} + - {id: 11, cat: Audio, desc: "Music"} + - {id: 14, cat: PC, desc: "Windows"} + - {id: 4, cat: XXX, desc: "XXX"} + - {id: 8, cat: TV, desc: "TV shows"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + keeplogged: 1 + test: + path: index.php + selector: a[href^="logout.php"] + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # 0 active, 1 incldead, 2 onlydead + incldead: 1 + # 1 = look in description + Lysing: "{{ if .Query.IMDBID }}1{{ else }}{{ end }}" + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + # does not return imdb links + + rows: + selector: table[class="torrentlist"] > tbody > tr:has(a[href*="details.php?id="]) + filters: + - name: andmatch + args: 55 + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: td:nth-child(2) + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php"] + attribute: href + size: + selector: td:nth-child(7) + files: + selector: td:nth-child(4) + grabs: + selector: td:nth-child(8) + seeders: + selector: td:nth-child(9) + leechers: + selector: td:nth-child(10) + date: + selector: td:nth-child(6) + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/demonoid.yml b/config/prowlarr/Definitions/demonoid.yml new file mode 100644 index 0000000..4be19dc --- /dev/null +++ b/config/prowlarr/Definitions/demonoid.yml @@ -0,0 +1,412 @@ +--- +id: demonoid +name: Demonoid +description: "Demonoid is a Semi-Private torrent site for MOVIES / TV / GENERAL" +language: en-US +type: semi-private +encoding: UTF-8 +links: + - https://www.demonoid.is/ + - https://www.dnoid.to/ + - https://www.dnoid.pw/ + - https://demonoid.unblockit.date/ + - https://demonoid.torrentbay.net/ + - https://demonoid.mrunblock.bond/ + - https://demonoid.nocensor.cloud/ +legacylinks: + - https://demonoid.nocensor.biz/ + - https://demonoid.nocensor.sbs/ + - https://demonoid.unblockit.nz/ + - https://demonoid.nocensor.world/ + - https://demonoidevmsgasmojajlhikwetsr4pxzw6xkjt3dgdv6nr5yxvsamid.onion.ws/ + - https://demonoidevmsgasmojajlhikwetsr4pxzw6xkjt3dgdv6nr5yxvsamid.onion.pet/ + - https://demonoid.unblockit.page/ + - https://demonoid.unblockit.pet/ + - https://demonoid.nocensor.lol/ + - https://demonoid.unblockit.ink/ + - https://demonoid.nocensor.art/ + - https://demonoid.unblockit.bio/ + - https://demonoid.unblockit.boo/ + - https://demonoidevmsgasmojajlhikwetsr4pxzw6xkjt3dgdv6nr5yxvsamid.onion.ly/ + - https://demonoidevmsgasmojajlhikwetsr4pxzw6xkjt3dgdv6nr5yxvsamid.tor2web.to/ + - https://demonoidevmsgasmojajlhikwetsr4pxzw6xkjt3dgdv6nr5yxvsamid.tor2web.link/ # Origin is unreachable Error code 523 + - https://demonoid.mrunblock.guru/ + - https://demonoid.torrentbay.to/ + - https://demonoid.unblockit.click/ + - https://demonoid.unblockit.asia/ + - https://demonoid.unblockit.mov/ + - https://demonoid.mrunblock.life/ + - https://demonoid.unblockit.rsvp/ + - https://demonoid.nocensor.click/ + - https://demonoid.unblockit.vegas/ + - https://demonoid.unblockit.esq/ + - https://demonoid.unblockit.zip/ + - https://demonoid.unblockit.foo/ + - https://demonoid.unblockit.ing/ + +caps: + categorymappings: + # fetch these from https://www.demonoid.is/cached/torrent_categories_script.js?v5 + # Everything + - {id: 0, cat: Other/Misc, desc: "Miscellaneous"} + # Applications + - {id: 1, cat: PC/Mobile-Android, desc: "Applications Android"} + - {id: 2, cat: PC/Mobile-iOS, desc: "Applications phone / Ipod touch"} + - {id: 3, cat: PC, desc: "Applications Linux"} + - {id: 4, cat: PC/Mac, desc: "Applications Mac"} + - {id: 5, cat: PC/Mobile-Other, desc: "Applications Mobile phone"} + - {id: 6, cat: PC, desc: "Applications PocketPC"} + - {id: 7, cat: PC/0day, desc: "Applications Windows"} + # Audio Books + - {id: 8, cat: Audio/Audiobook, desc: "Audio Books Action"} + - {id: 9, cat: Audio/Audiobook, desc: "Audio Books Adventure"} + - {id: 10, cat: Audio/Audiobook, desc: "Audio Books Biography"} + - {id: 11, cat: Audio/Audiobook, desc: "Audio Books Childrens"} + - {id: 12, cat: Audio/Audiobook, desc: "Audio Books Computers and Technology"} + - {id: 13, cat: Audio/Audiobook, desc: "Audio Books Contemporary"} + - {id: 14, cat: Audio/Audiobook, desc: "Audio Books Cooking"} + - {id: 15, cat: Audio/Audiobook, desc: "Audio Books Crafts and Hobbies"} + - {id: 16, cat: Audio/Audiobook, desc: "Audio Books Educational"} + - {id: 17, cat: Audio/Audiobook, desc: "Audio Books Fantasy"} + - {id: 18, cat: Audio/Audiobook, desc: "Audio Books Fiction"} + - {id: 19, cat: Audio/Audiobook, desc: "Audio Books General"} + - {id: 20, cat: Audio/Audiobook, desc: "Audio Books History"} + - {id: 21, cat: Audio/Audiobook, desc: "Audio Books Horror"} + - {id: 22, cat: Audio/Audiobook, desc: "Audio Books Humor"} + - {id: 23, cat: Audio/Audiobook, desc: "Audio Books Literary"} + - {id: 24, cat: Audio/Audiobook, desc: "Audio Books Magazine"} + - {id: 25, cat: Audio/Audiobook, desc: "Audio Books Mainstream"} + - {id: 26, cat: Audio/Audiobook, desc: "Audio Books Medicine and Health"} + - {id: 27, cat: Audio/Audiobook, desc: "Audio Books Mystery and Suspense"} + - {id: 28, cat: Audio/Audiobook, desc: "Audio Books Newspaper"} + - {id: 29, cat: Audio/Audiobook, desc: "Audio Books Nonfiction"} + - {id: 30, cat: Audio/Audiobook, desc: "Audio Books Other"} + - {id: 31, cat: Audio/Audiobook, desc: "Audio Books Paranormal"} + - {id: 32, cat: Audio/Audiobook, desc: "Audio Books Religion"} + - {id: 33, cat: Audio/Audiobook, desc: "Audio Books Romance"} + - {id: 34, cat: Audio/Audiobook, desc: "Audio Books RPG"} + - {id: 35, cat: Audio/Audiobook, desc: "Audio Books Sci-Fi"} + - {id: 36, cat: Audio/Audiobook, desc: "Audio Books Self-help"} + - {id: 37, cat: Audio/Audiobook, desc: "Audio Books Suspense"} + - {id: 38, cat: Audio/Audiobook, desc: "Audio Books Textbook"} + - {id: 39, cat: Audio/Audiobook, desc: "Audio Books Thriller"} + - {id: 40, cat: Audio/Audiobook, desc: "Audio Books Western"} + - {id: 41, cat: Audio/Audiobook, desc: "Audio Books Young Adult"} + # Books + - {id: 42, cat: Books/EBook, desc: "Books Action and Adventure"} + - {id: 43, cat: Books/EBook, desc: "Books Biography"} + - {id: 44, cat: Books/EBook, desc: "Books Childrens"} + - {id: 45, cat: Books/EBook, desc: "Books Computers and Technology"} + - {id: 46, cat: Books/EBook, desc: "Books Contemporary"} + - {id: 47, cat: Books/EBook, desc: "Books Cooking"} + - {id: 48, cat: Books/EBook, desc: "Books Crafts and Hobbies"} + - {id: 49, cat: Books/EBook, desc: "Books Educational"} + - {id: 50, cat: Books/EBook, desc: "Books Fantasy"} + - {id: 51, cat: Books/EBook, desc: "Books Fiction"} + - {id: 52, cat: Books/EBook, desc: "Books General"} + - {id: 53, cat: Books/EBook, desc: "Books History"} + - {id: 54, cat: Books/EBook, desc: "Books Horror"} + - {id: 55, cat: Books/EBook, desc: "Books Humor"} + - {id: 56, cat: Books/EBook, desc: "Books Literary"} + - {id: 57, cat: Books/Mags, desc: "Books Magazine"} + - {id: 58, cat: Books/EBook, desc: "Books Mainstream"} + - {id: 59, cat: Books/EBook, desc: "Books Medicine and Health"} + - {id: 60, cat: Books/EBook, desc: "Books Mystery and Suspense"} + - {id: 61, cat: Books/EBook, desc: "Books Newspaper"} + - {id: 62, cat: Books/EBook, desc: "Books Nonfiction"} + - {id: 63, cat: Books/EBook, desc: "Books Other"} + - {id: 64, cat: Books/EBook, desc: "Books Paranormal"} + - {id: 65, cat: Books/EBook, desc: "Books Religion"} + - {id: 66, cat: Books/EBook, desc: "Books Romance"} + - {id: 67, cat: Books/EBook, desc: "Books RPG"} + - {id: 68, cat: Books/EBook, desc: "Books Sci-Fi"} + - {id: 69, cat: Books/EBook, desc: "Books Self-help"} + - {id: 70, cat: Books/EBook, desc: "Books Suspense"} + - {id: 71, cat: Books/EBook, desc: "Books Textbook"} + - {id: 72, cat: Books/EBook, desc: "Books Thriller"} + - {id: 73, cat: Books/EBook, desc: "Books Western"} + - {id: 74, cat: Books/EBook, desc: "Books Young Adult"} + # Comics + - {id: 75, cat: Books/Comics, desc: "Comics Action / Adventure"} + - {id: 76, cat: Books/Comics, desc: "Comics Crime"} + - {id: 77, cat: Books/Comics, desc: "Comics Drama"} + - {id: 78, cat: Books/Comics, desc: "Comics Fantasy"} + - {id: 79, cat: Books/Comics, desc: "Comics Historical fiction"} + - {id: 80, cat: Books/Comics, desc: "Comics Horror"} + - {id: 81, cat: Books/Comics, desc: "Comics Illustrated novel"} + - {id: 82, cat: Books/Comics, desc: "Comics Manga"} + - {id: 83, cat: Books/Comics, desc: "Comics Other"} + - {id: 84, cat: Books/Comics, desc: "Comics Real-Life"} + - {id: 85, cat: Books/Comics, desc: "Comics Sci-Fi"} + - {id: 86, cat: Books/Comics, desc: "Comics Super Hero"} + # Games + - {id: 87, cat: PC, desc: "Games DOS"} + - {id: 88, cat: Console/Other, desc: "Games Dreamcast"} + - {id: 89, cat: Console/Other, desc: "Games Emulators"} + - {id: 90, cat: Console/Other, desc: "Games GameBoy"} + - {id: 91, cat: Console/Other, desc: "Games GameCube"} + - {id: 92, cat: PC, desc: "Games Linux"} + - {id: 93, cat: PC/Mac, desc: "Games Mac"} + - {id: 94, cat: PC/Mobile-Other, desc: "Games Mobile phone"} + - {id: 95, cat: Console/NDS, desc: "Games Nintendo DS"} + - {id: 96, cat: Console/Other, desc: "Games Palm"} + - {id: 97, cat: Console/PS3, desc: "Games Playstation"} + - {id: 98, cat: Console/Other, desc: "Games PocketPC"} + - {id: 99, cat: Console/PSP, desc: "Games PSP"} + - {id: 100, cat: Console/Wii, desc: "Games Wii / Wii U"} + - {id: 101, cat: PC/Games, desc: "Games Windows"} + - {id: 102, cat: Console/XBox, desc: "Games XBox"} + # Anime + - {id: 103, cat: TV/Anime, desc: "Anime Action"} + - {id: 104, cat: TV/Anime, desc: "Anime Adventure"} + - {id: 105, cat: TV/Anime, desc: "Anime Comedy"} + - {id: 106, cat: TV/Anime, desc: "Anime Drama"} + - {id: 107, cat: TV/Anime, desc: "Anime Fantasy"} + - {id: 108, cat: TV/Anime, desc: "Anime Horror"} + - {id: 109, cat: TV/Anime, desc: "Anime Other"} + - {id: 157, cat: TV/Anime, desc: "Anime Romance"} + - {id: 158, cat: TV/Anime, desc: "Anime Sci-Fi"} + # Movies + - {id: 151, cat: Movies, desc: "Movies Action"} + - {id: 110, cat: Movies, desc: "Movies Adventure"} + - {id: 236, cat: Movies, desc: "Movies Animation"} + - {id: 111, cat: Movies, desc: "Movies Biography"} + - {id: 152, cat: Movies, desc: "Movies Comedy"} + - {id: 112, cat: Movies, desc: "Movies Concerts"} + - {id: 113, cat: Movies, desc: "Movies Crime"} + - {id: 114, cat: Movies, desc: "Movies Documentary"} + - {id: 115, cat: Movies, desc: "Movies Drama"} + - {id: 116, cat: Movies, desc: "Movies Family"} + - {id: 153, cat: Movies, desc: "Movies Fantasy"} + - {id: 117, cat: Movies, desc: "Movies Horror"} + - {id: 118, cat: Movies, desc: "Movies Musical"} + - {id: 119, cat: Movies, desc: "Movies Mystery"} + - {id: 120, cat: Movies, desc: "Movies Other"} + - {id: 121, cat: Movies, desc: "Movies Romance"} + - {id: 154, cat: Movies, desc: "Movies Sci-Fi"} + - {id: 159, cat: Movies, desc: "Movies Short-Film"} + - {id: 160, cat: Movies, desc: "Movies Sports"} + - {id: 161, cat: Movies, desc: "Movies Thriller"} + - {id: 162, cat: Movies, desc: "Movies Trailers"} + - {id: 163, cat: Movies, desc: "Movies War"} + - {id: 164, cat: Movies, desc: "Movies Western"} + # Music + - {id: 122, cat: Audio, desc: "Music Alternative"} + - {id: 123, cat: Audio, desc: "Music Bluegrass"} + - {id: 124, cat: Audio, desc: "Music Blues"} + - {id: 125, cat: Audio, desc: "Music Childrens"} + - {id: 126, cat: Audio, desc: "Music Christian"} + - {id: 127, cat: Audio, desc: "Music Classical"} + - {id: 128, cat: Audio, desc: "Music Comedy"} + - {id: 129, cat: Audio, desc: "Music Contemporary African"} + - {id: 130, cat: Audio, desc: "Music Country"} + - {id: 131, cat: Audio, desc: "Music Dance / Disco"} + - {id: 132, cat: Audio, desc: "Music Drum and Bass"} + - {id: 133, cat: Audio, desc: "Music Electro / Techno"} + - {id: 134, cat: Audio, desc: "Music Folk"} + - {id: 165, cat: Audio, desc: "Music Gospel"} + - {id: 166, cat: Audio, desc: "Music Grunge"} + - {id: 167, cat: Audio, desc: "Music Hip-Hop / Rap"} + - {id: 168, cat: Audio, desc: "Music Indie"} + - {id: 169, cat: Audio, desc: "Music Industrial"} + - {id: 170, cat: Audio, desc: "Music J-Pop"} + - {id: 171, cat: Audio, desc: "Music Jazz"} + - {id: 172, cat: Audio, desc: "Music Latin American"} + - {id: 173, cat: Audio, desc: "Music Melodic"} + - {id: 174, cat: Audio, desc: "Music Metal"} + - {id: 175, cat: Audio, desc: "Music Other"} + - {id: 176, cat: Audio, desc: "Music Pop"} + - {id: 177, cat: Audio, desc: "Music Punk"} + - {id: 178, cat: Audio, desc: "Music Radio Show"} + - {id: 179, cat: Audio, desc: "Music Reggae"} + - {id: 180, cat: Audio, desc: "Music Rhythm and blues"} + - {id: 181, cat: Audio, desc: "Music Rock"} + - {id: 182, cat: Audio, desc: "Music Soul"} + - {id: 183, cat: Audio, desc: "Music Soundtrack"} + - {id: 184, cat: Audio, desc: "Music Trance"} + - {id: 185, cat: Audio, desc: "Music Trip Hop"} + # Music Videos + - {id: 135, cat: Audio/Video, desc: "Music Videos Alternative"} + - {id: 136, cat: Audio/Video, desc: "Music Videos Bluegrass"} + - {id: 137, cat: Audio/Video, desc: "Music Videos Blues"} + - {id: 138, cat: Audio/Video, desc: "Music Videos Childrens"} + - {id: 139, cat: Audio/Video, desc: "Music Videos Christian"} + - {id: 186, cat: Audio/Video, desc: "Music Videos Classical"} + - {id: 187, cat: Audio/Video, desc: "Music Videos Comedy"} + - {id: 188, cat: Audio/Video, desc: "Music Videos Contemporary African"} + - {id: 189, cat: Audio/Video, desc: "Music Videos Country"} + - {id: 190, cat: Audio/Video, desc: "Music Videos Dance / Disco"} + - {id: 191, cat: Audio/Video, desc: "Music Videos Drum and Bass"} + - {id: 192, cat: Audio/Video, desc: "Music Videos Electro / Techno"} + - {id: 193, cat: Audio/Video, desc: "Music Videos Folk"} + - {id: 194, cat: Audio/Video, desc: "Music Videos Gospel"} + - {id: 195, cat: Audio/Video, desc: "Music Videos Grunge"} + - {id: 196, cat: Audio/Video, desc: "Music Videos Hip-Hop / Rap"} + - {id: 197, cat: Audio/Video, desc: "Music Videos Indie"} + - {id: 198, cat: Audio/Video, desc: "Music Videos Industrial"} + - {id: 199, cat: Audio/Video, desc: "Music Videos J-Pop"} + - {id: 200, cat: Audio/Video, desc: "Music Videos Jazz"} + - {id: 201, cat: Audio/Video, desc: "Music Videos Latin American"} + - {id: 202, cat: Audio/Video, desc: "Music Videos Melodic"} + - {id: 203, cat: Audio/Video, desc: "Music Videos Metal"} + - {id: 204, cat: Audio/Video, desc: "Music Videos Other"} + - {id: 205, cat: Audio/Video, desc: "Music Videos Pop"} + - {id: 206, cat: Audio/Video, desc: "Music Videos Punk"} + - {id: 207, cat: Audio/Video, desc: "Music Videos Radio Show"} + - {id: 208, cat: Audio/Video, desc: "Music Videos Reggae"} + - {id: 209, cat: Audio/Video, desc: "Music Videos Rhythm and blues"} + - {id: 210, cat: Audio/Video, desc: "Music Videos Rock"} + - {id: 211, cat: Audio/Video, desc: "Music Videos Soul"} + - {id: 212, cat: Audio/Video, desc: "Music Videos Soundtrack"} + - {id: 213, cat: Audio/Video, desc: "Music Videos Trance"} + - {id: 214, cat: Audio/Video, desc: "Music Videos Trip Hop"} + # Pictures + - {id: 140, cat: Other, desc: "Pictures Art"} + - {id: 141, cat: Other, desc: "Pictures Commercial"} + - {id: 142, cat: Other, desc: "Pictures Glamour"} + - {id: 215, cat: Other, desc: "Pictures Other"} + - {id: 216, cat: Other, desc: "Pictures Photojournalism"} + - {id: 217, cat: Other, desc: "Pictures Snapshots"} + - {id: 218, cat: Other, desc: "Pictures Sports"} + - {id: 219, cat: Other, desc: "Pictures Wildlife"} + # TV + - {id: 155, cat: TV, desc: "TV Action"} + - {id: 143, cat: TV, desc: "TV Adventure"} + - {id: 144, cat: TV, desc: "TV Biography"} + - {id: 145, cat: TV, desc: "TV Cartoons"} + - {id: 146, cat: TV, desc: "TV Comedy"} + - {id: 147, cat: TV, desc: "TV Concerts"} + - {id: 148, cat: TV, desc: "TV Crime"} + - {id: 149, cat: TV, desc: "TV Documentary"} + - {id: 156, cat: TV, desc: "TV Drama"} + - {id: 220, cat: TV, desc: "TV Family"} + - {id: 221, cat: TV, desc: "TV Fantasy"} + - {id: 222, cat: TV, desc: "TV Horror"} + - {id: 223, cat: TV, desc: "TV Musical"} + - {id: 224, cat: TV, desc: "TV Mystery"} + - {id: 225, cat: TV, desc: "TV Other"} + - {id: 226, cat: TV, desc: "TV Reality"} + - {id: 227, cat: TV, desc: "TV Romance"} + - {id: 228, cat: TV, desc: "TV Sci-Fi"} + - {id: 229, cat: TV, desc: "TV Short film"} + - {id: 230, cat: TV, desc: "TV Sports"} + - {id: 231, cat: TV, desc: "TV Talk show"} + - {id: 232, cat: TV, desc: "TV Thriller"} + - {id: 233, cat: TV, desc: "TV Trailers"} + - {id: 234, cat: TV, desc: "TV War"} + - {id: 235, cat: TV, desc: "TV Western"} + # cat 7 Miscellaneous has no subcats + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Access this tracker with your browser
  2. click on the Apply Filter button on the page to invoke the search and solve the challenge
  3. Open the DevTools panel by pressing F12
  4. Select the Network tab
  5. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  6. Refresh the page by pressing F5
  7. Click on the first row entry
  8. Select the Headers tab on the Right panel
  9. Find 'cookie:' in the Request Headers section
  10. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: sort + type: select + label: Sort requested from site + default: _ + options: + _: created + S: seeders desc + s: seeders asc + B: size desc + b: size asc + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: / + selector: a[href^="/account_handler.php"] + +download: + infohash: + hash: + selector: tr:has(td:contains("Torrent hash")) + filters: + # 907617B7 070AACB6 08CC213C 5277368D 217C1666 + - name: replace + args: [" ", ""] + - name: regexp + args: ([A-F|0-9]{40}) + title: + selector: td.ctable_header + filters: + - name: replace + args: ["Details for ", ""] + +search: + paths: + # https://www.demonoid.is/files/?category=0&subcategory=0&quality=0&seeded=2&external=2&query=&sort=S + # https://www.demonoid.is/files/?c154&language=0&quality=0&seeded=2&query=world&to=1&sort= + # https://www.demonoid.is/files/?seeded=2&language=0&quality=0&to=1&query=world + - path: files/ + inputs: + $raw: "{{ range .Categories }}c{{.}}&{{end}}" + # 0 seeded, 1 unseeded, 2 both + seeded: 2 + # 0 all + quality: 0 + # 0 Demonoid, 1 External, 2 Both + external: 2 + # search in titles only + to: "{{ if .Query.IMDBID }}{{ else }}1{{ end }}" + query: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + sort: "{{ re_replace .Config.sort \"_\" \"\" }}" + # does not return imdb link in results + + rows: + selector: table.font_12px tbody tr:has(td[class^="tone_1"]):not(:has(script)) + after: 1 + dateheaders: + selector: td.added_today:not(:contains("Sponsored links")) + filters: + - name: replace + args: ["Added ", ""] + - name: replace + args: ["on ", ""] + + fields: + category: + selector: a.subcategory + attribute: href + optional: true + default: 0 + filters: + - name: querystring + args: subcategory + title: + selector: a[href^="/files/details/"] + details: + selector: a[href^="/files/details/"] + attribute: href + download: + selector: a[href^="/files/details/"] + attribute: href + description: + selector: td:nth-last-child(8) + size: + selector: td:nth-last-child(6) + grabs: + selector: td:nth-last-child(4) + seeders: + selector: td:nth-last-child(3) + leechers: + selector: td:nth-last-child(2) + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/desitorrents-api.yml b/config/prowlarr/Definitions/desitorrents-api.yml new file mode 100644 index 0000000..2cb29cc --- /dev/null +++ b/config/prowlarr/Definitions/desitorrents-api.yml @@ -0,0 +1,169 @@ +--- +id: desitorrents-api +name: DesiTorrents (API) +description: "Desitorrents is a Private Torrent Tracker for BOLLYWOOD / TOLLYWOOD / MUSIC" +language: en-US +type: private +encoding: UTF-8 +links: + - https://desitorrents.tv/ + - https://desitorrents.rocks/ + - https://torrent.desi/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Movies"} + - {id: 2, cat: TV, desc: "TV"} + - {id: 3, cat: Audio, desc: "Music"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + music-search: [q] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your DesiTorrents account My Security page and clicking on the API Token tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + inputs: {} # TODO: remove in v10 + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: "/api/torrents/filter" + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + # if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6 + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + seasonNumber: "{{ .Query.Season }}" + episodeNumber: "{{ .Query.Ep }}" + imdbId: "{{ .Query.IMDBIDShort }}" + tmdbId: "{{ .Query.TMDBID }}" + tvdbId: "{{ .Query.TVDBID }}" + "free[]": "{{ if .Config.freeleech }}100{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + + rows: + selector: data + attribute: attributes + + fields: + category: + selector: category_id + title: + selector: name + details: + selector: details_link + download: + selector: download_link + infohash: + selector: info_hash + poster: + selector: meta.poster + filters: + - name: replace + args: ["https://via.placeholder.com/90x135", ""] + imdbid: + selector: imdb_id + tmdbid: + selector: tmdb_id + tvdbid: + selector: tvdb_id + genre: + selector: meta.genres + filters: + - name: re_replace + args: ["(?i)(Science Fiction)", "Science_Fiction"] + - name: re_replace + args: ["(?i)(TV Movie)", "TV_Movie"] + - name: replace + args: [" & ", "_&_"] + description: + text: "{{ .Result.genre }}" + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0%, 25%, 50%, 75%, 100% + selector: freeleech + case: + 0%: 1 # not free + 25%: 0.75 + 50%: 0.5 + 75%: 0.25 + 100%: 0 # freeleech + "*": 0 # catch errors + uploadvolumefactor: + # api returns 0=false, 1=true + selector: double_upload + case: + 0: 1 # normal + 1: 2 # double +# global MR is 0.5 but torrents must be seeded for 7 days regardless of ratio +# minimumratio: +# text: 0.5 + minimumseedtime: + # 7 days (as seconds = 7 x 24 x 60 x 60) + text: 604800 +# json UNIT3D 6.5.0 (custom) diff --git a/config/prowlarr/Definitions/devil-torrents.yml b/config/prowlarr/Definitions/devil-torrents.yml new file mode 100644 index 0000000..cfd5b04 --- /dev/null +++ b/config/prowlarr/Definitions/devil-torrents.yml @@ -0,0 +1,171 @@ +--- +id: devil-torrents +name: Devil-Torrents +description: "Devil-Torrents is a POLISH Semi-Private Torrent Tracker for MOVIES / TV / GENERAL" +language: pl-PL +type: semi-private +encoding: UTF-8 +links: + - https://devil-torrents.pl/ + +caps: + categorymappings: + - {id: 1, cat: Movies/SD, desc: "Filmy XviD/DivX"} + - {id: 748, cat: Movies/UHD, desc: "Filmy 4K"} + - {id: 4, cat: Movies/BluRay, desc: "Filmy Blu-Ray/HD"} + - {id: 642, cat: Movies/HD, desc: "Filmy x264/h264"} + - {id: 596, cat: Movies/HD, desc: "Filmy x265/h265"} + - {id: 3, cat: Movies/DVD, desc: "Filmy DVD"} + - {id: 5, cat: Movies/3D, desc: "Filmy 3D"} + - {id: 2, cat: Movies/HD, desc: "Filmy RMVB"} + - {id: 362, cat: Movies/SD, desc: "Filmy IVO"} + - {id: 7, cat: TV, desc: "TV/Seriale"} + - {id: 702, cat: Movies/SD, desc: "TS/CAM"} + - {id: 8, cat: XXX, desc: "Erotyka"} + - {id: 10, cat: Audio, desc: "Muzyka"} + - {id: 11, cat: PC, desc: "Programy"} + - {id: 12, cat: PC/Mobile-Other, desc: "GSM/PDA"} + - {id: 13, cat: Console, desc: "Konsole"} + - {id: 14, cat: PC/Games, desc: "Gry PC"} + - {id: 15, cat: Movies, desc: "Dla Dzieci"} + - {id: 16, cat: Books, desc: "Książki"} + - {id: 525, cat: PC/Mac, desc: "Mac"} + - {id: 18, cat: PC, desc: "Linux"} + - {id: 19, cat: TV/Sport, desc: "Sport"} + - {id: 699, cat: TV/Anime, desc: "Anime"} + - {id: 21, cat: Other, desc: "Inne"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: multilang + type: checkbox + label: Replace MULTi by another language in release name + default: false + - name: multilanguage + type: select + label: Replace MULTi by this language + default: POLISH + options: + POLISH: POLISH + MULTi POLISH: MULTi POLISH + +login: + path: logowanie + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[src^="img.php?size=3"] + input: vImageCodP + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + returnto: "" + error: + - selector: div#center-side:contains("Logowanie nie") + test: + path: / + selector: a[href$="/logout.php"] + +search: + # https://devil-torrents.pl/szukaj.php?search=%&typ=torrent&c4=1&c748=1 + paths: + - path: szukaj.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + typ: torrent + search: "{{ if .Keywords }}{{ .Keywords }}{{ else }}%{{ end }}" + + rows: + selector: table.test5 > tbody > tr > td > div[id]:has(a[href^="download/"]) + + fields: + category: + selector: div#kategoria-gatunek-1 + case: + "div#kategoria-gatunek-1:contains(\"Filmy XviD/DivX\")": 1 + "div#kategoria-gatunek-1:contains(\"Filmy 4K\")": 748 + "div#kategoria-gatunek-1:contains(\"Filmy Blu-Ray/HD\")": 4 + "div#kategoria-gatunek-1:contains(\"Filmy x264/h264\")": 642 + "div#kategoria-gatunek-1:contains(\"Filmy x265/h265\")": 596 + "div#kategoria-gatunek-1:contains(\"Filmy DVD\")": 3 + "div#kategoria-gatunek-1:contains(\"Filmy 3D\")": 5 + "div#kategoria-gatunek-1:contains(\"Filmy RMVB\")": 2 + "div#kategoria-gatunek-1:contains(\"Filmy IVO\")": 362 + "div#kategoria-gatunek-1:contains(\"TV/Seriale\")": 7 + "div#kategoria-gatunek-1:contains(\"TS/CAM\")": 702 + "div#kategoria-gatunek-1:contains(\"Erotyka\")": 8 + "div#kategoria-gatunek-1:contains(\"Muzyka\")": 10 + "div#kategoria-gatunek-1:contains(\"Programy\")": 11 + "div#kategoria-gatunek-1:contains(\"GSM/PDA\")": 12 + "div#kategoria-gatunek-1:contains(\"Konsole\")": 13 + "div#kategoria-gatunek-1:contains(\"Gry PC\")": 14 + "div#kategoria-gatunek-1:contains(\"Dla Dzieci\")": 15 + "div#kategoria-gatunek-1:contains(\"Książki\")": 16 + "div#kategoria-gatunek-1:contains(\"Mac\")": 525 + "div#kategoria-gatunek-1:contains(\"Linux\")": 18 + "div#kategoria-gatunek-1:contains(\"Sport\")": 19 + "div#kategoria-gatunek-1:contains(\"Anime\")": 699 + "div#kategoria-gatunek-1:contains(\"Inne\")": 21 + title_phase1: + selector: a[href^="/torrent/"] + attribute: title + title_multilang: + selector: a[href^="/torrent/"] + attribute: title + filters: + - name: re_replace + args: ["(?i)\\b(MULTI(?!.*(?:POLISH|ENGLISH|\\bPL\\b)))\\b", "{{ .Config.multilanguage }}"] + - name: re_replace + args: ["(?i)\\b(pl)\\b", "POLISH"] + title: + text: "{{ if .Config.multilang }}{{ .Result.title_multilang }}{{ else }}{{ .Result.title_phase1 }}{{ end }}" + details: + selector: a[href^="/torrent/"] + attribute: href + download: + selector: a[href^="download/"] + attribute: href + poster: + selector: img.browse_poster + attribute: src + date: + selector: td.descr3 + filters: + - name: regexp + args: (\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) + - name: append + args: " +01:00" # CET + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + size: + selector: td.descr3 + filters: + - name: regexp + args: (\d{1,4}\.\d{2}\s+?[T|G|M|k]B) + seeders: + selector: font[color="green"] > b, font[color="red"] > b + leechers: + selector: font[color="green"]:nth-of-type(2) > b, font[color="red"]:nth-of-type(2) > b + grabs: + selector: td.descr3 + filters: + - name: regexp + args: (\d{1,4}) razy + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/diablotorrent.yml b/config/prowlarr/Definitions/diablotorrent.yml new file mode 100644 index 0000000..e6bb2df --- /dev/null +++ b/config/prowlarr/Definitions/diablotorrent.yml @@ -0,0 +1,179 @@ +--- +id: diablotorrent +name: Diablo Torrent +description: "Diablo Torrent is a Hungarian Private site for TV / MOVIES / GENERAL" +language: hu-HU +type: private +encoding: UTF-8 +requestDelay: 2 +links: + - https://diablotorrent.net/ + +caps: + categorymappings: + # Film + - {id: 49, cat: Movies/SD, desc: "Film > Cam", default: true} + - {id: 21, cat: Movies/SD, desc: "Film > Cam [magyar]", default: true} + - {id: 101, cat: Movies/SD, desc: "Film > SD/HUN", default: true} + - {id: 102, cat: Movies/SD, desc: "Film > SD/ENG", default: true} + - {id: 103, cat: Movies/HD, desc: "Film > HD/HUN", default: true} + - {id: 104, cat: Movies/HD, desc: "Film > HD/ENG", default: true} + - {id: 105, cat: Movies/DVD, desc: "Film > DVD-R/HUN", default: true} + - {id: 106, cat: Movies/DVD, desc: "Film > DVD-R/ENG", default: true} + # Sorozat + - {id: 107, cat: TV/SD, desc: "Sorozat > SD/HUN", default: true} + - {id: 108, cat: TV/SD, desc: "Sorozat > SD/ENG", default: true} + - {id: 109, cat: TV/SD, desc: "Sorozat > DVD-R/HUN", default: true} + - {id: 110, cat: TV/SD, desc: "Sorozat > DVD-R/ENG", default: true} + - {id: 111, cat: TV/HD, desc: "Sorozat > HD/HUN", default: true} + - {id: 112, cat: TV/HD, desc: "Sorozat > HD/ENG", default: true} + # Pornó + - {id: 34, cat: XXX/DVD, desc: "Pornó > DVD-R", default: false} + - {id: 36, cat: XXX, desc: "Pornó > Képek", default: false} + - {id: 113, cat: XXX/XviD, desc: "Pornó > SD", default: false} + - {id: 114, cat: XXX, desc: "Pornó > HD", default: false} + # Játék + - {id: 12, cat: PC/Games, desc: "Játék > PC", default: true} + - {id: 14, cat: Console/PS4, desc: "Játék > PS", default: true} + - {id: 39, cat: Console/XBox, desc: "Játék > Xbox", default: true} + - {id: 40, cat: Console/Other, desc: "Játék > Egyéb", default: true} + # Zene + - {id: 8, cat: Audio/MP3, desc: "Zene > MP3", default: true} + - {id: 9, cat: Audio/MP3, desc: "Zene > MP3 [magyar]", default: true} + - {id: 37, cat: Audio/Lossless, desc: "Zene > Lossless [magyar]", default: true} + - {id: 38, cat: Audio/Lossless, desc: "Zene > Lossless", default: true} + # Programok + - {id: 16, cat: PC/0day, desc: "Programok > PC", default: true} + - {id: 24, cat: PC/Mobile-Other, desc: "Programok > Mobil", default: true} + - {id: 53, cat: PC/0day, desc: "Programok > Egyéb", default: true} + # Egyéb + - {id: 27, cat: Other, desc: "Egyéb > !! Feltöltési segédlet !!", default: true} + - {id: 29, cat: Other, desc: "Egyéb > Képek", default: true} + # E-Book + - {id: 20, cat: Books, desc: "E-Book > Magyar", default: true} + - {id: 52, cat: Books, desc: "E-Book > Egyéb", default: true} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: sort + type: select + label: Sort requested from site + default: 7 + options: + 1: title + 7: created + 4: seeders + 2: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrent oldalanként: setting to 100 on your account profile. + +login: + path: login + submitpath: login/run + method: form + inputs: + referer: "" + nev: "{{ .Config.username }}" + jelszo: "{{ .Config.password }}" + fsv: 0 + login: 1 + belepes: 1 + rhash: 123 + test: + path: browse + selector: a[href*="logout"] + +search: + paths: + - path: browse + categories: [49, 21, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 12, 14, 39, 40, 8, 9, 37, 38, 16, 24, 53, 27, 29, 20, 52] + - path: browse/1 + categories: [34, 36, 113, 114] + inputs: + $raw: "{{ range .Categories }}category[]={{.}}&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + imdb: "{{ if .Query.IMDBID }}1{{ else }}{{ end }}" + s_alapjan: "{{ .Config.sort }}" + s_sorrend: "{{ .Config.type }}" + + rows: + selector: div.torrent_row, div.torrent_details + after: 1 + + fields: + category: + selector: div.box_category > img + attribute: onclick + filters: + - name: regexp + args: "category\\((\\d+),\\d+\\);" + title: + selector: a.box_name_a > span + details: + selector: a.box_name_a + attribute: href + download: + selector: div.box_download > a + attribute: href + seeders: + selector: div.box_seeders + leechers: + selector: div.box_leechers + grabs: + selector: div.box_completed + files: + selector: div.box_files + date: + selector: div.box_uploaded + filters: + - name: append + args: " +01:00" # CET + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + size: + selector: div.box_size + poster: + selector: a.cover_a + attribute: title + filters: + - name: regexp + args: src='(.*?)' + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + description_text: + selector: div.torrent_row_magyarcim + remove: span.torrent_row_new + description: + case: + img[src="/pic/browse/yes.png"]: "Verified: {{ .Result.description_text}}" + "*": "Unverified: {{ .Result.description_text}}" + downloadvolumefactor: + text: 1 + uploadvolumefactor: + text: 1 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# engine tbd diff --git a/config/prowlarr/Definitions/digitalcore.yml b/config/prowlarr/Definitions/digitalcore.yml new file mode 100644 index 0000000..e88f1fb --- /dev/null +++ b/config/prowlarr/Definitions/digitalcore.yml @@ -0,0 +1,246 @@ +--- +id: digitalcore +name: DigitalCore +description: "DigitalCore is a Private Torrent Tracker for MOVIES / TV / GENERAL" +language: en-US +type: private +encoding: UTF-8 +links: + - https://digitalcore.club/ + +caps: + categorymappings: + - {id: 2, cat: Movies/SD, desc: Movies/SD} + - {id: 1, cat: Movies/DVD, desc: Movies/DVDR} + - {id: 5, cat: Movies/HD, desc: Movies/720p} + - {id: 6, cat: Movies/HD, desc: Movies/1080p} + - {id: 4, cat: Movies/UHD, desc: Movies/2160p} + - {id: 3, cat: Movies/BluRay, desc: Movies/BluRay} + - {id: 38, cat: Movies/UHD, desc: Movies/Bluray/UHD} + - {id: 7, cat: Movies/HD, desc: Movies/PACKS} + - {id: 10, cat: TV/SD, desc: Tv/SD} + - {id: 11, cat: TV/SD, desc: Tv/DVDR} + - {id: 8, cat: TV/HD, desc: Tv/720p} + - {id: 9, cat: TV/HD, desc: Tv/1080p} + - {id: 13, cat: TV/UHD, desc: Tv/2160p} + - {id: 14, cat: TV/HD, desc: Tv/BluRay} + - {id: 12, cat: TV/HD, desc: Tv/PACKS} + - {id: 17, cat: Other, desc: Unknown} + - {id: 18, cat: PC/0day, desc: Apps/0DAY} + - {id: 20, cat: PC/ISO, desc: Apps/PC} + - {id: 21, cat: PC/Mac, desc: Apps/Mac} + - {id: 33, cat: PC, desc: Apps/Tutorials} + - {id: 22, cat: Audio/MP3, desc: Music/MP3} + - {id: 23, cat: Audio/Lossless, desc: Music/FLAC} + - {id: 24, cat: Audio/Video, desc: Music/MTV} + - {id: 29, cat: Audio, desc: Music/PACKS} + - {id: 39, cat: Audio/Video, desc: Music/DVD} + - {id: 40, cat: Audio/Video, desc: Music/Bluray} + - {id: 25, cat: PC/Games, desc: Games/PC} + - {id: 27, cat: PC/Mac, desc: Games/Mac} + - {id: 26, cat: Console, desc: Games/Consoles} + - {id: 43, cat: Console, desc: Games/ROMS} + - {id: 42, cat: XXX/Other, desc: Games/XXX} + - {id: 44, cat: Audio/Audiobook, desc: Audiobooks} + - {id: 28, cat: Books/EBook, desc: Ebooks} + - {id: 30, cat: XXX/SD, desc: XXX/SD} + - {id: 31, cat: XXX, desc: XXX/HD} + - {id: 32, cat: XXX/UHD, desc: XXX/4K} + - {id: 35, cat: XXX/SD, desc: XXX/Movies/SD} + - {id: 36, cat: XXX, desc: XXX/Movies/HD} + - {id: 37, cat: XXX/UHD, desc: XXX/Movies/4K} + - {id: 34, cat: XXX/ImageSet, desc: XXX/Imagesets} + - {id: 41, cat: XXX, desc: XXX/PACKS} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: p2p_releases_only + type: checkbox + label: Search P2P releases only + default: false + - name: unrar_releases_only + type: checkbox + label: Search UNRAR releases only + default: false + - name: sort + type: select + label: Sort requested from site + default: d + options: + d: created + up: seeders + s: size + n: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + +search: + paths: + - path: api/v1/torrents + response: + type: json + noResultsMessage: "" + + inputs: + $raw: "{{ range .Categories }}categories[]={{.}}&{{end}}" + dead: true + extendedDead: true + extendedSearch: false + freeleech: "{{ if .Config.freeleech }}true{{ else }}false{{ end }}" + index: 0 + limit: 100 + order: "{{ .Config.type }}" + p2p: "{{ if .Config.p2p_releases_only }}true{{ else }}{{ end }}" + page: search + searchText: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }} {{ else }}{{ end }}{{ .Keywords }}" + section: all + sort: "{{ .Config.sort }}" + stereoscopic: false + unrar: "{{ if .Config.unrar_releases_only }}true{{ else }}{{ end }}" + watchview: false + + rows: + selector: $ + filters: + - name: andmatch + + fields: + category: + selector: category + title: + selector: name + _id: + selector: id + details: + text: "/torrent/{{ .Result._id }}/" + download: + text: "/api/v1/torrents/download/{{ .Result._id }}" + imdbid: + selector: imdbid2 + imdbid_full: + optional: true + selector: imdbid2 + poster_normal: + optional: true + selector: firstpic + poster_imdb: + optional: true + text: "{{ if .Result.imdbid }}/img/imdb/{{ .Result.imdbid_full }}.jpg{{ else }}{{ end }}" + poster: + text: "{{ if .Result.poster_imdb }}{{ .Result.poster_imdb }}{{ else }}{{ .Result.poster_normal }}{{ end }}" + date: + # 2021-10-27 12:07:22 + selector: added + filters: + - name: append + args: " +02:00" # EET + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + size: + selector: size + files: + selector: numfiles + grabs: + selector: times_completed + seeders: + selector: seeders + leechers: + selector: leechers + downloadvolumefactor: + # api returns 0=false, 1=true + selector: frileech + case: + 0: 1 # not free + 1: 0 # freeleech + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.1 + minimumseedtime: + # 5 days (as seconds = 5 x 24 x 60 x 60) + text: 432000 + title_desc: + optional: true + selector: title + year: + optional: true + selector: year + genre: + selector: genres + _tagline_desc: + optional: true + selector: tagline + _cast_desc: + optional: true + selector: cast + _rating_desc: + optional: true + selector: rating + filters: + - name: re_replace + args: ["^0$", ""] + _section_desc: + optional: true + selector: section + _predate_desc: + selector: preDate + filters: + - name: re_replace + args: ["0000-00-00 00:00:00", ""] + _p2ptag: + selector: p2p + case: + 0: "" + 1: P2P + _unrartag: + selector: unrar + case: + 0: "" + 1: UNRAR + optional: true + _packtag: + selector: pack + case: + 0: "" + 1: Pack + _reqidtag: + selector: reqid + case: + 0: "" + "*": Request + _tag_desc: + optional: true + text: "{{ if .Result._p2ptag }}{{ .Result._p2ptag }}, {{ else }}{{ end }}{{ if .Result._unrartag }}{{ .Result._unrartag }}, {{ else }}{{ end }}{{ if .Result._packtag }}{{ .Result._packtag }}, {{ else }}{{ end }}{{ if .Result._reqidtag }}{{ .Result._reqidtag }}{{ else }}{{ end }}" + filters: + - name: regexp + args: "(.+?), $" + description: + text: "{{ if .Result.title_desc }}Title: {{ .Result.title_desc }}
{{ else }}{{ end }}{{ if .Result.year }}Year: {{ .Result.year }}
{{ else }}{{ end }}{{ if .Result.genre }}Genres: {{ .Result.genre }}
{{ else }}{{ end }}{{ if .Result._tagline_desc }}Tagline: {{ .Result._tagline_desc }}
{{ else }}{{ end }}{{ if .Result._cast_desc }}Cast: {{ .Result._cast_desc }}
{{ else }}{{ end }}{{ if .Result._rating_desc }}Rating: {{ .Result._rating_desc }}
{{ else }}{{ end }}{{ if .Result._tag_desc }}Tags: {{ .Result._tag_desc }}
{{ else }}{{ end }}{{ if .Result._predate_desc }}PRE: {{ .Result._predate_desc }}
{{ else }}{{ end }}{{ if .Result._section_desc }}Section: {{ .Result._section_desc }}{{ else }}{{ end }}" +# json rartracker api v1 diff --git a/config/prowlarr/Definitions/dimeadozen.yml b/config/prowlarr/Definitions/dimeadozen.yml new file mode 100644 index 0000000..f10f2d3 --- /dev/null +++ b/config/prowlarr/Definitions/dimeadozen.yml @@ -0,0 +1,165 @@ +--- +id: dimeadozen +name: DimeADozen +description: "DimeADozen (EzTorrent) is a Private Torrent Tracker for BOOTLEG MUSIC" +language: en-GB +type: private +encoding: UTF-8 +links: + - http://www.dimeadozen.org/ # site does not support https ERR_CONNECTION_REFUSED + +caps: + categorymappings: + - {id: 51, cat: Audio, desc: "Acoustic"} + - {id: 4, cat: Audio, desc: "Alternate"} + - {id: 47, cat: Audio, desc: "Alternate Country"} + - {id: 7, cat: Audio, desc: "Americana"} + - {id: 45, cat: Audio, desc: "Avantgarde"} + - {id: 23, cat: Audio, desc: "Bluegrass"} + - {id: 10, cat: Audio, desc: "Blues"} + - {id: 17, cat: Audio, desc: "Brit Pop"} + - {id: 42, cat: Audio, desc: "Celtic Soul"} + - {id: 24, cat: Audio, desc: "Chanson"} + - {id: 25, cat: Audio, desc: "Classic"} + - {id: 55, cat: Audio, desc: "Classical"} + - {id: 44, cat: Audio, desc: "Club Rock"} + - {id: 3, cat: Audio, desc: "Country"} + - {id: 41, cat: Audio, desc: "Dancefloor"} + - {id: 49, cat: Audio, desc: "Desert Surf"} + - {id: 48, cat: Audio, desc: "Drum'n'Bass"} + - {id: 53, cat: Audio, desc: "Electronica"} + - {id: 26, cat: Audio, desc: "Ethno"} + - {id: 9, cat: Audio, desc: "Folk"} + - {id: 12, cat: Audio, desc: "Funk"} + - {id: 19, cat: Audio, desc: "Garage Rock"} + - {id: 27, cat: Audio, desc: "Gospel"} + - {id: 28, cat: Audio, desc: "Gothic Rock"} + - {id: 40, cat: Audio, desc: "Grunge"} + - {id: 61, cat: Audio, desc: "Hard Rock"} + - {id: 59, cat: Audio, desc: "Hardcore"} + - {id: 34, cat: Audio, desc: "Heavy Metal"} + - {id: 29, cat: Audio, desc: "HipHop"} + - {id: 30, cat: Audio, desc: "House"} + - {id: 31, cat: Audio, desc: "Industrial"} + - {id: 57, cat: Audio, desc: "Irish Folk"} + - {id: 50, cat: Audio, desc: "Jam Bands"} + - {id: 2, cat: Audio, desc: "Jazz"} + - {id: 60, cat: Audio, desc: "Jazz Fusion"} + - {id: 18, cat: Audio, desc: "Kraut Rock"} + - {id: 32, cat: Audio, desc: "Latin Music"} + - {id: 33, cat: Audio, desc: "Mainstream"} + - {id: 46, cat: Audio, desc: "New German Wave"} + - {id: 5, cat: Audio, desc: "New Wave"} + - {id: 14, cat: Audio, desc: "Pop"} + - {id: 13, cat: Audio, desc: "Progressive Rock"} + - {id: 58, cat: Audio, desc: "Psychedelic"} + - {id: 6, cat: Audio, desc: "Punk"} + - {id: 35, cat: Audio, desc: "Rap"} + - {id: 36, cat: Audio, desc: "Rave"} + - {id: 21, cat: Audio, desc: "Reggae"} + - {id: 1, cat: Audio, desc: "Rock"} + - {id: 20, cat: Audio, desc: "Rock'n'Roll"} + - {id: 8, cat: Audio, desc: "Singer/Songwriter"} + - {id: 22, cat: Audio, desc: "Ska"} + - {id: 37, cat: Audio, desc: "Skiffle"} + - {id: 11, cat: Audio, desc: "Soul"} + - {id: 54, cat: Audio, desc: "Southern Rock"} + - {id: 38, cat: Audio, desc: "Swing"} + - {id: 39, cat: Audio, desc: "Techno"} + - {id: 43, cat: Audio, desc: "Tin Pan Alley"} + - {id: 52, cat: Audio, desc: "Unplugged"} + - {id: 15, cat: Audio, desc: "West Coast"} + - {id: 16, cat: Audio, desc: "World Music"} + - {id: 56, cat: Audio, desc: "Zydeco"} + + modes: + search: [q] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + +login: + path: take-login.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + returnto: index.php + logout: "" + error: + - selector: table.message:contains("Error") + test: + path: index.php + selector: a[href="account-logout.php"] + +download: + # download.php/673256/Talk%20Talk%20-%201986-07-05%20Paris.torrent + selectors: + - selector: a[href^="download.php/"] + attribute: href + +search: + paths: + # http://www.dimeadozen.org/torrents-browse.php?search=%2Btalk+%2Bparis&cat=0&incldead=1&searchscope=1 + - path: torrents-browse.php + inputs: + search: "{{ .Keywords }}" + # (empty) active only, 1 incldead + incldead: 1 + # (empty) search in title & filename & descr, 1 title & filename only + searchscope: 1 + keywordsfilters: + - name: re_replace + args: ["(\\w+)", "+$1"] # prepend + to each word + # does not support multi category filtering + # does not support imdbid searches, does not return imdb link in results + # does not support sorting + + rows: + selector: table.torrent > tbody > tr:has(a[href^="torrents-details.php?id="]) + + fields: + category: + selector: a[href^="torrents-browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="torrents-details.php?id="] + details: + selector: a[href^="torrents-details.php?id="] + attribute: href + download: + selector: a[href^="torrents-details.php?id="] + attribute: href + files: + selector: td:nth-child(3) + date: + selector: td:nth-child(5) + filters: + - name: append + args: " -00:00" # GMT + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + size: + selector: td:nth-child(6) + grabs: + selector: td:nth-child(7) + seeders: + selector: td:nth-child(8) + leechers: + selector: td:nth-child(9) + downloadvolumefactor: + text: 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 0.25 +# EzTorrent 0.7 diff --git a/config/prowlarr/Definitions/discfan.yml b/config/prowlarr/Definitions/discfan.yml new file mode 100644 index 0000000..ac57eca --- /dev/null +++ b/config/prowlarr/Definitions/discfan.yml @@ -0,0 +1,187 @@ +--- +id: discfan +name: DiscFan +description: "DiscFan is a CHINESE Private Torrent Tracker for MOVIES / TV" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://discfan.net/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "中国大陆(CHN)"} + - {id: 404, cat: Movies, desc: "中国香港特别行政区(HKG)"} + - {id: 405, cat: Movies, desc: "中国台湾省(TWN)"} + - {id: 402, cat: Movies, desc: "泰国(THA)"} + - {id: 403, cat: Movies, desc: "日本(JPN)"} + - {id: 406, cat: Movies, desc: "韩国(KOR)"} + - {id: 410, cat: Movies, desc: "世界(World)"} + - {id: 411, cat: TV, desc: "剧集(Series)"} + - {id: 414, cat: Audio, desc: "音乐(Music)"} + - {id: 413, cat: TV/Documentary, desc: "记录(Documentary)"} + - {id: 416, cat: TV, desc: "综艺(Variety Show)"} + - {id: 417, cat: TV/Sport, desc: "体育(Sports)"} + - {id: 419, cat: TV/Anime, desc: "动漫(Animation)"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("失敗")) + message: + selector: td.text + test: + path: index.php + selector: a[href*="userdetails.php?id="] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl + search_area: "{{ if .Query.IMDBID }}4{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td:nth-child(5) + seeders: + selector: td:nth-child(6) + leechers: + selector: td:nth-child(7) + grabs: + selector: td:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + category_title: + selector: a[href^="?cat="] > img + attribute: title + description: + selector: td:nth-child(2) + remove: a, img + filters: + - name: prepend + args: "cat={{ .Result.category_title }} - " + minimumratio: + text: 0.9 +# NexusPHP v1.8.8 2023-09-25 diff --git a/config/prowlarr/Definitions/divteam.yml b/config/prowlarr/Definitions/divteam.yml new file mode 100644 index 0000000..bf8cb74 --- /dev/null +++ b/config/prowlarr/Definitions/divteam.yml @@ -0,0 +1,190 @@ +--- +id: divteam +name: DivTeam +description: "DivTeam is a SPANISH Private Torrent Tracker for MOVIES / GENERAL" +language: es-ES +type: private +encoding: UTF-8 +links: + - https://divteam.com/ + +caps: + categorymappings: + - {id: 60, cat: Movies/HD, desc: "MicroHD 720p"} + - {id: 77, cat: Movies/HD, desc: "MicroHD 1080p"} + - {id: 78, cat: Movies/UHD, desc: "MicroHD 4K"} + - {id: 64, cat: TV/HD, desc: "Pack Series"} + - {id: 65, cat: TV/HD, desc: "Pack Series VOSE"} + - {id: 80, cat: Movies/HD, desc: "BDRip X265 1080p"} + - {id: 81, cat: Movies/UHD, desc: "UHDRip x265 4K"} + - {id: 82, cat: Movies/WEB-DL, desc: "Pelis Web-DL 1080"} + - {id: 83, cat: Movies/WEB-DL, desc: "Pelis Web-DL 720"} + - {id: 84, cat: Movies/UHD, desc: "UHD Remux x265"} + - {id: 91, cat: Movies/HD, desc: "BDRip x264"} + - {id: 89, cat: Movies/HD, desc: "BDRemux"} + - {id: 88, cat: Movies/BluRay, desc: "Full HD"} + - {id: 90, cat: Movies/BluRay, desc: "UHD Full"} + - {id: 92, cat: Movies/UHD, desc: "Web-DL UHD"} + - {id: 23, cat: TV/Sport, desc: "Deportes"} + - {id: 20, cat: TV/HD, desc: "Series"} + - {id: 31, cat: TV/HD, desc: "Series VOSE"} + - {id: 69, cat: Movies, desc: "Ciclo Cine Clasico"} + - {id: 70, cat: Movies, desc: "Ciclo Clint Eastwood"} + - {id: 71, cat: Movies, desc: "Ciclo Studio Ghibli"} + - {id: 72, cat: Movies, desc: "Ciclo George A. Romero"} + - {id: 73, cat: Movies, desc: "Saga Fast And Furious"} + - {id: 74, cat: Movies, desc: "Saga Crepúsculo"} + - {id: 75, cat: Movies, desc: "Saga The Purge"} + - {id: 79, cat: Movies, desc: "Saga Star Wars"} + - {id: 76, cat: Movies, desc: "x-men saga"} + - {id: 85, cat: Movies, desc: "Sean Connery"} + - {id: 6, cat: Books/EBook, desc: "EBooks"} + - {id: 58, cat: Books/Mags, desc: "Kiosko"} + - {id: 24, cat: TV/Documentary, desc: "Documentales"} + - {id: 32, cat: TV/Documentary, desc: "Documentales VOSE"} + - {id: 49, cat: Books/Technical, desc: "eLearning"} + - {id: 68, cat: Books/Technical, desc: "eLearning Multimedia"} + - {id: 87, cat: Audio/Audiobook, desc: "Audiolibros"} + - {id: 0, cat: Other, desc: "Otros"} # results can have a category of 0, but searching by category 0 returns all results + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info_cookie + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 3 + options: + 3: created + 5: seeders + 4: size + 2: title + - name: type + type: select + label: Order requested from site + default: 2 + options: + 2: desc + 1: asc + - name: info_results + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + # https://divteam.com/index.php?page=torrents&search=daredevil&category=20;23;31;65;64;60;63;69;70;71;72;73;74;75;76;77;78;80;81;82;83;84&active=1 + - path: index.php + inputs: + page: torrents + category: "{{ range .Categories }}{{.}};{{end}}" + search: "{{ .Keywords }}" + # 0 all, 1 activeonly, 2 deadonly + active: 0 + # 0 title, 1 title&desc, 2 descr, 3 uploaders, 5 gold, 6 silver, 9 2x, 10 3x, 11 4x, 12 5x + options: "{{ if .Config.freeleech }}5{{ else }}0{{ end }}" + order: "{{ .Config.sort }}" + by: "{{ .Config.type }}" + # does not support imdbid search and does not supply imdb link in results. + + rows: + selector: table.table.table-bordered > tbody > tr:has(a[href^="download.php?id="]) + + fields: + download: + selector: a[href^="download.php?id="] + attribute: href + title_vose: + selector: a[href^="index.php?page=torrent-details"][onmouseover]:contains("VOSE") + optional: true + filters: + - name: append + args: " English" + title_notvose: + selector: a[href^="index.php?page=torrent-details"][onmouseover]:not(:contains("VOSE")) + optional: true + filters: + - name: append + args: " MULTi/SPANiSH" # DivTeam doesn't bring languages. Usually Original + Spanish. + - name: re_replace + args: ["\\.+", "."] # More than 1 dot -> . + - name: re_replace + args: ["^\\.", ""] # Delete first dot + - name: replace + args: ["UHDRip", "Bluray-2160p"] # Fix for Radarr + - name: replace + args: ["2160p BDRip", "Bluray-2160p"] # Fix for Radarr + title: + text: "{{ if .Result.title_vose }}{{ .Result.title_vose }}{{ else }}{{ .Result.title_notvose }}{{ end }}" + poster: + selector: a[onmouseover][href^="index.php?page=torrent-details"] + attribute: onmouseover + filters: + - name: regexp + args: "src=(.*?) " + category: + selector: a[href^="index.php?page=torrents&category="] + attribute: href + filters: + - name: querystring + args: category + details: + selector: a[href^="index.php?page=torrent-details"] + attribute: href + size: + selector: td:nth-child(4) + date: + selector: td:nth-child(6) + # auto adjusted by site account profile + filters: + - name: dateparse + args: "dd/MM/yyyy" + seeders: + selector: td:nth-last-child(4) + leechers: + selector: td:nth-last-child(3) + grabs: + selector: td:nth-last-child(2) + downloadvolumefactor: + case: + img[src="images/freeleech.gif"]: 0 + img[src="images/gold.png"]: 0 + img[src="images/silver.png"]: 0.5 + "*": 1 + uploadvolumefactor: + case: + img[src="images/2x.png"]: 2 + img[src="images/3x.png"]: 3 + img[src="images/4x.png"]: 4 + img[src="images/5x.png"]: 5 + "*": 1 + minimumratio: + text: 0.7 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# xbtit customised diff --git a/config/prowlarr/Definitions/dmhy.yml b/config/prowlarr/Definitions/dmhy.yml new file mode 100644 index 0000000..04c4fc9 --- /dev/null +++ b/config/prowlarr/Definitions/dmhy.yml @@ -0,0 +1,97 @@ +--- +id: dmhy +name: dmhy +description: "dmhy is a TAIWANESE Public magnet tracker for ANIME" +language: zh-TW +type: public +encoding: UTF-8 +links: + - https://share.dmhy.org/ + +caps: + categorymappings: + - {id: 2, cat: TV/Anime, desc: "動畫 (Anime)"} + - {id: 31, cat: TV/Anime, desc: "季度全集 (Quarterly Complete)"} + - {id: 3, cat: Books/Comics, desc: "漫畫 (Manga)"} + - {id: 41, cat: TV, desc: "港台原版 (Hong Kong and Taiwan original)"} + - {id: 42, cat: TV, desc: "日文原版 (Japanese original)"} + - {id: 4, cat: Audio, desc: "音樂 (Music)"} + - {id: 43, cat: Audio, desc: "動漫音樂 (Anime Music)"} + - {id: 44, cat: Audio, desc: "同人音樂 (Fan Music)"} + - {id: 15, cat: Audio, desc: "流行音樂 (Pop Music)"} + - {id: 6, cat: TV, desc: "日劇 (Japanese TV drama)"} + - {id: 7, cat: TV/Anime, desc: "RAW"} + - {id: 9, cat: PC/Games, desc: "遊戲 (games)"} + - {id: 17, cat: PC/Games, desc: "電腦遊戲 (computer games)"} + - {id: 18, cat: Console, desc: "電視遊戲 (video games)"} + - {id: 19, cat: Console, desc: "掌機遊戲 (console games)"} + - {id: 20, cat: Console, desc: "網絡遊戲 (online games)"} + - {id: 21, cat: Console, desc: "遊戲周邊 (game periphery)"} + - {id: 12, cat: Other/Misc, desc: "特攝 (special photo)"} + - {id: 1, cat: Other, desc: "其他 (other)"} + # Anime as Movies (Radarr uses t=movie): + - {id: 2, cat: Movies/Other, desc: "動畫 (Anime)"} + - {id: 31, cat: Movies/Other, desc: "季度全集 (Quarterly Complete)"} + - {id: 7, cat: Movies/Other, desc: "RAW"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: flaresolverr + type: info + label: FlareSolverr + default: This site may use Cloudflare DDoS Protection, therefore Prowlarr requires FlareSolverr to access it. + +search: + paths: + - path: topics/list + inputs: + # https://share.dmhy.org/topics/list?keyword=one+piece&sort_id=0&team_id=0&order=date-desc + keyword: "{{ .Keywords }}" + sort_id: 0 + order: date-desc + team_id: 0 + + rows: + selector: table tbody tr:has(a[href^="magnet:?"]) + + fields: + category: + selector: td:nth-child(2) a + attribute: href + filters: + - name: regexp + args: "\\/(\\d+)$" + title: + selector: a[href^="/topics/view/"] + details: + selector: a[href^="/topics/view/"] + attribute: href + download: + selector: a[href^="magnet:?"] + attribute: href + date: + selector: td:nth-child(1) span + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy/MM/dd HH:mm zzz" + size: + selector: td:nth-child(5) + seeders: + selector: td:nth-child(6) + leechers: + selector: td:nth-child(7) + grabs: + selector: td:nth-child(8) + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# tedmind 1.8.1 diff --git a/config/prowlarr/Definitions/docspedia.yml b/config/prowlarr/Definitions/docspedia.yml new file mode 100644 index 0000000..a30b659 --- /dev/null +++ b/config/prowlarr/Definitions/docspedia.yml @@ -0,0 +1,165 @@ +--- +id: docspedia +name: DocsPedia +description: "DocsPedia is a Private Torrent Tracker for E-learning" +language: en-US +type: private +encoding: UTF-8 +links: + - https://www.docspedia.world/ + +caps: + categorymappings: + - {id: 77, cat: PC, desc: "3D Models"} + - {id: 65, cat: Audio, desc: "Audio"} + - {id: 64, cat: Books/EBook, desc: "Books"} + - {id: 66, cat: Books, desc: "Business"} + - {id: 68, cat: Books/Comics, desc: "Comics"} + - {id: 80, cat: Books, desc: "Coooking"} + - {id: 59, cat: TV/Documentary, desc: "Docs/Movies"} + - {id: 60, cat: TV/Documentary, desc: "Docs/TV"} + - {id: 79, cat: TV, desc: "Educational"} + - {id: 71, cat: Other, desc: "Fonts"} + - {id: 72, cat: Books, desc: "IT Books"} + - {id: 57, cat: Books/Mags, desc: "Magazine"} + - {id: 58, cat: Books, desc: "Medicine"} + - {id: 70, cat: Books/EBook, desc: "Occult"} + - {id: 74, cat: Audio, desc: "Podcasts"} + - {id: 69, cat: Other, desc: "PS Resources"} + - {id: 76, cat: Books, desc: "Self-Help"} + - {id: 56, cat: TV/Sport, desc: "Sports"} + - {id: 61, cat: Other, desc: "Tutorials"} + - {id: 81, cat: Books, desc: "Wordpress"} + + modes: + search: [q] + tv-search: [q, season, ep] + book-search: [q] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img.cimage + input: captcha + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: div.subheader:contains("failed") + test: + path: my.php + selector: a[href$="logout.php"] + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 active, 1 incldead, 2 onlydead, 3 freeleech, 4 480p, 5 720p, 6 1080p, 7 4k + incldead: "{{ if .Config.freeleech }}3{{ else }}1{{ end }}" + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + + rows: + selector: div.torrentrow:has(a[href^="download.php?torrent="]) + filters: + - name: andmatch + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?torrent="] + attribute: href + poster: + selector: a[onmouseover] + attribute: onmouseover + filters: + - name: regexp + args: src=([^\s]+) + files: + selector: div.torrenttable:nth-last-child(6) + size: + selector: div.torrenttable:nth-last-child(4) + grabs: + selector: div.torrenttable:nth-last-child(3) + seeders: + selector: div.torrenttable:nth-last-child(2) + leechers: + selector: div.torrenttable:nth-last-child(1) + downloadvolumefactor: + case: + img[src$="images/free.png"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + date_day: + remove: a + # Today 02:40 PM + # Yesterday 09:10 AM + selector: div.torrenttable:nth-child(2):contains("day") + # auto adjusted by site account profile + optional: true + date_year: + remove: a + # Jul 4 2019 08:04 AM + selector: div.torrenttable:nth-child(2):not(:contains("day")) + # auto adjusted by site account profile + optional: true + filters: + - name: dateparse + args: "MMM d yyyy hh:mm tt" + date: + text: "{{ if or .Result.date_day .Result.date_year }}{{ or .Result.date_day .Result.date_year }}{{ else }}now{{ end }}" + minimumratio: + text: 1.0 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# TBdev diff --git a/config/prowlarr/Definitions/dreamingtree.yml b/config/prowlarr/Definitions/dreamingtree.yml new file mode 100644 index 0000000..c3a6842 --- /dev/null +++ b/config/prowlarr/Definitions/dreamingtree.yml @@ -0,0 +1,151 @@ +--- +id: dreamingtree +name: DreamingTree +description: "DreamingTree is a Semi-Private Torrent Tracker for DAVE MATHEWS MUSIC / BOOTLEGS" +language: en-US +type: semi-private +encoding: UTF-8 +links: + - https://dreamingtree.org/ + +caps: + categorymappings: + - {id: 1, cat: Audio, desc: Music} + + modes: + search: [q] + music-search: [q, year, genre] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: time + options: + time: created + seeders: seeders + size: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Covers per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="login.php"] + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + keeplogged: 1 + login: "Log in" + error: + - selector: span.warning + message: + selector: span[class="warning"]:not(:contains("JavaScript")) + test: + path: index.php + selector: a[href^="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}" + searchstr: "{{ .Keywords }}" + # freetorrent: 0 normal, 1 freeleech, 2 neutral leech, 3 either + freetorrent: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + # we can only grab the first release if group_results=1 + group_results: 0 + action: advanced + year: "{{ .Query.Year }}" + taglist: "{{ .Query.Genre }}" + order_by: "{{ .Config.sort }}" + order_way: "{{ .Config.type }}" + searchsubmit: 1 + + rows: + selector: tr.torrent + + fields: + category: + text: 1 + title_artist: + selector: a[href^="artist.php?id="] + optional: true + filters: + - name: append + args: " - " + title_name: + selector: a[href^="torrents.php?id="] + year: + selector: div.group_info.clear + filters: + - name: regexp + args: "\\[(\\d{4})\\]" + title: + text: "{{ .Result.title_artist }}{{ .Result.title_name }} [{{ .Result.year }}]" + details: + selector: a[href^="torrents.php?id="] + attribute: href + poster: + selector: img + attribute: src + filters: + - name: replace + args: ["static/common/noartwork/music.png", ""] + genre: + selector: div.tags + description_info: + selector: div.torrent_info + description: + text: "{{ .Result.description_info }}
{{ .Result.genre }}" + download: + selector: span > a[href^="torrents.php?action=download&id="] + attribute: href + date: + selector: span.time.tooltip + filters: + - name: timeago + size: + selector: td.number_column.nobr + files: + selector: td:nth-last-child(6) + seeders: + selector: td:nth-last-child(2) + leechers: + selector: td:nth-last-child(1) + grabs: + selector: td:nth-last-child(3) + downloadvolumefactor: + case: + div.torrent_info:contains("Freeleech"): 0 + div.torrent_info:contains("Neutral Leech"): 0 + "*": 1 + uploadvolumefactor: + case: + div.torrent_info:contains("Neutral Leech"): 0 + "*": 1 + minimumratio: + text: 0.6 + minimumseedtime: + # 3 days (as seconds = 3 x 24 x 60 x 60) + text: 259200 +# engine n/a diff --git a/config/prowlarr/Definitions/dreamtracker.yml b/config/prowlarr/Definitions/dreamtracker.yml new file mode 100644 index 0000000..a90f286 --- /dev/null +++ b/config/prowlarr/Definitions/dreamtracker.yml @@ -0,0 +1,228 @@ +--- +id: dreamtracker +name: Dream Tracker +description: "Dream Tracker is a GREEK Private tracker for TV / MOVIES / GENERAL" +language: en-US +type: private +encoding: UTF-8 +links: + - https://dream-tracker.net/ + +caps: + categorymappings: + # Anime + - {id: 113, cat: TV/Anime, desc: "Anime"} + - {id: 114, cat: TV/Anime, desc: "Anime Series"} + - {id: 115, cat: Movies/Other, desc: "Anime Movies"} + # VIP + - {id: 122, cat: Other, desc: "Only VIP"} + - {id: 123, cat: Audio, desc: "VIP Music"} + - {id: 124, cat: Movies, desc: "VIP Movies"} + # Kids Stuff + - {id: 1, cat: Movies/Other, desc: "Kids Stuff"} + - {id: 14, cat: Movies/Other, desc: "Cartoon No Subs"} + - {id: 16, cat: Movies/Other, desc: "Cartoon Sub. No Embed."} + - {id: 17, cat: Movies/Other, desc: "Cartoon Sub. Embed."} + - {id: 31, cat: Movies/Other, desc: "Cartoon in Greek "} + - {id: 107, cat: Movies/Other, desc: "Kids in Greek"} + - {id: 120, cat: Movies/Other, desc: "Cartoon Series"} + - {id: 88, cat: Audio/Other, desc: "Music Kids"} + # Movies Subs No Embed. + - {id: 38, cat: Movies, desc: "Movies Subs No Embed."} + - {id: 40, cat: Movies/SD, desc: "DVDscr - PPVRiP - WebRip -Web-DL- TVRiP"} + - {id: 41, cat: Movies/SD, desc: "DVDRrip/R6/R5 Xvid/x264"} + - {id: 42, cat: Movies/SD, desc: "BDRip/BRRip/HDRip/480p"} + - {id: 43, cat: Movies/HD, desc: "HD - 720p"} + - {id: 44, cat: Movies/HD, desc: "HD - 1080p"} + - {id: 104, cat: Movies/HD, desc: "Micro"} + # Movies Subs Embed. + - {id: 45, cat: Movies, desc: "Movies Subs Embed."} + - {id: 47, cat: Movies/SD, desc: "DVDscr - PPVRiP - WebRip - Web-DL-TVRiP"} + - {id: 48, cat: Movies/SD, desc: "DVDRrip/R6/R5 Xvid/x264"} + - {id: 49, cat: Movies/SD, desc: "BDRip/BRRip/HDRip/480p"} + - {id: 50, cat: Movies/HD, desc: "HD - 720p"} + - {id: 51, cat: Movies/HD, desc: "HD - 1080p"} + - {id: 105, cat: Movies/HD, desc: "Micro"} + # Movie Packs + - {id: 90, cat: Movies, desc: "Movie Packs"} + - {id: 91, cat: Movies, desc: "Movie Packs Greek"} + - {id: 106, cat: Movies/Foreign, desc: "Movie Packs Foreign"} + # Movies in Greek + - {id: 56, cat: Movies, desc: "Movies in Greek"} + - {id: 57, cat: Movies, desc: "Movies in Greek"} + - {id: 58, cat: Movies, desc: "Movies Greek All Time Classics"} + - {id: 98, cat: Movies, desc: "Greek Filmographies"} + - {id: 99, cat: Movies/HD, desc: "HD 1080p"} + - {id: 100, cat: Movies/HD, desc: "HD 720p"} + # Movies 3D + 4K + - {id: 97, cat: Movies, desc: "Movies 3D + 4K"} + - {id: 111, cat: Movies/UHD, desc: "Movies 4K"} + - {id: 112, cat: Movies/3D, desc: "Movies 3D"} + # Tv Shows & Series + - {id: 59, cat: TV, desc: "Tv Shows & Series"} + - {id: 62, cat: TV/Foreign, desc: "Tv Shows Foreign"} + - {id: 63, cat: TV, desc: "Tv Shows Greek"} + - {id: 126, cat: TV/Foreign, desc: "Mini Series Foreign"} + - {id: 64, cat: TV/Foreign, desc: "Series Foreign"} + - {id: 65, cat: TV, desc: "Series Greek"} + - {id: 92, cat: TV/Foreign, desc: "Series Foreign Packs"} + - {id: 93, cat: TV, desc: "Series Greek Packs"} + # Sports + - {id: 66, cat: TV/Sport, desc: "Sports"} + - {id: 67, cat: TV/Sport, desc: "Sports"} + # Documentary + - {id: 68, cat: TV/Documentary, desc: "Documentary"} + - {id: 69, cat: TV/Documentary, desc: "Documentary"} + # Applications + - {id: 6, cat: PC/0day, desc: "Applications"} + - {id: 74, cat: PC/0day, desc: "Windows"} + - {id: 73, cat: PC/Mobile-Android, desc: "Applications Mobile"} + # eBooks & Images + - {id: 87, cat: Books/EBook, desc: "eBooks & Images"} + - {id: 83, cat: Books/EBook, desc: "Ebooks"} + - {id: 110, cat: Books/Mags, desc: "EMagazines"} + - {id: 82, cat: Other, desc: "Pics & Images"} + - {id: 119, cat: Audio/Audiobook, desc: "Audio Books"} + # Games + - {id: 2, cat: PC/Games, desc: "Games"} + - {id: 27, cat: PC/Games, desc: "PC"} + # Music + - {id: 7, cat: Audio, desc: "Music"} + - {id: 75, cat: Audio/MP3, desc: "Music Greek"} + - {id: 76, cat: Audio/MP3, desc: "Music Greek Discographies"} + - {id: 116, cat: Audio/Lossless, desc: "Greek Flac"} + - {id: 77, cat: Audio/Foreign, desc: "Music Foreign"} + - {id: 78, cat: Audio/Foreign, desc: "Music Foreign Discographies"} + - {id: 94, cat: Audio/Lossless, desc: "Foreign Flac"} + - {id: 117, cat: Audio, desc: "Compact Disc Club"} + - {id: 20, cat: Audio/Video, desc: "Music Videos"} + - {id: 118, cat: Audio, desc: "Dream Radio Music"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + - name: info + type: info + label: Layout + default: "
  1. Only the English Classic profile is supported.
  2. Make sure to set the Torrent Listing option in your profile to Classic
  3. And set the Language to English
  4. Using the Modern theme will prevent results, and using Greek will prevent upload dates.
" + +login: + path: ?p=home&pid=1 + method: form + form: form#sls_form + submitpath: ajax/login.php + inputs: + action: login + loginbox_membername: "{{ .Config.username }}" + loginbox_password: "{{ .Config.password }}" + loginbox_remember: 1 + selectorinputs: + securitytoken: + selector: "script:contains(\"stKey: \")" + filters: + - name: regexp + args: "stKey: \"(.+?)\"," + error: + - selector: ":contains(\"-ERROR-\")" + test: + path: ?p=home&pid=1 + selector: a[href*="/?p=logout&"] + +search: + paths: + - path: / + inputs: + p: torrents + pid: 10 + $raw: "{{ range .Categories }}cid[]={{.}}&{{end}}" + keywords: "{{ .Keywords }}" + # name, description, both, uploader + search_type: name + + rows: + selector: "table#torrents_table_classic tr:has(td.torrent_name){{ if .Config.freeleech }}:has(img[src$=\"/torrent_free.png\"]){{ else }}{{ end }}" + + fields: + title: + selector: a[href*="?p=torrents&pid=10&action=details"] + category: + selector: div.category_image > a + attribute: href + filters: + - name: querystring + args: cid + details: + selector: a[href*="?p=torrents&pid=10&action=details"] + attribute: href + download: + selector: a[href*="?p=torrents&pid=10&action=download"] + attribute: href + date_day: + # Uploaded Friday at 05:11 by + # Uploaded Today at 00:48 by + # Uploaded Yesterday at 23:57 by + selector: td.torrent_name:contains(" at "):not(:has(abbr[data-time])) + # auto adjusted by site account profile + optional: true + filters: + - name: regexp + args: "Uploaded (.+?) by" + - name: fuzzytime + date_year: + # Uploaded 30-01-2019 15:02 by + selector: td.torrent_name:not(:contains(" at ")):not(:has(abbr[data-time])) + # auto adjusted by site account profile + optional: true + filters: + - name: regexp + args: "Uploaded (.+?) by" + - name: dateparse + args: "dd-MM-yyyy HH:mm" + date_unix: + # within the hour (unix) + selector: abbr[data-time] + attribute: data-time + optional: true + date: + text: "{{ if or .Result.date_day .Result.date_year .Result.date_unix }}{{ or .Result.date_day .Result.date_year .Result.date_unix }}{{ else }}now{{ end }}" + size: + selector: a[rel="torrent_size"] + seeders: + selector: a[rel="torrent_seeders"] + leechers: + selector: a[rel="torrent_leechers"] + grabs: + selector: a[rel="times_completed"] + poster: + selector: a[rel="fancybox"] + attribute: href + downloadvolumefactor: + case: + "img[src$=\"/silver.gif\"]": 0.5 + "img[src$=\"/torrent_free.png\"]": 0 + "*": 1 + uploadvolumefactor: + case: + "img[src$=\"/torrent_multiple_upload.png\"]": 2 + "*": 1 + minimumseedtime: + # 4 days (as seconds = 4 x 24 x 60 x 60) + text: 345600 + minimumratio: + text: 1.0 +# TSUE 2.2 diff --git a/config/prowlarr/Definitions/drugari.yml b/config/prowlarr/Definitions/drugari.yml new file mode 100644 index 0000000..72b0ff1 --- /dev/null +++ b/config/prowlarr/Definitions/drugari.yml @@ -0,0 +1,216 @@ +--- +id: drugari +name: Drugari +description: "Drugari is a CROATIAN Private Torrent Tracker for MOVIES / TV / GENERAL" +language: hr-HR +type: private +encoding: UTF-8 +links: + - http://drugari.org/ # does not support https, ERR_CONNECTION_CLOSED + +caps: + categorymappings: + - {id: 3, cat: TV/Anime, desc: "ANIMIRANI"} + - {id: 4, cat: PC, desc: "Appz"} + - {id: 1, cat: Movies, desc: "BEZ PRAVILA"} + - {id: 39, cat: Movies, desc: "BEZ PREVODA"} + - {id: 41, cat: Movies, desc: "BEZ PREVODA Filmovi"} + - {id: 40, cat: TV, desc: "BEZ PREVODA Serije"} + - {id: 7, cat: TV/Documentary, desc: "DOKUMENTARNI"} + - {id: 18, cat: Movies, desc: "DOMACI FILMOVI"} + - {id: 49, cat: Movies, desc: "DOMACI FILMOVI Predstava"} + - {id: 10, cat: Movies/DVD, desc: "DVD FILMOVI"} + - {id: 37, cat: TV, desc: "Emisije"} + - {id: 8, cat: Movies, desc: "FILM"} + - {id: 34, cat: Movies, desc: "FILM Kolekcije"} + - {id: 56, cat: Movies, desc: "FILM Kratki"} + - {id: 48, cat: Movies, desc: "FILM Ruski Film"} + - {id: 23, cat: Movies/SD, desc: "FILM TS"} + - {id: 24, cat: Movies, desc: "FILM TV RIP"} + - {id: 38, cat: Movies, desc: "FILM- Western"} + - {id: 22, cat: Movies/HD, desc: "FILM x264/x265-Filmovi"} + - {id: 21, cat: Movies/SD, desc: "FILM XviD/Strani Filmovi"} + - {id: 15, cat: Console, desc: "IGRE"} + - {id: 19, cat: Books, desc: "KNJIGE"} + - {id: 53, cat: Audio/Audiobook, desc: "KNJIGE Audio"} + - {id: 52, cat: Books/Mags, desc: "KNJIGE Casopisi"} + - {id: 55, cat: Books/EBook, desc: "KNJIGE pdf"} + - {id: 14, cat: Audio, desc: "MUZIKA"} + - {id: 50, cat: Audio, desc: "MUZIKA Domaca Diskografija"} + - {id: 29, cat: Audio, desc: "MUZIKA DVD Muzika"} + - {id: 33, cat: Audio/Lossless, desc: "MUZIKA FLAC"} + - {id: 35, cat: Audio, desc: "MUZIKA Karaoke"} + - {id: 32, cat: Audio/MP3, desc: "MUZIKA MP3"} + - {id: 31, cat: Audio/Other, desc: "MUZIKA Muzika Ostalo"} + - {id: 51, cat: Audio, desc: "MUZIKA Strana Diskografija"} + - {id: 30, cat: Audio/Video, desc: "MUZIKA Video Muzika"} + - {id: 11, cat: Other, desc: "RAZNO"} + - {id: 20, cat: TV, desc: "SERIJE"} + - {id: 27, cat: TV, desc: "SERIJE Domace Serije"} + - {id: 54, cat: TV, desc: "SERIJE Ruske Serije"} + - {id: 28, cat: TV, desc: "SERIJE Strane Serije"} + - {id: 16, cat: Other, desc: "SLIKE"} + - {id: 12, cat: TV/Sport, desc: "SPORT"} + - {id: 6, cat: Other, desc: "STRANI TORENTI"} + - {id: 5, cat: Other, desc: "STRIP"} + - {id: 13, cat: Other, desc: "UPUTSTVA"} + - {id: 25, cat: XXX, desc: "XXX"} + - {id: 47, cat: XXX, desc: "XXX XXX-Strip"} + - {id: 42, cat: TV, desc: "Za Decu"} + - {id: 43, cat: TV, desc: "Za Decu Edukativni Programi"} + - {id: 44, cat: Console, desc: "Za Decu Igrice"} + - {id: 45, cat: Books, desc: "Za Decu Knjige"} + - {id: 46, cat: Audio, desc: "Za Decu Muzika"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 40 on your account profile. The Default is 30. + - name: info_results + type: info + label: Search results + default: "If you are getting the error Found no results while trying to browse this tracker then first access the site with your browser and read any new mail you may have received. You cannot browse torrents with unread mail outstanding." + +login: + path: login.php? + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img#regimage + input: imagestring + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + logout: "" + error: + - selector: table:contains("Greska") + test: + path: index.php + selector: a[href*="/logout.php?logouthash="] + +download: + before: + path: takethanks.php + method: post + inputs: + torrentid: "{{ .DownloadUri.Query.id }}" + selectors: + - selector: a[href*="download.php?id="] + attribute: href + +search: + paths: + - path: browse.php + keywordsfilters: + - name: re_replace + args: ["[\\s]+", "%"] + inputs: + do: search + keywords: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # t_name, t_description, t_both, t_uploader, t_genre + search_type: "{{ if .Query.IMDBID }}t_genre{{ else }}t_name{{ end }}" + # does not support multi category searching so defaulting to all. + category: 0 + # yes, no + include_dead_torrents: yes + sort: "{{ if .Config.freeleech }}free{{ else }}{{ .Config.sort }}{{ end }}" + order: "{{ if .Config.freeleech }}asc{{ else }}{{ .Config.type }}{{ end }}" + # does not return imdb link in results + + rows: + selector: "table.sortable tr:has(a[href*=\"/download.php?id=\"]){{ if .Config.freeleech }}:has(img[src$=\"/freedownload.gif\"]){{ else }}{{ end }}" + + fields: + category: + selector: a[href*="/browse.php?category="] + attribute: href + filters: + - name: querystring + args: category + title_default: + # is usually abbreaviated + selector: a[href*="/details.php?id="] + title: + # while still abbreviated, is usually longer than the default + selector: div.tooltip-content div + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href*="/details.php?id="] + attribute: href + download: + selector: a[href*="/details.php?id="] + attribute: href + poster: + selector: img[src*="/torrents/images/"] + attribute: src + date: + selector: td:nth-child(2) + # auto adjusted by site account profile + filters: + - name: regexp + args: "(\\d{2}-\\d{2}-\\d{4} \\d{2}:\\d{2})" + - name: dateparse + args: "dd-MM-yyyy HH:mm" + size: + selector: td:nth-last-child(5) + grabs: + selector: td:nth-last-child(4) + seeders: + selector: td:nth-last-child(3) + leechers: + selector: td:nth-last-child(2) + description: + # Wait: 4 h + # Cekanje: 4 h + selector: div.tooltip-content > div:last-child + downloadvolumefactor: + case: + img[src$="/freedownload.gif"]: 0 + img[src$="/silverdownload.gif"]: 0.5 + "*": 1 + uploadvolumefactor: + case: + img[src$="/x2.gif"]: 2 + "*": 1 + minimumratio: + text: 1.1 + minimumseedtime: + # 60 hours (as seconds = 60 x 60 x 60) + text: 216000 +# TS Special Edition v.8.0 diff --git a/config/prowlarr/Definitions/dxp.yml b/config/prowlarr/Definitions/dxp.yml new file mode 100644 index 0000000..b2dc09a --- /dev/null +++ b/config/prowlarr/Definitions/dxp.yml @@ -0,0 +1,216 @@ +--- +id: dxp +name: DXP +description: "Deaf Experts (DXP) is a RUSSIAN Semi-Private Torrent Tracker for MOVIES / TV with Russian Subtitles." +language: ru-RU +type: semi-private +encoding: windows-1251 +links: + - https://dxp.ru/ + +caps: + categorymappings: + - {id: 14, cat: Movies/HD, desc: "Фильмы HDTV"} + - {id: 15, cat: Movies/DVD, desc: "Фильмы DVD"} + - {id: 13, cat: Movies/SD, desc: "Фильмы XviD"} + - {id: 12, cat: Movies/Other, desc: "Мультфильмы"} + - {id: 9, cat: TV/Documentary, desc: "Документальные"} + - {id: 11, cat: TV, desc: "Сериалы"} + - {id: 10, cat: Audio, desc: "Музыка"} + - {id: 16, cat: Books, desc: "Книги"} + - {id: 22, cat: Other, desc: "Картинки"} + - {id: 1, cat: PC, desc: "Приложения Windows"} + - {id: 3, cat: PC, desc: "Приложения Unix/Linux"} + - {id: 4, cat: PC/Mac, desc: "Приложения Mac"} + - {id: 2, cat: PC/Mobile-Other, desc: "Приложения PDA"} + - {id: 5, cat: PC/Games, desc: "Игры PC"} + - {id: 23, cat: PC/Games, desc: "Игры Unix/Linux"} + - {id: 6, cat: Console/PS3, desc: "Игры PlayStation 3"} + - {id: 7, cat: Console/XBox, desc: "Игры X-Box"} + - {id: 8, cat: Console/PSP, desc: "Игры PSP"} + - {id: 18, cat: Other, desc: "Эксклюзивы"} + - {id: 21, cat: Other, desc: "Лавка субтитров"} + - {id: 20, cat: Other, desc: "DEMO"} + - {id: 17, cat: Other/Misc, desc: "VIP"} + - {id: 24, cat: Other/Misc, desc: "SuperVIP"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: stripcyrillic + type: checkbox + label: Strip Cyrillic Letters + default: false + - name: addrussiantotitle + type: checkbox + label: Add RUS to end of all titles to improve language detection by Sonarr and Radarr. Will cause English-only results to be misidentified. + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + login: submit + error: + - selector: div.error + test: + path: index.php + selector: a[href="logout.php"] + +download: + selectors: + - selector: a[href^="download.php?id="] + attribute: href + - selector: a[href^="magnet:?xt="] + attribute: href + +search: + # https://dxp.ru/torrents.php?search=&sort=4&type=desc + # https://dxp.ru/torrents.php?search=&cat=0&incldead=1 + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + incldead: 1 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + + keywordsfilters: + # strip season and/or ep + - name: re_replace + args: ["(?i)\\b(?:[SE]\\d{1,4}){1,2}\\b\\s?", ""] + + rows: + selector: table#loading-table tbody#highlighted tr:has(a[href^="torrents.php?cat="]), table#loading-table tbody#highlighted tr:has(a[href^="details.php?id="]) + after: 1 + + fields: + category: + selector: a[href^="torrents.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + download: + selector: a[href^="torrent-"] + attribute: href + title: + selector: a[href^="torrent-"] + filters: + # normalize to SXXEYY format + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)\\s*(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)", "S$1E$2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?)", "S$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+[CС]езоны?", "S$1"] + - name: re_replace + args: ["(?i)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)", "E$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "E$1"] + - name: re_replace + args: ["(\\([\\p{IsCyrillic}\\W]+\\))|(^[\\p{IsCyrillic}\\W\\d]+\\/ )|([\\p{IsCyrillic} \\-]+,+)|([\\p{IsCyrillic}]+)", "{{ if .Config.stripcyrillic }}{{ else }}$1$2$3$4{{ end }}"] + - name: re_replace + args: ["(?i)\\bHDTV[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bSAT[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bWEB[-\\s]?DL[-\\s]?Rip\\b", "WEB-DL"] + - name: re_replace + args: ["(?i)\\bWEB\\sRip\\b", "WEBRip"] + - name: re_replace + args: ["(?i)\\bWEB\\sDL\\b", "WEB-DL"] + - name: re_replace + args: ["[\\[\\(\\{<«][\\s\\W]*[\\]\\)\\}>»]", ""] + - name: re_replace + args: ["^[\\s&,\\.!\\?\\+\\-_\\|\\/':]+", ""] + - name: re_replace + args: ["(?i)^\\(\\s*([SE]\\d+.*?)\\s*\\)[\\s\\/\\|]*(.+)", "$2 $1"] + - name: append + args: "{{ if .Config.addrussiantotitle }} RUS{{ else }}{{ end }}" + details: + selector: a[href^="torrent-"] + attribute: href + date: + selector: i + filters: + - name: append + args: " +03:00" # MSK + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + files: + selector: td:nth-child(4) + size: + selector: td:nth-child(6) + seeders: + selector: td:nth-child(7) + filters: + - name: split + args: ["|", 0] + leechers: + selector: td:nth-child(7) + filters: + - name: split + args: ["|", 1] + downloadvolumefactor: + case: + a[href="torrents.php?cat=17"]: 1 # vip + a[href="torrents.php?cat=24"]: 1 # super vip + "*": 0 + uploadvolumefactor: + text: 1 + minimumratio: + text: 0.3 + description: + selector: a[href^="torrent-"] +# engine n/a diff --git a/config/prowlarr/Definitions/ebookbay.yml b/config/prowlarr/Definitions/ebookbay.yml new file mode 100644 index 0000000..f80ecbc --- /dev/null +++ b/config/prowlarr/Definitions/ebookbay.yml @@ -0,0 +1,160 @@ +--- +id: ebookbay +name: EBookBay +description: "EBook Bay (EBB) is a Public Torrent Tracker for E-BOOKS" +language: en-US +type: public +encoding: UTF-8 +requestDelay: 2 +links: + - http://ebb.la/ # site does not support https SSL_ERROR_BAD_CERT_DOMAIN + +caps: + categorymappings: + - {id: "Action/Adventure", cat: Books/EBook, desc: "Action/Adventure"} + - {id: "Animals", cat: Books/EBook, desc: "Animals"} + - {id: "Arts", cat: Books/EBook, desc: "Arts"} + - {id: "Audio Books", cat: Audio/Audiobook, desc: "Audio Books"} + - {id: "Beauty", cat: Books/EBook, desc: "Beauty"} + - {id: "Business", cat: Books/EBook, desc: "Business"} + - {id: "Certification", cat: Books/EBook, desc: "Certification"} + - {id: "Children/Kids", cat: Books/EBook, desc: "Children/Kids"} + - {id: "Classic/Literary", cat: Books/EBook, desc: "Classic/Literary"} + - {id: "Comics", cat: Books/Comics, desc: "Comics"} + - {id: "Computer", cat: Books/EBook, desc: "Computer"} + - {id: "Contemporary", cat: Books/EBook, desc: "Contemporary"} + - {id: "Cooking", cat: Books/EBook, desc: "Cooking"} + - {id: "Crafts & Hobbies", cat: Books/EBook, desc: "Crafts & Hobbies"} + - {id: "Education", cat: Books/EBook, desc: "Education"} + - {id: "Entertainment", cat: Books/EBook, desc: "Entertainment"} + - {id: "Fantasy", cat: Books/EBook, desc: "Fantasy"} + - {id: "Gardening", cat: Books/EBook, desc: "Gardening"} + - {id: "Health", cat: Books/EBook, desc: "Health"} + - {id: "Historical Fiction", cat: Books/EBook, desc: "Historical Fiction"} + - {id: "History", cat: Books/EBook, desc: "History"} + - {id: "Horror", cat: Books/EBook, desc: "Horror"} + - {id: "Humorous", cat: Books/EBook, desc: "Humorous"} + - {id: "Internet", cat: Books/EBook, desc: "Internet"} + - {id: "Magazine", cat: Books/EBook, desc: "Magazine"} + - {id: "Marketing", cat: Books/EBook, desc: "Marketing"} + - {id: "Medical", cat: Books/EBook, desc: "Medical"} + - {id: "Mystery/Suspense", cat: Books/EBook, desc: "Mystery/Suspense"} + - {id: "Nonfiction", cat: Books/EBook, desc: "Nonfiction"} + - {id: "Novel", cat: Books/EBook, desc: "Novel"} + - {id: "Other", cat: Books/EBook, desc: "Other"} + - {id: "Paranormal", cat: Books/EBook, desc: "Paranormal"} + - {id: "Political", cat: Books/EBook, desc: "Political"} + - {id: "Real Estate", cat: Books/EBook, desc: "Real Estate"} + - {id: "Reference", cat: Books/EBook, desc: "Reference"} + - {id: "Religion", cat: Books/EBook, desc: "Religion"} + - {id: "Romance", cat: Books/EBook, desc: "Romance"} + - {id: "Sci-Fi", cat: Books/EBook, desc: "Sci-Fi"} + - {id: "Science", cat: Books/EBook, desc: "Science"} + - {id: "Self-Help", cat: Books/EBook, desc: "Self-Help"} + - {id: "Society", cat: Books/EBook, desc: "Society"} + - {id: "Software", cat: Books/EBook, desc: "Software"} + - {id: "Sports", cat: Books/EBook, desc: "Sports"} + - {id: "Technical", cat: Books/EBook, desc: "Technical"} + - {id: "Teen/Young Adult", cat: Books/EBook, desc: "Teen/Young Adult"} + - {id: "Textbook", cat: Books/EBook, desc: "Textbook"} + - {id: "Thriller", cat: Books/EBook, desc: "Thriller"} + - {id: "Travel", cat: Books/EBook, desc: "Travel"} + - {id: "Tutorial", cat: Books/EBook, desc: "Tutorial"} + - {id: "Western", cat: Books/EBook, desc: "Western"} + + modes: + search: [q] + book-search: [q] + music-search: [q] + +settings: [] + +download: + infohash: + hash: + selector: td:contains("Info Hash:") ~ td + filters: + - name: regexp + args: ([A-F|a-f|0-9]{40}) + title: + selector: div#content > div.poststuff > div.postname + filters: + - name: trim + - name: validfilename + +search: + paths: + # with just 5 results per page, try to grab up to 25 results + # http://ebb.la/?s=teeth + # http://ebb.la/page/2/?s=teeth + - path: / + - path: "page/2/" + - path: "page/3/" + - path: "page/4/" + - path: "page/5/" + inputs: + s: "{{ .Keywords }}" + + headers: + User-Agent: ["Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.203"] + + rows: + selector: "div#content > div.poststuff:has(~ div.entry a.download), div#content > div.poststuff ~ div.entry:has(a.download)" + after: 1 + + fields: + category: + selector: span.writer + optional: true + default: Other + filters: + - name: re_replace + args: ["(?i)\\bEbooks?\\b", ""] + - name: regexp + args: "E book under:\\s+(.+?)\\s?\\\xA0" + title: + selector: div.postname a + details: + selector: a.detail + attribute: href + download: + selector: a.detail + attribute: href + poster: + selector: img[src^="http"]:not(img[src*="images/default_cover.jpg"]) + attribute: src + date: + text: now + size: + selector: p:contains("File Size") + optional: true + default: 0 + filters: + - name: regexp + args: "File Size: (.+?)s?$" + seeders: + selector: p:contains("Seeds") + optional: true + default: 0 + filters: + - name: regexp + args: "Seeds: (\\d+)" + leechers: + selector: p:contains("Peers") + optional: true + default: 0 + filters: + - name: regexp + args: "Peers: (\\d+)" + grabs: + selector: p:contains("Completed Downloads") + optional: true + default: 0 + filters: + - name: regexp + args: "Completed Downloads: (\\d+)" + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# WordPress 2.5 diff --git a/config/prowlarr/Definitions/ebooks-shares.yml b/config/prowlarr/Definitions/ebooks-shares.yml new file mode 100644 index 0000000..d78d607 --- /dev/null +++ b/config/prowlarr/Definitions/ebooks-shares.yml @@ -0,0 +1,371 @@ +--- +id: ebooks-shares +name: Ebooks-Shares +description: "Ebooks-Shares is a Private Torrent Tracker for EBOOKS / AUDIOBOOKS" +language: en-US +type: private +encoding: UTF-8 +links: + - https://ebooks-shares.org/ + +caps: + categorymappings: + - {id: 274, cat: Audio/Audiobook, desc: "Audio: Poetry"} + - {id: 1, cat: Audio/Audiobook, desc: "Audio: Adventure"} + - {id: 2, cat: Audio/Audiobook, desc: "Audio: Radio Programs ie Dramas, Talk"} + - {id: 3, cat: Audio/Audiobook, desc: "Audio: Non English"} + - {id: 42, cat: Audio/Audiobook, desc: "Audio: Biography/Memoirs"} + - {id: 4, cat: Audio/Audiobook, desc: "Audio: Business"} + - {id: 5, cat: Audio/Audiobook, desc: "Audio: Childrens"} + - {id: 7, cat: Audio/Audiobook, desc: "Audio: Classics"} + - {id: 41, cat: Audio/Audiobook, desc: "Audio: Comedy"} + - {id: 9, cat: Audio/Audiobook, desc: "Audio: Crime/Mystery/Thriller"} + - {id: 10, cat: Audio/Audiobook, desc: "Audio: Factual"} + - {id: 11, cat: Audio/Audiobook, desc: "Audio: Graphic Audio Books"} + - {id: 43, cat: Audio/Audiobook, desc: "Audio: Historical Fiction"} + - {id: 12, cat: Audio/Audiobook, desc: "Audio: History/Military"} + - {id: 269, cat: Audio/Audiobook, desc: "Audio: History"} + - {id: 14, cat: Audio/Audiobook, desc: "Audio: Horror"} + - {id: 15, cat: Audio/Audiobook, desc: "Audio: Medical"} + - {id: 16, cat: Audio/Audiobook, desc: "Audio: Music"} + - {id: 45, cat: Audio/Audiobook, desc: "Audio: Non-Fict/Ref"} + - {id: 46, cat: Audio/Audiobook, desc: "Audio: Novels"} + - {id: 17, cat: Audio/Audiobook, desc: "Audio: General"} + - {id: 22, cat: Audio/Audiobook, desc: "Audio: Philosophy/Belief"} + - {id: 23, cat: Audio/Audiobook, desc: "Audio: Romance"} + - {id: 24, cat: Audio/Audiobook, desc: "Audio: Sci-Fi/Fantasy"} + - {id: 25, cat: Audio/Audiobook, desc: "Audio: Self-Improvement"} + - {id: 26, cat: Audio/Audiobook, desc: "Audio: Mod. Scholar/TTC"} + - {id: 27, cat: Audio/Audiobook, desc: "Audio: Travel"} + - {id: 33, cat: Audio/Audiobook, desc: "Audio: Tutorials"} + - {id: 34, cat: Audio/Audiobook, desc: "Audio: Western"} + - {id: 35, cat: Audio/Audiobook, desc: "Audio: Young Adult"} + - {id: 275, cat: Audio/Audiobook, desc: "Audio: Language"} + - {id: 276, cat: Audio/Audiobook, desc: "Audio: Military Fiction"} + - {id: 299, cat: Audio/Audiobook, desc: "Audio: Magazines"} + - {id: 301, cat: Audio/Audiobook, desc: "Audio: Collections"} + - {id: 314, cat: Audio/Audiobook, desc: "Audio: Dystopian/Post Apocalyptic Bks"} + - {id: 47, cat: Books/EBook, desc: "Children's: Adventure"} + - {id: 48, cat: Books/EBook, desc: "Children's: Novels"} + - {id: 49, cat: Books/EBook, desc: "Children's: Collections"} + - {id: 50, cat: Books/EBook, desc: "Children's: Educational"} + - {id: 51, cat: Books/EBook, desc: "Children's: Games"} + - {id: 52, cat: Books/EBook, desc: "Children's: General"} + - {id: 283, cat: Books/EBook, desc: "Children's: Sci-Fi/Fantasy"} + - {id: 284, cat: Books/EBook, desc: "Children's: Mystery"} + - {id: 286, cat: Books/EBook, desc: "Children's: Early Years / Picture"} + - {id: 295, cat: Books/EBook, desc: "Children's: Nonfiction"} + - {id: 296, cat: Books/EBook, desc: "Children's: Leveled / Decodable Readers"} + - {id: 288, cat: Books/EBook, desc: "Collections: Same Author"} + - {id: 289, cat: Books/EBook, desc: "Collections: Same Series"} + - {id: 291, cat: Books/EBook, desc: "Collections: Fiction"} + - {id: 292, cat: Books/EBook, desc: "Collections: Non Fiction"} + - {id: 220, cat: Books/Comics, desc: "Comics: Archie"} + - {id: 222, cat: Books/Comics, desc: "Comics: Books & Mags - Comics"} + - {id: 225, cat: Books/Comics, desc: "Comics: ComicStrip Collection"} + - {id: 228, cat: Books/Comics, desc: "Comics: DC"} + - {id: 244, cat: Books/Comics, desc: "Comics: Manga"} + - {id: 245, cat: Books/Comics, desc: "Comics: Marvel"} + - {id: 258, cat: Books/Comics, desc: "Comics: Other Pub - Humor/Satire"} + - {id: 262, cat: Books/Comics, desc: "Comics: Other Pub - Educational"} + - {id: 264, cat: Books/Comics, desc: "Comics: Independent Publishers"} + - {id: 265, cat: Books/Comics, desc: "Comics: General/Misc"} + - {id: 281, cat: Books/Technical, desc: "Computer: Tutorials"} + - {id: 38, cat: Books/Technical, desc: "Computer: Applications"} + - {id: 55, cat: Books/Technical, desc: "Computer: Gaming "} + - {id: 56, cat: Books/Technical, desc: "Computer: General"} + - {id: 57, cat: Books/Technical, desc: "Computer: Graphics"} + - {id: 58, cat: Books/Technical, desc: "Computer: Internet-WWW"} + - {id: 59, cat: Books/Technical, desc: "Computer: Networking"} + - {id: 60, cat: Books/Technical, desc: "Computer: OS/Mac"} + - {id: 61, cat: Books/Technical, desc: "Computer: OS/Other"} + - {id: 62, cat: Books/Technical, desc: "Computer: OS/Windows"} + - {id: 63, cat: Books/Technical, desc: "Computer: Programming "} + - {id: 66, cat: Books/EBook, desc: "Doc/Vid/Tut: Computer"} + - {id: 67, cat: Books/EBook, desc: "Doc/Vid/Tut: Crafts"} + - {id: 68, cat: Books/EBook, desc: "Doc/Vid/Tut: Educational"} + - {id: 69, cat: Books/EBook, desc: "Doc/Vid/Tut: General"} + - {id: 70, cat: Books/EBook, desc: "Doc/Vid/Tut: History"} + - {id: 71, cat: Books/EBook, desc: "Doc/Vid/Tut: Medical/Health"} + - {id: 72, cat: Books/EBook, desc: "Doc/Vid/Tut: Military"} + - {id: 73, cat: Books/EBook, desc: "Doc/Vid/Tut: Modelling"} + - {id: 74, cat: Books/EBook, desc: "Doc/Vid/Tut: Sciences"} + - {id: 75, cat: Books/EBook, desc: "Doc/Vid/Tut: Transportation"} + - {id: 76, cat: Books/EBook, desc: "Doc/Vid/Tut: Woodworking"} + - {id: 287, cat: Books/EBook, desc: "Doc/Vid/Tut: Martial Arts/Boxing/Wrestling"} + - {id: 121, cat: Books/EBook, desc: "Educational: Arts"} + - {id: 122, cat: Books/EBook, desc: "Educational: Astronomy/Cosmology"} + - {id: 123, cat: Books/EBook, desc: "Educational: Biology & Genetics"} + - {id: 124, cat: Books/EBook, desc: "Educational: Chemistry"} + - {id: 125, cat: Books/EBook, desc: "Educational: Culture/Languages"} + - {id: 126, cat: Books/EBook, desc: "Educational: Earth Sciences"} + - {id: 127, cat: Books/EBook, desc: "Educational: Educational"} + - {id: 128, cat: Books/EBook, desc: "Educational: Engineering & Technology "} + - {id: 129, cat: Books/EBook, desc: "Educational: Environmental Studies"} + - {id: 130, cat: Books/EBook, desc: "Educational: General Science Titles"} + - {id: 131, cat: Books/EBook, desc: "Educational: Literature / Writing"} + - {id: 132, cat: Books/EBook, desc: "Educational: Mathematics and Statistics"} + - {id: 133, cat: Books/EBook, desc: "Educational: Medical Texts"} + - {id: 134, cat: Books/EBook, desc: "Educational: Military History"} + - {id: 135, cat: Books/EBook, desc: "Educational: Non-Military History"} + - {id: 136, cat: Books/EBook, desc: "Educational: Paleontology"} + - {id: 137, cat: Books/EBook, desc: "Educational: Physics"} + - {id: 138, cat: Books/EBook, desc: "Educational: Psychology"} + - {id: 139, cat: Books/EBook, desc: "Educational: Student Reference"} + - {id: 297, cat: Books/EBook, desc: "Educational: Life Sciences/Evolution/Human "} + - {id: 77, cat: Books/EBook, desc: "Fiction: Adventure"} + - {id: 78, cat: Books/EBook, desc: "Fiction: Classics"} + - {id: 79, cat: Books/EBook, desc: "Fiction: Collections"} + - {id: 80, cat: Books/EBook, desc: "Fiction: Comedy/Humorous "} + - {id: 81, cat: Books/EBook, desc: "Fiction: Crime/Mystery/Thriller"} + - {id: 302, cat: Books/EBook, desc: "Fiction: Cozy Mysteries"} + - {id: 82, cat: Books/EBook, desc: "Fiction: General Fiction"} + - {id: 83, cat: Books/EBook, desc: "Fiction: Horror"} + - {id: 84, cat: Books/EBook, desc: "Fiction: Military & Historic"} + - {id: 86, cat: Books/EBook, desc: "Fiction: Romance"} + - {id: 87, cat: Books/EBook, desc: "Fiction: Sci-Fi/Fantasy"} + - {id: 88, cat: Books/EBook, desc: "Fiction: Westerns"} + - {id: 270, cat: Books/EBook, desc: "Fiction: Historical "} + - {id: 312, cat: Books/EBook, desc: "Fiction: Various Authors"} + - {id: 303, cat: Books/EBook, desc: "Fiction: Poetry"} + - {id: 313, cat: Books/EBook, desc: "Fiction: Dystopian"} + - {id: 140, cat: Books/EBook, desc: "Hobby/Pastime: Art"} + - {id: 141, cat: Books/EBook, desc: "Hobby/Pastime: Boating"} + - {id: 142, cat: Books/EBook, desc: "Hobby/Pastime: Crafts/Knitting/Sewing"} + - {id: 143, cat: Books/EBook, desc: "Hobby/Pastime: Food & Drink"} + - {id: 144, cat: Books/EBook, desc: "Hobby/Pastime: Games/RPG/Gaming"} + - {id: 145, cat: Books/EBook, desc: "Hobby/Pastime: General Pastimes"} + - {id: 146, cat: Books/EBook, desc: "Hobby/Pastime: Graphic Arts and Design"} + - {id: 147, cat: Books/EBook, desc: "Hobby/Pastime: Health/Lifestyle"} + - {id: 148, cat: Books/EBook, desc: "Hobby/Pastime: Home/Gardening"} + - {id: 149, cat: Books/EBook, desc: "Hobby/Pastime: Metalworking"} + - {id: 150, cat: Books/EBook, desc: "Hobby/Pastime: Modelling"} + - {id: 151, cat: Books/EBook, desc: "Hobby/Pastime: Pets/Vet Science"} + - {id: 152, cat: Books/EBook, desc: "Hobby/Pastime: Photography"} + - {id: 153, cat: Books/EBook, desc: "Hobby/Pastime: Quiz and Crossword Books"} + - {id: 154, cat: Books/EBook, desc: "Hobby/Pastime: Sports"} + - {id: 155, cat: Books/EBook, desc: "Hobby/Pastime: Travel"} + - {id: 156, cat: Books/EBook, desc: "Hobby/Pastime: Woodworking"} + - {id: 157, cat: Books/EBook, desc: "Language Learn: Arabic"} + - {id: 158, cat: Books/EBook, desc: "Language Learn: Chinese"} + - {id: 159, cat: Books/EBook, desc: "Language Learn: English"} + - {id: 160, cat: Books/EBook, desc: "Language Learn: French"} + - {id: 161, cat: Books/EBook, desc: "Language Learn: German"} + - {id: 162, cat: Books/EBook, desc: "Language Learn: Italian"} + - {id: 163, cat: Books/EBook, desc: "Language Learn: Japanese"} + - {id: 164, cat: Books/EBook, desc: "Language Learn: Latin"} + - {id: 165, cat: Books/EBook, desc: "Language Learn: Nordic Lang"} + - {id: 166, cat: Books/EBook, desc: "Language Learn: Oriental Lang"} + - {id: 167, cat: Books/EBook, desc: "Language Learn: Russian"} + - {id: 168, cat: Books/EBook, desc: "Language Learn: Spanish"} + - {id: 169, cat: Books/EBook, desc: "Language Learn: Other Lang"} + - {id: 310, cat: Books/Mags, desc: "Magazines: Woodworking"} + - {id: 311, cat: Books/Mags, desc: "Magazines: Sewing, Knitting and Quilting"} + - {id: 170, cat: Books/Mags, desc: "Magazines : Computer"} + - {id: 171, cat: Books/Mags, desc: "Magazines: Current Events"} + - {id: 172, cat: Books/Mags, desc: "Magazines: Business/Finance "} + - {id: 173, cat: Books/Mags, desc: "Magazines: Electronics"} + - {id: 174, cat: Books/Mags, desc: "Magazines: General/Misc"} + - {id: 175, cat: Books/Mags, desc: "Magazines: Military"} + - {id: 176, cat: Books/Mags, desc: "Magazines: Photography"} + - {id: 177, cat: Books/Mags, desc: "Magazines: Sciences "} + - {id: 178, cat: Books/Mags, desc: "Magazines: Sports"} + - {id: 179, cat: Books/Mags, desc: "Magazines: Technology"} + - {id: 180, cat: Books/Mags, desc: "Magazines: Transportation"} + - {id: 181, cat: Books/EBook, desc: "Military: Aircraft"} + - {id: 182, cat: Books/EBook, desc: "Military: Armour"} + - {id: 183, cat: Books/EBook, desc: "Military: General Military"} + - {id: 184, cat: Books/EBook, desc: "Military: Miscellaneous"} + - {id: 185, cat: Books/EBook, desc: "Military: Naval"} + - {id: 186, cat: Books/Foreign, desc: "Non English Bks: Dutch"} + - {id: 187, cat: Books/Foreign, desc: "Non English Bks: French"} + - {id: 188, cat: Books/Foreign, desc: "Non English Bks: German"} + - {id: 189, cat: Books/Foreign, desc: "Non English Bks: Greek"} + - {id: 190, cat: Books/Foreign, desc: "Non English Bks: Hungarian"} + - {id: 191, cat: Books/Foreign, desc: "Non English Bks: Italian"} + - {id: 192, cat: Books/Foreign, desc: "Non English Bks: Japanese"} + - {id: 194, cat: Books/Foreign, desc: "Non English Bks: Other"} + - {id: 193, cat: Books/Foreign, desc: "Non English Bks: Polish"} + - {id: 195, cat: Books/Foreign, desc: "Non English Bks: Romanian"} + - {id: 196, cat: Books/Foreign, desc: "Non English Bks: Russian"} + - {id: 197, cat: Books/Foreign, desc: "Non English Bks: Scandinavian"} + - {id: 198, cat: Books/Foreign, desc: "Non English Bks: Serbian"} + - {id: 199, cat: Books/Foreign, desc: "Non English Bks: Spanish"} + - {id: 89, cat: Books/EBook, desc: "Non Fict/Ref: Agricultural"} + - {id: 90, cat: Books/EBook, desc: "Non Fict/Ref: Alt. Therapies"} + - {id: 95, cat: Books/EBook, desc: "Non Fict/Ref: Architecture"} + - {id: 91, cat: Books/EBook, desc: "Non Fict/Ref: Auto & Repair"} + - {id: 92, cat: Books/EBook, desc: "Non Fict/Ref: Aviation"} + - {id: 94, cat: Books/EBook, desc: "Non Fict/Ref: Biographies and Memoirs"} + - {id: 96, cat: Books/EBook, desc: "Non Fict/Ref: Business/Finance"} + - {id: 97, cat: Books/EBook, desc: "Non Fict/Ref: Comedy/Humorous"} + - {id: 98, cat: Books/EBook, desc: "Non Fict/Ref: Crime"} + - {id: 99, cat: Books/EBook, desc: "Non Fict/Ref: Criminology"} + - {id: 100, cat: Books/EBook, desc: "Non Fict/Ref: Economics & Math"} + - {id: 102, cat: Books/EBook, desc: "Non Fict/Ref: Electronics"} + - {id: 103, cat: Books/EBook, desc: "Non Fict/Ref: Enc/Dict/Atlas,s"} + - {id: 104, cat: Books/EBook, desc: "Non Fict/Ref: Entertainment"} + - {id: 105, cat: Books/EBook, desc: "Non Fict/Ref: General Ref"} + - {id: 106, cat: Books/EBook, desc: "Non Fict/Ref: Geo & Archaeology"} + - {id: 107, cat: Books/EBook, desc: "Non Fict/Ref: Journ/Current Affairs "} + - {id: 108, cat: Books/EBook, desc: "Non Fict/Ref: Legal"} + - {id: 109, cat: Books/EBook, desc: "Non Fict/Ref: Medical/Health"} + - {id: 110, cat: Books/EBook, desc: "Non Fict/Ref: Motorcycle"} + - {id: 111, cat: Books/EBook, desc: "Non Fict/Ref: Music"} + - {id: 112, cat: Books/EBook, desc: "Non Fict/Ref: Parenting/Family"} + - {id: 113, cat: Books/EBook, desc: "Non Fict/Ref: Philosophy & Belief"} + - {id: 114, cat: Books/EBook, desc: "Non Fict/Ref: Literature / Writing"} + - {id: 115, cat: Books/EBook, desc: "Non Fict/Ref: Political Science"} + - {id: 116, cat: Books/EBook, desc: "Non Fict/Ref: Project Management"} + - {id: 117, cat: Books/EBook, desc: "Non Fict/Ref: Self-Improvement"} + - {id: 118, cat: Books/EBook, desc: "Non Fict/Ref: Sht Music-Tablatures"} + - {id: 119, cat: Books/EBook, desc: "Non Fict/Ref: Sociology/Politics"} + - {id: 120, cat: Books/EBook, desc: "Non Fict/Ref: Transportation"} + - {id: 266, cat: Books/EBook, desc: "Non Fict/Ref: Technology Books"} + - {id: 267, cat: Books/EBook, desc: "Non Fict/Ref: History Books"} + - {id: 271, cat: Books/EBook, desc: "Non Fict/Ref: Collections"} + - {id: 272, cat: Books/EBook, desc: "Non Fict/Ref: DIY (Do It Yourself)"} + - {id: 273, cat: Books/EBook, desc: "Non Fict/Ref: Archaeology"} + - {id: 278, cat: Books/EBook, desc: "Non Fict/Ref: Conspiracy Theory/UFO/Alien Bk"} + - {id: 279, cat: Books/EBook, desc: "Non Fict/Ref: Psychology"} + - {id: 280, cat: Books/EBook, desc: "Non Fict/Ref: Education"} + - {id: 282, cat: Books/EBook, desc: "Non Fict/Ref: Martial Arts/Boxing/Wrestling"} + - {id: 293, cat: Books/EBook, desc: "Non Fict/Ref: Zoology & Veterinary Science"} + - {id: 294, cat: Books/EBook, desc: "Non Fict/Ref: True Stories"} + - {id: 300, cat: Books/EBook, desc: "Non Fict/Ref: Maritime Books (Building,navig"} + - {id: 200, cat: Books/EBook, desc: "Teens: Collections"} + - {id: 201, cat: Books/EBook, desc: "Teens: Educational"} + - {id: 202, cat: Books/EBook, desc: "Teens: Fiction"} + - {id: 203, cat: Books/EBook, desc: "Teens: Non Fiction"} + - {id: 285, cat: Books/EBook, desc: "Teens: Sci-Fi/Fantasy"} + - {id: 305, cat: Books/Other, desc: "VIP: Science Fiction"} + - {id: 307, cat: Books/Other, desc: "VIP: Thriller"} + - {id: 306, cat: Books/Other, desc: "VIP: Mystery"} + - {id: 308, cat: Books/Other, desc: "VIP: Crime"} + - {id: 309, cat: Books/Other, desc: "VIP: Fantasy"} + - {id: 204, cat: Books/Other, desc: "VIP: Collections"} + - {id: 205, cat: Books/Other, desc: "VIP: Audiobooks"} + - {id: 206, cat: Books/Other, desc: "VIP: Comics"} + - {id: 207, cat: Books/Other, desc: "VIP: Computers"} + - {id: 208, cat: Books/Other, desc: "VIP: Documentaries"} + - {id: 209, cat: Books/Other, desc: "VIP: Educational"} + - {id: 210, cat: Books/Other, desc: "VIP: Fiction"} + - {id: 211, cat: Books/Other, desc: "VIP: Hobby/Craft"} + - {id: 212, cat: Books/Other, desc: "VIP: Literature"} + - {id: 213, cat: Books/Other, desc: "VIP: Medical"} + - {id: 214, cat: Books/Other, desc: "VIP: Military"} + - {id: 215, cat: Books/Other, desc: "VIP: Music"} + - {id: 216, cat: Books/Other, desc: "VIP: Non Fiction"} + - {id: 217, cat: Books/Other, desc: "VIP: Original Content"} + - {id: 218, cat: Books/Other, desc: "VIP: RPG"} + + modes: + search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: vip + type: checkbox + label: Include VIP results + default: true + - name: sort + type: select + label: Sort requested from site + default: id + options: + id: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_results + type: info + label: Search results + default: "If you are not getting results, then access the site with your browser and mark as read all PMs." + +login: + path: account-login.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: div.panel:contains("Access Denied") + test: + path: index.php + selector: a[href^="account-logout.php"] + +download: + selectors: + - selector: a[href^="download.php?id="] + attribute: href + +search: + paths: + - path: torrents-search.php + inputs: + search: "{{ if .Keywords }}\"{{ .Keywords }}\"{{ else }}{{ end }}" + # 0 only active 1 incl dead 2 only dead + incldead: 1 + # 0 all 1 not freeleech 2 only freeleech + freeleech: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 all 1 english 2 french 3 german 4 italian 5 japanese 6 spanish 7 russian 8 other + lang: 0 + sort: "{{ .Config.sort }}" + order: "{{ .Config.type }}" + + rows: + selector: "tr.t-row{{ if .Config.vip }}{{ else }}:not(:has(a[href^=\"torrents.php?cat=\"]):contains(\"VIP\")){{ end }}" + + fields: + category: + selector: a[href^="torrents.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="torrents-details.php?id="] + attribute: title + details: + selector: a[href^="torrents-details.php?id="] + attribute: href + download: + selector: a[href^="torrents-details.php?id="] + attribute: href + size: + selector: td:nth-child(5) + seeders: + selector: td:nth-child(6) + leechers: + selector: td:nth-child(7) + description: + selector: td:nth-child(4) + filters: + - name: prepend + args: "uploader: " + date: + text: now + downloadvolumefactor: + case: + img[src="images/free.gif"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 +# engine tbd diff --git a/config/prowlarr/Definitions/ehentai.yml b/config/prowlarr/Definitions/ehentai.yml new file mode 100644 index 0000000..613df96 --- /dev/null +++ b/config/prowlarr/Definitions/ehentai.yml @@ -0,0 +1,69 @@ +--- +id: ehentai +name: E-Hentai +description: "E-Hentai is a Public site for Hentai doujinshi, manga." +language: en-US +type: public +encoding: UTF-8 +requestDelay: 2 +links: + - https://e-hentai.org/ + +settings: [] + +caps: + categorymappings: + - {id: 1, cat: TV/Anime, desc: "Anime"} + + modes: + search: [q] + tv-search: [q, season, ep] + +download: + selectors: + - selector: a[href*="/get/"] + attribute: href + +search: + paths: + - path: torrents.php + - path: torrents.php + inputs: + page: 1 + inputs: + search: "{{ .Keywords }}" + + rows: + selector: table.itg > tbody > tr:has(td) + + fields: + category: + text: 1 + title: + selector: a[href*="/gallerytorrents.php?gid="] + details: + selector: a[href*="/g/"] + attribute: href + download: + selector: a[href*="/gallerytorrents.php?gid="] + attribute: href + date: + selector: td:first-child + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "yyyy-MM-dd HH:mm zzz" + size: + selector: td:nth-child(4) + seeders: + selector: td:nth-child(5) + leechers: + selector: td:nth-child(6) + grabs: + selector: td:nth-child(7) + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/electro-torrent.yml b/config/prowlarr/Definitions/electro-torrent.yml new file mode 100644 index 0000000..084c61f --- /dev/null +++ b/config/prowlarr/Definitions/electro-torrent.yml @@ -0,0 +1,194 @@ +--- +id: electro-torrent +name: Electro-Torrent +description: "Electro-Torrent is a POLISH Semi-Private Torrent Tracker for MOVIES / TV / GENERAL" +language: pl-PL +type: semi-private +encoding: UTF-8 +links: + - https://electro-torrent.pl/ +legacylinks: + - http://electro-torrent.pl/ + +caps: + categorymappings: + # from https://electro-torrent.pl/szukaj.php + # don't forget to update the category case block below + - {id: 1298, cat: Movies/SD, desc: "Filmy - Zwiastuny"} + - {id: 1, cat: Movies/SD, desc: "Filmy XviD/DivX"} + - {id: 769, cat: Movies/HD, desc: "Filmy 1080p AVC"} + - {id: 770, cat: Movies/HD, desc: "Filmy x264/1080p"} + - {id: 4, cat: Movies/HD, desc: "Filmy x264/720p"} + - {id: 642, cat: Movies/HD, desc: "Filmy x264/h264"} + - {id: 723, cat: Movies/UHD, desc: "Filmy 4K UHD"} + - {id: 1160, cat: Movies/UHD, desc: "Filmy x265/2160p"} + - {id: 1116, cat: Movies/HD, desc: "Filmy x265/1080p"} + - {id: 1204, cat: Movies/HD, desc: "Filmy x265/720p"} + - {id: 596, cat: Movies/HD, desc: "Filmy x265/h265"} + - {id: 1072, cat: Movies, desc: "Filmy - WAREZY"} + - {id: 3, cat: Movies/DVD, desc: "Filmy DVD"} + - {id: 5, cat: Movies/3D, desc: "Filmy 3D"} + - {id: 362, cat: Movies/SD, desc: "Filmy IVO"} + - {id: 696, cat: Movies/SD, desc: "Filmy TS/CAM"} + - {id: 1255, cat: TV, desc: "TV/Seriale - Warezy"} + - {id: 7, cat: TV, desc: "TV/Seriale"} + - {id: 8, cat: XXX, desc: "Erotyka"} + - {id: 10, cat: Audio, desc: "Muzyka"} + - {id: 11, cat: PC, desc: "Programy"} + - {id: 12, cat: PC/Mobile-Other, desc: "GSM/PDA"} + - {id: 13, cat: Console, desc: "Konsole"} + - {id: 14, cat: PC/Games, desc: "Gry PC"} + - {id: 1045, cat: PC/Games, desc: "Gry PC - Warezy"} + - {id: 15, cat: Movies, desc: "Dla Dzieci"} + - {id: 16, cat: Books, desc: "Książki"} + - {id: 525, cat: PC/Mac, desc: "Mac"} + - {id: 18, cat: PC, desc: "Linux"} + - {id: 19, cat: TV/Sport, desc: "Sport"} + - {id: 907, cat: TV/Anime, desc: "Anime"} + - {id: 21, cat: Other, desc: "Inne"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: useragent + type: text + label: User-Agent + - name: info_useragent + type: info + label: How to get the User-Agent + default: "
  1. From the same place you fetched the cookie,
  2. Find 'user-agent:' in the Request Headers section
  3. Select and Copy the whole user-agent string (everything after 'user-agent: ') and Paste here.
" + - name: multilang + type: checkbox + label: Replace MULTi by another language in release name + default: false + - name: multilanguage + type: select + label: Replace MULTi by this language + default: POLISH + options: + POLISH: POLISH + MULTi POLISH: MULTi POLISH + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: / + selector: a[href$="/logout.php"] + +search: + # http://electro-torrent.pl/szukaj.php?search=&typ=torrent&cat=0 + headers: + User-Agent: ["{{ .Config.useragent }}"] + paths: + - path: szukaj.php + allowEmptyInputs: true + inputs: + # does not support multi cat selection, defaulting to all + # $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + cat: 0 + typ: torrent + search: "{{ .Keywords }}" + + rows: + selector: table.test5 > tbody > tr > td > div[id]:has(a[href*="/download/"]) + + fields: + category: + selector: div#kategoria-gatunek-1 + case: + "div#kategoria-gatunek-1:contains(\"Filmy - Zwiastuny\")": 1298 + "div#kategoria-gatunek-1:contains(\"Filmy XviD/DivX\")": 1 + "div#kategoria-gatunek-1:contains(\"Filmy 1080p AVC\")": 769 + "div#kategoria-gatunek-1:contains(\"Filmy x264/1080p\")": 770 + "div#kategoria-gatunek-1:contains(\"Filmy x264/720p\")": 4 + "div#kategoria-gatunek-1:contains(\"Filmy x264/h264\")": 642 + "div#kategoria-gatunek-1:contains(\"Filmy 4K UHD\")": 723 + "div#kategoria-gatunek-1:contains(\"Filmy x265/2160p\")": 1160 + "div#kategoria-gatunek-1:contains(\"Filmy x265/1080p\")": 1116 + "div#kategoria-gatunek-1:contains(\"Filmy x265/720p\")": 1204 + "div#kategoria-gatunek-1:contains(\"Filmy x265/h265\")": 596 + "div#kategoria-gatunek-1:contains(\"Filmy - WAREZY\")": 1072 + "div#kategoria-gatunek-1:contains(\"Filmy DVD\")": 3 + "div#kategoria-gatunek-1:contains(\"Filmy 3D\")": 5 + "div#kategoria-gatunek-1:contains(\"Filmy IVO\")": 362 + "div#kategoria-gatunek-1:contains(\"Filmy TS/CAM\")": 696 + "div#kategoria-gatunek-1:contains(\"TV/Seriale - Warezy\")": 1255 + "div#kategoria-gatunek-1:contains(\"TV/Seriale\")": 7 + "div#kategoria-gatunek-1:contains(\"Erotyka\")": 8 + "div#kategoria-gatunek-1:contains(\"Muzyka\")": 10 + "div#kategoria-gatunek-1:contains(\"Programy\")": 11 + "div#kategoria-gatunek-1:contains(\"GSM/PDA\")": 12 + "div#kategoria-gatunek-1:contains(\"Konsole\")": 13 + "div#kategoria-gatunek-1:contains(\"Gry PC - Warezy\")": 1045 + "div#kategoria-gatunek-1:contains(\"Gry PC\")": 14 + "div#kategoria-gatunek-1:contains(\"Dla Dzieci\")": 15 + "div#kategoria-gatunek-1:contains(\"Książki\")": 16 + "div#kategoria-gatunek-1:contains(\"Mac\")": 525 + "div#kategoria-gatunek-1:contains(\"Linux\")": 18 + "div#kategoria-gatunek-1:contains(\"Sport\")": 19 + "div#kategoria-gatunek-1:contains(\"Anime\")": 907 + "div#kategoria-gatunek-1:contains(\"Inne\")": 21 + title_phase1: + selector: a[href^="/torrent/"] + attribute: title + title_multilang: + selector: a[href^="/torrent/"] + attribute: title + filters: + - name: re_replace + args: ["(?i)\\b(MULTI(?!.*(?:POLISH|ENGLISH|\\bPL\\b)))\\b", "{{ .Config.multilanguage }}"] + - name: re_replace + args: ["(?i)\\b(pl)\\b", "POLISH"] + title: + text: "{{ if .Config.multilang }}{{ .Result.title_multilang }}{{ else }}{{ .Result.title_phase1 }}{{ end }}" + details: + selector: a[href^="/torrent/"] + attribute: href + download: + selector: a[href*="/download/"] + attribute: href + poster: + selector: img.browse_poster + attribute: src + date: + selector: td.descr3 + filters: + - name: regexp + args: (\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) + - name: append + args: " +01:00" # CET + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + size: + selector: td.descr3 + filters: + - name: regexp + args: (\d{1,4}\.\d{2}\s+?[T|G|M|k]B) + seeders: + selector: font[color="green"] > b, font[color="red"] > b + leechers: + selector: font[color="green"]:nth-of-type(2) > b, font[color="red"]:nth-of-type(2) > b + grabs: + selector: td.descr3 + filters: + - name: regexp + args: (\d{1,4}) razy + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/empornium.yml b/config/prowlarr/Definitions/empornium.yml new file mode 100644 index 0000000..4f70011 --- /dev/null +++ b/config/prowlarr/Definitions/empornium.yml @@ -0,0 +1,170 @@ +--- +id: empornium +name: Empornium +description: "Empornium (EMP) is a Private Torrent Tracker for 3X" +language: en-US +type: private +encoding: UTF-8 +links: + - https://www.empornium.is/ + - https://www.empornium.sx/ # site forces www. +legacylinks: + - https://www.empornium.me/ + - https://empornium.sx/ + +caps: + categorymappings: + - {id: 1, cat: XXX, desc: "Amateur"} + - {id: 2, cat: XXX, desc: "Anal"} + - {id: 5, cat: XXX, desc: "Asian"} + - {id: 6, cat: XXX, desc: "BBW"} + - {id: 30, cat: XXX, desc: "BDSM"} + - {id: 36, cat: XXX, desc: "Big Ass"} + - {id: 8, cat: XXX, desc: "Big Tits"} + - {id: 7, cat: XXX, desc: "Black"} + - {id: 9, cat: XXX, desc: "Classic"} + - {id: 37, cat: XXX, desc: "Creampie"} + - {id: 10, cat: XXX, desc: "Cumshot"} + - {id: 11, cat: XXX, desc: "DVD-R"} + - {id: 12, cat: XXX, desc: "Fetish"} + - {id: 14, cat: XXX, desc: "Gang Bang / Orgy"} + - {id: 39, cat: XXX, desc: "Gay / Bi"} + - {id: 56, cat: XXX, desc: "Hairy"} + - {id: 35, cat: XXX, desc: "Hardcore"} + - {id: 44, cat: XXX, desc: "HD Porn"} + - {id: 3, cat: XXX, desc: "Hentai / 3D"} + - {id: 25, cat: XXX, desc: "Homemade"} + - {id: 43, cat: XXX, desc: "Interracial"} + - {id: 16, cat: XXX, desc: "Latina"} + - {id: 23, cat: XXX, desc: "Lesbian"} + - {id: 52, cat: XXX, desc: "Lingerie"} + - {id: 27, cat: XXX, desc: "Magazines"} + - {id: 53, cat: XXX, desc: "Manga / Comic"} + - {id: 18, cat: XXX, desc: "Masturbation"} + - {id: 26, cat: XXX, desc: "Mature"} + - {id: 40, cat: XXX, desc: "Megapack"} + - {id: 41, cat: XXX, desc: "Natural Tits"} + - {id: 17, cat: XXX, desc: "Oral"} + - {id: 29, cat: XXX, desc: "Other"} + - {id: 47, cat: XXX, desc: "Parody"} + - {id: 24, cat: XXX, desc: "Paysite"} + - {id: 21, cat: XXX, desc: "Pictures / Images"} + - {id: 50, cat: XXX, desc: "Piss"} + - {id: 55, cat: XXX, desc: "Porn Music Videos"} + - {id: 46, cat: XXX, desc: "Pregnant / Preggo"} + - {id: 51, cat: XXX, desc: "Scat/Puke"} + - {id: 22, cat: XXX, desc: "Siterip"} + - {id: 20, cat: XXX, desc: "Softcore"} + - {id: 49, cat: XXX, desc: "Squirt"} + - {id: 34, cat: XXX, desc: "Straight"} + - {id: 19, cat: XXX, desc: "Teen"} + - {id: 15, cat: XXX, desc: "Transsexual"} + - {id: 45, cat: XXX, desc: "Voyeur"} + - {id: 13, cat: XXX, desc: "XXX Games / Apps"} + + modes: + search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + +login: + path: login + method: form + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + cinfo: "2550|1350|24|-60" + keeploggedin: 1 + error: + - selector: form#loginform > span.warning + test: + path: torrents.php + selector: "#nav_userinfo" + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}" + searchtext: "" + title: "{{ .Keywords }}" + order_by: time + order_way: desc + action: advanced + filter_freeleech: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + filelist: "" + taglist: "" + + rows: + selector: table#torrent_table > tbody > tr[class^="torrent row"]:has(a[href*="action=download"]) + + fields: + download: + selector: a[href^="/torrents.php?action=download&id="] + attribute: href + description_tags: + selector: div.tags + description: + case: + span.icon_okay: "Verified: {{ .Result.description_tags }}" + "*": "Unverified: {{ .Result.description_tags }}" + title: + selector: a[href^="/torrents.php?id="] + category: + selector: a[href*="filter_cat"] + attribute: href + filters: + - name: regexp + args: "(\\d+)]=1" + details: + selector: a[href^="/torrents.php?id="] + attribute: href + poster: + selector: td:nth-child(2) > script + filters: + - name: regexp + args: "src=\\\\\"(.*?)\\\\\"" + - name: re_replace + args: ["\\\\(.)", "$1"] + - name: replace + args: ["/static/common/noartwork/noimage.png", ""] + files: + selector: td:nth-child(3) + date: + selector: td:nth-child(5) > span + attribute: title + # auto adjusted by site account profile + filters: + - name: dateparse + args: "MMM dd yyyy, HH:mm" + size: + selector: td:nth-child(6) + grabs: + selector: td:nth-child(7) + seeders: + selector: td:nth-child(8) + leechers: + selector: td:nth-child(9) + downloadvolumefactor: + case: + span.icon[title*="Freeleech"]: 0 + "img[alt=\"Freeleech\"]": 0 + "*": 1 + uploadvolumefactor: + case: + span.icon[title*="DoubleSeed"]: 2 + "img[alt=\"DoubleSeed\"]": 2 + "*": 1 + minimumratio: + text: 0.5 +# Luminance diff --git a/config/prowlarr/Definitions/empornium2fa.yml b/config/prowlarr/Definitions/empornium2fa.yml new file mode 100644 index 0000000..c34cfc0 --- /dev/null +++ b/config/prowlarr/Definitions/empornium2fa.yml @@ -0,0 +1,165 @@ +--- +id: empornium2fa +name: Empornium2FA +description: "this indexer uses a cookie login for Empornium for those that want to use 2FA" +language: en-US +type: private +encoding: UTF-8 +links: + - https://www.empornium.is/ + - https://www.empornium.sx/ # site forces www. +legacylinks: + - https://www.empornium.me/ + - https://empornium.sx/ + +caps: + categorymappings: + - {id: 1, cat: XXX, desc: "Amateur"} + - {id: 2, cat: XXX, desc: "Anal"} + - {id: 5, cat: XXX, desc: "Asian"} + - {id: 6, cat: XXX, desc: "BBW"} + - {id: 30, cat: XXX, desc: "BDSM"} + - {id: 36, cat: XXX, desc: "Big Ass"} + - {id: 8, cat: XXX, desc: "Big Tits"} + - {id: 7, cat: XXX, desc: "Black"} + - {id: 9, cat: XXX, desc: "Classic"} + - {id: 37, cat: XXX, desc: "Creampie"} + - {id: 10, cat: XXX, desc: "Cumshot"} + - {id: 11, cat: XXX, desc: "DVD-R"} + - {id: 12, cat: XXX, desc: "Fetish"} + - {id: 14, cat: XXX, desc: "Gang Bang / Orgy"} + - {id: 39, cat: XXX, desc: "Gay / Bi"} + - {id: 56, cat: XXX, desc: "Hairy"} + - {id: 35, cat: XXX, desc: "Hardcore"} + - {id: 44, cat: XXX, desc: "HD Porn"} + - {id: 3, cat: XXX, desc: "Hentai / 3D"} + - {id: 25, cat: XXX, desc: "Homemade"} + - {id: 43, cat: XXX, desc: "Interracial"} + - {id: 16, cat: XXX, desc: "Latina"} + - {id: 23, cat: XXX, desc: "Lesbian"} + - {id: 52, cat: XXX, desc: "Lingerie"} + - {id: 27, cat: XXX, desc: "Magazines"} + - {id: 53, cat: XXX, desc: "Manga / Comic"} + - {id: 18, cat: XXX, desc: "Masturbation"} + - {id: 26, cat: XXX, desc: "Mature"} + - {id: 40, cat: XXX, desc: "Megapack"} + - {id: 41, cat: XXX, desc: "Natural Tits"} + - {id: 17, cat: XXX, desc: "Oral"} + - {id: 29, cat: XXX, desc: "Other"} + - {id: 47, cat: XXX, desc: "Parody"} + - {id: 24, cat: XXX, desc: "Paysite"} + - {id: 21, cat: XXX, desc: "Pictures / Images"} + - {id: 50, cat: XXX, desc: "Piss"} + - {id: 55, cat: XXX, desc: "Porn Music Videos"} + - {id: 46, cat: XXX, desc: "Pregnant / Preggo"} + - {id: 51, cat: XXX, desc: "Scat/Puke"} + - {id: 22, cat: XXX, desc: "Siterip"} + - {id: 20, cat: XXX, desc: "Softcore"} + - {id: 49, cat: XXX, desc: "Squirt"} + - {id: 34, cat: XXX, desc: "Straight"} + - {id: 19, cat: XXX, desc: "Teen"} + - {id: 15, cat: XXX, desc: "Transsexual"} + - {id: 45, cat: XXX, desc: "Voyeur"} + - {id: 13, cat: XXX, desc: "XXX Games / Apps"} + + modes: + search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: infocookie + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: torrents.php + selector: "#nav_userinfo" + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}" + searchtext: "" + title: "{{ .Keywords }}" + order_by: time + order_way: desc + action: advanced + filter_freeleech: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + filelist: "" + taglist: "" + + rows: + selector: table#torrent_table > tbody > tr[class^="torrent row"]:has(a[href*="action=download"]) + + fields: + download: + selector: a[href^="/torrents.php?action=download&id="] + attribute: href + description_tags: + selector: div.tags + description: + case: + span.icon_okay: "Verified: {{ .Result.description_tags }}" + "*": "Unverified: {{ .Result.description_tags }}" + title: + selector: a[href^="/torrents.php?id="] + category: + selector: a[href*="filter_cat"] + attribute: href + filters: + - name: regexp + args: "(\\d+)]=1" + details: + selector: a[href^="/torrents.php?id="] + attribute: href + poster: + selector: td:nth-child(2) > script + filters: + - name: regexp + args: "src=\\\\\"(.*?)\\\\\"" + - name: re_replace + args: ["\\\\(.)", "$1"] + - name: replace + args: ["/static/common/noartwork/noimage.png", ""] + files: + selector: td:nth-child(3) + date: + selector: td:nth-child(5) > span + attribute: title + # auto adjusted by site account profile + filters: + - name: dateparse + args: "MMM dd yyyy, HH:mm" + size: + selector: td:nth-child(6) + grabs: + selector: td:nth-child(7) + seeders: + selector: td:nth-child(8) + leechers: + selector: td:nth-child(9) + downloadvolumefactor: + case: + span.icon[title*="Freeleech"]: 0 + "img[alt=\"Freeleech\"]": 0 + "*": 1 + uploadvolumefactor: + case: + span.icon[title*="DoubleSeed"]: 2 + "img[alt=\"DoubleSeed\"]": 2 + "*": 1 + minimumratio: + text: 0.5 +# Luminance diff --git a/config/prowlarr/Definitions/eniahd.yml b/config/prowlarr/Definitions/eniahd.yml new file mode 100644 index 0000000..0aedd4d --- /dev/null +++ b/config/prowlarr/Definitions/eniahd.yml @@ -0,0 +1,262 @@ +--- +id: eniahd +name: EniaHD +description: "EniaHD is a RUSSIAN Semi-Private Torrent Tracker for MOVIES / TV" +language: ru-RU +type: semi-private +encoding: UTF-8 +links: + - https://eniatv.com/ +legacylinks: + - https://eniahd.com/ + +caps: + categorymappings: + # Cinema + - {id: 13, cat: Movies/HD, desc: "Зарубежное кино HD"} + - {id: 11, cat: Movies, desc: "Зарубежное кино"} + - {id: 12, cat: Movies, desc: "Наше кино"} + - {id: 66, cat: Movies, desc: "Зарубежное кино | VIP"} + - {id: 67, cat: Movies, desc: "Зарубежное кино HD | VIP"} + - {id: 68, cat: Movies, desc: "Фабельманы / The Fabelmans"} + # TV + - {id: 2, cat: TV/HD, desc: "Зарубежные сериалы HD"} + - {id: 65, cat: TV/HD, desc: "Майя МС / Майянцы / Mayans M.C."} + - {id: 52, cat: TV/HD, desc: "Блудный сын / Prodigal Son"} + - {id: 49, cat: TV/HD, desc: "Пенниуорт / Pennyworth"} + - {id: 62, cat: TV/HD, desc: "Черный список / The Blacklist"} + - {id: 64, cat: TV/HD, desc: "Игра престолов / Game of Thrones"} + - {id: 59, cat: TV/HD, desc: "Американская история ужасов / American Horror Story"} + - {id: 60, cat: TV/HD, desc: "Хороший доктор / The Good Doctor"} + - {id: 54, cat: TV/HD, desc: "Рэй Донован / Ray Donovan"} + - {id: 55, cat: TV/HD, desc: "Сверхъестественное / Supernatural"} + - {id: 56, cat: TV/HD, desc: "Сквозь снег / Snowpiercer"} + - {id: 57, cat: TV/HD, desc: "Теория большого взрыва / The Big Bang Theory"} + - {id: 58, cat: TV/HD, desc: "Миллиарды / Billions"} + - {id: 53, cat: TV/HD, desc: "Родина / Homeland"} + - {id: 51, cat: TV/HD, desc: "Новобранец / The Rookie"} + - {id: 50, cat: TV/HD, desc: "Это мы / This Is Us"} + - {id: 48, cat: TV/HD, desc: "Бэтвумен / Batwoman"} + - {id: 32, cat: TV/HD, desc: "Кости / Bones"} + - {id: 31, cat: TV/HD, desc: "Американские боги / American Gods"} + - {id: 30, cat: TV/HD, desc: "Агенты Щ.И.Т. / Agents of S.H.I.E.L.D."} + - {id: 17, cat: TV/HD, desc: "Зарубежные сериалы HD для Apple TV"} + - {id: 22, cat: TV, desc: "Зарубежные сериалы HEVC"} + - {id: 3, cat: TV, desc: "Зарубежные сериалы"} + - {id: 14, cat: TV, desc: "Русские сериалы"} + - {id: 10, cat: TV, desc: "Звуковые дорожки"} + # Cartoons + - {id: 24, cat: TV, desc: "Мультфильмы"} + - {id: 25, cat: TV, desc: "Мультсериалы"} + # Documentary + - {id: 7, cat: TV/Documentary, desc: "Документальные (HD Video)"} + - {id: 21, cat: TV/Documentary, desc: "Документальные"} + - {id: 28, cat: TV/Documentary, desc: "Развлекательные телепередачи и шоу"} + # Private Forums + - {id: 47, cat: TV/HD, desc: "Рассказ служанки / The Handmaid's Tale"} + # Miscellaneous + - {id: 8, cat: Other, desc: "Разное (раздачи)"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: stripcyrillic + type: checkbox + label: Strip Cyrillic Letters + default: false + - name: addrussiantotitle + type: checkbox + label: Add RUS to end of all titles to improve language detection by Sonarr and Radarr. Will cause English-only results to be misidentified. + default: false + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 1 + options: + 1: created + 10: seeders + 7: size + 2: title + - name: type + type: select + label: Order requested from site + default: 2 + options: + 2: desc + 1: asc + +login: + path: login.php + method: form + form: form[action="login.php"] + inputs: + login_username: "{{ .Config.username }}" + login_password: "{{ .Config.password }}" + autologin: 1 + error: + - selector: table.error + test: + path: index.php + selector: a[href="./login.php?logout=1"] + +search: + paths: + - path: tracker.php + inputs: + $raw: "{{ if .Categories }}{{ range .Categories }}f[]={{.}}&{{end}}{{ else }}f[]=-1{{ end }}" + prev_allw: 0 + prev_a: 0 + prev_dla: 0 + prev_dlc: 0 + prev_dld: 0 + prev_dlw: 0 + prev_my: 0 + prev_new: 0 + prev_sd: 0 + prev_da: 1 + prev_dc: 0 + prev_df: 1 + prev_ds: 0 + prev_tor_type: 0 + o: "{{ .Config.sort }}" + s: "{{ .Config.type }}" + # show category + dc: 0 + # show forum + df: 1 + # show author + da: 1 + # show speed + ds: 0 + # -1=all time + tm: -1 + # seed not seen -1=disregard + sns: -1 + # group releases -1=not selected + srg: -1 + # title search + nm: "{{ .Keywords }}" + # search by partial word + allw: 0 + tor_type: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + + keywordsfilters: + - name: diacritics + args: replace + # strip season and/or ep + - name: re_replace + args: ["(?i)\\b(?:[SE]\\d{1,4}){1,2}\\b\\s?", ""] + - name: re_replace + args: ["(\\w+)", "+$1"] # prepend + to each word + + rows: + selector: tr[id^="tor_"]:has(a[href^="./dl.php?id="]) + + fields: + title: + selector: a.tLink + filters: + # normalize to SXXEYY format + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)\\s*(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)", "S$1E$2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?)", "S$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+[CС]езоны?", "S$1"] + - name: re_replace + args: ["(?i)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)", "E$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "E$1"] + - name: re_replace + args: ["(\\([\\p{IsCyrillic}\\W]+\\))|(^[\\p{IsCyrillic}\\W\\d]+\\/ )|([\\p{IsCyrillic} \\-]+,+)|([\\p{IsCyrillic}]+)", "{{ if .Config.stripcyrillic }}{{ else }}$1$2$3$4{{ end }}"] + - name: re_replace + args: ["(?i)\\bHDTV[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bSAT[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bWEB[-\\s]?DL[-\\s]?Rip\\b", "WEB-DL"] + - name: re_replace + args: ["(?i)\\bWEB\\sRip\\b", "WEBRip"] + - name: re_replace + args: ["(?i)\\bWEB\\sDL\\b", "WEB-DL"] + - name: re_replace + args: ["[\\[\\(\\{<«][\\s\\W]*[\\]\\)\\}>»]", ""] + - name: re_replace + args: ["^[\\s&,\\.!\\?\\+\\-_\\|\\/':]+", ""] + - name: append + args: "{{ if .Config.addrussiantotitle }} RUS{{ else }}{{ end }}" + details: + selector: a.tLink + attribute: href + download: + selector: a[href^="./dl.php?id="] + attribute: href + magnet: + optional: true + selector: a[href^="magnet:?xt="] + attribute: href + category: + selector: a.gen + attribute: href + filters: + - name: querystring + args: f + size: + selector: td:nth-child(6) > u + seeders: + selector: td.seedmed > b + leechers: + selector: td.leechmed > b + grabs: + selector: td:nth-child(9) + date: + # unix + selector: td:last-child > u + downloadvolumefactor: + case: + img[src$="/tor_gold.gif"]: 0 + img[src$="/tor_silver.gif"]: 0.5 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 100 hours (as seconds = 100 x 60 x 60) + text: 360000 + description: + selector: a.tLink +# TorrentPier diff --git a/config/prowlarr/Definitions/enthralled.yml b/config/prowlarr/Definitions/enthralled.yml new file mode 100644 index 0000000..2b9167c --- /dev/null +++ b/config/prowlarr/Definitions/enthralled.yml @@ -0,0 +1,140 @@ +--- +id: enthralled +name: Enthralled +description: "Enthralled is a Private Torrent Tracker for FETISH 3X" +language: en-US +type: private +encoding: UTF-8 +links: + - https://www.enthralled.me/ + +caps: + categorymappings: + - {id: 1, cat: XXX, desc: "FemDom"} + - {id: 2, cat: XXX, desc: "LezDom"} + - {id: 4, cat: XXX, desc: "POV"} + - {id: 5, cat: XXX, desc: "Scat"} + - {id: 3, cat: XXX, desc: "TransDom"} + + modes: + search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: time + options: + time: created + seeders: seeders + size: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login + method: form + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + cinfo: "2550|1350|24|-60" + keeploggedin: 1 + error: + - selector: div.error + test: + path: index.php + selector: "#nav_userinfo" + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}" + title: "{{ .Keywords }}" + order_by: "{{ .Config.sort }}" + order_way: "{{ .Config.type }}" + action: advanced + filter_freeleech: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + + rows: + selector: table#torrent_table > tbody > tr[class^="torrent row"]:has(a[href*="action=download"]) + + fields: + category: + selector: a[href*="filter_cat"] + attribute: href + filters: + - name: regexp + args: "(\\d+)]=1" + title: + selector: a[href^="/torrents.php?id="] + details: + selector: a[href^="/torrents.php?id="] + attribute: href + download: + selector: a[href^="/torrents.php?action=download&id="] + attribute: href + description_tags: + selector: div.tags + description: + case: + span.icon_okay: "Verified: {{ .Result.description_tags }}" + "*": "Unverified: {{ .Result.description_tags }}" + poster: + selector: td:nth-child(2) > script + filters: + - name: regexp + args: "src=\\\\\"(.*?)\\\\\"" + - name: re_replace + args: ["\\\\(.)", "$1"] + - name: replace + args: ["/static/common/noartwork/noimage.png", ""] + files: + selector: td:nth-child(3) + date: + selector: td:nth-child(5) > span + attribute: title + # auto adjusted by site account profile + filters: + - name: dateparse + args: "MMM dd yyyy, HH:mm" + size: + selector: td:nth-child(6) + grabs: + selector: td:nth-child(7) + seeders: + selector: td:nth-child(8) + leechers: + selector: td:nth-child(9) + downloadvolumefactor: + case: + span.icon[title*="Freeleech"]: 0 + "img[alt=\"Freeleech\"]": 0 + "*": 1 + uploadvolumefactor: + case: + span.icon[title*="DoubleSeed"]: 2 + "img[alt=\"DoubleSeed\"]": 2 + "*": 1 + minimumratio: + text: 0.5 +# Luminance diff --git a/config/prowlarr/Definitions/enthralled2fa.yml b/config/prowlarr/Definitions/enthralled2fa.yml new file mode 100644 index 0000000..9fecefa --- /dev/null +++ b/config/prowlarr/Definitions/enthralled2fa.yml @@ -0,0 +1,135 @@ +--- +id: enthralled2fa +name: Enthralled2FA +description: "Enthralled is a Private Torrent Tracker for FETISH 3X. Cookie Login for 2FA use." +language: en-US +type: private +encoding: UTF-8 +links: + - https://www.enthralled.me/ + +caps: + categorymappings: + - {id: 1, cat: XXX, desc: "FemDom"} + - {id: 2, cat: XXX, desc: "LezDom"} + - {id: 4, cat: XXX, desc: "POV"} + - {id: 5, cat: XXX, desc: "Scat"} + - {id: 3, cat: XXX, desc: "TransDom"} + + modes: + search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info_cookie + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: time + options: + time: created + seeders: seeders + size: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: index.php + selector: "#nav_userinfo" + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}" + title: "{{ .Keywords }}" + order_by: "{{ .Config.sort }}" + order_way: "{{ .Config.type }}" + action: advanced + filter_freeleech: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + + rows: + selector: table#torrent_table > tbody > tr[class^="torrent row"]:has(a[href*="action=download"]) + + fields: + category: + selector: a[href*="filter_cat"] + attribute: href + filters: + - name: regexp + args: "(\\d+)]=1" + title: + selector: a[href^="/torrents.php?id="] + details: + selector: a[href^="/torrents.php?id="] + attribute: href + download: + selector: a[href^="/torrents.php?action=download&id="] + attribute: href + description_tags: + selector: div.tags + description: + case: + span.icon_okay: "Verified: {{ .Result.description_tags }}" + "*": "Unverified: {{ .Result.description_tags }}" + poster: + selector: td:nth-child(2) > script + filters: + - name: regexp + args: "src=\\\\\"(.*?)\\\\\"" + - name: re_replace + args: ["\\\\(.)", "$1"] + - name: replace + args: ["/static/common/noartwork/noimage.png", ""] + files: + selector: td:nth-child(3) + date: + selector: td:nth-child(5) > span + attribute: title + # auto adjusted by site account profile + filters: + - name: dateparse + args: "MMM dd yyyy, HH:mm" + size: + selector: td:nth-child(6) + grabs: + selector: td:nth-child(7) + seeders: + selector: td:nth-child(8) + leechers: + selector: td:nth-child(9) + downloadvolumefactor: + case: + span.icon[title*="Freeleech"]: 0 + "img[alt=\"Freeleech\"]": 0 + "*": 1 + uploadvolumefactor: + case: + span.icon[title*="DoubleSeed"]: 2 + "img[alt=\"DoubleSeed\"]": 2 + "*": 1 + minimumratio: + text: 0.5 +# Luminance diff --git a/config/prowlarr/Definitions/esharenet.yml b/config/prowlarr/Definitions/esharenet.yml new file mode 100644 index 0000000..ed1d600 --- /dev/null +++ b/config/prowlarr/Definitions/esharenet.yml @@ -0,0 +1,225 @@ +--- +id: esharenet +name: eShareNet +description: "eShareNet is a Private Tracker for British MOVIE / TV" +language: en-GB +type: private +encoding: UTF-8 +links: + - https://esharenet.eu/ + +caps: + categorymappings: + - {id: 2, cat: TV, desc: "Comedy"} + - {id: 4, cat: TV, desc: "Entertainment"} + - {id: 5, cat: TV, desc: "Game Shows"} + - {id: 6, cat: TV, desc: "Motoring"} + - {id: 7, cat: TV, desc: "News and Current Affairs"} + - {id: 8, cat: TV, desc: "Sci-Fi"} + - {id: 9, cat: TV, desc: "Talkshow"} + - {id: 10, cat: TV, desc: "Advertisements - Continuity"} + - {id: 11, cat: TV, desc: "Comedy-Drama"} + - {id: 12, cat: TV, desc: "Fantasy"} + - {id: 13, cat: TV, desc: "Home and Property"} + - {id: 14, cat: Movies, desc: "Movies"} + - {id: 15, cat: Other, desc: "Other"} + - {id: 16, cat: TV, desc: "Soaps"} + - {id: 17, cat: TV, desc: "Trains and Planes"} + - {id: 18, cat: TV, desc: "Animation"} + - {id: 19, cat: TV/Documentary, desc: "Documentaries"} + - {id: 20, cat: TV, desc: "Food and Cooking"} + - {id: 21, cat: TV, desc: "Horror"} + - {id: 22, cat: Audio, desc: "Music"} + - {id: 23, cat: Audio, desc: "Radio"} + - {id: 24, cat: TV/Sport, desc: "Sport"} + - {id: 25, cat: TV, desc: "True Crime"} + - {id: 26, cat: Audio/Audiobook, desc: "Audiobook and E-book"} + - {id: 27, cat: TV, desc: "Drama"} + - {id: 28, cat: TV, desc: "Kids"} + - {id: 29, cat: TV, desc: "Mystery and Crime Fiction"} + - {id: 30, cat: TV, desc: "Reality"} + - {id: 31, cat: TV, desc: "Subtitles - english subs"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: login + method: form + form: form[action$="/login"] + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + remember: on + selectorinputs: + _token: + selector: input[name="_token"] + attribute: value + error: + - selector: div#ERROR_COPY +# test: +# path: / +# selector: a[href$="/logout"] + +search: + paths: + - path: torrents/filter + inputs: + $raw: "{{ range .Categories }}categories[]={{.}}&{{end}}" + search: "{{ if .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" # for dashboard imdbid search + imdb: "{{ .Query.IMDBIDShort }}" + tvdb: "{{ .Query.TVDBID }}" + tmdb: "{{ .Query.TMDBID }}" + sorting: "{{ .Config.sort }}" + direction: "{{ .Config.type }}" + qty: 50 + page: 0 + view: list + freeleech: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + # can search by genre but need range support. &genres[]=Action&genres[]=Comedy for Action and Comedy + + rows: + selector: table > tbody > tr + + fields: + category: + selector: a[href*="/categories/"] + attribute: href + filters: + - name: regexp + args: "/categories/(\\d+)" + title: + selector: a.view-torrent + download: + selector: a[href*="/download/"] + attribute: href + details: + selector: a.view-torrent + attribute: href + poster: + selector: div.torrent-poster img + attribute: src + filters: + - name: prepend + args: "https://images.weserv.nl/?url=" # for display on dashboard + - name: append + args: "&w=180&h=270" # for display on dashboard + - name: replace + args: ["https://images.weserv.nl/?url=https://via.placeholder.com/600x900&w=180&h=270", ""] + genre: + selector: td:nth-last-child(8) + filters: + - name: replace + args: ["\n", ""] + - name: re_replace + args: ["(?i)(Science Fiction)", "Science_Fiction"] + - name: validate + args: "Action, Adventure, Animation, Biography, Comedy, Crime, Documentary, Drama, Family, Fantasy, Game-Show, History, Horror, Music, Musical, Mystery, News, Reality-TV, Romance, Science_Fiction, Sitcom, Sport, Talk-Show, Thriller, War, Western" + description: + text: "{{ .Result.genre }}" + size: + selector: td:nth-last-child(4) + seeders: + selector: td:nth-last-child(3) + leechers: + selector: td:nth-last-child(2) + grabs: + selector: td:nth-last-child(1) + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + tmdbid: + selector: a[href*="themoviedb.org/movie/"], a[href*="themoviedb.org/tv/"] + attribute: href + date: + selector: time + filters: + # translations for Turkish|Estonian|Danish|Italian|Polish|Norwegian|Portuguese|Czech|Russian|Romanian|Spanish|French|German|Bulgarian|Dutch|Chinese|Japanese|Swedish + - name: re_replace + args: ["(?i)(önce|tagasi|geleden|fa|temu|siden|há|atrás|nazpět|назад|acum|în urmă|hace|il y a|vor|преди|前|sedan)", " ago"] + - name: re_replace + args: ["(?i)(saniye|sekundit|sekunder|secondi|sekund|segundos|sekundami|секунд|secunde|secondes|Sekunden|секунди|seconden|秒前)", "seconds"] + - name: re_replace + args: ["(?i)(minutit|minutter|minuti|minuty|minutos|минуты|минут|Minuten|минути|minuten|minuter)", "minutes"] + - name: re_replace + args: ["(?i)(dakika|minut|minuto|minuta|minutt|минута|Minute|minuut|分钟|分)", " minute"] + - name: re_replace + args: ["(?i)(tundi|timer|ore|godziny|horas|hodiny|hoden|часа|часов|ore|heures|Stunden|timmar)", "hours"] + - name: re_replace + args: ["(?i)(saat|tund|time|ora|godzina|hora|hodina|час|oră|heure|Stunde|uur|小时|時間|timme)", " hour"] + - name: re_replace + args: ["(?i)(päeva|dage|giorni|dni|dias|dny|дня|дней|zile|días|jours|Tagen|дни|dagen|dagar)", "days"] + - name: re_replace + args: ["(?i)(gün|päev|dag|giorno|dzień|dia|den|день|zi|día|jour|Tag|ден|天|日)", " day"] + - name: re_replace + args: ["(?i)(nädalat|uger|settimane|tygodnie|uker|semanas|týdny|недели|недель|săptămâni|semaines|Wochen|седмици|weken|veckor)", "weeks"] + - name: re_replace + args: ["(?i)(hafta|nädal|uge|settimana|tydzień|uke|semana|týden|неделю|săptămână|semaine|Woche|седмица|周|週間|vecka)", " week"] + - name: re_replace + args: ["(?i) (ay)", "month"] + - name: re_replace + args: ["(?i)(kuud|måneder|mesi|miesiące|meses|měsíce|месяца|месяцев|luni|meses|mois|Monaten|месеца|maanden|månader)", "months"] + - name: re_replace + args: ["(?i)(kuu|måned|mese|miesiąc|mês|měsíc|месяц|lună|mes|Monat|месец|maand|个月|ヶ月|månad)", " month"] + - name: re_replace + args: ["(?i)(aastat|anni|lata|anos|roky|года|ani|años|ans|Jahren|години)", " years"] + - name: re_replace + args: ["(?i)(yil|aasta|år|anno|rok|ano|год|año|Jahr|година|jaar|年)", " year"] + - name: re_replace + args: ["(?i) (an)", "year"] + - name: re_replace + args: ["(?i)(För |und)", ""] # Misc removals + - name: timeago + downloadvolumefactor: + case: + i[class*="fa-id-badge text-orange"]: 0 # 24 Hour FreeLeech From BON Store + i[class*="fa-trophy text-purple"]: 0 # Special FreeLeech For Certain User Groups + i[class*="fa-star text-bold"]: 0 # Freeleech From Token + i[class*="fa-coins text-bold"]: 0 # Freeleech From Token + i[class*="fa-globe text-blue"]: 0 # Global Freeleech + i[class*="fa-star text-gold"]: 0 # Freeleech + i[class*="fa-certificate text-pink"]: 0 # Featured Torrent + "*": 1 + uploadvolumefactor: + case: + i[class*="fa-gem text-green"]: 2 # Single Torrent Double Upload + i[class*="fa-globe text-green"]: 2 # Global Double Upload + i[class*="fa-certificate text-pink"]: 2 # Featured Torrent + "*": 1 + minimumratio: + text: 0.4 + minimumseedtime: + # 3 days (as seconds = 3 x 24 x 60 x 60) + text: 259200 +# UNIT3D 2.5.0 diff --git a/config/prowlarr/Definitions/estone.yml b/config/prowlarr/Definitions/estone.yml new file mode 100644 index 0000000..d79479b --- /dev/null +++ b/config/prowlarr/Definitions/estone.yml @@ -0,0 +1,171 @@ +--- +id: estone +name: eStone +description: "eStone (BigTorrent) is a HUNGARIAN Private Torrent Tracker for 0DAY / GENERAL" +language: hu-HU +type: private +encoding: UTF-8 +links: + - http://estone.cc/ # site does not support https ERR_CONNECTION_REFUSED + +caps: + categorymappings: + - {id: 24, cat: Movies/SD, desc: "Film/XviD/Hun"} + - {id: 38, cat: Movies/SD, desc: "Film/XviD/Eng"} + - {id: 51, cat: Movies/SD, desc: "Film/SD/Hun"} + - {id: 52, cat: Movies/SD, desc: "Film/SD/Eng"} + - {id: 25, cat: Movies/DVD, desc: "Film/DVD/Hun"} + - {id: 26, cat: Movies/DVD, desc: "Film/DVD/Eng"} + - {id: 42, cat: Movies/HD, desc: "Film/HD/Hun"} + - {id: 50, cat: Movies/HD, desc: "Film/HD/Eng"} + - {id: 36, cat: TV, desc: "Sorozat/Hun"} + - {id: 47, cat: TV, desc: "Sorozat/Eng"} + - {id: 41, cat: Audio/MP3, desc: "Mp3/Hun"} + - {id: 40, cat: Audio/MP3, desc: "Mp3/Eng"} + - {id: 35, cat: PC/0day, desc: "Program"} + - {id: 28, cat: PC/Games, desc: "Játék/ISO"} + - {id: 30, cat: PC/Games, desc: "Játék/Rip"} + - {id: 32, cat: Console, desc: "Konzol"} + - {id: 34, cat: PC/Mobile-Other, desc: "Mobil"} + - {id: 44, cat: Books, desc: "Könyv/Hun"} + - {id: 33, cat: Books, desc: "Könyv/Eng"} + - {id: 31, cat: Other, desc: "Képek"} + - {id: 39, cat: XXX, desc: "XXX/Film"} + - {id: 49, cat: XXX/ImageSet, desc: "XXX/Kép"} + + modes: + search: [q] + tv-search: [q, season, ep, genre] + movie-search: [q, genre] + music-search: [q, genre] + book-search: [q, genre] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: feltoltve + options: + feltoltve: created + feltoltok: seeders + meret: size + - name: type + type: select + label: Order requested from site + default: DESC + options: + DESC: desc + ASC: asc + +login: + path: login.php + method: post + inputs: + login_username: "{{ .Config.username }}" + login_password: "{{ .Config.password }}" + error: + - selector: script:contains("hiba(\"") + message: + selector: script:contains("hiba(\"") + filters: + - name: replace + args: ["hiba(\"", ""] + - name: replace + args: ["\");", ""] + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + # http://estone.cc/letoltes.php?kereses_nev=wide&miben=0&cimke=&cat=0&submit.x=40&submit.y=9 + - path: letoltes.php + inputs: + $raw: "{{ range .Categories }}kat[]={{.}}&{{end}}{{ .Config.sort }}={{ .Config.type }}" + kereses_nev: "{{ .Keywords }}" + # 0 name, 1 performer, 2 director + miben: 0 + # genre + cimke: "{{ .Query.Genre }}" + # does not support imdbid search and does not return imdb link in results + + rows: + selector: "body > div[id^=\"torrent_\"]{{ if .Config.freeleech }}:has(img[src=\"pic/free.png\"]){{ else }}{{ end }}" + + fields: + title: + selector: a[title] + attribute: title + category: + selector: div#kategoria_torrent > a + attribute: href + filters: + - name: querystring + args: cat + details: + attribute: id + filters: + - name: replace + args: ["torrent_", "adatlap.php?id="] + download: + attribute: id + filters: + - name: replace + args: ["torrent_", "download.php?id="] + poster: + selector: img[onmouseover] + attribute: onmouseover + filters: + - name: regexp + args: borito\("(.*?) +?", + size: + selector: input[id^="meret_"] + attribute: value + grabs: + selector: div:nth-child(8) > div + seeders: + selector: div:nth-child(6) > div > a + leechers: + selector: div:nth-child(7) > div > a + date: + selector: div:nth-child(4) + filters: + - name: split + args: ["(", 0] + - name: append + args: "+01:00" # CET + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + downloadvolumefactor: + case: + img[src="pic/free.png"]: 0 + "*": 1 + uploadvolumefactor: + case: + img[src="pic/dupla_up.png"]: 2 + "*": 1 + genre: + selector: div i + filters: + - name: regexp + args: "\\((.+?)\\)" + description: + case: + img[src="pic/yes.png"]: "Verified: {{ .Result.genre }}" + img[src="pic/nincs.png"]: "Unverified: {{ .Result.genre }}" + minimumratio: + text: 1.0 + minimumseedtime: + # 1 day (as seconds = 24 x 60 x 60) + text: 86400 +# engine n/a diff --git a/config/prowlarr/Definitions/ex-torrenty.yml b/config/prowlarr/Definitions/ex-torrenty.yml new file mode 100644 index 0000000..1698679 --- /dev/null +++ b/config/prowlarr/Definitions/ex-torrenty.yml @@ -0,0 +1,151 @@ +--- +id: ex-torrenty +name: Ex-torrenty +description: "Ex-torrenty is a POLISH Semi-Private Torrent Tracker for MOVIES / TV / GENERAL" +language: pl-PL +type: semi-private +encoding: UTF-8 +links: + - https://ex-torrenty.org/ + +caps: + categorymappings: + - {id: 774, cat: Movies, desc: "Filmy Polskie"} + - {id: 642, cat: Movies, desc: "Filmy/Bajki"} + - {id: 1, cat: Movies/SD, desc: "Filmy XviD/DivX"} + - {id: 20, cat: Movies/DVD, desc: "Filmy DVD"} + - {id: 23, cat: Movies/HD, desc: "Filmy x264"} + - {id: 573, cat: Movies/UHD, desc: "Filmy 4K UHD"} + - {id: 17, cat: Movies/HD, desc: "Filmy HD"} + - {id: 265, cat: Movies/HD, desc: "Filmy x265 HEVC"} + - {id: 12, cat: Movies/3D, desc: "Filmy 3D"} + - {id: 530, cat: Movies/SD, desc: "Filmy TS/CAM"} + - {id: 9, cat: PC, desc: "Programy"} + - {id: 7, cat: Console, desc: "Konsole"} + - {id: 6, cat: PC/Games, desc: "Gry"} + - {id: 5, cat: Audio, desc: "Muzyka"} + - {id: 305, cat: Audio/Video, desc: "Teledyski"} + - {id: 22, cat: TV, desc: "TV"} + - {id: 228, cat: XXX, desc: "Erotyka"} + - {id: 25, cat: Books/EBook, desc: "Książki"} + - {id: 739, cat: Audio/Audiobook, desc: "AudioBooki"} + - {id: 26, cat: Books/Comics, desc: "Komiksy"} + - {id: 27, cat: PC/Mac, desc: "Linux/Mac"} + - {id: 28, cat: TV/Sport, desc: "Sport"} + - {id: 29, cat: TV/Anime, desc: "Anime"} + - {id: 31, cat: PC/Mobile-Other, desc: "GSM/PDA"} + - {id: 32, cat: Other, desc: "Inne"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: email + type: text + label: Email + - name: password + type: password + label: Password + - name: multilang + type: checkbox + label: Replace MULTi by another language in release name + default: false + - name: multilanguage + type: select + label: Replace MULTi by this language + default: POLISH + options: + POLISH: POLISH + MULTi POLISH: MULTIi POLISH + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.email }}" + password: "{{ .Config.password }}" + error: + - selector: table.main:contains("Logowanie nie udane") + test: + path: index.php + selector: a[href^="/logout.php"] + +search: + paths: + # https://ex-torrenty.org/szukaj.php?form-display-time=22&search=%25&cat=0 + - path: szukaj.php + inputs: + # does not support multi category selection. so using default for all + cat: 0 + search: "{{ if .Keywords }}{{ .Keywords }}{{ else }}%{{ end }}" + # does not support imdbid searching, or have imdb in results + + rows: + selector: table[width="100%"] > tbody > tr:has(a[href^="torrent/"]) + + fields: + category: + selector: td:nth-child(1) + case: + ":contains(\"Polskie\")": 774 + ":contains(\"Filmy/Bajki\")": 642 + ":contains(\"XviD/DivX\")": 1 + ":contains(\"DVD\")": 20 + ":contains(\"x264\")": 23 + ":contains(\"4K UHD\")": 573 + ":contains(\"HD\")": 17 + ":contains(\"x265 HEVC\")": 265 + ":contains(\"3D\")": 12 + ":contains(\"TS/CAM\")": 530 + ":contains(\"Programy\")": 9 + ":contains(\"Konsole\")": 7 + ":contains(\"Gry\")": 6 + ":contains(\"Muzyka\")": 5 + ":contains(\"Teledyski\")": 305 + ":contains(\"TV\")": 22 + ":contains(\"Erotyka\")": 228 + ":contains(\"Książki\")": 25 + ":contains(\"AudioBooki\")": 739 + ":contains(\"Komiksy\")": 26 + ":contains(\"Linux/Mac\")": 27 + ":contains(\"Sport\")": 28 + ":contains(\"Anime\")": 29 + ":contains(\"GSM/PDA\")": 31 + ":contains(\"Inne\")": 32 + title_phase1: + selector: a[href^="torrent/"] + title_multilang: + selector: a[href^="torrent/"] + filters: + - name: re_replace + args: ["(?i)\\b(MULTI(?!.*(?:POLISH|ENGLISH|\\bPL\\b)))\\b", "{{ .Config.multilanguage }}"] + - name: re_replace + args: ["(?i)\\b(pl)\\b", "POLISH"] + title: + text: "{{ if .Config.multilang }}{{ .Result.title_multilang }}{{ else }}{{ .Result.title_phase1 }}{{ end }}" + details: + selector: a[href^="torrent/"] + attribute: href + download: + selector: a[href^="torrent/"] + attribute: href + filters: + - name: replace + args: ["torrent/", "download/"] + date: + text: now + size: + selector: td:nth-child(3) + seeders: + selector: td:nth-child(4) + leechers: + selector: td:nth-child(5) + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/exitorrent-org.yml b/config/prowlarr/Definitions/exitorrent-org.yml new file mode 100644 index 0000000..3be88ef --- /dev/null +++ b/config/prowlarr/Definitions/exitorrent-org.yml @@ -0,0 +1,171 @@ +--- +id: exitorrent-org +name: exitorrent.org +description: "exitorrent.org is a POLISH Private Torrent Tracker for MOVIES / TV / GENERAL" +language: pl-PL +type: private +encoding: UTF-8 +links: + - https://exitorrent.org/ + +caps: + categorymappings: + - {id: 1, cat: PC, desc: "Aplikacje PC"} + - {id: 43, cat: Audio/Audiobook, desc: "Audiobooki"} + - {id: 33, cat: Movies/BluRay, desc: "BluRay"} + - {id: 28, cat: Movies/Other, desc: "Dla dzieci"} + - {id: 20, cat: Movies/DVD, desc: "DVD-R 5/9"} + - {id: 37, cat: Movies/SD, desc: "DVDFan"} + - {id: 31, cat: Books/EBook, desc: "eBooki / PDF"} + - {id: 30, cat: Movies/3D, desc: "Filmy/3D "} + - {id: 38, cat: Movies/SD, desc: "Filmy/BDRip-BRRip"} + - {id: 35, cat: Movies/HD, desc: "Filmy/x264-BluRay/HD"} + - {id: 45, cat: Movies/HD, desc: "Filmy/x265-BluRay/HD"} + - {id: 4, cat: PC/Games, desc: "Gry PC"} + - {id: 21, cat: PC/Mobile-Other, desc: "GSM/PDA"} + - {id: 2, cat: TV/HD, desc: "HDTV"} + - {id: 19, cat: Movies/SD, desc: "HQ / DVDRip"} + - {id: 6, cat: Audio, desc: "Muzyka"} + - {id: 39, cat: Movies/HD, desc: "Remux"} + - {id: 29, cat: Other, desc: "Różne"} + - {id: 7, cat: TV, desc: "Seriale"} + - {id: 22, cat: Audio/Video, desc: "Teledyski / Koncerty"} + - {id: 44, cat: Movies/UHD, desc: "UHD BluRay"} + - {id: 42, cat: Movies/UHD, desc: "UHD Remux"} + - {id: 23, cat: Movies/WEB-DL, desc: "WEB-DL / WEBRip"} + - {id: 9, cat: XXX, desc: "XXX"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: drop_polish_prefix + type: checkbox + label: Drop the Polish title prefix + default: true + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: / + selector: a[href$="/logout.php"] + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # 0 title, 1 descr, 2 both + blah: "{{ if .Query.IMDBID }}1{{ else }}0{{ end }}" + podkat: 0 + hashTag: 0 + # 0 all, 1 active, 2 dead + incldead: 0 + # 0 all, 1 polish, 5 dubbed, 6 subs, 2 non-polish, 3 freeleech, 4 highlighted + polish: "{{ if .Config.freeleech }}3{{ else }}1{{ end }}" + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + + keywordsfilters: + # remove the year from the titles as the site chokes on them during search #7424 + - name: re_replace + args: [" +(?:19|20)\\d{2} *$", ""] + + rows: + selector: table[class="text"][border="0"][cellspacing="0"][cellpadding="4"] > tbody > tr:has(a[href^="details.php?id="]):has(td[class*="tableBody1"]) + filters: + - name: andmatch + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_raw: + selector: a[href^="details.php?id="] + title_stripped: + selector: a[href^="details.php?id="] + filters: + - name: re_replace + args: ["^(.*/)(.*)$", "$2"] + - name: trim + title: + text: "{{ if .Config.drop_polish_prefix }}{{ .Result.title_stripped }}{{ else }}{{ .Result.title_raw }}{{ end }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php/"], a[href^="downloadfl.php/"] + attribute: href + genre: + selector: div.span_title span div + _language: + optional: true + selector: span.span_style_pl + attribute: title + _subbed: + optional: true + selector: span.span_style_plsub + attribute: title + description: + text: "{{ if .Result._language }}Language: {{ .Result._language }} {{ else }}{{ end }}{{ if .Result._subbed }}Subbed: {{ .Result._subbed }} {{ else }}{{ end }}{{ if .Result.genre }}Genres: {{ .Result.genre }}{{ else }}{{ end }}" + date: + selector: td:nth-child(5) + # auto adjusted by site account profile + filters: + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss" + size: + selector: td:nth-child(6) + grabs: + selector: td:nth-child(7) + seeders: + selector: td:nth-child(8) + leechers: + selector: td:nth-child(9) + downloadvolumefactor: + case: + a[href^="downloadfl.php/"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# TBSource v1.5.0 diff --git a/config/prowlarr/Definitions/exkinoray.yml b/config/prowlarr/Definitions/exkinoray.yml new file mode 100644 index 0000000..e38f3c6 --- /dev/null +++ b/config/prowlarr/Definitions/exkinoray.yml @@ -0,0 +1,220 @@ +--- +id: exkinoray +name: ExKinoRay +description: "ExKinoRay is a RUSSIAN Semi-Private Torrent Tracker for MOVIES / TV" +language: ru-RU +type: semi-private +encoding: UTF-8 +links: + - http://exkinoray.fun/ # site does not support https +legacylinks: + - http://exkinoray.tv/ + +caps: + categorymappings: + - {id: 92, cat: TV, desc: "Кино Сериал"} + - {id: 46, cat: Movies, desc: "Кино Комедия"} + - {id: 47, cat: Movies, desc: "Кино Боевик"} + - {id: 48, cat: Movies, desc: "Кино Военный"} + - {id: 49, cat: Movies, desc: "Кино Вестерн"} + - {id: 50, cat: Movies, desc: "Кино Триллер"} + - {id: 51, cat: Movies, desc: "Кино Детектив"} + - {id: 52, cat: Movies, desc: "Кино Драма"} + - {id: 53, cat: Movies, desc: "Кино Мелодрама"} + - {id: 54, cat: Movies, desc: "Кино Индийское"} + - {id: 55, cat: Movies, desc: "Кино Азиатское"} + - {id: 59, cat: Movies, desc: "Кино Фантастика"} + - {id: 60, cat: Movies, desc: "Кино Фэнтези"} + - {id: 61, cat: Movies, desc: "Кино Ужас"} + - {id: 62, cat: Movies, desc: "Кино Мистика"} + - {id: 63, cat: Movies, desc: "Кино Приключения"} + - {id: 64, cat: Movies, desc: "Кино Наше кино"} + - {id: 65, cat: Movies, desc: "Кино Исторический"} + - {id: 66, cat: TV/Documentary, desc: "Кино Документальный"} + - {id: 67, cat: TV/Sport, desc: "Кино Спорт"} + - {id: 68, cat: Movies, desc: "Кино Семейный"} + - {id: 69, cat: Movies, desc: "Кино Детский"} + - {id: 70, cat: Movies, desc: "Кино Классика"} + - {id: 71, cat: Movies, desc: "Кино Концерт"} + - {id: 72, cat: TV, desc: "Кино ТВ-шоу"} + - {id: 73, cat: Movies, desc: "Кино Театр, опера"} + - {id: 74, cat: Movies, desc: "Кино Мюзикл"} + - {id: 75, cat: Movies, desc: "Кино Эротика"} + - {id: 77, cat: TV, desc: "Мульт Буржуйский"} + - {id: 78, cat: TV, desc: "Мульт Русский"} + - {id: 79, cat: TV/Anime, desc: "Мульт Аниме"} + - {id: 80, cat: Audio, desc: "Музыка Буржуйская"} + - {id: 81, cat: Audio, desc: "Музыка Русская"} + - {id: 82, cat: Audio, desc: "Музыка Сборники"} + - {id: 83, cat: Audio/Audiobook, desc: "Другое Аудио книги"} + - {id: 84, cat: Audio/Video, desc: "Другое Видеоклипы"} + - {id: 85, cat: PC/Games, desc: "Другое Игры"} + - {id: 86, cat: PC/0day, desc: "Другое Программы"} + - {id: 87, cat: Console/XBox, desc: "Другое XBox"} + - {id: 88, cat: Console/PSP, desc: "Другое PSP"} + - {id: 89, cat: Books/Mags, desc: "Другое Журналы"} + - {id: 90, cat: Other, desc: "Другое Графика"} + - {id: 93, cat: Other, desc: "Другое Библиотека"} + - {id: 94, cat: Console/PS3, desc: "Другое PS3"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: stripcyrillic + type: checkbox + label: Strip Cyrillic Letters + default: false + - name: addrussiantotitle + type: checkbox + label: Add RUS to end of all titles to improve language detection by Sonarr and Radarr. Will cause English-only results to be misidentified. + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + autologin: 1 + returnto: index.php + error: + - selector: td.embedded:contains("Ошибка входа") + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + # http://exkinoray.tv/browse.php?search=&incldead=1&cat=0 + - path: browse.php + inputs: + $raw: "{{ if .Categories }}{{ range .Categories }}c{{.}}=1&{{end}}{{ else }}cat=0{{ end }}" + # 0 active, 1 incldead, 2 onlydead, 4 noseeds (how is this different from onlydead?) + incldead: 1 + search: "{{ .Keywords }}" + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + + keywordsfilters: + # strip season and/or ep + - name: re_replace + args: ["(?i)\\b(?:[SE]\\d{1,4}){1,2}\\b\\s?", ""] + + rows: + selector: table.begins > tbody > tr:has(a[href^="details.php?id="]) + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + filters: + # normalize to SXXEYY format + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)\\s*(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)", "S$1E$2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?)", "S$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+[CС]езоны?", "S$1"] + - name: re_replace + args: ["(?i)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)", "E$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "E$1"] + - name: re_replace + args: ["(\\([\\p{IsCyrillic}\\W]+\\))|(^[\\p{IsCyrillic}\\W\\d]+\\/ )|([\\p{IsCyrillic} \\-]+,+)|([\\p{IsCyrillic}]+)", "{{ if .Config.stripcyrillic }}{{ else }}$1$2$3$4{{ end }}"] + - name: re_replace + args: ["(?i)\\bHDTV[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bSAT[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bWEB[-\\s]?DL[-\\s]?Rip\\b", "WEB-DL"] + - name: re_replace + args: ["(?i)\\bWEB\\sRip\\b", "WEBRip"] + - name: re_replace + args: ["(?i)\\bWEB\\sDL\\b", "WEB-DL"] + - name: re_replace + args: ["[\\[\\(\\{<«][\\s\\W]*[\\]\\)\\}>»]", ""] + - name: re_replace + args: ["^[\\s&,\\.!\\?\\+\\-_\\|\\/':]+", ""] + - name: re_replace + args: ["(?i)^\\(\\s*([SE]\\d+.*?)\\s*\\)[\\s\\/\\|]*(.+)", "$2 $1"] + - name: append + args: "{{ if .Config.addrussiantotitle }} RUS{{ else }}{{ end }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + date: + selector: td:nth-child(2) i + filters: + - name: append + args: " +03:00" # MSK + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + files: + selector: td:nth-child(3) + size: + selector: td:nth-child(5) + seeders: + selector: td:nth-child(6) + leechers: + selector: td:nth-child(7) + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 + description: + selector: a[href^="details.php?id="] +# engine n/a diff --git a/config/prowlarr/Definitions/extratorrent-st.yml b/config/prowlarr/Definitions/extratorrent-st.yml new file mode 100644 index 0000000..12c39e6 --- /dev/null +++ b/config/prowlarr/Definitions/extratorrent-st.yml @@ -0,0 +1,152 @@ +--- +id: extratorrent-st +name: ExtraTorrent.st +description: "ExtraTorrent.st is a Public tracker for MOVIE / TV / GENERAL magnets" +language: en-US +type: public +encoding: UTF-8 +links: + - https://extratorrent.st/ + - https://extratorrent.unblockit.date/ + - https://extratorrent.mrunblock.bond/ + - https://extratorrent.nocensor.cloud/ +legacylinks: + - https://extratorrent.nocensor.work/ + - https://extratorrent.nocensor.biz/ + - https://extratorrent.nocensor.sbs/ + - https://extratorrent.unblockit.nz/ + - https://extratorrent.nocensor.world/ + - https://extratorrent.unblockit.page/ + - https://extratorrent.unblockit.pet/ + - https://extratorrent.nocensor.lol/ + - https://extratorrent.unblockit.ink/ + - https://extratorrent.nocensor.art/ + - https://extratorrent.unblockit.bio/ + - https://extratorrent.unblockit.boo/ + - https://extratorrent.mrunblock.guru/ + - https://extratorrent.unblockit.click/ + - https://extratorrent.unblockit.asia/ + - https://extratorrent.unblockit.mov/ + - https://extratorrent.mrunblock.life/ + - https://extratorrent.unblockit.rsvp/ + - https://extratorrent.nocensor.click/ + - https://extratorrent.unblockit.vegas/ + - https://extratorrent.unblockit.esq/ + - https://extratorrent.unblockit.zip/ + - https://extratorrent.unblockit.foo/ + - https://extratorrent.unblockit.ing/ + +caps: + categorymappings: + - {id: Movies, cat: Movies, desc: Movies} + - {id: Highres Movies, cat: Movies/HD, desc: Movies HD} + - {id: UltraHD, cat: Movies/UHD, desc: Movies UHD} + - {id: 3D Movies, cat: Movies/3D, desc: Movies 3D} + - {id: Bollywood, cat: Movies, desc: Bollywood} + - {id: Movie clips, cat: Movies, desc: Movies clips} + - {id: DVD, cat: Movies/DVD, desc: Movies DVD} + - {id: MP4, cat: Movies, desc: Movies MP4} + - {id: Dubbed Movies, cat: Movies/Foreign, desc: Movies Dubbed} + - {id: Other Movies, cat: Movies/Other, desc: Movies Other} + - {id: Documentary, cat: TV/Documentary, desc: Documentary} + - {id: TV, cat: TV, desc: TV} + - {id: MP3, cat: Audio/MP3, desc: Music MP3} + - {id: AAC, cat: Audio, desc: Music AAC} + - {id: Lossless, cat: Audio/Lossless, desc: Music Lossless} + - {id: Music videos, cat: Audio/Video, desc: Music Videos} + - {id: Other Music, cat: Audio/Other, desc: Music Other} + - {id: Radio Shows, cat: Audio/Other, desc: Music Radio} + - {id: Video, cat: XXX, desc: Adult / Porn} + - {id: "Adult / Porn", cat: XXX, desc: Adult / Porn} + - {id: Pictures, cat: XXX/ImageSet, desc: Adult Pictures} + - {id: Magazines, cat: XXX/Other, desc: Adult Magazines} + - {id: Games, cat: XXX/Other, desc: Adult Games} + - {id: Hentai, cat: XXX/Other, desc: Adult Hentai} + - {id: Windows, cat: PC, desc: Software Windows} + - {id: Android, cat: PC/Mobile-Android, desc: Software Android} + - {id: Mac, cat: PC/Mac, desc: Software Mac} + - {id: Linux, cat: PC, desc: Software Linux} + - {id: PC Games, cat: PC/Games, desc: PC Games} + - {id: NDS, cat: Console/NDS, desc: Games NDS} + - {id: PS3, cat: Console/PS3, desc: Games PS3} + - {id: PS4, cat: Console/PS4, desc: Games PS4} + - {id: PSP, cat: Console/PSP, desc: Games PSP} + - {id: Wii, cat: Console/Wii, desc: Games Wii} + - {id: Xbox360, cat: Console/XBox 360, desc: Games Xbox360} + - {id: Switch, cat: Console/Other, desc: Games Switch} + - {id: Other Games, cat: Console/Other, desc: Games Other} + - {id: English-translated, cat: TV/Anime, desc: Anime English-translated} + - {id: Anime, cat: TV/Anime, desc: Anime} + - {id: Audio books, cat: Audio/Audiobook, desc: Books Audiobook} + - {id: Comics, cat: Books/Comics, desc: Books Comics} + - {id: Ebooks, cat: Books/EBook, desc: Books Ebook} + - {id: Other, cat: Other/Misc, desc: Other} + - {id: Other Applications, cat: PC, desc: Other Applications} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: [] + +search: + paths: + # https://extratorrent.st/search/?srt=added&order=desc&search=captain&new=1&x=0&y=0 + - path: "{{ if .Keywords }}search/?srt=added&order=desc&search={{ .Keywords }}&new=1&x=0&y=0{{ else }}{{ end }}" + keywordsfilters: + - name: re_replace + args: ["[\\s]+", "."] + + rows: + selector: tr[class^="tl"]:has(a[href^="magnet:?xt="]) + filters: + - name: andmatch + + fields: + category: + selector: span.c_tor + filters: + - name: replace + args: ["in ", ""] + - name: trim + title: + selector: a[href^="/torrent/"] + details: + selector: a[href^="/torrent/"] + attribute: href + download: + selector: a[href^="magnet:?xt="] + attribute: href + date: + # 8m , 13h, 2d , 3w , 1m , 1y # site uses m for both minutes and months!?!? + selector: td:nth-last-of-type(5) + filters: + - name: replace + args: ["m", " minutes"] + - name: replace + args: ["h", " hours"] + - name: replace + args: ["y", " years"] + - name: replace + args: ["d", " days"] + - name: replace + args: ["w", " weeks"] + - name: timeago + size: + selector: td:nth-last-of-type(4) + seeders: + selector: td.sy, td.sn + optional: true + default: 0 + leechers: + selector: td.ly, td.ln + optional: true + default: 0 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/extremebits.yml b/config/prowlarr/Definitions/extremebits.yml new file mode 100644 index 0000000..0453d3a --- /dev/null +++ b/config/prowlarr/Definitions/extremebits.yml @@ -0,0 +1,162 @@ +--- +id: extremebits +name: ExtremeBits +description: "ExtremeBits is a Private Torrent Tracker for EXTREME SPORTS" +language: en-US +type: private +encoding: UTF-8 +links: + - https://extremebits.net/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "BASE jump"} + - {id: 10, cat: Movies, desc: "BMX"} + - {id: 3, cat: Movies, desc: "Climbing"} + - {id: 19, cat: Other, desc: "Covers"} + - {id: 20, cat: Movies, desc: "Fiddy/MiniMX"} + - {id: 22, cat: Movies, desc: "Graffiti"} + - {id: 18, cat: Movies, desc: "Homevid"} + - {id: 16, cat: Movies, desc: "Inline Skate"} + - {id: 25, cat: Movies, desc: "Kayaking"} + - {id: 28, cat: Movies, desc: "Kiteboard"} + - {id: 17, cat: Movies, desc: "MC"} + - {id: 13, cat: Other, desc: "Misc"} + - {id: 4, cat: Movies, desc: "MotoX"} + - {id: 11, cat: Movies, desc: "MTB"} + - {id: 21, cat: Audio, desc: "Music"} + - {id: 26, cat: Movies, desc: "Paintball"} + - {id: 5, cat: Movies, desc: "Parkour"} + - {id: 24, cat: Movies, desc: "Quad/ATV"} + - {id: 29, cat: Movies, desc: "Rally/4x4"} + - {id: 6, cat: Movies, desc: "Skateboard"} + - {id: 12, cat: Movies, desc: "Ski"} + - {id: 14, cat: Movies, desc: "Skydive"} + - {id: 7, cat: Movies, desc: "Snowboard"} + - {id: 9, cat: Movies, desc: "Snowmobile"} + - {id: 15, cat: Movies, desc: "Streetrace"} + - {id: 2, cat: Movies, desc: "Surf"} + - {id: 23, cat: TV, desc: "Tv"} + - {id: 8, cat: Movies, desc: "Wakeboard/W.Ski"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + inputs: + input[placeholder="Username"]: "{{ .Config.username }}" + input[placeholder="Password"]: "{{ .Config.password }}" + selectors: true + error: + - selector: h2:contains("fail") + message: + selector: div.contentframe + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 active, 1 incldead, 2 onlydead, 3 freeleech + incl: "{{ if .Config.freeleech }}3{{ else }}1{{ end }}" + # 0 name, 1 descr, 2 both + searchin: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + # does not support imdbid searching or have imdb links in results. + + rows: + selector: table.crowdedtablecenter > tbody > tr:has(a[href^="details.php?id="]) + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="details.php?id="] + attribute: href + filters: + - name: replace + args: ["details.php", "download.php"] + files: + selector: td:nth-of-type(5) + seeders: + selector: td:nth-of-type(7) + leechers: + selector: td:nth-of-type(8) + grabs: + selector: td:nth-of-type(10) a + size: + selector: td:nth-of-type(10) + remove: a + category_title: + selector: td:nth-of-type(1) a img + attribute: alt + description: + selector: td:nth-of-type(4) + filters: + - name: prepend + args: "cat={{ .Result.category_title }}, wait=" + downloadvolumefactor: + case: + img[src="img/freedownload.png"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + date: + selector: td:nth-of-type(2) + remove: a + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + minimumratio: + text: 0.6 +# TBDEV diff --git a/config/prowlarr/Definitions/extremlymtorrents.yml b/config/prowlarr/Definitions/extremlymtorrents.yml new file mode 100644 index 0000000..5636149 --- /dev/null +++ b/config/prowlarr/Definitions/extremlymtorrents.yml @@ -0,0 +1,189 @@ +--- +id: extremlymtorrents +name: ExtremlymTorrents +description: "ExtremlymTorrents (XTR) is a Semi-Private tracker for MOVIES / TV / GENERAL" +language: en-US +type: semi-private +encoding: UTF-8 +links: + - https://extremlymtorrents.ws/ +caps: + categorymappings: + - {id: 15, cat: Movies/HD, desc: "1080p HD"} + - {id: 52, cat: Other/Misc, desc: "2021 xROBOT Extern"} + - {id: 40, cat: Movies/UHD, desc: "4K UHD 2160p"} + - {id: 48, cat: Audio/Video, desc: "4K | 2160p | Music Video"} + - {id: 22, cat: Movies/HD, desc: "720p HD"} + - {id: 19, cat: PC/Mobile-Android, desc: "Android Apk"} + - {id: 28, cat: TV/Anime, desc: "Anime | Japanese"} + - {id: 3, cat: PC, desc: "Applications"} + - {id: 16, cat: Movies/3D, desc: "BluRay 3D"} + - {id: 12, cat: Movies/BluRay, desc: "BluRay HDR"} + - {id: 44, cat: Movies, desc: "Bollywood"} + - {id: 35, cat: Movies, desc: "BRRip | BDRip | HDRip"} + - {id: 36, cat: Movies, desc: "CAMRip | REC"} + - {id: 8, cat: Books/EBook, desc: "Comics | EBook"} + - {id: 31, cat: TV/Documentary, desc: "DOC's"} + - {id: 27, cat: Movies/DVD, desc: "DVD | PAL | NTSC"} + - {id: 5, cat: Movies/DVD, desc: "DVDRip"} + - {id: 1, cat: PC/Games, desc: "Games PC"} + - {id: 32, cat: PC/Mobile-Other, desc: "GPS Navigation"} + - {id: 13, cat: TV/HD, desc: "HDTV"} + - {id: 43, cat: XXX, desc: "Hentai | Manga"} + - {id: 20, cat: PC/Mobile-iOS, desc: "Iphone iOS"} + - {id: 9, cat: TV, desc: "Kidz | Cartoons"} + - {id: 23, cat: PC, desc: "Linux"} + - {id: 7, cat: PC/Mac, desc: "Mac"} + - {id: 6, cat: Audio, desc: "Music Mp3 | FLAC"} + - {id: 21, cat: Movies, desc: "Pack"} + - {id: 30, cat: TV/SD, desc: "PDTV | SDTV"} + - {id: 11, cat: XXX, desc: "Porn -[+18]- xXx"} + - {id: 47, cat: XXX/UHD, desc: "Porn UHD 4K -[+18]- xXx"} + - {id: 18, cat: Console/PS3, desc: "PS3 | Playstation 3"} + - {id: 46, cat: Console/PS4, desc: "PS4 | PlayStation 4"} + - {id: 17, cat: Console/PSP, desc: "PSP | Playstation"} + - {id: 39, cat: TV/Sport, desc: "Sport TV"} + - {id: 38, cat: Movies, desc: "TS: TeleSync | HD-TS"} + - {id: 10, cat: TV, desc: "TV Episode | Season Complete"} + - {id: 49, cat: TV/UHD, desc: "TV UHD | 2160p | Episodes"} + - {id: 41, cat: TV/WEB-DL, desc: "TVRip"} + - {id: 24, cat: Audio/Video, desc: "VideoClip"} + - {id: 45, cat: Audio, desc: "Vinyl Rip"} + - {id: 14, cat: Other, desc: "Wallpapers"} + - {id: 25, cat: Movies/WEB-DL, desc: "WEBRip | WEB-DL"} + - {id: 26, cat: Console/Wii, desc: "Wii Games"} + - {id: 29, cat: PC/0day, desc: "Windows PC"} + - {id: 42, cat: Other/Misc, desc: "X EXTERN ONLY MAGNET"} + - {id: 2, cat: Console/XBox 360, desc: "XBOX 360"} + - {id: 50, cat: XXX/ImageSet, desc: "xXx iMAGESET (+18)"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: sort + type: select + label: Sort requested from site + default: id + options: + id: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: account-login.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: span.titlebar:contains("Access Denied") + message: + selector: td.text + test: + path: index.php + selector: a[href="account-logout.php"] + +search: + paths: + - path: torrents-search.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 all 1 English 2 etc... + lang: 0 + sort: "{{ .Config.sort }}" + order: "{{ .Config.type }}" + keywordsfilters: + - name: re_replace + args: ["(\\w+)", "+$1"] # prepend + to each word + + rows: + selector: table.xtrz > tbody > tr[class^="ttable_col"] + + fields: + category: + selector: a[href^="torrents.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + _language: + selector: td:nth-last-child(5) + _vip: + selector: img[src="/images/vip-icon.png"] + attribute: alt + optional: true + title: + selector: a[href^="file.php?id="] b + filters: + - name: append + args: " {{ .Result._language }}{{ if .Result._vip }} VIP ONLY{{ else }}{{ end }}" + details: + selector: a[href^="file.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: a[href^="file.php?id="] + attribute: onmouseover + filters: + - name: regexp + args: "src=(.+?) " + - name: replace + args: ["/pic/uploadimage.jpg", ""] + date: + selector: td:nth-last-child(1) + # auto adjusted by site account profile + filters: + - name: dateparse + args: "dd.MM.yyyyHH:mm:ss" + leechers: + selector: td:nth-last-child(2) + seeders: + selector: td:nth-last-child(3) + size: + selector: td:nth-last-child(4) + downloadvolumefactor: + case: + img[src="/images/free.png"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + genre: + # Drama, Romance | N/A | 2022 | 112 min | N/A + # Drama:Family:Romance + selector: td:nth-child(2) + remove: a + filters: + - name: split + args: ["|", 0] + - name: re_replace + args: ["\\bn\\\\a\\b", ""] + description: + text: "{{ .Result.genre }}{{ if .Result._vip }}
VIP ONLY{{ else }}{{ end }}" + minimumratio: + text: 1.0 + minimumseedtime: + # 1 day (as seconds = 24 x 60 x 60) + text: 86400 +# engine n/a diff --git a/config/prowlarr/Definitions/exttorrents.yml b/config/prowlarr/Definitions/exttorrents.yml new file mode 100644 index 0000000..f605b75 --- /dev/null +++ b/config/prowlarr/Definitions/exttorrents.yml @@ -0,0 +1,153 @@ +--- +id: exttorrents +name: EXT Torrents +description: "EXT Torrents is a Public torrent site for MOVIES / TV / GENERAL" +language: en-US +type: public +encoding: UTF-8 +requestDelay: 5 +links: + - https://ext.to/ + - https://search.extto.com/ + - https://extranet.torrentbay.net/ +legacylinks: + - https://ext.unblockninja.com/ + - https://t.extto.com/ + - https://torrent.extto.com/ + - https://site.extto.com/ + - https://ext.torrentbay.to/ + - https://extranet.torrentbay.to/ + +caps: + categorymappings: + - {id: "/anime/", cat: TV/Anime, desc: Anime} + - {id: "/anime/english-translated/", cat: TV/Anime, desc: "Anime English Translated"} + - {id: "/applications/", cat: PC, desc: Apps} + - {id: "/applications/android/", cat: PC/Mobile-Android, desc: "Apps Android"} + - {id: "/applications/ios/", cat: PC/Mobile-iOS, desc: "Apps iOS"} + - {id: "/applications/linux/", cat: PC, desc: "Apps Linux"} + - {id: "/applications/mac/", cat: PC/Mac, desc: "Apps Mac"} + - {id: "/applications/other-applications/", cat: PC/Mobile-Other, desc: "Apps Other"} + - {id: "/applications/windows/", cat: PC/0day, desc: "Apps Windows"} + - {id: "/books/", cat: Books, desc: Books} + - {id: "/books/audio-books/", cat: Audio/Audiobook, desc: "Books Audiobooks"} + - {id: "/books/comics/", cat: Books/Comics, desc: "Books Comics"} + - {id: "/books/ebooks/", cat: Books/EBook, desc: "Books Ebooks"} + - {id: "/games/", cat: PC/Games, desc: Games} + - {id: "/games/nds/", cat: Console/NDS, desc: "Games NDS"} + - {id: "/games/other-games/", cat: Console/Other, desc: "Games Other"} + - {id: "/games/pc-games/", cat: PC/Games, desc: "Games PC"} + - {id: "/games/ps3/", cat: Console/PS3, desc: "Games PS3"} + - {id: "/games/ps4/", cat: Console/PS4, desc: "Games PS4"} + - {id: "/games/psp/", cat: Console/PSP, desc: "Games PSP"} + - {id: "/games/switch/", cat: Console/Other, desc: "Games Switch"} + - {id: "/games/wii/", cat: Console/Wii, desc: "Games Wii"} + - {id: "/games/xbox360/", cat: Console/XBox 360, desc: "Games Xbox360"} + - {id: "/games/mac/", cat: PC/Mac, desc: "Games Mac"} + - {id: "/movies/", cat: Movies, desc: Movies} + - {id: "/movies/3d-movies/", cat: Movies/3D, desc: "Movies 3D"} + - {id: "/movies/bollywood/", cat: Movies, desc: "Movies Bollywood"} + - {id: "/movies/documentary/", cat: Movies, desc: "Movies Documentary"} + - {id: "/movies/dubbed-movies/", cat: Movies, desc: "Movies Dubbed"} + - {id: "/movies/dvd/", cat: Movies/DVD, desc: "Movies DVD"} + - {id: "/movies/highres-movies/", cat: Movies/HD, desc: "Movies Highres"} + - {id: "/movies/mp4/", cat: Movies, desc: "Movies MP4"} + - {id: "/movies/other-movies/", cat: Movies, desc: "Movies Other Movies"} + - {id: "/movies/ultrahd/", cat: Movies/UHD, desc: "Movies UltraHD"} + - {id: "/movies/music-videos/", cat: Audio/Video, desc: "Movies Music videos"} + - {id: "/movies/movie-clips/", cat: Movies/Other, desc: "Movies Movie clips"} + - {id: "/music/", cat: Audio, desc: Music} + - {id: "/music/aac/", cat: Audio, desc: "Music AAC"} + - {id: "/music/lossless/", cat: Audio/Lossless, desc: "Music Lossless"} + - {id: "/music/mp3/", cat: Audio/MP3, desc: "Music MP3"} + - {id: "/music/other-music/", cat: Audio/Other, desc: "Music Other"} + - {id: "/music/radio-shows/", cat: Audio, desc: "Music Radio Shows"} + - {id: "/other/", cat: Other, desc: Other} + - {id: "/tv/", cat: TV, desc: TV} + - {id: "/xxx/", cat: XXX, desc: XXX} + - {id: "/xxx/games/", cat: XXX/Other, desc: "XXX Games"} + - {id: "/xxx/hentai/", cat: XXX/Other, desc: "XXX Hentai"} + - {id: "/xxx/magazines/", cat: XXX/Other, desc: "XXX Magazines"} + - {id: "/xxx/pictures/", cat: XXX/ImageSet, desc: "XXX Pictures"} + - {id: "/xxx/video/", cat: XXX, desc: "XXX Video"} + - {id: "/video/", cat: XXX, desc: "XXX Video"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: sort + type: select + label: Sort requested from site + default: age + options: + age: created + seed: seeders + size: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: flaresolverr + type: info + label: FlareSolverr + default: This site may use Cloudflare DDoS Protection, therefore Prowlarr requires FlareSolverr to access it. + +download: + selectors: + - selector: a[href^="magnet:?xt="] + attribute: href + +search: + paths: + - path: "{{ if .Keywords }}search/{{ .Keywords }}/?order={{ .Config.sort }}&sort={{ .Config.type }}{{ else }}latest/{{ end }}" + - path: "{{ if .Keywords }}search/{{ .Keywords }}/2/?order={{ .Config.sort }}&sort={{ .Config.type }}{{ else }}latest/2/{{ end }}" + followredirect: true + + keywordsfilters: + - name: tolower + - name: trim + - name: re_replace + args: ["[^\\w]+", "-"] + + rows: + selector: table.table-striped > tbody > tr + + fields: + category: + selector: td:nth-child(1) div div a:last-child + attribute: href + optional: true + default: "/other/" + title: + selector: td:nth-child(1) div a + details: + selector: td:nth-child(1) div a + attribute: href + download: + selector: td:nth-child(1) div a + attribute: href + size: + selector: td:nth-child(2) + files: + selector: td:nth-child(3) + optional: true + default: 1 + date: + selector: td:nth-child(4) + seeders: + selector: td:nth-child(5) + leechers: + selector: td:nth-child(6) + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/eztv.yml b/config/prowlarr/Definitions/eztv.yml new file mode 100644 index 0000000..97b782e --- /dev/null +++ b/config/prowlarr/Definitions/eztv.yml @@ -0,0 +1,118 @@ +--- +id: eztv +name: EZTV +description: "EZTV is a Public torrent site for TV shows" +language: en-US +type: public +encoding: UTF-8 +links: + - https://eztvx.to/ + - https://eztv.wf/ + - https://eztv.tf/ + - https://eztv.yt/ + - https://eztv1.xyz/ + - https://eztv.unblockit.date/ + - https://eztv.unblockninja.com/ + - https://eztv.mrunblock.bond/ + - https://eztv.nocensor.cloud/ +legacylinks: + - https://eztv.ag/ # redirects to .re + - https://eztv.it/ # redirects to .re + - https://eztv.ch/ # redirects to .re + - https://eztv.io/ + - https://eztv.nocensor.biz/ + - https://eztv.nocensor.sbs/ + - https://eztv.unblockit.nz/ + - https://eztv.nocensor.world/ + - https://eztv.unblockit.page/ + - https://eztv.unblockit.pet/ + - https://eztv.nocensor.lol/ + - https://eztv.unblockit.ink/ + - https://eztv.nocensor.art/ + - https://eztv.unblockit.bio/ + - https://eztv.unblockit.boo/ + - https://eztv.mrunblock.guru/ + - https://eztv.unblockit.click/ + - https://eztv.unblockit.asia/ + - https://eztv.unblockit.mov/ + - https://eztv.mrunblock.life/ + - https://eztv.unblockit.rsvp/ + - https://eztv.nocensor.click/ + - https://eztv.unblockit.vegas/ + - https://eztv.unblockit.esq/ + - https://eztv.unblockit.zip/ + - https://eztv.re/ + - https://eztv.li/ + - https://eztv.unblockit.foo/ + - https://eztv.unblockit.ing/ + +caps: + categories: + 1: TV + + modes: + search: [q] + tv-search: [q, season, ep] + +settings: [] + +search: + paths: + - path: "{{ if .Keywords }}search/{{ .Keywords }}{{ else }}home{{ end }}" + + keywordsfilters: + - name: re_replace + args: ["S[0-9]{2}([^E]|$)", ""] # remove season tag without episode (search doesn't support it) + # fixes for site search issues - Prowlarr #1094 + - name: replace + args: ["-", ""] + - name: replace + args: [" ", "-"] + - name: replace + args: ["&", ""] + + headers: + cookie: ["sort_no=100; q_filter=all; q_filter_web=on; q_filter_reality=on; q_filter_x265=on; layout=def_wlinks"] # show 100 results for keywordless search and show links in results + + rows: + # only use latest added torrents table for keywordless search to avoid duplicates, some torrents don't have any download links so skip them + selector: "table.forum_header_border:contains('Latest') tr[name='hover'].forum_header_border:has(a.magnet), table.forum_header_border:contains('Releases') tr[name='hover'].forum_header_border:has(a.magnet)" + filters: + - name: andmatch + + fields: + category: + text: 1 + title: + selector: td:nth-child(2) a + attribute: title + filters: + - name: replace + args: ["[eztv]", ""] + - name: re_replace + args: ["\\(.*\\)$", ""] + - name: trim + details: + selector: td:nth-child(2) a + attribute: href + download: + selector: td:nth-child(3) a.magnet, td:nth-child(3) a + attribute: href + size: + selector: td:nth-child(4) + optional: true + default: 512 MB + date: + selector: td:nth-child(5) + filters: + - name: append + args: " ago" + seeders: + selector: td:nth-child(6) + leechers: + text: 0 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/falkonvisionteam.yml b/config/prowlarr/Definitions/falkonvisionteam.yml new file mode 100644 index 0000000..5755a50 --- /dev/null +++ b/config/prowlarr/Definitions/falkonvisionteam.yml @@ -0,0 +1,153 @@ +--- +id: falkonvisionteam +name: Falkon Vision Team +description: "Falkon Vision Team is a CROATIAN Private Torrent Tracker for MOVIES / TV / GENERAL" +language: hr-HR +type: private +encoding: UTF-8 +links: + - http://falkonvision-team.com/ # does not support https, CA expired March 2018 + +caps: + categorymappings: + - {id: 16, cat: Audio/Audiobook, desc: "Audio knjige"} + - {id: 10, cat: Movies/BluRay, desc: "Blue Ray"} + - {id: 6, cat: TV/Documentary, desc: "Dokumentarci"} + - {id: 9, cat: Movies/DVD, desc: "DVD"} + - {id: 4, cat: Movies/DVD, desc: "DVDRip"} + - {id: 12, cat: Books/EBook, desc: "E-KNJIGE"} + - {id: 3, cat: Other, desc: "FVT"} + - {id: 13, cat: Movies/HD, desc: "HD Rip"} + - {id: 14, cat: Audio/Video, desc: "Koncerti"} + - {id: 7, cat: Audio, desc: "Muzika"} + - {id: 15, cat: TV, desc: "Serije"} + - {id: 8, cat: TV/Sport, desc: "Sport"} + - {id: 5, cat: TV, desc: "TV Rip"} + - {id: 11, cat: Movies/Other, desc: "Video spotovi"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: login.php? + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img#regimage + input: imagestring + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + logout: "" + error: + - selector: table:contains("Greska") + test: + path: index.php + selector: a[href*="/logout.php?logouthash="] + +search: + paths: + - path: browse.php + keywordsfilters: + - name: re_replace + args: ["[\\s]+", "%"] + inputs: + do: search + keywords: "{{ .Keywords }}" + # t_name, t_description, t_both, t_uploader, t_genre + # searching t_name yields no results! + search_type: t_both + # does not support multi category searching so defaulting to all. + category: 0 + include_dead_torrents: yes + sort: "{{ if .Config.freeleech }}free{{ else }}{{ .Config.sort }}{{ end }}" + order: "{{ if .Config.freeleech }}asc{{ else }}{{ .Config.type }}{{ end }}" + # does not return imdb link in results and t_genre does not return imdbid search results + + rows: + selector: "table.sortable tr:has(a[href*=\"/download.php?id=\"]){{ if .Config.freeleech }}:has(img[src$=\"/freedownload.gif\"]){{ else }}{{ end }}" + + fields: + category: + selector: a[href*="/browse.php?category="] + attribute: href + filters: + - name: querystring + args: category + title: + selector: a[href*="/details.php?id="] + details: + selector: a[href*="/details.php?id="] + attribute: href + download: + selector: a[href*="/download.php?id="] + attribute: href + poster: + selector: img[src*="/torrents/images/"] + attribute: src + date: + selector: td:nth-child(2) + # auto adjusted by site account profile + filters: + - name: regexp + args: "(\\d{2}-\\d{2}-\\d{2} \\d{2}:\\d{2})" + - name: dateparse + args: "dd-MM-yy HH:mm" + size: + selector: td:nth-last-child(5) + grabs: + selector: td:nth-last-child(4) + seeders: + selector: td:nth-last-child(3) + leechers: + selector: td:nth-last-child(2) + description: + # Wait: 4 h + # Cekanje: 4 h + selector: div.tooltip-content > div:last-child + downloadvolumefactor: + case: + img[src$="/freedownload.gif"]: 0 + img[src$="/silverdownload.gif"]: 0.5 + "*": 1 + uploadvolumefactor: + case: + img[src$="/x2.gif"]: 2 + "*": 1 + minimumseedtime: + # 60 hours (as seconds = 60 x 60 x 60) + text: 216000 +# TS Special Edition v.7.4 diff --git a/config/prowlarr/Definitions/fanoin.yml b/config/prowlarr/Definitions/fanoin.yml new file mode 100644 index 0000000..74d3cbe --- /dev/null +++ b/config/prowlarr/Definitions/fanoin.yml @@ -0,0 +1,158 @@ +--- +id: fanoin +name: FANO.IN +description: "Fano.in is a LATVIAN Private Torrent Tracker for 0DAY / GENERAL" +language: lv-LV +type: private +encoding: UTF-8 +links: + - https://www.fano.in/ + +caps: + categorymappings: + - {id: 20, cat: Movies/SD, desc: "Movies/SD"} + - {id: 6, cat: TV/SD, desc: "TV/SD"} + - {id: 7, cat: PC/Games, desc: "Games/PC ISO"} + - {id: 5, cat: Audio, desc: "Music"} + - {id: 47, cat: Movies, desc: "Packs/Movies"} + - {id: 44, cat: Audio/Audiobook, desc: "A-Books"} + - {id: 27, cat: TV/Anime, desc: "Anime"} + - {id: 17, cat: Movies/Foreign, desc: "Movies/Rus"} + - {id: 33, cat: TV/Foreign, desc: "TV/Rus"} + - {id: 12, cat: PC/Games, desc: "Games/PC Rips"} + - {id: 31, cat: Audio/Lossless, desc: "Music/HQ"} + - {id: 49, cat: TV, desc: "Packs/TV"} + - {id: 41, cat: Books, desc: "E-Books"} + - {id: 29, cat: Books, desc: "Cartoons"} + - {id: 24, cat: Movies/Foreign, desc: "Movies/Lat"} + - {id: 25, cat: TV/Foreign, desc: "TV/Lat"} + - {id: 34, cat: Console/XBox, desc: "Games/Xbox"} + - {id: 19, cat: Audio/Video, desc: "Music Videos"} + - {id: 46, cat: Console, desc: "Packs/Games"} + - {id: 42, cat: Other, desc: "Study"} + - {id: 52, cat: Movies/3D, desc: "3D"} + - {id: 37, cat: Movies/HD, desc: "Movies/HD"} + - {id: 35, cat: TV/HD, desc: "TV/HD"} + - {id: 43, cat: Console/PS4, desc: "Games/PS"} + - {id: 38, cat: PC/Mobile-Other, desc: "Mobile"} + - {id: 48, cat: Audio, desc: "Packs/Music"} + - {id: 36, cat: Other, desc: "X-mas"} + - {id: 53, cat: Movies/SD, desc: "Movies/CAM"} + - {id: 4, cat: Movies/DVD, desc: "Movies/DVD-R"} + - {id: 32, cat: TV, desc: "TV/Facts"} + - {id: 40, cat: Console/Wii, desc: "Games/Wii"} + - {id: 22, cat: PC/0day, desc: "Appz/misc"} + - {id: 50, cat: XXX/Pack, desc: "Packs/XXX"} + - {id: 9, cat: XXX, desc: "XXX"} + - {id: 45, cat: XXX, desc: "XXX/HD"} + - {id: 54, cat: Movies, desc: "Movies/Retro"} + - {id: 23, cat: TV/Sport, desc: "TV/Sport"} + - {id: 51, cat: Console, desc: "Games/Misc"} + - {id: 1, cat: PC/0day, desc: "Appz/PC ISO"} + - {id: 55, cat: Movies/UHD, desc: "Movies/4K"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: td.embedded:has(h2:contains("failed")) + test: + path: browse_old.php + selector: a[href="/logout.php"] + +search: + paths: + - path: browse_old.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" # for dashboard imdbid search + # 0 active 1 incldead 2 onlydead + incldead: 1 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + + rows: + selector: tr.browse_actions + + fields: + title: + selector: a[href^="details.php?id="] + details: + selector: a[href^="details.php?id="] + attribute: href + category: + selector: a[href^="browse_old.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + download: + selector: a[href^="details.php?id="] + attribute: href + filters: + - name: replace + args: ["details.php", "download.php"] + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + size: + selector: td:nth-child(5) + seeders: + selector: td:nth-child(7) + leechers: + selector: td:nth-child(8) + grabs: + selector: td:nth-child(6) + date: + selector: td:nth-child(2) > small:nth-last-child(2), td:nth-child(2) > small + filters: + - name: replace + args: ["Šodien", "Today"] + - name: replace + args: ["Vakar", "Yesterday"] + downloadvolumefactor: + case: + img[alt="Free"]: 0 + "*": 1 + uploadvolumefactor: + case: + img[alt="x2"]: 2 + "*": 1 + description: + selector: td:nth-child(2) > small:nth-last-child(1) + remove: a[href^="details.php?id="] +# engine n/a diff --git a/config/prowlarr/Definitions/fantastiko.yml b/config/prowlarr/Definitions/fantastiko.yml new file mode 100644 index 0000000..10c2d47 --- /dev/null +++ b/config/prowlarr/Definitions/fantastiko.yml @@ -0,0 +1,219 @@ +--- +id: fantastiko +name: Fantastiko +description: "Fantastiko is a GREEK Private Torrent Tracker for SCI-FI / FANTASY / HORROR MOVIES / TV / GENERAL" +language: el-GR +type: private +encoding: UTF-8 +links: + - https://fantastiko.space/ +legacylinks: + - http://fantastiko.space/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Movies"} + - {id: 14, cat: Movies/BluRay, desc: "Movies DVDRip/BRRip"} + - {id: 56, cat: Movies/HD, desc: "Movies BluRay 720p/1080p/2160p"} + - {id: 17, cat: Movies/DVD, desc: "Movies DVD5/9"} + - {id: 49, cat: Movies, desc: "Movies Packs/filmographies"} + - {id: 50, cat: Movies/Other, desc: "Movies Others (screener-webrip-tvrip)"} + - {id: 53, cat: Movies/SD, desc: "Movies VHS"} + - {id: 51, cat: Movies, desc: "Movies Short films"} + - {id: 52, cat: Movies, desc: "Movie Serials"} + - {id: 32, cat: TV, desc: "Series"} + - {id: 38, cat: TV, desc: "TV Episodes"} + - {id: 39, cat: TV, desc: "TV Packs"} + - {id: 57, cat: TV/WEB-DL, desc: "Web Episodes"} + - {id: 65, cat: TV/WEB-DL, desc: "Web Episode Packs"} + - {id: 64, cat: TV, desc: "Video Episodes"} + - {id: 66, cat: TV, desc: "Video Episode Packs"} + - {id: 36, cat: TV/Anime, desc: "Animation"} + - {id: 54, cat: TV/Anime, desc: "Animation Movies"} + - {id: 55, cat: TV/Anime, desc: "Animation TV Series"} + - {id: 60, cat: TV/Anime, desc: "Animation Web Series"} + - {id: 61, cat: TV/Anime, desc: "Animation Video Series"} + - {id: 59, cat: TV/Anime, desc: "Animation Shorts"} + - {id: 33, cat: TV/Documentary, desc: "Ντοκιμαντέρ/Τηλ.Εκπομπές (Documentaries)"} + - {id: 58, cat: TV, desc: "Supermarionation"} + - {id: 62, cat: TV, desc: "Supermarionation Movies"} + - {id: 63, cat: TV, desc: "Supermarionation Series"} + - {id: 34, cat: Books, desc: "Βιβλία"} + - {id: 40, cat: Books/EBook, desc: "E-Books"} + - {id: 41, cat: Audio/Audiobook, desc: "Audio Books"} + - {id: 42, cat: Books/Mags, desc: "Περιοδικά (Magazines)"} + - {id: 35, cat: Books/Comics, desc: "Comics"} + - {id: 37, cat: Other, desc: "Παραστάσεις (Theater)"} + - {id: 45, cat: Other, desc: "Photos"} + - {id: 7, cat: Audio/Other, desc: "Music/Soundtrack"} + - {id: 2, cat: PC/Games, desc: "Games"} + - {id: 46, cat: PC, desc: "Software"} + - {id: 47, cat: Other, desc: "Κατασκευές (Constructions)"} + - {id: 48, cat: Other, desc: "Borg Cube"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + +login: + path: ?p=home&pid=1 + method: form + form: form#sls_form + submitpath: /ajax/login.php + inputs: + action: login + loginbox_membername: "{{ .Config.username }}" + loginbox_password: "{{ .Config.password }}" + loginbox_remember: 1 + selectorinputs: + securitytoken: + selector: "script:contains(\"stKey: \")" + filters: + - name: regexp + args: "stKey: \"(.+?)\"," + error: + - selector: ":contains(\"-ERROR-\")" + test: + path: ?p=home&pid=1 + selector: a#logout + +search: + paths: + - path: / + keywordsfilters: + - name: re_replace # add brackets to year on searchquery if missing + args: ["\\(*((19|20)\\d{2})\\)*", "($1)"] + - name: re_replace + args: ["[^\\w\\d\\(\\)]+", "%"] + inputs: + p: torrents + pid: 32 + $raw: "{{ range .Categories }}cid[]={{.}}&{{end}}" + keywords: "{{ .Keywords }}" + # name, description, both, uploader + search_type: name + error: + - selector: div#show_error + + rows: + selector: "tr:has(a[href*=\"?p=torrents\"][href*=\"&cid=\"]){{ if .Config.freeleech }}:has(img[src*=\"torrent_free.png\"]){{ else }}{{ end }}" + filters: + - name: andmatch + + fields: + category: + selector: a[href*="?p=torrents"][href*="&cid="] + attribute: href + filters: + - name: querystring + args: cid + title: + selector: a[href*="?p=torrents"][href*="&action=details"] + details: + selector: a[href*="?p=torrents"][href*="&action=details"] + attribute: href + download: + selector: a[href*="?p=torrents"][href*="&action=download"] + attribute: href + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + size: + selector: a[rel="torrent_size"] + seeders: + selector: a[rel="torrent_seeders"] + leechers: + selector: a[rel="torrent_leechers"] + grabs: + selector: a[rel="times_completed"] + poster: + selector: a[rel="fancybox"] + attribute: href + downloadvolumefactor: + case: + "img[src*=\"torrent_free.png\"]": 0 + "*": 1 + uploadvolumefactor: + text: 1 + date_day: + selector: td.torrent_name:contains("day"), td.torrent_name:contains("σήμερα"), td.torrent_name:contains("εχθές"), td.torrent_name:contains("Δευτέρα"), td.torrent_name:contains("Τρίτη"), td.torrent_name:contains("Τετάρτη"), td.torrent_name:contains("Πέμπτη"), td.torrent_name:contains("Παρασκευή"), td.torrent_name:contains("Σάββατο"), td.torrent_name:contains("Κυριακή") + # auto adjusted by site account profile + optional: true + remove: span, a + filters: + - name: replace + args: ["Uploaded ", ""] + - name: replace + args: [" by", ""] + - name: replace + args: ["Ανέβηκε ", ""] # Uploaded + - name: replace + args: [" από", ""] # by + - name: replace + args: [" τον/την", ""] # him/her + - name: replace + args: ["στις ", "at "] # at + - name: replace + args: ["σήμερα", "Today"] + - name: replace + args: ["εχθές", "Yesterday"] + - name: replace + args: ["Δευτέρα", "Monday"] + - name: replace + args: ["Τρίτη", "Tuesday"] + - name: replace + args: ["Τετάρτη", "Wednesday"] + - name: replace + args: ["Πέμπτη", "Thursday"] + - name: replace + args: ["Παρασκευή", "Friday"] + - name: replace + args: ["Σάββατο", "Saturday"] + - name: replace + args: ["Κυριακή", "Sunday"] + - name: fuzzytime + date_year: + selector: td.torrent_name:contains("-") + # auto adjusted by site account profile + optional: true + remove: span, a + filters: + - name: replace + args: ["Uploaded ", ""] + - name: replace + args: [" by", ""] + - name: replace + args: ["at ", ""] + - name: replace + args: ["Ανέβηκε ", ""] # Uploaded + - name: replace + args: [" από", ""] # by + - name: replace + args: [" τον/την", ""] # him/her + - name: replace + args: ["στις ", ""] # at + - name: dateparse + args: "dd-MM-yyyy HH:mm" + date: + text: "{{ if or .Result.date_day .Result.date_year }}{{ or .Result.date_day .Result.date_year }}{{ else }}now{{ end }}" + minimumratio: + text: 1.0 + minimumseedtime: + # 3 days (as seconds = 3 x 24 x 60 x 60) + text: 259200 +# TSUE 2.1 diff --git a/config/prowlarr/Definitions/fappaizuri.yml b/config/prowlarr/Definitions/fappaizuri.yml new file mode 100644 index 0000000..128b330 --- /dev/null +++ b/config/prowlarr/Definitions/fappaizuri.yml @@ -0,0 +1,144 @@ +--- +id: fappaizuri +name: Fappaizuri +description: "Fappaizuri is a Private Torrent Tracker for HENTAI / JAV" +language: en-US +type: private +encoding: UTF-8 +links: + - https://fappaizuri.me/ + +caps: + categorymappings: + - {id: 8, cat: TV/Anime, desc: "Hentai"} + - {id: 7, cat: Console, desc: "H-games"} + - {id: 5, cat: XXX, desc: "JAV"} + - {id: 6, cat: Books, desc: "Manga"} + + modes: + search: [q] + tv-search: [q, season, ep] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: lang + type: select + label: Language + default: 0 + options: + 0: All + 4: Japanese + 5: Chinese + 6: Malaysia + 7: North Korea + 8: English + - name: sort + type: select + label: Sort requested from site + default: id + options: + id: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + method: post + path: account-login.php + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: b:contains("The specified username or password was incorrect.") + test: + path: index.php + selector: a[href="account-logout.php"] + +search: + paths: + # https://fappaizuri.me/torrents-search.php?search=&c8=1&c6=1&incldead=1&freeleech=0&lang=0 + - path: torrents-search.php + + inputs: + $raw: "{{ range .Categories }}&c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 active, 1 incldead, 2 onlydead + incldead: 1 + # 0 all, 1 notfree, 2 onlyfree + freeleech: "{{ if .Config.freeleech }}{{ .Config.freeleech }}2{{ else }}0{{ end }}" + lang: "{{ .Config.lang }}" + sort: "{{ .Config.sort }}" + order: "{{ .Config.type }}" + + rows: + selector: tr.t-row:has(a[href^="download.php?id="]) + + fields: + category: + selector: a[href^="search-torrents.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="torrents-details.php?id="] > b + details: + selector: a[href^="torrents-details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: a[href^="torrents-details.php?id="] + attribute: onmouseover + filters: + - name: regexp + args: src=(.+?)> + _language: + selector: img[src*="images/languages/"] + attribute: alt + optional: true + description: + selector: font[color="red"] + filters: + - name: append + args: "{{ if .Result._language }} - {{ .Result._language }}{{ else }}{{ end }}" + size: + selector: td:nth-child(4) + seeders: + selector: td:nth-child(5) + leechers: + selector: td:nth-child(6) + date: + text: now + downloadvolumefactor: + case: + img[src="images/free.png"]: 0 + "*": 1 + uploadvolumefactor: + case: + img[src="images/doubleupload.gif"]: 2 + "*": 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 4 days (as seconds = 4 x 24 x 60 x 60) + text: 345600 +# evolution diff --git a/config/prowlarr/Definitions/fastscene.yml b/config/prowlarr/Definitions/fastscene.yml new file mode 100644 index 0000000..f214488 --- /dev/null +++ b/config/prowlarr/Definitions/fastscene.yml @@ -0,0 +1,130 @@ +--- +id: fastscene +name: FastScene +description: "FastScene is a ROMANIAN / ENGLISH Private site for MOVIES / TV / GENERAL" +language: ro-RO +type: private +encoding: UTF-8 +links: + - https://fastscene.net/ + +caps: + categorymappings: + - {id: 1, cat: TV/Anime, desc: "Anime"} + - {id: 2, cat: TV/Anime, desc: "Anime-Ro"} + - {id: 3, cat: Movies/BluRay, desc: "BluRay"} + - {id: 4, cat: Movies/BluRay, desc: "BluRay-Ro"} + - {id: 5, cat: Movies/UHD, desc: "4K"} + - {id: 6, cat: Movies/UHD, desc: "4K-Ro"} + - {id: 7, cat: Movies/3D, desc: "3D"} + - {id: 8, cat: Movies/3D, desc: "3D-Ro"} + - {id: 9, cat: Movies/HD, desc: "HD"} + - {id: 10, cat: Movies/HD, desc: "HD-Ro"} + - {id: 11, cat: Movies/SD, desc: "XVID"} + - {id: 12, cat: Movies/SD, desc: "XVID-Ro"} + - {id: 13, cat: Movies, desc: "Oldies"} + - {id: 14, cat: Movies, desc: "Oldies-Ro"} + - {id: 15, cat: Movies, desc: "Packs Movies"} + - {id: 16, cat: Movies, desc: "Packs Movies-Ro"} + - {id: 17, cat: TV, desc: "TV-Episodes"} + - {id: 18, cat: TV, desc: "TV-Episodes-Ro"} + - {id: 19, cat: PC/Games, desc: "Games PC"} + - {id: 20, cat: PC/Games, desc: "Games Packs"} + - {id: 21, cat: Audio/MP3, desc: "Music MP3"} + - {id: 22, cat: Movies, desc: "APPZ"} + - {id: 23, cat: TV/Sport, desc: "Sports"} + - {id: 24, cat: PC/Mobile-Android, desc: "Android"} + - {id: 25, cat: TV/Documentary, desc: "Docs"} + - {id: 26, cat: Other, desc: "Images"} + - {id: 27, cat: XXX, desc: "XXX"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + book-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: / + selector: a[href="account-logout.php"] + +search: + paths: + - path: torrents-search.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 active, 1 incldead, 2 onlydead + incldead: 1 + # 0 all, 1 nofree, 2 onlyfree + freeleech: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # does not support imdbid searches or provide sort options + + rows: + selector: table.ttable_headinner > tbody > tr + + fields: + category: + selector: a[href*="cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="torrents-details.php?id="] b + details: + selector: a[href^="torrents-details.php?id="] + attribute: href + filters: + - name: replace + args: ["&hit=1", ""] # avoid redirect + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: a[onMouseover] img + attribute: src + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + date: + text: now + size: + selector: td:nth-child(5) + seeders: + selector: td:nth-child(6) + leechers: + selector: td:nth-child(7) + genre: + selector: b:contains("Genre") font:nth-child(2) + description: + text: "{{ .Result.genre }}" + downloadvolumefactor: + case: + img[src$="/FREE.png"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.1 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# TorrentTrader (custom 3.0) diff --git a/config/prowlarr/Definitions/fearnopeer.yml b/config/prowlarr/Definitions/fearnopeer.yml new file mode 100644 index 0000000..102c02e --- /dev/null +++ b/config/prowlarr/Definitions/fearnopeer.yml @@ -0,0 +1,170 @@ +--- +id: fearnopeer +name: FearNoPeer +description: "FearNoPear is a Private Torrent Tracker for MOVIES / TV / GENERAL" +language: en-US +type: private +encoding: UTF-8 +links: + - https://fearnopeer.com/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Movies"} + - {id: 2, cat: TV, desc: "TV"} + - {id: 3, cat: Audio, desc: "Music"} + - {id: 6, cat: TV/Anime, desc: "Anime"} + - {id: 10, cat: TV, desc: "TV Pack"} + - {id: 4, cat: PC/Games, desc: "Games"} + - {id: 5, cat: PC/0day, desc: "Apps"} + - {id: 9, cat: TV/Sport, desc: "Sport"} + - {id: 11, cat: Other, desc: "Miscellaneous"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + music-search: [q] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your FearNoPeer account My Settings page and clicking on the API Key tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + inputs: {} # TODO: remove in v10 + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: "/api/torrents/filter" + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + # if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6 + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + seasonNumber: "{{ .Query.Season }}" + episodeNumber: "{{ .Query.Ep }}" + imdbId: "{{ .Query.IMDBIDShort }}" + tmdbId: "{{ .Query.TMDBID }}" + tvdbId: "{{ .Query.TVDBID }}" + "free[]": "{{ if .Config.freeleech }}100{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + + rows: + selector: data + attribute: attributes + + fields: + category: + selector: category_id + title: + selector: name + details: + selector: details_link + download: + selector: download_link + infohash: + selector: info_hash + poster: + selector: meta.poster + filters: + - name: replace + args: ["https://via.placeholder.com/90x135", ""] + imdbid: + selector: imdb_id + tmdbid: + selector: tmdb_id + tvdbid: + selector: tvdb_id + genre: + selector: meta.genres + filters: + - name: re_replace + args: ["(?i)(Science Fiction)", "Science_Fiction"] + - name: re_replace + args: ["(?i)(TV Movie)", "TV_Movie"] + - name: replace + args: [" & ", "_&_"] + description: + text: "{{ .Result.genre }}" + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0%, 25%, 50%, 75%, 100% + selector: freeleech + case: + 0%: 1 # not free + 25%: 0.75 + 50%: 0.5 + 75%: 0.25 + 100%: 0 # freeleech + "*": 0 # catch errors + uploadvolumefactor: + # api returns False, True + selector: double_upload + case: + False: 1 # normal + True: 2 # double +# Maintain global ratio above 0.5 or downloads will get disabled. No MST. + minimumratio: + text: 0.51 +# json UNIT3D 7.1.2 diff --git a/config/prowlarr/Definitions/femdomcult.yml b/config/prowlarr/Definitions/femdomcult.yml new file mode 100644 index 0000000..8db9d5c --- /dev/null +++ b/config/prowlarr/Definitions/femdomcult.yml @@ -0,0 +1,159 @@ +# Femdomcult uses the Luminance code, which is based on gazelle +# ajax.php API additionally needs the auth=$authkey argument +# Because the API is e.g. missing poster images we use screen scraping instead of the generic gazelle based approach +--- +id: femdomcult +name: Femdomcult +description: "Femdomcult is a Private Torrent Tracker for FETISH 3X" +language: en-US +type: private +encoding: UTF-8 +links: + - https://femdomcult.org/ + +caps: + categorymappings: + - {id: 58, cat: XXX, desc: "Amateur/Mainstream"} + - {id: 60, cat: XXX, desc: "Anime Comics"} + - {id: 73, cat: XXX, desc: "Asian Femdom"} + - {id: 61, cat: XXX, desc: "Audio"} + - {id: 78, cat: XXX, desc: "EBook"} + - {id: 74, cat: XXX, desc: "Female Muscles"} + - {id: 59, cat: XXX, desc: "Femdom"} + - {id: 62, cat: XXX, desc: "Femdom Vip"} + - {id: 63, cat: XXX, desc: "Fetish"} + - {id: 68, cat: XXX, desc: "Fetish Vip"} + - {id: 76, cat: XXX, desc: "Game"} + - {id: 64, cat: XXX, desc: "Gts-Vore-Crush"} + - {id: 72, cat: XXX, desc: "Images"} + - {id: 69, cat: XXX, desc: "Lezdom"} + - {id: 70, cat: XXX, desc: "Pov"} + - {id: 65, cat: XXX, desc: "Scat"} + - {id: 71, cat: XXX, desc: "Strapon"} + - {id: 66, cat: XXX, desc: "Transdom"} + - {id: 77, cat: XXX, desc: "Unknown & Low Quality"} + - {id: 75, cat: XXX, desc: "Virtual Reality"} + + modes: + search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: time + options: + time: created + seeders: seeders + size: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: login.php + method: form + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + cinfo: "2550|1350|24|-60" + keeplogged: 1 + error: + - selector: form#loginform > span.warning + test: + path: torrents.php + selector: "#nav_userinfo" + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}" + title: "{{ .Keywords }}" + order_by: "{{ .Config.sort }}" + order_way: "{{ .Config.type }}" + action: advanced + filter_freeleech: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + + rows: + selector: table#torrent_table > tbody > tr[class^="torrent row"]:has(a[href*="action=download"]) + + fields: + download: + selector: a[href^="torrents.php?action=download&id="] + attribute: href + description_tags: + selector: div.tags + description: + case: + span.icon_okay: "Verified: {{ .Result.description_tags }}" + "*": "Unverified: {{ .Result.description_tags }}" + title: + selector: a[href^="torrents.php?id="] + category: + selector: a[href*="filter_cat"] + attribute: href + filters: + - name: regexp + args: "(\\d+)]=1" + details: + selector: a[href^="torrents.php?id="] + attribute: href + poster: + selector: td:nth-child(2) > script + filters: + - name: regexp + args: "src=(.*?)>" + - name: re_replace + args: ["\\\\(.)", "$1"] + - name: replace + args: ["/static/common/noartwork/noimage.png", ""] + files: + selector: td:nth-child(3) + date: + selector: td:nth-child(5) > span + attribute: title + # auto adjusted by site account profile + optional: true + default: "20 years ago" # some torrents have "Never" date + filters: + - name: dateparse + args: "MMM dd yyyy, HH:mm" + size: + selector: td:nth-child(6) + grabs: + selector: td:nth-child(7) + seeders: + selector: td:nth-child(8) + leechers: + selector: td:nth-child(9) + downloadvolumefactor: + case: + "img[alt=\"Freeleech\"]": 0 + "*": 1 + uploadvolumefactor: + case: + span.icon[title*="DoubleSeed"]: 2 + "img[alt=\"DoubleSeed\"]": 2 + "*": 1 + minimumratio: + text: 0.5 + # MR is reduced but not removed if MST is met + # minimumseedtime: + # # 3 days (as seconds = 3 x 24 x 60 x 60) + # text: 259200 +# luminance diff --git a/config/prowlarr/Definitions/file-tracker.yml b/config/prowlarr/Definitions/file-tracker.yml new file mode 100644 index 0000000..63fafa4 --- /dev/null +++ b/config/prowlarr/Definitions/file-tracker.yml @@ -0,0 +1,695 @@ +--- +id: file-tracker +name: File-Tracker +description: "File Tracker is a RUSSIAN Semi-Private Torrent Tracker for MOVIES / GENERAL" +language: ru-RU +type: semi-private +encoding: windows-1251 +links: + - https://file-tracker.net/ + +caps: + categorymappings: + # Эксклюзив + # Exclusive + - {id: 387, cat: Movies/DVD, desc: " |- Отечественные фильмы DVD Master's"} + - {id: 386, cat: Movies/DVD, desc: " |- Зарубежные фильмы DVD Master's"} + - {id: 390, cat: TV/SD, desc: " |- Сериалы DVD Master's"} + - {id: 388, cat: Movies/DVD, desc: " |- Мультфильмы DVD Master's"} + - {id: 601, cat: TV/Anime, desc: " |- Мультсериалы DVD Master's"} + # Кино, видео, мультипликация и ТВ + # Film, video, animation and TV + - {id: 1002, cat: Movies, desc: " |- Зарубежные фильмы , мультфильмы [HD/UHD]"} + - {id: 987, cat: Movies, desc: " |- Зарубежные фильмы , мультфильмы [SD]"} + - {id: 1003, cat: Movies, desc: " |- Отечественные фильмы , мультфильмы [HD/UHD]"} + - {id: 988, cat: Movies, desc: " |- Отечественные фильмы , мультфильмы [SD]"} + - {id: 337, cat: Movies, desc: " |- Зарубежные фильмы , мультфильмы на других языках [SD/HD/UHD]"} + - {id: 994, cat: Movies, desc: " |- Новинки с рекламой (фильмы, мультфильмы) [SD/HD/UHD]"} + - {id: 385, cat: Movies, desc: " |- Экранки (фильмы , мультфильмы) [SD/HD/UHD]"} + - {id: 999, cat: Movies, desc: " |- Фильмы (2021-2022)"} + - {id: 996, cat: Movies, desc: " |- Фильмы (2019-2020)"} + - {id: 921, cat: Movies, desc: " |- Фильмы (2016-2018)"} + - {id: 382, cat: Movies, desc: " |- Фильмы (2012-2015)"} + - {id: 381, cat: Movies, desc: " |- Фильмы (2009-2011)"} + - {id: 734, cat: Movies, desc: " |- Фильмы (2006-2008)"} + - {id: 380, cat: Movies, desc: " |- Фильмы (2001-2005)"} + - {id: 379, cat: Movies, desc: " |- Фильмы до 2000 года"} + - {id: 613, cat: Movies, desc: " |- Кино для детей"} + - {id: 638, cat: Movies, desc: " |- Азиатское кино/Япония"} + - {id: 136, cat: Movies, desc: " |- Индийское кино"} + - {id: 443, cat: Movies, desc: " |- Антология зарубежного кино"} + - {id: 1000, cat: Movies, desc: " |- Наше кино (2021 - 2022)"} + - {id: 997, cat: Movies, desc: " |- Наше кино (2019 - 2020)"} + - {id: 922, cat: Movies, desc: " |- Наше кино (2016 - 2018)"} + - {id: 229, cat: Movies, desc: " |- Наше кино (2012 - 2015)"} + - {id: 733, cat: Movies, desc: " |- Наше кино (2008 - 2011)"} + - {id: 334, cat: Movies, desc: " |- Наше кино (2001 - 2007)"} + - {id: 333, cat: Movies, desc: " |- Наше кино (1990 - 2000)"} + - {id: 250, cat: Movies, desc: " |- Советское кино (классика)"} + - {id: 62, cat: Movies, desc: " |- Кино для детей"} + - {id: 962, cat: Movies, desc: " |- Антология отечественного кино"} + - {id: 990, cat: Movies, desc: " |- Фильмы , мультфильмы и сериалы на языках ближнего..."} + - {id: 991, cat: Movies, desc: " |- Зарубежные фильмы , мультфильмы и сериалы в оригинале"} + - {id: 74, cat: Movies, desc: " |- Зарубежные мультфильмы"} + - {id: 73, cat: Movies, desc: " |- Отечественные мультфильмы"} + - {id: 599, cat: TV, desc: " |- Сказки русских писателей"} + - {id: 575, cat: TV, desc: " |- Интерны"} + - {id: 271, cat: TV, desc: " |- Реальные пацаны"} + - {id: 377, cat: TV, desc: " |- МарГоша"} + - {id: 612, cat: TV, desc: " |- Воронины"} + - {id: 731, cat: TV, desc: " |- Сваты"} + - {id: 968, cat: TV, desc: " |- Разные сериалы"} + - {id: 639, cat: TV, desc: " |- Теория большого взрыва"} + - {id: 89, cat: TV, desc: " |- Друзья"} + - {id: 92, cat: TV, desc: " |- Тайны Смолвиля"} + - {id: 95, cat: TV, desc: " |- Секретные материалы"} + - {id: 383, cat: TV, desc: " |- Альф"} + - {id: 384, cat: TV, desc: " |- Доктор Хаус"} + - {id: 632, cat: TV, desc: " |- Дневники Вампира"} + - {id: 969, cat: TV, desc: " |- Разные сериалы"} + - {id: 600, cat: TV, desc: " |- Том и Джерри"} + - {id: 609, cat: TV, desc: " |- Разное (иностранные мультсериалы)"} + - {id: 701, cat: TV, desc: " |- Маша и Медведь"} + - {id: 594, cat: TV, desc: " |- Ну, погоди!"} + - {id: 598, cat: TV, desc: " |- Смешарики"} + - {id: 610, cat: TV, desc: " |- Сборники мультфильмов"} + - {id: 870, cat: TV, desc: " |- Разные (отечественные мультсериалы)"} + - {id: 741, cat: Movies/3D, desc: " |- 3D | Кинофильмы"} + - {id: 742, cat: Movies/3D, desc: " |- 3D | Мультфильмы"} + - {id: 981, cat: Movies/3D, desc: " |- 3D | Blu-ray и BD Remux"} + - {id: 743, cat: Movies/3D, desc: " |- 3D | Документальные фильмы"} + - {id: 744, cat: Movies/3D, desc: " |- 3D | Спорт"} + - {id: 335, cat: Movies/DVD, desc: " |- Наше кино (DVD)"} + - {id: 336, cat: Movies/HD, desc: " |- Наше кино (HD Video)"} + - {id: 747, cat: Movies/BluRay, desc: " |- Наше кино (Blu-ray и BD Remux) [HD/UHD]"} + - {id: 985, cat: Movies/UHD, desc: " |- Наше кино (Ultra HD)"} + - {id: 69, cat: Movies/DVD, desc: " |- Зарубежное кино (DVD)"} + - {id: 70, cat: Movies/HD, desc: " |- Зарубежное кино (HD Video)"} + - {id: 748, cat: Movies/BluRay, desc: " |- Зарубежное кино (Blu-ray и BD Remux) [HD/UHD]"} + - {id: 984, cat: Movies/UHD, desc: " |- Зарубежное кино (Ultra HD)"} + - {id: 907, cat: Movies, desc: " |- Кино для детей (DVD, HD Video, Blu-ray, BD Remux, Ultra HD)"} + - {id: 339, cat: Movies, desc: " |- Мультфильмы (DVD, HD Video и Blu-ray)"} + - {id: 602, cat: TV/Anime, desc: " |- Мультсериалы (DVD, HD Video и Blu-ray)"} + - {id: 906, cat: Movies, desc: " |- Азиатское кино/Япония (DVD, HD Video, Blu-ray, BD Remux, Ult.."} + - {id: 442, cat: Movies, desc: " |- Антология (DVD, HD Video, Blu-ray, BD Remux)"} + - {id: 898, cat: TV, desc: " |- Отечественные сериалы (DVD, HD Video, Blu-ray, BD Remux)"} + - {id: 970, cat: TV, desc: " |- Иностранные сериалы (DVD, HD Video, Blu-ray, BD Remux)"} + - {id: 71, cat: Movies, desc: " |- Арт-хаус и авторское кино (DVD, HD Video, Blu-ray, BD Remux)"} + - {id: 180, cat: Audio/Video, desc: " |- Музыкальное (DVD, HD Video, Blu-ray, BD Remux)"} + - {id: 681, cat: TV, desc: " |- Осторожно Модерн!"} + - {id: 341, cat: TV, desc: " |- Ералаш"} + - {id: 332, cat: TV, desc: " |- Прожекторпэрисхилтон"} + - {id: 330, cat: TV, desc: " |- Маски-шоу"} + - {id: 279, cat: TV, desc: " |- Юмористы"} + - {id: 65, cat: TV, desc: " |- КВН / Пост КВН"} + - {id: 66, cat: TV, desc: " |- Вечерний Квартал"} + - {id: 64, cat: TV, desc: " |- Даешь,молодежь!"} + - {id: 10, cat: TV, desc: " |- Наша Russia"} + - {id: 879, cat: TV, desc: " |- Другие телепередачи"} + - {id: 614, cat: TV, desc: " |- Строительство и дизайн"} + - {id: 252, cat: TV, desc: " |- BBC"} + - {id: 81, cat: TV, desc: " |- Discovery"} + - {id: 80, cat: TV, desc: " |- Фильмы National Geographic"} + - {id: 910, cat: TV, desc: " |- Флора и Фауна"} + - {id: 573, cat: TV, desc: " |- Секретные файлы"} + - {id: 359, cat: TV, desc: " |- Запретные темы истории"} + - {id: 358, cat: TV, desc: " |- Секретные материалы"} + - {id: 357, cat: TV, desc: " |- Русские сенсации"} + - {id: 356, cat: TV, desc: " |- Среда обитания"} + - {id: 355, cat: TV, desc: " |- Медицина и здоровье"} + - {id: 354, cat: TV, desc: " |- Тайны века"} + - {id: 351, cat: TV, desc: " |- Апокалипсис"} + - {id: 350, cat: TV, desc: " |- Профессия репортёр"} + - {id: 349, cat: TV, desc: " |- Криминальная Россия"} + - {id: 251, cat: TV, desc: " |- Военное видео и вооружение"} + - {id: 82, cat: TV, desc: " |- Все о Охоте и Рыбалке"} + - {id: 79, cat: TV, desc: " |- Непознанное и сверхъестественное"} + - {id: 474, cat: TV, desc: " |- Одиссея Жака Кусто"} + - {id: 268, cat: TV, desc: " |- Разное"} + - {id: 365, cat: TV/Sport, desc: " |- Олимпийские игры"} + - {id: 364, cat: TV/Sport, desc: " |- Фигурное катание"} + - {id: 363, cat: TV/Sport, desc: " |- Бодибилдинг/Силовые виды спорта"} + - {id: 362, cat: TV/Sport, desc: " |- Бильярд"} + - {id: 361, cat: TV/Sport, desc: " |- Волейбол/Гандбол"} + - {id: 360, cat: TV/Sport, desc: " |- Формула 1"} + - {id: 272, cat: TV/Sport, desc: " |- Футбол"} + - {id: 249, cat: TV/Sport, desc: " |- Рестлинг"} + - {id: 248, cat: TV/Sport, desc: " |- Скейтборд / Сноуборд / Паркур"} + - {id: 220, cat: TV/Sport, desc: " |- Авто/Мото"} + - {id: 219, cat: TV/Sport, desc: " |- Хоккей"} + - {id: 218, cat: TV/Sport, desc: " |- Баскетбол"} + - {id: 217, cat: TV/Sport, desc: " |- Бокс"} + - {id: 216, cat: TV/Sport, desc: " |- Теннис"} + - {id: 215, cat: TV/Sport, desc: " |- Экстрим"} + - {id: 214, cat: TV/Sport, desc: " |- Бои без правил"} + - {id: 468, cat: TV/Sport, desc: " |- Игровое видео"} + - {id: 545, cat: TV, desc: " |- Видеоуроки по программному обеспечению"} + - {id: 673, cat: TV, desc: " |- Видеоуроки по медицине (обучение, лечение, профилактика)"} + - {id: 463, cat: TV, desc: " |- Видеообучение ин. языкам"} + - {id: 735, cat: TV, desc: " |- Для родителей"} + - {id: 702, cat: TV, desc: " |- Для студентов"} + - {id: 678, cat: TV, desc: " |- Для школьного возраста"} + - {id: 677, cat: TV, desc: " |- Для самых маленьких"} + - {id: 200, cat: TV, desc: " |- Русский стиль и рукопашный бой"} + - {id: 199, cat: TV, desc: " |- Джиу-джитсу"} + - {id: 198, cat: TV, desc: " |- Айкидо и айки-дзюцу"} + - {id: 277, cat: TV, desc: "Разное (Видеоуроки, обучающее видео)"} + - {id: 657, cat: TV, desc: " |- Школа || Сёнэн || Сёдзё"} + - {id: 656, cat: TV, desc: " |- Боевые искусства"} + - {id: 655, cat: TV, desc: " |- Ужасы || Мистика || Вампиры"} + - {id: 654, cat: TV, desc: " |- Фэнтези || Апокалиптика || Постапокалиптика"} + - {id: 653, cat: TV, desc: " |- Меха"} + - {id: 658, cat: TV, desc: " |- Романтика"} + - {id: 659, cat: TV, desc: " |- Комедия"} + - {id: 660, cat: TV, desc: " |- Для детей"} + - {id: 661, cat: TV, desc: " |- Разное"} + - {id: 620, cat: TV, desc: " |- Призрак в доспехах"} + - {id: 635, cat: TV, desc: " |- Хеллсинг"} + - {id: 619, cat: TV, desc: " |- Мобильный воин ГАНДАМ"} + - {id: 618, cat: TV, desc: " |- Наруто"} + - {id: 617, cat: TV, desc: " |- Блич"} + - {id: 308, cat: TV/Anime, desc: " |- Аниме (озвучка/SD и DVD)"} + - {id: 307, cat: TV/Anime, desc: " |- Аниме (RAW/DVD)"} + - {id: 306, cat: TV/Anime, desc: " |- Аниме (RAW/SD)"} + - {id: 715, cat: TV/Anime, desc: " |- Аниме (DVD)"} + - {id: 317, cat: TV/Anime, desc: " |- 720p и 1080p (озвучка)"} + - {id: 316, cat: TV/Anime, desc: " |- 1080p (RAW)"} + - {id: 315, cat: TV/Anime, desc: " |- 720p (RAW)"} + - {id: 304, cat: TV/Anime, desc: " |- Аниме (озвучка)"} + - {id: 303, cat: TV/Anime, desc: " |- Аниме (RAW)"} + # Игры + # Games + - {id: 471, cat: Console, desc: " |- Раздачи игр от R.G. FTN Gaming RePack"} + - {id: 19, cat: Console, desc: " |- Новинки игр"} + - {id: 99, cat: Console, desc: " |- Demo, Alpha, Beta версии"} + - {id: 16, cat: Console, desc: " |- Action FPS (1st Person)"} + - {id: 885, cat: Console, desc: " |- Action TPS (3rd Person)"} + - {id: 17, cat: Console, desc: " |- RPG"} + - {id: 104, cat: Console, desc: " |- Авто/мото симуляторы"} + - {id: 105, cat: Console, desc: " |- Авиасимуляторы"} + - {id: 923, cat: Console, desc: " |- Спортивные симуляторы"} + - {id: 258, cat: Console, desc: " |- Другие симуляторы"} + - {id: 102, cat: Console, desc: " |- Аркады, Файтинги"} + - {id: 103, cat: Console, desc: " |- Приключения и Квесты"} + - {id: 101, cat: Console, desc: " |- Стратегии / Логические игры"} + - {id: 108, cat: Console, desc: " |- Мини игры"} + - {id: 20, cat: Console, desc: " |- Online-игры"} + - {id: 107, cat: Console, desc: " |- Детские и обучающие игры"} + - {id: 109, cat: Console, desc: " |- Аниме-игры"} + - {id: 722, cat: Console, desc: " |- Action (старые игры)"} + - {id: 721, cat: Console, desc: " |- RPG (старые игры)"} + - {id: 720, cat: Console, desc: " |- Симуляторы (старые игры)"} + - {id: 719, cat: Console, desc: " |- Аркады (старые игры)"} + - {id: 718, cat: Console, desc: " |- Приключения и Квесты (старые игры)"} + - {id: 717, cat: Console, desc: " |- Стратегии (старые игры)"} + - {id: 989, cat: Console, desc: " |- Модифицированные версии игр"} + - {id: 18, cat: Console, desc: " |- Моды, русификаторы, патчи, дополнения и обновления для игр"} + - {id: 724, cat: Console, desc: " |- Игровой софт"} + - {id: 450, cat: Console, desc: " |- S.T.A.L.K.E.R."} + - {id: 920, cat: Console, desc: " |- Игры для Mac OS"} + - {id: 695, cat: Console, desc: " |- PlayStation 1/2/3"} + - {id: 113, cat: Console, desc: " |- Xbox (Xbox 360)"} + - {id: 112, cat: Console, desc: " |- PSX-PSP"} + - {id: 111, cat: Console, desc: " |- Dreamcast"} + - {id: 679, cat: Console, desc: " |- Видео для PSP"} + - {id: 662, cat: Console, desc: " |- Софт для консолей"} + - {id: 116, cat: Console, desc: " |- Портативные и Консольные (Игры)"} + # ПО для Windows + # Software for Windows + - {id: 529, cat: PC/0day, desc: " |- Информация и диагностика"} + - {id: 518, cat: PC/0day, desc: " |- Системные утилиты"} + - {id: 516, cat: PC/0day, desc: " |- Безопасность: Защита информации. Антивирусы/файерволы"} + - {id: 515, cat: PC/0day, desc: " |- Архиваторы и файловые менеджеры"} + - {id: 514, cat: PC/0day, desc: " |- Сервисное обслуживание ПК"} + - {id: 513, cat: PC/0day, desc: " |- Настройка и оптимизация ОС"} + - {id: 530, cat: PC/0day, desc: " |- Сборники смешанного ПО"} + - {id: 437, cat: PC/0day, desc: " |- Активаторы (лоадеры) OS Windows / Office, SP и оф патчи"} + - {id: 520, cat: PC/0day, desc: " |- Офис"} + - {id: 528, cat: PC/0day, desc: " |- Работа с PDF и DjVu"} + - {id: 522, cat: PC/0day, desc: " |- Программы для бизнеса и делопроизводства"} + - {id: 521, cat: PC/0day, desc: " |- Словари, Переводчики"} + - {id: 527, cat: PC/0day, desc: " |- Распознавание текста, звука и синтез речи"} + - {id: 508, cat: PC/0day, desc: " |- Консультант+"} + - {id: 509, cat: PC/0day, desc: " |- Гарант"} + - {id: 510, cat: PC/0day, desc: " |- Другие справочно-правовые системы и обучающее ПО"} + - {id: 511, cat: PC/0day, desc: " |- Справочное ПО: справочники, каталоги"} + - {id: 543, cat: PC/0day, desc: " |- Запись CD, DVD"} + - {id: 526, cat: PC/0day, desc: " |- Графика / Просмотрщики графики"} + - {id: 525, cat: PC/0day, desc: " |- Для работы с аудио"} + - {id: 524, cat: PC/0day, desc: " |- Для работы с видео"} + - {id: 887, cat: PC/0day, desc: " |- Интернет TV & Radio"} + - {id: 561, cat: PC/0day, desc: " |- Удаленный доступ и ПО для свободного доступа в интернет"} + - {id: 555, cat: PC/0day, desc: " |- 3G USB-модем и Webcam"} + - {id: 537, cat: PC/0day, desc: " |- Утилиты для удаления всплывающих окон и баннерной рекламы"} + - {id: 536, cat: PC/0day, desc: " |- Программы общения"} + - {id: 535, cat: PC/0day, desc: " |- Почта и файлообмен"} + - {id: 533, cat: PC/0day, desc: " |- Браузеры и дополнения к ним"} + - {id: 534, cat: PC/0day, desc: " |- Разное"} + - {id: 542, cat: PC/0day, desc: " |- Сборники драйверов и ПО для обновления драйверов"} + - {id: 541, cat: PC/0day, desc: " |- Звуковые карты"} + - {id: 540, cat: PC/0day, desc: " |- Видеокарты"} + - {id: 539, cat: PC/0day, desc: " |- Материнские платы"} + - {id: 554, cat: PC/0day, desc: " |- Темы, скринсейверы ..."} + - {id: 551, cat: PC/0day, desc: " |- Обои"} + - {id: 553, cat: PC/0day, desc: " |- Гаджеты рабочего стола"} + - {id: 739, cat: PC/0day, desc: " |- Аватары, Иконки, Смайлы"} + - {id: 607, cat: PC/0day, desc: " |- САПР"} + - {id: 344, cat: PC/0day, desc: " |- ГИС (Геоинформационные системы)"} + - {id: 965, cat: PC/0day, desc: " |- Программирование и разработка ПО"} + - {id: 345, cat: PC/0day, desc: " |- Карты, снабженные программной оболочкой"} + - {id: 348, cat: PC/0day, desc: " |- Разное - системы навигации и карты"} + - {id: 680, cat: PC/0day, desc: " |- ПО по диагностике и ремонту автомобилей"} + - {id: 675, cat: PC/0day, desc: " |- Программное обеспечение по медицине"} + - {id: 560, cat: PC/0day, desc: " |- Photostoсks"} + - {id: 559, cat: PC/0day, desc: " |- Футажи"} + - {id: 558, cat: PC/0day, desc: " |- Заготовки, виньетки, рамки"} + - {id: 557, cat: PC/0day, desc: " |- Растровые и Векторные Клипарты"} + - {id: 960, cat: PC/0day, desc: " |- Вспомогательный софт для релизера"} + - {id: 961, cat: PC/0day, desc: " |- Разное"} + # Операционные системы и программирование + # Operating systems and programming + - {id: 972, cat: PC, desc: " |- Windows 10 / 11 (Оригинальные версии)"} + - {id: 909, cat: PC, desc: " |- Windows 8 / 8.1 (Оригинальные версии)"} + - {id: 822, cat: PC, desc: " |- Windows 7 (Оригинальные версии)"} + - {id: 823, cat: PC, desc: " |- Windows Vista (Оригинальные версии)"} + - {id: 824, cat: PC, desc: " |- Windows XP (Оригинальные версии)"} + - {id: 434, cat: PC, desc: " |- Windows OS, выпущенные до 2001 года (Оригинальные версии)"} + - {id: 973, cat: PC, desc: " |- Windows 10 / 11 (сборки)"} + - {id: 883, cat: PC, desc: " |- Windows 8 / 8.1 (сборки)"} + - {id: 264, cat: PC, desc: " |- Windows 7 (сборки)"} + - {id: 166, cat: PC, desc: " |- Windows Vista (сборки)"} + - {id: 165, cat: PC, desc: " |- Windows XP (сборки)"} + - {id: 167, cat: PC, desc: " |- Серверные OS Windows"} + - {id: 998, cat: PC, desc: " |- Insider Preview, RC, Beta версии, Service Packs"} + - {id: 265, cat: PC, desc: " |- Cборники разных операционных систем"} + - {id: 281, cat: PC, desc: " |- Помощь/Опросы/Общение"} + - {id: 168, cat: PC, desc: " |- Операционные системы"} + - {id: 280, cat: PC, desc: " |- Программное обеспечение"} + - {id: 169, cat: PC, desc: " |- Другие ОС и ПО под них"} + - {id: 732, cat: PC, desc: " |- Игры для Linux"} + - {id: 328, cat: PC, desc: " |- Видеоуроки по Linux"} + - {id: 286, cat: PC, desc: " |- Общение"} + - {id: 285, cat: PC/Mac, desc: " |- Аудио редакторы и конверторы для Mac OS"} + - {id: 284, cat: PC/Mac, desc: " |- Программы для создания и обработки графики Mac OS"} + - {id: 283, cat: PC/Mac, desc: " |- Программы для просмотра и обработки видео Mac OS"} + - {id: 282, cat: PC/Mac, desc: " |- Mac OS"} + - {id: 171, cat: PC/Mac, desc: " |- Системные программы для Mac OS"} + - {id: 170, cat: PC/Mac, desc: " |- Mac OS (для Macintosh)"} + - {id: 436, cat: Other, desc: " |- WYSIWYG Редакторы для веб-дизайна"} + - {id: 435, cat: Other, desc: " |- Обмен исходниками"} + - {id: 376, cat: Other, desc: " |- Среды программирования, компиляторы и вспомогательные програ.."} + - {id: 370, cat: Other, desc: " |- Системы управления базами данных"} + - {id: 369, cat: Other, desc: " |- Скрипты и шаблоны"} + - {id: 368, cat: Other, desc: " |- Компоненты для сред программирования"} + - {id: 367, cat: Other, desc: " |- Ищу и предлагаю (Веб-разработка и программирование)"} + # iPhone, iPod, iPod Touch, iPad, мобильные телефоны . Android и КПК + # iPhone, iPod, iPod Touch, iPad, mobile phones. + - {id: 430, cat: PC/Mobile-iOS, desc: " |- База знаний"} + - {id: 967, cat: PC/Mobile-iOS, desc: " |- Прошивки и ОС"} + - {id: 426, cat: PC/Mobile-iOS, desc: " |- Программы"} + - {id: 429, cat: PC/Mobile-iOS, desc: " |- Игры"} + - {id: 428, cat: PC/Mobile-iOS, desc: " |- Видео"} + - {id: 913, cat: PC/Mobile-iOS, desc: " |- Видео"} + - {id: 175, cat: PC/Mobile-iOS, desc: " |- Приложения"} + - {id: 174, cat: PC/Mobile-iOS, desc: " |- Игры"} + # Музыка + # Music + - {id: 939, cat: Audio/Lossless, desc: " |- Дискографии в Lossless"} + - {id: 948, cat: Audio/MP3, desc: " |- Дискографии в MP3"} + - {id: 129, cat: Audio, desc: " |- Многоканальная музыка (Электронная музыка)"} + - {id: 825, cat: Audio/Lossless, desc: " |- Lossless (Электронная Музыка)"} + - {id: 829, cat: Audio/MP3, desc: " |- Techno / Hardcore / Acid (mp3)"} + - {id: 828, cat: Audio/MP3, desc: " |- Radioshows, Podcasts, Live Sets, Mixes (mp3)"} + - {id: 827, cat: Audio/MP3, desc: " |- D'n'B / Jungle / Breaks (mp3)"} + - {id: 826, cat: Audio/MP3, desc: " |- Ambient / ChillOut (mp3)"} + - {id: 288, cat: Audio/MP3, desc: " |- Drum and Bass (mp3)"} + - {id: 128, cat: Audio/MP3, desc: " |- Garage (mp3)"} + - {id: 127, cat: Audio/MP3, desc: " |- Mixadance (mp3)"} + - {id: 126, cat: Audio/MP3, desc: " |- House / Electro / Dance / Synthpop (mp3)"} + - {id: 125, cat: Audio/MP3, desc: " |- Trance / ProgressiveTranсе / HardStyle (mp3)"} + - {id: 124, cat: Audio/MP3, desc: " |- Электронная музыка других жанров (mp3)"} + - {id: 929, cat: Audio/MP3, desc: " |- Сборники разных исполнителей (mp3)"} + - {id: 940, cat: Audio/Lossless, desc: " |- Дискографии в Lossless"} + - {id: 951, cat: Audio/MP3, desc: " |- Дискографии в MP3"} + - {id: 130, cat: Audio, desc: " |- Многоканальная музыка (Рэп, Хип-Хоп, R.n.B)"} + - {id: 830, cat: Audio/Lossless, desc: " |- Lossless (Рэп, Хип-Хоп, R.n.B)"} + - {id: 134, cat: Audio/MP3, desc: " |- Отечественный Рэп, Хип-Хоп (mр3)"} + - {id: 133, cat: Audio/MP3, desc: " |- Зарубежный Рэп, Хип-Хоп (mр3)"} + - {id: 132, cat: Audio/MP3, desc: " |- Отечественный R.n.B (mр3)"} + - {id: 131, cat: Audio/MP3, desc: " |- Зарубежный R.n.B (mр3)"} + - {id: 930, cat: Audio/MP3, desc: " |- Сборники разных исполнителей (mp3)"} + - {id: 941, cat: Audio/Lossless, desc: " |- Дискографии в Lossless"} + - {id: 952, cat: Audio/MP3, desc: " |- Дискографии в MP3"} + - {id: 831, cat: Audio, desc: " |- Многоканальная музыка (Зарубежный рок)"} + - {id: 454, cat: Audio/Lossless, desc: " |- Lossless (Зарубежный рок)"} + - {id: 149, cat: Audio/MP3, desc: " |- Аltеrnаtivе, Hard, Indереndеnt (mp3)"} + - {id: 839, cat: Audio/MP3, desc: " |- Reggae, Ska, Dub (mp3)"} + - {id: 148, cat: Audio/MP3, desc: " |- Punk, Hardcore, Emo (mp3)"} + - {id: 147, cat: Audio/MP3, desc: " |- Rock, Metalcore, Metal (mp3)"} + - {id: 931, cat: Audio/MP3, desc: " |- Сборники разных исполнителей (mp3)"} + - {id: 942, cat: Audio/Lossless, desc: " |- Дискографии в Lossless"} + - {id: 954, cat: Audio/MP3, desc: " |- Дискографии в MP3"} + - {id: 832, cat: Audio, desc: " |- Многоканальная музыка (Отечественный рок)"} + - {id: 455, cat: Audio/Lossless, desc: " |- Lossless (Отечественный рок)"} + - {id: 834, cat: Audio/MP3, desc: " |- Nu Metal, Metalcore, Metal (mp3)"} + - {id: 833, cat: Audio/MP3, desc: " |- Аltеrnаtivе, Hard, Indереndеnt (mp3)"} + - {id: 152, cat: Audio/MP3, desc: " |- Punk, Hardcore, Emo (mp3)"} + - {id: 151, cat: Audio/MP3, desc: " |- Reggae, Ska, Dub (mp3)"} + - {id: 932, cat: Audio/MP3, desc: " |- Сборники разных исполнителей (mp3)"} + - {id: 943, cat: Audio/Lossless, desc: " |- Дискографии в Lossless"} + - {id: 956, cat: Audio/MP3, desc: " |- Дискографии в MP3"} + - {id: 845, cat: Audio, desc: " |- Многоканальная музыка (Industrial)"} + - {id: 844, cat: Audio/Lossless, desc: " |- Lossless (Industrial)"} + - {id: 843, cat: Audio/MP3, desc: " |- Отечественный Industrial (mp3)"} + - {id: 842, cat: Audio/MP3, desc: " |- Зарубежный Industrial (mp3)"} + - {id: 936, cat: Audio/MP3, desc: " |- Сборники разных исполнителей (mp3)"} + - {id: 944, cat: Audio/Lossless, desc: " |- Дискографии в Lossless"} + - {id: 955, cat: Audio/MP3, desc: " |- Дискографии в MP3"} + - {id: 853, cat: Audio, desc: " |- Многоканальная музыка (Folk, NewAge, Flamenco)"} + - {id: 852, cat: Audio/Lossless, desc: " |- Lossless (Folk, NewAge, Flamenco)"} + - {id: 851, cat: Audio/MP3, desc: " |- Flamenco и акустическая гитара (mp3)"} + - {id: 850, cat: Audio/MP3, desc: " |- Этническая музыка Африки и Азии (mp3)"} + - {id: 849, cat: Audio/MP3, desc: " |- Country, Bluegrass (mp3)"} + - {id: 848, cat: Audio/MP3, desc: " |- Этническая музыка Кавказа и Закавказья (mp3)"} + - {id: 847, cat: Audio/MP3, desc: " |- NewAge & Meditative (mp3)"} + - {id: 846, cat: Audio/MP3, desc: " |- Folk и neo-folk, celtic, medieval (mp3)"} + - {id: 935, cat: Audio/MP3, desc: " |- Сборники разных исполнителей (mp3)"} + - {id: 945, cat: Audio/Lossless, desc: " |- Дискографии в Lossless"} + - {id: 953, cat: Audio/MP3, desc: " |- Дискографии в MP3"} + - {id: 222, cat: Audio, desc: " |- Многоканальная музыка (Поп-музыка)"} + - {id: 221, cat: Audio/Lossless, desc: " |- Lossless (Поп-музыка)"} + - {id: 326, cat: Audio/MP3, desc: " |- Отечественная Eurodance, Technopop, Disco (mp3)"} + - {id: 223, cat: Audio/MP3, desc: " |- Зарубежная Eurodance, Technopop, Disco (mp3)"} + - {id: 156, cat: Audio/MP3, desc: " |- Отечественная Поп музыка (mp3)"} + - {id: 157, cat: Audio/MP3, desc: " |- Зарубежная Поп музыка (mp3)"} + - {id: 158, cat: Audio/MP3, desc: " |- Сборники отечественной Поп-музыки (mp3)"} + - {id: 224, cat: Audio/MP3, desc: " |- Сборники зарубежной Поп-музыки (mp3)"} + - {id: 924, cat: Audio/MP3, desc: " |- Сборники разных исполнителей (mp3)"} + - {id: 946, cat: Audio/Lossless, desc: " |- Дискографии в Lossless"} + - {id: 950, cat: Audio/MP3, desc: " |- Дискографии в MP3"} + - {id: 840, cat: Audio, desc: " |- Многоканальная музыка (Классическая музыка)"} + - {id: 841, cat: Audio/Lossless, desc: " |- Lossless (Классическая музыка)"} + - {id: 153, cat: Audio/MP3, desc: " |- Классическая музыка (mp3)"} + - {id: 933, cat: Audio/MP3, desc: " |- Сборники разных исполнителей (mp3)"} + - {id: 947, cat: Audio/Lossless, desc: " |- Дискографии в Lossless"} + - {id: 949, cat: Audio/MP3, desc: " |- Дискографии в MP3"} + - {id: 928, cat: Audio, desc: " |- Многоканальная музыка"} + - {id: 938, cat: Audio/Lossless, desc: " |- Lossless (Музыка других жанров)"} + - {id: 572, cat: Audio/MP3, desc: " |- Blues, Lounge,Cillout, Bossa Nova (mp3)"} + - {id: 155, cat: Audio/MP3, desc: " |- Джаз (mp3)"} + - {id: 871, cat: Audio/MP3, desc: " |- Военная и Патриотическая песня (mp3)"} + - {id: 259, cat: Audio/MP3, desc: " |- Шансон и Бардовская песня (mp3)"} + - {id: 448, cat: Audio/MP3, desc: " |- Музыка для детей (mp3)"} + - {id: 934, cat: Audio/MP3, desc: " |- Сборники разных исполнителей (mp3)"} + - {id: 867, cat: Audio, desc: " |- Рок-музыка (муз видео)"} + - {id: 866, cat: Audio, desc: " |- Электронная музыка (муз видео)"} + - {id: 865, cat: Audio, desc: " |- Поп-музыка ( муз видео)"} + - {id: 864, cat: Audio, desc: " |- Народная музыка (Folk) (муз видео)"} + - {id: 863, cat: Audio, desc: " |- Джаз (муз видео)"} + - {id: 862, cat: Audio, desc: " |- Блюз (муз видео)"} + - {id: 861, cat: Audio, desc: " |- Классика (муз видео)"} + - {id: 860, cat: Audio, desc: " |- Рэп, Хип-Хоп, R.n.B (муз видео)"} + - {id: 859, cat: Audio, desc: " |- Русский шансон (муз видео)"} + - {id: 858, cat: Audio, desc: " |- Детское муз видео"} + - {id: 289, cat: Audio, desc: " |- К играм"} + - {id: 290, cat: Audio, desc: " |- К фильмам"} + - {id: 291, cat: Audio, desc: " |- К сериалам"} + # Литература и обучение + # Literature and learning + - {id: 61, cat: Books, desc: " |- Художественная литература"} + - {id: 664, cat: Books, desc: " |- Художественная литература для детей"} + - {id: 467, cat: Books, desc: " |- Художественная литература на иностранных языках"} + - {id: 703, cat: Books, desc: "Программы и библиотеки для электронных книг"} + - {id: 966, cat: Books, desc: " |- Кулинария"} + - {id: 666, cat: Books, desc: " |- Обучающая литература для родителей"} + - {id: 665, cat: Books, desc: " |- Обучающая литература для детей"} + - {id: 182, cat: Books, desc: " |- Учебники, справочники, энциклопедии"} + - {id: 466, cat: Books, desc: " |- Книги, учебники и справочная литература по обучению ин. язык.."} + - {id: 185, cat: Books, desc: " |- Философия и религия"} + - {id: 184, cat: Books, desc: " |- Психология"} + - {id: 183, cat: Books, desc: " |- Хобби (увлечения и досуг)"} + - {id: 181, cat: Books, desc: " |- Литература по компьютерам и ПО"} + - {id: 782, cat: Books, desc: " |- Радиоэлектроника"} + - {id: 585, cat: Books, desc: " |- Литература по авто и мото транспорту"} + - {id: 584, cat: Books, desc: " |- Руководства по ремонту/обслуживанию/эксплуатации авто"} + - {id: 586, cat: Books, desc: " |- Авто - Тюнинг, чиптюнинг, настройка, отделка и укращения"} + - {id: 672, cat: Books, desc: " |- Литература по медицине"} + - {id: 793, cat: Books, desc: "Журналы научно-прикладные и познавательно-образовательные"} + - {id: 875, cat: PC, desc: " |- Интерактивные компьютерные диски для хобби"} + - {id: 583, cat: PC, desc: " |- Интерактивные справочники и каталоги для авто/мото транспорт.."} + - {id: 465, cat: PC, desc: " |- Интерактивные и компьютерные диски для обучения ин. языкам"} + - {id: 674, cat: PC, desc: " |- Интерактивные и компьютерные диски по медицине"} + - {id: 710, cat: PC, desc: " |- Прочие материалы для детей и родителей"} + - {id: 897, cat: Books, desc: " |- Прочее"} + - {id: 896, cat: Books, desc: " |- Автомобили"} + - {id: 895, cat: Books, desc: " |- Домашним мастерам"} + - {id: 894, cat: Books, desc: " |- Для женщин"} + - {id: 893, cat: Books, desc: " |- Для мужчин"} + - {id: 892, cat: Books, desc: " |- Научно-популярное"} + - {id: 891, cat: Books, desc: " |- Мир техники"} + - {id: 890, cat: Books, desc: " |- Игры"} + - {id: 889, cat: Books, desc: " |- История"} + - {id: 21, cat: Audio/Audiobook, desc: "Аудиокниги"} + - {id: 736, cat: Audio/Audiobook, desc: " |- S.T.A.L.K.E.R."} + - {id: 693, cat: Audio/Audiobook, desc: " |- Романы"} + - {id: 464, cat: Audio/Audiobook, desc: " |- Аудиообучение ин. языкам"} + - {id: 686, cat: Audio/Audiobook, desc: " |- Обучающие и познавательные аудиокниги"} + - {id: 685, cat: Audio/Audiobook, desc: " |- Аудиокниги на иностранных языках"} + - {id: 684, cat: Audio/Audiobook, desc: " |- Детективы"} + - {id: 441, cat: Audio/Audiobook, desc: " |- Фантастика"} + - {id: 192, cat: Audio/Audiobook, desc: " |- Классика"} + - {id: 816, cat: Audio/Audiobook, desc: " |- Современная литература"} + - {id: 190, cat: Audio/Audiobook, desc: " |- Аудио книги для детей"} + - {id: 191, cat: Audio/Audiobook, desc: " |- Обучающие аудиокниги и аудиоупражнения для детей"} + - {id: 687, cat: Audio, desc: " |- Аудиоспектакли и литературные чтения"} + - {id: 751, cat: Audio, desc: " |- Аудио юмористические концерты (выступления)"} + # Эротика + # Erotica + - {id: 963, cat: XXX, desc: "Эротические художественные фильмы"} + - {id: 964, cat: XXX, desc: "Эротические документальные фильмы"} + - {id: 178, cat: XXX, desc: "Русская эротика"} + - {id: 179, cat: XXX, desc: "Иностранная эротика"} + - {id: 176, cat: XXX, desc: "Фото, ролики"} + - {id: 577, cat: XXX, desc: "Нетрадиционная эротика"} + - {id: 571, cat: XXX, desc: "Мультипликационные фильмы для взрослых"} + - {id: 177, cat: XXX, desc: "Хентай"} + - {id: 812, cat: XXX, desc: "3D | Стерео эротика"} + - {id: 882, cat: XXX, desc: " |- 3D | мульт"} + - {id: 817, cat: XXX, desc: " |- 3D | Хентай"} + - {id: 815, cat: XXX, desc: " |- 3D | Видеоролики"} + - {id: 814, cat: XXX, desc: " |- 3D | Русская эротика"} + - {id: 813, cat: XXX, desc: " |- 3D | Иностранная эротика"} + - {id: 820, cat: XXX, desc: "Литература"} + # Служебный раздел + # Service section + - {id: 57, cat: Other, desc: "Временный склад (TEMP)"} + - {id: 433, cat: Other, desc: "Архив раздач"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: stripcyrillic + type: checkbox + label: Strip Cyrillic Letters + default: false + - name: addrussiantotitle + type: checkbox + label: Add RUS to end of all titles to improve language detection by Sonarr and Radarr. Will cause English-only results to be misidentified. + default: false + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 1 + options: + 1: created + 10: seeders + 7: size + 2: title + - name: type + type: select + label: Order requested from site + default: 2 + options: + 2: desc + 1: asc + +login: + path: login.php + method: form + form: form[action$="/login.php"] + inputs: + login_username: "{{ .Config.username }}" + login_password: "{{ .Config.password }}" + autologin: 1 + selectorinputs: + cookie_test: + selector: input[name="cookie_test"] + attribute: value + error: + - selector: h4.warnColor1 + test: + path: index.php + selector: a[href="/login.php?logout=1"] + +search: + paths: + - path: tracker.php + inputs: + $raw: "{{ if .Categories }}{{ range .Categories }}f[]={{.}}&{{end}}{{ else }}f[]=-1{{ end }}" + prev_allw: 1 + prev_a: 0 + prev_dla: 0 + prev_dlc: 0 + prev_dld: 0 + prev_dlw: 0 + prev_my: 0 + prev_new: 0 + prev_sd: 0 + prev_da: 1 + prev_dc: 0 + prev_df: 1 + prev_ds: 0 + # sort by 1=registered 2=topicTitle 4=completed 10=seed 11=leech 12=up 13=down 5=replies 6=views 7=size 8=lastPost 9=seedLastSeen + o: "{{ .Config.sort }}" + # 1=asc 2=desc + s: "{{ .Config.type }}" + # show category + dc: 0 + # show forum + df: 1 + # show author + da: 1 + # show speed + ds: 0 + # -1=all time + tm: -1 + # seed not seen -1=disregard + sns: -1 + nm: "{{ .Keywords }}" + # search all words + allw: 1 + + keywordsfilters: + - name: diacritics + args: replace + # strip season and/or ep + - name: re_replace + args: ["(?i)\\b(?:[SE]\\d{1,4}){1,2}\\b\\s?", ""] + + rows: + selector: "tr[id^=\"tor_\"]:has(a[href^=\"/download.php?id=\"]){{ if .Config.freeleech }}:has(img[src=\"images/tor_gold.gif\"]){{ else }}{{ end }}" + + fields: + category: + selector: a.gen + attribute: href + filters: + - name: querystring + args: f + title: + selector: a.genmed + filters: + # normalize to SXXEYY format + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:(?:-|–)\\d+)?).+?(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:(?:-|–)\\d+)?)\\s*из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:(?:-|–)\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:(?:-|–)\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:(?:-|–)\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:(?:-|–)\\d+)?)\\s*(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:(?:-|–)\\d+)?).+?(\\d+(?:(?:-|–)\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:(?:-|–)\\d+)?).+?(\\d+(?:(?:-|–)\\d+)?)\\s*(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:(?:-|–)\\d+)?).+?(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:(?:-|–)\\d+)?)", "S$1E$2"] + - name: re_replace + args: ["(?i)(\\d+(?:(?:-|–)\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:(?:-|–)\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:(?:-|–)\\d+)?).+?(\\d+(?:(?:-|–)\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:(?:-|–)\\d+)?)", "S$1"] + - name: re_replace + args: ["(?i)(\\d+(?:(?:-|–)\\d+)?)\\s+[CС]езоны?", "S$1"] + - name: re_replace + args: ["(?i)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:(?:-|–)\\d+)?)\\s*из\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:(?:-|–)\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:(?:-|–)\\d+)?)\\s+(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:(?:-|–)\\d+)?)", "E$1"] + - name: re_replace + args: ["(?i)(\\d+(?:(?:-|–)\\d+)?)\\s+(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "E$1"] + - name: re_replace + args: ["(?i)\\bКураж-Бамбей\\b", "kurazh"] + - name: re_replace + args: ["(?i)\\bКубик в Кубе\\b", "Kubik"] + - name: re_replace + args: ["(?i)\\bКравец\\b", "Kravec"] + - name: re_replace + args: ["(?i)\\bПифагор\\b", "Pifagor"] + - name: re_replace + args: ["(?i)\\bНевафильм\\b", "Nevafilm"] + - name: re_replace + args: ["(?i)\\bЛицензия\\b", "Lic"] + - name: re_replace + args: ["(?i)\\bселезень\\b", "selezen"] + - name: re_replace + args: ["(\\([\\p{IsCyrillic}\\W]+\\))|(^[\\p{IsCyrillic}\\W\\d]+\\/ )|([\\p{IsCyrillic} \\-]+,+)|([\\p{IsCyrillic}]+)", "{{ if .Config.stripcyrillic }}{{ else }}$1$2$3$4{{ end }}"] + - name: re_replace + args: ["(?i)\\bHDTV[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bSAT[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bWEB[-\\s]?DL[-\\s]?Rip\\b", "WEB-DL"] + - name: re_replace + args: ["(?i)\\bWEB\\sRip\\b", "WEBRip"] + - name: re_replace + args: ["(?i)\\bWEB\\sDL\\b", "WEB-DL"] + - name: re_replace + args: ["[\\[\\(\\{<«][\\s\\W]*[\\]\\)\\}>»]", ""] + - name: re_replace + args: ["^[\\s&,\\.!\\?\\+\\-_\\|\\/':]+", ""] + - name: append + args: "{{ if .Config.addrussiantotitle }} RUS{{ else }}{{ end }}" + details: + selector: a.genmed + attribute: href + download: + selector: a[href^="/download.php?id="] + attribute: href + size: + selector: td:nth-child(6) > u + seeders: + selector: td.seedmed > b + leechers: + selector: td.leechmed > b + grabs: + selector: td:nth-child(9) + date: + # unix + selector: td:last-child > u + downloadvolumefactor: + case: + img[src="images/tor_gold.gif"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + description: + selector: a.genmed +# TorrentPier diff --git a/config/prowlarr/Definitions/finelite.yml b/config/prowlarr/Definitions/finelite.yml new file mode 100644 index 0000000..6ec5723 --- /dev/null +++ b/config/prowlarr/Definitions/finelite.yml @@ -0,0 +1,147 @@ +--- +id: finelite +name: FinElite +description: "FinElite (FE) is a FINNISH Private Torrent Tracker for MOVIES / TV / GENERAL" +language: fi-FI +type: private +encoding: UTF-8 +links: + - https://finelite.org/ + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +caps: + categorymappings: + - {id: 33, cat: Audio/Audiobook, desc: "Audiobooks"} + - {id: 29, cat: TV/Documentary, desc: "Documentary"} + - {id: 24, cat: Books/EBook, desc: "Ebooks"} + - {id: 28, cat: Movies, desc: "FE-INT"} + - {id: 10, cat: Console, desc: "Games - Console"} + - {id: 11, cat: PC/Games, desc: "Games - PC"} + - {id: 26, cat: Movies, desc: "Kids"} + - {id: 9, cat: PC/Mobile-Other, desc: "Mobile"} + - {id: 12, cat: Movies, desc: "Movie Pack"} + - {id: 13, cat: Movies/DVD, desc: "Movies DVD-r"} + - {id: 14, cat: Movies/HD, desc: "Movies HD"} + - {id: 15, cat: Movies/SD, desc: "Movies SD"} + - {id: 22, cat: Audio/Lossless, desc: "Music FLAC"} + - {id: 23, cat: Audio/MP3, desc: "Music MP3"} + - {id: 19, cat: TV/HD, desc: "TV HD"} + - {id: 16, cat: TV, desc: "TV Pack"} + - {id: 17, cat: TV/SD, desc: "TV SD"} + - {id: 31, cat: Movies/UHD, desc: "Ultra HD"} + - {id: 20, cat: XXX, desc: "XXX HD"} + - {id: 21, cat: XXX/SD, desc: "XXX SD"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +login: + path: login.php + method: form + form: form#login + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: td.embedded:contains("Virhe") # error + - selector: td.embedded:contains("epäonnistui") # falied + test: + path: / + selector: a[href="ulos.php"] + +search: + paths: + # https://finelite.org/selaa.php?c14=1&c15=1&c31=1&search=tt6591554&hae=1&type=desc&cat=0&incldead=1&sort=4 + # https://finelite.org/selaa.php?search=&hae=0&type=desc&cat=0&incldead=0&freeleech=yes&sort=4 + - path: selaa.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # 0 name, 1 name&desc, 2 descr, 3 tags, 4 imdb with rating + hae: "{{ if .Query.IMDBID }}2{{ else }}0{{ end }}" + # 0 active, 1 incldead, 2 deadonly + incldead: 1 + freeleech: "{{ if .Config.freeleech }}yes{{ else }}{{ end }}" + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + + rows: + selector: table.main > tbody > tr:has(a[href^="/lataa.php/"]) + + fields: + category: + selector: a[href*="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="julkaisu.php?id="] + details: + selector: a[href^="julkaisu.php?id="] + attribute: href + download: + selector: a[href^="/lataa.php/"] + attribute: href + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + date: + # 26.3.2022
3:53 + selector: td:nth-last-child(4) + filters: + - name: re_replace + args: [" (\\d{1}):(\\d{2})", " 0$1:$2"] + - name: append + args: " +02:00" # EET + - name: dateparse + args: "d.M.yyyy HH:mm zzz" + size: + selector: td:nth-last-child(3) + seeders: + selector: td:nth-last-child(2) + leechers: + selector: td:nth-last-child(1) + downloadvolumefactor: + case: + span.label-free: 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 3 days (as seconds = 3 x 24 x 60 x 60) + text: 259200 +# custom 3.1.4 diff --git a/config/prowlarr/Definitions/finvip.yml b/config/prowlarr/Definitions/finvip.yml new file mode 100644 index 0000000..af00f2c --- /dev/null +++ b/config/prowlarr/Definitions/finvip.yml @@ -0,0 +1,171 @@ +--- +id: finvip +name: FinVip +description: "FinVip is a FINNISH Private Torrent Tracker for MOVIES / TV / GENERAL" +language: fi-FI +type: private +encoding: UTF-8 +testlinktorrent: false +links: + - https://finvip.org/ + +caps: + categorymappings: + - {id: 5, cat: TV/Anime, desc: "Anime"} + - {id: 25, cat: TV/Documentary, desc: "Dokumentit (docs)"} + - {id: 6, cat: Books/EBook, desc: "e-Kirjat (ebooks)"} + - {id: 49, cat: Audio/Audiobook, desc: "Äänikirjat (audiobook)"} + - {id: 20, cat: TV/SD, desc: "Lasten DVD (kids)"} + - {id: 33, cat: TV/SD, desc: "Lasten SD (kids)"} + - {id: 50, cat: TV/HD, desc: "Lasten HD (kids)"} + - {id: 51, cat: TV/UHD, desc: "Lasten 4K (kids)"} + - {id: 11, cat: Movies/DVD, desc: "Leffat DVD (movies)"} + - {id: 13, cat: Movies/SD, desc: "Leffat SD (movies)"} + - {id: 21, cat: Movies/HD, desc: "Leffat HD (movies)"} + - {id: 48, cat: Movies/UHD, desc: "Leffat 4K (movies)"} + - {id: 15, cat: Audio/MP3, desc: "Musiikki (music)"} + - {id: 53, cat: Audio/Lossless, desc: "Musiikki Flac (music)"} + - {id: 12, cat: Audio/Video, desc: "Musavideot (clips)"} + - {id: 7, cat: PC/0day, desc: "Ohjelmat (apps)"} + - {id: 17, cat: PC/Games, desc: "Pelit PC (games)"} + - {id: 18, cat: Console, desc: "Pelit Konsoli (console)"} + - {id: 23, cat: XXX/SD, desc: "Porn SD"} + - {id: 36, cat: XXX/Other, desc: "Porn Muut"} + - {id: 47, cat: XXX/x264, desc: "Porn HD"} + - {id: 54, cat: XXX/UHD, desc: "Porn 4K"} + - {id: 1, cat: TV/SD, desc: "Sarjat Boxset (series)"} + - {id: 30, cat: TV/SD, desc: "Sarjat SD (series)"} + - {id: 41, cat: TV/HD, desc: "Sarjat HD (series)"} + - {id: 52, cat: TV/UHD, desc: "Sarjat 4K (series)"} + - {id: 40, cat: TV/Sport, desc: "Urheilu (sport)"} + - {id: 31, cat: Other, desc: "Muut (other)"} + - {id: 43, cat: TV, desc: "Salkkarit (drama)"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: info_results + type: info + label: "Search results" + default: "
  1. Only the Xbtit style is supported.
    • Make sure to set the Style option in your profile to Xbtit.
  2. For best results, increase the torrents number in your profile to 100.
    • Set the Torrents Per Page option to 100.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 3 + options: + 3: created + 5: seeders + 4: size + 2: title + - name: type + type: select + label: Order requested from site + default: 2 + options: + 2: desc + 1: asc + +login: + path: index.php?page=login + method: post + inputs: + uid: "{{ .Config.username }}" + pwd: "{{ .Config.password }}" + logout: no + error: + - selector: tr td span[style="color:#FF0000;"] + test: + path: index.php + selector: a[href="logout.php"] + +download: + selectors: + - selector: a[href^="download.php?id="] + attribute: href + +search: + paths: + # https://finvip.org/index.php?page=torrents&active=0&gold=0&category=5;25;6&order=3&by=2 + - path: index.php + inputs: + page: torrents + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + category: "{{ if .Categories }}{{ range .Categories }}{{.}};{{end}}{{ else }}0{{ end }}" + # 0 title 1 title&descr 2 descr + options: "{{ if .Query.IMDBID }}1{{ else }}0{{ end }}" + # 0 all, 1 activeonly, 2 deadonly + active: 0 + # 0 all, 1 classic, 2 50%free, 3 100%free, 4 50%+100&free + gold: "{{ if .Config.freeleech }}3{{ else }}0{{ end }}" + order: "{{ .Config.sort }}" + by: "{{ .Config.type }}" + + rows: + selector: table.lista tr td table.lista tr:has(a[href^="index.php?page=torrent-details"]) + + fields: + category: + selector: td a[href^="index.php?page=torrents&category="] + attribute: href + filters: + - name: querystring + args: category + title: + selector: td a[href^="index.php?page=torrent-details"] + details: + selector: td a[href^="index.php?page=torrent-details"] + attribute: href + download: + selector: td a[href^="index.php?page=downloadcheck"] + attribute: href + imdbid: + # javascript:popdetails('http://www.imdb.com/title/tt10209130'); + selector: a[href*="imdb.com/title/tt"] + attribute: href + size: + selector: td:nth-last-child(1) + leechers: + selector: td:nth-last-child(2) + seeders: + selector: td:nth-last-child(3) + date: + # 23/12/2019 07:57 + selector: td:nth-last-child(4) + # auto adjusted by site account profile + filters: + - name: dateparse + args: "dd/MM/yyyy HH:mm" + genre: + selector: td:nth-child(2) + remove: a + description: + text: "{{ .Result.genre }}" + downloadvolumefactor: + case: + img[src="images/silver.gif"]: 0.5 + img[src="images/gold.gif"]: 0 + img[src="images/freeleech.gif"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 3 days (as seconds = 3 x 24 x 60 x 60) + text: 259200 +# xbtit 2.0.0 diff --git a/config/prowlarr/Definitions/fluxzone.yml b/config/prowlarr/Definitions/fluxzone.yml new file mode 100644 index 0000000..b83ff11 --- /dev/null +++ b/config/prowlarr/Definitions/fluxzone.yml @@ -0,0 +1,160 @@ +--- +id: fluxzone +name: Flux-Zone +description: "Flux-Zone is a ROMANIAN Private Torrent Tracker for MOVIES / TV / GENERAL" +language: ro-RO +type: private +encoding: UTF-8 +links: + - http://fluxzone.org/ +legacylinks: + - https://fluxzone.org/ # not supported + +caps: + categorymappings: + - {id: 15, cat: PC/Mobile-Other, desc: "Mobile"} + - {id: 36, cat: TV/Documentary, desc: "Docs/Others"} + - {id: 8, cat: Movies/UHD, desc: "Filme 4K"} + - {id: 39, cat: Movies/3D, desc: "Filme 3D"} + - {id: 1, cat: TV/Anime, desc: "Filme Anime"} + - {id: 42, cat: TV/Anime, desc: "Filme Anime-RO"} + - {id: 5, cat: Movies/BluRay, desc: "Filme BluRay"} + - {id: 6, cat: Movies/BluRay, desc: "Filme BluRay-RO"} + - {id: 9, cat: Movies/DVD, desc: "Filme DVD"} + - {id: 10, cat: Movies/DVD, desc: "Filme DVD-RO"} + - {id: 11, cat: Movies/HD, desc: "Filme HD"} + - {id: 12, cat: Movies/HD, desc: "Filme HD-RO"} + - {id: 24, cat: Movies/SD, desc: "Filme SD"} + - {id: 25, cat: Movies/SD, desc: "Filme SD-RO"} + - {id: 18, cat: Movies, desc: "Filme Packs"} + - {id: 19, cat: Movies, desc: "Filme Packs-RO"} + - {id: 30, cat: PC/Games, desc: "Jocuri PC"} + - {id: 38, cat: Console, desc: "Jocuri Console"} + - {id: 26, cat: PC, desc: "Programe"} + - {id: 28, cat: Audio/Video, desc: "Muzica/Videoclip"} + - {id: 21, cat: TV/SD, desc: "Seriale SD"} + - {id: 81, cat: TV/HD, desc: "Seriale HD"} + - {id: 79, cat: TV/UHD, desc: "Seriale 4K"} + - {id: 27, cat: XXX, desc: "XXX"} + - {id: 32, cat: TV/Sport, desc: "Sport"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + take_login: 1 + returnto: / + error: + - selector: td.embedded:contains("Login failed") + test: + path: / + selector: a[href^="logout.php?auth="] + +search: + paths: + - path: browse.php + + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 title, 1 descr, 2 both + blah: 0 + # 1 all, 2 onlydead, 3 free, 4 seedbox, 5 x2 + incldead: "{{ if .Config.freeleech }}3{{ else }}1{{ end }}" + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + + rows: + selector: table.mainblockcontenttt > tbody > tr.browse + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + # the title from the details link is often abbreviated so we use the download href instead + selector: a[href^="download.php/"] + attribute: href + filters: + - name: regexp + args: "download.php/\\d+/(.+?)\\.torrent" + - name: urldecode + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php/"] + attribute: href + files: + selector: td:nth-child(4) + date: + selector: td:nth-child(6) + # auto adjusted by site account profile + filters: + - name: dateparse + args: "HH:mm:ssdd/MM/yyyy" + size: + selector: td:nth-child(7) + grabs: + selector: td:nth-child(8) + seeders: + selector: td:nth-child(9) + leechers: + selector: td:nth-child(10) + downloadvolumefactor: + case: + img[src="pic/freetorrent.png"]: 0 + "*": 1 + uploadvolumefactor: + case: + img[src="pic/x2.png"]: 2 + "*": 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# Engine n/a diff --git a/config/prowlarr/Definitions/freefarm.yml b/config/prowlarr/Definitions/freefarm.yml new file mode 100644 index 0000000..7ddb2a3 --- /dev/null +++ b/config/prowlarr/Definitions/freefarm.yml @@ -0,0 +1,215 @@ +--- +id: freefarm +name: Free Farm +description: "Free Farm (自由农场) is a CHINESE Private Torrent Tracker for MOVIES / TV / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +requestDelay: 2 +links: + - https://pt.0ff.cc/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "Movies|电影", default: true} + - {id: 402, cat: TV, desc: "TV Series|电视剧", default: true} + - {id: 403, cat: TV/Documentary, desc: "Documentaries|纪录片", default: true} + - {id: 404, cat: TV, desc: "TV Shows|综艺", default: true} + - {id: 405, cat: TV/Anime, desc: "Animations|动漫", default: true} + - {id: 406, cat: Audio/Video, desc: "Music Videos|音乐视频", default: true} + - {id: 407, cat: Audio/Lossless, desc: "HD Music|无损音乐", default: true} + - {id: 408, cat: TV/Sport, desc: "Sports|体育", default: true} + - {id: 428, cat: Other, desc: "Others|其他", default: true} + # special + - {id: 413, cat: Other, desc: "Education|学习教育", default: false} + - {id: 414, cat: Other, desc: "Course|网络教程", default: false} + - {id: 415, cat: Books, desc: "book|书籍", default: false} + - {id: 416, cat: PC/0day, desc: "Resources|网络资源", default: false} + - {id: 417, cat: PC/Games, desc: "Game|游戏", default: false} + - {id: 426, cat: Other, desc: "Others|其他", default: false} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: 2facode + type: text + label: 2FA code + - name: info_2fa + type: info + label: "About 2FA code" + default: "Only fill in the 2FA code box if you have enabled 2FA on the Free Farm Web Site. Otherwise just leave it empty." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + secret: "" + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + two_step_code: "{{ .Config.2facode }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("失败")) + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + categories: [401, 402, 403, 404, 405, 406, 407, 408, 428] + - path: special.php + categories: [413, 414, 415, 416, 417, 426] + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl + search_area: "{{ if .Query.IMDBID }}4{{ else }}{{ end }}{{ if .Query.DoubanID }}1{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }}{{ else }}0{{ end }}" + # 0 AND, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(a[href^="download.php?id="]) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: img[data-src] + attribute: data-src + imdbid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="imdb.com/title/tt"] + attribute: href + doubanid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="movie.douban.com/subject/"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-child(5) + seeders: + selector: td.rowfollow:nth-child(6) + leechers: + selector: td.rowfollow:nth-child(7) + grabs: + selector: td.rowfollow:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumseedtime: + # special 7 days (as seconds = 7 x 24 x 60 x 60) + # normal 3 days (as seconds = 3 x 24 x 60 x 60) + case: + img[title="H&R"]: 604800 + "*": 259200 + description_verified: + case: + span[title="通过"], span[title="通過"], span[title="Allowed"]: "Verified:" + span[title="未审"], span[title="未審"], span[title="Not reviewed"]: "Unverified:" + span[title="拒绝"], span[title="拒絕"], span[title="Denied"]: "Banned:" + description: + selector: td:nth-child(2) + remove: a, b, font, img, span + filters: + - name: prepend + args: "{{ .Result.description_verified }} " +# NexusPHP v1.8.9 2023-09-29 diff --git a/config/prowlarr/Definitions/fsm.yml b/config/prowlarr/Definitions/fsm.yml new file mode 100644 index 0000000..8df2c42 --- /dev/null +++ b/config/prowlarr/Definitions/fsm.yml @@ -0,0 +1,118 @@ +--- +id: fsm +name: FSM +description: "FSM is a CHINESE Private Torrent Tracker for 3X" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://fsm.name/ + +caps: + categorymappings: + - {id: 1, cat: XXX, desc: "日本AV"} + - {id: 2, cat: XXX, desc: "国产视频"} + - {id: 3, cat: XXX/ImageSet, desc: "写真"} + - {id: 4, cat: XXX/Other, desc: "黄油"} + - {id: 5, cat: XXX, desc: "里番"} + - {id: 6, cat: XXX/Other, desc: "黄色漫画"} + - {id: 7, cat: XXX, desc: "欧美视频"} + - {id: 8, cat: XXX, desc: "其他"} + + modes: + search: [q] + +settings: + - name: apitoken + type: text + label: API Token + - name: info_token + type: info + label: About your API Token + default: "Request a new API Token in the FSM Forum and checking your Mail after." + - name: passkey + type: text + label: Passkey + - name: info_passkey + type: info + label: About your Passkey + default: "Find your Passkey by accessing the FSM RSS page." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + +login: + path: https://api.fsm.name/Torrents/listTorrents + method: get + +search: + paths: + - path: https://api.fsm.name/Torrents/listTorrents + response: + type: json + + headers: + APITOKEN: ["{{ .Config.apitoken }}"] + + inputs: + type: 0 + keyword: "{{ .Keywords }}" + # 0 all, 1 2xfree, 2 free + systematics: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + + rows: + selector: data.list + + fields: + category: + selector: type.id + title: + selector: title + _id: + selector: tid + details: + text: "{{ .Config.sitelink }}Torrents/details?tid={{ .Result._id }}" + download: + text: "/Torrents/download?tid={{ .Result._id }}&passkey={{ .Config.passkey }}" + infohash: + selector: fileHash + poster: + selector: cover + genre: + selector: tags + description: + text: "{{ .Result.genre }}" + files: + selector: fileCount + seeders: + selector: peers.upload + leechers: + selector: peers.download + grabs: + selector: finish + date: + selector: createdAt + filters: + - name: replace + args: ["年", "years"] + - name: replace + args: ["月", "months"] + - name: replace + args: ["天", "days"] + - name: re_replace + args: ["小?时", "hours"] + - name: replace + args: ["分", "minutes"] + - name: replace + args: ["前", " ago"] + - name: timeago + size: + selector: fileSize + downloadvolumefactor: + selector: status.downCoefficient + uploadvolumefactor: + selector: status.upCoefficient + minimumratio: + text: 1.0 +# json TNode diff --git a/config/prowlarr/Definitions/funkytorrents.yml b/config/prowlarr/Definitions/funkytorrents.yml new file mode 100644 index 0000000..cd34570 --- /dev/null +++ b/config/prowlarr/Definitions/funkytorrents.yml @@ -0,0 +1,148 @@ +--- +id: funkytorrents +name: FunkyTorrents +description: "FunkyTorrents (FT) is a Private Torrent Tracker for MUSIC" +language: en-US +type: private +encoding: UTF-8 +links: + - https://funkytorrents.com/ +legacylinks: + - http://funkytorrents.com/ + +caps: + categorymappings: + - {id: 1, cat: PC/0day, desc: "Apps"} + - {id: 2, cat: Books/EBook, desc: "eBooks"} + - {id: 3, cat: Movies, desc: "Movie"} + - {id: 33, cat: Audio/Video, desc: "Music DVDs"} + - {id: 5, cat: Audio/Video, desc: "Music Vids"} + - {id: 4, cat: Audio, desc: "OST"} + - {id: 19, cat: Audio, desc: "Music Alternative"} + - {id: 28, cat: Audio, desc: "Music Ambient"} + - {id: 12, cat: Audio, desc: "Music Classical"} + - {id: 17, cat: Audio, desc: "Music Dance"} + - {id: 16, cat: Audio, desc: "Music Drum 'n' Bass"} + - {id: 20, cat: Audio, desc: "Music Electronic"} + - {id: 14, cat: Audio, desc: "Music Emo"} + - {id: 23, cat: Audio, desc: "Music Experimental"} + - {id: 34, cat: Audio, desc: "Music Funk"} + - {id: 18, cat: Audio, desc: "Music Hardcore"} + - {id: 13, cat: Audio, desc: "Music House"} + - {id: 31, cat: Audio, desc: "Music IDM"} + - {id: 21, cat: Audio, desc: "Music Indie"} + - {id: 26, cat: Audio, desc: "Music Industrial"} + - {id: 25, cat: Audio, desc: "Music Jazz/Blues/Soul"} + - {id: 37, cat: Audio, desc: "Music Lo-Fi"} + - {id: 6, cat: Audio, desc: "Music Metal"} + - {id: 22, cat: Audio, desc: "Music Misc"} + - {id: 7, cat: Audio, desc: "Music Pop/RnB"} + - {id: 29, cat: Audio, desc: "Music Post-Rock"} + - {id: 30, cat: Audio, desc: "Music Psychedelic"} + - {id: 8, cat: Audio, desc: "Music Punk"} + - {id: 9, cat: Audio, desc: "Music Rap/Hip-Hop"} + - {id: 35, cat: Audio, desc: "Music Reggae"} + - {id: 10, cat: Audio, desc: "Music Rock"} + - {id: 15, cat: Audio, desc: "Music Ska"} + - {id: 32, cat: Audio, desc: "Music Techno"} + - {id: 11, cat: Audio, desc: "Music Trance"} + - {id: 36, cat: Audio, desc: "Music Trip-Hop"} + - {id: 24, cat: Audio, desc: "Music World/Ethnic"} + - {id: 3010, cat: Audio/MP3, desc: "Music MP3"} + - {id: 3040, cat: Audio/Lossless, desc: "Music Lossless"} + + modes: + search: [q] + movie-search: [q] + music-search: [q, artist] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: td.embedded:has(h2:contains("failed")) + test: + path: / + selector: a[href="logout.php"] + +search: + paths: + - path: browse.php + inputs: + # cat search doesn't work if our custom MP3 and Lossless cats are selected + # $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + cat: 0 + search: "{{ if .Query.Artist }}{{ .Query.Artist }}{{ else }}{{ .Keywords }}{{ end }}" + # 0 active, 1 incldead, 2 dead + incldead: 1 + # 0 all, 1 not documented, 2 free + free: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + + rows: + selector: table.mainouter > tbody > tr > td.outer > table > tbody > tr.mouse_out + + fields: + description: + selector: td:nth-child(2) > font + title: + selector: td:nth-child(2) + remove: font + details: + selector: a[href^="details.php?id="] + attribute: href + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + category|append: + optional: true + case: + a[href="/browse.php?ext=1&bitrate=Lossless"]: 3040 + a[href="/browse.php?ext=1&format=MP3"]: 3010 + download: + selector: a[href^="download.php"] + attribute: href + files: + selector: td:nth-child(5) + date: + selector: td:nth-child(7) + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + size: + selector: td:nth-child(8) + grabs: + selector: td:nth-child(9) + seeders: + selector: td:nth-child(10) + leechers: + selector: td:nth-child(11) + downloadvolumefactor: + case: + img[alt="Free Leech"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 0.6 +# engine tbd diff --git a/config/prowlarr/Definitions/futuretorrent.yml b/config/prowlarr/Definitions/futuretorrent.yml new file mode 100644 index 0000000..5b05392 --- /dev/null +++ b/config/prowlarr/Definitions/futuretorrent.yml @@ -0,0 +1,181 @@ +--- +id: futuretorrent +name: FutureTorrent +description: "FutureTorrent is an ITALIAN Private Torrent Tracker for MOVIES / TV / GENERAL" +language: it-IT +type: private +encoding: UTF-8 +links: + - https://futuretorrent.org/ + +caps: + categorymappings: + - {id: 3, cat: PC/Mobile-Android, desc: "Android"} + - {id: 4, cat: PC/Mobile-Android, desc: " |-- Smartphone"} + - {id: 16, cat: Movies/HD, desc: "Bluray"} + - {id: 17, cat: Movies/HD, desc: " |-- 1080p"} + - {id: 18, cat: Movies/3D, desc: " |-- 3D"} + - {id: 19, cat: Movies/HD, desc: " |-- 720p"} + - {id: 20, cat: Movies/HD, desc: " |-- H.265 1080p"} + - {id: 21, cat: Movies/HD, desc: " |-- H.265 720p"} + - {id: 53, cat: Movies/BluRay, desc: " |-- Untouched"} + - {id: 30, cat: Movies/Other, desc: "Cartoons"} + - {id: 56, cat: Movies/Other, desc: " |-- Anime"} + - {id: 31, cat: Movies/Other, desc: " |-- Disney"} + - {id: 32, cat: Books/Comics, desc: " |-- Manga"} + - {id: 5, cat: Movies/WEB-DL, desc: "Cinema-News"} + - {id: 58, cat: Movies/SD, desc: " |-- Cinema News"} + - {id: 59, cat: Movies/WEB-DL, desc: " |-- WEBDL"} + - {id: 60, cat: Movies/WEB-DL, desc: " |-- WEBDL 1080p"} + - {id: 62, cat: Movies/WEB-DL, desc: " |-- WEBDL 2160p"} + - {id: 61, cat: Movies/WEB-DL, desc: " |-- WEBDL 720p"} + - {id: 22, cat: TV/Documentary, desc: "Documentari"} + - {id: 33, cat: Movies/DVD, desc: "DvD"} + - {id: 35, cat: Movies/DVD, desc: " |-- DvD5"} + - {id: 34, cat: Movies/DVD, desc: " |-- DvD9"} + - {id: 6, cat: Movies/SD, desc: "DvDRip"} + - {id: 8, cat: Movies/SD, desc: " |-- BDRip"} + - {id: 9, cat: Movies/SD, desc: " |-- Cult"} + - {id: 7, cat: Movies/SD, desc: " |-- DvDRip"} + - {id: 10, cat: Movies/SD, desc: " |-- DvDRip_Old"} + - {id: 11, cat: Movies/SD, desc: " |-- Film_mp4"} + - {id: 12, cat: Movies/Foreign, desc: " |-- Subbed"} + - {id: 52, cat: Movies/WEB-DL, desc: " |-- WebRip"} + - {id: 23, cat: Books, desc: "Edicola"} + - {id: 66, cat: Audio/Audiobook, desc: " |-- Audiobook"} + - {id: 25, cat: Books/EBook, desc: " |-- Ebook"} + - {id: 24, cat: Books/Mags, desc: " |-- Edicola"} + - {id: 54, cat: Audio/Lossless, desc: "Flac"} + - {id: 55, cat: Other/Misc, desc: "FutureCrew"} + - {id: 36, cat: Console, desc: "Games"} + - {id: 39, cat: Console/Other, desc: " |-- N.Switch"} + - {id: 40, cat: Console/NDS, desc: " |-- Nds"} + - {id: 41, cat: PC/Games, desc: " |-- Pc"} + - {id: 42, cat: Console/PS3, desc: " |-- Ps3"} + - {id: 43, cat: Console/PS4, desc: " |-- Ps4"} + - {id: 44, cat: Console/Wii, desc: " |-- Wii"} + - {id: 45, cat: Console/WiiU, desc: " |-- Wii-U"} + - {id: 46, cat: Console/XBox, desc: " |-- Xbox"} + - {id: 13, cat: Audio, desc: "Musica"} + - {id: 14, cat: Audio/Other, desc: " |-- Compilation"} + - {id: 15, cat: Audio/MP3, desc: " |-- Mp3"} + - {id: 65, cat: Audio/Video, desc: " |-- Video Concerti"} + - {id: 26, cat: PC, desc: "Programmi Pc"} + - {id: 27, cat: PC/Mac, desc: " |-- Mac"} + - {id: 28, cat: PC/0day, desc: " |-- Windows"} + - {id: 47, cat: TV, desc: "Serie TV"} + - {id: 57, cat: TV/SD, desc: " |-- S.TV Complete"} + - {id: 48, cat: TV/HD, desc: " |-- Serie TV 1080p"} + - {id: 49, cat: TV/SD, desc: " |-- Serie TV 264p"} + - {id: 50, cat: TV/HD, desc: " |-- Serie TV 720p"} + - {id: 29, cat: Movies/UHD, desc: "UHD 4K"} + - {id: 51, cat: Other, desc: "Varie"} + - {id: 64, cat: Other, desc: " |-- Torrent Free"} + - {id: 63, cat: Other, desc: " |-- Video Corsi"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 40 on your account profile. + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + test: + path: index.php + selector: a[href*="/logout.php"] + +search: + paths: + - path: browse.php + inputs: + do: search + keywords: "{{ .Keywords }}" + # t_name, t_description, t_both, t_uploader, t_genre (not used) + search_type: t_name + category: 0 # multi cat search not supported + # yes, no + include_dead_torrents: yes + sort: "{{ .Config.sort }}" + order: "{{ .Config.type }}" + # does not return imdb link in results + + rows: + selector: table.sortable tbody tr:has(a[href*="/details.php?id="]) + + fields: + category: + selector: a[href*="/browse.php?category="] + attribute: href + filters: + - name: querystring + args: category + title_default: + selector: a[href*="/details.php?id="] + title: + selector: div.tooltip-content > div + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href*="/details.php?id="] + attribute: href + download: + selector: a[href*="/download.php?id="] + attribute: href + poster: + selector: div.tooltip-content > img + attribute: src + date: + selector: td:nth-child(2) > div:last-child + remove: span + filters: + - name: append + args: " +00:00" # auto adjusted by site account profile + - name: dateparse + args: "dd-MM-yyyy HH:mm zzz" + size: + selector: td:nth-child(5) + grabs: + selector: td:nth-child(6) + seeders: + selector: td:nth-child(7) + leechers: + selector: td:nth-child(8) + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# TS Special Edition v.8.0 diff --git a/config/prowlarr/Definitions/fuzer.yml b/config/prowlarr/Definitions/fuzer.yml new file mode 100644 index 0000000..2687294 --- /dev/null +++ b/config/prowlarr/Definitions/fuzer.yml @@ -0,0 +1,184 @@ +--- +id: fuzer +name: Fuzer +description: "Fuzer is a private torrent website with israeli torrents." +language: he-IL +type: private +encoding: windows-1255 +links: + - https://www.fuzer.me/ +legacylinks: + - https://fuzer.me/ + +caps: + categorymappings: + # Movies + - {id: 73, cat: Movies, desc: "FuzePacks -סרטים"} + - {id: 7, cat: Movies/SD, desc: "סרטים"} + - {id: 60, cat: Movies/SD, desc: "סרטים ישראליים"} + - {id: 9, cat: Movies/HD, desc: "סרטים HD"} + - {id: 101, cat: Movies/HD, desc: "סרטים x265"} + - {id: 59, cat: Movies/HD, desc: "סרטי BDRIP-BRRip"} + - {id: 61, cat: Movies/HD, desc: "סרטים ישראליים HD"} + - {id: 97, cat: Movies/UHD, desc: "סרטים UHD"} + - {id: 58, cat: Movies/DVD, desc: "סרטים DVD-R"} + - {id: 83, cat: Movies/Other, desc: "סרטים מדובבים"} + # TV + - {id: 76, cat: TV, desc: "FuzePacks - סדרות"} + - {id: 8, cat: TV/SD, desc: "סדרות"} + - {id: 62, cat: TV/SD, desc: "סדרות ישראליות"} + - {id: 10, cat: TV/HD, desc: "Tסדרות HD"} + - {id: 63, cat: TV/HD, desc: "סדרות ישראליות HD"} + - {id: 100, cat: TV/UHD, desc: "סדרות UHD"} + - {id: 84, cat: TV/Other, desc: "סדרות מדובבות"} + - {id: 65, cat: TV/Anime, desc: "אנימה"} + - {id: 64, cat: TV/Sport, desc: "ספורט"} + # PC + - {id: 74, cat: PC, desc: "FuzePacks - תוכנות"} + - {id: 15, cat: PC/0day, desc: "תוכנות PC"} + - {id: 11, cat: PC/Games, desc: "משחקים PC"} + - {id: 13, cat: PC/Mobile-Android, desc: "אפליקציות לאנדרואיד"} + - {id: 70, cat: PC/Mobile-iOS, desc: "אפליקציות לאייפון"} + - {id: 71, cat: PC/Mac, desc: "תוכנות MAC"} + # XXX + - {id: 16, cat: XXX, desc: "למבוגרים בלבד"} + # Games + - {id: 72, cat: Console, desc: "FuzePacks - משחקים"} + - {id: 55, cat: Console/XBox, desc: "משחקים XBOX"} + - {id: 12, cat: Console/PSP, desc: "משחקים PS"} + - {id: 56, cat: Console/Wii, desc: "משחקים WII"} + - {id: 57, cat: PC/Mobile-Other, desc: "משחקי קונסולות ניידות"} + # Music + - {id: 75, cat: Audio, desc: "FuzePacks - שירים"} + - {id: 14, cat: Audio, desc: "מוזיקה עולמית"} + - {id: 66, cat: Audio, desc: "מוזיקה ישראלית"} + - {id: 68, cat: Audio, desc: "פסקולים"} + - {id: 67, cat: Audio/Lossless, desc: "FLAC"} + # Books + - {id: 69, cat: Books, desc: "Ebooks"} + # Other + - {id: 17, cat: Other, desc: "שונות"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: dateadded + options: + dateadded: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: index.php + selector: a[href^="/login.php?do=logout&logouthash="] + +search: + paths: + - path: browse.php + inputs: + query: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + order: "{{ .Config.sort }}" + sort: "{{ .Config.type }}" + matchquery: any + freeleech: "{{ if .Config.freeleech }}1{{ else }}0{{ end }}" + # on, off, only_dead + dead: on + $raw: "{{ range .Categories }}c[]={{.}}&{{end}}" + + rows: + # Others, Classic + selector: .box_torrent, table.tborder[align="center"][border="0"][cellpadding="0"][cellspacing="1"][class="tborder"][width="100%"] > tbody > tr:has(a[href^="/attachment.php?"]) + + fields: + category: + # Others, Classic + selector: a[href^="/browse.php?cat="], a[href^="/browse.php?r3=1&cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="/showthread.php?t="] + details: + selector: a[href^="/showthread.php?t="] + attribute: href + download: + selector: a[href^="/attachment.php?attachmentid="] + attribute: href + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + poster: + selector: a[imgsrc] + attribute: imgsrc + size: + selector: td.inline_info:nth-last-child(4) + grabs: + selector: td.inline_info:nth-last-child(3) + filters: + - name: replace + args: [",", ""] + seeders: + selector: td.inline_info:nth-last-child(2) + filters: + - name: replace + args: [",", ""] + leechers: + selector: td.inline_info:nth-last-child(1) + filters: + - name: replace + args: [",", ""] + date: + selector: div[class^="up_info"] + filters: + - name: append + args: " +02:00" # IST + - name: re_replace + args: ["[^:]+: ", ""] + - name: dateparse + args: "dd/MM/yy HH:mm zzz" + description: + selector: div.sub_title + downloadvolumefactor: + case: + a[href*="freeleech=1"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# engine n/a diff --git a/config/prowlarr/Definitions/gamera.yml b/config/prowlarr/Definitions/gamera.yml new file mode 100644 index 0000000..81faff5 --- /dev/null +++ b/config/prowlarr/Definitions/gamera.yml @@ -0,0 +1,172 @@ +--- +id: gamera +name: Gamera +description: "Gamera (駕瞑羅) is a CHINESE Private Torrent Tracker for Japanese Monster and Superhero MOVIES / TV" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://gamerapt.link/ + +caps: + categorymappings: + - {id: 410, cat: Movies, desc: "Monster怪兽"} + - {id: 410, cat: TV, desc: "Monster怪兽"} + - {id: 411, cat: Movies, desc: "Kamen Rider假面骑士"} + - {id: 411, cat: TV, desc: "Kamen Rider假面骑士"} + - {id: 412, cat: Movies, desc: "Ultraman奥特曼"} + - {id: 412, cat: TV, desc: "Ultraman奥特曼"} + - {id: 413, cat: Movies, desc: "Team战队"} + - {id: 413, cat: TV, desc: "Team战队"} + - {id: 414, cat: Movies, desc: "Other其他特摄"} + - {id: 414, cat: TV, desc: "Other其他特摄"} + - {id: 415, cat: Movies, desc: "Musical特摄音乐"} + - {id: 415, cat: TV, desc: "Musical特摄音乐"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q, imdbid, doubanid] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader + search_area: "{{ if .Query.IMDBID }}4{{ else }}{{ end }}{{ if .Query.DoubanID }}1{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }}{{ else }}0{{ end }}" + # 0 AND, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: img[data-src] + attribute: data-src + imdbid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="imdb.com/title/tt"] + attribute: href + doubanid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="movie.douban.com/subject/"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-last-of-type(5) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-last-of-type(5):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-last-of-type(4) + seeders: + selector: td.rowfollow:nth-last-of-type(3) + leechers: + selector: td.rowfollow:nth-last-of-type(2) + grabs: + selector: td.rowfollow:nth-last-of-type(1) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + description: + selector: td:nth-child(2) + remove: a, b, font, img, span + minimumratio: + text: 0.2 +# NexusPHP KEMURIKUSA 2019-01-09 diff --git a/config/prowlarr/Definitions/gamestorrents.yml b/config/prowlarr/Definitions/gamestorrents.yml new file mode 100644 index 0000000..8a1d57a --- /dev/null +++ b/config/prowlarr/Definitions/gamestorrents.yml @@ -0,0 +1,93 @@ +--- +id: gamestorrents +name: GamesTorrents +description: "GamesTorrents is a SPANISH Public tracker for GAMES" +language: es-ES +type: public +encoding: UTF-8 +links: + - https://www.gamestorrents.fm/ +legacylinks: + - https://www.gamestorrents.com/ + - https://www.gamestorrents.tv/ + - https://www.gamestorrents.nu/ + - https://gamestorrents.nocensor.space/ + - https://gamestorrents.nocensor.work/ + - https://gamestorrents.nocensor.biz/ + - https://gamestorrents.nocensor.sbs/ + - https://gamestorrents.nocensor.world/ + +caps: + categorymappings: + - {id: juegos-pc, cat: PC/Games, desc: "Games PC"} + - {id: juegos-psp, cat: Console/PSP, desc: "Games PSP"} + - {id: juegos-ps3, cat: Console/PS3, desc: "Games PS3"} + - {id: juegos-ps4, cat: Console/PS4, desc: "Games PS4"} + - {id: juegos-ps2, cat: Console/PS Vita, desc: "Games PS2"} + - {id: juegos-mac, cat: PC/Mac, desc: "Games Mac"} + - {id: juegos-xbox360, cat: Console/XBox 360, desc: "Games Xbox 360"} + - {id: juegos-wii, cat: Console/Wii, desc: "Games Wii"} + - {id: juegos-nds, cat: Console/NDS, desc: "Games NDS"} + + modes: + search: [q] + +settings: [] + +download: + selectors: + - selector: a#download_torrent + attribute: href + +search: + paths: + - path: / + allowEmptyInputs: true + inputs: + s: "{{ .Keywords }}" + + rows: + selector: table.metalion > tbody > tr + filters: + - name: andmatch + + fields: + title: + selector: td:nth-child(1) a + details: + selector: td:nth-child(1) a + attribute: href + category: + selector: td:nth-child(1) a + attribute: href + filters: + - name: split + args: ["/", 3] + download: + selector: td:nth-child(1) a + attribute: href + date: + selector: td:nth-child(2) + filters: + - name: append + args: " +01:00" # CET + - name: dateparse + args: "dd-MM-yyyy zzz" + size: + selector: td:nth-child(3) + filters: + - name: replace + args: ["Undefined", "0 B"] + - name: replace + args: ["s", ""] + description: + selector: td:nth-child(4) + seeders: + text: 1 + leechers: + text: 1 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/gay-torrents.yml b/config/prowlarr/Definitions/gay-torrents.yml new file mode 100644 index 0000000..d0b6039 --- /dev/null +++ b/config/prowlarr/Definitions/gay-torrents.yml @@ -0,0 +1,188 @@ +--- +id: gay-torrents +name: Gay-Torrents.net +description: "Gay-Torrents.net is a Private Torrent Tracker for GAY 3X" +language: en-US +type: semi-private +encoding: UTF-8 +requestDelay: 2 +links: + - https://www.gay-torrents.net/ + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 0 + options: + 0: created + 1: title + 4: size + 5: seeders + - name: order + type: select + label: Order requested from site + default: 0 + options: + 0: desc + 1: asc + - name: whisparrv2 + type: checkbox + label: Strip release date from queries (for Whisparr v2 compatibility) + default: false + +caps: + categorymappings: + - {id: porn, cat: XXX, desc: "Porn"} + - {id: porn/Amateur, cat: XXX, desc: "Amateur"} + - {id: porn/Anal, cat: XXX, desc: "Anal"} + - {id: porn/Asian, cat: XXX, desc: "Asian"} + - {id: porn/Bareback, cat: XXX, desc: "Bareback"} + - {id: porn/Bears, cat: XXX, desc: "Bears"} + - {id: porn/Bisexual, cat: XXX, desc: "Bisexual"} + - {id: porn/Black-Men, cat: XXX, desc: "Black-Men"} + - {id: porn/Chubs, cat: XXX, desc: "Chubs"} + - {id: porn/Clips, cat: XXX/Pack, desc: "Clips"} + - {id: porn/Cross-Generation, cat: XXX, desc: "Cross-Generation"} + - {id: porn/DVD-R, cat: XXX/DVD, desc: "DVD-R"} + - {id: porn/Fetish, cat: XXX, desc: "Fetish"} + - {id: porn/Group-Sex, cat: XXX, desc: "Group-Sex"} + - {id: porn/HD-Movies, cat: XXX, desc: "HD-Movies"} + - {id: porn/Hunks, cat: XXX, desc: "Hunks"} + - {id: porn/Images, cat: XXX/ImageSet, desc: "Images"} + - {id: porn/Interracial, cat: XXX, desc: "Interracial"} + - {id: porn/Jocks, cat: XXX, desc: "Jocks"} + - {id: porn/Latino, cat: XXX, desc: "Latino"} + - {id: porn/Mature, cat: XXX, desc: "Mature"} + - {id: porn/Member, cat: XXX, desc: "Member"} + - {id: porn/MiddleEast, cat: XXX, desc: "MiddleEast"} + - {id: porn/Military, cat: XXX, desc: "Military"} + - {id: porn/Muscle, cat: XXX, desc: "Muscle"} + - {id: porn/Oral-Sex, cat: XXX, desc: "Oral-Sex"} + - {id: porn/Solo, cat: XXX, desc: "Solo"} + - {id: porn/Transsexual, cat: XXX, desc: "Transsexual"} + - {id: porn/Twinks, cat: XXX, desc: "Twinks"} + - {id: porn/Vintage, cat: XXX, desc: "Vintage"} + - {id: porn/Wrestling, cat: XXX, desc: "Wrestling"} + - {id: nonporn, cat: Other, desc: "NonPorn"} + - {id: nonporn/Anime, cat: TV/Anime, desc: "Anime"} + - {id: nonporn/Applications, cat: PC, desc: "Applications"} + - {id: nonporn/Comedy, cat: Movies, desc: "Comedy"} + - {id: nonporn/Comics, cat: Books/Comics, desc: "Comics"} + - {id: nonporn/Coming-Out, cat: Movies, desc: "Coming-Out"} + - {id: nonporn/Documentary, cat: Movies, desc: "Documentary"} + - {id: nonporn/Drama, cat: Movies, desc: "Drama"} + - {id: nonporn/DVD-R, cat: Movies/DVD, desc: "DVD-R"} + - {id: nonporn/Gay-Movies, cat: Movies, desc: "Gay-Movies"} + - {id: nonporn/Misc, cat: Other/Misc, desc: "Misc"} + - {id: nonporn/Short-Film, cat: Movies, desc: "Short-Film"} + - {id: nonporn/Softcore, cat: Movies, desc: "Softcore"} + - {id: nonporn/Thriller, cat: Movies, desc: "Thriller"} + - {id: nonporn/TV-Episode, cat: TV, desc: "TV-Episode"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + book-search: [q] + +login: + path: login.php + method: post + inputs: + vb_login_username: "{{ .Config.username }}" + vb_login_password: "{{ .Config.password }}" + cookieuser: 1 + do: login + error: + - selector: div.blockrow:contains("invalid") + test: + path: torrentslist.php + selector: ul.isuser + +search: + paths: + - path: "{{ if .Keywords }}search.php{{ else }}torrentslist.php{{ end }}" + inputs: + page: 1 + - path: "{{ if .Keywords }}search.php{{ else }}torrentslist.php{{ end }}" + inputs: + page: 2 + - path: "{{ if .Keywords }}search.php{{ else }}torrentslist.php{{ end }}" + inputs: + page: 3 + - path: "{{ if .Keywords }}search.php{{ else }}torrentslist.php{{ end }}" + inputs: + page: 4 + - path: "{{ if .Keywords }}search.php{{ else }}torrentslist.php{{ end }}" + inputs: + page: 5 + inputs: + $raw: "{{ range .Categories }}type={{.}}&{{end}}" + textsearch: "{{ .Keywords }}" + sort: "{{ .Config.sort }}" + order: "{{ .Config.order }}" + freeleech: "{{ if .Config.freeleech }}1{{ else }}0{{ end }}" + keywordsfilters: + - name: re_replace + args: ["(\\d{2}\\.\\d{2}\\.\\d{2})", "{{ if .Config.whisparrv2 }}{{ else }}$1{{ end }}"] # strip release date from query for whisparr v2 compatibility + - name: re_replace + args: ["(\\w+)", "+$1"] # prepend + to each word + + headers: + User-Agent: ["Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.203"] + + rows: + selector: ul.TorrentList, ul.Torrent-List + + fields: + category: + selector: a[href^="torrentslist.php?type="] + attribute: href + filters: + - name: querystring + args: type + title: + selector: a[href^="torrentdetails.php?torrentid="] + filters: + - name: replace + args: ["[FFL] ", ""] # remove freeleech flag from title + download: + selector: a[href^="torrentdetails.php?torrentid="] + attribute: href + filters: + - name: append + args: "&do=download" + details: + selector: a[href^="torrentdetails.php?torrentid="] + attribute: href + size: + selector: .TorrentList3, .Torrent-List-Size + seeders: + selector: .TorrentList6, .Torrent-List-Seeds + leechers: + selector: .TorrentList7, .Torrent-List-Peers + date: + selector: .TorrentList8, .Torrent-List-Date + filters: + - name: append + args: " +02:00" # EET + - name: dateparse + args: "HH:mm dd-MMM-yyyy zzz" + downloadvolumefactor: + case: + "a:contains(\"[FFL]\")": 0 + "*": 1 + uploadvolumefactor: + text: 1 +# Morbid Suite vB4 diff --git a/config/prowlarr/Definitions/gay-torrentsorg.yml b/config/prowlarr/Definitions/gay-torrentsorg.yml new file mode 100644 index 0000000..016b62a --- /dev/null +++ b/config/prowlarr/Definitions/gay-torrentsorg.yml @@ -0,0 +1,173 @@ +--- +id: gay-torrentsorg +name: gay-torrents.org +description: "Gay-Torrents.org is a Private Torrent Tracker for GAY 3X" +language: en-US +type: private +encoding: UTF-8 +links: + - https://gay-torrents.org/ + - https://gay-area.org/ + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: info_categories + type: info + label: "Hidden categories" + default: "Results for categories hidden in account profile will not be visible." + - name: info_results + type: info + label: "Search results" + default: "You can increase the number of search results in your profile.
Default is 15." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: data + options: + data: created + seeds: seeders + size: size + filename: title + - name: order + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +caps: + categorymappings: + - {id: 15, cat: XXX, desc: "Amateur"} + - {id: 16, cat: XXX, desc: "Anal"} + - {id: 42, cat: XXX, desc: "Animation"} + - {id: 18, cat: XXX, desc: "Asian"} + - {id: 19, cat: XXX, desc: "Bareback"} + - {id: 20, cat: XXX, desc: "Bears"} + - {id: 22, cat: XXX, desc: "Bisexual"} + - {id: 21, cat: XXX, desc: "Black"} + - {id: 23, cat: XXX, desc: "Chubs"} + - {id: 25, cat: XXX, desc: "Cross Generation"} + - {id: 51, cat: XXX, desc: "Doctor/Medical"} + - {id: 71, cat: XXX, desc: "Fan Sites"} + - {id: 27, cat: XXX, desc: "Fetish"} + - {id: 28, cat: XXX, desc: "Group Sex"} + - {id: 30, cat: XXX, desc: "Hunks"} + - {id: 52, cat: XXX, desc: "Interracial"} + - {id: 68, cat: XXX, desc: "Homo Erotic"} + - {id: 68, cat: Movies, desc: "Homo Erotic"} + - {id: 68, cat: TV, desc: "Homo Erotic"} + - {id: 68, cat: Other, desc: "Homo Erotic"} + - {id: 32, cat: XXX, desc: "Latino"} + - {id: 50, cat: XXX, desc: "Middle Eastern"} + - {id: 33, cat: XXX, desc: "Military"} + - {id: 34, cat: XXX, desc: "Oral-Sex"} + - {id: 40, cat: Other, desc: "Other"} + - {id: 35, cat: XXX, desc: "Solo"} + - {id: 36, cat: XXX, desc: "Transsexual"} + - {id: 37, cat: XXX, desc: "Twinks"} + - {id: 38, cat: XXX, desc: "Vintage"} + - {id: 39, cat: XXX, desc: "Wrestling"} + - {id: 17, cat: PC, desc: "Applications"} + - {id: 31, cat: XXX/ImageSet, desc: "Images"} + - {id: 49, cat: Books, desc: "Books"} + - {id: 41, cat: Movies, desc: "Non-Porn"} + - {id: 41, cat: TV, desc: "Non-Porn"} + - {id: 41, cat: Other, desc: "Non-Porn"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + book-search: [q] + +login: + method: post + path: login.php + inputs: + uid: "{{ .Config.username }}" + pwd: "{{ .Config.password }}" + error: + - selector: div.fixed_width:nth-child(4) > span:contains("Incorrect") + test: + path: index.php + selector: a[href*="logout.php"] + +search: + paths: + # https://gay-torrents.org/torrents_beta.php?search=&active=0&options=0 + - path: torrents_beta.php + inputs: + $raw: "{{ range .Categories }}category[]={{.}}&{{end}}" + search: "{{ .Keywords }}" + # 0 all, 1 active, 2 dead, 3 free, 4 50%free, 5 25%free, 6 packs + active: "{{ if .Config.freeleech }}3{{ else }}0{{ end }}" + # 0 title & tag, 1 title & descr + options: 0 + order: "{{ .Config.sort }}" + by: "{{ .Config.order }}" + + rows: + selector: div.torrent + + fields: + category: + selector: a[href^="torrents_beta.php?category="] + attribute: href + filters: + - name: querystring + args: category + title: + selector: a.torrent_link + details: + selector: a.torrent_link + attribute: href + poster: + selector: a.screenshot + attribute: rel + download: + selector: a[href^="download.php?id="] + attribute: href + grabs: + selector: div.downloadTimes + filters: + - name: replace + args: ["No downloads yet", "0"] + size: + selector: div.size + seeders: + selector: div.downloadPeers div:nth-child(1) > a + leechers: + selector: div.downloadPeers > div:nth-child(2) > a + date: + selector: div.date + filters: + - name: re_replace + args: ["on (\\d{2}:\\d{2}) (\\d{2})-([a-zA-Z]{3})-(\\d{4})", "$2 $3 $4 $1"] + - name: append + args: " +01:00" # CET + - name: dateparse + args: "dd MMM yyyy HH:mm zzz" + downloadvolumefactor: + case: + "div:nth-child(2) > div:nth-child(3) > a:contains(\"FREE!\")": 0 + "div:nth-child(2) > div:nth-child(3) > a:contains(\"-50%\")": 0.5 + "div:nth-child(2) > div:nth-child(3) > a:contains(\"-25%\")": 0.25 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 36 hours (as seconds = 36 x 60 x 60) + text: 129600 +# engine n/a diff --git a/config/prowlarr/Definitions/gaytorrentru.yml b/config/prowlarr/Definitions/gaytorrentru.yml new file mode 100644 index 0000000..a754bc6 --- /dev/null +++ b/config/prowlarr/Definitions/gaytorrentru.yml @@ -0,0 +1,191 @@ +--- +id: gaytorrentru +name: GAYtorrent.ru +description: "GayTorrent.ru is a Private Torrent Tracker for GAY 3X" +language: en-US +type: private +encoding: UTF-8 +links: + - https://www.gaytor.rent/ +legacylinks: + - https://www.gaytorrent.ru/ + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: info_hidden + type: info + label: "Hidden categories" + default: "Results for categories hidden in account profile will not be visible." + - name: info_limit + type: info + label: "Download Ratio" + default: "GayTorrent.ru has a daily download slot limit as defined by your ratio, your uploads, your donations, etc. If downloads fail then you have exceeded your allocation. Access the web site to find more info here" + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeds: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +caps: + categorymappings: + - {id: 62, cat: XXX, desc: "Amateur"} + - {id: 29, cat: XXX, desc: "Anal"} + - {id: 46, cat: XXX, desc: "Anime Games"} + - {id: 30, cat: XXX, desc: "Asian"} + - {id: 43, cat: XXX, desc: "Bareback"} + - {id: 19, cat: XXX, desc: "BDSM"} + - {id: 17, cat: XXX, desc: "Bears"} + - {id: 59, cat: XXX, desc: "Bisexual"} + - {id: 44, cat: XXX, desc: "Black"} + - {id: 50, cat: Books, desc: "Books & Magazines"} + - {id: 9, cat: XXX, desc: "Chubbies"} + - {id: 7, cat: XXX, desc: "Clips"} + - {id: 48, cat: Books/Comics, desc: "Comic & Yaoi"} + - {id: 5, cat: XXX, desc: "Daddies / Sons"} + - {id: 67, cat: XXX, desc: "Dildos"} + - {id: 66, cat: XXX, desc: "Fan Sites"} + - {id: 34, cat: XXX, desc: "Fetish"} + - {id: 68, cat: XXX, desc: "Fisting"} + - {id: 27, cat: XXX, desc: "Grey / Older"} + - {id: 32, cat: XXX, desc: "Group-Sex"} + - {id: 63, cat: XXX, desc: "Homemade"} + - {id: 12, cat: XXX, desc: "Hunks"} + - {id: 33, cat: XXX/ImageSet, desc: "Images"} + - {id: 53, cat: XXX, desc: "Interracial"} + - {id: 57, cat: XXX, desc: "Jocks"} + - {id: 35, cat: XXX, desc: "Latino"} + - {id: 36, cat: XXX, desc: "Mature"} + - {id: 58, cat: PC, desc: "Media Programs"} + - {id: 37, cat: XXX, desc: "Member"} + - {id: 54, cat: XXX, desc: "Middle Eastern"} + - {id: 38, cat: XXX, desc: "Military"} + - {id: 39, cat: XXX, desc: "Oral-Sex"} + - {id: 64, cat: XXX, desc: "Scat"} + - {id: 56, cat: XXX, desc: "Softcore"} + - {id: 40, cat: XXX, desc: "Solo"} + - {id: 61, cat: XXX, desc: "Straight older"} + - {id: 60, cat: XXX, desc: "Straight younger"} + - {id: 45, cat: Movies, desc: "Themed Movie"} + - {id: 47, cat: XXX, desc: "Trans"} + - {id: 1, cat: TV, desc: "TV / Episodes"} + - {id: 41, cat: XXX, desc: "Twinks"} + - {id: 42, cat: XXX, desc: "Vintage"} + - {id: 51, cat: XXX, desc: "Voyeur"} + - {id: 65, cat: XXX, desc: "Wrestling and Sports"} + - {id: 28, cat: XXX, desc: "Youngblood"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + book-search: [q] + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + test: + path: browse.php + selector: a[href$="/logout.php"] + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 active, 1 both, 2 dead + incldead: 1 + # where to search: name, descr, filename, freeleech only, wishlist + # where to search: inname=1, indesc=1, infn=1, infl=1, inbook=1 + inname: 1 + infl: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + orderby: "{{ .Config.sort }}" + sort: "{{ .Config.type }}" + + headers: + Referer: ["{{ .Config.sitelink }}browse.php"] + + rows: + selector: table.browse_result > tbody > tr:has(a[href^="details.php?id="]) + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: .browsedesc > a + details: + selector: a[href^="details.php?id="] + attribute: href + _id: + selector: a[href^="details.php?id="] + attribute: href + filters: + - name: querystring + args: id + download: + # turn href="download.php/0738d444362fa610a08fb87b5c1bec798ca1731adbf3175b/GUARATORO.torrent + # into href="/download.php?id=0738d444362fa610a08fb87b5c1bec798ca1731adbf3175b&n=GUARATORO.torrent&p=dodownload + text: "download.php?id={{ .Result._id }}&n={{ .Result.title }}.torrent&p=dodownload" + poster: + selector: a[href^="details.php?id="] + attribute: onmouseover + filters: + - name: regexp + args: "src=(.+?) " + grabs: + selector: .tsnatch + files: + selector: .tfiles + size: + selector: .tsize + seeders: + optional: true + selector: a[href$="&toseeders=1"], span.red + leechers: + optional: true + selector: a[href$="&todlers=1"] + date: + selector: .tadded + # auto adjusted by site account profile + filters: + - name: re_replace + args: ["(\\d{4}-\\d{2}-\\d{2})(\\d{2}:\\d{2}:\\d{2}).*", "$1 $2"] + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss" + downloadvolumefactor: + case: + "td:nth-child(3) > div > nobr > font[color=\"yellow\"]": 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 +# engine n/a diff --git a/config/prowlarr/Definitions/generationfree-api.yml b/config/prowlarr/Definitions/generationfree-api.yml new file mode 100644 index 0000000..cb5cc3f --- /dev/null +++ b/config/prowlarr/Definitions/generationfree-api.yml @@ -0,0 +1,214 @@ +--- +id: generationfree-api +name: Generation-Free (API) +description: "Generation-Free (GF-Free) is a FRENCH Private Torrent Tracker for MOVIES / TV / GENERAL" +language: fr-FR +type: private +encoding: UTF-8 +links: + - https://generation-free.org/ +legacylinks: + - https://generation-free.biz/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Film"} + - {id: 2, cat: TV, desc: "Série"} + - {id: 3, cat: Audio, desc: "Musique"} + - {id: 4, cat: Console, desc: "Jeux"} + - {id: 5, cat: PC, desc: "Logiciel"} + - {id: 6, cat: Books, desc: "Ebook"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + music-search: [q] + book-search: [q] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your Generation-Free account My Security page and clicking on the API Token tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: multilang + type: checkbox + label: Replace MULTi by another language in release name + default: false + - name: multilanguage + type: select + label: Replace MULTi by this language + default: FRENCH + options: + FRENCH: FRENCH + MULTi FRENCH: MULTi FRENCH + ENGLISH: ENGLISH + MULTi ENGLISH: MULTi ENGLISH + VOSTFR: VOSTFR + MULTi VOSTFR: MULTi VOSTFR + - name: vostfr + type: checkbox + label: Replace VOSTFR and SUBFRENCH with ENGLISH + default: false + - name: vfq + type: checkbox + label: Replace VFQ with FRENCH + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_news + type: info + label: Reminder from GF-Free Admin + default: "Attention users of third-party software like Prowlarr or Radarr, Sonarr or similar:
Despite your seed downloads you must physically connect to the web site with your browser or risk being Banned for non-participation...
    We ask :
  1. Remain in seed at least 48 hours on the media to avoid H$R
  2. And much more depending on your storage means
  3. Participate in the life of the site shout forum...
  4. Connect regularly to possibly read your private messages.
" + +login: + path: /api/torrents + method: get + inputs: {} # TODO: remove in v10 + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: "/api/torrents/filter" + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + # if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6 + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + seasonNumber: "{{ .Query.Season }}" + episodeNumber: "{{ .Query.Ep }}" + imdbId: "{{ .Query.IMDBIDShort }}" + tmdbId: "{{ .Query.TMDBID }}" + tvdbId: "{{ .Query.TVDBID }}" + free[]: "{{ if .Config.freeleech }}100{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + + rows: + selector: data + attribute: attributes + + fields: + category: + selector: category_id + title_phase1: + selector: name + title_vfq: + text: "{{ .Result.title_phase1 }}" + filters: + - name: re_replace + args: ["(?i)\\b(VFQ)\\b", "FRENCH"] + title_phase2: + text: "{{ if .Config.vfq }}{{ .Result.title_vfq }}{{ else }}{{ .Result.title_phase1 }}{{ end }}" + title_vostfr: + text: "{{ .Result.title_phase2 }}" + filters: + - name: re_replace + args: ["(?i)\\b(vostfr|subfrench)\\b", "ENGLISH"] + title_phase3: + text: "{{ if .Config.vostfr }}{{ .Result.title_vostfr }}{{ else }}{{ .Result.title_phase2 }}{{ end }}" + title_multilang: + text: "{{ .Result.title_phase3 }}" + filters: + - name: re_replace + args: ["(?i)\\b(MULTI(?!.*(?:FRENCH|ENGLISH|VOSTFR)))\\b", "{{ .Config.multilanguage }}"] + title: + text: "{{ if .Config.multilang }}{{ .Result.title_multilang }}{{ else }}{{ .Result.title_phase3 }}{{ end }}" + details: + selector: details_link + download: + selector: download_link + infohash: + selector: info_hash + poster: + selector: meta.poster + filters: + - name: replace + args: ["https://via.placeholder.com/90x135", ""] + imdbid: + selector: imdb_id + tmdbid: + selector: tmdb_id + tvdbid: + selector: tvdb_id + genre: + selector: meta.genres + filters: + - name: replace + args: [" & ", "_&_"] + description: + text: "{{ .Result.genre }}" + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0%, 25%, 50%, 75%, 100% + selector: freeleech + case: + 0%: 1 # not free + 25%: 0.75 + 50%: 0.5 + 75%: 0.25 + 100%: 0 # freeleech + "*": 0 # catch errors + uploadvolumefactor: + # api returns 0=false, 1=true + selector: double_upload + case: + 0: 1 # normal + 1: 2 # double + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# json UNIT3D 6.5.0 diff --git a/config/prowlarr/Definitions/genesismovement.yml b/config/prowlarr/Definitions/genesismovement.yml new file mode 100644 index 0000000..988b1dc --- /dev/null +++ b/config/prowlarr/Definitions/genesismovement.yml @@ -0,0 +1,143 @@ +--- +id: genesismovement +name: Genesis-Movement +description: "Genesis-Movement is a Semi-Private Torrent Tracker for GENESIS BOOTLEG MUSIC" +language: en-US +type: semi-private +encoding: iso-8859-1 +links: + - https://torrent.genesis-movement.org/ + +caps: + categorymappings: + - {id: 20, cat: Audio, desc: "Audio - Genesis"} + - {id: 28, cat: Audio, desc: "Audio - Mike And The Mechanics "} + - {id: 22, cat: Audio, desc: "Audio - Peter Gabriel"} + - {id: 24, cat: Audio, desc: "Audio - Phil Collins"} + - {id: 30, cat: Audio, desc: "Audio - Ray Wilson"} + - {id: 26, cat: Audio, desc: "Audio - Steve Hackett"} + - {id: 32, cat: Audio, desc: "Audio - Tony Banks"} + - {id: 36, cat: Audio/Other, desc: "Misc - BrandX"} + - {id: 19, cat: Audio/Other, desc: "Misc - Misc"} + - {id: 38, cat: Audio/Other, desc: "Misc - Non-Music"} + - {id: 21, cat: Audio/Video, desc: "Video - Genesis"} + - {id: 29, cat: Audio/Video, desc: "Video - Mike And The Mechanics"} + - {id: 23, cat: Audio/Video, desc: "Video - Peter Gabriel"} + - {id: 25, cat: Audio/Video, desc: "Video - Phil Collins"} + - {id: 31, cat: Audio/Video, desc: "Video - Ray Wilson"} + - {id: 27, cat: Audio/Video, desc: "Video - Steve Hackett"} + - {id: 33, cat: Audio/Video, desc: "Video - Tony Banks"} + + modes: + search: [q] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: id + options: + id: created + name: title + size: size + seeders: seeders + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: account-login.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: table.bblock:contains("Access Denied") + test: + path: index.php + selector: a[href="account-logout.php"] + +search: + paths: + # https://torrent.genesis-movement.org/torrents-search.php?c20=1&c24=1&search=&cat=0&tour=0&incldead=1&freeleech=0&lang=0&owner=0 + - path: torrents-search.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 all + tour: 0 + # 0 active, 1 incldead, 2 onlydead + incldead: 1 + # 0 any, 1 notfree, 2 onlyfree + freeleech: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 all, 1 English, 2 French, 3 German, 4 Italian, 5 Japanese, 6 Spanish, 7 Russian + lang: 0 + # 0 all + owner: 0 + sort: "{{ .Config.sort }}" + order: "{{ .Config.type }}" + + rows: + selector: table[class="ttable_headinner"] > tbody > tr:not(:has(td.ttable_head)) + after: 1 + filters: + - name: andmatch + + fields: + category: + selector: a[href^="torrents.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="torrents-details.php?id="] + attribute: title + details: + selector: a[href^="torrents-details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + date: + selector: div[id^="kt"] > table > tbody > tr > td:contains("Date Added:") + # auto adjusted by site account profile + filters: + - name: regexp + args: "(\\d{2}-\\d{2}-\\d{4} at \\d{2}:\\d{2}:\\d{2})" + - name: replace + args: [" at ", " "] + - name: dateparse + args: "dd-MM-yyyy HH:mm:ss" + size: + selector: td:nth-last-child(6) + grabs: + selector: td:nth-last-child(5) + seeders: + selector: td:nth-last-child(4) + leechers: + selector: td:nth-last-child(3) + downloadvolumefactor: + case: + a[title="FreeLeech!"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 +# TorrentTrader diff --git a/config/prowlarr/Definitions/gigatorrents.yml b/config/prowlarr/Definitions/gigatorrents.yml new file mode 100644 index 0000000..6db3c42 --- /dev/null +++ b/config/prowlarr/Definitions/gigatorrents.yml @@ -0,0 +1,186 @@ +--- +id: gigatorrents +name: GigaTorrents +description: "Giga Torrents is a Hungarian Private site for TV / MOVIES / GENERAL" +language: hu-HU +type: private +encoding: UTF-8 +links: + - https://gigatorrents.ws/ + +caps: + categorymappings: + - {id: 91, cat: Movies/UHD, desc: "4K Blu-Ray"} + - {id: 62, cat: Movies/BluRay, desc: "Bluray Disc"} + - {id: 80, cat: Movies/SD, desc: "CAM/Eng"} + - {id: 79, cat: Movies/SD, desc: "CAM/Hun"} + - {id: 71, cat: Movies/DVD, desc: "DVD 9"} + - {id: 67, cat: Movies/DVD, desc: "DVD 9 Hun"} + - {id: 74, cat: Movies/HD, desc: "Film HD/Eng"} + - {id: 75, cat: Movies/HD, desc: "Film HD/Hun"} + - {id: 73, cat: Movies/SD, desc: "Film x264/Eng"} + - {id: 72, cat: Movies/SD, desc: "Film x264/Hun"} + - {id: 19, cat: Movies/SD, desc: "Film Xvid/Eng"} + - {id: 37, cat: Movies/SD, desc: "Film Xvid/Hun"} + - {id: 20, cat: Movies/DVD, desc: "Film/DVD-R"} + - {id: 45, cat: Movies/DVD, desc: "Film/DVD-R Hun"} + - {id: 47, cat: PC/Games, desc: "Játékok/ISO"} + - {id: 64, cat: PC/Games, desc: "Játékok/Rip"} + - {id: 48, cat: Other, desc: "Képek"} + - {id: 49, cat: XXX/ImageSet, desc: "Képek XXX"} + - {id: 51, cat: Audio/Video, desc: "Klip"} + - {id: 39, cat: Books, desc: "Könyvek/Eng"} + - {id: 52, cat: Books, desc: "Könyvek/Hun"} + - {id: 33, cat: Console, desc: "Konzol"} + - {id: 1, cat: Audio/Lossless, desc: "Lossless"} + - {id: 55, cat: PC/Mobile-Other, desc: "Mobil/PDA"} + - {id: 85, cat: TV/HD, desc: "Sorozat HD/Eng"} + - {id: 84, cat: TV/HD, desc: "Sorozat HD/Hun"} + - {id: 8, cat: TV/SD, desc: "Sorozat/SD-x264/Eng"} + - {id: 81, cat: TV/SD, desc: "Sorozat/SD-x264/Hun"} + - {id: 83, cat: TV/SD, desc: "Sorozat/SD-Xvid/Eng"} + - {id: 7, cat: TV/SD, desc: "Sorozat/SD-Xvid/Hun"} + - {id: 46, cat: XXX, desc: "XXX"} + - {id: 42, cat: Audio, desc: "Zene/Eng"} + - {id: 53, cat: Audio, desc: "Zene/Hun"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 3 + options: + 3: created + 5: seeders + 4: size + 2: title + - name: type + type: select + label: Order requested from site + default: 2 + options: + 2: desc + 1: asc + - name: info + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: div.box:has(div.title:contains("bejelentkez")) + test: + path: index.php + selector: a[href^="logout.php"] + +search: + paths: + - path: torrentek.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 active, 1 incldead, 2 onlydead, 5 freeleech, 6 2x upload, 7 highlighted + incldead: "{{ if .Config.freeleech }}5{{ else }}1{{ end }}" + blah: 0 + order: "{{ .Config.sort }}" + by: "{{ .Config.type }}" + + rows: + selector: table#torrenttable > tbody > tr:has() + error: + - selector: div.content:contains("Meg van vonva a letöltési jogod") + + fields: + download: + selector: a[href^="/details.php?id="] + attribute: href + filters: + - name: replace + args: ["details.php?id=", "download.php?id="] + title: + selector: a[href^="/details.php?id="] + details: + selector: a[href^="/details.php?id="] + attribute: href + imdbid: + selector: a[href^="imdb.com/title/tt"] + attribute: href + poster: + selector: img.imdb-info + attribute: data-url + category: + selector: a[href^="/torrentek.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + seeders: + selector: td:nth-child(8) + filters: + - name: split + args: ["/", 0] + leechers: + selector: td:nth-child(8) + filters: + - name: split + args: ["/", 1] + grabs: + selector: td:nth-child(7) + files: + selector: td:nth-child(4) + description: + case: + img[src="pic/staff/yes.png"]: Verified + "*": Unverified + downloadvolumefactor: + selector: td:nth-child(6) > span:nth-last-child(2) + optional: true + default: 1 + filters: + - name: trim + args: x + uploadvolumefactor: + selector: td:nth-child(6) > span:nth-last-child(1) + optional: true + default: 1 + filters: + - name: trim + args: x + minimumratio: + text: 0.5 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 + date: + selector: td:nth-child(2) + remove: a + filters: + - name: regexp + args: "Feltöltve:\\s*([\\d-]+\\s*[\\d:]+)" + size: + selector: td:nth-child(6) + remove: span +# xbtitFM v2.2.09 diff --git a/config/prowlarr/Definitions/gimmepeers.yml b/config/prowlarr/Definitions/gimmepeers.yml new file mode 100644 index 0000000..6d5311b --- /dev/null +++ b/config/prowlarr/Definitions/gimmepeers.yml @@ -0,0 +1,162 @@ +--- +id: gimmepeers +name: GimmePeers +description: "GimmePeers (formerly ILT) is a Paid Private Torrent Tracker for MOVIES / TV / GENERAL" +language: en-US +type: private +encoding: iso-8859-1 +links: + - https://www.gimmepeers.com/ + +caps: + categorymappings: + - {id: 1, cat: TV/Anime, desc: "Anime"} + - {id: 4, cat: PC/0day, desc: "App-WIN"} + - {id: 2, cat: PC/Mac, desc: "App-MAC"} + - {id: 27, cat: PC, desc: "App-LINUX"} + - {id: 29, cat: Audio/Audiobook, desc: "Books (a)"} + - {id: 5, cat: Books/EBook, desc: "Books (e)"} + - {id: 6, cat: PC/Mobile-Other, desc: "Mobile"} + - {id: 7, cat: Audio, desc: "Music"} + - {id: 28, cat: TV/Sport, desc: "Sports"} + - {id: 3, cat: Books/Other, desc: "Tutorials"} + - {id: 8, cat: Other, desc: "Other"} + - {id: 9, cat: Console/NDS, desc: "Game-NIN"} + - {id: 11, cat: Console/PS3, desc: "Game-PS"} + - {id: 10, cat: PC/Games, desc: "Game-WIN"} + - {id: 12, cat: Console/XBox, desc: "Game-XBOX"} + - {id: 13, cat: Movies/3D, desc: "Movie-3D"} + - {id: 26, cat: Movies/UHD, desc: "Movie-4K"} + - {id: 14, cat: Movies/BluRay, desc: "Movie-Bluray"} + - {id: 15, cat: Movies/DVD, desc: "Movie-DVDR"} + - {id: 16, cat: Movies/HD, desc: "Movie-x264"} + - {id: 17, cat: Movies/HD, desc: "Movie-x265"} + - {id: 19, cat: Movies/SD, desc: "Movie-XVID"} + - {id: 18, cat: Movies, desc: "Movie-Packs"} + - {id: 30, cat: TV/UHD, desc: "TV-4K"} + - {id: 22, cat: TV/HD, desc: "TV-x265"} + - {id: 20, cat: TV/HD, desc: "TV-x264-HD"} + - {id: 21, cat: TV/SD, desc: "TV-x264-SD"} + - {id: 25, cat: TV/HD, desc: "TV-Retail-HD"} + - {id: 24, cat: TV/SD, desc: "TV-Retail-SD"} + - {id: 23, cat: TV, desc: "TV-Packs"} + - {id: 50, cat: XXX/x264, desc: "xXx-HD"} + - {id: 49, cat: XXX/SD, desc: "xXx-SD"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, genre] + movie-search: [q, imdbid, genre] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + returnto: / + error: + - selector: td:contains("Login failed!") + message: + selector: table tbody tr td font + test: + path: browse.php + selector: a[href="/logout.php"] + +search: + paths: + # https://www.gimmepeers.com/browse.php?search=2022&c13=1&blah=0&incldead=0 + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}{{ if .Query.Genre }} genre:{{ .Query.Genre }}{{ else }}{{ end }}" + # 0 title, 1 nfo, 2 filelist, 3 title+nfo, 4 imdb + blah: "{{ if .Query.IMDBID }}4{{ else }}{{ end }}{{ if .Query.Genre }}3{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.Genre }}{{ else }}0{{ end }}" + # 0 active only, 1 dead only + incldead: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + + rows: + selector: table.browsetable:not(:has(td.gp_sub_nav):contains("Top 25")) tbody tr:has(a[href^="download.php"]) + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php"] + attribute: href + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + filters: + - name: replace + args: ["/redir.php?url=", ""] + genre: + selector: span:has(a[title="search by genre"]) + filters: + - name: replace + args: ["votes", ""] + - name: re_replace + args: ["\\d+", ""] + description: + text: "{{ .Result.genre }}" + date: + selector: td:nth-child(7) nobr + filters: + - name: replace + args: ["\xA0", ""] + - name: append + args: " -04:00" # AST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + size: + selector: td:nth-child(6) + files: + selector: td:nth-child(8) + grabs: + selector: td:nth-child(10) + seeders: + selector: td:nth-last-child(3) + leechers: + selector: td:nth-last-child(2) + downloadvolumefactor: + text: 1 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/girotorrent.yml b/config/prowlarr/Definitions/girotorrent.yml new file mode 100644 index 0000000..042dc8b --- /dev/null +++ b/config/prowlarr/Definitions/girotorrent.yml @@ -0,0 +1,254 @@ +--- +id: girotorrent +name: Girotorrent +description: "Girotorrent is an ITALIAN Private site for TV / MOVIES / GENERAL" +language: it-IT +type: private +encoding: UTF-8 +testlinktorrent: false +links: + - https://girotorrent.org/ +legacylinks: + - http://girotorrent.org/ # site forces https + +caps: + categorymappings: + # LIBREDICOLA + - {id: 13, cat: Books/Mags, desc: "Giornali e Riviste"} + - {id: 15, cat: Books/EBook, desc: "E-Book"} + - {id: 16, cat: Books/Comics, desc: "Fumetti"} + - {id: 70, cat: Books, desc: "Manuali e Guide"} + - {id: 72, cat: Audio/Audiobook, desc: "Audio Libri"} + # CINEMA + - {id: 17, cat: Movies/Other, desc: "Movie Cam-Ts"} + - {id: 18, cat: Movies/Other, desc: "Movie Screener"} + - {id: 61, cat: Movies/Other, desc: "Movie R5-R6"} + - {id: 19, cat: Movies/Other, desc: "Movie DVDRip"} + - {id: 20, cat: Movies/Other, desc: "Movie BDRip"} + - {id: 60, cat: Movies/Other, desc: "Movie BluRay"} + - {id: 63, cat: Movies/Other, desc: "Movie WEBDLRip"} + # VIDEOTECA + - {id: 22, cat: Movies/SD, desc: "Movie BDRip"} + - {id: 23, cat: Movies/SD, desc: "Movie DvdRip"} + - {id: 95, cat: Movies/SD, desc: "Movie WEBRip"} + - {id: 98, cat: Movies/WEB-DL, desc: "Movie WEBDL"} + - {id: 24, cat: Movies/DVD, desc: "Movie DVD-R 5"} + - {id: 25, cat: Movies/DVD, desc: "Movie DVD-R 9"} + - {id: 26, cat: Movies/HD, desc: "Movie Blu-Ray HD"} + - {id: 27, cat: Movies/UHD, desc: "Movie 4K Ultra HD"} + - {id: 96, cat: Movies/HD, desc: "Movie HD Hevc"} + - {id: 28, cat: Movies/Foreign, desc: "Movie Subbed-ita"} + - {id: 73, cat: Movies/SD, desc: "Movie MP4"} + - {id: 29, cat: Movies/Foreign, desc: "Movie Lingua Originale"} + # ANIMAZIONE + - {id: 32, cat: TV/Anime, desc: "Anime Disney"} + - {id: 33, cat: TV/Anime, desc: "Anime"} + - {id: 34, cat: TV/Anime, desc: "Anime Altri Cartoni"} + - {id: 62, cat: TV/Anime, desc: "Anime Natale Bimbi Girotor"} + # TELEVISIONE + - {id: 36, cat: TV, desc: "TV Serie"} + - {id: 99, cat: TV/HD, desc: "TV Serie Hevc"} + - {id: 37, cat: TV, desc: "TV Film"} + - {id: 59, cat: TV/Sport, desc: "TV Sport"} + - {id: 77, cat: TV, desc: "TV Reality"} + - {id: 38, cat: TV, desc: "TV Concerti-Spettacoli"} + - {id: 39, cat: TV, desc: "TV Teatro-Cabaret"} + - {id: 40, cat: TV/Documentary, desc: "Tv Documentario"} + # MUSICA + - {id: 42, cat: Audio, desc: "Musica CD Singoli"} + - {id: 43, cat: Audio, desc: "Musica Italiana"} + - {id: 44, cat: Audio, desc: "Musica Straniera"} + - {id: 45, cat: Audio, desc: "Musica Compilation"} + - {id: 46, cat: Audio/Video, desc: "Musica Video Clip"} + - {id: 58, cat: Audio, desc: "Musica Discografie"} + - {id: 97, cat: Audio/Lossless, desc: "Musica Flac"} + # SALA GIOCHI + - {id: 47, cat: PC/Games, desc: "Giochi PC"} + - {id: 48, cat: Console/PS3, desc: "Giochi PS2-PS3"} + - {id: 49, cat: Console/Wii, desc: "Giochi Nintendo Wii"} + - {id: 50, cat: Console/XBox, desc: "Giochi Xbox"} + - {id: 51, cat: Console/PSP, desc: "Giochi PSP"} + - {id: 52, cat: Console/3DS, desc: "Giochi Nintendo DS-DS3"} + # SOFTWARE + - {id: 54, cat: PC, desc: "Programmi Windows"} + - {id: 55, cat: PC/Mac, desc: "Programmi Mac"} + - {id: 69, cat: PC, desc: "Programmi Portable"} + - {id: 56, cat: PC, desc: "Programmi Linux"} + # CELLULARI-PALMARI + - {id: 68, cat: PC/Mobile-iOS, desc: "IPhone-IPad"} + - {id: 71, cat: PC/Mobile-Android, desc: "Android"} + - {id: 74, cat: Other, desc: "Varie"} + - {id: 75, cat: Other, desc: "Immagini Wallpaper"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 3 + options: + 3: created + 5: seeders + 4: size + 2: title + - name: type + type: select + label: Order requested from site + default: 2 + options: + 2: desc + 1: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. The default is 15. + +login: + path: index.php?page=login + method: post + inputs: + uid: "{{ .Config.username }}" + pwd: "{{ .Config.password }}" + error: + - selector: div.error + - selector: span[style="color:#FF0000;"] + test: + path: index.php + selector: a[href="logout.php"] + +download: + before: + path: thanks.php + method: post + inputs: + infohash: "{{ .DownloadUri.Query.id }}" + thanks: 1 + rndval: "1487013827343" + selectors: + - selector: a[href^="download.php?id="] + attribute: href + filters: + - name: regexp + args: "^(.+?)&key=" + +search: + paths: + # 15 results per page fetch 5 (site is slow, dont be greedy and fetch more) + - path: index.php + inputs: + search: "{{ .Keywords }}" + category: "{{ range .Categories }}{{.}};{{end}}" + page: torrents + # 0 all, 1 activeonly, 2 deadonly + active: 0 + # 0 name, 1 name&descr, 2 descr, 3 uploader, 5 gold, 6 silver, 7 bronze + options: "{{ if .Config.freeleech }}5{{ else }}0{{ end }}" + order: "{{ .Config.sort }}" + by: "{{ .Config.type }}" + keywordsfilters: + - name: diacritics + args: replace + - name: re_replace # S01 to 1 + args: ["(?i)\\bS0*(\\d+)\\b", "$1"] + - name: re_replace # S01E01 to 1 1 + args: ["(?i)\\bS0*(\\d+)E0*(\\d+)\\b", "$1 $2"] + # does not support imdbid search and does not return imdb link in results + + rows: + selector: div.b-content > table > tbody > tr > td > table.lista > tbody > tr:has(a[href^="index.php?page=torrent-details&id="]) + filters: + - name: andmatch + + fields: + category: + selector: a[href^="index.php?page=torrents&category="] + attribute: href + filters: + - name: querystring + args: category + title: + selector: a[onmouseover][href^="index.php?page=torrent-details&id="] + filters: + - name: re_replace # replace special characters with " " (space) + args: ["[\\[!\"#$%&'()*+,\\-.\\/:;<=>?@[\\]^_`{|}~]", " "] + - name: diacritics + args: replace + - name: re_replace # replace multiple spaces + args: ["[ ]{2,}", " "] + # normalize to SXXEYY format + - name: re_replace # S01 E01 to S01E01 + args: ["(?i)\\bS(\\d+)\\sE(\\d+)\\b", "S$1E$2"] + - name: re_replace # 01x01 to S01E01 + args: ["(?i)(\\d{2})x(\\d+)", "S$1E$2"] + - name: re_replace # 1x01 to S01E01 + args: ["(?i)\\b(\\d{1})x(\\d+)", "S0$1E$2"] + - name: re_replace # Stagione X --> S0X + args: ["(?i)\\bStagion[ei]\\s?(\\d{1})\\b|\\bSeason'?s?\\s?(\\d{1})\\b", "S0$1$2"] + - name: re_replace # Stagione XX --> SXX + args: ["(?i)\\bStagion[ei]\\s?(\\d{2,})\\b|\\bSeason'?s?\\s?(\\d{2,})\\b", "S$1$2"] + - name: re_replace # Episodio 4 to E4 + args: ["(?i)\\b(?:[\\/\\|]?Episodio\\s?(\\d+)|Puntata\\s?(\\d+))", "E$1$2"] + - name: re_replace # Episodi 4 5 to E04-05 + args: ["(?i)\\b(?:Puntate\\s*)(\\d+)\\s?(\\d+)", "E0$1-0$2"] + - name: re_replace # rimozioni varie + args: ["(?i)(Serie completa|Completat?a?|in pausa)", ""] + details: + selector: a[onmouseover][href^="index.php?page=torrent-details&id="] + attribute: href + download: + selector: a[href^="index.php?page=downloadcheck"] + attribute: href + poster: + selector: a[onmouseover][href^="index.php?page=torrent-details&id="] + attribute: onmouseover + filters: + - name: regexp + args: "src=(.+?) " + date: + selector: td:nth-last-child(9) + # auto adjusted by site account profile + filters: + - name: dateparse + args: "dd/MM/yyyy" + seeders: + selector: td:nth-last-child(8) + leechers: + selector: td:nth-last-child(7) + grabs: + selector: td:nth-last-child(6) + size: + selector: td:nth-last-child(4) + downloadvolumefactor: + case: + img[alt="Free Leech"]: 0 + img[alt="Gold 100% Free"]: 0 + img[alt="Silver 50% Free"]: 0.5 + img[alt="Bronze 25% Free"]: 0.75 + "*": 1 + uploadvolumefactor: + selector: img[alt$="x Upload Multiplier"] + attribute: alt + optional: true + default: 1 + filters: + - name: replace + args: ["x Upload Multiplier", ""] + minimumratio: + text: 0.5 +# xbtitFM 3.1.00 diff --git a/config/prowlarr/Definitions/gktorrent.yml b/config/prowlarr/Definitions/gktorrent.yml new file mode 100644 index 0000000..b03a016 --- /dev/null +++ b/config/prowlarr/Definitions/gktorrent.yml @@ -0,0 +1,144 @@ +--- +id: gktorrent +name: GkTorrent +description: "GkTorrent is a French Public site for TV / MOVIES / GENERAL" +language: fr-FR +type: public +encoding: UTF-8 +followredirect: true +# to fetch current domain use https://www.protege-torrent.com/Gktorrent +links: + - https://www.gktorrent.fi/ + - https://gktorrent.nocensor.cloud/ + - https://gktorrent.mrunblock.bond/ +legacylinks: + - https://www.rantop.org/ + - https://www.gktorrent.tv/ + - https://www.gktorrent.net/ + - https://www.gktorrent.biz/ + - https://www.gktorrent.io/ + - https://www.gktorrent.pw/ + - https://wvw.gktorrent.pw/ + - https://vww.gktorrent.pw/ + - https://www.gktorrent.cc/ + - https://gktorrent.nocensor.space/ + - https://www.gktorrents.com/ + - https://gktorrent.nocensor.work/ + - https://www.gktorrents.net/ + - https://gktorrent.nocensor.biz/ + - https://www.gktorrents.org/ + - https://gktorrent.nocensor.sbs/ + - https://gktorrent.nocensor.world/ + - https://gktorrent.nocensor.lol/ + - https://gktorrent.mrunblock.guru/ + - https://gktorrent.mrunblock.life/ # cloudflare 403 + - https://gktorrent.nocensor.click/ + - https://www.gktorrents.cc/ + - https://www.gktorrent.ac/ + - https://www.gktorrent.ph/ + - https://www.gktorrent.vc/ + +caps: + categorymappings: + - {id: Films, cat: Movies, desc: "Movies"} + - {id: Animes, cat: TV/Anime, desc: "Anime"} + - {id: Séries, cat: TV, desc: "TV"} + - {id: Musiques, cat: Audio, desc: "Music"} + - {id: Ebooks, cat: Books, desc: "Books"} + - {id: Logiciels, cat: PC, desc: "Software"} + - {id: Jeux-PC, cat: PC/Games, desc: "PC Games"} + - {id: Jeux-Consoles, cat: Console/XBox 360, desc: "Console Games"} + - {id: Porno, cat: XXX, desc: "XXX"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + allowrawsearch: true + +settings: + - name: multilang + type: checkbox + label: Replace MULTi by another language in release name + default: false + - name: multilanguage + type: select + label: Replace MULTi by this language + default: FRENCH + options: + FRENCH: FRENCH + MULTi FRENCH: MULTi FRENCH + ENGLISH: ENGLISH + MULTi ENGLISH: MULTi ENGLISH + VOSTFR: VOSTFR + MULTi VOSTFR: MULTi VOSTFR + - name: vostfr + type: checkbox + label: Replace VOSTFR and SUBFRENCH with ENGLISH + default: false + +download: + selectors: + - selector: a[href^="magnet:?"] + attribute: href + - selector: script:contains("magnet:?") + filters: + - name: regexp + args: "\\s'(magnet:\\?.+?)';" +search: + paths: + - path: "{{ if .Keywords }}recherche/{{ .Keywords }}{{ else }}{{ end }}" + keywordsfilters: + # if searching for season packs swith S01 to saison 1 #9712 + - name: re_replace + args: ["(?i)(S0)(\\d{1,2})$", "saison $2"] + - name: re_replace + args: ["(?i)(S)(\\d{1,3})$", "saison $2"] + + rows: + selector: table.table-hover > tbody > tr:has(a[href*=torrent]) + + fields: + category: + selector: td:nth-child(1) > i + attribute: class + title_phase1: + selector: td:nth-child(1) a + filters: + - name: re_replace + args: ["(?i)\\b(FRENCH|MULTI|TRUEFRENCH|VOSTFR|SUBFRENCH)\\b(.+?)(\\b(19|20\\d{2})\\b)$", "$3 $1$2"] + title_vostfr: + text: "{{ .Result.title_phase1 }}" + filters: + - name: re_replace + args: ["(?i)\\b(vostfr|subfrench)\\b", "ENGLISH"] + title_phase2: + text: "{{ if .Config.vostfr }}{{ .Result.title_vostfr }}{{ else }}{{ .Result.title_phase1 }}{{ end }}" + title_multilang: + text: "{{ .Result.title_phase2 }}" + filters: + - name: re_replace + args: ["(?i)\\b(MULTI(?!.*(?:FRENCH|ENGLISH|VOSTFR)))\\b", "{{ .Config.multilanguage }}"] + title: + text: "{{ if .Config.multilang }}{{ .Result.title_multilang }}{{ else }}{{ .Result.title_phase2 }}{{ end }}" + details: + selector: td:nth-child(1) a + attribute: href + download: + selector: td:nth-child(1) a + attribute: href + size: + selector: td:nth-child(2) + date: + text: now + seeders: + selector: td:nth-child(3) + leechers: + selector: td:nth-child(4) + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/glodls.yml b/config/prowlarr/Definitions/glodls.yml new file mode 100644 index 0000000..740a0be --- /dev/null +++ b/config/prowlarr/Definitions/glodls.yml @@ -0,0 +1,146 @@ +--- +id: glodls +name: GloDLS +description: "GloDLS is a Public Torrent Tracker for MOVIES / TV / GENERAL" +language: en-US +type: public +encoding: UTF-8 +links: + - https://glodls.to/ + - https://gtso.cc/ + - https://glotorrents.unblockit.date/ + - https://glotorrents.mrunblock.bond/ + - https://glodls.unblockninja.com/ + - https://glotorrents.nocensor.cloud/ +legacylinks: + - https://glodls.rocks/ + - https://gtdb.to/ + - https://glotorrents.nocensor.biz/ + - https://glotorrents.nocensor.sbs/ + - https://glotorrents.unblockit.nz/ + - https://glotorrents.nocensor.world/ + - https://glotorrents.unblockit.page/ + - https://glotorrents.unblockit.pet/ + - https://glotorrents.nocensor.lol/ + - https://glotorrents.unblockit.ink/ + - https://glotorrents.nocensor.art/ + - https://glotorrents.unblockit.bio/ + - https://glotorrents.unblockit.boo/ + - https://glotorrents.mrunblock.guru/ + - https://glotorrents.unblockit.click/ + - https://glotorrents.unblockit.asia/ + - https://glotorrents.unblockit.mov/ + - https://glotorrents.mrunblock.life/ + - https://glotorrents.unblockit.rsvp/ + - https://glotorrents.nocensor.click/ + - https://gtdb.cc/ + - https://glotorrents.unblockit.vegas/ + - https://glotorrents.unblockit.esq/ + - https://glotorrents.unblockit.zip/ + - https://glotorrents.unblockit.foo/ + - https://glotorrents.unblockit.ing/ + - https://www.gtdb.to/ + +caps: + categorymappings: + - {id: 50, cat: XXX, desc: "XXX"} + - {id: 5, cat: PC/Mobile-Android, desc: "Android"} + - {id: 28, cat: TV/Anime, desc: "Anime"} + - {id: 18, cat: PC, desc: "Apps"} + - {id: 51, cat: Books/EBook, desc: "Books"} + - {id: 73, cat: XXX, desc: "Desi Porn"} + - {id: 75, cat: Audio/Lossless, desc: "FLAC"} + - {id: 10, cat: PC/Games, desc: "Games"} + - {id: 55, cat: PC/Mac, desc: "Macintosh"} + - {id: 52, cat: PC/Mobile-Other, desc: "Mobile"} + - {id: 1, cat: Movies, desc: "Movies"} + - {id: 22, cat: Audio, desc: "Music"} + - {id: 33, cat: Other, desc: "Other"} + - {id: 72, cat: TV, desc: "Packs"} + - {id: 70, cat: Other, desc: "Pictures"} + - {id: 76, cat: TV/Sport, desc: "Sports"} + - {id: 74, cat: Books, desc: "Tutorials"} + - {id: 41, cat: TV, desc: "TV"} + - {id: 71, cat: Audio/Video, desc: "Videos"} + - {id: 54, cat: PC/0day, desc: "Windows"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: sort + type: select + label: Sort requested from site + default: id + options: + id: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +search: + paths: + # https://glodls.to/search_results.php?c1=1&c72=1&c41=1&search=blacklist+s07e05&cat=0&incldead=1&inclexternal=0&lang=0&sort=id&order=desc + - path: search_results.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + cat: 0 + # 0 active 1 incldead 2 onlydead + incldead: 1 + # 0 both 1 local 2 external + inclexternal: 0 + # 0 all 1 english etc + lang: 0 + sort: "{{ .Config.sort }}" + order: "{{ .Config.type }}" + + rows: + selector: table.ttable_headinner tr.t-row + after: 1 + + fields: + category: + selector: a[href^="/search.php?cat="] + attribute: href + optional: true + default: 33 + filters: + - name: querystring + args: cat + title: + selector: td:nth-child(2) a[title] + attribute: title + details: + selector: td:nth-child(2) a[title] + attribute: href + download: + selector: a[href^="/down.php?id="], a[href*="itorrents.org/torrent/"] + attribute: href + magnet: + selector: a[href^="magnet:?xt="] + attribute: href + size: + selector: td:nth-child(5) + seeders: + selector: td:nth-child(6) + leechers: + selector: td:nth-child(7) + date: + text: now + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/greekdiamond.yml b/config/prowlarr/Definitions/greekdiamond.yml new file mode 100644 index 0000000..6aaa231 --- /dev/null +++ b/config/prowlarr/Definitions/greekdiamond.yml @@ -0,0 +1,189 @@ +--- +id: greekdiamond +name: GreekDiamond +description: "GreekDiamond is a GREEK Private Torrent Tracker for MOVIES / TV / GENERAL" +language: el-GR +type: private +encoding: UTF-8 +links: + - https://greekdiamond.info/ + +caps: + categorymappings: + # TV + - {id: 22, cat: TV, desc: "TV Greek series"} + - {id: 23, cat: TV, desc: "TV series packs"} + # Movies + - {id: 21, cat: Movies, desc: "Movies World series"} + - {id: 12, cat: Movies/DVD, desc: "Movies DVDRIp"} + - {id: 13, cat: Movies/HD, desc: "Movies Hd rip x264"} + - {id: 14, cat: Movies/SD, desc: "Movies Cam-Ts-R6"} + - {id: 10, cat: Movies/HD, desc: "Movies 720p-1080p"} + - {id: 16, cat: Movies/BluRay, desc: "Movies Blue Ray"} + - {id: 17, cat: Movies, desc: "Movies pack"} + - {id: 18, cat: TV/Documentary, desc: "TV Documentary"} + - {id: 19, cat: Movies, desc: "Movies Greek"} + - {id: 51, cat: TV, desc: "TV Greek Packs"} + - {id: 52, cat: Movies, desc: "Movies Greek Packs"} + - {id: 53, cat: Movies/HD, desc: "BDRIP-BRRIP"} + # Music + - {id: 24, cat: Audio, desc: "Music Greek"} + - {id: 25, cat: Audio, desc: "Music Greek discografy"} + - {id: 26, cat: Audio, desc: "Music Rock"} + - {id: 27, cat: Audio, desc: "Music Rock discografy"} + - {id: 28, cat: Audio, desc: "Music Compat Disc Club"} + - {id: 29, cat: Audio, desc: "Music HipHop/Rap/RnB"} + - {id: 30, cat: Audio, desc: "Music Pop/Electronic"} + - {id: 31, cat: Audio, desc: "Music Soundtracks-VArtists"} + - {id: 32, cat: Audio/Video, desc: "Music videos"} + - {id: 50, cat: Audio/Other, desc: "Music Διάφορα (Other)"} + # Games + - {id: 33, cat: PC/Games, desc: "Games PC"} + - {id: 34, cat: Console/PSP, desc: "Games Playstation/PSP"} + - {id: 35, cat: Console/XBox, desc: "Games Xbox"} + # Children + - {id: 36, cat: TV/Anime, desc: "Anime /Μεταγλωτισμένα"} + - {id: 37, cat: TV/Anime, desc: "Anime /Subtitled"} + # Books + - {id: 40, cat: Books/Comics, desc: "Comics"} + - {id: 41, cat: Books/Mags, desc: "Magazines"} + - {id: 42, cat: Books/EBook, desc: "E-books"} + - {id: 43, cat: Books/EBook, desc: "PDF"} + # Other + - {id: 44, cat: Other, desc: "Images"} + - {id: 45, cat: TV/Sport, desc: "Football Leagues"} + - {id: 46, cat: TV/Sport, desc: "Formula 1"} + # Apps + - {id: 48, cat: PC/0day, desc: "Apps Win"} + - {id: 8, cat: PC, desc: "Apps Linux"} + - {id: 9, cat: PC/Mac, desc: "Apps Mac"} + - {id: 49, cat: PC/Mobile-Other, desc: "Apps Mobile"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: uid + type: text + label: Username + - name: pwd + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 3 + options: + 3: created + 5: seeders + 4: size + 2: title + - name: type + type: select + label: Order requested from site + default: 2 + options: + 2: desc + 1: asc + - name: info + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: index.php?page=login + method: post + form: form[action="index.php?page=login"] + inputs: + uid: "{{ .Config.uid }}" + pwd: "{{ .Config.pwd }}" + error: + - selector: form[action="index.php?page=login&returnto=index.php"] table tr:nth-of-type(2) td span + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: index.php + inputs: + page: torrents + search: "{{ .Keywords }}" + category: "{{ range .Categories }}{{.}};{{end}}" + # 0 title 1 title&descr 2 descr + options: 0 + # 0 all, 1 activeonly, 2 deadonly + active: 0 + # 0 all, 1 classic, 2 silver, 3 gold, 4 silver&gold + gold: "{{ if .Config.freeleech }}3{{ else }}0{{ end }}" + order: "{{ .Config.sort }}" + by: "{{ .Config.type }}" + # does not support imdbid search and does not ruturn imdb link in results + + rows: + selector: table > tbody > tr > td > table.lista > tbody > tr:has(td[onmouseover="this.className='post'"]) + + fields: + category: + selector: a[href^="index.php?page=torrents&category="] + attribute: href + filters: + - name: querystring + args: category + title: + selector: a[onmouseover][href^="index.php?page=torrent-details&id="] + details: + selector: a[onmouseover][href^="index.php?page=torrent-details&id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: a[onmouseover][href^="index.php?page=torrent-details&id="] + attribute: onmouseover + filters: + - name: regexp + args: "src=(.*?) " + # some users will have an extra wait time column before the bookmark column, so we count up from the bottom + date: + selector: td:nth-last-of-type(12) + # auto adjusted by site account profile + filters: + - name: dateparse + args: "dd/MM/yyyy" + seeders: + selector: td:nth-last-of-type(10) + leechers: + selector: td:nth-last-of-type(9) + grabs: + selector: td:nth-last-of-type(8) + size: + selector: td:nth-last-of-type(6) + description: + selector: td:nth-last-of-type(4) img + attribute: title + filters: + - name: prepend + args: "Language: " + downloadvolumefactor: + case: + img[src="images/freeleech.gif"]: 0 + img[src="gold/gold.gif"]: 0 + img[src="gold/slver.gif"]: 0.5 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 3 days (as seconds = 3 x 24 x 60 x 60) + text: 259200 +# xbtit dt fm v20.0 diff --git a/config/prowlarr/Definitions/greekteam.yml b/config/prowlarr/Definitions/greekteam.yml new file mode 100644 index 0000000..767eeed --- /dev/null +++ b/config/prowlarr/Definitions/greekteam.yml @@ -0,0 +1,197 @@ +--- +id: greekteam +name: Greek Team +description: "Greek Team is a GREEK Private site for TV / MOVIES / GENERAL" +language: el-GR +type: private +encoding: windows-1253 +links: + - https://www.greek-team.cc/ +legacylinks: + - http://www.greek-team.cc/ + +caps: + categorymappings: + - {id: 9, cat: TV/Anime, desc: "Anime/Cartoon HD"} + - {id: 63, cat: TV/Anime, desc: "Anime/Cartoon HDTV"} + - {id: 35, cat: TV/Anime, desc: "Anime/Cartoon SD"} + - {id: 59, cat: TV/Anime, desc: "Anime/Cartoon SD Emb"} + - {id: 57, cat: TV/Anime, desc: "Anime/Cartoon TV"} + - {id: 46, cat: PC, desc: "Applications Linux"} + - {id: 45, cat: PC, desc: "Applications MAC"} + - {id: 23, cat: PC, desc: "Applications Windows"} + - {id: 10, cat: Books, desc: "Books/Magazines/English"} + - {id: 12, cat: Books, desc: "Books/Magazines/Greek"} + - {id: 8, cat: TV/Documentary, desc: "Documentaries"} + - {id: 5, cat: TV/Documentary, desc: "Documentaries Greek"} + - {id: 25, cat: TV/Documentary, desc: "Documentaries HD"} + - {id: 27, cat: Movies/DVD, desc: "Movies DVD-R"} + - {id: 31, cat: Console/Other, desc: "Games Other"} + - {id: 20, cat: PC/Games, desc: "Games Windows"} + - {id: 11, cat: Other, desc: "Misc"} + - {id: 47, cat: PC/Mobile-Other, desc: "Mobile"} + - {id: 53, cat: Movies/3D, desc: "Movies 3D"} + - {id: 15, cat: Movies/UHD, desc: "Movies 4K"} + - {id: 18, cat: Movies/BluRay, desc: "Movies Bluray"} + - {id: 29, cat: Movies, desc: "Movies Emb Packs"} + - {id: 19, cat: Movies/HD, desc: "Movies HD"} + - {id: 13, cat: Movies/HD, desc: "Movies HD Emb"} + - {id: 52, cat: Movies/HD, desc: "Movies HD Packs"} + - {id: 40, cat: Movies/SD, desc: "Movies SD"} + - {id: 14, cat: Movies/SD, desc: "Movies SD Emb"} + - {id: 60, cat: Movies/SD, desc: "Movies SD Packs"} + - {id: 22, cat: Audio, desc: "Music"} + - {id: 2, cat: Audio, desc: "Music Discographies"} + - {id: 48, cat: Audio, desc: "Music DJ & Promos"} + - {id: 33, cat: Audio/Lossless, desc: "Music Flac"} + - {id: 1, cat: Audio, desc: "Music Greek"} + - {id: 21, cat: Audio, desc: "Music Greek Discographies"} + - {id: 50, cat: Audio/Lossless, desc: "Music Greek Flac"} + - {id: 16, cat: Audio/Video, desc: "Music Videos"} + - {id: 6, cat: TV/Sport, desc: "Sports"} + - {id: 54, cat: TV/Sport, desc: "Sports HD"} + - {id: 55, cat: TV/SD, desc: "TV Greek Movies"} + - {id: 49, cat: TV/HD, desc: "TV Greek Movies HD"} + - {id: 3, cat: TV/SD, desc: "TV Greek Series"} + - {id: 44, cat: TV/SD, desc: "TV Greek Packs"} + - {id: 4, cat: TV/SD, desc: "TV Greek Shows"} + - {id: 34, cat: TV/SD, desc: "TV Series"} + - {id: 7, cat: TV/SD, desc: "TV Series Emb"} + - {id: 26, cat: TV/SD, desc: "TV Series Emb Packs"} + - {id: 36, cat: TV/HD, desc: "TV Series HD"} + - {id: 62, cat: TV/HD, desc: "TV Series HD Packs"} + - {id: 42, cat: TV/SD, desc: "TV Series Packs"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: DESC + options: + DESC: desc + ASC: asc + - name: info + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. The default is 25. + +login: + path: login.php + method: post + inputs: + take_login: 1 + logout: no + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: td.embedded:has(h2:contains("failed")) + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # 0 active, 1 incldead, 2 onlydead, 3 free (gold) + incldead: "{{ if .Config.freeleech }}3{{ else }}1{{ end }}" + # 0 name, 1 descr, 2 uploader + blah: "{{ if .Query.IMDBID }}1{{ else }}0{{ end }}" + sort: "{{ .Config.sort }}" + d: "{{ .Config.type }}" + # does not show IMDB but can support searching with it in descriptions + + rows: + selector: table.row1 > tbody > tr:has(a.torname) + + fields: + _id: + selector: a.torname + attribute: href + filters: + - name: querystring + args: id + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a.torname + details: + selector: a.torname + attribute: href + download: + text: "download2.php?torrent={{ .Result._id }}" + files: + selector: td:has(a[href$="filelist=1"]) + date: + selector: td:has(a[href$="filelist=1"]) ~ td ~ td > nobr + filters: + - name: append + args: " +02:00" # EET + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + size: + selector: td:has(a[href$="filelist=1"]) ~ td ~ td ~ td ~ td + grabs: + selector: td:has(a[href$="filelist=1"]) ~ td ~ td ~ td ~ td ~ td + seeders: + selector: td:has(a[href$="filelist=1"]) ~ td ~ td ~ td ~ td ~ td ~ td + leechers: + selector: td:has(a[href$="filelist=1"]) ~ td ~ td ~ td ~ td ~ td ~ td ~ td + optional: true + default: 0 + description: + case: + img[src="pic/checked2.png"]: Verified + img[src="pic/notchecked.png"]: Unverified + downloadvolumefactor: + case: + img[src="pic/free.png"]: 0 + img[src="pic/freedownload.gif"]: 0 # freeleech slot exchange + img[src="pic/personal_free.png"]: 0 # applies to VIPs only + "*": 1 + uploadvolumefactor: + case: + img[src="pic/x2new.png"]: 0 # double uploaded with a freleech slot exchange + "*": 1 + minimumratio: + case: + img[src="pic/hnrfree.png"]: 0 # exempt from H&R + img[src="pic/hnr-50.png"]: 0.5 # min ratio is 0.5 + "*": 0.5 # rules say 0.3 but FAQ says 0.4 but H&R says 0.5 !#? + minimumseedtime: + case: + img[src="pic/hnrfree.png"]: 0 # exempt from H&R + "*": 432000 # 5 days (as seconds = 5 x 24 x 60 x 60) +# engine n/a diff --git a/config/prowlarr/Definitions/gtorrentpro.yml b/config/prowlarr/Definitions/gtorrentpro.yml new file mode 100644 index 0000000..624268f --- /dev/null +++ b/config/prowlarr/Definitions/gtorrentpro.yml @@ -0,0 +1,76 @@ +--- +id: gtorrentpro +name: GTorrent.ru +description: "GTorrent.ru is a RUSSIAN Public Torrent Tracker for MOVIES / TV / GENERAL" +language: ru-RU +type: public +encoding: windows-1251 +links: + - http://gtorrent.ru/ +legacylinks: + - http://gtorrent.pro/ + +caps: + categorymappings: + - {id: "filmy", cat: Movies, desc: "Фильмы (Movies)"} + - {id: "muzyka", cat: Audio, desc: "Музыка (Music)"} + - {id: "igry", cat: Console, desc: "Игры (Games)"} + - {id: "serialy", cat: TV, desc: "Сериалы (TV series)"} + - {id: "programmy", cat: PC, desc: "Программы (Software)"} + - {id: "prilozheniya", cat: Other, desc: "prilozheniya (Other)"} + + modes: + search: [q] + +settings: [] + +download: + selectors: + - selector: a[href^="/engine/download.php?id="] + attribute: href + +search: + # do=search&subaction=search&search_start=0&full_search=0&result_from=1&story=%D0%A6%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC%D0%B5%D1%82%D0%B0%D0%BB%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F+%D0%BE%D0%B1%D0%BE%D0%BB%D0%BE%D1%87%D0%BA%D0%B0+ + paths: + - path: index.php + inputs: + do: search + subaction: search + search_start: 0 + full_search: 0 + result_from: 1 + story: "{{ if .Keywords }}{{ .Keywords }}{{ else }}{{ .Today.Year }}{{ end }}" + + rows: + selector: div.blog_brief_news:not(div.first_line):not(:has(div.uploaded:empty)) + filters: + - name: andmatch + + fields: + category: + selector: div.name a + attribute: href + filters: + - name: split + args: ["/", 3] + title: + selector: div.name + details: + selector: div.name a + attribute: href + download: + selector: div.name a + attribute: href + date: + text: now + size: + selector: div:nth-child(2) + seeders: + selector: div.uploaded + leechers: + selector: div.download + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/haidan.yml b/config/prowlarr/Definitions/haidan.yml new file mode 100644 index 0000000..dc0c8ea --- /dev/null +++ b/config/prowlarr/Definitions/haidan.yml @@ -0,0 +1,193 @@ +--- +id: haidan +name: HaiDan +description: "HaiDan is a CHINESE Private Torrent Tracker for HD MOVIES / TV" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://www.haidan.video/ +legacylinks: + - https://www.haidan.cc/ + +caps: + categorymappings: + - {id: 404, cat: TV/Documentary, desc: "Documentaries(纪录片)"} + - {id: 401, cat: Movies, desc: "Movies(电影)"} + - {id: 405, cat: TV/Anime, desc: "Animations(动画片)"} + - {id: 402, cat: TV, desc: "TV Series(电视剧)"} + - {id: 403, cat: TV, desc: "TV Shows(综艺)"} + - {id: 406, cat: Audio/Video, desc: "Music Videos(MV)"} + - {id: 407, cat: TV/Sport, desc: "Sports(体育)"} + - {id: 409, cat: Other, desc: "Misc(其他)"} + - {id: 408, cat: Audio, desc: "HQ Audio(音乐)"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + - name: info_indexer + type: info + label: Alert + default: HaiDan has switched to a group torrent list, which means this Indexer can only display the first item in each group.
This yml Indexer will eventually be re-written in c# as soon as a c# dev volunteers, to display all items in a group. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("失败")) + test: + path: index.php + selector: a[href*="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if .Query.DoubanID }}/{{ .Query.DoubanID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }}{{ else }}{{ .Keywords }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl + search_area: "{{ if .Query.IMDBID }}4{{ else }}{{ end }}{{ if .Query.DoubanID }}1{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }}{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: div.group_content:has(a[href^="download.php?id="]) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + year: + optional: true + selector: div.video_year + filters: + - name: replace + args: ["年份:", " "] + title: + selector: a.video_name_str + filters: + - name: append + args: "{{ .Result.year }}" + details: + selector: a.video_name_str + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + description: + selector: div.torrent_name_col > a + poster: + selector: img#poster + attribute: data-src + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + doubanid: + selector: a[href*="movie.douban.com/subject/"] + attribute: href + size: + # group size. item size + selector: div.group > div.video_size, div.torrent_item > div.video_size + seeders: + selector: div.group > div.seeder_col, div.torrent_item > div.seeder_col + leechers: + selector: div.group > div.leecher_col, div.torrent_item > div.leecher_col + grabs: + selector: div.group > div.snatched_col, div.torrent_item > div.snatched_col + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + date_elapsed: + # time type: time elapsed (default) + selector: div.time_col > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: div.time_col:contains("发布于"):not(:has(span[title])) + optional: true + remove: span + filters: + - name: replace # remove the 'posted on' tag + args: ["发布于", ""] + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + minimumratio: + text: 1.0 +# NexusPHP Standard v1.5 Beta 4 customised diff --git a/config/prowlarr/Definitions/haitang.yml b/config/prowlarr/Definitions/haitang.yml new file mode 100644 index 0000000..bfad856 --- /dev/null +++ b/config/prowlarr/Definitions/haitang.yml @@ -0,0 +1,172 @@ +--- +id: haitang +name: Haitang +description: "海棠PT (Hǎitáng PT) is a CHINESE Private Torrent Tracker for OPERA / CROSSTALK" +language: zh-CN +type: private +encoding: UTF-8 +requestDelay: 2 +links: + - https://www.htpt.cc/ + +caps: + categorymappings: + - {id: 1, cat: Audio, desc: "相声 Crosstalk", default: true} + - {id: 4091, cat: Audio, desc: "评书 Storytelling", default: true} + - {id: 4097, cat: Audio, desc: "戏曲 Opera", default: true} + - {id: 4098, cat: Audio, desc: "鼓/琴 Drum / Piano", default: true} + - {id: 4099, cat: Audio, desc: "小曲 Small Song", default: true} + - {id: 4101, cat: Audio, desc: "小品 Sketch", default: true} + - {id: 4104, cat: Audio, desc: "二人转 Duets", default: true} + - {id: 4105, cat: TV, desc: "小剧种 Puppet shows", default: true} + - {id: 4103, cat: Audio/Audiobook, desc: "广播剧 Audiobooks", default: false} + + modes: + search: [q] + tv-search: [q, season, ep] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("失败")) + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + categories: [1, 4091, 4097, 4098, 4099, 4101, 4104, 4105] + - path: live.php + categories: [4103] + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 incldead, 1 onlyactive, 2 onlydead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader + search_area: 0 + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td:nth-child(5) + seeders: + selector: td:nth-child(6) + leechers: + selector: td:nth-child(7) + grabs: + selector: td:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumratio: + text: 1 + minimumseedtime: + # 1 day (as seconds = 24 x 60 x 60) + text: 86400 + description: + selector: td:nth-child(2) + remove: a, b, font, img, span +# NexusPHP v1.1 2021-10-15 diff --git a/config/prowlarr/Definitions/happyfappy.yml b/config/prowlarr/Definitions/happyfappy.yml new file mode 100644 index 0000000..7aa9c91 --- /dev/null +++ b/config/prowlarr/Definitions/happyfappy.yml @@ -0,0 +1,150 @@ +--- +id: happyfappy +name: HappyFappy +description: "HappyFappy is a Private Torrent Tracker for 3X" +language: en-US +type: private +encoding: UTF-8 +links: + - https://www.happyfappy.org/ + +caps: + categorymappings: + - {id: 11, cat: XXX, desc: "Asian"} + - {id: 3, cat: XXX, desc: "Gay"} + - {id: 4, cat: XXX, desc: "Interracial"} + - {id: 5, cat: XXX, desc: "Lesbian"} + - {id: 6, cat: XXX, desc: "Onlyfans"} + - {id: 9, cat: XXX, desc: "Packs"} + - {id: 10, cat: XXX, desc: "Pics"} + - {id: 1, cat: XXX, desc: "Pron"} + - {id: 8, cat: XXX, desc: "Retro"} + - {id: 12, cat: XXX, desc: "Transsexual"} + - {id: 7, cat: XXX, desc: "VR"} + + modes: + search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + - name: sort + type: select + label: Sort requested from site + default: time + options: + time: created + seeders: seeders + size: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: login + method: form + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + cinfo: "2550|1350|24|-60" + iplocked: 0 + keeploggedin: 1 + error: + - selector: div.error + test: + path: / + selector: "#nav_userinfo" + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}" + title: "{{ .Keywords }}" + order_by: "{{ .Config.sort }}" + order_way: "{{ .Config.type }}" + action: advanced + filter_freeleech: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + + rows: + selector: table#torrent_table > tbody > tr[class^="torrent row"]:has(a[href*="action=download"]) + + fields: + category: + selector: a[href^="/torrents.php?filter_cat["] + attribute: href + filters: + - name: regexp + args: \[(\d+)\] + title: + selector: a[href^="/torrents.php?id="] + details: + selector: a[href^="/torrents.php?id="] + attribute: href + download: + selector: a[href^="torrents.php?action=download&id="] + attribute: href + description_tags: + selector: div.tags + description: + case: + span.icon_okay: "Verified: {{ .Result.description_tags }}" + "*": "Unverified: {{ .Result.description_tags }}" + poster: + selector: td:nth-child(2) > script + filters: + - name: regexp + args: "src=\\\\\"(.*?)\\\\\"" + - name: re_replace + args: ["\\\\(.)", "$1"] + - name: replace + args: ["/static/common/noartwork/noimage.png", ""] + files: + selector: td:nth-child(3) + date: + selector: td:nth-child(5) > span + attribute: title + # auto adjusted by site account profile + filters: + - name: dateparse + args: "MMM dd yyyy, HH:mm" + size: + selector: td:nth-child(6) + grabs: + selector: td:nth-child(7) + seeders: + selector: td:nth-child(8) + leechers: + selector: td:nth-child(9) + downloadvolumefactor: + case: + span.icon[title*="Freeleech"]: 0 + "img[alt=\"Freeleech\"]": 0 + "*": 1 + uploadvolumefactor: + case: + span.icon[title*="DoubleSeed"]: 2 + "img[alt=\"DoubleSeed\"]": 2 + "*": 1 + minimumratio: + text: 0.5 + minimumseedtime: + # 3 days (as seconds = 3 x 24 x 60 x 60) + text: 259200 +# Luminance diff --git a/config/prowlarr/Definitions/haresclub.yml b/config/prowlarr/Definitions/haresclub.yml new file mode 100644 index 0000000..7728acf --- /dev/null +++ b/config/prowlarr/Definitions/haresclub.yml @@ -0,0 +1,195 @@ +--- +id: haresclub +name: Hares Club +description: "Hares Club (白兔俱乐部) is a CHINESE site that focuses on 4K media." +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://club.hares.top/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "Movies | 电影"} + - {id: 402, cat: TV, desc: "TV Series | 电视剧"} + - {id: 403, cat: TV, desc: "TV Shows | 综艺"} + - {id: 404, cat: TV/Documentary, desc: "Documentaries | 纪录片"} + - {id: 405, cat: TV/Anime, desc: "Animations | 动漫"} + - {id: 406, cat: Audio/Video, desc: "Music Videos | 音乐视频"} + - {id: 407, cat: TV/Sport, desc: "Sports | 体育"} + - {id: 409, cat: Audio/Video, desc: "Concert | 演唱会"} + - {id: 416, cat: TV, desc: "Show LIVE | 现场LIVE"} + - {id: 415, cat: Other, desc: "Others | 其他"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: 2facode + type: text + label: 2FA code + - name: info_2fa + type: info + label: "About 2FA code" + default: "Only fill in the 2FA code box if you have enabled 2FA on the Hares Club Web Site. Otherwise just leave it empty." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + secret: "" + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + two_step_code: "{{ .Config.2facode }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: script:contains("'失败'") + message: + text: "图片代码无效!The Image code is invalid. Close the config and start again." + - selector: script:contains("'登录失败!'") + message: + text: "用户名或密码不正确!或者你还没有通过验证。The username or password is incorrect! Close the config and start again." + test: + path: index.php + selector: a[href*="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if .Query.DoubanID }}/{{ .Query.DoubanID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }}{{ else }}{{ .Keywords }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl + search_area: "{{ if or .Query.IMDBID .Query.DoubanID }}1{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(a[href*="download.php?id="]) + + fields: + category: + selector: a[href*="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href*="details.php?id="] + title: + selector: a[title][href*="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href*="details.php?id="] + attribute: href + download: + selector: a[href*="download.php?id="] + attribute: href + poster: + selector: div.layui-torrents-Stills > a + attribute: rel + filters: + - name: replace + args: ["re.php?cache=", ""] + date_elapsed: + # time type: time elapsed (default) + selector: td:nth-last-child(6) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td:nth-last-child(6):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td:nth-last-child(5) + seeders: + selector: td:nth-last-child(4) + leechers: + selector: td:nth-last-child(3) + grabs: + selector: td:nth-last-child(2) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + description_text: + selector: td:nth-child(2) + remove: a, b, font, img, span + description: + case: + i.fa-check: "Verified: {{ .Result.description_text }}" + i.fa-question: "Unverified: {{ .Result.description_text }}" + i.fa-times: "Banned: {{ .Result.description_text }}" +# NexusPHP v1.6.2 2022-03-19 diff --git a/config/prowlarr/Definitions/hawke-uno.yml b/config/prowlarr/Definitions/hawke-uno.yml new file mode 100644 index 0000000..c8fbff3 --- /dev/null +++ b/config/prowlarr/Definitions/hawke-uno.yml @@ -0,0 +1,152 @@ +--- +id: hawke-uno +name: hawke-uno +description: "hawke-uno is a Private Torrent Tracker for (X265 / HEVC) MOVIES / TV" +language: en-US +type: private +encoding: UTF-8 +links: + - https://hawke.uno/ +legacylinks: + - https://www.hawke.uno/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Movie"} + - {id: 2, cat: TV, desc: "TV"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your hawke-uno account My Security page and clicking on the API Token tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + inputs: {} # TODO: remove in v10 + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: "/api/torrents/filter" + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + imdbId: "{{ .Query.IMDBIDShort }}" + tmdbId: "{{ .Query.TMDBID }}" + tvdbId: "{{ .Query.TVDBID }}" + free: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + + rows: + selector: data + attribute: attributes + + fields: + categorydesc: + selector: category + title: + selector: name + filters: + - name: re_replace + args: ["\\(((?>[^()]+|(?)\\(|(?<-o>)\\))*(?(o)(?!)))(?Torrents per page: setting to 100 on your account profile. + +login: + method: post + path: index.php?page=login + inputs: + uid: "{{ .Config.username }}" + pwd: "{{ .Config.password }}" + error: + - selector: td.lista span[style="color:#FF0000;"] + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + # https://freecztorrent.eu/index.php?page=torrents&active=0&category=26;29&order=3&by=2 + - path: index.php + inputs: + page: torrents + search: "{{ .Keywords }}" + category: "{{ if .Categories }}{{ range .Categories }}{{.}};{{end}}{{ else }}0{{ end }}" + # 0 all, 1 active only, 2 dead only + active: 0 + order: "{{ .Config.sort }}" + by: "{{ .Config.type }}" + + rows: + selector: table.benylista > tbody > tr:has(a[href^="download.php"]):not(:has(a[href$="category=0"])) + + fields: + category: + selector: a[href*="category="] + attribute: href + filters: + - name: querystring + args: category + title: + selector: a[href^="index.php?page=torrent-details"] + details: + selector: a[href^="index.php?page=torrent-details"] + attribute: href + download: + selector: a[href^="download.php"] + attribute: href + poster: + selector: img.beny_img + attribute: src + date: + # 07.09.2023 06:20:35 + selector: td:nth-child(8) + # auto adjusted by site account profile + filters: + - name: dateparse + args: "dd.MM.yyyy HH:mm:ss" + size: + selector: td:nth-child(9) + seeders: + selector: td:nth-child(10) + leechers: + selector: td:nth-child(11) + grabs: + selector: td:nth-child(10) + downloadvolumefactor: + text: 1 + uploadvolumefactor: + text: 1 +# xbtit v2.3.1 diff --git a/config/prowlarr/Definitions/hd-unit3d-api.yml b/config/prowlarr/Definitions/hd-unit3d-api.yml new file mode 100644 index 0000000..6762036 --- /dev/null +++ b/config/prowlarr/Definitions/hd-unit3d-api.yml @@ -0,0 +1,163 @@ +--- +id: hd-unit3d-api +name: HD-UNiT3D (API) +description: "HD-UNiT3D is a Private Torrent Tracker for HD MOVIES / TV" +language: en-US +type: private +encoding: UTF-8 +links: + - https://hd-united.vn/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Movie"} + - {id: 2, cat: TV, desc: "TV"} + - {id: 3, cat: Audio, desc: "Audio"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + music-search: [q] + book-search: [q] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your HD-UNiT3D account My Security page and clicking on the API Token tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + inputs: {} # TODO: remove in v10 + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: "/api/torrents/filter" + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + # if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6 + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + seasonNumber: "{{ .Query.Season }}" + episodeNumber: "{{ .Query.Ep }}" + imdbId: "{{ .Query.IMDBIDShort }}" + tmdbId: "{{ .Query.TMDBID }}" + tvdbId: "{{ .Query.TVDBID }}" + "free[]": "{{ if .Config.freeleech }}100{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + + rows: + selector: data + attribute: attributes + + fields: + category: + selector: category_id + title: + selector: name + details: + selector: details_link + download: + selector: download_link + poster: + selector: meta.poster + filters: + - name: replace + args: ["https://via.placeholder.com/90x135", ""] + imdbid: + selector: imdb_id + tmdbid: + selector: tmdb_id + tvdbid: + selector: tvdb_id + genre: + selector: meta.genres + filters: + - name: re_replace + args: ["(?i)(Science Fiction)", "Science_Fiction"] + - name: re_replace + args: ["(?i)(TV Movie)", "TV_Movie"] + - name: replace + args: [" & ", "_&_"] + description: + text: "{{ .Result.genre }}" + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0%, 25%, 50%, 75%, 100% + selector: freeleech + case: + 0%: 1 # not free + 25%: 0.75 + 50%: 0.5 + 75%: 0.25 + 100%: 0 # freeleech + "*": 0 # catch errors + uploadvolumefactor: + # api returns 0=false, 1=true + selector: double_upload + case: + 0: 1 # normal + 1: 2 # double + minimumseedtime: + # 3 days (as seconds = 3 x 24 x 60 x 60) + text: 259200 +# json UNIT3D 6.5.0 diff --git a/config/prowlarr/Definitions/hd4fans.yml b/config/prowlarr/Definitions/hd4fans.yml new file mode 100644 index 0000000..667d0e5 --- /dev/null +++ b/config/prowlarr/Definitions/hd4fans.yml @@ -0,0 +1,149 @@ +--- +id: hd4fans +name: HD4FANS +description: "HD4FANS is a CHINESE Private Torrent Tracker for HD MOVIES / TV / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://pt.hd4fans.org/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "Movies"} + - {id: 404, cat: TV/Documentary, desc: "Documentaries"} + - {id: 405, cat: TV/Anime, desc: "Animations"} + - {id: 402, cat: TV, desc: "TV Series"} + - {id: 403, cat: TV, desc: "TV Shows"} + - {id: 406, cat: Audio/Video, desc: "Music Videos"} + - {id: 407, cat: TV/Sport, desc: "Sports"} + - {id: 409, cat: Other, desc: "Misc"} + - {id: 408, cat: Audio, desc: "Music"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: takelogin.php + method: post + cookies: ["c_lang_folder=en"] + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("失败")) + message: + selector: td.text + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # 0=incldead, 1=active, 2=dead + incldead: 0 + # show promotions: 0=all, 1=normal, 2=free, 3=2x, 4=2xFree, 5=50%, 6=2x50%, 7=30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0=title, 1=descr, 3=uploader, 4=imdb URL + search_area: "{{ if .Query.IMDBID }}4{{ else }}0{{ end }}" + # 0=AND, 1=OR, 2=Exact + search_mode: 0 + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-child(5) + seeders: + selector: td.rowfollow:nth-child(6) + leechers: + selector: td.rowfollow:nth-child(7) + grabs: + selector: td.rowfollow:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + description: + selector: td.rowfollow:nth-child(2) + remove: a, b, font, img, span +# NexusPHP Standard v1.5 Beta 4 diff --git a/config/prowlarr/Definitions/hdarea.yml b/config/prowlarr/Definitions/hdarea.yml new file mode 100644 index 0000000..f675219 --- /dev/null +++ b/config/prowlarr/Definitions/hdarea.yml @@ -0,0 +1,174 @@ +--- +id: hdarea +name: HDArea +description: "HDArea is a CHINESE Private Torrent Tracker for HD MOVIES / TV" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://hdarea.club/ +legacylinks: + - https://www.hdarea.co/ + - https://www.hdarea.club/ + +caps: + categorymappings: + - {id: 300, cat: Movies/UHD, desc: "Movies UHD-4K"} + - {id: 401, cat: Movies/BluRay, desc: "Movies Blu-ray"} + - {id: 415, cat: Movies/HD, desc: "Movies REMUX"} + - {id: 416, cat: Movies/3D, desc: "Movies 3D"} + - {id: 410, cat: Movies/HD, desc: "Movies 1080p"} + - {id: 411, cat: Movies/HD, desc: "Movies 720p"} + - {id: 414, cat: Movies/DVD, desc: "Movies DVD"} + - {id: 412, cat: Movies/WEB-DL, desc: "Movies WEB-DL"} + - {id: 413, cat: Movies/HD, desc: "Movies HDTV"} + - {id: 417, cat: Movies/Other, desc: "Movies iPad"} + - {id: 404, cat: TV/Documentary, desc: "Documentaries"} + - {id: 405, cat: TV/Anime, desc: "Animations"} + - {id: 402, cat: TV, desc: "TV Series"} + - {id: 403, cat: TV, desc: "TV Shows"} + - {id: 406, cat: Audio/Video, desc: "Music Videos"} + - {id: 407, cat: TV/Sport, desc: "Sports"} + - {id: 409, cat: Other, desc: "Misc"} + - {id: 408, cat: Audio, desc: "HQ Audio"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: index.php + selector: a[href="usercp.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # 0 incldead, 1 active, 2 onlydead + incldead: 1 + # 0 all, 1 normal, 2 free, 2 2x, 4 2xFree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl + search_area: "{{ if .Query.IMDBID }}4{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 Exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td:nth-child(5) + seeders: + selector: td:nth-child(6) + leechers: + selector: td:nth-child(7) + grabs: + selector: td:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumratio: + text: 0.8 + description: + selector: td:nth-child(2) + remove: a, b, font, img, span +# NexusPHP Standard v1.5 Beta 4 diff --git a/config/prowlarr/Definitions/hdatmos.yml b/config/prowlarr/Definitions/hdatmos.yml new file mode 100644 index 0000000..3494176 --- /dev/null +++ b/config/prowlarr/Definitions/hdatmos.yml @@ -0,0 +1,178 @@ +--- +id: hdatmos +name: HDAtmos +description: "HDAtmos is a CHINESE Private Torrent Tracker for HD MOVIES / TV / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://hdatmos.club/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "Movies/电影"} + - {id: 404, cat: TV/Documentary, desc: "Documentaries/纪录片"} + - {id: 405, cat: TV/Anime, desc: "Animations/动漫"} + - {id: 402, cat: TV, desc: "TV Series/电视剧"} + - {id: 406, cat: Audio/Video, desc: "Music Videos/MV演唱会"} + - {id: 407, cat: TV/Sport, desc: "Sports/体育"} + - {id: 408, cat: Audio, desc: "HQ Audio/音乐"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: 2facode + type: text + label: 2FA code + - name: info_2fa + type: info + label: "About 2FA code" + default: "Only fill in the 2FA code box if you have enabled 2FA on the HDAtmos Web Site. Otherwise just leave it empty." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + secret: "" + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + two_step_code: "{{ .Config.2facode }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("失败")) + message: + selector: td.text + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl + search_area: "{{ if .Query.IMDBID }}4{{ else }}{{ end }}{{ if .Query.DoubanID }}1{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }}{{ else }}0{{ end }}" + # 0 AND, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td:nth-child(5) + seeders: + selector: td:nth-child(6) + leechers: + selector: td:nth-child(7) + grabs: + selector: td:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + description: + selector: td:nth-child(2) + remove: a, b, font, img, span +# NexusPHP v1.8.8 2023-09-25 diff --git a/config/prowlarr/Definitions/hdc.yml b/config/prowlarr/Definitions/hdc.yml new file mode 100644 index 0000000..5c9068a --- /dev/null +++ b/config/prowlarr/Definitions/hdc.yml @@ -0,0 +1,167 @@ +--- +id: hdc +name: HDC +description: "HDC (HDCiTY) is a CHINESE Private Torrent Tracker for HD MOVIES / TV / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://hdcity.city/ + - https://hdcity.work/ + - https://hdcity.leniter.org/ + - https://hdcity4.leniter.org/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "Movies/电影"} + - {id: 402, cat: TV, desc: "Series/剧集"} + - {id: 404, cat: TV/Documentary, desc: "Doc/档案记录"} + - {id: 405, cat: TV/Anime, desc: "Anim/动漫"} + - {id: 403, cat: TV, desc: "Shows/节目"} + - {id: 406, cat: Audio/Video, desc: "MV/音乐视频"} + - {id: 407, cat: TV/Sport, desc: "Sports/体育"} + - {id: 408, cat: Audio, desc: "Audio/音频"} + - {id: 727, cat: XXX, desc: "XXX/家长指引"} + - {id: 728, cat: Other, desc: "Edu/文档/教材"} + - {id: 729, cat: PC, desc: "Soft/软件"} + - {id: 409, cat: Other, desc: "Other/其他"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_Results + type: info + label: Settings for Results + default: "To use this indexer please set the following on your HDC account profile:
  • Site Language: English
  • Torrent List Profile: Default Modern [preview]
  • Time Type: Time Added
  • Torrents per page: 100
" + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: pt + selector: a[href^="logout?key="] + +search: + paths: + # https://hdcity.city/pt?incldead=0&spstate=0&inclbookmarked=0&iwannaseethis=shanghai+triad&search_area=0&search_mode=0 + # https://hdcity.city/pt?incldead=0&spstate=0&inclbookmarked=0&iwannaseethis=115012&search_area=4&search_mode=0 + - path: pt + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + iwannaseethis: "{{ if .Query.IMDBID }}{{ .Query.IMDBIDShort }}{{ else }}{{ .Keywords }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdb number + search_area: "{{ if .Query.IMDBID }}4{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: div.trblock + + fields: + title: + selector: div.trtop a[href^="t-"] + category: + selector: div.trm + attribute: style + filters: + - name: regexp + args: (\d+) + details: + selector: div.trtop a[href^="t-"] + attribute: href + download: + selector: a[href^="download?id="] + attribute: href + poster: + selector: div.trp:not(:has(img[src$="poster.jpg"])) img + attribute: src + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + size: + selector: div.trbo div:nth-last-child(8) + remove: i + seeders: + selector: div.trbo div:nth-last-child(7) + optional: true + default: 0 + filters: + - name: re_replace + args: ["\\s", "0"] + leechers: + selector: div.trbo div:nth-last-child(6) + optional: true + default: 0 + filters: + - name: re_replace + args: ["\\s", "0"] + grabs: + selector: div.trbo div:nth-last-child(5) + optional: true + default: 0 + filters: + - name: re_replace + args: ["\\s", "0"] + date: + remove: a, span + selector: div[style="float:right;"] + filters: + - name: replace + args: ["@", ""] + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 +# engine n/a (likely based on NexusPHP) diff --git a/config/prowlarr/Definitions/hdchina.yml b/config/prowlarr/Definitions/hdchina.yml new file mode 100644 index 0000000..2843ace --- /dev/null +++ b/config/prowlarr/Definitions/hdchina.yml @@ -0,0 +1,143 @@ +--- +id: hdchina +name: HDChina +description: "HDChina (HDWing) is a CHINESE Private Torrent Tracker for HD MOVIES / TV" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://hdchina.org/ +legacylinks: + - https://hdchina.club/ + +caps: + categorymappings: + - {id: 20, cat: Movies/BluRay, desc: "Movie Full BD/原盘"} + - {id: 17, cat: Movies/HD, desc: "Movie 1080p/电影"} + - {id: 16, cat: Movies/HD, desc: "Movie 1080i/电影"} + - {id: 9, cat: Movies/HD, desc: "Movie 720p/电影"} + - {id: 13, cat: TV, desc: "EU/US TV series/欧美剧"} + - {id: 25, cat: TV, desc: "Chinese TV series/中港台剧集"} + - {id: 26, cat: TV, desc: "Kor Drama/韩剧"} + - {id: 24, cat: TV, desc: "Jpn Drama/日剧"} + - {id: 21, cat: TV, desc: "EU/US TV series pack/欧美剧集包"} + - {id: 22, cat: TV, desc: "Chinese TV series pack/中港台剧集包"} + - {id: 23, cat: TV, desc: "JPN/KOR drama pack/日韩剧集包"} + - {id: 27, cat: Movies/SD, desc: "iPad Video/iPad视频"} + - {id: 5, cat: TV/Documentary, desc: "Documentary/纪录片"} + - {id: 15, cat: TV/Sport, desc: "Sports/体育节目"} + - {id: 14, cat: TV/Anime, desc: "Animation/动画片"} + - {id: 401, cat: TV, desc: "TV Shows/综艺"} + - {id: 402, cat: Audio, desc: "Vocal Concert/演唱会"} + - {id: 406, cat: Audio, desc: "Music Video/MV"} + - {id: 408, cat: Audio, desc: "Music/音乐"} + - {id: 19, cat: Audio, desc: "Audio Track/补充音轨"} + - {id: 405, cat: Audio, desc: "Drama/戏剧"} + - {id: 404, cat: Books, desc: "Book/书籍"} + - {id: 409, cat: Other, desc: "Other/其他"} + - {id: 410, cat: Movies/HD, desc: "4K UltraHD"} + - {id: 411, cat: TV, desc: "Travel/旅游"} + - {id: 412, cat: TV, desc: "Food/饮食"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: torrents.php + selector: a[href^="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # 0=incldead, 1=active, 2=dead + incldead: 0 + # 0=all, 1=normal, 2=free, 3=2x, 4=2x free, 5=50%, 6=2x 50%, 7=30% + spstate: 0 + # 0=title, 1=descr, 3=uploader, 4=imdb URL + search_area: "{{ if .Query.IMDBID }}4{{ else }}0{{ end }}" + # 0=AND, 1=OR, 2=Exact + search_mode: 0 + notnewword: 1 + + rows: + selector: table.torrent_list > tbody > tr:has(a[href^="?cat="]) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + filters: + - name: re_replace + args: ["\\.", " "] + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?hash="] + attribute: href + description: + selector: h4 + size: + selector: td.t_size + grabs: + selector: td.t_completed + seeders: + selector: td.t_torrents + leechers: + selector: td.t_leech + date_elapsed: + # time type: time elapsed (default) + selector: td.t_time > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.t_time:not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + downloadvolumefactor: + # DLVF and ULVF are dynamically presented via javascript so not available to cardigann + text: 1 + uploadvolumefactor: + text: 1 +# NexusPHP 4e16128 (Customised) diff --git a/config/prowlarr/Definitions/hdcztorrent.yml b/config/prowlarr/Definitions/hdcztorrent.yml new file mode 100644 index 0000000..12c3cf2 --- /dev/null +++ b/config/prowlarr/Definitions/hdcztorrent.yml @@ -0,0 +1,185 @@ +--- +id: hdcztorrent +name: HD-CzTorrent +description: "HD-CzTorrent is a CZECH semi private site for TV / MOVIES / GENERAL" +language: cs-CZ +type: semi-private +encoding: UTF-8 +links: + - http://www.hd-cztorrent.cz/ +legacylinks: + - https://www.hd-cztorrent.cz/ # site is forcing http + +caps: + categorymappings: + # FILMY + - {id: 117, cat: Movies/DVD, desc: "DvD"} + - {id: 119, cat: Movies/BluRay, desc: "Blu-Ray"} + - {id: 120, cat: Movies/HD, desc: "HD 720"} + - {id: 121, cat: Movies/HD, desc: "HD 1080"} + - {id: 125, cat: Movies/3D, desc: "3D Filmy"} + - {id: 126, cat: Movies/SD, desc: "SD Filmy"} + - {id: 127, cat: Movies/HD, desc: "H-265"} + - {id: 128, cat: TV/Documentary, desc: "Dokument"} + - {id: 129, cat: TV/Sport, desc: "Sportovní Filmy"} + - {id: 143, cat: Movies/Foreign, desc: "film titulky"} + - {id: 144, cat: TV/Foreign, desc: "serial titulky"} + - {id: 145, cat: Movies/Foreign, desc: "film original"} + - {id: 146, cat: TV/Foreign, desc: "serial original"} + - {id: 47, cat: TV/Other, desc: "Animované"} + - {id: 77, cat: Movies/UHD, desc: "ULTRA HD 4K"} + - {id: 45, cat: TV, desc: "SERIALY CZ"} + # premium + - {id: 130, cat: Movies/WEB-DL, desc: "TV - WEB- DL HBO Max"} + - {id: 133, cat: TV/WEB-DL, desc: "TV - WEB- DL Disney"} + - {id: 134, cat: TV/WEB-DL, desc: "TV -WEB- DL NETLIFIX"} + - {id: 135, cat: TV/WEB-DL, desc: "TV - WEB- DL Prime"} + - {id: 136, cat: TV/WEB-DL, desc: "TV -WEB- DL Skyshow"} + - {id: 147, cat: TV/WEB-DL, desc: "marvel"} + - {id: 148, cat: TV/WEB-DL, desc: "VOYO"} + # rls track + - {id: 131, cat: Movies, desc: "RLS For HDCZT"} + - {id: 132, cat: Movies, desc: "Film na přání"} + # programy win linux + - {id: 62, cat: PC, desc: "Aplikace All"} + # knihy foto pdf + - {id: 64, cat: Books, desc: "knihy-foto"} + - {id: 65, cat: Audio/Audiobook, desc: "Mluvene slovo"} + # porno + - {id: 11, cat: XXX, desc: "XXX 18+KLASIKA"} + - {id: 106, cat: XXX/ImageSet, desc: "XXX-OBRÁZKY"} + # Hudba mp3-flac + - {id: 58, cat: Audio, desc: "Hudba"} + # HRY + - {id: 73, cat: PC/Games, desc: "Hry, Games"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 3 + options: + 3: created + 5: seeders + 4: size + 2: title + - name: type + type: select + label: Order requested from site + default: 2 + options: + 2: desc + 1: asc + - name: info + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + method: post + path: index.php?page=login + inputs: + uid: "{{ .Config.username }}" + pwd: "{{ .Config.password }}" + error: + - selector: td.lista span[style="color:#FF0000;"] + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + # http://www.hd-cztorrent.cz/index.php?page=torrents&search=the+avengers&category=0&uploader=0&options=0&active=0&gold=0&order=3&by=2 + - path: index.php + inputs: + page: torrents + search: "{{ .Keywords }}" + category: "{{ if .Categories }}{{ range .Categories }}{{.}};{{end}}{{ else }}0{{ end }}" + uploader: 0 + # 0 filename, 1 file & desc, 2 description + options: 0 + # 0 all, 1 active only, 2 dead only + active: 0 + # 0 all, 1 classic, 2 silver, 3 gold, 4 silver & gold + gold: "{{ if .Config.freeleech }}3{{ else }}0{{ end }}" + order: "{{ .Config.sort }}" + by: "{{ .Config.type }}" + + rows: + selector: td table.lista > tbody > tr:has(a[href^="download.php"]) + + fields: + category: + selector: a[href*="category="] + attribute: href + filters: + - name: querystring + args: category + title: + selector: a[href^="index.php?page=torrent-details"] + details: + selector: a[href^="index.php?page=torrent-details"] + attribute: href + download: + selector: a[href^="download.php"] + attribute: href + poster: + selector: a[href^="index.php?page=torrent-details"] + attribute: onmouseover + filters: + - name: regexp + args: "src=(.+?) " + - name: replace + args: ["torrentimg/nocover.jpg", ""] + date: + selector: td:nth-child(6) + # auto adjusted by site account profile + filters: + - name: dateparse + args: "dd/MM/yyyy" + size: + selector: td:nth-child(11) + seeders: + selector: td:nth-child(8) + leechers: + selector: td:nth-child(9) + grabs: + selector: td:nth-child(10) + downloadvolumefactor: + case: + img[src$="freeleech.gif"]: 0 + img[src$="gold.gif"]: 0 + img[src$="silver.gif"]: 0.5 + "*": 1 + uploadvolumefactor: + case: + img[src$="2x.gif"]: 2 + img[src$="3x.gif"]: 3 + img[src$="4x.gif"]: 4 + img[src$="5x.gif"]: 5 + img[src$="6x.gif"]: 6 + img[src$="7x.gif"]: 7 + img[src$="8x.gif"]: 8 + img[src$="9x.gif"]: 9 + img[src$="10x.gif"]: 10 + "*": 1 + minimumratio: + text: 0.3 +# xbtit dt fm v7.1 customized diff --git a/config/prowlarr/Definitions/hddolby.yml b/config/prowlarr/Definitions/hddolby.yml new file mode 100644 index 0000000..9bba2db --- /dev/null +++ b/config/prowlarr/Definitions/hddolby.yml @@ -0,0 +1,196 @@ +--- +id: hddolby +name: HDDolby +description: "HD Dolby is a CHINESE Private Torrent Tracker for HD MOVIES / TV / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://www.hddolby.com/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "Movies电影"} + - {id: 402, cat: TV, desc: "TV Series电视剧"} + - {id: 403, cat: TV, desc: "TV Shows综艺"} + - {id: 404, cat: TV/Documentary, desc: "Documentaries纪录片"} + - {id: 405, cat: TV/Anime, desc: "Animations动漫"} + - {id: 406, cat: Audio/Video, desc: "Music Videos"} + - {id: 407, cat: TV/Sport, desc: "Sports体育"} + - {id: 408, cat: Audio, desc: "HQ Audio音乐"} + - {id: 409, cat: Other, desc: "Others其他"} + - {id: 410, cat: PC/Games, desc: "Games游戏"} + - {id: 411, cat: Other, desc: "Study学习"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: 2facode + type: text + label: 2FA code + - name: info_2fa + type: info + label: "About 2FA code" + default: "Only fill in the 2FA code box if you have enabled 2FA on the HDDolby Web Site. Otherwise just leave it empty." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: flaresolverr + type: info + label: FlareSolverr + default: This site may use Cloudflare DDoS Protection, therefore Prowlarr requires FlareSolverr to access it. + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + scode: "{{ .Config.2facode }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("失败")) + message: + selector: td.text + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0=incldead, 1=active, 2=dead + incldead: 0 + # show promotions: 0=all, 1=normal, 2=free, 3=2x, 4=2xFree, 5=50%, 6=2x50%, 7=30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0=title, 1=descr, 3=uploader, 4=imdb URL + search_area: "{{ if .Query.IMDBID }}4{{ else }}{{ end }}{{ if .Query.DoubanID }}1{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }}{{ else }}0{{ end }}" + # 0=AND, 1=OR, 2=Exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + doubanid: + selector: a[href*="movie.douban.com/subject/"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-child(5) + seeders: + selector: td.rowfollow:nth-child(6) + leechers: + selector: td.rowfollow:nth-child(7) + grabs: + selector: td.rowfollow:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumratio: + text: 1.2 + description: + selector: td.rowfollow:nth-child(2) + remove: a, b, font, img, span + filters: + - name: replace + args: [" 剩余时间:", ""] +# NexusPHP 985f0fc 2023-08-04 diff --git a/config/prowlarr/Definitions/hdfans.yml b/config/prowlarr/Definitions/hdfans.yml new file mode 100644 index 0000000..2b926ba --- /dev/null +++ b/config/prowlarr/Definitions/hdfans.yml @@ -0,0 +1,206 @@ +--- +id: hdfans +name: HDFans +description: "HDFans is a CHINESE Private Torrent Tracker for MOVIES / TV / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://hdfans.org/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "Movies/电影"} + - {id: 402, cat: TV, desc: "TV Series/电视剧"} + - {id: 403, cat: TV/Documentary, desc: "Documentaries/纪录片"} + - {id: 406, cat: Audio, desc: "Music/音乐"} + - {id: 416, cat: TV, desc: "TV Shows/综艺"} + - {id: 417, cat: TV/Anime, desc: "Animations/动漫"} + - {id: 407, cat: Audio/Video, desc: "Music Videos/音乐视频"} + - {id: 408, cat: Audio/Video, desc: "Concert/演唱会"} + - {id: 404, cat: Other, desc: "Education/教育"} + - {id: 405, cat: Audio/Audiobook, desc: "Audio Books/有声读物"} + - {id: 409, cat: Movies/Other, desc: "Drama/戏剧"} + - {id: 418, cat: TV/Sport, desc: "Sports/体育"} + - {id: 419, cat: PC/0day, desc: "Software/软件"} + - {id: 421, cat: PC/Games, desc: "Games/游戏"} + - {id: 423, cat: Books/EBook, desc: "E-Books/电子书"} + - {id: 410, cat: Other, desc: "Others/其他"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: 2facode + type: text + label: 2FA code + - name: info_2fa + type: info + label: "About 2FA code" + default: "Only fill in the 2FA code box if you have enabled 2FA on the HDFans Web Site. Otherwise just leave it empty." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + secret: "" + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + two_step_code: "{{ .Config.2facode }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("失败")) + message: + selector: td.text + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl + search_area: "{{ if .Query.IMDBID }}4{{ else }}{{ end }}{{ if .Query.DoubanID }}1{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }}{{ else }}0{{ end }}" + # 0 AND, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + imdbid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="imdb.com/title/tt"] + attribute: href + doubanid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="movie.douban.com/subject/"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td:nth-child(5) + seeders: + selector: td:nth-child(6) + leechers: + selector: td:nth-child(7) + grabs: + selector: td:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumratio: + text: 0.81 + description_verified: + case: + span[title="通过"], span[title="通過"], span[title="Allowed"]: "Verified:" + span[title="未审"], span[title="未審"], span[title="Not reviewed"]: "Unverified:" + span[title="拒绝"], span[title="拒絕"], span[title="Denied"]: "Banned:" + description: + selector: td:nth-child(2) + remove: a, b, font, img, span + filters: + - name: prepend + args: "{{ .Result.description_verified }} " +# NexusPHP v1.8.9 2023-11-15 diff --git a/config/prowlarr/Definitions/hdforever.yml b/config/prowlarr/Definitions/hdforever.yml new file mode 100644 index 0000000..2345bce --- /dev/null +++ b/config/prowlarr/Definitions/hdforever.yml @@ -0,0 +1,310 @@ +--- +id: hdforever +name: HD-Forever +description: "HD-Forever (HD-F) is a FRENCH Private Torrent Tracker for HD MOVIES" +language: fr-FR +type: private +encoding: UTF-8 +links: + - https://hdf.world/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Film"} + - {id: 2, cat: Movies, desc: "Dessin animé"} + - {id: 3, cat: Movies, desc: "Bonus BD"} + - {id: 4, cat: Movies, desc: "Concert"} + - {id: 5, cat: TV, desc: "Série"} + - {id: 6, cat: TV/Anime, desc: "Série anim"} + - {id: 7, cat: Movies, desc: "Documentaire"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: usetoken + type: checkbox + label: Always try to use the FreeLeech Token + default: false + - name: info_token + type: info + label: About the Freeleech token + default: If you do not have any Freeleech tokens then do not tick this box.
Attempting a token download when you have no tokens will generate an error. + - name: multilang + type: checkbox + label: Replace MULTi by another language in release name + default: false + - name: multilanguage + type: select + label: Replace MULTi by this language + default: FRENCH + options: + FRENCH: FRENCH + MULTi.FRENCH: MULTi.FRENCH + ENGLISH: ENGLISH + MULTi.ENGLISH: MULTi.ENGLISH + VOSTFR: VOSTFR + MULTi.VOSTFR: MULTi.VOSTFR + - name: vostfr + type: checkbox + label: Replace VOSTFR and SUBFRENCH with ENGLISH + default: false + - name: sort + type: select + label: Sort requested from site + default: time + options: + time: created + seeders: seeders + size: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_radarr + type: info + label: About Radarr + default: The HD-F web site cannot find movies if you use the release year in a title search. When you define your Radarr v3 Indexer remember to tick the Remove year from search string checkbox. + +login: + path: login.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + keeplogged: 1 + error: + - selector: form#loginform > span.warning + test: + path: torrents.php + selector: a[href^="logout.php?auth="] + +search: + # https://hdf.world/torrents.php?searchstr=Un+Singe+en+hiver+1962&freetorrent=1&order_by=time&order_way=desc&action=advanced&searchsubmit=1 + path: torrents.php + inputs: + $raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}" + searchstr: "{{ .Keywords }}" + order_by: "{{ .Config.sort }}" + order_way: "{{ .Config.type }}" + action: advanced + searchsubmit: 1 + # 1 freeleech, 2 neutral, 3 both, 0 normal + freetorrent: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + # site does not support imdbid search or display imdb links in results + + rows: + selector: table#torrent_table > tbody > tr.torrent + + fields: + category: + selector: td.cats_col + case: + div.cats_film: 1 + div.cats_dessinanimé: 2 + div.cats_bonusbd: 3 + div.cats_concert: 4 + div.cats_série: 5 + div.cats_sérieanim: 6 + div.cats_documentaire: 7 + download_regular: + selector: a[href^="torrents.php?action=download&"] + attribute: href + download_usetoken: + selector: a[href^="torrents.php?action=download&"] + attribute: href + filters: + - name: append + args: "&usetoken=1" + download: + text: "{{ if .Config.usetoken }}{{ .Result.download_usetoken }}{{ else }}{{ .Result.download_regular }}{{ end }}" + title_phase1: + selector: div.group_info + remove: span:nth-child(1), div.tags + filters: + - name: replace + args: ["\n", ""] + - name: re_replace + args: ["^(.+) (.+)", "$2-$1"] + - name: replace + args: [" ", " "] + - name: replace + args: ["Blu-Ray Original", "Complete.BluRay"] + - name: replace + args: ["Blu-Ray Remux", "Remux"] + - name: replace + args: ["Blu-Ray Rip", "BluRay.Rip"] + - name: replace + args: ["mHD", "mHD.BluRay.Rip"] + - name: replace + args: ["/ DC", "/ Directors.Cut"] + - name: replace + args: ["/ VL", "/ Extended"] + - name: replace + args: ["/ RM", "/ Remastered"] + - name: replace + args: ["/ UC", "/ Uncut"] + - name: replace + args: ["/ ES", "/ Special.Edition"] + - name: replace + args: [" / Cust_sub", ""] + - name: replace + args: [" / Cust", ""] + - name: replace + args: ["/ UN", "/ Unrated"] + - name: replace + args: [" / Crit", ""] + - name: replace + args: [" / WAC", ""] + - name: replace + args: [" / MoC", ""] + - name: replace + args: [" / BFI", ""] + - name: replace + args: [" / MUET", ""] + - name: replace + args: ["/ Exc NF", "/ NF"] + - name: replace + args: ["/ Exc AMZ", "/ AMZ"] + - name: replace + args: ["/ Exc YOU", "/ YT"] + - name: replace + args: [" / ↓25%", ""] + - name: replace + args: [" / ↓50%", ""] + - name: replace + args: [" / ↓75%", ""] + - name: replace + args: [" / Free", ""] + - name: replace + args: [" / Complété!", ""] + - name: replace + args: [" / ", "."] + - name: trim + - name: replace + args: [".VFF.VFQ.StFr.MULTI", ".MULTI.VFF.VFQ"] + - name: replace + args: [".VFF.VFQ.VO.StFr.MULTI", ".MULTI.VFF.VFQ"] + - name: replace + args: [".VFF.VFQ.VO.StFr", ".MULTI.VFF.VFQ"] + - name: replace + args: [".VFQ.VO.StFr", ".MULTI.VFQ"] + - name: replace + args: [".VO.VFI.StFr", ".MULTI"] + - name: replace + args: [".VO.VF?.StFr", ".MULTI"] + - name: replace + args: [".VFF.VO.StFr", ".MULTI.VFF"] + - name: replace + args: [".VOF.StFr", ".FRENCH"] + - name: replace + args: [".VFQ.StFr", ".FRENCH"] + - name: replace + args: [".VFF.StFr.MULTI", ".MULTI.VFF"] + - name: replace + args: [".VFF.StFr", ".FRENCH"] + - name: replace + args: [".VFI.MULTI", ".MULTI"] + - name: replace + args: [".VO.StFr", ".VOSTFR"] + - name: replace + args: [".VFQ.VO", ".MULTI.VFQ"] + - name: replace + args: [".VFF.VO", ".MULTI.VFF"] + - name: replace + args: [".VO.VF?.StFr", ".MULTI"] + - name: replace + args: [".VFI.StFr", ".FRENCH"] + - name: replace + args: [".VOF.MULTI", ".MULTI.FRENCH"] + - name: replace + args: [".VOF", ".FRENCH"] + - name: replace + args: [".VFQ.MULTI", ".MULTI.VFQ"] + title_vostfr: + text: "{{ .Result.title_phase1 }}" + filters: + - name: re_replace + args: ["(?i)\\b(vostfr|subfrench)\\b", "ENGLISH"] + title_phase2: + text: "{{ if .Config.vostfr }}{{ .Result.title_vostfr }}{{ else }}{{ .Result.title_phase1 }}{{ end }}" + title_multilang: + text: "{{ .Result.title_phase2 }}" + filters: + - name: re_replace + args: ["(?i)\\b(MULTI(?!.*(?:FRENCH|ENGLISH|VOSTFR)))\\b", "{{ .Config.multilanguage }}"] + title: + text: "{{ if .Config.multilang }}{{ .Result.title_multilang }}{{ else }}{{ .Result.title_phase2 }}{{ end }}" + description: + selector: div.group_info + poster: + selector: div.group_image img + attribute: src + details: + selector: a[href^="torrents.php?id="] + attribute: href + files: + selector: td:nth-child(3) + date: + selector: td:nth-child(4) + filters: + - name: replace + args: ["Il y a ", ""] + - name: replace + args: ["heures", "hours"] + - name: replace + args: ["heure", "hour"] + - name: replace + args: ["jours", "days"] + - name: replace + args: ["jour", "day"] + - name: replace + args: ["semaines", "weeks"] + - name: replace + args: ["semaine", "week"] + - name: replace + args: ["mois", "months"] + - name: replace + args: ["ans", "years"] + - name: replace + args: ["an", "year"] + - name: append + args: " ago" + size: + selector: td:nth-child(5) + grabs: + selector: td:nth-child(6) + seeders: + selector: td:nth-child(7) + leechers: + selector: td:nth-child(8) + downloadvolumefactor: + case: + "div.group_info:contains(\"/ Free\")": 0 + "div.group_info:contains(\"↓75%\")": 0.75 + "div.group_info:contains(\"↓50%\")": 0.50 + "div.group_info:contains(\"↓25%\")": 0.25 # for this site this is the count ratio, which is 25% of the total torrent size. (I.E. it's 75% free) + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 0.6 + minimumseedtime: + # 3 days (as seconds = 3 x 24 x 60 x 60) + text: 259200 +# Gazelle diff --git a/config/prowlarr/Definitions/hdfun.yml b/config/prowlarr/Definitions/hdfun.yml new file mode 100644 index 0000000..a01b46d --- /dev/null +++ b/config/prowlarr/Definitions/hdfun.yml @@ -0,0 +1,222 @@ +--- +id: hdfun +name: HDFun +description: "HDFun (HDZone) is a CHINESE Private Torrent Tracker for HD MOVIES / TV" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://hdzone.me/ + - https://hdfun.me/ + +caps: + categorymappings: + - {id: 411, cat: Movies/SD, desc: "Movies SD"} + - {id: 412, cat: Movies, desc: "Movies IPad"} + - {id: 413, cat: Movies/HD, desc: "Movies 720p"} + - {id: 414, cat: Movies/HD, desc: "Movies 1080p"} + - {id: 415, cat: Movies, desc: "Movies REMUX"} + - {id: 450, cat: Movies/BluRay, desc: "Movies Bluray"} + - {id: 499, cat: Movies/UHD, desc: "Movies UHD Blu-ray"} + - {id: 416, cat: Movies/UHD, desc: "Movies 2160p"} + - {id: 417, cat: TV/Documentary, desc: "Doc SD"} + - {id: 418, cat: TV/Documentary, desc: "Doc IPad"} + - {id: 419, cat: TV/Documentary, desc: "Doc 720p"} + - {id: 420, cat: TV/Documentary, desc: "Doc 1080p"} + - {id: 421, cat: TV/Documentary, desc: "Doc REMUX"} + - {id: 451, cat: TV/Documentary, desc: "Doc Bluray"} + - {id: 500, cat: TV/Documentary, desc: "Doc UHD Blu-ray"} + - {id: 422, cat: TV/Documentary, desc: "Doc 2160p"} + - {id: 423, cat: Audio/Video, desc: "TVMusic 720p"} + - {id: 424, cat: Audio/Video, desc: "TVMusic 1080i"} + - {id: 425, cat: TV/SD, desc: "TVShow SD"} + - {id: 426, cat: TV, desc: "TVShow IPad"} + - {id: 471, cat: TV, desc: "TVShow IPad"} + - {id: 427, cat: TV/HD, desc: "TVShow 720p"} + - {id: 472, cat: TV/HD, desc: "TVShow 720p"} + - {id: 428, cat: TV/HD, desc: "TVShow 1080i"} + - {id: 429, cat: TV/HD, desc: "TVShow 1080p"} + - {id: 430, cat: TV, desc: "TVShow REMUX"} + - {id: 452, cat: TV/HD, desc: "TVShow Bluray"} + - {id: 431, cat: TV/UHD, desc: "TVShow 2160p"} + - {id: 432, cat: TV/SD, desc: "TVSeries SD"} + - {id: 433, cat: TV, desc: "TVSeries IPad"} + - {id: 434, cat: TV/HD, desc: "TVSeries 720p"} + - {id: 435, cat: TV/HD, desc: "TVSeries 1080i"} + - {id: 436, cat: TV/HD, desc: "TVSeries 1080p"} + - {id: 437, cat: TV, desc: "TVSeries REMUX"} + - {id: 453, cat: TV/HD, desc: "TVSeries Bluray"} + - {id: 438, cat: TV/UHD, desc: "TVSeries 2160p"} + - {id: 439, cat: Audio, desc: "Music APE"} + - {id: 440, cat: Audio/Lossless, desc: "Music FLAC"} + - {id: 441, cat: Audio/Video, desc: "Music MV"} + - {id: 442, cat: TV/Sport, desc: "Sports 720p"} + - {id: 443, cat: TV/Sport, desc: "Sports 1080i"} + - {id: 444, cat: TV/Anime, desc: "Anime SD"} + - {id: 445, cat: TV/Anime, desc: "Anime IPad"} + - {id: 446, cat: TV/Anime, desc: "Anime 720p"} + - {id: 447, cat: TV/Anime, desc: "Anime 1080p"} + - {id: 448, cat: TV/Anime, desc: "Anime REMUX"} + - {id: 454, cat: TV/Anime, desc: "Anime Bluray"} + - {id: 409, cat: Other, desc: "Misc"} + - {id: 449, cat: TV/Anime, desc: "Anime 2160p"} + - {id: 501, cat: TV/Anime, desc: "Anime UHD Blu-ray"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + secret: "" + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("失败")) + test: + path: torrents.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + # currently supports only one query id at one time. + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 incldead, 1 active, 2 onlydead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdb + search_area: "{{ if .Query.IMDBID }}4{{ else }}{{ end }}{{ if .Query.DoubanID }}1{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }}{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td:nth-child(5) + seeders: + selector: td:nth-child(6) + leechers: + selector: td:nth-child(7) + grabs: + selector: td:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumratio: + text: 1.2 +# does not appear to be implemented, no h&r tag found +# minimumseedtime: +# # 14 days (as seconds = 2 x 24 x 60 x 60) +# text: 1209600 + description: + selector: td:nth-child(2) + remove: a, b, font, img, span +# NexusPHP Standard v1.5 Beta 4 diff --git a/config/prowlarr/Definitions/hdgalaktik.yml b/config/prowlarr/Definitions/hdgalaktik.yml new file mode 100644 index 0000000..111de41 --- /dev/null +++ b/config/prowlarr/Definitions/hdgalaktik.yml @@ -0,0 +1,270 @@ +--- +id: hdgalaktik +name: HDGalaKtik +description: "HDGalaKtik is a RUSSIAN Semi-Private tracker for MOVIES / TV / GENERAL" +language: ru-RU +type: semi-private +encoding: UTF-8 +links: + - https://www.trackerpmr.com/ + - https://freetmd.com/ + - https://kinoradiomagia.tv/ +legacylinks: + - https://hdgalaktik.com/ + +caps: + categorymappings: + - {id: 13, cat: Movies, desc: "Фильмы (Movies)"} + - {id: 6, cat: TV, desc: "Мультфильмы (Cartoons)"} + - {id: 10, cat: Audio, desc: "Музыка (Music)"} + - {id: 26, cat: PC, desc: "Программы (Programs)"} + - {id: 5, cat: Console, desc: "Игры (Games)"} + - {id: 25, cat: Other, desc: "Картинки (Pictures)"} + - {id: 11, cat: TV, desc: "Сериалы (TV Series)"} + - {id: 12, cat: TV/Anime, desc: "Аниме (Anime)"} + - {id: 16, cat: Books, desc: "Книги (Books)"} + - {id: 18, cat: Audio/Video, desc: "Клипы / Ролики (Clips / Trailers)"} + - {id: 22, cat: TV, desc: "ТВ / Передачи (TV)"} + - {id: 27, cat: PC/Mobile-Other, desc: "Игры - Мобила / КПК (Mobile)"} + - {id: 1, cat: PC/ISO, desc: "Образы (ISO)"} + - {id: 4, cat: Other, desc: "Другое (Other)"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: stripcyrillic + type: checkbox + label: Strip Cyrillic Letters + default: false + - name: addrussiantotitle + type: checkbox + label: Add RUS to end of all titles to improve language detection by Sonarr and Radarr. Will cause English-only results to be misidentified. + default: false + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 1: title + 5: size + 8: seeders + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: / + selector: a[href="mybonus.php"] + +search: + # https://www.trackerpmr.com/browse.php?search=&stype=0&s=0&cat=0&gr=0&kp=0&im=0&incldead=1&sort=0&type=desc + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 title, 1 descr, 2 filename, 4 infohash + stype: 0 + # 0 AND 1 OR + s: 0 + # release group + gr: 0 + # ratings + kp: 0 + # 1 active, 2 dead, 3 gold, 4 sticky, lots of others + incldead: "{{ if .Config.freeleech }}3{{ else }}1{{ end }}" + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + + keywordsfilters: + - name: re_replace # S01 to сезон 1 + args: ["(?i)\\bS0*(\\d+)\\b", "сезон $1"] + - name: re_replace # E02 to сери 1 + args: ["(?i)\\bE0*(\\d+)\\b", "сери $1"] + - name: re_replace # S01E02 to сезон 1 сери 2 + args: ["(?i)\\bS0*(\\d+)E0*(\\d+)\\b", "сезон $1 сери $2"] + - name: re_replace # replace special characters with "%" (wildcard) + args: ["[^a-zA-Z0-9]+", "%"] + + rows: + selector: table.embedded > tbody > tr.torcontduo + + fields: + category_default: + selector: td:nth-child(1) + optional: true + filters: + - name: replace + args: ["---", 4] + category: + selector: a[href^="browse.php?cat="] + attribute: href + optional: true + default: "{{ .Result.category_default }}" + filters: + - name: querystring + args: cat + title: + selector: a.alink + attribute: onmouseover + filters: + - name: regexp + args: \'>(.+?)»]", ""] + - name: re_replace + args: ["^[\\s&,\\.!\\?\\+\\-_\\|\\/':]+", ""] + - name: re_replace + args: ["(?i)^\\(\\s*([SE]\\d+.*?)\\s*\\)[\\s\\/\\|]*(.+)", "$2 $1"] + - name: append + args: "{{ if .Config.addrussiantotitle }} RUS{{ else }}{{ end }}" + details: + selector: a.alink + attribute: href + download: + selector: a.alink + attribute: href + filters: + - name: replace + args: ["details", "download"] + imdbid: + selector: a[href^="browse.php?imdb="] + attribute: href + filters: + - name: querystring + args: imdb + size: + selector: td:nth-child(4) + seeders: + selector: td:nth-child(6) + filters: + - name: split + args: ["|", 0] + leechers: + selector: td:nth-child(6) + filters: + - name: split + args: ["|", 1] + date_today: + # Сегодня в 18:22 + selector: a[href^="browse.php?date="]:contains("Сегодня") + optional: true + filters: + - name: regexp + args: "(Сегодня в \\d{2}:\\d{2})" + - name: replace + args: ["Сегодня в", "Today"] + - name: fuzzytime + date_yday: + # Вчера в 20:52 + selector: a[href^="browse.php?date="]:contains("Вчера") + optional: true + filters: + - name: regexp + args: "(Вчера в \\d{2}:\\d{2})" + - name: replace + args: ["Вчера в", "Yesterday"] + - name: fuzzytime + date_year: + # 23:48 24/07 + selector: a[href^="browse.php?date="]:contains("/") + optional: true + filters: + - name: regexp + args: "(\\d{2}:\\d{2} \\d{2}/\\d{2})" + - name: append + args: " +03:00" # MSK + - name: dateparse + args: "HH:mm dd/MM zzz" + date: + text: "{{ if or .Result.date_year .Result.date_today .Result.date_yday }}{{ or .Result.date_year .Result.date_today .Result.date_yday }}{{ else }}now{{ end }}" + downloadvolumefactor: + case: + img[src="/pic/freedownload.gif"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 + description: + selector: a.alink + attribute: title +# engine n/a diff --git a/config/prowlarr/Definitions/hdhome.yml b/config/prowlarr/Definitions/hdhome.yml new file mode 100644 index 0000000..b5c51c4 --- /dev/null +++ b/config/prowlarr/Definitions/hdhome.yml @@ -0,0 +1,175 @@ +--- +id: hdhome +name: HDHome +description: "HDHome (HDBiger) is a CHINESE Private Torrent Tracker for HD MOVIES / TV" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://hdhome.org/ +legacylinks: + - http://hdhome.org/ + +caps: + categorymappings: + - {id: 411, cat: Movies/SD, desc: "Movies SD"} + - {id: 412, cat: Movies/SD, desc: "Movies IPad"} + - {id: 413, cat: Movies/HD, desc: "Movies 720p"} + - {id: 414, cat: Movies/HD, desc: "Movies 1080p"} + - {id: 415, cat: Movies/HD, desc: "Movies REMUX"} + - {id: 450, cat: Movies/BluRay, desc: "Movies Bluray"} + - {id: 499, cat: Movies/BluRay, desc: "Movies UHD Blu-ray"} + - {id: 416, cat: Movies/UHD, desc: "Movies 2160p"} + - {id: 417, cat: TV/Documentary, desc: "Doc SD"} + - {id: 418, cat: TV/Documentary, desc: "Doc IPad"} + - {id: 419, cat: TV/Documentary, desc: "Doc 720p"} + - {id: 420, cat: TV/Documentary, desc: "Doc 1080p"} + - {id: 421, cat: TV/Documentary, desc: "Doc REMUX"} + - {id: 451, cat: TV/Documentary, desc: "Doc Bluray"} + - {id: 500, cat: TV/Documentary, desc: "Doc UHD Blu-ray"} + - {id: 422, cat: TV/Documentary, desc: "Doc 2160p"} + - {id: 423, cat: TV/HD, desc: "TVMusic 720p"} + - {id: 424, cat: TV/HD, desc: "TVMusic 1080i"} + - {id: 425, cat: TV/SD, desc: "TVShow SD"} + - {id: 426, cat: TV/SD, desc: "TVShow IPad"} + - {id: 471, cat: TV/SD, desc: "TVShow IPad"} + - {id: 427, cat: TV/HD, desc: "TVShow 720p"} + - {id: 428, cat: TV/HD, desc: "TVShow 1080i"} + - {id: 429, cat: TV/HD, desc: "TVShow 1080p"} + - {id: 430, cat: TV/HD, desc: "TVShow REMUX"} + - {id: 452, cat: TV/HD, desc: "TVShows Bluray"} + - {id: 431, cat: TV/HD, desc: "TVShow 2160p"} + - {id: 432, cat: TV/SD, desc: "TVSeries SD"} + - {id: 433, cat: TV/SD, desc: "TVSeries IPad"} + - {id: 434, cat: TV/HD, desc: "TVSeries 720p"} + - {id: 435, cat: TV/HD, desc: "TVSeries 1080i"} + - {id: 436, cat: TV/HD, desc: "TVSeries 1080p"} + - {id: 437, cat: TV/HD, desc: "TVSeries REMUX"} + - {id: 453, cat: TV/HD, desc: "TVSereis Bluray"} + - {id: 438, cat: TV/UHD, desc: "TVSeries 2160p"} + - {id: 502, cat: TV/UHD, desc: "TVSeries 4K Bluray"} + - {id: 439, cat: Audio/Other, desc: "Musics APE"} + - {id: 440, cat: Audio/Lossless, desc: "Musics FLAC"} + - {id: 441, cat: Audio/Video, desc: "Musics MV"} + - {id: 442, cat: TV/Sport, desc: "Sports 720p"} + - {id: 443, cat: TV/Sport, desc: "Sports 1080i"} + - {id: 444, cat: TV/Anime, desc: "Anime SD"} + - {id: 445, cat: TV/Anime, desc: "Anime IPad"} + - {id: 446, cat: TV/Anime, desc: "Anime 720p"} + - {id: 447, cat: TV/Anime, desc: "Anime 1080p"} + - {id: 448, cat: TV/Anime, desc: "Anime REMUX"} + - {id: 454, cat: TV/Anime, desc: "Anime Bluray"} + - {id: 409, cat: Other, desc: "Misc"} + - {id: 449, cat: TV/Anime, desc: "Anime 2160p"} + - {id: 501, cat: TV/Anime, desc: "Anime UHD Blu-ray"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + incldead: 1 + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + inclbookmarked: 0 + search_area: "{{ if .Query.IMDBID }}4{{ else }}0{{ end }}" + search_mode: 0 + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + title: + selector: a[title][href^="details.php?id="] + attribute: title + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + details: + selector: a[title][href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + size: + selector: td.rowfollow:nth-child(5) + grabs: + selector: td.rowfollow:nth-child(8) + seeders: + selector: td.rowfollow:nth-child(6) + leechers: + selector: td.rowfollow:nth-child(7) + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + description: + selector: td:nth-child(2) + remove: a, b, font, img, span +# NexusPHP v2.0 2014-11-24 diff --git a/config/prowlarr/Definitions/hdmayi.yml b/config/prowlarr/Definitions/hdmayi.yml new file mode 100644 index 0000000..6238396 --- /dev/null +++ b/config/prowlarr/Definitions/hdmayi.yml @@ -0,0 +1,205 @@ +--- +id: hdmayi +name: HDMaYi +description: "HDMaYi (小蚂蚁PT站) is a CHINESE Private Torrent Tracker for HD MOVIES / TV / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://hdmayi.com/ +legacylinks: + - http://hdmayi.com/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "Movies/电影"} + - {id: 404, cat: TV/Documentary, desc: "Documentaries/纪录片"} + - {id: 405, cat: TV/Anime, desc: "Animations/动漫"} + - {id: 402, cat: TV, desc: "TV Series/电视剧"} + - {id: 403, cat: TV, desc: "TV Shows/综艺"} + - {id: 406, cat: Audio/Video, desc: "MusicVideo/MV"} + - {id: 407, cat: TV/Sport, desc: "Sports/体育"} + - {id: 409, cat: Other, desc: "Misc/其他"} + - {id: 408, cat: Audio, desc: "Music/音乐"} + - {id: 410, cat: PC, desc: "Softs/软件"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: 2facode + type: text + label: 2FA code + - name: info_2fa + type: info + label: "About 2FA code" + default: "Only fill in the 2FA code box if you have enabled 2FA on the HDMaYi Web Site. Otherwise just leave it empty." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + secret: "" + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + two_step_code: "{{ .Config.2facode }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("失败")) + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl (4 does not appear to work) + search_area: "{{ if or .Query.IMDBID .Query.DoubanID }}1{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(a[href^="details.php?id="]) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: img[data-src] + attribute: data-src + imdbid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="imdb.com/title/tt"] + attribute: href + doubanid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="movie.douban.com/subject/"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-child(5) + seeders: + selector: td.rowfollow:nth-child(6) + leechers: + selector: td.rowfollow:nth-child(7) + grabs: + selector: td.rowfollow:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 1 day (as seconds = 24 x 60 x 60) + text: 86400 + description_verified: + case: + span[title="通过"], span[title="通過"], span[title="Allowed"]: "Verified:" + span[title="未审"], span[title="未審"], span[title="Not reviewed"]: "Unverified:" + span[title="拒绝"], span[title="拒絕"], span[title="Denied"]: "Banned:" + description: + selector: td.rowfollow:nth-child(2) + remove: a, b, font, img, span + filters: + - name: prepend + args: "{{ .Result.description_verified }} " +# NexusPHP v1.8.6 2023-08-18 diff --git a/config/prowlarr/Definitions/hdolimpo-api.yml b/config/prowlarr/Definitions/hdolimpo-api.yml new file mode 100644 index 0000000..66a0e9c --- /dev/null +++ b/config/prowlarr/Definitions/hdolimpo-api.yml @@ -0,0 +1,206 @@ +--- +id: hdolimpo-api +name: HD-Olimpo (API) +description: "HD-Olimpo is a SPANISH site for HD content" +language: es-ES +type: private +encoding: UTF-8 +links: + - https://hd-olimpo.club/ +legacylinks: + - https://hdolimpo.co/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Películas"} + - {id: 2, cat: TV, desc: "Series"} + - {id: 3, cat: Audio, desc: "Música"} + - {id: 4, cat: TV/Documentary, desc: "Documentales"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + music-search: [q] + book-search: [q] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your account My configuration / Mi configuración => Secutiy / Seguridad page and clicking on the API Token tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + inputs: {} # TODO: remove in v10 + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: api/torrents/filter + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + # if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6 + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + seasonNumber: "{{ .Query.Season }}" + episodeNumber: "{{ .Query.Ep }}" + imdbId: "{{ .Query.IMDBIDShort }}" + tmdbId: "{{ .Query.TMDBID }}" + tvdbId: "{{ .Query.TVDBID }}" + free: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + rows: + selector: data + attribute: attributes + + fields: + categorydesc: + selector: category + title: + selector: name + filters: + - name: re_replace + args: ["\\[", " "] + - name: re_replace + args: ["\\]", " "] + - name: re_replace + args: ["(?i)(full(bluray)?)", "BRDISK"] # FULL(BR/UHD) -> BRDISK + - name: replace + args: ["HDOlimpo", ""] # Delete HDOlimpo + - name: replace + args: ["HD-Olimpo", ""] # Delete HD-Olimpo + - name: replace + args: ["E-AC-3", "EAC3"] + - name: re_replace + args: ["[ -](?i)español[ -]", " SPANiSH "] + - name: re_replace + args: ["[ -](?i)castellano[ -]", " SPANiSH "] + - name: re_replace + args: ["[ -](?i)spa[ -]", " SPANiSH "] + - name: re_replace + args: ["[ -](?i)esp[ -]", " SPANiSH "] + - name: re_replace + args: [" ES ", " SPANiSH "] + - name: re_replace + args: ["[ -](?i)ingl[eé]s[ -]", " English "] + - name: re_replace + args: ["[ -](?i)[ei]ng[ -]", " English "] + - name: re_replace + args: ["[ -](?i)cat[ -]", " Catalan "] + - name: re_replace + args: ["[ -](?i)vas[ -]", " Basque "] + - name: re_replace + args: ["[ -](?i)fr[ae][ -]", " French "] + - name: re_replace + args: ["[ -](?i)jap[ -]", " Japanese "] + - name: re_replace + args: ["[ -](?i)ita[ -]", " Italian "] + - name: re_replace + args: ["[ -](?i)rus[ -]", " Russian "] + - name: re_replace + args: ["[ -](?i)ger[ -]", " German "] + - name: re_replace + args: ["(?i)(triaudio)", "MULTi SPANiSH English"] + - name: re_replace + args: ["(?i)(dual)", " MULTi SPANiSH "] + - name: re_replace + args: ["(?i)(es-en)", " MULTi SPANiSH "] + - name: re_replace + args: ["(?i)(en-es)", " MULTi SPANiSH "] + - name: re_replace + args: ["\\.+", "."] # More than 1 dot -> . + - name: re_replace + args: ["^\\.", ""] # Delete first dot + - name: re_replace + args: ["\\s+", " "] # More than 1 space to 1 space + details: + selector: details_link + download: + selector: download_link + poster: + selector: poster + filters: + - name: replace + args: ["https://via.placeholder.com/90x135", ""] + imdbid: + selector: imdb_id + tmdbid: + selector: tmdb_id + tvdbid: + selector: tvdb_id + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0%, 25%, 50%, 75%, 100% + selector: freeleech + case: + 0%: 1 # not free + 25%: 0.75 + 50%: 0.5 + 75%: 0.25 + 100%: 0 # freeleech + "*": 0 # catch errors + uploadvolumefactor: + # api returns 0=false, 1=true + selector: double_upload + case: + 0: 1 # normal + 1: 2 # double + minimumseedtime: + # 4 days (as seconds = 4 x 24 x 60 x 60) + text: 345600 +# json UNIT3D 6.0.4 diff --git a/config/prowlarr/Definitions/hdonly.yml b/config/prowlarr/Definitions/hdonly.yml new file mode 100644 index 0000000..d1b4448 --- /dev/null +++ b/config/prowlarr/Definitions/hdonly.yml @@ -0,0 +1,294 @@ +--- +id: hdonly +name: HD-Only +description: "HD-Only (HD-O) is a FRENCH Private Torrent Tracker for HD MOVIES / TV" +language: fr-FR +type: private +encoding: UTF-8 +requestDelay: 2 +links: + - https://hd-only.org/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Films"} + - {id: 2, cat: TV, desc: "Séries"} + # Fake ids to match release types by desc + - {id: 101, cat: Movies, desc: "Film"} + - {id: 103, cat: Movies/Other, desc: "Dessin animé"} + - {id: 105, cat: TV, desc: "Série"} + - {id: 106, cat: TV/Anime, desc: "Série Animée"} + - {id: 107, cat: Movies/Other, desc: "Film d'animation"} + - {id: 109, cat: Audio/Video, desc: "Concert"} + - {id: 111, cat: TV/Documentary, desc: "Documentaire"} + - {id: 113, cat: Movies/Other, desc: "Court-métrage"} + - {id: 114, cat: Movies/Other, desc: "Clip"} + - {id: 115, cat: Movies/Other, desc: "Démonstration"} + - {id: 121, cat: Other, desc: "Autre"} + + modes: + search: [q] + tv-search: [q, season, ep, tmdbid, genre] + movie-search: [q, tmdbid, genre] + allowrawsearch: true + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: add_hybrid_features_to_filename + type: checkbox + label: Include DV/HDR10 in filename when a release has multiple HDR formats. + default: false + - name: multilang + type: checkbox + label: Replace MULTi by another language in release name + default: false + - name: multilanguage + type: select + label: Replace MULTi by this language + default: FRENCH + options: + FRENCH: FRENCH + MULTi.FRENCH: MULTi.FRENCH + ENGLISH: ENGLISH + MULTi.ENGLISH: MULTi.ENGLISH + VOSTFR: VOSTFR + MULTi.VOSTFR: MULTi.VOSTFR + - name: vostfr + type: checkbox + label: Replace VOSTFR and SUBFRENCH with ENGLISH + default: false + - name: sort + type: select + label: Sort requested from site + default: time + options: + time: created + seeders: seeders + size: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: login.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + keeplogged: 1 + error: + - selector: form#loginform > span.warning + test: + path: torrents.php + selector: a[href^="logout.php?auth="] + +search: + # https://hd-only.org/torrents.php?filelist=blood+2009&freetorrent=1&order_by=time&order_way=desc&action=advanced&searchsubmit=1 + paths: + - path: ajax.php + response: + type: json + + inputs: + # does not support categories, uses releasetype for single filter, so we cannot do multi releasetype filtering either. + # $raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}" + searchstr: "{{ .Keywords }}" + tmdb: "{{ .Query.TMDBID }}" + taglist: "{{ .Query.Genre }}" + action: browse + group_results: 0 + order_by: "{{ .Config.sort }}" + order_way: "{{ .Config.type }}" + # 1 freeleech, 0 normal + freetorrent: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + # site does not support imdbid search or display imdb links in results + + keywordsfilters: + # strip season + - name: re_replace + args: ["(?i)\\bS\\d{1,3}\\b", ""] + - name: trim + + rows: + selector: response.results + + fields: + _group_id: + selector: group.groupId + _torrent_id: + selector: torrentId + category: + selector: group.categoryId + categorydesc|append: + selector: group.releaseType + optional: true + details: + text: "torrents.php?id={{ .Result._group_id }}&torrentid={{ .Result._torrent_id }}" + download: + text: "torrents.php?action=download&id={{ .Result._torrent_id }}" + genre: + selector: group.tags + filters: + - name: re_replace + args: ["(?i)(science.fiction)", "science_fiction"] + poster: + selector: group.cover + optional: true + tmdbid: + selector: group.tmdb + files: + selector: fileCount + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: snatches + size: + selector: size + date: + selector: time + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + year: + selector: group.groupYear + optional: true + _season: + selector: season + optional: true + filters: + - name: re_replace + args: ["^0$", ""] + - name: re_replace + args: ["^([1-9])$", "S0$1"] + - name: re_replace + args: ["^(\\d{2,})$", "S$1"] + _episode: + selector: episode + optional: true + filters: + - name: re_replace + args: ["^0$", ""] + - name: re_replace + args: ["^([1-9])$", "E0$1"] + - name: re_replace + args: ["^(\\d{2,})$", "E$1"] + _episode_info: + text: "{{ .Result._season }}{{ .Result._episode }}" + _format: + selector: format + filters: + - name: replace + args: ["Blu-Ray Original", "COMPLETE BLURAY"] + - name: re_replace + args: ["Blu-Ray Remux", "Remux"] + - name: re_replace + args: ["Blu-Ray Rip", "BluRay.Rip"] + - name: re_replace + args: ["mHD", "mHD.BluRay.Rip"] + _encoding: + selector: encoding + _release_group: + selector: team + optional: true + _media: + selector: media + optional: true + _vff: + selector: vff + optional: true + _vfq: + selector: vfq + optional: true + _vfi: + selector: vfi + optional: true + _vf: + selector: vf + optional: true + _vof: + selector: vof + optional: true + _hdr: + selector: hdr + optional: true + _hdr10plus: + selector: hdr10plus + optional: true + _dovi: + selector: dovi + optional: true + title_optional: + selector: group.groupName + filters: + - name: append + args: ".{{ .Result.year }}.{{ .Result._episode_info }}.{{ .Result._format }}.{{ .Result._encoding }}.{{ .Result._media }}{{ if eq .Result._hdr \"True\" }}.HDR{{ else }}{{ end }}.{{ if eq .Result._hdr10plus \"True\" }}.HDR10+{{ else }}{{ end }}.{{ if eq .Result._dovi \"True\" }}.DoVi{{ else }}{{ end }}" + - name: append + args: "{{ if or (eq .Result._vff \"True\") (eq .Result._vfq \"True\") }}.MULTI{{ else }}{{ end }}{{ if or (eq .Result._vfi \"True\") (eq .Result._vf \"True\") }}.MULTI{{ else }}{{ end }}" + - name: replace + args: [".MULTI.MULTI", ".MULTI"] + - name: append + args: "{{ if eq .Result._vof \"True\" }}.FRENCH{{ else }}{{ end }}" + - name: re_replace + args: ["[\\s.]+", "."] + - name: re_replace + args: ["\\.*([\\-:,])\\.*", "$1"] + - name: trim + - name: trim + args: . + - name: append + args: "{{ if .Result._release_group }}-{{ .Result._release_group }}{{ else }}{{ end }}" + _filename: + selector: "fileName" + optional: true + filters: + - name: replace + args: [".mkv", ""] + - name: append + args: " {{ if and (.Config.add_hybrid_features_to_filename) (eq .Result._hdr \"True\") }}[HDR]{{ else }}{{ end }}{{ if and (.Config.add_hybrid_features_to_filename) (eq .Result._hdr10plus \"True\") }}[HDR10+]{{ else }}{{ end }}{{ if and (.Config.add_hybrid_features_to_filename) (eq .Result._dovi \"True\") }}[DoVi]{{ else }}{{ end }}" + title_phase1: + text: "{{ if and (eq .Result.files \"1\") (.Result._filename) }}{{ .Result._filename }}{{ else }}{{ .Result.title_optional }}{{ end }}" + title_vostfr: + text: "{{ .Result.title_phase1 }}" + filters: + - name: re_replace + args: ["(?i)\\b(vostfr|subfrench)\\b", "ENGLISH"] + title_phase2: + text: "{{ if .Config.vostfr }}{{ .Result.title_vostfr }}{{ else }}{{ .Result.title_phase1 }}{{ end }}" + title_multilang: + text: "{{ .Result.title_phase2 }}" + filters: + - name: re_replace + args: ["(?i)\\b(MULTI(?!.*(?:FRENCH|ENGLISH|VOSTFR)))\\b", "{{ .Config.multilanguage }}"] + title: + text: "{{ if .Config.multilang }}{{ .Result.title_multilang }}{{ else }}{{ .Result.title_phase2 }}{{ end }}" + description: + text: "{{ .Result._filename }}" + _free: + selector: isFreeleech + downloadvolumefactor: + text: "{{ if eq .Result._free \"True\" }}0{{ else }}1{{ end }}" + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 3 days (as seconds = 3 x 24 x 60 x 60) + text: 259200 +# JSON Gazelle diff --git a/config/prowlarr/Definitions/hdpt.yml b/config/prowlarr/Definitions/hdpt.yml new file mode 100644 index 0000000..efd63ea --- /dev/null +++ b/config/prowlarr/Definitions/hdpt.yml @@ -0,0 +1,199 @@ +--- +id: hdpt +name: HDPT +description: "HDPT is a CHINESE Private Torrent Tracker for MOVIES / TV / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://hdpt.xyz/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "Movies/电影"} + - {id: 404, cat: TV/Documentary, desc: "Documentaries/纪录片"} + - {id: 405, cat: TV/Anime, desc: "Animations/动漫"} + - {id: 402, cat: TV, desc: "TV Series/电视剧"} + - {id: 403, cat: TV, desc: "TV Shows/综艺"} + - {id: 406, cat: Audio/Video, desc: "Music Videos/音乐 视频"} + - {id: 407, cat: TV/Sport, desc: "Sports/体育"} + - {id: 409, cat: Other, desc: "Misc/其他"} + - {id: 408, cat: Audio, desc: "HQ Audio/高清音轨"} + - {id: 410, cat: PC, desc: "Software/软件"} + - {id: 411, cat: Books/EBook, desc: "E-book/电子书"} + - {id: 412, cat: Books/Comics, desc: "Comics/漫画"} + - {id: 413, cat: Other/Misc, desc: "Learning/学习资料"} + - {id: 414, cat: Console, desc: "Games/游戏"} + - {id: 415, cat: Other/Misc, desc: "gallery/图库"} + - {id: 416, cat: Audio, desc: "Quyi/曲艺"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: 2facode + type: text + label: 2FA code + - name: info_2fa + type: info + label: "About 2FA code" + default: "Only fill in the 2FA code box if you have enabled 2FA on the CarPT Web Site. Otherwise just leave it empty." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + secret: "" + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + two_step_code: "{{ .Config.2facode }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("失败")) + test: + path: index.php + selector: a[href*="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl + search_area: "{{ if .Query.IMDBID }}4{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(a[href*="details.php?id="]) + + fields: + category: + selector: a[href*="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href*="details.php?id="] + title: + selector: a[title][href*="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href*="details.php?id="] + attribute: href + download: + selector: a[href*="download.php?id="] + attribute: href + poster: + selector: img[data-src] + attribute: data-src + imdbid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="imdb.com/title/tt"] + attribute: href + doubanid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="movie.douban.com/subject/"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-child(5) + seeders: + selector: td.rowfollow:nth-child(6) + leechers: + selector: td.rowfollow:nth-child(7) + grabs: + selector: td.rowfollow:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumratio: + text: 1.0 + description: + selector: td.rowfollow:nth-child(2) + remove: a, b, font, img, span +# NexusPHP v1.8.6 2023-08-18 diff --git a/config/prowlarr/Definitions/hdroute.yml b/config/prowlarr/Definitions/hdroute.yml new file mode 100644 index 0000000..95f64af --- /dev/null +++ b/config/prowlarr/Definitions/hdroute.yml @@ -0,0 +1,108 @@ +--- +id: hdroute +name: HDRoute +description: "HDRoute is a CHINESE Private Torrent Tracker for HD MOVIES / TV" +language: zh-CN +type: private +encoding: UTF-8 +links: + - http://hdroute.org/ # site does not support https: NET::ERR_CERT_REVOKED 21 Aug 2015 + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "电影 (Movies)"} + - {id: 2, cat: TV/Documentary, desc: "演示/纪录片 (Demo/Docu)"} + - {id: 3, cat: TV, desc: "连续剧 (TV)"} + - {id: 4, cat: TV/Anime, desc: "动画片 (Animation)"} + - {id: 5, cat: Audio/Video, desc: "演唱会/MV (Music Video)"} + - {id: 6, cat: TV/Sport, desc: "体育节目 (Sports)"} + - {id: 7, cat: Audio/Other, desc: "电影音轨 (Soundtracks"} + - {id: 8, cat: Audio/Lossless, desc: "无损音乐 (Lossless)"} + - {id: 9, cat: Other, desc: "其他 (Other)"} + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + +login: + path: login.php?action=login + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: :contains("用户不存在") + - selector: :contains("密码错误") + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + # http://hdroute.org/browse.php?s=&dp=0&add=0&action=s&c1=1&c3=1&or=1&imdb= + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + s: "{{ if .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # discount 0 all, 1 none, 2 30%, 3 50%, 4 70%, 5 free, 6 tempo free + dp: 0 + # dates 0 all, 1 this week, 2 this month, 3 this season, 4 this year + add: 0 + # order: 1 uptime, 2 imdb, 3 comment, 4 size, 5 complete, 6 upload + or: 1 + action: s + imdb: "{{ if .Query.IMDBID }}{{ .Query.IMDBIDShort }}{{ else }}{{ end }}" + + rows: + selector: div#unsticky-torrent-table dl, div#sticky-torrent-table dl + + fields: + category: + text: 9 + title: + selector: div.torrent_title + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="details.php?id="] + attribute: href + filters: + - name: replace + args: ["details.php", "download.php"] + size: + selector: div.torrent_size + date: + selector: div.torrent_added + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + imdbid: + selector: div.torrent-imdb + attribute: href + poster: + selector: div.introForPic img + attribute: src + filters: + - name: replace + args: ["./img/theme1/default.jpg", ""] + seeders: + selector: div.torrent-content-right div:nth-child(5) + leechers: + selector: div.torrent-content-right div:nth-child(6) + downloadvolumefactor: + case: + figure.sprite_tempo_free: 0 + figure.sprite_dlp100: 0 + figure.sprite_dlp000: 0 + figure.sprite_dlp070: 0.7 + figure.sprite_dlp050: 0.5 + figure.sprite_dlp030: 0.3 + "*": 1 + uploadvolumefactor: + case: + "*": 1 +# engine tbd diff --git a/config/prowlarr/Definitions/hdsky.yml b/config/prowlarr/Definitions/hdsky.yml new file mode 100644 index 0000000..19ee6a6 --- /dev/null +++ b/config/prowlarr/Definitions/hdsky.yml @@ -0,0 +1,149 @@ +--- +id: hdsky +name: HDSky +description: "HDSky is a CHINESE Private Torrent Tracker for HD MOVIES / TV" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://hdsky.me/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "Movies/电影"} + - {id: 402, cat: TV, desc: "TV Series/剧集(分集)"} + - {id: 403, cat: TV, desc: "TV Shows/综艺"} + - {id: 404, cat: TV/Documentary, desc: "Documentaries/纪录片"} + - {id: 405, cat: TV/Anime, desc: "Animations/动漫"} + - {id: 406, cat: Audio/Video, desc: "Music Videos/音乐MV"} + - {id: 407, cat: TV/Sport, desc: "Sports/体育"} + - {id: 408, cat: Audio, desc: "HQ Audio/无损音乐"} + - {id: 409, cat: Other, desc: "Misc/其他"} + - {id: 410, cat: Movies, desc: "iPad/iPad影视"} + - {id: 411, cat: TV, desc: "TV Series/剧集(合集)"} + - {id: 412, cat: TV, desc: "TV Series/海外剧集(分集)"} + - {id: 413, cat: TV, desc: "TV Series/海外剧集(合集)"} + - {id: 414, cat: TV, desc: "TV Shows/海外综艺(分集)"} + - {id: 415, cat: TV, desc: "TV Shows/海外综艺(合集)"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: torrents.php + selector: a[href="logout.php"] + +download: + method: post + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" # for dashboard imdbid + # 0=incldead, 1=active, 2=dead + incldead: 0 + # show promotions 0=all, 1=normal, 2=free, 3=2x, 4=2xfree, 5=50%, 6=2x50%, 7=30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0=title, 1=descr, 3=uploader, 4=imdb url + search_area: "{{ if .Query.IMDBID }}4{{ else }}0{{ end }}" + # 0=AND, 1=OR, 2=exact + search_mode: 0 + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + filters: + - name: andmatch + + fields: + title: + selector: a[title][href^="details.php?id="] + attribute: title + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + details: + selector: a[title][href^="details.php?id="] + attribute: href + download: + selector: form[action*="/download.php?id="] + attribute: action + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + size: + selector: td.rowfollow:nth-child(5) + grabs: + selector: td.rowfollow:nth-child(8) + seeders: + selector: td.rowfollow:nth-child(6) + leechers: + selector: td.rowfollow:nth-child(7) + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + description: + selector: td:nth-child(2) + remove: a, b, font, img, span +# NexusPHP Standard v1.5 Beta 5 diff --git a/config/prowlarr/Definitions/hdtime.yml b/config/prowlarr/Definitions/hdtime.yml new file mode 100644 index 0000000..a78521b --- /dev/null +++ b/config/prowlarr/Definitions/hdtime.yml @@ -0,0 +1,191 @@ +--- +id: hdtime +name: HDtime +description: "HDtime is a CHINESE Private Torrent Tracker for HD MOVIES / TV / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://hdtime.org/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "Movies/电影"} + - {id: 424, cat: Movies/BluRay, desc: "Blu-Ray原盘"} + - {id: 402, cat: TV, desc: "TV Series/剧集"} + - {id: 403, cat: TV, desc: "TV Shows/综艺"} + - {id: 405, cat: TV/Anime, desc: "Animations/动漫"} + - {id: 414, cat: PC, desc: "Apps/软件"} + - {id: 407, cat: TV/Sport, desc: "Sports/运体"} + - {id: 404, cat: TV/Documentary, desc: "Documentaries/纪录片"} + - {id: 406, cat: Audio/Video, desc: "MusicVideo/音乐MV"} + - {id: 408, cat: Audio, desc: "Music/音乐"} + - {id: 410, cat: PC/Games, desc: "Games/游戏"} + - {id: 411, cat: Books, desc: "Books/文档"} + - {id: 409, cat: Other, desc: "Misc/其他"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: 2facode + type: text + label: 2FA code + - name: info_2fa + type: info + label: "About 2FA code" + default: "Only fill in the 2FA code box if you have enabled 2FA on the HDtime Web Site. Otherwise just leave it empty." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: takelogin.php + method: post + inputs: + secret: "" + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + two_step_code: "{{ .Config.2facode }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("失败")) + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl + search_area: "{{ if .Query.IMDBID }}4{{ else }}{{ end }}{{ if .Query.DoubanID }}1{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }}{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(a[href^="download.php?id="]) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: img[data-src] + attribute: data-src + imdbid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="imdb.com/title/tt"] + attribute: href + doubanid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="movie.douban.com/subject/"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-child(5) + seeders: + selector: td.rowfollow:nth-child(6) + leechers: + selector: td.rowfollow:nth-child(7) + grabs: + selector: td.rowfollow:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumratio: + text: 0.81 + description: + selector: td.rowfollow:nth-child(2) + remove: a, b, font, img, span +# NexusPHP v1.8.5 2023-07-15 diff --git a/config/prowlarr/Definitions/hdtorrentsit.yml b/config/prowlarr/Definitions/hdtorrentsit.yml new file mode 100644 index 0000000..467b208 --- /dev/null +++ b/config/prowlarr/Definitions/hdtorrentsit.yml @@ -0,0 +1,173 @@ +--- +id: hdtorrentsit +name: HDTorrents.it +description: "HDTorrents.it is an ITALIAN Private site for TV / MOVIES" +language: it-IT +type: private +encoding: UTF-8 +links: + - https://hdtorrents.eu/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Movies"} + - {id: 2, cat: TV, desc: "TV Series"} + - {id: 3, cat: Audio, desc: "Music"} + - {id: 4, cat: Console, desc: "Game"} + - {id: 5, cat: PC, desc: "Application"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + music-search: [q] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your HDTorrents.it account My Settings page and clicking on the API Key tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + inputs: {} # TODO: remove in v10 + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: "/api/torrents/filter" + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + # if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6 + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + seasonNumber: "{{ .Query.Season }}" + episodeNumber: "{{ .Query.Ep }}" + imdbId: "{{ .Query.IMDBIDShort }}" + tmdbId: "{{ .Query.TMDBID }}" + tvdbId: "{{ .Query.TVDBID }}" + "free[]": "{{ if .Config.freeleech }}100{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + - name: re_replace # S01 to Stagione 1 + args: ["(?i)\\bS0*(\\d+)\\b", "Stagione $1"] + + rows: + selector: data + attribute: attributes + + fields: + category: + selector: category_id + title: + selector: name + filters: + - name: re_replace + args: ["\\.", " "] + - name: re_replace # Stagione X --> S0X + args: ["(?i)\\bStagion[ei]\\s?(\\d{1})\\b|\\bSeason'?s?\\s?(\\d{1})\\b", "S0$1$2"] + - name: re_replace # Stagione XX --> SXX + args: ["(?i)\\bStagion[ei]\\s?(\\d{2,})\\b|\\bSeason'?s?\\s?(\\d{2,})\\b", "S$1$2"] + details: + selector: details_link + download: + selector: download_link + infohash: + selector: info_hash + poster: + selector: meta.poster + filters: + - name: replace + args: ["https://via.placeholder.com/90x135", ""] + imdbid: + selector: imdb_id + tmdbid: + selector: tmdb_id + tvdbid: + selector: tvdb_id + genre: + selector: meta.genres + filters: + - name: re_replace + args: ["(?i)(Science Fiction)", "Science_Fiction"] + - name: re_replace + args: ["(?i)(TV Movie)", "TV_Movie"] + - name: replace + args: [" & ", "_&_"] + description: + text: "{{ .Result.genre }}" + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0%, 25%, 50%, 75%, 100% + selector: freeleech + case: + 0%: 1 # not free + 25%: 0.75 + 50%: 0.5 + 75%: 0.25 + 100%: 0 # freeleech + "*": 0 # catch errors + uploadvolumefactor: + # api returns False, True + selector: double_upload + case: + False: 1 # normal + True: 2 # double +# as a pay site there is no MR or MST +# json UNIT3D 7.1.3 diff --git a/config/prowlarr/Definitions/hdturk.yml b/config/prowlarr/Definitions/hdturk.yml new file mode 100644 index 0000000..4e0c948 --- /dev/null +++ b/config/prowlarr/Definitions/hdturk.yml @@ -0,0 +1,190 @@ +--- +id: hdturk +name: HDTurk +description: "HDTurk is a TURKISH Private Torrent Tracker for MOVIES / TV / GENERAL" +language: tr-TR +type: private +encoding: UTF-8 +links: + - https://hdturk.club/ +legacylinks: + - http://hdturk.de/ + - https://hdturk.de/ + +caps: + categorymappings: + - {id: 37, cat: Other, desc: "Diğer"} + - {id: 210, cat: Books/EBook, desc: "E-Kitap"} + - {id: 208, cat: Other, desc: "Eğitim"} + - {id: 101, cat: Other, desc: "Resim"} + - {id: 15, cat: TV, desc: "TV Dizi/Show/Spor"} + - {id: 18, cat: TV, desc: "TV Dublaj"} + - {id: 81, cat: TV, desc: "TV Show"} + - {id: 207, cat: TV/Sport, desc: "TV Spor"} + - {id: 17, cat: TV, desc: "TV Yabancı"} + - {id: 16, cat: TV, desc: "TV Yerli"} + - {id: 19, cat: TV/HD, desc: "TV Yerli HD"} + - {id: 170, cat: Movies/HD, desc: "Movies HD"} + - {id: 175, cat: Movies/HD, desc: "Movies 1080p Remux DUAL"} + - {id: 226, cat: Movies/HD, desc: "Movies 1080p Remux TR"} + - {id: 183, cat: Movies/HD, desc: "Movies 1080p Remux Yabancı"} + - {id: 174, cat: Movies/3D, desc: "Movies 3D DUAL"} + - {id: 180, cat: Movies/3D, desc: "Movies 3D TR"} + - {id: 181, cat: Movies/3D, desc: "Movies 3D Yabancı"} + - {id: 217, cat: Movies/UHD, desc: "Movies 4K DUAL"} + - {id: 224, cat: Movies/UHD, desc: "Movies 4K Remux DUAL"} + - {id: 225, cat: Movies/UHD, desc: "Movies 4K Remux Yabanci"} + - {id: 218, cat: Movies/UHD, desc: "Movies 4K TR"} + - {id: 216, cat: Movies/UHD, desc: "Movies 4K Yabancı"} + - {id: 205, cat: Movies/DVD, desc: "Movies DVD DUAL"} + - {id: 206, cat: Movies/DVD, desc: "Movies DVD TR/Yerli"} + - {id: 219, cat: Movies/DVD, desc: "Movies DVD Yabancı"} + - {id: 173, cat: Movies/BluRay, desc: "Movies Full BD"} + - {id: 171, cat: Movies/HD, desc: "Movies x264 DUAL"} + - {id: 176, cat: Movies/HD, desc: "Movies x264 TR"} + - {id: 177, cat: Movies/HD, desc: "Movies x264 Yabancı"} + - {id: 172, cat: Movies/HD, desc: "Movies x265 DUAL"} + - {id: 178, cat: Movies/HD, desc: "Movies x265 TR"} + - {id: 179, cat: Movies/HD, desc: "Movies x265 Yabancı"} + - {id: 198, cat: Movies/HD, desc: "Movies XviD DUAL"} + - {id: 200, cat: Movies/HD, desc: "Movies XviD TR"} + - {id: 202, cat: Movies/HD, desc: "Movies XviD Yabancı"} + - {id: 33, cat: Audio, desc: "MÜZİK"} + - {id: 34, cat: Audio, desc: "MÜZİK Albüm"} + - {id: 35, cat: Audio, desc: "MÜZİK Diskografi"} + - {id: 98, cat: Audio, desc: "MÜZİK Single"} + - {id: 36, cat: Audio/Video, desc: "MÜZİK Video"} + - {id: 56, cat: Console, desc: "OYUN"} + - {id: 59, cat: Console, desc: "Konsol"} + - {id: 58, cat: PC/Mobile-Android, desc: "Mobil/PDA"} + - {id: 57, cat: PC/Games, desc: "PC"} + - {id: 52, cat: PC, desc: "PROGRAM"} + - {id: 55, cat: PC/Mobile-Android, desc: "Android"} + - {id: 223, cat: PC, desc: "Linux"} + - {id: 54, cat: PC/Mac, desc: "macOS"} + - {id: 53, cat: PC/0day, desc: "Windows"} + - {id: 182, cat: Movies/SD, desc: "SD"} + - {id: 191, cat: Movies/SD, desc: "x264 DUAL"} + - {id: 192, cat: Movies/SD, desc: "x264 TR"} + - {id: 193, cat: Movies/SD, desc: "x264 Yabancı"} + - {id: 194, cat: Movies/SD, desc: "x265 DUAL"} + - {id: 195, cat: Movies/SD, desc: "x265 TR"} + - {id: 196, cat: Movies/SD, desc: "x265 Yabancı"} + - {id: 201, cat: Movies/SD, desc: "XviD DUAL"} + - {id: 197, cat: Movies/SD, desc: "XviD TR"} + - {id: 199, cat: Movies/SD, desc: "XviD Yabancı"} + - {id: 221, cat: Other, desc: "VIP"} + - {id: 85, cat: XXX, desc: "XXX"} + - {id: 92, cat: XXX/Other, desc: "XXX E-Magazin"} + - {id: 220, cat: XXX/Other, desc: "XXX Hentai"} + - {id: 93, cat: XXX, desc: "XXX Movie"} + - {id: 95, cat: XXX/Pack, desc: "XXX Packs"} + - {id: 96, cat: XXX/ImageSet, desc: "XXX Pics"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: index.php + selector: a[href*="/logout.php?logouthash="] + +download: + before: + path: takethanks.php + method: post + inputs: + torrentid: "{{ .DownloadUri.Query.id }}" + selectors: + - selector: a[href*="download.php?id="] + attribute: href + +search: + paths: + - path: browse.php + keywordsfilters: + - name: re_replace # E01 to BL01 + args: ["(?i)\\bE(\\d+)\\b", "E$1"] + inputs: + # does not support multi categories so defaulting to ALL + do: search + keywords: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + category: 0 + # t_name, t_description, t_both, t_uploader, t_genre + search_type: "{{ if .Query.IMDBID }}t_genre{{ else }}t_name{{ end }}" + include_dead_torrents: yes + # does not return imdb link in results + + rows: + selector: "table#sortabletable tbody tr:has(div[id^=\"port-target-\"]){{ if .Config.freeleech }}:has(img[src$=\"/freedownload.gif\"]){{ else }}{{ end }}" + + fields: + title: + selector: div[id^="port-target-"] a + filters: + - name: re_replace # BL01 to E01 + args: ["(?i)\\bBL(\\d+)\\b", " E$1 "] + details: + selector: div[id^="port-target-"] a + attribute: href + category: + selector: a[href*="browse.php?category="] + attribute: href + filters: + - name: querystring + args: category + poster: + selector: div[id^="port-content-"] img + attribute: src + date: + selector: td:nth-child(2) > div:nth-last-child(1) + # auto adjusted by site account profile + filters: + - name: dateparse + args: "dd-MM-yyyy HH:mm" + download: + selector: div[id^="port-target-"] a + attribute: href + size: + selector: td:nth-child(5) + grabs: + selector: td:nth-child(6) + seeders: + selector: td:nth-child(7) + leechers: + selector: td:nth-child(8) + downloadvolumefactor: + case: + img[src$="/freedownload.gif"]: 0 + img[src$="/silverdownload.gif"]: 0.5 + "*": 1 + uploadvolumefactor: + case: + img[src$="/x2.gif"]: 2 + "*": 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 3.75days (as seconds = 3.75 x 24 x 60 x 60) + text: 324000 +# TS Special Edition v.7.5 diff --git a/config/prowlarr/Definitions/hdu.yml b/config/prowlarr/Definitions/hdu.yml new file mode 100644 index 0000000..43ea1b5 --- /dev/null +++ b/config/prowlarr/Definitions/hdu.yml @@ -0,0 +1,175 @@ +--- +id: hdu +name: HDU +description: "HDU is a CHINESE Private Torrent Tracker for HD MOVIES / TV / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://pt.upxin.net/ +legacylinks: + - http://pt.upxin.net/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "Movies/电影"} + - {id: 402, cat: TV, desc: "TV Series/电视剧"} + - {id: 403, cat: TV, desc: "TV Shows/综艺"} + - {id: 404, cat: TV/Documentary, desc: "Documentaries/纪录片"} + - {id: 405, cat: TV/Anime, desc: "Animations/动画"} + - {id: 406, cat: Audio/Video, desc: "Music Videos/音乐 MV"} + - {id: 407, cat: TV/Sport, desc: "Sports/体育"} + - {id: 408, cat: Audio, desc: "HQ Audio/无损音乐"} + - {id: 411, cat: Other, desc: "Misc/其他"} + - {id: 410, cat: PC/Games, desc: "Games/游戏"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("失败")) + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # 0=incldead, 1=active, 2=dead + incldead: 0 + # show promotions: 0=all, 1=normal, 2=free, 3=2x, 4=2xFree, 5=50%, 6=2x50%, 7=30%, 8 all promotions + spstate: "{{ if .Config.freeleech }}8{{ else }}0{{ end }}" + # 0=title, 1=descr, 3=uploader, 4=imdb URL + search_area: "{{ if .Query.IMDBID }}4{{ else }}0{{ end }}" + # 0=AND, 1=OR, 2=Exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-child(5) + seeders: + selector: td.rowfollow:nth-child(6) + leechers: + selector: td.rowfollow:nth-child(7) + grabs: + selector: td.rowfollow:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 3 days (as seconds = 3 x 24 x 60 x 60) + text: 259200 + description: + selector: td.rowfollow:nth-child(2) + remove: a, b, font, img, span +# NexusPHP Standard v1.5 Beta 4 diff --git a/config/prowlarr/Definitions/hdvbits.yml b/config/prowlarr/Definitions/hdvbits.yml new file mode 100644 index 0000000..9b8dded --- /dev/null +++ b/config/prowlarr/Definitions/hdvbits.yml @@ -0,0 +1,193 @@ +--- +id: hdvbits +name: hdvbits +description: "hdvbits is a CHINESE Private torrent tracker for MOVIES / TV / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://hdvbits.com/ + +caps: + categorymappings: + - {id: 406, cat: Audio, desc: "HQ Audio/音轨"} + - {id: 408, cat: Audio, desc: "music/音乐"} + - {id: 407, cat: TV/Sport, desc: "Sports/体育"} + - {id: 404, cat: TV/Documentary, desc: "Documentaries/纪录片"} + - {id: 403, cat: TV, desc: "TV Shows/综艺"} + - {id: 405, cat: TV/Anime, desc: "Anime/动漫"} + - {id: 402, cat: TV, desc: "TV Series/电视剧"} + - {id: 401, cat: Movies, desc: "Movies/电影"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: 2facode + type: text + label: 2FA code + - name: info_2fa + type: info + label: "About 2FA code" + default: "Only fill in the 2FA code box if you have enabled 2FA on the hdvbits Web Site. Otherwise just leave it empty." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + secret: "" + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + two_step_code: "{{ .Config.2facode }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("失败")) + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl + search_area: "{{ if .Query.IMDBID }}4{{ else }}{{ end }}{{ if .Query.DoubanID }}1{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }}{{ else }}0{{ end }}" + # 0 AND, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + imdbid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="imdb.com/title/tt"] + attribute: href + doubanid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="movie.douban.com/subject/"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-child(5) + seeders: + selector: td.rowfollow:nth-child(6) + leechers: + selector: td.rowfollow:nth-child(7) + grabs: + selector: td.rowfollow:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + description_verified: + case: + span[title="通过"], span[title="通過"], span[title="Allowed"]: "Verified:" + span[title="未审"], span[title="未審"], span[title="Not reviewed"]: "Unverified:" + span[title="拒绝"], span[title="拒絕"], span[title="Denied"]: "Banned:" + description: + selector: td:nth-child(2) + remove: a, b, font, img, span + filters: + - name: prepend + args: "{{ .Result.description_verified }} " +# NexusPHP v1.8.4 2023-06-18 diff --git a/config/prowlarr/Definitions/hdvideo.yml b/config/prowlarr/Definitions/hdvideo.yml new file mode 100644 index 0000000..4e0bb5e --- /dev/null +++ b/config/prowlarr/Definitions/hdvideo.yml @@ -0,0 +1,193 @@ +--- +id: hdvideo +name: HDVIDEO +description: "HDVIDEO is a CHINESE Private torrent tracker for MOVIES / TV / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://hdvideo.one/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "Movies/电影"} + - {id: 402, cat: TV, desc: "TV Series/电视剧"} + - {id: 403, cat: TV, desc: "TV Shows/综艺"} + - {id: 404, cat: TV/Documentary, desc: "Documentaries/纪录片"} + - {id: 405, cat: TV/Anime, desc: "Anime/动漫"} + - {id: 406, cat: Audio/Video, desc: "Music Videos/演唱会"} + - {id: 407, cat: TV/Sport, desc: "Sports/体育"} + - {id: 408, cat: Audio, desc: "HQ Audio/音乐"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: 2facode + type: text + label: 2FA code + - name: info_2fa + type: info + label: "About 2FA code" + default: "Only fill in the 2FA code box if you have enabled 2FA on the HDVIDEO Web Site. Otherwise just leave it empty." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + secret: "" + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + two_step_code: "{{ .Config.2facode }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("失败")) + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl + search_area: "{{ if .Query.IMDBID }}4{{ else }}{{ end }}{{ if .Query.DoubanID }}1{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }}{{ else }}0{{ end }}" + # 0 AND, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + imdbid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="imdb.com/title/tt"] + attribute: href + doubanid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="movie.douban.com/subject/"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-child(5) + seeders: + selector: td.rowfollow:nth-child(6) + leechers: + selector: td.rowfollow:nth-child(7) + grabs: + selector: td.rowfollow:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + description_verified: + case: + span[title="通过"], span[title="通過"], span[title="Allowed"]: "Verified:" + span[title="未审"], span[title="未審"], span[title="Not reviewed"]: "Unverified:" + span[title="拒绝"], span[title="拒絕"], span[title="Denied"]: "Banned:" + description: + selector: td:nth-child(2) + remove: a, b, font, img, span + filters: + - name: prepend + args: "{{ .Result.description_verified }} " +# NexusPHP v1.8.4 2023-06-18 diff --git a/config/prowlarr/Definitions/hebits.yml b/config/prowlarr/Definitions/hebits.yml new file mode 100644 index 0000000..7131d05 --- /dev/null +++ b/config/prowlarr/Definitions/hebits.yml @@ -0,0 +1,170 @@ +--- +id: hebits +name: Hebits +description: "The Israeli Tracker" +language: he-IL +type: private +encoding: UTF-8 +links: + - https://hebits.net/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "סרטים (Movies)"} + - {id: 2, cat: TV, desc: "סדרות (TV)"} + - {id: 3, cat: TV/Other, desc: "הצגות והופעות (Theater)"} + - {id: 4, cat: PC/0day, desc: "תוכנות (Apps)"} + - {id: 5, cat: PC/Games, desc: "משחקים (Games)"} + - {id: 6, cat: Audio, desc: "מוזיקה (Music)"} + - {id: 7, cat: Books, desc: "ספרים (Books)"} + - {id: 8, cat: Movies/Other, desc: "חבילות סרטים (Movies Packs)"} + - {id: 9, cat: XXX, desc: "פורנו (Porn)"} + - {id: 10, cat: Other, desc: "שונות (Other)"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: time + options: + time: created + seeders: seeders + size: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: / + selector: a[href*="/logout.php?auth="] + +search: + paths: + - path: ajax.php + response: + type: json + + inputs: + searchstr: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + order_by: "{{ .Config.sort }}" + order_way: "{{ .Config.type }}" + imdbgt: 0 + imdblt: 10 + # 1 freeleech, 2 neutral, 3 50%, 4 2x, 5 3x, 9 75%, 11 only perks, 0 normal + freetorrent: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + action: browse + $raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}" + + rows: + selector: response.results + attribute: torrents + multiple: true + + fields: + _id: + selector: torrentId + category: + selector: ..categoryID + title_notenglish: + selector: release:not(:contains("a")):not(:contains("e")):not(:contains("i")):not(:contains("o")):not(:contains("u")):not(:contains("y")) + optional: true + filters: + # space out the book language at the end of the title + # everything within the outermost quotes below is right to left + - name: re_replace + args: ["(אנגלית)$", " - אנגלית"] # English + - name: re_replace + args: ["(עברית)$", " - עברית"] # Hebrew + title_english: + selector: release + optional: true + filters: + - name: append + args: "א" # catch English only results + - name: regexp + args: "(.+?[a-zA-Z0-9\\]\\)\\}])[א-ת].*" # remove Hebrew labels from end of title, account for titles ending in letters, numbers, and brackets + title: + text: "{{ if .Result.title_notenglish }}{{ .Result.title_notenglish }}{{ else }}{{ .Result.title_english }}{{ end }}" + details: + text: "/torrents.php?torrentid={{ .Result._id }}" + download: + text: "/torrents.php?action=download&id={{ .Result._id }}" + poster: + selector: ..cover + imdbid: + selector: ..catalogue + files: + selector: fileCount + date: + selector: time + filters: + - name: append + args: " +02:00" # IST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + size: + selector: size + grabs: + selector: snatches + seeders: + selector: seeders + leechers: + selector: leechers + description: + selector: ..tags + _half: + selector: isHalfFreeleech + _free: + selector: isFreeleech + _x2: + selector: isUploadX2 + _x3: + selector: isUploadX3 + _quarter: + selector: isQuarterLeech + _neutral: + selector: isNeutralLeech + _personal: + selector: isPersonalFreeleech + downloadvolumefactor_special: + optional: true + text: "{{ if eq .Result._half \"True\" }}0.5{{ else }}{{ end }}{{ if eq .Result._quarter \"True\" }}0.25{{ else }}{{ end }}{{ if eq .Result._neutral \"True\" }}0{{ else }}{{ end }}{{ if eq .Result._free \"True\" }}0{{ else }}{{ end }}{{ if eq .Result._personal \"True\" }}0{{ else }}{{ end }}" + downloadvolumefactor: + text: "{{ if .Result.downloadvolumefactor_special }}{{ .Result.downloadvolumefactor_special }}{{ else }}1{{ end }}" + uploadvolumefactor_special: + optional: true + text: "{{ if eq .Result._x3 \"True\" }}3{{ else }}{{ end }}{{ if eq .Result._x2 \"True\" }}2{{ else }}{{ end }}{{ if eq .Result._neutral \"True\" }}0{{ else }}{{ end }}" + uploadvolumefactor: + text: "{{ if .Result.uploadvolumefactor_special }}{{ .Result.uploadvolumefactor_special }}{{ else }}1{{ end }}" + minimumratio: + text: 1.0 + minimumseedtime: + # 7 days (as seconds = 7 x 24 x 60 x 60) + text: 604800 +# JSON Gazelle diff --git a/config/prowlarr/Definitions/hellashut.yml b/config/prowlarr/Definitions/hellashut.yml new file mode 100644 index 0000000..d97e641 --- /dev/null +++ b/config/prowlarr/Definitions/hellashut.yml @@ -0,0 +1,204 @@ +--- +id: hellashut +name: HellasHut +description: "HellasHut is a GREEK Private Torrent Tracker for MOVIES / TV / GENERAL" +language: el-GR +type: private +encoding: UTF-8 +testlinktorrent: false +links: + - https://hellashut.net/ +legacylinks: + - https://hellashut.de/ + +caps: + categorymappings: + - {id: 28, cat: TV/Anime, desc: "Anime/Cartoon HD"} + - {id: 47, cat: TV/Anime, desc: "Anime/Cartoon HDTV"} + - {id: 48, cat: TV/Anime, desc: "Anime/Cartoon SD"} + - {id: 50, cat: TV/Anime, desc: "Anime/Cartoon SD Emb"} + - {id: 51, cat: TV/Anime, desc: "Anime/Cartoon TV"} + - {id: 77, cat: PC, desc: "Applications DOS"} + - {id: 20, cat: PC, desc: "Applications Linux"} + - {id: 19, cat: PC/Mac, desc: "Applications MAC"} + - {id: 68, cat: PC, desc: "Applications OS2 WARP"} + - {id: 21, cat: PC, desc: "Applications Other"} + - {id: 18, cat: PC/0day, desc: "Applications Windows"} + - {id: 52, cat: Books, desc: "Books/Magazines All"} + - {id: 9, cat: TV/Documentary, desc: "Documentaries All"} + - {id: 53, cat: TV/Documentary, desc: "Documentaries Greek"} + - {id: 54, cat: TV/Documentary, desc: "Documentaries HD"} + - {id: 55, cat: Movies/DVD, desc: "DVD-R All"} + - {id: 17, cat: Console/Other, desc: "Games Other"} + - {id: 11, cat: Console/PS4, desc: "Games PSX"} + - {id: 10, cat: PC/Games, desc: "Games Windows"} + - {id: 13, cat: Console/XBox, desc: "Games Xbox"} + - {id: 56, cat: Other, desc: "Miscellaneous All"} + - {id: 57, cat: PC/Mobile-Other, desc: "Mobile All"} + - {id: 1, cat: Movies/3D, desc: "Movies 3D"} + - {id: 2, cat: Movies/UHD, desc: "Movies 4K"} + - {id: 42, cat: Movies/BluRay, desc: "Movies BluRay"} + - {id: 58, cat: Movies/DVD, desc: "Movies DVD"} + - {id: 4, cat: Movies/HD, desc: "Movies HD"} + - {id: 69, cat: Movies/HD, desc: "Movies HD Packs"} + - {id: 3, cat: Movies/SD, desc: "Movies SD"} + - {id: 67, cat: Movies/SD, desc: "Movies SD Packs"} + - {id: 71, cat: Audio, desc: "Music CDA"} + - {id: 59, cat: Audio, desc: "Music Discographies"} + - {id: 23, cat: Audio/Lossless, desc: "Music FLAC"} + - {id: 22, cat: Audio/MP3, desc: "Music MP3"} + - {id: 25, cat: Audio/Video, desc: "Music Video"} + - {id: 75, cat: Movies/HD, desc: "NO IN SUBS Movies HD"} + - {id: 76, cat: Movies/UHD, desc: "NO SUBS IN Movies 4K"} + - {id: 35, cat: TV/Sport, desc: "Sports HD"} + - {id: 34, cat: TV/Sport, desc: "Sports SD"} + - {id: 5, cat: TV, desc: "TV Greek Movies"} + - {id: 6, cat: TV, desc: "TV Greek Series"} + - {id: 7, cat: TV, desc: "TV Greek Series Packs"} + - {id: 60, cat: TV, desc: "TV Greek Shows"} + - {id: 41, cat: TV/HD, desc: "TV HD"} + - {id: 61, cat: TV, desc: "TV Series"} + - {id: 62, cat: TV, desc: "TV Series Emb"} + - {id: 63, cat: TV, desc: "TV Series Emb Packs"} + - {id: 64, cat: TV/HD, desc: "TV Series HD"} + - {id: 65, cat: TV/HD, desc: "TV Series HD Packs"} + - {id: 66, cat: TV, desc: "TV Series Packs"} + - {id: 73, cat: Movies/BluRay, desc: "UNTOUCHED BluRay"} + - {id: 72, cat: Movies/DVD, desc: "UNTOUCHED DVD"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: id + options: + id: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: account-login.php + method: form + form: form[action="account-login.php"] + captcha: + type: image + selector: img[src="captcha.php?ext=.gif"] + input: input[type="text"][size="6"] + inputs: + input[name="username"]: "{{ .Config.username }}" + input[name="password"]: "{{ .Config.password }}" + selectors: true + error: + - selector: td.embedded:contains("Access Denied") + test: + path: / + selector: a[href="account-logout.php"] + +download: + selectors: + - selector: a[href^="download.php?id="], a[href^="magnet:?xt="] + attribute: href + +search: + paths: + # https://hellashut.de/torrents-search.php?c52=1&search=&cat=0&incldead=1&advanced=1&lang=0&blah=0&freeleech=0&sort=id&order=desc + - path: torrents-search.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # 0 active, 1 incldead, 2 onlydead + incldead: 1 + # 0 all, 1 notfree, 2 onlyfree + freeleech: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 all, 1 English, 2 French, 3 German, 4 Italian, 5 Japanese, 6 Spanish, 7 Russian, 8 Greek + lang: 0 + # 0 name, 1 descr, 2 uploader + blah: "{{ if .Query.IMDBID }}1{{ else }}0{{ end }}" + # 0 all + team: 0 + sort: "{{ .Config.sort }}" + order: "{{ .Config.type }}" + # does not return imdb link in results + + rows: + selector: table.ttable_headinner tr.t-row + + fields: + category: + selector: a[href*="cat="] + attribute: href + optional: true + default: 56 + filters: + - name: querystring + args: cat + title: + selector: a[href^="torrents-details.php?id="] + attribute: title + details: + selector: a[href^="torrents-details.php?id="] + attribute: href + filters: + - name: replace + args: ["&hit=1", ""] # avoid redirect + download: + selector: a[href^="torrents-details.php?id="] + attribute: href + filters: + - name: replace + args: ["&hit=1", ""] # avoid redirect + size: + selector: td:nth-last-child(7) + date: + selector: td:nth-last-child(6) + # auto adjusted by site account profile + filters: + - name: dateparse + args: "dd-MM-yyyy HH:mm:ss" + grabs: + selector: td:nth-last-child(5) + seeders: + selector: td:nth-last-child(4) + leechers: + selector: td:nth-last-child(3) + description: + case: + img[src="pic/tick.png"]: Verified + img[src="pic/unchecked.png"]: Unverified + downloadvolumefactor: + case: + img[src="pic/freedownload.gif"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 10 day (as seconds = 10 x 24 x 60 x 60) + text: 864000 +# TorrentTrader v2-svn diff --git a/config/prowlarr/Definitions/helltorrents.yml b/config/prowlarr/Definitions/helltorrents.yml new file mode 100644 index 0000000..a6c3280 --- /dev/null +++ b/config/prowlarr/Definitions/helltorrents.yml @@ -0,0 +1,188 @@ +--- +id: helltorrents +name: HellTorrents +description: "HellTorrents is a POLISH Semi-Private Torrent Tracker for MOVIES / TV / GENERAL" +language: pl-PL +type: semi-private +encoding: ISO-8859-2 +links: + - https://helltorrents.com/ + +caps: + categorymappings: + # Filmy + - {id: 27, cat: Movies/DVD, desc: "Filmy DVD"} + - {id: 28, cat: Movies/SD, desc: "Filmy VCD/SVCD"} + - {id: 30, cat: Movies/SD, desc: "Filmy DivX/XviD"} + - {id: 31, cat: Movies/HD, desc: "Filmy RMVB"} + - {id: 71, cat: Movies/3D, desc: "Filmy 3D"} + - {id: 72, cat: Movies/BluRay, desc: "Filmy BluRay/HDTV 1080p"} + - {id: 73, cat: Movies/BluRay, desc: "Filmy BluRay/HDTV 720p"} + - {id: 74, cat: Movies/HD, desc: "Filmy x265/h265"} + - {id: 75, cat: Movies/HD, desc: "Filmy x264/h264"} + - {id: 76, cat: Movies/HD, desc: "Filmy HD 1080p AVC"} + - {id: 77, cat: Movies/UHD, desc: "Filmy i Seriale 4K UHD"} + - {id: 78, cat: Movies/SD, desc: "Filmy IVO"} + - {id: 79, cat: Movies/SD, desc: "Filmy TS/CAM/IVO/AUDIO KINO"} + - {id: 82, cat: Movies, desc: "Teatr"} + # Seriale + - {id: 25, cat: TV, desc: "Seriale Polskie"} + - {id: 26, cat: TV/Foreign, desc: "Seriale Zagraniczne"} + # Dla Dzieci + - {id: 32, cat: Movies, desc: "Bajki Pl/Eng"} + # Gry + - {id: 34, cat: PC/Games, desc: "Gry PC"} + - {id: 35, cat: Console/PSP, desc: "PS2/PS3/PS4/PSP"} + - {id: 36, cat: Console/XBox, desc: "Xbox One/XBOX 360/Xbox"} + - {id: 37, cat: Console/NDS, desc: "NINTENDO / WII / DS"} + # Muzyka + - {id: 38, cat: Audio/Foreign, desc: "Muzyka Zagraniczna"} + - {id: 39, cat: Audio, desc: "Soundtracki"} + - {id: 40, cat: Audio/Video, desc: "Teledyski"} + - {id: 80, cat: Audio, desc: "Muzyka Polska"} + - {id: 81, cat: Audio/Video, desc: "Koncerty"} + # GSM/PDA + - {id: 42, cat: PC/Mobile-Other, desc: "Tapety GSM/PDA"} + - {id: 43, cat: PC/Mobile-Other, desc: "Programy GSM/PDA"} + - {id: 44, cat: PC/Mobile-Other, desc: "Filmy GSM/PDA"} + - {id: 45, cat: PC/Mobile-Other, desc: "Dzwonki GSM/PDA"} + - {id: 46, cat: PC/Mobile-Other, desc: "Gry GSM/PDA"} + # Ksiazki + - {id: 47, cat: Books/EBook, desc: "E-Booki"} + - {id: 48, cat: Audio/Audiobook, desc: "Audio-Booki"} + - {id: 49, cat: Books/Mags, desc: "Czasopisma"} + - {id: 50, cat: Books/Comics, desc: "Komiksy"} + # Programy + - {id: 51, cat: PC/0day, desc: "Windows"} + - {id: 52, cat: PC, desc: "Linux"} + - {id: 53, cat: PC/Mac, desc: "Macintosh"} + # Inne + - {id: 54, cat: Other, desc: "Śmieszne"} + - {id: 55, cat: Other, desc: "Tapety"} + - {id: 56, cat: TV/Sport, desc: "Sport"} + - {id: 57, cat: Other, desc: "Pozostale"} + # Erotyka + - {id: 58, cat: XXX/Other, desc: "Czasopisma"} + - {id: 59, cat: XXX/ImageSet, desc: "Zdjęcia "} + - {id: 60, cat: XXX/x264, desc: "Filmy"} + - {id: 61, cat: XXX/Other, desc: "Gry "} + - {id: 63, cat: XXX/Other, desc: "Hentai+18"} + # Anime + - {id: 69, cat: TV/Anime, desc: "Anime Pl"} + - {id: 70, cat: TV/Anime, desc: "Anime"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: multilang + type: checkbox + label: Replace MULTi by another language in release name + default: false + - name: multilanguage + type: select + label: Replace MULTi by this language + default: POLISH + options: + POLISH: POLISH + MULTi POLISH: MULTIi POLISH + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrentów na stronę: (Torrents per page) setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[name="login"] + inputs: + uid: "{{ .Config.username }}" + pwd: "{{ .Config.password }}" + keeplogged: 1 + error: + - selector: font[color="#FF0000"] + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + # https://helltorrents.com/torrents.php?search=2023&category=0&page=0 + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + page: 0 + # does not support sorting results, or imdbid searching, or have imdb in results + + rows: + selector: table.header:has(a[href^="details.php?id="]) + + fields: + categorydesc: + selector: td.pole1 + filters: + - name: regexp + args: "Kategoria: (.+)" + title_phase1: + selector: a[href^="details.php?id="] + title_multilang: + selector: a[href^="details.php?id="] + filters: + - name: re_replace + args: ["(?i)\\b(MULTI(?!.*(?:POLISH|ENGLISH|\\bPL\\b)))\\b", "{{ .Config.multilanguage }}"] + - name: re_replace + args: ["(?i)\\b(pl)\\b", "POLISH"] + title: + text: "{{ if .Config.multilang }}{{ .Result.title_multilang }}{{ else }}{{ .Result.title_phase1 }}{{ end }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href*="download.php?id="], a[href*="piekielny.php"] + attribute: href + poster: + selector: img + attribute: src + date: + selector: td.pole1 + filters: + - name: regexp + args: "Dodano: (\\d{2}/\\d{2}/\\d{4})" + - name: dateparse + args: "dd/MM/yyyy" + size: + selector: td.pole1 + filters: + - name: regexp + args: "Rozmiar: (\\d+\\.\\d+ [T|G|M|K|k]B)" + seeders: + selector: td.pole1 + filters: + - name: regexp + args: "Seedów: (\\d+)" + leechers: + selector: td.pole1 + filters: + - name: regexp + args: "Leecherów: (\\d+)" + grabs: + selector: td.pole1 + filters: + - name: regexp + args: "Ukończone: (\\d+)" + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/hhanclub.yml b/config/prowlarr/Definitions/hhanclub.yml new file mode 100644 index 0000000..9a8f03a --- /dev/null +++ b/config/prowlarr/Definitions/hhanclub.yml @@ -0,0 +1,179 @@ +--- +id: hhanclub +name: HHanClub +description: "HHanClub is a CHINESE Private Torrent Tracker for HD MOVIES / TV" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://hhanclub.top/ + +caps: + categorymappings: + - {id: 408, cat: Audio, desc: "HQ Audio"} + - {id: 409, cat: Other, desc: "其他"} + - {id: 407, cat: TV/Sport, desc: "Sports"} + - {id: 406, cat: Audio/Video, desc: "MV"} + - {id: 403, cat: TV, desc: "综艺"} + - {id: 402, cat: TV, desc: "电视剧"} + - {id: 405, cat: TV/Anime, desc: "动漫"} + - {id: 404, cat: TV/Documentary, desc: "纪录片"} + - {id: 401, cat: Movies, desc: "电影"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: 2facode + type: text + label: 2FA code + - name: info_2fa + type: info + label: "About 2FA code" + default: "Only fill in the 2FA code box if you have enabled 2FA on the HHanClub Web Site. Otherwise just leave it empty." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + secret: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + two_step_code: "{{ .Config.2facode }}" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("失败")) + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat[]{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl + search_area: "{{ if .Query.IMDBID }}4{{ else }}{{ end }}{{ if .Query.DoubanID }}1{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }}{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: div.w-full:has(a[href^="details.php?id="]) + + fields: + category: + selector: a[href^="?cat[]="] + attribute: href + filters: + - name: querystring + args: cat[] + title: + selector: a[href^="details.php?id="] + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + doubanid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="movie.douban.com/subject/"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: div.torrent-info-text:nth-child(2) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: div.torrent-info-text:nth-child(2):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: div.torrent-info-text:nth-child(1) + seeders: + selector: div.torrent-info-text:nth-child(3) + leechers: + selector: div.torrent-info-text:nth-child(4) + grabs: + selector: div.torrent-info-text:nth-child(5) + downloadvolumefactor: + case: + span.promotion-tag-free: 0 + span.promotion-tag-free2up: 0 + span.promotion-tag-50pctdown: 0.5 + span.promotion-tag-50pctdown2up: 0.5 + span.promotion-tag-30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + span.promotion-tag-50pctdown2up: 2 + span.promotion-tag-free2up: 2 + span.promotion-tag-2up: 2 + "*": 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 1 day (as seconds = 24 x 60 x 60) + text: 86400 + description: + selector: div.torrent-title > div > div +# NexusPHP v1.8.6 2023-08-15 (customised) diff --git a/config/prowlarr/Definitions/homeporntorrents.yml b/config/prowlarr/Definitions/homeporntorrents.yml new file mode 100644 index 0000000..8dce23c --- /dev/null +++ b/config/prowlarr/Definitions/homeporntorrents.yml @@ -0,0 +1,150 @@ +--- +id: homeporntorrents +name: HomePornTorrents +description: "HomePornTorrents (HPT) is a Private Torrent Tracker for Amateur 3X" +language: en-US +type: private +encoding: UTF-8 +links: + - https://www.homeporntorrents.club/ + +caps: + categorymappings: + - {id: 1, cat: XXX, desc: "Anal"} + - {id: 3, cat: XXX, desc: "Asian"} + - {id: 4, cat: XXX, desc: "BBW"} + - {id: 2, cat: XXX, desc: "BDSM"} + - {id: 31, cat: XXX, desc: "Big Boobs"} + - {id: 5, cat: XXX, desc: "Black"} + - {id: 7, cat: XXX, desc: "Creampie"} + - {id: 8, cat: XXX, desc: "Cumshot"} + - {id: 9, cat: XXX, desc: "Fetish"} + - {id: 32, cat: XXX, desc: "Fisting"} + - {id: 10, cat: XXX, desc: "Gangbang"} + - {id: 11, cat: XXX, desc: "Gay"} + - {id: 25, cat: XXX, desc: "Hardcore"} + - {id: 12, cat: XXX, desc: "Interracial"} + - {id: 13, cat: XXX, desc: "Latina"} + - {id: 14, cat: XXX, desc: "Lesbian"} + - {id: 26, cat: XXX, desc: "Masturbation"} + - {id: 15, cat: XXX, desc: "Mature"} + - {id: 16, cat: XXX, desc: "Oral"} + - {id: 19, cat: XXX, desc: "Other"} + - {id: 24, cat: XXX, desc: "Pictures"} + - {id: 27, cat: XXX, desc: "Pissing"} + - {id: 21, cat: XXX, desc: "Pregnant"} + - {id: 28, cat: XXX, desc: "Softcore"} + - {id: 22, cat: XXX, desc: "Squirt"} + - {id: 18, cat: XXX, desc: "Teen (18+)"} + - {id: 17, cat: XXX, desc: "Transsexual"} + - {id: 30, cat: XXX, desc: "VIP"} + - {id: 23, cat: XXX, desc: "Voyeur"} + - {id: 29, cat: XXX, desc: "Webcam"} + + modes: + search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page setting to 100 on your User Settings. The default is 25. + +login: + path: login.php + method: form + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + keeplogged: 1 + error: + - selector: form#loginform > span.warning + test: + path: index.php + selector: "#nav_useredit" + +search: + paths: + # https://www.homeporntorrents.club/torrents.php?order_by=time&order_way=desc&filter_freeleech=1&searchtext=&search_type=0&taglist=&tags_type=0 + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}" + searchtext: "" + title: "{{ .Keywords }}" + order_by: time + order_way: desc + action: advanced + filter_freeleech: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + filelist: "" + taglist: "" + + rows: + # exclude redbar torrents + selector: table#torrent_table > tbody > tr[class^="torrent row"] + + fields: + category: + selector: a[href*="filter_cat"] + attribute: href + filters: + - name: regexp + args: \[(\d+?)\] + title: + selector: a[href^="torrents.php?id="] + details: + selector: a[href^="torrents.php?id="] + attribute: href + download: + selector: a[href^="torrents.php?action=download&id="] + attribute: href + description: + selector: div.tags + poster: + # src=https:\/\/fapping.empornium.sx\/images\/2023\/05\/30\/MrLuckyPOV2023AlexisFawxXXX720pHEVCx265PRTmp4snapshot0950.jpg> + selector: td:nth-child(2) > script + filters: + - name: regexp + args: "src=(.*?)>" + - name: re_replace + args: ["\\\\(.)", "$1"] + - name: replace + args: ["/static/common/noartwork/noimage.png", ""] + files: + selector: td:nth-child(3) + date: + selector: td:nth-child(5) > span + attribute: title + filters: + # auto adjusted by site account profile + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MMM dd yyyy, HH:mm zzz" + size: + selector: td:nth-child(6) + grabs: + selector: td:nth-child(7) + seeders: + selector: td:nth-child(8) + leechers: + selector: td:nth-child(9) + downloadvolumefactor: + case: + span.icon[title*="Freeleech"]: 0 + img[alt="Freeleech"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 0.7 +# Project Gazelle diff --git a/config/prowlarr/Definitions/houseofdevil.yml b/config/prowlarr/Definitions/houseofdevil.yml new file mode 100644 index 0000000..71810d7 --- /dev/null +++ b/config/prowlarr/Definitions/houseofdevil.yml @@ -0,0 +1,176 @@ +--- +id: houseofdevil +name: House of Devil +description: "House of Devil is a GERMAN Private Torrent Tracker for MOVIES / TV / GENERAL" +language: de-DE +type: private +encoding: UTF-8 +links: + - https://h-o-d.org/ + +caps: + categorymappings: + - {id: 117, cat: TV, desc: "Allgemein - Serien"} + - {id: 119, cat: Other, desc: "Bilder"} + - {id: 120, cat: Books, desc: "EBook"} + - {id: 138, cat: Movies/3D, desc: "Filme - 3D"} + - {id: 101, cat: TV/Anime, desc: "Filme - Animie"} + - {id: 102, cat: Movies/BluRay, desc: "Filme - Bluray"} + - {id: 131, cat: Movies/Other, desc: "Filme - Bollywood"} + - {id: 103, cat: Movies/DVD, desc: "Filme - DVD"} + - {id: 104, cat: Movies/DVD, desc: "Filme - DVD-R"} + - {id: 135, cat: Movies/HD, desc: "Filme - HD"} + - {id: 132, cat: Movies/DVD, desc: "Filme - HD2DVD"} + - {id: 130, cat: Movies, desc: "Filme - Klassiker"} + - {id: 134, cat: Movies/SD, desc: "Filme - SD"} + - {id: 136, cat: Movies/UHD, desc: "Filme - UHD"} + - {id: 105, cat: Movies/HD, desc: "Filme - x264"} + - {id: 106, cat: Movies/SD, desc: "Filme - XviD / DivX"} + - {id: 127, cat: Movies, desc: "Fuer Unsere Kleinsten"} + - {id: 121, cat: PC/Mobile-Other, desc: "Handy-Stuff"} + - {id: 124, cat: Audio, desc: "Musik - Alben"} + - {id: 141, cat: Audio, desc: "Musik - Diskografie"} + - {id: 122, cat: Audio/Audiobook, desc: "Musik - Hoerbuch"} + - {id: 123, cat: Audio, desc: "Musik - Mixe"} + - {id: 133, cat: Audio/MP3, desc: "Musik - MP3"} + - {id: 125, cat: Audio/Video, desc: "Musik - Video"} + - {id: 113, cat: PC, desc: "Programme - Linux"} + - {id: 114, cat: PC/Mac, desc: "Programme - Mac"} + - {id: 115, cat: PC/0day, desc: "Programme - Windows"} + - {id: 116, cat: TV/Documentary, desc: "Serien - Dokus"} + - {id: 118, cat: TV/Sport, desc: "Serien - Sport"} + - {id: 129, cat: Other, desc: "Sonstiges"} + - {id: 109, cat: PC/Mobile-Other, desc: "Spiele - Handy"} + - {id: 112, cat: Console, desc: "Spiele - Konsolen"} + - {id: 111, cat: PC/Games, desc: "Spiele - Mac / Linux"} + - {id: 110, cat: PC/Games, desc: "Spiele - PC"} + - {id: 137, cat: Console/Other, desc: "Wimmelspiele"} + - {id: 69, cat: XXX, desc: "XXX"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: pin + type: text + label: Pin + - name: onlyupload + type: checkbox + label: Filter OnlyUpload only + default: false + - name: info_free + type: info + label: About OnlyUpload at H-O-D + default: "
  • OnlyUpload are torrents where download is not counted but upload is. Good for building your Ratio up. (On the Prowlarr search results page these are tagged as Freeleech).
" + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeds: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents pro Seite: setting to 100 on your Control Panel. The default is 15. + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + pin: "{{ .Config.pin }}" + error: + - selector: .tablea:contains("Fehler") + test: + path: / + selector: a[href="logout.php"] + +search: + # https://h-o-d.org/browse.php?showsearch=1&c117=1&c116=1&c118=1&search=&incldead=1&orderby=added&sort=desc + path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + showsearch: 1 + search: "{{ .Keywords }}" + # 0 active, 1 all, 2 dead + incldead: 1 + orderby: "{{ .Config.sort }}" + sort: "{{ .Config.type }}" + # site does not support imdbid search from the browse.php page or return imdb links in results + + rows: + selector: "table.tableinborder[cellspacing=\"1\"][cellpadding=\"0\"]:not(:has(a[href=\"index.php\"])) > tbody > tr:has(a[href^=\"download.php\"]){{ if .Config.onlyupload }}:has(img[src=\"/pic/free.gif\"]){{ else }}{{ end }}" + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php"] + details: + selector: a[href^="details.php"] + attribute: href + download: + selector: a[href^="download.php"] + attribute: href + poster: + selector: a[href^="details.php"] + attribute: onMouseOver + filters: + - name: regexp + args: "src=(.*?) width" + size: + selector: td.tablea table tbody tr:nth-child(2) td:nth-child(1) b:nth-child(1) + files: + selector: td.tablea table tbody tr:nth-child(2) td:nth-child(1) b:nth-child(2) + seeders: + selector: td.tablea table tbody tr:nth-child(2) td:nth-child(2) b:nth-child(1) + leechers: + selector: td.tablea table tbody tr:nth-child(2) td:nth-child(2) > b:nth-of-type(2) + grabs: + selector: td.tablea table tbody tr:nth-child(2) td:nth-child(3) b:nth-child(1) + date: + selector: td.tablea table tbody tr:nth-child(2) td:nth-child(5) + filters: + - name: append + args: " +01:00" # CET + - name: replace + args: ["\xA0", " "] + - name: dateparse + args: "dd.MM.yyyy HH:mm:ss zzz" + downloadvolumefactor: + case: + img[src="/pic/free.gif"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 0.8 + minimumseedtime: + # 5 days (as seconds = 5 x 24 x 60 x 60) + text: 432000 +# engine n/a diff --git a/config/prowlarr/Definitions/hqmusic.yml b/config/prowlarr/Definitions/hqmusic.yml new file mode 100644 index 0000000..b7bd304 --- /dev/null +++ b/config/prowlarr/Definitions/hqmusic.yml @@ -0,0 +1,187 @@ +--- +id: hqmusic +name: HQMusic +description: "HQMusic is a Private Torrent Tracker for MUSIC" +language: en-US +type: private +encoding: UTF-8 +links: + - http://hqmusic.info/ + +caps: + categorymappings: + - {id: 1, cat: Audio, desc: "Music"} + + modes: + search: [q] + music-search: [q, album, artist, label, track, year, genre] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: time + options: + time: created + seeders: seeders + size: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: login.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + keeplogged: 1 + login: "Log In" + error: + - selector: form#loginform > span.warning + test: + path: torrents.php + selector: a[href^="logout.php?auth="] + +search: + # http://hqmusic.info/ajax.php?artistname=John&groupname=Born&recordlabel=Sony&year=2012&filelist=Queen&freetorrent=&taglist=rock&tags_type=1&order_by=time&order_way=desc&filter_cat%5B1%5D=1&group_results=1&action=browse + paths: + - path: ajax.php + response: + type: json + + inputs: + $raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}" + searchstr: "{{ .Keywords }}" + artistname: "{{ if and (.Query.Artist) (ne .Query.Artist \"VA\") }}{{ .Query.Artist }}{{ else }}{{ end }}" + groupname: "{{ .Query.Album }}" + recordlabel: "{{ .Query.Label }}" + year: "{{ .Query.Year }}" + filelist: "{{ .Query.Track }}" + freetorrent: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + taglist: "{{ .Query.Genre }}" + # 0 Any, 1 All + tags_type: 1 + order_by: "{{ .Config.sort }}" + order_way: "{{ .Config.type }}" + group_results: 1 + action: browse + + rows: + selector: response.results + attribute: torrents + multiple: true + + fields: + _groupid: + selector: ..groupId + _torrentid: + selector: torrentId + category: + text: 1 + artist: + selector: ..artist + filters: + - name: htmldecode + _groupName: + selector: ..groupName + filters: + - name: htmldecode + _releaseType: + selector: ..releaseType + album: + optional: true + text: "{{ if eq .Result._releaseType \"Album\" }}{{ .Result._groupName }}{{ else }}{{ end }}" + track: + optional: true + text: "{{ if eq .Result._releaseType \"Single\" }}{{ .Result._groupName }}{{ else }}{{ end }}" + year: + optional: true + selector: ..groupYear + filters: + - name: re_replace + args: ["^0$", ""] + _format: + selector: format + _encoding: + selector: encoding + _hasLog: + selector: hasLog + _logScore: + selector: logScore + _hasCue: + selector: hasCue + _media: + selector: media + year_remaster: + selector: remasterYear + title_remaster: + optional: true + selector: remasterTitle + title: + # John Mayer - Born And Raised [2012] [Album] FLAC / Lossless / Log (100%) / Cue / CD + # Duy - I Go [2022] [Single] Other / Lossless / WEB + text: "{{ .Result.artist }} - {{ .Result._groupName }} {{ if .Result.year }}[{{ .Result.year }}] {{ else }}{{ end }}[{{ .Result._releaseType }}] {{ .Result._format }} / {{ .Result._encoding }} {{ if eq .Result._hasLog \"True\" }}/ Log {{ else }}{{ end }}{{ if ne .Result._logScore \"0\" }}({{ .Result._logScore }}%){{ else }}{{ end }}{{ if eq .Result._hasCue \"True\" }} / Cue{{ else }}{{ end }} / {{ .Result._media }}{{ if ne .Result.year_remaster \"0\" }} / {{ .Result.year_remaster }}{{ else }}{{ end }}{{ if .Result.title_remaster }} {{ .Result.title_remaster }}{{ else }}{{ end }}" + details: + text: "torrents.php?id={{ .Result._groupid }}&torrentid={{ .Result._torrentid }}" + download: + text: "torrents.php?action=download&id={{ .Result._torrentid }}" + poster: + selector: ..cover + date: + selector: time + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + size: + selector: size + files: + selector: fileCount + grabs: + selector: snatches + seeders: + selector: seeders + leechers: + selector: leechers + genre: + selector: ..tags + filters: + - name: replace + args: [".", "_"] + description: + text: "{{ .Result.genre }}" + _free: + selector: isFreeleech + _neutral: + selector: isNeutralLeech + _personal: + selector: isPersonalFreeleech + downloadvolumefactor_special: + optional: true + text: "{{ if eq .Result._neutral \"True\" }}0{{ else }}{{ end }}{{ if eq .Result._free \"True\" }}0{{ else }}{{ end }}{{ if eq .Result._personal \"True\" }}0{{ else }}{{ end }}" + downloadvolumefactor: + text: "{{ if .Result.downloadvolumefactor_special }}{{ .Result.downloadvolumefactor_special }}{{ else }}1{{ end }}" + uploadvolumefactor: + text: "{{ if eq .Result._neutral \"True\" }}0{{ else }}1{{ end }}" + minimumratio: + text: 0.6 + minimumseedtime: + # 3 days (as seconds = 3 x 24 x 60 x 60) + text: 259200 +# JSON Gazelle diff --git a/config/prowlarr/Definitions/huntorrent.yml b/config/prowlarr/Definitions/huntorrent.yml new file mode 100644 index 0000000..3be2fb2 --- /dev/null +++ b/config/prowlarr/Definitions/huntorrent.yml @@ -0,0 +1,176 @@ +--- +id: huntorrent +name: HunTorrent +description: "HunTorrent is a Hungarian Semi-Private site for MOVIES / TV / GENERAL" +language: hu-HU +type: semi-private +encoding: UTF-8 +links: + - https://huntorrent.org/ +legacylinks: + - https://huntorrent.net/ + +caps: + categorymappings: + - {id: 28, cat: Movies/SD, desc: "Cam/ENG"} + - {id: 27, cat: Movies/SD, desc: "Cam/HUN"} + - {id: 4, cat: Movies/DVD, desc: "DVDR/ENG"} + - {id: 3, cat: Movies/DVD, desc: "DVDR/HUN"} + - {id: 6, cat: Movies/HD, desc: "HD/ENG"} + - {id: 5, cat: Movies/HD, desc: "HD/HUN"} + - {id: 29, cat: Movies, desc: "Mese/ENG"} + - {id: 30, cat: Movies, desc: "Mese/HUN"} + - {id: 8, cat: TV/SD, desc: "Sorozat/ENG"} + - {id: 31, cat: TV/HD, desc: "Sorozat/HD/ENG"} + - {id: 9, cat: TV/HD, desc: "Sorozat/HD/HUN"} + - {id: 7, cat: TV/SD, desc: "Sorozat/HUN"} + - {id: 2, cat: Movies/SD, desc: "XviD/ENG"} + - {id: 1, cat: Movies/SD, desc: "XviD/HUN"} + - {id: 25, cat: Other, desc: "Kép"} + - {id: 24, cat: Books, desc: "eBook/ENG"} + - {id: 23, cat: Books, desc: "eBook/HUN"} + - {id: 38, cat: Audio/Audiobook, desc: "Hangoskönyv"} + - {id: 17, cat: PC/Games, desc: "Játék/ISO"} + - {id: 18, cat: PC/Games, desc: "Játék/RIP"} + - {id: 19, cat: Console, desc: "Konzol"} + - {id: 26, cat: PC/Mobile-Other, desc: "Mobil"} + - {id: 20, cat: PC/ISO, desc: "Program/ISO"} + - {id: 21, cat: PC/0day, desc: "Program/RIP"} + - {id: 13, cat: Audio/Video, desc: "Klip/ENG"} + - {id: 12, cat: Audio/Video, desc: "Klip/HUN"} + - {id: 11, cat: Audio/MP3, desc: "MP3/ENG"} + - {id: 10, cat: Audio/MP3, desc: "MP3/HUN"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: useragent + type: text + label: User-Agent + - name: info_useragent + type: info + label: How to get the User-Agent + default: "
  1. From the same place you fetched the cookie,
  2. Find 'user-agent:' in the Request Headers section
  3. Select and Copy the whole user-agent string (everything after 'user-agent: ') and Paste here.
" + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 1: name + 4: created + 7: seeders + 5: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: browse.php + selector: a[href^="logout.php?k="] + +search: + headers: + User-Agent: ["{{ .Config.useragent }}"] + paths: + # https://huntorrent.net/browse.php?time=1616615308&korhatar=0&incldead=1&xyz=yes&c28=1&c27=1&c6=1&c5=1&sort=4&type=desc + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + viewMode: "" + xyz: yes + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # Age Limit: 0 all, 1 no, 5 6, 2 12, 3 16, 4 18 + korhatar: 0 + # 0 active, 1 active+dead, 2 dead, 3 my uploads, 4 waiting for seed, 7 my bookmarks, 12 reseeded by me + incldead: 1 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + # no freeleech atm + # can search by genre but you need to know the id. &mufaj[]=20 for Romantikus + + rows: + selector: table[align="center"][cellpadding="5"] > tbody > tr[id^="torrent-main-"] + + fields: + _id: + selector: a.download-link + attribute: data-id + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="#details_tr_"] + attribute: title + filters: + - name: replace + args: ["Név: ", ""] + details: + text: "details.php?id={{ .Result._id }}" + download: + selector: a[href^="download.php?torrent="] + attribute: href + genre: + selector: "span[style=\"font-size: 6pt; font-weight: bold;\"]" + description: + selector: td:nth-child(2) div:nth-child(2) + filters: + - name: append + args: "{{ if .Result.genre }}
{{ .Result.genre }}{{ else }}{{ end }}" + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + poster: + selector: a[href^="torrents_data/posters/"] + attribute: href + date: + selector: td:nth-last-child(5) + filters: + - name: append + args: " +01:00" # CET + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + size: + selector: td:nth-last-child(4) b + grabs: + selector: td:nth-last-child(3) + seeders: + selector: td:nth-last-child(2) a b + leechers: + selector: td:nth-last-child(1) + downloadvolumefactor: + text: 1 + uploadvolumefactor: + text: 2 + minimumratio: + text: 1.0 + minimumseedtime: + # 32 hours (as seconds = 32 x 60 x 60) + text: 115200 +# engine n/a diff --git a/config/prowlarr/Definitions/icc2022.yml b/config/prowlarr/Definitions/icc2022.yml new file mode 100644 index 0000000..5e9546d --- /dev/null +++ b/config/prowlarr/Definitions/icc2022.yml @@ -0,0 +1,192 @@ +--- +id: icc2022 +name: ICC2022 +description: "ICC2022 (冰淇淋) is a CHINESE Private Torrent Tracker for HD MOVIES / TV / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +requestDelay: 2 +links: + - https://www.icc2022.com/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "Movies/电影", default: true} + - {id: 404, cat: TV/Documentary, desc: "Documentaries/纪录片", default: true} + - {id: 405, cat: TV/Anime, desc: "Animations/动漫", default: true} + - {id: 402, cat: TV, desc: "TV Series/电视剧", default: true} + - {id: 403, cat: TV, desc: "TV Shows/综艺", default: true} + - {id: 406, cat: Audio/Video, desc: "MusicVideo/MV", default: true} + - {id: 407, cat: TV/Sport, desc: "Sports/体育", default: true} + - {id: 409, cat: Other, desc: "Misc/其他", default: true} + - {id: 408, cat: Audio, desc: "Music/音乐", default: true} + # special + - {id: 410, cat: Movies, desc: "Video/视频资料", default: false} + - {id: 411, cat: Audio, desc: "Audio/音频资料", default: false} + - {id: 412, cat: Other, desc: "Other/其他资料", default: false} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: 2facode + type: text + label: 2FA code + - name: info_2fa + type: info + label: "About 2FA code" + default: "Only fill in the 2FA code box if you have enabled 2FA on the ICC2022 Web Site. Otherwise just leave it empty." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + secret: "" + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + two_step_code: "{{ .Config.2facode }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("失败")) + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + categories: [401, 402, 403, 404, 405, 406, 407, 408, 409] + - path: special.php + categories: [410, 411, 412] + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl (4 does not appear to work) + search_area: "{{ if or .Query.IMDBID .Query.DoubanID }}1{{ else }}0{{ end }}" + # 0 AND, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(a[href^="details.php?id="]) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: img[data-src] + attribute: data-src + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-child(5) + seeders: + selector: td.rowfollow:nth-child(6) + leechers: + selector: td.rowfollow:nth-child(7) + grabs: + selector: td.rowfollow:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumseedtime: + # 1 day (as seconds = 24 x 60 x 60) + text: 86400 + description: + selector: td.rowfollow:nth-child(2) + remove: a, b, font, img, span +# NexusPHP v1.8.6 2023-08-18 diff --git a/config/prowlarr/Definitions/idope.yml b/config/prowlarr/Definitions/idope.yml new file mode 100644 index 0000000..751d689 --- /dev/null +++ b/config/prowlarr/Definitions/idope.yml @@ -0,0 +1,127 @@ +--- +id: idope +name: iDope +description: "iDope is a Public torrent search engine presenting direct magnet links" +language: en-US +type: public +encoding: UTF-8 +requestDelay: 2 +links: + - https://idope.se/ +legacylinks: + - https://idope.black-mirror.xyz/ + - https://idope.unblocked.casa/ + - https://idope.proxyportal.fun/ + - https://idope.uk-unblock.xyz/ + - https://idope.ind-unblock.xyz/ + - https://idope.unblocked.bar/ + - https://idope.proxyportal.pw/ + - https://idope.uk-unblock.pro/ + - https://idope.unblocked.rest/ + - https://idope.unblocked.monster/ + +caps: + categorymappings: + - {id: 0, cat: Other, desc: Others} + - {id: 1, cat: Movies, desc: Movies} + - {id: 2, cat: Other, desc: Video} + - {id: 3, cat: TV, desc: TV} + - {id: 4, cat: TV/Anime, desc: Anime} + - {id: 5, cat: XXX, desc: XXX} + - {id: 6, cat: Audio, desc: Music} + - {id: 7, cat: PC/Games, desc: Games} + - {id: 8, cat: PC, desc: Apps} + - {id: 9, cat: Books, desc: Books} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: itorrents-links + type: checkbox + label: Add download links via itorrents.org + default: false + - name: info + type: info + label: ITorrents Note + default: Without the itorrents option only magnet links will be provided. + - name: sort + type: select + label: Sort requested from site (Applies only to search with Keywords) + default: -3 + options: + -3: "created desc" + -1: "seeders desc" + -2: "size desc" + 3: "created asc" + 1: "seeders asc" + 2: "size asc" + - name: flaresolverr + type: info + label: FlareSolverr + default: This site may use Cloudflare DDoS Protection, therefore Prowlarr requires FlareSolverr to access it. + +search: + paths: + # present trending results if there are no search parms supplied + # sort torrent-list by age in descending order + - path: "{{ if .Keywords }}torrent-list/{{ .Keywords }}?o={{ .Config.sort }}&c={{ range .Categories }}{{.}}{{end}}{{ else }}browse.html{{ end }}" + - path: "{{ if .Keywords }}torrent-list/{{ .Keywords }}?p=2&o={{ .Config.sort }}&c={{ range .Categories }}{{.}}{{end}}{{ else }}browse.html?&p=2{{ end }}" + + rows: + selector: div.resultdiv + + fields: + category: + selector: div.resultdivbotton div.resultdivbottoncategory + optional: true + default: 0 + case: + ":contains(\"Others\")": 0 + ":contains(\"Movies\")": 1 + ":contains(\"Video\")": 2 + ":contains(\"TV\")": 3 + ":contains(\"Anime\")": 4 + ":contains(\"XXX\")": 5 + ":contains(\"Music\")": 6 + ":contains(\"Games\")": 7 + ":contains(\"Apps\")": 8 + ":contains(\"Books\")": 9 + title: + selector: div.resultdivtop a div.resultdivtopname + details: + selector: div.resultdivtop a + attribute: href + download_itorrents: + selector: div.resultdivbotton div.hideinfohash + filters: + - name: toupper + - name: prepend + args: http://itorrents.org/torrent/ + - name: append + args: ".torrent" + download: + text: "{{ if .Config.itorrents-links }}{{ .Result.download_itorrents }}{{ else }}{{ end }}" + infohash: + selector: div.resultdivbotton div.hideinfohash + date: + selector: div.resultdivbotton div.resulttime div.resultdivbottontime + filters: + - name: timeago + size: + selector: div.resultdivbotton div.resultlength div.resultdivbottonlength + files: + selector: div.resultdivbotton div.resultfile div.resultdivbottonfiles + seeders: + selector: div.resultdivbotton div.resultseed div.resultdivbottonseed + leechers: + text: 0 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/ilcorsaroblu.yml b/config/prowlarr/Definitions/ilcorsaroblu.yml new file mode 100644 index 0000000..ee8aaf1 --- /dev/null +++ b/config/prowlarr/Definitions/ilcorsaroblu.yml @@ -0,0 +1,263 @@ +--- +id: ilcorsaroblu +name: Il Corsaro Blu +description: "il CorSaRo Blu is an ITALIAN Semi-Private site for TV / MOVIES / GENERAL" +language: it-IT +type: semi-private +encoding: UTF-8 +links: + - https://ilcorsaroblu.org/ +legacylinks: + - http://ilcorsaroblu.org/ + - https://www.ilcorsaroblu.info/ + - https://www.ilcorsaroblu.org/ + - https://ilcorsaroblu.online/ + +caps: + categorymappings: + # Adult + - {id: 12, cat: XXX, desc: "Adult"} + # Applicazioni + - {id: 5, cat: PC/Mobile-Android, desc: "Android"} + - {id: 30, cat: PC/Mobile-iOS, desc: "iOS / iPhone"} + - {id: 7, cat: PC/0day, desc: "Windows"} + - {id: 8, cat: PC, desc: "Linux"} + - {id: 9, cat: PC/Mac, desc: "Mac"} + - {id: 40, cat: PC, desc: "Emulatori"} + - {id: 34, cat: PC, desc: "Student's Office"} + # Books + - {id: 6, cat: Books/EBook, desc: "Books"} + - {id: 45, cat: Books/Comics, desc: "Fumetti"} + - {id: 51, cat: Books/EBook, desc: "Pdf"} + - {id: 33, cat: Books/EBook, desc: "Romanzi"} + - {id: 26, cat: Books/Mags, desc: "Edicola: Giornali/Quotidiani"} + # Games + - {id: 3, cat: PC/Games, desc: "Games PC"} + - {id: 27, cat: Console, desc: "Games Console"} + - {id: 41, cat: Console/XBox, desc: "Games Xbox360"} + - {id: 43, cat: Console, desc: "Games Retro"} + - {id: 47, cat: Console/NDS, desc: "Games Nintendo"} + # Music + - {id: 2, cat: Audio, desc: "Music"} + - {id: 48, cat: Audio/MP3, desc: "Music MP3"} + - {id: 49, cat: Audio, desc: "Radio Trasmissioni"} + # Movies + - {id: 17, cat: Movies/HD, desc: "Movie BDRip"} + - {id: 39, cat: Movies/HD, desc: "Movie BDRip TNT"} + - {id: 21, cat: Movies/Other, desc: "Movie Films"} + - {id: 11, cat: Movies/DVD, desc: "Movie DVD-R"} + - {id: 14, cat: Movies/HD, desc: "Movie 720p"} + - {id: 13, cat: Movies/HD, desc: "Movie 1080p"} + - {id: 15, cat: Movies/3D, desc: "Movie 3D"} + - {id: 25, cat: Movies/UHD, desc: "Movie UHD"} + - {id: 36, cat: Movies, desc: "Movie TNT"} + - {id: 24, cat: TV/SD, desc: "TV Show Standard"} + - {id: 19, cat: TV/HD, desc: "TV Show 1080p"} + - {id: 20, cat: TV/HD, desc: "TV Show 720"} + - {id: 50, cat: TV, desc: "TV Show TNT"} + - {id: 28, cat: TV/Anime, desc: "Anime"} + - {id: 29, cat: TV, desc: "Cartoons"} + - {id: 37, cat: TV/Sport, desc: "Sport"} + - {id: 35, cat: TV/Documentary, desc: "Documentari"} + - {id: 38, cat: Movies, desc: "Commedia"} + - {id: 46, cat: Movies, desc: "Movie Parodie"} + # Various + - {id: 4, cat: Other, desc: "Other"} + - {id: 23, cat: Other, desc: "Archive"} + - {id: 42, cat: Other, desc: "Disegni e Modelli"} + - {id: 16, cat: Other, desc: "V.I.P."} + - {id: 32, cat: Other, desc: "Premium"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: flaresolverr + type: info + label: FlareSolverr + default: This site may use Cloudflare DDoS Protection, therefore Prowlarr requires FlareSolverr to access it. + - name: sort + type: select + label: Sort requested from site + default: 3 + options: + 3: created + 5: seeders + 4: size + 2: title + - name: type + type: select + label: Order requested from site + default: 2 + options: + 2: desc + 1: asc + - name: info + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: index.php?page=login&returnto=index.php + method: form + form: form[name="login"] + inputs: + uid: "{{ .Config.username }}" + pwd: "{{ .Config.password }}" + error: + - selector: span[style="color:#FF0000;"] + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: index.php + keywordsfilters: + - name: diacritics + args: replace + - name: re_replace # S01 to 1 + args: ["(?i)\\bS0*(\\d+)\\b", "$1"] + - name: re_replace # S01E01 to 1 1 + args: ["(?i)\\bS0*(\\d+)E0*(\\d+)\\b", "$1 $2"] + # https://www.ilcorsaroblu.org/index.php?page=torrents&search=&category=0&options=0&active=0 + inputs: + page: torrents + search: "{{ .Keywords }}" + category: "{{ if .Categories }}{{ range .Categories }}{{.}};{{end}}{{ else }}0{{ end }}" + # 0 title, 1 title & descr, 2 descr, 3 uploaders, 5 gold, 6 silver, 7 bronze + options: "{{ if .Config.freeleech }}5{{ else }}0{{ end }}" + # 0 all, 1 activeonly, 2 deadonly + active: 0 + order: "{{ .Config.sort }}" + by: "{{ .Config.type }}" + # does not support imdbid searches and does not return imdb link in results + + rows: + selector: div.b-content > table > tbody > tr > td > table.lista > tbody > tr:has(a[href^="index.php?page=torrents&category="]) + filters: + - name: andmatch + + fields: + category: + selector: a[href^="index.php?page=torrents&category="] + attribute: href + filters: + - name: querystring + args: category + title: + selector: td:nth-child(2) > a + filters: + - name: re_replace # replace special characters with " " (space) + args: ["[\\[!\"#$%&'()*+,\\-.\\/:;<=>?@[\\]^_`{|}~]", " "] + - name: diacritics + args: replace + - name: re_replace # replace multiple spaces + args: ["[ ]{2,}", " "] + # normalize to SXXEYY format + - name: re_replace # S01 E01 to S01E01 + args: ["(?i)\\bS(\\d+)\\sE(\\d+)\\b", "S$1E$2"] + - name: re_replace # 01x01 to S01E01 + args: ["(?i)(\\d{2})x(\\d+)", "S$1E$2"] + - name: re_replace # 1x01 to S01E01 + args: ["(?i)\\b(\\d{1})x(\\d+)", "S0$1E$2"] + - name: re_replace # Stagione X --> S0X + args: ["(?i)\\bStagion[ei]\\s?(\\d{1})\\b|\\bSeason'?s?\\s?(\\d{1})\\b", "S0$1$2"] + - name: re_replace # Stagione XX --> SXX + args: ["(?i)\\bStagion[ei]\\s?(\\d{2,})\\b|\\bSeason'?s?\\s?(\\d{2,})\\b", "S$1$2"] + - name: re_replace # Episodio 4 to E4 + args: ["(?i)\\b(?:[\\/\\|]?Episodio\\s?(\\d+)|Puntata\\s?(\\d+))", "E$1$2"] + - name: re_replace # Episodi 4 5 to E04-05 + args: ["(?i)\\b(?:Puntate\\s*)(\\d+)\\s?(\\d+)", "E0$1-0$2"] + - name: re_replace # rimozioni varie + args: ["(?i)(Serie completa|Completat?a?|in pausa)", ""] + # cleanup for Sonarr + - name: re_replace # EP 3 4 to E3-4 + args: ["(?i)\\sEP\\s(\\d{1,2})\\s(E?\\s?\\d{1,2})\\s", " E$1-$2 "] + - name: re_replace # S02E04 05 to S02E04-05 + args: ["(?i)\\sS(\\d{1,2})\\s?E\\s?(\\d{1,2})\\s(E?\\s?\\d{1,2})\\s", " S$1E$2-$3 "] + - name: re_replace + args: ["(?i)AC3\\s?(\\d)\\s(\\d)", "AC3 $1.$2"] + - name: re_replace + args: ["(?i) DD\\s?(\\d)\\s(\\d)", " DD $1.$2"] + - name: re_replace + args: ["(?i) DDP\\s?(\\d)\\s(\\d)", " DDP $1.$2"] + - name: re_replace + args: ["(?i)\\sE\\s?AC3", " EAC3"] + - name: re_replace + args: ["(?i)WEB\\sDL", "WEB-DL"] + - name: re_replace + args: ["(?i)HDTVRIP", "HDTV"] + details: + selector: td:nth-child(2) > a + attribute: href + download: + optional: true + selector: a[href^="download.php?id="] + attribute: href + filters: + - name: querystring + args: id + - name: toupper + - name: prepend + args: http://itorrents.org/torrent/ + - name: append + args: ".torrent" + infohash: + optional: true + selector: a[href^="download.php?id="] + attribute: href + filters: + - name: querystring + args: id + magnet: + optional: true + selector: a[href^="magnet:?xt="] + attribute: href + size: + selector: td:nth-last-child(2) + date_ago: + selector: td:nth-last-child(7):contains('ago') + # auto adjusted by site account profile + optional: true + filters: + - name: timeago + date_year: + selector: td:nth-last-child(7):contains('/') + # auto adjusted by site account profile + optional: true + filters: + - name: dateparse + args: "dd/MM/yyyy" + date: + text: "{{ if or .Result.date_ago .Result.date_year }}{{ or .Result.date_ago .Result.date_year }}{{ else }}now{{ end }}" + grabs: + selector: td:nth-last-child(4) + seeders: + selector: td:nth-last-child(6) + leechers: + selector: td:nth-last-child(5) + downloadvolumefactor: + case: + img[src="images/gold.gif"]: 0 + img[src="images/silver.gif"]: 0.5 + img[src="images/bronze.gif"]: 0.75 + "*": 1 + uploadvolumefactor: + text: 1 +# minimumratio: appears to be ratioless +# xbtit diff --git a/config/prowlarr/Definitions/ilcorsaronero.yml b/config/prowlarr/Definitions/ilcorsaronero.yml new file mode 100644 index 0000000..5fb7c8e --- /dev/null +++ b/config/prowlarr/Definitions/ilcorsaronero.yml @@ -0,0 +1,181 @@ +--- +id: ilcorsaronero +name: Il Corsaro Nero +description: "Il Corsaro Nero is an ITALIAN Public site for TV / MOVIES / GENERAL" +language: it-IT +type: public +encoding: Windows-1252 +requestDelay: 2 +links: + - https://ilcorsaronero.link/ + - https://ilcorsaronero.torrentbay.net/ + - https://ilcorsaronero.mrunblock.bond/ + - https://ilcorsaronero.nocensor.cloud/ +legacylinks: + - https://ilcorsaronero.live/ + - https://ilcorsaronero.vip/ + - https://ilcorsaronero.info/ + - https://ilcorsaronero.ch/ + - https://ilcorsaronero.cc/ + - https://ilcorsaronero.pizza/ + - https://ilcorsaronero.pw/ + - https://ilcorsaronero.unblockit.pro/ + - https://ilcorsaronero.unblockit.one/ + - https://ilcorsaronero.xyz/ + - https://ilcorsaronero.unblockit.me/ + - https://ilcorsaronero.unblockit.pw/ + - https://ilcorsaronero.nocensor.space/ + - https://ilcorsaronero.nocensor.work/ + - https://ilcorsaronero.nocensor.biz/ + - https://ilcorsaronero.nocensor.sbs/ + - https://ilcorsaronero.nocensor.world/ + - https://ilcorsaronero.nocensor.lol/ + - https://ilcorsaronero.nocensor.art/ + - https://ilcorsaronero.torrentbay.to/ + - https://ilcorsaronero.fun/ + - https://ilcorsaronero.pro/ + - https://ilcorsaronero.mrunblock.guru/ + - https://ilcorsaronero.mrunblock.life/ + - https://ilcorsaronero.nocensor.click/ + +caps: + categorymappings: + - {id: 1, cat: Movies/HD, desc: "Movies BDRiP", default: true} + - {id: 2, cat: Audio, desc: "Music", default: true} + - {id: 3, cat: PC/Games, desc: "Games PC", default: true} + - {id: 4, cat: Other, desc: "Other", default: true} + - {id: 5, cat: TV/Anime, desc: "Anime", default: true} + - {id: 6, cat: Books/EBook, desc: "Ebooks", default: true} + - {id: 7, cat: PC/0day, desc: "App Windows", default: true} + - {id: 8, cat: PC, desc: "App Linux", default: true} + - {id: 9, cat: PC/Mac, desc: "App Mac", default: true} + - {id: 13, cat: Console/PSP, desc: "Games Playstation", default: true} + - {id: 14, cat: Console/XBox, desc: "Games Xbox", default: true} + - {id: 15, cat: TV, desc: "TV Series", default: true} + - {id: 16, cat: Other, desc: "Other", default: true} + - {id: 18, cat: Audio/Audiobook, desc: "Audio Book", default: true} + - {id: 19, cat: Movies/SD, desc: "Movies Screener", default: true} + - {id: 20, cat: Movies/DVD, desc: "Movies DVD", default: true} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: itorrents-links + type: checkbox + label: Add download links via itorrents.org + +search: + paths: + - path: "{{ if .Keywords }}advsearch.php?&category={{ range .Categories }}{{.}};{{end}}&search={{ .Keywords }}&order=data&by=DESC&page=0{{ else }}/browse/0{{ end }}" + - path: "{{ if .Keywords }}advsearch.php?&category={{ range .Categories }}{{.}};{{end}}&search={{ .Keywords }}&order=data&by=DESC&page=1{{ else }}/browse/1{{ end }}" + - path: "{{ if .Keywords }}advsearch.php?&category={{ range .Categories }}{{.}};{{end}}&search={{ .Keywords }}&order=data&by=DESC&page=2{{ else }}/browse/2{{ end }}" + + rows: + selector: "tr.odd,tr.odd2" + filters: + - name: andmatch + + fields: + category: + selector: td:nth-child(1) a + attribute: href + filters: + - name: split + args: ["/", -1] + title: + selector: td:nth-child(2) a.tab + attribute: href + filters: + - name: split + args: ["/", -1] + - name: replace # replace underscore with " " (space) + args: ["_", " "] + - name: re_replace # replace multiple spaces + args: ["[ ]{2,}", " "] + # normalize to SXXEYY format + - name: re_replace # S01 E01 to S01E01 + args: ["(?i)\\bS(\\d+)\\sE(\\d+)\\b", "S$1E$2"] + - name: re_replace # 01x01 to S01E01 + args: ["(?i)(\\d{2})x(\\d+)", "S$1E$2"] + - name: re_replace # 1x01 to S01E01 + args: ["(?i)\\b(\\d{1})x(\\d+)", "S0$1E$2"] + - name: re_replace # Stagione X --> S0X + args: ["(?i)\\bStagion[ei]\\s?(\\d{1})\\b|\\bSeason'?s?\\s?(\\d{1})\\b", "S0$1$2"] + - name: re_replace # Stagione XX --> SXX + args: ["(?i)\\bStagion[ei]\\s?(\\d{2,})\\b|\\bSeason'?s?\\s?(\\d{2,})\\b", "S$1$2"] + - name: re_replace # Episodio 4 to E4 + args: ["(?i)\\b(?:[\\/\\|]?Episodio\\s?(\\d+)|Puntata\\s?(\\d+))", "E$1$2"] + - name: re_replace # Episodi 4 5 to E04-05 + args: ["(?i)\\b(?:Puntate\\s*)(\\d+)\\s?(\\d+)", "E0$1-0$2"] + - name: re_replace # rimozioni varie + args: ["(?i)(Serie completa|Completat?a?|in pausa)", ""] + # cleanup for Sonarr + - name: re_replace # EP 3 4 to E3-4 + args: ["(?i)\\sEP\\s(\\d{1,2})\\s(E?\\s?\\d{1,2})\\s", " E$1-$2 "] + - name: re_replace # S02E04 05 to S02E04-05 + args: ["(?i)\\sS(\\d{1,2})\\s?E\\s?(\\d{1,2})\\s(E?\\s?\\d{1,2})\\s", " S$1E$2-$3 "] + - name: re_replace + args: ["(?i)AC3\\s?(\\d)\\s(\\d)", "AC3 $1.$2"] + - name: re_replace + args: ["(?i) DD\\s?(\\d)\\s(\\d)", " DD $1.$2"] + - name: re_replace + args: ["(?i) DDP\\s?(\\d)\\s(\\d)", " DDP $1.$2"] + - name: re_replace + args: ["(?i)\\sE\\s?AC3", " EAC3"] + - name: re_replace + args: ["(?i)WEB\\sDL", "WEB-DL"] + - name: re_replace + args: ["(?i)HDTVRIP", "HDTV"] + description: + selector: td:nth-child(1) a + attribute: href + filters: + - name: split + args: ["/", -1] + - name: prepend + args: "cat=" + details: + selector: td:nth-child(4) a + attribute: href + download_itorrents: + selector: input.downarrow + attribute: value + filters: + - name: prepend + args: "http://itorrents.org/torrent/" + - name: append + args: ".torrent" + download: + text: "{{ if .Config.itorrents-links }}{{ .Result.download_itorrents }}{{ else }}{{ end }}" + infohash: + selector: input.downarrow + attribute: value + size: + selector: td:nth-child(3) font + date: + selector: td:nth-child(5) font + filters: + - name: append + args: " +01:00" # CET + - name: dateparse + args: "dd.MM.yy zzz" + seeders: + selector: td:nth-child(6) font + filters: + - name: replace + args: ["n/a", "0"] + leechers: + selector: td:nth-child(7) font + filters: + - name: replace + args: ["n/a", "0"] + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/ildragonero.yml b/config/prowlarr/Definitions/ildragonero.yml new file mode 100644 index 0000000..fb511bd --- /dev/null +++ b/config/prowlarr/Definitions/ildragonero.yml @@ -0,0 +1,201 @@ +--- +id: ildragonero +name: ilDraGoNeRo +description: "ilDraGoNeRo is an ITALIAN Semi-Private Torrent Tracker for MOVIES / TV / GENERAL" +language: it-IT +type: semi-private +encoding: UTF-8 +links: + - https://ildragonero2.info/ + +caps: + # commented out categories are discussion-only forums + categorymappings: + # - {id: 10, cat: Other, desc: "..: REGOLAMENTO :.."} + # - {id: 2, cat: Other, desc: "..: PRESENTAZIONI :.."} + # - {id: 15, cat: Other, desc: "..: CAVERNA DEL DRAGO :.."} + # - {id: 1, cat: Other, desc: "[ RELEASES ]"} + # - {id: 35, cat: Other, desc: "..: GUIDE, ANNUNCI & REGOLE :.."} + # - {id: 19, cat: Movies, desc: "..: FILM :.."} + - {id: 52, cat: Movies, desc: " ( RELEASES IDN_CREW )", default: true} + - {id: 77, cat: Movies/SD, desc: " ( SD )", default: true} + - {id: 50, cat: Movies/HD, desc: " ( HD )", default: true} + - {id: 78, cat: Movies/UHD, desc: " ( 4K )", default: true} + - {id: 66, cat: Movies/Foreign, desc: " ( FILM SUB ITA )", default: true} + # - {id: 56, cat: Movies, desc: " ( FILMOGRAFIE )"} + # - {id: 12, cat: Movies, desc: " ( RICHIESTE )"} + # - {id: 47, cat: Movies, desc: " ( RICHIESTE EVASE )"} + - {id: 39, cat: XXX, desc: "..: FILM XXX :..", default: true} + # - {id: 32, cat: TV/Anime, desc: "..: CARTOON & ANIME :.."} + - {id: 63, cat: Movies/Other, desc: " ( CARTOON & ANIME FILM )", default: true} + - {id: 61, cat: TV/Anime, desc: " ( CARTOON & ANIME SERIE )", default: true} + - {id: 88, cat: TV/Anime, desc: " ( CARTOON & ANIME SUB ITA )", default: true} + # - {id: 80, cat: TV/Anime, desc: " ( RICHIESTE )"} + # - {id: 81, cat: TV/Anime, desc: " ( RICHIESTE EVASE )"} + # - {id: 23, cat: TV, desc: "..: SERIE TV :.."} + # - {id: 33, cat: TV, desc: " L'archivio di Pir8"} + - {id: 45, cat: TV/SD, desc: " (SD 480p)", default: true} + - {id: 46, cat: TV/HD, desc: " (HD 720p - 1080p - 2160p)", default: true} + - {id: 79, cat: TV/Foreign, desc: " ( SERIE TV SUB ITA )", default: true} + # - {id: 74, cat: TV, desc: " ( RICHIESTE )"} + # - {id: 75, cat: TV, desc: " ( RICHIESTE EVASE )"} + # - {id: 54, cat: TV/Documentary, desc: "..: DOCUMENTARI & SPETTACOLI :.."} + - {id: 92, cat: TV/Documentary, desc: " ( DOCUMENTARI )", default: true} + - {id: 53, cat: Audio/Video, desc: " ( CONCERTI )", default: true} + - {id: 93, cat: TV/Other, desc: " ( TV SHOW )", default: true} + # - {id: 85, cat: TV/Documentary, desc: " ( RICHIESTE )"} + # - {id: 86, cat: TV/Documentary, desc: " ( RICHIESTE EVASE )"} + # - {id: 8, cat: Audio, desc: "..: MUSICA :.."} + - {id: 41, cat: Audio/Foreign, desc: " ( ARTISTI STRANIERI )", default: true} + - {id: 42, cat: Audio, desc: " ( ARTISTI ITALIANI )", default: true} + - {id: 87, cat: Audio, desc: " ( COLONNE SONORE )", default: true} + - {id: 89, cat: Audio/Other, desc: " ( COMPILATION )", default: true} + # - {id: 57, cat: Audio, desc: " ( DISCOGRAFIE )"} + # - {id: 72, cat: Audio, desc: " ( RICHIESTE )"} + # - {id: 73, cat: Audio, desc: " ( RICHIESTE EVASE )"} + # - {id: 34, cat: PC/Games, desc: "..: VIDEOGIOCHI :.."} + - {id: 91, cat: PC/Games, desc: " ( VIDEOGIOCHI PER PC )", default: true} + - {id: 59, cat: PC/Games, desc: " ( MODDING )", default: true} + # - {id: 94, cat: PC/Games, desc: " ( COLLECTION )"} + # - {id: 70, cat: PC/Games, desc: " ( RICHIESTE )"} + # - {id: 71, cat: PC/Games, desc: " ( RICHIESTE EVASE )"} + # - {id: 36, cat: Books, desc: "..: SALA DI LETTURA :.."} + - {id: 67, cat: Books/EBook, desc: " ( E-BOOK )", default: true} + - {id: 82, cat: Books/Comics, desc: " ( FUMETTI )", default: true} + - {id: 62, cat: Audio/Audiobook, desc: " ( AUDIO-BOOKS )", default: true} + - {id: 38, cat: Books/Mags, desc: " ( QUOTIDIANI & PERIDOICI )", default: true} + # - {id: 68, cat: Books, desc: " ( RICHIESTE )"} + # - {id: 69, cat: Books, desc: " ( RICHIESTE EVASE )"} + # - {id: 9, cat: PC/0day, desc: "..: APPLICAZIONI :.."} + - {id: 20, cat: PC/0day, desc: "..:Software windows:..", default: true} + - {id: 21, cat: PC/Mac, desc: "..:Software mac:..", default: true} + - {id: 22, cat: PC/Mobile-Android, desc: "..:APK Android:..", default: true} + # - {id: 83, cat: PC/0day, desc: " ( RICHIESTE )"} + # - {id: 84, cat: PC/0day, desc: " ( RICHIESTE EVASE )"} + # - {id: 95, cat: Other, desc: " ( COMMENTI FILM E SERIE )"} + # - {id: 30, cat: Other, desc: "..: RELEASES DA VERIFICARE :.."} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +login: + path: forum/ucp.php?mode=login + method: form + form: form#login + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + autologin: on + viewonline: on + error: + - selector: div.error + test: + path: forum/index.php + selector: a[href^="./ucp.php?mode=logout&sid="] + +download: + before: + # thankyou link: ./viewtopic.php?f=61&p=76522&thanks=76522&to_id=83&from_id=23462 + pathselector: + selector: ul.post-buttons li:nth-last-child(2) a + attribute: href + filters: + - name: re_replace + args: ["^.", "forum"] + selectors: + - selector: script:contains(addLinkToDocument) + filters: + - name: regexp + args: "addLinkToDocument\\(\"(.*?)\"" + - name: prepend + args: "magnet:?xt=urn:btih:" + +search: + paths: + - path: forum/search.php + keywordsfilters: + # strip season and/or ep + - name: re_replace + args: ["\\b(?:[SE]\\d{1,4}){1,2}\\b", ""] + - name: re_replace + args: ["(\\w+)", "+$1"] # prepend + to each word + inputs: + keywords: "{{ if .Keywords }}{{ .Keywords }}{{ else }}{{ .Today.Year }}{{ end }}" + # all, any + terms: all + # Search in subforums: yes 1, no 0 + sc: 0 + # Search For: all, msgonly, titleonly, firstpost + sf: titleonly + # Show Results as: posts, topics + sr: topics + # sort: a author, t post time, f forum, i title, s post subject + sk: t + # order: a ascending, d descending + sd: d + # Seach Posts For: all 0, 1day 1, week 7, fortnight 14, month 30, 3months 90, 6 months 180, year 365 + st: 0 + # Show first: all -1, 0, 25, 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000 + ch: 300 + # hidden + t: 0 + # hidden + submit: Cerca + $raw: "{{ range .Categories }}&fid[]={{.}}{{end}}" + + rows: + selector: li.row + + fields: + category: + selector: a[href^="./viewforum.php?f="] + attribute: href + filters: + - name: querystring + args: f + title: + selector: a.topictitle + filters: + # normalize Stagione xx to Sxx format + - name: re_replace + args: ["(?i)\\bS(?:tagion[ei] )?(\\d{1,3}(?:-\\d{1,3})?)\\b\\s*(.+?)\\s*(?:\\[IN CORSO\\])?\\s*\\[(\\d{1,3}(?:-\\d{1,3})?)\\/(\\d{1,3})\\]", "S$1E$3 of $4 $2"] + - name: re_replace + args: ["(?i)\\bS(?:tagion[ei] )?(\\d{1,3}(?:-\\d{1,3})?)\\b\\s*(.+?)\\s*(?:\\[IN CORSO\\])?\\s*\\[(\\d{1,3}(?:-\\d{1,3})?)\\]", "S$1E$3 $2"] + - name: re_replace + args: ["(?i)\\bS(?:tagion[ei] )?(\\d{1,3}(?:-\\d{1,3})?)\\s+(E\\d{1,3}(?:-\\d{1,3})?)\\/(\\d{1,3})\\b", "S$1$2 of $3"] + - name: re_replace + args: ["(?i)\\bStagion[ei] (\\d{1,3}(?:-\\d{1,3})?)\\b", "S$1"] + - name: re_replace + args: ["(?i)\\s*(?:\\[IN CORSO\\])?\\s*\\[(\\d{1,3}(?:-\\d{1,3})?)\\/(\\d{1,3})\\]", " E$1 of $2"] + details: + selector: a.topictitle + attribute: href + download: + selector: a.topictitle + attribute: href + poster: + selector: div[data-ot] + attribute: data-ot + filters: + - name: regexp + args: "src='(.*?)'" + size: + text: "512 MB" + seeders: + text: 1 + leechers: + text: 1 + date: + selector: time[datetime] + attribute: datetime + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 + description: + selector: a.topictitle +# phpBB diff --git a/config/prowlarr/Definitions/immortuos.yml b/config/prowlarr/Definitions/immortuos.yml new file mode 100644 index 0000000..d6d2bd7 --- /dev/null +++ b/config/prowlarr/Definitions/immortuos.yml @@ -0,0 +1,210 @@ +--- +id: immortuos +name: Immortuos +description: "Immortuos is a GERMAN Private Tracker for MOVIES / TV" +language: de-DE +type: private +encoding: UTF-8 +links: + - https://immortuos.life/ +legacylinks: + - https://www.immortuos.life/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Movies"} + - {id: 2, cat: TV, desc: "TV"} + - {id: 3, cat: Audio, desc: "Music"} + - {id: 4, cat: PC, desc: "Apps"} + - {id: 5, cat: XXX, desc: "XXX"} + - {id: 6, cat: TV/Documentary, desc: "Doku"} + - {id: 7, cat: Console, desc: "Games"} + - {id: 8, cat: Other, desc: "Sonstiges"} + - {id: 9, cat: Movies, desc: "Kino"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: login + method: form + form: form[action$="/login"] + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + remember: on + selectorinputs: + _token: + selector: input[name="_token"] + attribute: value + error: + - selector: script[nonce]:contains("Error") + message: + selector: script[nonce]:contains("Error") +# test: +# path: / +# selector: a[href$="/logout"] + +search: + paths: + - path: filterTorrents + inputs: + $raw: "{{ range .Categories }}categories[]={{.}}&{{end}}" + search: "{{ if .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" # for dashboard imdbid search + imdb: "{{ .Query.IMDBIDShort }}" + tvdb: "{{ .Query.TVDBID }}" + tmdb: "{{ .Query.TMDBID }}" + sorting: "{{ .Config.sort }}" + direction: "{{ .Config.type }}" + qty: 100 + page: 0 + view: list + freeleech: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + # can search by genre but need range support. &genres%5B%5D=Action&genres%5B%5D=Comedy for Action and Comedy + + rows: + selector: table > tbody > tr + + fields: + category: + selector: a[href*="/categories/"] + attribute: href + filters: + - name: regexp + args: "/categories/.*?\\.(\\d+)" + title: + selector: a.view-torrent + download: + selector: a[href*="/download/"] + attribute: href + details: + selector: a.view-torrent + attribute: href + poster: + selector: div.torrent-poster img + attribute: src + filters: + - name: prepend + args: "https://images.weserv.nl/?url=" # for display on dashboard + - name: append + args: "&w=180&h=270" # for display on dashboard + - name: replace + args: ["https://images.weserv.nl/?url=https://via.placeholder.com/600x900&w=180&h=270", ""] + genre: + selector: td:nth-last-child(6) + filters: + - name: replace + args: ["\n", ""] + - name: re_replace + args: ["(?i)(Science Fiction)", "Science_Fiction"] + - name: validate + args: "Action, Adventure, Animation, Biography, Comedy, Crime, Documentary, Drama, Family, Fantasy, Game-Show, History, Horror, Music, Musical, Mystery, News, Reality-TV, Romance, Science_Fiction, Sitcom, Sport, Talk-Show, Thriller, War, Western" + description: + text: "{{ .Result.genre }}" + size: + selector: td:nth-last-child(4) + seeders: + selector: td:nth-last-child(3) + leechers: + selector: td:nth-last-child(2) + grabs: + selector: td:nth-last-child(1) + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + tmdbid: + selector: a[href*="themoviedb.org/movie/"], a[href*="themoviedb.org/tv/"] + attribute: href + date: + selector: time + filters: + # translations for Turkish|Estonian|Danish|Italian|Polish|Norwegian|Portuguese|Czech|Russian|Romanian|Spanish|French|German|Bulgarian|Dutch|Chinese|Japanese|Swedish + - name: re_replace + args: ["(?i)(önce|tagasi|geleden|fa|temu|siden|há|atrás|nazpět|назад|acum|în urmă|hace|il y a|vor|преди|前|sedan)", " ago"] + - name: re_replace + args: ["(?i)(saniye|sekundit|sekunder|secondi|sekund|segundos|sekundami|секунд|secunde|secondes|Sekunden|секунди|seconden|秒前)", "seconds"] + - name: re_replace + args: ["(?i)(minutit|minutter|minuti|minuty|minutos|минуты|минут|Minuten|минути|minuten|minuter)", "minutes"] + - name: re_replace + args: ["(?i)(dakika|minut|minuto|minuta|minutt|минута|Minute|minuut|分钟|分)", " minute"] + - name: re_replace + args: ["(?i)(tundi|timer|ore|godziny|horas|hodiny|hoden|часа|часов|ore|heures|Stunden|timmar)", "hours"] + - name: re_replace + args: ["(?i)(saat|tund|time|ora|godzina|hora|hodina|час|oră|heure|Stunde|uur|小时|時間|timme)", " hour"] + - name: re_replace + args: ["(?i)(päeva|dage|giorni|dni|dias|dny|дня|дней|zile|días|jours|Tagen|дни|dagen|dagar)", "days"] + - name: re_replace + args: ["(?i)(gün|päev|dag|giorno|dzień|dia|den|день|zi|día|jour|Tag|ден|天|日)", " day"] + - name: re_replace + args: ["(?i)(nädalat|uger|settimane|tygodnie|uker|semanas|týdny|недели|недель|săptămâni|semaines|Wochen|седмици|weken|veckor)", "weeks"] + - name: re_replace + args: ["(?i)(hafta|nädal|uge|settimana|tydzień|uke|semana|týden|неделю|săptămână|semaine|Woche|седмица|周|週間|vecka)", " week"] + - name: re_replace + args: ["(?i) (ay)", "month"] + - name: re_replace + args: ["(?i)(kuud|måneder|mesi|miesiące|meses|měsíce|месяца|месяцев|luni|meses|mois|Monaten|месеца|maanden|månader)", "months"] + - name: re_replace + args: ["(?i)(kuu|måned|mese|miesiąc|mês|měsíc|месяц|lună|mes|Monat|месец|maand|个月|ヶ月|månad)", " month"] + - name: re_replace + args: ["(?i)(aastat|anni|lata|anos|roky|года|ani|años|ans|Jahren|години)", " years"] + - name: re_replace + args: ["(?i)(yil|aasta|år|anno|rok|ano|год|año|Jahr|година|jaar|年)", " year"] + - name: re_replace + args: ["(?i) (an)", "year"] + - name: re_replace + args: ["(?i)(För |und)", ""] # Misc removals + - name: timeago + downloadvolumefactor: + case: + i[class*="fa-id-badge text-orange"]: 0 # 24 Hour FreeLeech From BON Store + i[class*="fa-trophy text-purple"]: 0 # Special FreeLeech For Certain User Groups + i[class*="fa-star text-bold"]: 0 # Freeleech From Token + i[class*="fa-coins text-bold"]: 0 # Freeleech From Token + i[class*="fa-globe text-blue"]: 0 # Global Freeleech + i[class*="fa-star text-gold"]: 0 # Freeleech + i[class*="fa-certificate text-pink"]: 0 # Featured Torrent + "*": 1 + uploadvolumefactor: + case: + i[class*="fa-gem text-green"]: 2 # Single Torrent Double Upload + i[class*="fa-globe text-green"]: 2 # Global Double Upload + i[class*="fa-certificate text-pink"]: 2 # Featured Torrent + "*": 1 +# global MR is 1.0 but torrents must be seeded for 2 days regardless of ratio +# minimumratio: +# text: 1.0 + minimumseedtime: + # 2 days (as seconds = 5 x 24 x 60 x 60) + text: 172800 +# UNIT3D 1.9.3 diff --git a/config/prowlarr/Definitions/indietorrents.yml b/config/prowlarr/Definitions/indietorrents.yml new file mode 100644 index 0000000..ca64574 --- /dev/null +++ b/config/prowlarr/Definitions/indietorrents.yml @@ -0,0 +1,141 @@ +--- +id: indietorrents +name: Indietorrents +description: "Indietorrents is a private Music tracker for independent music" +language: en-GB +encoding: UTF-8 +type: private +links: + - https://www.indietorrents.com/ + +caps: + categorymappings: + # there is a cat 2 Video but it is not supported by this indexer. + - {id: 1, cat: Audio, desc: "Music"} + + modes: + search: [q] + music-search: [q, album, artist] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: time + options: + time: created + seeders: seeders + size: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_cats + type: info + label: "About categories" + default: "This indexer only supports searching the Audio category. Video searching is not supported." + - name: info_results + type: info + label: "Search results" + default: "This indexer does not support Torrent Groups.
On your account Settings change Torrent grouping to DO NOT Group torrents by default." + +login: + path: login.php?lang= + method: form + form: form#loginform + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + keeplogged: 1 + error: + - selector: form#loginform:contains("incorrect") + test: + path: index.php + selector: a[href^="logout.php?auth="] + +search: + paths: + # https://www.indietorrents.com/torrents.php?searchstr=lily+konigsberg+we+need+to+talk+now+2021&action=basic&taglist=&tags_type=1&order_by=time&order_way=desc + - path: torrents.php + inputs: + searchstr: "{{ if or (.Query.Artist) (.Query.Album) }}{{ or (.Query.Artist) (.Query.Album) }}{{ else }}{{ .Keywords }}{{ end }}" + action: basic + taglist: "" + tags_type: 1 + order_by: "{{ .Config.sort }}" + order_way: "{{ .Config.type }}" + freetorrent: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + # restrict to audio as video generates different html on a mixed results page. + filter_cat[1]: 1 + + rows: + selector: table#torrent_table > tbody > tr[class^="group"] + after: 2 + + fields: + category: + text: 1 + details: + selector: a[href^="torrents.php?id="]:last-of-type + attribute: href + download: + selector: a[href^="torrents.php?action=download&id="] + attribute: href + _tags: + selector: div.tags + description: + selector: td.edition_info + filters: + - name: append + args: "
{{ .Result._tags }}" + files: + selector: td:nth-last-child(7) + date: + selector: td:nth-last-child(6) > span.time + attribute: title + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MMM d yyyy, HH:mm zzz" + size: + selector: td:nth-last-child(5) + grabs: + selector: td:nth-last-child(4) + seeders: + selector: td:nth-last-child(3) + leechers: + selector: td:nth-last-child(2) + downloadvolumefactor: + case: + "strong:contains(\"Freeleech!\")": 0 + "*": 1 + uploadvolumefactor: + text: 1 + title_details: + # artist and album + selector: td:nth-child(3) + remove: span, div.tags + title: + # torrent info + selector: a[href*="torrentid="] + remove: strong + filters: + - name: prepend + args: "{{ .Result.title_details }} " + minimumratio: + text: 0.60 +# Project Gazelle diff --git a/config/prowlarr/Definitions/infire.yml b/config/prowlarr/Definitions/infire.yml new file mode 100644 index 0000000..5e55fb4 --- /dev/null +++ b/config/prowlarr/Definitions/infire.yml @@ -0,0 +1,208 @@ +--- +id: infire +name: Infire +description: "Infire is a SLOVENIAN Private Torrent Tracker for MOVIES / TV / GENERAL" +language: sl-SI +type: private +encoding: UTF-8 +requestDelay: 2 +links: + - https://infire.si/ + +caps: + categorymappings: + # Filmi + - {id: 14, cat: Movies/SD, desc: "XviD", default: true} + - {id: 15, cat: Movies/HD, desc: "HD 720p", default: true} + - {id: 16, cat: Movies/HD, desc: "HD 1080p", default: true} + - {id: 20, cat: Movies/WEB-DL, desc: "WEB/Rip", default: true} + - {id: 21, cat: Movies/WEB-DL, desc: "WEB-DL 720p", default: true} + - {id: 49, cat: Movies/UHD, desc: "HD 2160p", default: true} + - {id: 50, cat: Movies/HD, desc: "BluRay 1080p", default: true} + - {id: 51, cat: Movies/HD, desc: "720p H265", default: true} + - {id: 52, cat: Movies/HD, desc: "1080p H265", default: true} + - {id: 55, cat: Movies/WEB-DL, desc: "WEB-DL 1080p", default: true} + - {id: 71, cat: Movies/WEB-DL, desc: "WEB-DL 2160p", default: true} + - {id: 72, cat: Movies/HD, desc: "BluRay 720p", default: true} + - {id: 73, cat: Movies/HD, desc: "BluRay Remux", default: true} + - {id: 74, cat: Movies/UHD, desc: "UHD Remux", default: true} + - {id: 77, cat: Movies/HD, desc: "DrSi", default: true} + - {id: 97, cat: Movies/UHD, desc: "BluRay 2160p", default: true} + - {id: 99, cat: Movies/HD, desc: "BRRip 720p", default: true} + - {id: 100, cat: Movies/HD, desc: "BRRip 1080p", default: true} + # TV + - {id: 23, cat: TV, desc: "TV", default: true} + - {id: 24, cat: TV/HD, desc: "HDTV 720p", default: true} + - {id: 75, cat: TV/HD, desc: "HDTV 1080p", default: true} + - {id: 76, cat: TV/WEB-DL, desc: "TV WEB/Rip", default: true} + - {id: 78, cat: TV/WEB-DL, desc: "TV WEB 720p", default: true} + - {id: 79, cat: TV/WEB-DL, desc: "TV WEB 1080p", default: true} + - {id: 80, cat: TV/WEB-DL, desc: "TV WEB 2160p", default: true} + - {id: 81, cat: TV/HD, desc: "TV BluRay 720p", default: true} + - {id: 82, cat: TV/HD, desc: "TV BluRay 1080p", default: true} + - {id: 98, cat: TV/UHD, desc: "TV BluRay 2160p", default: true} + # Risanke + - {id: 26, cat: Movies/Other, desc: "Animirano", default: true} + - {id: 56, cat: TV/Anime, desc: "Anime", default: true} + - {id: 93, cat: Movies/Other, desc: "SLOSiNH", default: true} + # Igre + - {id: 29, cat: PC/Games, desc: "PC ISO", default: true} + - {id: 30, cat: Console/Wii, desc: "Nintendo", default: true} + - {id: 31, cat: Console/PS3, desc: "Playstation", default: true} + - {id: 34, cat: Console/XBox One, desc: "Xbox", default: true} + - {id: 83, cat: PC/Games, desc: "Repack", default: true} + # Glasba + - {id: 42, cat: Audio/Video, desc: "Music DVD", default: true} + - {id: 43, cat: Audio/Video, desc: "Videospoti", default: true} + - {id: 53, cat: Audio/MP3, desc: "Glasba MP3", default: true} + - {id: 54, cat: Audio/Lossless, desc: "Glasba FLAC", default: true} + - {id: 62, cat: Audio/Video, desc: "Koncerti", default: true} + # Sport + - {id: 37, cat: TV/Sport, desc: "Sport", default: true} + # XXX + - {id: 60, cat: XXX/Other, desc: "Revije", default: false} + - {id: 61, cat: XXX/Pack, desc: "Packs", default: false} + - {id: 66, cat: XXX/SD, desc: "480p", default: false} + - {id: 67, cat: XXX/x264, desc: "720p", default: false} + - {id: 68, cat: XXX/x264, desc: "1080p", default: false} + - {id: 69, cat: XXX/UHD, desc: "2160p", default: false} + - {id: 84, cat: XXX/ImageSet, desc: "Slike", default: false} + # Disc + - {id: 85, cat: Movies/DVD, desc: "DVD 5", default: true} + - {id: 86, cat: Movies/DVD, desc: "DVD 9", default: true} + - {id: 87, cat: Movies/BluRay, desc: "BD 25", default: true} + - {id: 88, cat: Movies/BluRay, desc: "BD 50", default: true} + - {id: 89, cat: Movies/BluRay, desc: "UHD 50", default: true} + - {id: 90, cat: Movies/BluRay, desc: "UHD 66", default: true} + - {id: 91, cat: Movies/BluRay, desc: "UHD 100", default: true} + # Razno + - {id: 38, cat: PC/0day, desc: "Programi", default: true} + - {id: 39, cat: Books/EBook, desc: "eKnjige", default: true} + - {id: 40, cat: Other, desc: "Slike", default: true} + - {id: 41, cat: Audio/Audiobook, desc: "AudioBook", default: true} + - {id: 44, cat: PC/Mobile-Android, desc: "Android", default: true} + - {id: 45, cat: PC/Mobile-iOS, desc: "iOS", default: true} + - {id: 46, cat: PC/Mac, desc: "Mac", default: true} + - {id: 47, cat: PC/ISO, desc: "Linux", default: true} + # Dokumentarni + - {id: 95, cat: TV/Documentary, desc: "Dokumentarni Film", default: true} + - {id: 96, cat: TV/Documentary, desc: "Dokumentarna Serija", default: true} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: data + options: + data: created + seeds: seeders + size: size + filename: title + - name: type + type: select + label: Order requested from site + default: DESC + options: + DESC: desc + ASC: asc + +login: + path: login.php + method: form + form: form[action^="login.php"] + inputs: + uid: "{{ .Config.username }}" + pwd: "{{ .Config.password }}" + login: "Prijavi se" + error: + - selector: font[color="#FF0000"] + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + categories: [14, 15, 16, 20, 21, 49, 50, 51, 52, 55, 71, 72, 73, 74, 77, 97, 99, 100, 23, 24, 75, 76, 78, 79, 80, 81, 82, 98, 26, 56, 93, 29, 30, 31, 34, 83, 42, 43, 53, 54, 62, 37, 85, 86, 87, 88, 89, 90, 91, 38, 39, 40, 41, 44, 45, 46, 47, 95, 96] + - path: xxx.php + categories: [60, 61, 66, 67, 68, 69, 84] + inputs: + # does not support multi categories, defaulting to all. + search: "{{ .Keywords }}" + # 0 all, 1 active, 2 dead + active: 0 + # 0 all, 1 classic, 2 silver, 3 gold, 4 gold & silver + gold: "{{ if .Config.freeleech }}3{{ else }}0{{ end }}" + order: "{{ .Config.sort }}" + by: "{{ .Config.type }}" + + rows: + selector: table.mg-b-0 > tbody > tr:has(a[href^="download.php?id="]) + + fields: + categorydesc: + selector: span:has(i.fa-compact-disc) + title: + selector: a[href^="details.php?id="] + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: img + attribute: src + size: + selector: td:nth-last-child(4) + date: + selector: td:nth-last-child(5) + # auto adjusted by site account profile + filters: + - name: dateparse + args: "dd/MM/yyyy HH:mm:ss" + seeders: + selector: td:nth-last-child(3) + leechers: + selector: td:nth-last-child(2) + grabs: + selector: td:nth-last-child(1) + genre: + selector: td:nth-child(2) > span:nth-child(5) + filters: + - name: re_replace + args: ["(?i)(Znanstvena fantastika)", "Znanstvena_fantastika"] + - name: validate + args: "Akcija, Animirani, Animacija, Avantura, Biografski, Dokumentarni, Drама, Družinski, Fantastika, Fantazija, Glasbeni, Grozljivka, Комеdija, Kratek, Kriminalka, Кriminalni, Misterij, Mladinski, Potovanje, Pustolovski, Romantika, Sport, Sci-Fi, Тriler, Vojni, Western, Zgodovinski, Znanstvena_fantastika" + description: + text: "{{ .Result.genre }}" + downloadvolumefactor: + case: + "span:contains(\"100% Freeleech\")": 0 + "span:contains(\"50% Freeleech\")": 0.5 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 3 days (as seconds = 3 x 24 x 60 x 60) + text: 259200 +# Engine n/a diff --git a/config/prowlarr/Definitions/insanetracker.yml b/config/prowlarr/Definitions/insanetracker.yml new file mode 100644 index 0000000..5855d94 --- /dev/null +++ b/config/prowlarr/Definitions/insanetracker.yml @@ -0,0 +1,171 @@ +--- +id: insanetracker +name: Insane Tracker +description: "Insane Tracker is a HUNGARIAN Private Torrent Tracker for 0DAY / GENERAL" +language: hu-HU +type: private +encoding: UTF-8 +links: + - https://newinsane.info/ + +caps: + categorymappings: + - {id: 8, cat: TV/SD, desc: "Sorozat/Hun"} + - {id: 40, cat: TV/HD, desc: "Sorozat/Hun/HD"} + - {id: 47, cat: TV/UHD, desc: "Sorozat/Hun/UHD"} + - {id: 7, cat: TV/SD, desc: "Sorozat/Eng"} + - {id: 39, cat: TV/HD, desc: "Sorozat/Eng/HD"} + - {id: 46, cat: TV/UHD, desc: "Sorozat/Eng/UHD"} + - {id: 41, cat: Movies/SD, desc: "Film/Hun/SD"} + - {id: 27, cat: Movies/HD, desc: "Film/Hun/HD"} + - {id: 44, cat: Movies/UHD, desc: "Film/Hun/UHD"} + - {id: 15, cat: Movies/DVD, desc: "Film/Hun/DVD-R"} + - {id: 42, cat: Movies/SD, desc: "Film/Eng/SD"} + - {id: 25, cat: Movies/HD, desc: "Film/Eng/HD"} + - {id: 45, cat: Movies/UHD, desc: "Film/Eng/UHD"} + - {id: 14, cat: Movies/DVD, desc: "Film/Eng/DVD-R"} + - {id: 2, cat: Books, desc: "eBook/Hun"} + - {id: 1, cat: Books, desc: "eBook/Eng"} + - {id: 38, cat: Audio/Audiobook, desc: "Hangoskönyv"} + - {id: 19, cat: Audio/MP3, desc: "Zene/Hun"} + - {id: 37, cat: Audio/Lossless, desc: "Lossless/Hun"} + - {id: 18, cat: Audio/MP3, desc: "Zene/Eng"} + - {id: 26, cat: Audio/Lossless, desc: "Lossless/Eng"} + - {id: 4, cat: PC/ISO, desc: "Program/ISO"} + - {id: 3, cat: PC/0day, desc: "Program/Egyéb"} + - {id: 11, cat: PC/Games, desc: "Játék/Rip"} + - {id: 9, cat: PC/Games, desc: "Játék/ISO"} + - {id: 43, cat: Console, desc: "Játék/Konzol"} + - {id: 13, cat: PC/Mobile-Other, desc: "Mobil"} + - {id: 21, cat: XXX, desc: "XXX"} + - {id: 28, cat: XXX/ImageSet, desc: "XXX Képek"} + - {id: 29, cat: Other, desc: "Képek"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: login.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + notsecure: "" + error: + - selector: div.login_error_content_text + test: + path: index.php + selector: a[href$="logout.php"] + +search: + paths: + # https://newinsane.info/browse.php?search=&nohnr=1&doubleup=&incldead=1&ggen=0&sty=0&all=0 + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # 0 active, 1 both, 2 dead + incldead: 1 + nohnr: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + + rows: + selector: table.torrenttable > tbody > tr:has(td.torrentmain) + + fields: + title: + selector: td.torrentmain > a.torrentname + attribute: title + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + details: + selector: td.torrentmain > a.torrentname + attribute: href + download: + selector: a[href*="/download.php/"] + attribute: href + imdbid: + selector: a[title="IMDb link"] + attribute: href + poster: + selector: img[alt="offer"], a.cover + attribute: src + files: + selector: div.files > a.button.small + size: + selector: td.center.size + seeders: + selector: td.center.data > a:first-child + leechers: + selector: td.center.data > a:nth-child(2) + date: + selector: td.center.date + filters: + - name: append + args: " +01:00" # CET + - name: dateparse + args: "yyyy-MM-ddHH:mm zzz" + downloadvolumefactor: + case: + a[href^="?nohnr=1"]: 0 + "*": 1 + uploadvolumefactor: + case: + a[href^="?doubleup=four"]: 4 + a[href^="?doubleup=three"]: 3 + a[href^="?doubleup=two"]: 2 + "*": 1 + description_text: + selector: div.contenttext + optional: true + remove: div.contenttitle + description: + case: + span.accepted: "Verified: {{ .Result.description_text }}" + span.notchecked: "Unverified: {{ .Result.description_text }}" + grabs: + selector: td.center.data + remove: div.uploader, div.moderation, a.leftborder + minimumratio: + text: 1.0 + minimumseedtime: + # 1 day (as seconds = 24 x 60 x 60) + text: 86400 +# custom v2.0b diff --git a/config/prowlarr/Definitions/internetarchive.yml b/config/prowlarr/Definitions/internetarchive.yml new file mode 100644 index 0000000..169000f --- /dev/null +++ b/config/prowlarr/Definitions/internetarchive.yml @@ -0,0 +1,110 @@ +--- +id: internetarchive +name: Internet Archive +description: "Internet Archive is a non-profit digital library offering free universal access to books, movies & music, as well as 406 billion archived web pages" +language: en-US +type: public +encoding: UTF-8 +links: + - https://archive.org/ + +caps: + categorymappings: + - {id: audio, cat: Audio, desc: audio} + - {id: etree, cat: Audio, desc: etree} + - {id: movies, cat: Movies, desc: movies} + - {id: movies, cat: TV, desc: movies} + - {id: image, cat: Other/Misc, desc: image} + - {id: texts, cat: Books, desc: texts} + - {id: software, cat: PC, desc: software} + - {id: web, cat: Other, desc: web} + - {id: collection, cat: Other, desc: collection} + - {id: account, cat: Other, desc: account} + - {id: data, cat: Other, desc: data} + - {id: other, cat: Other, desc: other} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: titleOnly + type: checkbox + label: Search only in title + default: true + - name: noMagnet + type: checkbox + label: Download using .torrent only. No Magnets. + default: false + - name: sort + type: select + label: Sort requested from site + default: publicdate + options: + publicdate: created + downloads: downloads + item_size: size + - name: type + type: select + label: Order requested from site + default: "-" + options: + "-": desc + "_": asc + +search: + paths: + - path: advancedsearch.php + response: + type: json + + inputs: + q: "{{ if and .Config.titleOnly .Keywords }}title:({{ else }}{{ end }}{{ if .Keywords }}{{ .Keywords }}{{ else }}{{ end }}{{ if and .Config.titleOnly .Keywords }}){{ else }}{{ end }}{{ if .Keywords }} AND {{ else }}{{ end }}format:(\"Archive BitTorrent\"){{ if .Categories }} AND mediatype:({{ join .Categories \" OR \" }}){{ else }}{{ end }}" + fl[]: "identifier,title,mediatype,item_size,downloads,btih,publicdate" + sort: "{{ if .Keywords }}{{ re_replace .Config.type \"_\" \"\" }}{{ .Config.sort }}{{ else }}-publicdate{{ end }}" + rows: 100 + output: json + + rows: + selector: response.docs + count: + selector: response.numFound + + fields: + _id: + selector: identifier + category: + selector: mediatype + title: + selector: title + optional: true + default: "Missing title for {{ .Result._id }}" + details: + text: "details/{{ .Result._id }}" + download: + text: "download/{{ .Result._id }}/{{ .Result._id }}_archive.torrent" + _btih: + selector: btih + optional: true + infohash: + text: "{{ if .Config.noMagnet }}{{ else }}{{ .Result._btih }}{{ end }}" + date: + # 2021-10-25T16:44:43Z + selector: publicdate + size: + selector: item_size + grabs: + selector: downloads + optional: true + seeders: + text: 1 + leechers: + text: 1 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# json Elasticsearch diff --git a/config/prowlarr/Definitions/isohunt2.yml b/config/prowlarr/Definitions/isohunt2.yml new file mode 100644 index 0000000..479e1d0 --- /dev/null +++ b/config/prowlarr/Definitions/isohunt2.yml @@ -0,0 +1,101 @@ +--- +id: isohunt2 +name: Isohunt2 +description: "Isohunt2 is a Public torrent search engine for MOVIES / TV / GENERAL" +language: en-US +type: public +encoding: UTF-8 +links: + - https://isohunt.nz/ + - https://isohunt.fun/ + - https://isohunt.tv/ + - https://isohunt.ch/ +legacylinks: + - https://isohunt2.net/ + +caps: + categorymappings: + - {id: 1, cat: TV/Anime, desc: "Anime"} + - {id: 2, cat: PC/0day, desc: "Software"} + - {id: 3, cat: PC/Games, desc: "Games"} + - {id: 4, cat: XXX, desc: "Adult"} + - {id: 5, cat: Movies, desc: "Movies"} + - {id: 6, cat: Audio, desc: "Music"} + - {id: 7, cat: Other, desc: "Other"} + - {id: 8, cat: TV, desc: "Series & TV"} + - {id: 9, cat: Books, desc: "Books"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: category + type: select + label: Category Filter + default: 0 + options: + 0: All + 1: Anime + 2: Software + 3: Games + 4: Adult + 5: Movies + 6: Music + 7: Other + 8: "Series & TV" + 9: Books + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + +download: + selectors: + - selector: a.btn-magnet + attribute: href + filters: + - name: querystring + args: url + +search: + paths: + - path: torrents + inputs: + ihq: "{{ .Keywords }}" + iht: "{{ .Config.category }}" + age: 0 + Torrent_sort: "{{ .Config.sort }}" + + rows: + selector: table > tbody > tr[data-key="0"] + + fields: + categorydesc: + selector: a[href^="/torrents/?iht="] + title: + selector: td.title-row > a[href^="/"] > span + details: + selector: td.title-row > a[href^="/"] + attribute: href + download: + selector: td.title-row > a[href^="/"] + attribute: href + size: + selector: td.size-row + seeders: + selector: td.sn + date: + selector: td.date-row + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/itatorrents.yml b/config/prowlarr/Definitions/itatorrents.yml new file mode 100644 index 0000000..e58ecbe --- /dev/null +++ b/config/prowlarr/Definitions/itatorrents.yml @@ -0,0 +1,178 @@ +--- +id: itatorrents +name: ItaTorrents +description: "ItaTorrents is an ITALIAN Private tracker for MOVIES / TV / GENERAL" +language: it-IT +type: private +encoding: UTF-8 +links: + - https://itatorrents.xyz/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Film"} + - {id: 2, cat: TV, desc: "Serie TV"} + - {id: 3, cat: Audio, desc: "Musica"} + - {id: 4, cat: Console, desc: "Giochi"} + - {id: 5, cat: PC, desc: "Applicazioni"} + - {id: 6, cat: Books/Mags, desc: "Edicola"} + - {id: 7, cat: Books/EBook, desc: "E-Book"} + - {id: 8, cat: Audio/Audiobook, desc: "AudioLibri"} + - {id: 12, cat: Other, desc: "Corsi"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + music-search: [q] + book-search: [q] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your ItaTorrents account My Security page and clicking on the API Token tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + inputs: {} # TODO: remove in v10 + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: "/api/torrents/filter" + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + # if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6 + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + seasonNumber: "{{ .Query.Season }}" + episodeNumber: "{{ .Query.Ep }}" + imdbId: "{{ .Query.IMDBIDShort }}" + tmdbId: "{{ .Query.TMDBID }}" + tvdbId: "{{ .Query.TVDBID }}" + "free[]": "{{ if .Config.freeleech }}100{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + - name: re_replace # S01 to Stagione 1 + args: ["(?i)\\bS0*(\\d+)\\b", "Stagione $1"] + + rows: + selector: data + attribute: attributes + + fields: + category: + selector: category_id + title: + selector: name + filters: + - name: re_replace + args: ["\\.", " "] + - name: re_replace # Stagione X --> S0X + args: ["(?i)\\bStagion[ei]\\s?(\\d{1})\\b|\\bSeason'?s?\\s?(\\d{1})\\b", "S0$1$2"] + - name: re_replace # Stagione XX --> SXX + args: ["(?i)\\bStagion[ei]\\s?(\\d{2,})\\b|\\bSeason'?s?\\s?(\\d{2,})\\b", "S$1$2"] + details: + selector: details_link + download: + selector: download_link + infohash: + selector: info_hash + poster: + selector: meta.poster + filters: + - name: replace + args: ["https://via.placeholder.com/90x135", ""] + imdbid: + selector: imdb_id + tmdbid: + selector: tmdb_id + tvdbid: + selector: tvdb_id + genre: + selector: meta.genres + filters: + - name: re_replace + args: ["(?i)(televisione film)", "televisione_film"] + - name: replace + args: [" & ", "_&_"] + description: + text: "{{ .Result.genre }}" + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0%, 25%, 50%, 75%, 100% + selector: freeleech + case: + 0%: 1 # not free + 25%: 0.75 + 50%: 0.5 + 75%: 0.25 + 100%: 0 # freeleech + "*": 0 # catch errors + uploadvolumefactor: + # api returns 0=false, 1=true + selector: double_upload + case: + 0: 1 # normal + 1: 2 # double + minimumseedtime: + # 7 days (as seconds = 7 x 24 x 60 x 60) + text: 604800 +# json UNIT3D 6.5.0 diff --git a/config/prowlarr/Definitions/itorrent.yml b/config/prowlarr/Definitions/itorrent.yml new file mode 100644 index 0000000..b526a6c --- /dev/null +++ b/config/prowlarr/Definitions/itorrent.yml @@ -0,0 +1,110 @@ +--- +id: itorrent +name: iTorrent +description: "iTorrent is a Public HUNGARIAN site" +language: hu-HU +type: public +encoding: UTF-8 +links: + - https://itorrent.ws/ +legacylinks: + - https://itorrent.unblockit.pro/ + - https://itorrent.unblockit.one/ + - https://itorrent.unblockit.me/ # currently mirroring 01torrent.net + +caps: + categorymappings: + - {id: app, cat: PC, desc: Apps} + - {id: book, cat: Books, desc: Books} + - {id: game, cat: PC/Games, desc: Games} + - {id: movies, cat: Movies, desc: Movies} + - {id: music, cat: Audio, desc: Music} + - {id: heart, cat: XXX, desc: XXX} + - {id: tv, cat: TV, desc: TV} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: sort + type: select + label: Sort requested from site + default: date_added + options: + date_added: created + seeders: seeders + size: size + title: title + - name: type + type: select + label: Order requested from site + default: DESC + options: + DESC: desc + ASC: asc + +download: + selectors: + - selector: a[href^="/torrentfiles/"] + attribute: href + +search: + paths: + - path: "torrentek/title/{{ .Keywords }}/order/{{ .Config.sort }}/by/{{ .Config.type }}/" + + rows: + selector: tr.gradeX + filters: + - name: andmatch + + fields: + category: + selector: td:nth-child(1) i + attribute: class + filters: + - name: replace + args: ["zqf zqf-", ""] + title: + selector: td:nth-child(2) a + details: + selector: td:nth-child(2) a + attribute: href + download: + selector: td:nth-child(2) a + attribute: href + date_time: + selector: td:nth-child(4) span + optional: true + attribute: title + filters: + - name: append + args: " +01:00" # CET + - name: dateparse + args: "yyyy.MM.dd HH:mm zzz" + date_year: + selector: td:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +01:00" # CET + - name: dateparse + args: "yyyy.MM.dd zzz" + date: + text: "{{ if or .Result.date_year .Result.date_time }}{{ or .Result.date_year .Result.date_time }}{{ else }}now{{ end }}" + size: + selector: td:nth-child(5) + grabs: + selector: td:nth-child(6) + seeders: + selector: td:nth-child(7) + leechers: + selector: td:nth-child(8) + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/jav-torrent.yml b/config/prowlarr/Definitions/jav-torrent.yml new file mode 100644 index 0000000..3846b27 --- /dev/null +++ b/config/prowlarr/Definitions/jav-torrent.yml @@ -0,0 +1,55 @@ +--- +id: jav-torrent +name: JAV-Torrent +description: "JAV-Torrent is a Public tracker for Asian 3X (JAV)" +language: en-US +type: public +encoding: UTF-8 +links: + - https://jav-torrent.org/ + +caps: + categories: + XXX: XXX + + modes: + search: [q] + +settings: [] + +search: + paths: + - path: "{{ if .Keywords }}search?keyword={{ .Keywords }}{{ else }}new{{ end }}" + + rows: + selector: div.card + + fields: + category: + text: XXX + title: + selector: h5 a + details: + selector: h5 a + attribute: href + download: + selector: a[href*="/download/torrent/"] + attribute: href + optional: true + magnet: + selector: a[href^="magnet:?xt="] + attribute: href + optional: true + date: + text: now + size: + selector: span.is-size-6 + seeders: + text: 1 + leechers: + text: 1 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/jme-reunit3d-api.yml b/config/prowlarr/Definitions/jme-reunit3d-api.yml new file mode 100644 index 0000000..23cea3e --- /dev/null +++ b/config/prowlarr/Definitions/jme-reunit3d-api.yml @@ -0,0 +1,160 @@ +--- +id: jme-reunit3d-api +name: JME-REUNIT3D (API) +description: "JME-REUNIT3D is a GERMAN Private Torrent Tracker for MOVIES / TV / GENERAL" +language: de-DE +type: private +encoding: UTF-8 +links: + - https://jme-reunit3d.de/ +legacylinks: + - https://jme-reunit3d.eu/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Movies"} + - {id: 2, cat: TV, desc: "TV"} + - {id: 3, cat: Audio, desc: "Music"} + - {id: 4, cat: Console, desc: "Game"} + - {id: 5, cat: PC, desc: "Application"} + - {id: 6, cat: XXX, desc: "XXX"} + - {id: 7, cat: TV/Sport, desc: "Sport"} + - {id: 8, cat: Books, desc: "E-Books"} + - {id: 9, cat: Audio/Audiobook, desc: "Audio-Books"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + music-search: [q] + book-search: [q] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your JME-REUNIT3D account My Security page and clicking on the API Token tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + inputs: {} # TODO: remove in v10 + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: "/api/torrents/filter" + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + # if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6 + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + seasonNumber: "{{ .Query.Season }}" + episodeNumber: "{{ .Query.Ep }}" + imdbId: "{{ .Query.IMDBIDShort }}" + tmdbId: "{{ .Query.TMDBID }}" + tvdbId: "{{ .Query.TVDBID }}" + free: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + + rows: + selector: data + attribute: attributes + + fields: + categorydesc: + selector: category + title: + selector: name + details: + selector: details_link + download: + selector: download_link + poster: + selector: poster + filters: + - name: replace + args: ["https://via.placeholder.com/90x135", ""] + imdbid: + selector: imdb_id + tmdbid: + selector: tmdb_id + tvdbid: + selector: tvdb_id + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0%, 25%, 50%, 75%, 100% + selector: freeleech + case: + 0%: 1 # not free + 25%: 0.75 + 50%: 0.5 + 75%: 0.25 + 100%: 0 # freeleech + "*": 0 # catch errors + uploadvolumefactor: + # api returns 0=false, 1=true + selector: double_upload + case: + 0: 1 # normal + 1: 2 # double + minimumseedtime: + # 5 days (as seconds = 5 x 24 x 60 x 60) + text: 432000 +# json UNIT3D 6.0.4 diff --git a/config/prowlarr/Definitions/joyhd.yml b/config/prowlarr/Definitions/joyhd.yml new file mode 100644 index 0000000..d59317c --- /dev/null +++ b/config/prowlarr/Definitions/joyhd.yml @@ -0,0 +1,174 @@ +--- +id: joyhd +name: JoyHD +description: "JoyHD (JHD) is a CHINESE Private Torrent Tracker for HD MOVIES / TV / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://www.joyhd.net/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "电影Movies"} + - {id: 402, cat: TV, desc: "剧集TV Series"} + - {id: 403, cat: TV/Other, desc: "综艺TV Shows"} + - {id: 405, cat: TV/Anime, desc: "动漫Animations"} + - {id: 414, cat: Audio, desc: "音乐Music"} + - {id: 407, cat: TV/Sport, desc: "体育Sports"} + - {id: 404, cat: TV/Documentary, desc: "纪录片Documentaries"} + - {id: 406, cat: Audio/Video, desc: "音乐视频Music Videos"} + - {id: 410, cat: PC/Games, desc: "游戏Game"} + - {id: 411, cat: Other, desc: "学习Study"} + - {id: 409, cat: Other, desc: "其他Misc"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: takelogin.php + method: post + inputs: + loginmethod: username + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + dutime: month + error: + - selector: td.embedded:has(h2:contains("失败")) + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + inclbookmarked: 0 + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl (4 does not appear to work). + search_area: "{{ if or .Query.IMDBID .Query.DoubanID }}1{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + imdbid: + # currently not present. just in case a future update. + selector: a[href*="imdb.com/title/tt"] + attribute: href + doubanid: + # currently not present. just in case a future update. + selector: a[href*="movie.douban.com/subject/"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td:nth-child(5) + seeders: + selector: td:nth-child(6) + leechers: + selector: td:nth-child(7) + grabs: + selector: td:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumratio: + text: 0.81 + description: + selector: td:nth-child(2) + remove: a, b, font, img, span +# NexusPHP Standard v0.3 2013-10-01 diff --git a/config/prowlarr/Definitions/jpopsuki.yml b/config/prowlarr/Definitions/jpopsuki.yml new file mode 100644 index 0000000..af31b5c --- /dev/null +++ b/config/prowlarr/Definitions/jpopsuki.yml @@ -0,0 +1,151 @@ +--- +id: jpopsuki +name: JPopsuki +description: "JPopSuki is a Private Torrent Tracker for ASIAN MUSIC" +language: en-US +type: private +encoding: UTF-8 +requestDelay: 3 +links: + - https://jpopsuki.eu/ + +caps: + categorymappings: + - {id: 1, cat: Audio, desc: "Album"} + - {id: 2, cat: Audio, desc: "Single"} + - {id: 3, cat: Movies, desc: "PV"} + - {id: 4, cat: Movies/DVD, desc: "DVD"} + - {id: 5, cat: TV, desc: "TV-Music"} + - {id: 6, cat: TV, desc: "TV-Variety"} + - {id: 7, cat: TV, desc: "TV-Drama"} + - {id: 8, cat: Other, desc: "Fansubs"} + - {id: 9, cat: Other, desc: "Pictures"} + - {id: 10, cat: Other/Misc, desc: "Misc"} + + modes: + search: [q] + tv-search: [q, season, ep, genre] + movie-search: [q, genre] + music-search: [q, album, artist, genre] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: s3 + options: + s3: created + s6: seeders + s4: size + s1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: login.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + keeplogged: 1 + login: "Log In!" + error: + - selector: form#loginform > span.warning, font[color="red"] + test: + path: index.php + selector: a[href^="logout.php?auth="] + +search: + # https://jpopsuki.eu/ajax.php?section=torrents&artistname=&action=advanced&torrentname=snow+man&remastertitle=&filelist=&bitrate=&format=&media=&year=&freeleech=&remastered=&searchtags=&tags_type=0&order_by=s3&order_way=desc&enablegrouping=1 + paths: + - path: ajax.php + inputs: + $raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}{{ if or .Query.Album .Query.Artist .Keywords }}action=advanced{{ else }}searchtags=japanese&tags_type=0{{ end }}" + artistname: "{{ .Query.Artist }}" + torrentname: "{{ if .Query.Album }}{{ .Query.Album }}{{ else }}{{ .Keywords }}{{ end }}" + freeleech: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + order_by: "{{ .Config.sort }}" + order_way: "{{ .Config.type }}" + disablegrouping: 1 + section: torrents + searchtags: "{{ .Query.Genre }}" + # 0 Any, 1 All + tags_type: 1 + + rows: + selector: table#torrent_table > tbody > tr[class^="torrent"] + + fields: + category: + selector: a[href*="filter_cat"] + attribute: href + filters: + - name: regexp + args: "%5B(\\d+?)%5D" + download: + selector: a[href^="torrents.php?action=download&id="] + attribute: href + genre: + selector: div.tags + filters: + - name: replace + args: [".", "_"] + description: + text: "{{ .Result.genre }}" + title: + selector: td:nth-last-child(7) + remove: span, div.tags, a[title="View Comments"] + filters: + - name: replace + args: [" ()", ""] + - name: replace + args: ["\t", ""] + - name: replace + args: [" / Freeleech!", ""] + details: + selector: a[href^="torrents.php?id="] + attribute: href + poster: + selector: img[src^="static/images/torrents/"] + attribute: src + files: + selector: td:nth-last-child(6) + date: + selector: td:nth-last-child(5) + attribute: title + # auto adjusted by site account profile + filters: + - name: dateparse + args: "MMM dd yyyy, HH:mm" + size: + selector: td:nth-last-child(4) + grabs: + selector: td:nth-last-child(3) + seeders: + selector: td:nth-last-child(2) + leechers: + selector: td:nth-last-child(1) + downloadvolumefactor: + case: + "strong:contains(\"Freeleech!\")": 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 0.6 +# engine n/a diff --git a/config/prowlarr/Definitions/jptv-api.yml b/config/prowlarr/Definitions/jptv-api.yml new file mode 100644 index 0000000..b198cb5 --- /dev/null +++ b/config/prowlarr/Definitions/jptv-api.yml @@ -0,0 +1,146 @@ +--- +id: jptv-api +name: JPTV (API) +description: "JPTV is a JAPANESE Private Torrent Tracker for JAPANESE TV / MOVIES / GENERAL" +language: ja-JP +type: private +encoding: UTF-8 +links: + - https://jptv.club/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Movies"} + - {id: 2, cat: TV, desc: "TV Shows"} + - {id: 6, cat: TV, desc: "TS Firehose"} + - {id: 7, cat: Movies/Other, desc: "Anime Movies"} + - {id: 9, cat: TV/Anime, desc: "Anime Series"} + - {id: 8, cat: Audio, desc: "Audio"} + - {id: 10, cat: Books, desc: "Book"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + music-search: [q] + book-search: [q] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your JPTV account My Security page and clicking on the API Token tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: "/api/torrents/filter" + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + imdb: "{{ .Query.IMDBIDShort }}" + tmdb: "{{ .Query.TMDBID }}" + tvdb: "{{ .Query.TVDBID }}" + freeleech: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + sorting: "{{ .Config.sort }}" + direction: "{{ .Config.type }}" + qty: 100 + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + + rows: + selector: data + attribute: attributes + + fields: + categorydesc: + selector: category + title: + selector: name + details: + selector: details_link + download: + selector: download_link + imdbid: + selector: imdb_id + tmdbid: + selector: tmdb_id + tvdbid: + selector: tvdb_id + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0=false, 1=true + selector: freeleech + case: + 0: 1 # not free + 1: 0 # freeleech + uploadvolumefactor: + # api returns 0=false, 1=true + selector: double_upload + case: + 0: 1 # normal + 1: 2 # double +# global MR is 0.4 but torrents must be seeded for 7 days regardless of ratio +# minimumratio: +# text: 0.4 + minimumseedtime: + # 7 days (as seconds = 7 x 24 x 60 x 60) + text: 604800 +# json UNIT3D 5.2.0 diff --git a/config/prowlarr/Definitions/kamept.yml b/config/prowlarr/Definitions/kamept.yml new file mode 100644 index 0000000..a7efc59 --- /dev/null +++ b/config/prowlarr/Definitions/kamept.yml @@ -0,0 +1,166 @@ +--- +id: kamept +name: KamePT +description: "KamePT is a CHINESE Private Torrent Tracker for 3X" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://kamept.com/ + +caps: + categorymappings: + - {id: 410, cat: XXX, desc: "同人AV"} + - {id: 413, cat: XXX, desc: "男娘"} + - {id: 414, cat: XXX, desc: "同人VR"} + - {id: 417, cat: XXX, desc: "Cosplay套图"} + - {id: 419, cat: XXX, desc: "里番"} + - {id: 411, cat: XXX, desc: "2D动画"} + - {id: 423, cat: XXX, desc: "3D动画"} + - {id: 424, cat: XXX/ImageSet, desc: "单行本"} + - {id: 435, cat: XXX/ImageSet, desc: "同人志"} + - {id: 433, cat: XXX/ImageSet, desc: "画师CG"} + - {id: 415, cat: XXX/Other, desc: "游戏"} + - {id: 418, cat: XXX/Other, desc: "中文游戏"} + - {id: 434, cat: XXX/ImageSet, desc: "游戏CG"} + - {id: 420, cat: XXX/Other, desc: "外语音声"} + - {id: 421, cat: XXX/Other, desc: "中文音声"} + - {id: 422, cat: XXX/Other, desc: "视频音声"} + + modes: + search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: index.php + selector: a[href*="usercp.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader + search_area: 0 + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(a[href^="details.php?id="]) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: img[data-src] + attribute: data-src + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-child(5) + seeders: + selector: td.rowfollow:nth-child(6) + leechers: + selector: td.rowfollow:nth-child(7) + grabs: + selector: td.rowfollow:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumratio: + text: 0.9 + description: + selector: td.rowfollow:nth-child(2) + remove: a, b, font, img, span +# NexusPHP KEMURIKUSA 2019-01-09 diff --git a/config/prowlarr/Definitions/karagarga.yml b/config/prowlarr/Definitions/karagarga.yml new file mode 100644 index 0000000..2c49559 --- /dev/null +++ b/config/prowlarr/Definitions/karagarga.yml @@ -0,0 +1,162 @@ +--- +id: karagarga +name: Karagarga +description: "Karagarga tracks non-hollywood, rare and obscure movies, music and literature." +language: en-US +type: private +encoding: iso-8859-1 +links: + - https://karagarga.in/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Movies"} + - {id: 2, cat: Audio, desc: "Music"} + - {id: 3, cat: Books, desc: "Literature"} + + modes: + search: [q] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + captcha: + type: image + selector: img#captcha_img + input: captcha + error: + - selector: table:contains("Login failed!") + - selector: table:contains("Login unsuccessful") + test: + path: index.php + selector: a[href*="logout.php"] + +search: + paths: + # https://karagarga.in/browse.php?search_type=title&search=&cat=3&genre=&subgenre=&country=0&hdrip=&sort=&d=&incldead= + - path: browse.php + inputs: + # torrent, title, director, uploader, year, imdb + search_type: "{{ if .Query.IMDBID }}imdb{{ else }}title{{ end }}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # site does not support multiple cats + cat: 0 + genre: "" + subgenre: "" + # 0 any, 2 USA, 12 UK, etc + country: 0 + hdrip: "" + # "" yes, 1 no + incldead: "" + source: "" + fl: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + # sort keywordless search to get the latest, but dont sort keyword search to allow andmatch to return more results. + sort: "{{ if .Keywords }}{{ else }}added{{ end }}" + d: "{{ if .Keywords }}{{ else }}DESC{{ end }}" + # site supports imdbid searches and returns imdb links in results. + + rows: + selector: table#browse > tbody > tr:has(a[href^="browse.php?genre="]) + filters: + - name: andmatch + + fields: + category: + selector: a[href^="browse.php?genre="] img + case: + img[title^="Movie"]: 1 + img[title^="Music"]: 2 + img[title^="Literature"]: 3 + year: + selector: a[href$="search_type=year"] + optional: true + _flag: + selector: a[href^="browse.php?country="] img + attribute: title + optional: true + _filename: + selector: a[href^="/down.php/"] + attribute: href + filters: + - name: regexp + args: "(?:/down\\.php/\\d+/)(.+?)\\.torrent" + - name: re_replace + args: ["%20", "."] + title: + selector: a[href^="details.php?id="] + filters: + - name: append + args: " {{ .Result.year }} {{ .Result._flag }} [{{ .Result._filename }}]" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="/down.php/"] + attribute: href + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + date: + selector: td:nth-child(9) + filters: + - name: re_replace + args: ["([a-zA-Z]+)\\s+(\\d{1,2})\\s+'(\\d{2})", "$2 $1 $3"] + - name: dateparse + args: "d MMM yy" + files: + selector: td:nth-child(10) + size: + selector: td:nth-child(11) + grabs: + selector: td:nth-child(12) + seeders: + selector: td:nth-child(13) + leechers: + selector: td:nth-child(14) + _subs: + selector: span:contains("Subs:") + optional: true + genre: + selector: td:nth-child(5) + filters: + - name: replace + args: ["\n", " "] + _mom: + selector: img[title^="CURRENT"] + attribute: title + optional: true + description: + text: "{{ if .Result._subs }}Subs: {{ .Result._subs }}
{{ else }}{{ end }}{{ if .Result.genre }}Genre: {{ .Result.genre }}
{{ else }}{{ end }}{{ if .Result._mom }}Current MoM{{ else }}{{ end }}" + downloadvolumefactor: + case: + "span:contains(\"Freeleech\")": 0 + "span:contains(\"Featured\")": 0 + "*": 1 + uploadvolumefactor: + case: +# ":has(img[title^=\"HD\"]):has(img[title^=\"CURRENT\"])": 1.8 + "img[title^=\"CURRENT\"]": 1.6 +# "img[title^=\"HD\"]": 1.3 + "*": 1.1 + minimumratio: + text: 0.25 +# engine n/a diff --git a/config/prowlarr/Definitions/keepfriends.yml b/config/prowlarr/Definitions/keepfriends.yml new file mode 100644 index 0000000..13f714e --- /dev/null +++ b/config/prowlarr/Definitions/keepfriends.yml @@ -0,0 +1,188 @@ +--- +id: keepfriends +name: Keep Friends +description: "Keep Friends is a CHINESE Private Torrent Tracker for HD MOVIES / TV" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://pt.keepfrds.com/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "Movies/电影"} + - {id: 301, cat: Movies, desc: "Movie Packs/电影(合集)"} + - {id: 404, cat: TV/Documentary, desc: "Documentaries/纪录片"} + - {id: 304, cat: TV/Documentary, desc: "Documentary Packs/纪录片(合集)"} + - {id: 405, cat: TV/Anime, desc: "Animations/动漫"} + - {id: 305, cat: TV/Anime, desc: "Animation Packs/动漫(合集)"} + - {id: 402, cat: TV, desc: "TV Series/剧集"} + - {id: 302, cat: TV, desc: "TV Serie Packs/剧集(合集)"} + - {id: 403, cat: TV, desc: "TV Shows/综艺"} + - {id: 303, cat: TV, desc: "TV Show Packs/综艺(合集)"} + - {id: 407, cat: TV/Sport, desc: "Sports/体育"} + - {id: 307, cat: TV/Sport, desc: "Sport Packs/体育(合集)"} + - {id: 406, cat: Audio/Video, desc: "MusicVideo/音乐录影带"} + - {id: 306, cat: Audio/Video, desc: "MusicVideo Packs/音乐录影带(合集)"} + - {id: 408, cat: Audio, desc: "Music/音乐"} + - {id: 308, cat: Audio, desc: "Music Packs/音乐(合集)"} + - {id: 409, cat: Other, desc: "Misc/其他"} + - {id: 309, cat: Other, desc: "Misc Packs/其他(合集)"} + - {id: 300, cat: Other, desc: "Recycle Bin/回收站"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: english_title + type: checkbox + label: "Use English titles instead of Chinese ones (when available)." + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 10: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: index.php + selector: a[onclick="document.getElementById('logout').submit();"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + # currently supports only one query id at one time. + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl, 5 doubankeywords (not working) + search_area: "{{ if .Query.IMDBID }}4{{ else }}{{ end }}{{ if .Query.DoubanID }}1{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }}{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + # supports imdbid searches but does not display imdb links in results. + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title_raw: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + # note: final title processing is at the bottom after descriptions is fetched. + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + doubanid: + selector: a[href*="movie.douban.com/subject/"] + attribute: href + _staff_edit: + selector: a[href^="edit.php?"] + attribute: href + optional: true + date_elapsed: + # time type: time elapsed (default) + selector: "{{ if .Result._staff_edit }}td:nth-child(5) > span[title]{{ else }}td:nth-child(4) > span[title]{{ end }}" + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: "{{ if .Result._staff_edit }}td:nth-child(5):not(:has(span)){{ else }}td:nth-child(4):not(:has(span)){{ end }}" + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: "{{ if .Result._staff_edit }}td:nth-child(6){{ else }}td:nth-child(5){{ end }}" + seeders: + selector: "{{ if .Result._staff_edit }}td:nth-child(7){{ else }}td:nth-child(6){{ end }}" + leechers: + selector: "{{ if .Result._staff_edit }}td:nth-child(8){{ else }}td:nth-child(7){{ end }}" + grabs: + selector: "{{ if .Result._staff_edit }}td:nth-child(9){{ else }}td:nth-child(8){{ end }}" + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + description: + selector: "{{ if .Result._staff_edit }}td:nth-child(3){{ else }}td:nth-child(2){{ end }}" + remove: a, b, font, img, span + title_english: + selector: table.torrentname > tbody > tr > td.embedded + title: + text: "{{ if and .Config.english_title .Result.title_english }}{{ .Result.title_english }}{{ else }}{{ .Result.title_raw }}{{ end }}" +# NexusPHP Standard v1.5 Beta 4 (custom title search) diff --git a/config/prowlarr/Definitions/kickasstorrents-to.yml b/config/prowlarr/Definitions/kickasstorrents-to.yml new file mode 100644 index 0000000..6e6bafb --- /dev/null +++ b/config/prowlarr/Definitions/kickasstorrents-to.yml @@ -0,0 +1,106 @@ +--- +id: kickasstorrents-to +name: kickasstorrents.to +description: "kickasstorrents.to is a Public KickAssTorrent clone for TV / MOVIES / GENERAL" +language: en-US +type: public +encoding: UTF-8 +requestDelay: 2 +links: + - https://kickasstorrents.to/ + - https://kickasstorrent.cr/ + - https://katcr.to/ + - https://kickasstorrents.unblockninja.com/ +legacylinks: + - https://kat.root.yt/ + +caps: + categorymappings: + - {id: anime, cat: TV/Anime, desc: Anime} + - {id: apps, cat: PC, desc: Apps} + - {id: books, cat: Books, desc: Books} + - {id: documentaries, cat: TV/Documentary, desc: Documentaries} + - {id: games, cat: Console, desc: Games} + - {id: movies, cat: Movies, desc: Movies} + - {id: music, cat: Audio, desc: Music} + - {id: other, cat: Other, desc: Other} + - {id: tv, cat: TV, desc: TV} + - {id: xxx, cat: XXX, desc: XXX} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: sort + type: select + label: Sort requested from site + default: time + options: + time: created + seeders: seeders + size: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +download: + selectors: + - selector: a[href^="magnet:?xt="] + attribute: href + +search: + paths: + # 20 rows per page + - path: "{{ if .Keywords }}usearch/{{ .Keywords }}/{{ else }}new/{{ end }}?sortby={{ .Config.sort }}&sort={{ .Config.type }}" + - path: "{{ if .Keywords }}usearch/{{ .Keywords }}/{{ else }}new/{{ end }}2/?sortby={{ .Config.sort }}&sort={{ .Config.type }}" + - path: "{{ if .Keywords }}usearch/{{ .Keywords }}/{{ else }}new/{{ end }}3/?sortby={{ .Config.sort }}&sort={{ .Config.type }}" + - path: "{{ if .Keywords }}usearch/{{ .Keywords }}/{{ else }}new/{{ end }}4/?sortby={{ .Config.sort }}&sort={{ .Config.type }}" + - path: "{{ if .Keywords }}usearch/{{ .Keywords }}/{{ else }}new/{{ end }}5/?sortby={{ .Config.sort }}&sort={{ .Config.type }}" + + rows: + selector: table.data tr.odd:has(a[class="cellMainLink"]), table.data tr.even:has(a[class="cellMainLink"]) + filters: + - name: andmatch + + fields: + category: + selector: span > strong > a + attribute: href + filters: + - name: tolower + - name: trim + args: / + title: + selector: a[class="cellMainLink"] + details: + selector: a[class="cellMainLink"] + attribute: href + download: + selector: a[class="cellMainLink"] + attribute: href + size: + selector: td:nth-child(2) + date: + selector: td:nth-child(4) + attribute: title + filters: + - name: replace + args: ["
", " "] + - name: timeago + seeders: + selector: td:nth-child(5) + leechers: + selector: td:nth-child(6) + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/kickasstorrents-ws.yml b/config/prowlarr/Definitions/kickasstorrents-ws.yml new file mode 100644 index 0000000..b8b2e9d --- /dev/null +++ b/config/prowlarr/Definitions/kickasstorrents-ws.yml @@ -0,0 +1,120 @@ +--- +id: kickasstorrents-ws +name: kickasstorrents.ws +description: "kickasstorrents.ws is a Public KickAssTorrent clone for TV / MOVIES / GENERAL" +language: en-US +type: public +encoding: UTF-8 +links: + - https://kickass.ws/ + - https://kickasstorrents.bz/ + - https://kkickass.com/ + - https://kkat.net/ + - https://kick4ss.com/ + - https://kickasst.net/ + - https://kickasstorrents.id/ + - https://thekat.cc/ +legacylinks: + - https://kickass.gg/ + - https://katcr.io/ + - https://thekat.nz/ + - https://thekat.se/ + - https://kat.how/ + - https://kat.li/ + - https://katcr.to/ # kickasstorrents-to proxy + - https://kickasstorrent.cr/ # kickasstorrents-to proxy + - https://kickass.unblockit.pro/ + - https://kickass.unblockit.one/ + - https://kickass.unblockit.me/ + - https://kickass.unblockit.pw/ + - https://kickass.unblockit.id/ + - https://kickass.unblockit.win/ + - https://kickass.unblockit.top/ # currently redirects to https://kat.unblockit.lat/ (newkatcr.co proxy) + - https://kickasstorrents.unblockninja.com/ # currently kickasstorrents-to proxy + - https://kickass-kat.com/ + +caps: + categorymappings: + - {id: applications, cat: PC, desc: Apps} + - {id: books, cat: Books, desc: Books} + - {id: games, cat: Console, desc: Games} + - {id: movies, cat: Movies, desc: Movies} + - {id: music, cat: Audio, desc: Music} + - {id: other, cat: Other, desc: Other} + - {id: tv, cat: TV, desc: TV} + - {id: xxx, cat: XXX, desc: XXX} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: sort + type: select + label: Sort requested from site + default: time_add + options: + time_add: created + seeders: seeders + size: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +search: + paths: + - path: "{{ if .Keywords }}usearch/{{ .Keywords }}/{{ else }}new/{{ end }}?field={{ .Config.sort }}&sorder={{ .Config.type }}" + + rows: + selector: table.data tr[id] + + fields: + category: + selector: span[id^="cat_"] > strong > a + attribute: href + optional: true + default: other + filters: + - name: tolower + - name: trim + args: / + title: + selector: a[class="cellMainLink"] + details: + selector: a[class="cellMainLink"] + attribute: href + download: + # the official site delivers mylink so we skip to the magnet URI + selector: td:nth-child(1) > div > a[data-download=""] + attribute: href + filters: + - name: querystring + args: url + size: + selector: td:nth-child(2) + date: + selector: td:nth-child(3) + filters: + - name: timeago + seeders: + selector: td:nth-child(4) + filters: + - name: replace + args: ["N/A", 0] + leechers: + selector: td:nth-child(5) + filters: + - name: replace + args: ["N/A", 0] + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/kimoji.yml b/config/prowlarr/Definitions/kimoji.yml new file mode 100644 index 0000000..b8a3395 --- /dev/null +++ b/config/prowlarr/Definitions/kimoji.yml @@ -0,0 +1,173 @@ +--- +id: kimoji +name: KIMOJI +description: "KIMOJI is a CHINESE Private Torrent Tracker for MOVIES / TV / MUSIC" +language: en-US +type: private +encoding: UTF-8 +links: + - https://kimoji.club/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "电影"} + - {id: 2, cat: TV, desc: "剧集"} + - {id: 3, cat: Audio, desc: "音乐"} + - {id: 4, cat: Audio/Audiobook, desc: "有声"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + music-search: [q] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your KIMOJI account My Settings page and clicking on the API Key tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: "/api/torrents/filter" + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + # if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6 + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + seasonNumber: "{{ .Query.Season }}" + episodeNumber: "{{ .Query.Ep }}" + imdbId: "{{ .Query.IMDBIDShort }}" + tmdbId: "{{ .Query.TMDBID }}" + tvdbId: "{{ .Query.TVDBID }}" + "free[]": "{{ if .Config.freeleech }}100{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + + rows: + selector: data + attribute: attributes + + fields: + category: + selector: category_id + title: + selector: name + details: + selector: details_link + download: + selector: download_link + infohash: + selector: info_hash + poster: + selector: meta.poster + filters: + - name: replace + args: ["https://via.placeholder.com/90x135", ""] + imdbid: + selector: imdb_id + tmdbid: + selector: tmdb_id + tvdbid: + selector: tvdb_id + genre: + selector: meta.genres + filters: + - name: re_replace + args: ["(?i)(Science Fiction)", "Science_Fiction"] + - name: re_replace + args: ["(?i)(TV Movies)", "TV_Movies"] + - name: re_replace + args: ["(?i)(Reality TV)", "Reality_TV"] + - name: re_replace + args: ["(?i)(Soap Opera)", "Soap_Opera"] + - name: re_replace + args: ["(?i)(Talk Show)", "Talk_Show"] + - name: replace + args: [" & ", "_&_"] + description: + text: "{{ .Result.genre }}" + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0%, 25%, 50%, 75%, 100% + selector: freeleech + case: + 0%: 1 # not free + 25%: 0.75 + 50%: 0.5 + 75%: 0.25 + 100%: 0 # freeleech + "*": 0 # catch errors + uploadvolumefactor: + # api returns False, True + selector: double_upload + case: + False: 1 # normal + True: 2 # double +# global MR is 1.0 but torrents must be seeded for 3 days regardless of ratio +# minimumratio: +# text: 1.0 + minimumseedtime: + # 3 day (as seconds = 7 x 24 x 60 x 60) + text: 259200 +# json UNIT3D 7.1.3 (custom) diff --git a/config/prowlarr/Definitions/kinorun.yml b/config/prowlarr/Definitions/kinorun.yml new file mode 100644 index 0000000..1ae2976 --- /dev/null +++ b/config/prowlarr/Definitions/kinorun.yml @@ -0,0 +1,175 @@ +--- +id: kinorun +name: Kinorun +description: "Kinorun is a RUSSIAN Semi-Private Torrent Tracker for 3X" +language: ru-RU +type: semi-private +encoding: windows-1251 +links: + - http://kinorun.top/ # site does not support https ERR_CONNECTION_TIMED_OUT + +caps: + categorymappings: + - {id: 9, cat: XXX, desc: "All sex"} + - {id: 51, cat: XXX, desc: "Anal Sex"} + - {id: 58, cat: XXX, desc: "Asian"} + - {id: 63, cat: XXX, desc: "BBW, FAT"} + - {id: 45, cat: XXX, desc: "Bdsm"} + - {id: 59, cat: XXX, desc: "Big tits"} + - {id: 66, cat: XXX, desc: "Black (Ebony)"} + - {id: 73, cat: XXX, desc: "Bukkake"} + - {id: 46, cat: XXX, desc: "Copro, Scat"} + - {id: 47, cat: XXX, desc: "Documentary"} + - {id: 70, cat: XXX, desc: "Fisting"} + - {id: 38, cat: XXX, desc: "Gay (homosexual)"} + - {id: 42, cat: XXX, desc: "Hentai, Cartoon"} + - {id: 43, cat: XXX, desc: "Home sex, Amateur"} + - {id: 56, cat: XXX, desc: "Incest"} + - {id: 34, cat: XXX, desc: "Lesbians"} + - {id: 60, cat: XXX, desc: "Mature 35"} + - {id: 67, cat: XXX, desc: "Midgets"} + - {id: 68, cat: XXX, desc: "Old 50"} + - {id: 55, cat: XXX, desc: "Orgy, group sex"} + - {id: 54, cat: XXX, desc: "Oral Sex"} + - {id: 77, cat: XXX, desc: "Porno pack"} + - {id: 76, cat: XXX, desc: "Porno parody"} + - {id: 69, cat: XXX, desc: "Pregnant"} + - {id: 75, cat: XXX, desc: "Retro porno "} + - {id: 52, cat: XXX, desc: "Russian porn"} + - {id: 44, cat: XXX, desc: "Shemales, Tranny"} + - {id: 61, cat: XXX, desc: "Solo, Toys"} + - {id: 32, cat: XXX, desc: "Special Movies"} + - {id: 39, cat: XXX, desc: "Teens 18"} + - {id: 74, cat: XXX, desc: "w/ Russian Subs"} + - {id: 79, cat: XXX, desc: "Erotic"} + - {id: 5, cat: XXX, desc: "Games"} + - {id: 14, cat: XXX, desc: "Cartoons"} + - {id: 24, cat: XXX, desc: "Other"} + - {id: 37, cat: XXX, desc: "Photo"} + - {id: 72, cat: XXX, desc: "Horses"} + - {id: 71, cat: XXX, desc: "Dogs"} + - {id: 30, cat: XXX, desc: "Animals"} + + modes: + search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: ip_filtering + type: info + label: "IP Filtering" + default: "Kinorun allows only certain IP addressess. The error 403 Forbidden: Parse error means your IP was not accepted." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: takelogin1.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: td.embedded:has(div.error) + - selector: title:contains("403") + test: + path: / + selector: a[href="/logout.php"] + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 active, 1 incldead, 2 onlydead, 3 gold, 4 noseeds, 5 notverified + incldead: "{{ if .Config.freeleech }}3{{ else }}1{{ end }}" + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + + rows: + selector: table.embedded > tbody > tr:has(a[href^="details.php?id="]) + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + optional: true + default: 24 + filters: + - name: querystring + args: cat + title: + selector: a[href^="./torrent-"] + details: + selector: a[href^="details.php?id="] + attribute: href + _id: + selector: a[href^="details.php?id="] + attribute: href + filters: + - name: querystring + args: id + download: + text: "download.php?id={{ .Result._id }}" + description: + selector: a[href^="browse.php?cat="] img + attribute: alt + poster: + selector: td[onmouseover] + attribute: onmouseover + filters: + - name: regexp + args: src=([^\s]+) + date: + selector: td:nth-child(2) i + filters: + - name: append + args: " +03:00" # MSK + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + files: + selector: td:nth-child(3) + size: + selector: td:nth-child(5) + grabs: + selector: td:nth-child(6) + seeders: + selector: td:nth-child(7) + filters: + - name: split + args: ["|", 0] + leechers: + selector: td:nth-child(7) + filters: + - name: split + args: ["|", 1] + downloadvolumefactor: + case: + img[src="pic/freedownload.gif"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 +# TBDev diff --git a/config/prowlarr/Definitions/kinozal-magnet.yml b/config/prowlarr/Definitions/kinozal-magnet.yml new file mode 100644 index 0000000..d32859a --- /dev/null +++ b/config/prowlarr/Definitions/kinozal-magnet.yml @@ -0,0 +1,312 @@ +--- +id: kinozal-magnet +name: Kinozal (M) +description: "Kinozal is a RUSSIAN Semi-Private Torrent Tracker for MOVIES / TV / MUSIC. This indexer uses magnet links." +language: ru-RU +type: semi-private +encoding: windows-1251 +links: + - https://kinozal.tv/ + - https://kinozal.guru/ + - https://kinozal-guru.appspot.com/ +legacylinks: + - https://kinozal-tv.appspot.com/ + - http://kinozal.tv/ + +caps: + categorymappings: + # TV + - {id: 1001, cat: TV, desc: "All TV Shows"} + - {id: 45, cat: TV, desc: "Russian TV Series"} + - {id: 46, cat: TV, desc: "TV Series"} + # Movies + - {id: 1002, cat: Movies, desc: "All Movies"} + - {id: 8, cat: Movies, desc: "Movies - Comedy"} + - {id: 6, cat: Movies, desc: "Movies - Action / War"} + - {id: 15, cat: Movies, desc: "Movies - Thriller / Detective"} + - {id: 17, cat: Movies, desc: "Movies - Drama"} + - {id: 35, cat: Movies, desc: "Movies - Melodrama"} + - {id: 39, cat: Movies, desc: "Movies - Indian"} + - {id: 13, cat: Movies, desc: "Movies - Science Fiction"} + - {id: 14, cat: Movies, desc: "Movies - Fantasy"} + - {id: 24, cat: Movies, desc: "Movies - Horror / Mystery"} + - {id: 11, cat: Movies, desc: "Movies - Adventure"} + - {id: 10, cat: Movies, desc: "Movies - Russian Movies"} + - {id: 9, cat: Movies, desc: "Movies - Historical"} + - {id: 47, cat: Movies, desc: "Movies - Asian"} + - {id: 18, cat: Movies, desc: "Movies - Documentaries"} + - {id: 37, cat: Movies, desc: "Movies - Sport"} + - {id: 12, cat: Movies, desc: "Movies - Kids / Family"} + - {id: 7, cat: Movies, desc: "Movies - Classic"} + - {id: 48, cat: Movies, desc: "Movies - Concerts"} + - {id: 49, cat: Movies, desc: "Movies - Shows / TV Shows"} + - {id: 50, cat: Movies, desc: "Movies - TV Show Mir"} + - {id: 38, cat: Movies, desc: "Movies - Theatre, Opera, Ballet"} + - {id: 16, cat: Movies, desc: "Movies - Erotica"} + # Cartoons + - {id: 1003, cat: TV/Anime, desc: "All Cartoons/Anime"} + - {id: 21, cat: TV/Anime, desc: "Cartoons"} + - {id: 22, cat: TV/Anime, desc: "Cartoons - Russian"} + - {id: 20, cat: TV/Anime, desc: "Cartoons - Anime"} + # Music + - {id: 1004, cat: Audio, desc: "All Music"} + - {id: 3, cat: Audio, desc: "Music"} + - {id: 4, cat: Audio, desc: "Music - Russian"} + - {id: 5, cat: Audio, desc: "Music - Collections"} + - {id: 42, cat: Audio, desc: "Music - Classical"} + # Other + - {id: 1006, cat: TV/Other, desc: "Shows, Concerts, Sports"} + - {id: 2, cat: Audio/Audiobook, desc: "Other - AudioBooks"} + - {id: 1, cat: Audio/Video, desc: "Other - Music Video's"} + - {id: 23, cat: Console, desc: "Other - Games"} + - {id: 32, cat: PC, desc: "Other - Programs"} + - {id: 40, cat: Other, desc: "Other - Design / Graphics"} + - {id: 41, cat: Books, desc: "Other - Library"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + allowrawsearch: true + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: info_sid + type: info + label: How to get your SID + default: "This is only needed when using *.appspot.com mirrors, otherwise just leave blank. Access the tracker's Раздачи page in browser, and in the address bar you will see something like ?sid=abC1de2F. Those last 8 characters are your SID." + - name: sid + type: text + label: SID + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: striprussian + type: checkbox + label: Strip Russian Letters + default: true + - name: addrussian + type: checkbox + label: Add RUSSIAN to end of all titles to improve language detection by Sonarr and Radarr. Will cause English-only results to be misidentified. + default: true + - name: sort + type: select + label: Sort requested from site + default: 0 + options: + 0: created + 1: seeders + 3: size + - name: type + type: select + label: Order requested from site + default: 0 + options: + 0: desc + 1: asc + - name: info_magnets + type: info + label: Magnets + default: "This tracker limits the number of torrents a user can download each day without paying. This indexer uses magnet links to bypass that limit, however this doesn't include the passkey, so any download/upload is not recorded. To download with torrents, use Kinozal." + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: div.bx1:has(div.red) + message: + selector: div.bx1 div.red + test: + path: my.php + selector: a[href*="logout.php?hash4u="] + +download: + before: + path: get_srv_details.php + inputs: + action: 2 + id: "{{ .DownloadUri.Query.id }}" + infohash: + usebeforeresponse: true + hash: + selector: li:first-child + filters: + - name: regexp + args: ([A-F|a-f|0-9]{40}) + title: + selector: div.b + filters: + - name: trim + - name: validfilename + +search: + paths: + # http://kinozal.tv/browse.php?s=lucifer+2017&g=0&c=0&v=0&d=0&w=0&t=0&f=0 + - path: browse.php + # required for the appspot domain. + followredirect: true + keywordsfilters: +# - name: diacritics # 8686 +# args: replace + - name: re_replace + args: ["[^a-zA-Zа-яА-Я0-9]+", " "] + - name: re_replace # S01 to 1 + args: ["(?i)\\bS0*(\\d+)\\b", "$1"] + - name: re_replace # S01E01 to 1 1 + args: ["(?i)\\bS0*(\\d+)E0*(\\d+)\\b", "$1 $2"] + inputs: + # multi cat is not supported. so defaulting to ALL + c: 0 + s: "{{ .Keywords }}" + # where 0 title, 1 person, 2 genres, 3 regular expression + g: 0 + # format 0 all + v: 0 + # released 0 all + d: 0 + # filter 0 all, 1 today, 2 yesterday, 3 in 3 days, 4 this week, 5 per month, 6-10 size rages, 11 gold, 12 silver + w: "{{ if .Config.freeleech }}11{{ else }}0{{ end }}" + t: "{{ .Config.sort }}" + f: "{{ .Config.type }}" + sid: "{{ if .Config.sid }}{{ .Config.sid }}{{ else }}{{ end }}" + + rows: + selector: table > tbody > tr:has(td.bt) + + fields: + title: + selector: td.nam a[href^="/details.php?"] + filters: + # normalize to SXXEYY format + - name: replace + args: ["Кураж-Бамбей", "kurazh"] + - name: replace + args: ["Кубик в Кубе", "Kubik"] + - name: replace + args: ["Кравец", "Kravec"] + - name: replace + args: ["Пифагор", "Pifagor"] + - name: replace + args: ["Невафильм", "Nevafilm"] + - name: replace + args: ["АП", "AVO"] + - name: replace + args: ["ЛО", "VO"] + - name: replace + args: ["ЛД", "DVO"] + - name: replace + args: ["ЛМ", "MVO"] + - name: replace + args: ["ПО", "VO"] + - name: replace + args: ["ПД", "DVO"] + - name: replace + args: ["ПМ", "MVO"] + - name: replace + args: ["ДБ", "DUB"] + - name: replace + args: ["СТ", "Sub"] + - name: re_replace + args: ["\\((\\d+-*\\d*)\\s+[Сс]езоны?:?\\s+(?:(\\d+-*\\d*)\\s+(?:[Сс]ери[ийя]|выпуски?(?:ов)?)(?:.*\\d+)?)?\\)(.*)\\s+((?:[12][0-9]{3}-?){1,})(.*)", "$3 - S$1E$2 - $4 $5"] + - name: re_replace + args: ["\\((?:(\\d+-*\\d*)\\s+(?:[Сс]ери[ийя]|выпуски?(?:ов)?)(?:.*\\d+)?)?\\)(.*)\\s+((?:[12][0-9]{3}-?){1,})(.*)", "$2 - E$1 - $3 $4"] + - name: re_replace + args: ["(\\([А-Яа-яЁё\\W]+\\))|(^[А-Яа-яЁё\\W\\d]+\\/ ((?:[12][0-9]{3}-?){1,}))|(^[А-Яа-яЁё\\W\\d]+\\/ )|([а-яА-ЯЁё \\-]+,+)|([а-яА-ЯЁё]+)", "{{ if .Config.striprussian }}{{ else }}$0{{ end }}"] + - name: replace + args: [" / ", " "] + - name: re_replace + args: ["^-\\s+", " "] + - name: re_replace + args: ["\\((\\d+[pi])\\)", "$1"] + - name: re_replace + args: ["(.*)(Blu-Ray\\s*(?:Disc|EUR|CEE)?)\\s*(\\d+[pi])", "$1 BR-DISK $3"] + - name: append + args: "{{ if .Config.addrussian }} - RUSSIAN{{ else }}{{ end }}" + - name: replace + args: ["-Rip", "Rip"] + - name: replace + args: ["WEB-DL", "WEBDL"] + - name: replace + args: ["WEBDLRip", "WEBDL"] + - name: replace + args: ["HDTVRip", "HDTV"] + details: + selector: td.nam a[href^="/details.php?"] + attribute: href + category: + selector: td.bt img + attribute: onclick + filters: + - name: re_replace + args: ["[^\\d+]", ""] + download: + selector: td.nam a[href^="/details.php?"] + attribute: href + filters: + - name: replace + args: ["details", "download"] + size: + selector: td:nth-child(4) + filters: + - name: replace + args: ["ТБ", "TB"] + - name: replace + args: ["ГБ", "GB"] + - name: replace + args: ["МБ", "MB"] + - name: replace + args: ["КБ", "KB"] + seeders: + selector: td:nth-child(5) + leechers: + selector: td:nth-child(6) + # dates come in four flavours: + date_day: + # now + # Today 09:10 + # Yesterday 13:04 + selector: td:nth-child(7):not(:contains(".")) + # auto adjusted by site account profile + optional: true + filters: + - name: replace + args: [" в", ""] + - name: replace + args: ["сейчас", "now"] + - name: replace + args: ["сегодня", "Today"] + - name: replace + args: ["вчера", "Yesterday"] + date_year: + # 24.10.2017 at 23:44 + selector: td:nth-child(7):contains(".") + # auto adjusted by site account profile + optional: true + filters: + - name: replace + args: [" в", ""] + - name: dateparse + args: "dd.MM.yyyy HH:mm" + date: + text: "{{ if or .Result.date_day .Result.date_year }}{{ or .Result.date_day .Result.date_year }}{{ else }}now{{ end }}" + downloadvolumefactor: + case: + a.r1: 0 # gold + a.r2: 0.5 # silver + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 +# engine n/a diff --git a/config/prowlarr/Definitions/kinozal.yml b/config/prowlarr/Definitions/kinozal.yml new file mode 100644 index 0000000..8abca66 --- /dev/null +++ b/config/prowlarr/Definitions/kinozal.yml @@ -0,0 +1,293 @@ +--- +id: kinozal +name: Kinozal +description: "Kinozal is a RUSSIAN Semi-Private Torrent Tracker for MOVIES / TV / MUSIC. This indexer uses torrents." +language: ru-RU +type: semi-private +encoding: windows-1251 +links: + - https://kinozal.tv/ + - https://kinozal.guru/ + - https://kinozal-guru.appspot.com/ +legacylinks: + - https://kinozal-tv.appspot.com/ + - http://kinozal.tv/ + +caps: + categorymappings: + # TV + - {id: 1001, cat: TV, desc: "All TV Shows"} + - {id: 45, cat: TV, desc: "Russian TV Series"} + - {id: 46, cat: TV, desc: "TV Series"} + # Movies + - {id: 1002, cat: Movies, desc: "All Movies"} + - {id: 8, cat: Movies, desc: "Movies - Comedy"} + - {id: 6, cat: Movies, desc: "Movies - Action / War"} + - {id: 15, cat: Movies, desc: "Movies - Thriller / Detective"} + - {id: 17, cat: Movies, desc: "Movies - Drama"} + - {id: 35, cat: Movies, desc: "Movies - Melodrama"} + - {id: 39, cat: Movies, desc: "Movies - Indian"} + - {id: 13, cat: Movies, desc: "Movies - Science Fiction"} + - {id: 14, cat: Movies, desc: "Movies - Fantasy"} + - {id: 24, cat: Movies, desc: "Movies - Horror / Mystery"} + - {id: 11, cat: Movies, desc: "Movies - Adventure"} + - {id: 10, cat: Movies, desc: "Movies - Russian Movies"} + - {id: 9, cat: Movies, desc: "Movies - Historical"} + - {id: 47, cat: Movies, desc: "Movies - Asian"} + - {id: 18, cat: Movies, desc: "Movies - Documentaries"} + - {id: 37, cat: Movies, desc: "Movies - Sport"} + - {id: 12, cat: Movies, desc: "Movies - Kids / Family"} + - {id: 7, cat: Movies, desc: "Movies - Classic"} + - {id: 48, cat: Movies, desc: "Movies - Concerts"} + - {id: 49, cat: Movies, desc: "Movies - Shows / TV Shows"} + - {id: 50, cat: Movies, desc: "Movies - TV Show Mir"} + - {id: 38, cat: Movies, desc: "Movies - Theatre, Opera, Ballet"} + - {id: 16, cat: Movies, desc: "Movies - Erotica"} + # Cartoons + - {id: 1003, cat: TV/Anime, desc: "All Cartoons/Anime"} + - {id: 21, cat: TV/Anime, desc: "Cartoons"} + - {id: 22, cat: TV/Anime, desc: "Cartoons - Russian"} + - {id: 20, cat: TV/Anime, desc: "Cartoons - Anime"} + # Music + - {id: 1004, cat: Audio, desc: "All Music"} + - {id: 3, cat: Audio, desc: "Music"} + - {id: 4, cat: Audio, desc: "Music - Russian"} + - {id: 5, cat: Audio, desc: "Music - Collections"} + - {id: 42, cat: Audio, desc: "Music - Classical"} + # Other + - {id: 1006, cat: TV/Other, desc: "Shows, Concerts, Sports"} + - {id: 2, cat: Audio/Audiobook, desc: "Other - AudioBooks"} + - {id: 1, cat: Audio/Video, desc: "Other - Music Video's"} + - {id: 23, cat: Console, desc: "Other - Games"} + - {id: 32, cat: PC, desc: "Other - Programs"} + - {id: 40, cat: Other, desc: "Other - Design / Graphics"} + - {id: 41, cat: Books, desc: "Other - Library"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + allowrawsearch: true + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: info_sid + type: info + label: How to get your SID + default: "This is only needed when using *.appspot.com mirrors, otherwise just leave blank. Access the tracker's Раздачи page in browser, and in the address bar you will see something like ?sid=abC1de2F. Those last 8 characters are your SID." + - name: sid + type: text + label: SID + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: striprussian + type: checkbox + label: Strip Russian Letters + default: true + - name: addrussian + type: checkbox + label: Add RUSSIAN to end of all titles to improve language detection by Sonarr and Radarr. Will cause English-only results to be misidentified. + default: true + - name: sort + type: select + label: Sort requested from site + default: 0 + options: + 0: created + 1: seeders + 3: size + - name: type + type: select + label: Order requested from site + default: 0 + options: + 0: desc + 1: asc + - name: info_torrent + type: info + label: Torrents + default: "This tracker limits the number of torrents a user can download each day without paying. This indexer uses torrent files with the user's passkey, so any download/upload is recorded. If you receive errors when downloading torrent files, you may have reached this limit. To bypass the limit with magnet links, use Kinozal (M)." + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: div.bx1:has(div.red) + message: + selector: div.bx1 div.red + test: + path: my.php + selector: a[href*="logout.php?hash4u="] + +search: + paths: + # http://kinozal.tv/browse.php?s=lucifer+2017&g=0&c=0&v=0&d=0&w=0&t=0&f=0 + - path: browse.php + # required for the appspot domain. + followredirect: true + keywordsfilters: +# - name: diacritics # 8686 +# args: replace + - name: re_replace + args: ["[^a-zA-Zа-яА-Я0-9]+", " "] + - name: re_replace # S01 to 1 + args: ["(?i)\\bS0*(\\d+)\\b", "$1"] + - name: re_replace # S01E01 to 1 1 + args: ["(?i)\\bS0*(\\d+)E0*(\\d+)\\b", "$1 $2"] + inputs: + # multi cat is not supported. so defaulting to ALL + c: 0 + s: "{{ .Keywords }}" + # where 0 title, 1 person, 2 genres, 3 regular expression + g: 0 + # format 0 all + v: 0 + # released 0 all + d: 0 + # filter 0 all, 1 today, 2 yesterday, 3 in 3 days, 4 this week, 5 per month, 6-10 size rages, 11 gold, 12 silver + w: "{{ if .Config.freeleech }}11{{ else }}0{{ end }}" + t: "{{ .Config.sort }}" + f: "{{ .Config.type }}" + sid: "{{ if .Config.sid }}{{ .Config.sid }}{{ else }}{{ end }}" + + rows: + selector: table > tbody > tr:has(td.bt) + + fields: + title: + selector: td.nam a[href^="/details.php?"] + filters: + # normalize to SXXEYY format + - name: replace + args: ["Кураж-Бамбей", "kurazh"] + - name: replace + args: ["Кубик в Кубе", "Kubik"] + - name: replace + args: ["Кравец", "Kravec"] + - name: replace + args: ["Пифагор", "Pifagor"] + - name: replace + args: ["Невафильм", "Nevafilm"] + - name: replace + args: ["АП", "AVO"] + - name: replace + args: ["ЛО", "VO"] + - name: replace + args: ["ЛД", "DVO"] + - name: replace + args: ["ЛМ", "MVO"] + - name: replace + args: ["ПО", "VO"] + - name: replace + args: ["ПД", "DVO"] + - name: replace + args: ["ПМ", "MVO"] + - name: replace + args: ["ДБ", "DUB"] + - name: replace + args: ["СТ", "Sub"] + - name: re_replace + args: ["\\((\\d+-*\\d*)\\s+[Сс]езоны?:?\\s+(?:(\\d+-*\\d*)\\s+(?:[Сс]ери[ийя]|выпуски?(?:ов)?)(?:.*\\d+)?)?\\)(.*)\\s+((?:[12][0-9]{3}-?){1,})(.*)", "$3 - S$1E$2 - $4 $5"] + - name: re_replace + args: ["\\((?:(\\d+-*\\d*)\\s+(?:[Сс]ери[ийя]|выпуски?(?:ов)?)(?:.*\\d+)?)?\\)(.*)\\s+((?:[12][0-9]{3}-?){1,})(.*)", "$2 - E$1 - $3 $4"] + - name: re_replace + args: ["(\\([А-Яа-яЁё\\W]+\\))|(^[А-Яа-яЁё\\W\\d]+\\/ ((?:[12][0-9]{3}-?){1,}))|(^[А-Яа-яЁё\\W\\d]+\\/ )|([а-яА-ЯЁё \\-]+,+)|([а-яА-ЯЁё]+)", "{{ if .Config.striprussian }}{{ else }}$0{{ end }}"] + - name: replace + args: [" / ", " "] + - name: re_replace + args: ["^-\\s+", " "] + - name: re_replace + args: ["\\((\\d+[pi])\\)", "$1"] + - name: re_replace + args: ["(.*)(Blu-Ray\\s*(?:Disc|EUR|CEE)?)\\s*(\\d+[pi])", "$1 BR-DISK $3"] + - name: append + args: "{{ if .Config.addrussian }} - RUSSIAN{{ else }}{{ end }}" + - name: replace + args: ["-Rip", "Rip"] + - name: replace + args: ["WEB-DL", "WEBDL"] + - name: replace + args: ["WEBDLRip", "WEBDL"] + - name: replace + args: ["HDTVRip", "HDTV"] + details: + selector: td.nam a[href^="/details.php?"] + attribute: href + category: + selector: td.bt img + attribute: onclick + filters: + - name: re_replace + args: ["[^\\d+]", ""] + download: + selector: td.nam a[href^="/details.php?"] + attribute: href + filters: + - name: replace + args: ["details", "download"] + size: + selector: td:nth-child(4) + filters: + - name: replace + args: ["ТБ", "TB"] + - name: replace + args: ["ГБ", "GB"] + - name: replace + args: ["МБ", "MB"] + - name: replace + args: ["КБ", "KB"] + seeders: + selector: td:nth-child(5) + leechers: + selector: td:nth-child(6) + # dates come in four flavours: + date_day: + # now + # Today 09:10 + # Yesterday 13:04 + selector: td:nth-child(7):not(:contains(".")) + # auto adjusted by site account profile + optional: true + filters: + - name: replace + args: [" в", ""] + - name: replace + args: ["сейчас", "now"] + - name: replace + args: ["сегодня", "Today"] + - name: replace + args: ["вчера", "Yesterday"] + date_year: + # 24.10.2017 at 23:44 + selector: td:nth-child(7):contains(".") + # auto adjusted by site account profile + optional: true + filters: + - name: replace + args: [" в", ""] + - name: dateparse + args: "dd.MM.yyyy HH:mm" + date: + text: "{{ if or .Result.date_day .Result.date_year }}{{ or .Result.date_day .Result.date_year }}{{ else }}now{{ end }}" + downloadvolumefactor: + case: + a.r1: 0 # gold + a.r2: 0.5 # silver + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 +# engine n/a diff --git a/config/prowlarr/Definitions/knaben.yml b/config/prowlarr/Definitions/knaben.yml new file mode 100644 index 0000000..4539e50 --- /dev/null +++ b/config/prowlarr/Definitions/knaben.yml @@ -0,0 +1,160 @@ +--- +id: knaben +name: Knaben +description: "Knaben is a Public torrent meta-search engine" +language: en-US +type: public +encoding: UTF-8 +links: + - https://knaben.eu/ + +caps: + categorymappings: + - {id: 1000000, cat: Audio, desc: "Audio"} + - {id: 1001000, cat: Audio/MP3, desc: "MP3"} + - {id: 1002000, cat: Audio/Lossless, desc: "Lossless"} + - {id: 1003000, cat: Audio/Audiobook, desc: "Audiobook"} + - {id: 1004000, cat: Audio/Video, desc: "Audio Video"} + - {id: 1005000, cat: Audio/Other, desc: "Radio"} + - {id: 1006000, cat: Audio/Other, desc: "Audio Other"} + - {id: 2000000, cat: TV, desc: "TV"} + - {id: 2001000, cat: TV/HD, desc: "TV HD"} + - {id: 2002000, cat: TV/SD, desc: "TV SD"} + - {id: 2003000, cat: TV/UHD, desc: "TV UHD"} + - {id: 2004000, cat: TV/Documentary, desc: "Documentary"} + - {id: 2005000, cat: TV/Foreign, desc: "TV Foreign"} + - {id: 2006000, cat: TV/Sport, desc: "Sport"} + - {id: 2007000, cat: TV/Other, desc: "Cartoon"} + - {id: 2008000, cat: TV/Other, desc: "TV Other"} + - {id: 3000000, cat: Movies, desc: "Movies"} + - {id: 3001000, cat: Movies/HD, desc: "Movies HD"} + - {id: 3002000, cat: Movies/SD, desc: "Movies SD"} + - {id: 3003000, cat: Movies/UHD, desc: "Movies UHD"} + - {id: 3004000, cat: Movies/DVD, desc: "Movies DVD"} + - {id: 3005000, cat: Movies/Foreign, desc: "Movies Foreign"} + - {id: 3006000, cat: Movies/Foreign, desc: "Movies Bollywood"} + - {id: 3007000, cat: Movies/3D, desc: "Movies 3D"} + - {id: 3008000, cat: Movies/Other, desc: "Movies Other"} + - {id: 4000000, cat: PC, desc: "PC"} + - {id: 4001000, cat: PC/Games, desc: "Games"} + - {id: 4002000, cat: PC/0day, desc: "Software"} + - {id: 4003000, cat: PC/Mac, desc: "Mac"} + - {id: 4004000, cat: PC/ISO, desc: "Unix"} + - {id: 5000000, cat: XXX, desc: "XXX"} + - {id: 5001000, cat: XXX/x264, desc: "XXX Video"} + - {id: 5002000, cat: XXX/ImageSet, desc: "XXX ImageSet"} + - {id: 5003000, cat: XXX/Other, desc: "XXX Games"} + - {id: 5004000, cat: XXX/Other, desc: "XXX Hentai"} + - {id: 5005000, cat: XXX/Other, desc: "XXX Other"} + - {id: 6000000, cat: TV/Anime, desc: "Anime"} + - {id: 6001000, cat: TV/Anime, desc: "Anime Subbed"} + - {id: 6002000, cat: TV/Anime, desc: "Anime Dubbed"} + - {id: 6003000, cat: TV/Anime, desc: "Anime Dual audio"} + - {id: 6004000, cat: TV/Anime, desc: "Anime Raw"} + - {id: 6005000, cat: Audio/Video, desc: "Music Video"} + - {id: 6006000, cat: Books/Other, desc: "Literature"} + - {id: 6007000, cat: Audio/Other, desc: "Music"} + - {id: 6008000, cat: TV/Anime, desc: "Anime non-english translated"} + - {id: 7000000, cat: Console, desc: "Console"} + - {id: 7001000, cat: Console/PS4, desc: "PS4"} + - {id: 7002000, cat: Console/PS3, desc: "PS3"} + - {id: 7003000, cat: Console/PS3, desc: "PS2"} + - {id: 7004000, cat: Console/PS3, desc: "PS1"} + - {id: 7005000, cat: Console/PS Vita, desc: "PS Vita"} + - {id: 7006000, cat: Console/PSP, desc: "PSP"} + - {id: 7007000, cat: Console/XBox 360, desc: "Xbox 360"} + - {id: 7008000, cat: Console/XBox, desc: "Xbox"} + - {id: 7009000, cat: Console/NDS, desc: "Switch"} + - {id: 7010000, cat: Console/NDS, desc: "NDS"} + - {id: 7011000, cat: Console/Wii, desc: "Wii"} + - {id: 7012000, cat: Console/WiiU, desc: "WiiU"} + - {id: 7013000, cat: Console/3DS, desc: "3DS"} + - {id: 7014000, cat: Console/Wii, desc: "GameCube"} + - {id: 7015000, cat: Console/Other, desc: "Other"} + - {id: 8000000, cat: PC/Mobile-Other, desc: "Mobile"} + - {id: 8001000, cat: PC/Mobile-Android, desc: "Android"} + - {id: 8002000, cat: PC/Mobile-iOS, desc: "IOS"} + - {id: 8003000, cat: PC/Mobile-Other, desc: "PC Other"} + - {id: 9000000, cat: Books, desc: "Books"} + - {id: 9001000, cat: Books/EBook, desc: "EBooks"} + - {id: 9002000, cat: Books/Comics, desc: "Comics"} + - {id: 9003000, cat: Books/Mags, desc: "Magazines"} + - {id: 9004000, cat: Books/Technical, desc: "Technical"} + - {id: 9005000, cat: Books/Other, desc: "Books Other"} + - {id: 10000000, cat: Other, desc: "Other"} + - {id: 10001000, cat: Other/Misc, desc: "Other Misc"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: sort + type: select + label: Sort requested from site + default: date + options: + date: created + seeders: seeders + bytes: size + title: title + - name: type + type: select + label: Order requested from site + default: + + options: + "+": desc + "-": asc + +search: + paths: + - path: "{{ if .Keywords }}search/{{ .Keywords }}{{ else }}browse{{ end }}/0/1/{{ .Config.type }}{{ .Config.sort }}" + + rows: + selector: tr[title^="Cached "] + + fields: + category: + selector: a[href^="/browse/"]:last-child + attribute: href + filters: + - name: split + args: ["/", 2] + # replace subcat with cat: 1001069 > 1001000 + - name: re_replace + args: ["(\\d{3})$", "000"] + title: + selector: td:nth-child(2) a + details: + selector: td:last-child a + attribute: href + download: + selector: td:nth-child(2) a + attribute: href + description: + selector: td:last-child a + filters: + - name: prepend + args: "Source: " + date: + selector: td:nth-child(4) + attribute: title + filters: + - name: append + args: " +01:00" # CET + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + size: + selector: td:nth-child(3) + seeders: + selector: td:nth-child(5) + leechers: + selector: td:nth-child(6) + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/korsar.yml b/config/prowlarr/Definitions/korsar.yml new file mode 100644 index 0000000..3c283e8 --- /dev/null +++ b/config/prowlarr/Definitions/korsar.yml @@ -0,0 +1,617 @@ +--- +id: korsar +name: Korsar +description: "Korsar is a RUSSIAN Private Torrent Tracker for MOVIES / TV / GENERAL" +language: ru-RU +type: private +encoding: UTF-8 +links: + - http://filbi1976.org/ +legacylinks: + - https://korsar.tv/ + - http://korsar.info/ + - https://korsar.info/ + - http://korsar.tv/ + - http://korsar.rest/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Все Кинофильмы"} + - {id: 153, cat: Movies, desc: "Кинофильмы - Кино времён СССР"} + - {id: 656, cat: Movies, desc: "Кинофильмы - Детские фильмы времён СССР"} + - {id: 186, cat: Movies/HD, desc: "Кинофильмы - Кино времён СССР (HD Video)"} + - {id: 657, cat: Movies/HD, desc: "Кинофильмы - Детские фильмы времён СССР (HD Video)"} + - {id: 49, cat: Movies, desc: "Кинофильмы - Наше современное кино"} + - {id: 203, cat: Movies/HD, desc: "Кинофильмы - Наше современное кино (HD Video)"} + - {id: 268, cat: Movies, desc: "Кинофильмы - Зарубежное кино"} + - {id: 654, cat: Movies, desc: "Кинофильмы - Классика зарубежного кино (фильмы до 1980 года)"} + - {id: 658, cat: Movies, desc: "Кинофильмы - Зарубежное кино (1981-1990)"} + - {id: 659, cat: Movies, desc: "Кинофильмы - Зарубежное кино (1991-2000)"} + - {id: 660, cat: Movies, desc: "Кинофильмы - Зарубежное кино (2001-2010)"} + - {id: 661, cat: Movies, desc: "Кинофильмы - Зарубежное кино (2011-2022)"} + - {id: 676, cat: Movies, desc: "Кинофильмы - Зарубежное кино (Сборники фильмов)"} + - {id: 913, cat: Movies, desc: "Кинофильмы - Зарубежное кино (КПК Video)"} + - {id: 205, cat: Movies/HD, desc: "Кинофильмы - Зарубежное кино (HD Video)"} + - {id: 655, cat: Movies/HD, desc: "Кинофильмы - Классика зарубежного кино (фильмы до 1980 года / HD Video)"} + - {id: 662, cat: Movies/HD, desc: "Кинофильмы - Зарубежное кино (1981-1990 / HD Video)"} + - {id: 663, cat: Movies/HD, desc: "Кинофильмы - Зарубежное кино (1991-2000 / HD Video)"} + - {id: 664, cat: Movies/HD, desc: "Кинофильмы - Зарубежное кино (2001-2010 / HD Video)"} + - {id: 665, cat: Movies/HD, desc: "Кинофильмы - Зарубежное кино (2011-2022 / HD Video)"} + - {id: 666, cat: Movies/HD, desc: "Кинофильмы - Зарубежное кино (Сборники фильмов / HD Video)"} + - {id: 922, cat: Movies, desc: "Кинофильмы - Фильмы Ближнего Зарубежья"} + - {id: 923, cat: Movies/HD, desc: "Кинофильмы - Фильмы Ближнего Зарубежья (HD Video)"} + - {id: 838, cat: Movies/UHD, desc: "Кинофильмы - Фильмы 4К (UHD 4K)"} + - {id: 848, cat: Movies, desc: "Кинофильмы - Фильмы HEVC (HEVC Video)"} + - {id: 837, cat: Movies/3D, desc: "Кинофильмы - Фильмы 3D (3D Video)"} + + - {id: 33, cat: Movies, desc: "Все Сериалы"} + - {id: 35, cat: TV, desc: "Сериалы - Отечественные сериалы"} + - {id: 266, cat: TV/HD, desc: "Сериалы - Отечественные сериалы (HD Video)"} + - {id: 34, cat: TV, desc: "Сериалы - Зарубежные сериалы"} + - {id: 267, cat: TV/HD, desc: "Сериалы - Зарубежные сериалы (HD Video)"} + - {id: 916, cat: TV, desc: "Сериалы - ближнего зарубежья"} + - {id: 917, cat: TV/HD, desc: "Сериалы ближнего зарубежья (HD Video)"} + - {id: 800, cat: TV, desc: "Сериалы - Зарубежные сериалы (Сборники сезонов)"} + - {id: 801, cat: TV/HD, desc: "Сериалы - Зарубежные сериалы (Сборники сезонов / HD Video)"} + - {id: 906, cat: TV/UHD, desc: "Сериалы - Зарубежные сериалы (4K)"} + - {id: 910, cat: TV, desc: "Сериалы - Зарубежные сериалы (HEVC Video)"} + + - {id: 46, cat: TV/Documentary, desc: "Все Документалистика"} + - {id: 77, cat: TV/Documentary, desc: "Документалистика - Документальные фильмы и телепередачи"} + - {id: 84, cat: TV/Documentary, desc: "Документалистика - Биографии. Личности и кумиры"} + - {id: 92, cat: TV/Documentary, desc: "Документалистика - Космос"} + - {id: 86, cat: TV/Documentary, desc: "Документалистика - Флора и фауна"} + - {id: 85, cat: TV/Documentary, desc: "Документалистика - Научно-популярные фильмы"} + - {id: 148, cat: TV/Documentary, desc: "Документалистика - Познавательные фильмы"} + - {id: 187, cat: TV/Documentary, desc: "Документалистика - Путешествия и туризм"} + - {id: 88, cat: TV/Documentary, desc: "Документалистика - BBC, Discovery, National Geographic"} + - {id: 692, cat: TV/Documentary, desc: "Документалистика - Военное дело"} + - {id: 91, cat: TV/Documentary, desc: "Документалистика - История: Древний мир / Античность / Средневековье"} + - {id: 693, cat: TV/Documentary, desc: "Документалистика - КВН, Ток-Шоу, ТВ-Шоу"} + - {id: 694, cat: TV/Documentary, desc: "Документалистика - Интеллектуальные игры и викторины"} + - {id: 696, cat: TV/Documentary, desc: "Документалистика - Сатирики, юмористы, приколы и юмор"} + - {id: 700, cat: TV/Documentary, desc: "Документалистика - Естествознание, наука и техника"} + - {id: 698, cat: TV/Documentary, desc: "Документалистика - Аудио и видео ролики (Приколы и юмор)"} + - {id: 47, cat: TV/Documentary, desc: "Документалистика - Документальные фильмы и телепередачи (HD Video)"} + - {id: 283, cat: TV/Documentary, desc: "Документалистика - Биографии. Личности и кумиры (HD Video)"} + - {id: 290, cat: TV/Documentary, desc: "Документалистика - Военное дело (HD Video)"} + - {id: 291, cat: TV/Documentary, desc: "Документалистика - Естествознание, наука и техника (HD Video)"} + - {id: 288, cat: TV/Documentary, desc: "Документалистика - Путешествия и туризм (HD Video)"} + - {id: 285, cat: TV/Documentary, desc: "Документалистика - Флора и фауна (HD Video)"} + - {id: 284, cat: TV/Documentary, desc: "Документалистика - Космос (HD Video)"} + - {id: 573, cat: TV/Documentary, desc: "Документалистика - Познавательные фильмы (HD Video)"} + - {id: 286, cat: TV/Documentary, desc: "Документалистика - Научно-популярные фильмы (HD Video)"} + - {id: 289, cat: TV/Documentary, desc: "Документалистика - BBC, Discovery, National Geographic (HD Video)"} + - {id: 690, cat: TV/Documentary, desc: "Документалистика - КВН, ТВ-Шоу, Ток-Шоу (HD Video)"} + - {id: 695, cat: TV/Documentary, desc: "Документалистика - Интеллектуальные игры и викторины (HD Video)"} + - {id: 697, cat: TV/Documentary, desc: "Документалистика - Сатирики, юмористы, приколы и юмор (HD Video)"} + - {id: 701, cat: TV/Documentary, desc: "Документалистика - История: Древний мир / Античность / Средневековье (HD Video)"} + - {id: 699, cat: TV/Documentary, desc: "Документалистика - Аудио и видео ролики (Приколы и юмор / HD Video)"} + - {id: 689, cat: TV/Documentary, desc: "Документалистика - Документальные (3D Video)"} + - {id: 893, cat: TV/Documentary, desc: "Документалистика - Документальные (4К)"} + - {id: 79, cat: TV/Documentary, desc: "Документалистика - Вера и религия"} + - {id: 98, cat: TV/Documentary, desc: "Документалистика - Христианство"} + - {id: 99, cat: TV/Documentary, desc: "Документалистика - Ислам"} + - {id: 100, cat: TV/Documentary, desc: "Документалистика - Религии Индии, Тибета и Восточной Азии"} + + - {id: 73, cat: TV/Anime, desc: "Все Мультипликация"} + - {id: 74, cat: TV/Anime, desc: "Мультипликация - Мультфильмы"} + - {id: 292, cat: TV/Anime, desc: "Мультипликация - Зарубежные мультфильмы (HD Video)"} + - {id: 874, cat: TV/Anime, desc: "Мультипликация - Отечественные мультфильмы (HD Video)"} + - {id: 299, cat: TV/Anime, desc: "Мультипликация - Зарубежные мультфильмы"} + - {id: 297, cat: TV/Anime, desc: "Мультипликация - Отечественные мультфильмы"} + - {id: 301, cat: TV/Anime, desc: "Мультипликация - Сборники зарубежных мультфильмов (HD Video)"} + - {id: 876, cat: TV/Anime, desc: "Мультипликация - Сборники зарубежных мультфильмов"} + - {id: 877, cat: TV/Anime, desc: "Мультипликация - Сборники отечественных мультфильмов (HD Video)"} + - {id: 875, cat: TV/Anime, desc: "Мультипликация - Сборники отечественных мультфильмов<"} + - {id: 294, cat: TV/Anime, desc: "Мультипликация - Отечественные (DVD)"} + - {id: 295, cat: TV/Anime, desc: "Мультипликация - Иностранные (DVD)"} + - {id: 688, cat: TV/Anime, desc: "Мультипликация - Мультфильмы (3D Video)"} + - {id: 807, cat: TV/Anime, desc: "Мультипликация - Мультфильмы (60 FPS)"} + - {id: 841, cat: TV/Anime, desc: "Мультипликация - Мультфильмы (UHD 4K)"} + - {id: 867, cat: TV/Anime, desc: "Мультипликация - Мультфильмы (HEVC Video)"} + - {id: 75, cat: TV/Anime, desc: "Мультипликация - Мультсериалы"} + - {id: 872, cat: TV/Anime, desc: "Мультипликация - Зарубежные мультсериалы (HD Video)"} + - {id: 878, cat: TV/Anime, desc: "Мультипликация - Зарубежные мультсериалы"} + - {id: 879, cat: TV/Anime, desc: "Мультипликация - Отечественные мультсериалы (HD Video)"} + - {id: 880, cat: TV/Anime, desc: "Мультипликация - Отечественные мультсериалы"} + - {id: 76, cat: TV/Anime, desc: "Мультипликация - Аниме"} + - {id: 302, cat: TV/Anime, desc: "Мультипликация - Аниме"} + - {id: 303, cat: TV/Anime, desc: "Мультипликация - Аниме (DVD)"} + - {id: 304, cat: TV/Anime, desc: "Мультипликация - Аниме (HD Video)"} + + - {id: 108, cat: TV, desc: "Все Театр"} + - {id: 109, cat: TV, desc: "Бенефис. Мастера искусств отечественного Театра и Кино"} + - {id: 130, cat: TV, desc: "Театр - Фильмы-спектакли, театральные постановки"} + + - {id: 319, cat: TV/Sport, desc: "Все Спорт"} + - {id: 320, cat: TV/Sport, desc: "Спорт - Спортивные турниры, фильмы и передачи"} + - {id: 321, cat: TV/Sport, desc: "Спорт - Автоспорт"} + - {id: 322, cat: TV/Sport, desc: "Спорт - Мотоспорт"} + - {id: 323, cat: TV/Sport, desc: "Спорт - Формула 1 "} + - {id: 324, cat: TV/Sport, desc: "Спорт - Велоспорт"} + - {id: 325, cat: TV/Sport, desc: "Спорт - Волейбол/Гандбол"} + - {id: 326, cat: TV/Sport, desc: "Спорт - Бокс"} + - {id: 327, cat: TV/Sport, desc: "Спорт - Единоборства"} + - {id: 328, cat: TV/Sport, desc: "Спорт - Американский футбол"} + - {id: 329, cat: TV/Sport, desc: "Спорт - Регби"} + - {id: 330, cat: TV/Sport, desc: "Спорт - Бейсбол"} + - {id: 331, cat: TV/Sport, desc: "Спорт - Теннис"} + - {id: 332, cat: TV/Sport, desc: "Спорт - Биатлон"} + - {id: 333, cat: TV/Sport, desc: "Спорт - Фигурное катание"} + - {id: 334, cat: TV/Sport, desc: "Спорт - Экстрим"} + - {id: 335, cat: TV/Sport, desc: "Спорт - Спорт (видео)"} + - {id: 338, cat: TV/Sport, desc: "Спорт - Футбол"} + - {id: 680, cat: TV/Sport, desc: "Спорт - Чемпионаты футбольных держав (Англия, Германия, Испания, Италия, Франция)"} + - {id: 681, cat: TV/Sport, desc: "Спорт - Еврокубки"} + - {id: 682, cat: TV/Sport, desc: "Спорт - Чемпионаты Европы"} + - {id: 683, cat: TV/Sport, desc: "Спорт - Чемпионаты мира"} + - {id: 684, cat: TV/Sport, desc: "Спорт - Международные турниры"} + - {id: 685, cat: TV/Sport, desc: "Спорт - Обзорные и аналитические передачи"} + - {id: 686, cat: TV/Sport, desc: "Спорт - Россия"} + - {id: 339, cat: TV/Sport, desc: "Спорт - Баскетбол"} + - {id: 340, cat: TV/Sport, desc: "Спорт - Хоккей"} + + - {id: 32, cat: Audio, desc: "Все Музыка"} + - {id: 134, cat: Audio/Video, desc: "Музыка - Музыка (SD Video)"} + - {id: 544, cat: Audio/Video, desc: "Музыка - Концерты"} + - {id: 545, cat: Audio/Video, desc: "Музыка - Видеоклипы"} + - {id: 36, cat: Audio/Video, desc: "Музыка - Музыка (HD Video)"} + - {id: 542, cat: Audio/Video, desc: "Музыка - Концерты (HD Video)"} + - {id: 543, cat: Audio/Video, desc: "Музыка - Видеоклипы (HD Video)"} + - {id: 483, cat: Audio, desc: "Музыка - Популярная музыка"} + - {id: 490, cat: Audio, desc: "Музыка - Зарубежная поп-музыка (Lossless)"} + - {id: 546, cat: Audio/MP3, desc: "Музыка - Зарубежная поп-музыка (Lossy)"} + - {id: 620, cat: Audio/Lossless, desc: "Музыка - Eurodance, Euro-House, Technopop, Disco, Italo-Disco (Lossless)"} + - {id: 621, cat: Audio/MP3, desc: "Музыка - Eurodance, Euro-House, Technopop, Disco, Italo-Disco (Lossy)"} + - {id: 484, cat: Audio/Lossless, desc: "Музыка - Отечественная поп-музыка (Lossless)"} + - {id: 547, cat: Audio/MP3, desc: "Музыка - Отечественная поп-музыка (Lossy)"} + - {id: 523, cat: Audio/Lossless, desc: "Музыка - Зарубежные сборники (Lossless)"} + - {id: 548, cat: Audio/MP3, desc: "Музыка - Зарубежные сборники (Lossy)"} + - {id: 522, cat: Audio/Lossless, desc: "Музыка - Отечественные сборники (Lossless)"} + - {id: 498, cat: Audio/MP3, desc: "Музыка - Отечественные сборники (Lossy)"} + - {id: 788, cat: Audio, desc: "Музыка - Популярная музыка"} + - {id: 787, cat: Audio/MP3, desc: "Музыка - Сборники 50х50 (Lossy)"} + - {id: 505, cat: Audio, desc: "Музыка - Рок-музыка"} + - {id: 506, cat: Audio/Lossless, desc: "Музыка - Зарубежный Rock (Lossless)"} + - {id: 537, cat: Audio/MP3, desc: "Музыка - Зарубежный Rock (Lossy)"} + - {id: 507, cat: Audio/Lossless, desc: "Музыка - Зарубежный Metal (Lossless)"} + - {id: 538, cat: Audio/MP3, desc: "Музыка - Зарубежный Metal (Lossy)"} + - {id: 588, cat: Audio/Lossless, desc: "Музыка - Зарубежные Alternative, Punk, Independent (Lossless)"} + - {id: 589, cat: Audio/MP3, desc: "Музыка - Зарубежные Alternative, Punk, Independent (Lossy)"} + - {id: 539, cat: Audio/MP3, desc: "Музыка - Отечественный Рок (Lossy)"} + - {id: 541, cat: Audio/MP3, desc: "Музыка - Сборники (Lossy)"} + - {id: 524, cat: Audio, desc: "Музыка - Блюзовая и Джазовая музыка"} + - {id: 527, cat: Audio/Lossless, desc: "Музыка - Зарубежный блюз (Lossless)"} + - {id: 528, cat: Audio/MP3, desc: "Музыка - Зарубежный блюз (Lossy)"} + - {id: 642, cat: Audio/Lossless, desc: "Музыка - Зарубежный джаз (Lossless)"} + - {id: 643, cat: Audio/MP3, desc: "Музыка - Зарубежный джаз (Lossy)"} + - {id: 529, cat: Audio/Lossless, desc: "Музыка - Сборники (Lossless)"} + - {id: 530, cat: Audio/MP3, desc: "Музыка - Сборники (Lossy)"} + - {id: 531, cat: Audio, desc: "Музыка - New Country"} + - {id: 532, cat: Audio/Lossless, desc: "Музыка - Зарубежное New Country (Lossless)"} + - {id: 533, cat: Audio/MP3, desc: "Музыка - Зарубежное New Country (Lossy)"} + - {id: 534, cat: Audio/Lossless, desc: "Музыка - Сборники (Lossless)"} + - {id: 535, cat: Audio/MP3, desc: "Музыка - Сборники (Lossy)"} + - {id: 551, cat: Audio, desc: "Музыка - Электронная музыка"} + - {id: 552, cat: Audio/Lossless, desc: "Музыка - Chillout, Lounge, Downtempo, Trip-Hop (Lossless) "} + - {id: 553, cat: Audio/MP3, desc: "Музыка - Chillout, Lounge, Downtempo, Trip-Hop (Lossy)"} + - {id: 624, cat: Audio/Lossless, desc: "Музыка - Drum & ass, Jungle, Breakbeat, Dubstep, IDM, Trap (Lossless)"} + - {id: 623, cat: Audio/MP3, desc: "Музыка - Drum & ass, Jungle, Breakbeat, Dubstep, IDM, Trap (Lossy)"} + - {id: 785, cat: Audio/Lossless, desc: "Музыка - Trance, Goa Trance, Psy-Trance, PsyChill, Ambient, Full On, Dub (Lossless)"} + - {id: 786, cat: Audio/MP3, desc: "Музыка - Trance, Goa Trance, Psy-Trance, PsyChill, Ambient, Full On, Dub (Lossy)"} + - {id: 571, cat: Audio/Lossless, desc: "Музыка - Progressive Trance, Progressive House, Tech-House, Deep-House, Electro, Electro-House, House (Lossless)"} + - {id: 572, cat: Audio/MP3, desc: "Музыка - Progressive Trance, Progressive House, Tech-House, Deep-House, Electro, Electro-House, House (Lossy)"} + - {id: 843, cat: Audio/Lossless, desc: "Музыка - Dj-миксы и радиошоу, Dance, Club, Hands Up (Lossless)"} + - {id: 844, cat: Audio/MP3, desc: "Музыка - Dj-миксы и радиошоу, Dance, Club, Hands Up (Lossy)"} + - {id: 846, cat: Audio/Lossless, desc: "Музыка - Darkwave, Dark Electro, Aggrotech, Industrial (Lossless)"} + - {id: 845, cat: Audio/MP3, desc: "Музыка - Darkwave, Dark Electro, Aggrotech, Industrial (Lossy)"} + - {id: 644, cat: Audio/Lossless, desc: "Музыка - Сборники (Lossless)"} + - {id: 645, cat: Audio/MP3, desc: "Музыка - Сборники (Lossy)"} + - {id: 771, cat: Audio, desc: "Музыка - Psychedelic Trance"} + - {id: 772, cat: Audio/Lossless, desc: "Музыка - Psychedelic Trance (Lossless)"} + - {id: 773, cat: Audio/MP3, desc: "Музыка - Psychedelic Trance (Lossy)"} + - {id: 344, cat: Audio, desc: "Музыка - Рэп, Хип-Хоп, R'n'B"} + - {id: 556, cat: Audio/Lossless, desc: "Музыка - Зарубежный (Lossless)"} + - {id: 348, cat: Audio/MP3, desc: "Музыка - Зарубежный (Lossy)"} + - {id: 557, cat: Audio/Lossless, desc: "Музыка - Отечественный (Lossless)"} + - {id: 345, cat: Audio/MP3, desc: "Музыка - Отечественный (Lossy)"} + - {id: 633, cat: Audio/Lossless, desc: "Музыка - Сборники (Lossless)"} + - {id: 634, cat: Audio/MP3, desc: "Музыка - Сборники (Lossy)"} + - {id: 622, cat: Audio, desc: "Музыка - Reggae, Ska, Dub"} + - {id: 629, cat: Audio/Lossless, desc: "Музыка - Зарубежный (Lossless)"} + - {id: 630, cat: Audio/MP3, desc: "Музыка - Зарубежный (Lossy)"} + - {id: 635, cat: Audio/Lossless, desc: "Музыка - Отечественный (Lossless)"} + - {id: 636, cat: Audio/MP3, desc: "Музыка - Отечественный (Lossy)"} + - {id: 631, cat: Audio/Lossless, desc: "Музыка - Сборники (Lossless)"} + - {id: 632, cat: Audio/MP3, desc: "Музыка - Сборники (Lossy)"} + - {id: 387, cat: Audio, desc: "Музыка - Музыка других жанров"} + - {id: 560, cat: Audio/Lossless, desc: "Музыка - Зарубежная музыка других жанров (Lossless)"} + - {id: 561, cat: Audio/MP3, desc: "Музыка - Зарубежная музыка других жанров (Lossy)"} + - {id: 570, cat: Audio/Lossless, desc: "Музыка - Сборники смешанных жанров (lossless)"} + - {id: 569, cat: Audio/MP3, desc: "Музыка - Сборники смешанных жанров (lossy)"} + - {id: 889, cat: Audio/Lossless, desc: "Музыка - Сборники песен для детей (Lossless)"} + - {id: 562, cat: Audio/MP3, desc: "Музыка - Сборники песен для детей (Lossy)"} + - {id: 362, cat: Audio, desc: "Музыка - Саундтреки"} + - {id: 555, cat: Audio/Lossless, desc: "Музыка - Саундтреки к зарубежным фильмам (Lossless)"} + - {id: 368, cat: Audio/MP3, desc: "Музыка - Саундтреки к зарубежным фильмам (Lossy)"} + - {id: 554, cat: Audio/Lossless, desc: "Музыка - Саундтреки к отечественным фильмам (Lossless)"} + - {id: 366, cat: Audio/MP3, desc: "Музыка - Саундтреки к отечественным фильмам (Lossy)"} + - {id: 376, cat: Audio, desc: "Музыка - Шансон, Авторская и Военная песня"} + - {id: 558, cat: Audio/Lossless, desc: "Музыка - Отечественный шансон (Lossless)"} + - {id: 378, cat: Audio/MP3, desc: "Музыка - Отечественный шансон (Lossy)"} + - {id: 379, cat: Audio/Lossless, desc: "Музыка - Сборники отечественного шансона (Lossless)"} + - {id: 559, cat: Audio/MP3, desc: "Музыка - Сборники отечественного шансона (Lossy)"} + - {id: 564, cat: Audio/Lossless, desc: "Музыка - Военная песня (Lossless)"} + - {id: 380, cat: Audio/MP3, desc: "Музыка - Военная песня (Lossy)"} + - {id: 565, cat: Audio/Lossless, desc: "Музыка - Авторская песня (Lossless)"} + - {id: 383, cat: Audio/MP3, desc: "Музыка - Авторская песня (Lossy)"} + - {id: 779, cat: Audio, desc: "Музыка - New Age, Relax, Meditative & Flamenсо"} + - {id: 780, cat: Audio/Lossless, desc: "Музыка - Фламенко и акустическая гитара (lossless)"} + - {id: 781, cat: Audio/MP3, desc: "Музыка - Фламенко и акустическая гитара (lossy)"} + - {id: 341, cat: Audio, desc: "Музыка - Классическая и современная академическая музыка"} + - {id: 549, cat: Audio/Lossless, desc: "Музыка - Классическая и современная академическая музыка (lossless)"} + - {id: 550, cat: Audio/MP3, desc: "Музыка - Классическая и современная академическая музыка (lossy)"} + - {id: 536, cat: Audio, desc: "Музыка - Многоканальная музыка, Hi-Res форматы, оцифровки"} + - {id: 653, cat: Audio, desc: "Музыка - Музыка (HD Audio)"} + + - {id: 45, cat: Audio/Audiobook, desc: "Все Аудиокниги"} + - {id: 141, cat: Audio/Audiobook, desc: "Аудиокниги - Радиоспектакли, история, мемуары"} + - {id: 389, cat: Audio/Audiobook, desc: "Аудиокниги - Радиоспектакли и литературные чтения"} + - {id: 388, cat: Audio/Audiobook, desc: "Аудиокниги - Жизнь замечательных людей"} + - {id: 390, cat: Audio/Audiobook, desc: "Аудиокниги - Историческая книга"} + - {id: 48, cat: Audio/Audiobook, desc: "Аудиокниги - Фантастика, фэнтези, мистика, ужасы, фанфики"} + - {id: 391, cat: Audio/Audiobook, desc: "Аудиокниги - Зарубежная фантастика, фэнтези, мистика, ужасы, фанфики"} + - {id: 392, cat: Audio/Audiobook, desc: "Аудиокниги - Российская фантастика, фэнтези, мистика, ужасы, фанфики"} + - {id: 126, cat: Audio/Audiobook, desc: "Аудиокниги - Художественная литература"} + - {id: 394, cat: Audio/Audiobook, desc: "Аудиокниги - Поэзия"} + - {id: 395, cat: Audio/Audiobook, desc: "Аудиокниги - Зарубежная литература"} + - {id: 396, cat: Audio/Audiobook, desc: "Аудиокниги - Русская литература"} + - {id: 397, cat: Audio/Audiobook, desc: "Аудиокниги - Детская литература"} + - {id: 398, cat: Audio/Audiobook, desc: "Аудиокниги - Детективы, приключения, триллеры, боевики"} + - {id: 399, cat: Audio/Audiobook, desc: "Аудиокниги - Религии"} + - {id: 400, cat: Audio/Audiobook, desc: "Аудиокниги - Православие"} + - {id: 401, cat: Audio/Audiobook, desc: "Аудиокниги - Ислам"} + - {id: 402, cat: Audio/Audiobook, desc: "Аудиокниги - Другие традиционные религии"} + - {id: 404, cat: Audio/Audiobook, desc: "Аудиокниги - Прочая литература"} + - {id: 405, cat: Audio/Audiobook, desc: "Аудиокниги - Учебная и научно-популярная литература"} + - {id: 406, cat: Audio/Audiobook, desc: "Аудиокниги - Аудиокниги в lossless-форматах"} + - {id: 407, cat: Audio/Audiobook, desc: "Аудиокниги - Бизнес"} + - {id: 408, cat: Audio/Audiobook, desc: "Аудиокниги - Разное"} + + - {id: 37, cat: Books, desc: "Все Книги и журналы"} + - {id: 471, cat: Books, desc: "Книги и журналы - Книги"} + - {id: 472, cat: Books, desc: "Книги и журналы - Кино, театр, ТВ, мультипликация"} + - {id: 473, cat: Books, desc: "Книги и журналы - Рисунок, графический дизайн"} + - {id: 474, cat: Books, desc: "Книги и журналы - Фото и видеосъемка"} + - {id: 475, cat: Books, desc: "Книги и журналы - Журналы и газеты (общий раздел)"} + - {id: 479, cat: Books, desc: "Книги и журналы - Мода. Стиль. Этикет"} + - {id: 678, cat: Books, desc: "Книги и журналы - Православие"} + - {id: 420, cat: Books, desc: "Книги и журналы - Для детей, родителей и учителей"} + - {id: 421, cat: Books, desc: "Книги и журналы - Учебная литература для детского сада и начальной школы (до 4 класса)"} + - {id: 422, cat: Books, desc: "Книги и журналы - Учебная литература для старших классов (5-11 класс)"} + - {id: 423, cat: Books, desc: "Книги и журналы - Учителям и педагогам"} + - {id: 424, cat: Books, desc: "Книги и журналы - Научно-популярная и познавательная литература (для детей)"} + - {id: 425, cat: Books, desc: "Книги и журналы - Досуг и творчество"} + - {id: 426, cat: Books, desc: "Книги и журналы - Воспитание и развитие"} + - {id: 427, cat: Books, desc: "Книги и журналы - Худ. лит-ра для дошкольников и младших классов"} + - {id: 428, cat: Books, desc: "Книги и журналы - Худ. лит-ра для средних и старших классов"} + - {id: 429, cat: Books, desc: "Книги и журналы - Спорт, физическая культура, боевые искусства"} + - {id: 430, cat: Books, desc: "Книги и журналы - Футбол"} + - {id: 431, cat: Books, desc: "Книги и журналы - Хоккей"} + - {id: 432, cat: Books, desc: "Книги и журналы - Игровые виды спорта"} + - {id: 433, cat: Books, desc: "Книги и журналы - Легкая атлетика. Плавание. Гимнастика. Тяжелая атлетика. Гребля"} + - {id: 434, cat: Books, desc: "Книги и журналы - Автоспорт. Мотоспорт. Велоспорт"} + - {id: 435, cat: Books, desc: "Книги и журналы - Шахматы. Шашки"} + - {id: 436, cat: Books, desc: "Книги и журналы - Боевые искусства, единоборства"} + - {id: 437, cat: Books, desc: "Книги и журналы - Экстрим"} + - {id: 438, cat: Books, desc: "Книги и журналы - Физкультура, фитнес, бодибилдинг"} + - {id: 439, cat: Books, desc: "Книги и журналы - Спортивная пресса"} + - {id: 440, cat: Books, desc: "Книги и журналы - Гуманитарные науки"} + - {id: 441, cat: Books, desc: "Книги и журналы - Искусствоведение. Культурология"} + - {id: 443, cat: Books, desc: "Книги и журналы - Литературоведение"} + - {id: 444, cat: Books, desc: "Книги и журналы - Лингвистика"} + - {id: 445, cat: Books, desc: "Книги и журналы - Философия"} + - {id: 446, cat: Books, desc: "Книги и журналы - Политология"} + - {id: 447, cat: Books, desc: "Книги и журналы - Социология"} + - {id: 448, cat: Books, desc: "Книги и журналы - Бизнес, менеджмент"} + - {id: 451, cat: Books, desc: "Книги и журналы - Экономика"} + - {id: 311, cat: Books, desc: "Книги и журналы - Военное дело"} + - {id: 312, cat: Books, desc: "Книги и журналы - Милитария"} + - {id: 313, cat: Books, desc: "Книги и журналы - Военная история"} + - {id: 314, cat: Books, desc: "Книги и журналы - История Второй мировой войны"} + - {id: 315, cat: Books, desc: "Книги и журналы - Военная техника"} + - {id: 316, cat: Books, desc: "Книги и журналы - Стрелковое оружие"} + - {id: 317, cat: Books, desc: "Книги и журналы - Учебно-методическая литература"} + - {id: 318, cat: Books, desc: "Книги и журналы - Спецслужбы мира"} + - {id: 39, cat: Books, desc: "Книги и журналы - Художественная литература"} + - {id: 104, cat: Books, desc: "Книги и журналы - Русская литература"} + - {id: 105, cat: Books, desc: "Книги и журналы - Зарубежная литература"} + - {id: 106, cat: Books, desc: "Книги и журналы - Литературные журналы"} + - {id: 107, cat: Books, desc: "Книги и журналы - Художественная литература"} + - {id: 679, cat: Books, desc: "Книги и журналы - Отечественная фантастика / фэнтези / мистика"} + - {id: 102, cat: Books, desc: "Книги и журналы - Компьютерная литература"} + - {id: 103, cat: Books, desc: "Книги и журналы - Компьютерные журналы и приложения к ним"} + - {id: 415, cat: Books, desc: "Книги и журналы - Дисковые приложения к игровым журналам"} + - {id: 409, cat: Books, desc: "Книги и журналы - Программы от Microsoft"} + - {id: 416, cat: Books, desc: "Книги и журналы - Другие программы"} + - {id: 410, cat: Books, desc: "Книги и журналы - Веб-дизайн и программирование"} + - {id: 411, cat: Books, desc: "Книги и журналы - Программирование"} + - {id: 419, cat: Books, desc: "Книги и журналы - Mac OS; Linux, FreeBSD и прочие *NIX"} + - {id: 412, cat: Books, desc: "Книги и журналы - Графика, обработка видео"} + - {id: 414, cat: Books, desc: "Книги и журналы - Инженерные и научные программы"} + - {id: 413, cat: Books, desc: "Книги и журналы - Сети / VoIP"} + - {id: 417, cat: Books, desc: "Книги и журналы - Железо (книги о ПК)"} + - {id: 418, cat: Books, desc: "Книги и журналы - СУБД"} + - {id: 464, cat: Books, desc: "Книги и журналы - Комиксы"} + - {id: 465, cat: Books, desc: "Книги и журналы - Комиксы на русском языке"} + - {id: 466, cat: Books, desc: "Книги и журналы - Комиксы издательства Marvel"} + - {id: 467, cat: Books, desc: "Книги и журналы - Комиксы издательства DC"} + - {id: 468, cat: Books, desc: "Книги и журналы - Комиксы других издательств"} + - {id: 470, cat: Books, desc: "Книги и журналы - Манга (на иностранных языках)"} + - {id: 454, cat: Books, desc: "Книги и журналы - Коллекции книг и библиотеки"} + - {id: 455, cat: Books, desc: "Книги и журналы - Библиотеки (зеркала сетевых библиотек/коллекций)"} + - {id: 456, cat: Books, desc: "Книги и журналы - Тематические коллекции (подборки)"} + - {id: 457, cat: Books, desc: "Книги и журналы - Многопредметные коллекции (подборки)"} + - {id: 458, cat: Books, desc: "Книги и журналы - Мультимедийные и интерактивные издания"} + - {id: 459, cat: Books, desc: "Книги и журналы - Мультимедийные энциклопедии"} + - {id: 460, cat: Books, desc: "Книги и журналы - >Интерактивные обучающие и развивающие материалы"} + - {id: 461, cat: Books, desc: "Книги и журналы - Обучающие издания для детей"} + - {id: 462, cat: Books, desc: "Книги и журналы - Кулинария. Цветоводство. Домоводство"} + - {id: 463, cat: Books, desc: "Книги и журналы - Культура. Искусство. История"} + - {id: 677, cat: Books, desc: "Книги и журналы - Детективы, приключения"} + - {id: 128, cat: Books, desc: "Книги и журналы - Разное"} + + - {id: 774, cat: Other, desc: "Все Графика, Арт, Разное"} + - {id: 775, cat: Other, desc: "Живопись, Графика, Скульптура, Digital Art"} + - {id: 776, cat: Other, desc: "Рисунки, графический дизайн"} + - {id: 778, cat: Other, desc: "Обои, аватары, иконки и прочее"} + - {id: 777, cat: Other, desc: "3D-графика"} + + - {id: 38, cat: PC, desc: "Программное обеспечение"} + - {id: 40, cat: PC, desc: "Программное обеспечение - Операционные системы"} + - {id: 41, cat: PC, desc: "Программное обеспечение - Windows"} + - {id: 42, cat: PC, desc: "Программное обеспечение - Mac"} + - {id: 43, cat: PC, desc: "Программное обеспечение - Linux (Unix)"} + - {id: 112, cat: PC, desc: "Программное обеспечение - Софт"} + - {id: 113, cat: PC, desc: "Программное обеспечение - Сборники программ"} + - {id: 273, cat: PC, desc: "Программное обеспечение - Безопасность"} + - {id: 278, cat: PC, desc: "Программное обеспечение - Информация и диагностика"} + - {id: 275, cat: PC, desc: "Программное обеспечение - Программы для интернет и сетей"} + - {id: 276, cat: PC, desc: "Программное обеспечение - Программы для настройки и оптимизации ОС"} + - {id: 116, cat: PC, desc: "Программное обеспечение - Аудио и видео редакторы и конвертеры"} + - {id: 115, cat: PC, desc: "Программное обеспечение - Графические редакторы"} + - {id: 518, cat: PC, desc: "Программное обеспечение - Каталогизаторы и просмотрщики графики"} + - {id: 117, cat: PC, desc: "Программное обеспечение - Аудио и видео-проигрыватели и каталогизаторы"} + - {id: 282, cat: PC, desc: "Программное обеспечение - Виртуальные студии, секвенсоры"} + - {id: 517, cat: PC, desc: "Программное обеспечение - Словари, переводчики"} + - {id: 667, cat: PC, desc: "Программное обеспечение - Офисное ПО"} + - {id: 668, cat: PC, desc: "Программное обеспечение - Работа с жёстким диском"} + - {id: 669, cat: PC, desc: "Программное обеспечение - Сервисное обслуживание компьютера"} + - {id: 670, cat: PC, desc: "Программное обеспечение - Архиваторы и файловые менеджеры"} + - {id: 114, cat: PC, desc: "Программное обеспечение - Плагины и программы компании Adobe"} + - {id: 274, cat: PC, desc: "Программное обеспечение - Видеокурсы"} + - {id: 675, cat: PC, desc: "Программное обеспечение - Разное (Системные программы для Windows)"} + - {id: 671, cat: PC, desc: "Программное обеспечение - Игры и программы для iOS"} + - {id: 672, cat: PC, desc: "Программное обеспечение - Игры и программы для Android"} + - {id: 673, cat: PC, desc: "Программное обеспечение - Текстовые редакторы"} + - {id: 674, cat: PC, desc: "Программное обеспечение - Работа с носителями информации"} + - {id: 113, cat: PC, desc: "Сборники программ"} + - {id: 273, cat: PC, desc: "Безопасность"} + - {id: 278, cat: PC, desc: "Сериалы - Информация и диагностика"} + - {id: 275, cat: PC, desc: "Программы для интернет и сетей"} + - {id: 276, cat: PC, desc: "Программы для настройки и оптимизации ОС"} + - {id: 116, cat: PC, desc: "Аудио и видео редакторы и конвертеры"} + - {id: 115, cat: PC, desc: "Графические редакторы"} + - {id: 518, cat: PC, desc: "Каталогизаторы и просмотрщики графики"} + - {id: 117, cat: PC, desc: "Аудио и видео-проигрыватели и каталогизаторы"} + - {id: 282, cat: PC, desc: "Виртуальные студии, секвенсоры"} + - {id: 517, cat: PC, desc: "Словари, переводчики"} + - {id: 667, cat: PC, desc: "Офисное ПО"} + - {id: 668, cat: PC, desc: "Работа с жёстким диском"} + - {id: 669, cat: PC, desc: "Сервисное обслуживание компьютера"} + - {id: 670, cat: PC, desc: "Архиваторы и файловые менеджеры"} + - {id: 114, cat: PC, desc: "Плагины и программы компании Adobe"} + - {id: 274, cat: PC, desc: "Видеокурсы"} + - {id: 675, cat: PC, desc: "Разное (Системные программы для Windows)"} + - {id: 671, cat: PC, desc: "Игры и программы для iOS"} + - {id: 672, cat: PC, desc: "Игры и программы для Android"} + - {id: 673, cat: PC, desc: "Текстовые редакторы"} + - {id: 674, cat: PC, desc: "Работа с носителями информации"} + + - {id: 30, cat: Console, desc: "Все Игры"} + - {id: 80, cat: Console, desc: "Игры - Игры для Windows"} + - {id: 81, cat: Console, desc: "Игры - Игры и приложения для Android"} + - {id: 44, cat: Console, desc: "Игры - Игры для PSP"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: useragent + type: text + label: User-Agent + - name: info_useragent + type: info + label: How to get the User-Agent + default: "
  1. From the same place you fetched the cookie,
  2. Find 'user-agent:' in the Request Headers section
  3. Select and Copy the whole user-agent string (everything after 'user-agent: ') and Paste here.
" + - name: sort + type: select + label: Sort requested from site + default: t + options: + nt: created + ts: seeders + sz: size + i: title + - name: type + type: select + label: Order requested from site + default: d + options: + d: desc + a: asc + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: / + selector: a[href*="ucp.php?mode=logout"] + +search: + headers: + User-Agent: ["{{ .Config.useragent }}"] + + paths: + # http://filbi1976.org/search.php?t=0&cs=1&cs_post=1&sc=1&keywords=&cs_where=title&cs_forb=&submit=Hand+Search&fid%5B%5D=0&cs_format=0&cs_year=0&cs_filter=0&sk=nt&sd=d&cs_private=0 + - path: search.php + inputs: + t: 0 + cs: 1 + cs_post: 1 + sc: 1 + keywords: "{{ .Keywords }}" + # title, persona, genre, producer, author, korsar + cs_where: title + cs_forb: "" + submit: "Hand+Search" + $raw: "{{ if .Categories }}{{ range .Categories }}&fid[]={{.}}{{end}}{{ else }}&fid[]=0{{ end }}" + cs_format: 0 + cs_year: 0 + cs_filter: 0 + sk: "{{ .Config.sort }}" + sd: "{{ .Config.type }}" + cs_private: 0 + + rows: + selector: li.row:has(a.topictitle) + + fields: + category: + selector: dt > a[href$=".html"] + attribute: href + filters: + - name: regexp + args: -f(\d+) + title: + selector: a.topictitle + details: + selector: a.topictitle + attribute: href + download: + selector: a[href^="./download/file.php?id="][title="Скачать торрент"] + attribute: href + size: + selector: dt + filters: + - name: regexp + args: "Размер: (.+?)," + - name: replace + args: ["ТБ", "TB"] + - name: replace + args: ["ГБ", "GB"] + - name: replace + args: ["МБ", "MB"] + - name: replace + args: ["КБ", "KB"] + seeders: + selector: span.seed + leechers: + selector: span.leech + grabs: + selector: span.complet + date_day: + # Сегодня, 15:10 (today) + # Вчера, 23:28 (yesterday) + selector: dd:last-of-type:contains("Сегодня,"), dd:last-of-type:contains("Вчера,") + remove: a + optional: true + filters: + - name: replace + args: ["»", ""] + - name: replace + args: ["Вчера,", "Today"] + - name: replace + args: ["Сегодня,", "Yesterday"] + - name: fuzzytime + date_time: + # 4 минуты назад (4 minutes ago) + # 11 минут назад (11 minutes ago) + # 4 часа назад (4 hours ago) + # 11 часов назад (11 hours ago) + selector: dd:last-of-type:contains("назад") + remove: a + optional: true + filters: + - name: replace + args: ["»", ""] + - name: replace + args: ["назад", "ago"] + - name: replace + args: ["минуты", "minutes"] + - name: replace + args: ["минут", "minutes"] + - name: replace + args: ["часа", "hours"] + - name: replace + args: ["часов", "hours"] + - name: timeago + date_year: + # 12 янв 2019, 11:26 + # 25 май 2017, 18:41 + selector: dd:last-of-type:not(:contains("назад")):not(:contains("Сегодня,")):not(:contains("Вчера,")) + remove: a + optional: true + filters: + - name: replace + args: ["»", ""] + - name: regexp + args: "(\\d{2} \\D{3} \\d{4}, \\d{2}:\\d{2})" + - name: replace + args: ["янв", "Jan"] + - name: replace + args: ["фев", "Feb"] + - name: replace + args: ["мар", "Mar"] + - name: replace + args: ["апр", "Apr"] + - name: replace + args: ["май", "May"] + - name: replace + args: ["июн", "Jun"] + - name: replace + args: ["июл", "Jul"] + - name: replace + args: ["авг", "Aug"] + - name: replace + args: ["сен", "Sep"] + - name: replace + args: ["окт", "Oct"] + - name: replace + args: ["ноя", "Nov"] + - name: replace + args: ["дек", "Dec"] + - name: append + args: " +03:00" # MSK + - name: dateparse + args: "dd MMM yyyy, HH:mm zzz" + date: + text: "{{ if or .Result.date_time .Result.date_year .Result.date_day }}{{ or .Result.date_time .Result.date_year .Result.date_day }}{{ else }}now{{ end }}" + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# phpBB diff --git a/config/prowlarr/Definitions/krazyzone.yml b/config/prowlarr/Definitions/krazyzone.yml new file mode 100644 index 0000000..680bb0a --- /dev/null +++ b/config/prowlarr/Definitions/krazyzone.yml @@ -0,0 +1,209 @@ +--- +id: krazyzone +name: KrazyZone +description: "KrazyZone is a Private Torrent Tracker for MOVIES / TV / GENERAL" +language: en-US +type: private +encoding: UTF-8 +links: + - https://krazyzone.net/ +legacylinks: + - http://krazyzone.net/ + +caps: + categorymappings: + - {id: 79, cat: Audio, desc: "Mastermix: Mastermix"} + - {id: 80, cat: Audio, desc: "DMC: DMC"} + - {id: 49, cat: Audio/MP3, desc: "KZN MP3 Weekly: Ex-Vip"} + - {id: 76, cat: Audio, desc: "KZN-Exclusive: Exclusive "} + - {id: 98, cat: Audio/MP3, desc: "Other Mp3 Weely: Mp3"} + - {id: 77, cat: Audio, desc: "KZN Ex VIP: Ex VIP"} + - {id: 74, cat: Audio, desc: "Discography: Collection"} + - {id: 78, cat: Audio, desc: "Dj-Only: Dj-Music"} + - {id: 82, cat: Audio/Lossless, desc: "Flac: Flac - Flac Packs"} + - {id: 81, cat: Audio, desc: "Albums : Assorted Albums"} + - {id: 46, cat: Audio/Video, desc: "Music Videos: Music Videos"} + - {id: 24, cat: Audio, desc: "Karaoke: All Karaoke"} + - {id: 28, cat: Movies, desc: "Movies: 2024"} + - {id: 47, cat: Movies/BluRay, desc: "Movies: Bluray-HD"} + - {id: 9, cat: Movies/DVD, desc: "Movies: Dvdr-ISO"} + - {id: 52, cat: Movies, desc: "Classic Movies: Pre90s"} + - {id: 48, cat: Movies/SD, desc: "Movies: AVI-XVID-Dvdrip"} + - {id: 41, cat: Movies/3D, desc: "Remux - 3D: Remux - 3D"} + - {id: 22, cat: Movies/Foreign, desc: "Movies: Foreign"} + - {id: 23, cat: Movies/Other, desc: "Movies: Kids"} + - {id: 25, cat: Movies/WEB-DL, desc: "Movies: Netflix"} + - {id: 27, cat: Movies/UHD, desc: "Movies: 4K"} + - {id: 53, cat: Movies, desc: "Movie Packs: Movie Pks"} + - {id: 54, cat: Movies, desc: "Movie Pack: Pre-90s"} + - {id: 6, cat: Movies/Other, desc: "Kids Movie Pk: Movie Pks"} + - {id: 7, cat: TV, desc: "TV: Episodes"} + - {id: 8, cat: TV/Anime, desc: "TV: Kids - TV"} + - {id: 75, cat: TV/Documentary, desc: "TV: Documentary"} + - {id: 26, cat: TV/Sport, desc: "TV: Sports"} + - {id: 42, cat: Movies, desc: "TV Packs: Full Seasons"} + - {id: 50, cat: TV/Anime, desc: "TV Packs: Kids - Packs"} + - {id: 83, cat: Movies, desc: "TV Packs: Pre90s"} + - {id: 84, cat: Audio/Audiobook, desc: "Audio Books: A-Books"} + - {id: 85, cat: Books, desc: "Ebooks: Ebooks-Mags-Comics"} + - {id: 86, cat: Movies/HD, desc: "1440P QHD: 1440P QHD"} + - {id: 87, cat: PC/0day, desc: "Apps: windows-Linux"} + - {id: 88, cat: TV/Anime, desc: "Anime: All Anime"} + - {id: 89, cat: PC/Games, desc: "Games: Pc - Iso"} + - {id: 90, cat: PC/Games, desc: "Games: Misc"} + - {id: 91, cat: Other, desc: "Wallpapers: Wallpapers"} + - {id: 92, cat: Other, desc: "Xmas Albums: Albums"} + - {id: 93, cat: Movies/Other, desc: "Xmas Movies : Packs"} + - {id: 94, cat: Audio/Other, desc: "Xmas Music Pack: Packs"} + - {id: 95, cat: Other, desc: "To Be Edited: Edit"} + - {id: 99, cat: PC/Mac, desc: "Apps Mac: Apps Mac"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: id + options: + id: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_results + type: info + label: Search results + default: "If you are getting 0 results then access the site with your browser and mark as read all PMs." + +login: + path: account-login.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: div.myFrame:contains("Access Denied") + test: + path: index.php + selector: a[href="account-logout.php"] + +search: + paths: + # https://krazyzone.net/torrents-search.php?incldead=1&freeleech=0&inclrosub=0&sort=id&order=desc + - path: torrents-search.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" # for dashboard imdbid search + # 0 active, 1 incldead, 2 onlydead + incldead: 1 + # 0 all, 1 notfree, 2 onlyfree + freeleech: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 all, 1 bulgarian, 2 english, 3 english and bulgarian + inclrosub: 0 + # 0 both, 1 local, 2 external + sort: "{{ .Config.sort }}" + order: "{{ .Config.type }}" + + rows: + selector: table.ttable_headinner > tbody > tr:has(a[href^="download.php?id="]) + filters: + - name: andmatch + + fields: + category: + selector: a[href^="torrents.php?cat="] + attribute: href + optional: true + default: 95 + filters: + - name: querystring + args: cat + title: + selector: a[href^="torrents-details.php?id="] + attribute: title + filters: + - name: re_replace + args: ["[\\[|\\]]", ""] + details: + selector: a[href^="torrents-details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: a[href^="torrents-details.php?id="] + attribute: onmouseover + filters: + - name: regexp + args: src=([^\s]+) + genre: + selector: div.t-tags + filters: + - name: re_replace + args: ["(?i)(Chat Show)", "Chat_Show"] + - name: re_replace + args: ["(?i)(Game Show)", "Game_Show"] + - name: re_replace + args: ["(?i)(Panel Show)", "Panel_Show"] + - name: re_replace + args: ["(?i)(Science Fiction)", "Science_Fiction"] + - name: re_replace + args: ["(?i)(Talk Show)", "Talk_Show"] + - name: validate + args: "Action, Adventure, Animation, Biography, Chat_Show, Comedy, Crime, Documentary, Drama, Family, Fantasy, Game_Show, History, Horror, Kids, Medical, Music, Mystery, Nature, News, Panel_Show, Reality, Romance, Science_Fiction, Science-Fiction, SciFi, Soap, Supernatural, Talk_Show, Thriller, War, Western" + description: + case: + img[src="images/ro-eng-flag.png"]: "Verified: {{ .Result.genre }}" + "*": "Unverified: {{ .Result.genre }}" + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + size: + selector: td:nth-child(4) + date: + # 24.Jul
2022
07:47 + selector: td:nth-child(5) + # auto adjusted by site account profile + filters: + - name: dateparse + args: "d.MMMyyyyHH:mm" + seeders: + selector: td:nth-child(7) + leechers: + selector: td:nth-child(8) + grabs: + selector: td:nth-child(9) + downloadvolumefactor: + case: + img[src="images/free.gif"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 24 hours (as seconds = 24 x 60 x 60) + text: 86400 +# TorrentTrader diff --git a/config/prowlarr/Definitions/kufei.yml b/config/prowlarr/Definitions/kufei.yml new file mode 100644 index 0000000..f77682e --- /dev/null +++ b/config/prowlarr/Definitions/kufei.yml @@ -0,0 +1,199 @@ +--- +id: kufei +name: Kufei +description: "Kufei (库非) is a CHINESE Private Torrent Tracker for MOVIES / TV / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://kufei.org/ + +caps: + categorymappings: + - {id: 410, cat: Console, desc: "Games/游戏"} + - {id: 411, cat: Books, desc: "E-Books/电子书"} + - {id: 408, cat: Audio, desc: "Music/音乐"} + - {id: 412, cat: PC, desc: "Software/软件"} + - {id: 415, cat: TV, desc: "Drama/戏剧"} + - {id: 416, cat: Audio/Audiobook, desc: "Audio Books/有声读物"} + - {id: 409, cat: Other, desc: "Others/其他"} + - {id: 413, cat: Other, desc: "Education/教育"} + - {id: 414, cat: Audio/Video, desc: "Concert/演唱会"} + - {id: 407, cat: TV/Sport, desc: "Sports/体育"} + - {id: 406, cat: Audio/Video, desc: "Music Videos/音乐、视频"} + - {id: 403, cat: TV, desc: "TV Shows/综艺"} + - {id: 402, cat: TV, desc: "TV Series/电视剧"} + - {id: 405, cat: TV/Anime, desc: "Animations/动画、动漫"} + - {id: 404, cat: TV/Documentary, desc: "Documentaries/纪录片"} + - {id: 401, cat: Movies, desc: "Movies/电影"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: 2facode + type: text + label: 2FA code + - name: info_2fa + type: info + label: "About 2FA code" + default: "Only fill in the 2FA code box if you have enabled 2FA on the Kufei Web Site. Otherwise just leave it empty." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + secret: "" + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + two_step_code: "{{ .Config.2facode }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("失败")) + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl + search_area: "{{ if .Query.IMDBID }}4{{ else }}{{ end }}{{ if .Query.DoubanID }}1{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }}{{ else }}0{{ end }}" + # 0 AND, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: img[data-src] + attribute: data-src + imdbid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="imdb.com/title/tt"] + attribute: href + doubanid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="movie.douban.com/subject/"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-child(5) + seeders: + selector: td.rowfollow:nth-child(6) + leechers: + selector: td.rowfollow:nth-child(7) + grabs: + selector: td.rowfollow:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumratio: + text: 1.0 + description: + selector: td:nth-child(2) + remove: a, b, font, img, span +# NexusPHP v1.8.9 2023-11-15 diff --git a/config/prowlarr/Definitions/kufirc.yml b/config/prowlarr/Definitions/kufirc.yml new file mode 100644 index 0000000..f5f1805 --- /dev/null +++ b/config/prowlarr/Definitions/kufirc.yml @@ -0,0 +1,195 @@ +--- +id: kufirc +name: Kufirc +description: "Kufirc is a HUNGARIAN Private tracker for 3X" +language: hu-HU +type: private +encoding: UTF-8 +links: + - https://kufirc.com/ + +caps: + categorymappings: + - {id: 30, cat: XXX, desc: "Amateur"} + - {id: 29, cat: XXX, desc: "Anal"} + - {id: 5, cat: XXX, desc: "Animal"} + - {id: 27, cat: XXX, desc: "Asian"} + - {id: 26, cat: XXX, desc: "BBW"} + - {id: 44, cat: XXX, desc: "BDSM"} + - {id: 25, cat: XXX, desc: "Big Ass"} + - {id: 24, cat: XXX, desc: "Big Tits"} + - {id: 34, cat: XXX, desc: "Black"} + - {id: 35, cat: XXX, desc: "Busty"} + - {id: 23, cat: XXX, desc: "Classic"} + - {id: 33, cat: XXX, desc: "Creampie"} + - {id: 22, cat: XXX, desc: "Cumshot"} + - {id: 36, cat: XXX, desc: "Feature"} + - {id: 21, cat: XXX, desc: "Fetish"} + - {id: 31, cat: XXX, desc: "Film/Cam/Hun"} + - {id: 46, cat: XXX/XviD, desc: "Film/Xvid/hun"} + - {id: 37, cat: XXX, desc: "Foreign"} + - {id: 19, cat: XXX, desc: "Gay / Bi"} + - {id: 18, cat: XXX, desc: "Hardcore"} + - {id: 32, cat: XXX, desc: "HD porn"} + - {id: 28, cat: XXX, desc: "Hentai / 3D"} + - {id: 17, cat: XXX, desc: "Homemade"} + - {id: 38, cat: XXX, desc: "Interracial"} + - {id: 11, cat: XXX, desc: "Kép"} + - {id: 48, cat: XXX, desc: "Latina"} + - {id: 16, cat: XXX, desc: "Lesbian"} + - {id: 6, cat: XXX, desc: "Magyar"} + - {id: 15, cat: XXX, desc: "Masturbation"} + - {id: 14, cat: XXX, desc: "Mature"} + - {id: 13, cat: XXX/Pack, desc: "Megapack"} + - {id: 55, cat: XXX, desc: "Milf"} + - {id: 49, cat: XXX, desc: "Natural Tits"} + - {id: 39, cat: XXX, desc: "Old + Young"} + - {id: 12, cat: XXX, desc: "Oral"} + - {id: 20, cat: XXX, desc: "Orgia / Gang Bang"} + - {id: 42, cat: XXX/Other, desc: "Other"} + - {id: 50, cat: XXX, desc: "Parody"} + - {id: 41, cat: XXX, desc: "Paysite"} + - {id: 40, cat: XXX, desc: "Piss"} + - {id: 43, cat: XXX, desc: "Porn Music Videos"} + - {id: 54, cat: XXX, desc: "Pov"} + - {id: 45, cat: XXX, desc: "Pregnant / Preggo"} + - {id: 10, cat: XXX, desc: "Shemale / TS"} + - {id: 51, cat: XXX, desc: "Siterip"} + - {id: 52, cat: XXX, desc: "Softcore"} + - {id: 53, cat: XXX, desc: "Squirt"} + - {id: 9, cat: XXX, desc: "Straight"} + - {id: 8, cat: XXX, desc: "Tini"} + - {id: 47, cat: XXX, desc: "VR"} + - {id: 7, cat: PC/Games, desc: "XXX játék / program"} + + modes: + search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrentek oldalanként: setting to 100 on your account profile. + - name: sort + type: select + label: Sort requested from site + default: time + options: + time: created + seeders: seeders + size: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: login + method: form + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + cinfo: "1920|1080|24|-60" + iplocked: 0 + keeploggedin: 1 + error: + - selector: div.error + test: + path: / + selector: "#nav_userinfo" + +search: + paths: + # https://kufirc.com/torrents.php?filter_cat[30]=1&filter_cat[29]=1&order_by=time&order_way=desc&searchtext=&action=advanced&title=720p+2022&sizeall=&sizetype=&sizerange=&filelist=&taglist=&autocomplete_toggle= + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}" + searchtext: "" + title: "{{ .Keywords }}" + order_by: "{{ .Config.sort }}" + order_way: "{{ .Config.type }}" + action: advanced + filter_freeleech: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + sizeall: "" + sizetype: "" + sizerange: "" + filelist: "" + taglist: "" + autocomplete_toggle: "" + + rows: + selector: table#torrent_table > tbody > tr[class^="torrent row"]:has(a[href*="action=download"]) + + fields: + category: + selector: a[href*="filter_cat"] + attribute: href + filters: + - name: regexp + args: "(\\d+)]=1" + title: + selector: a[href^="/torrents.php?id="] + details: + selector: a[href^="/torrents.php?id="] + attribute: href + download: + selector: a[href^="torrents.php?action=download&id="] + attribute: href + description_tags: + selector: div.tags + description: + case: + span.icon_okay: "Verified: {{ .Result.description_tags }}" + "*": "Unverified: {{ .Result.description_tags }}" + poster: + selector: td:nth-child(2) > script + filters: + - name: regexp + args: "src=\\\\\"(.*?)\\\\\"" + - name: re_replace + args: ["\\\\(.)", "$1"] + - name: replace + args: ["/static/common/noartwork/noimage.png", ""] + files: + selector: td:nth-child(3) + date: + selector: td:nth-child(5) > span + attribute: title + # auto adjusted by site account profile + filters: + - name: dateparse + args: "MMM dd yyyy, HH:mm" + size: + selector: td:nth-child(6) + grabs: + selector: td:nth-child(7) + seeders: + selector: td:nth-child(8) + leechers: + selector: td:nth-child(9) + downloadvolumefactor: + case: + span.icon[title*="Freeleech"]: 0 + "img[alt=\"Freeleech\"]": 0 + "*": 1 + uploadvolumefactor: + case: + span.icon[title*="DoubleSeed"]: 2 + "img[alt=\"DoubleSeed\"]": 2 + "*": 1 + minimumratio: + text: 0.5 +# Luminance diff --git a/config/prowlarr/Definitions/laidbackmanor.yml b/config/prowlarr/Definitions/laidbackmanor.yml new file mode 100644 index 0000000..90e2fbc --- /dev/null +++ b/config/prowlarr/Definitions/laidbackmanor.yml @@ -0,0 +1,166 @@ +--- +id: laidbackmanor +name: LaidBackManor (API) +description: "LaidBackManor (LBM) is a Private site for MOVIES / TV / GENERAL" +language: en-US +type: private +encoding: UTF-8 +links: + - https://laidbackmanor.xyz/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Movie"} + - {id: 2, cat: TV, desc: "TV"} + - {id: 3, cat: Audio, desc: "Music"} + - {id: 4, cat: Console, desc: "Game"} + - {id: 5, cat: PC, desc: "Application"} + - {id: 6, cat: Books, desc: "Books"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + music-search: [q] + book-search: [q] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your LaidBackManor account My Security page and clicking on the API Token tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + inputs: {} # TODO: remove in v10 + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: "/api/torrents/filter" + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + # if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6 + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + seasonNumber: "{{ .Query.Season }}" + episodeNumber: "{{ .Query.Ep }}" + imdbId: "{{ .Query.IMDBIDShort }}" + tmdbId: "{{ .Query.TMDBID }}" + tvdbId: "{{ .Query.TVDBID }}" + free: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + + rows: + selector: data + attribute: attributes + + fields: + category: + selector: category_id + title: + selector: name + details: + selector: details_link + download: + selector: download_link + poster: + selector: meta.poster + filters: + - name: replace + args: ["https://via.placeholder.com/90x135", ""] + imdbid: + selector: imdb_id + tmdbid: + selector: tmdb_id + tvdbid: + selector: tvdb_id + genre: + selector: meta.genres + filters: + - name: re_replace + args: ["(?i)(Science Fiction)", "Science_Fiction"] + - name: re_replace + args: ["(?i)(TV Movie)", "TV_Movie"] + - name: replace + args: [" & ", "_&_"] + description: + text: "{{ .Result.genre }}" + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0%, 25%, 50%, 75%, 100% + selector: freeleech + case: + 0%: 1 # not free + 25%: 0.75 + 50%: 0.5 + 75%: 0.25 + 100%: 0 # freeleech + "*": 0 # catch errors + uploadvolumefactor: + # api returns 0=false, 1=true + selector: double_upload + case: + 0: 1 # normal + 1: 2 # double + minimumseedtime: + # 3 days (as seconds = 3 x 24 x 60 x 60) + text: 259200 +# json UNIT3D 6.4.1 diff --git a/config/prowlarr/Definitions/lastdigitalunderground.yml b/config/prowlarr/Definitions/lastdigitalunderground.yml new file mode 100644 index 0000000..63da59c --- /dev/null +++ b/config/prowlarr/Definitions/lastdigitalunderground.yml @@ -0,0 +1,176 @@ +--- +id: lastdigitalunderground +name: Last Digital Underground +description: "Last Digital Underground (LDU) is a Private Torrent Tracker for MOVIES / TV / GENERAL" +language: en-US +type: private +encoding: UTF-8 +links: + - https://theldu.net/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Films: Movies"} + - {id: 8, cat: Movies/Other, desc: "Films: Anime"} + - {id: 12, cat: Movies, desc: "Films: FanEdits"} + - {id: 2, cat: TV, desc: "Series: TV"} + - {id: 9, cat: TV/Anime, desc: "Series: Anime"} + - {id: 6, cat: XXX, desc: "XXX: Standard"} + - {id: 10, cat: XXX, desc: "XXX: Hentai"} + - {id: 14, cat: XXX, desc: "XXX: Creators Corner"} + - {id: 13, cat: XXX/Other, desc: "XXX: Other"} + - {id: 11, cat: XXX, desc: "XXX: Zoo"} + - {id: 7, cat: Books/EBook, desc: "Ebooks"} + - {id: 3, cat: Audio, desc: "Music"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + music-search: [q] + book-search: [q] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your Last Digital Underground account My Settings page and clicking on the API Key tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: "/api/torrents/filter" + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + # if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6 + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + seasonNumber: "{{ .Query.Season }}" + episodeNumber: "{{ .Query.Ep }}" + imdbId: "{{ .Query.IMDBIDShort }}" + tmdbId: "{{ .Query.TMDBID }}" + tvdbId: "{{ .Query.TVDBID }}" + "free[]": "{{ if .Config.freeleech }}100{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + + rows: + selector: data + attribute: attributes + + fields: + category: + selector: category_id + title: + selector: name + details: + selector: details_link + download: + selector: download_link + infohash: + selector: info_hash + poster: + selector: meta.poster + filters: + - name: replace + args: ["https://via.placeholder.com/90x135", ""] + imdbid: + selector: imdb_id + tmdbid: + selector: tmdb_id + tvdbid: + selector: tvdb_id + genre: + selector: meta.genres + filters: + - name: re_replace + args: ["(?i)(Science Fiction)", "Science_Fiction"] + - name: re_replace + args: ["(?i)(TV Movie)", "TV_Movie"] + - name: replace + args: [" & ", "_&_"] + description: + text: "{{ .Result.genre }}" + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0%, 25%, 50%, 75%, 100% + selector: freeleech + case: + 0%: 1 # not free + 25%: 0.75 + 50%: 0.5 + 75%: 0.25 + 100%: 0 # freeleech + "*": 0 # catch errors + uploadvolumefactor: + # api returns False, True + selector: double_upload + case: + False: 1 # normal + True: 2 # double +# global MR is 0.4 but torrents must be seeded for 7 days regardless of ratio +# minimumratio: +# text: 0.4 + minimumseedtime: + # 7 day (as seconds = 7 x 24 x 60 x 60) + text: 604800 +# json UNIT3D 7.1.3 diff --git a/config/prowlarr/Definitions/lastfiles.yml b/config/prowlarr/Definitions/lastfiles.yml new file mode 100644 index 0000000..a112de1 --- /dev/null +++ b/config/prowlarr/Definitions/lastfiles.yml @@ -0,0 +1,214 @@ +--- +id: lastfiles +name: LastFiles +description: "LastFiles (LF) is a ROMANIAN Private Torrent Tracker for 0DAY / GENERAL" +language: ro-RO +type: private +encoding: UTF-8 +followredirect: true +requestDelay: 2 +links: + - https://www.last-torrents.org/ +legacylinks: + - http://last-torrents.org/ + - https://last-torrents.org/ + - https://www.lastfiles.ro/ + - http://www.lastfiles.ro/ + - http://www.last-torrents.org/ + +caps: + categorymappings: + - {id: 1, cat: TV/Anime, desc: "Movies: Anime", default: true} + - {id: 2, cat: TV/Anime, desc: "Movies: Anime-Ro", default: true} + - {id: 5, cat: Movies/BluRay, desc: "Movies: BluRay", default: true} + - {id: 6, cat: Movies/BluRay, desc: "Movies: BluRay-Ro", default: true} + - {id: 9, cat: Movies/DVD, desc: "Movies: DVD", default: true} + - {id: 10, cat: Movies/DVD, desc: "Movies: DVD-Ro", default: true} + - {id: 11, cat: Movies/HD, desc: "Movies: HD", default: true} + - {id: 12, cat: Movies/HD, desc: "Movies: HD-Ro", default: true} + - {id: 13, cat: TV/HD, desc: "HDTV Episodes", default: true} + - {id: 14, cat: TV/HD, desc: "HDTV Episodes-Ro", default: true} + - {id: 16, cat: Movies, desc: "Movies: Old", default: true} + - {id: 17, cat: Movies, desc: "Movies: Old-Ro", default: true} + - {id: 18, cat: Movies, desc: "Movies: Pack", default: true} + - {id: 19, cat: Movies, desc: "Movies: Pack-Ro", default: true} + - {id: 20, cat: TV, desc: "TV Episodes", default: true} + - {id: 21, cat: TV, desc: "TV Episodes-Ro", default: true} + - {id: 22, cat: Other, desc: "RoContent", default: true} + - {id: 24, cat: Movies/SD, desc: "Movies: XVID", default: true} + - {id: 25, cat: Movies/SD, desc: "Movies: XVID-Ro", default: true} + - {id: 26, cat: PC/0day, desc: "Software", default: true} + - {id: 27, cat: XXX, desc: "Movies: XXX", default: false} + - {id: 28, cat: Audio, desc: "Music", default: true} + - {id: 30, cat: PC/Games, desc: "Games: PC-ISO", default: true} + - {id: 31, cat: Movies/UHD, desc: "Movies: 4K", default: true} + - {id: 32, cat: Movies/UHD, desc: "Movies: 4K-Ro", default: true} + - {id: 33, cat: PC/Games, desc: "Games: Packs", default: true} + - {id: 42, cat: TV/Sport, desc: "Sport", default: true} + - {id: 43, cat: Books, desc: "Documents", default: true} + - {id: 44, cat: Other, desc: "Images", default: true} + - {id: 49, cat: Other, desc: "Diverse", default: true} + - {id: 51, cat: PC/Mobile-Android, desc: "Android Apps", default: true} + - {id: 54, cat: Movies/WEB-DL, desc: "Movies: WEB-DL", default: true} + - {id: 55, cat: Movies/WEB-DL, desc: "Movies: WEB-DL Ro", default: true} + - {id: 56, cat: TV/Documentary, desc: "Documentary", default: true} + - {id: 57, cat: TV/Documentary, desc: "Documentary-Ro", default: true} + - {id: 58, cat: Movies/SD, desc: "Movies: Cam", default: true} + - {id: 59, cat: Movies/SD, desc: "Movies: Cam-Ro", default: true} + - {id: 61, cat: Movies/3D, desc: "Movies: 3D", default: true} + - {id: 62, cat: Movies/3D, desc: "Movies: 3D-Ro", default: true} + - {id: 81, cat: Movies/HD, desc: "Movies: x265-Ro", default: true} + - {id: 82, cat: Movies/HD, desc: "Movies: x265", default: true} + + modes: + search: [q] + tv-search: [q, season, ep, genre] + movie-search: [q, genre] + music-search: [q, genre] + book-search: [q, genre] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: flaresolverr + type: info + label: FlareSolverr + default: This site may use Cloudflare DDoS Protection, therefore Prowlarr requires FlareSolverr to access it. +# - name: sort +# type: select +# label: Sort requested from site +# default: 3 +# options: +# 3: created +# 6: seeders +# 4: size +# 1: title +# - name: type +# type: select +# label: Order requested from site +# default: desc +# options: +# desc: desc +# asc: asc + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + submitme: Login! + use_ssl: 1 + perm_ssl: 1 + error: + - selector: td.embedded:contains("Login failed") + test: + path: index.php + selector: a[href*="/logout.php?hash_please="] + +search: + paths: + # https://www.last-torrents.org/browse.php?search=the+nun+ii&searchin=title&type=0&cat=+ + # cannot support imdbid or tmdbid searches while using path category filters + - path: browse.php + categories: [1, 2, 5, 6, 9, 10, 11, 12, 13, 14, 16, 17, 18, 19, 20, 21, 22, 24, 25, 26, 28, 30, 31, 32, 33, 42, 43, 44, 49, 51, 54, 55, 56, 57, 58, 59, 60, 61, 62, 81, 82] + - path: browseadult.php + categories: [27] + + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ if .Query.Genre }}{{ .Query.Genre }} {{ else }}{{ end }}{{ .Keywords }}" + # title, genre, all + searchin: "{{ if .Query.Genre }}all{{ else }}title{{ end }}" + # 0 active, 1 incldead, 2 onlydead, 3 free, 4 silver, 5 seedbox + type: "{{ if .Config.freeleech }}3{{ else }}1{{ end }}" +# sort and type can only be used in a non-search query due to conflicting parameters +# sort: "{{ .Config.sort }}" +# type: "{{ .Config.type }}" + + rows: + selector: div.py-3 + filters: + - name: andmatch + + fields: + category: + selector: a[href*="cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="t"] + details: + selector: a[href^="t"] + attribute: href + poster: + selector: a[href^="t"] + attribute: title + filters: + - name: regexp + args: "src=(.+?) " + genre: + selector: i:has(a[href$="searchin=genre"]), font[size] + filters: + - name: replace + args: [" & ", "_&_"] + - name: replace + args: ["Hip Hop", "Hip_Hop"] + - name: replace + args: ["Science Fiction", "Science_Fiction"] + description: + text: "{{ .Result.genre }}" + download: + selector: a[href^="download.php"] + attribute: href + date_day: + selector: div.col-sm-4:nth-of-type(3):contains("day") + # auto adjusted by site account profile + optional: true + filters: + - name: fuzzytime + date_year: + selector: div.col-sm-4:nth-of-type(3):contains(":"):not(:contains("day")) + # auto adjusted by site account profile + optional: true + filters: + - name: dateparse + args: "MMM d yyyy, hh:mm tt" + date: + text: "{{ if or .Result.date_day .Result.date_year }}{{ or .Result.date_day .Result.date_year }}{{ else }}now{{ end }}" + size: + selector: div.col-sm-4:nth-of-type(4) + grabs: + selector: div.col-sm-3:contains("Completed") b + seeders: + selector: div.col-sm-3:contains("Seeders") b + leechers: + selector: div.col-sm-2:contains("Leechers") b + downloadvolumefactor: + case: + img[src$="half2.png"]: 0.5 + a#free-btn: 0 + "*": 1 + uploadvolumefactor: + case: + a#double-btn: 2 + "*": 1 + minimumratio: + text: 1.0 + minimumseedtime: + # freeleech 2 days (as seconds = 2 x 24 x 60 x 60) + # notfree 1.5 days (as seconds = 1.5 x 24 x 60 x 60) + case: + a#free-btn: 172800 + "*": 129600 +# U-232 V5 diff --git a/config/prowlarr/Definitions/lat-team-api.yml b/config/prowlarr/Definitions/lat-team-api.yml new file mode 100644 index 0000000..6237e34 --- /dev/null +++ b/config/prowlarr/Definitions/lat-team-api.yml @@ -0,0 +1,192 @@ +--- +id: lat-team-api +name: Lat-Team (API) +description: "Lat-Team is a SPANISH Private Torrent Tracker for MOVIES / TV" +language: es-ES +type: private +encoding: UTF-8 +links: + - https://lat-team.com/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Peliculas"} + - {id: 2, cat: TV, desc: "TV Series"} + - {id: 3, cat: Audio, desc: "Musica"} + - {id: 4, cat: Console, desc: "Juegos"} + - {id: 5, cat: TV/Anime, desc: "Anime"} + - {id: 8, cat: TV/Foreign, desc: "Telenovelas"} + - {id: 9, cat: Audio/Video, desc: "Conciertos"} + - {id: 11, cat: Audio/Audiobook, desc: "Audiolibros"} + - {id: 12, cat: XXX, desc: "XXX"} + - {id: 16, cat: TV/Sport, desc: "Eventos Deportivos"} + - {id: 17, cat: PC, desc: "Software & O.S."} + - {id: 18, cat: Books, desc: "E-Books"} + - {id: 20, cat: TV/Foreign, desc: "Doramas & Turcas"} + - {id: 22, cat: TV/Other, desc: "Playlist_Collection"} + - {id: 24, cat: Other, desc: "Cursos"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + music-search: [q] + book-search: [q] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your Lat-Team account My Security page and clicking on the API Token tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + inputs: {} # TODO: remove in v10 + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: "/api/torrents/filter" + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + # if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6 + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + seasonNumber: "{{ .Query.Season }}" + episodeNumber: "{{ .Query.Ep }}" + imdbId: "{{ .Query.IMDBIDShort }}" + tmdbId: "{{ .Query.TMDBID }}" + tvdbId: "{{ .Query.TVDBID }}" + free[]: "{{ if .Config.freeleech }}100{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + + rows: + selector: data + attribute: attributes + + fields: + category: + selector: category_id + title_vose: + selector: name:contains(VOSE) + optional: true + filters: + - name: append + args: " ENGLiSH" + title_notvose: + selector: name:not(:contains(VOSE)) + optional: true + filters: + - name: append + args: " SPANiSH" + title: + text: "{{ if .Result.title_vose }}{{ .Result.title_vose }}{{ else }}{{ .Result.title_notvose }}{{ end }}" + details: + selector: details_link + download: + selector: download_link + infohash: + selector: info_hash + poster: + selector: meta.poster + filters: + - name: replace + args: ["https://via.placeholder.com/90x135", ""] + imdbid: + selector: imdb_id + tmdbid: + selector: tmdb_id + tvdbid: + selector: tvdb_id + genre: + selector: meta.genres + filters: + - name: re_replace + args: ["(?i)(Science Fiction)", "Science_Fiction"] + - name: re_replace + args: ["(?i)(TV Movie)", "TV_Movie"] + - name: replace + args: [" & ", "_&_"] + description: + text: "{{ .Result.genre }}" + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0%, 25%, 50%, 75%, 100% + selector: freeleech + case: + 0%: 1 # not free + 25%: 0.75 + 50%: 0.5 + 75%: 0.25 + 100%: 0 # freeleech + "*": 0 # catch errors + uploadvolumefactor: + # api returns 0=false, 1=true + selector: double_upload + case: + 0: 1 # normal + 1: 2 # double +# global MR is 0.4 but torrents must be seeded for 2 days regardless of ratio +# minimumratio: +# text: 0.4 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# json UNIT3D 6.5.0 diff --git a/config/prowlarr/Definitions/le-cinephile.yml b/config/prowlarr/Definitions/le-cinephile.yml new file mode 100644 index 0000000..80badaa --- /dev/null +++ b/config/prowlarr/Definitions/le-cinephile.yml @@ -0,0 +1,243 @@ +--- +id: le-cinephile +name: Le-Cinephile +description: "Le-Cinephile is a FRENCH Private Torrent Tracker for MOVIES / TV / GENERAL" +language: fr-FR +type: private +encoding: UTF-8 +links: + - https://le-cinephile.de/ + +caps: + categorymappings: + # FILM + - {id: 2, cat: Movies/DVD, desc: "FILM DVD"} + - {id: 104, cat: Movies, desc: "FILM DVDRip"} + - {id: 101, cat: TV/Documentary, desc: "FILM Documentaire"} + - {id: 75, cat: Movies/UHD, desc: "FILM 2160 P"} + - {id: 63, cat: Movies/WEB-DL, desc: "FILM WEB"} + - {id: 62, cat: Movies/WEB-DL, desc: "FILM WEB"} + - {id: 66, cat: Movies/HD, desc: "FILM HDRip"} + - {id: 34, cat: Movies/SD, desc: "FILM TVRip"} + - {id: 33, cat: Movies/SD, desc: "FILM HDTV"} + - {id: 31, cat: Movies/Other, desc: "FILM MUET"} + - {id: 30, cat: Movies/Foreign, desc: "FILM VOST"} + - {id: 29, cat: Movies/SD, desc: "FILM VHS"} + - {id: 28, cat: Movies/HD, desc: "FILM 720"} + - {id: 27, cat: Movies/HD, desc: "FILM BDRip"} + - {id: 26, cat: Movies/BluRay, desc: "FILM BluRay"} + - {id: 25, cat: Movies/BluRay, desc: "FILM ISO"} + - {id: 4, cat: Movies/HD, desc: "FILM 1080"} + - {id: 107, cat: Movies, desc: "FILM ANIME"} + # SERIE + - {id: 9, cat: TV/SD, desc: "SERIE DVD"} + - {id: 105, cat: TV, desc: "SERIE Pack"} + - {id: 102, cat: TV/Documentary, desc: "SERIE Documentaire"} + - {id: 72, cat: TV/UHD, desc: "SERIE 2160 P"} + - {id: 65, cat: TV/SD, desc: "SERIE HDRip"} + - {id: 21, cat: TV/HD, desc: "SERIE HDTV.1080p"} + - {id: 20, cat: TV/HD, desc: "SERIE HDTV.720p"} + - {id: 19, cat: TV/SD, desc: "SERIE HDTV"} + - {id: 17, cat: TV/SD, desc: "SERIE VHS"} + - {id: 16, cat: TV/SD, desc: "SERIE TVRip"} + - {id: 15, cat: TV/WEB-DL, desc: "SERIE WEB.1080p"} + - {id: 14, cat: TV/WEB-DL, desc: "SERIE WEB.720p"} + - {id: 12, cat: TV/WEB-DL, desc: "SERIE WEB"} + - {id: 106, cat: TV/Anime, desc: "SERIE ANIME"} + # LOGICIELS + - {id: 56, cat: PC/ISO, desc: "LOGICIELS Linux"} + - {id: 24, cat: PC/Mac, desc: "LOGICIELS Apple"} + - {id: 58, cat: PC/0day, desc: "LOGICIELS Windows"} + # EBOOK + - {id: 44, cat: Books/Mags, desc: "EBOOK Journaux"} + - {id: 46, cat: Books/Technical, desc: "EBOOK Documents"} + - {id: 48, cat: XXX/Other, desc: "EBOOK XXX"} + - {id: 49, cat: Books/EBook, desc: "EBOOK Livres"} + # MUSIC + - {id: 5, cat: Audio/Video, desc: "MUSIC clip video"} + # JEUX + - {id: 96, cat: PC/Games, desc: "JEUX Apple"} + - {id: 8, cat: Console/PS3, desc: "JEUX PS3"} + - {id: 45, cat: PC/Games, desc: "JEUX PC"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: multilang + type: checkbox + label: Replace MULTI by another language in release name + default: false + - name: multilanguage + type: select + label: Replace MULTI by this language + default: FRENCH + options: + FRENCH: FRENCH + MULTI.FRENCH: MULTI.FRENCH + ENGLISH: ENGLISH + MULTI.ENGLISH: MULTI.ENGLISH + VOSTFR: VOSTFR + MULTI.VOSTFR: MULTI.VOSTFR + - name: vostfr + type: checkbox + label: Replace VOSTFR with ENGLISH + default: false + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeds: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: countdown + type: info + label: Countdown Timer + default: "This site is a Tracker based on Time: to keep your account the time must not be at 0000-00-00-00-00-00. Read Le-Cinephile FAQ on how to keep the timer active." + - name: registration + type: info + label: Registration Confirmation + default: After you register you will receive a confirmation email that contains a link to activate your account. If you have not received it check your Junk mail / Spam mail folder. + +login: + path: login.php + method: form + form: form[action="/login.php"] + cookies: ["JAVA=OK"] # avoid jscheck redirect + captcha: + type: image + selector: img[src^="cap/captcha_math.php?codeCaptcha="] + input: stringCaptcha + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: div#login_error + test: + path: index.php + selector: a[href="logout.php"] + +download: + before: + path: ajax_det_poll.php + method: post + inputs: + set_thanks: Merci + det_id: "{{ .DownloadUri.Query.id }}" + ajax: yes + selectors: + - selector: a[href^="download.php?torrent="] + attribute: href + +search: + paths: + - path: selection.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 name, 1 descr, 2 both + blah: 0 + orderby: "{{ .Config.sort }}" + sort: "{{ .Config.type }}" + + rows: + selector: "div.selection_wrap" + + fields: + category_p1: + selector: div.kat_cat_pic_name + category_p2: + selector: div.kat_cat_pic_name_b + categorydesc: + text: "{{ .Result.category_p1 }} {{ .Result.category_p2 }}" + title_phase1: + selector: a.selection_a + title_multilang: + text: "{{ .Result.title_phase1 }}" + filters: + - name: re_replace + args: ["(?i)([\\s|\\.|-]multi[\\s|\\.|-])", ".{{ .Config.multilanguage }}."] + title_phase2: + text: "{{ if .Config.multilang }}{{ .Result.title_multilang }}{{ else }}{{ .Result.title_phase1 }}{{ end }}" + title_vostfr: + text: "{{ .Result.title_phase2 }}" + filters: + - name: re_replace + args: ["(?i)([\\s|\\.|-]vostfr[\\s|\\.|-])", ".ENGLISH."] + - name: re_replace + args: ["(?i)([\\s|\\.|-]subfrench[\\s|\\.|-])", ".ENGLISH."] + title: + text: "{{ if .Config.vostfr }}{{ .Result.title_vostfr }}{{ else }}{{ .Result.title_phase2 }}{{ end }}" + details: + selector: a.selection_a + attribute: href + download: + selector: a.selection_a + attribute: href + poster: + selector: div[id^="details"] img + attribute: src + size: + selector: div.selection_unter_ad + grabs: + selector: div.selection_unter_ae + date_day: + # Aujourd'hui à 13:30:04 + # Hier à 09:10:10 + selector: div.selection_unter_ab:not(:contains(".")) + optional: true + filters: + - name: replace + args: ["Aujourd'hui à", "Today"] + - name: replace + args: ["Hier à", "Yesterday"] + - name: append + args: " +01:00" # CET + date_year: + # Le 30.02.2018 à 23:12:50 + selector: div.selection_unter_ab:contains(".") + optional: true + filters: + - name: replace + args: ["Le ", ""] + - name: replace + args: [" à", ""] + - name: append + args: " +01:00" # CET + - name: dateparse + args: "dd.MM.yyyy HH:mm:ss zzz" + date: + text: "{{ if or .Result.date_year .Result.date_day }}{{ or .Result.date_year .Result.date_day }}{{ else }}now{{ end }}" + seeders: + selector: div.selection_unter_aa + leechers: + selector: div.selection_unter_aaa + downloadvolumefactor: + text: 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 60 hours (as seconds = 60 x 60 x 60) + text: 216000 +# 3xT diff --git a/config/prowlarr/Definitions/learnbits.yml b/config/prowlarr/Definitions/learnbits.yml new file mode 100644 index 0000000..d54ca92 --- /dev/null +++ b/config/prowlarr/Definitions/learnbits.yml @@ -0,0 +1,219 @@ +--- +id: learnbits +name: LearnBits +description: "LearnBits is a Private Torrent Tracker for E-LEARNING" +language: en-US +type: private +encoding: UTF-8 +links: + - http://www.learnbits.me/ + +caps: + categorymappings: + - {id: 7, cat: TV/Documentary, desc: "Documentary"} + - {id: 83, cat: TV/Documentary, desc: "Documentary - Architecture"} + - {id: 61, cat: TV/Documentary, desc: "Documentary - Biography"} + - {id: 76, cat: TV/Documentary, desc: "Documentary - Culture"} + - {id: 75, cat: TV/Documentary, desc: "Documentary - EarthScience"} + - {id: 67, cat: TV/Documentary, desc: "Documentary - History"} + - {id: 80, cat: TV/Documentary, desc: "Documentary - MilitaryWar"} + - {id: 81, cat: TV/Documentary, desc: "Documentary - Politics"} + - {id: 82, cat: TV/Documentary, desc: "Documentary - Technology"} + - {id: 77, cat: TV/Documentary, desc: "Documentary - Travel"} + - {id: 74, cat: TV/Documentary, desc: "Documentary - Wildlife"} + - {id: 79", cat: TV/Documentary, desc: "Documentary Channels"} + - {id: 65, cat: TV/Documentary, desc: "Documentary Channels - BBC"} + - {id: 69, cat: TV/Documentary, desc: "Documentary Channels - Discovery"} + - {id: 56, cat: TV/Documentary, desc: "Documentary Channels - HistoryChannel"} + - {id: 55, cat: TV/Documentary, desc: "Documentary Channels - NationalGeo"} + - {id: 73, cat: TV/Documentary, desc: "Documentary Channels - PBS"} + - {id: 78, cat: TV/Documentary, desc: "Documentary Series"} + - {id: 58, cat: TV/Documentary, desc: "Documentary Series - AnimalPlanet"} + - {id: 66, cat: TV/Documentary, desc: "Documentary Series - ExtremeWorld"} + - {id: 70, cat: TV/Documentary, desc: "Documentary Series - Frontline"} + - {id: 62, cat: TV/Documentary, desc: "Documentary Series - Horizon"} + - {id: 59, cat: TV/Documentary, desc: "Documentary Series - HowItIsMade"} + - {id: 10, cat: TV/Documentary, desc: "Documentary Series - MegaFactories"} + - {id: 57, cat: TV/Documentary, desc: "Documentary Series - ModernMarvels"} + - {id: 63, cat: TV/Documentary, desc: "Documentary Series - NaturalWorld"} + - {id: 71, cat: TV/Documentary, desc: "Documentary Series - NatureOfThings"} + - {id: 54, cat: TV/Documentary, desc: "Documentary Series - Nova"} + - {id: 72, cat: TV/Documentary, desc: "Documentary Series - PBSNature"} + - {id: 68, cat: TV/Documentary, desc: "Documentary Series - ThroughTheWormhole"} + - {id: 60, cat: Other, desc: "General-Education"} + - {id: 34, cat: Other, desc: "General-Education - 3D-4D"} + - {id: 49, cat: Books/EBook, desc: "General-Education - Biographies"} + - {id: 3, cat: Books/EBook, desc: "General-Education - Business"} + - {id: 6, cat: Other, desc: "General-Education - Digital-Art"} + - {id: 36, cat: Other, desc: "General-Education - Early-Learning"} + - {id: 42, cat: Other, desc: "General-Education - Electronics"} + - {id: 48, cat: Other, desc: "General-Education - Graphic-Arts"} + - {id: 25, cat: Books/EBook, desc: "General-Education - History"} + - {id: 16, cat: Other, desc: "General-Education - Languages"} + - {id: 4, cat: Other, desc: "General-Education - Legal"} + - {id: 20, cat: Other, desc: "General-Education - Math"} + - {id: 21, cat: Other, desc: "General-Education - Medical"} + - {id: 41, cat: Other, desc: "General-Education - Philosophy"} + - {id: 53, cat: Other, desc: "General-Education - Photography"} + - {id: 45, cat: Other, desc: "General-Education - Politics"} + - {id: 39, cat: Other, desc: "General-Education - Psychology"} + - {id: 50, cat: Other, desc: "General-Education - Science"} + - {id: 35, cat: Other, desc: "General-Education - Trade-Skills"} + - {id: 38, cat: Other, desc: "General-Education - Writing"} + - {id: 46, cat: Other, desc: "Computer Science"} + - {id: 5, cat: Other, desc: "General-Education - Database"} + - {id: 9, cat: Other, desc: "General-Education - Exam-Guides"} + - {id: 11, cat: Other, desc: "General-Education - Forensics"} + - {id: 14, cat: Other, desc: "General-Education - IT-Manager"} + - {id: 15, cat: Other, desc: "General-Education - IT-Security"} + - {id: 17, cat: Other, desc: "General-Education - Linux-Unix"} + - {id: 18, cat: Other, desc: "General-Education - Mac-Apple"} + - {id: 31, cat: Other, desc: "General-Education - Microsoft"} + - {id: 22, cat: Other, desc: "General-Education - Network"} + - {id: 26, cat: Other, desc: "General-Education - Programming"} + - {id: 27, cat: Other, desc: "General-Education - Server-Admin"} + - {id: 29, cat: Other, desc: "General-Education - VOIP"} + - {id: 30, cat: Other, desc: "General-Education - Web-Design"} + - {id: 64, cat: Other, desc: "Just-4-Fun"} + - {id: 51, cat: Other, desc: "Just-4-Fun - Culinary"} + - {id: 12, cat: Other, desc: "Just-4-Fun - Fitness"} + - {id: 13, cat: Other, desc: "Just-4-Fun - Hobbies"} + - {id: 47, cat: Other, desc: "Just-4-Fun - Horticulture"} + - {id: 33, cat: Other, desc: "Just-4-Fun - International"} + - {id: 19, cat: Books/Mags, desc: "Just-4-Fun - Magazines"} + - {id: 52, cat: Other, desc: "Just-4-Fun - Magic"} + - {id: 32, cat: Other/Misc, desc: "Just-4-Fun - Miscellaneous"} + - {id: 23, cat: Other, desc: "Just-4-Fun - Music-Dance"} + - {id: 24, cat: Other, desc: "Just-4-Fun - Personal Growth"} + - {id: 28, cat: Other, desc: "Just-4-Fun - Sports-Self-Defence"} + - {id: 37, cat: Other, desc: "Just-4-Fun - VIP"} + + modes: + search: [q] + tv-search: [q, season, ep] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeders: seeders + size: size + - name: type + type: select + label: Order requested from site + default: DESC + options: + DESC: desc + ASC: asc + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img#regimage + input: security_code + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + logintype: yes + error: + - selector: table:contains("An error has occured!") + test: + path: index.php + selector: a[href*="/logout.php?logouthash="] + +search: + paths: + - path: browse.php + method: post + keywordsfilters: + - name: re_replace + args: ["[^a-zA-Z0-9]+", "%"] + inputs: + do: search + keywords: "{{ .Keywords }}" + # t_name, t_description, t_both, t_uploader, t_genre + search_type: t_name + # does not support multi categories so defaulting to ALL + category: 0 + sortby: "{{ .Config.sort }}" + orderby: "{{ .Config.type }}" + + rows: + selector: "div#showcontents > table > tbody > tr:has(a[href]){{ if .Config.freeleech }}:has(img[src$=\"freedownload.gif\"]){{ else }}{{ end }}" + + fields: + category: + selector: a[href*="/browse.php?browse_categories"] + attribute: href + filters: + - name: querystring + args: category + title: + selector: a[href*="/details.php?id="] > b + details: + selector: a[href*="/details.php?id="] + attribute: href + download: + selector: a[href*="/download.php?id="] + attribute: href + files: + selector: td:nth-child(4) + seeders: + selector: td:nth-child(6) + leechers: + selector: td:nth-child(7) + grabs: + selector: td:nth-child(8) > b + downloadvolumefactor: + case: + img[src$="/external.gif"]: 0 + img[src$="/freedownload.gif"]: 0 + img[src$="/silverdownload.gif"]: 0.5 + "*": 1 + uploadvolumefactor: + case: + img[src$="/x2.gif"]: 2 + "*": 1 + size: + selector: td:nth-child(8) + remove: b + date_day: + selector: td:nth-child(2):contains("day ") + # auto adjusted by site account profile + optional: true + remove: a, b, img, span + filters: + - name: fuzzytime + date_year: + # 2021-07-16 09:30 PM + selector: td:nth-child(2):not(:contains("day ")) + # auto adjusted by site account profile + optional: true + remove: a, b, img, span + filters: + - name: replace + args: ["|", ""] + - name: dateparse + args: "yyyy-MM-dd hh:mm tt" + date: + text: "{{ if or .Result.date_day .Result.date_year }}{{ or .Result.date_day .Result.date_year }}{{ else }}now{{ end }}" + minimumratio: + text: 1.0 +# TS Special Edition diff --git a/config/prowlarr/Definitions/learnflakes.yml b/config/prowlarr/Definitions/learnflakes.yml new file mode 100644 index 0000000..80f621d --- /dev/null +++ b/config/prowlarr/Definitions/learnflakes.yml @@ -0,0 +1,191 @@ +--- +id: learnflakes +name: LearnFlakes +description: "LearnFlakes is a Private Torrent Tracker for CERTIFICATE / TRAINING E-LEARNING" +language: en-US +type: private +encoding: UTF-8 +requestDelay: 2 +links: + - https://learnflakes.net/ + +caps: + categorymappings: + - {id: 1, cat: Books, desc: "LearnFlakes"} + - {id: 14, cat: Books, desc: "EMC"} + - {id: 16, cat: Books, desc: "SANS"} + - {id: 17, cat: Books, desc: "MOC "} + - {id: 31, cat: Books, desc: "CareerAcademy"} + - {id: 32, cat: Books, desc: "CBTNuggets"} + - {id: 33, cat: Books, desc: "INE"} + - {id: 34, cat: Books, desc: "Symantec"} + - {id: 35, cat: Books, desc: "Infiniteskills"} + - {id: 36, cat: Books, desc: "IPExpert"} + - {id: 37, cat: Books, desc: "Tuts+"} + - {id: 38, cat: Books, desc: "Pluralsight"} + - {id: 39, cat: Books/EBook, desc: "E-Books"} + - {id: 40, cat: Books, desc: "CBT-Videos"} + - {id: 41, cat: Books, desc: "Linux-CBT"} + - {id: 42, cat: Books, desc: "VTC"} + - {id: 43, cat: Books, desc: "Lynda"} + - {id: 44, cat: Books, desc: "TrainSignal"} + - {id: 50, cat: Books, desc: "LiveLessons"} + - {id: 47, cat: Books, desc: "Health"} + - {id: 48, cat: Books/Mags, desc: "Magazines"} + - {id: 49, cat: Books, desc: "CourseWare"} + - {id: 51, cat: Books, desc: "Programming"} + - {id: 52, cat: Books, desc: "Graphic & Design"} + - {id: 53, cat: Books, desc: "Udemy"} + - {id: 45, cat: Books/Other, desc: "Others"} + - {id: 54, cat: Books, desc: "SAP"} + - {id: 46, cat: Books, desc: "LF VIP"} + - {id: 55, cat: Books, desc: "Exclusive"} + + modes: + search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeders: seeders + size: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_results + type: info + label: Search results + default: "If you are getting the error Found no results while trying to browse this tracker then first access the site with your browser and check that you are not being forced to change your password because it has expired after 180 days." + +login: + path: ?p=home&pid=1 + method: form + form: form#loginbox_form + submitpath: ajax/login.php + inputs: + action: login + loginbox_membername: "{{ .Config.username }}" + loginbox_password: "{{ .Config.password }}" + loginbox_remember: 1 + selectorinputs: + securitytoken: + selector: "script:contains(\"stKey: \")" + filters: + - name: regexp + args: "stKey: \"(.+?)\"," + error: + - selector: div.error + - selector: :contains("-ERROR-") + test: + path: ?p=home&pid=1 + selector: div#member_info_bar + +search: + paths: + # 15 results per page + - path: / + inputs: + page: 1 + - path: / + inputs: + page: 2 + - path: / + inputs: + page: 3 + inputs: + p: torrents + pid: 10 + $raw: "{{ range .Categories }}&cid[]={{.}}{{end}}" + keywords: "{{ .Keywords }}" + # name, description, both, uploader + search_type: name + "sortOptions[sortBy]": "{{ .Config.sort }}" + "sortOptions[sortOrder]": "{{ .Config.type }}" + + rows: + selector: "div.torrent-box[id^=\"torrent_\"]{{ if .Config.freeleech }}:has(img[src$=\"/torrent_free.png\"]){{ else }}{{ end }}" + + fields: + title: + selector: a[href*="?p=torrents&pid=10&action=details&tid="] + details: + selector: a[href*="?p=torrents&pid=10&action=details&tid="] + attribute: href + category: + selector: a[href*="?p=torrents&pid=10&cid="] + attribute: href + filters: + - name: querystring + args: cid + download: + selector: a[href*="?p=torrents&pid=10&action=download&tid="] + attribute: href + poster: + selector: a[href*="data/torrents/torrent_images/"] + attribute: href + genre: + selector: div.torrentDetails > div:has(a[href*="&genre="]) + filters: + - name: replace + args: ["Genre:", ""] + description: + text: "{{ .Result.genre }}" + size: + selector: a[rel="torrent_size"] + grabs: + selector: a[rel="times_completed"] + seeders: + selector: a[rel="torrent_seeders"] + leechers: + selector: a[rel="torrent_leechers"] + date_day: + selector: div.torrentOwner:contains("day") + # auto adjusted by site account profile + optional: true + filters: + - name: regexp + args: "Uploaded (.+?) by" + - name: fuzzytime + date_year: + selector: div.torrentOwner:contains("-") + # auto adjusted by site account profile + optional: true + filters: + - name: regexp + args: "Uploaded (.+?) by" + - name: dateparse + args: "dd-MM-yyyy HH:mm" + date_unix: + selector: div.torrentOwner abbr + optional: true + attribute: data-time + date: + text: "{{ if or .Result.date_day .Result.date_year .Result.date_unix }}{{ or .Result.date_day .Result.date_year .Result.date_unix }}{{ else }}now{{ end }}" + downloadvolumefactor: + case: + img[src$="/torrent_free.png"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 0.5 +# TSUE 2.2 diff --git a/config/prowlarr/Definitions/leech24.yml b/config/prowlarr/Definitions/leech24.yml new file mode 100644 index 0000000..ea3d95a --- /dev/null +++ b/config/prowlarr/Definitions/leech24.yml @@ -0,0 +1,161 @@ +--- +id: leech24 +name: leech24 +description: "leech24 is a Private Torrent Tracker for MOVIES / TV / GENERAL" +language: en-US +type: private +encoding: UTF-8 +links: + - https://leech24.net/ + +caps: + categorymappings: + - {id: 28, cat: TV/Anime, desc: "Anime: All"} + - {id: 20, cat: PC, desc: "Apps: Linux"} + - {id: 19, cat: PC/Mac, desc: "Apps: Mac"} + - {id: 21, cat: PC/Mobile-Other, desc: "Apps: Other"} + - {id: 18, cat: PC/0day, desc: "Apps: PC"} + - {id: 9, cat: TV/Documentary, desc: "Documentaries: All"} + - {id: 45, cat: Console/NDS, desc: "Games: DS"} + - {id: 16, cat: Console/Other, desc: "Games: Dreamcast"} + - {id: 46, cat: Console/Other, desc: "Games: GameCube"} + - {id: 49, cat: Console/NDS, desc: "Games: Nintendo"} + - {id: 17, cat: Console/Other, desc: "Games: Other"} + - {id: 10, cat: PC/Games, desc: "Games: PC"} + - {id: 15, cat: Console/PSP, desc: "Games: PS"} + - {id: 12, cat: Console/PSP, desc: "Games: PSP"} + - {id: 44, cat: Console/Wii, desc: "Games: Wii"} + - {id: 13, cat: Console/XBox, desc: "Games: Xbox"} + - {id: 14, cat: Console/XBox 360, desc: "Games: Xbox360"} + - {id: 3, cat: Movies/UHD, desc: "Movies: 4K"} + - {id: 1, cat: Movies/DVD, desc: "Movies: DVD"} + - {id: 2, cat: Movies/SD, desc: "Movies: Divx/Xvid"} + - {id: 42, cat: Movies/HD, desc: "Movies: HD"} + - {id: 4, cat: Movies/Other, desc: "Movies: Other"} + - {id: 48, cat: Movies, desc: "Movies: Packs"} + - {id: 24, cat: Audio/Video, desc: "Music: DVD"} + - {id: 23, cat: Audio/Lossless, desc: "Music: Lossless"} + - {id: 22, cat: Audio/MP3, desc: "Music: MP3"} + - {id: 27, cat: Audio/Other, desc: "Music: Other"} + - {id: 26, cat: Audio/Other, desc: "Music: Radio"} + - {id: 25, cat: Audio/Video, desc: "Music: Video"} + - {id: 36, cat: Books/EBook, desc: "Other: E-Books"} + - {id: 33, cat: PC, desc: "Other: Emulation"} + - {id: 39, cat: Other, desc: "Other: Extra Pars/Fills"} + - {id: 37, cat: Other, desc: "Other: Images"} + - {id: 38, cat: PC/Mobile-Other, desc: "Other: Mobile Phone"} + - {id: 40, cat: Other, desc: "Other: Other"} + - {id: 34, cat: PC/Mobile-Other, desc: "Other: PPC/PDA"} + - {id: 35, cat: Audio, desc: "Other: Sounds"} + - {id: 5, cat: TV/SD, desc: "TV: DVD"} + - {id: 6, cat: TV/SD, desc: "TV: Divx/Xvid"} + - {id: 41, cat: TV/HD, desc: "TV: HD"} + - {id: 7, cat: TV/Other, desc: "TV: pack"} + - {id: 47, cat: XXX, desc: "xxx: xxx"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: id + options: + id: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: / + selector: a[href="account-logout.php"] + +search: + paths: + # https://leech24.net/torrents-search.php?c3=1&c1=1&c2=1&c42=1&c4=1&c7=1&search=&cat=0&incldead=1&freeleech=0&lang=0 + - path: torrents-search.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + cat: 0 + # 0 active, 1 incldead, 2 onlydead + incldead: 1 + # 0 all, 1 notfree, 2 onlyfree + freeleech: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 all, 1 english, etc + lang: 0 + sort: "{{ .Config.sort }}" + order: "{{ .Config.type }}" + # does not support imdbid search and does not return imdb link in results + +# The search page states that: You can search using phrases contained within , you can include words with + you can exclude words with - +# but adding + to words causes 0 results, so we will add an andmatch since the default seems to be a keywords OR search. +# keywordsfilters: +# - name: re_replace +# args: ["(\\w+)", "+$1"] # prepend + to each word + + rows: + selector: table.ttable_headinner tr.t-row:has(a[href^="download.php?id="]) + filters: + - name: andmatch + + fields: + category: + selector: a[href^="torrents.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="torrents-details.php?id="] + attribute: title + details: + selector: a[href^="torrents-details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + date: + text: now + size: + selector: td:nth-last-child(4) + seeders: + selector: td:nth-last-child(3) + leechers: + selector: td:nth-last-child(2) + downloadvolumefactor: + case: + img[src="images/free.gif"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 +# TorrentTrader v2-svn diff --git a/config/prowlarr/Definitions/lepornoinfo.yml b/config/prowlarr/Definitions/lepornoinfo.yml new file mode 100644 index 0000000..84c14fc --- /dev/null +++ b/config/prowlarr/Definitions/lepornoinfo.yml @@ -0,0 +1,122 @@ +--- +id: lepornoinfo +name: LePorno.info +description: "LePorno.info is a Public Tracker for 3X" +language: en-US +type: public +encoding: UTF-8 +links: + - https://leporno.info/ + +caps: + categorymappings: + - {id: 1, cat: XXX/XviD, desc: "Videos SD"} + - {id: 2, cat: XXX/x264, desc: "Videos HD"} + - {id: 3, cat: XXX/WMV, desc: "Movies"} + - {id: 17, cat: XXX/ImageSet, desc: "SiteRip's Picture Packs"} + - {id: 6, cat: XXX/Other, desc: "Porn (Other)"} + - {id: 4, cat: XXX, desc: "AV CENSORED (JAV)"} + - {id: 5, cat: XXX, desc: "AV UNCENSORED (JAV)"} + - {id: 7, cat: XXX, desc: "Hentai"} + - {id: 8, cat: XXX/Other, desc: "Porn (Other) JAV"} + - {id: 10, cat: XXX, desc: "Transsexual"} + - {id: 11, cat: XXX, desc: "Bisexual"} + - {id: 12, cat: XXX, desc: "BDSM"} + - {id: 13, cat: XXX, desc: "Femdom & Strapon"} + - {id: 14, cat: XXX, desc: "Fisting & Dildo"} + - {id: 15, cat: XXX, desc: "Pregnant"} + - {id: 16, cat: XXX, desc: "Fetish"} + - {id: 9, cat: XXX, desc: "Gay Forum"} + - {id: 18, cat: XXX, desc: "Incest & Taboo"} + - {id: 19, cat: XXX, desc: "Femdom & Strapon"} + + modes: + search: [q] + +settings: + - name: sort + type: select + label: Sort requested from site + default: 1 + options: + 1: created + 10: seeders + 7: size + 2: title + - name: type + type: select + label: Order requested from site + default: 2 + options: + 2: desc + 1: asc + +search: + paths: + - path: tracker.php + method: post + inputs: + $raw: "{{ if .Categories }}{{ range .Categories }}&f[]={{.}}{{end}}{{ else }}&f[]=-1{{ end }}" + prev_allw: 1 + prev_a: 0 + prev_dla: 0 + prev_dlc: 0 + prev_dld: 0 + prev_dlw: 0 + prev_my: 0 + prev_new: 0 + prev_sd: 0 + prev_da: 1 + prev_dc: 0 + prev_df: 1 + prev_ds: 0 + prev_tor_type: 0 + o: "{{ .Config.sort }}" + s: "{{ .Config.type }}" + tm: -1 + sns: -1 + srg: -1 + df: 1 + da: 1 + pn: "" + nm: "{{ .Keywords }}" + allw: 1 + submit: Search + + rows: + selector: table#tor-tbl tr[id^="tor_"] + filters: + - name: andmatch + + fields: + category: + selector: a[href^="tracker.php?f="] + attribute: href + filters: + - name: querystring + args: f + title: + selector: a[href^="./viewtopic.php?t="] + details: + selector: a[href^="./viewtopic.php?t="] + attribute: href + download: + selector: a[href^="./dl.php?id="] + attribute: href + magnet: + selector: a[href^="magnet:?xt="] + attribute: href + size: + selector: td:nth-child(6) u + date: + # unix + selector: td:nth-child(10) u + seeders: + selector: td.seedmed > b + leechers: + selector: td.leechmed > b + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/les-cinephiles.yml b/config/prowlarr/Definitions/les-cinephiles.yml new file mode 100644 index 0000000..144c39d --- /dev/null +++ b/config/prowlarr/Definitions/les-cinephiles.yml @@ -0,0 +1,277 @@ +--- +id: les-cinephiles +name: Les-Cinephiles +description: "Les-Cinephiles is a FRENCH Private Torrent Tracker for MOVIES / TV / GENERAL" +language: fr-FR +type: private +encoding: UTF-8 +links: + - https://les-cinephiles.nl/ + +caps: + categorymappings: + - {id: 2, cat: TV/Anime, desc: "Animations: 4K"} + - {id: 3, cat: TV/Anime, desc: "Animations: 4K Light"} + - {id: 4, cat: TV/Anime, desc: "Animations: BDRIP"} + - {id: 5, cat: TV/Anime, desc: "Animations: BRRIP"} + - {id: 6, cat: TV/Anime, desc: "Animations: BluRay-R"} + - {id: 8, cat: TV/Anime, desc: "Animations: DVD-R"} + - {id: 9, cat: TV/Anime, desc: "Animations: DVDRIP"} + - {id: 165, cat: TV/Anime, desc: "Animations: JAP"} + - {id: 11, cat: TV/Anime, desc: "Animations: HD 1080P"} + - {id: 12, cat: TV/Anime, desc: "Animations: HD 720p"} + - {id: 13, cat: TV/Anime, desc: "Animations: HDRIP"} + - {id: 14, cat: TV/Anime, desc: "Animations: REMUX"} + - {id: 15, cat: TV/Anime, desc: "Animations: TVRIP"} + - {id: 16, cat: TV/Anime, desc: "Animations: WEBRIP"} + - {id: 17, cat: TV/Anime, desc: "Animations: WEB-DL"} + - {id: 73, cat: Books, desc: "Ebook: BD"} + - {id: 74, cat: Books, desc: "Ebook: ENFANTS"} + - {id: 75, cat: Books/Comics, desc: "Ebook: MANGAS"} + - {id: 76, cat: Books, desc: "Ebook: ROMANS"} + - {id: 167, cat: Audio/Audiobook, desc: "Ebook: AUDIO"} + - {id: 168, cat: Books/Mags, desc: "Ebook: MAGAZINE"} + - {id: 24, cat: Movies, desc: "Film: DOC.UNIVERS"} + - {id: 20, cat: Movies, desc: "Film: DOC.DECOUVERTES"} + - {id: 23, cat: Movies, desc: "Film: DOC.SPORT"} + - {id: 18, cat: Movies, desc: "Film: DOC.ANIMAUX"} + - {id: 19, cat: Movies, desc: "Film: DOC.ANTIQUE"} + - {id: 21, cat: Movies, desc: "Film: DOC.DIVERS"} + - {id: 22, cat: Movies, desc: "Film: DOC.HISTOIRE"} + - {id: 164, cat: Movies, desc: "Film: EMISSION.TV"} + - {id: 198, cat: Movies, desc: "Film: DOC.SPECTACLE"} + - {id: 25, cat: Movies/3D, desc: "Film: 3D"} + - {id: 26, cat: Movies/UHD, desc: "Film: 4K"} + - {id: 27, cat: Movies/UHD, desc: "Film: 4K Light"} + - {id: 169, cat: Movies, desc: "Film: AV1"} + - {id: 28, cat: Movies/BluRay, desc: "Film: BDRIP"} + - {id: 29, cat: Movies/BluRay, desc: "Film: BRRIP"} + - {id: 30, cat: Movies/BluRay, desc: "Film: BluRay-R"} + - {id: 31, cat: Movies, desc: "Film: Coffret"} + - {id: 32, cat: Movies/DVD, desc: "Film: DVD-R"} + - {id: 33, cat: Movies/DVD, desc: "Film: DVDRIP"} + - {id: 36, cat: Movies/HD, desc: "Film: HD 720p"} + - {id: 35, cat: Movies/HD, desc: "Film: HD 1080P"} + - {id: 37, cat: Movies/HD, desc: "Film: HDRIP"} + - {id: 170, cat: Movies/HD, desc: "Film: HDTV"} + - {id: 172, cat: Movies/HD, desc: "Film: M-HD"} + - {id: 38, cat: Movies, desc: "Film: REMUX"} + - {id: 39, cat: Movies, desc: "Film: TVRIP"} + - {id: 41, cat: Movies/WEB-DL, desc: "Film: WEB-DL"} + - {id: 200, cat: Movies/WEB-DL, desc: "Film: WEB-RIP"} + - {id: 184, cat: Movies/BluRay, desc: "Film: VOSTFR bdrip"} + - {id: 185, cat: Movies/DVD, desc: "Film: VOSTFR.DVDrip"} + - {id: 186, cat: Movies/WEB-DL, desc: "Film: VOSTFR.WEBrip"} + - {id: 202, cat: Movies/WEB-DL, desc: "Film: VOSTFR-WebDL"} + - {id: 203, cat: Movies/BluRay, desc: "Film: VOSTFR-bluray"} + - {id: 59, cat: Console/3DS, desc: "Jeux: 3DS-DS"} + - {id: 60, cat: Console/Other, desc: "Jeux: ANDROID"} + - {id: 61, cat: Console/Other, desc: "Jeux: IOS-X"} + - {id: 62, cat: PC/Games, desc: "Jeux: PC"} + - {id: 63, cat: Console/PS4, desc: "Jeux: PS3-4"} + - {id: 64, cat: Console/PSP, desc: "Jeux: PSP-X"} + - {id: 65, cat: Console/WiiU, desc: "Jeux: WII-U"} + - {id: 66, cat: Console/Wii, desc: "Jeux: WII"} + - {id: 67, cat: Console/XBox, desc: "Jeux: XBOX"} + - {id: 68, cat: PC/Mobile-Android, desc: "Logiciel: ANDROID"} + - {id: 69, cat: PC/Mac, desc: "Logiciel: APPLE"} + - {id: 70, cat: PC/Mobile-iOS, desc: "Logiciel: IPHONE"} + - {id: 71, cat: PC/Mobile-Other, desc: "Logiciel: LINUX"} + - {id: 72, cat: PC/0day, desc: "Logiciel: WINDOWS"} + - {id: 7, cat: TV/Anime, desc: "Serie: Coffret-Anime"} + - {id: 197, cat: TV, desc: "Serie: EPISODE"} + - {id: 182, cat: TV/Anime, desc: "Serie: JAP-ANIM"} + - {id: 166, cat: TV/Documentary, desc: "Serie: SERIE Docu"} + - {id: 194, cat: TV/Documentary, desc: "Serie: DOCU.DIVERS"} + - {id: 195, cat: TV/Documentary, desc: "Serie: DOCU.EMISTV"} + - {id: 173, cat: TV/UHD, desc: "Serie: 4K"} + - {id: 174, cat: TV/UHD, desc: "Serie: 4k-lLIGHT"} + - {id: 85, cat: TV, desc: "Serie: Coffret"} + - {id: 86, cat: TV, desc: "Serie: DVD-R"} + - {id: 87, cat: TV, desc: "Serie : DVDRIP"} + - {id: 88, cat: TV/HD, desc: "Serie : HD 1080P"} + - {id: 89, cat: TV/HD, desc: "Serie: HD 720p"} + - {id: 90, cat: TV/HD, desc: "Serie: HDRIP"} + - {id: 175, cat: TV/HD, desc: "Serie: HDTV 720"} + - {id: 176, cat: TV/HD, desc: "Serie: HDTV 1080"} + - {id: 177, cat: TV/HD, desc: "Serie: M-HD"} + - {id: 91, cat: TV, desc: "Serie: REMUX"} + - {id: 92, cat: TV, desc: "Serie: TVRIP"} + - {id: 93, cat: TV/WEB-DL, desc: "Serie: WEBRIP"} + - {id: 178, cat: TV/WEB-DL, desc: "Serie: WEB-DL 720"} + - {id: 179, cat: TV/WEB-DL, desc: "Serie: WEB-DL 1080"} + - {id: 199, cat: TV/WEB-DL, desc: "Serie: WebDL"} + - {id: 188, cat: TV, desc: "Serie: VOSTFR.BDrip"} + - {id: 189, cat: TV, desc: "Serie: VOSTFR.DVDrip"} + - {id: 190, cat: TV/HD, desc: "Serie: VOSTFR.HDRIP"} + - {id: 191, cat: TV/WEB-DL, desc: "Serie: VOSTFR.WEBrip"} + - {id: 192, cat: TV/WEB-DL, desc: "Serie: VOSTFR.WEB-DL"} + - {id: 180, cat: TV, desc: "Serie: VOSTFR.COFFRET"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: multilang + type: checkbox + label: Replace MULTi by another language in release name + default: false + - name: multilanguage + type: select + label: Replace MULTi by this language + default: FRENCH + options: + FRENCH: FRENCH + MULTi.FRENCH: MULTi.FRENCH + ENGLISH: ENGLISH + MULTi.ENGLISH: MULTi.ENGLISH + VOSTFR: VOSTFR + MULTi.VOSTFR: MULTi.VOSTFR + - name: vostfr + type: checkbox + label: Replace VOSTFR and SUBFRENCH with ENGLISH + default: false + - name: sort + type: select + label: Sort requested from site + default: id + options: + id: created + name: title + size: size + seeders: seeders + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: account-login.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + remember: yes + error: + - selector: div.myFrame:contains("ACCESS_DENIED") + test: + path: index.php + selector: a[href="account-logout.php"] + +download: + before: + path: list_thanks.php + inputs: + id: "{{ .DownloadUri.Query.id }}" + to: give + torrent: "{{ .DownloadUri.Query.id }}" + selectors: + - selector: a[href^="download.php?id="] + attribute: href + +search: + paths: + - path: torrents-search.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + # 0 active, 1 incldead, 2 onlydead + incldead: 1 + # 0 all, 1 English, 2 French, 3 German, 4 Italian, 5 Japanese, 6 Spanish, 7 Russian, 8 multilang + lang: 0 + # 0 all 1 notfree 2 onlyfree + freeleech: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 both, 1 local, 2 external + inclexternal: 0 + search: "{{ .Keywords }}" + sort: "{{ .Config.sort }}" + order: "{{ .Config.type }}" + # does not support imdbid search or return imdb link + + keywordsfilters: + - name: re_replace + args: ["(\\w+)", " +$1"] # prepend + to each word + + rows: + selector: table[class="ttable_headinner"] tr.rowners + + fields: + category: + selector: td:first-child + attribute: torrents.php?cat + filters: + - name: regexp + args: (\d+) + title_phase1: + selector: a[href^="torrents-details.php?id="] + title_vostfr: + text: "{{ .Result.title_phase1 }}" + filters: + - name: re_replace + args: ["(?i)\\b(vostfr|subfrench)\\b", "ENGLISH"] + title_phase2: + text: "{{ if .Config.vostfr }}{{ .Result.title_vostfr }}{{ else }}{{ .Result.title_phase1 }}{{ end }}" + title_multilang: + text: "{{ .Result.title_phase2 }}" + filters: + - name: re_replace + args: ["(?i)\\b(MULTI(?!.*(?:FRENCH|ENGLISH|VOSTFR)))\\b", "{{ .Config.multilanguage }}"] + title: + text: "{{ if .Config.multilang }}{{ .Result.title_multilang }}{{ else }}{{ .Result.title_phase2 }}{{ end }}" + details: + selector: a[href^="torrents-details.php?id="] + attribute: href + download: + selector: a[href^="torrents-details.php?id="] + attribute: href + filters: + - name: replace + args: ["&hit=1", ""] # avoid redirect + poster: + selector: a[onMouseover] + attribute: onMouseover + filters: + - name: regexp + args: src=(.+?)> + date: + selector: a[onMouseover] + attribute: onMouseover + # auto adjusted by site account profile + filters: + - name: regexp + args: "(\\d{2}-\\d{2}-\\d{4})" + - name: dateparse + args: "dd-MM-yyyy" + size: + selector: td:nth-last-child(5) + seeders: + selector: td:nth-last-child(4) + leechers: + selector: td:nth-last-child(3) + grabs: + selector: td:nth-last-child(2) + downloadvolumefactor: + case: + img[src="img/freeleech_star.gif"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumseedtime: + # 1 day (as seconds = 24 x 60 x 60) + text: 86400 +# TorrentTrader 2.08 diff --git a/config/prowlarr/Definitions/lesaloon.yml b/config/prowlarr/Definitions/lesaloon.yml new file mode 100644 index 0000000..7d4212e --- /dev/null +++ b/config/prowlarr/Definitions/lesaloon.yml @@ -0,0 +1,228 @@ +--- +id: lesaloon +name: LeSaloon +description: "Le Saloon is a FRENCH Private Torrent Tracker for MOVIES / TV / GENERAL" +language: fr-FR +type: private +encoding: UTF-8 +links: + - https://lesaloonv2-0.lol/ + - https://lesaloonv2-0.net/ +legacylinks: + - http://lesaloonv2-0.net/ # site forces https + - https://lesaloonv2-0.xyz/ + +caps: + categorymappings: + - {id: 13, cat: Movies/BluRay, desc: "Films BD-Rip / BRRip"} + - {id: 19, cat: Movies/WEB-DL, desc: "Films WEB-DL / WEB-Rip"} + - {id: 15, cat: Movies/DVD, desc: "Films DVD-Rip"} + - {id: 18, cat: Movies/HD, desc: "Films HD 720p"} + - {id: 20, cat: Movies/HD, desc: "Films HD 1080p"} + - {id: 26, cat: Movies/HD, desc: "Films mHD 720p"} + - {id: 27, cat: Movies/HD, desc: "Films mHD 1080p"} + - {id: 28, cat: Movies/HD, desc: "Films x265"} + - {id: 29, cat: Movies, desc: "Films Remux"} + - {id: 30, cat: Movies/BluRay, desc: "Films Blu-Ray (complet)"} + - {id: 31, cat: Movies/3D, desc: "Films 3D"} + - {id: 32, cat: Movies/UHD, desc: "Films 4K UHD"} + - {id: 33, cat: Movies/SD, desc: "Films Québécois SD"} + - {id: 34, cat: Movies/HD, desc: "Films Québécois HD"} + - {id: 35, cat: Movies/DVD, desc: "Films Québécois DVD-R"} + - {id: 37, cat: Movies/DVD, desc: "Films DVD-R"} + - {id: 38, cat: Movies/SD, desc: "Films V.O.S.T. SD"} + - {id: 39, cat: Movies/HD, desc: "Films V.O.S.T. HD"} + - {id: 40, cat: Movies/SD, desc: "Films V.O. SD"} + - {id: 41, cat: Movies/HD, desc: "Films V.O. HD"} + - {id: 42, cat: Movies, desc: "Films TV-Rip"} + - {id: 21, cat: TV/SD, desc: "Séries-Télé SD"} + - {id: 22, cat: TV/HD, desc: "Séries-Télé HD"} + - {id: 17, cat: TV/SD, desc: "Séries-Télé Pack SD"} + - {id: 23, cat: TV/HD, desc: "Séries-Télé Pack HD"} + - {id: 45, cat: TV/SD, desc: "Séries-Télé Québécois SD"} + - {id: 46, cat: TV/HD, desc: "Séries-Télé Québécois HD"} + - {id: 47, cat: TV/SD, desc: "Séries-Télé V.O.S.T. SD"} + - {id: 48, cat: TV/HD, desc: "Séries-Télé V.O.S.T. HD"} + - {id: 49, cat: TV/SD, desc: "Séries-Télé Émissions TV SD"} + - {id: 50, cat: TV/HD, desc: "Séries-Télé Émissions TV HD"} + - {id: 51, cat: TV, desc: "Séries-Télé Blu-Ray"} + - {id: 52, cat: TV, desc: "Séries-Télé DVD-R"} + - {id: 43, cat: TV/SD, desc: "Séries-Télé Pack SD Québec"} + - {id: 44, cat: TV/HD, desc: "Séries-Télé Pack HD Québec"} + - {id: 77, cat: TV/Documentary, desc: "Docu. SD"} + - {id: 78, cat: TV/Documentary, desc: "Docu. HD"} + - {id: 79, cat: TV/Documentary, desc: "Docu. V.O.S.T. SD"} + - {id: 80, cat: TV/Documentary, desc: "Docu. V.O.S.T. HD"} + - {id: 85, cat: TV/Documentary, desc: "Docu-Série SD"} + - {id: 86, cat: TV/Documentary, desc: "Docu-Série HD"} + - {id: 87, cat: TV/Documentary, desc: "Docu-Pack SD"} + - {id: 88, cat: TV/Documentary, desc: "Docu-Pack HD"} + - {id: 54, cat: Audio/MP3, desc: "Musique MP3"} + - {id: 55, cat: Audio/Lossless, desc: "Musique FLAC"} + - {id: 56, cat: Audio, desc: "Musique DSD"} + - {id: 57, cat: Audio, desc: "Musique Karaoke"} + - {id: 58, cat: Audio/Other, desc: "Musique Autres"} + - {id: 59, cat: PC/Games, desc: "Jeux PC"} + - {id: 60, cat: Console, desc: "Jeux Consoles"} + - {id: 61, cat: Books/EBook, desc: "Livres epub"} + - {id: 62, cat: Books/EBook, desc: "Livres pdf"} + - {id: 63, cat: Books/Mags, desc: "Livres Journaux"} + - {id: 64, cat: Books/Mags, desc: "Livres Magazines"} + - {id: 65, cat: Books/Comics, desc: "Livres Bandes Dessinées"} + - {id: 66, cat: Books/Other, desc: "Livres Multi-Format"} + - {id: 68, cat: PC/0day, desc: "Logiciels Windows"} + - {id: 69, cat: PC/Mac, desc: "Logiciels Mac"} + - {id: 71, cat: TV/Other, desc: "Spectacles Humour"} + - {id: 72, cat: TV/Other, desc: "Spectacles Live"} + - {id: 84, cat: TV/Other, desc: "Théâtre"} + - {id: 83, cat: TV/Anime, desc: "Séries Animées"} + - {id: 74, cat: TV/Sport, desc: "Sports [Français]"} + - {id: 75, cat: TV/Sport, desc: "Sports [Anglais]"} + - {id: 82, cat: Other, desc: "Autres / Inclassable"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: multilang + type: checkbox + label: Replace MULTi by another language in release name + default: false + - name: multilanguage + type: select + label: Replace MULTi by this language + default: FRENCH + options: + FRENCH: FRENCH + MULTi FRENCH: MULTi FRENCH + ENGLISH: ENGLISH + MULTi ENGLISH: MULTi ENGLISH + VOSTFR: VOSTFR + MULTi VOSTFR: MULTi VOSTFR + - name: vostfr + type: checkbox + label: Replace VOSTFR and SUBFRENCH with ENGLISH + default: false + - name: vfq + type: checkbox + label: Replace VFQ with FRENCH + default: false + +login: + # https://lesaloonv2-0.xyz/yupy_login.php + path: yupy_login.php + method: form + form: form[action^="login"] + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + loginButton: XZ + error: + - selector: "p[style=\"color: #B73C38\"]" + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + # http://lesaloonv2-0.xyz/index.php?page=torrents&search=supernatural+s13e20&parentcategory=0&category=0&genre=0&options=0&active=0 + - path: index.php + inputs: + page: torrents + search: "{{ .Keywords }}" + parentcategory: 0 + category: 0 + genre: 0 + # 0 name, 1 name & descr, 2 desc, 3 uploaders, 5 gold, 6 silver, 7 bronze + options: "{{ if .Config.freeleech }}5{{ else }}0{{ end }}" + # 0 all, 1 active, 2 dead + active: 0 + # does not support imdbid searching and does not have imdb links in results + + rows: + selector: table.torrentlist tbody tr:has(a[href^="index.php?page=torrent-details"]) + + fields: + category: + selector: td a[href^="index.php?page=torrents&category="] + attribute: href + filters: + - name: querystring + args: category + title_phase1: + selector: td a[href^="index.php?page=torrent-details"] + title_vfq: + text: "{{ .Result.title_phase1 }}" + filters: + - name: re_replace + args: ["(?i)\\b(VFQ)\\b", "FRENCH"] + title_phase2: + text: "{{ if .Config.vfq }}{{ .Result.title_vfq }}{{ else }}{{ .Result.title_phase1 }}{{ end }}" + title_vostfr: + text: "{{ .Result.title_phase2 }}" + filters: + - name: re_replace + args: ["(?i)\\b(vostfr|subfrench)\\b", "ENGLISH"] + title_phase3: + text: "{{ if .Config.vostfr }}{{ .Result.title_vostfr }}{{ else }}{{ .Result.title_phase2 }}{{ end }}" + title_multilang: + text: "{{ .Result.title_phase3 }}" + filters: + - name: re_replace + args: ["(?i)\\b(MULTI(?!.*(?:FRENCH|ENGLISH|VOSTFR)))\\b", "{{ .Config.multilanguage }}"] + title: + text: "{{ if .Config.multilang }}{{ .Result.title_multilang }}{{ else }}{{ .Result.title_phase3 }}{{ end }}" + details: + selector: td a[href^="index.php?page=torrent-details"] + attribute: href + download: + selector: td a[href^="download.php?id="] + attribute: href + poster: + selector: a[href^="index.php?page=torrent-details"][onmouseover] + attribute: onmouseover + filters: + - name: regexp + args: "src=(.*?) " + date: + # 06/02/2019 18:19:28 + selector: td:nth-child(7) + filters: + - name: append + args: " +01:00" # CET + - name: dateparse + args: "dd/MM/yyyy HH:mm:ss zzz" + seeders: + selector: td:nth-child(8) + leechers: + selector: td:nth-child(9) + grabs: + selector: td:nth-child(10) + size: + selector: td:nth-child(12) + downloadvolumefactor: + case: + img[src="images/freeleech.gif"]: 0 + img[src="images/gold.gif"]: 0 + img[src="images/silver.gif"]: 0.5 + img[src="images/bronze.gif"]: 0.25 + "*": 1 + uploadvolumefactor: + case: +# img[src="images/bronze.gif"]: "2" # its in the rules as x2up, but all the bronze i've see so far are just 1/4 download in the title. + "*": 1 +# engine n/a diff --git a/config/prowlarr/Definitions/lesbians4u.yml b/config/prowlarr/Definitions/lesbians4u.yml new file mode 100644 index 0000000..a9590f1 --- /dev/null +++ b/config/prowlarr/Definitions/lesbians4u.yml @@ -0,0 +1,167 @@ +--- +id: lesbians4u +name: Lesbians4u +description: "Lesbians4u is a Private Torrent Tracker for 3X" +language: en-US +type: private +encoding: UTF-8 +links: + - http://lesbians4u.org/ # does not support https, CA invalid + +caps: + categorymappings: + - {id: 7, cat: XXX, desc: "Amateur"} + - {id: 12, cat: XXX, desc: "Anime &Hentai &JAV"} + - {id: 17, cat: XXX, desc: "Appz"} + - {id: 3, cat: XXX, desc: "Classics"} + - {id: 6, cat: XXX, desc: "Clips &Siterips"} + - {id: 16, cat: XXX, desc: "DVD"} + - {id: 15, cat: XXX, desc: "EX-V.I.P. Torrents"} + - {id: 9, cat: XXX, desc: "Fetish"} + - {id: 8, cat: XXX, desc: "Games"} + - {id: 11, cat: XXX, desc: "Misc."} + - {id: 10, cat: XXX, desc: "Movie"} + - {id: 5, cat: XXX, desc: "Solo"} + - {id: 14, cat: XXX, desc: "V.I.P."} + - {id: 13, cat: XXX, desc: "Watersport"} + + modes: + search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + logout: "" + error: + - selector: table:has(a[href*="login.php?error=1"]) + message: + text: "ERROR: Incorrect username!" + - selector: table:has(a[href*="login.php?error=4"]) + message: + text: "ERROR: Incorrect password!" + - selector: table:has(a[href*="login.php?error="]) + message: + text: "ERROR: Something went wrong during login!" + test: + path: index.php + selector: a[href*="/logout.php?logouthash="] + +download: + before: + path: takethanks.php + method: post + inputs: + torrentid: "{{ re_replace .DownloadUri.PathAndQuery \".*torrent-details-(\\d+).*\" \"$1\"}}" + selectors: + - selector: a[href*="download-torrent-"] + attribute: href + +search: + paths: + - path: browse.php + + keywordsfilters: + # prefix and postfix percent wildcard as well as replacing spaces between words + - name: re_replace + args: ["\\W+", "%"] + - name: re_replace + args: ["^(.+)$", "%$1%"] + + inputs: + do: search + keywords: "{{ .Keywords }}" + # t_name, t_description, t_both, t_uploader, t_genre + search_type: t_name + # does not support multi category searching so defaulting to all. + category: 0 + include_dead_torrents: yes + sort: "{{ if .Config.freeleech }}free{{ else }}{{ .Config.sort }}{{ end }}" + order: "{{ if .Config.freeleech }}asc{{ else }}{{ .Config.type }}{{ end }}" + + rows: + selector: "table.sortable tr:has(a[href*=\"/download-torrent-\"]){{ if .Config.freeleech }}:has(img[src$=\"/freedownload.gif\"]){{ else }}{{ end }}" + + fields: + category: + selector: a[href*="torrent-category-"] + attribute: href + filters: + - name: regexp + args: torrent-category-(\d+) + title_default: + # is often abbreviated + selector: a[href*="torrent-details-"] + title: + # usually longer than details title + selector: div[id^="port-content-"] div + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href*="torrent-details-"] + attribute: href + download: + selector: a[href*="torrent-details-"] + attribute: href + poster: + selector: div[id^="port-content-"] img + attribute: src + date: + selector: td:nth-child(2) > div:last-child + filters: + - name: regexp + args: (\d{2}-\d{2}-\d{4} \d{2}:\d{2}) + - name: append + args: " +00:00" # auto adjusted by site account profile + - name: dateparse + args: "dd-MM-yyyy HH:mm zzz" + size: + selector: td:nth-child(5) + grabs: + selector: td:nth-child(6) + seeders: + selector: td:nth-child(7) + leechers: + selector: td:nth-child(8) + downloadvolumefactor: + case: + img[src$="/freedownload.gif"]: 0 + img[src$="/silverdownload.gif"]: 0.5 + "*": 1 + uploadvolumefactor: + case: + img[src$="/x2.gif"]: 2 + "*": 1 + minimumratio: + text: 1.0 +# TS Special Edition v.7.3 diff --git a/config/prowlarr/Definitions/libranet.yml b/config/prowlarr/Definitions/libranet.yml new file mode 100644 index 0000000..a3a8f85 --- /dev/null +++ b/config/prowlarr/Definitions/libranet.yml @@ -0,0 +1,119 @@ +--- +id: libranet +name: LibraNet +description: "LibraNet (LN) is a HUNGARIAN Private Torrent Tracker for EBOOKS / LOSSLESS MUSIC" +language: hu-HU +type: private +encoding: ISO-8859-2 +links: + - https://libranet.org/ + +caps: + categorymappings: + - {id: 50, cat: Movies, desc: "Film"} + - {id: 51, cat: Movies, desc: "Film/Hun"} + - {id: 3, cat: Audio/Audiobook, desc: "Hangoskönyv"} + - {id: 4, cat: Audio/Audiobook, desc: "Hangoskönyv/Hun"} + - {id: 1, cat: Books/EBook, desc: "Könyv"} + - {id: 2, cat: Books/EBook, desc: "Könyv/Hun"} + - {id: 56, cat: Audio/Lossless, desc: "LossLess"} + - {id: 57, cat: Audio/Lossless, desc: "LossLess/Hun"} + - {id: 48, cat: Books/Mags, desc: "Magazin"} + - {id: 49, cat: Books/Mags, desc: "Magazin/Hun"} + + modes: + search: [q] + movie-search: [q] + music-search: [q] + book-search: [q] + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: td.text:contains("Error") + message: + selector: td.text + test: + path: / + selector: a[href="/logout.php"] + +search: + paths: + # http://libranet.org/browse.php?cat56=1&cat57=1&search=&searchwhere=&subcat=&musicstyle=&format= + - path: browse.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # empty () author and title, (eloado) author only, (album) title only, (language), (catalognum), (series) series, (szeria) series, (polc) shelf + searchwhere: "" + subcat: "" + musicstyle: "" + format: "" + incldead: 1 + + rows: + selector: table.rounded tr:has(a[href^="browse.php?cat="]) + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + _format: + selector: img[width="60"] + attribute: title + title: + selector: a[href^="details.php?id="] + filters: + - name: append + args: " {{ .Result._format }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="details.php?id="] + attribute: href + filters: + - name: replace + args: ["details", "download"] + - name: replace + args: ["&hit=1", ""] + poster: + selector: a[onmouseover] + attribute: onmouseover + filters: + - name: regexp + args: src=([^\s]+) + date: + selector: td:nth-last-child(7) + filters: + - name: append + args: " +01:00" # CET + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + size: + selector: td:nth-last-child(6) + grabs: + selector: td:nth-last-child(5) + seeders: + selector: td:nth-last-child(4) + leechers: + selector: td:nth-last-child(3) + downloadvolumefactor: + case: + img[src$="/pic/freeleech.gif"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + genre: + selector: td > table + remove: b + description: + text: "{{ .Result._format }}{{ if .Result.genre }} - {{ .Result.genre }}{{ else }}{{ end }}" +# TBdev diff --git a/config/prowlarr/Definitions/limetorrents.yml b/config/prowlarr/Definitions/limetorrents.yml new file mode 100644 index 0000000..c911ef3 --- /dev/null +++ b/config/prowlarr/Definitions/limetorrents.yml @@ -0,0 +1,163 @@ +--- +id: limetorrents +name: LimeTorrents +description: "LimeTorrents is a Public general torrent index with mostly verified torrents" +language: en-US +type: public +encoding: UTF-8 +# changes to this indexer should also be made to limetorrentsclone +links: + - https://www.limetorrents.lol/ + - https://limetorrents.unblockit.date/ + - https://limetorrents.ninjaproxy1.com/ + - https://limetorrents.mrunblock.bond/ + - https://limetorrents.nocensor.cloud/ +legacylinks: + - https://www.limetorrents.io/ + - https://www.limetorrents.cc/ + - https://www.limetorrents.me/ + - https://www.limetorrents.zone/ # redirects to .info + - https://www.limetorrents.info/ + - https://www.limetorrents.asia/ + - https://www.limetorrents.co/ + - https://limetor.com/ + - https://www.limetor.pro/ + - https://www.limetorrents.pro/ + - https://limetorrents.unblockit.nz/ + - https://limetorrents.nocensor.world/ + - https://limetorrents.unblockit.page/ + - https://limetorrents.unblockit.pet/ + - https://limetorrents.nocensor.lol/ + - https://limetorrents.unblockit.ink/ + - https://limetorrents.nocensor.art/ + - https://limetorrents.unblockit.bio/ + - https://limetorrents.unblockit.boo/ + - https://limetorrents.mrunblock.guru/ + - https://limetorrents.unblockit.click/ + - https://limetorrents.unblockit.asia/ + - https://limetorrents.unblockit.mov/ + - https://limetorrents.mrunblock.life/ + - https://limetorrents.unblockit.rsvp/ + - https://limetorrents.nocensor.click/ + - https://limetorrents.unblockninja.com/ + - https://limetorrents.unblockit.vegas/ + - https://limetorrents.unblockit.esq/ + - https://limetorrents.unblockit.zip/ + - https://limetorrents.unblockit.foo/ + - https://limetorrents.unblockit.ing/ + +caps: + categorymappings: + - {id: "TV shows", cat: TV, desc: "TV shows"} + - {id: Movies, cat: Movies, desc: Movies} + - {id: Music, cat: Audio, desc: Music} + - {id: Games, cat: Console, desc: Games} + - {id: Applications, cat: PC/0day, desc: Applications} + - {id: Other, cat: Other, desc: Other} + - {id: Anime, cat: TV/Anime, desc: Anime} + - {id: E-books, cat: Books/EBook, desc: E-books} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: downloadlink + type: select + label: Download link + default: "magnet:" + options: + "http://itorrents.org/": iTorrents.org + "magnet:": magnet + - name: downloadlink2 + type: select + label: Download link (fallback) + default: "http://itorrents.org/" + options: + "http://itorrents.org/": iTorrents.org + "magnet:": magnet + - name: info_download + type: info + label: About the Download links + default: As the .torrent download links on this site are known to fail from time to time, you can optionally set as a fallback an automatic alternate link. + - name: sort + type: select + label: Sort requested from site + default: date + options: + date: created + seeds: seeders + size: size + - name: info_8000 + type: info + label: About LimeTorrents Categories + default: LimeTorrents only returns category Other in its Keywordless search results page.
To pass your apps' indexer TEST you will need to include the 8000(Other) category. + +download: + # the .torrent url is on the on the details page + selectors: + - selector: a.csprite_dltorrent[href^="{{ .Config.downloadlink }}"] + attribute: href + - selector: a.csprite_dltorrent[href^="{{ .Config.downloadlink2 }}"] + attribute: href + +search: + paths: + - path: "{{ if .Keywords }}search/all/{{ .Keywords }}/{{ .Config.sort }}/1/{{ else }}/latest100{{ end }}" + keywordsfilters: + - name: re_replace + args: ["S[0-9]{2}([^E]|$)", ""] # remove season tag without episode + + rows: + selector: .table2 > tbody > tr[bgcolor] + + fields: + title: + selector: div.tt-name > a[href^="/"] + attribute: href + filters: + - name: regexp + args: "/(.+?)-torrent-\\d+\\.html" + - name: re_replace + args: ["-", " "] + category_is_tv_show: + text: "{{ .Result.title }}" + filters: + - name: regexp + args: "\\b(S\\d+(?:E\\d+)?)\\b" + category: + selector: td:nth-child(2) + optional: true + default: "{{ if .Result.category_is_tv_show }}TV shows{{ else }}Other{{ end }}" + filters: + - name: regexp + args: " in (.+?)[.]?$" + details: + selector: div.tt-name > a[href^="/"] + attribute: href + download: + selector: div.tt-name > a[href^="/"] + attribute: href + date: + selector: td:nth-child(2) + filters: + - name: split + args: ["-", 0] + - name: replace + args: ["Last Month", "1 month ago"] + - name: replace + args: ["+", " ago"] + size: + selector: td:nth-child(3) + seeders: + selector: .tdseed + leechers: + selector: .tdleech + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/limetorrentsclone.yml b/config/prowlarr/Definitions/limetorrentsclone.yml new file mode 100644 index 0000000..6de1066 --- /dev/null +++ b/config/prowlarr/Definitions/limetorrentsclone.yml @@ -0,0 +1,126 @@ +--- +id: limetorrentsclone +name: LimeTorrents clone +description: "LimeTorrents clone is a Public LimeTorrents clone for TV / MOVIES / GENERAL" +language: en-US +type: public +encoding: UTF-8 +# changes to this indexer should also be made to limetorrents +links: + - https://www.limetorrents.to/ + +caps: + categorymappings: + - {id: "TV shows", cat: TV, desc: "TV shows"} + - {id: Movies, cat: Movies, desc: Movies} + - {id: Music, cat: Audio, desc: Music} + - {id: Games, cat: Console, desc: Games} + - {id: Applications, cat: PC/0day, desc: Applications} + - {id: Other, cat: Other, desc: Other} + - {id: Anime, cat: TV/Anime, desc: Anime} + - {id: E-books, cat: Books/EBook, desc: E-books} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: downloadlink + type: select + label: Download link + default: "magnet:" + options: + "http://itorrents.org/": iTorrents.org + "magnet:": magnet + - name: downloadlink2 + type: select + label: Download link (fallback) + default: "http://itorrents.org/" + options: + "http://itorrents.org/": iTorrents.org + "magnet:": magnet + - name: info_download + type: info + label: About the Download links + default: As the .torrent download links on this site are known to fail from time to time, you can optionally set as a fallback an automatic alternate link. + - name: sort + type: select + label: Sort requested from site + default: date + options: + date: created + seeds: seeders + size: size + - name: info_8000 + type: info + label: About LimeTorrents Categories + default: LimeTorrents only returns category Other in its Keywordless search results page.
To pass your apps' indexer TEST you will need to include the 8000(Other) category. + +download: + # the .torrent url is on the on the details page + selectors: + - selector: a.csprite_dltorrent[href^="{{ .Config.downloadlink }}"] + attribute: href + - selector: a.csprite_dltorrent[href^="{{ .Config.downloadlink2 }}"] + attribute: href + +search: + paths: + - path: "{{ if .Keywords }}search/all/{{ .Keywords }}/{{ .Config.sort }}/1/{{ else }}/latest100{{ end }}" + keywordsfilters: + - name: re_replace + args: ["S[0-9]{2}([^E]|$)", ""] # remove season tag without episode + + rows: + selector: .table2 > tbody > tr[bgcolor] + + fields: + title: + selector: div.tt-name > a[href^="/"] + attribute: href + filters: + - name: regexp + args: "/(.+?)-torrent-\\d+\\.html" + - name: re_replace + args: ["-", " "] + category_is_tv_show: + text: "{{ .Result.title }}" + filters: + - name: regexp + args: "\\b(S\\d+(?:E\\d+)?)\\b" + category: + selector: td:nth-child(2) + optional: true + default: "{{ if .Result.category_is_tv_show }}TV shows{{ else }}Other{{ end }}" + filters: + - name: regexp + args: " in (.+?)[.]?$" + details: + selector: div.tt-name > a[href^="/"] + attribute: href + download: + selector: div.tt-name > a[href^="/"] + attribute: href + date: + selector: td:nth-child(2) + filters: + - name: split + args: ["-", 0] + - name: replace + args: ["Last Month", "1 month ago"] + - name: replace + args: ["+", " ago"] + size: + selector: td:nth-child(3) + seeders: + selector: .tdseed + leechers: + selector: .tdleech + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/linkomanija.yml b/config/prowlarr/Definitions/linkomanija.yml new file mode 100644 index 0000000..0e38a30 --- /dev/null +++ b/config/prowlarr/Definitions/linkomanija.yml @@ -0,0 +1,165 @@ +--- +id: linkomanija +name: LinkoManija +description: "LinkoManija is an LITHUANIAN Private site for TV / MOVIES / GENERAL" +language: lt-LT +type: private +encoding: UTF-8 +links: + - https://www.linkomanija.net/ + +caps: + categorymappings: + - {id: 29, cat: Movies/SD, desc: "Movies"} + - {id: 52, cat: Movies/HD, desc: "Movies HD"} + - {id: 30, cat: TV/SD, desc: "TV"} + - {id: 60, cat: TV/HD, desc: "TV HD"} + - {id: 45, cat: PC/Games, desc: "PC Games"} + - {id: 37, cat: Audio, desc: "Music"} + - {id: 56, cat: Books, desc: "Books"} + - {id: 40, cat: Other/Misc, desc: "Misc"} + - {id: 53, cat: Movies/SD, desc: "Movies LT"} + - {id: 61, cat: Movies/HD, desc: "Movies LT HD"} + - {id: 28, cat: TV/SD, desc: "TV LT"} + - {id: 62, cat: TV/HD, desc: "TV LT HD"} + - {id: 63, cat: PC/Games, desc: "PC Games Misc"} + - {id: 33, cat: Audio, desc: "Music LT"} + - {id: 57, cat: Books, desc: "Books LT"} + - {id: 43, cat: Other/Misc, desc: "Misc LT"} + - {id: 51, cat: Movies/SD, desc: "Movies RU"} + - {id: 64, cat: Movies/HD, desc: "Movies RU HD"} + - {id: 65, cat: TV, desc: "TV RU"} + - {id: 25, cat: Movies/DVD, desc: "DVD"} + - {id: 42, cat: Console/XBox, desc: "XBOX"} + - {id: 66, cat: Audio/Lossless, desc: "Music Lossless"} + - {id: 41, cat: PC/Mac, desc: "MAC"} + - {id: 69, cat: PC/Mobile-Android, desc: "Android"} + - {id: 46, cat: TV/Sport, desc: "Sports"} + - {id: 58, cat: TV/Documentary, desc: "Documentaries"} + - {id: 38, cat: TV/Anime, desc: "Anime"} + - {id: 26, cat: Movies/DVD, desc: "DVD LT"} + - {id: 44, cat: Console/Other, desc: "Consoles"} + - {id: 31, cat: Audio/Video, desc: "Music Videos"} + - {id: 32, cat: PC/0day, desc: "Appz"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: added + options: + name: title + added: created + seeders: seeders + size: size + - name: type + type: select + label: Order requested from site + default: DESC + options: + DESC: desc + ASC: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrentų puslapyje setting to 100 on your account profile. + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: div.klaida + test: + path: browse.php + selector: a[href*="logout.php"] + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # 0 active, 1 incldead, 2 dead + incldead: 1 + freeleech: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + searchindesc: "{{ if .Query.IMDBID }}1{{ else }}{{ end }}" + sort: "{{ .Config.sort }}" + d: "{{ .Config.type }}" + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + - name: re_replace + args: ["(\\w+)", "+$1"] # prepend + to each word + + rows: + selector: table> tbody > tr:has(a[href^="details?"]) + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details?"] + details: + selector: a[href^="details?"] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + genre: + selector: td:nth-child(2) > span + filters: + - name: re_replace + args: [" \\| .+", ""] + description: + selector: td:nth-child(2) > span + files: + selector: td:nth-child(3) + date: + selector: td:nth-child(5) + filters: + - name: append + args: " +02:00" # EET + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + size: + selector: td:nth-child(6) + grabs: + selector: td:nth-child(7) + seeders: + selector: td:nth-child(8) + leechers: + selector: td:nth-child(9) + downloadvolumefactor: + case: + img[src$="/images/flag_green.gif"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 0.3 +# engine tbd diff --git a/config/prowlarr/Definitions/linuxtracker.yml b/config/prowlarr/Definitions/linuxtracker.yml new file mode 100644 index 0000000..29b4382 --- /dev/null +++ b/config/prowlarr/Definitions/linuxtracker.yml @@ -0,0 +1,404 @@ +--- +id: linuxtracker +name: LinuxTracker +description: "LinuxTracker is a Public Linux ISO Torrent Repository" +language: en-US +type: public +encoding: UTF-8 +requestDelay: 2 +links: + - https://linuxtracker.org/ + +caps: + categorymappings: + - {id: 0, cat: Other, desc: "Other"} + - {id: 2002, cat: PC/ISO, desc: "4MLinux"} + - {id: 2004, cat: PC/ISO, desc: "ALT Linux"} + - {id: 2289, cat: PC/ISO, desc: "APODIO"} + - {id: 2012, cat: PC/ISO, desc: "AV Linux"} + - {id: 13, cat: PC/ISO, desc: "Absolute"} + - {id: 2003, cat: PC/ISO, desc: "Alpine Linux"} + - {id: 2292, cat: PC/ISO, desc: "Anarchy Linux"} + - {id: 2005, cat: PC/ISO, desc: "Android x86"} + - {id: 2006, cat: PC/ISO, desc: "Antergos"} + - {id: 2007, cat: PC/ISO, desc: "AntiX"} + - {id: 2263, cat: PC/ISO, desc: "Antivirus Live CD"} + - {id: 39, cat: PC/ISO, desc: "Arch Linux"} + - {id: 2212, cat: PC/ISO, desc: "ArchLabs"} + - {id: 2009, cat: PC/ISO, desc: "Archbang"} + - {id: 2183, cat: PC/ISO, desc: "Archman"} + - {id: 2196, cat: PC/ISO, desc: "ArcoLinux"} + - {id: 2216, cat: PC/ISO, desc: "Artix Linux"} + - {id: 2227, cat: PC/ISO, desc: "AryaLinux"} + - {id: 2288, cat: PC/ISO, desc: "Audiophile Linux"} + - {id: 56, cat: PC/ISO, desc: "Austrumi"} + - {id: 2252, cat: PC/ISO, desc: "BBQLinux"} + - {id: 2260, cat: PC/ISO, desc: "BSD Router Project"} + - {id: 2219, cat: PC/ISO, desc: "BackSlash Linux"} + - {id: 1231, cat: PC/ISO, desc: "Backbox"} + - {id: 2237, cat: PC/ISO, desc: "Batocera Linux"} + - {id: 2272, cat: PC/ISO, desc: "BeeFree OS"} + - {id: 2017, cat: PC/ISO, desc: "Berry Linux"} + - {id: 2243, cat: PC/ISO, desc: "BicomSystems PBXware"} + - {id: 2275, cat: PC/ISO, desc: "BigLinux"} + - {id: 2286, cat: PC/ISO, desc: "BitKey"} + - {id: 2020, cat: PC/ISO, desc: "BlackArch"} + - {id: 1238, cat: PC/ISO, desc: "BlackPanther OS"} + - {id: 2262, cat: PC/ISO, desc: "BlackWeb"} + - {id: 2283, cat: PC/ISO, desc: "Blackhat-Global OS"} + - {id: 2021, cat: PC/ISO, desc: "Blacklab"} + - {id: 2022, cat: PC/ISO, desc: "Blag"} + - {id: 79, cat: PC/ISO, desc: "BlankOn"} + - {id: 2182, cat: PC/ISO, desc: "Bluestar Linux"} + - {id: 2023, cat: PC/ISO, desc: "Bodhi"} + - {id: 2205, cat: PC/ISO, desc: "BunsenLabs"} + - {id: 2026, cat: PC/ISO, desc: "Cae"} + - {id: 1220, cat: PC/ISO, desc: "Caine"} + - {id: 2028, cat: PC/ISO, desc: "Calculate Linux"} + - {id: 102, cat: PC/ISO, desc: "CentOS"} + - {id: 1216, cat: PC/ISO, desc: "Chakra"} + - {id: 2033, cat: PC/ISO, desc: "Chapeau"} + - {id: 2253, cat: PC/ISO, desc: "Clear Linux"} + - {id: 2264, cat: PC/ISO, desc: "ClearOS"} + - {id: 2248, cat: PC/ISO, desc: "ClonOS"} + - {id: 107, cat: PC/ISO, desc: "Clonezilla"} + - {id: 2257, cat: PC/ISO, desc: "Condres OS"} + - {id: 2036, cat: PC/ISO, desc: "Connochaet"} + - {id: 2037, cat: PC/ISO, desc: "Container Linux"} + - {id: 121, cat: PC/ISO, desc: "Crunchbang"} + - {id: 122, cat: PC/ISO, desc: "Crux"} + - {id: 2273, cat: PC/ISO, desc: "Cryptocurrency OS"} + - {id: 2245, cat: PC/ISO, desc: "Cucumber Linux"} + - {id: 2285, cat: PC/ISO, desc: "DRBL Live"} + - {id: 123, cat: PC/ISO, desc: "Damnsmall"} + - {id: 128, cat: PC/ISO, desc: "Debian"} + - {id: 131, cat: PC/ISO, desc: "Deepin"} + - {id: 2038, cat: PC/ISO, desc: "Deft"} + - {id: 2192, cat: PC/ISO, desc: "Devuan"} + - {id: 2287, cat: PC/ISO, desc: "Doge Linux"} + - {id: 144, cat: PC/ISO, desc: "DragonFly BSD"} + - {id: 2215, cat: PC/ISO, desc: "Dragora GNU/Linux"} + - {id: 2226, cat: PC/ISO, desc: "DuZeru OS"} + - {id: 148, cat: PC/ISO, desc: "Dynebolic"} + - {id: 2261, cat: PC/ISO, desc: "Eagle Mode"} + - {id: 2265, cat: PC/ISO, desc: "EasyNAS"} + - {id: 2259, cat: PC/ISO, desc: "EasyOS"} + - {id: 155, cat: PC/ISO, desc: "Edubuntu"} + - {id: 2040, cat: PC/ISO, desc: "Elastix"} + - {id: 2041, cat: PC/ISO, desc: "Elementary OS"} + - {id: 161, cat: PC/ISO, desc: "Elive"} + - {id: 2042, cat: PC/ISO, desc: "Emmabuntus"} + - {id: 2231, cat: PC/ISO, desc: "Emmi OS"} + - {id: 2278, cat: PC/ISO, desc: "EndeavourOS"} + - {id: 164, cat: PC/ISO, desc: "Endian"} + - {id: 2179, cat: PC/ISO, desc: "Endless OS"} + - {id: 2223, cat: PC/ISO, desc: "Enso OS"} + - {id: 2043, cat: PC/ISO, desc: "Exe GNU/Linux"} + - {id: 2045, cat: PC/ISO, desc: "Extix"} + - {id: 2220, cat: PC/ISO, desc: "Fatdog64 Linux"} + - {id: 178, cat: PC/ISO, desc: "Fedora"} + - {id: 2194, cat: PC/ISO, desc: "Feren OS"} + - {id: 181, cat: PC/ISO, desc: "Finnix"} + - {id: 2266, cat: PC/ISO, desc: "Forensic Hard Copy"} + - {id: 190, cat: PC/ISO, desc: "FreeBSD"} + - {id: 194, cat: PC/ISO, desc: "FreeNAS"} + - {id: 197, cat: PC/ISO, desc: "Freespire"} + - {id: 1210, cat: PC/ISO, desc: "Fuduntu"} + - {id: 2046, cat: PC/ISO, desc: "FuguIta"} + - {id: 2290, cat: PC/ISO, desc: "FuryBSD"} + - {id: 2256, cat: PC/ISO, desc: "G4L"} + - {id: 2235, cat: PC/ISO, desc: "GALPon MiniNo"} + - {id: 1212, cat: PC/ISO, desc: "GParted"} + - {id: 2214, cat: PC/ISO, desc: "GeckoLinux"} + - {id: 203, cat: PC/ISO, desc: "GeeXboX"} + - {id: 206, cat: PC/ISO, desc: "Gentoo"} + - {id: 2048, cat: PC/ISO, desc: "GhostBSD"} + - {id: 210, cat: PC/ISO, desc: "Gnewsense"} + - {id: 216, cat: PC/ISO, desc: "GoboLinux"} + - {id: 220, cat: PC/ISO, desc: "Greenie Linux"} + - {id: 221, cat: PC/ISO, desc: "Grml"} + - {id: 2280, cat: PC/ISO, desc: "GroovyArcade"} + - {id: 2228, cat: PC/ISO, desc: "Guix System"} + - {id: 2049, cat: PC/ISO, desc: "Haiku"} + - {id: 2050, cat: PC/ISO, desc: "Handy"} + - {id: 2276, cat: PC/ISO, desc: "Hanthana Linux"} + - {id: 2186, cat: PC/ISO, desc: "HardenedBSD"} + - {id: 2200, cat: PC/ISO, desc: "Heads"} + - {id: 2293, cat: PC/ISO, desc: "Hiren's BootCD+PE"} + - {id: 2166, cat: PC/ISO, desc: "Huayra Linux"} + - {id: 2244, cat: PC/ISO, desc: "Hyperbola GNU"} + - {id: 252, cat: PC/ISO, desc: "IPFire"} + - {id: 2181, cat: PC/ISO, desc: "KDE Neon"} + - {id: 2052, cat: PC/ISO, desc: "KaOS"} + - {id: 2294, cat: PC/ISO, desc: "Kaisen Linux"} + - {id: 2051, cat: PC/ISO, desc: "Kali"} + - {id: 2053, cat: PC/ISO, desc: "Karoshi"} + - {id: 277, cat: PC/ISO, desc: "Knoppix"} + - {id: 2054, cat: PC/ISO, desc: "Kolibri"} + - {id: 287, cat: PC/ISO, desc: "Kubuntu"} + - {id: 2057, cat: PC/ISO, desc: "Kwort Linux"} + - {id: 2058, cat: PC/ISO, desc: "Kxstudio"} + - {id: 2068, cat: PC/ISO, desc: "LXLE"} + - {id: 2258, cat: PC/ISO, desc: "Lakka"} + - {id: 2176, cat: PC/ISO, desc: "LibreELEC"} + - {id: 2061, cat: PC/ISO, desc: "LinHES"} + - {id: 2242, cat: PC/ISO, desc: "Linspire"} + - {id: 311, cat: PC/ISO, desc: "Linux"} + - {id: 2239, cat: PC/ISO, desc: "Linux Kodachi"} + - {id: 1234, cat: PC/ISO, desc: "Linux Lite"} + - {id: 347, cat: PC/ISO, desc: "Linux Mint"} + - {id: 304, cat: PC/ISO, desc: "LinuxConsole"} + - {id: 2063, cat: PC/ISO, desc: "Linuxfx"} + - {id: 2064, cat: PC/ISO, desc: "Liquid Lemur"} + - {id: 2191, cat: PC/ISO, desc: "Live Raizo"} + - {id: 316, cat: PC/ISO, desc: "Livecd"} + - {id: 1218, cat: PC/ISO, desc: "Lubuntu"} + - {id: 2163, cat: PC/ISO, desc: "MOFO Linux"} + - {id: 2177, cat: PC/ISO, desc: "MX Linux"} + - {id: 2296, cat: PC/ISO, desc: "Mabox Linux"} + - {id: 1228, cat: PC/ISO, desc: "Mageia"} + - {id: 2071, cat: PC/ISO, desc: "MakuluLinux"} + - {id: 2073, cat: PC/ISO, desc: "Manjaro"} + - {id: 343, cat: PC/ISO, desc: "MidnightBSD"} + - {id: 2075, cat: PC/ISO, desc: "Minino"} + - {id: 2076, cat: PC/ISO, desc: "Minix"} + - {id: 2241, cat: PC/ISO, desc: "MorpheusArch Linux"} + - {id: 369, cat: PC/ISO, desc: "Musix"} + - {id: 373, cat: PC/ISO, desc: "Mythbuntu"} + - {id: 2078, cat: PC/ISO, desc: "NAS4Free"} + - {id: 2217, cat: PC/ISO, desc: "Namib GNU/Linux"} + - {id: 2079, cat: PC/ISO, desc: "Neptune"} + - {id: 380, cat: PC/ISO, desc: "NetBSD"} + - {id: 2080, cat: PC/ISO, desc: "Nethserver"} + - {id: 2081, cat: PC/ISO, desc: "Netrunner"} + - {id: 2190, cat: PC/ISO, desc: "Nitrux"} + - {id: 2084, cat: PC/ISO, desc: "NixOS"} + - {id: 2254, cat: PC/ISO, desc: "NomadBSD"} + - {id: 391, cat: PC/ISO, desc: "Nst"} + - {id: 2086, cat: PC/ISO, desc: "Nutyx"} + - {id: 2203, cat: PC/ISO, desc: "OPNsense"} + - {id: 2234, cat: PC/ISO, desc: "OSGeoLive"} + - {id: 2096, cat: PC/ISO, desc: "OSMC"} + - {id: 2240, cat: PC/ISO, desc: "Obarun"} + - {id: 2211, cat: PC/ISO, desc: "Omarine"} + - {id: 401, cat: PC/ISO, desc: "OpenBSD"} + - {id: 2090, cat: PC/ISO, desc: "OpenIndiana"} + - {id: 2091, cat: PC/ISO, desc: "OpenMandriva Lx"} + - {id: 2089, cat: PC/ISO, desc: "Openelec"} + - {id: 2092, cat: PC/ISO, desc: "Openmediavault"} + - {id: 2093, cat: PC/ISO, desc: "Opensuse"} + - {id: 1237, cat: PC/ISO, desc: "Oracle Linux"} + - {id: 4, cat: PC/ISO, desc: "Other distros"} + - {id: 2218, cat: PC/ISO, desc: "OviOS Linux"} + - {id: 423, cat: PC/ISO, desc: "PCLinuxOS"} + - {id: 2233, cat: PC/ISO, desc: "PI MusicBox"} + - {id: 416, cat: PC/ISO, desc: "Paldo"} + - {id: 2098, cat: PC/ISO, desc: "Parabola GNU/Linux"} + - {id: 419, cat: PC/ISO, desc: "Pardus"} + - {id: 2162, cat: PC/ISO, desc: "Parrot"} + - {id: 420, cat: PC/ISO, desc: "Parsix"} + - {id: 421, cat: PC/ISO, desc: "Partedmagic"} + - {id: 422, cat: PC/ISO, desc: "Pcbsd"} + - {id: 429, cat: PC/ISO, desc: "Pentoo"} + - {id: 430, cat: PC/ISO, desc: "Peppermint"} + - {id: 432, cat: PC/ISO, desc: "Pfsense"} + - {id: 2101, cat: PC/ISO, desc: "Pinguy OS"} + - {id: 2102, cat: PC/ISO, desc: "Pisi Linux"} + - {id: 441, cat: PC/ISO, desc: "Plamo Linux"} + - {id: 2103, cat: PC/ISO, desc: "Plop"} + - {id: 1235, cat: PC/ISO, desc: "Point Linux"} + - {id: 2207, cat: PC/ISO, desc: "Pop!_OS"} + - {id: 2106, cat: PC/ISO, desc: "Porteus"} + - {id: 2107, cat: PC/ISO, desc: "Porteus Kiosk"} + - {id: 2209, cat: PC/ISO, desc: "PrimTux"} + - {id: 2247, cat: PC/ISO, desc: "Project Trident"} + - {id: 1230, cat: PC/ISO, desc: "Proxmox"} + - {id: 452, cat: PC/ISO, desc: "Puppy"} + - {id: 2221, cat: PC/ISO, desc: "PureOS"} + - {id: 2108, cat: PC/ISO, desc: "Q4OS"} + - {id: 2109, cat: PC/ISO, desc: "Qubes"} + - {id: 455, cat: PC/ISO, desc: "Quirky"} + - {id: 2180, cat: PC/ISO, desc: "RancherOS"} + - {id: 2201, cat: PC/ISO, desc: "Raspberry Digital"} + - {id: 2199, cat: PC/ISO, desc: "Raspberry Slideshow"} + - {id: 2110, cat: PC/ISO, desc: "Raspbian"} + - {id: 2111, cat: PC/ISO, desc: "Reactos"} + - {id: 2232, cat: PC/ISO, desc: "RebeccaBlackOS"} + - {id: 2112, cat: PC/ISO, desc: "Rebellin"} + - {id: 2236, cat: PC/ISO, desc: "Reborn OS"} + - {id: 2274, cat: PC/ISO, desc: "Redcore Linux"} + - {id: 458, cat: PC/ISO, desc: "Redhat"} + - {id: 2202, cat: PC/ISO, desc: "Refracta"} + - {id: 2291, cat: PC/ISO, desc: "RegataOS"} + - {id: 2114, cat: PC/ISO, desc: "Rescatux"} + - {id: 2270, cat: PC/ISO, desc: "Resilient Linux"} + - {id: 2116, cat: PC/ISO, desc: "Robolinux"} + - {id: 1223, cat: PC/ISO, desc: "Rosa"} + - {id: 2117, cat: PC/ISO, desc: "Runtu"} + - {id: 2119, cat: PC/ISO, desc: "SELKS"} + - {id: 14, cat: PC/ISO, desc: "Sabayon"} + - {id: 2118, cat: PC/ISO, desc: "Salentos"} + - {id: 477, cat: PC/ISO, desc: "Salix"} + - {id: 482, cat: PC/ISO, desc: "Scientific Linux"} + - {id: 2250, cat: PC/ISO, desc: "Septor"} + - {id: 489, cat: PC/ISO, desc: "SharkLinux"} + - {id: 2121, cat: PC/ISO, desc: "Siduction"} + - {id: 2122, cat: PC/ISO, desc: "Simplicity Linux"} + - {id: 2164, cat: PC/ISO, desc: "Skywave Linux"} + - {id: 493, cat: PC/ISO, desc: "Slackel"} + - {id: 495, cat: PC/ISO, desc: "Slackware"} + - {id: 499, cat: PC/ISO, desc: "Slax"} + - {id: 2124, cat: PC/ISO, desc: "SmartOS"} + - {id: 2125, cat: PC/ISO, desc: "Smeserver"} + - {id: 505, cat: PC/ISO, desc: "Smoothwall Express"} + - {id: 506, cat: PC/ISO, desc: "Sms"} + - {id: 2126, cat: PC/ISO, desc: "Solus"} + - {id: 2127, cat: PC/ISO, desc: "Solydxk"} + - {id: 1236, cat: PC/ISO, desc: "SparkyLinux"} + - {id: 2297, cat: PC/ISO, desc: "SpiralLinux"} + - {id: 2225, cat: PC/ISO, desc: "Star"} + - {id: 2132, cat: PC/ISO, desc: "Steamos"} + - {id: 2174, cat: PC/ISO, desc: "Super Grub2 Disk"} + - {id: 2134, cat: PC/ISO, desc: "SuperX"} + - {id: 2189, cat: PC/ISO, desc: "SwagArch"} + - {id: 2267, cat: PC/ISO, desc: "Symphony OS"} + - {id: 2295, cat: PC/ISO, desc: "SysLinuxOS"} + - {id: 2135, cat: PC/ISO, desc: "SystemRescueCD"} + - {id: 2188, cat: PC/ISO, desc: "TENS"} + - {id: 2136, cat: PC/ISO, desc: "Tails"} + - {id: 2170, cat: PC/ISO, desc: "TalkingArch"} + - {id: 542, cat: PC/ISO, desc: "Thinstation"} + - {id: 2279, cat: PC/ISO, desc: "TinyPaw Linux"} + - {id: 2138, cat: PC/ISO, desc: "Tinycore"} + - {id: 550, cat: PC/ISO, desc: "Trisquel"} + - {id: 2195, cat: PC/ISO, desc: "TrueOS"} + - {id: 2271, cat: PC/ISO, desc: "Tsurugi Linux"} + - {id: 2140, cat: PC/ISO, desc: "TurnKey"} + - {id: 2206, cat: PC/ISO, desc: "UBOS"} + - {id: 563, cat: PC/ISO, desc: "Ubuntu"} + - {id: 2198, cat: PC/ISO, desc: "Ubuntu Budgie"} + - {id: 2284, cat: PC/ISO, desc: "Ubuntu Cinnamon Rem"} + - {id: 2249, cat: PC/ISO, desc: "Ubuntu DesktopPack"} + - {id: 2143, cat: PC/ISO, desc: "Ubuntu Gnome"} + - {id: 2144, cat: PC/ISO, desc: "Ubuntu Kylin"} + - {id: 2145, cat: PC/ISO, desc: "Ubuntu Mate"} + - {id: 564, cat: PC/ISO, desc: "Ubuntu Studio"} + - {id: 2277, cat: PC/ISO, desc: "Ultimate Boot CD"} + - {id: 569, cat: PC/ISO, desc: "Ultimate Edition"} + - {id: 2222, cat: PC/ISO, desc: "Univention Corporate"} + - {id: 2149, cat: PC/ISO, desc: "Untangle NG Firewall"} + - {id: 2173, cat: PC/ISO, desc: "Uruk GNU/Linux"} + - {id: 579, cat: PC/ISO, desc: "Vector"} + - {id: 2282, cat: PC/ISO, desc: "Virage"} + - {id: 2151, cat: PC/ISO, desc: "Void Linux"} + - {id: 2152, cat: PC/ISO, desc: "Volumio"} + - {id: 2153, cat: PC/ISO, desc: "Voyager Live"} + - {id: 2154, cat: PC/ISO, desc: "VyOS"} + - {id: 2281, cat: PC/ISO, desc: "Web Security Dojo"} + - {id: 2246, cat: PC/ISO, desc: "Whonix"} + - {id: 2155, cat: PC/ISO, desc: "Wifislax"} + - {id: 2229, cat: PC/ISO, desc: "XiVa Studio"} + - {id: 2251, cat: PC/ISO, desc: "XigmaNAS"} + - {id: 607, cat: PC/ISO, desc: "Xubuntu"} + - {id: 612, cat: PC/ISO, desc: "Zen"} + - {id: 2159, cat: PC/ISO, desc: "Zentyal"} + - {id: 346, cat: PC/ISO, desc: "Zenwalk Linux"} + - {id: 2160, cat: PC/ISO, desc: "Zeroshell"} + - {id: 2193, cat: PC/ISO, desc: "Zevenet"} + - {id: 1233, cat: PC/ISO, desc: "Zorin"} + # undocumented categories + - {id: 531, cat: PC/ISO, desc: "Super Grub2 Disk"} + + modes: + search: [q] + +settings: + - name: sort + type: select + label: Sort requested from site + default: 3 + options: + 3: created + 5: seeders + 4: size + 2: title + - name: type + type: select + label: Order requested from site + default: 2 + options: + 2: desc + 1: asc + +search: + paths: + # https://linuxtracker.org/index.php?page=torrents&search=&category=0&active=0 + - path: index.php + - path: index.php + inputs: + pages: 2 + inputs: + $raw: "category={{ if .Categories }}{{ range .Categories }}{{.}};{{end}}{{ else }}0{{ end }}&" + search: "{{ .Keywords }}" + page: torrents + active: 1 + order: "{{ .Config.sort }}" + by: "{{ .Config.type }}" + + rows: + selector: table.lista[width="100%"] > tbody > tr:has(a[href^="index.php?page=torrent-details&id="][title]) + + fields: + category_id: + selector: a[href^="index.php?page=torrents&category="] + attribute: href + filters: + - name: querystring + args: category + category: + text: "{{ .Result.category_id }}" + title: + selector: a[href^="index.php?page=torrent-details&id="][title] + details: + selector: a[href^="index.php?page=torrent-details&id="][title] + attribute: href + infohash: + selector: a[href^="index.php?page=torrent-details&id="][title] + attribute: href + filters: + - name: querystring + args: id + poster: + selector: img[src*="/images/categories/"] + attribute: src + date: + selector: td:nth-child(2) > table > tbody > tr > td + remove: strong + filters: + - name: append + args: " -07:00" # PDT + - name: dateparse + args: "dd/MM/yyyy zzz" + size: + selector: td:nth-child(2) > table > tbody > tr:nth-child(2) > td + remove: strong + seeders: + selector: td:nth-child(2) > table > tbody > tr:nth-child(3) > td + remove: strong + leechers: + selector: td:nth-child(2) > table > tbody > tr:nth-child(4) > td + remove: strong + grabs: + selector: td:nth-child(2) > table > tbody > tr:nth-child(5) > td + remove: strong + description: + selector: td:nth-child(2) + remove: table + filters: + - name: prepend + args: "category={{ .Result.category_id }}; " + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# xbtit 2.3.0 diff --git a/config/prowlarr/Definitions/locadora.yml b/config/prowlarr/Definitions/locadora.yml new file mode 100644 index 0000000..d6537c7 --- /dev/null +++ b/config/prowlarr/Definitions/locadora.yml @@ -0,0 +1,165 @@ +--- +id: locadora +name: Locadora +description: "Locadora is a BRAZILIAN Private Tracker for MOVIES and TV" +language: pt-BR +type: private +encoding: UTF-8 +links: + - https://locadora.cc/ +legacylinks: + - https://locadora.xyz/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Filmes"} + - {id: 2, cat: TV, desc: "Series"} + - {id: 6, cat: TV/Anime, desc: "Animes"} + - {id: 7, cat: Audio/Video, desc: "Shows"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + music-search: [q] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your Locadora account My Security page and clicking on the API Token tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + inputs: {} # TODO: remove in v10 + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: "/api/torrents/filter" + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + # if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6 + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + seasonNumber: "{{ .Query.Season }}" + episodeNumber: "{{ .Query.Ep }}" + imdbId: "{{ .Query.IMDBIDShort }}" + tmdbId: "{{ .Query.TMDBID }}" + tvdbId: "{{ .Query.TVDBID }}" + free: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + keywordsfilters: + # strip season and/or ep + - name: re_replace + args: ["\\b([SE]\\d{1,4}){1,2}\\b", ""] + - name: re_replace + args: ["\\.", " "] + + rows: + selector: data + attribute: attributes + + fields: + category: + selector: category_id + title: + selector: name + filters: + - name: re_replace + args: ["\\.", " "] + details: + selector: details_link + download: + selector: download_link + infohash: + selector: info_hash + poster: + selector: poster + filters: + - name: replace + args: ["https://via.placeholder.com/90x135", ""] + imdbid: + selector: imdb_id + tmdbid: + selector: tmdb_id + tvdbid: + selector: tvdb_id + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0%, 25%, 50%, 75%, 100% + selector: freeleech + case: + 0%: 1 # not free + 25%: 0.75 + 50%: 0.5 + 75%: 0.25 + 100%: 0 # freeleech + "*": 0 # catch errors + uploadvolumefactor: + # api returns 0=false, 1=true + selector: double_upload + case: + 0: 1 # normal + 1: 2 # double +# global MR is 0.4 but torrents must be seeded for 3 days regardless of ratio +# minimumratio: +# text: 0.4 + minimumseedtime: + # 3 days (as seconds = 3 x 24 x 60 x 60) + text: 259200 +# json UNIT3D 6.3.0 diff --git a/config/prowlarr/Definitions/losslessclub.yml b/config/prowlarr/Definitions/losslessclub.yml new file mode 100644 index 0000000..1002370 --- /dev/null +++ b/config/prowlarr/Definitions/losslessclub.yml @@ -0,0 +1,88 @@ +--- +id: losslessclub +name: LosslessClub +description: "LosslessClub is a RUSSIAN Private site for High Quality Music" +language: ru-RU +type: private +encoding: UTF-8 +links: + - https://losslessclub.com/ + +caps: + categories: + 1: Audio/Lossless + + modes: + search: [q] + music-search: [q, artist] + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: td.embedded > div.error + test: + path: browse.php + selector: span.bar_user_welcome + +search: + paths: + - path: browse.php + inputs: + search: "{{ if .Query.Artist }}{{ .Query.Artist }}{{ else }}{{ .Keywords }}{{ end }}" + t: all + + rows: + selector: div#releases-table > table > tbody > tr:has(a.browselink) + + fields: + category: + text: 1 + title: + selector: a.browselink + details: + selector: a.browselink + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: img.thumbnail + attribute: src + size: + selector: td:nth-child(5) + grabs: + optional: true + selector: td:nth-child(6) br + span + seeders: + selector: td:nth-child(6) + remove: br + span + filters: + - name: regexp + args: "([\\.\\d]+)\\s+\\|" + leechers: + selector: td:nth-child(6) + remove: br + span + filters: + - name: regexp + args: "\\|\\s*([\\.\\d]+)" + date: + selector: td:nth-child(7) + remove: a, i + filters: + - name: replace + args: ["by", ""] + - name: append + args: " +03:00" # MSK + - name: dateparse + args: "d/MM/yy zzz" + description: + selector: div.tag_list_browse + downloadvolumefactor: + text: 1 + uploadvolumefactor: + text: 1 +# engine tbd diff --git a/config/prowlarr/Definitions/lst.yml b/config/prowlarr/Definitions/lst.yml new file mode 100644 index 0000000..eda0809 --- /dev/null +++ b/config/prowlarr/Definitions/lst.yml @@ -0,0 +1,173 @@ +--- +id: lst +name: LST +description: "LST is an English Private tracker for MOVIES / TV / GENERAL" +language: en-US +type: private +encoding: UTF-8 +links: + - https://lst.gg/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Movies"} + - {id: 2, cat: TV, desc: "TV"} + - {id: 6, cat: TV/Anime, desc: "Anime"} + - {id: 3, cat: Audio, desc: "Music"} + - {id: 4, cat: Console, desc: "Game"} + - {id: 5, cat: PC, desc: "Application"} + - {id: 8, cat: XXX, desc: "XXX"} + - {id: 9, cat: Books/EBook, desc: "Ebook/Manga"} + - {id: 10, cat: Other, desc: "Education"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + music-search: [q] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your LST account My Settings page and clicking on the API Key tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + inputs: {} # TODO: remove in v10 + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: "/api/torrents/filter" + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + # if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6 + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + seasonNumber: "{{ .Query.Season }}" + episodeNumber: "{{ .Query.Ep }}" + imdbId: "{{ .Query.IMDBIDShort }}" + tmdbId: "{{ .Query.TMDBID }}" + tvdbId: "{{ .Query.TVDBID }}" + "free[]": "{{ if .Config.freeleech }}100{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + + rows: + selector: data + attribute: attributes + + fields: + category: + selector: category_id + title: + selector: name + details: + selector: details_link + download: + selector: download_link + infohash: + selector: info_hash + poster: + selector: meta.poster + filters: + - name: replace + args: ["https://via.placeholder.com/90x135", ""] + imdbid: + selector: imdb_id + tmdbid: + selector: tmdb_id + tvdbid: + selector: tvdb_id + genre: + selector: meta.genres + filters: + - name: re_replace + args: ["(?i)(Science Fiction)", "Science_Fiction"] + - name: re_replace + args: ["(?i)(TV Movie)", "TV_Movie"] + - name: replace + args: [" & ", "_&_"] + description: + text: "{{ .Result.genre }}" + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0%, 25%, 50%, 75%, 100% + selector: freeleech + case: + 0%: 1 # not free + 25%: 0.75 + 50%: 0.5 + 75%: 0.25 + 100%: 0 # freeleech + "*": 0 # catch errors + uploadvolumefactor: + # api returns False, True + selector: double_upload + case: + False: 1 # normal + True: 2 # double +# global MR is 1.0 but torrents must be seeded for 5 days regardless of ratio +# minimumratio: +# text: 1.0 + minimumseedtime: + # 7 days (as seconds = 7 x 24 x 60 x 60) + text: 604800 +# json UNIT3D 7.1.2 diff --git a/config/prowlarr/Definitions/mactorrentsdownload.yml b/config/prowlarr/Definitions/mactorrentsdownload.yml new file mode 100644 index 0000000..2127bdb --- /dev/null +++ b/config/prowlarr/Definitions/mactorrentsdownload.yml @@ -0,0 +1,82 @@ +--- +id: mactorrentsdownload +name: Mac Torrents Download +description: "Mac Torrents Download is a Public tracker for Mac software" +language: en-US +type: public +encoding: UTF-8 +links: + - https://www.torrentmac.net/ + +caps: + categorymappings: + - {id: "applications", cat: PC/Mac, desc: "Apps"} + - {id: "games", cat: PC/Games, desc: Games} + - {id: "design-assets", cat: Other, desc: Design Assets} + - {id: "uncategorized", cat: Other, desc: Uncategorized} + + modes: + search: [q] + +settings: + - name: flaresolverr + type: info + label: FlareSolverr + default: This site may use Cloudflare DDoS Protection, therefore Prowlarr requires FlareSolverr to access it. + +download: + selectors: + - selector: a[href$=".torrent"] + attribute: href + +search: + paths: + - path: / + inputs: + s: "{{ .Keywords }}" + + rows: + selector: article[id^="post-"] + filters: + - name: andmatch + + fields: + category: + selector: a[href*="/category/"] + attribute: href + filters: + - name: split + args: ["/", 4] + title: + selector: a + attribute: title + details: + selector: a + attribute: href + download: + selector: a + attribute: href + poster: + selector: img + attribute: src + description: + selector: section p + date: + selector: time + attribute: datetime + filters: + - name: append + args: " -07:00" # PDT + - name: dateparse + args: "yyyy-MM-dd zzz" + size: + text: "512 MB" + seeders: + text: 1 + leechers: + text: 1 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# WordPress 4.9.18 diff --git a/config/prowlarr/Definitions/madsrevolution.yml b/config/prowlarr/Definitions/madsrevolution.yml new file mode 100644 index 0000000..c16e44e --- /dev/null +++ b/config/prowlarr/Definitions/madsrevolution.yml @@ -0,0 +1,188 @@ +--- +id: madsrevolution +name: MaDs Revolution +description: "MaDs Revolution is a Private GERMAN site for MOVIES / TV / GENERAL" +language: de-DE +type: private +encoding: UTF-8 +links: + - https://madsrevolution.net/ + +caps: + categorymappings: + - {id: 52, cat: Movies/UHD, desc: "Filme UHD"} + - {id: 3, cat: Movies/HD, desc: "Filme 1080p"} + - {id: 4, cat: Movies/HD, desc: "Filme 720p"} + - {id: 47, cat: Movies/HD, desc: "Filme x264"} + - {id: 2, cat: Movies/SD, desc: "Filme DivX/XviD"} + - {id: 1, cat: Movies/DVD, desc: "Filme DVD-R"} + - {id: 20, cat: Movies/3D, desc: "Filme 3D"} + - {id: 54, cat: TV/UHD, desc: "Serien UHD"} + - {id: 28, cat: TV/HD, desc: "Serien 1080p"} + - {id: 26, cat: TV/HD, desc: "Serien 720p"} + - {id: 48, cat: TV/HD, desc: "Serien x264"} + - {id: 27, cat: TV/SD, desc: "Serien DivX/XviD"} + - {id: 25, cat: TV/SD, desc: "Serien DVD-R"} + - {id: 8, cat: TV/Other, desc: "Serien Unsorted"} + - {id: 38, cat: Audio, desc: "Musik Album"} + - {id: 37, cat: Audio, desc: "Musik Single/EP"} + - {id: 40, cat: Audio/Video, desc: "Musik Video"} + - {id: 39, cat: Audio, desc: "Musik Pack"} + - {id: 14, cat: Audio/Other, desc: "Musik Unsorted"} + - {id: 44, cat: PC/0day, desc: "Software Windows"} + - {id: 42, cat: PC/Mac, desc: "Software Mac"} + - {id: 41, cat: PC, desc: "Software Linux"} + - {id: 43, cat: PC/Mobile-Other, desc: "Software Mobile"} + - {id: 11, cat: PC, desc: "Software Unsorted"} + - {id: 12, cat: PC/Games, desc: "Spiele PC"} + - {id: 13, cat: Console, desc: "Spiele Konsole"} + - {id: 17, cat: Console, desc: "Spiele Portable"} + - {id: 46, cat: Console, desc: "Spiele Other"} + - {id: 53, cat: TV/Documentary, desc: "Dokus UHD"} + - {id: 24, cat: TV/Documentary, desc: "Dokus 1080p"} + - {id: 22, cat: TV/Documentary, desc: "Dokus 720p"} + - {id: 49, cat: TV/Documentary, desc: "Dokus x264"} + - {id: 23, cat: TV/Documentary, desc: "Dokus DivX/XviD"} + - {id: 21, cat: TV/Documentary, desc: "Dokus DVD-R"} + - {id: 7, cat: TV/Documentary, desc: "Dokus Unsorted"} + - {id: 55, cat: TV/Sport, desc: "Sport UHD"} + - {id: 32, cat: TV/Sport, desc: "Sport 1080p"} + - {id: 30, cat: TV/Sport, desc: "Sport 720p"} + - {id: 50, cat: TV/Sport, desc: "Sport x264"} + - {id: 31, cat: TV/Sport, desc: "Sport DivX/XviD"} + - {id: 29, cat: TV/Sport, desc: "Sport DVD-R"} + - {id: 9, cat: TV/Sport, desc: "Sport Unsorted"} + - {id: 15, cat: Audio/Audiobook, desc: "Books aBooks"} + - {id: 18, cat: Books/EBook, desc: "Books eBooks"} + - {id: 56, cat: XXX, desc: "XXX UHD"} + - {id: 36, cat: XXX, desc: "XXX 1080p"} + - {id: 34, cat: XXX, desc: "XXX 720p"} + - {id: 51, cat: XXX, desc: "XXX x264"} + - {id: 35, cat: XXX, desc: "XXX DivX/XviD"} + - {id: 33, cat: XXX, desc: "XXX DVD-R"} + - {id: 10, cat: XXX, desc: "XXX Unsorted"} + - {id: 5, cat: TV/Anime, desc: "Misc Anime"} + - {id: 6, cat: XXX, desc: "Misc Hentai"} + - {id: 19, cat: Other, desc: "Misc Other"} + + modes: + search: [q] + tv-search: [q, season, ep, genre] + movie-search: [q, genre] + music-search: [q, genre] + book-search: [q, genre] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + - name: sort + type: select + label: Sort requested from site + default: s3 + options: + s3: created + s6: seeders + s4: size + s1: title + - name: type + type: select + label: Order requested from site + default: DESC + options: + DESC: desc + ASC: asc + +login: + path: login.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + keeplogged: 1 + error: + - selector: div#error-text + test: + path: index.php + selector: a[href^="logout.php?auth="] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}" + action: "{{ if .Config.freeleech }}uploadonly{{ else }}{{ end }}" + searchstr: "{{ .Keywords }}" + searchtags: "{{ .Query.Genre }}" + # 0 any, 1 all + tags_type: 0 + order_by: "{{ .Config.sort }}" + order_way: "{{ .Config.type }}" + # site does not support imdbid searching or present imdb links in results. + + rows: + selector: table#torrent_table > tbody > tr.torrent:has(a[href^="torrents.php?action=download&id="]) + + fields: + category: + selector: a.c-sub + attribute: href + filters: + - name: regexp + args: "\\[(\\d+)\\]" + title: + selector: a[href^="torrents.php?id="] + details: + selector: a[href^="torrents.php?id="] + attribute: href + download: + selector: a[href^="torrents.php?action=download&id="] + attribute: href + poster: + selector: a[href^="torrents.php?id="] + attribute: onmouseover + filters: + - name: regexp + args: "src=(.+?) " + genre: + selector: div.tags + description: + text: "{{ .Result.genre }}" + date: + selector: td:nth-last-child(5) + filters: + - name: append + args: " +01:00" # CET + - name: dateparse + args: "dd MMM yyyy, HH:mm zzz" + size: + selector: td:nth-last-child(4) + grabs: + selector: td:nth-last-child(3) + seeders: + selector: td:nth-last-child(2) + leechers: + selector: td:nth-last-child(1) + downloadvolumefactor: + case: + "strong:contains(\"UploadOnly!\")": 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 0.8 + minimumseedtime: + # 3 days (as seconds = 3 x 24 x 60 x 60) + text: 259200 +# engine n/a diff --git a/config/prowlarr/Definitions/magico.yml b/config/prowlarr/Definitions/magico.yml new file mode 100644 index 0000000..e392857 --- /dev/null +++ b/config/prowlarr/Definitions/magico.yml @@ -0,0 +1,290 @@ +--- +id: magico +name: Magico +description: "Magico (Trellas) is a GREEK Private Torrent Tracker for MOVIES / TV / GENERAL" +language: el-GR +type: private +encoding: UTF-8 +links: + - https://trellas.net/ +legacylinks: + - https://magico.info/ + - https://magico.one/ + - https://magico.club/ + - https://magico.fun/ + - https://trellas.info/ + - https://trelas.club/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Movies"} + - {id: 84, cat: Movies, desc: "Movies New (2017, 2018)"} + - {id: 14, cat: Movies/SD, desc: "Movies DVDRip-BDRip-BRRip (up to 2016) FREE"} + - {id: 16, cat: Movies/SD, desc: "Movies (CAM) FREE"} + - {id: 17, cat: Movies/BluRay, desc: "Movies BLU-RAY"} + - {id: 44, cat: Movies, desc: "Movies Greek"} + - {id: 76, cat: Movies, desc: "Movies Documentaries"} + - {id: 82, cat: Movies, desc: "Movies Theater"} + + - {id: 52, cat: TV, desc: "TV Series"} + - {id: 53, cat: TV/SD, desc: "TV Series Foreign"} + - {id: 70, cat: TV/HD, desc: "TV Series Foreign (720p)"} + - {id: 54, cat: TV, desc: "TV Series Greek"} + - {id: 86, cat: TV, desc: "TV Series Foreign Complete Seasons"} + - {id: 92, cat: TV, desc: "TV Series Foreign Complete Seasons (720p)"} + - {id: 87, cat: TV, desc: "TV Series Greek Complete Seasons"} + - {id: 63, cat: TV, desc: "TV Series Recreational"} + - {id: 83, cat: TV/Sport, desc: "TV Sports"} + + - {id: 55, cat: Movies, desc: "Children"} + - {id: 38, cat: Movies, desc: "Children (Movies)"} + - {id: 39, cat: Movies, desc: "Children Subtitled (Movies)"} + - {id: 93, cat: Movies, desc: "Children (TV Series)"} + - {id: 94, cat: Movies, desc: "Children Subtitled (TV Series)"} + - {id: 45, cat: Movies, desc: "Children Anime"} + - {id: 98, cat: Movies, desc: "Children 3D"} + - {id: 64, cat: Movies, desc: "Children Music"} + + - {id: 7, cat: Audio, desc: "Music Foreign"} + - {id: 21, cat: Audio, desc: "Music Foreign New Releases"} + - {id: 46, cat: Audio, desc: "Music Foreign Old Releases"} + - {id: 32, cat: Audio, desc: "Music Foreign Discographies"} + - {id: 20, cat: Audio, desc: "Music Foreign Collections"} + - {id: 102, cat: Audio, desc: "Music Foreign MAGICO Radio"} + - {id: 81, cat: Audio, desc: "Music Foreign Karaoke"} + - {id: 95, cat: Audio, desc: "Music Foreign Soundtrack"} + + - {id: 47, cat: Audio, desc: "Music Greek"} + - {id: 48, cat: Audio, desc: "Music Greek New Releases"} + - {id: 49, cat: Audio, desc: "Music Greek Old Releases"} + - {id: 51, cat: Audio, desc: "Music Greek Discographies"} + - {id: 50, cat: Audio, desc: "Music Greek Collections"} + - {id: 101, cat: Audio, desc: "Music Greek MAGICO Radio"} + - {id: 97, cat: Audio, desc: "Music Greek Live Cd's"} + - {id: 57, cat: Audio, desc: "Music Greek Rebetika"} + - {id: 58, cat: Audio, desc: "Music Greek Primary"} + - {id: 59, cat: Audio, desc: "Music Greek Cretan"} + - {id: 60, cat: Audio, desc: "Music Greek Island"} + - {id: 62, cat: Audio, desc: "Music Greek Pontian"} + - {id: 80, cat: Audio, desc: "Music Greek Karaoke"} + - {id: 96, cat: Audio, desc: "Music Greek Soundtracks"} + + - {id: 73, cat: Audio, desc: "Music Seasonal"} + - {id: 74, cat: Audio, desc: "Music Seasonal Xmas"} + - {id: 79, cat: Audio, desc: "Music Seasonal Easter"} + - {id: 75, cat: Audio, desc: "Music Seasonal Halloween"} + - {id: 78, cat: Audio, desc: "Music Seasonal Valentines"} + + - {id: 33, cat: Books, desc: "Books"} + - {id: 41, cat: Books, desc: "Books Greek"} + - {id: 65, cat: Books, desc: "Books Comics"} + - {id: 43, cat: Books, desc: "Books Periodicals"} + - {id: 105, cat: Books, desc: "Books Audio"} + - {id: 72, cat: Books, desc: "Books Children"} + - {id: 66, cat: Books, desc: "Books Educational"} + - {id: 42, cat: Books, desc: "Books Foreign"} + - {id: 67, cat: Books, desc: "Books Photos"} + + - {id: 6, cat: PC, desc: "Programs"} + - {id: 18, cat: PC/0day, desc: "Programs PC"} + - {id: 40, cat: PC/Mobile-Android, desc: "Programs Android"} + - {id: 19, cat: PC/Mac, desc: "Programs Mac"} + + - {id: 2, cat: PC/Games, desc: "Games"} + - {id: 27, cat: PC/Games, desc: "Games PC"} + - {id: 68, cat: PC/Mobile-Android, desc: "Games Android"} + + - {id: 88, cat: Other, desc: "Tutorials / Design / Accessories"} + - {id: 89, cat: Other, desc: "Tutorials Photoshop"} + - {id: 91, cat: Other, desc: "Tutorials Illustrator"} + - {id: 90, cat: Other, desc: "Tutorials After Effects"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + +login: + path: ?p=home&pid=1 + method: form + form: form#loginbox_form + submitpath: /ajax/login.php + inputs: + action: login + loginbox_membername: "{{ .Config.username }}" + loginbox_password: "{{ .Config.password }}" + loginbox_remember: 1 + selectorinputs: + securitytoken: + selector: "script:contains(\"stKey: \")" + filters: + - name: regexp + args: "stKey: \"(.+?)\"," + error: + - selector: ":contains(\"-ERROR-\")" + test: + path: ?p=torrents&pid=32 + selector: a#logout + +search: + paths: + - path: / + keywordsfilters: + - name: re_replace # add brackets to year on searchquery if missing + args: ["\\(*((19|20)\\d{2})\\)*", "($1)"] + - name: replace # use this as a workaround till #893 is implemented + args: ["Greys Anatomy", "Grey's Anatomy"] + - name: re_replace + args: ["[^\\w\\d\\(\\)]+", "%"] + inputs: + p: torrents + pid: 32 + $raw: "{{ range .Categories }}cid[]={{.}}&{{end}}" + keywords: "{{ .Keywords }}" + # name, description, both, uploader + search_type: name + error: + - selector: div#show_error font + + rows: + selector: "div#content > div.torrent-box[id^=\"torrent_\"]{{ if .Config.freeleech }}:has(img[title=\"No Record!\"]){{ else }}{{ end }}, tr:has(a[href*=\"?p=torrents\"][href*=\"&action=details\"]){{ if .Config.freeleech }}:has(img[title=\"No Record!\"]){{ else }}{{ end }}" + filters: + - name: andmatch + + fields: + title: + selector: a[href*="?p=torrents"][href*="&action=details"] + filters: + - name: replace + args: ["Grey's Anatomy", "Greys Anatomy"] + category: + selector: a[href*="?p=torrents"][href*="&cid="] + attribute: href + filters: + - name: querystring + args: cid + details: + selector: a[href*="?p=torrents"][href*="&action=details"] + attribute: href + download: + selector: a[href*="?p=torrents"][href*="&action=download"] + attribute: href + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + size: + selector: a[rel="torrent_size"] + seeders: + selector: a[rel="torrent_seeders"] + leechers: + selector: a[rel="torrent_leechers"] + grabs: + selector: a[rel="times_completed"] + poster: + selector: a[rel="fancybox"] + attribute: href + description: + selector: div.torrentDetails > div:has(span.floatright) + downloadvolumefactor: + case: + "img[title=\"No Record!\"]": 0 + "*": 1 + uploadvolumefactor: + case: + "*": 1 + date_day: + # Uploaded Yesterday at 20:12 by + selector: div.torrentOwner:not(:has(abbr.timeago)):contains("day"), div.torrentOwner:not(:has(abbr.timeago)):contains("σήμερα"), div.torrentOwner:not(:has(abbr.timeago)):contains("εχθές"), div.torrentOwner:not(:has(abbr.timeago)):contains("Δευτέρα"), div.torrentOwner:not(:has(abbr.timeago)):contains("Τρίτη"), div.torrentOwner:not(:has(abbr.timeago)):contains("Τετάρτη"), div.torrentOwner:not(:has(abbr.timeago)):contains("Πέμπτη"), div.torrentOwner:not(:has(abbr.timeago)):contains("Παρασκευή"), div.torrentOwner:not(:has(abbr.timeago)):contains("Σάββατο"), div.torrentOwner:not(:has(abbr.timeago)):contains("Κυριακή") + # auto adjusted by site account profile + optional: true + remove: span + filters: + - name: replace + args: ["Uploaded ", ""] + - name: replace + args: [" by", ""] + - name: replace + args: ["Ανέβηκε ", ""] # Uploaded + - name: replace + args: [" από", ""] # by + - name: replace + args: [" τον/την", ""] # him/her + - name: replace + args: ["στις ", "at "] # at + - name: replace + args: ["σήμερα", "Today"] + - name: replace + args: ["εχθές", "Yesterday"] + - name: replace + args: ["Δευτέρα", "Monday"] + - name: replace + args: ["Τρίτη", "Tuesday"] + - name: replace + args: ["Τετάρτη", "Wednesday"] + - name: replace + args: ["Πέμπτη", "Thursday"] + - name: replace + args: ["Παρασκευή", "Friday"] + - name: replace + args: ["Σάββατο", "Saturday"] + - name: replace + args: ["Κυριακή", "Sunday"] + - name: fuzzytime + date_year: + # 23-10-2021 22:59 + selector: div.torrentOwner:not(:has(abbr.timeago)):contains("-") + # auto adjusted by site account profile + optional: true + remove: span + filters: + - name: replace + args: ["Uploaded ", ""] + - name: replace + args: [" by", ""] + - name: replace + args: ["at ", ""] + - name: replace + args: ["Ανέβηκε ", ""] # Uploaded + - name: replace + args: [" από", ""] # by + - name: replace + args: [" τον/την", ""] # him/her + - name: replace + args: ["στις ", ""] # at + - name: dateparse + args: "dd-MM-yyyy HH:mm" + date_other: + selector: td.torrent_name + # auto adjusted by site account profile + optional: true + remove: div, a, span + filters: + - name: replace + args: ["Uploaded ", ""] + - name: replace + args: [" by", ""] + - name: replace + args: ["at ", ""] + - name: dateparse + args: "dd-MM-yyyy HH:mm" + date_unix: + selector: div.torrentOwner > abbr.timeago + attribute: data-time + optional: true + date: + text: "{{ if or .Result.date_day .Result.date_year .Result.date_other .Result.date_unix }}{{ or .Result.date_day .Result.date_year .Result.date_other .Result.date_unix }}{{ else }}now{{ end }}" +# TSUE 2.2 diff --git a/config/prowlarr/Definitions/majomparade.yml b/config/prowlarr/Definitions/majomparade.yml new file mode 100644 index 0000000..4834aaf --- /dev/null +++ b/config/prowlarr/Definitions/majomparade.yml @@ -0,0 +1,186 @@ +--- +id: majomparade +name: Majomparádé +description: "Majomparádé (TurkDepo) is a HUNGARIAN Private Torrent Tracker for 0DAY / GENERAL" +language: hu-HU +type: private +encoding: UTF-8 +requestDelay: 2 +links: + - https://majomparade.eu/ + +caps: + categorymappings: + - {id: 4, cat: Movies/3D, desc: "3D/Magyar", default: true} + - {id: 5, cat: Movies/3D, desc: "3D/Külföldi", default: true} + - {id: 48, cat: Movies/HD, desc: "Film/BR-BDRIP/Külföldi", default: true} + - {id: 50, cat: Movies/HD, desc: "Film/BR-BDRIP/Magyar", default: true} + - {id: 75, cat: Movies/SD, desc: "Film/Cam/Külföldi", default: true} + - {id: 76, cat: Movies/SD, desc: "Film/Cam/Magyar", default: true} + - {id: 26, cat: Movies/DVD, desc: "Film/DVD/Külföldi", default: true} + - {id: 25, cat: Movies/DVD, desc: "Film/DVD/Magyar", default: true} + - {id: 58, cat: Movies/DVD, desc: "Film/DVD9/Külföld", default: true} + - {id: 59, cat: Movies/DVD, desc: "Film/DVD9/Magyar", default: true} + - {id: 42, cat: Movies/HD, desc: "Film/HD/Külföldi", default: true} + - {id: 51, cat: Movies/HD, desc: "Film/HD/Magyar", default: true} + - {id: 38, cat: Movies/SD, desc: "Film/XviD/Külföldi", default: true} + - {id: 24, cat: Movies/SD, desc: "Film/XviD/Magyar", default: true} + - {id: 85, cat: TV/Sport, desc: "Sport/Külföldi", default: true} + - {id: 87, cat: TV/Sport, desc: "Sport/Magyar", default: true} + - {id: 47, cat: TV/SD, desc: "Sorozat/Külföldi", default: true} + - {id: 36, cat: TV/SD, desc: "Sorozat/Magyar", default: true} + - {id: 6, cat: TV/HD, desc: "Sorozat/HD/Magyar", default: true} + - {id: 7, cat: TV/HD, desc: "Sorozat/HD/Külföldi", default: true} + - {id: 56, cat: Audio/Audiobook, desc: "Hangoskönyv", default: true} + - {id: 33, cat: Books, desc: "Könyv/Külföldi", default: true} + - {id: 44, cat: Books, desc: "Könyv/Magyar", default: true} + - {id: 28, cat: PC/Games, desc: "Játék/ISO", default: true} + - {id: 32, cat: Console, desc: "Játék/Konzol", default: true} + - {id: 30, cat: PC/Games, desc: "Játék/RIP", default: true} + - {id: 53, cat: Audio/Lossless, desc: "Lossless/Külföldi", default: true} + - {id: 74, cat: Audio/Lossless, desc: "Lossless/Magyar", default: true} + - {id: 40, cat: Audio/Other, desc: "Zene/Külföldi", default: true} + - {id: 41, cat: Audio/Other, desc: "Zene/Magyar", default: true} + - {id: 34, cat: PC/Mobile-Other, desc: "Mobil", default: true} + - {id: 35, cat: PC/ISO, desc: "Programok/ISO", default: true} + - {id: 46, cat: PC/0day, desc: "Programok/RIP", default: true} + - {id: 70, cat: XXX/DVD, desc: "XXX/DVD", default: false} + - {id: 39, cat: XXX/XviD, desc: "XXX/XviD", default: false} + - {id: 57, cat: XXX, desc: "XXX/HD", default: false} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: useragent + type: text + label: User-Agent + - name: info_useragent + type: info + label: How to get the User-Agent + default: "
  1. From the same place you fetched the cookie,
  2. Find 'user-agent:' in the Request Headers section
  3. Select and Copy the whole user-agent string (everything after 'user-agent: ') and Paste here.
" + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: letoltes.php + selector: a[href^="logout.php?getUnique="] + +search: + paths: + - path: letoltes.php + categories: [4, 5, 48, 50, 75, 76, 26, 25, 58, 59, 42, 51, 38, 24, 85, 87, 47, 36, 6, 7, 56, 33, 44, 28, 32, 30, 53, 74, 40, 41, 34, 35, 46] + inputs: + tipus: 1 + - path: letoltes.php + categories: [4, 5, 48, 50, 75, 76, 26, 25, 58, 59, 42, 51, 38, 24, 85, 87, 47, 36, 6, 7, 56, 33, 44, 28, 32, 30, 53, 74, 40, 41, 34, 35, 46] + inputs: + tipus: 2 + - path: xxx.php + categories: [70, 39, 57] + inputs: + $raw: "{{ range .Categories }}category[]={{.}}&{{end}}" + name: "{{ if .Query.IMDBID }}http://www.imdb.com/title/{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + imdb_search: "{{ if .Query.IMDBID }}yes{{ else }}{{ end }}" + k: yes + tipuska: 1 + + headers: + User-Agent: ["{{ .Config.useragent }}"] + + rows: + selector: table#table > tbody > tr:has(a[href^="download.php?torrent="]) + + fields: + download: + selector: a[href^="download.php?torrent="] + attribute: href + title_default: + selector: a[href^="details.php?id="] > b + attribute: title + title: + selector: a[href^="details.php?id="] > b[title*="Torrent neve:"] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + filters: + - name: regexp + args: "Torrent neve: (.*?)<" + title_hungarian: + selector: a[href^="details.php?id="] > b + attribute: title + filters: + - name: regexp + args: "
(.*)" + category: + selector: a[href*="&category[]="] + attribute: href + filters: + - name: querystring + args: category[] + details: + selector: a[href^="details.php?id="] + attribute: href + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + poster: + selector: img[src="pic/borito.png"], a[href^="details.php?id="] > b[title*="Torrent neve:"] + attribute: title + filters: + - name: regexp + args: src='(.*?)' + files: + selector: td:nth-child(5) + size: + selector: td:nth-child(7) + grabs: + selector: td:nth-child(8) + seeders: + selector: td:nth-child(9) + leechers: + selector: td:nth-child(10) + date: + selector: td:nth-child(6) + filters: + - name: append + args: " +01:00" # CET + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + downloadvolumefactor: + text: 0 + uploadvolumefactor: + case: + img[title="Ennél a torrentnél 2x szorzó van."]: 2 + img[title="Ennél a torrentnél 3x szorzó van."]: 3 + img[title="Ennél a torrentnél 4x szorzó van."]: 4 + "*": 1 + genre: + selector: td:nth-child(2) + remove: a, img + filters: + - name: re_replace + args: ["(?i)(0.5x|2x|3x|4x)", ""] + description: + case: + img[src$="/pic/yes.png"]: "Verified: {{ if .Result.genre }}{{ .Result.genre }}
{{ else }}{{ end }}{{ .Result.title_hungarian }}" + img[src$="/pic/nincs.png"]: "Unverified: {{ if .Result.genre }}{{ .Result.genre }}
{{ else }}{{ end }}{{ .Result.title_hungarian }}" + minimumratio: + text: 1.0 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# engine n/a diff --git a/config/prowlarr/Definitions/makingoff.yml b/config/prowlarr/Definitions/makingoff.yml new file mode 100644 index 0000000..ae85c5f --- /dev/null +++ b/config/prowlarr/Definitions/makingoff.yml @@ -0,0 +1,1077 @@ +--- +id: makingoff +name: Making Off +description: "Making Off is a BRAZILIAN Private Torrent Tracker for MOVIES / TV / GENERAL" +language: pt-BR +type: private +encoding: iso-8859-1 +requestDelay: 5 +links: + - https://makingoff.org/ + +caps: + # commented out categories are discussion-only forums + categorymappings: + - {id: 23, cat: Movies, desc: "O Verdadeiro Cinema Está Aqui!"} + - {id: 461, cat: Movies, desc: " |-- África", default: true} + - {id: 26, cat: Movies, desc: " |-- América do Norte", default: true} + - {id: 24, cat: Movies, desc: " |-- Asiático", default: true} + - {id: 77, cat: Movies, desc: " |-- Curtas", default: true} + - {id: 28, cat: TV/Documentary, desc: " |-- Documentários", default: true} + - {id: 25, cat: Movies, desc: " |-- Europeu", default: true} + - {id: 29, cat: Movies, desc: " |-- Latino-Americano", default: true} + - {id: 27, cat: Movies, desc: " |-- Nacional", default: true} + - {id: 30, cat: Movies, desc: " |-- Oriente Médio", default: true} + - {id: 31, cat: Movies, desc: " |-- Oceania", default: true} + - {id: 15, cat: Audio, desc: " |-- Trilhas Sonoras", default: true} # mix of DDL and torrents, may cause errors + # - {id: 12, cat: Movies, desc: " |-- Portal"} + # - {id: 204, cat: Movies, desc: " |-- Dossiê Making Off"} + # - {id: 573, cat: Movies, desc: " |-- Festivais e Mostras"} + - {id: 173, cat: Movies, desc: " |-- Prata da Casa", default: true} + # - {id: 135, cat: Movies, desc: " |-- Diretores do Mês"} + # - {id: 190, cat: Movies, desc: " |-- Recomendações do Fórum"} + - {id: 36, cat: Movies, desc: "Diretores", default: true} + - {id: 460, cat: Movies, desc: " |-- Africanos"} + - {id: 632, cat: Movies, desc: " |---- Abdellatif Kechiche"} + - {id: 679, cat: Movies, desc: " |---- Abderrahmane Sissako"} + - {id: 483, cat: Movies, desc: " |---- Djibril Diop Mambéty"} + - {id: 884, cat: Movies, desc: " |---- Flora Gomes"} + - {id: 885, cat: Movies, desc: " |---- Gaston Kaboré"} + - {id: 745, cat: Movies, desc: " |---- Henry Barakat"} + - {id: 484, cat: Movies, desc: " |---- Idrissa Ouedraogo"} + - {id: 680, cat: Movies, desc: " |---- Mahamat-Saleh Haroun"} + - {id: 886, cat: Movies, desc: " |---- Merzak Allouache"} + - {id: 433, cat: Movies, desc: " |---- Ousmane Sembène"} + - {id: 574, cat: Movies, desc: " |---- Youssef Chahine"} + - {id: 75, cat: Movies, desc: " |-- Americanos e Canadenses"} + - {id: 199, cat: Movies, desc: " |---- Abel Ferrara"} + - {id: 141, cat: Movies, desc: " |---- Alan Parker"} + - {id: 682, cat: Movies, desc: " |---- Alex Gibney"} + - {id: 985, cat: Movies, desc: " |---- Alex Ross Perry"} + - {id: 818, cat: Movies, desc: " |---- Alexander Payne"} + - {id: 681, cat: Movies, desc: " |---- Allan Dwan"} + - {id: 437, cat: Movies, desc: " |---- Albert e David Maysles"} + - {id: 405, cat: Movies, desc: " |---- Anatole Litvak"} + - {id: 419, cat: Movies, desc: " |---- André de Toth"} + - {id: 335, cat: Movies, desc: " |---- Andrew V. McLaglen"} + - {id: 336, cat: Movies, desc: " |---- Andy Warhol"} + - {id: 234, cat: Movies, desc: " |---- Anthony Mann"} + - {id: 746, cat: Movies, desc: " |---- Arthur Hiller"} + - {id: 819, cat: Movies, desc: " |---- Arthur Lubin"} + - {id: 262, cat: Movies, desc: " |---- Arthur Penn"} + - {id: 304, cat: Movies, desc: " |---- Atom Egoyan"} + - {id: 883, cat: Movies, desc: " |---- Barbara Hammer"} + - {id: 438, cat: Movies, desc: " |---- Barry Levinson"} + - {id: 887, cat: Movies, desc: " |---- Benny & Josh Safdie"} + - {id: 820, cat: Movies, desc: " |---- Bernard Rose"} + - {id: 85, cat: Movies, desc: " |---- Billy Wilder"} + - {id: 125, cat: Movies, desc: " |---- Blake Edwards"} + - {id: 747, cat: Movies, desc: " |---- Bob Fosse"} + - {id: 515, cat: Movies, desc: " |---- Bob Rafelson"} + - {id: 142, cat: Movies, desc: " |---- Brian De Palma"} + - {id: 683, cat: Movies, desc: " |---- Budd Boetticher"} + - {id: 821, cat: Movies, desc: " |---- Busby Berkeley"} + - {id: 218, cat: Movies, desc: " |---- Buster Keaton"} + - {id: 888, cat: Movies, desc: " |---- Byron Haskin"} + - {id: 575, cat: Movies, desc: " |---- Cameron Crowe"} + - {id: 257, cat: Movies, desc: " |---- Cecil B. DeMille"} + - {id: 40, cat: Movies, desc: " |---- Charles Chaplin"} + - {id: 533, cat: Movies, desc: " |---- Charles Vidor"} + - {id: 684, cat: Movies, desc: " |---- Charles Walters"} + - {id: 889, cat: Movies, desc: " |---- Christopher Guest"} + - {id: 685, cat: Movies, desc: " |---- Clarence Brown"} + - {id: 88, cat: Movies, desc: " |---- Clint Eastwood"} + - {id: 748, cat: Movies, desc: " |---- Curtis Bernhardt"} + - {id: 822, cat: Movies, desc: " |---- Curtis Hanson"} + - {id: 890, cat: Movies, desc: " |---- Dan Curtis"} + - {id: 439, cat: Movies, desc: " |---- Daniel Mann"} + - {id: 485, cat: Movies, desc: " |---- Darren Aronofsky"} + - {id: 65, cat: Movies, desc: " |---- David Cronenberg"} + - {id: 440, cat: Movies, desc: " |---- David Fincher"} + - {id: 41, cat: Movies, desc: " |---- David Lynch"} + - {id: 441, cat: Movies, desc: " |---- David Mamet"} + - {id: 823, cat: Movies, desc: " |---- David Miller"} + - {id: 602, cat: Movies, desc: " |---- Delbert Mann"} + - {id: 421, cat: Movies, desc: " |---- Delmer Daves"} + - {id: 633, cat: Movies, desc: " |---- Denis Villeneuve"} + - {id: 462, cat: Movies, desc: " |---- Dennis Hopper"} + - {id: 182, cat: Movies, desc: " |---- Denys Arcand"} + - {id: 824, cat: Movies, desc: " |---- Don Hertzfeldt"} + - {id: 891, cat: Movies, desc: " |---- Don Medford"} + - {id: 249, cat: Movies, desc: " |---- Don Siegel"} + - {id: 263, cat: Movies, desc: " |---- Douglas Sirk"} + - {id: 208, cat: Movies, desc: " |---- D.W. Griffith"} + - {id: 406, cat: Movies, desc: " |---- Edmund Goulding"} + - {id: 253, cat: Movies, desc: " |---- Edward Dmytryk"} + - {id: 749, cat: Movies, desc: " |---- Edgar G. Ulmer "} + - {id: 750, cat: Movies, desc: " |---- Edwin L. Marin"} + - {id: 140, cat: Movies, desc: " |---- Elia Kazan"} + - {id: 576, cat: Movies, desc: " |---- Erich Von Stroheim"} + - {id: 231, cat: Movies, desc: " |---- Ernst Lubitsch"} + - {id: 368, cat: Movies, desc: " |---- Errol Morris"} + - {id: 825, cat: Movies, desc: " |---- Felix E. Feist"} + - {id: 91, cat: Movies, desc: " |---- Francis Ford Coppola"} + - {id: 389, cat: Movies, desc: " |---- Frank Borzage"} + - {id: 123, cat: Movies, desc: " |---- Frank Capra"} + - {id: 382, cat: Movies, desc: " |---- Franklin J. Schaffner"} + - {id: 751, cat: Movies, desc: " |---- Frank Tashlin"} + - {id: 369, cat: Movies, desc: " |---- Fred C. Newmeyer"} + - {id: 381, cat: Movies, desc: " |---- Fred Zinnemann"} + - {id: 892, cat: Movies, desc: " |---- Frederick Wiseman"} + - {id: 534, cat: Movies, desc: " |---- Gene Kelly"} + - {id: 383, cat: Movies, desc: " |---- George A. Romero"} + - {id: 250, cat: Movies, desc: " |---- George Cukor"} + - {id: 258, cat: Movies, desc: " |---- George Roy Hill"} + - {id: 407, cat: Movies, desc: " |---- George Seaton"} + - {id: 370, cat: Movies, desc: " |---- George Sidney"} + - {id: 143, cat: Movies, desc: " |---- George Stevens"} + - {id: 893, cat: Movies, desc: " |---- Gerd Oswald"} + - {id: 577, cat: Movies, desc: " |---- Godfrey Reggio"} + - {id: 536, cat: Movies, desc: " |---- Gordon Douglas"} + - {id: 442, cat: Movies, desc: " |---- Gregg Araki"} + - {id: 99, cat: Movies, desc: " |---- Gus Van Sant"} + - {id: 277, cat: Movies, desc: " |---- Guy Maddin"} + - {id: 752, cat: Movies, desc: " |---- H. C. Potter"} + - {id: 408, cat: Movies, desc: " |---- Hal Ashby"} + - {id: 371, cat: Movies, desc: " |---- Hal Hartley"} + - {id: 372, cat: Movies, desc: " |---- Hal Roach"} + - {id: 603, cat: Movies, desc: " |---- Harmony Korine"} + - {id: 373, cat: Movies, desc: " |---- Henry King"} + - {id: 443, cat: Movies, desc: " |---- Henry Koster"} + - {id: 251, cat: Movies, desc: " |---- Henry Hathaway"} + - {id: 826, cat: Movies, desc: " |---- Henry Levin"} + - {id: 486, cat: Movies, desc: " |---- Herbert Ross"} + - {id: 100, cat: Movies, desc: " |---- Howard Hawks"} + - {id: 367, cat: Movies, desc: " |---- Ida Lupino"} + - {id: 753, cat: Movies, desc: " |---- Irving Pichel"} + - {id: 374, cat: Movies, desc: " |---- J. Lee Thompson"} + - {id: 578, cat: Movies, desc: " |---- Jack Arnold"} + - {id: 604, cat: Movies, desc: " |---- Jack Conway"} + - {id: 259, cat: Movies, desc: " |---- Jacques Tourneur"} + - {id: 686, cat: Movies, desc: " |---- James Benning"} + - {id: 687, cat: Movies, desc: " |---- James Gray"} + - {id: 418, cat: Movies, desc: " |---- Jean Negulesco"} + - {id: 975, cat: Movies, desc: " |---- Jerry Lewis"} + - {id: 61, cat: Movies, desc: " |---- Jim Jarmusch"} + - {id: 688, cat: Movies, desc: " |---- Joe Dante"} + - {id: 754, cat: Movies, desc: " |---- Joe Swanberg"} + - {id: 90, cat: Movies, desc: " |---- Joel & Ethan Coen"} + - {id: 894, cat: Movies, desc: " |---- John Badham"} + - {id: 634, cat: Movies, desc: " |---- John Brahm"} + - {id: 375, cat: Movies, desc: " |---- John Carpenter"} + - {id: 189, cat: Movies, desc: " |---- John Cassavetes"} + - {id: 487, cat: Movies, desc: " |---- John Cromwell"} + - {id: 827, cat: Movies, desc: " |---- John Farrow"} + - {id: 101, cat: Movies, desc: " |---- John Ford"} + - {id: 260, cat: Movies, desc: " |---- John Frankenheimer"} + - {id: 895, cat: Movies, desc: " |---- John Hughes"} + - {id: 89, cat: Movies, desc: " |---- John Huston"} + - {id: 898, cat: Movies, desc: " |---- John Landis"} + - {id: 979, cat: Movies, desc: " |---- John Milius"} + - {id: 376, cat: Movies, desc: " |---- John Sayles"} + - {id: 365, cat: Movies, desc: " |---- John Schlesinger"} + - {id: 256, cat: Movies, desc: " |---- John Sturges"} + - {id: 254, cat: Movies, desc: " |---- John Waters"} + - {id: 605, cat: Movies, desc: " |---- Jonas Mekas"} + - {id: 689, cat: Movies, desc: " |---- Jonathan Demme"} + - {id: 378, cat: Movies, desc: " |---- Josef von Sternberg"} + - {id: 755, cat: Movies, desc: " |---- Joseph H. Lewis"} + - {id: 156, cat: Movies, desc: " |---- Joseph L. Mankiewicz"} + - {id: 690, cat: Movies, desc: " |---- Joseph Sargent"} + - {id: 206, cat: Movies, desc: " |---- Jules Dassin"} + - {id: 896, cat: Movies, desc: " |---- Kathryn Bigelow"} + - {id: 828, cat: Movies, desc: " |---- Kelly Reichardt"} + - {id: 463, cat: Movies, desc: " |---- Kenneth Anger"} + - {id: 897, cat: Movies, desc: " |---- Kevin Smith"} + - {id: 444, cat: Movies, desc: " |---- King Vidor"} + - {id: 606, cat: Movies, desc: " |---- Larry Clark "} + - {id: 978, cat: Movies, desc: " |---- Larry Cohen"} + - {id: 366, cat: Movies, desc: " |---- Lasse Hallström"} + - {id: 516, cat: Movies, desc: " |---- Lawrence Kasdan"} + - {id: 417, cat: Movies, desc: " |---- Leo McCarey"} + - {id: 517, cat: Movies, desc: " |---- Lewis Allen"} + - {id: 390, cat: Movies, desc: " |---- Lewis Milestone"} + - {id: 829, cat: Movies, desc: " |---- Lewis R. Foster"} + - {id: 830, cat: Movies, desc: " |---- M. Night Shyamalan"} + - {id: 464, cat: Movies, desc: " |---- Mark Robson"} + - {id: 635, cat: Movies, desc: " |---- Mark Rydell"} + - {id: 488, cat: Movies, desc: " |---- Mark Sandrich"} + - {id: 380, cat: Movies, desc: " |---- Martin Ritt"} + - {id: 45, cat: Movies, desc: " |---- Martin Scorsese"} + - {id: 899, cat: Movies, desc: " |---- Maya Deren"} + - {id: 363, cat: Movies, desc: " |---- Mel Brooks"} + - {id: 385, cat: Movies, desc: " |---- Mervyn LeRoy"} + - {id: 636, cat: Movies, desc: " |---- Michael Cimino"} + - {id: 255, cat: Movies, desc: " |---- Michael Curtiz"} + - {id: 489, cat: Movies, desc: " |---- Michael Mann"} + - {id: 154, cat: Movies, desc: " |---- Michael Moore"} + - {id: 102, cat: Movies, desc: " |---- Mike Nichols"} + - {id: 900, cat: Movies, desc: " |---- Mitchell Leisen"} + - {id: 537, cat: Movies, desc: " |---- Monte Hellman"} + - {id: 607, cat: Movies, desc: " |---- Neil LaBute"} + - {id: 221, cat: Movies, desc: " |---- Nicholas Ray"} + - {id: 637, cat: Movies, desc: " |---- Noah Baumbach"} + - {id: 157, cat: Movies, desc: " |---- Norman Jewison"} + - {id: 901, cat: Movies, desc: " |---- Norman Z. McLeod"} + - {id: 158, cat: Movies, desc: " |---- Oliver Stone"} + - {id: 97, cat: Movies, desc: " |---- Orson Welles"} + - {id: 159, cat: Movies, desc: " |---- Otto Preminger"} + - {id: 691, cat: Movies, desc: " |---- Paul Mazursky"} + - {id: 538, cat: Movies, desc: " |---- Paul Morrisey"} + - {id: 902, cat: Movies, desc: " |---- Paul Newman"} + - {id: 445, cat: Movies, desc: " |---- Paul Schrader"} + - {id: 160, cat: Movies, desc: " |---- Paul Thomas Anderson"} + - {id: 220, cat: Movies, desc: " |---- Peter Bogdanovich"} + - {id: 539, cat: Movies, desc: " |---- Phil Karlson"} + - {id: 638, cat: Movies, desc: " |---- Philip Kaufman"} + - {id: 410, cat: Movies, desc: " |---- Preston Sturges"} + - {id: 235, cat: Movies, desc: " |---- Quentin Tarantino"} + - {id: 756, cat: Movies, desc: " |---- Ralph Bakshi"} + - {id: 362, cat: Movies, desc: " |---- Ralph Nelson"} + - {id: 361, cat: Movies, desc: " |---- Raoul Walsh"} + - {id: 360, cat: Movies, desc: " |---- Richard Brooks"} + - {id: 903, cat: Movies, desc: " |---- Richard Donner"} + - {id: 359, cat: Movies, desc: " |---- Richard Fleischer"} + - {id: 118, cat: Movies, desc: " |---- Richard Linklater"} + - {id: 423, cat: Movies, desc: " |---- Richard Schickel"} + - {id: 757, cat: Movies, desc: " |---- Richard Thorpe"} + - {id: 280, cat: Movies, desc: " |---- Ridley Scott"} + - {id: 831, cat: Movies, desc: " |---- Rob Reiner"} + - {id: 161, cat: Movies, desc: " |---- Robert Aldrich"} + - {id: 184, cat: Movies, desc: " |---- Robert Altman"} + - {id: 832, cat: Movies, desc: " |---- Robert Benton"} + - {id: 904, cat: Movies, desc: " |---- Robert Florey"} + - {id: 409, cat: Movies, desc: " |---- Robert J. Flaherty"} + - {id: 358, cat: Movies, desc: " |---- Robert Mulligan"} + - {id: 692, cat: Movies, desc: " |---- Robert Rossen"} + - {id: 261, cat: Movies, desc: " |---- Robert Siodmak"} + - {id: 357, cat: Movies, desc: " |---- Robert Stevens"} + - {id: 168, cat: Movies, desc: " |---- Robert Wise"} + - {id: 758, cat: Movies, desc: " |---- Robert Z. Leonard"} + - {id: 905, cat: Movies, desc: " |---- Robert Zemeckis"} + - {id: 252, cat: Movies, desc: " |---- Roger Corman"} + - {id: 833, cat: Movies, desc: " |---- Ron Howard"} + - {id: 356, cat: Movies, desc: " |---- Rouben Mamoulian"} + - {id: 355, cat: Movies, desc: " |---- Rudolph Maté"} + - {id: 759, cat: Movies, desc: " |---- Russ Meyer"} + - {id: 834, cat: Movies, desc: " |---- Sam Mendes"} + - {id: 162, cat: Movies, desc: " |---- Sam Peckinpah"} + - {id: 906, cat: Movies, desc: " |---- Sam Raimi"} + - {id: 354, cat: Movies, desc: " |---- Sam Wood"} + - {id: 192, cat: Movies, desc: " |---- Samuel Fuller"} + - {id: 835, cat: Movies, desc: " |---- Sean Penn"} + - {id: 836, cat: Movies, desc: " |---- Sidney J. Furie"} + - {id: 119, cat: Movies, desc: " |---- Sidney Lumet"} + - {id: 608, cat: Movies, desc: " |---- Sofia Coppola"} + - {id: 490, cat: Movies, desc: " |---- Spike Jonze"} + - {id: 121, cat: Movies, desc: " |---- Spike Lee"} + - {id: 353, cat: Movies, desc: " |---- Stan Brakhage"} + - {id: 279, cat: Movies, desc: " |---- Stanley Donen"} + - {id: 333, cat: Movies, desc: " |---- Stanley Kramer"} + - {id: 48, cat: Movies, desc: " |---- Stanley Kubrick"} + - {id: 278, cat: Movies, desc: " |---- Steven Soderbergh"} + - {id: 124, cat: Movies, desc: " |---- Steven Spielberg"} + - {id: 332, cat: Movies, desc: " |---- Stuart Gordon"} + - {id: 907, cat: Movies, desc: " |---- Stuart Heisler"} + - {id: 693, cat: Movies, desc: " |---- Stuart Rosenberg"} + - {id: 163, cat: Movies, desc: " |---- Sydney Pollack"} + - {id: 837, cat: Movies, desc: " |---- Ted Tetzlaff"} + - {id: 422, cat: Movies, desc: " |---- Terrence Malick"} + - {id: 116, cat: Movies, desc: " |---- Terry Gilliam"} + - {id: 117, cat: Movies, desc: " |---- Tim Burton"} + - {id: 838, cat: Movies, desc: " |---- Tobe Hooper"} + - {id: 331, cat: Movies, desc: " |---- Tod Browning"} + - {id: 420, cat: Movies, desc: " |---- Todd Haynes"} + - {id: 110, cat: Movies, desc: " |---- Todd Solondz"} + - {id: 609, cat: Movies, desc: " |---- Tom DiCillo"} + - {id: 465, cat: Movies, desc: " |---- Victor Fleming"} + - {id: 201, cat: Movies, desc: " |---- Vincente Minnelli"} + - {id: 760, cat: Movies, desc: " |---- Vincent Sherman"} + - {id: 839, cat: Movies, desc: " |---- W. S. Van Dyke"} + - {id: 973, cat: Movies, desc: " |---- Wachowski Brothers"} + - {id: 631, cat: Movies, desc: " |---- Walter Hill "} + - {id: 639, cat: Movies, desc: " |---- Walter Lang"} + - {id: 579, cat: Movies, desc: " |---- Wayne Wang"} + - {id: 165, cat: Movies, desc: " |---- Wes Anderson"} + - {id: 761, cat: Movies, desc: " |---- Wes Craven"} + - {id: 762, cat: Movies, desc: " |---- Whit Stillman"} + - {id: 330, cat: Movies, desc: " |---- William A. Wellman"} + - {id: 491, cat: Movies, desc: " |---- William Castle"} + - {id: 329, cat: Movies, desc: " |---- William Dieterle"} + - {id: 328, cat: Movies, desc: " |---- William Friedkin"} + - {id: 166, cat: Movies, desc: " |---- William Wyler"} + - {id: 83, cat: Movies, desc: " |---- Woody Allen"} + - {id: 763, cat: Movies, desc: " |---- Xavier Dolan"} + - {id: 73, cat: Movies, desc: " |-- Asiáticos"} + - {id: 840, cat: Movies, desc: " |---- Akio Jissôji"} + - {id: 37, cat: Movies, desc: " |---- Akira Kurosawa"} + - {id: 283, cat: Movies, desc: " |---- Ang Lee"} + - {id: 580, cat: Movies, desc: " |---- Anh Hung Tran"} + - {id: 411, cat: Movies, desc: " |---- Apichatpong Weerasethakul"} + - {id: 492, cat: Movies, desc: " |---- Bong Joon-Ho"} + - {id: 518, cat: Movies, desc: " |---- Brillante Mendonza"} + - {id: 300, cat: Movies, desc: " |---- Chan-wook Park"} + - {id: 764, cat: Movies, desc: " |---- Chang Cheh"} + - {id: 841, cat: Movies, desc: " |---- Darezhan Omirbayev"} + - {id: 765, cat: Movies, desc: " |---- Edward Yang"} + - {id: 640, cat: Movies, desc: " |---- Gakuryu Ishii"} + - {id: 540, cat: Movies, desc: " |---- Hayao Miyazaki"} + - {id: 610, cat: Movies, desc: " |---- Hideo Gosha"} + - {id: 766, cat: Movies, desc: " |---- Hideo Nakata"} + - {id: 316, cat: Movies, desc: " |---- Hirokazu Koreeda"} + - {id: 541, cat: Movies, desc: " |---- Hiroshi Inagaki"} + - {id: 611, cat: Movies, desc: " |---- Hiroshi Shimizu"} + - {id: 211, cat: Movies, desc: " |---- Hiroshi Teshigahara"} + - {id: 320, cat: Movies, desc: " |---- Hsiao-hsien Hou"} + - {id: 612, cat: Movies, desc: " |---- Isao Takahata"} + - {id: 908, cat: Movies, desc: " |---- Isao Yukisada"} + - {id: 641, cat: Movies, desc: " |---- Ishirô Honda"} + - {id: 301, cat: Movies, desc: " |---- Ji-woon Kim"} + - {id: 694, cat: Movies, desc: " |---- John Woo"} + - {id: 695, cat: Movies, desc: " |---- Johnnie To"} + - {id: 767, cat: Movies, desc: " |---- Juzo Itami"} + - {id: 542, cat: Movies, desc: " |---- Kaneto Shindô"} + - {id: 909, cat: Movies, desc: " |---- Kazuyoshi Kumakiri"} + - {id: 696, cat: Movies, desc: " |---- Kei Kumai"} + - {id: 543, cat: Movies, desc: " |---- Keisuke Kinoshita"} + - {id: 613, cat: Movies, desc: " |---- Kenji Misumi "} + - {id: 614, cat: Movies, desc: " |---- Kihachi Okamoto"} + - {id: 70, cat: Movies, desc: " |---- Kim Ki-Duk"} + - {id: 412, cat: Movies, desc: " |---- Kiyoshi Kurosawa"} + - {id: 202, cat: Movies, desc: " |---- Kenji Mizoguchi"} + - {id: 697, cat: Movies, desc: " |---- Kinji Fukasaku"} + - {id: 476, cat: Movies, desc: " |---- Kôji Wakamatsu"} + - {id: 544, cat: Movies, desc: " |---- Kon Ichikawa"} + - {id: 581, cat: Movies, desc: " |---- Koreyoshi Kurahara"} + - {id: 698, cat: Movies, desc: " |---- Lav Diaz"} + - {id: 699, cat: Movies, desc: " |---- Lee Chang-dong"} + - {id: 910, cat: Movies, desc: " |---- Makoto Shinkai"} + - {id: 642, cat: Movies, desc: " |---- Mamoru Oshii"} + - {id: 911, cat: Movies, desc: " |---- Mani Kaul"} + - {id: 519, cat: Movies, desc: " |---- Masahiro Shinoda"} + - {id: 317, cat: Movies, desc: " |---- Masaki Kobayashi"} + - {id: 318, cat: Movies, desc: " |---- Mikio Naruse"} + - {id: 480, cat: Movies, desc: " |---- Mira Nair"} + - {id: 222, cat: Movies, desc: " |---- Nagisa Oshima"} + - {id: 912, cat: Movies, desc: " |---- Naoko Ogigami"} + - {id: 545, cat: Movies, desc: " |---- Naomi Kawase"} + - {id: 769, cat: Movies, desc: " |---- Noboru Tanaka"} + - {id: 768, cat: Movies, desc: " |---- Nobuhiko Obayashi"} + - {id: 546, cat: Movies, desc: " |---- Pen-Ek Ratanaruang"} + - {id: 700, cat: Movies, desc: " |---- Rithy Panh"} + - {id: 478, cat: Movies, desc: " |---- Sang-soo Hong"} + - {id: 479, cat: Movies, desc: " |---- Sanjay Leela Bhansali"} + - {id: 701, cat: Movies, desc: " |---- Satoshi Kon"} + - {id: 193, cat: Movies, desc: " |---- Satyajit Ray"} + - {id: 493, cat: Movies, desc: " |---- Seijun Suzuki"} + - {id: 770, cat: Movies, desc: " |---- Shinji Aoyama"} + - {id: 273, cat: Movies, desc: " |---- Shinya Tsukamoto"} + - {id: 547, cat: Movies, desc: " |---- Sion Sono"} + - {id: 319, cat: Movies, desc: " |---- Shohei Imamura"} + - {id: 477, cat: Movies, desc: " |---- Shuji Terayama"} + - {id: 615, cat: Movies, desc: " |---- Shunji Iwai"} + - {id: 771, cat: Movies, desc: " |---- Tadashi Imai"} + - {id: 94, cat: Movies, desc: " |---- Takashi Miike"} + - {id: 66, cat: Movies, desc: " |---- Takeshi Kitano"} + - {id: 772, cat: Movies, desc: " |---- Tetsuya Nakashima"} + - {id: 773, cat: Movies, desc: " |---- Tomu Uchida"} + - {id: 105, cat: Movies, desc: " |---- Tsai Ming-liang"} + - {id: 842, cat: Movies, desc: " |---- Tsui Hark"} + - {id: 974, cat: Movies, desc: " |---- Wang Bing"} + - {id: 167, cat: Movies, desc: " |---- Wong Kar-wai"} + - {id: 549, cat: Movies, desc: " |---- Yasuzô Masumura"} + - {id: 548, cat: Movies, desc: " |---- Yoshishige Yoshida"} + - {id: 107, cat: Movies, desc: " |---- Yasujiro Ozu"} + - {id: 120, cat: Movies, desc: " |---- Yimou Zhang"} + - {id: 446, cat: Movies, desc: " |---- Yôji Yamada"} + - {id: 774, cat: Movies, desc: " |---- Yôjirô Takita"} + - {id: 702, cat: Movies, desc: " |---- Yoshimitsu Morita"} + - {id: 520, cat: Movies, desc: " |---- Zhang Ke Jia"} + - {id: 74, cat: Movies, desc: " |-- Brasileiros"} + - {id: 915, cat: Movies, desc: " |---- Adirley Queirós"} + - {id: 981, cat: Movies, desc: " |---- Agnaldo Siri Azevedo"} + - {id: 643, cat: Movies, desc: " |---- Alfredo Sternheim"} + - {id: 703, cat: Movies, desc: " |---- Alberto Pieralise"} + - {id: 704, cat: Movies, desc: " |---- Alberto Salvá"} + - {id: 843, cat: Movies, desc: " |---- Aloysio Raulino"} + - {id: 916, cat: Movies, desc: " |---- Aly Muritiba"} + - {id: 649, cat: Movies, desc: " |---- Amácio Mazzaropi"} + - {id: 241, cat: Movies, desc: " |---- Ana Carolina"} + - {id: 494, cat: Movies, desc: " |---- André Klotzel"} + - {id: 616, cat: Movies, desc: " |---- André Luís de Oliveira"} + - {id: 917, cat: Movies, desc: " |---- André Novais Oliveira"} + - {id: 617, cat: Movies, desc: " |---- Andrea Tonacci"} + - {id: 582, cat: Movies, desc: " |---- Andrucha Waddington"} + - {id: 844, cat: Movies, desc: " |---- Anna Muylaert"} + - {id: 242, cat: Movies, desc: " |---- Anselmo Duarte"} + - {id: 705, cat: Movies, desc: " |---- Antônio Calmon"} + - {id: 706, cat: Movies, desc: " |---- Antonio Carlos Fontoura"} + - {id: 136, cat: Movies, desc: " |---- Arnaldo Jabor"} + - {id: 707, cat: Movies, desc: " |---- Aurélio Teixeira"} + - {id: 918, cat: Movies, desc: " |---- Bárbara Wagner & Benjamin de Burca"} + - {id: 243, cat: Movies, desc: " |---- Beto Brant"} + - {id: 618, cat: Movies, desc: " |---- Braz Chediak"} + - {id: 244, cat: Movies, desc: " |---- Bruno Barreto"} + - {id: 845, cat: Movies, desc: " |---- Bruno Safadi"} + - {id: 619, cat: Movies, desc: " |---- Cao Guimarães"} + - {id: 644, cat: Movies, desc: " |---- Carlos Alberto Prates Correa"} + - {id: 620, cat: Movies, desc: " |---- Carlos Coimbra"} + - {id: 238, cat: Movies, desc: " |---- Carlos Diegues"} + - {id: 550, cat: Movies, desc: " |---- Carlos Gerbase"} + - {id: 551, cat: Movies, desc: " |---- Carlos Hugo Christensen"} + - {id: 435, cat: Movies, desc: " |---- Carlos Manga"} + - {id: 846, cat: Movies, desc: " |---- Carlos Nader"} + - {id: 225, cat: Movies, desc: " |---- Carlos Reichenbach"} + - {id: 847, cat: Movies, desc: " |---- Cláudio Assis"} + - {id: 708, cat: Movies, desc: " |---- Cláudio Cunha"} + - {id: 919, cat: Movies, desc: " |---- Cristiano Burlan"} + - {id: 775, cat: Movies, desc: " |---- Daniel Filho"} + - {id: 621, cat: Movies, desc: " |---- David Neves"} + - {id: 387, cat: Movies, desc: " |---- Domingos de Oliveira"} + - {id: 81, cat: Movies, desc: " |---- Eduardo Coutinho"} + - {id: 622, cat: Movies, desc: " |---- Eduardo Escorel"} + - {id: 848, cat: Movies, desc: " |---- Eliane Caffé"} + - {id: 709, cat: Movies, desc: " |---- Elyseu Visconti"} + - {id: 849, cat: Movies, desc: " |---- Eryk Rocha"} + - {id: 710, cat: Movies, desc: " |---- Eurípides Ramos"} + - {id: 711, cat: Movies, desc: " |---- Fabio Barreto"} + - {id: 712, cat: Movies, desc: " |---- Fauzi Mansur"} + - {id: 713, cat: Movies, desc: " |---- Fernando de Barros"} + - {id: 552, cat: Movies, desc: " |---- Fernando Meirelles"} + - {id: 714, cat: Movies, desc: " |---- Flávio Tambellini"} + - {id: 920, cat: Movies, desc: " |---- Francisco Cavalcanti"} + - {id: 413, cat: Movies, desc: " |---- Francisco Ramalho Jr."} + - {id: 715, cat: Movies, desc: " |---- Gabriel Mascaro"} + - {id: 776, cat: Movies, desc: " |---- Geraldo Sarno"} + - {id: 977, cat: Movies, desc: " |---- Geraldo Vietri"} + - {id: 921, cat: Movies, desc: " |---- Gerson Tavares"} + - {id: 62, cat: Movies, desc: " |---- Glauber Rocha"} + - {id: 623, cat: Movies, desc: " |---- Guilherme de Almeida Prado"} + - {id: 228, cat: Movies, desc: " |---- Hector Babenco"} + - {id: 925, cat: Movies, desc: " |---- Heitor Dhalia"} + - {id: 922, cat: Movies, desc: " |---- Helena Ignez"} + - {id: 647, cat: Movies, desc: " |---- Helvécio Ratton"} + - {id: 583, cat: Movies, desc: " |---- Hugo Carvana"} + - {id: 215, cat: Movies, desc: " |---- Humberto Mauro"} + - {id: 553, cat: Movies, desc: " |---- Ivan Cardoso"} + - {id: 645, cat: Movies, desc: " |---- J. B. Tanko"} + - {id: 191, cat: Movies, desc: " |---- Jairo Ferreira"} + - {id: 646, cat: Movies, desc: " |---- Jean Garret"} + - {id: 850, cat: Movies, desc: " |---- Jece Valadão"} + - {id: 584, cat: Movies, desc: " |---- João Batista Andrade"} + - {id: 923, cat: Movies, desc: " |---- João Moreira Salles"} + - {id: 203, cat: Movies, desc: " |---- Joaquim Pedro De Andrade"} + - {id: 976, cat: Movies, desc: " |---- Jom Tob Azulay"} + - {id: 851, cat: Movies, desc: " |---- Jorge Durán"} + - {id: 155, cat: Movies, desc: " |---- Jorge Furtado"} + - {id: 777, cat: Movies, desc: " |---- José Carlos Burle"} + - {id: 852, cat: Movies, desc: " |---- José Eduardo Belmonte"} + - {id: 436, cat: Movies, desc: " |---- José Joffily"} + - {id: 924, cat: Movies, desc: " |---- José Miziara"} + - {id: 82, cat: Movies, desc: " |---- José Mojica Marins"} + - {id: 853, cat: Movies, desc: " |---- José Padilha"} + - {id: 854, cat: Movies, desc: " |---- Juliana Rojas"} + - {id: 152, cat: Movies, desc: " |---- Júlio Bressane"} + - {id: 554, cat: Movies, desc: " |---- Karim Aïnouz"} + - {id: 555, cat: Movies, desc: " |---- Kleber Mendonça Filho"} + - {id: 239, cat: Movies, desc: " |---- Leon Hirszman"} + - {id: 855, cat: Movies, desc: " |---- Lírio Ferreira"} + - {id: 245, cat: Movies, desc: " |---- Lucia Murat"} + - {id: 466, cat: Movies, desc: " |---- Luis Sergio Person"} + - {id: 585, cat: Movies, desc: " |---- Luiz Carlos Lacerda"} + - {id: 778, cat: Movies, desc: " |---- Luiz Rosemberg Filho "} + - {id: 779, cat: Movies, desc: " |---- Marcelo Galvão"} + - {id: 716, cat: Movies, desc: " |---- Marcelo Gomes"} + - {id: 624, cat: Movies, desc: " |---- Marcelo Masagão"} + - {id: 717, cat: Movies, desc: " |---- Marcelo Pedroso"} + - {id: 718, cat: Movies, desc: " |---- Marco Altberg "} + - {id: 856, cat: Movies, desc: " |---- Marcos Farias"} + - {id: 926, cat: Movies, desc: " |---- Maria Augusta Ramos"} + - {id: 648, cat: Movies, desc: " |---- Maurice Capovilla"} + - {id: 719, cat: Movies, desc: " |---- Miguel Borges"} + - {id: 556, cat: Movies, desc: " |---- Miguel Faria Jr."} + - {id: 248, cat: Movies, desc: " |---- Murilo Salles"} + - {id: 122, cat: Movies, desc: " |---- Nelson Pereira dos Santos"} + - {id: 720, cat: Movies, desc: " |---- Neville de Almeida"} + - {id: 650, cat: Movies, desc: " |---- Ody Fraga"} + - {id: 927, cat: Movies, desc: " |---- Olney São Paulo"} + - {id: 721, cat: Movies, desc: " |---- Osvaldo de Oliveira"} + - {id: 722, cat: Movies, desc: " |---- Oswaldo Caldeira"} + - {id: 379, cat: Movies, desc: " |---- Ozualdo Candeias"} + - {id: 986, cat: Movies, desc: " |---- Paula Gaitán"} + - {id: 495, cat: Movies, desc: " |---- Paulo Cesar Saraceni"} + - {id: 586, cat: Movies, desc: " |---- Paulo Thiago"} + - {id: 928, cat: Movies, desc: " |---- Pedro Carlos Rovai"} + - {id: 625, cat: Movies, desc: " |---- Petrus Cariry"} + - {id: 723, cat: Movies, desc: " |---- Reginaldo Faria"} + - {id: 557, cat: Movies, desc: " |---- Renato Tapajós"} + - {id: 983, cat: Movies, desc: " |---- Ricardo Alves Jr."} + - {id: 496, cat: Movies, desc: " |---- Roberto Farias"} + - {id: 467, cat: Movies, desc: " |---- Roberto Pires"} + - {id: 626, cat: Movies, desc: " |---- Roberto Santos"} + - {id: 106, cat: Movies, desc: " |---- Rogério Sganzerla"} + - {id: 587, cat: Movies, desc: " |---- Rosemberg Cariry"} + - {id: 108, cat: Movies, desc: " |---- Ruy Guerra"} + - {id: 929, cat: Movies, desc: " |---- Sandra Kogut"} + - {id: 588, cat: Movies, desc: " |---- Sandra Werneck"} + - {id: 384, cat: Movies, desc: " |---- Sérgio Bianchi"} + - {id: 236, cat: Movies, desc: " |---- Sérgio Rezende"} + - {id: 780, cat: Movies, desc: " |---- Sérgio Ricardo"} + - {id: 240, cat: Movies, desc: " |---- Silvio Tendler"} + - {id: 468, cat: Movies, desc: " |---- Sylvio Back"} + - {id: 857, cat: Movies, desc: " |---- Tata Amaral"} + - {id: 724, cat: Movies, desc: " |---- Tom Payne"} + - {id: 497, cat: Movies, desc: " |---- Toni Venturi"} + - {id: 246, cat: Movies, desc: " |---- Ugo Giorgetti "} + - {id: 781, cat: Movies, desc: " |---- Victor di Mello"} + - {id: 558, cat: Movies, desc: " |---- Victor Lima"} + - {id: 247, cat: Movies, desc: " |---- Vladimir Carvalho"} + - {id: 782, cat: Movies, desc: " |---- Walter Carvalho"} + - {id: 164, cat: Movies, desc: " |---- Walter Hugo Khouri"} + - {id: 237, cat: Movies, desc: " |---- Walter Lima Jr."} + - {id: 84, cat: Movies, desc: " |---- Walter Salles"} + - {id: 627, cat: Movies, desc: " |---- Watson Macedo"} + - {id: 982, cat: Movies, desc: " |---- Wolney Oliveira"} + - {id: 628, cat: Movies, desc: " |---- Xavier de Oliveira"} + - {id: 589, cat: Movies, desc: " |---- Zelito Viana"} + - {id: 187, cat: Movies, desc: " |-- Britânicos"} + - {id: 783, cat: Movies, desc: " |---- Alan Clarke"} + - {id: 391, cat: Movies, desc: " |---- Alberto Cavalcanti"} + - {id: 474, cat: Movies, desc: " |---- Alexander Mackendrick"} + - {id: 39, cat: Movies, desc: " |---- Alfred Hitchcock"} + - {id: 559, cat: Movies, desc: " |---- Anthony Asquith"} + - {id: 560, cat: Movies, desc: " |---- Anthony Minghella"} + - {id: 651, cat: Movies, desc: " |---- Bryan Forbes"} + - {id: 268, cat: Movies, desc: " |---- Carol Reed"} + - {id: 284, cat: Movies, desc: " |---- Danny Boyle"} + - {id: 148, cat: Movies, desc: " |---- David Lean"} + - {id: 858, cat: Movies, desc: " |---- David Mackenzie"} + - {id: 285, cat: Movies, desc: " |---- Derek Jarman"} + - {id: 930, cat: Movies, desc: " |---- Freddie Francis"} + - {id: 725, cat: Movies, desc: " |---- Jack Clayton"} + - {id: 286, cat: Movies, desc: " |---- James Ivory"} + - {id: 784, cat: Movies, desc: " |---- Jim Sheridan"} + - {id: 276, cat: Movies, desc: " |---- John Boorman "} + - {id: 931, cat: Movies, desc: " |---- John Guillermin"} + - {id: 219, cat: Movies, desc: " |---- Joseph Losey"} + - {id: 498, cat: Movies, desc: " |---- Karel Reisz"} + - {id: 113, cat: Movies, desc: " |---- Ken Loach"} + - {id: 282, cat: Movies, desc: " |---- Ken Russell"} + - {id: 207, cat: Movies, desc: " |---- Kenneth Branagh"} + - {id: 859, cat: Movies, desc: " |---- Kevin Macdonald"} + - {id: 414, cat: Movies, desc: " |---- Lewis Gilbert"} + - {id: 499, cat: Movies, desc: " |---- Lindsay Anderson"} + - {id: 500, cat: Movies, desc: " |---- Lynne Ramsay"} + - {id: 475, cat: Movies, desc: " |---- Michael Anderson"} + - {id: 287, cat: Movies, desc: " |---- Michael Powell"} + - {id: 958, cat: Movies, desc: " |---- Michael Radford"} + - {id: 150, cat: Movies, desc: " |---- Michael Winterbottom"} + - {id: 652, cat: Movies, desc: " |---- Mike Figgis"} + - {id: 291, cat: Movies, desc: " |---- Mike Leigh"} + - {id: 404, cat: Movies, desc: " |---- Nicolas Roeg"} + - {id: 416, cat: Movies, desc: " |---- Norman McLaren"} + - {id: 653, cat: Movies, desc: " |---- Peter Brook"} + - {id: 96, cat: Movies, desc: " |---- Peter Greenaway"} + - {id: 364, cat: Movies, desc: " |---- Peter Watkins"} + - {id: 288, cat: Movies, desc: " |---- Peter Yates"} + - {id: 281, cat: Movies, desc: " |---- Richard Attenborough"} + - {id: 289, cat: Movies, desc: " |---- Richard Lester"} + - {id: 932, cat: Movies, desc: " |---- Robert Hamer"} + - {id: 726, cat: Movies, desc: " |---- Robert Stevenson"} + - {id: 377, cat: Movies, desc: " |---- Ronald Neame"} + - {id: 727, cat: Movies, desc: " |---- Roy Ward Baker"} + - {id: 130, cat: Movies, desc: " |---- Stephen Frears"} + - {id: 785, cat: Movies, desc: " |---- Terence Davies"} + - {id: 415, cat: Movies, desc: " |---- Terence Fisher"} + - {id: 290, cat: Movies, desc: " |---- Tony Richardson"} + - {id: 72, cat: Movies, desc: " |-- Europeus (outros)"} + - {id: 307, cat: Movies, desc: " |---- Agnieszka Holland"} + - {id: 38, cat: Movies, desc: " |---- Aki Kaurismäki"} + - {id: 501, cat: Movies, desc: " |---- Alain Tanner"} + - {id: 424, cat: Movies, desc: " |---- Aleksandr Dovzhenko"} + - {id: 469, cat: Movies, desc: " |---- Aleksandr Petrov"} + - {id: 171, cat: Movies, desc: " |---- Aleksandr Sokurov"} + - {id: 786, cat: Movies, desc: " |---- Aleksei German"} + - {id: 400, cat: Movies, desc: " |---- Aleksey Balabanov"} + - {id: 521, cat: Movies, desc: " |---- Alex van Warmerdam"} + - {id: 274, cat: Movies, desc: " |---- Alexander Kluge"} + - {id: 860, cat: Movies, desc: " |---- André Delvaux"} + - {id: 453, cat: Movies, desc: " |---- Andrei Konchalovsky"} + - {id: 67, cat: Movies, desc: " |---- Andrei Tarkovsky"} + - {id: 933, cat: Movies, desc: " |---- Andrey Zvyagintsev"} + - {id: 104, cat: Movies, desc: " |---- Andrzej Wajda"} + - {id: 275, cat: Movies, desc: " |---- Andrzej Zulawski"} + - {id: 934, cat: Movies, desc: " |---- Angela Schanelec"} + - {id: 935, cat: Movies, desc: " |---- Arne Sucksdorff"} + - {id: 293, cat: Movies, desc: " |---- Artavazd Peleshian"} + - {id: 728, cat: Movies, desc: " |---- Baltasar Kormákur"} + - {id: 223, cat: Movies, desc: " |---- Béla Tarr"} + - {id: 936, cat: Movies, desc: " |---- Bert Haanstra"} + - {id: 454, cat: Movies, desc: " |---- Bille August"} + - {id: 729, cat: Movies, desc: " |---- Boris Barnet"} + - {id: 170, cat: Movies, desc: " |---- Carl Theodor Dreyer"} + - {id: 401, cat: Movies, desc: " |---- Chantal Akerman"} + - {id: 561, cat: Movies, desc: " |---- Christian Petzold"} + - {id: 590, cat: Movies, desc: " |---- Christoffer Boe"} + - {id: 937, cat: Movies, desc: " |---- Christoph Hochhäusler"} + - {id: 861, cat: Movies, desc: " |---- Corneliu Porumboiu"} + - {id: 137, cat: Movies, desc: " |---- Costa-Gavras"} + - {id: 862, cat: Movies, desc: " |---- Cristi Puiu"} + - {id: 562, cat: Movies, desc: " |---- Cristian Mungiu"} + - {id: 787, cat: Movies, desc: " |---- Dagur Kári"} + - {id: 654, cat: Movies, desc: " |---- Danis Tanovic"} + - {id: 591, cat: Movies, desc: " |---- Dorota Kedzierzawska"} + - {id: 426, cat: Movies, desc: " |---- Dusan Makavejev"} + - {id: 402, cat: Movies, desc: " |---- Dziga Vertov"} + - {id: 788, cat: Movies, desc: " |---- Elem Klimov"} + - {id: 59, cat: Movies, desc: " |---- Emir Kusturica"} + - {id: 789, cat: Movies, desc: " |---- Evald Schorm"} + - {id: 149, cat: Movies, desc: " |---- Fatih Akin"} + - {id: 655, cat: Movies, desc: " |---- Frantisek Vlácil"} + - {id: 502, cat: Movies, desc: " |---- Fridrik Thor Fridriksson"} + - {id: 169, cat: Movies, desc: " |---- Friedrich Wilhelm Murnau"} + - {id: 95, cat: Movies, desc: " |---- Fritz Lang"} + - {id: 297, cat: Movies, desc: " |---- Georg Wilhelm Pabst"} + - {id: 592, cat: Movies, desc: " |---- Georgi Daneliya"} + - {id: 938, cat: Movies, desc: " |---- Goran Paskaljevic"} + - {id: 522, cat: Movies, desc: " |---- Grigori Kozintsev"} + - {id: 205, cat: Movies, desc: " |---- Harun Farocki"} + - {id: 298, cat: Movies, desc: " |---- Helmut Käutner"} + - {id: 730, cat: Movies, desc: " |---- Henri Storck"} + - {id: 42, cat: Movies, desc: " |---- Ingmar Bergman"} + - {id: 312, cat: Movies, desc: " |---- István Szabó"} + - {id: 523, cat: Movies, desc: " |---- Jan Hrebejk"} + - {id: 790, cat: Movies, desc: " |---- Jan Nemec"} + - {id: 731, cat: Movies, desc: " |---- Jan Troell"} + - {id: 132, cat: Movies, desc: " |---- Jan Svankmajer"} + - {id: 791, cat: Movies, desc: " |---- Jaromil Jires"} + - {id: 209, cat: Movies, desc: " |---- Jean-Pierre & Luc Dardenne"} + - {id: 863, cat: Movies, desc: " |---- Jerzy Kawalerowicz"} + - {id: 386, cat: Movies, desc: " |---- Jerzy Skolimowski"} + - {id: 503, cat: Movies, desc: " |---- Jirí Menzel"} + - {id: 864, cat: Movies, desc: " |---- Joachim Lafosse"} + - {id: 563, cat: Movies, desc: " |---- Johan van der Keuken"} + - {id: 939, cat: Movies, desc: " |---- John Carney"} + - {id: 792, cat: Movies, desc: " |---- Joris Ivens"} + - {id: 504, cat: Movies, desc: " |---- Jos Stelling"} + - {id: 793, cat: Movies, desc: " |---- Juraj Herz "} + - {id: 656, cat: Movies, desc: " |---- Juraj Jakubisko"} + - {id: 657, cat: Movies, desc: " |---- Karel Kachyna"} + - {id: 658, cat: Movies, desc: " |---- Karel Zeman"} + - {id: 940, cat: Movies, desc: " |---- Kira Muratova"} + - {id: 732, cat: Movies, desc: " |---- Konstantin Lopushanskiy"} + - {id: 941, cat: Movies, desc: " |---- Kornél Mundruczó"} + - {id: 69, cat: Movies, desc: " |---- Krzysztof Kieslowski"} + - {id: 470, cat: Movies, desc: " |---- Krzysztof Zanussi"} + - {id: 63, cat: Movies, desc: " |---- Lars Von Trier"} + - {id: 659, cat: Movies, desc: " |---- Lech Majewski"} + - {id: 403, cat: Movies, desc: " |---- Leni Riefenstahl"} + - {id: 505, cat: Movies, desc: " |---- Lev Kuleshov"} + - {id: 660, cat: Movies, desc: " |---- Lucas Belvaux"} + - {id: 733, cat: Movies, desc: " |---- Lucian Pintilie"} + - {id: 309, cat: Movies, desc: " |---- Lukas Moodysson"} + - {id: 524, cat: Movies, desc: " |---- Margarethe von Trotta"} + - {id: 734, cat: Movies, desc: " |---- Martin Sulík"} + - {id: 60, cat: Movies, desc: " |---- Michael Haneke"} + - {id: 865, cat: Movies, desc: " |---- Mika Kaurismäki"} + - {id: 272, cat: Movies, desc: " |---- Miklós Jancsó"} + - {id: 506, cat: Movies, desc: " |---- Mikhail Kalatozov"} + - {id: 942, cat: Movies, desc: " |---- Mikhail Romm"} + - {id: 46, cat: Movies, desc: " |---- Milos Forman"} + - {id: 866, cat: Movies, desc: " |---- Nanouk Leopold"} + - {id: 131, cat: Movies, desc: " |---- Neil Jordan"} + - {id: 507, cat: Movies, desc: " |---- Nicolas Winding Refn"} + - {id: 311, cat: Movies, desc: " |---- Nikita Mikhalkov"} + - {id: 564, cat: Movies, desc: " |---- Ole Christian Madsen"} + - {id: 294, cat: Movies, desc: " |---- Otar Iosseliani"} + - {id: 295, cat: Movies, desc: " |---- Paul Verhoeven"} + - {id: 794, cat: Movies, desc: " |---- Pavel Lungin"} + - {id: 943, cat: Movies, desc: " |---- Piotr Szulkin"} + - {id: 867, cat: Movies, desc: " |---- Radu Jude"} + - {id: 47, cat: Movies, desc: " |---- Rainer Werner Fassbinder"} + - {id: 944, cat: Movies, desc: " |---- Rein Raamat"} + - {id: 661, cat: Movies, desc: " |---- Roy Andersson"} + - {id: 795, cat: Movies, desc: " |---- Rúnar Rúnarsson"} + - {id: 735, cat: Movies, desc: " |---- Sergei Loznitsa"} + - {id: 133, cat: Movies, desc: " |---- Sergei M. Eisenstein"} + - {id: 196, cat: Movies, desc: " |---- Sergei Paradjanov"} + - {id: 796, cat: Movies, desc: " |---- Sergiu Nicolaescu"} + - {id: 508, cat: Movies, desc: " |---- Sharunas Bartas"} + - {id: 736, cat: Movies, desc: " |---- Stefan Uher"} + - {id: 455, cat: Movies, desc: " |---- Susanne Bier"} + - {id: 945, cat: Movies, desc: " |---- Takis Kanellopoulos"} + - {id: 868, cat: Movies, desc: " |---- Tengiz Abuladze"} + - {id: 176, cat: Movies, desc: " |---- Theo Angelopoulos"} + - {id: 946, cat: Movies, desc: " |---- Thomas Arslan"} + - {id: 471, cat: Movies, desc: " |---- Thomas Vinterberg"} + - {id: 299, cat: Movies, desc: " |---- Tom Tykwer"} + - {id: 662, cat: Movies, desc: " |---- Ulrich Seidl"} + - {id: 229, cat: Movies, desc: " |---- Vera Chytilová"} + - {id: 310, cat: Movies, desc: " |---- Victor Sjöström"} + - {id: 456, cat: Movies, desc: " |---- Volker Schlöndorff"} + - {id: 869, cat: Movies, desc: " |---- Vsevolod Pudovkin"} + - {id: 663, cat: Movies, desc: " |---- Walerian Borowczyk"} + - {id: 49, cat: Movies, desc: " |---- Werner Herzog"} + - {id: 472, cat: Movies, desc: " |---- Werner Schroeter"} + - {id: 111, cat: Movies, desc: " |---- Wim Wenders"} + - {id: 947, cat: Movies, desc: " |---- Witold Leszczynski"} + - {id: 797, cat: Movies, desc: " |---- Wladyslaw Starewicz "} + - {id: 473, cat: Movies, desc: " |---- Yevgeni Bauer"} + - {id: 948, cat: Movies, desc: " |---- Yorgos Lanthimos"} + - {id: 313, cat: Movies, desc: " |---- Zoltán Fábri"} + - {id: 138, cat: Movies, desc: " |-- Franceses"} + - {id: 565, cat: Movies, desc: " |---- Abel Gance"} + - {id: 200, cat: Movies, desc: " |---- Agnes Varda"} + - {id: 509, cat: Movies, desc: " |---- Alain Corneau"} + - {id: 870, cat: Movies, desc: " |---- Alain Guiraudie "} + - {id: 78, cat: Movies, desc: " |---- Alain Resnais"} + - {id: 430, cat: Movies, desc: " |---- Alain Robbe-Grillet"} + - {id: 798, cat: Movies, desc: " |---- Alexandre Astruc"} + - {id: 871, cat: Movies, desc: " |---- Alice Guy"} + - {id: 338, cat: Movies, desc: " |---- André Téchiné"} + - {id: 799, cat: Movies, desc: " |---- Anne Fontaine"} + - {id: 872, cat: Movies, desc: " |---- Arnaud Desplechin"} + - {id: 339, cat: Movies, desc: " |---- Barbet Schroeder"} + - {id: 593, cat: Movies, desc: " |---- Benoît Jacquot"} + - {id: 395, cat: Movies, desc: " |---- Bertrand Blier"} + - {id: 510, cat: Movies, desc: " |---- Bertrand Bonello"} + - {id: 396, cat: Movies, desc: " |---- Bertrand Tavernier"} + - {id: 427, cat: Movies, desc: " |---- Bruno Dumont"} + - {id: 266, cat: Movies, desc: " |---- Catherine Breillat"} + - {id: 980, cat: Movies, desc: " |---- Cédric Kahn"} + - {id: 447, cat: Movies, desc: " |---- Cédric Klapisch"} + - {id: 232, cat: Movies, desc: " |---- Chris Marker"} + - {id: 340, cat: Movies, desc: " |---- Christophe Honoré"} + - {id: 341, cat: Movies, desc: " |---- Claire Denis"} + - {id: 392, cat: Movies, desc: " |---- Claude Berri"} + - {id: 185, cat: Movies, desc: " |---- Claude Chabrol"} + - {id: 265, cat: Movies, desc: " |---- Claude Lelouch"} + - {id: 594, cat: Movies, desc: " |---- Claude Sautet"} + - {id: 737, cat: Movies, desc: " |---- Edouard Molinaro"} + - {id: 103, cat: Movies, desc: " |---- Eric Rohmer"} + - {id: 448, cat: Movies, desc: " |---- Eugène Green"} + - {id: 129, cat: Movies, desc: " |---- François Ozon"} + - {id: 79, cat: Movies, desc: " |---- François Truffaut"} + - {id: 93, cat: Movies, desc: " |---- Gaspar Noé"} + - {id: 450, cat: Movies, desc: " |---- Georges Franju"} + - {id: 954, cat: Movies, desc: " |---- Germaine Dulac"} + - {id: 342, cat: Movies, desc: " |---- Guy Debord"} + - {id: 566, cat: Movies, desc: " |---- Henri Verneuil"} + - {id: 393, cat: Movies, desc: " |---- Henri-Georges Clouzot"} + - {id: 800, cat: Movies, desc: " |---- Jacques Audiard"} + - {id: 567, cat: Movies, desc: " |---- Jacques Becker"} + - {id: 664, cat: Movies, desc: " |---- Jacques Demy"} + - {id: 665, cat: Movies, desc: " |---- Jacques Doillon"} + - {id: 216, cat: Movies, desc: " |---- Jacques Rivette"} + - {id: 955, cat: Movies, desc: " |---- Jacques Rozier"} + - {id: 217, cat: Movies, desc: " |---- Jacques Tati"} + - {id: 511, cat: Movies, desc: " |---- Jean Becker"} + - {id: 343, cat: Movies, desc: " |---- Jean Cocteau"} + - {id: 397, cat: Movies, desc: " |---- Jean Epstein"} + - {id: 801, cat: Movies, desc: " |---- Jean Eustache"} + - {id: 802, cat: Movies, desc: " |---- Jean Grémillon"} + - {id: 183, cat: Movies, desc: " |---- Jean Renoir"} + - {id: 595, cat: Movies, desc: " |---- Jean Rollin"} + - {id: 227, cat: Movies, desc: " |---- Jean Rouch"} + - {id: 428, cat: Movies, desc: " |---- Jean Vigo"} + - {id: 449, cat: Movies, desc: " |---- Jean-Claude Brisseau"} + - {id: 956, cat: Movies, desc: " |---- Jean-Claude Rousseau"} + - {id: 267, cat: Movies, desc: " |---- Jean-Jacques Annaud"} + - {id: 344, cat: Movies, desc: " |---- Jean-Jacques Beineix"} + - {id: 43, cat: Movies, desc: " |---- Jean-Luc Godard"} + - {id: 388, cat: Movies, desc: " |---- Jean-Marie Straub e Danièle Huillet"} + - {id: 345, cat: Movies, desc: " |---- Jean-Pierre Jeunet"} + - {id: 210, cat: Movies, desc: " |---- Jean-Pierre Melville"} + - {id: 346, cat: Movies, desc: " |---- Julien Duvivier"} + - {id: 666, cat: Movies, desc: " |---- Laurent Cantet"} + - {id: 568, cat: Movies, desc: " |---- Leos Carax"} + - {id: 134, cat: Movies, desc: " |---- Louis Malle"} + - {id: 270, cat: Movies, desc: " |---- Luc Besson"} + - {id: 525, cat: Movies, desc: " |---- Luc Moullet"} + - {id: 347, cat: Movies, desc: " |---- Marcel Carné"} + - {id: 957, cat: Movies, desc: " |---- Marcel Hanoun"} + - {id: 738, cat: Movies, desc: " |---- Marcel L'Herbier "} + - {id: 451, cat: Movies, desc: " |---- Marguerite Duras"} + - {id: 348, cat: Movies, desc: " |---- Maurice Pialat"} + - {id: 349, cat: Movies, desc: " |---- Max Ophüls"} + - {id: 803, cat: Movies, desc: " |---- Mia Hansen-Love"} + - {id: 151, cat: Movies, desc: " |---- Michel Gondry"} + - {id: 350, cat: Movies, desc: " |---- Olivier Assayas"} + - {id: 667, cat: Movies, desc: " |---- Pascal Aubier"} + - {id: 224, cat: Movies, desc: " |---- Patrice Leconte"} + - {id: 873, cat: Movies, desc: " |---- Paul Vecchiali"} + - {id: 874, cat: Movies, desc: " |---- Philippe de Broca"} + - {id: 452, cat: Movies, desc: " |---- Philippe Garrel"} + - {id: 959, cat: Movies, desc: " |---- Philippe Grandrieux"} + - {id: 629, cat: Movies, desc: " |---- Pierre Étaix "} + - {id: 875, cat: Movies, desc: " |---- Pierre Granier-Deferre"} + - {id: 271, cat: Movies, desc: " |---- Raoul Ruiz"} + - {id: 226, cat: Movies, desc: " |---- René Clair"} + - {id: 429, cat: Movies, desc: " |---- René Clément"} + - {id: 109, cat: Movies, desc: " |---- Robert Bresson"} + - {id: 351, cat: Movies, desc: " |---- Robert Guédiguian"} + - {id: 398, cat: Movies, desc: " |---- Roger Vadim"} + - {id: 57, cat: Movies, desc: " |---- Roman Polanski"} + - {id: 352, cat: Movies, desc: " |---- Tony Gatlif"} + - {id: 596, cat: Movies, desc: " |---- Yves Robert"} + - {id: 139, cat: Movies, desc: " |-- Italianos"} + - {id: 526, cat: Movies, desc: " |---- Alberto Lattuada"} + - {id: 804, cat: Movies, desc: " |---- Antonio Pietrangeli"} + - {id: 58, cat: Movies, desc: " |---- Bernardo Bertolucci"} + - {id: 198, cat: Movies, desc: " |---- Dario Argento"} + - {id: 394, cat: Movies, desc: " |---- Dino Risi"} + - {id: 668, cat: Movies, desc: " |---- Elio Petri"} + - {id: 321, cat: Movies, desc: " |---- Ermanno Olmi"} + - {id: 115, cat: Movies, desc: " |---- Ettore Scola"} + - {id: 56, cat: Movies, desc: " |---- Federico Fellini"} + - {id: 597, cat: Movies, desc: " |---- Ferzan Ozpetek"} + - {id: 322, cat: Movies, desc: " |---- Francesco Rosi"} + - {id: 960, cat: Movies, desc: " |---- Franco Brocani"} + - {id: 323, cat: Movies, desc: " |---- Franco Zeffirelli"} + - {id: 569, cat: Movies, desc: " |---- Gianni Amelio"} + - {id: 98, cat: Movies, desc: " |---- Giuseppe Tornatore"} + - {id: 739, cat: Movies, desc: " |---- Liliana Cavani"} + - {id: 457, cat: Movies, desc: " |---- Lina Wertmüller"} + - {id: 68, cat: Movies, desc: " |---- Luchino Visconti"} + - {id: 805, cat: Movies, desc: " |---- Luciano Salce"} + - {id: 598, cat: Movies, desc: " |---- Lucio Fulci"} + - {id: 431, cat: Movies, desc: " |---- Luigi Comencini"} + - {id: 324, cat: Movies, desc: " |---- Marco Bellocchio"} + - {id: 325, cat: Movies, desc: " |---- Marco Ferreri"} + - {id: 197, cat: Movies, desc: " |---- Mario Bava"} + - {id: 740, cat: Movies, desc: " |---- Mario Matolli"} + - {id: 128, cat: Movies, desc: " |---- Mario Monicelli"} + - {id: 876, cat: Movies, desc: " |---- Mauro Bolognini"} + - {id: 64, cat: Movies, desc: " |---- Michelangelo Antonioni"} + - {id: 961, cat: Movies, desc: " |---- Michele Soavi"} + - {id: 174, cat: Movies, desc: " |---- Nanni Moretti"} + - {id: 669, cat: Movies, desc: " |---- Paolo Sorrentino"} + - {id: 806, cat: Movies, desc: " |---- Paolo Virzi"} + - {id: 212, cat: Movies, desc: " |---- Paolo & Vittorio Taviani"} + - {id: 80, cat: Movies, desc: " |---- Pier Paolo Pasolini"} + - {id: 527, cat: Movies, desc: " |---- Pietro Germi"} + - {id: 962, cat: Movies, desc: " |---- Raffaello Matarazzo"} + - {id: 92, cat: Movies, desc: " |---- Roberto Benigni"} + - {id: 175, cat: Movies, desc: " |---- Roberto Rossellini"} + - {id: 327, cat: Movies, desc: " |---- Sergio Corbucci"} + - {id: 112, cat: Movies, desc: " |---- Sergio Leone"} + - {id: 807, cat: Movies, desc: " |---- Sergio Martino"} + - {id: 630, cat: Movies, desc: " |---- Steno"} + - {id: 230, cat: Movies, desc: " |---- Tinto Brass"} + - {id: 326, cat: Movies, desc: " |---- Valerio Zurlini"} + - {id: 963, cat: Movies, desc: " |---- Vittorio Cottafavi"} + - {id: 127, cat: Movies, desc: " |---- Vittorio de Sica"} + - {id: 86, cat: Movies, desc: " |-- Latino-Americanos"} + - {id: 599, cat: Movies, desc: " |---- Adolfo Aristarain"} + - {id: 528, cat: Movies, desc: " |---- Adrián Caetano"} + - {id: 87, cat: Movies, desc: " |---- Alejandro Jodorowsky"} + - {id: 670, cat: Movies, desc: " |---- Andrés Wood"} + - {id: 671, cat: Movies, desc: " |---- Carlos Enrique Taboada"} + - {id: 672, cat: Movies, desc: " |---- Carlos Reygadas"} + - {id: 481, cat: Movies, desc: " |---- Carlos Sorin"} + - {id: 432, cat: Movies, desc: " |---- Daniel Burman"} + - {id: 570, cat: Movies, desc: " |---- Eliseo Subiela"} + - {id: 964, cat: Movies, desc: " |---- Emilio Fernández"} + - {id: 303, cat: Movies, desc: " |---- Fernando E. Solanas"} + - {id: 571, cat: Movies, desc: " |---- Ismael Rodriguez"} + - {id: 965, cat: Movies, desc: " |---- Leopoldo Torre Nilsson"} + - {id: 808, cat: Movies, desc: " |---- Lisandro Alonso"} + - {id: 741, cat: Movies, desc: " |---- Lucrecia Martel"} + - {id: 673, cat: Movies, desc: " |---- Marcelo Piñeyro"} + - {id: 877, cat: Movies, desc: " |---- Marco Berger"} + - {id: 674, cat: Movies, desc: " |---- Miguel Littin"} + - {id: 809, cat: Movies, desc: " |---- Pablo Larraín"} + - {id: 529, cat: Movies, desc: " |---- Pablo Trapero"} + - {id: 302, cat: Movies, desc: " |---- Santiago Álvarez"} + - {id: 572, cat: Movies, desc: " |---- Tomás Gutiérrez Alea"} + - {id: 292, cat: Movies, desc: " |-- Oceania"} + - {id: 810, cat: Movies, desc: " |---- Bruce Beresford"} + - {id: 984, cat: Movies, desc: " |---- Fred Schepisi"} + - {id: 512, cat: Movies, desc: " |---- Jane Campion"} + - {id: 966, cat: Movies, desc: " |---- Peter Jackson"} + - {id: 296, cat: Movies, desc: " |---- Peter Weir"} + - {id: 482, cat: Movies, desc: " |---- Rolf de Heer"} + - {id: 146, cat: Movies, desc: " |-- Oriente Médio"} + - {id: 147, cat: Movies, desc: " |---- Abbas Kiarostami"} + - {id: 315, cat: Movies, desc: " |---- Amos Gitai"} + - {id: 530, cat: Movies, desc: " |---- Asghar Farhadi"} + - {id: 531, cat: Movies, desc: " |---- Bahman Ghobadi"} + - {id: 878, cat: Movies, desc: " |---- Çagan Irmak"} + - {id: 675, cat: Movies, desc: " |---- Dariush Mehrjui"} + - {id: 195, cat: Movies, desc: " |---- Jafar Panahi"} + - {id: 434, cat: Movies, desc: " |---- Majid Majidi"} + - {id: 879, cat: Movies, desc: " |---- Mohammad Rasoulof"} + - {id: 172, cat: Movies, desc: " |---- Mohsen Makhmalbaf"} + - {id: 194, cat: Movies, desc: " |---- Nuri Bilge Ceylan"} + - {id: 600, cat: Movies, desc: " |---- Reha Erdem"} + - {id: 967, cat: Movies, desc: " |---- Semih Kaponoglu"} + - {id: 676, cat: Movies, desc: " |---- Yilmaz Güney"} + - {id: 513, cat: Movies, desc: " |---- Zeki Demirkubuz"} + - {id: 459, cat: Movies, desc: " |-- Península Ibérica"} + - {id: 742, cat: Movies, desc: " |---- Adolfo Arrieta"} + - {id: 968, cat: Movies, desc: " |---- Agustí Villaronga"} + - {id: 305, cat: Movies, desc: " |---- Alejandro Amenábar"} + - {id: 969, cat: Movies, desc: " |---- Albert Serra"} + - {id: 269, cat: Movies, desc: " |---- Álex de la Iglesia"} + - {id: 144, cat: Movies, desc: " |---- Bigas Luna"} + - {id: 186, cat: Movies, desc: " |---- Carlos Saura"} + - {id: 811, cat: Movies, desc: " |---- Fernando Lopes"} + - {id: 514, cat: Movies, desc: " |---- Fernando Trueba"} + - {id: 306, cat: Movies, desc: " |---- Isabel Coixet"} + - {id: 743, cat: Movies, desc: " |---- João Botelho"} + - {id: 264, cat: Movies, desc: " |---- João César Monteiro"} + - {id: 601, cat: Movies, desc: " |---- João Pedro Rodrigues"} + - {id: 812, cat: Movies, desc: " |---- José Fonseca e Costa"} + - {id: 880, cat: Movies, desc: " |---- José Luis Garci"} + - {id: 813, cat: Movies, desc: " |---- José Luis Guerín"} + - {id: 188, cat: Movies, desc: " |---- Julio Medem"} + - {id: 44, cat: Movies, desc: " |---- Luis Buñuel"} + - {id: 881, cat: Movies, desc: " |---- Luís Filipe Rocha"} + - {id: 180, cat: Movies, desc: " |---- Manoel De Oliveira"} + - {id: 814, cat: Movies, desc: " |---- Manuel Mozos"} + - {id: 677, cat: Movies, desc: " |---- Miguel Gomes"} + - {id: 970, cat: Movies, desc: " |---- Noémia Delgado"} + - {id: 815, cat: Movies, desc: " |---- Paulo Rocha"} + - {id: 55, cat: Movies, desc: " |---- Pedro Almodóvar"} + - {id: 308, cat: Movies, desc: " |---- Pedro Costa"} + - {id: 678, cat: Movies, desc: " |---- Pere Portabella"} + - {id: 971, cat: Movies, desc: " |---- Rita Azevedo Gomes"} + - {id: 972, cat: Movies, desc: " |---- Teresa Villaverde"} + - {id: 425, cat: Movies, desc: " |---- Victor Erice"} + # - {id: 6, cat: Movies, desc: "Informações em Geral"} + # - {id: 7, cat: Movies, desc: " |-- Regras e Normas"} + # - {id: 9, cat: Movies, desc: " |-- Críticas e Sugestões"} + # - {id: 22, cat: Movies, desc: " |-- Novidades"} + # - {id: 21, cat: Movies, desc: " |-- Pedidos"} + # - {id: 20, cat: Movies, desc: " |-- Boteco Making Off"} + # - {id: 54, cat: Movies, desc: " |-- Quarentena"} + # - {id: 16, cat: Movies, desc: "Tutoriais e Ajuda"} + # - {id: 17, cat: Movies, desc: " |-- Tutoriais em Geral"} + # - {id: 18, cat: Movies, desc: " |-- DivX, XviD e outros formatos"} + # - {id: 19, cat: Movies, desc: " |-- Dúvidas em Geral"} + # - {id: 145, cat: Movies, desc: " |-- O Cinema na Teoria e na Prática"} + + modes: + search: [q] + tv-search: [q, imdbid] + movie-search: [q, imdbid] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: sort + type: select + label: Sort requested from site + default: date + options: + date: updated + title: title + - name: type + type: select + label: Order requested from site + default: 0 + options: + 0: desc + 1: asc + - name: info_delay + type: info + label: Delay between searches + default: This forum enforces a 20s delay between searches. If no results are returned for a search, wait for 20s and try again. + +login: + path: forum/index.php + method: form + form: form#login + inputs: + referer: https://makingoff.org/forum/index.php + ips_username: "{{ .Config.username }}" + ips_password: "{{ .Config.password }}" + rememberMe: 1 + selectorinputs: + auth_key: + selector: input[name="auth_key"] + attribute: value + error: + - selector: p.message.error + test: + path: forum/index.php + selector: a[href*="section=login&do=logout&k="] + +search: + paths: + - path: forum/index.php + inputs: + $raw: "{{ range .Categories }}search_app_filters[forums][forums][]={{.}}&{{end}}" + app: core + module: search + section: search + do: search + fromsearch: 1 + search_app: forums + search_term: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}{{ if or .Query.IMDBID .Keywords }}{{ else }}{{ .Today.Year }}{{ end }}" + andor_type: and + # both, titles, content - title only search returns less information + search_content: both + # 0 posts, 1 topics + search_app_filters[forums][noPreview]: 0 + search_app_filters[forums][sortKey]: "{{ .Config.sort }}" + search_app_filters[forums][sortDir]: "{{ .Config.type }}" + submit: Pesquisar + + rows: + selector: div.post_block:has(a[href*="attach_id="]:has(strong:contains(".torrent"))) + filters: + - name: andmatch + + fields: + category: + selector: a[href*="index.php?showforum="] + attribute: href + filters: + - name: querystring + args: showforum + title: + selector: div.post.entry-content table tbody tr:nth-child(2) td div:first-child > font[size="2"] + details: + selector: a[href*="index.php?showtopic="] + attribute: href + download: + selector: a[href*="attach_id="]:has(strong:contains(".torrent")) + attribute: href + poster: + selector: div.post.entry-content table tbody tr:nth-child(4) td:first-child > span[rel="lightbox"] img.bbc_img + attribute: src + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + size: + selector: div.post.entry-content table tbody tr:nth-child(2) td:nth-child(3) > font[size="2"] + filters: + - name: regexp + args: "(?i)Tamanho: (.+?b)" + year: + selector: div.post.entry-content table tbody tr:nth-child(2) td:nth-child(2) > font[size="2"] + filters: + - name: regexp + args: "Ano de Lançamento: ((19|20)\\d{2})" + seeders: + text: 1 + leechers: + text: 1 + grabs: + selector: span:contains("ownloads") + date: + selector: abbr.published + attribute: title + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 + description: + selector: div.post.entry-content table tbody tr:nth-child(4) td div:first-child > font[size="2"] +# engine n/a diff --git a/config/prowlarr/Definitions/marinetracker.yml b/config/prowlarr/Definitions/marinetracker.yml new file mode 100644 index 0000000..07239ff --- /dev/null +++ b/config/prowlarr/Definitions/marinetracker.yml @@ -0,0 +1,314 @@ +--- +id: marinetracker +name: Marine Tracker +description: "Marine Tracker is a RUSSIAN Semi-Private Torrent Tracker for MARITIME E-LEARNING" +language: ru-RU +type: semi-private +encoding: UTF-8 +links: + - https://seatracker.ru/ + +caps: + categorymappings: + - {id: 5, cat: Books, desc: "Shipbuilding & Shiprepairing"} + - {id: 314, cat: Books, desc: "Shipbuilding & Shiprepairing-Ship supply (chemicals, paints, oils)"} + - {id: 313, cat: Books, desc: "Shipbuilding & Shiprepairing-Shipbuilding materials"} + - {id: 312, cat: Books, desc: "Shipbuilding & Shiprepairing-Shipbuilding Management"} + - {id: 311, cat: Books, desc: "Shipbuilding & Shiprepairing-Mathematical Modeling"} + - {id: 310, cat: Books, desc: "Shipbuilding & Shiprepairing-Hydrodynamics"} + - {id: 309, cat: Books, desc: "Shipbuilding & Shiprepairing-Naval Architecture & Marine Engineering"} + - {id: 308, cat: Books, desc: "Shipbuilding & Shiprepairing-Shipbuilding Standard @ Register"} + - {id: 196, cat: Books, desc: "Shipbuilding & Shiprepairing-Welding"} + - {id: 195, cat: Books, desc: "Shipbuilding & Shiprepairing-Turnary"} + - {id: 226, cat: Books, desc: "Mobile Apps for Seafarers"} + - {id: 6, cat: PC, desc: "Maritime Software"} + - {id: 211, cat: PC, desc: "Maritime Software-Navigation soft & Charts"} + - {id: 19, cat: PC, desc: "Maritime Software-Training software"} + - {id: 13, cat: PC, desc: "Maritime Software-Marine Tests"} + - {id: 14, cat: PC, desc: "Maritime Software-Maritime Simulators"} + - {id: 12, cat: PC, desc: "Maritime Software-Answers to tests"} + - {id: 20, cat: PC, desc: "Maritime Software-Calculation soft"} + - {id: 179, cat: PC, desc: "Maritime Software-Programming and SDK software"} + - {id: 317, cat: PC, desc: "Maritime Software-Shareware (demo, trial)"} + - {id: 188, cat: PC, desc: "Maritime Software-Other soft"} + - {id: 21, cat: Books, desc: "Deckofficer's Library"} + - {id: 283, cat: Books, desc: "Deckofficer's Library-Radar at sea"} + - {id: 114, cat: Books, desc: "Deckofficer's Library-Watch keeping"} + - {id: 115, cat: Books, desc: "Deckofficer's Library-Keeping the ship documentation"} + - {id: 32, cat: Books, desc: "Deckofficer's Library-Cargo operations"} + - {id: 34, cat: Books, desc: "Deckofficer's Library-Navigation"} + - {id: 35, cat: Books, desc: "Deckofficer's Library-Ship handling"} + - {id: 36, cat: Books, desc: "Deckofficer's Library-Technical equipment of navigation"} + - {id: 95, cat: Books, desc: "Deckofficer's Library-Hydrometeorology"} + - {id: 100, cat: Books, desc: "Deckofficer's Library-Ship Theory"} + - {id: 110, cat: Books, desc: "Deckofficer's Library-Nautical Astronomy"} + - {id: 94, cat: Books, desc: "Deckofficer's Library-Nautical charts, tables, sailing directions"} + - {id: 116, cat: Books, desc: "Deckofficer's Library-Global Maritime Distress and Safety System (GMDSS)"} + - {id: 192, cat: Books, desc: "Deckofficer's Library-Navigation in the ice"} + - {id: 42, cat: Books, desc: "Safety of Navigation"} + - {id: 307, cat: Books, desc: "Safety of Navigation-Life Safety at Sea"} + - {id: 306, cat: Books, desc: "Safety of Navigation-Casualties and Incidents"} + - {id: 305, cat: Books, desc: "Safety of Navigation-Safety Digest, Lessons from Marine Accident Reports"} + - {id: 304, cat: Books, desc: "Safety of Navigation-Fire fighting at sea"} + - {id: 303, cat: Books, desc: "Safety of Navigation-Anti-Piracy Security"} + - {id: 302, cat: Books, desc: "Safety of Navigation-Emergency and life-saving equipment"} + - {id: 301, cat: Books, desc: "Safety of Navigation-Cybersecurity"} + - {id: 8, cat: Movies, desc: "Video for Seamen"} + - {id: 234, cat: Movies, desc: "Video for Seamen-Video for Deck Officers"} + - {id: 233, cat: Movies, desc: "Video for Seamen-Video for Marine Engineers"} + - {id: 235, cat: Movies, desc: "Video for Seamen-Other videos"} + - {id: 102, cat: Books, desc: "Marine Engineer's Library"} + - {id: 316, cat: Books, desc: "Marine Engineer's Library-Marine Fuels & Lubricants"} + - {id: 28, cat: Books, desc: Marine Engineer's Library-Ship's systems and mechanisms"} + - {id: 22, cat: Books, desc: Marine Engineer's Library-Daihatsu"} + - {id: 164, cat: Books, desc: Marine Engineer's Library-Operation of ship's power plants"} + - {id: 199, cat: Books, desc: Marine Engineer's Library-Ship Propulsion"} + - {id: 176, cat: Books, desc: Marine Engineer's Library-Marine refrigeration plants"} + - {id: 175, cat: Books, desc: Marine Engineer's Library-Marine boilers"} + - {id: 173, cat: Books, desc: Marine Engineer's Library-MAK & Caterpillar"} + - {id: 166, cat: Books, desc: Marine Engineer's Library-Ship's steam and gas turbines"} + - {id: 134, cat: Books, desc: Marine Engineer's Library-Marine Pumps"} + - {id: 108, cat: Books, desc: Marine Engineer's Library-Hydraulics"} + - {id: 16, cat: Books, desc: Marine Engineer's Library-MAN B&W"} + - {id: 17, cat: Books, desc: Marine Engineer's Library-Wärtsilä & Sulzer"} + - {id: 7, cat: Books, desc: "Technical Books (Not maritime)"} + - {id: 328, cat: Books, desc: "Technical Books (Not maritime)-Hydraulics"} + - {id: 327, cat: Books, desc: "Technical Books (Not maritime)-Mechanics"} + - {id: 326, cat: Books, desc: "Technical Books (Not maritime)-Electricity"} + - {id: 10, cat: Books, desc: "English for seamen"} + - {id: 265, cat: Books, desc: "English for seamen-Marine dictionaries and glossaries RU↔RU/EN↔EN"} + - {id: 266, cat: Books, desc: "English for seamen-English for Deck Officers"} + - {id: 267, cat: Books, desc: "English for seamen-English for Marine Engineers"} + - {id: 268, cat: Books, desc: "English for seamen-English for ETO's"} + - {id: 269, cat: Books, desc: "English for seamen-English for Shipbuilders"} + - {id: 270, cat: Books, desc: "English for seamen-RU↔EN dictionaries & phrasebooks"} + - {id: 271, cat: Books, desc: "English for seamen-Business English and Correspondence"} + - {id: 205, cat: Books, desc: "General english"} + - {id: 101, cat: Books, desc: "Electrical Technical Officer's Library"} + - {id: 29, cat: Books, desc: "Electrical Technical Officer's Library-Marine Electronics"} + - {id: 103, cat: Books, desc: "Electrical Technical Officer's Library-Ship's automatics"} + - {id: 104, cat: Books, desc: "Electrical Technical Officer's Library-Electrical machines"} + - {id: 210, cat: Books, desc: "Electrical Technical Officer's Library-Programmable Logic Controllers (PLC)"} + - {id: 172, cat: Books, desc: "Electrical Technical Officer's Library-Incinerators"} + - {id: 167, cat: Books, desc: "Electrical Technical Officer's Library-Cranes"} + - {id: 107, cat: Books, desc: "Electrical Technical Officer's Library-ETO Handbooks"} + - {id: 105, cat: Books, desc: "Electrical Technical Officer's Library-Sources of electricity"} + - {id: 37, cat: Books, desc: "Organization and management of maritime transport"} + - {id: 11, cat: Books, desc: "Section for cadets"} + - {id: 285, cat: Books, desc: "Section for cadets-Encyclopedias and atlases"} + - {id: 191, cat: Books, desc: "Maritime Law"} + - {id: 329, cat: Books, desc: "Maritime Law-Lloyd's, ABS, BV, DNV-GL, TÜV, NKK, RMRS and other approvals"} + - {id: 240, cat: Books, desc: "Maritime Law-IMO Resolutions"} + - {id: 212, cat: Books, desc: "Ship's documentation"} + - {id: 190, cat: Books, desc: "Catalogs"} + - {id: 113, cat: Books, desc: "Medicine"} + - {id: 299, cat: Books, desc: "Sailing Kitchen"} + - {id: 39, cat: Books, desc: "Purpose-built ships"} + - {id: 51, cat: Books, desc: "Purpose-built ships-Oil & Chemical Tankers"} + - {id: 52, cat: Books, desc: "Purpose-built ships-Dry cargo vessels"} + - {id: 250, cat: Books, desc: "Purpose-built ships-LNG \ LPG"} + - {id: 284, cat: Books, desc: "Purpose-built ships-Nuclear powered ships"} + - {id: 54, cat: Books, desc: "Purpose-built ships-Passenger ships"} + - {id: 248, cat: Books, desc: "Purpose-built ships-Fishing vessels"} + - {id: 239, cat: Books, desc: "Purpose-built ships-Offshore"} + - {id: 349, cat: Books, desc: "Purpose-built ships-Dynamic positioning vessels"} + - {id: 330, cat: Books, desc: "Examinations"} + - {id: 333, cat: Books, desc: "Examinations-IMU CET"} + - {id: 334, cat: Books, desc: "Examinations-NCV"} + - {id: 336, cat: Books, desc: "Examinations-ASM"} + - {id: 337, cat: Books, desc: "Examinations-TME"} + - {id: 338, cat: Books, desc: "Examinations-MEO"} + - {id: 341, cat: Books, desc: "Examinations-Chief Mates (Phase I)"} + - {id: 343, cat: Books, desc: "Examinations-ROR - Colregs"} + - {id: 335, cat: Books, desc: "Examinations-Second Mates"} + - {id: 342, cat: Books, desc: "Examinations-Chief Mates (Phase II)"} + - {id: 340, cat: Books, desc: "Examinations-Text books"} + - {id: 339, cat: Books, desc: "Examinations-Miscellaneous"} + - {id: 99, cat: Audio, desc: "Audio"} + - {id: 288, cat: Audio, desc: "Audio-♬ Music"} + - {id: 287, cat: Audio, desc: "Audio-Non-Fiction"} + - {id: 286, cat: Audio, desc: "Audio-Fiction"} + - {id: 111, cat: Books, desc: "Yachting, sailing, boating"} + - {id: 345, cat: Books, desc: "Yachting, sailing, boating-Solar boats"} + - {id: 318, cat: Books, desc: "Yachting, sailing, boating-Sailing life"} + - {id: 298, cat: Books, desc: "Yachting, sailing, boating-Cruising Guides"} + - {id: 297, cat: Books, desc: "Yachting, sailing, boating-Weather Sailing"} + - {id: 296, cat: Books, desc: "Yachting, sailing, boating-How to Buy a Boat?"} + - {id: 258, cat: Books, desc: "Yachting, sailing, boating-Inflatable boats, boats, kayaks"} + - {id: 237, cat: Books, desc: "Yachting, sailing, boating-Yachting, sailing videos"} + - {id: 257, cat: Books, desc: "Yachting, sailing, boating-Motor Boat & Yachting magazines"} + - {id: 253, cat: Books, desc: "Yachting, sailing, boating-Seamanship practice"} + - {id: 254, cat: Books, desc: "Yachting, sailing, boating-Repair and Restoration"} + - {id: 255, cat: Books, desc: "Yachting, sailing, boating-Sailing Alone"} + - {id: 256, cat: Books, desc: "Yachting, sailing, boating-Rigging, sails, knots"} + - {id: 252, cat: Books, desc: "Yachting, sailing, boating-Projects, design, construction"} + - {id: 251, cat: Books, desc: "Diving"} + - {id: 177, cat: Books, desc: "Shipmodeling"} + - {id: 293, cat: Books, desc: "Shipmodeling-Radio controlled models"} + - {id: 292, cat: Books, desc: "Shipmodeling-Marine Modelling Magazines"} + - {id: 291, cat: Books, desc: "Shipmodeling-Drawings and models of ships (CAD, 3D)"} + - {id: 346, cat: Books, desc: "Shipmodeling-Raster drawings (JPG, PDF, TIFF)"} + - {id: 290, cat: Books, desc: "Shipmodeling-Reference Material"} + - {id: 289, cat: Books, desc: "Shipmodeling-Ships in Bottles"} + - {id: 197, cat: Books, desc: "Marine bulletins"} + - {id: 219, cat: Books, desc: "Marine History"} + - {id: 347, cat: Books, desc: "Marine History-Sea Life"} + - {id: 323, cat: Books, desc: "Marine History-History of Submarines"} + - {id: 282, cat: Books, desc: "Marine History-Fleets history"} + - {id: 281, cat: Books, desc: "Marine History-History of Merchant Marine"} + - {id: 280, cat: Books, desc: "Marine History-Historic ships"} + - {id: 279, cat: Books, desc: "Marine History-Marine vessels"} + - {id: 278, cat: Books, desc: "Marine History-Warships"} + - {id: 259, cat: Books, desc: "Marine History-Shipbuilding history"} + - {id: 277, cat: Books, desc: "Marine History-Wars at Sea"} + - {id: 276, cat: Books, desc: "Marine History-War at sea (World War I)"} + - {id: 261, cat: Books, desc: "Marine History-War at sea (World War II)"} + - {id: 262, cat: Books, desc: "Marine History-The history of sailing ships"} + - {id: 273, cat: Books, desc: "Marine History-History of Seafaring"} + - {id: 275, cat: Books, desc: "Marine History-Accidents and disasters at sea"} + - {id: 264, cat: Books, desc: "Marine History-Marine cartography"} + - {id: 274, cat: Books, desc: "Marine History-Pirates"} + - {id: 218, cat: Books, desc: "Maritime Fiction"} + - {id: 198, cat: Books, desc: "Navy"} + - {id: 272, cat: Books, desc: "Navy-Naval magazines"} + - {id: 260, cat: Books, desc: "Navy-Naval shipbuilding (1950 - 20??)"} + - {id: 220, cat: Books, desc: "Fishing & Spearfishing"} + - {id: 319, cat: Books, desc: "Fishing tackle and knots"} + - {id: 294, cat: Books, desc: "Environmental protection"} + - {id: 242, cat: Books, desc: "Foreign language books"} + - {id: 344, cat: Books, desc: "Foreign language books-Yachting"} + - {id: 243, cat: Books, desc: "Rarity"} + - {id: 244, cat: Books, desc: "Rarity-1900 - 1950"} + - {id: 245, cat: Books, desc: "Rarity-1800 - 1900"} + - {id: 246, cat: Books, desc: "Rarity-1700 - 1800"} + - {id: 247, cat: Books, desc: "Rarity-1600 - 1700"} + - {id: 350, cat: Other, desc: "Art"} + - {id: 324, cat: Other, desc: "Posters, placards, signs"} + - {id: 187, cat: Books, desc: "Others (not maritime)"} + - {id: 38, cat: Books, desc: "Archive-Uncategorized"} + - {id: 162, cat: Books, desc: "Archive"} +# - {id: 325, cat: Other, desc: "Corrupt torrents (hash errors)"} # we filter these out in the rows selector + - {id: 322, cat: Books, desc: "Archive-No seeds"} + - {id: 321, cat: Books, desc: "Archive-Outdated software"} + - {id: 295, cat: Books, desc: "Archive-Unregistered"} + + modes: + search: [q] + movie-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 1 + options: + 1: created + 10: seeders + 7: size + 2: title + - name: type + type: select + label: Order requested from site + default: 2 + options: + 2: desc + 1: asc + +login: + path: / + method: form + form: form.logform + inputs: + login_username: "{{ .Config.username }}" + login_password: "{{ .Config.password }}" + autologin: 1 + error: + - selector: div#error_fon + test: + path: / + selector: a[href^="/./login.php?logout="] + +search: + paths: + - path: tracker.php + method: post + inputs: + $raw: "{{ if .Categories }}{{ range .Categories }}f[]={{.}}&{{end}}{{ else }}f[]=-1{{ end }}" + nm: "{{ .Keywords }}" + allw: 1 + o: "{{ .Config.sort }}" + s: "{{ .Config.type }}" + tm: -1 + sns: -1 + prev_allw: 1 + prev_a: 0 + prev_dla: 0 + prev_dlc: 0 + prev_dld: 0 + prev_dlw: 0 + prev_my: 0 + prev_new: 0 + prev_sd: 0 + prev_da: 1 + prev_dc: 0 + prev_df: 1 + prev_dl: 1 + prev_ds: 0 + prev_tor_type: 0 + df: 1 + da: 1 + dl: 1 + tor_type: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + submit: "%C2%A0%C2%A0Search%C2%A0%C2%A0" + + rows: + selector: tr[id^="tor_"]:has(a[href^="./download.php?id="]):not(:has(a[href="tracker.php?f=325"])) + + fields: + title: + selector: a.tLink + details: + selector: a.tLink + attribute: href + download: + selector: a[href^="./download.php?id="] + attribute: href + category: + selector: td a.gen + attribute: href + filters: + - name: querystring + args: f + description: + selector: td span.iconDL + size: + selector: td:nth-last-child(5) > u + optional: true + default: 0 B + seeders: + selector: td.seedmed + leechers: + selector: td.leechmed + grabs: + selector: td:nth-last-child(2) + date: + selector: td:last-child > u + downloadvolumefactor: + case: + img[src="images/tor_gold.gif"]: 0 + img[src="images/tor_silver.gif"]: 0.5 + "*": 1 + uploadvolumefactor: + text: 1 +# Engine n/a diff --git a/config/prowlarr/Definitions/masters-tb.yml b/config/prowlarr/Definitions/masters-tb.yml new file mode 100644 index 0000000..ed46fb8 --- /dev/null +++ b/config/prowlarr/Definitions/masters-tb.yml @@ -0,0 +1,176 @@ +--- +id: masters-tb +name: Masters-TB +description: "Masters-TB is a BULGARIAN Semi-Private Torrent Tracker for 0DAY / GENERAL" +language: bg-BG +type: semi-private +encoding: windows-1251 +links: + - https://masters-tb.com/ + +caps: + categorymappings: + - {id: 23, cat: TV/Anime, desc: "Анимации"} + - {id: 56, cat: PC/Mobile-Android, desc: "Android"} + - {id: 53, cat: Books/EBook, desc: "e-Books"} + - {id: 17, cat: Console, desc: "Игри/конзоли"} + - {id: 4, cat: PC/Games, desc: "Игри/PC ISO"} + - {id: 21, cat: PC/Games, desc: "Игри/PC Rip"} + - {id: 1, cat: PC/ISO, desc: "Програми/PC ISO"} + - {id: 22, cat: PC, desc: "Програми/други"} + - {id: 57, cat: TV, desc: "Препоръчано MastersTB"} + - {id: 57, cat: Movies, desc: "Препоръчано MastersTB"} + - {id: 6, cat: Audio, desc: "Музика"} + - {id: 12, cat: Audio/Video, desc: "Музика/Видео"} + - {id: 33, cat: Audio/Video, desc: "Музика/DVD-R"} + - {id: 52, cat: Audio/Lossless, desc: "Музика/Lossless"} + - {id: 35, cat: TV, desc: "Сериали/BoxSet"} + - {id: 7, cat: TV, desc: "Сериали/TV"} + - {id: 32, cat: Movies, desc: "Филми/БГ"} + - {id: 55, cat: Movies, desc: "Филми/Asian"} + - {id: 36, cat: Movies, desc: "Филми/BoxSet"} + - {id: 28, cat: Movies, desc: "Филми/Руски"} + - {id: 34, cat: Movies/DVD, desc: "Филми/Руски DVD-R"} + - {id: 20, cat: Movies/DVD, desc: "Филми/DVD-R"} + - {id: 37, cat: Movies/HD, desc: "Филми/HD"} + - {id: 30, cat: TV/Sport, desc: "Филми/Спорт"} + - {id: 19, cat: Movies/SD, desc: "Филми/XviD"} + - {id: 29, cat: TV/Documentary, desc: "Филми/Документални"} + - {id: 54, cat: TV, desc: "TV Show"} + - {id: 2, cat: Other, desc: "Други"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Tоренти на страница: setting to 100 on your account profile. The default is 20. + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: td.embedded:has(h2:contains("failed")) + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 active, 1 all, 2 dead + incldead: 1 + # 0 name, 1 descr + searchrs: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + + rows: + selector: "table[width=\"65%\"]:nth-child(3) > tbody > tr[onmouseover]{{ if .Config.freeleech }}:has(img[src=\"pic/freeleech.png\"]){{ else }}{{ end }}" + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="download.php?id="] + attribute: href + filters: + - name: querystring + args: name + - name: regexp + args: ^(.+?)\.torrent + - name: htmldecode + title: + selector: a[href^="details.php?id="] + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + magnet: + selector: a[href^="magnet:?xt="] + optional: true + attribute: href + poster: + selector: a[href^="details.php?id="] + attribute: onmouseover + filters: + - name: regexp + args: src=([^\s]+) + - name: replace + args: ["pic/not-available.jpg>');", ""] + files: + selector: td:nth-last-child(8) + date: + # 2023-05-19
14:10:17 + selector: td:nth-last-child(6) + filters: + - name: append + args: " +02:00" # EET + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + size: + selector: td:nth-last-child(4) + grabs: + selector: td:nth-last-child(3) + seeders: + selector: td:nth-last-child(2) + leechers: + selector: td:nth-last-child(1) + downloadvolumefactor: + case: + img[src="pic/freeleech.png"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 + description: + selector: td:has(a[href^="details.php?id="]) + remove: a +# engine tbd diff --git a/config/prowlarr/Definitions/mazepa.yml b/config/prowlarr/Definitions/mazepa.yml new file mode 100644 index 0000000..f68e157 --- /dev/null +++ b/config/prowlarr/Definitions/mazepa.yml @@ -0,0 +1,348 @@ +--- +id: mazepa +name: Mazepa +description: "Mazepa is a UKRAINIAN Semi-Private Torrent Tracker for Videos with Ukrainian soundtracks" +language: uk-UA +type: semi-private +encoding: UTF-8 +links: + - https://mazepa.to/ + +caps: + categorymappings: + # note: when refreshing cats use the tracker.php not the search.php! + # Колекція українського контенту + - {id: 37, cat: Movies/UHD, desc: "Українські фільми HD, UHD"} + - {id: 7, cat: Movies/SD, desc: "Українські фільми SD"} + - {id: 38, cat: TV/UHD, desc: "Українські серіали HD, UHD"} + - {id: 8, cat: TV/SD, desc: "Українські серіали SD"} + - {id: 35, cat: TV/Anime, desc: "Українські мультфільми HD, UHD"} + - {id: 5, cat: TV/Anime, desc: "Українські мультфільми SD"} + - {id: 36, cat: TV/Anime, desc: "Українські мультсеріали HD, UHD"} + - {id: 6, cat: TV/Anime, desc: "Українські мультсеріали SD"} + - {id: 39, cat: TV/Documentary, desc: "Українські документальні HD, UHD"} + - {id: 9, cat: TV/Documentary, desc: "Українські документальні SD"} + # Озвучений контент + - {id: 175, cat: Movies/UHD, desc: "Озвучений контент Новинки фільмів HD, UHD"} + - {id: 147, cat: Movies/UHD, desc: "Озвучений контент Фільми UHD"} + - {id: 12, cat: Movies/HD, desc: "Озвучений контент Фільми HD"} + - {id: 13, cat: Movies/SD, desc: "Озвучений контент Фільми SD"} + - {id: 174, cat: Movies, desc: "Озвучений контент Субтитровані фільми"} + - {id: 152, cat: TV/UHD, desc: "Озвучений контент Серіали UHD"} + - {id: 44, cat: TV/HD, desc: "Озвучений контент Серіали HD"} + - {id: 14, cat: TV/SD, desc: "Озвучений контент Серіали SD"} + - {id: 155, cat: TV/Anime, desc: "Озвучений контент Мультфільми UHD"} + - {id: 41, cat: TV/Anime, desc: "Озвучений контент Мультфільми HD"} + - {id: 10, cat: TV/Anime, desc: "Озвучений контент Мультфільми SD"} + - {id: 43, cat: TV/Anime, desc: "Озвучений контент Мультсеріали HD"} + - {id: 11, cat: TV/Anime, desc: "Озвучений контент Мультсеріали SD"} + - {id: 16, cat: TV/Anime, desc: "Аніме"} + - {id: 157, cat: TV/Documentary, desc: "Озвучений Документальне UHD"} + - {id: 42, cat: TV/Documentary, desc: "Озвучений Документальне HD"} + - {id: 15, cat: TV/Documentary, desc: "Озвучений Документальне SD"} + # Спорт + - {id: 20, cat: TV/Sport, desc: "Спорт Формула 1 Сезон 2023"} + - {id: 167, cat: TV/Sport, desc: "Спорт Формула 1 Сезон 2022"} + - {id: 79, cat: TV/Sport, desc: "Спорт Формула 1 Сезони 2017-2021"} + - {id: 21, cat: TV/Sport, desc: "Спорт Формула 1 Сезони 2007-2016"} + - {id: 75, cat: TV/Sport, desc: "Спорт Формула 1 Сезони до 2006"} + - {id: 77, cat: TV/Sport, desc: "Автоспорт"} + - {id: 47, cat: TV/Sport, desc: "Автоспорт Чемпіонат та кубок України"} + - {id: 46, cat: TV/Sport, desc: "Автоспорт Єврокубки"} + - {id: 48, cat: TV/Sport, desc: "Автоспорт Чемпіонат Світу"} + - {id: 49, cat: TV/Sport, desc: "Автоспорт Чемпіонат Європи"} + - {id: 53, cat: TV/Sport, desc: "Автоспорт Закордонні чемпіонати"} + - {id: 19, cat: TV/Sport, desc: "Бокс"} + # Телевізійні передачі + - {id: 29, cat: Audio/Video, desc: "Концерти, відеокліпи"} + - {id: 30, cat: TV, desc: "Теле-Шоу"} + # Музика + - {id: 65, cat: Audio, desc: "Музика Рок"} + - {id: 63, cat: Audio, desc: "Музика Поп, Диско"} + - {id: 66, cat: Audio, desc: "Музика Фольк, Етно, Народна, Бардівська"} + - {id: 64, cat: Audio, desc: "Музика Реп"} + - {id: 67, cat: Audio, desc: "Музика Електронна"} + - {id: 61, cat: Audio, desc: "Музика Джаз, Блюз"} + - {id: 60, cat: Audio, desc: "Музика Класична, Інструментальна"} + - {id: 82, cat: Audio, desc: "Музика Невидане"} + # Література + - {id: 93, cat: Books, desc: "Література Українська художня література [до 1991 р.]"} + - {id: 92, cat: Books, desc: "Література Українська художня література (після 1991 р.)"} + - {id: 91, cat: Books, desc: "Література Зарубіжна художня література"} + - {id: 90, cat: Books, desc: "Література Наукова література (гуманітарні дисципліни)"} + - {id: 89, cat: Books, desc: "Література Наукова література (природничі дисципліни)"} + - {id: 88, cat: Books, desc: "Література Навчальна та довідкова"} + - {id: 87, cat: Books, desc: "Література Періодика"} + - {id: 86, cat: Books, desc: "Література Батькам та малятам"} + - {id: 85, cat: Books/Comics, desc: "Література Графіка (комікси, манґа, BD та інше)"} + - {id: 84, cat: Audio/Audiobook, desc: "Аудіокниги українською"} + - {id: 96, cat: Audio/Audiobook, desc: "Аудіокниги українською Українська художня література"} + - {id: 95, cat: Audio/Audiobook, desc: "Аудіокниги українською Зарубіжна художня література"} + - {id: 94, cat: Audio/Audiobook, desc: "Аудіокниги українською Історія, біографістика, спогади"} + # Програмне забезпечення + - {id: 168, cat: PC, desc: "Програмне забезпечення Операційні системи"} + - {id: 169, cat: PC, desc: "Програмне забезпечення Системні програми"} + - {id: 170, cat: PC, desc: "Програмне забезпечення Офіс, текстові редактори"} + - {id: 171, cat: PC, desc: "Програмне забезпечення Аудіо, відео обробка"} + - {id: 173, cat: PC, desc: "Програмне забезпечення Інше"} + # Закритий розділ + - {id: 160, cat: Audio, desc: "Закритий розділ Rock, Alternative, Punk, Metal"} + - {id: 161, cat: Audio, desc: "Закритий розділ Pop"} + - {id: 181, cat: Audio, desc: "Закритий розділ Synthpop, Futurepop, New Wave, Electropop"} + - {id: 165, cat: Audio, desc: "Закритий розділ Jazz, Blues, Soul"} + - {id: 180, cat: Audio, desc: "Закритий розділ New Age & Meditative"} + - {id: 163, cat: Audio, desc: "Закритий розділ Rap, Hip-hop, RnB, Reggae"} + - {id: 166, cat: Audio, desc: "Закритий розділ Country, Country pop, Bluegrass, Southern rock"} + - {id: 162, cat: Audio, desc: "Закритий розділ Electronic"} + - {id: 164, cat: Audio, desc: "Закритий розділ Other Styles"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: stripcyrillic + type: checkbox + label: Strip Cyrillic Letters + default: false + - name: sort + type: select + label: Sort requested from site + default: 1 + options: + 1: created + 10: seeders + 7: size + 2: title + - name: type + type: select + label: Order requested from site + default: 2 + options: + 2: desc + 1: asc + +login: + path: login.php + method: post + inputs: + "login_username": "{{ .Config.username }}" + "login_password": "{{ .Config.password }}" + autologin: 1 + login: "Увійти" + error: + - selector: table.error + test: + path: index.php + selector: a[href="./login.php?logout=1"] + +search: + paths: + - path: tracker.php + method: post + inputs: + $raw: "{{ if .Categories }}{{ range .Categories }}f[]={{.}}&{{end}}{{ else }}f[]=-1{{ end }}" + prev_allw: 1 + prev_a: 0 + prev_dla: 0 + prev_dlc: 0 + prev_dld: 0 + prev_dlw: 0 + prev_my: 0 + prev_new: 0 + prev_sd: 0 + prev_da: 1 + prev_dc: 0 + prev_df: 1 + prev_ds: 0 + prev_tor_type: 0 + o: "{{ .Config.sort }}" + s: "{{ .Config.type }}" + # show category + dc: 0 + # show forum + df: 1 + # show author + da: 1 + # show speed + ds: 0 + # -1=all time + tm: -1 + # seed not seen -1=disregard + sns: -1 + # group releases -1=not selected + srg: -1 + nm: "{{ .Keywords }}" + # all words + allw: 1 + + keywordsfilters: + - name: re_replace # S01 to сезон 1 + args: ["(?i)\\bS0*(\\d+)\\b", "сезон $1"] + - name: re_replace # E01 to сері 1 + args: ["(?i)\\bE0*(\\d+)\\b", "сері $1"] + - name: re_replace # S01E01 to сезон 1 сері 1 + args: ["(?i)\\bS0*(\\d+)E0*(\\d+)\\b", "сезон $1 сері $2"] + - name: re_replace + args: ["(\\w+)", "+$1"] # prepend + to each word + + rows: + selector: tr[id^="tor_"]:has(a[href^="./dl.php?id="]) + + fields: + category: + selector: a[href^="tracker.php?f="] + attribute: href + filters: + - name: querystring + args: f + title: + selector: a[href^="./viewtopic.php?t="] + filters: + # normalize to SXXEYY format + # Ukrainian + - name: re_replace + args: ["(?i)[CС]езони?[\\s:]*(\\d+(?:-\\d+)?).+?(?:[CС]ері[їяй]|Епізоди?)[\\s:]*(\\d+(?:-\\d+)?)\\s*з\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езони?.+?(\\d+(?:-\\d+)?)\\s*з\\s*(\\w?)(?:\\s*(?:[CС]ері[їяй]|Епізоди?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езони?.+?(\\d+(?:-\\d+)?)\\s*(?:[CС]ері[їяй]|Епізоди?)\\s+з\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езони?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*з\\s*(\\w?)(?:\\s*(?:[CС]ері[їяй]|Епізоди?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езони?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*(?:[CС]ері[їяй]|Епізоди?)\\s+з\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езони?[\\s:]*(\\d+(?:-\\d+)?).+?(?:[CС]ері[їяй]|Епізоди?)[\\s:]*(\\d+(?:-\\d+)?)", "S$1E$2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езони?.+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ері[їяй]|Епізоди?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езони?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ері[їяй]|Епізоди?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езони?[\\s:]*(\\d+(?:-\\d+)?)", "S$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+[CС]езони?", "S$1"] + - name: re_replace + args: ["(?i)(?:[CС]ері[їяй]|Епізоди?)[\\s:]*(\\d+(?:-\\d+)?)\\s*з\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*з\\s*(\\w?)(?:\\s*(?:[CС]ері[їяй]|Епізоди?))", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:[CС]ері[їяй]|Епізоди?)\\s+з\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(?:[CС]ері[їяй]|Епізоди?)[\\s:]*(\\d+(?:-\\d+)?)", "E$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:[CС]ері[їяй]|Епізоди?)", "E$1"] + # English + - name: re_replace + args: ["(?i)Seasons?[\\s:]*(\\d+(?:-\\d+)?).+?(?:Episodes?)[\\s:]*(\\d+(?:-\\d+)?)\\s*of\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*Seasons?.+?(\\d+(?:-\\d+)?)\\s*of\\s*(\\w?)(?:\\s*Episodes?)?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*Seasons?.+?(\\d+(?:-\\d+)?)\\s*(?:Episodes?)\\s+of\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)Seasons?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*of\\s*(\\w?)(?:\\s*Episodes?)?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)Seasons?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*(?:Episodes?)\\s+of\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)Seasons?[\\s:]*(\\d+(?:-\\d+)?).+?(?:Episodes?)[\\s:]*(\\d+(?:-\\d+)?)", "S$1E$2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+Seasons?.+?(\\d+(?:-\\d+)?)\\s+(?:\\s*Episodes?)", "S$1E$2"] + - name: re_replace + args: ["(?i)Seasons?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)(?:\\s*Episodes?)", "S$1E$2"] + - name: re_replace + args: ["(?i)Seasons?[\\s:]*(\\d+(?:-\\d+)?)", "S$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+Seasons?", "S$1"] + - name: re_replace + args: ["(?i)(?:Episodes?)[\\s:]*(\\d+(?:-\\d+)?)\\s*of\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:Episodes?)\\s+of\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(?:Episodes?)[\\s:]*(\\d+(?:-\\d+)?)", "E$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:Episodes?)", "E$1"] + - name: re_replace + args: ["(\\([\\p{IsCyrillic}\\W]+\\))|(^[\\p{IsCyrillic}\\W\\d]+\\/ )|([\\p{IsCyrillic} \\-]+,+)|([\\p{IsCyrillic}]+)", "{{ if .Config.stripcyrillic }}{{ else }}$1$2$3$4{{ end }}"] + - name: re_replace + args: ["(?i)\\bHDTV[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bSAT[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bWEB[-\\s]?DL[-\\s]?Rip\\b", "WEB-DL"] + - name: re_replace + args: ["(?i)\\bWEB\\sRip\\b", "WEBRip"] + - name: re_replace + args: ["(?i)\\bWEB\\sDL\\b", "WEB-DL"] + - name: re_replace + args: ["[\\[\\(\\{<«][\\s\\W]*[\\]\\)\\}>»]", ""] + - name: re_replace + args: ["^[\\s&,\\.!\\?\\+\\-_\\|\\/':]+", ""] + - name: re_replace + args: ["(?i)^\\(\\s*([SE]\\d+.*?)\\s*\\)[\\s\\/\\|]*(.+)", "$2 $1"] + details: + selector: a[href^="./viewtopic.php?t="] + attribute: href + download: + selector: a[href^="./dl.php?id="] + attribute: href + size: + selector: a[href^="./dl.php?id="] + seeders: + selector: td.seedmed + leechers: + selector: td.leechmed + grabs: + selector: td:nth-last-child(2) + date: + # 11:51 31-Жов-23 + # Вчора 00:04 3-Лис-23 + # Сьогодні 06:40 4-Лис-23 + selector: td:last-child + filters: + - name: regexp + args: (\d{2}:\d{2}\s\d{1,2}-\D{3}-\d{2}) + - name: re_replace + args: ["\\s", " "] + - name: re_replace + args: ["(?i)Січ", "Jan"] + - name: re_replace + args: ["(?i)Лют", "Feb"] + - name: re_replace + args: ["(?i)Бер", "Mar"] + - name: re_replace + args: ["(?i)Кві", "Apr"] + - name: re_replace + args: ["(?i)Тра", "May"] + - name: re_replace + args: ["(?i)Чер", "Jun"] + - name: re_replace + args: ["(?i)Лип", "Jul"] + - name: re_replace + args: ["(?i)Сер", "Aug"] + - name: re_replace + args: ["(?i)Вер", "Sep"] + - name: re_replace + args: ["(?i)Жов", "Oct"] + - name: re_replace + args: ["(?i)Лис", "Nov"] + - name: re_replace + args: ["(?i)Гру", "Dec"] + - name: append + args: " +02:00" # EET + - name: dateparse + args: "HH:mm d-MMM-yy zzz" + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 + description: + selector: a[href^="./viewtopic.php?t="] +# TorrentPier diff --git a/config/prowlarr/Definitions/mdan.yml b/config/prowlarr/Definitions/mdan.yml new file mode 100644 index 0000000..d5a4eb7 --- /dev/null +++ b/config/prowlarr/Definitions/mdan.yml @@ -0,0 +1,159 @@ +--- +id: mdan +name: MDAN +description: "Mansão dos Animes (MDAN) is a BRAZILIAN Private Torrent Tracker for ANIME" +language: pt-BR +type: private +encoding: UTF-8 +links: + - https://bt.mdan.org/ + +caps: + categorymappings: + - {id: 5, cat: TV/Anime, desc: "Animes Completo"} + - {id: 1, cat: TV/Anime, desc: "Animes Episódios"} + - {id: 2, cat: TV/Anime, desc: "Animes OVAs"} + - {id: 3, cat: Movies, desc: "Filmes"} + - {id: 6, cat: Movies/Other, desc: "Live"} + - {id: 7, cat: Books/Comics, desc: "Mangá"} + - {id: 4, cat: Audio, desc: "OST"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents por página (Torrents per Page): setting to 100 on your Perfil (Profile). The default is 30. + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: :contains("incorret") + test: + path: index.php + selector: a[href^="logout.php?hash_please="] + +search: + paths: + - path: browse.php + inputs: + # note: site uses the catsX[]=nn method which cardigann does not support. + search: "{{ .Keywords }}" + # title, descr, genre, all + searchin: title + # 0 active, 1 incldead, 2 onlydead + incldead: 1 + # 0 no, 1 yes + only_free: "{{ if .Config.freeleech }}1{{else}}{{end}}" + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + + rows: + selector: table[style^="width"] > tbody > tr:has(a[href^="details.php?id="]), table[style^="width"] > tbody > tr[id^="kdescr"] + after: 1 + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + # titles are abbreviated :-( + selector: a[href^="details.php?id="] + details: + selector: a[href^="details.php?id="] + attribute: href + _id: + selector: a[href^="details.php?id="] + attribute: href + filters: + - name: querystring + args: id + download: + text: "download.php?torrent={{ .Result._id }}&ssl=1" + poster: + selector: td:nth-child(9) img + attribute: src + date_day: + # 10:50
Hoje + # 13:15
Ontem + selector: td:nth-child(7):contains("e") + # auto adjusted by site account profile + optional: true + filters: + - name: replace + args: ["Hoje", "Today"] + - name: replace + args: ["Ontem", "Yesterday"] + date_year: + # 18:55
03-05-2023 + selector: td:nth-child(7):not(:contains("e")) + # auto adjusted by site account profile + optional: true + filters: + - name: dateparse + args: "HH:mm dd-MM-yyyy" + date: + text: "{{ if or .Result.date_day .Result.date_year }}{{ or .Result.date_day .Result.date_year }}{{ else }}now{{ end }}" + size: + selector: td:nth-child(6) + files: + selector: td:nth-child(5) + grabs: + selector: td:nth-child(4) + seeders: + selector: a[href$="seeders"] + optional: true + default: 0 + leechers: + selector: a[href$="leechers"] + optional: true + default: 0 + downloadvolumefactor: + case: + img[src="./pic/free.gif"]: 0 + img[src="./pic/silver2.gif"]: 0.5 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 0.4 +# U-232 diff --git a/config/prowlarr/Definitions/megamixtracker.yml b/config/prowlarr/Definitions/megamixtracker.yml new file mode 100644 index 0000000..5d59a02 --- /dev/null +++ b/config/prowlarr/Definitions/megamixtracker.yml @@ -0,0 +1,195 @@ +--- +id: megamixtracker +name: MegamixTracker +description: "MegamixTracker is a HUNGARIAN Private Tracker for MOVIES / TV" +language: hu-HU +type: private +encoding: ISO-8859-2 +links: + - https://megamixtracker.hu/ + +caps: + categorymappings: + - {id: 26, cat: TV/Anime, desc: "Anime/Hu"} + - {id: 27, cat: TV/Anime, desc: "Anime/Eng"} + - {id: 9, cat: Books/EBook, desc: "eBook/Hu"} + - {id: 16, cat: Books/EBook, desc: "eBook/Eng"} + - {id: 38, cat: Movies/BluRay, desc: "Film/BR-BDRIP/Hu"} + - {id: 39, cat: Movies/BluRay, desc: "Film/BR-BDRIP/Eng"} + - {id: 4, cat: Movies/SD, desc: "Film/CAM"} + - {id: 32, cat: Movies/DVD, desc: "Film/DVD9/Hun"} + - {id: 31, cat: Movies/DVD, desc: "Film/DVD9/Eng"} + - {id: 6, cat: Movies/DVD, desc: "Film/DVDR/Hu"} + - {id: 5, cat: Movies/DVD, desc: "Film/DVDR/Eng"} + - {id: 3, cat: Movies/HD, desc: "Film/HD/Hu"} + - {id: 2, cat: Movies/HD, desc: "Film/HD/Eng"} + - {id: 1, cat: Movies/SD, desc: "Film/XviD/Hu"} + - {id: 11, cat: Movies/SD, desc: "Film/XviD/En"} + - {id: 13, cat: Console, desc: "Játék/Konzol"} + - {id: 17, cat: PC/Games, desc: "Játék/PC"} + - {id: 18, cat: PC/Mobile-Other, desc: "Mobiltelefon"} + - {id: 7, cat: PC/0day, desc: "Program/RIP"} + - {id: 24, cat: PC/ISO, desc: "Program/ISO"} + - {id: 34, cat: TV/HD, desc: "Sorozat/HD/Hun"} + - {id: 33, cat: TV/HD, desc: "Sorozat/HD/Eng"} + - {id: 12, cat: TV/SD, desc: "Sorozat/Xvid/Hun"} + - {id: 28, cat: TV/SD, desc: "Sorozat/Xvid/Eng"} + - {id: 14, cat: Other, desc: "Vegyes"} + - {id: 30, cat: XXX/DVD, desc: "XXX/DVD"} + - {id: 29, cat: XXX/x264, desc: "XXX/HD"} + - {id: 20, cat: XXX/ImageSet, desc: "XXX/Kép"} + - {id: 15, cat: XXX/XviD, desc: "XXX/Xvid"} + - {id: 19, cat: Audio/Video, desc: "Zene/Klipp"} + - {id: 35, cat: Audio/MP3, desc: "Zene/Mp3/Hun"} + - {id: 8, cat: Audio/MP3, desc: "Zene/Mp3/Külföldi"} + - {id: 40, cat: Audio/Other, desc: "Zene/Podcast"} + - {id: 83, cat: Movies/HD, desc: "Unknown"} # category has no name and is not listed + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + book-search: [q] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 1: title + 4: added + 5: size + 7: seeders + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrentek száma egy oldalon: setting to 100 on your account profile. + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + biztonsagos: yes + selectorinputs: + csrf: + selector: input[name="csrf"] + attribute: value + error: + - selector: div.div_tartalom:contains("Sikertelen bejelentkezés") + test: + path: index.php + selector: a[href^="logout.php?hash="] + +search: + paths: + - path: browse2.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 active, 1 all, 2 deadonly + miben: 1 + # nincs_megadva, elfogadva, hibas, nincs + moderalas: nincs_megadva + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + # site does not support imdbid searching + + rows: + selector: "tr.tbody:has(a[href^=\"download.php?id=\"]){{ if .Config.freeleech }}:has(img[src=\"kepek/ikon_free.png\"]){{ else }}{{ end }}" + filters: + - name: andmatch + + fields: + category: + selector: a[href^="browse2.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href*="klappe("] + _id: + selector: a[href*="klappe("] + attribute: href + filters: + - name: regexp + args: (\d+) + details: + text: "details.php?id={{ .Result._id }}" + poster: + selector: img[border][onmouseover] + attribute: onmouseover + filters: + - name: regexp + args: "src=(.*?) " + description_text: + selector: i + description: + case: + img[src$="/ikon_helyes.png"]: "Verified: {{ .Result.description_text }}" + img[src$="/ikon_ellenorizetlen.png"]: "Unverified: {{ .Result.description_text }}" + download: + selector: a[href^="download.php?id="] + attribute: href + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + date: + # 2021-11-10 09:31:58 (17 órája és 44 perce) + selector: span.feltoltve-ezelott + filters: + - name: regexp + args: "(\\d{4}-\\d{2}-\\d{2}\\s\\d{2}:\\d{2}:\\d{2})" + - name: append + args: " +01:00" # CET + - name: replace + args: ["\xA0", " "] + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + size: + selector: td:nth-last-child(4) + seeders: + selector: td:nth-last-child(3) + leechers: + selector: td:nth-last-child(2) + grabs: + selector: td:last-child + downloadvolumefactor: + case: + img[src="kepek/ikon_free.png"]: 0 + "*": 1 + uploadvolumefactor: + case: + "font[onMouseover]:contains(\"2x\")": 2 + "font[onMouseover]:contains(\"4x\")": 4 + "*": 1 + minimumratio: + case: + img[src="kepek/ikon_free.png"]: 100 # dummy MR to ensure MST is met + "*": 1.0 + minimumseedtime: + case: + img[src="kepek/ikon_free.png"]: 604800 # 7d + "*": 1209600 # 14d +# TBDEV custom v2.0 diff --git a/config/prowlarr/Definitions/megapeer.yml b/config/prowlarr/Definitions/megapeer.yml new file mode 100644 index 0000000..d02e098 --- /dev/null +++ b/config/prowlarr/Definitions/megapeer.yml @@ -0,0 +1,220 @@ +--- +id: megapeer +name: MegaPeer +description: "MegaPeer is a RUSSIAN Public Torrent Tracker for MOVIES / TV" +language: ru-RU +type: public +encoding: windows-1251 +links: + - https://megapeer.vip/ +legacylinks: + - http://megapeer.ru/ # https is not supported + - http://alt.megapeer.ru/ + +caps: + categorymappings: + - {id: 79, cat: Movies, desc: "Наши фильмы (Russian Movies)"} + - {id: 5, cat: TV, desc: "Наши сериалы (Russian Series)"} + - {id: 174, cat: Movies/Foreign, desc: "Зарубежные фильмы (Foreign Movies)"} + - {id: 6, cat: TV/Foreign, desc: "Зарубежные сериалы (Foreign Series)"} + - {id: 76, cat: TV/Anime, desc: "Мультипликация (Animation)"} + - {id: 89, cat: Audio/Video, desc: "Концерты / Клипы (Concerts / Clips)"} + - {id: 57, cat: TV, desc: "Телепередачи / Шоу / Юмор (TV)"} + - {id: 145, cat: TV/Other, desc: "Обучающее видео (Instructional Video)"} + - {id: 55, cat: TV/Documentary, desc: "Документалистика (Documentary)"} + - {id: 164, cat: TV/Other, desc: "Прочее (Other)"} + - {id: 21, cat: TV/Sport, desc: "Спорт (Sport)"} + - {id: 94, cat: Audio, desc: "Музыка (Music)"} + - {id: 28, cat: Console, desc: "Игры (Games)"} + - {id: 107, cat: PC/0day, desc: "Софт / ОС / Оформление (Software)"} + - {id: 41, cat: PC/Mobile-Other, desc: "Мобильные устройства (Mobile)"} + - {id: 52, cat: Books, desc: "Книги / Журналы (Books)"} + - {id: 169, cat: Other/Misc, desc: "Разное (Misc)"} + - {id: 178, cat: Other, desc: "Страницы (Pages)"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: stripcyrillic + type: checkbox + label: Strip Cyrillic Letters + default: false + - name: addrussiantotitle + type: checkbox + label: Add RUS to end of all titles to improve language detection by Sonarr and Radarr. Will cause English-only results to be misidentified. + default: false + - name: sort + type: select + label: Sort requested from site + default: 0 + options: + 0: created + 1: title + 2: size + - name: type + type: select + label: Order requested from site + default: 0 + options: + 0: desc + 1: asc + +search: + # https://megapeer.vip/browse.php?search=%25%25&age=&cat=0&stype=0&sort=0&ascdesc=0 + paths: + - path: browse.php + inputs: + search: "{{ if .Keywords }}{{ .Keywords }}{{ else }}{{ .Today.Year }}{{ end }}" + # does not support multi category searches + cat: 0 + # 0 title, 1 descr, 2 phrase, 3 infohash + stype: 0 + sort: "{{ .Config.sort }}" + ascdesc: "{{ .Config.type }}" + + headers: + # prevent redirect + Referer: ["{{ .Config.sitelink }}browse.php"] + + keywordsfilters: + - name: re_replace # S01 to сезон 1 + args: ["(?i)\\bS0*(\\d+)\\b", "сезон $1"] + - name: re_replace # E02 to сери 1 + args: ["(?i)\\bE0*(\\d+)\\b", "сери $1"] + - name: re_replace # S01E02 to сезон 1 сери 2 + args: ["(?i)\\bS0*(\\d+)E0*(\\d+)\\b", "сезон $1 сери $2"] + # prepend % to each word - allow 1 character keywords + - name: re_replace + args: ["(\\w+)", "%$1"] + + rows: + selector: table#tor-tbl > tbody > tr.hl-tr + + fields: + category: + selector: a[href^="/cat/"] + attribute: href + filters: + - name: regexp + args: (\d+) + title: + selector: a.tLink + filters: + # normalize to SXXEYY format + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)\\s*(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)", "S$1E$2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?)", "S$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+[CС]езоны?", "S$1"] + - name: re_replace + args: ["(?i)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)", "E$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "E$1"] + - name: re_replace + args: ["(?i)\\bFiles-х\\b", "Files-x"] + - name: re_replace + args: ["(?i)\\sот\\s([\\w\\p{P}\\p{S}]+)$", "-$1"] + - name: re_replace + args: ["\\s\\|\\s(\\w{4,})$", "-$1"] + - name: re_replace + args: ["(\\([\\p{IsCyrillic}\\W]+\\))|(^[\\p{IsCyrillic}\\W\\d]+\\/ )|([\\p{IsCyrillic} \\-]+,+)|([\\p{IsCyrillic}]+)", "{{ if .Config.stripcyrillic }}{{ else }}$1$2$3$4{{ end }}"] + - name: re_replace + args: ["(?i)\\bHDTV[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bSAT[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bWEB[-\\s]?DL[-\\s]?Rip\\b", "WEB-DL"] + - name: re_replace + args: ["(?i)\\bWEB\\sRip\\b", "WEBRip"] + - name: re_replace + args: ["(?i)\\bWEB\\sDL\\b", "WEB-DL"] + - name: re_replace + args: ["[\\[\\(\\{<«][\\s\\W]*[\\]\\)\\}>»]", ""] + - name: re_replace + args: ["^[\\s&,\\.!\\?\\+\\-_\\|\\/':]+", ""] + - name: append + args: "{{ if .Config.addrussiantotitle }} RUS{{ else }}{{ end }}" + details: + selector: a.tLink + attribute: href + download: + selector: a.tr-dl + attribute: href + poster: + selector: img.tor-icon + attribute: src + size: + selector: a.tr-dl + seeders: + selector: span.seedmed + leechers: + text: 1 + date: + # Добавлен: 5 октября 2021 в 06:56:08 + selector: p + filters: + - name: replace + args: ["Добавлен: ", ""] + - name: replace + args: [" в ", " "] + - name: replace + args: ["января", "January"] + - name: replace + args: ["февраля", "February"] + - name: replace + args: ["марта", "March"] + - name: replace + args: ["апреля", "April"] + - name: replace + args: ["мая", "May"] + - name: replace + args: ["июня", "June"] + - name: replace + args: ["июля", "July"] + - name: replace + args: ["августа", "August"] + - name: replace + args: ["сентября", "September"] + - name: replace + args: ["октября", "October"] + - name: replace + args: ["ноября", "November"] + - name: replace + args: ["декабря", "December"] + - name: append + args: " +03:00" # MSK + - name: dateparse + args: "d MMMM yyyy HH:mm:ss zzz" + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 + description: + selector: a.tLink +# engine n/a diff --git a/config/prowlarr/Definitions/mesevilag.yml b/config/prowlarr/Definitions/mesevilag.yml new file mode 100644 index 0000000..962b001 --- /dev/null +++ b/config/prowlarr/Definitions/mesevilag.yml @@ -0,0 +1,176 @@ +--- +id: mesevilag +name: MeseVilág +description: "MeseVilág (Fairytale World) is a Hungarian Private site for fairy tales, family movies and comedies" +language: hu-HU +type: private +encoding: UTF-8 +links: + - https://mese-vilag.net/ + +caps: + categorymappings: + - {id: 1, cat: TV/Anime, desc: "Anime/Cam"} + - {id: 2, cat: TV/Anime, desc: "Anime/Eng"} + - {id: 21, cat: TV/Anime, desc: "Anime/HD"} + - {id: 3, cat: TV/Anime, desc: "Anime/Hun"} + - {id: 13, cat: TV/Anime, desc: "Anime/Sorozat(Series)"} + - {id: 4, cat: Movies, desc: "Családi/Cam(Family)"} + - {id: 5, cat: Movies, desc: "Családi/Eng(Family)"} + - {id: 19, cat: Movies/HD, desc: "Családi/HD(Family)"} + - {id: 6, cat: Movies, desc: "Családi/Hun(Family)"} + - {id: 17, cat: Movies, desc: "Családi/Romantikus/Cam(Family Romantic)"} + - {id: 16, cat: Movies, desc: "Családi/Romantikus/Eng(Family Romantic)"} + - {id: 15, cat: Movies, desc: "Családi/Romantikus/Hun(Family Romantic)"} + - {id: 18, cat: TV, desc: "Családi/Romantikus/Sorozat(Family Romantic Series)"} + - {id: 14, cat: TV, desc: "Családi/Sorozat(Family Series)"} + - {id: 8, cat: Audio/Audiobook, desc: "Hangoskönyv(Audiobooks)"} + - {id: 9, cat: PC/Games, desc: "Játék/ISO(Games)"} + - {id: 11, cat: Console, desc: "Játék/Konzol(Console)"} + - {id: 10, cat: PC/Games, desc: "Játék/RIP(Games)"} + - {id: 7, cat: Books, desc: "Könyv(Books)"} + - {id: 20, cat: Movies/HD, desc: "Romantikus/HD(Romantic)"} + - {id: 12, cat: Audio, desc: "Zene/Hun(Music)"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form#loginForm + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + # error: using some kind of JS popup that can not be trapped :-( + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: letoltes.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 active, 1 all, 2 dead, 3 freeleech, 4 2x, 5 mesevilag releases, 6 mytorrents, 7 bybookmarks + incldead: "{{ if .Config.freeleech }}3{{ else }}1{{ end }}" + # 0 name, 1 descr, 2 both + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + # does not support imdbid search + keywordsfilters: + - name: re_replace # replace special characters with "%" (wildcard) + args: ["[^a-zA-Z0-9]+", "%"] + + rows: + selector: table[cellpadding="5"] > tbody > tr:has(a[onmouseover]) + + fields: + category: + selector: a[href^="letoltes.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="javascript:"] + attribute: title + details: + selector: span + attribute: id + filters: + - name: replace + args: ["span_bookmark_", "details.php?id="] + download: + selector: span + attribute: id + filters: + - name: replace + args: ["span_bookmark_", "download.php?id="] + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + poster: + selector: a[onmouseover] + attribute: onmouseover + filters: + - name: regexp + args: "src=(.+?) " + date: + selector: td:nth-last-child(6) + filters: + - name: regexp + args: (\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}) + - name: replace + args: ["\xA0", " "] + - name: append + args: " +01:00" # CET + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + seeders: + selector: td:nth-last-child(4) + leechers: + selector: td:nth-last-child(3) + grabs: + selector: td:nth-last-child(2) + description: + case: + img[src="pic/yes.png"]: Verified + img[src="pic/nincs.png"]: Unverified + downloadvolumefactor: + selector: td:nth-last-child(5) > font + case: + "font:contains(\"x0\")": 0 + "*": 1 + uploadvolumefactor: + selector: td:nth-last-child(5) > font + case: + "font:contains(\"x2\")": 2 + "font:contains(\"x3\")": 3 + "font:contains(\"x4\")": 4 + "*": 1 + size: + selector: td:nth-last-child(5) + remove: font + minimumratio: + text: 1.0 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# engine n/a diff --git a/config/prowlarr/Definitions/metalguru.yml b/config/prowlarr/Definitions/metalguru.yml new file mode 100644 index 0000000..2b21ca0 --- /dev/null +++ b/config/prowlarr/Definitions/metalguru.yml @@ -0,0 +1,171 @@ +--- +id: metalguru +name: MetalGuru +description: "MetalGuru is a Private Torrent Tracker for General with focus on Music" +language: en-US +type: private +encoding: UTF-8 +links: + - https://metalguru.me/ + +caps: + categorymappings: + - {id: 51, cat: Audio/Lossless, desc: "24bit"} + - {id: 58, cat: TV/Anime, desc: "Anime"} + - {id: 39, cat: PC/Mobile-Other, desc: "Anything Mobile"} + - {id: 1, cat: PC, desc: "Applications"} + - {id: 2, cat: Books, desc: "Books Ebooks & mags"} + - {id: 59, cat: Movies/SD, desc: "Cams"} + - {id: 52, cat: Audio, desc: "DJ"} + - {id: 53, cat: Audio, desc: "DJ PACKS"} + - {id: 46, cat: Books, desc: "Documents"} + - {id: 47, cat: Audio/Lossless, desc: "Flac/HD Audio"} + - {id: 61, cat: Console, desc: "Games"} + - {id: 62, cat: Audio, desc: "Karaoke"} + - {id: 45, cat: Other, desc: "Misc"} + - {id: 57, cat: Movies, desc: "Movie Packs"} + - {id: 10, cat: Movies, desc: "Movies"} + - {id: 50, cat: Audio, desc: "MQA"} + - {id: 29, cat: Audio, desc: "Music"} + - {id: 31, cat: Audio/Video, desc: "Music| Movie/Videos"} + - {id: 32, cat: Audio, desc: "Music| Packs"} + - {id: 60, cat: TV, desc: "Toons"} + - {id: 54, cat: TV, desc: "TV"} + - {id: 63, cat: TV, desc: "TV Packs"} + - {id: 56, cat: XXX, desc: "XXX"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + use_ssl: 1 + submitme: X + error: + - selector: h2:contains("failed") + message: + selector: td.colhead2 + test: + path: browse.php + selector: a[href*="logout.php?hash_please="] + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }} {{ else }}{{ end }}{{ .Keywords }}" + # title, descr, genre, all + searchin: "{{ if .Query.IMDBID }}descr{{else}}title{{ end }}" + # 0 active, 1 incldead, 2 onlydead + incldead: 1 + # 0 no, 1 yes + only_free: "{{ if .Config.freeleech }}1{{else}}0{{end}}" + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + # no imdbid in results + + rows: + selector: table.table-bordered > tbody > tr:has(a[href^="details.php?id="]) +# filters: +# - name: andmatch + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?torrent="] + attribute: href + poster: + selector: a[href^="details.php?id="][onmouseover] + attribute: onmouseover + filters: + # onmouseover="Tip('10:20 AM + # Yesterday
08:03 PM + selector: td:nth-child(7):contains("day") + # auto adjusted by site account profile + optional: true + date_year: + # Feb 14 2019
10:20 AM + selector: td:nth-child(7):not(:contains("day")) + # auto adjusted by site account profile + optional: true + filters: + - name: dateparse + args: "MMM d yyyy hh:mm tt" + date: + text: "{{ if or .Result.date_day .Result.date_year }}{{ or .Result.date_day .Result.date_year }}{{ else }}now{{ end }}" + size: + selector: td:nth-child(8) + grabs: + selector: td:nth-child(9) + seeders: + text: 1 + leechers: + text: 1 + downloadvolumefactor: + case: + a.infofree: 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 48h freeleech (as seconds = 48 x 60 x 60) + # 36h notfree (as seconds = 36 x 60 x 60) + case: + a.infofree: 172800 + "*": 129600 +# U-232 v5 diff --git a/config/prowlarr/Definitions/metaltracker.yml b/config/prowlarr/Definitions/metaltracker.yml new file mode 100644 index 0000000..270e799 --- /dev/null +++ b/config/prowlarr/Definitions/metaltracker.yml @@ -0,0 +1,110 @@ +--- +id: metaltracker +name: Metal Tracker +description: "Metal Tracker is a Semi-Private site dedicated to HEAVY METAL MUSIC. This definition is for the English site." +language: en-US +type: semi-private +encoding: UTF-8 +links: + - https://en.metal-tracker.com/ +legacylinks: + - http://en.metal-tracker.com/ + +caps: + categorymappings: + - {id: Books, cat: Audio/Audiobook, desc: Books} + - {id: Video, cat: Audio/Video, desc: Videos} + - {id: Music, cat: Audio/MP3, desc: Music} + + modes: + search: [q] + music-search: [q, album, artist] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: sort + type: select + label: Sort requested from site + default: date + options: + date: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: DESC + options: + DESC: desc + ASC: asc + +login: + path: user/login.html + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + go: Enter + error: + - selector: div.errorSummary + message: + selector: div.errorSummary ul li + test: + path: torrents/search.html + selector: li li:has(a[href="/user/logout.html"]) + +search: + paths: + - path: torrents/search.html + method: post + inputs: + "SearchTorrentsForm[nameTorrent]": "{{ if or (.Query.Artist) (.Query.Album) }}{{ or (.Query.Artist) (.Query.Album) }}{{ else }}{{ .Keywords }}{{ end }}" + "SearchTorrentsForm[sort]": "{{ .Config.sort }}" + "SearchTorrentsForm[sortType]": "{{ .Config.type }}" + go-search: Search + + rows: + selector: .smallalbum + + fields: + title: + selector: a h3 + poster: + selector: .thumb a img + attribute: src + details: + selector: .thumb a + attribute: href + download: + selector: .center a[href^="/torrents/download/id/"] + attribute: href + date: + text: now + seeders: + selector: .center font:nth-of-type(1) + leechers: + selector: .center font:nth-of-type(2) + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 + category: + selector: .smallalbum + remove: div.thumb, div.center, a + case: + ":contains(\"Type: Music\")": Music + ":contains(\"Type: Video\")": Video + ":contains(\"Type: Books\")": Books + size: + selector: .smallalbum + filters: + - name: regexp + args: "Size:\\s+([\\w\\d\\.,]+ \\w\\w)" +# engine n/a diff --git a/config/prowlarr/Definitions/mikan.yml b/config/prowlarr/Definitions/mikan.yml new file mode 100644 index 0000000..2fa1688 --- /dev/null +++ b/config/prowlarr/Definitions/mikan.yml @@ -0,0 +1,72 @@ +--- +id: mikan +name: Mikan +description: "Mikan is a CHINESE Public torrent tracker for ANIME" +language: zh-CN +type: public +encoding: UTF-8 +links: + - https://mikanani.me/ + +caps: + categorymappings: + - {id: 1, cat: TV/Anime, desc: "Anime"} + + modes: + search: [q] + tv-search: [q, season, ep] + +settings: [] + +search: + paths: + # https://mikanani.me/Home/Search?searchstr=%E5%90%8D%E4%BE%A6%E6%8E%A2%E6%9F%AF%E5%8D%97 + - path: "Home/{{ if .Keywords }}Search?searchstr={{ .Keywords }}{{ else }}Classic{{ end }}" + + rows: + selector: table.table-striped tbody tr + + fields: + category: + text: 1 + title: + selector: a[href^="/Home/Episode/"] + details: + selector: a[href^="/Home/Episode/"] + attribute: href + download: + selector: a[href^="/Download/"] + attribute: href + magnet: + selector: a[data-clipboard-text] + attribute: data-clipboard-text + date_day: + selector: td:nth-child(1):contains("今天"), td:nth-child(1):contains("昨天") + optional: true + filters: + - name: replace + args: ["昨天", "Yesterday"] + - name: replace + args: ["今天", "Today"] + - name: fuzzytime + date_year: + selector: td:nth-child(3):not(:has(a)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy/MM/dd HH:mm zzz" + date: + text: "{{ if or .Result.date_year .Result.date_day }}{{ or .Result.date_year .Result.date_day }}{{ else }}now{{ end }}" + size: + selector: td:has(a[data-clipboard-text]) ~ td + seeders: + text: 1 + leechers: + text: 1 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# Engine n/a diff --git a/config/prowlarr/Definitions/milkie.yml b/config/prowlarr/Definitions/milkie.yml new file mode 100644 index 0000000..ea6f1c0 --- /dev/null +++ b/config/prowlarr/Definitions/milkie.yml @@ -0,0 +1,90 @@ +--- +id: milkie +name: Milkie +description: "Milkie.cc (ME) is private torrent tracker for 0day / general" +language: en-US +type: private +encoding: UTF-8 +links: + - https://milkie.cc/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: Movies} + - {id: 2, cat: TV, desc: TV} + - {id: 3, cat: Audio, desc: Music} + - {id: 4, cat: PC/Games, desc: Games} + - {id: 5, cat: Books, desc: Ebook} + - {id: 6, cat: PC, desc: Apps} + - {id: 7, cat: XXX, desc: Adult} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new key here." + +search: + headers: + x-milkie-auth: ["{{ .Config.apikey }}"] + + paths: + - path: api/v1/torrents + response: + type: json + + inputs: + ps: 100 + query: "{{ .Keywords }}" + categories: "{{ join .Categories \",\" }}" + + rows: + selector: torrents + count: + selector: hits + + fields: + _id: + selector: id + category: + selector: category + title: + selector: releaseName + details: + text: "/browse/{{ .Result._id }}" + _apikey: + text: "{{ .Config.apikey }}" + filters: + - name: urlencode + download: + text: "/api/v1/torrents/{{ .Result._id }}/torrent?key={{ .Result._apikey }}" + date: + selector: createdAt + size: + selector: size + grabs: + selector: downloaded + seeders: + selector: seeders + leechers: + selector: leechers + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# json api v1 diff --git a/config/prowlarr/Definitions/miobt.yml b/config/prowlarr/Definitions/miobt.yml new file mode 100644 index 0000000..ef89149 --- /dev/null +++ b/config/prowlarr/Definitions/miobt.yml @@ -0,0 +1,95 @@ +--- +id: miobt +name: MioBT +description: "MioBT is a CHINESE Public torrent index" +language: zh-CN +type: public +encoding: UTF-8 +links: + - https://miobt.com/ + - https://kisssub.org/ + +caps: + categorymappings: + - {id: 动画, cat: TV/Anime, desc: 动画 (Animation Series and Movies)} + - {id: 漫画, cat: Books/Comics, desc: 漫画 (Comics and Manga)} + - {id: 音乐, cat: Audio, desc: 音乐 (Music OST and Singles)} + - {id: 周边, cat: TV/Other, desc: 周边 (Live Action)} + - {id: 其它, cat: TV/Anime, desc: 其它 (Other)} + - {id: Raw, cat: TV/Anime, desc: Raw} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: [] + +search: + paths: + # https://miobt.com/search.php?keyword=moon+720p + - path: "{{ if .Keywords }}search.php?keyword={{ .Keywords }}{{ else }}{{ end }}" + + rows: + selector: table[id="listTable"] > tbody > tr:has( a[href^="show-"]) + + fields: + category: + selector: a[href^="sort-"] + title: + selector: a[href^="show-"] + details: + selector: a[href^="show-"] + attribute: href + infohash: + selector: a[href^="show-"] + attribute: href + filters: + - name: regexp + args: show-([0-9A-Fa-f]{40}) + date_today: + # 今天 00:35 (Today) + optional: true + selector: td:nth-child(1):contains("今天") + filters: + - name: replace + args: ["今天", "Today"] + - name: append + args: " +08:00" # CST + - name: fuzzytime + date_yday: + # 昨天 22:50 (Yesterday) + optional: true + selector: td:nth-child(1):contains("昨天") + filters: + - name: replace + args: ["昨天", "Yesterday"] + - name: append + args: " +08:00" # CST + - name: fuzzytime + date_year: + # 2020/12/24 + optional: true + selector: td:nth-child(1):not(:contains("昨天")):not(:contains("今天")) + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy/MM/dd zzz" + date: + text: "{{ if or .Result.date_year .Result.date_today .Result.date_yday }}{{ or .Result.date_year .Result.date_today .Result.date_yday }}{{ else }}now{{ end }}" + size: + selector: td:nth-child(4) + seeders: + selector: td:nth-child(5) + leechers: + selector: td:nth-child(6) + grabs: + selector: td:nth-child(7) + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine MioBT diff --git a/config/prowlarr/Definitions/mircrew.yml b/config/prowlarr/Definitions/mircrew.yml new file mode 100644 index 0000000..26e811f --- /dev/null +++ b/config/prowlarr/Definitions/mircrew.yml @@ -0,0 +1,183 @@ +--- +id: mircrew +name: MIRCrew +description: "MIRCrew is an ITALIAN Semi-Private Torrent Tracker for MOVIES / TV / GENERAL" +language: it-IT +type: semi-private +encoding: UTF-8 +links: + - https://mircrew-releases.org/ + +caps: + # commented out categories are discussion-only forums + categorymappings: + # - {id: 1, cat: Other, desc: "MIRCrew Sharing Community"} + # - {id: 2, cat: Other, desc: "Piazza Grande"} + # - {id: 4, cat: Other, desc: "PG Statuto & Regole"} + # - {id: 5, cat: Other, desc: "PG Info Point"} + # - {id: 6, cat: Other, desc: "PG Presentazioni"} + # - {id: 7, cat: Other, desc: "PG Off Topic"} + # - {id: 49, cat: Other, desc: "PG Segnalazioni allo Staff"} + # - {id: 3, cat: Other, desc: "Comunicazioni, Annunci & Guide"} + # - {id: 8, cat: Other, desc: "CAG Comunicazioni da MIRCrew"} + # - {id: 9, cat: Other, desc: "CAG Guide & Tutorial"} + # - {id: 11, cat: Other, desc: "Progetti & Collezioni"} + # - {id: 12, cat: Other, desc: "P&C Pir8 Channel"} + # - {id: 13, cat: Other, desc: "P&C Progetti"} + # - {id: 61, cat: Other, desc: "P&C Video"} + # - {id: 62, cat: Other, desc: "P&C Animazione"} + # - {id: 63, cat: Other, desc: "P&C Libreria"} + # - {id: 64, cat: Other, desc: "P&C Musica"} + # - {id: 14, cat: Other, desc: "P&C Collezioni"} + # - {id: 50, cat: Other, desc: "P&C Proposte & Richieste"} + # - {id: 60, cat: Other, desc: "P&C Abbandonati"} + # - {id: 15, cat: Other, desc: "Area Grafica"} + # - {id: 16, cat: Other, desc: "AG Vetrina MIRCrew"} + # - {id: 17, cat: Other, desc: "AG Vetrina Utenti"} + # - {id: 18, cat: Other, desc: "AG Richieste Grafica"} + # - {id: 19, cat: Other, desc: "Area Staff"} + # - {id: 20, cat: Other, desc: "AS Membri MIRCrew"} + # - {id: 21, cat: Other, desc: "AS Reclutamento MIRCrew"} + # - {id: 23, cat: Other, desc: "AS Archivio"} + - {id: 25, cat: Movies, desc: "Video Releases", default: true} + - {id: 26, cat: Movies, desc: "Releases Film", default: true} + # - {id: 28, cat: TV, desc: "Releases Serie TV"} + - {id: 51, cat: TV, desc: "Releases TV Stagioni in corso", default: true} + - {id: 52, cat: TV, desc: "Releases TV Stagioni complete", default: true} + - {id: 29, cat: TV/Documentary, desc: "Documentari", default: true} + - {id: 30, cat: TV, desc: "TV Show", default: true} + - {id: 31, cat: TV, desc: "Teatro", default: true} + # - {id: 32, cat: Movies, desc: "Richieste Video"} + # - {id: 53, cat: Movies, desc: "Richieste Film"} + # - {id: 54, cat: TV, desc: "Richieste Serie TV"} + # - {id: 55, cat: Movies, desc: "Richieste Video diverse"} + # - {id: 57, cat: Movies, desc: "Richieste Video Soddisfatte"} + - {id: 33, cat: TV/Anime, desc: "Animazione Releases", default: true} + - {id: 34, cat: Movies/Other, desc: "Anime - Movies", default: true} + - {id: 35, cat: TV/Anime, desc: "Anime - Serie", default: true} + - {id: 36, cat: Movies/Other, desc: "Cartoon - Movies", default: true} + - {id: 37, cat: TV/Anime, desc: "Cartoon - Serie", default: true} + # - {id: 38, cat: TV/Anime, desc: "Richieste Animazione", default: true} + # - {id: 58, cat: TV/Anime, desc: "Richieste Animazione Soddisfatte", default: true} + - {id: 39, cat: Books, desc: "Libreria Releases", default: true} + - {id: 40, cat: Books/EBook, desc: "E-Books", default: true} + - {id: 41, cat: Audio/Audiobook, desc: "A-Books", default: true} + - {id: 42, cat: Books/Comics, desc: "Comics", default: true} + - {id: 43, cat: Books/Mags, desc: "Edicola", default: true} + # - {id: 44, cat: Books, desc: "Richieste Libreria"} + # - {id: 59, cat: Books, desc: "Richieste Libreria Soddisfatte"} + - {id: 45, cat: Audio, desc: "Music Releases", default: true} + - {id: 46, cat: Audio, desc: "Musica - Audio", default: true} + - {id: 47, cat: Audio/Video, desc: "Musica - Video", default: true} + # - {id: 48, cat: Audio, desc: "Richieste Musica"} + # - {id: 56, cat: Audio, desc: "Richieste Musica Soddisfatte"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +login: + path: ucp.php?mode=login + method: form + form: form#login + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + autologin: on + viewonline: on + error: + - selector: div.error + test: + path: index.php + selector: a[href^="./ucp.php?mode=logout&sid="] + +download: + before: + # thankyou link: ./viewtopic.php?f=52&p=65417&thanks=65417&to_id=54&from_id=3950 + pathselector: + selector: ul.post-buttons li:nth-last-child(1) a + attribute: href + selectors: + - selector: a[href^="magnet:?xt="] + attribute: href + +search: + paths: + - path: search.php + keywordsfilters: + # strip season and/or ep + - name: re_replace + args: ["\\b(?:[SE]\\d{1,4}){1,2}\\b", ""] + - name: re_replace + args: ["(\\w+)", "+$1"] # prepend + to each word + inputs: + keywords: "{{ if .Keywords }}{{ .Keywords }}{{ else }}{{ .Today.Year }}{{ end }}" + # all, any + terms: all + # Search in subforums: yes 1, no 0 + sc: 0 + # Search For: all, msgonly, titleonly, firstpost + sf: titleonly + # Show Results as: posts, topics + sr: topics + # sort: a author, t post time, f forum, i title, s post subject + sk: t + # order: a ascending, d descending + sd: d + # Seach Posts For: all 0, 1day 1, week 7, fortnight 14, month 30, 3months 90, 6 months 180, year 365 + st: 0 + # Show first: all -1, 0, 25, 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000 + ch: 300 + # hidden + t: 0 + # hidden + submit: Cerca + $raw: "{{ range .Categories }}&fid[]={{.}}{{end}}" + + rows: + selector: li.row + + fields: + category: + selector: a[href^="./viewforum.php?f="] + attribute: href + filters: + - name: querystring + args: f + title: + selector: a.topictitle + filters: + # normalize Stagione xx to Sxx format + - name: re_replace + args: ["(?i)\\bStagion[ei] (\\d{1,3}(?:-\\d{1,3})?)\\b\\s*(.+?)\\s*(?:\\[IN CORSO\\])?\\s*\\[(\\d{1,3}(?:-\\d{1,3})?)\\/(\\d{1,3})\\]", "S$1E$3 of $4 $2"] + - name: re_replace + args: ["(?i)\\bStagion[ei] (\\d{1,3}(?:-\\d{1,3})?)\\b\\s*(.+?)\\s*(?:\\[IN CORSO\\])?\\s*\\[(\\d{1,3}(?:-\\d{1,3})?)\\]", "S$1E$3 $2"] + - name: re_replace + args: ["(?i)\\bStagion[ei] (\\d{1,3}(?:-\\d{1,3})?)\\b", "S$1"] + - name: re_replace + args: ["(?i)\\s*(?:\\[IN CORSO\\])?\\s*\\[(\\d{1,3}(?:-\\d{1,3})?)\\/(\\d{1,3})\\]", " E$1 of $2"] + details: + selector: a.topictitle + attribute: href + download: + selector: a.topictitle + attribute: href + size: + text: "512 MB" + seeders: + text: 1 + leechers: + text: 1 + date: + selector: time[datetime] + attribute: datetime + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 + description: + selector: a.topictitle +# phpBB diff --git a/config/prowlarr/Definitions/mixtapetorrent.yml b/config/prowlarr/Definitions/mixtapetorrent.yml new file mode 100644 index 0000000..169166d --- /dev/null +++ b/config/prowlarr/Definitions/mixtapetorrent.yml @@ -0,0 +1,70 @@ +--- +id: mixtapetorrent +name: MixtapeTorrent +description: "MixtapeTorrent is a Public Music site for MixTapes" +language: en-US +type: public +encoding: UTF-8 +links: + - http://www.mixtapetorrent.com/ # does not support https NET::ERR_CERT_AUTHORITY_INVALID + +caps: + categories: + # while the site has categories for searching, it does not include them in the results. + 1: Audio + + modes: + search: [q] + music-search: [q] + +settings: [] + +download: + selectors: + - selector: table#attachments > tbody > tr.odd > td > a + attribute: href + +search: + paths: + # http://www.mixtapetorrent.com/search/node/2020+type:story + - path: "search/node/{{ if .Keywords }}{{ .Keywords }}{{ else }}2020{{ end }} type:story" + + rows: + selector: dl.search-results > dt, dl.search-results > dd + after: 1 + filters: + - name: andmatch + + fields: + category: + text: 1 + title: + selector: a + details: + selector: a + attribute: href + download: + selector: a + attribute: href + description: + selector: p + date: + selector: p.search-info + filters: + - name: regexp + args: "(\\w{3} \\d{1,2} \\d{4} - \\d{1,2}:\\d{2}[a|p]m)" + - name: append + args: " -07:00" # PDT + - name: dateparse + args: "MMM d yyyy - h:mmtt zzz" + size: + text: "128 MB" + seeders: + text: 1 + leechers: + text: 1 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/mma-torrents.yml b/config/prowlarr/Definitions/mma-torrents.yml new file mode 100644 index 0000000..7dc80f1 --- /dev/null +++ b/config/prowlarr/Definitions/mma-torrents.yml @@ -0,0 +1,170 @@ +--- +id: mma-torrents +name: MMA-torrents +description: "MMA-Torrents is a Private Torrent Tracker for MMA (Mixed Martial Arts)" +language: en-US +type: private +encoding: UTF-8 +links: + - https://mma-torrents.com/ + +caps: + categorymappings: + - {id: 92, cat: Audio/Other, desc: "Audio - Podcast"} + - {id: 128, cat: TV/Sport, desc: "Boxing - Bare Knuckle"} + - {id: 105, cat: TV/Sport, desc: "Boxing - HD"} + - {id: 71, cat: TV/Sport, desc: "Boxing - SD"} + - {id: 86, cat: TV/Documentary, desc: "Documentary - All"} + - {id: 109, cat: TV/Sport, desc: "Events - Bellator/HD"} + - {id: 89, cat: TV/Sport, desc: "Events - Bellator/SD"} + - {id: 131, cat: TV/Sport, desc: "Events - Cage Warriors"} + - {id: 132, cat: TV/Sport, desc: "Events - Invicta FC"} + - {id: 130, cat: TV/Sport, desc: "Events - KOTC"} + - {id: 90, cat: TV/Sport, desc: "Events - M-1"} + - {id: 120, cat: TV/Sport, desc: "Events - MMA/Brazil"} + - {id: 70, cat: TV/Sport, desc: "Events - MMA/Other/HD"} + - {id: 47, cat: TV/Sport, desc: "Events - MMA/Other/SD"} + - {id: 129, cat: TV/Sport, desc: "Events - ONE"} + - {id: 126, cat: TV/Sport, desc: "Events - Other/Other"} + - {id: 96, cat: TV/Sport, desc: "Events - UFC/HD"} + - {id: 103, cat: TV/Sport, desc: "Events - UFC/SD"} + - {id: 93, cat: Audio/Other, desc: "Instructional - Audio"} + - {id: 112, cat: TV/Sport, desc: "Instructional - DVD/ISO/WEB"} + - {id: 113, cat: Movies/DVD, desc: "Instructional - DVDRip/Other"} + - {id: 73, cat: Books/EBook, desc: "Instructional - E-book"} + - {id: 83, cat: TV/Other, desc: "Instructional - Fitness"} + - {id: 124, cat: TV/Sport, desc: "JJ/BJJ - Events"} + - {id: 85, cat: TV/Sport, desc: "JJ/BJJ - Misc/Other"} + - {id: 99, cat: TV/Sport, desc: "Kickboxing - HD"} + - {id: 84, cat: TV/Sport, desc: "Kickboxing - SD"} + - {id: 111, cat: Books/Mags, desc: "Magazines - All"} + - {id: 58, cat: Other/Misc, desc: "Misc - All"} + - {id: 63, cat: TV/Sport, desc: "Misc - MMA Special"} + - {id: 62, cat: Movies/Other, desc: "Movies - MMA Related"} + - {id: 77, cat: TV/Sport, desc: "Muay Thai - All"} + - {id: 110, cat: TV/Sport, desc: "Packs - Career"} + - {id: 115, cat: TV/Sport, desc: "Packs - Instructionals"} + - {id: 91, cat: TV/Sport, desc: "Packs - Other/HD"} + - {id: 64, cat: TV/Sport, desc: "Packs - Other/SD"} + - {id: 95, cat: TV/Sport, desc: "Packs - Pride"} + - {id: 59, cat: TV/Sport, desc: "Packs - TUF"} + - {id: 114, cat: TV/Sport, desc: "Packs - UFC"} + - {id: 122, cat: TV/Sport, desc: "Packs - Userpacks"} + - {id: 72, cat: TV/Sport, desc: "Retro - K-1"} + - {id: 61, cat: TV/Sport, desc: "Retro - Other/All"} + - {id: 66, cat: TV/Sport, desc: "Retro - PRIDE"} + - {id: 67, cat: TV/Sport, desc: "Retro - UFC"} + - {id: 69, cat: TV/Sport, desc: "Retro - WEC"} + - {id: 97, cat: TV/Sport, desc: "TUF - Episode/HD"} + - {id: 104, cat: TV/Sport, desc: "TUF - Episode/SD"} + - {id: 101, cat: TV/Sport, desc: "TV Show - Episode/HD"} + - {id: 94, cat: TV/Sport, desc: "TV Show - Episode/SD"} + - {id: 127, cat: TV/Sport, desc: "TV Show - WebRip"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: seeders + options: + name: title + size: size + seeders: seeders + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: account-login.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + returnto: "/" + error: + - selector: table.main:contains("Login failed!") + message: + selector: table tr td.text + test: + path: torrents.php + selector: a[href="account-logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + incldead: 1 + lang: 0 + # 0 all 1 notfree 2 onlyfree + freeleech: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + search: "{{ .Keywords }}" + sort: "{{ .Config.sort }}" + order: "{{ .Config.type }}" + + rows: + selector: table[class="ttable_headinner"] tr:has(a[href^="download.php?id="]) + + fields: + category: + selector: a[href^="torrents.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="torrents-details.php?id="] + attribute: title + details: + selector: a[href^="torrents-details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + date: + selector: td:nth-child(2) + filters: + - name: regexp + args: "(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2})" + - name: append + args: " -07:00" # PDT + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + grabs: + selector: td:nth-child(2) + filters: + - name: regexp + args: "Completed.*(\\d+)" + size: + selector: td:nth-child(6) + seeders: + selector: td:nth-child(7) + leechers: + selector: td:nth-child(8) + downloadvolumefactor: + case: + img[src="img/freeleech_star.gif"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 +# TorrentTrader 2.03 diff --git a/config/prowlarr/Definitions/mnv.yml b/config/prowlarr/Definitions/mnv.yml new file mode 100644 index 0000000..1708909 --- /dev/null +++ b/config/prowlarr/Definitions/mnv.yml @@ -0,0 +1,173 @@ +--- +id: mnv +name: MNV +description: "MNV (Max-New-Vision) is a Private GERMAN tracker" +language: de-DE +type: private +encoding: UTF-8 +links: + - https://mnvv2.info/ + +caps: + categorymappings: + + - {id: 1, cat: TV/Anime, desc: "Anime"} + - {id: 2, cat: PC, desc: "Appz"} + - {id: 13, cat: TV/Documentary, desc: "Doku"} + - {id: 3, cat: Books/EBook, desc: "E-Books/Bücher"} + - {id: 24, cat: PC/Games, desc: "Games/PC"} + - {id: 32, cat: TV/Anime, desc: "Hentai"} + - {id: 4, cat: Audio/Audiobook, desc: "Hörspiel/Hörbuch"} + - {id: 6, cat: Movies/HD, desc: "Movies/H.26x"} + - {id: 18, cat: Audio, desc: "Musik"} + - {id: 19, cat: Audio/Video, desc: "Musik Videos"} + - {id: 30, cat: Other, desc: "Sonstiges"} + - {id: 5, cat: Books/Mags, desc: "Tageszeitung"} + - {id: 14, cat: TV, desc: "TV-Serien"} + - {id: 29, cat: XXX, desc: "XXX"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search FreeLeech only + default: false + - name: onlyupload + type: checkbox + label: Search OnlyUpload only + default: false + - name: info_free + type: info + label: About Freeleech and OnlyUpload at MNV + default: "
  • FreeLeech are torrents where neither the download or upload is counted.
  • OnlyUpload are torrents where download is not counted but upload is. Good for building your Ratio up.
  • Do not set both FreeLeech and OnlyUpload check boxes, there are no torrents with both these flags so you will get a no-results error.
" + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeds: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. The default is 10. + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: .tablea:contains("Fehler") + test: + path: browse.php + selector: a[href="logout.php"] + +search: + # https://mnvv2.info/browse.php?showsearch=1&c13=1&c3=1&search=&blah=0&incldead=1&team=0&orderby=added&sort=desc&language=all + path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 name, 1 descr, 2 both, 3 filelist + blah: 0 + # 0 active, 1 all, 2 dead + incldead: 1 + team: 0 + language: all + freeleech: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + free: "{{ if .Config.onlyupload }}1{{ else }}{{ end }}" + orderby: "{{ .Config.sort }}" + order: "{{ .Config.type }}" + # site does not support imdbid search from the browse.php page or return imdb links in results + + rows: + selector: table.tableinborder > tbody > tr:has(a[href^="download.php"]) + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php"] + details: + selector: a[href^="details.php"] + attribute: href + download: + selector: a[href^="download.php"] + attribute: href + poster: + selector: a[href^="details.php"] + attribute: onMouseover + filters: + - name: regexp + args: src=([^\s]+) + date: + selector: td.tablea > table > tbody > tr:nth-child(2) > td:nth-child(2) > b + filters: + - name: append + args: " +01:00" # CET + - name: replace + args: ["\xA0", " "] + - name: dateparse + args: "dd.MM.yyyy HH:mm:ss zzz" + grabs: + selector: td.tablea table tbody tr:nth-child(2) td:nth-child(3) b + size: + selector: a[href^="details.php"] + attribute: onMouseover + filters: + - name: regexp + args: "Größe: (.*?)" + seeders: + selector: a[href^="details.php"] + attribute: onMouseover + filters: + - name: regexp + args: ">(\\d+) Seeder" + leechers: + selector: a[href^="details.php"] + attribute: onMouseover + filters: + - name: regexp + args: ">(\\d+) Leecher" + downloadvolumefactor: + case: + img[src="pic/oupic.gif"]: 0 + img[src="pic/freeleech.gif"]: 0 + "*": 1 + uploadvolumefactor: + case: + img[src="pic/freeleech.gif"]: 0 + "*": 1 + minimumratio: + text: 0.7 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# engine n/a diff --git a/config/prowlarr/Definitions/mojblink.yml b/config/prowlarr/Definitions/mojblink.yml new file mode 100644 index 0000000..025325b --- /dev/null +++ b/config/prowlarr/Definitions/mojblink.yml @@ -0,0 +1,231 @@ +--- +id: mojblink +name: MOJBLiNK +description: "MOJBLiNK is a Private SLOVENIAN Torrent Tracker for MOVIES / TV / GENERAL" +language: sl-SI +type: private +encoding: UTF-8 +links: + - https://www.mojblink.si/ + +caps: + categorymappings: + - {id: 50, cat: Movies, desc: "BLiNK"} + - {id: 54, cat: Audio/Audiobook, desc: "eBook AUDIO"} + - {id: 20, cat: Books/EBook, desc: "eBook eBOOK"} + - {id: 52, cat: Books/Other, desc: "eBook Education"} + - {id: 53, cat: Books/Mags, desc: "eBook Magazine"} + - {id: 62, cat: PC/Mobile-Android, desc: "GAMES Android"} + - {id: 12, cat: Console/NDS, desc: "GAMES Nintendo DS"} + - {id: 8, cat: PC/Games, desc: "GAMES PC"} + - {id: 7, cat: PC/Games, desc: "GAMES PCRip"} + - {id: 13, cat: Console/PS3, desc: "GAMES Playstation"} + - {id: 124, cat: Console/PS4, desc: "GAMES PS4"} + - {id: 14, cat: Console/PS4, desc: "GAMES PS5"} + - {id: 16, cat: Console/PSP, desc: "GAMES PSP"} + - {id: 65, cat: Console/Wii, desc: "GAMES Wii"} + - {id: 15, cat: Console/XBox, desc: "GAMES Xbox"} + - {id: 21, cat: Other, desc: "IMAGES Pics"} + - {id: 68, cat: Other, desc: "IMAGES Wallpaper"} + - {id: 70, cat: Movies/SD, desc: "Impatient CAM"} + - {id: 71, cat: Movies/SD, desc: "Impatient DVDSCR"} + - {id: 72, cat: Movies/SD, desc: "Impatient TC"} + - {id: 73, cat: Movies/SD, desc: "Impatient TS"} + - {id: 75, cat: Movies/SD, desc: "Impatient WEBRip"} + - {id: 121, cat: Movies/UHD, desc: "MOVIES 4K"} + - {id: 6, cat: Movies, desc: "MOVIES Animation"} + - {id: 37, cat: TV/Anime, desc: "MOVIES Anime"} + - {id: 40, cat: Movies/BluRay, desc: "MOVIES BD25"} + - {id: 39, cat: Movies/BluRay, desc: "MOVIES BD50"} + - {id: 41, cat: Movies/BluRay, desc: "MOVIES BDRip"} + - {id: 4, cat: Movies/BluRay, desc: "MOVIES BluRay 1080p"} + - {id: 3, cat: Movies/BluRay, desc: "MOVIES BluRay 720p"} + - {id: 43, cat: Movies/BluRay, desc: "MOVIES BRRip x264"} + - {id: 44, cat: Movies/BluRay, desc: "MOVIES BRRip XviD"} + - {id: 25, cat: TV/Documentary, desc: "MOVIES Documentary"} + - {id: 46, cat: Movies/DVD, desc: "MOVIES DVD"} + - {id: 47, cat: Movies/DVD, desc: "MOVIES DVDRip x264"} + - {id: 115, cat: Movies/DVD, desc: "MOVIES DVDRip x265"} + - {id: 1, cat: Movies/DVD, desc: "MOVIES DVDRip XviD"} + - {id: 48, cat: Movies/DVD, desc: "MOVIES HD2DVD"} + - {id: 123, cat: Movies/HD, desc: "MOVIES HDRip"} + - {id: 130, cat: Movies/Other, desc: "MOVIES PACK"} + - {id: 74, cat: Movies/WEB-DL, desc: "MOVIES Web-DL"} + - {id: 120, cat: Movies/HD, desc: "MOVIES x265"} + - {id: 55, cat: Audio/Video, desc: "MUSIC BD"} + - {id: 23, cat: Audio/Video, desc: "MUSIC DVD"} + - {id: 56, cat: Audio/Lossless, desc: "MUSIC FLAC"} + - {id: 11, cat: Audio/MP3, desc: "MUSIC MP3"} + - {id: 57, cat: Audio/Video, desc: "MUSIC MP4"} + - {id: 58, cat: Audio/Video, desc: "MUSIC Video"} + - {id: 26, cat: PC/Mobile-Android, desc: "PROGRAM Android"} + - {id: 27, cat: PC/Mobile-iOS, desc: "PROGRAM iOS"} + - {id: 78, cat: PC, desc: "PROGRAM Linux"} + - {id: 79, cat: PC/Mac, desc: "PROGRAM Mac"} + - {id: 9, cat: PC/ISO, desc: "PROGRAM PC ISO"} + - {id: 80, cat: PC/0day, desc: "PROGRAM PC Win"} + - {id: 5, cat: TV/HD, desc: "TV HDTV"} + - {id: 82, cat: TV/HD, desc: "TV HDTVRip"} + - {id: 126, cat: TV/Other, desc: "TV PACK"} + - {id: 2, cat: TV/SD, desc: "TV TVRip"} + - {id: 125, cat: TV/WEB-DL, desc: "TV Web-DL"} + - {id: 85, cat: Movies/HD, desc: "UpLINK HEVC"} + - {id: 86, cat: Movies/HD, desc: "UpLINK MPEG4"} + - {id: 122, cat: XXX/Other, desc: "XXX Games"} + - {id: 88, cat: XXX/Other, desc: "XXX Magazine"} + - {id: 10, cat: XXX/x264, desc: "XXX Movies"} + - {id: 89, cat: XXX/Pack, desc: "XXX Packs"} + - {id: 90, cat: XXX/ImageSet, desc: "XXX Pics"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: DESC + options: + DESC: desc + ASC: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 50 on your account Personal Settings.
The Default is 30 + - name: info_xxx + type: info + label: XXX Results + default: To include XXX in results, tick the View XXX Torrents checkbox on your account Personal Settings. + +login: + path: login + method: form + form: form + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: div.content-wrapper:has(i.ico-not_warn) + test: + path: / + selector: a[href*="/odjava?hash_insert="] + +search: + paths: + # https://www.mojblink.si/brskanje?cat=0&search=justice+league&searchin=title&incldead=1&only_free=1&redir=no + - path: brskanje + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # title, titledescr, descr + searchin: "{{ if .Query.IMDBID }}descr{{ else }}title{{ end }}" + # 0 active, 1 all, 2 dead + incldead: 1 + only_free: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + st: 1 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + redir: no + + rows: + selector: div.bgPreview + + fields: + category: + selector: a[href^="/brskanje/"] + attribute: href + filters: + - name: regexp + args: (\d+) + title: + selector: a[href^="/podrobnosti/"] + attribute: title + details: + selector: a[href^="/podrobnosti/"] + attribute: href + download: + selector: a[href^="/download/"] + attribute: href + poster: + selector: div.bgPreview + attribute: style + filters: + - name: regexp + args: "\\((.+?)\\)" + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + files: + selector: div.release-info__meta span + date_day: + # Naložen: Danes, 06:46:17 + # Uploaded: Danes, 06:46:17 + selector: div.release-info__meta:contains("Naložen:"):contains("Včeraj"), div.release-info__meta:contains("Naložen:"):contains("Danes"), div.release-info__meta:contains("Uploaded:"):contains("Včeraj"), div.release-info__meta:contains("Uploaded:"):contains("Danes") + # auto adjusted by site account profile + optional: true + filters: + - name: replace + args: ["Uploaded: ", ""] + - name: replace + args: ["Naložen: ", ""] + - name: replace + args: ["Včeraj,", "Yesterday"] + - name: replace + args: ["Danes,", "Today"] + - name: fuzzytime + date_year: + # Uploaded: 15.11.2022 07:24:18 + # Naložen: 15.11.2022 07:24:18 + selector: div.release-info__meta:contains("Naložen:"):contains("."), div.release-info__meta:contains("Uploaded:"):contains(".") + # auto adjusted by site account profile + optional: true + filters: + - name: replace + args: ["Uploaded: ", ""] + - name: replace + args: ["Naložen: ", ""] + - name: dateparse + args: "dd.MM.yyyy HH:mm:ss" + date: + text: "{{ if or .Result.date_day .Result.date_year }}{{ or .Result.date_day .Result.date_year }}{{ else }}now{{ end }}" + size: + selector: a[href^="/download/"] + seeders: + selector: span[title="Sejalci"], span[title="Seeders"] + leechers: + selector: span[title="Odjemalci"], span[title="Leechers"] + downloadvolumefactor: + case: + span.torrent-FL: 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 4 days (as seconds = 4 x 24 x 60 x 60) + text: 345600 +# engine n/a diff --git a/config/prowlarr/Definitions/monikadesign-api.yml b/config/prowlarr/Definitions/monikadesign-api.yml new file mode 100644 index 0000000..a111f1c --- /dev/null +++ b/config/prowlarr/Definitions/monikadesign-api.yml @@ -0,0 +1,154 @@ +--- +id: monikadesign-api +name: MonikaDesign (API) +description: "MonikaDesign is a CHINESE Private Torrent Tracker for MOVIES / TV / ANIME" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://monikadesign.uk/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Movies"} + - {id: 2, cat: TV, desc: "TV"} + - {id: 3, cat: Audio, desc: "Music of Movie"} + - {id: 4, cat: PC, desc: "Game"} + - {id: 5, cat: Movies, desc: "Action Live"} + - {id: 6, cat: Movies/Other, desc: "Anime Movie"} + - {id: 7, cat: Movies/Other, desc: "Anime Live"} + - {id: 8, cat: TV/Anime, desc: "Anime TV"} + - {id: 9, cat: Audio, desc: "Music of TV"} + - {id: 11, cat: TV/Anime, desc: "Airing Anime TV"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + music-search: [q] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your MonikaDesign account My Security page and clicking on the API Token tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + inputs: {} # TODO: remove in v10 + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: "/api/torrents/filter" + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + # if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6 + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + seasonNumber: "{{ .Query.Season }}" + episodeNumber: "{{ .Query.Ep }}" + imdbId: "{{ .Query.IMDBIDShort }}" + tmdbId: "{{ .Query.TMDBID }}" + tvdbId: "{{ .Query.TVDBID }}" + free: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + + rows: + selector: data + attribute: attributes + + fields: + category: + selector: category_id + title: + selector: name + details: + selector: details_link + download: + selector: download_link + infohash: + selector: info_hash + poster: + selector: meta.poster + filters: + - name: replace + args: ["https://via.placeholder.com/90x135", ""] + imdbid: + selector: imdb_id + tmdbid: + selector: tmdb_id + tvdbid: + selector: tvdb_id + genre: + selector: meta.genres + filters: + - name: re_replace + args: ["(?i)(Science Fiction)", "Science_Fiction"] + - name: replace + args: [" & ", "_&_"] + description: + text: "{{ .Result.genre }}" + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + text: 1 + uploadvolumefactor: + text: 1 +# json UNIT3D 6.4.1 (Custom) diff --git a/config/prowlarr/Definitions/mousebits.yml b/config/prowlarr/Definitions/mousebits.yml new file mode 100644 index 0000000..5b5f4d9 --- /dev/null +++ b/config/prowlarr/Definitions/mousebits.yml @@ -0,0 +1,134 @@ +--- +id: mousebits +name: MouseBits +description: "MouseBits is a Private Torrent Tracker for all things Disney" +language: en-US +type: private +encoding: UTF-8 +links: + - https://mousebits.com/ + +caps: + categorymappings: + # Video + - {id: 34, cat: TV, desc: "Video (DVD ISO)"} + - {id: 14, cat: TV, desc: "Multi-angle tribute"} + - {id: 36, cat: TV, desc: "Martin Vid"} + - {id: 15, cat: TV, desc: "One-take ride-through"} + - {id: 26, cat: TV, desc: "TV Specials"} + - {id: 28, cat: TV, desc: "Promotional Content"} + - {id: 29, cat: TV, desc: "Vacation Planner"} + # Audio + - {id: 30, cat: Audio/MP3, desc: "Music Album (lossy)"} + - {id: 31, cat: Audio/Lossless, desc: "Music Album (FLAC)"} + - {id: 32, cat: Audio, desc: "Attraction Series"} + - {id: 35, cat: Audio, desc: "Background Series"} + - {id: 17, cat: Audio, desc: "Multi-track collection"} + - {id: 18, cat: Audio, desc: "Studio mix ride-through"} + - {id: 19, cat: Audio, desc: "Live recording"} + - {id: 33, cat: Audio, desc: "Induction Recording"} + # Photo + - {id: 21, cat: Other, desc: "Park update"} + - {id: 22, cat: Other, desc: "Desktops"} + - {id: 23, cat: Other, desc: "Vacation photos"} + # Other + - {id: 25, cat: Other, desc: "Community media"} + - {id: 27, cat: Other, desc: "Off-topic"} + + modes: + search: [q] + tv-search: [q, season, ep] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: sort + type: select + label: Sort requested from site + default: 3 + options: + 3: created + 5: seeders + 2: title + - name: type + type: select + label: Order requested from site + default: 2 + options: + 2: desc + 1: asc + - name: info + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: ?page=login + method: form + form: form + inputs: + uid: "{{ .Config.username }}" + pwd: "{{ .Config.password }}" + error: + - selector: span:contains("Password Incorrect") + - selector: span:contains("Username Incorrect") + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + # https://mousebits.com/index.php?page=torrents&active=0&order=3&by=2 + - path: index.php + inputs: + $raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}" + search: "{{ .Keywords }}" + page: torrents + category: 0 + # 0 all, 1 active, 2 dead + active: 0 + order: "{{ .Config.sort }}" + by: "{{ .Config.type }}" + + rows: + selector: table.lista:last-of-type > tbody > tr:has(a[href^="index.php?page=torrents&category="]) + + fields: + category: + selector: a[href^="index.php?page=torrents&category="] + attribute: href + filters: + - name: querystring + args: category + title: + selector: a[href^="index.php?page=torrent-details&id="] + details: + selector: a[href^="index.php?page=torrent-details&id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + size: + text: "512 MB" + date: + selector: td:nth-child(4) + # auto adjusted by site account profile + filters: + - name: dateparse + args: "dd/MM/yyyy" + seeders: + selector: td:nth-child(5) + leechers: + selector: td:nth-child(6) + grabs: + selector: td:nth-child(7) + downloadvolumefactor: + text: 1 + uploadvolumefactor: + text: 1 +# xbtit 2.3.0 diff --git a/config/prowlarr/Definitions/moviesdvdr.yml b/config/prowlarr/Definitions/moviesdvdr.yml new file mode 100644 index 0000000..d87a62b --- /dev/null +++ b/config/prowlarr/Definitions/moviesdvdr.yml @@ -0,0 +1,126 @@ +--- +id: moviesdvdr +name: MoviesDVDR +description: "MoviesDVDR is a SPANISH Public tracker for MOVIES" +language: es-ES +type: public +encoding: UTF-8 +links: + - https://www.moviesdvdr.co/ +legacylinks: + - https://www.moviesdvdr.me/ + +caps: + categories: + 1: Movies/DVD + + modes: + search: [q] + movie-search: [q] + +settings: [] + +download: + selectors: + - selector: a.torrent_download + attribute: href + +search: + paths: + - path: / + inputs: + s: "{{ .Keywords }}" + + rows: + selector: div.hitem + filters: + - name: andmatch + + fields: + category: + text: 1 + _multi: + optional: true + selector: img.flageitor:nth-child(2) + filters: + - name: re_replace + args: [".*", "MULTi "] + _eng: + optional: true + selector: img.flageitor[src^="/wp-content/themes/moviesdvdr/images/english.png"] + filters: + - name: re_replace + args: [".*", "English "] + _esp: + optional: true + selector: img.flageitor[src^="/wp-content/themes/moviesdvdr/images/espanol.png"] + filters: + - name: re_replace + args: [".*", "SPANiSH "] + _ita: + optional: true + selector: img.flageitor[src^="/wp-content/themes/moviesdvdr/images/italian.png"] + filters: + - name: re_replace + args: [".*", "iTALiAN "] + _deu: + optional: true + selector: img.flageitor[src^="/wp-content/themes/moviesdvdr/images/german.png"] + filters: + - name: re_replace + args: [".*", "German "] + _fra: + optional: true + selector: img.flageitor[src^="/wp-content/themes/moviesdvdr/images/french.png"] + filters: + - name: re_replace + args: [".*", "FRENCH "] + _oth: + optional: true + selector: img.flageitor[src^="/wp-content/themes/moviesdvdr/images/other.png"] + filters: + - name: re_replace + args: [".*", "oTHer "] + _doc: + optional: true + selector: div.imagem span:contains("Documental") + filters: + - name: re_replace + args: ["Documental", "DOC "] + _3x: + optional: true + selector: div.imagem span:contains("Adulto") + filters: + - name: replace + args: ["Adulto", "XXX "] + title: + selector: div.titulo + filters: + - name: append + args: " {{ .Result._multi }}{{ .Result._eng }}{{ .Result._esp }}{{ .Result._ita }}{{ .Result._deu }}{{ .Result._fra }}{{ .Result._oth }}{{ .Result._doc }}{{ .Result._3x }}DVDRiP XViD" + details: + selector: a + attribute: href + download: + selector: a + attribute: href + poster: + selector: img.attachment-post-thumbnail + attribute: src + date: + text: now + description: + selector: span + files: + text: 1 + size: + text: "4.5 GB" + seeders: + text: 1 + leechers: + text: 1 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/movietorrentz.yml b/config/prowlarr/Definitions/movietorrentz.yml new file mode 100644 index 0000000..13638c3 --- /dev/null +++ b/config/prowlarr/Definitions/movietorrentz.yml @@ -0,0 +1,134 @@ +--- +id: movietorrentz +name: Movie-Torrentz +description: "Movie-Torrentz is a Private Torrent Tracker for MOVIES / TV" +language: en-US +type: private +encoding: UTF-8 +links: + - https://m2g.link/ + +caps: + categorymappings: + - {id: 106, cat: Movies, desc: "m2g: m2g"} + - {id: 102, cat: PC, desc: "Misc: Programs"} + - {id: 107, cat: Movies/SD, desc: "Movies: Xvid"} + - {id: 108, cat: Movies/DVD, desc: "Movies: DVDR"} + - {id: 109, cat: Movies, desc: "Movies: Packs"} + - {id: 110, cat: Movies/HD, desc: "Movies: MP4"} + - {id: 112, cat: Movies/SD, desc: "Movies: 480p"} + - {id: 113, cat: Movies/BluRay, desc: "Movies: BluRay / x264"} + - {id: 126, cat: Movies/HD, desc: "Movies: x265"} + - {id: 127, cat: Movies/UHD, desc: "Movies: 4K"} + - {id: 114, cat: TV/SD, desc: "TV: XviD"} + - {id: 115, cat: TV/HD, desc: "TV: X264"} + - {id: 116, cat: TV, desc: "TV: Packs"} + - {id: 128, cat: TV/HD, desc: "TV: x265"} + - {id: 103, cat: Movies, desc: "ViP3R: ViP3R"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: id + options: + id: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: account-login.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + remember: yes + error: + - selector: div.myBlock:contains("Access Denied") + test: + path: index.php + selector: a[href="account-logout.php"] + +search: + paths: + - path: torrents-search.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 active, 1 dead, 2 onlydead + incldead: 1 + # 0 any, 1 english, etc + lang: 0 + # 0 any, 1 notfree, 2 onlyfree + freeleech: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + sort: "{{ .Config.sort }}" + order: "{{ .Config.type }}" + # does not support imdbid searching + + rows: + selector: tr.t-row + + fields: + category: + selector: a[href^="torrents.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="torrents-details.php?id="] + details: + selector: a[href^="torrents-details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: a[href^="torrents-details.php?id="]:not(a[onmouseover*="images/nocover.jpg"]) + attribute: onmouseover + filters: + - name: regexp + args: src=([^\s]+) + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + date: + text: now + size: + selector: td:nth-last-child(5) + seeders: + selector: td:nth-last-child(4) + leechers: + selector: td:nth-last-child(3) + downloadvolumefactor: + case: + img[src="images/free.gif"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 0.5 +# TorrentTrader diff --git a/config/prowlarr/Definitions/movieworld.yml b/config/prowlarr/Definitions/movieworld.yml new file mode 100644 index 0000000..13fd9fb --- /dev/null +++ b/config/prowlarr/Definitions/movieworld.yml @@ -0,0 +1,170 @@ +--- +id: movieworld +name: MovieWorld +description: "MovieWorld (Flicker) is a Semi-Private Torrent Tracker for MOVIES / TV / 3X" +language: en-US +type: semi-private +encoding: UTF-8 +links: + - https://movieworld.pics/ + +caps: + categorymappings: + - {id: 37, cat: Movies, desc: "Freeleech"} + - {id: 14, cat: Movies/WEB-DL, desc: "Movie/WEB"} + - {id: 36, cat: Movies/UHD, desc: "Movie/4K Disc"} + - {id: 5, cat: Movies/UHD, desc: "Movie/4K Rip"} + - {id: 6, cat: Movies/BluRay, desc: "Movie/BluRay Disc"} + - {id: 7, cat: Movies/BluRay, desc: "Movie/BluRay Rip"} + - {id: 34, cat: Movies, desc: "Movie/Rest"} + - {id: 15, cat: Movies, desc: "Movie/Packs"} + - {id: 20, cat: Movies/SD, desc: "Movie/CAM"} + - {id: 21, cat: XXX, desc: "Movie/XXX"} + - {id: 28, cat: TV, desc: "Tv Packs"} + - {id: 31, cat: TV, desc: "Tv Mini Series"} + - {id: 30, cat: TV/HD, desc: "Tv Episodes"} + - {id: 26, cat: TV/Sport, desc: "Tv Sport"} + - {id: 18, cat: Other, desc: "Other"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 3 + options: + 3: created + 5: seeders + 4: size + 2: title + - name: type + type: select + label: Order requested from site + default: 2 + options: + 2: desc + 1: asc + - name: info + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: index.php?page=login + method: post + inputs: + uid: "{{ .Config.username }}" + pwd: "{{ .Config.password }}" + error: + - selector: tr td span[style="color:#FF0000;"] + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + # https://movieworld.pics/index.php?page=torrents&search=&category=0&active=0 + - path: index.php + inputs: + page: torrents + search: "{{ .Keywords }}" + category: "{{ range .Categories }}{{.}};{{end}}" + # 0 filename, 1 file&descr, 2 descr, 3 uploaders, 18 genre, 4 imdb, 5 gold, 6 silver, 7 bronze, 8-17 upload multiplier 1x-10x + options: "{{ if .Config.freeleech }}5{{ else }}0{{ end }}" + # 0 all, 1 active only, 2 dead only + active: 0 + order: "{{ .Config.sort }}" + by: "{{ .Config.type }}" + # does not support imdbid search and does not return imdb link in results, does not support Genre search or return them in results. + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + + rows: + selector: "table.lista > tbody > tr:has(a[href^=\"download.php?id=\"]):not(:has(a[href^=\"index.php?page=userdetails\"]))" + + fields: + category: + selector: a[href^="index.php?page=torrents&category="] + attribute: href + filters: + - name: querystring + args: category + title_torrent: + selector: a[href^="download.php?id="] + attribute: href + filters: + - name: querystring + args: f + - name: htmldecode + - name: re_replace + args: ["(?i)\\.torrent$", ""] + title_text: + selector: a[href^="index.php?page=torrent-details&id="] + title: + text: "{{ if .Result.title_torrent }}{{ .Result.title_torrent }}{{ else }}{{ .Result.title_text }}{{ end }}" + poster: + selector: a[href^="index.php?page=torrent-details&id="] + attribute: onmouseover + filters: + - name: regexp + args: "src=(.*?) " + - name: replace + args: ["torrentimg/nocover.jpg", ""] + details: + selector: a[href^="index.php?page=torrent-details&id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + date: + selector: td:has(a[href^="download.php?id="]) ~ td ~ td + # auto adjusted by site account profile + filters: + - name: dateparse + args: "dd/MM/yyyy" + seeders: + selector: td:has(a[href^="download.php?id="]) ~ td ~ td ~ td + leechers: + selector: td:has(a[href^="download.php?id="]) ~ td ~ td ~ td ~ td + grabs: + selector: td:has(a[href^="download.php?id="]) ~ td ~ td ~ td ~ td ~ td + size: + selector: "td:has(a[href^=\"download.php?id=\"]) ~ td ~ td ~ td ~ td ~ td ~ td" + downloadvolumefactor: + case: + img[src="images/gold.gif"]: 0 + img[src="images/silver.gif"]: 0.5 + img[src="images/bronze.gif"]: 0.75 + "*": 1 + uploadvolumefactor: + case: + img[src="images/2x.gif"]: 2 + img[src="images/3x.gif"]: 3 + img[src="images/4x.gif"]: 4 + img[src="images/5x.gif"]: 5 + img[src="images/6x.gif"]: 6 + img[src="images/7x.gif"]: 7 + img[src="images/8x.gif"]: 8 + img[src="images/9x.gif"]: 9 + img[src="images/10x.gif"]: 10 + "*": 1 + minimumseedtime: + # 3 days (as seconds = 3 x 24 x 60 x 60) + text: 259200 +# xbtitFM v4.1.28 diff --git a/config/prowlarr/Definitions/mteamtp.yml b/config/prowlarr/Definitions/mteamtp.yml new file mode 100644 index 0000000..7960aa2 --- /dev/null +++ b/config/prowlarr/Definitions/mteamtp.yml @@ -0,0 +1,222 @@ +--- +id: mteamtp +name: M-Team - TP +description: "M-Team TP (MTTP) is a CHINESE Private Torrent Tracker for HD MOVIES / TV / 3X" +language: zh-CN +type: private +encoding: UTF-8 +requestDelay: 5 +links: + - https://kp.m-team.cc/ + - https://tp.m-team.cc/ + - https://pt.m-team.cc/ + +caps: + categorymappings: + - {id: 401, cat: Movies/SD, desc: "Movie(電影)/SD", default: true} + - {id: 419, cat: Movies/HD, desc: "Movie(電影)/HD", default: true} + - {id: 420, cat: Movies/DVD, desc: "Movie(電影)/DVDiSo", default: true} + - {id: 421, cat: Movies/BluRay, desc: "Movie(電影)/Blu-Ray", default: true} + - {id: 439, cat: Movies/Other, desc: "Movie(電影)/Remux", default: true} + - {id: 403, cat: TV/SD, desc: "TV Series(影劇/綜藝)/SD", default: true} + - {id: 402, cat: TV/HD, desc: "TV Series(影劇/綜藝)/HD", default: true} + - {id: 435, cat: TV/SD, desc: "TV Series(影劇/綜藝)/DVDiSo", default: true} + - {id: 438, cat: TV/HD, desc: "TV Series(影劇/綜藝)/BD", default: true} + - {id: 404, cat: TV/Documentary, desc: "紀錄教育", default: true} + - {id: 405, cat: TV/Anime, desc: "Anime(動畫)", default: true} + - {id: 407, cat: TV/Sport, desc: "Sports(運動)", default: true} + - {id: 422, cat: PC/0day, desc: "Software(軟體)", default: true} + - {id: 423, cat: PC/Games, desc: "PCGame(PC遊戲)", default: true} + - {id: 427, cat: Books, desc: "eBook(電子書)", default: true} + - {id: 409, cat: Other, desc: "Misc(其他)", default: true} + # music + - {id: 406, cat: Audio/Video, desc: "MV(演唱)", default: true} + - {id: 408, cat: Audio/Other, desc: "Music(AAC/ALAC)", default: true} + - {id: 434, cat: Audio, desc: "Music(無損)", default: true} + # adult + - {id: 410, cat: XXX, desc: "AV(有碼)/HD Censored", default: false} + - {id: 429, cat: XXX, desc: "AV(無碼)/HD Uncensored", default: false} + - {id: 424, cat: XXX, desc: "AV(有碼)/SD Censored", default: false} + - {id: 430, cat: XXX, desc: "AV(無碼)/SD Uncensored", default: false} + - {id: 426, cat: XXX, desc: "AV(無碼)/DVDiSo Uncensored", default: false} + - {id: 437, cat: XXX, desc: "AV(有碼)/DVDiSo Censored", default: false} + - {id: 431, cat: XXX, desc: "AV(有碼)/Blu-Ray Censored", default: false} + - {id: 432, cat: XXX, desc: "AV(無碼)/Blu-Ray Uncensored", default: false} + - {id: 436, cat: XXX, desc: "AV(網站)/0Day", default: false} + - {id: 425, cat: XXX, desc: "IV(寫真影集)/Video Collection", default: false} + - {id: 433, cat: XXX, desc: "IV(寫真圖集)/Picture Collection", default: false} + - {id: 411, cat: XXX, desc: "H-Game(遊戲)", default: false} + - {id: 412, cat: XXX, desc: "H-Anime(動畫)", default: false} + - {id: 413, cat: XXX, desc: "H-Comic(漫畫)", default: false} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + - name: info_title + type: info + label: About Titles + default: For best results, disable the torrent name tooltip in User CP/Tracker Settings/Torrents Page. Otherwise long release names will be cut off. + - name: info_download_link + type: info + label: About Download Links + default: For best results, you must enable the Download icon in User CP/Tracker Settings/Torrents Page. + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: td.embedded:has(h2:contains("登录失败")) + - selector: td.embedded:has(h2:contains("failed")) + - selector: td.toolbox:contains("錯誤") + - selector: td.toolbox:contains("Error") + - selector: td.toolbox:contains("限制登") + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + categories: [401, 419, 420, 421, 439, 403, 402, 435, 438, 404, 405, 407, 422, 423, 427, 409] + - path: adult.php + categories: [410, 429, 424, 430, 426, 437, 431, 432, 436, 425, 433, 411, 412, 413] + - path: music.php + categories: [406, 408, 434] + allowEmptyInputs: true + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 3 uploader, 4 imdb url + search_area: "{{ if .Query.IMDBID }}4{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + title_default: + # shortened for long release names + selector: a[href^="details.php?id="] > b + title: + # not available if IMDB tooltips are turned on + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: img[alt="torrent thumbnail"][src] + attribute: src + filters: + - name: replace + args: ["pic/nopic.jpg", ""] + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + size: + selector: td.rowfollow:nth-last-child(6) + grabs: + selector: td.rowfollow:nth-last-child(3) + seeders: + selector: td.rowfollow:nth-last-child(5) + leechers: + selector: td.rowfollow:nth-last-child(4) + date_added: + selector: td.rowfollow:nth-last-child(7) > span[title] + optional: true + attribute: title + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_elapsed: + selector: td.rowfollow:nth-last-child(7):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumratio: + text: 1 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 + description: + selector: td:nth-child(2) + remove: a, b, font, img, span +# NexusPHP Standard v1.5 Beta 4 diff --git a/config/prowlarr/Definitions/mteamtp2fa.yml b/config/prowlarr/Definitions/mteamtp2fa.yml new file mode 100644 index 0000000..1060546 --- /dev/null +++ b/config/prowlarr/Definitions/mteamtp2fa.yml @@ -0,0 +1,225 @@ +--- +id: mteamtp2fa +name: M-Team - TP (2FA) +description: "This indexer uses a cookie login for M-Team TP (MTTP) for those that want to use 2FA" +language: zh-CN +type: private +encoding: UTF-8 +requestDelay: 5 +links: + - https://kp.m-team.cc/ + - https://tp.m-team.cc/ + - https://pt.m-team.cc/ + +caps: + categorymappings: + - {id: 401, cat: Movies/SD, desc: "Movie(電影)/SD", default: true} + - {id: 419, cat: Movies/HD, desc: "Movie(電影)/HD", default: true} + - {id: 420, cat: Movies/DVD, desc: "Movie(電影)/DVDiSo", default: true} + - {id: 421, cat: Movies/BluRay, desc: "Movie(電影)/Blu-Ray", default: true} + - {id: 439, cat: Movies/Other, desc: "Movie(電影)/Remux", default: true} + - {id: 403, cat: TV/SD, desc: "TV Series(影劇/綜藝)/SD", default: true} + - {id: 402, cat: TV/HD, desc: "TV Series(影劇/綜藝)/HD", default: true} + - {id: 435, cat: TV/SD, desc: "TV Series(影劇/綜藝)/DVDiSo", default: true} + - {id: 438, cat: TV/HD, desc: "TV Series(影劇/綜藝)/BD", default: true} + - {id: 404, cat: TV/Documentary, desc: "紀錄教育", default: true} + - {id: 405, cat: TV/Anime, desc: "Anime(動畫)", default: true} + - {id: 407, cat: TV/Sport, desc: "Sports(運動)", default: true} + - {id: 422, cat: PC/0day, desc: "Software(軟體)", default: true} + - {id: 423, cat: PC/Games, desc: "PCGame(PC遊戲)", default: true} + - {id: 427, cat: Books, desc: "eBook(電子書)", default: true} + - {id: 409, cat: Other, desc: "Misc(其他)", default: true} + # music + - {id: 406, cat: Audio/Video, desc: "MV(演唱)", default: true} + - {id: 408, cat: Audio/Other, desc: "Music(AAC/ALAC)", default: true} + - {id: 434, cat: Audio, desc: "Music(無損)", default: true} + # adult + - {id: 410, cat: XXX, desc: "AV(有碼)/HD Censored", default: false} + - {id: 429, cat: XXX, desc: "AV(無碼)/HD Uncensored", default: false} + - {id: 424, cat: XXX, desc: "AV(有碼)/SD Censored", default: false} + - {id: 430, cat: XXX, desc: "AV(無碼)/SD Uncensored", default: false} + - {id: 426, cat: XXX, desc: "AV(無碼)/DVDiSo Uncensored", default: false} + - {id: 437, cat: XXX, desc: "AV(有碼)/DVDiSo Censored", default: false} + - {id: 431, cat: XXX, desc: "AV(有碼)/Blu-Ray Censored", default: false} + - {id: 432, cat: XXX, desc: "AV(無碼)/Blu-Ray Uncensored", default: false} + - {id: 436, cat: XXX, desc: "AV(網站)/0Day", default: false} + - {id: 425, cat: XXX, desc: "IV(寫真影集)/Video Collection", default: false} + - {id: 433, cat: XXX, desc: "IV(寫真圖集)/Picture Collection", default: false} + - {id: 411, cat: XXX, desc: "H-Game(遊戲)", default: false} + - {id: 412, cat: XXX, desc: "H-Anime(動畫)", default: false} + - {id: 413, cat: XXX, desc: "H-Comic(漫畫)", default: false} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: infocookie + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: useragent + type: text + label: User-Agent + - name: info_useragent + type: info + label: How to get the User-Agent + default: "
  1. From the same place you fetched the cookie,
  2. Find 'user-agent:' in the Request Headers section
  3. Select and Copy the whole user-agent string (everything after 'user-agent: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + - name: info_title + type: info + label: About Titles + default: For best results, disable the torrent name tooltip in User CP/Tracker Settings/Torrents Page. Otherwise long release names will be cut off. + - name: info_download_link + type: info + label: About Download Links + default: For best results, you must enable the Download icon in User CP/Tracker Settings/Torrents Page. + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + categories: [401, 419, 420, 421, 439, 403, 402, 435, 438, 404, 405, 407, 422, 423, 427, 409] + - path: adult.php + categories: [410, 429, 424, 430, 426, 437, 431, 432, 436, 425, 433, 411, 412, 413] + - path: music.php + categories: [406, 408, 434] + allowEmptyInputs: true + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 3 uploader, 4 imdb url + search_area: "{{ if .Query.IMDBID }}4{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + headers: + User-Agent: ["{{ .Config.useragent }}"] + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + title_default: + # shortened for long release names + selector: a[href^="details.php?id="] > b + title: + # not available if IMDB tooltips are turned on + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: img[alt="torrent thumbnail"][src] + attribute: src + filters: + - name: replace + args: ["pic/nopic.jpg", ""] + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + size: + selector: td.rowfollow:nth-last-child(6) + grabs: + selector: td.rowfollow:nth-last-child(3) + seeders: + selector: td.rowfollow:nth-last-child(5) + leechers: + selector: td.rowfollow:nth-last-child(4) + date_added: + selector: td.rowfollow:nth-last-child(7) > span[title] + optional: true + attribute: title + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_elapsed: + selector: td.rowfollow:nth-last-child(7):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumratio: + text: 1 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 + description: + selector: td:nth-child(2) + remove: a, b, font, img, span +# NexusPHP Standard v1.5 Beta 4 diff --git a/config/prowlarr/Definitions/musebootlegs.yml b/config/prowlarr/Definitions/musebootlegs.yml new file mode 100644 index 0000000..f742542 --- /dev/null +++ b/config/prowlarr/Definitions/musebootlegs.yml @@ -0,0 +1,200 @@ +--- +id: musebootlegs +name: MuseBootlegs +description: "MuseBootlegs (MB) is a Semi-Private Torrent Tracker for MUSE MUSIC / BOOTLEGS" +language: en-US +type: semi-private +encoding: UTF-8 +links: + - https://www.musebootlegs.com/ + +caps: + categorymappings: + - {id: 4, cat: Audio/Lossless, desc: "Audio Lossless"} + - {id: 13, cat: Audio/Lossless, desc: "Audio Lossless 1999"} + - {id: 14, cat: Audio/Lossless, desc: "Audio Lossless 2000"} + - {id: 15, cat: Audio/Lossless, desc: "Audio Lossless 2001"} + - {id: 16, cat: Audio/Lossless, desc: "Audio Lossless 2002"} + - {id: 17, cat: Audio/Lossless, desc: "Audio Lossless 2003"} + - {id: 18, cat: Audio/Lossless, desc: "Audio Lossless 2004"} + - {id: 19, cat: Audio/Lossless, desc: "Audio Lossless 2005"} + - {id: 20, cat: Audio/Lossless, desc: "Audio Lossless 2006"} + - {id: 21, cat: Audio/Lossless, desc: "Audio Lossless 2007"} + - {id: 22, cat: Audio/Lossless, desc: "Audio Lossless 2008"} + - {id: 23, cat: Audio/Lossless, desc: "Audio Lossless 2009"} + - {id: 24, cat: Audio/Lossless, desc: "Audio Lossless 2010"} + - {id: 25, cat: Audio/Lossless, desc: "Audio Lossless 2011"} + - {id: 26, cat: Audio/Lossless, desc: "Audio Lossless 2012"} + - {id: 27, cat: Audio/Lossless, desc: "Audio Lossless 2013"} + - {id: 46, cat: Audio/Lossless, desc: "Audio Lossless 2014"} + - {id: 47, cat: Audio/Lossless, desc: "Audio Lossless 2015"} + - {id: 53, cat: Audio/Lossless, desc: "Audio Lossless 2016"} + - {id: 55, cat: Audio/Lossless, desc: "Audio Lossless 2017"} + - {id: 57, cat: Audio/Lossless, desc: "Audio Lossless 2018"} + - {id: 58, cat: Audio/Lossless, desc: "Audio Lossless 2019"} + - {id: 61, cat: Audio/Lossless, desc: "Audio Lossless 2022"} + - {id: 63, cat: Audio/Lossless, desc: "Audio Lossless 2023"} + - {id: 28, cat: Audio/Lossless, desc: "Audio Lossless Misc"} + - {id: 8, cat: Audio/Video, desc: "DVD Amateur"} + - {id: 3, cat: Audio/Video, desc: "DVD Pro-Shot"} + - {id: 29, cat: Audio/Video, desc: "DVD Pro-Shot 1999"} + - {id: 30, cat: Audio/Video, desc: "DVD Pro-Shot 2000"} + - {id: 31, cat: Audio/Video, desc: "DVD Pro-Shot 2001"} + - {id: 32, cat: Audio/Video, desc: "DVD Pro-Shot 2002"} + - {id: 33, cat: Audio/Video, desc: "DVD Pro-Shot 2003"} + - {id: 34, cat: Audio/Video, desc: "DVD Pro-Shot 2004"} + - {id: 35, cat: Audio/Video, desc: "DVD Pro-Shot 2005"} + - {id: 36, cat: Audio/Video, desc: "DVD Pro-Shot 2006"} + - {id: 37, cat: Audio/Video, desc: "DVD Pro-Shot 2007"} + - {id: 38, cat: Audio/Video, desc: "DVD Pro-Shot 2008"} + - {id: 39, cat: Audio/Video, desc: "DVD Pro-Shot 2009"} + - {id: 40, cat: Audio/Video, desc: "DVD Pro-Shot 2010"} + - {id: 41, cat: Audio/Video, desc: "DVD Pro-Shot 2011"} + - {id: 42, cat: Audio/Video, desc: "DVD Pro-Shot 2012"} + - {id: 43, cat: Audio/Video, desc: "DVD Pro-Shot 2013"} + - {id: 48, cat: Audio/Video, desc: "DVD Pro-Shot 2014"} + - {id: 49, cat: Audio/Video, desc: "DVD Pro-Shot 2015"} + - {id: 54, cat: Audio/Video, desc: "DVD Pro-Shot 2016"} + - {id: 56, cat: Audio/Video, desc: "DVD Pro-Shot 2017"} + - {id: 59, cat: Audio/Video, desc: "DVD Pro-Shot 2018"} + - {id: 60, cat: Audio/Video, desc: "DVD Pro-Shot 2019"} + - {id: 62, cat: Audio/Video, desc: "DVD Pro-Shot 2022"} + - {id: 44, cat: Audio/Video, desc: "DVD Pro-Shot Compilations"} + - {id: 45, cat: Audio/Video, desc: "DVD Pro-Shot Music Videos"} + - {id: 7, cat: Audio/Video, desc: "High-Definition"} + - {id: 51, cat: Audio/Video, desc: "High-Definition Pro-Shot"} + - {id: 50, cat: Audio/Video, desc: "High-Definition AMT"} + - {id: 52, cat: Audio/Video, desc: "High-Definition Music Videos"} + - {id: 6, cat: Audio/Video, desc: "Lossy Audio/Video"} + - {id: 9, cat: Audio/Video, desc: "MBDVD"} + - {id: 5, cat: Other, desc: "Misc"} + - {id: 12, cat: Other, desc: "3D"} + + modes: + search: [q] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeders: seeders + size: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_results + type: info + label: Search results + default: "If you are getting the error Found no results while trying to browse this tracker then first access the site with your browser and check that you are not being forced to change your password because it has expired after 180 days." + +login: + path: ?p=home&pid=1 + method: form + form: form#loginbox_form + submitpath: ajax/login.php + inputs: + action: login + loginbox_membername: "{{ .Config.username }}" + loginbox_password: "{{ .Config.password }}" + loginbox_remember: 1 + selectorinputs: + securitytoken: + selector: "script:contains(\"stKey: \")" + filters: + - name: regexp + args: "stKey: \"(.+?)\"," + error: + - selector: div.error + - selector: :contains("-ERROR-") + test: + path: ?p=home&pid=1 + selector: div#member_info_bar + +search: + paths: + - path: / + inputs: + p: torrents + pid: 32 + $raw: "{{ range .Categories }}&cid[]={{.}}{{end}}" + keywords: "{{ .Keywords }}" + # name, description, both, uploader + search_type: name + "sortOptions[sortBy]": "{{ .Config.sort }}" + "sortOptions[sortOrder]": "{{ .Config.type }}" + + rows: + selector: div.torrent-box[id^="torrent_"] + + fields: + category: + selector: a[href*="?p=torrents&pid=10&cid="] + attribute: href + filters: + - name: querystring + args: cid + title: + selector: a[href*="?p=torrents&pid=10&action=details&tid="] + details: + selector: a[href*="?p=torrents&pid=10&action=details&tid="] + attribute: href + download: + selector: a[href*="?p=torrents&pid=10&action=download&tid="] + attribute: href + poster: + selector: a[href*="data/torrents/torrent_images/"] + attribute: href + size: + selector: a[rel="torrent_size"] + grabs: + selector: a[rel="times_completed"] + seeders: + selector: a[rel="torrent_seeders"] + leechers: + selector: a[rel="torrent_leechers"] + date_day: + selector: div.torrentOwner:contains("day") + # auto adjusted by site account profile + optional: true + filters: + - name: regexp + args: "Uploaded (.+?) by" + - name: fuzzytime + date_year: + selector: div.torrentOwner:contains("-") + # auto adjusted by site account profile + optional: true + filters: + - name: regexp + args: "Uploaded (.+?) by" + - name: dateparse + args: "dd-MM-yyyy HH:mm" + date: + text: "{{ if or .Result.date_day .Result.date_year }}{{ or .Result.date_day .Result.date_year }}{{ else }}now{{ end }}" + downloadvolumefactor: + optional: true + default: 1 + selector: img[src$="/torrent_free.png"] + attribute: title + filters: + - name: regexp + args: (\d+(\.\d+)?) + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 +# TSUE 2.0 diff --git a/config/prowlarr/Definitions/mvgroupforum.yml b/config/prowlarr/Definitions/mvgroupforum.yml new file mode 100644 index 0000000..8075e64 --- /dev/null +++ b/config/prowlarr/Definitions/mvgroupforum.yml @@ -0,0 +1,227 @@ +--- +id: mvgroupforum +name: MVGroup Forum +description: "MVGroup is a Semi-Private site dedicated to UK TV and DOCUMENTARIES. This definition is for the Forum Tracker site." +language: en-US +type: semi-private +encoding: UTF-8 +links: + - https://forums.mvgroup.org/ +legacylinks: + - http://forums.mvgroup.org/ + +caps: + categories: + Other: Other + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: info_8000 + type: info + label: About MVGroup Categories + default: MVGroup does not return categories in its search results.
To add to your Apps' Torznab indexer, replace all categories with 8000(Other). + - name: hidef + type: checkbox + label: Show MVGroup HiDef Releases only + default: false + - name: withsubs + type: select + label: Subtitles + default: _ + options: + _: -OFF- + alb: Albanian + ara: Arabic + arm: Armenian + ass: Assyrian + bos: Bosnian + bul: Bulgarian + cat: Catalan + chi: "Chinese, simplified" + zho: "Chinese, traditional" + hrv: Croatian + cze: Czech + dan: Danish + dut: Dutch + eng: English + est: Estonian + fin: Finnish + fre: French + glg: Galician + geo: Georgian + ger: German + ell: Greek + heb: Hebrew + hin: Hindi + hun: Hungarian + ice: Icelandic + ind: Indonesian + ita: Italian + jpn: Japanese + kaz: Kazakh + kor: Korean + lav: Latvian + lit: Lithuanian + ltz: Luxembourgish + mac: Macedonian + may: Malay + nor: Norwegian + per: Persian + pol: Polish + por: Portuguese + rum: Romanian + rus: Russian + scc: Serbian + slo: Slovak + slv: Slovenian + spa: Spanish + swe: Swedish + tha: Thai + tur: Turkish + ukr: Ukrainian + vie: Vietnamese + - name: seed + type: checkbox + label: Only released and seeded torrents + default: false + - name: dropbbc + type: checkbox + label: Drop BBC & other channels from the front of result titles + default: false + - name: stripS01E01 + type: checkbox + label: Strip the S01E01 from the Torznab search requests + default: false + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeders: seeders + filename: title + - name: type + type: select + label: Order requested from site + default: DESC + options: + DESC: desc + ASC: asc + +login: + path: index.php?act=Login&CODE=00 + method: form + form: form[action$="act=Login&CODE=01"] + inputs: + UserName: "{{ .Config.username }}" + PassWord: "{{ .Config.password }}" + Privacy: 1 + CookieDate: 1 + CODE: 01 + referer: "https://forums.mvgroup.org/index.php?" + act: Login + error: + - selector: div.borderwrap:has(div.tablepad) + message: + selector: div.borderwrap div.tablepad + test: + path: index.php + selector: tr td.nav_mem div span[id="member_menu"], a[href^="/maintracker.php?filter="] + +search: + paths: + - path: forumtracker.php + inputs: + seed: "{{ if .Config.seed }}1{{ else }}0{{ end }}" + withsubs: "{{ re_replace .Config.withsubs \"_\" \"\" }}" + filter: "{{ if .Config.hidef }}hd+{{ else }}{{ end }}{{ .Keywords }}" + orderby: "{{ .Config.sort }}" + order: "{{ .Config.type }}" + keywordsfilters: + - name: re_replace + args: ["(?i)S01E01", "{{ if .Config.stripS01E01 }}{{ else }}S01E01{{ end }}"] # optionally remove S01E01 from search + + rows: + selector: tr:has(a.magnetlink) + + fields: + category: + text: Other + title: + selector: td.doubleindent, td.singleindent a[href^="/index.php?showtopic="] + optional: true + # fallback title (to prevent abend if optional is not found) + default: "title not found" + filters: + - name: re_replace + args: ["(?i)^BBC (.*)", "{{ if .Config.dropbbc }}{{ else }}BBC {{ end }}$1"] + - name: re_replace + args: ["(?i)^PBS (.*)", "{{ if .Config.dropbbc }}{{ else }}PBS {{ end }}$1"] + - name: re_replace + args: ["(?i)^CH5 (.*)", "{{ if .Config.dropbbc }}{{ else }}Ch5 {{ end }}$1"] + - name: re_replace + args: ["(?i)^CH4 (.*)", "{{ if .Config.dropbbc }}{{ else }}Ch4 {{ end }}$1"] + - name: re_replace + args: ["(?i)^DC (.*)", "{{ if .Config.dropbbc }}{{ else }}DC {{ end }}$1"] + - name: re_replace + args: ["(?i)^DW (.*)", "{{ if .Config.dropbbc }}{{ else }}DW {{ end }}$1"] + - name: re_replace + args: ["(?i)^HC (.*)", "{{ if .Config.dropbbc }}{{ else }}HC {{ end }}$1"] + - name: re_replace + args: ["(?i)^RTE (.*)", "{{ if .Config.dropbbc }}{{ else }}RTE {{ end }}$1"] + - name: re_replace + args: ["(?i)^ITV (.*)", "{{ if .Config.dropbbc }}{{ else }}ITV {{ end }}$1"] + - name: re_replace + args: ["(?i)^HBO (.*)", "{{ if .Config.dropbbc }}{{ else }}HBO {{ end }}$1"] + - name: re_replace + args: ["(?i)^NHK (.*)", "{{ if .Config.dropbbc }}{{ else }}NHK {{ end }}$1"] + - name: re_replace + args: ["(?i)^UKTV (.*)", "{{ if .Config.dropbbc }}{{ else }}UKTV {{ end }}$1"] + - name: re_replace + args: ["(?i)^NOVA (.*)", "{{ if .Config.dropbbc }}{{ else }}NOVA {{ end }}$1"] + - name: re_replace + args: ["(?i)^TV5Monde (.*)", "{{ if .Config.dropbbc }}{{ else }}TV5Monde {{ end }}$1"] + - name: re_replace + args: ["(?i)^Al-Jazeera (.*)", "{{ if .Config.dropbbc }}{{ else }}Al-Jazeera {{ end }}$1"] + - name: append + args: "{{ if .Config.stripS01E01 }}{{ else }} S01E01{{ end }}" + details: + optional: true + selector: td.singleindent a[href^="/index.php?showtopic="] + attribute: href + download: + selector: td a.torrentlink + attribute: href + magnet: + selector: td a.magnetlink + attribute: href + size: + text: "512 MB" + date: + selector: td:nth-of-type(3) + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "yyyy/MM/dd zzz" + seeders: + selector: td:nth-of-type(4) + leechers: + selector: td:nth-of-type(5) + grabs: + selector: td:nth-of-type(6) + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# Invision Power Board diff --git a/config/prowlarr/Definitions/mvgroupmain.yml b/config/prowlarr/Definitions/mvgroupmain.yml new file mode 100644 index 0000000..e5b2ee3 --- /dev/null +++ b/config/prowlarr/Definitions/mvgroupmain.yml @@ -0,0 +1,227 @@ +--- +id: mvgroupmain +name: MVGroup Main +description: "MVGroup is a Semi-Private site dedicated to UK TV and DOCUMENTARIES. This definition is for the Main Tracker site." +language: en-US +type: semi-private +encoding: UTF-8 +links: + - https://forums.mvgroup.org/ +legacylinks: + - http://forums.mvgroup.org/ + +caps: + categories: + Other: Other + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: info_8000 + type: info + label: About MVGroup Categories + default: MVGroup does not return categories in its search results.
To add to your Apps' Torznab indexer, replace all categories with 8000(Other). + - name: hidef + type: checkbox + label: Show MVGroup HiDef Releases only + default: false + - name: withsubs + type: select + label: Subtitles + default: _ + options: + _: -OFF- + alb: Albanian + ara: Arabic + arm: Armenian + ass: Assyrian + bos: Bosnian + bul: Bulgarian + cat: Catalan + chi: "Chinese, simplified" + zho: "Chinese, traditional" + hrv: Croatian + cze: Czech + dan: Danish + dut: Dutch + eng: English + est: Estonian + fin: Finnish + fre: French + glg: Galician + geo: Georgian + ger: German + ell: Greek + heb: Hebrew + hin: Hindi + hun: Hungarian + ice: Icelandic + ind: Indonesian + ita: Italian + jpn: Japanese + kaz: Kazakh + kor: Korean + lav: Latvian + lit: Lithuanian + ltz: Luxembourgish + mac: Macedonian + may: Malay + nor: Norwegian + per: Persian + pol: Polish + por: Portuguese + rum: Romanian + rus: Russian + scc: Serbian + slo: Slovak + slv: Slovenian + spa: Spanish + swe: Swedish + tha: Thai + tur: Turkish + ukr: Ukrainian + vie: Vietnamese + - name: seed + type: checkbox + label: Only released and seeded torrents + default: false + - name: dropbbc + type: checkbox + label: Drop BBC & other channels from the front of result titles + default: false + - name: stripS01E01 + type: checkbox + label: Strip the S01E01 from the Torznab search requests + default: false + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeders: seeders + filename: title + - name: type + type: select + label: Order requested from site + default: DESC + options: + DESC: desc + ASC: asc + +login: + path: index.php?act=Login&CODE=00 + method: form + form: form[action$="act=Login&CODE=01"] + inputs: + UserName: "{{ .Config.username }}" + PassWord: "{{ .Config.password }}" + Privacy: 1 + CookieDate: 1 + CODE: 01 + referer: "https://forums.mvgroup.org/index.php?" + act: Login + error: + - selector: div.borderwrap:has(div.tablepad) + message: + selector: div.borderwrap div.tablepad + test: + path: index.php + selector: tr td.nav_mem div span[id="member_menu"], a[href^="/forumtracker.php?filter="] + +search: + paths: + - path: maintracker.php + inputs: + seed: "{{ if .Config.seed }}1{{ else }}0{{ end }}" + withsubs: "{{ re_replace .Config.withsubs \"_\" \"\" }}" + filter: "{{ if .Config.hidef }}hd+{{ else }}{{ end }}{{ .Keywords }}" + orderby: "{{ .Config.sort }}" + order: "{{ .Config.type }}" + keywordsfilters: + - name: re_replace + args: ["(?i)S01E01", "{{ if .Config.stripS01E01 }}{{ else }}S01E01{{ end }}"] # optionally remove S01E01 from search + + rows: + selector: tr:has(a.magnetlink) + + fields: + category: + text: Other + title: + selector: td.doubleindent, td.singleindent a[href^="/index.php?showtopic="] + optional: true + # fallback title (to prevent abend if optional is not found) + default: "title not found" + filters: + - name: re_replace + args: ["(?i)^BBC (.*)", "{{ if .Config.dropbbc }}{{ else }}BBC {{ end }}$1"] + - name: re_replace + args: ["(?i)^PBS (.*)", "{{ if .Config.dropbbc }}{{ else }}PBS {{ end }}$1"] + - name: re_replace + args: ["(?i)^CH5 (.*)", "{{ if .Config.dropbbc }}{{ else }}Ch5 {{ end }}$1"] + - name: re_replace + args: ["(?i)^CH4 (.*)", "{{ if .Config.dropbbc }}{{ else }}Ch4 {{ end }}$1"] + - name: re_replace + args: ["(?i)^DC (.*)", "{{ if .Config.dropbbc }}{{ else }}DC {{ end }}$1"] + - name: re_replace + args: ["(?i)^DW (.*)", "{{ if .Config.dropbbc }}{{ else }}DW {{ end }}$1"] + - name: re_replace + args: ["(?i)^HC (.*)", "{{ if .Config.dropbbc }}{{ else }}HC {{ end }}$1"] + - name: re_replace + args: ["(?i)^RTE (.*)", "{{ if .Config.dropbbc }}{{ else }}RTE {{ end }}$1"] + - name: re_replace + args: ["(?i)^ITV (.*)", "{{ if .Config.dropbbc }}{{ else }}ITV {{ end }}$1"] + - name: re_replace + args: ["(?i)^HBO (.*)", "{{ if .Config.dropbbc }}{{ else }}HBO {{ end }}$1"] + - name: re_replace + args: ["(?i)^NHK (.*)", "{{ if .Config.dropbbc }}{{ else }}NHK {{ end }}$1"] + - name: re_replace + args: ["(?i)^UKTV (.*)", "{{ if .Config.dropbbc }}{{ else }}UKTV {{ end }}$1"] + - name: re_replace + args: ["(?i)^NOVA (.*)", "{{ if .Config.dropbbc }}{{ else }}NOVA {{ end }}$1"] + - name: re_replace + args: ["(?i)^TV5Monde (.*)", "{{ if .Config.dropbbc }}{{ else }}TV5Monde {{ end }}$1"] + - name: re_replace + args: ["(?i)^Al-Jazeera (.*)", "{{ if .Config.dropbbc }}{{ else }}Al-Jazeera {{ end }}$1"] + - name: append + args: "{{ if .Config.stripS01E01 }}{{ else }} S01E01{{ end }}" + details: + optional: true + selector: td.singleindent a[href^="/index.php?showtopic="] + attribute: href + download: + selector: td a.torrentlink + attribute: href + magnet: + selector: td a.magnetlink + attribute: href + size: + text: "512 MB" + date: + selector: td:nth-of-type(3) + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "yyyy/MM/dd zzz" + seeders: + selector: td:nth-of-type(4) + leechers: + selector: td:nth-of-type(5) + grabs: + selector: td:nth-of-type(6) + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# Invision Power Board diff --git a/config/prowlarr/Definitions/mypornclub.yml b/config/prowlarr/Definitions/mypornclub.yml new file mode 100644 index 0000000..ffe234c --- /dev/null +++ b/config/prowlarr/Definitions/mypornclub.yml @@ -0,0 +1,72 @@ +--- +id: mypornclub +name: MyPornClub +description: "MyPornClub is a Public Torrent Tracker for 3X" +language: en-US +type: public +encoding: UTF-8 +links: + - https://myporn.club/ + +caps: + categorymappings: + - {id: XXX, cat: XXX, desc: "XXX"} + + modes: + search: [q] + +settings: + - name: flaresolverr + type: info + label: FlareSolverr + default: This site may use Cloudflare DDoS Protection, therefore Prowlarr requires FlareSolverr to access it. + +download: + selectors: + - selector: a[href^="magnet:?xt="] + attribute: href + filters: + - name: re_replace + args: ["\\s+", " "] + +search: + paths: + - path: "{{ if .Keywords }}s/{{ re_replace .Keywords \"\\s+\" \"-\" }}{{ else }}ts{{ end }}" + + rows: + selector: div.torrents_list > div.torrent_element + filters: + - name: andmatch + + fields: + category: + text: XXX + title: + selector: a[href^="/t/"] + remove: i + details: + selector: a[href^="/t/"] + attribute: href + download: + selector: a[href^="/t/"] + attribute: href + date: + selector: div.torrent_element_info span:nth-child(2) + filters: + - name: replace + args: ["Last year", "1 year ago"] + - name: replace + args: ["Last month", "1 month ago"] + size: + selector: div.torrent_element_info span:nth-child(4) + grabs: + selector: div.torrent_element_info span:nth-child(8) + seeders: + selector: div.torrent_element_info span:nth-child(10) + leechers: + selector: div.torrent_element_info span:nth-child(12) + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/myspleen.yml b/config/prowlarr/Definitions/myspleen.yml new file mode 100644 index 0000000..e993ba6 --- /dev/null +++ b/config/prowlarr/Definitions/myspleen.yml @@ -0,0 +1,99 @@ +--- +id: myspleen +name: MySpleen +description: "MySpleen is a Private Torrent Tracker for TV / COMEDY / ANIMATION / 80-90’S VHS NOSTALGIA" +language: en-US +type: private +encoding: UTF-8 +links: + - https://www.myspleen.org/ + +caps: + categorymappings: + - {id: 31, cat: TV, desc: "Adult Swim"} + - {id: 30, cat: TV, desc: "Animation"} + - {id: 25, cat: TV, desc: "Cartoon Network"} + - {id: 3, cat: TV, desc: "Comedy"} + - {id: 26, cat: TV, desc: "Comedy Central"} + - {id: 24, cat: TV, desc: "MST3K"} + - {id: 28, cat: TV, desc: "MTV"} + - {id: 29, cat: TV, desc: "Nick"} + - {id: 20, cat: Other, desc: "Other"} + - {id: 32, cat: TV, desc: "Star Wars"} + + modes: + search: [q] + tv-search: [q, season, ep] + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + returnto: / + error: + - selector: div#content:has(h3:contains("Login Failed")) + test: + path: browse.php + selector: span.key:contains("Ratio") + span.value + +search: + paths: + - path: browse.php + method: get + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + incldead: 1 + title: 0 + + rows: + selector: table#main-torrents > tbody > tr + + fields: + category: + selector: td[class^="cat-"] > a + attribute: href + filters: + - name: querystring + args: cat + title: + selector: td.tor-name > a + attribute: title + details: + selector: td.tor-name > a + attribute: href + download: + selector: td.tor-down > a + attribute: href + files: + selector: td:nth-child(5) + date: + selector: td:nth-child(7) + size: + selector: td:nth-child(8) + grabs: + selector: td:nth-child(9) + filters: + - name: regexp + args: "(\\d+)" + seeders: + selector: td:nth-child(10) + filters: + - name: regexp + args: "^(\\d+)" + leechers: + selector: td:nth-child(11) + filters: + - name: regexp + args: "^(\\d+)" + downloadvolumefactor: + case: + span.star: 0 + span.fltime: 0 + ":root li[id=\"alert-fl\"][class=\"alert\"]:contains(\"Freeleech ends in \")": 0 + "*": 1 + uploadvolumefactor: + text: 1 +# engine tbd diff --git a/config/prowlarr/Definitions/ncore.yml b/config/prowlarr/Definitions/ncore.yml new file mode 100644 index 0000000..4d5f831 --- /dev/null +++ b/config/prowlarr/Definitions/ncore.yml @@ -0,0 +1,170 @@ +--- +id: ncore +name: nCore +description: "nCore is a Hungarian Private Torrent Tracker for Movies/Series/General" +language: hu-HU +type: private +encoding: UTF-8 +links: + - https://ncore.pro/ + +caps: + categorymappings: + # E-book + - {id: ebook, cat: Books, desc: "E-book/Eng"} + - {id: ebook_hun, cat: Books, desc: "E-book/Hun"} + # Játék + - {id: console, cat: Console, desc: "Játék/Console"} + - {id: game_iso, cat: PC/Games, desc: "Játék/ISO"} + - {id: game_rip, cat: PC/Games, desc: "Játék/Rip"} + # Filmek + - {id: xvid_hun, cat: Movies/SD, desc: "Film/SD/Hun"} + - {id: xvid, cat: Movies/SD, desc: "Film/SD/Eng"} + - {id: dvd_hun, cat: Movies/DVD, desc: "Film/DVD/Hun"} + - {id: dvd, cat: Movies/DVD, desc: "Film/DVD/Eng"} + - {id: dvd9_hun, cat: Movies/DVD, desc: "Film/Dvd9/Hun"} + - {id: dvd9, cat: Movies/DVD, desc: "Film/Dvd9/Eng"} + - {id: hd_hun, cat: Movies/HD, desc: "Film/HD/Hun"} + - {id: hd, cat: Movies/HD, desc: "Film/HD/Eng"} + # Sorozatok + - {id: xvidser, cat: TV/SD, desc: "Sorozat/SD/Eng"} + - {id: xvidser_hun, cat: TV/SD, desc: "Sorozat/SD/Hun"} + - {id: dvdser, cat: TV/Other, desc: "Sorozat/DVDR/Eng"} + - {id: dvdser_hun, cat: TV/Other, desc: "Sorozat/DVDR/Hun"} + - {id: hdser, cat: TV/HD, desc: "Sorozat/HD/Eng"} + - {id: hdser_hun, cat: TV/HD, desc: "Sorozat/HD/Hun"} + # Zene + - {id: mp3_hun, cat: Audio/MP3, desc: "Zene/MP3/Hun"} + - {id: mp3, cat: Audio/MP3, desc: "Zene/MP3/Eng"} + - {id: lossless_hun, cat: Audio/MP3, desc: "Zene/Lossless/Hun"} + - {id: lossless, cat: Audio/MP3, desc: "Zene/Lossless/Eng"} + - {id: clip, cat: Audio/Video, desc: "Zene/Klip"} + # Program + - {id: iso, cat: PC/ISO, desc: "Win/Program/ISO"} + - {id: misc, cat: PC/0day, desc: "Win/Program/Rip"} + - {id: mobil, cat: PC/Mobile-Other, desc: "Win/Program/Rip"} + # Felnőtt tartalom + - {id: xxx_xvid, cat: XXX/SD, desc: "XXX/Film/SD"} + - {id: xxx_dvd, cat: XXX/DVD, desc: "XXX/DVDR"} + - {id: xxx_hd, cat: XXX/UHD, desc: "XXX/HD"} + - {id: xxx_imageset, cat: XXX/ImageSet, desc: "XXX/Kép"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: 2facode + type: text + label: 2FA code + - name: info_2fa + type: info + label: "About 2FA code" + default: "Only fill in the 2FA code box if you have enabled 2FA on the nCore Web Site. Otherwise just leave it empty." + +login: + method: form + path: login.php?set_lang=en + submitpath: login.php + inputs: + nev: "{{ .Config.username }}" + pass: "{{ .Config.password }}" + 2factor: "{{ .Config.2facode }}" + ne_leptessen_ki: "1" + set_lang: "en" + submitted: "1" + error: + - selector: div#hibauzenet table td:contains("!") + test: + path: index.php + selector: a[href*="profile.php"] + +download: + selectors: + - selector: a[href^="torrents.php"] + attribute: href + +search: + paths: + - path: torrents.php + followredirect: true + inputs: + nyit_filmek_resz: "true" + nyit_sorozat_resz: "true" + nyit_zene_resz: "true" + nyit_xxx_resz: "true" + nyit_jatek_resz: "true" + nyit_prog_resz: "true" + nyit_konyv_resz: "true" + mire: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + miben: "{{ if .Query.IMDBID }}imdb{{ else }}name{{ end }}" + tipus: "{{ if .Categories }}kivalasztottak_kozott{{ else }}all_own{{ end }}" + submit.x: "1" + submit.y: "18" + tags: "" + $raw: "{{range .Categories}}&kivalasztott_tipus%5B%5D={{.}}{{end}}" + + rows: + selector: .box_torrent_all .box_torrent + + fields: + category: + selector: .box_alap_img > a[href^="/torrents.php?tipus="] + attribute: href + filters: + - name: querystring + args: tipus + - name: trim + title: + selector: div[class^="torrent_txt"] > a + attribute: title + details: + selector: div[class^="torrent_txt"] > a + attribute: href + filters: + - name: querystring + args: id + - name: prepend + args: "torrents.php?action=details&id=" + download: + selector: div[class^="torrent_txt"] > a + attribute: href + filters: + - name: querystring + args: id + - name: prepend + args: "ajax.php?action=torrent_drop&id=" + poster: + selector: img.infobar_ico[onmouseover] + attribute: onmouseover + filters: + - name: regexp + args: "'(.+?)'" + size: + selector: .box_meret2 + seeders: + selector: .box_s2 + leechers: + selector: .box_l2 + date: + selector: .box_feltoltve2 + filters: + - name: replace + args: ["
", " "] + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss" + minimumratio: + text: 1.0 + minimumseedtime: + text: 172800 + +# engine n/a diff --git a/config/prowlarr/Definitions/nethd.yml b/config/prowlarr/Definitions/nethd.yml new file mode 100644 index 0000000..cf6e896 --- /dev/null +++ b/config/prowlarr/Definitions/nethd.yml @@ -0,0 +1,172 @@ +--- +id: nethd +name: NetHD +description: "NetHD (VietTorrent) is a VIETNAMESE Semi-Private Torrent Tracker for HD MOVIES / TV" +language: vi-VN +type: semi-private +encoding: UTF-8 +links: + - https://nethd.org/ +legacylinks: + - http://nethd.org/ # site forces https + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "Movies"} + - {id: 402, cat: Audio, desc: "Music"} + - {id: 403, cat: PC/Games, desc: "Game"} + - {id: 404, cat: PC, desc: "Software"} + - {id: 405, cat: Other, desc: "Image"} + - {id: 406, cat: Books, desc: "Book"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: form#loginform > span.warning + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat={{.}}&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # 0 title, 1 descr, 2 uploader, 4 imdb url + search_area: "{{ if .Query.IMDBID }}4{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 exact + search_mode: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xFree, 4 50%, 6 2x 50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 incldead, 1 active , 2 dead + incldead: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: tr:has(td.name) + filters: + - name: andmatch + + fields: + category: + selector: td.category > a + attribute: href + filters: + - name: querystring + args: cat + title: + selector: td.name > div > a[href*="-torrent-"][title] + attribute: title + details: + selector: td.name > div > a[href*="-torrent-"][title] + attribute: href + poster: + selector: td.name > a.poster-preview img + attribute: src + download: + selector: td.name > div > a[href*="-torrent-"][title] + attribute: href + filters: + - name: regexp + args: "-torrent-(\\d+).html" + - name: prepend + args: "download.php?id=" + date_year: + # 2021-08-13
09:32:42 + selector: td:nth-child(5):contains("-") + optional: true + filters: + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss" + date_ago: + # 2 ngày
23 giờ + selector: td:nth-child(5):not(:contains("-")) + optional: true + filters: + - name: re_replace + args: ["năm", "years "] + - name: re_replace + args: ["tháng", "months "] + - name: re_replace + args: ["ngày", "days "] + - name: re_replace + args: ["phút", "minutes "] + - name: re_replace + args: ["giờ", "hours "] + - name: timeago + date: + text: "{{ if or .Result.date_year .Result.date_ago }}{{ or .Result.date_year .Result.date_ago }}{{ else }}now{{ end }}" + size: + selector: td:nth-child(6) + seeders: + selector: td:nth-child(7) + leechers: + selector: td:nth-child(8) + grabs: + selector: td:nth-child(9) + downloadvolumefactor: + case: + "span.label:contains(\"Free\")": 0 + "span.label:contains(\"50%\")": 0.5 + "span.label:contains(\"30%\")": 0.7 + "*": 1 + uploadvolumefactor: + case: + "span.label:contains(\"2X\")": 2 + "*": 1 + minimumratio: + text: 0.5 + description: + selector: td:nth-child(3) > div:nth-child(2) + remove: a, b, font, img, span +# NexusPHP 1.0 diff --git a/config/prowlarr/Definitions/newretro.yml b/config/prowlarr/Definitions/newretro.yml new file mode 100644 index 0000000..d6befd6 --- /dev/null +++ b/config/prowlarr/Definitions/newretro.yml @@ -0,0 +1,174 @@ +--- +id: newretro +name: The New Retro +description: "The New Retro is a GERMAN Private Torrent Tracker for MOVIES / TV / GENERAL" +language: de-DE +type: private +encoding: UTF-8 +links: + - https://new-retro.eu/ + +caps: + categorymappings: + - {id: 119, cat: Other, desc: "Bilder"} + - {id: 139, cat: TV/Documentary, desc: "Doku - HD"} + - {id: 141, cat: TV/Documentary, desc: "Doku - Pack"} + - {id: 140, cat: TV/Documentary, desc: "Doku - SD"} + - {id: 142, cat: TV, desc: "Doku - Sonstige"} + - {id: 120, cat: Books, desc: "Ebook"} + - {id: 131, cat: TV/Anime, desc: "Filme - Anime"} + - {id: 101, cat: Movies/BluRay, desc: "Filme - Blue Ray"} + - {id: 102, cat: Movies/Other, desc: "Filme - Bollywood"} + - {id: 103, cat: Movies/DVD, desc: "Filme - DVD"} + - {id: 104, cat: Movies/DVD, desc: "Filme - DVD-R"} + - {id: 135, cat: Movies/HD, desc: "Filme - HD"} + - {id: 130, cat: Movies, desc: "Filme - Klassiker"} + - {id: 134, cat: Movies/SD, desc: "Filme - SD"} + - {id: 136, cat: Movies/UHD, desc: "Filme - UHD"} + - {id: 105, cat: Movies, desc: "Filme - x264/x265"} + - {id: 106, cat: Movies/SD, desc: "Filme - XviD / DivX"} + - {id: 127, cat: Other, desc: "Für Unsere kleinsten"} + - {id: 121, cat: Other, desc: "Handy Stuff"} + - {id: 124, cat: Audio, desc: "Musik - Alben"} + - {id: 123, cat: Audio, desc: "Musik - Discography"} + - {id: 122, cat: Audio/Audiobook, desc: "Musik - Hörbuch"} + - {id: 133, cat: Audio/MP3, desc: "Musik - MP3/Mp4"} + - {id: 125, cat: Audio/Video, desc: "Musik - Video"} + - {id: 113, cat: PC, desc: "Programme - Linux"} + - {id: 114, cat: PC/Mac, desc: "Programme - Mac"} + - {id: 115, cat: PC/0day, desc: "Programme - Windows"} + - {id: 137, cat: TV/HD, desc: "Serien - HD"} + - {id: 116, cat: TV, desc: "Serien - Pack"} + - {id: 138, cat: TV/SD, desc: "Serien - SD"} + - {id: 143, cat: TV/Other, desc: "Serien - Sonstige"} + - {id: 144, cat: TV/UHD, desc: "Serien - UHD"} + - {id: 129, cat: Other, desc: "Sonstiges"} + - {id: 109, cat: PC/Mobile-Other, desc: "Spiele - Handy"} + - {id: 112, cat: Console, desc: "Spiele - Konsolen"} + - {id: 111, cat: PC/Games, desc: "Spiele - Mac / Linux"} + - {id: 110, cat: PC/Games, desc: "Spiele - PC"} + - {id: 118, cat: TV/Sport, desc: "WWE - Sport"} + - {id: 69, cat: XXX, desc: "XXX"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: pin + type: text + label: Pin + - name: onlyupload + type: checkbox + label: Filter OnlyUpload only + default: false + - name: info_free + type: info + label: About OnlyUpload at The New Retro + default: "
  • OnlyUpload are torrents where download is not counted but upload is. Good for building your Ratio up. (On the Prowlarr search results page these are tagged as Freeleech).
" + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeds: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents pro Seite: setting to 100 on your Control Panel. The default is 15. + +login: + path: login.php + method: form + cookies: ["JAVA=OK"] # avoid jscheck redirect + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + secure_pin: "{{ .Config.pin }}" + returnto: / + error: + - selector: table.tableinborder:contains("Anmeldung Gescheitert!") > tbody > tr > td.tablea + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + showsearch: 1 + # 0 active, 1 all, 2 dead + incldead: 1 + orderby: "{{ .Config.sort }}" + sort: "{{ .Config.type }}" + # site does not support imdbid searching or display imdb links in results. + + rows: + selector: "table.tableinborder > tbody > tr:has(a[href^=\"download.php?torrent=\"]){{ if .Config.onlyupload }}:has(img[src=\"pic/oupic.gif\"]){{ else }}{{ end }}" + filters: + - name: andmatch + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="]:has(b) + details: + selector: td.content_wrap > table > tbody > tr:nth-child(2) > td:nth-child(4) > a + attribute: href + download: + selector: a[href^="download.php?torrent="] + attribute: href + size: + selector: td.content_wrap > table > tbody > tr:nth-child(2) > td:nth-child(1) > b:nth-child(1) + grabs: + selector: td.content_wrap > table > tbody > tr:nth-child(2) > td:nth-child(3) > b + files: + selector: td.content_wrap > table > tbody > tr:nth-child(2) > td:nth-child(1) > b:nth-child(2) + seeders: + selector: td.content_wrap > table > tbody > tr:nth-child(2) > td:nth-child(2) > b:nth-child(1) + leechers: + selector: td.content_wrap > table > tbody > tr:nth-child(2) > td:nth-child(2) > b:nth-child(3) + date: + selector: td.content_wrap > table > tbody > tr:nth-child(2) > td:nth-child(5) + filters: + - name: replace + args: ["\u00a0", " "] + - name: append + args: " +01:00" # CET + - name: dateparse + args: "dd.MM.yyyy HH:mm:ss zzz" + downloadvolumefactor: + case: + img[src="pic/oupic.gif"]: 0 # only upload is counted + "*": 1 + uploadvolumefactor: + case: + img[src="pic/freeleech.gif"]: 0 # nothing is counted + "*": 1 +# engine tbd diff --git a/config/prowlarr/Definitions/newstudio.yml b/config/prowlarr/Definitions/newstudio.yml new file mode 100644 index 0000000..4f74a11 --- /dev/null +++ b/config/prowlarr/Definitions/newstudio.yml @@ -0,0 +1,166 @@ +--- +id: newstudio +name: NewStudio +description: "NewStudio is a RUSSIAN Public site for TV" +language: ru-RU +type: public +encoding: UTF-8 +requestDelay: 2 +links: + - https://newstudio.tv/ +legacylinks: + - http://newstudio.tv/ + +caps: + categorymappings: + - {id: 6, cat: TV, desc: "TV series"} + + modes: + search: [q] + tv-search: [q, season, ep] + +settings: + - name: stripcyrillic + type: checkbox + label: Strip Cyrillic Letters + default: false + - name: addrussiantotitle + type: checkbox + label: Add RUS to end of all titles to improve language detection by Sonarr and Radarr. Will cause English-only results to be misidentified. + default: false + - name: sort + type: select + label: Sort requested from site + default: 1 + options: + 1: created + 10: seeders + 7: size + 2: title + - name: type + type: select + label: Order requested from site + default: 2 + options: + 2: desc + 1: asc + +search: + paths: + - path: tracker.php + - path: tracker.php + inputs: + start: 50 + inputs: + nm: "{{ .Keywords }}" + o: "{{ .Config.sort }}" + s: "{{ .Config.type }}" + + keywordsfilters: + # strip season and/or ep + - name: re_replace + args: ["(?i)\\b(?:[SE]\\d{1,4}){1,2}\\b\\s?", ""] + + rows: + selector: table.well > tbody > tr:has(a[href^="./viewtopic.php?t="]) + filters: + - name: andmatch + + fields: + category: + # add category for Sonarr + text: 6 + title: + selector: a[href^="./viewtopic.php?t="] > b + filters: + - name: re_replace + args: ["(?i)Сезон\\s*(\\d+).+Серия\\s*(\\d+)", "S$1E$2"] + - name: re_replace + args: ["(?i)Сезон\\s*(\\d+)", "S$1"] + - name: re_replace + args: ["(\\([\\p{IsCyrillic}\\W]+\\))|(^[\\p{IsCyrillic}\\W\\d]+\\/ )|([\\p{IsCyrillic} \\-]+,+)|([\\p{IsCyrillic}]+)", "{{ if .Config.stripcyrillic }}{{ else }}$1$2$3$4{{ end }}"] + - name: re_replace + args: ["(?i)\\bHDTV[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bSAT[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bWEB[-\\s]?DL[-\\s]?Rip\\b", "WEB-DL"] + - name: re_replace + args: ["(?i)\\bWEB\\sRip\\b", "WEBRip"] + - name: re_replace + args: ["(?i)\\bWEB\\sDL\\b", "WEB-DL"] + - name: re_replace + args: ["[\\[\\(\\{<«][\\s\\W]*[\\]\\)\\}>»]", ""] + - name: re_replace + args: ["^[\\s&,\\.!\\?\\+\\-_\\|\\/':]+", ""] + - name: re_replace + args: ["(?i)^\\(\\s*([SE]\\d+.*?)\\s*\\)[\\s\\/\\|]*(.+)", "$2 $1"] + - name: append + args: "{{ if .Config.addrussiantotitle }} RUS{{ else }}{{ end }}" + - name: append + args: "-NewStudio" + details: + selector: a[href^="./viewtopic.php?t="] + attribute: href + download: + selector: a[href^="./download.php?id="] + attribute: href + poster: + selector: td:nth-child(3) > a > img + attribute: src + size: + selector: td:nth-child(5) > a + date: + # 16-Nov-17, Today 01:34 + # 16-Ноя-17, Сегодня 12:34 + # 15-Nov-17, Yesterday 17:20 + # 15-Ноя-17, Вчера 12:40 + # 4-Nov-17, 23:50 + # 14-Ноя-17, 06:11 + selector: td:nth-child(6) + filters: + # replace white spaces + - name: re_replace + args: ["(Сегодня|Вчера|\\s|,|-)+", " "] + - name: re_replace + args: ["(Today|Yesterday|\\s|,|-)+", " "] + # replace month abbreviations + - name: replace + args: ["Янв", "Jan"] + - name: replace + args: ["Фев", "Feb"] + - name: replace + args: ["Мар", "Mar"] + - name: replace + args: ["Апр", "Apr"] + - name: replace + args: ["Май", "May"] + - name: replace + args: ["Июн", "Jun"] + - name: replace + args: ["Июл", "Jul"] + - name: replace + args: ["Авг", "Aug"] + - name: replace + args: ["Сен", "Sep"] + - name: replace + args: ["Окт", "Oct"] + - name: replace + args: ["Ноя", "Nov"] + - name: replace + args: ["Дек", "Dec"] + - name: append + args: ":00 +03:00" # MSK + - name: dateparse + args: "d MMM yy HH:mm:ss zzz" + seeders: + text: 1 + leechers: + text: 1 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 + description: + selector: a[href^="./viewtopic.php?t="] > b +# engine n/a diff --git a/config/prowlarr/Definitions/newstudiol.yml b/config/prowlarr/Definitions/newstudiol.yml new file mode 100644 index 0000000..b890fc7 --- /dev/null +++ b/config/prowlarr/Definitions/newstudiol.yml @@ -0,0 +1,193 @@ +--- +id: newstudiol +name: NewStudioL +description: "NewStudio is a RUSSIAN Public site for TV. This supports login." +language: ru-RU +type: semi-private +encoding: UTF-8 +requestDelay: 2 +links: + - https://newstudio.tv/ +legacylinks: + - http://newstudio.tv/ + +caps: + categorymappings: + - {id: 6, cat: TV, desc: "TV series"} + + modes: + search: [q] + tv-search: [q, season, ep] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: stripcyrillic + type: checkbox + label: Strip Cyrillic Letters + default: false + - name: addrussiantotitle + type: checkbox + label: Add RUS to end of all titles to improve language detection by Sonarr and Radarr. Will cause English-only results to be misidentified. + default: false + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 1 + options: + 1: created + 10: seeders + 7: size + 2: title + - name: type + type: select + label: Order requested from site + default: 2 + options: + 2: desc + 1: asc + +login: + path: login.php + method: post + inputs: + login: 1 + login_username: "{{ .Config.username }}" + login_password: "{{ .Config.password }}" + error: + - selector: div.alert-error + test: + path: / + selector: a[href="/login.php?logout=1"] + +search: + paths: + - path: tracker.php + - path: tracker.php + inputs: + start: 50 + inputs: + nm: "{{ .Keywords }}" + o: "{{ .Config.sort }}" + s: "{{ .Config.type }}" + tor_type: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + + keywordsfilters: + # strip season and/or ep + - name: re_replace + args: ["(?i)\\b(?:[SE]\\d{1,4}){1,2}\\b\\s?", ""] + + rows: + selector: table.well > tbody > tr:has(a[href^="./viewtopic.php?t="]) + filters: + - name: andmatch + + fields: + category: + # add category for Sonarr + text: 6 + title: + selector: a[href^="./viewtopic.php?t="] > b + filters: + - name: re_replace + args: ["(?i)Сезон\\s*(\\d+).+Серия\\s*(\\d+)", "S$1E$2"] + - name: re_replace + args: ["(?i)Сезон\\s*(\\d+)", "S$1"] + - name: re_replace + args: ["(\\([\\p{IsCyrillic}\\W]+\\))|(^[\\p{IsCyrillic}\\W\\d]+\\/ )|([\\p{IsCyrillic} \\-]+,+)|([\\p{IsCyrillic}]+)", "{{ if .Config.stripcyrillic }}{{ else }}$1$2$3$4{{ end }}"] + - name: re_replace + args: ["(?i)\\bHDTV[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bSAT[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bWEB[-\\s]?DL[-\\s]?Rip\\b", "WEB-DL"] + - name: re_replace + args: ["(?i)\\bWEB\\sRip\\b", "WEBRip"] + - name: re_replace + args: ["(?i)\\bWEB\\sDL\\b", "WEB-DL"] + - name: re_replace + args: ["[\\[\\(\\{<«][\\s\\W]*[\\]\\)\\}>»]", ""] + - name: re_replace + args: ["^[\\s&,\\.!\\?\\+\\-_\\|\\/':]+", ""] + - name: re_replace + args: ["(?i)^\\(\\s*([SE]\\d+.*?)\\s*\\)[\\s\\/\\|]*(.+)", "$2 $1"] + - name: append + args: "{{ if .Config.addrussiantotitle }} RUS{{ else }}{{ end }}" + - name: append + args: "-NewStudio" + details: + selector: a[href^="./viewtopic.php?t="] + attribute: href + download: + selector: a[href^="./download.php?id="] + attribute: href + poster: + selector: td:nth-child(3) > a > img + attribute: src + size: + selector: td:nth-child(5) > a + date: + # 16-Nov-17, Today 01:34 + # 16-Ноя-17, Сегодня 12:34 + # 15-Nov-17, Yesterday 17:20 + # 15-Ноя-17, Вчера 12:40 + # 4-Nov-17, 23:50 + # 14-Ноя-17, 06:11 + selector: td:nth-child(6) + filters: + # replace white spaces + - name: re_replace + args: ["(Сегодня|Вчера|\\s|,|-)+", " "] + - name: re_replace + args: ["(Today|Yesterday|\\s|,|-)+", " "] + # replace month abbreviations + - name: replace + args: ["Янв", "Jan"] + - name: replace + args: ["Фев", "Feb"] + - name: replace + args: ["Мар", "Mar"] + - name: replace + args: ["Апр", "Apr"] + - name: replace + args: ["Май", "May"] + - name: replace + args: ["Июн", "Jun"] + - name: replace + args: ["Июл", "Jul"] + - name: replace + args: ["Авг", "Aug"] + - name: replace + args: ["Сен", "Sep"] + - name: replace + args: ["Окт", "Oct"] + - name: replace + args: ["Ноя", "Nov"] + - name: replace + args: ["Дек", "Dec"] + - name: append + args: ":00 +03:00" # MSK + - name: dateparse + args: "d MMM yy HH:mm:ss zzz" + seeders: + text: 1 + leechers: + text: 1 + downloadvolumefactor: + case: + img[src="images/tor_gold.gif"]: 0 + img[src="images/tor_silver.gif"]: 0.5 + "*": 1 + uploadvolumefactor: + text: 1 + description: + selector: a[href^="./viewtopic.php?t="] > b +# engine n/a diff --git a/config/prowlarr/Definitions/nextjav.yml b/config/prowlarr/Definitions/nextjav.yml new file mode 100644 index 0000000..3fdf272 --- /dev/null +++ b/config/prowlarr/Definitions/nextjav.yml @@ -0,0 +1,66 @@ +--- +id: nextjav +name: NextJAV +description: "NextJAV is a Public tracker for Asian 3X (JAV)" +language: en-US +type: public +encoding: UTF-8 +requestDelay: 2 +links: + - https://nextjav.com/ + +caps: + categories: + XXX: XXX + + modes: + search: [q] + +settings: [] + +download: + selectors: + - selector: a.btn-download + attribute: href + +search: + paths: + - path: "{{ if .Keywords }}search/torrent?torrentsearch={{ .Keywords }}{{ else }}{{ end }}" + + rows: + selector: div.status-publish + + fields: + category: + text: XXX + title: + selector: a[href^="/torrent/detail/"] + attribute: href + filters: + - name: split + args: ["/", 3] + details: + selector: a[href^="/torrent/detail/"] + attribute: href + download: + selector: a[href^="/torrent/detail/"] + attribute: href + poster: + selector: img + attribute: src + date: + text: now + size: + selector: h2 + filters: + - name: regexp + args: (\d+\.\d+ GB)$ + seeders: + text: 1 + leechers: + text: 1 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/nicept.yml b/config/prowlarr/Definitions/nicept.yml new file mode 100644 index 0000000..73355f7 --- /dev/null +++ b/config/prowlarr/Definitions/nicept.yml @@ -0,0 +1,186 @@ +--- +id: nicept +name: NicePT +description: "NicePT is a CHINESE Private Torrent Tracker for 3X" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://www.nicept.net/ + +caps: + categorymappings: + - {id: 500, cat: XXX, desc: "日本有码"} + - {id: 401, cat: XXX, desc: "日本无码"} + - {id: 402, cat: XXX, desc: "欧美"} + - {id: 501, cat: XXX, desc: "其他(限制级)"} + - {id: 403, cat: XXX/Other, desc: "动漫(限制级)"} + - {id: 503, cat: XXX, desc: "真人秀,自拍(限制级)"} + - {id: 404, cat: XXX/ImageSet, desc: "写真、套图"} + - {id: 504, cat: XXX, desc: "SM调教(限制级)"} + + modes: + search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: 2facode + type: text + label: 2FA code + - name: info_2fa + type: info + label: "About 2FA code" + default: "Only fill in the 2FA code box if you have enabled 2FA on the NicePT Web Site. Otherwise just leave it empty." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + secret: "" + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + two_step_code: "{{ .Config.2facode }}" + error: + - selector: td.embedded:has(h2:contains("失败")) + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl (unused) + search_area: 0 + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(a[href^="details.php?id="]) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: img[data-src] + attribute: data-src + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-child(5) + seeders: + selector: td.rowfollow:nth-child(6) + leechers: + selector: td.rowfollow:nth-child(7) + grabs: + selector: td.rowfollow:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 3 days (as seconds = 3 x 24 x 60 x 60) + text: 259200 + description_verified: + case: + span[title="通过"], span[title="通過"], span[title="Allowed"]: "Verified:" + span[title="未审"], span[title="未審"], span[title="Not reviewed"]: "Unverified:" + span[title="拒绝"], span[title="拒絕"], span[title="Denied"]: "Banned:" + description: + selector: td.rowfollow:nth-child(2) + remove: a, b, font, img, span + filters: + - name: prepend + args: "{{ .Result.description_verified }} " +# NexusPHP v1.8.4 2023-06-18 diff --git a/config/prowlarr/Definitions/nipponsei.yml b/config/prowlarr/Definitions/nipponsei.yml new file mode 100644 index 0000000..8bb8b18 --- /dev/null +++ b/config/prowlarr/Definitions/nipponsei.yml @@ -0,0 +1,66 @@ +--- +id: nipponsei +name: Nipponsei +description: "Nipponsei is a Public site for MUSIC fresh from Japan" +language: en-US +type: public +encoding: UTF-8 +links: + - https://nipponsei.minglong.org/ + +caps: + categorymappings: + - {id: music, cat: Audio, desc: Music} + + modes: + search: [q] + music-search: [q] + +settings: [] + +search: + # https://nipponsei.minglong.org/index.php?section=Tracker&search=Kanojo+mo+Kanojo+ED+Single + paths: + - path: index.php + inputs: + section: Tracker + search: "{{ .Keywords }}" + + rows: + selector: tr.odd, tr.even + + fields: + category: + text: music + title: + selector: a + filters: + - name: replace + args: ["[Nipponsei] ", ""] + details: + text: / + download: + selector: a + attribute: href + date: + selector: td.date + optional: true + default: now + filters: + - name: dateparse + args: "yyyy-MM-dd HH:mm" + size: + selector: td.bytes + optional: true + default: 128 MB + seeders: + selector: "{{ if .Keywords }}td:nth-child(2){{ else }}td:nth-child(4){{ end }}" + leechers: + selector: "{{ if .Keywords }}td:nth-child(3){{ else }}td:nth-child(5){{ end }}" + grabs: + selector: td.number + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/nntt.yml b/config/prowlarr/Definitions/nntt.yml new file mode 100644 index 0000000..0ef0cca --- /dev/null +++ b/config/prowlarr/Definitions/nntt.yml @@ -0,0 +1,842 @@ +--- +id: nntt +name: NNTT +description: "NNTT is a RUSSIAN Public Torrent Tracker for MOVIES / TV / GENERAL" +language: ru-RU +type: public +encoding: UTF-8 +links: + - http://www.nntt.org/ # site does not support https ERR_CONNECTION_REFUSED +legacylinks: + - https://nntt.black-mirror.xyz/ + - https://nntt.unblocked.casa/ + - https://nntt.proxyportal.fun/ + - https://nntt.uk-unblock.xyz/ + - https://nntt.ind-unblock.xyz/ + - https://nntt.unblocked.bar/ # .torrent downloads fail in Prowlarr but work in browser + - https://nntt.proxyportal.pw/ # .torrent downloads fail in Prowlarr but work in browser + - https://nntt.uk-unblock.pro/ # .torrent downloads fail in Prowlarr but work in browser + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Кино, Видео и ТВ"} + - {id: 154, cat: Movies/HD, desc: "Зарубежное кино (HD Video)"} + - {id: 153, cat: Movies/DVD, desc: "Зарубежное кино (DVD Video)"} + - {id: 157, cat: Movies/3D, desc: "Кино в 3D"} + - {id: 5, cat: Movies/SD, desc: "Зарубежное кино (DVDRip, HQRip)"} + - {id: 6, cat: Movies/Foreign, desc: "Наше кино (DVDRip, HQRip)"} + - {id: 235, cat: Movies/Other, desc: "Мультфильмы и мультсериалы"} + - {id: 270, cat: TV, desc: "Сериалы"} + - {id: 12, cat: TV/Documentary, desc: "Документальные фильмы и телепередачи"} + - {id: 350, cat: TV/Anime, desc: "Аниме"} + - {id: 824, cat: TV/Sport, desc: "Спорт"} + - {id: 9, cat: TV/Other, desc: "TV, развлекательные шоу, приколы и юмор"} + - {id: 758, cat: Audio, desc: "Музыка"} + - {id: 943, cat: Audio/Lossless, desc: "Lossless"} + - {id: 1046, cat: Audio/Video, desc: "Музыкальное видео"} + - {id: 616, cat: Audio/Audiobook, desc: "Аудиокниги"} + - {id: 614, cat: Books, desc: "Книги"} + - {id: 617, cat: Books/Mags, desc: "Журналы"} + - {id: 488, cat: PC, desc: "Программы"} + - {id: 492, cat: PC/Mac, desc: "ОС и ПО для Apple Macintosh"} + - {id: 799, cat: PC/Mobile-iOS, desc: "iPhone, iPod Touch, iPad"} + - {id: 800, cat: PC/Mobile-Android, desc: "Android"} + - {id: 400, cat: PC/Games, desc: "Игры"} + - {id: 748, cat: Console, desc: "Консольные игры"} + - {id: 686, cat: XXX, desc: "Эротика и Pron"} + + - {id: 4, cat: Other, desc: "HD, DVD, 3D фильмы"} + - {id: 152, cat: Other, desc: "Архив (HD, DVD, 3D Video)"} + - {id: 156, cat: Other, desc: "Наше кино (HD Video)"} + - {id: 155, cat: Other, desc: "Наше кино (DVD Video)"} + - {id: 159, cat: Other, desc: "Классика зарубежного кино"} + - {id: 160, cat: Other, desc: "Азиатское кино"} + - {id: 161, cat: Other, desc: "Индийское кино"} + - {id: 162, cat: Other, desc: "Фильмы без перевода (Зарубежное кино)"} + - {id: 164, cat: Other, desc: "Зарубежное кино, экранки (CamRip, TS, Screener)"} + - {id: 165, cat: Other, desc: "Архив (Наше кино)"} + - {id: 166, cat: Other, desc: "Кино СССР"} + - {id: 167, cat: Other, desc: "Многосерийные фильмы СССР"} + - {id: 168, cat: Other, desc: "Нелицензионные сборники на DVD (Наше)"} + - {id: 169, cat: Other, desc: "Наше кино, экранки (CamRip, TS, Screener)"} + - {id: 215, cat: Other, desc: "Архив (Документальные фильмы)"} + - {id: 216, cat: Other, desc: "Вера, религия и мифология"} + - {id: 217, cat: Other, desc: "Вокруг света"} + - {id: 218, cat: Other, desc: "Документальные фильмы (HD & HQ Video)"} + - {id: 219, cat: Other, desc: "Другое научно-популярное видео"} + - {id: 220, cat: Other, desc: "История до XX века"} + - {id: 221, cat: Other, desc: "Ищу (Документальные фильмы)"} + - {id: 222, cat: Other, desc: "Криминал и преступления"} + - {id: 223, cat: Other, desc: "Мировое искусство и культура"} + - {id: 224, cat: Other, desc: "Новейшая история"} + - {id: 225, cat: Other, desc: "О войнах, армии и оружии"} + - {id: 226, cat: Other, desc: "О кинематографе"} + - {id: 227, cat: Other, desc: "О музыке"} + - {id: 228, cat: Other, desc: "Сверхъестественное"} + - {id: 229, cat: Other, desc: "Флора и Фауна"} + - {id: 230, cat: Other, desc: "Фильмы BBC"} + - {id: 231, cat: Other, desc: "Фильмы Discovery"} + - {id: 232, cat: Other, desc: "Фильмы National Geographic"} + - {id: 233, cat: Other, desc: "IT тематика"} + - {id: 899, cat: Other, desc: "Биографии. Личности"} + - {id: 900, cat: Other, desc: "Космос"} + - {id: 901, cat: Other, desc: "Концепция Общественной Безопасности"} + - {id: 902, cat: Other, desc: "Мир вокруг нас"} + - {id: 903, cat: Other, desc: "Научно-познавательные"} + - {id: 905, cat: Other, desc: "Политика"} + - {id: 906, cat: Other, desc: "Релакс"} + - {id: 907, cat: Other, desc: "Рыбалка и охота"} + - {id: 908, cat: Other, desc: "Тайны и загадки"} + - {id: 909, cat: Other, desc: "Философия"} + - {id: 910, cat: Other, desc: "Техника и вооружение"} + - {id: 911, cat: Other, desc: "Вторая мировая война"} + - {id: 962, cat: Other, desc: "Обучающее видео"} + - {id: 963, cat: Other, desc: "Кулинария"} + - {id: 964, cat: Other, desc: "Охота"} + - {id: 965, cat: Other, desc: "Фитнес - Разум и Тело"} + - {id: 966, cat: Other, desc: "Здоровье"} + - {id: 967, cat: Other, desc: "Уроки музыки"} + - {id: 968, cat: Other, desc: "Бизнес, экономика и финансы"} + - {id: 969, cat: Other, desc: "Учебные видео для детей и родителей"} + - {id: 970, cat: Other, desc: "Пикап и психология"} + - {id: 994, cat: Other, desc: "Сделай сам!"} + - {id: 995, cat: Other, desc: "Политика"} + - {id: 997, cat: Other, desc: "Иностранные языки"} + - {id: 998, cat: Other, desc: "Компьютерные видеоуроки"} + - {id: 996, cat: Other, desc: "Компьютерная графика"} + - {id: 1028, cat: Other, desc: "Компьютерные сети и безопасность"} + - {id: 1029, cat: Other, desc: "ОС и серверные программы Microsoft"} + - {id: 1030, cat: Other, desc: "Офисные программы Microsoft"} + - {id: 1031, cat: Other, desc: "ОС и программы семейства UNIX"} + - {id: 1032, cat: Other, desc: "Adobe Photoshop"} + - {id: 1033, cat: Other, desc: "Autodesk Maya"} + - {id: 1034, cat: Other, desc: "Autodesk 3ds Max"} + - {id: 1035, cat: Other, desc: "Autodesk Softimage (XSI)"} + - {id: 1036, cat: Other, desc: "ZBrush"} + - {id: 1037, cat: Other, desc: "Flash, Flex и ActionScript"} + - {id: 1038, cat: Other, desc: "Инженерные и научные программы"} + - {id: 1039, cat: Other, desc: "Web-дизайн"} + - {id: 1040, cat: Other, desc: "Программирование"} + - {id: 1041, cat: Other, desc: "Программы для Mac OS"} + - {id: 1042, cat: Other, desc: "Работа с видео"} + - {id: 1043, cat: Other, desc: "Работа со звуком"} + - {id: 1045, cat: Other, desc: "Разное"} + - {id: 1000, cat: Other, desc: "Салон красоты"} + - {id: 1003, cat: Other, desc: "Спортивные уроки"} + - {id: 1004, cat: Other, desc: "Стройка и ремонт"} + - {id: 1005, cat: Other, desc: "Учимся танцевать"} + - {id: 1009, cat: Other, desc: "Детский раздел"} + - {id: 1010, cat: Other, desc: "Детский"} + - {id: 1011, cat: Other, desc: "Сериалы для детей"} + - {id: 1012, cat: Other, desc: "Сказки (DVD)"} + - {id: 1013, cat: Other, desc: "Детские фильмы (DVD)"} + - {id: 1014, cat: Other, desc: "Музыка для детей"} + - {id: 1015, cat: Other, desc: "Детские телепередачи"} + - {id: 1016, cat: Other, desc: "Детские журналы"} + - {id: 1017, cat: Other, desc: "Отечественные сказки"} + - {id: 1018, cat: Other, desc: "Зарубежные сказки"} + - {id: 1019, cat: Other, desc: "Детские фильмы (отечественные)"} + - {id: 1020, cat: Other, desc: "Детские фильмы (зарубежные)"} + - {id: 1021, cat: Other, desc: "Детская литература"} + - {id: 1022, cat: Other, desc: "Детская литература (аудиокникги)"} + - {id: 352, cat: Other, desc: "Ongoing"} + - {id: 366, cat: Other, desc: "Архив (Ongoing)"} + - {id: 367, cat: Other, desc: "Русская озвучка"} + - {id: 368, cat: Other, desc: "Оригинальная озвучка + cубтитры"} + - {id: 353, cat: Other, desc: "Аниме с русской озвучкой"} + - {id: 369, cat: Other, desc: "Архив (Аниме с русской озвучкой)"} + - {id: 370, cat: Other, desc: "TV"} + - {id: 371, cat: Other, desc: "TV (HD Video)"} + - {id: 372, cat: Other, desc: "TV (DVD Video)"} + - {id: 373, cat: Other, desc: "OVA"} + - {id: 374, cat: Other, desc: "OVA (HD Video)"} + - {id: 354, cat: Other, desc: "Аниме c оригинальной озвучкой / субтитрами"} + - {id: 375, cat: Other, desc: "Архив (Аниме c оригинальной озвучкой / субтитрами)"} + - {id: 376, cat: Other, desc: "TV"} + - {id: 377, cat: Other, desc: "TV (HD Video)"} + - {id: 378, cat: Other, desc: "OVA"} + - {id: 379, cat: Other, desc: "OVA (HD Video)"} + - {id: 355, cat: Other, desc: "Полнометражное аниме"} + - {id: 380, cat: Other, desc: "Архив (Полнометражное аниме)"} + - {id: 381, cat: Other, desc: "Полнометражное аниме (DVDRip, HQRip) c русской озвучкой"} + - {id: 382, cat: Other, desc: "Полнометражное аниме (HD Video) c оригинальной озвучкой"} + - {id: 383, cat: Other, desc: "Полнометражное аниме (HD Video) c русской озвучкой"} + - {id: 384, cat: Other, desc: "Полнометражное аниме (DVDRip, HQRip) c оригинальной озвучкой"} + - {id: 385, cat: Other, desc: "Короткометражное аниме"} + - {id: 356, cat: Other, desc: "Манга"} + - {id: 386, cat: Other, desc: "Архив (Манга)"} + - {id: 387, cat: Other, desc: "Хентай манга"} + - {id: 388, cat: Other, desc: "Манга на русском"} + - {id: 389, cat: Other, desc: "Манга на прочих языках"} + - {id: 357, cat: Other, desc: "Музыка и Клипы"} + - {id: 390, cat: Other, desc: "Архив (Музыка и Клипы)"} + - {id: 391, cat: Other, desc: "OST"} + - {id: 392, cat: Other, desc: "J-music"} + - {id: 393, cat: Other, desc: "AMV и др. ролики"} + - {id: 358, cat: Other, desc: "Арт"} + - {id: 394, cat: Other, desc: "Архив (Арт)"} + - {id: 395, cat: Other, desc: "Обои"} + - {id: 396, cat: Other, desc: "Артбуки"} + - {id: 359, cat: Other, desc: "Hentai"} + - {id: 397, cat: Other, desc: "Архив (Hentai)"} + - {id: 398, cat: Other, desc: "Hentai с русской озвучкой"} + - {id: 399, cat: Other, desc: "Hentai с оригинальной озвучкой / субтитрами"} + - {id: 766, cat: Other, desc: "Электронная музыка"} + - {id: 767, cat: Other, desc: "Синглы и EP"} + - {id: 768, cat: Other, desc: "Сборники"} + - {id: 769, cat: Other, desc: "Dj-миксы и радиошоу"} + - {id: 770, cat: Other, desc: "Psy/Goa trance"} + - {id: 771, cat: Other, desc: "Chillou t / Lounge / Downtempo / Trip-Hop"} + - {id: 772, cat: Other, desc: "Electro"} + - {id: 773, cat: Other, desc: "Dance / Club"} + - {id: 774, cat: Other, desc: "Techno/Minimal"} + - {id: 775, cat: Other, desc: "Electro-House"} + - {id: 776, cat: Other, desc: "Hardstyle"} + - {id: 777, cat: Other, desc: "House"} + - {id: 778, cat: Other, desc: "Trance"} + - {id: 779, cat: Other, desc: "Drum & Bass / Jungle / Breakbeat / Dubstep / IDM"} + - {id: 898, cat: Other, desc: "Дискографии"} + - {id: 886, cat: Other, desc: "Поп музыка"} + - {id: 895, cat: Other, desc: "Смешанные сборники"} + - {id: 887, cat: Other, desc: "Отечественная поп музыка"} + - {id: 889, cat: Other, desc: "Отечественные дискографии"} + - {id: 890, cat: Other, desc: "Отечественные альбомы"} + - {id: 894, cat: Other, desc: "Отечественные сборники"} + - {id: 896, cat: Other, desc: "Отечественные cинглы и EP"} + - {id: 888, cat: Other, desc: "Зарубежная поп музыка"} + - {id: 891, cat: Other, desc: "Зарубежные дискографии"} + - {id: 892, cat: Other, desc: "Зарубежные альбомы"} + - {id: 893, cat: Other, desc: "Зарубежные сборники"} + - {id: 897, cat: Other, desc: "Зарубежные синглы и EP"} + - {id: 913, cat: Other, desc: "Классическая и Инструментальная музыка"} + - {id: 914, cat: Other, desc: "Инструментальная музыка"} + - {id: 915, cat: Other, desc: "Классическая и академическая музыка"} + - {id: 916, cat: Other, desc: "Классика в современной обработке"} + - {id: 917, cat: Other, desc: "Сборники"} + - {id: 918, cat: Other, desc: "Саундтреки"} + - {id: 919, cat: Other, desc: "из Фильмов"} + - {id: 920, cat: Other, desc: "из Мультфильмов"} + - {id: 921, cat: Other, desc: "из Игр"} + - {id: 922, cat: Other, desc: "из Сериалов"} + - {id: 923, cat: Other, desc: "Джаз, Блюз, Соул"} + - {id: 924, cat: Other, desc: "Сборники"} + - {id: 925, cat: Other, desc: "Соул"} + - {id: 926, cat: Other, desc: "Блюз"} + - {id: 927, cat: Other, desc: "Джаз"} + - {id: 928, cat: Other, desc: "Рок музыка"} + - {id: 929, cat: Other, desc: "Русский рок"} + - {id: 930, cat: Other, desc: "Зарубежный рок"} + - {id: 931, cat: Other, desc: "Смешанные сборники"} + - {id: 934, cat: Other, desc: "Шансон, Авторская песня"} + - {id: 939, cat: Other, desc: "Сборники"} + - {id: 935, cat: Other, desc: "Rap, Hip-hop, R'n'B"} + - {id: 936, cat: Other, desc: "Отечественный Rap, Hip-hop, R'n'B"} + - {id: 937, cat: Other, desc: "Зарубежный Rap, Hip-hop, R'n'B"} + - {id: 940, cat: Other, desc: "Сборники"} + - {id: 938, cat: Other, desc: "Минусовки"} + - {id: 1023, cat: Other, desc: "Reggae, Ska"} + - {id: 955, cat: Other, desc: "Рок, Панк, Метал, Альтернатива"} + - {id: 949, cat: Other, desc: "Дискографии (Рок, Панк, Метал, Альтернатива)"} + - {id: 959, cat: Other, desc: "Электронная музыка"} + - {id: 948, cat: Other, desc: "Дискографии (Электронная музыка)"} + - {id: 952, cat: Other, desc: "Классическая музыка"} + - {id: 953, cat: Other, desc: "Поп музыка"} + - {id: 947, cat: Other, desc: "Дискографии (Поп музыка)"} + - {id: 954, cat: Other, desc: "Rap, Hip-hop, R'n'B"} + - {id: 945, cat: Other, desc: "Дискографии (Rap, Hip-hop, R'n'B)"} + - {id: 950, cat: Other, desc: "Джаз, Блюз, Соул"} + - {id: 944, cat: Other, desc: "Дискографии (Джаз, Блюз, Соул)"} + - {id: 958, cat: Other, desc: "Шансон"} + - {id: 946, cat: Other, desc: "Дискографии (Шансон)"} + - {id: 957, cat: Other, desc: "Саундтреки"} + - {id: 956, cat: Other, desc: "Сборники"} + - {id: 951, cat: Other, desc: "Другие жанры"} + - {id: 402, cat: Other, desc: "Общение на тему игр"} + - {id: 1054, cat: Other, desc: "Горячие новинки"} + - {id: 403, cat: Other, desc: "Action"} + - {id: 427, cat: Other, desc: "Counter-Strike"} + - {id: 600, cat: Other, desc: "Архив (Counter-Strike)"} + - {id: 601, cat: Other, desc: "Карты"} + - {id: 602, cat: Other, desc: "Серверы"} + - {id: 603, cat: Other, desc: "Моды"} + - {id: 404, cat: Other, desc: "Strategy (Стратегии)"} + - {id: 405, cat: Other, desc: "RPG (Ролевые игры)"} + - {id: 406, cat: Other, desc: "Симуляторы"} + - {id: 435, cat: Other, desc: "Архив (Симуляторы)"} + - {id: 436, cat: Other, desc: "Авто и мотосимуляторы"} + - {id: 437, cat: Other, desc: "Спортивные"} + - {id: 438, cat: Other, desc: "Авиасимуляторы"} + - {id: 407, cat: Other, desc: "Многопользовательские игры"} + - {id: 439, cat: Other, desc: "Архив (Многопользовательские игры)"} + - {id: 440, cat: Other, desc: "Бета-тестирование"} + - {id: 441, cat: Other, desc: "Обновления для Многопользовательских игр"} + - {id: 442, cat: Other, desc: "World of Warcraft"} + - {id: 443, cat: Other, desc: "LineAge"} + - {id: 444, cat: Other, desc: "Ragnarok"} + - {id: 445, cat: Other, desc: "Браузерные и маленькие игры"} + - {id: 446, cat: Other, desc: "Social Type"} + - {id: 447, cat: Other, desc: "Прочие бесплатные"} + - {id: 448, cat: Other, desc: "Прочие платные"} + - {id: 408, cat: Other, desc: "Приключения и квесты"} + - {id: 409, cat: Other, desc: "Аркада"} + - {id: 450, cat: Other, desc: "Архив (Аркада)"} + - {id: 410, cat: Other, desc: "Казуальные и мини-игры"} + - {id: 451, cat: Other, desc: "Архив (Казуальные и мини-игры)"} + - {id: 452, cat: Other, desc: "Я ищу (Hidden Objects) / Квесты (Quests)"} + - {id: 453, cat: Other, desc: "Тайм-Менеджмент (Time-Management)"} + - {id: 454, cat: Other, desc: "Три в Ряд (Match-3)"} + - {id: 455, cat: Other, desc: "Аркада"} + - {id: 456, cat: Other, desc: "Зума-игры (Zuma)"} + - {id: 457, cat: Other, desc: "Логические (Puzzle)"} + - {id: 458, cat: Other, desc: "Стратегии / Симуляторы"} + - {id: 411, cat: Other, desc: "Другие игры"} + - {id: 459, cat: Other, desc: "Архив (Другие игры)"} + - {id: 460, cat: Other, desc: "Детские игры"} + - {id: 461, cat: Other, desc: "Азартные игры"} + - {id: 462, cat: Other, desc: "Эротические игры"} + - {id: 463, cat: Other, desc: "Прочие"} + - {id: 1007, cat: Other, desc: "Демо версии"} + - {id: 414, cat: Other, desc: "Игры для других ОС"} + - {id: 471, cat: Other, desc: "Архив (Игры для других ОС)"} + - {id: 912, cat: Other, desc: "Игры для Linux"} + - {id: 413, cat: Other, desc: "Модификации и Дополнения"} + - {id: 415, cat: Other, desc: "Сопутствующий играм контент"} + - {id: 472, cat: Other, desc: "Архив (Сопутствующий играм контент)"} + - {id: 473, cat: Other, desc: "Патчи"} + - {id: 474, cat: Other, desc: "Демо и Бета-версии игр"} + - {id: 475, cat: Other, desc: "Таблетки к играм"} + - {id: 476, cat: Other, desc: "Русификаторы"} + - {id: 477, cat: Other, desc: "Программы для игр"} + - {id: 416, cat: Other, desc: "Игрострой"} + - {id: 478, cat: Other, desc: "Архив (Игрострой)"} + - {id: 417, cat: Other, desc: "Игровое видео"} + - {id: 479, cat: Other, desc: "Архив (Игровое видео)"} + - {id: 480, cat: Other, desc: "Трейлеры к играм для PC"} + - {id: 481, cat: Other, desc: "GamePlay Video"} + - {id: 482, cat: Other, desc: "Видеообзоры и телепередачи"} + - {id: 483, cat: Other, desc: "Counter-Strike Video"} + - {id: 484, cat: Other, desc: "Online Game Video"} + - {id: 485, cat: Other, desc: "Игровые приколы и юмор"} + - {id: 486, cat: Other, desc: "Обучающее видео и воды"} + - {id: 487, cat: Other, desc: "Видео консольных игр"} + - {id: 754, cat: Other, desc: "Xbox360"} + - {id: 752, cat: Other, desc: "PS3"} + - {id: 753, cat: Other, desc: "Xbox"} + - {id: 751, cat: Other, desc: "PS2"} + - {id: 750, cat: Other, desc: "PlayStation"} + - {id: 756, cat: Other, desc: "Nintendo WII"} + - {id: 757, cat: Other, desc: "PSP"} + - {id: 755, cat: Other, desc: "Другие консоли"} + - {id: 749, cat: Other, desc: "Софт для консолей"} + - {id: 615, cat: Other, desc: "Книги"} + - {id: 618, cat: Other, desc: "Библиотеки"} + - {id: 619, cat: Other, desc: "Детективы, триллер, боевик"} + - {id: 620, cat: Other, desc: "Изучение иностранных языков"} + - {id: 621, cat: Other, desc: "Историческая литература"} + - {id: 622, cat: Other, desc: "Научно-популярная литература"} + - {id: 623, cat: Other, desc: "Классика мировой литературы"} + - {id: 624, cat: Other, desc: "Компьютерная литература, программирование"} + - {id: 625, cat: Other, desc: "Кулинария"} + - {id: 626, cat: Other, desc: "Литература без перевода"} + - {id: 627, cat: Other, desc: "Любовные романы"} + - {id: 628, cat: Other, desc: "Медицина и здоровье"} + - {id: 629, cat: Other, desc: "Обучение и развитие детей"} + - {id: 630, cat: Other, desc: "Поэзия"} + - {id: 631, cat: Other, desc: "Многоавторские сборники, серии книг"} + - {id: 632, cat: Other, desc: "Психология, философия"} + - {id: 633, cat: Other, desc: "Публицистика"} + - {id: 634, cat: Other, desc: "Путешествия, приключения"} + - {id: 635, cat: Other, desc: "Разное"} + - {id: 636, cat: Other, desc: "Современная проза"} + - {id: 637, cat: Other, desc: "Техническая литература"} + - {id: 639, cat: Other, desc: "Учебники, справочники, энциклопедии"} + - {id: 640, cat: Other, desc: "Хобби"} + - {id: 641, cat: Other, desc: "Собрания сочинений"} + - {id: 642, cat: Other, desc: "Фантастика, фентези, мистика"} + - {id: 643, cat: Other, desc: "Экономика и бизнес-литература"} + - {id: 1026, cat: Other, desc: "Эзотерика, гадания, магия, фен-шуй"} + - {id: 1027, cat: Other, desc: "Спорт"} + - {id: 644, cat: Other, desc: "Историческая литература, биографии и мемуары"} + - {id: 645, cat: Other, desc: "Отечественная Классика"} + - {id: 646, cat: Other, desc: "Мировая Классика"} + - {id: 647, cat: Other, desc: "Аудио учебники"} + - {id: 648, cat: Other, desc: "Бизнес-литература"} + - {id: 649, cat: Other, desc: "Детективы и боевики"} + - {id: 651, cat: Other, desc: "Изучение иностранных языков"} + - {id: 652, cat: Other, desc: "Любовные романы"} + - {id: 653, cat: Other, desc: "Мировая проза ХХ века"} + - {id: 654, cat: Other, desc: "Научно-популярная аудиокнига"} + - {id: 655, cat: Other, desc: "Отечественная проза ХХ века"} + - {id: 656, cat: Other, desc: "Поэзия"} + - {id: 657, cat: Other, desc: "Проза III тысячелетия"} + - {id: 658, cat: Other, desc: "Аудиокниги на иностранных языках"} + - {id: 659, cat: Other, desc: "Психология и философия"} + - {id: 660, cat: Other, desc: "Путешествия и приключения"} + - {id: 661, cat: Other, desc: "Радиоспектакли и аудиофильмы"} + - {id: 662, cat: Other, desc: "Ужасы и Мистика"} + - {id: 663, cat: Other, desc: "Фантастика и фэнтези"} + - {id: 664, cat: Other, desc: "Юмор"} + - {id: 665, cat: Other, desc: "Аудиокниги для Apple"} + - {id: 666, cat: Other, desc: "Разное"} + - {id: 667, cat: Other, desc: "Авто и мото"} + - {id: 668, cat: Other, desc: "Наука, техника"} + - {id: 669, cat: Other, desc: "Игровые журналы"} + - {id: 670, cat: Other, desc: "Digital Photo"} + - {id: 671, cat: Other, desc: "Мужские журналы"} + - {id: 672, cat: Other, desc: "Компьютерные журналы"} + - {id: 673, cat: Other, desc: "CD / DVD к журналам"} + - {id: 674, cat: Other, desc: "Строительство, дизайн и ремонт"} + - {id: 675, cat: Other, desc: "Спорт"} + - {id: 676, cat: Other, desc: "Женские журналы (мода, остальные женские журналы)"} + - {id: 677, cat: Other, desc: "Мир кулинарии (кулинария)"} + - {id: 678, cat: Other, desc: "Мир рукоделия (вязание, рукоделие, шитье)"} + - {id: 679, cat: Other, desc: "Комиксы"} + - {id: 680, cat: Other, desc: "Кино / Музыка"} + - {id: 681, cat: Other, desc: "Разное (путешествия, хобби, прочее)"} + - {id: 838, cat: Other, desc: "Легенды спорта"} + - {id: 825, cat: Other, desc: "Футбол"} + - {id: 826, cat: Other, desc: "Россия"} + - {id: 827, cat: Other, desc: "Германия"} + - {id: 828, cat: Other, desc: "Италия"} + - {id: 829, cat: Other, desc: "Испания"} + - {id: 830, cat: Other, desc: "Англия"} + - {id: 831, cat: Other, desc: "Мини-футбол, пляжный футбол, футзал"} + - {id: 832, cat: Other, desc: "Обзорные и аналитические передачи"} + - {id: 833, cat: Other, desc: "Товарищеские турниры и матчи"} + - {id: 834, cat: Other, desc: "Чемпионат Мира и Европы"} + - {id: 835, cat: Other, desc: "Еврокубки"} + - {id: 836, cat: Other, desc: "Другие национальные чемпионаты и кубки"} + - {id: 837, cat: Other, desc: "Футбольное видео"} + - {id: 839, cat: Other, desc: "Авто / мотоспорт"} + - {id: 862, cat: Other, desc: "Дакар"} + - {id: 863, cat: Other, desc: "Велоспорт / Мотоспорт"} + - {id: 864, cat: Other, desc: "Остальной автоспорт"} + - {id: 865, cat: Other, desc: "Обзорные и аналитические передачи, видеоклипы и т.д."} + - {id: 840, cat: Other, desc: "Баскетбол"} + - {id: 866, cat: Other, desc: "NBA"} + - {id: 867, cat: Other, desc: "Чемпионат России по баскетболу"} + - {id: 868, cat: Other, desc: "Европейский клубный баскетбол"} + - {id: 869, cat: Other, desc: "Женский баскетбол"} + - {id: 870, cat: Other, desc: "Обзорные и аналитические передачи, видиоклипы и т.д."} + - {id: 841, cat: Other, desc: "Хоккей"} + - {id: 871, cat: Other, desc: "NHL"} + - {id: 872, cat: Other, desc: "KХЛ"} + - {id: 873, cat: Other, desc: "Европейские клубные чемпионаты"} + - {id: 874, cat: Other, desc: "Чемпионаты мира"} + - {id: 875, cat: Other, desc: "Хоккей с мячом"} + - {id: 876, cat: Other, desc: "Международные турниры"} + - {id: 877, cat: Other, desc: "Обзорные и аналитические передачи"} + - {id: 842, cat: Other, desc: "Боевые искусства"} + - {id: 878, cat: Other, desc: "Бокс"} + - {id: 879, cat: Other, desc: "Ножевой бой"} + - {id: 880, cat: Other, desc: "Каратэ"} + - {id: 881, cat: Other, desc: "Дзюдо и самбо"} + - {id: 882, cat: Other, desc: "Вин чунь"} + - {id: 883, cat: Other, desc: "Айкидо"} + - {id: 884, cat: Other, desc: "Рукопашный бой"} + - {id: 843, cat: Other, desc: "Остальные виды спорта"} + - {id: 844, cat: Other, desc: "Биатлон"} + - {id: 845, cat: Other, desc: "Бодибилдинг"} + - {id: 846, cat: Other, desc: "Бокс / Смешанные единоборства"} + - {id: 847, cat: Other, desc: "Зимние виды спорта"} + - {id: 848, cat: Other, desc: "Олимпиады"} + - {id: 849, cat: Other, desc: "Рестлинг"} + - {id: 850, cat: Other, desc: "Теннис"} + - {id: 851, cat: Other, desc: "Формула-1"} + - {id: 852, cat: Other, desc: "Экстрим"} + - {id: 853, cat: Other, desc: "Американский футбол"} + - {id: 854, cat: Other, desc: "Гандбол"} + - {id: 855, cat: Other, desc: "Покер"} + - {id: 856, cat: Other, desc: "Легкая атлетика"} + - {id: 857, cat: Other, desc: "Бильярд"} + - {id: 858, cat: Other, desc: "Бейсбол"} + - {id: 859, cat: Other, desc: "Тяжёлая атлетика"} + - {id: 860, cat: Other, desc: "Гимнастика"} + - {id: 861, cat: Other, desc: "Не вошедшие остальные виды спорта"} + - {id: 490, cat: Other, desc: "Операционные системы от Microsoft"} + - {id: 501, cat: Other, desc: "Архив (Операционные системы от Microsoft)"} + - {id: 502, cat: Other, desc: "Windows 8"} + - {id: 503, cat: Other, desc: "Windows 7"} + - {id: 504, cat: Other, desc: "Windows Vista"} + - {id: 505, cat: Other, desc: "Windows XP"} + - {id: 506, cat: Other, desc: "Серверные ОС от Microsoft"} + - {id: 507, cat: Other, desc: "Патчи, дополнения для ОС от Microsoft"} + - {id: 508, cat: Other, desc: "Изменение интерфейса"} + - {id: 509, cat: Other, desc: "Активаторы (Windows)"} + - {id: 510, cat: Other, desc: "Разное (Windows)"} + - {id: 491, cat: Other, desc: "Операционные системы и ПО для Apple Macintosh"} + - {id: 511, cat: Other, desc: "Архив (Apple Macintosh)"} + - {id: 512, cat: Other, desc: "Mac OS (для Macintosh)"} + - {id: 513, cat: Other, desc: "Mac OS (для РС-Хакинтош)"} + - {id: 514, cat: Other, desc: "Программы для просмотра и обработки видео Mac OS"} + - {id: 515, cat: Other, desc: "Программы для создания и обработки графики Mac OS"} + - {id: 516, cat: Other, desc: "Аудио редакторы и конверторы для Mac OS"} + - {id: 517, cat: Other, desc: "Системные программы для Mac OS"} + - {id: 518, cat: Other, desc: "Другие программы для Mac OS"} + - {id: 519, cat: Other, desc: "Архив (Linux, Unix и другие ОС)"} + - {id: 520, cat: Other, desc: "Операционные системы"} + - {id: 521, cat: Other, desc: "Программное обеспечение"} + - {id: 522, cat: Other, desc: "Другие ОС и ПО под них"} + - {id: 493, cat: Other, desc: "Веб-разработка и Программирование"} + - {id: 523, cat: Other, desc: "Архив (Веб-разработка и Программирование)"} + - {id: 524, cat: Other, desc: "Среды программирования, компиляторы и вспомогательные программы"} + - {id: 525, cat: Other, desc: "Компоненты для сред программирования"} + - {id: 526, cat: Other, desc: "Системы управления базами данных"} + - {id: 527, cat: Other, desc: "Текстовые редакторы"} + - {id: 528, cat: Other, desc: "Скрипты и шаблоны"} + - {id: 529, cat: Other, desc: "Веб-разработка"} + - {id: 746, cat: Other, desc: "Скрипты и движки сайтов, CMS а также расширения к ним"} + - {id: 530, cat: Other, desc: "Разное (Веб-разработка и программирование)"} + - {id: 494, cat: Other, desc: "Системные программы"} + - {id: 531, cat: Other, desc: "Архив (Системные программы)"} + - {id: 532, cat: Other, desc: "Ключи и обновления для антивирусов и других системных программ"} + - {id: 533, cat: Other, desc: "Настройка и оптимизация ОС"} + - {id: 534, cat: Other, desc: "Резервное копирование"} + - {id: 535, cat: Other, desc: "Архиваторы и файловые менеджеры"} + - {id: 536, cat: Other, desc: "Сервисное обслуживание компьютера"} + - {id: 537, cat: Other, desc: "Сборники программ"} + - {id: 538, cat: Other, desc: "Работа с носителями информации"} + - {id: 539, cat: Other, desc: "Программы для интернет и сетей"} + - {id: 540, cat: Other, desc: "Информация и диагностика"} + - {id: 541, cat: Other, desc: "Антивирусы"} + - {id: 542, cat: Other, desc: "Файерволы"} + - {id: 543, cat: Other, desc: "Анти-шпионы и анти-трояны"} + - {id: 544, cat: Other, desc: "Программы для защиты информации"} + - {id: 545, cat: Other, desc: "Серверное ПО"} + - {id: 546, cat: Other, desc: "Разное (Системные программы под Windows)"} + - {id: 495, cat: Other, desc: "Системы для бизнеса, офиса, научной и проектной работы"} + - {id: 547, cat: Other, desc: "Архив (Системы)"} + - {id: 548, cat: Other, desc: "Офисные системы"} + - {id: 549, cat: Other, desc: "Системы для бизнеса"} + - {id: 550, cat: Other, desc: "Медицинский софт"} + - {id: 551, cat: Other, desc: "Системы для научной работы"} + - {id: 552, cat: Other, desc: "Словари, переводчики"} + - {id: 553, cat: Other, desc: "Прочие справочные системы"} + - {id: 554, cat: Other, desc: "Разное"} + - {id: 555, cat: Other, desc: "САПР"} + - {id: 496, cat: Other, desc: "Программы для работы с мультимедиа и 3D"} + - {id: 556, cat: Other, desc: "Архив (Программы для работы с мультимедиа и 3D)"} + - {id: 557, cat: Other, desc: "3D моделирование, рендеринг и плагины для них"} + - {id: 558, cat: Other, desc: "Анимация"} + - {id: 559, cat: Other, desc: "Видео- Аудио- конверторы"} + - {id: 560, cat: Other, desc: "Графические редакторы"} + - {id: 561, cat: Other, desc: "Программы для архитекторов и дизайнеров интерьеров"} + - {id: 562, cat: Other, desc: "Работа со звуком"} + - {id: 563, cat: Other, desc: "Редакторы видео"} + - {id: 564, cat: Other, desc: "Работа с PDF и DjVu"} + - {id: 565, cat: Other, desc: "Программы для верстки, печати и работы со шрифтами"} + - {id: 566, cat: Other, desc: "Аудио- и видео-, CD- проигрыватели и каталогизаторы"} + - {id: 567, cat: Other, desc: "Каталогизаторы и просмотрщики графики"} + - {id: 568, cat: Other, desc: "Разное (Программы для работы с мультимедиа и 3D)"} + - {id: 497, cat: Other, desc: "Материалы для мультимедиа и дизайна"} + - {id: 569, cat: Other, desc: "Архив (Материалы для мультимедиа и дизайна)"} + - {id: 570, cat: Other, desc: "Текстуры и материалы"} + - {id: 571, cat: Other, desc: "3D модели и сцены"} + - {id: 572, cat: Other, desc: "Photostoсks"} + - {id: 573, cat: Other, desc: "Заготовки, виньетки, рамки, костюмы"} + - {id: 574, cat: Other, desc: "Стили, кисти, формы и узоры"} + - {id: 575, cat: Other, desc: "Футажи"} + - {id: 576, cat: Other, desc: "Шрифты"} + - {id: 577, cat: Other, desc: "Библиотеки сэмплов и Звуковые эффекты"} + - {id: 578, cat: Other, desc: "Векторные клипарты"} + - {id: 579, cat: Other, desc: "Растровые клипарты"} + - {id: 580, cat: Other, desc: "Разное (Материалы для мультимедиа и дизайна)"} + - {id: 498, cat: Other, desc: "Географические информационные системы (ГИС)"} + - {id: 581, cat: Other, desc: "Географические информационные системы (ГИС)(Архив)"} + - {id: 499, cat: Other, desc: "Драйверы"} + - {id: 582, cat: Other, desc: "Архив (Драйверы)"} + - {id: 583, cat: Other, desc: "Ноутбуки (Драйверы)"} + - {id: 584, cat: Other, desc: "Сетевое оборудование (Драйверы)"} + - {id: 585, cat: Other, desc: "Клавиатуры, мыши, джойстики (Драйверы)"} + - {id: 586, cat: Other, desc: "Звуковые карты (Драйверы)"} + - {id: 587, cat: Other, desc: "Видеокарты (Драйверы)"} + - {id: 588, cat: Other, desc: "Материнские платы (Драйверы)"} + - {id: 589, cat: Other, desc: "DirectX"} + - {id: 590, cat: Other, desc: "Принтеры и МФУ, Сканеры (Драйверы)"} + - {id: 591, cat: Other, desc: "Drivers MegaPack"} + - {id: 592, cat: Other, desc: "Другие (Драйверы)"} + - {id: 500, cat: Other, desc: "Разное"} + - {id: 593, cat: Other, desc: "Архив (Программы>>Разное)"} + - {id: 594, cat: Other, desc: "Скринсейверы"} + - {id: 595, cat: Other, desc: "Картины, Фотографии, Искусство"} + - {id: 596, cat: Other, desc: "Обои"} + - {id: 597, cat: Other, desc: "Фото знаменитостей"} + - {id: 598, cat: Other, desc: "Картинки"} + - {id: 599, cat: Other, desc: "Аватары, Иконки, Смайлы"} + - {id: 797, cat: Other, desc: "Всё для мобильных платформ"} + - {id: 808, cat: Other, desc: "Игры"} + - {id: 809, cat: Other, desc: "Приложения"} + - {id: 810, cat: Other, desc: "Мультимедиа"} + - {id: 811, cat: Other, desc: "Разное"} + - {id: 812, cat: Other, desc: "Игры"} + - {id: 813, cat: Other, desc: "Приложения"} + - {id: 801, cat: Other, desc: "Windows Mobile"} + - {id: 814, cat: Other, desc: "Игры"} + - {id: 815, cat: Other, desc: "Приложения"} + - {id: 802, cat: Other, desc: "Symbian"} + - {id: 816, cat: Other, desc: "Игры"} + - {id: 817, cat: Other, desc: "Приложения"} + - {id: 803, cat: Other, desc: "Java"} + - {id: 818, cat: Other, desc: "Игры"} + - {id: 819, cat: Other, desc: "Приложения"} + - {id: 805, cat: Other, desc: "Системы навигации и карты"} + - {id: 807, cat: Other, desc: "Разное"} + - {id: 820, cat: Other, desc: "Темы"} + - {id: 821, cat: Other, desc: "Видео"} + - {id: 822, cat: Other, desc: "Звуки"} + - {id: 823, cat: Other, desc: "Картинки"} + - {id: 1008, cat: Other, desc: "Pron"} + - {id: 687, cat: Other, desc: "Общение и Обсуждение порноиндустрии"} + - {id: 694, cat: Other, desc: "Правила, Инструкции, FAQ-и / Rules & FAQ's"} + - {id: 695, cat: Other, desc: "Общение"} + - {id: 696, cat: Other, desc: "Актеры"} + - {id: 697, cat: Other, desc: "Ищу"} + - {id: 688, cat: Other, desc: "Зарубежные порнофильмы / Full Length Movies"} + - {id: 698, cat: Other, desc: "Паки полных фильмов / Full Length Movies Packs"} + - {id: 699, cat: Other, desc: "101 Величайший Порно Фильм 20 Века"} + - {id: 700, cat: Other, desc: "Самые популярные / Bestseller"} + - {id: 701, cat: Other, desc: "Классические фильмы / Classic"} + - {id: 702, cat: Other, desc: "Фильмы с сюжетом / Feature & Vignettes"} + - {id: 703, cat: Other, desc: "Гонзо-фильмы / Gonzo"} + - {id: 704, cat: Other, desc: "Зарубежный Pron (DVD, HD Video)"} + - {id: 705, cat: Other, desc: "Фильмы без сюжета / All Sex & Amateur"} + - {id: 706, cat: Other, desc: "Лесбо-фильмы / All Girl & Solo"} + - {id: 707, cat: Other, desc: "Этнические фильмы / Ethnic-Themed"} + - {id: 708, cat: Other, desc: "Японские фильмы / Japan"} + - {id: 709, cat: Other, desc: "Архив (Зарубежные порнофильмы)"} + - {id: 689, cat: Other, desc: "Зарубежные порноролики / Clips"} + - {id: 710, cat: Other, desc: "Паки сайтрипов / SiteRip's Packs"} + - {id: 711, cat: Other, desc: "Паки порнороликов по актрисам / Actresses Clips Packs"} + - {id: 713, cat: Other, desc: "Сайтрипы / SiteRip's"} + - {id: 714, cat: Other, desc: "Сцены из фильмов / Movie Scenes"} + - {id: 715, cat: Other, desc: "Порноролики Разное / Clips (various)"} + - {id: 716, cat: Other, desc: "Архив (Зарубежные порноролики)"} + - {id: 690, cat: Other, desc: "Русское порно / Russian Video"} + - {id: 712, cat: Other, desc: "HD Video ролики / HD Clips"} + - {id: 721, cat: Other, desc: "Русские Порноролики Разное / Russian Clips (various)"} + - {id: 722, cat: Other, desc: "Русское Любительское Видео / Russian Amateur Video"} + - {id: 717, cat: Other, desc: "Русские Порнофильмы / Russian Full Length Movies"} + - {id: 718, cat: Other, desc: "Паки русских порнороликов / Russian Clips Packs"} + - {id: 719, cat: Other, desc: "HD Фильмы и ролики"} + - {id: 720, cat: Other, desc: "Сцены из фильмов и Сайтрипы с русскими актрисами / Russian Movie Scenes & SiteRip's"} + - {id: 691, cat: Other, desc: "Эротические студии и фото, журналы и комиксы"} + - {id: 725, cat: Other, desc: "Фотографии в высоком качестве / Foto High Quality"} + - {id: 726, cat: Other, desc: "Любительское фото / Amateur Picture Gallery"} + - {id: 727, cat: Other, desc: "Подборки по актрисам / Actresses Picture Packs"} + - {id: 728, cat: Other, desc: "Подборки сайтрипов / SiteRip's Picture Packs"} + - {id: 729, cat: Other, desc: "Фото Разное / Picture Gallery (various)"} + - {id: 730, cat: Other, desc: "Журналы, комиксы, манга и рисунки / Magazines, Comics, Manga and Artwork"} + - {id: 731, cat: Other, desc: "Тематическое и нетрадиционное фото / Misc & Special Interest Picture Packs"} + - {id: 732, cat: Other, desc: "Архив (Эротические студии и фото, журналы и комиксы)"} + - {id: 692, cat: Other, desc: "Обучающие материалы"} + - {id: 733, cat: Other, desc: "Обучающие материалы (Pron)"} + - {id: 734, cat: Other, desc: "Нудизм-Натуризм / Nudity"} + - {id: 735, cat: Other, desc: "Мультфильмы / Cartoons"} + - {id: 736, cat: Other, desc: "Архив (Обучающие материалы)"} + - {id: 693, cat: Other, desc: "Нетрадиционное порно"} + - {id: 737, cat: Other, desc: "Транссексуалы / Transsexual"} + - {id: 738, cat: Other, desc: "БДСМ / BDSM"} + - {id: 739, cat: Other, desc: "Бисексуалы / Bisexual"} + - {id: 740, cat: Other, desc: "Женское доминирование и страпон / Femdom & Strapon"} + - {id: 741, cat: Other, desc: "Подглядывание / Voyeur"} + - {id: 742, cat: Other, desc: "Архив (Нетрадиционное порно)"} + - {id: 743, cat: Other, desc: "Разное"} + - {id: 744, cat: Other, desc: "Bukkake, Peeing"} + - {id: 1055, cat: Other, desc: "Эротика"} + - {id: 762, cat: Other, desc: "Разное"} + - {id: 763, cat: Other, desc: "Тестовый раздел (для новичков)"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: stripcyrillic + type: checkbox + label: Strip Cyrillic Letters + default: false + - name: addrussiantotitle + type: checkbox + label: Add RUS to end of all titles to improve language detection by Sonarr and Radarr. Will cause English-only results to be misidentified. + default: false + - name: sort + type: select + label: Sort requested from site + default: t + options: + t: created + ts: seeders + sz: size + i: title + - name: type + type: select + label: Order requested from site + default: d + options: + d: desc + a: asc + +download: + selectors: + - selector: a[href^="./download/file.php?id="] + attribute: href + +search: + # http://www.nntt.org/search.php?sr=topics&sf=titleonly&fp=1&tracker_search=torrent&keywords=2020&fid[]=154 + paths: + - path: search.php + inputs: + sr: topics + sf: titleonly + fp: 1 + tracker_search: torrent + sk: "{{ .Config.sort }}" + sd: "{{ .Config.type }}" + keywords: "{{ if .Keywords }}{{ .Keywords }}{{ else }}{{ .Today.Year }}{{ end }}" + $raw: "{{ range .Categories }}&fid[]={{.}}{{end}}" + + keywordsfilters: + # strip season and/or ep + - name: re_replace + args: ["(?i)\\b(?:[SE]\\d{1,4}){1,2}\\b\\s?", ""] + + rows: + selector: table.tablebg tr.col_line + + fields: + category: + selector: a[href^="./viewtopic.php?f="] + attribute: href + filters: + - name: querystring + args: f + title: + selector: a.topictitle + filters: + # normalize to SXXEYY format + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:(?:-|–)\\d+)?).+?(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:(?:-|–)\\d+)?)\\s*из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:(?:-|–)\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:(?:-|–)\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:(?:-|–)\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:(?:-|–)\\d+)?)\\s*(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:(?:-|–)\\d+)?).+?(\\d+(?:(?:-|–)\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:(?:-|–)\\d+)?).+?(\\d+(?:(?:-|–)\\d+)?)\\s*(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:(?:-|–)\\d+)?).+?(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:(?:-|–)\\d+)?)", "S$1E$2"] + - name: re_replace + args: ["(?i)(\\d+(?:(?:-|–)\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:(?:-|–)\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:(?:-|–)\\d+)?).+?(\\d+(?:(?:-|–)\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:(?:-|–)\\d+)?)", "S$1"] + - name: re_replace + args: ["(?i)(\\d+(?:(?:-|–)\\d+)?)\\s+[CС]езоны?", "S$1"] + - name: re_replace + args: ["(?i)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:(?:-|–)\\d+)?)\\s*из\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:(?:-|–)\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:(?:-|–)\\d+)?)\\s+(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:(?:-|–)\\d+)?)", "E$1"] + - name: re_replace + args: ["(?i)(\\d+(?:(?:-|–)\\d+)?)\\s+(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "E$1"] + - name: re_replace + args: ["(?i)\\bКураж-Бамбей\\b", "kurazh"] + - name: re_replace + args: ["(?i)\\bКубик в Кубе\\b", "Kubik"] + - name: re_replace + args: ["(?i)\\bКравец\\b", "Kravec"] + - name: re_replace + args: ["(?i)\\bПифагор\\b", "Pifagor"] + - name: re_replace + args: ["(?i)\\bНевафильм\\b", "Nevafilm"] + - name: re_replace + args: ["(?i)\\bЛицензия\\b", "Lic"] + - name: re_replace + args: ["(?i)\\bселезень\\b", "selezen"] + - name: re_replace + args: ["(\\([\\p{IsCyrillic}\\W]+\\))|(^[\\p{IsCyrillic}\\W\\d]+\\/ )|([\\p{IsCyrillic} \\-]+,+)|([\\p{IsCyrillic}]+)", "{{ if .Config.stripcyrillic }}{{ else }}$1$2$3$4{{ end }}"] + - name: re_replace + args: ["(?i)\\bHDTV[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bSAT[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bWEB[-\\s]?DL[-\\s]?Rip\\b", "WEB-DL"] + - name: re_replace + args: ["(?i)\\bWEB\\sRip\\b", "WEBRip"] + - name: re_replace + args: ["(?i)\\bWEB\\sDL\\b", "WEB-DL"] + - name: re_replace + args: ["[\\[\\(\\{<«][\\s\\W]*[\\]\\)\\}>»]", ""] + - name: re_replace + args: ["^[\\s&,\\.!\\?\\+\\-_\\|\\/':]+", ""] + - name: append + args: "{{ if .Config.addrussiantotitle }} RUS{{ else }}{{ end }}" + details: + selector: a.topictitle + attribute: href + download: + selector: a.topictitle + attribute: href + size: + selector: td:nth-of-type(5) p + filters: + - name: replace + args: ["ТБ", "TB"] + - name: replace + args: ["ГБ", "GB"] + - name: replace + args: ["МБ", "MB"] + - name: replace + args: ["КБ", "KB"] + seeders: + selector: span.seed + leechers: + selector: span.leech + date: + # 12 янв 2019 + selector: td:nth-of-type(6) p + filters: + # replace month abbreviations + - name: replace + args: ["янв", "Jan"] + - name: replace + args: ["фев", "Feb"] + - name: replace + args: ["мар", "Mar"] + - name: replace + args: ["апр", "Apr"] + - name: replace + args: ["май", "May"] + - name: replace + args: ["июн", "Jun"] + - name: replace + args: ["июл", "Jul"] + - name: replace + args: ["авг", "Aug"] + - name: replace + args: ["сен", "Sep"] + - name: replace + args: ["окт", "Oct"] + - name: replace + args: ["ноя", "Nov"] + - name: replace + args: ["дек", "Dec"] + - name: append + args: " +03:00" # MSK + - name: dateparse + args: "dd MMM yyyy zzz" + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 + description: + selector: a.topictitle +# phpBB diff --git a/config/prowlarr/Definitions/noname-club.yml b/config/prowlarr/Definitions/noname-club.yml new file mode 100644 index 0000000..75d1c58 --- /dev/null +++ b/config/prowlarr/Definitions/noname-club.yml @@ -0,0 +1,881 @@ +--- +id: noname-club +name: NoNaMe Club +description: "NoNaMe Club (NNM-Club) is a RUSSIAN Public Tracker for TV / MOVIES / MUSIC" +language: ru-RU +type: public +encoding: windows-1251 +links: + - https://nnmclub.to/ +legacylinks: + - https://nnm-club.name/ + - https://nnm-club.me/ + - http://nnmclub.to/ + +caps: + categorymappings: + # forum + - {id: 48, cat: Other, desc: "Форум Региональные встречи"} + # forum tracker + - {id: 925, cat: Other, desc: "Форум-Трекер: Клубные таланты Авторские релизы"} + - {id: 872, cat: Other, desc: "Форум-Трекер: Клубные таланты Архив"} + # Everything for children and parents + - {id: 724, cat: TV, desc: "Видео, Кино и Сериалы для детей и родителей"} + - {id: 725, cat: TV, desc: " |- Обучающее Видео для родителей"} + - {id: 729, cat: TV, desc: " |- Развивающее Видео для детей"} + - {id: 731, cat: TV, desc: " |- Отечественные Фильмы и Сериалы для детей (SD)"} + - {id: 1345, cat: TV, desc: " |- Отечественные Фильмы и Сериалы для детей (HD, FHD, UHD)"} + - {id: 733, cat: TV, desc: " |- Зарубежные Фильмы и Сериалы для детей (SD)"} + - {id: 1346, cat: TV, desc: " |- Зарубежные Фильмы и Сериалы для детей (HD, FHD, UHD)"} + - {id: 1329, cat: TV, desc: " |- Отечественные Мультфильмы 20-го века (SD)"} + - {id: 1330, cat: TV, desc: " |- Отечественные Мультфильмы 20-го века (HD, FHD, UHD)"} + - {id: 1331, cat: TV, desc: " |- Отечественные Мультфильмы 21-го века (SD)"} + - {id: 1332, cat: TV, desc: " |- Отечественные Мультфильмы 21-го века (HD, FHD, UHD, 3D)"} + - {id: 1340, cat: TV, desc: " |- Отечественные Мультфильмы (коллекции, сборники / *логии)"} + - {id: 658, cat: TV, desc: " |- Отечественные Мультсериалы"} + - {id: 890, cat: TV, desc: " |- Мультфильмы (3D)"} + - {id: 1336, cat: TV, desc: " |- Зарубежные Мультфильмы 20-го века (SD)"} + - {id: 1337, cat: TV, desc: " |- Зарубежные Мультфильмы 20-го века (HD, FHD, UHD)"} + - {id: 1338, cat: TV, desc: " |- Зарубежные Мультфильмы 21-го века (SD)"} + - {id: 1339, cat: TV, desc: " |- Зарубежные Мультфильмы 21-го века (HD, FHD, UHD)"} + - {id: 660, cat: TV, desc: " |- Зарубежные Мультфильмы (коллекции, сборники / *логии)"} + - {id: 232, cat: Other, desc: " |- Зарубежные Мультсериалы"} + - {id: 734, cat: Other, desc: " |- Классика для мам и малышей"} + - {id: 742, cat: Other, desc: " |- Музыка и песни для детей"} + - {id: 735, cat: Other, desc: " |- Аудиокниги для детей и родителей"} + - {id: 738, cat: Other, desc: " |- Образование, обучение и развитие детей"} + - {id: 967, cat: Other, desc: " |- Логопедия, Психология, Педиатрия"} + - {id: 907, cat: Other, desc: " |- Журналы для детей и родителей"} + - {id: 739, cat: Other, desc: " |- Детская литература"} + - {id: 1109, cat: Other, desc: " |- Энциклопедии и Познавательная литература для детей"} + - {id: 736, cat: Other, desc: " |- Мультимедийные материалы для родителей"} + - {id: 737, cat: Other, desc: " |- Мультимедийные материалы для детей"} + - {id: 898, cat: Other, desc: " |- Рабочие тетради, прописи и разукрашки"} + - {id: 935, cat: Other, desc: " |- Настольные игры и Поделки"} + - {id: 871, cat: Other, desc: " |- Подвижные Игры"} + - {id: 973, cat: Other, desc: " |- Изобразительное искусство"} + - {id: 960, cat: Other, desc: " |- Прочие материалы для детей и родителей"} + - {id: 1239, cat: Other, desc: " |- ГИА, ОГЭ, ЕГЭ, ЕМЭ, ГВЭ"} + - {id: 740, cat: Other, desc: " |- Развивающие Игры для детей"} + - {id: 741, cat: Other, desc: " |- Детские Игры"} + # programs + - {id: 503, cat: Other, desc: "ОС Windows"} + - {id: 504, cat: Other, desc: " |- Оригинальные версии Windows"} + - {id: 506, cat: Other, desc: " |- Оригинальные версии Windows Server"} + - {id: 763, cat: Other, desc: " |- Windows OEM Recovery СD/DVD"} + - {id: 1335, cat: Other, desc: " |- Сборки Windows 11"} + - {id: 1241, cat: Other, desc: " |- Сборки Windows 10"} + - {id: 1023, cat: Other, desc: " |- Сборки Windows 8"} + - {id: 717, cat: Other, desc: " |- Сборки Windows 7"} + - {id: 509, cat: Other, desc: " |- Сборки Windows Vista"} + - {id: 508, cat: Other, desc: " |- Сборки Windows ХР"} + - {id: 510, cat: Other, desc: " |- Сборки Windows - всё в одном"} + - {id: 1254, cat: Other, desc: " |- Сборки Windows для незрячих"} + - {id: 1042, cat: Other, desc: " |- Песочница ПО и сборок Windows"} + - {id: 511, cat: Other, desc: " |- Разное (RC, Beta и Service Packs)"} + - {id: 916, cat: Other, desc: " |- Музей Windows"} + - {id: 512, cat: Other, desc: "Утилиты, Офис, Интернет"} + - {id: 561, cat: Other, desc: " |- ПО для Интернета и сетей"} + - {id: 1284, cat: Other, desc: " |- Оригинальные версии Office"} + - {id: 562, cat: Other, desc: " |- Офисное ПО"} + - {id: 513, cat: Other, desc: " |- Запись, создание, редактирование, эмуляция дисков и..."} + - {id: 514, cat: Other, desc: " |- Диагностика и обслуживание hardware"} + - {id: 515, cat: Other, desc: " |- Резервирование и восстановление данных"} + - {id: 516, cat: Other, desc: " |- Файловые менеджеры и архиваторы"} + - {id: 517, cat: Other, desc: " |- Обслуживание ОС"} + - {id: 518, cat: Other, desc: " |- Разное (Утилиты, Офис, Интернет)"} + - {id: 519, cat: Other, desc: "Безопасность"} + - {id: 520, cat: Other, desc: " |- Firewalls"} + - {id: 521, cat: Other, desc: " |- Антивирусы"} + - {id: 522, cat: Other, desc: " |- Комплексные системы защиты"} + - {id: 523, cat: Other, desc: " |- Разное (остальные программы по безопасности)"} + - {id: 524, cat: Other, desc: "Мультимедиа и Графика"} + - {id: 532, cat: Other, desc: " |- Аудио Плееры и Кодеки"} + - {id: 533, cat: Other, desc: " |- Аудио Граббинг, Мастеринг, Обработка"} + - {id: 535, cat: Other, desc: " |- Прочее ПО для Аудио"} + - {id: 530, cat: Other, desc: " |- Видео Плееры и Кодеки"} + - {id: 529, cat: Other, desc: " |- Нелинейный Видеомонтаж, Авторинг, Кодировщики"} + - {id: 525, cat: Other, desc: " |- Просмотрщики Графики (вьюверы)"} + - {id: 526, cat: Other, desc: " |- Графические редакторы"} + - {id: 527, cat: Other, desc: " |- ПО для моделирования"} + - {id: 545, cat: Other, desc: "Софт и оболочки для специалистов, Прочее"} + - {id: 764, cat: Other, desc: " |- LiveCD/DVD/Flash"} + - {id: 765, cat: Other, desc: " |- WPI"} + - {id: 820, cat: Other, desc: " |- Серверное ПО"} + - {id: 552, cat: Other, desc: " |- Разработка ПО"} + - {id: 553, cat: Other, desc: " |- САПР/ГИС"} + - {id: 554, cat: Other, desc: " |- Остальное ПО для специалистов"} + - {id: 550, cat: Other, desc: " |- Системы навигации и карты"} + - {id: 549, cat: Other, desc: " |- Драйверы"} + - {id: 548, cat: Other, desc: " |- Разное (прочее ПО)"} + # Movies + - {id: 216, cat: Movies, desc: "Горячие новинки"} + - {id: 270, cat: Movies, desc: " |- Отечественные Новинки (SD, DVD)"} + - {id: 218, cat: Movies, desc: " |- Зарубежные Новинки (SD, DVD)"} + - {id: 219, cat: Movies, desc: " |- Отечественные Новинки (HD, FHD, UHD, 3D)"} + - {id: 954, cat: Movies, desc: " |- Зарубежные Новинки (HD, FHD, UHD, 3D)"} + - {id: 217, cat: Movies, desc: " |- Экранки"} + - {id: 1293, cat: Movies, desc: " |- Новинки с Рекламой"} + - {id: 1298, cat: Movies, desc: " |- Экранки с рекламой"} + - {id: 318, cat: Movies, desc: "Классика кино и Старые фильмы до 90-х"} + - {id: 320, cat: Movies, desc: " |- Отечественная Классика (SD)"} + - {id: 677, cat: Movies, desc: " |- Отечественная Классика (DVD)"} + - {id: 1177, cat: Movies, desc: " |- Отечественная Классика (HD, FHD, UHD)"} + - {id: 319, cat: Movies, desc: " |- Зарубежная Классика (SD)"} + - {id: 678, cat: Movies, desc: " |- Зарубежная Классика (DVD)"} + - {id: 885, cat: Movies, desc: " |- Зарубежная Классика (HD, FHD, UHD, 3D)"} + - {id: 908, cat: Movies, desc: " |- Старые Отечественные Фильмы (SD)"} + - {id: 1310, cat: Movies, desc: " |- Старые Отечественные Фильмы (DVD)"} + - {id: 909, cat: Movies, desc: " |- Старые Отечественные Фильмы (HD, FHD, UHD)"} + - {id: 910, cat: Movies, desc: " |- Старые Зарубежные Фильмы (SD)"} + - {id: 911, cat: Movies, desc: " |- Старые Зарубежные Фильмы (DVD)"} + - {id: 912, cat: Movies, desc: " |- Старые Зарубежные Фильмы (HD, FHD, UHD, 3D)"} + - {id: 220, cat: Movies, desc: "Отечественное кино"} + - {id: 221, cat: Movies, desc: " |- Отечественные Фильмы (SD)"} + - {id: 222, cat: Movies, desc: " |- Отечественные Фильмы (DVD)"} + - {id: 882, cat: Movies, desc: " |- Отечественные Фильмы (HD, FHD, UHD)"} + - {id: 889, cat: Movies, desc: " |- Отечественные Фильмы (3D)"} + - {id: 224, cat: Movies, desc: "Зарубежное кино"} + - {id: 225, cat: Movies, desc: " |- Зарубежные Фильмы (SD)"} + - {id: 226, cat: Movies, desc: " |- Зарубежные Фильмы (DVD)"} + - {id: 227, cat: Movies, desc: " |- Зарубежные Фильмы (HD, FHD)"} + - {id: 1296, cat: Movies, desc: " |- Зарубежные Фильмы (UHD)"} + - {id: 891, cat: Movies, desc: " |- Зарубежные Фильмы (3D)"} + - {id: 1299, cat: Movies, desc: " |- Фильмы ближнего зарубежья"} + - {id: 682, cat: Movies, desc: " |- Азиатское кино (SD)"} + - {id: 694, cat: Movies, desc: " |- Азиатское кино (DVD)"} + - {id: 884, cat: Movies, desc: " |- Азиатское кино (HD, FHD, UHD)"} + - {id: 1211, cat: Movies, desc: " |- Азиатское кино (3D)"} + - {id: 693, cat: Movies, desc: " |- Индийское кино"} + - {id: 913, cat: Movies, desc: " |- Фильмы с переводом на др. языках"} + - {id: 228, cat: Movies, desc: " |- Фильмы в оригинале (SD, DVD)"} + - {id: 1150, cat: Movies, desc: " |- Фильмы в оригинале (HD, FHD, UHD)"} + - {id: 1311, cat: Movies, desc: "Коллекции / *логии"} + - {id: 1313, cat: Movies, desc: " |- Зарубежное кино (коллекции / *логии)"} + - {id: 1312, cat: Movies, desc: " |- Отечественное кино (коллекции / *логии)"} + - {id: 256, cat: Movies, desc: "Театр и Музыкальное видео"} + - {id: 257, cat: Movies, desc: " |- Музыкальные клипы"} + - {id: 258, cat: Movies, desc: " |- Концерты (SD)"} + - {id: 883, cat: Movies, desc: " |- Концерты (DVD)"} + - {id: 955, cat: Movies, desc: " |- Концерты (HD, FHD, UHD, 3D)"} + - {id: 905, cat: Movies, desc: " |- Театр"} + - {id: 271, cat: Movies, desc: " |- Опера, Балет, Мюзиклы"} + - {id: 1210, cat: Movies, desc: " |- Караоке"} + - {id: 264, cat: Movies, desc: "Остальное"} + - {id: 265, cat: Movies, desc: " |- Звуковые дорожки и субтитры"} + - {id: 272, cat: Movies, desc: " |- Игровое видео"} + - {id: 1262, cat: Movies, desc: " |- hand made * video"} + - {id: 266, cat: Movies, desc: " |- Трейлеры"} + - {id: 1294, cat: Movies, desc: " |- Фильмы с Рекламой"} + # TV + - {id: 1219, cat: TV, desc: "Классика сериалов и многосерийное кино до 90-х"} + - {id: 1221, cat: TV, desc: " |- Отечественная классика сериалов и старое многосерийное..."} + - {id: 1220, cat: TV, desc: " |- Зарубежная классика сериалов и старое многосерийное кино..."} + - {id: 722, cat: TV, desc: " |- Чертова служба в госпитале МЭШ / M*A*S*H"} + - {id: 768, cat: TV, desc: "Зарубежные сериалы"} + - {id: 1344, cat: Other, desc: " |- Звездные войны / Star Wars (сериалы по франшизе)"} + - {id: 779, cat: TV, desc: " |- Анатомия страсти / Grey's Anatomy"} + - {id: 1288, cat: TV, desc: " |- Во все тяжкие / Breaking Bad; Лучше звоните Солу / Better..."} + - {id: 787, cat: TV, desc: " |- Грань / Fringe"} + - {id: 1141, cat: TV, desc: " |- Дневники вампира / Vampire Diaries; Настоящая кровь /..."} + - {id: 777, cat: TV, desc: " |- Доктор кто / Doctor Who; Торчвуд / Torchwood"} + - {id: 786, cat: TV, desc: " |- Доктор Хаус / House M.D."} + - {id: 776, cat: TV, desc: " |- Звездные врата / Stargate"} + - {id: 785, cat: TV, desc: " |- Звездный Крейсер Галактика / BattleStar Galactica;..."} + - {id: 775, cat: TV, desc: " |- Звездный путь / Star Trek; Орвилл / The Orville"} + - {id: 1265, cat: TV, desc: " |- Игра престолов / Game of Thrones"} + - {id: 1242, cat: TV, desc: " |- Касл / Castle"} + - {id: 1140, cat: TV, desc: " |- Кости / Bones"} + - {id: 782, cat: TV, desc: " |- Менталист / The Mentalist; Теория Лжи / Lie To Me"} + - {id: 773, cat: TV, desc: " |- Место преступления / CSI"} + - {id: 1142, cat: TV, desc: " |- Морская полиция / Navy NCIS; Военно-юридическая служба /..."} + - {id: 772, cat: TV, desc: " |- Побег / Prison Break"} + - {id: 771, cat: TV, desc: " |- Пуаро / Poirot"} + - {id: 783, cat: TV, desc: " |- Сверхъестественное / Supernatural"} + - {id: 1144, cat: TV, desc: " |- Секретные материалы / X-Files"} + - {id: 804, cat: TV, desc: " |- Теория Большого Взрыва / The Big Bang Theory; Детство..."} + - {id: 1290, cat: TV, desc: " |- Ходячие мертвецы / The Walking Dead; Бойтесь ходячих..."} + - {id: 1300, cat: TV, desc: " |- Сериалы ближнего зарубежья"} + - {id: 784, cat: TV, desc: " |- Сериалы DC Comics"} + - {id: 774, cat: TV, desc: " |- Сериалы Marvel Comics"} + - {id: 922, cat: TV, desc: " |- Азиатские сериалы"} + - {id: 770, cat: TV, desc: " |- Латиноамериканские сериалы"} + - {id: 1320, cat: TV, desc: " |- Турецкие сериалы"} + - {id: 780, cat: TV, desc: " |- Сериалы без русского перевода (украинская озвучка)"} + - {id: 781, cat: TV, desc: " |- Сериалы без перевода"} + - {id: 1322, cat: TV, desc: " |- Сериалы с рекламой"} + - {id: 769, cat: TV, desc: "Отечественные сериалы"} + - {id: 799, cat: TV, desc: " |- Бандитский Петербург"} + - {id: 800, cat: TV, desc: " |- Глухарь"} + - {id: 791, cat: TV, desc: " |- Интерны"} + - {id: 793, cat: TV, desc: " |- Ментовские войны"} + - {id: 794, cat: TV, desc: " |- Менты"} + - {id: 796, cat: TV, desc: " |- Солдаты"} + - {id: 795, cat: TV, desc: " |- Универ"} + # Documentary, Telecasts, Sports, Comedy + - {id: 713, cat: TV, desc: "Зарубежные TV-бренды"} + - {id: 706, cat: TV, desc: " |- Animal Planet"} + - {id: 577, cat: TV, desc: " |- BBC"} + - {id: 894, cat: TV, desc: " |- Da Vinci Learning"} + - {id: 578, cat: TV, desc: " |- Discovery"} + - {id: 580, cat: TV, desc: " |- History Channel"} + - {id: 579, cat: TV, desc: " |- National Geographic"} + - {id: 953, cat: TV, desc: " |- PBS"} + - {id: 581, cat: TV, desc: " |- Readers Digest"} + - {id: 806, cat: TV, desc: " |- Интересно обо всем"} + - {id: 714, cat: TV, desc: " |- Мега-Проекты"} + - {id: 761, cat: TV, desc: " |- Доисторический мир"} + - {id: 809, cat: TV, desc: " |- Мир будущего"} + - {id: 924, cat: TV, desc: " |- Одиссея Жака Кусто"} + - {id: 812, cat: TV, desc: " |- Тайны и Загадки"} + - {id: 576, cat: TV, desc: "Документалистика и Телепередачи"} + - {id: 590, cat: TV, desc: " |- Кинолетопись Страны Советской"} + - {id: 591, cat: TV, desc: " |- Вторая Мировая война"} + - {id: 588, cat: TV, desc: " |- Отечественная история"} + - {id: 589, cat: TV, desc: " |- История"} + - {id: 598, cat: TV, desc: " |- Личности в истории"} + - {id: 652, cat: TV, desc: " |- Посвящение искусству"} + - {id: 599, cat: TV, desc: " |- Телешоу"} + - {id: 959, cat: TV, desc: " |- Музыкальные шоу"} + - {id: 956, cat: TV, desc: " |- Интеллектуальные шоу"} + - {id: 597, cat: TV, desc: " |- Непознанное и сверхъестественное"} + - {id: 593, cat: TV, desc: " |- Живая природа"} + - {id: 594, cat: TV, desc: " |- Клуб кинопутешествий"} + - {id: 819, cat: TV, desc: " |- За рулем"} + - {id: 595, cat: TV, desc: " |- Релакс / Relax"} + - {id: 587, cat: TV, desc: " |- Военное дело"} + - {id: 584, cat: TV, desc: " |- Авиация"} + - {id: 586, cat: TV, desc: " |- Космос"} + - {id: 585, cat: TV, desc: " |- Флот"} + - {id: 600, cat: TV, desc: " |- Тележурналистика"} + - {id: 596, cat: TV, desc: " |- Политика и пропаганда, публицистика и экономика"} + - {id: 1295, cat: TV, desc: " |- Общественно-политические и пропагандистские ток-шоу"} + - {id: 614, cat: TV, desc: " |- Религии и культы (Док/TV)"} + - {id: 603, cat: TV, desc: "Спорт и активный отдых"} + - {id: 1206, cat: TV, desc: " |- Футбол. Чемпионат Мира 2022"} + - {id: 1309, cat: TV, desc: " |- Футбол. Чемпионат Европы 2020-2021"} + - {id: 1308, cat: TV, desc: " |- Хоккей. Чемпионат мира 2021"} + - {id: 1194, cat: TV, desc: " |- Летние Олимпийские игры и Паралимпийские игры"} + - {id: 1062, cat: TV, desc: " |- Зимние Олимпийские игры и Паралимпийские игры"} + - {id: 974, cat: TV, desc: " |- Футбол"} + - {id: 609, cat: TV, desc: " |- Баскетбол, Волейбол, Гандбол"} + - {id: 1263, cat: TV, desc: " |- Хоккей"} + - {id: 951, cat: TV, desc: " |- Прочие зимние виды спорта"} + - {id: 975, cat: TV, desc: " |- Бокс"} + - {id: 608, cat: TV, desc: " |- Единоборства, Бои без правил"} + - {id: 607, cat: TV, desc: " |- Гимнастика, Бодибилдинг, Красота тела"} + - {id: 606, cat: TV, desc: " |- Авто, Мото"} + - {id: 750, cat: TV, desc: " |- Формула 1"} + - {id: 605, cat: TV, desc: " |- Экстрим"} + - {id: 604, cat: TV, desc: " |- Рыбалка и Охота"} + - {id: 950, cat: TV, desc: " |- Бильярд"} + - {id: 610, cat: TV, desc: "Юмор (ТВ)"} + - {id: 613, cat: TV, desc: " |- КВН"} + - {id: 612, cat: TV, desc: " |- ПостКВН"} + - {id: 653, cat: TV, desc: " |- Украинские шоу"} + - {id: 654, cat: TV, desc: " |- Маски-шоу"} + - {id: 611, cat: TV, desc: " |- Сатирики"} + - {id: 656, cat: TV, desc: " |- Приколы"} + # anime + - {id: 615, cat: TV/Anime, desc: "Манга и Арт"} + - {id: 616, cat: TV/Anime, desc: " |- Манга, Манхва, Маньхуа"} + - {id: 617, cat: TV/Anime, desc: " |- Ранобэ"} + - {id: 648, cat: TV/Anime, desc: " |- Визуальные новеллы"} + - {id: 619, cat: TV/Anime, desc: " |- Аниме арт"} + - {id: 620, cat: TV/Anime, desc: "Аниме с субтитрами"} + - {id: 623, cat: TV/Anime, desc: " |- Онгоинги"} + - {id: 622, cat: TV/Anime, desc: " |- Аниме (SD)"} + - {id: 621, cat: TV/Anime, desc: " |- Аниме (HD)"} + - {id: 632, cat: TV/Anime, desc: " |- Аниме (FullHD)"} + - {id: 624, cat: TV/Anime, desc: "Аниме с озвучкой"} + - {id: 627, cat: TV/Anime, desc: " |- Онгоинги с озвучкой"} + - {id: 626, cat: TV/Anime, desc: " |- Аниме с озвучкой (SD)"} + - {id: 625, cat: TV/Anime, desc: " |- Аниме с озвучкой (HD)"} + - {id: 644, cat: TV/Anime, desc: " |- Аниме с озвучкой (FullHD)"} + - {id: 628, cat: TV/Anime, desc: "Аниме разное"} + - {id: 635, cat: TV/Anime, desc: " |- Аниме DVD"} + - {id: 634, cat: TV/Anime, desc: " |- Аниме Blu-ray, Remux"} + - {id: 638, cat: TV/Anime, desc: " |- Аниме хардсаб"} + - {id: 646, cat: TV/Anime, desc: " |- Аниме прочее"} + - {id: 645, cat: TV/Anime, desc: "Аниме музыка"} + - {id: 639, cat: TV/Anime, desc: " |- Аниме OST (Lossless)"} + - {id: 640, cat: TV/Anime, desc: " |- Аниме OST"} + # Books and Training Materials + - {id: 432, cat: Books, desc: "Научная и техническая литература"} + - {id: 755, cat: Books, desc: " |- Учебники"} + - {id: 481, cat: Books, desc: " |- Иностранные языки (литература)"} + - {id: 557, cat: Books, desc: " |- Гуманитарные науки и искусство"} + - {id: 442, cat: Books, desc: " |- Точные и естественные науки"} + - {id: 441, cat: Books, desc: " |- Техническая литература"} + - {id: 875, cat: Books, desc: " |- Военно-историческая литература"} + - {id: 444, cat: Books, desc: " |- Научно-популярная литература"} + - {id: 443, cat: Books, desc: " |- Здоровье и медицина"} + - {id: 440, cat: Books, desc: " |- Нормативная документация"} + - {id: 1199, cat: Books, desc: " |- Энциклопедии и словари"} + - {id: 433, cat: Books, desc: "Компьютерная литература"} + - {id: 447, cat: Books, desc: " |- Программирование"} + - {id: 445, cat: Books, desc: " |- Веб-дизайн"} + - {id: 817, cat: Books, desc: " |- 2D графика"} + - {id: 818, cat: Books, desc: " |- 3D графика"} + - {id: 434, cat: Books, desc: "Художественная литература"} + - {id: 957, cat: Books, desc: " |- Многоавторские сборники и Библиотеки"} + - {id: 931, cat: Books, desc: " |- Собрания книг русскоязычных авторов"} + - {id: 1152, cat: Books, desc: " |- Собрания книг иностранных авторов"} + - {id: 455, cat: Books, desc: " |- Сатира, Юмор"} + - {id: 1153, cat: Books, desc: " |- Боевики"} + - {id: 453, cat: Books, desc: " |- Детективы"} + - {id: 452, cat: Books, desc: " |- Исторические книги"} + - {id: 449, cat: Books, desc: " |- Классика, Проза, Поэзия"} + - {id: 1063, cat: Books, desc: " |- Приключенческая литература"} + - {id: 451, cat: Books, desc: " |- Фантастика, Фэнтези"} + - {id: 482, cat: Books, desc: "Комиксы и Артбуки"} + - {id: 483, cat: Books, desc: " |- Комиксы на русском языке"} + - {id: 484, cat: Books, desc: " |- Комиксы без перевода"} + - {id: 1343, cat: Books, desc: " |- Артбуки"} + - {id: 438, cat: Books, desc: "Художественные аудиокниги и публицистика"} + - {id: 485, cat: Books, desc: " |- Сатира, Юмор (аудиокниги)"} + - {id: 473, cat: Books, desc: " |- Детектив, Боевик (аудиокниги)"} + - {id: 472, cat: Books, desc: " |- Исторические аудиокниги"} + - {id: 471, cat: Books, desc: " |- Классика (аудиокниги)"} + - {id: 895, cat: Books, desc: " |- Проза, Поэзия (аудиокниги)"} + - {id: 470, cat: Books, desc: " |- Фантастика, Фэнтези (аудиокниги)"} + - {id: 896, cat: Books, desc: " |- Публицистика (аудиокниги)"} + - {id: 480, cat: Books, desc: " |- Другие аудиокниги"} + - {id: 436, cat: Books, desc: "Обучающие аудиоматериалы"} + - {id: 458, cat: Books, desc: " |- Бизнес и Менеджмент (аудиоматериалы)"} + - {id: 457, cat: Books, desc: " |- Иностранные языки (аудиоматериалы)"} + - {id: 1342, cat: Books, desc: " |- Здоровье и Медицина (аудиоматериалы)"} + - {id: 459, cat: Books, desc: " |- Популярная психология и саморазвитие (аудиоматериалы)"} + - {id: 460, cat: Books, desc: " |- Медитации (аудиоматериалы)"} + - {id: 461, cat: Books, desc: " |- Религия (аудиоматериалы)"} + - {id: 462, cat: Books, desc: " |- Прочие аудиоматериалы"} + - {id: 437, cat: Books, desc: "Обучающие видеоматериалы"} + - {id: 466, cat: Books, desc: " |- Бизнес и Менеджмент (видеокурсы)"} + - {id: 1319, cat: Books, desc: " |- Иностранные языки (видеокурсы)"} + - {id: 463, cat: Books, desc: " |- IT, Компьютерные видеокурсы"} + - {id: 958, cat: Books, desc: " |- Дизайн, рисование (видеокурсы)"} + - {id: 1223, cat: Books, desc: " |- Фотография и Видео (видеокурсы)"} + - {id: 467, cat: Books, desc: " |- Здоровье и Спорт (видеокурсы)"} + - {id: 464, cat: Books, desc: " |- Психология и саморазвитие (видеокурсы)"} + - {id: 465, cat: Books, desc: " |- Музыка (видеокурсы)"} + - {id: 469, cat: Books, desc: " |- Другие видеокурсы"} + - {id: 439, cat: Books, desc: "Мультимедийные материалы"} + - {id: 477, cat: Books, desc: " |- Образование"} + - {id: 476, cat: Books, desc: " |- Иностранные языки"} + - {id: 475, cat: Books, desc: " |- Компьютеры"} + - {id: 474, cat: Books, desc: " |- Мультимедийные справочники, Энциклопедии"} + - {id: 886, cat: Books, desc: " |- Приложения к журналам"} + - {id: 478, cat: Books, desc: " |- Другие мультимедийные материалы"} + - {id: 486, cat: Books, desc: "Журналы"} + - {id: 490, cat: Books, desc: " |- Мужские журналы"} + - {id: 657, cat: Books, desc: " |- Женские журналы"} + - {id: 489, cat: Books, desc: " |- Игровые журналы"} + - {id: 488, cat: Books, desc: " |- Компьютерные журналы"} + - {id: 487, cat: Books, desc: " |- Научно-популярные журналы"} + - {id: 1198, cat: Books, desc: " |- Журналы по электротехнике и радиоэлектронике"} + - {id: 1227, cat: Books, desc: " |- Кулинарные журналы"} + - {id: 893, cat: Books, desc: " |- Домоводство (журналы)"} + - {id: 491, cat: Books, desc: " |- Хобби (журналы)"} + - {id: 767, cat: Books, desc: " |- Другие журналы"} + - {id: 299, cat: Books, desc: "Автомобили"} + - {id: 887, cat: Books, desc: " |- Автомобильные журналы"} + - {id: 301, cat: Books, desc: " |- Автомобильная литература"} + - {id: 1334, cat: Books, desc: " |- Автомобильные обуч.видео"} + - {id: 300, cat: Books, desc: " |- Автомобильные мультимедийные материалы"} + - {id: 1341, cat: Books, desc: " |- Автомобильные программы и навигаторы"} + - {id: 492, cat: Books, desc: "Разное (категория книг)"} + - {id: 558, cat: Books, desc: " |- Бизнес, Менеджмент, Деловая литература"} + - {id: 1173, cat: Books, desc: " |- Публицистика"} + - {id: 1176, cat: Books, desc: " |- Историография"} + - {id: 1174, cat: Books, desc: " |- Популярная психология и саморазвитие"} + - {id: 1171, cat: Books, desc: " |- Эзотерика"} + - {id: 662, cat: Books, desc: " |- Религиозная литература"} + - {id: 1175, cat: Books, desc: " |- Нетрадиционная медицина"} + - {id: 1172, cat: Books, desc: " |- Строительство и ремонт"} + - {id: 933, cat: Books, desc: " |- Сад, огород, животноводство"} + - {id: 815, cat: Books, desc: " |- Кулинария"} + - {id: 1170, cat: Books, desc: " |- Спорт, Фитнес, Боевые искусства"} + - {id: 398, cat: Books, desc: " |- Ноты и обучение музыке"} + - {id: 816, cat: Books, desc: " |- На досуге"} + # Music + - {id: 313, cat: Audio, desc: "HD Audio и Многоканальная Музыка"} + - {id: 1291, cat: Audio, desc: " |- Blu-ray Audio"} + - {id: 680, cat: Audio, desc: " |- DVD-Audio"} + - {id: 1149, cat: Audio, desc: " |- SACD-R"} + - {id: 429, cat: Audio, desc: " |- DTS-Audio"} + - {id: 1234, cat: Audio, desc: " |- WEB-DL-Audio"} + - {id: 681, cat: Audio, desc: " |- Vinyl-Rip и Hand-Made"} + - {id: 330, cat: Audio, desc: "Классика"} + - {id: 1256, cat: Audio, desc: " |- Классика (HD Audio)"} + - {id: 1285, cat: Audio, desc: " |- Полные собрания сочинений (Lossless)"} + - {id: 370, cat: Audio, desc: " |- Полные собрания сочинений"} + - {id: 1260, cat: Audio, desc: " |- Вокал (Lossless)"} + - {id: 371, cat: Audio, desc: " |- Вокал"} + - {id: 1261, cat: Audio, desc: " |- Концерты (Lossless)"} + - {id: 375, cat: Audio, desc: " |- Концерты"} + - {id: 1259, cat: Audio, desc: " |- Оркестровая (Lossless)"} + - {id: 374, cat: Audio, desc: " |- Оркестровая"} + - {id: 1257, cat: Audio, desc: " |- Камерная (Lossless)"} + - {id: 373, cat: Audio, desc: " |- Камерная"} + - {id: 1258, cat: Audio, desc: " |- Фортепиано (Lossless)"} + - {id: 372, cat: Audio, desc: " |- Фортепиано"} + - {id: 1160, cat: Audio, desc: " |- В обработке/Classical Crossover/Neoclassical (Lossless)"} + - {id: 876, cat: Audio, desc: " |- В обработке/Classical Crossover/Neoclassical"} + - {id: 1255, cat: Audio, desc: " |- Классика (сборники) (Lossless)"} + - {id: 376, cat: Audio, desc: " |- Классика (сборники)"} + - {id: 326, cat: Audio, desc: "Jazz, Blues, Soul"} + - {id: 359, cat: Audio, desc: " |- Jazz (Lossless)"} + - {id: 358, cat: Audio, desc: " |- Jazz"} + - {id: 1188, cat: Audio, desc: " |- Blues, Soul (Lossless)"} + - {id: 1189, cat: Audio, desc: " |- Blues, Soul"} + - {id: 328, cat: Audio, desc: "Шансон, Авторская и Военная песня"} + - {id: 1180, cat: Audio, desc: " |- Зарубежный Шансон (Lossless)"} + - {id: 1181, cat: Audio, desc: " |- Зарубежный Шансон"} + - {id: 364, cat: Audio, desc: " |- Русский Шансон (Lossless)"} + - {id: 363, cat: Audio, desc: " |- Русский Шансон"} + - {id: 1179, cat: Audio, desc: " |- Авторская и Военная песня (Lossless)"} + - {id: 879, cat: Audio, desc: " |- Авторская и Военная песня"} + - {id: 322, cat: Audio, desc: "Rock, Alternative, Punk, Metal"} + - {id: 962, cat: Audio, desc: " |- Rock (Lossless)"} + - {id: 333, cat: Audio, desc: " |- Rock"} + - {id: 965, cat: Audio, desc: " |- Alternative, Punk (Lossless)"} + - {id: 336, cat: Audio, desc: " |- Alternative, Punk"} + - {id: 337, cat: Audio, desc: " |- Hard Rock (Lossless)"} + - {id: 338, cat: Audio, desc: " |- Hard Rock"} + - {id: 963, cat: Audio, desc: " |- Metal (Lossless)"} + - {id: 334, cat: Audio, desc: " |- Metal"} + - {id: 961, cat: Audio, desc: " |- Русский Рок (Lossless)"} + - {id: 332, cat: Audio, desc: " |- Русский рок"} + - {id: 325, cat: Audio, desc: "Pop"} + - {id: 1165, cat: Audio, desc: " |- Eurodance, Euro-House, Technopop (Lossless)"} + - {id: 1166, cat: Audio, desc: " |- Eurodance, Euro-House, Technopop"} + - {id: 1168, cat: Audio, desc: " |- Disco, Italo-Disco, Euro-Disco, Hi-NRG"} + - {id: 1167, cat: Audio, desc: " |- Disco, Italo-Disco, Euro-Disco, Hi-NRG (Lossless)"} + - {id: 1162, cat: Audio, desc: " |- Отечественная поп-музыка (Lossless)"} + - {id: 352, cat: Audio, desc: " |- Отечественная поп-музыка"} + - {id: 1164, cat: Audio, desc: " |- Советская эстрада, Ретро (Lossless)"} + - {id: 1163, cat: Audio, desc: " |- Советская эстрада, Ретро"} + - {id: 1161, cat: Audio, desc: " |- Зарубежная поп-музыка (Lossless)"} + - {id: 353, cat: Audio, desc: " |- Зарубежная поп-музыка"} + - {id: 324, cat: Audio, desc: "Electronic"} + - {id: 1327, cat: Audio, desc: " |- Psybient, Psychill, Psydub (Lossless)"} + - {id: 1328, cat: Audio, desc: " |- Psybient, Psychill, Psydub"} + - {id: 1325, cat: Audio, desc: " |- Downtempo, Trip-Hop, Lounge (Lossless)"} + - {id: 1326, cat: Audio, desc: " |- Downtempo, Trip-Hop, Lounge"} + - {id: 1323, cat: Audio, desc: " |- Ambient, Experimental, Modern Classical (Lossless)"} + - {id: 1324, cat: Audio, desc: " |- Ambient, Experimental, Modern Classical"} + - {id: 976, cat: Audio, desc: " |- Trance (Lossless)"} + - {id: 346, cat: Audio, desc: " |- Trance"} + - {id: 1243, cat: Audio, desc: " |- Label-Packs"} + - {id: 977, cat: Audio, desc: " |- House, Techno, Electro, Minimal (Lossless)"} + - {id: 345, cat: Audio, desc: " |- House"} + - {id: 349, cat: Audio, desc: " |- Techno, Electro, Minimal"} + - {id: 347, cat: Audio, desc: " |- Easy listening"} + - {id: 979, cat: Audio, desc: " |- Industrial, EBM, Dark Electro (Lossless)"} + - {id: 673, cat: Audio, desc: " |- Experimental Electronic"} + - {id: 671, cat: Audio, desc: " |- Industrial, EBM, Dark Electro"} + - {id: 1224, cat: Audio, desc: " |- IDM (Lossless)"} + - {id: 1225, cat: Audio, desc: " |- IDM"} + - {id: 980, cat: Audio, desc: " |- Synthpop, New Wave (Lossless)"} + - {id: 672, cat: Audio, desc: " |- Synthpop, New Wave"} + - {id: 1316, cat: Audio, desc: " |- Dubstep, Future Garage, Bass Music, UK Garage (Lossless)"} + - {id: 1317, cat: Audio, desc: " |- Dubstep, Future Garage, Bass Music, UK Garage"} + - {id: 981, cat: Audio, desc: " |- Drum'n'Bass, Jungle, Breaks, Breakbeat (Lossless)"} + - {id: 344, cat: Audio, desc: " |- Drum'n'Bass, Jungle, Breaks, Breakbeat"} + - {id: 983, cat: Audio, desc: " |- Hardstyle, Jumpstyle, Hardcore (Lossless)"} + - {id: 984, cat: Audio, desc: " |- Hardstyle, Jumpstyle, Hardcore"} + - {id: 982, cat: Audio, desc: " |- Psychedelic, psytrance, fullon (Lossless)"} + - {id: 348, cat: Audio, desc: " |- Psychedelic, psytrance, fullon"} + - {id: 674, cat: Audio, desc: " |- Radioshow, Live Mixes"} + - {id: 323, cat: Audio, desc: "Rap, Hip-hop, RnB, Reggae"} + - {id: 1187, cat: Audio, desc: " |- Rap, Hip-hop зарубежный (Lossless)"} + - {id: 339, cat: Audio, desc: " |- Rap, Hip-hop зарубежный"} + - {id: 1186, cat: Audio, desc: " |- Rap, Hip-hop отечественный (Lossless)"} + - {id: 340, cat: Audio, desc: " |- Rap, Hip-hop отечественный"} + - {id: 1185, cat: Audio, desc: " |- RnB, Reggae (Lossless)"} + - {id: 341, cat: Audio, desc: " |- RnB, Reggae"} + - {id: 329, cat: Audio, desc: "East Asian Music"} + - {id: 369, cat: Audio, desc: " |- Asian Traditional, Ethnic (Lossless)"} + - {id: 368, cat: Audio, desc: " |- Asian Traditional, Ethnic"} + - {id: 1218, cat: Audio, desc: " |- Asian Pop (Lossless)"} + - {id: 365, cat: Audio, desc: " |- Asian Pop"} + - {id: 1217, cat: Audio, desc: " |- Asian Rock, Metal (Lossless)"} + - {id: 366, cat: Audio, desc: " |- Asian Rock, Metal"} + - {id: 1215, cat: Audio, desc: " |- Doujin Music (Lossless)"} + - {id: 1216, cat: Audio, desc: " |- Doujin Music"} + - {id: 1213, cat: Audio, desc: " |- Other Asian (Lossless)"} + - {id: 367, cat: Audio, desc: " |- Other Asian"} + - {id: 331, cat: Audio, desc: "Other Styles"} + - {id: 1157, cat: Audio, desc: " |- Instrumental (Lossless)"} + - {id: 711, cat: Audio, desc: " |- Instrumental"} + - {id: 1159, cat: Audio, desc: " |- New Age/Meditative/Relax (Lossless)"} + - {id: 378, cat: Audio, desc: " |- New Age/Meditative/Relax"} + - {id: 1158, cat: Audio, desc: " |- Folk (Lossless)"} + - {id: 379, cat: Audio, desc: " |- Folk"} + - {id: 380, cat: Audio, desc: " |- Other (Lossless)"} + - {id: 1178, cat: Audio, desc: " |- Other"} + - {id: 361, cat: Audio, desc: " |- OST (Lossless)"} + - {id: 360, cat: Audio, desc: " |- OST"} + - {id: 327, cat: Audio, desc: "Неофициальные сборники"} + - {id: 1184, cat: Audio, desc: " |- Jazz, Blues, Soul (сборники)"} + - {id: 824, cat: Audio, desc: " |- Шансон, Авторская и Военная песня (сборники)"} + - {id: 1182, cat: Audio, desc: " |- Rock, Alternative, Punk, Metal (сборники)"} + - {id: 354, cat: Audio, desc: " |- Pop (сборники)"} + - {id: 877, cat: Audio, desc: " |- Electronic (сборники)"} + - {id: 1183, cat: Audio, desc: " |- Rap, Hip-hop, RnB, Reggae (сборники)"} + - {id: 1190, cat: Audio, desc: " |- Instrumental/New Age/Meditative/Relax (сборники)"} + - {id: 917, cat: Audio, desc: " |- Прочее (сборники)"} + # Other + - {id: 410, cat: Other, desc: "Win Игры"} + - {id: 411, cat: Other, desc: " |- Горячие новинки Игр"} + - {id: 412, cat: Other, desc: " |- Action (FPS)"} + - {id: 1008, cat: Other, desc: " |- Action (TPS)"} + - {id: 415, cat: Other, desc: " |- Adventure/Quest"} + - {id: 746, cat: Other, desc: " |- Arcade"} + - {id: 428, cat: Other, desc: " |- Online (MMO)"} + - {id: 1009, cat: Other, desc: " |- Online Action (MMO)"} + - {id: 413, cat: Other, desc: " |- RPG"} + - {id: 414, cat: Other, desc: " |- Strategy (RTS/TBS/Grand)"} + - {id: 1010, cat: Other, desc: " |- Strategy Tactical (RTS/TBS)"} + - {id: 1012, cat: Other, desc: " |- Strategy (Manage/Busin)"} + - {id: 1014, cat: Other, desc: " |- Racing"} + - {id: 416, cat: Other, desc: " |- Simulation (Flight/Space)"} + - {id: 1013, cat: Other, desc: " |- Simulation (Sport)"} + - {id: 1015, cat: Other, desc: " |- Simulation (Other)"} + - {id: 268, cat: Other, desc: " |- Action/Arcade/Platformer (Casual)"} + - {id: 1016, cat: Other, desc: " |- Adventure/Quest (Casual)"} + - {id: 1041, cat: Other, desc: " |- Classic Arcade/Zuma/3match (Casual)"} + - {id: 1018, cat: Other, desc: " |- Board/Puzzle/Logic (Casual)"} + - {id: 1017, cat: Other, desc: " |- Strategy/Manager/Business (Casual)"} + - {id: 972, cat: Other, desc: " |- AddOn/DLC/Mod для Игр"} + - {id: 971, cat: Other, desc: " |- Demo/Beta версии Игр"} + - {id: 970, cat: Other, desc: " |- Языковые пакеты для Игр"} + - {id: 969, cat: Other, desc: " |- Patch/Tweak/Trainer/Other для Игр"} + - {id: 968, cat: Other, desc: " |- NoCD/NoDVD/Crack для Игр"} + - {id: 1146, cat: Other, desc: " |- Песочница Win Игр"} + - {id: 418, cat: Other, desc: "Win Старые Игры"} + - {id: 1061, cat: Other, desc: " |- Action (FPS)"} + - {id: 1060, cat: Other, desc: " |- Action (TPS)"} + - {id: 1059, cat: Other, desc: " |- Adventure/Quest"} + - {id: 1058, cat: Other, desc: " |- Arcade"} + - {id: 1057, cat: Other, desc: " |- RPG"} + - {id: 1056, cat: Other, desc: " |- Strategy (RTS/TBS/Grand)"} + - {id: 1054, cat: Other, desc: " |- Strategy Tactical (RTS/TBS/Wargame)"} + - {id: 1053, cat: Other, desc: " |- Strategy (Manage/Busin)"} + - {id: 1052, cat: Other, desc: " |- Racing"} + - {id: 1051, cat: Other, desc: " |- Simulation (Flight/Space)"} + - {id: 1050, cat: Other, desc: " |- Simulation (Sport)"} + - {id: 1049, cat: Other, desc: " |- Simulation (Other)"} + - {id: 1048, cat: Other, desc: " |- AddOn/DLC/Mod для Игр"} + - {id: 1047, cat: Other, desc: " |- Demo/Beta версии Игр"} + - {id: 1046, cat: Other, desc: " |- Языковые пакеты для Игр"} + - {id: 1045, cat: Other, desc: " |- Patch/Tweak/Trainer/Other для Игр"} + - {id: 1044, cat: Other, desc: " |- NoCD/NoDVD/Crack для Игр"} + - {id: 382, cat: Other, desc: "Консольные Игры"} + - {id: 390, cat: Other, desc: " |- Тех. раздел Консолей"} + - {id: 387, cat: Other, desc: " |- Xbox 360"} + - {id: 388, cat: Other, desc: " |- Wii, GameCube"} + - {id: 1264, cat: Other, desc: " |- Wii U"} + - {id: 1318, cat: Other, desc: " |- Switch"} + - {id: 385, cat: Other, desc: " |- PS1"} + - {id: 386, cat: Other, desc: " |- PS2"} + - {id: 848, cat: Other, desc: " |- PS3"} + - {id: 1321, cat: Other, desc: " |- PS4"} + - {id: 383, cat: Other, desc: " |- PSP"} + - {id: 384, cat: Other, desc: " |- Psx to PSP"} + - {id: 1292, cat: Other, desc: " |- PS Vita"} + - {id: 389, cat: Other, desc: " |- Ромы"} + - {id: 391, cat: Other, desc: " |- Другие приставки"} + # pda and mobile + - {id: 1240, cat: Other, desc: " |- Всё для детей и родителей для Android"} + - {id: 830, cat: Other, desc: " |- ПО для Android"} + - {id: 833, cat: Other, desc: " |- Игры для Android"} + - {id: 839, cat: Other, desc: " |- Навигация для Android"} + - {id: 1233, cat: Other, desc: " |- Прошивки для Android устройств"} + - {id: 1236, cat: Other, desc: " |- Вспомогательное ПО для Android"} + - {id: 832, cat: Other, desc: " |- ПО и Игры на Java"} + - {id: 829, cat: Other, desc: " |- ПО и Игры для Symbian"} + - {id: 828, cat: Other, desc: " |- ПО и Игры для Windows Mobile"} + - {id: 1231, cat: Other, desc: " |- Навигация для др. мобильных устройств"} + - {id: 840, cat: Other, desc: " |- Прошивки для др. мобильных устройств"} + - {id: 1232, cat: Other, desc: " |- Вспомогательное ПО для др. мобильных устройств"} + - {id: 841, cat: Other, desc: " |- Прочее для мобильных устройств"} + - {id: 1238, cat: Other, desc: " |- Карты для навигационного ПО"} + - {id: 844, cat: Other, desc: " |- Мобильное Аудио"} + - {id: 842, cat: Other, desc: " |- Мобильное Видео"} + - {id: 843, cat: Other, desc: " |- Темы и Изображения"} + # apple + - {id: 537, cat: Other, desc: " |- macOS (Apple)"} + - {id: 538, cat: Other, desc: " |- macOS (osx86project/hackintosh)"} + - {id: 1151, cat: Other, desc: " |- Разное для macOS (Apple/hackintosh)"} + - {id: 1083, cat: Other, desc: " |- Графика для macOS"} + - {id: 1029, cat: Other, desc: " |- CAD, 3D, ПО для специалистов для macOS"} + - {id: 1082, cat: Other, desc: " |- Офис, Интернет для macOS"} + - {id: 1028, cat: Other, desc: " |- Аудио и видео редакторы для macOS"} + - {id: 1087, cat: Other, desc: " |- Плееры, конвертеры, кодеки для macOS"} + - {id: 1030, cat: Other, desc: " |- Утилиты для macOS"} + - {id: 1039, cat: Other, desc: " |- Kinder Games для macOS"} + - {id: 1038, cat: Other, desc: " |- Quests, Adventure, Arcade для macOS"} + - {id: 1037, cat: Other, desc: " |- Action, FPS для macOS"} + - {id: 1036, cat: Other, desc: " |- Strategy, RPG для macOS"} + - {id: 1035, cat: Other, desc: " |- Racing, Simulation, Sports для macOS"} + - {id: 1034, cat: Other, desc: " |- Casual Games, Other для macOS"} + - {id: 822, cat: Other, desc: " |- Тестовые macOS Игры"} + - {id: 1093, cat: Other, desc: " |- Прошивки iOS и AppleTV"} + - {id: 1092, cat: Other, desc: " |- UnLock, Jailbreak, Cydia"} + - {id: 1091, cat: Other, desc: " |- ПО для iOS"} + - {id: 834, cat: Other, desc: " |- Игры для iOS"} + - {id: 831, cat: Other, desc: " |- ПО из App Store"} + - {id: 1155, cat: Other, desc: " |- Отечественное видео для устройств Apple"} + - {id: 1156, cat: Other, desc: " |- Отечественное видео HD для устройств Apple"} + - {id: 1099, cat: Other, desc: " |- Зарубежное видео для устройств Apple"} + - {id: 1098, cat: Other, desc: " |- Зарубежное видео HD для устройств Apple"} + - {id: 1096, cat: Other, desc: " |- Музыка (AAC)"} + - {id: 1097, cat: Other, desc: " |- Музыка Lossless (ALAC)"} + - {id: 1095, cat: Other, desc: " |- Аудиокниги (AAC)"} + # linux + - {id: 536, cat: Other, desc: "Linux, Unix и другие ОС"} + - {id: 563, cat: Other, desc: " |- ОС Linux"} + - {id: 1032, cat: Other, desc: " |- ОС *Nix (Alpha, Beta, RC)"} + - {id: 1031, cat: Other, desc: " |- Сборки ОС Linux"} + - {id: 1025, cat: Other, desc: " |- ОС *BSD"} + - {id: 1026, cat: Other, desc: " |- Другие ОС"} + - {id: 564, cat: Other, desc: " |- *Nix. Программы"} + - {id: 1137, cat: Other, desc: " |- Специализированные ОС"} + - {id: 417, cat: Other, desc: "*Nix Игры"} + - {id: 1193, cat: Other, desc: " |- Native *Nix Games"} + - {id: 1192, cat: Other, desc: " |- Ported *Nix Games"} + # multimedia, designs, graphics + - {id: 1102, cat: Other, desc: "Материалы для мультимедиа и дизайна"} + - {id: 1070, cat: Other, desc: " |- Digital Juice"} + - {id: 534, cat: Other, desc: " |- Звуковые библиотеки"} + - {id: 1077, cat: Other, desc: " |- Дополнения"} + - {id: 267, cat: Other, desc: " |- Футажи"} + - {id: 1071, cat: Other, desc: " |- 3D модели и материалы"} + - {id: 1134, cat: Other, desc: " |- Web-дизайн и шаблоны сайтов"} + - {id: 1107, cat: Other, desc: " |- Текстуры и Фоны"} + - {id: 1075, cat: Other, desc: " |- Шрифты"} + - {id: 1105, cat: Other, desc: " |- Шаблоны и Рамки"} + - {id: 676, cat: Other, desc: " |- Костюмы"} + - {id: 1072, cat: Other, desc: " |- Растровый клипарт (фото)"} + - {id: 166, cat: Other, desc: " |- Растровый клипарт (элементы)"} + - {id: 1078, cat: Other, desc: " |- Растровый клипарт (иллюстрации)"} + - {id: 1074, cat: Other, desc: " |- Векторный клипарт"} + - {id: 1076, cat: Other, desc: " |- Сборники"} + - {id: 1266, cat: Other, desc: "Проекты"} + - {id: 1267, cat: Other, desc: " |- Детские (проекты)"} + - {id: 1268, cat: Other, desc: " |- Свадебные и романтические (проекты)"} + - {id: 1269, cat: Other, desc: " |- Праздничные (проекты)"} + - {id: 1270, cat: Other, desc: " |- Презентации (проекты)"} + - {id: 1277, cat: Other, desc: " |- Трейлеры (проекты)"} + - {id: 1271, cat: Other, desc: " |- Спортивные (проекты)"} + - {id: 1272, cat: Other, desc: " |- Логотипы (проекты)"} + - {id: 1273, cat: Other, desc: " |- Слайдшоу (проекты)"} + - {id: 1274, cat: Other, desc: " |- Титры (проекты)"} + - {id: 1275, cat: Other, desc: " |- Элементы (проекты)"} + - {id: 1276, cat: Other, desc: " |- Разное (проекты)"} + - {id: 1103, cat: Other, desc: "Графика, Арт, Разное"} + - {id: 1114, cat: Other, desc: " |- Классическое искусство"} + - {id: 1113, cat: Other, desc: " |- Современное изобразительное искусство"} + - {id: 1115, cat: Other, desc: " |- Книжная иллюстрация"} + - {id: 1129, cat: Other, desc: " |- Современная фотография"} + - {id: 1111, cat: Other, desc: " |- Иконки и аватарки"} + - {id: 1116, cat: Other, desc: " |- Картинки"} + - {id: 808, cat: Other, desc: " |- Обои для рабочего стола"} + - {id: 1139, cat: Other, desc: " |- Обои для рабочего стола (16+)"} + - {id: 988, cat: Other, desc: " |- Графика (16+)"} + - {id: 1073, cat: Other, desc: " |- Интернет-творчество"} + # temp, archive + - {id: 892, cat: Other, desc: " |- Архив Мультфильмов"} + - {id: 91, cat: Other, desc: " |- Архив Видео. Кино, Театра"} + - {id: 150, cat: Other, desc: " |- Архив неактуальных Экранок и любого видео с Рекламой"} + - {id: 668, cat: Other, desc: " |- Архив Классики кино и Старых фильмов до 90-х"} + - {id: 1143, cat: Other, desc: " |- Архив Музыкального Видео"} + - {id: 802, cat: Other, desc: " |- Архив Сериалов и Архив Старого многосерийного кино до 90-х"} + - {id: 669, cat: Other, desc: " |- Архив Документалистики и TV"} + - {id: 400, cat: Other, desc: " |- Архив Юмора"} + - {id: 169, cat: Other, desc: " |- Архив Аниме"} + - {id: 94, cat: Other, desc: " |- Архив Книг и обучающих материалов"} + - {id: 303, cat: Other, desc: " |- Архив Авто"} + - {id: 92, cat: Other, desc: " |- Архив Музыки"} + - {id: 93, cat: Other, desc: " |- Архив Игр"} + - {id: 1333, cat: Other, desc: " |- Архив *Nix"} + - {id: 95, cat: Other, desc: " |- Архив Программ"} + - {id: 184, cat: Other, desc: " |- Архив КПК и Мобильных устройств"} + - {id: 1080, cat: Other, desc: " |- Архив 4Apple"} + - {id: 180, cat: Other, desc: " |- Архив Медиа-Диз-Графика"} + - {id: 145, cat: Other, desc: " |- Видео (temp)"} + - {id: 146, cat: Other, desc: " |- Аниме (temp)"} + - {id: 161, cat: Other, desc: " |- Книги (temp)"} + - {id: 147, cat: Other, desc: " |- Музыка (temp)"} + - {id: 148, cat: Other, desc: " |- Игры (temp)"} + - {id: 149, cat: Other, desc: " |- Программы (temp)"} + - {id: 183, cat: Other, desc: " |- КПК и Мобильные устройства (temp)"} + - {id: 1145, cat: Other, desc: " |- 4Apple (temp)"} + - {id: 171, cat: Other, desc: " |- Медиа-Диз-Графика (temp)"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + allowrawsearch: true + +settings: + - name: stripcyrillic + type: checkbox + label: Strip Cyrillic Letters + default: false + - name: addrussiantotitle + type: checkbox + label: Add RUS to end of all titles to improve language detection by Sonarr and Radarr. Will cause English-only results to be misidentified. + default: false + - name: sort + type: select + label: Sort requested from site + default: 1 + options: + 1: created + 10: seeders + 7: size + 2: title + - name: type + type: select + label: Order requested from site + default: 2 + options: + 2: desc + 1: asc + +search: + paths: + - path: forum/tracker.php + method: post + inputs: + $raw: "{{ if .Categories }}{{ range .Categories }}f[]={{.}}&{{end}}{{ else }}f[]=-1{{ end }}" + o: "{{ .Config.sort }}" + s: "{{ .Config.type }}" + tm: -1 + shf: 1 + sha: 1 + ta: -1 + sns: -1 + sds: 4 # only freeleech available for download without account + nm: "{{ .Keywords }}" + submit: "Поиск" + + keywordsfilters: + - name: re_replace # S01 to сезон 1 + args: ["(?i)\\bS0*(\\d+)\\b", "сезон $1"] + - name: re_replace # E02 to сери 1 + args: ["(?i)\\bE0*(\\d+)\\b", "сери $1"] + - name: re_replace # S01E02 to сезон 1 сери 2 + args: ["(?i)\\bS0*(\\d+)E0*(\\d+)\\b", "сезон $1 сери $2"] + + rows: + selector: table.forumline.tablesorter > tbody > tr:has(a[href^="viewtopic.php?t="]):has(a[href^="download.php?id="]) + + fields: + category_id: + selector: a[href^="tracker.php?f="] + attribute: href + filters: + - name: querystring + args: f + category: + text: "{{ .Result.category_id }}" + title: + selector: a[href^="viewtopic.php?t="] > b + filters: + # normalize to SXXEYY format + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)\\s*(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)", "S$1E$2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?)", "S$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+[CС]езоны?", "S$1"] + - name: re_replace + args: ["(?i)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)", "E$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "E$1"] + - name: re_replace + args: ["(?i)\\bКураж-Бамбей\\b", "kurazh"] + - name: re_replace + args: ["(?i)\\bКубик в Кубе\\b", "Kubik"] + - name: re_replace + args: ["(?i)\\bКравец\\b", "Kravec"] + - name: re_replace + args: ["(?i)\\bПифагор\\b", "Pifagor"] + - name: re_replace + args: ["(?i)\\bНевафильм\\b", "Nevafilm"] + - name: re_replace + args: ["(?i)\\bЛицензия\\b", "Lic"] + - name: re_replace + args: ["(?i)\\bселезень\\b", "selezen"] + - name: re_replace + args: ["(?i)\\sот\\s([\\w\\p{P}\\p{S}]+)$", "-$1"] + - name: re_replace + args: ["\\s\\|\\s(\\w{4,})$", "-$1"] + - name: re_replace + args: ["(\\([\\p{IsCyrillic}\\W]+\\))|(^[\\p{IsCyrillic}\\W\\d]+\\/ )|([\\p{IsCyrillic} \\-]+,+)|([\\p{IsCyrillic}]+)", "{{ if .Config.stripcyrillic }}{{ else }}$1$2$3$4{{ end }}"] + - name: re_replace + args: ["(?i)\\bHDTV[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bSAT[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bWEB[-\\s]?DL[-\\s]?Rip\\b", "WEB-DL"] + - name: re_replace + args: ["(?i)\\bWEB\\sRip\\b", "WEBRip"] + - name: re_replace + args: ["(?i)\\bWEB\\sDL\\b", "WEB-DL"] + - name: re_replace + args: ["[\\[\\(\\{<«][\\s\\W]*[\\]\\)\\}>»]", ""] + - name: re_replace + args: ["^[\\s&,\\.!\\?\\+\\-_\\|\\/':]+", ""] + - name: append + args: "{{ if and (ne .Result.category_id \"913\") (.Config.addrussiantotitle) }} RUS{{ else }}{{ end }}" + details: + selector: a[href^="viewtopic.php?t="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + size: + selector: td:nth-child(6) > u + grabs: + selector: td:nth-child(9) + date: + # unix + selector: td:last-child > u + seeders: + selector: td.seedmed > b + leechers: + selector: td.leechmed > b + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 + description: + selector: a[href^="viewtopic.php?t="] > b +# engine n/a diff --git a/config/prowlarr/Definitions/noname-clubl.yml b/config/prowlarr/Definitions/noname-clubl.yml new file mode 100644 index 0000000..b4c32a3 --- /dev/null +++ b/config/prowlarr/Definitions/noname-clubl.yml @@ -0,0 +1,915 @@ +--- +id: noname-clubl +name: NoNaMe ClubL +description: "This is the NoNaMe Club indexer with Login enabled in the config." +language: ru-RU +type: semi-private +encoding: windows-1251 +links: + - https://nnmclub.to/ +legacylinks: + - https://nnm-club.name/ + - https://nnm-club.me/ + - http://nnmclub.to/ + +caps: + categorymappings: + # forum + - {id: 48, cat: Other, desc: "Форум Региональные встречи"} + # forum tracker + - {id: 925, cat: Other, desc: "Форум-Трекер: Клубные таланты Авторские релизы"} + - {id: 872, cat: Other, desc: "Форум-Трекер: Клубные таланты Архив"} + # Everything for children and parents + - {id: 724, cat: TV, desc: "Видео, Кино и Сериалы для детей и родителей"} + - {id: 725, cat: TV, desc: " |- Обучающее Видео для родителей"} + - {id: 729, cat: TV, desc: " |- Развивающее Видео для детей"} + - {id: 731, cat: TV, desc: " |- Отечественные Фильмы и Сериалы для детей (SD)"} + - {id: 1345, cat: TV, desc: " |- Отечественные Фильмы и Сериалы для детей (HD, FHD, UHD)"} + - {id: 733, cat: TV, desc: " |- Зарубежные Фильмы и Сериалы для детей (SD)"} + - {id: 1346, cat: TV, desc: " |- Зарубежные Фильмы и Сериалы для детей (HD, FHD, UHD)"} + - {id: 1329, cat: TV, desc: " |- Отечественные Мультфильмы 20-го века (SD)"} + - {id: 1330, cat: TV, desc: " |- Отечественные Мультфильмы 20-го века (HD, FHD, UHD)"} + - {id: 1331, cat: TV, desc: " |- Отечественные Мультфильмы 21-го века (SD)"} + - {id: 1332, cat: TV, desc: " |- Отечественные Мультфильмы 21-го века (HD, FHD, UHD, 3D)"} + - {id: 1340, cat: TV, desc: " |- Отечественные Мультфильмы (коллекции, сборники / *логии)"} + - {id: 658, cat: TV, desc: " |- Отечественные Мультсериалы"} + - {id: 890, cat: TV, desc: " |- Мультфильмы (3D)"} + - {id: 1336, cat: TV, desc: " |- Зарубежные Мультфильмы 20-го века (SD)"} + - {id: 1337, cat: TV, desc: " |- Зарубежные Мультфильмы 20-го века (HD, FHD, UHD)"} + - {id: 1338, cat: TV, desc: " |- Зарубежные Мультфильмы 21-го века (SD)"} + - {id: 1339, cat: TV, desc: " |- Зарубежные Мультфильмы 21-го века (HD, FHD, UHD)"} + - {id: 660, cat: TV, desc: " |- Зарубежные Мультфильмы (коллекции, сборники / *логии)"} + - {id: 232, cat: Other, desc: " |- Зарубежные Мультсериалы"} + - {id: 734, cat: Other, desc: " |- Классика для мам и малышей"} + - {id: 742, cat: Other, desc: " |- Музыка и песни для детей"} + - {id: 735, cat: Other, desc: " |- Аудиокниги для детей и родителей"} + - {id: 738, cat: Other, desc: " |- Образование, обучение и развитие детей"} + - {id: 967, cat: Other, desc: " |- Логопедия, Психология, Педиатрия"} + - {id: 907, cat: Other, desc: " |- Журналы для детей и родителей"} + - {id: 739, cat: Other, desc: " |- Детская литература"} + - {id: 1109, cat: Other, desc: " |- Энциклопедии и Познавательная литература для детей"} + - {id: 736, cat: Other, desc: " |- Мультимедийные материалы для родителей"} + - {id: 737, cat: Other, desc: " |- Мультимедийные материалы для детей"} + - {id: 898, cat: Other, desc: " |- Рабочие тетради, прописи и разукрашки"} + - {id: 935, cat: Other, desc: " |- Настольные игры и Поделки"} + - {id: 871, cat: Other, desc: " |- Подвижные Игры"} + - {id: 973, cat: Other, desc: " |- Изобразительное искусство"} + - {id: 960, cat: Other, desc: " |- Прочие материалы для детей и родителей"} + - {id: 1239, cat: Other, desc: " |- ГИА, ОГЭ, ЕГЭ, ЕМЭ, ГВЭ"} + - {id: 740, cat: Other, desc: " |- Развивающие Игры для детей"} + - {id: 741, cat: Other, desc: " |- Детские Игры"} + # programs + - {id: 503, cat: Other, desc: "ОС Windows"} + - {id: 504, cat: Other, desc: " |- Оригинальные версии Windows"} + - {id: 506, cat: Other, desc: " |- Оригинальные версии Windows Server"} + - {id: 763, cat: Other, desc: " |- Windows OEM Recovery СD/DVD"} + - {id: 1335, cat: Other, desc: " |- Сборки Windows 11"} + - {id: 1241, cat: Other, desc: " |- Сборки Windows 10"} + - {id: 1023, cat: Other, desc: " |- Сборки Windows 8"} + - {id: 717, cat: Other, desc: " |- Сборки Windows 7"} + - {id: 509, cat: Other, desc: " |- Сборки Windows Vista"} + - {id: 508, cat: Other, desc: " |- Сборки Windows ХР"} + - {id: 510, cat: Other, desc: " |- Сборки Windows - всё в одном"} + - {id: 1254, cat: Other, desc: " |- Сборки Windows для незрячих"} + - {id: 1042, cat: Other, desc: " |- Песочница ПО и сборок Windows"} + - {id: 511, cat: Other, desc: " |- Разное (RC, Beta и Service Packs)"} + - {id: 916, cat: Other, desc: " |- Музей Windows"} + - {id: 512, cat: Other, desc: "Утилиты, Офис, Интернет"} + - {id: 561, cat: Other, desc: " |- ПО для Интернета и сетей"} + - {id: 1284, cat: Other, desc: " |- Оригинальные версии Office"} + - {id: 562, cat: Other, desc: " |- Офисное ПО"} + - {id: 513, cat: Other, desc: " |- Запись, создание, редактирование, эмуляция дисков и..."} + - {id: 514, cat: Other, desc: " |- Диагностика и обслуживание hardware"} + - {id: 515, cat: Other, desc: " |- Резервирование и восстановление данных"} + - {id: 516, cat: Other, desc: " |- Файловые менеджеры и архиваторы"} + - {id: 517, cat: Other, desc: " |- Обслуживание ОС"} + - {id: 518, cat: Other, desc: " |- Разное (Утилиты, Офис, Интернет)"} + - {id: 519, cat: Other, desc: "Безопасность"} + - {id: 520, cat: Other, desc: " |- Firewalls"} + - {id: 521, cat: Other, desc: " |- Антивирусы"} + - {id: 522, cat: Other, desc: " |- Комплексные системы защиты"} + - {id: 523, cat: Other, desc: " |- Разное (остальные программы по безопасности)"} + - {id: 524, cat: Other, desc: "Мультимедиа и Графика"} + - {id: 532, cat: Other, desc: " |- Аудио Плееры и Кодеки"} + - {id: 533, cat: Other, desc: " |- Аудио Граббинг, Мастеринг, Обработка"} + - {id: 535, cat: Other, desc: " |- Прочее ПО для Аудио"} + - {id: 530, cat: Other, desc: " |- Видео Плееры и Кодеки"} + - {id: 529, cat: Other, desc: " |- Нелинейный Видеомонтаж, Авторинг, Кодировщики"} + - {id: 525, cat: Other, desc: " |- Просмотрщики Графики (вьюверы)"} + - {id: 526, cat: Other, desc: " |- Графические редакторы"} + - {id: 527, cat: Other, desc: " |- ПО для моделирования"} + - {id: 545, cat: Other, desc: "Софт и оболочки для специалистов, Прочее"} + - {id: 764, cat: Other, desc: " |- LiveCD/DVD/Flash"} + - {id: 765, cat: Other, desc: " |- WPI"} + - {id: 820, cat: Other, desc: " |- Серверное ПО"} + - {id: 552, cat: Other, desc: " |- Разработка ПО"} + - {id: 553, cat: Other, desc: " |- САПР/ГИС"} + - {id: 554, cat: Other, desc: " |- Остальное ПО для специалистов"} + - {id: 550, cat: Other, desc: " |- Системы навигации и карты"} + - {id: 549, cat: Other, desc: " |- Драйверы"} + - {id: 548, cat: Other, desc: " |- Разное (прочее ПО)"} + # Movies + - {id: 216, cat: Movies, desc: "Горячие новинки"} + - {id: 270, cat: Movies, desc: " |- Отечественные Новинки (SD, DVD)"} + - {id: 218, cat: Movies, desc: " |- Зарубежные Новинки (SD, DVD)"} + - {id: 219, cat: Movies, desc: " |- Отечественные Новинки (HD, FHD, UHD, 3D)"} + - {id: 954, cat: Movies, desc: " |- Зарубежные Новинки (HD, FHD, UHD, 3D)"} + - {id: 217, cat: Movies, desc: " |- Экранки"} + - {id: 1293, cat: Movies, desc: " |- Новинки с Рекламой"} + - {id: 1298, cat: Movies, desc: " |- Экранки с рекламой"} + - {id: 318, cat: Movies, desc: "Классика кино и Старые фильмы до 90-х"} + - {id: 320, cat: Movies, desc: " |- Отечественная Классика (SD)"} + - {id: 677, cat: Movies, desc: " |- Отечественная Классика (DVD)"} + - {id: 1177, cat: Movies, desc: " |- Отечественная Классика (HD, FHD, UHD)"} + - {id: 319, cat: Movies, desc: " |- Зарубежная Классика (SD)"} + - {id: 678, cat: Movies, desc: " |- Зарубежная Классика (DVD)"} + - {id: 885, cat: Movies, desc: " |- Зарубежная Классика (HD, FHD, UHD, 3D)"} + - {id: 908, cat: Movies, desc: " |- Старые Отечественные Фильмы (SD)"} + - {id: 1310, cat: Movies, desc: " |- Старые Отечественные Фильмы (DVD)"} + - {id: 909, cat: Movies, desc: " |- Старые Отечественные Фильмы (HD, FHD, UHD)"} + - {id: 910, cat: Movies, desc: " |- Старые Зарубежные Фильмы (SD)"} + - {id: 911, cat: Movies, desc: " |- Старые Зарубежные Фильмы (DVD)"} + - {id: 912, cat: Movies, desc: " |- Старые Зарубежные Фильмы (HD, FHD, UHD, 3D)"} + - {id: 220, cat: Movies, desc: "Отечественное кино"} + - {id: 221, cat: Movies, desc: " |- Отечественные Фильмы (SD)"} + - {id: 222, cat: Movies, desc: " |- Отечественные Фильмы (DVD)"} + - {id: 882, cat: Movies, desc: " |- Отечественные Фильмы (HD, FHD, UHD)"} + - {id: 889, cat: Movies, desc: " |- Отечественные Фильмы (3D)"} + - {id: 224, cat: Movies, desc: "Зарубежное кино"} + - {id: 225, cat: Movies, desc: " |- Зарубежные Фильмы (SD)"} + - {id: 226, cat: Movies, desc: " |- Зарубежные Фильмы (DVD)"} + - {id: 227, cat: Movies, desc: " |- Зарубежные Фильмы (HD, FHD)"} + - {id: 1296, cat: Movies, desc: " |- Зарубежные Фильмы (UHD)"} + - {id: 891, cat: Movies, desc: " |- Зарубежные Фильмы (3D)"} + - {id: 1299, cat: Movies, desc: " |- Фильмы ближнего зарубежья"} + - {id: 682, cat: Movies, desc: " |- Азиатское кино (SD)"} + - {id: 694, cat: Movies, desc: " |- Азиатское кино (DVD)"} + - {id: 884, cat: Movies, desc: " |- Азиатское кино (HD, FHD, UHD)"} + - {id: 1211, cat: Movies, desc: " |- Азиатское кино (3D)"} + - {id: 693, cat: Movies, desc: " |- Индийское кино"} + - {id: 913, cat: Movies, desc: " |- Фильмы с переводом на др. языках"} + - {id: 228, cat: Movies, desc: " |- Фильмы в оригинале (SD, DVD)"} + - {id: 1150, cat: Movies, desc: " |- Фильмы в оригинале (HD, FHD, UHD)"} + - {id: 1311, cat: Movies, desc: "Коллекции / *логии"} + - {id: 1313, cat: Movies, desc: " |- Зарубежное кино (коллекции / *логии)"} + - {id: 1312, cat: Movies, desc: " |- Отечественное кино (коллекции / *логии)"} + - {id: 256, cat: Movies, desc: "Театр и Музыкальное видео"} + - {id: 257, cat: Movies, desc: " |- Музыкальные клипы"} + - {id: 258, cat: Movies, desc: " |- Концерты (SD)"} + - {id: 883, cat: Movies, desc: " |- Концерты (DVD)"} + - {id: 955, cat: Movies, desc: " |- Концерты (HD, FHD, UHD, 3D)"} + - {id: 905, cat: Movies, desc: " |- Театр"} + - {id: 271, cat: Movies, desc: " |- Опера, Балет, Мюзиклы"} + - {id: 1210, cat: Movies, desc: " |- Караоке"} + - {id: 264, cat: Movies, desc: "Остальное"} + - {id: 265, cat: Movies, desc: " |- Звуковые дорожки и субтитры"} + - {id: 272, cat: Movies, desc: " |- Игровое видео"} + - {id: 1262, cat: Movies, desc: " |- hand made * video"} + - {id: 266, cat: Movies, desc: " |- Трейлеры"} + - {id: 1294, cat: Movies, desc: " |- Фильмы с Рекламой"} + # TV + - {id: 1219, cat: TV, desc: "Классика сериалов и многосерийное кино до 90-х"} + - {id: 1221, cat: TV, desc: " |- Отечественная классика сериалов и старое многосерийное..."} + - {id: 1220, cat: TV, desc: " |- Зарубежная классика сериалов и старое многосерийное кино..."} + - {id: 722, cat: TV, desc: " |- Чертова служба в госпитале МЭШ / M*A*S*H"} + - {id: 768, cat: TV, desc: "Зарубежные сериалы"} + - {id: 1344, cat: Other, desc: " |- Звездные войны / Star Wars (сериалы по франшизе)"} + - {id: 779, cat: TV, desc: " |- Анатомия страсти / Grey's Anatomy"} + - {id: 1288, cat: TV, desc: " |- Во все тяжкие / Breaking Bad; Лучше звоните Солу / Better..."} + - {id: 787, cat: TV, desc: " |- Грань / Fringe"} + - {id: 1141, cat: TV, desc: " |- Дневники вампира / Vampire Diaries; Настоящая кровь /..."} + - {id: 777, cat: TV, desc: " |- Доктор кто / Doctor Who; Торчвуд / Torchwood"} + - {id: 786, cat: TV, desc: " |- Доктор Хаус / House M.D."} + - {id: 776, cat: TV, desc: " |- Звездные врата / Stargate"} + - {id: 785, cat: TV, desc: " |- Звездный Крейсер Галактика / BattleStar Galactica;..."} + - {id: 775, cat: TV, desc: " |- Звездный путь / Star Trek; Орвилл / The Orville"} + - {id: 1265, cat: TV, desc: " |- Игра престолов / Game of Thrones"} + - {id: 1242, cat: TV, desc: " |- Касл / Castle"} + - {id: 1140, cat: TV, desc: " |- Кости / Bones"} + - {id: 782, cat: TV, desc: " |- Менталист / The Mentalist; Теория Лжи / Lie To Me"} + - {id: 773, cat: TV, desc: " |- Место преступления / CSI"} + - {id: 1142, cat: TV, desc: " |- Морская полиция / Navy NCIS; Военно-юридическая служба /..."} + - {id: 772, cat: TV, desc: " |- Побег / Prison Break"} + - {id: 771, cat: TV, desc: " |- Пуаро / Poirot"} + - {id: 783, cat: TV, desc: " |- Сверхъестественное / Supernatural"} + - {id: 1144, cat: TV, desc: " |- Секретные материалы / X-Files"} + - {id: 804, cat: TV, desc: " |- Теория Большого Взрыва / The Big Bang Theory; Детство..."} + - {id: 1290, cat: TV, desc: " |- Ходячие мертвецы / The Walking Dead; Бойтесь ходячих..."} + - {id: 1300, cat: TV, desc: " |- Сериалы ближнего зарубежья"} + - {id: 784, cat: TV, desc: " |- Сериалы DC Comics"} + - {id: 774, cat: TV, desc: " |- Сериалы Marvel Comics"} + - {id: 922, cat: TV, desc: " |- Азиатские сериалы"} + - {id: 770, cat: TV, desc: " |- Латиноамериканские сериалы"} + - {id: 1320, cat: TV, desc: " |- Турецкие сериалы"} + - {id: 780, cat: TV, desc: " |- Сериалы без русского перевода (украинская озвучка)"} + - {id: 781, cat: TV, desc: " |- Сериалы без перевода"} + - {id: 1322, cat: TV, desc: " |- Сериалы с рекламой"} + - {id: 769, cat: TV, desc: "Отечественные сериалы"} + - {id: 799, cat: TV, desc: " |- Бандитский Петербург"} + - {id: 800, cat: TV, desc: " |- Глухарь"} + - {id: 791, cat: TV, desc: " |- Интерны"} + - {id: 793, cat: TV, desc: " |- Ментовские войны"} + - {id: 794, cat: TV, desc: " |- Менты"} + - {id: 796, cat: TV, desc: " |- Солдаты"} + - {id: 795, cat: TV, desc: " |- Универ"} + # Documentary, Telecasts, Sports, Comedy + - {id: 713, cat: TV, desc: "Зарубежные TV-бренды"} + - {id: 706, cat: TV, desc: " |- Animal Planet"} + - {id: 577, cat: TV, desc: " |- BBC"} + - {id: 894, cat: TV, desc: " |- Da Vinci Learning"} + - {id: 578, cat: TV, desc: " |- Discovery"} + - {id: 580, cat: TV, desc: " |- History Channel"} + - {id: 579, cat: TV, desc: " |- National Geographic"} + - {id: 953, cat: TV, desc: " |- PBS"} + - {id: 581, cat: TV, desc: " |- Readers Digest"} + - {id: 806, cat: TV, desc: " |- Интересно обо всем"} + - {id: 714, cat: TV, desc: " |- Мега-Проекты"} + - {id: 761, cat: TV, desc: " |- Доисторический мир"} + - {id: 809, cat: TV, desc: " |- Мир будущего"} + - {id: 924, cat: TV, desc: " |- Одиссея Жака Кусто"} + - {id: 812, cat: TV, desc: " |- Тайны и Загадки"} + - {id: 576, cat: TV, desc: "Документалистика и Телепередачи"} + - {id: 590, cat: TV, desc: " |- Кинолетопись Страны Советской"} + - {id: 591, cat: TV, desc: " |- Вторая Мировая война"} + - {id: 588, cat: TV, desc: " |- Отечественная история"} + - {id: 589, cat: TV, desc: " |- История"} + - {id: 598, cat: TV, desc: " |- Личности в истории"} + - {id: 652, cat: TV, desc: " |- Посвящение искусству"} + - {id: 599, cat: TV, desc: " |- Телешоу"} + - {id: 959, cat: TV, desc: " |- Музыкальные шоу"} + - {id: 956, cat: TV, desc: " |- Интеллектуальные шоу"} + - {id: 597, cat: TV, desc: " |- Непознанное и сверхъестественное"} + - {id: 593, cat: TV, desc: " |- Живая природа"} + - {id: 594, cat: TV, desc: " |- Клуб кинопутешествий"} + - {id: 819, cat: TV, desc: " |- За рулем"} + - {id: 595, cat: TV, desc: " |- Релакс / Relax"} + - {id: 587, cat: TV, desc: " |- Военное дело"} + - {id: 584, cat: TV, desc: " |- Авиация"} + - {id: 586, cat: TV, desc: " |- Космос"} + - {id: 585, cat: TV, desc: " |- Флот"} + - {id: 600, cat: TV, desc: " |- Тележурналистика"} + - {id: 596, cat: TV, desc: " |- Политика и пропаганда, публицистика и экономика"} + - {id: 1295, cat: TV, desc: " |- Общественно-политические и пропагандистские ток-шоу"} + - {id: 614, cat: TV, desc: " |- Религии и культы (Док/TV)"} + - {id: 603, cat: TV, desc: "Спорт и активный отдых"} + - {id: 1206, cat: TV, desc: " |- Футбол. Чемпионат Мира 2022"} + - {id: 1309, cat: TV, desc: " |- Футбол. Чемпионат Европы 2020-2021"} + - {id: 1308, cat: TV, desc: " |- Хоккей. Чемпионат мира 2021"} + - {id: 1194, cat: TV, desc: " |- Летние Олимпийские игры и Паралимпийские игры"} + - {id: 1062, cat: TV, desc: " |- Зимние Олимпийские игры и Паралимпийские игры"} + - {id: 974, cat: TV, desc: " |- Футбол"} + - {id: 609, cat: TV, desc: " |- Баскетбол, Волейбол, Гандбол"} + - {id: 1263, cat: TV, desc: " |- Хоккей"} + - {id: 951, cat: TV, desc: " |- Прочие зимние виды спорта"} + - {id: 975, cat: TV, desc: " |- Бокс"} + - {id: 608, cat: TV, desc: " |- Единоборства, Бои без правил"} + - {id: 607, cat: TV, desc: " |- Гимнастика, Бодибилдинг, Красота тела"} + - {id: 606, cat: TV, desc: " |- Авто, Мото"} + - {id: 750, cat: TV, desc: " |- Формула 1"} + - {id: 605, cat: TV, desc: " |- Экстрим"} + - {id: 604, cat: TV, desc: " |- Рыбалка и Охота"} + - {id: 950, cat: TV, desc: " |- Бильярд"} + - {id: 610, cat: TV, desc: "Юмор (ТВ)"} + - {id: 613, cat: TV, desc: " |- КВН"} + - {id: 612, cat: TV, desc: " |- ПостКВН"} + - {id: 653, cat: TV, desc: " |- Украинские шоу"} + - {id: 654, cat: TV, desc: " |- Маски-шоу"} + - {id: 611, cat: TV, desc: " |- Сатирики"} + - {id: 656, cat: TV, desc: " |- Приколы"} + # anime + - {id: 615, cat: TV/Anime, desc: "Манга и Арт"} + - {id: 616, cat: TV/Anime, desc: " |- Манга, Манхва, Маньхуа"} + - {id: 617, cat: TV/Anime, desc: " |- Ранобэ"} + - {id: 648, cat: TV/Anime, desc: " |- Визуальные новеллы"} + - {id: 619, cat: TV/Anime, desc: " |- Аниме арт"} + - {id: 620, cat: TV/Anime, desc: "Аниме с субтитрами"} + - {id: 623, cat: TV/Anime, desc: " |- Онгоинги"} + - {id: 622, cat: TV/Anime, desc: " |- Аниме (SD)"} + - {id: 621, cat: TV/Anime, desc: " |- Аниме (HD)"} + - {id: 632, cat: TV/Anime, desc: " |- Аниме (FullHD)"} + - {id: 624, cat: TV/Anime, desc: "Аниме с озвучкой"} + - {id: 627, cat: TV/Anime, desc: " |- Онгоинги с озвучкой"} + - {id: 626, cat: TV/Anime, desc: " |- Аниме с озвучкой (SD)"} + - {id: 625, cat: TV/Anime, desc: " |- Аниме с озвучкой (HD)"} + - {id: 644, cat: TV/Anime, desc: " |- Аниме с озвучкой (FullHD)"} + - {id: 628, cat: TV/Anime, desc: "Аниме разное"} + - {id: 635, cat: TV/Anime, desc: " |- Аниме DVD"} + - {id: 634, cat: TV/Anime, desc: " |- Аниме Blu-ray, Remux"} + - {id: 638, cat: TV/Anime, desc: " |- Аниме хардсаб"} + - {id: 646, cat: TV/Anime, desc: " |- Аниме прочее"} + - {id: 645, cat: TV/Anime, desc: "Аниме музыка"} + - {id: 639, cat: TV/Anime, desc: " |- Аниме OST (Lossless)"} + - {id: 640, cat: TV/Anime, desc: " |- Аниме OST"} + # Books and Training Materials + - {id: 432, cat: Books, desc: "Научная и техническая литература"} + - {id: 755, cat: Books, desc: " |- Учебники"} + - {id: 481, cat: Books, desc: " |- Иностранные языки (литература)"} + - {id: 557, cat: Books, desc: " |- Гуманитарные науки и искусство"} + - {id: 442, cat: Books, desc: " |- Точные и естественные науки"} + - {id: 441, cat: Books, desc: " |- Техническая литература"} + - {id: 875, cat: Books, desc: " |- Военно-историческая литература"} + - {id: 444, cat: Books, desc: " |- Научно-популярная литература"} + - {id: 443, cat: Books, desc: " |- Здоровье и медицина"} + - {id: 440, cat: Books, desc: " |- Нормативная документация"} + - {id: 1199, cat: Books, desc: " |- Энциклопедии и словари"} + - {id: 433, cat: Books, desc: "Компьютерная литература"} + - {id: 447, cat: Books, desc: " |- Программирование"} + - {id: 445, cat: Books, desc: " |- Веб-дизайн"} + - {id: 817, cat: Books, desc: " |- 2D графика"} + - {id: 818, cat: Books, desc: " |- 3D графика"} + - {id: 434, cat: Books, desc: "Художественная литература"} + - {id: 957, cat: Books, desc: " |- Многоавторские сборники и Библиотеки"} + - {id: 931, cat: Books, desc: " |- Собрания книг русскоязычных авторов"} + - {id: 1152, cat: Books, desc: " |- Собрания книг иностранных авторов"} + - {id: 455, cat: Books, desc: " |- Сатира, Юмор"} + - {id: 1153, cat: Books, desc: " |- Боевики"} + - {id: 453, cat: Books, desc: " |- Детективы"} + - {id: 452, cat: Books, desc: " |- Исторические книги"} + - {id: 449, cat: Books, desc: " |- Классика, Проза, Поэзия"} + - {id: 1063, cat: Books, desc: " |- Приключенческая литература"} + - {id: 451, cat: Books, desc: " |- Фантастика, Фэнтези"} + - {id: 482, cat: Books, desc: "Комиксы и Артбуки"} + - {id: 483, cat: Books, desc: " |- Комиксы на русском языке"} + - {id: 484, cat: Books, desc: " |- Комиксы без перевода"} + - {id: 1343, cat: Books, desc: " |- Артбуки"} + - {id: 438, cat: Books, desc: "Художественные аудиокниги и публицистика"} + - {id: 485, cat: Books, desc: " |- Сатира, Юмор (аудиокниги)"} + - {id: 473, cat: Books, desc: " |- Детектив, Боевик (аудиокниги)"} + - {id: 472, cat: Books, desc: " |- Исторические аудиокниги"} + - {id: 471, cat: Books, desc: " |- Классика (аудиокниги)"} + - {id: 895, cat: Books, desc: " |- Проза, Поэзия (аудиокниги)"} + - {id: 470, cat: Books, desc: " |- Фантастика, Фэнтези (аудиокниги)"} + - {id: 896, cat: Books, desc: " |- Публицистика (аудиокниги)"} + - {id: 480, cat: Books, desc: " |- Другие аудиокниги"} + - {id: 436, cat: Books, desc: "Обучающие аудиоматериалы"} + - {id: 458, cat: Books, desc: " |- Бизнес и Менеджмент (аудиоматериалы)"} + - {id: 457, cat: Books, desc: " |- Иностранные языки (аудиоматериалы)"} + - {id: 1342, cat: Books, desc: " |- Здоровье и Медицина (аудиоматериалы)"} + - {id: 459, cat: Books, desc: " |- Популярная психология и саморазвитие (аудиоматериалы)"} + - {id: 460, cat: Books, desc: " |- Медитации (аудиоматериалы)"} + - {id: 461, cat: Books, desc: " |- Религия (аудиоматериалы)"} + - {id: 462, cat: Books, desc: " |- Прочие аудиоматериалы"} + - {id: 437, cat: Books, desc: "Обучающие видеоматериалы"} + - {id: 466, cat: Books, desc: " |- Бизнес и Менеджмент (видеокурсы)"} + - {id: 1319, cat: Books, desc: " |- Иностранные языки (видеокурсы)"} + - {id: 463, cat: Books, desc: " |- IT, Компьютерные видеокурсы"} + - {id: 958, cat: Books, desc: " |- Дизайн, рисование (видеокурсы)"} + - {id: 1223, cat: Books, desc: " |- Фотография и Видео (видеокурсы)"} + - {id: 467, cat: Books, desc: " |- Здоровье и Спорт (видеокурсы)"} + - {id: 464, cat: Books, desc: " |- Психология и саморазвитие (видеокурсы)"} + - {id: 465, cat: Books, desc: " |- Музыка (видеокурсы)"} + - {id: 469, cat: Books, desc: " |- Другие видеокурсы"} + - {id: 439, cat: Books, desc: "Мультимедийные материалы"} + - {id: 477, cat: Books, desc: " |- Образование"} + - {id: 476, cat: Books, desc: " |- Иностранные языки"} + - {id: 475, cat: Books, desc: " |- Компьютеры"} + - {id: 474, cat: Books, desc: " |- Мультимедийные справочники, Энциклопедии"} + - {id: 886, cat: Books, desc: " |- Приложения к журналам"} + - {id: 478, cat: Books, desc: " |- Другие мультимедийные материалы"} + - {id: 486, cat: Books, desc: "Журналы"} + - {id: 490, cat: Books, desc: " |- Мужские журналы"} + - {id: 657, cat: Books, desc: " |- Женские журналы"} + - {id: 489, cat: Books, desc: " |- Игровые журналы"} + - {id: 488, cat: Books, desc: " |- Компьютерные журналы"} + - {id: 487, cat: Books, desc: " |- Научно-популярные журналы"} + - {id: 1198, cat: Books, desc: " |- Журналы по электротехнике и радиоэлектронике"} + - {id: 1227, cat: Books, desc: " |- Кулинарные журналы"} + - {id: 893, cat: Books, desc: " |- Домоводство (журналы)"} + - {id: 491, cat: Books, desc: " |- Хобби (журналы)"} + - {id: 767, cat: Books, desc: " |- Другие журналы"} + - {id: 299, cat: Books, desc: "Автомобили"} + - {id: 887, cat: Books, desc: " |- Автомобильные журналы"} + - {id: 301, cat: Books, desc: " |- Автомобильная литература"} + - {id: 1334, cat: Books, desc: " |- Автомобильные обуч.видео"} + - {id: 300, cat: Books, desc: " |- Автомобильные мультимедийные материалы"} + - {id: 1341, cat: Books, desc: " |- Автомобильные программы и навигаторы"} + - {id: 492, cat: Books, desc: "Разное (категория книг)"} + - {id: 558, cat: Books, desc: " |- Бизнес, Менеджмент, Деловая литература"} + - {id: 1173, cat: Books, desc: " |- Публицистика"} + - {id: 1176, cat: Books, desc: " |- Историография"} + - {id: 1174, cat: Books, desc: " |- Популярная психология и саморазвитие"} + - {id: 1171, cat: Books, desc: " |- Эзотерика"} + - {id: 662, cat: Books, desc: " |- Религиозная литература"} + - {id: 1175, cat: Books, desc: " |- Нетрадиционная медицина"} + - {id: 1172, cat: Books, desc: " |- Строительство и ремонт"} + - {id: 933, cat: Books, desc: " |- Сад, огород, животноводство"} + - {id: 815, cat: Books, desc: " |- Кулинария"} + - {id: 1170, cat: Books, desc: " |- Спорт, Фитнес, Боевые искусства"} + - {id: 398, cat: Books, desc: " |- Ноты и обучение музыке"} + - {id: 816, cat: Books, desc: " |- На досуге"} + # Music + - {id: 313, cat: Audio, desc: "HD Audio и Многоканальная Музыка"} + - {id: 1291, cat: Audio, desc: " |- Blu-ray Audio"} + - {id: 680, cat: Audio, desc: " |- DVD-Audio"} + - {id: 1149, cat: Audio, desc: " |- SACD-R"} + - {id: 429, cat: Audio, desc: " |- DTS-Audio"} + - {id: 1234, cat: Audio, desc: " |- WEB-DL-Audio"} + - {id: 681, cat: Audio, desc: " |- Vinyl-Rip и Hand-Made"} + - {id: 330, cat: Audio, desc: "Классика"} + - {id: 1256, cat: Audio, desc: " |- Классика (HD Audio)"} + - {id: 1285, cat: Audio, desc: " |- Полные собрания сочинений (Lossless)"} + - {id: 370, cat: Audio, desc: " |- Полные собрания сочинений"} + - {id: 1260, cat: Audio, desc: " |- Вокал (Lossless)"} + - {id: 371, cat: Audio, desc: " |- Вокал"} + - {id: 1261, cat: Audio, desc: " |- Концерты (Lossless)"} + - {id: 375, cat: Audio, desc: " |- Концерты"} + - {id: 1259, cat: Audio, desc: " |- Оркестровая (Lossless)"} + - {id: 374, cat: Audio, desc: " |- Оркестровая"} + - {id: 1257, cat: Audio, desc: " |- Камерная (Lossless)"} + - {id: 373, cat: Audio, desc: " |- Камерная"} + - {id: 1258, cat: Audio, desc: " |- Фортепиано (Lossless)"} + - {id: 372, cat: Audio, desc: " |- Фортепиано"} + - {id: 1160, cat: Audio, desc: " |- В обработке/Classical Crossover/Neoclassical (Lossless)"} + - {id: 876, cat: Audio, desc: " |- В обработке/Classical Crossover/Neoclassical"} + - {id: 1255, cat: Audio, desc: " |- Классика (сборники) (Lossless)"} + - {id: 376, cat: Audio, desc: " |- Классика (сборники)"} + - {id: 326, cat: Audio, desc: "Jazz, Blues, Soul"} + - {id: 359, cat: Audio, desc: " |- Jazz (Lossless)"} + - {id: 358, cat: Audio, desc: " |- Jazz"} + - {id: 1188, cat: Audio, desc: " |- Blues, Soul (Lossless)"} + - {id: 1189, cat: Audio, desc: " |- Blues, Soul"} + - {id: 328, cat: Audio, desc: "Шансон, Авторская и Военная песня"} + - {id: 1180, cat: Audio, desc: " |- Зарубежный Шансон (Lossless)"} + - {id: 1181, cat: Audio, desc: " |- Зарубежный Шансон"} + - {id: 364, cat: Audio, desc: " |- Русский Шансон (Lossless)"} + - {id: 363, cat: Audio, desc: " |- Русский Шансон"} + - {id: 1179, cat: Audio, desc: " |- Авторская и Военная песня (Lossless)"} + - {id: 879, cat: Audio, desc: " |- Авторская и Военная песня"} + - {id: 322, cat: Audio, desc: "Rock, Alternative, Punk, Metal"} + - {id: 962, cat: Audio, desc: " |- Rock (Lossless)"} + - {id: 333, cat: Audio, desc: " |- Rock"} + - {id: 965, cat: Audio, desc: " |- Alternative, Punk (Lossless)"} + - {id: 336, cat: Audio, desc: " |- Alternative, Punk"} + - {id: 337, cat: Audio, desc: " |- Hard Rock (Lossless)"} + - {id: 338, cat: Audio, desc: " |- Hard Rock"} + - {id: 963, cat: Audio, desc: " |- Metal (Lossless)"} + - {id: 334, cat: Audio, desc: " |- Metal"} + - {id: 961, cat: Audio, desc: " |- Русский Рок (Lossless)"} + - {id: 332, cat: Audio, desc: " |- Русский рок"} + - {id: 325, cat: Audio, desc: "Pop"} + - {id: 1165, cat: Audio, desc: " |- Eurodance, Euro-House, Technopop (Lossless)"} + - {id: 1166, cat: Audio, desc: " |- Eurodance, Euro-House, Technopop"} + - {id: 1168, cat: Audio, desc: " |- Disco, Italo-Disco, Euro-Disco, Hi-NRG"} + - {id: 1167, cat: Audio, desc: " |- Disco, Italo-Disco, Euro-Disco, Hi-NRG (Lossless)"} + - {id: 1162, cat: Audio, desc: " |- Отечественная поп-музыка (Lossless)"} + - {id: 352, cat: Audio, desc: " |- Отечественная поп-музыка"} + - {id: 1164, cat: Audio, desc: " |- Советская эстрада, Ретро (Lossless)"} + - {id: 1163, cat: Audio, desc: " |- Советская эстрада, Ретро"} + - {id: 1161, cat: Audio, desc: " |- Зарубежная поп-музыка (Lossless)"} + - {id: 353, cat: Audio, desc: " |- Зарубежная поп-музыка"} + - {id: 324, cat: Audio, desc: "Electronic"} + - {id: 1327, cat: Audio, desc: " |- Psybient, Psychill, Psydub (Lossless)"} + - {id: 1328, cat: Audio, desc: " |- Psybient, Psychill, Psydub"} + - {id: 1325, cat: Audio, desc: " |- Downtempo, Trip-Hop, Lounge (Lossless)"} + - {id: 1326, cat: Audio, desc: " |- Downtempo, Trip-Hop, Lounge"} + - {id: 1323, cat: Audio, desc: " |- Ambient, Experimental, Modern Classical (Lossless)"} + - {id: 1324, cat: Audio, desc: " |- Ambient, Experimental, Modern Classical"} + - {id: 976, cat: Audio, desc: " |- Trance (Lossless)"} + - {id: 346, cat: Audio, desc: " |- Trance"} + - {id: 1243, cat: Audio, desc: " |- Label-Packs"} + - {id: 977, cat: Audio, desc: " |- House, Techno, Electro, Minimal (Lossless)"} + - {id: 345, cat: Audio, desc: " |- House"} + - {id: 349, cat: Audio, desc: " |- Techno, Electro, Minimal"} + - {id: 347, cat: Audio, desc: " |- Easy listening"} + - {id: 979, cat: Audio, desc: " |- Industrial, EBM, Dark Electro (Lossless)"} + - {id: 673, cat: Audio, desc: " |- Experimental Electronic"} + - {id: 671, cat: Audio, desc: " |- Industrial, EBM, Dark Electro"} + - {id: 1224, cat: Audio, desc: " |- IDM (Lossless)"} + - {id: 1225, cat: Audio, desc: " |- IDM"} + - {id: 980, cat: Audio, desc: " |- Synthpop, New Wave (Lossless)"} + - {id: 672, cat: Audio, desc: " |- Synthpop, New Wave"} + - {id: 1316, cat: Audio, desc: " |- Dubstep, Future Garage, Bass Music, UK Garage (Lossless)"} + - {id: 1317, cat: Audio, desc: " |- Dubstep, Future Garage, Bass Music, UK Garage"} + - {id: 981, cat: Audio, desc: " |- Drum'n'Bass, Jungle, Breaks, Breakbeat (Lossless)"} + - {id: 344, cat: Audio, desc: " |- Drum'n'Bass, Jungle, Breaks, Breakbeat"} + - {id: 983, cat: Audio, desc: " |- Hardstyle, Jumpstyle, Hardcore (Lossless)"} + - {id: 984, cat: Audio, desc: " |- Hardstyle, Jumpstyle, Hardcore"} + - {id: 982, cat: Audio, desc: " |- Psychedelic, psytrance, fullon (Lossless)"} + - {id: 348, cat: Audio, desc: " |- Psychedelic, psytrance, fullon"} + - {id: 674, cat: Audio, desc: " |- Radioshow, Live Mixes"} + - {id: 323, cat: Audio, desc: "Rap, Hip-hop, RnB, Reggae"} + - {id: 1187, cat: Audio, desc: " |- Rap, Hip-hop зарубежный (Lossless)"} + - {id: 339, cat: Audio, desc: " |- Rap, Hip-hop зарубежный"} + - {id: 1186, cat: Audio, desc: " |- Rap, Hip-hop отечественный (Lossless)"} + - {id: 340, cat: Audio, desc: " |- Rap, Hip-hop отечественный"} + - {id: 1185, cat: Audio, desc: " |- RnB, Reggae (Lossless)"} + - {id: 341, cat: Audio, desc: " |- RnB, Reggae"} + - {id: 329, cat: Audio, desc: "East Asian Music"} + - {id: 369, cat: Audio, desc: " |- Asian Traditional, Ethnic (Lossless)"} + - {id: 368, cat: Audio, desc: " |- Asian Traditional, Ethnic"} + - {id: 1218, cat: Audio, desc: " |- Asian Pop (Lossless)"} + - {id: 365, cat: Audio, desc: " |- Asian Pop"} + - {id: 1217, cat: Audio, desc: " |- Asian Rock, Metal (Lossless)"} + - {id: 366, cat: Audio, desc: " |- Asian Rock, Metal"} + - {id: 1215, cat: Audio, desc: " |- Doujin Music (Lossless)"} + - {id: 1216, cat: Audio, desc: " |- Doujin Music"} + - {id: 1213, cat: Audio, desc: " |- Other Asian (Lossless)"} + - {id: 367, cat: Audio, desc: " |- Other Asian"} + - {id: 331, cat: Audio, desc: "Other Styles"} + - {id: 1157, cat: Audio, desc: " |- Instrumental (Lossless)"} + - {id: 711, cat: Audio, desc: " |- Instrumental"} + - {id: 1159, cat: Audio, desc: " |- New Age/Meditative/Relax (Lossless)"} + - {id: 378, cat: Audio, desc: " |- New Age/Meditative/Relax"} + - {id: 1158, cat: Audio, desc: " |- Folk (Lossless)"} + - {id: 379, cat: Audio, desc: " |- Folk"} + - {id: 380, cat: Audio, desc: " |- Other (Lossless)"} + - {id: 1178, cat: Audio, desc: " |- Other"} + - {id: 361, cat: Audio, desc: " |- OST (Lossless)"} + - {id: 360, cat: Audio, desc: " |- OST"} + - {id: 327, cat: Audio, desc: "Неофициальные сборники"} + - {id: 1184, cat: Audio, desc: " |- Jazz, Blues, Soul (сборники)"} + - {id: 824, cat: Audio, desc: " |- Шансон, Авторская и Военная песня (сборники)"} + - {id: 1182, cat: Audio, desc: " |- Rock, Alternative, Punk, Metal (сборники)"} + - {id: 354, cat: Audio, desc: " |- Pop (сборники)"} + - {id: 877, cat: Audio, desc: " |- Electronic (сборники)"} + - {id: 1183, cat: Audio, desc: " |- Rap, Hip-hop, RnB, Reggae (сборники)"} + - {id: 1190, cat: Audio, desc: " |- Instrumental/New Age/Meditative/Relax (сборники)"} + - {id: 917, cat: Audio, desc: " |- Прочее (сборники)"} + # Other + - {id: 410, cat: Other, desc: "Win Игры"} + - {id: 411, cat: Other, desc: " |- Горячие новинки Игр"} + - {id: 412, cat: Other, desc: " |- Action (FPS)"} + - {id: 1008, cat: Other, desc: " |- Action (TPS)"} + - {id: 415, cat: Other, desc: " |- Adventure/Quest"} + - {id: 746, cat: Other, desc: " |- Arcade"} + - {id: 428, cat: Other, desc: " |- Online (MMO)"} + - {id: 1009, cat: Other, desc: " |- Online Action (MMO)"} + - {id: 413, cat: Other, desc: " |- RPG"} + - {id: 414, cat: Other, desc: " |- Strategy (RTS/TBS/Grand)"} + - {id: 1010, cat: Other, desc: " |- Strategy Tactical (RTS/TBS)"} + - {id: 1012, cat: Other, desc: " |- Strategy (Manage/Busin)"} + - {id: 1014, cat: Other, desc: " |- Racing"} + - {id: 416, cat: Other, desc: " |- Simulation (Flight/Space)"} + - {id: 1013, cat: Other, desc: " |- Simulation (Sport)"} + - {id: 1015, cat: Other, desc: " |- Simulation (Other)"} + - {id: 268, cat: Other, desc: " |- Action/Arcade/Platformer (Casual)"} + - {id: 1016, cat: Other, desc: " |- Adventure/Quest (Casual)"} + - {id: 1041, cat: Other, desc: " |- Classic Arcade/Zuma/3match (Casual)"} + - {id: 1018, cat: Other, desc: " |- Board/Puzzle/Logic (Casual)"} + - {id: 1017, cat: Other, desc: " |- Strategy/Manager/Business (Casual)"} + - {id: 972, cat: Other, desc: " |- AddOn/DLC/Mod для Игр"} + - {id: 971, cat: Other, desc: " |- Demo/Beta версии Игр"} + - {id: 970, cat: Other, desc: " |- Языковые пакеты для Игр"} + - {id: 969, cat: Other, desc: " |- Patch/Tweak/Trainer/Other для Игр"} + - {id: 968, cat: Other, desc: " |- NoCD/NoDVD/Crack для Игр"} + - {id: 1146, cat: Other, desc: " |- Песочница Win Игр"} + - {id: 418, cat: Other, desc: "Win Старые Игры"} + - {id: 1061, cat: Other, desc: " |- Action (FPS)"} + - {id: 1060, cat: Other, desc: " |- Action (TPS)"} + - {id: 1059, cat: Other, desc: " |- Adventure/Quest"} + - {id: 1058, cat: Other, desc: " |- Arcade"} + - {id: 1057, cat: Other, desc: " |- RPG"} + - {id: 1056, cat: Other, desc: " |- Strategy (RTS/TBS/Grand)"} + - {id: 1054, cat: Other, desc: " |- Strategy Tactical (RTS/TBS/Wargame)"} + - {id: 1053, cat: Other, desc: " |- Strategy (Manage/Busin)"} + - {id: 1052, cat: Other, desc: " |- Racing"} + - {id: 1051, cat: Other, desc: " |- Simulation (Flight/Space)"} + - {id: 1050, cat: Other, desc: " |- Simulation (Sport)"} + - {id: 1049, cat: Other, desc: " |- Simulation (Other)"} + - {id: 1048, cat: Other, desc: " |- AddOn/DLC/Mod для Игр"} + - {id: 1047, cat: Other, desc: " |- Demo/Beta версии Игр"} + - {id: 1046, cat: Other, desc: " |- Языковые пакеты для Игр"} + - {id: 1045, cat: Other, desc: " |- Patch/Tweak/Trainer/Other для Игр"} + - {id: 1044, cat: Other, desc: " |- NoCD/NoDVD/Crack для Игр"} + - {id: 382, cat: Other, desc: "Консольные Игры"} + - {id: 390, cat: Other, desc: " |- Тех. раздел Консолей"} + - {id: 387, cat: Other, desc: " |- Xbox 360"} + - {id: 388, cat: Other, desc: " |- Wii, GameCube"} + - {id: 1264, cat: Other, desc: " |- Wii U"} + - {id: 1318, cat: Other, desc: " |- Switch"} + - {id: 385, cat: Other, desc: " |- PS1"} + - {id: 386, cat: Other, desc: " |- PS2"} + - {id: 848, cat: Other, desc: " |- PS3"} + - {id: 1321, cat: Other, desc: " |- PS4"} + - {id: 383, cat: Other, desc: " |- PSP"} + - {id: 384, cat: Other, desc: " |- Psx to PSP"} + - {id: 1292, cat: Other, desc: " |- PS Vita"} + - {id: 389, cat: Other, desc: " |- Ромы"} + - {id: 391, cat: Other, desc: " |- Другие приставки"} + # pda and mobile + - {id: 1240, cat: Other, desc: " |- Всё для детей и родителей для Android"} + - {id: 830, cat: Other, desc: " |- ПО для Android"} + - {id: 833, cat: Other, desc: " |- Игры для Android"} + - {id: 839, cat: Other, desc: " |- Навигация для Android"} + - {id: 1233, cat: Other, desc: " |- Прошивки для Android устройств"} + - {id: 1236, cat: Other, desc: " |- Вспомогательное ПО для Android"} + - {id: 832, cat: Other, desc: " |- ПО и Игры на Java"} + - {id: 829, cat: Other, desc: " |- ПО и Игры для Symbian"} + - {id: 828, cat: Other, desc: " |- ПО и Игры для Windows Mobile"} + - {id: 1231, cat: Other, desc: " |- Навигация для др. мобильных устройств"} + - {id: 840, cat: Other, desc: " |- Прошивки для др. мобильных устройств"} + - {id: 1232, cat: Other, desc: " |- Вспомогательное ПО для др. мобильных устройств"} + - {id: 841, cat: Other, desc: " |- Прочее для мобильных устройств"} + - {id: 1238, cat: Other, desc: " |- Карты для навигационного ПО"} + - {id: 844, cat: Other, desc: " |- Мобильное Аудио"} + - {id: 842, cat: Other, desc: " |- Мобильное Видео"} + - {id: 843, cat: Other, desc: " |- Темы и Изображения"} + # apple + - {id: 537, cat: Other, desc: " |- macOS (Apple)"} + - {id: 538, cat: Other, desc: " |- macOS (osx86project/hackintosh)"} + - {id: 1151, cat: Other, desc: " |- Разное для macOS (Apple/hackintosh)"} + - {id: 1083, cat: Other, desc: " |- Графика для macOS"} + - {id: 1029, cat: Other, desc: " |- CAD, 3D, ПО для специалистов для macOS"} + - {id: 1082, cat: Other, desc: " |- Офис, Интернет для macOS"} + - {id: 1028, cat: Other, desc: " |- Аудио и видео редакторы для macOS"} + - {id: 1087, cat: Other, desc: " |- Плееры, конвертеры, кодеки для macOS"} + - {id: 1030, cat: Other, desc: " |- Утилиты для macOS"} + - {id: 1039, cat: Other, desc: " |- Kinder Games для macOS"} + - {id: 1038, cat: Other, desc: " |- Quests, Adventure, Arcade для macOS"} + - {id: 1037, cat: Other, desc: " |- Action, FPS для macOS"} + - {id: 1036, cat: Other, desc: " |- Strategy, RPG для macOS"} + - {id: 1035, cat: Other, desc: " |- Racing, Simulation, Sports для macOS"} + - {id: 1034, cat: Other, desc: " |- Casual Games, Other для macOS"} + - {id: 822, cat: Other, desc: " |- Тестовые macOS Игры"} + - {id: 1093, cat: Other, desc: " |- Прошивки iOS и AppleTV"} + - {id: 1092, cat: Other, desc: " |- UnLock, Jailbreak, Cydia"} + - {id: 1091, cat: Other, desc: " |- ПО для iOS"} + - {id: 834, cat: Other, desc: " |- Игры для iOS"} + - {id: 831, cat: Other, desc: " |- ПО из App Store"} + - {id: 1155, cat: Other, desc: " |- Отечественное видео для устройств Apple"} + - {id: 1156, cat: Other, desc: " |- Отечественное видео HD для устройств Apple"} + - {id: 1099, cat: Other, desc: " |- Зарубежное видео для устройств Apple"} + - {id: 1098, cat: Other, desc: " |- Зарубежное видео HD для устройств Apple"} + - {id: 1096, cat: Other, desc: " |- Музыка (AAC)"} + - {id: 1097, cat: Other, desc: " |- Музыка Lossless (ALAC)"} + - {id: 1095, cat: Other, desc: " |- Аудиокниги (AAC)"} + # linux + - {id: 536, cat: Other, desc: "Linux, Unix и другие ОС"} + - {id: 563, cat: Other, desc: " |- ОС Linux"} + - {id: 1032, cat: Other, desc: " |- ОС *Nix (Alpha, Beta, RC)"} + - {id: 1031, cat: Other, desc: " |- Сборки ОС Linux"} + - {id: 1025, cat: Other, desc: " |- ОС *BSD"} + - {id: 1026, cat: Other, desc: " |- Другие ОС"} + - {id: 564, cat: Other, desc: " |- *Nix. Программы"} + - {id: 1137, cat: Other, desc: " |- Специализированные ОС"} + - {id: 417, cat: Other, desc: "*Nix Игры"} + - {id: 1193, cat: Other, desc: " |- Native *Nix Games"} + - {id: 1192, cat: Other, desc: " |- Ported *Nix Games"} + # multimedia, designs, graphics + - {id: 1102, cat: Other, desc: "Материалы для мультимедиа и дизайна"} + - {id: 1070, cat: Other, desc: " |- Digital Juice"} + - {id: 534, cat: Other, desc: " |- Звуковые библиотеки"} + - {id: 1077, cat: Other, desc: " |- Дополнения"} + - {id: 267, cat: Other, desc: " |- Футажи"} + - {id: 1071, cat: Other, desc: " |- 3D модели и материалы"} + - {id: 1134, cat: Other, desc: " |- Web-дизайн и шаблоны сайтов"} + - {id: 1107, cat: Other, desc: " |- Текстуры и Фоны"} + - {id: 1075, cat: Other, desc: " |- Шрифты"} + - {id: 1105, cat: Other, desc: " |- Шаблоны и Рамки"} + - {id: 676, cat: Other, desc: " |- Костюмы"} + - {id: 1072, cat: Other, desc: " |- Растровый клипарт (фото)"} + - {id: 166, cat: Other, desc: " |- Растровый клипарт (элементы)"} + - {id: 1078, cat: Other, desc: " |- Растровый клипарт (иллюстрации)"} + - {id: 1074, cat: Other, desc: " |- Векторный клипарт"} + - {id: 1076, cat: Other, desc: " |- Сборники"} + - {id: 1266, cat: Other, desc: "Проекты"} + - {id: 1267, cat: Other, desc: " |- Детские (проекты)"} + - {id: 1268, cat: Other, desc: " |- Свадебные и романтические (проекты)"} + - {id: 1269, cat: Other, desc: " |- Праздничные (проекты)"} + - {id: 1270, cat: Other, desc: " |- Презентации (проекты)"} + - {id: 1277, cat: Other, desc: " |- Трейлеры (проекты)"} + - {id: 1271, cat: Other, desc: " |- Спортивные (проекты)"} + - {id: 1272, cat: Other, desc: " |- Логотипы (проекты)"} + - {id: 1273, cat: Other, desc: " |- Слайдшоу (проекты)"} + - {id: 1274, cat: Other, desc: " |- Титры (проекты)"} + - {id: 1275, cat: Other, desc: " |- Элементы (проекты)"} + - {id: 1276, cat: Other, desc: " |- Разное (проекты)"} + - {id: 1103, cat: Other, desc: "Графика, Арт, Разное"} + - {id: 1114, cat: Other, desc: " |- Классическое искусство"} + - {id: 1113, cat: Other, desc: " |- Современное изобразительное искусство"} + - {id: 1115, cat: Other, desc: " |- Книжная иллюстрация"} + - {id: 1129, cat: Other, desc: " |- Современная фотография"} + - {id: 1111, cat: Other, desc: " |- Иконки и аватарки"} + - {id: 1116, cat: Other, desc: " |- Картинки"} + - {id: 808, cat: Other, desc: " |- Обои для рабочего стола"} + - {id: 1139, cat: Other, desc: " |- Обои для рабочего стола (16+)"} + - {id: 988, cat: Other, desc: " |- Графика (16+)"} + - {id: 1073, cat: Other, desc: " |- Интернет-творчество"} + # temp, archive + - {id: 892, cat: Other, desc: " |- Архив Мультфильмов"} + - {id: 91, cat: Other, desc: " |- Архив Видео. Кино, Театра"} + - {id: 150, cat: Other, desc: " |- Архив неактуальных Экранок и любого видео с Рекламой"} + - {id: 668, cat: Other, desc: " |- Архив Классики кино и Старых фильмов до 90-х"} + - {id: 1143, cat: Other, desc: " |- Архив Музыкального Видео"} + - {id: 802, cat: Other, desc: " |- Архив Сериалов и Архив Старого многосерийного кино до 90-х"} + - {id: 669, cat: Other, desc: " |- Архив Документалистики и TV"} + - {id: 400, cat: Other, desc: " |- Архив Юмора"} + - {id: 169, cat: Other, desc: " |- Архив Аниме"} + - {id: 94, cat: Other, desc: " |- Архив Книг и обучающих материалов"} + - {id: 303, cat: Other, desc: " |- Архив Авто"} + - {id: 92, cat: Other, desc: " |- Архив Музыки"} + - {id: 93, cat: Other, desc: " |- Архив Игр"} + - {id: 1333, cat: Other, desc: " |- Архив *Nix"} + - {id: 95, cat: Other, desc: " |- Архив Программ"} + - {id: 184, cat: Other, desc: " |- Архив КПК и Мобильных устройств"} + - {id: 1080, cat: Other, desc: " |- Архив 4Apple"} + - {id: 180, cat: Other, desc: " |- Архив Медиа-Диз-Графика"} + - {id: 145, cat: Other, desc: " |- Видео (temp)"} + - {id: 146, cat: Other, desc: " |- Аниме (temp)"} + - {id: 161, cat: Other, desc: " |- Книги (temp)"} + - {id: 147, cat: Other, desc: " |- Музыка (temp)"} + - {id: 148, cat: Other, desc: " |- Игры (temp)"} + - {id: 149, cat: Other, desc: " |- Программы (temp)"} + - {id: 183, cat: Other, desc: " |- КПК и Мобильные устройства (temp)"} + - {id: 1145, cat: Other, desc: " |- 4Apple (temp)"} + - {id: 171, cat: Other, desc: " |- Медиа-Диз-Графика (temp)"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + allowrawsearch: true + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: stripcyrillic + type: checkbox + label: Strip Cyrillic Letters + default: false + - name: addrussiantotitle + type: checkbox + label: Add RUS to end of all titles to improve language detection by Sonarr and Radarr. Will cause English-only results to be misidentified. + default: false + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 1 + options: + 1: created + 10: seeders + 7: size + 2: title + - name: type + type: select + label: Order requested from site + default: 2 + options: + 2: desc + 1: asc + - name: info_row + type: info + label: Search settings + default: This Indexer requires specific columns to be active on your account search settings.
Login to the web site and ensure that only the Автор (Author) and Форум (Forum) checkboxes are ticked in the Показывать колонку (Show Columns) section of the Настройки поиска Torrent (Torrent Search Settings) page.
Having other columns active may prevent the Indexer processing/displaying results correctly. + +login: + path: forum/login.php + method: form + form: form#loginFrm + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + autologin: 1 + redirect: index.php + error: + - selector: span.gen:contains("Вы ввели") + test: + path: forum/index.php + selector: table.menutable a.mainmenu:contains("Выход") + +search: + paths: + - path: forum/tracker.php + method: post + inputs: + $raw: "{{ if .Categories }}{{ range .Categories }}f[]={{.}}&{{end}}{{ else }}f[]=-1{{ end }}" + o: "{{ .Config.sort }}" + s: "{{ .Config.type }}" + tm: -1 + shf: 1 + sha: 1 + ta: -1 + sns: -1 + sds: "{{ if .Config.freeleech }}1{{ else }}-1{{ end }}" + nm: "{{ .Keywords }}" + submit: "Поиск" + + keywordsfilters: + - name: re_replace # S01 to сезон 1 + args: ["(?i)\\bS0*(\\d+)\\b", "сезон $1"] + - name: re_replace # E02 to сери 1 + args: ["(?i)\\bE0*(\\d+)\\b", "сери $1"] + - name: re_replace # S01E02 to сезон 1 сери 2 + args: ["(?i)\\bS0*(\\d+)E0*(\\d+)\\b", "сезон $1 сери $2"] + + rows: + selector: table.forumline.tablesorter > tbody > tr:has(a[href^="viewtopic.php?t="]):has(a[href^="download.php?id="]) + + fields: + category_id: + selector: a[href^="tracker.php?f="] + attribute: href + filters: + - name: querystring + args: f + category: + text: "{{ .Result.category_id }}" + title: + selector: a[href^="viewtopic.php?t="] > b + filters: + # normalize to SXXEYY format + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)\\s*(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)", "S$1E$2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?)", "S$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+[CС]езоны?", "S$1"] + - name: re_replace + args: ["(?i)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)", "E$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "E$1"] + - name: re_replace + args: ["(?i)\\bКураж-Бамбей\\b", "kurazh"] + - name: re_replace + args: ["(?i)\\bКубик в Кубе\\b", "Kubik"] + - name: re_replace + args: ["(?i)\\bКравец\\b", "Kravec"] + - name: re_replace + args: ["(?i)\\bПифагор\\b", "Pifagor"] + - name: re_replace + args: ["(?i)\\bНевафильм\\b", "Nevafilm"] + - name: re_replace + args: ["(?i)\\bЛицензия\\b", "Lic"] + - name: re_replace + args: ["(?i)\\bселезень\\b", "selezen"] + - name: re_replace + args: ["(?i)\\sот\\s([\\w\\p{P}\\p{S}]+)$", "-$1"] + - name: re_replace + args: ["\\s\\|\\s(\\w{4,})$", "-$1"] + - name: re_replace + args: ["(\\([\\p{IsCyrillic}\\W]+\\))|(^[\\p{IsCyrillic}\\W\\d]+\\/ )|([\\p{IsCyrillic} \\-]+,+)|([\\p{IsCyrillic}]+)", "{{ if .Config.stripcyrillic }}{{ else }}$1$2$3$4{{ end }}"] + - name: re_replace + args: ["(?i)\\bHDTV[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bSAT[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bWEB[-\\s]?DL[-\\s]?Rip\\b", "WEB-DL"] + - name: re_replace + args: ["(?i)\\bWEB\\sRip\\b", "WEBRip"] + - name: re_replace + args: ["(?i)\\bWEB\\sDL\\b", "WEB-DL"] + - name: re_replace + args: ["[\\[\\(\\{<«][\\s\\W]*[\\]\\)\\}>»]", ""] + - name: re_replace + args: ["^[\\s&,\\.!\\?\\+\\-_\\|\\/':]+", ""] + - name: append + args: "{{ if and (ne .Result.category_id \"913\") (.Config.addrussiantotitle) }} RUS{{ else }}{{ end }}" + details: + selector: a[href^="viewtopic.php?t="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + size: + selector: td:nth-child(6) > u + grabs: + selector: td:nth-child(9) + date: + # unix + selector: td:last-child > u + seeders: + selector: td.seedmed > b + leechers: + selector: td.leechmed > b + downloadvolumefactor: + case: + img[src$="/gold.gif"]: 0 + img[src$="/silver.gif"]: 0.5 + img[src$="/bronze.gif"]: 0.75 + img[src$="/platinum.gif"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + description: + selector: a[href^="viewtopic.php?t="] > b +# engine n/a diff --git a/config/prowlarr/Definitions/nordichd.yml b/config/prowlarr/Definitions/nordichd.yml new file mode 100644 index 0000000..a17cad6 --- /dev/null +++ b/config/prowlarr/Definitions/nordichd.yml @@ -0,0 +1,181 @@ +--- +id: nordichd +name: NORDiCHD +description: "NORDiCHD is a Mixed NORDIC Private Tracker for MOVIES / TV / GENERAL" +language: en-US +type: private +encoding: UTF-8 +links: + - https://nordichd.org/ +legacylinks: + - http://nordichd.org/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Movies"} + - {id: 14, cat: Movies/SD, desc: "Movies SD"} + - {id: 16, cat: Movies/SD, desc: "Movies Retro"} + - {id: 17, cat: Movies/HD, desc: "Movies HD"} + - {id: 31, cat: Movies/BluRay, desc: "Movies BDRip"} + - {id: 32, cat: Movies/BluRay, desc: "Movies BluRay"} + - {id: 33, cat: Movies, desc: "Movies Pack"} + - {id: 6, cat: Movies, desc: "iNTERNAL"} + - {id: 18, cat: Movies/SD, desc: "iNTERNAL SD"} + - {id: 19, cat: Movies/SD, desc: "iNTERNAL Retro"} + - {id: 34, cat: Movies/HD, desc: "iNTERNAL HD"} + - {id: 35, cat: Movies/BluRay, desc: "iNTERNAL BDRip"} + - {id: 36, cat: Movies/BluRay, desc: "iNTERNAL BluRay"} + - {id: 37, cat: Movies, desc: "iNTERNAL Pack"} + - {id: 2, cat: TV, desc: "TV Episodes"} + - {id: 3, cat: TV/SD, desc: "TV Episodes SD"} + - {id: 4, cat: TV, desc: "TV Episodes Series"} + - {id: 26, cat: TV/HD, desc: "TV Episodes HDTV Episodes"} + - {id: 27, cat: TV/HD, desc: "TV Episodes HDTV Series"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeders: seeders + size: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_results + type: info + label: Search results + default: "If you are getting the error Found no results while trying to browse this tracker then first access the site with your browser and check that you are not being forced to change your password because it has expired after 180 days." + +login: + path: ?p=home&pid=1 + method: form + form: form#sls_form + submitpath: ajax/login.php + inputs: + action: login + loginbox_membername: "{{ .Config.username }}" + loginbox_password: "{{ .Config.password }}" + loginbox_remember: 1 + selectorinputs: + securitytoken: + selector: "script:contains(\"stKey: \")" + filters: + - name: regexp + args: "stKey: \"(.+?)\"," + error: + - selector: div.error + - selector: :contains("-ERROR-") + test: + path: ?p=home&pid=1 + selector: div#member_info_bar + +search: + paths: + # 7 results per page, but fetching more pages when results < 7 returns duplicates from each additional page. + - path: / + inputs: + p: torrents + pid: 32 + $raw: "{{ range .Categories }}cid[]={{.}}&{{end}}" + keywords: "{{ .Keywords }}" + # name, description, both, uploader + search_type: name + "sortOptions[sortBy]": "{{ .Config.sort }}" + "sortOptions[sortOrder]": "{{ .Config.type }}" + # does not support imdbid search or have imdbid links in results. + error: + - selector: div.error:not(:contains("There are no results found.")) + + rows: + selector: "div.torrent-box[id^=\"torrent_\"]{{ if .Config.freeleech }}:has(img[src$=\"/torrent_free.png\"]){{ else }}{{ end }}" + + fields: + category: + selector: a[href*="?p=torrents&pid=10&cid="] + attribute: href + filters: + - name: querystring + args: cid + title: + selector: a[href*="?p=torrents&pid=10&action=details&tid="] + details: + selector: a[href*="?p=torrents&pid=10&action=details&tid="] + attribute: href + download: + selector: a[href*="?p=torrents&pid=10&action=download&tid="] + attribute: href + poster: + selector: a[href*="data/torrents/torrent_images/"] + attribute: href + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + genre: + selector: div.torrentDetails > div:has(a[href*="&genre="]) + filters: + - name: replace + args: ["Genre:", ""] + description: + text: "{{ .Result.genre }}" + size: + selector: a[rel="torrent_size"] + grabs: + selector: a[rel="times_completed"] + seeders: + selector: a[rel="torrent_seeders"] + leechers: + selector: a[rel="torrent_leechers"] + date_day: + selector: div.torrentOwner:contains("day") + # auto adjusted by site account profile + optional: true + filters: + - name: regexp + args: "Uploaded (.+?) by" + - name: fuzzytime + date_year: + selector: div.torrentOwner:contains("-") + # auto adjusted by site account profile + optional: true + filters: + - name: regexp + args: "Uploaded (.+?) by" + - name: dateparse + args: "dd-MM-yyyy HH:mm" + date_unix: + selector: div.torrentOwner abbr + optional: true + attribute: data-time + date: + text: "{{ if or .Result.date_day .Result.date_year .Result.date_unix }}{{ or .Result.date_day .Result.date_year .Result.date_unix }}{{ else }}now{{ end }}" + downloadvolumefactor: + case: + img[src$="/torrent_free.png"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 +# TSUE 2.2 diff --git a/config/prowlarr/Definitions/ntelogo.yml b/config/prowlarr/Definitions/ntelogo.yml new file mode 100644 index 0000000..78c317f --- /dev/null +++ b/config/prowlarr/Definitions/ntelogo.yml @@ -0,0 +1,175 @@ +--- +id: ntelogo +name: Ntelogo (API) +description: "Ntelogo is a GREEK Private Torrent Tracker for MOVIES / TV / GENERAL" +language: el-GR +type: private +encoding: UTF-8 +links: + - https://ntelogo.org/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Movies"} + - {id: 2, cat: TV, desc: "TV"} + - {id: 3, cat: Audio, desc: "Music"} + - {id: 6, cat: PC/0day, desc: "Windows"} + - {id: 4, cat: Console, desc: "Games"} + - {id: 5, cat: PC, desc: "Software"} + - {id: 7, cat: PC/Mobile-Android, desc: "Android"} + - {id: 8, cat: XXX, desc: "Adult Only"} + - {id: 9, cat: Books/EBook, desc: "Book"} + - {id: 10, cat: Audio/Audiobook, desc: "AudioBook"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + music-search: [q] + book-search: [q] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your Ntelogo account My Settings page and clicking on the API Key tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + inputs: {} # TODO: remove in v10 + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: "/api/torrents/filter" + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + # if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6 + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + seasonNumber: "{{ .Query.Season }}" + episodeNumber: "{{ .Query.Ep }}" + imdbId: "{{ .Query.IMDBIDShort }}" + tmdbId: "{{ .Query.TMDBID }}" + tvdbId: "{{ .Query.TVDBID }}" + "free[]": "{{ if .Config.freeleech }}100{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + + rows: + selector: data + attribute: attributes + + fields: + category: + selector: category_id + title: + selector: name + filters: + - name: re_replace + args: ["\\.", " "] + details: + selector: details_link + download: + selector: download_link + infohash: + selector: info_hash + poster: + selector: meta.poster + filters: + - name: replace + args: ["https://via.placeholder.com/90x135", ""] + imdbid: + selector: imdb_id + tmdbid: + selector: tmdb_id + tvdbid: + selector: tvdb_id + genre: + selector: meta.genres + filters: + - name: re_replace + args: ["(?i)(Science Fiction)", "Science_Fiction"] + - name: re_replace + args: ["(?i)(TV Movie)", "TV_Movie"] + - name: replace + args: [" & ", "_&_"] + description: + text: "{{ .Result.genre }}" + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0%, 25%, 50%, 75%, 100% + selector: freeleech + case: + 0%: 1 # not free + 25%: 0.75 + 50%: 0.5 + 75%: 0.25 + 100%: 0 # freeleech + "*": 0 # catch errors + uploadvolumefactor: + # api returns False, True + selector: double_upload + case: + False: 1 # normal + True: 2 # double + minimumseedtime: + # 7 day (as seconds = 7 x 24 x 60 x 60) + text: 604800 +# json UNIT3D 7.0.3 diff --git a/config/prowlarr/Definitions/nyaasi.yml b/config/prowlarr/Definitions/nyaasi.yml new file mode 100644 index 0000000..dd12849 --- /dev/null +++ b/config/prowlarr/Definitions/nyaasi.yml @@ -0,0 +1,293 @@ +--- +id: nyaasi +name: Nyaa.si +description: "Nyaa is a Public torrent site focused on Eastern Asian media including anime, manga, literature and music" +language: en-US +type: public +encoding: UTF-8 +requestDelay: 2 +links: + - https://nyaa.si/ + - https://nyaa.iss.ink/ + - https://nyaa.mrunblock.bond/ # for magnets only + - https://nyaa.unblockninja.com/ # for magnets only + - https://nyaa.nocensor.cloud/ + - https://nyaa.land/ +legacylinks: + - https://nyaa.black-mirror.xyz/ + - https://nyaa.unblocked.casa/ + - https://nyaa.proxyportal.fun/ + - https://nyaa.uk-unblock.xyz/ + - https://nyaa.ind-unblock.xyz/ + - https://nyaa.unblocked.bar/ + - https://nyaa.proxyportal.pw/ + - https://nyaa.uk-unblock.pro/ + - https://nyaa.root.yt/ + - https://nyaa.lol/ # dropped at request of owner + - https://nyaa.nocensor.world/ + - https://nyaa.nocensor.lol/ + - https://nyaa.nocensor.art/ + - https://nyaa.mrunblock.guru/ + - https://nyaa.mrunblock.life/ + - https://nyaa.nocensor.click/ + +caps: + categorymappings: + # Anime + - {id: 1_0, cat: TV/Anime, desc: "Anime"} + - {id: 1_1, cat: TV/Anime, desc: "Anime music videos"} + - {id: 1_2, cat: TV/Anime, desc: "English subtitled animes"} + - {id: 1_3, cat: TV/Anime, desc: "Non-english subtitled animes"} + - {id: 1_4, cat: TV/Anime, desc: "Raw animes"} + # Anime as Movies (Radarr uses t=movie): + - {id: 1_0, cat: Movies/Other, desc: "Anime"} + - {id: 1_1, cat: Movies/Other, desc: "Anime music videos"} + - {id: 1_2, cat: Movies/Other, desc: "English subtitled animes"} + - {id: 1_3, cat: Movies/Other, desc: "Non-english subtitled animes"} + - {id: 1_4, cat: Movies/Other, desc: "Raw animes"} + # Audio + - {id: 2_0, cat: Audio, desc: "Audio"} + - {id: 2_1, cat: Audio, desc: "Lossless audio"} + - {id: 2_2, cat: Audio, desc: "Lossy audio"} + # Literature + - {id: 3_0, cat: Books, desc: "Literature"} + - {id: 3_1, cat: Books, desc: "Literature english translated"} + - {id: 3_2, cat: Books, desc: "Literature non-english translated"} + - {id: 3_3, cat: Books, desc: "Raw literature"} + # Live + - {id: 4_0, cat: TV, desc: "Live Action"} + - {id: 4_1, cat: TV, desc: "Live Action - English"} + - {id: 4_2, cat: TV, desc: "Live Action - Idol/PV"} + - {id: 4_3, cat: TV, desc: "Live Action - Non-English"} + - {id: 4_4, cat: TV, desc: "Live Action - Raw"} + # Pics + - {id: 5_0, cat: Other, desc: "Pictures"} + - {id: 5_1, cat: Other, desc: "Pictures - Graphics"} + - {id: 5_2, cat: Other, desc: "Pictures - Photos"} + # Software + - {id: 6_0, cat: PC, desc: "Software"} + - {id: 6_1, cat: PC/ISO, desc: "Applications"} + - {id: 6_2, cat: PC/Games, desc: "Games"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + book-search: [q] + allowrawsearch: true + +settings: + - name: prefer_magnet_links + type: checkbox + label: Prefer Magnet Links + default: true + - name: sonarr_compatibility + type: checkbox + label: Improve Sonarr compatibility by trying to add Season information into Release Titles + default: false + - name: radarr_compatibility + type: checkbox + label: Improve Radarr compatibility by removing year information from keywords and adding it to Release Titles + default: false + - name: filter-id + type: select + label: Filter + default: 0 + options: + 0: No filter + 1: No remakes + 2: Trusted only + - name: cat-id + type: select + label: Category + default: 0_0 + options: + 0_0: "All categories" + 1_0: "Anime" + 1_1: "Anime - Anime Music Video" + 1_2: "Anime - English-translated" + 1_3: "Anime - Non-English-translated" + 1_4: "Anime - Raw" + 2_0: "Audio" + 2_1: "Audio - Lossless" + 2_2: "Audio - Lossy" + 3_0: "Literature" + 3_1: "Literature - English-translated" + 3_2: "Literature - Non-English-translated" + 3_3: "Literature - Lossy" + 4_0: "Live Action" + 4_1: "Live Action - English" + 4_2: "Live Action - Idol/PV" + 4_3: "Live Action - Non-English" + 4_4: "Live Action - Raw" + 5_0: "Pictures" + 5_1: "Pictures - Graphics" + 5_2: "Pictures - Photos" + 6_0: "Software" + 6_1: "Software - Applications" + 6_2: "Software - Games" + - name: sort + type: select + label: Sort requested from site + default: id + options: + id: created + seeders: seeders + size: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +search: + paths: + - path: / + inputs: + q: "{{ .Keywords }}" + # strip 0 from start of episode number - #11019, or fetch page 2 for keywordless + - path: / + inputs: + q: "{{ if .Keywords }}{{ re_replace .Keywords \"\\b0(\\d{1})\\b\" \"$1\" }}{{ else }}{{ end }}" + p: "{{ if .Keywords }}{{ else }}2{{ end }}" + inputs: + f: "{{ .Config.filter-id }}" + c: "{{ .Config.cat-id }}" + s: "{{ .Config.sort }}" + o: "{{ .Config.type }}" + + keywordsfilters: + - name: re_replace + args: [" *\\b((?:19|20)\\d{2})\\b", "{{ if .Config.radarr_compatibility }}{{ else }} $1{{ end }}"] + + rows: + selector: tr.default,tr.danger,tr.success + + fields: + category: + selector: td:nth-child(1) a + attribute: href + filters: + - name: split + args: ["=", -1] + category_group_id: + selector: td:nth-child(1) a + attribute: href + filters: + - name: split + args: ["=", -1] + - name: split + args: ["_", 0] + title_default: + selector: td:nth-child(2) a:last-of-type + title_phase1: + selector: td:nth-child(2) a:last-of-type:contains("[PuyaSubs!] ") + optional: true + filters: + - name: append + args: " Spanish" + title_keyword_year: + text: "{{ .Query.Keywords }}" + filters: + - name: regexp + args: "\\b((19|20)\\d{2})\\b" + title_phase2: + text: "{{ or (.Result.title_phase1) (.Result.title_default) }}" + filters: + - name: re_replace + args: ["^(\\[.+?\\] ?)?(\\[.+?\\] ?)?(.+?)(\\[)", "$1$2$3{{ if .Config.radarr_compatibility }} {{ .Result.title_keyword_year }} $4{{ else }}$4{{ end }}"] + title_phase3: + text: "{{ .Result.title_phase2 }}" + filters: + - name: re_replace + args: ["(?i)\\b((?:S|Seasons?|EP?|Episodes?)\\s?)(\\d+)(?:\\-|[\\s~\\+àa&]+)(\\d+)\\b", "$1$2-$3"] + - name: re_replace + args: ["(?i)\\b(?:S|Seasons?)\\s?(\\d+(?:-\\d+)?)[\\s\\-]+(?:EP|Episodes?)\\s?(\\d+(?:-\\d+)?)\\b", "$0 S$1E$2"] + - name: re_replace + args: ["(?i)\\b(?:S|Seasons?)\\s?(\\d+(?:-\\d+)?)(?:.+?)(?:EP|Episodes?)\\s?(\\d+(?:-\\d+)?)\\b(?!(?:-\\d+)?\\sS\\d+(?:-\\d+)?E\\d+(?:-\\d+)?)", "$0 S$1E$2"] + - name: re_replace + args: ["\\b (II) - (\\d+)[\\s\\-~\\+àa&]+(\\d+)", " $1 S02 - $2-$3"] + - name: re_replace + args: ["\\b (II) - (\\d+)", " $1 S02 - $2"] + - name: re_replace + args: ["\\b (III) - (\\d+)[\\s\\-~\\+àa&]+(\\d+)", " $1 S03 - $2-$3"] + - name: re_replace + args: ["\\b (III) - (\\d+)", " $1 S03 - $2"] + - name: re_replace + args: ["(?i)\\b(\\d+)(st|nd|rd|th) Season\\b", "$0 S$1"] + - name: re_replace + args: ["(?i)_(\\d+)(st|nd|rd|th)_season_(\\d+)_", "$0S$1E$3_"] + - name: re_replace + args: ["(?i)_(\\d+)(st|nd|rd|th)_season_", "$0S$1_"] + - name: re_replace + args: ["(?i)\\b(S\\d+(?:-\\d+)?) - (\\d+)[\\s\\-~\\+àa&]+(\\d+)\\b", "$1E$2-$3"] + - name: re_replace + args: ["(?i)\\b(S\\d+(?:-\\d+)?) - (\\d+)\\b", "$1E$2"] + - name: re_replace + args: ["(?i)\\b(?:S\\s|Seasons?\\s?)(\\d+(?:-\\d+)?)\\b(?!(?:-\\d+)?\\s(?:EP|Episodes?)?\\s?(?:\\d+(?:-\\d+)?)?\\s?S\\d+(?:E\\d+(?:-\\d+)?)?)", "$0 S$1"] + - name: re_replace + args: ["(?i)\\b(?:EP|Episodes?)\\s?(\\d+(?:-\\d+)?)\\b(?!(?:-\\d+)?\\sS\\d+(?:-\\d+)?(?:E\\d+(?:-\\d+)?)?)", "$0 S01E$1"] + title_has_season: + text: "{{ .Result.title_phase3 }}" + filters: + - name: regexp + args: "(?i)(S\\d{1,3}(E\\d+)?)" + - name: append + args: "NULL" + title_has_episode: + text: "{{ .Result.title_phase3 }}" + filters: + - name: regexp + args: "\\b(.+? - ?)(\\d+) ([\\[\\(])\\b" + - name: append + args: "NULL" + title_optional: + text: "{{ .Result.title_phase3 }}" + filters: + - name: append + args: "{{ if and (eq .Result.category_group_id \"1\") (and (eq .Result.title_has_season \"NULL\") (eq .Result.title_has_episode \"NULL\")) }} S01{{ else }}{{ end }}" + title: + text: "{{ if .Config.sonarr_compatibility }}{{ .Result.title_optional }}{{ else }}{{ .Result.title_phase2 }}{{ end }}" + details: + selector: td:nth-child(2) a:last-of-type + attribute: href + download_optional: + selector: td:nth-child(3) a[href$=".torrent"] + attribute: href + optional: true + download: + text: "{{ if .Config.prefer_magnet_links }}{{ else }}{{ .Result.download_optional }}{{ end }}" + optional: true + magnet: + selector: td:nth-child(3) a[href^="magnet:?"] + attribute: href + size: + selector: td:nth-child(4) + date: + selector: td:nth-child(5) + filters: + - name: append + args: " -00:00" # GMT + - name: dateparse + args: "yyyy-MM-dd HH:mm zzz" + seeders: + selector: td:nth-child(6):not(:empty) + optional: true + default: 0 + leechers: + selector: td:nth-child(7):not(:empty) + optional: true + default: 0 + grabs: + selector: td:nth-child(8):not(:empty) + optional: true + default: 0 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 + description: + selector: td:nth-child(2) a:last-of-type +# engine n/a diff --git a/config/prowlarr/Definitions/okpt.yml b/config/prowlarr/Definitions/okpt.yml new file mode 100644 index 0000000..c8e0fc2 --- /dev/null +++ b/config/prowlarr/Definitions/okpt.yml @@ -0,0 +1,189 @@ +--- +id: okpt +name: OKPT +description: "OKPT is a CHINESE Private site for MOVIES / TV / MUSIC / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +requestDelay: 2 +links: + - https://www.okpt.net/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "Movies/电影", default: true} + - {id: 402, cat: TV, desc: "TV Series/电视剧", default: true} + - {id: 403, cat: TV, desc: "TV Shows/综艺", default: true} + - {id: 404, cat: TV/Documentary, desc: "Documentaries/纪录片", default: true} + - {id: 407, cat: TV/Sport, desc: "Sports/体育", default: true} + - {id: 436, cat: Books/Comics, desc: "Comics/漫画书", default: true} + - {id: 405, cat: TV/Anime, desc: "Animations/动漫", default: true} + - {id: 434, cat: Books/EBook, desc: "Books/书刊", default: true} + - {id: 432, cat: Audio/Audiobook, desc: "Audiobook/有声书", default: true} + - {id: 413, cat: Console, desc: "Games/游戏", default: true} + - {id: 431, cat: PC, desc: "Software/软件", default: true} + - {id: 409, cat: Other, desc: "Misc/其他", default: true} + # special + - {id: 412, cat: XXX/Other, desc: "3XBook/写真图影", default: false} + - {id: 411, cat: XXX/x264, desc: "3XVideo/写真影片", default: false} + - {id: 410, cat: XXX/ImageSet, desc: "3XImageSet/写真图片", default: false} + - {id: 415, cat: Audio, desc: "Music/音乐", default: false} + - {id: 437, cat: Audio/Video, desc: "Concert/演唱会", default: false} + - {id: 438, cat: Audio/Video, desc: "Concert/音乐会", default: false} + - {id: 416, cat: Other, desc: "Misc/其它", default: false} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + book-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + categories: [401, 402, 403, 404, 407, 436, 405, 434, 432, 413, 431, 409] + - path: special.php + categories: [412, 411, 410, 415, 437, 438, 416] + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl (4 does not appear to work) + search_area: "{{ if or .Query.IMDBID .Query.DoubanID }}1{{ else }}0{{ end }}" + # 0 AND, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: img[data-src] + attribute: data-src + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-child(5) + seeders: + selector: td.rowfollow:nth-child(6) + leechers: + selector: td.rowfollow:nth-child(7) + grabs: + selector: td.rowfollow:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 1.5 days (as seconds = 1.5 x 24 x 60 x 60) + text: 129600 + description_verified: + case: + span[title="通过"], span[title="通過"], span[title="Allowed"]: "Verified:" + span[title="未审"], span[title="未審"], span[title="Not reviewed"]: "Unverified:" + span[title="拒绝"], span[title="拒絕"], span[title="Denied"]: "Banned:" + description: + selector: td.rowfollow:nth-child(2) + remove: a, b, font, img, span + filters: + - name: prepend + args: "{{ .Result.description_verified }} " +# NexusPHP v1.8.8 2023-09-25 diff --git a/config/prowlarr/Definitions/oldtoonsworld.yml b/config/prowlarr/Definitions/oldtoonsworld.yml new file mode 100644 index 0000000..55660e8 --- /dev/null +++ b/config/prowlarr/Definitions/oldtoonsworld.yml @@ -0,0 +1,195 @@ +--- +id: oldtoonsworld +name: Old Toons World +description: "Old Toons World is a Private Torrent Tracker for Cartoon MOVIES / TV / GENERAL" +language: en-US +type: private +encoding: UTF-8 +links: + - https://oldtoons.world/ + +caps: + categorymappings: + - {id: 401, cat: TV/Anime, desc: "Anime"} + - {id: 404, cat: TV, desc: "Cartoon"} + - {id: 405, cat: Audio, desc: "Audio"} + - {id: 402, cat: Books, desc: "Books"} + - {id: 403, cat: Movies, desc: "Shorts"} + - {id: 406, cat: TV, desc: "Adults"} + - {id: 407, cat: Movies, desc: "Family/Teen"} + - {id: 409, cat: Other, desc: "Misc"} + - {id: 408, cat: PC/Games, desc: "Games"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: 2facode + type: text + label: 2FA code + - name: info_2fa + type: info + label: "About 2FA code" + default: "Only fill in the 2FA code box if you have enabled 2FA on the Old Toons World Web Site. Otherwise just leave it empty." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + secret: "" + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + two_step_code: "{{ .Config.2facode }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("Login failed!")) + - selector: td.embedded:has(h2:contains("Failed")) + - selector: td.embedded:has(h2:contains("Login Locked!")) + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl + search_area: "{{ if .Query.IMDBID }}4{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(a[href^="details.php?id="]) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: img[data-src] + attribute: data-src + imdbid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="imdb.com/title/tt"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-child(5) + seeders: + selector: td.rowfollow:nth-child(6) + leechers: + selector: td.rowfollow:nth-child(7) + grabs: + selector: td.rowfollow:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 2 day (as seconds = 2 x 24 x 60 x 60) + text: 172800 + genre: + selector: td.rowfollow:nth-child(2) + remove: a, img, span + description: + text: "{{ .Result.genre }}" +# NexusPHP v1.8.6 2023-08-18 diff --git a/config/prowlarr/Definitions/onejav.yml b/config/prowlarr/Definitions/onejav.yml new file mode 100644 index 0000000..6bd6411 --- /dev/null +++ b/config/prowlarr/Definitions/onejav.yml @@ -0,0 +1,82 @@ +--- +id: onejav +name: OneJAV +description: "OneJAV is a Public tracker for Asian 3X (JAV)" +language: en-US +type: public +encoding: UTF-8 +requestDelay: 2 +links: + - https://onejav.com/ + +caps: + categories: + XXX: XXX + + modes: + search: [q] + +settings: + - name: flaresolverr-onejav + type: info + label: FlareSolverr + default: This site may use Cloudflare DDoS Protection, therefore Prowlarr requires FlareSolverr to access it.

If you have issues downloading, perform a keyword search (e.g. video) so FlareSolverr can grab new cookies. + +search: + paths: + - path: "{{ if .Keywords }}search/{{ .Keywords }}{{ else }}new{{ end }}" + - path: "{{ if .Keywords }}search/{{ .Keywords }}{{ else }}new{{ end }}?page=2" + + rows: + selector: div.mb-3 + + fields: + category: + text: XXX + title: + selector: a[href^="/torrent/"] + details: + selector: a[href^="/torrent/"] + attribute: href + download: + selector: a[href*="/download/"] + attribute: href + poster: + selector: img + attribute: src + _actress: + selector: a[href^="/actress/"] + optional: true + filters: + - name: prepend + args: "Actress: " + _tags: + selector: div.tags + optional: true + filters: + - name: prepend + args: "Tags: " + description_text: + selector: p.level + optional: true + description: + text: "{{ .Result.description_text }}
{{ .Result._actress }}
{{ .Result._tags }}" + date: + selector: p.is-6 > a + attribute: href + filters: + - name: append + args: " -07:00" # PDT + - name: dateparse + args: "/yyyy/MM/dd zzz" + size: + selector: span.is-size-6 + seeders: + text: 1 + leechers: + text: 1 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/onlyencodes-api.yml b/config/prowlarr/Definitions/onlyencodes-api.yml new file mode 100644 index 0000000..a66cebe --- /dev/null +++ b/config/prowlarr/Definitions/onlyencodes-api.yml @@ -0,0 +1,165 @@ +--- +id: onlyencodes-api +name: OnlyEncodes (API) +description: "OnlyEncodes is a Private Tracker for MOVIES / TV" +language: en-US +type: private +encoding: UTF-8 +links: + - https://onlyencodes.cc/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Movie"} + - {id: 2, cat: TV, desc: "TV Show"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your OnlyEncodes account My Settings page and clicking on the API Key tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + inputs: {} # TODO: remove in v10 + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: "/api/torrents/filter" + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + # if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6 + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + seasonNumber: "{{ .Query.Season }}" + episodeNumber: "{{ .Query.Ep }}" + imdbId: "{{ .Query.IMDBIDShort }}" + tmdbId: "{{ .Query.TMDBID }}" + tvdbId: "{{ .Query.TVDBID }}" + "free[]": "{{ if .Config.freeleech }}100{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + + rows: + selector: data + attribute: attributes + + fields: + category: + selector: category_id + title: + selector: name + details: + selector: details_link + download: + selector: download_link + infohash: + selector: info_hash + poster: + selector: meta.poster + filters: + - name: replace + args: ["https://via.placeholder.com/90x135", ""] + imdbid: + selector: imdb_id + tmdbid: + selector: tmdb_id + tvdbid: + selector: tvdb_id + genre: + selector: meta.genres + filters: + - name: re_replace + args: ["(?i)(Science Fiction)", "Science_Fiction"] + - name: re_replace + args: ["(?i)(TV Movie)", "TV_Movie"] + - name: replace + args: [" & ", "_&_"] + description: + text: "{{ .Result.genre }}" + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0%, 25%, 50%, 75%, 100% + selector: freeleech + case: + 0%: 1 # not free + 25%: 0.75 + 50%: 0.5 + 75%: 0.25 + 100%: 0 # freeleech + "*": 0 # catch errors + uploadvolumefactor: + # api returns False, True + selector: double_upload + case: + False: 1 # normal + True: 2 # double +# global MR is 0.4 but torrents must be seeded for 2 days regardless of ratio +# minimumratio: +# text: 0.4 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# json UNIT3D 7.1.3 diff --git a/config/prowlarr/Definitions/opencd.yml b/config/prowlarr/Definitions/opencd.yml new file mode 100644 index 0000000..8f88b35 --- /dev/null +++ b/config/prowlarr/Definitions/opencd.yml @@ -0,0 +1,194 @@ +--- +id: opencd +name: OpenCD +description: "OpenCD is a CHINESE Private Torrent Tracker for MUSIC" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://open.cd/ + +caps: + categorymappings: + - {id: 2, cat: Audio, desc: "华语流行(Pop)"} + - {id: 3, cat: Audio, desc: "古典音乐(Classical)"} + - {id: 11, cat: Audio, desc: "民族音乐(Instrumental)"} + - {id: 4, cat: Audio, desc: "原声配乐(OST)"} + - {id: 5, cat: Audio, desc: "泛摇滚乐(Rock)"} + - {id: 8, cat: Audio, desc: "爵士乡村(Jazz)"} + - {id: 12, cat: Audio, desc: "新世纪(NewAge)"} + - {id: 13, cat: Audio, desc: "舞曲(Dance)"} + - {id: 14, cat: Audio, desc: "电子(Electronic)"} + - {id: 15, cat: Audio, desc: "民谣(Folk)"} + - {id: 16, cat: Audio, desc: "独立(Indie)"} + - {id: 17, cat: Audio, desc: "嘻哈(Hip Hop)"} + - {id: 18, cat: Audio, desc: "音乐剧(Musical)"} + - {id: 19, cat: Audio, desc: "乡村(Country)"} + - {id: 20, cat: Audio, desc: "另类(Alternative)"} + - {id: 21, cat: Audio, desc: "世界音樂(World))"} + - {id: 9, cat: Audio, desc: "其它类型(Others)"} + + modes: + search: [q] + music-search: [q, artist] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. Default is 50. + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + # https://open.cd/torrents.php?source11=1&source18=1&incldead=0&spstate=0&search=&search_area=0&search_mode=0 + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}source{{.}}=1&{{end}}" + search: "{{ if .Query.Artist }}{{ .Query.Artist }}{{ else }}{{ .Keywords }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl, 5 traklist, 6 artistname + search_area: "{{ if .Query.Artist }}6{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: td:nth-child(1) + attribute: title + case: + td[title="华语流行"]: 2 + td[title="古典音乐"]: 3 + td[title="民族音乐"]: 11 + td[title="原声配乐"]: 4 + td[title="泛摇滚乐"]: 5 + td[title="爵士乡村"]: 8 + td[title="新世纪"]: 12 + td[title="舞曲"]: 13 + td[title="电子"]: 14 + td[title="民谣"]: 15 + td[title="独立"]: 16 + td[title="嘻哈"]: 17 + td[title="音乐剧"]: 18 + td[title="乡村(Country)"]: 19 + td[title="另类(Alternative)"]: 20 + td[title="世界音樂(World)"]: 21 + td[title="其它类型"]: 9 + # Some torrents have no title set on td + td:not([title]): 9 + title_default: + selector: a[href*="details.php?id="] + title: + selector: a[title][href*="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href*="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: img[id^="attach"] + attribute: src + filters: + - name: prepend + args: "https://images.weserv.nl/?url={{ .Config.sitelink }}" # for display on dashboard + - name: append + args: "&w=180&h=270" # for display on dashboard + date_elapsed: + # time type: time elapsed (default) + selector: td:nth-child(6) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td:nth-child(6):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td:nth-child(7) + seeders: + selector: td:nth-child(8) + leechers: + selector: td:nth-child(9) + grabs: + selector: td:nth-child(10) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 36 hours (as seconds = 36 x 60 x 60) + text: 129600 + description: + selector: td:nth-child(3) + remove: a, b, font, img, span +# NexusPHP Standard v1.5 Beta 4 (customised) diff --git a/config/prowlarr/Definitions/oshenpt.yml b/config/prowlarr/Definitions/oshenpt.yml new file mode 100644 index 0000000..24bfc15 --- /dev/null +++ b/config/prowlarr/Definitions/oshenpt.yml @@ -0,0 +1,191 @@ +--- +id: oshenpt +name: OshenPT +description: "OshenPT is a CHINESE Private Torrent Tracker for HD Movies, TV, Music" +language: zh-CN +type: private +encoding: UTF-8 +links: + - http://www.oshen.win/ +legacylinks: + - https://www.oshen.win/ # forces http + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "Movies/电影"} + - {id: 404, cat: TV/Documentary, desc: "Documentaries/纪录片"} + - {id: 405, cat: TV/Anime, desc: "Animations/动漫"} + - {id: 402, cat: TV, desc: "TV Series/剧集"} + - {id: 403, cat: TV, desc: "TV Shows/综艺"} + - {id: 406, cat: Audio/Video, desc: "MusicVideo/音乐MV"} + - {id: 407, cat: TV/Sport, desc: "Sports/运体"} + - {id: 409, cat: Other, desc: "Misc/音乐"} + - {id: 408, cat: Audio, desc: "HQ Audio/无损音乐"} + - {id: 410, cat: Console, desc: "Games/游戏"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: 2facode + type: text + label: 2FA code + - name: info_2fa + type: info + label: "About 2FA code" + default: "Only fill in the 2FA code box if you have enabled 2FA on the OshenPT Web Site. Otherwise just leave it empty." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + two_step_code: "{{ .Config.2facode }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("失败")) + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl (4 does not appear to work). + search_area: "{{ if or .Query.IMDBID .Query.DoubanID }}1{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: img[data-src] + attribute: data-src + imdbid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="imdb.com/title/tt"] + attribute: href + doubanid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="movie.douban.com/subject/"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-child(5) + seeders: + selector: td.rowfollow:nth-child(6) + leechers: + selector: td.rowfollow:nth-child(7) + grabs: + selector: td.rowfollow:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + description: + selector: td:nth-child(2) + remove: a, b, font, img, span +# NexusPHP v1.8.9 2023-11-15 diff --git a/config/prowlarr/Definitions/ostwiki.yml b/config/prowlarr/Definitions/ostwiki.yml new file mode 100644 index 0000000..2b1a1db --- /dev/null +++ b/config/prowlarr/Definitions/ostwiki.yml @@ -0,0 +1,163 @@ +--- +id: ostwiki +name: Ostwiki +description: "Ostwiki is a Private Torrent Tracker for Soundtracks releases." +language: en-US +type: private +encoding: UTF-8 +links: + - https://www.ostwiki.com/ + +caps: + categorymappings: + - {id: 12, cat: Audio, desc: "Anime Soundtracks"} + - {id: 19, cat: Audio, desc: "Discography"} + - {id: 13, cat: Audio, desc: "Game Soundtracks"} + - {id: 14, cat: Audio, desc: "Movie Soundtracks"} + - {id: 18, cat: Audio/MP3, desc: "MP3 Musical"} + - {id: 15, cat: Audio, desc: "Musical Soundtracks"} + - {id: 17, cat: Audio, desc: "Other Music"} + - {id: 20, cat: Audio/Lossless, desc: "Soundtrack .FLAC"} + - {id: 16, cat: Audio, desc: "Television Soundtracks"} + + modes: + search: [q] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 40 on your account profile. The Default is 15. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img#regimage + input: imagestring + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + logout: "" + error: + - selector: table:contains("error has occured") + test: + path: index.php + selector: a[href*="/logout.php?logouthash="] + +download: + before: + path: takethanks.php + method: post + inputs: + torrentid: "{{ .DownloadUri.Query.id }}" + selectors: + - selector: a[href*="download.php?id="] + attribute: href + +search: + paths: + - path: browse.php + keywordsfilters: + - name: re_replace + args: ["[\\s]+", "%"] + inputs: + do: search + keywords: "{{ .Keywords }}" + # t_name, t_description, t_both, t_uploader, t_genre + search_type: t_name + # does not support multi category searching so defaulting to all. + category: 0 + # yes, no + include_dead_torrents: yes + sort: "{{ if .Config.freeleech }}free{{ else }}{{ .Config.sort }}{{ end }}" + order: "{{ if .Config.freeleech }}asc{{ else }}{{ .Config.type }}{{ end }}" + + rows: + selector: "table.sortable tr:has(a[href*=\"/download.php?id=\"]){{ if .Config.freeleech }}:has(img[src$=\"/freedownload.gif\"]){{ else }}{{ end }}" + + fields: + category: + selector: a[href*="/browse.php?category="] + attribute: href + filters: + - name: querystring + args: category + title_default: + # is usually abbreaviated + selector: a[href*="/details.php?id="] + title: + # while still abbreviated, is usually longer than the default + selector: div.tooltip-content div + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href*="/details.php?id="] + attribute: href + download: + selector: a[href*="/details.php?id="] + attribute: href + magnet: + selector: a[href^="magnet:?xt="] + attribute: href + poster: + selector: img[src*="/torrents/images/"] + attribute: src + date: + selector: td:nth-child(2) + # auto adjusted by site account profile + filters: + - name: regexp + args: "(\\d{2}-\\d{2}-\\d{4} \\d{2}:\\d{2})" + - name: dateparse + args: "dd-MM-yyyy HH:mm" + size: + selector: td:nth-last-child(5) + grabs: + selector: td:nth-last-child(4) + seeders: + selector: td:nth-last-child(3) + leechers: + selector: td:nth-last-child(2) + description: + # Wait: 4 h + selector: div.tooltip-content > div:last-child + downloadvolumefactor: + case: + img[src$="/freedownload.gif"]: 0 + img[src$="/silverdownload.gif"]: 0.5 + "*": 1 + uploadvolumefactor: + case: + img[src$="/x2.gif"]: 2 + "*": 1 +# TS Special Edition v.8.0 diff --git a/config/prowlarr/Definitions/ourbits.yml b/config/prowlarr/Definitions/ourbits.yml new file mode 100644 index 0000000..b854617 --- /dev/null +++ b/config/prowlarr/Definitions/ourbits.yml @@ -0,0 +1,175 @@ +--- +id: ourbits +name: OurBits +description: "OurBits (HDPter) is a CHINESE Private Torrent Tracker for HD MOVIES / TV / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://ourbits.club/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "Movies"} + - {id: 402, cat: Movies/3D, desc: "Movies 3D"} + - {id: 405, cat: TV, desc: "TV Packs"} + - {id: 410, cat: TV/Documentary, desc: "Documentaries"} + - {id: 411, cat: TV/Anime, desc: "Animations"} + - {id: 412, cat: TV, desc: "TV Episodes"} + - {id: 413, cat: TV, desc: "TV Shows"} + - {id: 414, cat: Audio/Video, desc: "Music Videos"} + - {id: 415, cat: TV/Sport, desc: "Sports"} + - {id: 416, cat: Audio, desc: "Music"} + - {id: 419, cat: TV, desc: "Concert"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat[]={{.}}&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # 0=incldead, 1=active, 2=dead + incldead: 0 + # show promotions: 0=all, 1=normal, 2=free, 3=2x, 4=2xFree, 5=50%, 6=2x50%, 7=30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0=title, 3=uploader, 4=imdb URL, 5=douban URL + search_area: "{{ if .Query.IMDBID }}4{{ else }}0{{ end }}" + # 0=AND, 1=OR, 2=Exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + imdbid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="imdb.com/title/tt"] + attribute: href + doubanid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="movie.douban.com/subject/"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-child(5) + seeders: + selector: td.rowfollow:nth-child(6) + leechers: + selector: td.rowfollow:nth-child(7) + grabs: + selector: td.rowfollow:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 + description: + selector: td.rowfollow:nth-child(2) > table > tbody > tr > td + remove: a, b, font, img, span + filters: + - name: replace + args: [" 剩余时间:", ""] +# Ourbits 1.1.0 (Based on NexusPHP Standard v1.5 Beta 4) 9169dad 2023-11-20 diff --git a/config/prowlarr/Definitions/p2pbg.yml b/config/prowlarr/Definitions/p2pbg.yml new file mode 100644 index 0000000..8d69804 --- /dev/null +++ b/config/prowlarr/Definitions/p2pbg.yml @@ -0,0 +1,206 @@ +--- +id: p2pbg +name: P2PBG +description: "P2PBG is a BULGARIAN Private Torrent Tracker for 0DAY / GENERAL" +language: bg-BG +type: private +encoding: UTF-8 +links: + - http://p2pbg.com/ # site does not support https ERR_CONNECTION_REFUSED + +caps: + categorymappings: + # movies + - {id: 1, cat: Movies/SD, desc: "Movies XviD"} + - {id: 55, cat: Movies/3D, desc: "Movies 3D"} + - {id: 16, cat: Movies/HD, desc: "Movies x264"} + - {id: 11, cat: Movies/DVD, desc: "Movies DVD"} + - {id: 17, cat: Movies/HD, desc: "Movies MPEG2"} + - {id: 18, cat: Movies/BluRay, desc: "Movies BR/HD DVD"} + - {id: 7, cat: TV/Documentary, desc: "Movies Documentaries"} + - {id: 35, cat: Movies, desc: "Movies GSM"} + - {id: 34, cat: Movies, desc: "Movies BG"} + - {id: 24, cat: TV/SD, desc: "TV BG"} + - {id: 14, cat: TV, desc: "TV Shows"} + - {id: 15, cat: TV, desc: "TV Boxset"} + - {id: 38, cat: TV/Anime, desc: "TV Cartoons"} + # music + - {id: 2, cat: Audio/MP3, desc: "Music Song"} + - {id: 28, cat: Audio, desc: "Music Album"} + - {id: 29, cat: Audio, desc: "Music Discography"} + - {id: 3, cat: Audio/Video, desc: "Music DVD"} + - {id: 19, cat: Audio/Video, desc: "Music Video"} + # games + - {id: 8, cat: PC/Games, desc: "Games PC ISO"} + - {id: 9, cat: PC/Games, desc: "Games PC Rips"} + - {id: 33, cat: Console/Wii, desc: "Games Wii"} + - {id: 12, cat: Console/PS3, desc: "Games PS2"} + - {id: 23, cat: Console/PS3, desc: "Games PS3"} + - {id: 20, cat: Console/PSP, desc: "Games PSP"} + - {id: 21, cat: Console/XBox, desc: "Games XboX"} + - {id: 22, cat: Console/XBox 360, desc: "Games X360"} + # appz + - {id: 26, cat: PC/ISO, desc: "Appz PC ISO"} + - {id: 31, cat: PC/0day, desc: "Appz Ripped"} + - {id: 30, cat: PC, desc: "Appz Linux"} + - {id: 49, cat: PC/Mac, desc: "Appz MacOS"} + - {id: 27, cat: PC, desc: "Appz GSM"} + # sports + - {id: 5, cat: TV/Sport, desc: "Sport F1"} + - {id: 51, cat: TV/Sport, desc: "Sport"} + # other + - {id: 6, cat: Books, desc: "Books"} + - {id: 4, cat: Other, desc: "Other"} + - {id: 37, cat: Other/Misc, desc: "Pictures"} + - {id: 39, cat: Other, desc: "e-Learning"} + - {id: 52, cat: PC/Mobile-Other, desc: "Mobile GSM"} + - {id: 40, cat: PC/Mobile-iOS, desc: "Mobile iPhone"} + # 3x + - {id: 13, cat: XXX, desc: "XXX"} + - {id: 54, cat: XXX/x264, desc: "XXX HD"} + - {id: 32, cat: XXX/ImageSet, desc: "XXX Pictures"} + - {id: 48, cat: XXX, desc: "XXX BG Amateurs"} + - {id: 53, cat: XXX, desc: "XXX Hentai"} + - {id: 56, cat: XXX, desc: "XXX 3D"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: info_results + type: info + label: "Search results" + default: "Only the Base style is supported with this indexer.
For best results, change the Torrents per page: setting to 100 on your account profile." + - name: sort + type: select + label: Sort requested from site + default: data + options: + data: created + size: size + - name: type + type: select + label: Order requested from site + default: DESC + options: + DESC: desc + ASC: asc + +login: + path: index.php?page=login + method: form + form: form[action="index.php?page=login"] + inputs: + uid: "{{ .Config.username }}" + pwd: "{{ .Config.password }}" + error: + - selector: td.lista span[style="color:#FF0000;"] + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + # http://p2pbg.com/index.php?page=torrents&search=%D0%9A%D0%B0%D1%82%D0%BE&category=0&active=0 + - path: index.php + inputs: + page: torrents + category: "{{ if .Categories }}{{ range .Categories }}{{.}};{{end}}{{ else }}0;{{ end }}" + search: "{{ if .Keywords }}{{ .Keywords }}{{ else }}{{ end }}" + # 0 all 1, active, 2 dead + active: 0 + order: "{{ .Config.sort }}" + by: "{{ .Config.type }}" + + rows: + selector: table.lista tr td table.lista tr:has(a[href^="index.php?page=torrent-details"]) + + fields: + category: + selector: td a[href*="category="] + attribute: href + filters: + - name: querystring + args: category + title_default: + # often abbreviated + selector: td:nth-child(2) a + title: + # usually full length + selector: td a[title] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + filters: + - name: replace + args: ["View details: ", ""] + - name: replace + args: ["Преглед на детайли: ", ""] + details: + selector: td a[href*="id="] + attribute: href + download: + selector: td a[href*="id="] + attribute: href + filters: + - name: querystring + args: id + - name: prepend + args: "download.php?id=" + - name: append + args: "&f={{ .Result.title }}.torrent" + poster: + selector: td a:has(img[src^="/torrentimg/pic"]) + attribute: onmouseover + filters: + - name: regexp + args: src=([^\s]+) + # two flavours + date_day: + # Yesterday + # Вчера + selector: td:nth-last-child(5):not(:contains("/")) + # auto adjusted by site account profile + optional: true + filters: + - name: re_replace + args: ["(?i)сейчас|Сега", "now"] + - name: re_replace + args: ["(?i)сегодня|Днес", "Today"] + - name: re_replace + args: ["(?i)вчера|Вчера", "Yesterday"] + date_year: + # 14/03/2019 + selector: td:nth-last-child(5):contains("/") + # auto adjusted by site account profile + optional: true + filters: + - name: dateparse + args: "dd/MM/yyyy" + date: + text: "{{ if or .Result.date_day .Result.date_year }}{{ or .Result.date_day .Result.date_year }}{{ else }}now{{ end }}" + size: + selector: td:nth-last-child(4) + seeders: + selector: td:nth-last-child(3) + leechers: + selector: td:nth-last-child(2) + grabs: + selector: td:nth-last-child(1) + downloadvolumefactor: + text: 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 +# xbtit customised diff --git a/config/prowlarr/Definitions/panda.yml b/config/prowlarr/Definitions/panda.yml new file mode 100644 index 0000000..cc5ffc5 --- /dev/null +++ b/config/prowlarr/Definitions/panda.yml @@ -0,0 +1,203 @@ +--- +id: panda +name: Panda +description: "Panda is a CHINESE Private Torrent Tracker for MOVIES / TV / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://pandapt.net/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "Movies/电影"} + - {id: 402, cat: TV, desc: "TV Series/电视剧"} + - {id: 405, cat: TV/Anime, desc: "Animations/动漫"} + - {id: 403, cat: TV, desc: "TV Shows/综艺"} + - {id: 404, cat: TV/Documentary, desc: "Documentaries/纪录片"} + - {id: 407, cat: TV/Sport, desc: "Sports/体育"} + - {id: 412, cat: PC, desc: "Software/软件"} + - {id: 411, cat: Console, desc: "Games/游戏"} + - {id: 410, cat: Books, desc: "E-Books/电子书"} + - {id: 406, cat: Audio/Video, desc: "Music Videos/MV"} + - {id: 408, cat: Audio, desc: "Music/音乐"} + - {id: 409, cat: Other, desc: "Others/其他"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: 2facode + type: text + label: 2FA code + - name: info_2fa + type: info + label: "About 2FA code" + default: "Only fill in the 2FA code box if you have enabled 2FA on the Kufei Web Site. Otherwise just leave it empty." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + secret: "" + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + two_step_code: "{{ .Config.2facode }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("失败")) + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl + search_area: "{{ if .Query.IMDBID }}4{{ else }}{{ end }}{{ if .Query.DoubanID }}1{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }}{{ else }}0{{ end }}" + # 0 AND, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: img[data-src] + attribute: data-src + imdbid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="imdb.com/title/tt"] + attribute: href + doubanid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="movie.douban.com/subject/"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-child(5) + seeders: + selector: td.rowfollow:nth-child(6) + leechers: + selector: td.rowfollow:nth-child(7) + grabs: + selector: td.rowfollow:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumratio: + text: 1.0 + description_verified: + case: + span[title="通过"], span[title="通過"], span[title="Allowed"]: "Verified:" + span[title="未审"], span[title="未審"], span[title="Not reviewed"]: "Unverified:" + span[title="拒绝"], span[title="拒絕"], span[title="Denied"]: "Banned:" + description: + selector: td:nth-child(2) + remove: a, b, font, img, span + filters: + - name: prepend + args: "{{ .Result.description_verified }} " +# NexusPHP v1.8.6 2023-08-04 diff --git a/config/prowlarr/Definitions/parnuxi.yml b/config/prowlarr/Definitions/parnuxi.yml new file mode 100644 index 0000000..aec7b41 --- /dev/null +++ b/config/prowlarr/Definitions/parnuxi.yml @@ -0,0 +1,247 @@ +--- +id: parnuxi +name: ParnuXi +description: "ParnuXi is a RUSSIAN Public Torrent Tracker for 3X" +language: ru-RU +type: public +encoding: UTF-8 +links: + - http://parnuxi.com/ # site does not support https ERR_CONNECTION_REFUSED + +caps: + categorymappings: + - {id: 144, cat: XXX, desc: "Форум"} + - {id: 145, cat: XXX, desc: " Свободное общение"} + - {id: 147, cat: XXX, desc: " Помощь в поиске порно"} + - {id: 148, cat: XXX, desc: " Правила, помощь, вопросы, предложения по улучшению трекера"} + - {id: 1, cat: XXX, desc: "Порно торрент"} + - {id: 9, cat: XXX, desc: " Любительское порно"} + - {id: 48, cat: XXX, desc: " HD Любительское порно"} + - {id: 49, cat: XXX, desc: " Гонзо"} + - {id: 50, cat: XXX, desc: " HD Гонзо"} + - {id: 51, cat: XXX, desc: " Любительское. Паки и сборники"} + - {id: 11, cat: XXX, desc: " Русское порно"} + - {id: 150, cat: XXX, desc: " Порно с русскими актрисами"} + - {id: 52, cat: XXX, desc: " Русские порнофильмы"} + - {id: 53, cat: XXX, desc: " HD Порно с Русскими актрисами"} + - {id: 54, cat: XXX, desc: " Русское порно. Паки и сборники"} + - {id: 2, cat: XXX, desc: " Анал"} + - {id: 29, cat: XXX, desc: " HD Анал"} + - {id: 30, cat: XXX, desc: " Анал. Паки и сборники"} + - {id: 10, cat: XXX, desc: " Молоденькие"} + - {id: 36, cat: XXX, desc: " HD Молоденькие"} + - {id: 37, cat: XXX, desc: " Молоденькие. Паки и сборники"} + - {id: 6, cat: XXX, desc: " Групповой секс"} + - {id: 42, cat: XXX, desc: " HD Групповой секс"} + - {id: 3, cat: XXX, desc: " Взрослые"} + - {id: 31, cat: XXX, desc: " HD Взрослые"} + - {id: 32, cat: XXX, desc: " Взрослые. Паки и сборники"} + - {id: 33, cat: XXX, desc: " Бабушки"} + - {id: 7, cat: XXX, desc: " Порнозвезды"} + - {id: 43, cat: XXX, desc: " HD Порнозвезды"} + - {id: 44, cat: XXX, desc: " Порнозвезды. Паки и сборники по актрисам"} + - {id: 18, cat: XXX, desc: " Лесбиянки"} + - {id: 34, cat: XXX, desc: " HD Лесбиянки"} + - {id: 35, cat: XXX, desc: " Лесбиянки. Паки и сборники"} + - {id: 4, cat: XXX, desc: " Оральный секс и сперма"} + - {id: 38, cat: XXX, desc: " HD Оральный секс и сперма"} + - {id: 39, cat: XXX, desc: " Bukkake"} + - {id: 40, cat: XXX, desc: " Glory Hole"} + - {id: 5, cat: XXX, desc: " Толстушки"} + - {id: 41, cat: XXX, desc: " HD Толстушки"} + - {id: 13, cat: XXX, desc: " Фетиш"} + - {id: 56, cat: XXX, desc: " Фистинг, фаллоимитаторы, игрушки"} + - {id: 57, cat: XXX, desc: " Гинекологические осмотры"} + - {id: 58, cat: XXX, desc: " Переодевание, униформа"} + - {id: 59, cat: XXX, desc: " Трусики, чулки, колготки"} + - {id: 60, cat: XXX, desc: " Большие сиськи"} + - {id: 62, cat: XXX, desc: " Фут фетиш"} + - {id: 63, cat: XXX, desc: " Спящие, Пьяные"} + - {id: 64, cat: XXX, desc: " Голый спорт"} + - {id: 65, cat: XXX, desc: " Волосатые"} + - {id: 14, cat: XXX, desc: " Порно со всего мира"} + - {id: 67, cat: XXX, desc: " Азиатки"} + - {id: 68, cat: XXX, desc: " Арабки, мусульманки"} + - {id: 69, cat: XXX, desc: " Индианки"} + - {id: 70, cat: XXX, desc: " Латинки"} + - {id: 71, cat: XXX, desc: " Негритянки"} + - {id: 153, cat: XXX, desc: " Межрасовый секс"} + - {id: 15, cat: XXX, desc: " Японское порно"} + - {id: 72, cat: XXX, desc: " Японское порно с цензурой"} + - {id: 73, cat: XXX, desc: " Японское порно без цензуры"} + - {id: 74, cat: XXX, desc: " HD Японское порно без цензуры"} + - {id: 97, cat: XXX, desc: " Полнометражные фильмы"} + - {id: 98, cat: XXX, desc: " Порно с сюжетом"} + - {id: 99, cat: XXX, desc: " Порно пародии"} + - {id: 100, cat: XXX, desc: " HD Полнометражные с сюжетом"} + - {id: 101, cat: XXX, desc: " Порно без сюжета"} + - {id: 102, cat: XXX, desc: " HD Полнометражные без сюжета"} + - {id: 103, cat: XXX, desc: " Эротические и документальные"} + - {id: 152, cat: XXX, desc: " Фильмы с Русским переводом"} + - {id: 155, cat: XXX, desc: " Этнические фильмы"} + - {id: 156, cat: XXX, desc: " Лесбо-фильмы"} + - {id: 8, cat: XXX, desc: " Ретро"} + - {id: 45, cat: XXX, desc: " 90-е"} + - {id: 46, cat: XXX, desc: " 80-е"} + - {id: 47, cat: XXX, desc: " 70-е"} + - {id: 12, cat: XXX, desc: " Вуайеризм и эксгибиционизм, нудизм"} + - {id: 55, cat: XXX, desc: " HD Вуайеризм и эксгибиционизм, нудизм"} + - {id: 154, cat: XXX, desc: " Casting"} + - {id: 157, cat: XXX, desc: " Public & Reality"} + - {id: 75, cat: XXX, desc: "Нетрадиционное порно"} + - {id: 76, cat: XXX, desc: " Извращения"} + - {id: 77, cat: XXX, desc: " Изнасилования"} + - {id: 78, cat: XXX, desc: " Измена"} + - {id: 79, cat: XXX, desc: " Инцест"} + - {id: 80, cat: XXX, desc: " Писающие"} + - {id: 81, cat: XXX, desc: " Копро"} + - {id: 82, cat: XXX, desc: " Беременные"} + - {id: 89, cat: XXX, desc: " Транссексуалы"} + - {id: 90, cat: XXX, desc: " HD Транссексуалы"} + - {id: 91, cat: XXX, desc: " BDSM"} + - {id: 92, cat: XXX, desc: " HD BDSM"} + - {id: 86, cat: XXX, desc: " Геи"} + - {id: 87, cat: XXX, desc: " HD Геи"} + - {id: 88, cat: XXX, desc: " Бисексуалы"} + - {id: 93, cat: XXX, desc: " Femdom и страпон"} + - {id: 94, cat: XXX, desc: " HD Femdom и страпон"} + - {id: 95, cat: XXX, desc: " Лесби страпон"} + - {id: 83, cat: XXX, desc: " Зоо порно"} + - {id: 84, cat: XXX, desc: " Собаки"} + - {id: 85, cat: XXX, desc: " Лошади"} + - {id: 158, cat: XXX, desc: " LegalPorno"} + - {id: 96, cat: XXX, desc: "Разное"} + - {id: 119, cat: XXX, desc: " Фото, журналы, комиксы"} + - {id: 120, cat: XXX, desc: " Любительские фото"} + - {id: 121, cat: XXX, desc: " Профессиональное, студийное фото"} + - {id: 122, cat: XXX, desc: " Фото эро и порноактрис"} + - {id: 123, cat: XXX, desc: " Журналы"} + - {id: 124, cat: XXX, desc: " Комиксы, картинки"} + - {id: 104, cat: XXX, desc: " Эротика"} + - {id: 105, cat: XXX, desc: " HD Эротика"} + - {id: 106, cat: XXX, desc: " Соло, Мастурбация"} + - {id: 107, cat: XXX, desc: " Стриптиз"} + - {id: 108, cat: XXX, desc: " Web камеры, видео чаты"} + - {id: 125, cat: XXX, desc: " Хентай и мультфильмы"} + - {id: 126, cat: XXX, desc: " Лоликон"} + - {id: 127, cat: XXX, desc: " Тентакли"} + - {id: 128, cat: XXX, desc: " Шотакон"} + - {id: 129, cat: XXX, desc: " Юри"} + - {id: 130, cat: XXX, desc: " Яой"} + - {id: 109, cat: XXX, desc: " Порно для мобильных устройств"} + - {id: 110, cat: XXX, desc: " Порно для смартфонов и КПК"} + - {id: 111, cat: XXX, desc: " Порно на телефон (3GP)"} + - {id: 112, cat: XXX, desc: " Порно для iPhone, iPad"} + - {id: 113, cat: XXX, desc: " 3D Порно"} + - {id: 114, cat: XXX, desc: " Анаглиф"} + - {id: 115, cat: XXX, desc: " Анаморфная стереопара"} + - {id: 116, cat: XXX, desc: " Стереопара"} + - {id: 117, cat: XXX, desc: " Blu-Ray 3D"} + - {id: 118, cat: XXX, desc: " 3D порно фото"} + - {id: 142, cat: XXX, desc: " Порно игры"} + - {id: 131, cat: XXX, desc: " Furry & Yiff"} + - {id: 132, cat: XXX, desc: " Furry Art"} + - {id: 133, cat: XXX, desc: " Yiff Art"} + - {id: 134, cat: XXX, desc: " Yiff Video"} + - {id: 135, cat: XXX, desc: " Furpile"} + - {id: 136, cat: XXX, desc: " Comics Rus"} + - {id: 137, cat: XXX, desc: " Comics Eng"} + - {id: 138, cat: XXX, desc: " Flash"} + - {id: 139, cat: XXX, desc: " Artist"} + - {id: 140, cat: XXX, desc: " Sex in fursuit"} + - {id: 141, cat: XXX, desc: " Furry and Yiff Рассказы"} + - {id: 151, cat: XXX, desc: " Мусор"} + + modes: + search: [q] + +settings: + - name: sort + type: select + label: Sort requested from site + default: t + options: + t: created + ts: seeders + sz: size + i: title + - name: type + type: select + label: Order requested from site + default: d + options: + d: desc + a: asc + +search: + paths: + # http://parnuxi.com/search.php?tracker_search=torrent&keywords=2020&terms=all&fp=1&author=&sc=1&sf=titleonly&sk=t&sd=d&sr=topics&st=0&ch=300&t=0&submit=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA + - path: search.php + inputs: + tracker_search: torrent + keywords: "{{ if .Keywords }}{{ .Keywords }}{{ else }}{{ .Today.Year }}{{ end }}" + terms: all + fp: 1 + author: "" + sc: 1 + sf: titleonly + sr: topics + sk: "{{ .Config.sort }}" + sd: "{{ .Config.type }}" + st: 0 + ch: 300 + t: 0 + submit: Перейти + $raw: "{{ range .Categories }}&fid[]={{.}}{{end}}" + + rows: + selector: table.tablebg > tbody > tr:has(a[href^="./download/file.php?id="]) + + fields: + title: + selector: a.topictitle + details: + selector: a.topictitle + attribute: href + category: + selector: a[href^="./viewtopic.php?f="] + attribute: href + filters: + - name: querystring + args: f + download: + selector: a[href^="./download/file.php?id="] + attribute: href + size: + selector: span[title="Размер"] > b + filters: + - name: replace + args: ["ТБ", "TB"] + - name: replace + args: ["ГБ", "GB"] + - name: replace + args: ["МБ", "MB"] + - name: replace + args: ["КБ", "KB"] + seeders: + selector: span.seed + leechers: + selector: span.leech + grabs: + selector: span.complet + date: + # (09.03.2020) + selector: a.topictitle + optional: true + default: now + # do not append TZ else text {{if}} will not work if date not found + filters: + - name: regexp + args: (\d{2}\.\d{2}\.\d{4}) + - name: dateparse + args: "dd.MM.yyyy" + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# phpBB diff --git a/config/prowlarr/Definitions/party-tracker.yml b/config/prowlarr/Definitions/party-tracker.yml new file mode 100644 index 0000000..fbd0ea7 --- /dev/null +++ b/config/prowlarr/Definitions/party-tracker.yml @@ -0,0 +1,173 @@ +--- +id: party-tracker +name: Party-Tracker +description: "Party-Tracker is a HUNGARIAN private tracker for MOVIES / TV / GENERAL" +language: hu-HU +type: private +encoding: ISO-8859-2 +links: + - https://party-tracker.info/ + +caps: + categorymappings: + - {id: 47, cat: Console/XBox, desc: "Játék/Xbox"} + - {id: 46, cat: Console/PS3, desc: "Játék/Ps2"} + - {id: 45, cat: PC/Games, desc: "Játék/Pc"} + - {id: 44, cat: Movies/SD, desc: "Cam/hun"} + - {id: 69, cat: Movies/SD, desc: "Cam/eng"} + - {id: 43, cat: Movies/SD, desc: "Film/Hun/XviD"} + - {id: 42, cat: Movies/SD, desc: "Film/Eng/XviD"} + - {id: 41, cat: Movies/DVD, desc: "Film/Hun/DVD"} + - {id: 40, cat: Movies/DVD, desc: "Film/Eng/DVD"} + - {id: 39, cat: Books/EBook, desc: "E-book"} + - {id: 38, cat: TV/HD, desc: "HD/Hun"} + - {id: 57, cat: TV/SD, desc: "Sorozat/Eng"} + - {id: 66, cat: TV/HD, desc: "HD/Eng"} + - {id: 50, cat: PC/Mobile-Other, desc: "Mobil"} + - {id: 51, cat: PC/0day, desc: "Programok"} + - {id: 52, cat: TV/SD, desc: "Sorozat/Hun"} + - {id: 53, cat: XXX/x264, desc: "XXX/Film"} + - {id: 54, cat: XXX/ImageSet, desc: "XXX/Kép"} + - {id: 48, cat: Other, desc: "Képek"} + - {id: 49, cat: TV/Anime, desc: "Mese"} + - {id: 55, cat: Audio, desc: "Zene/Eng"} + - {id: 56, cat: Audio, desc: "Zene/Hun"} + - {id: 65, cat: Audio/Audiobook, desc: "Hangoskönyv"} + - {id: 67, cat: Audio/Video, desc: "Klipp"} + - {id: 68, cat: Books/EBook, desc: "Ebook/eng"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search FreeLeech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: added + 5: size + 7: seeders + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrent oldalanként: setting to 100 on your account profile. + +login: + method: post + path: takelogin.php + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: table.main:contains("Hiba") + test: + path: index.php + selector: a[href^="logout.php?url="] + +search: + paths: + - path: letoltes.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # title, descr, actor, tag + ker: 0 + # 0 active, 1 active+idead, 2 dead, 3 free, 4 x2, 6 my torrents + incldead: "{{ if .Config.freeleech }}3{{ else }}1{{ end }}" + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + # does not support imdbid searches + + keywordsfilters: + # replace spaces between words with percent wildcard + - name: re_replace + args: ["\\W+", "%"] + + rows: + selector: table.main > tbody > tr:has(a[href^="letoltes.php?tipus="]) + + fields: + category: + selector: a[href^="letoltes.php?tipus="] + attribute: href + filters: + - name: querystring + args: tipus + title: + selector: a[href^="details.php?id="] + attribute: title + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: span[onmouseover] + attribute: onmouseover + filters: + - name: regexp + args: src=([^\s]+) + genre: + selector: a[href^="/letoltes.php?cimke="] + description: + case: + img[src="/fajlok/kepek/yes.svg"]: "Verified: {{ .Result.genre }}" + "*": "Unverified: {{ .Result.genre }}" + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + date: + selector: td:nth-child(5) + remove: font + filters: + - name: replace + args: ["\xA0", ""] + - name: append + args: " +01:00" # CET + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + size: + selector: td:nth-child(6) + grabs: + selector: td:nth-child(7) + seeders: + selector: td:nth-child(8) + leechers: + selector: td:nth-child(9) + downloadvolumefactor: + case: + img[src="fajlok/kepek/free.gif"]: 0 + "*": 1 + uploadvolumefactor: + case: + img[src="fajlok/kepek/x2.gif"]: 2 + "*": 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# engine n/a diff --git a/config/prowlarr/Definitions/pctorrent.yml b/config/prowlarr/Definitions/pctorrent.yml new file mode 100644 index 0000000..7c3ece4 --- /dev/null +++ b/config/prowlarr/Definitions/pctorrent.yml @@ -0,0 +1,63 @@ +--- +id: pctorrent +name: PC-torrent +description: "PC-torrent is a RUSSIAN Public Torrent Tracker for Games" +language: ru-RU +type: public +encoding: windows-1251 +links: + - https://pc-torrents.games/ +legacylinks: + - https://pc-torrent.org/ + - https://pc-torrent.pro/ + +caps: + categorymappings: + - {id: 1, cat: PC/Games, desc: "Games"} + + modes: + search: [q] + +settings: [] + +download: + selectors: + - selector: a[href*="/engine/download.php?id="] + attribute: href + +search: + paths: + - path: "{{ if .Keywords }}?do=search&subaction=search&search_start=0&full_search=1&result_from=1&story={{ .Keywords }}{{ else }}{{ end }}" + + rows: + selector: div.dshort:has(div.d3-raz):not(:has(div.d3-raz:contains("Анонс!"))) # no size means indirect download via 3rd party site, not supported by cardigann. #8020 + filters: + - name: andmatch # issue #8019 + + fields: + category: + text: 1 + title: + selector: div.d3-title + details: + selector: a + attribute: href + download: + selector: a + attribute: href + poster: + selector: img + attribute: src + date: + text: now + size: + selector: div.d3-raz + seeders: + text: 1 + leechers: + text: 1 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# DataLife diff --git a/config/prowlarr/Definitions/peeratiko.yml b/config/prowlarr/Definitions/peeratiko.yml new file mode 100644 index 0000000..cdfb1d0 --- /dev/null +++ b/config/prowlarr/Definitions/peeratiko.yml @@ -0,0 +1,208 @@ +--- +id: peeratiko +name: Peeratiko +description: "Peeratiko is a GREEK Private Torrent Tracker for MOVIES / TV / GENERAL" +language: el-GR +type: private +encoding: UTF-8 +links: + - https://peeratiko.org/ + +caps: + categorymappings: + - {id: 58, cat: PC, desc: "Applications Linux"} + - {id: 4, cat: PC/Mac, desc: "Applications Mac"} + - {id: 54, cat: PC/Mobile-Other, desc: "Applications Mobiles"} + - {id: 2, cat: PC, desc: "Applications Other"} + - {id: 3, cat: PC/0day, desc: "Applications Windows"} + - {id: 39, cat: Books/EBook, desc: "Books Books"} + - {id: 56, cat: Books/Comics, desc: "Books Comics"} + - {id: 47, cat: Books/Mags, desc: "Books Magazines"} + - {id: 57, cat: PC/Mobile-Other, desc: "Games Mobiles"} + - {id: 5, cat: Console/Other, desc: "Games Other"} + - {id: 8, cat: Console/PS3, desc: "Games PSP/PS2/PS3"} + - {id: 6, cat: PC/Games, desc: "Games Windows"} + - {id: 7, cat: Console/XBox, desc: "Games XBOX"} + - {id: 60, cat: Movies/3D, desc: "Movies 3D"} + - {id: 1, cat: Movies, desc: "Movies Anime/Cartoons"} + - {id: 9, cat: Movies/BluRay, desc: "Movies BluRay x264"} + - {id: 62, cat: Movies/DVD, desc: "Movies DVD-R"} + - {id: 15, cat: Movies/WEB-DL, desc: "DVD/BD/BR-rip x264"} + - {id: 16, cat: Movies/WEB-DL, desc: "Movies Gr. Subs DVD/BD/BR-rip"} + - {id: 18, cat: Movies, desc: "Movies Gr. Subs Embeddeed"} + - {id: 19, cat: Movies/Other, desc: "Movies Gr. Subs Other"} + - {id: 17, cat: Movies/DVD, desc: "Movies Greek DVD-R"} + - {id: 21, cat: Movies/WEB-DL, desc: "Movies Greek DVD/BD/BR-rip"} + - {id: 22, cat: Movies/Other, desc: "Movies Greek Other"} + - {id: 10, cat: Movies/HD, desc: "Movies HD Packs"} + - {id: 64, cat: Movies/UHD, desc: "Movies 4K"} + - {id: 13, cat: Movies/Other, desc: "Movies Other"} + - {id: 14, cat: Movies, desc: "Movies Packs"} + - {id: 23, cat: Audio, desc: "Music DJs Stuff"} + - {id: 26, cat: Audio, desc: "Music English/Discographies"} + - {id: 24, cat: Audio, desc: "Music English/Foreign"} + - {id: 25, cat: Audio/Lossless, desc: "Music English/Foreign FLAC"} + - {id: 27, cat: Audio, desc: "Music Greek"} + - {id: 28, cat: Audio/Lossless, desc: "Music Greek FLAC"} + - {id: 29, cat: Audio, desc: "Music Greek/Discographies"} + - {id: 36, cat: Audio/Video, desc: "Music Video Clips"} + - {id: 61, cat: Other, desc: "Other Packs"} + - {id: 40, cat: Other/Misc, desc: "Other Misc"} + - {id: 59, cat: Other, desc: "Other Pictures"} + - {id: 11, cat: TV/Documentary, desc: "TV Documentaries"} + - {id: 12, cat: TV/HD, desc: "TV HD Series"} + - {id: 63, cat: TV/HD, desc: "TV HD Series Packs"} + - {id: 53, cat: TV/Other, desc: "TV Other"} + - {id: 31, cat: TV, desc: "TV Series Gr. Subs"} + - {id: 32, cat: TV, desc: "TV Series Gr. Subs Embedded"} + - {id: 33, cat: TV, desc: "TV Series Gr. Subs Packs"} + - {id: 34, cat: TV, desc: "TV Series Greek"} + - {id: 35, cat: TV, desc: "TV Series Greek Packs"} + - {id: 30, cat: TV/Sport, desc: "TV Sports"} + - {id: 65, cat: TV/UHD, desc: "TV Series 4K"} + - {id: 66, cat: TV/UHD, desc: "TV Series Pack 4K"} + + modes: + search: [q] + tv-search: [q, season, ep, genre] + movie-search: [q, genre] + music-search: [q, genre] + book-search: [q, genre] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page setting to 100 on your Personal Options from the Personal Settings menu on the Peeratiko webpage. + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + use_ssl: 1 + keeplogged: 1 + error: + - selector: h2 + message: + selector: table tr td.text + test: + path: index.php + selector: a[href^="/logout.php?auth="] + +search: + paths: + # https://peeratiko.org/browse.php?cats2[]=39&cats5[]=28&cats5[]=29&cats5[]=36&search=&searchin=title&incldead=1 + - path: browse.php + inputs: + # note: site uses the catsX[]=nn method which cardigann does not support. + search: "{{ if .Query.Genre }}{{ .Query.Genre }} {{ else }}{{ end }}{{ .Keywords }}" + # title, descr, filelist, genre, tags, all + searchin: "{{ if .Query.Genre }}all{{ else }}title{{ end }}" + # 0 active, 1 incldead, 2 onlydead + incldead: 1 + only_free: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + # does not support searching imdbid and does not return imdb links + + rows: + selector: table[width="90%"] tbody tr:has(a[href^="download.php?torrent="]) + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + attribute: onmouseover + filters: + - name: regexp + args: ">(.+?)<" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?torrent="] + attribute: href + genre: + selector: strong > i + description: + case: + img[src="/pic/mod.gif"]: "verified: {{ .Result.genre }}" + "*": "Unverified: {{ .Result.genre }}" + poster: + selector: a[href^="details.php?id="] + attribute: onmouseover + filters: + - name: regexp + args: "src=..(https.+).. width" + files: + selector: td:nth-last-child(8) + date_day: + # Today
08:10 AM + # Yesterday
06:44 PM + selector: td:nth-last-child(6):contains("day") + # auto adjusted by site account profile + optional: true + date_year: + # Dec 4 2021
10:20 AM + selector: td:nth-last-child(6):not(:contains("day")) + # auto adjusted by site account profile + optional: true + filters: + - name: dateparse + args: "MMM d yyyy hh:mm tt" + date: + text: "{{ if or .Result.date_day .Result.date_year }}{{ or .Result.date_day .Result.date_year }}{{ else }}now{{ end }}" + size: + selector: td:nth-last-child(5) + grabs: + selector: td:nth-last-child(4) + seeders: + selector: td:nth-last-child(3) + leechers: + selector: td:nth-last-child(2) + downloadvolumefactor: + case: + "b:contains(\"[FREE]\")": 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 7 day (as seconds = 7 x 24 x 60 x 60) + text: 604800 +# U-232 V3 diff --git a/config/prowlarr/Definitions/peersfm.yml b/config/prowlarr/Definitions/peersfm.yml new file mode 100644 index 0000000..99dd780 --- /dev/null +++ b/config/prowlarr/Definitions/peersfm.yml @@ -0,0 +1,161 @@ +--- +id: peersfm +name: Peers.FM +description: "Peers.FM is a RUSSIAN Private Torrent Tracker for MOVIES / TV / GENERAL" +language: ru-RU +type: private +encoding: windows-1251 +links: + - https://peers.fm/ + +caps: + categorymappings: + - {id: 18, cat: TV/Anime, desc: "Anime"} + - {id: 17, cat: PC, desc: "Database"} + - {id: 25, cat: TV, desc: "EDU"} + - {id: 14, cat: Movies/HD, desc: "HD Видео"} + - {id: 7, cat: Other, desc: "Images"} + - {id: 15, cat: PC/Mac, desc: "Mac"} + - {id: 26, cat: PC/Mobile-Other, desc: "Mobile"} + - {id: 24, cat: TV, desc: "TV Show"} + - {id: 1, cat: PC, desc: "WaReZ"} + - {id: 10, cat: XXX, desc: "XXX"} + - {id: 9, cat: Audio/Audiobook, desc: "Аудиокниги"} + - {id: 3, cat: PC/Games, desc: "Игры/GameZ"} + - {id: 2, cat: Audio/Video, desc: "Клипы/Концерты"} + - {id: 8, cat: Books/Mags, desc: "Книги/Журналы"} + - {id: 20, cat: Audio/Lossless, desc: "Музыка/Lossless"} + - {id: 11, cat: Audio/MP3, desc: "Музыка/Mp3"} + - {id: 13, cat: TV, desc: "Мультфильмы"} + - {id: 12, cat: Other, desc: "Разное/Miscellaneous"} + - {id: 4, cat: Movies/DVD, desc: "Фильмы DVD"} + - {id: 6, cat: Movies, desc: "Фильмы MPEG4"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + SSL: 1 + error: + - selector: table[width="400"] tr td + test: + path: browse.php + selector: a[href="/logout.php"] + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0=active, 1=incl dead, 2=only dead, 3=FREE + incldead: "{{ if .Config.freeleech }}3{{ else }}1{{ end }}" + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + + rows: + selector: table[width="940px"] > tbody > tr:has(a[href^="details.php?id="]) + + fields: + title: + selector: a[href^="details.php?id="] + details: + selector: a[href^="details.php?id="] + attribute: href + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + download: + selector: a[href^="download.php/"] + attribute: href + grabs: + selector: a[href^="download.php/"] + size: + selector: td:nth-child(6) + date: + selector: td:nth-child(5) + # auto adjusted by site account profile + filters: + # replace month abbreviations + - name: replace + args: ["янв", "Jan"] + - name: replace + args: ["фев", "Feb"] + - name: replace + args: ["мар", "Mar"] + - name: replace + args: ["апр", "Apr"] + - name: replace + args: ["мая", "May"] + - name: replace + args: ["июн", "Jun"] + - name: replace + args: ["июл", "Jul"] + - name: replace + args: ["авг", "Aug"] + - name: replace + args: ["сен", "Sep"] + - name: replace + args: ["окт", "Oct"] + - name: replace + args: ["ноя", "Nov"] + - name: replace + args: ["дек", "Dec"] + - name: dateparse + args: "HH:mm:ssdd MMM yyyy" + seeders: + selector: td:nth-child(8) + leechers: + selector: td:nth-child(9) + downloadvolumefactor: + case: + img[src="pic/free_100.png"]: 0 + img[src="pic/free_75.png"]: 0.25 + img[src="pic/free_50.png"]: 0.5 + img[src="pic/free_25.png"]: 0.75 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 0.5 +# engine n/a diff --git a/config/prowlarr/Definitions/pier720.yml b/config/prowlarr/Definitions/pier720.yml new file mode 100644 index 0000000..06de932 --- /dev/null +++ b/config/prowlarr/Definitions/pier720.yml @@ -0,0 +1,199 @@ +--- +id: pier720 +name: 720pier +description: "720pier is a RUSSIAN Private Torrent Tracker for HD SPORTS" +language: ru-RU +type: private +encoding: UTF-8 +links: + - https://720pier.ru/ +legacylinks: + - http://720pier.ru/ + +caps: + categorymappings: + - {id: 30, cat: TV/Sport, desc: "Sports"} + - {id: 32, cat: TV/Sport, desc: "Basketball"} + - {id: 34, cat: TV/Sport, desc: "Basketball - NBA"} + - {id: 87, cat: TV/Sport, desc: "Basketball - NBA Playoffs"} + - {id: 117, cat: TV/Sport, desc: "Basketball - NBA Playoffs - 2023"} + - {id: 113, cat: TV/Sport, desc: "Basketball - NBA Playoffs - 2022"} + - {id: 111, cat: TV/Sport, desc: "Basketball - NBA Playoffs - 2021"} + - {id: 108, cat: TV/Sport, desc: "Basketball - NBA Playoffs - 2020"} + - {id: 106, cat: TV/Sport, desc: "Basketball - NBA Playoffs - 2019"} + - {id: 103, cat: TV/Sport, desc: "Basketball - NBA Playoffs - 2018"} + - {id: 95, cat: TV/Sport, desc: "Basketball - NBA Playoffs - 2017"} + - {id: 81, cat: TV/Sport, desc: "Basketball - NBA Playoffs - 2016"} + - {id: 58, cat: TV/Sport, desc: "Basketball - NBA Classic Games"} + - {id: 105, cat: TV/Sport, desc: "Basketball - NBA The Finals"} + - {id: 52, cat: TV/Sport, desc: "Basketball - NCAA"} + - {id: 82, cat: TV/Sport, desc: "Basketball - WNBA"} + - {id: 36, cat: TV/Sport, desc: "Basketball - European basketball"} + - {id: 37, cat: TV/Sport, desc: "Basketball - World Championship"} + - {id: 51, cat: TV/Sport, desc: "Basketball - Reviews and highlights"} + - {id: 41, cat: TV/Sport, desc: "Basketball - Other"} + - {id: 38, cat: TV/Sport, desc: "Basketball - Olympic Games"} + - {id: 42, cat: TV/Sport, desc: "Football"} + - {id: 43, cat: TV/Sport, desc: "Football - NFL"} + - {id: 66, cat: TV/Sport, desc: "Football - Super Bowls"} + - {id: 53, cat: TV/Sport, desc: "Football - NCAA"} + - {id: 110, cat: TV/Sport, desc: "Football - USFL"} + - {id: 99, cat: TV/Sport, desc: "Football - CFL"} + - {id: 54, cat: TV/Sport, desc: "Football - Reviews and highlights"} + - {id: 97, cat: TV/Sport, desc: "Football - Documentaries"} + - {id: 44, cat: TV/Sport, desc: "Football - Other"} + - {id: 104, cat: TV/Sport, desc: "Football - XFL"} + - {id: 101, cat: TV/Sport, desc: "Football - AAF"} + - {id: 46, cat: TV/Sport, desc: "Hockey"} + - {id: 48, cat: TV/Sport, desc: "Hockey - NHL"} + - {id: 88, cat: TV/Sport, desc: "Hockey - NHL Playoffs"} + - {id: 118, cat: TV/Sport, desc: "Hockey - NHL Playoffs - 2023"} + - {id: 114, cat: TV/Sport, desc: "Hockey - NHL Playoffs - 2022"} + - {id: 112, cat: TV/Sport, desc: "Hockey - NHL Playoffs - 2021"} + - {id: 102, cat: TV/Sport, desc: "Hockey - NHL Playoffs 2018-2020"} + - {id: 93, cat: TV/Sport, desc: "Hockey - NHL Playoffs - 2017"} + - {id: 80, cat: TV/Sport, desc: "Hockey - NHL Playoffs - 2016"} + - {id: 65, cat: TV/Sport, desc: "Hockey - Stanley Cup Finals"} + - {id: 92, cat: TV/Sport, desc: "Hockey - NCAA"} + - {id: 49, cat: TV/Sport, desc: "Hockey - World Championship"} + - {id: 68, cat: TV/Sport, desc: "Hockey - Documentaries"} + - {id: 64, cat: TV/Sport, desc: "Hockey - Reviews and highlights"} + - {id: 50, cat: TV/Sport, desc: "Hockey - Other"} + - {id: 55, cat: TV/Sport, desc: "Baseball"} + - {id: 71, cat: TV/Sport, desc: "Baseball - MLB"} + - {id: 107, cat: TV/Sport, desc: "Baseball - MLB World Series"} + - {id: 72, cat: TV/Sport, desc: "Baseball - Other"} + - {id: 85, cat: TV/Sport, desc: "Baseball - Reviews, highlights, documentaries"} + - {id: 45, cat: TV/Sport, desc: "Other sports"} + - {id: 79, cat: TV/Sport, desc: "Other sports - Rugby"} + - {id: 78, cat: TV/Sport, desc: "Other sports - Lacrosse"} + - {id: 77, cat: TV/Sport, desc: "Other sports - Cricket"} + - {id: 76, cat: TV/Sport, desc: "Other sports - Volleyball"} + - {id: 75, cat: TV/Sport, desc: "Other sports - Tennis"} + - {id: 74, cat: TV/Sport, desc: "Other sports - Fighting"} + - {id: 94, cat: TV/Sport, desc: "Other sports - Misc"} + - {id: 100, cat: TV/Sport, desc: "Soccer"} + - {id: 98, cat: TV/Sport, desc: "Soccer - FIFA World Cup"} + - {id: 56, cat: TV/Sport, desc: "Sports on tv"} + - {id: 70, cat: TV/Sport, desc: "Sports on tv ESPN Films"} + # not in search_forum drop down + - {id: 73, cat: TV/Sport, desc: "Other sports - Auto, moto racing"} + # left out 39, 60 and 40 since they are not torrent forums + + modes: + search: [q] + tv-search: [q, season, ep] + +settings: + - name: cookie + type: text + label: Cookie + - name: info_cookie + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: useragent + type: text + label: User-Agent + - name: info_useragent + type: info + label: How to get the User-Agent + default: "
  1. From the same place you fetched the cookie,
  2. Find 'user-agent:' in the Request Headers section
  3. Select and Copy the whole user-agent string (everything after 'user-agent: ') and Paste here.
" + - name: sort + type: select + label: Sort requested from site + default: t + options: + t: created + ts: seeders + sz: size + i: title + - name: type + type: select + label: Order requested from site + default: d + options: + d: desc + a: asc + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: / + selector: :has(a[href^="./ucp.php?mode=logout&"]) + +download: + selectors: + - selector: a[href*="/download/torrent?id="] + attribute: href + +search: + headers: + User-Agent: ["{{ .Config.useragent }}"] + paths: + - path: search.php + inputs: + keywords: "{{ if .Keywords }}{{ .Keywords }}{{ else }}{{ .Today.Year }}{{ end }}" + terms: all + author: "" + sc: 1 + sf: firstpost + sr: topics + sk: "{{ .Config.sort }}" + sd: "{{ .Config.type }}" + st: 0 + ch: 300 + t: 0 + submit: Search + + rows: + # drop topics without size as they will not have download links in details page + selector: li.row:has(div.list-inner div[style="float:right;"]) + filters: + - name: andmatch + + fields: + title: + selector: a.topictitle + details: + selector: a.topictitle + attribute: href + category: + selector: a[href^="./viewforum.php?f="] + attribute: href + filters: + - name: querystring + args: f + download: + selector: a.topictitle + attribute: href + size: + selector: div.list-inner div[style="float:right;"] + optional: true + default: 1 GB + seeders: + selector: dd.posts span.my_tt.seed + optional: true + default: 0 + leechers: + selector: dd.posts span.my_tt.leech + optional: true + default: 0 + grabs: + selector: dd.views span.my_tt.complet + optional: true + default: 0 + date: + selector: div.left-box time + downloadvolumefactor: + text: 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 0.8 + minimumseedtime: + # 60 hours (as seconds = 60 x 60 x 60) + text: 216000 +# phpBB diff --git a/config/prowlarr/Definitions/pignetwork.yml b/config/prowlarr/Definitions/pignetwork.yml new file mode 100644 index 0000000..daed11e --- /dev/null +++ b/config/prowlarr/Definitions/pignetwork.yml @@ -0,0 +1,189 @@ +--- +id: pignetwork +name: PigNetwork +description: "PigNetwork (猪猪网) is a CHINESE Private Torrent Tracker for HD MOVIES / TV / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +requestDelay: 2 +links: + - https://piggo.me/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "Movies/电影", default: true} + - {id: 404, cat: TV/Documentary, desc: "Documentaries/纪录片", default: true} + - {id: 405, cat: TV/Anime, desc: "Animations/动漫", default: true} + - {id: 402, cat: TV, desc: "TV Series/电视剧", default: true} + - {id: 403, cat: TV, desc: "TV Shows/综艺", default: true} + - {id: 406, cat: Audio/Video, desc: "MusicVideo/MV", default: true} + - {id: 407, cat: TV/Sport, desc: "Sports/体育", default: true} + - {id: 409, cat: Other, desc: "Misc/其他", default: true} + - {id: 408, cat: Audio, desc: "Music/音乐", default: true} + # kids zone + - {id: 908, cat: TV, desc: "TV Series/剧集", default: false} + - {id: 909, cat: Movies, desc: "Movies/电影", default: false} + - {id: 905, cat: Audio/Video, desc: "MusicVideo/MV", default: false} + - {id: 907, cat: Audio, desc: "Music/音乐", default: false} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: useragent + type: text + label: User-Agent + - name: info_useragent + type: info + label: How to get the User-Agent + default: "
  1. From the same place you fetched the cookie,
  2. Find 'user-agent:' in the Request Headers section
  3. Select and Copy the whole user-agent string (everything after 'user-agent: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + - name: info_date + type: info + label: Date Setting + default: Access your 个人中心 网站设定 (UserCP Website settings) and set 时间显示类型 (Time Display Type) to 发生时间 (Time of Occurence). Elapsed Time is not supported by this indexer and will see zero results. + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: index.php + selector: a[href^="/usercp.php"] + +search: + paths: + - path: torrents.php + categories: [401, 402, 403, 404, 405, 406, 407, 408, 409] + - path: special.php + categories: [905, 907, 908, 909] + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl (4 does not appear to work) + search_area: "{{ if or .Query.IMDBID .Query.DoubanID }}1{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + headers: + User-Agent: ["{{ .Config.useragent }}"] + + rows: + selector: table.torrents > tbody > tr:has(a[href^="details.php?id="]) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: img[data-src] + attribute: data-src + imdbid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="imdb.com/title/tt"] + attribute: href + doubanid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="movie.douban.com/subject/"] + attribute: href + date: + # time added + selector: td.rowfollow:nth-child(4) + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + size: + selector: td.rowfollow:nth-child(5) + seeders: + selector: td.rowfollow:nth-child(6) + leechers: + selector: td.rowfollow:nth-child(7) + grabs: + selector: td.rowfollow:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumseedtime: + # 3 days (as seconds = 3 x 24 x 60 x 60) + text: 259200 + description_verified: + case: + span[title="通过"], span[title="通過"], span[title="Allowed"]: "Verified:" + span[title="未审"], span[title="未審"], span[title="Not reviewed"]: "Unverified:" + span[title="拒绝"], span[title="拒絕"], span[title="Denied"]: "Banned:" + description: + selector: td.rowfollow:nth-child(2) + remove: a, b, font, img, span + filters: + - name: prepend + args: "{{ .Result.description_verified }} " +# NexusPHP v1.8.0 2023-04-16 diff --git a/config/prowlarr/Definitions/pixelcove.yml b/config/prowlarr/Definitions/pixelcove.yml new file mode 100644 index 0000000..16a340a --- /dev/null +++ b/config/prowlarr/Definitions/pixelcove.yml @@ -0,0 +1,196 @@ +--- +id: pixelcove +name: PixelCove +description: "PixelCove (Ultimate Gamer) is a Private Torrent Tracker for GAMES" +language: en-US +type: private +encoding: UTF-8 +links: + - https://www.pixelcove.me/ + +caps: + categorymappings: + # Computer + - {id: 10, cat: PC/Games, desc: "Windows"} + - {id: 11, cat: PC/Mac, desc: "Macintosh"} + - {id: 47, cat: PC, desc: "Linux"} + - {id: 56, cat: PC, desc: "VR"} + # Microsoft + - {id: 14, cat: Console/XBox, desc: "Xbox"} + - {id: 61, cat: Console/XBox 360, desc: "Xbox 360"} + - {id: 62, cat: Console/XBox One, desc: "Xbox One"} + # Sony + - {id: 43, cat: Console/PS3, desc: "Playstation "} + - {id: 63, cat: Console/PS3, desc: "Playstation 2"} + - {id: 64, cat: Console/PS3, desc: "Playstation 3"} + - {id: 67, cat: Console/PS4, desc: "Playstation 4"} + - {id: 12, cat: Console/Other, desc: "PSN"} + # Nintendo + - {id: 57, cat: Console/Other, desc: "Gamecube"} + - {id: 44, cat: Console/Wii, desc: "Wii"} + - {id: 46, cat: Console/Wii, desc: "Wii U"} + - {id: 76, cat: Console/Other, desc: "Switch"} + # Handheld + - {id: 15, cat: Console/NDS, desc: "DS"} + - {id: 68, cat: Console/NDS, desc: "3DS"} + - {id: 69, cat: Console/PSP, desc: "PSP"} + - {id: 70, cat: Console/PS Vita, desc: "PSVita"} + # Mobile + - {id: 65, cat: PC/Mobile-iOS, desc: "iOS"} + - {id: 49, cat: PC/Mobile-Android, desc: "Android"} + - {id: 66, cat: PC/Mobile-Other, desc: "Windows Mobile"} + # Reading + - {id: 53, cat: Books, desc: "Books/Mags"} + - {id: 60, cat: Books, desc: "Comics"} + - {id: 17, cat: Books, desc: "Guides"} + # Media + - {id: 58, cat: Audio/Video, desc: "Gaming Videos"} + - {id: 52, cat: Audio, desc: "OST"} + - {id: 55, cat: Other, desc: "Time for a Break"} + - {id: 81, cat: Audio/Video, desc: "Videos"} + # Various + - {id: 59, cat: Other, desc: "Mods"} + - {id: 54, cat: Other, desc: "Updates/Fixes"} + - {id: 71, cat: PC/0day, desc: "Applications/Tools"} + - {id: 48, cat: Other, desc: "Retro"} + - {id: 72, cat: Other, desc: "Board Games"} + - {id: 75, cat: Other, desc: "Paper Crafting"} + - {id: 77, cat: Other, desc: "Arcade"} + - {id: 78, cat: Other, desc: "Other"} + + modes: + search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: time + options: + time: created + seeders: seeders + size: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: login + method: form + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + cinfo: "2550|1350|24|-60" + keeploggedin: 1 + error: + - selector: div.error + test: + path: torrents.php + selector: a.username + +search: + paths: + # https://www.pixelcove.me/torrents.php?order_by=time&order_way=desc&filter_freeleech=1&searchtext=&action=advanced&title=&sizeall=&sizetype=gb&sizerange=0.01&filelist=&taglist=&autocomplete_toggle=1 + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}" + order_by: "{{ .Config.sort }}" + order_way: "{{ .Config.type }}" + action: advanced + filter_freeleech: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + searchtext: "" + title: "{{ .Keywords }}" + filelist: "" + taglist: "" + + rows: + # exclude redbar torrents + selector: table#torrent_table > tbody > tr[class^="torrent row"]:has(a[href*="action=download"]) + + fields: + download: + selector: a[href^="torrents.php?action=download&id="] + attribute: href + description_tags: + selector: div.tags + description: + case: + span.icon_okay: "Verified: {{ .Result.description_tags }}" + "*": "Unverified: {{ .Result.description_tags }}" + title: + selector: a[href^="/torrents.php?id="] + category: + selector: a[href*="filter_cat"] + attribute: href + filters: + - name: regexp + args: "\\[(\\d+?)\\]" + details: + selector: a[href^="/torrents.php?id="] + attribute: href + poster: + selector: td:nth-child(2) > script + filters: + - name: regexp + args: "src=\\\\\"(.*?)\\\\\"" + - name: re_replace + args: ["\\\\(.)", "$1"] + - name: replace + args: ["/static/common/noartwork/noimage.png", ""] + files: + selector: td:nth-child(3) + date_elapsed: + # Oct 01 2022, 18:41 + selector: td:nth-child(5) > span:not(:contains("ago")) + # auto adjusted by site account profile + optional: true + filters: + - name: dateparse + args: "MMM dd yyyy, HH:mm" + date_added: + # 13 hours ago + selector: td:nth-child(5) > span:contains("ago") + attribute: title + # auto adjusted by site account profile + optional: true + filters: + - name: dateparse + args: "MMM dd yyyy, HH:mm" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td:nth-child(6) + grabs: + selector: td:nth-child(7) + seeders: + selector: td:nth-child(8) + leechers: + selector: td:nth-child(9) + downloadvolumefactor: + case: + img[src$="/freedownload.gif"]: 0 + "*": 1 + uploadvolumefactor: + case: + span.icon[title*="DoubleSeed"]: 2 + "img[alt=\"DoubleSeed\"]": 2 + "*": 1 + minimumratio: + text: 0.5 +# luminance diff --git a/config/prowlarr/Definitions/pixelcove2fa.yml b/config/prowlarr/Definitions/pixelcove2fa.yml new file mode 100644 index 0000000..d229d0b --- /dev/null +++ b/config/prowlarr/Definitions/pixelcove2fa.yml @@ -0,0 +1,190 @@ +--- +id: pixelcove2fa +name: PixelCove2FA +description: "PixelCove2FA (Ultimate Gamer) is a Private Torrent Tracker for GAMES. Cookie Login for 2FA use." +language: en-US +type: private +encoding: UTF-8 +links: + - https://www.pixelcove.me/ + +caps: + categorymappings: + # Computer + - {id: 10, cat: PC/Games, desc: "Windows"} + - {id: 11, cat: PC/Mac, desc: "Macintosh"} + - {id: 47, cat: PC, desc: "Linux"} + - {id: 56, cat: PC, desc: "VR"} + # Microsoft + - {id: 14, cat: Console/XBox, desc: "Xbox"} + - {id: 61, cat: Console/XBox 360, desc: "Xbox 360"} + - {id: 62, cat: Console/XBox One, desc: "Xbox One"} + # Sony + - {id: 43, cat: Console/PS3, desc: "Playstation "} + - {id: 63, cat: Console/PS3, desc: "Playstation 2"} + - {id: 64, cat: Console/PS3, desc: "Playstation 3"} + - {id: 67, cat: Console/PS4, desc: "Playstation 4"} + - {id: 12, cat: Console/Other, desc: "PSN"} + # Nintendo + - {id: 57, cat: Console/Other, desc: "Gamecube"} + - {id: 44, cat: Console/Wii, desc: "Wii"} + - {id: 46, cat: Console/Wii, desc: "Wii U"} + - {id: 76, cat: Console/Other, desc: "Switch"} + # Handheld + - {id: 15, cat: Console/NDS, desc: "DS"} + - {id: 68, cat: Console/NDS, desc: "3DS"} + - {id: 69, cat: Console/PSP, desc: "PSP"} + - {id: 70, cat: Console/PS Vita, desc: "PSVita"} + # Mobile + - {id: 65, cat: PC/Mobile-iOS, desc: "iOS"} + - {id: 49, cat: PC/Mobile-Android, desc: "Android"} + - {id: 66, cat: PC/Mobile-Other, desc: "Windows Mobile"} + # Reading + - {id: 53, cat: Books, desc: "Books/Mags"} + - {id: 60, cat: Books, desc: "Comics"} + - {id: 17, cat: Books, desc: "Guides"} + # Media + - {id: 58, cat: Audio/Video, desc: "Gaming Videos"} + - {id: 52, cat: Audio, desc: "OST"} + - {id: 55, cat: Other, desc: "Time for a Break"} + - {id: 81, cat: Audio/Video, desc: "Videos"} + # Various + - {id: 59, cat: Other, desc: "Mods"} + - {id: 54, cat: Other, desc: "Updates/Fixes"} + - {id: 71, cat: PC/0day, desc: "Applications/Tools"} + - {id: 48, cat: Other, desc: "Retro"} + - {id: 72, cat: Other, desc: "Board Games"} + - {id: 75, cat: Other, desc: "Paper Crafting"} + - {id: 77, cat: Other, desc: "Arcade"} + - {id: 78, cat: Other, desc: "Other"} + + modes: + search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info_cookie + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: time + options: + time: created + seeders: seeders + size: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: torrents.php + selector: a.username + +search: + paths: + # https://www.pixelcove.me/torrents.php?order_by=time&order_way=desc&filter_freeleech=1&searchtext=&action=advanced&title=&sizeall=&sizetype=gb&sizerange=0.01&filelist=&taglist=&autocomplete_toggle=1 + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}" + order_by: "{{ .Config.sort }}" + order_way: "{{ .Config.type }}" + action: advanced + filter_freeleech: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + searchtext: "" + title: "{{ .Keywords }}" + filelist: "" + taglist: "" + + rows: + selector: table#torrent_table > tbody > tr[class^="torrent row"]:has(a[href*="action=download"]) + + fields: + download: + selector: a[href^="torrents.php?action=download&id="] + attribute: href + description_tags: + selector: div.tags + description: + case: + span.icon_okay: "Verified: {{ .Result.description_tags }}" + "*": "Unverified: {{ .Result.description_tags }}" + title: + selector: a[href^="/torrents.php?id="] + category: + selector: a[href*="filter_cat"] + attribute: href + filters: + - name: regexp + args: "\\[(\\d+?)\\]" + details: + selector: a[href^="/torrents.php?id="] + attribute: href + poster: + selector: td:nth-child(2) > script + filters: + - name: regexp + args: "src=\\\\\"(.*?)\\\\\"" + - name: re_replace + args: ["\\\\(.)", "$1"] + - name: replace + args: ["/static/common/noartwork/noimage.png", ""] + files: + selector: td:nth-child(3) + date_elapsed: + # Oct 01 2022, 18:41 + selector: td:nth-child(5) > span:not(:contains("ago")) + # auto adjusted by site account profile + optional: true + filters: + - name: dateparse + args: "MMM dd yyyy, HH:mm" + date_added: + # 13 hours ago + selector: td:nth-child(5) > span:contains("ago") + attribute: title + # auto adjusted by site account profile + optional: true + filters: + - name: dateparse + args: "MMM dd yyyy, HH:mm" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td:nth-child(6) + grabs: + selector: td:nth-child(7) + seeders: + selector: td:nth-child(8) + leechers: + selector: td:nth-child(9) + downloadvolumefactor: + case: + img[src$="/freedownload.gif"]: 0 + "*": 1 + uploadvolumefactor: + case: + span.icon[title*="DoubleSeed"]: 2 + "img[alt=\"DoubleSeed\"]": 2 + "*": 1 + minimumratio: + text: 0.5 +# luminance diff --git a/config/prowlarr/Definitions/polishsource.yml b/config/prowlarr/Definitions/polishsource.yml new file mode 100644 index 0000000..023f77c --- /dev/null +++ b/config/prowlarr/Definitions/polishsource.yml @@ -0,0 +1,178 @@ +--- +id: polishsource +name: PolishSource +description: "PolishSource (PS) is a POLISH Private Torrent Tracker for MOVIES / TV / GENERAL" +language: pl-PL +type: private +encoding: ISO-8859-2 +requestDelay: 3 +links: + - https://polishsource.cz/ + - https://plsrc.cz/ + +caps: + categorymappings: + - {id: 12, cat: Movies/SD, desc: "Movies/SD"} + - {id: 11, cat: Movies/HD, desc: "Movies/HD"} + - {id: 46, cat: Movies/UHD, desc: "Movies/UHD"} + - {id: 10, cat: TV/SD, desc: "TV/SD"} + - {id: 39, cat: TV/HD, desc: "TV/HD"} + - {id: 47, cat: TV/UHD, desc: "TV/UHD"} + - {id: 8, cat: PC/Games, desc: "Games/PC"} + - {id: 3, cat: Console, desc: "Games/Consoles"} + - {id: 5, cat: Books, desc: "E-Books"} + - {id: 42, cat: Audio, desc: "Music"} + - {id: 18, cat: PC/0day, desc: "Apps"} + - {id: 13, cat: XXX, desc: "XXX"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, genre] + movie-search: [q, imdbid, genre] + music-search: [q, genre] + book-search: [q, genre] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: multilang + type: checkbox + label: Replace MULTI by another language in release name + default: false + - name: multilanguage + type: select + label: Replace MULTI by this language + default: POLISH + options: + POLISH: POLISH + MULTI.POLISH: MULTI.POLISH + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[src="img.php"] + input: vImageCodP + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: td.embedded:has(h2:contains("nieudane")) + - selector: td.embedded:has(h2:contains("failed")) + - selector: td.embedded:has(h2:contains("Error")) + test: + path: browse.php + selector: a[href^="logout.php"] + +search: + paths: + # https://polishsource.cz/browse.php?search=tt1598778&incldead=1&scene=0&pl=0&sub=&search_in=nfo + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" # for dashboard imdbid search + # 0 onlyactive, 1 all, 2 onlydead + incldead: 1 + # 0 all, 1 scene, 2 notscene, 3 internal + scene: 0 + # 0 all, 1 Polish, 2 non-Polish, 4 subtitled + pl: 0 + # genre blank=all + sub: "{{ .Query.Genre }}" + # title, both, nfo + search_in: "{{ if .Query.IMDBID }}nfo{{ else }}title{{ end }}" + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + + rows: + selector: table#restable > tbody > tr:has(a[href^="details.php?id="]) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_phase1: + selector: a[href^="details.php?id="] + title_multilang: + selector: a[href^="details.php?id="] + filters: + - name: re_replace + args: ["(?i)\\b(MULTI(?!.*(?:POLISH|ENGLISH|\\bPL\\b)))\\b", "{{ .Config.multilanguage }}"] + - name: re_replace + args: ["(?i)\\b(pl)\\b", "POLISH"] + title: + text: "{{ if .Config.multilang }}{{ .Result.title_multilang }}{{ else }}{{ .Result.title_phase1 }}{{ end }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="downloadssl.php?id="] + attribute: href + genre: + selector: td:nth-child(2) > small + filters: + - name: replace + args: [" ", ", "] + _language: + optional: true + selector: img[src="pic/pl.png"] + filters: + - name: append + args: "Language: Polish\n
" + _subbed: + optional: true + selector: img[src="pic/napisy.png"] + filters: + - name: append + args: "Subbed\n
" + description: + text: "Genre: {{ .Result.genre }}\n
{{ .Result._language }}{{ .Result._subbed }}" + imdbid: + selector: a[href*="imdb.com/title/tt"] + date: + selector: td:nth-child(4) + # auto adjusted by site account profile + filters: + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss" + size: + selector: td:nth-child(5) + grabs: + selector: td:nth-child(6) + seeders: + selector: td:nth-child(7) + leechers: + selector: td:nth-child(8) + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# engine n/a diff --git a/config/prowlarr/Definitions/polishtracker-api.yml b/config/prowlarr/Definitions/polishtracker-api.yml new file mode 100644 index 0000000..6d1ce13 --- /dev/null +++ b/config/prowlarr/Definitions/polishtracker-api.yml @@ -0,0 +1,145 @@ +--- +id: polishtracker-api +name: PolishTracker (API) +description: "PolishTracker is a POLISH Private site for 0DAY / MOVIES / GENERAL" +language: pl-PL +type: private +encoding: UTF-8 +links: + - https://pte.nu/ +legacylinks: + - https://polishtracker.net/ + +caps: + categorymappings: + - {id: 1, cat: PC/0day, desc: "0-Day"} + - {id: 2, cat: Audio/Video, desc: "Music Video"} + - {id: 3, cat: PC/0day, desc: "Apps"} + - {id: 4, cat: Console, desc: "Consoles"} + - {id: 5, cat: Books, desc: "E-book"} + - {id: 6, cat: Movies/HD, desc: "Movies HD"} + - {id: 7, cat: Movies/SD, desc: "Movies SD"} + - {id: 8, cat: Audio, desc: "Music"} + - {id: 9, cat: Movies/UHD, desc: "Movies UHD"} + - {id: 10, cat: PC/Games, desc: "PC Games"} + - {id: 11, cat: TV/HD, desc: "TV HD"} + - {id: 12, cat: TV/SD, desc: "TV SD"} + - {id: 13, cat: XXX, desc: "XXX"} + - {id: 14, cat: TV/UHD, desc: "TV-UHD"} + - {id: 15, cat: Audio/Audiobook, desc: "Audiobook"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find your API Key by accessing your PolishTracker account Settings page and clicking on the API section." + - name: multilang + type: checkbox + label: Replace MULTi by another language in release name + default: false + - name: multilanguage + type: select + label: Replace MULTi by this language + default: POLISH + options: + POLISH: POLISH + MULTi.POLISH: MULTi.POLISH + +# login: +# path: "https://api-test.pte.nu/api/v1/torrents" +# method: get +# inputs: +# tpage: 1 +# error: +# - selector: ":root:contains(\"ACCESS_DENIED\")" +# message: +# text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # docs: https://cdn.pte.nu/docs/index.html + - path: "https://api-test.pte.nu/api/v1/torrents" + response: + type: json + + inputs: + search: "{{ .Keywords }}" + tpage: 1 + imdb_id: "{{ .Query.IMDBIDShort }}" + # search in nfo text also - broken + # nfo: false + # search is more broad - broken + # wide: false + $raw: "{{ range .Categories }}&cat[]={{.}}{{end}}" + # can search by genre but need range support. &tags[]=Action&tags[]=Comedy for Action and Comedy + + headers: + API-Key: ["{{ .Config.apikey }}"] + + rows: + selector: torrents + filters: + - name: andmatch + count: + selector: count + + fields: + _id: + selector: id + category: + selector: category + title_phase1: + selector: name + title_multilang: + selector: name + filters: + - name: re_replace + args: ["(?i)\\b(MULTI(?!.*(?:POLISH|ENGLISH|\\bPL\\b)))\\b", "{{ .Config.multilanguage }}"] + - name: re_replace + args: ["(?i)\\b(pl)\\b", "POLISH"] + title: + text: "{{ if .Config.multilang }}{{ .Result.title_multilang }}{{ else }}{{ .Result.title_phase1 }}{{ end }}" + details: + text: "{{ .Config.sitelink }}torrents/{{ .Result._id }}" + download: + text: "/download/{{ .Result._id }}" + imdbid: + selector: imdb_id + genre: + selector: tags + filters: + - name: validate + args: "Animation, Comedy, Family, Strategy, Action, Adventure, Indie, RPG, Simulation, Early, Crime, Thriller, Drama, Rock, Fantasy, Sci-Fi, Horror, Pop, War, Mystery, Oldies, Hardcore, Sport, Biography, Music, Rap, Romance, Dance, Hip-Hop, House, Punk Rock, Disco, Casual, Bass, History, Racing, Metal, Electronic, Alternative, Funk, Short, Classical, Acoustic, Soundtrack, Punk, Ambient, Talk-Show, Sports, Reggae, Documentary, Progressive Rock, Other, Western, Dance Hall, Trance, Folk, Classic Rock, Jazz, Hard Rock, Trip-Hop, R&B, Blues, Musical, Club, Techno, Cabaret, Black Metal, Easy Listening, Goa, Free, Massively, Reality-TV, Grunge, SynthPop, Ballad, Top 40, News, Industrial, Psychedelic Rock, Heavy Metal, Beat, Alternative Rock, Drum & Bass, Film-Noir, Rock & Roll, Death Metal, Lo-Fi, Country, Instrumental Pop, Game-Show, Soul, Retro, Noise, Latin, Design, Education, Software, Utilities, Pop-Folk, Instrumental, Game, Acid Jazz, Acid, Gothic Rock, Fusion, Darkwave, Meditative, Crossover, Thrash Metal, New Wave, Opera, Ethnic, Instrumental Rock, New Age, Gangsta, Speech, Gothic, Gospel, Symphonic Rock, Ska, JPop, Avantgarde, Tango, Vocal, Folk-Rock, Celtic" + description: + text: "{{ .Result.genre }}" + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: completed + date: + # 2022-08-09T17:37:03.23587+02:00 + selector: added + size: + selector: size + downloadvolumefactor: + text: 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 3 day (as seconds = 3 x 24 x 60 x 60) + text: 259200 +# json api diff --git a/config/prowlarr/Definitions/pornbay.yml b/config/prowlarr/Definitions/pornbay.yml new file mode 100644 index 0000000..4a4c020 --- /dev/null +++ b/config/prowlarr/Definitions/pornbay.yml @@ -0,0 +1,157 @@ +--- +id: pornbay +name: Pornbay +description: "Pornbay is a Private Torrent Tracker for 3X" +language: en-US +type: private +encoding: UTF-8 +links: + - https://pornbay.org/ + +caps: + categorymappings: + - {id: 1, cat: XXX, desc: "Amateur"} + - {id: 2, cat: XXX, desc: "Anal"} + - {id: 3, cat: XXX, desc: "Asian"} + - {id: 4, cat: XXX, desc: "BBW"} + - {id: 31, cat: XXX, desc: "BDSM"} + - {id: 5, cat: XXX, desc: "Black"} + - {id: 6, cat: XXX, desc: "Blowjob"} + - {id: 7, cat: XXX, desc: "Busty"} + - {id: 32, cat: XXX, desc: "Classic"} + - {id: 8, cat: XXX, desc: "Clips"} + - {id: 9, cat: XXX, desc: "Creampie"} + - {id: 10, cat: XXX, desc: "DVD-R"} + - {id: 11, cat: XXX, desc: "Feature"} + - {id: 12, cat: XXX, desc: "Fetish"} + - {id: 13, cat: XXX, desc: "Foreign"} + - {id: 14, cat: XXX, desc: "Game"} + - {id: 16, cat: XXX, desc: "Gonzo"} + - {id: 17, cat: XXX, desc: "Hardcore"} + - {id: 18, cat: XXX, desc: "HD Quality"} + - {id: 19, cat: XXX, desc: "Hentai"} + - {id: 30, cat: XXX, desc: "Homemade"} + - {id: 20, cat: XXX, desc: "Interracial"} + - {id: 21, cat: XXX, desc: "Latin"} + - {id: 22, cat: XXX, desc: "Lesbian"} + - {id: 23, cat: XXX, desc: "Mature"} + - {id: 47, cat: XXX, desc: "Megapack"} + - {id: 49, cat: XXX, desc: "Old+Young"} + - {id: 24, cat: XXX, desc: "Orgy"} + - {id: 25, cat: XXX, desc: "Other"} + - {id: 26, cat: XXX, desc: "Pics"} + - {id: 50, cat: XXX, desc: "POV"} + - {id: 27, cat: XXX, desc: "Sick"} + - {id: 35, cat: XXX, desc: "Site rips"} + - {id: 48, cat: XXX, desc: "Solo"} + - {id: 28, cat: XXX, desc: "Straight"} + - {id: 29, cat: XXX, desc: "Teen"} + - {id: 51, cat: XXX, desc: "VR Porn"} + - {id: 33, cat: XXX, desc: "Transsexual"} + + modes: + search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: info_grid + type: info + label: GRID view + default: This indexer does not support the GRID view on the torrent search page. Change the Grid View setting to OFF on your User Settings. If set to ON will cause no results to be returned. + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page setting to 100 on your User Settings. The default is 25. + +login: + path: login.php + method: form + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + keeplogged: 1 + error: + - selector: form#loginform > span.warning + test: + path: torrents.php + selector: "#nav_useredit" + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}" + searchtext: "" + title: "{{ .Keywords }}" + order_by: time + order_way: desc + action: advanced + filter_freeleech: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + filelist: "" + taglist: "" + + rows: + # exclude redbar torrents + selector: table#torrent_table > tbody > tr[class^="torrent row"] + + fields: + download: + selector: a[href^="torrents.php?action=download&id="] + attribute: href + description: + selector: div.tags + title: + selector: a[href^="torrents.php?id="] + category: + selector: a[href*="filter_cat"] + attribute: href + filters: + - name: regexp + args: "\\[(\\d+?)\\]" + details: + selector: a[href^="torrents.php?id="] + attribute: href + poster: + selector: td:nth-child(2) > script + filters: + - name: regexp + args: "src=\\\\\"(.*?)\\\\\"" + - name: re_replace + args: ["\\\\(.)", "$1"] + - name: replace + args: ["/static/common/noartwork/noimage.png", ""] + files: + selector: td:nth-child(3) + date: + selector: td:nth-child(5) > span + attribute: title + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MMM dd yyyy, HH:mm zzz" + size: + selector: td:nth-child(6) + grabs: + selector: td:nth-child(7) + seeders: + selector: td:nth-child(8) + leechers: + selector: td:nth-child(9) + downloadvolumefactor: + case: + span.icon[title*="Freeleech"]: 0 + img[alt="Freeleech"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 +# Gazelle diff --git a/config/prowlarr/Definitions/pornolab.yml b/config/prowlarr/Definitions/pornolab.yml new file mode 100644 index 0000000..a18e33e --- /dev/null +++ b/config/prowlarr/Definitions/pornolab.yml @@ -0,0 +1,252 @@ +--- +id: pornolab +name: PornoLab +description: "PornoLab is a Semi-Private Russian site for 3X" +language: ru-RU +type: semi-private +encoding: windows-1251 +links: + - https://pornolab.net/ + +caps: + categorymappings: + - {id: 1670, cat: XXX, desc: "Эротическое видео / Erotic & Softcore"} + - {id: 1768, cat: XXX, desc: "Эротические фильмы / Erotic Movies"} + - {id: 60, cat: XXX, desc: "Документальные фильмы / Documentary & Reality"} + - {id: 1671, cat: XXX, desc: "Эротические ролики и сайтрипы / Erotic Clips & SiteRips"} + - {id: 1644, cat: XXX, desc: "Нудизм-Натуризм / Nudity"} + + - {id: 1672, cat: XXX, desc: "Зарубежные порнофильмы / Full Length Movies"} + - {id: 1111, cat: XXX/Pack, desc: "Паки полных фильмов / Full Length Movies Packs"} + - {id: 508, cat: XXX, desc: "Классические фильмы / Classic"} + - {id: 555, cat: XXX, desc: "Фильмы с сюжетом / Feature & Vignettes"} + - {id: 1845, cat: XXX, desc: "Гонзо-фильмы 1991-2010 / Gonzo 1991-2010"} + - {id: 1673, cat: XXX, desc: "Гонзо-фильмы 2011-2024 / Gonzo 2011-2024"} + - {id: 1112, cat: XXX, desc: "Фильмы без сюжета 1991-2010 / All Sex & Amateur 1991-2010"} + - {id: 1718, cat: XXX, desc: "Фильмы без сюжета 2011-2024 / All Sex & Amateur 2011-2024"} + - {id: 553, cat: XXX, desc: "Лесбо-фильмы / All Girl & Solo"} + - {id: 1143, cat: XXX, desc: "Этнические фильмы / Ethnic-Themed"} + - {id: 1646, cat: XXX, desc: "Видео для телефонов и КПК / Pocket РС & Phone Video"} + + - {id: 1717, cat: XXX, desc: "Зарубежные фильмы в высоком качестве (DVD&HD) / Full Length Movies High-Quality"} + - {id: 1851, cat: XXX/DVD, desc: "Эротические и Документальные видео (DVD) / Erotic, Documentary & Reality (DVD)"} + - {id: 1713, cat: XXX/DVD, desc: "Фильмы с сюжетом, Классические (DVD) / Feature & Vignetts, Classic (DVD)"} + - {id: 512, cat: XXX/DVD, desc: "Гонзо, Лесбо и Фильмы без сюжета (DVD) / Gonzo, All Girl & Solo, All Sex (DVD)"} + - {id: 1712, cat: XXX, desc: "Эротические и Документальные видео (HD Video) / Erotic, Documentary & Reality (HD Video)"} + - {id: 1775, cat: XXX, desc: "Фильмы с сюжетом, Классические (HD Video) / Feature & Vignettes, Classic (HD Video)"} + - {id: 1450, cat: XXX, desc: "Гонзо, Лесбо и Фильмы без сюжета (HD Video) / Gonzo, All Girl & Solo, All Sex (HD Video)"} + + - {id: 1674, cat: XXX, desc: "Русское порно / Russian Video"} + - {id: 902, cat: XXX, desc: "Русские порнофильмы / Russian Full Length Movies"} + - {id: 1675, cat: XXX/Pack, desc: "Паки русских порнороликов / Russian Clips Packs"} + - {id: 36, cat: XXX, desc: "Сайтрипы с русскими актрисами 1991-2015 / Russian SiteRip's 1991-2015"} + - {id: 1830, cat: XXX, desc: "Сайтрипы с русскими актрисами 1991-2015 (HD Video) / Russian SiteRip's 1991-2015 (HD Video)"} + - {id: 1803, cat: XXX, desc: "Сайтрипы с русскими актрисами 2016-2024 / Russian SiteRip's 2016-2024"} + - {id: 1831, cat: XXX, desc: "Сайтрипы с русскими актрисами 2016-2024 (HD Video) / Russian SiteRip's 2016-2024 (HD Video)"} + - {id: 1741, cat: XXX, desc: "Русские Порноролики Разное / Russian Clips (various)"} + - {id: 1676, cat: XXX, desc: "Русское любительское видео / Russian Amateur Video"} + + - {id: 1677, cat: XXX, desc: "Зарубежные порноролики / Clips"} + - {id: 1780, cat: XXX/Pack, desc: "Паки сайтрипов (HD Video) / SiteRip's Packs (HD Video)"} + - {id: 1110, cat: XXX/Pack, desc: "Паки сайтрипов (SD Video) / SiteRip's Packs (SD Video)"} + - {id: 1678, cat: XXX/Pack, desc: "Паки порнороликов по актрисам / Actresses Clips Packs"} + - {id: 1124, cat: XXX, desc: "Сайтрипы 1991-2010 (HD Video) / SiteRip's 1991-2010 (HD Video)"} + - {id: 1784, cat: XXX, desc: "Сайтрипы 2011-2012 (HD Video) / SiteRip's 2011-2012 (HD Video)"} + - {id: 1769, cat: XXX, desc: "Сайтрипы 2013 (HD Video) / SiteRip's 2013 (HD Video)"} + - {id: 1793, cat: XXX, desc: "Сайтрипы 2014 (HD Video) / SiteRip's 2014 (HD Video)"} + - {id: 1797, cat: XXX, desc: "Сайтрипы 2015 (HD Video) / SiteRip's 2015 (HD Video)"} + - {id: 1804, cat: XXX, desc: "Сайтрипы 2016 (HD Video) / SiteRip's 2016 (HD Video)"} + - {id: 1819, cat: XXX, desc: "Сайтрипы 2017 (HD Video) / SiteRip's 2017 (HD Video)"} + - {id: 1825, cat: XXX, desc: "Сайтрипы 2018 (HD Video) / SiteRip's 2018 (HD Video)"} + - {id: 1836, cat: XXX, desc: "Сайтрипы 2019 (HD Video) / SiteRip's 2019 (HD Video)"} + - {id: 1842, cat: XXX, desc: "Сайтрипы 2020 (HD Video) / SiteRip's 2020 (HD Video)"} + - {id: 1846, cat: XXX, desc: "Сайтрипы 2021 (HD Video) / SiteRip's 2021 (HD Video)"} + - {id: 1857, cat: XXX, desc: "Сайтрипы 2022 (HD Video) / SiteRip's 2022 (HD Video)"} + - {id: 1861, cat: XXX, desc: "Сайтрипы 2023 (HD Video) / SiteRip's 2023 (HD Video)"} + - {id: 1867, cat: XXX, desc: "Сайтрипы 2024 (HD Video) / SiteRip's 2024 (HD Video)"} + - {id: 1451, cat: XXX, desc: "Сайтрипы 1991-2010 / SiteRip's 1991-2010"} + - {id: 1788, cat: XXX, desc: "Сайтрипы 2011-2012 / SiteRip's 2011-2012"} + - {id: 1789, cat: XXX, desc: "Сайтрипы 2013 / SiteRip's 2013"} + - {id: 1792, cat: XXX, desc: "Сайтрипы 2014 / SiteRip's 2014"} + - {id: 1798, cat: XXX, desc: "Сайтрипы 2015 / SiteRip's 2015"} + - {id: 1805, cat: XXX, desc: "Сайтрипы 2016 / SiteRip's 2016"} + - {id: 1820, cat: XXX, desc: "Сайтрипы 2017 / SiteRip's 2017"} + - {id: 1826, cat: XXX, desc: "Сайтрипы 2018 / SiteRip's 2018"} + - {id: 1837, cat: XXX, desc: "Сайтрипы 2019 / SiteRip's 2019"} + - {id: 1843, cat: XXX, desc: "Сайтрипы 2020 / SiteRip's 2020"} + - {id: 1847, cat: XXX, desc: "Сайтрипы 2021 / SiteRip's 2021"} + - {id: 1856, cat: XXX, desc: "Сайтрипы 2022 / SiteRip's 2022"} + - {id: 1862, cat: XXX, desc: "Сайтрипы 2023 / SiteRip's 2023"} + - {id: 1868, cat: XXX, desc: "Сайтрипы 2024 / SiteRip's 2024"} + - {id: 1707, cat: XXX, desc: "Сцены из фильмов / Movie Scenes (кроме SiteRip)"} + - {id: 284, cat: XXX, desc: "Порноролики Разное / Clips (various)"} + - {id: 1853, cat: XXX, desc: "Компиляции и Музыкальные порно клипы / Compilations & Porn Music Video (PMV)"} + - {id: 1823, cat: XXX, desc: "Порноролики в 3D и Virtual Reality (VR) / 3D & Virtual Reality Videos"} + + - {id: 1800, cat: XXX, desc: "Японское и китайское порно / Japanese & Chinese Adult Video (JAV)"} + - {id: 1801, cat: XXX/Pack, desc: "Паки японских фильмов и сайтрипов / Full Length Japanese Movies Packs & SiteRip's Packs"} + - {id: 1719, cat: XXX, desc: "Японские фильмы и сайтрипы (DVD и HD Video) / Japanese Movies & SiteRip's (DVD & HD Video)"} + - {id: 997, cat: XXX, desc: "Японские фильмы и сайтрипы 1991-2014 / Japanese Movies & SiteRip's 1991-2014"} + - {id: 1818, cat: XXX, desc: "Японские фильмы и сайтрипы 2015-2024 / Japanese Movies & SiteRip's 2015-2024"} + - {id: 1849, cat: XXX, desc: "Китайские фильмы и сайтрипы (DVD и HD Video) / Chinese Movies & SiteRip's (DVD & HD Video)"} + + - {id: 1723, cat: XXX, desc: "Фото и журналы / Photos & Magazines"} + - {id: 1726, cat: XXX, desc: "MetArt & MetModels"} + - {id: 883, cat: XXX/ImageSet, desc: "Эротические студии Разное / Erotic Picture Gallery (various)"} + - {id: 1728, cat: XXX/ImageSet, desc: "Любительское фото / Amateur Picture Gallery"} + - {id: 1729, cat: XXX/Pack, desc: "Подборки по актрисам / Actresses Picture Packs"} + - {id: 38, cat: XXX/ImageSet, desc: "Подборки сайтрипов / SiteRip's Picture Packs"} + - {id: 1757, cat: XXX/ImageSet, desc: "Подборки сетов / Picture Sets Packs"} + - {id: 1735, cat: XXX/ImageSet, desc: "Тематическое и нетрадиционное фото / Misc & Special Interest Picture Packs"} + - {id: 1731, cat: XXX/ImageSet, desc: "Журналы / Magazines"} + + - {id: 1745, cat: XXX, desc: "Хентай и Манга, Мультфильмы и Комиксы, Рисунки, Аудио / Hentai & Manga, Cartoons & Comics, Artwork & Audio"} + - {id: 1679, cat: XXX, desc: "Хентай: основной подраздел / Hentai: main subsection"} + - {id: 1740, cat: XXX, desc: "Хентай в высоком качестве (DVD и HD) / Hentai DVD & HD"} + - {id: 1834, cat: XXX, desc: "Хентай: ролики 2D / Hentai: 2D video"} + - {id: 1752, cat: XXX, desc: "Хентай: ролики 3D / Hentai: 3D video"} + - {id: 1760, cat: XXX, desc: "Хентай: Манга / Hentai: Manga"} + - {id: 1781, cat: XXX, desc: "Хентай: Арт и HCG / Hentai: Artwork & HCG"} + - {id: 1711, cat: XXX, desc: "Мультфильмы / Cartoons"} + - {id: 1296, cat: XXX, desc: "Комиксы, рисунки, аудио / Comics, Artwork & Audio"} + - {id: 1863, cat: XXX, desc: "Обсуждение / Discussion"} + + - {id: 1838, cat: XXX, desc: "Игры / Games"} + - {id: 1750, cat: XXX, desc: "Игры: основной подраздел / Games: main subsection"} + - {id: 1756, cat: XXX, desc: "Игры: визуальные новеллы / Games: Visual Novels"} + - {id: 1785, cat: XXX, desc: "Игры: ролевые / Games: role-playing (RPG Maker and WOLF RPG Editor)"} + - {id: 1790, cat: XXX, desc: "Игры и Софт: Анимация / Software: Animation"} + - {id: 1827, cat: XXX, desc: "Игры: В разработке и Демо (основной подраздел) / Games: In Progress and Demo (main subsection)"} + - {id: 1828, cat: XXX, desc: "Игры: В разработке и Демо (ролевые) / Games: In Progress and Demo (role-playing - RPG Maker and WOLF RPG Editor)"} + - {id: 1829, cat: XXX, desc: "Обсуждение игр / Games Discussion"} + + - {id: 11, cat: XXX, desc: "Нетрадиционное порно / Special Interest Movies & Clips"} + - {id: 1715, cat: XXX, desc: "Транссексуалы (DVD и HD) / Transsexual (DVD & HD)"} + - {id: 1680, cat: XXX, desc: "Транссексуалы / Transsexual"} + - {id: 1758, cat: XXX, desc: "Бисексуалы / Bisexual"} + - {id: 1682, cat: XXX, desc: "БДСМ / BDSM"} + - {id: 1733, cat: XXX, desc: "Женское доминирование и страпон / Femdom & Strapon"} + - {id: 1754, cat: XXX, desc: "Подглядывание / Voyeur"} + - {id: 1734, cat: XXX, desc: "Фистинг и дилдо / Fisting & Dildo"} + - {id: 1791, cat: XXX, desc: "Беременные / Pregnant"} + - {id: 509, cat: XXX, desc: "Буккаке / Bukkake"} + - {id: 1859, cat: XXX, desc: "Гэнг-бэнг / GangBang"} + - {id: 1685, cat: XXX, desc: "Мочеиспускание / Peeing"} + - {id: 1762, cat: XXX, desc: "Фетиш / Fetish"} + - {id: 1681, cat: XXX, desc: "Дефекация / Scat"} + + - {id: 1688, cat: XXX, desc: "Гей-порно / Gay Forum"} + - {id: 903, cat: XXX, desc: "Полнометражные гей-фильмы / Full Length Movies (Gay)"} + - {id: 1765, cat: XXX, desc: "Полнометражные азиатские гей-фильмы / Full-length Asian (Gay)"} + - {id: 1767, cat: XXX, desc: "Классические гей-фильмы (до 1990 года) / Classic Gay Films (Pre-1990's)"} + - {id: 1755, cat: XXX, desc: "Гей-фильмы в высоком качестве (DVD и HD) / High-Quality Full Length Movies (Gay DVD & HD)"} + - {id: 1787, cat: XXX, desc: "Азиатские гей-фильмы в высоком качестве (DVD и HD) / High-Quality Full Length Asian Movies (Gay DVD & HD)"} + - {id: 1763, cat: XXX/Pack, desc: "ПАКи гей-роликов и сайтрипов / Clip's & SiteRip's Packs (Gay)"} + - {id: 1777, cat: XXX, desc: "Гей-ролики в высоком качестве (HD Video) / Gay Clips (HD Video)"} + - {id: 1691, cat: XXX, desc: "Ролики, SiteRip'ы и сцены из гей-фильмов / Clips & Movie Scenes (Gay)"} + - {id: 1692, cat: XXX/ImageSet, desc: "Гей-журналы, фото, разное / Magazines, Photo, Rest (Gay)"} + + modes: + search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: stripcyrillic + type: checkbox + label: Strip Cyrillic Letters + default: false + - name: sort + type: select + label: Sort requested from site + default: 1 + options: + 1: created + 10: seeders + 7: size + 2: title + - name: type + type: select + label: Order requested from site + default: 2 + options: + 2: desc + 1: asc + +login: + path: forum/login.php + method: form + form: form[action="login.php"] + captcha: + type: image + selector: img[src*="/captcha/"] + input: input[name^="cap_code_"] + inputs: + input[name="login_username"]: "{{ .Config.username }}" + input[name="login_password"]: "{{ .Config.password }}" + selectors: true + error: + - selector: div:contains("Форум временно отключен") + - selector: h4.warnColor1.tCenter.mrg_16 + test: + path: forum/index.php + selector: div.topmenu a[onclick*=logout] + +search: + paths: + - path: forum/tracker.php + inputs: + $raw: "{{ if .Categories }}{{ range .Categories }}f[]={{.}}&{{end}}{{ else }}f[]=-1{{ end }}" + o: "{{ .Config.sort }}" + s: "{{ .Config.type }}" + nm: "{{ .Keywords }}" + + keywordsfilters: + - name: re_replace + args: ["\\W+", " "] + - name: trim + + rows: + selector: table#tor-tbl > tbody > tr:has(a.tr-dl) + + fields: + category: + selector: a.f + attribute: href + filters: + - name: querystring + args: f + title: + selector: a.tLink + filters: + - name: re_replace + args: ["(\\([\\p{IsCyrillic}\\W]+\\))|(^[\\p{IsCyrillic}\\W\\d]+\\/ )|([\\p{IsCyrillic} \\-]+,+)|([\\p{IsCyrillic}]+)", "{{ if .Config.stripcyrillic }}{{ else }}$1$2$3$4{{ end }}"] + - name: trim + details: + selector: a.tLink + attribute: href + download: + selector: a.tr-dl + attribute: href + size: + selector: td:nth-child(6) u + date: + # unix + selector: td:nth-child(11) u + seeders: + selector: td.seedmed > b + leechers: + selector: td.leechmed > b + grabs: + selector: td:nth-child(9) + downloadvolumefactor: + text: 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 0.31 +# engine n/a diff --git a/config/prowlarr/Definitions/pornotorrent.yml b/config/prowlarr/Definitions/pornotorrent.yml new file mode 100644 index 0000000..9689fde --- /dev/null +++ b/config/prowlarr/Definitions/pornotorrent.yml @@ -0,0 +1,67 @@ +--- +id: pornotorrent +name: PornoTorrent +description: "PornoTorrent is a SPANISH Public Torrent Tracker for 3X" +language: en-US +type: public +encoding: UTF-8 +testlinktorrent: false +links: + - https://www.pornotorrent.eu/ + +caps: + categorymappings: + - {id: XXX, cat: XXX, desc: XXX} + + modes: + search: [q] + +settings: [] + +download: + selectors: + - selector: a.button_link + attribute: href + filters: + - name: replace + args: ["////", "//"] + +search: + paths: + - path: / + inputs: + s: "{{ .Keywords }}" + + rows: + selector: ul.lista-filmes > li + filters: + - name: andmatch + + fields: + category: + text: XXX + title: + selector: a + attribute: title + details: + selector: a + attribute: href + download: + selector: a + attribute: href + poster: + selector: img + attribute: data-lazy-src + date: + text: now + size: + text: "512 MB" + seeders: + text: 1 + leechers: + text: 1 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/portugas-api.yml b/config/prowlarr/Definitions/portugas-api.yml new file mode 100644 index 0000000..42ec2f6 --- /dev/null +++ b/config/prowlarr/Definitions/portugas-api.yml @@ -0,0 +1,178 @@ +--- +id: portugas-api +name: Portugas (API) +description: "Portugas is a Private Portoguese Tracker" +language: pt-PT +type: private +encoding: UTF-8 +links: + - https://portugas.org/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Filmes"} + - {id: 2, cat: TV, desc: "TV"} + - {id: 3, cat: Audio, desc: "Músicas"} + - {id: 4, cat: PC/Games, desc: "Jogos"} + - {id: 5, cat: PC/0day, desc: "Appz"} + - {id: 7, cat: XXX, desc: "XXX"} + - {id: 9, cat: Books, desc: "E-Books"} + - {id: 10, cat: Movies, desc: "Animação Filmes"} + - {id: 11, cat: TV/Anime, desc: "Animação TV"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + music-search: [q] + book-search: [q] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your Portugas account My Security page and clicking on the API Token tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + inputs: {} # TODO: remove in v10 + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: "/api/torrents/filter" + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + # if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6 + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + seasonNumber: "{{ .Query.Season }}" + episodeNumber: "{{ .Query.Ep }}" + imdbId: "{{ .Query.IMDBIDShort }}" + tmdbId: "{{ .Query.TMDBID }}" + tvdbId: "{{ .Query.TVDBID }}" + free: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + + rows: + selector: data + attribute: attributes + + fields: + category: + selector: category_id + _audiopt: + selector: audio_pt + title: + selector: name + filters: + - name: append + args: "{{ if eq .Result._audiopt \"1\" }} Portuguese PT-PT{{ else }}{{ end }}" + details: + selector: details_link + download: + selector: download_link + infohash: + selector: info_hash + poster: + selector: meta.poster + filters: + - name: replace + args: ["https://via.placeholder.com/90x135", ""] + imdbid: + selector: imdb_id + tmdbid: + selector: tmdb_id + tvdbid: + selector: tvdb_id + genre: + selector: meta.genres + filters: + - name: re_replace + args: ["(?i)(Ficção científica)", "Ficção_científica"] + - name: re_replace + args: ["(?i)(Cinema TV)", "Cinema_TV"] + - name: replace + args: [" & ", "_&_"] + description: + text: "{{ .Result.genre }}" + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0%, 25%, 50%, 75%, 100% + selector: freeleech + case: + 0%: 1 # not free + 25%: 0.75 + 50%: 0.5 + 75%: 0.25 + 100%: 0 # freeleech + "*": 0 # catch errors + uploadvolumefactor: + # api returns 0=false, 1=true + selector: double_upload + case: + 0: 1 # normal + 1: 2 # double + minimumratio: + text: 1.1 + minimumseedtime: + # 3 days (as seconds = 3 x 24 x 60 x 60) + text: 259200 +# json UNIT3D 6.3.0 (custom) diff --git a/config/prowlarr/Definitions/postman.yml b/config/prowlarr/Definitions/postman.yml new file mode 100644 index 0000000..0207941 --- /dev/null +++ b/config/prowlarr/Definitions/postman.yml @@ -0,0 +1,127 @@ +--- +id: postman +name: Postman +description: Postman is a Public I2P Torrent Tracker for MOVIES / TV / GENERAL +language: en-US +type: public +encoding: UTF-8 +links: + - http://tracker2.postman.i2p/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Movies"} + - {id: 2, cat: Audio, desc: "Music"} + - {id: 3, cat: TV, desc: "TV"} + - {id: 4, cat: PC/Games, desc: "Games"} + - {id: 5, cat: PC/0day, desc: "Apps"} + - {id: 6, cat: Other/Misc, desc: "Misc."} + - {id: 8, cat: TV, desc: "Pictures"} + - {id: 9, cat: TV/Anime, desc: "Anime"} + - {id: 10, cat: Books/Comics, desc: "Comics"} + - {id: 11, cat: Books, desc: "Books"} + - {id: 17, cat: Audio/Audiobook, desc: "Audio Books"} + - {id: 20, cat: Books/EBook, desc: "E-Books"} + - {id: 21, cat: Other, desc: "Course/Lesson"} + - {id: 22, cat: Other, desc: "Essay/Op-Ed"} + - {id: 23, cat: Other, desc: "Cad/3D Printing"} + - {id: 13, cat: Audio/Video, desc: "Music Vid."} + - {id: 14, cat: XXX, desc: "Pr0n"} + - {id: 15, cat: TV/Documentary, desc: "Documentary"} + - {id: 16, cat: Other, desc: "Leaked Documents"} + - {id: 18, cat: Other, desc: "Conspiracy"} + - {id: 19, cat: Other, desc: "Religious Content"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: sort + type: select + label: Sort requested from site + default: 1 + options: + 1: created + 5: seeders + 7: size + +search: + paths: + - path: / + inputs: + view: Main + search: "{{ .Keywords }}" + category: -1 + orderby: "{{ .Config.sort }}" + lastactive: -1 + lang: -1 + + rows: + selector: table#torrentView tbody tr + + fields: + category: + selector: td.category a + attribute: href + filters: + - name: querystring + args: category + title: + selector: td.torrentname a + attribute: title + details: + selector: td.torrentname a + attribute: href + download: + selector: a[href^="index.php?action=Download&id="] + attribute: href + magnet: + selector: a[href^="magnet:?xt"] + attribute: href + description: + selector: td.torrentname span + imdbid: + text: "{{ .Result.description }}" + filters: + - name: regexp + args: "(https?:\\/\\/www\\.imdb\\.com\\/title\\/tt\\d+)" + tmdbid: + text: "{{ .Result.description }}" + filters: + - name: regexp + args: "(https?:\\/\\/www\\.themoviedb\\.org\\/(movie|tv)\\/.+?)\\n" + date: + selector: td.added + filters: + - name: dateparse + args: "yyyy-MM-dd" + files: + selector: span.filecount + size: + selector: span.size + remove: span + filters: + - name: append + args: B + grabs: + selector: span.badge.downloadcount + seeders: + selector: span.swarm + filters: + - name: split + args: ["/", 0] + leechers: + selector: span.swarm + remove: span + filters: + - name: split + args: ["/", 1] + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# PaTracker 1.7.5 diff --git a/config/prowlarr/Definitions/potuk.yml b/config/prowlarr/Definitions/potuk.yml new file mode 100644 index 0000000..3573432 --- /dev/null +++ b/config/prowlarr/Definitions/potuk.yml @@ -0,0 +1,170 @@ +--- +id: potuk +name: PotUK +description: "PotUK - Private site for MOVIES / TV / GENERAL" +language: en-US +type: private +encoding: UTF-8 +links: + - https://www.potuk.net/ + +caps: + categorymappings: + - {id: 8, cat: Movies, desc: "Movies"} + - {id: 9, cat: Movies/HD, desc: "DVDRip/BRRip/BDRip"} + - {id: 10, cat: Movies/SD, desc: "Screeners/R3/R5/R6/HDRip/Webrip/WEB-DL/Recodes"} + - {id: 11, cat: Movies/DVD, desc: "DVDR"} + - {id: 15, cat: Movies/UHD, desc: "High Definition MKV/MP4"} + - {id: 16, cat: Movies/SD, desc: "Cams TS & TC/PPV/VOD/HDTV *Ratio Free*"} + - {id: 17, cat: Movies/UHD, desc: "4k Ultra High Definition *Ratio Free*"} + - {id: 18, cat: Audio, desc: "Music"} + - {id: 19, cat: Audio/Video, desc: "Music DVD & Videos"} + - {id: 20, cat: Audio, desc: "Hip-Hop/RnB/Soul"} + - {id: 22, cat: Audio, desc: "Rock/Heavy Metal/Alternative"} + - {id: 23, cat: Audio, desc: "Amateur Creations/Live DJ Sets etc/Karaoke"} + - {id: 24, cat: Audio, desc: "Golden Oldies/Easy Listening"} + - {id: 25, cat: Audio, desc: "Pop albums"} + - {id: 26, cat: Audio, desc: "Drum & Bass/Breakbeat/Garage/Hardcore"} + - {id: 27, cat: Audio, desc: "Trance/Dance/House"} + - {id: 28, cat: Audio, desc: "Misc/compilation albums"} + - {id: 29, cat: Audio, desc: "Soundtracks"} + - {id: 32, cat: Audio, desc: "Country/Folk"} + - {id: 33, cat: Audio, desc: "Classical"} + - {id: 34, cat: Audio, desc: "Reggae/dub/ska/2 tone"} + - {id: 35, cat: Audio, desc: "Jazz 'n' Blues"} + - {id: 36, cat: Audio, desc: "Singles"} + - {id: 37, cat: Audio, desc: "Album & Singles Packs"} + - {id: 38, cat: Audio/Lossless, desc: "Lossless Format Albums"} + - {id: 39, cat: PC/Games, desc: "Games"} + - {id: 40, cat: PC/Games, desc: "PC Games"} + - {id: 41, cat: Console/XBox, desc: "X BOX"} + - {id: 42, cat: Console/PS3, desc: "Playstation"} + - {id: 43, cat: Console/Other, desc: "All Other Console Roms & Emulators"} + - {id: 47, cat: PC/Mac, desc: "Mac & Other OS Games"} + - {id: 49, cat: PC/Games, desc: "DVDR Interactive Games & Quizzes"} + - {id: 50, cat: Console/PSP, desc: "SONY PSP"} + - {id: 51, cat: Console/Other, desc: "Nintendo Switch"} + - {id: 52, cat: Console/NDS, desc: "Nintendo DS"} + - {id: 53, cat: PC, desc: "Applications"} + - {id: 55, cat: PC, desc: "Windows Operating Systems & MS Apps"} + - {id: 56, cat: PC, desc: "Artistry"} + - {id: 57, cat: PC, desc: "Internet & Web"} + - {id: 58, cat: PC, desc: "Utilities"} + - {id: 59, cat: PC, desc: "Misc Applications"} + - {id: 60, cat: PC, desc: "Sound & Vision"} + - {id: 63, cat: PC/Mac, desc: "Macintosh Applications"} + - {id: 64, cat: TV, desc: "TV Shows"} + - {id: 66, cat: TV/Sport, desc: "Sport TV"} + - {id: 68, cat: TV, desc: "Sci-Fi / Supernatural / Horror"} + - {id: 69, cat: TV, desc: "Comedy"} + - {id: 70, cat: TV, desc: "Cartoons/Animation"} + - {id: 71, cat: TV, desc: "Drama"} + - {id: 72, cat: TV, desc: "Action/Adventure"} + - {id: 73, cat: TV/Other, desc: "Misc TV"} + - {id: 75, cat: TV/Documentary, desc: "Documentaries"} + - {id: 76, cat: TV/Anime, desc: "Animation"} + - {id: 80, cat: Books, desc: "Comics/Books/eBooks"} + - {id: 83, cat: Audio/Audiobook, desc: "Audio Books"} + - {id: 84, cat: Books/EBook, desc: "E Books"} + - {id: 85, cat: Books/Comics, desc: "Comics/Magazines"} + - {id: 86, cat: Other/Misc, desc: "Misc Torrents"} + - {id: 89, cat: PC/Mobile-Other, desc: "Mobile Phone Stuff"} + - {id: 91, cat: Movies/3D, desc: "Movies 3D"} + - {id: 132, cat: Other, desc: "Practice your uploading skills in here"} + - {id: 140, cat: XXX, desc: "Adult Clips & Amateur"} + - {id: 141, cat: XXX, desc: "Adult Picture Links & Mags"} + - {id: 143, cat: XXX, desc: "Adult Games"} + - {id: 144, cat: XXX, desc: "Adult Retail Movies"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + +login: + path: index.php + method: form + form: form + inputs: + login: "{{ .Config.username }}" + password: "{{ .Config.password }}" + remember: 1 + _xfRedirect: "" + selectorinputs: + _xfToken: + selector: input[name="_xfToken"] + attribute: value + error: + - selector: div.blockMessage--error:contains(" not be found") + - selector: div.blockMessage--error:contains("Incorrect password") + test: + path: index.php + selector: a[href="/index.php?account/preferences"] + +search: + paths: + # supports only single cat search, so defaulting to all + - path: "index.php?torrents/&freeleech={{ if .Config.freeleech }}1{{ else }}{{ end }}&filename={{ .Keywords }}" + # imdb and tmdb not supported + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + + rows: + selector: table.dataList-table > tbody.normal-torrents > tr + + fields: + category: + selector: a[href^="/index.php?forums/"] + attribute: href + filters: + - name: regexp + args: (\d+)/$ + title: + selector: div.structItem-title a + details: + selector: li.structItem-startDate a + attribute: href + download: + selector: a[href^="/index.php?attachments/"] + attribute: href + magnet: + selector: a[href^="magnet:?x"] + attribute: href + description: + selector: a[href^="/index.php?forums/"] + date: + selector: time + attribute: datetime + size: + selector: td:nth-last-child(4) + grabs: + selector: td:nth-last-child(3) + seeders: + selector: td:nth-last-child(2) + leechers: + selector: td:nth-last-child(1) + downloadvolumefactor: + case: + span.label--accent: 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 +# XenForo diff --git a/config/prowlarr/Definitions/proaudiotorrents.yml b/config/prowlarr/Definitions/proaudiotorrents.yml new file mode 100644 index 0000000..fc68b77 --- /dev/null +++ b/config/prowlarr/Definitions/proaudiotorrents.yml @@ -0,0 +1,135 @@ +--- +id: proaudiotorrents +name: ProAudioTorrents +description: "ProAudioTorrents (PAT) is a Private Torrent Tracker for AUDIO SOFTWARE / SAMPLES / TUTORIALS / ETC" +language: en-US +type: private +encoding: UTF-8 +links: + - https://proaudiotorrents.org/ +legacylinks: + - http://proaudiotorrents.org/ + +caps: + categorymappings: + - {id: 24, cat: PC/0day, desc: "DJ Applications"} + - {id: 3, cat: Books/EBook, desc: "Ebooks"} + - {id: 4, cat: PC, desc: "Expansions & Addons"} + - {id: 5, cat: PC, desc: "HYBRID PC/MAC"} + - {id: 26, cat: Other, desc: "Independent"} + - {id: 19, cat: PC, desc: "Linux Plugins"} + - {id: 2, cat: PC/Mac, desc: "Mac Audio Apps"} + - {id: 15, cat: PC/Mac, desc: "Mac Updates"} + - {id: 22, cat: PC/Mac, desc: "Mac VST Fx"} + - {id: 21, cat: PC/Mac, desc: "Mac VST Instrument"} + - {id: 6, cat: Other/Misc, desc: "Misc / Other"} + - {id: 20, cat: TV/Documentary, desc: "Music Documentary"} + - {id: 18, cat: TV/Documentary, desc: "Musical Training"} + - {id: 1, cat: PC/0day, desc: "PC Audio Apps"} + - {id: 14, cat: PC/0day, desc: "PC Updates"} + - {id: 16, cat: Other, desc: "Refills"} + - {id: 7, cat: PC, desc: "RTAS"} + - {id: 8, cat: Audio, desc: "Samples / Libraries"} + - {id: 12, cat: Audio, desc: "SFX"} + - {id: 9, cat: TV/Documentary, desc: "Software Tutorials"} + - {id: 11, cat: PC, desc: "VST Instruments"} + - {id: 13, cat: PC, desc: "VST Plug-ins"} + + modes: + search: [q] + book-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: down + options: + down: desc + up: asc + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: my.php + selector: a[href="/logout.php"] + +search: + paths: + - path: browse.php + inputs: + # does not appear to support multi category searches + cat: 0 + search: "{{ .Keywords }}" + # 0 name, 1 descr, 2 both + searchin: 0 + # note: using incldead=3 causes `Unknown column 'free' in 'where clause'` at web site + # 0 active, 1 incldead, 2 onlydead, 3 freeleech + incldead: 1 + sort: "{{ .Config.sort }}" + d: "{{ .Config.type }}" + + rows: + selector: tr.ttable:has(a[href^="browse.php?cat="]) + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: td:nth-child(2) a + attribute: title + download: + selector: a[href^="download.php/"] + attribute: href + details: + selector: a[href^="details.php?id="] + attribute: href + files: + selector: td:nth-child(3) + size: + selector: td:nth-child(5) + grabs: + selector: td:nth-child(6) + seeders: + selector: td:nth-child(7) + leechers: + selector: td:nth-child(8) + downloadvolumefactor: + text: 1 + uploadvolumefactor: + text: 1 + date: + selector: td:nth-child(2) + remove: a + filters: + - name: replace + args: ["Uploaded ", ""] + - name: timeago + minimumratio: + text: 1.0 + minimumseedtime: + # 1 day (as seconds = 24 x 60 x 60) + text: 86400 +# engine n/a diff --git a/config/prowlarr/Definitions/proporno.yml b/config/prowlarr/Definitions/proporno.yml new file mode 100644 index 0000000..540fdad --- /dev/null +++ b/config/prowlarr/Definitions/proporno.yml @@ -0,0 +1,114 @@ +--- +id: proporno +name: ProPorno +description: "ProPorno is a RUSSIAN Public tracker for 3X" +language: ru-RU +type: public +encoding: UTF-8 +links: + - https://proporno.org/ + +caps: + categorymappings: + - {id: 2, cat: XXX, desc: "порно видео"} + - {id: 4, cat: XXX, desc: "блондинки"} + - {id: 5, cat: XXX, desc: "лесбиянки"} + - {id: 19, cat: XXX, desc: "эротика"} + - {id: 20, cat: XXX, desc: "груповушка"} + - {id: 16, cat: XXX, desc: "анальный секс"} + - {id: 22, cat: XXX, desc: "молодые"} + - {id: 24, cat: XXX, desc: "минет / куннилингус / орал"} + - {id: 25, cat: XXX, desc: "большая грудь"} + - {id: 21, cat: XXX, desc: "любительское видео"} + - {id: 3, cat: XXX, desc: "порно фильмы"} + - {id: 7, cat: XXX, desc: "русское порно"} + - {id: 27, cat: XXX, desc: "убойная эротика"} + - {id: 26, cat: XXX, desc: "онлайн порно"} + + modes: + search: [q] + +settings: [] + +download: + selectors: + - selector: a[href^="magnet:?xt="] + attribute: href + +search: + paths: + # https://proporno.org/index.php?do=search&subaction=search&story=2024&titleonly=3&sortby=date&resorder=desc&showposts=0 + - path: index.php + inputs: + do: search + subaction: search + story: "{{ if .Keywords }}{{ .Keywords }}{{ else }}{{ .Today.Year }}{{ end }}" + # 0 articles, 1 comments, 2 static, 3 titles + titleonly: "{{ if .Keywords }}3{{ else }}0{{ end }}" + sortby: date + resorder: desc + showposts: 0 + $raw: "{{ range .Categories }}catlist[]={{.}}&{{end}}" + + rows: + selector: div.goods-777:has(div.inmy), div.goods-7777:has(div.mini) + after: 1 + + fields: + categorydesc: + selector: div.inmy > a:last-of-type + title: + selector: div.news_text > a + details: + selector: div.news_text > a + attribute: href + download: + selector: div.news_text > a + attribute: href + poster: + selector: img[src*="/uploads/posts/"] + attribute: src + date_today: + # Сегодня, 19:56 + selector: div.mini:contains("Сегодня") + optional: true + filters: + - name: regexp + args: "(Сегодня, \\d{2}:\\d{2})" + - name: replace + args: ["Сегодня", "Today"] + - name: fuzzytime + date_yday: + # Вчера, 20:01 + selector: div.mini:contains("Вчера") + optional: true + filters: + - name: regexp + args: "(Вчера, \\d{2}:\\d{2})" + - name: replace + args: ["Вчера", "Yesterday"] + - name: fuzzytime + date_year: + # 20-09-2020, 19:41 + selector: div.mini:contains("-") + optional: true + filters: + - name: regexp + args: "(\\d{1,2}-\\d{2}-\\d{4}, \\d{2}:\\d{2})" + - name: append + args: " +03:00" # MSK + - name: dateparse + args: "d-MM-yyyy, HH:mm zzz" + date: + text: "{{ if or .Result.date_year .Result.date_today .Result.date_yday }}{{ or .Result.date_year .Result.date_today .Result.date_yday }}{{ else }}now{{ end }}" + size: + text: "1 GB" + seeders: + text: 1 + leechers: + text: 1 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/ptcafe.yml b/config/prowlarr/Definitions/ptcafe.yml new file mode 100644 index 0000000..4009fdc --- /dev/null +++ b/config/prowlarr/Definitions/ptcafe.yml @@ -0,0 +1,182 @@ +--- +id: ptcafe +name: PTCafe +description: "PTCafe (咖啡) is a CHINESE Private Torrent Tracker for MOVIES / TV / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://ptcafe.club/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "电影"} + - {id: 402, cat: TV, desc: "剧集"} + - {id: 403, cat: TV, desc: "综艺"} + - {id: 404, cat: TV/Documentary, desc: "纪录"} + - {id: 405, cat: TV/Anime, desc: "动漫"} + - {id: 406, cat: Audio/Video, desc: "MV"} + - {id: 407, cat: TV/Sport, desc: "体育"} + - {id: 408, cat: Audio, desc: "音乐"} + - {id: 409, cat: Other, desc: "其他"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: 2facode + type: text + label: 2FA code + - name: info_2fa + type: info + label: "About 2FA code" + default: "Only fill in the 2FA code box if you have enabled 2FA on the PTCafe Web Site. Otherwise just leave it empty." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + secret: "" + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + two_step_code: "{{ .Config.2facode }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("失败")) + message: + selector: td.text + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl (not used) + search_area: "{{ if or .Query.IMDBID .Query.DoubanID }}1{{ else }}0{{ end }}" + # 0 AND, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td:nth-child(5) + seeders: + selector: td:nth-child(6) + leechers: + selector: td:nth-child(7) + grabs: + selector: td:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumratio: + text: 0.8 + description: + selector: td:nth-child(2) + remove: a, b, font, img, span +# NexusPHP v1.8.8 2023-09-25 diff --git a/config/prowlarr/Definitions/ptchina.yml b/config/prowlarr/Definitions/ptchina.yml new file mode 100644 index 0000000..f07f765 --- /dev/null +++ b/config/prowlarr/Definitions/ptchina.yml @@ -0,0 +1,196 @@ +--- +id: ptchina +name: PTChina +description: "PTChina (铂金学院) is a CHINESE Private site for MOVIES / TV" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://ptchina.org/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "Movies/电影"} + - {id: 402, cat: TV, desc: "TV Series/电视剧"} + - {id: 404, cat: TV/Documentary, desc: "Documentaries/纪录片"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: 2facode + type: text + label: 2FA code + - name: info_2fa + type: info + label: "About 2FA code" + default: "Only fill in the 2FA code box if you have enabled 2FA on the PTChina Web Site. Otherwise just leave it empty." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + secret: "" + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + two_step_code: "{{ .Config.2facode }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("失败")) + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl (not working) + search_area: "{{ if or .Query.IMDBID .Query.DoubanID }}1{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(a[href^="details.php?id="]) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + # site does not have posters enabled. just in case a future update. + poster: + selector: img[data-src] + attribute: data-src + imdbid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="imdb.com/title/tt"] + attribute: href + doubanid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="movie.douban.com/subject/"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-child(5) + seeders: + selector: td.rowfollow:nth-child(6) + leechers: + selector: td.rowfollow:nth-child(7) + grabs: + selector: td.rowfollow:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 1 day (as seconds = 24 x 60 x 60) + text: 86400 + description_verified: + case: + span[title="通过"], span[title="通過"], span[title="Allowed"]: "Verified:" + span[title="未审"], span[title="未審"], span[title="Not reviewed"]: "Unverified:" + span[title="拒绝"], span[title="拒絕"], span[title="Denied"]: "Banned:" + description: + selector: td.rowfollow:nth-child(2) + remove: a, b, font, img, span + filters: + - name: prepend + args: "{{ .Result.description_verified }} " +# NexusPHP v1.8.9 2023-11-15 diff --git a/config/prowlarr/Definitions/pterclub.yml b/config/prowlarr/Definitions/pterclub.yml new file mode 100644 index 0000000..b67b936 --- /dev/null +++ b/config/prowlarr/Definitions/pterclub.yml @@ -0,0 +1,189 @@ +--- +id: pterclub +name: PTerClub +description: "PTerClub is a CHINESE Private Torrent Tracker for HD MUSIC VIDEOS, MOVIES, TV & ANIME" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://pterclub.com/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "电影 (Movie)"} + - {id: 404, cat: TV, desc: "电视剧 (TV Play)"} + - {id: 403, cat: TV/Anime, desc: "动漫 (Anime)"} + - {id: 405, cat: TV, desc: "综艺 (TV Show)"} + - {id: 413, cat: Audio/Video, desc: "音乐短片 (MV)"} + - {id: 418, cat: Audio/Video, desc: "舞台演出(Stage Performance)"} + - {id: 406, cat: Audio, desc: "音乐 (Music)"} + - {id: 402, cat: TV/Documentary, desc: "纪录片 (Documentary)"} + - {id: 407, cat: TV/Sport, desc: "体育 (Sport)"} + - {id: 408, cat: Books, desc: "电子书 (Ebook)"} + - {id: 409, cat: Console, desc: "游戏 (Game)"} + - {id: 410, cat: PC, desc: "软件 (Software)"} + - {id: 411, cat: Other, desc: "学习 (Study)"} + - {id: 412, cat: Other, desc: "其它 (Other)"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + book-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: useragent + type: text + label: User-Agent + - name: info_useragent + type: info + label: How to get the User-Agent + default: "
  1. From the same place you fetched the cookie,
  2. Find 'user-agent:' in the Request Headers section
  3. Select and Copy the whole user-agent string (everything after 'user-agent: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: index.php?&noredir=1 + selector: a[data-url="logout.php"] + +search: + headers: + User-Agent: ["{{ .Config.useragent }}"] + + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + # currently supports only one query id at one time. + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 3 uploader, 4 imdburl, 5 DoubanID + search_area: "{{ if .Query.IMDBID }}4{{ else }}{{ end }}{{ if .Query.DoubanID }}5{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }}{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="], a[href^="detailsgame.php?"] + title: + selector: a[title][href^="details.php?id="], a[title][href^="detailsgame.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="], a[href^="detailsgame.php?"] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: img[data-src] + attribute: data-src + imdbid: + selector: a[href$="&search_area=4"] + attribute: href + doubanid: + selector: a[href$="&search_area=5"] + attribute: href + # staff have extra columns at the start and end of a row, so we have to float the next lot of selectors off an anchor + _anchor1: + selector: td:has(a[href^="comment.php?"]) + optional: true + date_elapsed: + # time type: time elapsed (default) + selector: "td:has(a[{{ if .Result._anchor1 }}href^=\"comment.php\"{{ else }}href$=\"startcomments\"{{ end }}]) ~ td > span[title]" + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: "td:has(a[{{ if .Result._anchor1 }}href^=\"comment.php\"{{ else }}href$=\"startcomments\"{{ end }}]) ~ td:not(:has(span[title]))" + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: "td:has(a[{{ if .Result._anchor1 }}href^=\"comment.php\"{{ else }}href$=\"startcomments\"{{ end }}]) ~ td ~ td" + seeders: + selector: "td:has(a[{{ if .Result._anchor1 }}href^=\"comment.php\"{{ else }}href$=\"startcomments\"{{ end }}]) ~ td ~ td ~ td" + leechers: + selector: "td:has(a[{{ if .Result._anchor1 }}href^=\"comment.php\"{{ else }}href$=\"startcomments\"{{ end }}]) ~ td ~ td ~ td ~ td" + grabs: + selector: "td:has(a[{{ if .Result._anchor1 }}href^=\"comment.php\"{{ else }}href$=\"startcomments\"{{ end }}]) ~ td ~ td ~ td ~ td ~ td" + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumratio: + text: 0.9 + description: + selector: td:has(table.torrentname) + remove: a, img +# NexusPHP prod#60d2fdc724a 2023-05-10 diff --git a/config/prowlarr/Definitions/ptfiles.yml b/config/prowlarr/Definitions/ptfiles.yml new file mode 100644 index 0000000..09c0468 --- /dev/null +++ b/config/prowlarr/Definitions/ptfiles.yml @@ -0,0 +1,169 @@ +--- +id: ptfiles +name: PTFiles +description: "PTFiles (PTF) is a Private site for TV / MOVIES / GENERAL" +language: en-US +type: private +encoding: windows-1252 +links: + - https://ptfiles.net/ + +caps: + categorymappings: + - {id: 19, cat: Movies/SD, desc: "Movies/XviD"} + - {id: 20, cat: Movies/DVD, desc: "Movies/DVD-R"} + - {id: 60, cat: Movies/SD, desc: "Movies/SD X264"} + - {id: 23, cat: TV/Anime, desc: "Anime"} + - {id: 1, cat: PC/0day, desc: "Apps"} + - {id: 55, cat: Books, desc: "Comics"} + - {id: 5, cat: Movies/HD, desc: "Movies/720p HD"} + - {id: 8, cat: Movies/HD, desc: "Movies/1080p HD"} + - {id: 15, cat: Movies/UHD, desc: "Movies/Ultra-HD"} + - {id: 44, cat: Movies, desc: "Movies/Packs"} + - {id: 69, cat: Books, desc: "E Books"} + - {id: 12, cat: Books, desc: "E Learning"} + - {id: 11, cat: PC/Mac, desc: "Mac OS"} + - {id: 7, cat: TV/SD, desc: "TV/XviD Episodes"} + - {id: 42, cat: TV/SD, desc: "TV/SD X264 Episodes"} + - {id: 33, cat: TV/HD, desc: "TV/HD Episodes"} + - {id: 22, cat: Other, desc: "Misc"} + - {id: 24, cat: PC/Mobile-Other, desc: "Mobile"} + - {id: 6, cat: Audio, desc: "Music"} + - {id: 39, cat: TV, desc: "TV/Seasons"} + - {id: 4, cat: PC/Games, desc: "Games/PC"} + - {id: 29, cat: Console, desc: "Games/Consoles"} + - {id: 9, cat: XXX, desc: "XXX"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: loginproc/ + method: form + form: form#login + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + force_ssl: on + ssl: "" + selectorinputs: + hash: + selector: input[name="hash"] + attribute: value + error: + - selector: p.error:contains(strong) + test: + path: index.php + selector: a[href*="&logout_hash="] + +search: + paths: + # https://ptfiles.net/browse.php?search=tt3612126&incldead=1&title=1 + # https://ptfiles.net/browse.php?free=1&search=&incldead=1&title=0 + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # 0 active, 1 both, 2 dead, 3 needseed + incldead: 0 + # 0 title, 1 descr, 2 both, 3 genre + title: "{{ if .Query.IMDBID }}1{{ else }}0{{ end }}" + free: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + + rows: + # for some users (don't know why) the table is called tablethree instead of tortable + selector: table#tortable > tbody > tr.rowhead, table#tablethree > tbody > tr.rowhead + + fields: + # column 3 will be the wait time for new users + download: + selector: a[href^="dl.php/"] + attribute: href + title: + selector: a.torrentlink + attribute: title + category: + selector: td[onclick*="browse.php?cat="] + attribute: onclick + filters: + - name: querystring + args: cat + - name: trim + args: "'" + details: + selector: a.torrentlink + attribute: href + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + files: + selector: td:nth-last-child(5) + grabs: + selector: td:nth-last-child(3) > span + filters: + - name: regexp + args: ([\d\.]+) + size: + selector: td:nth-last-child(3) + remove: span + seeders: + selector: td:nth-last-child(2) > span > b:nth-child(1) + leechers: + selector: td:nth-last-child(2) > span > b:nth-child(2) + date: + # timeago + selector: td:nth-child(2) > span > span > small + filters: + - name: replace + args: ["Uploaded: ", ""] + downloadvolumefactor: + case: + "span.tool:contains(\"[FREE]\")": 0 + "*": 1 + uploadvolumefactor: + text: 1 + genre: + selector: td:nth-child(2) > span:has(span > small) + remove: span:nth-child(1), span.tool, a[title^="Search all"], br ~ b > small + description: + text: "{{ .Result.genre }}" + minimumratio: + text: 1.0 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# TBDev Custom diff --git a/config/prowlarr/Definitions/pthome.yml b/config/prowlarr/Definitions/pthome.yml new file mode 100644 index 0000000..1e79364 --- /dev/null +++ b/config/prowlarr/Definitions/pthome.yml @@ -0,0 +1,144 @@ +--- +id: pthome +name: PThome +description: "PThome is a CHINESE Private Torrent Tracker for 0DAY / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +followredirect: true +links: + - https://www.pthome.net/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "Movies(电影)"} + - {id: 404, cat: TV/Documentary, desc: "Documentaries(记录片)"} + - {id: 405, cat: TV/Anime, desc: "Animations(动漫)"} + - {id: 402, cat: TV, desc: "TV Series(电视剧)"} + - {id: 403, cat: TV/Other, desc: "TV Shows(综艺)"} + - {id: 406, cat: Audio/Video, desc: "Music Videos(MV)"} + - {id: 407, cat: TV/Sport, desc: "Sports(体育)"} + - {id: 408, cat: Audio/Lossless, desc: "HQ Audio(音乐)"} + - {id: 410, cat: Console, desc: "Games(游戏)"} + - {id: 411, cat: PC, desc: "Software(软件)"} + - {id: 412, cat: Books, desc: "Study(学习)"} + - {id: 409, cat: Other, desc: "Misc(其他)"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + incldead: 0 + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + search_area: "{{ if .Query.IMDBID }}4{{ else }}0{{ end }}" + search_mode: 0 + notnewword: 1 + + rows: + selector: table.torrents tr:has(a[href^="?cat="]) + filters: + - name: andmatch + + fields: + title: + selector: td.torrents-box a + attribute: title + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="details.php?id="] + attribute: href + filters: + - name: replace + args: ["details.php", "download.php"] + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + size: + selector: td:nth-child(5) + grabs: + selector: td:nth-child(8) + seeders: + selector: td:nth-child(6) + leechers: + selector: td:nth-child(7) + date_elapsed: + # time type: time elapsed (default) + selector: td:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + description: + selector: td:nth-child(2) + remove: a, b, font, img, span +# NexusPHP v3.1 2021-07-05 diff --git a/config/prowlarr/Definitions/ptitzmx.yml b/config/prowlarr/Definitions/ptitzmx.yml new file mode 100644 index 0000000..c9dfad1 --- /dev/null +++ b/config/prowlarr/Definitions/ptitzmx.yml @@ -0,0 +1,167 @@ +--- +id: ptitzmx +name: PT分享站 +description: "PT分享站 (itzmx) is a CHINESE Private Torrent Tracker for MOVIES / TV / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://pt.itzmx.com/ + +caps: + categorymappings: + - {id: 405, cat: TV/Anime, desc: "Anime.动画"} + - {id: 404, cat: Books/Comics, desc: "Comics.漫画"} + - {id: 408, cat: Audio, desc: "Music.音乐"} + - {id: 401, cat: Movies, desc: "Movies.电影"} + - {id: 402, cat: TV, desc: "TV.电视剧"} + - {id: 414, cat: Movies/BluRay, desc: "MoviesBluray.蓝光"} + - {id: 410, cat: PC, desc: "Appz.软件"} + - {id: 411, cat: Console, desc: "Games.游戏"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("失败")) + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }} {{ else }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }} {{ else }}{{ end }}{{ .Keywords }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl (does not work) + search_area: "{{ if or .Query.IMDBID .Query.DoubanID }}1{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + attribute: title + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + size: + selector: td:nth-child(5) + seeders: + selector: td:nth-child(6) + leechers: + selector: td:nth-child(7) + grabs: + selector: td:nth-child(8) + date_elapsed: + # time type: time elapsed (default) + selector: td:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumratio: + text: 1.0 + description: + selector: td:nth-child(2) + remove: a, img +# NexusPHP v1.5 2014-04-14 diff --git a/config/prowlarr/Definitions/ptlsp.yml b/config/prowlarr/Definitions/ptlsp.yml new file mode 100644 index 0000000..c9967b4 --- /dev/null +++ b/config/prowlarr/Definitions/ptlsp.yml @@ -0,0 +1,207 @@ +--- +id: ptlsp +name: PTLSP +description: "PTLSP is a CHINESE Private Torrent Tracker for MOVIES / TV / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://www.ptlsp.com/ + +caps: + categorymappings: + - {id: 414, cat: Other, desc: "Ai(人工智能)"} + - {id: 401, cat: Movies, desc: "Movie(电影)"} + - {id: 402, cat: TV, desc: "TV Series(电视剧)"} + - {id: 405, cat: TV/Anime, desc: "Anime(动画)"} + - {id: 411, cat: Audio, desc: "Music(音乐)"} + - {id: 416, cat: Books/Comics, desc: "Comic(漫画)"} + - {id: 406, cat: Audio/Video, desc: "MV(演唱)"} + - {id: 412, cat: PC/0day, desc: "Software(软件)"} + - {id: 413, cat: PC/Games, desc: "Game(游戏)"} + - {id: 403, cat: TV, desc: "TV Shows(综艺)"} + - {id: 404, cat: TV/Documentary, desc: "Documentaries(纪录片)"} + - {id: 407, cat: TV/Sport, desc: "Sports(体育)"} + - {id: 408, cat: Audio, desc: "Audio(音频)"} + - {id: 415, cat: Books/EBook, desc: "E-Booko(电子书/有声书)"} + - {id: 417, cat: Other, desc: "学习资料(Education)"} + - {id: 409, cat: Other, desc: "Misc(其他)"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: 2facode + type: text + label: 2FA code + - name: info_2fa + type: info + label: "About 2FA code" + default: "Only fill in the 2FA code box if you have enabled 2FA on the PTLSP Web Site. Otherwise just leave it empty." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + secret: "" + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + two_step_code: "{{ .Config.2facode }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("失败")) + message: + selector: td.text + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl + search_area: "{{ if .Query.IMDBID }}4{{ else }}{{ end }}{{ if .Query.DoubanID }}1{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }}{{ else }}0{{ end }}" + # 0 AND, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: img[data-src] + attribute: data-src + imdbid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="imdb.com/title/tt"] + attribute: href + doubanid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="movie.douban.com/subject/"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td:nth-child(5) + seeders: + selector: td:nth-child(6) + leechers: + selector: td:nth-child(7) + grabs: + selector: td:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + description_verified: + case: + span[title="通过"], span[title="通過"], span[title="Allowed"]: "Verified:" + span[title="未审"], span[title="未審"], span[title="Not reviewed"]: "Unverified:" + span[title="拒绝"], span[title="拒絕"], span[title="Denied"]: "Banned:" + description: + selector: td:nth-child(2) + remove: a, b, font, img, span + filters: + - name: prepend + args: "{{ .Result.description_verified }} " +# NexusPHP v1.8.8 2023-09-25 diff --git a/config/prowlarr/Definitions/ptsbao.yml b/config/prowlarr/Definitions/ptsbao.yml new file mode 100644 index 0000000..ac40f95 --- /dev/null +++ b/config/prowlarr/Definitions/ptsbao.yml @@ -0,0 +1,162 @@ +--- +id: ptsbao +name: PTSBAO +description: "PTSBAO is a CHINESE Private Torrent Tracker for HD MOVIES / TV" +language: zh-CN +type: private +encoding: UTF-8 +followredirect: true +links: + - https://ptsbao.club/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "Movies(电影)"} + - {id: 402, cat: TV, desc: "TV Series(电视剧)"} + - {id: 403, cat: TV/Other, desc: "TV Shows(电视节目)"} + - {id: 405, cat: TV/Anime, desc: "Animations(动漫)"} + - {id: 414, cat: Audio, desc: "Music(音乐)"} + - {id: 404, cat: TV/Documentary, desc: "Documentaries(记录片)"} + - {id: 423, cat: Movies, desc: "Movies Original(原创)"} + - {id: 409, cat: Other, desc: "Misc(其他)"} + - {id: 424, cat: Other, desc: "Limit(限制)"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl + search_area: "{{ if .Query.IMDBID }}4{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + # does not return imdb link in results + + rows: + selector: table.torrents > tbody > tr:has(a[href^="download.php?id="]) + + fields: + category: + selector: a[href^="torrents.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: table.torrentname td a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: img.tooltip + attribute: src + filters: + - name: replace + args: ["pic/imdb_pic/nophoto.gif", ""] + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-child(5) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-child(5):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-child(6) + seeders: + selector: td.rowfollow:nth-child(7) + leechers: + selector: td.rowfollow:nth-child(8) + grabs: + selector: td.rowfollow:nth-child(9) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 +# NexusPHP custom 22082802 diff --git a/config/prowlarr/Definitions/pttime.yml b/config/prowlarr/Definitions/pttime.yml new file mode 100644 index 0000000..d96b4a0 --- /dev/null +++ b/config/prowlarr/Definitions/pttime.yml @@ -0,0 +1,194 @@ +--- +id: pttime +name: PTTime +description: "PTTime is a ratioless CHINESE Private Torrent Tracker for HD MOVIES / TV / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +requestDelay: 2 +links: + - https://www.pttime.org/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "Movies(电影)", default: true} + - {id: 402, cat: TV, desc: "TV Series(电视剧)", default: true} + - {id: 403, cat: TV, desc: "TV Shows(综艺)", default: true} + - {id: 404, cat: TV/Documentary, desc: "Documentaries(纪录片)", default: true} + - {id: 405, cat: TV/Sport, desc: "Sport(体育、竞技、武术及相关)", default: true} + - {id: 406, cat: PC/Games, desc: "Games(游戏及相关)", default: true} + - {id: 408, cat: Audio, desc: "Music(音乐、专辑、MV、演唱会)", default: true} + - {id: 409, cat: Other, desc: "Art(舞蹈、歌剧、戏曲、相声、评书等)", default: true} + - {id: 411, cat: Other, desc: "Science(科学、知识、技能)", default: true} + - {id: 412, cat: Other, desc: "School(应试、考级、初中以上教育)", default: true} + - {id: 413, cat: Books, desc: "Book(书籍、有声书)", default: true} + - {id: 420, cat: PC, desc: "Code(IT、编程、大数据、人工智能", default: true} + - {id: 430, cat: TV/Anime, desc: "Animate(3D动画、2.5次元)", default: true} + - {id: 431, cat: TV/Anime, desc: "ACGN(二次元)", default: true} + - {id: 432, cat: TV/Other, desc: "Baby(婴幼、早教、小学及相关)", default: true} + - {id: 450, cat: Other, desc: "Resource(资源、素材、模板)", default: true} + - {id: 451, cat: PC, desc: "Software(软件、系统、 程序、APP等)", default: true} + - {id: 490, cat: Other, desc: "Other(其它)", default: true} + - {id: 440, cat: XXX, desc: "9kg-AV(步兵/无码)", default: false} + - {id: 441, cat: XXX, desc: "9kg-Sex(骑兵/有码)", default: false} + - {id: 442, cat: XXX, desc: "9kg-III(三级片、限制级电影)", default: false} + - {id: 443, cat: XXX, desc: "9kg-H动漫", default: false} + - {id: 444, cat: XXX, desc: "9kg-H游戏", default: false} + - {id: 445, cat: XXX, desc: "9kg-H书籍(书籍、有声书)", default: false} + - {id: 446, cat: XXX, desc: "9kg-H写真(图片、私拍、短视频)", default: false} + - {id: 447, cat: XXX, desc: "9kg-H音频(ASMR、音乐、音频)", default: false} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: takelogin.php + method: post + inputs: + loginmethod: username + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + dutime: month + ssl: yes + error: + - selector: td.embedded:has(h2:contains("失败")) + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + categories: [401, 402, 403, 404, 405, 406, 408, 409, 411, 412, 413, 420, 430, 431, 432, 450, 451, 490] + - path: adults.php + categories: [440, 441, 442, 443, 444, 445, 446, 447] + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + # currently supports only one query id at one time. + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 2 smalldesc, 3 uploader, 4 imdburl, 5 doubanurl + search_area: "{{ if .Query.IMDBID }}4{{ else }}{{ end }}{{ if .Query.DoubanID }}5{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }}{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(a[href^="download.php?id="]) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: td.torrentimg > img + attribute: src + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + doubanid: + selector: a[href*="movie.douban.com/subject/"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td:nth-child(5) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td:nth-child(5):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td:nth-child(6) + seeders: + selector: td:nth-child(7) + leechers: + selector: td:nth-child(8) + grabs: + selector: td:nth-child(9) + downloadvolumefactor: + case: + font.promotion.free: 0 + font.promotion.twoupfree: 0 + font.promotion.halfdown: 0.5 + font.promotion.twouphalfdown: 0.5 + font.promotion.thirtypercent: 0.3 + "*": 1 + uploadvolumefactor: + case: + font.promotion.twoup: 2 + font.promotion.twoupfree: 2 + font.promotion.twouphalfdown: 2 + "*": 1 + description: + selector: td:nth-child(2) > font:last-child +# NexusPHP Standard v1.5 Beta 4 diff --git a/config/prowlarr/Definitions/punkshorror.yml b/config/prowlarr/Definitions/punkshorror.yml new file mode 100644 index 0000000..46baf75 --- /dev/null +++ b/config/prowlarr/Definitions/punkshorror.yml @@ -0,0 +1,174 @@ +--- +id: punkshorror +name: Punk's Horror Tracker +description: "Punk's Horror Tracker is a HUNGARIAN Private Tracker for Horror MOVIES / TV" +language: hu-HU +type: private +encoding: ISO-8859-2 +links: + - https://punck-tracker.net/ + +caps: + categorymappings: + - {id: 87, cat: Movies, desc: "Action Eng"} + - {id: 88, cat: Movies, desc: "Action Hun"} + - {id: 79, cat: TV/Documentary, desc: "Dokumentumfilm"} + - {id: 72, cat: Movies/HD, desc: "HD Eng"} + - {id: 71, cat: Movies/HD, desc: "HD Hun"} + - {id: 89, cat: Movies, desc: "Horror Anime"} + - {id: 78, cat: Books, desc: "Horror Ebook"} + - {id: 66, cat: Movies, desc: "Horror Eng"} + - {id: 73, cat: PC/Games, desc: "Horror Game"} + - {id: 65, cat: Movies, desc: "Horror Hun"} + - {id: 82, cat: XXX, desc: "Horror XXX"} + - {id: 94, cat: Movies, desc: "Kamerás filmek"} + - {id: 98, cat: Movies/HD, desc: "MD-HD"} + - {id: 86, cat: Movies, desc: "Mystery-Fantasy Eng"} + - {id: 85, cat: Movies, desc: "Mystery-Fantasy Hun"} + - {id: 83, cat: Movies, desc: "Punk Release"} + - {id: 76, cat: Movies, desc: "Retro Film"} + - {id: 70, cat: Movies, desc: "Scfi Eng"} + - {id: 69, cat: Movies, desc: "Scfi Hun"} + - {id: 75, cat: TV, desc: "Sorozat Eng"} + - {id: 74, cat: TV, desc: "Sorozat Hun"} + - {id: 68, cat: Movies, desc: "Thriller Eng"} + - {id: 67, cat: Movies, desc: "Thriller Hun"} + - {id: 84, cat: Movies/SD, desc: "VHS Ritkaságok"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search FreeLeech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: added + 5: size + 7: seeders + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info + type: info + label: Results Per Page + default: For best results, change the Torrentek száma egy oldalon setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: "td:contains(\"Belépési hiba\")" + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + onlyname: 1 + search: "{{ .Keywords }}" + # 0 active, 1 all, 2 deadonly, 3 freeleech + incldead: "{{ if .Config.freeleech }}3{{ else }}1{{ end }}" + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + # does not support imdbid searches + + rows: + selector: table.alap99 > tbody#linkhatter > tr + filters: + - name: andmatch + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + # can be abbreviated + selector: a[href^="details.php?id="] + title: + # usually full length + selector: a[href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + date: + selector: td:nth-child(2) > b > font + filters: + - name: replace + args: ["\xA0", ""] + - name: replace + args: ["Feltöltve:", ""] + - name: append + args: " +01:00" # CET + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + poster: + selector: a[onmouseover] + attribute: onmouseover + filters: + - name: regexp + args: src=([^\s]+) + size: + selector: td:nth-child(7) + grabs: + selector: td:nth-last-child(4) + seeders: + selector: td:nth-last-child(3) + leechers: + selector: td:nth-last-child(2) + description: + case: + img[src="pic/yes.png"]: Verified + img[src="pic/nincs.png"]: Unverified + downloadvolumefactor: + case: + img[src="pic/golden.gif"]: 0 + "*": 1 + uploadvolumefactor: + selector: td:nth-child(7) > center > b > font + filters: + - name: regexp + args: (\d+) + minimumratio: + text: 0.8 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# engine n/a diff --git a/config/prowlarr/Definitions/puntotorrent.yml b/config/prowlarr/Definitions/puntotorrent.yml new file mode 100644 index 0000000..2cbbb22 --- /dev/null +++ b/config/prowlarr/Definitions/puntotorrent.yml @@ -0,0 +1,356 @@ +--- +id: puntotorrent +name: PuntoTorrent +description: "PuntoTorrent is a SPANISH site for General content" +language: es-ES +type: private +encoding: UTF-8 +links: + - https://xbt.puntotorrent.com/ +legacylinks: + - https://xbt.puntotorrent.ch/ + +caps: + categorymappings: + - {id: 37, cat: TV/Anime, desc: "DVD - Animación"} + - {id: 38, cat: TV/Sport, desc: "DVD - Deportes"} + - {id: 39, cat: TV/Documentary, desc: "DVD - Documentales"} + - {id: 40, cat: Movies/DVD, desc: "DVD - Películas"} + - {id: 41, cat: TV/SD, desc: "DVD - Series"} + - {id: 42, cat: XXX/DVD, desc: "DVD - Adulto (+18)"} + - {id: 43, cat: Audio/Video, desc: "DVD - Música"} + - {id: 45, cat: TV/Anime, desc: "XVID - Animación"} + - {id: 46, cat: TV/Sport, desc: "XVID - Deportes"} + - {id: 47, cat: TV/Documentary, desc: "XVID - Documentales"} + - {id: 48, cat: Movies/SD, desc: "XVID - Películas"} + - {id: 33, cat: Movies/SD, desc: "XVID - Estrenos"} + - {id: 114, cat: Movies/SD, desc: "XVID - Estrenos BajaCalidad"} + - {id: 14, cat: TV/SD, desc: "XVID - Series"} + - {id: 12, cat: XXX/XviD, desc: "XVID - Adulto (+18)"} + - {id: 51, cat: Audio/Video, desc: "XVID - Música"} + - {id: 106, cat: TV/Anime, desc: "HDRip - Animación"} + - {id: 107, cat: TV/Sport, desc: "HDRip - Deportes"} + - {id: 108, cat: TV/Documentary, desc: "HDRip - Documentales"} + - {id: 109, cat: Movies/HD, desc: "HDRip - Películas"} + - {id: 110, cat: TV/HD, desc: "HDRip - Series"} + - {id: 112, cat: XXX/x264, desc: "HDRip - Adulto (+18)"} + - {id: 111, cat: Audio/Video, desc: "HDRip - Música"} + - {id: 53, cat: TV/Anime, desc: "HD - Animación"} + - {id: 54, cat: TV/Sport, desc: "HD - Deportes"} + - {id: 55, cat: TV/Documentary, desc: "HD - Documentales"} + - {id: 56, cat: Movies/HD, desc: "HD - BDrip/BDremux/FullBD"} + - {id: 59, cat: TV/HD, desc: "HD - Series"} + - {id: 63, cat: XXX/x264, desc: "HD - Adulto (+18)"} + - {id: 61, cat: Audio/Video, desc: "HD - Música"} + - {id: 144, cat: TV/Anime, desc: "WEB-DL - Animación"} + - {id: 145, cat: TV/Sport, desc: "WEB-DL - Deportes"} + - {id: 146, cat: TV/Documentary, desc: "WEB-DL - Documentales"} + - {id: 147, cat: Movies/HD, desc: "WEB-DL - Películas"} + - {id: 148, cat: TV/HD, desc: "WEB-DL - Series"} + - {id: 149, cat: XXX/x264, desc: "WEB-DL - Adulto (+18)"} + - {id: 150, cat: Audio/Video, desc: "WEB-DL - Música"} + - {id: 136, cat: TV/Anime, desc: "UHD - Animación"} + - {id: 137, cat: TV/Sport, desc: "UHD - Deportes"} + - {id: 138, cat: TV/Documentary, desc: "UHD - Documentales"} + - {id: 139, cat: Movies/UHD, desc: "UHD - Películas"} + - {id: 140, cat: TV/UHD, desc: "UHD - Series"} + - {id: 141, cat: XXX/x264, desc: "UHD - Adulto (+18)"} + - {id: 126, cat: TV/Anime, desc: "Micro HD - Animación"} + - {id: 127, cat: TV/Sport, desc: "Micro HD - Deportes"} + - {id: 128, cat: TV/Documentary, desc: "Micro HD - Documentales"} + - {id: 57, cat: Movies/HD, desc: "Micro HD - Películas"} + - {id: 124, cat: TV/HD, desc: "Micro HD - Series"} + - {id: 129, cat: XXX/x264, desc: "Micro HD - Adulto"} + - {id: 130, cat: Audio/Video, desc: "Micro HD - Música"} + - {id: 117, cat: TV/Anime, desc: "3D - Animación"} + - {id: 118, cat: TV/Sport, desc: "3D - Deportes"} + - {id: 119, cat: TV/Documentary, desc: "3D - Documentales"} + - {id: 120, cat: Movies/3D, desc: "3D - Películas"} + - {id: 121, cat: XXX, desc: "3D - Adulto (+18)"} + - {id: 122, cat: Audio/Video, desc: "3D - Música"} + - {id: 92, cat: Other, desc: "Otros formatos - Animación"} + - {id: 93, cat: Other, desc: "Otros formatos - Deportes"} + - {id: 94, cat: Other, desc: "Otros formatos - Documentales"} + - {id: 95, cat: Other, desc: "Otros formatos - Películas"} + - {id: 100, cat: Other, desc: "Otros formatos - Estrenos"} + - {id: 97, cat: Other, desc: "Otros formatos - Series"} + - {id: 98, cat: Other, desc: "Otros formatos - Adulto (+18)"} + - {id: 99, cat: Other, desc: "Otros formatos - Música"} + - {id: 69, cat: Audio/MP3, desc: "Música - MP3"} + - {id: 70, cat: Audio/Lossless, desc: "Música - FLAC"} + - {id: 71, cat: Audio/Other, desc: "Música - Otros Formatos"} + - {id: 6, cat: Books/EBook, desc: "eBooks - eBooks"} + - {id: 142, cat: Audio/Audiobook, desc: "eBooks - Audiolibros"} + - {id: 131, cat: Books/Comics, desc: "eBooks - Cómics"} + - {id: 134, cat: Books, desc: "eBooks - Manga"} + - {id: 132, cat: Books/Mags, desc: "eBooks - Revistas"} + - {id: 133, cat: Books, desc: "eBooks - Adulto (+18)"} + - {id: 72, cat: Books/Other, desc: "eBooks - Otros"} + - {id: 25, cat: PC/Games, desc: "Juegos - Microsoft"} + - {id: 26, cat: Console, desc: "Juegos - Sony"} + - {id: 27, cat: PC/Games, desc: "Juegos - PC (Windows)"} + - {id: 28, cat: Console/NDS, desc: "Juegos - Nintendo"} + - {id: 113, cat: Console/Other, desc: "Juegos - Emuladores/Otras P."} + - {id: 74, cat: PC/0day, desc: "Software - Windows"} + - {id: 75, cat: PC, desc: "Software - Linux"} + - {id: 76, cat: PC/Mac, desc: "Software - MAC"} + - {id: 115, cat: PC/Mobile-Android, desc: "Software - Android"} + - {id: 77, cat: PC/Mobile-Other, desc: "Software - Otras Plataformas"} + # hidden but with torrents + - {id: 17, cat: Movies/Other, desc: "VCD/SVCD - SVCD/VCD"} + - {id: 78, cat: Movies/Other, desc: "VCD/SVCD - Estrenos VCD/SVCD"} + - {id: 102, cat: Movies/Other, desc: "XVID - Películas"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 3 + options: + 3: created + 5: seeders + 4: size + 2: title + - name: type + type: select + label: Order requested from site + default: 2 + options: + 2: desc + 1: asc + - name: info + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: index.php?page=login + method: post + inputs: + uid: "{{ .Config.username }}" + pwd: "{{ .Config.password }}" + error: + - selector: .lista>span + test: + path: index.php + selector: form[name="jump1"] + +search: + path: index.php + keywordsfilters: + - name: re_replace + args: ["(?i)S(\\d+)", " $1 "] + - name: re_replace + args: ["(?i)E(\\d+)", " $1 "] + - name: re_replace + args: ["[\\.\\-,_\\[\\]\\(\\)]+", " "] + inputs: + page: torrents + $raw: "&category={{ range .Categories }}{{.}};{{end}}" + # 0 all, 1 onlyactive, 2 onlydead, 3 gold, 4 silver, 5 upx2, 6 upx3 + active: "{{ if .Config.freeleech }}3{{ else }}0{{ end }}" + search: "{{ .Keywords }}" + order: "{{ .Config.sort }}" + by: "{{ .Config.type }}" + + rows: + selector: "#mcol .block-content-l table table.lista > tbody > tr:not(:first-child):not(.descripcion)" + + fields: + category: + selector: td:nth-child(1) a + attribute: href + filters: + - name: querystring + args: category + + _remux: # Remux + selector: td:nth-child(2) a:contains("REMUX"),a:contains("Remux"),a:contains("remux") + optional: true + filters: + - name: re_replace + args: [".", ""] + - name: append + args: "Remux." + + _webdl: # WEBDL + selector: td:nth-child(2) a:contains("WEB"),a:contains("web"),a:contains("Web") + optional: true + filters: + - name: re_replace + args: [".", ""] + - name: append + args: "WEBDL." + + _hdtv: # HDTV + selector: td:nth-child(2) a:contains("HDTV"),a:contains("HDtv"),a:contains("hdtv") + optional: true + filters: + - name: re_replace + args: [".", ""] + - name: append + args: "HDTV." + + _dvd: # DVD + selector: td:nth-child(2) a:contains("DVD"),a:contains("dvd"),a:contains("Dvd") + optional: true + filters: + - name: re_replace + args: [".", ""] + - name: append + args: "DVD.Spanish-PuntoTorrent" + + _bluray: # BluRay + selector: td:nth-child(2) a:not(:contains("HDTV"))a:not(:contains("hdtv"))a:not(:contains("REMUX"))a:not(:contains("Remux"))a:not(:contains("remux"))a:not(:contains("WEB"))a:not(:contains("web"))a:not(:contains("Web"))a:contains("1080"),:contains("2160"):contains("uhd") + optional: true + filters: + - name: re_replace + args: [".", ""] + - name: append + args: "BluRay." + + _2160p: # 2160p + selector: td:nth-child(2) a:contains("2160"),a:contains("4k"),a:contains("4K"),a:contains("uhd"),a:contains("UHD") + optional: true + filters: + - name: re_replace + args: [".", ""] + - name: append + args: "2160p.Spanish-PuntoTorrent" + + _1080p: # 1080p + selector: td:nth-child(2) a:contains("1080"),a:contains("microhd"),a:contains("mhd"),a:contains("BDRemux"):not(:contains("2160")) + optional: true + filters: + - name: re_replace + args: [".", ""] + - name: append + args: "1080p.Spanish-PuntoTorrent" + + _720p: # 720p + selector: td:nth-child(2) a:contains("720") + optional: true + filters: + - name: re_replace + args: [".", ""] + - name: append + args: "720p.Spanish-PuntoTorrent" + + _480p: # 480p + selector: td:nth-child(2) a:contains("480"),a:contains("Xvid"),a:contains("XVID"),a:contains("xvid") + optional: true + filters: + - name: re_replace + args: [".", ""] + - name: append + args: "480p.Spanish-PuntoTorrent" + + title_default: # Clean Title + selector: td:nth-child(2) + optional: true + filters: + - name: re_replace + args: ["(?i)T[\\s-_]?(\\d{1,2})(.*)\\[(\\d{1,2})[x|\\/|\\\\](\\d{1,2})\\]", "S$1E$3 $2"] + - name: re_replace + args: ["(?i)T[\\s-_]?(\\d{1,2})\\b", " S$1 "] + - name: re_replace + args: ["(?i)\\w*Temp\\w*\\b\\s?(\\d{1,2})(ª|\\D)?\\b", " S$1 "] + - name: re_replace + args: ["(?i)(\\d{1,2})(ª|\\D)?\\s?\\w*Temp\\w*\\b", " S$1 "] + - name: re_replace + args: ["(?i)(\\d{1,2})(ª|\\D)?\\s?\\w*Temp\\w*\\b", " S$1 "] + - name: re_replace + args: ["(?i)(\\d{1,2})[x|\\/|\\\\](\\d{1,2})", "S$1E$2"] + - name: re_replace # S02/C01 => S02E01 / S02xC01 => S02E01 / S02C01 => S02E01 + args: ["(?i)S(\\d{1,2})[/x]?C(\\d{1,2})", "S$1E$2"] + - name: re_replace + args: ["(?i)\\[\\.[a-zA-Z.]+\\]", ""] # Delete [.Group] + - name: re_replace + args: [" SILVER:.*", ""] # Delete [SILVER...] + - name: re_replace + args: [" Torrent.*", ""] # Delete [Torrent x2...] + - name: re_replace + args: [" GOLDEN:.*", ""] # Delete [GOLDEN...] + - name: re_replace + args: ["\\W", "."] # Spaces and other characters -> . + - name: re_replace + args: ["\\.+", "."] # More than 1 dot -> . + - name: re_replace + args: ["^\\.", ""] # Delete first dot + - name: append + args: " {{ .Result._remux }}{{ .Result._webdl }}{{ .Result._hdtv }}{{ .Result._dvd }}{{ .Result._bluray }}{{ .Result._2160p }}{{ .Result._1080p }}{{ .Result._720p }}{{ .Result._480p }}" + + title_vose: + selector: td:nth-child(2) a:contains("VOSE") + optional: true + filters: + - name: append + args: " | English" + - name: re_replace + args: ["(?i)T[\\s-_]?(\\d{1,2})(.*)\\[(\\d{1,2})[x|\\/|\\\\](\\d{1,2})\\]", "S$1E$3 $2"] + - name: re_replace + args: ["(?i)T[\\s-_]?(\\d{1,2})\\b", " S$1 "] + - name: re_replace + args: ["(?i)\\w*Temp\\w*\\b\\s?(\\d{1,2})(ª|\\D)?\\b", " S$1 "] + - name: re_replace + args: ["(?i)(\\d{1,2})(ª|\\D)?\\s?\\w*Temp\\w*\\b", " S$1 "] + - name: re_replace + args: ["(?i)(\\d{1,2})[x|\\/|\\\\](\\d{1,2})", "S$1E$2"] + - name: append + args: " {{ .Result._remux }}{{ .Result._webdl }}{{ .Result._hdtv }}{{ .Result._dvd }}{{ .Result._bluray }}{{ .Result._2160p }}{{ .Result._1080p }}{{ .Result._720p }}{{ .Result._480p }}" + + title: + text: "{{ if .Result.title_vose }}{{ .Result.title_vose }}{{ else }}{{ .Result.title_default }}{{ end }}" + + details: + selector: a[href^="download.php"] + attribute: href + filters: + - name: replace + args: ["download.php?", "index.php?page=torrent-details&"] + size: + selector: td:nth-child(6) + seeders: + selector: td:nth-child(8) a + leechers: + selector: td:nth-child(9) a + grabs: + selector: td:nth-child(10) + date: + selector: td:nth-child(5) + filters: + - name: append + args: " +01:00" # CET + - name: dateparse + args: "dd/MM/yyyy zzz" + download: + selector: a[href^="download.php"] + attribute: href + downloadvolumefactor: + case: + img[src$="golden.gif"]: 0 + img[src$="silver.gif"]: 0.5 + "*": 1 + uploadvolumefactor: + case: + img[src$="x2.gif"]: 2 + img[src$="x3.gif"]: 3 + "*": 1 +# xbtit 2.3.0 diff --git a/config/prowlarr/Definitions/pussytorrents.yml b/config/prowlarr/Definitions/pussytorrents.yml new file mode 100644 index 0000000..ee2b7ad --- /dev/null +++ b/config/prowlarr/Definitions/pussytorrents.yml @@ -0,0 +1,102 @@ +--- +id: pussytorrents +name: PussyTorrents +description: "PussyTorrents is a Semi-Private Torrent Tracker for 3X" +language: en-US +type: semi-private +encoding: UTF-8 +links: + - https://pussytorrents.org/ + +caps: + categorymappings: + - {id: 1, cat: XXX, desc: "XXX"} + + modes: + search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeders: seeders + size: size + nameSort: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: user/account/login/ + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + remember_me: on + error: + - selector: div.alert-error + test: + path: / + selector: a[href="/user/account/logout"] + +search: + # https://pussytorrents.org/torrents/browse?query=&page=1&order=desc&orderby=added + paths: + - path: torrents/browse + inputs: + query: "{{ .Keywords }}" + page: 1 + orderby: "{{ .Config.sort }}" + order: "{{ .Config.type }}" + + rows: + selector: table#torrenttable > tbody > tr:has(a[href^="/download/"]) + filters: + - name: andmatch + + fields: + category: + text: 1 + title: + selector: a[href^="/torrent/"] + details: + selector: a[href^="/torrent/"] + attribute: href + download: + selector: a[href^="/download/"] + attribute: href + date: + selector: span.subnote + filters: + - name: replace + args: ["Added on ", ""] + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + size: + selector: td:nth-last-child(5) + grabs: + selector: td:nth-last-child(4) + seeders: + selector: td:nth-last-child(3) + leechers: + selector: td:nth-last-child(2) + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/putao.yml b/config/prowlarr/Definitions/putao.yml new file mode 100644 index 0000000..e2c1759 --- /dev/null +++ b/config/prowlarr/Definitions/putao.yml @@ -0,0 +1,197 @@ +--- +id: putao +name: PuTao +description: "葡萄 (PuTao) is a CHINESE Private Torrent Tracker for MOVIES / TV / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://pt.sjtu.edu.cn/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "Movies CHN 华语电影"} + - {id: 402, cat: Movies, desc: "Movies Eng 欧美电影"} + - {id: 403, cat: Movies, desc: "Movies Asian 亚洲电影"} + - {id: 406, cat: TV/Documentary, desc: "Documentary 纪录片"} + - {id: 407, cat: TV, desc: "TV Series HKTW 港台电视剧"} + - {id: 408, cat: TV, desc: "TV Series Asian 亚洲电视剧"} + - {id: 409, cat: TV, desc: "TV Series CHN 大陆电视剧"} + - {id: 410, cat: TV, desc: "TV Series Eng 欧美电视剧"} + - {id: 411, cat: TV, desc: "TV CHN 大陆综艺节目"} + - {id: 412, cat: TV, desc: "TV HKTW 港台综艺节目"} + - {id: 413, cat: TV, desc: "TV Eng 欧美综艺节目"} + - {id: 414, cat: TV, desc: "TV JPKR 日韩综艺节目"} + - {id: 420, cat: Audio, desc: "Music CHN 华语音乐"} + - {id: 421, cat: Audio, desc: "Music JPKR 日韩音乐"} + - {id: 422, cat: Audio, desc: "Music Eng 欧美音乐"} + - {id: 423, cat: Audio, desc: "Music OST 原声音乐"} + - {id: 425, cat: Audio, desc: "Music Classic 古典音乐"} + - {id: 426, cat: Audio/MP3, desc: "Music mp3合辑"} + - {id: 427, cat: Audio/Video, desc: "Music Videos"} + - {id: 429, cat: Console, desc: "Games 游戏"} + - {id: 431, cat: TV/Anime, desc: "Anime 动漫"} + - {id: 432, cat: TV/Sport, desc: "Sport 体育"} + - {id: 434, cat: PC, desc: "Software 软件"} + - {id: 435, cat: Other, desc: "Study 学习"} + - {id: 440, cat: PC/Mac, desc: "Software Mac"} + - {id: 451, cat: Other, desc: "Campus 校园原创"} + - {id: 450, cat: Other/Misc, desc: "Misc 其他"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the 每页种子数:每页显示(Torrents per page:) setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + checkcode: XxXx + logout: "" + error: + - selector: td.embedded:has(h2:contains("失败")) + test: + path: index.php + selector: a[href^="logout.php?hash="] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + # currently supports only one query id at one time. + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 incldead, 1 onlyactive, 2 onlydead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 30%, 7 70% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 all, 1 popular, 2 classic, 3 recommended, 4 normal, 5 seeds + picktype: 0 + # 0 title, 1 descr, 3 uploader, 4 imdbid + search_area: "{{ if .Query.IMDBID }}4{{ else }}{{ end }}{{ if .Query.DoubanID }}1{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }}{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + # does not return imdb or doubanid in results + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + date_elapsed: + # time elapsed (default) + # 19时
3分 (19 hours 3 minutes) + # 2天
21时 (2 days 21 hours) + selector: td:nth-child(4):not(:contains("-")) + optional: true + filters: + - name: replace + args: ["年", "years"] + - name: replace + args: ["月", "months"] + - name: replace + args: ["天", "days"] + - name: replace + args: ["时", " hours"] + - name: replace + args: ["分", "minutes"] + - name: append + args: " ago" + - name: timeago + date_added: + # time added + selector: td:nth-child(4):contains("-") + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td:nth-child(5) + seeders: + selector: td:nth-child(6) + leechers: + selector: td:nth-child(7) + grabs: + selector: td:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_2up: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_30pctdown: 0.3 + img.pro_70pctdown: 0.7 + "*": 1 + uploadvolumefactor: + case: + img.pro_2up: 2 + img.pro_free2up: 2 + "*": 1 + minimumratio: + text: 0.7 + description: + selector: td:nth-child(2) + remove: a, b, font, img, span +# NexusPHP Standard v1.0 Beta 2 diff --git a/config/prowlarr/Definitions/pwtorrents.yml b/config/prowlarr/Definitions/pwtorrents.yml new file mode 100644 index 0000000..da7b66b --- /dev/null +++ b/config/prowlarr/Definitions/pwtorrents.yml @@ -0,0 +1,151 @@ +--- +id: pwtorrents +name: PWTorrents +description: "PWTorrents (PWT) is a Private Torrent Tracker for PROFESSIONAL WRESTLING" +language: en-US +type: private +encoding: UTF-8 +links: + - https://pwtorrents.net/ +legacylinks: + - http://pwtorrents.net/ + +caps: + categorymappings: + - {id: 26, cat: TV/Sport, desc: "AEW Dark"} + - {id: 21, cat: TV/Sport, desc: "AEW Dynamite"} + - {id: 20, cat: TV/Sport, desc: "AEW PPV"} + - {id: 23, cat: TV/Sport, desc: "AEW Rampage"} + - {id: 28, cat: TV/Sport, desc: "AEW Collision"} + - {id: 1, cat: TV/Sport, desc: "Boxing"} + - {id: 2, cat: TV/Sport, desc: "Documentaries"} + - {id: 3, cat: TV/Sport, desc: "DVD"} + - {id: 4, cat: TV/Sport, desc: "ECW"} + - {id: 13, cat: TV/Sport, desc: "Impact PPV"} + - {id: 14, cat: TV/Sport, desc: "Impact Weekly"} + - {id: 6, cat: TV/Sport, desc: "Indy's"} + - {id: 7, cat: TV/Sport, desc: "Matches"} + - {id: 8, cat: TV/Sport, desc: "Misc."} + - {id: 9, cat: TV/Sport, desc: "MMA"} + - {id: 11, cat: TV/Sport, desc: "Puro"} + - {id: 10, cat: TV/Sport, desc: "PWT Packs"} + - {id: 12, cat: TV/Sport, desc: "Ring Of Honor"} + - {id: 15, cat: TV/Sport, desc: "WCW"} + - {id: 18, cat: TV/Sport, desc: "WWE Network"} + - {id: 16, cat: TV/Sport, desc: "WWE PPV"} + - {id: 24, cat: TV/Sport, desc: "WWE RAW"} + - {id: 25, cat: TV/Sport, desc: "WWE Smackdown"} + - {id: 17, cat: TV/Sport, desc: "WWE Weekly"} + - {id: 27, cat: TV/Sport, desc: "WWE NXT"} + + modes: + search: [q] + tv-search: [q, season, ep] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: seedbox + type: checkbox + label: "Use SeedBox Download Link" + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: table.main:contains("Login failed!") + test: + path: my.php + selector: a[href="logout.php"] + +search: + paths: + # https://pwtorrents.net/browse.php?c18=1&c16=1&c17=1&incldead=0 + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + # 0 active, 1 incldead, 2 onlydead, 3 freeleech + incldead: "{{ if .Config.freeleech }}3{{ else }}1{{ end }}" + search: "{{ .Keywords }}" + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + + rows: + selector: table[border="1"][cellspacing="0"][cellpadding="5"] tr:has(a[href^="download.php?id="]) + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + details: + selector: a[href^="details.php?id="] + attribute: href + download_1: + selector: a[href^="download.php?id="] + attribute: href + download_2: + selector: a[href^="seeddownload.php?id="] + attribute: href + download: + text: "{{ if .Config.seedbox }}{{ .Result.download_2 }}{{ else }}{{ .Result.download_1 }}{{ end }}" + date: + selector: td:nth-child(4) + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + size: + selector: td:nth-child(5) + grabs: + selector: td:nth-child(6) + seeders: + selector: td:nth-child(9) + leechers: + selector: td:nth-child(10) + downloadvolumefactor: + case: + img[src="pic/freeleech.png"]: 0 + "*": 1 + uploadvolumefactor: + case: + img[src="gold.png"]: 2 + img[src="silver.png"]: 1.5 + img[src="bronze.png"]: 1.25 + "*": 1 + minimumratio: + text: 0.7 +# engine n/a diff --git a/config/prowlarr/Definitions/r3vwtf.yml b/config/prowlarr/Definitions/r3vwtf.yml new file mode 100644 index 0000000..e262355 --- /dev/null +++ b/config/prowlarr/Definitions/r3vwtf.yml @@ -0,0 +1,175 @@ +--- +id: r3vwtf +name: R3V WTF! +description: "R3V WTF! is a Private site for MOVIES / TV / GENERAL" +language: en-US +type: private +encoding: UTF-8 +links: + - https://r3vuk.wtf/ + +caps: + categorymappings: + - {id: 1, cat: PC, desc: "Apps"} + - {id: 39, cat: Other, desc: "AutoBoT"} + - {id: 36, cat: Movies/BluRay, desc: "Bluray"} + - {id: 34, cat: Audio/MP3, desc: "Carrow's MP3 Packs"} + - {id: 38, cat: Audio, desc: "DMC Music"} + - {id: 24, cat: Books/EBook, desc: "EBOOK"} + - {id: 37, cat: Audio, desc: "Mastermix Music"} + - {id: 20, cat: Movies/DVD, desc: "Movies/Dvdr"} + - {id: 17, cat: Movies, desc: "Movies/Packs"} + - {id: 26, cat: Movies/HD, desc: "Movies/X264"} + - {id: 44, cat: Movies/HD, desc: "Movies/x265"} + - {id: 10, cat: Movies/SD, desc: "Movies/XviD"} + - {id: 46, cat: Movies/DVD, desc: "Multi DVD"} + - {id: 14, cat: Audio, desc: "Music"} + - {id: 40, cat: Audio/Video, desc: "Music Videos"} + - {id: 22, cat: Audio/Lossless, desc: "Music/Flac"} + - {id: 51, cat: PC/Games, desc: "PC GAMES"} + - {id: 53, cat: Audio, desc: "Promo Music"} + - {id: 23, cat: TV, desc: "Tv/Packs"} + - {id: 16, cat: TV/HD, desc: "Tv/x264"} + - {id: 49, cat: TV/HD, desc: "Tv/X265"} + - {id: 15, cat: TV/SD, desc: "Tv/Xvid"} + - {id: 42, cat: Audio, desc: "VIP MUSIC"} + - {id: 50, cat: XXX, desc: "XXX"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: 2 + options: + 2: desc + 1: asc + - name: info + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + submitme: "X" + error: + - selector: h2 + message: + selector: table tr td.text + test: + path: index.php + selector: a[href*="logout.php?hash_please="] + +search: + paths: + # https://r3vuk.wtf/browse.php?c1=1&c24=1&search=&searchin=title&incldead=0 + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # title descr genre all + searchin: title + # 0 active 1 incldead 2 onlydead + incldead: 1 + # 1 yes 0 no + only_free: "{{ if .Config.freeleech }}1{{ else }}0{{ end }}" + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + + rows: + selector: table[cellpadding="3"] > tbody > tr:has(a[href^="download.php?torrent="]) + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?torrent="] + attribute: href + poster: + selector: a[href^="details.php?id="] + attribute: onmouseover + filters: + - name: regexp + args: "src=\\\\'(.+?)\\\\'" + files: + selector: td:nth-last-child(8) + date_year: + # Jul 4 2019 08:04 AM + selector: td:nth-last-child(6):not(:contains("day")) + optional: true + filters: + - name: append + args: " -07:00" # PDT + - name: dateparse + args: "MMM d yyyy hh:mm tt zzz" + date_day: + # Today 02:40 PM + # Yesterday 09:10 AM + selector: td:nth-last-child(6):contains("day") + optional: true + date: + text: "{{ if or .Result.date_year .Result.date_day }}{{ or .Result.date_year .Result.date_day }}{{ else }}now{{ end }}" + size: + selector: td:nth-last-child(5) + grabs: + selector: td:nth-last-child(4) + seeders: + selector: td:nth-last-child(3) + leechers: + selector: td:nth-last-child(2) + description: + case: + img[src="./pic/mod.gif"]: Verified + "*": Unverified + downloadvolumefactor: + case: + a.info:contains("Freeleech"): 0 + "*": 1 + uploadvolumefactor: + case: + img[src$="pic/doubleseed.gif"]: 0 + "*": 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 1 day (as seconds = 24 x 60 x 60) + text: 86400 +# U-232v3 diff --git a/config/prowlarr/Definitions/racing4everyone-api.yml b/config/prowlarr/Definitions/racing4everyone-api.yml new file mode 100644 index 0000000..3cf07d4 --- /dev/null +++ b/config/prowlarr/Definitions/racing4everyone-api.yml @@ -0,0 +1,181 @@ +--- +id: racing4everyone-api +name: Racing4Everyone (API) +description: "Racing4Everyone (R4E) is a Private Torrent Tracker for RACING" +language: en-US +type: private +encoding: UTF-8 +links: + - https://racing4everyone.eu/ +legacylinks: + - https://racing4everyone.jp/ + +caps: + categorymappings: + - {id: 1, cat: TV/Sport, desc: "BTCC"} + - {id: 2, cat: TV/Sport, desc: "TV-Documentaries"} + - {id: 3, cat: TV/Sport, desc: "DTM"} + - {id: 22, cat: TV/Sport, desc: "Formula 2"} + - {id: 23, cat: TV/Sport, desc: "Formula E"} + - {id: 24, cat: TV/Sport, desc: "Misc"} + - {id: 25, cat: TV/Sport, desc: "Other Bikes"} + - {id: 26, cat: TV/Sport, desc: "MotoGP-2-3-E"} + - {id: 31, cat: TV/Sport, desc: "Nascar"} + - {id: 32, cat: TV/Sport, desc: "Stock Car Brazil"} + - {id: 50, cat: TV/Sport, desc: "WRC"} + - {id: 55, cat: TV/Sport, desc: "Season Reviews"} + - {id: 56, cat: TV/Sport, desc: "WRX"} + - {id: 57, cat: TV/Sport, desc: "WEC"} + - {id: 58, cat: TV/Sport, desc: "W Series"} + - {id: 60, cat: TV/Sport, desc: "Drag Racing"} + - {id: 61, cat: TV/Sport, desc: "ERC"} + - {id: 62, cat: TV/Sport, desc: "Indycar Series"} + - {id: 63, cat: TV/Sport, desc: "Supercars"} + - {id: 66, cat: TV/Sport, desc: "Documentaries"} + - {id: 67, cat: TV/Sport, desc: "Formula 1"} + - {id: 68, cat: TV/Sport, desc: "Formula 3"} + - {id: 69, cat: TV/Sport, desc: "Other Cars"} + - {id: 70, cat: TV/Sport, desc: "Motorsport Movies"} + - {id: 71, cat: TV/Sport, desc: "WSBK"} + - {id: 72, cat: TV/Sport, desc: "AMA Pro Motocross"} + - {id: 73, cat: TV/Sport, desc: "AMA Supercross"} + - {id: 74, cat: TV/Sport, desc: "WTCR"} + - {id: 76, cat: TV/Sport, desc: "ARCA"} + - {id: 77, cat: TV/Sport, desc: "Blancpain GT"} + - {id: 78, cat: TV/Sport, desc: "Porsche Supercup"} + - {id: 79, cat: TV/Sport, desc: "TV Series"} + - {id: 80, cat: TV/Sport, desc: "Touring Cars"} + - {id: 81, cat: TV/Sport, desc: "Extreme E"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your Racing4Everyone account My Security page and clicking on the API Token tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + inputs: {} # TODO: remove in v10 + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: "/api/torrents/filter" + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + # if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6 + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + seasonNumber: "{{ .Query.Season }}" + episodeNumber: "{{ .Query.Ep }}" + imdbId: "{{ .Query.IMDBIDShort }}" + tmdbId: "{{ .Query.TMDBID }}" + tvdbId: "{{ .Query.TVDBID }}" + free: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + + rows: + selector: data + attribute: attributes + + fields: + categorydesc: + selector: category + title: + selector: name + details: + selector: details_link + download: + selector: download_link + poster: + selector: poster + filters: + - name: replace + args: ["https://via.placeholder.com/90x135", ""] + imdbid: + selector: imdb_id + tmdbid: + selector: tmdb_id + tvdbid: + selector: tvdb_id + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0%, 25%, 50%, 75%, 100% + selector: freeleech + case: + 0%: 1 # not free + 25%: 0.75 + 50%: 0.5 + 75%: 0.25 + 100%: 0 # freeleech + "*": 0 # catch errors + uploadvolumefactor: + # api returns 0=false, 1=true + selector: double_upload + case: + 0: 1 # normal + 1: 2 # double + minimumratio: + text: 1.0 +# json UNIT3D 6.0.4 diff --git a/config/prowlarr/Definitions/racingforme.yml b/config/prowlarr/Definitions/racingforme.yml new file mode 100644 index 0000000..566194f --- /dev/null +++ b/config/prowlarr/Definitions/racingforme.yml @@ -0,0 +1,249 @@ +--- +id: racingforme +name: RacingForMe +description: "Racing For Me (RFM) is a Private Torrent Tracker for RACING" +language: en-US +type: private +encoding: UTF-8 +requestDelay: 2 +links: + - https://www.racingfor.me/ + +caps: + categorymappings: + - {id: 1000, cat: TV/Sport, desc: "Formula 1 - Full races"} + - {id: 1010, cat: TV/Sport, desc: "F1 Full Seasons"} + - {id: 1020, cat: TV/Sport, desc: "F1 Full Season 1950-1980"} + - {id: 1030, cat: TV/Sport, desc: "F1 Full Season 1981-1990"} + - {id: 1040, cat: TV/Sport, desc: "F1 Full Season 1991-2000"} + - {id: 1050, cat: TV/Sport, desc: "F1 Full Season 2001-2010"} + - {id: 1060, cat: TV/Sport, desc: "F1 Full Season 2011-2020"} + - {id: 1070, cat: TV/Sport, desc: "F1 Full Season 2011-2020 (HD)"} + - {id: 2000, cat: TV/Sport, desc: "Formula 1 - Highlights"} + - {id: 2010, cat: TV/Sport, desc: "F1 Highlights 1950-1980"} + - {id: 2020, cat: TV/Sport, desc: "F1 Highlights 1981-1990"} + - {id: 2030, cat: TV/Sport, desc: "F1 Highlights 1991-2000"} + - {id: 2040, cat: TV/Sport, desc: "F1 Highlights 2001-2010"} + - {id: 2050, cat: TV/Sport, desc: "F1 Highlights 2011-2020"} + - {id: 2060, cat: TV/Sport, desc: "F1 Highlights 2011-2020 (HD)"} + - {id: 3000, cat: TV/Sport, desc: "Formula 1 - FP and quali"} + - {id: 3010, cat: TV/Sport, desc: "F1 FP and quali 1950-1980"} + - {id: 3020, cat: TV/Sport, desc: "F1 FP and quali 1981-1990"} + - {id: 3030, cat: TV/Sport, desc: "F1 FP and quali 1991-2000"} + - {id: 3040, cat: TV/Sport, desc: "F1 FP and quali 2001-2010"} + - {id: 3050, cat: TV/Sport, desc: "F1 FP and quali 2011-2020"} + - {id: 3060, cat: TV/Sport, desc: "F1 FP and quali 2011-2020 (HD)"} + - {id: 4000, cat: TV/Sport, desc: "Formula 1 - Onboard"} + - {id: 4010, cat: TV/Sport, desc: "F1 Onboard 1950-1980"} + - {id: 4020, cat: TV/Sport, desc: "F1 Onboard 1981-1990"} + - {id: 4030, cat: TV/Sport, desc: "F1 Onboard 1991-2000"} + - {id: 4040, cat: TV/Sport, desc: "F1 Onboard 2001-2010"} + - {id: 4050, cat: TV/Sport, desc: "F1 Onboard 2011-2020"} + - {id: 5000, cat: TV/Sport, desc: "Formula 1 - Miscellaneous"} + - {id: 5010, cat: TV/Sport, desc: "F1 Misc Documentaries"} + - {id: 5020, cat: TV/Sport, desc: "F1 Misc Driver/team specials"} + - {id: 5030, cat: TV/Sport, desc: "F1 Misc Event specials"} + - {id: 5040, cat: TV/Sport, desc: "F1 Misc Other"} + - {id: 6000, cat: TV/Sport, desc: "Formula 1 - current season"} + - {id: 6010, cat: TV/Sport, desc: "F1 current season Free practices"} + - {id: 6020, cat: TV/Sport, desc: "F1 current season Qualifications"} + - {id: 6030, cat: TV/Sport, desc: "F1 current season Races"} + - {id: 6040, cat: TV/Sport, desc: "F1 current season Highlights"} + - {id: 6050, cat: TV/Sport, desc: "F1 current season Onboards"} + - {id: 6060, cat: TV/Sport, desc: "F1 current season Other"} + - {id: 7000, cat: TV/Sport, desc: "Formula 1 - current season (HD)"} + - {id: 7010, cat: TV/Sport, desc: "F1 current season (HD) Free practices"} + - {id: 7020, cat: TV/Sport, desc: "F1 current season (HD) Qualifications"} + - {id: 7030, cat: TV/Sport, desc: "F1 current season (HD) Races"} + - {id: 7040, cat: TV/Sport, desc: "F1 current season (HD) Highlights"} + - {id: 7050, cat: TV/Sport, desc: "F1 current season (HD) Other"} + - {id: 8000, cat: TV/Sport, desc: "Moto3 / Moto2 / MotoGP"} + - {id: 8010, cat: TV/Sport, desc: "Moto 125cc"} + - {id: 8020, cat: TV/Sport, desc: "Moto 250cc"} + - {id: 8030, cat: TV/Sport, desc: "Moto Moto3"} + - {id: 8040, cat: TV/Sport, desc: "Moto Moto2"} + - {id: 8050, cat: TV/Sport, desc: "Moto MotoGP"} + - {id: 9000, cat: TV/Sport, desc: "Motorbikes"} + - {id: 9010, cat: TV/Sport, desc: "Motorbikes AMA"} + - {id: 9020, cat: TV/Sport, desc: "Motorbikes World Supersport"} + - {id: 9030, cat: TV/Sport, desc: "Motorbikes World Superstock"} + - {id: 9040, cat: TV/Sport, desc: "Motorbikes WSBK"} + - {id: 9050, cat: TV/Sport, desc: "Motorbikes BSB"} + - {id: 9060, cat: TV/Sport, desc: "Motorbikes Other"} + - {id: 9070, cat: TV/Sport, desc: "Motorbikes MotoAmerica"} + - {id: 10000, cat: TV/Sport, desc: "Touring cars"} + - {id: 10010, cat: TV/Sport, desc: "Touring cars WTCC"} + - {id: 10020, cat: TV/Sport, desc: "Touring cars DTM"} + - {id: 10030, cat: TV/Sport, desc: "Touring cars V8 Supercars"} + - {id: 10040, cat: TV/Sport, desc: "Touring cars BTCC"} + - {id: 10050, cat: TV/Sport, desc: "Touring cars Porsche Supercup"} + - {id: 10060, cat: TV/Sport, desc: "Touring cars Other"} + - {id: 11000, cat: TV/Sport, desc: "Sports cars"} + - {id: 11010, cat: TV/Sport, desc: "Sports cars BSS"} + - {id: 11020, cat: TV/Sport, desc: "Sports cars Le Mans 24H"} + - {id: 11030, cat: TV/Sport, desc: "Sports cars WSC/WEC"} + - {id: 11040, cat: TV/Sport, desc: "Sports cars IMSA"} + - {id: 11050, cat: TV/Sport, desc: "Sports cars USC"} + - {id: 11070, cat: TV/Sport, desc: "Sports cars BES"} + - {id: 11080, cat: TV/Sport, desc: "Sports cars Super GT"} + - {id: 11090, cat: TV/Sport, desc: "Sports cars IMSA Pilot Challenge"} + - {id: 11060, cat: TV/Sport, desc: "Sports cars Other"} + - {id: 12000, cat: TV/Sport, desc: "American open-wheelers"} + - {id: 12010, cat: TV/Sport, desc: "American open-wheelers CCWS"} + - {id: 12020, cat: TV/Sport, desc: "American open-wheelers IRL"} + - {id: 12030, cat: TV/Sport, desc: "American open-wheelers CART"} + - {id: 12040, cat: TV/Sport, desc: "American open-wheelers Indycar Series"} + - {id: 12050, cat: TV/Sport, desc: "American open-wheelers Indy Lights"} + - {id: 12060, cat: TV/Sport, desc: "American open-wheelers Other"} + - {id: 13000, cat: TV/Sport, desc: "Rally"} + - {id: 13010, cat: TV/Sport, desc: "Rally WRC"} + - {id: 13020, cat: TV/Sport, desc: "Rally ERC"} + - {id: 13030, cat: TV/Sport, desc: "Rally BRC"} + - {id: 13040, cat: TV/Sport, desc: "Rally National series"} + - {id: 13050, cat: TV/Sport, desc: "Rally Enduro-rally"} + - {id: 13060, cat: TV/Sport, desc: "Rally Rally cross"} + - {id: 13070, cat: TV/Sport, desc: "Rally Other"} + - {id: 14000, cat: TV/Sport, desc: "NASCAR / Stockcars"} + - {id: 14010, cat: TV/Sport, desc: "NASCAR Sprint Cup"} + - {id: 14020, cat: TV/Sport, desc: "NASCAR XFINITY Series"} + - {id: 14030, cat: TV/Sport, desc: "NASCAR CW Trucks"} + - {id: 14040, cat: TV/Sport, desc: "NASCAR ARCA"} + - {id: 14050, cat: TV/Sport, desc: "NASCAR Other"} + - {id: 15000, cat: TV/Sport, desc: "F3000 / GP2 / Formula 2"} + - {id: 15010, cat: TV/Sport, desc: "F2 1985-1990"} + - {id: 15020, cat: TV/Sport, desc: "F2 1991-2000"} + - {id: 15030, cat: TV/Sport, desc: "F2 2001-2011"} + - {id: 15040, cat: TV/Sport, desc: "F2 2012-2019"} + - {id: 15050, cat: TV/Sport, desc: "F2 GP2 Asia"} + - {id: 16000, cat: TV/Sport, desc: "Single seaters"} + - {id: 16010, cat: TV/Sport, desc: "Single seaters Formula 2"} + - {id: 16020, cat: TV/Sport, desc: "Single seaters FIA F3"} + - {id: 16030, cat: TV/Sport, desc: "Single seaters GP3"} + - {id: 16040, cat: TV/Sport, desc: "Single seaters WSBR 2.0"} + - {id: 16050, cat: TV/Sport, desc: "Single seaters WSBR 3.5"} + - {id: 16060, cat: TV/Sport, desc: "Single seaters British F3"} + - {id: 16070, cat: TV/Sport, desc: "Single seaters Formula E"} + - {id: 16080, cat: TV/Sport, desc: "Single seaters Other"} + - {id: 17000, cat: TV/Sport, desc: "Other Photographs"} + - {id: 17010, cat: TV/Sport, desc: "Other Formula 1"} + - {id: 17020, cat: TV/Sport, desc: "Other Motorbikes"} + - {id: 17030, cat: TV/Sport, desc: "Other Touring cars"} + - {id: 17040, cat: TV/Sport, desc: "Other Rally"} + - {id: 17050, cat: TV/Sport, desc: "Other Sports cars"} + - {id: 17060, cat: TV/Sport, desc: "Other"} + - {id: 18000, cat: TV/Sport, desc: "Miscellaneous"} + - {id: 18010, cat: TV/Sport, desc: "Documentaries"} + - {id: 18020, cat: TV/Sport, desc: "TV shows"} + - {id: 18030, cat: TV/Sport, desc: "DVD covers"} + - {id: 18040, cat: TV/Sport, desc: "E-books"} + - {id: 18050, cat: TV/Sport, desc: "Other"} + - {id: 19000, cat: TV/Sport, desc: "Other"} + - {id: 19010, cat: TV/Sport, desc: "Drag racing"} + - {id: 19020, cat: TV/Sport, desc: "Truck racing"} + - {id: 19030, cat: TV/Sport, desc: "Off-road"} + - {id: 19040, cat: TV/Sport, desc: "Drifting"} + - {id: 19050, cat: TV/Sport, desc: "Other"} + + modes: + search: [q] + tv-search: [q, season, ep] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: sort + type: select + label: Sort requested from site + default: date_desc + options: + date_desc: "created desc" + date_asc: "created asc" + sd_desc: "seeders desc" + sd_asc: "seeders asc" + sz_desc: "size desc" + sz_asc: "size asc" + name_desc: "title desc" + name_asc: "title asc" + +login: + path: login + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + rememberme: on + redirect: "" + error: + - selector: div.front__error + test: + path: / + selector: a[href$="/logout"] + +search: + paths: + # only 20 results per page + # https://www.racingfor.me/search/*?c=-1&ob=&offset=20#results + - path: "search/{{ if .Keywords }}{{ .Keywords }}{{ else }}*{{ end }}" + - path: "search/{{ if .Keywords }}{{ .Keywords }}{{ else }}*{{ end }}" + inputs: + offset: 20 + - path: "search/{{ if .Keywords }}{{ .Keywords }}{{ else }}*{{ end }}" + inputs: + offset: 40 + keywordsfilters: + # S2020E02 Becomes `2020 Round 02` + - name: re_replace + args: ["(?i)S(\\d{1,4})E(\\d{1,2})", "$1 Round $2"] + inputs: + c: -1 + ob: "{{ .Config.sort }}" + + rows: + selector: div.row:has(div.torrent-item__download) +# selector: div.row:not(div[class^="mt-"]) + # dateheaders are available, sometimes. But when there are none at all, then all rows are lost to errors. So we have to use 'date now' :-( +# dateheaders: +# # Monday March 29th, 2021 +# selector: div.mt-4 +# filters: +# - name: re_replace +# args: ["st,|nd,|rd,|th,", ""] +# - name: dateparse +# args: "dddd MMMM d yyyy" + + fields: + category: + selector: div.torrent-item__category span a + attribute: href + filters: + - name: querystring + args: c + title: + selector: div.torrent-item__title a + download: + selector: div.torrent-item__download a + attribute: href + details: + selector: div.torrent-item__title a + attribute: href + size: + selector: div.data-size + seeders: + selector: div.data-seeders + leechers: + selector: div.data-leechers + grabs: + selector: div.data-completed + date: + text: now + downloadvolumefactor: + text: 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 0.5 +# crankShaft v2.0.1 diff --git a/config/prowlarr/Definitions/rainbowtracker.yml b/config/prowlarr/Definitions/rainbowtracker.yml new file mode 100644 index 0000000..fd2e803 --- /dev/null +++ b/config/prowlarr/Definitions/rainbowtracker.yml @@ -0,0 +1,315 @@ +--- +id: rainbowtracker +name: Rainbow Tracker +description: "Rainbow Tracker is a RUSSIAN Semi-Private Torrent Tracker for LGBTQ MOVIES / TV" +language: ru-RU +type: semi-private +encoding: UTF-8 +links: + - https://gaytracker.ru/ + +caps: + categorymappings: + - {id: 3, cat: Movies, desc: "Художественные гей-фильмы"} + - {id: 67, cat: Movies/Foreign, desc: "Художественные гей-фильмы - Российское гей-кино"} + - {id: 66, cat: Movies, desc: "Художественные гей-фильмы - Ретро гей-фильмы"} + - {id: 65, cat: Movies/Foreign, desc: "Художественные гей-фильмы - Азиатские гей-фильмы"} + - {id: 63, cat: Movies, desc: "Художественные гей-фильмы - Короткометражные гей-фильмы"} + - {id: 74, cat: XXX/Other, desc: "Художественные гей-фильмы - Фильмы с элементами гей-Pron "} + - {id: 82, cat: Movies, desc: "Художественные гей-фильмы - Фильмы с элементами гей-темы"} + - {id: 4, cat: Movies, desc: "Художественные лесби-фильмы"} + - {id: 89, cat: Movies/Foreign, desc: "Художественные лесби-фильмы - Российское лесби-кино"} + - {id: 90, cat: Movies, desc: "Художественные лесби-фильмы - Ретро лесби-фильмы"} + - {id: 78, cat: Movies/Foreign, desc: "Художественные лесби-фильмы - Азиатское лесби-кино"} + - {id: 64, cat: Movies, desc: "Художественные лесби-фильмы - Короткометражные лесби-фильмы"} + - {id: 91, cat: XXX/Other, desc: "Художественные лесби-фильмы - Фильмы с элементами лесби-Pron "} + - {id: 88, cat: Movies, desc: "Художественные лесби-фильмы - Фильмы с элементами лесби-темы"} + - {id: 96, cat: Movies, desc: "Художественные фильмы Транс*тематики"} + - {id: 5, cat: Movies, desc: "Арт-хаус и авторское кино"} + - {id: 7, cat: TV/Documentary, desc: "Документальные фильмы"} + - {id: 76, cat: XXX/Other, desc: "Документальные фильмы - Фильмы с элементами Pron "} + - {id: 8, cat: TV/Anime, desc: "Мультфильмы, Аниме"} + - {id: 9, cat: XXX, desc: "Эротическое видео"} + - {id: 71, cat: XXX, desc: "Эротическое видео - Документальные фильмы"} + - {id: 72, cat: XXX, desc: "Эротическое видео - Нудизм-Натуризм"} + - {id: 11, cat: TV/Other, desc: "Шоу, Клипы, Музыка, Юмор и т.п."} + - {id: 6, cat: TV, desc: "Сериалы"} + - {id: 80, cat: TV, desc: "Сериалы - Эпизод (серия) с гей-темой"} + - {id: 87, cat: TV, desc: "Сериалы - Бесстыжие / Shameless "} + - {id: 77, cat: TV, desc: "Сериалы - В поиске / Looking "} + - {id: 58, cat: TV, desc: "Сериалы - Дрянные девчонки / Bad Girls "} + - {id: 56, cat: TV, desc: "Сериалы - Лузеры / Хор / Glee "} + - {id: 49, cat: TV, desc: "Сериалы - Физика или Химия"} + - {id: 44, cat: TV, desc: "Сериалы - Юг нигде / South of nowhere "} + - {id: 41, cat: TV, desc: "Сериалы - Охота на парней / Manhunt "} + - {id: 39, cat: TV, desc: "Сериалы - Секс в другом городе / Мир Л / The L Word "} + - {id: 37, cat: TV, desc: "Сериалы - Логово / The Lair "} + - {id: 34, cat: TV, desc: "Сериалы - Бухта Данте"} + - {id: 29, cat: TV, desc: "Сериалы - Ноев ковчег / Noah's Arc "} + - {id: 26, cat: TV, desc: "Сериалы - Маленькая Британия / Little Britain "} + - {id: 21, cat: TV, desc: "Сериалы - Молокососы / Skins. season "} + - {id: 15, cat: TV, desc: "Сериалы - Близкие друзья / Queer as folk "} + - {id: 25, cat: XXX/ImageSet, desc: "Фото, Картинки"} + - {id: 10, cat: XXX, desc: "Pron "} + - {id: 16, cat: XXX, desc: "Pron - Pron-Фильмы"} + - {id: 86, cat: XXX, desc: "Pron - Pron-Фильмы (азиатские)"} + - {id: 53, cat: XXX, desc: "Pron - Pron-Ролики"} + - {id: 20, cat: XXX, desc: "Pron - Pron-Би"} + - {id: 17, cat: XXX, desc: "Pron - Pron-Лесбо"} + - {id: 18, cat: XXX, desc: "Pron - Pron-Транс"} + - {id: 19, cat: XXX, desc: "Pron - Pron-Гетеро"} + - {id: 59, cat: XXX, desc: "Pron - Pron с переводом"} + - {id: 81, cat: XXX, desc: "Pron - Pron-Мультфильмы, Pron-Аниме"} + - {id: 33, cat: XXX/Other, desc: "Pron - Pron-Разное"} + - {id: 13, cat: Other, desc: "Разное"} + - {id: 95, cat: Other/Misc, desc: "Разное - Клипы, Трейлеры, Рекламма"} + - {id: 48, cat: Other/Misc, desc: "Разное - Фильмы, мультфильмы"} + - {id: 57, cat: Other/Misc, desc: "Разное - Сериалы"} + - {id: 54, cat: Other/Misc, desc: "Разное - Картинки"} + - {id: 55, cat: Other/Misc, desc: "Разное - Музыка"} + - {id: 94, cat: Other/Misc, desc: "Разное - Аудиокниги"} + - {id: 47, cat: Other/Misc, desc: "Разное - Книги"} + - {id: 46, cat: Other/Misc, desc: "Разное - Игры"} + - {id: 45, cat: Other/Misc, desc: "Разное - Программы"} + - {id: 14, cat: Other, desc: "Тестовый форум"} + - {id: 32, cat: Other, desc: "Мусорка"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: stripcyrillic + type: checkbox + label: Strip Cyrillic Letters + default: false + - name: addrussiantotitle + type: checkbox + label: Add RUS to end of all titles to improve language detection by Sonarr and Radarr. Will cause English-only results to be misidentified. + default: false + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 1 + options: + 1: created + 10: seeders + 7: size + 2: title + - name: type + type: select + label: Order requested from site + default: 2 + options: + 2: desc + 1: asc + +login: + path: forum/login.php + method: form + form: div.mrg_16 > table > tbody + captcha: + type: image + selector: img[src^="includes/usercp_confirm.php?"] + input: login_code + inputs: + login_username: "{{ .Config.username }}" + login_password: "{{ .Config.password }}" + autologin: 1 + error: + - selector: h4.warnColor1 + test: + path: forum/index.php + selector: a[href="./login.php?logout=1"] + +search: + paths: + - path: forum/tracker.php + inputs: + $raw: "{{ if .Categories }}{{ range .Categories }}f[]={{.}}&{{end}}{{ else }}f[]=-1{{ end }}" + prev_allw: 1 + prev_a: 0 + prev_vote: 0 + prev_gold: 0 + prev_silver: 0 + prev_dla: 0 + prev_dlc: 0 + prev_dld: 0 + prev_dlw: 0 + prev_my: 0 + prev_new: 0 + prev_sd: 0 + prev_da: 1 + prev_dc: 0 + prev_df: 1 + prev_ds: 0 + o: "{{ .Config.sort }}" + s: "{{ .Config.type }}" + # show category + dc: 0 + # show forum + df: 1 + # show author + da: 1 + # show speed + ds: 0 + # -1=all time + tm: -1 + # seed not seen -1=disregard + sns: -1 + # title search + nm: "{{ .Keywords }}" + # search by partial word + allw: 1 + gold: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + + keywordsfilters: + - name: re_replace # S01 to сезон 1 + args: ["(?i)\\bS0*(\\d+)\\b", "сезон $1"] + - name: re_replace # E02 to сери 1 + args: ["(?i)\\bE0*(\\d+)\\b", "сери $1"] + - name: re_replace # S01E02 to сезон 1 сери 2 + args: ["(?i)\\bS0*(\\d+)E0*(\\d+)\\b", "сезон $1 сери $2"] + + rows: + selector: tbody[id^="tor_"]:has(a[href^="./download.php?id="]) + + fields: + category: + selector: a.gen + attribute: href + filters: + - name: querystring + args: f + title: + selector: a.genmed + filters: + # normalize to SXXEYY format + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)\\s*(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)", "S$1E$2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?)", "S$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+[CС]езоны?", "S$1"] + - name: re_replace + args: ["(?i)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)", "E$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "E$1"] + - name: re_replace + args: ["(\\([\\p{IsCyrillic}\\W]+\\))|(^[\\p{IsCyrillic}\\W\\d]+\\/ )|([\\p{IsCyrillic} \\-]+,+)|([\\p{IsCyrillic}]+)", "{{ if .Config.stripcyrillic }}{{ else }}$1$2$3$4{{ end }}"] + - name: re_replace + args: ["(?i)\\bHDTV[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bSAT[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bWEB[-\\s]?DL[-\\s]?Rip\\b", "WEB-DL"] + - name: re_replace + args: ["(?i)\\bWEB\\sRip\\b", "WEBRip"] + - name: re_replace + args: ["(?i)\\bWEB\\sDL\\b", "WEB-DL"] + - name: re_replace + args: ["[\\[\\(\\{<«][\\s\\W]*[\\]\\)\\}>»]", ""] + - name: re_replace + args: ["^[\\s&,\\.!\\?\\+\\-_\\|\\/':]+", ""] + - name: append + args: "{{ if .Config.addrussiantotitle }} RUS{{ else }}{{ end }}" + details: + selector: a.genmed + attribute: href + download: + selector: a[href^="./download.php?id="] + attribute: href + size: + selector: td:nth-child(7) + seeders: + selector: td.seedmed > b, td.icemed > b + filters: + - name: replace + args: ["X", "0"] + leechers: + selector: td.leechmed > b + grabs: + selector: td:nth-child(10) + date_time: + selector: td:last-child + filters: + - name: regexp + args: "(\\d{2}:\\d{2})" + date_date: + selector: td:last-child + filters: + - name: regexp + args: "(\\d{1,2}-\\w{3,4}-\\d{2})" + date: + text: "{{ .Result.date_time }} {{ .Result.date_date }}" + # auto adjusted by site account profile + filters: + - name: replace + args: ["Янв", "Jan"] + - name: replace + args: ["Фев", "Feb"] + - name: replace + args: ["Мар", "Mar"] + - name: replace + args: ["Апр", "Apr"] + - name: replace + args: ["Май", "May"] + - name: replace + args: ["Июн", "Jun"] + - name: replace + args: ["Июл", "Jul"] + - name: replace + args: ["Авг", "Aug"] + - name: replace + args: ["Сен", "Sep"] + - name: replace + args: ["Окт", "Oct"] + - name: replace + args: ["Ноя", "Nov"] + - name: replace + args: ["Дек", "Dec"] + - name: dateparse + args: "HH:mm d-MMM-yy" + downloadvolumefactor: + case: + img[src="images/tor_gold.gif"]: 0 + img[src="images/tor_silver.gif"]: 0.5 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 0.3 + description: + selector: a.genmed +# TorrentPier diff --git a/config/prowlarr/Definitions/rapidzona.yml b/config/prowlarr/Definitions/rapidzona.yml new file mode 100644 index 0000000..9a0826d --- /dev/null +++ b/config/prowlarr/Definitions/rapidzona.yml @@ -0,0 +1,181 @@ +--- +id: rapidzona +name: Rapidzona +description: "Rapidzona is a RUSSIAN Public Torrent Tracker for 3X" +language: ru-RU +type: public +encoding: windows-1251 +links: + - https://rapidzona.tv/ + +caps: + categorymappings: + - {id: 71, cat: XXX, desc: "Релизы"} + - {id: 73, cat: XXX, desc: " Ролики и сцены"} + - {id: 106, cat: XXX, desc: " Любительское порно"} + - {id: 107, cat: XXX, desc: " Сцены из фильмов"} + - {id: 133, cat: XXX, desc: " Anal & DP"} + - {id: 146, cat: XXX, desc: " Секс втроем"} + - {id: 127, cat: XXX, desc: " Сисястые"} + - {id: 134, cat: XXX, desc: " Группавуха"} + - {id: 114, cat: XXX, desc: " Русские девочки"} + - {id: 130, cat: XXX, desc: " Latin & Ebony"} + - {id: 128, cat: XXX, desc: " Азиатки"} + - {id: 124, cat: XXX, desc: " Межрасовый секс"} + - {id: 131, cat: XXX, desc: " Молоденькие"} + - {id: 132, cat: XXX, desc: " Мамочки"} + - {id: 112, cat: XXX, desc: " Кастинг / Casting"} + - {id: 115, cat: XXX, desc: " Public & Reality"} + - {id: 142, cat: XXX, desc: " Taboo / Incest"} + - {id: 141, cat: XXX, desc: " Лесбийский страпон"} + - {id: 111, cat: XXX, desc: " Лесбо-Ролики"} + - {id: 144, cat: XXX, desc: " Фистинг и Дилдо"} + - {id: 109, cat: XXX, desc: " BDSM-Ролики"} + - {id: 110, cat: XXX, desc: " Fetish-Ролики"} + - {id: 145, cat: XXX, desc: " Femdom-Ролики"} + - {id: 143, cat: XXX, desc: " Skinny & Petite"} + - {id: 138, cat: XXX, desc: " BBW / Толстушки"} + - {id: 136, cat: XXX, desc: " Оральный секс"} + - {id: 113, cat: XXX, desc: " Соло и мастурбация"} + - {id: 140, cat: XXX, desc: " Ролики от LegalPorno"} + - {id: 126, cat: XXX, desc: " Паки порнороликов"} + - {id: 72, cat: XXX, desc: " Полнометражные фильмы"} + - {id: 120, cat: XXX, desc: " Без сюжета"} + - {id: 118, cat: XXX, desc: " Классика"} + - {id: 116, cat: XXX, desc: " Порно с сюжетом"} + - {id: 119, cat: XXX, desc: " Порно-пародия"} + - {id: 117, cat: XXX, desc: " С Русским переводом"} + - {id: 137, cat: XXX, desc: " Отечественное порно"} + - {id: 121, cat: XXX, desc: " Этнические фильмы"} + - {id: 123, cat: XXX, desc: " Лесбо-фильмы"} + - {id: 139, cat: XXX, desc: " Fetish - фильмы"} + - {id: 122, cat: XXX, desc: " BDSM - фильмы"} + - {id: 125, cat: XXX, desc: " Эротика 18+"} + - {id: 129, cat: XXX, desc: " Документальное 18+"} + - {id: 93, cat: XXX, desc: " Анимация и Хентай"} + - {id: 87, cat: XXX, desc: " Images & Wallpaper"} + - {id: 105, cat: XXX, desc: " Порно игры"} + + modes: + search: [q] + +settings: + - name: sort + type: select + label: Sort requested from site + default: date + options: + date: created + title: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +download: + selectors: + - selector: a[href*="/download.php?id="] + attribute: href + +search: + paths: + - path: index.php + inputs: + $raw: "{{ range .Categories }}catlist[]={{.}}&{{end}}" + do: search + subaction: search + showposts: 1 + # 0 in article 1 in comments 2 in static pages 3 in article titles + titleonly: 3 + story: "{{ if .Keywords }}{{ .Keywords }}{{ else }}{{ .Today.Year }}{{ end }}" + sortby: "{{ .Config.sort }}" + resorder: "{{ .Config.type }}" + + rows: + selector: div.post + + fields: + category: + selector: p a:nth-child(3), p:has(a:nth-child(3):empty) a:nth-child(2) + case: + a[href$="/porno-xxx-adult-torrent/"]: 71 + a[href$="/porno-video-movies-torrent/"]: 73 + a[href$="/amateur/"]: 106 + a[href$="/scenes-from-movies/"]: 107 + a[href$="/anal/"]: 133 + a[href$="/threesomes/"]: 146 + a[href$="/big-boobs/"]: 127 + a[href$="/group/"]: 134 + a[href$="/russian/"]: 114 + a[href$="/latin/"]: 130 + a[href$="/asian/"]: 128 + a[href$="/interracial-xxx/"]: 124 + a[href$="/teens/"]: 131 + a[href$="/milf/"]: 132 + a[href$="/casting/"]: 112 + a[href$="/public-reality/"]: 115 + a[href$="/taboo/"]: 142 + a[href$="/lesbi-strapon/"]: 141 + a[href$="/lesbian/"]: 111 + a[href$="/fisting-and-dildo/"]: 144 + a[href$="/bdsm/"]: 109 + a[href$="/fetish/"]: 110 + a[href$="/femdom/"]: 145 + a[href$="/skinny-petite/"]: 143 + a[href$="/bbw/"]: 138 + a[href$="/blowjob/"]: 136 + a[href$="/solo/"]: 113 + a[href$="/legalporno/"]: 140 + a[href$="/packs/"]: 126 + a[href$="/porno-films-torrent/"]: 72 + a[href$="/gonzo/"]: 120 + a[href$="/classic/"]: 118 + a[href$="/feature/"]: 116 + a[href$="/parody/"]: 119 + a[href$="/russian-lang/"]: 117 + a[href$="/russian-porn/"]: 137 + a[href$="/interracial/"]: 121 + a[href$="/all-girl-lesbian/"]: 123 + a[href$="/fetish-movies/"]: 139 + a[href$="/bdsm-and-bondage/"]: 122 + a[href$="/erotic-movies/"]: 125 + a[href$="/documentary/"]: 129 + a[href$="/porno-hentai-anime-torrent/"]: 93 + a[href$="/porno-foto-torrent/"]: 87 + a[href$="/porno-games-torrent/"]: 105 + "*": 71 + title: + selector: h1 > a + details: + selector: h1 > a + attribute: href + download: + # + selector: h1 > a + attribute: href + size: + text: "512 MB" + seeders: + text: 1 + leechers: + text: 1 + description: + selector: div.news + date: + selector: p.title-footer + filters: + # 20/02/2020 18:34 + - name: regexp + args: "(\\d{1,2}\\/\\d{2}\\/\\d{4} \\d{1,2}\\:\\d{2})" + - name: append + args: " +03:00" # MSK + - name: dateparse + args: "dd/MM/yyyy HH:mm zzz" + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# DataLife diff --git a/config/prowlarr/Definitions/rareshare2.yml b/config/prowlarr/Definitions/rareshare2.yml new file mode 100644 index 0000000..854fa70 --- /dev/null +++ b/config/prowlarr/Definitions/rareshare2.yml @@ -0,0 +1,171 @@ +--- +id: rareshare2 +name: RareShare2 (API) +description: "RareShare2 is a Private Torrent Tracker for TV" +language: en-US +type: private +encoding: UTF-8 +links: + - https://rareshare2.me/ + +caps: + categorymappings: + - {id: 3, cat: TV, desc: "Music"} + - {id: 4, cat: Console, desc: "Game"} + - {id: 5, cat: PC, desc: "Application"} + - {id: 6, cat: TV, desc: "Comedy"} + - {id: 24, cat: TV/Documentary, desc: "Documentary"} + - {id: 7, cat: TV, desc: "Drama"} + - {id: 9, cat: TV, desc: "Entertaiment"} + - {id: 10, cat: TV, desc: "Factual"} + - {id: 11, cat: TV, desc: "Kids/Family"} + - {id: 12, cat: TV, desc: "News"} + - {id: 13, cat: TV, desc: "Soaps"} + - {id: 14, cat: TV, desc: "SciFi"} + - {id: 15, cat: TV/Sport, desc: "Sport"} + - {id: 16, cat: TV, desc: "True Crime"} + - {id: 17, cat: Audio, desc: "Radio"} + - {id: 18, cat: TV, desc: "Reality"} + - {id: 19, cat: TV, desc: "TV Movie"} + - {id: 21, cat: TV, desc: "Action-Adventure"} + - {id: 22, cat: TV, desc: "Music"} + - {id: 23, cat: TV, desc: "Comedy-Drama"} + - {id: 20, cat: TV, desc: "0"} + - {id: 8, cat: TV, desc: "0"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your RareShare2 account My Security page and clicking on the API Token tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + inputs: {} # TODO: remove in v10 + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: "/api/torrents/filter" + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + # if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6 + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + seasonNumber: "{{ .Query.Season }}" + episodeNumber: "{{ .Query.Ep }}" + imdbId: "{{ .Query.IMDBIDShort }}" + tmdbId: "{{ .Query.TMDBID }}" + tvdbId: "{{ .Query.TVDBID }}" + free: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + + rows: + selector: data + attribute: attributes + + fields: + category: + selector: category_id + title: + selector: name + details: + selector: details_link + download: + selector: download_link + infohash: + selector: info_hash + poster: + selector: poster + filters: + - name: replace + args: ["https://via.placeholder.com/90x135", ""] + imdbid: + selector: imdb_id + tmdbid: + selector: tmdb_id + tvdbid: + selector: tvdb_id + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0%, 25%, 50%, 75%, 100% + selector: freeleech + case: + 0%: 1 # not free + 25%: 0.75 + 50%: 0.5 + 75%: 0.25 + 100%: 0 # freeleech + "*": 0 # catch errors + uploadvolumefactor: + # api returns 0=false, 1=true + selector: double_upload + case: + 0: 1 # normal + 1: 2 # double + minimumseedtime: + # 1 day (as seconds = 1 x 24 x 60 x 60) for Single episodes + # 3 days (as seconds = 3 x 24 x 60 x 60) for Packs + text: 259200 +# json UNIT3D 6.0.6 diff --git a/config/prowlarr/Definitions/redbits-api.yml b/config/prowlarr/Definitions/redbits-api.yml new file mode 100644 index 0000000..9ce86a7 --- /dev/null +++ b/config/prowlarr/Definitions/redbits-api.yml @@ -0,0 +1,192 @@ +--- +id: redbits-api +name: RedBits (API) +description: "RedBits is a SPANISH site for classic content" +language: es-ES +type: private +encoding: UTF-8 +links: + - https://redbits.xyz/ +legacylinks: + - https://red-bits.com/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Películas"} + - {id: 2, cat: TV, desc: "Series"} + - {id: 10, cat: TV, desc: "Series Completas"} + - {id: 6, cat: TV/Documentary, desc: "Documentales"} + - {id: 7, cat: TV/Sport, desc: "Deportes"} + - {id: 8, cat: Movies, desc: "Hagbard"} + - {id: 9, cat: Movies, desc: "Studio Ghibli"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your RedBits account My Security page and clicking on the API Token tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + inputs: {} # TODO: remove in v10 + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: "/api/torrents/filter" + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + # if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6 + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + seasonNumber: "{{ .Query.Season }}" + episodeNumber: "{{ .Query.Ep }}" + imdbId: "{{ .Query.IMDBIDShort }}" + tmdbId: "{{ .Query.TMDBID }}" + tvdbId: "{{ .Query.TVDBID }}" + free: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + + rows: + selector: data + attribute: attributes + + fields: + category: + selector: category_id + title_vose: + selector: name:contains(VOSE) + optional: true + filters: + - name: append + args: " English" # Add english to fix Sonarr/Radarr language + title_notvose: + selector: name:not(:contains(VOSE)) + optional: true + filters: + - name: append + args: " Spanish" # Add spanish to fix Sonarr/Radarr language + title: + text: "{{ if .Result.title_vose }}{{ .Result.title_vose }}{{ else }}{{ .Result.title_notvose }}{{ end }}" + filters: + - name: re_replace + args: ["(?i)bdfull", "BluRay"] # BDfull -> BluRay + - name: re_replace + args: ["(?i)RedBits", ""] # Delete RedBits + - name: re_replace + args: ["\\[|\\]", " "] + - name: re_replace + args: [" ", " "] + - name: re_replace + args: ["(?i)T(\\d{1,2})\\b", "S$1"] + details: + selector: details_link + download: + selector: download_link + infohash: + selector: info_hash + poster: + selector: meta.poster + filters: + - name: replace + args: ["https://via.placeholder.com/90x135", ""] + imdbid: + selector: imdb_id + tmdbid: + selector: tmdb_id + tvdbid: + selector: tvdb_id + genre: + selector: meta.genres + filters: + - name: re_replace + args: ["(?i)(Película de TV)", "Película_de_TV"] + - name: re_replace + args: ["(?i)(Ciencia ficción)", "Ciencia_ficción"] + - name: replace + args: [" & ", "_&_"] + description: + text: "{{ .Result.genre }}" + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0%, 25%, 50%, 75%, 100% + selector: freeleech + case: + 0%: 1 # not free + 25%: 0.75 + 50%: 0.5 + 75%: 0.25 + 100%: 0 # freeleech + "*": 0 # catch errors + uploadvolumefactor: + # api returns 0=false, 1=true + selector: double_upload + case: + 0: 1 # normal + 1: 2 # double + minimumseedtime: + # 4 days (as seconds = 4 x 24 x 60 x 60) + text: 345600 +# json UNIT3D 6.4.1 diff --git a/config/prowlarr/Definitions/redleaves.yml b/config/prowlarr/Definitions/redleaves.yml new file mode 100644 index 0000000..e9db7eb --- /dev/null +++ b/config/prowlarr/Definitions/redleaves.yml @@ -0,0 +1,191 @@ +--- +id: redleaves +name: Red Leaves +description: "Red Leaves (红叶) is a CHINESE Private Torrent Tracker for MOVIES / TV / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://leaves.red/ + +caps: + categorymappings: + - {id: 408, cat: Audio, desc: "HQ Audio (高清音频/音乐)"} + - {id: 409, cat: Other, desc: "Misc (杂项/软件/其他)"} + - {id: 407, cat: TV/Sport, desc: "Sports (竞技体育)"} + - {id: 406, cat: Audio/Video, desc: "Music Videos (音乐录影带)"} + - {id: 403, cat: TV, desc: "TV Shows (电视节目)"} + - {id: 402, cat: TV, desc: "TV Series (剧集)"} + - {id: 405, cat: TV/Anime, desc: "Animations (动画)"} + - {id: 404, cat: TV/Documentary, desc: "Documentaries (纪实)"} + - {id: 401, cat: Movies, desc: "Movies (电影)"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: 2facode + type: text + label: 2FA code + - name: info_2fa + type: info + label: "About 2FA code" + default: "Only fill in the 2FA code box if you have enabled 2FA on the Red Leaves Web Site. Otherwise just leave it empty." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + secret: "" + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + two_step_code: "{{ .Config.2facode }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("失败")) + message: + selector: td.text + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl + search_area: "{{ if or .Query.IMDBID .Query.DoubanID }}1{{ else }}0{{ end }}" + # 0 AND, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: img[data-src] + attribute: data-src + imdbid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="imdb.com/title/tt"] + attribute: href + doubanid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="movie.douban.com/subject/"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-child(5) + seeders: + selector: td.rowfollow:nth-child(6) + leechers: + selector: td.rowfollow:nth-child(7) + grabs: + selector: td.rowfollow:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + description: + selector: td.rowfollow:nth-child(2) + remove: a, b, font, img, span +# NexusPHP v1.8.8 2023-09-25 diff --git a/config/prowlarr/Definitions/redstartorrent.yml b/config/prowlarr/Definitions/redstartorrent.yml new file mode 100644 index 0000000..1733282 --- /dev/null +++ b/config/prowlarr/Definitions/redstartorrent.yml @@ -0,0 +1,121 @@ +--- +id: redstartorrent +name: Red Star Torrent +description: "Red Star Torrent (RST) is a POLISH Private Torrent Tracker for TV" +language: pl-PL +type: private +encoding: ISO-8859-2 +links: + - http://rstorrent.org.pl/ # site does not support https NET::ERR_CERT_AUTHORITY_INVALID + +caps: + categorymappings: + - {id: 34, cat: PC/0day, desc: "0-day"} + - {id: 15, cat: Movies/3D, desc: "3D"} + - {id: 23, cat: TV/Anime, desc: "Anime"} + - {id: 1, cat: PC, desc: "Aplikacje"} + - {id: 30, cat: Books/EBook, desc: "Ebooki"} + - {id: 20, cat: Movies/SD, desc: "Filmy/DVD-R"} + - {id: 5, cat: Movies/HD, desc: "Filmy/HD"} + - {id: 19, cat: Movies/SD, desc: "Filmy/XviD"} + - {id: 4, cat: PC/Games, desc: "Gry/PC ISO"} + - {id: 28, cat: Other, desc: "GSM/PDA"} + - {id: 29, cat: Movies, desc: "Kids"} + - {id: 40, cat: Movies/Foreign, desc: "Kino Polska"} + - {id: 6, cat: Audio, desc: "Muzyka"} + - {id: 12, cat: TV, desc: "Paczka"} + - {id: 25, cat: Other, desc: "Rozne"} + - {id: 7, cat: TV, desc: "Seriale - Epizody"} + - {id: 3, cat: TV, desc: "Seriale - Sezony"} + - {id: 35, cat: TV, desc: "SHOW"} + - {id: 26, cat: TV/Sport, desc: "Sport"} + - {id: 36, cat: Other, desc: "Teatr"} + - {id: 27, cat: Audio/Video, desc: "Teledyski"} + - {id: 31, cat: TV/Documentary, desc: "TV Doc"} + - {id: 9, cat: XXX, desc: "XXX"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: td.embedded:has(h2:contains("failed")) + - selector: td.embedded:has(h2:contains("Error")) + test: + selector: a[href^="logout.php"] + path: browse.php + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + incldead: 1 + polish: 0 + + rows: + selector: table[border="1"][cellpadding="5"] > tbody > tr:has(a[href^="/details.php?id="]) + + fields: + title: + selector: a[href^="/details.php?id="] + details: + selector: a[href^="/details.php?id="] + attribute: href + category: + selector: a[href^="/browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + download: + selector: a[href^="/download.php/"] + attribute: href + description: + selector: img[src="/pic/pl.gif"] + attribute: src + filters: + - name: append + args: "Language: polish\n
" + - name: prepend + args: "{{ .Result.description }}" + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + date: + selector: td:nth-child(5) + # auto adjusted by site account profile + filters: + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss" + grabs: + selector: td:nth-child(7) + size: + selector: td:nth-child(6) + seeders: + selector: td:nth-child(8) + filters: + - name: regexp + args: ^(\d+) + leechers: + selector: td:nth-child(8) + filters: + - name: regexp + args: / (\d+) + downloadvolumefactor: + case: + td.darmowy: 0 + "*": 1 + uploadvolumefactor: + text: 1 +# engine tbd diff --git a/config/prowlarr/Definitions/reelflix-api.yml b/config/prowlarr/Definitions/reelflix-api.yml new file mode 100644 index 0000000..0b8bbd7 --- /dev/null +++ b/config/prowlarr/Definitions/reelflix-api.yml @@ -0,0 +1,164 @@ +--- +id: reelflix-api +name: ReelFLiX (API) +description: "ReelFLiX (HD4Free,LegacyHD) is a Private Torrent Tracker for HD MOVIES" +language: en-US +type: private +encoding: UTF-8 +links: + - https://reelflix.xyz/ +legacylinks: + - https://legacyhd.org/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Movie"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + music-search: [q] + book-search: [q] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your ReelFlix account My Settings page and clicking on the API Key tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + inputs: {} # TODO: remove in v10 + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: "/api/torrents/filter" + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + # if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6 + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + seasonNumber: "{{ .Query.Season }}" + episodeNumber: "{{ .Query.Ep }}" + imdbId: "{{ .Query.IMDBIDShort }}" + tmdbId: "{{ .Query.TMDBID }}" + tvdbId: "{{ .Query.TVDBID }}" + "free[]": "{{ if .Config.freeleech }}100{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + + rows: + selector: data + attribute: attributes + + fields: + category: + selector: category_id + title: + selector: name + details: + selector: details_link + download: + selector: download_link + infohash: + selector: info_hash + poster: + selector: meta.poster + filters: + - name: replace + args: ["https://via.placeholder.com/90x135", ""] + imdbid: + selector: imdb_id + tmdbid: + selector: tmdb_id + tvdbid: + selector: tvdb_id + genre: + selector: meta.genres + filters: + - name: re_replace + args: ["(?i)(Science Fiction)", "Science_Fiction"] + - name: re_replace + args: ["(?i)(TV Movie)", "TV_Movie"] + - name: replace + args: [" & ", "_&_"] + description: + text: "{{ .Result.genre }}" + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0%, 25%, 50%, 75%, 100% + selector: freeleech + case: + 0%: 1 # not free + 25%: 0.75 + 50%: 0.5 + 75%: 0.25 + 100%: 0 # freeleech + "*": 0 # catch errors + uploadvolumefactor: + # api returns False, True + selector: double_upload + case: + False: 1 # normal + True: 2 # double + minimumratio: + text: 1.0 +# json UNIT3D 7.1.3 diff --git a/config/prowlarr/Definitions/resurrectthenet.yml b/config/prowlarr/Definitions/resurrectthenet.yml new file mode 100644 index 0000000..1df4967 --- /dev/null +++ b/config/prowlarr/Definitions/resurrectthenet.yml @@ -0,0 +1,174 @@ +--- +id: resurrectthenet +name: Resurrect The Net +description: "Resurrect The Net (RTN) is a Private site for TV / MOVIES / GENERAL" +language: en-US +type: private +encoding: UTF-8 +links: + - http://resurrectthe.net/ + +caps: + categorymappings: + - {id: 7, cat: TV/Anime, desc: "Anime"} + - {id: 1, cat: PC, desc: "Appz/Misc"} + - {id: 2, cat: PC/ISO, desc: "Appz PC ISO"} + - {id: 3, cat: Movies, desc: "Boxset/Packs"} + - {id: 4, cat: Audio/Audiobook, desc: "Books/Audio Books"} + - {id: 23, cat: TV/HD, desc: "Episodes X264"} + - {id: 24, cat: TV/SD, desc: "Episodes XviD"} + - {id: 5, cat: PC/Games, desc: "Games PC ISO"} + - {id: 6, cat: PC/Games, desc: "Games PC Rips"} + - {id: 32, cat: Console, desc: "Games Console"} + - {id: 9, cat: PC/Mac, desc: "Mac"} + - {id: 10, cat: PC/Mobile-Other, desc: "Mobile"} + - {id: 11, cat: Movies/HD, desc: "Movies X264"} + - {id: 33, cat: Movies, desc: "Movies Classic"} + - {id: 12, cat: Movies/BluRay, desc: "Movies Blu-Ray"} + - {id: 13, cat: Movies/DVD, desc: "Movies DVDR"} + - {id: 14, cat: Movies/HD, desc: "MP4"} + - {id: 15, cat: Movies/SD, desc: "Movies XviD"} + - {id: 16, cat: Audio, desc: "Music"} + - {id: 17, cat: Audio/Video, desc: "Music Video"} + - {id: 19, cat: TV/Sport, desc: "Sport"} + - {id: 22, cat: XXX, desc: "XXX"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 3 + options: + 3: created + 5: seeders + 4: size + 2: title + - name: type + type: select + label: Order requested from site + default: 2 + options: + 2: desc + 1: asc + - name: info + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: index.php?page=login + method: post + inputs: + uid: "{{ .Config.username }}" + pwd: "{{ .Config.password }}" + error: + - selector: body[onLoad^="makeAlert('"] + message: + selector: body[onLoad^="makeAlert('"] + attribute: onLoad + filters: + - name: replace + args: ["makeAlert('Error' , '", ""] + - name: replace + args: ["');", ""] + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: index.php + inputs: + search: "{{ .Keywords }}" + page: torrents + category: "{{ range .Categories }}{{.}};{{end}}" + # 0 filename, 1 file & descr, 2 descr, 3 uploaders, 5 gold, 6 silver, 7 bronze + options: "{{ if .Config.freeleech }}5{{ else }}0{{ end }}" + # 0 all, 1 active, 2 dead + active: 0 + order: "{{ .Config.sort }}" + by: "{{ .Config.type }}" + # while the site does have imdbid in some descriptions, we cannot support both searching with imdbid and freeleech at the same time. + + rows: + selector: table > tbody > tr > td > table.lista > tbody > tr:has(a[href^="index.php?page=torrent-details&id="]) + filters: + # searching freeleech and keywords returns unrelated hits + - name: andmatch + + fields: + category: + selector: a[href^="index.php?page=torrents&category="] + attribute: href + filters: + - name: querystring + args: category + title: + selector: a[onmouseover][href^="index.php?page=torrent-details&id="] + details: + selector: a[onmouseover][href^="index.php?page=torrent-details&id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: a[onmouseover][href^="index.php?page=torrent-details&id="] + attribute: onmouseover + filters: + - name: regexp + args: "src=(.*?) " + date: + selector: td:nth-last-child(5) + # auto adjusted by site account profile + filters: + - name: dateparse + args: "HH:mm:ss dd/MM/yyyy" + seeders: + selector: td:nth-last-child(4) + leechers: + selector: td:nth-last-child(3) + grabs: + selector: td:nth-last-child(2) + size: + selector: td:nth-last-child(1) + downloadvolumefactor: + case: + img[src="images/gold.gif"]: 0 + img[src="images/silver.gif"]: 0.5 + img[src="images/bronze.gif"]: 0.75 + "*": 1 + uploadvolumefactor: + case: + img[alt="2x Upload Multiplier"]: 2 + img[alt="3x Upload Multiplier"]: 3 + img[alt="4x Upload Multiplier"]: 4 + img[alt="5x Upload Multiplier"]: 5 + img[alt="6x Upload Multiplier"]: 6 + img[alt="7x Upload Multiplier"]: 7 + img[alt="8x Upload Multiplier"]: 8 + img[alt="9x Upload Multiplier"]: 9 + img[alt="10x Upload Multiplier"]: 10 + "*": 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# xbtitFM v1.17 diff --git a/config/prowlarr/Definitions/rgfootball.yml b/config/prowlarr/Definitions/rgfootball.yml new file mode 100644 index 0000000..36f9b59 --- /dev/null +++ b/config/prowlarr/Definitions/rgfootball.yml @@ -0,0 +1,623 @@ +--- +id: rgfootball +name: RGFootball +description: "RGFootball is a Russian Sports torrent tracker." +language: ru-RU +type: semi-private +encoding: UTF-8 +links: + - http://rgfootball.net/ # the site does not support https + +caps: + categorymappings: + # VIP-Архив / VIP-Archive + - {id: 224, cat: TV/Sport, desc: " |- VIP January 2023"} + - {id: 225, cat: TV/Sport, desc: " |- VIP February 2023"} + - {id: 402, cat: TV/Sport, desc: " |- VIP March 2023"} + - {id: 403, cat: TV/Sport, desc: " |- VIP April 2023"} + - {id: 408, cat: TV/Sport, desc: " |- VIP May 2023"} + - {id: 409, cat: TV/Sport, desc: " |- VIP June 2023"} + - {id: 436, cat: TV/Sport, desc: " |- VIP July 2023"} + - {id: 438, cat: TV/Sport, desc: " |- VIP August 2023"} + - {id: 448, cat: TV/Sport, desc: " |- VIP September 2023"} + - {id: 449, cat: TV/Sport, desc: " |- VIP October 2023"} + - {id: 450, cat: TV/Sport, desc: " |- VIP November 2023"} + - {id: 451, cat: TV/Sport, desc: " |- VIP December 2023"} + - {id: 235, cat: TV/Sport, desc: " |- VIP January 2022"} + - {id: 247, cat: TV/Sport, desc: " |- VIP February 2022"} + - {id: 250, cat: TV/Sport, desc: " |- VIP March 2022"} + - {id: 252, cat: TV/Sport, desc: " |- VIP April 2022"} + - {id: 273, cat: TV/Sport, desc: " |- VIP May 2022"} + - {id: 275, cat: TV/Sport, desc: " |- VIP June 2022"} + - {id: 375, cat: TV/Sport, desc: " |- VIP July 2022"} + - {id: 378, cat: TV/Sport, desc: " |- VIP August 2022"} + - {id: 382, cat: TV/Sport, desc: " |- VIP September 2022"} + - {id: 384, cat: TV/Sport, desc: " |- VIP October 2022"} + - {id: 385, cat: TV/Sport, desc: " |- VIP November 2022"} + - {id: 386, cat: TV/Sport, desc: " |- VIP December 2022"} + # Олимпийские игры / Olympic Games + - {id: 465, cat: TV/Sport, desc: "Зимние Олимпийские игры 2022 /..."} + - {id: 473, cat: TV/Sport, desc: " |- Церемонии"} + - {id: 483, cat: TV/Sport, desc: " |- Биатлон"} + - {id: 485, cat: TV/Sport, desc: " |- Фигурное катание"} + - {id: 467, cat: TV/Sport, desc: " |- Лыжный спорт"} + - {id: 474, cat: TV/Sport, desc: " |- Хоккей"} + - {id: 475, cat: TV/Sport, desc: " |- Конькобежный спорт/Шорт-трек"} + - {id: 484, cat: TV/Sport, desc: " |- Бобслей/Санный спорт/Скелетон"} + - {id: 481, cat: TV/Sport, desc: " |- Сноуборд/Фристайл/Кёрлинг"} + - {id: 482, cat: TV/Sport, desc: " |- Обзорные и тематические..."} + - {id: 476, cat: TV/Sport, desc: " |- Архив - Олимпиады прошлых лет"} + - {id: 464, cat: TV/Sport, desc: "Летние Олимпийские игры / Summer..."} + - {id: 486, cat: TV/Sport, desc: " |- Церемонии"} + - {id: 487, cat: TV/Sport, desc: " |- Футбол"} + - {id: 489, cat: TV/Sport, desc: " |- Баскетбол"} + - {id: 491, cat: TV/Sport, desc: " |- Волейбол"} + - {id: 500, cat: TV/Sport, desc: " |- Гандбол"} + - {id: 488, cat: TV/Sport, desc: " |- Теннис"} + - {id: 490, cat: TV/Sport, desc: " |- Бокс"} + - {id: 331, cat: TV/Sport, desc: " |- Лёгкая атлетика"} + - {id: 330, cat: TV/Sport, desc: " |- Тяжёлая атлетика"} + - {id: 329, cat: TV/Sport, desc: " |- Водные виды спорта и гребля"} + - {id: 323, cat: TV/Sport, desc: " |- Велоспорт"} + - {id: 324, cat: TV/Sport, desc: " |- Гимнастика"} + - {id: 327, cat: TV/Sport, desc: " |- Борьба и единоборства"} + - {id: 292, cat: TV/Sport, desc: " |- Другие виды спорта"} + - {id: 304, cat: TV/Sport, desc: " |- Обзорные и тематические..."} + # Футбол / Football + - {id: 580, cat: TV/Sport, desc: "FIFA WC 2022 / Чемпионат мира 2022"} + - {id: 515, cat: TV/Sport, desc: " |- ⚽️VIP-Extra FIFA SATFEEDS WC 2022"} + - {id: 234, cat: TV/Sport, desc: " |- ⚽️VIP-Extra FIFA 4K WC 2022"} + - {id: 583, cat: TV/Sport, desc: " |- ⚽️VIP-Archive FIFA WC 2022"} + - {id: 525, cat: TV/Sport, desc: " |- VIP-Light FIFA WC 2022"} + - {id: 581, cat: TV/Sport, desc: " |- FIFA WC 2022"} + - {id: 582, cat: TV/Sport, desc: " |- FIFA WC 2022. Qualifiers"} + - {id: 163, cat: TV/Sport, desc: "EURO 2020 / Чемпионат Европы 2020"} + - {id: 528, cat: TV/Sport, desc: " |- ⚽️VIP-Extra 4K EURO 2020"} + - {id: 521, cat: TV/Sport, desc: " |- ⚽️VIP-Extra SAT FEED EURO 2020"} + - {id: 216, cat: TV/Sport, desc: " |- ⚽️VIP-Archive UEFA EURO 2020"} + - {id: 497, cat: TV/Sport, desc: " |- VIP-Light UEFA EURO 2020"} + - {id: 395, cat: TV/Sport, desc: " |- UEFA EURO 2020"} + - {id: 447, cat: TV/Sport, desc: " |- UEFA EURO 2020 qualifying"} + - {id: 426, cat: TV/Sport, desc: " |- VIP-Extra UEFA EURO 2020 qualifying"} + - {id: 432, cat: TV/Sport, desc: "FIFA WC 2018 / Чемпионат мира 2018"} + - {id: 535, cat: TV/Sport, desc: " |- ⚽️VIP-Extra FIFA WC 2018 4K"} + - {id: 559, cat: TV/Sport, desc: " |- ⚽️VIP-Extra FIFA WC 2018 Sat Feed"} + - {id: 574, cat: TV/Sport, desc: " |- ⚽️VIP-Extra FIFA WC 2018"} + - {id: 185, cat: TV/Sport, desc: " |- FIFA WC 2018"} + - {id: 136, cat: TV/Sport, desc: " |- FIFA WC 2018. Qualifiers"} + - {id: 217, cat: TV/Sport, desc: " |- FIFA WC 2018. Reviews"} + - {id: 458, cat: TV/Sport, desc: " |- VIP-Extra Archive FIFA WC 2018 Qualifiers"} + - {id: 578, cat: TV/Sport, desc: "2023-24 UEFA Champions League"} + - {id: 13, cat: TV/Sport, desc: " |- ⚽️VIP-Extra 4k + Sat Feed UCL"} + - {id: 511, cat: TV/Sport, desc: " |- ⚽️VIP-Extra UCL 2023-24"} + - {id: 425, cat: TV/Sport, desc: " |- ⚽️VIP UCL 2023-24"} + - {id: 416, cat: TV/Sport, desc: " |- VIP-Light UCL 2023-24"} + - {id: 344, cat: TV/Sport, desc: " |- Play-off"} + - {id: 342, cat: TV/Sport, desc: " |- Group stage"} + - {id: 340, cat: TV/Sport, desc: " |- Qualifying Rounds"} + - {id: 339, cat: TV/Sport, desc: "2023-24 UEFA Europa League"} + - {id: 12, cat: TV/Sport, desc: " |- ⚽️VIP-Extra UEL 2023-24"} + - {id: 512, cat: TV/Sport, desc: " |- ⚽️VIP UEL 2023-24"} + - {id: 570, cat: TV/Sport, desc: " |- VIP-Light UEL 2023-24"} + - {id: 345, cat: TV/Sport, desc: " |- Play-off"} + - {id: 343, cat: TV/Sport, desc: " |- Group stage"} + - {id: 341, cat: TV/Sport, desc: " |- Qualifying Rounds"} + - {id: 315, cat: TV/Sport, desc: "2023-24 UEFA Europa Conference League"} + - {id: 419, cat: TV/Sport, desc: " |- ⚽️VIP-Extra 2023-24 UEFA ECL"} + - {id: 442, cat: TV/Sport, desc: " |- ⚽️VIP 2023-24 UEFA Europa Conference League"} + - {id: 517, cat: TV/Sport, desc: " |- VIP-Light 2023-24 UEFA Europa Conference League"} + - {id: 114, cat: TV/Sport, desc: " |- Qualifying Rounds"} + - {id: 165, cat: TV/Sport, desc: " |- Group stage"} + - {id: 164, cat: TV/Sport, desc: " |- Play-off"} + - {id: 452, cat: TV/Sport, desc: "2022-23 UEFA Champions League"} + - {id: 558, cat: TV/Sport, desc: " |- ⚽️VIP-Extra 4k + Sat Feed UCL"} + - {id: 346, cat: TV/Sport, desc: " |- ⚽️VIP-Extra UCL 2022-23"} + - {id: 415, cat: TV/Sport, desc: " |- ⚽️VIP UCL 2022-23"} + - {id: 569, cat: TV/Sport, desc: " |- VIP-Light UCL 2022-23"} + - {id: 158, cat: TV/Sport, desc: " |- Qualifying Rounds"} + - {id: 159, cat: TV/Sport, desc: " |- Group stage"} + - {id: 232, cat: TV/Sport, desc: " |- Play-off"} + - {id: 160, cat: TV/Sport, desc: "2022-23 UEFA Europa League"} + - {id: 347, cat: TV/Sport, desc: " |- ⚽️VIP-Extra UEL 2022-23"} + - {id: 161, cat: TV/Sport, desc: " |- Qualifying Rounds"} + - {id: 162, cat: TV/Sport, desc: " |- Group stage"} + - {id: 231, cat: TV/Sport, desc: " |- Play-off"} + - {id: 48, cat: TV/Sport, desc: "2022–23 UEFA Europa Conference League"} + - {id: 405, cat: TV/Sport, desc: " |- Qualifying Rounds"} + - {id: 536, cat: TV/Sport, desc: " |- Group stage"} + - {id: 249, cat: TV/Sport, desc: " |- Play-off"} + - {id: 3, cat: TV/Sport, desc: "Англия/England"} + - {id: 407, cat: TV/Sport, desc: " |- ⚽️VIP-Extra 4k England"} + - {id: 561, cat: TV/Sport, desc: " |- ⚽️VIP-Extra EPL Classic"} + - {id: 223, cat: TV/Sport, desc: " |- ⚽️VIP England"} + - {id: 553, cat: TV/Sport, desc: " |- VIP-Light England"} + - {id: 538, cat: TV/Sport, desc: " |- Premier League 2023-24"} + - {id: 412, cat: TV/Sport, desc: " |- National Cups 2023-24"} + - {id: 418, cat: TV/Sport, desc: " |- Championship+ 2023-24"} + - {id: 54, cat: TV/Sport, desc: " |- Premier League 2022-23"} + - {id: 351, cat: TV/Sport, desc: " |- Championship+"} + - {id: 53, cat: TV/Sport, desc: " |- National Cups up to 2023"} + - {id: 55, cat: TV/Sport, desc: " |- Previous years matches"} + - {id: 2, cat: TV/Sport, desc: "Россия/СССР - Russia/USSR"} + - {id: 562, cat: TV/Sport, desc: " |- VIP-Light Russia"} + - {id: 251, cat: TV/Sport, desc: " |- RPL 2023-24"} + - {id: 496, cat: TV/Sport, desc: " |- FNL 2023-24"} + - {id: 423, cat: TV/Sport, desc: " |- National Cups 2023-24"} + - {id: 57, cat: TV/Sport, desc: " |- RPL 2022-23"} + - {id: 56, cat: TV/Sport, desc: " |- National Cups up to 2023"} + - {id: 46, cat: TV/Sport, desc: " |- Previous years matches"} + - {id: 8, cat: TV/Sport, desc: "Украина/Ukraine"} + - {id: 563, cat: TV/Sport, desc: " |- VIP-Light Ukraine"} + - {id: 72, cat: TV/Sport, desc: " |- UPL 2023-24"} + - {id: 152, cat: TV/Sport, desc: " |- National Cups 2022-23"} + - {id: 410, cat: TV/Sport, desc: " |- UPL 2022-23"} + - {id: 71, cat: TV/Sport, desc: " |- National Cups up to 2023"} + - {id: 348, cat: TV/Sport, desc: " |- Lower leagues"} + - {id: 70, cat: TV/Sport, desc: " |- Previous years matches"} + - {id: 4, cat: TV/Sport, desc: "Испания/Spain"} + - {id: 516, cat: TV/Sport, desc: " |- ⚽️VIP-Extra 4k + Sat Feed"} + - {id: 173, cat: TV/Sport, desc: " |- ⚽️VIP-Extra Spain Classic"} + - {id: 506, cat: TV/Sport, desc: " |- ⚽️VIP-Extra El Clasico"} + - {id: 208, cat: TV/Sport, desc: " |- ⚽️VIP Spain"} + - {id: 564, cat: TV/Sport, desc: " |- VIP-Light Spain"} + - {id: 194, cat: TV/Sport, desc: " |- Primera Division 2023-24"} + - {id: 424, cat: TV/Sport, desc: " |- National Cups 2023-24"} + - {id: 58, cat: TV/Sport, desc: " |- Primera Division 2022-23"} + - {id: 59, cat: TV/Sport, desc: " |- National Cups up to 2023"} + - {id: 353, cat: TV/Sport, desc: " |- Segunda, Segunda B"} + - {id: 60, cat: TV/Sport, desc: " |- Previous years matches"} + - {id: 6, cat: TV/Sport, desc: "Германия/Germany"} + - {id: 555, cat: TV/Sport, desc: " |- ⚽️VIP-Extra 4k+ Germany"} + - {id: 210, cat: TV/Sport, desc: " |- ⚽️VIP Germany"} + - {id: 565, cat: TV/Sport, desc: " |- VIP-Light Germany"} + - {id: 175, cat: TV/Sport, desc: " |- Bundesliga 2023-24"} + - {id: 352, cat: TV/Sport, desc: " |- National Cups 2023-24"} + - {id: 66, cat: TV/Sport, desc: " |- Bundesliga 2022-23"} + - {id: 355, cat: TV/Sport, desc: " |- 2. Bundesliga"} + - {id: 65, cat: TV/Sport, desc: " |- National Cups up to 2023"} + - {id: 427, cat: TV/Sport, desc: " |- Lower leagues"} + - {id: 64, cat: TV/Sport, desc: " |- Previous years matches"} + - {id: 5, cat: TV/Sport, desc: "Италия/Italy"} + - {id: 529, cat: TV/Sport, desc: " |- ⚽️VIP-Extra Italy"} + - {id: 209, cat: TV/Sport, desc: " |- ⚽️VIP Italy"} + - {id: 566, cat: TV/Sport, desc: " |- VIP-Light Italy"} + - {id: 174, cat: TV/Sport, desc: " |- Serie A 2023-24"} + - {id: 196, cat: TV/Sport, desc: " |- National Cups 2023-24"} + - {id: 63, cat: TV/Sport, desc: " |- Serie A 2022-23"} + - {id: 354, cat: TV/Sport, desc: " |- Serie B, Lega Pro, Serie D"} + - {id: 62, cat: TV/Sport, desc: " |- National Cups up to 2023"} + - {id: 540, cat: TV/Sport, desc: " |- 1996-97 Juventus Classic"} + - {id: 61, cat: TV/Sport, desc: " |- Previous years matches"} + - {id: 7, cat: TV/Sport, desc: "Франция/France"} + - {id: 184, cat: TV/Sport, desc: " |- ⚽️VIP-Extra 4k + Sat Feed"} + - {id: 211, cat: TV/Sport, desc: " |- ⚽️VIP France"} + - {id: 567, cat: TV/Sport, desc: " |- VIP-Light France"} + - {id: 176, cat: TV/Sport, desc: " |- Ligue 1 2023-24"} + - {id: 133, cat: TV/Sport, desc: " |- National Cups 2023-24"} + - {id: 69, cat: TV/Sport, desc: " |- Ligue 1 2022-23"} + - {id: 428, cat: TV/Sport, desc: " |- Ligue 2"} + - {id: 68, cat: TV/Sport, desc: " |- National Cups up to 2023"} + - {id: 67, cat: TV/Sport, desc: " |- Previous years matches"} + - {id: 188, cat: TV/Sport, desc: "Нидерланды/Netherlands"} + - {id: 189, cat: TV/Sport, desc: " |- VIP-Extra Eredividie"} + - {id: 568, cat: TV/Sport, desc: " |- VIP Netherlands"} + - {id: 356, cat: TV/Sport, desc: " |- Season 2023-24"} + - {id: 190, cat: TV/Sport, desc: " |- National Cups"} + - {id: 191, cat: TV/Sport, desc: " |- Previous years matches"} + - {id: 9, cat: TV/Sport, desc: "Другие национальные чемпионаты..."} + - {id: 233, cat: TV/Sport, desc: " |- VIP-Extra Switzerland"} + - {id: 240, cat: TV/Sport, desc: " |- VIP-Extra Belgium"} + - {id: 531, cat: TV/Sport, desc: " |- VIP-Extra Portugal"} + - {id: 551, cat: TV/Sport, desc: " |- VIP-Extra Japan"} + - {id: 214, cat: TV/Sport, desc: " |- VIP-Extra Others"} + - {id: 549, cat: TV/Sport, desc: " |- VIP Others"} + - {id: 537, cat: TV/Sport, desc: " |- VIP-Light All Champs"} + - {id: 573, cat: TV/Sport, desc: " |- VIP-Extra Argentina"} + - {id: 394, cat: TV/Sport, desc: " |- Бразилия/Brazil"} + - {id: 441, cat: TV/Sport, desc: " |- Португалия/Portugal"} + - {id: 87, cat: TV/Sport, desc: " |- Европа/Europe"} + - {id: 91, cat: TV/Sport, desc: " |- Южная Америка/South America"} + - {id: 90, cat: TV/Sport, desc: " |- Северная Америка/North America"} + - {id: 89, cat: TV/Sport, desc: " |- Африка/Africa"} + - {id: 88, cat: TV/Sport, desc: " |- Азия/Asia"} + - {id: 179, cat: TV/Sport, desc: " |- Previous years matches"} + - {id: 11, cat: TV/Sport, desc: "Еврокубки/European Cups"} + - {id: 523, cat: TV/Sport, desc: " |- ⚽️⚽️⚽️VIP-Ultra Archive UEFA"} + - {id: 376, cat: TV/Sport, desc: " |- ⚽️VIP-Extra UEFA Classic"} + - {id: 212, cat: TV/Sport, desc: " |- ⚽️VIP UEFA"} + - {id: 421, cat: TV/Sport, desc: " |- VIP-Light UEFA"} + - {id: 377, cat: TV/Sport, desc: " |- UEFA Super Cup"} + - {id: 74, cat: TV/Sport, desc: " |- UEFA Champions League"} + - {id: 75, cat: TV/Sport, desc: " |- UEFA Europa League"} + - {id: 411, cat: TV/Sport, desc: " |- UEFA Europa Conference League"} + - {id: 434, cat: TV/Sport, desc: " |- UEFA Youth League"} + - {id: 76, cat: TV/Sport, desc: " |- UEFA European Cup"} + - {id: 78, cat: TV/Sport, desc: " |- UEFA Cup"} + - {id: 79, cat: TV/Sport, desc: " |- Cup Winners Cup"} + - {id: 80, cat: TV/Sport, desc: " |- Other Compeitions"} + - {id: 328, cat: TV/Sport, desc: "Лига наций УЕФА / UEFA Nations League"} + - {id: 530, cat: TV/Sport, desc: " |- ⚽️VIP-Extra UEFA Nations League"} + - {id: 201, cat: TV/Sport, desc: " |- ⚽️VIP UEFA Nations League"} + - {id: 572, cat: TV/Sport, desc: " |- VIP-Light UEFA Nations League"} + - {id: 193, cat: TV/Sport, desc: " |- League A"} + - {id: 544, cat: TV/Sport, desc: " |- League B"} + - {id: 543, cat: TV/Sport, desc: " |- League C"} + - {id: 542, cat: TV/Sport, desc: " |- League D"} + - {id: 117, cat: TV/Sport, desc: " |- Play-off"} + - {id: 15, cat: TV/Sport, desc: "Чемпионаты Мира/FIFA World Cups"} + - {id: 461, cat: TV/Sport, desc: " |- ⚽️VIP-Extra FIFA WC Classic"} + - {id: 443, cat: TV/Sport, desc: " |- VIP-Extra 2023 FIFA U-20 World Cup"} + - {id: 576, cat: TV/Sport, desc: " |- VIP-Light FIFA WC 2026 Qualifiers"} + - {id: 454, cat: TV/Sport, desc: " |- FIFA WC 2026. Отборочный турнир"} + - {id: 383, cat: TV/Sport, desc: " |- 2023 FIFA U20 World Cup"} + - {id: 456, cat: TV/Sport, desc: " |- FIFA WC 2014. Финальный турнир"} + - {id: 168, cat: TV/Sport, desc: " |- FIFA WC 2014. Отборочный турнир"} + - {id: 495, cat: TV/Sport, desc: " |- FIFA WC 2014. Обзорные передачи"} + - {id: 178, cat: TV/Sport, desc: " |- FIFA WC U20"} + - {id: 153, cat: TV/Sport, desc: " |- FIFA WC U17"} + - {id: 218, cat: TV/Sport, desc: " |- VIP-Extra FIFA WC Old"} + - {id: 14, cat: TV/Sport, desc: "Чемпионаты Европы/UEFA European..."} + - {id: 242, cat: TV/Sport, desc: " |- ⚽️VIP-Extra EURO Classic"} + - {id: 380, cat: TV/Sport, desc: " |- ⚽️VIP-Extra EURO 2016"} + - {id: 546, cat: TV/Sport, desc: " |- VIP-Extra EURO 2023 U17 + U19 + U21"} + - {id: 198, cat: TV/Sport, desc: " |- VIP UEFA Euro 2024 qualifying"} + - {id: 195, cat: TV/Sport, desc: " |- UEFA Euro 2024 qualifying"} + - {id: 552, cat: TV/Sport, desc: " |- EURO 2016. Финальный турнир"} + - {id: 494, cat: TV/Sport, desc: " |- EURO 2016. Отборочный турнир"} + - {id: 350, cat: TV/Sport, desc: " |- EURO 2012. Финальный турнир"} + - {id: 118, cat: TV/Sport, desc: " |- EURO 2012. Отборочный турнир"} + - {id: 200, cat: TV/Sport, desc: " |- EURO U21"} + - {id: 337, cat: TV/Sport, desc: " |- EURO U19"} + - {id: 255, cat: TV/Sport, desc: " |- EURO U17"} + - {id: 414, cat: TV/Sport, desc: "Международные клубные турниры/I..."} + - {id: 533, cat: TV/Sport, desc: " |- VIP-Extra Clubs International"} + - {id: 243, cat: TV/Sport, desc: " |- VIP Clubs International"} + - {id: 539, cat: TV/Sport, desc: " |- VIP-Light Clubs International"} + - {id: 401, cat: TV/Sport, desc: " |- ⚽️VIP-Extra Copa Libertadores 2023"} + - {id: 526, cat: TV/Sport, desc: " |- ⚽️VIP-Extra Copa Sudamericana 2023"} + - {id: 399, cat: TV/Sport, desc: " |- ⚽️VIP-Extra CAF Competitions"} + - {id: 550, cat: TV/Sport, desc: " |- ⚽️VIP-Extra AFC Competitions"} + - {id: 524, cat: TV/Sport, desc: " |- VIP-Extra CONCACAF Competitions"} + - {id: 463, cat: TV/Sport, desc: " |- 2023 Copa Libertadores"} + - {id: 433, cat: TV/Sport, desc: " |- 2023 Copa Sudamericana"} + - {id: 457, cat: TV/Sport, desc: " |- FIFA Club World Cups"} + - {id: 472, cat: TV/Sport, desc: " |- CONCACAF Competitions"} + - {id: 241, cat: TV/Sport, desc: " |- Copa Libertadores"} + - {id: 367, cat: TV/Sport, desc: " |- Copa Sudamericana"} + - {id: 390, cat: TV/Sport, desc: " |- AFC Club Competitions"} + - {id: 10, cat: TV/Sport, desc: "Международные турниры/National Team..."} + - {id: 534, cat: TV/Sport, desc: " |- VIP-Extra 2023 CONCACAF Gold Cup"} + - {id: 466, cat: TV/Sport, desc: " |- VIP-Extra International"} + - {id: 560, cat: TV/Sport, desc: " |- VIP-Extra 2023 Sudamericano U20 + U17"} + - {id: 462, cat: TV/Sport, desc: " |- VIP-Extra CHAN 2023"} + - {id: 575, cat: TV/Sport, desc: " |- VIP CHAN 2023"} + - {id: 213, cat: TV/Sport, desc: " |- VIP International"} + - {id: 532, cat: TV/Sport, desc: " |- 2022 Africa Cup of Nations"} + - {id: 230, cat: TV/Sport, desc: " |- VIP-Extra Copa America 2021"} + - {id: 422, cat: TV/Sport, desc: " |- 2021 Copa America"} + - {id: 155, cat: TV/Sport, desc: " |- Copa America"} + - {id: 435, cat: TV/Sport, desc: " |- CONCACAF Competitions"} + - {id: 406, cat: TV/Sport, desc: " |- FIFA Confederations Cups"} + - {id: 239, cat: TV/Sport, desc: " |- Africa Cup of Nations"} + - {id: 507, cat: TV/Sport, desc: " |- AFC Asian Cups"} + - {id: 393, cat: TV/Sport, desc: " |- Sudamericano U-20"} + - {id: 16, cat: TV/Sport, desc: "Товарищеские турниры и матчи/Frie..."} + - {id: 387, cat: TV/Sport, desc: " |- ⚽️VIP-Extra Friendlies"} + - {id: 219, cat: TV/Sport, desc: " |- VIP Friendlies"} + - {id: 571, cat: TV/Sport, desc: " |- VIP-Light Friendlies"} + - {id: 554, cat: TV/Sport, desc: " |- 2019 International Champions Cup"} + - {id: 18, cat: TV/Sport, desc: "Мини-футбол/Футзал"} + - {id: 19, cat: TV/Sport, desc: "Пляжный футбол"} + - {id: 499, cat: TV/Sport, desc: "Женский футбол"} + - {id: 92, cat: TV/Sport, desc: " |- Лига Чемпионов"} + - {id: 17, cat: TV/Sport, desc: "Обзорные и аналитические..."} + - {id: 37, cat: TV/Sport, desc: "Футбольное видео, прочее о..."} + - {id: 199, cat: TV/Sport, desc: " |- Видео для мобильных устройств"} + - {id: 86, cat: TV/Sport, desc: " |- Футбольная графика"} + - {id: 43, cat: TV/Sport, desc: "Аудиопередачи /Футбольное..."} + # Спорт / Sport + - {id: 23, cat: TV/Sport, desc: "Авто/мотоспорт"} + - {id: 131, cat: TV/Sport, desc: " |- Formula 1. Season 2024"} + - {id: 492, cat: TV/Sport, desc: " |- Formula 1. Season 2023"} + - {id: 400, cat: TV/Sport, desc: " |- Formula 1. Seasons until 2022"} + - {id: 21, cat: TV/Sport, desc: "Хоккей"} + - {id: 420, cat: TV/Sport, desc: " |- ЧМ 2023 / IIHF WС 2023"} + - {id: 501, cat: TV/Sport, desc: " |- ЧМ 2022 U-20 / IIHF WС 2022 U-20"} + - {id: 445, cat: TV/Sport, desc: " |- NHL 2023/24"} + - {id: 444, cat: TV/Sport, desc: " |- КХЛ 2023/24"} + - {id: 207, cat: TV/Sport, desc: " |- КХЛ 2022/23"} + - {id: 391, cat: TV/Sport, desc: " |- NHL 2022/23"} + - {id: 151, cat: TV/Sport, desc: " |- NHL до 2023"} + - {id: 47, cat: TV/Sport, desc: " |- КХЛ до 2023"} + - {id: 460, cat: TV/Sport, desc: " |- World Championships until 2022"} + - {id: 206, cat: TV/Sport, desc: " |- European club championships"} + - {id: 222, cat: TV/Sport, desc: " |- Euro Hockey Tour"} + - {id: 49, cat: TV/Sport, desc: " |- International tournaments"} + - {id: 468, cat: TV/Sport, desc: " |- СССР - Канада"} + - {id: 20, cat: TV/Sport, desc: "Баскетбол"} + - {id: 50, cat: TV/Sport, desc: " |- NBA 2023-24"} + - {id: 453, cat: TV/Sport, desc: " |- NCAA"} + - {id: 204, cat: TV/Sport, desc: " |- WNBA"} + - {id: 150, cat: TV/Sport, desc: " |- NBA до 2023"} + - {id: 51, cat: TV/Sport, desc: " |- European club basketball"} + - {id: 197, cat: TV/Sport, desc: " |- World Championships. Men"} + - {id: 379, cat: TV/Sport, desc: " |- World Championships. Women"} + - {id: 446, cat: TV/Sport, desc: " |- European Championships"} + - {id: 171, cat: TV/Sport, desc: " |- International tournaments"} + - {id: 203, cat: TV/Sport, desc: " |- Women's basketball"} + - {id: 22, cat: TV/Sport, desc: "Теннис"} + - {id: 274, cat: TV/Sport, desc: " |- VIP-Extra Tennis"} + - {id: 227, cat: TV/Sport, desc: " |- Australian Open 2023"} + - {id: 248, cat: TV/Sport, desc: " |- Roland Garros 2023"} + - {id: 388, cat: TV/Sport, desc: " |- Wimbledon 2023"} + - {id: 459, cat: TV/Sport, desc: " |- US Open 2023"} + - {id: 505, cat: TV/Sport, desc: " |- ATP 1000 WT Masters 2023"} + - {id: 502, cat: TV/Sport, desc: " |- ATP 250/500 World Tour 2023"} + - {id: 504, cat: TV/Sport, desc: " |- WTA Tour 2023"} + - {id: 503, cat: TV/Sport, desc: " |- Team Season 2023"} + - {id: 128, cat: TV/Sport, desc: " |- Grand Slam Tournaments up to 2022"} + - {id: 127, cat: TV/Sport, desc: " |- ATP WT Masters 1000 up to 2022"} + - {id: 125, cat: TV/Sport, desc: " |- ATP World Tour up to 2022"} + - {id: 126, cat: TV/Sport, desc: " |- WTA Tour up to 2022"} + - {id: 130, cat: TV/Sport, desc: " |- Team Season up to 2022"} + - {id: 129, cat: TV/Sport, desc: " |- Matches of previous years"} + - {id: 44, cat: TV/Sport, desc: "Биатлон"} + - {id: 498, cat: TV/Sport, desc: " |- Season 2023"} + - {id: 455, cat: TV/Sport, desc: " |- Seasons until 2022"} + - {id: 82, cat: TV/Sport, desc: "Гандбол"} + - {id: 548, cat: TV/Sport, desc: " |- VIP-Extra Handball"} + - {id: 205, cat: TV/Sport, desc: " |- VIP Handball"} + - {id: 469, cat: TV/Sport, desc: " |- WC's and EURO's. Men"} + - {id: 547, cat: TV/Sport, desc: " |- WC's and EURO's. Women"} + - {id: 397, cat: TV/Sport, desc: " |- European club handball"} + - {id: 398, cat: TV/Sport, desc: " |- International tournaments"} + - {id: 38, cat: TV/Sport, desc: "Волейбол"} + - {id: 261, cat: TV/Sport, desc: " |- Лига наций"} + - {id: 262, cat: TV/Sport, desc: " |- Клубный волейбол"} + - {id: 170, cat: TV/Sport, desc: " |- Международные турниры"} + - {id: 169, cat: TV/Sport, desc: " |- Пляжный волейбол"} + - {id: 25, cat: TV/Sport, desc: "Боевые единоборства"} + - {id: 98, cat: TV/Sport, desc: " |- Бокс"} + - {id: 101, cat: TV/Sport, desc: " |- Рестлинг"} + - {id: 100, cat: TV/Sport, desc: " |- Mixed Martial Arts"} + - {id: 99, cat: TV/Sport, desc: " |- Ultimate Fighting Championship"} + - {id: 97, cat: TV/Sport, desc: " |- Боевые искусства"} + - {id: 137, cat: TV/Sport, desc: "Легкая атлетика"} + - {id: 139, cat: TV/Sport, desc: "Тяжелая атлетика"} + - {id: 122, cat: TV/Sport, desc: "Бильярд"} + - {id: 123, cat: TV/Sport, desc: " |- Снукер"} + - {id: 106, cat: TV/Sport, desc: "Покер"} + - {id: 140, cat: TV/Sport, desc: "Велоспорт"} + - {id: 141, cat: TV/Sport, desc: "Гимнастика"} + - {id: 24, cat: TV/Sport, desc: "Зимние виды спорта"} + - {id: 142, cat: TV/Sport, desc: " |- Фигурное катание"} + - {id: 105, cat: TV/Sport, desc: " |- Лыжи"} + - {id: 104, cat: TV/Sport, desc: " |- Горные лыжи"} + - {id: 149, cat: TV/Sport, desc: " |- Фристайл и сноуборд"} + - {id: 103, cat: TV/Sport, desc: " |- Прыжки с трамплина"} + - {id: 148, cat: TV/Sport, desc: " |- Кёрлинг"} + - {id: 96, cat: TV/Sport, desc: " |- Всемирные зимние Универсиады"} + - {id: 192, cat: TV/Sport, desc: "Летние виды спорта"} + - {id: 143, cat: TV/Sport, desc: " |- Бадминтон"} + - {id: 144, cat: TV/Sport, desc: " |- Настольный теннис"} + - {id: 147, cat: TV/Sport, desc: " |- Гольф"} + - {id: 439, cat: TV/Sport, desc: " |- Всемирные летние Универсиады"} + - {id: 138, cat: TV/Sport, desc: "Водные виды спорта"} + - {id: 121, cat: TV/Sport, desc: "Бейсбол"} + - {id: 145, cat: TV/Sport, desc: "Американский футбол"} + - {id: 541, cat: TV/Sport, desc: " |- VIP-Extra American football"} + - {id: 26, cat: TV/Sport, desc: "Другие виды спорта"} + - {id: 146, cat: TV/Sport, desc: " |- Регби"} + - {id: 95, cat: TV/Sport, desc: "Информационно-аналитические..."} + - {id: 180, cat: TV/Sport, desc: "Разное о спорте"} + - {id: 182, cat: TV/Sport, desc: " |- Спортивная литература"} + - {id: 181, cat: TV/Sport, desc: " |- Спортивное видео"} + - {id: 183, cat: TV/Sport, desc: " |- Обучающее видео"} + # Летняя Олимпиада 2020 / Summer Olympic Games 2020 + - {id: 276, cat: TV/Sport, desc: "Football / Soccer"} + - {id: 277, cat: TV/Sport, desc: " |- VIP-Extra Football"} + - {id: 359, cat: TV/Sport, desc: " |- Men"} + - {id: 360, cat: TV/Sport, desc: " |- Women"} + - {id: 301, cat: TV/Sport, desc: "Basketball / 3x3 basketball"} + - {id: 522, cat: TV/Sport, desc: " |- VIP-Extra Basketball"} + - {id: 362, cat: TV/Sport, desc: " |- Men"} + - {id: 361, cat: TV/Sport, desc: " |- Women"} + - {id: 308, cat: TV/Sport, desc: "Handball"} + - {id: 245, cat: TV/Sport, desc: " |- VIP-Extra Handball"} + - {id: 366, cat: TV/Sport, desc: " |- Men"} + - {id: 365, cat: TV/Sport, desc: " |- Women"} + - {id: 305, cat: TV/Sport, desc: "Volleyball"} + - {id: 368, cat: TV/Sport, desc: " |- VIP-Extra Volleyball"} + - {id: 364, cat: TV/Sport, desc: " |- Men"} + - {id: 363, cat: TV/Sport, desc: " |- Women"} + - {id: 306, cat: TV/Sport, desc: " |- Beach volleyball"} + - {id: 325, cat: TV/Sport, desc: "Tennis"} + - {id: 520, cat: TV/Sport, desc: " |- VIP-Extra Tennis"} + - {id: 326, cat: TV/Sport, desc: " |- Table tennis"} + - {id: 316, cat: TV/Sport, desc: "Athletics"} + - {id: 291, cat: TV/Sport, desc: " |- VIP-Extra Athletics"} + - {id: 285, cat: TV/Sport, desc: " |- Men"} + - {id: 286, cat: TV/Sport, desc: " |- Women"} + - {id: 318, cat: TV/Sport, desc: "Weightlifting"} + - {id: 298, cat: TV/Sport, desc: " |- VIP-Extra Weightlifting"} + - {id: 288, cat: TV/Sport, desc: " |- Men"} + - {id: 289, cat: TV/Sport, desc: " |- Women"} + - {id: 278, cat: TV/Sport, desc: "Aquatics"} + - {id: 290, cat: TV/Sport, desc: " |- VIP-Extra Aquatics"} + - {id: 280, cat: TV/Sport, desc: " |- Swimming"} + - {id: 281, cat: TV/Sport, desc: " |- Diving"} + - {id: 282, cat: TV/Sport, desc: " |- Artistic swimming"} + - {id: 279, cat: TV/Sport, desc: " |- Water polo"} + - {id: 284, cat: TV/Sport, desc: " |- Canoeing - Rowing - Sailing - Surfing"} + - {id: 303, cat: TV/Sport, desc: "Boxing / Wrestling / Judo / Karate / Taekwondo"} + - {id: 518, cat: TV/Sport, desc: " |- VIP-Extra"} + - {id: 310, cat: TV/Sport, desc: "Gymnastics"} + - {id: 312, cat: TV/Sport, desc: " |- Artistic - Спортивная"} + - {id: 311, cat: TV/Sport, desc: " |- Rhythmic - Художественная"} + - {id: 313, cat: TV/Sport, desc: " |- Trampoline - Прыжки на батуте"} + - {id: 294, cat: TV/Sport, desc: "Cycling"} + - {id: 519, cat: TV/Sport, desc: " |- VIP-Extra Cycling"} + - {id: 296, cat: TV/Sport, desc: " |- Track cycling"} + - {id: 297, cat: TV/Sport, desc: " |- Road cycling"} + - {id: 299, cat: TV/Sport, desc: " |- Mountain biking - BMX freestyle - racing"} + - {id: 287, cat: TV/Sport, desc: "Конный спорт / Equestrian / Dressage /..."} + - {id: 322, cat: TV/Sport, desc: "Archery / Fencing / Shooting"} + - {id: 254, cat: TV/Sport, desc: " |- VIP-Extra"} + - {id: 333, cat: TV/Sport, desc: "Other sports"} + - {id: 371, cat: TV/Sport, desc: " |- VIP-Extra Field hockey"} + - {id: 335, cat: TV/Sport, desc: " |- Field hockey"} + - {id: 358, cat: TV/Sport, desc: " |- Badminton"} + - {id: 320, cat: TV/Sport, desc: " |- Rugby sevens"} + - {id: 283, cat: TV/Sport, desc: " |- Baseball - Softball"} + - {id: 319, cat: TV/Sport, desc: " |- Modern pentathlon - Triathlon"} + - {id: 336, cat: TV/Sport, desc: " |- Golf - Skateboarding - Sport climbing"} + - {id: 349, cat: TV/Sport, desc: "Обзорные передачи / Reviews"} + # Разное / Other + - {id: 229, cat: TV/Sport, desc: "Тестовый форум"} + # Администраторский + - {id: 417, cat: TV/Sport, desc: "2021-22 UEFA Europa League"} + - {id: 132, cat: TV/Sport, desc: " |- ⚽️VIP-Extra 2023-24 UEFA Europa Conference League"} + - {id: 202, cat: TV/Sport, desc: " |- VIP-Extra UCL 2016-17"} + - {id: 431, cat: TV/Sport, desc: " |- VIP-Extra UEL 2016-17"} + - {id: 440, cat: TV/Sport, desc: " |- VIP-Extra UСL 2015-16"} + - {id: 381, cat: TV/Sport, desc: " |- VIP-Extra UEL 2015-16"} + - {id: 557, cat: TV/Sport, desc: " |- VIP-Extra UCL 2014-15"} + - {id: 556, cat: TV/Sport, desc: " |- VIP-Extra UEL 2014-15"} + - {id: 514, cat: TV/Sport, desc: " |- VIP-Extra UСL 2013-14"} + - {id: 513, cat: TV/Sport, desc: " |- VIP-Extra UEL 2013-14"} + - {id: 508, cat: TV/Sport, desc: " |- VIP 2021 Copa America"} + # Приватные разделы + - {id: 509, cat: TV/Sport, desc: " |- VIP-Extra 2019 FIFA U-17 World Cup"} + - {id: 510, cat: TV/Sport, desc: " |- VIP 2019 FIFA U-17 World Cup"} + - {id: 429, cat: TV/Sport, desc: " |- VIP-Extra Real Madrid 2020-21"} + + modes: + search: [q] + tv-search: [q, season, ep] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + - name: ignorevip + type: checkbox + label: Ignore VIP torrents + default: false + - name: sort + type: select + label: Sort requested from site + default: 1 + options: + 1: created + 10: seeders + 7: size + - name: type + type: select + label: Order requested from site + default: 2 + options: + 2: desc + 1: asc + +login: + path: login.php + method: form + form: form[action$="/login.php"] + inputs: + login_username: "{{ .Config.username }}" + login_password: "{{ .Config.password }}" + autologin: 1 + redirect: index.php + login: Вход + selectorinputs: + cookie_test: + selector: input[name="cookie_test"] + attribute: value + error: + - selector: h4.warnColor1 + test: + path: index.php + selector: a[href="./login.php?logout=1"] + +search: + paths: + - path: tracker.php + inputs: + $raw: "{{ if .Categories }}{{ range .Categories }}f[]={{.}}&{{end}}{{ else }}f[]=-1{{ end }}" + prev_allw: 1 + prev_a: 0 + prev_not_checked: 0 + prev_closed: 0 + prev_d: 0 + prev_not_perfect: 0 + prev_part_perfect: 0 + prev_fishily: 0 + prev_copy: 0 + prev_dla: 0 + prev_dlc: 0 + prev_dld: 0 + prev_dlw: 0 + prev_my: 0 + prev_new: 0 + prev_sd: 0 + prev_da: 1 + prev_dc: 0 + prev_df: 1 + prev_ds: 0 + # sort by 1=registered 4=completed 10=seed 11=leech 7=size 8=lastPost + o: "{{ .Config.sort }}" + # 1=asc 2=desc + s: "{{ .Config.type }}" + # -1=all time + tm: -1 + nm: "{{ .Keywords }}" + + headers: + User-Agent: ["Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.203"] + + rows: + selector: "tr[id^=\"tor_\"]:has(a[href^=\"./download.php?id=\"]){{ if .Config.ignorevip }}:not(:has(a.gen:contains(\"VIP\"))){{ else }}{{ end }}{{ if .Config.freeleech }}:has(img[src=\"images/tor_gold.gif\"]){{ else }}{{ end }}" + + fields: + category: + selector: a.gen + attribute: href + filters: + - name: querystring + args: f + title: + selector: a.tLink + details: + selector: a.tLink + attribute: href + description: + selector: a.gen + download: + selector: a[href^="./download.php?id="] + attribute: href + size: + selector: td:nth-child(6) > u + seeders: + selector: td.seedmed > b + leechers: + selector: td.leechmed > b + grabs: + selector: td:nth-child(9) + date: + # unix + selector: td:last-child > u + downloadvolumefactor: + case: + img[src="images/tor_gold.gif"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 +# TorrentPier diff --git a/config/prowlarr/Definitions/rintor.yml b/config/prowlarr/Definitions/rintor.yml new file mode 100644 index 0000000..e7f82a0 --- /dev/null +++ b/config/prowlarr/Definitions/rintor.yml @@ -0,0 +1,187 @@ +--- +id: rintor +name: RinTor +description: "RinTor is a Semi-Private Tracker for 3X" +language: ru-RU +type: semi-private +encoding: UTF-8 +links: + - https://rintor.org/ + +caps: + categorymappings: + # Зарубежныепорнофильмы|Pornofilms + - {id: 71, cat: XXX, desc: "Фильмы UHD | 4K UHD (2160p) Movies"} + - {id: 26, cat: XXX, desc: "HD порнофильмы | HD Porn Movies"} + - {id: 20, cat: XXX, desc: "Гонзо Фильмы | Gonzo & All Sex"} + - {id: 22, cat: XXX, desc: "Лесбо Фильмы | Lesbo Movies"} + - {id: 23, cat: XXX, desc: "Этнические фильмы | Ethnic Movies"} + - {id: 21, cat: XXX, desc: "Фильмы с сюжетом | Feature"} + - {id: 64, cat: XXX, desc: "Эротические фильмы | Erotic Films"} + - {id: 25, cat: XXX, desc: "Классика | Classic Porn"} + # Порноролики|Porn Clips "> + - {id: 65, cat: XXX, desc: "Инцест и Табу (Инсценировка) | Incest and Taboo..."} + - {id: 28, cat: XXX, desc: "Сайтрипы HD | SiteRip's HD Video"} + - {id: 29, cat: XXX, desc: "Сайтрипы UHD | 4K UHD (2160p) Porn Video"} + - {id: 27, cat: XXX, desc: "Сайтрипы | SiteRip's"} + - {id: 31, cat: XXX, desc: "Сцены из фильмов | Movie Scenes"} + - {id: 32, cat: XXX, desc: "Порноролики Разное | Various Clips"} + - {id: 66, cat: XXX, desc: "Лесбо Порноролики | Lesbo Vids"} + - {id: 67, cat: XXX, desc: "Порно Кастинг | Porno Casting"} + - {id: 35, cat: XXX, desc: "Японское порно | Japan Porn"} + # Русскоепорно|Russian Porn "> + - {id: 36, cat: XXX, desc: "Русские порнофильмы | Russian Porn Films"} + - {id: 37, cat: XXX, desc: "Русские Порноролики Разное | Russian Clips (various)"} + - {id: 38, cat: XXX, desc: "Русское любительское порно видео | Russian Amateur Porn..."} + # ЭротическиестудиииФотосеты,Комиксы,Журналы|Erotic,Pictures,Magazines & Comix "> + - {id: 40, cat: XXX, desc: "Эротические студии Фото | Erotic Picture Gallery"} + - {id: 42, cat: XXX, desc: "Любительское фото | Amateur Picture"} + - {id: 44, cat: XXX, desc: "Подборки сетов | Picture Sets"} + - {id: 45, cat: XXX, desc: "Нетрадиционное порно фото"} + - {id: 46, cat: XXX, desc: "Комиксы и рисунки, Журналы | Magazines & Comix"} + # Нетрадиционноепорно|Special Interest Porn "> + - {id: 47, cat: XXX, desc: "Бисексуалы | Bisexual"} + - {id: 48, cat: XXX, desc: "Транссексуалы | Shemale Transsexual"} + - {id: 49, cat: XXX, desc: "БДСМ | BDSM"} + - {id: 50, cat: XXX, desc: "Женское доминирование и страпон | Femdom & Strapon"} + - {id: 51, cat: XXX, desc: "Подглядывание | Voyeur"} + - {id: 52, cat: XXX, desc: "Фистинг и дилдо | Fisting & Dildo"} + - {id: 53, cat: XXX, desc: "Беременные | Pregnant Preggo"} + - {id: 54, cat: XXX, desc: "Буккаке | Bukkake"} + - {id: 55, cat: XXX, desc: "Мочеиспускание | Peeing"} + - {id: 56, cat: XXX, desc: "Фетиш | Fetish"} + # Мультфильмы,Хентайиигры|Сartoons,Hentai & Games "> + - {id: 58, cat: XXX, desc: "Хентай"} + - {id: 59, cat: XXX, desc: "Игры"} + - {id: 60, cat: XXX, desc: "Порно Мультики"} + # Гей-порно|Gay porn "> + - {id: 61, cat: XXX, desc: "Полнометражные гей-фильмы | Full Length Gay Movies"} + - {id: 62, cat: XXX, desc: "Ролики, SiteRip'ы и сцены из гей-фильмов | Gay Clips..."} + + modes: + search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: sort + type: select + label: Sort requested from site + default: 1 + options: + 1: created + 10: seeders + 7: size + 2: title + - name: type + type: select + label: Order requested from site + default: 2 + options: + 2: desc + 1: asc + +login: + path: login.php + method: post + inputs: + "login_username": "{{ .Config.username }}" + "login_password": "{{ .Config.password }}" + autologin: 1 + login: "Вход" + error: + - selector: table.error + test: + path: tracker.php + selector: a[href="./login.php?logout=1"] + +search: + paths: + - path: tracker.php + method: post + inputs: + prev_allw: 1 + prev_a: 0 + prev_dla: 0 + prev_dlc: 0 + prev_dld: 0 + prev_dlw: 0 + prev_my: 0 + prev_new: 0 + prev_sd: 0 + prev_da: 1 + prev_dc: 0 + prev_df: 1 + prev_ds: 0 + prev_tor_type: 0 + # sort by 1=registered 2=topicTitle 4=completed 10=seed 11=leech 12=up 13=down 5=replies 6=views 7=size 8=lastPost 9=seedLastSeen + o: "{{ .Config.sort }}" + # 1=asc 2=desc + s: "{{ .Config.type }}" + # show category + dc: 0 + # show forum + df: 1 + # show author + da: 1 + # show speed + ds: 0 + # -1=all time + tm: -1 + # seed not seen -1=disregard + sns: -1 + # group releases -1=not selected + srg: -1 + nm: "{{ .Keywords }}" + # find a username + pn: "" + # despite the all words flag the search engine returns anywords matching. + allw: 1 + $raw: "{{ if .Categories }}{{ range .Categories }}&f[]={{.}}{{end}}{{ else }}&f[]=-1{{ end }}" + keywordsfilters: + - name: re_replace + args: ["(\\w+)", "+$1"] # prepend + to each word + + rows: + selector: tr[id^="tor_"]:has(span.tor-approved) # only approved tors have .torrent and magnets. + filters: + - name: andmatch + + fields: + category: + selector: a[href^="tracker.php?f="] + attribute: href + filters: + - name: querystring + args: f + title: + selector: td a.tLink + details: + selector: td a.tLink + attribute: href + download: + selector: a[href^="./dl.php?id="] + attribute: href + magnet: + selector: a[href^="magnet:?xt="] + attribute: href + size: + selector: td:nth-child(6) u + grabs: + selector: td:nth-child(9) + seeders: + selector: td.seedmed + leechers: + selector: td.leechmed + date: + # unix + selector: td:nth-child(10) u + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/rintornet.yml b/config/prowlarr/Definitions/rintornet.yml new file mode 100644 index 0000000..e89644d --- /dev/null +++ b/config/prowlarr/Definitions/rintornet.yml @@ -0,0 +1,105 @@ +--- +id: rintornet +name: RinTor.NeT +description: "RinTor.NeT is a RUSSIAN Public tracker for 3X" +language: ru-RU +type: public +encoding: UTF-8 +links: + - https://www.rintor.net/ + +caps: + categorymappings: + - {id: 27, cat: XXX, desc: "Фильмы 2160 4K | Movies 2160p 4K"} + - {id: 20, cat: XXX, desc: "Сайтрипы 2160 4K | Porn Video 2160p 4K"} + - {id: 1, cat: XXX, desc: "Фильмы HD | Movies HD"} + - {id: 12, cat: XXX, desc: "Фильмы SD | Movies SD"} + - {id: 30, cat: XXX, desc: "Сайтрип HD | SiteRip HD"} + - {id: 9, cat: XXX, desc: "Сайтрип SD | SiteRip SD"} + - {id: 10, cat: XXX, desc: "Любительское видео | Amateur Video"} + - {id: 24, cat: XXX, desc: "Инцест (Инсценировка) | Incest (Simulation)"} + - {id: 22, cat: XXX, desc: "Лесбиянки | Lesbians"} + - {id: 26, cat: XXX, desc: "Порно Кастинг | Porno Casting"} + - {id: 29, cat: XXX, desc: "Японское (Без Цензуры) | Japanese Porn (Uncen)"} + - {id: 23, cat: XXX, desc: "Ретро Порно, Классика | Retro Porn, Classic"} + - {id: 21, cat: XXX, desc: "Женское Доминирование, Страпон | Femdom, StrapOn"} + - {id: 17, cat: XXX, desc: "БДСМ, Фистинг, Дилдо | BDSM, Fisting, Dildo"} + - {id: 19, cat: XXX, desc: "Беременные | Pregnant"} + - {id: 28, cat: XXX, desc: "Буккаке | Bukkake"} + - {id: 25, cat: XXX, desc: "Мочеиспускание | Peeing"} + - {id: 16, cat: XXX, desc: "Транссексуалы | Shemale Transsexual"} + - {id: 11, cat: XXX, desc: "Подборки сетов | Picture Sets Packs"} + - {id: 14, cat: XXX, desc: "Порно Мультфильмы | Porno Cartoons"} + - {id: 13, cat: XXX, desc: "Порно Игры | Porn Games"} + - {id: 15, cat: XXX, desc: "Гей и Бисекс Порно | Gay and Bisex Porn"} + + modes: + search: [q] + +settings: [] + +download: + selectors: + - selector: a[href^="magnet:?xt="] + attribute: href + +search: + paths: + - path: index.php + inputs: + do: search + subaction: search + story: "{{ if .Keywords }}{{ .Keywords }}{{ else }}{{ .Today.Year }}{{ end }}" + titleonly: 3 + sortby: date + resorder: desc + showposts: 0 + $raw: "{{ range .Categories }}catlist[]={{.}}&{{end}}" + + rows: + selector: div.entry:has(div.entry__title) + + fields: + categorydesc: + selector: div.entry__info > span > a + title: + selector: div.entry__title > h3 > a + details: + selector: div.entry__title > h3 > a + attribute: href + download: + selector: div.entry__title > h3 > a + attribute: href + poster: + selector: div.entry_content a.entry__content-image img + attribute: src + date_day: + selector: span.entry__date:contains("Вчера"), span.entry__date:contains("Сегодня") + optional: true + filters: + - name: replace + args: ["Вчера", "Yesterday"] + - name: replace + args: ["Сегодня", "Today"] + - name: fuzzytime + date_year: + selector: span.entry__date:contains("-") + optional: true + filters: + - name: append + args: " +03:00" # MSK + - name: dateparse + args: "d-MM-yyyy, HH:mm zzz" + date: + text: "{{ if or .Result.date_year .Result.date_day }}{{ or .Result.date_year .Result.date_day }}{{ else }}now{{ end }}" + size: + text: "1 GB" + seeders: + text: 1 + leechers: + text: 1 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/riperam.yml b/config/prowlarr/Definitions/riperam.yml new file mode 100644 index 0000000..9b68cd0 --- /dev/null +++ b/config/prowlarr/Definitions/riperam.yml @@ -0,0 +1,1013 @@ +--- +id: riperam +name: RiperAM +description: "RiperAM is a RUSSIAN Semi-Private Torrent Tracker for MOVIES / TV" +language: ru-RU +type: semi-private +encoding: UTF-8 +links: + - https://riperam.org/ +legacylinks: + - http://riperam.org/ + +caps: + categorymappings: + - {id: 238, cat: Movies, desc: "Новинки кино (2024). Новые фильмы скачать бесплатно"} + - {id: 425, cat: Movies/HD, desc: "DVDRip / DVD-5/DVD-9"} + - {id: 50, cat: Movies/HD, desc: "DVDRip"} + - {id: 52, cat: Movies/HD, desc: "DVD-5/DVD-9"} + - {id: 424, cat: Movies/HD, desc: "BDRip / HDRip / BD / HD / Blu - ray / Ultra HD (4K)"} + - {id: 51, cat: Movies/HD, desc: "BDRip/HDRip"} + - {id: 371, cat: Movies/HD, desc: "BD / HD"} + - {id: 251, cat: Movies/BluRay, desc: "Blu-ray"} + - {id: 1404, cat: Movies/UHD, desc: "Ultra HD (4K)"} + - {id: 349, cat: Movies, desc: "Видео для мобильных устройств"} + - {id: 350, cat: Movies, desc: "Видео (iPhone, iPod Touch)"} + - {id: 351, cat: Movies, desc: "HD Видео (Apple TV, iPad)"} + - {id: 352, cat: Movies, desc: "Видео для смартфонов и КПК"} + - {id: 239, cat: Movies, desc: "Фильмы, мультфильмы"} + - {id: 420, cat: Movies, desc: "Зарубежные фильмы"} + - {id: 12, cat: Movies, desc: "Зарубежные фильмы до 2000го года..."} + - {id: 13, cat: Movies, desc: "Зарубежные фильмы после 2000го года..."} + - {id: 1476, cat: Movies, desc: "Зарубежные фильмы Blu-Ray"} + - {id: 1475, cat: Movies, desc: "Зарубежные фильмы 4К"} + - {id: 423, cat: TV/Anime, desc: "Мультфильмы"} + - {id: 16, cat: TV/Anime, desc: "Зарубежные мультфильмы"} + - {id: 17, cat: TV/Anime, desc: "Советские мультфильмы"} + - {id: 18, cat: TV/Anime, desc: "Российские мультфильмы"} + - {id: 15, cat: TV/Anime, desc: "Российские фильмы"} + - {id: 14, cat: TV/Anime, desc: "Советские фильмы"} + - {id: 240, cat: TV, desc: "Сериалы, мультсериалы"} + - {id: 19, cat: TV, desc: "Зарубежные сериалы"} + - {id: 216, cat: TV, desc: "!!! Полные завершенные сезоны !!!"} + - {id: 118, cat: TV, desc: "H2O - Просто добавь воды (3й сезон! Озвучка RiperAM!)"} + - {id: 153, cat: TV, desc: "Split. Тайна крови"} + - {id: 363, cat: TV, desc: "Адские кошки / Hellcats"} + - {id: 1055, cat: TV, desc: "Виолетта / Violetta"} + - {id: 632, cat: TV, desc: "Вспышка-любовь / Popland!"} + - {id: 183, cat: TV, desc: "Грань"} + - {id: 178, cat: TV, desc: "Гимнастки"} + - {id: 364, cat: TV, desc: "Дайте Санни шанс / Sonny With A Chance"} + - {id: 319, cat: TV, desc: "Два короля / Pair of Kings"} + - {id: 267, cat: TV, desc: "Держись, Чарли / Good Luck"} + - {id: 1166, cat: TV, desc: "Мушкетеры / The Musketeers"} + - {id: 365, cat: TV, desc: "Никита / Nikita"} + - {id: 353, cat: TV, desc: "Обитель Анубиса / House of Anubis"} + - {id: 710, cat: TV, desc: "Проспект Бразилии / Avenida Brasil"} + - {id: 266, cat: TV, desc: "Сверхъестественное / Supernatural"} + - {id: 268, cat: TV, desc: "Следствие по телу / Body of Proof"} + - {id: 160, cat: TV, desc: "Теория большого взрыва"} + - {id: 20, cat: TV, desc: "Русские сериалы"} + - {id: 210, cat: TV, desc: "!!! Полные завершенные сериалы !!!"} + - {id: 969, cat: TV, desc: "13"} + - {id: 707, cat: TV, desc: "Агент"} + - {id: 1028, cat: TV, desc: "Белые волки"} + - {id: 736, cat: TV, desc: "Бомбила. Продолжение"} + - {id: 550, cat: TV, desc: "Брат за брата"} + - {id: 601, cat: TV, desc: "Братаны"} + - {id: 979, cat: TV, desc: "В Москве всегда солнечно"} + - {id: 790, cat: TV, desc: "Горюнов"} + - {id: 791, cat: TV, desc: "Груз (Фельдъегеря)"} + - {id: 803, cat: TV, desc: "Двойная жизнь"} + - {id: 994, cat: TV, desc: "Дворняжка Ляля / Красотка Ляля / Ляля. Возвращение"} + - {id: 735, cat: TV, desc: "Дело врачей"} + - {id: 992, cat: TV, desc: "Дело для двоих"} + - {id: 771, cat: TV, desc: "Департамент"} + - {id: 964, cat: TV, desc: "Дом с лилиями"} + - {id: 746, cat: TV, desc: "Домработница"} + - {id: 976, cat: TV, desc: "До свидания, мальчики"} + - {id: 719, cat: TV, desc: "ЗАГС"} + - {id: 1006, cat: TV, desc: "Женщины на грани"} + - {id: 768, cat: TV, desc: "Земский доктор - Возвращение"} + - {id: 984, cat: TV, desc: "Земский доктор. Любовь вопреки"} + - {id: 732, cat: TV, desc: "Икорный барон"} + - {id: 983, cat: TV, desc: "Королева игры"} + - {id: 774, cat: TV, desc: "Кулинар-2"} + - {id: 989, cat: TV, desc: "Курортная полиция"} + - {id: 961, cat: TV, desc: "Личное дело"} + - {id: 639, cat: TV, desc: "Ловушка"} + - {id: 1013, cat: TV, desc: "Лучшие враги"} + - {id: 131, cat: TV, desc: "Майор полиции"} + - {id: 727, cat: TV, desc: "Маяковский - Два дня"} + - {id: 1058, cat: TV, desc: "Между двух огней"} + - {id: 641, cat: TV, desc: "Мент в законе-7"} + - {id: 644, cat: TV, desc: "Метод Лавровой-2"} + - {id: 779, cat: TV, desc: "Неzлоб"} + - {id: 372, cat: TV, desc: "Неравный брак"} + - {id: 957, cat: TV, desc: "Неформат"} + - {id: 766, cat: TV, desc: "ОСА"} + - {id: 991, cat: TV, desc: "Отмена всех ограничений"} + - {id: 653, cat: TV, desc: "Патруль. Васильевский остров"} + - {id: 962, cat: TV, desc: "Под прицелом"} + - {id: 683, cat: TV, desc: "Поцелуй"} + - {id: 708, cat: TV, desc: "Поцелуйте невесту"} + - {id: 1026, cat: TV, desc: "Профессионал"} + - {id: 787, cat: TV, desc: "Пропавшие без вести"} + - {id: 773, cat: TV, desc: "Пыльная работа"} + - {id: 799, cat: TV, desc: "Ржавчина"} + - {id: 794, cat: TV, desc: "Сашка"} + - {id: 756, cat: TV, desc: "Семейные обстоятельства"} + - {id: 706, cat: TV, desc: "Семин. Возмездие"} + - {id: 966, cat: TV, desc: "Скорая помощь"} + - {id: 960, cat: TV, desc: "Следователь Протасов"} + - {id: 714, cat: TV, desc: "Стервы"} + - {id: 755, cat: TV, desc: "Студия 17"} + - {id: 1039, cat: TV, desc: "Тайны следствия"} + - {id: 360, cat: TV, desc: "Такси"} + - {id: 981, cat: TV, desc: "Темный мир: Равновесие"} + - {id: 1046, cat: TV, desc: "Тест на беременность"} + - {id: 977, cat: TV, desc: "Тихая охота"} + - {id: 681, cat: TV, desc: "Топтуны"} + - {id: 675, cat: TV, desc: "Торговый центр"} + - {id: 988, cat: TV, desc: "Три звезды"} + - {id: 1033, cat: TV, desc: "Чужой"} + - {id: 690, cat: TV, desc: "Чужой район"} + - {id: 1030, cat: TV, desc: "Чужой среди своих"} + - {id: 804, cat: TV, desc: "Шаман"} + - {id: 780, cat: TV, desc: "Шерлок Холмс"} + - {id: 805, cat: TV, desc: "Этаж"} + - {id: 743, cat: TV, desc: "Ясмин"} + - {id: 973, cat: TV, desc: "Умник"} + - {id: 733, cat: TV, desc: "Хмуров"} + - {id: 505, cat: TV, desc: "Хозяйка моей судьбы"} + - {id: 1004, cat: TV, desc: "Анжелика"} + - {id: 1047, cat: TV, desc: "Бессмертник"} + - {id: 1074, cat: TV, desc: "Без свидетелей"} + - {id: 692, cat: TV, desc: "Верное средство"} + - {id: 1038, cat: TV, desc: "Верни мою любовь"} + - {id: 711, cat: TV, desc: "Береговая охрана"} + - {id: 1052, cat: TV, desc: "Граница времени"} + - {id: 1061, cat: TV, desc: "Второй шанс"} + - {id: 1042, cat: TV, desc: "Гречанка"} + - {id: 1108, cat: TV, desc: "Высокие ставки"} + - {id: 748, cat: TV, desc: "Дельта"} + - {id: 501, cat: TV, desc: "Дикий - 4"} + - {id: 980, cat: TV, desc: "Дознаватель"} + - {id: 1002, cat: TV, desc: "Долгий путь домой"} + - {id: 958, cat: TV, desc: "Дружба народов"} + - {id: 798, cat: TV, desc: "Зайцев+1"} + - {id: 1102, cat: TV, desc: "Запретная любовь"} + - {id: 1083, cat: TV, desc: "Код Константина"} + - {id: 1092, cat: TV, desc: "Измены"} + - {id: 565, cat: TV, desc: "Кодекс чести"} + - {id: 797, cat: TV, desc: "Корабль"} + - {id: 1070, cat: TV, desc: "Инспектор Купер"} + - {id: 640, cat: TV, desc: "Легавый"} + - {id: 1048, cat: TV, desc: "Луна"} + - {id: 1060, cat: TV, desc: "Ленинград 46"} + - {id: 684, cat: TV, desc: "Лесник"} + - {id: 1057, cat: TV, desc: "Между нами, девочками"} + - {id: 654, cat: TV, desc: "Морские дьяволы. Смерч"} + - {id: 1089, cat: TV, desc: "Неподкупный"} + - {id: 1095, cat: TV, desc: "Окрылённые"} + - {id: 1016, cat: TV, desc: "Отец Матвей"} + - {id: 687, cat: TV, desc: "Особый случай"} + - {id: 1054, cat: TV, desc: "Папа на вырост"} + - {id: 1094, cat: TV, desc: "Непридуманная жизнь"} + - {id: 986, cat: TV, desc: "Пляж"} + - {id: 750, cat: TV, desc: "Последний из Магикян"} + - {id: 1043, cat: TV, desc: "Последний янычар"} + - {id: 997, cat: TV, desc: "Практика"} + - {id: 1031, cat: TV, desc: "Хроники ломбарда"} + - {id: 1063, cat: TV, desc: "Цветок папоротника"} + - {id: 990, cat: TV, desc: "Человек - приманка"} + - {id: 1044, cat: TV, desc: "Свет и тень маяка"} + - {id: 1082, cat: TV, desc: "Следователи"} + - {id: 995, cat: TV, desc: "Слепая"} + - {id: 699, cat: TV, desc: "Солдаты 17 (Солдаты. Снова в строю)"} + - {id: 1025, cat: TV, desc: "Улыбка пересмешника"} + - {id: 1024, cat: TV, desc: "Литейный"} + - {id: 1023, cat: TV, desc: "Раскаяние"} + - {id: 1076, cat: TV, desc: "Родители"} + - {id: 972, cat: TV, desc: "Сватьи"} + - {id: 1073, cat: TV, desc: "Чужое гнездо"} + - {id: 1078, cat: TV, desc: "Чтец"} + - {id: 691, cat: TV, desc: "Черные кошки"} + - {id: 628, cat: TV, desc: "Карпов"} + - {id: 1101, cat: TV, desc: "Квест"} + - {id: 1088, cat: TV, desc: "Лондонград"} + - {id: 1072, cat: TV, desc: "Меч"} + - {id: 795, cat: TV, desc: "Пока станица спит"} + - {id: 978, cat: TV, desc: "ППС"} + - {id: 1003, cat: TV, desc: "Сердце звезды"} + - {id: 1194, cat: TV, desc: "Агентство скрытых камер"} + - {id: 1140, cat: TV, desc: "Академия"} + - {id: 1178, cat: TV, desc: "Беглые родственники"} + - {id: 1161, cat: TV, desc: "Бедные люди"} + - {id: 1099, cat: TV, desc: "Ботаны"} + - {id: 1136, cat: TV, desc: "Бородач"} + - {id: 1184, cat: TV, desc: "Вижу - знаю"} + - {id: 1127, cat: TV, desc: "Владимирская, 15"} + - {id: 1181, cat: TV, desc: "Вышибала"} + - {id: 1165, cat: TV, desc: "Гастролеры (Беглецы)"} + - {id: 1150, cat: TV, desc: "Гражданин Никто"} + - {id: 509, cat: TV, desc: "Два отца и два сына"} + - {id: 656, cat: TV, desc: "Деффчонки"} + - {id: 1128, cat: TV, desc: "Другой майор Соколов"} + - {id: 1192, cat: TV, desc: "Жемчуга"} + - {id: 1170, cat: TV, desc: "Законы улиц"} + - {id: 1183, cat: TV, desc: "Игра. Реванш"} + - {id: 1117, cat: TV, desc: "Иные"} + - {id: 1228, cat: TV, desc: "Казаки"} + - {id: 1107, cat: TV, desc: "Как я стал русским"} + - {id: 1077, cat: TV, desc: "Клан Ювелиров"} + - {id: 1118, cat: TV, desc: "Команда"} + - {id: 1132, cat: TV, desc: "Кости"} + - {id: 354, cat: TV, desc: "Кухня"} + - {id: 1040, cat: TV, desc: "Мажор"} + - {id: 1104, cat: TV, desc: "Метод"} + - {id: 1189, cat: TV, desc: "Москва. Центральный округ"} + - {id: 1135, cat: TV, desc: "На глубине"} + - {id: 1151, cat: TV, desc: "Напарницы"} + - {id: 1131, cat: TV, desc: "Не зарекайся"} + - {id: 1160, cat: TV, desc: "Невский"} + - {id: 1224, cat: TV, desc: "Нити судьбы"} + - {id: 1112, cat: TV, desc: "Озабоченные или любовь зла"} + - {id: 1080, cat: TV, desc: "Отдел 44"} + - {id: 761, cat: TV, desc: "Пасечник"} + - {id: 1103, cat: TV, desc: "Патруль Самооборона"} + - {id: 1157, cat: TV, desc: "Перевозчик"} + - {id: 1081, cat: TV, desc: "Пес"} + - {id: 1110, cat: TV, desc: "Последний мент"} + - {id: 1163, cat: TV, desc: "Последний москаль. Судный день"} + - {id: 1126, cat: TV, desc: "Прокуроры"} + - {id: 1179, cat: TV, desc: "Пушкин"} + - {id: 671, cat: TV, desc: "Пятая стража"} + - {id: 1019, cat: TV, desc: "Пятницкий. Глава четвертая"} + - {id: 1115, cat: TV, desc: "Ради любви я все смогу / Вечная любовь"} + - {id: 788, cat: TV, desc: "Розыск"} + - {id: 359, cat: TV, desc: "Светофор"} + - {id: 1098, cat: TV, desc: "Семейный бизнес"} + - {id: 1162, cat: TV, desc: "Следователь Тихонов"} + - {id: 1138, cat: TV, desc: "Солнце в подарок"} + - {id: 1180, cat: TV, desc: "Степные волки"} + - {id: 1133, cat: TV, desc: "Сын моего отца"} + - {id: 1049, cat: TV, desc: "Такая работа"} + - {id: 1185, cat: TV, desc: "Центральная больница"} + - {id: 1141, cat: TV, desc: "Человек без прошлого"} + - {id: 1223, cat: TV, desc: "Чёрная кошка"} + - {id: 1190, cat: TV, desc: "Шаман. Новая угроза"} + - {id: 1191, cat: TV, desc: "Я работаю в суде"} + - {id: 1235, cat: TV, desc: "Василиса"} + - {id: 1154, cat: TV, desc: "Вечный отпуск"} + - {id: 1231, cat: TV, desc: "Вы все меня бесите"} + - {id: 152, cat: TV, desc: "Интерны"} + - {id: 1156, cat: TV, desc: "Крыша мира"} + - {id: 1233, cat: TV, desc: "Райское место"} + - {id: 1302, cat: TV, desc: "Фамильные ценности"} + - {id: 1059, cat: TV, desc: "Это любовь"} + - {id: 1280, cat: TV, desc: "Адаптация"} + - {id: 48, cat: TV, desc: "Воронины"} + - {id: 1186, cat: TV, desc: "Кризис нежного возраста"} + - {id: 1281, cat: TV, desc: "Куба"} + - {id: 1278, cat: TV, desc: "Майор и магия"} + - {id: 1125, cat: TV, desc: "Мамочки"} + - {id: 1155, cat: TV, desc: "Мент в законе"} + - {id: 1015, cat: TV, desc: "Ментовские войны"} + - {id: 1276, cat: TV, desc: "Один против всех"} + - {id: 1193, cat: TV, desc: "Ольга"} + - {id: 1227, cat: TV, desc: "Отель Элеон"} + - {id: 551, cat: TV, desc: "Паутина"} + - {id: 1159, cat: TV, desc: "Подкидыши"} + - {id: 225, cat: TV, desc: "Реальные пацаны"} + - {id: 680, cat: TV, desc: "СашаТаня"} + - {id: 1301, cat: TV, desc: "Свидетели"} + - {id: 630, cat: TV, desc: "Склифосовский (Склиф)"} + - {id: 226, cat: TV, desc: "След"} + - {id: 1232, cat: TV, desc: "Стройка"} + - {id: 1045, cat: TV, desc: "Улицы разбитых фонарей"} + - {id: 445, cat: TV, desc: "Универ. Новая общага."} + - {id: 1285, cat: TV, desc: "Учитель в законе. Схватка"} + - {id: 970, cat: TV, desc: "Физрук"} + - {id: 1299, cat: TV, desc: "Филфак"} + - {id: 1062, cat: TV, desc: "ЧОП"} + - {id: 778, cat: TV, desc: "Шеф. Игра на повышение / Шеф-4"} + - {id: 21, cat: TV, desc: "Зарубежные мультсериалы"} + - {id: 185, cat: TV, desc: "WINX CLUB - Школа волшебниц"} + - {id: 463, cat: TV, desc: "Волшебные ПопПикси / PopPixie"} + - {id: 633, cat: TV, desc: "Winx Club 5й сезон - За гранью Беливикса"} + - {id: 772, cat: TV, desc: "Winx Club 6й сезон - Загадка Легендариума"} + - {id: 1093, cat: TV, desc: "Winx Club 7й сезон - Высшая сила животных"} + - {id: 606, cat: TV, desc: "Друзья ангелов"} + - {id: 1129, cat: TV, desc: "ЛедиБаг и Супер кот / Miraculous Ladybug"} + - {id: 789, cat: TV, desc: "Тотали Спайс! / Totally Spies!"} + - {id: 162, cat: TV, desc: "Футурама"} + - {id: 151, cat: TV, desc: "Хантик - Искатели секретов (Озвучка РиперАМ!)"} + - {id: 22, cat: TV, desc: "Русские мультсериалы"} + - {id: 1401, cat: TV, desc: "Маша и Медведь"} + - {id: 198, cat: TV, desc: "Архив Сериалов, Мультсериалов"} + - {id: 232, cat: TV/Anime, desc: "Аниме"} + - {id: 245, cat: TV/Anime, desc: "Полнометражные Аниме"} + - {id: 246, cat: TV/Anime, desc: "Аниме Сериалы"} + - {id: 592, cat: TV/Anime, desc: "High School DxD / Демоны старшей школы"} + - {id: 594, cat: TV/Anime, desc: "Корона Грешника / Guilty Crown"} + - {id: 591, cat: TV/Anime, desc: "Zero no Tsukaima TV-1 / Подручный бездарной Луизы ТВ-1"} + - {id: 595, cat: TV/Anime, desc: "Zero no Tsukaima: Futatsuki no Kishi TV-2 / Подручный бездарной Луизы: Рыцарь Двух Лун ТВ-2"} + - {id: 596, cat: TV/Anime, desc: "Zero no Tsukaima Princess no Rondo TV-3 / Подручный бездарной Луизы: Рондо Принцессы ТВ-3"} + - {id: 597, cat: TV/Anime, desc: "Zero no Tsukaima F TV-4 / Подручный бездарной Луизы Финал ТВ-4"} + - {id: 242, cat: TV, desc: "Без перевода"} + - {id: 241, cat: TV, desc: "ТВ-Шоу, документальные, спорт"} + - {id: 23, cat: TV, desc: "ТВ-Шоу и развлекательные передачи"} + - {id: 1075, cat: TV, desc: "Архив ТВ-Шоу"} + - {id: 491, cat: TV, desc: "Yesterday Live"} + - {id: 516, cat: TV, desc: "X-Фактор"} + - {id: 478, cat: TV, desc: "Без башни"} + - {id: 540, cat: TV, desc: "Болеро"} + - {id: 1010, cat: TV, desc: "Большие гонки"} + - {id: 538, cat: TV, desc: "Бункер News"} + - {id: 561, cat: TV, desc: "В черной-черной комнате"} + - {id: 713, cat: TV, desc: "Вышка"} + - {id: 191, cat: TV, desc: "Голые и смешные"} + - {id: 527, cat: TV, desc: "Готовим с Алексеем Зиминым"} + - {id: 460, cat: TV, desc: "Грязные деньги"} + - {id: 659, cat: TV, desc: "Два с половиной повара"} + - {id: 255, cat: TV, desc: "Девчата"} + - {id: 634, cat: TV, desc: "Дешево и сердито"} + - {id: 574, cat: TV, desc: "Дневники шоугелз"} + - {id: 764, cat: TV, desc: "ДНК"} + - {id: 637, cat: TV, desc: "Доброго здоровьица"} + - {id: 658, cat: TV, desc: "Дурнушек.net"} + - {id: 209, cat: TV, desc: "Ешь и худей"} + - {id: 800, cat: TV, desc: "Женское счастье"} + - {id: 475, cat: TV, desc: "Женская Лига"} + - {id: 740, cat: TV, desc: "Звезданутые"} + - {id: 741, cat: TV, desc: "Здравствуйте, я ваша Пятница"} + - {id: 737, cat: TV, desc: "Из песни слов не выкинешь"} + - {id: 587, cat: TV, desc: "Индустрия кино"} + - {id: 718, cat: TV, desc: "Истина где-то рядом"} + - {id: 1011, cat: TV, desc: "История Российской кухни"} + - {id: 456, cat: TV, desc: "Каникулы в Мексике"} + - {id: 682, cat: TV, desc: "Караоке киллер"} + - {id: 996, cat: TV, desc: "Когда мы дома"} + - {id: 785, cat: TV, desc: "Куб - Новый сезон"} + - {id: 668, cat: TV, desc: "Кулинарный поединок"} + - {id: 752, cat: TV, desc: "Луч Света"} + - {id: 533, cat: TV, desc: "Люди ХЭ"} + - {id: 447, cat: TV, desc: "Мама в законе"} + - {id: 529, cat: TV, desc: "Минута для победы с М. Авериным"} + - {id: 793, cat: TV, desc: "Мировой повар"} + - {id: 586, cat: TV, desc: "Минута славы"} + - {id: 472, cat: TV, desc: "Мульт Личности"} + - {id: 1009, cat: TV, desc: "Наш выход"} + - {id: 511, cat: TV, desc: "Нонна, давай"} + - {id: 531, cat: TV, desc: "НТВшники"} + - {id: 754, cat: TV, desc: "Остров"} + - {id: 715, cat: TV, desc: "Пародайс"} + - {id: 559, cat: TV, desc: "Первый класс"} + - {id: 636, cat: TV, desc: "Погоня"} + - {id: 679, cat: TV, desc: "Пока еще не поздно"} + - {id: 545, cat: TV, desc: "Понять. Простить"} + - {id: 537, cat: TV, desc: "Последнее слово"} + - {id: 792, cat: TV, desc: "Правила моей кухни"} + - {id: 547, cat: TV, desc: "Право на защиту"} + - {id: 731, cat: TV, desc: "Про декор"} + - {id: 536, cat: TV, desc: "Самый умный"} + - {id: 742, cat: TV, desc: "Свидание со звездой"} + - {id: 544, cat: TV, desc: "Свобода и справедливость"} + - {id: 963, cat: TV, desc: "Свободное время"} + - {id: 575, cat: TV, desc: "Снимите это немедленно!"} + - {id: 489, cat: TV, desc: "Специальное задание"} + - {id: 495, cat: TV, desc: "Спокойной ночи, малыши!"} + - {id: 689, cat: TV, desc: "Страна в Shope"} + - {id: 492, cat: TV, desc: "СуперИнтуиция"} + - {id: 535, cat: TV, desc: "Съешьте это немедленно!"} + - {id: 1005, cat: TV, desc: "Тотальная распродажа"} + - {id: 521, cat: TV, desc: "Украина чудес"} + - {id: 698, cat: TV, desc: "Устами младенца"} + - {id: 451, cat: TV, desc: "Улетное видео по русски"} + - {id: 697, cat: TV, desc: "ХБ"} + - {id: 497, cat: TV, desc: "Ху из ху"} + - {id: 494, cat: TV, desc: "Школа злословия"} + - {id: 448, cat: TV, desc: "Что делать?"} + - {id: 366, cat: TV, desc: "6 кадров"} + - {id: 1032, cat: TV, desc: "Автошкола 2: Девчонки рулят"} + - {id: 471, cat: TV, desc: "Большая Разница"} + - {id: 744, cat: TV, desc: "В наше время"} + - {id: 1056, cat: TV, desc: "Все будет хорошо"} + - {id: 344, cat: TV, desc: "Галилео"} + - {id: 477, cat: TV, desc: "Даешь молодежь"} + - {id: 514, cat: TV, desc: "Ералаш"} + - {id: 446, cat: TV, desc: "+100500"} + - {id: 1164, cat: TV, desc: "Битва риелторов"} + - {id: 693, cat: TV, desc: "Comedy Баттл. Без границ"} + - {id: 1071, cat: TV, desc: "Взвешенные люди"} + - {id: 229, cat: TV, desc: "Comedy Баттл. Отбор, турнир"} + - {id: 1096, cat: TV, desc: "Время Г"} + - {id: 522, cat: TV, desc: "Модный приговор"} + - {id: 971, cat: TV, desc: "Не спать!"} + - {id: 1137, cat: TV, desc: "Новая звезда"} + - {id: 1142, cat: TV, desc: "Таблетка"} + - {id: 677, cat: TV, desc: "Холостяк"} + - {id: 1034, cat: TV, desc: "Чисто News"} + - {id: 763, cat: TV, desc: "Я худею"} + - {id: 1087, cat: TV, desc: "Дикие игры"} + - {id: 649, cat: TV, desc: "Тайны Чапман"} + - {id: 452, cat: TV, desc: "Хочу знать"} + - {id: 1121, cat: TV, desc: "Хроники московского быта"} + - {id: 647, cat: TV, desc: "Чистосердечное признание"} + - {id: 643, cat: TV, desc: "Кинематограф"} + - {id: 532, cat: TV, desc: "Кино в деталях"} + - {id: 614, cat: TV, desc: "Мистические истории"} + - {id: 801, cat: TV, desc: "Пища богов"} + - {id: 974, cat: TV, desc: "Политика"} + - {id: 670, cat: TV, desc: "Репортерские истории"} + - {id: 252, cat: TV, desc: "Среда обитания"} + - {id: 89, cat: TV, desc: "Игровое видео/Фильм о фильме"} + - {id: 65, cat: TV, desc: "Вторая мировая война"} + - {id: 190, cat: TV, desc: "Давай поженимся"} + - {id: 530, cat: TV, desc: "Жди меня"} + - {id: 1086, cat: TV, desc: "На самом деле"} + - {id: 526, cat: TV, desc: "Вечерний квартал"} + - {id: 605, cat: TV, desc: "Вечерний Ургант"} + - {id: 1124, cat: TV, desc: "Где логика?"} + - {id: 480, cat: TV, desc: "Камеди Woman"} + - {id: 459, cat: TV, desc: "Говорим и показываем"} + - {id: 479, cat: TV, desc: "Comedy Club - Камеди Клаб"} + - {id: 33, cat: TV, desc: "ДОМ 2"} + - {id: 270, cat: TV, desc: "Архив Дом-2"} + - {id: 1484, cat: TV, desc: "ДНК"} + - {id: 1483, cat: TV, desc: "За гранью"} + - {id: 1469, cat: TV, desc: "Звезды сошлись"} + - {id: 696, cat: TV, desc: "Квартирный вопрос"} + - {id: 1468, cat: TV, desc: "Квартирник НТВ у Маргулиса"} + - {id: 469, cat: TV, desc: "КВН - Клуб Веселых и Находчивых"} + - {id: 541, cat: TV, desc: "Кто хочет стать миллионером"} + - {id: 189, cat: TV, desc: "Контрольная закупка"} + - {id: 1284, cat: TV, desc: "Лига смеха"} + - {id: 775, cat: TV, desc: "МастерШеф"} + - {id: 1291, cat: TV, desc: "Международная пилорама"} + - {id: 1018, cat: TV, desc: "Мужское - женское"} + - {id: 769, cat: TV, desc: "Наедине со всеми"} + - {id: 1123, cat: TV, desc: "НашПотребНадзор"} + - {id: 1017, cat: TV, desc: "Однажды в России"} + - {id: 1309, cat: TV, desc: "Пацанки"} + - {id: 765, cat: TV, desc: "Перезагрузка"} + - {id: 493, cat: TV, desc: "Поле чудес"} + - {id: 730, cat: TV, desc: "Поедем, поедим"} + - {id: 1146, cat: TV, desc: "Когда все дома"} + - {id: 1196, cat: TV, desc: "Проводник"} + - {id: 588, cat: TV, desc: "Прямой эфир"} + - {id: 348, cat: TV, desc: "Пусть говорят"} + - {id: 1158, cat: TV, desc: "Ревизорро"} + - {id: 490, cat: TV, desc: "Сам себе режиссёр"} + - {id: 457, cat: TV, desc: "Своя игра"} + - {id: 520, cat: TV, desc: "Смак"} + - {id: 1106, cat: TV, desc: "Соль"} + - {id: 975, cat: TV, desc: "STAND UP"} + - {id: 496, cat: TV, desc: "Сто к одному"} + - {id: 786, cat: TV, desc: "Сегодня вечером"} + - {id: 967, cat: TV, desc: "Comedy Баттл. Последний сезон"} + - {id: 1287, cat: TV, desc: "Секрет на миллион"} + - {id: 1021, cat: TV, desc: "Танцы"} + - {id: 1286, cat: TV, desc: "Ты супер!"} + - {id: 470, cat: TV, desc: "Уральские пельмени"} + - {id: 1290, cat: TV, desc: "Устами младенца"} + - {id: 1147, cat: TV, desc: "Фазенда"} + - {id: 188, cat: TV, desc: "Центральное телевидение"} + - {id: 543, cat: TV, desc: "Что? Где? Когда?"} + - {id: 738, cat: TV, desc: "Школа ремонта"} + - {id: 59, cat: TV, desc: "Э К С Т Р А С Е Н С Ы"} + - {id: 281, cat: TV, desc: "Удиви меня"} + - {id: 1035, cat: TV, desc: "Черно-белое"} + - {id: 280, cat: TV, desc: "Экстрасенсы против ученых"} + - {id: 279, cat: TV, desc: "Битва экстрасенсов"} + - {id: 1461, cat: TV/Documentary, desc: "Невероятно интересные истории"} + - {id: 1477, cat: TV/Documentary, desc: "Последний герой"} + - {id: 1478, cat: TV/Documentary, desc: "Бородина против Бузовой"} + - {id: 1488, cat: TV/Documentary, desc: "Док-ток"} + - {id: 24, cat: TV/Documentary, desc: "Документальные передачи"} + - {id: 1460, cat: TV/Documentary, desc: "Специальный репортаж (ТК Звезда)"} + - {id: 728, cat: TV/Documentary, desc: "Чудо техники с Сергеем Малозёмовым"} + - {id: 69, cat: TV/Documentary, desc: "Авто"} + - {id: 669, cat: TV/Documentary, desc: "Главная дорога"} + - {id: 704, cat: TV/Documentary, desc: "Первая передача"} + - {id: 1111, cat: TV/Documentary, desc: "Без обмана"} + - {id: 88, cat: TV/Documentary, desc: "Биографии. Личности и кумиры"} + - {id: 68, cat: TV/Documentary, desc: "Военное дело"} + - {id: 729, cat: TV/Documentary, desc: "Дачный ответ"} + - {id: 1152, cat: TV/Documentary, desc: "Живая еда"} + - {id: 194, cat: TV/Documentary, desc: "Discovery / NatGeo / BBC / Viasat"} + - {id: 1307, cat: TV/Documentary, desc: "Загадки человечества"} + - {id: 701, cat: TV/Documentary, desc: "Идеальный ремонт"} + - {id: 63, cat: TV/Documentary, desc: "Криминал"} + - {id: 1481, cat: TV/Documentary, desc: "Закон и порядок"} + - {id: 796, cat: TV/Documentary, desc: "Место происшествия. О главном"} + - {id: 1470, cat: TV/Documentary, desc: "По следу монстра"} + - {id: 1085, cat: TV/Documentary, desc: "Следствие ведут..."} + - {id: 652, cat: TV/Documentary, desc: "Следствие вели..."} + - {id: 498, cat: TV/Documentary, desc: "Чрезвычайное происшествие"} + - {id: 1120, cat: TV/Documentary, desc: "Линия защиты"} + - {id: 1145, cat: TV/Documentary, desc: "Непутевые заметки с Дмитрием Крыловым"} + - {id: 1067, cat: TV/Documentary, desc: "Обложка"} + - {id: 1288, cat: TV/Documentary, desc: "Однажды"} + - {id: 1119, cat: TV/Documentary, desc: "Осторожно, мошенники!"} + - {id: 1149, cat: TV/Documentary, desc: "Открытие Китая"} + - {id: 739, cat: TV/Documentary, desc: "Очная ставка"} + - {id: 965, cat: TV/Documentary, desc: "Познер. Интервью с..."} + - {id: 650, cat: TV/Documentary, desc: "Русские сенсации"} + - {id: 1122, cat: TV/Documentary, desc: "Русский вопрос"} + - {id: 1198, cat: TV/Documentary, desc: "Самые шокирующие гипотезы"} + - {id: 802, cat: TV/Documentary, desc: "Территория заблуждений с Игорем Прокопенко"} + - {id: 1479, cat: TV/Documentary, desc: "Как устроен мир с Тимофеем Баженовым"} + - {id: 323, cat: TV/Documentary, desc: "Информационно-аналитические и общественно-политические передачи"} + - {id: 1195, cat: TV/Documentary, desc: "60 минут"} + - {id: 1041, cat: TV/Documentary, desc: "Вести"} + - {id: 672, cat: TV/Documentary, desc: "Вести в субботу с Сергеем Брилевым"} + - {id: 655, cat: TV/Documentary, desc: "Вести недели"} + - {id: 1007, cat: TV/Documentary, desc: "Время покажет"} + - {id: 673, cat: TV/Documentary, desc: "Воскресное время - Первый канал"} + - {id: 759, cat: TV/Documentary, desc: "В центре событий с Анной Прохоровой"} + - {id: 999, cat: TV/Documentary, desc: "Добров в эфире"} + - {id: 758, cat: TV/Documentary, desc: "Известия. Главное"} + - {id: 1230, cat: TV/Documentary, desc: "Итоги недели"} + - {id: 1400, cat: TV/Documentary, desc: "Итоги недели с Сергеем Михеевым"} + - {id: 1402, cat: TV/Documentary, desc: "Кто против?"} + - {id: 1148, cat: TV/Documentary, desc: "Место встречи"} + - {id: 648, cat: TV/Documentary, desc: "Момент истины"} + - {id: 1279, cat: TV/Documentary, desc: "Первая студия"} + - {id: 327, cat: TV/Documentary, desc: "Поединок с Владимиром Соловьевым"} + - {id: 324, cat: TV/Documentary, desc: "Постскриптум с Алексеем Пушковым"} + - {id: 705, cat: TV/Documentary, desc: "Право голоса"} + - {id: 1029, cat: TV/Documentary, desc: "Право знать!"} + - {id: 1153, cat: TV/Documentary, desc: "Процесс"} + - {id: 1405, cat: TV/Documentary, desc: "Своя правда"} + - {id: 337, cat: TV/Documentary, desc: "Ты не поверишь!"} + - {id: 330, cat: TV/Documentary, desc: "Человек и закон"} + - {id: 25, cat: TV/Sport, desc: "Спортивные передачи"} + - {id: 127, cat: TV/Sport, desc: "ХХII Зимние Олимпийские Игры в Сочи"} + - {id: 616, cat: TV/Sport, desc: "Фигурное катание"} + - {id: 201, cat: TV/Sport, desc: "Бокс, боевые единоборства , рестлинг"} + - {id: 146, cat: TV/Sport, desc: "Гонки"} + - {id: 145, cat: TV/Sport, desc: "Футбол"} + - {id: 985, cat: TV/Sport, desc: "Футбол. Чемпионат мира 2014 (Бразилия)"} + - {id: 661, cat: TV/Sport, desc: "Футбол.ru"} + - {id: 211, cat: TV/Sport, desc: "Хоккей"} + - {id: 192, cat: TV/Sport, desc: "ЧМ-2010"} + - {id: 622, cat: TV/Sport, desc: "XXIV Зимние Олимпийские игры 2022"} + - {id: 346, cat: TV/Sport, desc: "Театр"} + - {id: 199, cat: TV/Sport, desc: "Архив ТВ-Шоу, документальные, спорт"} + - {id: 577, cat: TV/Sport, desc: "Адская кухня - 2 (Россия)"} + - {id: 674, cat: TV/Sport, desc: "Большие танцы"} + - {id: 579, cat: TV/Sport, desc: "Две звезды"} + - {id: 576, cat: TV/Sport, desc: "Смотреть всем!"} + - {id: 694, cat: TV/Sport, desc: "Фитнес"} + - {id: 589, cat: TV/Sport, desc: "Достояние республики. Новый сезон 2011!"} + - {id: 585, cat: TV/Sport, desc: "Городок"} + - {id: 584, cat: TV/Sport, desc: "Адская кухня"} + - {id: 269, cat: TV/Sport, desc: "Одна за всех"} + - {id: 515, cat: TV/Sport, desc: "Стыдно, когда видно!"} + - {id: 468, cat: TV/Sport, desc: "Прожекторперисхилтон"} + - {id: 762, cat: TV/Sport, desc: "Хит"} + - {id: 767, cat: TV/Sport, desc: "Шурочка"} + - {id: 1113, cat: TV/Sport, desc: "Акценты недели"} + - {id: 333, cat: TV/Sport, desc: "Брачное чтиво"} + - {id: 1097, cat: TV/Sport, desc: "В теме"} + - {id: 1064, cat: TV/Sport, desc: "Время в 21:00"} + - {id: 332, cat: TV/Sport, desc: "ЖКХ"} + - {id: 660, cat: TV/Sport, desc: "Михаил Жванецкий. Дежурный по стране"} + - {id: 998, cat: TV/Sport, desc: "Итоги дня"} + - {id: 331, cat: TV/Sport, desc: "Неделя с Марианной Максимовской"} + - {id: 335, cat: TV/Sport, desc: "Операция «Должник»"} + - {id: 1134, cat: TV/Sport, desc: "Открытая студия"} + - {id: 1143, cat: TV/Sport, desc: "Поздняков. Интервью с ..."} + - {id: 336, cat: TV/Sport, desc: "Секретные территории"} + - {id: 702, cat: TV/Sport, desc: "Собчак живьём"} + - {id: 328, cat: TV/Sport, desc: "Специальный корреспондент"} + - {id: 1053, cat: TV/Sport, desc: "Список Норкина"} + - {id: 1022, cat: TV/Sport, desc: "Структура Момента"} + - {id: 325, cat: TV/Sport, desc: "Судите сами"} + - {id: 326, cat: TV/Sport, desc: "Честный понедельник"} + - {id: 329, cat: TV/Sport, desc: "Сегодня. Итоговая программа"} + - {id: 1100, cat: TV/Sport, desc: "Пропаганда"} + - {id: 1084, cat: TV/Sport, desc: "'Точка' с Максимом Шевченко"} + - {id: 334, cat: TV/Sport, desc: "День космических историй"} + - {id: 1091, cat: TV/Sport, desc: "50 оттенков. Белова"} + - {id: 298, cat: Console, desc: "Игры"} + - {id: 1202, cat: Console, desc: "Горячие RePack'и"} + - {id: 302, cat: Console, desc: "Горячие Новинки"} + - {id: 1225, cat: Console, desc: "Denuvo"} + - {id: 300, cat: Console, desc: "Игры для PC"} + - {id: 312, cat: Console, desc: "Action"} + - {id: 807, cat: Console, desc: "Action FPS (1st Person)"} + - {id: 808, cat: Console, desc: "Action TPS (3rd Person)"} + - {id: 665, cat: Console, desc: "Антологии"} + - {id: 309, cat: Console, desc: "Стратегии"} + - {id: 810, cat: Console, desc: "RTS (стратегии в реальном времени)"} + - {id: 809, cat: Console, desc: "TBS (пошаговые стратегии)"} + - {id: 811, cat: Console, desc: "Экономические стратегии"} + - {id: 938, cat: Console, desc: "Военные стратегии"} + - {id: 338, cat: Console, desc: "RPG"} + - {id: 1203, cat: Console, desc: "MMORPG"} + - {id: 305, cat: Console, desc: "Аркады"} + - {id: 717, cat: Console, desc: "Симуляторы"} + - {id: 1204, cat: Console, desc: "Авиасимуляторы"} + - {id: 1205, cat: Console, desc: "Гоночные симуляторы"} + - {id: 1206, cat: Console, desc: "Спортивные симуляторы"} + - {id: 311, cat: Console, desc: "Приключения, Квесты, Логические"} + - {id: 1207, cat: Console, desc: "Старые игры"} + - {id: 307, cat: Console, desc: "Детские обучающие игры"} + - {id: 812, cat: Console, desc: "Онлайновые игры"} + - {id: 1215, cat: Console, desc: "Эротические игры"} + - {id: 303, cat: Console, desc: "Мини-игры"} + - {id: 1208, cat: Console, desc: "Demo, Alpha, Beta версии"} + - {id: 313, cat: Console, desc: "Прочее"} + - {id: 864, cat: Console, desc: "Дополнения к играм"} + - {id: 1209, cat: Console, desc: "NoCD/NoDVD"} + - {id: 1210, cat: Console, desc: "Русификаторы"} + - {id: 1211, cat: Console, desc: "Игровое видео"} + - {id: 1212, cat: Console, desc: "Патчи"} + - {id: 1213, cat: Console, desc: "Софт для игр на PC"} + - {id: 1214, cat: Console, desc: "Прочее"} + - {id: 1415, cat: Console, desc: "VR"} + - {id: 1489, cat: Console, desc: "S.T.A.L.K.E.R"} + - {id: 382, cat: PC, desc: "Программное обеспечение"} + - {id: 1237, cat: PC, desc: "Операционные системы"} + - {id: 1486, cat: PC, desc: "Windows 11"} + - {id: 1238, cat: PC, desc: "Windows 10"} + - {id: 1239, cat: PC, desc: "Windows 8, 8.1"} + - {id: 1240, cat: PC, desc: "Windows 7"} + - {id: 1243, cat: PC, desc: "Windows VISTA"} + - {id: 1241, cat: PC, desc: "Windows XP"} + - {id: 1275, cat: PC, desc: "Linux, Unix, Mac и другие ОС"} + - {id: 1242, cat: PC, desc: "Разное (Microsoft Windows OS)"} + - {id: 391, cat: PC, desc: "Системные программы"} + - {id: 405, cat: PC, desc: "Драйвера и сопутствующий софт"} + - {id: 1254, cat: PC, desc: "Архиваторы и файловые менеджеры"} + - {id: 1255, cat: PC, desc: "Программы для настройки и оптимизации ОС"} + - {id: 724, cat: PC, desc: "Защита, Антивирусы и Файерволы"} + - {id: 406, cat: PC, desc: "Сборники программ, WPI"} + - {id: 407, cat: PC, desc: "Работа с жёстким диском"} + - {id: 1245, cat: PC, desc: "Резервирование и восстановление данных"} + - {id: 1247, cat: PC, desc: "Работа с носителями информации"} + - {id: 1248, cat: PC, desc: "Обслуживание и диагностика компьютера"} + - {id: 1249, cat: PC, desc: "ПО для Интернета и сетей"} + - {id: 1251, cat: PC, desc: "Изменение интерфейса и скринсейверы ОС Windows"} + - {id: 408, cat: PC, desc: "Разное (Системные программы)"} + - {id: 399, cat: PC, desc: "Программы для работы с мультимедиа и 3D"} + - {id: 400, cat: PC, desc: "Графические редакторы, 3D моделирование"} + - {id: 401, cat: PC, desc: "Редакторы видео"} + - {id: 402, cat: PC, desc: "Видео- Аудио- конверторы"} + - {id: 404, cat: PC, desc: "Видео- Аудио- проигрыватели"} + - {id: 1270, cat: PC, desc: "Работа со звуком"} + - {id: 1271, cat: PC, desc: "Аудио- Видео Кодеки"} + - {id: 403, cat: PC, desc: "Разное (Программы для работы с мультимедиа и 3D)"} + - {id: 1244, cat: PC, desc: "Системы для бизнеса, офиса, научной и проектной работы"} + - {id: 1261, cat: PC, desc: "ГИС, Системы навигации и карты"} + - {id: 1256, cat: PC, desc: "Системы для научной работы"} + - {id: 1257, cat: PC, desc: "Офисные системы"} + - {id: 1263, cat: PC, desc: "Веб-разработка и Программирование"} + - {id: 1258, cat: PC, desc: "Системы для бизнеса"} + - {id: 1259, cat: PC, desc: "Работа с PDF и DjVu"} + - {id: 1262, cat: PC, desc: "Словари, переводчики"} + - {id: 1260, cat: PC, desc: "САПР, Софт для архитекторов и строителей"} + - {id: 1393, cat: PC, desc: "Разное"} + - {id: 726, cat: Other, desc: "Разное"} + - {id: 1273, cat: Other, desc: "Обои для рабочего стола"} + - {id: 1390, cat: Other, desc: "Аватары, Иконки, Смайлы"} + - {id: 1391, cat: Other, desc: "Растровые и Векторные Клипарты"} + - {id: 1272, cat: Other, desc: "Photoshop (Уроки) и Видеокурсы"} + - {id: 1392, cat: Other, desc: "Заготовки, виньетки, рамки"} + - {id: 1408, cat: PC/Mobile-Other, desc: "Мобильные устройства"} + - {id: 1409, cat: PC/Mobile-Android, desc: "Android"} + - {id: 1411, cat: PC/Mobile-Android, desc: "18+ -Android"} + - {id: 1418, cat: PC/Mobile-Android, desc: "TV|Видео|IPTV - Android"} + - {id: 1419, cat: PC/Mobile-Android, desc: "Утилиты|Система - Android"} + - {id: 1420, cat: PC/Mobile-Android, desc: "Видеоплееры|Аудиоплееры - Android"} + - {id: 1421, cat: PC/Mobile-Android, desc: "VPN|Интернет - Android"} + - {id: 1422, cat: PC/Mobile-Android, desc: "Соцсети|Мессенджеры - Android"} + - {id: 1423, cat: PC/Mobile-Android, desc: "Авто|Карты - Android"} + - {id: 1424, cat: PC/Mobile-Android, desc: "Редакторы|Фоторедакторы - Android"} + - {id: 1480, cat: PC/Mobile-Android, desc: "Игры - Android"} + - {id: 243, cat: Audio, desc: "Музыка"} + - {id: 26, cat: Audio, desc: "Правила раздела 'Музыка'"} + - {id: 96, cat: Audio, desc: "HD Видео"} + - {id: 70, cat: Audio, desc: "Pop"} + - {id: 97, cat: Audio, desc: "Видеоклипы / Концерты"} + - {id: 72, cat: Audio, desc: "Retro/Bandstand"} + - {id: 1358, cat: Audio/Lossless, desc: "Retro/Bandstand - lossless"} + - {id: 1359, cat: Audio/MP3, desc: "Retro/Bandstand - MP3"} + - {id: 71, cat: Audio, desc: "Disco"} + - {id: 1356, cat: Audio/Lossless, desc: "Disco - lossless"} + - {id: 1357, cat: Audio/MP3, desc: "Disco - MP3"} + - {id: 1354, cat: Audio/Lossless, desc: "Pop - lossless"} + - {id: 1355, cat: Audio/MP3, desc: "Pop - MP3"} + - {id: 73, cat: Audio, desc: "Rock"} + - {id: 98, cat: Audio, desc: "Видеоклипы / Концерты"} + - {id: 1360, cat: Audio/Lossless, desc: "Rock - lossless"} + - {id: 1361, cat: Audio/MP3, desc: "Rock - MP3"} + - {id: 74, cat: Audio, desc: "Alternative"} + - {id: 99, cat: Audio, desc: "Видеоклипы / Концерты"} + - {id: 1362, cat: Audio/Lossless, desc: "Alternative - lossless"} + - {id: 1363, cat: Audio/MP3, desc: "Alternative - MP3"} + - {id: 75, cat: Audio, desc: "Metal"} + - {id: 100, cat: Audio, desc: "Видеоклипы / Концерты"} + - {id: 1364, cat: Audio/MP3, desc: "Metal - MP3"} + - {id: 1365, cat: Audio/Lossless, desc: "Metal - lossless"} + - {id: 76, cat: Audio, desc: "Rap, Hip-Hop, R'n'B"} + - {id: 101, cat: Audio, desc: "Видеоклипы / Концерты"} + - {id: 78, cat: Audio, desc: "Зарубежный"} + - {id: 1368, cat: Audio/Lossless, desc: "Зарубежный - lossless"} + - {id: 1369, cat: Audio/MP3, desc: "Зарубежный - MP3"} + - {id: 77, cat: Audio, desc: "Отечественный"} + - {id: 1370, cat: Audio/Lossless, desc: "Отечественный - lossless"} + - {id: 1371, cat: Audio/MP3, desc: "Отечественный - MP3"} + - {id: 1366, cat: Audio/Lossless, desc: "Rap, Hip-Hop, R'n'B - lossless"} + - {id: 1367, cat: Audio/MP3, desc: "Rap, Hip-Hop, R'n'B - MP3"} + - {id: 85, cat: Audio, desc: "Jazz, Blues"} + - {id: 1380, cat: Audio/Lossless, desc: "Jazz, Blues - lossless"} + - {id: 1381, cat: Audio/MP3, desc: "Jazz, Blues - MP3"} + - {id: 82, cat: Audio, desc: "Chanson, Bard"} + - {id: 1386, cat: Audio/Lossless, desc: "Chanson, Bard - lossless"} + - {id: 1387, cat: Audio/MP3, desc: "Chanson, Bard - MP3"} + - {id: 86, cat: Audio, desc: "Classical"} + - {id: 1378, cat: Audio/Lossless, desc: "Classical - lossless"} + - {id: 1379, cat: Audio/MP3, desc: "Classical - MP3"} + - {id: 79, cat: Audio, desc: "Electronic"} + - {id: 102, cat: Audio, desc: "Видеоклипы / Концерты"} + - {id: 1372, cat: Audio, desc: "Electronic - lossless"} + - {id: 1373, cat: Audio/MP3, desc: "Electronic - MP3"} + - {id: 80, cat: Audio, desc: "Other genres"} + - {id: 103, cat: Audio, desc: "Видеоклипы / Концерты"} + - {id: 87, cat: Audio, desc: "Военная песня"} + - {id: 1376, cat: Audio/Lossless, desc: "Военная песня - lossless"} + - {id: 1377, cat: Audio/MP3, desc: "Военная песня - MP3"} + - {id: 84, cat: Audio, desc: "Reggae, Ska, Dub"} + - {id: 1382, cat: Audio/Lossless, desc: "Reggae, Ska, Dub - lossless"} + - {id: 1383, cat: Audio/MP3, desc: "Reggae, Ska, Dub - MP3"} + - {id: 83, cat: Audio, desc: "Funk, Soul, Country"} + - {id: 1384, cat: Audio/Lossless, desc: "Funk, Soul, Country - lossless"} + - {id: 1385, cat: Audio/MP3, desc: "Funk, Soul, Country - MP3"} + - {id: 81, cat: Audio, desc: "Folk, Ethnic, New Age, Meditative, Punk"} + - {id: 1388, cat: Audio/Lossless, desc: "Folk, Ethnic, New Age, Meditative, Punk - lossless"} + - {id: 1389, cat: Audio/MP3, desc: "Folk, Ethnic, New Age, Meditative, Punk - MP3"} + - {id: 1374, cat: Audio/Lossless, desc: "Other genres - lossless"} + - {id: 1375, cat: Audio/MP3, desc: "Other genres - MP3"} + - {id: 663, cat: Books, desc: "Книги (Аудиокниги) и журналы"} + - {id: 1036, cat: Books, desc: "Книги"} + - {id: 1324, cat: Books, desc: "Новинки"} + - {id: 1331, cat: Books, desc: "Детские книги"} + - {id: 1325, cat: Books, desc: "Боевики/Детективы/Триллеры"} + - {id: 1334, cat: Books, desc: "Военная литература"} + - {id: 1326, cat: Books, desc: "Приключения"} + - {id: 1332, cat: Books, desc: "Комедийные произведения, юмор, сатира"} + - {id: 1328, cat: Books, desc: "Отечественная фантастика / фэнтези / мистика / ужасы"} + - {id: 1329, cat: Books, desc: "Зарубежная фантастика / фэнтези / мистика / ужасы"} + - {id: 1330, cat: Books, desc: "Классическая литература и современная проза"} + - {id: 1462, cat: Books, desc: "Научно-популярная литература"} + - {id: 1471, cat: Books, desc: "Кулинария"} + - {id: 1333, cat: Books, desc: "Разное"} + - {id: 1485, cat: Books, desc: "Медицина"} + - {id: 1312, cat: Books, desc: "Аудиокниги"} + - {id: 1398, cat: Books, desc: "Приключения"} + - {id: 1396, cat: Books, desc: "Детектив"} + - {id: 1397, cat: Books, desc: "Боевик / Триллер"} + - {id: 1313, cat: Books, desc: "История"} + - {id: 1315, cat: Books, desc: "Юмор"} + - {id: 1316, cat: Books, desc: "Религия"} + - {id: 1399, cat: Books, desc: "Ужасы / Мистика"} + - {id: 1318, cat: Books, desc: "Фантастика / фэнтези"} + - {id: 1319, cat: Books, desc: "Классика"} + - {id: 1320, cat: Books, desc: "Поэзия"} + - {id: 1321, cat: Books, desc: "Психология"} + - {id: 1317, cat: Books, desc: "Детская литература"} + - {id: 1322, cat: Books, desc: "Художественная литература"} + - {id: 1474, cat: Books, desc: "Нон-фикшн"} + - {id: 1323, cat: Books, desc: "Прочая литература"} + - {id: 1037, cat: Books, desc: "Журналы"} + - {id: 1335, cat: Books, desc: "Авто-мото журналы"} + - {id: 1336, cat: Books, desc: "Строительство и дизайн"} + - {id: 1337, cat: Books, desc: "Политика и бизнес"} + - {id: 1338, cat: Books, desc: "Женские журналы"} + - {id: 1339, cat: Books, desc: "Медицина и ЗОЖ"} + - {id: 1340, cat: Books, desc: "Аудио-видео журналы"} + - {id: 1341, cat: Books, desc: "Компьютерные журналы"} + - {id: 1342, cat: Books, desc: "Кулинария"} + - {id: 1343, cat: Books, desc: "Сад, огород, дача"} + - {id: 1344, cat: Books, desc: "Мужские журналы"} + - {id: 1345, cat: Books, desc: "Научно-популярные журналы"} + - {id: 1346, cat: Books, desc: "Домоводство / Своими руками"} + - {id: 1347, cat: Books, desc: "Эротические журналы"} + - {id: 1348, cat: Books, desc: "Комиксы"} + - {id: 1349, cat: Books, desc: "Детские журналы"} + - {id: 1351, cat: Books, desc: "Военные журналы"} + - {id: 1350, cat: Books, desc: "Хобби (Разное)"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: stripcyrillic + type: checkbox + label: Strip Cyrillic Letters + default: false + - name: addrussiantotitle + type: checkbox + label: Add RUS to end of all titles to improve language detection by Sonarr and Radarr. Will cause English-only results to be misidentified. + default: false + - name: sort + type: select + label: Sort requested from site + default: t + options: + t: created + ts: seeders + sz: size + i: title + - name: type + type: select + label: Order requested from site + default: d + options: + d: desc + a: asc + +login: + path: ucp.php?mode=login + method: form + form: form#login + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + autologin: on + error: + - selector: fieldset:has(div.error) + test: + path: / + selector: :has(a[href*="/ucp.php?mode=logout&sid="]) + +search: + paths: + # http://riperam.org/search.php?tracker_search=torrent&keywords=captain&terms=all&fp=1&author=&fid[]=1404&sc=1&sf=titleonly&sr=topics&sk=t&sd=d&st=0&ch=300&t=0 + - path: search.php + inputs: + $raw: "{{ range .Categories }}&fid[]={{.}}{{end}}" + tracker_search: torrent + keywords: "{{ if .Keywords }}{{ .Keywords }}{{ else }}{{ .Today.Year }}{{ end }}" + terms: all + fp: 0 + sc: 1 + sf: titleonly + sr: topics + sk: "{{ .Config.sort }}" + sd: "{{ .Config.type }}" + st: 0 + ch: 300 + t: 0 + + keywordsfilters: + # strip season and/or ep + - name: re_replace + args: ["(?i)\\b(?:[SE]\\d{1,4}){1,2}\\b\\s?", ""] + + rows: + selector: li.row:has(a[href^="./download/file.php?id="]) + + fields: + categorydesc: + selector: dt a:last-of-type + optional: true + default: Разное + title: + selector: a.topictitle + filters: + # normalize to SXXEYY format + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(?:[CС]ери[ияй]|Эпизод|Выпуски?)[\\s:]*(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?)\\s+из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?)\\s+из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(?:[CС]ери[ияй]|Эпизод|Выпуски?)[\\s:]*(\\d+(?:-\\d+)?)", "S$1E$2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?)", "S$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+[CС]езоны?", "S$1"] + - name: re_replace + args: ["(?i)(?:[CС]ери[ияй]|Эпизод|Выпуски?)[\\s:]*(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:[CС]ери[ияй]|Эпизод|Выпуски?)\\s+из\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(?:[CС]ери[ияй]|Эпизод|Выпуски?)[\\s:]*(\\d+(?:-\\d+)?)", "E$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:[CС]ери[ияй]|Эпизод|Выпуски?)", "E$1"] + - name: re_replace + args: ["(?i)\\bКураж-Бамбей\\b", "kurazh"] + - name: re_replace + args: ["(?i)\\bКубик в Кубе\\b", "Kubik"] + - name: re_replace + args: ["(?i)\\bКравец\\b", "Kravec"] + - name: re_replace + args: ["(?i)\\bПифагор\\b", "Pifagor"] + - name: re_replace + args: ["(?i)\\bНевафильм\\b", "Nevafilm"] + - name: re_replace + args: ["(?i)\\bЛицензия\\b", "Lic"] + - name: re_replace + args: ["(?i)\\bселезень\\b", "selezen"] + - name: re_replace + args: ["(\\([\\p{IsCyrillic}\\W]+\\))|(^[\\p{IsCyrillic}\\W\\d]+\\/ )|([\\p{IsCyrillic} \\-]+,+)|([\\p{IsCyrillic}]+)", "{{ if .Config.stripcyrillic }}{{ else }}$1$2$3$4{{ end }}"] + - name: re_replace + args: ["(?i)\\bHDTV[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bSAT[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bWEB[-\\s]?DL[-\\s]?Rip\\b", "WEB-DL"] + - name: re_replace + args: ["(?i)\\bWEB\\sRip\\b", "WEBRip"] + - name: re_replace + args: ["(?i)\\bWEB\\sDL\\b", "WEB-DL"] + - name: re_replace + args: ["[\\[\\(\\{<«][\\s\\W]*[\\]\\)\\}>»]", ""] + - name: re_replace + args: ["^[\\s&,\\.!\\?\\+\\-_\\|\\/':]+", ""] + - name: re_replace + args: ["(?i)^\\(\\s*([SE]\\d+.*?)\\s*\\)[\\s\\/\\|]*(.+)", "$2 $1"] + - name: append + args: "{{ if .Config.addrussiantotitle }} RUS{{ else }}{{ end }}" + details: + selector: a.topictitle + attribute: href + description: + selector: dt a:last-of-type + download: + selector: a[href^="./download/file.php?id="] + attribute: href + size: + selector: dt + filters: + # extract the size + - name: regexp + args: "Размер: (.+?)," + - name: replace + args: ["ТБ", "TB"] + - name: replace + args: ["ГБ", "GB"] + - name: replace + args: ["МБ", "MB"] + - name: replace + args: ["КБ", "KB"] + seeders: + selector: dd.posts span.seed + leechers: + selector: dd.posts span.leech + grabs: + selector: dd.views span.complet + date: + # 12 янв 2019, 11:26 + selector: dt + # auto adjusted by site account profile + filters: + - name: regexp + args: "(\\d{2} \\D{3} \\d{4}, \\d{2}:\\d{2})" + - name: replace + args: ["янв", "Jan"] + - name: replace + args: ["фев", "Feb"] + - name: replace + args: ["мар", "Mar"] + - name: replace + args: ["апр", "Apr"] + - name: replace + args: ["май", "May"] + - name: replace + args: ["июн", "Jun"] + - name: replace + args: ["июл", "Jul"] + - name: replace + args: ["авг", "Aug"] + - name: replace + args: ["сен", "Sep"] + - name: replace + args: ["окт", "Oct"] + - name: replace + args: ["ноя", "Nov"] + - name: replace + args: ["дек", "Dec"] + - name: dateparse + args: "dd MMM yyyy, HH:mm" + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# phpBB diff --git a/config/prowlarr/Definitions/rockbox.yml b/config/prowlarr/Definitions/rockbox.yml new file mode 100644 index 0000000..998a268 --- /dev/null +++ b/config/prowlarr/Definitions/rockbox.yml @@ -0,0 +1,117 @@ +--- +id: RockBox +name: RockBox +description: "RockBox Semi-Private site dedicated to HEAVY METAL/ROCK MUSIC. This definition is for the English site." +language: en-US +type: semi-private +encoding: UTF-8 +links: + - https://rawkbawx.rocks/ + +caps: + categories: + Music: Audio + + modes: + search: [q] + music-search: [q, album, artist] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: sort + type: select + label: Sort requested from site + default: data + options: + data: created + seeds: seeders + size: size + filename: title + - name: type + type: select + label: Order requested from site + default: DESC + options: + DESC: desc + ASC: asc + +login: + path: login.php + method: form + form: form[action="login.php?returnto=index.php"] + inputs: + uid: "{{ .Config.username }}" + pwd: "{{ .Config.password }}" + error: + - selector: div > font[color="#FF0000"] + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + search: "{{ if or (.Query.Artist) (.Query.Album) }}{{ or (.Query.Artist) (.Query.Album) }}{{ else }}{{ .Keywords }}{{ end }}" + # 0 all, 1 active, 2 dead, 3 seedwanted + active: 0 + # 0 title, 1 title+descr, 2 title+subgen + options: 0 + order: "{{ .Config.sort }}" + by: "{{ .Config.type }}" + + rows: + selector: table.lista[width="100%"] tbody tr:has(a[href^="download.php?id="]) + + fields: + category: + text: Music + title: + selector: td a[href^="details.php?id="] + details: + selector: td a[href^="details.php?id="] + attribute: href + download: + selector: td a[href^="download.php?id="] + attribute: href + # dates come in two flavours: + date_year: + # 13/10/2018 + selector: td:nth-child(6):contains("/") + # auto adjusted by site account profile + optional: true + filters: + - name: dateparse + args: "dd/MM/yyyy" + date_ago: + # 1 hour ago, 2 days ago, 3 weeks ago etc + selector: td:nth-child(6):not(:contains("/")) + # auto adjusted by site account profile + optional: true + filters: + - name: timeago + date: + text: "{{ if or .Result.date_year .Result.date_ago }}{{ or .Result.date_year .Result.date_ago }}{{ else }}now{{ end }}" + size: + selector: td:nth-child(7) + seeders: + selector: td:nth-child(9) + leechers: + selector: td:nth-child(10) + grabs: + selector: td:nth-child(11) + downloadvolumefactor: + text: 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 1 day (as seconds = 24 x 60 x 60) + text: 86400 +# BtitTracker 1.3.1 customised diff --git a/config/prowlarr/Definitions/romanianmetaltorrents.yml b/config/prowlarr/Definitions/romanianmetaltorrents.yml new file mode 100644 index 0000000..dcde702 --- /dev/null +++ b/config/prowlarr/Definitions/romanianmetaltorrents.yml @@ -0,0 +1,185 @@ +--- +id: romanianmetaltorrents +name: Romanian Metal Torrents +description: "Romanian Metal Torrents (RMT) is a Private site dedicated to METAL MUSIC. This definition is for the English site." +language: en-US +type: private +encoding: UTF-8 +links: + - https://metal.iplay.ro/ +legacylinks: + - https://metal.stream.bike/ + +caps: + categorymappings: + - {id: 86, cat: Audio/Video, desc: "BluRay video"} + - {id: 84, cat: Audio/Video, desc: "HD video"} + - {id: 20, cat: Audio/Video, desc: "MusicDVD"} + - {id: 36, cat: Audio/Video, desc: "SD video"} + - {id: 63, cat: Audio, desc: "Discography/Album Pack"} + - {id: 65, cat: Audio, desc: "E-Learning"} + - {id: 51, cat: Audio, desc: "Alternative"} + - {id: 46, cat: Audio, desc: "Avant/Experimental"} + - {id: 38, cat: Audio, desc: "Black Metal"} + - {id: 45, cat: Audio, desc: "Darkwave/Ambient"} + - {id: 39, cat: Audio, desc: "Death Metal"} + - {id: 64, cat: Audio, desc: "Doom/Sludge"} + - {id: 40, cat: Audio, desc: "Gothic Metal"} + - {id: 71, cat: Audio, desc: "Grindcore"} + - {id: 85, cat: Audio, desc: "Groove"} + - {id: 74, cat: Audio, desc: "Hard Rock"} + - {id: 41, cat: Audio, desc: "Heavy Metal"} + - {id: 43, cat: Audio, desc: "Industrial/Goth"} + - {id: 73, cat: Audio, desc: "Melodic Death"} + - {id: 75, cat: Audio, desc: "Power Metal"} + - {id: 53, cat: Audio, desc: "Progressive Metal"} + - {id: 44, cat: Audio, desc: "Punk"} + - {id: 2, cat: Audio, desc: "Rock"} + - {id: 42, cat: Audio, desc: "Thrash Metal"} + - {id: 52, cat: Audio, desc: "Viking/Folk "} + - {id: 69, cat: Audio, desc: "[RMT Pack]"} + - {id: 54, cat: Audio, desc: "[V A/Compilation]"} + + modes: + search: [q] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: _ + options: + _: created + 7: seeders + 5: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img + input: vImageCodP + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: ":root:contains(\"Wrong Code!\")" + message: + text: The security code is incorrect. + - selector: table.main:contains("Login failed!") + test: + path: index.php + selector: a[href="logout.php"] + +download: + before: + path: login.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 50 title, 100 description, 150 band - band is OR search instead of AND + tlt: 50 + # 0 active, 1 recommended, 2 incldead, 3 lossy, 4 lossless, 5 req, 6 free or half, 7 videos, 8 int RMT + incldead: "{{ if .Config.freeleech }}6{{ else }}2{{ end }}" + sort: "{{ re_replace .Config.sort \"_\" \"\" }}" + type: "{{ .Config.type }}" + + rows: + selector: table.torrents_table tbody tr:has(a[href^="download2.php?id="]) + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download2.php?id="] + attribute: href + filters: + - name: replace + args: ["download2.php?id=", "download.php/"] + - name: append + args: "/{{ .Result.title }}.torrent" + poster: + selector: td:nth-child(2) a + attribute: onmouseover + filters: + - name: regexp + args: 'img src=(.+?) >' + - name: replace + args: ["./pic/noposter.jpg", ""] + date: + text: now + size: + selector: td:nth-child(6) + artist: + selector: span.bandpropaganda a font + optional: true + description: + selector: span.bandpropaganda + remove: font + seeders: + selector: td:nth-child(7) + filters: + - name: regexp + args: "(\\d+) seeders" + leechers: + selector: td:nth-child(7) + filters: + - name: regexp + args: "(\\d+) leechers" + grabs: + selector: td:nth-child(6) + filters: + - name: regexp + args: "(\\d+) times" + downloadvolumefactor: + case: + img[src$="pic/freedownload.gif"]: 0 + img[src$="pic/half.gif"]: 0.5 + "*": 1 + uploadvolumefactor: + case: + img[src$="pic/sticky2.gif"]: 1.5 + "*": 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# engine n/a diff --git a/config/prowlarr/Definitions/rousi.yml b/config/prowlarr/Definitions/rousi.yml new file mode 100644 index 0000000..1875d0c --- /dev/null +++ b/config/prowlarr/Definitions/rousi.yml @@ -0,0 +1,226 @@ +--- +id: rousi +name: Rousi +description: "Rousi is a CHINESE Private Torrent Tracker for MOVIES / TV / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +requestDelay: 2 +links: + - https://rousi.zip/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "Movies(电影)", default: true} + - {id: 402, cat: TV, desc: "TV Series(电视剧)", default: true} + - {id: 403, cat: TV, desc: "TV Shows(综艺)", default: true} + - {id: 404, cat: TV/Documentary, desc: "Documentaries(纪录片)", default: true} + - {id: 407, cat: TV/Sport, desc: "Sports(体育、竞技、武术及相关)", default: true} + - {id: 410, cat: Console, desc: "Games(游戏及相关)", default: true} + - {id: 406, cat: Audio, desc: "Music(音乐、专辑、MV、演唱会)", default: true} + - {id: 419, cat: TV, desc: "Art(舞蹈、歌剧、戏曲、相声、评书等)", default: true} + - {id: 411, cat: Other, desc: "Science(科学、知识、技能)", default: true} + - {id: 412, cat: Other, desc: "School(应试、考级、初中以上教育)", default: true} + - {id: 413, cat: Books, desc: "Book(书籍、杂志、报刊、有声书)", default: true} + - {id: 414, cat: Other, desc: "Code(IT技术、建模、编程、信息技术、大数据、人工智能)", default: true} + - {id: 405, cat: TV/Anime, desc: "Animations(3D动画、2.5次元)", default: true} + - {id: 415, cat: Other, desc: "ACGN(二次元、漫画、动漫)", default: true} + - {id: 416, cat: Other, desc: "Baby(婴幼、儿童、早教、小学及相关)", default: true} + - {id: 417, cat: Other, desc: "Resource(图片、文档、素材、模板)", default: true} + - {id: 418, cat: PC, desc: "Software(软件、系统、程序、APP等)", default: true} + - {id: 409, cat: Other, desc: "Other(其它,确认上边无分类)", default: true} + # special + - {id: 420, cat: XXX, desc: "步兵(步兵/无码)", default: false} + - {id: 421, cat: XXX, desc: "骑兵(骑兵/有码)", default: false} + - {id: 422, cat: XXX, desc: "III(三级片、限制级电影)", default: false} + - {id: 423, cat: XXX, desc: "H漫(动漫、漫画)", default: false} + - {id: 424, cat: XXX, desc: "H游(游戏及相关)", default: false} + - {id: 425, cat: XXX, desc: "H书(书籍、有声书)", default: false} + - {id: 426, cat: XXX, desc: "H图(写真、图片、私拍、短视频)", default: false} + - {id: 427, cat: XXX, desc: "H音(ASMR、音频、音乐)", default: false} + - {id: 428, cat: XXX, desc: "H综(综艺、综合、剪辑、其它等)", default: false} + - {id: 429, cat: XXX, desc: "H同(男同、女同)", default: false} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: 2facode + type: text + label: 2FA code + - name: info_2fa + type: info + label: "About 2FA code" + default: "Only fill in the 2FA code box if you have enabled 2FA on the Rousi Web Site. Otherwise just leave it empty." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + - name: info_special + type: info + label: "About the Special area (3X)" + default: "Note that the Special area (3X) is only available to ranks Power User and above. If you are a Peasant or User then a search for 3X torrents will return 0 results." + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + secret: "" + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + two_step_code: "{{ .Config.2facode }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("失败")) + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + categories: [401, 402, 403, 404, 407, 410, 406, 419, 411, 412, 413, 414, 405, 415, 416, 417, 418, 409] + - path: special.php + categories: [420, 421, 422, 423, 424, 425, 426, 427, 428, 429] + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl + search_area: "{{ if .Query.IMDBID }}4{{ else }}{{ end }}{{ if .Query.DoubanID }}1{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }}{{ else }}0{{ end }}" + # 0 AND, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(a[href^="download.php?id="]) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: img[data-src] + attribute: data-src + imdbid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="imdb.com/title/tt"] + attribute: href + doubanid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="movie.douban.com/subject/"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-child(5) + seeders: + selector: td.rowfollow:nth-child(6) + leechers: + selector: td.rowfollow:nth-child(7) + grabs: + selector: td.rowfollow:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + description_verified: + case: + span[title="通过"], span[title="通過"], span[title="Allowed"]: "Verified:" + span[title="未审"], span[title="未審"], span[title="Not reviewed"]: "Unverified:" + span[title="拒绝"], span[title="拒絕"], span[title="Denied"]: "Banned:" + description: + selector: td:nth-child(2) + remove: a, b, font, img, span + filters: + - name: prepend + args: "{{ .Result.description_verified }} " +# NexusPHP v1.8.8 2023-09-25 diff --git a/config/prowlarr/Definitions/rptorrents-api.yml b/config/prowlarr/Definitions/rptorrents-api.yml new file mode 100644 index 0000000..2032cbc --- /dev/null +++ b/config/prowlarr/Definitions/rptorrents-api.yml @@ -0,0 +1,187 @@ +--- +id: rptorrents-api +name: RPTorrents (RPT) +description: "RPTorrents (RPT) is a Private Torrent Tracker for MOVIES / TV / GENERAL" +language: en-US +type: private +encoding: UTF-8 +links: + - https://rptscene.xyz/ + +caps: + categorymappings: + - {id: 1, cat: Movies/HD, desc: "Movies HD"} + - {id: 2, cat: Movies/HD, desc: "Movies HD-RO"} + - {id: 3, cat: Movies/HD, desc: "Movie Pack HD-RO"} + - {id: 5, cat: Movies/BluRay, desc: "Movies Bluray"} + - {id: 6, cat: Movies/BluRay, desc: "Movies Bluray-RO"} + - {id: 7, cat: Movies/UHD, desc: "Movies 4K"} + - {id: 8, cat: Movies/UHD, desc: "Movies 4K-RO"} + - {id: 9, cat: TV, desc: "TV"} + - {id: 10, cat: TV, desc: "TV RO"} + - {id: 11, cat: TV, desc: "TV Pack-RO"} + - {id: 12, cat: Audio/MP3, desc: "Music Mp3"} + - {id: 13, cat: Audio/Lossless, desc: "Music Flac"} + - {id: 14, cat: Audio/Video, desc: "Music Video"} + - {id: 15, cat: Movies, desc: "Movies Cartoons"} + - {id: 16, cat: Movies, desc: "Movies Cartoons-RO"} + - {id: 17, cat: Console, desc: "Game"} + - {id: 18, cat: PC/0day, desc: "Application Win"} + - {id: 19, cat: PC/Mac, desc: "Application Mac"} + - {id: 20, cat: XXX, desc: "Movies XXX"} + - {id: 21, cat: Books, desc: "E-Book"} + - {id: 22, cat: TV/Anime, desc: "Anime"} + - {id: 23, cat: PC, desc: "Linux"} + - {id: 24, cat: PC/Mobile-Other, desc: "Mobile"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + music-search: [q] + book-search: [q] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your RPTorrents account My Settings page and clicking on the API Key tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: "/api/torrents/filter" + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + # if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6 + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + seasonNumber: "{{ .Query.Season }}" + episodeNumber: "{{ .Query.Ep }}" + imdbId: "{{ .Query.IMDBIDShort }}" + tmdbId: "{{ .Query.TMDBID }}" + tvdbId: "{{ .Query.TVDBID }}" + "free[]": "{{ if .Config.freeleech }}100{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + + rows: + selector: data + attribute: attributes + + fields: + category: + selector: category_id + title: + selector: name + details: + selector: details_link + download: + selector: download_link + infohash: + selector: info_hash + poster: + selector: meta.poster + filters: + - name: replace + args: ["https://via.placeholder.com/90x135", ""] + imdbid: + selector: imdb_id + tmdbid: + selector: tmdb_id + tvdbid: + selector: tvdb_id + genre: + selector: meta.genres + filters: + - name: re_replace + args: ["(?i)(Science Fiction)", "Science_Fiction"] + - name: re_replace + args: ["(?i)(TV Movie)", "TV_Movie"] + - name: replace + args: [" & ", "_&_"] + description: + text: "{{ .Result.genre }}" + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0%, 25%, 50%, 75%, 100% + selector: freeleech + case: + 0%: 1 # not free + 25%: 0.75 + 50%: 0.5 + 75%: 0.25 + 100%: 0 # freeleech + "*": 0 # catch errors + uploadvolumefactor: + # api returns False, True + selector: double_upload + case: + False: 1 # normal + True: 2 # double +# global MR is 0.4 but torrents must be seeded for 7 days regardless of ratio +# minimumratio: +# text: 0.4 + minimumseedtime: + # 7 day (as seconds = 7 x 24 x 60 x 60) + text: 604800 +# json UNIT3D 7.1.3 diff --git a/config/prowlarr/Definitions/rudub.yml b/config/prowlarr/Definitions/rudub.yml new file mode 100644 index 0000000..62892aa --- /dev/null +++ b/config/prowlarr/Definitions/rudub.yml @@ -0,0 +1,204 @@ +--- +id: rudub +name: RUDUB +description: "RUDUB (ex-BaibaKoTV) is a RUSSIAN Semi-Private Torrent Tracker for TV" +language: ru-RU +type: semi-private +encoding: windows-1251 +links: + - https://rudub.net/ +legacylinks: + - http://baibako.tv/ + - https://baibako.tv/ + - http://bko.baibako.tv/ + - http://rudub.tv/ # redirects to *.net + - http://rudub.co/ + +caps: + categorymappings: + - {id: 1, cat: TV, desc: "TV"} + + modes: + search: [q] + tv-search: [q, season, ep] + allowrawsearch: true + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: stripcyrillic + type: checkbox + label: Strip Cyrillic Letters + default: false + - name: addrussiantotitle + type: checkbox + label: Add RUS to end of all titles to improve language detection by Sonarr and Radarr. Will cause English-only results to be misidentified. + default: false + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: div.login2 + test: + path: / + selector: a[href="logout.php"] + +search: + paths: + # http://rudub.tv/browse.php?search=&incldead=1&sort=4&type=desc + - path: browse.php + inputs: + search: "{{ .Keywords }}" + # 0 incldead, 1 active, 2 onlydead, 3 gold, 4 seedfree + incldead: "{{ if .Config.freeleech }}3{{ else }}0{{ end }}" + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + + keywordsfilters: + # strip season and/or ep + - name: re_replace + args: ["(?i)\\b(?:[SE]\\d{1,4}){1,2}\\b\\s?", ""] + + rows: + selector: div.card__torlist__browse_2 + + fields: + category: + text: 1 + title: + selector: a[href^="details.php?id="] + filters: + # normalize to SXXEYY format + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)\\s*(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)", "S$1E$2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?)", "S$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+[CС]езоны?", "S$1"] + - name: re_replace + args: ["(?i)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)", "E$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "E$1"] + - name: re_replace + args: ["(\\([\\p{IsCyrillic}\\W]+\\))|(^[\\p{IsCyrillic}\\W\\d]+\\/ )|([\\p{IsCyrillic} \\-]+,+)|([\\p{IsCyrillic}]+)", "{{ if .Config.stripcyrillic }}{{ else }}$1$2$3$4{{ end }}"] + - name: re_replace + args: ["(?i)\\bHDTV[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bSAT[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bWEB[-\\s]?DL[-\\s]?Rip\\b", "WEB-DL"] + - name: re_replace + args: ["(?i)\\bWEB\\sRip\\b", "WEBRip"] + - name: re_replace + args: ["(?i)\\bWEB\\sDL\\b", "WEB-DL"] + - name: replace + args: ["BD720p", "BD 720p"] + - name: replace + args: ["HD720p", "HD 720p"] + - name: replace + args: ["HDR720p", "HDR 720p"] + - name: replace + args: ["BD1080p", "BD 1080p"] + - name: replace + args: ["HD1080p", "HD 1080p"] + - name: replace + args: ["HDR1080p", "HDR 1080p"] + - name: replace + args: [" (Золото)", ""] # remove gold tag + - name: re_replace + args: ["[\\[\\(\\{<«][\\s\\W]*[\\]\\)\\}>»]", ""] + - name: re_replace + args: ["^[\\s&,\\.!\\?\\+\\-_\\|\\/':]+", ""] + - name: re_replace + args: ["^\\((.+?)\\s?\\)", "$1 "] + - name: append + args: "{{ if .Config.addrussiantotitle }} RUS{{ else }}{{ end }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + date: + # 2022-03-28 01:28:07 + selector: li[title="Дата"] + filters: + - name: append + args: " +03:00" # MSK + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + files: + selector: li[title="Файлов"] + size: + selector: li[title="Размер"] + seeders: + selector: li[title="Активность"] + filters: + - name: regexp + args: (\d+)\s+\d+ + leechers: + selector: li[title="Активность"] + filters: + - name: regexp + args: \d+\s+(\d+) + grabs: + selector: li[title="Завершено"] + downloadvolumefactor: + case: + "a[href^=\"details.php?id=\"]:contains(\"(Золото)\")": 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 0.3 + description: + selector: a[href^="details.php?id="] +# engine n/a diff --git a/config/prowlarr/Definitions/rustorka.yml b/config/prowlarr/Definitions/rustorka.yml new file mode 100644 index 0000000..1ad06bb --- /dev/null +++ b/config/prowlarr/Definitions/rustorka.yml @@ -0,0 +1,971 @@ +--- +id: rustorka +name: Rustorka +description: "Rustorka is a RUSSIAN Semi-Private Torrent Tracker for TV / MOVIES / GENERAL" +language: ru-RU +type: semi-private +encoding: windows-1251 +links: + - http://rustorka.com/ # site forces http, does not support https + +caps: + categorymappings: + # Игры для PC + # Games for PC + - {id: 1398, cat: PC/Games, desc: "Горячие Новинки"} + - {id: 1399, cat: PC/Games, desc: " |- Горячие RePack'и"} + - {id: 393, cat: PC/Games, desc: "Demo, Alpha, Beta версии"} + - {id: 824, cat: PC/Games, desc: "Steam / Origin Rip's от нашей R.G. GameWorks"} + - {id: 837, cat: PC/Games, desc: " |- Аркады"} + - {id: 836, cat: PC/Games, desc: " |- Приключения и квесты"} + - {id: 835, cat: PC/Games, desc: " |- TBS (пошаговые стратегии)"} + - {id: 834, cat: PC/Games, desc: " |- RTS (стратегии в реальном времени)"} + - {id: 833, cat: PC/Games, desc: " |- Экономические стратегии"} + - {id: 832, cat: PC/Games, desc: " |- Спортивные симуляторы"} + - {id: 831, cat: PC/Games, desc: " |- Авиа/Космические симуляторы"} + - {id: 830, cat: PC/Games, desc: " |- Гоночные симуляторы"} + - {id: 839, cat: PC/Games, desc: " |- Прочие симуляторы"} + - {id: 829, cat: PC/Games, desc: " |- FPS (1st Person)"} + - {id: 828, cat: PC/Games, desc: " |- TPS (3rd Person)"} + - {id: 1948, cat: PC/Games, desc: " |- Horror"} + - {id: 1949, cat: PC/Games, desc: " |- Stealth"} + - {id: 827, cat: PC/Games, desc: " |- RPG"} + - {id: 838, cat: PC/Games, desc: " |- Онлайновые игры"} + - {id: 826, cat: PC/Games, desc: " |- Гонки"} + - {id: 825, cat: PC/Games, desc: " |- Мини игры"} + - {id: 1267, cat: PC/Games, desc: "Steam-Rip's"} + - {id: 1283, cat: PC/Games, desc: " |- Аркады"} + - {id: 1282, cat: PC/Games, desc: " |- Приключения и квесты"} + - {id: 1281, cat: PC/Games, desc: " |- TBS (пошаговые стратегии)"} + - {id: 1280, cat: PC/Games, desc: " |- RTS (стратегии в реальном времени)"} + - {id: 1279, cat: PC/Games, desc: " |- Экономические стратегии"} + - {id: 1278, cat: PC/Games, desc: " |- Спортивные симуляторы"} + - {id: 1277, cat: PC/Games, desc: " |- Авиа/Космические симуляторы"} + - {id: 1276, cat: PC/Games, desc: " |- Гоночные симуляторы"} + - {id: 1275, cat: PC/Games, desc: " |- Прочие симуляторы"} + - {id: 1273, cat: PC/Games, desc: " |- FPS (1st Person)"} + - {id: 1272, cat: PC/Games, desc: " |- TPS (3rd Person)"} + - {id: 1950, cat: PC/Games, desc: " |- Horror"} + - {id: 1951, cat: PC/Games, desc: " |- Stealth"} + - {id: 1271, cat: PC/Games, desc: " |- RPG"} + - {id: 1270, cat: PC/Games, desc: " |- Онлайновые игры"} + - {id: 1269, cat: PC/Games, desc: " |- Гонки"} + - {id: 1268, cat: PC/Games, desc: " |- Мини игры"} + - {id: 1274, cat: PC/Games, desc: " |- Детские игры"} + - {id: 1318, cat: PC/Games, desc: "Origin-Rip's"} + - {id: 1334, cat: PC/Games, desc: " |- Аркады"} + - {id: 1333, cat: PC/Games, desc: " |- Приключения и квесты"} + - {id: 1332, cat: PC/Games, desc: " |- TBS (пошаговые стратегии)"} + - {id: 1331, cat: PC/Games, desc: " |- RTS (стратегии в реальном времени)"} + - {id: 1330, cat: PC/Games, desc: " |- Экономические стратегии"} + - {id: 1329, cat: PC/Games, desc: " |- Спортивные симуляторы"} + - {id: 1328, cat: PC/Games, desc: " |- Авиа/Космические симуляторы"} + - {id: 1327, cat: PC/Games, desc: " |- Гоночные симуляторы"} + - {id: 1326, cat: PC/Games, desc: " |- Прочие симуляторы"} + - {id: 1325, cat: PC/Games, desc: " |- FPS (1st Person)"} + - {id: 1324, cat: PC/Games, desc: " |- TPS (3rd Person)"} + - {id: 1952, cat: PC/Games, desc: " |- Horror"} + - {id: 1953, cat: PC/Games, desc: " |- Stealth"} + - {id: 1323, cat: PC/Games, desc: " |- RPG"} + - {id: 1322, cat: PC/Games, desc: " |- Онлайновые игры"} + - {id: 1321, cat: PC/Games, desc: " |- Гонки"} + - {id: 1320, cat: PC/Games, desc: " |- Мини игры"} + - {id: 1319, cat: PC/Games, desc: " |- Детские игры"} + - {id: 2003, cat: PC/Games, desc: "Релизы от R.G. GOGFAN (Windows)"} + - {id: 2006, cat: PC/Games, desc: " |- Информация по разделу"} + - {id: 2007, cat: PC/Games, desc: " |- Горячие новинки"} + - {id: 2008, cat: PC/Games, desc: " |- Ранний доступ"} + - {id: 2009, cat: PC/Games, desc: " |- Action"} + - {id: 2019, cat: PC/Games, desc: " |- RPG"} + - {id: 2018, cat: PC/Games, desc: " |- Аркады"} + - {id: 2017, cat: PC/Games, desc: " |- Квесты и приключения"} + - {id: 2016, cat: PC/Games, desc: " |- Стратегии"} + - {id: 2015, cat: PC/Games, desc: " |- Симуляторы"} + - {id: 2012, cat: PC/Games, desc: " |- Дополнительные материалы"} + - {id: 1984, cat: PC/Games, desc: "Релизы с GOG.com (игры без защиты)"} + - {id: 1985, cat: PC/Games, desc: " |- Action"} + - {id: 1986, cat: PC/Games, desc: " |- Fighting"} + - {id: 1987, cat: PC/Games, desc: " |- RPG"} + - {id: 1988, cat: PC/Games, desc: " |- Аркады"} + - {id: 1989, cat: PC/Games, desc: " |- Квесты и приключения"} + - {id: 1990, cat: PC/Games, desc: " |- Стратегии"} + - {id: 1991, cat: PC/Games, desc: " |- Симуляторы"} + - {id: 1992, cat: PC/Games, desc: " |- Гонки"} + - {id: 1993, cat: PC/Games, desc: " |- Update"} + - {id: 1994, cat: PC/Games, desc: " |- DLC"} + - {id: 1995, cat: PC/Games, desc: " |- Demo, Alpha, Beta"} + - {id: 1015, cat: PC/Games, desc: "Антологии"} + - {id: 1030, cat: PC/Games, desc: " |- Аркады"} + - {id: 1029, cat: PC/Games, desc: " |- Приключения и квесты"} + - {id: 1028, cat: PC/Games, desc: " |- TBS (пошаговые стратегии)"} + - {id: 1027, cat: PC/Games, desc: " |- RTS (стратегии в реальном времени)"} + - {id: 1026, cat: PC/Games, desc: " |- Экономические стратегии"} + - {id: 1025, cat: PC/Games, desc: " |- Спортивные симуляторы"} + - {id: 1024, cat: PC/Games, desc: " |- Авиа/Космические симуляторы"} + - {id: 1023, cat: PC/Games, desc: " |- Гоночные симуляторы"} + - {id: 1022, cat: PC/Games, desc: " |- Прочие симуляторы"} + - {id: 1021, cat: PC/Games, desc: " |- FPS (1st Person)"} + - {id: 1020, cat: PC/Games, desc: " |- TPS (3rd Person)"} + - {id: 1954, cat: PC/Games, desc: " |- Horror"} + - {id: 1955, cat: PC/Games, desc: " |- Stealth"} + - {id: 1019, cat: PC/Games, desc: " |- RPG"} + - {id: 1018, cat: PC/Games, desc: " |- Онлайновые игры"} + - {id: 1017, cat: PC/Games, desc: " |- Гонки"} + - {id: 1016, cat: PC/Games, desc: " |- Мини игры"} + - {id: 1149, cat: PC/Games, desc: " |- Детские игры"} + - {id: 73, cat: PC/Games, desc: "Аркады"} + - {id: 74, cat: PC/Games, desc: "Приключения и квесты"} + - {id: 75, cat: PC/Games, desc: "Стратегии"} + - {id: 77, cat: PC/Games, desc: " |- TBS (пошаговые стратегии)"} + - {id: 76, cat: PC/Games, desc: " |- RTS (стратегии в реальном времени)"} + - {id: 78, cat: PC/Games, desc: " |- Экономические стратегии"} + - {id: 80, cat: PC/Games, desc: "Симуляторы"} + - {id: 81, cat: PC/Games, desc: " |- Спортивные симуляторы"} + - {id: 82, cat: PC/Games, desc: " |- Авиа/Космические симуляторы"} + - {id: 83, cat: PC/Games, desc: " |- Гоночные симуляторы"} + - {id: 840, cat: PC/Games, desc: " |- Прочие симуляторы"} + - {id: 84, cat: PC/Games, desc: "Action"} + - {id: 85, cat: PC/Games, desc: " |- FPS (1st Person)"} + - {id: 86, cat: PC/Games, desc: " |- TPS (3rd Person)"} + - {id: 1946, cat: PC/Games, desc: " |- Horror"} + - {id: 1947, cat: PC/Games, desc: " |- Stealth"} + - {id: 1788, cat: PC/Games, desc: " |- S.T.A.L.K.E.R."} + - {id: 87, cat: PC/Games, desc: "RPG"} + - {id: 92, cat: PC/Games, desc: "Гонки"} + - {id: 89, cat: PC/Games, desc: "Онлайновые игры"} + - {id: 90, cat: PC/Games, desc: " |- MMORPG"} + - {id: 791, cat: PC/Games, desc: " |- Lineage II"} + - {id: 792, cat: PC/Games, desc: " |- World of Warcraft"} + - {id: 793, cat: PC/Games, desc: " |- FPS / TPS (1st / 3rd Person)"} + - {id: 1143, cat: PC/Games, desc: " |- Counter-Strike"} + - {id: 794, cat: PC/Games, desc: " |- Action с элементами RPG"} + - {id: 1260, cat: PC/Games, desc: " |- Патчи и Апдейты"} + - {id: 91, cat: PC/Games, desc: "Детские игры"} + - {id: 636, cat: PC/Games, desc: "Мини игры"} + - {id: 93, cat: PC/Games, desc: "Старые игры для PC"} + - {id: 795, cat: PC/Games, desc: " |- Симуляторы (Старые игры)"} + - {id: 94, cat: PC/Games, desc: " |- Аркады (Старые игры)"} + - {id: 95, cat: PC/Games, desc: " |- Приключения и квесты (Старые игры)"} + - {id: 96, cat: PC/Games, desc: " |- Стратегии (Старые игры)"} + - {id: 97, cat: PC/Games, desc: " |- Action (Старые игры)"} + - {id: 98, cat: PC/Games, desc: " |- RPG (Старые игры)"} + - {id: 2004, cat: PC/Games, desc: "Релизы от R.G. GOGFAN (macOS)"} + - {id: 2033, cat: PC/Games, desc: " |- Информация по разделу"} + - {id: 2032, cat: PC/Games, desc: " |- Горячие новинки"} + - {id: 2031, cat: PC/Games, desc: " |- Ранний доступ"} + - {id: 2030, cat: PC/Games, desc: " |- Action"} + - {id: 2028, cat: PC/Games, desc: " |- RPG"} + - {id: 2027, cat: PC/Games, desc: " |- Аркады"} + - {id: 2026, cat: PC/Games, desc: " |- Квесты и приключения"} + - {id: 2025, cat: PC/Games, desc: " |- Стратегии"} + - {id: 2024, cat: PC/Games, desc: " |- Симуляторы"} + - {id: 2005, cat: PC/Games, desc: "Релизы от R.G. GOGFAN (Linux)"} + - {id: 2047, cat: PC/Games, desc: " |- Информация по разделу"} + - {id: 2046, cat: PC/Games, desc: " |- Горячие новинки"} + - {id: 2045, cat: PC/Games, desc: " |- Ранний доступ"} + - {id: 2044, cat: PC/Games, desc: " |- Action"} + - {id: 2042, cat: PC/Games, desc: " |- RPG"} + - {id: 2041, cat: PC/Games, desc: " |- Аркады"} + - {id: 2040, cat: PC/Games, desc: " |- Квесты и приключения"} + - {id: 2039, cat: PC/Games, desc: " |- Стратегии"} + - {id: 2038, cat: PC/Games, desc: " |- Симуляторы"} + - {id: 99, cat: PC/Games, desc: "Игры для других ОС"} + - {id: 100, cat: PC/Games, desc: " |- Игры для Mac OS (Macintosh)"} + - {id: 101, cat: PC/Games, desc: " |- Игры для Linux и Unix-подобных (*nix) OS"} + - {id: 102, cat: PC/Games, desc: "Прочее"} + - {id: 107, cat: PC/Games, desc: " |- Патчи"} + - {id: 103, cat: PC/Games, desc: " |- Дополнения к играм"} + - {id: 1090, cat: PC/Games, desc: " |- Мап-Паки к играм"} + - {id: 104, cat: PC/Games, desc: " |- Русификаторы"} + - {id: 1091, cat: PC/Games, desc: " |- Бонусные диски / Комплекты предзаказов"} + - {id: 106, cat: PC/Games, desc: " |- Игровые журналы"} + - {id: 108, cat: PC/Games, desc: "Игровое видео"} + - {id: 109, cat: PC/Games, desc: " |- Трейлеры/Геймплей видео"} + - {id: 110, cat: PC/Games, desc: " |- Видео прохождения игр"} + - {id: 760, cat: PC/Games, desc: " |- Lineage II Movies"} + - {id: 2001, cat: PC/Games, desc: "VR"} + - {id: 1999, cat: PC/Games, desc: "Скрытый"} + # Игры для Консолей + # Games for Consoles + - {id: 295, cat: Console, desc: "XBox"} + - {id: 578, cat: Console, desc: " |- XBox360 | Демоверсии"} + - {id: 1412, cat: Console, desc: " |- XBox360 | Игры"} + - {id: 1413, cat: Console, desc: " |- XBox360 | Kinect Игры"} + - {id: 1032, cat: Console, desc: " |- XBox360 | JTAG"} + - {id: 1087, cat: Console, desc: " |- Xbox360 | Live"} + - {id: 776, cat: Console, desc: " |- XBox360 | Программы / Прошивки"} + - {id: 296, cat: Console, desc: " |- XBox | Игры"} + - {id: 298, cat: Console, desc: "PlayStation"} + - {id: 1998, cat: Console, desc: " |- Playstation 4 | Игры"} + - {id: 1354, cat: Console, desc: " |- Playstation 3 | Демоверсии"} + - {id: 1897, cat: Console, desc: " |- Playstation 3 | Игры"} + - {id: 1138, cat: Console, desc: " |- Playstation 3 | Move Игры"} + - {id: 1262, cat: Console, desc: " |- Playstation 3 | PSN Игры"} + - {id: 1099, cat: Console, desc: " |- Playstation 3 | Разное"} + - {id: 1353, cat: Console, desc: " |- Playstation 3 | Программы / Прошивки"} + - {id: 301, cat: Console, desc: " |- PSP | Игры"} + - {id: 300, cat: Console, desc: " |- PSP | Программы / Прошивки"} + - {id: 620, cat: Console, desc: " |- PSX-PSP"} + - {id: 619, cat: Console, desc: " |- Homebrew игры"} + - {id: 451, cat: Console, desc: " |- PlayStation One | Игры"} + - {id: 299, cat: Console, desc: " |- PlayStation 2 | Игры"} + - {id: 302, cat: Console, desc: "Nintendo"} + - {id: 2002, cat: Console, desc: " |- Switch | Игры"} + - {id: 305, cat: Console, desc: " |- Nintendo DS | Игры"} + - {id: 1285, cat: Console, desc: " |- Nintendo 3DS | Игры"} + - {id: 464, cat: Console, desc: " |- GameCube | Игры"} + - {id: 303, cat: Console, desc: " |- Wii | Игры"} + - {id: 306, cat: Console, desc: "Sega"} + - {id: 307, cat: Console, desc: " |- Dreamcast | Игры"} + - {id: 308, cat: Console, desc: "Старые игры для Консолей"} + # Фильмы | Мультфильмы + # Films | Cartoons + - {id: 1401, cat: Movies, desc: "Новинки кинопроката 2020 (фильмы / мультфильмы)"} + - {id: 1411, cat: Movies, desc: " |- CamRip"} + - {id: 1410, cat: Movies, desc: " |- TeleSync"} + - {id: 1408, cat: Movies, desc: " |- SatRip"} + - {id: 1407, cat: Movies, desc: " |- DVDScreener"} + - {id: 1406, cat: Movies, desc: " |- WEBRip / HDTVRip"} + - {id: 1974, cat: Movies, desc: " |- WEB-DL / WEB-DLRip"} + - {id: 1405, cat: Movies, desc: " |- DVDRip / DVD"} + - {id: 1403, cat: Movies, desc: " |- HDRip"} + - {id: 1817, cat: Movies, desc: " |- HDRip / BDRip-AVC"} + - {id: 1402, cat: Movies, desc: " |- BDRip / Full HD (720p / 1080p / Ultra HD (4K))"} + - {id: 1786, cat: Movies, desc: " |- Blu-Ray / BDRemux"} + - {id: 1982, cat: Movies, desc: " |- HEVC"} + - {id: 1826, cat: Movies, desc: " |- 3D"} + - {id: 1983, cat: Movies, desc: " |- На иностранном языке"} + - {id: 1116, cat: Movies, desc: "3D Видео / фильмы / мультфильмы"} + - {id: 1133, cat: Movies, desc: " |- Боевик"} + - {id: 1132, cat: Movies, desc: " |- Фэнтези"} + - {id: 1131, cat: Movies, desc: " |- Фантастика"} + - {id: 1130, cat: Movies, desc: " |- Детский / Семейный"} + - {id: 1129, cat: Movies, desc: " |- Триллер"} + - {id: 1128, cat: Movies, desc: " |- Приключения / Исторический"} + - {id: 1127, cat: Movies, desc: " |- Драма"} + - {id: 1126, cat: Movies, desc: " |- Классика советского кино"} + - {id: 1125, cat: Movies, desc: " |- Классика мирового кинематографа"} + - {id: 1124, cat: Movies, desc: " |- Детектив"} + - {id: 1123, cat: Movies, desc: " |- Мистика"} + - {id: 1122, cat: Movies, desc: " |- Мелодрама"} + - {id: 1121, cat: Movies, desc: " |- Вестерн"} + - {id: 1120, cat: Movies, desc: " |- Ужасы"} + - {id: 1118, cat: Movies, desc: " |- Комедия"} + - {id: 1117, cat: Movies, desc: " |- Арт-хаус / Авторское кино"} + - {id: 1976, cat: Movies, desc: " |- Мультфильмы"} + - {id: 1809, cat: Movies, desc: " |- Ролики / Музыкальное видео / Трейлеры к фильмам"} + - {id: 579, cat: Movies, desc: "Зарубежное кино (HD / Blu-Ray / HDRip / BDRip 720p/1080p/Ult.."} + - {id: 1822, cat: Movies, desc: " |- 60fps"} + - {id: 597, cat: Movies, desc: " |- Боевик"} + - {id: 596, cat: Movies, desc: " |- Фэнтези"} + - {id: 595, cat: Movies, desc: " |- Фантастика"} + - {id: 594, cat: Movies, desc: " |- Детский / Семейный"} + - {id: 593, cat: Movies, desc: " |- Триллер"} + - {id: 592, cat: Movies, desc: " |- Приключения / Исторический"} + - {id: 591, cat: Movies, desc: " |- Драма"} + - {id: 589, cat: Movies, desc: " |- Классика мирового кинематографа"} + - {id: 588, cat: Movies, desc: " |- Детектив"} + - {id: 587, cat: Movies, desc: " |- Мистика"} + - {id: 586, cat: Movies, desc: " |- Мелодрама"} + - {id: 585, cat: Movies, desc: " |- Вестерн"} + - {id: 584, cat: Movies, desc: " |- Ужасы"} + - {id: 582, cat: Movies, desc: " |- Комедия"} + - {id: 581, cat: Movies, desc: " |- Арт-хаус / Авторское кино"} + - {id: 1978, cat: Movies, desc: " |- Театр"} + - {id: 18, cat: Movies, desc: "Зарубежное кино (DVD / DVDRip / WEB-DLRip / HDRip / HDRip-AV.."} + - {id: 20, cat: Movies, desc: " |- DVD 4.7 GB / 8.5 GB"} + - {id: 21, cat: Movies, desc: " |- Боевик"} + - {id: 22, cat: Movies, desc: " |- Фэнтези"} + - {id: 23, cat: Movies, desc: " |- Фантастика"} + - {id: 24, cat: Movies, desc: " |- Детский / Семейный"} + - {id: 25, cat: Movies, desc: " |- Триллер"} + - {id: 26, cat: Movies, desc: " |- Приключения / Исторический"} + - {id: 27, cat: Movies, desc: " |- Драма"} + - {id: 29, cat: Movies, desc: " |- Классика мирового кинематографа"} + - {id: 30, cat: Movies, desc: " |- Детектив"} + - {id: 31, cat: Movies, desc: " |- Мистика"} + - {id: 32, cat: Movies, desc: " |- Мелодрама"} + - {id: 33, cat: Movies, desc: " |- Вестерн"} + - {id: 1397, cat: Movies, desc: " |- Ужасы"} + - {id: 36, cat: Movies, desc: " |- Комедия"} + - {id: 790, cat: Movies, desc: " |- Индийское кино"} + - {id: 37, cat: Movies, desc: " |- Арт-хаус / Авторское кино"} + - {id: 1977, cat: Movies, desc: " |- Театр"} + - {id: 580, cat: Movies, desc: "Российское кино"} + - {id: 616, cat: Movies, desc: " |- DVD 4.7 GB / 8.5 GB"} + - {id: 614, cat: Movies, desc: " |- Боевик"} + - {id: 613, cat: Movies, desc: " |- Фэнтези"} + - {id: 612, cat: Movies, desc: " |- Фантастика"} + - {id: 611, cat: Movies, desc: " |- Детский / Семейный"} + - {id: 610, cat: Movies, desc: " |- Триллер"} + - {id: 609, cat: Movies, desc: " |- Приключения / Исторический"} + - {id: 608, cat: Movies, desc: " |- Драма"} + - {id: 607, cat: Movies, desc: " |- Классика советского кино"} + - {id: 606, cat: Movies, desc: " |- Детектив"} + - {id: 605, cat: Movies, desc: " |- Мистика"} + - {id: 604, cat: Movies, desc: " |- Мелодрама"} + - {id: 603, cat: Movies, desc: " |- Вестерн"} + - {id: 602, cat: Movies, desc: " |- Ужасы"} + - {id: 600, cat: Movies, desc: " |- Комедия"} + - {id: 599, cat: Movies, desc: " |- Арт-хаус / Авторское кино"} + - {id: 1979, cat: Movies, desc: " |- Театр"} + - {id: 44, cat: Movies, desc: "Мультфильмы"} + - {id: 2000, cat: Movies, desc: " |- 60fps"} + - {id: 48, cat: Movies, desc: " |- Мультфильмы HD"} + - {id: 854, cat: Movies, desc: " |- Короткометражные мультфильмы"} + - {id: 50, cat: Movies, desc: " |- Зарубежные полнометражные мультфильмы"} + - {id: 49, cat: Movies, desc: " |- Отечественные полнометражные мультфильмы"} + - {id: 1980, cat: Movies, desc: " |- Классика"} + - {id: 452, cat: Movies, desc: "Дилогии / Трилогии / Квадралогии"} + - {id: 1831, cat: Movies, desc: " |- DVDRip / HDRip / BDRip / AVC"} + - {id: 1830, cat: Movies, desc: " |- BDRip 720"} + - {id: 1829, cat: Movies, desc: " |- BDRip 1080 / BDRemux"} + - {id: 1828, cat: Movies, desc: " |- BluRay"} + - {id: 1827, cat: Movies, desc: " |- Фильмографии"} + - {id: 1825, cat: Movies, desc: "Фильмы для iOS / Android / КПК"} + # Великая Отечественная Война + # World War II + - {id: 1958, cat: Movies, desc: "Фильмы"} + - {id: 1959, cat: Movies, desc: "Сериалы"} + # Сериалы | Мультсериалы + # Series | Cartoons + - {id: 1862, cat: TV, desc: "Новинки (сериалы / мультсериалы)"} + - {id: 1867, cat: TV, desc: " |- SatRip"} + - {id: 1866, cat: TV, desc: " |- WEB DLRip / WEB DLRip-AVC"} + - {id: 1865, cat: TV, desc: " |- HDTVRip / HDTVRip-AVC"} + - {id: 1864, cat: TV, desc: " |- WEB DL / HDTV 720"} + - {id: 1863, cat: TV, desc: " |- WEB DL / HDTV 1080"} + - {id: 1855, cat: TV, desc: "Американские"} + - {id: 1861, cat: TV, desc: " |- DVDRip"} + - {id: 1860, cat: TV, desc: " |- SatRip"} + - {id: 1859, cat: TV, desc: " |- WEB DLRip / WEB DLRip-AVC"} + - {id: 1858, cat: TV, desc: " |- HDTVRip / HDRip / AVC"} + - {id: 1857, cat: TV, desc: " |- WEB DL / HD / BDRip 720"} + - {id: 1856, cat: TV, desc: " |- WEB DL / HD / BDRip 1080"} + - {id: 1848, cat: TV, desc: "Европейские / Другие"} + - {id: 1854, cat: TV, desc: " |- DVDRip"} + - {id: 1853, cat: TV, desc: " |- SatRip"} + - {id: 1852, cat: TV, desc: " |- WEB DLRip / WEB DLRip-AVC"} + - {id: 1851, cat: TV, desc: " |- HDTVRip / HDRip / AVC"} + - {id: 1850, cat: TV, desc: " |- WEB DL / HD / BDRip 720"} + - {id: 1849, cat: TV, desc: " |- WEB DL / HD / BDRip 1080"} + - {id: 1841, cat: TV, desc: "Российские"} + - {id: 1847, cat: TV, desc: " |- DVDRip"} + - {id: 1846, cat: TV, desc: " |- SatRip"} + - {id: 1845, cat: TV, desc: " |- WEB DLRip / WEB DLRip-AVC"} + - {id: 1844, cat: TV, desc: " |- HDTVRip / HDRip / AVC"} + - {id: 1843, cat: TV, desc: " |- WEB DL / HD / BDRip 720"} + - {id: 1842, cat: TV, desc: " |- WEB DL / HD / BDRip 1080"} + - {id: 1871, cat: TV, desc: "Мультсериалы"} + - {id: 1877, cat: TV, desc: " |- DVDRip"} + - {id: 1876, cat: TV, desc: " |- SatRip"} + - {id: 1875, cat: TV, desc: " |- WEB DLRip / WEB DLRip-AVC"} + - {id: 1874, cat: TV, desc: " |- HDTVRip / HDRip / AVC"} + - {id: 1873, cat: TV, desc: " |- WEB DL / HD / BDRip 720"} + - {id: 1872, cat: TV, desc: " |- WEB DL / HD / BDRip 1080"} + # Аниме + # Anime + - {id: 1879, cat: TV/Anime, desc: "Аниме"} + - {id: 1883, cat: TV/Anime, desc: " |- Новинки"} + - {id: 1882, cat: TV/Anime, desc: " |- Дорамы"} + - {id: 1881, cat: TV/Anime, desc: " |- Манга"} + - {id: 1880, cat: TV/Anime, desc: " |- AMV"} + - {id: 1890, cat: TV/Anime, desc: "Основной раздел"} + - {id: 1893, cat: TV/Anime, desc: " |- HDTVRip / HDTV 720 / 1080"} + - {id: 1892, cat: TV/Anime, desc: " |- DVD / DVDRip"} + - {id: 1891, cat: TV/Anime, desc: " |- BDRip / HDRip / AVC"} + - {id: 653, cat: TV/Anime, desc: " |- TVRip / VHSRip / Другие"} + - {id: 314, cat: TV/Anime, desc: " |- PSP"} + - {id: 659, cat: TV/Anime, desc: "OST"} + - {id: 661, cat: TV/Anime, desc: " |- mp3"} + - {id: 660, cat: TV/Anime, desc: " |- lossless"} + - {id: 662, cat: TV/Anime, desc: "Обои на рабочий стол/картинки/арты"} + - {id: 642, cat: TV/Anime, desc: "Флудилка"} + # Документалистика, Юмор, Спорт + # Documentary, Comedy, Sports + - {id: 1918, cat: TV/Documentary, desc: "Документальные фильмы и передачи"} + - {id: 1943, cat: TV/Documentary, desc: " |- 3D Фильмы, HD (720р / 1080р)"} + - {id: 1942, cat: TV/Documentary, desc: " |- Авиация"} + - {id: 1941, cat: TV/Documentary, desc: " |- Космос"} + - {id: 1940, cat: TV/Documentary, desc: " |- Криминалистика"} + - {id: 1939, cat: TV/Documentary, desc: " |- Вторая мировая война"} + - {id: 1938, cat: TV/Documentary, desc: " |- Военное дело"} + - {id: 1937, cat: TV/Documentary, desc: " |- Медицина и здоровье"} + - {id: 1936, cat: TV/Documentary, desc: " |- Путешествия и туризм"} + - {id: 1935, cat: TV/Documentary, desc: " |- История / Мировая культура / Религия"} + - {id: 1934, cat: TV/Documentary, desc: " |- Растительный и животный мир"} + - {id: 1933, cat: TV/Documentary, desc: " |- Личности и кумиры"} + - {id: 1932, cat: TV/Documentary, desc: " |- Научно-популярные и познавательные фильмы"} + - {id: 1931, cat: TV/Documentary, desc: " |- BBC / Discovery / National Geographic"} + - {id: 1930, cat: TV/Documentary, desc: " |- Информационно-аналитические и политические передачи"} + - {id: 1919, cat: TV/Documentary, desc: "Развлекательные передачи, шоу и юмор"} + - {id: 1929, cat: TV/Documentary, desc: " |- Юмористические программы и шоу"} + - {id: 1928, cat: TV/Documentary, desc: " |- КВН"} + - {id: 1927, cat: TV/Documentary, desc: " |- Уральские пельмени"} + - {id: 1925, cat: TV/Documentary, desc: " |- Авторские передачи"} + - {id: 1920, cat: TV/Documentary, desc: "Спорт"} + - {id: 1924, cat: TV/Documentary, desc: " |- Футбол"} + - {id: 1923, cat: TV/Documentary, desc: " |- Хоккей"} + - {id: 1922, cat: TV/Documentary, desc: " |- Формула 1"} + - {id: 1921, cat: TV/Documentary, desc: " |- Другие виды спорта"} + # Обучающее видео + # Tutorial video + - {id: 240, cat: Other, desc: "Обучающие видеокурсы и уроки"} + - {id: 246, cat: Other, desc: " |- Здоровье и медицина"} + - {id: 241, cat: Other, desc: " |- Психология и саморазвитие"} + - {id: 245, cat: Other, desc: " |- Восточные оздоровительные практики"} + - {id: 855, cat: Other, desc: " |- Спорт, фитнес"} + - {id: 1944, cat: Other, desc: " |- Боевые искусства"} + - {id: 244, cat: Other, desc: " |- Игра на гитаре"} + - {id: 243, cat: Other, desc: " |- Бизнес, экономика и финансы"} + - {id: 242, cat: Other, desc: " |- Учебные видео для детей и родителей"} + - {id: 1812, cat: Other, desc: " |- Строительство и ремонт, сделай сам"} + - {id: 1813, cat: Other, desc: " |- Кулинария"} + - {id: 1814, cat: Other, desc: " |- Фотография, работа с фото"} + - {id: 1815, cat: Other, desc: " |- Прочие видеокурсы и уроки"} + - {id: 247, cat: Other, desc: "Компьютерные видеокурсы и уроки"} + - {id: 253, cat: Other, desc: " |- Компьютерные сети и безопасность"} + - {id: 252, cat: Other, desc: " |- ОС и серверные программы Microsoft"} + - {id: 251, cat: Other, desc: " |- 2D-графика"} + - {id: 250, cat: Other, desc: " |- 3D-графика, моделирование"} + - {id: 1810, cat: Other, desc: " |- Веб-дизайн, программирование"} + - {id: 249, cat: Other, desc: " |- Программирование"} + - {id: 248, cat: Other, desc: " |- Работа с видео"} + - {id: 1811, cat: Other, desc: " |- Прочие компьютерные видеокурсы и уроки"} + # Обучение иностранным языкам + # Teaching foreign languages + - {id: 324, cat: Other, desc: "Обучение иностранным языкам"} + - {id: 329, cat: Other, desc: " |- Аудиокниги на иностранных языках"} + - {id: 1289, cat: Other, desc: " |- Художественная литература на иностранных языках"} + - {id: 328, cat: Other, desc: " |- Английский язык"} + - {id: 327, cat: Other, desc: " |- Немецкий язык"} + - {id: 326, cat: Other, desc: " |- Французский язык"} + - {id: 325, cat: Other, desc: " |- Испанский язык"} + - {id: 1288, cat: Other, desc: " |- Японский язык"} + # Музыка + # Music + - {id: 471, cat: Audio, desc: "Зарубежный Рок, Панк, Альтернатива"} + - {id: 769, cat: Audio, desc: " |- Pop-Rock &Soft Rock (mp3)"} + - {id: 1160, cat: Audio, desc: " |- Gothic Rock &Dark Folk"} + - {id: 767, cat: Audio, desc: " |- Classic Rock &Hard Rock (mp3)"} + - {id: 473, cat: Audio, desc: " |- Punk, Hardcore / Reggae, SKA, Dub"} + - {id: 474, cat: Audio, desc: " |- Indie / Post-Punk / Britpop / Post-Rock"} + - {id: 475, cat: Audio, desc: " |- Alternative &Nu-Metal"} + - {id: 1159, cat: Audio, desc: " |- Progressive &Art-Rock"} + - {id: 728, cat: Audio, desc: " |- Emocore &Post-hardcore"} + - {id: 476, cat: Audio, desc: " |- Клипы"} + - {id: 478, cat: Audio, desc: "Зарубежный метал"} + - {id: 479, cat: Audio, desc: " |- Avant-garde, Experimetal Metal, Progressive"} + - {id: 480, cat: Audio, desc: " |- Black Metal"} + - {id: 770, cat: Audio, desc: " |- Symphonic Metal"} + - {id: 481, cat: Audio, desc: " |- Folk, Pagan, Viking"} + - {id: 482, cat: Audio, desc: " |- Doom, Sludge, Stoner"} + - {id: 483, cat: Audio, desc: " |- Gothic, Industrial Metal"} + - {id: 484, cat: Audio, desc: " |- Grind, Brutal Death"} + - {id: 485, cat: Audio, desc: " |- Death Metal"} + - {id: 486, cat: Audio, desc: " |- Heavy, Power Metal"} + - {id: 487, cat: Audio, desc: " |- Metalcore, Deathcore, Mathcore"} + - {id: 488, cat: Audio, desc: " |- Thrash, Speed, Groove"} + - {id: 489, cat: Audio, desc: " |- Клипы"} + - {id: 490, cat: Audio, desc: "Отечественный Рок, Панк, Метал, Альтернатива"} + - {id: 491, cat: Audio, desc: " |- Рок, Панк, Альтернатива"} + - {id: 492, cat: Audio, desc: " |- Метал"} + - {id: 494, cat: Audio, desc: " |- Клипы"} + - {id: 495, cat: Audio, desc: "Рэп, Хип - Хоп, R'n'B"} + - {id: 507, cat: Audio, desc: " |- R'n'B"} + - {id: 506, cat: Audio, desc: " |- Отечественный Rap / Hip-hop"} + - {id: 505, cat: Audio, desc: " |- Иностранный Rap / Hip-hop"} + - {id: 496, cat: Audio, desc: " |- Клипы"} + - {id: 669, cat: Audio, desc: "Электронная музыка"} + - {id: 789, cat: Audio, desc: " |- Chiptune"} + - {id: 702, cat: Audio, desc: " |- Trance"} + - {id: 700, cat: Audio, desc: " |- Goa Trance, Psy-Trance"} + - {id: 699, cat: Audio, desc: " |- PsyChill, Ambient Dub"} + - {id: 697, cat: Audio, desc: " |- House"} + - {id: 696, cat: Audio, desc: " |- Techno"} + - {id: 694, cat: Audio, desc: " |- Hardcore, Hardstyle, Jumpstyle"} + - {id: 692, cat: Audio, desc: " |- Drum &Bass"} + - {id: 691, cat: Audio, desc: " |- Jungle"} + - {id: 690, cat: Audio, desc: " |- Breakbeat"} + - {id: 689, cat: Audio, desc: " |- Dubstep"} + - {id: 688, cat: Audio, desc: " |- IDM"} + - {id: 687, cat: Audio, desc: " |- Chillout, Lounge, Downtempo"} + - {id: 684, cat: Audio, desc: " |- Trip-Hop"} + - {id: 683, cat: Audio, desc: " |- Nu Jazz, Acid Jazz, Future Jazz"} + - {id: 1031, cat: Audio, desc: " |- Electronic, Dance, Club"} + - {id: 679, cat: Audio, desc: " |- Traditional Electronic"} + - {id: 1158, cat: Audio, desc: " |- Radioshow, Podcast, Liveset, Mixes"} + - {id: 678, cat: Audio, desc: " |- Ambient"} + - {id: 677, cat: Audio, desc: " |- Experimental"} + - {id: 674, cat: Audio, desc: " |- EBM, Dark Electro, Aggrotech"} + - {id: 671, cat: Audio, desc: " |- Synthpop, New Wave, SpaceSynth"} + - {id: 788, cat: Audio, desc: " |- Uplifting Trance"} + - {id: 704, cat: Audio, desc: " |- Клипы"} + - {id: 508, cat: Audio, desc: "Классика и Инструментал"} + - {id: 511, cat: Audio, desc: " |- Инструменталы"} + - {id: 510, cat: Audio, desc: " |- Классика"} + - {id: 509, cat: Audio, desc: " |- Клипы"} + - {id: 512, cat: Audio, desc: "Джаз и Блюз"} + - {id: 708, cat: Audio, desc: " |- Отечественный Джаз"} + - {id: 709, cat: Audio, desc: " |- Отечественный Блюз"} + - {id: 710, cat: Audio, desc: " |- Зарубежный Джаз"} + - {id: 711, cat: Audio, desc: " |- Зарубежный Блюз"} + - {id: 513, cat: Audio, desc: " |- Клипы"} + - {id: 516, cat: Audio, desc: "Поп музыка"} + - {id: 1265, cat: Audio, desc: " |- Зарубежная Поп музыка"} + - {id: 518, cat: Audio, desc: " |- Отечественная Поп музыка"} + - {id: 738, cat: Audio, desc: " |- EuroDance(mp3)"} + - {id: 517, cat: Audio, desc: " |- Клипы"} + - {id: 519, cat: Audio, desc: "Шансон / Авторская песня"} + - {id: 522, cat: Audio, desc: " |- Шансон"} + - {id: 521, cat: Audio, desc: " |- Авторская песня"} + - {id: 520, cat: Audio, desc: " |- Клипы"} + - {id: 730, cat: Audio, desc: "Восточно-азиатская музыка"} + - {id: 735, cat: Audio, desc: " |- Рок"} + - {id: 734, cat: Audio, desc: " |- Метал"} + - {id: 733, cat: Audio, desc: " |- Рэп, Хип - Хоп, R'n'B"} + - {id: 732, cat: Audio, desc: " |- Поп музыка"} + - {id: 731, cat: Audio, desc: " |- Клипы"} + - {id: 523, cat: Audio, desc: "Музыка других жанров"} + - {id: 716, cat: Audio, desc: " |- Отечественная музыка других жанров"} + - {id: 714, cat: Audio, desc: " |- Зарубежная музыка других жанров"} + - {id: 715, cat: Audio, desc: " |- Советская эстрада, Ретро"} + - {id: 1148, cat: Audio, desc: " |- Неофициальные и внежанровые сборники"} + - {id: 713, cat: Audio, desc: " |- Православные песнопения"} + - {id: 712, cat: Audio, desc: " |- Сборники песен для детей"} + - {id: 524, cat: Audio, desc: " |- Клипы"} + - {id: 525, cat: Audio, desc: "Саундтреки и OST"} + - {id: 529, cat: Audio, desc: " |- Саундтреки к фильмам"} + - {id: 528, cat: Audio, desc: " |- Саундтреки к играм"} + - {id: 526, cat: Audio, desc: "NewAge &Meditative"} + - {id: 527, cat: Audio, desc: " |- Клипы"} + - {id: 668, cat: Audio, desc: "Industrial"} + - {id: 530, cat: Audio, desc: "Lossless музыка (без потери качества)"} + - {id: 542, cat: Audio, desc: " |- Зарубежный Рок, Панк, Метал, Альтернатива (lossless)"} + - {id: 541, cat: Audio, desc: " |- Отечественный Рок, Панк, Метал, Альтернатива (lossless)"} + - {id: 540, cat: Audio, desc: " |- Рэп, Хип - Хоп, R'n'B (lossless)"} + - {id: 539, cat: Audio, desc: " |- Электронная музыка (lossless)"} + - {id: 538, cat: Audio, desc: " |- Зарубежная поп музыка (lossless)"} + - {id: 763, cat: Audio, desc: " |- Отечественная поп музыка(lossless)"} + - {id: 739, cat: Audio, desc: " |- EuroDance (lossless)"} + - {id: 537, cat: Audio, desc: " |- Классика и Инструментал (lossless)"} + - {id: 705, cat: Audio, desc: " |- Джаз и Блюз (lossless)"} + - {id: 536, cat: Audio, desc: " |- Шансон / Авторская песня (lossless)"} + - {id: 535, cat: Audio, desc: " |- NewAge &Meditative (lossless)"} + - {id: 740, cat: Audio, desc: " |- Саундтреки к играм (lossless)"} + - {id: 741, cat: Audio, desc: " |- Саундтреки к фильмам (lossless)"} + - {id: 533, cat: Audio, desc: " |- DVD-Audio и многоканальный звук"} + - {id: 532, cat: Audio, desc: " |- Оцифровка аналоговых носителей"} + - {id: 543, cat: Audio, desc: "Видео концерты и документальные фильмы о музыке"} + - {id: 548, cat: Audio, desc: " |- Концерты (Зарубежный Rock, Metal, Punk, Alternative)"} + - {id: 547, cat: Audio, desc: " |- Концерты (Отечественный Рок, Метал, Панк, Альтернатива)"} + - {id: 546, cat: Audio, desc: " |- Концерты (Pop)"} + - {id: 545, cat: Audio, desc: " |- Концерты (Rap/R'n'B)"} + - {id: 544, cat: Audio, desc: " |- Концерты (Other)"} + - {id: 549, cat: Audio, desc: "Музыкальное DVD и HD видео"} + - {id: 551, cat: Audio, desc: " |- Концерты"} + - {id: 550, cat: Audio, desc: " |- Клипы"} + - {id: 553, cat: Audio, desc: "Караоке"} + # Книги, Журналы, Ноты + # Books, Magazines, Sheet music + - {id: 1450, cat: Books, desc: "Художественная литература"} + - {id: 1209, cat: Books, desc: " |- Новинки"} + - {id: 1215, cat: Books, desc: " |- Боевики/Детективы/Триллеры"} + - {id: 1218, cat: Books, desc: " |- Приключения"} + - {id: 1219, cat: Books, desc: " |- Романы"} + - {id: 1212, cat: Books, desc: " |- Отечественная фантастика / фэнтези / мистика / ужасы"} + - {id: 1211, cat: Books, desc: " |- Зарубежная фантастика / фэнтези / мистика / ужасы"} + - {id: 1210, cat: Books, desc: " |- Классическая литература и современная проза"} + - {id: 334, cat: Books, desc: " |- Детские книги и журналы"} + - {id: 1316, cat: Books, desc: " |- Комедийные произведения, юмор, сатира"} + - {id: 338, cat: Books, desc: " |- Разное"} + - {id: 1449, cat: Books, desc: "Военная литература"} + - {id: 1223, cat: Books, desc: " |- Военная история"} + - {id: 1451, cat: Books, desc: " |- Военная техника"} + - {id: 1452, cat: Books, desc: " |- Стрелковое оружие"} + - {id: 1453, cat: Books, desc: " |- Холодное оружие"} + - {id: 1454, cat: Books, desc: " |- Боевые искусства"} + - {id: 1781, cat: Books, desc: " |- Энциклопедии, справочники"} + - {id: 1448, cat: Books, desc: "Журналы"} + - {id: 337, cat: Books, desc: " |- Авто-мото журналы"} + - {id: 1455, cat: Books, desc: " |- Строительство и дизайн"} + - {id: 1456, cat: Books, desc: " |- Политика и бизнес"} + - {id: 1457, cat: Books, desc: " |- Женские журналы"} + - {id: 1774, cat: Books, desc: " |- Медицина и ЗОЖ"} + - {id: 1773, cat: Books, desc: " |- Аудио-видео журналы"} + - {id: 1458, cat: Books, desc: " |- Компьютерные журналы"} + - {id: 1459, cat: Books, desc: " |- Кулинария"} + - {id: 1772, cat: Books, desc: " |- Сад, огород, дача"} + - {id: 1460, cat: Books, desc: " |- Мужские журналы"} + - {id: 1461, cat: Books, desc: " |- Научно-популярные журналы"} + - {id: 1776, cat: Books, desc: " |- Домоводство / Своими руками"} + - {id: 1462, cat: Books, desc: " |- Эротические журналы"} + - {id: 1463, cat: Books, desc: " |- Комиксы"} + - {id: 1775, cat: Books, desc: " |- Хобби (Разное)"} + - {id: 1447, cat: Books, desc: "Компьютерная литература"} + - {id: 1464, cat: Books, desc: " |- Информатика"} + - {id: 1465, cat: Books, desc: " |- Веб-дизайн"} + - {id: 1466, cat: Books, desc: " |- Базы данных"} + - {id: 1467, cat: Books, desc: " |- Интернет, сети"} + - {id: 1468, cat: Books, desc: " |- Программирование и алгоритмы"} + - {id: 1469, cat: Books, desc: " |- Графика, обработка видео"} + - {id: 1470, cat: Books, desc: " |- Операционные системы"} + - {id: 1471, cat: Books, desc: " |- Информационная безопасность"} + - {id: 1472, cat: Books, desc: " |- Литература по компьютерным играм"} + - {id: 1473, cat: Books, desc: " |- Разное"} + - {id: 1782, cat: Books, desc: " |- Энциклопедии, справочники"} + - {id: 1446, cat: Books, desc: "Авто/мото литература"} + - {id: 1783, cat: Books, desc: " |- Энциклопедии, справочники"} + - {id: 1445, cat: Books, desc: "Научно-образовательная и справочная литература"} + - {id: 1780, cat: Books, desc: " |- Авиация / Космонавтика"} + - {id: 1437, cat: Books, desc: " |- Гуманитарные науки"} + - {id: 341, cat: Books, desc: " |- Точные и естественные науки"} + - {id: 1474, cat: Books, desc: " |- Техническая литература"} + - {id: 1221, cat: Books, desc: " |- В помощь школьникам и студентам"} + - {id: 1475, cat: Books, desc: " |- Обучение иностранным языкам"} + - {id: 815, cat: Books, desc: " |- Психология"} + - {id: 1476, cat: Books, desc: " |- Юридическая литература и право"} + - {id: 1477, cat: Books, desc: " |- Энциклопедии, словари, справочники"} + - {id: 1478, cat: Books, desc: " |- Нормативные документы и законодательные акты"} + - {id: 1444, cat: Books, desc: "Медицина, здоровье, спорт"} + - {id: 1479, cat: Books, desc: " |- Справочники, энциклопедии"} + - {id: 1480, cat: Books, desc: " |- Сексология"} + - {id: 1481, cat: Books, desc: " |- Разное"} + - {id: 1443, cat: Books, desc: "Увлечения и хобби"} + - {id: 761, cat: Books, desc: " |- Охота и Рыбалка"} + - {id: 1357, cat: Books, desc: " |- Сад, огород"} + - {id: 1224, cat: Books, desc: " |- Кулинария"} + - {id: 817, cat: Books, desc: " |- Строительство, ремонт, интерьер"} + - {id: 1482, cat: Books, desc: " |- Декоративно-прикладное искусство"} + - {id: 1483, cat: Books, desc: " |- Сделай сам"} + - {id: 1484, cat: Books, desc: " |- Фотоискусство"} + - {id: 1485, cat: Books, desc: " |- Прочие хобби"} + - {id: 1784, cat: Books, desc: " |- Энциклопедии, справочники"} + - {id: 1442, cat: Books, desc: "История, политология, публицистика"} + - {id: 1486, cat: Books, desc: " |- Античная литература. Мифы, легенды"} + - {id: 1487, cat: Books, desc: " |- Биография и мемуары"} + - {id: 1488, cat: Books, desc: " |- Прочее"} + - {id: 1785, cat: Books, desc: " |- Энциклопедии, справочники"} + - {id: 1441, cat: Books, desc: "Библиотеки и мультимедийные издания"} + - {id: 1489, cat: Books, desc: " |- Коллекции книг, собрания сочинений"} + - {id: 1490, cat: Books, desc: " |- Мультимедийные и интерактивные издания"} + - {id: 1440, cat: Books, desc: "Ноты и Теория музыки"} + - {id: 348, cat: Books, desc: " |- Ноты"} + # Аудиокниги + # Audiobooks + - {id: 343, cat: Audio/Audiobook, desc: "Аудиокниги"} + - {id: 820, cat: Audio/Audiobook, desc: " |- История"} + - {id: 819, cat: Audio/Audiobook, desc: " |- Юмор"} + - {id: 818, cat: Audio/Audiobook, desc: " |- Религия"} + - {id: 346, cat: Audio/Audiobook, desc: " |- Детская литература"} + - {id: 345, cat: Audio/Audiobook, desc: " |- Фантастика"} + - {id: 1142, cat: Audio/Audiobook, desc: " |- Классика"} + - {id: 1438, cat: Audio/Audiobook, desc: " |- Поэзия"} + - {id: 821, cat: Audio/Audiobook, desc: " |- Психология"} + - {id: 344, cat: Audio/Audiobook, desc: " |- Художественная литература"} + - {id: 1908, cat: Audio/Audiobook, desc: " |- Прочая литература"} + - {id: 1140, cat: Audio/Audiobook, desc: "Аудиоспектакли"} + # Мобильные устройства + # Mobile devices + - {id: 1173, cat: PC/Mobile-Other, desc: "F.A.Q. по разделу / Прочее"} + - {id: 1166, cat: PC/Mobile-Other, desc: "Windows Phone"} + - {id: 1176, cat: PC/Mobile-Other, desc: " |- Игры"} + - {id: 1175, cat: PC/Mobile-Other, desc: " |- Программы"} + - {id: 1174, cat: PC/Mobile-Other, desc: " |- Прошивки"} + - {id: 1202, cat: PC/Mobile-Other, desc: " |- Разное"} + - {id: 1167, cat: PC/Mobile-Other, desc: "Android"} + - {id: 1179, cat: PC/Mobile-Other, desc: " |- Игры"} + - {id: 1178, cat: PC/Mobile-Other, desc: " |- Программы"} + - {id: 1177, cat: PC/Mobile-Other, desc: " |- Прошивки"} + - {id: 1203, cat: PC/Mobile-Other, desc: " |- Разное"} + - {id: 1168, cat: PC/Mobile-Other, desc: "iOS"} + - {id: 1182, cat: PC/Mobile-Other, desc: " |- Игры"} + - {id: 1181, cat: PC/Mobile-Other, desc: " |- Программы"} + - {id: 1180, cat: PC/Mobile-Other, desc: " |- Прошивки"} + - {id: 1205, cat: PC/Mobile-Other, desc: " |- Разное"} + - {id: 1170, cat: PC/Mobile-Other, desc: "Другие ОС"} + - {id: 1188, cat: PC/Mobile-Other, desc: " |- Игры"} + - {id: 1187, cat: PC/Mobile-Other, desc: " |- Программы"} + - {id: 1186, cat: PC/Mobile-Other, desc: " |- Прошивки"} + - {id: 1206, cat: PC/Mobile-Other, desc: " |- Разное"} + - {id: 1172, cat: PC/Mobile-Other, desc: "Программы для PC"} + # Программное обеспечение + # Software + - {id: 349, cat: PC, desc: "Mac OS. Программное обеспечение под них"} + - {id: 352, cat: PC, desc: " |- Mac OS (для Apple Macintosh)"} + - {id: 351, cat: PC, desc: " |- Mac OS (для РС-Hackintosh)"} + - {id: 350, cat: PC, desc: " |- Системные программы для Mac OS"} + - {id: 353, cat: PC, desc: "Unix, Unix-подобные (*nix) и другие OS. Программное обеспече.."} + - {id: 356, cat: PC, desc: " |- Операционные системы (Unix и Unix-подобные)"} + - {id: 355, cat: PC, desc: " |- Программное обеспечение для Unix и Unix-подобных OS"} + - {id: 354, cat: PC, desc: " |- Другие OS и программное обеспечение под них"} + - {id: 1427, cat: PC, desc: "Microsoft Windows OS"} + - {id: 1433, cat: PC, desc: " |- Настольные OS, выпущенные до 2001 года (Microsoft Windows OS.."} + - {id: 1432, cat: PC, desc: " |- Windows XP"} + - {id: 1431, cat: PC, desc: " |- Windows Vista"} + - {id: 1430, cat: PC, desc: " |- Windows 7"} + - {id: 1429, cat: PC, desc: " |- Windows 8"} + - {id: 1906, cat: PC, desc: " |- Windows 10"} + - {id: 2054, cat: PC, desc: " |- Windows 11"} + - {id: 1428, cat: PC, desc: " |- Серверные (Microsoft Windows OS)"} + - {id: 1910, cat: PC, desc: " |- Мультисборки Windows OS"} + - {id: 363, cat: PC, desc: "Системные программы"} + - {id: 367, cat: PC, desc: " |- Настройка и обслуживание. Диагностика"} + - {id: 366, cat: PC, desc: " |- Архиваторы и файловые менеджеры"} + - {id: 365, cat: PC, desc: " |- Работа с носителями информации"} + - {id: 460, cat: PC, desc: " |- Драйвера"} + - {id: 364, cat: PC, desc: " |- Антивирусы, Файерволы и защита информации"} + - {id: 1070, cat: PC, desc: " |- Разное"} + - {id: 368, cat: PC, desc: "Пользовательские программы"} + - {id: 371, cat: PC, desc: " |- Системы для офиса, бизнеса и научной работы"} + - {id: 370, cat: PC, desc: " |- Аудио- и видео-, CD- проигрыватели и каталогизаторы"} + - {id: 369, cat: PC, desc: " |- Обучающие программы, справочники, энциклопедии"} + - {id: 1071, cat: PC, desc: " |- Программы для Интернет и сетей"} + - {id: 1072, cat: PC, desc: " |- Программы для изменения интерфейса Windows"} + - {id: 1073, cat: PC, desc: " |- Разное"} + - {id: 372, cat: PC, desc: "Веб-разработка и Программирование"} + - {id: 376, cat: PC, desc: " |- Текстовые редакторы с подсветкой"} + - {id: 375, cat: PC, desc: " |- Среды программирования, компиляторы и вспомогательные програ.."} + - {id: 374, cat: PC, desc: " |- Компоненты для сред программирования"} + - {id: 373, cat: PC, desc: " |- Системы управления базами данных (СУБД)"} + - {id: 762, cat: PC, desc: " |- Веб-скрипты"} + - {id: 377, cat: PC, desc: "Создание и редактирование мультимедиа и 3D контента"} + - {id: 381, cat: PC, desc: " |- Программные комплекты"} + - {id: 380, cat: PC, desc: " |- Графические редакторы"} + - {id: 379, cat: PC, desc: " |- Редакторы видео"} + - {id: 378, cat: PC, desc: " |- Работа со звуком"} + - {id: 1074, cat: PC, desc: " |- Конвертеры"} + - {id: 1075, cat: PC, desc: " |- Разное"} + - {id: 1911, cat: PC, desc: "Прочее ПО"} + - {id: 1916, cat: PC, desc: " |- WPI"} + - {id: 1915, cat: PC, desc: " |- САПР"} + - {id: 1914, cat: PC, desc: " |- ГИС"} + - {id: 1913, cat: PC, desc: " |- LiveCD/DVD/Flash/USB"} + - {id: 385, cat: PC, desc: " |- 3D графика"} + - {id: 1912, cat: PC, desc: " |- Прочее"} + # Wallpapers / Обои / Рисунки / Картинки + # Wallpapers / Wallpaper / Drawings / Pictures + - {id: 1375, cat: Other, desc: "Обои"} + - {id: 1377, cat: Other, desc: "Иконки"} + - {id: 1376, cat: Other, desc: "Аватары"} + - {id: 387, cat: Other, desc: "Растровые и Векторные Клипарты"} + - {id: 386, cat: Other, desc: "Заготовки, виньетки, рамки"} + - {id: 388, cat: Other, desc: "Разное"} + # Архив + # Archive + - {id: 1297, cat: Other, desc: "Архив"} + - {id: 1299, cat: Other, desc: " |- Архив фильмов | мультфильмов"} + - {id: 1300, cat: Other, desc: " |- Архив сериалов | мультсериалов"} + - {id: 1302, cat: Other, desc: " |- Архив Anime"} + - {id: 1303, cat: Other, desc: " |- Архив музыки"} + - {id: 1304, cat: Other, desc: " |- Архив игр для PC"} + - {id: 1305, cat: Other, desc: " |- Архив игр для консолей"} + - {id: 1306, cat: Other, desc: " |- Архив для мобильных устройств"} + - {id: 1307, cat: Other, desc: " |- Архив для программного обеспечения"} + - {id: 1308, cat: Other, desc: " |- Архив (для раздач других категорий)"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: stripcyrillic + type: checkbox + label: Strip Cyrillic Letters + default: false + - name: addrussiantotitle + type: checkbox + label: Add RUS to end of all titles to improve language detection by Sonarr and Radarr. Will cause English-only results to be misidentified. + default: false + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 1 + options: + 1: created + 10: seeders + 7: size + 2: title + - name: type + type: select + label: Order requested from site + default: 2 + options: + 2: desc + 1: asc + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: forum/index.php + selector: a[href="./login.php?logout=1"] + +search: + paths: + - path: forum/tracker.php + inputs: + $raw: "{{ if .Categories }}{{ range .Categories }}f[]={{.}}&{{end}}{{ else }}f[]=-1{{ end }}" + prev_allw: 0 + prev_a: 0 + prev_dla: 0 + prev_dlc: 0 + prev_dld: 0 + prev_dlw: 0 + prev_my: 0 + prev_new: 0 + prev_sd: 0 + prev_da: 1 + prev_dc: 0 + prev_df: 1 + prev_ds: 0 + prev_snotd: 0 + prev_not_checked: 0 + prev_closed: 0 + prev_d: 0 + prev_not_perfect: 0 + prev_part_perfect: 0 + prev_fishily: 0 + prev_copy: 0 + prev_temp: 0 + prev_pogl: 0 + prev_mod: 0 + prev_gold: 0 + prev_silver: 0 + # sort by 1=registered, 2=topicTitle, 4=completed, 10=seed, 11=leech, 12=up, 13=down, 5=replies, 6=views, 7=size, 8=lastPost, 9=seedLastSeen + o: "{{ .Config.sort }}" + # 1=asc, 2=desc + s: "{{ .Config.type }}" + # show category + dc: 0 + # show forum + df: 1 + # show author + da: 1 + # show speed + ds: 0 + # -1=all time + tm: -1 + # seed not seen -1=disregard + sns: -1 + # group releases -1=not selected + srg: -1 + nm: "{{ .Keywords }}" + # search by partial word + allw: 0 + gold: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + + keywordsfilters: + - name: diacritics + args: replace + - name: re_replace # S01 to сезон 1 + args: ["(?i)\\bS0*(\\d+)\\b", "сезон $1"] + - name: re_replace # E02 to сери 1 + args: ["(?i)\\bE0*(\\d+)\\b", "сери $1"] + - name: re_replace # S01E02 to сезон 1 сери 2 + args: ["(?i)\\bS0*(\\d+)E0*(\\d+)\\b", "сезон $1 сери $2"] + + rows: + selector: tr[id^="tor_"]:has(a[href^="./download.php?id="]) + + fields: + category: + selector: a[href^="tracker.php?f="] + attribute: href + filters: + - name: querystring + args: f + title: + selector: a[href^="./viewtopic.php?t="] + filters: + # normalize to SXXEYY format + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)\\s*(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)", "S$1E$2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?)", "S$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+[CС]езоны?", "S$1"] + - name: re_replace + args: ["(?i)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)", "E$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "E$1"] + - name: re_replace + args: ["(\\([\\p{IsCyrillic}\\W]+\\))|(^[\\p{IsCyrillic}\\W\\d]+\\/ )|([\\p{IsCyrillic} \\-]+,+)|([\\p{IsCyrillic}]+)", "{{ if .Config.stripcyrillic }}{{ else }}$1$2$3$4{{ end }}"] + - name: re_replace + args: ["(?i)\\bHDTV[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bSAT[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bWEB[-\\s]?DL[-\\s]?Rip\\b", "WEB-DL"] + - name: re_replace + args: ["(?i)\\bWEB\\sRip\\b", "WEBRip"] + - name: re_replace + args: ["(?i)\\bWEB\\sDL\\b", "WEB-DL"] + - name: re_replace + args: ["[\\[\\(\\{<«][\\s\\W]*[\\]\\)\\}>»]", ""] + - name: re_replace + args: ["^[\\s&,\\.!\\?\\+\\-_\\|\\/':]+", ""] + - name: append + args: "{{ if .Config.addrussiantotitle }} RUS{{ else }}{{ end }}" + details: + selector: a[href^="./viewtopic.php?t="] + attribute: href + download: + selector: a[href^="./download.php?id="] + attribute: href + size: + selector: td:nth-child(7) > u + seeders: + selector: td.seedmed > b + leechers: + selector: td.leechmed > b + grabs: + selector: td:nth-child(10) + date: + # unix + selector: td:last-child > u + downloadvolumefactor: + case: + img[src="images/tor_gold.gif"]: 0 + img[src="images/tor_silver.gif"]: 0.5 + "*": 1 + uploadvolumefactor: + text: 1 + description: + selector: a[href^="./viewtopic.php?t="] +# TorrentPier diff --git a/config/prowlarr/Definitions/rutor.yml b/config/prowlarr/Definitions/rutor.yml new file mode 100644 index 0000000..519cfb0 --- /dev/null +++ b/config/prowlarr/Definitions/rutor.yml @@ -0,0 +1,212 @@ +--- +id: rutor +name: RuTor +description: "RuTor is a RUSSIAN Public site for MOVIES / TV / GENERAL" +language: ru-RU +type: public +encoding: UTF-8 +links: + - http://rutor.info/ # site does not support https ERR_CONNECTION_REFUSED + - http://rutor.is/ # site does not support https ERR_CONNECTION_REFUSED + - http://new-rutor.org/ # site does not support https ERR_CONNECTION_REFUSED + - https://rutor.mrunblock.bond/ # for magnet only + - https://rutor.nocensor.cloud/ +legacylinks: + - http://live-rutor.org/ # domain expired 9 Feb 2020 + - https://rutor.black-mirror.xyz/ + - https://rutor.unblocked.casa/ + - https://rutor.proxyportal.fun/ + - https://rutor.uk-unblock.xyz/ + - https://rutor.ind-unblock.xyz/ + - https://rutor.unblocked.bar/ + - https://rutor.proxyportal.pw/ + - https://rutor.uk-unblock.pro/ + - https://rutor.root.yt/ + - https://rutor.unblocked.rest/ + - https://rutor.unblocked.monster/ + - https://rutor.nocensor.space/ + - https://rutor.nocensor.work/ + - http://6tor.org/ + - https://rutor.nocensor.world/ + - https://rutor.nocensor.lol/ + - https://rutor.nocensor.art/ + - https://rutor.mrunblock.guru/ + - https://rutor.mrunblock.life/ + - https://rutor.nocensor.click/ + +caps: + # unfortunately RuTor does not display categories anywhere in its search results page :-( + # albeit you can select a single category in its search options + # so I've opted not to support categories + categorymappings: + - {id: 1, cat: Movies, desc: "Movies"} + - {id: 2, cat: TV, desc: "TV"} + - {id: 3, cat: Other, desc: "Other"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + +settings: + - name: stripcyrillic + type: checkbox + label: Strip Cyrillic Letters + default: false + - name: addrussiantotitle + type: checkbox + label: Add RUS to end of all titles to improve language detection by Sonarr and Radarr. Will cause English-only results to be misidentified. + default: false + - name: info + type: info + label: A note about RuTor + default: RuTor does not display categories in its search results page. This definition is probably only suitable for Prowlarr Dashboard Manual searches. + - name: sort + type: select + label: Sort requested from site (Applies only to Search with Keywords) + default: 0 + options: + 0: "created desc" + 1: "created asc" + 2: "seeders desc" + 3: "seeders asc" + 6: "size desc" + 7: "size asc" + 8: "title desc" + 9: "title asc" + +search: + paths: + # http://rutor.info/search/0/0/010/0/tt10288566 # search title and descr for imdb + # http://rutor.info/search/0/0/100/0/gotham%2004x01 # search title for query + # http://rutor.info/top/ # search keywordless + - path: "{{ if .Query.IMDBID }}search/0/0/010/{{ .Config.sort }}/{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if .Keywords }}search/0/0/100/{{ .Config.sort }}/{{ .Keywords }}/{{ else }}{{ end }}{{ if or .Keywords .Query.IMDBID }}{{ else }}top/{{ end }}" + + rows: + selector: tr:has(td:has(a[href^="magnet:?xt="])) + + fields: + category: + text: 3 + title: + selector: td:nth-of-type(2) a[href^="/torrent/"] + filters: + # normalize to SXXEYY format + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(?:[CС]ери[ияй]|Эпизод|Выпуски?)[\\s:]*(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?)\\s+из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?)\\s+из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(\\d+(?:-\\d+)?)[хx](\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(?:[CС]ери[ияй]|Эпизод|Выпуски?)[\\s:]*(\\d+(?:-\\d+)?)", "S$1E$2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?)", "S$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+[CС]езоны?", "S$1"] + - name: re_replace + args: ["(?i)(?:[CС]ери[ияй]|Эпизод|Выпуски?)[\\s:]*(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:[CС]ери[ияй]|Эпизод|Выпуски?)\\s+из\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(?:[CС]ери[ияй]|Эпизод|Выпуски?)[\\s:]*(\\d+(?:-\\d+)?)", "E$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:[CС]ери[ияй]|Эпизод|Выпуски?)", "E$1"] + - name: re_replace + args: ["(?i)\\bFiles-х\\b", "Files-x"] + - name: re_replace + args: ["(?i)\\s\\|\\sот\\s([\\w\\p{P}\\p{S}]+)$", "-$1"] + - name: re_replace + args: ["\\s\\|\\s(\\w{4,})$", "-$1"] + - name: re_replace + args: ["(?i)\\sот\\s([\\w\\p{P}\\p{S}]+)$", "-$1"] + - name: re_replace + args: ["\\s\\|\\s(\\w{4,})$", "-$1"] + - name: re_replace + args: ["(\\([\\p{IsCyrillic}\\W]+\\))|(^[\\p{IsCyrillic}\\W\\d]+\\/ )|([\\p{IsCyrillic} \\-]+,+)|([\\p{IsCyrillic}]+)", "{{ if .Config.stripcyrillic }}{{ else }}$1$2$3$4{{ end }}"] + - name: re_replace + args: ["(?i)\\bHDTV[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bSAT[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bWEB[-\\s]?DL[-\\s]?Rip\\b", "WEB-DL"] + - name: re_replace + args: ["(?i)\\bWEB\\sRip\\b", "WEBRip"] + - name: re_replace + args: ["(?i)\\bWEB\\sDL\\b", "WEB-DL"] + - name: re_replace + args: ["[\\[\\(\\{<«][\\s\\W]*[\\]\\)\\}>»]", ""] + - name: re_replace + args: ["^[\\s&,\\.!\\?\\+\\-_\\|\\/':]+", ""] + - name: append + args: "{{ if .Config.addrussiantotitle }} RUS{{ else }}{{ end }}" + details: + selector: td:nth-of-type(2) a[href^="/torrent/"] + attribute: href + magnet: + selector: td:nth-of-type(2) a[href^="magnet:?xt="] + attribute: href + date: + # 27 Окт 17 + selector: td:nth-of-type(1) + filters: + # replace white spaces + - name: re_replace + args: ["[\\s]+", " "] + # replace month abbreviations + - name: replace + args: ["Янв", "Jan"] + - name: replace + args: ["Фев", "Feb"] + - name: replace + args: ["Мар", "Mar"] + - name: replace + args: ["Апр", "Apr"] + - name: replace + args: ["Май", "May"] + - name: replace + args: ["Июн", "Jun"] + - name: replace + args: ["Июл", "Jul"] + - name: replace + args: ["Авг", "Aug"] + - name: replace + args: ["Сен", "Sep"] + - name: replace + args: ["Окт", "Oct"] + - name: replace + args: ["Ноя", "Nov"] + - name: replace + args: ["Дек", "Dec"] + - name: append + args: " 00:00:00 +03:00" # MSK + - name: dateparse + args: "dd MMM yy HH:mm:ss zzz" + # some results don't have comments which throws off td count. So we go fishing for the following fields + size: + optional: true + selector: td:contains(\00a0GB), td:contains(\00a0MB), td:contains(\00a0kB), td:contains(\00a0B) + seeders: + selector: td span.green + leechers: + selector: td span.red + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 + description: + selector: td:nth-of-type(2) a[href^="/torrent/"] +# engine n/a diff --git a/config/prowlarr/Definitions/rutracker-ru.yml b/config/prowlarr/Definitions/rutracker-ru.yml new file mode 100644 index 0000000..2f5cbd4 --- /dev/null +++ b/config/prowlarr/Definitions/rutracker-ru.yml @@ -0,0 +1,538 @@ +--- +id: rutracker-ru +name: RuTracker.RU +description: "RuTracker.RU is a RUSSIAN Public Torrent Tracker for MOVIES / TV / GENERAL" +language: ru-RU +type: public +encoding: UTF-8 +links: + - http://rutracker.ru/ # site does not support https + +caps: + categorymappings: + # Кинематограф movies + - {id: 1736, cat: Movies, desc: "Кинематограф Зарубежные фильмы 2024"} + - {id: 1737, cat: Movies/HD, desc: "Кинематограф Зарубежные фильмы 2024 (HD Video)"} + - {id: 1738, cat: Movies, desc: "Кинематограф Российские фильмы 2024"} + - {id: 1739, cat: Movies/HD, desc: "Кинематограф Российские фильмы 2024 (HD Video)"} + - {id: 1697, cat: Movies, desc: "Кинематограф Зарубежные фильмы (2023)"} + - {id: 1696, cat: Movies, desc: "Кинематограф Российские фильмы (2023)"} + - {id: 1698, cat: Movies/HD, desc: "Кинематограф Зарубежные фильмы в 720p (2023)"} + - {id: 1699, cat: Movies/HD, desc: "Кинематограф Российские фильмы в 720p (2023)"} + - {id: 1701, cat: Movies/HD, desc: "Кинематограф Зарубежные фильмы в 1080p (2023)"} + - {id: 1702, cat: Movies/HD, desc: "Кинематограф Российские фильмы в 1080р (2023)"} + - {id: 1677, cat: Movies, desc: "Кинематограф Зарубежные фильмы (2022)"} + - {id: 1676, cat: Movies, desc: "Кинематограф Российские фильмы (2022)"} + - {id: 1675, cat: Movies/HD, desc: "Кинематограф Зарубежные фильмы в 720p (2022)"} + - {id: 1674, cat: Movies/HD, desc: "Кинематограф Российские фильмы в 720p (2022)"} + - {id: 1673, cat: Movies/HD, desc: "Кинематограф Зарубежные фильмы в 1080p (2022)"} + - {id: 1672, cat: Movies/HD, desc: "Кинематограф Российские фильмы в 1080р (2022)"} + - {id: 1656, cat: Movies, desc: "Фильмы 2021 года"} + - {id: 1662, cat: Movies, desc: " |- Зарубежные фильмы (2021)"} + - {id: 1661, cat: Movies, desc: " |- Российские фильмы (2021)"} + - {id: 1660, cat: Movies/HD, desc: " |- Зарубежные фильмы в 720p (2021)"} + - {id: 1659, cat: Movies/HD, desc: " |- Российские фильмы в 720p (2021)"} + - {id: 1658, cat: Movies/HD, desc: " |- Зарубежные фильмы в 1080p (2021)"} + - {id: 1657, cat: Movies/HD, desc: " |- Российские фильмы в 1080р (2021)"} + - {id: 1564, cat: Movies, desc: "Фильмы 2020 года"} + - {id: 1573, cat: Movies, desc: " |- Зарубежные фильмы (2020)"} + - {id: 1572, cat: Movies, desc: " |- Российские фильмы (2020)"} + - {id: 1571, cat: Movies/HD, desc: " |- Зарубежные фильмы в 720p (2020)"} + - {id: 1570, cat: Movies/HD, desc: " |- Российские фильмы в 720p (2020)"} + - {id: 1569, cat: Movies/HD, desc: " |- Зарубежные фильмы в 1080p (2020)"} + - {id: 1568, cat: Movies/HD, desc: " |- Российские фильмы в 1080р (2020)"} + - {id: 1730, cat: Movies, desc: " |- Зарубежные фильмы"} + - {id: 1731, cat: Movies/HD, desc: " |- Зарубежные фильмы (HDvideo)"} + - {id: 1732, cat: Movies, desc: " |- Российские фильмы"} + - {id: 1733, cat: Movies/HD, desc: " |- Российские фильмы (HDvideo)"} + - {id: 1725, cat: Movies, desc: " |- Зарубежные фильмы"} + - {id: 1726, cat: Movies/HD, desc: " |- Зарубежные фильмы (HDvideo)"} + - {id: 1727, cat: Movies, desc: " |- Российские фильмы"} + - {id: 1728, cat: Movies/HD, desc: " |- Российские фильмы (HDvideo)"} + - {id: 1719, cat: Movies, desc: " |- Зарубежные фильмы"} + - {id: 1720, cat: Movies/HD, desc: " |- Зарубежные фильмы (HDvideo)"} + - {id: 1721, cat: Movies, desc: " |- Российские фильмы"} + - {id: 1722, cat: Movies/HD, desc: " |- Российские фильмы (HDvideo)"} + - {id: 1715, cat: Movies, desc: " |- Зарубежные фильмы до 1990 г."} + - {id: 1734, cat: Movies, desc: " |- Классика зарубежного кино"} + - {id: 1716, cat: Movies, desc: " |- Советское кино"} + - {id: 820, cat: Movies/HD, desc: "Зарубежные фильмы"} + - {id: 840, cat: Movies/DVD, desc: " |- DVD5 , DVD9"} + - {id: 841, cat: Movies/3D, desc: " |- Фильмы в 3D формате"} + - {id: 825, cat: Movies, desc: " |- Азиатское кино"} + - {id: 830, cat: Movies, desc: " |- Индийское кино"} + - {id: 1317, cat: Movies, desc: " |- Детские фильмы, сказки, сериалы"} + - {id: 838, cat: Movies, desc: " |- Короткометражные фильмы"} + - {id: 845, cat: Movies, desc: " |- В оригинале"} + - {id: 1560, cat: Movies, desc: " |- Фильмы с переводом UKR"} + - {id: 798, cat: Movies/HD, desc: "Российские фильмы"} + - {id: 802, cat: Movies/DVD, desc: " |- DVD5 , DVD9"} + - {id: 801, cat: Movies/3D, desc: " |- Фильмы в 3D формате"} + - {id: 1318, cat: Movies, desc: " |- Детские фильмы, сказки, сериалы"} + # Сериалы TV + - {id: 1708, cat: TV, desc: " |- Зарубежные сериалы 2023"} + - {id: 1710, cat: TV/HD, desc: " |- Зарубежные сериалы 2023 (720p, 1080p)"} + - {id: 1709, cat: TV, desc: " |- Отечественные сериалы 2023"} + - {id: 1711, cat: TV/HD, desc: " |- Отечественные сериалы 2023 (720p, 1080p)"} + - {id: 1705, cat: TV/WEB-DL, desc: " |- WEBRip, WEB-DLRip, SATRip"} + - {id: 1086, cat: TV/HD, desc: " |- Зарубежные сериалы (HD Video)"} + - {id: 1085, cat: TV/HD, desc: " |- Зарубежные сериалы (Full HD)"} + - {id: 1551, cat: TV/UHD, desc: " |- Зарубежные сериалы 4K"} + - {id: 1087, cat: TV/SD, desc: " |- Сериалы на DVD"} + - {id: 1703, cat: TV/WEB-DL, desc: " |- WEBRip, WEB-DLRip, SATRip"} + - {id: 1083, cat: TV/HD, desc: " |- Отечественные сериалы (HD Video)"} + - {id: 1082, cat: TV/HD, desc: " |- Отечественные сериалы (Full HD)"} + - {id: 1084, cat: TV/SD, desc: " |- Сериалы на DVD"} + # Мультипликация Animation + - {id: 125, cat: TV, desc: "Мультфильмы"} + - {id: 1353, cat: TV/HD, desc: " |- Мультфильмы 1080р"} + - {id: 1355, cat: TV/HD, desc: " |- Мультфильмы 720p"} + - {id: 1352, cat: TV/SD, desc: " |- Мультфильмы на DVD"} + - {id: 1343, cat: TV/Anime, desc: " |- Аниме"} + - {id: 1025, cat: TV/Anime, desc: " |- Мультфильмы в 3D формате"} + - {id: 8, cat: TV, desc: "Мультсериалы"} + - {id: 1347, cat: TV/HD, desc: " |- Мультсериалы 1080р"} + - {id: 1348, cat: TV/HD, desc: " |- Мультсериалы 720p"} + - {id: 1349, cat: TV/SD, desc: " |- Мультсериалы на DVD"} + # Документалистика, развлекательные телепередачи, спорт Docs + - {id: 12, cat: TV, desc: "Развлекательные телепередачи"} + - {id: 13, cat: TV/Sport, desc: "Спорт"} + # Игры Games + - {id: 60, cat: PC/Games, desc: "Игры для PC"} + - {id: 73, cat: Console, desc: " |- Горячие новинки 2021 года (только AAA проекты)"} + - {id: 61, cat: Console, desc: " |- Онлайн Игры"} + - {id: 1234, cat: Console, desc: " |- Симуляторы"} + - {id: 84, cat: Console, desc: " |- Action"} + - {id: 82, cat: Console, desc: " |- Гонки"} + - {id: 85, cat: Console, desc: " |- RPG"} + - {id: 78, cat: Console, desc: " |- Стратегии"} + - {id: 77, cat: Console, desc: " |- Приключения и квесты"} + - {id: 76, cat: Console, desc: " |- Аркады"} + - {id: 1538, cat: Console, desc: "Игры для консолей"} + - {id: 1539, cat: Console/PSP, desc: " |- PlayStation"} + - {id: 878, cat: Console/XBox, desc: " |- XBox"} + # Книги, Журналы, Аудиокниги Books + - {id: 726, cat: Books, desc: "Художественная литература, журналы, газеты"} + - {id: 728, cat: Books, desc: " |- Журналы и газеты"} + - {id: 761, cat: Books, desc: " |- Фантастика, фентези, мистика"} + - {id: 760, cat: Books, desc: " |- Детективы, боевики, триллеры"} + - {id: 757, cat: Books, desc: " |- Классика мировой литературы"} + - {id: 1314, cat: Books, desc: " |- Детская литература"} + - {id: 722, cat: Books, desc: "Научная, техническая и учебная литература, хобби"} + - {id: 727, cat: Books, desc: " |- Увлечения, хобби"} + - {id: 1021, cat: Books, desc: " |- Инструкции, Схемы, Технические и сервисные документации"} + - {id: 1020, cat: Books, desc: " |- Сварка, Пайка"} + - {id: 730, cat: Audio/Audiobook, desc: "Аудиокниги"} + - {id: 776, cat: Audio/Audiobook, desc: " |- Фантастика ♪ Фэнтези ♪ Ужасы ♪ Мистика (Аудио)"} + - {id: 777, cat: Audio/Audiobook, desc: " |- Детективы ♪ приключения ♪ триллеры ♪ боевики (Аудио)"} + - {id: 1156, cat: Audio/Audiobook, desc: " |- Историческая литература ♪ биографии ♪ мемуары (Аудио)"} + - {id: 1158, cat: Audio/Audiobook, desc: " |- Зарубежная литература (Аудио)"} + - {id: 1233, cat: Audio/Audiobook, desc: " |- Русская литература (Аудио)"} + - {id: 1159, cat: Audio/Audiobook, desc: " |- Современные любовные романы (Аудио)"} + - {id: 1315, cat: Audio/Audiobook, desc: " |- Детская литература (Аудио)"} + - {id: 1223, cat: Audio/Audiobook, desc: " |- Учебная и научно-популярная литература (Аудио)"} + # Музыка Music + - {id: 1635, cat: Audio/MP3, desc: "Зарубежная музыка"} + - {id: 1637, cat: Audio/MP3, desc: " |- Зарубежные сборники mp3"} + - {id: 1643, cat: Audio/MP3, desc: " |- Зарубежная поп музыка (mp3)"} + - {id: 1636, cat: Audio/MP3, desc: " |- Сборники музыки 50/50 mp3"} + - {id: 1639, cat: Audio/MP3, desc: " |- Сборники клубной музыки (Club,Dance)"} + - {id: 1640, cat: Audio/Lossless, desc: " |- Зарубежный шансон (mp3,Flac)"} + - {id: 1177, cat: Audio/MP3, desc: "Отечественная музыка."} + - {id: 1642, cat: Audio/MP3, desc: " |- Российская попса (альбомы, синглы mp3)"} + - {id: 1427, cat: Audio/MP3, desc: " |- Сборники Российской поп музыки (mp3)"} + - {id: 1641, cat: Audio/MP3, desc: " |- Шансон и авторская песня (mp3)"} + - {id: 1561, cat: Audio/MP3, desc: " |- Сборники Русского шансона (mp3)"} + - {id: 1598, cat: Audio/MP3, desc: "Отечественный Rock, Metal"} + - {id: 1599, cat: Audio/MP3, desc: " |- Отечественный Rock (mp3)"} + - {id: 1600, cat: Audio/MP3, desc: " |- Отечественный Metal (mp3)"} + - {id: 1601, cat: Audio/MP3, desc: " |- Сборники Rock, Metal (mp3)"} + - {id: 1200, cat: Audio/MP3, desc: " |- Classic Rock & Hard Rock"} + - {id: 1552, cat: Audio/MP3, desc: " |- Progressive & Art-Rock"} + - {id: 1565, cat: Audio/MP3, desc: " |- Folk-Rock, Folk-Punk, Songwriter"} + - {id: 1554, cat: Audio/MP3, desc: " |- Melodic Rock, Arena rock"} + - {id: 1553, cat: Audio/MP3, desc: " |- Pop-Rock & Soft Rock"} + - {id: 1567, cat: Audio/MP3, desc: " |- Instrumental Guitar Rock (Виртуозы гитары)"} + - {id: 1566, cat: Audio/MP3, desc: " |- Rockabilly, Rock'n'Roll"} + - {id: 1713, cat: Audio/MP3, desc: " |- Blues-Rock, Country, Indie-Rock"} + - {id: 1556, cat: Audio/MP3, desc: " |- Сборники зарубежного рока"} + - {id: 1588, cat: Audio/MP3, desc: " |- Avant-garde, Experimental Metal"} + - {id: 1580, cat: Audio/MP3, desc: " |- Black Metal"} + - {id: 1581, cat: Audio/MP3, desc: " |- Death, Doom"} + - {id: 1582, cat: Audio/MP3, desc: " |- Folk, Pagan, Viking"} + - {id: 1583, cat: Audio/MP3, desc: " |- Gothic Metal"} + - {id: 1584, cat: Audio/MP3, desc: " |- Grind, Brutal Death"} + - {id: 1585, cat: Audio/MP3, desc: " |- Heavy, Power, Progressive"} + - {id: 1586, cat: Audio/MP3, desc: " |- Sludge, Stoner, Post-Metal"} + - {id: 1587, cat: Audio/MP3, desc: " |- Thrash, Speed"} + - {id: 1602, cat: Audio/MP3, desc: " |- Сборники Metal"} + - {id: 1590, cat: Audio/MP3, desc: " |- Alternative & Nu-metal"} + - {id: 1591, cat: Audio/MP3, desc: " |- Punk"} + - {id: 1592, cat: Audio/MP3, desc: " |- Hardcore"} + - {id: 1593, cat: Audio/MP3, desc: " |- Indie, Post-Rock & Post-Punk"} + - {id: 1594, cat: Audio/MP3, desc: " |- Industrial & Post-industrial"} + - {id: 1595, cat: Audio/MP3, desc: " |- Emocore, Post-hardcore, Metalcore, Deathcore"} + - {id: 1596, cat: Audio/MP3, desc: " |- Gothic Rock & Dark Folk"} + - {id: 1597, cat: Audio/MP3, desc: " |- Avant-garde, Experimental Rock"} + - {id: 1626, cat: Audio/MP3, desc: " |- Зарубежный джаз (mp3)"} + - {id: 1627, cat: Audio/MP3, desc: " |- Зарубежный блюз (mp3)"} + - {id: 1628, cat: Audio/MP3, desc: " |- Отечественный джаз и блюз (mp3)"} + - {id: 1610, cat: Audio/MP3, desc: " |- Goa Trance, Psy-Trance"} + - {id: 1611, cat: Audio/MP3, desc: " |- PsyChill, Ambient, Dub"} + - {id: 1457, cat: Audio/MP3, desc: " |- Trance"} + - {id: 1613, cat: Audio/MP3, desc: " |- Hardcore, Hardstyle, Jumpstyle"} + - {id: 1614, cat: Audio/MP3, desc: " |- House"} + - {id: 1203, cat: Audio/MP3, desc: " |- Techno"} + - {id: 1615, cat: Audio/MP3, desc: " |- Electro, Electro-Freestyle, Nu Electro"} + - {id: 1616, cat: Audio/MP3, desc: " |- Drum & Bass, Jungle"} + - {id: 1617, cat: Audio/MP3, desc: " |- Breakbeat"} + - {id: 1618, cat: Audio/MP3, desc: " |- Dubstep"} + - {id: 1205, cat: Audio/MP3, desc: " |- IDM"} + - {id: 1619, cat: Audio/MP3, desc: " |- Chillout, Lounge, Downtempo"} + - {id: 1620, cat: Audio/MP3, desc: " |- Nu Jazz, Acid Jazz, Future Jazz"} + - {id: 1206, cat: Audio/MP3, desc: " |- Trip Hop, Abstract Hip-Hop"} + - {id: 1575, cat: Audio/MP3, desc: " |- Traditional Electronic, Ambient, Modern Classical,..."} + - {id: 1576, cat: Audio/MP3, desc: " |- Industrial, Noise, EBM, Dark Electro, Aggrotech,..."} + - {id: 1577, cat: Audio/MP3, desc: " |- Electronic music (смешанные стили и направления)"} + - {id: 1630, cat: Audio/MP3, desc: "Рэп, Хип-Хоп, R'n'B"} + - {id: 1631, cat: Audio/MP3, desc: " |- Отечественный Рэп, Хип-Хоп (mp3)"} + - {id: 1633, cat: Audio/MP3, desc: " |- Зарубежный Рэп, Хип-Хоп (mp3)"} + - {id: 1540, cat: Audio/MP3, desc: "Остальные музыкальные жанры, + Видеоклипы и концерты"} + - {id: 1604, cat: Audio/MP3, desc: " |- Reggae, Ska, Dub (mp3)"} + - {id: 1562, cat: Audio/MP3, desc: " |- Инструментальная и классическая музыка (mp3, FLAC)"} + - {id: 1185, cat: Audio/MP3, desc: " |- New Age, Relax, Meditative (mp3)"} + - {id: 1183, cat: Audio/MP3, desc: " |- Музыкальное видео (все жанры)"} + - {id: 1664, cat: Audio/Lossless, desc: "Оцифровки с аналоговых носителей"} + - {id: 1665, cat: Audio/Lossless, desc: " |- Зарубежная поп-музыка"} + - {id: 1666, cat: Audio/Lossless, desc: " |- Зарубежная рок-музыка"} + - {id: 1667, cat: Audio/Lossless, desc: " |- Джаз и блюз"} + - {id: 1668, cat: Audio/Lossless, desc: " |- Электронная музыка"} + - {id: 1670, cat: Audio/Lossless, desc: " |- Отечественная поп-музыка"} + - {id: 1669, cat: Audio/Lossless, desc: " |- Шансон, авторские, военные песни"} + - {id: 1679, cat: Audio/Lossless, desc: " |- Зарубежная поп музыка (Lossless)"} + - {id: 1680, cat: Audio/Lossless, desc: " |- Eurodance, Disco, Hi-NRG, Technopop (Lossless)"} + - {id: 1681, cat: Audio/Lossless, desc: " |- Отечественная поп музыка (Lossless)"} + - {id: 1682, cat: Audio/Lossless, desc: " |- Шансон, авторская песня (Lossless)"} + - {id: 1683, cat: Audio/Lossless, desc: " |- Зарубежная рок музыка (Lossless)"} + - {id: 1684, cat: Audio/Lossless, desc: " |- Зарубежный Metal (Lossless)"} + - {id: 1685, cat: Audio/Lossless, desc: " |- Отечественный Rock, Metal (Lossless)"} + - {id: 1686, cat: Audio/Lossless, desc: " |- Зарубежный джаз (Lossless)"} + - {id: 1687, cat: Audio/Lossless, desc: " |- Зарубежный блюз (Lossless)"} + - {id: 1688, cat: Audio/Lossless, desc: " |- Отечественный джаз и блюз (Lossless)"} + - {id: 1689, cat: Audio/Lossless, desc: " |- Электронная и клубная музыка (Lossless)"} + - {id: 1690, cat: Audio/Lossless, desc: " |- Отечественный Рэп, Хип-Хоп (lossless)"} + - {id: 1691, cat: Audio/Lossless, desc: " |- Зарубежный Рэп, Хип-Хоп (lossless)"} + - {id: 1692, cat: Audio/Lossless, desc: " |- Классическая и инструментальная музыка (Lossless)"} + - {id: 1693, cat: Audio/Lossless, desc: " |- Остальные муз.жанры (Lossless)"} + # Программное обеспечение Software + - {id: 105, cat: PC, desc: "Операционные системы"} + - {id: 1663, cat: PC, desc: " |- Windows 11"} + - {id: 1120, cat: PC, desc: " |- Windows 10"} + - {id: 706, cat: PC, desc: " |- Windows 8, 8.1"} + - {id: 212, cat: PC, desc: " |- Windows 7"} + - {id: 210, cat: PC, desc: " |- Windows Vista , Windows XP , Windows выпущенные до 20..."} + - {id: 213, cat: PC, desc: " |- Серверные ОС от Microsoft"} + - {id: 215, cat: PC, desc: " |- Разное (RC, Beta, Service Packs, Cracks)"} + - {id: 1395, cat: PC, desc: " |- Linux, Unix, Mac и другие ОС"} + - {id: 107, cat: PC, desc: "Системные программы"} + - {id: 1405, cat: PC, desc: " |- Драйверы"} + - {id: 1398, cat: PC, desc: " |- Обслуживание и диагностика компьютера"} + - {id: 193, cat: PC, desc: " |- Работа с жёсткими дисками"} + - {id: 1518, cat: PC, desc: " |- Работа с внешними носителями информации"} + - {id: 195, cat: PC, desc: " |- Архиваторы и файловые менеджеры"} + - {id: 341, cat: PC, desc: " |- Программы для интернета и сетей"} + - {id: 196, cat: PC, desc: " |- Настройка и оптимизация и изменение интерфейса ОС"} + - {id: 969, cat: PC, desc: " |- WPI и прочие сборники программ"} + - {id: 1523, cat: PC, desc: " |- LiveCD/DVD/USB"} + - {id: 1505, cat: PC, desc: "Безопасность"} + - {id: 201, cat: PC, desc: " |- Антивирусы"} + - {id: 1506, cat: PC, desc: " |- Фаерволы, брандмауэры"} + - {id: 1508, cat: PC, desc: " |- Антишпионское, антирекламное и антиблокировочное ПО"} + - {id: 1509, cat: PC, desc: " |- Средства защиты информации"} + - {id: 1507, cat: PC, desc: " |- Комплексная защита ПК"} + - {id: 108, cat: PC, desc: "Программы для бизнеса, офиса, научной и проектной работы"} + - {id: 217, cat: PC, desc: " |- Офисные системы"} + - {id: 218, cat: PC, desc: " |- Системы для бизнеса"} + - {id: 222, cat: PC, desc: " |- Системы для научной работы"} + - {id: 1404, cat: PC, desc: " |- САПР, софт для архитекторов, дизайнеров и пр."} + - {id: 1522, cat: PC, desc: " |- Справочные системы, базы данных"} + - {id: 1504, cat: PC, desc: " |- Программы для верстки, печати и работы со шрифтами"} + - {id: 220, cat: PC, desc: " |- Работа с PDF, DjVu, FB2, EPUB, MOBI и пр."} + - {id: 221, cat: PC, desc: " |- Словари, переводчики, программы обучения языкам"} + - {id: 219, cat: PC, desc: " |- Распознавание текста, звука и синтез речи"} + - {id: 1511, cat: PC, desc: "Программирование и веб-разработка"} + - {id: 1512, cat: PC, desc: " |- WYSIWYG-редакторы для веб-дизайна"} + - {id: 1513, cat: PC, desc: " |- Текстовые редакторы с подсветкой кода"} + - {id: 1514, cat: PC, desc: " |- Среды программирования, компиляторы и вспомогател..."} + - {id: 1515, cat: PC, desc: " |- Системы управления базами данных (СУБД)"} + - {id: 1516, cat: PC, desc: " |- Скрипты и шаблоны"} + - {id: 110, cat: PC, desc: "Программы для работы с мультимедиа и 3D"} + - {id: 966, cat: PC, desc: " |- Графические редакторы и каталогизаторы"} + - {id: 1500, cat: PC, desc: " |- Видеоредакторы"} + - {id: 1501, cat: PC, desc: " |- Аудиоредакторы"} + - {id: 967, cat: PC, desc: " |- Аудио- Видео- проигрыватели и каталогизаторы"} + - {id: 965, cat: PC, desc: " |- Аудио- Видео- грабберы, рипперы и конвертеры"} + - {id: 1499, cat: PC, desc: " |- Анимация"} + - {id: 1502, cat: PC, desc: " |- Программные комплекты"} + - {id: 1503, cat: PC, desc: " |- Дополнительные материалы для мультимедиа"} + - {id: 968, cat: PC, desc: " |- Разное (Программы для работы с мультимедиа и 3D)"} + # Все для мобильных устройств Mobiles + - {id: 1287, cat: PC/Mobile-Other, desc: "Видео"} + - {id: 1307, cat: PC/Mobile-Other, desc: " |- Мобильные телефоны"} + - {id: 1306, cat: PC/Mobile-iOS, desc: " |- iPhone"} + - {id: 1305, cat: PC/Mobile-iOS, desc: " |- iPad"} + - {id: 1289, cat: PC, desc: "Программы"} + - {id: 1302, cat: PC, desc: " |- Мобильные телефоны"} + - {id: 1301, cat: PC/Mobile-Android, desc: " |- Android OS"} + - {id: 1298, cat: PC, desc: " |- Symbian OS"} + - {id: 1293, cat: PC/Mobile-Other, desc: " |- Windows Mobile"} + - {id: 1292, cat: PC/Mobile-iOS, desc: " |- iPhone"} + - {id: 1291, cat: PC/Mobile-iOS, desc: " |- Apple Macintosh"} + - {id: 1294, cat: PC, desc: "Игры"} + - {id: 1303, cat: PC, desc: " |- Мобильные телефоны"} + - {id: 1300, cat: PC/Mobile-Android, desc: " |- Android OS"} + - {id: 1299, cat: PC, desc: " |- Symbian OS"} + - {id: 1296, cat: PC/Mobile-iOS, desc: " |- iPhone"} + - {id: 1295, cat: PC/Mobile-Other, desc: " |- Windows Mobile"} + # Клубничка ХХХ 18+️ + - {id: 1490, cat: XXX, desc: "Эротика (не порно)"} + - {id: 1491, cat: XXX, desc: " |- ❥ Эротические фильмы ≪с переводом Rus≫"} + - {id: 1492, cat: XXX, desc: " |- • Эротические фильмы с «родной» озвучкой"} + - {id: 1493, cat: XXX, desc: " |- • Playboy, Penthouse (эротический видео журнал)"} + - {id: 1495, cat: XXX, desc: " |- • Нудизм-Натуризм"} + - {id: 1494, cat: XXX, desc: " |- • Фото, картинки, журналы"} + - {id: 1376, cat: XXX, desc: "Зарубежное видео ХХХ"} + - {id: 1378, cat: XXX, desc: " |- • Зарубежные порно фильмы"} + - {id: 1470, cat: XXX, desc: " |- • Гонзо-фильмы / Gonzo"} + - {id: 1446, cat: XXX, desc: " |- • Гонзо и зарубежные фильмы ≪720p, 1080p≫"} + - {id: 1468, cat: XXX, desc: " |- • Этнические фильмы / Ethnic-Themed"} + - {id: 1537, cat: XXX, desc: " |- • Лесбо-фильмы / All Girl & Solo"} + - {id: 1444, cat: XXX, desc: " |- • Порно пародии / Parody porn"} + - {id: 1379, cat: XXX, desc: " |- • Зарубежное порно ≪с переводом Rus≫"} + - {id: 1388, cat: XXX, desc: " |- • Классика и ретро порно / Classic (Retro)"} + - {id: 1389, cat: XXX, desc: " |- • Японские фильмы и сайтрипы"} + - {id: 1380, cat: XXX, desc: " |- • Зарубежные сайтрипы ≪Definition 480p, 540p≫"} + - {id: 1441, cat: XXX, desc: " |- • Зарубежные сайтрипы ≪HD Video 720p, 1080p≫"} + - {id: 1439, cat: XXX, desc: " |- • Сцены и Сайтрипы ≪4К UHD 2160p≫"} + - {id: 1535, cat: XXX, desc: " |- • Виртуальная реальность ХХХ / Virtual Reality Porn (VR)"} + - {id: 1392, cat: XXX, desc: " |- • Любительское видео ≪WebCam, CamRip≫"} + - {id: 1426, cat: XXX, desc: " |- • Документальное видео"} + - {id: 1377, cat: XXX, desc: "Русское видео ХХХ"} + - {id: 1383, cat: XXX, desc: " |- • Порно фильмы Российского пр-ва"} + - {id: 1387, cat: XXX, desc: " |- • Сайтрипы с русскими актрисами ≪Definition 480p, 540p≫"} + - {id: 1428, cat: XXX, desc: " |- • Сайтрипы с русскими актрисами ≪HD Video 720p, 1080p≫"} + - {id: 1440, cat: XXX, desc: " |- • Сцены и Сайтрипы с Русскими актрисами ≪4К UHD 2160p≫"} + - {id: 1384, cat: XXX, desc: " |- • Любительское порно ≪CamRip≫"} + - {id: 1429, cat: XXX, desc: "Нетрадиционное порно"} + - {id: 1430, cat: XXX, desc: " |- • Буккаке, Камшот / Bukkake, Cumshot Compilation"} + - {id: 1431, cat: XXX, desc: " |- • Женское доминирование и страпон / Femdom & Strapon"} + - {id: 1432, cat: XXX, desc: " |- • BDSM ≪бандаж, дисциплина, садизм, мазохизм≫"} + - {id: 1433, cat: XXX, desc: " |- • Фетиш, медосмотры / Medical Fetish"} + - {id: 1442, cat: XXX, desc: " |- • Переодевание, униформа / Uniform"} + - {id: 1434, cat: XXX, desc: " |- • Фистинг и дилдо / Fisting & Dildo"} + - {id: 1469, cat: XXX, desc: " |- • Транссексуалы / Transsexual"} + - {id: 1443, cat: XXX, desc: " |- • Мочеиспускание / Peeing"} + - {id: 1536, cat: XXX, desc: " |- • Подглядывание / Voyeur"} + - {id: 1438, cat: XXX, desc: " |- • Беременные / Pregnant"} + - {id: 1496, cat: XXX, desc: " |- • Бисексуалы / Bisexual"} + - {id: 1480, cat: XXX, desc: "Мультфильмы ХХХ & Хентай & Порно игры"} + - {id: 1542, cat: XXX, desc: " |- • Порно игры / Porno games"} + - {id: 1481, cat: XXX, desc: " |- • Мультфильмы / Cartoons"} + - {id: 1482, cat: XXX, desc: " |- • Хентай / Hentai • •"} + # Разное Other + - {id: 118, cat: Other, desc: "Разное"} + - {id: 987, cat: Other, desc: " |- Обои для рабочего стола"} + - {id: 1068, cat: Other, desc: " |- Эротические обои"} + - {id: 1424, cat: Other, desc: " |- Боевые искусства (Видеоуроки)"} + - {id: 1425, cat: Other, desc: " |- Видеоуроки и обучающие интерактивные DVD"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + allowrawsearch: true + +settings: + - name: stripcyrillic + type: checkbox + label: Strip Cyrillic Letters + default: false + - name: addrussiantotitle + type: checkbox + label: Add RUS to end of all titles to improve language detection by Sonarr and Radarr. Will cause English-only results to be misidentified. + default: false + - name: sort + type: select + label: Sort requested from site + default: 1 + options: + 1: created + 10: seeders + 7: size + 2: title + - name: type + type: select + label: Order requested from site + default: 2 + options: + 2: desc + 1: asc + +search: + paths: + - path: tracker.php + inputs: + $raw: "{{ if .Categories }}{{ range .Categories }}f[]={{.}}&{{end}}{{ else }}f[]=-1{{ end }}" + prev_allw: 1 + prev_a: 0 + prev_dla: 0 + prev_dlc: 0 + prev_dld: 0 + prev_dlw: 0 + prev_my: 0 + prev_new: 0 + prev_sd: 0 + prev_da: 1 + prev_dc: 0 + prev_df: 1 + prev_ds: 0 + prev_tor_type: 0 +# prev_snotd: 0 +# prev_a: 0 +# prev_not_checked: 0 +# prev_closed: 0 +# prev_d: 0 +# prev_not_perfect: 0 +# prev_part_perfect: 0 +# prev_fishily: 0 +# prev_copy: 0 +# prev_temp: 0 +# prev_pogl: 0 +# prev_mod: 0 +# prev_gold: 0 +# prev_silver: 0 + # sort by 1=registered 2=topicTitle 4=completed 10=seed 11=leech 12=up 13=down 5=replies 6=views 7=size 8=lastPost 9=seedLastSeen + o: "{{ .Config.sort }}" + # 1=asc 2=desc + s: "{{ .Config.type }}" + # show category + dc: 0 + # show forum + df: 1 + # show author + da: 1 + # show speed + ds: 0 + # -1=all time + tm: -1 + # seed not seen -1=disregard + sns: -1 + # group releases -1=not selected + srg: -1 + nm: "{{ .Keywords }}" + # search by partial word + allw: 0 + + keywordsfilters: + - name: diacritics + args: replace + - name: re_replace # S01 to сезон 1 + args: ["(?i)\\bS0*(\\d+)\\b", "сезон $1"] + - name: re_replace # E02 to сери 1 + args: ["(?i)\\bE0*(\\d+)\\b", "сери $1"] + - name: re_replace # S01E02 to сезон 1 сери 2 + args: ["(?i)\\bS0*(\\d+)E0*(\\d+)\\b", "сезон $1 сери $2"] + + rows: + selector: tr[id^="tor_"]:has(a[href^="magnet:?xt="]) + + fields: + category: + selector: a[href^="tracker.php?f="] + attribute: href + filters: + - name: querystring + args: f + title: + selector: a[href^="./viewtopic.php?t="] + filters: + # normalize to SXXEYY format + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)\\s*(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)", "S$1E$2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?)", "S$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+[CС]езоны?", "S$1"] + - name: re_replace + args: ["(?i)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)", "E$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "E$1"] + - name: re_replace + args: ["(\\([\\p{IsCyrillic}\\W]+\\))|(^[\\p{IsCyrillic}\\W\\d]+\\/ )|([\\p{IsCyrillic} \\-]+,+)|([\\p{IsCyrillic}]+)", "{{ if .Config.stripcyrillic }}{{ else }}$1$2$3$4{{ end }}"] + - name: re_replace + args: ["(?i)\\bHDTV[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bSAT[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bWEB[-\\s]?DL[-\\s]?Rip\\b", "WEB-DL"] + - name: re_replace + args: ["(?i)\\bWEB\\sRip\\b", "WEBRip"] + - name: re_replace + args: ["(?i)\\bWEB\\sDL\\b", "WEB-DL"] + - name: re_replace + args: ["[\\[\\(\\{<«][\\s\\W]*[\\]\\)\\}>»]", ""] + - name: re_replace + args: ["^[\\s&,\\.!\\?\\+\\-_\\|\\/':]+", ""] + - name: re_replace + args: ["(?i)^\\(\\s*([SE]\\d+.*?)\\s*\\)[\\s\\/\\|]*(.+)", "$2 $1"] + - name: append + args: "{{ if .Config.addrussiantotitle }} RUS{{ else }}{{ end }}" + details: + selector: a[href^="./viewtopic.php?t="] + attribute: href + magnet: + selector: a[href^="magnet:?xt="] + attribute: href + size: + selector: td:nth-child(6) > u + seeders: + selector: td.seedmed > b + leechers: + selector: td.leechmed > b + grabs: + selector: td:nth-child(9) + date: + selector: td:last-child > u + downloadvolumefactor: + text: 0 +# case: +# img[src="styles/images/tor_gold.gif"]: 0 +# img[src="styles/images/tor_silver.gif"]: 0.5 +# "*": 1 + uploadvolumefactor: + text: 1 + description: + selector: a[href^="./viewtopic.php?t="] +# TorrentPier II diff --git a/config/prowlarr/Definitions/satclubbing.yml b/config/prowlarr/Definitions/satclubbing.yml new file mode 100644 index 0000000..92460e6 --- /dev/null +++ b/config/prowlarr/Definitions/satclubbing.yml @@ -0,0 +1,159 @@ +--- +id: satclubbing +name: SATClubbing +description: "SATClubbing is a RUSSIAN/ENGLISH Private Torrent Tracker for ELECTRONIC MUSIC" +language: en-US +type: private +encoding: UTF-8 +links: + - https://satclubbing.club/ + +caps: + categorymappings: + - {id: 23, cat: Audio, desc: "Albums - Trance"} + - {id: 34, cat: Audio, desc: "Singles - Trance"} + - {id: 24, cat: Audio, desc: "Livesets - Trance"} + - {id: 30, cat: Audio, desc: "Albums - House"} + - {id: 25, cat: Audio, desc: "Singles - House"} + - {id: 32, cat: Audio, desc: "Livesets - House"} + - {id: 18, cat: Audio, desc: "Albums - Techno"} + - {id: 29, cat: Audio, desc: "Singles - Techno"} + - {id: 21, cat: Audio, desc: "Livesets - Techno"} + - {id: 35, cat: Audio, desc: "Albums - Hardstyle"} + - {id: 20, cat: Audio, desc: "Singles - Hardstyle"} + - {id: 28, cat: Audio, desc: "Livesets - Hardstyle"} + - {id: 22, cat: Audio, desc: "Albums - Goa/Psy"} + - {id: 33, cat: Audio, desc: "Singles - Goa/Psy"} + - {id: 26, cat: Audio, desc: "Livesets - Goa/Psy"} + - {id: 31, cat: Audio, desc: "Beat/Breaks"} + - {id: 40, cat: Audio, desc: "Electronic"} + - {id: 42, cat: Audio, desc: "Albums - Drum and Bass"} + - {id: 43, cat: Audio, desc: "Singles - Drum and Bass"} + - {id: 44, cat: Audio, desc: "Livesets - Drum and Bass"} + - {id: 45, cat: Audio, desc: "Albums - Dance"} + - {id: 46, cat: Audio, desc: "Singles - Dance"} + - {id: 36, cat: Audio, desc: "Unreleased Tracks"} + - {id: 41, cat: Audio, desc: "Bass"} + - {id: 39, cat: Audio, desc: "Ambient / Chill"} + - {id: 27, cat: Other, desc: "Music Plugins/Apps/Misc"} + - {id: 19, cat: Audio/Video, desc: "DVD/Video/Clips"} + - {id: 38, cat: Audio, desc: "SCMT Pack"} + - {id: 47, cat: Audio, desc: "Albums - Hardcore"} + - {id: 48, cat: Audio, desc: "Singles - Hardcore"} + - {id: 49, cat: Audio, desc: "Livesets - Hardcore"} + - {id: 50, cat: Audio, desc: "Rave"} + - {id: 51, cat: Audio, desc: "Acid"} + - {id: 52, cat: Audio, desc: "Dubstep"} + + modes: + search: [q] + music-search: [q, artist] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account options. + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: div.error + test: + path: / + selector: a[href="logout.php"] + +search: + paths: + # https://satclubbing.club/browse.php?search=&cat=0&incldead=1&age=0&quality=0&c23=1&c34=1 + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ if .Query.Artist }}{{ .Query.Artist }}{{ else }}{{ .Keywords }}{{ end }}" + # 0 active, 1 incldead, 2 onlydead, 3 freeleech, 4 seedless + incldead: "{{ if .Config.freeleech }}3{{ else }}1{{ end }}" + # 0 any, 1 fresh, 2 classic, 3 not classic + age: 0 + # 0 any, 320 mp3 cbr, 1000 mp3 vbr, 2000 lossless + quality: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + + rows: + selector: table > tbody > tr > td.index > table.embedded[cellspacing="0"][cellpadding="5"][width="100%"] > tbody > tr:has(a[href^="details.php?id="]) + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + date: + selector: td:last-child + filters: + - name: replace + args: ["added ", ""] + - name: timeago + files: + selector: a[href$="filelist=1"] + size: + selector: td:has(a[href$="filelist=1"]) + td + td + seeders: + selector: a[href$="toseeders=1"] + optional: true + default: 0 + leechers: + selector: td:has(a[href$="toseeders=1"]) + optional: true + default: 0 + filters: + - name: split + args: ["|", 1] + downloadvolumefactor: + case: + img[src$="pic/free_icon.gif"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 0.60 +# engine n/a diff --git a/config/prowlarr/Definitions/scenelinks.yml b/config/prowlarr/Definitions/scenelinks.yml new file mode 100644 index 0000000..79e9bab --- /dev/null +++ b/config/prowlarr/Definitions/scenelinks.yml @@ -0,0 +1,189 @@ +--- +id: scenelinks +name: SceneLinks +description: "SceneLinks (SL) is a ROMANIAN Private Torrent Tracker for MOVIES / TV / GENERAL" +language: ro-RO +type: private +encoding: UTF-8 +links: + - https://scenelinks.me/ +legacylinks: + - https://scenelinks.io/ + - https://www.scenelinks.io/ + +caps: + categorymappings: + - {id: 1, cat: Movies/HD, desc: "Movies: HD"} + - {id: 2, cat: TV, desc: "TV Episodes"} + - {id: 6, cat: TV, desc: "RO TV"} + - {id: 7, cat: Movies, desc: "Ro Movies"} + - {id: 8, cat: TV, desc: "TV Episodes-RO"} + - {id: 9, cat: Movies/HD, desc: "Movies: HD-Ro"} + - {id: 11, cat: Movies/BluRay, desc: "Movies: BluRay"} + - {id: 12, cat: Movies/BluRay, desc: "Movies: BluRay-RO"} + - {id: 13, cat: Movies/UHD, desc: "Movies: 4K"} + - {id: 14, cat: Movies/UHD, desc: "Movies: 4K-RO"} + - {id: 15, cat: TV, desc: "TV Packs RO"} + - {id: 20, cat: Movies/DVD, desc: "Movies: DVD"} + - {id: 21, cat: Movies/DVD, desc: "Movies: DVD-Ro"} + - {id: 19, cat: TV/Documentary, desc: "Docs"} + - {id: 18, cat: Other, desc: "Wallpapers"} + - {id: 17, cat: Audio/Video, desc: "Videos"} + - {id: 3, cat: Audio, desc: "Music"} + - {id: 16, cat: Console, desc: "Games: Console"} + - {id: 4, cat: PC/Games, desc: "Games PC"} + - {id: 5, cat: PC, desc: "Application"} + - {id: 10, cat: XXX, desc: "XXX"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + music-search: [q] + book-search: [q] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your SceneLinks account My Settings page and clicking on the API Key tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + inputs: {} # TODO: remove in v10 + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: "/api/torrents/filter" + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + # if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6 + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + seasonNumber: "{{ .Query.Season }}" + episodeNumber: "{{ .Query.Ep }}" + imdbId: "{{ .Query.IMDBIDShort }}" + tmdbId: "{{ .Query.TMDBID }}" + tvdbId: "{{ .Query.TVDBID }}" + "free[]": "{{ if .Config.freeleech }}100{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + + rows: + selector: data + attribute: attributes + + fields: + category: + selector: category_id + title: + selector: name + details: + selector: details_link + download: + selector: download_link + infohash: + selector: info_hash + poster: + selector: meta.poster + filters: + - name: replace + args: ["https://via.placeholder.com/90x135", ""] + imdbid: + selector: imdb_id + tmdbid: + selector: tmdb_id + tvdbid: + selector: tvdb_id + genre: + selector: meta.genres + filters: + - name: re_replace + args: ["(?i)(Science Fiction)", "Science_Fiction"] + - name: re_replace + args: ["(?i)(TV Movie)", "TV_Movie"] + - name: replace + args: [" & ", "_&_"] + description: + text: "{{ .Result.genre }}" + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0%, 25%, 50%, 75%, 100% + selector: freeleech + case: + 0%: 1 # not free + 25%: 0.75 + 50%: 0.5 + 75%: 0.25 + 100%: 0 # freeleech + "*": 0 # catch errors + uploadvolumefactor: + # api returns False, True + selector: double_upload + case: + False: 1 # normal + True: 2 # double +# global MR is 0.4 but torrents must be seeded for 1 day regardless of ratio +# minimumratio: +# text: 0.4 + minimumseedtime: + # 1 day (as seconds = 1 x 24 x 60 x 60) + text: 86400 +# json UNIT3D 7.0.3 diff --git a/config/prowlarr/Definitions/scenerush.yml b/config/prowlarr/Definitions/scenerush.yml new file mode 100644 index 0000000..587015d --- /dev/null +++ b/config/prowlarr/Definitions/scenerush.yml @@ -0,0 +1,214 @@ +--- +id: scenerush +name: SceneRush +description: "SceneRush is a PORTUGUESE Private Torrent Tracker for 0DAY / GENERAL" +language: pt-PT +type: private +encoding: UTF-8 +links: + - https://www.scene-rush.pt/ + - https://www.scene-rush.com/ +legacylinks: + - http://www.scene-rush.pt/ + +caps: + categorymappings: + - {id: 1, cat: PC, desc: "Apps"} + - {id: 2, cat: Movies, desc: "XVID"} + - {id: 3, cat: Movies/DVD, desc: "DVD"} + - {id: 4, cat: TV, desc: "TV XVID"} + - {id: 5, cat: PC/Games, desc: "PC Games"} + - {id: 6, cat: Movies/HD, desc: "HD"} + - {id: 7, cat: XXX, desc: "XXX"} + - {id: 8, cat: TV/Anime, desc: "Anime"} + - {id: 9, cat: Audio, desc: "Audio"} + - {id: 10, cat: Other, desc: "Other"} + - {id: 11, cat: Console/XBox 360, desc: "XBOX 360"} + - {id: 12, cat: Console/PSP, desc: "PSP"} + - {id: 13, cat: TV/Documentary, desc: "Doc"} + - {id: 14, cat: Movies/DVD, desc: "Movies DVD"} + - {id: 15, cat: Console, desc: "PS2"} + - {id: 16, cat: TV/Sport, desc: "TV WWE"} + - {id: 17, cat: TV/HD, desc: "TV X264"} + - {id: 18, cat: TV, desc: "TV DVD"} + - {id: 19, cat: XXX/DVD, desc: "XXX DVD"} + - {id: 20, cat: TV/Anime, desc: "Anime DVD"} + - {id: 21, cat: PC/Mac, desc: "Mac"} + - {id: 23, cat: Movies, desc: "Boxset"} + - {id: 31, cat: Other, desc: "OFF"} + - {id: 32, cat: Movies/BluRay, desc: "BluRay"} + - {id: 33, cat: Console/Wii, desc: "WII"} + - {id: 34, cat: Console/PS3, desc: "PS3"} + - {id: 35, cat: TV/Anime, desc: "Anime HD"} + - {id: 36, cat: PC/Mobile-Android, desc: "Android"} + - {id: 37, cat: Movies/DVD, desc: "Custom DVDR"} + - {id: 38, cat: Movies/Other, desc: "CAM TS"} + - {id: 39, cat: Other, desc: "GPS"} + - {id: 40, cat: Console/PS4, desc: "PS4"} + - {id: 41, cat: Movies/BluRay, desc: "BDRIP"} + - {id: 42, cat: Movies/WEB-DL, desc: "WEB DL"} + - {id: 43, cat: Books, desc: "Ebook"} + - {id: 44, cat: TV/Sport, desc: "Sports"} + - {id: 46, cat: Movies/UHD, desc: "4K"} + - {id: 47, cat: TV/HD, desc: "TV X265"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: h2:contains("Falhou") + message: + selector: table tr td.text + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 active, 1 incldead, 2 onlydead, 3 gold + incldead: "{{ if .Config.freeleech }}3{{ else }}1{{ end }}" + # 0 name, 1 descr, 2 both + blah: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + + rows: + selector: table[cellpadding='5'][width='96%'] > tbody > tr:has(a[href*="details.php?id="]) + + fields: + category: + selector: td:first-of-type + case: + div.cat-4k: 46 + div.cat-albuns: 9 + div.cat-android: 36 + div.cat-anime: 8 + div.cat-anime-dvdr: 20 + div.cat-anime-hd: 35 + div.cat-apps: 1 + div.cat-brip: 41 + div.cat-blu-ray: 32 + div.cat-boxset: 23 + div.cat-cam-ts: 38 + div.cat-dvd-custom: 37 + div.cat-sports: 44 + div.cat-doc: 13 + div.cat-dvdr: 3 + div.cat-e-book: 43 + div.cat-gps: 39 + div.cat-hd: 6 + div.cat-games: 5 + div.cat-ps2: 15 + div.cat-ps3: 34 + div.cat-ps4: 40 + div.cat-psp: 12 + div.cat-wii: 33 + div.cat-mdvdr: 14 + div.cat-mac: 21 + div.cat-off: 31 + div.cat-other: 10 + div.cat-series: 4 + div.cat-series-dvdr: 18 + div.cat-series-x264: 17 + div.cat-series-x265: 47 + div.cat-web-dl: 42 + div.cat-wwe: 16 + div.cat-xbox360: 11 + div.cat-xvid: 2 + div.cat-xxx: 7 + div.cat-xxx-dvdr: 19 + _audiopt: + selector: i.fg-audiopt + attribute: title + optional: true + title: + selector: a[href^="details.php?id="] + filters: + - name: append + args: "{{ if .Result._audiopt }} Portuguese PT-PT{{ else }}{{ end }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: script + filters: + - name: regexp + args: "src=\"(.+?)\"" + size: + selector: td:nth-child(8) + grabs: + selector: td:nth-child(10) + seeders: + selector: td:nth-child(11) + leechers: + selector: td:nth-child(12) + date: + selector: td:nth-child(7) + filters: + - name: re_replace + args: ["(\\d{4}-\\d{2}-\\d{2})(\\d{2}:\\d{2}:\\d{2})", "$1 $2"] + - name: append + args: " +00:00" # WET + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + downloadvolumefactor: + case: + "i.fg-gold": 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 0.5 + minimumseedtime: + # 3 days (as seconds = 3 x 24 x 60 x 60) + text: 259200 +# engine n/a diff --git a/config/prowlarr/Definitions/seedfile.yml b/config/prowlarr/Definitions/seedfile.yml new file mode 100644 index 0000000..995a38b --- /dev/null +++ b/config/prowlarr/Definitions/seedfile.yml @@ -0,0 +1,147 @@ +--- +id: seedfile +name: SeedFile +description: "SeedFile (SF) is a ROMANIAN Private Torrent Tracker for 0DAY / GENERAL" +language: ro-RO +type: private +encoding: UTF-8 +links: + - https://www.seedfile.ro/ +legacylinks: + - https://www.seedfile.io/ + +caps: + categorymappings: + - {id: 1, cat: Books/Mags, desc: "Cărți/Reviste"} + - {id: 2, cat: Other, desc: "Desene SD"} + - {id: 3, cat: Other, desc: "Diverse n/a"} + - {id: 5, cat: Movies/BluRay, desc: "Filme Blu-Ray"} + - {id: 6, cat: Movies/DVD, desc: "Filme DVD"} + - {id: 7, cat: Movies/DVD, desc: "Filme DVD-RO"} + - {id: 8, cat: Movies/HD, desc: "Filme HD"} + - {id: 9, cat: Movies/HD, desc: "Filme HD-RO"} + - {id: 10, cat: Movies/SD, desc: "Filme SD"} + - {id: 11, cat: Movies/SD, desc: "Filme SD-RO"} + - {id: 12, cat: Other, desc: "Imagini"} + - {id: 13, cat: Console, desc: "Jocuri Console"} + - {id: 14, cat: PC/Games, desc: "Jocuri PC"} + - {id: 15, cat: Audio, desc: "Muzică"} + - {id: 16, cat: PC/Mobile-Other, desc: "Mobile"} + - {id: 17, cat: PC, desc: "Programe"} + - {id: 18, cat: TV/HD, desc: "Seriale HD"} + - {id: 19, cat: TV/HD, desc: "Seriale HD-RO"} + - {id: 20, cat: TV/SD, desc: "Seriale TV"} + - {id: 21, cat: TV/SD, desc: "Seriale TV-RO"} + - {id: 22, cat: TV/Sport, desc: "Sport"} + - {id: 23, cat: Audio/Video, desc: "Video Clip"} + - {id: 24, cat: XXX, desc: "Adult 18+"} + - {id: 36, cat: Movies/3D, desc: "Video 3D"} + - {id: 37, cat: Movies/HD, desc: "Animație HD"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: div.recover-error2 + test: + path: home + selector: a[href^="logout.php"] + +download: + selectors: + - selector: a[href^="download.php/"] + attribute: href + +search: + paths: + - path: download-torrents + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 active, 1 incldead, 2 onlydead, 3 freeleech + incldead: "{{ if .Config.freeleech }}3{{ else }}1{{ end }}" + + rows: + selector: tr.browse + + fields: + category: + selector: a[href^="torrents.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="details.php?id="] + attribute: href + poster: + selector: td.numele_tor span[data-original-title] + attribute: data-original-title + filters: + - name: regexp + args: "src='(.+?)'" + genre: + selector: td.numele_tor small + filters: + - name: replace + args: ["Genre:\xA0", ""] + description: + case: + b[title="Verified"]: "Verified: {{ .Result.genre }}" + "*": "Unverified: {{ .Result.genre }}" + files: + selector: td:nth-last-child(8) + date: + selector: td:nth-last-child(6) + filters: + - name: append + args: " +02:00" # EET + - name: dateparse + args: "HH:mm:ssyyyy-MM-dd zzz" + size: + selector: td:nth-last-child(5) + grabs: + selector: td:nth-last-child(4) + seeders: + selector: td:nth-last-child(3) + leechers: + selector: td:nth-last-child(2) + downloadvolumefactor: + case: + "img[src=\"./pic/freeleech.png\"]": 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 3 days (as seconds = 3 x 24 x 60 x 60) + text: 259200 +# engine n/a diff --git a/config/prowlarr/Definitions/seedoff.yml b/config/prowlarr/Definitions/seedoff.yml new file mode 100644 index 0000000..77f0401 --- /dev/null +++ b/config/prowlarr/Definitions/seedoff.yml @@ -0,0 +1,340 @@ +--- +id: seedoff +name: Seedoff +description: "Seedoff is a RUSSIAN Public tracker for MOVIES / TV / GENERAL" +language: ru-RU +type: public +encoding: UTF-8 +links: + - https://seedoff.zannn.top/ + - https://forum.zannn.top/ + +caps: + categorymappings: + # Video + - {id: 1, cat: Movies, desc: "Видео"} + - {id: 14, cat: Movies/Foreign, desc: "Зарубежное кино"} + - {id: 15, cat: Movies, desc: "Отечественное кино"} + - {id: 17, cat: TV/Foreign, desc: "Зарубежные сериалы"} + - {id: 128, cat: TV, desc: "Отечественные сериалы"} + - {id: 18, cat: TV/Documentary, desc: "Документальные фильмы"} + - {id: 19, cat: TV, desc: "ТВ-передачи"} + - {id: 20, cat: TV/Sport, desc: "Спорт"} + - {id: 21, cat: Movies/Other, desc: "Трейлеры"} + - {id: 22, cat: Audio/Video, desc: "Театр и музыка"} + - {id: 112, cat: TV/Other, desc: "Юмор"} + - {id: 139, cat: TV/Foreign, desc: "Видео без русского перевода"} + - {id: 145, cat: TV/Other, desc: "Видеокурсы"} + - {id: 118, cat: Movies, desc: "Другое"} + - {id: 149, cat: Movies, desc: "Ретро отечественного/зарубежного видео"} + # Video (DVD/HD/BD) + - {id: 13, cat: Movies, desc: "Видео (DVD/HD/BD)"} + - {id: 64, cat: Movies/Foreign, desc: "Зарубежное кино"} + - {id: 65, cat: Movies, desc: "Отечественное кино"} + - {id: 66, cat: TV/Foreign, desc: "Зарубежные сериалы"} + - {id: 129, cat: TV, desc: "Отечественные сериалы"} + - {id: 67, cat: TV/Documentary, desc: "Документальные фильмы"} + - {id: 68, cat: TV, desc: "ТВ-передачи"} + - {id: 69, cat: TV/Sport, desc: "Спорт"} + - {id: 70, cat: Movies/Other, desc: "Трейлеры"} + - {id: 71, cat: Audio/Video, desc: "Театр и музыка"} + - {id: 113, cat: TV/Other, desc: "Юмор"} + - {id: 140, cat: TV/Foreign, desc: "Видео без русского перевода"} + - {id: 119, cat: Movies, desc: "Другое"} + # Music + - {id: 2, cat: Audio/MP3, desc: "Музыка"} + - {id: 73, cat: Audio/MP3, desc: "Поп музыка"} + - {id: 74, cat: Audio/MP3, desc: "Джаз и Блюз"} + - {id: 75, cat: Audio/MP3, desc: "Классическая музыка"} + - {id: 76, cat: Audio/MP3, desc: "Рок-музыка"} + - {id: 83, cat: Audio/MP3, desc: "Электронная музыка"} + - {id: 86, cat: Audio/MP3, desc: "Этническая музыка (Фольклор)"} + - {id: 87, cat: Audio/MP3, desc: "Рэп, Хип-Хоп, R'n'B"} + - {id: 88, cat: Audio/MP3, desc: "NewAge, Relax"} + - {id: 89, cat: Audio/MP3, desc: "Шансон, Авторская и Военная песня"} + - {id: 90, cat: Audio/MP3, desc: "Музыка других жанров"} + - {id: 91, cat: Audio/MP3, desc: "Саундтреки, Караоке и Минусовки"} + - {id: 122, cat: Audio/MP3, desc: "Мюзиклы и рок-оперы"} + # Music (lossless) + - {id: 8, cat: Audio/Lossless, desc: "Музыка (lossless)"} + - {id: 93, cat: Audio/Lossless, desc: "Поп музыка"} + - {id: 94, cat: Audio/Lossless, desc: "Джаз и Блюз"} + - {id: 95, cat: Audio/Lossless, desc: "Классическая музыка"} + - {id: 96, cat: Audio/Lossless, desc: "Рок-музыка"} + - {id: 103, cat: Audio/Lossless, desc: "Электронная музыка"} + - {id: 106, cat: Audio/Lossless, desc: "Этническая музыка (Фольклор)"} + - {id: 107, cat: Audio/Lossless, desc: "Рэп, Хип-Хоп, R'n'B"} + - {id: 108, cat: Audio/Lossless, desc: "NewAge, Relax"} + - {id: 109, cat: Audio/Lossless, desc: "Шансон, Авторская и Военная песня"} + - {id: 110, cat: Audio/Lossless, desc: "Музыка других жанров"} + - {id: 111, cat: Audio/Lossless, desc: "Саундтреки, Караоке и Минусовки"} + - {id: 123, cat: Audio/Lossless, desc: "Мюзиклы и рок-оперы"} + # Games + - {id: 3, cat: PC/Games, desc: "Игры"} + - {id: 23, cat: PC/Games, desc: "PC"} + - {id: 24, cat: Console/XBox, desc: "XBox"} + - {id: 25, cat: Console/XBox 360, desc: "XBox360"} + - {id: 26, cat: Console/PS3, desc: "PS2"} + - {id: 27, cat: Console/PS3, desc: "PS3"} + - {id: 28, cat: Console/PS Vita, desc: "PSP, PSVita"} + - {id: 29, cat: Console/PS4, desc: "PS4"} + - {id: 32, cat: PC/Games, desc: "Другие"} + # Software + - {id: 7, cat: PC/0day, desc: "Софт"} + - {id: 33, cat: PC/ISO, desc: "ОС"} + - {id: 34, cat: PC/0day, desc: "Офисные приложения"} + - {id: 35, cat: PC/0day, desc: "Мультимедиа"} + - {id: 36, cat: PC/0day, desc: "Web & программирование"} + - {id: 37, cat: PC/0day, desc: "Системы проектирования и моделирования"} + - {id: 38, cat: PC/0day, desc: "Бизнес-системы"} + - {id: 39, cat: PC/0day, desc: "Графика и 3D"} + - {id: 41, cat: PC/0day, desc: "Интернет и Безопасность"} + - {id: 42, cat: PC/0day, desc: "Утилиты"} + - {id: 43, cat: PC/0day, desc: "Драйвера"} + - {id: 124, cat: PC, desc: "Обучающие курсы"} + - {id: 117, cat: PC, desc: "Другое"} + # Cartoons + - {id: 5, cat: Movies/Other, desc: "Мультфильмы"} + - {id: 53, cat: Movies/Other, desc: "Полнометражные"} + - {id: 54, cat: Movies/Other, desc: "Короткометражные"} + - {id: 130, cat: TV/Other, desc: "Сериалы"} + - {id: 56, cat: Movies/Other, desc: "Другие"} + # Anime + - {id: 131, cat: TV/Anime, desc: "Аниме"} + - {id: 4, cat: Movies/Other, desc: "Основной"} + - {id: 132, cat: TV/Anime, desc: "Основной (DVD/HD/BD)"} + - {id: 133, cat: TV/Anime, desc: "Сериалы (OAV/OVA/ONA)"} + - {id: 134, cat: TV/Anime, desc: "Сериалы (OAV/OVA/ONA)(DVD/HD/BD)"} + - {id: 147, cat: TV/Anime, desc: "Аниме без русской озвучки"} + - {id: 135, cat: TV/Anime, desc: "Клипы (AMV)"} + - {id: 61, cat: Books/Comics, desc: "Манга, картинки и прочее"} + - {id: 136, cat: Audio, desc: "OST"} + # Books + - {id: 6, cat: Books, desc: "Книги"} + - {id: 44, cat: Books/EBook, desc: "Художественные"} + - {id: 45, cat: Books/Technical, desc: "Научно-популярные"} + - {id: 46, cat: Books/Technical, desc: "Обучающие"} + - {id: 47, cat: Books/Mags, desc: "Журналы"} + - {id: 48, cat: Books/Other, desc: "Другие"} + - {id: 126, cat: Books/Other, desc: "На иностранных языках"} + - {id: 92, cat: Books/Other, desc: "Ноты и музыкальная литература"} + # Audiobooks + - {id: 9, cat: Audio/Audiobook, desc: "Аудиокниги"} + - {id: 49, cat: Audio/Audiobook, desc: "Художественные"} + - {id: 50, cat: Audio/Audiobook, desc: "Научно-популярные"} + - {id: 51, cat: Audio/Audiobook, desc: "Обучающие"} + - {id: 148, cat: Audio/Audiobook, desc: "Для мобильных устройств"} + - {id: 52, cat: Audio/Audiobook, desc: "Другие"} + # Imagery + - {id: 11, cat: Other, desc: "Изображения"} + - {id: 57, cat: Other, desc: "Клипарты"} + - {id: 58, cat: Other, desc: "Обложки"} + - {id: 59, cat: Other, desc: "Обои рабочего стола"} + - {id: 60, cat: Other, desc: "Комиксы"} + - {id: 127, cat: Other, desc: "Фотографии"} + - {id: 62, cat: Other, desc: "Другие"} + # Everything for mobile + - {id: 141, cat: PC/Mobile-Other, desc: "Всё для мобильных"} + - {id: 142, cat: Movies/Other, desc: "Видео"} + - {id: 138, cat: PC/Mobile-Android, desc: "Игры Android"} + - {id: 137, cat: PC/Mobile-iOS, desc: "Игры iPhone/iPod/iPad"} + - {id: 30, cat: PC/Mobile-Other, desc: "Игры для других платформ"} + - {id: 143, cat: PC/Mobile-Android, desc: "Софт Android"} + - {id: 144, cat: PC/Mobile-iOS, desc: "Софт iPhone/iPod/iPad"} + - {id: 114, cat: PC/Mobile-Other, desc: "Софт для других платформ"} + - {id: 146, cat: PC/Mobile-Other, desc: "Рингтоны"} + # 3D видео (3D video) categories are repeats of Видео (Video) categories + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q, album, artist] + book-search: [q] + +settings: + - name: stripcyrillic + type: checkbox + label: Strip Cyrillic Letters + default: false + - name: addrussiantotitle + type: checkbox + label: Add RUS to end of all titles to improve language detection by Sonarr and Radarr. Will cause English-only results to be misidentified. + default: false + - name: sort + type: select + label: Sort requested from site + default: 3 + options: + 3: created + 5: seeders + 4: size + 2: name + - name: type + type: select + label: Order requested from site + default: 2 + options: + 2: desc + 1: asc + +download: + infohash: + hash: + selector: tr.rknblock > td.lista + title: + selector: a[href^="/torrent/"] + attribute: title + filters: + - name: validfilename + +search: + paths: + # https://seedoff.zannn.top/search?page=ajax&search=&active=0&category=0&options=0&recommend=0&have_quality=0&types_search=0&period=0&genres=&order=3&by=2 + - path: search + inputs: + page: ajax + search: "{{ .Keywords }}" + # 0 all, 1 active, 2 dead + active: 0 + category: 0 + # 0 name, 1 name & desc + options: 0 + recommend: 0 + have_quality: 0 + # 0 whole word, 1 partial word + types_search: 0 + period: 0 + order: "{{ .Config.sort }}" + by: "{{ .Config.type }}" + + keywordsfilters: + - name: re_replace # S01 to сезон 1 + args: ["(?i)\\bS0*(\\d+)\\b", "сезон $1"] + - name: re_replace # E02 to сери 1 + args: ["(?i)\\bE0*(\\d+)\\b", "сери $1"] + - name: re_replace # S01E02 to сезон 1 сери 2 + args: ["(?i)\\bS0*(\\d+)E0*(\\d+)\\b", "сезон $1 сери $2"] + + rows: + selector: table.lista tbody tr:has(a[href^="/torrent/"]) + + fields: + category: + selector: a[href^="/index.php?page=torrents&category="] + attribute: href + filters: + - name: querystring + args: category + title: + selector: a[href^="/torrent/"] + filters: + # normalize to SXXEYY format + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)\\s*(?:из|\\()\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)\\s*(?:из|\\()\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)\\s*(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+(?:из|\\()\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*(?:из|\\()\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+(?:из|\\()\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)", "S$1E$2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?)", "S$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+[CС]езоны?", "S$1"] + - name: re_replace + args: ["(?i)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)\\s*(?:из|\\()\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*(?:из|\\()\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+(?:из|\\()\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)", "E$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "E$1"] + - name: re_replace + args: ["(?i)\\bКураж-Бамбей\\b", "kurazh"] + - name: re_replace + args: ["(?i)\\bКубик в Кубе\\b", "Kubik"] + - name: re_replace + args: ["(?i)\\bКравец\\b", "Kravec"] + - name: re_replace + args: ["(?i)\\bПифагор\\b", "Pifagor"] + - name: re_replace + args: ["(?i)\\bНевафильм\\b", "Nevafilm"] + - name: re_replace + args: ["(?i)\\bЛицензия\\b", "Lic"] + - name: re_replace + args: ["(?i)\\bселезень\\b", "selezen"] + - name: re_replace + args: ["(?i)\\sот\\s([\\w\\p{P}\\p{S}]+)$", "-$1"] + - name: re_replace + args: ["\\s\\|\\s(\\w{4,})$", "-$1"] + - name: re_replace + args: ["(\\([\\p{IsCyrillic}\\W]+\\))|(^[\\p{IsCyrillic}\\W\\d]+\\/ )|([\\p{IsCyrillic} \\-]+,+)|([\\p{IsCyrillic}]+)", "{{ if .Config.stripcyrillic }}{{ else }}$1$2$3$4{{ end }}"] + - name: re_replace + args: ["(?i)\\bHDTV[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bSAT[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bWEB[-\\s]?DL[-\\s]?Rip\\b", "WEB-DL"] + - name: re_replace + args: ["(?i)\\bWEB\\sRip\\b", "WEBRip"] + - name: re_replace + args: ["(?i)\\bWEB\\sDL\\b", "WEB-DL"] + - name: re_replace + args: ["(.*)(Blu-Ray\\s*(?:Disc|EUR|CEE)?)\\s*(\\d+[pi])", "$1 BR-DISK $3"] + - name: re_replace + args: ["[\\[\\(\\{<«][\\s\\W]*[\\]\\)\\}>»]", ""] + - name: re_replace + args: ["^[\\s&,\\.!\\?\\+\\-_\\|\\/':]+", ""] + - name: re_replace + args: ["(?i)^\\(\\s*([SE]\\d+.*?)\\s*\\)[\\s\\/\\|]*(.+)", "$2 $1"] + - name: append + args: "{{ if .Config.addrussiantotitle }} RUS{{ else }}{{ end }}" + details: + selector: a[href^="/torrent/"] + attribute: href + download: + selector: a[href^="/torrent/"] + attribute: href + poster: + selector: a[href^="/torrent/"] + attribute: onmouseover + filters: + - name: regexp + args: src=([^\s]+) + date: + selector: td:nth-last-child(4) + filters: + # 26.04.2022 + - name: append + args: " +03:00" # MSK + - name: dateparse + args: "dd.MM.yyyy zzz" + size: + selector: td:nth-last-child(5) + seeders: + selector: td:nth-last-child(3) + leechers: + selector: td:nth-last-child(2) + grabs: + selector: td:nth-last-child(1) + filters: + - name: replace + args: ["---", "0"] + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 + description: + selector: a[href^="/torrent/"] +# engine n/a diff --git a/config/prowlarr/Definitions/selezen.yml b/config/prowlarr/Definitions/selezen.yml new file mode 100644 index 0000000..b966eb4 --- /dev/null +++ b/config/prowlarr/Definitions/selezen.yml @@ -0,0 +1,238 @@ +--- +id: selezen +name: seleZen +description: "seleZen is a RUSSIAN Semi-Private Torrent Tracker for MOVIES" +language: ru-RU +type: semi-private +encoding: UTF-8 +links: + - https://use.selezen.club/ + - https://www.selezen.club/ + - https://selezen.org/ +legacylinks: + - https://www.selezen.site/ + - https://mel.selezen.net/ + - https://s1.selezen.site/ + - https://www.selezen.net/ + +caps: + categorymappings: + - {id: 0, cat: Movies, desc: "Movies"} + - {id: 40, cat: Movies/BluRay, desc: "Blu-Ray"} + - {id: 78, cat: Other, desc: "RePack от селезень"} + - {id: 45, cat: Movies/HD, desc: "WEBRip 720p"} + - {id: 46, cat: Movies/HD, desc: "WEBRip 1080p"} + - {id: 47, cat: Movies/UHD, desc: "WEBRip 2160p"} + - {id: 48, cat: Movies/HD, desc: "WEB-DL 720p"} + - {id: 49, cat: Movies/HD, desc: "WEB-DL 1080p"} + - {id: 50, cat: Movies/UHD, desc: "SDR WEB-DL 2160p"} + - {id: 51, cat: Movies/UHD, desc: "HDR WEB-DL 2160p"} + - {id: 52, cat: Movies/HD, desc: "BDRip 720p"} + - {id: 53, cat: Movies/HD, desc: "BDRip 1080p"} + - {id: 54, cat: Movies/UHD, desc: "SDR BDRip 2160p"} + - {id: 55, cat: Movies/UHD, desc: "HDR BDRip 2160p"} + - {id: 56, cat: Movies/HD, desc: "UHD BDRip 720p"} + - {id: 57, cat: Movies/HD, desc: "UHD BDRip 1080p"} + - {id: 58, cat: Movies/HD, desc: "BDRemux 1080p"} + - {id: 59, cat: Movies/UHD, desc: "SDR BDRemux 2160p"} + - {id: 60, cat: Movies/UHD, desc: "HDR BDRemux 2160p"} + - {id: 61, cat: Movies/UHD, desc: "DV BDRemux 2160p"} + - {id: 62, cat: Movies/HD, desc: "Blu-Ray 1080p"} + - {id: 63, cat: Movies/UHD, desc: "Blu-Ray 2160p"} + - {id: 64, cat: Movies/3D, desc: "3D BDRemux 1080p"} + - {id: 65, cat: Movies/3D, desc: "3D Blu-Ray 1080p"} + - {id: 74, cat: Movies/HD, desc: "WEBRip"} + - {id: 75, cat: Movies/HD, desc: "BDRip"} + - {id: 76, cat: Movies/HD, desc: "WEB-DLRip"} + - {id: 77, cat: Movies/HD, desc: "HDRip"} + - {id: 69, cat: Movies, desc: "WEB-DLRip-AVC"} + - {id: 70, cat: Movies, desc: "HDRip-AVC"} + - {id: 71, cat: Movies, desc: "BDRip-AVC"} + - {id: 72, cat: Movies/HD, desc: "WEB-DLRip 720p"} + + modes: + search: [q] + movie-search: [q, imdbid] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: stripcyrillic + type: checkbox + label: Strip Cyrillic Letters + default: false + - name: addrussiantotitle + type: checkbox + label: Add RUS to end of all titles to improve language detection by Radarr. Will cause English-only results to be misidentified. + default: false + - name: sort + type: select + label: Sort requested from site + default: date + options: + date: created + title: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: login.html + method: form + form: form[role="form"] + inputs: + login_name: "{{ .Config.username }}" + login_password: "{{ .Config.password }}" + login_not_save: "" + login: submit + error: + - selector: div.alert-warning:contains("Ошибка авторизации") + test: + path: / + selector: a[href$="/index.php?action=logout"] + +download: + selectors: + - selector: a[href^="magnet:?xt="] + attribute: href + +search: + # do=search&subaction=search&story=greyhound&titleonly=3&sortby=date&resorder=desc&showposts=1&catlist[]=49 + paths: + - path: index.php + followredirect: true + inputs: + $raw: "{{ range .Categories }}catlist[]={{.}}&{{end}}" + do: search + subaction: search + showposts: 1 + # 0 in article 1 in comments 2 in static pages 3 in article titles + titleonly: "{{ if .Query.IMDBID }}0{{ else }}3{{ end }}" + story: "{{ if or .Query.IMDBID .Keywords }}{{ or .Query.IMDBID .Keywords }}{{ else }}{{ .Today.Year }}{{ end }}" + sortby: "{{ .Config.sort }}" + resorder: "{{ .Config.type }}" + + rows: + selector: div.card:has(h4):not(:has(a[href*="/news/"])) + + fields: + category: + selector: h4 + case: + "h4:contains(\"WEBRip 720p\")": 45 + "h4:contains(\"WEBRip 1080p\")": 46 + "h4:contains(\"WEBRip 2160p\")": 47 + "h4:contains(\"SDR WEB-DL 2160p\")": 50 + "h4:contains(\"HDR WEB-DL 2160p\")": 51 + "h4:contains(\"WEB-DL 720p\")": 48 + "h4:contains(\"WEB-DL 1080p\")": 49 + "h4:contains(\"SDR BDRip 2160p\")": 54 + "h4:contains(\"HDR BDRip 2160p\")": 55 + "h4:contains(\"UHD BDRip 720p\")": 56 + "h4:contains(\"UHD BDRip 1080p\")": 57 + "h4:contains(\"SDR BDRemux 2160p\")": 59 + "h4:contains(\"HDR BDRemux 2160p\")": 60 + "h4:contains(\"DV BDRemux 2160p\")": 61 + "h4:contains(\"3D BDRemux 1080p\")": 64 + "h4:contains(\"3D Blu-Ray 1080p\")": 65 + "h4:contains(\"BDRemux 1080p\")": 58 + "h4:contains(\"Blu-Ray 1080p\")": 62 + "h4:contains(\"Blu-Ray 2160p\")": 63 + "h4:contains(\"BDRip 720p\")": 52 + "h4:contains(\"BDRip 1080p\")": 53 + "h4:contains(\"WEB-DLRip-AVC\")": 69 + "h4:contains(\"HDRip-AVC\")": 70 + "h4:contains(\"BDRip-AVC\")": 71 + "h4:contains(\"WEB-DLRip 720p\")": 72 + "h4:contains(\"WEBRip\")": 74 + "h4:contains(\"WEB-DLRip\")": 76 + "h4:contains(\"WEB-DL\")": 74 + "h4:contains(\"BDRip\")": 75 + "h4:contains(\"HDRip\")": 77 + "h4:contains(\"Blu-Ray\")": 40 + "h4:contains(\"RePack\")": 78 + "*": 0 + title: + selector: h4 + filters: + - name: re_replace + args: ["(?i)\\bЛицензия\\b", "Lic"] + - name: re_replace + args: ["(?i)\\bселезень\\b", "selezen"] + - name: re_replace + args: ["(\\([\\p{IsCyrillic}\\W]+\\))|(^[\\p{IsCyrillic}\\W\\d]+\\/ )|([\\p{IsCyrillic} \\-]+,+)|([\\p{IsCyrillic}]+)", "{{ if .Config.stripcyrillic }}{{ else }}$1$2$3$4{{ end }}"] + - name: re_replace + args: ["(?i)\\bHDTV[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bSAT[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bWEB[-\\s]?DL[-\\s]?Rip\\b", "WEB-DL"] + - name: re_replace + args: ["(?i)\\bWEB\\sRip\\b", "WEBRip"] + - name: re_replace + args: ["(?i)\\bWEB\\sDL\\b", "WEB-DL"] + - name: re_replace + args: ["[\\[\\(\\{<«][\\s\\W]*[\\]\\)\\}>»]", ""] + - name: re_replace + args: ["^[\\s&,\\.!\\?\\+\\-_\\|\\/':]+", ""] + - name: append + args: "{{ if .Config.addrussiantotitle }} RUS{{ else }}{{ end }}" + details: + selector: a:has(h4) + attribute: href + download: + selector: a:has(h4) + attribute: href + poster: + selector: img.card-img + attribute: src + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + genre: + selector: div.cats + filters: + - name: validate + args: "Аниме, Биографический, Боевик, Вестерн, Военный, Детектив, Документальный, Драма, Исторический, Комедия, Короткометражный, Криминал, Мелодрама, Мистика, Музыкальный, Мультфильм, Приключения, Семейный, Спорт, Триллер, Ужасы, Фантастика, Фэнтези" + description: + selector: p.card-text + filters: + - name: append + args: "{{ if .Result.genre }}
{{ .Result.genre }}{{ else }}{{ end }}" + date: + selector: a:has(span.bx-calendar) + filters: + - name: append + args: " +03:00" # MSK + - name: dateparse + args: "d.MM.yyyy HH:mm zzz" + seeders: + selector: a:has(i.bx-chevrons-up) + filters: + - name: split + args: [" ", 0] + leechers: + selector: a:has(i.bx-chevrons-up) + filters: + - name: split + args: [" ", 1] + grabs: + selector: a:has(i.bx-chevrons-up) + filters: + - name: split + args: [" ", -1] + size: + selector: a:has(span.bx-download) + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/sexypics.yml b/config/prowlarr/Definitions/sexypics.yml new file mode 100644 index 0000000..3b51e02 --- /dev/null +++ b/config/prowlarr/Definitions/sexypics.yml @@ -0,0 +1,84 @@ +--- +id: sexypics +name: Sexy-Pics +description: "Sexy-Pics is a Public Magnet Links site for 3X MP4" +language: en-US +type: public +encoding: UTF-8 +followredirect: true +requestDelay: 2 +links: + - https://www.sexy-pics.us/ + +caps: + categories: + XXX: XXX + + modes: + search: [q] + +settings: + - name: sort + type: select + label: Sort requested from site + default: age + options: + age: created + se: seeders + size: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +search: + headers: + # prevent redirect + Accept: ["text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"] + keywordsfilters: + # replace space between keywords with - to prevent 404 Not Found + - name: re_replace + args: [" ", "-"] + - name: tolower + paths: + # return results for 'of' if there are no search parms supplied (for use with the TEST button) + # https://www.sexy-pics.us/h/hegre-1080p/age/desc/ + # https://www.sexy-pics.us/browse/all/age/desc/2/ + - path: "{{ if .Keywords }}{{ re_replace .Keywords \"(.).*\" \"$1\" }}/{{ .Keywords }}/{{ else }}browse/all/{{ end }}{{ .Config.sort }}/{{ .Config.type }}/" + - path: "{{ if .Keywords }}{{ re_replace .Keywords \"(.).*\" \"$1\" }}/{{ .Keywords }}/{{ else }}browse/all/{{ end }}{{ .Config.sort }}/{{ .Config.type }}/2/" + + rows: + selector: tr:has(td.m) + + fields: + category: + text: XXX + title: + selector: td.n a + attribute: title + details: + selector: td.n a + attribute: href + magnet: + selector: td.m a + attribute: href + date: + selector: td:nth-child(3) + filters: + - name: timeago + files: + selector: td:nth-child(5) + size: + selector: td:nth-child(6) + seeders: + selector: td.s + leechers: + selector: td.l + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/shadowflow.yml b/config/prowlarr/Definitions/shadowflow.yml new file mode 100644 index 0000000..ab4941c --- /dev/null +++ b/config/prowlarr/Definitions/shadowflow.yml @@ -0,0 +1,170 @@ +--- +id: shadowflow +name: Shadowflow +description: "Shadowflow (影) is a CHINESE Private Torrent Tracker for MOVIES / TV / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://shadowflow.org/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "Movies/电影"} + - {id: 402, cat: TV, desc: "TV Series/剧集"} + - {id: 403, cat: TV, desc: "TV Shows/综艺"} + - {id: 404, cat: TV/Documentary, desc: "Documentaries/纪录片"} + - {id: 409, cat: Other, desc: "Others/音乐"} + - {id: 406, cat: Audio/Video, desc: "Music Videos/MV"} + - {id: 408, cat: Audio, desc: "Music/音频文件"} + - {id: 407, cat: TV/Sport, desc: "Sports/体育"} + - {id: 405, cat: TV/Anime, desc: "Animations/动画"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: index.php + selector: a[href*="usercp.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl + search_area: "{{ if .Query.IMDBID }}4{{ else }}{{ end }}{{ if .Query.DoubanID }}1{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }}{{ else }}0{{ end }}" + # 0 AND, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: img[data-src] + attribute: data-src + imdbid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="imdb.com/title/tt"] + attribute: href + doubanid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="movie.douban.com/subject/"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-child(5) + seeders: + selector: td.rowfollow:nth-child(6) + leechers: + selector: td.rowfollow:nth-child(7) + grabs: + selector: td.rowfollow:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumratio: + text: 1.0 + description: + selector: td:nth-child(2) + remove: a, b, font, img, span +# NexusPHP diff --git a/config/prowlarr/Definitions/shanaproject.yml b/config/prowlarr/Definitions/shanaproject.yml new file mode 100644 index 0000000..778c6c7 --- /dev/null +++ b/config/prowlarr/Definitions/shanaproject.yml @@ -0,0 +1,144 @@ +--- +id: shanaproject +name: Shana Project +description: "Shana Project is a Public torrent site for ANIME" +language: en-US +type: public +encoding: UTF-8 +links: + - https://www.shanaproject.com/ + +settings: + - name: sort + type: select + label: Sort requested from site + default: date + options: + date: created + ep: episode + fsize: size + title: title + - name: type + type: select + label: Order requested from site + default: Descending + options: + Descending: desc + Ascending: asc + - name: info + type: info + label: Searching + default: This site only supports searching for Titles. Do not add a season or episode number, or a quality to your query. + +caps: + categorymappings: + - {id: Anime, cat: TV/Anime, desc: Anime} + + modes: + search: [q] + tv-search: [q, season, ep] + +search: + paths: + - path: search/ + inputs: + title: "{{ .Keywords }}" + subber: "" + sort: "{{ .Config.sort }}" + dir: "{{ .Config.type }}" + keywordsfilters: + # strip season and ep + - name: re_replace + args: ["(?i)(?:\\s?[SE]?\\d{1,4}){1,2}$", ""] + + rows: + selector: div.grid_12 > div[id^="rel"] + + fields: + category: + text: Anime + title: + selector: div.release_leftover > div.release_text_contents + filters: + - name: re_replace + args: ["^(\\[.*\\]) (.*)", "$2 $1"] + - name: re_replace + args: ["(?i)(.mkv)", ""] + details: + selector: a + attribute: href + download: + selector: a[href^="/download/"] + attribute: href + date_full: + # Dec. 8, 2022, 6:25 a.m. + selector: div.release_20:contains(".m."):contains(":") + optional: true + filters: + - name: replace + args: [".", ""] + - name: replace + args: ["Sept", "Sep"] + - name: replace + args: ["July", "Jul"] + - name: replace + args: ["June", "Jun"] + - name: re_replace + args: ["April", "Apr"] + - name: re_replace + args: ["March", "Mar"] + - name: dateparse + args: "MMM d, yyyy, h:mm tt" + date_abbr: + # May 8, 2022, 6 a.m. + selector: div.release_20:contains(".m."):not(:contains(":")) + optional: true + filters: + - name: replace + args: [".", ""] + - name: replace + args: ["Sept", "Sep"] + - name: replace + args: ["July", "Jul"] + - name: replace + args: ["June", "Jun"] + - name: re_replace + args: ["April", "Apr"] + - name: re_replace + args: ["March", "Mar"] + - name: dateparse + args: "MMM d, yyyy, h tt" + date_noon: + # Sept. 30, 2022, noon + selector: div.release_20:contains(", noon") + optional: true + filters: + - name: replace + args: [".", ""] + - name: replace + args: ["Sept", "Sep"] + - name: replace + args: ["July", "Jul"] + - name: replace + args: ["June", "Jun"] + - name: re_replace + args: ["April", "Apr"] + - name: re_replace + args: ["March", "Mar"] + - name: re_replace + args: [" noon", " 12 pm"] + - name: dateparse + args: "MMM d, yyyy, h tt" + date: + text: "{{ if or .Result.date_full .Result.date_abbr .Result.date_noon }}{{ or .Result.date_full .Result.date_abbr .Result.date_noon }}{{ else }}now{{ end }}" + size: + selector: div.release_size + seeders: + text: 1 + leechers: + text: 1 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/shareisland-api.yml b/config/prowlarr/Definitions/shareisland-api.yml new file mode 100644 index 0000000..1b3c1e0 --- /dev/null +++ b/config/prowlarr/Definitions/shareisland-api.yml @@ -0,0 +1,204 @@ +--- +id: shareisland-api +name: Shareisland (API) +description: "A general italian tracker" +language: it-IT +type: private +encoding: UTF-8 +links: + - https://shareisland.org/ +legacylinks: + - http://shareisland.org/ + - http://www.shareisland.org/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Movie"} + - {id: 2, cat: TV, desc: "Serie TV"} + - {id: 15, cat: Books/EBook, desc: "Ebook"} + - {id: 17, cat: Books/Mags, desc: "Riviste e Giornali"} + - {id: 19, cat: XXX, desc: "XXX"} + - {id: 3, cat: Audio, desc: "Music"} + - {id: 7, cat: PC/Games, desc: "Games"} + - {id: 23, cat: PC, desc: "Software"} + - {id: 24, cat: TV/Sport, desc: "EVENTI SPORTIVI"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + music-search: [q] + book-search: [q] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your Shareisland account My Settings page and clicking on the API Key tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + inputs: {} # TODO: remove in v10 + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: "/api/torrents/filter" + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + # if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6 + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + seasonNumber: "{{ .Query.Season }}" + episodeNumber: "{{ .Query.Ep }}" + imdbId: "{{ .Query.IMDBIDShort }}" + tmdbId: "{{ .Query.TMDBID }}" + tvdbId: "{{ .Query.TVDBID }}" + "free[]": "{{ if .Config.freeleech }}100{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + keywordsfilters: + # strip season and/or ep + - name: re_replace + args: ["\\b([SE]\\d{1,4}){1,2}\\b", ""] + - name: diacritics + args: replace + - name: re_replace + args: ["\\.", " "] + + rows: + selector: data + attribute: attributes + + fields: + category: + selector: category_id + title: + selector: name + filters: + - name: re_replace # replace special characters with " " (space) + args: ["[\\[!\"#$%&'()*+,\\-.\\/:;<=>?@[\\]^_`{|}~]", " "] + - name: diacritics + args: replace + - name: re_replace # replace multiple spaces + args: ["[ ]{2,}", " "] + # normalize to SXXEYY format + - name: re_replace # S01 E01 to S01E01 + args: ["(?i)\\bS(\\d+)\\sE(\\d+)\\b", "S$1E$2"] + - name: re_replace # 01x01 to S01E01 + args: ["(?i)(\\d{2})x(\\d+)", "S$1E$2"] + - name: re_replace # 1x01 to S01E01 + args: ["(?i)\\b(\\d{1})x(\\d+)", "S0$1E$2"] + - name: re_replace # Stagione X --> S0X + args: ["(?i)\\bStagion[ei]\\s?(\\d{1})\\b|\\bSeason'?s?\\s?(\\d{1})\\b", "S0$1$2"] + - name: re_replace # Stagione XX --> SXX + args: ["(?i)\\bStagion[ei]\\s?(\\d{2,})\\b|\\bSeason'?s?\\s?(\\d{2,})\\b", "S$1$2"] + - name: re_replace # Episodio 4 to E4 + args: ["(?i)\\b(?:[\\/\\|]?Episodio\\s?(\\d+)|Puntata\\s?(\\d+))", "E$1$2"] + - name: re_replace # Episodi 4 5 to E04-05 + args: ["(?i)\\b(?:Puntate\\s*)(\\d+)\\s?(\\d+)", "E0$1-0$2"] + - name: re_replace # rimozioni varie + args: ["(?i)(Serie completa|Completat?a?|in pausa)", ""] + details: + selector: details_link + download: + selector: download_link + infohash: + selector: info_hash + poster: + selector: meta.poster + filters: + - name: replace + args: ["https://via.placeholder.com/90x135", ""] + imdbid: + selector: imdb_id + tmdbid: + selector: tmdb_id + tvdbid: + selector: tvdb_id + genre: + selector: meta.genres + filters: + - name: re_replace + args: ["(?i)(televisione film)", "televisione_film"] + - name: replace + args: [" & ", "_&_"] + description: + text: "{{ .Result.genre }}" + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0%, 25%, 50%, 75%, 100% + selector: freeleech + case: + 0%: 1 # not free + 25%: 0.75 + 50%: 0.5 + 75%: 0.25 + 100%: 0 # freeleech + "*": 0 # catch errors + uploadvolumefactor: + # api returns False, True + selector: double_upload + case: + False: 1 # normal + True: 2 # double +# global MR is 0.4 but torrents must be seeded for 7 days regardless of ratio +# minimumratio: +# text: 0.4 + minimumseedtime: + # 6 day (as seconds = 6 x 24 x 60 x 60) + text: 518400 +# json UNIT3D 7.0.3 (custom) diff --git a/config/prowlarr/Definitions/sharewood.yml b/config/prowlarr/Definitions/sharewood.yml new file mode 100644 index 0000000..e6f0f74 --- /dev/null +++ b/config/prowlarr/Definitions/sharewood.yml @@ -0,0 +1,214 @@ +--- +id: sharewood +name: Sharewood +description: "sharewood is a Semi-Private FRENCH Torrent Tracker for GENERAL" +language: fr-FR +type: semi-private +encoding: UTF-8 +links: + - https://www.sharewood.tv/ + +caps: + categorymappings: + - {id: "Films", cat: Movies, desc: "Films"} + - {id: "Films_Animations", cat: Movies, desc: "Films Animation"} + - {id: "Animes", cat: TV/Anime, desc: " Séries Animations"} + - {id: "Series", cat: TV, desc: "TV Series"} + - {id: "Documentaires", cat: TV/Documentary, desc: "TV Documentaires"} + - {id: "Emissions", cat: TV, desc: "TV Emissions"} + - {id: "Sports", cat: TV/Sport, desc: "TV Sports"} + - {id: "Spectacles", cat: TV, desc: "TV Spectacles/Concerts"} + - {id: "Karaoke_Video", cat: Audio/Video, desc: "Karaoké Vidéo"} + - {id: "Videos_Clips", cat: Audio/Video, desc: "TV Videos Clips"} + - {id: "Musiques", cat: Audio, desc: "Audio Musiques"} + - {id: "Karaoke", cat: Audio, desc: "Audio Karaoké"} + - {id: "Samples", cat: Audio, desc: "Audio Samples"} + - {id: "Podcasts", cat: Audio, desc: "Audio Podcasts"} + - {id: "AudioBooks", cat: Audio/Audiobook, desc: "Audio Books"} + - {id: "Windows", cat: PC/0day, desc: " Applications Windows"} + - {id: "APK", cat: PC/Mobile-Android, desc: " Applications Android"} + - {id: "GPS", cat: PC/Mobile-Other, desc: " Applications GPS"} + - {id: "Ebooks", cat: Books/EBook, desc: "Books Ebooks"} + - {id: "BDs", cat: Books/EBook, desc: "Books BDs"} + - {id: "Presse", cat: Books/Mags, desc: "Books Presse"} + - {id: "Mangas", cat: Books/Comics, desc: "Books Mangas"} + - {id: "Comics", cat: Books/Comics, desc: "Books Comics"} + - {id: "Nintendo", cat: Console/NDS, desc: "Jeux Nintendo"} + - {id: "Microsoft", cat: Console/XBox, desc: "Jeux Microsoft"} + - {id: "Linux", cat: PC/Games, desc: "Jeux Linux"} + - {id: "Mac", cat: PC/Games, desc: "Jeux Mac"} + - {id: "Sony", cat: Console/PSP, desc: "Jeux Sony"} + - {id: "Smartphone_Tablette", cat: Console, desc: "Jeux Smartphone/Tablette"} + - {id: "Retrogaming_Emulation", cat: Console, desc: "Jeux Rétrogaming & Emulation"} + - {id: "Formations", cat: Other, desc: "Formations"} + - {id: "Formations_Video", cat: Other, desc: "Formations Video"} + - {id: "Formations_Logiciels", cat: Other, desc: "Formations Logiciels"} + - {id: "Films_X", cat: XXX, desc: "XXX"} + - {id: "Ebooks_X", cat: XXX, desc: "XXX"} + - {id: "Hentai", cat: XXX, desc: "Hentai"} + - {id: "ImagesX", cat: XXX, desc: "ImagesX"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + allowrawsearch: true + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: multilang + type: checkbox + label: Replace MULTi by another language in release name + default: false + - name: multilanguage + type: select + label: Replace MULTi by this language + default: FRENCH + options: + FRENCH: FRENCH + MULTi FRENCH: MULTi FRENCH + ENGLISH: ENGLISH + MULTi ENGLISH: MULTi ENGLISH + VOSTFR: VOSTFR + MULTi VOSTFR: MULTi VOSTFR + - name: vostfr + type: checkbox + label: Replace VOSTFR and SUBFRENCH with ENGLISH + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: login + method: form + form: form[action$="/login"] + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + remember: on + selectorinputs: + _token: + selector: input[name="_token"] + attribute: value + error: + - selector: form[action$="/login"] .text-red + - selector: h1:contains("503 Service Temporarily Unavailable") +# test: +# path: / +# selector: a[href$="/logout"] + +search: + paths: + - path: filterTorrents + inputs: + search: "{{ .Keywords }}" + sorting: "{{ .Config.sort }}" + direction: "{{ .Config.type }}" + qty: 100 + freeleech: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + + keywordsfilters: + - name: re_replace + args: ["[\\:\\-\\/\\|]+", " "] + + rows: + selector: div.table-responsive-line + + fields: + category: + selector: img.torrent-icon + attribute: src + filters: + - name: regexp + args: "/img/NewIcones/(.+?).png" + title_phase1: + selector: a.view-torrent + title_vostfr: + text: "{{ .Result.title_phase1 }}" + filters: + - name: re_replace + args: ["(?i)\\b(vostfr|subfrench)\\b", "ENGLISH"] + title_phase2: + text: "{{ if .Config.vostfr }}{{ .Result.title_vostfr }}{{ else }}{{ .Result.title_phase1 }}{{ end }}" + title_multilang: + text: "{{ .Result.title_phase2 }}" + filters: + - name: re_replace + args: ["(?i)\\b(MULTI(?!.*(?:FRENCH|ENGLISH|VOSTFR)))\\b", "{{ .Config.multilanguage }}"] + title: + text: "{{ if .Config.multilang }}{{ .Result.title_multilang }}{{ else }}{{ .Result.title_phase2 }}{{ end }}" + download: + selector: a.view-torrent + attribute: href + filters: + - name: replace + args: ["/torrents/", "/download/"] + details: + selector: a.view-torrent + attribute: href + size: + selector: div.col-detail div.row div:nth-child(2) + seeders: + selector: div.bouton-s + leechers: + selector: div.bouton-l + grabs: + selector: div.bouton-c + date: + selector: div.col-detail div.row div span + filters: + - name: replace + args: ["il y a ", ""] + - name: replace + args: ["seconde", "second"] + - name: replace + args: ["heure", "hour"] + - name: replace + args: ["jour", "day"] + - name: replace + args: ["semaine", "week"] + - name: replace + args: ["mois", "month"] + - name: replace + args: ["an", "year"] + - name: append + args: " ago" + downloadvolumefactor: + case: + "span.badge-extra:contains('Freeleech')": 0 + "*": 1 + uploadvolumefactor: + case: + "span.badge-extra:contains('Double Upload')": 2 + "*": 1 + minimumratio: + text: 0.75 + minimumseedtime: + # 3 days (as seconds = 3 x 24 x 60 x 60) + text: 259200 +# UNIT3D diff --git a/config/prowlarr/Definitions/sharkpt.yml b/config/prowlarr/Definitions/sharkpt.yml new file mode 100644 index 0000000..f9a56da --- /dev/null +++ b/config/prowlarr/Definitions/sharkpt.yml @@ -0,0 +1,175 @@ +--- +id: sharkpt +name: SharkPT +description: "SharkPT is a CHINESE Private Torrent Tracker for MOVIES / TV / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://sharkpt.net/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "Movies/电影"} + - {id: 402, cat: TV, desc: "TV Series/电视连续剧"} + - {id: 403, cat: TV, desc: "TV Shows/综艺"} + - {id: 404, cat: TV/Documentary, desc: "Documentaries/纪录片"} + - {id: 405, cat: TV/Anime, desc: "Animations/动漫"} + - {id: 406, cat: Audio/Video, desc: "MusicVideo/音乐视频"} + - {id: 407, cat: TV/Sport, desc: "Sports/体育"} + - {id: 408, cat: Audio, desc: "Music/HQ Audio"} + - {id: 409, cat: Other, desc: "Misc/其他"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: 2facode + type: text + label: 2FA code + - name: info_2fa + type: info + label: "About 2FA code" + default: "Only fill in the 2FA code box if you have enabled 2FA on the 1ptbar Web Site. Otherwise just leave it empty." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + secret: "" + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + two_step_code: "{{ .Config.2facode }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("失败")) + test: + path: index.php + selector: shark-icon-button[onclick*="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl (4 does not appear to work) + search_area: "{{ if or .Query.IMDBID .Query.DoubanID }}1{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: div.torrent-item + + fields: + category: + selector: div.torrent-category + case: + img[src$="movies64.png"]: 401 + img[src$="tvseries64.png"]: 402 + img[src$="tvshows64.png"]: 403 + img[src$="doc64.png"]: 404 + img[src$="anime64.png"]: 405 + img[src$="mv64.png"]: 406 + img[src$="sports64.png"]: 407 + img[src$="hqaudio64.png"]: 408 + img[src$="misc64.png"]: 409 + title: + selector: a[href^="details.php?id="] + details: + selector: a[href^="details.php?id="] + attribute: href + _id: + selector: a[href^="details.php?id="] + attribute: href + filters: + - name: querystring + args: id + download: + text: "download.php?id={{ .Result._id }}" + imdbid: + selector: shark-tag-group[onClick*="imdb.com/title/tt"] + attribute: onClick + doubanid: + selector: shark-tag-group[onClick*="movie.douban.com/subject/"] + attribute: onClick + description: + selector: div.torrent-subtitle + date: + selector: div.torrent-when > span + attribute: title + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + size: + selector: div.torrent-size + seeders: + selector: div.torrent-seeders + leechers: + selector: div.torrent-leechers + grabs: + selector: div.torrent-snatches + downloadvolumefactor: + case: + "span.s-tag:contains(\"FREE\")": 0 + "span.s-tag:contains(\"50%\")": 0.5 + "span.s-tag:contains(\"30%\")": 0.3 + "*": 1 + uploadvolumefactor: + case: + "span.s-tag:contains(\"2X\")": 2 + "*": 1 + minimumseedtime: + # 7 day (as seconds = 7 x 24 x 60 x 60) + text: 604800 +# NexusPHP Standard v1.5 Beta 4 2010-09-19 diff --git a/config/prowlarr/Definitions/showrss.yml b/config/prowlarr/Definitions/showrss.yml new file mode 100644 index 0000000..4a02eb5 --- /dev/null +++ b/config/prowlarr/Definitions/showrss.yml @@ -0,0 +1,58 @@ +--- +id: showrss-yml +name: showRSS +description: "showRSS is a service that allows you to keep track of your favorite TV shows" +language: en-US +type: public +encoding: UTF-8 +links: + - https://showrss.info/ + +caps: + categorymappings: + - {id: 1, cat: TV/SD} + - {id: 2, cat: TV/HD} + + modes: + search: [q] + tv-search: [q, season, ep] + +settings: [] + +search: + paths: + - path: /other/all.rss + response: + type: xml + + rows: + selector: rss > channel > item + filters: + - name: andmatch + + fields: + category: + selector: raw_title + case: + ":contains(\"720p\")": 2 + ":contains(\"1080p\")": 2 + "*": 1 + title: + selector: raw_title + details: + text: / + date: + selector: pubDate + download: + selector: link + size: + text: "512 MB" + seeders: + text: 1 + leechers: + text: 1 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/siambit.yml b/config/prowlarr/Definitions/siambit.yml new file mode 100644 index 0000000..ced7ae1 --- /dev/null +++ b/config/prowlarr/Definitions/siambit.yml @@ -0,0 +1,207 @@ +--- +id: siambit +name: SiamBIT +description: "SiamBIT is a THAI Private Torrent Tracker for GENERAL" +language: th-TH +type: private +encoding: tis-620 +requestDelay: 2 +links: + - https://www.siambit.me/ + +caps: + categorymappings: + - {id: 1, cat: Other, desc: "@พระมหากษัตริย์ (@King)", default: true} + - {id: 75, cat: PC/0day, desc: "OS วินโดว์/ออฟฟิศ (OS Windows/Office)", default: true} + - {id: 10, cat: TV/Anime, desc: "การ์ตูน/อนิเมชั่น (Cartoons/Animation)", default: true} + - {id: 9, cat: TV/Sport, desc: "กีฬา/ฟุตบอล (Sports/Football)", default: true} + - {id: 110, cat: PC/Games, desc: "เกมส์มือถือ (Mobile Games)", default: true} + - {id: 7, cat: PC/Games, desc: "เกมส์ (Games)", default: true} + - {id: 40, cat: Audio/Video, desc: "คลิป (Clips)", default: true} + - {id: 16, cat: Audio/Video, desc: "คอนเสิร์ต (Concert)", default: true} + - {id: 3, cat: Audio/Other, desc: "คาราโอเกะ/MV (Karaoke/MV)", default: true} + - {id: 70, cat: PC, desc: "ซอฟต์แวร์ AntiVirus/Antispyware (Software AntiVirus/Antispyware)", default: true} + - {id: 100, cat: PC/Mobile-Other, desc: "ซอฟต์แวร์ มือถือ/ธีม/ริงโทน/mv (Software Mobile/Theme/Ringtone/MV)", default: true} + - {id: 85, cat: PC/Mac, desc: "ซอฟต์แวร์ แม็ค (Mac Software)", default: true} + - {id: 105, cat: PC, desc: "ซอฟต์แวร์ ลินุกซ์ (Linux Software)", default: true} + - {id: 8, cat: PC, desc: "ซอฟต์แวร์ (Software)", default: true} + - {id: 56, cat: Other, desc: "ดิกชันเนอรี่/แผนที่ (Dictionary/Map)", default: true} + - {id: 19, cat: TV, desc: "ทอล์คโชว์/ตลก/วิทยุ (Talk Show/Comedy/Radio)", default: true} + - {id: 20, cat: TV, desc: "ทั่วไป (General)", default: true} + - {id: 55, cat: PC/Mobile-iOS, desc: "แท็ปเล็ต/iPhone (Tablet/iPhone)", default: true} + - {id: 21, cat: TV, desc: "ธรรมะ (Dharma)", default: true} + - {id: 2, cat: Audio/MP3, desc: "เพลง (Music)", default: true} + - {id: 130, cat: Audio/Audiobook, desc: "เพลงคุณภาพสูง (Lossless) (High Quality Music (Lossless))", default: true} + - {id: 60, cat: Other, desc: "ฟอนต์/ไอคอน/คลิปอาร์ท/เทมเพลท (Fonts/Icons/Clip Art/Templates)", default: true} + - {id: 90, cat: Movies/UHD, desc: "ภาพยนตร์ 4K UHD (4K UHD Movies)", default: true} + - {id: 91, cat: Movies/DVD, desc: "ภาพยนตร์ DVD (DVD Movies)", default: true} + - {id: 92, cat: Movies/HD, desc: "ภาพยนตร์ Hi-Def (Hi-Def Movies)", default: true} + - {id: 89, cat: Movies/SD, desc: "ภาพยนตร์ VCD (VCD Movies)", default: true} + - {id: 93, cat: TV, desc: "แม่และเด็ก@/สื่อเรียนรู้สำหรับเด็ก (Mother and Child@/Learning Materials for Children)", default: true} + - {id: 4, cat: TV, desc: "รายการทีวี/วาไรตี้/เกมโชว์ (TV Shows/Variety/Game Shows)", default: true} + - {id: 50, cat: Other, desc: "รูปภาพ (Images)", default: true} + - {id: 18, cat: Other, desc: "เว็บไซต์ (Website)", default: true} + - {id: 17, cat: TV/Documentary, desc: "สารคดี (Documentary)", default: true} + - {id: 11, cat: Books/Technical, desc: "สื่อเรียนรู้/หนังสือ/Ebook (Learning Materials/Books/Ebook)", default: true} + - {id: 5, cat: TV, desc: "หนังชุด/ซีรีส์ [เกาหลี] (Movies/Series [Korea])", default: true} + - {id: 54, cat: TV, desc: "หนังชุด/ซีรีส์ [จีน] (Movies/Series [China])", default: true} + - {id: 51, cat: TV, desc: "หนังชุด/ซีรีส์ [ญี่ปุ่น] (Movies/Series [Japan])", default: true} + - {id: 52, cat: TV, desc: "หนังชุด/ซีรีส์ [ฝรั่ง] (Movies/Series [Western])", default: true} + - {id: 57, cat: TV, desc: "หนังชุด/ซีรีส์ [อื่นๆ] (Movies/Series [other])", default: true} + - {id: 53, cat: TV, desc: "หนังชุด/ซีรีส์/ละคร [ไทย] (Movie Series/Series/Drama [Thai])", default: true} + - {id: 901, cat: XXX, desc: "XXX-Anime", default: false} + - {id: 902, cat: XXX, desc: "XXX-Game", default: false} + - {id: 903, cat: XXX, desc: "XXX-Japan censored", default: false} + - {id: 904, cat: XXX, desc: "XXX-Japan", default: false} + - {id: 905, cat: XXX, desc: "XXX-Guava", default: false} + - {id: 906, cat: XXX, desc: "XXX-Asia censored", default: false} + - {id: 907, cat: XXX, desc: "XXX-Asia", default: false} + - {id: 908, cat: XXX, desc: "XXX-Gay", default: false} + - {id: 910, cat: XXX, desc: "XXX-clip", default: false} + - {id: 911, cat: XXX, desc: "XXX-pictures", default: false} + - {id: 912, cat: XXX, desc: "XXX-magazine", default: false} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 15 + options: + 15: created + 8: seeders + 5: size + 1: title desc + 14: title asc + - name: info_results + type: info + label: Search results + default: "If you are getting the error Found no results while trying to browse this tracker then the most likely reason is that you have Important news from the team on the Web Site that must be read before you can proceed to the torrent search page." + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: td.text + test: + path: / + selector: a[href="logout.php"] + +download: + before: + path: ajax.php + method: get + inputs: + action: "say_thanks" + id: "{{ .DownloadUri.Query.id }}" + selectors: + - selector: a[href^="downloadnew.php?id="] + attribute: href + +search: + paths: + - path: viewno18sb.php + categories: [1, 75, 10, 9, 110, 7, 40, 16, 3, 70, 100, 85, 105, 8, 56, 19, 20, 55, 21, 2, 130, 60, 90, 91, 92, 89, 93, 4, 50, 18, 17, 11, 5, 54, 51, 52, 57, 53] + - path: viewbrsb.php + categories: [901, 902, 903, 904, 905, 906, 907, 908, 910, 911, 912] + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 name, 1 both, 2 descr + searchin: 0 + sortby: "{{ .Config.sort }}" + + rows: + selector: "table[width=\"100%\"][border=1][cellspacing=0][cellpadding=5] > tbody > tr:has(a[href*=\"hashinfo=\"]){{ if .Config.freeleech }}:has(td:nth-child(3):contains(\"100%\")){{ else }}{{ end }}" + + fields: + category: + selector: a[href^="viewno18sb.php?cat="], a[href^="viewbrsb.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="details.php?id="] + attribute: href + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + files: + selector: td:nth-child(5) + date: + selector: td:nth-child(7) + filters: + - name: append + args: " +07:00" # ICT + - name: dateparse + args: "dd-MM-yyyyHH:mm:ss zzz" + size: + selector: td:nth-child(8) + grabs: + selector: td:nth-child(9) + seeders: + selector: td:nth-child(10) + leechers: + selector: td:nth-child(11) + downloadvolumefactor: + case: + "td:nth-child(3):contains(\"100%\")": 0 + "td:nth-child(3):contains(\"95%\")": 0.05 + "td:nth-child(3):contains(\"90%\")": 0.1 + "td:nth-child(3):contains(\"85%\")": 0.15 + "td:nth-child(3):contains(\"80%\")": 0.2 + "td:nth-child(3):contains(\"75%\")": 0.25 + "td:nth-child(3):contains(\"70%\")": 0.3 + "td:nth-child(3):contains(\"65%\")": 0.35 + "td:nth-child(3):contains(\"60%\")": 0.4 + "td:nth-child(3):contains(\"55%\")": 0.45 + "td:nth-child(3):contains(\"50%\")": 0.5 + "td:nth-child(3):contains(\"45%\")": 0.55 + "td:nth-child(3):contains(\"40%\")": 0.6 + "td:nth-child(3):contains(\"35%\")": 0.65 + "td:nth-child(3):contains(\"30%\")": 0.7 + "td:nth-child(3):contains(\"25%\")": 0.75 + "td:nth-child(3):contains(\"20%\")": 0.8 + "td:nth-child(3):contains(\"15%\")": 0.85 + "td:nth-child(3):contains(\"10%\")": 0.9 + "td:nth-child(3):contains(\"5%\")": 0.95 + "*": 1 + uploadvolumefactor: + case: + "td:nth-child(4):contains(\"x2\")": 2 + "td:nth-child(4):contains(\"x3\")": 3 + "td:nth-child(4):contains(\"x4\")": 4 + "td:nth-child(4):contains(\"x5\")": 5 + "td:nth-child(4):contains(\"x6\")": 6 + "td:nth-child(4):contains(\"x7\")": 7 + "td:nth-child(4):contains(\"x8\")": 8 + "td:nth-child(4):contains(\"x9\")": 9 + "*": 1 + minimumratio: + text: 1.0 +# engine n/a diff --git a/config/prowlarr/Definitions/simpleanime.yml b/config/prowlarr/Definitions/simpleanime.yml new file mode 100644 index 0000000..4d34f99 --- /dev/null +++ b/config/prowlarr/Definitions/simpleanime.yml @@ -0,0 +1,87 @@ +--- +id: simpleanime +name: SimpleAnime +description: "SimpleAnime is a CHINESE Public torrent tracker for ANIME" +language: zh-CN +type: public +encoding: UTF-8 +links: + - https://www.36dm.org/ + +caps: + categories: + Anime: TV/Anime + + modes: + search: [q] + tv-search: [q, season, ep] + music-search: [q] + book-search: [q] + +settings: [] + +download: + # cant use magnet directly, generates Invalid non-ASCII or control character in header: 0x79BB + infohash: + hash: + selector: a[href^="magnet:?xt="] + attribute: href + filters: + - name: regexp + args: ([A-F|a-f|0-9]{40}) + title: + selector: h4 + filters: + - name: trim + - name: validfilename + +search: + paths: + # https://www.36dm.org/ + # https://www.36dm.org/search-gene_20ai.htm + - path: "{{ if .Keywords }}search-{{ .Keywords }}-1.htm{{ else }}/{{ end }}" + keywordsfilters: + - name: replace + args: [" ", "_20"] + + rows: + selector: ul.threadlist > li:not(:has(a[href="thread-338792.htm"])):not(:has(a[href="thread-342865.htm"])):not(:has(a[href="thread-290995.htm"])) + + fields: + category: + text: Anime + title: + selector: a[href^="thread-"] + details: + selector: a[href^="thread-"] + attribute: href + download: + selector: a[href^="thread-"] + attribute: href + date: + selector: span.date + filters: + - name: replace + args: ["秒前", " seconds ago"] + - name: replace + args: ["分钟前", " minutes ago"] + - name: replace + args: ["小时前", " hours ago"] + - name: replace + args: ["天前", " days ago"] + - name: replace + args: ["月前", " months ago"] + - name: replace + args: ["年前", " years ago"] + - name: timeago + size: + text: 512MB + seeders: + text: 1 + leechers: + text: 1 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# BBS 4.0.4 diff --git a/config/prowlarr/Definitions/skipthecommercials-api.yml b/config/prowlarr/Definitions/skipthecommercials-api.yml new file mode 100644 index 0000000..7c07958 --- /dev/null +++ b/config/prowlarr/Definitions/skipthecommercials-api.yml @@ -0,0 +1,160 @@ +--- +id: skipthecommercials-api +name: SkipTheCommercials (API) +description: "SkipTheCommercials (STC) is a Private Torrent Tracker for TV" +language: en-US +type: private +encoding: UTF-8 +links: + - https://skipthecommericals.xyz/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Movies"} + - {id: 2, cat: TV, desc: "TV Show"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your SkipTheCommercials account My Settings page and clicking on the API Key tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + inputs: {} # TODO: remove in v10 + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: "/api/torrents/filter" + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + # if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6 + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + seasonNumber: "{{ .Query.Season }}" + episodeNumber: "{{ .Query.Ep }}" + imdbId: "{{ .Query.IMDBIDShort }}" + tmdbId: "{{ .Query.TMDBID }}" + tvdbId: "{{ .Query.TVDBID }}" + "free[]": "{{ if .Config.freeleech }}100{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + + rows: + selector: data + attribute: attributes + + fields: + category: + selector: category_id + title: + selector: name + details: + selector: details_link + download: + selector: download_link + infohash: + selector: info_hash + poster: + selector: meta.poster + filters: + - name: replace + args: ["https://via.placeholder.com/90x135", ""] + imdbid: + selector: imdb_id + tmdbid: + selector: tmdb_id + tvdbid: + selector: tvdb_id + genre: + selector: meta.genres + filters: + - name: re_replace + args: ["(?i)(TV Movie)", "TV_Movie"] + - name: replace + args: [" & ", "_&_"] + description: + text: "{{ .Result.genre }}" + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0%, 25%, 50%, 75%, 100% + selector: freeleech + case: + 0%: 1 # not free + 25%: 0.75 + 50%: 0.5 + 75%: 0.25 + 100%: 0 # freeleech + "*": 0 # catch errors + uploadvolumefactor: + # api returns False, True + selector: double_upload + case: + False: 1 # normal + True: 2 # double + minimumseedtime: + # 7 days (as seconds = 7 x 24 x 60 x 60) + text: 604800 +# json UNIT3D 7.0.3 diff --git a/config/prowlarr/Definitions/skipthetrailers.yml b/config/prowlarr/Definitions/skipthetrailers.yml new file mode 100644 index 0000000..3323a70 --- /dev/null +++ b/config/prowlarr/Definitions/skipthetrailers.yml @@ -0,0 +1,161 @@ +--- +id: skipthetrailers +name: SkipTheTrailers +description: "SkipTheTrailers (STT) is a Private Torrent Tracker for MOVIES" +language: en-US +type: private +encoding: UTF-8 +links: + - https://skipthetrailers.xyz/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Movies"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your SkipTheTrailers account My Security page and clicking on the API Token tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + inputs: {} # TODO: remove in v10 + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: "/api/torrents/filter" + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + # if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6 + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + seasonNumber: "{{ .Query.Season }}" + episodeNumber: "{{ .Query.Ep }}" + imdbId: "{{ .Query.IMDBIDShort }}" + tmdbId: "{{ .Query.TMDBID }}" + tvdbId: "{{ .Query.TVDBID }}" + "free[]": "{{ if .Config.freeleech }}100{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + + rows: + selector: data + attribute: attributes + + fields: + category: + selector: category_id + title: + selector: name + details: + selector: details_link + download: + selector: download_link + infohash: + selector: info_hash + poster: + selector: meta.poster + filters: + - name: replace + args: ["https://via.placeholder.com/90x135", ""] + imdbid: + selector: imdb_id + tmdbid: + selector: tmdb_id + tvdbid: + selector: tvdb_id + genre: + selector: meta.genres + filters: + - name: re_replace + args: ["(?i)(Science Fiction)", "Science_Fiction"] + - name: re_replace + args: ["(?i)(TV Movie)", "TV_Movie"] + - name: replace + args: [" & ", "_&_"] + description: + text: "{{ .Result.genre }}" + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0%, 25%, 50%, 75%, 100% + selector: freeleech + case: + 0%: 1 # not free + 25%: 0.75 + 50%: 0.5 + 75%: 0.25 + 100%: 0 # freeleech + "*": 0 # catch errors + uploadvolumefactor: + # api returns 0=false, 1=true + selector: double_upload + case: + 0: 1 # normal + 1: 2 # double + minimumseedtime: + # 7 days (as seconds = 7 x 24 x 60 x 60) + text: 604800 +# json UNIT3D 6.5.0 diff --git a/config/prowlarr/Definitions/sktorrent-org.yml b/config/prowlarr/Definitions/sktorrent-org.yml new file mode 100644 index 0000000..5060fc7 --- /dev/null +++ b/config/prowlarr/Definitions/sktorrent-org.yml @@ -0,0 +1,156 @@ +--- +id: sktorrent-org +name: SkTorrent-org +description: "SkTorrent.org is a Semi-Private torrent site for MOVIES / TV/ GENERAL" +language: en-US +type: semi-private +encoding: UTF-8 +links: + - https://sktorrent.org/ + +caps: + categorymappings: + - {id: 18, cat: PC/0day, desc: "Application - PC"} + - {id: 19, cat: PC/Mac, desc: "Application - Mac"} + - {id: 21, cat: PC/Mobile-Other, desc: "Application - Other"} + - {id: 47, cat: PC/Mobile-Android, desc: "Application - Android"} + - {id: 61, cat: Audio/Audiobook, desc: "Audio - Audio books"} + - {id: 60, cat: Audio, desc: "Audio - Music"} + - {id: 63, cat: Audio/Lossless, desc: "Audio - Flac"} + - {id: 64, cat: Audio/Other, desc: "Audio - Other"} + - {id: 9, cat: TV/Documentary, desc: "Documentaries - Other"} + - {id: 10, cat: PC/Games, desc: "Games - PC"} + - {id: 11, cat: Console/PS3, desc: "Games - PSX"} + - {id: 13, cat: Console/XBox 360, desc: "Games - Xbox360"} + - {id: 66, cat: Console/Other, desc: "Games - Other"} + - {id: 65, cat: Console/Other, desc: "Games - Android"} + - {id: 1, cat: Movies/DVD, desc: "Movies - DVD"} + - {id: 2, cat: Movies/SD, desc: "Movies - Divx/Xvid"} + - {id: 42, cat: Movies/HD, desc: "Movies - HD"} + - {id: 4, cat: Movies/Other, desc: "Movies - Other"} + - {id: 49, cat: Movies/3D, desc: "Movies - 3D"} + - {id: 48, cat: Movies/BluRay, desc: "Movies - Blu-ray"} + - {id: 70, cat: Movies/UHD, desc: "Movies - 4K"} + - {id: 22, cat: Audio/MP3, desc: "Music - MP3"} + - {id: 24, cat: Audio/Video, desc: "Music - DVD"} + - {id: 27, cat: Audio/Other, desc: "Music - Other"} + - {id: 35, cat: Audio, desc: "Music - Album"} + - {id: 36, cat: Books/EBook, desc: "Other - E-books"} + - {id: 53, cat: Other, desc: "Other - Other"} + - {id: 51, cat: Books/Mags, desc: "Other - Magazines"} + - {id: 50, cat: Books, desc: "Other - Books"} + - {id: 56, cat: XXX/WMV, desc: "Porn - Video"} + - {id: 55, cat: XXX, desc: "Porn - Movie"} + - {id: 54, cat: XXX/ImageSet, desc: "Porn - Picture"} + - {id: 68, cat: XXX/Other, desc: "Porn - Other"} + - {id: 69, cat: XXX/ImageSet, desc: "All - All"} + - {id: 6, cat: TV, desc: "TV - Divx/Xvid"} + - {id: 41, cat: TV/HD, desc: "TV - HD"} + - {id: 59, cat: TV/HD, desc: "TV - Full HD"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: id + options: + id: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: account-login.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: div.myFrame:contains("Access Denied") + test: + path: index.php + selector: a[href="account-logout.php"] + +search: + paths: + # https://sktorrent.org/torrents-search.php?c48=1&c2=1&c1=1&c42=1&c4=1&search=&cat=0&incldead=1&freeleech=0&inclexternal=0&lang=0 + # https://sktorrent.org/torrents-search.php?search=&cat=0&incldead=0&freeleech=0&inclexternal=0&lang=0 + - path: torrents-search.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + cat: 0 + # 0 active, 1 incldead, 2 onlydead + incldead: 1 + # 0 all, 1 notfree, 2 onlyfree + freeleech: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 both, 1 local, 2 external + inclexternal: 0 + # 0 all, 1 English, 2 etc... + lang: 0 + sort: "{{ .Config.sort }}" + order: "{{ .Config.type }}" + keywordsfilters: + - name: re_replace + args: ["(\\w+)", "+$1"] # prepend + to each word + + rows: + selector: tr.t-row + filters: + - name: andmatch + + fields: + category: + selector: td a[href^="torrents.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: td a[href^="torrents-details.php?id="] + attribute: title + details: + selector: td a[href^="torrents-details.php?id="] + attribute: href + download: + selector: td a[href^="download.php?id="] + attribute: href + date: + text: now + size: + selector: td:nth-child(5) + seeders: + selector: td:nth-child(6) + leechers: + selector: td:nth-child(7) + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 +# TorrentTrader diff --git a/config/prowlarr/Definitions/sktorrent.yml b/config/prowlarr/Definitions/sktorrent.yml new file mode 100644 index 0000000..1561825 --- /dev/null +++ b/config/prowlarr/Definitions/sktorrent.yml @@ -0,0 +1,231 @@ +--- +id: sktorrent +name: SkTorrent +description: "SkTorrent is a CZECH/SLOVAK Semi-Private Torrent Tracker for MOVIES / TV / GENERAL" +language: cs-CZ +type: semi-private +encoding: UTF-8 +links: + - https://sktorrent.eu/ +legacylinks: + - http://sktorrent.eu/torrent/ + - http://sktorrent.eu/ + +caps: + categorymappings: + - {id: 9, cat: XXX, desc: "xXx"} + - {id: 23, cat: Books, desc: "Knihy a Časopisy"} + - {id: 25, cat: Other, desc: "Ostatní"} + - {id: 1, cat: Movies, desc: "Filmy CZ/SK dabing"} + - {id: 5, cat: Movies, desc: "Filmy Kreslené"} + - {id: 14, cat: Movies/Other, desc: "Filmy Kamera"} + - {id: 15, cat: Movies, desc: "Filmy s titulkama"} + - {id: 20, cat: Movies/DVD, desc: "Filmy DVD"} + - {id: 31, cat: Movies, desc: "Filmy bez titulků"} + - {id: 3, cat: Movies/3D, desc: "Filmy 3D"} + - {id: 19, cat: Movies/HD, desc: "Filmy HD"} + - {id: 28, cat: Movies/BluRay, desc: "Filmy Blu-ray"} + - {id: 29, cat: Movies/3D, desc: "Filmy 3D Blu-ray"} + - {id: 43, cat: Movies/UHD, desc: "Filmy UHD"} + - {id: 18, cat: PC/Games, desc: "Hry na Windows"} + - {id: 30, cat: PC/Games, desc: "Hry na Konzole"} + - {id: 37, cat: PC/Games, desc: "Hry na Linux"} + - {id: 59, cat: PC/Games, desc: "Hry na Mac"} + - {id: 60, cat: PC/Games, desc: "xXx hry (18+)"} + - {id: 63, cat: PC/Games, desc: "VR Hry"} + - {id: 16, cat: TV, desc: "TV Seriál"} + - {id: 17, cat: TV/Documentary, desc: "TV Dokument"} + - {id: 42, cat: TV, desc: "TV Pořad"} + - {id: 44, cat: TV/Sport, desc: "TV Sport"} + - {id: 2, cat: Audio, desc: "Hudba"} + - {id: 22, cat: Audio, desc: "Hudba DJ's Mix"} + - {id: 24, cat: Audio, desc: "Mluvené slovo"} + - {id: 26, cat: Audio/Video, desc: "Hudební videa"} + - {id: 45, cat: Audio, desc: "Soundtrack"} + - {id: 21, cat: PC, desc: "Programy"} + - {id: 27, cat: PC/Mobile-Other, desc: "Mobil, PDA"} + - {id: 58, cat: Other, desc: "Neschválené"} + + modes: + search: [q] + tv-search: [q, season, ep, genre] + movie-search: [q, genre] + music-search: [q] + book-search: [q] + +login: + path: torrent/login.php + method: form + form: form[action^="login.php?returnto=index.php"] + inputs: + uid: "{{ .Config.username }}" + pwd: "{{ .Config.password }}" + error: + - selector: font:contains("Incorrect") + test: + path: torrent/index.php + selector: a[href^="usercp.php"] + +download: + selectors: + - selector: a[href^="download.php?id="] + attribute: href + +search: + paths: + - path: torrent/torrents_v2.php + inputs: + search: "{{ .Keywords }}" + category: "{{ range .Categories }}{{.}};{{end}}" + # 0 all, 1 activeonly, 2 deadonly + active: 0 + zaner: "{{ .Query.Genre }}" + keywordsfilters: + - name: diacritics + args: replace + + rows: + selector: table.lista > tbody > tr > td > table.lista > tbody > tr > td:has(a[href^="details.php?name="]) + + fields: + category: + selector: a[href^="torrents_v2.php?category="] + attribute: href + filters: + - name: querystring + args: category + title: + selector: a[href^="details.php?name="] + filters: + - name: re_replace + args: ["^VA\\s*\\|", "VA -"] + - name: re_replace + args: ["^.*? \\/\\s*|^.*? \\|\\s*", ""] + - name: re_replace + args: ["\\|\\s*\\d+\\% CSFD\\.cz\\/|\\s*=*\\s*CSFD\\s*\\d+\\%|\\s*CSFD\\s*=*\\s*\\d+\\%|\\s*CSFD", ""] + - name: re_replace + args: ["(\\d{1})\\s*\\.*\\s*az*\\s*(\\d{2,})\\s*\\.*\\s(?i)serie\\.*", "S0$1-S$2"] + - name: re_replace + args: ["(\\d{1})\\s*\\.*\\s*az*\\s*(\\d{1})\\s*\\.*\\s(?i)serie\\.*", "S0$1-S$2"] + - name: re_replace + args: ["(?i)serie\\s*(\\d{1})\\s*\\.*\\s*az*\\s*(\\d{2,})\\s*\\.*", "S0$1-S$2"] + - name: re_replace + args: ["(?i)serie\\s*(\\d{1})\\s*\\.*\\s*az*\\s*(\\d{1})\\s*\\.*", "S0$1-S$2"] + - name: re_replace + args: ["(?i)season\\,*\\s*(\\d{1})\\,\\s*\\d{1}\\,\\s*(\\d{2,})", "S0$1-S$2"] + - name: re_replace + args: ["(?i)season\\,*\\s*(\\d{1})\\,\\s*\\d{1}\\,\\s*(\\d{1})", "S0$1-S0$2"] + - name: re_replace + args: ["(?i)season\\s*(\\d{1})\\s*\\.*\\-*\\,*\\+*\\s*(\\d{2,})\\s*\\.*", "S0$1-S$2"] + - name: re_replace + args: ["(?i)season\\s*(\\d{1})\\s*\\.*\\-*\\,*\\+*\\s*(\\d{1})\\s*\\.*", "S0$1-S0$2"] + - name: re_replace + args: ["^GRID\\:*\\s(?i)season", "GRID Seasson"] + - name: re_replace + args: ["(?i)season\\s*(\\d{2,})\\.*", "S$1"] + - name: re_replace + args: ["(?i)season\\s*(\\d{1})\\.*", "S0$1"] + - name: re_replace + args: ["GRID Seasson", "GRID Season"] + - name: re_replace + args: ["\\sPES\\s(\\d{4})\\s(?i)season", " PES $1 Seasson"] + - name: re_replace + args: ["\\s\\(*(\\d{2,})\\.*\\s*(?i)season\\)*", " S$1"] + - name: re_replace + args: ["\\s\\(*(\\d{1})\\s*\\.*\\-*\\,*\\+*\\s*(\\d{2,})\\.*\\s(?i)season\\)*", " S0$1-S$2"] + - name: re_replace + args: ["\\s\\(*(\\d{1})\\s*\\.*\\-*\\,*\\+*\\s*(\\d{1})\\.*\\s(?i)season\\)*", " S0$1-S0$2"] + - name: re_replace + args: ["\\s\\(*(\\d{1})\\.*\\s*(?i)season\\)*", " S0$1"] + - name: re_replace + args: [" PES (\\d{4}) Seasson", " PES $1 Season"] + - name: re_replace + args: ["\\s\\(*(\\d{1})\\,\\s*\\d{1}\\,\\s*(\\d{2,})\\,*\\s*(?i)serie\\)*", " S0$1-S$2"] + - name: re_replace + args: ["\\s\\(*(\\d{1})\\,\\s*\\d{1}\\,\\s*(\\d{1})\\,*\\s*(?i)serie\\)*", " S0$1-S0$2"] + - name: re_replace + args: ["\\s\\(*(\\d{2,})\\.*\\s*(?i)serie\\)*", " S$1"] + - name: re_replace + args: ["\\s\\(*(\\d{1})\\s*\\.*\\-*\\,*\\+*\\s*(\\d{2,})\\.*\\s(?i)serie\\)*", " S0$1-S$2"] + - name: re_replace + args: ["\\s\\(*(\\d{1})\\s*\\.*\\-*\\,*\\+*\\s*(\\d{1})\\.*\\s(?i)serie\\)*", " S0$1-S0$2"] + - name: re_replace + args: ["\\s\\(*(\\d{1})\\.*\\s*(?i)serie\\)*", " S0$1"] + - name: re_replace + args: ["\\s\\(*(\\d{1})\\,\\s*\\d{1}\\,\\s*(\\d{2,})\\,*\\s*(?i)seria\\)*", " S0$1-S$2"] + - name: re_replace + args: ["\\s\\(*(\\d{1})\\,\\s*\\d{1}\\,\\s*(\\d{1})\\,*\\s*(?i)seria\\)*", " S0$1-S0$2"] + - name: re_replace + args: ["\\s\\d{2,}\\.*\\s*(?i)seria\\s\\((?i)s(\\d{2,})", " (S$1"] + - name: re_replace + args: ["\\s\\(*(\\d{1})\\s*\\.*\\-*\\,*\\+*\\s*(\\d{2,})\\.*\\s(?i)seria\\)*", " S0$1-S$2"] + - name: re_replace + args: ["\\s\\(*(\\d{1})\\s*\\.*\\-*\\,*\\+*\\s*(\\d{1})\\.*\\s(?i)seria\\)*", " S0$1-S0$2"] + - name: re_replace + args: ["\\s\\(*(\\d{2,})\\.*\\s*(?i)seria\\)*", " S$1"] + - name: re_replace + args: ["\\s\\(*(\\d{1})\\.*\\s*(?i)seria\\)*", " S0$1"] + - name: re_replace + args: ["\\s\\d{1}\\.*\\s*(?i)seria\\s*\\((?i)s(\\d{1})", " (S0$1"] + - name: re_replace + args: ["(\\d{2,})\\.*\\s*(?i)serii\\)*", "S01-S$1"] + - name: re_replace + args: ["(\\d{1})\\.*\\s*(?i)serii\\)*", "S01-S0$1"] + - name: re_replace + args: ["(?i)pouze (\\d{1})\\-(\\d{2,})", "pouze S0$1-S$2"] + - name: re_replace + args: ["(?i)pouze (\\d{1})\\-(\\d{1})", "pouze S0$1-S0$2"] + - name: re_replace + args: ["(?i)komplet (\\d{1})\\-(\\d{2,})", "komplet S0$1-S$2"] + - name: re_replace + args: ["(?i)komplet (\\d{1})\\-(\\d{1})", "komplet S0$1-S0$2"] + details: + selector: a[href^="details.php?name="] + attribute: href + poster: + selector: img[class="lozad"] + attribute: data-src + download: + selector: a[href^="details.php?name="] + attribute: href + size: + selector: div:has(a) + filters: + - name: regexp + args: "Velkost (.+?) \\|" + date: + selector: div:has(a) + # auto adjusted by site account profile + filters: + - name: regexp + args: "Pridany (\\d{2}/\\d{2}/\\d{4})" + - name: dateparse + args: "dd/MM/yyyy" + seeders: + selector: div:has(a) + filters: + - name: regexp + args: "Odosielaju : (\\d+)" + leechers: + selector: div:has(a) + filters: + - name: regexp + args: "Stahuju : (\\d+)" + genre: + selector: div:has(a) + filters: + - name: replace + args: ["\n", ""] + - name: replace + args: ["\x09", " "] + - name: validate + args: "Akcni, Animovany, Dobrodruzny, Dokumentarny, Drama, Eroticky, Experimentalni, Fantasy, Historicky, Horor, Hudebni, Katastroficky, Komedie, Kratkometrazni, Krimi, Loutkovy, Muzikal, Mysteriozni, Pohadka, Povidkovy, Psychologicky, Publicisticky, Reality-TV, Road-Movie, Rodinny, Romanticky, Sci-Fi, Soutezni, Sportovni, Talk-show, Telenovela, Thriller, Valecny, Western, Zivotopisny" + description: + text: "{{ .Result.genre }}" + downloadvolumefactor: + text: 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 0.51 +# BtiTracker 1.4.8 diff --git a/config/prowlarr/Definitions/slosoul.yml b/config/prowlarr/Definitions/slosoul.yml new file mode 100644 index 0000000..e206f3d --- /dev/null +++ b/config/prowlarr/Definitions/slosoul.yml @@ -0,0 +1,175 @@ +--- +id: slosoul +name: slosoul +description: "slosoul is a Slovanian Private Torrent Tracker for MOVIES / TV / GENERAL" +language: en-US +type: private +encoding: UTF-8 +testlinktorrent: false +links: + - https://slosoul.net/ +legacylinks: + - http://slosoul.net/ + +caps: + categorymappings: + - {id: 5, cat: PC, desc: "Apps"} + - {id: 7, cat: Books/EBook, desc: "Ebooks"} + - {id: 6, cat: PC/Games, desc: "Games PC"} + - {id: 19, cat: Console/XBox 360, desc: "GAMES xbox360"} + - {id: 8, cat: Movies, desc: "Movies Packs"} + - {id: 1, cat: Movies/SD, desc: "Movies Divx/Xvid"} + - {id: 9, cat: Movies/DVD, desc: "Movies DVD-r"} + - {id: 17, cat: Movies/HD, desc: "Movies x.264"} + - {id: 11, cat: Movies/BluRay, desc: "Movies BluRay"} + - {id: 15, cat: Movies/HD, desc: "Movies HEVC"} + - {id: 14, cat: Audio/Lossless, desc: "Music FLAC"} + - {id: 3, cat: Audio/MP3, desc: "Music MP3"} + - {id: 13, cat: TV/Sport, desc: "TV Sport"} + - {id: 18, cat: TV, desc: "TV Packs"} + - {id: 10, cat: TV, desc: "TV Shows"} + - {id: 16, cat: TV/HD, desc: "TV Shows HEVC"} + - {id: 12, cat: Other, desc: "VIP"} + - {id: 4, cat: XXX, desc: "Porn"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + logout: "" + error: + - selector: table:has(td.thead:contains("An error has occured!")) + test: + path: / + selector: a[href*="logout.php?logouthash="] + +download: + before: + path: takethanks.php + method: post + inputs: + torrentid: "{{ re_replace .DownloadUri.PathAndQuery \".*torrent-details-(\\d+).*\" \"$1\"}}" + selectors: + - selector: a[href*="download-torrent-"] + attribute: href + +search: + paths: + - path: browse.php + inputs: + do: search + # does not support multi categories so defaulting to ALL + category: 0 + # yes incldead, no activeonly + include_dead_torrents: yes + keywords: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # t_name, t_description, t_both, t_uploader, t_genre + search_type: "{{ if .Query.IMDBID }}t_genre{{ else }}t_name{{ end }}" + sort: "{{ .Config.sort }}" + order: "{{ .Config.type }}" + # does not return imdb link in results + keywordsfilters: + - name: re_replace # replace special characters with "%" (wildcard) + args: ["[^a-zA-Z0-9]+", "%"] + + rows: + selector: "table#sortabletable tbody tr:has(a[href*=\"download-torrent-\"]){{ if .Config.freeleech }}:has(img[src$=\"/freedownload.gif\"]){{ else }}{{ end }}" + + fields: + category: + selector: a[href*="torrent-category-"] + attribute: href + filters: + - name: regexp + args: (\d+) + title_default: + # is often abbreviated + selector: a[href*="torrent-details-"] + title: + # usually longer than details title + selector: div[id^="port-content-"] div + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href*="torrent-details-"] + attribute: href + download: + selector: a[href*="torrent-details-"] + attribute: href + magnet: + selector: a[href^="magnet:?xt="] + attribute: href + poster: + selector: div[id^="port-content-"] img + attribute: src + date: + selector: td:nth-child(2) > div:last-child + filters: + - name: regexp + args: (\d{2}-\d{2}-\d{4} \d{2}:\d{2}) + - name: append + args: " +00:00" # auto adjusted by site account profile + - name: dateparse + args: "dd-MM-yyyy HH:mm zzz" + size: + selector: td:nth-child(5) + grabs: + selector: td:nth-child(6) + seeders: + selector: td:nth-child(7) + leechers: + selector: td:nth-child(8) + downloadvolumefactor: + case: + img[src$="/external.gif"]: 0 + img[src$="/freedownload.gif"]: 0 + img[src$="/silverdownload.gif"]: 0.5 + "*": 1 + uploadvolumefactor: + case: + img[src$="/x2.gif"]: 2 + "*": 1 +# TBD, Rules and FAQ do not cover this yet +# minimumratio: +# text: 1.0 +# minimumseedtime: +# # 2 days (as seconds = 2 x 24 x 60 x 60) +# text: 172800 +# TS Special Edition v.8.0 diff --git a/config/prowlarr/Definitions/snowpt.yml b/config/prowlarr/Definitions/snowpt.yml new file mode 100644 index 0000000..31be406 --- /dev/null +++ b/config/prowlarr/Definitions/snowpt.yml @@ -0,0 +1,113 @@ +--- +id: snowpt +name: SnowPT +description: "SnowPT (SSPT) is a CHINESE Private Torrent Tracker for ANIME" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://skyeysnow.com/ + +caps: + categorymappings: + - {id: 1, cat: TV/Anime, desc: "Anime"} + + modes: + search: [q] + tv-search: [q, season, ep] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + +login: + path: login.php + method: form + form: form[id^="loginform_"] + inputs: + referer: / + loginfield: username + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + cookietime: 2592000 + error: + - selector: div#messagetext:contains("登录失败") p + test: + path: / + selector: a[href*="action=logout&formhash="] + +search: + paths: + # https://skyeysnow.com/forum.php?mod=torrents&cat=1&search=sei+no+kakuritsu + - path: forum.php + inputs: + mod: torrents + cat: 1 + search: "{{ .Keywords }}" + + rows: + selector: "table.torrents > tbody > tr:has(a[href^=\"/download.php?id=\"]){{ if .Config.freeleech }}:has(img.sp_4){{ else }}{{ end }}" + + fields: + category: + text: 1 + title_default: + selector: a[href^="/forum.php?mod=viewthread&tid="] + title: + selector: a[title][href^="/forum.php?mod=viewthread&tid="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="/forum.php?mod=viewthread&tid="] + attribute: href + download: + selector: a[href^="/download.php?id="] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td:nth-child(3) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td:nth-child(3):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td:nth-child(4) + seeders: + selector: td:nth-child(5) + leechers: + selector: td:nth-child(6) + grabs: + selector: td:nth-child(7) + downloadvolumefactor: + case: + img.sp_4: 0 # FREE + img.sp_2: 0.5 # 50% + "*": 1 + uploadvolumefactor: + case: +# img.sp_0: 2 # do not know what a flag of 2xSFC means, but I dont think this is a 2xupload + "*": 1 +# Discuz! X3.4 diff --git a/config/prowlarr/Definitions/solidtorrents.yml b/config/prowlarr/Definitions/solidtorrents.yml new file mode 100644 index 0000000..56de608 --- /dev/null +++ b/config/prowlarr/Definitions/solidtorrents.yml @@ -0,0 +1,173 @@ +--- +id: solidtorrents +name: Solid Torrents +description: "Solid Torrents is a Public torrent meta-search engine" +language: en-US +type: public +encoding: UTF-8 +requestDelay: 2 +links: + - https://solidtorrents.to/ + - https://solidtorrents.nocensor.cloud/ +legacylinks: + - https://solidtorrents.net/ + - https://solidtorrents.nocensor.click/ + - https://solidtorrents.eu/ + +caps: + categories: + AudioBook: Audio/Audiobook + eBook: Books/EBook + "Ebook/Course": Books/EBook + Games: PC/Games + "Games/PC": PC/Games + Movies: Movies + Music: Audio + "Music/Album": Audio + "Music/mp3": Audio/MP3 + "Music/Lossless": Audio/Lossless + "Music/Video": Audio/Video + Other: Other + "Other/Android": PC/Mobile-Android + "Other/Archive": Other + "Other/Audio": Audio + "Other/Database": PC + "Other/DiskImage": PC/ISO + "Other/Document": Books/Comics + "Other/Image": Other/Misc + "Other/Program": PC/0day + "Other/Sourcecode": PC + "Other/Source Code": PC + "Other/Video": TV + Softwares: PC/0day + "Softwares/Windows": PC/0day + TV: TV + Unknown: Other + XXX: XXX + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: sort + type: select + label: Sort requested from site + default: date + options: + date: created + seeders: seeders + size: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +search: + paths: + # https://solidtorrents.net/search?q=&sort=date&order=desc + - path: search + inputs: + q: "{{ .Keywords }}" + sort: "{{ .Config.sort }}" + order: "{{ .Config.type }}" + limit: 100 + + rows: + selector: li.search-result:has(a[class="dl-torrent"]) + + fields: + category: + selector: a.category + title: + selector: h5 + details: + selector: h5 a + attribute: href + download: + selector: a[class="dl-torrent"] + attribute: href + infohash: + selector: a[href^="magnet:?xt"] + attribute: href + filters: + - name: regexp + args: ([A-F|a-f|0-9]{40}) + grabs_dot: + selector: div.stats div:has(img[alt="Download"]):contains(".") + optional: true + filters: + - name: replace + args: [".", ""] + - name: replace + args: ["K", "00"] + - name: replace + args: ["M", "00000"] + grabs_nodot: + selector: div.stats div:has(img[alt="Download"]):not(:contains(".")) + optional: true + filters: + - name: replace + args: ["K", "000"] + - name: replace + args: ["M", "000000"] + grabs: + text: "{{ if or .Result.grabs_dot .Result.grabs_nodot }}{{ or .Result.grabs_dot .Result.grabs_nodot }}{{ else }}0{{ end }}" + size: + selector: div.stats div:has(img[alt="Size"]) + seeders_dot: + selector: div.stats div:has(img[alt="Seeder"]):contains(".") + optional: true + filters: + - name: replace + args: [".", ""] + - name: replace + args: ["K", "00"] + - name: replace + args: ["M", "00000"] + seeders_nodot: + selector: div.stats div:has(img[alt="Seeder"]):not(:contains(".")) + optional: true + filters: + - name: replace + args: ["K", "000"] + - name: replace + args: ["M", "000000"] + seeders: + text: "{{ if or .Result.seeders_dot .Result.seeders_nodot }}{{ or .Result.seeders_dot .Result.seeders_nodot }}{{ else }}0{{ end }}" + leechers_dot: + selector: div.stats div:has(img[alt="Leecher"]):contains(".") + optional: true + filters: + - name: replace + args: [".", ""] + - name: replace + args: ["K", "00"] + - name: replace + args: ["M", "00000"] + leechers_nodot: + selector: div.stats div:has(img[alt="Leecher"]):not(:contains(".")) + optional: true + filters: + - name: replace + args: ["K", "000"] + - name: replace + args: ["M", "000000"] + leechers: + text: "{{ if or .Result.leechers_dot .Result.leechers_nodot }}{{ or .Result.leechers_dot .Result.leechers_nodot }}{{ else }}0{{ end }}" + date: + selector: div.stats div:has(img[alt="Date"]) + filters: + - name: dateparse + args: "MMM d, yyyy" + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/sosulki.yml b/config/prowlarr/Definitions/sosulki.yml new file mode 100644 index 0000000..f9c4ced --- /dev/null +++ b/config/prowlarr/Definitions/sosulki.yml @@ -0,0 +1,84 @@ +--- +id: sosulki +name: sosulki +description: "sosulki is a RUSSIAN Public Torrent Tracker for 3X" +language: ru-RU +type: public +encoding: UTF-8 +links: + - https://sosulki.com/ +legacylinks: + - http://sosulki.net/ + - http://sosulki.com/ # site forces https +caps: + categorymappings: + - {id: 12, cat: XXX, desc: "Порно категории"} + - {id: 77, cat: XXX, desc: "Порно фильмы русские"} + - {id: 78, cat: XXX, desc: "Транссексуалы (Transsexual)"} + - {id: 79, cat: XXX, desc: "Бисексуалы (Bisexual)"} + - {id: 80, cat: XXX, desc: "Большие Члены (Big Cocks)"} + - {id: 81, cat: XXX, desc: "Секс Машины (Fucking Machines)"} + - {id: 75, cat: XXX, desc: "Порно фильмы зарубежные"} + - {id: 456, cat: XXX, desc: "Порно фильмы зарубежные"} + - {id: 76, cat: XXX, desc: "Геи (Gay)"} + - {id: 70, cat: XXX, desc: "БДСМ (BDSM)"} + - {id: 67, cat: XXX, desc: "Анал (Anal)"} + - {id: 68, cat: XXX, desc: "Большие попки (Big Ass)"} + - {id: 69, cat: XXX, desc: "Большие сиськи (Big Tits)"} + - {id: 73, cat: XXX, desc: "Групповой секс (Group Sex)"} + - {id: 65, cat: XXX, desc: "Порноролики зарубежные "} + - {id: 66, cat: XXX, desc: "Русское Порно Любительское (Amateur Russian)"} + - {id: 71, cat: XXX, desc: "Лесбиянки (Lesbians)"} + - {id: 74, cat: XXX, desc: "Любительское порно фото (Amateur Picture Gallery)"} + + modes: + search: [q] + +settings: [] + +download: + selectors: + - selector: a[href^="magnet:?xt="] + attribute: href + +search: + paths: + - path: "{{ if .Keywords }}?do=search&subaction=search&search_start=0&full_search=1&result_from=1&story={{ .Keywords }}&titleonly=3&catlist[]=0&searchdate=0&resorder=desc{{ else }}lastnews/{{ end }}" + + rows: + selector: tr.fr_viewn_in:has(td.frs:contains("B")) + + fields: + category: + selector: img[src^="/templates/freewhite/img/"] + attribute: src + filters: + - name: regexp + args: (\d+) + title: + selector: td.titlelast a + attribute: title + details: + selector: td.titlelast a + attribute: href + download: + selector: td.titlelast a + attribute: href + date: + selector: i + filters: + - name: append + args: " +03:00" # MSK + - name: dateparse + args: "dd-MM-yyyy HH:mm:ss zzz" + size: + selector: td.frs + seeders: + selector: td.frsl_s + leechers: + selector: td.frsl_p + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# DataLife diff --git a/config/prowlarr/Definitions/soulvoice.yml b/config/prowlarr/Definitions/soulvoice.yml new file mode 100644 index 0000000..dc855f9 --- /dev/null +++ b/config/prowlarr/Definitions/soulvoice.yml @@ -0,0 +1,195 @@ +--- +id: soulvoice +name: SoulVoice +description: "SoulVoice is a CHINESE Private Torrent Tracker for MOVIES / TV / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://pt.soulvoice.club/ + +caps: + categorymappings: + - {id: 407, cat: Other, desc: "Study/教学"} + - {id: 401, cat: Movies, desc: "Movies/电影"} + - {id: 402, cat: TV, desc: "TV Series/电视剧"} + - {id: 404, cat: TV/Documentary, desc: "Documentaries/纪录片"} + - {id: 405, cat: TV/Anime, desc: "Animations/动漫"} + - {id: 403, cat: TV, desc: "TV Show/综艺"} + - {id: 406, cat: Audio/Video, desc: "MusicVideo/音乐视频"} + - {id: 408, cat: Audio, desc: "HQ Audio/音乐"} + - {id: 409, cat: Other, desc: "其它 (Other)"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: 2facode + type: text + label: 2FA code + - name: info_2fa + type: info + label: "About 2FA code" + default: "Only fill in the 2FA code box if you have enabled 2FA on the SoulVoice Web Site. Otherwise just leave it empty." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + secret: "" + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + two_step_code: "{{ .Config.2facode }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("失败")) + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + # currently supports only one query id at one time. + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }}{{ else }}{{ .Keywords }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl + search_area: "{{ if .Query.IMDBID }}4{{ else }}{{ end }}{{ if .Query.DoubanID }}1{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }}{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: img[data-src] + attribute: data-src + imdbid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="imdb.com/title/tt"] + attribute: href + doubanid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="movie.douban.com/subject/"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-last-of-type(6) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-last-of-type(6):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-last-of-type(5) + seeders: + selector: td.rowfollow:nth-last-of-type(4) + leechers: + selector: td.rowfollow:nth-last-of-type(3) + grabs: + selector: td.rowfollow:nth-last-of-type(2) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumratio: + text: 2.0 + minimumseedtime: + # 3 days (as seconds = 3 x 24 x 60 x 60) + text: 259200 + description: + selector: td.rowfollow:nth-child(2) + remove: a, b, font, img, span +# NexusPHP v1.8.8 2023-09-25 diff --git a/config/prowlarr/Definitions/speedmasterhd.yml b/config/prowlarr/Definitions/speedmasterhd.yml new file mode 100644 index 0000000..d604069 --- /dev/null +++ b/config/prowlarr/Definitions/speedmasterhd.yml @@ -0,0 +1,221 @@ +--- +id: speedmasterhd +name: Speedmaster HD +description: "Speedmaster HD is a German Time based tracker for MOVIES / TV" +language: de-DE +type: private +encoding: UTF-8 +links: + - https://speedmaster-hd.net/ + +caps: + categorymappings: + # 1080p + - {id: 131, cat: Movies/HD, desc: "Movies 1080p"} + - {id: 133, cat: Movies/HD, desc: "Movie Pack 1080p"} + - {id: 29, cat: TV/HD, desc: "Serien 1080p"} + - {id: 17, cat: TV/Documentary, desc: "Doku 1080p"} + - {id: 18, cat: XXX, desc: "XXX 1080p"} + - {id: 95, cat: TV/HD, desc: "Serien Packs 1080p"} + - {id: 138, cat: Movies/HD, desc: "x265 1080p"} + # 720p + - {id: 60, cat: Movies/HD, desc: "Movies 720p"} + - {id: 132, cat: Movies/HD, desc: "Movie Pack 720p"} + - {id: 30, cat: TV/HD, desc: "Serien 720p"} + - {id: 21, cat: TV/Documentary, desc: "Doku 720p"} + - {id: 22, cat: XXX, desc: "XXX 720p"} + - {id: 96, cat: TV/HD, desc: "Serien Packs 720p"} + - {id: 139, cat: Movies/HD, desc: "x265 720p"} + # 4K/2k + - {id: 129, cat: Movies/UHD, desc: "Remux 4K/2k"} + - {id: 130, cat: Movies/UHD, desc: "Untouched 4K/2k"} + - {id: 134, cat: Movies/UHD, desc: "UHD/2160p 4K/2k"} + - {id: 120, cat: Movies/UHD, desc: "Movies 4K/2k"} + - {id: 121, cat: TV/UHD, desc: "Serien 4K/2k"} + - {id: 122, cat: TV/Documentary, desc: "Doku 4K/2k"} + - {id: 123, cat: XXX, desc: "XXX 4K/2k"} + # 3D + - {id: 90, cat: Movies/3D, desc: "Untouched 3D"} + - {id: 87, cat: Movies/3D, desc: "1080p 3D"} + - {id: 92, cat: Movies/3D, desc: "720p 3D"} + - {id: 118, cat: TV/Documentary, desc: "Doku 3D"} + - {id: 97, cat: XXX, desc: "XXX 3D"} + # Audio + - {id: 135, cat: Audio/Audiobook, desc: "Audio A-Book/FLAC"} + - {id: 136, cat: Audio/Audiobook, desc: "Audio A-Book/MP3"} + - {id: 33, cat: Audio/Lossless, desc: "Audio Lossless"} + - {id: 124, cat: Audio/MP3, desc: "Audio Lossy"} + - {id: 125, cat: Audio, desc: "Audio Tonspur"} + # MusikVideo + - {id: 42, cat: Audio/Video, desc: "MusikVideo Untouched"} + - {id: 101, cat: Audio/Video, desc: "MusikVideo Remux"} + - {id: 43, cat: Audio/Video, desc: "MusikVideo 1080p"} + - {id: 44, cat: Audio/Video, desc: "MusikVideo 720p"} + # Untouched + - {id: 51, cat: Movies, desc: "Movies Untouched"} + - {id: 100, cat: TV, desc: "Serien Untouched"} + - {id: 99, cat: TV/Documentary, desc: "Doku Untouched"} + - {id: 102, cat: XXX, desc: "XXX Untouched"} + # Remux + - {id: 12, cat: Movies, desc: "Movies Remux"} + - {id: 126, cat: TV, desc: "Serien Remux"} + - {id: 11, cat: TV/Documentary, desc: "Doku Remux"} + - {id: 10, cat: XXX, desc: "XXX Remux"} + # Sonstiges + - {id: 49, cat: Other, desc: "Sonstiges RarFix"} + - {id: 93, cat: Other, desc: "Sonstiges HD-Pics"} + - {id: 94, cat: Other, desc: "Sonstiges HD-XXX Pics"} + - {id: 98, cat: Other, desc: "Sonstiges to sort"} + # E-Book + - {id: 103, cat: Books/EBook, desc: "E-Book Mixed"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeds: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: login.php + method: form + form: form[action="login.php"] + cookies: ["JAVA=OK"] # avoid jscheck redirect + inputs: + input[id="username"]: "{{ .Config.username }}" + input[id="password"]: "{{ .Config.password }}" + input[name="loginkeeping"]: loginkeeping + input[name="loginnow"]: yes + selectors: true + selectorinputs: + uufl: + selector: input[name="uufl"] + attribute: value + uupf: + selector: input[name="uupf"] + attribute: value + error: + - selector: "div[style^=\"color: #EC0000;\"]" + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: selection.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 name, 1 descr, 2 both + blah: "0" + orderby: "{{ .Config.sort }}" + sort: "{{ .Config.type }}" + + rows: + selector: div.content_wrap > div.selection_wrap:has(a[href^="details.php?id="]) + + fields: + category: + selector: a[href^="selection.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download_ssl.php?torrent="] + attribute: href + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + poster: + selector: div[id^="details-"] div div img + attribute: src + filters: + - name: replace + args: ["cloud-data/standard_cover/ebook_t.png", ""] + - name: replace + args: ["cloud-data/standard_cover/doku_t.png", ""] + - name: replace + args: ["cloud-data/standard_cover/serie_t.png", ""] + - name: replace + args: ["cloud-data/standard_cover/music_t.png", ""] + - name: replace + args: ["cloud-data/standard_cover/no_pic_t.png", ""] + - name: replace + args: ["cloud-data/standard_cover/xxx_t.png", ""] + description: + selector: div[class^="flag_pic_"] + attribute: onmouseover + filters: + - name: regexp + args: "'(.+?)'" + size: + selector: div.selection_unter_ad + grabs: + selector: div.selection_unter_ae + seeders: + selector: div.selection_unter_aa > b + leechers: + selector: div.selection_unter_aaa > b + date_day: + # Heute 03:27:27 + # Gestern 21:00:59 + selector: div.selection_unter_ab:contains("Heute"), div.selection_unter_ab:contains("Gestern") + optional: true + filters: + - name: replace + args: ["Heute ", "Today"] + - name: replace + args: ["Gestern ", "Yesterday"] + - name: fuzzytime + date_year: + # 03.03.2020 um 23:31:52 + selector: div.selection_unter_ab:not(:contains("Heute")):not(:contains("Gestern")) + optional: true + filters: + - name: append + args: " +01:00" # CET + - name: replace + args: ["um ", ""] + - name: dateparse + args: "dd.MM.yyyy HH:mm:ss zzz" + date: + text: "{{ if or .Result.date_year .Result.date_day }}{{ or .Result.date_year .Result.date_day }}{{ else }}now{{ end }}" + downloadvolumefactor: + text: 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 + minimumseedtime: + text: 288000 # 80h +# THX custom diff --git a/config/prowlarr/Definitions/speedtorrentreloaded.yml b/config/prowlarr/Definitions/speedtorrentreloaded.yml new file mode 100644 index 0000000..05268cf --- /dev/null +++ b/config/prowlarr/Definitions/speedtorrentreloaded.yml @@ -0,0 +1,183 @@ +--- +id: speedtorrentreloaded +name: SpeedTorrent Reloaded +description: "SpeedTorrent Reloaded (ST-Tracker) is a GERMAN Private Torrent Tracker for MOVIES / TV / GENERAL" +language: de-DE +type: private +encoding: UTF-8 +followredirect: true +links: + - https://st-tracker.eu/ +legacylinks: + - https://speedtorrent-tracker.mine.nu/ + +caps: + categorymappings: + - {id: 47, cat: Movies/BluRay, desc: "Movies-Bluray"} + - {id: 48, cat: Movies/HD, desc: "Movies-720p"} + - {id: 49, cat: Movies/HD, desc: "Movies-1080p"} + - {id: 11, cat: Movies/DVD, desc: "Movies DVD / HD2DVD"} + - {id: 60, cat: Movies/HD, desc: "Movies-HDTV"} + - {id: 62, cat: Movies/SD, desc: "Movies-SD"} + - {id: 89, cat: Movies/UHD, desc: "Movies-4K"} + - {id: 90, cat: Movies/3D, desc: "Movies-3-D"} + - {id: 91, cat: Movies, desc: "Movies-Packs"} + - {id: 108, cat: Movies, desc: "Movies Remux"} + - {id: 32, cat: Movies, desc: "Movies"} + - {id: 14, cat: Audio/Other, desc: "Alben / Sampler / Singles"} + - {id: 36, cat: Audio/Audiobook, desc: "Hörbuch"} + - {id: 71, cat: Audio/Other, desc: "Soundtracks"} + - {id: 70, cat: Audio/Lossless, desc: "Flac"} + - {id: 72, cat: Audio, desc: "Musik-Packs"} + - {id: 93, cat: Audio/Video, desc: "Musik-Videos"} + - {id: 98, cat: Audio, desc: "Discografie"} + - {id: 18, cat: PC/0day, desc: "Appz-Sonstige"} + - {id: 28, cat: PC/0day, desc: "Windows-Programme"} + - {id: 105, cat: PC, desc: "Linux-Programme"} + - {id: 107, cat: PC, desc: "WebScripts"} + - {id: 23, cat: TV/Sport, desc: "Wrestling"} + - {id: 74, cat: TV/Sport, desc: "Fussball"} + - {id: 75, cat: TV/Sport, desc: "Formel 1"} + - {id: 16, cat: TV, desc: "Serien-Packs"} + - {id: 77, cat: TV/SD, desc: "Serien-SD"} + - {id: 78, cat: TV/HD, desc: "Serien-720p"} + - {id: 79, cat: TV/HD, desc: "Serien-1080p"} + - {id: 95, cat: TV/UHD, desc: "Serien-4K"} + - {id: 99, cat: TV/SD, desc: "Staffel-SD"} + - {id: 100, cat: TV/HD, desc: "Staffel-HD"} + - {id: 109, cat: TV/UHD, desc: "Staffel-UHD"} + - {id: 4, cat: PC/Games, desc: "PC-Games"} + - {id: 84, cat: Console/PS3, desc: "PS3/PS4"} + - {id: 84, cat: Console/PS4, desc: "PS3/PS4"} + - {id: 85, cat: Console/XBox 360, desc: "Xbox-360"} + - {id: 101, cat: PC/Games, desc: "Mac-Games"} + - {id: 104, cat: Console/NDS, desc: "Nintendo"} + - {id: 106, cat: PC/Games, desc: "Linux-Games"} + - {id: 88, cat: XXX, desc: "XXX"} + - {id: 19, cat: Books/EBook, desc: "EBooks"} + - {id: 87, cat: TV/Anime, desc: "Anime"} + - {id: 96, cat: Other, desc: "Sonstiges"} + - {id: 102, cat: Books/Mags, desc: "Zeitung/Zeitschrift"} + - {id: 113, cat: XXX/Other, desc: "Hentai"} + - {id: 111, cat: TV/Documentary, desc: "Doku-HD"} + - {id: 112, cat: TV/Documentary, desc: "Doku-SD"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: secure_code + type: password + label: "Secure Code (4 digits)" + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeds: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: sessioncheck.php?session=1 + method: form + form: form + inputs: + take: yes + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + secure_code: "{{ .Config.secure_code }}" + error: + - selector: .main .card:contains("Login fehlgeschlagen") + message: + selector: .main .card .card-block + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: tfiles.php + inputs: + showsearch: 1 + $raw: "{{ if .Categories }}{{ range .Categories }}c{{.}}=1&{{end}}{{ else }}{{ end }}" + search: "{{ .Keywords }}" + orderby: "{{ .Config.sort }}" + sort: "{{ .Config.type }}" + # 0 active, 1 all, 2 dead + incldead: 1 + + rows: + selector: tr:has(a[href^="details.php?id="]) + + fields: + category: + selector: a[href^="tfiles.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?torrent="] + attribute: href + poster: + selector: a[href^="details.php?id="][onmouseover] + attribute: onmouseover + filters: + - name: regexp + args: src=([^\s]+) + grabs: + selector: tr > th > span:nth-child(5) + size: + selector: tr > th > span:nth-child(2) + filters: + - name: replace + args: ["Größe: ", ""] + seeders: + selector: tr > th > span:nth-child(3) + leechers: + selector: tr > th > span:nth-child(4) + date: + selector: tr > td:nth-child(3) + filters: + - name: regexp + args: "(\\d{2}\\.\\d{2}\\.\\d{4}\\s\\d{2}:\\d{2}:\\d{2})" + - name: append + args: " +01:00" # CET + - name: replace + args: ["\xA0", " "] + - name: dateparse + args: "dd.MM.yyyy HH:mm:ss zzz" + downloadvolumefactor: + text: 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 0.7 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# D€ Source 2017 Version 1.0 diff --git a/config/prowlarr/Definitions/spiritofrevolution.yml b/config/prowlarr/Definitions/spiritofrevolution.yml new file mode 100644 index 0000000..3fe4be9 --- /dev/null +++ b/config/prowlarr/Definitions/spiritofrevolution.yml @@ -0,0 +1,191 @@ +--- +id: spiritofrevolution +name: Spirit of Revolution +description: "Spirit of Revolution is a German Time based tracker for 0DAY" +language: de-DE +type: private +encoding: UTF-8 +links: + - https://sor-next.tk/ + +caps: + categorymappings: + - {id: 30, cat: Movies/SD, desc: "Filme SD"} + - {id: 134, cat: Movies/HD, desc: "Filme HD"} + - {id: 138, cat: Movies/BluRay, desc: "Filme BluRay"} + - {id: 137, cat: Movies, desc: "Filme Remux"} + - {id: 160, cat: Movies/UHD, desc: "Filme 4K/UHD"} + - {id: 186, cat: Movies/Foreign, desc: "Filme Englisch-SD-HD"} + - {id: 143, cat: Movies/3D, desc: "Filme 3D"} + - {id: 133, cat: Movies/DVD, desc: "Filme DVD"} + - {id: 182, cat: Movies/SD, desc: "Filme Pack/SD"} + - {id: 183, cat: Movies/HD, desc: "Filme Pack/HD"} + - {id: 174, cat: TV/Anime, desc: "Filme Anime"} + - {id: 140, cat: TV/SD, desc: "Serien SD"} + - {id: 135, cat: TV/HD, desc: "Serien HD"} + - {id: 136, cat: TV/SD, desc: "Serien Pack/SD"} + - {id: 180, cat: TV/HD, desc: "Serien Pack/HD"} + - {id: 184, cat: TV/UHD, desc: "Serien Pack/UHD"} + - {id: 179, cat: TV/Anime, desc: "Serien Anime"} + - {id: 128, cat: Audio/MP3, desc: "Audio MP3/AAC"} + - {id: 169, cat: Audio, desc: "Audio Pack"} + - {id: 129, cat: Audio/Lossless, desc: "Audio FLAC"} + - {id: 175, cat: Audio/Video, desc: "Audio Musikvideos"} + - {id: 172, cat: Audio, desc: "Audio Charts"} + - {id: 154, cat: Audio/Audiobook, desc: "Audio Hoerbuch"} + - {id: 29, cat: PC/Games, desc: "Games PC"} + - {id: 13, cat: Console, desc: "Games Konsole"} + - {id: 150, cat: Console/Other, desc: "Games Android"} + - {id: 49, cat: PC/0day, desc: "APPZ Windows"} + - {id: 130, cat: PC/Mac, desc: "APPZ Mac/Linux"} + - {id: 153, cat: PC/Mobile-Android, desc: "APPZ Android"} + - {id: 132, cat: Books, desc: "E-Book Epub"} + - {id: 131, cat: Books, desc: "E-Book PDF"} + - {id: 173, cat: TV/Documentary, desc: "Dokus Packs"} + - {id: 147, cat: TV/Documentary, desc: "Dokus SD / HD"} + - {id: 22, cat: XXX, desc: "XXX Filme"} + - {id: 176, cat: XXX, desc: "XXX Packs"} + - {id: 185, cat: XXX, desc: "XXX PDF/Epub"} + - {id: 156, cat: TV/Sport, desc: "Sport SD / HD"} + - {id: 177, cat: Other, desc: "Sonstiges Alles andere"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeds: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: haustuer.php + method: form + form: form[action="haustuer.php"] + cookies: ["JAVA=OK"] # avoid jscheck redirect + inputs: + input[id="username"]: "{{ .Config.username }}" + input[id="password"]: "{{ .Config.password }}" + input[name="loginkeeping"]: loginkeeping + input[name="loginnow"]: yes + selectors: true + selectorinputs: + uufl: + selector: input[name="uufl"] + attribute: value + uupf: + selector: input[name="uupf"] + attribute: value + error: + - selector: "div[style=\"color: #EC0000;\"]" + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: selection.php + inputs: + $raw: "{{ if .Categories }}{{ range .Categories }}scat[]={{.}}&{{end}}{{ else }}{{ end }}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # 0 name, 1 descr, 2 both, 3 imdb + blah: "{{ if .Query.IMDBID }}3{{ else }}0{{ end }}" + orderby: "{{ .Config.sort }}" + sort: "{{ .Config.type }}" + + rows: + selector: div.content_wrap > div.selection_wrap:has(a[href^="details.php?id="]) + + fields: + category: + selector: a[href^="selection.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download_ssl.php?torrent="] + attribute: href + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + poster: + selector: div[id^="details-"] div div img + attribute: src + description: + selector: div[class^="flag_pic_"] + attribute: onmouseover + filters: + - name: regexp + args: "'(.+?)'" + size: + selector: div.selection_unter_ad + grabs: + selector: div.selection_unter_ae + filters: + - name: replace + args: [" x", ""] + seeders: + selector: div.selection_unter_aa > b + leechers: + selector: div.selection_unter_aaa > b + date_day: + # Heute 03:27:27 + # Gestern 21:00:59 + selector: div.selection_unter_ab:contains("Heute"), div.selection_unter_ab:contains("Gestern") + optional: true + filters: + - name: replace + args: ["Heute ", "Today"] + - name: replace + args: ["Gestern ", "Yesterday"] + - name: fuzzytime + date_year: + # 03.03.2020 um 23:31:52 + selector: div.selection_unter_ab:not(:contains("Heute")):not(:contains("Gestern")) + optional: true + filters: + - name: append + args: " +01:00" # CET + - name: replace + args: ["um ", ""] + - name: dateparse + args: "dd.MM.yyyy HH:mm:ss zzz" + date: + text: "{{ if or .Result.date_year .Result.date_day }}{{ or .Result.date_year .Result.date_day }}{{ else }}now{{ end }}" + downloadvolumefactor: + text: 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 + minimumseedtime: + text: 172800 # 2 day (48h) +# THX custom diff --git a/config/prowlarr/Definitions/sportscult.yml b/config/prowlarr/Definitions/sportscult.yml new file mode 100644 index 0000000..ca59f1a --- /dev/null +++ b/config/prowlarr/Definitions/sportscult.yml @@ -0,0 +1,184 @@ +--- +id: sportscult +name: SportsCult +description: "SportsCult is a Private Torrent Tracker for SPORTS" +language: en-US +type: private +encoding: UTF-8 +links: + - https://sportscult.org/ + +caps: + categorymappings: + - {id: 47, cat: TV/Sport, desc: "EPL"} + - {id: 41, cat: TV/Sport, desc: "American Football"} + - {id: 54, cat: TV/Sport, desc: "AutoMotoRacing"} + - {id: 17, cat: TV/Sport, desc: "Athletics"} + - {id: 51, cat: TV/Sport, desc: "Baseball"} + - {id: 34, cat: TV/Sport, desc: "Bodybuilding/Fitness"} + - {id: 50, cat: TV/Sport, desc: "Golf"} + - {id: 29, cat: TV/Sport, desc: "Boxing"} + - {id: 19, cat: TV/Sport, desc: "BrainGames"} + - {id: 36, cat: TV/Sport, desc: "BreakDance"} + - {id: 40, cat: TV/Sport, desc: "Golf"} + - {id: 23, cat: TV/Sport, desc: "Cycling"} + - {id: 31, cat: TV/Sport, desc: "Documentary"} + - {id: 1, cat: TV/Sport, desc: "European Basketball"} + - {id: 6, cat: TV/Sport, desc: "European Soccer"} + - {id: 37, cat: TV/Sport, desc: "Extreme Sports"} + - {id: 9, cat: TV/Sport, desc: "Fight Sports"} + - {id: 32, cat: TV/Sport, desc: "Formula1"} + - {id: 45, cat: TV/Sport, desc: "GAA (Gaelic)"} + - {id: 8, cat: TV/Sport, desc: "Golf"} + - {id: 22, cat: TV/Sport, desc: "Gymnastics"} + - {id: 39, cat: TV/Sport, desc: "Handball"} + - {id: 2, cat: TV/Sport, desc: "International Basket"} + - {id: 25, cat: TV/Sport, desc: "IceHockey"} + - {id: 4, cat: TV/Sport, desc: "International Soccer"} + - {id: 42, cat: TV/Sport, desc: "KHL"} + - {id: 35, cat: TV/Sport, desc: "KickBoxing/Muay Thai"} + - {id: 43, cat: TV/Sport, desc: "La Liga"} + - {id: 15, cat: TV/Sport, desc: "MotorSport"} + - {id: 24, cat: TV/Sport, desc: "MLB/Baseball"} + - {id: 28, cat: TV/Sport, desc: "MMA"} + - {id: 11, cat: TV/Sport, desc: "NBA/WNBA"} + - {id: 3, cat: TV/Sport, desc: "NCAA Basket/Football"} + - {id: 5, cat: TV/Sport, desc: "NFL"} + - {id: 27, cat: TV/Sport, desc: "NHL"} + - {id: 26, cat: TV/Sport, desc: "Olympic games"} + - {id: 7, cat: TV/Sport, desc: "Rugby"} + - {id: 44, cat: TV/Sport, desc: "Serie A"} + - {id: 38, cat: TV/Sport, desc: "Snooker/Pool"} + - {id: 30, cat: TV/Sport, desc: "Streetball"} + - {id: 18, cat: TV/Sport, desc: "Swimming/Aquatics"} + - {id: 46, cat: TV/Sport, desc: "AFL(AustralianFB)"} + - {id: 12, cat: TV/Sport, desc: "Tennis"} + - {id: 20, cat: TV/Sport, desc: "Volleyball/Beach"} + - {id: 21, cat: TV/Sport, desc: "Weightlifting"} + - {id: 16, cat: TV/Sport, desc: "WinterSport"} + - {id: 33, cat: TV/Sport, desc: "Wrestling/Grapling"} + - {id: 48, cat: TV/Sport, desc: "Uncategorised"} + - {id: 53, cat: TV/Sport, desc: "Cricket"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 3 + options: + 3: created + 5: seeders + 4: size + 2: title + - name: type + type: select + label: Order requested from site + default: 2 + options: + 2: desc + 1: asc + - name: info + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + - name: flaresolverr + type: info + label: FlareSolverr + default: This site may use Cloudflare DDoS Protection, therefore Prowlarr requires FlareSolverr to access it. + +login: + path: index.php?page=login + method: post + inputs: + uid: "{{ .Config.username }}" + pwd: "{{ .Config.password }}" + error: + - selector: td.lista span:contains("Username Incorrect") + - selector: td.lista span:contains("Password Incorrect") + - selector: td.lista span[style="color:#FF0000;"] + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + # https://sportscult.org/index.php?search=&page=torrents&category=0&active=0&order=3&by=2 + - path: index.php + inputs: + page: torrents + search: "{{ .Keywords }}" + category: "{{ if .Categories }}{{ join .Categories \";\" }}{{ else }}0{{ end }}" + # 0 all, 1 active, 2 dead + active: 0 + gold: "{{ if .Config.freeleech }}3{{ else }}0{{ end }}" + order: "{{ .Config.sort }}" + by: "{{ .Config.type }}" + + rows: + selector: table.lista:last-of-type:not(:has(td.block:contains("Our Team Recommend"))) > tbody > tr:has(a[href^="index.php?page=torrents&category="]) + + fields: + category: + selector: a[href^="index.php?page=torrents&category="] + attribute: href + filters: + - name: querystring + args: category + title: + selector: a[href^="index.php?page=torrent-details&id="] + filters: + # strip the upright bars in the title + - name: re_replace + args: ["( \\| )+", " "] + details: + selector: a[href^="index.php?page=torrent-details&id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + filters: + # strip the upright bars in the title's filename + - name: re_replace + args: ["(\\+%7C\\+)+", "+"] + size: + selector: td:nth-child(4) + seeders: + selector: td:nth-child(6) + leechers: + selector: td:nth-child(7) + grabs: + selector: td:nth-child(8) + date: + selector: td:nth-child(5) + # auto adjusted by site account profile + filters: + - name: dateparse + args: "dd/MM/yyyy" + downloadvolumefactor: + case: + img[src="gold/gold.gif"]: 0 + img[src="gold/silver.gif"]: 0.5 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 0.9 + minimumseedtime: + # 36 hours (as seconds = 36 x 60 x 60) + text: 129600 +# xbtit 2.3.0 diff --git a/config/prowlarr/Definitions/springsunday.yml b/config/prowlarr/Definitions/springsunday.yml new file mode 100644 index 0000000..33ac353 --- /dev/null +++ b/config/prowlarr/Definitions/springsunday.yml @@ -0,0 +1,168 @@ +--- +id: springsunday +name: SpringSunday +description: "SpringSunday (SSD) is a CHINESE Private Torrent Tracker for HD MOVIES / TV / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://springsunday.net/ + +caps: + categorymappings: + - {id: 501, cat: Movies, desc: "Movies(电影)"} + - {id: 502, cat: TV, desc: "TV Series(剧集)"} + - {id: 503, cat: TV/Documentary, desc: "Docs(纪录)"} + - {id: 504, cat: TV/Anime, desc: "Animations(动画)"} + - {id: 505, cat: TV, desc: "TV Shows(综艺)"} + - {id: 506, cat: TV/Sport, desc: "Sports(体育)"} + - {id: 507, cat: Audio/Video, desc: "MV(音乐视频)"} + - {id: 508, cat: Audio, desc: "Music(音乐)"} + - {id: 509, cat: Other, desc: "Others(其他)"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: index.php + selector: a[href*="logout.php?auth="] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # 0 incldead, 1 active, 2 onlydead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xFree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 all, 1 popular, 2 classic, 3 recomended, 4 2+3 + pick: 0 + # 0 title, 3 uploader, 4 imdb URL, 5 douban URL + search_area: "{{ if or .Query.IMDBID .Query.DoubanID }}{{ else }}0{{ end }}{{ if .Query.IMDBID }}4{{ else }}{{ end }}{{ if .Query.DoubanID }}5{{ else }}{{ end }}" + # 0 AND, 1 OR, 2 Exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + # supports imdbid and douban searching but does not display imdb and douban link in results. + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href*="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href*="details.php?id="] + title: + selector: a[title][href*="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href*="details.php?id="] + attribute: href + download: + selector: a[href*="download.php?id="] + attribute: href + imdbid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="imdb.com/title/tt"] + attribute: href + doubanid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="movie.douban.com/subject/"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-last-child(6) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-last-child(6):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-last-child(5) + seeders: + selector: td.rowfollow:nth-last-child(4) + leechers: + selector: td.rowfollow:nth-last-child(3) + grabs: + selector: td.rowfollow:nth-last-child(2) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + description: + selector: td:nth-child(2) + remove: a, b, font, img, span +# NexusPHP Standard v1.5 Beta 4 2010-09-19 (customised) diff --git a/config/prowlarr/Definitions/sugoimusic.yml b/config/prowlarr/Definitions/sugoimusic.yml new file mode 100644 index 0000000..773c4a0 --- /dev/null +++ b/config/prowlarr/Definitions/sugoimusic.yml @@ -0,0 +1,188 @@ +--- +id: sugoimusic +name: SugoiMusic +description: "SugoiMusic is a Private Torrent Tracker for Asian MUSIC / TV" +language: en-US +type: private +encoding: UTF-8 +links: + - https://sugoimusic.me/ + +caps: + categorymappings: + - {id: 1, cat: Audio, desc: Album} + - {id: 2, cat: Audio, desc: EP} + - {id: 3, cat: Audio, desc: Single} + - {id: 4, cat: Audio/Video, desc: Bluray} + - {id: 5, cat: Audio/Video, desc: DVD} + - {id: 6, cat: Audio/Video, desc: PV} + - {id: 7, cat: Audio/Video, desc: "Music Performance"} + - {id: 8, cat: Audio/Video, desc: "TV Music"} + - {id: 9, cat: TV, desc: "TV Variety"} + - {id: 10, cat: TV, desc: "TV Drama"} + - {id: 11, cat: Other, desc: Pictures} + - {id: 12, cat: Other/Misc, desc: Misc} + + modes: + search: [q] + tv-search: [q, season, ep, year, genre] + music-search: [q, year, genre] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: 2facode + type: text + label: 2FA code + - name: info_2fa + type: info + label: "About 2FA code" + default: "Only fill in the 2FA code box if you have enabled 2FA on the SugoiMusic Web Site. Otherwise just leave it empty." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: time + options: + time: created + seeders: seeders + size: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Covers per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="login.php"] + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + twofa: "{{ .Config.2facode }}" + login: "Log in" + error: + - selector: span.warning + message: + selector: span[class="warning"]:not(:contains("JavaScript")) + test: + path: index.php + selector: a[href^="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}" + searchstr: "{{ .Keywords }}" + # freetorrent: 0 normal, 1 freeleech, 2 neutral leech, 3 either + freetorrent: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + # we can only grab the first release if group_results=1 + group_results: 0 + action: advanced + year: "{{ .Query.Year }}" + taglist: "{{ .Query.Genre }}" + order_by: "{{ .Config.sort }}" + order_way: "{{ .Config.type }}" + searchsubmit: 1 + + rows: + selector: tr.torrent + + fields: + category: + selector: div:nth-child(1) + case: + "div[title=\"Album\"]": 1 + "div[title=\"EP\"]": 2 + "div[title=\"Single\"]": 3 + "div[title=\"Bluray\"]": 4 + "div[title=\"DVD\"]": 5 + "div[title=\"PV\"]": 6 + "div[title=\"Music Performance\"]": 7 + "div[title=\"TV Music\"]": 8 + "div[title=\"TV Variety\"]": 9 + "div[title=\"TV Drama\"]": 10 + "div[title=\"Pictures\"]": 11 + "div[title=\"Misc\"]": 12 + title_artist: + selector: div.torrent_artists > a + optional: true + filters: + - name: append + args: " - " + title_name: + selector: a.torrent_name + title_date: + selector: div.group_info.clear + filters: + - name: regexp + args: "(\\[.+?\\])" + title: + text: "{{ .Result.title_artist }}{{ .Result.title_name }} {{ .Result.title_date }}" + details: + selector: a.torrent_name[href^="torrents.php?id="] + attribute: href + poster: + selector: img + attribute: src + filters: + - name: replace + args: ["/static/common/noartwork/nocover.png", ""] + genre: + selector: div.tags + description_info: + selector: div.torrent_info + description: + text: "{{ .Result.description_info }}
{{ .Result.genre }}" + download: + selector: span > a[href^="torrents.php?action=download&id="] + attribute: href + magnet: + # magnet links can be enabled/disabled in account settings + optional: true + selector: span > a[href^="magnet:?dn="] + attribute: href + date: + selector: span.time.tooltip + filters: + - name: timeago + size: + selector: td.number_column.nobr + files: + selector: td:nth-last-child(6) + seeders: + selector: td:nth-last-child(2) + leechers: + selector: td:nth-last-child(1) + grabs: + selector: td:nth-last-child(3) + downloadvolumefactor: + case: + div.torrent_info:contains("Freeleech"): 0 + div.torrent_info:contains("Neutral Leech"): 0 + "*": 1 + uploadvolumefactor: + case: + div.torrent_info:contains("Neutral Leech"): 0 + "*": 1 + minimumratio: + text: 0.95 + minimumseedtime: + # 3 days (as seconds = 3 x 24 x 60 x 60) + text: 259200 +# engine n/a diff --git a/config/prowlarr/Definitions/sukebeinyaasi.yml b/config/prowlarr/Definitions/sukebeinyaasi.yml new file mode 100644 index 0000000..9419e8c --- /dev/null +++ b/config/prowlarr/Definitions/sukebeinyaasi.yml @@ -0,0 +1,122 @@ +--- +id: sukebeinyaasi +name: sukebei.nyaa.si +description: "sukebei.nyaa is a Public torrent site focused on adult Eastern Asian media including anime, manga, games and JAV" +language: en-US +type: public +encoding: UTF-8 +links: + - https://sukebei.nyaa.si/ +legacylinks: + - https://sukebei.nyaa.lol/ + +settings: + - name: filter-id + type: select + label: Filter + default: 0 + options: + 0: No filter + 1: No remakes + 2: Trusted only + - name: cat-id + type: select + label: Category + default: 0_0 + options: + 0_0: "All categories" + 1_0: "Art" + 1_1: "Art - Anime" + 1_2: "Art - Doujinshi" + 1_3: "Art - Games" + 1_4: "Art - Manga" + 1_5: "Art - Pictures" + 2_0: "Real Life" + 2_1: "Real Life - Photobooks and Pictures" + 2_2: "Real Life - Videos" + - name: sort + type: select + label: Sort requested from site + default: id + options: + id: created + seeders: seeders + size: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +caps: + categorymappings: + # Art + - {id: 1_0, cat: XXX, desc: "Adult Art"} + - {id: 1_1, cat: XXX, desc: "Adult Anime"} + - {id: 1_2, cat: XXX, desc: "Doujinshi"} + - {id: 1_3, cat: XXX, desc: "Adult Games"} + - {id: 1_4, cat: XXX, desc: "Adult Manga"} + - {id: 1_5, cat: XXX, desc: "Adult Pictures"} + # Real Life + - {id: 2_0, cat: XXX, desc: "Adult Real Life"} + - {id: 2_1, cat: XXX, desc: "Adult Photobooks and Pictures"} + - {id: 2_2, cat: XXX, desc: "Adult Videos"} + + modes: + search: [q] + +search: + paths: + - path: / + inputs: + q: "{{ .Keywords }}" + f: "{{ .Config.filter-id }}" + c: "{{ .Config.cat-id }}" + s: "{{ .Config.sort }}" + o: "{{ .Config.type }}" + + rows: + selector: tr.default,tr.danger,tr.success + + fields: + category: + selector: td:nth-child(1) a + attribute: href + filters: + - name: split + args: ["=", -1] + title: + selector: td:nth-child(2) a:last-of-type + details: + selector: td:nth-child(2) a:last-of-type + attribute: href + download: + selector: td:nth-child(3) a[href$=".torrent"] + optional: true + attribute: href + magnet: + selector: td:nth-child(3) a[href^="magnet:?"] + optional: true + attribute: href + size: + selector: td:nth-child(4) + date: + selector: td:nth-child(5) + filters: + - name: append + args: " -00:00" # GMT + - name: dateparse + args: "yyyy-MM-dd HH:mm zzz" + seeders: + selector: td:nth-child(6) + leechers: + selector: td:nth-child(7) + grabs: + selector: td:nth-child(8) + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/superbits.yml b/config/prowlarr/Definitions/superbits.yml new file mode 100644 index 0000000..cd028ad --- /dev/null +++ b/config/prowlarr/Definitions/superbits.yml @@ -0,0 +1,273 @@ +--- +id: superbits +name: Superbits +description: "Superbits is a SWEDISH Private Torrent Tracker for MOVIES / TV / GENERAL" +language: sv-SE +type: private +encoding: UTF-8 +links: + - https://superbits.org/ + +caps: + categorymappings: + - {id: 1, cat: Movies/DVD, desc: DVD-R Swesub} + - {id: 2, cat: TV, desc: DVD-R TV} + - {id: 3, cat: Books/EBook, desc: eBok} + - {id: 4, cat: Movies/HD, desc: Film 1080} + - {id: 5, cat: Movies/3D, desc: Film 3D} + - {id: 6, cat: Movies/HD, desc: Film 720} + - {id: 7, cat: Movies/BluRay, desc: Film Bluray} + - {id: 24, cat: Movies/UHD, desc: Film 4K} + - {id: 8, cat: TV, desc: Svensk TV} + - {id: 9, cat: Audio/Audiobook, desc: Ljudböcker} + - {id: 10, cat: Audio/Video, desc: Musikvideos} + - {id: 11, cat: Books/Mags, desc: E-tidningar} + - {id: 12, cat: Audio, desc: MP3} + - {id: 13, cat: Other, desc: Omslag} + - {id: 14, cat: Other, desc: Övrigt} + - {id: 15, cat: PC/Games, desc: PC-Spel} + - {id: 16, cat: PC/0day, desc: Program} + - {id: 17, cat: Console/PS4, desc: Playstation} + - {id: 18, cat: TV, desc: TV} + - {id: 19, cat: Console/Other, desc: Nintendo} + - {id: 20, cat: Console/XBox, desc: Xbox} + - {id: 21, cat: Movies/SD, desc: Xvid} + - {id: 25, cat: Movies/Foreign, desc: Subpacks} + - {id: 22, cat: XXX, desc: XXX} + - {id: 23, cat: Audio/Lossless, desc: FLAC} + - {id: 26, cat: TV, desc: TV DK} + - {id: 27, cat: TV, desc: TV NO} + - {id: 28, cat: TV, desc: TV FI} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: p2p_releases_only + type: checkbox + label: Search P2P releases only + default: false + - name: sort + type: select + label: Sort requested from site + default: d + options: + d: created + up: seeders + s: size + n: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + +search: + paths: + - path: api/v1/torrents + response: + type: json + noResultsMessage: "" + + inputs: + $raw: "{{ range .Categories }}categories[]={{.}}&{{end}}" + dkaudio: false + dksub: false + enaudio: false + ensub: false + extendedSearch: false + fiaudio: false + fisub: false + freeleech: "{{ if .Config.freeleech }}true{{ else }}false{{ end }}" + index: 0 + limit: 100 + noaudio: false + nosub: false + order: "{{ .Config.type }}" + p2p: "{{ if .Config.p2p_releases_only }}true{{ else }}{{ end }}" + page: search + searchText: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }} {{ else }}{{ end }}{{ .Keywords }}" + section: all + sort: "{{ .Config.sort }}" + stereoscopic: false + sweaudio: false + swesub: false + watchview: false + + rows: + selector: $ + + fields: + category: + selector: category + title: + selector: name + _id: + selector: id + details: + text: "/torrent/{{ .Result._id }}/" + download: + text: "/api/v1/torrents/download/{{ .Result._id }}" + imdbid: + selector: imdbid2 + imdbid_full: + optional: true + selector: imdbid2 + poster_normal: + optional: true + selector: customcover + poster_imdb: + optional: true + text: "{{ if .Result.imdbid }}/img/imdb/{{ .Result.imdbid_full }}.jpg{{ else }}{{ end }}" + poster: + text: "{{ if .Result.poster_imdb }}{{ .Result.poster_imdb }}{{ else }}{{ .Result.poster_normal }}{{ end }}" + date: + # 2021-10-26 13:50:07 + selector: added + filters: + - name: append + args: " +01:00" # CET + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + size: + selector: size + files: + selector: numfiles + grabs: + selector: timesCompleted + optional: true + default: 0 + seeders: + selector: seeders + leechers: + selector: leechers + downloadvolumefactor: + # api returns 0=false, 1=true + selector: frileech + case: + 0: 1 # not free + 1: 0 # freeleech + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.1 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 + title_desc: + optional: true + selector: title + year: + optional: true + selector: year + genre: + selector: genres + _tagline_desc: + optional: true + selector: tagline + _cast_desc: + optional: true + selector: cast + _rating_desc: + optional: true + selector: rating + filters: + - name: re_replace + args: ["^0$", ""] + _plot_desc: + optional: true + selector: plot + _section_desc: + optional: true + selector: section + _predate_desc: + selector: preDate + filters: + - name: re_replace + args: ["1970-01-01 01:00:00", ""] + _p2ptag: + selector: p2p + case: + 0: "" + 1: P2P + _packtag: + selector: pack + case: + 0: "" + 1: Pack + _reqidtag: + selector: reqid + case: + 0: "" + "*": Request + _sweaudiotag: + selector: sweaudio + case: + 0: "" + "*": "Swedish audio" + _swesubtag: + selector: swesub + case: + 0: "" + "*": "Swedish subtitles" + _dkaudiotag: + selector: dkaudio + case: + 0: "" + "*": "Danish audio" + _dksubtag: + selector: dksub + case: + 0: "" + "*": "Danish subtitles" + _enaudiotag: + selector: enaudio + case: + 0: "" + "*": "English audio" + _ensubtag: + selector: ensub + case: + 0: "" + "*": "English subtitles" + _noaudiotag: + selector: noaudio + case: + 0: "" + "*": "Norwegian audio" + _nosubtag: + selector: nosub + case: + 0: "" + "*": "Norwegian subtitles" + _tag_desc: + optional: true + text: "{{ if .Result._p2ptag }}{{ .Result._p2ptag }}, {{ else }}{{ end }}{{ if .Result._packtag }}{{ .Result._packtag }}, {{ else }}{{ end }}{{ if .Result._reqidtag }}{{ .Result._reqidtag }}, {{ else }}{{ end }}{{ if .Result._sweaudiotag }}{{ .Result._sweaudiotag }}, {{ else }}{{ end }}{{ if .Result._swesubtag }}{{ .Result._swesubtag }}, {{ else }}{{ end }}{{ if .Result._dkaudiotag }}{{ .Result._dkaudiotag }}, {{ else }}{{ end }}{{ if .Result._dksubtag }}{{ .Result._dksubtag }}, {{ else }}{{ end }}{{ if .Result._enaudiotag }}{{ .Result._enaudiotag }}, {{ else }}{{ end }}{{ if .Result._ensubtag }}{{ .Result._ensubtag }}, {{ else }}{{ end }}{{ if .Result._noaudiotag }}{{ .Result._noaudiotag }}, {{ else }}{{ end }}{{ if .Result._nosubtag }}{{ .Result._nosubtag }}{{ else }}{{ end }}" + filters: + - name: regexp + args: "(.+?), $" + description: + text: "{{ if .Result.title_desc }}Title: {{ .Result.title_desc }}
{{ else }}{{ end }}{{ if .Result.year }}Year: {{ .Result.year }}
{{ else }}{{ end }}{{ if .Result.genre }}Genres: {{ .Result.genre }}
{{ else }}{{ end }}{{ if .Result._tagline_desc }}Tagline: {{ .Result._tagline_desc }}
{{ else }}{{ end }}{{ if .Result._cast_desc }}Cast: {{ .Result._cast_desc }}
{{ else }}{{ end }}{{ if .Result._rating_desc }}Rating: {{ .Result._rating_desc }}
{{ else }}{{ end }}{{ if .Result._plot_desc }}Plot: {{ .Result._plot_desc }}
{{ else }}{{ end }}{{ if .Result._tag_desc }}Tags: {{ .Result._tag_desc }}
{{ else }}{{ end }}{{ if .Result._predate_desc }}PRE: {{ .Result._predate_desc }}
{{ else }}{{ end }}{{ if .Result._section_desc }}Section: {{ .Result._section_desc }}{{ else }}{{ end }}" +# json rartracker api v1 diff --git a/config/prowlarr/Definitions/swarmazon-api.yml b/config/prowlarr/Definitions/swarmazon-api.yml new file mode 100644 index 0000000..c50da23 --- /dev/null +++ b/config/prowlarr/Definitions/swarmazon-api.yml @@ -0,0 +1,116 @@ +--- +id: swarmazon-api +name: Swarmazon (API) +description: "Swarmazon is a Private Torrent Tracker for MOVIES / TV / GENERAL" +language: en-US +type: private +encoding: UTF-8 +links: + - https://swarmazon.club/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Movies"} + - {id: 2, cat: TV, desc: "Television"} + - {id: 3, cat: Other, desc: "Video Courses"} + - {id: 4, cat: Audio, desc: "Music"} + - {id: 5, cat: PC/Games, desc: "Games"} + - {id: 6, cat: PC, desc: "Software"} + - {id: 7, cat: TV/Anime, desc: "Anime"} + - {id: 8, cat: Books/EBook, desc: "E-Books"} + - {id: 9, cat: Audio/Audiobook, desc: "Audio Books"} + - {id: 10, cat: Books/Comics, desc: "Comics"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing the Token Setting page." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + +login: + path: api/search.php + method: get + inputs: + api_key: "{{ .Config.apikey }}" + limit: 1 + error: + - selector: ":root:contains(\"Invalid API key\")" + +search: + paths: + - path: api/search.php + response: + type: json + + inputs: + api_key: "{{ .Config.apikey }}" + filter: "{{ .Keywords }}" + media_ref: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}" + freeleech: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + limit: 100 + + rows: + selector: data + + fields: + category: + selector: categoryid + title: + selector: name + details: + selector: torrent + download: + selector: download + poster: + selector: media_poster + filters: + - name: replace + args: ["N\/A", ""] + genre: + selector: media_genre + description: + text: "{{ .Result.genre }}" + infohash: + selector: hash + imdbid: + selector: ref_id:contains(tt) + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: completed + date: + # 2022-11-16 22:49:25 + selector: upload_timestamp + filters: + - name: append + args: " -07:00" # PDT + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + selector: freeleech + case: + no: 1 # not free + "*": 0 # freeleech + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.1 +# json v1.22.0620 diff --git a/config/prowlarr/Definitions/tapochek.yml b/config/prowlarr/Definitions/tapochek.yml new file mode 100644 index 0000000..f9015dc --- /dev/null +++ b/config/prowlarr/Definitions/tapochek.yml @@ -0,0 +1,620 @@ +--- +id: tapochek +name: Tapochek +description: "Tapochek is a RUSSIAN Private Torrent Tracker for 0DAY / GENERAL" +language: ru-RU +type: private +encoding: windows-1251 +links: + - https://tapochek.net/ +legacylinks: + - http://tapochek.net/ + +caps: + categorymappings: + # PC Games # Игры для PC + - {id: 2, cat: PC/Games, desc: "Игры для PC (общее)"} + - {id: 14, cat: PC/Games, desc: "Альфа-, Бета- и Демо-версии"} + - {id: 314, cat: PC/Games, desc: "NoCD/ NoDVD"} + - {id: 13, cat: PC/Games, desc: "Русификаторы"} + - {id: 12, cat: PC/Games, desc: "Патчи"} + - {id: 11, cat: PC/Games, desc: "Чит-программы и трейнеры"} + - {id: 10, cat: PC/Games, desc: "Дополнения для игр"} + - {id: 9, cat: PC/Games, desc: "Игровые журналы и приложенные материалы"} + - {id: 712, cat: PC/Games, desc: "Гайды, бонусные диски и другие дополнительные материалы"} + - {id: 18, cat: PC/Games, desc: "Горячие новинки"} + - {id: 808, cat: PC/Games, desc: "Репаки от R.G. Механики"} + - {id: 809, cat: PC/Games, desc: "Горячие новинки от R.G. Механики"} + - {id: 810, cat: PC/Games, desc: "Аркады от R.G. Механики"} + - {id: 811, cat: PC/Games, desc: "Приключения и квесты от R.G. Механики"} + - {id: 812, cat: PC/Games, desc: "Стратегии от R.G. Механики"} + - {id: 813, cat: PC/Games, desc: "Симуляторы от R.G. Механики"} + - {id: 814, cat: PC/Games, desc: "Action от R.G. Механики"} + - {id: 815, cat: PC/Games, desc: "RPG от R.G. Механики"} + - {id: 903, cat: PC/Games, desc: "jRPG от R.G. Механики"} + - {id: 942, cat: PC/Games, desc: "Репаки от R.G. Catalyst"} + - {id: 943, cat: PC/Games, desc: "Горячие новинки от R.G. Catalyst"} + - {id: 949, cat: PC/Games, desc: "RPG от R.G. Catalyst"} + - {id: 948, cat: PC/Games, desc: "Action от R.G. Catalyst"} + - {id: 947, cat: PC/Games, desc: "Симуляторы от R.G. Catalyst"} + - {id: 946, cat: PC/Games, desc: "Стратегии от R.G. Catalyst"} + - {id: 945, cat: PC/Games, desc: "Приключения и квесты от R.G. Catalyst"} + - {id: 944, cat: PC/Games, desc: "Аркады от R.G. Catalyst"} + - {id: 887, cat: PC/Games, desc: "Раздачи от R.G. Игроманы"} + - {id: 888, cat: PC/Games, desc: "Аркады от R.G. Игроманы"} + - {id: 889, cat: PC/Games, desc: "Приключения и квесты от R.G. Игроманы"} + - {id: 890, cat: PC/Games, desc: "Стратегии от R.G. Игроманы"} + - {id: 891, cat: PC/Games, desc: "Симуляторы от R.G. Игроманы"} + - {id: 892, cat: PC/Games, desc: "Action от R.G. Игроманы"} + - {id: 893, cat: PC/Games, desc: "RPG от R.G. Игроманы"} + - {id: 913, cat: PC/Games, desc: "Раздачи от R.G. GOGFAN"} + - {id: 935, cat: PC/Games, desc: "Ранний доступ от R.G. GOGFAN"} + - {id: 914, cat: PC/Games, desc: "Аркады от R.G. GOGFAN"} + - {id: 915, cat: PC/Games, desc: "Приключения и квесты от R.G. GOGFAN"} + - {id: 931, cat: PC/Games, desc: "Стратегии от R.G. GOGFAN"} + - {id: 930, cat: PC/Games, desc: "Симуляторы от R.G. GOGFAN"} + - {id: 929, cat: PC/Games, desc: "Action от R.G. GOGFAN"} + - {id: 928, cat: PC/Games, desc: "RPG от R.G. GOGFAN"} + - {id: 953, cat: PC/Games, desc: "Раздачи от R.G. Origins"} + - {id: 959, cat: PC/Games, desc: "RPG от R.G. Origins"} + - {id: 958, cat: PC/Games, desc: "Симуляторы от R.G. Origins"} + - {id: 957, cat: PC/Games, desc: "Стратегии от R.G. Origins"} + - {id: 956, cat: PC/Games, desc: "Приключения и квесты от R.G. Origins"} + - {id: 955, cat: PC/Games, desc: "Action от R.G. Origins"} + - {id: 954, cat: PC/Games, desc: "Аркады от R.G. Origins"} + - {id: 24, cat: PC/Games, desc: "Приключения и квесты"} + - {id: 25, cat: PC/Games, desc: "Стратегии"} + - {id: 28, cat: PC/Games, desc: "RTS (стратегии в реальном времени)"} + - {id: 27, cat: PC/Games, desc: "TBS (пошаговые стратегии)"} + - {id: 26, cat: PC/Games, desc: "Wargame"} + - {id: 238, cat: PC/Games, desc: "Экономические стратегии"} + - {id: 19, cat: PC/Games, desc: "Аркады"} + - {id: 23, cat: PC/Games, desc: "Аркады (разное)"} + - {id: 22, cat: PC/Games, desc: "Логические аркады"} + - {id: 21, cat: PC/Games, desc: "Настольные и карточные аркады"} + - {id: 20, cat: PC/Games, desc: "Мини/флеш-игры"} + - {id: 29, cat: PC/Games, desc: "Симуляторы"} + - {id: 31, cat: PC/Games, desc: "Авиасимуляторы"} + - {id: 34, cat: PC/Games, desc: "Спортивные симуляторы"} + - {id: 33, cat: PC/Games, desc: "Космические симуляторы"} + - {id: 32, cat: PC/Games, desc: "Гоночные симуляторы"} + - {id: 30, cat: PC/Games, desc: "Другие симуляторы"} + - {id: 35, cat: PC/Games, desc: "Action"} + - {id: 39, cat: PC/Games, desc: "FPS (1st Person)"} + - {id: 38, cat: PC/Games, desc: "TPS (3rd Person)"} + - {id: 37, cat: PC/Games, desc: "Stealth Action"} + - {id: 36, cat: PC/Games, desc: "Тактические шутеры"} + - {id: 40, cat: PC/Games, desc: "RPG"} + - {id: 41, cat: PC/Games, desc: "Эротические игры"} + - {id: 43, cat: PC/Games, desc: "Эротические"} + - {id: 42, cat: PC/Games, desc: "Хентайные"} + - {id: 968, cat: PC/Games, desc: "Игры для VR"} + - {id: 44, cat: PC/Games, desc: "Многопользовательские игры"} + - {id: 45, cat: PC/Games, desc: "MMORPG"} + - {id: 46, cat: PC/Games, desc: "Для самых маленьких"} + # Games for Consoles # Игры для Консолей + - {id: 69, cat: Console/XBox, desc: "Xbox"} + - {id: 86, cat: Console/XBox 360, desc: "XBox360 | Игры"} + - {id: 646, cat: Console/XBox 360, desc: "XBox360 | JTAG"} + - {id: 87, cat: Console/XBox 360, desc: "XBox360 | 360E"} + - {id: 89, cat: Console/XBox 360, desc: "XBox360 | Demo"} + - {id: 612, cat: Console/XBox 360, desc: "XBox360 | Live"} + - {id: 614, cat: Console/XBox 360, desc: "XBox360 | Soft"} + - {id: 88, cat: Console/XBox, desc: "XBox | Игры"} + - {id: 85, cat: Console/XBox, desc: "Прочее | Архив (XBox)"} + - {id: 70, cat: Console/PSP, desc: "PlayStation"} + - {id: 910, cat: Console/PS4, desc: "PS4 | Игры"} + - {id: 911, cat: Console/PS4, desc: "PS4 | Сцена"} + - {id: 689, cat: Console/PS3, desc: "PS3 | Игры"} + - {id: 818, cat: Console/PS3, desc: "PS3 | Сцена"} + - {id: 696, cat: Console/PSP, desc: "PSN | Игры"} + - {id: 853, cat: Console/PS3, desc: "PS3 | Emulation"} + - {id: 904, cat: Console/PS Vita, desc: "PS Vita | Игры"} + - {id: 102, cat: Console/PSP, desc: "PSP | Игры"} + - {id: 103, cat: Console/PS3, desc: "PS2 | Игры"} + - {id: 104, cat: Console/PSP, desc: "PSX | Игры"} + - {id: 435, cat: Console/PSP, desc: "PSP | Сцена"} + - {id: 105, cat: Console/PSP, desc: "PSP | PSX-PSP"} + - {id: 690, cat: Console/PS3, desc: "PS3 | Прочее"} + - {id: 178, cat: Console/PSP, desc: "PSP | Прочее"} + - {id: 101, cat: Console/PSP, desc: "Архив (PS)"} + - {id: 78, cat: Console/NDS, desc: "Nintendo"} + - {id: 148, cat: Console/NDS, desc: "Архив (Nintendo)"} + - {id: 116, cat: Console/NDS, desc: "NDS | Игры"} + - {id: 885, cat: Console/3DS, desc: "3DS | Игры"} + - {id: 912, cat: Console, desc: "Switch | Игры"} + - {id: 115, cat: Console/Wii, desc: "Wii | Игры"} + - {id: 899, cat: Console/WiiU, desc: "Wii U | Игры"} + - {id: 900, cat: Console/WiiU, desc: "Wii U | Сцена"} + - {id: 381, cat: Console/Wiiware, desc: "WiiWare | Игры"} + - {id: 382, cat: Console, desc: "GameCube | Игры"} + - {id: 349, cat: Console, desc: "Sega"} + - {id: 350, cat: Console, desc: "Dreamcast | Игры"} + - {id: 351, cat: Console, desc: "Saturn | Игры"} + - {id: 352, cat: Console, desc: "Игры для старых консолей"} + - {id: 390, cat: Console, desc: "Коллекции (игры для разных платформ)"} + # Games for macOS and Linux # Игры для macOS и Linux + - {id: 936, cat: PC/Games, desc: "Горячие новинки игр для macOS и Linux"} + - {id: 129, cat: PC/Games, desc: "Игры для Linux от R.G. GOGFAN"} + - {id: 965, cat: PC/Games, desc: "[Linux] Ранний доступ от R.G. GOGFAN"} + - {id: 874, cat: PC/Games, desc: "[Linux] Аркады от R.G. GOGFAN"} + - {id: 695, cat: PC/Games, desc: "[Linux] Приключения и квесты от R.G. GOGFAN"} + - {id: 873, cat: PC/Games, desc: "[Linux] Стратегии от R.G. GOGFAN"} + - {id: 872, cat: PC/Games, desc: "[Linux] Симуляторы от R.G. GOGFAN"} + - {id: 871, cat: PC/Games, desc: "[Linux] Action от R.G. GOGFAN"} + - {id: 932, cat: PC/Games, desc: "[Linux] RPG от R.G. GOGFAN"} + - {id: 861, cat: PC/Games, desc: "Игры для macOS от R.G. GOGFAN"} + - {id: 966, cat: PC/Games, desc: "[macOS] Ранний доступ от R.G. GOGFAN"} + - {id: 862, cat: PC/Games, desc: "[macOS] Аркады от R.G. GOGFAN"} + - {id: 875, cat: PC/Games, desc: "[macOS] Приключения и квесты от R.G. GOGFAN"} + - {id: 876, cat: PC/Games, desc: "[macOS] Стратегии от R.G. GOGFAN"} + - {id: 877, cat: PC/Games, desc: "[macOS] Симуляторы от R.G. GOGFAN"} + - {id: 878, cat: PC/Games, desc: "[macOS] Action от R.G. GOGFAN"} + - {id: 933, cat: PC/Games, desc: "[macOS] RPG от R.G. GOGFAN"} + # Cinema # Кинематограф + - {id: 429, cat: Movies, desc: "Новинки кинематографа"} + - {id: 886, cat: Movies/3D, desc: "Новинки (3D)"} + - {id: 964, cat: Movies/UHD, desc: "Новинки (UHD 4K)"} + - {id: 934, cat: Movies/BluRay, desc: "Новинки 2018-2019 (Blu-Ray и BDRemux)"} + - {id: 431, cat: Movies/WEB-DL, desc: "Новинки 2018-2019 (Web-DL, HD Rips)"} + - {id: 430, cat: Movies, desc: "Новинки 2018-2019 (Rips)"} + - {id: 703, cat: Movies, desc: "Экранки и Low-рипы (CAMRip, TS, WEBRip)"} + - {id: 909, cat: Movies/HD, desc: "Новинки 2018-2019 (HD и HD Rips) с рекламой"} + - {id: 908, cat: Movies, desc: "Экранки и Low-рипы с рекламой"} + - {id: 74, cat: Movies/Foreign, desc: "Зарубежное кино"} + - {id: 963, cat: Movies/UHD, desc: "Зарубежное кино | UHD 4K"} + - {id: 121, cat: Movies/BluRay, desc: "Зарубежное кино | Blu-Ray и BDRemux"} + - {id: 122, cat: Movies/HD, desc: "Зарубежное кино | HD Rips"} + - {id: 123, cat: Movies/DVD, desc: "Зарубежное кино | DVD"} + - {id: 124, cat: Movies/Foreign, desc: "Зарубежное кино | Rips"} + - {id: 75, cat: Movies, desc: "Отечественное кино"} + - {id: 127, cat: Movies/BluRay, desc: "Отечественное кино | Blu-Ray и BDRemux"} + - {id: 128, cat: Movies/HD, desc: "Отечественное кино | HD Rips"} + - {id: 130, cat: Movies/DVD, desc: "Российское кино | DVD"} + - {id: 131, cat: Movies, desc: "Российское кино | Rips"} + - {id: 133, cat: Movies/DVD, desc: "Советское кино | DVD"} + - {id: 135, cat: Movies, desc: "Советское кино | Rips"} + - {id: 869, cat: Movies/3D, desc: "3D"} + - {id: 161, cat: TV/Foreign, desc: "Зарубежные сериалы"} + - {id: 160, cat: TV, desc: "Отечественные cериалы"} + - {id: 320, cat: TV, desc: "Мультфильмы"} + - {id: 325, cat: TV/SD, desc: "Мультфильмы | DVD"} + - {id: 938, cat: TV/HD, desc: "Мультфильмы | Blu-Ray и BDRemux"} + - {id: 324, cat: TV/HD, desc: "Мультфильмы | HD Rips"} + - {id: 326, cat: TV, desc: "Отечественные мультфильмы | Rips"} + - {id: 328, cat: TV, desc: "Зарубежные мультфильмы | Rips"} + - {id: 330, cat: TV, desc: "Сборники мультфильмов"} + - {id: 321, cat: TV, desc: "Мультсериалы"} + - {id: 162, cat: TV/Documentary, desc: "Документальные фильмы и телепередачи"} + - {id: 392, cat: TV, desc: "Развлекательные телепередачи и шоу"} + # Anime # Аниме + - {id: 693, cat: TV/Anime, desc: "Аниме (Основной)"} + - {id: 684, cat: TV/Anime, desc: "Аниме (DVD)"} + - {id: 677, cat: TV/Anime, desc: "Аниме DVD [Бутлег]"} + - {id: 96, cat: TV/Anime, desc: "Аниме DVD [Лицензии]"} + - {id: 678, cat: TV/Anime, desc: "Аниме (HD и Blu-ray)"} + - {id: 660, cat: TV/Anime, desc: "Аниме Blu-ray и Remux"} + - {id: 95, cat: TV/Anime, desc: "Аниме HD Rips"} + - {id: 106, cat: TV/Anime, desc: "Аниме Манга и прочий арт"} + - {id: 109, cat: TV/Anime, desc: "Аниме Манга"} + - {id: 107, cat: TV/Anime, desc: "Аниме Обои, артбуки и др."} + - {id: 685, cat: TV/Anime, desc: "Аниме Азиатские мультфильмы"} + - {id: 687, cat: TV/Anime, desc: "Аниме DVD"} + - {id: 686, cat: TV/Anime, desc: "Аниме Rips"} + - {id: 688, cat: TV/Anime, desc: "Аниме HD Rips"} + - {id: 680, cat: TV/Anime, desc: "Аниме (Хентай)"} + - {id: 681, cat: TV/Anime, desc: "Аниме Censored"} + - {id: 682, cat: TV/Anime, desc: "Аниме UnCensored"} + - {id: 683, cat: TV/Anime, desc: "Аниме PtCensored"} + - {id: 697, cat: TV/Anime, desc: "Аниме Манга, обои, артбуки и др."} + # Music and Music Video # Музыка и Музыкальное видео + - {id: 451, cat: Audio/Lossless, desc: "Классическая музыка (lossless)"} + - {id: 452, cat: Audio/Lossless, desc: "Классическая музыка в современной обработке (lossless)"} + - {id: 453, cat: Audio/MP3, desc: "Классическая музыка (mp3)"} + - {id: 454, cat: Audio/MP3, desc: "Классическая музыка в современной обработке (mp3)"} + - {id: 455, cat: Audio/Video, desc: "Классическая музыка (video)"} + - {id: 457, cat: Audio/Lossless, desc: "Зарубежный Jazz, Blues (lossless)"} + - {id: 458, cat: Audio/Lossless, desc: "Отечественный Jazz, Blues (lossless)"} + - {id: 459, cat: Audio/MP3, desc: "Зарубежный Jazz, Blues (mp3)"} + - {id: 460, cat: Audio/MP3, desc: "Отечественный Jazz, Blues (mp3)"} + - {id: 461, cat: Audio/Video, desc: "Jazz, Blues (video)"} + - {id: 463, cat: Audio/Lossless, desc: "Зарубежный Reggae, Ska, Dub (lossless)"} + - {id: 464, cat: Audio/Lossless, desc: "Отечественный Reggae, Ska, Dub (lossless)"} + - {id: 465, cat: Audio/MP3, desc: "Зарубежный Reggae, Ska, Dub (mp3)"} + - {id: 466, cat: Audio/MP3, desc: "Отечественный Reggae, Ska, Dub (mp3)"} + - {id: 467, cat: Audio/Video, desc: "Reggae, Ska, Dub (video)"} + - {id: 469, cat: Audio/Lossless, desc: "Rосk (losslеss)"} + - {id: 470, cat: Audio/Lossless, desc: "Mеtаl (losslеss)"} + - {id: 471, cat: Audio/Lossless, desc: "Аltеrnаtivе, Рunk, Indереndеnt (lоsslеss)"} + - {id: 472, cat: Audio/MP3, desc: "Rосk (mр3)"} + - {id: 473, cat: Audio/MP3, desc: "Mеtаl (mр3)"} + - {id: 474, cat: Audio/MP3, desc: "Аltеrnаtivе, Рunk, Indереndеnt (mр3)"} + - {id: 475, cat: Audio/Video, desc: "Зарубежный Rock (video)"} + - {id: 477, cat: Audio/Lossless, desc: "Rосk, Punk, Alternative (losslеss)"} + - {id: 478, cat: Audio, desc: "Mеtаl (losslеss)"} + - {id: 479, cat: Audio/MP3, desc: "Rосk, Punk, Alternative (mр3)"} + - {id: 480, cat: Audio/MP3, desc: "Mеtаl (mр3)"} + - {id: 481, cat: Audio/Video, desc: "Отечественный Rock (video)"} + - {id: 483, cat: Audio/Lossless, desc: "Зарубежная Поп-музыка (lossless)"} + - {id: 484, cat: Audio/Lossless, desc: "Отечественная Поп-музыка (lossless)"} + - {id: 485, cat: Audio/Lossless, desc: "Eurodance, Technopop, Disco (lossless)"} + - {id: 486, cat: Audio/MP3, desc: "Зарубежная Поп-музыка (mp3)"} + - {id: 487, cat: Audio/MP3, desc: "Отечественная Поп-музыка (mp3)"} + - {id: 488, cat: Audio/MP3, desc: "Eurodance, Technopop, Disco (mp3)"} + - {id: 489, cat: Audio/MP3, desc: "Поп-музыка, Eurodance, Disco (официальные сборники) (mp3)"} + - {id: 490, cat: Audio/Video, desc: "Поп-музыка, Eurodance, Disco (video)"} + - {id: 492, cat: Audio/Lossless, desc: "Фольклор, Народная и Этническая музыка (lossless)"} + - {id: 493, cat: Audio/MP3, desc: "Фольклор, Народная и Этническая музыка (mp3)"} + - {id: 494, cat: Audio/Video, desc: "Фольклор, Народная и Этническая музыка (video)"} + - {id: 496, cat: Audio/Lossless, desc: "NewAge, Meditative (lossless)"} + - {id: 497, cat: Audio/Lossless, desc: "Flamenco, Акустическая гитара (lossless)"} + - {id: 498, cat: Audio/MP3, desc: "NewAge, Meditative (mp3)"} + - {id: 499, cat: Audio/MP3, desc: "Flamenco, Акустическая гитара (mp3)"} + - {id: 500, cat: Audio/Video, desc: "New Age, Relax, Meditative & Flamenco (video)"} + - {id: 501, cat: Audio, desc: "Звуки природы"} + - {id: 502, cat: Audio, desc: "Психоактивныe аудиопрограммы"} + - {id: 504, cat: Audio/Lossless, desc: "Зарубежный Rap, Hip-Hop, R'n'B (lossless)"} + - {id: 505, cat: Audio/Lossless, desc: "Отечественный Rap, Hip-Hop, R'n'B (lossless)"} + - {id: 506, cat: Audio/MP3, desc: "Зарубежный Rap, Hip-Hop, R'n'B (mp3)"} + - {id: 507, cat: Audio/MP3, desc: "Отечественный Rap, Hip-Hop, R'n'B (mp3)"} + - {id: 508, cat: Audio/Video, desc: "Rap, Hip-Hop, R'n'B (video)"} + - {id: 510, cat: Audio/Lossless, desc: "Trance, Goa Trance, Psy-Trance, PsyChill, Ambient Dub (lossl.."} + - {id: 511, cat: Audio/Lossless, desc: "House, Techno, Hardcore, Hardstyle, Jumpstyle (lossless)"} + - {id: 512, cat: Audio/Lossless, desc: "Drum & Bass, Jungle, Breakbeat, Dubstep, IDM (lossless)"} + - {id: 513, cat: Audio/Lossless, desc: "Chillout, Lounge, Downtempo, Trip-Hop (lossless)"} + - {id: 514, cat: Audio/Lossless, desc: "Traditional Electronic, Ambient, Experimental (lossless)"} + - {id: 515, cat: Audio, desc: "Industrial, Noise, EBM, Dark Electro, Aggrotech, Synthpop, N.."} + - {id: 516, cat: Audio/MP3, desc: "Trance, Goa Trance, Psy-Trance, PsyChill, Ambient Dub (mp3)"} + - {id: 517, cat: Audio/MP3, desc: "House, Techno, Hardcore, Hardstyle, Jumpstyle (mp3)"} + - {id: 518, cat: Audio/MP3, desc: "Drum & Bass, Jungle, Breakbeat, Dubstep, IDM (mp3)"} + - {id: 519, cat: Audio/MP3, desc: "Chillout, Lounge, Downtempo, Trip-Hop (mp3)"} + - {id: 520, cat: Audio/MP3, desc: "Traditional Electronic, Ambient, Experimental (mp3)"} + - {id: 521, cat: Audio, desc: "Industrial, Noise, EBM, Dark Electro, Aggrotech, Synthpop, N.."} + - {id: 522, cat: Audio/Video, desc: "Электронная музыка (video)"} + - {id: 524, cat: Audio/Lossless, desc: "Зарубежный шансон (lossless)"} + - {id: 525, cat: Audio/Lossless, desc: "Отечественный шансон (lossless)"} + - {id: 526, cat: Audio/Lossless, desc: "Авторская песня (lossless)"} + - {id: 527, cat: Audio/Lossless, desc: "Военная песня (lossless)"} + - {id: 528, cat: Audio/MP3, desc: "Зарубежный шансон (mp3)"} + - {id: 529, cat: Audio/MP3, desc: "Отечественный шансон (mp3)"} + - {id: 530, cat: Audio, desc: "Отечественный шансон (официальные сборники) (mp3)"} + - {id: 531, cat: Audio/MP3, desc: "Авторская песня (mp3)"} + - {id: 532, cat: Audio/MP3, desc: "Военная песня (mp3)"} + - {id: 533, cat: Audio/Video, desc: "Шансон, Авторская и Военная песня (video)"} + - {id: 402, cat: Audio/Lossless, desc: "Саундтреки к фильмам и мультфильмам (lossless)"} + - {id: 403, cat: Audio/Lossless, desc: "Саундтреки к аниме (lossless)"} + - {id: 399, cat: Audio/Lossless, desc: "Саундтреки к играм (lossless)"} + - {id: 401, cat: Audio/MP3, desc: "Саундтреки к фильмам и мультфильмам (mp3)"} + - {id: 404, cat: Audio/MP3, desc: "Саундтреки к аниме (mp3)"} + - {id: 400, cat: Audio/MP3, desc: "Саундтреки к играм (mp3)"} + - {id: 535, cat: Audio/Lossless, desc: "Зарубежная музыка других жанров (lossless)"} + - {id: 536, cat: Audio/Lossless, desc: "Отечественная музыка других жанров (lossless)"} + - {id: 537, cat: Audio/MP3, desc: "Зарубежная музыка других жанров (mp3)"} + - {id: 538, cat: Audio/MP3, desc: "Отечественная музыка других жанров (mp3)"} + - {id: 539, cat: Audio/Video, desc: "Музыка других жанров (video)"} + - {id: 540, cat: Audio, desc: "Караоке и минусовки (фонограммы)"} + - {id: 541, cat: Audio, desc: "Сборники песен для детей"} + - {id: 542, cat: Audio, desc: "Неофициальные и внежанровые сборники"} + - {id: 543, cat: Audio, desc: "Неофициальные кинематографические видео"} + - {id: 545, cat: Audio, desc: "Многоканальная музыка"} + - {id: 546, cat: Audio, desc: "Собственные оцифровки"} + - {id: 547, cat: Audio, desc: "Hi-Res stereo"} + # Software # Программное обеспечение + - {id: 202, cat: PC/Mac, desc: "Mac OS (для Apple Macintosh)"} + - {id: 203, cat: PC/Mac, desc: "Mac OS (для РС-Hackintosh)"} + - {id: 208, cat: PC/Mac, desc: "[macOS] Архиваторы и файловые менеджеры"} + - {id: 204, cat: PC/Mac, desc: "[macOS] Проигрыватели и кодеки"} + - {id: 205, cat: PC/Mac, desc: "[macOS] Офисные приложения и редакторы"} + - {id: 206, cat: PC/Mac, desc: "[macOS] Работа с носителями и медиа"} + - {id: 939, cat: PC/Mac, desc: "[macOS] Информационная безопасность"} + - {id: 940, cat: PC/Mac, desc: "[macOS] Интернет-приложения"} + - {id: 207, cat: PC/Mac, desc: "Системные программы для Mac OS"} + - {id: 215, cat: PC, desc: "Операционные системы (Unix и Unix-подобные)"} + - {id: 216, cat: PC, desc: "Программное обеспечение для Unix и Unix-подобных OS"} + - {id: 217, cat: PC, desc: "Другие OS и программное обеспечение под них"} + - {id: 227, cat: PC, desc: "Настольные OS, выпущенные до 2001 года (Microsoft Windows OS.."} + - {id: 228, cat: PC, desc: "Windows XP"} + - {id: 229, cat: PC, desc: "Windows Vista"} + - {id: 230, cat: PC, desc: "Windows 7"} + - {id: 879, cat: PC, desc: "Windows 8"} + - {id: 905, cat: PC, desc: "Windows 10"} + - {id: 969, cat: PC, desc: "Windows 11"} + - {id: 698, cat: PC, desc: "Сборки (Microsoft Windows XP)"} + - {id: 701, cat: PC, desc: "Сборки (Microsoft Windows 7)"} + - {id: 880, cat: PC, desc: "Сборки (Microsoft Windows 8)"} + - {id: 906, cat: PC, desc: "Сборки (Microsoft Windows 10)"} + - {id: 970, cat: PC, desc: "Сборки (Microsoft Windows 11)"} + - {id: 231, cat: PC, desc: "Серверные (Microsoft Windows OS)"} + - {id: 232, cat: PC, desc: "Разное (Microsoft Windows OS)"} + - {id: 236, cat: PC, desc: "Работа с жёстким диском"} + - {id: 237, cat: PC, desc: "Резервное копирование"} + - {id: 240, cat: PC, desc: "Архиваторы и файловые менеджеры"} + - {id: 239, cat: PC, desc: "Программы для настройки и оптимизации ОС"} + - {id: 241, cat: PC, desc: "Сервисное обслуживание компьютера"} + - {id: 242, cat: PC, desc: "Работа с носителями информации"} + - {id: 243, cat: PC, desc: "Информация и диагностика"} + - {id: 244, cat: PC, desc: "Программы для интернет и сетей"} + - {id: 245, cat: PC, desc: "Антивирусы и Файерволы"} + - {id: 246, cat: PC, desc: "Программы для защиты информации"} + - {id: 247, cat: PC, desc: "Драйвера"} + - {id: 248, cat: PC, desc: "Серверное ПО для Windows"} + - {id: 249, cat: PC, desc: "Изменение интерфейса ОС Windows"} + - {id: 250, cat: PC, desc: "Скринсейверы"} + - {id: 251, cat: PC, desc: "Разное (Системные программы под Windows)"} + - {id: 409, cat: PC, desc: "Системы автоматизации проектных работ (САПР)"} + - {id: 607, cat: PC, desc: "Программы для архитекторов и дизайнеров интерьеров"} + - {id: 593, cat: PC, desc: "Офисные программы и системы"} + - {id: 595, cat: PC, desc: "Системы для научной работы"} + - {id: 594, cat: PC, desc: "Системы для бизнеса"} + - {id: 257, cat: PC, desc: "Каталогизаторы и просмотрщики графики"} + - {id: 258, cat: PC, desc: "Аудио- и видео-, CD- проигрыватели и каталогизаторы"} + - {id: 259, cat: PC, desc: "Программы для интернет и сетей"} + - {id: 260, cat: PC, desc: "Распознавание текста, звука и синтез речи"} + - {id: 261, cat: PC, desc: "Словари и переводчики"} + - {id: 262, cat: PC, desc: "Программное обеспечение для автолюбителей"} + - {id: 263, cat: PC, desc: "Медицинское программное обеспечение"} + - {id: 264, cat: PC, desc: "Справочные системы и карты"} + - {id: 265, cat: PC, desc: "Разное (Пользовательские программы)"} + - {id: 268, cat: PC, desc: "WYSIWYG Редакторы для веб-диза"} + - {id: 269, cat: PC, desc: "Текстовые редакторы с подсветкой"} + - {id: 270, cat: PC, desc: "Среды программирования, компиляторы и вспомогательные програ.."} + - {id: 271, cat: PC, desc: "Компоненты для сред программирования"} + - {id: 272, cat: PC, desc: "Системы управления базами данных (СУБД)"} + - {id: 273, cat: PC, desc: "Скрипты и шаблоны"} + - {id: 274, cat: PC, desc: "Разное (Веб-разработка и программирование)"} + - {id: 278, cat: PC, desc: "Программные комплекты"} + - {id: 279, cat: PC, desc: "Плагины для программ компании Adobe"} + - {id: 280, cat: PC, desc: "Графические редакторы"} + - {id: 281, cat: PC, desc: "Программы для верстки, печати и работы со шрифтами"} + - {id: 282, cat: PC, desc: "3D моделирование, рендеринг и плагины для них"} + - {id: 283, cat: PC, desc: "Анимация"} + - {id: 284, cat: PC, desc: "Создание DVD и BD дисков"} + - {id: 285, cat: PC, desc: "Редакторы видео"} + - {id: 286, cat: PC, desc: "Видео- Аудио- конверторы"} + - {id: 287, cat: PC, desc: "Работа со звуком"} + - {id: 290, cat: PC, desc: "Разное (Программы для работы с мультимедиа и 3D)"} + - {id: 293, cat: PC, desc: "Растровые и Векторные Клипарты"} + - {id: 294, cat: PC, desc: "Заготовки, виньетки, рамки"} + - {id: 295, cat: PC, desc: "Стили, кисти, формы и узоры для Adobe Photoshop"} + - {id: 296, cat: PC, desc: "Текстуры и материалы"} + - {id: 297, cat: PC, desc: "3D графика"} + - {id: 298, cat: PC, desc: "Футажи"} + - {id: 299, cat: PC, desc: "Звуковые эффекты"} + - {id: 300, cat: PC, desc: "Библиотеки сэмплов"} + - {id: 301, cat: PC, desc: "Шрифты"} + - {id: 302, cat: PC, desc: "Photostoсks"} + - {id: 303, cat: PC, desc: "Разное (Материалы для мультимедиа и дизайна)"} + - {id: 597, cat: PC, desc: "Справочно-правовые Системы"} + - {id: 600, cat: PC, desc: "Консультант Плюс"} + - {id: 599, cat: PC, desc: "Гарант"} + - {id: 601, cat: PC, desc: "Кодекс"} + - {id: 623, cat: PC, desc: "Мобильные телефоны"} + - {id: 624, cat: PC, desc: "КПК"} + - {id: 625, cat: PC, desc: "Навигаторы"} + - {id: 626, cat: PC, desc: "Карты для навигаторов"} + - {id: 627, cat: PC, desc: "Плееры"} + - {id: 628, cat: PC, desc: "Разное (Мобильные устройства и КПК)"} + - {id: 622, cat: PC/Mobile-iOS, desc: "Apple Mobile Device Software"} + - {id: 667, cat: PC/Mobile-iOS, desc: "Прошивки (iPhone/iPod Touch/iPad)"} + - {id: 668, cat: PC/Mobile-iOS, desc: "Программы (iPhone/iPod Touch/iPad)"} + - {id: 669, cat: PC/Mobile-iOS, desc: "Игры (iPhone/iPod Touch/iPad)"} + - {id: 670, cat: PC/Mobile-iOS, desc: "Видео (iPhone/iPod Touch/iPad)"} + - {id: 672, cat: PC/Mobile-iOS, desc: "Разное (iPhone/iPod Touch/iPad)"} + - {id: 671, cat: PC/Mobile-iOS, desc: "Музыка (iPhone/iPod Touch/iPad)"} + - {id: 639, cat: PC, desc: "Обучающие видеоматериалы"} + - {id: 640, cat: PC, desc: "Мультимедийные материалы"} + - {id: 642, cat: PC, desc: "Разное"} + # Library # Библиотека + - {id: 717, cat: Books, desc: "Аудиокниги"} + - {id: 740, cat: Books, desc: "Проект S.T.A.L.K.E.R."} + - {id: 738, cat: Books, desc: "Детектив / боевик"} + - {id: 739, cat: Books, desc: "Фантастика / фэнтези / мистика / ужасы"} + - {id: 836, cat: Books, desc: "Роман / комедийные произведения / приключения"} + - {id: 838, cat: Books, desc: "Классическая литература и современная проза"} + - {id: 837, cat: Books, desc: "Образование и Право"} + - {id: 843, cat: Books, desc: "Разное"} + - {id: 713, cat: Books, desc: "Художественная литература"} + - {id: 724, cat: Books, desc: "Детектив / боевик"} + - {id: 728, cat: Books, desc: "Фантастика / фэнтези / мистика / ужасы"} + - {id: 725, cat: Books, desc: "Роман / приключения / драма"} + - {id: 727, cat: Books, desc: "Комедийные произведения"} + - {id: 723, cat: Books, desc: "Историческая книга"} + - {id: 721, cat: Books, desc: "Классическая литература и современная проза"} + - {id: 722, cat: Books, desc: "Поэзия"} + - {id: 844, cat: Books, desc: "Разное"} + - {id: 718, cat: Books, desc: "Журналы"} + - {id: 763, cat: Books, desc: "Эротические журналы"} + - {id: 715, cat: Books, desc: "Компьютерная литература"} + - {id: 839, cat: Books, desc: "Научная и тех.литература"} + - {id: 719, cat: Books, desc: "Образование, Право и Психология"} + - {id: 846, cat: Books, desc: "Сексология"} + - {id: 840, cat: Books, desc: "Военное дело"} + - {id: 842, cat: Books, desc: "Спорт и физическое воспитание"} + - {id: 841, cat: Books, desc: "Хобби"} + - {id: 716, cat: Books, desc: "Дом и семейный очаг"} + - {id: 714, cat: Books, desc: "Книги для малышей и их родителей"} + - {id: 845, cat: Books, desc: "Комиксы"} + - {id: 741, cat: Books, desc: "Разное"} + # Technical assistance # Техническая помощь + - {id: 578, cat: Other, desc: "µTorrent и BitTorrent 4.x, 5.x, 6.x"} + # Release - groups # Релиз - группы + - {id: 378, cat: Other, desc: "Анонсы"} + # Miscellanea # Разное + - {id: 644, cat: Other, desc: "Разное"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: info_ymd + type: info + label: About the date + default: Before using this indexer please check on the Tapochek website that your account profile Y-m-d setting is Y-m-d H:i. If it is anything else then this indexer will generate a parse error and not return results. + - name: stripcyrillic + type: checkbox + label: Strip Cyrillic Letters + default: false + - name: addrussiantotitle + type: checkbox + label: Add RUS to end of all titles to improve language detection by Sonarr and Radarr. Will cause English-only results to be misidentified. + default: false + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 1 + options: + 1: created + 10: seeders + 7: size + 2: title + - name: type + type: select + label: Order requested from site + default: 2 + options: + 2: desc + 1: asc + +login: + path: login.php + method: form + form: form[action$="/login.php"] + inputs: + login_username: "{{ .Config.username }}" + login_password: "{{ .Config.password }}" + autologin: 1 + redirect: index.php + error: + - selector: h4:contains("Вы ввели") + test: + path: index.php + selector: a[href="./login.php?logout=1"] + +search: + paths: + # https://tapochek.net/tracker.php?f=-1&gold=1&silver=1&o=1&s=2&tm=-1&sns=-1#results + - path: tracker.php + inputs: + $raw: "{{ if .Categories }}{{ range .Categories }}f[]={{.}}&{{end}}{{ else }}f[]=-1{{ end }}" + nm: "{{ .Keywords }}" + o: "{{ .Config.sort }}" + s: "{{ .Config.type }}" + tm: -1 + sns: -1 + gold: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + + keywordsfilters: + - name: re_replace # S01 to сезон 1 + args: ["(?i)\\bS0*(\\d+)\\b", "сезон $1"] + - name: re_replace # E02 to сери 1 + args: ["(?i)\\bE0*(\\d+)\\b", "сери $1"] + - name: re_replace # S01E02 to сезон 1 сери 2 + args: ["(?i)\\bS0*(\\d+)E0*(\\d+)\\b", "сезон $1 сери $2"] + + rows: + selector: tr[id^="tor_"]:has(a[href^="./download.php?id="]) + + fields: + category: + selector: td a.gen + attribute: href + filters: + - name: querystring + args: f + title: + selector: a.genmed + filters: + # normalize to SXXEYY format + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)\\s*(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)", "S$1E$2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?)", "S$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+[CС]езоны?", "S$1"] + - name: re_replace + args: ["(?i)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)", "E$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "E$1"] + - name: replace + args: ["Кураж-Бамбей", "kurazh"] + - name: replace + args: ["Кубик в Кубе", "Kubik"] + - name: re_replace + args: ["(\\([\\p{IsCyrillic}\\W]+\\))|(^[\\p{IsCyrillic}\\W\\d]+\\/ )|([\\p{IsCyrillic} \\-]+,+)|([\\p{IsCyrillic}]+)", "{{ if .Config.stripcyrillic }}{{ else }}$1$2$3$4{{ end }}"] + - name: re_replace + args: ["(?i)\\bHDTV[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bSAT[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bWEB[-\\s]?DL[-\\s]?Rip\\b", "WEB-DL"] + - name: re_replace + args: ["(?i)\\bWEB\\sRip\\b", "WEBRip"] + - name: re_replace + args: ["(?i)\\bWEB\\sDL\\b", "WEB-DL"] + - name: re_replace + args: ["[\\[\\(\\{<«][\\s\\W]*[\\]\\)\\}>»]", ""] + - name: re_replace + args: ["^[\\s&,\\.!\\?\\+\\-_\\|\\/':]+", ""] + - name: append + args: "{{ if .Config.addrussiantotitle }} RUS{{ else }}{{ end }}" + details: + selector: a.genmed + attribute: href + download: + selector: a[href^="./download.php?id="] + attribute: href + size: + selector: td:nth-child(6) > u + date: + # unix + selector: td:last-child > u + seeders: + selector: td.seedmed > b + leechers: + selector: td.leechmed > b + downloadvolumefactor: + case: + img[src="images/tor_gold.gif"]: 0 + img[src="images/tor_silver.gif"]: 0.5 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 0.5 + description: + selector: a.genmed +# TorrentPier diff --git a/config/prowlarr/Definitions/tasmanit.yml b/config/prowlarr/Definitions/tasmanit.yml new file mode 100644 index 0000000..59a018f --- /dev/null +++ b/config/prowlarr/Definitions/tasmanit.yml @@ -0,0 +1,166 @@ +--- +id: tasmanit +name: Tasmanit +description: "Tasmanit.es is a AUSTRALIAN / NEW ZEALAND Private Torrent Tracker for AUS / NZ TV" +language: en-AU +type: private +encoding: UTF-8 +links: + - https://tasmanit.es/ + +caps: + categorymappings: + - {id: 72, cat: TV, desc: "Australian TV"} + - {id: 23, cat: TV, desc: "AU-AUTOGEN"} + - {id: 8, cat: TV, desc: "AU-Comedy"} + - {id: 18, cat: TV, desc: "AU-Crime"} + - {id: 14, cat: TV/Documentary, desc: "AU-Documentaries"} + - {id: 9, cat: TV, desc: "AU-Drama"} + - {id: 10, cat: TV, desc: "AU-Game/Quiz Shows"} + - {id: 12, cat: TV, desc: "AU-Kids Shows"} + - {id: 21, cat: TV, desc: "AU-Lifestyle"} + - {id: 11, cat: TV, desc: "AU-News/Current Affair"} + - {id: 76, cat: TV/Other, desc: "AU-Other"} + - {id: 82, cat: Audio, desc: "AU-Podcasts"} + - {id: 15, cat: TV, desc: "AU-Real Crime"} + - {id: 13, cat: TV, desc: "AU-Reality TV"} + - {id: 17, cat: TV, desc: "AU-Science/Medical"} + - {id: 80, cat: TV, desc: "AU-Soaps"} + - {id: 16, cat: TV, desc: "AU-Talkshows"} + - {id: 22, cat: Movies, desc: "AU-Telemovies"} + - {id: 73, cat: TV, desc: "New Zealand TV"} + - {id: 61, cat: TV, desc: "NZ-AUTOGEN"} + - {id: 47, cat: TV, desc: "NZ-Comedy"} + - {id: 58, cat: TV, desc: "NZ-Crime"} + - {id: 53, cat: TV/Documentary, desc: "NZ-Documentaries"} + - {id: 48, cat: TV, desc: "NZ-Dramas"} + - {id: 49, cat: TV, desc: "NZ-Game/Quiz Shows"} + - {id: 51, cat: TV, desc: "NZ-Kids Shows"} + - {id: 56, cat: TV, desc: "NZ-Lifestyle"} + - {id: 50, cat: TV, desc: "NZ-News/Current Affair"} + - {id: 60, cat: TV, desc: "NZ-Real Crime"} + - {id: 52, cat: TV, desc: "NZ-Reality TV"} + - {id: 54, cat: TV, desc: "NZ-Science/Medical"} + - {id: 81, cat: TV, desc: "NZ-Soaps"} + - {id: 57, cat: TV, desc: "NZ-Talkshows"} + - {id: 59, cat: Movies, desc: "NZ-Telemovies"} + - {id: 36, cat: TV, desc: "NZ-Other"} + - {id: 55, cat: TV, desc: "South African TV"} + - {id: 7, cat: TV/Other, desc: "TV-Other"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: div#content:has(h2:contains("Login Failed")) + test: + path: index.php + selector: a[href*="logout.php"] + +search: + paths: + - path: browse.php + method: post + inputs: + do: search + keywords: "{{ .Keywords }}" + # t_name, t_description, t_both, t_uploader, t_genre + search_type: t_name + # does not support multi category searching so defaulting to all. + category: 0 + include_dead_torrents: yes + sort: "{{ if .Config.freeleech }}free{{ else }}{{ .Config.sort }}{{ end }}" + order: "{{ if .Config.freeleech }}asc{{ else }}{{ .Config.type }}{{ end }}" + # does not return imdb link in results and t_genre does not return imdbid search results + keywordsfilters: + - name: re_replace + args: ["[^a-zA-Z0-9]+", "%"] + + rows: + selector: table#sortabletable > tbody > tr:has(a[href]){{ if .Config.freeleech }}:has(img[src$=\"/freedownload.gif\"]){{ else }}{{ end }} + + fields: + title_default: + selector: td:nth-child(2) a + title: + selector: div.tooltip-content > div + optional: true + default: "{{ .Result.title_default }}" + category: + selector: a[href*="/browse.php?category="] + attribute: href + filters: + - name: querystring + args: category + details: + selector: a[href*="/details.php?id="] + attribute: href + download: + selector: a[href*="/download.php?id="] + attribute: href + poster: + selector: img[src*="/torrents/images/"] + attribute: src + size: + selector: td:nth-child(5) + grabs: + selector: td:nth-child(6) + seeders: + selector: td:nth-child(7) + leechers: + selector: td:nth-child(8) + date: + selector: td:nth-child(2) > div:last-child + # auto adjusted by site account profile + filters: + - name: dateparse + args: "dd-MM-yyyy HH:mm" + downloadvolumefactor: + case: + img[src$="/freedownload.gif"]: 0 + img[src$="/silverdownload.gif"]: 0.5 + "*": 1 + uploadvolumefactor: + case: + img[src$="/x2.gif"]: 2 + "*": 1 + minimumratio: + text: 0.5 +# TS Special Edition v.7.4 diff --git a/config/prowlarr/Definitions/teamctgame.yml b/config/prowlarr/Definitions/teamctgame.yml new file mode 100644 index 0000000..e9bc101 --- /dev/null +++ b/config/prowlarr/Definitions/teamctgame.yml @@ -0,0 +1,251 @@ +--- +id: teamctgame +name: Team CT Game +description: "Team CT Game (TCTG) is a FRENCH Private Torrent Tracker for MOVIES / TV / GENERAL" +language: fr-FR +type: private +encoding: UTF-8 +requestDelay: 2 +links: + - https://tctg.pm/ +legacylinks: + - https://teamctgame.co/ + - http://teamctgame.xyz/ + - https://teamctgame.xyz/ + - https://tctg.in/ + +caps: + categorymappings: + - {id: 409, cat: Books/Comics, desc: "BD", default: true} + - {id: 410, cat: Books/Mags, desc: "Ebooks - Presse", default: true} + - {id: 411, cat: Audio/Audiobook, desc: "Ebooks - Audiobooks", default: true} + - {id: 412, cat: Books/EBook, desc: "Ebooks - Ebooks", default: true} + - {id: 413, cat: Movies/3D, desc: "Films - 3D", default: true} + - {id: 414, cat: Movies/HD, desc: "Films - 4K", default: true} + - {id: 415, cat: Movies/UHD, desc: "Films - 4K HDR", default: true} + - {id: 416, cat: Movies/UHD, desc: "Films - 4K Light", default: true} + - {id: 417, cat: Movies/UHD, desc: "Films - 4K Remux", default: true} + - {id: 418, cat: Movies, desc: "Films - Animation", default: true} + - {id: 419, cat: Movies/BluRay, desc: "Films - BDRip / BRRip", default: true} + - {id: 420, cat: Movies/DVD, desc: "Films - DVD-R", default: true} + - {id: 421, cat: Movies/DVD, desc: "Films - DVDRip", default: true} + - {id: 422, cat: Movies/BluRay, desc: "Films - Full Bluray", default: true} + - {id: 423, cat: Movies/HD, desc: "Films - HDTV", default: true} + - {id: 424, cat: Movies/HD, desc: "Films - HD 1080p", default: true} + - {id: 425, cat: Movies/HD, desc: "Films - HD 720p", default: true} + - {id: 426, cat: Movies/HD, desc: "Films - HDLiGHT / M-HD", default: true} + - {id: 427, cat: Movies/HD, desc: "Films - HDRiP", default: true} + - {id: 428, cat: Movies, desc: "Films - Pack", default: true} + - {id: 429, cat: Movies, desc: "Films - Remux", default: true} + - {id: 430, cat: TV, desc: "Films - TVRip", default: true} + - {id: 431, cat: Movies, desc: "Films - VO", default: true} + - {id: 432, cat: Movies, desc: "Films - VOSTFR", default: true} + - {id: 433, cat: Movies/WEB-DL, desc: "Films - Web", default: true} + - {id: 434, cat: Movies/HD, desc: "Films - x265", default: true} + - {id: 436, cat: Console, desc: "Jeux - Consoles", default: true} + - {id: 437, cat: PC/Games, desc: "Jeux - PC", default: true} + - {id: 438, cat: PC/0day, desc: "Logiciels - Windows", default: true} + - {id: 439, cat: Other, desc: "Logiciels - Graph / Wallpaper", default: true} + - {id: 440, cat: TV/HD, desc: "Series - 4K HDR", default: true} + - {id: 441, cat: TV/HD, desc: "Series TV - Pack HD", default: true} + - {id: 442, cat: TV/HD, desc: "Series TV - Episode HD", default: true} + - {id: 443, cat: TV/HD, desc: "Series TV - Pack HD VOSTFR", default: true} + - {id: 444, cat: TV/HD, desc: "Series TV - Episode HD VOSTFR", default: true} + - {id: 445, cat: TV/SD, desc: "Series TV - Pack SD", default: true} + - {id: 446, cat: TV/SD, desc: "Series TV - Episode SD", default: true} + - {id: 447, cat: TV/SD, desc: "Series TV - Pack SD VOSTFR", default: true} + - {id: 448, cat: TV/SD, desc: "Series TV - Episode SD VOSTFR", default: true} + - {id: 449, cat: TV/Anime, desc: "Series - Animés", default: true} + - {id: 450, cat: TV, desc: "Spectacles - Tous", default: true} + - {id: 451, cat: TV, desc: "TV - Emissions", default: true} + - {id: 452, cat: TV/Documentary, desc: "TV - Documentaires", default: true} + - {id: 453, cat: TV/Sport, desc: "TV - Sports", default: true} + - {id: 435, cat: XXX, desc: "Films - XXX", default: false} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + - name: multilang + type: checkbox + label: Replace MULTi by another language in release name + default: false + - name: multilanguage + type: select + label: Replace MULTi by this language + default: FRENCH + options: + FRENCH: FRENCH + MULTi FRENCH: MULTi FRENCH + ENGLISH: ENGLISH + MULTi ENGLISH: MULTi ENGLISH + VOSTFR: VOSTFR + MULTi VOSTFR: MULTi VOSTFR + - name: vostfr + type: checkbox + label: Replace VOSTFR and SUBFRENCH with ENGLISH + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + logout: "" + securelogin: "" + error: + - selector: td.embedded:has(h2:contains("Erreur")) # invalid captcha + - selector: td.embedded:has(h2:contains("Échec")) # invalid uid or pwd + message: + selector: td.text + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + categories: [409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453] + - path: special.php + categories: [435] + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + inclbookmarked: 0 + # 0 title, 1 descr, 3 uploader, 4 imdburl + search_area: "{{ if .Query.IMDBID }}4{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(a[href^="download.php?id="]) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_phase1: + selector: a[href^="details.php?id="] b + title_vostfr: + text: "{{ .Result.title_phase1 }}" + filters: + - name: re_replace + args: ["(?i)\\b(vostfr|subfrench)\\b", "ENGLISH"] + title_phase2: + text: "{{ if .Config.vostfr }}{{ .Result.title_vostfr }}{{ else }}{{ .Result.title_phase1 }}{{ end }}" + title_multilang: + text: "{{ .Result.title_phase2 }}" + filters: + - name: re_replace + args: ["(?i)\\b(MULTI(?!.*(?:FRENCH|ENGLISH|VOSTFR)))\\b", "{{ .Config.multilanguage }}"] + title: + text: "{{ if .Config.multilang }}{{ .Result.title_multilang }}{{ else }}{{ .Result.title_phase2 }}{{ end }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: img[data-src] + attribute: data-src + date_elapsed: + # time type: time elapsed (default) + selector: td:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +01:00" # CET + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +01:00" # CET + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td:nth-child(5) + seeders: + selector: td:nth-child(6) + leechers: + selector: td:nth-child(7) + grabs: + selector: td:nth-child(8) + description: + case: + span[title="Autorisé"]: "Verified" + span[title="Pas examiné"]: "Unverified" + span[title="Refusé"]: "Banned" + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumratio: + text: 1.0 +# NexusPHP v1.7.30 2022-11-05 diff --git a/config/prowlarr/Definitions/teamhd.yml b/config/prowlarr/Definitions/teamhd.yml new file mode 100644 index 0000000..847b2df --- /dev/null +++ b/config/prowlarr/Definitions/teamhd.yml @@ -0,0 +1,151 @@ +--- +id: teamhd +name: TeamHD +description: "TeamHD is a RUSSIAN Private Torrent Tracker for HD MOVIES / TV" +language: ru-RU +type: private +encoding: UTF-8 +links: + - https://teamhd.org/ + +caps: + categorymappings: + - {id: 29, cat: Movies/HD, desc: "Movies Фильмы"} + - {id: 25, cat: TV/Anime, desc: "Cartoons Мультфильмы"} + - {id: 26, cat: Audio/Lossless, desc: "Hi-Res Audio"} + - {id: 27, cat: Other, desc: "Demo Демо"} + - {id: 28, cat: TV/Documentary, desc: "Documentary Документальное кино"} + - {id: 30, cat: Audio/Video, desc: "Music Video Музыкальное видео"} + - {id: 31, cat: TV/Sport, desc: "Sport Спорт"} + - {id: 32, cat: TV/HD, desc: "TV Show ТВ Шоу"} + - {id: 33, cat: TV/HD, desc: "Soaps Сериалы"} + - {id: 34, cat: TV/HD, desc: "Other"} + - {id: 35, cat: Movies, desc: "Content w/o subs Контент без перевода"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: useragent + type: text + label: User-Agent + - name: info_useragent + type: info + label: How to get the User-Agent + default: "
  1. From the same place you fetched the cookie,
  2. Find 'user-agent:' in the Request Headers section
  3. Select and Copy the whole user-agent string (everything after 'user-agent: ') and Paste here.
" + - name: stripcyrillic + type: checkbox + label: Strip Cyrillic Letters + default: false + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: index.php + selector: a[href*="/logout.php"] + +search: + paths: + - path: browse + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + # replace spaces with wildcard (percent symbol) as site's default search is exact string. + search: "{{ re_replace .Keywords \"[\\s]+\" \"%\" }}" + # 0 active, 1 incldead, 2 onlydead, 3 noseeders + incldead: 1 + # 0 all, 1 gold, 2 silver, 3 normal + free: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + + headers: + User-Agent: ["{{ .Config.useragent }}"] + + keywordsfilters: + # remove the year from the titles as the site chokes on them during search https://github.com/Jackett/Jackett/issues/4397#issuecomment-623148789 + - name: re_replace + args: [" +(?:19|20)\\d{2} *$", ""] + # if season only then S01 -> Season 1 + - name: re_replace + args: ["(?i) S0(\\d{1})$", " Season $1"] + # if season only then S10 -> Season 10 + - name: re_replace + args: ["(?i) S(\\d{2})$", " Season $1"] + + rows: + selector: table.browse > tbody > tr + + fields: + download: + selector: a[href^="download.php?id="] + attribute: href + title: + selector: a[href^="/details/id"] + filters: + - name: re_replace + args: ["(\\([\\p{IsCyrillic}\\W]+\\))|(^[\\p{IsCyrillic}\\W\\d]+\\/ )|([\\p{IsCyrillic} \\-]+,+)|([\\p{IsCyrillic}]+)", "{{ if .Config.stripcyrillic }}{{ else }}$1$2$3$4{{ end }}"] + # convert Season xx -> Sxx + - name: re_replace + args: ["(?i)Season (\\d{2})", "S$1"] + # convert Season x -> S0x + - name: re_replace + args: ["(?i)Season (\\d{1})", "S0$1"] + # remove [] + - name: re_replace + args: ["[\\[|\\]]", ""] + details: + selector: a[href^="/details/id"] + attribute: href + category: + selector: a[href*="/browse/cat"] + attribute: href + filters: + - name: regexp + args: (\d+) + date: + selector: td > div > small + # auto adjusted by site account profile + filters: + - name: dateparse + args: "dd-MM-yyyy HH:mm" + seeders: + selector: td:nth-child(4) + filters: + - name: split + args: ["|", 0] + leechers: + selector: td:nth-child(4) + filters: + - name: split + args: ["|", 1] + grabs: + selector: td:nth-child(5) strong + size: + selector: td:nth-child(5) + remove: strong + downloadvolumefactor: + case: + a[href^="/details/id"][style="color:#f2b101"]: 0 + a[href^="/details/id"][style="color:#828b8b"]: 0.5 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 + description: + selector: a[href^="/details/id"] +# engine n/a diff --git a/config/prowlarr/Definitions/teamos.yml b/config/prowlarr/Definitions/teamos.yml new file mode 100644 index 0000000..e07cb44 --- /dev/null +++ b/config/prowlarr/Definitions/teamos.yml @@ -0,0 +1,191 @@ +--- +id: teamos +name: TeamOS +description: "Team OS is a Private Torrent Tracker for SOFTWARE" +language: en-US +type: private +encoding: UTF-8 +requestDelay: 2 +links: + - https://www.teamos.xyz/ +legacylinks: + - https://www.teamos-hkrg.com/ + - https://teamos-hkrg.com/ + - https://teamos.xyz/ + +caps: + categorymappings: + - {id: 18, cat: PC, desc: "Team-OS VIP Releases"} + - {id: 23, cat: PC, desc: "Team OS Program"} + - {id: 19, cat: PC, desc: "Windows 7 Releases"} + - {id: 20, cat: PC, desc: "Windows 7 Releases 32 Bit"} + - {id: 21, cat: PC, desc: "Windows 7 Releases 64 Bit"} + - {id: 22, cat: PC, desc: "Windows 7 Releases x86-x64 AIO"} + - {id: 24, cat: PC, desc: "Windows 8.1 Release"} + - {id: 25, cat: PC, desc: "Windows 8.1 Release 32 Bit"} + - {id: 26, cat: PC, desc: "Windows 8.1 Release 64 Bit"} + - {id: 27, cat: PC, desc: "Windows 8.1 Release x86-x64 AIO"} + - {id: 107, cat: PC, desc: "Windows 10 Releases"} + - {id: 109, cat: PC, desc: "Windows 10 Releases 64 Bit"} + - {id: 110, cat: PC, desc: "Windows 10 Releases x86-x64 AIO"} + - {id: 28, cat: PC, desc: "Operating Systems"} + - {id: 29, cat: PC, desc: "Windows XP"} + - {id: 30, cat: PC, desc: "Windows XP 32 Bit"} + - {id: 31, cat: PC, desc: "Windows XP 64 Bit"} + - {id: 32, cat: PC, desc: "Windows XP x86/64+AIO"} + - {id: 33, cat: PC, desc: "Windows 7"} + - {id: 34, cat: PC, desc: "Windows 7 32 Bit"} + - {id: 35, cat: PC, desc: "Windows 7 64 Bit"} + - {id: 36, cat: PC, desc: "Windows 7 x86/64+AIO"} + - {id: 37, cat: PC, desc: "Windows 8 & 8.1"} + - {id: 38, cat: PC, desc: "Windows 8 & 8.1 32 Bit"} + - {id: 39, cat: PC, desc: "Windows 8 & 8.1 64 Bit"} + - {id: 40, cat: PC, desc: "Windows 8 & 8.1 x86/64+AIO"} + - {id: 42, cat: PC, desc: "Windows 10"} + - {id: 43, cat: PC, desc: "Windows 10 (x86)"} + - {id: 44, cat: PC, desc: "Windows 10 (x64)"} + - {id: 45, cat: PC, desc: "Windows 10 (x86 & x64)"} + - {id: 157, cat: PC, desc: "Windows 11"} + - {id: 158, cat: PC, desc: "Windows 11 (x86)"} + - {id: 159, cat: PC, desc: "Windows 11 (x64)"} + - {id: 160, cat: PC, desc: "Windows 11 (x86 & x64)"} + - {id: 140, cat: PC/Mac, desc: "MacOS"} + - {id: 41, cat: PC, desc: "Windows Servers/Old Windows OS/Others"} + - {id: 112, cat: PC, desc: "Windows Servers Ghost Images"} + - {id: 113, cat: PC, desc: "Windows Servers 32 Bit Ghost Images"} + - {id: 114, cat: PC, desc: "Windows Servers 64 Bit Ghost Images"} + - {id: 46, cat: PC/ISO, desc: "Windows Untouched ISO(MSDN)"} + - {id: 47, cat: PC, desc: "Windows 7 Untouched (MSDN)"} + - {id: 48, cat: PC, desc: "Windows 7 32 Bit Untouched (MSDN)"} + - {id: 49, cat: PC, desc: "Windows 7 64 Bit Untouched (MSDN)"} + - {id: 50, cat: PC/ISO, desc: "Windows 7 x86/64+AIO Untouched ISO"} + - {id: 51, cat: PC, desc: "Windows 8 & 8.1 Untouched (MSDN)"} + - {id: 52, cat: PC, desc: "Windows 8 & 8.1 32 Bit Untouched (MSDN)"} + - {id: 53, cat: PC, desc: "Windows 8 & 8.1 64 Bit Untouched (MSDN)"} + - {id: 54, cat: PC/ISO, desc: "Windows 8 & 8.1 x86/64+AIO Untouched ISO"} + - {id: 58, cat: PC/ISO, desc: "Microsoft Office Multi-lang Untouch ISO"} + - {id: 59, cat: PC/ISO, desc: "x86-x64 bit Untouched Iso"} + - {id: 55, cat: PC, desc: "Windows Server 2003 (Untouched)"} + - {id: 56, cat: PC, desc: "Windows Server 2003 32 Bit Untouched"} + - {id: 57, cat: PC, desc: "Windows Server 2003 64 Bit Untouched"} + - {id: 132, cat: PC, desc: "Linux/Unix"} + - {id: 60, cat: PC/0day, desc: "Software Releases"} + - {id: 71, cat: PC/0day, desc: "Activators/ Crack/ patch/ keygen"} + - {id: 75, cat: PC/0day, desc: "Adobe Plugins"} + - {id: 62, cat: PC/Mobile-Android, desc: "Android Apps"} + - {id: 141, cat: PC/Mac, desc: "Mac Apps"} + - {id: 61, cat: PC/0day, desc: "Antivirus"} + - {id: 65, cat: PC/0day, desc: "Multimedia"} + - {id: 66, cat: PC/0day, desc: "Audio Apps"} + - {id: 68, cat: PC/0day, desc: "Photo Apps"} + - {id: 111, cat: PC/0day, desc: "3D Modeling"} + - {id: 67, cat: PC/0day, desc: "Video Apps"} + - {id: 76, cat: PC/0day, desc: "Customisation"} + - {id: 69, cat: PC/0day, desc: "Document Tools"} + - {id: 63, cat: PC/0day, desc: "Download Managers"} + - {id: 77, cat: PC/0day, desc: "Drivers and Necessary Tools"} + - {id: 64, cat: PC/0day, desc: "DVD Tools"} + - {id: 73, cat: PC/0day, desc: "Microsoft Office"} + - {id: 83, cat: PC/0day, desc: "Silent Apps"} + - {id: 72, cat: PC/0day, desc: "Other Softwares"} + - {id: 79, cat: PC/0day, desc: "Recovery Tools"} + - {id: 78, cat: PC/0day, desc: "Security Tools"} + - {id: 70, cat: PC/0day, desc: "Utility Tools"} + - {id: 74, cat: PC/0day, desc: "Web Tools"} + - {id: 80, cat: PC/0day, desc: "Windows Phone Apps"} + - {id: 81, cat: PC/0day, desc: "Developers"} + - {id: 82, cat: PC/0day, desc: "Designers"} + - {id: 84, cat: PC, desc: "TEAM OS Other Stuff Releases"} + - {id: 131, cat: PC/Mac, desc: "MAC Games"} + - {id: 88, cat: PC/Mobile-Android, desc: "Android Games"} + - {id: 85, cat: PC/Games, desc: "Games"} + - {id: 86, cat: Books/EBook, desc: "Ebooks"} + - {id: 87, cat: Other, desc: "Wallpapers, Themes & Screensavers"} + - {id: 89, cat: PC, desc: "Other Releases"} + - {id: 100, cat: Other, desc: "Tutorials"} # undocumented + + modes: + search: [q] + book-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: useragent + type: text + label: User-Agent + - name: info_useragent + type: info + label: How to get the User-Agent + default: "
  1. From the same place you fetched the cookie,
  2. Find 'user-agent:' in the Request Headers section
  3. Select and Copy the whole user-agent string (everything after 'user-agent: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: / + selector: a[href="/account/"] + +search: + headers: + User-Agent: ["{{ .Config.useragent }}"] + + paths: + # 25 results per page + - path: "torrents/?filename={{ .Keywords }}&freeleech={{ if .Config.freeleech }}1{{ else }}{{ end }}" + - path: "torrents/?filename={{ .Keywords }}&page=2&freeleech={{ if .Config.freeleech }}1{{ else }}{{ end }}" + - path: "torrents/?filename={{ .Keywords }}&page=3&freeleech={{ if .Config.freeleech }}1{{ else }}{{ end }}" + - path: "torrents/?filename={{ .Keywords }}&page=4&freeleech={{ if .Config.freeleech }}1{{ else }}{{ end }}" + + rows: + selector: tr.dataList-row:has(td.download) + + fields: + category: + selector: a[href^="/forums/"] + attribute: href + filters: + - name: regexp + args: "\\.(\\d+)\\/$" + title: + selector: a[href^="/threads/"] + details: + selector: a[href^="/threads/"] + attribute: href + download: + selector: td.download a + attribute: href + date: + selector: li.structItem-startDate a time + attribute: datetime + size: + selector: td:nth-last-child(4) + grabs: + selector: td:nth-last-child(3) + seeders: + selector: td:nth-last-child(2) + leechers: + selector: td:nth-last-child(1) + downloadvolumefactor: + case: + "span.label:contains(\"Freeleech\")": 0 + "*": 1 + uploadvolumefactor: + text: 1 +# global MR is 0.4 but torrents must be seeded for 3 days regardless of ratio +# minimumratio: +# text: 0.4 + minimumseedtime: + # 3 days (as seconds = 3 x 24 x 60 x 60) + text: 259200 +# engine n/a diff --git a/config/prowlarr/Definitions/tekno3d.yml b/config/prowlarr/Definitions/tekno3d.yml new file mode 100644 index 0000000..172d05e --- /dev/null +++ b/config/prowlarr/Definitions/tekno3d.yml @@ -0,0 +1,164 @@ +--- +id: tekno3d +name: TEKNO3D +description: "TEKNO3D is a Private Torrent Tracker for MOVIES / TV" +language: en-US +type: private +encoding: UTF-8 +links: + - https://tracker.tekno3d.com/ + +caps: + categorymappings: + - {id: 29, cat: Audio, desc: "Audio Tracks"} + - {id: 26, cat: Movies/UHD, desc: "BETA UHD HDR-X"} + - {id: 32, cat: Movies, desc: "Dolby Vision"} + - {id: 28, cat: Movies, desc: "INTERNAL HDR-X"} + - {id: 37, cat: Movies, desc: "Member Grades"} + - {id: 37, cat: TV, desc: "Member Grades"} + - {id: 37, cat: Audio/Video, desc: "Member Grades"} + - {id: 31, cat: Other, desc: "YouTube HDR"} + - {id: 30, cat: Other, desc: "[SAMPLES] INTERNAL HDR-X"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: onlyfree + type: checkbox + label: Show only Free torrents + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info + type: info + label: Results Per Page + default: For best results, change the 'Torrents per page' setting to 100 on your profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + use_ssl: 0 + perm_ssl: 0 + error: + - selector: h2 + message: + selector: table tr td.colhead2 + test: + path: browse.php + selector: a[href*="logout.php?hash_please="] + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # title, descr, genre, all + searchin: title + # 0 active, 1 incldead, 2 onlydead + incldead: 1 + only_free: "{{ if .Config.onlyfree }}1{{ else }}0{{ end }}" + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + keywordsfilters: + - name: re_replace + args: ["(\\w+)", "+$1"] # prepend + to each word + + rows: + selector: tr.highlight, tr.browse_color, tr.freeleech_color, tr[id^="kdescr"] + after: 1 + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + attribute: onmouseover + filters: + - name: split + args: [">", "1"] + - name: replace + args: ["\n"] + - name: prepend + args: "{{ if .Result.genre }}{{ .Result.genre }}
{{ else }}{{ end }}" + downloadvolumefactor: + case: + a.info:contains("FREE"): 0 + "*": 1 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/teracod.yml b/config/prowlarr/Definitions/teracod.yml new file mode 100644 index 0000000..eadcf8c --- /dev/null +++ b/config/prowlarr/Definitions/teracod.yml @@ -0,0 +1,188 @@ +--- +id: teracod +name: teracod +description: "teracod (Movie Zone) is a HUNGARIAN Private Torrent Tracker for 0DAY / GENERAL" +language: hu-HU +type: private +encoding: UTF-8 +links: + - https://teracod.net/ +legacylinks: + - https://moviezone.ws/ + +caps: + categorymappings: + - {id: 42, cat: Movies/3D, desc: "Film/3D/Hun"} + - {id: 19, cat: Movies/SD, desc: "Film/CAM/Eng"} + - {id: 16, cat: Movies/SD, desc: "Film/CAM/Hun"} + - {id: 36, cat: Movies/DVD, desc: "Film/DVD/Eng"} + - {id: 35, cat: Movies/DVD, desc: "Film/DVD/Hun"} + - {id: 34, cat: Movies/HD, desc: "Film/HD/Eng"} + - {id: 33, cat: Movies/HD, desc: "Film/HD/Hun"} + - {id: 32, cat: Movies/SD, desc: "Film/SD/Eng"} + - {id: 31, cat: Movies/SD, desc: "Film/SD/Hun"} + - {id: 41, cat: Movies/UHD, desc: "Film/UHD/Hun"} + - {id: 28, cat: PC/Games, desc: "Játék/ISO"} + - {id: 27, cat: Console, desc: "Játék/Konzol"} + - {id: 26, cat: PC/Games, desc: "Játék/RIP"} + - {id: 25, cat: Audio/Video, desc: "Klipp"} + - {id: 24, cat: Books/EBook, desc: "Könyvek/Eng"} + - {id: 23, cat: Books/EBook, desc: "Könyvek/Hun"} + - {id: 17, cat: PC/Mobile-Other, desc: "Mobile"} + - {id: 20, cat: PC, desc: "Program/Egyéb"} + - {id: 14, cat: PC/ISO, desc: "Program/ISO"} + - {id: 13, cat: TV/SD, desc: "Sorozat/DVDR/Eng"} + - {id: 12, cat: TV/SD, desc: "Sorozat/DVDR/Hun"} + - {id: 40, cat: TV/HD, desc: "Sorozat/HD/Eng"} + - {id: 39, cat: TV/HD, desc: "Sorozat/HD/Hun"} + - {id: 38, cat: TV/SD, desc: "Sorozat/SD/Eng"} + - {id: 37, cat: TV/SD, desc: "Sorozat/SD/Hun"} + - {id: 30, cat: XXX, desc: "XXX"} + - {id: 18, cat: XXX/x264, desc: "XXX/HD"} + - {id: 15, cat: XXX/ImageSet, desc: "XXX/Képsorozatok"} + - {id: 11, cat: Audio/Lossless, desc: "Zene/EN/Lossless"} + - {id: 29, cat: Audio/Lossless, desc: "Zene/HU/Lossless"} + - {id: 22, cat: Audio/MP3, desc: "Zene/Mp3/Eng"} + - {id: 21, cat: Audio/MP3, desc: "Zene/Mp3/Hun"} + + modes: + search: [q] + tv-search: [q, season, ep, genre] + movie-search: [q, genre] + music-search: [q, genre] + book-search: [q, genre] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: 2 + options: + 2: desc + 1: asc + - name: info + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + returnto: / + error: + - selector: table.browse:contains("hiba") + test: + path: / + selector: a[href$="../logout.php"] + +search: + paths: + # https://teracod.net/browse.php?search=&cat=0&genre=0&incldead=1&blah=0 + - path: browse.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 active, 1 all, 2 dead, 3 recomended, 4 double, 5 free, 6 MZ releases, 7 Race torrents + # note: option 4 and 5 do not actually filter. everything is returned. + incldead: "{{ if .Config.freeleech }}5{{ else }}1{{ end }}" + genre: "{{ .Query.Genre }}" + # 0 name, 1 descr, 2 both + blah: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + # does not support imdbid search + + rows: + selector: table > tbody > tr.sh1:has(a[href*="/download.php/"]), table > tbody > tr.sor:has(a[href*="/download.php/"]) + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + attribute: title + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href*="/download.php/"] + attribute: href + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + poster: + selector: a[onmouseover] + attribute: onmouseover + filters: + - name: regexp + args: "src=(.+?)>" + files: + selector: td:nth-last-child(8) + date: + selector: td:nth-last-child(6) + filters: + - name: regexp + args: (\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}) + - name: replace + args: ["\xA0", " "] + - name: append + args: " +01:00" # CET + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + size: + selector: td:nth-last-child(5) > u + grabs: + selector: td:nth-last-child(4) + seeders: + selector: td:nth-last-child(3) + leechers: + selector: td:nth-last-child(2) + downloadvolumefactor: + case: + "font[color=\"#AF0000\"]:contains(\"x0\")": 0 + "*": 1 + uploadvolumefactor: + case: + "font[color=\"#2A821E\"]:contains(\"x2\")": 2 + "*": 1 + genre: + selector: td.torrent:nth-child(2) + filters: + - name: regexp + args: "\\((.+?)\\)" + description: + case: + img[src="pic/yes.gif"]: "Verified: {{ .Result.genre }}" + "*": "Unverified: {{ .Result.genre }}" + minimumratio: + text: 1.0 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# engine n/a diff --git a/config/prowlarr/Definitions/thecrazyones.yml b/config/prowlarr/Definitions/thecrazyones.yml new file mode 100644 index 0000000..e4dd14c --- /dev/null +++ b/config/prowlarr/Definitions/thecrazyones.yml @@ -0,0 +1,213 @@ +--- +id: thecrazyones +name: The Crazy Ones +description: "The Crazy Ones is a Private GERMAN tracker for MOVIES / TV / GENERAL" +language: de-DE +type: private +encoding: UTF-8 +links: + - https://thecrazyones.hopto.org/ + +caps: + categorymappings: + # Anime + - {id: 123, cat: TV/Anime, desc: "Anime Alles"} + # Movie + - {id: 122, cat: Movies/UHD, desc: "Movie 4K"} + - {id: 114, cat: Movies/DVD, desc: "Movie DVD"} + - {id: 118, cat: Movies, desc: "Movie Klassiker"} + - {id: 124, cat: Movies, desc: "Movie Pack"} + - {id: 28, cat: Movies/SD, desc: "Movie SD"} + - {id: 32, cat: Movies/HD, desc: "Movie HD"} + - {id: 26, cat: Movies/3D, desc: "Movie 3D"} + # Serien + - {id: 152, cat: TV/SD, desc: "Serien DVD"} + - {id: 139, cat: TV/HD, desc: "Serien HD"} + - {id: 59, cat: TV, desc: "Serien Pack"} + - {id: 57, cat: TV/SD, desc: "Serien SD"} + - {id: 60, cat: TV, desc: "Serien Klassiker"} + # Doku + - {id: 121, cat: TV/Documentary, desc: "Doku Pack"} + - {id: 14, cat: TV/Documentary, desc: "Doku HD"} + - {id: 15, cat: TV/Documentary, desc: "Doku SD"} + # Software + - {id: 12, cat: PC/0day, desc: "App Win"} + - {id: 11, cat: PC/Mobile-Other, desc: "App Other"} + - {id: 10, cat: PC/Mac, desc: "App Mac"} + - {id: 9, cat: PC, desc: "App Linux"} + # Game + - {id: 120, cat: Console/PS3, desc: "Game PlayStation"} + - {id: 16, cat: Console, desc: "Game Wimmelbild"} + - {id: 17, cat: PC/Games, desc: "Game PC"} + - {id: 20, cat: Console/PSP, desc: "Game PSP"} + - {id: 22, cat: Console/Wii, desc: "Game Wii"} + - {id: 24, cat: Console/XBox, desc: "Game XBOX"} + # Music + - {id: 48, cat: Audio, desc: "Music Album"} + - {id: 49, cat: Audio, desc: "Music Charts"} + - {id: 52, cat: Audio, desc: "Music Pack"} + - {id: 54, cat: Audio, desc: "Music Single"} + - {id: 55, cat: Audio/Video, desc: "Music Video"} + - {id: 125, cat: Audio, desc: "Music Mixe"} + - {id: 126, cat: Audio, desc: "Music Audio"} + # Sport + - {id: 61, cat: TV/Sport, desc: "Sport Other"} + # Sonstiges + - {id: 63, cat: Audio/Audiobook, desc: "Sonstiges A-Book"} + - {id: 96, cat: Books/EBook, desc: "Sonstiges E-Book"} + - {id: 69, cat: Books, desc: "Sonstiges Tutorial"} + - {id: 71, cat: Books/Other, desc: "Sonstiges Other"} + # Internt'l + - {id: 102, cat: TV/SD, desc: "Internt'l Serie SD"} + - {id: 98, cat: Movies/HD, desc: "Internt'l Movie HD"} + - {id: 99, cat: TV/HD, desc: "Internt'l Serie HD"} + - {id: 105, cat: TV/Documentary, desc: "Internt'l Doku"} + - {id: 103, cat: Movies/SD, desc: "Internt'l Movie SD"} + - {id: 104, cat: Other, desc: "Internt'l Misc"} + - {id: 106, cat: Books/EBook, desc: "Internt'l E-Book"} + - {id: 107, cat: Audio/Audiobook, desc: "Internt'l A-Book"} + - {id: 115, cat: Movies/DVD, desc: "Internt'l DVD"} + # XXX + - {id: 73, cat: XXX/x264, desc: "XXX HD"} + - {id: 75, cat: XXX/Pack, desc: "XXX Pack"} + - {id: 76, cat: XXX/SD, desc: "XXX SD"} + - {id: 113, cat: XXX/DVD, desc: "XXX DVD"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: pin + type: text + label: Pin + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeds: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Anzahl der Torrents beim Durchsuchen Torrents per page: setting to 60 on your account profile. The default is 15. + +login: + path: login.php + method: form + form: form[action="/login.php"] + cookies: ["JAVA=OK"] # avoid jscheck redirect + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + pin: "{{ .Config.pin }}" + error: + - selector: div#login_error + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: selection.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 name, 1 descr, 2 both + blah: 0 + orderby: "{{ .Config.sort }}" + sort: "{{ .Config.type }}" + + rows: + selector: "div.selection_wrap{{ if .Config.freeleech }}:has(:root:has(div.onlyup)){{ else }}{{ end }}" + + fields: + category_p1: + selector: div.kat_cat_pic_name + category_p2: + selector: div.kat_cat_pic_name_b + categorydesc: + text: "{{ .Result.category_p1 }} {{ .Result.category_p2 }}" + title: + selector: a.selection_a + filters: + - name: re_replace + args: ["^\\[[\\w ]*\\]\\s?", ""] + details: + selector: a.selection_a + attribute: href + download: + selector: a[href^="download_ssl.php?torrent="] + attribute: href + poster: + selector: div[id^="details"] img + attribute: src + size: + selector: div.selection_unter_ad + grabs: + selector: div.selection_unter_ae + date_day: + # Heute 13:30:04 + # Gestern 09:10:10 + selector: div.selection_unter_ab:not(:contains(".")) + optional: true + filters: + - name: replace + args: ["Heute", "Today"] + - name: replace + args: ["Gestern", "Yesterday"] + - name: append + args: " +01:00" # CET + date_year: + # 30.02.2018 um 23:12:50 + selector: div.selection_unter_ab:contains(".") + optional: true + filters: + - name: replace + args: [" um", ""] + - name: append + args: " +01:00" # CET + - name: dateparse + args: "dd.MM.yyyy HH:mm:ss zzz" + date: + text: "{{ if or .Result.date_year .Result.date_day }}{{ or .Result.date_year .Result.date_day }}{{ else }}now{{ end }}" + seeders: + selector: div.selection_unter_aa + leechers: + selector: div.selection_unter_aaa + downloadvolumefactor: + case: + ":root:has(div.onlyup)": 0 + "*": 1 + uploadvolumefactor: + text: 1 +# global MR is 0.7 but torrents must be seeded for 2 days regardless of ratio +# minimumratio: +# text: 0.7 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# 3xT diff --git a/config/prowlarr/Definitions/theempire.yml b/config/prowlarr/Definitions/theempire.yml new file mode 100644 index 0000000..915e033 --- /dev/null +++ b/config/prowlarr/Definitions/theempire.yml @@ -0,0 +1,160 @@ +--- +id: theempire +name: The Empire +description: "TheEmpire (TE) is a Private Torrent Tracker for COMMONWEALTH TV / RADIO" +language: en-US +type: private +encoding: UTF-8 +links: + - https://theempire.click/ +legacylinks: + - http://theempire.click/ + +caps: + categorymappings: + - {id: 55, cat: TV, desc: "Adverts"} + - {id: 60, cat: TV, desc: "Educational"} + - {id: 63, cat: TV, desc: "Game Shows"} + - {id: 67, cat: TV, desc: "Music"} + - {id: 72, cat: TV, desc: "QuizComedy"} + - {id: 77, cat: TV, desc: "Special Events"} + - {id: 81, cat: TV, desc: "Trains & Planes"} + - {id: 54, cat: TV, desc: "Arts & Culture"} + - {id: 61, cat: TV, desc: "Entertainment"} + - {id: 53, cat: TV, desc: "Gardening"} + - {id: 68, cat: TV, desc: "Mystery & Crime Fiction"} + - {id: 73, cat: TV, desc: "Radio"} + - {id: 78, cat: TV, desc: "Special Interest"} + - {id: 82, cat: TV, desc: "Travel"} + - {id: 56, cat: TV, desc: "Comedy"} + - {id: 85, cat: TV, desc: "Euro-Noir"} + - {id: 64, cat: TV, desc: "Kids"} + - {id: 69, cat: TV, desc: "News"} + - {id: 74, cat: TV, desc: "Reality"} + - {id: 79, cat: TV, desc: "Sport"} + - {id: 83, cat: TV, desc: "Wildlife & Nature"} + - {id: 58, cat: TV, desc: "Documentary"} + - {id: 57, cat: TV, desc: "Fly on the Wall/Lifestyle"} + - {id: 65, cat: TV, desc: "Magazine"} + - {id: 70, cat: TV, desc: "Occult & Horror"} + - {id: 75, cat: TV, desc: "Sci-Fi"} + - {id: 84, cat: TV, desc: "Style & Fashion"} + - {id: 62, cat: TV, desc: "Food Drink & Cooking"} + - {id: 66, cat: TV, desc: "Motoring"} + - {id: 71, cat: TV, desc: "Property"} + - {id: 76, cat: TV, desc: "Soaps"} + - {id: 200, cat: TV, desc: "Soaps : Classic"} + - {id: 80, cat: TV, desc: "Talkshow"} + - {id: 59, cat: TV, desc: "Drama"} + + modes: + search: [q] + tv-search: [q, season, ep] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: DESC + options: + DESC: desc + ASC: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + - name: info_tcg + type: info + label: Message from the TCG staff + default: We wish to encourage all members to participate in the communities we are creating. We have worked with the Jackett maintainers to ensure that the security and longevity of our trackers continues, and as such some torrents are removed from the results in Jackett. + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: main.php + selector: a[href^="logout.php?id="] + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}" + search: "{{ .Keywords }}" + # 0 active, 1 incldead, 2 onlydead, 3 free (not used by request), 4 exclusive, 5 neutral + incldead: 1 + titleonly: 1 + # 0 Exact, 1 Fuzzy, 3 Parsed, 4 Simple # 2 Pure is not used + nonboolean: 0 + sort: "{{ .Config.sort }}" + d: "{{ .Config.type }}" + + rows: + selector: table[border="0"] > tbody > tr.ttable:has(a[href^="browse.php?cat="]):not(:has(font[color="blue"])):not(:contains("*TCG*")) + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + attribute: title + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php/"] + attribute: href + grabs: + selector: td:nth-child(8) + filters: + - name: replace + args: ["Never", "0"] + files: + selector: td:nth-child(4) + size: + selector: td:nth-child(7) + seeders: + selector: td:nth-child(9) + leechers: + selector: td:nth-child(10) + date: + selector: td:nth-child(6) + # auto adjusted by site account profile + filters: + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss" + downloadvolumefactor: + case: + "font[color=\"green\"]": 0 + "*": 1 + uploadvolumefactor: + case: + "font[color=\"green\"]": 0 + "*": 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 1 day (as seconds = 24 x 60 x 60) + text: 86400 +# XBTT TCG 0.97 diff --git a/config/prowlarr/Definitions/thefallingangels.yml b/config/prowlarr/Definitions/thefallingangels.yml new file mode 100644 index 0000000..c78a320 --- /dev/null +++ b/config/prowlarr/Definitions/thefallingangels.yml @@ -0,0 +1,218 @@ +--- +id: thefallingangels +name: The Falling Angels +description: "The Falling Angels (TFA) is a GERMAN Private site for TV / MOVIES / GENERAL" +language: de-DE +type: private +encoding: UTF-8 +links: + - https://tfa.tf/ + +caps: + categorymappings: + - {id: 107, cat: PC/0day, desc: "Apps Windows"} + - {id: 132, cat: PC/Mac, desc: "Apps Mac-OSX"} + - {id: 105, cat: PC/Mobile-Other, desc: "Apps Other"} + - {id: 116, cat: PC/Games, desc: "Games PC"} + - {id: 155, cat: Console/NDS, desc: "Games Nintendo DS"} + - {id: 134, cat: Console, desc: "Games Switch"} + - {id: 138, cat: Console/Wii, desc: "Games Nintendo Wii"} + - {id: 124, cat: Console/PSP, desc: "Games PSP / PS 1-4"} + - {id: 139, cat: Console/XBox, desc: "Games XBOX"} + - {id: 140, cat: Movies/HD, desc: "Movies HD"} + - {id: 141, cat: Movies/SD, desc: "Movies SD"} + - {id: 125, cat: Movies/UHD, desc: "Movies Ultra HD"} + - {id: 104, cat: Movies/Other, desc: "Movies Packs"} + - {id: 100, cat: Movies, desc: "Movies Horror"} + - {id: 142, cat: Movies/DVD, desc: "Movies DVD"} + - {id: 143, cat: Movies/BluRay, desc: "Movies Bluray"} + - {id: 144, cat: Movies/DVD, desc: "Movies S-DVD"} + - {id: 133, cat: Movies/Foreign, desc: "Movies Englisch"} + - {id: 101, cat: Movies/HD, desc: "TFA AVCHD's"} + - {id: 103, cat: Movies/DVD, desc: "TFA Special DVD's"} + - {id: 108, cat: TV/Documentary, desc: "Dokus HD"} + - {id: 113, cat: TV/Documentary, desc: "Dokus SD"} + - {id: 154, cat: TV/Documentary, desc: "Dokus Pack"} + - {id: 149, cat: TV/HD, desc: "Serien HD"} + - {id: 151, cat: TV/SD, desc: "Serien SD"} + - {id: 167, cat: TV/UHD, desc: "Serien Ultra HD"} + - {id: 150, cat: TV/Other, desc: "Serien Pack"} + - {id: 136, cat: TV/Foreign, desc: "Serien Englisch"} + - {id: 152, cat: TV/Sport, desc: "Sport HD"} + - {id: 153, cat: TV/Sport, desc: "Sport SD"} + - {id: 135, cat: TV/Sport, desc: "Sport Ultra HD"} + - {id: 106, cat: TV/Sport, desc: "Sport Pack"} + - {id: 147, cat: Audio/MP3, desc: "Music MP3"} + - {id: 145, cat: Audio/Lossless, desc: "Music Flac"} + - {id: 137, cat: Audio, desc: "Music M4A"} + - {id: 109, cat: Audio, desc: "Music Discographie"} + - {id: 146, cat: Audio/Other, desc: "Music Pack"} + - {id: 148, cat: Audio/Video, desc: "Music Video"} + - {id: 157, cat: Movies/HD, desc: "Kids Movies HD"} + - {id: 158, cat: Movies/SD, desc: "Kids Movies SD"} + - {id: 161, cat: TV/HD, desc: "Kids Serien HD"} + - {id: 162, cat: TV/SD, desc: "Kids Serien SD"} + - {id: 112, cat: Audio/Audiobook, desc: "Kids Hörbuch"} + - {id: 115, cat: Books/Mags, desc: "E-Books Zeitschriften"} + - {id: 114, cat: Books/Comics, desc: "E-Books Comics"} + - {id: 117, cat: Books/EBook, desc: "E-Books Bücher"} + - {id: 156, cat: Books, desc: "E-Books Packs"} + - {id: 130, cat: Books, desc: "E-Books FSK 18"} + - {id: 159, cat: Movies/Other, desc: "Anime Movies HD"} + - {id: 160, cat: Movies/Other, desc: "Anime Movies SD"} + - {id: 128, cat: TV/Anime, desc: "Anime Serien"} + - {id: 129, cat: TV/Anime, desc: "Anime Sonstiges"} + - {id: 118, cat: Other, desc: "Other Mobile"} + - {id: 119, cat: Other, desc: "Other Hörbücher"} + - {id: 123, cat: Other, desc: "Other Pics"} + - {id: 120, cat: XXX, desc: "XXX Movies HD"} + - {id: 121, cat: XXX, desc: "XXX Movies SD"} + - {id: 165, cat: XXX, desc: "XXX Ultra HD"} + - {id: 122, cat: XXX, desc: "XXX Movies Pack"} + - {id: 131, cat: XXX, desc: "XXX Hentai"} + - {id: 164, cat: XXX, desc: "XXX VR Porn"} + - {id: 166, cat: XXX, desc: "XXX Games"} + - {id: 110, cat: XXX, desc: "XXX Pics"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: pin + type: text + label: Pin + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeds: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: login.php + method: form + form: form[method="post"] + cookies: ["JAVA=OK"] # avoid jscheck redirect + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + pin: "{{ .Config.pin }}" + error: + - selector: div#login_error + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: selection.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 name, 1 descr, 2 both + blah: 0 + orderby: "{{ .Config.sort }}" + sort: "{{ .Config.type }}" + + rows: + selector: "div.selection_wrap{{ if .Config.freeleech }}:has(div[onmouseover=\"return overlib('OnlyUp: Ja');\"]){{ else }}{{ end }}" + + fields: + category_p1: + selector: div.kat_cat_pic_name + category_p2: + selector: div.kat_cat_pic_name_b + categorydesc: + text: "{{ .Result.category_p1 }} {{ .Result.category_p2 }}" + title: + selector: a.selection_a + filters: + - name: re_replace + args: ["^\\[[\\w ]*\\]\\s?", ""] + details: + selector: a.selection_a + attribute: href + download_default: + selector: a[href^="download.php?torrent="] + attribute: href + optional: true + download: + selector: a[href^="download_ssl.php?torrent="] + attribute: href + optional: true + default: "{{ .Result.download_default }}" + poster: + selector: div[id^="details"] img + attribute: src + size: + selector: div.selection_unter_ad + grabs: + selector: div.selection_unter_ae + date_day: + # Heute 13:30:04 + # Gestern 09:10:10 + selector: div.selection_unter_ab:not(:contains(".")) + optional: true + filters: + - name: replace + args: ["Heute", "Today"] + - name: replace + args: ["Gestern", "Yesterday"] + date_year: + # 30.02.2018 um 23:12:50 + selector: div.selection_unter_ab:contains(".") + optional: true + filters: + - name: replace + args: [" um", ""] + - name: append + args: " +01:00" # CET + - name: dateparse + args: "dd.MM.yyyy HH:mm:ss zzz" + date: + text: "{{ if or .Result.date_year .Result.date_day }}{{ or .Result.date_year .Result.date_day }}{{ else }}now{{ end }}" + description: + selector: selection_unter_af + seeders: + selector: div.selection_unter_aa + leechers: + selector: div.selection_unter_aaa + downloadvolumefactor: + case: + "div[onmouseover=\"return overlib('OnlyUp: Ja');\"]": 0 + "div[onmouseover=\"return overlib('Freeleech: Ja');\"]": 0 + "*": 1 + uploadvolumefactor: + case: + "div[onmouseover=\"return overlib('Freeleech: Ja');\"]": 0 + "*": 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# 3xT diff --git a/config/prowlarr/Definitions/thegeeks.yml b/config/prowlarr/Definitions/thegeeks.yml new file mode 100644 index 0000000..ce8b12e --- /dev/null +++ b/config/prowlarr/Definitions/thegeeks.yml @@ -0,0 +1,203 @@ +--- +id: thegeeks +name: The Geeks +description: "Technology E-Learning" +language: en-US +type: private +encoding: UTF-8 +links: + - https://thegeeks.click/ + +caps: + categorymappings: + - {id: 212, cat: Other, desc: "AudioBook : Fiction"} + - {id: 56, cat: Other, desc: "Docu : History - War/Politics"} + - {id: 209, cat: Other, desc: "Business : Startup/Dev"} + - {id: 9, cat: Other, desc: "Food/Cooking/Nutrition"} + - {id: 60, cat: Other, desc: "Performing Arts"} + - {id: 213, cat: Other, desc: "AudioBook : Non-Fiction"} + - {id: 35, cat: Other, desc: "Docu : Home / Property"} + - {id: 214, cat: Other, desc: "Comp: Artificial Intelligence"} + - {id: 28, cat: Other, desc: "Business :Misc"} + - {id: 37, cat: Other, desc: "Game Shows / Quiz Shows"} + - {id: 45, cat: Other, desc: "Photography"} + - {id: 71, cat: Other, desc: "Docu : Antiques / Collecting"} + - {id: 78, cat: Other, desc: "Docu : Horizon"} + - {id: 40, cat: Other, desc: "Comp: Certification Courses"} + - {id: 2, cat: Other, desc: "Games: Cards/Tabletop/etc"} + - {id: 11, cat: Other, desc: "Political Studies"} + - {id: 82, cat: Other, desc: "Docu : Architecture/Building"} + - {id: 69, cat: Other, desc: "Docu : Misc"} + - {id: 44, cat: Other, desc: "Comp: Digital Audio/Video"} + - {id: 23, cat: Other, desc: "Hobbies: Misc"} + - {id: 61, cat: Other, desc: "Science: Biology"} + - {id: 72, cat: Other, desc: "Docu : Astronomy / Space"} + - {id: 75, cat: Other, desc: "Docu : Nature"} + - {id: 48, cat: Other, desc: "Comp: Games Dev/Guides"} + - {id: 1, cat: Other, desc: "Languages / Linguistics"} + - {id: 77, cat: Other, desc: "Science: Chemistry"} + - {id: 85, cat: Other, desc: "Docu : Childrens Ed"} + - {id: 54, cat: Other, desc: "Docu : News/World Reports"} + - {id: 3, cat: Other, desc: "Comp: Graphics "} + - {id: 20, cat: Other, desc: "Law & Justice"} + - {id: 12, cat: Other, desc: "Science: Math/Statistics"} + - {id: 38, cat: Other, desc: "Docu : Crime/ Investigation"} + - {id: 83, cat: Other, desc: "Docu : Nova"} + - {id: 42, cat: Other, desc: "Comp: Lang/DBs"} + - {id: 30, cat: Other, desc: "Literature"} + - {id: 10, cat: Other, desc: "Science: Medicine/Health "} + - {id: 59, cat: Other, desc: "Docu : Earth / Environment"} + - {id: 27, cat: Other, desc: "Docu : Paleontology"} + - {id: 49, cat: Other, desc: "Comp: Network/Hardware"} + - {id: 16, cat: Other, desc: "Magic & Illusion"} + - {id: 29, cat: Other, desc: "Science: Philosophy"} + - {id: 18, cat: Other, desc: "Docu : Engineering"} + - {id: 67, cat: Other, desc: "Docu : Pets/Animal Keeping"} + - {id: 43, cat: Other, desc: "Comp: Operating Systems"} + - {id: 26, cat: Other, desc: "Music: History / Theory"} + - {id: 76, cat: Other, desc: "Science: Physics"} + - {id: 4, cat: Other, desc: "Docu : Fine/Visual Arts"} + - {id: 53, cat: Other, desc: "Docu : Social Experiment"} + - {id: 46, cat: Other, desc: "Comp: Security/Encryption"} + - {id: 15, cat: Other, desc: "Music: Learning / Courses"} + - {id: 14, cat: Other, desc: "Science: Psych/Sociolgy"} + - {id: 39, cat: Other, desc: "Docu : Fly on The Wall"} + - {id: 73, cat: Other, desc: "Docu : Survivalism"} + - {id: 52, cat: Other, desc: "Comp: Software Training"} + - {id: 206, cat: Other, desc: "Native American Studies"} + - {id: 80, cat: Other, desc: "Sports - Live/Highlights"} + - {id: 84, cat: Other, desc: "Docu : FrontLine"} + - {id: 32, cat: Other, desc: "Docu : Travel / Culture"} + - {id: 41, cat: Other, desc: "Comp: Theory/Ref/Mags"} + - {id: 201, cat: Other, desc: "Occultism: Academic / Referenc"} + - {id: 22, cat: Other, desc: "Sports/Exercise/Outdoors"} + - {id: 36, cat: Other, desc: "Docu : Gardening/Agriculture"} + - {id: 34, cat: Other, desc: "Docu : Vehicles/Transport"} + - {id: 47, cat: Other, desc: "Comp: Web Development"} + - {id: 210, cat: Other, desc: "Tattoos/Body Art"} + - {id: 24, cat: Other, desc: "Stock Media"} + - {id: 58, cat: Other, desc: "Docu : History - Biographies"} + - {id: 207, cat: Other, desc: "Business : Economics"} + - {id: 68, cat: Other, desc: "Crafts/Jewelry"} + - {id: 202, cat: Other, desc: "Occultism: Mythology Folklore"} + - {id: 33, cat: Other, desc: "Style & Fashion"} + - {id: 55, cat: Other, desc: "Docu : History - Civilization"} + - {id: 211, cat: Other, desc: "Business : Investing"} + - {id: 21, cat: Other, desc: "DIY / Workshop"} + - {id: 203, cat: Other, desc: "Paranormal"} + - {id: 31, cat: Other, desc: "Docu : History - Misc"} + - {id: 208, cat: Other, desc: "Business : Marketing"} + - {id: 25, cat: Other, desc: "Exam Prep / Education"} + - {id: 204, cat: Other, desc: "Parapsychology"} + - {id: 215, cat: Other, desc: "Sexuality/Seductn/Body Img"} + + modes: + search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: DESC + options: + DESC: desc + ASC: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + - name: info_tcg + type: info + label: Message from TCG staff + default: We wish to encourage all members to participate in the communities we are creating. We have worked with the Jackett maintainers to ensure that the security and longevity of our trackers continues, and as such some torrents are removed from the results in Jackett. + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: main.php + selector: a[href^="logout.php?id="] + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}" + search: "{{ .Keywords }}" + # 0 active, 1 incldead, 2 onlydead, 3 free (not used by request), 4 exclusive, 5 neutral + incldead: 1 + titleonly: 1 + # 0 Exact, 1 Fuzzy, 3 Parsed, 4 Simple # 2 Pure is not used + nonboolean: 0 + sort: "{{ .Config.sort }}" + d: "{{ .Config.type }}" + + rows: + selector: table[border="0"] > tbody > tr.ttable:has(a[href^="browse.php?cat="]):not(:has(font[color="blue"])):not(:contains("*TCG*")) + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + attribute: title + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php/"] + attribute: href + files: + selector: td:nth-child(4) + date: + selector: td:nth-child(6) + # auto adjusted by site account profile + filters: + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss" + size: + selector: td:nth-child(7) + grabs: + selector: td:nth-child(8) + filters: + - name: replace + args: ["Never", "0"] + seeders: + selector: td:nth-child(9) + leechers: + selector: td:nth-child(10) + downloadvolumefactor: + case: + "font[color=\"green\"]": 0 + "*": 1 + uploadvolumefactor: + case: + "font[color=\"green\"]": 0 + "*": 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 1 day (as seconds = 24 x 60 x 60) + text: 86400 +# XBTT TCG 0.98 diff --git a/config/prowlarr/Definitions/theleachzone.yml b/config/prowlarr/Definitions/theleachzone.yml new file mode 100644 index 0000000..d70e39f --- /dev/null +++ b/config/prowlarr/Definitions/theleachzone.yml @@ -0,0 +1,184 @@ +--- +id: theleachzone +name: TheLeachZone +description: "The Leach Zone (TLZ) is a Private Torrent Tracker for MOVIES / TV / GENERAL" +language: en-US +type: private +encoding: UTF-8 +links: + - https://tlz.digital/ + +caps: + categorymappings: + - {id: 21, cat: PC, desc: "Appz"} + - {id: 35, cat: Books/Comics, desc: "Comics/Mags"} + - {id: 27, cat: Books/EBook, desc: "E-Books"} + - {id: 28, cat: Console, desc: "Games/Console"} + - {id: 22, cat: PC/Games, desc: "Games"} + - {id: 33, cat: PC/Games, desc: "Games/PC"} + - {id: 23, cat: Other, desc: "Misc"} + - {id: 26, cat: Movies/SD, desc: "Movies/Cam"} + - {id: 36, cat: Movies/Foreign, desc: "Movies/Foreign"} + - {id: 11, cat: Movies/HD, desc: "Movies/HD"} + - {id: 3, cat: Movies, desc: "Movies/Packs"} + - {id: 24, cat: Movies/SD, desc: "Movies/SD"} + - {id: 30, cat: Movies/UHD, desc: "Movies/UHD"} + - {id: 37, cat: Movies/WEB-DL, desc: "Movies/Web-DL"} + - {id: 20, cat: Audio/Lossless, desc: "Music/FLAC"} + - {id: 4, cat: Audio/MP3, desc: "Music/MP3"} + - {id: 17, cat: Audio, desc: "Music/Packs"} + - {id: 34, cat: Audio/Video, desc: "Music/Video"} + - {id: 31, cat: TV/Anime, desc: "TV/Anime"} + - {id: 18, cat: TV/HD, desc: "TV/HD"} + - {id: 16, cat: TV, desc: "TV/Packs"} + - {id: 19, cat: TV/SD, desc: "TV/SD"} + - {id: 29, cat: TV/UHD, desc: "TV/UHD"} + + modes: + search: [q] + tv-search: [q, season, ep, genre] + movie-search: [q, genre] + music-search: [q, genre] + book-search: [q, genre] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + use_ssl: 1 + perm_ssl: "" + returnto: / + error: + - selector: table.main:contains("Login failed!") + message: + selector: table tr td.colhead2 + test: + path: / + selector: a[href*="logout.php?hash_please="] + +search: + paths: + # https://tlz.digital/browse.php?c21=1&c22=1&c23=1&search=&searchin=title&incldead=0&sort=4&type=desc + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ if .Query.Genre }}{{ .Query.Genre }} {{ else }}{{ end }}{{ .Keywords }}" + # title, descr, genre, all + searchin: "{{ if .Query.Genre }}all{{ else }}title{{ end }}" + # 0 active, 1 incldead, 2 onlydead + incldead: 1 + only_free: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + + keywordsfilters: + - name: re_replace + args: ["(\\w+)", "+$1"] # prepend + to each word + + rows: + selector: table.table-bordered tr:has(a[href^="download.php?torrent="]) + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + attribute: onmouseover + filters: + - name: regexp + args: "Tip\\('(.+?)" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?torrent="] + attribute: href + poster: + selector: a[href^="details.php?id="] + attribute: onmouseover + filters: + - name: regexp + args: src=\\'(.+?)\\' + - name: replace + args: ["./pic/noposter.png", ""] + genre: + selector: i + description: + text: "{{ .Result.genre }}" + files: + selector: td:nth-child(5) + date_day: + selector: td:nth-child(7):contains("day") + # auto adjusted by site account profile + optional: true + filters: + - name: fuzzytime + date_year: + selector: td:nth-child(7):not(:contains("day")) + # auto adjusted by site account profile + optional: true + filters: + - name: dateparse + args: "MMM d yyyy hh:mm tt" + date: + text: "{{ if or .Result.date_day .Result.date_year }}{{ or .Result.date_day .Result.date_year }}{{ else }}now{{ end }}" + size: + selector: td:nth-child(8) + grabs: + selector: td:nth-child(9) + seeders: + selector: td:nth-child(10) + leechers: + selector: td:nth-child(11) + downloadvolumefactor: + case: + "a.info:contains(\"[FREE]\")": 0 + "a.info:contains(\"[SILVER]\")": 0.5 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# U-232 V5 diff --git a/config/prowlarr/Definitions/themixingbowl.yml b/config/prowlarr/Definitions/themixingbowl.yml new file mode 100644 index 0000000..634cc21 --- /dev/null +++ b/config/prowlarr/Definitions/themixingbowl.yml @@ -0,0 +1,143 @@ +--- +id: themixingbowl +name: themixingbowl +description: "themixingbowl (TMB) is a Semi-Private Torrent Tracker for DJ Music mixes" +language: en-US +type: semi-private +encoding: UTF-8 +links: + - https://tmb.dj/ + - https://themixingbowl.org/ + +caps: + categorymappings: + - {id: 1, cat: Audio, desc: Music} + + modes: + search: [q] + music-search: [q, artist] + +settings: + - name: info_nojs + type: info + label: JavaScript + default: This indexer requires that the web site not use JS when searching.
Access your account Preferences on the web site and change the set JavaScript level: setting to No JavaScript. + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 11 + options: + 11: created + 8: seeders + 4: size + 3: title + - name: type + type: select + label: Order requested from site + default: d + options: + d: desc + a: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 50 on your account preferences. + +login: + path: login/ + method: post + inputs: + loginform: show + page_history: disable + page_js_enabled: false + redirect: "{{ .Config.sitelink }}" + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + keeploggedin: on + restricttoip: "" + ok: Login + error: + - selector: div:contains("do not match") + test: + path: / + selector: a[href="/logout/"] + +search: + paths: + # https://themixingbowl.org/torrent/advancedsearch/?search=tmb&go=Search&freesearch=on&results-order1=11.d&results-page=1 + - path: torrent/advancedsearch/ + inputs: + search: "{{ .Keywords }}" + go: Search + artistsearch: "{{ .Query.Artist }}" + freesearch: "{{ if .Config.freeleech }}on{{ else }}{{ end }}" + results-order1: "{{ .Config.sort }}.{{ .Config.type }}" + results-page: 1 + # can search by genre but need join support. &tagsearch=acid,+house for Acid and House + + rows: + selector: table.torrenttable > tbody > tr:has(a[href^="/torrent/download/"]) + + fields: + category: + text: 1 + title: + selector: td.name a + details: + selector: td:nth-child(16) a + attribute: href + filters: + - name: append + args: "/details/" + download: + selector: a[href^="/torrent/download/"] + attribute: href + size: + selector: td:nth-child(5) + artist: + selector: span.artist + optional: true + genre: + selector: span.tag + optional: true + _codec: + selector: td:nth-child(6) + optional: true + _bit: + selector: td:nth-child(7) + optional: true + description: + text: "Artist=[{{ .Result.artist }}] , Tags={{ .Result.genre }} , Codec=[{{ .Result._codec }}] , BitRate=[{{ .Result._bit }}]" + grabs: + selector: td:nth-child(8) + seeders: + selector: td:nth-child(9) + leechers: + selector: td:nth-child(10) + date: + selector: td:nth-child(12) + # auto adjusted by site account profile + filters: + - name: replace + args: ["at", ""] + - name: dateparse + args: "d MMM yyyy HH:mm" + downloadvolumefactor: + case: + "img[src$=\"freeleech.png\"]": 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 +# engine n/a diff --git a/config/prowlarr/Definitions/thenewfun.yml b/config/prowlarr/Definitions/thenewfun.yml new file mode 100644 index 0000000..26362a9 --- /dev/null +++ b/config/prowlarr/Definitions/thenewfun.yml @@ -0,0 +1,179 @@ +--- +id: thenewfun +name: The-New-Fun +description: "The-New-Fun is a GERMAN Private Torrent Tracker for MOVIES / TV / GENERAL" +language: de-DE +type: private +encoding: UTF-8 +links: + - https://the-new-fun.com/ +legacylinks: + - https://the-new-fun.spdns.eu/ + +caps: + categorymappings: + - {id: 119, cat: Other, desc: "Bilder"} + - {id: 139, cat: TV/Documentary, desc: "Doku - HD"} + - {id: 141, cat: TV/Documentary, desc: "Doku - Pack"} + - {id: 140, cat: TV/Documentary, desc: "Doku - SD"} + - {id: 142, cat: TV/Documentary, desc: "Doku - Sonstige"} + - {id: 120, cat: Books, desc: "Ebook"} + - {id: 135, cat: Movies/UHD, desc: "Filme - 2160p"} + - {id: 131, cat: TV/Anime, desc: "Filme - Animie"} + - {id: 101, cat: Movies/BluRay, desc: "Filme - Blue Ray"} + - {id: 102, cat: Movies/Other, desc: "Filme - Bollywood"} + - {id: 149, cat: Movies/DVD, desc: "Filme - DVD"} + - {id: 104, cat: Movies/DVD, desc: "Filme - DVD-R"} + - {id: 135, cat: Movies/HD, desc: "Filme - HD"} + - {id: 130, cat: Movies, desc: "Filme - Klassiker"} + - {id: 147, cat: Movies, desc: "Filme - Pack"} + - {id: 134, cat: Movies/SD, desc: "Filme - SD"} + - {id: 136, cat: Movies/UHD, desc: "Filme - UHD"} + - {id: 105, cat: Movies/HD, desc: "Filme - x264/x265"} + - {id: 106, cat: Movies/SD, desc: "Filme - XviD / DivX"} + - {id: 127, cat: Movies, desc: "Für Unsere kleinsten"} + - {id: 121, cat: PC/Mobile-Other, desc: "Handy Stuff"} + - {id: 124, cat: Audio, desc: "Musik - Alben"} + - {id: 123, cat: Audio, desc: "Musik - Discography"} + - {id: 122, cat: Audio/Audiobook, desc: "Musik - Hörbuch"} + - {id: 133, cat: Audio/MP3, desc: "Musik - MP3/Mp4"} + - {id: 146, cat: Audio, desc: "Musik - Pack"} + - {id: 125, cat: Audio/Video, desc: "Musik - Video"} + - {id: 113, cat: PC, desc: "Programme - Linux"} + - {id: 114, cat: PC/Mac, desc: "Programme - Mac"} + - {id: 115, cat: PC/0day, desc: "Programme - Windows"} + - {id: 137, cat: TV/HD, desc: "Serien - HD"} + - {id: 116, cat: TV, desc: "Serien - Pack"} + - {id: 138, cat: TV/SD, desc: "Serien - SD"} + - {id: 143, cat: TV/Other, desc: "Serien - Sonstige"} + - {id: 144, cat: TV/UHD, desc: "Serien - UHD"} + - {id: 129, cat: Other, desc: "Sonstiges"} + - {id: 109, cat: PC/Mobile-Other, desc: "Spiele - Handy"} + - {id: 112, cat: Console, desc: "Spiele - Konsolen"} + - {id: 111, cat: PC/Games, desc: "Spiele - Mac / Linux"} + - {id: 110, cat: PC/Games, desc: "Spiele - PC"} + - {id: 118, cat: TV/Sport, desc: "WWE - Sport"} + - {id: 69, cat: XXX, desc: "XXX"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: onlyupload + type: checkbox + label: Filter OnlyUpload only + default: false + - name: info_free + type: info + label: About OnlyUpload at T-N-F + default: "
  • OnlyUpload are torrents where download is not counted but upload is. Good for building your Ratio up. (On the Prowlarr search results page these are tagged as Freeleech).
" + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeds: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents pro Seite: setting to 100 on your Control Panel. The default is 15. + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: td.tabletitle:contains("fehlgeschlagen") + test: + path: / + selector: a[href="logout.php"] + +search: + # https://the-new-fun.spdns.eu/browse.php?showsearch=1&c140=1&c142=1&search=2022+1080p&incldead=1&orderby=added&sort=desc + path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + showsearch: 1 + search: "{{ .Keywords }}" + # 0 active, 1 all, 2 dead + incldead: 1 + orderby: "{{ .Config.sort }}" + sort: "{{ .Config.type }}" + # site does not support imdbid search from the browse.php page or return imdb links in results + + rows: + selector: "table.tableinborder[cellspacing=\"1\"][cellpadding=\"0\"]:not(:has(a[href=\"index.php\"])) > tbody > tr:has(a[href^=\"download.php\"]){{ if .Config.onlyupload }}:has(img[src=\"pic/oupic.gif\"]){{ else }}{{ end }}" + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php"] + details: + selector: a[href^="details.php"] + attribute: href + download: + selector: a[href^="download.php"] + attribute: href + poster: + selector: img[id="img-1"] + attribute: src + size: + selector: td.tablea table tbody tr:nth-child(2) td:nth-child(1) b:nth-child(1) + files: + selector: td.tablea table tbody tr:nth-child(2) td:nth-child(1) b:nth-child(2) + seeders: + selector: td.tablea table tbody tr:nth-child(2) td:nth-child(2) b:nth-child(1) + leechers: + selector: td.tablea table tbody tr:nth-child(2) td:nth-child(2) > b:nth-of-type(2) + grabs: + selector: td.tablea table tbody tr:nth-child(2) td:nth-child(3) b:nth-child(1) + date: + selector: td.tablea table tbody tr:nth-child(2) td:nth-child(5) + filters: + - name: append + args: " +01:00" # CET + - name: replace + args: ["\xA0", " "] + - name: dateparse + args: "dd.MM.yyyy HH:mm:ss zzz" + downloadvolumefactor: + case: + img[src="pic/oupic.gif"]: 0 # only upload is counted + "*": 1 + uploadvolumefactor: + case: + img[src="pic/freeleech.gif"]: 0 # nothing is counted + "*": 1 + minimumratio: + text: 0.7 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# engine n/a diff --git a/config/prowlarr/Definitions/theoccult.yml b/config/prowlarr/Definitions/theoccult.yml new file mode 100644 index 0000000..36d943e --- /dev/null +++ b/config/prowlarr/Definitions/theoccult.yml @@ -0,0 +1,176 @@ +--- +id: theoccult +name: The Occult +description: "Cult E-Learning" +language: en-US +type: private +encoding: UTF-8 +links: + - https://theoccult.click/ +legacylinks: + - http://theoccult.click/ + +caps: + categorymappings: + - {id: 63, cat: Other, desc: "Academic / Reference"} + - {id: 21, cat: Other, desc: "Everything Else"} + - {id: 68, cat: Other, desc: "Mythology and Folklore"} + - {id: 61, cat: Other, desc: "Rajneesh"} + - {id: 1, cat: Other, desc: "Thelema / Crowley"} + - {id: 51, cat: Other, desc: "African/African Diaspora Relig"} + - {id: 30, cat: Other, desc: "Fourth Way"} + - {id: 17, cat: Other, desc: "Native American"} + - {id: 57, cat: Other, desc: "Ritual Magic"} + - {id: 74, cat: Other, desc: "Theosophy / Anthroposophy"} + - {id: 10, cat: Other, desc: "Alchemy"} + - {id: 7, cat: Other, desc: "Freemasonry"} + - {id: 54, cat: Other, desc: "New Age"} + - {id: 34, cat: Other, desc: "Rosicrucian"} + - {id: 73, cat: Other, desc: "Traditional Left-Hand Path"} + - {id: 69, cat: Other, desc: "Ancient Languages"} + - {id: 6, cat: Other, desc: "Golden Dawn"} + - {id: 76, cat: Other, desc: "Non-Dualism"} + - {id: 75, cat: Other, desc: "Sacred Geometry"} + - {id: 71, cat: Other, desc: "Traditional Witchcraft"} + - {id: 9, cat: Other, desc: "Astrology"} + - {id: 35, cat: Other, desc: "Grimoires"} + - {id: 52, cat: Other, desc: "Northern European Paganism"} + - {id: 31, cat: Other, desc: "Satanism"} + - {id: 77, cat: Other, desc: "Transpersonal Psychology"} + - {id: 25, cat: Other, desc: "Buddhism "} + - {id: 26, cat: Other, desc: "Hinduism"} + - {id: 70, cat: Other, desc: "Other Divination"} + - {id: 28, cat: Other, desc: "Shamanism"} + - {id: 19, cat: Other, desc: "Wicca / NeoWicca / Eclectic"} + - {id: 32, cat: Other, desc: "Chaos Magic "} + - {id: 64, cat: Other, desc: "Lovecraft Mythos"} + - {id: 67, cat: Other, desc: "Other Eastern Traditions"} + - {id: 56, cat: Other, desc: "Southern European Paganism"} + - {id: 20, cat: Other, desc: "Yoga / Tantra"} + - {id: 66, cat: Other, desc: "Energy Healing"} + - {id: 13, cat: Other, desc: "Lucid Dreams/Astral Projection"} + - {id: 49, cat: Other, desc: "Paranormal"} + - {id: 72, cat: Other, desc: "Specialty Presses"} + - {id: 4, cat: Other, desc: "Enochian"} + - {id: 14, cat: Other, desc: "Meditation"} + - {id: 33, cat: Other, desc: "Parapsychology"} + - {id: 58, cat: Other, desc: "Sufism"} + - {id: 11, cat: Other, desc: "Entheogens"} + - {id: 53, cat: Other, desc: "Middle Eastern Magic"} + - {id: 15, cat: Other, desc: "Philosophy"} + - {id: 55, cat: Other, desc: "Taoism / Daoism"} + - {id: 29, cat: Other, desc: "Esoteric Christianity"} + - {id: 65, cat: Other, desc: "Modern Grimoires"} + - {id: 12, cat: Other, desc: "Qabalah / Kabbalah / Cabala"} + - {id: 18, cat: Other, desc: "Tarot / Oracle Cards"} + + modes: + search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: DESC + options: + DESC: desc + ASC: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + - name: info_tcg + type: info + label: Message from the TCG staff + default: We wish to encourage all members to participate in the communities we are creating. We have worked with the Jackett maintainers to ensure that the security and longevity of our trackers continues, and as such some torrents are removed from the results in Jackett. + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: main.php + selector: a[href^="logout.php?id="] + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}" + search: "{{ .Keywords }}" + # 0 active, 1 incldead, 2 onlydead, 3 free (not used by request), 4 exclusive, 5 neutral + incldead: 1 + titleonly: 1 + # 0 Exact, 1 Fuzzy, 3 Parsed, 4 Simple # 2 Pure is not used + nonboolean: 0 + sort: "{{ .Config.sort }}" + d: "{{ .Config.type }}" + + rows: + selector: table[border="0"] > tbody > tr.ttable:has(a[href^="browse.php?cat="]):not(:has(font[color="blue"])):not(:contains("*TCG*")) + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + attribute: title + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php/"] + attribute: href + files: + selector: td:nth-child(4) + date: + selector: td:nth-child(6) + # auto adjusted by site account profile + filters: + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss" + size: + selector: td:nth-child(7) + grabs: + selector: td:nth-child(8) + filters: + - name: replace + args: ["Never", "0"] + seeders: + selector: td:nth-child(9) + leechers: + selector: td:nth-child(10) + downloadvolumefactor: + case: + "font[color=\"green\"]": 0 + "*": 1 + uploadvolumefactor: + case: + "font[color=\"green\"]": 0 + "*": 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 1 day (as seconds = 24 x 60 x 60) + text: 86400 +# XBTT TCG 0.98 diff --git a/config/prowlarr/Definitions/theoldschool-api.yml b/config/prowlarr/Definitions/theoldschool-api.yml new file mode 100644 index 0000000..9afd1d7 --- /dev/null +++ b/config/prowlarr/Definitions/theoldschool-api.yml @@ -0,0 +1,217 @@ +--- +id: theoldschool-api +name: The Old School (API) +description: "The Old School is a FRENCH Private Torrent Tracker for MOVIES / TV / GENERAL" +language: fr-FR +type: private +encoding: UTF-8 +links: + - https://theoldschool.cc/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Films"} + - {id: 6, cat: Movies, desc: "Films VOSTFR"} + - {id: 2, cat: TV, desc: "Series"} + - {id: 7, cat: TV, desc: "Series VOSTFR"} + - {id: 8, cat: TV, desc: "Series Pack"} + - {id: 9, cat: TV, desc: "Series Pack VOSTFR"} + - {id: 3, cat: Books, desc: "Ebooks"} + - {id: 4, cat: Console, desc: "Jeux"} + - {id: 5, cat: PC, desc: "Logiciel"} + - {id: 10, cat: TV/Sport, desc: "Sports"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + music-search: [q] + book-search: [q] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your The Old School account My Security page and clicking on the API Token tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: multilang + type: checkbox + label: Replace MULTi by another language in release name + default: false + - name: multilanguage + type: select + label: Replace MULTi by this language + default: FRENCH + options: + FRENCH: FRENCH + MULTi FRENCH: MULTi FRENCH + ENGLISH: ENGLISH + MULTi ENGLISH: MULTi ENGLISH + VOSTFR: VOSTFR + MULTi VOSTFR: MULTi VOSTFR + - name: vostfr + type: checkbox + label: Replace VOSTFR and SUBFRENCH with ENGLISH + default: false + - name: vfq + type: checkbox + label: Replace VFQ with FRENCH + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + inputs: {} # TODO: remove in v10 + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: "/api/torrents/filter" + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + # if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6 + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + seasonNumber: "{{ .Query.Season }}" + episodeNumber: "{{ .Query.Ep }}" + imdbId: "{{ .Query.IMDBIDShort }}" + tmdbId: "{{ .Query.TMDBID }}" + tvdbId: "{{ .Query.TVDBID }}" + "free[]": "{{ if .Config.freeleech }}100{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + + rows: + selector: data + attribute: attributes + count: + selector: meta.total + + fields: + category: + selector: category_id + title_phase1: + selector: name + title_vfq: + text: "{{ .Result.title_phase1 }}" + filters: + - name: re_replace + args: ["(?i)\\b(VFQ)\\b", "FRENCH"] + title_phase2: + text: "{{ if .Config.vfq }}{{ .Result.title_vfq }}{{ else }}{{ .Result.title_phase1 }}{{ end }}" + title_vostfr: + text: "{{ .Result.title_phase2 }}" + filters: + - name: re_replace + args: ["(?i)\\b(vostfr|subfrench)\\b", "ENGLISH"] + title_phase3: + text: "{{ if .Config.vostfr }}{{ .Result.title_vostfr }}{{ else }}{{ .Result.title_phase2 }}{{ end }}" + title_multilang: + text: "{{ .Result.title_phase3 }}" + filters: + - name: re_replace + args: ["(?i)\\b(MULTI(?!.*(?:FRENCH|ENGLISH|VOSTFR)))\\b", "{{ .Config.multilanguage }}"] + title: + text: "{{ if .Config.multilang }}{{ .Result.title_multilang }}{{ else }}{{ .Result.title_phase3 }}{{ end }}" + details: + selector: details_link + download: + selector: download_link + infohash: + selector: info_hash + poster: + selector: meta.poster + filters: + - name: replace + args: ["https://via.placeholder.com/90x135", ""] + imdbid: + selector: imdb_id + tmdbid: + selector: tmdb_id + tvdbid: + selector: tvdb_id + genre: + selector: meta.genres + filters: + - name: replace + args: [" & ", "_&_"] + description: + text: "{{ .Result.genre }}" + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0%, 25%, 50%, 75%, 100% + selector: freeleech + case: + 0%: 1 # not free + 25%: 0.75 + 50%: 0.5 + 75%: 0.25 + 100%: 0 # freeleech + "*": 0 # catch errors + uploadvolumefactor: + # api returns 0=false, 1=true + selector: double_upload + case: + 0: 1 # normal + 1: 2 # double +# global MR is 0.6 but torrents must be seeded for 2 days regardless of ratio +# minimumratio: +# text: 0.6 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# json UNIT3D custom edition 1.0.1 (based on 6.5.0) diff --git a/config/prowlarr/Definitions/thepiratebay.yml b/config/prowlarr/Definitions/thepiratebay.yml new file mode 100644 index 0000000..f5d0b4d --- /dev/null +++ b/config/prowlarr/Definitions/thepiratebay.yml @@ -0,0 +1,206 @@ +--- +id: thepiratebay +name: The Pirate Bay +description: "The Pirate Bay (TPB) is the galaxy’s most resilient Public BitTorrent site" +language: en-US +type: public +encoding: UTF-8 +links: + - https://thepiratebay.org/ + - https://tpb25.ukpass.co/ + - https://tpb.skynetcloud.site/ + - https://piratenow.xyz/ + - https://pirate-proxy.ink/ + - https://mirrorbay.top/ + - https://proxifiedpiratebay.org/ + - https://unlockedpiratebay.com/ + - https://tpb.one/ + - https://piratebayorg.net/ + - https://tpbproxy.click/ + - https://thepiratebay0.org/ + - https://thepiratebay10.org/ + - https://pirateproxy.live/ + - https://thehiddenbay.com/ + - https://thepiratebay.zone/ + - https://tpb.party/ + - https://piratebayproxy.live/ + - https://piratebay.live/ + - https://piratebay.party/ + - https://thepiratebay.party/ + - https://ukpiratebay.org/ +legacylinks: + - https://tpb19.ukpass.co/ + - https://pirateproxy.tube/ + - https://www.tpbay.win/ + - https://baypirated.site/ + - https://piratesbaycc.com/ + - https://pirateproxy.ltda/ + - https://tpb22.ukpass.co/ + - https://tpb.sadzawka.tk/ + - https://tpb.cnp.cx/ + - https://pirate-proxy.app/ + - https://thepb.cyou/ + - https://5mins.eu/ + - https://piratebayproxy.buzz/ + - https://wearethereal.ninja/ + - https://bibtor.com/ + - https://gigatorrent.xyz/ + - https://thepirateb.xyz/ + - https://ezrasstuff.com/ + - https://piratebayo3klnzokct3wt5yyxb2vpebbuyjl7m623iaxmqhsd52coid.onion.ws/ + - https://piratebayo3klnzokct3wt5yyxb2vpebbuyjl7m623iaxmqhsd52coid.onion.pet/ + - https://tpb24.ukpass.co/ + - https://thepiratebay.d4.re/ + - https://pirate-proxy.page/ + - https://5mins.shop/ + - https://tpb.surf/ + - https://tpb.monster/ + - https://thepiratebay.host/ + - https://piratetoday.xyz/ + - https://tpb.wtf/ + - https://piratebayo3klnzokct3wt5yyxb2vpebbuyjl7m623iaxmqhsd52coid.onion.ly/ + - https://piratebayo3klnzokct3wt5yyxb2vpebbuyjl7m623iaxmqhsd52coid.tor2web.to/ + - https://piratebayo3klnzokct3wt5yyxb2vpebbuyjl7m623iaxmqhsd52coid.tor2web.link/ # Origin is unreachable Error code 523 + +caps: + categorymappings: + # Audio + - {id: 100, cat: Audio, desc: "Audio"} + - {id: 101, cat: Audio, desc: "Music"} + - {id: 102, cat: Audio/Audiobook, desc: "Audio Books"} + - {id: 103, cat: Audio, desc: "Sound Clips"} + - {id: 104, cat: Audio/Lossless, desc: "FLAC"} + - {id: 199, cat: Audio/Other, desc: "Audio Other"} + # Video + - {id: 200, cat: Movies, desc: "Video"} + - {id: 201, cat: Movies, desc: "Movies"} + - {id: 202, cat: Movies, desc: "Movies DVDR"} + - {id: 203, cat: Audio/Video, desc: "Music Videos"} + - {id: 204, cat: Movies/Other, desc: "Movie Clips"} + - {id: 205, cat: TV, desc: "TV Shows"} + - {id: 206, cat: TV/Other, desc: "Handheld"} + - {id: 207, cat: Movies/HD, desc: "HD - Movies"} + - {id: 208, cat: TV/HD, desc: "HD - TV shows"} + - {id: 209, cat: Movies/3D, desc: "3D"} + - {id: 210, cat: Movies/SD, desc: "CAM/TS"} + - {id: 211, cat: Movies/UHD, desc: "UHD/4k - Movies"} + - {id: 212, cat: TV/UHD, desc: "UHD/4k - TV shows"} + - {id: 299, cat: Movies/Other, desc: "Video Other"} + # Applications + - {id: 300, cat: PC, desc: "Applications"} + - {id: 301, cat: PC, desc: "Windows"} + - {id: 302, cat: PC/Mac, desc: "Mac"} + - {id: 303, cat: PC, desc: "UNIX"} + - {id: 304, cat: PC/Mobile-Other, desc: "Handheld"} + - {id: 305, cat: PC/Mobile-iOS, desc: "IOS (iPad/iPhone)"} + - {id: 306, cat: PC/Mobile-Android, desc: "Android"} + - {id: 399, cat: PC, desc: "Other OS"} + # Games + - {id: 400, cat: Console, desc: "Games"} + - {id: 401, cat: PC/Games, desc: "PC"} + - {id: 402, cat: PC/Mac, desc: "Mac"} + - {id: 403, cat: Console/PS4, desc: "PSx"} + - {id: 404, cat: Console/XBox, desc: "XBOX360"} + - {id: 405, cat: Console/Wii, desc: "Wii"} + - {id: 406, cat: Console/Other, desc: "Handheld"} + - {id: 407, cat: Console/Other, desc: "IOS (iPad/iPhone)"} + - {id: 408, cat: Console/Other, desc: "Android"} + - {id: 499, cat: Console/Other, desc: "Games Other"} + # Porn + - {id: 500, cat: XXX, desc: "Porn"} + - {id: 501, cat: XXX, desc: "Movies"} + - {id: 502, cat: XXX/DVD, desc: "Movies DVDR"} + - {id: 503, cat: XXX/ImageSet, desc: "Pictures"} + - {id: 504, cat: XXX, desc: "Games"} + - {id: 505, cat: XXX/x264, desc: "HD - Movies"} + - {id: 506, cat: XXX, desc: "Movie Clips"} + - {id: 507, cat: XXX/UHD, desc: "UHD/4k - Movies"} + - {id: 599, cat: XXX/Other, desc: "Porn other"} + # Other + - {id: 600, cat: Other, desc: "Other"} + - {id: 601, cat: Books/EBook, desc: "E-books"} + - {id: 602, cat: Books/Comics, desc: "Comics"} + - {id: 603, cat: Books, desc: "Pictures"} + - {id: 604, cat: Books, desc: "Covers"} + - {id: 605, cat: Books, desc: "Physibles"} + - {id: 699, cat: Books/Other, desc: "Other Other"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: info_api + type: info + label: About this Indexer + default: This indexer uses the API at https://apibay.org/ to get its official TPB data. Choose any site link that you can access/prefer so that you can view the torrent details page when browsing the search results for this indexer. + +search: + paths: + # https://apibay.org/q.php?q=bad+batch&cat=100,101,102,103,104 + - path: "https://apibay.org/{{ if .Keywords }}q.php?q={{ .Keywords }}&cat={{ join .Categories \",\" }}{{ else }}precompiled/data_top100_recent.json{{ end }}" + response: + type: json + + keywordsfilters: + # remove it's #8829 + - name: re_replace + args: ["(?i)\\bit's\\b", ""] + # replace simplified Chinese as this confuses TPB search engine #7291 + - name: re_replace + args: ["([\\p{IsCJKUnifiedIdeographs}\\W]+)", "."] + # search for both S01 and Season 01 + - name: re_replace + args: ["(?i)\\b(S(\\d{2,3}))\\b", "$1|\"Season.$2\""] + # currently, the only uploader for General Hospital puts a space between season and episode + # this filter searches both formats, so 'General Hospital S01E02' becomes 'General Hospital S01E02|"S01 E02"' + - name: re_replace + args: ["(?i)\\b(General\\.Hospital)\\.((S\\d{2,3})(E\\d{2,3}))\\b", "$1.$2|\"$3.$4\""] + - name: tolower + + rows: + selector: $ + count: + selector: $[0].id + + fields: + _id: + selector: id + category: + selector: category + title: + selector: name + filters: + - name: re_replace + args: ["- (\\w+-?\\w*)$", "-$1"] + - name: re_replace # Season X / Season X Complete --> S0X + args: ["(?i)\\bSeason[\\s\\.]+(\\d)([\\s\\.]+Complete)?\\b", "S0$1"] + - name: re_replace # Season XX / Season XX Complete --> SXX + args: ["(?i)\\bSeason[\\s\\.]+(\\d{1,2})([\\s\\.]+Complete)?\\b", "S$1"] + description: + selector: name + details: + text: "{{ .Config.sitelink }}description.php?id={{ .Result._id }}" + infohash: + selector: info_hash + imdbid: + selector: imdb + date: + # unix + selector: added + size: + selector: size + files: + selector: num_files + seeders: + selector: seeders + leechers: + selector: leechers + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# json engine n/a diff --git a/config/prowlarr/Definitions/theplace.yml b/config/prowlarr/Definitions/theplace.yml new file mode 100644 index 0000000..15ada84 --- /dev/null +++ b/config/prowlarr/Definitions/theplace.yml @@ -0,0 +1,158 @@ +--- +id: theplace +name: The Place +description: "Self-improvement E-Learning" +language: en-US +type: private +encoding: UTF-8 +links: + - https://theplace.click/ +legacylinks: + - http://theplace.click/ + +caps: + categorymappings: + - {id: 46, cat: Other, desc: "Alpha Male Example Clips"} + - {id: 68, cat: Other, desc: "Author: Juggler"} + - {id: 69, cat: Other, desc: "Author: Sean Messenger"} + - {id: 42, cat: Other, desc: "Food / Drink / Cooking"} + - {id: 22, cat: Other, desc: "Seduction: Other"} + - {id: 60, cat: Other, desc: "Author: AMP"} + - {id: 70, cat: Other, desc: "Author: Michael Hall (NLP)"} + - {id: 61, cat: Other, desc: "Author: Style (Neil Strauss)"} + - {id: 47, cat: Other, desc: "Health / Fitness / Massage"} + - {id: 39, cat: Other, desc: "Seduction: Video"} + - {id: 51, cat: Other, desc: "Author: Anthony Robbins"} + - {id: 49, cat: Other, desc: "Author: Mystery"} + - {id: 66, cat: Other, desc: "Author: Vince Kelvin"} + - {id: 43, cat: Other, desc: "Hypnotism / NLP"} + - {id: 14, cat: Other, desc: "Seduction: Written"} + - {id: 50, cat: Other, desc: "Author: Carlos Xuma"} + - {id: 53, cat: Other, desc: "Author: Pickup101"} + - {id: 41, cat: Other, desc: "Dance / Singing / Voice"} + - {id: 44, cat: Other, desc: "Languages / Accents"} + - {id: 40, cat: Other, desc: "Sex"} + - {id: 48, cat: Other, desc: "Author: David DeAngelo"} + - {id: 65, cat: Other, desc: "Author: Richard Bandler (NLP)"} + - {id: 57, cat: Other, desc: "Everything Else"} + - {id: 45, cat: Other, desc: "Magic / Illusions / Tricks"} + - {id: 54, cat: Other, desc: "Author: David Shade"} + - {id: 52, cat: Other, desc: "Author: Ross Jeffries"} + - {id: 58, cat: Other, desc: "Fashion / Clothing / Grooming"} + - {id: 59, cat: Other, desc: "Psychology / Body Language"} + - {id: 71, cat: Other, desc: "Author: Jerry Stocking"} + - {id: 67, cat: Other, desc: "Author: RSD"} + - {id: 64, cat: Other, desc: "Fighting / Martial Arts"} + - {id: 38, cat: Other, desc: "Seduction: Audio"} + + modes: + search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: DESC + options: + DESC: desc + ASC: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + - name: info_tcg + type: info + label: Message from the TCG staff + default: We wish to encourage all members to participate in the communities we are creating. We have worked with the Jackett maintainers to ensure that the security and longevity of our trackers continues, and as such some torrents are removed from the results in Jackett. + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: main.php + selector: a[href^="logout.php?id="] + +search: + paths: + # https://thegeeks.click/browse.php?sort=added&h=6&d=DESC + - path: browse.php + inputs: + $raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}" + search: "{{ .Keywords }}" + # 0 active, 1 incldead, 2 onlydead, 3 free (not used by request), 4 exclusive, 5 neutral + incldead: 1 + titleonly: 1 + # 0 Exact, 1 Fuzzy, 3 Parsed, 4 Simple # 2 Pure is not used + nonboolean: 0 + sort: "{{ .Config.sort }}" + d: "{{ .Config.type }}" + + rows: + selector: table[border="0"] > tbody > tr.ttable:has(a[href^="browse.php?cat="]):not(:has(font[color="blue"])):not(:contains("*TCG*")) + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + attribute: title + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php/"] + attribute: href + files: + selector: td:nth-child(4) + date: + selector: td:nth-child(6) + # auto adjusted by site account profile + filters: + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss" + size: + selector: td:nth-child(7) + grabs: + selector: td:nth-child(8) + filters: + - name: replace + args: ["Never", "0"] + seeders: + selector: td:nth-child(9) + leechers: + selector: td:nth-child(10) + downloadvolumefactor: + case: + "font[color=\"green\"]": 0 + "*": 1 + uploadvolumefactor: + case: + "font[color=\"green\"]": 0 + "*": 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 1 day (as seconds = 24 x 60 x 60) + text: 86400 +# XBTT TCG 0.98 diff --git a/config/prowlarr/Definitions/therarbg.yml b/config/prowlarr/Definitions/therarbg.yml new file mode 100644 index 0000000..c9c9339 --- /dev/null +++ b/config/prowlarr/Definitions/therarbg.yml @@ -0,0 +1,107 @@ +--- +id: therarbg +name: TheRARBG +description: "TheRARBG is a Public site inspired by RARBG.to for TV / MOVIES / GENERAL" +language: en-US +type: public +encoding: UTF-8 +links: + - https://therarbg.to/ + - https://t-rb.org/ + - https://the.rarbg.club/ + - https://trb.archivebay.online/ + - https://trb.t-pb.org/ + - https://trb.themirror.wiki/ + - https://torrentlite.org/ # fork +legacylinks: + - https://therarbg.com/ + +caps: + categorymappings: + - {id: Movies, cat: Movies, desc: "Movies"} + - {id: TV, cat: TV, desc: "TV"} + - {id: Games, cat: PC/Games, desc: "Games"} + - {id: Music, cat: Audio, desc: "Music"} + - {id: Anime, cat: TV/Anime, desc: "Anime"} + - {id: Documentaries, cat: TV/Documentary, desc: "Documentaries"} + - {id: Apps, cat: PC/0day, desc: "Apps"} + - {id: Other, cat: Other, desc: "Other"} + - {id: Books, cat: Books, desc: "Books"} + - {id: XXX, cat: XXX, desc: "XXX"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: sort + type: select + label: Sort requested from site + default: -a + options: + -a: created desc + a: created asc + -se: seeders desc + se: seeders asc + -s: size desc + s: size asc + +download: + selectors: + - selector: a[href^="magnet:?xt="] + attribute: href + +search: + paths: + - path: "get-posts/order:{{ .Config.sort }}{{ range .Categories }}:category:{{.}}{{end}}{{ if or .Query.IMDBID .Keywords }}:keywords:{{ or .Query.IMDBID .Keywords }}{{ else }}{{ end }}/" + + rows: + selector: table > tbody > tr + + fields: + category: + selector: a[href^="/get-posts/category:"] + title: + selector: a[href^="/post-detail/"] + details: + selector: a[href^="/post-detail/"] + attribute: href + download: + selector: a[href^="/post-detail/"] + attribute: href + poster_src: + selector: span#fade.tooltip img + attribute: src + optional: true + poster: + selector: span#fade.tooltip img + attribute: data-src + optional: true + default: "{{ .Result.poster_src }}" + filters: + - name: re_replace + args: ["https://i.therarbg.com/np.jpg", ""] + imdbid: + selector: a[href^="/imdb-detail/tt"] + attribute: href + filters: + - name: regexp + args: "/imdb-detail/(.+?)/" + date: + selector: td:nth-child(5) + filters: + - name: timeago + size: + selector: td.sizeCell + seeders: + selector: td:nth-child(7) + leechers: + selector: td:nth-child(8) + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/therebels-api.yml b/config/prowlarr/Definitions/therebels-api.yml new file mode 100644 index 0000000..167c630 --- /dev/null +++ b/config/prowlarr/Definitions/therebels-api.yml @@ -0,0 +1,177 @@ +--- +id: therebels-api +name: TheRebels (API) +description: "TheRebels is a BRAZILIAN Private Torrent Tracker for MOVIES / TV / GENERAL" +language: pt-BR +type: private +encoding: UTF-8 +links: + - https://therebels.tv/ + +caps: + categorymappings: + - {id: 10, cat: TV/Anime, desc: "Animes"} + - {id: 5, cat: PC, desc: "Aplicativos"} + - {id: 12, cat: Audio/Audiobook, desc: "Audiobooks"} + - {id: 7, cat: XXX, desc: "Conteúdo Adulto"} + - {id: 9, cat: Other, desc: "Cursos"} + - {id: 8, cat: Books/EBook, desc: "E-Books"} + - {id: 1, cat: Movies, desc: "Filmes"} + - {id: 4, cat: Console, desc: "Jogos"} + - {id: 11, cat: Books/Mags, desc: "Revistas"} + - {id: 2, cat: TV, desc: "Series"} + - {id: 14, cat: TV/Anime, desc: "Animes"} + - {id: 15, cat: PC, desc: "Emulador"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + music-search: [q] + book-search: [q] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your TheRebels account My Security page and clicking on the API Token tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + inputs: {} # TODO: remove in v10 + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: "/api/torrents/filter" + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + # if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6 + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + seasonNumber: "{{ .Query.Season }}" + episodeNumber: "{{ .Query.Ep }}" + imdbId: "{{ .Query.IMDBIDShort }}" + tmdbId: "{{ .Query.TMDBID }}" + tvdbId: "{{ .Query.TVDBID }}" + "free[]": "{{ if .Config.freeleech }}100{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + + rows: + selector: data + attribute: attributes + + fields: + category: + selector: category_id + title: + selector: name + details: + selector: details_link + download: + selector: download_link + infohash: + selector: info_hash + poster: + selector: meta.poster + filters: + - name: replace + args: ["https://via.placeholder.com/90x135", ""] + imdbid: + selector: imdb_id + tmdbid: + selector: tmdb_id + tvdbid: + selector: tvdb_id + genre: + selector: meta.genres + filters: + - name: re_replace + args: ["(?i)(Ficção científica)", "Ficção_científica"] + - name: re_replace + args: ["(?i)(Cinema TV)", "Cinema_TV"] + - name: replace + args: [" & ", "_&_"] + description: + text: "{{ .Result.genre }}" + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0%, 25%, 50%, 75%, 100% + selector: freeleech + case: + 0%: 1 # not free + 25%: 0.75 + 50%: 0.5 + 75%: 0.25 + 100%: 0 # freeleech + "*": 0 # catch errors + uploadvolumefactor: + # api returns 0=false, 1=true + selector: double_upload + case: + 0: 1 # normal + 1: 2 # double +# global MR is 1.0 but torrents must be seeded for 2 days regardless of ratio +# minimumratio: +# text: 1.0 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# json UNIT3D 6.5.0 diff --git a/config/prowlarr/Definitions/thesceneplace.yml b/config/prowlarr/Definitions/thesceneplace.yml new file mode 100644 index 0000000..6eda1a8 --- /dev/null +++ b/config/prowlarr/Definitions/thesceneplace.yml @@ -0,0 +1,187 @@ +--- +id: thesceneplace +name: TheScenePlace +description: "TheScenePlace (TSP) is a Private site for TV / MOVIES / GENERAL" +language: en-US +type: private +encoding: UTF-8 +links: + - https://www.thesceneplace.com/ +legacylinks: + - http://www.thesceneplace.com/ # site is no longer forcing http + +caps: + categorymappings: + - {id: 13, cat: PC, desc: "Apps"} + - {id: 15, cat: TV/HD, desc: "TV x264"} + - {id: 16, cat: TV/HD, desc: "TV x265"} + - {id: 17, cat: TV/SD, desc: "TV XVID"} + - {id: 18, cat: TV, desc: "TV PACKS"} + - {id: 25, cat: TV, desc: "TV KIDS"} + - {id: 38, cat: TV/SD, desc: "TV 480p"} + - {id: 20, cat: Movies/HD, desc: "Movies x264"} + - {id: 21, cat: Movies/HD, desc: "Movies x265"} + - {id: 22, cat: Movies/SD, desc: "Movies XVID"} + - {id: 23, cat: Movies, desc: "Movies PACKS"} + - {id: 24, cat: Movies, desc: "Movies KIDS"} + - {id: 35, cat: Movies/UHD, desc: "Movies 4K/UHD"} + - {id: 36, cat: Movies/BluRay, desc: "Movies BluRay"} + - {id: 37, cat: Movies/SD, desc: "Movies 480p"} + - {id: 27, cat: Audio/MP3, desc: "Music MP3"} + - {id: 28, cat: Audio/Lossless, desc: "Music FLAC"} + - {id: 29, cat: Audio, desc: "Music PACKS"} + - {id: 34, cat: Audio, desc: "Music Karaoke "} + - {id: 30, cat: Books/EBook, desc: "eBooks"} + - {id: 32, cat: PC/Games, desc: "Games PC"} + - {id: 33, cat: Console, desc: "Games ROMS"} + - {id: 39, cat: Other, desc: "Misc"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 3 + options: + 3: created + 5: seeders + 4: size + 2: title + - name: type + type: select + label: Order requested from site + default: 2 + options: + 2: desc + 1: asc + - name: info + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: index.php?page=login + method: post + inputs: + uid: "{{ .Config.username }}" + pwd: "{{ .Config.password }}" + error: + - selector: tr td span[style="color:#FF0000;"] + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: index.php + inputs: + page: torrents + search: "{{ .Keywords }}" + category: "{{ range .Categories }}{{.}};{{end}}" + # 0 filename, 1 file&descr, 2 descr, 3 uploaders, 5 gold, 6 silver, 7 bronze + options: 0 + # 0 all, 1 active only, 2 dead only + active: 0 + order: "{{ .Config.sort }}" + by: "{{ .Config.type }}" + # does not support imdbid search and does not return imdb link in results + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + + rows: + selector: "table.lista > tbody > tr:has(a[href^=\"index.php?page=torrent-details&id=\"]):has(td[width=\"30\"]){{ if .Config.freeleech }}:has(img[src=\"images/freeleech.gif\"]){{ else }}{{ end }}{{ if .Config.freeleech }}, table.lista > tbody > tr:has(a[href^=\"index.php?page=torrent-details&id=\"]):has(td[width=\"30\"]):has(img[src=\"images/gold.gif\"]){{ else }}{{ end }}" + + fields: + title_torrent: + selector: a[href^="download.php?id="] + attribute: href + filters: + - name: querystring + args: f + - name: htmldecode + - name: re_replace + args: ["(?i)\\.torrent$", ""] + title_text: + selector: a[href^="index.php?page=torrent-details&id="] + category: + selector: a[href^="index.php?page=torrents&category="] + attribute: href + filters: + - name: querystring + args: category + title: + text: "{{ if .Result.title_torrent }}{{ .Result.title_torrent }}{{ else }}{{ .Result.title_text }}{{ end }}" + poster: + selector: a[href^="index.php?page=torrent-details&id="] + attribute: onmouseover + filters: + - name: regexp + args: "src=(.*?) " + - name: replace + args: ["torrentimg/nocover.jpg", ""] + details: + selector: a[href^="index.php?page=torrent-details&id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + _uploader: + selector: a[href^="index.php?page=userdetails"] + optional: true + date: + selector: td:has(a[href^="download.php?id="]) ~ td + # auto adjusted by site account profile + filters: + - name: dateparse + args: "dd/MM/yyyy" + seeders: + selector: td:has(a[href^="download.php?id="]) ~ td ~ td + leechers: + selector: td:has(a[href^="download.php?id="]) ~ td ~ td ~ td + grabs: + selector: td:has(a[href^="download.php?id="]) ~ td ~ td ~ td ~ td + size: + selector: "td:has(a[href^=\"download.php?id=\"]) ~ td ~ td ~ td ~ td ~ td{{ if .Result._uploader }} ~ td{{ else }}{{ end }}" + downloadvolumefactor: + case: + img[src="images/freeleech.gif"]: 0 + img[src="images/gold.gif"]: 0 + img[src="images/silver.gif"]: 0.5 + img[src="images/bronze.gif"]: 0.75 + "*": 1 + uploadvolumefactor: + case: + img[src="images/2x.gif"]: 2 + img[src="images/3x.gif"]: 3 + img[src="images/4x.gif"]: 4 + img[src="images/5x.gif"]: 5 + img[src="images/6x.gif"]: 6 + img[src="images/7x.gif"]: 7 + img[src="images/8x.gif"]: 8 + img[src="images/9x.gif"]: 9 + img[src="images/10x.gif"]: 10 + "*": 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 7 days (as seconds = 7 x 24 x 60 x 60) + text: 604800 +# xbtitFM v3.1.00 diff --git a/config/prowlarr/Definitions/theshinning-api.yml b/config/prowlarr/Definitions/theshinning-api.yml new file mode 100644 index 0000000..3da8584 --- /dev/null +++ b/config/prowlarr/Definitions/theshinning-api.yml @@ -0,0 +1,175 @@ +--- +id: theshinning-api +name: The Shinning (API) +description: "The Shinning (TsH) is a GERMAN Private Torrent Tracker for MOVIES / TV / GENERAL" +language: de-DE +type: private +encoding: UTF-8 +links: + - https://theshinning.me/ +legacylinks: + - https://theshinning.org + - https://theshinning.org/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Movies"} + - {id: 2, cat: TV, desc: "TV"} + - {id: 3, cat: Audio, desc: "Music"} + - {id: 4, cat: Console, desc: "Game"} + - {id: 5, cat: PC, desc: "Application"} + - {id: 7, cat: TV/Sport, desc: "Wrestling"} + - {id: 8, cat: Books, desc: "Ebooks"} + - {id: 11, cat: Movies, desc: "TSH-Movie"} + - {id: 12, cat: TV, desc: "TSH-Serien"} + - {id: 13, cat: XXX, desc: "XxX"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + music-search: [q] + book-search: [q] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your The Shinning account My Security page and clicking on the API Token tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + inputs: {} # TODO: remove in v10 + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: "/api/torrents/filter" + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + # if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6 + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + seasonNumber: "{{ .Query.Season }}" + episodeNumber: "{{ .Query.Ep }}" + imdbId: "{{ .Query.IMDBIDShort }}" + tmdbId: "{{ .Query.TMDBID }}" + tvdbId: "{{ .Query.TVDBID }}" + "free[]": "{{ if .Config.freeleech }}100{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + + rows: + selector: data + attribute: attributes + + fields: + category: + selector: category_id + title: + selector: name + details: + selector: details_link + download: + selector: download_link + infohash: + selector: info_hash + poster: + selector: meta.poster + filters: + - name: replace + args: ["https://via.placeholder.com/90x135", ""] + imdbid: + selector: imdb_id + tmdbid: + selector: tmdb_id + tvdbid: + selector: tvdb_id + genre: + selector: meta.genres + filters: + - name: re_replace + args: ["(?i)(Science Fiction)", "Science_Fiction"] + - name: re_replace + args: ["(?i)(TV Movie)", "TV_Movie"] + - name: replace + args: [" & ", "_&_"] + description: + text: "{{ .Result.genre }}" + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0%, 25%, 50%, 75%, 100% + selector: freeleech + case: + 0%: 1 # not free + 25%: 0.75 + 50%: 0.5 + 75%: 0.25 + 100%: 0 # freeleech + "*": 0 # catch errors + uploadvolumefactor: + # api returns 0=false, 1=true + selector: double_upload + case: + 0: 1 # normal + 1: 2 # double + minimumseedtime: + # 60h (as seconds = 60 x 60 x 60) + text: 216000 +# json UNIT3D 6.5.0 diff --git a/config/prowlarr/Definitions/theshow.yml b/config/prowlarr/Definitions/theshow.yml new file mode 100644 index 0000000..16664ea --- /dev/null +++ b/config/prowlarr/Definitions/theshow.yml @@ -0,0 +1,177 @@ +--- +id: theshow +name: The Show +description: "Entertainment E-Learning" +language: en-US +type: private +encoding: UTF-8 +links: + - https://theshow.click/ +legacylinks: + - http://theshow.click/ + +caps: + categorymappings: + - {id: 72, cat: Other, desc: "-empty-"} + - {id: 81, cat: Other, desc: "-empty-"} + - {id: 17, cat: Other, desc: "A-V: Film/Video Editing"} + - {id: 30, cat: Other, desc: "A-V: Sound Recording/Design"} + - {id: 6, cat: Other, desc: "A-V: Videography"} + - {id: 9, cat: Other, desc: "A-V: Visual FX"} + - {id: 29, cat: Other, desc: "Business / Distribution"} + - {id: 56, cat: Other, desc: "Creative Writing"} + - {id: 25, cat: Other, desc: "Digital Craft: 3D Modeling"} + - {id: 63, cat: Other, desc: "Everything Else"} + - {id: 65, cat: Other, desc: "Film History / Theory "} + - {id: 64, cat: Other, desc: "Graphics / Photo Editing"} + - {id: 32, cat: Other, desc: "Magazines / Trade Journals"} + - {id: 66, cat: Other, desc: "Mindset / Creativity"} + - {id: 67, cat: Other, desc: "Music Business / Promotion"} + - {id: 73, cat: Other, desc: "Music: Shows/Special Events"} + - {id: 200, cat: Other, desc: "NEW A-V: Videography"} + - {id: 70, cat: Other, desc: "Performances: Competitions"} + - {id: 94, cat: Other, desc: "Performances: Dance/Ballet"} + - {id: 82, cat: Other, desc: "Performances: Drama/Art"} + - {id: 76, cat: Other, desc: "Performances: Sketch/Improv"} + - {id: 75, cat: Other, desc: "Performances: Spoken Word"} + - {id: 78, cat: Other, desc: "Performances: Standup Comedy"} + - {id: 51, cat: Other, desc: "Performing Craft: Acting"} + - {id: 4, cat: Other, desc: "Performing Craft: Dance"} + - {id: 10, cat: Other, desc: "Production: Cinematography"} + - {id: 1, cat: Other, desc: "Production: Directing (Film)"} + - {id: 7, cat: Other, desc: "Production: Directing(Theatre)"} + - {id: 53, cat: Other, desc: "Production: Visuals"} + - {id: 77, cat: Other, desc: "Radio: Comedy/Drama/Mystery"} + - {id: 79, cat: Other, desc: "Radio: Entertain/Arts/Narrativ"} + - {id: 80, cat: Other, desc: "Radio: Music Performances"} + - {id: 83, cat: Other, desc: "Scripts: Radio"} + - {id: 84, cat: Other, desc: "Scripts: Television"} + - {id: 85, cat: Other, desc: "Scripts: Theatre"} + - {id: 49, cat: Other, desc: "Software / Tutorials"} + - {id: 26, cat: Other, desc: "Stock: Film / Video"} + - {id: 54, cat: Other, desc: "Stock: Music / Sound FX"} + - {id: 13, cat: Other, desc: "Stock: Photos / Illustrations"} + - {id: 69, cat: Other, desc: "TV Shows: Action/Drama/Mystery"} + - {id: 68, cat: Other, desc: "TV Shows: Comedy"} + - {id: 71, cat: Other, desc: "TV Shows: Entertain/Chat/Goss"} + - {id: 92, cat: Other, desc: "Visual Craft: Design Theory"} + - {id: 91, cat: Other, desc: "Visual Craft: Drawing/Drafting"} + - {id: 87, cat: Other, desc: "Visual Craft: Fashion/Makeup"} + - {id: 90, cat: Other, desc: "Visual Craft: Handcraft/Sculpt"} + - {id: 93, cat: Other, desc: "Visual Craft: Jewelry Making"} + - {id: 11, cat: Other, desc: "Visual Craft: Needlework"} + - {id: 52, cat: Other, desc: "Visual Craft: Photography"} + - {id: 89, cat: Other, desc: "Visual Craft: Scrapbooking"} + - {id: 88, cat: Other, desc: "Visual Craft: Tattoos/Body Art"} + - {id: 21, cat: Other, desc: "Writing Craft: Screenwriting"} + + modes: + search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: DESC + options: + DESC: desc + ASC: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + - name: info_tcg + type: info + label: Message from TCG staff + default: We wish to encourage all members to participate in the communities we are creating. We have worked with the Jackett maintainers to ensure that the security and longevity of our trackers continues, and as such some torrents are removed from the results in Jackett. + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: main.php + selector: a[href^="logout.php?id="] + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}" + search: "{{ .Keywords }}" + # 0 active, 1 incldead, 2 onlydead, 3 free (not used by request), 4 exclusive, 5 neutral + incldead: 1 + titleonly: 1 + # 0 Exact, 1 Fuzzy, 3 Parsed, 4 Simple # 2 Pure is not used + nonboolean: 0 + sort: "{{ .Config.sort }}" + d: "{{ .Config.type }}" + + rows: + selector: table[border="0"] > tbody > tr.ttable:has(a[href^="browse.php?cat="]):not(:has(font[color="blue"])):not(:contains("*TCG*")) + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + attribute: title + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php/"] + attribute: href + files: + selector: td:nth-child(4) + date: + selector: td:nth-child(6) + # auto adjusted by site account profile + filters: + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss" + size: + selector: td:nth-child(7) + grabs: + selector: td:nth-child(8) + filters: + - name: replace + args: ["Never", "0"] + seeders: + selector: td:nth-child(9) + leechers: + selector: td:nth-child(10) + downloadvolumefactor: + case: + "font[color=\"green\"]": 0 + "*": 1 + uploadvolumefactor: + case: + "font[color=\"green\"]": 0 + "*": 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 1 day (as seconds = 24 x 60 x 60) + text: 86400 +# XBTT TCG 0.98 diff --git a/config/prowlarr/Definitions/thevault.yml b/config/prowlarr/Definitions/thevault.yml new file mode 100644 index 0000000..a4191c9 --- /dev/null +++ b/config/prowlarr/Definitions/thevault.yml @@ -0,0 +1,175 @@ +--- +id: thevault +name: The Vault +description: "Business/Marketing E-Learning" +language: en-US +type: private +encoding: UTF-8 +links: + - https://thevault.click/ +legacylinks: + - http://thevault.click/ + +caps: + categorymappings: + - {id: 87, cat: Other, desc: "Author: Brian Tracy"} + - {id: 106, cat: Other, desc: "Autobiographies / Biographies"} + - {id: 67, cat: Other, desc: "Investing / Trading / Stocks"} + - {id: 93, cat: Other, desc: "Negotiation / Contracts"} + - {id: 99, cat: Other, desc: "Net: Traffic Generation"} + - {id: 107, cat: Other, desc: "Author: Dan Kennedy"} + - {id: 118, cat: Other, desc: "Ayn Rand / Objectivism"} + - {id: 75, cat: Other, desc: "Magazines"} + - {id: 97, cat: Other, desc: "Net: Affiliate Schemes"} + - {id: 102, cat: Other, desc: "Net: Web Site/Blog Templates"} + - {id: 110, cat: Other, desc: "Author: Dan Pena"} + - {id: 112, cat: Other, desc: "Consulting"} + - {id: 70, cat: Other, desc: "Management / Leadership"} + - {id: 105, cat: Other, desc: "Net: Blogging"} + - {id: 114, cat: Other, desc: "Network Marketing (MLM)"} + - {id: 117, cat: Other, desc: "Author: Eben Pagan"} + - {id: 94, cat: Other, desc: "Copywriting"} + - {id: 85, cat: Other, desc: "Mindset / Achievement"} + - {id: 76, cat: Other, desc: "Net: E-Commerce"} + - {id: 111, cat: Other, desc: "Offshore / Tax Avoidance"} + - {id: 92, cat: Other, desc: "Author: Jay Abraham"} + - {id: 103, cat: Other, desc: "Corporate Design / Branding"} + - {id: 80, cat: Other, desc: "Misc: Audio"} + - {id: 100, cat: Other, desc: "Net: eBay / Online Auctions"} + - {id: 116, cat: Other, desc: "Private Label Rights (PLR)"} + - {id: 89, cat: Other, desc: "Author: Jim Rohn"} + - {id: 84, cat: Other, desc: "Customer Service"} + - {id: 90, cat: Other, desc: "Misc: Other"} + - {id: 115, cat: Other, desc: "Net: Email Marketing"} + - {id: 68, cat: Other, desc: "Real Estate / Property Develop"} + - {id: 96, cat: Other, desc: "Author: John Reese"} + - {id: 65, cat: Other, desc: "Economics / Finance"} + - {id: 83, cat: Other, desc: "Misc: Software"} + - {id: 95, cat: Other, desc: "Net: Marketing"} + - {id: 104, cat: Other, desc: "Recruitment / Interviewing"} + - {id: 63, cat: Other, desc: "Author: Robert Kiyosaki"} + - {id: 113, cat: Other, desc: "Entertainment Business"} + - {id: 81, cat: Other, desc: "Misc: Video"} + - {id: 101, cat: Other, desc: "Net: Misc"} + - {id: 71, cat: Other, desc: "Sales / Marketing"} + - {id: 86, cat: Other, desc: "Author: T Harv Eker"} + - {id: 109, cat: Other, desc: "Gambling / Betting"} + - {id: 82, cat: Other, desc: "Misc: Written / E-Books"} + - {id: 98, cat: Other, desc: "Net: Pay-Per-Click Advertising"} + - {id: 72, cat: Other, desc: "Small Business / Entrepreneurs"} + - {id: 88, cat: Other, desc: "Author: Zig Ziglar"} + - {id: 73, cat: Other, desc: "Hypnosis / NLP"} + - {id: 62, cat: Other, desc: "Money Management / Taxes"} + - {id: 108, cat: Other, desc: "Net: Search Engine Optimizing"} + - {id: 91, cat: Other, desc: "TTC Lectures"} + + modes: + search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: DESC + options: + DESC: desc + ASC: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + - name: info_tcg + type: info + label: Message from the TCG staff + default: We wish to encourage all members to participate in the communities we are creating. We have worked with the Jackett maintainers to ensure that the security and longevity of our trackers continues, and as such some torrents are removed from the results in Jackett. + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: main.php + selector: a[href^="logout.php?id="] + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}" + search: "{{ .Keywords }}" + # 0 active, 1 incldead, 2 onlydead, 3 free (not used by request), 4 exclusive, 5 neutral + incldead: 1 + titleonly: 1 + # 0 Exact, 1 Fuzzy, 3 Parsed, 4 Simple # 2 Pure is not used + nonboolean: 0 + sort: "{{ .Config.sort }}" + d: "{{ .Config.type }}" + + rows: + selector: table[border="0"] > tbody > tr.ttable:has(a[href^="browse.php?cat="]):not(:has(font[color="blue"])):not(:contains("*TCG*")) + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + attribute: title + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php/"] + attribute: href + files: + selector: td:nth-child(4) + date: + selector: td:nth-child(6) + # auto adjusted by site account profile + filters: + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss" + size: + selector: td:nth-child(7) + grabs: + selector: td:nth-child(8) + filters: + - name: replace + args: ["Never", "0"] + seeders: + selector: td:nth-child(9) + leechers: + selector: td:nth-child(10) + downloadvolumefactor: + case: + "font[color=\"green\"]": 0 + "*": 1 + uploadvolumefactor: + case: + "font[color=\"green\"]": 0 + "*": 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 1 day (as seconds = 24 x 60 x 60) + text: 86400 +# XBTT TCG 0.98 diff --git a/config/prowlarr/Definitions/thorsland.yml b/config/prowlarr/Definitions/thorsland.yml new file mode 100644 index 0000000..e1b2aaf --- /dev/null +++ b/config/prowlarr/Definitions/thorsland.yml @@ -0,0 +1,316 @@ +--- +id: thorsland +name: Thor's Land +description: "Thor's Land is a FRENCH Private site for TV / MOVIES / GENERAL" +language: fr-FR +type: private +encoding: UTF-8 +links: + - https://ethor.tk/ + +caps: + categorymappings: + # APPLICATIONS + - {id: 66, cat: PC/Mobile-Android, desc: "ANDROID"} + - {id: 68, cat: PC/Mobile-Other, desc: "HarmonyOS"} + - {id: 67, cat: PC/Mac, desc: "iOS"} + # AUTRES + - {id: 104, cat: Other, desc: "AUTRES"} + # DOCUMENTAIRES FILM + - {id: 72, cat: TV/Documentary, desc: "4K UHD"} + - {id: 70, cat: TV/Documentary, desc: "HD 1080p"} + - {id: 71, cat: TV/Documentary, desc: "HD 720p"} + - {id: 119, cat: TV/Documentary, desc: "Québec HD"} + - {id: 118, cat: TV/Documentary, desc: "Québec SD"} + - {id: 69, cat: TV/Documentary, desc: "SD"} + - {id: 78, cat: TV/Documentary, desc: "V.O.S.T. 4K"} + - {id: 77, cat: TV/Documentary, desc: "V.O.S.T. HD"} + - {id: 76, cat: TV/Documentary, desc: "V.O.S.T. SD"} + # DOCUMENTAIRES SERIES + - {id: 81, cat: TV/Documentary, desc: "PACK 4K"} + - {id: 80, cat: TV/Documentary, desc: "PACK HD"} + - {id: 121, cat: TV/Documentary, desc: "PACK HD QC"} + - {id: 79, cat: TV/Documentary, desc: "PACK SD"} + - {id: 121, cat: TV/Documentary, desc: "PACK SD QC"} + - {id: 117, cat: TV/Documentary, desc: "Québec HD"} + - {id: 116, cat: TV/Documentary, desc: "Québec SD"} + - {id: 75, cat: TV/Documentary, desc: "SÉRIES 4K"} + - {id: 74, cat: TV/Documentary, desc: "SÉRIES HD"} + - {id: 73, cat: TV/Documentary, desc: "SÉRIES SD"} + - {id: 115, cat: TV/Documentary, desc: "V.O.S.T. 4K"} + - {id: 114, cat: TV/Documentary, desc: "V.O.S.T. HD"} + - {id: 113, cat: TV/Documentary, desc: "V.O.S.T. SD"} + # FILMS + - {id: 11, cat: Movies/3D, desc: "3D"} + - {id: 12, cat: Movies/UHD, desc: "4K UHD"} + - {id: 2, cat: Movies/BluRay, desc: "BD-Rip"} + - {id: 10, cat: Movies/BluRay, desc: "Blu-Ray"} + - {id: 16, cat: Movies/DVD, desc: "DVD-R"} + - {id: 3, cat: Movies/DVD, desc: "DVD-Rip"} + - {id: 5, cat: Movies/HD, desc: "HD 1080p"} + - {id: 4, cat: Movies/HD, desc: "HD 720p"} + - {id: 7, cat: Movies/HD, desc: "mHD 1080p"} + - {id: 6, cat: Movies/HD, desc: "mHD 720p"} + - {id: 15, cat: Movies/UHD, desc: "Québec 4K"} + - {id: 14, cat: Movies/HD, desc: "Québec HD"} + - {id: 13, cat: Movies/SD, desc: "Québec SD"} + - {id: 9, cat: Movies, desc: "Remux"} + - {id: 22, cat: Movies/UHD, desc: "V.O. 4K"} + - {id: 21, cat: Movies/HD, desc: "V.O. HD"} + - {id: 20, cat: Movies/SD, desc: "V.O. SD"} + - {id: 19, cat: Movies/UHD, desc: "V.O.S.T. 4K"} + - {id: 18, cat: Movies/HD, desc: "V.O.S.T. HD"} + - {id: 17, cat: Movies/SD, desc: "V.O.S.T. SD"} + - {id: 1, cat: Movies/WEB-DL, desc: "WEB-DL"} + - {id: 8, cat: Movies/HD, desc: "x265"} + # JEUX VIDÉO + - {id: 55, cat: PC/Games, desc: "ÉMULATEURS"} + - {id: 40, cat: PC/Games, desc: "LINUX"} + - {id: 39, cat: PC/Mac, desc: "MAC"} + - {id: 45, cat: Console/3DS, desc: "3DS"} + - {id: 44, cat: Console/NDS, desc: "NDS"} + - {id: 42, cat: Console/Other, desc: "NES"} + - {id: 41, cat: Movies/Other, desc: "SWITCH"} + - {id: 38, cat: PC/Games, desc: "PC"} + - {id: 46, cat: Console/PS3, desc: "PSX"} + - {id: 47, cat: Console/PS3, desc: "PS2"} + - {id: 48, cat: Console/PS3, desc: "PS3"} + - {id: 49, cat: Console/PS4, desc: "PS4"} + - {id: 50, cat: Console/PS4, desc: "PS5"} + - {id: 56, cat: Console/Other, desc: "ROMS"} + - {id: 43, cat: Console/Other, desc: "SNES"} + - {id: 51, cat: Console/XBox, desc: "XBOX"} + - {id: 52, cat: Console/XBox 360, desc: "XBOX 360"} + - {id: 53, cat: Console/XBox One, desc: "XBOX ONE"} + - {id: 54, cat: Console/XBox, desc: "XBOX SERIES"} + # LIVRES + - {id: 96, cat: Audio/Audiobook, desc: "AUDIO"} + - {id: 98, cat: Books, desc: "B.D."} + - {id: 100, cat: Books/Comics, desc: "COMICS"} + - {id: 97, cat: Books/Mags, desc: "MAGAZINES"} + - {id: 101, cat: Books, desc: "MANGAS"} + - {id: 95, cat: Books, desc: "ROMANS"} + - {id: 99, cat: Books, desc: "JEUNESSE"} + # LOGICIELS + - {id: 65, cat: PC, desc: "LINUX"} + - {id: 64, cat: PC/Mac, desc: "MAC"} + - {id: 63, cat: PC/0day, desc: "WINDOWS"} + # MUSIQUE + - {id: 59, cat: Audio, desc: "AAC"} + - {id: 61, cat: Audio, desc: "DSD"} + - {id: 58, cat: Audio/Lossless, desc: "FLAC"} + - {id: 57, cat: Audio/MP3, desc: "MP3"} + - {id: 60, cat: Audio, desc: "OGG"} + - {id: 62, cat: Audio, desc: "WAV"} + # SÉRIES ANIMÉES + - {id: 89, cat: TV/Anime, desc: "HD 1080p"} + - {id: 90, cat: TV/Anime, desc: "HD 720p"} + - {id: 94, cat: TV/Anime, desc: "PACK HD"} + - {id: 93, cat: TV/Anime, desc: "PACK SD"} + - {id: 88, cat: TV/Anime, desc: "Québec HD"} + - {id: 87, cat: TV/Anime, desc: "Québec SD"} + - {id: 92, cat: TV/Anime, desc: "V.O.S.T. HD"} + - {id: 91, cat: TV/Anime, desc: "V.O.S.T. SD"} + # SÉRIES TV + - {id: 112, cat: TV/UHD, desc: "4K UHD"} + - {id: 32, cat: TV/HD, desc: "Blu-Ray"} + - {id: 35, cat: TV, desc: "DVD-R"} + - {id: 31, cat: TV/HD, desc: "Émissions HD"} + - {id: 30, cat: TV/SD, desc: "Émissions SD"} + - {id: 25, cat: TV/HD, desc: "HD 1080p"} + - {id: 24, cat: TV/HD, desc: "HD 720p"} + - {id: 27, cat: TV/HD, desc: "PACK HD"} + - {id: 34, cat: TV/HD, desc: "PACK HD QC"} + - {id: 26, cat: TV/SD, desc: "PACK SD"} + - {id: 33, cat: TV/SD, desc: "PACK SD QC"} + - {id: 29, cat: TV/HD, desc: "Québec HD"} + - {id: 28, cat: TV/SD, desc: "Québec SD"} + - {id: 23, cat: TV/SD, desc: "SD"} + - {id: 37, cat: TV/HD, desc: "V.O.S.T. HD"} + - {id: 36, cat: TV/SD, desc: "V.O.S.T. SD"} + # SPECTACLES + - {id: 85, cat: Audio/Video, desc: "ART/MAGIE"} + - {id: 83, cat: Audio/Video, desc: "HUMOUR"} + - {id: 86, cat: Audio/Video, desc: "LIVE"} + - {id: 82, cat: Audio/Video, desc: "MUSIQUE"} + - {id: 84, cat: Audio/Video, desc: "THÉATRE"} + # SPORTS + - {id: 103, cat: TV/Sport, desc: "ANGLAIS"} + - {id: 102, cat: TV/Sport, desc: "FRANÇAIS"} + # XXX + - {id: 105, cat: XXX, desc: "FILMS"} + - {id: 108, cat: XXX, desc: "GAYS"} + - {id: 110, cat: XXX, desc: "HENTAI"} + - {id: 109, cat: XXX, desc: "LESBIENNES"} + - {id: 111, cat: XXX, desc: "MAGAZINES"} + - {id: 106, cat: XXX, desc: "SÉRIES"} + - {id: 107, cat: XXX, desc: "VR"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: multilang + type: checkbox + label: Replace MULTi by another language in release name + default: false + - name: multilanguage + type: select + label: Replace MULTi by this language + default: FRENCH + options: + FRENCH: FRENCH + MULTi FRENCH: MULTi FRENCH + ENGLISH: ENGLISH + MULTi ENGLISH: MULTi ENGLISH + VOSTFR: VOSTFR + MULTi VOSTFR: MULTi VOSTFR + - name: vostfr + type: checkbox + label: Replace VOSTFR and SUBFRENCH with ENGLISH + default: false + - name: sort + type: select + label: Sort requested from site + default: id + options: + id: created + seeders: seeders + size: size + name: title + - name: order + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: / + selector: a[href="account-logout"] + +download: + before: + path: thanks + inputs: + id: "{{ .DownloadUri.Query.id }}" + to: give + torrent: "{{ .DownloadUri.Query.id }}" + selectors: + - selector: a[href^="download?id="], a[href^="magnet:?xt="] + attribute: href + +search: + paths: + - path: torrents-search + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 active, 1 incldead, 2 onlydead + incldead: 1 + # 0 all, 1 notfree, 2 onlyfree + freeleech: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 any etc + lang: 0 + sort: "{{ .Config.sort}}" + order: "{{ .Config.order}}" + + rows: + selector: table.ttable_headinner > tbody > tr[class^="t-row"] + + fields: + category: + selector: a[href^="/torrents?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_phase1: + selector: a[href^="/download?id="] + attribute: href + filters: + - name: regexp + args: name=(.+?)\.torrent + - name: urldecode + title_vostfr: + text: "{{ .Result.title_phase1 }}" + filters: + - name: re_replace + args: ["(?i)\\b(vostfr|subfrench)\\b", "ENGLISH"] + title_phase2: + text: "{{ if .Config.vostfr }}{{ .Result.title_vostfr }}{{ else }}{{ .Result.title_phase1 }}{{ end }}" + title_multilang: + text: "{{ .Result.title_phase2 }}" + filters: + - name: re_replace + args: ["(?i)\\b(MULTI(?!.*(?:FRENCH|ENGLISH|VOSTFR)))\\b", "{{ .Config.multilanguage }}"] + title: + text: "{{ if .Config.multilang }}{{ .Result.title_multilang }}{{ else }}{{ .Result.title_phase2 }}{{ end }}" + details: + selector: a[href^="/torrents-details?id="] + attribute: href + download: + selector: a[href^="/torrents-details?id="] + attribute: href + poster: + selector: img[src^="uploads/images/"] + attribute: src + size: + selector: td:nth-child(10) + remove: div.bottom + grabs: + selector: td:nth-child(9) + remove: div.bottom + seeders: + selector: td:nth-child(11) + remove: div.bottom + leechers: + selector: td:nth-child(12) + remove: div.bottom + date: + selector: td.tor_name_outline > font + filters: + - name: replace + args: ["il y a ", ""] + - name: replace + args: ["seconde", "second"] + - name: replace + args: ["heure", "hour"] + - name: replace + args: ["jour", "day"] + - name: replace + args: ["mois", "month"] + - name: replace + args: ["an", "year"] + - name: append + args: " ago" + downloadvolumefactor: + case: + "button:contains(\"FREELEECH\")": 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# engine n/a diff --git a/config/prowlarr/Definitions/tjupt.yml b/config/prowlarr/Definitions/tjupt.yml new file mode 100644 index 0000000..8a8af40 --- /dev/null +++ b/config/prowlarr/Definitions/tjupt.yml @@ -0,0 +1,177 @@ +--- +id: tjupt +name: TJUPT +description: "TJUPT is a CHINESE Private Torrent Tracker for GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://tjupt.org/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "Movies电影"} + - {id: 402, cat: TV, desc: "TV Series剧集"} + - {id: 403, cat: TV, desc: "TV Shows综艺"} + - {id: 404, cat: TV/Documentary, desc: "Documentaries资料"} + - {id: 405, cat: TV/Anime, desc: "Animations动漫"} + - {id: 406, cat: Audio/Video, desc: "Music Videos音乐"} + - {id: 407, cat: TV/Sport, desc: "Sports体育"} + - {id: 408, cat: PC, desc: "Software软件"} + - {id: 409, cat: Console, desc: "Games游戏"} + - {id: 411, cat: Books, desc: "Books纪录片"} + - {id: 412, cat: PC/Mobile-Other, desc: "Mobile移动视频"} + - {id: 410, cat: Other, desc: "Misc其他"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + logout: 90days + error: + - selector: td.embedded:has(h2:contains("失败")) + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + # https://tjupt.org/torrents.php?incldead=0&spstate=0&picktype=0&inclbookmarked=0&search=&search_area=0&search_mode=0 + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + # currently supports only one query id at one time. + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 popular, 3 classic, 4 recomended, 5 0day, 6 imdb top 250 + picktype: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30%, 8 special offer, 9 all promotions + spstate: "{{ if .Config.freeleech }}9{{ else }}0{{ end }}" + # 0 title, 1 descr, 2 subtitltes, 3 uploader, 4 imdburl + search_area: "{{ if .Query.IMDBID }}4{{ else }}{{ end }}{{ if .Query.DoubanID }}1{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }}{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href*="cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + filters: + - name: re_replace + args: ["^\\[([^\\]]+)\\]\\[([^\\]]+)\\]\\[([^\\]]+)\\](.*)$", "$3 [$1][$2]$4"] + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td:nth-child(5) + seeders: + selector: td:nth-child(6) + leechers: + selector: td:nth-child(7) + grabs: + selector: td:nth-child(8) + downloadvolumefactor: + case: + font.free: 0 + font.twoupfree: 0 + font.halfdown: 0.5 + font.twouphalfdown: 0.5 + font.thirtypercent: 0.3 + "*": 1 + uploadvolumefactor: + case: + font.twouphalfdown: 2 + font.twoupfree: 2 + font.twoup: 2 + "*": 1 + minimumratio: + text: 0.8 + description: + selector: td:nth-child(2) + remove: a, b, font, img, span +# NexusPHP Standard v1.5 Beta 4 (custom ulvf dlvf) diff --git a/config/prowlarr/Definitions/tlfbits.yml b/config/prowlarr/Definitions/tlfbits.yml new file mode 100644 index 0000000..a0cc61e --- /dev/null +++ b/config/prowlarr/Definitions/tlfbits.yml @@ -0,0 +1,175 @@ +--- +id: tlfbits +name: TLFBits +description: "TLFBits is a CHINESE Private Torrent Tracker for HD MOVIES / TV" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://pt.eastgame.org/ + +caps: + categorymappings: + - {id: 438, cat: Movies, desc: "电影 (Movie)"} + - {id: 440, cat: TV, desc: "电视剧(TV series)"} + - {id: 441, cat: TV, desc: "综艺 (TV Show)"} + - {id: 442, cat: TV/Anime, desc: "动漫 (Anime)"} + - {id: 443, cat: TV/Documentary, desc: "纪录片 (Documentary)"} + - {id: 444, cat: TV/Sport, desc: "体育 (Sport)"} + - {id: 445, cat: Audio/Video, desc: "音乐视频 (Music Video)"} + - {id: 446, cat: Audio, desc: "音乐(Music)"} + - {id: 447, cat: PC/Games, desc: "游戏 (Game)"} + - {id: 448, cat: PC/0day, desc: "软件 (Software)"} + - {id: 449, cat: Other/Misc, desc: "资料(E-Learning)"} + - {id: 450, cat: Other, desc: "其它 (Other)"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("失败")) + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl + search_area: "{{ if .Query.IMDBID }}4{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + imdbid: + selector: div.imdb_100 > a + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td:nth-child(5) + seeders: + selector: td:nth-child(6) + leechers: + selector: td:nth-child(7) + grabs: + selector: td:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + description: + selector: td:nth-child(2) + remove: a, b, font, img, span +# NexusPHP Standard v1.5 Beta 4 diff --git a/config/prowlarr/Definitions/tmghub.yml b/config/prowlarr/Definitions/tmghub.yml new file mode 100644 index 0000000..fc2eb4a --- /dev/null +++ b/config/prowlarr/Definitions/tmghub.yml @@ -0,0 +1,195 @@ +--- +id: tmghub +name: TmGHuB +description: "TmGHuB (TH) is an INDIAN Private Torrent Tracker for MOVIES / TV / GENERAL" +language: en-US +type: private +encoding: UTF-8 +links: + - https://tmghub.org/ + +caps: + categorymappings: + # Movies + - {id: 29, cat: Movies, desc: "Movie Packs"} + - {id: 30, cat: Movies, desc: "V.I.P"} + - {id: 13, cat: Movies/BluRay, desc: "BD-25/BD-50"} + - {id: 32, cat: Movies/BluRay, desc: "1080p BluRay"} + - {id: 33, cat: Movies/HD, desc: "BDRip / 720p"} + - {id: 11, cat: Movies/DVD, desc: "DVD-R/DVD-DL"} + - {id: 22, cat: Movies/DVD, desc: "Encoded DVDs"} + - {id: 17, cat: Movies/WEB-DL, desc: "WEB-DL/DTH"} + - {id: 14, cat: Movies/DVD, desc: "DVD-Rips"} + - {id: 15, cat: Movies/HD, desc: "DTH/HD-Rip"} + - {id: 20, cat: Movies/SD, desc: "VHS/TV-Rip"} + - {id: 21, cat: Movies, desc: "Video CDs"} + - {id: 19, cat: Movies, desc: "Pre Releases "} + - {id: 42, cat: Movies, desc: "Dubbed Movies"} + - {id: 44, cat: Movies, desc: "TmG Special"} + # Music + - {id: 27, cat: Audio, desc: "MP3/FLAC/WAV"} + - {id: 23, cat: Audio/Video, desc: "Music Videos"} + - {id: 37, cat: Audio, desc: "Music Packs"} + # Television + - {id: 40, cat: TV, desc: "TV Shows"} + - {id: 28, cat: TV, desc: "TV Series"} + - {id: 25, cat: TV/Sport, desc: "Sports"} + - {id: 26, cat: TV/Documentary, desc: "Documentary"} + # Books + - {id: 38, cat: Books/EBook, desc: "E-Books"} + - {id: 34, cat: Books, desc: "Guides / Tutorials"} + # Others + - {id: 5, cat: TV/Anime, desc: "Anime"} + - {id: 39, cat: Other, desc: "Religious"} + - {id: 43, cat: Other, desc: "Other"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. Default is 30. + - name: info_grabs + type: info + label: Search results + default: Note that torrents that you have previously downloaded will not be included in results.
You are not allowed to download a torrent twice without informing admin. + - name: thankyou + type: text + label: Thank You Comment + - name: info + type: info + label: Thank you comment + default: This site requires you to leave a Thank You comment before you can download.
Enter your personalised comment above, at least 8 characters long. + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 3 + options: + 3: created + 5: seeders + 4: size + 2: title + - name: type + type: select + label: Order requested from site + default: 2 + options: + 2: desc + 1: asc + +login: + path: index.php?page=login + method: form + form: form[action^="index.php?page=login"] + inputs: + uid: "{{ .Config.username }}" + pwd: "{{ .Config.password }}" + error: + - selector: tr td span[style="color:#FF0000;"] + test: + path: index.php + selector: a[href="logout.php"] + +download: + before: + path: "{{ .DownloadUri.AbsoluteUri }}" + method: post + inputs: + comment: "{{ .Config.thankyou }}" + confirm: Confirm + selectors: + - selector: td a[href^="download.php"] + attribute: href + +search: + paths: + # https://tmghub.org/index.php?page=torrents&search=&category=29;13;32;33;11;22;17;14;15&uploader=0&options=0&active=0&gold=0&langsel=-1 + - path: index.php + inputs: + page: torrents + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + category: "{{ if .Categories }}{{ range .Categories }}{{.}};{{end}}{{ else }}0{{ end }}" + uploader: 0 + # 0=title, 1=title&descr, 2=descr, 3 imdbid + options: "{{ if .Query.IMDBID }}3{{ else }}0{{ end }}" + # 0 all, 1 activeonly, 2 deadonly + active: 0 + # 0 all, 1 classic, 2 silver, 3 gold, 4 silver&gold + gold: "{{ if .Config.freeleech }}3{{ else }}0{{ end }}" + # -1 all, 0 unk, 1 eng, etc + langsel: -1 + order: "{{ .Config.sort }}" + by: "{{ .Config.type }}" + + rows: + selector: "table#tottest[width=\"100%\"] tr:has(a[href^=\"index.php?page=torrent-details\"]):not(:has(img[title=\"Allready Grabbed !!\"]))" + + fields: + category: + selector: td a[href^="index.php?page=torrents&category="] + attribute: href + filters: + - name: querystring + args: category + title: + selector: td a[href^="index.php?page=torrent-details"] + details: + selector: td a[href^="index.php?page=torrent-details"] + attribute: href + download: + selector: td a[href^="index.php?page=torrent-details"] + attribute: href + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + poster: + selector: td a[href^="index.php?page=torrent-details"] + attribute: onmouseover + filters: + - name: regexp + args: "src=(.+?) width" + date: + # 6 weeks ago + selector: td a[href^="index.php?page=torrent-details"] + attribute: onmouseover + filters: + - name: regexp + args: "Added\\:(\\d+ \\w+ \\w+)<" + - name: timeago + size: + selector: td:nth-child(5) + grabs: + selector: td:nth-child(6) + seeders: + selector: td:nth-child(7) + leechers: + selector: td:nth-child(8) + downloadvolumefactor: + case: + img[src="gold/gold.gif"]: 0 + img[src="gold/silver.gif"]: 0.5 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 0.7 + minimumseedtime: + # 2 hours (as seconds = 2 x 60 x 60) + text: 7200 +# xbtit diff --git a/config/prowlarr/Definitions/tokyotosho.yml b/config/prowlarr/Definitions/tokyotosho.yml new file mode 100644 index 0000000..10e83c2 --- /dev/null +++ b/config/prowlarr/Definitions/tokyotosho.yml @@ -0,0 +1,136 @@ +--- +id: tokyotosho +name: Tokyo Toshokan +description: "A BitTorrent Library for Japanese Media" +language: en-US +type: public +encoding: UTF-8 +links: + - https://www.tokyotosho.info/ + - https://tokyotosho.mrunblock.bond/ + - https://tokyotosho.nocensor.cloud/ +legacylinks: + - https://tokyotosho.black-mirror.xyz/ + - https://tokyotosho.unblocked.casa/ + - https://tokyotosho.proxyportal.fun/ + - https://tokyotosho.uk-unblock.xyz/ + - https://tokyotosho.ind-unblock.xyz/ + - https://tokyotosho.unblocked.bar/ + - https://tokyotosho.proxyportal.pw/ + - https://tokyotosho.uk-unblock.pro/ + - https://tokyotosho.unblocked.rest/ + - https://tokyotosho.unblocked.monster/ + - https://tokyotosho.nocensor.space/ + - https://tokyotosho.nocensor.work/ + - https://tokyotosho.nocensor.biz/ + - https://tokyotosho.nocensor.sbs/ + - https://tokyotosho.nocensor.world/ + - https://tokyotosho.nocensor.lol/ + - https://tokyotosho.nocensor.art/ + - https://tokyotosho.mrunblock.guru/ + - https://tokyotosho.mrunblock.life/ + - https://tokyotosho.nocensor.click/ + +settings: + - name: cat + type: select + label: Category + default: 0 + options: + 0: All + 1: Anime + 10: Non-English + 3: Manga + 8: Drama + 2: Music + 9: "Music Video" + 7: Raws + 4: Hentai + 12: "Hentai (Anime)" + 13: "Hentai (Manga)" + 14: "Hentai (Games)" + 11: Batch + 15: JAV + 5: Other + +caps: + categorymappings: + - {id: 1, cat: TV/Anime, desc: "Anime"} + - {id: 10, cat: TV/Anime, desc: "Non-English Anime"} + - {id: 3, cat: Books, desc: "Manga"} + - {id: 8, cat: TV/Anime, desc: "Drama"} + - {id: 2, cat: Audio, desc: "Anime Music"} + - {id: 9, cat: TV/Anime, desc: "Anime Music Videos"} + - {id: 7, cat: TV/Anime, desc: "Raw Anime"} + - {id: 4, cat: XXX, desc: "Hentai"} + - {id: 12, cat: XXX, desc: "Hentai (Anime)"} + - {id: 13, cat: XXX, desc: "Hentai (Manga)"} + - {id: 14, cat: XXX, desc: "Hentai (Games)"} + - {id: 11, cat: TV/Anime, desc: "Batch"} + - {id: 15, cat: XXX, desc: "JAV"} + - {id: 5, cat: Other, desc: "Other"} + + modes: + search: [q] + tv-search: [q, season, ep] + book-search: [q] + +search: + paths: + - path: "{{ if .Keywords }}search.php{{ else }}index.php{{ end }}" + inputs: + terms: "{{ .Keywords }}" + cat: "{{ .Config.cat }}" + + rows: + selector: "table.listing tr.category_0" + after: 1 + filters: + - name: andmatch + + fields: + category: + selector: a[href*="?cat="] + attribute: href + filters: + - name: regexp + args: (\d+) + title: + selector: td.desc-top a[type="application/x-bittorrent"] + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: td.desc-top a[type="application/x-bittorrent"] + attribute: href + magnet: + selector: a[href^="magnet:?xt="] + attribute: href + optional: true + size: + selector: td.desc-bot + filters: + - name: split + args: ["|", 1] + - name: regexp + args: "Size: (.+?) ?$" + date: + selector: td.desc-bot + filters: + - name: split + args: ["|", 2] + - name: regexp + args: "Date: (.+?) ?$" + - name: replace + args: ["UTC", "+00:00"] + - name: dateparse + args: "yyyy-MM-dd HH:mm zzz" + seeders: + selector: td.stats > span:nth-child(1) + leechers: + selector: td.stats > span:nth-child(2) + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# Engine n/a diff --git a/config/prowlarr/Definitions/torlock.yml b/config/prowlarr/Definitions/torlock.yml new file mode 100644 index 0000000..b094190 --- /dev/null +++ b/config/prowlarr/Definitions/torlock.yml @@ -0,0 +1,181 @@ +--- +id: torlock +name: Torlock +description: "Torlock is a torrent search site that lists verified torrents only for TV series and movies" +language: en-US +type: public +encoding: UTF-8 +requestDelay: 2 +links: + - https://www.torlock2.com/ + - https://www.torlock.com/ + - https://torlock.unblockit.date/ + - https://torlock.nocensor.cloud/ + - https://torlock.mrunblock.bond/ +legacylinks: + - https://torlock.com/ + - https://torlock.nocensor.biz/ + - https://www.torlock.icu/ + - https://torlock.nocensor.sbs/ + - https://torlock.unblockit.nz/ + - https://torlock.nocensor.world/ + - https://torlock.unblockit.page/ + - https://torlock.unblockit.pet/ + - https://torlock.nocensor.lol/ + - https://torlock.unblockit.ink/ + - https://torlock.unblockit.bio/ + - https://torlock.unblockit.boo/ + - https://torlock.mrunblock.guru/ + - https://torlock.unblockit.click/ + - https://torlock.unblockit.asia/ + - https://torlock.mrunblock.life/ # This web property is not accessible via this address + - https://torlock.unblockit.mov/ + - https://torlock.unblockit.rsvp/ + - https://torlock.nocensor.click/ + - https://torlock.unblockit.vegas/ + - https://torlock.unblockit.esq/ + - https://torlock.unblockit.zip/ + - https://torlock.unblockit.foo/ + - https://torlock.unblockit.ing/ + +caps: + # dont forget to update the search fields category case block + categorymappings: + - {id: TELEVISION, cat: TV, desc: "TV Shows"} + - {id: MOVIES, cat: Movies, desc: "Movies"} + - {id: MUSIC, cat: Audio, desc: "Music"} + - {id: GAMES, cat: PC/Games, desc: "Games"} + - {id: SOFTWARE, cat: PC, desc: "Software"} + - {id: ANIME, cat: TV/Anime, desc: "Anime"} + - {id: EBOOKS, cat: Books/EBook, desc: "Books"} + - {id: OTHER, cat: Other, desc: "Other"} + - {id: ADULT, cat: XXX, desc: "Adult"} + - {id: AUDIOBOOK, cat: Audio/Audiobook, desc: "Audiobook"} + - {id: IMAGES, cat: Other/Misc, desc: "Images"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: sort + type: select + label: Sort requested from site (only works for search with keywords) + default: added + options: + added: created + seeds: seeders + size: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +search: + paths: + - path: "/all/torrents/{{ if .Keywords }}{{ .Keywords }}{{ else }}{{ .Today.Year }}{{ end }}.html?sort={{ .Config.sort }}&order={{ .Config.type }}" + categories: ["!", TELEVISION, MOVIES, MUSIC, GAMES, SOFTWARE, ANIME, EBOOKS, OTHER, ADULT, AUDIOBOOK, IMAGES] + - path: "{{ if .Keywords }}/television/torrents/{{ .Keywords }}.html?sort={{ .Config.sort }}&order={{ .Config.type }}{{else}}/television/1/{{ .Config.sort }}/{{ .Config.type }}.html{{end}}" + categories: [TELEVISION] + - path: "{{ if .Keywords }}/movie/torrents/{{ .Keywords }}.html?sort={{ .Config.sort }}&order={{ .Config.type }}{{else}}/movies/1/{{ .Config.sort }}/{{ .Config.type }}.html{{end}}" + categories: [MOVIES] + - path: "{{ if .Keywords }}/music/torrents/{{ .Keywords }}.html?sort={{ .Config.sort }}&order={{ .Config.type }}{{else}}/music/1/{{ .Config.sort }}/{{ .Config.type }}.html{{end}}" + categories: [MUSIC] + - path: "{{ if .Keywords }}/game/torrents/{{ .Keywords }}.html?sort={{ .Config.sort }}&order={{ .Config.type }}{{else}}/games/1/{{ .Config.sort }}/{{ .Config.type }}.html{{end}}" + categories: [GAMES] + - path: "{{ if .Keywords }}/software/torrents/{{ .Keywords }}.html?sort={{ .Config.sort }}&order={{ .Config.type }}{{else}}/software/1/{{ .Config.sort }}/{{ .Config.type }}.html{{end}}" + categories: [SOFTWARE] + - path: "{{ if .Keywords }}/anime/torrents/{{ .Keywords }}.html?sort={{ .Config.sort }}&order={{ .Config.type }}{{else}}/anime/1/{{ .Config.sort }}/{{ .Config.type }}.html{{end}}" + categories: [ANIME] + - path: "{{ if .Keywords }}/ebook/torrents/{{ .Keywords }}.html?sort={{ .Config.sort }}&order={{ .Config.type }}{{else}}/ebooks/1/{{ .Config.sort }}/{{ .Config.type }}.html{{end}}" + categories: [EBOOKS] + - path: "{{ if .Keywords }}/unknown/torrents/{{ .Keywords }}.html?sort={{ .Config.sort }}&order={{ .Config.type }}{{else}}/unknown.html{{end}}" # sorting is broken for unknown + categories: [OTHER] + - path: "{{ if .Keywords }}/adult/torrents/{{ .Keywords }}.html?sort={{ .Config.sort }}&order={{ .Config.type }}{{else}}/adult/1/{{ .Config.sort }}/{{ .Config.type }}.html{{end}}" + categories: [ADULT] + - path: "{{ if .Keywords }}/audiobook/torrents/{{ .Keywords }}.html?sort={{ .Config.sort }}&order={{ .Config.type }}{{else}}/audiobook/1/{{ .Config.sort }}/{{ .Config.type }}.html{{end}}" + categories: [AUDIOBOOK] + - path: "{{ if .Keywords }}/image/torrents/{{ .Keywords }}.html?sort={{ .Config.sort }}&order={{ .Config.type }}{{else}}/images/1/{{ .Config.sort }}/{{ .Config.type }}.html{{end}}" + categories: [IMAGES] + keywordsfilters: + - name: tolower + - name: re_replace + args: ["[^a-zA-Z0-9]+", "-"] + + rows: + selector: table > tbody > tr:has(td:has(div:has(a[href^="/torrent/"]))) + filters: + - name: andmatch + + fields: + category: + selector: span[class^="tv"] + attribute: class + case: + span.tv0: OTHER + span.tv1: MOVIES + span.tv2: MUSIC + span.tv3: TELEVISION + span.tv4: GAMES + span.tv5: SOFTWARE + span.tv6: ANIME + span.tv7: ADULT + span.tv8: EBOOKS + span.tv9: IMAGES + span.tv10: EBOOKS + span.tv12: AUDIOBOOK + "*": OTHER # some torrents have invalid categories + title: + selector: td:nth-child(1) > div > a + details: + selector: td:nth-child(1) > div > a[href^="/torrent/"] + attribute: href + download: + selector: td:nth-child(1) > div > a[href^="/torrent/"] + attribute: href + filters: + - name: replace + args: ["/torrent/", "/tor/"] + - name: regexp + args: (^/tor/\d*) + - name: append + args: ".torrent" + date_year: + selector: td:nth-child(2):contains("/") + optional: true + filters: + - name: append + args: " -07:00" # PDT + - name: dateparse + args: "M/d/yyyy zzz" + date_day: + selector: td:nth-child(2):contains("Today"), td:nth-child(2):contains("Yesterday") + optional: true + filters: + - name: fuzzytime + date_ago: + selector: td:nth-child(2):not(:contains("Today")):not(:contains("Yesterday")):not(:contains("/")) + optional: true + filters: + - name: re_replace + args: ["(min|mins)", "minutes"] + - name: timeago + date: + text: "{{ if or .Result.date_year .Result.date_ago .Result.date_day }}{{ or .Result.date_year .Result.date_ago .Result.date_day }}{{ else }}now{{ end }}" + size: + selector: td:nth-child(3) + seeders: + selector: td:nth-child(4) + leechers: + selector: td:nth-child(5) + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/tornado.yml b/config/prowlarr/Definitions/tornado.yml new file mode 100644 index 0000000..b75e180 --- /dev/null +++ b/config/prowlarr/Definitions/tornado.yml @@ -0,0 +1,185 @@ +--- +id: tornado +name: Tornado +description: "Tornado is a SLOVENIAN Private Torrent Tracker for MOVIES / TV / GENERAL" +language: sl-SI +type: private +encoding: UTF-8 +links: + - https://www.tornado.si/ + +caps: + categorymappings: + - {id: 32, cat: Movies/SD, desc: "Filmi Xvid"} + - {id: 33, cat: Movies/DVD, desc: "Filmi DVD"} + - {id: 34, cat: Movies/BluRay, desc: "Filmi BluRay"} + - {id: 35, cat: TV/Documentary, desc: "Dokumentarci Filmi"} + - {id: 36, cat: TV/Anime, desc: "Risanke"} + - {id: 37, cat: Audio/Video, desc: "Koncerti"} + - {id: 38, cat: Audio/MP3, desc: "Glasba MP3"} + - {id: 39, cat: Audio/Lossless, desc: "Glasba FLAC"} + - {id: 40, cat: PC/Games, desc: "Igre PC"} + - {id: 41, cat: Console/PS3, desc: "Igre PS3"} + - {id: 42, cat: Console/PS4, desc: "Igre PS4"} + - {id: 43, cat: Console/XBox, desc: "Igre Xbox"} + - {id: 47, cat: Console/NDS, desc: "Igre Nintendo"} + - {id: 44, cat: PC, desc: "Programi"} + - {id: 45, cat: Books/EBook, desc: "E-Knjige"} + - {id: 46, cat: Books/Mags, desc: "E-Revije"} + - {id: 48, cat: TV, desc: "TV-Rip"} + - {id: 49, cat: XXX/ImageSet, desc: "Slike"} + - {id: 50, cat: XXX/DVD, desc: "Erotika"} + - {id: 51, cat: Other/Misc, desc: "Ostalo"} + - {id: 52, cat: Other, desc: "VIP"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeders: seeders + size: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_results + type: info + label: Search results + default: "If you are getting the error Found no results while trying to browse this tracker then first access the site with your browser and check that you are not being forced to change your password because it has expired after 180 days." + +login: + path: ?p=home&pid=1 + method: form + form: form#sls_form + submitpath: ajax/login.php + inputs: + action: login + loginbox_membername: "{{ .Config.username }}" + loginbox_password: "{{ .Config.password }}" + loginbox_remember: 1 + selectorinputs: + securitytoken: + selector: "script:contains(\"stKey: \")" + filters: + - name: regexp + args: "stKey: \"(.+?)\"," + error: + - selector: div.error + - selector: :contains("-ERROR-") + test: + path: ?p=home&pid=1 + selector: div#member_info_bar + +search: + paths: + - path: / + keywordsfilters: + - name: re_replace + args: ["[^a-zA-Z0-9]+", "%25"] + inputs: + p: torrents + pid: 32 + $raw: "{{ range .Categories }}cid[]={{.}}&{{end}}" + keywords: "{{ .Keywords }}" + # name, description, both, uploader + search_type: name + "sortOptions[sortBy]": "{{ .Config.sort }}" + "sortOptions[sortOrder]": "{{ .Config.type }}" + # does not support imdbid search but has imdbid links in results. + error: + - selector: div.error:not(:contains("There are no results found.")) + + rows: + selector: "div.torrent-box[id^=\"torrent_\"]{{ if .Config.freeleech }}:has(img[src$=\"/torrent_free.png\"]){{ else }}{{ end }}" + + fields: + category: + selector: a[href*="?p=torrents&pid=10&cid="] + attribute: href + filters: + - name: querystring + args: cid + title: + selector: a[href*="?p=torrents&pid=10&action=details&tid="] + details: + selector: a[href*="?p=torrents&pid=10&action=details&tid="] + attribute: href + download: + selector: a[href*="?p=torrents&pid=10&action=download&tid="] + attribute: href + magnet: + selector: a[href^="magnet:?xt="] + attribute: href + optional: true + poster: + selector: a[href*="data/torrents/torrent_images/"] + attribute: href + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + size: + selector: a[rel="torrent_size"] + grabs: + selector: a[rel="times_completed"] + seeders: + selector: a[rel="torrent_seeders"] + leechers: + selector: a[rel="torrent_leechers"] + date_day: + selector: div.torrentOwner:contains("day") + # auto adjusted by site account profile + optional: true + filters: + - name: regexp + args: "Uploaded (.+?) by" + - name: fuzzytime + date_year: + selector: div.torrentOwner:contains("-") + # auto adjusted by site account profile + optional: true + filters: + - name: regexp + args: "Uploaded (.+?) by" + - name: dateparse + args: "dd-MM-yyyy HH:mm" + date_unix: + selector: div.torrentOwner abbr + optional: true + attribute: data-time + date: + text: "{{ if or .Result.date_day .Result.date_year .Result.date_unix }}{{ or .Result.date_day .Result.date_year .Result.date_unix }}{{ else }}now{{ end }}" + downloadvolumefactor: + case: + img[src$="/torrent_free.png"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 2 day (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# TSUE 2.2 diff --git a/config/prowlarr/Definitions/torrent-explosiv.yml b/config/prowlarr/Definitions/torrent-explosiv.yml new file mode 100644 index 0000000..c80b916 --- /dev/null +++ b/config/prowlarr/Definitions/torrent-explosiv.yml @@ -0,0 +1,217 @@ +--- +id: torrent-explosiv +name: Torrent-Explosiv +description: "Torrent-Explosiv is a German Private site for TV / MOVIES / GENERAL" +language: de-DE +type: private +encoding: UTF-8 +links: + - https://torrent-explosiv.me/ +legacylinks: + - https://torrent-explosiv.eu/ + - https://torrent-explosiv.hopto.org/ + +caps: + categorymappings: + # Filme,Movie + - {id: 114, cat: Movies/UHD, desc: "Filme UHD"} + - {id: 32, cat: Movies/HD, desc: "Filme HD"} + - {id: 28, cat: Movies/SD, desc: "Filme SD"} + - {id: 148, cat: Movies/DVD, desc: "Filme DVD/HD2DVD"} + - {id: 151, cat: Movies/Other, desc: "Filme Anime"} + - {id: 138, cat: Movies/UHD, desc: "Filme Pack UHD"} + - {id: 140, cat: Movies/HD, desc: "Filme Pack HD"} + - {id: 147, cat: Movies/SD, desc: "Filme Pack SD"} + # Serien,Series + - {id: 139, cat: TV/UHD, desc: "Serien UHD"} + - {id: 57, cat: TV/HD, desc: "Serien HD"} + - {id: 60, cat: TV/SD, desc: "Serien SD"} + - {id: 152, cat: TV/Anime, desc: "Serien Anime"} + - {id: 59, cat: TV/UHD, desc: "Serien Pack UHD"} + - {id: 149, cat: TV/HD, desc: "Serien Pack HD"} + - {id: 150, cat: TV/SD, desc: "Serien Pack SD"} + # Audio + - {id: 110, cat: Audio, desc: "Audio Alben"} + - {id: 48, cat: Audio, desc: "Audio Sampler/OST"} + - {id: 155, cat: Audio, desc: "Audio Mixe"} + - {id: 63, cat: Audio, desc: "Audio Charts/Singles"} + - {id: 153, cat: Audio/Lossless, desc: "Audio FLAC"} + - {id: 52, cat: Audio/MP3, desc: "Audio Pack mp3"} + - {id: 154, cat: Audio/Lossless, desc: "Audio Pack FLAC"} + - {id: 120, cat: Audio/Video, desc: "Audio Videos"} + - {id: 162, cat: Audio/Audiobook, desc: "Audio ABooks"} + # Software + - {id: 12, cat: PC/0day, desc: "Software Windows"} + - {id: 125, cat: PC/Mac, desc: "Software Mac-OSX"} + - {id: 11, cat: PC/Mobile-Other, desc: "Software Mobil"} + - {id: 141, cat: PC/Mobile-Other, desc: "Software Other"} + # Spiele,Games + - {id: 17, cat: PC/Games, desc: "Spiele PC"} + - {id: 24, cat: Console, desc: "Spiele Konsolen"} + - {id: 121, cat: Console, desc: "Spiele Wimmelbild"} + - {id: 126, cat: Console/Other, desc: "Spiele Mobil"} + # Sport + - {id: 259, cat: TV/Sport, desc: "Sport UHD"} + - {id: 61, cat: TV/Sport, desc: "Sport HD"} + - {id: 62, cat: TV/Sport, desc: "Sport SD"} + # Doku + - {id: 156, cat: TV/Documentary, desc: "Doku UHD"} + - {id: 14, cat: TV/Documentary, desc: "Doku HD"} + - {id: 15, cat: TV/Documentary, desc: "Doku SD"} + - {id: 123, cat: TV/Documentary, desc: "Doku Pack UHD"} + - {id: 157, cat: TV/Documentary, desc: "Doku Pack HD"} + - {id: 158, cat: TV/Documentary, desc: "Doku Pack SD"} + # XXX + - {id: 160, cat: XXX/UHD, desc: "XXX UHD"} + - {id: 73, cat: XXX/x264, desc: "XXX HD"} + - {id: 76, cat: XXX/SD, desc: "XXX SD"} + - {id: 75, cat: XXX/Pack, desc: "XXX Pack"} + - {id: 142, cat: XXX/ImageSet, desc: "XXX Pic´s"} + - {id: 161, cat: XXX/Other, desc: "XXX ePaper"} + # ePaper,Ebooks + - {id: 163, cat: Books/Mags, desc: "ePaper Magazine"} + - {id: 96, cat: Books/Other, desc: "ePaper Zeitungen"} + - {id: 136, cat: Books/EBook, desc: "ePaper E-Book"} + - {id: 137, cat: Books/Comics, desc: "ePaper Comics"} + # Other - dummy cat + - {id: 0, cat: Other, desc: "Other Other"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeds: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Anzahl der Torrents beim Durchsuchen Torrents per page: setting to 60 on your account profile. The default is 15. + +login: + path: login.php + method: form + form: form[action="/login.php"] + cookies: ["JAVA=OK"] # avoid jscheck redirect + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: div#login_error + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: selection.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 name, 1 descr, 2 both + blah: 2 + orderby: "{{ .Config.sort }}" + sort: "{{ .Config.type }}" + + rows: + selector: "div.selection_wrap{{ if .Config.freeleech }}:has(:root:has(div.onlyup)){{ else }}{{ end }}" + filters: + - name: andmatch + + fields: + category_p1: + selector: div.kat_cat_pic_name + optional: true + default: Other + category_p2: + selector: div.kat_cat_pic_name_b + optional: true + default: Other + categorydesc: + text: "{{ .Result.category_p1 }} {{ .Result.category_p2 }}" + title: + selector: a.selection_a + filters: + - name: re_replace + args: ["^\\[[\\w ]*\\]\\s?", ""] + details: + selector: a.selection_a + attribute: href + download: + selector: a[href^="download_ssl.php?torrent="] + attribute: href + poster: + selector: div[id^="details"] img + attribute: src + size: + selector: div.selection_unter_ad + grabs: + selector: div.selection_unter_ae + date_day: + # Heute 13:30:04 + # Gestern 09:10:10 + selector: div.selection_unter_ab:not(:contains(".")) + optional: true + filters: + - name: replace + args: ["Heute", "Today"] + - name: replace + args: ["Gestern", "Yesterday"] + - name: append + args: " +01:00" # CET + date_year: + # 30.02.2018 um 23:12:50 + selector: div.selection_unter_ab:contains(".") + optional: true + filters: + - name: replace + args: [" um", ""] + - name: append + args: " +01:00" # CET + - name: dateparse + args: "dd.MM.yyyy HH:mm:ss zzz" + date: + text: "{{ if or .Result.date_year .Result.date_day }}{{ or .Result.date_year .Result.date_day }}{{ else }}now{{ end }}" + seeders: + selector: div.selection_unter_aa + leechers: + selector: div.selection_unter_aaa + downloadvolumefactor: + case: + ":root:has(div.onlyup)": 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# 3xT diff --git a/config/prowlarr/Definitions/torrent-heaven.yml b/config/prowlarr/Definitions/torrent-heaven.yml new file mode 100644 index 0000000..f13b88f --- /dev/null +++ b/config/prowlarr/Definitions/torrent-heaven.yml @@ -0,0 +1,176 @@ +--- +id: torrent-heaven +name: Torrent Heaven +description: "Torrent Heaven is a DUTCH Private Torrent Tracker for MOVIES / TV / GENERAL" +language: nl-NL +type: private +encoding: UTF-8 +links: + - https://www.torrentheaven.org/ + +caps: + categorymappings: + - {id: 129, cat: Movies/HD, desc: "Hd DVD"} + - {id: 123, cat: Movies/HD, desc: "MKV/X265"} + - {id: 130, cat: Movies/UHD, desc: "4K Films"} + - {id: 10, cat: Movies/DVD, desc: "Dvd rip"} + - {id: 111, cat: Movies/SD, desc: "HD2DVD / BR2DVD"} + - {id: 125, cat: Movies/SD, desc: "Xvid rip"} + - {id: 143, cat: Movies/HD, desc: "Divx 720P"} + - {id: 132, cat: TV, desc: "complete seizoen serie"} + - {id: 139, cat: TV, desc: "Losse afleveringen"} + - {id: 140, cat: Books/EBook, desc: "E-Book"} + - {id: 114, cat: Audio/MP3, desc: "Muziek MP3"} + - {id: 142, cat: Audio/Lossless, desc: "Muziek Flac"} + - {id: 115, cat: PC, desc: "pc apps"} + - {id: 105, cat: TV/Documentary, desc: "Documentaire"} + - {id: 120, cat: PC/Games, desc: "Pc Games"} + - {id: 106, cat: Other, desc: "Overig"} + - {id: 131, cat: Books/Comics, desc: "Stripboeken"} + - {id: 108, cat: XXX, desc: "18+ Adult"} + - {id: 116, cat: PC/Mac, desc: "Mac"} + - {id: 155, cat: Books/Mags, desc: "Tijdschriften"} + - {id: 128, cat: Audio/Video, desc: "muziek DVD"} + - {id: 156, cat: Other, desc: "Donateur"} + - {id: 118, cat: Movies, desc: "Kids Film"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: thankyou + type: text + label: Thank You Comment + - name: info + type: info + label: Thank you comment + default: This site requires you to leave a Thank You comment before you can download. Enter your personalised comment above. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + returnto: "/" + error: + - selector: td.embedded:contains("fout") + test: + path: / + selector: a[href="logout.php"] + +download: + before: + path: comment.php + method: post + inputs: + action: add + tid: "{{ .DownloadUri.Query.id }}" + text: "{{ .Config.thankyou }}" + submit: Opslaan + selectors: + - selector: a[href^="download.php?id="] + attribute: href + +search: + paths: + # https://www.torrentheaven.org/browse.php?search=&cat=0&incldead=1 + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + incldead: 1 + + rows: + selector: table.mainouter + filters: + - name: andmatch + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="details.php?id="] + attribute: href + poster: + selector: div[id^="Style"] img + attribute: src + size: + selector: a[href^="details_bestanden.php?"] + filters: + - name: regexp + args: "(.+?) in" + files: + selector: a[href^="details_bestanden.php?"] + filters: + - name: regexp + args: "in (\\d+) bestan" + grabs: + selector: td:nth-child(5) table tbody tr:nth-child(2) td:first-child + date: + selector: td:nth-child(5) table tbody tr:nth-child(2) td:last-child + filters: + - name: replace + args: ["januari", "January"] + - name: replace + args: ["februari", "February"] + - name: replace + args: ["maart", "March"] + - name: replace + args: ["april", "April"] + - name: replace + args: ["mei", "May"] + - name: replace + args: ["juni", "June"] + - name: replace + args: ["juli", "July"] + - name: replace + args: ["augustus", "August"] + - name: replace + args: ["september", "September"] + - name: replace + args: ["oktober", "October"] + - name: replace + args: ["november", "November"] + - name: replace + args: ["december", "December"] + - name: re_replace + args: ["\\s*om\\s*", " "] + - name: append + args: " +01:00" # CET + - name: dateparse + args: "d MMMM yyyy HH:mm:ss zzz" + seeders: + selector: td:nth-child(5) table tbody tr:last-child td:nth-last-child(3) font b:first-child + optional: true + default: 0 + leechers: + selector: td:nth-child(5) table tbody tr:last-child td:nth-last-child(3) font b:nth-child(2) + optional: true + default: 0 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 +# engine n/a diff --git a/config/prowlarr/Definitions/torrent-pirat.yml b/config/prowlarr/Definitions/torrent-pirat.yml new file mode 100644 index 0000000..3e0c995 --- /dev/null +++ b/config/prowlarr/Definitions/torrent-pirat.yml @@ -0,0 +1,204 @@ +--- +id: torrent-pirat +name: torrent-pirat +description: "torrent-pirat is a RUSSIAN Public Torrent Tracker for 3X" +language: ru-RU +type: public +encoding: UTF-8 +links: + - http://www.torrent-pirat.com/ # site does not support https ERR_CONNECTION_REFUSED + +caps: + categorymappings: + - {id: 204, cat: XXX, desc: "Трекер"} + - {id: 630, cat: XXX, desc: " Любительское видео 18+ / Amateur"} + - {id: 631, cat: XXX, desc: " Русское любительское порно / Russian Amateur"} + - {id: 632, cat: XXX, desc: " Зарубежное любительское порно / Amateur & Homemade"} + - {id: 396, cat: XXX, desc: " Скрытые камеры и подглядывание 18+ / Spycam, Upskirts"} + - {id: 641, cat: XXX, desc: " Любительское порно / Amateur - Паки и сборники"} + - {id: 264, cat: XXX, desc: " Русское порно / Russian"} + - {id: 265, cat: XXX, desc: " Отечественные порнофильмы и фильмы с Русскими актрисами / Movies with Russian actresses"} + - {id: 268, cat: XXX, desc: " Сцены из фильмов и ролики с Русскими актрисами / Russian Movie Scenes & SiteRip's"} + - {id: 269, cat: XXX, desc: " Паки порнороликов с Русскими актрисами / Russian Clips Packs"} + - {id: 205, cat: XXX, desc: " Полнометражные фильмы 18+ / Full Length Movies"} + - {id: 211, cat: XXX, desc: " Классика / Classic (Полнометражные фильмы снятые до 2000 года)"} + - {id: 208, cat: XXX, desc: " Фильмы с сюжетом / Feature Vignettes"} + - {id: 640, cat: XXX, desc: " Порно-пародия / Parody"} + - {id: 209, cat: XXX, desc: " Фильмы без сюжета / Movies without a story"} + - {id: 207, cat: XXX, desc: " Порно фильмы с Русским переводом"} + - {id: 579, cat: XXX, desc: " Эротические фильмы / Erotic Movies"} + - {id: 580, cat: XXX, desc: " Документальные фильмы 18+ / Documentary & Reality"} + - {id: 206, cat: XXX, desc: " Сборники порно фильмов / Full Length Movies Packs"} + - {id: 270, cat: XXX, desc: " Зарубежные ролики 18+"} + - {id: 273, cat: XXX, desc: " Сцены из фильмов"} + - {id: 638, cat: XXX, desc: " Порно-кастинг / Casting"} + - {id: 639, cat: XXX, desc: " Public & Reality"} + - {id: 659, cat: XXX, desc: " Incest / Taboo"} + - {id: 685, cat: XXX, desc: " Анал и ДП / Anal&DP - Сцены и ролики"} + - {id: 684, cat: XXX, desc: " Анал и ДП / Anal&DP - HD Сцены и ролики"} + - {id: 687, cat: XXX, desc: " Секс втроём / Threesomes - Сцены и ролики"} + - {id: 686, cat: XXX, desc: " Секс втроём / Threesomes - HD Сцены и ролики"} + - {id: 689, cat: XXX, desc: " Группавуха / Group & Gangbang - Сцены и ролики"} + - {id: 688, cat: XXX, desc: " Группавуха / Group & Gangbang - HD Сцены и ролики"} + - {id: 679, cat: XXX, desc: " Молоденькие / Legal Teens - Сцены и ролики"} + - {id: 680, cat: XXX, desc: " Молоденькие / Legal Teens - HD Сцены и ролики"} + - {id: 681, cat: XXX, desc: " Мамочки / MILF & Mature - Сцены и ролики"} + - {id: 682, cat: XXX, desc: " Мамочки / MILF & Mature - HD Сцены и ролики"} + - {id: 683, cat: XXX, desc: " Бабушки / Grannies - Сцены и ролики"} + - {id: 589, cat: XXX, desc: " Зарубежные ролики 18+ / SiteRip's (1991-2010 год)"} + - {id: 272, cat: XXX, desc: " Зарубежные ролики 18+ / SiteRip's (2011-2014 год)"} + - {id: 623, cat: XXX, desc: " Зарубежные ролики 18+ / SiteRip's (2015-2018 год)"} + - {id: 646, cat: XXX, desc: " Зарубежные ролики 18+ / SiteRip's (2019-2020 год)"} + - {id: 588, cat: XXX, desc: " HD Video ролики 18+ (1991-2012 год)"} + - {id: 618, cat: XXX, desc: " HD Video ролики 18+ (2013-2016 год)"} + - {id: 645, cat: XXX, desc: " HD Video ролики 18+ (2017-2020 год)"} + - {id: 401, cat: XXX, desc: " Паки порнороликов / SiteRip's Packs"} + - {id: 386, cat: XXX, desc: " Паки порнороликов HD / HD Video Packs"} + - {id: 629, cat: XXX, desc: " Ролики и сцены от 'LegalPorno.com'"} + - {id: 660, cat: XXX, desc: " Этническое порно / Ethnic Porn - Фильмы и ролики"} + - {id: 662, cat: XXX, desc: " Межрасовый секс / Interracial"} + - {id: 661, cat: XXX, desc: " Азиатки / Asian"} + - {id: 663, cat: XXX, desc: " Латинки / Latin"} + - {id: 664, cat: XXX, desc: " Негритянки и Темнокожие / Ebony & Arab"} + - {id: 530, cat: XXX, desc: " Полнометражные азиатские и этнические фильмы / Full-length ethnic films"} + - {id: 633, cat: XXX, desc: " Оральный секс / Oral Sex - Фильмы и ролики"} + - {id: 398, cat: XXX, desc: " Bukkake & Blowbang - Сцены и ролики"} + - {id: 634, cat: XXX, desc: " Oral & Deep Throat - Сцены и ролики"} + - {id: 635, cat: XXX, desc: " Oral Sex / Blowbang & Bukkake - Полнометражные фильмы"} + - {id: 667, cat: XXX, desc: " Oral Sex / Bukkake & Blowbang - Паки порнороликов"} + - {id: 668, cat: XXX, desc: " BDSM / Bondage, Rough Sex"} + - {id: 644, cat: XXX, desc: " BDSM / Bondage - Полнометражные фильмы"} + - {id: 394, cat: XXX, desc: " BDSM / Bondage, Rough Sex - Ролики и сцены"} + - {id: 669, cat: XXX, desc: " Rough Sex, BDSM / Bondage - Video Pack"} + - {id: 691, cat: XXX, desc: " Постановочные изнасилования / Rape Roleplay - Ролики и сцены"} + - {id: 397, cat: XXX, desc: " Fisting & Dildo - Ролики и сцены"} + - {id: 395, cat: XXX, desc: " Femdom & Strap-On - Ролики и сцены"} + - {id: 665, cat: XXX, desc: " Лесбиянки / Lesbians"} + - {id: 666, cat: XXX, desc: " Полнометражные лесби-фильмы / Full length lesbian movies"} + - {id: 212, cat: XXX, desc: " Лесбиянки / Lesbians - Сцены и ролики"} + - {id: 658, cat: XXX, desc: " Лесбийский страпон / Lesbian Strap-on - Сцены и ролики"} + - {id: 670, cat: XXX, desc: " All Girl / Lesbians - Video Pack"} + - {id: 391, cat: XXX, desc: " Фетиш / Fetish"} + - {id: 400, cat: XXX, desc: " Фетиш / Fetish - Общий раздел"} + - {id: 671, cat: XXX, desc: " Фетиш / Fetish - Полнометражные фильмы"} + - {id: 585, cat: XXX, desc: " Big Boobs & Big Ass - Ролики и сцены"} + - {id: 647, cat: XXX, desc: " Толстушки / BBW & Plump Woman - Ролики и сцены"} + - {id: 648, cat: XXX, desc: " Худенькие / Skinny & Petite - Ролики и сцены"} + - {id: 672, cat: XXX, desc: " Foot Fetish & Footjob - Ролики и сцены"} + - {id: 692, cat: XXX, desc: " Массаж / Massage - Сцены и ролики"} + - {id: 690, cat: XXX, desc: " Glory Hole - Сцены и ролики"} + - {id: 674, cat: XXX, desc: " Fetish Wear / Uniform, Lingerie, Pantyhose & Stockings - Ролики и сцены"} + - {id: 673, cat: XXX, desc: " Hairy Pussy - Ролики и сцены"} + - {id: 399, cat: XXX, desc: " Сквирт & Золотой дождь - Ролики и сцены"} + - {id: 624, cat: XXX, desc: " Беременные / Pregnant - Ролики и сцены"} + - {id: 675, cat: XXX, desc: " Карлики / Midgets - Ролики и сцены"} + - {id: 677, cat: XXX, desc: " Masturbation, Solo & Posing - Video clips & Movies"} + - {id: 637, cat: XXX, desc: " Соло и мастурбация / Solo & Masturbation"} + - {id: 678, cat: XXX, desc: " Striptease & Posing"} + - {id: 450, cat: XXX, desc: " Анимация и игры"} + - {id: 451, cat: XXX, desc: " Хентай / Hentai"} + - {id: 582, cat: XXX, desc: " Мультфильмы18+ / Cartoons 18+"} + - {id: 472, cat: XXX, desc: " Порно-игры / Games XXX"} + - {id: 457, cat: XXX, desc: " Манга / Manga"} + - {id: 471, cat: XXX, desc: " Арт и HCG / Artwork & HCG"} + - {id: 403, cat: XXX, desc: " Фото, журналы, комиксы"} + - {id: 408, cat: XXX, desc: " Любительское фото"} + - {id: 410, cat: XXX, desc: " Подборки сетов / Picture Sets Packs"} + - {id: 409, cat: XXX, desc: " Подборки по актрисам"} + - {id: 413, cat: XXX, desc: " Журналы, комиксы, рисунки"} + - {id: 454, cat: XXX, desc: " Gay, Shemale, BISex - Фильмы, ролики, фото"} + - {id: 455, cat: XXX, desc: " Гей-фильмы и ролики / Gay"} + - {id: 392, cat: XXX, desc: " Бисексуалы / BISex- фильмы и ролики"} + - {id: 393, cat: XXX, desc: " Транссексуалы / Shemale - фильмы и ролики"} + - {id: 636, cat: XXX, desc: " Другое / Other"} + - {id: 467, cat: XXX, desc: " Gay / BISex, Shemale - Паки фильмов и роликов"} + - {id: 598, cat: XXX, desc: " Порно онлайн"} + - {id: 458, cat: XXX, desc: " Видео для телефонов и КПК +18 / Pocket РС & Phone Video"} + - {id: 470, cat: XXX, desc: " Секс-меньшинства - журналы, фото, разное"} + - {id: 247, cat: XXX, desc: " Правила и FAQ"} + + modes: + search: [q] + +settings: + - name: sort + type: select + label: Sort requested from site + default: t + options: + t: created + ts: seeders + sz: size + i: title + - name: type + type: select + label: Order requested from site + default: d + options: + d: desc + a: asc + +search: + # http://www.torrent-pirat.com/search.php?tracker_search=torrent&keywords=2023&terms=all&fp=1&author=&sc=1&sf=titleonly&sk=t&sd=d&sr=topics&st=0&ch=300&t=0&submit=Search + paths: + - path: search.php + inputs: + tracker_search: torrent + keywords: "{{ if .Keywords }}{{ .Keywords }}{{ else }}{{ .Today.Year }}{{ end }}" + terms: all + fp: 1 + sc: 1 + sf: titleonly + sr: topics + sk: "{{ .Config.sort }}" + sd: "{{ .Config.type }}" + st: 0 + ch: 300 + t: 0 + submit: Search + $raw: "{{ range .Categories }}&fid[]={{.}}{{end}}" + + rows: + selector: table.tablebg:nth-of-type(2) > tbody > tr:has(a[href^="./download/file.php?id="]) + + fields: + title: + selector: a.topictitle + details: + selector: a.topictitle + attribute: href + category: + selector: a[href^="./viewtopic.php?f="] + attribute: href + filters: + - name: querystring + args: f + download: + selector: a[href^="./download/file.php?id="] + attribute: href + size: + selector: p.gensmall + filters: + - name: regexp + args: "Размер: (.+?)," + - name: replace + args: ["ТБ", "TB"] + - name: replace + args: ["ГБ", "GB"] + - name: replace + args: ["МБ", "MB"] + - name: replace + args: ["КБ", "KB"] + seeders: + selector: span.seed + leechers: + selector: span.leech + grabs: + selector: span.complet + date: + text: now + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# phpBB diff --git a/config/prowlarr/Definitions/torrent-turk.yml b/config/prowlarr/Definitions/torrent-turk.yml new file mode 100644 index 0000000..7c723d0 --- /dev/null +++ b/config/prowlarr/Definitions/torrent-turk.yml @@ -0,0 +1,211 @@ +--- +id: torrent-turk +name: TOrrent-tuRK +description: "TOrrent-tuRK (TORK) is a Turkish Private Torrent Tracker for HD MOVIES / TV / GENERAL" +language: tr-TR +type: private +encoding: UTF-8 +links: + - https://torrent-turk.de/ +legacylinks: + - https://torrent-turk.org/ + - https://torrent-turk.co/ + +caps: + categorymappings: + - {id: 149, cat: Movies, desc: "Movies/Turkish"} + - {id: 151, cat: Movies/HD, desc: "Movies/Turkish/1080p"} + - {id: 152, cat: Movies/HD, desc: "Movies/Turkish/720p"} + - {id: 153, cat: Movies/DVD, desc: "Movies/Turkish/DVD5-DVD9"} + - {id: 154, cat: Movies/WEB-DL, desc: "Movies/Turkish/BRRip-HDRip-DVDRip-WebDL"} + - {id: 155, cat: Movies/Other, desc: "Movies/Turkish/Boxset"} + - {id: 156, cat: Movies, desc: "Movies/Foreign"} + - {id: 157, cat: Movies/UHD, desc: "Movies/Foreign/4K / 3D"} + - {id: 159, cat: Movies/HD, desc: "Movies/Foreign/1080p"} + - {id: 160, cat: Movies/HD, desc: "Movies/Foreign/720p"} + - {id: 161, cat: Movies/DVD, desc: "Movies/Foreign/DVD5-DVD9"} + - {id: 162, cat: Movies/WEB-DL, desc: "Movies/Foreign/BRRip-HDRip-DVDRip-WebDL"} + - {id: 163, cat: Movies/Other, desc: "Movies/Foreign/Boxset"} + - {id: 164, cat: TV, desc: "TV"} + - {id: 165, cat: TV, desc: "TV/Turkish"} + - {id: 166, cat: TV, desc: "TV/Foreign"} + - {id: 167, cat: TV/Other, desc: "TV Programs"} + - {id: 185, cat: TV/Documentary, desc: "TV/Documentary"} + - {id: 168, cat: TV/Other, desc: "TV/Other"} + - {id: 169, cat: TV/Other, desc: "TV/Boxset"} + - {id: 191, cat: TV, desc: "TV/BluTv"} + - {id: 192, cat: TV, desc: "TV/BluTv Series"} + - {id: 193, cat: Movies, desc: "Movies/BluTv Film"} + - {id: 188, cat: TV, desc: "TV/Netflix"} + - {id: 189, cat: TV, desc: "TV/Netflix Series"} + - {id: 190, cat: Movies, desc: "Movies/Netflix Film"} + - {id: 195, cat: TV, desc: "TV/Exxen"} + - {id: 199, cat: TV, desc: "TV/GAİN"} + - {id: 201, cat: TV, desc: "TV/Tabii"} + - {id: 171, cat: Audio, desc: "Music"} + - {id: 172, cat: Audio, desc: "Music/Turkish"} + - {id: 173, cat: Audio, desc: "Music/Foreign"} + - {id: 184, cat: Audio, desc: "Music/Discography"} + - {id: 174, cat: Audio/Video, desc: "Music/Video"} + - {id: 175, cat: PC, desc: "Apps / Game / Graphics"} + - {id: 176, cat: PC, desc: "Apps"} + - {id: 177, cat: Other, desc: "Pictures"} + - {id: 183, cat: Books/EBook, desc: "EBook"} + - {id: 178, cat: Books/Technical, desc: "Training Sets"} + - {id: 179, cat: PC, desc: "OS"} + - {id: 180, cat: PC/Games, desc: "PC/Games"} + - {id: 181, cat: Console, desc: "Playstation"} + - {id: 198, cat: Movies, desc: "Movies/Amazon Prime"} + - {id: 200, cat: Movies, desc: "Movies/Disney+"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + - name: info + type: info + label: Layout + default: "
  1. Only the English Classic profile is supported.
  2. Make sure to set the Torrent Listing (Listeleme Biçimi) option in your profile to Classic (Klasik)
  3. And set the Language (Dil) to English
  4. Using the Modern theme will prevent results, and using Turkish will prevent upload dates.
" + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeders: seeders + size: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_results + type: info + label: Search results + default: "If you are getting the error: An error has occurred!You can't view this page unless you read all your unread messages, then access the site with your browser and mark as read all PMs." + +login: + path: ?p=home&pid=1 + method: form + form: form#loginbox_form + submitpath: ajax/login.php + inputs: + action: login + loginbox_membername: "{{ .Config.username }}" + loginbox_password: "{{ .Config.password }}" + loginbox_remember: 1 + selectorinputs: + securitytoken: + selector: "script:contains(\"stKey: \")" + filters: + - name: regexp + args: "stKey: \"(.+?)\"," + error: + - selector: ":contains(\"-ERROR-\")" + test: + path: ?p=torrents&type=bookmarks&pid=508 + selector: a#logout + +search: + paths: + - path: / + inputs: + p: torrents + pid: 32 + $raw: "{{ range .Categories }}cid[]={{.}}&{{end}}" + keywords: "{{ .Keywords }}" + # name, description, both, uploader + search_type: name + "sortOptions[sortBy]": "{{ .Config.sort }}" + "sortOptions[sortOrder]": "{{ .Config.type }}" + error: + - selector: div.error:not(:contains("Hiçbir sonuç bulunamadı.")):not(:contains("There are no results found.")):not(:contains("Click on The Flag to Change")) + # does not support imdbid search and does not return imdb link in results. + + rows: + selector: "table#torrents_table_classic > tbody > tr:has(td.torrent_name){{ if .Config.freeleech }}:has(img[title=\"FREE!\"]){{ else }}{{ end }}" + filters: + - name: andmatch + + fields: + category: + selector: div.category_image > a + attribute: href + filters: + - name: querystring + args: cid + title: + selector: a[href*="?p=torrents&pid=10&action=details"] + details: + selector: a[href*="?p=torrents&pid=10&action=details"] + attribute: href + download: + selector: a[href*="?p=torrents&pid=10&action=download"] + attribute: href + date_day: + # Uploaded Friday at 05:11 by + # Uploaded Today at 00:48 by + # Uploaded Yesterday at 23:57 by + selector: td.torrent_name:contains(" at "):not(:has(abbr[data-time])) + # auto adjusted by site account profile + optional: true + filters: + - name: regexp + args: "Uploaded (.+?) by" + - name: fuzzytime + date_year: + # Uploaded 30-01-2019 15:02 by + selector: td.torrent_name:not(:contains(" at ")):not(:has(abbr[data-time])) + # auto adjusted by site account profile + optional: true + filters: + - name: regexp + args: "Uploaded (.+?) by" + - name: dateparse + args: "dd-MM-yyyy HH:mm" + date_unix: + # within the hour (unix) + selector: abbr[data-time] + attribute: data-time + optional: true + date: + text: "{{ if or .Result.date_day .Result.date_year .Result.date_unix }}{{ or .Result.date_day .Result.date_year .Result.date_unix }}{{ else }}now{{ end }}" + size: + selector: a[rel="torrent_size"] + seeders: + selector: a[rel="torrent_seeders"] + leechers: + selector: a[rel="torrent_leechers"] + grabs: + selector: a[rel="times_completed"] + poster: + selector: a[rel="fancybox"] + attribute: href + downloadvolumefactor: + case: + "img[title=\"FREE!\"]": 0 + "img[title=\"Download Multiplier: 0.5\"]": 0.5 + "*": 1 + uploadvolumefactor: + case: + "img[title=\"Upload Multiplier: 2\"]": 2 + "*": 1 + minimumratio: + text: 0.7 +# TSUE 2.2 diff --git a/config/prowlarr/Definitions/torrent9.yml b/config/prowlarr/Definitions/torrent9.yml new file mode 100644 index 0000000..19d7c3f --- /dev/null +++ b/config/prowlarr/Definitions/torrent9.yml @@ -0,0 +1,194 @@ +--- +id: torrent9 +name: Torrent9 +description: "Torrent9 is a FRENCH Public site for TV / MOVIES / GENERAL" +language: fr-FR +type: public +encoding: UTF-8 +followredirect: true +testlinktorrent: false +links: + - https://www.torrent9.fm/ + - https://torrent9.unblockninja.com/ +legacylinks: + - http://www.torrent9.ec/ + - http://www.torrent9.red/ + - http://www.torrent9.bz/ + - http://www.torrents9.pe/ + - http://www.torrent9.cc/ + - http://www.torrent9.pe/ + - http://www.torrent9.blue/ + - https://www.torrent9.blue/ + - https://ww2.torrent9.blue/ + - https://www.torrent9.rip/ + - https://www.torrent9.ph/ + - https://ww1.torrent9.ph/ + - https://torrent9.ga/ + - https://www.torrent9.uno/ + - https://wvw.torrent9.uno/ + - https://ww1.torrent9.uno/ + - https://wvw.t9.pe/ + - https://www4.torrent9.to/ + - https://www.torrent9.cat/ + - https://www.torrent09.uno/ + - https://www.torrent9.pl/ # this is a proxy for torrent9clone + - https://torrent9.black-mirror.xyz/ # this is a proxy for torrent9clone + - https://torrent9.unblocked.casa/ # this is a proxy for torrent9clone + - https://torrent9.proxyportal.fun/ # this is a proxy for torrent9clone + - https://torrent9.uk-unblock.xyz/ # this is a proxy for torrent9clone + - https://torrent9.ind-unblock.xyz/ # this is a proxy for torrent9clone + - https://ww1.torrent9.is/ + - https://ww1.torrent9.to/ + - https://www.torrent9.is/ + - https://torrent9.li/ # not a proxy for torrent9 or torrent9clone + - https://www.oxtorrent.me/ # http 522 Connection timed out + - https://www.torrent9.gg/ + - https://torrent9.to/ # no response data + - https://www.torrent9.fi/ # this is the torrent9clone domain + +caps: + # dont forget to update the search fields category case block + categorymappings: + - {id: films, cat: Movies, desc: "Movies"} + - {id: series, cat: TV, desc: "TV"} + - {id: musique, cat: Audio, desc: "Music"} + - {id: ebook, cat: Books, desc: "Books"} + - {id: logiciels, cat: PC, desc: "Software"} + - {id: jeux-pc, cat: PC/Games, desc: "PC Games"} + - {id: jeux-consoles, cat: Console/XBox 360, desc: "Console Games"} + - {id: other, cat: Other, desc: "Other"} # dummy cat for results missing icon + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + allowrawsearch: true + +settings: + - name: multilang + type: checkbox + label: Replace MULTi by another language in release name + default: false + - name: multilanguage + type: select + label: Replace MULTi by this language + default: FRENCH + options: + FRENCH: FRENCH + MULTi FRENCH: MULTi FRENCH + ENGLISH: ENGLISH + MULTi ENGLISH: MULTi ENGLISH + VOSTFR: VOSTFR + MULTi VOSTFR: MULTi VOSTFR + - name: vostfr + type: checkbox + label: Replace VOSTFR and SUBFRENCH with ENGLISH + default: false + - name: sort + type: select + label: Sort requested from site (Only works for searches with Keywords) + default: ".html" + options: + ".html": best + ".html,trie-date-d": created desc + ".html,trie-date-a": created asc + ".html,trie-seeds-d": seeders desc + ".html,trie-seeds-a": seeders asc + ".html,trie-poid-d": size desc + ".html,trie-poid-a": size asc + ".html,trie-nom-d": title desc + ".html,trie-nom-a": title asc + +download: + selectors: + - selector: a:has(i.fa-magnet) + attribute: href + +search: + paths: + - path: "{{ if .Keywords }}/search_torrent/{{ .Keywords }}{{ .Config.sort }}{{ else }}{{ end }}" + keywordsfilters: + # if searching for season packs with S01 to saison 1 #9712 + - name: re_replace + args: ["(?i)(S0)(\\d{1,2})$", "saison $2"] + - name: re_replace + args: ["(?i)(S)(\\d{1,3})$", "saison $2"] + - name: replace + args: [" ", "-"] + + rows: + selector: table.table-striped > tbody > tr + filters: + - name: andmatch + + fields: + category: + selector: td:nth-child(1) i + optional: true + default: other + case: + i[class="fa fa-video-camera"]: films + i[class="fa fa-desktop"]: series + i[class="fa fa-tv"]: series + i[class="fa fa-music"]: musique + i[class="fa fa-gamepad"]: jeux-pc + i[class="fa fa-laptop"]: logiciels + i[class="fa fa-book"]: ebook + title_default: + selector: td:nth-child(1) a + title_optional: + selector: td:nth-child(1) a[title] + attribute: title + optional: true + title_phase1: + text: "{{ if .Result.title_optional }}{{ .Result.title_optional }}{{ else }}{{ .Result.title_default }}{{ end }}" + filters: + - name: re_replace + args: ["(?i)\\b(FRENCH|MULTI|TRUEFRENCH|VOSTFR|SUBFRENCH)\\b(.+?)(\\b(19|20\\d{2})\\b)$", "$3 $1$2"] + title_vostfr: + text: "{{ .Result.title_phase1 }}" + filters: + - name: re_replace + args: ["(?i)\\b(vostfr|subfrench)\\b", "ENGLISH"] + title_phase2: + text: "{{ if .Config.vostfr }}{{ .Result.title_vostfr }}{{ else }}{{ .Result.title_phase1 }}{{ end }}" + title_multilang: + text: "{{ .Result.title_phase2 }}" + filters: + - name: re_replace + args: ["(?i)\\b(MULTI(?!.*(?:FRENCH|ENGLISH|VOSTFR)))\\b", "{{ .Config.multilanguage }}"] + title: + text: "{{ if .Config.multilang }}{{ .Result.title_multilang }}{{ else }}{{ .Result.title_phase2 }}{{ end }}" + details: + selector: td:nth-child(1) a + attribute: href + download: + selector: td:nth-child(1) a + attribute: href + date: + selector: td:nth-child(2):contains("/") + optional: true + default: now + filters: + - name: dateparse + args: "dd/MM/yyyy" + size: + selector: "{{ if .Keywords }}td:nth-child(3){{ else }}td:nth-child(2){{ end }}" + filters: + - name: re_replace + args: ["(\\w)o", "$1B"] + seeders: + selector: "{{ if .Keywords }}td:nth-child(4){{ else }}td:nth-child(3){{ end }}" + optional: true + default: 0 + leechers: + selector: "{{ if .Keywords }}td:nth-child(5){{ else }}td:nth-child(4){{ end }}" + optional: true + default: 0 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/torrent911.yml b/config/prowlarr/Definitions/torrent911.yml new file mode 100644 index 0000000..49dad50 --- /dev/null +++ b/config/prowlarr/Definitions/torrent911.yml @@ -0,0 +1,150 @@ +--- +id: torrent911 +name: Torrent911 +description: "Torrent911 is a French Public site for TV / MOVIES / GENERAL" +language: fr-FR +type: public +encoding: UTF-8 +# to fetch current domain use https://www.protege-torrent.com/T911 and https://www.protege-torrent.com/Torrent911 +links: + - https://www.torrent911.pw/ + - https://www.t911.ws/ + - https://oxtorrent.unblockninja.com/ + - https://torrent911.ninjaproxy1.com/ +legacylinks: + - https://www.protege-liens.com/ + - https://www.rantop.org/ + - https://oxtorrent.nocensor.work/ + - https://oxtorrent.unblockit.kim/ + - https://oxtorrent.unblockit.bz/ + - https://oxtorrent.unblockit.tv/ + - https://oxtorrent.unblockit.how/ + - https://oxtorrent.unblockit.cam/ + - https://oxtorrent.nocensor.biz/ + - https://oxtorrent.unblockit.day/ + - https://oxtorrent.unblockit.llc/ + - https://www.t911.net/ + - https://oxtorrent.unblockit.blue/ # proxy for *.co, a clone without derniers + - https://oxtorrent.nocensor.sbs/ # proxy for *.co, a clone without derniers + - https://www.torrent911.net/ + - https://www.torrent911.org/ + - https://www.torrent911.cc/ + - https://www.t911.me/ + - https://www.torrent911.tv/ + - https://www.t911.tv/ + - https://torrent911.ws/ + - http://www.torrent911.ws/ + - https://www.torrent911.ws/ + - https://www.torrent911.me/ + - https://t911.org/ + - https://www.torrent911.io/ + - https://www.torrent911.biz/ + +caps: + categorymappings: + - {id: Films, cat: Movies, desc: "Movies"} + - {id: Animes, cat: TV/Anime, desc: "Anime"} + - {id: Séries, cat: TV, desc: "TV"} + - {id: Musiques, cat: Audio, desc: "Music"} + - {id: Ebooks, cat: Books, desc: "Books"} + - {id: Livres, cat: Books, desc: "Livres"} + - {id: Logiciels, cat: PC, desc: "Software"} + - {id: Jeux-PC, cat: PC/Games, desc: "PC Games"} + - {id: Jeux-Consoles, cat: Console/XBox 360, desc: "Console Games"} + - {id: Porno, cat: XXX, desc: "Porno"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + allowrawsearch: true + +settings: + - name: multilang + type: checkbox + label: Replace MULTi by another language in release name + default: false + - name: multilanguage + type: select + label: Replace MULTi by this language + default: FRENCH + options: + FRENCH: FRENCH + MULTi FRENCH: MULTi FRENCH + ENGLISH: ENGLISH + MULTi ENGLISH: MULTi ENGLISH + VOSTFR: VOSTFR + MULTi VOSTFR: MULTi VOSTFR + - name: vostfr + type: checkbox + label: Replace VOSTFR and SUBFRENCH with ENGLISH + default: false + +download: + selectors: + - selector: a[href^="magnet:?"] + attribute: href + - selector: script:contains("magnet:?") + filters: + - name: regexp + args: "\\s'(magnet:\\?.+?)';" + +search: + paths: + - path: "{{ if .Keywords }}recherche/{{ .Keywords }}{{ else }}derniers{{ end }}" + keywordsfilters: + # if searching for season packs swith S01 to saison 1 #9712 + - name: re_replace + args: ["(?i)(S0)(\\d{1,2})$", "saison $2"] + - name: re_replace + args: ["(?i)(S)(\\d{1,3})$", "saison $2"] + + rows: + selector: table.table-hover > tbody > tr:has(a[href*="torrent/"]) + filters: + - name: andmatch + + fields: + category: + selector: td:nth-child(1) i, td:nth-child(1) div i + attribute: class + title_phase1: + selector: td:nth-child(1) a + filters: + - name: re_replace + args: ["(?i)\\b(FRENCH|MULTI|TRUEFRENCH|VOSTFR|SUBFRENCH)\\b(.+?)(\\b(19|20\\d{2})\\b)$", "$3 $1$2"] + title_vostfr: + text: "{{ .Result.title_phase1 }}" + filters: + - name: re_replace + args: ["(?i)\\b(vostfr|subfrench)\\b", "ENGLISH"] + title_phase2: + text: "{{ if .Config.vostfr }}{{ .Result.title_vostfr }}{{ else }}{{ .Result.title_phase1 }}{{ end }}" + title_multilang: + text: "{{ .Result.title_phase2 }}" + filters: + - name: re_replace + args: ["(?i)\\b(MULTI(?!.*(?:FRENCH|ENGLISH|VOSTFR)))\\b", "{{ .Config.multilanguage }}"] + title: + text: "{{ if .Config.multilang }}{{ .Result.title_multilang }}{{ else }}{{ .Result.title_phase2 }}{{ end }}" + details: + selector: td:nth-child(1) a + attribute: href + download: + selector: td:nth-child(1) a + attribute: href + size: + selector: td:nth-child(2) + date: + text: now + seeders: + selector: td:nth-child(3) + leechers: + selector: td:nth-child(4) + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/torrent9clone.yml b/config/prowlarr/Definitions/torrent9clone.yml new file mode 100644 index 0000000..6a5f274 --- /dev/null +++ b/config/prowlarr/Definitions/torrent9clone.yml @@ -0,0 +1,150 @@ +--- +id: torrent9clone +name: Torrent9 clone +description: "Torrent9 clone is a FRENCH Public Torrent9 clone for TV / MOVIES / GENERAL" +language: fr-FR +type: public +encoding: UTF-8 +followredirect: true +# to fetch current domain use https://www.protege-torrent.com/Torrent9 +links: + - https://www.torrent9.pm/ + - https://torrent9.nocensor.cloud/ + - https://torrent9.mrunblock.bond/ +legacylinks: + - https://www.protege-liens.net/ + - https://www.rantop.org/ + - https://torrent9.mrunblock.guru/ # redirects to 1337x + - http://www.torrent9.cm/ + - https://www.torrent9.cm/ + - https://torrent9.nocensor.art/ + - https://torrent9.mrunblock.life/ + - https://www.torrent9.fi/ + - https://www.torrent9.wtf/ + - https://www.torrent9.sc/ + - https://torrent9.nocensor.click/ + - https://www.torrent9.moe/ + - https://ww2.torrent9.moe/ + - https://wwv.torrent9.moe/ + - https://www.torrent9.pro/ + - https://www.torrent9.gs/ + - https://www.torrent9.ps/ + - https://www.torrent9.ms/ + - https://www.torrent9.ink/ + - https://www.torrent9.sk/ + - https://www.torrent9.rs/ + +caps: + categorymappings: + - {id: Films, cat: Movies, desc: "Movies"} + - {id: Animes, cat: TV/Anime, desc: "Anime"} + - {id: Séries, cat: TV, desc: "TV"} + - {id: Musiques, cat: Audio, desc: "Music"} + - {id: Ebooks, cat: Books, desc: "Books"} + - {id: Livres, cat: Books, desc: "Livres"} + - {id: Logiciels, cat: PC, desc: "Software"} + - {id: Jeux-PC, cat: PC/Games, desc: "PC Games"} + - {id: Jeux-Consoles, cat: Console/XBox 360, desc: "Console Games"} + - {id: Porno, cat: XXX, desc: "XXX"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + allowrawsearch: true + +settings: + - name: flaresolverr + type: info + label: FlareSolverr + default: This site may use Cloudflare DDoS Protection, therefore Prowlarr requires FlareSolverr to access it. + - name: multilang + type: checkbox + label: Replace MULTi by another language in release name + default: false + - name: multilanguage + type: select + label: Replace MULTi by this language + default: FRENCH + options: + FRENCH: FRENCH + MULTi FRENCH: MULTi FRENCH + ENGLISH: ENGLISH + MULTi ENGLISH: MULTi ENGLISH + VOSTFR: VOSTFR + MULTi VOSTFR: MULTi VOSTFR + - name: vostfr + type: checkbox + label: Replace VOSTFR and SUBFRENCH with ENGLISH + default: false + +download: + selectors: + - selector: a[href^="magnet:?"] + attribute: href + - selector: script:contains("magnet:?") + filters: + - name: regexp + args: "\\s'(magnet:\\?.+?)';" + +search: + paths: + - path: "{{ if .Keywords }}/recherche/{{ .Keywords }}{{ else }}{{ end }}" + keywordsfilters: + # if searching for season packs swith S01 to saison 1 #9712 + - name: re_replace + args: ["(?i)(S0)(\\d{1,2})$", "saison $2"] + - name: re_replace + args: ["(?i)(S)(\\d{1,3})$", "saison $2"] + + rows: + selector: table.table-striped > tbody > tr + + fields: + category: + selector: td:nth-child(1) i + attribute: class + title_phase1: + selector: td:nth-child(1) a + filters: + - name: re_replace + args: ["(?i)\\b(FRENCH|MULTI|TRUEFRENCH|VOSTFR|SUBFRENCH)\\b(.+?)(\\b(19|20\\d{2})\\b)$", "$3 $1$2"] + title_vostfr: + text: "{{ .Result.title_phase1 }}" + filters: + - name: re_replace + args: ["(?i)\\b(vostfr|subfrench)\\b", "ENGLISH"] + title_phase2: + text: "{{ if .Config.vostfr }}{{ .Result.title_vostfr }}{{ else }}{{ .Result.title_phase1 }}{{ end }}" + title_multilang: + text: "{{ .Result.title_phase2 }}" + filters: + - name: re_replace + args: ["(?i)\\b(MULTI(?!.*(?:FRENCH|ENGLISH|VOSTFR)))\\b", "{{ .Config.multilanguage }}"] + title: + text: "{{ if .Config.multilang }}{{ .Result.title_multilang }}{{ else }}{{ .Result.title_phase2 }}{{ end }}" + details: + selector: td:nth-child(1) a + attribute: href + download: + selector: td:nth-child(1) a + attribute: href + date: + text: now + size: + selector: td:nth-child(2) + seeders: + selector: td:nth-child(3) + optional: true + default: 0 + leechers: + selector: td:nth-child(4) + optional: true + default: 0 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/torrentbd.yml b/config/prowlarr/Definitions/torrentbd.yml new file mode 100644 index 0000000..cc194fd --- /dev/null +++ b/config/prowlarr/Definitions/torrentbd.yml @@ -0,0 +1,172 @@ +--- +id: torrentbd +name: TorrentBD +description: "A general Bangladesh tracker" +language: en-US +type: private +encoding: UTF-8 +links: + - https://www.torrentbd.net/ +legacylinks: + - http://www.torrentbd.com/torrent + - http://www.torrentbd.com/ + - https://www.torrentbd.com/ + +caps: + categorymappings: + # get the cats from https://www.torrentbd.net/feed.php?custom + - {id: 28, cat: TV/Anime, desc: "Anime - All"} + - {id: 65, cat: PC/Mobile-Android, desc: "Apps - Android"} + - {id: 18, cat: PC, desc: "Apps - PC"} + - {id: 19, cat: PC/Mac, desc: "Apps - Mac"} + - {id: 20, cat: PC, desc: "Apps - Linux"} + - {id: 49, cat: TV, desc: "Cartoons - All"} + - {id: 9, cat: TV/Documentary, desc: "Documentaries - All"} + - {id: 36, cat: Books/EBook, desc: "Other - E-Books"} + - {id: 73, cat: Books/Comics, desc: "E-Books - Comics"} + - {id: 77, cat: Books/EBook, desc: "E-Books - Manga"} + - {id: 10, cat: PC/Games, desc: "Games - PC"} + - {id: 60, cat: PC/Games, desc: "Games - Cracks | Patches"} + - {id: 52, cat: PC/Games, desc: "Games - Updates | DLC"} + - {id: 81, cat: PC/Games, desc: "Games - Backup"} + - {id: 43, cat: Console/PS3, desc: "Games - PlayStation"} + - {id: 14, cat: Console/XBox, desc: "Games - Xbox"} + - {id: 17, cat: Console, desc: "Games - Other"} + - {id: 86, cat: Movies/UHD, desc: "Movies - Blu-Ray Lossless 4K"} + - {id: 76, cat: Movies/BluRay, desc: "Movies - Blu-Ray Lossless 1080p"} + - {id: 80, cat: Movies/UHD, desc: "Movies - Blu-Ray 4K"} + - {id: 47, cat: Movies/HD, desc: "Movies - Blu-Ray 1080p"} + - {id: 42, cat: Movies/BluRay, desc: "Movies - Blu-Ray 720p"} + - {id: 24, cat: Movies/SD, desc: "Movies - Blu-Ray SD"} + - {id: 82, cat: Movies/WEB-DL, desc: "Movies - WEB-DL 4K"} + - {id: 55, cat: Movies/WEB-DL, desc: "Movies - WEB-DL"} + - {id: 83, cat: Movies/WEB-DL, desc: "Movies - WEBRip"} + - {id: 46, cat: Movies/HD, desc: "Movies - HD-Rip"} + - {id: 1, cat: Movies/SD, desc: "Movies - DVDRip"} + - {id: 4, cat: Movies/SD, desc: "Movies - CAM | TS | DVDScr | Pre-DVD"} + - {id: 67, cat: Movies/3D, desc: "Movies - 3D"} + - {id: 3, cat: Movies, desc: "Movies - Unrated"} + - {id: 2, cat: Movies, desc: "Movies - Packs"} + - {id: 22, cat: Audio, desc: "Music - Audio"} + - {id: 71, cat: Audio/Lossless, desc: "Music - Lossless"} + - {id: 25, cat: Audio/Video, desc: "Music - Video"} + - {id: 64, cat: Audio, desc: "Music - Concerts | Live Shows"} + - {id: 26, cat: Audio, desc: "Music - Radio"} + - {id: 38, cat: PC/Mobile-Other, desc: "Other - Mobile Phone"} + - {id: 44, cat: Other, desc: "Other - Religious"} + - {id: 40, cat: Other, desc: "Other - Miscellaneous"} + - {id: 70, cat: TV/Sport, desc: "Sports - Football"} + - {id: 6, cat: TV/Sport, desc: "Sports - Pro Wrestling"} + - {id: 48, cat: TV/Sport, desc: "Sports - All"} + - {id: 39, cat: Other, desc: "Tutorials - All"} + - {id: 84, cat: TV/UHD, desc: "TV - Episodes 4K"} + - {id: 61, cat: TV/HD, desc: "TV - Episodes 720p | 1080p"} + - {id: 5, cat: TV/SD, desc: "TV - Episodes SD"} + - {id: 85, cat: TV/UHD, desc: "TV - Packs 4K"} + - {id: 62, cat: TV/HD, desc: "TV - Packs - 720p | 1080p"} + - {id: 41, cat: TV/SD, desc: "TV - Packs SD"} + - {id: 66, cat: TV, desc: "TV - Awards | Ceremonies"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info_cookie + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Ensure you have the Remember me ticked and the Log Me Out if IP Changes unticked when you login
  3. Open the DevTools panel by pressing F12
  4. Select the Network tab
  5. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  6. Refresh the page by pressing F5
  7. Click on the first row entry
  8. Select the Headers tab on the Right panel
  9. Find 'cookie:' in the Request Headers section
  10. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: / + selector: button[href="account-logout.php"] + +search: + paths: + - path: ajgettorrents.php + method: post + inputs: + page: 1 + origin: home + # sort is not available on first call, requires 2nd call to ajsearch.php + sortBy: "" + query: "{{ .Keywords }}" + fl: "{{ if .Config.freeleech }}true{{ else }}false{{ end }}" + # internal + intrls: false + # activeonly + active: false + spcat: "" + + rows: + selector: table.torrents-table > tbody > tr + + fields: + category: + selector: td[onclick^="mtt.getSpCatTorrents"] + attribute: onclick + filters: + - name: regexp + args: (\d+) + title: + selector: a[href^="torrents-details.php?id="] + details: + selector: a[href^="torrents-details.php?id="] + attribute: href + download: + selector: a[href*="download.php?id="] + attribute: href + date: + selector: td.torrent-name span:last-child + filters: + - name: replace + args: ["<", ""] + - name: replace + args: ["mo", " months"] + - name: replace + args: ["s", " seconds"] + - name: replace + args: ["m", " minutes"] + - name: replace + args: ["h", " hours"] + - name: replace + args: ["d", " days"] + - name: replace + args: ["w", "weeks"] + - name: replace + args: ["y", "years"] + - name: timeago + size: + selector: td:nth-child(6) + seeders: + selector: td:nth-child(7) + leechers: + selector: td:nth-child(8) + grabs: + selector: td:nth-child(9) + downloadvolumefactor: + case: + img[src="images/free.gif"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 0.5 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# engine n/a diff --git a/config/prowlarr/Definitions/torrentby.yml b/config/prowlarr/Definitions/torrentby.yml new file mode 100644 index 0000000..fff1145 --- /dev/null +++ b/config/prowlarr/Definitions/torrentby.yml @@ -0,0 +1,127 @@ +--- +id: torrentby +name: torrent.by +description: "torrent.by is a BELARUSIAN public Torrent Tracker" +language: ru-RU +type: public +encoding: UTF-8 +links: + - https://torrent.by/ +legacylinks: + - http://torrent.by/ + +caps: + categories: + Other: Other + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: stripcyrillic + type: checkbox + label: Strip Cyrillic Letters + default: false + - name: addrussiantotitle + type: checkbox + label: Add RUS to end of all titles to improve language detection by Sonarr and Radarr. Will cause English-only results to be misidentified. + default: false + - name: info_8000 + type: info + label: About torrent.by Categories + default: torrent.by does not return categories in its search results.
To add to your Apps' Torznab indexer, replace all categories with 8000(Other). + +search: + paths: + - path: "{{ if .Keywords }}search/?search={{ .Keywords }}&cat=0&search_in=0{{ else }}today{{ end }}" + + keywordsfilters: + # strip season and/or ep + - name: re_replace + args: ["(?i)\\b(?:[SE]\\d{1,4}){1,2}\\b\\s?", ""] + + rows: + selector: tr[class^="ttable_col"] + + fields: + category: + text: other + title: + selector: td:nth-child(3) a + filters: + # normalize to SXXEYY format + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)[xх](\\d+(?:-\\d+)?)\\s*из\\s*(\\d+)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)[xх](\\d+(?:-\\d+)?)", "S$1E$2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*из\\s*(\\d+)", "E$1 of $2"] + - name: re_replace + args: ["(?i)\\bFiles-х\\b", "Files-x"] + - name: re_replace + args: ["(?i)\\sот\\s([\\w\\p{P}\\p{S}]+)$", "-$1"] + - name: re_replace + args: ["\\s\\|\\s(\\w{4,})$", "-$1"] + - name: re_replace + args: ["(\\([\\p{IsCyrillic}\\W]+\\))|(^[\\p{IsCyrillic}\\W\\d]+\\/ )|([\\p{IsCyrillic} \\-]+,+)|([\\p{IsCyrillic}]+)", "{{ if .Config.stripcyrillic }}{{ else }}$1$2$3$4{{ end }}"] + - name: re_replace + args: ["(?i)\\bHDTV[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bSAT[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bWEB[-\\s]?DL[-\\s]?Rip\\b", "WEB-DL"] + - name: re_replace + args: ["(?i)\\bWEB\\sRip\\b", "WEBRip"] + - name: re_replace + args: ["(?i)\\bWEB\\sDL\\b", "WEB-DL"] + - name: re_replace + args: ["[\\[\\(\\{<«][\\s\\W]*[\\]\\)\\}>»]", ""] + - name: re_replace + args: ["^[\\s&,\\.!\\?\\+\\-_\\|\\/':]+", ""] + - name: append + args: "{{ if .Config.addrussiantotitle }} RUS{{ else }}{{ end }}" + details: + selector: td:nth-child(3) a + attribute: href + download: + selector: a.dwnld + attribute: href + magnet: + selector: a[href^="magnet:?xt="] + attribute: href + size: + selector: td:nth-child(5) + seeders: + selector: font[color="green"] + leechers: + selector: font[color="red"] + date_day: + selector: td:nth-child(1):contains("Вчера"), td:nth-child(1):contains("Сегодня") + optional: true + filters: + - name: replace + args: ["Вчера", "Yesterday"] + - name: replace + args: ["Сегодня", "Today"] + - name: fuzzytime + date_year: + selector: td:nth-child(1):contains("-") + optional: true + filters: + - name: append + args: " +03:00" # MSK + - name: dateparse + args: "yyyy-MM-dd zzz" + date: + text: "{{ if or .Result.date_year .Result.date_day }}{{ or .Result.date_year .Result.date_day }}{{ else }}now{{ end }}" + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 + description: + selector: td:nth-child(3) a +# engine n/a diff --git a/config/prowlarr/Definitions/torrentccf.yml b/config/prowlarr/Definitions/torrentccf.yml new file mode 100644 index 0000000..9fb5dfb --- /dev/null +++ b/config/prowlarr/Definitions/torrentccf.yml @@ -0,0 +1,170 @@ +--- +id: torrentccf +name: TorrentCCF +description: "TorrentCCF (TCCF) is a CHINESE Private Torrent Tracker for HD MOVIES / TV" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://et8.org/ +legacylinks: + - http://et8.org/ + +caps: + categorymappings: + - {id: 622, cat: Movies, desc: "Movies.电影"} + - {id: 623, cat: TV, desc: "TV.电视剧"} + - {id: 624, cat: TV/Documentary, desc: "Documentaries.纪录片"} + - {id: 625, cat: PC, desc: "Appz.软件"} + - {id: 626, cat: Audio, desc: "Music & MusicVideos.音乐及MV"} + - {id: 627, cat: Other, desc: "Others.其他(非学习类)"} + - {id: 628, cat: Books/Other, desc: "Elearning - 杂项学习"} + - {id: 629, cat: Books/EBook, desc: "Elearning - 电子书/小说"} + - {id: 630, cat: Books/EBook, desc: "Elearning - 电子书/非小说"} + - {id: 631, cat: Books/Mags, desc: "Elearning - 杂志"} + - {id: 632, cat: Books/Comics, desc: "Elearning - 漫画"} + - {id: 633, cat: Audio/Audiobook, desc: "Elearning - 有声书"} + - {id: 634, cat: Books, desc: "Elearning - 公开课"} + - {id: 635, cat: Books, desc: "Elearning - 视频教程"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + book-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + method: get + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + # currently supports only one query id at one time. + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl + search_area: "{{ if .Query.IMDBID }}4{{ else }}{{ end }}{{ if .Query.DoubanID }}1{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }}{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + imdbid: + selector: a[href^="details.php?id="][onmouseover] + attribute: onmouseover + filters: + - name: regexp + args: tt(\d+) + size: + selector: td:nth-child(5) + grabs: + selector: td:nth-child(8) + seeders: + selector: td:nth-child(6) + leechers: + selector: td:nth-child(7) + date_elapsed: + # time type: time elapsed (default) + selector: td:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumratio: + text: 0.8 + description: + selector: td:nth-child(2) + remove: a, img +# NexusPHP Standard v1.5 Beta 3 diff --git a/config/prowlarr/Definitions/torrentcore.yml b/config/prowlarr/Definitions/torrentcore.yml new file mode 100644 index 0000000..277722c --- /dev/null +++ b/config/prowlarr/Definitions/torrentcore.yml @@ -0,0 +1,111 @@ +--- +id: torrentcore +name: Torrent[CORE] +description: "Torrent[CORE] is a Public DHT Crawler" +language: en-US +type: public +encoding: UTF-8 +links: + - https://torrentcore.xyz/ + +caps: + categorymappings: + - {id: 0DAY, cat: PC/0day, desc: Software 0DAY} + - {id: DVDR, cat: Movies/DVD, desc: Movies DVDR} + - {id: EBOOK, cat: Books, desc: Ebook} + - {id: FLAC, cat: Audio/Lossless, desc: Music FLAC} + - {id: GAMES, cat: PC/Games, desc: Games} + - {id: MP3, cat: Audio/MP3, desc: Music MP3} + - {id: MP4, cat: Movies, desc: Movies MP4} + - {id: PDA, cat: PC/Mobile-Other, desc: Software PDA} + - {id: PS3, cat: Console/PS3, desc: Games PS3} + - {id: TV, cat: TV, desc: TV} + - {id: TV-DVDRIP, cat: TV/SD, desc: TV DVDRIP} + - {id: TV-X265, cat: TV/HD, desc: TV X265} + - {id: TV-XVID, cat: TV/SD, desc: TV XVID} + - {id: UNKNOWN, cat: Other, desc: Unknown} + - {id: X264, cat: Movies/HD, desc: Movies X264} + - {id: XBOX360, cat: Console/XBox 360, desc: Games XBOX360} + - {id: XVID, cat: Movies/SD, desc: Movies XVID} + - {id: XXX, cat: XXX, desc: Adult} + - {id: XXX-0DAY, cat: XXX, desc: Adult 0DAY} + - {id: XXX-IMGSET, cat: XXX/ImageSet, desc: Adult IMGSET} + - {id: XXX-X264, cat: XXX, desc: Adult X264} + - {id: XXX-X265, cat: XXX, desc: Adult X265} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: [] + +download: + infohash: + hash: + selector: div.content + filters: + - name: regexp + args: "Hash: ([A-F|a-f|0-9]{40})" + title: + selector: font[color="orange"] + filters: + - name: trim + - name: validfilename + +search: + paths: + - path: "{{ if .Keywords }}search?s={{ .Keywords }}{{ else }}index{{ end }}" + # search is an exact match, there are no wild cards, or +word or AND/OR, and spaces and dots are treated uniquely + + rows: + selector: div.content font[color="purple"], div.content font[color="orange"]:has(a), div.content font[color="gray"], div.content font[color="white"] + after: 3 + + fields: + category: + selector: img[src^="./cat/"] + attribute: src + optional: true + default: UNKNOWN + filters: + - name: regexp + args: "cat/(.+?).png" + title: + selector: a + details: + selector: a + attribute: href + download: + selector: a + attribute: href + size: + selector: font[color="purple"] + filters: + - name: regexp + args: "Size: (.+?)/" + files: + selector: font[color="purple"] + filters: + - name: regexp + args: "File: (\\d+)" + date: + selector: font[color="purple"] + filters: + - name: regexp + args: "\\[ (\\d{2} [A-Za-z]+ \\d{4} \\d{2}:\\d{2}:\\d{2}) \\]" + - name: append + args: " -07:00" # PDT + - name: dateparse + args: "dd MMMM yyyy HH:mm:ss zzz" + seeders: + text: 1 + leechers: + text: 1 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/torrentdd.yml b/config/prowlarr/Definitions/torrentdd.yml new file mode 100644 index 0000000..67ac445 --- /dev/null +++ b/config/prowlarr/Definitions/torrentdd.yml @@ -0,0 +1,173 @@ +--- +id: torrentdd +name: TorrentDD +description: "TorrentDD is a THAI Private Torrent Tracker for MOVIES / TV / GENERAL" +language: th-TH +type: private +encoding: UTF-8 +requestDelay: 2 +links: + - https://www.torrentdd.com/ + +caps: + categorymappings: + - {id: 1, cat: Other, desc: "พระมหากษัตริย์", default: true} + - {id: 2, cat: TV/Anime, desc: "การ์ตูน/อนิเมชั่น", default: true} + - {id: 3, cat: Console, desc: "Game/PSP/ND/Mobile", default: true} + - {id: 4, cat: PC/Games, desc: "Game/Pc/Ps/Xbox", default: true} + - {id: 5, cat: Books/Other, desc: "สื่อเรียนรู้/แม่และเด็ก", default: true} + - {id: 6, cat: Audio/Video, desc: "MV/karaoke", default: true} + - {id: 7, cat: Audio, desc: "เพลง", default: true} + - {id: 8, cat: PC/0day, desc: "OS Windows/Office", default: true} + - {id: 9, cat: PC/0day, desc: "AntiVirus/Antispyware", default: true} + - {id: 10, cat: PC/Mobile-Android, desc: "ซอฟแวร์ มือถือ/ธีม", default: true} + - {id: 11, cat: PC/Mac, desc: "ซอฟแวร์ แม็ค/ลินุกซ์", default: true} + - {id: 12, cat: PC/0day, desc: "ซอฟแวร์ทั่วไป", default: true} + - {id: 13, cat: Audio/Video, desc: "คอนเสิร์ต", default: true} + - {id: 14, cat: Audio/Other, desc: "ทอล์คโชว์/ตลก/วิทยุ", default: true} + - {id: 15, cat: Other/Misc, desc: "ทั่วไป", default: true} + - {id: 16, cat: Books/Other, desc: "ธรรมะ", default: true} + - {id: 17, cat: Other, desc: "font/icon/source", default: true} + - {id: 18, cat: Movies/UHD, desc: "ภาพยนตร์ 4K UHD", default: true} + - {id: 19, cat: Movies/HD, desc: "Hi-Def/Blu Ray", default: true} + - {id: 20, cat: Movies/SD, desc: "ภาพยนตร์ DVD", default: true} + - {id: 21, cat: Movies/SD, desc: "ภาพยนตร์ VCD", default: true} + - {id: 22, cat: Movies/SD, desc: "XviD/DivX/AVI/RM", default: true} + - {id: 23, cat: TV, desc: "รายการทีวี/วาไรตี้", default: true} + - {id: 24, cat: TV/Sport, desc: "กีฬา/ฟุตบอล", default: true} + - {id: 25, cat: Other, desc: "รูปภาพ/วอลเปเปอร์", default: true} + - {id: 26, cat: TV/Documentary, desc: "สารคดี", default: true} + - {id: 27, cat: Books/EBook, desc: "สื่อเรียนรู้/หนังสือ/Ebook", default: true} + - {id: 28, cat: TV/Foreign, desc: "หนังชุด/ซีรีส์ [เกาหลี]", default: true} + - {id: 29, cat: TV/Foreign, desc: "หนังชุด/ซีรีส์ [ญี่ปุ่น]", default: true} + - {id: 30, cat: TV/Foreign, desc: "หนังชุด/ซีรีส์ [จีน]", default: true} + - {id: 31, cat: TV/Foreign, desc: "หนังชุด/ซีรีส์ [ฝรั่ง]", default: true} + - {id: 32, cat: TV, desc: "หนังชุด/ซีรีส์ [ไทย]", default: true} + - {id: 33, cat: TV, desc: "คลิปทั่วไป", default: true} + - {id: 34, cat: XXX, desc: "XXX (uncensor)", default: false} + - {id: 35, cat: XXX, desc: "XXX (censor)", default: false} + - {id: 36, cat: XXX, desc: "XXX Clip", default: false} + - {id: 37, cat: XXX, desc: "XXX cartoon/book/pic", default: false} + - {id: 38, cat: XXX, desc: "XXX Gay/Lesbian", default: false} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeders: seeders + size: size + - name: type + type: select + label: Order requested from site + default: DESC + options: + DESC: desc + ASC: asc + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: div.alert-warning:contains("Login failed!") + test: + path: home.php + selector: a[href="logout.php"] + +download: + selectors: + - selector: button.border-success + attribute: onclick + filters: + - name: regexp + args: \'(.+?)\' + +search: + paths: + # https://www.torrentdd.com/browse.php?search=&sort=size&cate=1,4&freeload=yes&odb=DESC + - path: browse.php + categories: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33] + - path: browse18.php + categories: [34, 35, 36, 37, 38] + inputs: + cate: "{{ join .Categories \",\" }}" + freeload: "{{ if .Config.freeleech }}yes{{ else }}{{ end }}" + search: "{{ .Keywords }}" + sort: "{{ .Config.sort }}" + odb: "{{ .Config.type }}" + # site does not support imdbid searching and does not display imdb links in results. + + rows: + selector: div.mt-3 table tbody tr:not(:has(label.badge-outline-danger)) + + fields: + category: + selector: a[href^="?cate="] + attribute: href + filters: + - name: querystring + args: cate + title: + selector: a[href^="details.php?id="] + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="details.php?id="] + attribute: href + poster: + selector: a.box-poster + attribute: href + filters: + - name: regexp + args: '(.+?\.(jpg|jpeg|bmp|png)$)' + files: + selector: td:nth-last-child(7) + date: + selector: div.mt-2 span:first-child + filters: + - name: append + args: " +07:00" # ICT + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + size: + selector: td:nth-last-child(5) + grabs: + selector: td:nth-last-child(4) + seeders: + selector: td:nth-last-child(3) + leechers: + selector: td:nth-last-child(2) + downloadvolumefactor: + case: + label.badge-outline-success: 0 + "*": 1 + uploadvolumefactor: + case: + label.badge-outline-warning: 2 + "*": 1 + minimumratio: + text: 1.0 +# engine n/a diff --git a/config/prowlarr/Definitions/torrentdownload.yml b/config/prowlarr/Definitions/torrentdownload.yml new file mode 100644 index 0000000..ebd9a68 --- /dev/null +++ b/config/prowlarr/Definitions/torrentdownload.yml @@ -0,0 +1,166 @@ +--- +id: torrentdownload +name: TorrentDownload +description: "TorrentDownload is a Public torrent meta-search engine" +language: en-US +type: public +encoding: UTF-8 +links: + - https://www.torrentdownload.info/ + - https://torrentdownload.unblockit.date/ + - https://torrentdownload.mrunblock.bond/ + - https://torrentdownload.nocensor.cloud/ +legacylinks: + - https://torrentdownload.nocensor.space/ + - https://torrentdownload.nocensor.work/ + - https://torrentdownload.nocensor.biz/ + - https://torrentdownload.nocensor.sbs/ + - https://torrentdownload.unblockit.nz/ + - https://torrentdownload.nocensor.world/ + - https://torrentdownload.unblockit.page/ + - https://torrentdownload.unblockit.pet/ + - https://torrentdownload.nocensor.lol/ + - https://torrentdownload.unblockit.ink/ + - https://torrentdownload.unblockit.bio/ + - https://torrentdownload.unblockit.boo/ + - https://torrentdownload.mrunblock.guru/ + - https://torrentdownload.unblockit.click/ + - https://torrentdownload.unblockit.asia/ + - https://torrentdownload.unblockit.mov/ + - https://torrentdownload.mrunblock.life/ + - https://torrentdownload.unblockit.rsvp/ + - https://torrentdownload.nocensor.click/ + - https://torrentdownload.unblockit.vegas/ + - https://torrentdownload.unblockit.esq/ + - https://torrentdownload.unblockit.zip/ + - https://torrentdownload.unblockit.foo/ + - https://torrentdownload.unblockit.ing/ + +caps: + categorymappings: + - {id: Adult, cat: XXX, desc: Adult} + - {id: AdultPornHDVideo, cat: XXX, desc: "Adult Porn HD Video"} + - {id: AdultPornPictures, cat: XXX, desc: "Adult Porn Pictures"} + - {id: AdultPornVideo, cat: XXX, desc: "Adult Porn Video"} + - {id: Anime, cat: TV/Anime, desc: Anime} + - {id: AnimeEnglishtranslated, cat: TV/Anime, desc: "Anime English translated"} + - {id: AnimeAnimeOther, cat: TV/Anime, desc: "Anime Other"} + - {id: Applications, cat: PC/0day, desc: Applications} + - {id: ApplicationsAndroid, cat: PC/Mobile-Android, desc: "Applications Android"} + - {id: ApplicationsWindows, cat: PC/0day, desc: "Applications Windows"} + - {id: AudioBooks, cat: Audio/Audiobook, desc: "Books Audiobooks"} + - {id: AudioAudiobooks, cat: Audio/Audiobook, desc: "Books Audiobooks"} + - {id: AudioLossless, cat: Audio/Lossless, desc: "Audio Lossless"} + - {id: AudioMusic, cat: Audio/MP3, desc: "Audio Music"} + - {id: BooksAcademic, cat: Books, desc: "Books Academic"} + - {id: BooksComics, cat: Books/Comics, desc: "Books Comics"} + - {id: BooksEbooks, cat: Books/EBook, desc: "Books Ebooks"} + - {id: BooksEducational, cat: Books, desc: "Books Educational"} + - {id: BooksMagazines, cat: Books/Mags, desc: "Books Magazines"} + - {id: BooksFiction, cat: Books, desc: "Books Fiction"} + - {id: BooksNonfiction, cat: Books, desc: "Books Nonfiction"} + - {id: BooksTextbooks, cat: Books, desc: "Books Textbooks"} + - {id: Ebooks, cat: Books/EBook, desc: "Books Ebooks"} + - {id: Games, cat: Console, desc: Games} + - {id: GamesWindows, cat: PC/Games, desc: "Games Windows"} + - {id: Movies, cat: Movies, desc: Movies} + - {id: MoviesAction, cat: Movies, desc: Movies Action} + - {id: MoviesConcerts, cat: Movies, desc: "Movies Concerts"} + - {id: MoviesCrime, cat: Movies, desc: "Movies Crime"} + - {id: MoviesDocumentary, cat: TV/Documentary, desc: "Movies Documentary"} + - {id: MoviesDubbedMovies, cat: Movies, desc: "Movies Dubbed Movies"} + - {id: MoviesHighresMovies, cat: Movies, desc: "Movies Highres Movies"} + - {id: MoviesMusicvideos, cat: Audio/Video, desc: "Movies Musicvideos"} + - {id: MoviesThriller, cat: Movies, desc: "Movies Thriller"} + - {id: Music, cat: Audio, desc: Music} + - {id: MusicHardrock, cat: Audio, desc: "Music Hardrock"} + - {id: MusicMp, cat: Audio/MP3, desc: "Music Mp3"} + - {id: MusicFLAC, cat: Audio/Lossless, desc: "Music FLAC"} + - {id: MusicLossless, cat: Audio/Lossless, desc: "Music Lossless"} + - {id: MusicRB, cat: Audio, desc: "Music R&B"} + - {id: MusicTranceHouseDance, cat: Audio, desc: "Music Trance House Dance"} + - {id: Other, cat: Other, desc: Other} + - {id: OtherEbooks, cat: Books/EBook, desc: "Other Ebooks"} + - {id: OtherComics, cat: Other, desc: "Other Comics"} + - {id: OtherTutorials, cat: Other, desc: "Other Tutorials"} + - {id: OtherUnsorted, cat: Other, desc: "Other Unsorted"} + - {id: PicturesPicturesOther, cat: Other/Misc, desc: "Pictures Other"} + - {id: PicturesWallpapers, cat: Other/Misc, desc: "Pictures Wallpapers"} + - {id: Software, cat: PC/0day, desc: "Software"} + - {id: TV, cat: TV, desc: TV} + - {id: TVBBC, cat: TV, desc: "TV BBC"} + - {id: TVEllenDeGeneres, cat: TV, desc: "TV Ellen DeGeneres"} + - {id: TVOther, cat: TV/Other, desc: "TV Other"} + - {id: TVshows, cat: TV, desc: "TV shows"} + - {id: Television, cat: TV, desc: Television} + - {id: VideoMobile, cat: Movies, desc: "Movies Video Mobile"} + - {id: VideoMovies, cat: Movies, desc: "Video Movies"} + - {id: VideoMusic, cat: Audio/Video, desc: "Video Music"} + - {id: XXX, cat: XXX, desc: XXX} + - {id: XXXVideo, cat: XXX, desc: "XXX Video"} + - {id: XXXHDVideo, cat: XXX, desc: "XXX HD Video"} + - {id: XXXPictures, cat: XXX, desc: "XXX Pictures"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: sort + type: select + label: Sort requested from site (Applies only to Search with Keywords) + default: d + options: + d: created + _: seeders + +download: + selectors: + - selector: a[href^="magnet:?xt="] + attribute: href + +search: + paths: + - path: "search{{ re_replace .Config.sort \"_\" \"\" }}?q={{ if .Keywords }}{{ .Keywords }}{{ else }}{{ .Today.Year }}{{ end }}" + + rows: + selector: table.table2 > tbody > tr:has(span.smallish) + + fields: + category: + selector: div.tt-name > span.smallish + filters: + - name: re_replace + args: ["[^A-Za-z]+", ""] # strip everything but letters + title: + selector: div.tt-name > a[href^="/"] + details: + selector: div.tt-name > a[href^="/"] + attribute: href + download: + selector: div.tt-name > a[href^="/"] + attribute: href + date: + selector: td:nth-child(2) + filters: + - name: replace + args: ["right ", ""] + - name: replace + args: ["Last Month", "1 month ago"] + - name: replace + args: ["+", " ago"] + - name: timeago + size: + selector: td:nth-child(3) + seeders: + selector: td.tdseed + leechers: + selector: td.tdleech + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/torrentdownloads.yml b/config/prowlarr/Definitions/torrentdownloads.yml new file mode 100644 index 0000000..5636516 --- /dev/null +++ b/config/prowlarr/Definitions/torrentdownloads.yml @@ -0,0 +1,136 @@ +--- +id: torrentdownloads +name: Torrent Downloads +description: "Torrent Downloads (TD) is a Public torrent site for all kinds of content" +language: en-US +type: public +encoding: UTF-8 +links: + - https://www.torrentdownloads.pro/ + - https://torrentdownloads.unblockit.date/ + - https://torrentdownloads.mrunblock.bond/ + - https://torrentdownloads.unblockninja.com/ + - https://torrentdownloads.nocensor.cloud/ +legacylinks: + - https://www.torrentdownloads.me/ + - https://torrentdownloads.nocensor.work/ + - https://torrentdownloads.nocensor.biz/ + - https://torrentdownloads.nocensor.sbs/ + - https://torrentdownloads.unblockit.nz/ + - https://torrentdownloads.nocensor.world/ + - https://torrentdownloads.unblockit.page/ + - https://torrentdownloads.unblockit.pet/ + - https://torrentdownloads.nocensor.lol/ + - https://torrentdownloads.unblockit.ink/ + - https://torrentdownloads.unblockit.bio/ + - https://torrentdownloads.unblockit.boo/ + - https://www.torrentdownloads.info/ + - https://torrentdownloads.mrunblock.guru/ + - https://torrentdownloads.unblockit.click/ + - https://torrentdownloads.unblockit.asia/ + - https://torrentdownloads.unblockit.mov/ + - https://torrentdownloads.mrunblock.life/ + - https://torrentdownloads.unblockit.rsvp/ + - https://torrentdownloads.nocensor.click/ + - https://torrentdownloads.unblockit.vegas/ + - https://torrentdownloads.unblockit.esq/ + - https://torrentdownloads.unblockit.zip/ + - https://torrentdownloads.unblockit.foo/ + - https://torrentdownloads.unblockit.ing/ + +caps: + categorymappings: + - {id: 8, cat: TV, desc: "TV Shows"} + - {id: 4, cat: Movies, desc: "Movies"} + - {id: 5, cat: Audio, desc: "Music"} + - {id: 3, cat: PC/Games, desc: "Games"} + - {id: 7, cat: PC, desc: "Software"} + - {id: 1, cat: TV/Anime, desc: "Anime"} + - {id: 2, cat: Books, desc: "Books"} + - {id: 9, cat: Other, desc: "Other"} + - {id: 0, cat: Other, desc: "Other"} + - {id: 6, cat: Other, desc: "Pics"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + allowrawsearch: true + +settings: + - name: downloadlink + type: select + label: Download link + default: "magnet:" + options: + "http://itorrents.org/": "iTorrents.org" + "magnet:": "magnet" + - name: downloadlink2 + type: select + label: Download link (fallback) + default: "http://itorrents.org/" + options: + "http://itorrents.org/": "iTorrents.org" + "magnet:": "magnet" + - name: info_download + type: info + label: About the Download links + default: As the .torrent download links on this site are known to fail from time to time, you can optionally set as a fallback an automatic alternate link. + +download: + selectors: + - selector: a[href^="{{ .Config.downloadlink }}"] + attribute: href + - selector: a[href^="{{ .Config.downloadlink2 }}"] + attribute: href + +search: + paths: + - path: "{{ if .Keywords }}/search/{{ else }}/today/{{ end }}" + followredirect: true + inputs: + $raw: "{{ range .Categories }}s_cat={{.}}&{{end}}" + search: "{{ .Keywords }}" + + keywordsfilters: + - name: re_replace + args: ["\\W+", " "] + - name: trim + + rows: + selector: div.inner_container > div:has(p:has(a[href^="/torrent/"])):not(:has(span.__cf_email__)) + + fields: + category: + selector: img[src^="/templates/new/images/icons/menu_icon"] + attribute: src + filters: + - name: regexp + args: (\d+) + title: + selector: p:nth-child(1) > a + attribute: title + filters: + - name: replace + args: ["View torrent info : ", ""] + details: + selector: p:nth-child(1) > a[href^="/torrent/"] + attribute: href + download: + selector: p:nth-child(1) > a[href^="/torrent/"] + attribute: href + date: + text: now + size: + selector: span:nth-child(5) + seeders: + selector: span:nth-child(4) + leechers: + selector: span:nth-child(3) + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/torrenteros-api.yml b/config/prowlarr/Definitions/torrenteros-api.yml new file mode 100644 index 0000000..5ac8c1d --- /dev/null +++ b/config/prowlarr/Definitions/torrenteros-api.yml @@ -0,0 +1,171 @@ +--- +id: torrenteros-api +name: Torrenteros (API) +description: "Torrenteros (TTR) is a SPANISH site for MOVIES / TV / GENERAL" +language: es-ES +type: private +encoding: UTF-8 +links: + - https://torrenteros.org/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Movies"} + - {id: 2, cat: TV, desc: "TV"} + - {id: 3, cat: Audio, desc: "Music"} + - {id: 4, cat: Console, desc: "Game"} + - {id: 5, cat: PC, desc: "Application"} + - {id: 6, cat: Books, desc: "Libros"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + music-search: [q] + book-search: [q] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your TTR account My Settings page and clicking on the API Key tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + inputs: {} # TODO: remove in v10 + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: "/api/torrents/filter" + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + # if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6 + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + seasonNumber: "{{ .Query.Season }}" + episodeNumber: "{{ .Query.Ep }}" + imdbId: "{{ .Query.IMDBIDShort }}" + tmdbId: "{{ .Query.TMDBID }}" + tvdbId: "{{ .Query.TVDBID }}" + "free[]": "{{ if .Config.freeleech }}100{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + + rows: + selector: data + attribute: attributes + + fields: + category: + selector: category_id + title: + selector: name + details: + selector: details_link + download: + selector: download_link + infohash: + selector: info_hash + poster: + selector: meta.poster + filters: + - name: replace + args: ["https://via.placeholder.com/90x135", ""] + imdbid: + selector: imdb_id + tmdbid: + selector: tmdb_id + tvdbid: + selector: tvdb_id + genre: + selector: meta.genres + filters: + - name: re_replace + args: ["(?i)(Ciencia ficción)", "Ciencia_ficción"] + - name: re_replace + args: ["(?i)(TV Movie)", "TV_Movie"] + - name: replace + args: [" & ", "_&_"] + description: + text: "{{ .Result.genre }}" + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0%, 25%, 50%, 75%, 100% + selector: freeleech + case: + 0%: 1 # not free + 25%: 0.75 + 50%: 0.5 + 75%: 0.25 + 100%: 0 # freeleech + "*": 0 # catch errors + uploadvolumefactor: + # api returns False, True + selector: double_upload + case: + False: 1 # normal + True: 2 # double +# global MR is 0.4 but torrents must be seeded for 7 days regardless of ratio +# minimumratio: +# text: 0.4 + minimumseedtime: + # 7 days (as seconds = 7 x 24 x 60 x 60) + text: 604800 +# json UNIT3D 7.0.3 diff --git a/config/prowlarr/Definitions/torrentfunk.yml b/config/prowlarr/Definitions/torrentfunk.yml new file mode 100644 index 0000000..4ebeefa --- /dev/null +++ b/config/prowlarr/Definitions/torrentfunk.yml @@ -0,0 +1,130 @@ +--- +id: torrentfunk +name: TorrentFunk +description: "TorrentFunk is a Public torrent index" +language: en-US +type: public +encoding: UTF-8 +links: + - https://www.torrentfunk.com/ + - https://www.torrentfunk2.com/ + - https://torrentfunk.unblockit.date/ + - https://torrentfunk.nocensor.cloud/ + - https://torrentfunk.mrunblock.bond/ + - https://torrentfunk.ninjaproxy1.com/ +legacylinks: + - https://torrentfunk.nocensor.space/ + - https://torrentfunk.nocensor.work/ + - https://torrentfunk.nocensor.biz/ + - https://torrentfunk.nocensor.sbs/ + - https://torrentfunk.unblockit.nz/ + - https://torrentfunk.nocensor.world/ + - https://torrentfunk.unblockit.page/ + - https://torrentfunk.unblockit.pet/ + - https://torrentfunk.nocensor.lol/ + - https://torrentfunk.unblockit.ink/ + - https://torrentfunk.unblockit.bio/ + - https://torrentfunk.unblockit.boo/ + - https://torrentfunk.mrunblock.guru/ + - https://torrentfunk.unblockit.click/ + - https://torrentfunk.unblockit.asia/ + - https://torrentfunk.mrunblock.life/ # This web property is not accessible via this address + - https://torrentfunk.unblockit.mov/ + - https://torrentfunk.unblockit.rsvp/ + - https://torrentfunk.nocensor.click/ + - https://torrentfunk.unblockit.vegas/ + - https://torrentfunk.unblockit.esq/ + - https://torrentfunk.unblockit.zip/ + - https://torrentfunk.unblockit.foo/ + - https://torrentfunk.unblockit.ing/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: Movies} + - {id: 2, cat: Audio, desc: Music} + - {id: 3, cat: TV, desc: Television} + - {id: 4, cat: PC/Games, desc: Games} + - {id: 5, cat: PC, desc: Software} + - {id: 6, cat: TV/Anime, desc: Anime} + - {id: 7, cat: XXX, desc: Adult} + - {id: 8, cat: Other, desc: Other(tbd)} + - {id: 9, cat: Other, desc: Other(tbd)} + - {id: 0, cat: Other, desc: Other(tbd)} + - {id: 10, cat: Other, desc: Other(tbd)} + - {id: 11, cat: Other, desc: Other(tbd)} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + +settings: [] + +search: + paths: + # https://www.torrentfunk.com/all/torrents/morty-402-castellano.html + - path: "all/torrents/{{ if .Keywords }}{{ .Keywords }}{{ else }}{{ .Today.Year }}{{ end }}.html" + keywordsfilters: + - name: re_replace + args: ["[\\s]+", "-"] + - name: tolower + + rows: + selector: table.tmain tbody tr:has(a[href^="/torrent/"]) + filters: + - name: andmatch + + fields: + category: + selector: td[class^="tv"], td[class^="tn"] + attribute: class + filters: + - name: regexp + args: (\d+) + title: + selector: div a[href^="/torrent/"] + details: + selector: div a[href^="/torrent/"] + attribute: href + download: + # /tor/25878251.torrent + selector: div a[href^="/torrent/"] + attribute: href + filters: + - name: split + args: ["/", 2] + - name: prepend + args: "/tor/" + - name: append + args: ".torrent" + date_day: + # Today + # Yesterday + selector: td:nth-child(2):contains("day") + optional: true + filters: + - name: fuzzytime + date_month: + # 7 Jul + # 25 Dec + selector: td:nth-child(2):not(:contains("day")) + optional: true + filters: + - name: append + args: " -07:00" # PDT + - name: dateparse + args: "d MMM zzz" + date: + text: "{{ if or .Result.date_month .Result.date_day }}{{ or .Result.date_month .Result.date_day }}{{ else }}now{{ end }}" + size: + selector: td:nth-child(3) + seeders: + selector: td:nth-child(4) + leechers: + selector: td:nth-child(5) + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/torrentgalaxy.yml b/config/prowlarr/Definitions/torrentgalaxy.yml new file mode 100644 index 0000000..ec6d4e2 --- /dev/null +++ b/config/prowlarr/Definitions/torrentgalaxy.yml @@ -0,0 +1,202 @@ +--- +id: torrentgalaxy +name: TorrentGalaxy +description: "TorrentGalaxy (TGx) is a Public site for TV / MOVIES / GENERAL" +language: en-US +type: public +encoding: UTF-8 +links: + - https://torrentgalaxy.to/ + - https://torrentgalaxy.mx/ + - https://tgx.rs/ + - https://tgx.sb/ + - https://torrentgalaxy.unblockninja.com/ +legacylinks: + - https://torrentgalaxy.org/ # redirects to *.to + - https://torrentgalaxy.pw/ # proxy list only + - https://tgx.unblocked.monster/ + - https://torrentgalaxy.nocensor.space/ + - https://torrentgalaxy.nocensor.work/ + - https://torrentgalaxy.nocensor.biz/ + - https://torrentgalaxy.nocensor.sbs/ + - https://torrentgalaxy.nocensor.world/ # banned + - https://torrentgalaxy.unblockit.cat/ + - https://torrentgalaxy.unblockit.nz/ + - https://torrentgalaxy.unblockit.page/ + - https://torrentgalaxy.unblockit.pet/ + - https://torrentgalaxy.unblockit.ink/ + - https://torrentgalaxy.unblockit.bio/ + - https://torrentgalaxy.su/ + - https://torrentgalaxy.unblockit.click/ + - https://torrentgalaxy.unblockit.asia/ + - https://torrentgalaxy.unblockit.mov/ + - https://torrentgalaxy.unblockit.rsvp/ + - https://torrentgalaxy.unblockit.vegas/ + - https://torrentgalaxy.unblockit.esq/ + - https://torrentgalaxy.unblockit.zip/ + - https://torrentgalaxy.unblockit.foo/ # 504 + - https://torrentgalaxy.unblockit.ing/ # 504 + +caps: + categorymappings: + - {id: 28, cat: TV/Anime, desc: "Anime - All"} + - {id: 20, cat: PC/Mobile-Other, desc: "Apps - Mobile"} + - {id: 21, cat: PC, desc: "Apps - Other"} + - {id: 18, cat: PC/0day, desc: "Apps - Windows"} + - {id: 13, cat: Audio/Audiobook, desc: "Books - Audiobooks"} + - {id: 19, cat: Books/Comics, desc: "Books - Comics"} + - {id: 12, cat: Books/EBook, desc: "Books - Ebooks"} + - {id: 14, cat: Books/Technical, desc: "Books - Education"} + - {id: 15, cat: Books/Mags, desc: "Books - Magazine"} + - {id: 9, cat: TV/Documentary, desc: "Documentaries - All"} + - {id: 43, cat: PC/Mobile-Other, desc: "Games - Mobile"} + - {id: 10, cat: PC/Games, desc: "Games - Windows"} + - {id: 3, cat: Movies/UHD, desc: "Movies - 4K UHD"} + - {id: 46, cat: Movies/Foreign, desc: "Movies - Bollywood"} + - {id: 45, cat: Movies/Other, desc: "Movies - CAM/TS"} + - {id: 42, cat: Movies/HD, desc: "Movies - HD"} + - {id: 4, cat: Movies, desc: "Movies - Packs"} + - {id: 1, cat: Movies/SD, desc: "Movies - SD"} + - {id: 22, cat: Audio, desc: "Music - Albums"} + - {id: 26, cat: Audio, desc: "Music - Discography"} + - {id: 23, cat: Audio/Lossless, desc: "Music - Lossless"} + - {id: 25, cat: Audio/Video, desc: "Music - Musicvideo"} + - {id: 24, cat: Audio, desc: "Music - Singles"} + - {id: 17, cat: Audio/Other, desc: "Audio - Other"} + - {id: 40, cat: Other/Misc, desc: "Other - Other"} + - {id: 37, cat: Other, desc: "Other - Pictures"} + - {id: 33, cat: Other, desc: "Other - Training"} + - {id: 41, cat: TV/HD, desc: "TV - Episodes HD"} + - {id: 5, cat: TV/SD, desc: "TV - Episodes SD"} + - {id: 11, cat: TV/UHD, desc: "TV - Episodes 4K UHD"} + - {id: 6, cat: TV/Other, desc: "TV - Packs"} + - {id: 7, cat: TV/Sport, desc: "TV - Sports"} + - {id: 35, cat: XXX/x264, desc: "XXX - HD"} + - {id: 47, cat: XXX/Other, desc: "XXX - Misc"} + - {id: 34, cat: XXX/SD, desc: "XXX - SD"} + - {id: 48, cat: XXX/UHD, desc: "XXX - 4K UHD"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: excludeads + type: checkbox + label: Exclude results which include advertisements + default: false + - name: sort + type: select + label: Sort requested from site + default: id + options: + id: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + # https://torrentgalaxy.to/galaxyfence.php?f&dropoff=%2Ftorrents.php%3Fsearch%3DHarry%2BPotter + path: galaxyfence.php?f + method: form + form: form[action="/galaxyfence.php"] + inputs: + dropoff: /torrents.php + captcha: + type: image + selector: img#captcha + input: captcha + error: + - selector: span:contains("Captcha incorrect") + test: + path: / + selector: a[href="/account-login.php"] + +search: + # https://torrentgalaxy.org/torrents.php?c41=1&search=mercedes+s02e04&lang=0&sort=id&order=desc + path: torrents.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + lang: 0 + sort: "{{ .Config.sort }}" + order: "{{ .Config.type }}" + + rows: + selector: "div.tgxtable > div:has(div[class^=\"tgxtablecell shrink\"]){{ if .Config.excludeads }}:not(:has(i.fab.fa-adversal)){{ else }}{{ end }}" + + fields: + _ads: + optional: true + selector: i.fab.fa-adversal + attribute: title + category: + selector: div a[href^="/torrents.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_full: + selector: div a[href^="/torrent/"] + attribute: title + # this title text is abbreviated but may be needed when quotes in full title cause empty title #8585 + title_text: + selector: div a[href^="/torrent/"] + # fall back title, use href and clean it up + title_href: + selector: div a[href^="/torrent/"] + attribute: href + filters: + - name: re_replace + args: ["-quot-", " "] + - name: re_replace + args: ["-", " "] + title: + text: "{{ if or .Result.title_full .Result.title_text }}{{ or .Result.title_full .Result.title_text }}{{ else }}{{ .Result.href }}{{ end }}{{ if .Result._ads }} (Ads included!){{ else }}{{ end }}" + details: + selector: div a[href^="/torrent/"] + attribute: href + magnet: + selector: div a[href^="magnet:?"] + attribute: href + imdbid: + selector: a[href^="/torrents.php?search=tt"] + attribute: href + size: + selector: div span[style^="border-radius"] + seeders: + selector: div span[title="Seeders/Leechers"] font b + leechers: + selector: div span[title="Seeders/Leechers"] font:nth-child(2) b + date_ago: + # 20Mins ago + optional: true + selector: div td:last-of-type:contains("ago") + filters: + - name: timeago + date_year: + # 24/12/18 13:55 + optional: true + selector: div td:last-of-type small:contains(":") + filters: + - name: append + args: " -07:00" # PDT + - name: dateparse + args: "dd/MM/yy HH:mm zzz" + date: + text: "{{ if or .Result.date_year .Result.date_ago }}{{ or .Result.date_year .Result.date_ago }}{{ else }}now{{ end }}" + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/torrenthr.yml b/config/prowlarr/Definitions/torrenthr.yml new file mode 100644 index 0000000..5e59ba3 --- /dev/null +++ b/config/prowlarr/Definitions/torrenthr.yml @@ -0,0 +1,131 @@ +--- +id: torrenthr +name: TorrentHR +description: "TorrentHR is a ratioless CROATIAN Private Torrent Tracker for 0DAY / GENERAL" +language: hr-HR +type: private +encoding: windows-1250 +links: + - https://www.torrenthr.org/ + +caps: + categorymappings: + - {id: 31, cat: TV/Anime, desc: "Anime"} + - {id: 4, cat: Movies/SD, desc: "Filmovi/SD"} + - {id: 18, cat: Movies/Foreign, desc: "Crtani Filmovi"} + - {id: 5, cat: PC/Games, desc: "Igre/PC"} + - {id: 7, cat: TV/SD, desc: "Serije/SD"} + - {id: 1, cat: PC/0day, desc: "Aplikacije"} + - {id: 14, cat: Movies/DVD, desc: "Filmovi/DVD"} + - {id: 12, cat: TV/Documentary, desc: "Dokumentarni Filmovi"} + - {id: 27, cat: Console/PS4, desc: "Igre/PS"} + - {id: 34, cat: TV/HD, desc: "Serije/HD"} + - {id: 25, cat: Books, desc: "E-books"} + - {id: 17, cat: Movies/HD, desc: "Filmovi/HD"} + - {id: 11, cat: Audio, desc: "Koncerti/Spotovi"} + - {id: 28, cat: Console/Wii, desc: "Igre/Wii"} + - {id: 30, cat: Books/Comics, desc: "Stripovi"} + - {id: 38, cat: PC/Mobile-Other, desc: "Smartphone"} + - {id: 40, cat: Movies/BluRay, desc: "Filmovi/BD"} + - {id: 3, cat: Audio/MP3, desc: "Glazba/MP3"} + - {id: 26, cat: Console/XBox, desc: "Igre/Xbox"} + - {id: 10, cat: XXX, desc: "XXX/SD"} + - {id: 16, cat: TV, desc: "THR Packs"} + - {id: 15, cat: TV/Sport, desc: "Sport"} + - {id: 29, cat: Audio/Lossless, desc: "Glazba/FLAC"} + - {id: 13, cat: Other, desc: "Ostalo"} + - {id: 36, cat: XXX, desc: "XXX/HD"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + ssl: yes + error: + - selector: div.glavni:has(div.glavni_naslov:contains("Greška")) + test: + path: browse.php + selector: a[href*="logout.php"] + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + incldead: 1 + sort: 4 + type: desc + + rows: + selector: div.glavni_txt table > tbody > tr[id^="record-"] + + fields: + category: + selector: td.kategorije > a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title_optional: + optional: true + selector: a[href^="details.php?id="][title] + attribute: title + title_optional2: + optional: true + selector: a[href^="details.php?id="][onmousemove] + attribute: onmousemove + filters: + - name: regexp + args: "return overlibImage\\('(.*)','.*'\\);" + title: + text: "{{ if or .Result.title_optional .Result.title_optional2 }}{{ or .Result.title_optional .Result.title_optional2 }}{{ else }}{{ .Result.title_default }}{{ end }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + files: + selector: td:nth-child(5) + size: + selector: td:nth-child(7) + grabs: + selector: td:nth-child(7) + seeders: + selector: td:nth-child(9) + leechers: + selector: td:nth-child(10) + poster: + selector: a[href^="details.php?id="][onmousemove] + attribute: onmousemove + filters: + - name: regexp + args: "return overlibImage\\('.*','(.*)'\\);" + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 + date: + selector: td:nth-child(2) > small + # auto adjusted by site account profile + filters: + - name: replace + args: [" u ", " "] + - name: dateparse + args: "dd.MM.yyyy HH:mm:ss" + description: + selector: td:nth-child(2) + remove: a, br, small +# engine tbd diff --git a/config/prowlarr/Definitions/torrenting.yml b/config/prowlarr/Definitions/torrenting.yml new file mode 100644 index 0000000..1c5b3c2 --- /dev/null +++ b/config/prowlarr/Definitions/torrenting.yml @@ -0,0 +1,125 @@ +--- +id: torrenting +name: Torrenting +description: "Torrenting (TT) is a Private site for MOVIES / TV / GENERAL" +language: en-US +type: private +encoding: windows-1252 +links: + - https://torrenting.com/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Movies"} + - {id: 2, cat: XXX, desc: "XXX"} + - {id: 3, cat: Movies/BluRay, desc: "Movies/BluRay"} + - {id: 4, cat: TV/SD, desc: "TV/SD-x264"} + - {id: 5, cat: TV/HD, desc: "TV/HD-x264"} + - {id: 11, cat: Movies/HD, desc: "Movies/HD"} + - {id: 18, cat: TV, desc: "TV/Packs"} + - {id: 21, cat: Console, desc: "Games/Consoles"} + - {id: 26, cat: Audio/Video, desc: "Music/Videos"} + - {id: 27, cat: Audio, desc: "Music/Audio"} + - {id: 29, cat: TV/Anime, desc: "Anime/Toons"} + - {id: 30, cat: Books, desc: "Books"} + - {id: 34, cat: PC/0day, desc: "Applications"} + - {id: 35, cat: PC/Games, desc: "Games/PC"} + - {id: 38, cat: Movies/Foreign, desc: "Movies/Non-English"} + - {id: 40, cat: Movies/DVD, desc: "Movies/DVD-R"} + - {id: 47, cat: Movies, desc: "Movies/Packs"} + - {id: 49, cat: Movies/HD, desc: "Movies/x265"} + - {id: 55, cat: TV/Sport, desc: "Sports"} + - {id: 82, cat: TV/Foreign, desc: "TV/Non-English"} + - {id: 93, cat: Audio, desc: "Music/Packs"} + - {id: 99, cat: TV/HD, desc: "TV/x265"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: t + selector: a[href="/logout.php"] + +search: + paths: + # https://torrenting.com/t?1=&5=&free=on&q=climax&qf=ti + - path: t + inputs: + $raw: "{{ range .Categories }}{{.}}=&{{end}}" + q: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }} {{ else }}{{ end }}{{ .Keywords }}" + qf: "{{ if .Query.IMDBID }}adv{{ else }}ti{{ end }}" + free: "{{ if .Config.freeleech }}on{{ else }}{{ end }}" + + rows: + selector: table#torrentsTable > tbody > tr:has(td.torrentNameInfo) + + fields: + category: + selector: a[href^="?"] + attribute: href + filters: + - name: replace + args: ["?", ""] + title: + selector: a[href^="/torrent.php?id="] + details: + selector: a[href^="/torrent.php?id="] + attribute: href + download: + selector: a[href^="/download.php/"] + attribute: href + genre: + selector: td.torrentNameInfo > div + filters: + - name: re_replace + args: ["(?i)(Science Fiction)", "Science_Fiction"] + - name: validate + args: "Action, Adventure, Animation, Biography, Comedy, Crime, Documentary, Drama, Family, Fantasy, Game-Show, History, Horror, Music, Musical, Mystery, News, Reality-TV, Romance, Science_Fiction, Sci-Fi, Short, Sitcom, Sport, Talk-Show, Thriller, War, Western" + description: + text: "{{ .Result.genre }}" + date: + selector: td.torrentNameInfo > div + filters: + - name: re_replace + args: [" by.*", ""] + - name: split + args: ["|", -1] + seeders: + selector: td:nth-last-child(2) + leechers: + selector: td:nth-last-child(1) + size: + selector: td:nth-last-child(3) + downloadvolumefactor: + case: + "span:contains(\"FreeLeech\")": 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.1 + minimumseedtime: + # 3 days (as seconds = 3 x 24 x 60 x 60) + text: 259200 +# engine n/a diff --git a/config/prowlarr/Definitions/torrentkitty.yml b/config/prowlarr/Definitions/torrentkitty.yml new file mode 100644 index 0000000..382d3a5 --- /dev/null +++ b/config/prowlarr/Definitions/torrentkitty.yml @@ -0,0 +1,73 @@ +--- +id: torrentkitty +name: TorrentKitty +description: "TorrentKitty is a Public torrent indexer" +language: en-US +type: public +encoding: UTF-8 +links: + - https://www.torrentkitty.tv/ + - https://www.torrentkitty.se/ + - https://www.torrentkitty.io/ + - https://www.torrentkitty.vip/ + - https://www.torrentkitty.app/ + - https://www.torrentkitty.red/ + - https://www.torrentkitty.lol/ + - https://www.torrentkitty.best/ + - https://www.torrentkitty.ink/ + +caps: + categories: + Other: Other + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + +settings: + - name: flaresolverr + type: info + label: FlareSolverr + default: This site may use Cloudflare DDoS Protection, therefore Prowlarr requires FlareSolverr to access it. + - name: info_8000 + type: info + label: About TorrentKitty Categories + default: TorrentKitty does not return categories in its search results.
To add to your Apps' Torznab indexer, replace all categories with 8000(Other). + +search: + paths: + - path: "search/{{ if .Keywords }}{{ .Keywords }}{{ else }}{{ .Today.Year }}{{ end }}" + + rows: + selector: table#archiveResult tbody tr:has(a[href^="magnet:?xt="]) + + fields: + category: + text: Other + title: + selector: td.name + details: + selector: td.action a + attribute: href + download: + selector: a[href^="magnet:?xt="] + attribute: href + date: + selector: td.date + filters: + - name: append + args: " -07:00" # PDT + - name: dateparse + args: "yyyy-MM-dd zzz" + size: + selector: td.size + seeders: + text: 1 + leechers: + text: 1 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/torrentland-api.yml b/config/prowlarr/Definitions/torrentland-api.yml new file mode 100644 index 0000000..a1aae22 --- /dev/null +++ b/config/prowlarr/Definitions/torrentland-api.yml @@ -0,0 +1,204 @@ +--- +id: torrentland-api +name: Torrentland (API) +description: "Torrentland is a SPANISH Private Torrent Tracker for MOVIES / TV / GENERAL" +language: es-ES +type: private +encoding: UTF-8 +links: + - https://torrentland.li/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Películas"} + - {id: 2, cat: TV, desc: "Series"} + - {id: 3, cat: TV/Anime, desc: "Animación"} + - {id: 4, cat: TV/Anime, desc: "Series Animación"} + - {id: 5, cat: TV/Documentary, desc: "Documentales"} + - {id: 6, cat: TV/Documentary, desc: "Series Documentales"} + - {id: 7, cat: TV/Sport, desc: "Deportes"} + - {id: 8, cat: Audio/Video, desc: "Videos Músicales"} + - {id: 9, cat: XXX, desc: "+18"} + - {id: 10, cat: Other, desc: "Otros"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + music-search: [q] + book-search: [q] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your Torrentland account My Security page and clicking on the API Token tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: compatOld + type: checkbox + label: Improve Sonarr compatibility with the tracker's older season naming scheme by renaming Sxx to Txx in searches. Can cause results already using Sxx to not be found. + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_thanks + type: info + label: About Thanks + default: "Torrentland requires all downloads to be thanked. After initiating a download with this indexer, use your browser to visit the torrent details page and click the thank you button. Failure to maintain a 1:1 thank ratio will lead to loss of RSS and API access." + +login: + path: /api/torrents + method: get + inputs: {} # TODO: remove in v10 + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://hdinnovations.github.io/UNIT3D-Community-Edition-Docs/api_endpoints.html + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php + - path: "/api/torrents/filter" + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + # if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6 + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + seasonNumber: "{{ .Query.Season }}" + episodeNumber: "{{ .Query.Ep }}" + imdbId: "{{ .Query.IMDBIDShort }}" + tmdbId: "{{ .Query.TMDBID }}" + tvdbId: "{{ .Query.TVDBID }}" + free[]: "{{ if .Config.freeleech }}100{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + - name: re_replace + args: ["(?i)\\bS(\\d+)", "{{ if .Config.compatOld }}T$1{{ else }}S$1{{ end }}"] + + rows: + selector: data + attribute: attributes + + fields: + category: + selector: category_id + title_vose: + selector: name:contains(VOSE) + optional: true + filters: + - name: append + args: " ENGLiSH" + title_notvose: + selector: name:not(:contains(VOSE)) + optional: true + filters: + - name: append + args: " SPANiSH" + title: + text: "{{ if .Result.title_vose }}{{ .Result.title_vose }}{{ else }}{{ .Result.title_notvose }}{{ end }}" + filters: + - name: re_replace + args: ["^ *\\[[^\\]]*\\] *", ""] # Remove prefix tags + - name: re_replace + args: ["(?i)\\bT(\\d+)", "S$1"] + - name: re_replace + args: ["UHDRip", "BDRip"] # Fix for Radarr + details: + selector: details_link + download: + selector: download_link + infohash: + selector: info_hash + poster: + selector: meta.poster + filters: + - name: replace + args: ["https://via.placeholder.com/90x135", ""] + imdbid: + selector: imdb_id + tmdbid: + selector: tmdb_id + tvdbid: + selector: tvdb_id + genre: + selector: meta.genres + filters: + - name: re_replace + args: ["(?i)(Ciencia ficción)", "Ciencia_ficción"] + - name: re_replace + args: ["(?i)(Película de TV)", "Película_de_TV"] + - name: replace + args: [" & ", "_&_"] + description: + text: "{{ .Result.genre }}" + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0%, 25%, 50%, 75%, 100% + selector: freeleech + case: + 0%: 1 # not free + 25%: 0.75 + 50%: 0.5 + 75%: 0.25 + 100%: 0 # freeleech + "*": 0 # catch errors + uploadvolumefactor: + # api returns 0=false, 1=true + selector: double_upload + case: + 0: 1 # normal + 1: 2 # double +# global MR is 0.4 but torrents must be seeded for 4 days regardless of ratio +# minimumratio: +# text: 0.4 + minimumseedtime: + # 4 days (as seconds = 4 x 24 x 60 x 60) + text: 345600 +# json UNIT3D 6.5.0 (custom) diff --git a/config/prowlarr/Definitions/torrentland.yml b/config/prowlarr/Definitions/torrentland.yml new file mode 100644 index 0000000..eae8e1c --- /dev/null +++ b/config/prowlarr/Definitions/torrentland.yml @@ -0,0 +1,218 @@ +--- +id: torrentland +name: Torrentland +description: "Torrentland is a SPANISH Private Torrent Tracker for MOVIES / TV / GENERAL" +language: es-ES +type: private +encoding: UTF-8 +links: + - https://torrentland.li/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Películas"} + - {id: 2, cat: TV, desc: "Series"} + - {id: 3, cat: TV/Anime, desc: "Animación"} + - {id: 4, cat: TV/Anime, desc: "Series Animación"} + - {id: 5, cat: TV/Documentary, desc: "Documentales"} + - {id: 6, cat: TV/Documentary, desc: "Series Documentales"} + - {id: 7, cat: TV/Sport, desc: "Deportes"} + - {id: 8, cat: Audio/Video, desc: "Videos Músicales"} + - {id: 9, cat: XXX, desc: "+18"} + - {id: 10, cat: Other, desc: "Otros"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: compatOld + type: checkbox + label: Improve Sonarr compatibility with the tracker's older season naming scheme by renaming Sxx to Txx in searches. Can cause results already using Sxx to not be found. + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: login + method: form + form: form[action$="/login"] + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + remember: on + selectorinputs: + _token: + selector: input[name="_token"] + attribute: value + error: + - selector: div#ERROR_COPY +# test: +# path: / +# selector: a[href$="/logout"] + +search: + paths: + # https://torrentland.li/torrents? + # name=&description=&mediainfo=&uploader=&keywords=&tmdbId=&imdbId=&tvdbId=&malId= + # &startYear=&endYear=&playlistId=&collectionId=&categories[]=1&perPage=100&free[0]=100 + - path: torrents + + inputs: + $raw: "{{ range .Categories }}categories[]={{.}}&{{end}}" + name: "{{ if .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" # for dashboard imdbid search + tmdbId: "{{ .Query.TMDBID }}" + imdbId: "{{ .Query.IMDBIDShort }}" + tvdbId: "{{ .Query.TVDBID }}" + "free[0]": "{{ if .Config.freeleech }}100{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + page: 1 + # supports genre search but you need to know the id, example genres=28 for Acción + + keywordsfilters: + - name: re_replace + args: ["(?i)\\bS(\\d+)", "{{ if .Config.compatOld }}T$1{{ else }}S$1{{ end }}"] + + rows: + # pre-release/vip torrents don't have download link + selector: table > tbody > tr:has(a[href*="/download/"]) + + fields: + categorydesc: + selector: span[data-original-title="Categoria"] + optional: true + default: Otros + title_vose: + selector: a.view-torrent:contains("VOSE") + optional: true + filters: + - name: append + args: " ENGLiSH" + title_notvose: + selector: a.view-torrent:not(:contains("VOSE")) + optional: true + filters: + - name: append + args: " SPANiSH" + title: + text: "{{ if .Result.title_vose }}{{ .Result.title_vose }}{{ else }}{{ .Result.title_notvose }}{{ end }}" + filters: + - name: re_replace + args: ["^ *\\[[^\\]]*\\] *", ""] # Remove prefix tags + - name: re_replace + args: ["(?i)\\bT(\\d+)", "S$1"] + - name: re_replace + args: ["UHDRip", "BDRip"] # Fix for Radarr + details: + selector: a.view-torrent + attribute: href + download: + selector: a[href*="/torrents/download/"] + attribute: href + poster: + selector: div.torrent-poster img + attribute: src + filters: + - name: replace + args: ["https://via.placeholder.com/90x135", ""] + imdbid: + selector: div#imdb_id + size: + selector: td.torrent-listings-size + seeders: + selector: td.torrent-listings-seeders + leechers: + selector: td.torrent-listings-leechers + grabs: + selector: td.torrent-listings-completed + date: + selector: td.torrent-listings-age + filters: + # translations for Turkish|Estonian|Danish|Italian|Polish|Norwegian|Portuguese|Czech|Russian|Romanian|Spanish|French|German|Bulgarian|Dutch|Chinese|Japanese|Swedish + - name: re_replace + args: ["(?i)(önce|tagasi|geleden|fa|temu|siden|há|atrás|nazpět|назад|acum|în urmă|hace|il y a|vor|преди|前|sedan)", " ago"] + - name: re_replace + args: ["(?i)(saniye|sekundit|sekunder|secondi|sekund|segundos|sekundami|секунд|secunde|secondes|Sekunden|секунди|seconden|秒前)", "seconds"] + - name: re_replace + args: ["(?i)(minutit|minutter|minuti|minuty|minutos|минуты|минут|Minuten|минути|minuten|minuter)", "minutes"] + - name: re_replace + args: ["(?i)(dakika|minut|minuto|minuta|minutt|минута|Minute|minuut|分钟|分)", " minute"] + - name: re_replace + args: ["(?i)(tundi|timer|ore|godziny|horas|hodiny|hoden|часа|часов|ore|heures|Stunden|timmar)", "hours"] + - name: re_replace + args: ["(?i)(saat|tund|time|ora|godzina|hora|hodina|час|oră|heure|Stunde|uur|小时|時間|timme)", " hour"] + - name: re_replace + args: ["(?i)(päeva|dage|giorni|dni|dias|dny|дня|дней|zile|días|jours|Tagen|дни|dagen|dagar)", "days"] + - name: re_replace + args: ["(?i)(gün|päev|dag|giorno|dzień|dia|den|день|zi|día|jour|Tag|ден|天|日)", " day"] + - name: re_replace + args: ["(?i)(nädalat|uger|settimane|tygodnie|uker|semanas|týdny|недели|недель|săptămâni|semaines|Wochen|седмици|weken|veckor)", "weeks"] + - name: re_replace + args: ["(?i)(hafta|nädal|uge|settimana|tydzień|uke|semana|týden|неделю|săptămână|semaine|Woche|седмица|周|週間|vecka)", " week"] + - name: re_replace + args: ["(?i) (ay)", "month"] + - name: re_replace + args: ["(?i)(kuud|måneder|mesi|miesiące|meses|měsíce|месяца|месяцев|luni|meses|mois|Monaten|месеца|maanden|månader)", "months"] + - name: re_replace + args: ["(?i)(kuu|måned|mese|miesiąc|mês|měsíc|месяц|lună|mes|Monat|месец|maand|个月|ヶ月|månad)", " month"] + - name: re_replace + args: ["(?i)(aastat|anni|lata|anos|roky|года|ani|años|ans|Jahren|години)", " years"] + - name: re_replace + args: ["(?i)(yil|aasta|år|anno|rok|ano|год|año|Jahr|година|jaar|年)", " year"] + - name: re_replace + args: ["(?i) (an)", "year"] + - name: re_replace + args: ["(?i)(För |und)", ""] # Misc removals + - name: timeago + downloadvolumefactor: + case: + i[class*="fa-id-badge text-orange"]: 0 # 24 Hour FreeLeech From BON Store + i[class*="fa-trophy text-purple"]: 0 # Special FreeLeech For Certain User Groups + i[class*="fa-star text-bold"]: 0 # Freeleech From Token + i[class*="fa-coins text-bold"]: 0 # Freeleech From Token + i[class*="fa-globe text-blue"]: 0 # Global Freeleech + i[class*="fa-star text-gold"]: 0 # Freeleech + i[class*="fa-certificate text-pink"]: 0 # Featured Torrent + "*": 1 + uploadvolumefactor: + case: + i[class*="fa-gem text-green"]: 2 # Single Torrent Double Upload + i[class*="fa-globe text-green"]: 2 # Global Double Upload + i[class*="fa-certificate text-pink"]: 2 # Featured Torrent + "*": 1 +# global MR is 0.4 but torrents must be seeded for 4 days regardless of ratio +# minimumratio: +# text: 0.4 + minimumseedtime: + # 4 days (as seconds = 4 x 24 x 60 x 60) + text: 345600 +# UNIT3D 6.5.0 (custom) diff --git a/config/prowlarr/Definitions/torrentleech-pl.yml b/config/prowlarr/Definitions/torrentleech-pl.yml new file mode 100644 index 0000000..a049e25 --- /dev/null +++ b/config/prowlarr/Definitions/torrentleech-pl.yml @@ -0,0 +1,190 @@ +--- +id: torrentleech-pl +name: Torrentleech.pl +description: "Torrentleech.pl is a POLISH Private Torrent Tracker for 0DAY / GENERAL" +language: pl-PL +type: private +encoding: UTF-8 +links: + - https://torrentleech.pl/ + +caps: + categorymappings: + - {id: 32, cat: PC, desc: "Aplikacje PC"} + - {id: 33, cat: Books, desc: "eBooki/AudioBooki/Prasa"} + - {id: 65, cat: Movies/3D, desc: "Filmy/3D"} + - {id: 69, cat: Movies/UHD, desc: "Filmy/4K UHD"} + - {id: 28, cat: TV/Anime, desc: "Filmy/Animowane"} + - {id: 66, cat: Movies/BluRay, desc: "Filmy/BDRip"} + - {id: 61, cat: Movies/BluRay, desc: "Filmy/BRRip"} + - {id: 67, cat: Movies, desc: "Filmy/CAM-TC-TS"} + - {id: 58, cat: TV/Documentary, desc: "Filmy/Dokumentalne"} + - {id: 39, cat: Movies/HD, desc: "Filmy/Full HD"} + - {id: 36, cat: Movies/HD, desc: "Filmy/HD Ready"} + - {id: 64, cat: Movies, desc: "Filmy/Kino Polskie"} + - {id: 59, cat: Movies, desc: "Filmy/PACK"} + - {id: 40, cat: Movies/SD, desc: "Filmy/SD"} + - {id: 68, cat: Movies/WEB-DL, desc: "Filmy/WEB-DL"} + - {id: 62, cat: Console, desc: "Gry/Dodatki"} + - {id: 41, cat: Console, desc: "Gry/Konsole"} + - {id: 42, cat: PC/Games, desc: "Gry/PC"} + - {id: 44, cat: PC/Mobile-Other, desc: "GSM/PDA"} + - {id: 57, cat: Audio/Video, desc: "Koncerty/Teledyski"} + - {id: 63, cat: Audio/Lossless, desc: "Muzyka/FLAC"} + - {id: 46, cat: Audio/MP3, desc: "Muzyka/MP3"} + - {id: 47, cat: Other, desc: "Różne"} + - {id: 60, cat: TV/Sport, desc: "Sport"} + - {id: 53, cat: TV, desc: "TV Seriale"} + - {id: 56, cat: XXX, desc: "XXX"} + - {id: 70, cat: TV/Anime, desc: "Anime"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: drop_polish_prefix + type: checkbox + label: Drop the Polish title prefix + default: false + - name: flaresolverr + type: info + label: FlareSolverr + default: This site may use Cloudflare DDoS Protection, therefore Prowlarr requires FlareSolverr to access it. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[src="img.php?size=5"] + input: vImageCodP + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: td.embedded:has(h2:contains("Logowanie nie udane!")) + test: + path: index.php + selector: a[href^="logout.php"] + +search: + paths: + # https://torrentleech.pl/browse.php?c60=1&c53=1&search=&incldead=1&titlesearch=0&polish=0&cat_film=&napisy=0 + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # 0 onlyactive, 1 all, 2 onlydead, 3 free + incldead: "{{ if .Config.freeleech }}3{{ else }}1{{ end }}" + # 0 title, 1 descr, 2 both + titlesearch: "{{ if .Query.IMDBID }}1{{ else }}0{{ end }}" + # 0 all, 1 polish, 2 not polish + polish: 0 + cat_film: "" + # subtitles: 0 everything, 1 yes, 2 no + napisy: 0 + # can search by genre but you need the id. &cat_film=1 for akcja. + + keywordsfilters: + # remove the year from the titles as the site chokes on them during search #7424 + - name: re_replace + args: [" +(?:19|20)\\d{2} *$", ""] + + rows: + selector: table[border="1"][cellspacing="0"][cellpadding="5"] > tbody > tr:has(a[href^="details.php?id="]) + filters: + - name: andmatch + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_raw: + selector: a[href^="details.php?id="] + title_stripped: + selector: a[href^="details.php?id="] + filters: + - name: re_replace + args: ["^(.*/)(.*)$", "$2"] + - name: trim + title: + text: "{{ if .Config.drop_polish_prefix }}{{ .Result.title_stripped }}{{ else }}{{ .Result.title_raw }}{{ end }}" + filters: + - name: re_replace + args: ["(?i)^\\[PACK\\]\\s*", ""] + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php/"] + attribute: href + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + genre: + selector: font[color="blue"] + filters: + - name: validate + args: "akcja, animacja, anime, biograficzny, czarna komedia, dokumentalny, dramat, dramat historyczny, edukacyjny, etiuda, familijny, fantasy, gangsterski, historyczny, horror, katastroficzny, komedia, komedia kryminalna, komedia obyczajowa, komedia romantyczna, krótkometrażowy, kryminał, melodramat, musical, muzyczny, niemy, przygodowy, romans, sci-fi, sensacyjny, sportowy, szpiegowski, thriller, western, wojenny" + _language: + optional: true + selector: img[src="pic/pl.jpg"] + filters: + - name: append + args: "Language: polish\n
" + _subbed: + optional: true + selector: img[src="pic/napisy.gif"] + filters: + - name: append + args: "Subbed\n
" + description: + text: "{{ .Result._language }}{{ .Result._subbed }}{{ if .Result.genre }}Genres: {{ .Result.genre }}{{ else }}{{ end }}" + date: + selector: td:nth-child(4) + # auto adjusted by site account profile + filters: + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss" + size: + selector: td:nth-child(5) + grabs: + selector: td:nth-child(6) + seeders: + selector: td:nth-child(7) + filters: + - name: split + args: ["/", 0] + leechers: + selector: td:nth-child(7) + filters: + - name: split + args: ["/", 1] + downloadvolumefactor: + case: + tr.darmowy: 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# engine n/a diff --git a/config/prowlarr/Definitions/torrentleech.yml b/config/prowlarr/Definitions/torrentleech.yml new file mode 100644 index 0000000..e7f7dd2 --- /dev/null +++ b/config/prowlarr/Definitions/torrentleech.yml @@ -0,0 +1,220 @@ +--- +id: torrentleech +name: TorrentLeech +description: "not here _ not scene" +language: en-US +type: private +encoding: UTF-8 +requestDelay: 4.1 # #13796 +links: + - https://www.torrentleech.org/ + - https://www.torrentleech.cc/ + - https://www.torrentleech.me/ + - https://www.tleechreload.org/ + - https://www.tlgetin.cc/ +legacylinks: + - https://v4.torrentleech.org/ + +caps: + categorymappings: + - {id: 8, cat: Movies/SD, desc: "Movies Cam"} + - {id: 9, cat: Movies/SD, desc: "Movies TS/TC"} + - {id: 11, cat: Movies/SD, desc: "Movies DVDRip/DVDScreener"} + - {id: 37, cat: Movies/WEB-DL, desc: "Movies WEBRip"} + - {id: 43, cat: Movies/HD, desc: "Movies HDRip"} + - {id: 14, cat: Movies/HD, desc: "Movies BlurayRip"} + - {id: 12, cat: Movies/DVD, desc: "Movies DVD-R"} + - {id: 13, cat: Movies/BluRay, desc: "Movies Bluray"} + - {id: 47, cat: Movies/UHD, desc: "Movies 4K"} + - {id: 15, cat: Movies, desc: "Movies Boxsets"} + - {id: 29, cat: TV/Documentary, desc: "Documentaries"} + + - {id: 26, cat: TV/SD, desc: "TV Episodes"} + - {id: 32, cat: TV/HD, desc: "TV Episodes HD"} + - {id: 27, cat: TV, desc: "TV Boxsets"} + + - {id: 17, cat: PC/Games, desc: "Games PC"} + - {id: 42, cat: PC/Mac, desc: "Games Mac"} + - {id: 18, cat: Console/XBox, desc: "Games XBOX"} + - {id: 19, cat: Console/XBox 360, desc: "Games XBOX360"} + - {id: 40, cat: Console/XBox One, desc: "Games XBOXONE"} + - {id: 20, cat: Console/PS3, desc: "Games PS2"} + - {id: 21, cat: Console/PS3, desc: "Games Mac"} + - {id: 39, cat: Console/PS4, desc: "Games PS4"} + - {id: 49, cat: Console/PS4, desc: "Games PS5"} + - {id: 22, cat: Console/PSP, desc: "Games PSP"} + - {id: 28, cat: Console/Wii, desc: "Games Wii"} + - {id: 30, cat: Console/NDS, desc: "Games Nintendo DS"} + - {id: 48, cat: Console/Other, desc: "Games Nintendo Switch"} + + - {id: 23, cat: PC/ISO, desc: "PC ISO"} + - {id: 24, cat: PC/Mac, desc: "PC Mac"} + - {id: 25, cat: PC/Mobile-Other, desc: "PC Mobile"} + - {id: 33, cat: PC/0day, desc: "PC 0-day"} + - {id: 38, cat: Other, desc: "Education"} + + - {id: 34, cat: TV/Anime, desc: "TV Anime"} + - {id: 35, cat: TV, desc: "TV Cartoons"} + + - {id: 45, cat: Books/EBook, desc: "Books EBooks"} + - {id: 46, cat: Books/Comics, desc: "Books Comics"} + + - {id: 31, cat: Audio, desc: "Audio"} + - {id: 16, cat: Audio/Video, desc: "Music videos"} + + - {id: 36, cat: Movies/Foreign, desc: "Movies Foreign"} + - {id: 44, cat: TV/Foreign, desc: "TV Foreign"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + allowrawsearch: true + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: alt2fatoken + type: text + label: Alt 2FA Token + - name: info_alt2fatoken + type: info + label: "About Alt 2FA Token" + default: "(Site Profile => Alt 2FA Token) Only fill in the Alt 2FA Token if you have enabled 2FA on the TorrentLeech Web Site. Otherwise just leave it empty." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: exclude_scene + type: checkbox + label: Exclude SCENE torrents from results + default: false + - name: exclude_archives + type: checkbox + label: Exclude torrents with the tag RAR from results + default: false + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeders: seeders + size: size + nameSort: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: user/account/login/ + method: form + form: form[name="login-form"] + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + alt2FAToken: "{{ .Config.alt2fatoken }}" + error: + - selector: p.text-danger + - selector: .login-container h2:contains("One Time Password") + message: + text: "Your TorrentLeech account has 2FA enabled. Please recheck your indexer settings." + - selector: form[name="login-form"] + message: + text: "Login page detected at {{ .Config.sitelink }}." + test: + path: / + selector: a[href="/user/account/logout"] + +search: + paths: + # "newfilter/2" include 0day and music + # https://www.torrentleech.org/torrents/browse/list/categories/29,2,26,27,32,44,7,34,35/facets/tags:FREELEECH,nonscene/exact/1/query/friends/orderby/added/order/desc + - path: "torrents/browse/list{{ if .Categories }}/categories/{{ join .Categories \",\" }}{{ else }}{{ end }}{{ if or .Config.freeleech .Config.exclude_scene }}/facets/tags:{{ else }}{{ end }}{{ if .Config.freeleech }}FREELEECH{{ else }}{{ end }}{{ if and .Config.freeleech .Config.exclude_scene }},{{ else }}{{ end }}{{ if .Config.exclude_scene }}nonscene{{ else }}{{ end }}/{{ if .Query.IMDBID }}imdbID/{{ .Query.IMDBID }}/{{ else }}exact/1/query/{{ .Keywords }}/{{ end }}{{ if .Keywords }}{{ else }}newfilter/2/{{ end }}orderby/{{ .Config.sort }}/order/{{ .Config.type }}" + response: + type: json + + keywordsfilters: + # remove dashes at the beginning of keywords as they exclude search strings (see issue #3096) + - name: re_replace + args: ["(^|\\s)-", " "] + - name: append + args: "{{ if .Config.exclude_archives }} -tags:rar{{ else }}{{ end }}" + rows: + selector: torrentList + count: + selector: $.numFound + + fields: + category: + selector: categoryID + title_test: # title can be null #13736 + selector: name + optional: true + filters: + # remove [REQ]/[REQUEST] + - name: re_replace + args: ["(?i)^\\[REQ(UEST(ED)?)?\\]\\s*", ""] + title: + text: "{{ if .Result.title_test }}{{ .Result.title_test }}{{ else }}TorrentLeech did not provide a title{{ end }}" + _id: + selector: fid + _filename: + selector: filename + details: + text: "/torrent/{{ .Result._id }}" + download: + text: "/download/{{ .Result._id }}/{{ .Result._filename }}" + genre: + selector: tags + filters: + - name: validate + args: "Action, Adventure, Animation, Biography, Comedy, Crime, Documentary, Drama, Family, Fantasy, Game-Show, History, Horror, Kids, Music, Musical, Mystery, News, Reality-TV, Romance, Sci-Fi, Science-Fiction, Sport, Soap, Talk-Show, Thriller, War, Western" + description: + text: "{{ .Result.genre }}" + imdbid: + selector: imdbID + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: completed + date: + # 2021-10-25 02:18:31 + selector: addedTimestamp + # auto adjusted by site account profile + filters: + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss" + size: + selector: size + downloadvolumefactor: + # freeleech #6579 #6624 #7367 + selector: download_multiplier + case: + 0: 0 # freeleech + "*": 1 # not free + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 10 days for registered users, less for upgraded users + # 10 day (as seconds = 7 x 24 x 60 x 60) + text: 864000 +# json engine n/a diff --git a/config/prowlarr/Definitions/torrentlt.yml b/config/prowlarr/Definitions/torrentlt.yml new file mode 100644 index 0000000..98c9d22 --- /dev/null +++ b/config/prowlarr/Definitions/torrentlt.yml @@ -0,0 +1,203 @@ +--- +id: torrentlt +name: Torrent.LT +description: "Torrent.LT is a LITHUANIAN Private Torrent Tracker for 0DAY / GENERAL" +language: lt-LT +type: private +encoding: UTF-8 +links: + - https://torrent.lt/ +legacylinks: + - http://www.torrent.ai/ + - https://torrent.ai/ + +caps: + categorymappings: + - {id: 33, cat: Movies, desc: "Filmai / LT"} + - {id: 43, cat: Movies, desc: "Filmai / LT-Subs"} + - {id: 74, cat: Movies/HD, desc: "Filmai LT HD"} + - {id: 34, cat: Movies, desc: "Filmai / Eng"} + - {id: 54, cat: Movies/HD, desc: "Filmai / Eng HD"} + - {id: 32, cat: Movies, desc: "Filmai / Rus"} + - {id: 78, cat: Movies/HD, desc: "Filmai Rus HD"} + - {id: 72, cat: Movies/3D, desc: "Filmai / 3D"} + - {id: 31, cat: Movies/DVD, desc: "Filmai / DVD"} + + - {id: 76, cat: TV, desc: "Animacija / LT"} + - {id: 80, cat: TV/HD, desc: "Animacija / LT HD"} + - {id: 27, cat: TV, desc: "Animacija / Eng"} + - {id: 52, cat: TV/HD, desc: "Animacija / Eng HD"} + - {id: 81, cat: TV, desc: "Animacija / Rus"} + - {id: 85, cat: TV, desc: "Animacija / Rus HD"} + - {id: 86, cat: TV, desc: "Animacija / 3D"} + - {id: 35, cat: TV/Anime, desc: "Anime"} + + - {id: 58, cat: TV, desc: "Serialai / LT"} + - {id: 79, cat: TV/HD, desc: "Serialai LT HD"} + - {id: 42, cat: TV, desc: "Serialai / Eng"} + - {id: 56, cat: TV/HD, desc: "Serialai / Eng HD"} + - {id: 59, cat: TV, desc: "Serialai / Rus"} + - {id: 84, cat: TV/HD, desc: "Serialai / Rus HD"} + + - {id: 69, cat: TV, desc: "TV / LT"} + - {id: 28, cat: TV, desc: "TV / Eng"} + - {id: 70, cat: TV, desc: "TV / Rus"} + - {id: 39, cat: TV/Documentary, desc: "TV / Dokumentika"} + + - {id: 1, cat: PC/Games, desc: "Žaidimai / PC"} + - {id: 50, cat: Console/PS4, desc: "Žaidimai / PS"} + - {id: 51, cat: Console/XBox 360, desc: "Žaidimai / XBOX"} + - {id: 73, cat: Console, desc: "Žaidimai / Priedai"} + - {id: 36, cat: Console/Other, desc: "Žaidimai / Kita"} + + - {id: 62, cat: TV/Sport, desc: "Sport / Basketball"} + - {id: 66, cat: TV/Sport, desc: "Sport / Football"} + - {id: 65, cat: TV/Sport, desc: "Sport / Fights"} + - {id: 63, cat: TV/Sport, desc: "Sport / Cars"} + - {id: 40, cat: TV/Sport, desc: "Sport / Kita"} + + - {id: 87, cat: Audio/MP3, desc: "Muzika / LT"} + - {id: 6, cat: Audio, desc: "Muzika / Albumai"} + - {id: 57, cat: Audio/MP3, desc: "Muzika / VA"} + - {id: 26, cat: Audio, desc: "Muzika / DJ Sets"} + - {id: 29, cat: Audio/Video, desc: "Muzika / Videos"} + + - {id: 10, cat: PC/0day, desc: "Soft / PC"} + - {id: 44, cat: PC/Mac, desc: "Soft / MAC"} + - {id: 61, cat: PC/Mobile-Other, desc: "Soft / Mobile"} + - {id: 75, cat: PC, desc: "Soft / Kita"} + + - {id: 89, cat: Audio/Audiobook, desc: "Audiobooks / LT"} + - {id: 83, cat: Audio/Audiobook, desc: "Audiobooks"} + - {id: 90, cat: Books/EBook, desc: "E-Books / LT"} + - {id: 41, cat: Books/EBook, desc: "E-Books"} + - {id: 77, cat: Other, desc: "Educational"} + - {id: 30, cat: Other/Misc, desc: "Kita"} + + - {id: 21, cat: XXX, desc: "pr0n"} + - {id: 88, cat: XXX, desc: "pr0n / LT"} + - {id: 71, cat: XXX/Pack, desc: "pr0n / pack"} + - {id: 82, cat: XXX, desc: "pr0n / games"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + - name: sort + type: select + label: Sort requested from site + default: 0 + options: + 0: created + 6: seeders + 4: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: lt/account-login.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: div.klaida + - selector: p.error_text + test: + path: lt/main + selector: a[href="myaccount"] + +search: + paths: + - path: lt/torrents + inputs: + $raw: "{{ range .Categories }}cats[]={{.}}&{{end}}" + search: "{{ .Keywords }}" + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + free: "{{ if .Config.freeleech }}on{{ else }}{{ end }}" + keywordsfilters: + - name: replace + args: [".", " "] # issue #3296 + - name: re_replace + args: ["[^\\w\\d\\(\\)]+", "%"] + + rows: + selector: table> tbody > tr[class^="torrents-table__"] + filters: + - name: andmatch + args: 50 + after: 1 + + fields: + category: + selector: td[class^="category-icon_cell"] a + attribute: href + filters: + - name: querystring + args: cats + title: + selector: div[class^="torrent-name"] a + details: + selector: div[class^="torrent-name"] a + attribute: href + download: + selector: td a[href^="download?id="] + attribute: href + poster: + selector: div[class^="torrent-name"] a + attribute: data-poster-preview + seeders: + selector: td.seeders_cell:not(:has(i)) + optional: true + default: 0 + leechers: + selector: td.leechers_cell:not(:has(i)) + optional: true + default: 0 + size: + selector: td.size_cell + description: + case: + img[src$="/checked.png"]: Verified + "*": Unverified + downloadvolumefactor: + case: + img[src$="/freedownload.gif"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + date: + selector: span.datetime + attribute: title + filters: + - name: append + args: " +02:00" # EET + - name: dateparse + args: "yyyy-MM-dd HH:mm zzz" + minimumratio: + text: 0.41 +# engine n/a diff --git a/config/prowlarr/Definitions/torrentmasters.yml b/config/prowlarr/Definitions/torrentmasters.yml new file mode 100644 index 0000000..d7bff88 --- /dev/null +++ b/config/prowlarr/Definitions/torrentmasters.yml @@ -0,0 +1,184 @@ +--- +id: torrentmasters +name: TorrentMasters +description: "TorrentMasters is a HUNGARIAN semi-private tracker for MOVIES / TV / GENERAL" +language: hu-HU +type: semi-private +encoding: UTF-8 +links: + - https://torrentmasters.org/ +legacylinks: + - https://torrentmasters.info/ + +caps: + categorymappings: + - {id: 92, cat: Books/EBook, desc: "e-Book (ENG)"} + - {id: 78, cat: Books/EBook, desc: "e-Book (HUN)"} + - {id: 80, cat: Other, desc: "Egyéb"} + - {id: 111, cat: Movies/SD, desc: "Film - Cam (HUN)"} + - {id: 85, cat: Movies/DVD, desc: "Film - DVD/9 (ENG)"} + - {id: 66, cat: Movies/DVD, desc: "Film - DVD/9 (HUN)"} + - {id: 84, cat: Movies/HD, desc: "Film - HD (ENG)"} + - {id: 68, cat: Movies/HD, desc: "Film - HD (HUN)"} + - {id: 82, cat: Movies/SD, desc: "Film - SD (ENG)"} + - {id: 64, cat: Movies/SD, desc: "Film - SD (HUN)"} + - {id: 73, cat: Console, desc: "Játék - Konzol"} + - {id: 94, cat: PC/Games, desc: "Játék - RIP"} + - {id: 72, cat: PC/Games, desc: "Játek - ISO"} + - {id: 79, cat: PC/Mobile-Other, desc: "Mobil/PDA"} + - {id: 95, cat: PC, desc: "Programok - Egyeb (Win)"} + - {id: 74, cat: PC/ISO, desc: "Programok - ISO (Win)"} + - {id: 75, cat: PC/Mac, desc: "Programok - Linux/Unix/Mac OS"} + - {id: 101, cat: TV/SD, desc: "Sorozat - DVD (ENG)"} + - {id: 100, cat: TV/SD, desc: "Sorozat - DVD (HUN)"} + - {id: 89, cat: TV/HD, desc: "Sorozat - HD (ENG)"} + - {id: 97, cat: TV/HD, desc: "Sorozat - HD (HUN)"} + - {id: 86, cat: TV/SD, desc: "Sorozat - SD (ENG)"} + - {id: 90, cat: TV/SD, desc: "Sorozat - SD (HUN)"} + - {id: 99, cat: XXX/DVD, desc: "XXX - DVD"} + - {id: 98, cat: XXX/x264, desc: "XXX - HD"} + - {id: 76, cat: XXX/ImageSet, desc: "XXX - Kepek"} + - {id: 69, cat: XXX/XviD, desc: "XXX - SD"} + - {id: 70, cat: Audio, desc: "Zene - HUN"} + - {id: 71, cat: Audio, desc: "Zene - Külföld"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
  1. Login to this tracker with your browser
  2. Open the DevTools panel by pressing F12
  3. Select the Network tab
  4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
  5. Refresh the page by pressing F5
  6. Click on the first row entry
  7. Select the Headers tab on the Right panel
  8. Find 'cookie:' in the Request Headers section
  9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
" + - name: useragent + type: text + label: User-Agent + - name: info_useragent + type: info + label: How to get the User-Agent + default: "
  1. From the same place you fetched the cookie,
  2. Find 'user-agent:' in the Request Headers section
  3. Select and Copy the whole user-agent string (everything after 'user-agent: ') and Paste here.
" + - name: sort + type: select + label: Sort requested from site + default: 0 + options: + 0: added + 1: name + 2: size + 4: seeders + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrentek száma egy oldalon setting to 100 on your account profile. + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: index + selector: a[href="/logout/"] + +search: + headers: + User-Agent: ["{{ .Config.useragent }}"] + paths: + - path: browse/ + inputs: + # https://torrentmasters.info/browse/?sent=yes&sort=0&type=&viewMode=normal&search=2023&incldead=0 + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + search: "{{ .Keywords }}" + # 0 active, 1 active+dead, 2 dead, 3 my torrents, 4 requested, 9 bookmarked, 7 featured, 8 main page featured + incldead: 1 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + viewMode: normal + sent: yes + # does not support imdbid searches + # can search by genre but need range support. &mufaj[]=akció&mufaj[]animációs + + rows: + selector: table.table > tbody > tr + + fields: + category: + selector: a[href*="categories[]="] + attribute: href + filters: + - name: querystring + args: "categories[]" + title: + selector: a[href^="/details/"] + attribute: title + filters: + - name: regexp + args: "Torrent név: (.*?)
" + details: + selector: a[href^="/details/"] + attribute: href + _id: + selector: a[href^="/details/"] + attribute: href + filters: + - name: regexp + args: (\d+) + download: + text: "/download/{{ .Result._id }}/" + title_hungarian: + selector: a[href^="/details/"] + attribute: title + filters: + - name: regexp + args: "Magyar/Külföldi cím: (.*?)
" + date: + selector: td:nth-child(3) + filters: + - name: append + args: " +01:00" # CET + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + poster: + selector: a[href^="/details/"] + attribute: title + filters: + - name: regexp + args: "src='(.*?)'" + size: + selector: td:nth-last-child(5) + grabs: + selector: td:nth-last-child(2) + seeders: + selector: td:nth-last-child(4) + leechers: + selector: td:nth-last-child(3) + uploadvolumefactor_custom: + selector: td:nth-last-child(5) small + optional: true + downloadvolumefactor: + text: 0 + uploadvolumefactor: + case: + i.fa-arrow-up: "{{ .Result.uploadvolumefactor_custom }}" + "*": 1 + genre: + selector: td:nth-child(2) small + description: + text: "{{ .Result.title_hungarian }}{{ if and .Result.title_hungarian .Result.genre }}
{{ else }}{{ end }}{{ .Result.genre }}" + minimumseedtime: + # 24 hours (as seconds = 24 x 60 x 60) + text: 86400 +# engine n/a diff --git a/config/prowlarr/Definitions/torrentoyunindir.yml b/config/prowlarr/Definitions/torrentoyunindir.yml new file mode 100644 index 0000000..bef9385 --- /dev/null +++ b/config/prowlarr/Definitions/torrentoyunindir.yml @@ -0,0 +1,68 @@ +--- +id: torrentoyunindir +name: Torrent Oyun indir +description: "Torrent Oyun indir is a TURKISH Public torrent site for GAMES" +language: tr-TR +type: public +encoding: UTF-8 +links: + - https://0.torrentoyunindir.com/ +legacylinks: + - https://www.torrentoyunindir.com/ + - http://0.torrentoyunindir.com/ + +caps: + categories: + 1: PC/Games + + modes: + search: [q] + +settings: [] + +download: + selectors: + - selector: div.facepaylas a + attribute: href + +search: + paths: + - path: / + inputs: + s: "{{ .Keywords }}" + + rows: + selector: div.moviefilm + filters: + - name: andmatch + + fields: + category: + text: 1 + title: + selector: div.movief + details: + selector: a + attribute: href + download: + selector: a + attribute: href + description: + selector: a > span + attribute: class + poster: + selector: img + attribute: src + date: + text: now + size: + text: "512 MB" + seeders: + text: 1 + leechers: + text: 1 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/torrentproject2.yml b/config/prowlarr/Definitions/torrentproject2.yml new file mode 100644 index 0000000..fcfec57 --- /dev/null +++ b/config/prowlarr/Definitions/torrentproject2.yml @@ -0,0 +1,118 @@ +--- +id: torrentproject2 +name: TorrentProject2 +description: "TorrentProject2 is a Public torrent meta-search engine" +language: en-US +type: public +encoding: UTF-8 +requestDelay: 2 +links: + - https://torrentproject2.net/ + - https://torrentproject2.org/ + - https://torrentproject.info/ + - https://torrentproject.biz/ + - https://torrentproject.xyz/ + - https://torrentproject.cc/ +legacylinks: + - https://torrentproject2.se/ + - https://torrentproject2.com/ + +caps: + categorymappings: + - {id: Other, cat: Other, desc: Other} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: filter-verified + type: checkbox + label: "Only include verifed content in results" + default: false + - name: sort + type: select + label: Sort requested from site + default: latest + options: + latest: "created desc" + oldest: "created asc" + seeders: seeders + size: size + - name: info_8000 + type: info + label: About TorrentProject2 Categories + default: TorrentProject2 does not return categories in its search results.
To add to your Apps' Torznab indexer, replace all categories with 8000(Other). + +download: + selectors: + - selector: "#download > div:nth-child(2) > div:nth-child(1) > a" + attribute: href + filters: + - name: replace + args: ["https://mylink.me.uk/?url=", ""] + - name: replace + args: ["https://mylink.cx/?url=", ""] + - name: replace + args: ["https://mylink.cloud/?url=", ""] + - name: urldecode + +search: + paths: + # browse for latest, / for keywords, 50 rows per page + - path: "{{ if .Keywords }}/{{ else }}browse{{ end }}" + - path: "{{ if .Keywords }}/{{ else }}browse{{ end }}" + inputs: + p: 1 + inputs: + t: "{{ .Keywords }}" + orderby: "{{ if .Keywords }}{{ .Config.sort }}{{ else }}{{ end }}" + safe: "{{ if and .Keywords .Config.filter-verified }}on{{ else }}{{ end }}" + keywordsfilters: + - name: re_replace + args: [" ", "+"] + + rows: + selector: "#similarfiles div:has(a[href^=\"/t\"])" + + fields: + category: + # while browse has cats the search does not (atm) so we wont support cats for now. + text: Other + title: + selector: span > a + details: + selector: span > a + attribute: href + download: + selector: span > a + attribute: href + date_ago: + # 7 years ago + selector: span:nth-child(4):contains("ago") + optional: true + date_time: + # 2020-11-05 07:34:44 + selector: span:nth-child(4):contains(":") + optional: true + filters: + - name: append + args: " -07:00" # PDT + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date: + text: "{{ if or .Result.date_ago .Result.date_time }}{{ or .Result.date_ago .Result.date_time }}{{ else }}now{{ end }}" + size: + selector: span:nth-child(5) + seeders: + selector: span:nth-child(2) + leechers: + selector: span:nth-child(3) + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/torrentqq.yml b/config/prowlarr/Definitions/torrentqq.yml new file mode 100644 index 0000000..89c6f38 --- /dev/null +++ b/config/prowlarr/Definitions/torrentqq.yml @@ -0,0 +1,118 @@ +--- +id: torrentqq +name: TorrentQQ +description: "TorrentQQ (토렌트큐큐) is a Public KOREAN tracker for Korean media." +language: ko-KR +type: public +encoding: UTF-8 +followredirect: true +links: + - https://torrentqq291.com/ +legacylinks: + - https://torrentqq276.com/ + - https://torrentqq277.com/ + - https://torrentqq278.com/ + - https://torrentqq279.com/ + - https://torrentqq280.com/ + - https://torrentqq281.com/ + - https://torrentqq282.com/ + - https://torrentqq283.com/ + - https://torrentqq284.com/ + - https://torrentqq285.com/ + - https://torrentqq286.com/ + - https://torrentqq287.com/ + - https://torrentqq288.com/ + - https://torrentqq289.com/ + - https://torrentqq290.com/ + +caps: + categorymappings: + - {id: "adt", cat: XXX, desc: "성인 (XXX)"} + - {id: "ani", cat: TV/Anime, desc: "애니 (Anime)"} + - {id: "etc", cat: Other, desc: "기타 (Other)"} + - {id: "gme", cat: Console, desc: "게임 (Games)"} + - {id: "med", cat: TV, desc: "방송 (TV)"} + - {id: "mov", cat: Movies, desc: "영화 (Movie)"} + - {id: "mus", cat: Audio, desc: "음악 (Music)"} + - {id: "spo", cat: TV/Sport, desc: "스포츠 (Sport)"} + - {id: "utl", cat: PC, desc: "유틸 (Software)"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + +settings: + - name: flaresolverr + type: info + label: FlareSolverr + default: This site may use Cloudflare DDoS Protection, therefore Prowlarr requires FlareSolverr to access it. + +download: + infohash: + hash: + selector: table.table-bordered > tbody > tr > td > ul > li + filters: + - name: regexp + args: ([A-F|a-f|0-9]{40}) + title: + selector: table.table-bordered > thead > tr > th > strong + filters: + - name: trim + - name: validfilename + +search: + paths: + # https://torrentqq76.com/torrent/newest.html + # https://torrentqq76.com/search?q=cosmic%20sin + - path: "{{ if .Keywords }}search?q={{ .Keywords }}{{ else }}torrent/newest.html{{ end }}" + + rows: + selector: ul#searchresult > li:has(a[href$=".html"][title]) + filters: + - name: andmatch + + fields: + category: + selector: a[href$=".html"][title] + attribute: href + filters: + - name: regexp + args: "\\/torrent\\/(\\w{3})\\/" + title: + selector: a[href$=".html"][title] + details: + selector: a[href$=".html"][title] + attribute: href + download: + selector: a[href$=".html"][title] + attribute: href + date_day: + selector: div.wr-date:contains("-") + optional: true + filters: + - name: dateparse + args: "MM-dd" + date_time: + selector: div.wr-date:contains(":") + optional: true + filters: + - name: dateparse + args: "HH:mm" + date: + text: "{{ if or .Result.date_time .Result.date_day }}{{ or .Result.date_time .Result.date_day }}{{ else }}now{{ end }}" + size: + selector: div.wr-size + filters: + - name: append + args: "B" + seeders: + text: 1 + leechers: + text: 1 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/torrentsectorcrew.yml b/config/prowlarr/Definitions/torrentsectorcrew.yml new file mode 100644 index 0000000..c739030 --- /dev/null +++ b/config/prowlarr/Definitions/torrentsectorcrew.yml @@ -0,0 +1,195 @@ +--- +id: torrentsectorcrew +name: Torrent Sector Crew +description: "Torrent Sector Crew (TSC) is a GERMAN Private Torrent Tracker for MOVIES / TV / GENERAL" +language: de-DE +type: private +encoding: UTF-8 +links: + - https://tsctracker.org/ +legacylinks: + - https://tsctracker.net/ + +caps: + categorymappings: + # Apps + - {id: 65, cat: PC/Mobile-Android, desc: "Apps Android"} + - {id: 107, cat: PC/0day, desc: "Apps Linux"} + - {id: 48, cat: PC/Mac, desc: "Apps MAC"} + - {id: 109, cat: PC, desc: "Apps Sonstige"} + - {id: 134, cat: PC, desc: "Apps Tutorial"} + - {id: 22, cat: PC/0day, desc: "Apps Win"} + # Audio + - {id: 24, cat: Audio/Audiobook, desc: "Audio aBooks"} + - {id: 104, cat: Audio, desc: "Audio Disco's"} + - {id: 38, cat: Audio/Audiobook, desc: "Audio Hoerspiel"} + - {id: 6, cat: Audio, desc: "Audio Musik"} + - {id: 29, cat: Audio/Video, desc: "Audio Videos"} + # Doku + - {id: 130, cat: TV/Documentary, desc: "Doku Bluray"} + - {id: 76, cat: TV/Documentary, desc: "Doku HD"} + - {id: 78, cat: TV/Documentary, desc: "Doku Packs"} + - {id: 75, cat: TV/Documentary, desc: "Doku SD"} + - {id: 113, cat: TV/Documentary, desc: "Doku UHD"} + # Filme + - {id: 54, cat: Movies/HD, desc: "Filme 1080p"} + - {id: 5, cat: Movies/3D, desc: "Filme 3D"} + - {id: 55, cat: Movies/HD, desc: "Filme 720p"} + - {id: 135, cat: Movies/Other, desc: "Filme Anime"} + - {id: 43, cat: Movies/BluRay, desc: "Filme BluRay"} + - {id: 20, cat: Movies/DVD, desc: "Filme DVDR"} + - {id: 120, cat: Movies/Foreign, desc: "Filme Int"} + - {id: 119, cat: Movies, desc: "Filme Remux"} + - {id: 36, cat: Movies/HD, desc: "Filme SD"} + - {id: 121, cat: Movies/UHD, desc: "Filme UHD"} + - {id: 124, cat: Movies/UHD, desc: "Filme UHD Remux"} + # Serien + - {id: 143, cat: TV/Anime, desc: "Serien Anime HD"} + - {id: 138, cat: TV/Anime, desc: "Serien Anime Pack HD"} + - {id: 139, cat: TV/Anime, desc: "Serien Anime Pack SD"} + - {id: 112, cat: TV/Anime, desc: "Serien Anime SD"} + - {id: 128, cat: TV/HD, desc: "Serien Bluray"} + - {id: 129, cat: TV/SD, desc: "Serien DVDR"} + - {id: 140, cat: TV/HD, desc: "Serien HD 1080p"} + - {id: 141, cat: TV/HD, desc: "Serien HD 720p"} + - {id: 72, cat: TV/Foreign, desc: "Serien Int"} + - {id: 125, cat: TV/HD, desc: "Serien Pack HD"} + - {id: 68, cat: TV/SD, desc: "Serien Pack SD"} + - {id: 126, cat: TV/UHD, desc: "Serien Pack UHD"} + - {id: 66, cat: TV/SD, desc: "Serien SD"} + - {id: 127, cat: TV/UHD, desc: "Serien UHD"} + # Sonstige + - {id: 133, cat: PC/0day, desc: "Sonstige 0Day"} + - {id: 117, cat: Other, desc: "Sonstige Diverses"} + - {id: 28, cat: Books, desc: "Sonstige eBooks"} + - {id: 42, cat: TV/Sport, desc: "Sonstige Sport"} + - {id: 137, cat: TV/Sport, desc: "Sonstige Sport-Int"} + - {id: 103, cat: Other, desc: "Sonstige Tutorials"} + - {id: 64, cat: XXX, desc: "Sonstige XXX"} + # Spiele + - {id: 37, cat: Console/NDS, desc: "Spiele Nintendo"} + - {id: 4, cat: PC/Games, desc: "Spiele PC"} + - {id: 58, cat: Console/PS4, desc: "Spiele PSX"} + - {id: 116, cat: Other, desc: "Spiele Sonstige"} + - {id: 50, cat: Console/XBox, desc: "Spiele XBOX"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: pin + type: text + label: Pin + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + - name: info_results + type: info + label: "Search results" + default: "
  1. Only the Classic profile is supported.
  2. Make sure to set the TorrentList-Layout option in your profile to Klassisches Layout, sehr breite Darstellung.
  3. And for best results set the Torrents pro Seite to 100.
" + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeds: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: landing.php + method: form + form: form + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + pin: "{{ .Config.pin }}" + error: + - selector: "#login_box_desc" + test: + path: index.php + selector: a[href="./logout.php"] + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 active, 1 all, 2 dead + incldead: 1 + orderby: "{{ .Config.sort }}" + sort: "{{ .Config.type }}" + + rows: + selector: "table.tablebrowse > tbody > tr:has(a[href^=\"download_ssl.php\"]){{ if .Config.freeleech }}:has(font[color=\"#730d1e\"]:contains(\"[OnlyUpload]\")){{ else }}{{ end }}" + + fields: + category: + selector: a[href*="cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[title][href^="details.php"] + attribute: title + details: + selector: a[title][href^="details.php"] + attribute: href + download: + selector: a[href^="download_ssl.php"] + attribute: href + poster: + selector: a.thumbnail > span > img + attribute: src + grabs: + selector: td:nth-child(10) + size: + selector: td:nth-child(7) + files: + selector: a[href*="&filelist=1"] + seeders: + selector: td:has(a[href*="&toseeders="]) + leechers: + selector: td:has(a[href*="&todlers="]) + date: + selector: td:nth-child(6) + filters: + - name: re_replace + args: ["\\s", " "] + - name: append + args: " +01:00" # CET + - name: dateparse + args: "dd.MM.yyyyHH:mm:ss zzz" + downloadvolumefactor: + case: + "font[color=\"#730d1e\"]:contains(\"[OnlyUpload]\")": 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 0.8 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# engine n/a diff --git a/config/prowlarr/Definitions/torrentseeds-api.yml b/config/prowlarr/Definitions/torrentseeds-api.yml new file mode 100644 index 0000000..0936cef --- /dev/null +++ b/config/prowlarr/Definitions/torrentseeds-api.yml @@ -0,0 +1,162 @@ +--- +id: torrentseeds-api +name: TorrentSeeds (API) +description: "TorrentSeeds is a Private Torrent Tracker for MOVIES / TV / MUSIC / GENERAL" +language: en-US +type: private +encoding: UTF-8 +links: + - https://torrentseeds.org/ + +caps: + categorymappings: + - {id: 1, cat: PC/0day, desc: "Apps"} + - {id: 2, cat: PC/Games, desc: "Games"} + - {id: 3, cat: Movies, desc: "Movies"} + - {id: 4, cat: Audio, desc: "Music"} + - {id: 5, cat: TV/Anime, desc: "Anime"} + - {id: 6, cat: XXX, desc: "Porn"} + - {id: 7, cat: TV/Sport, desc: "Sport"} + - {id: 8, cat: Movies, desc: "Movies/Packs"} + - {id: 3205, cat: TV, desc: "TV"} + - {id: 3206, cat: TV/Foreign, desc: "TV/Foreign"} + - {id: 3207, cat: Movies/Foreign, desc: "Movies/Foreign"} + - {id: 3208, cat: Books/EBook, desc: "E-Books"} + - {id: 3209, cat: TV, desc: "TV/Packs"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + music-search: [q] + book-search: [q] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your TorrentSeeds account My Security page and clicking on the API Token tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + inputs: {} # TODO: remove in v10 + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: api/torrents/filter + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + imdbId: "{{ .Query.IMDBIDShort }}" + tmdbId: "{{ .Query.TMDBID }}" + tvdbId: "{{ .Query.TVDBID }}" + free: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + keywordsfilters: + - name: replace # avoid conflict when prepending + to words + args: ["-", " "] + - name: re_replace # prepend + to each word >2 characters + args: ["(\\w{3,})", "+$1"] + - name: re_replace # +2023 04 13 > +"2023 04 13" + args: ["\\+\\b(\\d{4}[\\s\\.]\\d{2}[\\s\\.]\\d{2})\\b", "+\"$1\""] + + rows: + selector: data + attribute: attributes + + fields: + categorydesc: + selector: category + title: + selector: name + details: + selector: details_link + download: + selector: download_link + poster: + selector: poster + filters: + - name: replace + args: ["https://via.placeholder.com/90x135", ""] + imdbid: + selector: imdb_id + tmdbid: + selector: tmdb_id + tvdbid: + selector: tvdb_id + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0=false, 1=true + selector: freeleech + case: + 0: 1 # not free + 1: 0 # freeleech + uploadvolumefactor: + # api returns 0=false, 1=true + selector: double_upload + case: + 0: 1 # normal + 1: 2 # double +# global MR is 0.5 but torrents must be seeded for 5 days regardless of ratio +# minimumratio: +# text: 0.5 + minimumseedtime: + # 5 days (as seconds = 5 x 24 x 60 x 60) + text: 432000 +# json UNIT3D 5.3.0 custom diff --git a/config/prowlarr/Definitions/torrentsir.yml b/config/prowlarr/Definitions/torrentsir.yml new file mode 100644 index 0000000..ab3a243 --- /dev/null +++ b/config/prowlarr/Definitions/torrentsir.yml @@ -0,0 +1,123 @@ +--- +id: torrentsir +name: TorrentSir +description: "TorrentSir (토렌트썰) is a Public KOREAN tracker for Korean media." +language: ko-KR +type: public +encoding: UTF-8 +followredirect: true +links: + - https://torrentsir129.com/ +legacylinks: + - http://torrentsir120.com/ + - https://torrentsir120.com/ + - http://torrentsir121.com/ + - https://torrentsir121.com/ + - http://torrentsir122.com/ + - https://torrentsir122.com/ + - http://torrentsir123.com/ + - https://torrentsir123.com/ + - http://torrentsir124.com/ + - https://torrentsir124.com/ + - http://torrentsir125.com/ + - https://torrentsir125.com/ + - http://torrentsir126.com/ + - https://torrentsir126.com/ + - http://torrentsir127.com/ + - httsp://torrentsir127.com/ + - https://torrentsir127.com/ + - http://torrentsir128.com/ + - https://torrentsir128.com/ + - http://torrentsir129.com/ + +caps: + categorymappings: + - {id: "gallery", cat: XXX, desc: "+19 (Adult)"} + - {id: "ani", cat: TV, desc: "동영상 (Video)"} + - {id: "game", cat: Console, desc: "기타 (Games)"} + - {id: "tv", cat: TV, desc: "시사/교양 (TV)"} + - {id: "movie", cat: Movies, desc: "영화 (Movie)"} + - {id: "drama", cat: TV, desc: "드라마 (Drama)"} + - {id: "entertain", cat: TV, desc: "예능/오락 (Entertainment)"} + - {id: "music", cat: Audio, desc: "음악 (Music)"} + - {id: "notice", cat: Other, desc: "고객센터 (Notice)"} + - {id: "child", cat: Other, desc: "고객센터 (Child)"} + - {id: "lecture", cat: Books, desc: "도서/강좌 (Books)"} + - {id: "util", cat: PC, desc: "유틸 (Software)"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: flaresolverr + type: info + label: FlareSolverr + default: This site may use Cloudflare DDoS Protection, therefore Prowlarr requires FlareSolverr to access it. + +download: + infohash: + hash: + selector: a[href^="magnet:?xt="] + attribute: href + filters: + - name: regexp + args: ([A-F|a-f|0-9]{40}) + title: + selector: h3.panel-title + filters: + - name: trim + - name: validfilename + +search: + paths: + # https://torrentsir38.com/bbs/search.php?srows=100&gr_id=&sfl=wr_subject&stx=2021&sop=and + - path: bbs/search.php + inputs: + stx: "{{ if .Keywords }}{{ .Keywords }}{{ else }}{{ .Today.Year }}{{ end }}" + srows: 100 + gr_id: "" + # wr_subject||wr_content, wr_subject, wr_content, mb_id, wr_name + sfl: wr_subject + # or, and + sop: and + + rows: + selector: div.search-media div.media + + fields: + category: + selector: div.media-heading a + attribute: href + filters: + - name: querystring + args: bo_table + title: + selector: div.media-heading a + details: + selector: div.media-heading a + attribute: href + download: + selector: div.media-heading a + attribute: href + poster: + selector: div.photo img + attribute: src + date: + # 2021-01-29T20:44:20+09:00 + selector: time + attribute: datetime + size: + text: "512 MB" + seeders: + text: 1 + leechers: + text: 1 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/torrentslocal.yml b/config/prowlarr/Definitions/torrentslocal.yml new file mode 100644 index 0000000..8df9cac --- /dev/null +++ b/config/prowlarr/Definitions/torrentslocal.yml @@ -0,0 +1,495 @@ +--- +id: torrentslocal +name: Torrents-Local +description: "Torrents-Local is a RUSSIAN Semi-Private Torrent Tracker" +language: ru-RU +type: semi-private +encoding: UTF-8 +links: + - https://torrents-local.xyz/ + +caps: + categorymappings: + # note: when refreshing cats use the tracker.php not the search.php! + # Кино, Видео и ТВ + - {id: 8, cat: Movies, desc: "Арт-хаус и авторское кино"} + - {id: 6, cat: Movies, desc: "Зарубежное кино"} + - {id: 592, cat: Movies, desc: "Азиатские фильмы"} + - {id: 813, cat: Movies, desc: "Коллекции"} + - {id: 590, cat: Movies, desc: "Фильмы 1961 - 2000"} + - {id: 589, cat: Movies, desc: "Фильмы 2001 - 2005"} + - {id: 588, cat: Movies, desc: "Фильмы 2006 - 2010"} + - {id: 945, cat: Movies, desc: "Фильмы 2011 - 2015"} + - {id: 978, cat: Movies, desc: "Фильмы 2016 - 2021"} + - {id: 10, cat: Movies, desc: "Мультфильмы"} + - {id: 759, cat: Movies, desc: "Короткометражные"} + - {id: 475, cat: Movies, desc: "СССР"} + - {id: 7, cat: Movies, desc: "Отечественное кино"} + - {id: 227, cat: Movies, desc: "СССР"} + # DVD/HD видео" + - {id: 832, cat: Movies/HD, desc: "Арт-хаус и авторское кино HD"} + - {id: 842, cat: Movies/HD, desc: "Зарубежное кино HD"} + - {id: 876, cat: Movies/HD, desc: "HD Коллекции"} + - {id: 845, cat: Movies/HD, desc: "HD до 2000 года"} + - {id: 844, cat: Movies/HD, desc: "HD 2001 - 2005"} + - {id: 843, cat: Movies/HD, desc: "HD 2006 - 2010"} + - {id: 870, cat: Movies/HD, desc: "HD 2011 - 2015"} + - {id: 980, cat: Movies/HD, desc: "HD 2016 - 2021"} + - {id: 846, cat: Movies/HD, desc: "Мультфильмы HD"} + - {id: 849, cat: Movies/HD, desc: "Отечественное кино DVD/HD"} + - {id: 851, cat: Movies/HD, desc: "Отечественное кино DVD"} + - {id: 850, cat: Movies/HD, desc: "Отечественное кино HD"} + # Сериалы + - {id: 14, cat: TV, desc: "Зарубежные сериалы"} + - {id: 862, cat: TV, desc: "Сборники"} + - {id: 454, cat: TV, desc: "Сериалы на языке оригинала"} + - {id: 981, cat: TV, desc: "Ад на колёсах / Hell on Wheels"} + - {id: 982, cat: TV, desc: "Американская история ужасов / American Horror Story"} + - {id: 194, cat: TV, desc: "Анатомия страcти / Grey's Anatomy"} + - {id: 997, cat: TV, desc: "Банши / Banshee"} + - {id: 998, cat: TV, desc: "Белый воротничок / White Collar"} + - {id: 1013, cat: TV, desc: "Бесстыжие / Shameless"} + - {id: 379, cat: TV, desc: "Блудливая калифорния / Californication"} + - {id: 988, cat: TV, desc: "Бруклин 9-9 / Brooklyn Nine-Nine"} + - {id: 992, cat: TV, desc: "В поле зрения / Person of Interest"} + - {id: 1000, cat: TV, desc: "Викинги / Vikings"} + - {id: 818, cat: TV, desc: "Во все тяжкие / Breaking Bad; Лучше звоните Солу / Better..."} + - {id: 90, cat: TV, desc: "Герои / Heroes"} + - {id: 558, cat: TV, desc: "Готэм / Gotham"} + - {id: 126, cat: TV, desc: "Грань / Fringe"} + - {id: 162, cat: TV, desc: "Гримм / Grimm"} + - {id: 134, cat: TV, desc: "Два с половиной человека / Two and a Half Men"} + - {id: 81, cat: TV, desc: "Декстер / Dexter"} + - {id: 164, cat: TV, desc: "Дневники вампира / The Vampire Diaries; Древние / The..."} + - {id: 112, cat: TV, desc: "Доктор Кто / Doctor Who"} + - {id: 61, cat: TV, desc: "Доктор Хаус / House M.D."} + - {id: 121, cat: TV, desc: "Друзья / Friends & Джо / Joey"} + - {id: 91, cat: TV, desc: "Звездные Врата / Stargate"} + - {id: 433, cat: TV, desc: "Звездный крейсер Галактика / Battlestar Galactica"} + - {id: 220, cat: TV, desc: "Игра Престолов / Game of Thrones"} + - {id: 201, cat: TV, desc: "Как я встретил вашу маму / How I met your mother"} + - {id: 995, cat: TV, desc: "Карточный домик / House of Cards"} + - {id: 653, cat: TV, desc: "Клан Сопрано / The Sopranos"} + - {id: 127, cat: TV, desc: "Коломбо / Columbo"} + - {id: 431, cat: TV, desc: "Косяки (Дурман) / Weeds"} + - {id: 62, cat: TV, desc: "Клиника / Scrubs"} + - {id: 1003, cat: TV, desc: "Менталист / The Mentalist"} + - {id: 751, cat: TV, desc: "Мерлин / Merlin"} + - {id: 192, cat: TV, desc: "Молокососы / Skins"} + - {id: 1014, cat: TV, desc: "Нация Z / Z Nation"} + - {id: 1004, cat: TV, desc: "Оборотень / Teen Wolf"} + - {id: 64, cat: TV, desc: "Остаться в живых / LOST"} + - {id: 198, cat: TV, desc: "Отбросы / Плохие / Misfits"} + - {id: 386, cat: TV, desc: "Отчаянные домохозяйки / Desperate housewives"} + - {id: 406, cat: TV, desc: "Офис / The Office"} + - {id: 63, cat: TV, desc: "Побег / Prison Break"} + - {id: 943, cat: TV, desc: "Редкие и старинные сериалы"} + - {id: 98, cat: TV, desc: "Сверхъестественное / Supernatural"} + - {id: 88, cat: TV, desc: "Секретные материалы / X-files"} + - {id: 1007, cat: TV, desc: "Силиконовая долина / Silicon Valley"} + - {id: 385, cat: TV, desc: "Спартак / Spartacus"} + - {id: 128, cat: TV, desc: "Стрела / Arrow"} + - {id: 983, cat: TV, desc: "Сыны Анархии / Sons of Anarchy"} + - {id: 101, cat: TV, desc: "Тайны Смолвиля / Smallville"} + - {id: 993, cat: TV, desc: "Темное дитя / Orphan Black"} + - {id: 190, cat: TV, desc: "Теория Большого Взрыва / The Big Bang Theory; Мол..."} + - {id: 738, cat: TV, desc: "Теория Лжи (Обмани меня) / Lie to me"} + - {id: 129, cat: TV, desc: "Флэш / The Flash"} + - {id: 161, cat: TV, desc: "Ходячие мертвецы / The Walking Dead; Бойтесь хо..."} + - {id: 984, cat: TV, desc: "Чёрный список / The Blacklist"} + - {id: 472, cat: TV, desc: "Шерлок / Sherlock"} + - {id: 1008, cat: TV, desc: "Штамм / The Strain"} + - {id: 11, cat: TV, desc: "Мультсериалы"} + - {id: 13, cat: TV, desc: "Отечественные cериалы"} + - {id: 137, cat: TV, desc: "Бригада"} + - {id: 188, cat: TV, desc: "Восьмидесятые"} + - {id: 815, cat: TV, desc: "Глухарь"} + - {id: 559, cat: TV, desc: "Интерны"} + - {id: 189, cat: TV, desc: "Кадетство"} + - {id: 221, cat: TV, desc: "Карпов"} + - {id: 422, cat: TV, desc: "Реальные пацаны"} + - {id: 661, cat: TV, desc: "Сваты"} + - {id: 584, cat: TV, desc: "Убойная сила"} + - {id: 651, cat: TV, desc: "Улицы разбитых фонарей"} + - {id: 136, cat: TV, desc: "Универ"} + # Музыка" + - {id: 598, cat: Audio, desc: "Башкирская, татарская"} + - {id: 27, cat: Audio, desc: "Музыка других жанров"} + - {id: 608, cat: Audio, desc: "Lossless"} + - {id: 24, cat: Audio, desc: "Поп музыка"} + - {id: 470, cat: Audio, desc: "Зарубежная"} + - {id: 599, cat: Audio, desc: "Зарубежная (lossless)"} + - {id: 469, cat: Audio, desc: "Отечественная"} + - {id: 471, cat: Audio, desc: "Сборники"} + - {id: 25, cat: Audio, desc: "Рэп, Хип-Хоп, R'n'B"} + - {id: 411, cat: Audio, desc: "HD видео"} + - {id: 235, cat: Audio, desc: "Зарубежный Рэп, Хип-Хоп"} + - {id: 921, cat: Audio, desc: "Зарубежный R'n'B"} + - {id: 922, cat: Audio, desc: "Отечественный R'n'B"} + - {id: 234, cat: Audio, desc: "Отечественный Рэп, Хип-Хоп"} + - {id: 26, cat: Audio, desc: "Саундтреки и Караоке"} + - {id: 484, cat: Audio, desc: "Саундтреки к играм"} + - {id: 579, cat: Audio, desc: "Саундтреки к играм (lossless)"} + - {id: 485, cat: Audio, desc: "Саундтреки к фильмам и сериалам"} + - {id: 580, cat: Audio, desc: "Саундтреки к фильмам и сериалам (lossless)"} + - {id: 735, cat: Audio, desc: "Караоке"} + # Рок-музыка" + - {id: 30, cat: Audio, desc: "Зарубежная Alternative"} + - {id: 267, cat: Audio, desc: "Alternative"} + - {id: 562, cat: Audio, desc: "Alternative (lossless)"} + - {id: 368, cat: Audio, desc: "Emo / Hardcore"} + - {id: 369, cat: Audio, desc: "Industrial"} + - {id: 564, cat: Audio, desc: "Industrial (lossless)"} + - {id: 266, cat: Audio, desc: "Punk"} + - {id: 364, cat: Audio, desc: "Отечественная Alternative"} + - {id: 370, cat: Audio, desc: "Alternative"} + - {id: 365, cat: Audio, desc: "Emo / Hardcore"} + - {id: 367, cat: Audio, desc: "Punk"} + - {id: 569, cat: Audio, desc: "Punk (lossless)"} + - {id: 29, cat: Audio, desc: "Зарубежный Metal"} + - {id: 254, cat: Audio, desc: "Avant-garde, Experimental"} + - {id: 253, cat: Audio, desc: "Black, Folk, Pagan, Viking"} + - {id: 252, cat: Audio, desc: "Death, Doom, Sludge, Stoner"} + - {id: 500, cat: Audio, desc: "Death, Doom, Sludge, Stoner (lossless)"} + - {id: 251, cat: Audio, desc: "Gothic Metal"} + - {id: 249, cat: Audio, desc: "Heavy, Power, Progressive"} + - {id: 503, cat: Audio, desc: "Heavy, Power, Progressive (lossless)"} + - {id: 895, cat: Audio, desc: "Symphonic, Operatic"} + - {id: 909, cat: Audio, desc: "Symphonic, Operatic (lossless)"} + - {id: 504, cat: Audio, desc: "Thrash, Speed (lossless)"} + - {id: 28, cat: Audio, desc: "Зарубежный Rock"} + - {id: 260, cat: Audio, desc: "Classic Rock & Hard Rock"} + - {id: 505, cat: Audio, desc: "Classic Rock & Hard Rock (lossless)"} + - {id: 258, cat: Audio, desc: "Folk-Rock"} + - {id: 256, cat: Audio, desc: "Instrumental"} + - {id: 257, cat: Audio, desc: "Indie Rock, Britpop, Pop-Rock, Soft Rock"} + - {id: 509, cat: Audio, desc: "Indie Rock, Britpop, Pop-Rock, Soft Rock (lossless)"} + - {id: 259, cat: Audio, desc: "Progressive & Art-Rock"} + - {id: 99, cat: Audio, desc: "Отечественный Метал"} + - {id: 336, cat: Audio, desc: "Black, Folk, Pagan, Viking"} + - {id: 333, cat: Audio, desc: "Hard & Heavy, Power, Speed, Thrash"} + - {id: 31, cat: Audio, desc: "Отечественный Рок"} + - {id: 360, cat: Audio, desc: "Classic Rock & Hard Rock & Rock'n'Roll"} + - {id: 517, cat: Audio, desc: "Classic Rock & Hard Rock & Rock'n..."} + - {id: 361, cat: Audio, desc: "Progressive & Art-Rock"} + - {id: 362, cat: Audio, desc: "Pop-Rock & Soft Rock & Folk Rock"} + - {id: 519, cat: Audio, desc: "Pop-Rock & Soft Rock & Folk Rock (lossless)"} + - {id: 141, cat: Audio, desc: "Experimental"} + - {id: 526, cat: Audio, desc: "Lossless"} + - {id: 32, cat: Audio, desc: "Видео (Рок-музыка)"} + - {id: 374, cat: Audio, desc: "Alternative"} + - {id: 238, cat: Audio, desc: "DVD"} + - {id: 571, cat: Audio, desc: "Metal"} + - {id: 572, cat: Audio, desc: "Rock"} + - {id: 400, cat: Audio, desc: "Сборники Рок-Музыки"} + # Электронная музыка" + - {id: 33, cat: Audio, desc: "Trance, Goa-Trance, Psy-Trance, PsyChill, Ambient Dub"} + - {id: 429, cat: Audio, desc: "Trance - Albums, Compilations"} + - {id: 430, cat: Audio, desc: "Trance - Radioshows, Livesets, Mixes"} + - {id: 533, cat: Audio, desc: "Trance - Singles, Albums, LPs (lossless)"} + - {id: 428, cat: Audio, desc: "Goa-Trance / Psychedelic / Psy-Chill / Ambient Dub"} + - {id: 658, cat: Audio, desc: "Сборники"} + - {id: 34, cat: Audio, desc: "House, Techno"} + - {id: 438, cat: Audio, desc: "Techno / Minimal / Tech House"} + - {id: 435, cat: Audio, desc: "House / Electro House"} + - {id: 659, cat: Audio, desc: "Сборники House / Electro House"} + - {id: 436, cat: Audio, desc: "Progressive House / Deep House"} + - {id: 35, cat: Audio, desc: "Drum & Bass, Jungle, Electro, Breakbeat, IDM,..."} + - {id: 416, cat: Audio, desc: "Breakbeat / Beats"} + - {id: 540, cat: Audio, desc: "Breakbeat / Beats (lossless)"} + - {id: 415, cat: Audio, desc: "Drum & Bass / Jungle"} + - {id: 417, cat: Audio, desc: "Electro"} + - {id: 36, cat: Audio, desc: "Chillout, Lounge, Downtempo, Trip-Hop"} + # Игры для PC" + - {id: 40, cat: PC/Games, desc: "Новые раздачи"} + - {id: 65, cat: PC/Games, desc: "Горячие Новинки"} + - {id: 75, cat: PC/Games, desc: "Action"} + - {id: 457, cat: PC/Games, desc: "Action до 2003 г."} + - {id: 900, cat: PC/Games, desc: "FPS (1st Person)"} + - {id: 901, cat: PC/Games, desc: "TPS (3rd Person)"} + - {id: 902, cat: PC/Games, desc: "Counter Strike"} + - {id: 102, cat: PC/Games, desc: "Horror"} + - {id: 456, cat: PC/Games, desc: "Horror до 2003 г."} + - {id: 68, cat: PC/Games, desc: "Аркады"} + - {id: 464, cat: PC/Games, desc: "Аркады до 2003 г."} + - {id: 73, cat: PC/Games, desc: "Гонки"} + - {id: 463, cat: PC/Games, desc: "Гонки до 2003 г."} + - {id: 270, cat: PC/Games, desc: "Для самых маленьких"} + - {id: 823, cat: PC/Games, desc: "Другое"} + - {id: 624, cat: PC/Games, desc: "Программы для игр"} + - {id: 66, cat: PC/Games, desc: "Модификации"} + - {id: 657, cat: PC/Games, desc: "Логические"} + - {id: 77, cat: PC/Games, desc: "Многопользовательские"} + - {id: 69, cat: PC/Games, desc: "Приключения и квесты"} + - {id: 461, cat: PC/Games, desc: "Приключения и квесты до 2003 г."} + - {id: 76, cat: PC/Games, desc: "Ролевые (RPG)"} + - {id: 455, cat: PC/Games, desc: "Ролевые (RPG) до 2003 г."} + - {id: 908, cat: PC/Games, desc: "Симуляторы"} + - {id: 271, cat: PC/Games, desc: "Спортивные симуляторы"} + - {id: 787, cat: PC/Games, desc: "Космические симуляторы"} + - {id: 74, cat: PC/Games, desc: "Другие симуляторы"} + - {id: 71, cat: PC/Games, desc: "Автосимуляторы"} + - {id: 72, cat: PC/Games, desc: "Авиасимуляторы"} + # Программы и дизайн" + - {id: 918, cat: PC, desc: "Новые раздачи"} + - {id: 50, cat: PC, desc: "Веб-разработка и Программирование"} + - {id: 319, cat: PC, desc: "WYSIWYG Редакторы для веб-диза"} + - {id: 316, cat: PC, desc: "Компоненты для сред программирования"} + - {id: 315, cat: PC, desc: "Скрипты и шаблоны"} + - {id: 317, cat: PC, desc: "Среды программирования, компиляторы и вспомогател..."} + - {id: 318, cat: PC, desc: "Текстовые редакторы"} + - {id: 52, cat: PC, desc: "ГИС, системы навигации и карты"} + - {id: 332, cat: PC, desc: "Материалы для мультимедиа и дизайна"} + - {id: 594, cat: PC, desc: "Авторские сборки"} + - {id: 582, cat: PC, desc: "Кисти"} + - {id: 746, cat: PC, desc: "Семплы"} + - {id: 552, cat: PC, desc: "Футажи"} + - {id: 581, cat: PC, desc: "Шрифты"} + - {id: 47, cat: PC, desc: "Операционные системы от Microsoft"} + - {id: 284, cat: PC, desc: "Настольные ОС от Microsoft (выпущенные до Windows XP)"} + - {id: 280, cat: PC, desc: "Windows XP"} + - {id: 282, cat: PC, desc: "Windows Vista"} + - {id: 378, cat: PC, desc: "Windows 7"} + - {id: 944, cat: PC, desc: "Windows 8"} + - {id: 789, cat: PC, desc: "Windows 10"} + - {id: 281, cat: PC, desc: "Серверные ОС"} + - {id: 732, cat: PC, desc: "WPI, Live CD, Пакеты обновлений"} + - {id: 51, cat: PC, desc: "Программы для работы с мультимедиа и 3D"} + - {id: 324, cat: PC, desc: "3D моделирование, рендеринг и плагины для них"} + - {id: 325, cat: PC, desc: "Анимация"} + - {id: 330, cat: PC, desc: "Аудио- и видео-, CD- проигрыватели и каталогизаторы"} + - {id: 328, cat: PC, desc: "Аудио- и видео- конверторы"} + - {id: 118, cat: PC, desc: "Графические редакторы"} + - {id: 331, cat: PC, desc: "Каталогизаторы и просмотрщики графики"} + - {id: 623, cat: PC, desc: "Кодеки"} + - {id: 329, cat: PC, desc: "Работа со звуком"} + - {id: 327, cat: PC, desc: "Редакторы видео"} + - {id: 326, cat: PC, desc: "Создание DVD-видео"} + - {id: 322, cat: PC, desc: "Плагины для программ компании Adobe"} + - {id: 321, cat: PC, desc: "Программные комплекты"} + - {id: 323, cat: PC, desc: "Программы для верстки, печати и работы со шрифтами"} + - {id: 48, cat: PC, desc: "Системные программы"} + - {id: 291, cat: PC, desc: "Анти-шпионы и анти-трояны"} + - {id: 300, cat: PC, desc: "Архиваторы и файловые менеджеры"} + - {id: 289, cat: PC, desc: "Драйвера"} + - {id: 287, cat: PC, desc: "Изменение интерфейса ОС Windows"} + - {id: 296, cat: PC, desc: "Информация и диагностика"} + - {id: 290, cat: PC, desc: "Программы для защиты информации"} + - {id: 295, cat: PC, desc: "Программы для интернет и сетей"} + - {id: 292, cat: PC, desc: "Программы для защиты компьютера"} + - {id: 299, cat: PC, desc: "Программы для настройки и оптимизации ОС"} + - {id: 297, cat: PC, desc: "Работа с носителями информации"} + - {id: 285, cat: PC, desc: "Работа с жёстким диском"} + - {id: 301, cat: PC, desc: "Резервное копирование"} + - {id: 288, cat: PC, desc: "Серверное ПО для Windows"} + - {id: 54, cat: PC, desc: "Разное"} + - {id: 303, cat: PC, desc: "Системы для бизнеса, офиса, научной и проектной работы"} + - {id: 305, cat: PC, desc: "Офисные системы"} + - {id: 312, cat: PC, desc: "Программы для архитекторов и дизайнеров интерьеров"} + - {id: 308, cat: PC, desc: "Работа с PDF и DjVu"} + - {id: 307, cat: PC, desc: "Распознавание текста, звука и синтез речи"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: stripcyrillic + type: checkbox + label: Strip Cyrillic Letters + default: false + - name: addrussiantotitle + type: checkbox + label: Add RUS to end of all titles to improve language detection by Sonarr and Radarr. Will cause English-only results to be misidentified. + default: false + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 1 + options: + 1: created + 10: seeders + 7: size + 2: title + - name: type + type: select + label: Order requested from site + default: 2 + options: + 2: desc + 1: asc + - name: info + type: info + label: Layout + default: "Only the Classic forum style is supported.
  • On the TorrentsLocal web site navigate to the Личные настройки (Preferences) section and set the Стиль форума (Forum Style) option to Классическая тема (Classic Theme)
  • " + +login: + path: login.php + method: post + inputs: + "login_username": "{{ .Config.username }}" + "login_password": "{{ .Config.password }}" + autologin: 1 + login: "Вход" + error: + - selector: h4.text-danger + test: + path: / + selector: a[href="./login.php?logout=1"] + +search: + paths: + - path: tracker.php + method: post + inputs: + $raw: "{{ if .Categories }}{{ range .Categories }}f[]={{.}}&{{end}}{{ else }}f[]=-1{{ end }}" + prev_allw: 1 + prev_a: 0 + prev_dla: 0 + prev_dlc: 0 + prev_dld: 0 + prev_dlw: 0 + prev_my: 0 + prev_new: 0 + prev_sd: 0 + prev_da: 1 + prev_dc: 0 + prev_df: 1 + prev_ds: 0 + prev_tor_type: 0 + o: "{{ .Config.sort }}" + s: "{{ .Config.type }}" + # show category + dc: 0 + # show forum + df: 1 + # show author + da: 1 + # show speed + ds: 0 + # -1=all time + tm: -1 + # seed not seen -1=disregard + sns: -1 + # group releases -1=not selected + srg: -1 + nm: "{{ .Keywords }}" + # all words + allw: 1 + tor_type: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + + keywordsfilters: + # strip season and/or ep + - name: re_replace + args: ["(?i)\\b(?:[SE]\\d{1,4}){1,2}\\b\\s?", ""] + - name: re_replace + args: ["(\\w+)", "+$1"] # prepend + to each word + + rows: + selector: tr[id^="tor_"] + + fields: + category: + selector: a[href^="tracker.php?f="] + attribute: href + filters: + - name: querystring + args: f + title: + selector: a[href^="./viewtopic.php?t="] + filters: + # normalize to SXXEYY format + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)\\s*(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)", "S$1E$2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?)", "S$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+[CС]езоны?", "S$1"] + - name: re_replace + args: ["(?i)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)", "E$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "E$1"] + - name: re_replace + args: ["(?i)\\s\\|\\sот\\s([\\w\\p{P}\\p{S}]+)$", "-$1"] + - name: re_replace + args: ["\\s\\|\\s(\\w{4,})$", "-$1"] + - name: re_replace + args: ["(\\([\\p{IsCyrillic}\\W]+\\))|(^[\\p{IsCyrillic}\\W\\d]+\\/ )|([\\p{IsCyrillic} \\-]+,+)|([\\p{IsCyrillic}]+)", "{{ if .Config.stripcyrillic }}{{ else }}$1$2$3$4{{ end }}"] + - name: re_replace + args: ["(?i)\\bHDTV[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bSAT[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bWEB[-\\s]?DL[-\\s]?Rip\\b", "WEB-DL"] + - name: re_replace + args: ["(?i)\\bWEB\\sRip\\b", "WEBRip"] + - name: re_replace + args: ["(?i)\\bWEB\\sDL\\b", "WEB-DL"] + - name: re_replace + args: ["[\\[\\(\\{<«][\\s\\W]*[\\]\\)\\}>»]", ""] + - name: re_replace + args: ["^[\\s&,\\.!\\?\\+\\-_\\|\\/':]+", ""] + - name: append + args: "{{ if .Config.addrussiantotitle }} RUS{{ else }}{{ end }}" + details: + selector: a[href^="./viewtopic.php?t="] + attribute: href + download: + selector: a[href^="./dl.php?id="] + attribute: href + magnet: + selector: a[href^="magnet:?xt="] + attribute: href + size: + selector: td:nth-last-child(5) > u + seeders: + selector: td.seedmed + leechers: + selector: td.leechmed + grabs: + selector: td:nth-last-child(2) + date: + # unix + selector: td:last-child > u + downloadvolumefactor: + case: + img[src="styles/images/tor_gold.gif"]: 0 + img[src="styles/images/tor_silver.gif"]: 0.5 + "*": 1 + uploadvolumefactor: + text: 1 + description: + selector: a[href^="./viewtopic.php?t="] +# TorrentPier diff --git a/config/prowlarr/Definitions/torrenttrader.yml b/config/prowlarr/Definitions/torrenttrader.yml new file mode 100644 index 0000000..a8ca25a --- /dev/null +++ b/config/prowlarr/Definitions/torrenttrader.yml @@ -0,0 +1,173 @@ +--- +id: torrenttrader +name: Torrent Trader +description: "Torrent Trader is a GERMAN Private Torrent Tracker for MOVIES / TV / GENERAL" +language: de-DE +type: private +encoding: UTF-8 +links: + - https://the-torrent-trader.com/ + +caps: + categorymappings: + - {id: 119, cat: Other, desc: "Bilder"} + - {id: 135, cat: Movies/HD, desc: "Filme - 1080p"} + - {id: 130, cat: Movies/UHD, desc: "Filme - 2160p"} + - {id: 134, cat: Movies/HD, desc: "Filme - 720p"} + - {id: 148, cat: Movies/DVD, desc: "Filme - DVD/HD2DVD"} + - {id: 146, cat: Movies, desc: "Filme - Klassiker"} + - {id: 105, cat: Movies, desc: "Filme - x264/x265"} + - {id: 127, cat: Movies, desc: "Für Unsere kleinsten"} + - {id: 149, cat: Movies/HD, desc: "Movie Pack HD"} + - {id: 150, cat: Movies/SD, desc: "Movie Pack SD"} + - {id: 137, cat: TV/HD, desc: "Serien - 1080p"} + - {id: 138, cat: TV/UHD, desc: "Serien - 2160p"} + - {id: 144, cat: TV/HD, desc: "Serien - 720p"} + - {id: 116, cat: TV, desc: "Serien - Pack"} + - {id: 143, cat: TV/Other, desc: "Serien - Sonstige"} + - {id: 142, cat: TV/Documentary, desc: "Doku - Sonstige"} + - {id: 133, cat: Audio/MP3, desc: "Musik - MP3/Mp4"} + - {id: 123, cat: Audio, desc: "Musik - Discography"} + - {id: 122, cat: Audio/Audiobook, desc: "Musik - Hörbuch"} + - {id: 124, cat: Audio, desc: "Musik - Alben"} + - {id: 125, cat: Audio/Video, desc: "Musik - Video"} + - {id: 120, cat: Books, desc: "Ebook"} + - {id: 115, cat: PC/0day, desc: "Programme - Windows"} + - {id: 114, cat: PC/Mac, desc: "Programme - Mac"} + - {id: 113, cat: PC, desc: "Programme - Linux"} + - {id: 121, cat: Other, desc: "Handy Stuff"} + - {id: 129, cat: Other, desc: "Sonstiges"} + - {id: 109, cat: PC/Mobile-Other, desc: "Spiele - Handy"} + - {id: 112, cat: Console, desc: "Spiele - Konsolen"} + - {id: 111, cat: PC/Games, desc: "Spiele - Mac / Linux"} + - {id: 110, cat: PC/Games, desc: "Spiele - PC"} + - {id: 118, cat: TV/Sport, desc: "Sport - Sonstiges"} + - {id: 69, cat: XXX, desc: "XXX"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: pin + type: text + label: Pin + - name: onlyupload + type: checkbox + label: Filter OnlyUpload only + default: false + - name: info_free + type: info + label: About OnlyUpload at Torrent Trader + default: "
    • OnlyUpload are torrents where download is not counted but upload is. Good for building your Ratio up. (On the Prowlarr dashboard search results these are tagged as Freeleech).
    " + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeds: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents pro Seite: setting to 100 on your Control Panel. The default is 15. + +login: + path: login.php + method: form + cookies: ["JAVA=OK"] # avoid jscheck redirect + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + secure_pin: "{{ .Config.pin }}" + returnto: / + error: + - selector: table.tableinborder:contains("Anmeldung Gescheitert!") > tbody > tr > td.tablea + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + showsearch: 1 + # 0 active, 1 all, 2 dead + incldead: 1 + orderby: "{{ .Config.sort }}" + sort: "{{ .Config.type }}" + # site does not support imdbid searching or display imdb links in results. + + rows: + selector: "table.tableinborder > tbody > tr:has(a[href^=\"download.php?torrent=\"]){{ if .Config.onlyupload }}:has(img[src=\"pic/oupic.gif\"]){{ else }}{{ end }}" + filters: + - name: andmatch + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="]:has(b) + details: + selector: td.content_wrap > table > tbody > tr:nth-child(2) > td:nth-child(4) > a + attribute: href + download: + selector: a[href^="download.php?torrent="] + attribute: href + size: + selector: td.content_wrap > table > tbody > tr:nth-child(2) > td:nth-child(1) > b:nth-child(1) + grabs: + selector: td.content_wrap > table > tbody > tr:nth-child(2) > td:nth-child(3) > b + files: + selector: td.content_wrap > table > tbody > tr:nth-child(2) > td:nth-child(1) > b:nth-child(2) + seeders: + selector: td.content_wrap > table > tbody > tr:nth-child(2) > td:nth-child(2) > b:nth-child(1) + leechers: + selector: td.content_wrap > table > tbody > tr:nth-child(2) > td:nth-child(2) > b:nth-child(3) + date: + selector: td.content_wrap > table > tbody > tr:nth-child(2) > td:nth-child(5) + filters: + - name: replace + args: ["\u00a0", " "] + - name: append + args: " +01:00" # CET + - name: dateparse + args: "dd.MM.yyyy HH:mm:ss zzz" + downloadvolumefactor: + case: + img[src="pic/oupic.gif"]: 0 # only upload is counted + "*": 1 + uploadvolumefactor: + case: + img[src="pic/freeleech.gif"]: 0 # nothing is counted + "*": 1 + minimumratio: + text: 0.7 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# engine tbd diff --git a/config/prowlarr/Definitions/torrentview.yml b/config/prowlarr/Definitions/torrentview.yml new file mode 100644 index 0000000..1d36972 --- /dev/null +++ b/config/prowlarr/Definitions/torrentview.yml @@ -0,0 +1,101 @@ +--- +id: torrentview +name: TorrentView +description: "Torrent View (토렌트뷰) is a Public KOREAN tracker for Korean media." +language: ko-KR +type: public +encoding: UTF-8 +followredirect: true +links: + - https://viewtorrent17.com/ +legacylinks: + - https://viewtorrent1.com/ + - https://viewtorrent2.com/ + - https://viewtorrent4.com/ + - https://viewtorrent5.com/ + - https://viewtorrent6.com/ + - https://viewtorrent7.com/ + - https://viewtorrent8.com/ + - https://viewtorrent10.com/ + - https://viewtorrent11.com/ + - https://viewtorrent12.com/ + - https://viewtorrent13.com/ + - https://viewtorrent14.com/ + - https://viewtorrent15.com/ + - https://viewtorrent16.com/ + +caps: + categorymappings: + - {id: "mov", cat: Movies, desc: "토렌트영화 (Movies)"} + - {id: "enter", cat: TV, desc: "예능 (TV Variety Shows)"} + - {id: "drama", cat: TV, desc: "드라마 (TV Dramas)"} + - {id: "tv", cat: TV/Documentary, desc: "시사 (Documentaries)"} + - {id: "netflix", cat: TV, desc: "넷플릭스 (Netflix, Disney+, etc.)"} + - {id: "util", cat: PC, desc: "토렌트유틸 (Utilities)"} + - {id: "ani", cat: TV/Anime, desc: "애니 (Anime)"} + - {id: "music", cat: Audio, desc: "음원 (Music)"} + - {id: "comm_2", cat: Other, desc: "커뮤니티 (Community)"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + +settings: [] + +download: + selectors: + - selector: a[href^="magnet:?xt="] + attribute: href + +search: + paths: + # https://torrentview3.net/bbs/search.php?srows=10&gr_id=&sfl=wr_subject&stx=test&sop=and + - path: "bbs/search.php" + inputs: + # number of rows + srows: 100 + # category: all + gr_id: "" + # search in: title + sfl: wr_subject + stx: "{{ if .Keywords }}{{ .Keywords }}{{ else }}{{ .Today.Year }}{{ end }}" + # search operand: or, and + sop: and + + rows: + selector: div.search-media > div.media + + fields: + category_id: + selector: div.media-content > a[href^="./board.php"] + attribute: href + filters: + - name: querystring + args: bo_table + category: + text: "{{ .Result.category_id }}" + title: + selector: div.media-heading > a[href^="./board.php"] + details: + selector: div.media-heading > a[href^="./board.php"] + attribute: href + download: + selector: div.media-heading > a[href^="./board.php"] + attribute: href + date: + # 2020-03-28T01:30:01+09:00 + selector: time + attribute: datetime + size: + text: "{{ if ne .Result.category_id \"mov\" }}512 MB{{ else }}2 GB{{ end }}" + seeders: + text: 1 + leechers: + text: 1 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/torrentwhiz.yml b/config/prowlarr/Definitions/torrentwhiz.yml new file mode 100644 index 0000000..ef48684 --- /dev/null +++ b/config/prowlarr/Definitions/torrentwhiz.yml @@ -0,0 +1,112 @@ +--- +id: torrentwhiz +name: TorrentWhiz +description: "TorrentWhiz ( 토렌트위즈) is a Public KOREAN tracker for Korean media." +language: ko-KR +type: public +encoding: UTF-8 +followredirect: true +links: + - https://torrentwiz64.com/ +legacylinks: + - https://torrentwiz48.com/ + - https://torrentwiz49.com/ + - https://torrentwiz50.com/ + - https://torrentwiz51.com/ + - https://torrentwiz52.com/ + - https://torrentwiz54.com/ + - https://torrentwiz55.com/ + - https://torrentwiz56.com/ + - https://torrentwiz57.com/ + - https://torrentwiz58.com/ + - https://torrentwiz59.com/ + - https://torrentwiz60.com/ + - https://torrentwiz61.com/ + - https://torrentwiz62.com/ + - https://torrentwiz63.com/ + +caps: + categorymappings: + - {id: "netflix", cat: TV, desc: "넷플릭스 (Netflix)"} + - {id: "tv", cat: TV, desc: "시사 (TV)"} + - {id: "mov", cat: Movies, desc: "영화 (Movie)"} + - {id: "drama", cat: TV, desc: "드라마 (Drama)"} + - {id: "enter", cat: TV, desc: "예능 (Entertainment)"} + - {id: "music", cat: Audio, desc: "음원 (Music)"} + - {id: "util", cat: PC, desc: "유틸 (Software)"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + +settings: + - name: flaresolverr + type: info + label: FlareSolverr + default: This site may use Cloudflare DDoS Protection, therefore Prowlarr requires FlareSolverr to access it. + +download: + infohash: + hash: + selector: a[href^="magnet:?xt="] + attribute: href + filters: + - name: regexp + args: ([A-F|a-f|0-9]{40}) + title: + selector: h1.panel-title + filters: + - name: trim + - name: validfilename + +search: + paths: + # https://torrentwiz31.com/bbs/search.php?url=&stx=sin&srows=100&gr_id=&sfl=wr_subject&sop=and + - path: bbs/search.php + inputs: + stx: "{{ if .Keywords }}{{ .Keywords }}{{ else }}{{ .Today.Year }}{{ end }}" + srows: 100 + gr_id: "" + # wr_subject||wr_content, wr_subject, wr_content, mb_id, wr_name + sfl: wr_subject + # or, and + sop: and + + rows: + selector: div.search-media div.media + + fields: + category: + selector: div.media-heading a + attribute: href + filters: + - name: querystring + args: bo_table + title: + selector: div.media-heading a + details: + selector: div.media-heading a + attribute: href + download: + selector: div.media-heading a + attribute: href + poster: + selector: div.photo img + attribute: src + date: + # 2021-01-29T20:44:20+09:00 + selector: time + attribute: datetime + size: + text: "512 MB" + seeders: + text: 1 + leechers: + text: 1 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/torrentz2eu.yml b/config/prowlarr/Definitions/torrentz2eu.yml new file mode 100644 index 0000000..342b0a3 --- /dev/null +++ b/config/prowlarr/Definitions/torrentz2eu.yml @@ -0,0 +1,157 @@ +--- +id: torrentz2eu +name: Torrentz2eu +description: "Torrentz2eu is a Public torrent meta-search engine" +language: en-US +type: public +encoding: UTF-8 +requestDelay: 2 +links: + - https://torrentz2beta.in/ +legacylinks: + - https://torrentz2.org.in/ + - https://torrentzeu.org/ + - https://torrentz2.club/ + - https://torrentz2eu.in/ + - https://torrentz2.pics/ + - https://2torrentz2eu.in/ + - https://torrentz2.unblockninja.com/ + - hhttps://torrentz2beta.com/ + - https://torrentz2beta.com/ + - https://eu.torrentz2beta.in/ + - https://www.torrentz2beta.com/ + - https://torrentz2beta.asia/ + - https://www.torrentz2beta.pro/ + - https://torrentz2beta.online/ + +caps: + categorymappings: + - {id: "Applications(Android)", cat: PC/Mobile-Android, desc: "Applications(Android)"} + - {id: "Applications(IOS (iPad/iPhone))", cat: PC/Mobile-iOS, desc: "Applications(IOS (iPad/iPhone))"} + - {id: "Applications(Mac)", cat: PC/Mac, desc: "Applications(Mac)"} + - {id: "Applications(UNIX)", cat: PC/ISO, desc: "Applications(UNIX)"} + - {id: "Applications(Windows)", cat: PC/0day, desc: "Applications(Windows)"} + - {id: "Audio(Audio books)", cat: Audio/Audiobook, desc: "Audio(Audio books)"} + - {id: "Audio(FLAC)", cat: Audio/Lossless, desc: "Audio(FLAC)"} + - {id: "Audio(Music)", cat: Audio/MP3, desc: "Audio(Music)"} + - {id: "Audio(Other)", cat: Audio/Other, desc: "Audio(Other)"} + - {id: "Games(Android)", cat: PC/Mobile-Android, desc: "Games(Android)"} + - {id: "Games(Handheld)", cat: Console/Other, desc: "Games(Handheld)"} + - {id: "Games(Mac)", cat: PC/Mac, desc: "Games(Mac)"} + - {id: "Games(Other)", cat: Console/Other, desc: "Games(Other)"} + - {id: "Games(PC)", cat: PC/Games, desc: "Games(PC)"} + - {id: "Games(PSx)", cat: Console/PS3, desc: "Games(PSx)"} + - {id: "Games(Wii)", cat: Console/Wii, desc: "Games(Wii)"} + - {id: "Games(XBOX360)", cat: Console/XBox 360, desc: "Games(XBOX360)"} + - {id: "Other(Comics)", cat: Books/Comics, desc: "Other(Comics)"} + - {id: "Other(E-books)", cat: Books/EBook, desc: "Other(E-books)"} + - {id: "Other(Other)", cat: Other/Misc, desc: "Other(Other)"} + - {id: "Other(Pictures)", cat: Other, desc: "Other"} + - {id: "Porn(HD - Movies)", cat: XXX/x264, desc: "Porn(HD - Movies)"} + - {id: "Porn(Movie clips)", cat: XXX/WEB-DL, desc: "Porn(Movie clips)"} + - {id: "Porn(Movies)", cat: XXX, desc: "Porn(Movies)"} + - {id: "Porn(Other)", cat: XXX/Other, desc: "Porn(Other)"} + - {id: "Porn(Pictures)", cat: XXX/ImageSet, desc: "Porn(Pictures)"} + - {id: "Video()", cat: Movies, desc: "Movies"} + - {id: "Video(3D)", cat: Movies/3D, desc: "Movies(3D)"} + - {id: "Video(HD - Movies)", cat: Movies/HD, desc: "Movies(HD)"} + - {id: "Video(HD - TV shows)", cat: TV/HD, desc: "TV(HD)"} + - {id: "Video(Movies DVDR)", cat: Movies/DVD, desc: "Movies(DVDR)"} + - {id: "Video(Movies)", cat: Movies, desc: "Movies"} + - {id: "Video(Music videos)", cat: Audio/Video, desc: "Video(Music videos)"} + - {id: "Video(Other)", cat: Other, desc: "Video(Other)"} + - {id: "Video(TV shows)", cat: TV, desc: "TV"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: [] + +search: + paths: + # https://torrentz2beta.in/search.php?q=+ + - path: search.php + - path: search.php + inputs: + page: 2 + inputs: + q: "{{ if .Keywords }}{{ .Keywords }}{{ else }}+{{ end }}" + keywordsfilters: + - name: re_replace + args: ["(\\w+)", "+$1"] # prepend + to each word + + rows: + selector: table.table-responsive > tbody > tr + fields: + title: + selector: td[data-title="Name"] + category_provided: + selector: td[data-title="Category"] + category_is_tv_show: + text: "{{ .Result.title }}" + filters: + - name: regexp + args: "\\b(S\\d+(?:E\\d+)?)\\b" + category: + # some tv have category as video() which can also be movies, so we look for the SxxExx to tag TV + text: "{{ if .Result.category_is_tv_show }}Video(TV shows){{ else }}{{ .Result.category_provided }}{{ end }}" + details: + text: / + download: + selector: a[href^="magnet:?"] + attribute: href + seeders: + text: 1 + leechers: + text: 1 + size: + selector: td[data-title="Description"] + filters: + - name: regexp + args: Size (.+?), + date_year: + # 01-04 2021 + selector: td[data-title="Description"]:not(:contains(":")) + optional: true + filters: + - name: regexp + args: Uploaded (\d{2}-\d{2}.\d{4}) + - name: replace + args: ["\xA0", " "] + - name: dateparse + args: "MM-dd yyyy" + date_time: + # 08-25 20:12 + selector: td[data-title="Description"]:contains(":"):not(:contains("day")) + optional: true + filters: + - name: regexp + args: Uploaded (\d{2}-\d{2}.\d{2}:\d{2}) + - name: replace + args: ["\xA0", " "] + - name: dateparse + args: "MM-dd HH:mm" + date_day: + # Y-day 16:23 + # Today 13:31 + selector: td[data-title="Description"]:contains("day") + optional: true + filters: + - name: regexp + args: Uploaded.(.+?), + - name: replace + args: ["\xA0", " "] + - name: replace + args: ["Y-day", "Yesterday"] + - name: fuzzytime + date: + text: "{{ if or .Result.date_year .Result.date_time .Result.date_day }}{{ or .Result.date_year .Result.date_time .Result.date_day }}{{ else }}now{{ end }}" + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/torrentz2nz.yml b/config/prowlarr/Definitions/torrentz2nz.yml new file mode 100644 index 0000000..c242528 --- /dev/null +++ b/config/prowlarr/Definitions/torrentz2nz.yml @@ -0,0 +1,84 @@ +--- +id: torrentz2nz +name: Torrentz2nz +description: "Torrentz2nz is a Public torrent meta-search engine" +language: en-US +type: public +encoding: UTF-8 +links: + - https://torrentz2.nz/ + - https://torrentz2.mrunblock.bond/ + - https://torrentz2.nocensor.cloud/ +legacylinks: + - https://torrentz2.nocensor.world/ + - https://torrentz2.nocensor.lol/ + - https://torrentz2.nocensor.art/ + - https://torrentz2.mrunblock.guru/ + - https://torrentz2.mrunblock.life/ + - https://torrentz2.nocensor.click/ + +caps: + # unfortunately torrentz2nz does not display categories anywhere in its search results page :-( + categorymappings: + - {id: 1, cat: Movies, desc: "Movies"} + - {id: 2, cat: TV, desc: "TV"} + - {id: 3, cat: Other, desc: "Other"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + +settings: + - name: info_8000 + type: info + label: About Torrentz2nz Categories + default: Torrentz2nz does not return categories in its search results.
    To add to your Apps' Torznab indexer, replace all categories with 8000(Other). + +search: + paths: + - path: search + inputs: + q: "{{ .Keywords }}" + + rows: + selector: dl + + fields: + category: + text: 3 + title: + selector: dt + details: + selector: dt a + attribute: href + magnet: + selector: dd a + attribute: href + date: + selector: dd span:nth-child(2) + filters: + - name: replace + args: ["a ", "1 "] + - name: timeago + size: + selector: dd span:nth-child(3) + seeders: + selector: dd span:nth-child(4) + filters: + - name: re_replace + args: ["(\\d+)\\.(\\d+)K", "$1$200"] + - name: replace + args: ["K", "000"] + leechers: + selector: dd span:nth-child(5) + filters: + - name: re_replace + args: ["(\\d+)\\.(\\d+)K", "$1$200"] + - name: replace + args: ["K", "000"] + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/totallykids.yml b/config/prowlarr/Definitions/totallykids.yml new file mode 100644 index 0000000..6288903 --- /dev/null +++ b/config/prowlarr/Definitions/totallykids.yml @@ -0,0 +1,159 @@ +--- +id: totallykids +name: TotallyKids +description: "TotallyKids (TK) is a Private Torrent Tracker for CHILDRENS MOVIES / TV / GENERAL" +language: en-US +type: private +encoding: UTF-8 +links: + - http://www.totallykids.tv/ # site does not support https NET::ERR_CERT_AUTHORITY_INVALID + +caps: + categorymappings: + - {id: 1, cat: TV, desc: "TV Kids"} + - {id: 24, cat: TV, desc: "TV Teens"} + - {id: 2, cat: TV, desc: "TV Family"} + - {id: 15, cat: TV, desc: "TV Educational"} + - {id: 16, cat: Movies, desc: "Movies Family"} + - {id: 23, cat: Movies, desc: "Movies Teen"} + - {id: 5, cat: Audio, desc: "Music"} + - {id: 6, cat: Audio/Audiobook, desc: "Audiobooks"} + - {id: 4, cat: Books/Comics, desc: "Comics"} + - {id: 7, cat: Books/EBook, desc: "E-Books"} + - {id: 8, cat: PC/Games, desc: "Games"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: info_results + type: info + label: "Search results" + default: "Only the xBtit_Default style is supported with this indexer.
    For best results, increase the torrents number in your profile to 100.
    Default is 15." + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: data + options: + data: created + seeds: seeders + size: size + filename: title + - name: type + type: select + label: Order requested from site + default: DESC + options: + DESC: desc + ASC: asc + +login: + path: index.php?page=login + method: form + form: form[action^="index.php?page=login"] + inputs: + uid: "{{ .Config.username }}" + pwd: "{{ .Config.password }}" + error: + - selector: tr td span[style="color:#FF0000;"] + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + # http://www.totallykids.tv/index.php?page=torrents&search=scooby&category=1;2;5;6;4;7;8;15;24;16;23&options=0&active=0 + - path: index.php + inputs: + page: torrents + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + category: "{{ if .Categories }}{{ range .Categories }}{{.}};{{end}}{{ else }}0{{ end }}" + # 0=title, 1=title&descr, 2=descr + options: "{{ if .Query.IMDBID }}2{{ else }}0{{ end }}" + # 0 all, 1 activeonly, 2 deadonly + active: 0 + order: "{{ .Config.sort }}" + by: "{{ .Config.type }}" + + rows: + selector: "table.lista tr td table.lista tr:has(a[href^=\"index.php?page=torrent-details\"]){{ if .Config.freeleech }}:has(img[src=\"gold/gold.gif\"]){{ else }}{{ end }}" + + fields: + category: + selector: td a[href^="index.php?page=torrents&category="] + attribute: href + filters: + - name: querystring + args: category + title: + selector: td a[href^="index.php?page=torrent-details"] + details: + selector: td a[href^="index.php?page=torrent-details"] + attribute: href + download: + selector: td a[href^="download.php"] + attribute: href + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + poster: + selector: td a[href^="index.php?page=torrent-details"]:not(a[onmouseover*="torrentimg/nocover.jpg"]) + attribute: onmouseover + filters: + - name: regexp + args: src=([^\s]+) + size: + selector: td:nth-child(10) + # two flavours of dates + date_day: + # Yesterday at 10:03:30 PM + selector: td:nth-child(5):contains("day") + # auto adjusted by site account profile + optional: true + filters: + - name: re_replace + args: ["[ ]at|[//\xa0\\s,]+", " "] + date_year: + # February 09, 2019, 06:35:08 AM + selector: td:nth-child(5):not(:contains("day")) + # auto adjusted by site account profile + optional: true + filters: + - name: re_replace + args: ["[//\xa0\\s,]+", " "] + - name: dateparse + args: "MMMM dd yyyy hh:mm:ss tt" + date: + text: "{{ if or .Result.date_day .Result.date_year }}{{ or .Result.date_day .Result.date_year }}{{ else }}now{{ end }}" + seeders: + selector: td:nth-child(6) + leechers: + selector: td:nth-child(7) + grabs: + selector: td:nth-child(8) + downloadvolumefactor: + case: + img[src="gold/gold.gif"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 7 days (as seconds = 7 x 24 x 60 x 60) + text: 604800 +# xbtit diff --git a/config/prowlarr/Definitions/totheglory.yml b/config/prowlarr/Definitions/totheglory.yml new file mode 100644 index 0000000..3be2da3 --- /dev/null +++ b/config/prowlarr/Definitions/totheglory.yml @@ -0,0 +1,230 @@ +--- +id: totheglory +name: ToTheGlory +description: "ToTheGlory (TTG) A Chinese tracker" +language: zh-CN +type: private +encoding: UTF-8 +requestDelay: 2 +links: + - https://totheglory.im/ + +caps: + categories: + # 电影 Movie + 电影DVDRip: Movies/SD # Movie DVDRip + 电影720p: Movies/HD # Movie 720p + 电影1080i/p: Movies/HD # Movie 1080i / p + BluRay原盘: Movies/BluRay # BluRay original disc + 影视2160p: Movies/UHD # Media - 2160p + UHD原盘: Movies/UHD # Blu-ray UHD + # 纪录片 Docs + 纪录片720p: Movies/HD # Documentary 720p + 纪录片1080i/p: Movies/HD # Documentary 1080i / p + 纪录片BluRay原盘: Movies/BluRay # Documentary BluRay Original + # 剧集 TV + 欧美剧720p: TV/HD # TV Series - EU/US - 720p + 欧美剧1080i/p: TV/HD # TV Series - EU/US - 1080i/p + 高清日剧: TV/HD # TV Series - JP + 大陆港台剧1080i/p: TV/HD # TV Series - CN - 1080i/p + 大陆港台剧720p: TV/HD # TV Series - CN - 720p + 高清韩剧: TV/HD # TV Series - KR + # 剧集包 TV Packs + 欧美剧包: TV/HD # TV Packs - EU/US + 日剧包: TV/HD # TV Packs - JP + 韩剧包: TV/HD # TV Packs - CN + 华语剧包: TV/HD # TV Packs - KR + # 音乐 Audio + (电影原声&Game)OST: Audio # OST - (Movie & Game) Track + 无损音乐FLAC&APE: Audio/Lossless # FLAC & APE + MV&演唱会: Audio/Video # MV & Concert + # 其他 Other + 高清体育节目: TV/Sport # HD Sports + 高清动漫: TV/Anime # HD Animation + 韩国综艺: TV/HD # TV Shows - KR + 高清综艺: TV/HD # TV Shows + 日本综艺: TV/HD # TV Shows - JP + MiniVideo: Other # MiniVideo + 补充音轨: Audio # Supplemental audio tracks + iPhone/iPad视频: PC/Mobile-Other # IPhone / iPad video + # 单机游戏 + PC: PC/Games # Games - PC + MAC: PC/Mac # Games - MAC + # 微软系列 + XBOX360: Console/XBox 360 # MicroSoft - XBOX360 + XBOX1: Console/XBox # MicroSoft - XBOX360 + XBLA: Console/XBox # MicroSoft - XBLA + XBOX+to+XBOX360: Console/XBox # MicroSoft - XBOX to XBOX360 + # 索尼系列 + PS2: Console/Other # SONY - PS2 + PSP: Console/PSP # SONY - PSP + PS4: Console/PS4 # SONY - PS4 + PS3: Console/PS3 # SONY - PS3 + PSV: Console/PS Vita # SONY - PSV + # 任天堂系列 + WIIU: Console/WiiU # Nintendo - WIIU + WII: Console/Wii # Nintendo- WII + SWITCH: Console/Other # Nintendo - SWITCH + NDS: Console/NDS # Nintendo - NDS + NGC: Console/Other # Nintendo - NGC + # 主机影视 + PS3兼容高清: Console/PS3 # Video - HD - PS3 + PSP兼容高清&标清: Console/PSP # Video - SD&HD - PSP + XBOX360兼容高清: Console/XBox 360 # Video - HD - XBOX360 + Game+Video: Console/Other # Video - Game Video + # 软件 + APPZ: PC # Software - APPZ + Game+Ebook: Books/EBook # Software - Game Ebook + Ebook: Books/EBook # Software - Ebook + # 苹果系列 + iPhone/iPad游戏: PC/Mobile-iOS # Apple - Game - iPhone/iPad + iPad书籍: Books/EBook # Apple - Book - iPad + iPhone/iPad软件: PC/Mobile-iOS # Apple - Software - iPhone/iPad + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: 2facode + type: text + label: 2FA code + - name: info_2fa + type: info + label: "About 2FA code" + default: "Only fill in the 2FA code box if you have enabled 2FA on the TTG Web Site. Otherwise just leave it empty." + - name: passid + type: select + label: Security Question ID + default: 0 + options: + 0: Security question (Ignore not set) + 1: When did your start using PT? + 2: How did you get to know about TTG? + 3: What's the name of the first movie you watched in a cinema? + 4: What's your favorite movie? + 5: Who's your favorite porn star? + 6: Who's your favorite actor/actress? + 7: What's your most anticipated movie? + - name: info_passid + type: info + label: "About Security ID" + default: "Only select the Security Question ID from the pulldown if you have set it on the TTG Web Site. Otherwise just leave it as ignore not set." + - name: passan + type: text + label: Security Question Answer + - name: info_passan + type: info + label: "About Security Question Answer" + default: "Only fill in the Security Question Answer box if you have set it on the TTG Web Site. Dont forget to write your answer in the same language you saved it on the TTG Web Site. Otherwise just leave it empty." + +login: + path: login.php?returnto= + method: form + form: form[action="takelogin.php"] + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + rememberme: yes + otp: "{{ .Config.2facode }}" + passid: "{{ .Config.passid }}" + passan: "{{ .Config.passan }}" + error: + - selector: td.embedded:has(h2:contains("!")) # Chinese, Japanese + - selector: td.embedded:has(h2:contains("!")) # English, Korean + test: + path: my.php + selector: a[href*="logout.php"] + +search: + paths: + - path: browse.php + inputs: + c: M + - path: browse.php + categories: [1000, 1010, 1020, 1030, 1040, 1050, 1060, 1070, 1080, 1090, 1100, 1110, 1120, 1130, 1140, 1150, 1160, 1170, 1180, 4000, 4010, 4020, 4030, 4040, 4050, 4060, 4070, 7000, 7010, 7020, 7030, 7040, 7050, 7060] + inputs: + c: G + inputs: + search_field: "{{ range .Categories }}分类:`{{.}}` {{end}}{{ if .Query.IMDBID }}imdb{{ .Query.IMDBIDShort }}{{ else }}{{ .Keywords }}{{ end }}" + rows: + selector: table#torrent_table > tbody > tr[id] + + fields: + description: + selector: div.name_left > a > b + title: + selector: div.name_left > a > b + remove: span + category: + selector: tr[id] td:nth-child(1) > a + attribute: href + filters: + - name: querystring + args: search_field + - name: replace + args: ["category:", ""] + - name: trim + args: "\"" + details: + selector: div.name_left > a + attribute: href + download: + selector: a.dl_a + attribute: href + files: + selector: td:nth-child(3) + size: + selector: td:nth-child(7) + seeders: + selector: td:nth-child(9) + filters: + - name: split + args: ["/", 0] + leechers: + selector: td:nth-child(9) + filters: + - name: split + args: ["/", 1] + - name: replace + args: ["\n", ""] + grabs: + selector: td:nth-child(8) + date: + selector: td:nth-child(5) + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + imdbid: + selector: span.imdb_rate > a + attribute: href + downloadvolumefactor: + case: + img[alt="free"]: 0 + img[alt="50%"]: 0.5 + img[alt="30%"]: 0.3 + "*": 1 + uploadvolumefactor: + case: + img[alt="200%"]: 2 + "*": 1 + minimumratio: + case: + img[title="Hit and Run"]: 1 + "*": 0 + minimumseedtime: + case: + img[title="Hit and Run"]: 216000 + "*": 0 +# engine n/a diff --git a/config/prowlarr/Definitions/totheglorycookie.yml b/config/prowlarr/Definitions/totheglorycookie.yml new file mode 100644 index 0000000..1de4285 --- /dev/null +++ b/config/prowlarr/Definitions/totheglorycookie.yml @@ -0,0 +1,190 @@ +--- +id: totheglorycookie +name: ToTheGloryCookie +description: "ToTheGlory (TTG) A Chinese tracker. This uses the cookie method for access" +language: zh-CN +type: private +encoding: UTF-8 +requestDelay: 2 +links: + - https://totheglory.im/ + +caps: + categories: + # 电影 Movie + 电影DVDRip: Movies/SD # Movie DVDRip + 电影720p: Movies/HD # Movie 720p + 电影1080i/p: Movies/HD # Movie 1080i / p + BluRay原盘: Movies/BluRay # BluRay original disc + 影视2160p: Movies/UHD # Media - 2160p + UHD原盘: Movies/UHD # Blu-ray UHD + # 纪录片 Docs + 纪录片720p: Movies/HD # Documentary 720p + 纪录片1080i/p: Movies/HD # Documentary 1080i / p + 纪录片BluRay原盘: Movies/BluRay # Documentary BluRay Original + # 剧集 TV + 欧美剧720p: TV/HD # TV Series - EU/US - 720p + 欧美剧1080i/p: TV/HD # TV Series - EU/US - 1080i/p + 高清日剧: TV/HD # TV Series - JP + 大陆港台剧1080i/p: TV/HD # TV Series - CN - 1080i/p + 大陆港台剧720p: TV/HD # TV Series - CN - 720p + 高清韩剧: TV/HD # TV Series - KR + # 剧集包 TV Packs + 欧美剧包: TV/HD # TV Packs - EU/US + 日剧包: TV/HD # TV Packs - JP + 韩剧包: TV/HD # TV Packs - CN + 华语剧包: TV/HD # TV Packs - KR + # 音乐 Audio + (电影原声&Game)OST: Audio # OST - (Movie & Game) Track + 无损音乐FLAC&APE: Audio/Lossless # FLAC & APE + MV&演唱会: Audio/Video # MV & Concert + # 其他 Other + 高清体育节目: TV/Sport # HD Sports + 高清动漫: TV/Anime # HD Animation + 韩国综艺: TV/HD # TV Shows - KR + 高清综艺: TV/HD # TV Shows + 日本综艺: TV/HD # TV Shows - JP + MiniVideo: Other # MiniVideo + 补充音轨: Audio # Supplemental audio tracks + iPhone/iPad视频: PC/Mobile-Other # IPhone / iPad video + # 单机游戏 + PC: PC/Games # Games - PC + MAC: PC/Mac # Games - MAC + # 微软系列 + XBOX360: Console/XBox 360 # MicroSoft - XBOX360 + XBOX1: Console/XBox # MicroSoft - XBOX360 + XBLA: Console/XBox # MicroSoft - XBLA + XBOX+to+XBOX360: Console/XBox # MicroSoft - XBOX to XBOX360 + # 索尼系列 + PS2: Console/Other # SONY - PS2 + PSP: Console/PSP # SONY - PSP + PS4: Console/PS4 # SONY - PS4 + PS3: Console/PS3 # SONY - PS3 + PSV: Console/PS Vita # SONY - PSV + # 任天堂系列 + WIIU: Console/WiiU # Nintendo - WIIU + WII: Console/Wii # Nintendo- WII + SWITCH: Console/Other # Nintendo - SWITCH + NDS: Console/NDS # Nintendo - NDS + NGC: Console/Other # Nintendo - NGC + # 主机影视 + PS3兼容高清: Console/PS3 # Video - HD - PS3 + PSP兼容高清&标清: Console/PSP # Video - SD&HD - PSP + XBOX360兼容高清: Console/XBox 360 # Video - HD - XBOX360 + Game+Video: Console/Other # Video - Game Video + # 软件 + APPZ: PC # Software - APPZ + Game+Ebook: Books/EBook # Software - Game Ebook + Ebook: Books/EBook # Software - Ebook + # 苹果系列 + iPhone/iPad游戏: PC/Mobile-iOS # Apple - Game - iPhone/iPad + iPad书籍: Books/EBook # Apple - Book - iPad + iPhone/iPad软件: PC/Mobile-iOS # Apple - Software - iPhone/iPad + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
    1. Login to this tracker with your browser
    2. Open the DevTools panel by pressing F12
    3. Select the Network tab
    4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
    5. Refresh the page by pressing F5
    6. Click on the first row entry
    7. Select the Headers tab on the Right panel
    8. Find 'cookie:' in the Request Headers section
    9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
    " + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: my.php + selector: a[href*="logout.php"] + +search: + paths: + - path: browse.php + inputs: + c: M + - path: browse.php + categories: [1000, 1010, 1020, 1030, 1040, 1050, 1060, 1070, 1080, 1090, 1100, 1110, 1120, 1130, 1140, 1150, 1160, 1170, 1180, 4000, 4010, 4020, 4030, 4040, 4050, 4060, 4070, 7000, 7010, 7020, 7030, 7040, 7050, 7060] + inputs: + c: G + inputs: + search_field: "{{ range .Categories }}分类:`{{.}}` {{end}}{{ if .Query.IMDBID }}imdb{{ .Query.IMDBIDShort }}{{ else }}{{ .Keywords }}{{ end }}" + rows: + selector: table#torrent_table > tbody > tr[id] + + fields: + description: + selector: div.name_left > a > b + title: + selector: div.name_left > a > b + remove: span + category: + selector: tr[id] td:nth-child(1) > a + attribute: href + filters: + - name: querystring + args: search_field + - name: replace + args: ["category:", ""] + - name: trim + args: "\"" + details: + selector: div.name_left > a + attribute: href + download: + selector: a.dl_a + attribute: href + files: + selector: td:nth-child(3) + size: + selector: td:nth-child(7) + seeders: + selector: td:nth-child(9) + filters: + - name: split + args: ["/", 0] + leechers: + selector: td:nth-child(9) + filters: + - name: split + args: ["/", 1] + - name: replace + args: ["\n", ""] + grabs: + selector: td:nth-child(8) + date: + selector: td:nth-child(5) + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + imdbid: + selector: span.imdb_rate > a + attribute: href + downloadvolumefactor: + case: + img[alt="free"]: 0 + img[alt="50%"]: 0.5 + img[alt="30%"]: 0.3 + "*": 1 + uploadvolumefactor: + case: + img[alt="200%"]: 2 + "*": 1 + minimumratio: + case: + img[title="Hit and Run"]: 1 + "*": 0 + minimumseedtime: + case: + img[title="Hit and Run"]: 216000 + "*": 0 +# engine n/a diff --git a/config/prowlarr/Definitions/trackermk.yml b/config/prowlarr/Definitions/trackermk.yml new file mode 100644 index 0000000..d20c017 --- /dev/null +++ b/config/prowlarr/Definitions/trackermk.yml @@ -0,0 +1,155 @@ +--- +id: trackermk +name: TrackerMK +description: "TrackerMK is a MACEDONIAN Private Torrent Tracker for MOVIES / TV / GENERAL" +language: mk-MK +type: private +encoding: UTF-8 +links: + - http://trackermk.com/ # does not support https, CA expired December 2017 + +caps: + categorymappings: + - {id: 49, cat: Movies/DVD, desc: "Movies DVD-R"} + - {id: 68, cat: PC/Mobile-Android, desc: "Андроид (Android)"} + - {id: 72, cat: PC/Mobile-Android, desc: "Андроид - Апликации (Android)"} + - {id: 47, cat: PC, desc: "Апликации (Software)"} + - {id: 71, cat: PC/Mac, desc: "Апликации - Mac OS"} + - {id: 70, cat: PC/0day, desc: "Апликации - Window 7/8.1/10/11"} + - {id: 63, cat: Audio/Audiobook, desc: "Аудио (Audiobooks)"} + - {id: 60, cat: TV/Documentary, desc: "Документарци (Documentaries)"} + - {id: 61, cat: TV, desc: "Домашни серии (TV Local)"} + - {id: 69, cat: TV, desc: "Домашни серии - Српски / Хрватски / Босански (TV Local)"} + - {id: 57, cat: Books/EBook, desc: "Е-Книги (EBooks)"} + - {id: 53, cat: Console, desc: "Игри (Games)"} + - {id: 54, cat: Audio/Video, desc: "Концерти (Concerts)"} + - {id: 52, cat: Audio/Video, desc: "Музички Спотови (Music Videos)"} + - {id: 67, cat: Other, desc: "Од се по нешто (VIP)"} + - {id: 73, cat: Audio, desc: "Рип од Плоча (Music Rips)"} + - {id: 65, cat: Other, desc: "Слики (pictures)"} + - {id: 55, cat: TV/Sport, desc: "Спорт (sport)"} + - {id: 48, cat: TV/Anime, desc: "Цртани (Animations)"} + - {id: 64, cat: Audio/Lossless, desc: "FLAC"} + - {id: 62, cat: Movies/HD, desc: "Movies HDTV"} + - {id: 50, cat: Audio/MP3, desc: "Mp3"} + - {id: 56, cat: Movies/SD, desc: "Movies Xvid"} + - {id: 59, cat: XXX, desc: "XXX"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + logout: "" + error: + - selector: table:contains("Грешка!") + test: + path: index.php + selector: a[href*="/logout.php?logouthash="] + +search: + paths: + - path: browse.php + keywordsfilters: + - name: re_replace + args: ["[\\s]+", "%"] + inputs: + do: search + keywords: "{{ .Keywords }}" + # t_name, t_description, t_both, t_uploader, t_genre + search_type: t_name + # does not support multi category searching so defaulting to all. + category: 0 + include_dead_torrents: yes + sort: "{{ if .Config.freeleech }}free{{ else }}{{ .Config.sort }}{{ end }}" + order: "{{ if .Config.freeleech }}asc{{ else }}{{ .Config.type }}{{ end }}" + # does not return imdb link in results and t_genre does not return imdbid search results + + rows: + selector: "table.sortable tr:has(a[href*=\"/download.php?id=\"]){{ if .Config.freeleech }}:has(img[src$=\"/freedownload.gif\"]){{ else }}{{ end }}" + + fields: + category: + selector: a[href*="/browse.php?category="] + attribute: href + filters: + - name: querystring + args: category + title: + selector: a[href*="/details.php?id="] + details: + selector: a[href*="/details.php?id="] + attribute: href + download: + selector: a[href*="/download.php?id="] + attribute: href + poster: + selector: img[src*="/torrents/images/"] + attribute: src + date: + selector: td:nth-child(2) + # auto adjusted by site account profile + filters: + - name: regexp + args: "(\\d{2}-\\d{2}-\\d{4} \\d{2}:\\d{2})" + - name: dateparse + args: "dd-MM-yyyy HH:mm" + size: + selector: td:nth-last-child(5) + grabs: + selector: td:nth-last-child(4) + seeders: + selector: td:nth-last-child(3) + leechers: + selector: td:nth-last-child(2) + downloadvolumefactor: + case: + img[src$="/freedownload.gif"]: 0 + img[src$="/silverdownload.gif"]: 0.5 + "*": 1 + uploadvolumefactor: + case: + img[src$="/x2.gif"]: 2 + "*": 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 24 hours (as seconds = 24 x 60 x 60) + text: 86400 +# TS Special Edition v.7.2 diff --git a/config/prowlarr/Definitions/traht.yml b/config/prowlarr/Definitions/traht.yml new file mode 100644 index 0000000..2381ba8 --- /dev/null +++ b/config/prowlarr/Definitions/traht.yml @@ -0,0 +1,68 @@ +--- +id: traht +name: TrahT +description: "TrahT is a RUSSIAN Public Torrent Tracker for 3X" +language: ru-RU +type: public +encoding: windows-1251 +links: + - http://traht.org/ + +caps: + categories: + xxx: XXX + + modes: + search: [q] + +settings: [] + +search: + paths: + # http://traht.org/browse.php?search=&cat=0&year=0&format=0 + - path: browse.php + inputs: + search: "{{ .Keywords }}" + cat: 0 + year: 0 + format: 0 + + rows: + selector: div[id^="releases-table"] table.embedded tbody tr:has(a[href^="download.php?id="]) + + fields: + category: + text: xxx + title: + selector: a[href^="details.php?id="] + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + filters: + - name: append + args: "&ok=" + date: + text: now + size: + selector: td:nth-child(5) + seeders: + selector: td:nth-child(6) + filters: + - name: split + args: ["|", 0] + leechers: + selector: td:nth-child(6) + filters: + - name: split + args: ["|", 1] + description: + selector: img + attribute: title + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# Kinokpk 3.00 diff --git a/config/prowlarr/Definitions/trancetraffic.yml b/config/prowlarr/Definitions/trancetraffic.yml new file mode 100644 index 0000000..27b06fc --- /dev/null +++ b/config/prowlarr/Definitions/trancetraffic.yml @@ -0,0 +1,93 @@ +--- +id: trancetraffic +name: TranceTraffic +description: "TranceTraffic is a Private site for MUSIC" +language: en-US +type: private +encoding: UTF-8 +links: + - https://www.trancetraffic.com/ + +caps: + categories: + 1: Audio + + modes: + search: [q] + music-search: [q, artist] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: td.embedded:has(h2:contains("failed")) + test: + path: index.php + selector: a[href*="logout.php"] + +search: + paths: + - path: browse.php + inputs: + search: "{{ if .Query.Artist }}{{ .Query.Artist }}{{ else }}{{ .Keywords }}{{ end }}" + includeFL: "{{ if .Config.freeleech }}on{{ else }}{{ end }}" + + rows: + selector: table.mainouter table > tbody > tr:has(a[href^="details.php?id="]) + + fields: + category: + text: 1 + download: + selector: a[href^="download.php/"] + attribute: href + title: + selector: a[href^="details.php?id="] + details: + selector: a[href^="details.php?id="] + attribute: href + filters: + - name: replace + args: ["&hit=1", ""] # avoid redirect + date: + selector: td:nth-child(6) + # auto adjusted by site account profile + filters: + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss" + seeders: + selector: td:nth-child(9) + leechers: + selector: td:nth-child(10) + grabs: + selector: td:nth-child(8) + files: + selector: td:nth-child(4) + size: + selector: td:nth-child(7) + downloadvolumefactor: + case: + "span:contains(\"FREELEECH\")": 0 + "*": 1 + uploadvolumefactor: + text: 1 +# engine tbd diff --git a/config/prowlarr/Definitions/trezzor.yml b/config/prowlarr/Definitions/trezzor.yml new file mode 100644 index 0000000..5a35920 --- /dev/null +++ b/config/prowlarr/Definitions/trezzor.yml @@ -0,0 +1,187 @@ +--- +id: trezzor +name: TreZzoR +description: "TreZzoR is a CZECH Private site for TV / MOVIES / GENERAL" +language: cs-CZ +type: private +encoding: windows-1250 +links: + - https://tracker.czech-server.com/ + +caps: + categorymappings: + - {id: 31, cat: Movies/HD, desc: "HD CZ/SK Dabing"} + - {id: 33, cat: Movies/HD, desc: "HD CZ/SK Titulky"} + - {id: 41, cat: TV/HD, desc: "HD Seriály CZ/SK dabing"} + - {id: 42, cat: TV/HD, desc: "HD Seriály CZ/SK titulky"} + - {id: 1, cat: Movies/BluRay, desc: "Full disc CZ/SK dabing"} + - {id: 2, cat: Movies/BluRay, desc: "Full disc CZ/SK titulky"} + - {id: 4, cat: Movies/SD, desc: "SD CZ/SK dabing"} + - {id: 36, cat: Movies/SD, desc: "SD CZ/SK titulky"} + - {id: 7, cat: TV/SD, desc: "Seriály CZ/SK dabing"} + - {id: 37, cat: TV/SD, desc: "Seriály CZ/SK titulky"} + - {id: 35, cat: Audio/Video, desc: "Hudebni video"} + - {id: 32, cat: XXX, desc: "XXX CZ/SK"} + - {id: 13, cat: Audio, desc: "Hudba"} + - {id: 24, cat: Audio/Audiobook, desc: "Mluv. slovo CZ/SK dabing"} + - {id: 14, cat: PC/Games, desc: "Hry"} + - {id: 17, cat: PC/0day, desc: "Programy"} + - {id: 15, cat: PC/Games, desc: "Cestiny,patche,upgrady"} + - {id: 18, cat: Books, desc: "Knihy CZ/SK lokalizace"} + - {id: 19, cat: Books/Comics, desc: "Komiks CZ/SK lokalizace"} + - {id: 16, cat: Other, desc: "Foto,obrázky"} + - {id: 21, cat: PC/Mobile-Android, desc: "Mobilmánia"} + - {id: 20, cat: Console, desc: "Konzole"} + - {id: 22, cat: Other, desc: "Ostatní CZ/SK scéna"} + - {id: 23, cat: Other, desc: "Na prani non CZ/SK"} + + modes: + search: [q] + tv-search: [q, season, ep, year] + movie-search: [q, year] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Filter FreeLeech only + default: false + - name: sort + type: select + label: Sort requested from site + default: data + options: + data: created + seeds: seeders + size: size + filename: title + - name: type + type: select + label: Order requested from site + default: DESC + options: + DESC: desc + ASC: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrentu na strance: setting to 100 on your account profile. + - name: info_xxx + type: info + label: XXX Results + default: To include XXX in results, click Kategoria XXX sa nezobrazuje!!!. povolit zobrazenie on the tracker search page. + +login: + path: prihlasenie.php + method: post + inputs: + uid: "{{ .Config.username }}" + pwd: "{{ .Config.password }}" + error: + - selector: div > font:has(a[href="neregpodp.php"]) + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + search: "{{ .Keywords }}" + category: 0 + # 0 all, 1 active, 2 dead + active: 0 + rok: "{{ .Query.Year }}" + # can search for genre but you need to know the id. &genres=57466 for Akční + + keywordsfilters: + - name: re_replace + args: ["(?i)S(\\d{2})E(\\d{2})", "$1 $2"] + + rows: + selector: "tr.torrenty_lista{{ if .Config.freeleech }}:has(a[href^=\"details.php?slug=\"] b span[style=\"color:darkmagenta\"]){{ else }}{{ end }}" + + fields: + category: + selector: a[href^="torrents.php?onlycat="] + attribute: href + filters: + - name: querystring + args: onlycat + title: + selector: a[href^="details.php?slug="] + attribute: title + filters: + - name: re_replace + args: ["(?i)^(Zobrazit detaily|View details|Detaily): ", ""] + - name: re_replace + args: ["(?i)[\\s\\->]*FREELEECH.*", ""] + - name: re_replace + args: [".*?/ ", ""] + - name: re_replace + args: ["(?i)\\b(\\d{1,3})x(\\d{1,3})\\b", "S$1E$2"] + - name: re_replace + args: ["(?i)\\b(?:Sezona|Series?|Seria|Season)[\\s\\.]*(\\d{1,3}(?:-\\d+)?)[\\.,\\s]*Epizoda[\\s\\.]*(\\d+(?:-\\d+)?)\\b", "S$1E$2"] + - name: re_replace + args: ["(?i)\\b(\\d{1,3}(?:-\\d+)?)[\\s\\.]*(?:Sezona|Series?|Seria|Season)[\\.,\\s]*(\\d+(?:-\\d+)?)[\\s\\.]*Epizoda\\b", "S$1E$2"] + - name: re_replace + args: ["(?i)\\b(?:Sezona|Series?|Seria|Season)[\\s\\.]*(\\d{1,3}(?:-\\d+)?)[\\.,\\s]+(\\d+(?:-\\d+)?)[\\s\\.]*Epizoda\\b", "S$1E$2"] + - name: re_replace + args: ["(?i)\\b(?:Sezona|Series?|Seria|Season)[\\s\\.]*(\\d{1,3})[-\\+\\.,\\s]+(\\d+)\\b", "S$1-$2"] + - name: re_replace + args: ["(?i)\\b(\\d{1,3})[-\\+\\.\\s]+(\\d+)[\\s\\.]*(?:Sezona|Series?|Seria|Season)\\b", "S$1-$2"] + - name: re_replace + args: ["(?i)\\b(?:Sezona|Series?|Seria|Season)[\\s\\.]*(\\d{1,3}(?:-\\d+)?)\\b", "S$1"] + - name: re_replace + args: ["(?i)\\b(\\d{1,3}(?:-\\d+)?)[\\s\\.]*(?:Sezona|Series?|Seria|Season)\\b", "S$1"] + - name: re_replace + args: ["(?i)\\bEpizoda[\\s\\.]*(\\d+)[-\\+\\.,\\s]+(\\d+)\\b", "E$1-$2"] + - name: re_replace + args: ["(?i)\\b(\\d+)[-\\+\\.,\\s]+(\\d+)[\\s\\.]*Epizoda\\b", "E$1-$2"] + - name: re_replace + args: ["(?i)\\bEpizoda[\\s\\.]*(\\d+(?:-\\d+)?)\\b", "E$1"] + - name: re_replace + args: ["(?i)\\b(\\d+(?:-\\d+)?)[\\s\\.]*Epizoda\\b", "E$1"] + details: + selector: a[href^="details.php?slug="] + attribute: href + download: + selector: a[href^="download.php?slug="] + attribute: href + date: + selector: td:nth-child(6) + filters: + - name: append + args: " +02:00" # EET + - name: dateparse + args: "d/M/yyyy HH:mm zzz" + size: + selector: td:nth-child(7) + seeders: + selector: td:nth-child(8) a + leechers: + selector: td:nth-child(9) a + grabs: + selector: td:nth-child(10) + downloadvolumefactor: + case: + a[href^="details.php?slug="] b span[style="color:darkmagenta"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + description: + selector: a[href^="details.php?slug="] + attribute: title + filters: + - name: re_replace + args: ["(?i)^(Zobrazit detaily|View details|Detaily): ", ""] + - name: re_replace + args: ["(?i)[\\s\\->]*FREELEECH.*", ""] +# engine tbd diff --git a/config/prowlarr/Definitions/trezzorcookie.yml b/config/prowlarr/Definitions/trezzorcookie.yml new file mode 100644 index 0000000..91ac435 --- /dev/null +++ b/config/prowlarr/Definitions/trezzorcookie.yml @@ -0,0 +1,184 @@ +--- +id: trezzorcookie +name: TreZzoRCookie +description: "TreZzoR is a CZECH Private site for TV / MOVIES / GENERAL. This uses the cookie method for access" +language: cs-CZ +type: private +encoding: windows-1250 +links: + - https://tracker.czech-server.com/ + +caps: + categorymappings: + - {id: 31, cat: Movies/HD, desc: "HD CZ/SK Dabing"} + - {id: 33, cat: Movies/HD, desc: "HD CZ/SK Titulky"} + - {id: 41, cat: TV/HD, desc: "HD Seriály CZ/SK dabing"} + - {id: 42, cat: TV/HD, desc: "HD Seriály CZ/SK titulky"} + - {id: 1, cat: Movies/BluRay, desc: "Full disc CZ/SK dabing"} + - {id: 2, cat: Movies/BluRay, desc: "Full disc CZ/SK titulky"} + - {id: 4, cat: Movies/SD, desc: "SD CZ/SK dabing"} + - {id: 36, cat: Movies/SD, desc: "SD CZ/SK titulky"} + - {id: 7, cat: TV/SD, desc: "Seriály CZ/SK dabing"} + - {id: 37, cat: TV/SD, desc: "Seriály CZ/SK titulky"} + - {id: 35, cat: Audio/Video, desc: "Hudebni video"} + - {id: 32, cat: XXX, desc: "XXX CZ/SK"} + - {id: 13, cat: Audio, desc: "Hudba"} + - {id: 24, cat: Audio/Audiobook, desc: "Mluv. slovo CZ/SK dabing"} + - {id: 14, cat: PC/Games, desc: "Hry"} + - {id: 17, cat: PC/0day, desc: "Programy"} + - {id: 15, cat: PC/Games, desc: "Cestiny,patche,upgrady"} + - {id: 18, cat: Books, desc: "Knihy CZ/SK lokalizace"} + - {id: 19, cat: Books/Comics, desc: "Komiks CZ/SK lokalizace"} + - {id: 16, cat: Other, desc: "Foto,obrázky"} + - {id: 21, cat: PC/Mobile-Android, desc: "Mobilmánia"} + - {id: 20, cat: Console, desc: "Konzole"} + - {id: 22, cat: Other, desc: "Ostatní CZ/SK scéna"} + - {id: 23, cat: Other, desc: "Na prani non CZ/SK"} + + modes: + search: [q] + tv-search: [q, season, ep, year] + movie-search: [q, year] + music-search: [q] + book-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
    1. Login to this tracker with your browser
    2. Open the DevTools panel by pressing F12
    3. Select the Network tab
    4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
    5. Refresh the page by pressing F5
    6. Click on the first row entry
    7. Select the Headers tab on the Right panel
    8. Find 'cookie:' in the Request Headers section
    9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
    " + - name: freeleech + type: checkbox + label: Filter FreeLeech only + default: false + - name: sort + type: select + label: Sort requested from site + default: data + options: + data: created + seeds: seeders + size: size + filename: title + - name: type + type: select + label: Order requested from site + default: DESC + options: + DESC: desc + ASC: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrentu na strance: setting to 100 on your account profile. + - name: info_xxx + type: info + label: XXX Results + default: To include XXX in results, click Kategoria XXX sa nezobrazuje!!!. povolit zobrazenie on the tracker search page. + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + search: "{{ .Keywords }}" + category: 0 + # 0 all, 1 active, 2 dead + active: 0 + rok: "{{ .Query.Year }}" + # can search for genre but you need to know the id. &genres=57466 for Akční + + keywordsfilters: + - name: re_replace + args: ["(?i)S(\\d{2})E(\\d{2})", "$1 $2"] + + rows: + selector: "tr.torrenty_lista{{ if .Config.freeleech }}:has(a[href^=\"details.php?slug=\"] b span[style=\"color:darkmagenta\"]){{ else }}{{ end }}" + + fields: + category: + selector: a[href^="torrents.php?onlycat="] + attribute: href + filters: + - name: querystring + args: onlycat + title: + selector: a[href^="details.php?slug="] + attribute: title + filters: + - name: re_replace + args: ["(?i)^(Zobrazit detaily|View details|Detaily): ", ""] + - name: re_replace + args: ["(?i)[\\s\\->]*FREELEECH.*", ""] + - name: re_replace + args: [".*?/ ", ""] + - name: re_replace + args: ["(?i)\\b(\\d{1,3})x(\\d{1,3})\\b", "S$1E$2"] + - name: re_replace + args: ["(?i)\\b(?:Sezona|Series?|Seria|Season)[\\s\\.]*(\\d{1,3}(?:-\\d+)?)[\\.,\\s]*Epizoda[\\s\\.]*(\\d+(?:-\\d+)?)\\b", "S$1E$2"] + - name: re_replace + args: ["(?i)\\b(\\d{1,3}(?:-\\d+)?)[\\s\\.]*(?:Sezona|Series?|Seria|Season)[\\.,\\s]*(\\d+(?:-\\d+)?)[\\s\\.]*Epizoda\\b", "S$1E$2"] + - name: re_replace + args: ["(?i)\\b(?:Sezona|Series?|Seria|Season)[\\s\\.]*(\\d{1,3}(?:-\\d+)?)[\\.,\\s]+(\\d+(?:-\\d+)?)[\\s\\.]*Epizoda\\b", "S$1E$2"] + - name: re_replace + args: ["(?i)\\b(?:Sezona|Series?|Seria|Season)[\\s\\.]*(\\d{1,3})[-\\+\\.,\\s]+(\\d+)\\b", "S$1-$2"] + - name: re_replace + args: ["(?i)\\b(\\d{1,3})[-\\+\\.\\s]+(\\d+)[\\s\\.]*(?:Sezona|Series?|Seria|Season)\\b", "S$1-$2"] + - name: re_replace + args: ["(?i)\\b(?:Sezona|Series?|Seria|Season)[\\s\\.]*(\\d{1,3}(?:-\\d+)?)\\b", "S$1"] + - name: re_replace + args: ["(?i)\\b(\\d{1,3}(?:-\\d+)?)[\\s\\.]*(?:Sezona|Series?|Seria|Season)\\b", "S$1"] + - name: re_replace + args: ["(?i)\\bEpizoda[\\s\\.]*(\\d+)[-\\+\\.,\\s]+(\\d+)\\b", "E$1-$2"] + - name: re_replace + args: ["(?i)\\b(\\d+)[-\\+\\.,\\s]+(\\d+)[\\s\\.]*Epizoda\\b", "E$1-$2"] + - name: re_replace + args: ["(?i)\\bEpizoda[\\s\\.]*(\\d+(?:-\\d+)?)\\b", "E$1"] + - name: re_replace + args: ["(?i)\\b(\\d+(?:-\\d+)?)[\\s\\.]*Epizoda\\b", "E$1"] + details: + selector: a[href^="details.php?slug="] + attribute: href + download: + selector: a[href^="download.php?slug="] + attribute: href + date: + selector: td:nth-child(6) + filters: + - name: append + args: " +02:00" # EET + - name: dateparse + args: "d/M/yyyy HH:mm zzz" + size: + selector: td:nth-child(7) + seeders: + selector: td:nth-child(8) a + leechers: + selector: td:nth-child(9) a + grabs: + selector: td:nth-child(10) + downloadvolumefactor: + case: + a[href^="details.php?slug="] b span[style="color:darkmagenta"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + description: + selector: a[href^="details.php?slug="] + attribute: title + filters: + - name: re_replace + args: ["(?i)^(Zobrazit detaily|View details|Detaily): ", ""] + - name: re_replace + args: ["(?i)[\\s\\->]*FREELEECH.*", ""] +# engine tbd diff --git a/config/prowlarr/Definitions/tribalmixes.yml b/config/prowlarr/Definitions/tribalmixes.yml new file mode 100644 index 0000000..7b59cdb --- /dev/null +++ b/config/prowlarr/Definitions/tribalmixes.yml @@ -0,0 +1,140 @@ +--- +id: tribalmixes +name: TribalMixes +description: "TribalMixes is a ratioless Semi-Private Torrent Tracker for DJ MIXES" +language: en-GB +type: semi-private +encoding: ISO-8859-1 +links: + - https://www.tribalmixes.com/ + +caps: + categorymappings: + - {id: 1, cat: Audio, desc: "tribal"} + - {id: 2, cat: Audio, desc: "electro"} + - {id: 3, cat: Audio, desc: "chillout"} + - {id: 4, cat: Audio, desc: "house"} + - {id: 5, cat: Audio, desc: "video"} + - {id: 6, cat: Audio, desc: "breaks"} + - {id: 7, cat: Audio, desc: "trance"} + - {id: 8, cat: Audio, desc: "deep house"} + - {id: 9, cat: Audio, desc: "techno"} + - {id: 10, cat: Audio, desc: "drum&bass"} + - {id: 11, cat: Audio, desc: "classic"} + - {id: 12, cat: Audio, desc: "minimal"} + - {id: 14, cat: Audio, desc: "progressive"} + - {id: 15, cat: Audio, desc: "tech house"} + - {id: 16, cat: Audio, desc: "psy-goa trance"} + - {id: 17, cat: Audio, desc: "electro-tribe"} + - {id: 18, cat: Audio, desc: "mega-pack"} + - {id: 19, cat: Audio, desc: "dark"} + - {id: 20, cat: Audio, desc: "dubstep"} + - {id: 22, cat: Audio, desc: "misc"} + - {id: 30, cat: Audio, desc: "(tm) mixes"} + - {id: 31, cat: Audio, desc: "(tm) ONLY"} + + modes: + search: [q] + music-search: [q, artist] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: sort + type: select + label: Sort requested from site + default: _ + options: + _: created + 8: seeders + 6: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: div.alert-danger + test: + path: / + selector: a[href="/logout.php"] + +search: + paths: + - path: browse.php + inputs: + search: "{{ if .Query.Artist }}{{ .Query.Artist }}{{ else }}{{ .Keywords }}{{ end }}" + sort: "{{ re_replace .Config.sort \"_\" \"\" }}" + type: "{{ .Config.type }}" + + rows: + selector: div.row:has(a[href^="/download.php?id="]) + + fields: + category: + selector: a[href^="/browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href*="/details.php?id="] + details: + selector: a[href*="/details.php?id="] + attribute: href + download: + selector: a[href^="/download.php?id="] + attribute: href + size: + selector: a[href^="/download.php?id="] + attribute: title + filters: + - name: regexp + args: "Size: (.+?)<" + files: + selector: a[href^="/download.php?id="] + attribute: title + optional: true + default: 1 + filters: + - name: regexp + args: "\\((\\d+) files\\)" + seeders: + selector: a[href^="/download.php?id="] + attribute: title + filters: + - name: regexp + args: ">(\\d+) seeder" + leechers: + selector: a[href^="/download.php?id="] + attribute: title + filters: + - name: regexp + args: ", (\\d+) leecher" + - name: replace + args: ["-1", "0"] + date: + selector: a[href^="/download.php?id="] + attribute: title + filters: + - name: regexp + args: "shared (.+?)<" + downloadvolumefactor: + text: 1 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/trupornolabs.yml b/config/prowlarr/Definitions/trupornolabs.yml new file mode 100644 index 0000000..966bb2e --- /dev/null +++ b/config/prowlarr/Definitions/trupornolabs.yml @@ -0,0 +1,88 @@ +--- +id: trupornolabs +name: truPornolabs +description: "truPornolabs is a RUSSIAN Public tracker for 3X" +language: ru-RU +type: public +encoding: UTF-8 +links: + - http://trupornolabs.org/ # https not supported + +caps: + categories: + XXX: XXX + + modes: + search: [q] + +settings: [] + +search: + headers: + User-Agent: ["Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.203"] + + paths: + # http://trupornolabs.org/search/vika + # http://trupornolabs.org/browse/0/0/0/0 + - path: "{{ if .Keywords }}search/{{ .Keywords }}{{ else }}browse/0/0/0/0{{ end }}" + + rows: + # filter out torrents with 0B for issue #9756 + selector: tr.gai:has(a[href^="/torrent/"]):has(td:nth-of-type(3):contains("GB")), tr.gai:has(a[href^="/torrent/"]):has(td:nth-of-type(3):contains("MB")) + + fields: + category: + text: XXX + title: + selector: a[href^="/torrent/"] + details: + selector: a[href^="/torrent/"] + attribute: href + download: + selector: a.downgif + attribute: href + magnet: + selector: a[href^="magnet:?xt="] + attribute: href + date: + selector: td:first-of-type + filters: + - name: replace + args: ["Янв", "Jan"] + - name: replace + args: ["Фев", "Feb"] + - name: replace + args: ["Мар", "Mar"] + - name: replace + args: ["Апр", "Apr"] + - name: replace + args: ["Май", "May"] + - name: replace + args: ["Июн", "Jun"] + - name: replace + args: ["Июл", "Jul"] + - name: replace + args: ["Авг", "Aug"] + - name: replace + args: ["Сен", "Sep"] + - name: replace + args: ["Окт", "Oct"] + - name: replace + args: ["Ноя", "Nov"] + - name: replace + args: ["Дек", "Dec"] + - name: append + args: " +03:00" # MSK + - name: dateparse + args: "dd MMM yy zzz" + size: + selector: td:nth-of-type(3) + seeders: + selector: span.green + leechers: + selector: span.red + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/turktorrent.yml b/config/prowlarr/Definitions/turktorrent.yml new file mode 100644 index 0000000..e726585 --- /dev/null +++ b/config/prowlarr/Definitions/turktorrent.yml @@ -0,0 +1,221 @@ +--- +id: turktorrent +name: TurkTorrent +description: "TurkTorrent (TT) is a TURKISH Private Torrent Tracker for MOVIES / TV / GENERAL" +language: tr-TR +type: private +encoding: UTF-8 +links: + - https://turktorrent.us/ +legacylinks: + - http://turktorrent1.in/ + - http://turktorrent.us/ + +caps: + categorymappings: + - {id: 36, cat: Movies, desc: "Film"} + - {id: 59, cat: Movies, desc: "Film Türk Filmi"} + - {id: 30, cat: Movies/HD, desc: "Film X264"} + - {id: 28, cat: Movies/HD, desc: "Film X265"} + - {id: 69, cat: Movies/WEB-DL, desc: "Film H264 WEB-DL"} + - {id: 18, cat: Movies, desc: "Anime - Çizgi"} + - {id: 76, cat: Movies, desc: "Film Yabancı Dil - Altyazısız"} + - {id: 20, cat: Movies, desc: "Film Boxset"} + - {id: 24, cat: Movies/BluRay, desc: "Film 4K/1080P Bluray Disk"} + - {id: 63, cat: Movies/SD, desc: "Film 3D/DVD/XviD"} + - {id: 51, cat: Other, desc: "Diğer"} + - {id: 62, cat: Other, desc: "Diğer Eğitim"} + - {id: 52, cat: Other, desc: "Diğer Belgesel"} + - {id: 53, cat: Other, desc: "Diğer Dini Yayınlar"} + - {id: 54, cat: TV/Sport, desc: "Spor"} + - {id: 56, cat: Other, desc: "Diğer Her Şey"} + - {id: 65, cat: Books/EBook, desc: "E-Kitap"} + - {id: 35, cat: TV, desc: "Netflix"} + - {id: 41, cat: TV, desc: "Netflix Animasyon"} + - {id: 39, cat: TV, desc: "Netflix Film"} + - {id: 38, cat: TV, desc: "Netflix Dizi"} + - {id: 40, cat: TV, desc: "Netflix Belgesel"} + - {id: 104, cat: TV, desc: "Netflix Reality/Yarışma"} + - {id: 47, cat: PC, desc: "Programlar"} + - {id: 48, cat: PC, desc: "Programlar Windows"} + - {id: 96, cat: PC, desc: "Programlar Linux"} + - {id: 49, cat: PC, desc: "Programlar MaC"} + - {id: 50, cat: PC, desc: "Programlar Mobile"} + - {id: 83, cat: TV, desc: "Dijital Platform"} + - {id: 86, cat: TV, desc: "Dijital Platform AMAZON"} + - {id: 102, cat: TV, desc: "Dijital Platform ATVP"} + - {id: 85, cat: TV, desc: "Dijital Platform BEiN/TOD"} + - {id: 84, cat: TV, desc: "Dijital Platform BluTV"} + - {id: 98, cat: TV, desc: "Dijital Platform DSNP"} + - {id: 77, cat: TV, desc: "Dijital Platform EXXEN"} + - {id: 87, cat: TV, desc: "Dijital Platform GAIN"} + - {id: 88, cat: TV, desc: "Dijital Platform TV+"} + - {id: 101, cat: TV, desc: "Dijital Platform MUBi"} + - {id: 103, cat: TV, desc: "Dijital Platform TABii"} + - {id: 89, cat: TV, desc: "Dijital Platform Diger"} + - {id: 31, cat: TV, desc: "Dizi"} + - {id: 32, cat: TV, desc: "Dizi Yerli"} + - {id: 33, cat: TV, desc: "Dizi Yabancı / TR Dublaj"} + - {id: 34, cat: TV, desc: "Dizi Boxset"} + - {id: 42, cat: Audio, desc: "Müzik"} + - {id: 43, cat: Audio, desc: "Müzik Yerli"} + - {id: 44, cat: Audio, desc: "Müzik Yabancı"} + - {id: 45, cat: Audio, desc: "Müzik Diskografi"} + - {id: 2, cat: Console, desc: "Oyun"} + - {id: 46, cat: Console, desc: "Oyun PC"} + - {id: 16, cat: Console, desc: "Oyun Konsol"} + - {id: 57, cat: Other, desc: "VIP"} + - {id: 66, cat: Other, desc: "VIP Vip"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info_cookie + type: info + label: How to get the Cookie + default: "
    1. Login to this tracker with your browser
    2. Open the DevTools panel by pressing F12
    3. Select the Network tab
    4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
    5. Refresh the page by pressing F5
    6. Click on the first row entry
    7. Select the Headers tab on the Right panel
    8. Find 'cookie:' in the Request Headers section
    9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
    " + - name: useragent + type: text + label: User-Agent + - name: info_useragent + type: info + label: How to get the User-Agent + default: "
    1. From the same place you fetched the cookie,
    2. Find 'user-agent:' in the Request Headers section
    3. Select and Copy the whole user-agent string (everything after 'user-agent: ') and Paste here.
    " + - name: info_profile + type: info + label: Layout + default: "
    1. Only the English Classic profile is supported.
    2. Make sure to set the Torrent Listing (Listeleme Biçimi) option in your profile to Classic (Klasik)
    3. And set the Language (Dil) to English
    4. Using the Modern theme will prevent results, and using Turkish will prevent upload dates.
    " + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeders: seeders + size: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: ?p=home&pid=1 + selector: div#member_info_bar + +search: + headers: + User-Agent: ["{{ .Config.useragent }}"] + paths: + - path: / + inputs: + p: torrents + pid: 32 + $raw: "{{ range .Categories }}cid[]={{.}}&{{end}}" + keywords: "{{ .Keywords }}" + # name description both uploader + search_type: name + "sortOptions[sortBy]": "{{ .Config.sort }}" + "sortOptions[sortOrder]": "{{ .Config.type }}" + + keywordsfilters: + - name: re_replace + args: ["\\b(\\d{4})\\.(\\d{2})\\.(\\d{2})\\b", "$3.$2.$1"] + + rows: + selector: "table#torrents_table_classic > tbody > tr:has(td.torrent_name){{ if .Config.freeleech }}:has(img[src$=\"/freedownload.gif\"]){{ else }}{{ end }}" + + fields: + category: + selector: div.category_image > a + attribute: href + filters: + - name: querystring + args: cid + title: + selector: a[href*="?p=torrents&pid=10&action=details"] + filters: + - name: re_replace + args: ["\\b(\\d{2})\\.(\\d{2})\\.(\\d{4})\\b", "$3.$2.$1"] + details: + selector: a[href*="?p=torrents&pid=10&action=details"] + attribute: href + date_day: + # Uploaded Friday at 05:11 by + # Uploaded Today at 00:48 by + # Uploaded Yesterday at 23:57 by + selector: td.torrent_name:contains(" at "):not(:has(abbr[data-time])) + # auto adjusted by site account profile + optional: true + filters: + - name: regexp + args: "Uploaded (.+?) by" + - name: fuzzytime + date_year: + # Uploaded 30-01-2019 15:02 by + selector: td.torrent_name:not(:contains(" at ")):not(:has(abbr[data-time])) + # auto adjusted by site account profile + optional: true + filters: + - name: regexp + args: "Uploaded (.+?) by" + - name: dateparse + args: "dd-MM-yyyy HH:mm" + date_unix: + # within the hour (unix) + selector: abbr[data-time] + attribute: data-time + optional: true + date: + text: "{{ if or .Result.date_day .Result.date_year .Result.date_unix }}{{ or .Result.date_day .Result.date_year .Result.date_unix }}{{ else }}now{{ end }}" + download: + selector: a[href*="?p=torrents&pid=10&action=download"] + attribute: href + magnet: + optional: true + selector: a[href^="magnet:?xt="] + attribute: href + size: + selector: a[rel="torrent_size"] + seeders: + selector: a[rel="torrent_seeders"] + leechers: + selector: a[rel="torrent_leechers"] + grabs: + selector: a[rel="times_completed"] + poster: + selector: a[rel="fancybox"] + attribute: href + downloadvolumefactor: + case: + "img[src$=\"/freedownload.gif\"]": 0 + "img[src$=\"/silverdownload.gif\"]": 0.5 + "*": 1 + uploadvolumefactor: + case: + "img[src$=\"/torrent_x2.png\"]": 2 + "*": 1 + minimumratio: + text: 0.5 + minimumseedtime: + # 3 days (as seconds = 3 x 24 x 60 x 60) + text: 259200 +# TSUE 2.2 diff --git a/config/prowlarr/Definitions/tvchaosuk.yml b/config/prowlarr/Definitions/tvchaosuk.yml new file mode 100644 index 0000000..34c0603 --- /dev/null +++ b/config/prowlarr/Definitions/tvchaosuk.yml @@ -0,0 +1,218 @@ +--- +id: tvchaosuk +name: TVChaosUK +description: "TV Chaos UK (TVCUK) is a Private Torrent Tracker for UK TV" +language: en-GB +type: private +encoding: UTF-8 +links: + - https://tvchaosuk.com/ + +caps: + categorymappings: + - {id: 29, cat: TV, desc: "Comedy"} + - {id: 5, cat: TV/Documentary, desc: "Documentary"} + - {id: 11, cat: TV, desc: "Drama"} + - {id: 14, cat: TV, desc: "Entertainment"} + - {id: 19, cat: TV, desc: "Factual"} + - {id: 43, cat: TV, desc: "Foreign"} + - {id: 32, cat: TV, desc: "Kids/Family"} + - {id: 44, cat: Movies, desc: "Movies"} + - {id: 45, cat: TV, desc: "News & Current Affairs"} + - {id: 51, cat: Audio, desc: "Radio"} + - {id: 52, cat: TV, desc: "Reality"} + - {id: 30, cat: TV, desc: "Soaps"} + - {id: 33, cat: TV, desc: "Sci-Fi"} + - {id: 42, cat: TV/Sport, desc: "Sport"} + - {id: 53, cat: TV, desc: "Holding Bin"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: login + method: form + form: form[action$="/login"] + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + remember: on + selectorinputs: + _token: + selector: input[name="_token"] + attribute: value + error: + - selector: div#ERROR_COPY +# test: +# path: / +# selector: a[href$="/logout"] + +search: + paths: + - path: torrents/filter + inputs: + $raw: "{{ range .Categories }}categories[]={{.}}&{{end}}" + search: "{{ if .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" # for dashboard imdbid search + imdb: "{{ .Query.IMDBIDShort }}" + tvdb: "{{ .Query.TVDBID }}" + tmdb: "{{ .Query.TMDBID }}" + sorting: "{{ .Config.sort }}" + direction: "{{ .Config.type }}" + qty: 100 + freeleech: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + # can search by genre but need range support. &genres[]=Action&genres[]=Comedy for Action and Comedy + keywordsfilters: + # if searching for season packs switch S01 to Series 1 #14369 + - name: re_replace + args: ["(?i)(S0)(\\d{1,2})$", "Series $2"] + - name: re_replace + args: ["(?i)(S)(\\d{1,3})$", "Series $2"] + + rows: + selector: table > tbody > tr + + fields: + category: + selector: a[href*="/categories/"] + attribute: href + filters: + - name: regexp + args: "/categories/(\\d+)" + title: + selector: a.view-torrent + filters: + - name: re_replace + args: ["(?i)Series[\\s]+(\\d+)", "S$1"] + download: + selector: a[href*="/download/"] + attribute: href + details: + selector: a.view-torrent + attribute: href + poster: + selector: div.torrent-poster img + attribute: src + filters: + - name: prepend + args: "https://images.weserv.nl/?url=" # for display on dashboard + - name: append + args: "&w=180&h=270" # for display on dashboard + - name: replace + args: ["https://images.weserv.nl/?url=https://via.placeholder.com/600x900&w=180&h=270", ""] + genre: + selector: td:nth-last-child(6) + filters: + - name: replace + args: ["\n", ""] + - name: re_replace + args: ["(?i)(Science Fiction)", "Science_Fiction"] + - name: validate + args: "Action, Adventure, Animation, Biography, Comedy, Crime, Documentary, Drama, Family, Fantasy, Game-Show, History, Horror, Music, Musical, Mystery, News, Reality-TV, Romance, Science_Fiction, Sitcom, Sport, Talk-Show, Thriller, War, Western" + description: + text: "{{ .Result.genre }}" + size: + selector: td:nth-last-child(4) + seeders: + selector: td:nth-last-child(3) + leechers: + selector: td:nth-last-child(2) + grabs: + selector: td:nth-last-child(1) + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + tmdbid: + selector: a[href*="themoviedb.org/movie/"], a[href*="themoviedb.org/tv/"] + attribute: href + date: + selector: time + filters: + # translations for Turkish|Estonian|Danish|Italian|Polish|Norwegian|Portuguese|Czech|Russian|Romanian|Spanish|French|German|Bulgarian|Dutch|Chinese|Japanese|Swedish + - name: re_replace + args: ["(?i)(önce|tagasi|geleden|fa|temu|siden|há|atrás|nazpět|назад|acum|în urmă|hace|il y a|vor|преди|前|sedan)", " ago"] + - name: re_replace + args: ["(?i)(saniye|sekundit|sekunder|secondi|sekund|segundos|sekundami|секунд|secunde|secondes|Sekunden|секунди|seconden|秒前)", "seconds"] + - name: re_replace + args: ["(?i)(minutit|minutter|minuti|minuty|minutos|минуты|минут|Minuten|минути|minuten|minuter)", "minutes"] + - name: re_replace + args: ["(?i)(dakika|minut|minuto|minuta|minutt|минута|Minute|minuut|分钟|分)", " minute"] + - name: re_replace + args: ["(?i)(tundi|timer|ore|godziny|horas|hodiny|hoden|часа|часов|ore|heures|Stunden|timmar)", "hours"] + - name: re_replace + args: ["(?i)(saat|tund|time|ora|godzina|hora|hodina|час|oră|heure|Stunde|uur|小时|時間|timme)", " hour"] + - name: re_replace + args: ["(?i)(päeva|dage|giorni|dni|dias|dny|дня|дней|zile|días|jours|Tagen|дни|dagen|dagar)", "days"] + - name: re_replace + args: ["(?i)(gün|päev|dag|giorno|dzień|dia|den|день|zi|día|jour|Tag|ден|天|日)", " day"] + - name: re_replace + args: ["(?i)(nädalat|uger|settimane|tygodnie|uker|semanas|týdny|недели|недель|săptămâni|semaines|Wochen|седмици|weken|veckor)", "weeks"] + - name: re_replace + args: ["(?i)(hafta|nädal|uge|settimana|tydzień|uke|semana|týden|неделю|săptămână|semaine|Woche|седмица|周|週間|vecka)", " week"] + - name: re_replace + args: ["(?i) (ay)", "month"] + - name: re_replace + args: ["(?i)(kuud|måneder|mesi|miesiące|meses|měsíce|месяца|месяцев|luni|meses|mois|Monaten|месеца|maanden|månader)", "months"] + - name: re_replace + args: ["(?i)(kuu|måned|mese|miesiąc|mês|měsíc|месяц|lună|mes|Monat|месец|maand|个月|ヶ月|månad)", " month"] + - name: re_replace + args: ["(?i)(aastat|anni|lata|anos|roky|года|ani|años|ans|Jahren|години)", " years"] + - name: re_replace + args: ["(?i)(yil|aasta|år|anno|rok|ano|год|año|Jahr|година|jaar|年)", " year"] + - name: re_replace + args: ["(?i) (an)", "year"] + - name: re_replace + args: ["(?i)(För |und)", ""] # Misc removals + - name: timeago + downloadvolumefactor: + case: + i[class*="fa-id-badge text-orange"]: 0 # 24 Hour FreeLeech From BON Store + i[class*="fa-trophy text-purple"]: 0 # Special FreeLeech For Certain User Groups + i[class*="fa-star text-bold"]: 0 # Freeleech From Token + i[class*="fa-coins text-bold"]: 0 # Freeleech From Token + i[class*="fa-globe text-blue"]: 0 # Global Freeleech + i[class*="fa-star text-gold"]: 0 # Freeleech + i[class*="fa-certificate text-pink"]: 0 # Featured Torrent + "*": 1 + uploadvolumefactor: + case: + i[class*="fa-gem text-green"]: 2 # Single Torrent Double Upload + i[class*="fa-globe text-green"]: 2 # Global Double Upload + i[class*="fa-certificate text-pink"]: 2 # Featured Torrent + "*": 1 + minimumratio: + text: 0.4 + minimumseedtime: + # 1 day (as seconds = 24 x 60 x 60) + text: 86400 +# UNIT3D 2.2.7 diff --git a/config/prowlarr/Definitions/tvroad.yml b/config/prowlarr/Definitions/tvroad.yml new file mode 100644 index 0000000..d9bb453 --- /dev/null +++ b/config/prowlarr/Definitions/tvroad.yml @@ -0,0 +1,236 @@ +--- +id: tvroad +name: TvRoad +description: "TvRoad is a FRENCH Private Torrent Tracker for TV" +language: fr-FR +type: private +encoding: UTF-8 +links: + - https://tvroad.info/ + +caps: + categorymappings: + - {id: anime-fr-720-non-non, cat: TV/Anime, desc: "Anime FR 720p"} + - {id: anime-fr-720-non-pack, cat: TV/Anime, desc: "Anime FR 720p Pack"} + - {id: anime-fr-720-web-non, cat: TV/Anime, desc: "Anime FR 720p"} + - {id: anime-fr-720-web-pack, cat: TV/Anime, desc: "Anime FR 720p Pack"} + - {id: anime-fr-1080-non-non, cat: TV/Anime, desc: "Anime FR 1080p"} + - {id: anime-fr-1080-non-pack, cat: TV/Anime, desc: "Anime FR 1080p Pack"} + - {id: anime-fr-1080-web-non, cat: TV/Anime, desc: "Anime FR 1080p WEB-DL"} + - {id: anime-fr-1080-web-pack, cat: TV/Anime, desc: "Anime FR 1080p Pack WEB-DL"} + - {id: anime-fr-sd-non-non, cat: TV/Anime, desc: "Anime FR SD"} + - {id: anime-fr-sd-non-pack, cat: TV/Anime, desc: "Anime FR SD Pack"} + - {id: anime-fr-sd-web-non, cat: TV/Anime, desc: "Anime FR SD WEB-DL"} + - {id: anime-fr-sd-web-pack, cat: TV/Anime, desc: "Anime FR SD Pack WEB-DL"} + - {id: anime-vostf-720-non-non, cat: TV/Anime, desc: "Anime VOSTFR 720p"} + - {id: anime-vostf-720-non-pack, cat: TV/Anime, desc: "Anime VOSTFR 720p Pack"} + - {id: anime-vostf-720-web-non, cat: TV/Anime, desc: "Anime VOSTFR 720p WEB-DL"} + - {id: anime-vostf-720-web-pack, cat: TV/Anime, desc: "Anime VOSTFR 720p Pack WEB-DL"} + - {id: anime-vostf-1080-non-non, cat: TV/Anime, desc: "Anime VOSTFR 1080p"} + - {id: anime-vostf-1080-non-pack, cat: TV/Anime, desc: "Anime VOSTFR 1080p Pack"} + - {id: anime-vostf-1080-web-non, cat: TV/Anime, desc: "Anime VOSTFR 1080p WEB-DL"} + - {id: anime-vostf-1080-web-pack, cat: TV/Anime, desc: "Anime VOSTFR 1080p Pack WEB-DL"} + - {id: anime-vostf-sd-non-non, cat: TV/Anime, desc: "Anime VOSTFR SD"} + - {id: anime-vostf-sd-non-pack, cat: TV/Anime, desc: "Anime VOSTFR SD Pack"} + - {id: anime-vostf-sd-web-non, cat: TV/Anime, desc: "Anime VOSTFR SD WEB-DL"} + - {id: anime-vostf-sd-web-pack, cat: TV/Anime, desc: "Anime VOSTFR SD Pack WEB-DL"} + - {id: anime-fr-2160-non-non, cat: TV/Anime, desc: "Anime FR 2160p"} + - {id: anime-fr-2160-non-pack, cat: TV/Anime, desc: "Anime FR 2160p Pack"} + - {id: anime-fr-2160-web-non, cat: TV/Anime, desc: "Anime FR 2160p WEB-DL"} + - {id: anime-fr-2160-web-pack, cat: TV/Anime, desc: "Anime FR 2160p Pack WEB-DL"} + - {id: anime-vostf-2160-non-non, cat: TV/Anime, desc: "Anime VOSTFR 2160p"} + - {id: anime-vostf-2160-non-pack, cat: TV/Anime, desc: "Anime VOSTFR 2160p Pack"} + - {id: anime-vostf-2160-web-non, cat: TV/Anime, desc: "Anime VOSTFR 2160p WEB-DL"} + - {id: anime-vostf-2160-web-pack, cat: TV/Anime, desc: "Anime VOSTFR 2160p Pack WEB-DL"} + - {id: docs-fr-720-non-non, cat: TV/Documentary, desc: "Docs FR 720p"} + - {id: docs-fr-720-non-pack, cat: TV/Documentary, desc: "Docs FR 720p Pack"} + - {id: docs-fr-720-web-non, cat: TV/Documentary, desc: "Docs FR 720p WEB-DL"} + - {id: docs-fr-720-web-pack, cat: TV/Documentary, desc: "Docs FR 720p Pack WEB-DL"} + - {id: docs-fr-1080-non-non, cat: TV/Documentary, desc: "Docs FR 1080p"} + - {id: docs-fr-1080-non-pack, cat: TV/Documentary, desc: "Docs FR 1080p Pack"} + - {id: docs-fr-1080-web-non, cat: TV/Documentary, desc: "Docs FR 1080p WEB-DL"} + - {id: docs-fr-1080-web-pack, cat: TV/Documentary, desc: "Docs FR 1080p Pack WEB-DL"} + - {id: docs-fr-sd-non-non, cat: TV/Documentary, desc: "Docs FR SD"} + - {id: docs-fr-sd-non-pack, cat: TV/Documentary, desc: "Docs FR SD Pack"} + - {id: docs-fr-sd-web-non, cat: TV/Documentary, desc: "Docs FR SD WEB-DL"} + - {id: docs-fr-sd-web-pack, cat: TV/Documentary, desc: "Docs FR SD Pack WEB-DL"} + - {id: docs-vostf-720-non-non, cat: TV/Documentary, desc: "Docs VOSTFR 720p"} + - {id: docs-vostf-720-non-pack, cat: TV/Documentary, desc: "Docs VOSTFR 720p Pack"} + - {id: docs-vostf-720-web-non, cat: TV/Documentary, desc: "Docs VOSTFR 720p WEB-DL"} + - {id: docs-vostf-720-web-pack, cat: TV/Documentary, desc: "Docs VOSTFR 720p Pack WEB-DL"} + - {id: docs-vostf-1080-non-non, cat: TV/Documentary, desc: "Docs VOSTFR 1080p"} + - {id: docs-vostf-1080-non-pack, cat: TV/Documentary, desc: "Docs VOSTFR 1080p Pack"} + - {id: docs-vostf-1080-web-non, cat: TV/Documentary, desc: "Docs VOSTFR 1080p WEB-DL"} + - {id: docs-vostf-1080-web-pack, cat: TV/Documentary, desc: "Docs VOSTFR 1080p Pack WEB-DL"} + - {id: docs-vostf-sd-non-non, cat: TV/Documentary, desc: "Docs VOSTFR SD"} + - {id: docs-vostf-sd-non-pack, cat: TV/Documentary, desc: "Docs VOSTFR SD Pack"} + - {id: docs-vostf-sd-web-non, cat: TV/Documentary, desc: "Docs VOSTFR SD WEB-DL"} + - {id: docs-vostf-sd-web-pack, cat: TV/Documentary, desc: "Docs VOSTFR SD Pack WEB-DL"} + - {id: docs-vostf-2160-non-non, cat: TV/Documentary, desc: "Docs VOSTFR 2160p"} + - {id: docs-vostf-2160-non-pack, cat: TV/Documentary, desc: "Docs VOSTFR 2160p Pack"} + - {id: docs-vostf-2160-web-non, cat: TV/Documentary, desc: "Docs VOSTFR 2160p WEB-DL"} + - {id: docs-vostf-2160-web-pack, cat: TV/Documentary, desc: "Docs VOSTFR 2160p Pack WEB-DL"} + - {id: docs-fr-2160-non-non, cat: TV/Documentary, desc: "Docs FR 2160p"} + - {id: docs-fr-2160-non-pack, cat: TV/Documentary, desc: "Docs FR 2160p Pack"} + - {id: docs-fr-2160-web-non, cat: TV/Documentary, desc: "Docs FR 2160p WEB-DL"} + - {id: docs-fr-2160-web-pack, cat: TV/Documentary, desc: "Docs FR 2160p Pack WEB-DL"} + - {id: serie-fr-720-non-non, cat: TV/HD, desc: "Serie FR 720p"} + - {id: serie-fr-720-non-pack, cat: TV/HD, desc: "Serie FR 720p Pack"} + - {id: serie-fr-720-web-non, cat: TV/HD, desc: "Serie FR 720p WEB-DL"} + - {id: serie-fr-720-web-pack, cat: TV/HD, desc: "Serie FR 720p Pack WEB-DL"} + - {id: serie-fr-1080-non-non, cat: TV/HD, desc: "Serie FR 1080p"} + - {id: serie-fr-1080-non-pack, cat: TV/HD, desc: "Serie FR 1080p Pack"} + - {id: serie-fr-1080-web-non, cat: TV/HD, desc: "Serie FR 1080p WEB-DL"} + - {id: serie-fr-1080-web-pack, cat: TV/HD, desc: "Serie FR 1080p Pack WEB-DL"} + - {id: serie-fr-sd-non-non, cat: TV/SD, desc: "Serie FR SD"} + - {id: serie-fr-sd-non-pack, cat: TV/SD, desc: "Serie FR SD Pack"} + - {id: serie-fr-sd-web-non, cat: TV/SD, desc: "Serie FR SD WEB-DL"} + - {id: serie-fr-sd-web-pack, cat: TV/SD, desc: "Serie FR SD Pack WEB-DL"} + - {id: serie-vostf-720-non-non, cat: TV/HD, desc: "Serie VOSTFR 720p"} + - {id: serie-vostf-720-non-pack, cat: TV/HD, desc: "Serie VOSTFR 720p Pack"} + - {id: serie-vostf-720-web-non, cat: TV/HD, desc: "Serie VOSTFR 720p WEB-DL"} + - {id: serie-vostf-720-web-pack, cat: TV/HD, desc: "Serie VOSTFR 720p Pack WEB-DL"} + - {id: serie-vostf-1080-non-non, cat: TV/HD, desc: "Serie VOSTFR 1080p"} + - {id: serie-vostf-1080-non-pack, cat: TV/HD, desc: "Serie VOSTFR 1080p Pack"} + - {id: serie-vostf-1080-web-non, cat: TV/HD, desc: "Serie VOSTFR 1080p WEB-DL"} + - {id: serie-vostf-1080-web-pack, cat: TV/HD, desc: "Serie VOSTFR 1080p Pack WEB-DL"} + - {id: serie-vostf-sd-non-non, cat: TV/SD, desc: "Serie VOSTFR SD"} + - {id: serie-vostf-sd-non-pack, cat: TV/SD, desc: "Serie VOSTFR SD Pack"} + - {id: serie-vostf-sd-web-non, cat: TV/SD, desc: "Serie VOSTFR SD WEB-DL"} + - {id: serie-vostf-sd-web-pack, cat: TV/SD, desc: "Serie VOSTFR SD Pack WEB-DL"} + - {id: serie-fr-2160-non-non, cat: TV/UHD, desc: "Serie FR 2160p"} + - {id: serie-fr-2160-non-pack, cat: TV/UHD, desc: "Serie FR 2160p Pack"} + - {id: serie-fr-2160-web-non, cat: TV/UHD, desc: "Serie FR 2160p WEB-DL"} + - {id: serie-fr-2160-web-pack, cat: TV/UHD, desc: "Serie FR 2160p Pack WEB-DL"} + - {id: serie-vostf-2160-non-non, cat: TV/UHD, desc: "Serie VOSTFR 2160p"} + - {id: serie-vostf-2160-non-pack, cat: TV/UHD, desc: "Serie VOSTFR 2160p Pack"} + - {id: serie-vostf-2160-web-non, cat: TV/UHD, desc: "Serie VOSTFR 2160p WEB-DL"} + - {id: serie-vostf-2160-web-pack, cat: TV/UHD, desc: "Serie VOSTFR 2160p Pack WEB-DL"} + - {id: tvreal-fr-720-non-non, cat: TV/HD, desc: "TvReal FR 720p"} + - {id: tvreal-fr-720-non-pack, cat: TV/HD, desc: "TvReal FR 720p Pack"} + - {id: tvreal-fr-720-web-non, cat: TV/HD, desc: "TvReal FR 720p WEB-DL"} + - {id: tvreal-fr-720-web-pack, cat: TV/HD, desc: "TvReal FR 720p Pack WEB-DL"} + - {id: tvreal-fr-1080-non-non, cat: TV/HD, desc: "TvReal FR 1080p"} + - {id: tvreal-fr-1080-non-pack, cat: TV/HD, desc: "TvReal FR 1080p"} + - {id: tvreal-fr-1080-web-non, cat: TV/HD, desc: "TvReal FR 1080p WEB-DL"} + - {id: tvreal-fr-1080-web-pack, cat: TV/HD, desc: "TvReal FR 1080p WEB-DL"} + - {id: tvreal-fr-sd-non-non, cat: TV/SD, desc: "TvReal FR SD"} + - {id: tvreal-fr-sd-non-pack, cat: TV/SD, desc: "TvReal FR SD Pack"} + - {id: tvreal-fr-sd-web-non, cat: TV/SD, desc: "TvReal FR SD WEB-DL"} + - {id: tvreal-fr-sd-web-pack, cat: TV/SD, desc: "TvReal FR SD Pack WEB-DL"} + - {id: tvreal-fr-2160-web-pack, cat: TV/UHD, desc: "TvReal FR 2160p Pack WEB-DL"} + - {id: other, cat: TV, desc: "Other - category was not specified"} + + modes: + search: [q] + tv-search: [q, season, ep] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: multilang + type: checkbox + label: Replace MULTi by another language in release name + default: false + - name: multilanguage + type: select + label: Replace MULTi by this language + default: FRENCH + options: + FRENCH: FRENCH + MULTi.FRENCH: MULTi.FRENCH + ENGLISH: ENGLISH + MULTi.ENGLISH: MULTi.ENGLISH + VOSTFR: VOSTFR + MULTi.VOSTFR: MULTi.VOSTFR + - name: vostfr + type: checkbox + label: Replace VOSTFR and SUBFRENCH with ENGLISH + default: false + +login: + path: TvRoad/Connexion + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: font[color="red"] + test: + path: TvRoad/Bienvenue + selector: a[href$="/TvRoad/Deconnexion"] + +search: + paths: + # https://tvroad.info/TvRoad/Torrents/Recherche?recherche= + - path: TvRoad/Torrents/Recherche + inputs: + recherche: "{{ .Keywords }}" + # type of search: un one of the words), tout (all of the words), exacte (exact match) + type: tout + # search location: nomtorrent (name), desctorrent (descr) + endroit: nomtorrent + # seeded: non (no), oui (yes), peuimporte (either) + tl: peuimporte + # does not support imdbid searches and does not return imdb link in results + + rows: + selector: tr:has(a[href*="/Torrents/Telechargement/"]) + + fields: + category: + selector: a[href*="/SousCategories/"] + attribute: href + optional: true + default: other + filters: + - name: split + args: ["/", -1] + title_phase1: + selector: a.infobulletorrent + attribute: title + title_vostfr: + text: "{{ .Result.title_phase1 }}" + filters: + - name: re_replace + args: ["(?i)\\b(vostfr|subfrench)\\b", "ENGLISH"] + title_phase2: + text: "{{ if .Config.vostfr }}{{ .Result.title_vostfr }}{{ else }}{{ .Result.title_phase1 }}{{ end }}" + title_multilang: + text: "{{ .Result.title_phase2 }}" + filters: + - name: re_replace + args: ["(?i)\\b(MULTI(?!.*(?:FRENCH|ENGLISH|VOSTFR)))\\b", "{{ .Config.multilanguage }}"] + title: + text: "{{ if .Config.multilang }}{{ .Result.title_multilang }}{{ else }}{{ .Result.title_phase2 }}{{ end }}" + details: + selector: a.infobulletorrent + attribute: href + download: + selector: a[href*="/Torrents/Telechargement/"] + attribute: href + poster: + selector: a.infobulletorrent img + attribute: src + date: + text: now + size: + selector: td.taillejour + grabs: + selector: td:nth-last-child(3) + seeders: + selector: b.seed + leechers: + selector: b.leech + downloadvolumefactor: + text: 1 + uploadvolumefactor: + text: 1 + minimumseedtime: + # 4 days (as seconds = 4 x 24 x 60 x 60) + text: 345600 +# TT3.0 FRENCH custom diff --git a/config/prowlarr/Definitions/twisted-music.yml b/config/prowlarr/Definitions/twisted-music.yml new file mode 100644 index 0000000..8fe69ca --- /dev/null +++ b/config/prowlarr/Definitions/twisted-music.yml @@ -0,0 +1,196 @@ +--- +id: twisted-music +name: Twisted-Music +description: "Twisted-Music is a Private Torrent Tracker for MUSIC / AUDIO SOFTWARE" +language: en-US +type: private +encoding: UTF-8 +links: + - https://twisted-music.org/ +legacylinks: + - https://twisted-music.info/ + +caps: + categorymappings: + - {id: 3, cat: PC, desc: "Apps"} + - {id: 4, cat: Audio, desc: "Albums"} + - {id: 28, cat: Audio, desc: "Alternative"} + - {id: 31, cat: Audio, desc: "Billboard Top 100"} + - {id: 13, cat: Audio, desc: "Blues"} + - {id: 27, cat: Audio, desc: "Chillout"} + - {id: 12, cat: Audio, desc: "Christmas"} + - {id: 26, cat: Audio, desc: "Classical"} + - {id: 11, cat: Audio, desc: "Country"} + - {id: 25, cat: Audio, desc: "Dance"} + - {id: 20, cat: Audio, desc: "Deep House"} + - {id: 38, cat: Audio, desc: "Discography"} + - {id: 5, cat: Audio, desc: "DJ Music"} + - {id: 45, cat: Audio, desc: "DJ Music -- Funkymix"} + - {id: 46, cat: Audio, desc: "DJ Music -- Promo Only"} + - {id: 48, cat: Audio, desc: "DJ Music -- Ultimix"} + - {id: 49, cat: Audio, desc: "DJ Radio Sets"} + - {id: 7, cat: Audio, desc: "DMC"} + - {id: 29, cat: Audio, desc: "Dubstep"} + - {id: 9, cat: Audio/Lossless, desc: "Flac Music"} + - {id: 42, cat: Audio/Lossless, desc: "Flac-24 Bit Hi-Res"} + - {id: 33, cat: Audio, desc: "Funk"} + - {id: 18, cat: Audio, desc: "Hardcore"} + - {id: 16, cat: Audio, desc: "Hip hop"} + - {id: 32, cat: Audio, desc: "House"} + - {id: 17, cat: Audio, desc: "Jazz"} + - {id: 35, cat: Audio, desc: "Jungle"} + - {id: 39, cat: Audio, desc: "Karaoke"} + - {id: 8, cat: Audio, desc: "Mastermix"} + - {id: 19, cat: Audio, desc: "Metal"} + - {id: 41, cat: Audio/MP3, desc: "MP3 NEW RELEASES"} + - {id: 43, cat: Audio, desc: "Music Packs"} + - {id: 40, cat: Audio/Video, desc: "Music Videos"} + - {id: 30, cat: Audio, desc: "Oldies"} + - {id: 15, cat: Audio, desc: "Pop music"} + - {id: 36, cat: Audio, desc: "Punk"} + - {id: 23, cat: Audio, desc: "R&B/Motown"} + - {id: 34, cat: Audio, desc: "Reggae"} + - {id: 37, cat: Audio, desc: "Retro"} + - {id: 14, cat: Audio, desc: "Rock"} + - {id: 50, cat: Audio, desc: "Rock & roll"} + - {id: 21, cat: Audio, desc: "Soul"} + - {id: 24, cat: Audio, desc: "Trance"} + - {id: 10, cat: Audio, desc: "Twisted-Music Vip"} + + modes: + search: [q] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 40 on your account profile. The Default is 15. + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + logout: "" + error: + - selector: table:has(a[href*="login.php?error=1"]) + message: + text: "ERROR: Incorrect username!" + - selector: table:has(a[href*="login.php?error=4"]) + message: + text: "ERROR: Incorrect password!" + - selector: table:has(a[href*="login.php?error="]) + message: + text: "ERROR: Something went wrong during login!" + test: + path: index.php + selector: a[href*="/logout.php?logouthash="] + +search: + paths: + - path: browse.php + method: post + keywordsfilters: + - name: re_replace + args: ["[\\s]+", "%"] + inputs: + do: search + keywords: "{{ .Keywords }}" + # t_name, t_description, t_both, t_uploader, t_genre + search_type: t_name + # does not support multi category searching so defaulting to all. + category: 0 + # yes, no + include_dead_torrents: yes + sort: "{{ if .Config.freeleech }}free{{ else }}{{ .Config.sort }}{{ end }}" + order: "{{ if .Config.freeleech }}asc{{ else }}{{ .Config.type }}{{ end }}" + + rows: + selector: "table.sortable tr:has(a[href*=\"/download.php?id=\"]){{ if .Config.freeleech }}:has(img[src$=\"/freedownload.gif\"]){{ else }}{{ end }}" + + fields: + category: + selector: a[href*="/browse.php?category="] + attribute: href + filters: + - name: querystring + args: category + title_default: + # is usually abbreaviated + selector: a[href*="/details.php?id="] + title: + # while still abbreviated, is usually longer than the default + selector: div.tooltip-content div + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href*="/details.php?id="] + attribute: href + download: + selector: a[href*="download.php?id="] + attribute: href + poster: + selector: img[src*="/torrents/images/"] + attribute: src + date: + selector: td:nth-child(2) + # auto adjusted by site account profile + filters: + - name: regexp + args: "(\\d{2}-\\d{2}-\\d{4} \\d{2}:\\d{2})" + - name: dateparse + args: "dd-MM-yyyy HH:mm" + size: + selector: td:nth-last-child(5) + grabs: + selector: td:nth-last-child(4) + seeders: + selector: td:nth-last-child(3) + leechers: + selector: td:nth-last-child(2) + description: + # Wait: 4 h + selector: div.tooltip-content > div:last-child + downloadvolumefactor: + case: + img[src$="/freedownload.gif"]: 0 + img[src$="/silverdownload.gif"]: 0.5 + "*": 1 + uploadvolumefactor: + case: + img[src$="/x2.gif"]: 2 + "*": 1 + minimumratio: + text: 0.5 + minimumseedtime: + # 1 day (as seconds = 24 x 60 x 60) + text: 86400 +# TS Special Edition v.8.0 diff --git a/config/prowlarr/Definitions/u2.yml b/config/prowlarr/Definitions/u2.yml new file mode 100644 index 0000000..c85c998 --- /dev/null +++ b/config/prowlarr/Definitions/u2.yml @@ -0,0 +1,190 @@ +--- +id: u2 +name: U2 +description: "U2 (U2分享園@動漫花園) is a CHINESE Private Torrent Tracker for ANIME" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://u2.dmhy.org/ + +caps: + categorymappings: + - {id: 9, cat: TV/Anime, desc: "U2-Rip"} + - {id: 411, cat: TV/Anime, desc: "U2-RBD"} + - {id: 413, cat: TV/Anime, desc: "Web"} + - {id: 12, cat: TV/Anime, desc: "BDRip"} + - {id: 13, cat: TV/Anime, desc: "DVDRip"} + - {id: 14, cat: TV/Anime, desc: "HDTVRip"} + - {id: 15, cat: TV/Anime, desc: "DVDISO"} + - {id: 16, cat: TV/Anime, desc: "BDMV"} + - {id: 17, cat: TV/Anime, desc: "LQRip"} + - {id: 410, cat: TV/Anime, desc: "外挂结构 (TV Series)"} + - {id: 412, cat: TV/Anime, desc: "加流重灌 (Modded Blu-rays)"} + - {id: 21, cat: Books, desc: "Raw Books"} + - {id: 22, cat: Books, desc: "港译漫画 (HK Books)"} + - {id: 23, cat: Books, desc: "台译漫画 (TW Books)"} + - {id: 30, cat: Audio, desc: "Lossless Music"} + - {id: 40, cat: Other, desc: "Others"} + # Anime as Movies (Radarr uses t=movie): + - {id: 9, cat: Movies/Other, desc: "U2-Rip"} + - {id: 411, cat: Movies/Other, desc: "U2-RBD"} + - {id: 413, cat: Movies/Other, desc: "Web"} + - {id: 12, cat: Movies/HD, desc: "BDRip"} + - {id: 13, cat: Movies/Other, desc: "DVDRip"} + - {id: 14, cat: Movies/Other, desc: "HDTVRip"} + - {id: 15, cat: Movies/Other, desc: "DVDISO"} + - {id: 16, cat: Movies/BluRay, desc: "BDMV"} + - {id: 17, cat: Movies/Other, desc: "LQRip"} + - {id: 412, cat: Movies/BluRay, desc: "加流重灌 (Modded Blu-rays)"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
    1. Login to this tracker with your browser
    2. Open the DevTools panel by pressing F12
    3. Select the Network tab
    4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
    5. Refresh the page by pressing F5
    6. Click on the first row entry
    7. Select the Headers tab on the Right panel
    8. Find 'cookie:' in the Request Headers section
    9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
    " + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: index.php + selector: a[href^="logout.php?key="] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30%, 8 all promotions + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 AniDB, 5 infohash + search_area: 0 + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td:nth-child(4) > time[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td:nth-child(4):not(time[title]) > time + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td:nth-child(5) + seeders: + selector: td:nth-child(6) + leechers: + selector: td:nth-child(7) + grabs: + selector: td:nth-child(8) + downloadvolumefactor_custom: + selector: td.embedded > img.arrowdown + b + optional: true + filters: + - name: regexp + args: (.*)X + uploadvolumefactor_custom: + selector: td.embedded > img.arrowup + b + optional: true + filters: + - name: regexp + args: (.*)X + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_custom: "{{ .Result.downloadvolumefactor_custom }}" + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + img.pro_custom: "{{ .Result.uploadvolumefactor_custom }}" + "*": 1 + description: + selector: td:nth-child(2) + remove: a, b, font, img, span +# NexusPHP U2-Revision Standard v1.5 Beta 4 diff --git a/config/prowlarr/Definitions/ubits.yml b/config/prowlarr/Definitions/ubits.yml new file mode 100644 index 0000000..66ae675 --- /dev/null +++ b/config/prowlarr/Definitions/ubits.yml @@ -0,0 +1,198 @@ +--- +id: ubits +name: UBits +description: "UBits is a CHINESE Private torrent tracker for MOVIES / TV / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://ubits.club/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "Movies"} + - {id: 402, cat: TV, desc: "TV Series"} + - {id: 403, cat: TV, desc: "TV Shows"} + - {id: 404, cat: TV/Documentary, desc: "Documentaries"} + - {id: 405, cat: TV/Anime, desc: "Animations"} + - {id: 406, cat: Audio/Video, desc: "Music Videos"} + - {id: 407, cat: TV/Sport, desc: "Sports"} + - {id: 408, cat: Other, desc: "Other"} + - {id: 409, cat: Other, desc: "Misc"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: 2facode + type: text + label: 2FA code + - name: info_2fa + type: info + label: "About 2FA code" + default: "Only fill in the 2FA code box if you have enabled 2FA on the UBits Web Site. Otherwise just leave it empty." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + inputs: + secret: "" + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + two_step_code: "{{ .Config.2facode }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("失败")) + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl + search_area: "{{ if .Query.IMDBID }}4{{ else }}{{ end }}{{ if .Query.DoubanID }}1{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }}{{ else }}0{{ end }}" + # 0 AND, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + imdbid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="imdb.com/title/tt"] + attribute: href + doubanid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="movie.douban.com/subject/"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-child(5) + seeders: + selector: td.rowfollow:nth-child(6) + leechers: + selector: td.rowfollow:nth-child(7) + grabs: + selector: td.rowfollow:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumratio: + case: + img.hitandrun: 100 # dummy MR to ensure HnR MST is met + "*": 0.8 + minimumseedtime: + case: + img.hitandrun: 259200 + "*": 8640000 # dummy MST to ensure non-HnR MR is met + description_verified: + case: + span[title="通过"], span[title="通過"], span[title="Allowed"]: "Verified:" + span[title="未审"], span[title="未審"], span[title="Not reviewed"]: "Unverified:" + span[title="拒绝"], span[title="拒絕"], span[title="Denied"]: "Banned:" + description: + selector: td.rowfollow:nth-child(2) + remove: a, b, font, img, span + filters: + - name: prepend + args: "{{ .Result.description_verified }} " +# NexusPHP v1.8.8 2023-09-25 diff --git a/config/prowlarr/Definitions/uhdbits.yml b/config/prowlarr/Definitions/uhdbits.yml new file mode 100644 index 0000000..3dad76c --- /dev/null +++ b/config/prowlarr/Definitions/uhdbits.yml @@ -0,0 +1,190 @@ +--- +id: uhdbits +name: UHDBits +description: "UHDBits is a Private Torrent Tracker for UHD Movies / TV" +language: en-US +type: private +encoding: UTF-8 +links: + - https://uhdbits.org/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: Movies} + - {id: 2, cat: Audio, desc: Music} + - {id: 3, cat: TV, desc: TV} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: 2facode + type: text + label: 2FA code + - name: info_2fa + type: info + label: "About 2FA code" + default: "Only fill in the 2FA code box if you have enabled 2FA on the UHDBits Web Site. Otherwise just leave it empty." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: time + options: + time: created + seeders: seeders + size: size + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: login.php + form: form.auth_form + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + two_step: "{{ .Config.2facode }}" + keeplogged: 1 + error: + - selector: .auth_form > .warning + test: + path: index.php + selector: a[href^="logout.php?auth="] + +search: + paths: + # https://uhdbits.org/torrents.php?groupname=&filelist=&description=&artistname=&recordlabel=&remastertitle=&remasterrecordlabel=&rating=0&rating1=10&freetorrent=1&searchstr=&taglist=&tags_type=1&order_by=time&order_way=desc&action=advanced&searchsubmit=1 + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}filter_cat[{{.}}]=1&{{end}}" + searchstr: "{{ .Keywords }}" + imdbid: "{{ .Query.IMDBIDShort }}" + tags_type: 1 + freetorrent: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + order_by: "{{ .Config.sort }}" + order_way: "{{ .Config.type }}" + action: advanced + searchsubmit: 1 + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + # if searching for season packs switch S01 to season 1 #10423 + - name: re_replace + args: ["(?i)\\bS(\\d{1,3})(E\\d+)?$", "season $1"] + + rows: + selector: table#torrent_table > tbody > tr.torrent + + fields: + # note: there are optional extra colums + category_id: + selector: a[href^="torrents.php?filter_cat"] + attribute: href + filters: + - name: regexp + args: "\\[(\\d+)\\]" + category: + text: "{{ .Result.category_id }}" + download: + selector: a[href^="torrents.php?action=download&id="] + attribute: href + filters: + - name: replace + args: ["\t", " "] + details: + selector: a.torrent_name + attribute: href + filters: + - name: replace + args: ["\t", " "] + - name: regexp + args: (.*)#torrent\d+$ + size: + selector: td[class="number_column nobr"] + grabs: + selector: td[class="number_column nobr"] ~ td + files: + selector: td:nth-child(3) + seeders: + selector: td[class="number_column nobr"] ~ td ~ td + leechers: + selector: td[class="number_column nobr"] ~ td ~ td ~ td + date: + selector: td:nth-child(5) > span[title] + attribute: title + filters: + - name: replace + args: [",", ""] + - name: append + args: " +07:00" # ICT + - name: dateparse + args: "MMM dd yyyy HH:mm zzz" + downloadvolumefactor: + case: + "strong.blink_me:contains(\"Free\")": 0 + "strong.blink_me:contains(\"50\")": 0.5 + "strong.blink_me:contains(\"25\")": 0.75 + "strong.blink_me:contains(\"75\")": 0.25 + "*": 1 + uploadvolumefactor: + case: + "strong.blink_me:contains(\"2x\")": 2 + "*": 1 + minimumratio: + text: 0.6 + _release_info: + selector: div.torrent_info + remove: .torrent_label.red, .torrent_label.blink_me, .torrent_label:contains("User"), .torrent_label:contains("ViE"), .torrent_label:contains("Exclusive") + filters: + - name: re_replace + args: ["[\\s\\/]+$", ""] + - name: replace + args: [" / ", " "] + - name: re_replace + args: ["\\s+([\\w@\\.\\[\\]\\$\\-\\!\\u2122]+)$", " -$1"] + - name: re_replace + args: ["\\bEncode\\b", "Blu-Ray"] + - name: re_replace + args: ["\\b(H\\.264 )?Blu-ray\\b", "BR-DISK"] + - name: re_replace + args: ["\\bRemux\\b", "Blu-Ray Remux"] + - name: re_replace + args: ["\\s+", " "] + _release_info_music: + selector: div.torrent_info + remove: .torrent_label.red, .torrent_label.blink_me + filters: + - name: re_replace + args: ["[\\s\\/]+$", ""] + - name: replace + args: [" / ", " "] + - name: re_replace + args: ["\\s+", " "] + title: + selector: div.group_info + remove: span, div.tags, div.torrent_info + filters: + - name: re_replace + args: ["(?i)\\bSeason (\\d+)\\b", "S$1"] + - name: trim + - name: append + args: " {{ if eq .Result.category_id \"2\" }}{{ .Result._release_info_music }}{{ else }}{{ .Result._release_info }}{{ end }}" +# Gazelle diff --git a/config/prowlarr/Definitions/ultrahd.yml b/config/prowlarr/Definitions/ultrahd.yml new file mode 100644 index 0000000..9de5254 --- /dev/null +++ b/config/prowlarr/Definitions/ultrahd.yml @@ -0,0 +1,171 @@ +--- +id: ultrahd +name: UltraHD +description: "UltraHD is a CHINESE Private Torrent Tracker for UHD MOVIES / TV / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://ultrahd.net/ + +caps: + categorymappings: + - {id: 401, cat: Movies, desc: "Movies"} + - {id: 402, cat: TV, desc: "TV Series"} + - {id: 403, cat: TV, desc: "TV Shows"} + - {id: 404, cat: TV/Documentary, desc: "Documentaries"} + - {id: 405, cat: TV/Anime, desc: "Animations"} + - {id: 416, cat: Audio/Video, desc: "Music Video"} + - {id: 417, cat: Other, desc: "Other"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "
    1. Login to this tracker with your browser
    2. Open the DevTools panel by pressing F12
    3. Select the Network tab
    4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
    5. Refresh the page by pressing F5
    6. Click on the first row entry
    7. Select the Headers tab on the Right panel
    8. Find 'cookie:' in the Request Headers section
    9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
    " + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: index.php + selector: a[href="usercp.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl + search_area: "{{ if .Query.IMDBID }}4{{ else }}{{ end }}{{ if .Query.DoubanID }}1{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }}{{ else }}0{{ end }}" + # 0 AND, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + imdbid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="imdb.com/title/tt"] + attribute: href + doubanid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="movie.douban.com/subject/"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-child(5) + seeders: + selector: td.rowfollow:nth-child(6) + leechers: + selector: td.rowfollow:nth-child(7) + grabs: + selector: td.rowfollow:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumseedtime: + case: + img.hitandrun: 1209600 # 14 days (as seconds = 14 x 24 x 60 x 60) + "*": 604800 # 7 days (as seconds = 7 x 24 x 60 x 60) + minimumratio: + case: + img.hitandrun: 3.0 + "*": 2.0 + description: + selector: td:nth-child(2) + remove: a, b, font, img, span +# NexusPHP v1.8.8 2023-09-25 diff --git a/config/prowlarr/Definitions/uniondht.yml b/config/prowlarr/Definitions/uniondht.yml new file mode 100644 index 0000000..ce4ad84 --- /dev/null +++ b/config/prowlarr/Definitions/uniondht.yml @@ -0,0 +1,665 @@ +--- +id: uniondht +name: UnionDHT +description: "UnionDHT is a RUSSIAN Public Torrent Tracker for MOVIES / TV / MUSIC / GENERAL" +language: ru-RU +type: public +encoding: windows-1251 +links: + - https://uniondht.org/ + +caps: + categorymappings: + - {id: 34, cat: PC/Games, desc: "Игры для ПК (общее)"} + - {id: 59, cat: PC/Games, desc: " |- Демо-версии"} + - {id: 58, cat: PC/Games, desc: " |- NoCD / NoDVD"} + - {id: 57, cat: PC/Games, desc: " |- Русификаторы"} + - {id: 56, cat: PC/Games, desc: " |- Патчи"} + - {id: 55, cat: PC/Games, desc: " |- Чит-программы, трейнеры, сейвы"} + - {id: 54, cat: PC/Games, desc: " |- Дополнения для игр"} + - {id: 53, cat: PC/Games, desc: " |- Приложенные к игровым журналам материалы"} + - {id: 902, cat: PC/Games, desc: " |- Дополнительные материалы, бонусные диски, гайды"} + - {id: 35, cat: PC/Games, desc: "Горячие новинки"} + - {id: 36, cat: PC/Games, desc: "Аркады"} + - {id: 65, cat: PC/Games, desc: " |- Аркады (разное)"} + - {id: 64, cat: PC/Games, desc: " |- Логические аркады"} + - {id: 63, cat: PC/Games, desc: " |- Настольные и карточные аркады"} + - {id: 62, cat: PC/Games, desc: " |- Мини/флеш-игры"} + - {id: 37, cat: PC/Games, desc: "Приключения и квесты"} + - {id: 38, cat: PC/Games, desc: "Стратегии"} + - {id: 69, cat: PC/Games, desc: " |- RTS (стратегии в реальном времени)"} + - {id: 68, cat: PC/Games, desc: " |- TBS (пошаговые стратегии)"} + - {id: 67, cat: PC/Games, desc: " |- Wargame"} + - {id: 66, cat: PC/Games, desc: " |- Экономические стратегии"} + - {id: 39, cat: PC/Games, desc: "Симуляторы"} + - {id: 74, cat: PC/Games, desc: " |- Авиасимуляторы"} + - {id: 73, cat: PC/Games, desc: " |- Спортивные симуляторы"} + - {id: 72, cat: PC/Games, desc: " |- Космические симуляторы"} + - {id: 71, cat: PC/Games, desc: " |- Гоночные симуляторы"} + - {id: 70, cat: PC/Games, desc: " |- Другие симуляторы"} + - {id: 40, cat: PC/Games, desc: "Action"} + - {id: 78, cat: PC/Games, desc: " |- FPS (1st Person)"} + - {id: 77, cat: PC/Games, desc: " |- TPS (3rd Person)"} + - {id: 76, cat: PC/Games, desc: " |- Stealth Action"} + - {id: 75, cat: PC/Games, desc: " |- Тактические шутеры"} + - {id: 41, cat: PC/Games, desc: "RPG"} + - {id: 43, cat: PC/Games, desc: "Многопользовательские игры"} + - {id: 81, cat: PC/Games, desc: " |- MMORPG"} + - {id: 44, cat: PC/Games, desc: "Для самых маленьких"} + - {id: 45, cat: PC/Games, desc: "Старые игры для PC"} + - {id: 91, cat: PC/Games, desc: " |- Аркады (Старые игры)"} + - {id: 90, cat: PC/Games, desc: " |- Приключения и квесты (Старые игры)"} + - {id: 89, cat: PC/Games, desc: " |- Action (Старые игры)"} + - {id: 88, cat: PC/Games, desc: " |- Стратегии (Старые игры)"} + - {id: 87, cat: PC/Games, desc: " |- RPG (Старые игры)"} + - {id: 86, cat: PC/Games, desc: " |- Симуляторы (Старые игры)"} + - {id: 85, cat: PC/Games, desc: " |- Эротические игры (Старые игры)"} + - {id: 84, cat: PC/Games, desc: " |- Для самых маленьких (Старые Игры)"} + - {id: 83, cat: PC/Games, desc: " |- Многожанровые сборники (Старые игры)"} + - {id: 82, cat: PC/Games, desc: " |- Многопользовательские игры (Старые игры)"} + - {id: 571, cat: PC/Games, desc: "Игры для других платформ"} + - {id: 46, cat: PC/Games, desc: "Игровое видео"} + - {id: 100, cat: PC/Games, desc: " |- Трейлеры/Геймплей видео"} + - {id: 99, cat: PC/Games, desc: " |- Видео (репортажи) с игровых мероприятий"} + - {id: 98, cat: PC/Games, desc: " |- Видео прохождения игр"} + - {id: 97, cat: PC/Games, desc: " |- Бонусные видеодиски"} + - {id: 96, cat: PC/Games, desc: " |- Телепередачи/интервью"} + - {id: 95, cat: PC/Games, desc: " |- Киберспорт"} + - {id: 101, cat: Console/XBox, desc: "Xbox"} + - {id: 139, cat: Console/XBox 360, desc: " |- XBox360 | Игры"} + - {id: 1068, cat: Console/XBox One, desc: " |- Xbox One | Игры"} + - {id: 554, cat: Console/XBox 360, desc: " |- XBox360 | Kinect"} + - {id: 730, cat: Console/XBox 360, desc: " |- XBox360 | GOD Игры"} + - {id: 138, cat: Console/XBox 360, desc: " |- XBox360 | JTAG"} + - {id: 137, cat: Console/XBox 360, desc: " |- XBox360 | 360E"} + - {id: 136, cat: Console/XBox 360, desc: " |- XBox360 | Demo"} + - {id: 135, cat: Console/XBox 360, desc: " |- XBox360 | Live"} + - {id: 134, cat: Console/XBox 360, desc: " |- XBox360 | Soft"} + - {id: 133, cat: Console/XBox, desc: " |- XBox | Игры"} + - {id: 102, cat: Console/PSP, desc: "PlayStation"} + - {id: 1067, cat: Console/PS4, desc: " |- PS4 | Игры"} + - {id: 127, cat: Console/PS3, desc: " |- PS3 | Игры"} + - {id: 972, cat: Console/PS3, desc: " |- PS3 | Emulation"} + - {id: 126, cat: Console/PSP, desc: " |- PSN | Игры"} + - {id: 1137, cat: Console/PS Vita, desc: " |- PS Vita | Игры"} + - {id: 125, cat: Console/PSP, desc: " |- PSP | Игры"} + - {id: 124, cat: Console/PSP, desc: " |- PS2 | Игры"} + - {id: 123, cat: Console/PSP, desc: " |- PSX | Игры"} + - {id: 722, cat: Console/PSP, desc: " |- PSP | Сцена"} + - {id: 121, cat: Console/PSP, desc: " |- PSP | PSX-PSP"} + - {id: 120, cat: Console/PS3, desc: " |- PS3 | Soft"} + - {id: 119, cat: Console/PSP, desc: " |- PSP | Прочее"} + - {id: 103, cat: Console/NDS, desc: "Nintendo"} + - {id: 113, cat: Console/NDS, desc: " |- NDS | Игры"} + - {id: 112, cat: Console/Wii, desc: " |- Wii | Игры"} + - {id: 111, cat: Console/Wiiware, desc: " |- WiiWare | Игры"} + - {id: 110, cat: Console, desc: " |- GameCube | Игры"} + - {id: 104, cat: Console, desc: "Sega"} + - {id: 108, cat: Console, desc: " |- Dreamcast | Игры"} + - {id: 107, cat: Console, desc: " |- Saturn | Игры"} + - {id: 105, cat: Console, desc: "Игры для старых консолей"} + - {id: 106, cat: Console, desc: "Коллекции (игры для разных платформ)"} + - {id: 154, cat: Movies, desc: "Зарубежные фильмы"} + - {id: 1216, cat: Movies, desc: " |- Зарубежные фильмы 2020"} + - {id: 783, cat: Movies, desc: " |- Зарубежные фильмы 2016-2019 (Новинки зарубежного кино)"} + - {id: 197, cat: Movies, desc: " |- Зарубежные фильмы до 2016"} + - {id: 1142, cat: Movies, desc: " |- Фильмы Ближнего Зарубежья"} + - {id: 1131, cat: Movies, desc: " |- Азиатские фильмы"} + - {id: 198, cat: Movies, desc: " |- Звуковые дорожки и Переводы"} + - {id: 155, cat: Movies, desc: "Российские фильмы"} + - {id: 784, cat: Movies, desc: " |- Российские фильмы 2016-2020 (Новинки русского кино)"} + - {id: 184, cat: Movies, desc: " |- Российские фильмы до 2016"} + - {id: 158, cat: Movies, desc: "Мультфильмы"} + - {id: 924, cat: Movies, desc: " |- Мультфильмы 2016-2020 (Новинки мультфильмов)"} + - {id: 172, cat: Movies, desc: " |- Мультфильмы до 2016"} + - {id: 830, cat: Movies/3D, desc: "3D Видео"} + - {id: 1128, cat: Movies/3D, desc: " |- 3D Фильмы, кино"} + - {id: 832, cat: Movies/3D, desc: " |- 3D Мультфильмы"} + - {id: 833, cat: Movies/3D, desc: " |- 3D Документальные фильмы"} + - {id: 834, cat: Movies/3D, desc: " |- 3D Разное"} + - {id: 187, cat: TV, desc: "Трейлеры и дополнительные материалы"} + - {id: 156, cat: TV, desc: "Зарубежные сериалы"} + - {id: 157, cat: TV/Anime, desc: "Российские сериалы"} + - {id: 159, cat: TV, desc: "Мультсериалы"} + - {id: 160, cat: TV/Documentary, desc: "Документальные фильмы и телепередачи"} + - {id: 161, cat: TV, desc: "Развлекательные телепередачи и шоу"} + - {id: 695, cat: TV/Sport, desc: "Спорт"} + - {id: 1124, cat: TV/Sport, desc: " |- Зимние Олимпийские игры в Сочи 2014"} + - {id: 922, cat: TV/Sport, desc: " |- Евро 2012"} + - {id: 931, cat: TV/Sport, desc: " |- Лига Чемпионов 2012-2013"} + - {id: 1130, cat: TV/Sport, desc: " |- Чемпионат Мира 2014"} + - {id: 737, cat: TV/Other, desc: "Видео для Консолей"} + - {id: 987, cat: TV/Other, desc: " |- PSVita | Видео"} + - {id: 748, cat: TV/Other, desc: " |- PSP | CAMRip/TS/Scr"} + - {id: 747, cat: TV/Other, desc: " |- PSP | Фильмы"} + - {id: 743, cat: TV/Other, desc: " |- PSP | Cериалы"} + - {id: 742, cat: TV/Other, desc: " |- PSP | Аниме"} + - {id: 741, cat: TV/Other, desc: " |- PSP | Мультфильмы"} + - {id: 739, cat: TV/Other, desc: " |- PSP | Телепередачи/Документальное кино"} + - {id: 738, cat: TV/Other, desc: " |- PSP | UMD Video"} + - {id: 211, cat: TV/Anime, desc: "Аниме (Основной)"} + - {id: 517, cat: TV/Anime, desc: " |- Аниме | Rips"} + - {id: 518, cat: TV/Anime, desc: " |- Аниме | HD Rips"} + - {id: 928, cat: TV/Anime, desc: " |- Блич | Bleach"} + - {id: 929, cat: TV/Anime, desc: " |- Ван-Пис | One Piece"} + - {id: 930, cat: TV/Anime, desc: " |- Наруто | Naruto"} + - {id: 519, cat: TV/Anime, desc: " |- Азиатская анимация"} + - {id: 520, cat: TV/Anime, desc: " |- Аниме | Разное"} + - {id: 212, cat: TV/Anime, desc: "Аниме (DVD и Blu-ray)"} + - {id: 230, cat: TV/Anime, desc: " |- Аниме | DVD"} + - {id: 521, cat: TV/Anime, desc: " |- Аниме | Blu-Ray и BDRemux"} + - {id: 214, cat: TV/Anime, desc: "Манга и прочий арт"} + - {id: 226, cat: TV/Anime, desc: " |- Манга"} + - {id: 225, cat: TV/Anime, desc: " |- Обои, артбуки и др."} + - {id: 810, cat: Books, desc: "Книги и журналы"} + - {id: 812, cat: Books, desc: " |- Художественная литература"} + - {id: 813, cat: Books, desc: " |- Документалистика и публицистика"} + - {id: 818, cat: Books, desc: " |- Образовательная и справочная литература"} + - {id: 826, cat: Books, desc: " |- Журналы"} + - {id: 910, cat: Books, desc: " |- Комиксы"} + - {id: 817, cat: Books, desc: " |- Для детей"} + - {id: 816, cat: Books, desc: " |- Профессии и увлечения"} + - {id: 815, cat: Books, desc: " |- На иностранных языках"} + - {id: 814, cat: Books, desc: " |- Прочее"} + - {id: 811, cat: Audio/Audiobook, desc: "Аудиокниги"} + - {id: 825, cat: Audio/Audiobook, desc: " |- Детская литература"} + - {id: 824, cat: Audio/Audiobook, desc: " |- Аудиокниги на иностранных языках"} + - {id: 823, cat: Audio/Audiobook, desc: " |- Детективы, приключения, триллеры, боевики"} + - {id: 822, cat: Audio/Audiobook, desc: " |- Фантастика, фэнтези, ужасы, мистика"} + - {id: 820, cat: Audio/Audiobook, desc: " |- Обучающая литература"} + - {id: 819, cat: Audio/Audiobook, desc: " |- Прочее"} + - {id: 238, cat: PC/Mac, desc: "Mac OS. Программное обеспечение под них"} + - {id: 371, cat: PC/Mac, desc: " |- Mac OS (для Apple Macintosh)"} + - {id: 370, cat: PC/Mac, desc: " |- Mac OS (для РС-Hackintosh)"} + - {id: 369, cat: PC/Mac, desc: " |- Программы для просмотра и обработки видео Mac OS"} + - {id: 368, cat: PC/Mac, desc: " |- Программы для создания и обработки графики Mac OS"} + - {id: 367, cat: PC/Mac, desc: " |- Аудио редакторы и конверторы для Mac OS"} + - {id: 366, cat: PC/Mac, desc: " |- Системные программы для Mac OS"} + - {id: 365, cat: PC/Mac, desc: " |- Другие программы для Mac OS"} + - {id: 239, cat: PC, desc: "Unix, Unix-подобные (*nix) и другие OS. Программное обеспече.."} + - {id: 361, cat: PC, desc: " |- Операционные системы (Unix и Unix-подобные)"} + - {id: 360, cat: PC, desc: " |- Программное обеспечение для Unix и Unix-подобных OS"} + - {id: 359, cat: PC, desc: " |- Другие OS и программное обеспечение под них"} + - {id: 241, cat: PC, desc: "Microsoft Windows OS"} + - {id: 349, cat: PC, desc: " |- Настольные OS, выпущенные до 2001 года (Microsoft Windows OS.."} + - {id: 348, cat: PC, desc: " |- Windows XP"} + - {id: 347, cat: PC, desc: " |- Windows Vista"} + - {id: 346, cat: PC, desc: " |- Windows 7"} + - {id: 939, cat: PC, desc: " |- Windows 8"} + - {id: 1132, cat: PC, desc: " |- Windows 10"} + - {id: 345, cat: PC, desc: " |- Серверные (Microsoft Windows OS)"} + - {id: 344, cat: PC, desc: " |- Разное (Microsoft Windows OS)"} + - {id: 242, cat: PC, desc: "Системные программы"} + - {id: 340, cat: PC, desc: " |- Работа с жёстким диском"} + - {id: 339, cat: PC, desc: " |- Резервное копирование"} + - {id: 338, cat: PC, desc: " |- Архиваторы и файловые менеджеры"} + - {id: 337, cat: PC, desc: " |- Программы для настройки и оптимизации ОС"} + - {id: 336, cat: PC, desc: " |- Сервисное обслуживание компьютера"} + - {id: 335, cat: PC, desc: " |- Работа с носителями информации"} + - {id: 334, cat: PC, desc: " |- Информация и диагностика"} + - {id: 333, cat: PC, desc: " |- Программы для интернет и сетей"} + - {id: 332, cat: PC, desc: " |- Антивирусы и Файерволы"} + - {id: 331, cat: PC, desc: " |- Программы для защиты информации"} + - {id: 330, cat: PC, desc: " |- Драйвера"} + - {id: 329, cat: PC, desc: " |- Серверное ПО для Windows"} + - {id: 328, cat: PC, desc: " |- Изменение интерфейса ОС Windows (Обои, заставки, темы)"} + - {id: 327, cat: PC, desc: " |- Скринсейверы"} + - {id: 326, cat: PC, desc: " |- Разное (Системные программы под Windows)"} + - {id: 243, cat: PC, desc: "Пользовательские программы"} + - {id: 324, cat: PC, desc: " |- Системы автоматизации проектных работ (САПР)"} + - {id: 323, cat: PC, desc: " |- Программы для архитекторов и дизайнеров интерьеров"} + - {id: 322, cat: PC, desc: " |- Офисные программы и системы"} + - {id: 321, cat: PC, desc: " |- Системы для научной работы"} + - {id: 320, cat: PC, desc: " |- Системы для бизнеса"} + - {id: 319, cat: PC, desc: " |- Каталогизаторы и просмотрщики графики"} + - {id: 318, cat: PC, desc: " |- Аудио- и видео-, CD- проигрыватели и каталогизаторы"} + - {id: 317, cat: PC, desc: " |- Программы для интернет и сетей"} + - {id: 316, cat: PC, desc: " |- Распознавание текста, звука и синтез речи"} + - {id: 315, cat: PC, desc: " |- Словари и переводчики"} + - {id: 314, cat: PC, desc: " |- Программное обеспечение для автолюбителей"} + - {id: 313, cat: PC, desc: " |- Медицинское программное обеспечение"} + - {id: 312, cat: PC, desc: " |- Справочные системы и карты"} + - {id: 311, cat: PC, desc: " |- Разное (Пользовательские программы)"} + - {id: 244, cat: PC, desc: "Веб-разработка и Программирование"} + - {id: 307, cat: PC, desc: " |- WYSIWYG Редакторы для веб-диза"} + - {id: 306, cat: PC, desc: " |- Текстовые редакторы с подсветкой"} + - {id: 305, cat: PC, desc: " |- Среды программирования, компиляторы и вспомогательные програ.."} + - {id: 304, cat: PC, desc: " |- Компоненты для сред программирования"} + - {id: 303, cat: PC, desc: " |- Системы управления базами данных (СУБД)"} + - {id: 302, cat: PC, desc: " |- Скрипты и шаблоны"} + - {id: 301, cat: PC, desc: " |- Разное (Веб-разработка и программирование)"} + - {id: 245, cat: PC, desc: "Создание и редактирование мультимедиа и 3D контента"} + - {id: 297, cat: PC, desc: " |- Программные комплекты"} + - {id: 296, cat: PC, desc: " |- Плагины для программ компании Adobe"} + - {id: 295, cat: PC, desc: " |- Графические редакторы"} + - {id: 294, cat: PC, desc: " |- Программы для верстки, печати и работы со шрифтами"} + - {id: 293, cat: PC, desc: " |- 3D моделирование, рендеринг и плагины для них"} + - {id: 292, cat: PC, desc: " |- Анимация"} + - {id: 291, cat: PC, desc: " |- Создание DVD и BD дисков"} + - {id: 290, cat: PC, desc: " |- Редакторы видео"} + - {id: 289, cat: PC, desc: " |- Видео- Аудио- конверторы"} + - {id: 288, cat: PC, desc: " |- Работа со звуком"} + - {id: 287, cat: PC, desc: " |- Разное (Программы для работы с мультимедиа и 3D)"} + - {id: 246, cat: PC, desc: "Материалы для мультимедиа и дизайна"} + - {id: 284, cat: PC, desc: " |- Растровые и Векторные Клипарты"} + - {id: 283, cat: PC, desc: " |- Заготовки, виньетки, рамки"} + - {id: 282, cat: PC, desc: " |- Стили, кисти, формы и узоры для Adobe Photoshop"} + - {id: 281, cat: PC, desc: " |- Текстуры и материалы"} + - {id: 280, cat: PC, desc: " |- 3D графика"} + - {id: 1129, cat: PC, desc: " |- Футажи"} + - {id: 278, cat: PC, desc: " |- Звуковые эффекты"} + - {id: 277, cat: PC, desc: " |- Библиотеки сэмплов"} + - {id: 276, cat: PC, desc: " |- Шрифты"} + - {id: 275, cat: PC, desc: " |- Photostoсks"} + - {id: 274, cat: PC, desc: " |- Разное (Материалы для мультимедиа и дизайна)"} + - {id: 247, cat: PC, desc: "Справочно-правовые Системы"} + - {id: 272, cat: PC, desc: " |- Консультант Плюс"} + - {id: 271, cat: PC, desc: " |- Гарант"} + - {id: 270, cat: PC, desc: " |- Кодекс"} + - {id: 248, cat: PC, desc: "Мобильные устройства и КПК"} + - {id: 1047, cat: PC, desc: " |- Android OS (Игры/Программы/Прошивка)"} + - {id: 1048, cat: PC, desc: " |- Java (Игры/Программы/Прошивка)"} + - {id: 268, cat: PC, desc: " |- Видео (Фильмы/Клипы)"} + - {id: 267, cat: PC, desc: " |- Symbian OS (Игры/Программы/Прошивка)"} + - {id: 266, cat: PC, desc: " |- Навигаторы"} + - {id: 265, cat: PC, desc: " |- Карты для навигаторов"} + - {id: 1046, cat: PC, desc: " |- Windows Mobile, Palm OS, BlackBerry и пр."} + - {id: 263, cat: PC, desc: " |- Разное (Мобильные устройства и КПК)"} + - {id: 249, cat: PC, desc: "Apple Mobile Device Software"} + - {id: 715, cat: PC, desc: " |- Программы (iPhone/iPod Touch/iPad)"} + - {id: 262, cat: PC, desc: " |- Прошивки (iPhone/iPod Touch/iPad)"} + - {id: 260, cat: PC, desc: " |- Игры (iPhone/iPod Touch/iPad)"} + - {id: 259, cat: PC, desc: " |- Видео (iPhone/iPod Touch/iPad)"} + - {id: 258, cat: PC, desc: " |- Разное (iPhone/iPod Touch/iPad)"} + - {id: 257, cat: PC, desc: " |- Аудио (iPhone/iPod Touch/iPad)"} + - {id: 250, cat: PC, desc: "Обучающие материалы"} + - {id: 254, cat: PC, desc: " |- Обучающие видеоматериалы"} + - {id: 253, cat: PC, desc: " |- Мультимедийные материалы"} + - {id: 251, cat: PC, desc: " |- Разное"} + - {id: 574, cat: Audio, desc: "Классическая музыка"} + - {id: 595, cat: Audio, desc: " |- Архив (Классическая музыка)"} + - {id: 594, cat: Audio, desc: " |- Классическая музыка (lossless)"} + - {id: 593, cat: Audio, desc: " |- Классическая музыка в современной обработке (lossless)"} + - {id: 592, cat: Audio, desc: " |- Классическая музыка (mp3)"} + - {id: 591, cat: Audio, desc: " |- Классическая музыка в современной обработке (mp3)"} + - {id: 590, cat: Audio, desc: " |- Классическая музыка (video)"} + - {id: 575, cat: Audio, desc: "Jazz, Blues"} + - {id: 694, cat: Audio, desc: " |- Архив (Jazz, Blues)"} + - {id: 693, cat: Audio, desc: " |- Jazz, Blues (lossless)"} + - {id: 691, cat: Audio, desc: " |- Jazz, Blues (mp3)"} + - {id: 689, cat: Audio, desc: " |- Jazz, Blues (video)"} + - {id: 576, cat: Audio, desc: "Reggae, Ska, Dub"} + - {id: 688, cat: Audio, desc: " |- Архив (Reggae, Ska, Dub)"} + - {id: 687, cat: Audio, desc: " |- Reggae, Ska, Dub (lossless)"} + - {id: 685, cat: Audio, desc: " |- Reggae, Ska, Dub (mp3)"} + - {id: 683, cat: Audio, desc: " |- Reggae, Ska, Dub (video)"} + - {id: 577, cat: Audio, desc: "Зарубежный Rock"} + - {id: 682, cat: Audio, desc: " |- Архив (Зарубежный Rock)"} + - {id: 681, cat: Audio, desc: " |- Rосk | Mеtаl | Аltеrnаtivе, Рunk, Indереndеnt (losslеss)"} + - {id: 678, cat: Audio, desc: " |- Rосk | Mеtаl | Аltеrnаtivе, Рunk, Indереndеnt (mр3)"} + - {id: 675, cat: Audio, desc: " |- Зарубежный Rock (video)"} + - {id: 578, cat: Audio, desc: "Отечественный Rock"} + - {id: 674, cat: Audio, desc: " |- Архив (Отечественный Rock)"} + - {id: 673, cat: Audio, desc: " |- Rосk | Mеtаl | Аltеrnаtivе, Рunk, Indереndеnt (losslеss)"} + - {id: 671, cat: Audio, desc: " |- Rосk | Mеtаl | Аltеrnаtivе, Рunk, Indереndеnt (mр3)"} + - {id: 669, cat: Audio, desc: " |- Отечественный Rock (video)"} + - {id: 579, cat: Audio, desc: "Поп-музыка, Eurodance, Disco"} + - {id: 668, cat: Audio, desc: " |- Архив (Поп-музыка, Eurodance, Disco)"} + - {id: 667, cat: Audio, desc: " |- Зарубежная Поп-музыка (lossless)"} + - {id: 666, cat: Audio, desc: " |- Отечественная Поп-музыка (lossless)"} + - {id: 664, cat: Audio, desc: " |- Зарубежная Поп-музыка (mp3)"} + - {id: 663, cat: Audio, desc: " |- Отечественная Поп-музыка (mp3)"} + - {id: 665, cat: Audio, desc: " |- Eurodance, Technopop, Disco (lossless)"} + - {id: 662, cat: Audio, desc: " |- Поп-музыка, Eurodance, Disco (mp3)"} + - {id: 660, cat: Audio, desc: " |- Поп-музыка, Eurodance, Disco (video)"} + - {id: 580, cat: Audio, desc: "Фольклор, Народная и Этническая музыка"} + - {id: 659, cat: Audio, desc: " |- Архив (Фольклор, Народная и Этническая музыка)"} + - {id: 658, cat: Audio, desc: " |- Фольклор, Народная и Этническая музыка (lossless)"} + - {id: 657, cat: Audio, desc: " |- Фольклор, Народная и Этническая музыка (mp3)"} + - {id: 656, cat: Audio, desc: " |- Фольклор, Народная и Этническая музыка (video)"} + - {id: 581, cat: Audio, desc: "New Age, Relax, Meditative & Flamenco"} + - {id: 655, cat: Audio, desc: " |- Архив (New Age, Relax, Meditative & Flamenco)"} + - {id: 654, cat: Audio, desc: " |- NewAge, Meditative (lossless)"} + - {id: 653, cat: Audio, desc: " |- Flamenco, Акустическая гитара (lossless)"} + - {id: 652, cat: Audio, desc: " |- NewAge, Meditative (mp3)"} + - {id: 651, cat: Audio, desc: " |- Flamenco, Акустическая гитара (mp3)"} + - {id: 650, cat: Audio, desc: " |- New Age, Relax, Meditative & Flamenco (video)"} + - {id: 649, cat: Audio, desc: " |- Звуки природы"} + - {id: 648, cat: Audio, desc: " |- Психоактивныe аудиопрограммы"} + - {id: 582, cat: Audio, desc: "Rap, Hip-Hop, R'n'B"} + - {id: 647, cat: Audio, desc: " |- Архив (Rap, Hip-Hop, R'n'B)"} + - {id: 646, cat: Audio, desc: " |- Зарубежный Rap, Hip-Hop, R'n'B (lossless)"} + - {id: 645, cat: Audio, desc: " |- Отечественный Rap, Hip-Hop, R'n'B (lossless)"} + - {id: 644, cat: Audio, desc: " |- Зарубежный Rap, Hip-Hop, R'n'B (mp3)"} + - {id: 643, cat: Audio, desc: " |- Отечественный Rap, Hip-Hop, R'n'B (mp3)"} + - {id: 642, cat: Audio, desc: " |- Rap, Hip-Hop, R'n'B (video)"} + - {id: 583, cat: Audio, desc: "Электронная музыка"} + - {id: 641, cat: Audio, desc: " |- Архив (Электронная музыка)"} + - {id: 640, cat: Audio, desc: " |- Электронная музыка (lossless)"} + - {id: 634, cat: Audio, desc: " |- Электронная музыка (mp3)"} + - {id: 628, cat: Audio, desc: " |- Электронная музыка (video)"} + - {id: 584, cat: Audio, desc: "Шансон, Авторская и Военная песня"} + - {id: 627, cat: Audio, desc: " |- Архив (Шансон, Авторская и Военная песня)"} + - {id: 626, cat: Audio, desc: " |- Шансон | Авторская песня | Военная песня (lossless)"} + - {id: 622, cat: Audio, desc: " |- Шансон | Авторская песня | Военная песня (mp3)"} + - {id: 617, cat: Audio, desc: " |- Шансон, Авторская и Военная песня (video)"} + - {id: 585, cat: Audio, desc: "Саундтреки"} + - {id: 616, cat: Audio, desc: " |- Архив (Саундтреки)"} + - {id: 615, cat: Audio, desc: " |- Саундтреки к фильмам и мультфильмам (lossless)"} + - {id: 614, cat: Audio, desc: " |- Саундтреки к аниме (lossless)"} + - {id: 613, cat: Audio, desc: " |- Саундтреки к играм (lossless)"} + - {id: 612, cat: Audio, desc: " |- Саундтреки к фильмам и мультфильмам (mp3)"} + - {id: 611, cat: Audio, desc: " |- Саундтреки к аниме (mp3)"} + - {id: 610, cat: Audio, desc: " |- Саундтреки к играм (mp3)"} + - {id: 586, cat: Audio, desc: "Музыка других жанров"} + - {id: 609, cat: Audio, desc: " |- Архив (Музыка других жанров)"} + - {id: 608, cat: Audio, desc: " |- Музыка других жанров (lossless)"} + - {id: 606, cat: Audio, desc: " |- Музыка других жанров (mp3)"} + - {id: 604, cat: Audio, desc: " |- Музыка других жанров (video)"} + - {id: 603, cat: Audio, desc: " |- Караоке и минусовки (фонограммы)"} + - {id: 602, cat: Audio, desc: " |- Сборники песен для детей"} + - {id: 601, cat: Audio, desc: " |- Неофициальные и внежанровые сборники"} + - {id: 600, cat: Audio, desc: " |- Неофициальные кинематографические видео"} + - {id: 587, cat: Audio, desc: "Многоканальная музыка / Собственные оцифровки / Hi-Res stere.."} + - {id: 599, cat: Audio, desc: " |- Архив (Многоканальная музыка / Собственные оцифровки / Hi-Re.."} + - {id: 598, cat: Audio, desc: " |- Многоканальная музыка"} + - {id: 597, cat: Audio, desc: " |- Собственные оцифровки"} + - {id: 596, cat: Audio, desc: " |- Hi-Res stereo"} + - {id: 1154, cat: XXX, desc: "Эротическое видео / Erotic & Softcore"} + - {id: 1155, cat: XXX, desc: " |- Эротические фильмы / Erotic Movies"} + - {id: 1156, cat: XXX, desc: " |- Документальные фильмы / Documentary & Reality"} + - {id: 1191, cat: XXX, desc: " |- Эротические ролики и сайтрипы / Erotic Clips & SiteRips"} + - {id: 1157, cat: XXX, desc: " |- Нудизм-Натуризм / Nudity"} + - {id: 850, cat: XXX, desc: "Зарубежные порнофильмы / Full Length Movies"} + - {id: 862, cat: XXX, desc: " |- Паки полных фильмов / Full Length Movies Packs"} + - {id: 861, cat: XXX, desc: " |- Классические фильмы / Classic"} + - {id: 869, cat: XXX, desc: " |- Фильмы с сюжетом / Feature & Vignettes"} + - {id: 1217, cat: XXX, desc: " |- Гонзо-фильмы 1991-2010 / Gonzo 1991-2010"} + - {id: 971, cat: XXX, desc: " |- Гонзо-фильмы 2011-2022 / Gonzo 2011-2022"} + - {id: 870, cat: XXX, desc: " |- Фильмы без сюжета 1991-2010 / All Sex & Amateur 1991-201.."} + - {id: 1158, cat: XXX, desc: " |- Фильмы без сюжета 2011-2022 / All Sex & Amateur 2011-202.."} + - {id: 873, cat: XXX, desc: " |- Лесбо-фильмы / All Girl & Solo"} + - {id: 871, cat: XXX, desc: " |- Этнические фильмы / Ethnic-Themed"} + - {id: 1084, cat: XXX, desc: " |- Видео для телефонов и КПК / Pocket РС & Phone Video"} + - {id: 872, cat: XXX, desc: " |- Японские порно фильмы"} + - {id: 1165, cat: XXX, desc: "Зарубежные фильмы в высоком качестве (DVD&HD) / Full Len.."} + - {id: 1166, cat: XXX, desc: " |- Эротические и Документальные видео (HD Video) / Erotic, Docu.."} + - {id: 1167, cat: XXX, desc: " |- Фильмы с сюжетом, Классические (DVD) / Feature & Vignett.."} + - {id: 1168, cat: XXX, desc: " |- Гонзо, Лесбо и Фильмы без сюжета (DVD) / Gonzo, All Girl &.."} + - {id: 1169, cat: XXX, desc: " |- Фильмы с сюжетом, Классические (HD Video) / Feature & Vi.."} + - {id: 1170, cat: XXX, desc: " |- Гонзо, Лесбо и Фильмы без сюжета (HD Video) / Gonzo, All Gir.."} + - {id: 849, cat: XXX, desc: "Русское порно / Russian Video"} + - {id: 1145, cat: XXX, desc: " |- Русские порнофильмы / Russian Full Length Movies"} + - {id: 1146, cat: XXX, desc: " |- Паки русских порнороликов / Russian Clips Packs"} + - {id: 1147, cat: XXX, desc: " |- Сайтрипы с русскими актрисами 1991-2015 / Russian SiteRip.."} + - {id: 1148, cat: XXX, desc: " |- Сайтрипы с русскими актрисами 1991-2015 (HD Video) / Russian.."} + - {id: 1149, cat: XXX, desc: " |- Сайтрипы с русскими актрисами 2016-2022 / Russian SiteRip.."} + - {id: 1150, cat: XXX, desc: " |- Сайтрипы с русскими актрисами 2016-2022 (HD Video) / Russian.."} + - {id: 1151, cat: XXX, desc: " |- Русские Порноролики Разное / Russian Clips (various)"} + - {id: 1152, cat: XXX, desc: " |- Русское любительское видео / Russian Amateur Video"} + - {id: 864, cat: XXX, desc: " |- Полнометражные порно фильмы (Rips)"} + - {id: 863, cat: XXX, desc: " |- Полнометражные порно фильмы (DVD, HD DVD и Blu-ray)"} + - {id: 1153, cat: XXX, desc: " |- Не сортированное"} + - {id: 865, cat: XXX, desc: "Зарубежные порноролики / Clips"} + - {id: 1123, cat: XXX, desc: " |- Сайтрипы 2011"} + - {id: 868, cat: XXX, desc: " |- Русское любительское видео"} + - {id: 1184, cat: XXX, desc: " |- Паки сайтрипов (HD Video) / SiteRip's Packs (HD Video)"} + - {id: 1183, cat: XXX, desc: " |- Паки сайтрипов (SD Video) / SiteRip's Packs (SD Video)"} + - {id: 866, cat: XXX, desc: " |- Паки порнороликов по актрисам / Actresses Clips Packs"} + - {id: 1181, cat: XXX, desc: " |- Сайтрипы 1991-2010 (HD Video) / SiteRip's 1991-2010 (HD.."} + - {id: 1180, cat: XXX, desc: " |- Сайтрипы 2011-2012 (HD Video) / SiteRip's 2011-2012 (HD.."} + - {id: 1179, cat: XXX, desc: " |- Сайтрипы 2013 (HD Video) / SiteRip's 2013 (HD Video)"} + - {id: 1178, cat: XXX, desc: " |- Сайтрипы 2014 (HD Video) / SiteRip's 2014 (HD Video)"} + - {id: 1177, cat: XXX, desc: " |- Сайтрипы 2015 (HD Video) / SiteRip's 2015 (HD Video)"} + - {id: 1176, cat: XXX, desc: " |- Сайтрипы 2016 (HD Video) / SiteRip's 2016 (HD Video)"} + - {id: 1175, cat: XXX, desc: " |- Сайтрипы 2017 (HD Video) / SiteRip's 2017 (HD Video)"} + - {id: 1174, cat: XXX, desc: " |- Сайтрипы 2018 (HD Video) / SiteRip's 2018 (HD Video)"} + - {id: 1173, cat: XXX, desc: " |- Сайтрипы 2019 (HD Video) / SiteRip's 2019 (HD Video)"} + - {id: 1172, cat: XXX, desc: " |- Сайтрипы 2020 (HD Video) / SiteRip's 2020 (HD Video)"} + - {id: 1218, cat: XXX, desc: " |- Сайтрипы 2021 (HD Video) / SiteRip's 2021 (HD Video)"} + - {id: 867, cat: XXX, desc: " |- Сайтрипы 1991-2010 / SiteRip's 1991-2010"} + - {id: 1122, cat: XXX, desc: " |- Сайтрипы 2011-2012 / SiteRip's 2011-2012"} + - {id: 1121, cat: XXX, desc: " |- Сайтрипы 2013 / SiteRip's 2013"} + - {id: 1120, cat: XXX, desc: " |- Сайтрипы 2014 / SiteRip's 2014"} + - {id: 1133, cat: XXX, desc: " |- Сайтрипы 2015 / SiteRip's 2015"} + - {id: 1136, cat: XXX, desc: " |- Сайтрипы 2016 / SiteRip's 2016"} + - {id: 1138, cat: XXX, desc: " |- Сайтрипы 2017 / SiteRip's 2017"} + - {id: 1141, cat: XXX, desc: " |- Сайтрипы 2018 / SiteRip's 2018"} + - {id: 1143, cat: XXX, desc: " |- Сайтрипы 2019 / SiteRip's 2019"} + - {id: 1144, cat: XXX, desc: " |- Сайтрипы 2020 / SiteRip's 2020"} + - {id: 1219, cat: XXX, desc: " |- Сайтрипы 2021 / SiteRip's 2021"} + - {id: 1085, cat: XXX, desc: " |- Сцены из фильмов / Movie Scenes (кроме SiteRip)"} + - {id: 1171, cat: XXX, desc: " |- Порноролики Разное / Clips (various)"} + - {id: 1140, cat: XXX, desc: " |- Порноролики в 3D и Virtual Reality (VR) / 3D & Virtual R"} + - {id: 1159, cat: XXX, desc: "Японское и китайское порно / Japanese & Chinese Adult Vi.."} + - {id: 1160, cat: XXX, desc: " |- Паки японских фильмов и сайтрипов / Full Length Japanese Mov.."} + - {id: 1164, cat: XXX, desc: " |- Японские фильмы и сайтрипы (DVD и HD Video) / Japanese Movie.."} + - {id: 1163, cat: XXX, desc: " |- Японские фильмы и сайтрипы 1991-2014 / Japanese Movies &.."} + - {id: 1162, cat: XXX, desc: " |- Японские фильмы и сайтрипы 2015-2022 / Japanese Movies &.."} + - {id: 1161, cat: XXX, desc: " |- Архив (Японское порно)"} + - {id: 848, cat: XXX, desc: "Фото и журналы / Photos & Magazines"} + - {id: 1190, cat: XXX, desc: " |- MetArt & MetModels"} + - {id: 1189, cat: XXX, desc: " |- Эротические студии Разное / Erotic Picture Gallery (various)"} + - {id: 1188, cat: XXX, desc: " |- Паки сайтрипов эротических студий / Erotic Picture SiteRip'.."} + - {id: 874, cat: XXX, desc: " |- Любительское фото / Amateur Picture Gallery"} + - {id: 1187, cat: XXX, desc: " |- Подборки по актрисам / Actresses Picture Packs"} + - {id: 1186, cat: XXX, desc: " |- Подборки сайтрипов / SiteRip's Picture Packs"} + - {id: 1185, cat: XXX, desc: " |- Подборки сетов / Picture Sets Packs"} + - {id: 1135, cat: XXX, desc: " |- Тематическое и нетрадиционное фото / Misc & Special Inte.."} + - {id: 875, cat: XXX, desc: " |- Журналы / Magazines"} + - {id: 938, cat: XXX, desc: " |- Эротические студии (Фото | Видео)"} + - {id: 851, cat: XXX, desc: "Хентай и Манга, Мультфильмы и Комиксы, Рисунки / Hentai &.."} + - {id: 1197, cat: XXX, desc: " |- Хентай: основной подраздел / Hentai: main subsection"} + - {id: 1196, cat: XXX, desc: " |- Хентай в высоком качестве (DVD и HD) / Hentai DVD & HD"} + - {id: 1195, cat: XXX, desc: " |- Хентай: ролики 2D / Hentai: 2D video"} + - {id: 1194, cat: XXX, desc: " |- Хентай: ролики 3D / Hentai: 3D video"} + - {id: 1139, cat: XXX, desc: " |- Хентай: Манга / Hentai: Manga"} + - {id: 1193, cat: XXX, desc: " |- Хентай: Арт и HCG / Hentai: Artwork & HCG"} + - {id: 858, cat: XXX, desc: " |- Мультфильмы / Cartoons"} + - {id: 1192, cat: XXX, desc: " |- Комиксы и рисунки / Comics & Artwork"} + - {id: 856, cat: XXX, desc: " |- Хентай | Без цензуры"} + - {id: 855, cat: XXX, desc: " |- Хентай | С цензурой"} + - {id: 42, cat: XXX, desc: "Игры / Games"} + - {id: 1203, cat: XXX, desc: " |- Игры: основной подраздел / Games: main subsection"} + - {id: 1202, cat: XXX, desc: " |- Игры: визуальные новеллы / Games: Visual Novels"} + - {id: 1201, cat: XXX, desc: " |- Игры: ролевые / Games: role-playing (RPG Maker and WOLF RPG .."} + - {id: 1200, cat: XXX, desc: " |- Игры и Софт: Анимация / Software: Animation"} + - {id: 1199, cat: XXX, desc: " |- Игры: В разработке и Демо (основной подраздел) / Games: In P.."} + - {id: 1198, cat: XXX, desc: " |- Игры: В разработке и Демо (ролевые) / Games: In Progress and.."} + - {id: 846, cat: XXX, desc: "Нетрадиционное порно / Special Interest Movies & Clips"} + - {id: 984, cat: XXX, desc: " |- Транссексуалы (DVD и HD) / Transsexual (DVD & HD)"} + - {id: 1204, cat: XXX, desc: " |- Транссексуалы / Transsexual"} + - {id: 986, cat: XXX, desc: " |- Бисексуалы / Bisexual"} + - {id: 985, cat: XXX, desc: " |- БДСМ / BDSM"} + - {id: 983, cat: XXX, desc: " |- Женское доминирование и страпон / Femdom & Strapon"} + - {id: 982, cat: XXX, desc: " |- Подглядывание / Voyeur"} + - {id: 981, cat: XXX, desc: " |- Фистинг и дилдо / Fisting & Dildo"} + - {id: 1086, cat: XXX, desc: " |- Беременные / Pregnant"} + - {id: 1087, cat: XXX, desc: " |- Буккаке / Bukkake"} + - {id: 1088, cat: XXX, desc: " |- Мочеиспускание / Peeing"} + - {id: 980, cat: XXX, desc: " |- Фетиш / Fetish"} + - {id: 1089, cat: XXX, desc: " |- Дефекация / Scat"} + - {id: 1205, cat: XXX, desc: "Гей-порно / Gay Forum"} + - {id: 1214, cat: XXX, desc: " |- Полнометражные гей-фильмы / Full Length Movies (Gay)"} + - {id: 1213, cat: XXX, desc: " |- Полнометражные азиатские гей-фильмы / Full-length Asian Film.."} + - {id: 1212, cat: XXX, desc: " |- Классические гей-фильмы (до 1990 года) / Classic Gay Films (.."} + - {id: 1211, cat: XXX, desc: " |- Гей-фильмы в высоком качестве (DVD и HD) / High-Quality Full.."} + - {id: 1210, cat: XXX, desc: " |- Азиатские гей-фильмы в высоком качестве (DVD и HD) / High-Qu.."} + - {id: 1209, cat: XXX, desc: " |- ПАКи гей-роликов и сайтрипов / Clip's & SiteRip.."} + - {id: 1208, cat: XXX, desc: " |- Гей-ролики в высоком качестве (HD Video) / Gay Clips (HD Vid.."} + - {id: 1207, cat: XXX, desc: " |- Ролики, SiteRip'ы и сцены из гей-фильмов / Clips &.."} + - {id: 1206, cat: XXX, desc: " |- Гей-журналы, фото, разное / Magazines, Photo, Rest (Gay)"} + - {id: 1134, cat: XXX, desc: " |- Геи"} + - {id: 853, cat: XXX, desc: "Эротика, документальное и обучающее"} + - {id: 1215, cat: XXX, desc: "Архив (общий)"} + - {id: 497, cat: Other, desc: "Разное"} + - {id: 506, cat: Other, desc: "Тестовый"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: stripcyrillic + type: checkbox + label: Strip Cyrillic Letters + default: false + - name: addrussiantotitle + type: checkbox + label: Add RUS to end of all titles to improve language detection by Sonarr and Radarr. Will cause English-only results to be misidentified. + default: false + - name: sort + type: select + label: Sort requested from site + default: 1 + options: + 1: created + 10: seeders + 7: size + 2: title + - name: type + type: select + label: Order requested from site + default: 2 + options: + 2: desc + 1: asc + +download: + selectors: + - selector: a[href^="magnet:?xt="] + attribute: href + +search: + paths: + - path: tracker.php + inputs: + $raw: "{{ if .Categories }}{{ range .Categories }}f[]={{.}}&{{end}}{{ else }}f[]=-1{{ end }}" + prev_a: 0 + prev_dla: 0 + prev_dlc: 0 + prev_dld: 0 + prev_dlw: 0 + prev_my: 0 + prev_new: 0 + prev_sd: 0 + prev_da: 1 + prev_dc: 0 + prev_df: 1 + # sort by 1=registered 2=topicTitle 4=completed 10=seed 11=leech 5=replies 6=views 7=size + o: "{{ .Config.sort }}" + # 1=asc 2=desc + s: "{{ .Config.type }}" + # show category + dc: 0 + # show forum + df: 1 + # show author + da: 1 + # -1=all time + tm: -1 + nm: "{{ .Keywords }}" + # find a username + + keywordsfilters: + - name: diacritics + args: replace + - name: re_replace # S01 to сезон 1 + args: ["(?i)\\bS0*(\\d+)\\b", "сезон $1"] + - name: re_replace # E02 to сери 1 + args: ["(?i)\\bE0*(\\d+)\\b", "сери $1"] + - name: re_replace # S01E02 to сезон 1 сери 2 + args: ["(?i)\\bS0*(\\d+)E0*(\\d+)\\b", "сезон $1 сери $2"] + + headers: + User-Agent: ["Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.203"] + + rows: + selector: tr[id^="tor_"] + + fields: + category: + selector: a.gen + attribute: href + filters: + - name: querystring + args: f + title: + selector: a.tLink + filters: + # normalize to SXXEYY format + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)\\s*(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)", "S$1E$2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?)", "S$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+[CС]езоны?", "S$1"] + - name: re_replace + args: ["(?i)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)", "E$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "E$1"] + - name: re_replace + args: ["(\\([\\p{IsCyrillic}\\W]+\\))|(^[\\p{IsCyrillic}\\W\\d]+\\/ )|([\\p{IsCyrillic} \\-]+,+)|([\\p{IsCyrillic}]+)", "{{ if .Config.stripcyrillic }}{{ else }}$1$2$3$4{{ end }}"] + - name: re_replace + args: ["(?i)\\bHDTV[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bSAT[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bWEB[-\\s]?DL[-\\s]?Rip\\b", "WEB-DL"] + - name: re_replace + args: ["(?i)\\bWEB\\sRip\\b", "WEBRip"] + - name: re_replace + args: ["(?i)\\bWEB\\sDL\\b", "WEB-DL"] + - name: re_replace + args: ["[\\[\\(\\{<«][\\s\\W]*[\\]\\)\\}>»]", ""] + - name: re_replace + args: ["^[\\s&,\\.!\\?\\+\\-_\\|\\/':]+", ""] + - name: append + args: "{{ if .Config.addrussiantotitle }} RUS{{ else }}{{ end }}" + details: + selector: a.tLink + attribute: href + download: + selector: a.tLink + attribute: href + size: + selector: td:nth-child(6) > u + seeders: + selector: td.seedmed + leechers: + selector: td.leechmed + grabs: + selector: td:nth-child(9) + date: + # unix + selector: td:last-child > u + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 + description: + selector: a.tLink +# engine n/a diff --git a/config/prowlarr/Definitions/unionfansub.yml b/config/prowlarr/Definitions/unionfansub.yml new file mode 100644 index 0000000..d5945e2 --- /dev/null +++ b/config/prowlarr/Definitions/unionfansub.yml @@ -0,0 +1,132 @@ +--- +id: unionfansub +name: Union Fansub +description: "Union Fansub is a SPANISH Semi private torrent site focused on ANIME" +language: es-ES +type: semi-private +encoding: UTF-8 +links: + - https://torrent.unionfansub.com/ +legacylinks: + - http://torrent.unionfansub.com/ + +caps: + categorymappings: + - {id: 13, cat: Movies, desc: "Animación"} + - {id: 1, cat: TV/Anime, desc: "Anime"} + - {id: 2, cat: TV/Anime, desc: "Anime/ISO"} + - {id: 3, cat: TV/Anime, desc: "Anime/RAW"} + - {id: 10, cat: Audio, desc: "BSO / OST"} + - {id: 15, cat: Movies, desc: "Cine"} + - {id: 14, cat: TV/Documentary, desc: "Documentales"} + - {id: 9, cat: TV/Anime, desc: "Dorama"} + - {id: 4, cat: TV/Anime, desc: "Hentai"} + - {id: 18, cat: TV/Anime, desc: "Hentai CG"} + - {id: 6, cat: TV/Anime, desc: "Hentai/ISO"} + - {id: 5, cat: TV/Anime, desc: "Hentai/RAW"} + - {id: 16, cat: TV/Anime, desc: "J-Music"} + - {id: 7, cat: TV/Anime, desc: "Manga"} + - {id: 8, cat: TV/Anime, desc: "Manga/Hentai"} + - {id: 17, cat: Books, desc: "Novelas"} + - {id: 12, cat: TV/Other, desc: "Otros"} + - {id: 11, cat: TV, desc: "Programas"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: https://foro.unionfansub.com/member.php + method: post + inputs: + quick_username: "{{ .Config.username }}" + quick_password: "{{ .Config.password }}" + action: do_login + url: "https://torrent.unionfansub.com/" + quick_login: 1 + quick_remember: yes + error: + - selector: div.error + test: + path: / + selector: div#statusbar + +search: + path: browse.php + inputs: + $raw: "{{ range .Categories }}&c{{.}}=1{{end}}" + # 0 active, 1 incldead, 2 onlydead + incldead: 1 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + search: "{{ .Keywords }}" + + rows: + selector: .tlist tr:not(:first-child) + + fields: + category: + selector: td:nth-child(1) a + attribute: href + filters: + - name: querystring + args: cat + title: + selector: td:nth-child(2) a + details: + selector: td:nth-child(2) a + attribute: href + download: + selector: td:nth-child(2) a + attribute: href + filters: + - name: replace + args: ["details.php?id=", "download.php?torrent="] + - name: replace + args: ["&hit=", "&aviso="] + files: + selector: td:nth-last-child(8) + size: + selector: td:nth-last-child(5) + grabs: + selector: td:nth-last-child(4) + seeders: + selector: td:nth-last-child(3) + leechers: + selector: td:nth-last-child(2) + date: + selector: td:nth-last-child(6) + filters: + - name: timeago + downloadvolumefactor: + text: 1 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/uniongang.yml b/config/prowlarr/Definitions/uniongang.yml new file mode 100644 index 0000000..6132858 --- /dev/null +++ b/config/prowlarr/Definitions/uniongang.yml @@ -0,0 +1,195 @@ +--- +id: uniongang +name: UnionGang +description: "UnionGang is a RUSSIAN Private Torrent Tracker for MOVIES / TV / GENERAL" +language: ru-RU +type: private +encoding: windows-1251 +links: + - http://www.uniongang.net/ +legacylinks: + - https://www.uniongang.net/ # site is forcing to http + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Movies SATRip / DVDRip / HDRip"} + - {id: 21, cat: Movies/WEB-DL, desc: "Movies WEB-DLRip / WEB-DL"} + - {id: 2, cat: Movies/HD, desc: "Movies x264"} + - {id: 3, cat: Movies/DVD, desc: "Movies DVD5"} + - {id: 4, cat: Movies/DVD, desc: "Movies DVD9"} + - {id: 5, cat: Movies/HD, desc: "Movies BDRemux / 720p / 1080p / Bl"} + - {id: 6, cat: TV, desc: "TV Сериал"} + - {id: 7, cat: TV/Documentary, desc: "TV Документальный"} + - {id: 19, cat: TV/Sport, desc: "TV Спорт"} + - {id: 8, cat: XXX, desc: "XXX Эротика"} + - {id: 9, cat: TV, desc: "Мультфильм"} + - {id: 10, cat: TV, desc: "КВН Юмор"} + - {id: 11, cat: PC, desc: "Игра PC"} + - {id: 13, cat: Audio, desc: "Музыка / Русская"} + - {id: 14, cat: Audio, desc: "Музыка / Зарубежная"} + - {id: 15, cat: Audio/Video, desc: "Видеоклип"} + - {id: 16, cat: Audio/Audiobook, desc: "Аудиокнига"} + - {id: 20, cat: Movies/3D, desc: "Movies 3D"} + - {id: 23, cat: Movies/UHD, desc: "Movies 4K"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: stripcyrillic + type: checkbox + label: Strip Cyrillic Letters + default: false + - name: addrussiantotitle + type: checkbox + label: Add RUS to end of all titles to improve language detection by Sonarr and Radarr. Will cause English-only results to be misidentified. + default: false + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: div.error + test: + path: / + selector: a[href="/logout.php"] + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 active, 1 incldead, 2 onlydead, 3 goldtorrents, 5 silvertorrents, 4 noseeds + incldead: "{{ if .Config.freeleech }}3{{ else }}1{{ end }}" + + keywordsfilters: + # strip season and/or ep + - name: re_replace + args: ["(?i)\\b(?:[SE]\\d{1,4}){1,2}\\b\\s?", ""] + + rows: + selector: table.embedded > tbody > tr:has(a[href^="download.php?id="]) + + fields: + title: + selector: a[href^="/torrent-"] + filters: + # normalize to SXXEYY format + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)\\s*(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))?", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)\\s*(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "S$1E$2 of $3"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)", "S$1E$2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*[CС]езоны?.+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?).+?(\\d+(?:-\\d+)?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "S$1E$2"] + - name: re_replace + args: ["(?i)[CС]езоны?[\\s:]*(\\d+(?:-\\d+)?)", "S$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+[CС]езоны?", "S$1"] + - name: re_replace + args: ["(?i)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s*из\\s*(\\w?)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "E$1 of $2"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))\\s+из\\s*(\\w?)", "E$1 of $2"] + - name: re_replace + args: ["(?i)(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))[\\s:]*(\\d+(?:-\\d+)?)", "E$1"] + - name: re_replace + args: ["(?i)(\\d+(?:-\\d+)?)\\s+(?:\\s*(?:[CС]ери[ияй]|Эпизод|Выпуски?))", "E$1"] + - name: re_replace + args: ["(?i)\\bР(\\d)?\\b", "P$1"] + - name: re_replace + args: ["(?i)\\sот\\s([\\w\\p{P}\\p{S}]+)\\s\\|(.+)", "$2-$1"] + - name: re_replace + args: ["\\s\\|\\s(\\w{4,})$", "-$1"] + - name: re_replace + args: ["(\\([\\p{IsCyrillic}\\W]+\\))|(^[\\p{IsCyrillic}\\W\\d]+\\/ )|([\\p{IsCyrillic} \\-]+,+)|([\\p{IsCyrillic}]+)", "{{ if .Config.stripcyrillic }}{{ else }}$1$2$3$4{{ end }}"] + - name: re_replace + args: ["(?i)\\bHDTV[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bSAT[-\\s]?Rip\\b", "HDTV"] + - name: re_replace + args: ["(?i)\\bWEB[-\\s]?DL[-\\s]?Rip\\b", "WEB-DL"] + - name: re_replace + args: ["(?i)\\bWEB\\sRip\\b", "WEBRip"] + - name: re_replace + args: ["(?i)\\bWEB\\sDL\\b", "WEB-DL"] + - name: re_replace + args: ["[\\[\\(\\{<«][\\s\\W]*[\\]\\)\\}>»]", ""] + - name: re_replace + args: ["^[\\s&,\\.!\\?\\+\\-_\\|\\/':]+", ""] + - name: append + args: "{{ if .Config.addrussiantotitle }} RUS{{ else }}{{ end }}" + details: + selector: a[href^="/torrent-"] + attribute: href + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + download: + selector: a[href^="download.php?id="] + attribute: href + date: + selector: i + filters: + - name: append + args: " +03:00" # MSK + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + files: + selector: td:nth-last-child(5) + size: + selector: td:nth-last-child(3) + seeders: + selector: td:nth-last-child(2) + filters: + - name: split + args: ["|", 0] + leechers: + selector: td:nth-last-child(2) + filters: + - name: split + args: ["|", 1] + grabs: + selector: td:nth-last-child(1) + downloadvolumefactor: + case: + img[src="pic/freedownload.gif"]: 0 + img[src="pic/silverdownload.gif"]: 0.5 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 0.3 + description: + selector: a[href^="/torrent-"] +# engine tbd diff --git a/config/prowlarr/Definitions/universaltorrents.yml b/config/prowlarr/Definitions/universaltorrents.yml new file mode 100644 index 0000000..f4cc640 --- /dev/null +++ b/config/prowlarr/Definitions/universaltorrents.yml @@ -0,0 +1,185 @@ +--- +id: universaltorrents +name: Universal-Torrents +description: "Universal-Torrents is a GERMAN Private Torrent Tracker for MOVIES / TV / GENERAL" +language: de-DE +type: private +encoding: UTF-8 +links: + - https://uni-track.org/ + +caps: + categorymappings: + - {id: 28, cat: Movies/SD, desc: "Filme SD"} + - {id: 32, cat: Movies/HD, desc: "Filme HD"} + - {id: 114, cat: Movies/UHD, desc: "Filme UHD"} + - {id: 140, cat: Movies/BluRay, desc: "Filme BluRay"} + - {id: 138, cat: Movies, desc: "Filme Pack`s"} + - {id: 60, cat: TV/SD, desc: "Serien SD"} + - {id: 57, cat: TV/HD, desc: "Serien HD"} + - {id: 139, cat: TV/UHD, desc: "Serien UHD"} + - {id: 59, cat: TV, desc: "Serien Pack`s"} + - {id: 110, cat: Audio/MP3, desc: "Audio MP3"} + - {id: 48, cat: Audio/Lossless, desc: "Audio Flac"} + - {id: 52, cat: Audio, desc: "Audio Pack"} + - {id: 63, cat: Audio/Audiobook, desc: "Audio Hörbuch"} + - {id: 120, cat: Audio/Video, desc: "Audio Videos"} + - {id: 12, cat: PC/0day, desc: "Apps Windows"} + - {id: 125, cat: PC/Mac, desc: "Apps Mac-OSX"} + - {id: 11, cat: PC/Mobile-Android, desc: "Apps Mobil"} + - {id: 141, cat: PC, desc: "Apps Other"} + - {id: 15, cat: TV/Documentary, desc: "Doku SD"} + - {id: 14, cat: TV/Documentary, desc: "Doku HD"} + - {id: 123, cat: TV/Documentary, desc: "Doku Reihe"} + - {id: 126, cat: PC/Mobile-Android, desc: "Spiel Mobil"} + - {id: 17, cat: PC/Games, desc: "Spiel PC"} + - {id: 24, cat: Console, desc: "Spiel Konsole"} + - {id: 121, cat: PC/Games, desc: "Spiel Wimmelbild"} + - {id: 62, cat: TV/Sport, desc: "Sport SD"} + - {id: 61, cat: TV/Sport, desc: "Sport HD"} + - {id: 96, cat: Books/Mags, desc: "ePaper Zeitungen"} + - {id: 136, cat: Books/EBook, desc: "ePaper E-Book"} + - {id: 137, cat: Books/Comics, desc: "ePaper Comics"} + - {id: 76, cat: XXX/SD, desc: "XXX SD"} + - {id: 73, cat: XXX/x264, desc: "XXX HD"} + - {id: 75, cat: XXX/Pack, desc: "XXX Pack"} + - {id: 142, cat: XXX/ImageSet, desc: "XXX Pic´s"} + - {id: 129, cat: Movies/SD, desc: "Internal Film SD"} + - {id: 128, cat: Movies/HD, desc: "Internal Film HD"} + - {id: 131, cat: TV/SD, desc: "Internal Serie SD"} + - {id: 130, cat: TV/HD, desc: "Internal Serien HD"} + - {id: 132, cat: Other, desc: "Internal Sonstiges"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeds: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Anzahl der Torrents beim Durchsuchen Torrents per page: setting to 60 on your account profile. The default is 15. + +login: + path: login.php + method: form + cookies: ["JAVA=OK"] # avoid jscheck redirect + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: div#login_error + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: selection.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 name, 1 descr, 2 both + blah: 2 + orderby: "{{ .Config.sort }}" + sort: "{{ .Config.type }}" + # site does not support imdbid searching or display imdb links in results. + + rows: + selector: "div.selection_wrap{{ if .Config.freeleech }}:has(:root:has(div.onlyup)){{ else }}{{ end }}" + filters: + - name: andmatch + + fields: + category_p1: + selector: div.kat_cat_pic_name + category_p2: + selector: div.kat_cat_pic_name_b + categorydesc: + text: "{{ .Result.category_p1 }} {{ .Result.category_p2 }}" + title: + selector: a[href^="details.php?id="] + filters: + - name: re_replace + args: ["^\\[.+?\\]\\s?", ""] + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download_ssl.php?torrent="] + attribute: href + poster: + selector: div[id^="details"] img + attribute: src + size: + selector: div.selection_unter_ad + date_day: + # Heute 13:30:04 + # Gestern 09:10:10 + selector: div.selection_unter_ab:not(:contains(".")) + optional: true + filters: + - name: replace + args: ["Heute", "Today"] + - name: replace + args: ["Gestern", "Yesterday"] + date_year: + # 30.02.2018 um 23:12:50 + selector: div.selection_unter_ab:contains(".") + optional: true + filters: + - name: replace + args: [" um", ""] + - name: append + args: " +01:00" # CET + - name: dateparse + args: "dd.MM.yyyy HH:mm:ss zzz" + date: + text: "{{ if or .Result.date_year .Result.date_day }}{{ or .Result.date_year .Result.date_day }}{{ else }}now{{ end }}" + grabs: + selector: div.selection_unter_ae + seeders: + selector: div.selection_unter_aa + leechers: + selector: div.selection_unter_aaa + downloadvolumefactor: + case: + ":root:has(div.onlyup)": 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# 3xT diff --git a/config/prowlarr/Definitions/unlimitz.yml b/config/prowlarr/Definitions/unlimitz.yml new file mode 100644 index 0000000..f5486a3 --- /dev/null +++ b/config/prowlarr/Definitions/unlimitz.yml @@ -0,0 +1,176 @@ +--- +id: unlimitz +name: Unlimitz +description: "Unlimitz is a THAI Private Torrent Tracker for GENERAL" +language: th-TH +type: private +encoding: windows-874 +links: + - https://www.unlimitz.biz/ + +caps: + categorymappings: + - {id: 84, cat: Audio, desc: "ธรรมะ [Dharma]"} + - {id: 93, cat: TV/Anime, desc: "การ์ตูน [Cartoon]"} + - {id: 112, cat: TV/Sport, desc: "กีฬา [Sport]"} + - {id: 101, cat: Other, desc: "ฟอนต์/ไอคอน/คลิปอาร์ท/เทมเพลท [Fonts, icons, clip art]"} + - {id: 90, cat: TV, desc: "ซีรีย์ (หนังชุด) [Series]"} + - {id: 92, cat: Console, desc: "เกมส์ (non PC) [games]"} + - {id: 91, cat: PC/Games, desc: "เกมส์ (PC) [games]"} + - {id: 100, cat: PC/Mobile-Other, desc: "โปรแกรมที่ใช้บน (มือถือ) [mobiles]"} + - {id: 82, cat: PC, desc: "โปรแกรมที่ใช้บน (Linux)"} + - {id: 83, cat: PC/0day, desc: "โปรแกรมที่ใช้บน (Windows)"} + - {id: 110, cat: Audio, desc: "เพลงไทย [Thai music]"} + - {id: 119, cat: Other, desc: "เลขเด็ด เลขดัง [lucky number]"} + - {id: 81, cat: PC, desc: "ระบบปฏิบัติการ [PC]"} + - {id: 89, cat: Movies/DVD, desc: "ภาพยนตร์ DVD Master [movies]"} + - {id: 120, cat: Movies/3D, desc: "ภาพยนตร์ 3D [ movies]"} + - {id: 114, cat: Movies/DVD, desc: "ภาพยนตร์ DVD Modified [movies]"} + - {id: 98, cat: Movies/DVD, desc: "ภาพยนตร์ DVD Zoom [movies]"} + - {id: 107, cat: Movies/DVD, desc: "ภาพยนตร์ DVD/VCD Rip [movies]"} + - {id: 103, cat: Movies/HD, desc: "ภาพยนตร์ Hi-DeF [movies]"} + - {id: 113, cat: Movies/HD, desc: "ภาพยนตร์ mini Hi-Def [movies]"} + - {id: 88, cat: Movies, desc: "ภาพยนตร์ VCD Master [movies]"} + - {id: 115, cat: Movies, desc: "ภาพยนตร์ VCD Modified [movies]"} + - {id: 99, cat: Movies, desc: "ภาพยนตร์ VCD Zoom [movies]"} + - {id: 97, cat: TV, desc: "รายการทีวี [TV]"} + - {id: 118, cat: Audio, desc: "รายการวิทยุ [radio]"} + - {id: 111, cat: Audio/Video, desc: "มิวสิค วีดีโอ/การแสดงสด/คาราโอเกะ/ทอล์คโชว์ [music video]"} + - {id: 94, cat: Other, desc: "รูปภาพ (ไม่โป๊,ไม่วาบหวิว) [pictures]"} + - {id: 87, cat: Books, desc: "หนังสือ/สื่อการเรียนรู้/นวนิยาย [books]"} + - {id: 96, cat: TV/Documentary, desc: "สารคดี [documentary]"} + - {id: 108, cat: Other/Misc, desc: "อื่นๆ [other]"} + - {id: 106, cat: XXX, desc: "UnlimitZ Pink (Cartoon)"} + - {id: 104, cat: XXX, desc: "UnlimitZ Pink (Censored)"} + - {id: 116, cat: XXX, desc: "UnlimitZ Pink (Game)"} + - {id: 117, cat: XXX, desc: "UnlimitZ Pink (Rated R)"} + - {id: 105, cat: XXX, desc: "UnlimitZ Pink (Uncensored)"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: staffpass + type: text + label: Staff Pass + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img.cimage + input: captcha + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + staffpass: "{{ .Config.staffpass }}" + error: + - selector: td.embedded:has(h2:contains("failed")) + - selector: td.embedded:has(h2:contains("Error")) + test: + path: index.php + selector: a[href="logout.php"] + +download: + selectors: + - selector: a[href^="d.php?keyalert1="] + attribute: href + filters: + - name: replace + args: ["d.php?keyalert1=", "/dI.php/"] + - name: replace + args: ["&keyalert2=", "/"] + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 title, 1 descr, 2 both + blah: 0 + # 0 active, 1 incldead, 2 onlydead + incldead: 1 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + # site does not support imdbid search or provide imdb links in results + + rows: + selector: "table[border=1][cellspacing=0][cellpadding=5] > tbody > tr:has(a[href^=\"details.php?id=\"]){{ if .Config.freeleech }}:has(img[src=\"pic/freedownload.gif\"]){{ else }}{{ end }}" + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="details.php?id="] + attribute: href + files: + selector: td:nth-child(4) + date: + selector: td:nth-child(7) + filters: + - name: append + args: " +07:00" # ICT + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + size: + selector: td:nth-child(8) + grabs: + selector: td:nth-child(9) + seeders: + selector: td:nth-child(10) + leechers: + selector: td:nth-child(11) + downloadvolumefactor: + case: + img[src="pic/freedownload.gif"]: 0 + "*": 1 + uploadvolumefactor: + case: + img[src="icon/upl2.png"]: 2 + img[src="icon/upl3.png"]: 3 + "*": 1 + minimumratio: + text: 1.0 +# Bitcomet 1.52 diff --git a/config/prowlarr/Definitions/uploadcx.yml b/config/prowlarr/Definitions/uploadcx.yml new file mode 100644 index 0000000..6605843 --- /dev/null +++ b/config/prowlarr/Definitions/uploadcx.yml @@ -0,0 +1,165 @@ +--- +id: uploadcx +name: upload.cx +description: "upload.cx is a Private Torrent Tracker for HD MOVIES / TV" +language: en-US +type: private +encoding: UTF-8 +links: + - https://upload.cx/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Movie"} + - {id: 2, cat: TV, desc: "TV Show"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your upload.cx account My Settings page and clicking on the API Key tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + inputs: {} # TODO: remove in v10 + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: "/api/torrents/filter" + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + # if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6 + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + seasonNumber: "{{ .Query.Season }}" + episodeNumber: "{{ .Query.Ep }}" + imdbId: "{{ .Query.IMDBIDShort }}" + tmdbId: "{{ .Query.TMDBID }}" + tvdbId: "{{ .Query.TVDBID }}" + "free[]": "{{ if .Config.freeleech }}100{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + + rows: + selector: data + attribute: attributes + + fields: + category: + selector: category_id + title: + selector: name + details: + selector: details_link + download: + selector: download_link + infohash: + selector: info_hash + poster: + selector: meta.poster + filters: + - name: replace + args: ["https://via.placeholder.com/90x135", ""] + imdbid: + selector: imdb_id + tmdbid: + selector: tmdb_id + tvdbid: + selector: tvdb_id + genre: + selector: meta.genres + filters: + - name: re_replace + args: ["(?i)(Science Fiction)", "Science_Fiction"] + - name: re_replace + args: ["(?i)(TV Movie)", "TV_Movie"] + - name: replace + args: [" & ", "_&_"] + description: + text: "{{ .Result.genre }}" + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0%, 25%, 50%, 75%, 100% + selector: freeleech + case: + 0%: 1 # not free + 25%: 0.75 + 50%: 0.5 + 75%: 0.25 + 100%: 0 # freeleech + "*": 0 # catch errors + uploadvolumefactor: + # api returns False, True + selector: double_upload + case: + False: 1 # normal + True: 2 # double +# global MR is 0.4 but torrents must be seeded for 7 days regardless of ratio +# minimumratio: +# text: 0.4 + minimumseedtime: + # 7 day (as seconds = 7 x 24 x 60 x 60) + text: 604800 +# json UNIT3D 7.1.3 diff --git a/config/prowlarr/Definitions/utopia.yml b/config/prowlarr/Definitions/utopia.yml new file mode 100644 index 0000000..8edc6d5 --- /dev/null +++ b/config/prowlarr/Definitions/utopia.yml @@ -0,0 +1,174 @@ +--- +id: utopia +name: UTOPIA +description: "UTOPIA is a UKRAINIAN Private Tracker for HD MOVIES and TV" +language: uk-UA +type: private +encoding: UTF-8 +links: + - https://utp.to/ + +caps: + categorymappings: + - {id: 1, cat: Movies, desc: "Movies"} + - {id: 2, cat: TV, desc: "TV"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, tvdbid, tmdbid] + movie-search: [q, imdbid, tmdbid] + +settings: + - name: apikey + type: text + label: APIKey + - name: info_key + type: info + label: About your API key + default: "Find or Generate a new API Token by accessing your UTOPIA account My Settings page and clicking on the API Key tab." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: addukrainiantotitle + type: checkbox + label: Add UKR to end of all titles to improve language detection by Sonarr and Radarr. Will cause English-only results to be misidentified. + default: false + - name: sort + type: select + label: Sort requested from site + default: created_at + options: + created_at: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: /api/torrents + method: get + inputs: {} # TODO: remove in v10 + error: + - selector: a[href*="/login"] + message: + text: "The API key was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://github.com/HDInnovations/UNIT3D-Community-Edition/wiki/Torrent-API-(UNIT3D-v7.0.0) + # https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Http/Controllers/API/TorrentController.php#L349 + - path: "/api/torrents/filter" + response: + type: json + + headers: + Authorization: ["Bearer {{ .Config.apikey }}"] + + inputs: + # if we have an id based search, add Season and Episode as query in name for UNIT3D < v6. Else pass S/E Params for UNIT3D >= v6 + $raw: "{{ range .Categories }}&categories[]={{.}}{{end}}" + name: "{{ .Keywords }}" + seasonNumber: "{{ .Query.Season }}" + episodeNumber: "{{ .Query.Ep }}" + imdbId: "{{ .Query.IMDBIDShort }}" + tmdbId: "{{ .Query.TMDBID }}" + tvdbId: "{{ .Query.TVDBID }}" + "free[]": "{{ if .Config.freeleech }}100{{ else }}{{ end }}" + sortField: "{{ .Config.sort }}" + sortDirection: "{{ .Config.type }}" + perPage: 100 + + keywordsfilters: + - name: re_replace + args: ["\\.", " "] + + rows: + selector: data + attribute: attributes + + fields: + category: + selector: category_id + title: + selector: name + filters: + - name: append + args: "{{ if .Config.addukrainiantotitle }} UKR{{ else }}{{ end }}" + details: + selector: details_link + download: + selector: download_link + infohash: + selector: info_hash + poster: + selector: meta.poster + filters: + - name: replace + args: ["https://via.placeholder.com/90x135", ""] + imdbid: + selector: imdb_id + tmdbid: + selector: tmdb_id + tvdbid: + selector: tvdb_id + genre: + selector: meta.genres + filters: + - name: re_replace + args: ["(?i)(Екшн і Пригоди)", "Екшн_і_Пригоди"] + - name: re_replace + args: ["(?i)(Мильна опера)", "Мильна_опера"] + - name: re_replace + args: ["(?i)(Науково фантастичний)", "Науково_фантастичний"] + - name: re_replace + args: ["(?i)(Політика та війна)", "Політика_та_війна"] + description: + text: "{{ .Result.genre }}" + files: + selector: num_file + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + date: + # "created_at": "2021-10-18T00:34:50.000000Z" is returned by Newtonsoft.Json.Linq as 18/10/2021 00:34:50 + selector: created_at + filters: + - name: append + args: " +00:00" # GMT + - name: dateparse + args: "MM/dd/yyyy HH:mm:ss zzz" + size: + selector: size + downloadvolumefactor: + # api returns 0%, 25%, 50%, 75%, 100% + selector: freeleech + case: + 0%: 1 # not free + 25%: 0.75 + 50%: 0.5 + 75%: 0.25 + 100%: 0 # freeleech + "*": 0 # catch errors + uploadvolumefactor: + # api returns False, True + selector: double_upload + case: + False: 1 # normal + True: 2 # double +# global MR is 0.4 but torrents must be seeded for 3 days regardless of ratio +# minimumratio: +# text: 0.4 + minimumseedtime: + # 3 days (as seconds = 3 x 24 x 60 x 60) + text: 259200 +# json UNIT3D 7.0.3 diff --git a/config/prowlarr/Definitions/vsthouse.yml b/config/prowlarr/Definitions/vsthouse.yml new file mode 100644 index 0000000..45c1109 --- /dev/null +++ b/config/prowlarr/Definitions/vsthouse.yml @@ -0,0 +1,72 @@ +--- +id: vsthouse +name: VSTHouse +description: "VSTHouse is a Public Russian site for AUDIO apps, plugins and samples" +language: ru-RU +type: public +encoding: UTF-8 +links: + - http://vsthouse.ru/ # site forces http + +caps: + categories: + PC: PC + + modes: + search: [q] + +settings: [] + +download: + selectors: + - selector: a[title^="Скачать:"] + attribute: href + +search: + paths: + # http://vsthouse.ru/search/?q=drummer&m=load&t=0 + - path: search + inputs: + q: "{{ if .Keywords }}{{ .Keywords }}{{ else }}{{ .Today.Year }}{{ end }}" + m: load + t: 0 + + rows: + selector: table.eBlock:has(div.eDetails:contains(":")) + filters: + - name: andmatch + + fields: + category: + text: PC + title: + selector: div.eTitle a + details: + selector: div.eTitle a + attribute: href + download: + selector: div.eTitle a + attribute: href + description: + selector: div.eDetails + date: + selector: div.eDetails + remove: a, span + filters: + - name: replace + args: ["- ", ""] + - name: append + args: " +03:00" # MSK + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + size: + text: "512 MB" + seeders: + text: 1 + leechers: + text: 1 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine uCoz diff --git a/config/prowlarr/Definitions/vstorrent.yml b/config/prowlarr/Definitions/vstorrent.yml new file mode 100644 index 0000000..e92d3e1 --- /dev/null +++ b/config/prowlarr/Definitions/vstorrent.yml @@ -0,0 +1,61 @@ +--- +id: vstorrent +name: VSTorrent +description: "VSTorrent is a Public site for AUDIO apps, plugins and samples" +language: en-US +type: public +encoding: UTF-8 +links: + - https://vstorrent.org/ + +caps: + categories: + PC: PC + + modes: + search: [q] + +settings: [] + +download: + selectors: + - selector: a[href^="magnet:?xt"] + attribute: href + +search: + paths: + - path: / + inputs: + s: "{{ .Keywords }}" + + rows: + selector: article:has(a) + filters: + - name: andmatch + + fields: + category: + text: PC + title: + selector: .entry-title + details: + selector: .entry-title > a + attribute: href + download: + selector: .entry-title > a + attribute: href + description: + selector: .entry-summary + date: + selector: span.date + size: + text: "512 MB" + seeders: + text: 1 + leechers: + text: 1 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# wordpress 6.2.2 diff --git a/config/prowlarr/Definitions/vsttorrents.yml b/config/prowlarr/Definitions/vsttorrents.yml new file mode 100644 index 0000000..4bd977e --- /dev/null +++ b/config/prowlarr/Definitions/vsttorrents.yml @@ -0,0 +1,65 @@ +--- +id: vsttorrents +name: VST Torrentz +description: "VST Torrentz is a Public site for AUDIO apps, plugins and samples" +language: en-US +type: public +encoding: UTF-8 +links: + - https://vsttorrentz.net/ +legacylinks: + - https://vsttorrents.net/ + - https://looptorrent.net/ + +caps: + categories: + PC: PC + + modes: + search: [q] + +settings: [] + +download: + selectors: + - selector: div.wp-block-file a + attribute: href + +search: + paths: + - path: / + inputs: + s: "{{ .Keywords }}" + + rows: + selector: article:has(.entry-title) + filters: + - name: andmatch + + fields: + category: + text: PC + title: + selector: .entry-title + details: + selector: .entry-title > a + attribute: href + download: + selector: .entry-title > a + attribute: href + description: + selector: .entry-excerpt + date: + selector: time + attribute: datetime + size: + text: "512 MB" + seeders: + text: 1 + leechers: + text: 1 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# wordpress 6.2.2 diff --git a/config/prowlarr/Definitions/wdt.yml b/config/prowlarr/Definitions/wdt.yml new file mode 100644 index 0000000..50b1fc4 --- /dev/null +++ b/config/prowlarr/Definitions/wdt.yml @@ -0,0 +1,186 @@ +--- +id: wdt +name: WDT +description: "Wrestling Desires Torrents (Ultimate Wrestling Torrents) is a Private Torrent Tracker for PROFESSIONAL WRESTLING / MMA" +language: en-US +type: private +encoding: UTF-8 +links: + - http://ultimatewrestlingtorrents.com/ +legacylinks: + - https://ultimatewrestlingtorrents.com/ + +caps: + categorymappings: + # note: when refreshing categories also update $raw + - {id: 14, cat: Audio/Audiobook, desc: "Audiobooks"} + - {id: 16, cat: Audio, desc: "Music Audio"} + - {id: 13, cat: Audio, desc: "Podcasts"} + - {id: 15, cat: Audio, desc: "Wrestling Themes"} + - {id: 29, cat: Books/EBook, desc: "Ebooks"} + - {id: 28, cat: Books/Mags, desc: "Magazines"} + - {id: 30, cat: Books/Other, desc: "Misc"} + - {id: 18, cat: Books/Other, desc: "Wrestling Newsletters"} + - {id: 34, cat: TV/Sport, desc: "Impact Wrestling PPV / One Nig"} + - {id: 9, cat: TV/Sport, desc: "Weekly"} + - {id: 33, cat: TV/Sport, desc: "Xplosion"} + - {id: 32, cat: TV/Sport, desc: "DVDRips"} + - {id: 31, cat: TV/Sport, desc: "DVDs"} + - {id: 20, cat: TV/Sport, desc: "Packs"} + - {id: 19, cat: PC, desc: "Computer Programs"} + - {id: 35, cat: PC/Games, desc: "Games"} + - {id: 36, cat: PC/Mobile-Other, desc: "Mobile Apps"} + - {id: 37, cat: TV/Sport, desc: "Boxing"} + - {id: 38, cat: TV/Sport, desc: "Classics"} + - {id: 12, cat: TV/Documentary, desc: "Documentary"} + - {id: 40, cat: TV, desc: "Indy Other Promotions"} + - {id: 44, cat: TV, desc: "Other MMA"} + - {id: 11, cat: TV, desc: "Other Videos"} + - {id: 42, cat: TV, desc: "Puro NJPW"} + - {id: 43, cat: TV, desc: "Self Defense Tutorials"} + - {id: 21, cat: TV, desc: "Shoots"} + - {id: 22, cat: TV, desc: "TV Episodes"} + - {id: 41, cat: TV/Sport, desc: "UFC"} + - {id: 10, cat: Movies, desc: "Wrestlers Movies"} + - {id: 26, cat: TV/Sport, desc: "Network"} + - {id: 24, cat: TV/Sport, desc: "NXT"} + - {id: 27, cat: TV/Sport, desc: "Other WWE Shows"} + - {id: 17, cat: TV/Sport, desc: "Raw"} + - {id: 23, cat: TV/Sport, desc: "Smackdown"} + - {id: 25, cat: TV/Sport, desc: "WWE PPV"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_results + type: info + label: Search results + default: "If you are getting the error Login Failed, got redirected then access the site with your browser and mark as read all PMs." + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + use_ssl: "" + perm_ssl: "" + returnto: / + error: + - selector: table.main:contains("Login failed!") + message: + selector: table tr td.colhead2 + test: + path: / + selector: a[href*="logout.php?hash_please="] + +search: + paths: + # https://ultimatewrestlingtorrents.com/browse.php?search=&searchin=title&incldead=0&only_free=1 + # note: site uses the catsX[]=nn method which cardigann does not support. without the cats the site returns nothing. so we hardcode all cats. + # https://ultimatewrestlingtorrents.com/browse.php?cats3[]=14&cats3[]=16&cats3[]=13&cats3[]=15&cats5[]=29&cats5[]=28&cats5[]=30&cats5[]=18&cats1[]=34&cats1[]=9&cats1[]=33&cats6[]=32&cats6[]=31&cats6[]=20&cats7[]=19&cats7[]=35&cats7[]=36&cats2[]=37&cats2[]=38&cats2[]=12&cats2[]=40&cats2[]=44&cats2[]=11&cats2[]=42&cats2[]=43&cats2[]=21&cats2[]=22&cats2[]=41&cats2[]=10&cats4[]=26&cats4[]=24&cats4[]=27&cats4[]=17&cats4[]=23&cats4[]=25&search=&searchin=title&incldead=1 + - path: browse.php + inputs: + $raw: "cats3[]=14&cats3[]=16&cats3[]=13&cats3[]=15&cats5[]=29&cats5[]=28&cats5[]=30&cats5[]=18&cats1[]=34&cats1[]=9&cats1[]=33&cats6[]=32&cats6[]=31&cats6[]=20&cats7[]=19&cats7[]=35&cats7[]=36&cats2[]=37&cats2[]=38&cats2[]=12&cats2[]=40&cats2[]=44&cats2[]=11&cats2[]=42&cats2[]=43&cats2[]=21&cats2[]=22&cats2[]=41&cats2[]=10&cats4[]=26&cats4[]=24&cats4[]=27&cats4[]=17&cats4[]=23&cats4[]=25" + search: "{{ .Keywords }}" + # title, descr, genre, all + searchin: title + # 0 active, 1 incldead, 2 onlydead + incldead: 1 + only_free: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + + keywordsfilters: + - name: re_replace + args: ["(\\w+)", "+$1"] # prepend + to each word + + rows: + selector: table.table-bordered tr:has(a[href^="download.php?torrent="]) + filters: + - name: andmatch + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + attribute: onmouseover + filters: + - name: regexp + args: "Tip\\('(.+?)" + download: + selector: a[href^="download.php?torrent="] + attribute: href + details: + selector: a[href^="details.php?id="] + attribute: href + files: + selector: td:nth-child(5) + date: + selector: td:nth-child(7) + # auto adjusted by site account profile + filters: + - name: dateparse + args: "MMM d yyyy hh:mm tt" + size: + selector: td:nth-child(8) + grabs: + selector: td:nth-child(9) + seeders: + selector: td:nth-child(10) + leechers: + selector: td:nth-child(11) + description: + case: + img[src="./pic/mod.gif"]: Verified + "*": Unverified + downloadvolumefactor: + case: + "a.info:contains(\"[FREE]\")": 0 + "a.info:contains(\"[SILVER]\")": 0.5 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 12 hours (as seconds = 12 x 60 x 60) + text: 43200 +# U-232 V5 diff --git a/config/prowlarr/Definitions/whiteangel.yml b/config/prowlarr/Definitions/whiteangel.yml new file mode 100644 index 0000000..4aa5889 --- /dev/null +++ b/config/prowlarr/Definitions/whiteangel.yml @@ -0,0 +1,186 @@ +--- +id: whiteangel +name: White Angel +description: "White Angel is a HUNGARIAN Private Tracker for MOVIES / TV" +language: hu-HU +type: private +encoding: ISO-8859-2 +links: + - https://white-angel.hu/ + +caps: + categorymappings: + - {id: 39, cat: Books/EBook, desc: "E-book"} + - {id: 53, cat: XXX, desc: "Film (XXX)"} + - {id: 74, cat: TV/Anime, desc: "Film (Animáció cam)"} + - {id: 72, cat: TV/Anime, desc: "Film (Animáció)"} + - {id: 44, cat: Movies/SD, desc: "Film (Cam Hun)"} + - {id: 40, cat: Movies/DVD, desc: "Film (DVD Eng)"} + - {id: 41, cat: Movies/DVD, desc: "Film (DVD Hun)"} + - {id: 57, cat: Movies/HD, desc: "Film (HD Eng)"} + - {id: 38, cat: Movies/HD, desc: "Film (HD Hun)"} + - {id: 42, cat: Movies/SD, desc: "Film (Xvid Eng)"} + - {id: 73, cat: Movies/SD, desc: "Film (Xvid Eng-Hun)"} + - {id: 43, cat: Movies/SD, desc: "Film (Xvid Hun)"} + - {id: 69, cat: XXX/x264, desc: "Film (XXX HD)"} + - {id: 63, cat: Movies/SD, desc: "Film (Cam Eng)"} + - {id: 71, cat: Audio/Audiobook, desc: "Hangos könyv"} + - {id: 45, cat: PC/Games, desc: "Játék ISO"} + - {id: 46, cat: Console/PS3, desc: "Játék Ps2"} + - {id: 66, cat: PC/Games, desc: "Játék Rip"} + - {id: 47, cat: Console/XBox, desc: "Játék Xbox"} + - {id: 70, cat: XXX/Other, desc: "Játék XXX"} + - {id: 48, cat: Other, desc: "Képek"} + - {id: 65, cat: TV/Anime, desc: "Mese Eng"} + - {id: 49, cat: TV/Anime, desc: "Mese Hun"} + - {id: 50, cat: PC/Mobile-Other, desc: "Mobil"} + - {id: 52, cat: TV, desc: "Sorozat (Hun Xvid)"} + - {id: 59, cat: TV, desc: "Sorozat (Xvid Eng)"} + - {id: 68, cat: PC/ISO, desc: "Win/Program/ISO"} + - {id: 51, cat: PC/0day, desc: "Win/Program/Rip"} + - {id: 54, cat: XXX/ImageSet, desc: "XXX/Kép"} + - {id: 55, cat: Audio, desc: "Zene/Eng"} + - {id: 56, cat: Audio, desc: "Zene/Hun"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + book-search: [q] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search FreeLeech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 1: title + 4: added + 5: size + 7: seeders + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrentek száma egy oldalon: setting to 100 on your account profile. + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: table:contains("bejelentkezés nem sikerült") + test: + path: index.php + selector: a[href^="logout.php?k="] + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" # for dashboard imdbid search + # 0 active, 1 all, 2 deadonly, 3 freeleech, 4 x2, 5 myuploads, 6 requests, 7 seedbox + incldead: "{{ if .Config.freeleech }}3{{ else }}1{{ end }}" + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + # can search by genre but you need the id. &description=8 for Drama. + + rows: + selector: table[cellpadding="5"] tbody tr:has(a[href^="download.php?torrent="]) + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + # can be abbreviated + selector: a[href^="javascript:torrent"] b + title: + # usually full length + selector: a[href^="javascript:torrent"] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + _id: + selector: a[href^="javascript:torrent"] + attribute: href + filters: + - name: regexp + args: (\d+) + details: + text: "details.php?id={{ .Result._id }}" + poster: + selector: a[onmouseover] + attribute: onmouseover + filters: + - name: regexp + args: "src=(.*?) " + - name: prepend + args: "https:" + download: + selector: a[href^="download.php?torrent="] + attribute: href + genre: + selector: font[color="#C0C0C0"] + filters: + - name: replace + args: ["\xA0", ""] + description: + text: "{{ .Result.genre }}" + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + date: + selector: td:nth-last-child(5) + filters: + - name: append + args: " +01:00" # CET + - name: replace + args: ["\xA0", " "] + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + size: + selector: td:nth-last-child(4) + grabs: + selector: td:nth-last-child(3) + seeders: + selector: td:nth-last-child(2) + leechers: + selector: td:last-child + downloadvolumefactor: + case: + img[src="pic/ingyen.gif"]: 0 + "*": 1 + uploadvolumefactor: + case: + "font:contains(\"[x2]\")": 2 + "*": 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 1 day (as seconds = 1 x 24 x 60 x 60) + text: 86400 +# engine n/a diff --git a/config/prowlarr/Definitions/wihd.yml b/config/prowlarr/Definitions/wihd.yml new file mode 100644 index 0000000..beac9da --- /dev/null +++ b/config/prowlarr/Definitions/wihd.yml @@ -0,0 +1,224 @@ +--- +id: wihd +name: World-In-HD +description: "Your world in HD" +language: fr-FR +type: private +encoding: UTF-8 +links: + - https://world-in-hd.net/ + +caps: + # dont forget to update the search fields category (and size) case block(s) + categorymappings: + - {id: 565af82b1fd35761568b4572, cat: Movies/HD, desc: "1080p"} + - {id: 565af82b1fd35761568b4574, cat: Movies/HD, desc: "720p"} + - {id: 565af82b1fd35761568b4576, cat: Movies/HD, desc: "HDTV"} + - {id: 565af82b1fd35761568b4578, cat: Movies/HD, desc: "Bluray"} + - {id: 565af82b1fd35761568b457a, cat: Movies/HD, desc: "Bluray Remux"} + - {id: 565af82b1fd35761568b457c, cat: Movies/HD, desc: "Bluray 3D"} + - {id: 565af82d1fd35761568b4587, cat: TV/HD, desc: "1080p"} + - {id: 565af82d1fd35761568b4589, cat: TV/HD, desc: "720p"} + - {id: 565af82d1fd35761568b458b, cat: TV/HD, desc: "HDTV"} + - {id: 565af82d1fd35761568b458d, cat: TV/HD, desc: "Bluray"} + - {id: 565af82d1fd35761568b458f, cat: TV/HD, desc: "Bluray Remux"} + - {id: 565af82d1fd35761568b4591, cat: TV/HD, desc: "Bluray 3D"} + - {id: 565af82d1fd35761568b459c, cat: TV/Anime, desc: "1080p"} + - {id: 565af82d1fd35761568b459e, cat: TV/Anime, desc: "720p"} + - {id: 565af82d1fd35761568b45a0, cat: TV/Anime, desc: "HDTV"} + - {id: 565af82d1fd35761568b45a2, cat: TV/Anime, desc: "Bluray"} + - {id: 565af82d1fd35761568b45a4, cat: TV/Anime, desc: "Bluray Remux"} + - {id: 565af82d1fd35761568b45a6, cat: TV/Anime, desc: "Bluray 3D"} + - {id: 565af82d1fd35761568b45af, cat: PC/0day, desc: "software"} + - {id: 565af82d1fd35761568b45b1, cat: Audio/Video, desc: "clips"} + - {id: 565af82d1fd35761568b45b3, cat: Audio/Other, desc: "Audio tracks"} + - {id: 565af82d1fd35761568b45b5, cat: TV/Documentary, desc: "documentaries"} + - {id: 565af82d1fd35761568b45b7, cat: Movies/HD, desc: "Bluray"} + - {id: 59591f0807fd301b6eaa7a8f, cat: Movies/HD, desc: "1080p"} + - {id: 595cd82e07fd301b6eaa7a90, cat: Movies/HD, desc: "720p"} + - {id: 59e67c0ed5b6a3e689dd1e1f, cat: Movies/UHD, desc: "Bluray 4K"} + - {id: 59e488174a23a800358b4567, cat: Movies/UHD, desc: "Bluray Remux 4K"} + - {id: 5a64af02ee30983a7e596aed, cat: Movies/HD, desc: "WEB-DL"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: multilang + type: checkbox + label: Replace MULTi by another language in release name + default: false + - name: multilanguage + type: select + label: Replace MULTi by this language + default: FRENCH + options: + FRENCH: FRENCH + MULTi FRENCH: MULTi FRENCH + ENGLISH: ENGLISH + MULTi ENGLISH: MULTi ENGLISH + VOSTFR: VOSTFR + MULTi VOSTFR: MULTi VOSTFR + - name: vostfr + type: checkbox + label: Replace VOSTFR and SUBFRENCH with ENGLISH + default: false + +login: + path: login + method: form + form: form#login-form + inputs: + _username: "{{ .Config.username }}" + _password: "{{ .Config.password }}" + _remember_me: on + error: + - selector: :contains("\"success\":false") + test: + path: torrents + selector: a[href*="logout"] + +search: + paths: + - path: torrent/ajaxfiltertorrent/{{ .Keywords }} + keywordsfilters: + - name: re_replace + args: ["^$", "null"] + inputs: + $raw: "{{ range .Categories }}subcat[]={{.}}&{{end}}" + exclu: 0 + freeleech: "{{ if .Config.freeleech }}1{{ else }}0{{ end }}" + reseed: 0 + + rows: + selector: div.torrent-item + filters: + - name: andmatch + + fields: + title_phase1: + selector: a.torrentlink + attribute: title + filters: + - name: re_replace + args: ["(?i)(SEASON|SAISON) (\\d\\d)", "S$2"] + - name: re_replace + args: ["(?i)(SEASON|SAISON) (\\d)", "S0$2"] + title_vostfr: + text: "{{ .Result.title_phase1 }}" + filters: + - name: re_replace + args: ["(?i)\\b(vostfr|subfrench)\\b", "ENGLISH"] + title_phase2: + text: "{{ if .Config.vostfr }}{{ .Result.title_vostfr }}{{ else }}{{ .Result.title_phase1 }}{{ end }}" + title_multilang: + text: "{{ .Result.title_phase2 }}" + filters: + - name: re_replace + args: ["(?i)\\b(MULTI(?!.*(?:FRENCH|ENGLISH|VOSTFR)))\\b", "{{ .Config.multilanguage }}"] + title: + text: "{{ if .Config.multilang }}{{ .Result.title_multilang }}{{ else }}{{ .Result.title_phase2 }}{{ end }}" + poster: + selector: a.torrentlink > img.img-responsive + attribute: src + details: + selector: a.torrentlink + attribute: href + category: + selector: div.category + case: + ":contains(\"Films\"):contains(\"1080p\")": "565af82b1fd35761568b4572" + ":contains(\"Films\"):contains(\"720p\")": "565af82b1fd35761568b4574" + ":contains(\"Films\"):contains(\"HDTV\")": "565af82b1fd35761568b4576" + ":contains(\"Films\"):contains(\"Bluray Remux\")": "565af82b1fd35761568b457a" + ":contains(\"Films\"):contains(\"Bluray 3D\")": "565af82b1fd35761568b457c" + ":contains(\"Films\"):contains(\"Bluray Remux 4K\")": "59e488174a23a800358b4567" + ":contains(\"Films\"):contains(\"Bluray 4K\")": "59e67c0ed5b6a3e689dd1e1f" + ":contains(\"Films\"):contains(\"Bluray\")": "565af82b1fd35761568b4578" + ":contains(\"Films\"):contains(\"WEB-DL\")": "5a64af02ee30983a7e596aed" + ":contains(\"Séries\"):contains(\"1080p\")": "565af82d1fd35761568b4587" + ":contains(\"Séries\"):contains(\"720p\")": "565af82d1fd35761568b4589" + ":contains(\"Séries\"):contains(\"HDTV\")": "565af82d1fd35761568b458b" + ":contains(\"Séries\"):contains(\"Bluray Remux\")": "565af82d1fd35761568b458f" + ":contains(\"Séries\"):contains(\"Bluray 3D\")": "565af82d1fd35761568b4591" + ":contains(\"Séries\"):contains(\"Bluray\")": "565af82d1fd35761568b458d" + ":contains(\"Animations\"):contains(\"1080p\")": "565af82d1fd35761568b459c" + ":contains(\"Animations\"):contains(\"720p\")": "565af82d1fd35761568b459e" + ":contains(\"Animations\"):contains(\"HDTV\")": "565af82d1fd35761568b45a0" + ":contains(\"Animations\"):contains(\"Bluray Remux\")": "565af82d1fd35761568b45a4" + ":contains(\"Animations\"):contains(\"Bluray 3D\")": "565af82d1fd35761568b45a6" + ":contains(\"Animations\"):contains(\"Bluray\")": "565af82d1fd35761568b45a2" + ":contains(\"Divers\"):contains(\"Logiciels\")": "565af82d1fd35761568b45af" + ":contains(\"Divers\"):contains(\"Clips\")": "565af82d1fd35761568b45b1" + ":contains(\"Divers\"):contains(\"Pistes audios\")": "565af82d1fd35761568b45b3" + ":contains(\"Divers\"):contains(\"Documentaires\")": "565af82d1fd35761568b45b5" + ":contains(\"Divers\"):contains(\"Bluray\")": "565af82d1fd35761568b45b7" + ":contains(\"Divers\"):contains(\"1080p\")": "59591f0807fd301b6eaa7a8f" + ":contains(\"Divers\"):contains(\"720p\")": "595cd82e07fd301b6eaa7a90" + "*": "" + size: # actuall size is not provided, use some default values to make clients happy + selector: div.category + case: + ":contains(\"Films\"):contains(\"1080p\")": "5GB" + ":contains(\"Films\"):contains(\"720p\")": "4GB" + ":contains(\"Films\"):contains(\"HDTV\")": "3GB" + ":contains(\"Films\"):contains(\"Bluray Remux\")": "20GB" + ":contains(\"Films\"):contains(\"Bluray 3D\")": "20GB" + ":contains(\"Films\"):contains(\"Bluray Remux 4K\")": "40GB" + ":contains(\"Films\"):contains(\"Bluray 4K\")": "40GB" + ":contains(\"Films\"):contains(\"Bluray\")": "20GB" + ":contains(\"Films\"):contains(\"WEB-DL\")": "5GB" + ":contains(\"Séries\"):contains(\"1080p\")": "3GB" + ":contains(\"Séries\"):contains(\"720p\")": "2GB" + ":contains(\"Séries\"):contains(\"HDTV\")": "1GB" + ":contains(\"Séries\"):contains(\"Bluray Remux\")": "20GB" + ":contains(\"Séries\"):contains(\"Bluray 3D\")": "20GB" + ":contains(\"Séries\"):contains(\"Bluray\")": "20GB" + ":contains(\"Animations\"):contains(\"1080p\")": "3GB" + ":contains(\"Animations\"):contains(\"720p\")": "2GB" + ":contains(\"Animations\"):contains(\"HDTV\")": "1GB" + ":contains(\"Animations\"):contains(\"Bluray Remux\")": "20GB" + ":contains(\"Animations\"):contains(\"Bluray 3D\")": "20GB" + ":contains(\"Animations\"):contains(\"Bluray\")": "20GB" + ":contains(\"Divers\"):contains(\"Logiciels\")": "0" + ":contains(\"Divers\"):contains(\"Clips\")": "1GB" + ":contains(\"Divers\"):contains(\"Pistes audios\")": "1GB" + ":contains(\"Divers\"):contains(\"Documentaires\")": "1GB" + ":contains(\"Divers\"):contains(\"Bluray\")": "20GB" + ":contains(\"Divers\"):contains(\"1080p\")": "5GB" + ":contains(\"Divers\"):contains(\"720p\")": "4GB" + "*": "" + download: + selector: div.download-item > a + attribute: href + seeders: + selector: div.seeders + filters: + - name: re_replace + args: ["^$", "999"] + leechers: + selector: div.leechers + filters: + - name: re_replace + args: ["^$", "999"] + grabs: + selector: div.completed + downloadvolumefactor: + case: + div.fl-label: 0 + "*": 1 + uploadvolumefactor: + text: 1 +# engine tbd diff --git a/config/prowlarr/Definitions/wintersakura.yml b/config/prowlarr/Definitions/wintersakura.yml new file mode 100644 index 0000000..0b91fa6 --- /dev/null +++ b/config/prowlarr/Definitions/wintersakura.yml @@ -0,0 +1,207 @@ +--- +id: wintersakura +name: WinterSakura +description: "WinterSakura is a CHINESE Private Torrent Tracker for MOVIES / TV / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +requestDelay: 2 +links: + - https://wintersakura.net/ + +caps: + categorymappings: + # torrents.php + - {id: 409, cat: Other, desc: "Misc其他", default: true} + - {id: 407, cat: TV/Sport, desc: "Sports体育", default: true} + - {id: 406, cat: Audio/Video, desc: "Music Videos音乐MV", default: true} + - {id: 408, cat: Audio, desc: "HQ Audio无损音乐", default: true} + - {id: 418, cat: TV, desc: "TV Shows综艺(分集)", default: true} + - {id: 403, cat: TV, desc: "TV Shows综艺(Packs合集)", default: true} + - {id: 402, cat: TV, desc: "TV Series剧集(分集)", default: true} + - {id: 414, cat: TV, desc: "TV Series剧集(Packs合集)", default: true} + - {id: 413, cat: TV/Anime, desc: "Animation series动漫剧集(分集)", default: true} + - {id: 423, cat: TV/Anime, desc: "Animation series动漫剧集(Packs合集)", default: true} + - {id: 422, cat: TV/Anime, desc: "Animation flims动漫电影", default: true} + - {id: 410, cat: TV/Documentary, desc: "Documentaries纪录片", default: true} + - {id: 401, cat: Movies, desc: "Movies电影", default: true} + # special.php + - {id: 427, cat: PC, desc: "Software软件/程序/代码", default: false} + - {id: 426, cat: Books/Technical, desc: "Papers期刊/论文", default: false} + - {id: 428, cat: Books/EBook, desc: "Books图书", default: false} + - {id: 425, cat: Other, desc: "Database数据/数据库", default: false} + - {id: 424, cat: Other, desc: "Course课程", default: false} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: 2facode + type: text + label: 2FA code + - name: info_2fa + type: info + label: "About 2FA code" + default: "Only fill in the 2FA code box if you have enabled 2FA on the WinterSakura Web Site. Otherwise just leave it empty." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + secret: "" + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + two_step_code: "{{ .Config.2facode }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("失败")) + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + categories: [409, 407, 406, 408, 418, 403, 402, 414, 413, 423, 422, 410, 401] + - path: special.php + categories: [427, 426, 428, 425, 424] + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl + search_area: "{{ if or .Query.IMDBID .Query.DoubanID }}1{{ else }}0{{ end }}" + # 0 AND, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(a[href^="details.php?id="]) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: img[data-src] + attribute: data-src + imdbid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="imdb.com/title/tt"] + attribute: href + doubanid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="movie.douban.com/subject/"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-child(5) + seeders: + selector: td.rowfollow:nth-child(6) + leechers: + selector: td.rowfollow:nth-child(7) + grabs: + selector: td.rowfollow:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumratio: + text: 0.4 + description: + selector: td.rowfollow:nth-child(2) + remove: a, b, font, img, span +# NexusPHP v1.8.7 2023-09-04 diff --git a/config/prowlarr/Definitions/world-of-tomorrow.yml b/config/prowlarr/Definitions/world-of-tomorrow.yml new file mode 100644 index 0000000..ea573d7 --- /dev/null +++ b/config/prowlarr/Definitions/world-of-tomorrow.yml @@ -0,0 +1,189 @@ +--- +id: world-of-tomorrow +name: World-of-Tomorrow +description: "World-of-Tomorrow is a Private German tracker" +language: de-DE +type: private +encoding: UTF-8 +links: + - https://w-o-t.pro/ +legacylinks: + - https://world-of-tomorrow.eu/ + - https://wotreworked.xyz/ + +caps: + categorymappings: + - {id: 14, cat: Audio/MP3, desc: "Alben / Sampler / Singles"} + - {id: 87, cat: TV/Anime, desc: "Anime"} + - {id: 105, cat: TV/Anime, desc: "Anime Serien"} + - {id: 18, cat: PC, desc: "Appz-Sonstige"} + - {id: 64, cat: TV/Documentary, desc: "Dokumentation"} + - {id: 19, cat: Books/EBook, desc: "Ebooks"} + - {id: 111, cat: XXX, desc: "Englisch Section"} + - {id: 70, cat: Audio/Lossless, desc: "Flac"} + - {id: 75, cat: TV/Sport, desc: "Formel 1"} + - {id: 74, cat: TV/Sport, desc: "Fussball"} + - {id: 36, cat: Audio/Audiobook, desc: "Hörbuch"} + - {id: 101, cat: TV, desc: "Kids"} + - {id: 5, cat: Console, desc: "Konsolen-Games"} + - {id: 107, cat: PC/Mac, desc: "MAC-Programme"} + - {id: 91, cat: Movies, desc: "Movie-Packs"} + - {id: 11, cat: Movies/DVD, desc: "Movies DVD / HD2DVD"} + - {id: 89, cat: Movies/UHD, desc: "Movies UHD"} + - {id: 49, cat: Movies/HD, desc: "Movies-1080p"} + - {id: 90, cat: Movies/3D, desc: "Movies-3-D"} + - {id: 48, cat: Movies/HD, desc: "Movies-720p"} + - {id: 47, cat: Movies/BluRay, desc: "Movies-Bluray"} + - {id: 60, cat: Movies/HD, desc: "Movies-HDTV"} + - {id: 62, cat: Movies/SD, desc: "Movies-SD"} + - {id: 72, cat: Audio, desc: "Musik-Packs"} + - {id: 93, cat: Audio/Video, desc: "Musik-Videos"} + - {id: 4, cat: PC/Games, desc: "PC-Games"} + - {id: 79, cat: TV/HD, desc: "Serien-1080P"} + - {id: 95, cat: TV/UHD, desc: "Serien-2160P"} + - {id: 78, cat: TV/HD, desc: "Serien-720P"} + - {id: 100, cat: TV/HD, desc: "Serien-Packs-HD"} + - {id: 16, cat: TV/SD, desc: "Serien-Packs-SD"} + - {id: 77, cat: TV/SD, desc: "Serien-SD"} + - {id: 96, cat: Other, desc: "Sonstiges"} + - {id: 71, cat: Audio, desc: "Soundtracks"} + - {id: 73, cat: TV/Sport, desc: "Sport"} + - {id: 92, cat: Console, desc: "Wimmelbild"} + - {id: 28, cat: PC, desc: "Windows-Programme"} + - {id: 108, cat: Movies, desc: "WOTT-Filme"} + - {id: 108, cat: TV, desc: "WOTT-Filme"} + - {id: 109, cat: TV, desc: "WOTT-SERIEN"} + - {id: 110, cat: Audio, desc: "WOTT-MUSIK"} + - {id: 23, cat: TV/Sport, desc: "Wrestling"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: pin + type: text + label: Pin + - name: freeleech + type: checkbox + label: Filter FreeLeech only + default: false + - name: onlyupload + type: checkbox + label: Filter OnlyUpload only + default: false + - name: info_free + type: info + label: About Freeleech and OnlyUpload at World-of-Tomorrow + default: "
    • FreeLeech are torrents where neither the download or upload is counted. (On the Prowlarr search results page these are tagged as NoUpload).
    • OnlyUpload are torrents where download is not counted but upload is. Good for building your Ratio up. (On the Prowlarr search results page these are tagged as Freeleech).
    " + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeds: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents pro Seite: setting to 100 on your Control Panel. The default is 15. + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + pin: "{{ .Config.pin }}" + error: + - selector: table.tableinborder:contains("Login fehlgeschlagen!") + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + showsearch: 1 + search: "{{ .Keywords }}" + # 0 active, 1 all, 2 dead + incldead: 1 + orderby: "{{ .Config.sort }}" + sort: "{{ .Config.type }}" + + rows: + selector: "table.tableinborder[border=\"0\"][cellspacing=\"1\"][cellpadding=\"4\"][style=\"width:100%\"] > tbody > tr:has(a[href^=\"download.php\"]){{ if .Config.freeleech }}:has(img[src=\"pic/freeleech.gif\"]){{ else }}{{ end }}{{ if .Config.onlyupload }}:has(img[src=\"pic/oupic.gif\"]){{ else }}{{ end }}" + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] > b + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?torrent="] + attribute: href + poster: + selector: a[href^="details.php?id="] + attribute: onMouseOver + filters: + - name: regexp + args: "src=(.+?) " + description: + selector: td:nth-child(2) > img + attribute: title + grabs: + selector: td:nth-last-child(8) + date: + selector: td:nth-last-child(6) + filters: + - name: append + args: " +01:00" # CET + - name: dateparse + args: "dd.MM.yyyyHH:mm:ss zzz" + size: + selector: td:nth-last-child(5) + seeders: + selector: td:nth-last-child(4) + leechers: + selector: td:nth-last-child(3) + downloadvolumefactor: + case: + img[src="pic/oupic.gif"]: 0 # only upload is counted + "*": 1 + uploadvolumefactor: + case: + img[src="pic/freeleech.gif"]: 0 # nothing is counted + "*": 1 + minimumratio: + text: 0.7 + minimumseedtime: + # 3 days (as seconds = 3 x 24 x 60 x 60) + text: 259200 +# WoT Reworked v8.2.1 diff --git a/config/prowlarr/Definitions/wukong.yml b/config/prowlarr/Definitions/wukong.yml new file mode 100644 index 0000000..2e0df55 --- /dev/null +++ b/config/prowlarr/Definitions/wukong.yml @@ -0,0 +1,181 @@ +--- +id: wukong +name: Wukong +description: "Wukong (悟空问道) is a CHINESE Private Torrent Tracker for E-LEARNING" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://wukongwendao.top/ + +caps: + categorymappings: + - {id: 402, cat: Other, desc: "模型"} + - {id: 407, cat: Other, desc: "整合包"} + - {id: 401, cat: Other, desc: "源码"} + - {id: 408, cat: Other, desc: "音乐生成"} + - {id: 406, cat: Other, desc: "文字语料"} + - {id: 403, cat: Other, desc: "训练教程"} + - {id: 405, cat: Other, desc: "动画生成"} + - {id: 411, cat: Other, desc: "作品"} + - {id: 404, cat: Books/Technical, desc: "文档"} + - {id: 410, cat: Books/Technical, desc: "电子书"} + - {id: 409, cat: Other/Misc, desc: "其他"} + + modes: + search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: 2facode + type: text + label: 2FA code + - name: info_2fa + type: info + label: "About 2FA code" + default: "Only fill in the 2FA code box if you have enabled 2FA on the Wukong Web Site. Otherwise just leave it empty." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + captcha: + type: image + selector: img[alt="CAPTCHA"] + input: imagestring + inputs: + secret: "" + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + two_step_code: "{{ .Config.2facode }}" + logout: "" + securelogin: "" + ssl: yes + trackerssl: yes + error: + - selector: td.embedded:has(h2:contains("失败")) + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl + search_area: 0 + # 0 AND, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(a[href^="download.php?id="]) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + poster: + selector: img[data-src] + attribute: data-src + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-child(5) + seeders: + selector: td.rowfollow:nth-child(6) + leechers: + selector: td.rowfollow:nth-child(7) + grabs: + selector: td.rowfollow:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + description: + selector: td:nth-child(2) + remove: a, b, font, img, span +# NexusPHP v1.8.8 2023-09-25 diff --git a/config/prowlarr/Definitions/x-ite.me.yml b/config/prowlarr/Definitions/x-ite.me.yml new file mode 100644 index 0000000..d61d663 --- /dev/null +++ b/config/prowlarr/Definitions/x-ite.me.yml @@ -0,0 +1,164 @@ +--- +id: xiteme +name: x-ite.me +description: "Tracker for LGBTQ movies, TV, books, magazines, anime, PC and 3X." +language: en-US +type: private +encoding: UTF-8 +certificates: + - 2d87b2e1d4f59237f78642930c230d0495d43d4c # expired 09 Sept 2023 +links: + - https://x-ite.me/ + +caps: + categorymappings: + - {id: 6700, cat: TV/Anime, desc: "Animations - Adult"} + - {id: 6100, cat: TV/Anime, desc: "Animations - Anime"} + - {id: 6340, cat: TV/Anime, desc: "Animations - Bara"} + - {id: 6110, cat: TV/Anime, desc: "Animations - Ecchi"} + - {id: 6350, cat: TV/Anime, desc: "Animations - Furry"} + - {id: 6330, cat: TV/Anime, desc: "Animations - Futanari"} + - {id: 6300, cat: TV/Anime, desc: "Animations - Hentai"} + - {id: 6900, cat: TV/Anime, desc: "Animations - Other"} + - {id: 6120, cat: TV/Anime, desc: "Animations - Shoujo Ai"} + - {id: 6130, cat: TV/Anime, desc: "Animations - Shounen Ai"} + - {id: 6320, cat: TV/Anime, desc: "Animations - Yaoi"} + - {id: 6310, cat: TV/Anime, desc: "Animations - Yuri"} + - {id: 14000, cat: PC, desc: "Applications - All"} + - {id: 11000, cat: Audio/Audiobook, desc: "Audio Books - All"} + - {id: 10000, cat: Books, desc: "Books - All"} + - {id: 9700, cat: Books/Comics, desc: "Comics & Manga - Adult"} + - {id: 9600, cat: Books/Comics, desc: "Comics & Manga - Cartoon"} + - {id: 9200, cat: Books/Comics, desc: "Comics & Manga - Hentai"} + - {id: 9100, cat: Books/Comics, desc: "Comics & Manga - Manga"} + - {id: 9900, cat: Books/Comics, desc: "Comics & Manga - Other"} + - {id: 5000, cat: XXX, desc: "Fetish - All"} + - {id: 13000, cat: PC/Games, desc: "Games - All"} + - {id: 4000, cat: XXX, desc: "Hardcore - All"} + - {id: 7500, cat: XXX/ImageSet, desc: "Images - Adult"} + - {id: 7300, cat: XXX/ImageSet, desc: "Images - Erotic"} + - {id: 7700, cat: XXX/ImageSet, desc: "Images - Fetish"} + - {id: 7900, cat: XXX/ImageSet, desc: "Images - Other"} + - {id: 8000, cat: Books/Mags, desc: "Magazines - All"} + - {id: 1010, cat: Movies, desc: "Movies - Action"} + - {id: 1030, cat: Movies, desc: "Movies - Adventure"} + - {id: 1050, cat: Movies, desc: "Movies - Biography"} + - {id: 1070, cat: Movies, desc: "Movies - Bollywood"} + - {id: 1090, cat: Movies, desc: "Movies - Comedy"} + - {id: 1110, cat: Movies, desc: "Movies - Coming of Age"} + - {id: 1130, cat: Movies, desc: "Movies - Coming Out"} + - {id: 1150, cat: Movies, desc: "Movies - Crime"} + - {id: 1170, cat: Movies, desc: "Movies - Documentary"} + - {id: 1190, cat: Movies, desc: "Movies - Drama"} + - {id: 1210, cat: Movies, desc: "Movies - Eastern"} + - {id: 1230, cat: Movies, desc: "Movies - Entertainment"} + - {id: 1250, cat: Movies, desc: "Movies - Experimental"} + - {id: 1270, cat: Movies, desc: "Movies - Family"} + - {id: 1290, cat: Movies, desc: "Movies - Fantasy"} + - {id: 1310, cat: Movies, desc: "Movies - Film Noir"} + - {id: 1330, cat: Movies, desc: "Movies - Historical"} + - {id: 1350, cat: Movies, desc: "Movies - History"} + - {id: 1370, cat: Movies, desc: "Movies - Horror"} + - {id: 1390, cat: Movies, desc: "Movies - Indie"} + - {id: 1410, cat: Movies, desc: "Movies - Music"} + - {id: 1430, cat: Movies, desc: "Movies - Musical"} + - {id: 1450, cat: Movies, desc: "Movies - Mystery"} + - {id: 1470, cat: Movies, desc: "Movies - News"} + - {id: 1900, cat: Movies, desc: "Movies - Other"} + - {id: 1490, cat: Movies, desc: "Movies - Romance"} + - {id: 1510, cat: Movies, desc: "Movies - Sci-Fi"} + - {id: 1530, cat: Movies, desc: "Movies - Sport"} + - {id: 1550, cat: Movies, desc: "Movies - Suspense"} + - {id: 1570, cat: Movies, desc: "Movies - Theater"} + - {id: 1590, cat: Movies, desc: "Movies - Thriller"} + - {id: 1610, cat: Movies, desc: "Movies - War"} + - {id: 1630, cat: Movies, desc: "Movies - Western"} + - {id: 3000, cat: XXX, desc: "Softcore - All"} + - {id: 12000, cat: Other, desc: "Subtitles - All"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + +login: + method: post + path: account-login.php + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: .myF-content > center:nth-child(1) > b:contains("The specified username or password was incorrect.") + test: + path: index.php + selector: a[href="account.php"] + +search: + paths: + - path: torrents-search.php + method: get + keywordsfilters: + - name: re_replace + args: ["(?<=^| )(?!-|\\+)[^ ]+(?= |$)", "+$&"] + inputs: + $raw: "{{ range .Categories }}&c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + incldead: 1 + + rows: + selector: "tr.t-row{{ if .Config.freeleech }}:has(td:nth-child(2) > a:nth-child(1) > span:nth-child(2)){{ else }}{{ end }}" + + fields: + title: + selector: td:nth-child(2) > a:nth-child(1) > b:nth-child(1) + category: + selector: a[href^="torrents.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + details: + selector: a[href^="torrents-details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + size: + selector: td:nth-child(7) + files: + selector: td:nth-child(6) + seeders: + selector: td:nth-child(8) + leechers: + selector: td:nth-child(9) + date: + selector: td:nth-child(3) + filters: + - name: re_replace + args: ["(\\d{2})-(\\d{2})-(\\d{4}) ((?:\\d{2}:?){3})", "$3-$2-$1 $4"] + - name: append + args: " +01:00" # CET + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + downloadvolumefactor: + case: + "td:nth-child(2) > a:nth-child(1) > span:nth-child(2)": 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 0.5 +# engine tbd diff --git a/config/prowlarr/Definitions/xbytes2.yml b/config/prowlarr/Definitions/xbytes2.yml new file mode 100644 index 0000000..f54ea64 --- /dev/null +++ b/config/prowlarr/Definitions/xbytes2.yml @@ -0,0 +1,354 @@ +--- +id: xbytesv2 +name: XbytesV2 +description: "xbytesV2 is a SPANISH site for HD content" +language: es-ES +type: private +encoding: ISO-8859-1 +links: + - https://xbytesv2.li/ +legacylinks: + - http://xbytesv2.li/ + +caps: + categorymappings: + - {id: 17, cat: Movies/BluRay, desc: "Video - FullBluray/BDRemux"} + - {id: 23, cat: Movies/3D, desc: "Video - 3D"} + - {id: 18, cat: Movies/HD, desc: "Video - 1080p"} + - {id: 30, cat: Movies/HD, desc: "Video - MicroHD x265"} + - {id: 29, cat: Movies/HD, desc: "Video - 1080p x265"} + - {id: 16, cat: Movies/HD, desc: "Video - MicroHD"} + - {id: 61, cat: Movies, desc: "Video - Custom"} + - {id: 42, cat: Movies/DVD, desc: "Video - DVD"} + - {id: 21, cat: Movies/BluRay, desc: "Video UHD - FullBluray/BDRemux"} + - {id: 45, cat: Movies/UHD, desc: "Video UHD - UHD BDRip"} + - {id: 46, cat: Movies/UHD, desc: "Video UHD - M-UHD"} + - {id: 62, cat: Movies/UHD, desc: "Video UHD - Custom 4K"} + - {id: 25, cat: TV/HD, desc: "Series - temp. complet"} + - {id: 31, cat: TV/HD, desc: "Series - x265"} + - {id: 35, cat: TV/UHD, desc: "Series - 4K"} + - {id: 41, cat: TV/Sport, desc: "Deportes"} + - {id: 37, cat: TV/Documentary, desc: "Documentales"} + - {id: 34, cat: TV/HD, desc: "Dibujos animados"} + - {id: 5, cat: TV/Anime, desc: "Anime"} + - {id: 14, cat: Audio/MP3, desc: "Musica - MP3"} + - {id: 39, cat: Audio/Lossless, desc: "Musica - FLAC"} + - {id: 38, cat: Audio/Other, desc: "Musica - otros formato"} + - {id: 27, cat: PC/Games, desc: "Juegos"} + - {id: 65, cat: Console, desc: "Juegos Retro"} + - {id: 33, cat: Books, desc: "Libros"} + - {id: 7, cat: PC/0day, desc: "Software"} + - {id: 40, cat: PC/Mobile-Other, desc: "Telefonos y tablets"} + - {id: 12, cat: XXX, desc: "Adult"} + - {id: 32, cat: Other, desc: "Otros"} + # internal cats not provided in search category dropdown !?! + # found by fishing + - {id: 19, cat: Movies/HD, desc: "Video - 720p"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 3 + options: + 3: created + 5: seeders + 4: size + 2: title + - name: type + type: select + label: Order requested from site + default: 2 + options: + 2: desc + 1: asc + - name: info + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: index.php?page=login + method: post + inputs: + uid: "{{ .Config.username }}" + pwd: "{{ .Config.password }}" + error: + - selector: body[onLoad^="makeAlert('"] + message: + selector: body[onLoad^="makeAlert('"] + attribute: onLoad + filters: + - name: replace + args: ["makeAlert('Error' , '", ""] + - name: replace + args: ["');", ""] + test: + path: index.php + selector: a[href="logout.php"] + +search: + path: index.php + keywordsfilters: + - name: re_replace + args: ["(?i)(S0?1)(?![\\dE])", "Primera Temporada"] + - name: re_replace + args: ["(?i)(S0?2)(?![\\dE])", "Segunda Temporada"] + - name: re_replace + args: ["(?i)(S0?3)(?![\\dE])", "Tercera Temporada"] + - name: re_replace + args: ["(?i)(S0?4)(?![\\dE])", "Cuarta Temporada"] + - name: re_replace + args: ["(?i)(S0?5)(?![\\dE])", "Quinta Temporada"] + - name: re_replace + args: ["(?i)(S0?6)(?![\\dE])", "Sexta Temporada"] + - name: re_replace + args: ["(?i)(S0?7)(?![\\dE])", "Septima Temporada"] + - name: re_replace + args: ["(?i)(S0?8)(?![\\dE])", "Octava Temporada"] + - name: re_replace + args: ["(?i)(S0?9)(?![\\dE])", "Novena Temporada"] + - name: re_replace + args: ["(?i)(S10)(?![\\dE])", "Decima Temporada"] + - name: re_replace + args: ["(?i)(S11)(?![\\dE])", "Onceava Temporada"] + - name: re_replace + args: ["(?i)(S12)(?![\\dE])", "Decimosegunda Temporada"] + # Parse other seasons + - name: re_replace + args: ["(?i)(S(\\d{1,2}))(?![\\dE])", "Temporada"] + - name: re_replace + args: ["(?i)S(\\d{1,2})E(\\d{1,2})", "S$1/E$2"] + inputs: + page: torrents + $raw: "&category={{ range .Categories }}{{.}};{{end}}" + # 0 all, 1 activeonly, 2 deadonly + active: 0 + # 0 title, 1 title&desc, 2 descr, 3 uploaders, 5 gold, 6 silver, 7 bronze, 8 1x, 9 2x, 10 3x, 11 4x, 12 5x, 13 6x, 14 7x, 15 8x, 16 9x, 17 10x + options: "{{ if .Config.freeleech }}5{{ else }}0{{ end }}" + search: "{{ .Keywords }}" + order: "{{ .Config.sort }}" + by: "{{ .Config.type }}" + + rows: + selector: table.lista > tbody > tr:has(td[onMouseOut]) + + fields: + category: + selector: a[href^="index.php?page=torrents&category="] + attribute: href + filters: + - name: querystring + args: category + title: + selector: a[href^="index.php?page=torrent-details&id="] + filters: + # To improve next replaces + - name: replace + args: ["//", "/"] + - name: re_replace + args: ["\\((?=(.*\\d{4}))", "{"] + - name: re_replace + args: ["\\)(?=(.*\\d{4}))", "}"] + + # Years and Dates + - name: re_replace # eg El proyecto colibrí (Estreno 2021) (2018/... + args: ["\\{?(?i)Estreno (19|20)\\d{2}\\}?", ""] + - name: re_replace + args: ["(\\{((19|20)\\d{2}) ((19|20)\\d{2}))", "{$2-$4}"] + - name: re_replace + args: ["(\\/(?i)E\\d{1,2}) (\\d{1,2})", "$1-$2"] + - name: re_replace + args: ["(?i)S(\\d{1,2})[ \\/]E(\\d{1,2})", "S$1E$2"] + # remove the year in tv series, but keep it in movies. issue #3290 + - name: re_replace # eg Supergirl (2017 18/S03E19 ... + args: ["\\{(19|20)\\d{2} \\d{2}", ""] + - name: re_replace # eg Supergirl (2018/S04E01 ... + args: ["\\{(19|20)\\d{2}\\/(S\\d{2})", "$2"] + - name: re_replace # eg La habitación (The Room) (2...) + args: ["(\\{(19|20)\\d{2})\\/", "$1}/"] + + # Languages + - name: replace + args: ["/Español", "/SPANiSH"] + - name: replace + args: ["/SPA", "/SPANiSH"] + - name: replace + args: ["/ESP", "/SPANiSH"] + - name: re_replace + args: ["\\/[EI]NG", "/English"] + - name: replace + args: ["/CAT", "/Catalan"] + - name: re_replace + args: ["\\/FR[AE]?", "/French"] + - name: replace + args: ["/ALE", "/German"] + - name: replace + args: ["/HOL", "/Dutch"] + - name: replace + args: ["/NL", "/Dutch"] + - name: replace + args: ["/NOR", "/Norwegian"] + - name: replace + args: ["/CHI", "/Chinese"] + - name: replace + args: ["/JAP", "/Japanese"] + - name: re_replace + args: ["\\/ITA?", "/Italian"] + - name: replace + args: ["/RUS", "/Russian"] + - name: re_replace + args: ["\\/[KC]O?R", "/Korean"] + - name: replace + args: ["/LAT", "/Latino"] + - name: replace + args: ["/HEB", "/Hebrew"] + - name: replace + args: ["/AR", "/Arabic"] + - name: replace + args: ["/FIN", "/Finnish"] + - name: replace + args: ["/SUE", "/Swedish"] + - name: replace + args: ["/Turco", "/Turkish"] + - name: re_replace + args: ["\\/(?i)DUAL", "/MULTi SPANiSH"] + + # Video Origin + - name: re_replace + args: ["(?i)UHDRip", "Bluray"] # Fix for Radarr + - name: re_replace # eg El Ministerio Del Tiempo Temporada 4 (2020/MHD/WEB-DL/1080p + args: ["(\\d)\\}\\/(?i)(MHD)\\/(\\d)", "$1}/mHD BluRay/$3"] # Fix for Radarr + - name: re_replace + args: ["(?i)BDRIP", "BluRay"] + - name: re_replace + args: ["WEB DL", "WEBDL"] # Fix for Radarr + + # Audio Codecs + - name: replace + args: ["E AC3", "E-AC3"] + - name: replace + args: ["DTS HD", "DTS-HD"] + - name: replace + args: ["VC 1", "VC-1"] + + - name: re_replace # eg AC3 2 1 -> AC3 2.1 | eg V2 1 3 4 -> V2.1 3.4 + args: [" ((?i)V?)((\\d+) (\\d+))", " $1$3.$4"] + - name: re_replace # eg eg V2.1 3.4 -> V2.1.3.4 + args: ["\\.((\\d+) (\\d+))", ".$2.$3"] + + # Another Info + - name: re_replace + args: ["(?i)(REPARAD[OA])", "REPACK"] + - name: re_replace + args: ["(?i)(Miniserie)", ""] + - name: re_replace + args: ["(?i)(Temporada(s?)( (\\d+))( Completa)?)", "S$4"] + - name: re_replace + args: ["(?i)(Decimosegunda Temporada)", "S12"] + - name: re_replace + args: ["(?i)(Primera Temporada)", "S01"] + - name: re_replace + args: ["(?i)(Segunda Temporada)", "S02"] + - name: re_replace + args: ["(?i)(Tercera Temporada)", "S03"] + - name: re_replace + args: ["(?i)(Cuarta Temporada)", "S04"] + - name: re_replace + args: ["(?i)(Quinta Temporada)", "S05"] + - name: re_replace + args: ["(?i)(Sexta Temporada)", "S06"] + - name: re_replace + args: ["(?i)(Septima Temporada)", "S07"] + - name: re_replace + args: ["(?i)(Octava Temporada)", "S08"] + - name: re_replace + args: ["(?i)(Novena Temporada)", "S09"] + - name: re_replace + args: ["(?i)(Decima Temporada)", "S10"] + - name: re_replace + args: ["(?i)(Onceava Temporada)", "S11"] + - name: re_replace + args: ["(?i)(Temporada) (\\d{1,2})", "S$2"] + + - name: replace + args: ["/", " "] + - name: replace + args: ["(", " "] + - name: replace + args: [")", " "] + - name: replace + args: ["{", "("] + - name: replace + args: ["}", ")"] + - name: replace + args: [" ", " "] + + details: + selector: a[href^="index.php?page=torrent-details&id="] + attribute: href + poster: + selector: a[href^="index.php?page=torrent-details&id="] + attribute: onmouseover + filters: + - name: regexp + args: "src=(.+?) " + download: + selector: a[href^="download.php?id="] + attribute: href + date: + selector: td:nth-child(5) + filters: + - name: append + args: " +01:00" # CET + - name: dateparse + args: "dd/MM/yyyy zzz" + size: + selector: td:nth-child(10) + seeders: + selector: td:nth-child(6) + leechers: + selector: td:nth-child(7) + grabs: + selector: td:nth-child(8) + downloadvolumefactor: + case: + img[src$="gold.gif"]: 0 + img[src$="silver.gif"]: 0.5 + img[src$="bronze.gif"]: 0.25 + "*": 1 + uploadvolumefactor: + case: + img[src$="2x.gif"]: 2 + img[src$="3x.gif"]: 3 + img[src$="4x.gif"]: 4 + img[src$="5x.gif"]: 5 + img[src$="6x.gif"]: 6 + img[src$="7x.gif"]: 7 + img[src$="8x.gif"]: 8 + img[src$="9x.gif"]: 9 + img[src$="10x.gif"]: 10 + "*": 1 + minimumratio: + text: 1.0 + minimumseedtime: + # 3 days (as seconds = 3 x 24 x 60 x 60) + text: 259200 +# xbtitFM v3.1.00 diff --git a/config/prowlarr/Definitions/xider-torrent.yml b/config/prowlarr/Definitions/xider-torrent.yml new file mode 100644 index 0000000..925ad0d --- /dev/null +++ b/config/prowlarr/Definitions/xider-torrent.yml @@ -0,0 +1,168 @@ +--- +id: xider-torrent +name: Xider-Torrent +description: "Xider-Torrent is a HUNGARIAN Private Tracker for MOVIES / TV" +language: hu-HU +type: private +encoding: UTF-8 +links: + - https://xider.eu/ + +caps: + categorymappings: + - {id: 4, cat: Movies/SD, desc: "Film/Cam/Eng"} + - {id: 3, cat: Movies/SD, desc: "Film/Cam/Hun"} + - {id: 8, cat: Movies/DVD, desc: "Film/DVD/Eng"} + - {id: 7, cat: Movies/DVD, desc: "Film/DVD/Hun"} + - {id: 10, cat: Movies/DVD, desc: "Film/DVD9/Eng"} + - {id: 9, cat: Movies/DVD, desc: "Film/DVD9/Hun"} + - {id: 12, cat: Movies/HD, desc: "Film/HD/Eng"} + - {id: 11, cat: Movies/HD, desc: "Film/HD/Hun"} + - {id: 2, cat: Movies/SD, desc: "Film/SD/Eng"} + - {id: 1, cat: Movies/SD, desc: "Film/SD/Hun"} + - {id: 18, cat: PC/Games, desc: "Játék/ISO"} + - {id: 19, cat: PC/Games, desc: "Játék/Rip"} + - {id: 24, cat: Other, desc: "Képek"} + - {id: 23, cat: Books, desc: "Könyv/Eng"} + - {id: 22, cat: Books, desc: "Könyv/Hun"} + - {id: 20, cat: Console, desc: "Konzol"} + - {id: 32, cat: Audio/Lossless, desc: "Lossless/Eng"} + - {id: 31, cat: Audio/Lossless, desc: "Lossless/Hun"} + - {id: 30, cat: TV/Anime, desc: "Mese/HD/Eng"} + - {id: 29, cat: TV/Anime, desc: "Mese/HD/Hun"} + - {id: 28, cat: TV/Anime, desc: "Mese/SD/Eng"} + - {id: 27, cat: TV/Anime, desc: "Mese/SD/Hun"} + - {id: 21, cat: PC/Mobile-Other, desc: "Mobil"} + - {id: 16, cat: Audio/MP3, desc: "Mp3/Eng"} + - {id: 15, cat: Audio/MP3, desc: "Mp3/Hun"} + - {id: 17, cat: PC, desc: "Program"} + - {id: 14, cat: TV, desc: "Sorozat/Eng"} + - {id: 13, cat: TV, desc: "Sorozat/Hun"} + - {id: 25, cat: XXX, desc: "XXX/Film"} + - {id: 26, cat: XXX/ImageSet, desc: "XXX/Kép"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + book-search: [q] + music-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Filter FreeLeech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 1: title + 4: added + 5: size + 7: seeders + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrentek száma egy oldalon: setting to 100 on your account profile. + +login: + path: login.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: table[width="920"]:contains("Hiba") + test: + path: index.php + selector: a[href^="logout.php"] + +search: + paths: + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # 0 active, 1 all, 2 deadonly, 3 my uploads, 4 seedless + incldead: 1 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + # does not support imdbid search + + rows: + selector: "tr.torrentDataRow:has(a[href^=\"download.php?\"]){{ if .Config.freeleech }}:has(span[style^=\"font\"]:contains(\"0x\")){{ else }}{{ end }}" + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + attribute: title + filters: + - name: replace + args: ["Név: ", ""] + - name: replace + args: ["Első név: -", ""] + - name: replace + args: ["Második név: -", ""] + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?torrent="] + attribute: href + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + files: + selector: a[href$="filelist=1"] + date: + selector: td:nth-child(7) + filters: + - name: append + args: " +01:00" # CET + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + size: + selector: td:nth-child(8) + grabs: + selector: td:nth-child(9) + seeders: + selector: td:nth-child(10) + leechers: + selector: td:nth-child(11) + description: + case: + i.fa-check: Verified + i.fa-question: Unverified + downloadvolumefactor: + case: + "span[style^=\"font\"]:contains(\"0x\")": 0 + "*": 1 + uploadvolumefactor: + case: + "span[style^=\"font\"]:last-child:contains(\"2x\")": 2 + "*": 1 + minimumseedtime: + # 2 days (as seconds = 2 x 24 x 60 x 60) + text: 172800 +# Engine n/a diff --git a/config/prowlarr/Definitions/xthor-api.yml b/config/prowlarr/Definitions/xthor-api.yml new file mode 100644 index 0000000..1e42709 --- /dev/null +++ b/config/prowlarr/Definitions/xthor-api.yml @@ -0,0 +1,206 @@ +--- +id: xthor-api +name: Xthor (API) +description: "General French Private Tracker" +language: fr-FR +type: private +encoding: windows-1252 +requestDelay: 2.5 +links: + - https://xthor.tk/ +legacylinks: + - https://xthor.bz/ + - https://xthor.to/ + - https://xthor.tk + +caps: + categorymappings: + # Movies / Films + - {id: 118, cat: Movies/BluRay, desc: "Films/2160p/Bluray"} + - {id: 119, cat: Movies/UHD, desc: "Films/2160p/Remux"} + - {id: 107, cat: Movies/UHD, desc: "Films/2160p/x265"} + - {id: 1, cat: Movies/BluRay, desc: "Films/1080p/BluRay"} + - {id: 2, cat: Movies/HD, desc: "Films/1080p/Remux"} + - {id: 100, cat: Movies/HD, desc: "Films/1080p/x265"} + - {id: 4, cat: Movies/HD, desc: "Films/1080p/x264"} + - {id: 5, cat: Movies/HD, desc: "Films/720p/x264"} + - {id: 7, cat: Movies/SD, desc: "Films/SD/x264"} + - {id: 3, cat: Movies/3D, desc: "Films/3D"} + - {id: 6, cat: Movies/SD, desc: "Films/XviD"} + - {id: 8, cat: Movies/DVD, desc: "Films/DVD"} + - {id: 122, cat: Movies/HD, desc: "Films/HDTV"} + - {id: 94, cat: Movies/WEB-DL, desc: "Films/WEBDL"} + - {id: 95, cat: Movies/WEB-DL, desc: "Films/WEBRiP"} + - {id: 12, cat: TV/Documentary, desc: "Films/Documentaire"} + - {id: 31, cat: Movies/Other, desc: "Films/Animation"} + - {id: 33, cat: Movies/Other, desc: "Films/Spectacle"} + - {id: 125, cat: TV/Sport, desc: "Films/Sports"} + - {id: 20, cat: Audio/Video, desc: "Films/Concerts, Clips"} + - {id: 9, cat: Movies/Other, desc: "Films/VOSTFR"} + # TV Series / Series TV + - {id: 104, cat: TV/Other, desc: "Series/BluRay"} + - {id: 13, cat: TV, desc: "Series/Pack VF"} + - {id: 15, cat: TV/HD, desc: "Series/HD VF"} + - {id: 14, cat: TV/SD, desc: "Series/SD VF"} + - {id: 98, cat: TV/Other, desc: "Series/Pack VOSTFR"} + - {id: 17, cat: TV/HD, desc: "Series/HD VOSTFR"} + - {id: 16, cat: TV/SD, desc: "Series/SD VOSTFR"} + - {id: 101, cat: TV/Anime, desc: "Series/Packs Anime"} + - {id: 32, cat: TV/Anime, desc: "Series/Animes"} + - {id: 110, cat: TV/Anime, desc: "Series/Anime VOSTFR"} + - {id: 123, cat: TV/Other, desc: "Series/Animation"} + - {id: 109, cat: TV/Documentary, desc: "Series/DOC"} + - {id: 34, cat: TV/Sport, desc: "Series/Sport"} + - {id: 30, cat: TV/Other, desc: "Series/Emission TV"} + # Porn / XxX + - {id: 36, cat: XXX, desc: "MISC/XxX/Films"} + - {id: 105, cat: XXX, desc: "MISC/XxX/Séries"} + - {id: 114, cat: XXX, desc: "MISC/XxX/Lesbiennes"} + - {id: 115, cat: XXX, desc: "MISC/XxX/Gays"} + - {id: 113, cat: XXX, desc: "MISC/XxX/Hentai"} + - {id: 120, cat: XXX, desc: "MISC/XxX/Magazines"} + # Books / Livres + - {id: 24, cat: Books/EBook, desc: "Livres/Romans"} + - {id: 124, cat: Audio/Audiobook, desc: "Livres/Audio Books"} + - {id: 96, cat: Books/Mags, desc: "Livres/Magazines"} + - {id: 99, cat: Books/Other, desc: "Livres/Bandes dessinées"} + - {id: 116, cat: Books/EBook, desc: "Livres/Romans Jeunesse"} + - {id: 102, cat: Books/Comics, desc: "Livres/Comics"} + - {id: 103, cat: Books/Other, desc: "Livres/Mangas"} + # Softwares / Logiciels + - {id: 25, cat: PC/Games, desc: "Logiciels/Jeux PC"} + - {id: 27, cat: Console/PS3, desc: "Logiciels/Playstation"} + - {id: 111, cat: PC/Mac, desc: "Logiciels/Jeux MAC"} + - {id: 26, cat: Console/XBox 360, desc: "Logiciels/XboX"} + - {id: 112, cat: PC, desc: "Logiciels/Jeux Linux"} + - {id: 28, cat: Console/Wii, desc: "Logiciels/Nintendo"} + - {id: 29, cat: Console/NDS, desc: "Logiciels/NDS"} + - {id: 117, cat: PC, desc: "Logiciels/ROM"} + - {id: 21, cat: PC, desc: "Logiciels/Applis PC"} + - {id: 22, cat: PC/Mac, desc: "Logiciels/Applis Mac"} + - {id: 23, cat: PC/Mobile-Android, desc: "Logiciels/Smartphone"} + + modes: + search: [q] + movie-search: [q, tmdbid] + tv-search: [q, season, ep, tmdbid] + book-search: [q] + +settings: + - name: passkey + type: text + label: Passkey + - name: info_key + type: info + label: About your Passkey + default: "Find your Passkey on Xthor > API page." + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: multilang + type: checkbox + label: Replace MULTi by another language in release name + default: false + - name: multilanguage + type: select + label: Replace MULTi by this language + default: FRENCH + options: + FRENCH: FRENCH + MULTi.FRENCH: MULTi.FRENCH + ENGLISH: ENGLISH + MULTi.ENGLISH: MULTi.ENGLISH + VOSTFR: VOSTFR + MULTi.VOSTFR: MULTi.VOSTFR + - name: vostfr + type: checkbox + label: Replace VOSTFR and SUBFRENCH with ENGLISH + default: false + +login: + path: "https://api.xthor.tk/" + method: get + inputs: + passkey: "{{ .Config.passkey }}" + error: + - selector: ":root:contains(\"Passkey not found\")" + message: + text: "The Passkey was not accepted by {{ .Config.sitelink }}." + +search: + paths: + # https://api.xthor.tk/?passkey=&search=&category=&freeleech=&tmdbid=&size=&accent=&price=&page= + - path: "https://api.xthor.tk/" + inputs: + passkey: "{{ .Config.passkey }}" + category: "{{ if .Categories }}{{ range .Categories }}{{.}}+{{end}}{{ else }}{{ end }}" + search: "{{ .Keywords }}" + tmdbid: "{{ .Query.TMDBID }}" + freeleech: "{{ if .Config.freeleech }}1{{ else }}{{ end }}" + response: + type: json + noResultsMessage: '"descr": "no result"' + + rows: + selector: torrents + + fields: + _id: + selector: id + category: + selector: category + title_phase1: + selector: name + title_vostfr: + text: "{{ .Result.title_phase1 }}" + filters: + - name: re_replace + args: ["(?i)\\b(vostfr|subfrench)\\b", "ENGLISH"] + title_phase2: + text: "{{ if .Config.vostfr }}{{ .Result.title_vostfr }}{{ else }}{{ .Result.title_phase1 }}{{ end }}" + title_multilang: + text: "{{ .Result.title_phase2 }}" + filters: + - name: re_replace + args: ["(?i)\\b(MULTI(?!.*(?:FRENCH|ENGLISH|VOSTFR)))\\b", "{{ .Config.multilanguage }}"] + title: + text: "{{ if .Config.multilang }}{{ .Result.title_multilang }}{{ else }}{{ .Result.title_phase2 }}{{ end }}" + details: + text: "{{ .Config.sitelink }}details.php?id={{ .Result._id }}" + download: + selector: download_link + poster: + selector: descr + filters: + - name: regexp + args: ["({{ .Config.sitelink }}info_images\\/allocine\\/covers\\/film\\/small_\\d+?\\.jpg)"] + tmdbid: + selector: tmdb_id + files: + selector: numfiles + date: + selector: added + size: + selector: size + seeders: + selector: seeders + leechers: + selector: leechers + grabs: + selector: times_completed + downloadvolumefactor: + # api returns 0=false, 1=true + selector: freeleech + case: + 0: 1 # not free + 1: 0 # freeleech + uploadvolumefactor: + text: 1 + minimumseedtime: + # 24 hours (as seconds = 1 x 24 x 60 x 60) + text: 86400 + minimumratio: + # minimum ratio per torrent is 0.8 + text: 0.8 +# json api diff --git a/config/prowlarr/Definitions/xthor-scraping.yml b/config/prowlarr/Definitions/xthor-scraping.yml new file mode 100644 index 0000000..7617ecb --- /dev/null +++ b/config/prowlarr/Definitions/xthor-scraping.yml @@ -0,0 +1,251 @@ +--- +id: xthor-scraping +name: Xthor (Scraping) +description: "General French Private Tracker" +language: fr-FR +type: private +encoding: UTF-8 +followredirect: true +links: + - https://xthor.tk/ +legacylinks: + - https://xthor.tk + +caps: + categorymappings: + # Movies / Films + - {id: 118, cat: Movies/BluRay, desc: "Films/2160p/Bluray"} + - {id: 119, cat: Movies/UHD, desc: "Films/2160p/Remux"} + - {id: 107, cat: Movies/UHD, desc: "Films/2160p/x265"} + - {id: 1, cat: Movies/BluRay, desc: "Films/1080p/BluRay"} + - {id: 2, cat: Movies/HD, desc: "Films/1080p/Remux"} + - {id: 100, cat: Movies/HD, desc: "Films/1080p/x265"} + - {id: 4, cat: Movies/HD, desc: "Films/1080p/x264"} + - {id: 5, cat: Movies/HD, desc: "Films/720p/x264"} + - {id: 7, cat: Movies/SD, desc: "Films/SD/x264"} + - {id: 3, cat: Movies/3D, desc: "Films/3D"} + - {id: 6, cat: Movies/SD, desc: "Films/XviD"} + - {id: 8, cat: Movies/DVD, desc: "Films/DVD"} + - {id: 122, cat: Movies/HD, desc: "Films/HDTV"} + - {id: 94, cat: Movies/WEB-DL, desc: "Films/WEBDL"} + - {id: 95, cat: Movies/WEB-DL, desc: "Films/WEBRiP"} + - {id: 12, cat: TV/Documentary, desc: "Films/Documentaire"} + - {id: 31, cat: Movies/Other, desc: "Films/Animation"} + - {id: 33, cat: Movies/Other, desc: "Films/Spectacle"} + - {id: 125, cat: TV/Sport, desc: "Films/Sports"} + - {id: 20, cat: Audio/Video, desc: "Films/Concerts, Clips"} + - {id: 9, cat: Movies/Other, desc: "Films/VOSTFR"} + + # TV Series / Series TV + - {id: 104, cat: TV/Other, desc: "Series/BluRay"} + - {id: 13, cat: TV, desc: "Series/Pack VF"} + - {id: 15, cat: TV/HD, desc: "Series/HD VF"} + - {id: 14, cat: TV/SD, desc: "Series/SD VF"} + - {id: 98, cat: TV/Other, desc: "Series/Pack VOSTFR"} + - {id: 17, cat: TV/HD, desc: "Series/HD VOSTFR"} + - {id: 16, cat: TV/SD, desc: "Series/SD VOSTFR"} + - {id: 101, cat: TV/Anime, desc: "Series/Packs Anime"} + - {id: 32, cat: TV/Anime, desc: "Series/Animes"} + - {id: 110, cat: TV/Anime, desc: "Series/Anime VOSTFR"} + - {id: 123, cat: TV/Other, desc: "Series/Animation"} + - {id: 109, cat: TV/Documentary, desc: "Series/DOC"} + - {id: 34, cat: TV/Sport, desc: "Series/Sport"} + - {id: 30, cat: TV/Other, desc: "Series/Emission TV"} + + # Porn / XxX + - {id: 36, cat: XXX, desc: "MISC/XxX/Films"} + - {id: 105, cat: XXX, desc: "MISC/XxX/Séries"} + - {id: 114, cat: XXX, desc: "MISC/XxX/Lesbiennes"} + - {id: 115, cat: XXX, desc: "MISC/XxX/Gays"} + - {id: 113, cat: XXX, desc: "MISC/XxX/Hentai"} + - {id: 120, cat: XXX, desc: "MISC/XxX/Magazines"} + + # Books / Livres + - {id: 24, cat: Books/EBook, desc: "Livres/Romans"} + - {id: 124, cat: Audio/Audiobook, desc: "Livres/Audio Books"} + - {id: 96, cat: Books/Mags, desc: "Livres/Magazines"} + - {id: 99, cat: Books/Other, desc: "Livres/Bandes dessinées"} + - {id: 116, cat: Books/EBook, desc: "Livres/Romans Jeunesse"} + - {id: 102, cat: Books/Comics, desc: "Livres/Comics"} + - {id: 103, cat: Books/Other, desc: "Livres/Mangas"} + + # Softwares / Logiciels + - {id: 25, cat: PC/Games, desc: "Logiciels/Jeux PC"} + - {id: 27, cat: Console/PS3, desc: "Logiciels/Playstation"} + - {id: 111, cat: PC/Mac, desc: "Logiciels/Jeux MAC"} + - {id: 26, cat: Console/XBox 360, desc: "Logiciels/XboX"} + - {id: 112, cat: PC, desc: "Logiciels/Jeux Linux"} + - {id: 28, cat: Console/Wii, desc: "Logiciels/Nintendo"} + - {id: 29, cat: Console/NDS, desc: "Logiciels/NDS"} + - {id: 117, cat: PC, desc: "Logiciels/ROM"} + - {id: 21, cat: PC, desc: "Logiciels/Applis PC"} + - {id: 22, cat: PC/Mac, desc: "Logiciels/Applis Mac"} + - {id: 23, cat: PC/Mobile-Android, desc: "Logiciels/Smartphone"} + + modes: + search: [q] + movie-search: [q] + tv-search: [q, season, ep] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: accent_id + type: select + label: Specific language + default: 0 + options: + 0: "All Voices (default)" + 1: "Françaises" + 2: "Quebecoises" + 47: "Françaises et Québécoises" + 3: "Anglaises" + 4: "Japonaises" + 5: "Espagnoles" + 6: "Allemandes" + 7: "Chinoises" + 8: "Italiennes" + 9: "Coréennes" + 10: "Danoises" + 11: "Russes" + 12: "Portugaises" + 13: "Hindi" + 14: "Hollandaises" + 15: "Suédoises" + 16: "Norvégiennes" + 17: "Thaïlandaises" + 18: "Hébreu" + 19: "Persanes" + 20: "Arabes" + 21: "Turques" + 22: "Hongroises" + 23: "Polonaises" + 24: "Finnoises" + 25: "Indonésiennes" + 26: "Roumaines" + 27: "Malaisiennes" + 28: "Estoniennes" + 29: "Islandaises" + 30: "Grecques" + 31: "Serbes" + 32: "Norvégiennes (2)" + 33: "Ukrainiennes" + 34: "Bulgares" + 35: "Tagalogues" + 36: "Xhosa" + 37: "Kurdes" + 38: "Bengali" + 39: "Amhariques" + 40: "Bosniaques" + 41: "Malayalam" + 42: "Télougou" + 43: "Bambara" + 44: "Catalanes" + 45: "Tchèques" + 46: "Afrikaans" + - name: info + type: info + label: Accent Note + default: "You can scope your searches with a specific language / accent." + - name: only_freeleech + type: checkbox + label: Only grab freeleech torrents + default: false + - name: multilanguage + type: text + label: Replace MULTI by this word + default: MULTI + - name: subfrench + type: text + label: Replace "VOSTFR" and "SUBFRENCH" by this word + +login: + method: post + path: takelogin.php + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + perm_ssl: 1 + submitme: X + returnto: / + error: + - selector: table > tbody > tr > td > h2 + message: + text: "Erreur" + test: + path: browse.php + selector: tr.trtor + +search: + paths: + - path: browse.php + inputs: + sch: "{{ .Keywords }}" + searchin: title + incldead: 0 + group: 0 + state: 0 + accent: "{{ .Config.accent_id }}" + price: 0 + mqr: 0 + staff: 0 + only_free: "{{ if .Config.only_freeleech }}1{{ else }}0{{ end }}" + rows: + selector: tbody > tr.trtor:has(td.tdtor > a[href^="browse.php?cat="]) + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_phase1: + selector: a[href^="details.php?id="] > b + title_multilanguage: + text: "{{ .Result.title_phase1 }}" + filters: + - name: re_replace + args: ["(?i)[\\.\\s\\[\\-]multi[\\.\\s\\]\\-]", ".{{ .Config.multilanguage }}."] + title_phase2: + text: "{{ if .Config.multilanguage }}{{ .Result.title_multilanguage }}{{ else }}{{ .Result.title_phase1 }}{{ end }}" + title_vostfr: + text: "{{ .Result.title_phase2 }}" + filters: + - name: re_replace + args: ["(?i)[\\.\\s\\[\\-]vostfr[\\.\\s\\]\\-]", ".{{ .Config.subfrench }}."] + - name: re_replace + args: ["(?i)[\\.\\s\\[\\-]subfrench[\\.\\s\\]\\-]", ".{{ .Config.subfrench }}."] + title_phase3: + text: "{{ if .Config.subfrench }}{{ .Result.title_vostfr }}{{ else }}{{ .Result.title_phase2 }}{{ end }}" + title: + text: "{{ .Result.title_phase3 }}" + download: + selector: a[href^="download.php?torrent="] + attribute: href + details: + selector: a[href^="details.php?id="] + attribute: href + size: + selector: a[href^="download.php?torrent="] + filters: + - name: replace + args: ["io", "B"] + grabs: + selector: a[href^="gang.php?tid="] + seeders: + selector: a[href^="peerlist_xbt.php?id="] > font[style="color:#04B404;"] + leechers: + selector: a[href^="peerlist_xbt.php?id="] > font[style="color:#2E64FE;"] + downloadvolumefactor: + case: + img[title="Free Torrent"]: 0 + "*": 1 + uploadvolumefactor: + case: + "*": 1 diff --git a/config/prowlarr/Definitions/xtorrenty.yml b/config/prowlarr/Definitions/xtorrenty.yml new file mode 100644 index 0000000..f4ebe73 --- /dev/null +++ b/config/prowlarr/Definitions/xtorrenty.yml @@ -0,0 +1,178 @@ +--- +id: xtorrenty +name: xTorrenty +description: "xTorrenty is a POLISH Semi-Private Torrent Tracker for MOVIES / TV / GENERAL" +language: pl-PL +type: semi-private +encoding: UTF-8 +links: + - https://xtorrenty.org/ + +caps: + categorymappings: + - {id: 15, cat: Movies/SD, desc: "Filmy XviD/DivX"} + - {id: 20, cat: Movies/Other, desc: "Filmy/Bajki"} + - {id: 21, cat: Movies/DVD, desc: "Filmy DVD"} + - {id: 22, cat: Movies/SD, desc: "Filmy RMVB"} + - {id: 23, cat: Movies/HD, desc: "Filmy x264"} + - {id: 24, cat: Movies/UHD, desc: "Filmy 4K UHD"} + - {id: 25, cat: Movies/HD, desc: "Filmy HD"} + - {id: 26, cat: Movies/3D, desc: "Filmy 3D"} + - {id: 27, cat: Movies/HD, desc: "Filmy x265"} + - {id: 28, cat: Movies/SD, desc: "Filmy TS/CAM"} + - {id: 84, cat: PC/0day, desc: "Programy"} + - {id: 85, cat: Console, desc: "Konsole"} + - {id: 16, cat: PC/Games, desc: "Gry"} + - {id: 86, cat: Audio, desc: "Muzyka"} + - {id: 88, cat: Audio/Video, desc: "Teledyski"} + - {id: 89, cat: TV, desc: "TV"} + - {id: 90, cat: XXX, desc: "Erotyka"} + - {id: 91, cat: Books/EBook, desc: "Książki"} + - {id: 92, cat: Books/Comics, desc: "Komiksy"} + - {id: 93, cat: PC/Mac, desc: "Linux/Mac"} + - {id: 94, cat: TV/Sport, desc: "Sport"} + - {id: 95, cat: TV/Anime, desc: "Anime"} + - {id: 96, cat: Other, desc: "Dla dzieci"} + - {id: 97, cat: PC/Mobile-Other, desc: "GSM/PDA"} + - {id: 344, cat: Other/Misc, desc: "Inne"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: email + type: text + label: Email + - name: password + type: password + label: Password + - name: multilang + type: checkbox + label: Replace MULTi by another language in release name + default: false + - name: multilanguage + type: select + label: Replace MULTi by this language + default: POLISH + options: + POLISH: POLISH + MULTi POLISH: MULTi POLISH + - name: sort + type: select + label: Sort requested from site + default: date + options: + date: created + title: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: login.html + method: form + form: form + inputs: + login_name: "{{ .Config.email }}" + login_password: "{{ .Config.password }}" + login_not_save: "" + login: submit + test: + path: / + selector: a[href$="/index.php?action=logout"] + +download: + selectors: + - selector: a[href^="/engine/download.php?id="] + attribute: href + - selector: a[href^="magnet:?xt="] + attribute: href + +search: + # do=search&subaction=search&story=greyhound&titleonly=3&sortby=date&resorder=desc&showposts=1&catlist[]=23 + paths: + - path: index.php + inputs: + $raw: "{{ range .Categories }}catlist[]={{.}}&{{end}}" + do: search + subaction: search + showposts: 0 + # 0 in article 1 in comments 2 in static pages 3 in article titles + titleonly: "{{ if .Query.IMDBID }}0{{ else }}3{{ end }}" + story: "{{ if or .Query.IMDBID .Keywords }}{{ or .Query.IMDBID .Keywords }}{{ else }}{{ .Today.Year }}{{ end }}" + sortby: "{{ .Config.sort }}" + resorder: "{{ .Config.type }}" + + rows: + selector: table > tbody > tr:has(td[class="colhead"]) + + fields: + category: + selector: td + case: + "td:contains(\"XviD/DivX\")": 15 + "td:contains(\"Filmy/Bajki\")": 20 + "td:contains(\"DVD\")": 21 + "td:contains(\"RMVB\")": 22 + "td:contains(\"x264\")": 23 + "td:contains(\"4K UHD\")": 24 + "td:contains(\"HD\")": 25 + "td:contains(\"3D\")": 26 + "td:contains(\"x265\")": 27 + "td:contains(\"TS/CAM\")": 28 + "td:contains(\"Programy\")": 84 + "td:contains(\"Konsole\")": 85 + "td:contains(\"Gry\")": 16 + "td:contains(\"Muzyka\")": 86 + "td:contains(\"Teledyski\")": 88 + "td:contains(\"TV\")": 89 + "td:contains(\"Erotyka\")": 90 + "td:contains(\"Książki\")": 91 + "td:contains(\"Komiksy\")": 92 + "td:contains(\"Linux/Mac\")": 93 + "td:contains(\"Sport\")": 94 + "td:contains(\"Anime\")": 95 + "td:contains(\"Dla dzieci\")": 96 + "td:contains(\"GSM/PDA\")": 97 + "*": 344 + title_phase1: + selector: a + title_multilang: + selector: a + filters: + - name: re_replace + args: ["(?i)\\b(MULTI(?!.*(?:POLISH|ENGLISH|\\bPL\\b)))\\b", "{{ .Config.multilanguage }}"] + - name: re_replace + args: ["(?i)\\b(pl)\\b", "POLISH"] + title: + text: "{{ if .Config.multilang }}{{ .Result.title_multilang }}{{ else }}{{ .Result.title_phase1 }}{{ end }}" + details: + selector: a + attribute: href + download: + selector: a + attribute: href + date: + text: now + seeders: + selector: td:nth-child(4) + leechers: + selector: td:nth-child(5) + size: + selector: td:nth-child(3) + filters: + - name: append + args: "B" + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/xtremebytes.yml b/config/prowlarr/Definitions/xtremebytes.yml new file mode 100644 index 0000000..3629aa6 --- /dev/null +++ b/config/prowlarr/Definitions/xtremebytes.yml @@ -0,0 +1,152 @@ +--- +id: xtremebytes +name: Xtreme Bytes +description: "Xtreme Bytes (TorrentSurf) is a Private Torrent Tracker for MOVIES / TV / GENERAL" +language: en-US +type: private +encoding: UTF-8 +links: + - https://xtremebytes.net/ + +caps: + categorymappings: + - {id: 1, cat: TV/Anime, desc: "Anime"} + - {id: 13, cat: PC/Mac, desc: "Appz/Mac"} + - {id: 3, cat: PC/0day, desc: "Appz/PC"} + - {id: 35, cat: TV, desc: "Big Brother"} + - {id: 28, cat: Books/Comics, desc: "Comics"} + - {id: 4, cat: Books/EBook, desc: "E-Book"} + - {id: 39, cat: Console, desc: "Games/Console"} + - {id: 33, cat: PC/Games, desc: "Games/PC"} + - {id: 27, cat: Other, desc: "Misc"} + - {id: 37, cat: Movies/SD, desc: "Movies/Cam/TS"} + - {id: 14, cat: Movies/DVD, desc: "Movies/DVD-R"} + - {id: 18, cat: Movies/HD, desc: "Movies/HD"} + - {id: 19, cat: Movies/SD, desc: "Movies/SD"} + - {id: 42, cat: Movies/HD, desc: "Movies/x264"} + - {id: 41, cat: Movies/SD, desc: "Movies/Xvid"} + - {id: 29, cat: Audio, desc: "Music"} + - {id: 30, cat: TV, desc: "Packs"} + - {id: 24, cat: TV/HD, desc: "TV/HD"} + - {id: 25, cat: TV/SD, desc: "TV/SD"} + - {id: 44, cat: TV/HD, desc: "TV/x264"} + - {id: 43, cat: TV/SD, desc: "TV/Xvid"} + - {id: 36, cat: XXX, desc: "XXX"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: seedbox + type: checkbox + label: "Use SeedBox Download Link" + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + returnto: / + error: + - selector: table.main:contains("Login failed!") + message: + selector: table tr td.text + test: + path: browse.php + selector: a[href="logout.php"] + +search: + paths: + # https://xtremebytes.net/browse.php?search=&cat=0&incldead=1&c18=1&c42=1 + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + # 0 active, 1 incldead, 2 onlydead, 3 freeleech, 4 descr + incldead: "{{ if .Config.freeleech }}3{{ else }}1{{ end }}" + search: "{{ .Keywords }}" + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + # site does not support imdbid searching or display imdb links in results. + + rows: + selector: table[border="0"][cellspacing="0"][cellpadding="5"] tr:has(a[href^="download.php?id="]) + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + attribute: title + details: + selector: a[href^="details.php?id="] + attribute: href + download_1: + selector: a[href^="download.php"] + attribute: href + download_2: + selector: a[href^="download2.php"] + attribute: href + download: + text: "{{ if .Config.seedbox }}{{ .Result.download_2 }}{{ else }}{{ .Result.download_1 }}{{ end }}" + files: + selector: td:nth-child(3) + grabs: + selector: td:nth-child(7) + size: + selector: td:nth-child(6) + seeders: + selector: td:nth-last-child(3) + leechers: + selector: td:nth-last-child(2) + date: + selector: td:nth-child(5) + filters: + - name: append + args: " -07:00" # PDT + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + downloadvolumefactor: + case: + img[src="pic/freeleech.png"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 0.8 +# engine n/a diff --git a/config/prowlarr/Definitions/xwtclassics.yml b/config/prowlarr/Definitions/xwtclassics.yml new file mode 100644 index 0000000..fc01b0b --- /dev/null +++ b/config/prowlarr/Definitions/xwtclassics.yml @@ -0,0 +1,145 @@ +--- +id: xwtclassics +name: XWT-Classics +description: "XWT-Classics is a Private Torrent Tracker for CLASSIC PROFESSIONAL WRESTLING" +language: en-US +type: private +encoding: UTF-8 +links: + - https://xwt-classics.net/ +legacylinks: + - http://xwt-classics.net/ + +caps: + categorymappings: + - {id: 1, cat: TV/Sport, desc: "DVD"} + - {id: 9, cat: TV/Sport, desc: "Florida"} + - {id: 7, cat: TV/Sport, desc: "International"} + - {id: 6, cat: TV/Sport, desc: "Japan"} + - {id: 8, cat: TV/Sport, desc: "Misc"} + - {id: 11, cat: TV/Sport, desc: "NWA"} + - {id: 4, cat: TV/Sport, desc: "UWF/Mid-South"} + - {id: 12, cat: TV/Sport, desc: "WCW"} + - {id: 5, cat: TV/Sport, desc: "World Class"} + - {id: 10, cat: TV/Sport, desc: "WWE 24/7"} + - {id: 13, cat: TV/Sport, desc: "WWE Network"} + - {id: 2, cat: TV/Sport, desc: "WWF"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: seedbox + type: checkbox + label: "Use SeedBox Download Link" + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: table.main:contains("Login failed!") + message: + selector: table tr td.text + test: + path: browse.php + selector: a[href="logout.php"] + +search: + paths: + # http://xwt-classics.net/browse.php?search=ricks&cat=0&incldead=1 + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + # 0 active, 1 incldead, 2 onlydead, 3 freleech + incldead: "{{ if .Config.freeleech }}3{{ else }}1{{ end }}" + search: "{{ .Keywords }}" + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + + rows: + selector: table[border="0"][cellspacing="0"][cellpadding="5"] tr:has(a[href^="download.php?id="]) + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + optional: true + default: 8 + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + attribute: title + download_1: + selector: a[href^="download.php"] + attribute: href + download_2: + selector: a[href^="download2.php"] + attribute: href + download: + text: "{{ if .Config.seedbox }}{{ .Result.download_2 }}{{ else }}{{ .Result.download_1 }}{{ end }}" + details: + selector: a[href^="details.php?id="] + attribute: href + files: + selector: td:nth-child(3) + grabs: + selector: td:nth-child(7) + size: + selector: td:nth-child(6) + seeders: + selector: td:nth-last-child(3) + leechers: + selector: td:nth-last-child(2) + date: + selector: td:nth-child(5) + filters: + - name: append + args: " -07:00" # PDT + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + downloadvolumefactor: + case: + img[src="pic/freeleech.png"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 0.7 + minimumseedtime: + # 1 day (as seconds = 24 x 60 x 60) + text: 86400 +# engine n/a diff --git a/config/prowlarr/Definitions/xwtorrents.yml b/config/prowlarr/Definitions/xwtorrents.yml new file mode 100644 index 0000000..3c1dfdc --- /dev/null +++ b/config/prowlarr/Definitions/xwtorrents.yml @@ -0,0 +1,188 @@ +--- +id: xwtorrents +name: XWtorrents +description: "XtremeWrestlingTorrents (XWT) is a Private Torrent Tracker for PROFESSIONAL WRESTLING / MMA" +language: en-US +type: private +encoding: windows-1252 +links: + - https://xtremewrestlingtorrents.net/ +legacylinks: + - http://xtremewrestlingtorrents.net/ + +caps: + categorymappings: + - {id: 82, cat: TV/Sport, desc: "AEW Collision"} + - {id: 83, cat: TV/Sport, desc: "AEW Collision HD"} + - {id: 74, cat: TV/Sport, desc: "AEW Dynamite"} + - {id: 75, cat: TV/Sport, desc: "AEW Dynamite HD"} + - {id: 78, cat: TV/Sport, desc: "AEW PPV's"} + - {id: 79, cat: TV/Sport, desc: "AEW PPV's HD"} + - {id: 76, cat: TV/Sport, desc: "AEW Rampage"} + - {id: 77, cat: TV/Sport, desc: "AEW Rampage HD"} + - {id: 47, cat: TV/Sport, desc: "Boxing"} + - {id: 14, cat: Movies, desc: "Documentary"} + - {id: 20, cat: TV/Sport, desc: "DVD"} + - {id: 2, cat: TV/Sport, desc: "ECW Original"} + - {id: 26, cat: TV/Sport, desc: "ECW Weekly"} + - {id: 21, cat: TV/Sport, desc: "Int Indy's"} + - {id: 69, cat: TV/Sport, desc: "Lucha Libre"} + - {id: 70, cat: TV/Sport, desc: "Lucha Libre HD"} + - {id: 23, cat: TV/Sport, desc: "Misc"} + - {id: 24, cat: TV/Sport, desc: "MMA"} + - {id: 59, cat: TV/Sport, desc: "MMA HD"} + - {id: 30, cat: TV/Sport, desc: "Packs"} + - {id: 68, cat: TV/Sport, desc: "Podcasts"} + - {id: 29, cat: TV/Sport, desc: "Puro"} + - {id: 18, cat: TV/Sport, desc: "ROH"} + - {id: 52, cat: TV/Sport, desc: "ROH HD"} + - {id: 45, cat: TV/Sport, desc: "Shoot Interviews"} + - {id: 4, cat: TV/Sport, desc: "Single Matches"} + - {id: 7, cat: TV/Sport, desc: "TNA Impact"} + - {id: 49, cat: TV/Sport, desc: "TNA Impact HD"} + - {id: 6, cat: TV/Sport, desc: "TNA PPV's"} + - {id: 55, cat: TV/Sport, desc: "TNA PPV's HD"} + - {id: 66, cat: TV/Sport, desc: "Total Divas"} + - {id: 67, cat: TV/Sport, desc: "Total Divas HD"} + - {id: 57, cat: TV/Sport, desc: "Tough Enough"} + - {id: 58, cat: TV/Sport, desc: "Tough Enough HD"} + - {id: 22, cat: TV/Sport, desc: "USA Indy's"} + - {id: 12, cat: TV/Sport, desc: "WCW"} + - {id: 71, cat: TV/Sport, desc: "Womens Wrestling"} + - {id: 15, cat: TV/Sport, desc: "Wrestling Films"} + - {id: 72, cat: TV/Sport, desc: "WWE 205 Live"} + - {id: 73, cat: TV/Sport, desc: "WWE 205 Live HD"} + - {id: 16, cat: TV/Sport, desc: "WWE Heat"} + - {id: 63, cat: TV/Sport, desc: "WWE Main Event"} + - {id: 64, cat: TV/Sport, desc: "WWE Network"} + - {id: 65, cat: TV/Sport, desc: "WWE Network HD"} + - {id: 46, cat: TV/Sport, desc: "WWE NXT"} + - {id: 50, cat: TV/Sport, desc: "WWE NXT HD"} + - {id: 9, cat: TV/Sport, desc: "WWE PPV's"} + - {id: 56, cat: TV/Sport, desc: "WWE PPV's HD"} + - {id: 10, cat: TV/Sport, desc: "WWE RAW"} + - {id: 51, cat: TV/Sport, desc: "WWE RAW HD"} + - {id: 11, cat: TV/Sport, desc: "WWE Smackdown"} + - {id: 53, cat: TV/Sport, desc: "WWE Smackdown HD"} + - {id: 43, cat: TV/Sport, desc: "WWE Superstars"} + - {id: 54, cat: TV/Sport, desc: "WWE Superstars HD"} + - {id: 19, cat: TV/Sport, desc: "WWE Velocity"} + - {id: 31, cat: TV/Sport, desc: "WWE Vintage"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: seedbox + type: checkbox + label: "Use SeedBox Download Link" + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + returnto: / + error: + - selector: table.main:contains("Login failed!") + message: + selector: table tr td.text + test: + path: browse.php + selector: a[href="logout.php"] + +search: + paths: + # http://xtremewrestlingtorrents.net/browse.php?search=halftime+heat&c46=1&c51=1&c31=1&c11=1&incldead=1 + - path: browse.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + # 0 active, 1 incldead, 2 onlydead, 3 freeleech, 4 descr + incldead: "{{ if .Config.freeleech }}3{{ else }}1{{ end }}" + search: "{{ .Keywords }}" + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + + rows: + selector: table[border="0"][cellspacing="0"][cellpadding="5"] tr:has(a[href^="download.php?id="]) + + fields: + category: + selector: a[href^="browse.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + attribute: title + download_1: + selector: a[href^="download.php"] + attribute: href + download_2: + selector: a[href^="download2.php"] + attribute: href + download: + text: "{{ if .Config.seedbox }}{{ .Result.download_2 }}{{ else }}{{ .Result.download_1 }}{{ end }}" + details: + selector: a[href^="details.php?id="] + attribute: href + files: + selector: td:nth-child(3) + grabs: + selector: td:nth-child(7) + size: + selector: td:nth-child(6) + seeders: + selector: td:nth-last-child(3) + leechers: + selector: td:nth-last-child(2) + date: + selector: td:nth-child(5) + filters: + - name: append + args: " -07:00" # PDT + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + downloadvolumefactor: + case: + img[src="pic/freeleech.png"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 0.7 + minimumseedtime: + # 1 day (as seconds = 24 x 60 x 60) + text: 86400 +# engine n/a diff --git a/config/prowlarr/Definitions/xxxadulttorrent.yml b/config/prowlarr/Definitions/xxxadulttorrent.yml new file mode 100644 index 0000000..d935b4c --- /dev/null +++ b/config/prowlarr/Definitions/xxxadulttorrent.yml @@ -0,0 +1,64 @@ +--- +id: xxxadulttorrent +name: xxxAdultTorrent +description: "xxxAdultTorrent is a RUSSIAN Public tracker for 3X" +language: ru-RU +type: public +encoding: UTF-8 +links: + - https://xxxadulttorrent.org/ + +caps: + categories: + XXX: XXX + + modes: + search: [q] + +settings: [] + +download: + selectors: + - selector: a[href^="magnet:?xt="] + attribute: href + +search: + headers: + User-Agent: ["Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.203"] + + paths: + # https://xxxadulttorrent.org/search/vika + # https://xxxadulttorrent.org/browse/0/0/0/0 + - path: "{{ if .Keywords }}search/{{ .Keywords }}{{ else }}browse/0/0/0/0{{ end }}" + + rows: + # filter out torrents with 0B for issue #9756 + selector: li.content__item:has(div#torrent_info > div:contains("GB")), li.content__item:has(div#torrent_info > div:contains("MB")) + + fields: + category: + text: XXX + title: + selector: h1 + details: + selector: a[href^="/torrent/"] + attribute: href + download: + selector: a[href^="/torrent/"] + attribute: href + poster: + selector: img.content__item-img-wrapper + attribute: src + date: + text: now + size: + selector: div#torrent_info > div + seeders: + text: 1 + leechers: + text: 1 + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/xxxclub.yml b/config/prowlarr/Definitions/xxxclub.yml new file mode 100644 index 0000000..5d5db18 --- /dev/null +++ b/config/prowlarr/Definitions/xxxclub.yml @@ -0,0 +1,90 @@ +--- +id: xxxclub +name: XXXClub +description: "XXXClub is a Public torrent site for 3X" +language: en-US +type: public +encoding: UTF-8 +links: + - https://xxxclub.to/ + +caps: + categorymappings: + - {id: 0, cat: XXX/SD, desc: "XXX 480p/SD"} + - {id: 1, cat: XXX/x264, desc: "XXX 720p/HD"} + - {id: 2, cat: XXX/x264, desc: "XXX 1080p/FullHD"} + - {id: 4, cat: XXX/UHD, desc: "XXX 2160p/UHD/4K"} + - {id: 3, cat: XXX/WEB-DL, desc: "XXX Movies/DVD/WEB"} + - {id: 5, cat: XXX/ImageSet, desc: "XXX IMAGESET"} + - {id: 6, cat: XXX/Other, desc: "XXX VR"} + + modes: + search: [q] + +settings: + - name: sort + type: select + label: Sort requested from site + default: uploaded + options: + uploaded: created + size: size + seeders: seeders + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +download: + selectors: + - selector: a[href^="/torrents/download/"], a[href^="magnet:?xt="] + attribute: href + +search: + headers: + User-Agent: ["Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.203"] + + paths: + # https://xxxclub.to/torrents/browse/2,4/metartx?sort=size&order=asc + - path: "torrents/browse/{{ if .Categories }}{{ join .Categories \",\" }}{{ else }}all{{ end }}/{{ .Keywords }}?sort={{ .Config.sort }}&order={{ .Config.type }}" + + rows: + selector: div.browsetableinside > ul > li:not(:first-child) + + fields: + category: + selector: a.catah + attribute: href + filters: + - name: regexp + args: (\d) + title: + selector: a[href^="/torrents/details/"] + details: + selector: a[href^="/torrents/details/"] + attribute: href + download: + selector: a[href^="/torrents/details/"] + attribute: href + poster: + selector: img + attribute: src + date: + selector: span.adde + filters: + - name: dateparse + args: "dd MMM yyyy HH:mm:ss" + size: + selector: span.siz + seeders: + selector: span.see + leechers: + selector: span.lee + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/xxxtor.yml b/config/prowlarr/Definitions/xxxtor.yml new file mode 100644 index 0000000..467b7d3 --- /dev/null +++ b/config/prowlarr/Definitions/xxxtor.yml @@ -0,0 +1,90 @@ +--- +id: xxxtor +name: xxxtor +description: "xxxtor is a RUSSIAN Public Torrent Tracker for 3X" +language: ru-RU +type: public +encoding: UTF-8 +links: + - https://xxxtor.com/ +legacylinks: + - https://xxxtor.org/ # redirects to .com + - https://xxxtor.info/ # redirects to .com + +caps: + categorymappings: + - {id: XXX, cat: XXX, desc: "XXX"} + + modes: + search: [q] + +settings: [] + +search: + # https://xxxtor.com/b.php?search=penny + paths: + - path: b.php + inputs: + search: "{{ if .Keywords }}{{ .Keywords }}{{ else }}{{ .Today.Year }}{{ end }}" + + rows: + selector: table > tbody > tr.gai + filters: + - name: andmatch + + fields: + category: + text: XXX + title: + selector: a[href^="/torrent/"] + details: + selector: a[href^="/torrent/"] + attribute: href + download: + selector: a[href^="/download/"] + attribute: href + magnet: + selector: a[href^="magnet:?xt="] + attribute: href + date: + selector: td:first-of-type + filters: + - name: replace + args: ["Янв", "Jan"] + - name: replace + args: ["Фев", "Feb"] + - name: replace + args: ["Мар", "Mar"] + - name: replace + args: ["Апр", "Apr"] + - name: replace + args: ["Май", "May"] + - name: replace + args: ["Июн", "Jun"] + - name: replace + args: ["Июл", "Jul"] + - name: replace + args: ["Авг", "Aug"] + - name: replace + args: ["Сен", "Sep"] + - name: replace + args: ["Окт", "Oct"] + - name: replace + args: ["Ноя", "Nov"] + - name: replace + args: ["Дек", "Dec"] + - name: append + args: " +03:00" # MSK + - name: dateparse + args: "dd MMM yy zzz" + size: + selector: td:nth-of-type(3) + seeders: + selector: td:last-of-type span:first-of-type + leechers: + selector: td:last-of-type span:last-of-type + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/ydypt.yml b/config/prowlarr/Definitions/ydypt.yml new file mode 100644 index 0000000..e96bfee --- /dev/null +++ b/config/prowlarr/Definitions/ydypt.yml @@ -0,0 +1,173 @@ +--- +id: ydypt +name: YDYPT +description: "YDYPT is a CHINESE Private Torrent Tracker for MOVIES / TV / 3X" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://pt.hdbd.us/ + +caps: + categorymappings: + - {id: 420, cat: Movies/BluRay, desc: "电影BluRay Movies"} + - {id: 423, cat: Movies/HD, desc: "电影HD Movies"} + - {id: 424, cat: TV/HD, desc: "剧集BluRay TV"} + - {id: 421, cat: TV/HD, desc: "剧集HD TV"} + - {id: 506, cat: XXX, desc: "有码censured BluRay 3X"} + - {id: 500, cat: XXX, desc: "有码censured HD 3X"} + - {id: 507, cat: XXX, desc: "无码uncensured BluRay 3X"} + - {id: 501, cat: XXX, desc: "无码uncensured HD 3X"} + - {id: 503, cat: XXX, desc: "欧美Euro&USA 3X"} + - {id: 502, cat: XXX, desc: "国产自拍Homemade 3X"} + - {id: 509, cat: XXX, desc: "里番H-Anime"} + - {id: 422, cat: XXX, desc: "其他Other 3X"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + logout: forever + securelogin: "" + error: + - selector: td.embedded:has(h2:contains("失败")) + test: + path: index.php + selector: a[href*="logout.php"] + +search: + paths: + # https://pt.hdbd.us/torrents.php?incldead=0&spstate=0&picktype=0&inclbookmarked=0&search=&search_area=0&search_mode=0 + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + # currently supports only one query id at one time. + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 popular, 3 classic, 4 recomended, 5 0day, 6 imdb top 250 + picktype: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30%, 8 all promotions + spstate: "{{ if .Config.freeleech }}8{{ else }}0{{ end }}" + # 0 title, 1 descr, 2 subtitltes, 3 uploader, 4 imdburl + search_area: "{{ if .Query.IMDBID }}4{{ else }}{{ end }}{{ if .Query.DoubanID }}1{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }}{{ else }}0{{ end }}" + # 0 AND 1 OR 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(table.torrentname) + + fields: + category: + selector: a[href*="cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td:nth-child(5) + seeders: + selector: td:nth-child(6) + leechers: + selector: td:nth-child(7) + grabs: + selector: td:nth-child(8) + downloadvolumefactor: + case: + font.free: 0 + font.twoupfree: 0 + font.halfdown: 0.5 + font.twouphalfdown: 0.5 + font.thirtypercent: 0.3 + "*": 1 + uploadvolumefactor: + case: + font.twouphalfdown: 2 + font.twoupfree: 2 + font.twoup: 2 + "*": 1 + minimumratio: + text: 0.8 + description: + selector: td:nth-child(2) + remove: a, b, font, img, span +# NexusPHP Standard v1.5 Beta 4 (custom ulvf dlvf) diff --git a/config/prowlarr/Definitions/yggcookie.yml b/config/prowlarr/Definitions/yggcookie.yml new file mode 100644 index 0000000..9198a91 --- /dev/null +++ b/config/prowlarr/Definitions/yggcookie.yml @@ -0,0 +1,387 @@ +--- +id: yggcookie +name: YGGcookie +description: "YGGTorrent is a FRENCH Semi-Private Torrent Tracker for 0DAY / GENERAL" +language: fr-FR +type: semi-private +encoding: UTF-8 +followredirect: true +requestDelay: 2 +links: + - https://www3.yggtorrent.qa/ +legacylinks: + - https://ww3.yggtorrent.si/ + - https://yggtorrent.si/ + - http://www2.yggtorrent.si/ + - https://www2.yggtorrent.si/ + - https://www.yggtorrent.li/ + - https://www4.yggtorrent.li/ + - https://www3.yggtorrent.nz/ + - https://www3.yggtorrent.re/ + - https://www3.yggtorrent.la/ + - https://www5.yggtorrent.la/ + - https://www5.yggtorrent.fi/ + - https://yggtorrent.lol/ + - https://www6.yggtorrent.lol/ + - https://www3.yggtorrent.do/ + - https://www3.yggtorrent.wtf/ + +caps: + categorymappings: + - {id: 2145, cat: TV, desc: "Film/Vidéo"} + - {id: 2178, cat: Movies/Other, desc: "Film/Vidéo : Animation"} # changed to movies, see #3553 + - {id: 2179, cat: TV/Anime, desc: "Film/Vidéo : Animation Série"} + - {id: 2180, cat: Audio/Video, desc: "Film/Vidéo : Concert"} + - {id: 2181, cat: TV/Documentary, desc: "Film/Vidéo : Documentaire"} + - {id: 2182, cat: TV, desc: "Film/Vidéo : Emission TV"} + - {id: 2183, cat: Movies, desc: "Film/Vidéo : Film"} + - {id: 2184, cat: TV, desc: "Film/Vidéo : Série TV"} + - {id: 2185, cat: TV, desc: "Film/Vidéo : Spectacle"} + - {id: 2186, cat: TV/Sport, desc: "Film/Vidéo : Sport"} + - {id: 2187, cat: TV/Other, desc: "Film/Vidéo : Vidéo-clips"} + - {id: 2139, cat: Audio, desc: "Audio"} + - {id: 2147, cat: Audio, desc: "Audio : Karaoké"} + - {id: 2148, cat: Audio, desc: "Audio : Musique"} + - {id: 2150, cat: Audio, desc: "Audio : Podcast Radio"} + - {id: 2149, cat: Audio/Other, desc: "Audio : Samples"} + - {id: 2144, cat: PC, desc: "Application"} + - {id: 2177, cat: PC/0day, desc: "Application : Autre"} + - {id: 2176, cat: PC, desc: "Application : Formation"} + - {id: 2171, cat: PC/ISO, desc: "Application : Linux"} + - {id: 2172, cat: PC/Mac, desc: "Application : MacOS"} + - {id: 2174, cat: PC/Mobile-Android, desc: "Application : Smartphone"} + - {id: 2175, cat: PC/Mobile-Android, desc: "Application : Tablette"} + - {id: 2173, cat: PC/0day, desc: "Application : Windows"} + - {id: 2142, cat: PC/Games, desc: "Jeu vidéo"} + - {id: 2167, cat: Console/Other, desc: "Jeu vidéo : Autre"} + - {id: 2159, cat: PC/Games, desc: "Jeu vidéo : Linux"} + - {id: 2160, cat: PC/Games, desc: "Jeu vidéo : MacOS"} + - {id: 2162, cat: Console/XBox One, desc: "Jeu vidéo : Microsoft"} + - {id: 2163, cat: Console/Wii, desc: "Jeu vidéo : Nintendo"} + - {id: 2165, cat: PC/Mobile-Android, desc: "Jeu vidéo : Smartphone"} + - {id: 2164, cat: Console/PS4, desc: "Jeu vidéo : Sony"} + - {id: 2166, cat: PC/Mobile-Android, desc: "Jeu vidéo : Tablette"} + - {id: 2161, cat: PC/Games, desc: "Jeu vidéo : Windows"} + - {id: 2140, cat: Books, desc: "eBook"} + - {id: 2151, cat: Audio/Audiobook, desc: "eBook : Audio"} + - {id: 2152, cat: Books/EBook, desc: "eBook : Bds"} + - {id: 2153, cat: Books/Comics, desc: "eBook : Comics"} + - {id: 2154, cat: Books/EBook, desc: "eBook : Livres"} + - {id: 2155, cat: Books/Comics, desc: "eBook : Mangas"} + - {id: 2156, cat: Books/Mags, desc: "eBook : Presse"} + - {id: 2300, cat: Other, desc: "Nulled"} + - {id: 2301, cat: Other, desc: "Nulled : Wordpress"} + - {id: 2302, cat: Other, desc: "Nulled : Scripts PHP & CMS"} + - {id: 2303, cat: Other, desc: "Nulled : Mobile"} + - {id: 2304, cat: Other, desc: "Nulled : Divers"} + - {id: 2200, cat: Other, desc: "Imprimante 3D"} + - {id: 2201, cat: Other, desc: "Imprimante 3D : Objets"} + - {id: 2202, cat: Other, desc: "Imprimante 3D : Personnages"} + - {id: 2141, cat: Other, desc: "Emulation"} + - {id: 2157, cat: Other, desc: "Emulation : Emulateurs"} + - {id: 2158, cat: Other, desc: "Emulation : Roms"} + - {id: 2143, cat: Other, desc: "GPS"} + - {id: 2168, cat: Other, desc: "GPS : Applications"} + - {id: 2169, cat: Other, desc: "GPS : Cartes"} + - {id: 2170, cat: Other, desc: "GPS : Divers"} + - {id: 2188, cat: XXX, desc: "XXX"} + - {id: 2401, cat: XXX/Other, desc: "XXX : Ebooks"} + - {id: 2189, cat: XXX, desc: "XXX : Films"} + - {id: 2190, cat: XXX, desc: "XXX : Hentai"} + - {id: 2191, cat: XXX/ImageSet, desc: "XXX : Images"} + - {id: 2402, cat: XXX/Other, desc: "XXX : Jeux"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + allowrawsearch: true + +settings: + - name: cookie + type: text + label: Cookie + - name: info_cookie + type: info + label: How to get the Cookie + default: "
    1. Login to this tracker with your browser
    2. Open the DevTools panel by pressing F12
    3. Select the Network tab
    4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
    5. Refresh the page by pressing F5
    6. Click on the first row entry
    7. Select the Headers tab on the Right panel
    8. Find 'cookie:' in the Request Headers section
    9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
    " + - name: useragent + type: text + label: User-Agent + - name: info_useragent + type: info + label: How to get the User-Agent + default: "
    1. From the same place you fetched the cookie,
    2. Find 'user-agent:' in the Request Headers section
    3. Select and Copy the whole user-agent string (everything after 'user-agent: ') and Paste here.
    " + - name: category + type: select + label: Category + default: all + options: + all: "Tous" + 2145: "Film/Vidéo" + 2139: "Audio" + 2144: "Application" + 2142: "Jeu vidéo" + 2140: "eBook" + 2300: "Nulled" + 2200: "Imprimante 3D" + 2141: "Emulation" + 2143: "GPS" + 2188: "XXX" + - name: subcategory + type: select + label: Sub-category + default: all + options: + all: "Tous" + 2178: "Film/Vidéo : Animation" + 2179: "Film/Vidéo : Animation Série" + 2180: "Film/Vidéo : Concert" + 2181: "Film/Vidéo : Documentaire" + 2182: "Film/Vidéo : Emission TV" + 2183: "Film/Vidéo : Film" + 2184: "Film/Vidéo : Série TV" + 2185: "Film/Vidéo : Spectacle" + 2186: "Film/Vidéo : Sport" + 2187: "Film/Vidéo : Vidéo-clips" + 2147: "Audio : Karaoké" + 2148: "Audio : Musique" + 2150: "Audio : Podcast Radio" + 2149: "Audio : Samples" + 2177: "Application : Autre" + 2176: "Application : Formation" + 2171: "Application : Linux" + 2172: "Application : MacOS" + 2174: "Application : Smartphone" + 2175: "Application : Tablette" + 2173: "Application : Windows" + 2167: "Jeu vidéo : Autre" + 2159: "Jeu vidéo : Linux" + 2160: "Jeu vidéo : MacOS" + 2162: "Jeu vidéo : Microsoft" + 2163: "Jeu vidéo : Nintendo" + 2165: "Jeu vidéo : Smartphone" + 2164: "Jeu vidéo : Sony" + 2166: "Jeu vidéo : Tablette" + 2161: "Jeu vidéo : Windows" + 2151: "eBook : Audio" + 2152: "eBook : Bds" + 2153: "eBook : Comics" + 2154: "eBook : Livres" + 2155: "eBook : Mangas" + 2156: "eBook : Presse" + 2301: "Nulled : Wordpress" + 2302: "Nulled : Scripts PHP & CMS" + 2303: "Nulled : Mobile" + 2304: "Nulled : Divers" + 2201: "Imprimante 3D : Objets" + 2202: "Imprimante 3D : Personnages" + 2157: "Emulation : Emulateurs" + 2158: "Emulation : Roms" + 2168: "GPS : Applications" + 2169: "GPS : Cartes" + 2170: "GPS : Divers" + 2401: "XXX : Ebooks" + 2189: "XXX : Films" + 2190: "XXX : Hentai" + 2191: "XXX : Images" + 2402: "XXX : Jeux" + - name: info_category + type: info + label: Category and Sub-category + default: Only select a Category OR a Sub-category, leaving the other as Tous. + - name: multilang + type: checkbox + label: Replace MULTi by another language in release name + default: false + - name: multilanguage + type: select + label: Replace MULTi by this language + default: FRENCH + options: + FRENCH: FRENCH + MULTi.FRENCH: MULTi.FRENCH + ENGLISH: ENGLISH + MULTi.ENGLISH: MULTi.ENGLISH + VOSTFR: VOSTFR + MULTi.VOSTFR: MULTi.VOSTFR + - name: vostfr + type: checkbox + label: Replace VOSTFR and SUBFRENCH with ENGLISH + default: false + - name: filter_title + type: checkbox + label: Normalize release names by moving year after the title + default: false + - name: strip_season + type: checkbox + label: Strip season only (e.g. S01) from searches, as tracker does not support partial matches + default: true + - name: enhancedAnime + type: checkbox + label: Enhance Sonarr compatibility with anime by renaming episodes (xxx > Exxx). Can disturb movies search (e.g. Back To The Future 3 > Back To The Future E3). + default: false + - name: enhancedAnime4 + type: checkbox + label: Extend the Sonarr compatibility with anime up to 4 digits. This WILL break all searches and result titles which contain years. + default: false + - name: sort + type: select + label: Sort requested from site + default: publish_date + options: + publish_date: created + seed: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: flaresolverr + type: info + label: FlareSolverr + default: This site may use Cloudflare DDoS Protection, therefore Prowlarr may require FlareSolver added as a proxy in Prowlarr (Settings => Indexers) to access it. + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: / + selector: div#top_panel:contains("Déconnexion") + +search: + paths: + - path: engine/search + inputs: + name: "{{ .Keywords }}" + followredirect: true + - path: engine/search + inputs: + $raw: "name={{ if .Keywords }}{{ re_replace .Keywords \"(?i)S0?(\\d{1,2})\" \"Saison $1\" }}{{ else }}&page=50{{ end }}" + followredirect: true + inputs: + $raw: "{{ if eq .Config.subcategory \"all\" }}category={{ .Config.category }}{{ else }}sub_category={{ .Config.subcategory }}{{ end }}" + do: search + order: "{{ .Config.type }}" + sort: "{{ .Config.sort }}" + + headers: + User-Agent: ["{{ .Config.useragent }}"] + + keywordsfilters: + - name: re_replace # 1234 > E1234 + args: ["\\b(\\d{4})\\b", "{{ if .Config.enhancedAnime4 }}E$1{{ else }}$1{{ end }}"] + - name: re_replace # 123 > E123 + args: ["\\b(\\d{2,3})\\b", "{{ if .Config.enhancedAnime }}E$1{{ else }}$1{{ end }}"] + # fix date search and workaround for internal YGG issues + - name: re_replace + args: ["[\\\\\\-\\.\\/!\\s]+", " "] + # strip season as site does not support partial matches + - name: re_replace + args: ["(?i)\\b(S\\d{1,3})\\b", "{{ if .Config.strip_season }}{{ else }}$1{{ end }}"] + - name: trim + # put each word in quotations to prevent exact phrase search + - name: re_replace + args: ["([^\\s]+)", "\"$1\""] + + rows: + selector: table.table > tbody > tr + + fields: + _id: + selector: td:nth-child(2) > a + attribute: href + filters: + - name: regexp + args: "/(\\d+)-" + title_normal: + selector: td:nth-child(2) > a + filters: + # Saison 1 Episode 2 > S01E02 + - name: re_replace + args: ["(?i)\\b(Saisons?[\\s\\.]*)(\\d{4}(?:[\\s\\.\\-aà]+\\d{4})?)([\\s\\.]*[EÉ]pisodes?[\\s\\.]*)(\\d{1,3}(?:[\\s\\.\\-aà]+\\d{1,3})?)\\b", "{{ if .Config.enhancedAnime4 }}S$2E$4{{ else }}$1$2$3$4{{ end }}"] + - name: re_replace + args: ["(?i)\\bSaisons?[\\s\\.]*(\\d{1,3}(?:[\\s\\.\\-aà]+\\d{1,3})?)[\\s\\.]*[EÉ]pisodes?[\\s\\.]*(\\d{1,3}(?:[\\s\\.\\-aà]+\\d{1,3})?)\\b", "S$1E$2"] + # Saison 1 > S01 + - name: re_replace + args: ["(?i)\\b(Saisons?[\\s\\.]*)(\\d{4}(?:[\\s\\.\\-aà]+\\d{4})?)\\b", "{{ if .Config.enhancedAnime4 }}S$2{{ else }}$1$2{{ end }}"] + - name: re_replace + args: ["(?i)\\bSaisons?[\\s\\.]*(\\d{1,3}(?:[\\s\\.\\-aà]+\\d{1,3})?)\\b", "S$1"] + # Episode 1 > E01 + - name: re_replace + args: ["(?i)\\b([EÉ]pisodes?[\\s\\.]*)(\\d{4}(?:[\\s\\.\\-aà]+\\d{4})?)\\b", "{{ if .Config.enhancedAnime4 }}S$2{{ else }}$1$2{{ end }}"] + - name: re_replace + args: ["(?i)\\b[EÉ]pisodes?[\\s\\.]*(\\d{1,3}(?:[\\s\\.\\-aà]+\\d{1,3})?)\\b", "S$1"] + # S1 à 2 > S1-2 + - name: re_replace + args: ["(?i)\\b(S?\\d*[SE])(\\d{4})([\\s\\.\\-aà]+)(\\d{4})\\b", "{{ if .Config.enhancedAnime4 }}$1$2-$4{{ else }}$1$2$3$4{{ end }}"] + - name: re_replace + args: ["(?i)\\b(S?\\d*[SE])(\\d{1,3})[\\s\\.\\-aà]+(\\d{1,3})\\b", "$1$2-$3"] + # Replace French date dd-mm-yyyy to yyyy.mm.dd + - name: re_replace + args: ["\\b(\\d{2})[\\-_\\.](\\d{2})[\\-_\\.](\\d{4})\\b", "$3.$2.$1"] + title_filtered: + text: "{{ .Result.title_normal }}" + filters: + - name: re_replace + args: ["(?i)^(?:(.+?)((?:[\\.\\-\\s_\\[]+(?:imax|(?:dvd|bd|tv)(?:rip|scr)|bluray(?:\\-?rip)?|720\\s*p?|1080\\s*p?|vof?|vost(?:fr)?|multi|vf(?:f|q)?[1-3]?|(?:true)?french|eng?)[\\.\\-\\s_\\]]*)*)([\\(\\[]?(?:20|1[7-9])\\d{2}[\\)\\]]?)(.*)$|(.*))$", "$1 $3 $2 $4 $5"] + - name: trim + - name: re_replace + args: ["(?i)(.\\b(mkv|avi|divx|xvid|mp4)\\b)$", ""] + - name: re_replace + args: ["(\\s+)", " "] + - name: trim + title_phase1: + text: "{{ if .Config.filter_title }}{{ .Result.title_filtered }}{{ else }}{{ .Result.title_normal }}{{ end }}" + title_vostfr: + text: "{{ .Result.title_phase1 }}" + filters: + - name: re_replace + args: ["(?i)\\b(vostfr|subfrench)\\b", "ENGLISH"] + title_phase2: + text: "{{ if .Config.vostfr }}{{ .Result.title_vostfr }}{{ else }}{{ .Result.title_phase1 }}{{ end }}" + title_multilang: + text: "{{ .Result.title_phase2 }}" + filters: + - name: re_replace + args: ["(?i)\\b(MULTI(?!.*(?:FRENCH|ENGLISH|VOSTFR)))\\b", "{{ .Config.multilanguage }}"] + title: + text: "{{ if .Config.multilang }}{{ .Result.title_multilang }}{{ else }}{{ .Result.title_phase2 }}{{ end }}" + filters: + - name: re_replace + args: ["\\b(\\d{4})\\b", "{{ if .Config.enhancedAnime4 }}E$1{{ else }}$1{{ end }}"] + - name: re_replace + args: ["\\b(\\d{2,3})\\b", "{{ if .Config.enhancedAnime }}E$1{{ else }}$1{{ end }}"] + details: + selector: td:nth-child(2) > a + attribute: href + category: + selector: td:nth-child(1) > div.hidden + download: + text: "/engine/download_torrent?id={{ .Result._id }}" + date: + # unix + selector: td:nth-child(5) > div.hidden + size: + selector: td:nth-child(6) + filters: + - name: replace + args: ["o", "B"] + grabs: + selector: td:nth-child(7) + seeders: + selector: td:nth-child(8) + leechers: + selector: td:nth-child(9) + downloadvolumefactor: + text: 1 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/yggtorrent.yml b/config/prowlarr/Definitions/yggtorrent.yml new file mode 100644 index 0000000..05f6365 --- /dev/null +++ b/config/prowlarr/Definitions/yggtorrent.yml @@ -0,0 +1,391 @@ +--- +id: yggtorrent +name: YGGtorrent +description: "YGGTorrent is a FRENCH Semi-Private Torrent Tracker for 0DAY / GENERAL" +language: fr-FR +type: semi-private +encoding: UTF-8 +followredirect: true +requestDelay: 2 +links: + - https://www3.yggtorrent.qa/ +legacylinks: + - https://ww3.yggtorrent.si/ + - https://yggtorrent.si/ + - http://www2.yggtorrent.si/ + - https://www2.yggtorrent.si/ + - https://www.yggtorrent.li/ + - https://www4.yggtorrent.li/ + - https://www3.yggtorrent.nz/ + - https://www3.yggtorrent.re/ + - https://www3.yggtorrent.la/ + - https://www5.yggtorrent.la/ + - https://www5.yggtorrent.fi/ + - https://yggtorrent.lol/ + - https://www6.yggtorrent.lol/ + - https://www3.yggtorrent.do/ + - https://www3.yggtorrent.wtf/ + +caps: + categorymappings: + - {id: 2145, cat: TV, desc: "Film/Vidéo"} + - {id: 2178, cat: Movies/Other, desc: "Film/Vidéo : Animation"} # changed to movies, see #3553 + - {id: 2179, cat: TV/Anime, desc: "Film/Vidéo : Animation Série"} + - {id: 2180, cat: Audio/Video, desc: "Film/Vidéo : Concert"} + - {id: 2181, cat: TV/Documentary, desc: "Film/Vidéo : Documentaire"} + - {id: 2182, cat: TV, desc: "Film/Vidéo : Emission TV"} + - {id: 2183, cat: Movies, desc: "Film/Vidéo : Film"} + - {id: 2184, cat: TV, desc: "Film/Vidéo : Série TV"} + - {id: 2185, cat: TV, desc: "Film/Vidéo : Spectacle"} + - {id: 2186, cat: TV/Sport, desc: "Film/Vidéo : Sport"} + - {id: 2187, cat: TV/Other, desc: "Film/Vidéo : Vidéo-clips"} + - {id: 2139, cat: Audio, desc: "Audio"} + - {id: 2147, cat: Audio, desc: "Audio : Karaoké"} + - {id: 2148, cat: Audio, desc: "Audio : Musique"} + - {id: 2150, cat: Audio, desc: "Audio : Podcast Radio"} + - {id: 2149, cat: Audio/Other, desc: "Audio : Samples"} + - {id: 2144, cat: PC, desc: "Application"} + - {id: 2177, cat: PC/0day, desc: "Application : Autre"} + - {id: 2176, cat: PC, desc: "Application : Formation"} + - {id: 2171, cat: PC/ISO, desc: "Application : Linux"} + - {id: 2172, cat: PC/Mac, desc: "Application : MacOS"} + - {id: 2174, cat: PC/Mobile-Android, desc: "Application : Smartphone"} + - {id: 2175, cat: PC/Mobile-Android, desc: "Application : Tablette"} + - {id: 2173, cat: PC/0day, desc: "Application : Windows"} + - {id: 2142, cat: PC/Games, desc: "Jeu vidéo"} + - {id: 2167, cat: Console/Other, desc: "Jeu vidéo : Autre"} + - {id: 2159, cat: PC/Games, desc: "Jeu vidéo : Linux"} + - {id: 2160, cat: PC/Games, desc: "Jeu vidéo : MacOS"} + - {id: 2162, cat: Console/XBox One, desc: "Jeu vidéo : Microsoft"} + - {id: 2163, cat: Console/Wii, desc: "Jeu vidéo : Nintendo"} + - {id: 2165, cat: PC/Mobile-Android, desc: "Jeu vidéo : Smartphone"} + - {id: 2164, cat: Console/PS4, desc: "Jeu vidéo : Sony"} + - {id: 2166, cat: PC/Mobile-Android, desc: "Jeu vidéo : Tablette"} + - {id: 2161, cat: PC/Games, desc: "Jeu vidéo : Windows"} + - {id: 2140, cat: Books, desc: "eBook"} + - {id: 2151, cat: Audio/Audiobook, desc: "eBook : Audio"} + - {id: 2152, cat: Books/EBook, desc: "eBook : Bds"} + - {id: 2153, cat: Books/Comics, desc: "eBook : Comics"} + - {id: 2154, cat: Books/EBook, desc: "eBook : Livres"} + - {id: 2155, cat: Books/Comics, desc: "eBook : Mangas"} + - {id: 2156, cat: Books/Mags, desc: "eBook : Presse"} + - {id: 2300, cat: Other, desc: "Nulled"} + - {id: 2301, cat: Other, desc: "Nulled : Wordpress"} + - {id: 2302, cat: Other, desc: "Nulled : Scripts PHP & CMS"} + - {id: 2303, cat: Other, desc: "Nulled : Mobile"} + - {id: 2304, cat: Other, desc: "Nulled : Divers"} + - {id: 2200, cat: Other, desc: "Imprimante 3D"} + - {id: 2201, cat: Other, desc: "Imprimante 3D : Objets"} + - {id: 2202, cat: Other, desc: "Imprimante 3D : Personnages"} + - {id: 2141, cat: Other, desc: "Emulation"} + - {id: 2157, cat: Other, desc: "Emulation : Emulateurs"} + - {id: 2158, cat: Other, desc: "Emulation : Roms"} + - {id: 2143, cat: Other, desc: "GPS"} + - {id: 2168, cat: Other, desc: "GPS : Applications"} + - {id: 2169, cat: Other, desc: "GPS : Cartes"} + - {id: 2170, cat: Other, desc: "GPS : Divers"} + - {id: 2188, cat: XXX, desc: "XXX"} + - {id: 2401, cat: XXX/Other, desc: "XXX : Ebooks"} + - {id: 2189, cat: XXX, desc: "XXX : Films"} + - {id: 2190, cat: XXX, desc: "XXX : Hentai"} + - {id: 2191, cat: XXX/ImageSet, desc: "XXX : Images"} + - {id: 2402, cat: XXX/Other, desc: "XXX : Jeux"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + allowrawsearch: true + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: category + type: select + label: Category + default: all + options: + all: "Tous" + 2145: "Film/Vidéo" + 2139: "Audio" + 2144: "Application" + 2142: "Jeu vidéo" + 2140: "eBook" + 2300: "Nulled" + 2200: "Imprimante 3D" + 2141: "Emulation" + 2143: "GPS" + 2188: "XXX" + - name: subcategory + type: select + label: Sub-category + default: all + options: + all: "Tous" + 2178: "Film/Vidéo : Animation" + 2179: "Film/Vidéo : Animation Série" + 2180: "Film/Vidéo : Concert" + 2181: "Film/Vidéo : Documentaire" + 2182: "Film/Vidéo : Emission TV" + 2183: "Film/Vidéo : Film" + 2184: "Film/Vidéo : Série TV" + 2185: "Film/Vidéo : Spectacle" + 2186: "Film/Vidéo : Sport" + 2187: "Film/Vidéo : Vidéo-clips" + 2147: "Audio : Karaoké" + 2148: "Audio : Musique" + 2150: "Audio : Podcast Radio" + 2149: "Audio : Samples" + 2177: "Application : Autre" + 2176: "Application : Formation" + 2171: "Application : Linux" + 2172: "Application : MacOS" + 2174: "Application : Smartphone" + 2175: "Application : Tablette" + 2173: "Application : Windows" + 2167: "Jeu vidéo : Autre" + 2159: "Jeu vidéo : Linux" + 2160: "Jeu vidéo : MacOS" + 2162: "Jeu vidéo : Microsoft" + 2163: "Jeu vidéo : Nintendo" + 2165: "Jeu vidéo : Smartphone" + 2164: "Jeu vidéo : Sony" + 2166: "Jeu vidéo : Tablette" + 2161: "Jeu vidéo : Windows" + 2151: "eBook : Audio" + 2152: "eBook : Bds" + 2153: "eBook : Comics" + 2154: "eBook : Livres" + 2155: "eBook : Mangas" + 2156: "eBook : Presse" + 2301: "Nulled : Wordpress" + 2302: "Nulled : Scripts PHP & CMS" + 2303: "Nulled : Mobile" + 2304: "Nulled : Divers" + 2201: "Imprimante 3D : Objets" + 2202: "Imprimante 3D : Personnages" + 2157: "Emulation : Emulateurs" + 2158: "Emulation : Roms" + 2168: "GPS : Applications" + 2169: "GPS : Cartes" + 2170: "GPS : Divers" + 2401: "XXX : Ebooks" + 2189: "XXX : Films" + 2190: "XXX : Hentai" + 2191: "XXX : Images" + 2402: "XXX : Jeux" + - name: info_category + type: info + label: Category and Sub-category + default: Only select a Category OR a Sub-category, leaving the other as Tous. + - name: multilang + type: checkbox + label: Replace MULTi by another language in release name + default: false + - name: multilanguage + type: select + label: Replace MULTi by this language + default: FRENCH + options: + FRENCH: FRENCH + MULTi.FRENCH: MULTi.FRENCH + ENGLISH: ENGLISH + MULTi.ENGLISH: MULTi.ENGLISH + VOSTFR: VOSTFR + MULTi.VOSTFR: MULTi.VOSTFR + - name: vostfr + type: checkbox + label: Replace VOSTFR and SUBFRENCH with ENGLISH + default: false + - name: filter_title + type: checkbox + label: Normalize release names by moving year after the title + default: false + - name: strip_season + type: checkbox + label: Strip season only (e.g. S01) from searches, as tracker does not support partial matches + default: true + - name: enhancedAnime + type: checkbox + label: Enhance Sonarr compatibility with anime by renaming episodes (xxx > Exxx). Can disturb movies search (e.g. Back To The Future 3 > Back To The Future E3). + default: false + - name: enhancedAnime4 + type: checkbox + label: Extend the Sonarr compatibility with anime up to 4 digits. This WILL break all searches and result titles which contain years. + default: false + - name: sort + type: select + label: Sort requested from site + default: publish_date + options: + publish_date: created + seed: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: flaresolverr + type: info + label: FlareSolverr + default: This site may use Cloudflare DDoS Protection, therefore Prowlarr may require FlareSolver added as a proxy in Prowlarr (Settings => Indexers) to access it. + +login: + method: form + path: / + form: "#user-login" + inputs: + id: "{{ .Config.username }}" + pass: "{{ .Config.password }}" + ci_csrf_token: "" + error: + - selector: "#login_msg_pass[style=\"\"][style] > center" + - selector: "#ban_msg_login[style=\"\"][style] > center" + - selector: "#login_msg_mail[style=\"\"][style] > center" + - selector: a[href$="/user/disabled"] + message: + # Compte Inactif + selector: a[href$="/user/disabled"] strong + filters: + - name: append + args: " - Dès que vous passez en dessous d'un ratio inférieur à 1, Votre compte devient inactif et le site vous coupe les téléchargements." + test: + path: / + selector: div#top_panel:contains("Déconnexion") + +search: + paths: + - path: engine/search + inputs: + name: "{{ .Keywords }}" + followredirect: true + - path: engine/search + inputs: + $raw: "name={{ if .Keywords }}{{ re_replace .Keywords \"(?i)S0?(\\d{1,2})\" \"Saison $1\" }}{{ else }}&page=50{{ end }}" + followredirect: true + inputs: + $raw: "{{ if eq .Config.subcategory \"all\" }}category={{ .Config.category }}{{ else }}sub_category={{ .Config.subcategory }}{{ end }}" + do: search + order: "{{ .Config.type }}" + sort: "{{ .Config.sort }}" + + keywordsfilters: + - name: re_replace # 1234 > E1234 + args: ["\\b(\\d{4})\\b", "{{ if .Config.enhancedAnime4 }}E$1{{ else }}$1{{ end }}"] + - name: re_replace # 123 > E123 + args: ["\\b(\\d{2,3})\\b", "{{ if .Config.enhancedAnime }}E$1{{ else }}$1{{ end }}"] + # fix date search and workaround for internal YGG issues + - name: re_replace + args: ["[\\\\\\-\\.\\/!\\s]+", " "] + # strip season as site does not support partial matches + - name: re_replace + args: ["(?i)\\b(S\\d{1,3})\\b", "{{ if .Config.strip_season }}{{ else }}$1{{ end }}"] + - name: trim + # put each word in quotations to prevent exact phrase search + - name: re_replace + args: ["([^\\s]+)", "\"$1\""] + + rows: + selector: table.table > tbody > tr + + fields: + _id: + selector: td:nth-child(2) > a + attribute: href + filters: + - name: regexp + args: "/(\\d+)-" + title_normal: + selector: td:nth-child(2) > a + filters: + # Saison 1 Episode 2 > S01E02 + - name: re_replace + args: ["(?i)\\b(Saisons?[\\s\\.]*)(\\d{4}(?:[\\s\\.\\-aà]+\\d{4})?)([\\s\\.]*[EÉ]pisodes?[\\s\\.]*)(\\d{1,3}(?:[\\s\\.\\-aà]+\\d{1,3})?)\\b", "{{ if .Config.enhancedAnime4 }}S$2E$4{{ else }}$1$2$3$4{{ end }}"] + - name: re_replace + args: ["(?i)\\bSaisons?[\\s\\.]*(\\d{1,3}(?:[\\s\\.\\-aà]+\\d{1,3})?)[\\s\\.]*[EÉ]pisodes?[\\s\\.]*(\\d{1,3}(?:[\\s\\.\\-aà]+\\d{1,3})?)\\b", "S$1E$2"] + # Saison 1 > S01 + - name: re_replace + args: ["(?i)\\b(Saisons?[\\s\\.]*)(\\d{4}(?:[\\s\\.\\-aà]+\\d{4})?)\\b", "{{ if .Config.enhancedAnime4 }}S$2{{ else }}$1$2{{ end }}"] + - name: re_replace + args: ["(?i)\\bSaisons?[\\s\\.]*(\\d{1,3}(?:[\\s\\.\\-aà]+\\d{1,3})?)\\b", "S$1"] + # Episode 1 > E01 + - name: re_replace + args: ["(?i)\\b([EÉ]pisodes?[\\s\\.]*)(\\d{4}(?:[\\s\\.\\-aà]+\\d{4})?)\\b", "{{ if .Config.enhancedAnime4 }}S$2{{ else }}$1$2{{ end }}"] + - name: re_replace + args: ["(?i)\\b[EÉ]pisodes?[\\s\\.]*(\\d{1,3}(?:[\\s\\.\\-aà]+\\d{1,3})?)\\b", "S$1"] + # S1 à 2 > S1-2 + - name: re_replace + args: ["(?i)\\b(S?\\d*[SE])(\\d{4})([\\s\\.\\-aà]+)(\\d{4})\\b", "{{ if .Config.enhancedAnime4 }}$1$2-$4{{ else }}$1$2$3$4{{ end }}"] + - name: re_replace + args: ["(?i)\\b(S?\\d*[SE])(\\d{1,3})[\\s\\.\\-aà]+(\\d{1,3})\\b", "$1$2-$3"] + # Replace French date dd-mm-yyyy to yyyy.mm.dd + - name: re_replace + args: ["\\b(\\d{2})[\\-_\\.](\\d{2})[\\-_\\.](\\d{4})\\b", "$3.$2.$1"] + title_filtered: + text: "{{ .Result.title_normal }}" + filters: + - name: re_replace + args: ["(?i)^(?:(.+?)((?:[\\.\\-\\s_\\[]+(?:imax|(?:dvd|bd|tv)(?:rip|scr)|bluray(?:\\-?rip)?|720\\s*p?|1080\\s*p?|vof?|vost(?:fr)?|multi|vf(?:f|q)?[1-3]?|(?:true)?french|eng?)[\\.\\-\\s_\\]]*)*)([\\(\\[]?(?:20|1[7-9])\\d{2}[\\)\\]]?)(.*)$|(.*))$", "$1 $3 $2 $4 $5"] + - name: trim + - name: re_replace + args: ["(?i)(.\\b(mkv|avi|divx|xvid|mp4)\\b)$", ""] + - name: re_replace + args: ["(\\s+)", " "] + - name: trim + title_phase1: + text: "{{ if .Config.filter_title }}{{ .Result.title_filtered }}{{ else }}{{ .Result.title_normal }}{{ end }}" + title_vostfr: + text: "{{ .Result.title_phase1 }}" + filters: + - name: re_replace + args: ["(?i)\\b(vostfr|subfrench)\\b", "ENGLISH"] + title_phase2: + text: "{{ if .Config.vostfr }}{{ .Result.title_vostfr }}{{ else }}{{ .Result.title_phase1 }}{{ end }}" + title_multilang: + text: "{{ .Result.title_phase2 }}" + filters: + - name: re_replace + args: ["(?i)\\b(MULTI(?!.*(?:FRENCH|ENGLISH|VOSTFR)))\\b", "{{ .Config.multilanguage }}"] + title: + text: "{{ if .Config.multilang }}{{ .Result.title_multilang }}{{ else }}{{ .Result.title_phase2 }}{{ end }}" + filters: + - name: re_replace + args: ["\\b(\\d{4})\\b", "{{ if .Config.enhancedAnime4 }}E$1{{ else }}$1{{ end }}"] + - name: re_replace + args: ["\\b(\\d{2,3})\\b", "{{ if .Config.enhancedAnime }}E$1{{ else }}$1{{ end }}"] + details: + selector: td:nth-child(2) > a + attribute: href + category: + selector: td:nth-child(1) > div.hidden + download: + text: "/engine/download_torrent?id={{ .Result._id }}" + date: + # unix + selector: td:nth-child(5) > div.hidden + size: + selector: td:nth-child(6) + filters: + - name: replace + args: ["o", "B"] + grabs: + selector: td:nth-child(7) + seeders: + selector: td:nth-child(8) + leechers: + selector: td:nth-child(9) + downloadvolumefactor: + text: 1 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/yourbittorrent.yml b/config/prowlarr/Definitions/yourbittorrent.yml new file mode 100644 index 0000000..b0c0b85 --- /dev/null +++ b/config/prowlarr/Definitions/yourbittorrent.yml @@ -0,0 +1,119 @@ +--- +id: yourbittorrent +name: YourBittorrent +description: "YourBittorrent is a Public torrent index" +language: en-US +type: public +encoding: UTF-8 +links: + - https://yourbittorrent.com/ + - https://yourbittorrent2.com/ + - https://yourbittorrent.nocensor.cloud/ + - https://yourbittorrent.mrunblock.bond/ +legacylinks: + - https://yourbittorrent.host/ + - https://yourbittorrent.nocensor.space/ + - https://yourbittorrent.nocensor.work/ + - https://yourbittorrent.nocensor.biz/ + - https://yourbittorrent.nocensor.sbs/ + - https://yourbittorrent.nocensor.world/ + - https://yourbittorrent.nocensor.lol/ + - https://yourbittorrent.mrunblock.guru/ + - https://yourbittorrent.mrunblock.life/ # This web property is not accessible via this address + - https://yourbittorrent.nocensor.click/ + +caps: + categorymappings: + - {id: anime, cat: TV/Anime, desc: Anime} + - {id: software, cat: PC, desc: Software} + - {id: ebooks, cat: Books, desc: Ebooks} + - {id: adult, cat: XXX, desc: Adult} + - {id: games, cat: PC/Games, desc: Games} + - {id: movies, cat: Movies, desc: Movies} + - {id: music, cat: Audio, desc: Music} + - {id: television, cat: TV, desc: TV} + - {id: other, cat: Other, desc: Other} + - {id: photos, cat: Other, desc: Photos} + - {id: pictures, cat: Other, desc: Pictures} + - {id: unknown, cat: Other, desc: Unknown} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: [] + +search: + paths: + - path: / + inputs: + v: "" + c: "" + q: "{{ if .Keywords }}{{ .Keywords }}{{ else }}{{ .Today.Year }}{{ end }}" + keywordsfilters: + - name: re_replace + args: ["[\\s]+", "-"] + - name: tolower + + rows: + selector: tr.table-default:has(a[href^="/torrent/"]) + filters: + - name: andmatch + + fields: + category: + selector: td:nth-child(1) + attribute: onclick + filters: + - name: regexp + args: "href='/(.+?).html" + title: + selector: td:nth-child(2) a + details: + selector: td:nth-child(2) a + attribute: href + download: + selector: td:nth-child(2) a + attribute: href + # turn /torrent/25778710/have-i-got-news-for-you-s59e02-720p-britishb00bseztv.html + # into /down/25778710.torrent + filters: + - name: split + args: ["/", 2] + - name: prepend + args: "/down/" + - name: append + args: ".torrent" + size: + selector: td:nth-child(3) + date_day: + selector: td:nth-child(4):not(:contains("/")) + optional: true + filters: + - name: replace + args: ["Today", "now"] + - name: replace + args: ["Yesterday", "1 day"] + - name: timeago + date_year: + selector: td:nth-child(4):contains("/") + optional: true + filters: + - name: append + args: " -07:00" # PDT + - name: dateparse + args: "dd/MM/yy zzz" + date: + text: "{{ if or .Result.date_year .Result.date_day }}{{ or .Result.date_year .Result.date_day }}{{ else }}now{{ end }}" + seeders: + selector: td:nth-child(5) + leechers: + selector: td:nth-child(6) + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/yts.yml b/config/prowlarr/Definitions/yts.yml new file mode 100644 index 0000000..aff2bfe --- /dev/null +++ b/config/prowlarr/Definitions/yts.yml @@ -0,0 +1,152 @@ +--- +id: yts +name: YTS +description: "YTS is a Public torrent site specialising in HD movies of small size" +type: public +language: en-US +encoding: UTF-8 +requestDelay: 2.5 # 2.5 requests per second (2 causes problems) +links: + # dont forget to update the details, download and poster replace args + - https://yts.mx/ + - https://yts.unblockit.date/ + - https://yts.ninjaproxy1.com/ + - https://yts.mrunblock.bond/ + - https://yts.nocensor.cloud/ +legacylinks: + - https://yts.ag/ + - https://yts.am/ + - https://yts.lt/ + - https://yts.nocensor.biz/ + - https://yts.nocensor.sbs/ + - https://yts.unblockit.nz/ + - https://yts.nocensor.world/ + - https://yts.unblockit.page/ + - https://yts.unblockit.pet/ + - https://yts.nocensor.lol/ + - https://yts.unblockit.ink/ + - https://yts.nocensor.art/ + - https://yts.unblockit.bio/ + - https://yts.unblockit.boo/ + - https://yts.mrunblock.guru/ + - https://yts.unblockit.click/ + - https://yts.unblockit.asia/ + - https://yts.unblockit.mov/ + - https://yts.mrunblock.life/ + - https://yts.unblockit.rsvp/ + - https://yts.nocensor.click/ + - https://yts.unblockninja.com/ + - https://yts.unblockit.vegas/ + - https://yts.unblockit.esq/ + - https://yts.unblockit.zip/ + - https://yts.unblockit.foo/ + - https://yts.unblockit.ing/ + +caps: + categorymappings: + # note: the API does not support searching with categories, so these are dummy ones for torznab compatibility + # we map these newznab cats with the returned quality value in the releases routine. + - {id: 45, cat: Movies/HD, desc: "Movies/x264/720p"} + - {id: 44, cat: Movies/HD, desc: "Movies/x264/1080p"} + - {id: 46, cat: Movies/UHD, desc: "Movies/x264/2160p"} + - {id: 47, cat: Movies/3D, desc: "Movies/x264/3D"} + + modes: + search: [q] + movie-search: [q, imdbid] + +settings: [] + +search: + paths: + - path: api/v2/list_movies.json + response: + type: json + + inputs: + query_term: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # without this the API sometimes returns nothing + limit: 50 + sort_by: date_added + order_by: desc + keywordsfilters: + # ignore ' (e.g. search for america's Next Top Model) + - name: re_replace + args: ["[^\\w]+", " "] + + rows: + selector: data.movies + attribute: torrents + multiple: true + # bug at YTS can return movie_count > 0 and no movie torrents #12598 + missingAttributeEqualsNoResults: true + count: + selector: data.movie_count + + fields: + _quality: + selector: quality + category: + selector: quality + case: + "720p": 45 + "1080p": 44 + "2160p": 46 + "3D": 47 + "*": 45 + _audio: + selector: audio_channels + _depth: + selector: bit_depth + _type: + selector: type + _codec: + selector: video_codec + year: + selector: ..year + title_default: + selector: ..title + filters: + - name: append + args: " ({{ .Result.year }})" + title: + selector: ..title_long + optional: true + default: "{{ .Result.title_default }}" + filters: + - name: replace + args: [":", ""] + - name: append + args: " {{ .Result._quality }} {{ if eq .Result._type \"web\" }}WEBRip{{ else }}BRRip{{ end }} {{ if eq .Result._audio \"5.1\" }}5.1 {{ else }}{{ end }}{{ if eq .Result._depth \"10\" }}10Bit {{ else }}{{ end }}{{ .Result._codec }} -YTS" + details: + selector: ..url + filters: + - name: re_replace + args: ["^https?:\\/\\/yts\\.mx\\/", "{{ .Config.sitelink }}"] # fix for 12494 + download: + selector: url + filters: + - name: re_replace + args: ["^https?:\\/\\/yts\\.mx\\/", "{{ .Config.sitelink }}"] # fix for 12494 + infohash: + selector: hash + poster: + selector: ..large_cover_image + filters: + - name: re_replace + args: ["^https?:\\/\\/yts\\.mx\\/", "{{ .Config.sitelink }}"] # fix for 12494 + imdbid: + selector: ..imdb_code + date: + selector: date_uploaded_unix + size: + selector: size_bytes + seeders: + selector: seeds + leechers: + selector: peers + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# json api v2 diff --git a/config/prowlarr/Definitions/zamundanet.yml b/config/prowlarr/Definitions/zamundanet.yml new file mode 100644 index 0000000..b8e0ea3 --- /dev/null +++ b/config/prowlarr/Definitions/zamundanet.yml @@ -0,0 +1,198 @@ +--- +id: zamundanet +name: Zamunda.net +description: "Zamunda is a BULGARIAN Private Torrent Tracker for 0DAY / GENERAL" +language: bg-BG +type: private +encoding: windows-1251 +links: + - https://zamunda.net/ # Bulgarian IP address filtering + - https://zamunda.ch/ # Bulgarian IP address filtering +legacylinks: + - http://zamunda.net/ + - http://zamunda.ch/ + +caps: + categorymappings: + # Movies + - {id: 5, cat: Movies/HD, desc: "Movies/HD"} + - {id: 19, cat: Movies/SD, desc: "Movies/SD"} + - {id: 20, cat: Movies/DVD, desc: "Movies/DVD-R"} + - {id: 24, cat: Movies, desc: "Movies/BG"} + - {id: 25, cat: TV/Anime, desc: "Animation/Anime"} + - {id: 28, cat: Movies, desc: "Movies/Russia"} + - {id: 31, cat: Movies, desc: "Movies/Science"} + - {id: 35, cat: Movies/HD, desc: "Video/HD"} + - {id: 42, cat: Movies/BluRay, desc: "Blu-ray"} + - {id: 46, cat: Movies/3D, desc: "Movies/3D"} + # Serial + - {id: 7, cat: TV/SD, desc: "Series"} + - {id: 33, cat: TV/HD, desc: "Series/HD"} + - {id: 55, cat: TV, desc: "Series/Russia"} + # Music + - {id: 6, cat: Audio, desc: "Music"} + - {id: 29, cat: Audio/Video, desc: "Music/DVD-R"} + - {id: 30, cat: Audio/Other, desc: "Music/DTS"} + - {id: 34, cat: Audio/Other, desc: "Music/Lossless"} + - {id: 51, cat: Audio/Lossless, desc: "Music/Hi-Res/Vinyl"} + # Games + - {id: 4, cat: PC/Games, desc: "Games/PC ISO"} + - {id: 12, cat: Console, desc: "Games/Console"} + - {id: 17, cat: Console/PS4, desc: "Games/PS"} + - {id: 21, cat: PC/Games, desc: "Games/PC Rip"} + - {id: 39, cat: PC/Games, desc: "Games/Mac"} + - {id: 40, cat: Console/XBox, desc: "Games/Xbox"} + - {id: 54, cat: PC/Games, desc: "Games/Linux"} + # Software + - {id: 1, cat: PC/ISO, desc: "Programs/PC ISO"} + - {id: 22, cat: PC/0day, desc: "Programs/other"} + - {id: 38, cat: PC/Mac, desc: "Programs/Mac"} + # Sport + - {id: 41, cat: TV/Sport, desc: "Sport/TV"} + - {id: 43, cat: TV/Sport, desc: "Sport/HD"} + # Other + - {id: 23, cat: Other, desc: "Clips"} + - {id: 26, cat: Other, desc: "Other"} + - {id: 32, cat: Books/Comics, desc: "Books/Comic"} + - {id: 36, cat: PC/Mobile-Other, desc: "Mobile/GSM"} + - {id: 37, cat: PC/0day, desc: "Dox"} + - {id: 52, cat: PC/Mobile-Android, desc: "Android/Games"} + - {id: 53, cat: PC/Mobile-Android, desc: "Android/Apps"} + # XXX + - {id: 9, cat: XXX, desc: "XXX"} + - {id: 27, cat: XXX, desc: "Hentai"} + - {id: 48, cat: XXX, desc: "XXX/3D"} + - {id: 49, cat: XXX, desc: "XXX/HD"} + + modes: + search: [q] + tv-search: [q, season, ep] + movie-search: [q] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Filter freeleech only + default: false + - name: info_results + type: info + label: "Search results" + default: "This Indexer supports search results only from the LIST view.
  • Access the web site, bring up the torrent search page and click on the LIST icon setting (located to the top right of the search results table).

  • The alternate GRID view is not supported." + - name: sort + type: select + label: Sort requested from site + default: 6 + options: + 6: created + 9: seeders + 7: size + 2: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: ip_filtering + type: info + label: "IP Filtering" + default: "Zamunda.net allows only Bulgarian IP addressess. A FlareSolverr error means your IP was not accepted." + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: td.embedded:has(h2:contains("failed")) + test: + path: index.php + selector: a[href="/logout.php"] + +search: + paths: + - path: bananas + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ .Keywords }}" + # blank = incldead + incldead: "" + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + + headers: + cookie: ["xporn=1"] # enable xxx downloads + + rows: + selector: ".responsetop > tbody > tr:has(a[href^=\"banan?id=\"]){{ if .Config.freeleech }}:has(a[style=\"color: #b9a100;\"]){{ else }}{{ end }}" + + fields: + category: + selector: a[href^="list?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="/download.php"] + attribute: onmouseover + filters: + - name: regexp + args: " (.+?)'" + - name: re_replace + args: [" rq$", ""] + details: + selector: a[href^="banan?id="] + attribute: href + download: + selector: a[href^="/download.php"] + attribute: href + grabs: + selector: td:nth-child(7) + size: + selector: td:nth-child(6) + date: + # 2020-10-2411:18:30 + selector: td:nth-child(5) + filters: + - name: append + args: " +02:00" # EET + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + seeders: + selector: td:nth-child(8) + leechers: + selector: td:nth-child(9) + poster: + selector: td:nth-child(2) > a:nth-child(1) + attribute: onmouseover + filters: + - name: regexp + args: src=\\'([^\s\\]+) + genre: + selector: td:nth-child(2) > a:nth-child(1) + attribute: onmouseover + filters: + - name: replace + args: ["
    ", " "] + - name: regexp + args: "Жанр: (.+?) tbody > tr:has(a[href^=\"browse.php\"]){{ if .Config.freeleech }}:has(a[style=\"color: #b9a100;\"]){{ else }}{{ end }}" + + fields: + title: + selector: a:has(img[src$="/pic/download.gif"]) + attribute: href + filters: + - name: urldecode + - name: re_replace + args: ["^(.*?)download\\.php\\/[0-9]{1,10}\\/|\\.torrent(?=[^.]*$)", ""] + details: + selector: td:nth-child(2) > a:nth-child(1) + attribute: href + category: + selector: td:nth-child(1) > a + attribute: href + filters: + - name: querystring + args: cat + download: + selector: a:has(img[src$="/pic/download.gif"]) + attribute: href + magnet: + optional: true + selector: a:has(img[src$="/pic/magnet-icon-12w-12h.gif"]) + attribute: href + grabs: + selector: td:nth-child(7) + size: + selector: td:nth-child(6) + date: + # 2020-10-2411:18:30 + selector: td:nth-child(5) + filters: + - name: append + args: " +02:00" # EET + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + seeders: + selector: td:nth-child(8) + leechers: + selector: td:nth-child(9) + poster: + selector: td:nth-child(2) > a:nth-child(1) + attribute: onmouseover + filters: + - name: regexp + args: src=([^\s]+) + genre: + selector: td:nth-child(2) > a:nth-child(1) + attribute: onmouseover + filters: + - name: replace + args: ["

    ", " "] + - name: regexp + args: "Genre:(.+?)To add to your Apps' Torznab indexer, replace all categories with 8000(Other). + - name: multilang + type: checkbox + label: Replace MULTi by another language in release name + default: false + - name: multilanguage + type: select + label: Replace MULTi by this language + default: FRENCH + options: + FRENCH: FRENCH + MULTi FRENCH: MULTi FRENCH + ENGLISH: ENGLISH + MULTi ENGLISH: MULTi ENGLISH + VOSTFR: VOSTFR + MULTi VOSTFR: MULTi VOSTFR + - name: vostfr + type: checkbox + label: Replace VOSTFR and SUBFRENCH with ENGLISH + default: false + +download: + infohash: + hash: + selector: a[href^="/get_torrent/"] + attribute: href + filters: + - name: regexp + args: ([A-F|a-f|0-9]{40}) + title: + selector: ul#breadcrumbs > li:nth-child(3) > h2 + filters: + - name: trim + - name: validfilename +search: + paths: + - path: "{{ if .Keywords }}recherche/{{ .Keywords }}{{ else }}{{ end }}" + keywordsfilters: + # if searching for season packs swith S01 to saison 1 #9712 + - name: re_replace + args: ["(?i)(S0)(\\d{1,2})$", "saison $2"] + - name: re_replace + args: ["(?i)(S)(\\d{1,3})$", "saison $2"] + + rows: + selector: table.table > tbody > tr:has(a[href^="/torrent/"]) + + fields: + category: + text: Other + title_phase1: + selector: a[href^="/torrent/"] + attribute: title + filters: + - name: replace + args: [" en Torrent", ""] + - name: replace + args: ["WEBRIP", "WEBDL"] + - name: re_replace + args: ["(?i)\\b(FRENCH|MULTI|TRUEFRENCH|VOSTFR|SUBFRENCH)\\b(.+?)(\\b(19|20\\d{2})\\b)$", "$3 $1$2"] + title_vostfr: + text: "{{ .Result.title_phase1 }}" + filters: + - name: re_replace + args: ["(?i)\\b(vostfr|subfrench)\\b", "ENGLISH"] + title_phase2: + text: "{{ if .Config.vostfr }}{{ .Result.title_vostfr }}{{ else }}{{ .Result.title_phase1 }}{{ end }}" + title_multilang: + text: "{{ .Result.title_phase2 }}" + filters: + - name: re_replace + args: ["(?i)\\b(MULTI(?!.*(?:FRENCH|ENGLISH|VOSTFR)))\\b", "{{ .Config.multilanguage }}"] + title: + text: "{{ if .Config.multilang }}{{ .Result.title_multilang }}{{ else }}{{ .Result.title_phase2 }}{{ end }}" + details: + selector: a[href^="/torrent/"] + attribute: href + download: + selector: a[href^="/torrent/"] + attribute: href + date: + text: now + size: + selector: td:nth-child(2) + seeders: + selector: td:nth-child(3) + leechers: + selector: td:nth-child(4) + downloadvolumefactor: + text: 0 + uploadvolumefactor: + text: 1 +# engine n/a diff --git a/config/prowlarr/Definitions/zmpt.yml b/config/prowlarr/Definitions/zmpt.yml new file mode 100644 index 0000000..f10632f --- /dev/null +++ b/config/prowlarr/Definitions/zmpt.yml @@ -0,0 +1,188 @@ +--- +id: zmpt +name: ZmPT (织梦) +description: "ZmPT (织梦) is a CHINESE Private Torrent Tracker for MOVIES / TV / GENERAL" +language: zh-CN +type: private +encoding: UTF-8 +links: + - https://zmpt.cc/ + +caps: + categorymappings: + - {id: 421, cat: TV/Anime, desc: "Anime Other/动漫-其他"} + - {id: 420, cat: TV/Anime, desc: "Anime Europe and America/动漫-欧美"} + - {id: 419, cat: TV/Anime, desc: "Anime Korean/动漫-韩漫"} + - {id: 418, cat: TV/Anime, desc: "Anime Japan/动漫-日漫"} + - {id: 417, cat: TV/Anime, desc: "Anime China/动漫-国漫"} + - {id: 409, cat: Other, desc: "Misc/综合-其他"} + - {id: 403, cat: TV, desc: "TV Shows/综合-综艺"} + - {id: 402, cat: TV, desc: "TV Series/综合-电视剧"} + - {id: 422, cat: TV/Documentary, desc: "Documentaries/综合-纪录片"} + - {id: 401, cat: Movies, desc: "Movies/综合-电影"} + - {id: 423, cat: Audio, desc: "Music/声音类-音乐"} + - {id: 424, cat: Audio/Audiobook, desc: "Music Audiobooks/声音类-有声书"} + - {id: 425, cat: PC, desc: "Software/软件游戏-软件"} + - {id: 426, cat: Console, desc: "Games/软件游戏-游戏"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid, doubanid] + movie-search: [q, imdbid, doubanid] + music-search: [q] + +settings: + - name: cookie + type: text + label: Cookie + - name: info + type: info + label: How to get the Cookie + default: "

    1. Login to this tracker with your browser
    2. Open the DevTools panel by pressing F12
    3. Select the Network tab
    4. Click on the Doc button (Chrome Browser) or HTML button (FireFox)
    5. Refresh the page by pressing F5
    6. Click on the first row entry
    7. Select the Headers tab on the Right panel
    8. Find 'cookie:' in the Request Headers section
    9. Select and Copy the whole cookie string (everything after 'cookie: ') and Paste here.
    " + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + method: cookie + inputs: + cookie: "{{ .Config.cookie }}" + test: + path: index.php + selector: a[href="logout.php"] + +search: + paths: + - path: torrents.php + inputs: + $raw: "{{ range .Categories }}cat{{.}}=1&{{end}}" + search: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ end }}{{ if or .Query.IMDBID .Query.DoubanID }} {{ else }}{{ .Keywords }}{{ end }}{{ if .Query.DoubanID }}{{ .Query.DoubanID }}{{ else }}{{ end }}" + # 0 incldead, 1 active, 2 dead + incldead: 0 + # 0 all, 1 normal, 2 free, 3 2x, 4 2xfree, 5 50%, 6 2x50%, 7 30% + spstate: "{{ if .Config.freeleech }}2{{ else }}0{{ end }}" + # 0 title, 1 descr, 3 uploader, 4 imdburl (not working) + search_area: "{{ if or .Query.IMDBID .Query.DoubanID }}1{{ else }}0{{ end }}" + # 0 AND, 1 OR, 2 exact + search_mode: 0 + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + notnewword: 1 + + rows: + selector: table.torrents > tbody > tr:has(a[href^="details.php?id="]) + + fields: + category: + selector: a[href^="?cat="] + attribute: href + filters: + - name: querystring + args: cat + title_default: + selector: a[href^="details.php?id="] + title: + selector: a[title][href^="details.php?id="] + attribute: title + optional: true + default: "{{ .Result.title_default }}" + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="download.php?id="] + attribute: href + imdbid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="imdb.com/title/tt"] + attribute: href + doubanid: + # site currently only has a badge and rating, the id is not present. just in case a future update. + selector: a[href*="movie.douban.com/subject/"] + attribute: href + date_elapsed: + # time type: time elapsed (default) + selector: td.rowfollow:nth-child(4) > span[title] + attribute: title + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-dd HH:mm:ss zzz" + date_added: + # time added + selector: td.rowfollow:nth-child(4):not(:has(span)) + optional: true + filters: + - name: append + args: " +08:00" # CST + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss zzz" + date: + text: "{{ if or .Result.date_elapsed .Result.date_added }}{{ or .Result.date_elapsed .Result.date_added }}{{ else }}now{{ end }}" + size: + selector: td.rowfollow:nth-child(5) + seeders: + selector: td.rowfollow:nth-child(6) + leechers: + selector: td.rowfollow:nth-child(7) + grabs: + selector: td.rowfollow:nth-child(8) + downloadvolumefactor: + case: + img.pro_free: 0 + img.pro_free2up: 0 + img.pro_50pctdown: 0.5 + img.pro_50pctdown2up: 0.5 + img.pro_30pctdown: 0.3 + "*": 1 + uploadvolumefactor: + case: + img.pro_50pctdown2up: 2 + img.pro_free2up: 2 + img.pro_2up: 2 + "*": 1 + minimumratio: + case: + img[title="H&R"]: 1.0 + "*": 0.4 + minimumseedtime: + # H&R 3 days (as seconds = 3 x 24 x 60 x 60) + # normal 1 day (as seconds = 24 x 60 x 60) + case: + img[title="H&R"]: 259200 + "*": 86400 + description_verified: + case: + span[title="通过"], span[title="通過"], span[title="Allowed"]: "Verified:" + span[title="未审"], span[title="未審"], span[title="Not reviewed"]: "Unverified:" + span[title="拒绝"], span[title="拒絕"], span[title="Denied"]: "Banned:" + description: + selector: td.rowfollow:nth-child(2) + remove: a, b, font, img, span + filters: + - name: prepend + args: "{{ .Result.description_verified }} " +# NexusPHP v1.8.8 2023-09-25 diff --git a/config/prowlarr/Definitions/zomb.yml b/config/prowlarr/Definitions/zomb.yml new file mode 100644 index 0000000..4046671 --- /dev/null +++ b/config/prowlarr/Definitions/zomb.yml @@ -0,0 +1,128 @@ +--- +id: zomb +name: ZOMB +description: "ZOMB is a Semi-Private Torrent Tracker for BOOTLEG MUSIC" +language: en-US +type: semi-private +encoding: UTF-8 +links: + - http://zombtracker.the-zomb.com/ # site does not support https ERR_CONNECTION_REFUSED + +caps: + categorymappings: + - {id: 19, cat: Audio/Lossless, desc: "APE"} + - {id: 5, cat: Audio/Lossless, desc: "FLAC"} + - {id: 1, cat: Audio/Lossless, desc: "SHN"} + - {id: 12, cat: Audio/Video, desc: "MPG"} + - {id: 6, cat: Audio/Video, desc: "AVI"} + - {id: 2, cat: Audio/Video, desc: "DVD"} + - {id: 4, cat: Audio/Other, desc: "MISC"} + + modes: + search: [q] + music-search: [q, album, artist] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: added + options: + added: created + seeders: seeders + size: size + name: title + - name: type + type: select + label: Order requested from site + default: DESC + options: + DESC: desc + ASC: asc + - name: info_tpp + type: info + label: Results Per Page + default: For best results, change the Torrents per page: setting to 100 on your account profile. + +login: + path: takelogin.php + method: post + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + error: + - selector: table.main:contains("Login failed!") + test: + path: my.php + selector: a[href="logout.php"] + +search: + paths: + # http://zombtracker.the-zomb.com/browse-a.php?search=pearl+jam&incldead=1&c2=1 + - path: browse-a.php + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + search: "{{ if or (.Query.Artist) (.Query.Album) }}{{ or (.Query.Artist) (.Query.Album) }}{{ else }}{{ .Keywords }}{{ end }}" + # 0 active, 1 all, 2 inactive, 3 freeleech, 4 banned + incldead: "{{ if .Config.freeleech }}3{{ else }}1{{ end }}" + sort: "{{ .Config.sort }}" + d: "{{ .Config.type }}" + # does not support imdbid searches, does not return imdb link in results + + rows: + selector: "table[style=\"border: solid #000000 1px;\"] > tbody > tr:has(a[href^=\"takedownload.php?id=\"])" + filters: + - name: andmatch + + fields: + category: + selector: a[href^="browse-a.php?cat="] + attribute: href + filters: + - name: querystring + args: cat + title: + selector: a[href^="details.php?id="] + details: + selector: a[href^="details.php?id="] + attribute: href + download: + selector: a[href^="takedownload.php?id="] + attribute: href + description: + selector: font.sig + files: + selector: td:nth-child(5) + date: + selector: td:nth-child(7) + # auto adjusted by site account profile + filters: + - name: dateparse + args: "yyyy-MM-ddHH:mm:ss" + size: + selector: td:nth-child(8) + grabs: + selector: td:nth-child(9) + seeders: + selector: td:nth-child(10) + leechers: + selector: td:nth-child(11) + downloadvolumefactor: + case: + img[src="pic/download3.gif"]: 0 + "*": 1 + uploadvolumefactor: + text: 1 + minimumratio: + text: 1.0 +# Engine n/a diff --git a/config/prowlarr/Definitions/ztracker.yml b/config/prowlarr/Definitions/ztracker.yml new file mode 100644 index 0000000..40fe171 --- /dev/null +++ b/config/prowlarr/Definitions/ztracker.yml @@ -0,0 +1,194 @@ +--- +id: ztracker +name: Ztracker +description: "Ztracker is a HUNGARIAN Semi-Private Torrent Tracker for 0DAY / GENERAL" +language: hu-HU +type: semi-private +encoding: ISO-8859-2 +links: + - http://ztracker.cc/ # site does not support https invalid certificate +legacylinks: + - http://ztracker.org/ + +caps: + categorymappings: + - {id: 29, cat: Movies/SD, desc: "CAM/EN"} + - {id: 30, cat: Movies/SD, desc: "CAM/HUN"} + - {id: 49, cat: Books, desc: "EBOOK/EN"} + - {id: 3, cat: Books, desc: "EBOOK/HU"} + - {id: 37, cat: Movies/UHD, desc: "FILM/4K/EN"} + - {id: 32, cat: Movies/UHD, desc: "FILM/4K/HU"} + - {id: 36, cat: Movies/DVD, desc: "FILM/DVD/EN"} + - {id: 34, cat: Movies/DVD, desc: "FILM/DVD/HU"} + - {id: 35, cat: Movies/HD, desc: "FILM/HD/EN"} + - {id: 31, cat: Movies/HD, desc: "FILM/HD/HU"} + - {id: 8, cat: Movies/SD, desc: "FILM/SD/EN"} + - {id: 28, cat: Movies/SD, desc: "|-- Mese/Külf."} + - {id: 26, cat: TV/SD, desc: "|-- SOROZAT/SD/EN"} + - {id: 7, cat: Movies/SD, desc: "FILM/SD/HU"} + - {id: 27, cat: Movies/SD, desc: "|-- Mese/Hun"} + - {id: 25, cat: TV/SD, desc: "|-- SOROZAT/SD/HU"} + - {id: 45, cat: Console, desc: "JÁTÉK/KONZOL"} + - {id: 4, cat: PC/Games, desc: "JÁTÉK/PC/ISO"} + - {id: 18, cat: Other, desc: "Képek"} + - {id: 17, cat: XXX, desc: "|-- XXX/IMAGESET"} + - {id: 24, cat: PC/Mobile-Other, desc: "PROG/MOBIL"} + - {id: 1, cat: PC/0day, desc: "PROG/PC/ISO"} + - {id: 47, cat: TV/UHD, desc: "SOROZAT/4K/EN"} + - {id: 48, cat: TV/UHD, desc: "SOROZAT/4K/HU"} + - {id: 51, cat: TV/SD, desc: "SOROZAT/DVD/EN"} + - {id: 50, cat: TV/SD, desc: "SOROZAT/DVD/HU"} + - {id: 46, cat: TV/HD, desc: "SOROZAT/HD/EN"} + - {id: 44, cat: TV/HD, desc: "SOROZAT/HD/HU"} + - {id: 41, cat: XXX, desc: "XXX/4K"} + - {id: 40, cat: XXX, desc: "XXX/DVD"} + - {id: 16, cat: XXX, desc: "XXX/HD"} + - {id: 15, cat: XXX, desc: "XXX/SD"} + - {id: 12, cat: Audio/MP3, desc: "ZENE/MP3/EN"} + - {id: 11, cat: Audio/MP3, desc: "ZENE/MP3/HU"} + + modes: + search: [q] + tv-search: [q, season, ep, imdbid] + movie-search: [q, imdbid] + music-search: [q] + book-search: [q] + +settings: + - name: username + type: text + label: Username + - name: password + type: password + label: Password + - name: freeleech + type: checkbox + label: Search freeleech only + default: false + - name: sort + type: select + label: Sort requested from site + default: 4 + options: + 4: created + 7: seeders + 5: size + 1: title + - name: type + type: select + label: Order requested from site + default: desc + options: + desc: desc + asc: asc + +login: + path: login.php + method: form + form: form[action="takelogin.php"] + inputs: + username: "{{ .Config.username }}" + password: "{{ .Config.password }}" + logintype: yes + error: + - selector: div.error + - selector: table:has(img[src="/pic/ts_error/error.jpg"]) + message: + selector: table:has(img[src="/pic/ts_error/error.jpg"]) + remove: style + test: + path: index.php + selector: a[href*="/logout.php?logouthash="] + +search: + paths: + # http://ztracker.cc/browse_old.php?keywords=&search_type=t_both&cat=0&ts_type=1 + - path: browse_old.php + keywordsfilters: + - name: re_replace + args: ["[^a-zA-Z0-9]+", "%"] + inputs: + $raw: "{{ range .Categories }}c{{.}}=1&{{end}}" + keywords: "{{ if .Query.IMDBID }}{{ .Query.IMDBID }}{{ else }}{{ .Keywords }}{{ end }}" + # t_name, t_description, t_both, t_uploader + search_type: "{{ if .Query.IMDBID }}t_description{{ else }}t_name{{ end }}" + # 0 active, 1 both, 2 inactive, 3 free, 19 bluray, 4 silver, 10 doubleup, 5 today, 6 yesterday, 7 week, 8 month, 9 last ten, external + ts_type: "{{ if .Config.freeleech }}3{{ else }}1{{ end }}" + sort: "{{ .Config.sort }}" + type: "{{ .Config.type }}" + # does not return imdb link in results + + rows: + selector: table[border="1"] > tbody > tr:has(a[href*="details.php?id="]) + + fields: + category: + selector: a[href^="/browse_old.php?cat="] + attribute: href + optional: true + default: 18 + filters: + - name: querystring + args: cat + title: + selector: a[href*="details.php?id="][onmouseover] + attribute: onmouseover + filters: + - name: regexp + args: (.*?) + details: + selector: a[href*="details.php?id="][onmouseover] + attribute: href + download: + selector: a[href*="details.php?id="] + attribute: href + filters: + - name: replace + args: ["details.php", "download.php"] + poster: + selector: a[href*="details.php?id="][onmouseover] + attribute: onmouseover + filters: + - name: regexp + args: img src=\\'(.*?)\\' + imdbid: + selector: a[href*="imdb.com/title/tt"] + attribute: href + files: + selector: td:nth-child(5) + size: + selector: td:nth-child(11):has(b) + optional: true + default: 0 B + remove: b + seeders: + selector: td:nth-child(7) + leechers: + selector: td:nth-child(8) + downloadvolumefactor: + case: + img[src="./pic/freedownload.gif"]: 0 + img[src="./pic/silverdownload.gif"]: 0.5 + "*": 1 + uploadvolumefactor: + case: + img[src="./pic/x2.gif"]: 2 + "*": 1 + minimumratio: + text: 0.8 + minimumseedtime: + # 3 days (as seconds = 3 x 24 x 60 x 60) + text: 259200 + date: + selector: td:nth-child(2) + remove: a, img + filters: + - name: replace + args: ["\xA0", " "] + - name: replace + args: ["Ma", "Today"] + - name: replace + args: ["Tegnap", "Yesterday"] + - name: re_replace + args: ["12:(\\d\\d) PM", "00:$1 PM"] +# TS Special Edition diff --git a/config/jackett/Jackett/DataProtection/key-84885a33-6517-4789-8c6a-9347b158b7fe.xml b/config/prowlarr/asp/key-e2a5612d-fa15-4f8f-aa33-e4488a83eecb.xml similarity index 64% rename from config/jackett/Jackett/DataProtection/key-84885a33-6517-4789-8c6a-9347b158b7fe.xml rename to config/prowlarr/asp/key-e2a5612d-fa15-4f8f-aa33-e4488a83eecb.xml index df4b518..8028686 100644 --- a/config/jackett/Jackett/DataProtection/key-84885a33-6517-4789-8c6a-9347b158b7fe.xml +++ b/config/prowlarr/asp/key-e2a5612d-fa15-4f8f-aa33-e4488a83eecb.xml @@ -1,15 +1,15 @@  - - 2023-04-14T10:23:47.165817Z - 2023-04-15T14:32:23.4431139Z - 2023-07-13T10:23:47.0978613Z + + 2024-01-14T06:39:01.0788396Z + 2024-01-14T06:39:01.0584519Z + 2024-04-13T06:39:01.0584519Z - UO744ecxMMbztWk5jkCP6Y1L4U0g6P0k57A5lxm9IVnGCgMjWoG7z4hi4AMwlX368EzOSzXXSQVEEsJ7gMY63Q== + 12FFlbffghNoNXvL3+/Nv6zJ5YqTRjgh4NERb/M6cMPRMBZ2M43n2EtZdEgNipN4njMZBeDXdDQqqpM4xk8Q7w== diff --git a/config/prowlarr/config.xml b/config/prowlarr/config.xml new file mode 100644 index 0000000..e87e2d2 --- /dev/null +++ b/config/prowlarr/config.xml @@ -0,0 +1,18 @@ + + * + 9696 + 6969 + False + True + 93fe9143ca004179a54651c4116fb089 + Forms + DisabledForLocalAddresses + develop + info + + + + Prowlarr + Docker + False + \ No newline at end of file diff --git a/config/prowlarr/logs.db b/config/prowlarr/logs.db new file mode 100644 index 0000000..3c1fbe8 Binary files /dev/null and b/config/prowlarr/logs.db differ diff --git a/config/prowlarr/logs.db-shm b/config/prowlarr/logs.db-shm new file mode 100644 index 0000000..b31488f Binary files /dev/null and b/config/prowlarr/logs.db-shm differ diff --git a/config/prowlarr/logs.db-wal b/config/prowlarr/logs.db-wal new file mode 100644 index 0000000..e1562d8 Binary files /dev/null and b/config/prowlarr/logs.db-wal differ diff --git a/config/prowlarr/prowlarr.db b/config/prowlarr/prowlarr.db new file mode 100644 index 0000000..4945320 Binary files /dev/null and b/config/prowlarr/prowlarr.db differ diff --git a/config/prowlarr/prowlarr.pid b/config/prowlarr/prowlarr.pid new file mode 100644 index 0000000..4701cc7 --- /dev/null +++ b/config/prowlarr/prowlarr.pid @@ -0,0 +1 @@ +150 \ No newline at end of file diff --git a/config/qbittorrent/qBittorrent/BT_backup/queue b/config/qbittorrent/qBittorrent/BT_backup/queue index e69de29..bc4558c 100644 --- a/config/qbittorrent/qBittorrent/BT_backup/queue +++ b/config/qbittorrent/qBittorrent/BT_backup/queue @@ -0,0 +1,2 @@ +83dd9a21c093c8b5293695574810329cd714f7fa +c6c5e2423ab96bc19e274929a5ec679a16e0207d diff --git a/config/qbittorrent/qBittorrent/GeoDB/dbip-country-lite.mmdb b/config/qbittorrent/qBittorrent/GeoDB/dbip-country-lite.mmdb index 4e27f4d..40b951b 100644 Binary files a/config/qbittorrent/qBittorrent/GeoDB/dbip-country-lite.mmdb and b/config/qbittorrent/qBittorrent/GeoDB/dbip-country-lite.mmdb differ diff --git a/config/qbittorrent/qBittorrent/categories.json b/config/qbittorrent/qBittorrent/categories.json index 60410eb..a620614 100644 --- a/config/qbittorrent/qBittorrent/categories.json +++ b/config/qbittorrent/qBittorrent/categories.json @@ -1,4 +1,10 @@ { + "other": { + "save_path": "" + }, + "prowlarr": { + "save_path": "" + }, "radarr": { "save_path": "" }, diff --git a/config/qbittorrent/qBittorrent/qBittorrent-data.conf b/config/qbittorrent/qBittorrent/qBittorrent-data.conf index 95b66b7..f017b4b 100644 --- a/config/qbittorrent/qBittorrent/qBittorrent-data.conf +++ b/config/qbittorrent/qBittorrent/qBittorrent-data.conf @@ -1,2 +1,2 @@ [Stats] -AllStats=@Variant(\0\0\0\x1c\0\0\0\x2\0\0\0\x12\0\x41\0l\0l\0t\0i\0m\0\x65\0U\0L\0\0\0\x4\0\0\0\0\0\0\x4\x98\0\0\0\x12\0\x41\0l\0l\0t\0i\0m\0\x65\0\x44\0L\0\0\0\x4\0\0\0\0\0\0\0\0) +AllStats=@Variant(\0\0\0\x1c\0\0\0\x2\0\0\0\x12\0\x41\0l\0l\0t\0i\0m\0\x65\0\x44\0L\0\0\0\x4\0\0\0\x1\xa2\x8c\x86\xf2\0\0\0\x12\0\x41\0l\0l\0t\0i\0m\0\x65\0U\0L\0\0\0\x4\0\0\0\0\xe\xa4\x43\x9c) diff --git a/config/qbittorrent/qBittorrent/qBittorrent.conf b/config/qbittorrent/qBittorrent/qBittorrent.conf index 588c2b4..b751753 100644 --- a/config/qbittorrent/qBittorrent/qBittorrent.conf +++ b/config/qbittorrent/qBittorrent/qBittorrent.conf @@ -1,3 +1,12 @@ +[Application] +FileLogger\Age=1 +FileLogger\AgeType=1 +FileLogger\Backup=true +FileLogger\DeleteOld=true +FileLogger\Enabled=true +FileLogger\MaxSizeBytes=66560 +FileLogger\Path=/config/qBittorrent/logs + [AutoRun] OnTorrentAdded\Enabled=false OnTorrentAdded\Program= @@ -15,7 +24,7 @@ Session\ExcludedFileNames= Session\GlobalDLSpeedLimit=0 Session\GlobalMaxRatio=2 Session\GlobalMaxSeedingMinutes=4320 -Session\GlobalUPSpeedLimit=4096 +Session\GlobalUPSpeedLimit=0 Session\IncludeOverheadInLimits=true Session\MaxActiveDownloads=10 Session\MaxActiveTorrents=20 @@ -32,12 +41,15 @@ AutoDeleteAddedTorrentFile=Never Accepted=true [Meta] -MigrationVersion=4 +MigrationVersion=6 [Network] Cookies=@Invalid() PortForwardingEnabled=false -Proxy\OnlyForTorrents=false +Proxy\HostnameLookupEnabled=false +Proxy\Profiles\BitTorrent=true +Proxy\Profiles\Misc=true +Proxy\Profiles\RSS=true [Preferences] Advanced\RecheckOnCompletion=false @@ -64,6 +76,7 @@ MailNotification\smtp_server=smtp.changeme.com MailNotification\username= WebUI\Address=* WebUI\AlternativeUIEnabled=true +WebUI\AuthSubnetWhitelist=@Invalid() WebUI\AuthSubnetWhitelistEnabled=false WebUI\BanDuration=3600 WebUI\CSRFProtection=false @@ -79,7 +92,7 @@ WebUI\MaxAuthenticationFailCount=5 WebUI\Password_PBKDF2="@ByteArray(HFUZWraabpNXbh08IfA2ww==:g6CKdSlbmuapGdVA8UUw3bJvv2FXNbsNftfGBCX3OmMYfyZnxohz73X0hJMdyN9Lpin8GSuoHSmFzLPRo7KtXQ==)" WebUI\Port=60219 WebUI\ReverseProxySupportEnabled=false -WebUI\RootFolder=/config/webui/qb-web-nightly/dist +WebUI\RootFolder=/config/webui/vuetorrent WebUI\SecureCookie=true WebUI\ServerDomains=* WebUI\SessionTimeout=3600 diff --git a/config/qbittorrent/webui/qb-web-nightly/dist/INSTALL.md b/config/qbittorrent/webui/qb-web-nightly/dist/INSTALL.md deleted file mode 100644 index ba22647..0000000 --- a/config/qbittorrent/webui/qb-web-nightly/dist/INSTALL.md +++ /dev/null @@ -1,19 +0,0 @@ -Download release from: https://github.com/CzBiX/qb-web/releases/latest - -Setup: - -1. Extrace all files. -2. Open Web UI Options dialog, Set "Files location" of "alternative Web UI" to this folder(without `public` suffix). - -RECOVERY: -If something was going wrong, you can append `/api/v2/app/setPreferences?json=%7B%22alternative_webui_enabled%22:false%7D` after URL to disable alternative Web UI. - -======== - -安装说明: - -1. 解压所有文件。 -2. 打开 Web 用户界面的设置,将 “使用备用 Web UI” 的 “文件路径” 设置为本目录(不包含 `public` 后缀)。 - -恢复: -如果因为配置错误导致无法访问 Web 界面,可以手动在 URL 地址后面加上 `/api/v2/app/setPreferences?json=%7B%22alternative_webui_enabled%22:false%7D` 来禁用备用 UI 功能。 diff --git a/config/qbittorrent/webui/qb-web-nightly/dist/public/css/app.7b00faf3.css b/config/qbittorrent/webui/qb-web-nightly/dist/public/css/app.7b00faf3.css deleted file mode 100644 index 56ef101..0000000 --- a/config/qbittorrent/webui/qb-web-nightly/dist/public/css/app.7b00faf3.css +++ /dev/null @@ -1 +0,0 @@ -.content[data-v-299a15fc]:not(.is-input){white-space:pre-line}.theme--light.v-card .v-card__title[data-v-f8274abe]{background-color:#f5f5f5}.theme--dark.v-card .v-card__title[data-v-f8274abe]{background-color:#272727}.btn-add.with-footer[data-v-f8274abe]{margin-bottom:27.5px}.container[data-v-f8274abe]{padding:12px 0 0}.container .col[data-v-f8274abe],.container [class*=col-][data-v-f8274abe]{padding:0 .5em}.filter-group[data-v-26ced1bd] .v-list-group__header .v-list-item__icon{margin-left:8px}.filter-group .v-list-item[data-v-26ced1bd]{min-height:0}.filter-group .v-list-item .v-list-item__icon[data-v-26ced1bd]{margin:2px 30px 2px 10px}.filter-group .v-list-item .v-list-item__icon .v-icon[data-v-26ced1bd]{font-size:20px}.filter-group .v-list-item .v-list-item__content[data-v-26ced1bd]{padding-top:0;padding-bottom:0}.drawer .v-list-item__icon[data-v-333e2f85]{margin-left:8px}.app-bar .bar-title[data-v-d37eb7d4]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-left:-16px}.app-bar .bar-title .icon[data-v-d37eb7d4]{width:40px;height:40px}.app-bar .search-bar[data-v-d37eb7d4]{-webkit-transition:width .4s;transition:width .4s}.app-bar.phone-layout .search-bar[data-v-d37eb7d4]{-webkit-box-flex:1;-ms-flex:1;flex:1;margin:0 .5em 0 1em}.theme--light.v-card .v-card__title[data-v-a01eaf30]{background-color:#f5f5f5}.theme--dark.v-card .v-card__title[data-v-a01eaf30]{background-color:#272727}.torrents[data-v-a01eaf30]{overflow:auto}.v-dialog--fullscreen .v-card__text[data-v-a01eaf30]{padding-bottom:52px}.v-dialog--fullscreen .v-card__actions[data-v-a01eaf30]{position:absolute;bottom:0;right:0}.theme--light.v-card .v-card__title[data-v-dfcb35ec]{background-color:#f5f5f5}.theme--dark.v-card .v-card__title[data-v-dfcb35ec]{background-color:#272727}.torrents[data-v-dfcb35ec]{overflow:auto}.v-dialog--fullscreen .v-card__text[data-v-dfcb35ec]{padding-bottom:52px}.v-dialog--fullscreen .v-card__actions[data-v-dfcb35ec]{position:absolute;bottom:0;right:0}.theme--light.v-card .v-card__title[data-v-24122721]{background-color:#f5f5f5}.theme--dark.v-card .v-card__title[data-v-24122721]{background-color:#272727}.torrents[data-v-24122721]{overflow:auto;white-space:nowrap}.v-stepper[data-v-24122721]{-webkit-box-shadow:none;box-shadow:none}.v-dialog--fullscreen .v-card__text[data-v-24122721]{padding-bottom:52px}.v-dialog--fullscreen .v-card__actions[data-v-24122721]{position:absolute;bottom:0;right:0}.torrent-info[data-v-7f833448]{font-size:12px}.torrent-info .label[data-v-7f833448]{text-align:right;padding-right:.5em;text-transform:capitalize}.torrent-info .value[data-v-7f833448]{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.torrent-info .progress[data-v-7f833448]{margin:.5em;display:-webkit-box;display:-ms-flexbox;display:flex}.torrent-info .progress .progress-inner[data-v-7f833448]{margin:0 1em;-ms-flex-item-align:center;align-self:center;height:16px;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;border:1px inset}.torrent-content[data-v-360390b3] .v-treeview-node__root{min-height:0}.progress[data-v-360390b3]{display:inline-block;width:3em}[data-v-a834147c] .ip{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}[data-v-a834147c] .ip .country-flag{width:1.5em;margin-right:.5em}.panel[data-v-1e23acca]{margin-top:1em}.panel .inner[data-v-1e23acca]{max-height:500px;overflow-y:auto}fieldset[data-v-1e23acca]{border-width:1px}fieldset legend[data-v-1e23acca]{margin-left:1em}.theme--light.v-card .v-card__title[data-v-35c58977]{background-color:#f5f5f5}.theme--dark.v-card .v-card__title[data-v-35c58977]{background-color:#272727}[data-v-35c58977] .v-dialog{max-width:1100px}[data-v-35c58977] .v-dialog .v-card__text{min-height:200px;padding:0 8px 8px}[data-v-35c58977] .v-data-table tbody td,[data-v-35c58977] .v-data-table thead th{padding:0 2px!important;height:auto;white-space:nowrap}[data-v-35c58977] .v-data-table tbody td:first-child,[data-v-35c58977] .v-data-table thead th:first-child{padding:0 0 0 8px!important}[data-v-35c58977] .v-data-table tbody td:last-child,[data-v-35c58977] .v-data-table thead th:last-child{padding-right:8px!important}.v-dialog--fullscreen .v-card__text[data-v-35c58977]{padding-bottom:52px}.v-dialog--fullscreen .v-card__actions[data-v-35c58977]{position:absolute;bottom:0;right:0}.toolbar[data-v-c7d208ac]{display:-webkit-box;display:-ms-flexbox;display:flex;margin-left:2px}.torrents[data-v-c7d208ac]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding:0;height:100%}.table-wrapper[data-v-c7d208ac]{-webkit-box-flex:1;-ms-flex:1;flex:1;position:relative}.table-wrapper .v-data-table[data-v-c7d208ac]{position:absolute;width:100%;height:100%;overflow-y:auto;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.table-wrapper .v-data-table[data-v-c7d208ac] .v-data-table__wrapper{-webkit-box-flex:1;-ms-flex:1;flex:1}.table-wrapper .v-data-table[data-v-c7d208ac] thead th,.table-wrapper .v-data-table td[data-v-c7d208ac]{white-space:nowrap;padding:0 4px;overflow:hidden}.table-wrapper .v-data-table[data-v-c7d208ac] thead th .v-data-table__checkbox{padding-left:4px}.table-wrapper .v-data-table.theme--light tr[data-v-c7d208ac]:nth-child(2n){background-color:#eee}.table-wrapper .v-data-table.theme--dark tr[data-v-c7d208ac]:nth-child(2n){background-color:#272727}.table-wrapper .v-data-table td[data-v-c7d208ac]{font-size:13px;height:auto;border-bottom:none!important}.table-wrapper .v-data-table td .v-input--checkbox[data-v-c7d208ac]{margin-top:0;padding-top:0}.table-wrapper .v-data-table td .v-input--checkbox[data-v-c7d208ac] .v-input--selection-controls__input{margin:0 4px}.table-wrapper .v-data-table td .torrent-title[data-v-c7d208ac]{text-overflow:ellipsis;overflow:hidden;max-width:32em}.table-wrapper .v-data-table[data-v-c7d208ac] .v-data-footer{margin-right:4em}.table-wrapper .v-data-table[data-v-c7d208ac] .v-data-footer .v-data-footer__select .v-select{margin-top:10px;margin-bottom:10px}.phone-layout .v-data-table[data-v-c7d208ac] .v-data-footer{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-right:0}.phone-layout .v-data-table[data-v-c7d208ac] .v-data-footer .v-data-footer__select{display:none}.phone-layout .v-data-table[data-v-c7d208ac] .v-data-footer .v-data-footer__pagination{margin-left:0}.icon-label[data-v-c7d208ac]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.footer[data-v-335591ac]{font-size:14px;width:100%}.icon-label[data-v-335591ac]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.icon-upload-download[data-v-335591ac]{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.speed-switch[data-v-335591ac]{font-size:inherit;width:100%}.speed-switch[data-v-335591ac] .v-input__prepend-outer{margin-right:0}.speed-switch[data-v-335591ac] .v-input__control{margin-left:4px;width:100%}.speed-switch[data-v-335591ac] .v-input__control .v-input__slot{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.speed-switch[data-v-335591ac] .v-input__control .v-input__slot .v-input--selection-controls__input{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.speed-switch[data-v-335591ac] .v-input__control .v-input__slot .v-label{color:inherit;font-size:inherit}.speed-limited[data-v-335591ac]{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.in-drawer .no-icon[data-v-335591ac]{margin-left:24px}.theme--light.v-card .v-card__title[data-v-25ee86f6]{background-color:#f5f5f5}.theme--dark.v-card .v-card__title[data-v-25ee86f6]{background-color:#272727}.logs .log-item[data-v-25ee86f6]{line-height:1.4em}.logs .log-item .tag[data-v-25ee86f6]{font-family:monospace}.theme--light.v-card .v-card__title[data-v-0220a15a]{background-color:#f5f5f5}.theme--dark.v-card .v-card__title[data-v-0220a15a]{background-color:#272727}.v-card[data-v-0220a15a]{-ms-flex-direction:column;flex-direction:column}.v-card .v-card__text[data-v-0220a15a],.v-card[data-v-0220a15a]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal}.v-card .v-card__text[data-v-0220a15a]{-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column;padding:0}.loading[data-v-0220a15a]{width:100%;text-align:center;margin:1em 0}.toolbar[data-v-0220a15a]{-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%;padding:0 18px;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.content[data-v-0220a15a],.toolbar[data-v-0220a15a]{display:-webkit-box;display:-ms-flexbox;display:flex}.content[data-v-0220a15a]{height:75vh}.rss-rules[data-v-0220a15a]{-webkit-box-flex:30%;-ms-flex:30%;flex:30%}.rss-rules .v-list-item__action[data-v-0220a15a]{margin:0}.rule-details[data-v-0220a15a]{-webkit-box-flex:70%;-ms-flex:70%;flex:70%;overflow-y:auto}.rule-details .rule-form[data-v-0220a15a]{margin:.5em}.rule-details .rule-form .v-divider[data-v-0220a15a]{margin-bottom:1em}.rule-details .rule-form .v-input--selection-controls[data-v-0220a15a]{margin-top:4px}.rule-details .form-title[data-v-0220a15a]{margin-bottom:.5em}.rule-details .feeds-title[data-v-0220a15a]{margin:.5em}.rule-details .v-list-item[data-v-0220a15a]{padding:0 .5em}.rule-details .v-list-item__action[data-v-0220a15a]{margin:0}.theme--light.v-card .v-card__title[data-v-763d8c6c]{background-color:#f5f5f5}.theme--dark.v-card .v-card__title[data-v-763d8c6c]{background-color:#272727}.v-card[data-v-763d8c6c]{-ms-flex-direction:column;flex-direction:column}.v-card .v-card__text[data-v-763d8c6c],.v-card[data-v-763d8c6c]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal}.v-card .v-card__text[data-v-763d8c6c]{-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-direction:column;flex-direction:column;padding:0}.loading[data-v-763d8c6c]{width:100%;text-align:center;margin-top:1em}.toolbar[data-v-763d8c6c]{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%;padding:0 20px;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.toolbar .v-input--switch[data-v-763d8c6c]{margin:0 .5em;padding:0}.content[data-v-763d8c6c]{-webkit-box-flex:1;-ms-flex:1;flex:1;position:relative}.content .content-inner[data-v-763d8c6c]{position:absolute;width:100%;height:100%;display:-webkit-box;display:-ms-flexbox;display:flex}.rss-items[data-v-763d8c6c]{-webkit-box-flex:20%;-ms-flex:20%;flex:20%}.rss-details[data-v-763d8c6c]{-webkit-box-flex:40%;-ms-flex:40%;flex:40%;height:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.rss-details .rss-info[data-v-763d8c6c]{margin:.5em .5em 0}.rss-details .list-wrapper[data-v-763d8c6c]{-webkit-box-flex:1;-ms-flex:1;flex:1;position:relative}.rss-details .list-wrapper .v-list[data-v-763d8c6c]{position:absolute;width:100%;height:100%;overflow-y:auto}.rss-details .v-list-item__title[data-v-763d8c6c]{overflow:hidden;text-overflow:ellipsis}.rss-details .v-list-item .v-list-item__action[data-v-763d8c6c]{margin:0}.rss-details .v-list-item:not(:hover) .v-list-item__action[data-v-763d8c6c]{display:none}.rss-desc[data-v-763d8c6c]{-webkit-box-flex:40%;-ms-flex:40%;flex:40%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.rss-desc .rss-info[data-v-763d8c6c]{margin:.5em .5em 0}.rss-desc .iframe[data-v-763d8c6c]{border:none;-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:auto}.v-form .col__plugins button[data-v-50ebf5de]{width:100%}.v-form .col[data-v-50ebf5de]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.v-form .col>[data-v-50ebf5de]{margin:0 .5rem}.v-bottom-sheet .v-card__text[data-v-50ebf5de]{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.theme--light.v-card .v-card__title[data-v-2425d8a7]{background-color:#f5f5f5}.theme--dark.v-card .v-card__title[data-v-2425d8a7]{background-color:#272727}h4[data-v-2e1e1380]{margin-top:8px;padding-left:4px}.v-input--switch[data-v-2e1e1380]{margin:0}.theme--light.v-card .v-card__title[data-v-2e1e1380]{background-color:#f5f5f5}.theme--dark.v-card .v-card__title[data-v-2e1e1380]{background-color:#272727}.v-input--switch[data-v-6257e5f6]{margin:0}.theme--light.v-card .v-card__title[data-v-6257e5f6]{background-color:#f5f5f5}.theme--dark.v-card .v-card__title[data-v-6257e5f6]{background-color:#272727}.v-input--switch[data-v-0418c586]{margin:0}.theme--light.v-card .v-card__title[data-v-0418c586]{background-color:#f5f5f5}.theme--dark.v-card .v-card__title[data-v-0418c586]{background-color:#272727}.theme--light.v-card .v-card__title[data-v-3eb994fd]{background-color:#f5f5f5}.theme--dark.v-card .v-card__title[data-v-3eb994fd]{background-color:#272727}.button-bar[data-v-521b95f4]{display:-webkit-box;display:-ms-flexbox;display:flex;padding:.5em}.footer[data-v-521b95f4]{padding:1em}.v-footer[data-v-0d9d7390]{min-height:36px}html{overflow-y:hidden} \ No newline at end of file diff --git a/config/qbittorrent/webui/qb-web-nightly/dist/public/css/chunk-vendors.c60ad6d6.css b/config/qbittorrent/webui/qb-web-nightly/dist/public/css/chunk-vendors.c60ad6d6.css deleted file mode 100644 index b598115..0000000 --- a/config/qbittorrent/webui/qb-web-nightly/dist/public/css/chunk-vendors.c60ad6d6.css +++ /dev/null @@ -1,5 +0,0 @@ -@-webkit-keyframes v-shake{59%{margin-left:0}60%,80%{margin-left:2px}70%,90%{margin-left:-2px}}@keyframes v-shake{59%{margin-left:0}60%,80%{margin-left:2px}70%,90%{margin-left:-2px}}.v-application .black{background-color:#000!important;border-color:#000!important}.v-application .black--text{color:#000!important;caret-color:#000!important}.v-application .white{background-color:#fff!important;border-color:#fff!important}.v-application .white--text{color:#fff!important;caret-color:#fff!important}.v-application .transparent{background-color:transparent!important;border-color:transparent!important}.v-application .transparent--text{color:transparent!important;caret-color:transparent!important}.v-application .red{background-color:#f44336!important;border-color:#f44336!important}.v-application .red--text{color:#f44336!important;caret-color:#f44336!important}.v-application .red.lighten-5{background-color:#ffebee!important;border-color:#ffebee!important}.v-application .red--text.text--lighten-5{color:#ffebee!important;caret-color:#ffebee!important}.v-application .red.lighten-4{background-color:#ffcdd2!important;border-color:#ffcdd2!important}.v-application .red--text.text--lighten-4{color:#ffcdd2!important;caret-color:#ffcdd2!important}.v-application .red.lighten-3{background-color:#ef9a9a!important;border-color:#ef9a9a!important}.v-application .red--text.text--lighten-3{color:#ef9a9a!important;caret-color:#ef9a9a!important}.v-application .red.lighten-2{background-color:#e57373!important;border-color:#e57373!important}.v-application .red--text.text--lighten-2{color:#e57373!important;caret-color:#e57373!important}.v-application .red.lighten-1{background-color:#ef5350!important;border-color:#ef5350!important}.v-application .red--text.text--lighten-1{color:#ef5350!important;caret-color:#ef5350!important}.v-application .red.darken-1{background-color:#e53935!important;border-color:#e53935!important}.v-application .red--text.text--darken-1{color:#e53935!important;caret-color:#e53935!important}.v-application .red.darken-2{background-color:#d32f2f!important;border-color:#d32f2f!important}.v-application .red--text.text--darken-2{color:#d32f2f!important;caret-color:#d32f2f!important}.v-application .red.darken-3{background-color:#c62828!important;border-color:#c62828!important}.v-application .red--text.text--darken-3{color:#c62828!important;caret-color:#c62828!important}.v-application .red.darken-4{background-color:#b71c1c!important;border-color:#b71c1c!important}.v-application .red--text.text--darken-4{color:#b71c1c!important;caret-color:#b71c1c!important}.v-application .red.accent-1{background-color:#ff8a80!important;border-color:#ff8a80!important}.v-application .red--text.text--accent-1{color:#ff8a80!important;caret-color:#ff8a80!important}.v-application .red.accent-2{background-color:#ff5252!important;border-color:#ff5252!important}.v-application .red--text.text--accent-2{color:#ff5252!important;caret-color:#ff5252!important}.v-application .red.accent-3{background-color:#ff1744!important;border-color:#ff1744!important}.v-application .red--text.text--accent-3{color:#ff1744!important;caret-color:#ff1744!important}.v-application .red.accent-4{background-color:#d50000!important;border-color:#d50000!important}.v-application .red--text.text--accent-4{color:#d50000!important;caret-color:#d50000!important}.v-application .pink{background-color:#e91e63!important;border-color:#e91e63!important}.v-application .pink--text{color:#e91e63!important;caret-color:#e91e63!important}.v-application .pink.lighten-5{background-color:#fce4ec!important;border-color:#fce4ec!important}.v-application .pink--text.text--lighten-5{color:#fce4ec!important;caret-color:#fce4ec!important}.v-application .pink.lighten-4{background-color:#f8bbd0!important;border-color:#f8bbd0!important}.v-application .pink--text.text--lighten-4{color:#f8bbd0!important;caret-color:#f8bbd0!important}.v-application .pink.lighten-3{background-color:#f48fb1!important;border-color:#f48fb1!important}.v-application .pink--text.text--lighten-3{color:#f48fb1!important;caret-color:#f48fb1!important}.v-application .pink.lighten-2{background-color:#f06292!important;border-color:#f06292!important}.v-application .pink--text.text--lighten-2{color:#f06292!important;caret-color:#f06292!important}.v-application .pink.lighten-1{background-color:#ec407a!important;border-color:#ec407a!important}.v-application .pink--text.text--lighten-1{color:#ec407a!important;caret-color:#ec407a!important}.v-application .pink.darken-1{background-color:#d81b60!important;border-color:#d81b60!important}.v-application .pink--text.text--darken-1{color:#d81b60!important;caret-color:#d81b60!important}.v-application .pink.darken-2{background-color:#c2185b!important;border-color:#c2185b!important}.v-application .pink--text.text--darken-2{color:#c2185b!important;caret-color:#c2185b!important}.v-application .pink.darken-3{background-color:#ad1457!important;border-color:#ad1457!important}.v-application .pink--text.text--darken-3{color:#ad1457!important;caret-color:#ad1457!important}.v-application .pink.darken-4{background-color:#880e4f!important;border-color:#880e4f!important}.v-application .pink--text.text--darken-4{color:#880e4f!important;caret-color:#880e4f!important}.v-application .pink.accent-1{background-color:#ff80ab!important;border-color:#ff80ab!important}.v-application .pink--text.text--accent-1{color:#ff80ab!important;caret-color:#ff80ab!important}.v-application .pink.accent-2{background-color:#ff4081!important;border-color:#ff4081!important}.v-application .pink--text.text--accent-2{color:#ff4081!important;caret-color:#ff4081!important}.v-application .pink.accent-3{background-color:#f50057!important;border-color:#f50057!important}.v-application .pink--text.text--accent-3{color:#f50057!important;caret-color:#f50057!important}.v-application .pink.accent-4{background-color:#c51162!important;border-color:#c51162!important}.v-application .pink--text.text--accent-4{color:#c51162!important;caret-color:#c51162!important}.v-application .purple{background-color:#9c27b0!important;border-color:#9c27b0!important}.v-application .purple--text{color:#9c27b0!important;caret-color:#9c27b0!important}.v-application .purple.lighten-5{background-color:#f3e5f5!important;border-color:#f3e5f5!important}.v-application .purple--text.text--lighten-5{color:#f3e5f5!important;caret-color:#f3e5f5!important}.v-application .purple.lighten-4{background-color:#e1bee7!important;border-color:#e1bee7!important}.v-application .purple--text.text--lighten-4{color:#e1bee7!important;caret-color:#e1bee7!important}.v-application .purple.lighten-3{background-color:#ce93d8!important;border-color:#ce93d8!important}.v-application .purple--text.text--lighten-3{color:#ce93d8!important;caret-color:#ce93d8!important}.v-application .purple.lighten-2{background-color:#ba68c8!important;border-color:#ba68c8!important}.v-application .purple--text.text--lighten-2{color:#ba68c8!important;caret-color:#ba68c8!important}.v-application .purple.lighten-1{background-color:#ab47bc!important;border-color:#ab47bc!important}.v-application .purple--text.text--lighten-1{color:#ab47bc!important;caret-color:#ab47bc!important}.v-application .purple.darken-1{background-color:#8e24aa!important;border-color:#8e24aa!important}.v-application .purple--text.text--darken-1{color:#8e24aa!important;caret-color:#8e24aa!important}.v-application .purple.darken-2{background-color:#7b1fa2!important;border-color:#7b1fa2!important}.v-application .purple--text.text--darken-2{color:#7b1fa2!important;caret-color:#7b1fa2!important}.v-application .purple.darken-3{background-color:#6a1b9a!important;border-color:#6a1b9a!important}.v-application .purple--text.text--darken-3{color:#6a1b9a!important;caret-color:#6a1b9a!important}.v-application .purple.darken-4{background-color:#4a148c!important;border-color:#4a148c!important}.v-application .purple--text.text--darken-4{color:#4a148c!important;caret-color:#4a148c!important}.v-application .purple.accent-1{background-color:#ea80fc!important;border-color:#ea80fc!important}.v-application .purple--text.text--accent-1{color:#ea80fc!important;caret-color:#ea80fc!important}.v-application .purple.accent-2{background-color:#e040fb!important;border-color:#e040fb!important}.v-application .purple--text.text--accent-2{color:#e040fb!important;caret-color:#e040fb!important}.v-application .purple.accent-3{background-color:#d500f9!important;border-color:#d500f9!important}.v-application .purple--text.text--accent-3{color:#d500f9!important;caret-color:#d500f9!important}.v-application .purple.accent-4{background-color:#a0f!important;border-color:#a0f!important}.v-application .purple--text.text--accent-4{color:#a0f!important;caret-color:#a0f!important}.v-application .deep-purple{background-color:#673ab7!important;border-color:#673ab7!important}.v-application .deep-purple--text{color:#673ab7!important;caret-color:#673ab7!important}.v-application .deep-purple.lighten-5{background-color:#ede7f6!important;border-color:#ede7f6!important}.v-application .deep-purple--text.text--lighten-5{color:#ede7f6!important;caret-color:#ede7f6!important}.v-application .deep-purple.lighten-4{background-color:#d1c4e9!important;border-color:#d1c4e9!important}.v-application .deep-purple--text.text--lighten-4{color:#d1c4e9!important;caret-color:#d1c4e9!important}.v-application .deep-purple.lighten-3{background-color:#b39ddb!important;border-color:#b39ddb!important}.v-application .deep-purple--text.text--lighten-3{color:#b39ddb!important;caret-color:#b39ddb!important}.v-application .deep-purple.lighten-2{background-color:#9575cd!important;border-color:#9575cd!important}.v-application .deep-purple--text.text--lighten-2{color:#9575cd!important;caret-color:#9575cd!important}.v-application .deep-purple.lighten-1{background-color:#7e57c2!important;border-color:#7e57c2!important}.v-application .deep-purple--text.text--lighten-1{color:#7e57c2!important;caret-color:#7e57c2!important}.v-application .deep-purple.darken-1{background-color:#5e35b1!important;border-color:#5e35b1!important}.v-application .deep-purple--text.text--darken-1{color:#5e35b1!important;caret-color:#5e35b1!important}.v-application .deep-purple.darken-2{background-color:#512da8!important;border-color:#512da8!important}.v-application .deep-purple--text.text--darken-2{color:#512da8!important;caret-color:#512da8!important}.v-application .deep-purple.darken-3{background-color:#4527a0!important;border-color:#4527a0!important}.v-application .deep-purple--text.text--darken-3{color:#4527a0!important;caret-color:#4527a0!important}.v-application .deep-purple.darken-4{background-color:#311b92!important;border-color:#311b92!important}.v-application .deep-purple--text.text--darken-4{color:#311b92!important;caret-color:#311b92!important}.v-application .deep-purple.accent-1{background-color:#b388ff!important;border-color:#b388ff!important}.v-application .deep-purple--text.text--accent-1{color:#b388ff!important;caret-color:#b388ff!important}.v-application .deep-purple.accent-2{background-color:#7c4dff!important;border-color:#7c4dff!important}.v-application .deep-purple--text.text--accent-2{color:#7c4dff!important;caret-color:#7c4dff!important}.v-application .deep-purple.accent-3{background-color:#651fff!important;border-color:#651fff!important}.v-application .deep-purple--text.text--accent-3{color:#651fff!important;caret-color:#651fff!important}.v-application .deep-purple.accent-4{background-color:#6200ea!important;border-color:#6200ea!important}.v-application .deep-purple--text.text--accent-4{color:#6200ea!important;caret-color:#6200ea!important}.v-application .indigo{background-color:#3f51b5!important;border-color:#3f51b5!important}.v-application .indigo--text{color:#3f51b5!important;caret-color:#3f51b5!important}.v-application .indigo.lighten-5{background-color:#e8eaf6!important;border-color:#e8eaf6!important}.v-application .indigo--text.text--lighten-5{color:#e8eaf6!important;caret-color:#e8eaf6!important}.v-application .indigo.lighten-4{background-color:#c5cae9!important;border-color:#c5cae9!important}.v-application .indigo--text.text--lighten-4{color:#c5cae9!important;caret-color:#c5cae9!important}.v-application .indigo.lighten-3{background-color:#9fa8da!important;border-color:#9fa8da!important}.v-application .indigo--text.text--lighten-3{color:#9fa8da!important;caret-color:#9fa8da!important}.v-application .indigo.lighten-2{background-color:#7986cb!important;border-color:#7986cb!important}.v-application .indigo--text.text--lighten-2{color:#7986cb!important;caret-color:#7986cb!important}.v-application .indigo.lighten-1{background-color:#5c6bc0!important;border-color:#5c6bc0!important}.v-application .indigo--text.text--lighten-1{color:#5c6bc0!important;caret-color:#5c6bc0!important}.v-application .indigo.darken-1{background-color:#3949ab!important;border-color:#3949ab!important}.v-application .indigo--text.text--darken-1{color:#3949ab!important;caret-color:#3949ab!important}.v-application .indigo.darken-2{background-color:#303f9f!important;border-color:#303f9f!important}.v-application .indigo--text.text--darken-2{color:#303f9f!important;caret-color:#303f9f!important}.v-application .indigo.darken-3{background-color:#283593!important;border-color:#283593!important}.v-application .indigo--text.text--darken-3{color:#283593!important;caret-color:#283593!important}.v-application .indigo.darken-4{background-color:#1a237e!important;border-color:#1a237e!important}.v-application .indigo--text.text--darken-4{color:#1a237e!important;caret-color:#1a237e!important}.v-application .indigo.accent-1{background-color:#8c9eff!important;border-color:#8c9eff!important}.v-application .indigo--text.text--accent-1{color:#8c9eff!important;caret-color:#8c9eff!important}.v-application .indigo.accent-2{background-color:#536dfe!important;border-color:#536dfe!important}.v-application .indigo--text.text--accent-2{color:#536dfe!important;caret-color:#536dfe!important}.v-application .indigo.accent-3{background-color:#3d5afe!important;border-color:#3d5afe!important}.v-application .indigo--text.text--accent-3{color:#3d5afe!important;caret-color:#3d5afe!important}.v-application .indigo.accent-4{background-color:#304ffe!important;border-color:#304ffe!important}.v-application .indigo--text.text--accent-4{color:#304ffe!important;caret-color:#304ffe!important}.v-application .blue{background-color:#2196f3!important;border-color:#2196f3!important}.v-application .blue--text{color:#2196f3!important;caret-color:#2196f3!important}.v-application .blue.lighten-5{background-color:#e3f2fd!important;border-color:#e3f2fd!important}.v-application .blue--text.text--lighten-5{color:#e3f2fd!important;caret-color:#e3f2fd!important}.v-application .blue.lighten-4{background-color:#bbdefb!important;border-color:#bbdefb!important}.v-application .blue--text.text--lighten-4{color:#bbdefb!important;caret-color:#bbdefb!important}.v-application .blue.lighten-3{background-color:#90caf9!important;border-color:#90caf9!important}.v-application .blue--text.text--lighten-3{color:#90caf9!important;caret-color:#90caf9!important}.v-application .blue.lighten-2{background-color:#64b5f6!important;border-color:#64b5f6!important}.v-application .blue--text.text--lighten-2{color:#64b5f6!important;caret-color:#64b5f6!important}.v-application .blue.lighten-1{background-color:#42a5f5!important;border-color:#42a5f5!important}.v-application .blue--text.text--lighten-1{color:#42a5f5!important;caret-color:#42a5f5!important}.v-application .blue.darken-1{background-color:#1e88e5!important;border-color:#1e88e5!important}.v-application .blue--text.text--darken-1{color:#1e88e5!important;caret-color:#1e88e5!important}.v-application .blue.darken-2{background-color:#1976d2!important;border-color:#1976d2!important}.v-application .blue--text.text--darken-2{color:#1976d2!important;caret-color:#1976d2!important}.v-application .blue.darken-3{background-color:#1565c0!important;border-color:#1565c0!important}.v-application .blue--text.text--darken-3{color:#1565c0!important;caret-color:#1565c0!important}.v-application .blue.darken-4{background-color:#0d47a1!important;border-color:#0d47a1!important}.v-application .blue--text.text--darken-4{color:#0d47a1!important;caret-color:#0d47a1!important}.v-application .blue.accent-1{background-color:#82b1ff!important;border-color:#82b1ff!important}.v-application .blue--text.text--accent-1{color:#82b1ff!important;caret-color:#82b1ff!important}.v-application .blue.accent-2{background-color:#448aff!important;border-color:#448aff!important}.v-application .blue--text.text--accent-2{color:#448aff!important;caret-color:#448aff!important}.v-application .blue.accent-3{background-color:#2979ff!important;border-color:#2979ff!important}.v-application .blue--text.text--accent-3{color:#2979ff!important;caret-color:#2979ff!important}.v-application .blue.accent-4{background-color:#2962ff!important;border-color:#2962ff!important}.v-application .blue--text.text--accent-4{color:#2962ff!important;caret-color:#2962ff!important}.v-application .light-blue{background-color:#03a9f4!important;border-color:#03a9f4!important}.v-application .light-blue--text{color:#03a9f4!important;caret-color:#03a9f4!important}.v-application .light-blue.lighten-5{background-color:#e1f5fe!important;border-color:#e1f5fe!important}.v-application .light-blue--text.text--lighten-5{color:#e1f5fe!important;caret-color:#e1f5fe!important}.v-application .light-blue.lighten-4{background-color:#b3e5fc!important;border-color:#b3e5fc!important}.v-application .light-blue--text.text--lighten-4{color:#b3e5fc!important;caret-color:#b3e5fc!important}.v-application .light-blue.lighten-3{background-color:#81d4fa!important;border-color:#81d4fa!important}.v-application .light-blue--text.text--lighten-3{color:#81d4fa!important;caret-color:#81d4fa!important}.v-application .light-blue.lighten-2{background-color:#4fc3f7!important;border-color:#4fc3f7!important}.v-application .light-blue--text.text--lighten-2{color:#4fc3f7!important;caret-color:#4fc3f7!important}.v-application .light-blue.lighten-1{background-color:#29b6f6!important;border-color:#29b6f6!important}.v-application .light-blue--text.text--lighten-1{color:#29b6f6!important;caret-color:#29b6f6!important}.v-application .light-blue.darken-1{background-color:#039be5!important;border-color:#039be5!important}.v-application .light-blue--text.text--darken-1{color:#039be5!important;caret-color:#039be5!important}.v-application .light-blue.darken-2{background-color:#0288d1!important;border-color:#0288d1!important}.v-application .light-blue--text.text--darken-2{color:#0288d1!important;caret-color:#0288d1!important}.v-application .light-blue.darken-3{background-color:#0277bd!important;border-color:#0277bd!important}.v-application .light-blue--text.text--darken-3{color:#0277bd!important;caret-color:#0277bd!important}.v-application .light-blue.darken-4{background-color:#01579b!important;border-color:#01579b!important}.v-application .light-blue--text.text--darken-4{color:#01579b!important;caret-color:#01579b!important}.v-application .light-blue.accent-1{background-color:#80d8ff!important;border-color:#80d8ff!important}.v-application .light-blue--text.text--accent-1{color:#80d8ff!important;caret-color:#80d8ff!important}.v-application .light-blue.accent-2{background-color:#40c4ff!important;border-color:#40c4ff!important}.v-application .light-blue--text.text--accent-2{color:#40c4ff!important;caret-color:#40c4ff!important}.v-application .light-blue.accent-3{background-color:#00b0ff!important;border-color:#00b0ff!important}.v-application .light-blue--text.text--accent-3{color:#00b0ff!important;caret-color:#00b0ff!important}.v-application .light-blue.accent-4{background-color:#0091ea!important;border-color:#0091ea!important}.v-application .light-blue--text.text--accent-4{color:#0091ea!important;caret-color:#0091ea!important}.v-application .cyan{background-color:#00bcd4!important;border-color:#00bcd4!important}.v-application .cyan--text{color:#00bcd4!important;caret-color:#00bcd4!important}.v-application .cyan.lighten-5{background-color:#e0f7fa!important;border-color:#e0f7fa!important}.v-application .cyan--text.text--lighten-5{color:#e0f7fa!important;caret-color:#e0f7fa!important}.v-application .cyan.lighten-4{background-color:#b2ebf2!important;border-color:#b2ebf2!important}.v-application .cyan--text.text--lighten-4{color:#b2ebf2!important;caret-color:#b2ebf2!important}.v-application .cyan.lighten-3{background-color:#80deea!important;border-color:#80deea!important}.v-application .cyan--text.text--lighten-3{color:#80deea!important;caret-color:#80deea!important}.v-application .cyan.lighten-2{background-color:#4dd0e1!important;border-color:#4dd0e1!important}.v-application .cyan--text.text--lighten-2{color:#4dd0e1!important;caret-color:#4dd0e1!important}.v-application .cyan.lighten-1{background-color:#26c6da!important;border-color:#26c6da!important}.v-application .cyan--text.text--lighten-1{color:#26c6da!important;caret-color:#26c6da!important}.v-application .cyan.darken-1{background-color:#00acc1!important;border-color:#00acc1!important}.v-application .cyan--text.text--darken-1{color:#00acc1!important;caret-color:#00acc1!important}.v-application .cyan.darken-2{background-color:#0097a7!important;border-color:#0097a7!important}.v-application .cyan--text.text--darken-2{color:#0097a7!important;caret-color:#0097a7!important}.v-application .cyan.darken-3{background-color:#00838f!important;border-color:#00838f!important}.v-application .cyan--text.text--darken-3{color:#00838f!important;caret-color:#00838f!important}.v-application .cyan.darken-4{background-color:#006064!important;border-color:#006064!important}.v-application .cyan--text.text--darken-4{color:#006064!important;caret-color:#006064!important}.v-application .cyan.accent-1{background-color:#84ffff!important;border-color:#84ffff!important}.v-application .cyan--text.text--accent-1{color:#84ffff!important;caret-color:#84ffff!important}.v-application .cyan.accent-2{background-color:#18ffff!important;border-color:#18ffff!important}.v-application .cyan--text.text--accent-2{color:#18ffff!important;caret-color:#18ffff!important}.v-application .cyan.accent-3{background-color:#00e5ff!important;border-color:#00e5ff!important}.v-application .cyan--text.text--accent-3{color:#00e5ff!important;caret-color:#00e5ff!important}.v-application .cyan.accent-4{background-color:#00b8d4!important;border-color:#00b8d4!important}.v-application .cyan--text.text--accent-4{color:#00b8d4!important;caret-color:#00b8d4!important}.v-application .teal{background-color:#009688!important;border-color:#009688!important}.v-application .teal--text{color:#009688!important;caret-color:#009688!important}.v-application .teal.lighten-5{background-color:#e0f2f1!important;border-color:#e0f2f1!important}.v-application .teal--text.text--lighten-5{color:#e0f2f1!important;caret-color:#e0f2f1!important}.v-application .teal.lighten-4{background-color:#b2dfdb!important;border-color:#b2dfdb!important}.v-application .teal--text.text--lighten-4{color:#b2dfdb!important;caret-color:#b2dfdb!important}.v-application .teal.lighten-3{background-color:#80cbc4!important;border-color:#80cbc4!important}.v-application .teal--text.text--lighten-3{color:#80cbc4!important;caret-color:#80cbc4!important}.v-application .teal.lighten-2{background-color:#4db6ac!important;border-color:#4db6ac!important}.v-application .teal--text.text--lighten-2{color:#4db6ac!important;caret-color:#4db6ac!important}.v-application .teal.lighten-1{background-color:#26a69a!important;border-color:#26a69a!important}.v-application .teal--text.text--lighten-1{color:#26a69a!important;caret-color:#26a69a!important}.v-application .teal.darken-1{background-color:#00897b!important;border-color:#00897b!important}.v-application .teal--text.text--darken-1{color:#00897b!important;caret-color:#00897b!important}.v-application .teal.darken-2{background-color:#00796b!important;border-color:#00796b!important}.v-application .teal--text.text--darken-2{color:#00796b!important;caret-color:#00796b!important}.v-application .teal.darken-3{background-color:#00695c!important;border-color:#00695c!important}.v-application .teal--text.text--darken-3{color:#00695c!important;caret-color:#00695c!important}.v-application .teal.darken-4{background-color:#004d40!important;border-color:#004d40!important}.v-application .teal--text.text--darken-4{color:#004d40!important;caret-color:#004d40!important}.v-application .teal.accent-1{background-color:#a7ffeb!important;border-color:#a7ffeb!important}.v-application .teal--text.text--accent-1{color:#a7ffeb!important;caret-color:#a7ffeb!important}.v-application .teal.accent-2{background-color:#64ffda!important;border-color:#64ffda!important}.v-application .teal--text.text--accent-2{color:#64ffda!important;caret-color:#64ffda!important}.v-application .teal.accent-3{background-color:#1de9b6!important;border-color:#1de9b6!important}.v-application .teal--text.text--accent-3{color:#1de9b6!important;caret-color:#1de9b6!important}.v-application .teal.accent-4{background-color:#00bfa5!important;border-color:#00bfa5!important}.v-application .teal--text.text--accent-4{color:#00bfa5!important;caret-color:#00bfa5!important}.v-application .green{background-color:#4caf50!important;border-color:#4caf50!important}.v-application .green--text{color:#4caf50!important;caret-color:#4caf50!important}.v-application .green.lighten-5{background-color:#e8f5e9!important;border-color:#e8f5e9!important}.v-application .green--text.text--lighten-5{color:#e8f5e9!important;caret-color:#e8f5e9!important}.v-application .green.lighten-4{background-color:#c8e6c9!important;border-color:#c8e6c9!important}.v-application .green--text.text--lighten-4{color:#c8e6c9!important;caret-color:#c8e6c9!important}.v-application .green.lighten-3{background-color:#a5d6a7!important;border-color:#a5d6a7!important}.v-application .green--text.text--lighten-3{color:#a5d6a7!important;caret-color:#a5d6a7!important}.v-application .green.lighten-2{background-color:#81c784!important;border-color:#81c784!important}.v-application .green--text.text--lighten-2{color:#81c784!important;caret-color:#81c784!important}.v-application .green.lighten-1{background-color:#66bb6a!important;border-color:#66bb6a!important}.v-application .green--text.text--lighten-1{color:#66bb6a!important;caret-color:#66bb6a!important}.v-application .green.darken-1{background-color:#43a047!important;border-color:#43a047!important}.v-application .green--text.text--darken-1{color:#43a047!important;caret-color:#43a047!important}.v-application .green.darken-2{background-color:#388e3c!important;border-color:#388e3c!important}.v-application .green--text.text--darken-2{color:#388e3c!important;caret-color:#388e3c!important}.v-application .green.darken-3{background-color:#2e7d32!important;border-color:#2e7d32!important}.v-application .green--text.text--darken-3{color:#2e7d32!important;caret-color:#2e7d32!important}.v-application .green.darken-4{background-color:#1b5e20!important;border-color:#1b5e20!important}.v-application .green--text.text--darken-4{color:#1b5e20!important;caret-color:#1b5e20!important}.v-application .green.accent-1{background-color:#b9f6ca!important;border-color:#b9f6ca!important}.v-application .green--text.text--accent-1{color:#b9f6ca!important;caret-color:#b9f6ca!important}.v-application .green.accent-2{background-color:#69f0ae!important;border-color:#69f0ae!important}.v-application .green--text.text--accent-2{color:#69f0ae!important;caret-color:#69f0ae!important}.v-application .green.accent-3{background-color:#00e676!important;border-color:#00e676!important}.v-application .green--text.text--accent-3{color:#00e676!important;caret-color:#00e676!important}.v-application .green.accent-4{background-color:#00c853!important;border-color:#00c853!important}.v-application .green--text.text--accent-4{color:#00c853!important;caret-color:#00c853!important}.v-application .light-green{background-color:#8bc34a!important;border-color:#8bc34a!important}.v-application .light-green--text{color:#8bc34a!important;caret-color:#8bc34a!important}.v-application .light-green.lighten-5{background-color:#f1f8e9!important;border-color:#f1f8e9!important}.v-application .light-green--text.text--lighten-5{color:#f1f8e9!important;caret-color:#f1f8e9!important}.v-application .light-green.lighten-4{background-color:#dcedc8!important;border-color:#dcedc8!important}.v-application .light-green--text.text--lighten-4{color:#dcedc8!important;caret-color:#dcedc8!important}.v-application .light-green.lighten-3{background-color:#c5e1a5!important;border-color:#c5e1a5!important}.v-application .light-green--text.text--lighten-3{color:#c5e1a5!important;caret-color:#c5e1a5!important}.v-application .light-green.lighten-2{background-color:#aed581!important;border-color:#aed581!important}.v-application .light-green--text.text--lighten-2{color:#aed581!important;caret-color:#aed581!important}.v-application .light-green.lighten-1{background-color:#9ccc65!important;border-color:#9ccc65!important}.v-application .light-green--text.text--lighten-1{color:#9ccc65!important;caret-color:#9ccc65!important}.v-application .light-green.darken-1{background-color:#7cb342!important;border-color:#7cb342!important}.v-application .light-green--text.text--darken-1{color:#7cb342!important;caret-color:#7cb342!important}.v-application .light-green.darken-2{background-color:#689f38!important;border-color:#689f38!important}.v-application .light-green--text.text--darken-2{color:#689f38!important;caret-color:#689f38!important}.v-application .light-green.darken-3{background-color:#558b2f!important;border-color:#558b2f!important}.v-application .light-green--text.text--darken-3{color:#558b2f!important;caret-color:#558b2f!important}.v-application .light-green.darken-4{background-color:#33691e!important;border-color:#33691e!important}.v-application .light-green--text.text--darken-4{color:#33691e!important;caret-color:#33691e!important}.v-application .light-green.accent-1{background-color:#ccff90!important;border-color:#ccff90!important}.v-application .light-green--text.text--accent-1{color:#ccff90!important;caret-color:#ccff90!important}.v-application .light-green.accent-2{background-color:#b2ff59!important;border-color:#b2ff59!important}.v-application .light-green--text.text--accent-2{color:#b2ff59!important;caret-color:#b2ff59!important}.v-application .light-green.accent-3{background-color:#76ff03!important;border-color:#76ff03!important}.v-application .light-green--text.text--accent-3{color:#76ff03!important;caret-color:#76ff03!important}.v-application .light-green.accent-4{background-color:#64dd17!important;border-color:#64dd17!important}.v-application .light-green--text.text--accent-4{color:#64dd17!important;caret-color:#64dd17!important}.v-application .lime{background-color:#cddc39!important;border-color:#cddc39!important}.v-application .lime--text{color:#cddc39!important;caret-color:#cddc39!important}.v-application .lime.lighten-5{background-color:#f9fbe7!important;border-color:#f9fbe7!important}.v-application .lime--text.text--lighten-5{color:#f9fbe7!important;caret-color:#f9fbe7!important}.v-application .lime.lighten-4{background-color:#f0f4c3!important;border-color:#f0f4c3!important}.v-application .lime--text.text--lighten-4{color:#f0f4c3!important;caret-color:#f0f4c3!important}.v-application .lime.lighten-3{background-color:#e6ee9c!important;border-color:#e6ee9c!important}.v-application .lime--text.text--lighten-3{color:#e6ee9c!important;caret-color:#e6ee9c!important}.v-application .lime.lighten-2{background-color:#dce775!important;border-color:#dce775!important}.v-application .lime--text.text--lighten-2{color:#dce775!important;caret-color:#dce775!important}.v-application .lime.lighten-1{background-color:#d4e157!important;border-color:#d4e157!important}.v-application .lime--text.text--lighten-1{color:#d4e157!important;caret-color:#d4e157!important}.v-application .lime.darken-1{background-color:#c0ca33!important;border-color:#c0ca33!important}.v-application .lime--text.text--darken-1{color:#c0ca33!important;caret-color:#c0ca33!important}.v-application .lime.darken-2{background-color:#afb42b!important;border-color:#afb42b!important}.v-application .lime--text.text--darken-2{color:#afb42b!important;caret-color:#afb42b!important}.v-application .lime.darken-3{background-color:#9e9d24!important;border-color:#9e9d24!important}.v-application .lime--text.text--darken-3{color:#9e9d24!important;caret-color:#9e9d24!important}.v-application .lime.darken-4{background-color:#827717!important;border-color:#827717!important}.v-application .lime--text.text--darken-4{color:#827717!important;caret-color:#827717!important}.v-application .lime.accent-1{background-color:#f4ff81!important;border-color:#f4ff81!important}.v-application .lime--text.text--accent-1{color:#f4ff81!important;caret-color:#f4ff81!important}.v-application .lime.accent-2{background-color:#eeff41!important;border-color:#eeff41!important}.v-application .lime--text.text--accent-2{color:#eeff41!important;caret-color:#eeff41!important}.v-application .lime.accent-3{background-color:#c6ff00!important;border-color:#c6ff00!important}.v-application .lime--text.text--accent-3{color:#c6ff00!important;caret-color:#c6ff00!important}.v-application .lime.accent-4{background-color:#aeea00!important;border-color:#aeea00!important}.v-application .lime--text.text--accent-4{color:#aeea00!important;caret-color:#aeea00!important}.v-application .yellow{background-color:#ffeb3b!important;border-color:#ffeb3b!important}.v-application .yellow--text{color:#ffeb3b!important;caret-color:#ffeb3b!important}.v-application .yellow.lighten-5{background-color:#fffde7!important;border-color:#fffde7!important}.v-application .yellow--text.text--lighten-5{color:#fffde7!important;caret-color:#fffde7!important}.v-application .yellow.lighten-4{background-color:#fff9c4!important;border-color:#fff9c4!important}.v-application .yellow--text.text--lighten-4{color:#fff9c4!important;caret-color:#fff9c4!important}.v-application .yellow.lighten-3{background-color:#fff59d!important;border-color:#fff59d!important}.v-application .yellow--text.text--lighten-3{color:#fff59d!important;caret-color:#fff59d!important}.v-application .yellow.lighten-2{background-color:#fff176!important;border-color:#fff176!important}.v-application .yellow--text.text--lighten-2{color:#fff176!important;caret-color:#fff176!important}.v-application .yellow.lighten-1{background-color:#ffee58!important;border-color:#ffee58!important}.v-application .yellow--text.text--lighten-1{color:#ffee58!important;caret-color:#ffee58!important}.v-application .yellow.darken-1{background-color:#fdd835!important;border-color:#fdd835!important}.v-application .yellow--text.text--darken-1{color:#fdd835!important;caret-color:#fdd835!important}.v-application .yellow.darken-2{background-color:#fbc02d!important;border-color:#fbc02d!important}.v-application .yellow--text.text--darken-2{color:#fbc02d!important;caret-color:#fbc02d!important}.v-application .yellow.darken-3{background-color:#f9a825!important;border-color:#f9a825!important}.v-application .yellow--text.text--darken-3{color:#f9a825!important;caret-color:#f9a825!important}.v-application .yellow.darken-4{background-color:#f57f17!important;border-color:#f57f17!important}.v-application .yellow--text.text--darken-4{color:#f57f17!important;caret-color:#f57f17!important}.v-application .yellow.accent-1{background-color:#ffff8d!important;border-color:#ffff8d!important}.v-application .yellow--text.text--accent-1{color:#ffff8d!important;caret-color:#ffff8d!important}.v-application .yellow.accent-2{background-color:#ff0!important;border-color:#ff0!important}.v-application .yellow--text.text--accent-2{color:#ff0!important;caret-color:#ff0!important}.v-application .yellow.accent-3{background-color:#ffea00!important;border-color:#ffea00!important}.v-application .yellow--text.text--accent-3{color:#ffea00!important;caret-color:#ffea00!important}.v-application .yellow.accent-4{background-color:#ffd600!important;border-color:#ffd600!important}.v-application .yellow--text.text--accent-4{color:#ffd600!important;caret-color:#ffd600!important}.v-application .amber{background-color:#ffc107!important;border-color:#ffc107!important}.v-application .amber--text{color:#ffc107!important;caret-color:#ffc107!important}.v-application .amber.lighten-5{background-color:#fff8e1!important;border-color:#fff8e1!important}.v-application .amber--text.text--lighten-5{color:#fff8e1!important;caret-color:#fff8e1!important}.v-application .amber.lighten-4{background-color:#ffecb3!important;border-color:#ffecb3!important}.v-application .amber--text.text--lighten-4{color:#ffecb3!important;caret-color:#ffecb3!important}.v-application .amber.lighten-3{background-color:#ffe082!important;border-color:#ffe082!important}.v-application .amber--text.text--lighten-3{color:#ffe082!important;caret-color:#ffe082!important}.v-application .amber.lighten-2{background-color:#ffd54f!important;border-color:#ffd54f!important}.v-application .amber--text.text--lighten-2{color:#ffd54f!important;caret-color:#ffd54f!important}.v-application .amber.lighten-1{background-color:#ffca28!important;border-color:#ffca28!important}.v-application .amber--text.text--lighten-1{color:#ffca28!important;caret-color:#ffca28!important}.v-application .amber.darken-1{background-color:#ffb300!important;border-color:#ffb300!important}.v-application .amber--text.text--darken-1{color:#ffb300!important;caret-color:#ffb300!important}.v-application .amber.darken-2{background-color:#ffa000!important;border-color:#ffa000!important}.v-application .amber--text.text--darken-2{color:#ffa000!important;caret-color:#ffa000!important}.v-application .amber.darken-3{background-color:#ff8f00!important;border-color:#ff8f00!important}.v-application .amber--text.text--darken-3{color:#ff8f00!important;caret-color:#ff8f00!important}.v-application .amber.darken-4{background-color:#ff6f00!important;border-color:#ff6f00!important}.v-application .amber--text.text--darken-4{color:#ff6f00!important;caret-color:#ff6f00!important}.v-application .amber.accent-1{background-color:#ffe57f!important;border-color:#ffe57f!important}.v-application .amber--text.text--accent-1{color:#ffe57f!important;caret-color:#ffe57f!important}.v-application .amber.accent-2{background-color:#ffd740!important;border-color:#ffd740!important}.v-application .amber--text.text--accent-2{color:#ffd740!important;caret-color:#ffd740!important}.v-application .amber.accent-3{background-color:#ffc400!important;border-color:#ffc400!important}.v-application .amber--text.text--accent-3{color:#ffc400!important;caret-color:#ffc400!important}.v-application .amber.accent-4{background-color:#ffab00!important;border-color:#ffab00!important}.v-application .amber--text.text--accent-4{color:#ffab00!important;caret-color:#ffab00!important}.v-application .orange{background-color:#ff9800!important;border-color:#ff9800!important}.v-application .orange--text{color:#ff9800!important;caret-color:#ff9800!important}.v-application .orange.lighten-5{background-color:#fff3e0!important;border-color:#fff3e0!important}.v-application .orange--text.text--lighten-5{color:#fff3e0!important;caret-color:#fff3e0!important}.v-application .orange.lighten-4{background-color:#ffe0b2!important;border-color:#ffe0b2!important}.v-application .orange--text.text--lighten-4{color:#ffe0b2!important;caret-color:#ffe0b2!important}.v-application .orange.lighten-3{background-color:#ffcc80!important;border-color:#ffcc80!important}.v-application .orange--text.text--lighten-3{color:#ffcc80!important;caret-color:#ffcc80!important}.v-application .orange.lighten-2{background-color:#ffb74d!important;border-color:#ffb74d!important}.v-application .orange--text.text--lighten-2{color:#ffb74d!important;caret-color:#ffb74d!important}.v-application .orange.lighten-1{background-color:#ffa726!important;border-color:#ffa726!important}.v-application .orange--text.text--lighten-1{color:#ffa726!important;caret-color:#ffa726!important}.v-application .orange.darken-1{background-color:#fb8c00!important;border-color:#fb8c00!important}.v-application .orange--text.text--darken-1{color:#fb8c00!important;caret-color:#fb8c00!important}.v-application .orange.darken-2{background-color:#f57c00!important;border-color:#f57c00!important}.v-application .orange--text.text--darken-2{color:#f57c00!important;caret-color:#f57c00!important}.v-application .orange.darken-3{background-color:#ef6c00!important;border-color:#ef6c00!important}.v-application .orange--text.text--darken-3{color:#ef6c00!important;caret-color:#ef6c00!important}.v-application .orange.darken-4{background-color:#e65100!important;border-color:#e65100!important}.v-application .orange--text.text--darken-4{color:#e65100!important;caret-color:#e65100!important}.v-application .orange.accent-1{background-color:#ffd180!important;border-color:#ffd180!important}.v-application .orange--text.text--accent-1{color:#ffd180!important;caret-color:#ffd180!important}.v-application .orange.accent-2{background-color:#ffab40!important;border-color:#ffab40!important}.v-application .orange--text.text--accent-2{color:#ffab40!important;caret-color:#ffab40!important}.v-application .orange.accent-3{background-color:#ff9100!important;border-color:#ff9100!important}.v-application .orange--text.text--accent-3{color:#ff9100!important;caret-color:#ff9100!important}.v-application .orange.accent-4{background-color:#ff6d00!important;border-color:#ff6d00!important}.v-application .orange--text.text--accent-4{color:#ff6d00!important;caret-color:#ff6d00!important}.v-application .deep-orange{background-color:#ff5722!important;border-color:#ff5722!important}.v-application .deep-orange--text{color:#ff5722!important;caret-color:#ff5722!important}.v-application .deep-orange.lighten-5{background-color:#fbe9e7!important;border-color:#fbe9e7!important}.v-application .deep-orange--text.text--lighten-5{color:#fbe9e7!important;caret-color:#fbe9e7!important}.v-application .deep-orange.lighten-4{background-color:#ffccbc!important;border-color:#ffccbc!important}.v-application .deep-orange--text.text--lighten-4{color:#ffccbc!important;caret-color:#ffccbc!important}.v-application .deep-orange.lighten-3{background-color:#ffab91!important;border-color:#ffab91!important}.v-application .deep-orange--text.text--lighten-3{color:#ffab91!important;caret-color:#ffab91!important}.v-application .deep-orange.lighten-2{background-color:#ff8a65!important;border-color:#ff8a65!important}.v-application .deep-orange--text.text--lighten-2{color:#ff8a65!important;caret-color:#ff8a65!important}.v-application .deep-orange.lighten-1{background-color:#ff7043!important;border-color:#ff7043!important}.v-application .deep-orange--text.text--lighten-1{color:#ff7043!important;caret-color:#ff7043!important}.v-application .deep-orange.darken-1{background-color:#f4511e!important;border-color:#f4511e!important}.v-application .deep-orange--text.text--darken-1{color:#f4511e!important;caret-color:#f4511e!important}.v-application .deep-orange.darken-2{background-color:#e64a19!important;border-color:#e64a19!important}.v-application .deep-orange--text.text--darken-2{color:#e64a19!important;caret-color:#e64a19!important}.v-application .deep-orange.darken-3{background-color:#d84315!important;border-color:#d84315!important}.v-application .deep-orange--text.text--darken-3{color:#d84315!important;caret-color:#d84315!important}.v-application .deep-orange.darken-4{background-color:#bf360c!important;border-color:#bf360c!important}.v-application .deep-orange--text.text--darken-4{color:#bf360c!important;caret-color:#bf360c!important}.v-application .deep-orange.accent-1{background-color:#ff9e80!important;border-color:#ff9e80!important}.v-application .deep-orange--text.text--accent-1{color:#ff9e80!important;caret-color:#ff9e80!important}.v-application .deep-orange.accent-2{background-color:#ff6e40!important;border-color:#ff6e40!important}.v-application .deep-orange--text.text--accent-2{color:#ff6e40!important;caret-color:#ff6e40!important}.v-application .deep-orange.accent-3{background-color:#ff3d00!important;border-color:#ff3d00!important}.v-application .deep-orange--text.text--accent-3{color:#ff3d00!important;caret-color:#ff3d00!important}.v-application .deep-orange.accent-4{background-color:#dd2c00!important;border-color:#dd2c00!important}.v-application .deep-orange--text.text--accent-4{color:#dd2c00!important;caret-color:#dd2c00!important}.v-application .brown{background-color:#795548!important;border-color:#795548!important}.v-application .brown--text{color:#795548!important;caret-color:#795548!important}.v-application .brown.lighten-5{background-color:#efebe9!important;border-color:#efebe9!important}.v-application .brown--text.text--lighten-5{color:#efebe9!important;caret-color:#efebe9!important}.v-application .brown.lighten-4{background-color:#d7ccc8!important;border-color:#d7ccc8!important}.v-application .brown--text.text--lighten-4{color:#d7ccc8!important;caret-color:#d7ccc8!important}.v-application .brown.lighten-3{background-color:#bcaaa4!important;border-color:#bcaaa4!important}.v-application .brown--text.text--lighten-3{color:#bcaaa4!important;caret-color:#bcaaa4!important}.v-application .brown.lighten-2{background-color:#a1887f!important;border-color:#a1887f!important}.v-application .brown--text.text--lighten-2{color:#a1887f!important;caret-color:#a1887f!important}.v-application .brown.lighten-1{background-color:#8d6e63!important;border-color:#8d6e63!important}.v-application .brown--text.text--lighten-1{color:#8d6e63!important;caret-color:#8d6e63!important}.v-application .brown.darken-1{background-color:#6d4c41!important;border-color:#6d4c41!important}.v-application .brown--text.text--darken-1{color:#6d4c41!important;caret-color:#6d4c41!important}.v-application .brown.darken-2{background-color:#5d4037!important;border-color:#5d4037!important}.v-application .brown--text.text--darken-2{color:#5d4037!important;caret-color:#5d4037!important}.v-application .brown.darken-3{background-color:#4e342e!important;border-color:#4e342e!important}.v-application .brown--text.text--darken-3{color:#4e342e!important;caret-color:#4e342e!important}.v-application .brown.darken-4{background-color:#3e2723!important;border-color:#3e2723!important}.v-application .brown--text.text--darken-4{color:#3e2723!important;caret-color:#3e2723!important}.v-application .blue-grey{background-color:#607d8b!important;border-color:#607d8b!important}.v-application .blue-grey--text{color:#607d8b!important;caret-color:#607d8b!important}.v-application .blue-grey.lighten-5{background-color:#eceff1!important;border-color:#eceff1!important}.v-application .blue-grey--text.text--lighten-5{color:#eceff1!important;caret-color:#eceff1!important}.v-application .blue-grey.lighten-4{background-color:#cfd8dc!important;border-color:#cfd8dc!important}.v-application .blue-grey--text.text--lighten-4{color:#cfd8dc!important;caret-color:#cfd8dc!important}.v-application .blue-grey.lighten-3{background-color:#b0bec5!important;border-color:#b0bec5!important}.v-application .blue-grey--text.text--lighten-3{color:#b0bec5!important;caret-color:#b0bec5!important}.v-application .blue-grey.lighten-2{background-color:#90a4ae!important;border-color:#90a4ae!important}.v-application .blue-grey--text.text--lighten-2{color:#90a4ae!important;caret-color:#90a4ae!important}.v-application .blue-grey.lighten-1{background-color:#78909c!important;border-color:#78909c!important}.v-application .blue-grey--text.text--lighten-1{color:#78909c!important;caret-color:#78909c!important}.v-application .blue-grey.darken-1{background-color:#546e7a!important;border-color:#546e7a!important}.v-application .blue-grey--text.text--darken-1{color:#546e7a!important;caret-color:#546e7a!important}.v-application .blue-grey.darken-2{background-color:#455a64!important;border-color:#455a64!important}.v-application .blue-grey--text.text--darken-2{color:#455a64!important;caret-color:#455a64!important}.v-application .blue-grey.darken-3{background-color:#37474f!important;border-color:#37474f!important}.v-application .blue-grey--text.text--darken-3{color:#37474f!important;caret-color:#37474f!important}.v-application .blue-grey.darken-4{background-color:#263238!important;border-color:#263238!important}.v-application .blue-grey--text.text--darken-4{color:#263238!important;caret-color:#263238!important}.v-application .grey{background-color:#9e9e9e!important;border-color:#9e9e9e!important}.v-application .grey--text{color:#9e9e9e!important;caret-color:#9e9e9e!important}.v-application .grey.lighten-5{background-color:#fafafa!important;border-color:#fafafa!important}.v-application .grey--text.text--lighten-5{color:#fafafa!important;caret-color:#fafafa!important}.v-application .grey.lighten-4{background-color:#f5f5f5!important;border-color:#f5f5f5!important}.v-application .grey--text.text--lighten-4{color:#f5f5f5!important;caret-color:#f5f5f5!important}.v-application .grey.lighten-3{background-color:#eee!important;border-color:#eee!important}.v-application .grey--text.text--lighten-3{color:#eee!important;caret-color:#eee!important}.v-application .grey.lighten-2{background-color:#e0e0e0!important;border-color:#e0e0e0!important}.v-application .grey--text.text--lighten-2{color:#e0e0e0!important;caret-color:#e0e0e0!important}.v-application .grey.lighten-1{background-color:#bdbdbd!important;border-color:#bdbdbd!important}.v-application .grey--text.text--lighten-1{color:#bdbdbd!important;caret-color:#bdbdbd!important}.v-application .grey.darken-1{background-color:#757575!important;border-color:#757575!important}.v-application .grey--text.text--darken-1{color:#757575!important;caret-color:#757575!important}.v-application .grey.darken-2{background-color:#616161!important;border-color:#616161!important}.v-application .grey--text.text--darken-2{color:#616161!important;caret-color:#616161!important}.v-application .grey.darken-3{background-color:#424242!important;border-color:#424242!important}.v-application .grey--text.text--darken-3{color:#424242!important;caret-color:#424242!important}.v-application .grey.darken-4{background-color:#212121!important;border-color:#212121!important}.v-application .grey--text.text--darken-4{color:#212121!important;caret-color:#212121!important}.v-application .shades.black{background-color:#000!important;border-color:#000!important}.v-application .shades--text.text--black{color:#000!important;caret-color:#000!important}.v-application .shades.white{background-color:#fff!important;border-color:#fff!important}.v-application .shades--text.text--white{color:#fff!important;caret-color:#fff!important}.v-application .shades.transparent{background-color:transparent!important;border-color:transparent!important}.v-application .shades--text.text--transparent{color:transparent!important;caret-color:transparent!important}/*! - * ress.css • v2.0.4 - * MIT License - * github.com/filipelinhares/ress - */html{-webkit-box-sizing:border-box;box-sizing:border-box;overflow-y:scroll;-webkit-text-size-adjust:100%;word-break:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4}*,:after,:before{background-repeat:no-repeat;-webkit-box-sizing:inherit;box-sizing:inherit}:after,:before{text-decoration:inherit;vertical-align:inherit}*{padding:0;margin:0}hr{overflow:visible;height:0}details,main{display:block}summary{display:list-item}small{font-size:80%}[hidden]{display:none}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}a{background-color:transparent}a:active,a:hover{outline-width:0}code,kbd,pre,samp{font-family:monospace,monospace}pre{font-size:1em}b,strong{font-weight:bolder}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}input{border-radius:0}[disabled]{cursor:default}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}textarea{overflow:auto;resize:vertical}button,input,optgroup,select,textarea{font:inherit}optgroup{font-weight:700}button{overflow:visible}button,select{text-transform:none}[role=button],[type=button],[type=reset],[type=submit],button{cursor:pointer;color:inherit}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button:-moz-focusring{outline:1px dotted ButtonText}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}button,input,select,textarea{background-color:transparent;border-style:none}select{-moz-appearance:none;-webkit-appearance:none}select::-ms-expand{display:none}select::-ms-value{color:currentColor}legend{border:0;color:inherit;display:table;white-space:normal;max-width:100%}::-webkit-file-upload-button{-webkit-appearance:button;color:inherit;font:inherit}img{border-style:none}progress{vertical-align:baseline}@media screen{[hidden~=screen]{display:inherit}[hidden~=screen]:not(:active):not(:focus):not(:target){position:absolute!important;clip:rect(0 0 0 0)!important}}[aria-busy=true]{cursor:progress}[aria-controls]{cursor:pointer}[aria-disabled=true]{cursor:default}.v-application .elevation-24{-webkit-box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12)!important;box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12)!important}.v-application .elevation-23{-webkit-box-shadow:0 11px 14px -7px rgba(0,0,0,.2),0 23px 36px 3px rgba(0,0,0,.14),0 9px 44px 8px rgba(0,0,0,.12)!important;box-shadow:0 11px 14px -7px rgba(0,0,0,.2),0 23px 36px 3px rgba(0,0,0,.14),0 9px 44px 8px rgba(0,0,0,.12)!important}.v-application .elevation-22{-webkit-box-shadow:0 10px 14px -6px rgba(0,0,0,.2),0 22px 35px 3px rgba(0,0,0,.14),0 8px 42px 7px rgba(0,0,0,.12)!important;box-shadow:0 10px 14px -6px rgba(0,0,0,.2),0 22px 35px 3px rgba(0,0,0,.14),0 8px 42px 7px rgba(0,0,0,.12)!important}.v-application .elevation-21{-webkit-box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 21px 33px 3px rgba(0,0,0,.14),0 8px 40px 7px rgba(0,0,0,.12)!important;box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 21px 33px 3px rgba(0,0,0,.14),0 8px 40px 7px rgba(0,0,0,.12)!important}.v-application .elevation-20{-webkit-box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 20px 31px 3px rgba(0,0,0,.14),0 8px 38px 7px rgba(0,0,0,.12)!important;box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 20px 31px 3px rgba(0,0,0,.14),0 8px 38px 7px rgba(0,0,0,.12)!important}.v-application .elevation-19{-webkit-box-shadow:0 9px 12px -6px rgba(0,0,0,.2),0 19px 29px 2px rgba(0,0,0,.14),0 7px 36px 6px rgba(0,0,0,.12)!important;box-shadow:0 9px 12px -6px rgba(0,0,0,.2),0 19px 29px 2px rgba(0,0,0,.14),0 7px 36px 6px rgba(0,0,0,.12)!important}.v-application .elevation-18{-webkit-box-shadow:0 9px 11px -5px rgba(0,0,0,.2),0 18px 28px 2px rgba(0,0,0,.14),0 7px 34px 6px rgba(0,0,0,.12)!important;box-shadow:0 9px 11px -5px rgba(0,0,0,.2),0 18px 28px 2px rgba(0,0,0,.14),0 7px 34px 6px rgba(0,0,0,.12)!important}.v-application .elevation-17{-webkit-box-shadow:0 8px 11px -5px rgba(0,0,0,.2),0 17px 26px 2px rgba(0,0,0,.14),0 6px 32px 5px rgba(0,0,0,.12)!important;box-shadow:0 8px 11px -5px rgba(0,0,0,.2),0 17px 26px 2px rgba(0,0,0,.14),0 6px 32px 5px rgba(0,0,0,.12)!important}.v-application .elevation-16{-webkit-box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12)!important;box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12)!important}.v-application .elevation-15{-webkit-box-shadow:0 8px 9px -5px rgba(0,0,0,.2),0 15px 22px 2px rgba(0,0,0,.14),0 6px 28px 5px rgba(0,0,0,.12)!important;box-shadow:0 8px 9px -5px rgba(0,0,0,.2),0 15px 22px 2px rgba(0,0,0,.14),0 6px 28px 5px rgba(0,0,0,.12)!important}.v-application .elevation-14{-webkit-box-shadow:0 7px 9px -4px rgba(0,0,0,.2),0 14px 21px 2px rgba(0,0,0,.14),0 5px 26px 4px rgba(0,0,0,.12)!important;box-shadow:0 7px 9px -4px rgba(0,0,0,.2),0 14px 21px 2px rgba(0,0,0,.14),0 5px 26px 4px rgba(0,0,0,.12)!important}.v-application .elevation-13{-webkit-box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12)!important;box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12)!important}.v-application .elevation-12{-webkit-box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)!important;box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)!important}.v-application .elevation-11{-webkit-box-shadow:0 6px 7px -4px rgba(0,0,0,.2),0 11px 15px 1px rgba(0,0,0,.14),0 4px 20px 3px rgba(0,0,0,.12)!important;box-shadow:0 6px 7px -4px rgba(0,0,0,.2),0 11px 15px 1px rgba(0,0,0,.14),0 4px 20px 3px rgba(0,0,0,.12)!important}.v-application .elevation-10{-webkit-box-shadow:0 6px 6px -3px rgba(0,0,0,.2),0 10px 14px 1px rgba(0,0,0,.14),0 4px 18px 3px rgba(0,0,0,.12)!important;box-shadow:0 6px 6px -3px rgba(0,0,0,.2),0 10px 14px 1px rgba(0,0,0,.14),0 4px 18px 3px rgba(0,0,0,.12)!important}.v-application .elevation-9{-webkit-box-shadow:0 5px 6px -3px rgba(0,0,0,.2),0 9px 12px 1px rgba(0,0,0,.14),0 3px 16px 2px rgba(0,0,0,.12)!important;box-shadow:0 5px 6px -3px rgba(0,0,0,.2),0 9px 12px 1px rgba(0,0,0,.14),0 3px 16px 2px rgba(0,0,0,.12)!important}.v-application .elevation-8{-webkit-box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)!important;box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)!important}.v-application .elevation-7{-webkit-box-shadow:0 4px 5px -2px rgba(0,0,0,.2),0 7px 10px 1px rgba(0,0,0,.14),0 2px 16px 1px rgba(0,0,0,.12)!important;box-shadow:0 4px 5px -2px rgba(0,0,0,.2),0 7px 10px 1px rgba(0,0,0,.14),0 2px 16px 1px rgba(0,0,0,.12)!important}.v-application .elevation-6{-webkit-box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)!important;box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)!important}.v-application .elevation-5{-webkit-box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 5px 8px 0 rgba(0,0,0,.14),0 1px 14px 0 rgba(0,0,0,.12)!important;box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 5px 8px 0 rgba(0,0,0,.14),0 1px 14px 0 rgba(0,0,0,.12)!important}.v-application .elevation-4{-webkit-box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)!important;box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)!important}.v-application .elevation-3{-webkit-box-shadow:0 3px 3px -2px rgba(0,0,0,.2),0 3px 4px 0 rgba(0,0,0,.14),0 1px 8px 0 rgba(0,0,0,.12)!important;box-shadow:0 3px 3px -2px rgba(0,0,0,.2),0 3px 4px 0 rgba(0,0,0,.14),0 1px 8px 0 rgba(0,0,0,.12)!important}.v-application .elevation-2{-webkit-box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)!important;box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)!important}.v-application .elevation-1{-webkit-box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12)!important;box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12)!important}.v-application .elevation-0{-webkit-box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)!important;box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)!important}.v-application .carousel-transition-enter{-webkit-transform:translate(100%);transform:translate(100%)}.v-application .carousel-transition-leave,.v-application .carousel-transition-leave-to{position:absolute;top:0;-webkit-transform:translate(-100%);transform:translate(-100%)}.carousel-reverse-transition-enter{-webkit-transform:translate(-100%);transform:translate(-100%)}.carousel-reverse-transition-leave,.carousel-reverse-transition-leave-to{position:absolute;top:0;-webkit-transform:translate(100%);transform:translate(100%)}.dialog-transition-enter,.dialog-transition-leave-to{-webkit-transform:scale(.5);transform:scale(.5);opacity:0}.dialog-transition-enter-to,.dialog-transition-leave{opacity:1}.dialog-bottom-transition-enter,.dialog-bottom-transition-leave-to{-webkit-transform:translateY(100%);transform:translateY(100%)}.dialog-top-transition-enter,.dialog-top-transition-leave-to{-webkit-transform:translateY(-100%);transform:translateY(-100%)}.picker-reverse-transition-enter-active,.picker-reverse-transition-leave-active,.picker-transition-enter-active,.picker-transition-leave-active{-webkit-transition:.3s cubic-bezier(0,0,.2,1);transition:.3s cubic-bezier(0,0,.2,1)}.picker-reverse-transition-enter,.picker-reverse-transition-leave-to,.picker-transition-enter,.picker-transition-leave-to{opacity:0}.picker-reverse-transition-leave,.picker-reverse-transition-leave-active,.picker-reverse-transition-leave-to,.picker-transition-leave,.picker-transition-leave-active,.picker-transition-leave-to{position:absolute!important}.picker-transition-enter{-webkit-transform:translateY(100%);transform:translateY(100%)}.picker-reverse-transition-enter,.picker-transition-leave-to{-webkit-transform:translateY(-100%);transform:translateY(-100%)}.picker-reverse-transition-leave-to{-webkit-transform:translateY(100%);transform:translateY(100%)}.picker-title-transition-enter-to,.picker-title-transition-leave{-webkit-transform:translate(0);transform:translate(0)}.picker-title-transition-enter{-webkit-transform:translate(-100%);transform:translate(-100%)}.picker-title-transition-leave-to{opacity:0;-webkit-transform:translate(100%);transform:translate(100%)}.picker-title-transition-leave,.picker-title-transition-leave-active,.picker-title-transition-leave-to{position:absolute!important}.tab-transition-enter{-webkit-transform:translate(100%);transform:translate(100%)}.tab-transition-leave,.tab-transition-leave-active{position:absolute;top:0}.tab-transition-leave-to{position:absolute}.tab-reverse-transition-enter,.tab-transition-leave-to{-webkit-transform:translate(-100%);transform:translate(-100%)}.tab-reverse-transition-leave,.tab-reverse-transition-leave-to{top:0;position:absolute;-webkit-transform:translate(100%);transform:translate(100%)}.expand-transition-enter-active,.expand-transition-leave-active{-webkit-transition:.3s cubic-bezier(.25,.8,.5,1)!important;transition:.3s cubic-bezier(.25,.8,.5,1)!important}.expand-transition-move{-webkit-transition:-webkit-transform .6s;transition:-webkit-transform .6s;transition:transform .6s;transition:transform .6s,-webkit-transform .6s}.expand-x-transition-enter-active,.expand-x-transition-leave-active{-webkit-transition:.3s cubic-bezier(.25,.8,.5,1)!important;transition:.3s cubic-bezier(.25,.8,.5,1)!important}.expand-x-transition-move{-webkit-transition:-webkit-transform .6s;transition:-webkit-transform .6s;transition:transform .6s;transition:transform .6s,-webkit-transform .6s}.scale-transition-enter-active,.scale-transition-leave-active{-webkit-transition:.3s cubic-bezier(.25,.8,.5,1)!important;transition:.3s cubic-bezier(.25,.8,.5,1)!important}.scale-transition-move{-webkit-transition:-webkit-transform .6s;transition:-webkit-transform .6s;transition:transform .6s;transition:transform .6s,-webkit-transform .6s}.scale-transition-enter,.scale-transition-leave,.scale-transition-leave-to{opacity:0;-webkit-transform:scale(0);transform:scale(0)}.scale-rotate-transition-enter-active,.scale-rotate-transition-leave-active{-webkit-transition:.3s cubic-bezier(.25,.8,.5,1)!important;transition:.3s cubic-bezier(.25,.8,.5,1)!important}.scale-rotate-transition-move{-webkit-transition:-webkit-transform .6s;transition:-webkit-transform .6s;transition:transform .6s;transition:transform .6s,-webkit-transform .6s}.scale-rotate-transition-enter,.scale-rotate-transition-leave,.scale-rotate-transition-leave-to{opacity:0;-webkit-transform:scale(0) rotate(-45deg);transform:scale(0) rotate(-45deg)}.scale-rotate-reverse-transition-enter-active,.scale-rotate-reverse-transition-leave-active{-webkit-transition:.3s cubic-bezier(.25,.8,.5,1)!important;transition:.3s cubic-bezier(.25,.8,.5,1)!important}.scale-rotate-reverse-transition-move{-webkit-transition:-webkit-transform .6s;transition:-webkit-transform .6s;transition:transform .6s;transition:transform .6s,-webkit-transform .6s}.scale-rotate-reverse-transition-enter,.scale-rotate-reverse-transition-leave,.scale-rotate-reverse-transition-leave-to{opacity:0;-webkit-transform:scale(0) rotate(45deg);transform:scale(0) rotate(45deg)}.message-transition-enter-active,.message-transition-leave-active{-webkit-transition:.3s cubic-bezier(.25,.8,.5,1)!important;transition:.3s cubic-bezier(.25,.8,.5,1)!important}.message-transition-move{-webkit-transition:-webkit-transform .6s;transition:-webkit-transform .6s;transition:transform .6s;transition:transform .6s,-webkit-transform .6s}.message-transition-enter,.message-transition-leave-to{opacity:0;-webkit-transform:translateY(-15px);transform:translateY(-15px)}.message-transition-leave,.message-transition-leave-active{position:absolute}.slide-y-transition-enter-active,.slide-y-transition-leave-active{-webkit-transition:.3s cubic-bezier(.25,.8,.5,1)!important;transition:.3s cubic-bezier(.25,.8,.5,1)!important}.slide-y-transition-move{-webkit-transition:-webkit-transform .6s;transition:-webkit-transform .6s;transition:transform .6s;transition:transform .6s,-webkit-transform .6s}.slide-y-transition-enter,.slide-y-transition-leave-to{opacity:0;-webkit-transform:translateY(-15px);transform:translateY(-15px)}.slide-y-reverse-transition-enter-active,.slide-y-reverse-transition-leave-active{-webkit-transition:.3s cubic-bezier(.25,.8,.5,1)!important;transition:.3s cubic-bezier(.25,.8,.5,1)!important}.slide-y-reverse-transition-move{-webkit-transition:-webkit-transform .6s;transition:-webkit-transform .6s;transition:transform .6s;transition:transform .6s,-webkit-transform .6s}.slide-y-reverse-transition-enter,.slide-y-reverse-transition-leave-to{opacity:0;-webkit-transform:translateY(15px);transform:translateY(15px)}.scroll-y-transition-enter-active,.scroll-y-transition-leave-active{-webkit-transition:.3s cubic-bezier(.25,.8,.5,1)!important;transition:.3s cubic-bezier(.25,.8,.5,1)!important}.scroll-y-transition-move{-webkit-transition:-webkit-transform .6s;transition:-webkit-transform .6s;transition:transform .6s;transition:transform .6s,-webkit-transform .6s}.scroll-y-transition-enter,.scroll-y-transition-leave-to{opacity:0}.scroll-y-transition-enter{-webkit-transform:translateY(-15px);transform:translateY(-15px)}.scroll-y-transition-leave-to{-webkit-transform:translateY(15px);transform:translateY(15px)}.scroll-y-reverse-transition-enter-active,.scroll-y-reverse-transition-leave-active{-webkit-transition:.3s cubic-bezier(.25,.8,.5,1)!important;transition:.3s cubic-bezier(.25,.8,.5,1)!important}.scroll-y-reverse-transition-move{-webkit-transition:-webkit-transform .6s;transition:-webkit-transform .6s;transition:transform .6s;transition:transform .6s,-webkit-transform .6s}.scroll-y-reverse-transition-enter,.scroll-y-reverse-transition-leave-to{opacity:0}.scroll-y-reverse-transition-enter{-webkit-transform:translateY(15px);transform:translateY(15px)}.scroll-y-reverse-transition-leave-to{-webkit-transform:translateY(-15px);transform:translateY(-15px)}.scroll-x-transition-enter-active,.scroll-x-transition-leave-active{-webkit-transition:.3s cubic-bezier(.25,.8,.5,1)!important;transition:.3s cubic-bezier(.25,.8,.5,1)!important}.scroll-x-transition-move{-webkit-transition:-webkit-transform .6s;transition:-webkit-transform .6s;transition:transform .6s;transition:transform .6s,-webkit-transform .6s}.scroll-x-transition-enter,.scroll-x-transition-leave-to{opacity:0}.scroll-x-transition-enter{-webkit-transform:translateX(-15px);transform:translateX(-15px)}.scroll-x-transition-leave-to{-webkit-transform:translateX(15px);transform:translateX(15px)}.scroll-x-reverse-transition-enter-active,.scroll-x-reverse-transition-leave-active{-webkit-transition:.3s cubic-bezier(.25,.8,.5,1)!important;transition:.3s cubic-bezier(.25,.8,.5,1)!important}.scroll-x-reverse-transition-move{-webkit-transition:-webkit-transform .6s;transition:-webkit-transform .6s;transition:transform .6s;transition:transform .6s,-webkit-transform .6s}.scroll-x-reverse-transition-enter,.scroll-x-reverse-transition-leave-to{opacity:0}.scroll-x-reverse-transition-enter{-webkit-transform:translateX(15px);transform:translateX(15px)}.scroll-x-reverse-transition-leave-to{-webkit-transform:translateX(-15px);transform:translateX(-15px)}.slide-x-transition-enter-active,.slide-x-transition-leave-active{-webkit-transition:.3s cubic-bezier(.25,.8,.5,1)!important;transition:.3s cubic-bezier(.25,.8,.5,1)!important}.slide-x-transition-move{-webkit-transition:-webkit-transform .6s;transition:-webkit-transform .6s;transition:transform .6s;transition:transform .6s,-webkit-transform .6s}.slide-x-transition-enter,.slide-x-transition-leave-to{opacity:0;-webkit-transform:translateX(-15px);transform:translateX(-15px)}.slide-x-reverse-transition-enter-active,.slide-x-reverse-transition-leave-active{-webkit-transition:.3s cubic-bezier(.25,.8,.5,1)!important;transition:.3s cubic-bezier(.25,.8,.5,1)!important}.slide-x-reverse-transition-move{-webkit-transition:-webkit-transform .6s;transition:-webkit-transform .6s;transition:transform .6s;transition:transform .6s,-webkit-transform .6s}.slide-x-reverse-transition-enter,.slide-x-reverse-transition-leave-to{opacity:0;-webkit-transform:translateX(15px);transform:translateX(15px)}.fade-transition-enter-active,.fade-transition-leave-active{-webkit-transition:.3s cubic-bezier(.25,.8,.5,1)!important;transition:.3s cubic-bezier(.25,.8,.5,1)!important}.fade-transition-move{-webkit-transition:-webkit-transform .6s;transition:-webkit-transform .6s;transition:transform .6s;transition:transform .6s,-webkit-transform .6s}.fade-transition-enter,.fade-transition-leave-to{opacity:0!important}.fab-transition-enter-active,.fab-transition-leave-active{-webkit-transition:.3s cubic-bezier(.25,.8,.5,1)!important;transition:.3s cubic-bezier(.25,.8,.5,1)!important}.fab-transition-move{-webkit-transition:-webkit-transform .6s;transition:-webkit-transform .6s;transition:transform .6s;transition:transform .6s,-webkit-transform .6s}.fab-transition-enter,.fab-transition-leave-to{-webkit-transform:scale(0) rotate(-45deg);transform:scale(0) rotate(-45deg)}.v-application .blockquote{padding:16px 0 16px 24px;font-size:18px;font-weight:300}.v-application code,.v-application kbd{border-radius:3px;font-size:85%;font-weight:400}.v-application code{padding:.2em .4em}.v-application kbd{padding:.2em .4rem;-webkit-box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12);box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.theme--light.v-application code{background-color:rgba(0,0,0,.05);color:currentColor}.theme--light.v-application kbd{background:#212529;color:#fff}.theme--dark.v-application code{background-color:hsla(0,0%,100%,.1);color:currentColor}.theme--dark.v-application kbd{background:#212529;color:#fff}html{font-size:16px;overflow-x:hidden;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-tap-highlight-color:rgba(0,0,0,0)}html.overflow-y-hidden{overflow-y:hidden!important}.v-application{font-family:Roboto,sans-serif;line-height:1.5}.v-application ::-ms-clear,.v-application ::-ms-reveal{display:none}@supports(-webkit-touch-callout:none){body{cursor:pointer}}.v-application .theme--light.heading{color:rgba(0,0,0,.87)}.v-application .theme--dark.heading{color:#fff}.v-application ol,.v-application ul{padding-left:24px}.v-application .display-4{font-size:6rem!important;line-height:6rem;letter-spacing:-.015625em!important}.v-application .display-3,.v-application .display-4{font-weight:300;font-family:Roboto,sans-serif!important}.v-application .display-3{font-size:3.75rem!important;line-height:3.75rem;letter-spacing:-.0083333333em!important}.v-application .display-2{font-size:3rem!important;line-height:3.125rem;letter-spacing:normal!important}.v-application .display-1,.v-application .display-2{font-weight:400;font-family:Roboto,sans-serif!important}.v-application .display-1{font-size:2.125rem!important;line-height:2.5rem;letter-spacing:.0073529412em!important}.v-application .headline{font-size:1.5rem!important;font-weight:400;letter-spacing:normal!important}.v-application .headline,.v-application .title{line-height:2rem;font-family:Roboto,sans-serif!important}.v-application .title{font-size:1.25rem!important;font-weight:500;letter-spacing:.0125em!important}.v-application .subtitle-2{font-size:.875rem!important;font-weight:500;letter-spacing:.0071428571em!important;line-height:1.375rem;font-family:Roboto,sans-serif!important}.v-application .subtitle-1{font-size:1rem!important;letter-spacing:.009375em!important;line-height:1.75rem}.v-application .body-2,.v-application .subtitle-1{font-weight:400;font-family:Roboto,sans-serif!important}.v-application .body-2{font-size:.875rem!important;letter-spacing:.0178571429em!important;line-height:1.25rem}.v-application .body-1{font-size:1rem!important;letter-spacing:.03125em!important;line-height:1.5rem}.v-application .body-1,.v-application .caption{font-weight:400;font-family:Roboto,sans-serif!important}.v-application .caption{font-size:.75rem!important;letter-spacing:.0333333333em!important;line-height:1.25rem}.v-application .overline{font-size:.75rem!important;font-weight:500;letter-spacing:.1666666667em!important;line-height:2rem;text-transform:uppercase;font-family:Roboto,sans-serif!important}.v-application p{margin-bottom:16px}@media only print{.v-application .hidden-print-only{display:none!important}}@media only screen{.v-application .hidden-screen-only{display:none!important}}@media only screen and (max-width:599px){.v-application .hidden-xs-only{display:none!important}}@media only screen and (min-width:600px)and (max-width:959px){.v-application .hidden-sm-only{display:none!important}}@media only screen and (max-width:959px){.v-application .hidden-sm-and-down{display:none!important}}@media only screen and (min-width:600px){.v-application .hidden-sm-and-up{display:none!important}}@media only screen and (min-width:960px)and (max-width:1263px){.v-application .hidden-md-only{display:none!important}}@media only screen and (max-width:1263px){.v-application .hidden-md-and-down{display:none!important}}@media only screen and (min-width:960px){.v-application .hidden-md-and-up{display:none!important}}@media only screen and (min-width:1264px)and (max-width:1903px){.v-application .hidden-lg-only{display:none!important}}@media only screen and (max-width:1903px){.v-application .hidden-lg-and-down{display:none!important}}@media only screen and (min-width:1264px){.v-application .hidden-lg-and-up{display:none!important}}@media only screen and (min-width:1904px){.v-application .hidden-xl-only{display:none!important}}.d-sr-only,.d-sr-only-focusable:not(:focus){border:0!important;clip:rect(0,0,0,0)!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.v-application .font-weight-thin{font-weight:100!important}.v-application .font-weight-light{font-weight:300!important}.v-application .font-weight-regular{font-weight:400!important}.v-application .font-weight-medium{font-weight:500!important}.v-application .font-weight-bold{font-weight:700!important}.v-application .font-weight-black{font-weight:900!important}.v-application .font-italic{font-style:italic!important}.v-application .transition-fast-out-slow-in{-webkit-transition:.3s cubic-bezier(.4,0,.2,1)!important;transition:.3s cubic-bezier(.4,0,.2,1)!important}.v-application .transition-linear-out-slow-in{-webkit-transition:.3s cubic-bezier(0,0,.2,1)!important;transition:.3s cubic-bezier(0,0,.2,1)!important}.v-application .transition-fast-out-linear-in{-webkit-transition:.3s cubic-bezier(.4,0,1,1)!important;transition:.3s cubic-bezier(.4,0,1,1)!important}.v-application .transition-ease-in-out{-webkit-transition:.3s cubic-bezier(.4,0,.6,1)!important;transition:.3s cubic-bezier(.4,0,.6,1)!important}.v-application .transition-fast-in-fast-out{-webkit-transition:.3s cubic-bezier(.25,.8,.25,1)!important;transition:.3s cubic-bezier(.25,.8,.25,1)!important}.v-application .transition-swing{-webkit-transition:.3s cubic-bezier(.25,.8,.5,1)!important;transition:.3s cubic-bezier(.25,.8,.5,1)!important}.v-application .overflow-auto{overflow:auto!important}.v-application .overflow-hidden{overflow:hidden!important}.v-application .overflow-visible{overflow:visible!important}.v-application .overflow-x-auto{overflow-x:auto!important}.v-application .overflow-x-hidden{overflow-x:hidden!important}.v-application .overflow-y-auto{overflow-y:auto!important}.v-application .overflow-y-hidden{overflow-y:hidden!important}.v-application .d-none{display:none!important}.v-application .d-inline{display:inline!important}.v-application .d-inline-block{display:inline-block!important}.v-application .d-block{display:block!important}.v-application .d-table{display:table!important}.v-application .d-table-row{display:table-row!important}.v-application .d-table-cell{display:table-cell!important}.v-application .d-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.v-application .d-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}.v-application .float-none{float:none!important}.v-application .float-left{float:left!important}.v-application .float-right{float:right!important}.v-application--is-rtl .float-end{float:left!important}.v-application--is-ltr .float-end,.v-application--is-rtl .float-start{float:right!important}.v-application--is-ltr .float-start{float:left!important}.v-application .flex-fill{-webkit-box-flex:1!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.v-application .flex-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.v-application .flex-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.v-application .flex-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.v-application .flex-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.v-application .flex-grow-0{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.v-application .flex-grow-1{-webkit-box-flex:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.v-application .flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.v-application .flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.v-application .flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.v-application .flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.v-application .flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.v-application .justify-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.v-application .justify-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.v-application .justify-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.v-application .justify-space-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.v-application .justify-space-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.v-application .align-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.v-application .align-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.v-application .align-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.v-application .align-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.v-application .align-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.v-application .align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.v-application .align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.v-application .align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.v-application .align-content-space-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.v-application .align-content-space-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.v-application .align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.v-application .align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.v-application .align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.v-application .align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.v-application .align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.v-application .align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.v-application .align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}.v-application .order-first{-webkit-box-ordinal-group:0!important;-ms-flex-order:-1!important;order:-1!important}.v-application .order-0{-webkit-box-ordinal-group:1!important;-ms-flex-order:0!important;order:0!important}.v-application .order-1{-webkit-box-ordinal-group:2!important;-ms-flex-order:1!important;order:1!important}.v-application .order-2{-webkit-box-ordinal-group:3!important;-ms-flex-order:2!important;order:2!important}.v-application .order-3{-webkit-box-ordinal-group:4!important;-ms-flex-order:3!important;order:3!important}.v-application .order-4{-webkit-box-ordinal-group:5!important;-ms-flex-order:4!important;order:4!important}.v-application .order-5{-webkit-box-ordinal-group:6!important;-ms-flex-order:5!important;order:5!important}.v-application .order-6{-webkit-box-ordinal-group:7!important;-ms-flex-order:6!important;order:6!important}.v-application .order-7{-webkit-box-ordinal-group:8!important;-ms-flex-order:7!important;order:7!important}.v-application .order-8{-webkit-box-ordinal-group:9!important;-ms-flex-order:8!important;order:8!important}.v-application .order-9{-webkit-box-ordinal-group:10!important;-ms-flex-order:9!important;order:9!important}.v-application .order-10{-webkit-box-ordinal-group:11!important;-ms-flex-order:10!important;order:10!important}.v-application .order-11{-webkit-box-ordinal-group:12!important;-ms-flex-order:11!important;order:11!important}.v-application .order-12{-webkit-box-ordinal-group:13!important;-ms-flex-order:12!important;order:12!important}.v-application .order-last{-webkit-box-ordinal-group:14!important;-ms-flex-order:13!important;order:13!important}.v-application .ma-0{margin:0!important}.v-application .ma-1{margin:4px!important}.v-application .ma-2{margin:8px!important}.v-application .ma-3{margin:12px!important}.v-application .ma-4{margin:16px!important}.v-application .ma-5{margin:20px!important}.v-application .ma-6{margin:24px!important}.v-application .ma-7{margin:28px!important}.v-application .ma-8{margin:32px!important}.v-application .ma-9{margin:36px!important}.v-application .ma-10{margin:40px!important}.v-application .ma-11{margin:44px!important}.v-application .ma-12{margin:48px!important}.v-application .ma-13{margin:52px!important}.v-application .ma-14{margin:56px!important}.v-application .ma-15{margin:60px!important}.v-application .ma-16{margin:64px!important}.v-application .ma-auto{margin:auto!important}.v-application .mx-0{margin-right:0!important;margin-left:0!important}.v-application .mx-1{margin-right:4px!important;margin-left:4px!important}.v-application .mx-2{margin-right:8px!important;margin-left:8px!important}.v-application .mx-3{margin-right:12px!important;margin-left:12px!important}.v-application .mx-4{margin-right:16px!important;margin-left:16px!important}.v-application .mx-5{margin-right:20px!important;margin-left:20px!important}.v-application .mx-6{margin-right:24px!important;margin-left:24px!important}.v-application .mx-7{margin-right:28px!important;margin-left:28px!important}.v-application .mx-8{margin-right:32px!important;margin-left:32px!important}.v-application .mx-9{margin-right:36px!important;margin-left:36px!important}.v-application .mx-10{margin-right:40px!important;margin-left:40px!important}.v-application .mx-11{margin-right:44px!important;margin-left:44px!important}.v-application .mx-12{margin-right:48px!important;margin-left:48px!important}.v-application .mx-13{margin-right:52px!important;margin-left:52px!important}.v-application .mx-14{margin-right:56px!important;margin-left:56px!important}.v-application .mx-15{margin-right:60px!important;margin-left:60px!important}.v-application .mx-16{margin-right:64px!important;margin-left:64px!important}.v-application .mx-auto{margin-right:auto!important;margin-left:auto!important}.v-application .my-0{margin-top:0!important;margin-bottom:0!important}.v-application .my-1{margin-top:4px!important;margin-bottom:4px!important}.v-application .my-2{margin-top:8px!important;margin-bottom:8px!important}.v-application .my-3{margin-top:12px!important;margin-bottom:12px!important}.v-application .my-4{margin-top:16px!important;margin-bottom:16px!important}.v-application .my-5{margin-top:20px!important;margin-bottom:20px!important}.v-application .my-6{margin-top:24px!important;margin-bottom:24px!important}.v-application .my-7{margin-top:28px!important;margin-bottom:28px!important}.v-application .my-8{margin-top:32px!important;margin-bottom:32px!important}.v-application .my-9{margin-top:36px!important;margin-bottom:36px!important}.v-application .my-10{margin-top:40px!important;margin-bottom:40px!important}.v-application .my-11{margin-top:44px!important;margin-bottom:44px!important}.v-application .my-12{margin-top:48px!important;margin-bottom:48px!important}.v-application .my-13{margin-top:52px!important;margin-bottom:52px!important}.v-application .my-14{margin-top:56px!important;margin-bottom:56px!important}.v-application .my-15{margin-top:60px!important;margin-bottom:60px!important}.v-application .my-16{margin-top:64px!important;margin-bottom:64px!important}.v-application .my-auto{margin-top:auto!important;margin-bottom:auto!important}.v-application .mt-0{margin-top:0!important}.v-application .mt-1{margin-top:4px!important}.v-application .mt-2{margin-top:8px!important}.v-application .mt-3{margin-top:12px!important}.v-application .mt-4{margin-top:16px!important}.v-application .mt-5{margin-top:20px!important}.v-application .mt-6{margin-top:24px!important}.v-application .mt-7{margin-top:28px!important}.v-application .mt-8{margin-top:32px!important}.v-application .mt-9{margin-top:36px!important}.v-application .mt-10{margin-top:40px!important}.v-application .mt-11{margin-top:44px!important}.v-application .mt-12{margin-top:48px!important}.v-application .mt-13{margin-top:52px!important}.v-application .mt-14{margin-top:56px!important}.v-application .mt-15{margin-top:60px!important}.v-application .mt-16{margin-top:64px!important}.v-application .mt-auto{margin-top:auto!important}.v-application .mr-0{margin-right:0!important}.v-application .mr-1{margin-right:4px!important}.v-application .mr-2{margin-right:8px!important}.v-application .mr-3{margin-right:12px!important}.v-application .mr-4{margin-right:16px!important}.v-application .mr-5{margin-right:20px!important}.v-application .mr-6{margin-right:24px!important}.v-application .mr-7{margin-right:28px!important}.v-application .mr-8{margin-right:32px!important}.v-application .mr-9{margin-right:36px!important}.v-application .mr-10{margin-right:40px!important}.v-application .mr-11{margin-right:44px!important}.v-application .mr-12{margin-right:48px!important}.v-application .mr-13{margin-right:52px!important}.v-application .mr-14{margin-right:56px!important}.v-application .mr-15{margin-right:60px!important}.v-application .mr-16{margin-right:64px!important}.v-application .mr-auto{margin-right:auto!important}.v-application .mb-0{margin-bottom:0!important}.v-application .mb-1{margin-bottom:4px!important}.v-application .mb-2{margin-bottom:8px!important}.v-application .mb-3{margin-bottom:12px!important}.v-application .mb-4{margin-bottom:16px!important}.v-application .mb-5{margin-bottom:20px!important}.v-application .mb-6{margin-bottom:24px!important}.v-application .mb-7{margin-bottom:28px!important}.v-application .mb-8{margin-bottom:32px!important}.v-application .mb-9{margin-bottom:36px!important}.v-application .mb-10{margin-bottom:40px!important}.v-application .mb-11{margin-bottom:44px!important}.v-application .mb-12{margin-bottom:48px!important}.v-application .mb-13{margin-bottom:52px!important}.v-application .mb-14{margin-bottom:56px!important}.v-application .mb-15{margin-bottom:60px!important}.v-application .mb-16{margin-bottom:64px!important}.v-application .mb-auto{margin-bottom:auto!important}.v-application .ml-0{margin-left:0!important}.v-application .ml-1{margin-left:4px!important}.v-application .ml-2{margin-left:8px!important}.v-application .ml-3{margin-left:12px!important}.v-application .ml-4{margin-left:16px!important}.v-application .ml-5{margin-left:20px!important}.v-application .ml-6{margin-left:24px!important}.v-application .ml-7{margin-left:28px!important}.v-application .ml-8{margin-left:32px!important}.v-application .ml-9{margin-left:36px!important}.v-application .ml-10{margin-left:40px!important}.v-application .ml-11{margin-left:44px!important}.v-application .ml-12{margin-left:48px!important}.v-application .ml-13{margin-left:52px!important}.v-application .ml-14{margin-left:56px!important}.v-application .ml-15{margin-left:60px!important}.v-application .ml-16{margin-left:64px!important}.v-application .ml-auto{margin-left:auto!important}.v-application--is-ltr .ms-0{margin-left:0!important}.v-application--is-rtl .ms-0{margin-right:0!important}.v-application--is-ltr .ms-1{margin-left:4px!important}.v-application--is-rtl .ms-1{margin-right:4px!important}.v-application--is-ltr .ms-2{margin-left:8px!important}.v-application--is-rtl .ms-2{margin-right:8px!important}.v-application--is-ltr .ms-3{margin-left:12px!important}.v-application--is-rtl .ms-3{margin-right:12px!important}.v-application--is-ltr .ms-4{margin-left:16px!important}.v-application--is-rtl .ms-4{margin-right:16px!important}.v-application--is-ltr .ms-5{margin-left:20px!important}.v-application--is-rtl .ms-5{margin-right:20px!important}.v-application--is-ltr .ms-6{margin-left:24px!important}.v-application--is-rtl .ms-6{margin-right:24px!important}.v-application--is-ltr .ms-7{margin-left:28px!important}.v-application--is-rtl .ms-7{margin-right:28px!important}.v-application--is-ltr .ms-8{margin-left:32px!important}.v-application--is-rtl .ms-8{margin-right:32px!important}.v-application--is-ltr .ms-9{margin-left:36px!important}.v-application--is-rtl .ms-9{margin-right:36px!important}.v-application--is-ltr .ms-10{margin-left:40px!important}.v-application--is-rtl .ms-10{margin-right:40px!important}.v-application--is-ltr .ms-11{margin-left:44px!important}.v-application--is-rtl .ms-11{margin-right:44px!important}.v-application--is-ltr .ms-12{margin-left:48px!important}.v-application--is-rtl .ms-12{margin-right:48px!important}.v-application--is-ltr .ms-13{margin-left:52px!important}.v-application--is-rtl .ms-13{margin-right:52px!important}.v-application--is-ltr .ms-14{margin-left:56px!important}.v-application--is-rtl .ms-14{margin-right:56px!important}.v-application--is-ltr .ms-15{margin-left:60px!important}.v-application--is-rtl .ms-15{margin-right:60px!important}.v-application--is-ltr .ms-16{margin-left:64px!important}.v-application--is-rtl .ms-16{margin-right:64px!important}.v-application--is-ltr .ms-auto{margin-left:auto!important}.v-application--is-rtl .ms-auto{margin-right:auto!important}.v-application--is-ltr .me-0{margin-right:0!important}.v-application--is-rtl .me-0{margin-left:0!important}.v-application--is-ltr .me-1{margin-right:4px!important}.v-application--is-rtl .me-1{margin-left:4px!important}.v-application--is-ltr .me-2{margin-right:8px!important}.v-application--is-rtl .me-2{margin-left:8px!important}.v-application--is-ltr .me-3{margin-right:12px!important}.v-application--is-rtl .me-3{margin-left:12px!important}.v-application--is-ltr .me-4{margin-right:16px!important}.v-application--is-rtl .me-4{margin-left:16px!important}.v-application--is-ltr .me-5{margin-right:20px!important}.v-application--is-rtl .me-5{margin-left:20px!important}.v-application--is-ltr .me-6{margin-right:24px!important}.v-application--is-rtl .me-6{margin-left:24px!important}.v-application--is-ltr .me-7{margin-right:28px!important}.v-application--is-rtl .me-7{margin-left:28px!important}.v-application--is-ltr .me-8{margin-right:32px!important}.v-application--is-rtl .me-8{margin-left:32px!important}.v-application--is-ltr .me-9{margin-right:36px!important}.v-application--is-rtl .me-9{margin-left:36px!important}.v-application--is-ltr .me-10{margin-right:40px!important}.v-application--is-rtl .me-10{margin-left:40px!important}.v-application--is-ltr .me-11{margin-right:44px!important}.v-application--is-rtl .me-11{margin-left:44px!important}.v-application--is-ltr .me-12{margin-right:48px!important}.v-application--is-rtl .me-12{margin-left:48px!important}.v-application--is-ltr .me-13{margin-right:52px!important}.v-application--is-rtl .me-13{margin-left:52px!important}.v-application--is-ltr .me-14{margin-right:56px!important}.v-application--is-rtl .me-14{margin-left:56px!important}.v-application--is-ltr .me-15{margin-right:60px!important}.v-application--is-rtl .me-15{margin-left:60px!important}.v-application--is-ltr .me-16{margin-right:64px!important}.v-application--is-rtl .me-16{margin-left:64px!important}.v-application--is-ltr .me-auto{margin-right:auto!important}.v-application--is-rtl .me-auto{margin-left:auto!important}.v-application .ma-n1{margin:-4px!important}.v-application .ma-n2{margin:-8px!important}.v-application .ma-n3{margin:-12px!important}.v-application .ma-n4{margin:-16px!important}.v-application .ma-n5{margin:-20px!important}.v-application .ma-n6{margin:-24px!important}.v-application .ma-n7{margin:-28px!important}.v-application .ma-n8{margin:-32px!important}.v-application .ma-n9{margin:-36px!important}.v-application .ma-n10{margin:-40px!important}.v-application .ma-n11{margin:-44px!important}.v-application .ma-n12{margin:-48px!important}.v-application .ma-n13{margin:-52px!important}.v-application .ma-n14{margin:-56px!important}.v-application .ma-n15{margin:-60px!important}.v-application .ma-n16{margin:-64px!important}.v-application .mx-n1{margin-right:-4px!important;margin-left:-4px!important}.v-application .mx-n2{margin-right:-8px!important;margin-left:-8px!important}.v-application .mx-n3{margin-right:-12px!important;margin-left:-12px!important}.v-application .mx-n4{margin-right:-16px!important;margin-left:-16px!important}.v-application .mx-n5{margin-right:-20px!important;margin-left:-20px!important}.v-application .mx-n6{margin-right:-24px!important;margin-left:-24px!important}.v-application .mx-n7{margin-right:-28px!important;margin-left:-28px!important}.v-application .mx-n8{margin-right:-32px!important;margin-left:-32px!important}.v-application .mx-n9{margin-right:-36px!important;margin-left:-36px!important}.v-application .mx-n10{margin-right:-40px!important;margin-left:-40px!important}.v-application .mx-n11{margin-right:-44px!important;margin-left:-44px!important}.v-application .mx-n12{margin-right:-48px!important;margin-left:-48px!important}.v-application .mx-n13{margin-right:-52px!important;margin-left:-52px!important}.v-application .mx-n14{margin-right:-56px!important;margin-left:-56px!important}.v-application .mx-n15{margin-right:-60px!important;margin-left:-60px!important}.v-application .mx-n16{margin-right:-64px!important;margin-left:-64px!important}.v-application .my-n1{margin-top:-4px!important;margin-bottom:-4px!important}.v-application .my-n2{margin-top:-8px!important;margin-bottom:-8px!important}.v-application .my-n3{margin-top:-12px!important;margin-bottom:-12px!important}.v-application .my-n4{margin-top:-16px!important;margin-bottom:-16px!important}.v-application .my-n5{margin-top:-20px!important;margin-bottom:-20px!important}.v-application .my-n6{margin-top:-24px!important;margin-bottom:-24px!important}.v-application .my-n7{margin-top:-28px!important;margin-bottom:-28px!important}.v-application .my-n8{margin-top:-32px!important;margin-bottom:-32px!important}.v-application .my-n9{margin-top:-36px!important;margin-bottom:-36px!important}.v-application .my-n10{margin-top:-40px!important;margin-bottom:-40px!important}.v-application .my-n11{margin-top:-44px!important;margin-bottom:-44px!important}.v-application .my-n12{margin-top:-48px!important;margin-bottom:-48px!important}.v-application .my-n13{margin-top:-52px!important;margin-bottom:-52px!important}.v-application .my-n14{margin-top:-56px!important;margin-bottom:-56px!important}.v-application .my-n15{margin-top:-60px!important;margin-bottom:-60px!important}.v-application .my-n16{margin-top:-64px!important;margin-bottom:-64px!important}.v-application .mt-n1{margin-top:-4px!important}.v-application .mt-n2{margin-top:-8px!important}.v-application .mt-n3{margin-top:-12px!important}.v-application .mt-n4{margin-top:-16px!important}.v-application .mt-n5{margin-top:-20px!important}.v-application .mt-n6{margin-top:-24px!important}.v-application .mt-n7{margin-top:-28px!important}.v-application .mt-n8{margin-top:-32px!important}.v-application .mt-n9{margin-top:-36px!important}.v-application .mt-n10{margin-top:-40px!important}.v-application .mt-n11{margin-top:-44px!important}.v-application .mt-n12{margin-top:-48px!important}.v-application .mt-n13{margin-top:-52px!important}.v-application .mt-n14{margin-top:-56px!important}.v-application .mt-n15{margin-top:-60px!important}.v-application .mt-n16{margin-top:-64px!important}.v-application .mr-n1{margin-right:-4px!important}.v-application .mr-n2{margin-right:-8px!important}.v-application .mr-n3{margin-right:-12px!important}.v-application .mr-n4{margin-right:-16px!important}.v-application .mr-n5{margin-right:-20px!important}.v-application .mr-n6{margin-right:-24px!important}.v-application .mr-n7{margin-right:-28px!important}.v-application .mr-n8{margin-right:-32px!important}.v-application .mr-n9{margin-right:-36px!important}.v-application .mr-n10{margin-right:-40px!important}.v-application .mr-n11{margin-right:-44px!important}.v-application .mr-n12{margin-right:-48px!important}.v-application .mr-n13{margin-right:-52px!important}.v-application .mr-n14{margin-right:-56px!important}.v-application .mr-n15{margin-right:-60px!important}.v-application .mr-n16{margin-right:-64px!important}.v-application .mb-n1{margin-bottom:-4px!important}.v-application .mb-n2{margin-bottom:-8px!important}.v-application .mb-n3{margin-bottom:-12px!important}.v-application .mb-n4{margin-bottom:-16px!important}.v-application .mb-n5{margin-bottom:-20px!important}.v-application .mb-n6{margin-bottom:-24px!important}.v-application .mb-n7{margin-bottom:-28px!important}.v-application .mb-n8{margin-bottom:-32px!important}.v-application .mb-n9{margin-bottom:-36px!important}.v-application .mb-n10{margin-bottom:-40px!important}.v-application .mb-n11{margin-bottom:-44px!important}.v-application .mb-n12{margin-bottom:-48px!important}.v-application .mb-n13{margin-bottom:-52px!important}.v-application .mb-n14{margin-bottom:-56px!important}.v-application .mb-n15{margin-bottom:-60px!important}.v-application .mb-n16{margin-bottom:-64px!important}.v-application .ml-n1{margin-left:-4px!important}.v-application .ml-n2{margin-left:-8px!important}.v-application .ml-n3{margin-left:-12px!important}.v-application .ml-n4{margin-left:-16px!important}.v-application .ml-n5{margin-left:-20px!important}.v-application .ml-n6{margin-left:-24px!important}.v-application .ml-n7{margin-left:-28px!important}.v-application .ml-n8{margin-left:-32px!important}.v-application .ml-n9{margin-left:-36px!important}.v-application .ml-n10{margin-left:-40px!important}.v-application .ml-n11{margin-left:-44px!important}.v-application .ml-n12{margin-left:-48px!important}.v-application .ml-n13{margin-left:-52px!important}.v-application .ml-n14{margin-left:-56px!important}.v-application .ml-n15{margin-left:-60px!important}.v-application .ml-n16{margin-left:-64px!important}.v-application--is-ltr .ms-n1{margin-left:-4px!important}.v-application--is-rtl .ms-n1{margin-right:-4px!important}.v-application--is-ltr .ms-n2{margin-left:-8px!important}.v-application--is-rtl .ms-n2{margin-right:-8px!important}.v-application--is-ltr .ms-n3{margin-left:-12px!important}.v-application--is-rtl .ms-n3{margin-right:-12px!important}.v-application--is-ltr .ms-n4{margin-left:-16px!important}.v-application--is-rtl .ms-n4{margin-right:-16px!important}.v-application--is-ltr .ms-n5{margin-left:-20px!important}.v-application--is-rtl .ms-n5{margin-right:-20px!important}.v-application--is-ltr .ms-n6{margin-left:-24px!important}.v-application--is-rtl .ms-n6{margin-right:-24px!important}.v-application--is-ltr .ms-n7{margin-left:-28px!important}.v-application--is-rtl .ms-n7{margin-right:-28px!important}.v-application--is-ltr .ms-n8{margin-left:-32px!important}.v-application--is-rtl .ms-n8{margin-right:-32px!important}.v-application--is-ltr .ms-n9{margin-left:-36px!important}.v-application--is-rtl .ms-n9{margin-right:-36px!important}.v-application--is-ltr .ms-n10{margin-left:-40px!important}.v-application--is-rtl .ms-n10{margin-right:-40px!important}.v-application--is-ltr .ms-n11{margin-left:-44px!important}.v-application--is-rtl .ms-n11{margin-right:-44px!important}.v-application--is-ltr .ms-n12{margin-left:-48px!important}.v-application--is-rtl .ms-n12{margin-right:-48px!important}.v-application--is-ltr .ms-n13{margin-left:-52px!important}.v-application--is-rtl .ms-n13{margin-right:-52px!important}.v-application--is-ltr .ms-n14{margin-left:-56px!important}.v-application--is-rtl .ms-n14{margin-right:-56px!important}.v-application--is-ltr .ms-n15{margin-left:-60px!important}.v-application--is-rtl .ms-n15{margin-right:-60px!important}.v-application--is-ltr .ms-n16{margin-left:-64px!important}.v-application--is-rtl .ms-n16{margin-right:-64px!important}.v-application--is-ltr .me-n1{margin-right:-4px!important}.v-application--is-rtl .me-n1{margin-left:-4px!important}.v-application--is-ltr .me-n2{margin-right:-8px!important}.v-application--is-rtl .me-n2{margin-left:-8px!important}.v-application--is-ltr .me-n3{margin-right:-12px!important}.v-application--is-rtl .me-n3{margin-left:-12px!important}.v-application--is-ltr .me-n4{margin-right:-16px!important}.v-application--is-rtl .me-n4{margin-left:-16px!important}.v-application--is-ltr .me-n5{margin-right:-20px!important}.v-application--is-rtl .me-n5{margin-left:-20px!important}.v-application--is-ltr .me-n6{margin-right:-24px!important}.v-application--is-rtl .me-n6{margin-left:-24px!important}.v-application--is-ltr .me-n7{margin-right:-28px!important}.v-application--is-rtl .me-n7{margin-left:-28px!important}.v-application--is-ltr .me-n8{margin-right:-32px!important}.v-application--is-rtl .me-n8{margin-left:-32px!important}.v-application--is-ltr .me-n9{margin-right:-36px!important}.v-application--is-rtl .me-n9{margin-left:-36px!important}.v-application--is-ltr .me-n10{margin-right:-40px!important}.v-application--is-rtl .me-n10{margin-left:-40px!important}.v-application--is-ltr .me-n11{margin-right:-44px!important}.v-application--is-rtl .me-n11{margin-left:-44px!important}.v-application--is-ltr .me-n12{margin-right:-48px!important}.v-application--is-rtl .me-n12{margin-left:-48px!important}.v-application--is-ltr .me-n13{margin-right:-52px!important}.v-application--is-rtl .me-n13{margin-left:-52px!important}.v-application--is-ltr .me-n14{margin-right:-56px!important}.v-application--is-rtl .me-n14{margin-left:-56px!important}.v-application--is-ltr .me-n15{margin-right:-60px!important}.v-application--is-rtl .me-n15{margin-left:-60px!important}.v-application--is-ltr .me-n16{margin-right:-64px!important}.v-application--is-rtl .me-n16{margin-left:-64px!important}.v-application .pa-0{padding:0!important}.v-application .pa-1{padding:4px!important}.v-application .pa-2{padding:8px!important}.v-application .pa-3{padding:12px!important}.v-application .pa-4{padding:16px!important}.v-application .pa-5{padding:20px!important}.v-application .pa-6{padding:24px!important}.v-application .pa-7{padding:28px!important}.v-application .pa-8{padding:32px!important}.v-application .pa-9{padding:36px!important}.v-application .pa-10{padding:40px!important}.v-application .pa-11{padding:44px!important}.v-application .pa-12{padding:48px!important}.v-application .pa-13{padding:52px!important}.v-application .pa-14{padding:56px!important}.v-application .pa-15{padding:60px!important}.v-application .pa-16{padding:64px!important}.v-application .px-0{padding-right:0!important;padding-left:0!important}.v-application .px-1{padding-right:4px!important;padding-left:4px!important}.v-application .px-2{padding-right:8px!important;padding-left:8px!important}.v-application .px-3{padding-right:12px!important;padding-left:12px!important}.v-application .px-4{padding-right:16px!important;padding-left:16px!important}.v-application .px-5{padding-right:20px!important;padding-left:20px!important}.v-application .px-6{padding-right:24px!important;padding-left:24px!important}.v-application .px-7{padding-right:28px!important;padding-left:28px!important}.v-application .px-8{padding-right:32px!important;padding-left:32px!important}.v-application .px-9{padding-right:36px!important;padding-left:36px!important}.v-application .px-10{padding-right:40px!important;padding-left:40px!important}.v-application .px-11{padding-right:44px!important;padding-left:44px!important}.v-application .px-12{padding-right:48px!important;padding-left:48px!important}.v-application .px-13{padding-right:52px!important;padding-left:52px!important}.v-application .px-14{padding-right:56px!important;padding-left:56px!important}.v-application .px-15{padding-right:60px!important;padding-left:60px!important}.v-application .px-16{padding-right:64px!important;padding-left:64px!important}.v-application .py-0{padding-top:0!important;padding-bottom:0!important}.v-application .py-1{padding-top:4px!important;padding-bottom:4px!important}.v-application .py-2{padding-top:8px!important;padding-bottom:8px!important}.v-application .py-3{padding-top:12px!important;padding-bottom:12px!important}.v-application .py-4{padding-top:16px!important;padding-bottom:16px!important}.v-application .py-5{padding-top:20px!important;padding-bottom:20px!important}.v-application .py-6{padding-top:24px!important;padding-bottom:24px!important}.v-application .py-7{padding-top:28px!important;padding-bottom:28px!important}.v-application .py-8{padding-top:32px!important;padding-bottom:32px!important}.v-application .py-9{padding-top:36px!important;padding-bottom:36px!important}.v-application .py-10{padding-top:40px!important;padding-bottom:40px!important}.v-application .py-11{padding-top:44px!important;padding-bottom:44px!important}.v-application .py-12{padding-top:48px!important;padding-bottom:48px!important}.v-application .py-13{padding-top:52px!important;padding-bottom:52px!important}.v-application .py-14{padding-top:56px!important;padding-bottom:56px!important}.v-application .py-15{padding-top:60px!important;padding-bottom:60px!important}.v-application .py-16{padding-top:64px!important;padding-bottom:64px!important}.v-application .pt-0{padding-top:0!important}.v-application .pt-1{padding-top:4px!important}.v-application .pt-2{padding-top:8px!important}.v-application .pt-3{padding-top:12px!important}.v-application .pt-4{padding-top:16px!important}.v-application .pt-5{padding-top:20px!important}.v-application .pt-6{padding-top:24px!important}.v-application .pt-7{padding-top:28px!important}.v-application .pt-8{padding-top:32px!important}.v-application .pt-9{padding-top:36px!important}.v-application .pt-10{padding-top:40px!important}.v-application .pt-11{padding-top:44px!important}.v-application .pt-12{padding-top:48px!important}.v-application .pt-13{padding-top:52px!important}.v-application .pt-14{padding-top:56px!important}.v-application .pt-15{padding-top:60px!important}.v-application .pt-16{padding-top:64px!important}.v-application .pr-0{padding-right:0!important}.v-application .pr-1{padding-right:4px!important}.v-application .pr-2{padding-right:8px!important}.v-application .pr-3{padding-right:12px!important}.v-application .pr-4{padding-right:16px!important}.v-application .pr-5{padding-right:20px!important}.v-application .pr-6{padding-right:24px!important}.v-application .pr-7{padding-right:28px!important}.v-application .pr-8{padding-right:32px!important}.v-application .pr-9{padding-right:36px!important}.v-application .pr-10{padding-right:40px!important}.v-application .pr-11{padding-right:44px!important}.v-application .pr-12{padding-right:48px!important}.v-application .pr-13{padding-right:52px!important}.v-application .pr-14{padding-right:56px!important}.v-application .pr-15{padding-right:60px!important}.v-application .pr-16{padding-right:64px!important}.v-application .pb-0{padding-bottom:0!important}.v-application .pb-1{padding-bottom:4px!important}.v-application .pb-2{padding-bottom:8px!important}.v-application .pb-3{padding-bottom:12px!important}.v-application .pb-4{padding-bottom:16px!important}.v-application .pb-5{padding-bottom:20px!important}.v-application .pb-6{padding-bottom:24px!important}.v-application .pb-7{padding-bottom:28px!important}.v-application .pb-8{padding-bottom:32px!important}.v-application .pb-9{padding-bottom:36px!important}.v-application .pb-10{padding-bottom:40px!important}.v-application .pb-11{padding-bottom:44px!important}.v-application .pb-12{padding-bottom:48px!important}.v-application .pb-13{padding-bottom:52px!important}.v-application .pb-14{padding-bottom:56px!important}.v-application .pb-15{padding-bottom:60px!important}.v-application .pb-16{padding-bottom:64px!important}.v-application .pl-0{padding-left:0!important}.v-application .pl-1{padding-left:4px!important}.v-application .pl-2{padding-left:8px!important}.v-application .pl-3{padding-left:12px!important}.v-application .pl-4{padding-left:16px!important}.v-application .pl-5{padding-left:20px!important}.v-application .pl-6{padding-left:24px!important}.v-application .pl-7{padding-left:28px!important}.v-application .pl-8{padding-left:32px!important}.v-application .pl-9{padding-left:36px!important}.v-application .pl-10{padding-left:40px!important}.v-application .pl-11{padding-left:44px!important}.v-application .pl-12{padding-left:48px!important}.v-application .pl-13{padding-left:52px!important}.v-application .pl-14{padding-left:56px!important}.v-application .pl-15{padding-left:60px!important}.v-application .pl-16{padding-left:64px!important}.v-application--is-ltr .ps-0{padding-left:0!important}.v-application--is-rtl .ps-0{padding-right:0!important}.v-application--is-ltr .ps-1{padding-left:4px!important}.v-application--is-rtl .ps-1{padding-right:4px!important}.v-application--is-ltr .ps-2{padding-left:8px!important}.v-application--is-rtl .ps-2{padding-right:8px!important}.v-application--is-ltr .ps-3{padding-left:12px!important}.v-application--is-rtl .ps-3{padding-right:12px!important}.v-application--is-ltr .ps-4{padding-left:16px!important}.v-application--is-rtl .ps-4{padding-right:16px!important}.v-application--is-ltr .ps-5{padding-left:20px!important}.v-application--is-rtl .ps-5{padding-right:20px!important}.v-application--is-ltr .ps-6{padding-left:24px!important}.v-application--is-rtl .ps-6{padding-right:24px!important}.v-application--is-ltr .ps-7{padding-left:28px!important}.v-application--is-rtl .ps-7{padding-right:28px!important}.v-application--is-ltr .ps-8{padding-left:32px!important}.v-application--is-rtl .ps-8{padding-right:32px!important}.v-application--is-ltr .ps-9{padding-left:36px!important}.v-application--is-rtl .ps-9{padding-right:36px!important}.v-application--is-ltr .ps-10{padding-left:40px!important}.v-application--is-rtl .ps-10{padding-right:40px!important}.v-application--is-ltr .ps-11{padding-left:44px!important}.v-application--is-rtl .ps-11{padding-right:44px!important}.v-application--is-ltr .ps-12{padding-left:48px!important}.v-application--is-rtl .ps-12{padding-right:48px!important}.v-application--is-ltr .ps-13{padding-left:52px!important}.v-application--is-rtl .ps-13{padding-right:52px!important}.v-application--is-ltr .ps-14{padding-left:56px!important}.v-application--is-rtl .ps-14{padding-right:56px!important}.v-application--is-ltr .ps-15{padding-left:60px!important}.v-application--is-rtl .ps-15{padding-right:60px!important}.v-application--is-ltr .ps-16{padding-left:64px!important}.v-application--is-rtl .ps-16{padding-right:64px!important}.v-application--is-ltr .pe-0{padding-right:0!important}.v-application--is-rtl .pe-0{padding-left:0!important}.v-application--is-ltr .pe-1{padding-right:4px!important}.v-application--is-rtl .pe-1{padding-left:4px!important}.v-application--is-ltr .pe-2{padding-right:8px!important}.v-application--is-rtl .pe-2{padding-left:8px!important}.v-application--is-ltr .pe-3{padding-right:12px!important}.v-application--is-rtl .pe-3{padding-left:12px!important}.v-application--is-ltr .pe-4{padding-right:16px!important}.v-application--is-rtl .pe-4{padding-left:16px!important}.v-application--is-ltr .pe-5{padding-right:20px!important}.v-application--is-rtl .pe-5{padding-left:20px!important}.v-application--is-ltr .pe-6{padding-right:24px!important}.v-application--is-rtl .pe-6{padding-left:24px!important}.v-application--is-ltr .pe-7{padding-right:28px!important}.v-application--is-rtl .pe-7{padding-left:28px!important}.v-application--is-ltr .pe-8{padding-right:32px!important}.v-application--is-rtl .pe-8{padding-left:32px!important}.v-application--is-ltr .pe-9{padding-right:36px!important}.v-application--is-rtl .pe-9{padding-left:36px!important}.v-application--is-ltr .pe-10{padding-right:40px!important}.v-application--is-rtl .pe-10{padding-left:40px!important}.v-application--is-ltr .pe-11{padding-right:44px!important}.v-application--is-rtl .pe-11{padding-left:44px!important}.v-application--is-ltr .pe-12{padding-right:48px!important}.v-application--is-rtl .pe-12{padding-left:48px!important}.v-application--is-ltr .pe-13{padding-right:52px!important}.v-application--is-rtl .pe-13{padding-left:52px!important}.v-application--is-ltr .pe-14{padding-right:56px!important}.v-application--is-rtl .pe-14{padding-left:56px!important}.v-application--is-ltr .pe-15{padding-right:60px!important}.v-application--is-rtl .pe-15{padding-left:60px!important}.v-application--is-ltr .pe-16{padding-right:64px!important}.v-application--is-rtl .pe-16{padding-left:64px!important}.v-application .rounded-0{border-radius:0!important}.v-application .rounded-sm{border-radius:2px!important}.v-application .rounded{border-radius:4px!important}.v-application .rounded-lg{border-radius:8px!important}.v-application .rounded-xl{border-radius:24px!important}.v-application .rounded-pill{border-radius:9999px!important}.v-application .rounded-circle{border-radius:50%!important}.v-application .rounded-t-0{border-top-left-radius:0!important;border-top-right-radius:0!important}.v-application .rounded-t-sm{border-top-left-radius:2px!important;border-top-right-radius:2px!important}.v-application .rounded-t{border-top-left-radius:4px!important;border-top-right-radius:4px!important}.v-application .rounded-t-lg{border-top-left-radius:8px!important;border-top-right-radius:8px!important}.v-application .rounded-t-xl{border-top-left-radius:24px!important;border-top-right-radius:24px!important}.v-application .rounded-t-pill{border-top-left-radius:9999px!important;border-top-right-radius:9999px!important}.v-application .rounded-t-circle{border-top-left-radius:50%!important;border-top-right-radius:50%!important}.v-application .rounded-r-0{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.v-application .rounded-r-sm{border-top-right-radius:2px!important;border-bottom-right-radius:2px!important}.v-application .rounded-r{border-top-right-radius:4px!important;border-bottom-right-radius:4px!important}.v-application .rounded-r-lg{border-top-right-radius:8px!important;border-bottom-right-radius:8px!important}.v-application .rounded-r-xl{border-top-right-radius:24px!important;border-bottom-right-radius:24px!important}.v-application .rounded-r-pill{border-top-right-radius:9999px!important;border-bottom-right-radius:9999px!important}.v-application .rounded-r-circle{border-top-right-radius:50%!important;border-bottom-right-radius:50%!important}.v-application .rounded-b-0{border-bottom-left-radius:0!important;border-bottom-right-radius:0!important}.v-application .rounded-b-sm{border-bottom-left-radius:2px!important;border-bottom-right-radius:2px!important}.v-application .rounded-b{border-bottom-left-radius:4px!important;border-bottom-right-radius:4px!important}.v-application .rounded-b-lg{border-bottom-left-radius:8px!important;border-bottom-right-radius:8px!important}.v-application .rounded-b-xl{border-bottom-left-radius:24px!important;border-bottom-right-radius:24px!important}.v-application .rounded-b-pill{border-bottom-left-radius:9999px!important;border-bottom-right-radius:9999px!important}.v-application .rounded-b-circle{border-bottom-left-radius:50%!important;border-bottom-right-radius:50%!important}.v-application .rounded-l-0{border-top-left-radius:0!important;border-bottom-left-radius:0!important}.v-application .rounded-l-sm{border-top-left-radius:2px!important;border-bottom-left-radius:2px!important}.v-application .rounded-l{border-top-left-radius:4px!important;border-bottom-left-radius:4px!important}.v-application .rounded-l-lg{border-top-left-radius:8px!important;border-bottom-left-radius:8px!important}.v-application .rounded-l-xl{border-top-left-radius:24px!important;border-bottom-left-radius:24px!important}.v-application .rounded-l-pill{border-top-left-radius:9999px!important;border-bottom-left-radius:9999px!important}.v-application .rounded-l-circle{border-top-left-radius:50%!important;border-bottom-left-radius:50%!important}.v-application .rounded-tl-0{border-top-left-radius:0!important}.v-application .rounded-tl-sm{border-top-left-radius:2px!important}.v-application .rounded-tl{border-top-left-radius:4px!important}.v-application .rounded-tl-lg{border-top-left-radius:8px!important}.v-application .rounded-tl-xl{border-top-left-radius:24px!important}.v-application .rounded-tl-pill{border-top-left-radius:9999px!important}.v-application .rounded-tl-circle{border-top-left-radius:50%!important}.v-application .rounded-tr-0{border-top-right-radius:0!important}.v-application .rounded-tr-sm{border-top-right-radius:2px!important}.v-application .rounded-tr{border-top-right-radius:4px!important}.v-application .rounded-tr-lg{border-top-right-radius:8px!important}.v-application .rounded-tr-xl{border-top-right-radius:24px!important}.v-application .rounded-tr-pill{border-top-right-radius:9999px!important}.v-application .rounded-tr-circle{border-top-right-radius:50%!important}.v-application .rounded-br-0{border-bottom-right-radius:0!important}.v-application .rounded-br-sm{border-bottom-right-radius:2px!important}.v-application .rounded-br{border-bottom-right-radius:4px!important}.v-application .rounded-br-lg{border-bottom-right-radius:8px!important}.v-application .rounded-br-xl{border-bottom-right-radius:24px!important}.v-application .rounded-br-pill{border-bottom-right-radius:9999px!important}.v-application .rounded-br-circle{border-bottom-right-radius:50%!important}.v-application .rounded-bl-0{border-bottom-left-radius:0!important}.v-application .rounded-bl-sm{border-bottom-left-radius:2px!important}.v-application .rounded-bl{border-bottom-left-radius:4px!important}.v-application .rounded-bl-lg{border-bottom-left-radius:8px!important}.v-application .rounded-bl-xl{border-bottom-left-radius:24px!important}.v-application .rounded-bl-pill{border-bottom-left-radius:9999px!important}.v-application .rounded-bl-circle{border-bottom-left-radius:50%!important}.v-application .text-left{text-align:left!important}.v-application .text-right{text-align:right!important}.v-application .text-center{text-align:center!important}.v-application .text-justify{text-align:justify!important}.v-application .text-start{text-align:start!important}.v-application .text-end{text-align:end!important}.v-application .text-decoration-line-through{text-decoration:line-through!important}.v-application .text-decoration-none{text-decoration:none!important}.v-application .text-decoration-overline{text-decoration:overline!important}.v-application .text-decoration-underline{text-decoration:underline!important}.v-application .text-wrap{white-space:normal!important}.v-application .text-no-wrap{white-space:nowrap!important}.v-application .text-pre{white-space:pre!important}.v-application .text-pre-line{white-space:pre-line!important}.v-application .text-pre-wrap{white-space:pre-wrap!important}.v-application .text-break{overflow-wrap:break-word!important;word-break:break-word!important}.v-application .text-truncate{white-space:nowrap!important;overflow:hidden!important;text-overflow:ellipsis!important}.v-application .text-none{text-transform:none!important}.v-application .text-capitalize{text-transform:capitalize!important}.v-application .text-lowercase{text-transform:lowercase!important}.v-application .text-uppercase{text-transform:uppercase!important}.v-application .text-h1{font-size:6rem!important;line-height:6rem;letter-spacing:-.015625em!important}.v-application .text-h1,.v-application .text-h2{font-weight:300;font-family:Roboto,sans-serif!important}.v-application .text-h2{font-size:3.75rem!important;line-height:3.75rem;letter-spacing:-.0083333333em!important}.v-application .text-h3{font-size:3rem!important;line-height:3.125rem;letter-spacing:normal!important}.v-application .text-h3,.v-application .text-h4{font-weight:400;font-family:Roboto,sans-serif!important}.v-application .text-h4{font-size:2.125rem!important;line-height:2.5rem;letter-spacing:.0073529412em!important}.v-application .text-h5{font-size:1.5rem!important;font-weight:400;letter-spacing:normal!important}.v-application .text-h5,.v-application .text-h6{line-height:2rem;font-family:Roboto,sans-serif!important}.v-application .text-h6{font-size:1.25rem!important;font-weight:500;letter-spacing:.0125em!important}.v-application .text-subtitle-1{font-size:1rem!important;font-weight:400;line-height:1.75rem;letter-spacing:.009375em!important;font-family:Roboto,sans-serif!important}.v-application .text-subtitle-2{font-size:.875rem!important;font-weight:500;line-height:1.375rem;letter-spacing:.0071428571em!important;font-family:Roboto,sans-serif!important}.v-application .text-body-1{font-size:1rem!important;font-weight:400;line-height:1.5rem;letter-spacing:.03125em!important;font-family:Roboto,sans-serif!important}.v-application .text-body-2{font-weight:400;line-height:1.25rem;letter-spacing:.0178571429em!important}.v-application .text-body-2,.v-application .text-button{font-size:.875rem!important;font-family:Roboto,sans-serif!important}.v-application .text-button{font-weight:500;line-height:2.25rem;letter-spacing:.0892857143em!important;text-transform:uppercase!important}.v-application .text-caption{font-weight:400;line-height:1.25rem;letter-spacing:.0333333333em!important}.v-application .text-caption,.v-application .text-overline{font-size:.75rem!important;font-family:Roboto,sans-serif!important}.v-application .text-overline{font-weight:500;line-height:2rem;letter-spacing:.1666666667em!important;text-transform:uppercase!important}@media(min-width:600px){.v-application .d-sm-none{display:none!important}.v-application .d-sm-inline{display:inline!important}.v-application .d-sm-inline-block{display:inline-block!important}.v-application .d-sm-block{display:block!important}.v-application .d-sm-table{display:table!important}.v-application .d-sm-table-row{display:table-row!important}.v-application .d-sm-table-cell{display:table-cell!important}.v-application .d-sm-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.v-application .d-sm-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}.v-application .float-sm-none{float:none!important}.v-application .float-sm-left{float:left!important}.v-application .float-sm-right{float:right!important}.v-application--is-rtl .float-sm-end{float:left!important}.v-application--is-ltr .float-sm-end,.v-application--is-rtl .float-sm-start{float:right!important}.v-application--is-ltr .float-sm-start{float:left!important}.v-application .flex-sm-fill{-webkit-box-flex:1!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.v-application .flex-sm-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.v-application .flex-sm-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.v-application .flex-sm-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.v-application .flex-sm-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.v-application .flex-sm-grow-0{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.v-application .flex-sm-grow-1{-webkit-box-flex:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.v-application .flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.v-application .flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.v-application .flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.v-application .flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.v-application .flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.v-application .justify-sm-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.v-application .justify-sm-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.v-application .justify-sm-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.v-application .justify-sm-space-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.v-application .justify-sm-space-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.v-application .align-sm-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.v-application .align-sm-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.v-application .align-sm-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.v-application .align-sm-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.v-application .align-sm-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.v-application .align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.v-application .align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.v-application .align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.v-application .align-content-sm-space-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.v-application .align-content-sm-space-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.v-application .align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.v-application .align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.v-application .align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.v-application .align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.v-application .align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.v-application .align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.v-application .align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}.v-application .order-sm-first{-webkit-box-ordinal-group:0!important;-ms-flex-order:-1!important;order:-1!important}.v-application .order-sm-0{-webkit-box-ordinal-group:1!important;-ms-flex-order:0!important;order:0!important}.v-application .order-sm-1{-webkit-box-ordinal-group:2!important;-ms-flex-order:1!important;order:1!important}.v-application .order-sm-2{-webkit-box-ordinal-group:3!important;-ms-flex-order:2!important;order:2!important}.v-application .order-sm-3{-webkit-box-ordinal-group:4!important;-ms-flex-order:3!important;order:3!important}.v-application .order-sm-4{-webkit-box-ordinal-group:5!important;-ms-flex-order:4!important;order:4!important}.v-application .order-sm-5{-webkit-box-ordinal-group:6!important;-ms-flex-order:5!important;order:5!important}.v-application .order-sm-6{-webkit-box-ordinal-group:7!important;-ms-flex-order:6!important;order:6!important}.v-application .order-sm-7{-webkit-box-ordinal-group:8!important;-ms-flex-order:7!important;order:7!important}.v-application .order-sm-8{-webkit-box-ordinal-group:9!important;-ms-flex-order:8!important;order:8!important}.v-application .order-sm-9{-webkit-box-ordinal-group:10!important;-ms-flex-order:9!important;order:9!important}.v-application .order-sm-10{-webkit-box-ordinal-group:11!important;-ms-flex-order:10!important;order:10!important}.v-application .order-sm-11{-webkit-box-ordinal-group:12!important;-ms-flex-order:11!important;order:11!important}.v-application .order-sm-12{-webkit-box-ordinal-group:13!important;-ms-flex-order:12!important;order:12!important}.v-application .order-sm-last{-webkit-box-ordinal-group:14!important;-ms-flex-order:13!important;order:13!important}.v-application .ma-sm-0{margin:0!important}.v-application .ma-sm-1{margin:4px!important}.v-application .ma-sm-2{margin:8px!important}.v-application .ma-sm-3{margin:12px!important}.v-application .ma-sm-4{margin:16px!important}.v-application .ma-sm-5{margin:20px!important}.v-application .ma-sm-6{margin:24px!important}.v-application .ma-sm-7{margin:28px!important}.v-application .ma-sm-8{margin:32px!important}.v-application .ma-sm-9{margin:36px!important}.v-application .ma-sm-10{margin:40px!important}.v-application .ma-sm-11{margin:44px!important}.v-application .ma-sm-12{margin:48px!important}.v-application .ma-sm-13{margin:52px!important}.v-application .ma-sm-14{margin:56px!important}.v-application .ma-sm-15{margin:60px!important}.v-application .ma-sm-16{margin:64px!important}.v-application .ma-sm-auto{margin:auto!important}.v-application .mx-sm-0{margin-right:0!important;margin-left:0!important}.v-application .mx-sm-1{margin-right:4px!important;margin-left:4px!important}.v-application .mx-sm-2{margin-right:8px!important;margin-left:8px!important}.v-application .mx-sm-3{margin-right:12px!important;margin-left:12px!important}.v-application .mx-sm-4{margin-right:16px!important;margin-left:16px!important}.v-application .mx-sm-5{margin-right:20px!important;margin-left:20px!important}.v-application .mx-sm-6{margin-right:24px!important;margin-left:24px!important}.v-application .mx-sm-7{margin-right:28px!important;margin-left:28px!important}.v-application .mx-sm-8{margin-right:32px!important;margin-left:32px!important}.v-application .mx-sm-9{margin-right:36px!important;margin-left:36px!important}.v-application .mx-sm-10{margin-right:40px!important;margin-left:40px!important}.v-application .mx-sm-11{margin-right:44px!important;margin-left:44px!important}.v-application .mx-sm-12{margin-right:48px!important;margin-left:48px!important}.v-application .mx-sm-13{margin-right:52px!important;margin-left:52px!important}.v-application .mx-sm-14{margin-right:56px!important;margin-left:56px!important}.v-application .mx-sm-15{margin-right:60px!important;margin-left:60px!important}.v-application .mx-sm-16{margin-right:64px!important;margin-left:64px!important}.v-application .mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.v-application .my-sm-0{margin-top:0!important;margin-bottom:0!important}.v-application .my-sm-1{margin-top:4px!important;margin-bottom:4px!important}.v-application .my-sm-2{margin-top:8px!important;margin-bottom:8px!important}.v-application .my-sm-3{margin-top:12px!important;margin-bottom:12px!important}.v-application .my-sm-4{margin-top:16px!important;margin-bottom:16px!important}.v-application .my-sm-5{margin-top:20px!important;margin-bottom:20px!important}.v-application .my-sm-6{margin-top:24px!important;margin-bottom:24px!important}.v-application .my-sm-7{margin-top:28px!important;margin-bottom:28px!important}.v-application .my-sm-8{margin-top:32px!important;margin-bottom:32px!important}.v-application .my-sm-9{margin-top:36px!important;margin-bottom:36px!important}.v-application .my-sm-10{margin-top:40px!important;margin-bottom:40px!important}.v-application .my-sm-11{margin-top:44px!important;margin-bottom:44px!important}.v-application .my-sm-12{margin-top:48px!important;margin-bottom:48px!important}.v-application .my-sm-13{margin-top:52px!important;margin-bottom:52px!important}.v-application .my-sm-14{margin-top:56px!important;margin-bottom:56px!important}.v-application .my-sm-15{margin-top:60px!important;margin-bottom:60px!important}.v-application .my-sm-16{margin-top:64px!important;margin-bottom:64px!important}.v-application .my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.v-application .mt-sm-0{margin-top:0!important}.v-application .mt-sm-1{margin-top:4px!important}.v-application .mt-sm-2{margin-top:8px!important}.v-application .mt-sm-3{margin-top:12px!important}.v-application .mt-sm-4{margin-top:16px!important}.v-application .mt-sm-5{margin-top:20px!important}.v-application .mt-sm-6{margin-top:24px!important}.v-application .mt-sm-7{margin-top:28px!important}.v-application .mt-sm-8{margin-top:32px!important}.v-application .mt-sm-9{margin-top:36px!important}.v-application .mt-sm-10{margin-top:40px!important}.v-application .mt-sm-11{margin-top:44px!important}.v-application .mt-sm-12{margin-top:48px!important}.v-application .mt-sm-13{margin-top:52px!important}.v-application .mt-sm-14{margin-top:56px!important}.v-application .mt-sm-15{margin-top:60px!important}.v-application .mt-sm-16{margin-top:64px!important}.v-application .mt-sm-auto{margin-top:auto!important}.v-application .mr-sm-0{margin-right:0!important}.v-application .mr-sm-1{margin-right:4px!important}.v-application .mr-sm-2{margin-right:8px!important}.v-application .mr-sm-3{margin-right:12px!important}.v-application .mr-sm-4{margin-right:16px!important}.v-application .mr-sm-5{margin-right:20px!important}.v-application .mr-sm-6{margin-right:24px!important}.v-application .mr-sm-7{margin-right:28px!important}.v-application .mr-sm-8{margin-right:32px!important}.v-application .mr-sm-9{margin-right:36px!important}.v-application .mr-sm-10{margin-right:40px!important}.v-application .mr-sm-11{margin-right:44px!important}.v-application .mr-sm-12{margin-right:48px!important}.v-application .mr-sm-13{margin-right:52px!important}.v-application .mr-sm-14{margin-right:56px!important}.v-application .mr-sm-15{margin-right:60px!important}.v-application .mr-sm-16{margin-right:64px!important}.v-application .mr-sm-auto{margin-right:auto!important}.v-application .mb-sm-0{margin-bottom:0!important}.v-application .mb-sm-1{margin-bottom:4px!important}.v-application .mb-sm-2{margin-bottom:8px!important}.v-application .mb-sm-3{margin-bottom:12px!important}.v-application .mb-sm-4{margin-bottom:16px!important}.v-application .mb-sm-5{margin-bottom:20px!important}.v-application .mb-sm-6{margin-bottom:24px!important}.v-application .mb-sm-7{margin-bottom:28px!important}.v-application .mb-sm-8{margin-bottom:32px!important}.v-application .mb-sm-9{margin-bottom:36px!important}.v-application .mb-sm-10{margin-bottom:40px!important}.v-application .mb-sm-11{margin-bottom:44px!important}.v-application .mb-sm-12{margin-bottom:48px!important}.v-application .mb-sm-13{margin-bottom:52px!important}.v-application .mb-sm-14{margin-bottom:56px!important}.v-application .mb-sm-15{margin-bottom:60px!important}.v-application .mb-sm-16{margin-bottom:64px!important}.v-application .mb-sm-auto{margin-bottom:auto!important}.v-application .ml-sm-0{margin-left:0!important}.v-application .ml-sm-1{margin-left:4px!important}.v-application .ml-sm-2{margin-left:8px!important}.v-application .ml-sm-3{margin-left:12px!important}.v-application .ml-sm-4{margin-left:16px!important}.v-application .ml-sm-5{margin-left:20px!important}.v-application .ml-sm-6{margin-left:24px!important}.v-application .ml-sm-7{margin-left:28px!important}.v-application .ml-sm-8{margin-left:32px!important}.v-application .ml-sm-9{margin-left:36px!important}.v-application .ml-sm-10{margin-left:40px!important}.v-application .ml-sm-11{margin-left:44px!important}.v-application .ml-sm-12{margin-left:48px!important}.v-application .ml-sm-13{margin-left:52px!important}.v-application .ml-sm-14{margin-left:56px!important}.v-application .ml-sm-15{margin-left:60px!important}.v-application .ml-sm-16{margin-left:64px!important}.v-application .ml-sm-auto{margin-left:auto!important}.v-application--is-ltr .ms-sm-0{margin-left:0!important}.v-application--is-rtl .ms-sm-0{margin-right:0!important}.v-application--is-ltr .ms-sm-1{margin-left:4px!important}.v-application--is-rtl .ms-sm-1{margin-right:4px!important}.v-application--is-ltr .ms-sm-2{margin-left:8px!important}.v-application--is-rtl .ms-sm-2{margin-right:8px!important}.v-application--is-ltr .ms-sm-3{margin-left:12px!important}.v-application--is-rtl .ms-sm-3{margin-right:12px!important}.v-application--is-ltr .ms-sm-4{margin-left:16px!important}.v-application--is-rtl .ms-sm-4{margin-right:16px!important}.v-application--is-ltr .ms-sm-5{margin-left:20px!important}.v-application--is-rtl .ms-sm-5{margin-right:20px!important}.v-application--is-ltr .ms-sm-6{margin-left:24px!important}.v-application--is-rtl .ms-sm-6{margin-right:24px!important}.v-application--is-ltr .ms-sm-7{margin-left:28px!important}.v-application--is-rtl .ms-sm-7{margin-right:28px!important}.v-application--is-ltr .ms-sm-8{margin-left:32px!important}.v-application--is-rtl .ms-sm-8{margin-right:32px!important}.v-application--is-ltr .ms-sm-9{margin-left:36px!important}.v-application--is-rtl .ms-sm-9{margin-right:36px!important}.v-application--is-ltr .ms-sm-10{margin-left:40px!important}.v-application--is-rtl .ms-sm-10{margin-right:40px!important}.v-application--is-ltr .ms-sm-11{margin-left:44px!important}.v-application--is-rtl .ms-sm-11{margin-right:44px!important}.v-application--is-ltr .ms-sm-12{margin-left:48px!important}.v-application--is-rtl .ms-sm-12{margin-right:48px!important}.v-application--is-ltr .ms-sm-13{margin-left:52px!important}.v-application--is-rtl .ms-sm-13{margin-right:52px!important}.v-application--is-ltr .ms-sm-14{margin-left:56px!important}.v-application--is-rtl .ms-sm-14{margin-right:56px!important}.v-application--is-ltr .ms-sm-15{margin-left:60px!important}.v-application--is-rtl .ms-sm-15{margin-right:60px!important}.v-application--is-ltr .ms-sm-16{margin-left:64px!important}.v-application--is-rtl .ms-sm-16{margin-right:64px!important}.v-application--is-ltr .ms-sm-auto{margin-left:auto!important}.v-application--is-rtl .ms-sm-auto{margin-right:auto!important}.v-application--is-ltr .me-sm-0{margin-right:0!important}.v-application--is-rtl .me-sm-0{margin-left:0!important}.v-application--is-ltr .me-sm-1{margin-right:4px!important}.v-application--is-rtl .me-sm-1{margin-left:4px!important}.v-application--is-ltr .me-sm-2{margin-right:8px!important}.v-application--is-rtl .me-sm-2{margin-left:8px!important}.v-application--is-ltr .me-sm-3{margin-right:12px!important}.v-application--is-rtl .me-sm-3{margin-left:12px!important}.v-application--is-ltr .me-sm-4{margin-right:16px!important}.v-application--is-rtl .me-sm-4{margin-left:16px!important}.v-application--is-ltr .me-sm-5{margin-right:20px!important}.v-application--is-rtl .me-sm-5{margin-left:20px!important}.v-application--is-ltr .me-sm-6{margin-right:24px!important}.v-application--is-rtl .me-sm-6{margin-left:24px!important}.v-application--is-ltr .me-sm-7{margin-right:28px!important}.v-application--is-rtl .me-sm-7{margin-left:28px!important}.v-application--is-ltr .me-sm-8{margin-right:32px!important}.v-application--is-rtl .me-sm-8{margin-left:32px!important}.v-application--is-ltr .me-sm-9{margin-right:36px!important}.v-application--is-rtl .me-sm-9{margin-left:36px!important}.v-application--is-ltr .me-sm-10{margin-right:40px!important}.v-application--is-rtl .me-sm-10{margin-left:40px!important}.v-application--is-ltr .me-sm-11{margin-right:44px!important}.v-application--is-rtl .me-sm-11{margin-left:44px!important}.v-application--is-ltr .me-sm-12{margin-right:48px!important}.v-application--is-rtl .me-sm-12{margin-left:48px!important}.v-application--is-ltr .me-sm-13{margin-right:52px!important}.v-application--is-rtl .me-sm-13{margin-left:52px!important}.v-application--is-ltr .me-sm-14{margin-right:56px!important}.v-application--is-rtl .me-sm-14{margin-left:56px!important}.v-application--is-ltr .me-sm-15{margin-right:60px!important}.v-application--is-rtl .me-sm-15{margin-left:60px!important}.v-application--is-ltr .me-sm-16{margin-right:64px!important}.v-application--is-rtl .me-sm-16{margin-left:64px!important}.v-application--is-ltr .me-sm-auto{margin-right:auto!important}.v-application--is-rtl .me-sm-auto{margin-left:auto!important}.v-application .ma-sm-n1{margin:-4px!important}.v-application .ma-sm-n2{margin:-8px!important}.v-application .ma-sm-n3{margin:-12px!important}.v-application .ma-sm-n4{margin:-16px!important}.v-application .ma-sm-n5{margin:-20px!important}.v-application .ma-sm-n6{margin:-24px!important}.v-application .ma-sm-n7{margin:-28px!important}.v-application .ma-sm-n8{margin:-32px!important}.v-application .ma-sm-n9{margin:-36px!important}.v-application .ma-sm-n10{margin:-40px!important}.v-application .ma-sm-n11{margin:-44px!important}.v-application .ma-sm-n12{margin:-48px!important}.v-application .ma-sm-n13{margin:-52px!important}.v-application .ma-sm-n14{margin:-56px!important}.v-application .ma-sm-n15{margin:-60px!important}.v-application .ma-sm-n16{margin:-64px!important}.v-application .mx-sm-n1{margin-right:-4px!important;margin-left:-4px!important}.v-application .mx-sm-n2{margin-right:-8px!important;margin-left:-8px!important}.v-application .mx-sm-n3{margin-right:-12px!important;margin-left:-12px!important}.v-application .mx-sm-n4{margin-right:-16px!important;margin-left:-16px!important}.v-application .mx-sm-n5{margin-right:-20px!important;margin-left:-20px!important}.v-application .mx-sm-n6{margin-right:-24px!important;margin-left:-24px!important}.v-application .mx-sm-n7{margin-right:-28px!important;margin-left:-28px!important}.v-application .mx-sm-n8{margin-right:-32px!important;margin-left:-32px!important}.v-application .mx-sm-n9{margin-right:-36px!important;margin-left:-36px!important}.v-application .mx-sm-n10{margin-right:-40px!important;margin-left:-40px!important}.v-application .mx-sm-n11{margin-right:-44px!important;margin-left:-44px!important}.v-application .mx-sm-n12{margin-right:-48px!important;margin-left:-48px!important}.v-application .mx-sm-n13{margin-right:-52px!important;margin-left:-52px!important}.v-application .mx-sm-n14{margin-right:-56px!important;margin-left:-56px!important}.v-application .mx-sm-n15{margin-right:-60px!important;margin-left:-60px!important}.v-application .mx-sm-n16{margin-right:-64px!important;margin-left:-64px!important}.v-application .my-sm-n1{margin-top:-4px!important;margin-bottom:-4px!important}.v-application .my-sm-n2{margin-top:-8px!important;margin-bottom:-8px!important}.v-application .my-sm-n3{margin-top:-12px!important;margin-bottom:-12px!important}.v-application .my-sm-n4{margin-top:-16px!important;margin-bottom:-16px!important}.v-application .my-sm-n5{margin-top:-20px!important;margin-bottom:-20px!important}.v-application .my-sm-n6{margin-top:-24px!important;margin-bottom:-24px!important}.v-application .my-sm-n7{margin-top:-28px!important;margin-bottom:-28px!important}.v-application .my-sm-n8{margin-top:-32px!important;margin-bottom:-32px!important}.v-application .my-sm-n9{margin-top:-36px!important;margin-bottom:-36px!important}.v-application .my-sm-n10{margin-top:-40px!important;margin-bottom:-40px!important}.v-application .my-sm-n11{margin-top:-44px!important;margin-bottom:-44px!important}.v-application .my-sm-n12{margin-top:-48px!important;margin-bottom:-48px!important}.v-application .my-sm-n13{margin-top:-52px!important;margin-bottom:-52px!important}.v-application .my-sm-n14{margin-top:-56px!important;margin-bottom:-56px!important}.v-application .my-sm-n15{margin-top:-60px!important;margin-bottom:-60px!important}.v-application .my-sm-n16{margin-top:-64px!important;margin-bottom:-64px!important}.v-application .mt-sm-n1{margin-top:-4px!important}.v-application .mt-sm-n2{margin-top:-8px!important}.v-application .mt-sm-n3{margin-top:-12px!important}.v-application .mt-sm-n4{margin-top:-16px!important}.v-application .mt-sm-n5{margin-top:-20px!important}.v-application .mt-sm-n6{margin-top:-24px!important}.v-application .mt-sm-n7{margin-top:-28px!important}.v-application .mt-sm-n8{margin-top:-32px!important}.v-application .mt-sm-n9{margin-top:-36px!important}.v-application .mt-sm-n10{margin-top:-40px!important}.v-application .mt-sm-n11{margin-top:-44px!important}.v-application .mt-sm-n12{margin-top:-48px!important}.v-application .mt-sm-n13{margin-top:-52px!important}.v-application .mt-sm-n14{margin-top:-56px!important}.v-application .mt-sm-n15{margin-top:-60px!important}.v-application .mt-sm-n16{margin-top:-64px!important}.v-application .mr-sm-n1{margin-right:-4px!important}.v-application .mr-sm-n2{margin-right:-8px!important}.v-application .mr-sm-n3{margin-right:-12px!important}.v-application .mr-sm-n4{margin-right:-16px!important}.v-application .mr-sm-n5{margin-right:-20px!important}.v-application .mr-sm-n6{margin-right:-24px!important}.v-application .mr-sm-n7{margin-right:-28px!important}.v-application .mr-sm-n8{margin-right:-32px!important}.v-application .mr-sm-n9{margin-right:-36px!important}.v-application .mr-sm-n10{margin-right:-40px!important}.v-application .mr-sm-n11{margin-right:-44px!important}.v-application .mr-sm-n12{margin-right:-48px!important}.v-application .mr-sm-n13{margin-right:-52px!important}.v-application .mr-sm-n14{margin-right:-56px!important}.v-application .mr-sm-n15{margin-right:-60px!important}.v-application .mr-sm-n16{margin-right:-64px!important}.v-application .mb-sm-n1{margin-bottom:-4px!important}.v-application .mb-sm-n2{margin-bottom:-8px!important}.v-application .mb-sm-n3{margin-bottom:-12px!important}.v-application .mb-sm-n4{margin-bottom:-16px!important}.v-application .mb-sm-n5{margin-bottom:-20px!important}.v-application .mb-sm-n6{margin-bottom:-24px!important}.v-application .mb-sm-n7{margin-bottom:-28px!important}.v-application .mb-sm-n8{margin-bottom:-32px!important}.v-application .mb-sm-n9{margin-bottom:-36px!important}.v-application .mb-sm-n10{margin-bottom:-40px!important}.v-application .mb-sm-n11{margin-bottom:-44px!important}.v-application .mb-sm-n12{margin-bottom:-48px!important}.v-application .mb-sm-n13{margin-bottom:-52px!important}.v-application .mb-sm-n14{margin-bottom:-56px!important}.v-application .mb-sm-n15{margin-bottom:-60px!important}.v-application .mb-sm-n16{margin-bottom:-64px!important}.v-application .ml-sm-n1{margin-left:-4px!important}.v-application .ml-sm-n2{margin-left:-8px!important}.v-application .ml-sm-n3{margin-left:-12px!important}.v-application .ml-sm-n4{margin-left:-16px!important}.v-application .ml-sm-n5{margin-left:-20px!important}.v-application .ml-sm-n6{margin-left:-24px!important}.v-application .ml-sm-n7{margin-left:-28px!important}.v-application .ml-sm-n8{margin-left:-32px!important}.v-application .ml-sm-n9{margin-left:-36px!important}.v-application .ml-sm-n10{margin-left:-40px!important}.v-application .ml-sm-n11{margin-left:-44px!important}.v-application .ml-sm-n12{margin-left:-48px!important}.v-application .ml-sm-n13{margin-left:-52px!important}.v-application .ml-sm-n14{margin-left:-56px!important}.v-application .ml-sm-n15{margin-left:-60px!important}.v-application .ml-sm-n16{margin-left:-64px!important}.v-application--is-ltr .ms-sm-n1{margin-left:-4px!important}.v-application--is-rtl .ms-sm-n1{margin-right:-4px!important}.v-application--is-ltr .ms-sm-n2{margin-left:-8px!important}.v-application--is-rtl .ms-sm-n2{margin-right:-8px!important}.v-application--is-ltr .ms-sm-n3{margin-left:-12px!important}.v-application--is-rtl .ms-sm-n3{margin-right:-12px!important}.v-application--is-ltr .ms-sm-n4{margin-left:-16px!important}.v-application--is-rtl .ms-sm-n4{margin-right:-16px!important}.v-application--is-ltr .ms-sm-n5{margin-left:-20px!important}.v-application--is-rtl .ms-sm-n5{margin-right:-20px!important}.v-application--is-ltr .ms-sm-n6{margin-left:-24px!important}.v-application--is-rtl .ms-sm-n6{margin-right:-24px!important}.v-application--is-ltr .ms-sm-n7{margin-left:-28px!important}.v-application--is-rtl .ms-sm-n7{margin-right:-28px!important}.v-application--is-ltr .ms-sm-n8{margin-left:-32px!important}.v-application--is-rtl .ms-sm-n8{margin-right:-32px!important}.v-application--is-ltr .ms-sm-n9{margin-left:-36px!important}.v-application--is-rtl .ms-sm-n9{margin-right:-36px!important}.v-application--is-ltr .ms-sm-n10{margin-left:-40px!important}.v-application--is-rtl .ms-sm-n10{margin-right:-40px!important}.v-application--is-ltr .ms-sm-n11{margin-left:-44px!important}.v-application--is-rtl .ms-sm-n11{margin-right:-44px!important}.v-application--is-ltr .ms-sm-n12{margin-left:-48px!important}.v-application--is-rtl .ms-sm-n12{margin-right:-48px!important}.v-application--is-ltr .ms-sm-n13{margin-left:-52px!important}.v-application--is-rtl .ms-sm-n13{margin-right:-52px!important}.v-application--is-ltr .ms-sm-n14{margin-left:-56px!important}.v-application--is-rtl .ms-sm-n14{margin-right:-56px!important}.v-application--is-ltr .ms-sm-n15{margin-left:-60px!important}.v-application--is-rtl .ms-sm-n15{margin-right:-60px!important}.v-application--is-ltr .ms-sm-n16{margin-left:-64px!important}.v-application--is-rtl .ms-sm-n16{margin-right:-64px!important}.v-application--is-ltr .me-sm-n1{margin-right:-4px!important}.v-application--is-rtl .me-sm-n1{margin-left:-4px!important}.v-application--is-ltr .me-sm-n2{margin-right:-8px!important}.v-application--is-rtl .me-sm-n2{margin-left:-8px!important}.v-application--is-ltr .me-sm-n3{margin-right:-12px!important}.v-application--is-rtl .me-sm-n3{margin-left:-12px!important}.v-application--is-ltr .me-sm-n4{margin-right:-16px!important}.v-application--is-rtl .me-sm-n4{margin-left:-16px!important}.v-application--is-ltr .me-sm-n5{margin-right:-20px!important}.v-application--is-rtl .me-sm-n5{margin-left:-20px!important}.v-application--is-ltr .me-sm-n6{margin-right:-24px!important}.v-application--is-rtl .me-sm-n6{margin-left:-24px!important}.v-application--is-ltr .me-sm-n7{margin-right:-28px!important}.v-application--is-rtl .me-sm-n7{margin-left:-28px!important}.v-application--is-ltr .me-sm-n8{margin-right:-32px!important}.v-application--is-rtl .me-sm-n8{margin-left:-32px!important}.v-application--is-ltr .me-sm-n9{margin-right:-36px!important}.v-application--is-rtl .me-sm-n9{margin-left:-36px!important}.v-application--is-ltr .me-sm-n10{margin-right:-40px!important}.v-application--is-rtl .me-sm-n10{margin-left:-40px!important}.v-application--is-ltr .me-sm-n11{margin-right:-44px!important}.v-application--is-rtl .me-sm-n11{margin-left:-44px!important}.v-application--is-ltr .me-sm-n12{margin-right:-48px!important}.v-application--is-rtl .me-sm-n12{margin-left:-48px!important}.v-application--is-ltr .me-sm-n13{margin-right:-52px!important}.v-application--is-rtl .me-sm-n13{margin-left:-52px!important}.v-application--is-ltr .me-sm-n14{margin-right:-56px!important}.v-application--is-rtl .me-sm-n14{margin-left:-56px!important}.v-application--is-ltr .me-sm-n15{margin-right:-60px!important}.v-application--is-rtl .me-sm-n15{margin-left:-60px!important}.v-application--is-ltr .me-sm-n16{margin-right:-64px!important}.v-application--is-rtl .me-sm-n16{margin-left:-64px!important}.v-application .pa-sm-0{padding:0!important}.v-application .pa-sm-1{padding:4px!important}.v-application .pa-sm-2{padding:8px!important}.v-application .pa-sm-3{padding:12px!important}.v-application .pa-sm-4{padding:16px!important}.v-application .pa-sm-5{padding:20px!important}.v-application .pa-sm-6{padding:24px!important}.v-application .pa-sm-7{padding:28px!important}.v-application .pa-sm-8{padding:32px!important}.v-application .pa-sm-9{padding:36px!important}.v-application .pa-sm-10{padding:40px!important}.v-application .pa-sm-11{padding:44px!important}.v-application .pa-sm-12{padding:48px!important}.v-application .pa-sm-13{padding:52px!important}.v-application .pa-sm-14{padding:56px!important}.v-application .pa-sm-15{padding:60px!important}.v-application .pa-sm-16{padding:64px!important}.v-application .px-sm-0{padding-right:0!important;padding-left:0!important}.v-application .px-sm-1{padding-right:4px!important;padding-left:4px!important}.v-application .px-sm-2{padding-right:8px!important;padding-left:8px!important}.v-application .px-sm-3{padding-right:12px!important;padding-left:12px!important}.v-application .px-sm-4{padding-right:16px!important;padding-left:16px!important}.v-application .px-sm-5{padding-right:20px!important;padding-left:20px!important}.v-application .px-sm-6{padding-right:24px!important;padding-left:24px!important}.v-application .px-sm-7{padding-right:28px!important;padding-left:28px!important}.v-application .px-sm-8{padding-right:32px!important;padding-left:32px!important}.v-application .px-sm-9{padding-right:36px!important;padding-left:36px!important}.v-application .px-sm-10{padding-right:40px!important;padding-left:40px!important}.v-application .px-sm-11{padding-right:44px!important;padding-left:44px!important}.v-application .px-sm-12{padding-right:48px!important;padding-left:48px!important}.v-application .px-sm-13{padding-right:52px!important;padding-left:52px!important}.v-application .px-sm-14{padding-right:56px!important;padding-left:56px!important}.v-application .px-sm-15{padding-right:60px!important;padding-left:60px!important}.v-application .px-sm-16{padding-right:64px!important;padding-left:64px!important}.v-application .py-sm-0{padding-top:0!important;padding-bottom:0!important}.v-application .py-sm-1{padding-top:4px!important;padding-bottom:4px!important}.v-application .py-sm-2{padding-top:8px!important;padding-bottom:8px!important}.v-application .py-sm-3{padding-top:12px!important;padding-bottom:12px!important}.v-application .py-sm-4{padding-top:16px!important;padding-bottom:16px!important}.v-application .py-sm-5{padding-top:20px!important;padding-bottom:20px!important}.v-application .py-sm-6{padding-top:24px!important;padding-bottom:24px!important}.v-application .py-sm-7{padding-top:28px!important;padding-bottom:28px!important}.v-application .py-sm-8{padding-top:32px!important;padding-bottom:32px!important}.v-application .py-sm-9{padding-top:36px!important;padding-bottom:36px!important}.v-application .py-sm-10{padding-top:40px!important;padding-bottom:40px!important}.v-application .py-sm-11{padding-top:44px!important;padding-bottom:44px!important}.v-application .py-sm-12{padding-top:48px!important;padding-bottom:48px!important}.v-application .py-sm-13{padding-top:52px!important;padding-bottom:52px!important}.v-application .py-sm-14{padding-top:56px!important;padding-bottom:56px!important}.v-application .py-sm-15{padding-top:60px!important;padding-bottom:60px!important}.v-application .py-sm-16{padding-top:64px!important;padding-bottom:64px!important}.v-application .pt-sm-0{padding-top:0!important}.v-application .pt-sm-1{padding-top:4px!important}.v-application .pt-sm-2{padding-top:8px!important}.v-application .pt-sm-3{padding-top:12px!important}.v-application .pt-sm-4{padding-top:16px!important}.v-application .pt-sm-5{padding-top:20px!important}.v-application .pt-sm-6{padding-top:24px!important}.v-application .pt-sm-7{padding-top:28px!important}.v-application .pt-sm-8{padding-top:32px!important}.v-application .pt-sm-9{padding-top:36px!important}.v-application .pt-sm-10{padding-top:40px!important}.v-application .pt-sm-11{padding-top:44px!important}.v-application .pt-sm-12{padding-top:48px!important}.v-application .pt-sm-13{padding-top:52px!important}.v-application .pt-sm-14{padding-top:56px!important}.v-application .pt-sm-15{padding-top:60px!important}.v-application .pt-sm-16{padding-top:64px!important}.v-application .pr-sm-0{padding-right:0!important}.v-application .pr-sm-1{padding-right:4px!important}.v-application .pr-sm-2{padding-right:8px!important}.v-application .pr-sm-3{padding-right:12px!important}.v-application .pr-sm-4{padding-right:16px!important}.v-application .pr-sm-5{padding-right:20px!important}.v-application .pr-sm-6{padding-right:24px!important}.v-application .pr-sm-7{padding-right:28px!important}.v-application .pr-sm-8{padding-right:32px!important}.v-application .pr-sm-9{padding-right:36px!important}.v-application .pr-sm-10{padding-right:40px!important}.v-application .pr-sm-11{padding-right:44px!important}.v-application .pr-sm-12{padding-right:48px!important}.v-application .pr-sm-13{padding-right:52px!important}.v-application .pr-sm-14{padding-right:56px!important}.v-application .pr-sm-15{padding-right:60px!important}.v-application .pr-sm-16{padding-right:64px!important}.v-application .pb-sm-0{padding-bottom:0!important}.v-application .pb-sm-1{padding-bottom:4px!important}.v-application .pb-sm-2{padding-bottom:8px!important}.v-application .pb-sm-3{padding-bottom:12px!important}.v-application .pb-sm-4{padding-bottom:16px!important}.v-application .pb-sm-5{padding-bottom:20px!important}.v-application .pb-sm-6{padding-bottom:24px!important}.v-application .pb-sm-7{padding-bottom:28px!important}.v-application .pb-sm-8{padding-bottom:32px!important}.v-application .pb-sm-9{padding-bottom:36px!important}.v-application .pb-sm-10{padding-bottom:40px!important}.v-application .pb-sm-11{padding-bottom:44px!important}.v-application .pb-sm-12{padding-bottom:48px!important}.v-application .pb-sm-13{padding-bottom:52px!important}.v-application .pb-sm-14{padding-bottom:56px!important}.v-application .pb-sm-15{padding-bottom:60px!important}.v-application .pb-sm-16{padding-bottom:64px!important}.v-application .pl-sm-0{padding-left:0!important}.v-application .pl-sm-1{padding-left:4px!important}.v-application .pl-sm-2{padding-left:8px!important}.v-application .pl-sm-3{padding-left:12px!important}.v-application .pl-sm-4{padding-left:16px!important}.v-application .pl-sm-5{padding-left:20px!important}.v-application .pl-sm-6{padding-left:24px!important}.v-application .pl-sm-7{padding-left:28px!important}.v-application .pl-sm-8{padding-left:32px!important}.v-application .pl-sm-9{padding-left:36px!important}.v-application .pl-sm-10{padding-left:40px!important}.v-application .pl-sm-11{padding-left:44px!important}.v-application .pl-sm-12{padding-left:48px!important}.v-application .pl-sm-13{padding-left:52px!important}.v-application .pl-sm-14{padding-left:56px!important}.v-application .pl-sm-15{padding-left:60px!important}.v-application .pl-sm-16{padding-left:64px!important}.v-application--is-ltr .ps-sm-0{padding-left:0!important}.v-application--is-rtl .ps-sm-0{padding-right:0!important}.v-application--is-ltr .ps-sm-1{padding-left:4px!important}.v-application--is-rtl .ps-sm-1{padding-right:4px!important}.v-application--is-ltr .ps-sm-2{padding-left:8px!important}.v-application--is-rtl .ps-sm-2{padding-right:8px!important}.v-application--is-ltr .ps-sm-3{padding-left:12px!important}.v-application--is-rtl .ps-sm-3{padding-right:12px!important}.v-application--is-ltr .ps-sm-4{padding-left:16px!important}.v-application--is-rtl .ps-sm-4{padding-right:16px!important}.v-application--is-ltr .ps-sm-5{padding-left:20px!important}.v-application--is-rtl .ps-sm-5{padding-right:20px!important}.v-application--is-ltr .ps-sm-6{padding-left:24px!important}.v-application--is-rtl .ps-sm-6{padding-right:24px!important}.v-application--is-ltr .ps-sm-7{padding-left:28px!important}.v-application--is-rtl .ps-sm-7{padding-right:28px!important}.v-application--is-ltr .ps-sm-8{padding-left:32px!important}.v-application--is-rtl .ps-sm-8{padding-right:32px!important}.v-application--is-ltr .ps-sm-9{padding-left:36px!important}.v-application--is-rtl .ps-sm-9{padding-right:36px!important}.v-application--is-ltr .ps-sm-10{padding-left:40px!important}.v-application--is-rtl .ps-sm-10{padding-right:40px!important}.v-application--is-ltr .ps-sm-11{padding-left:44px!important}.v-application--is-rtl .ps-sm-11{padding-right:44px!important}.v-application--is-ltr .ps-sm-12{padding-left:48px!important}.v-application--is-rtl .ps-sm-12{padding-right:48px!important}.v-application--is-ltr .ps-sm-13{padding-left:52px!important}.v-application--is-rtl .ps-sm-13{padding-right:52px!important}.v-application--is-ltr .ps-sm-14{padding-left:56px!important}.v-application--is-rtl .ps-sm-14{padding-right:56px!important}.v-application--is-ltr .ps-sm-15{padding-left:60px!important}.v-application--is-rtl .ps-sm-15{padding-right:60px!important}.v-application--is-ltr .ps-sm-16{padding-left:64px!important}.v-application--is-rtl .ps-sm-16{padding-right:64px!important}.v-application--is-ltr .pe-sm-0{padding-right:0!important}.v-application--is-rtl .pe-sm-0{padding-left:0!important}.v-application--is-ltr .pe-sm-1{padding-right:4px!important}.v-application--is-rtl .pe-sm-1{padding-left:4px!important}.v-application--is-ltr .pe-sm-2{padding-right:8px!important}.v-application--is-rtl .pe-sm-2{padding-left:8px!important}.v-application--is-ltr .pe-sm-3{padding-right:12px!important}.v-application--is-rtl .pe-sm-3{padding-left:12px!important}.v-application--is-ltr .pe-sm-4{padding-right:16px!important}.v-application--is-rtl .pe-sm-4{padding-left:16px!important}.v-application--is-ltr .pe-sm-5{padding-right:20px!important}.v-application--is-rtl .pe-sm-5{padding-left:20px!important}.v-application--is-ltr .pe-sm-6{padding-right:24px!important}.v-application--is-rtl .pe-sm-6{padding-left:24px!important}.v-application--is-ltr .pe-sm-7{padding-right:28px!important}.v-application--is-rtl .pe-sm-7{padding-left:28px!important}.v-application--is-ltr .pe-sm-8{padding-right:32px!important}.v-application--is-rtl .pe-sm-8{padding-left:32px!important}.v-application--is-ltr .pe-sm-9{padding-right:36px!important}.v-application--is-rtl .pe-sm-9{padding-left:36px!important}.v-application--is-ltr .pe-sm-10{padding-right:40px!important}.v-application--is-rtl .pe-sm-10{padding-left:40px!important}.v-application--is-ltr .pe-sm-11{padding-right:44px!important}.v-application--is-rtl .pe-sm-11{padding-left:44px!important}.v-application--is-ltr .pe-sm-12{padding-right:48px!important}.v-application--is-rtl .pe-sm-12{padding-left:48px!important}.v-application--is-ltr .pe-sm-13{padding-right:52px!important}.v-application--is-rtl .pe-sm-13{padding-left:52px!important}.v-application--is-ltr .pe-sm-14{padding-right:56px!important}.v-application--is-rtl .pe-sm-14{padding-left:56px!important}.v-application--is-ltr .pe-sm-15{padding-right:60px!important}.v-application--is-rtl .pe-sm-15{padding-left:60px!important}.v-application--is-ltr .pe-sm-16{padding-right:64px!important}.v-application--is-rtl .pe-sm-16{padding-left:64px!important}.v-application .text-sm-left{text-align:left!important}.v-application .text-sm-right{text-align:right!important}.v-application .text-sm-center{text-align:center!important}.v-application .text-sm-justify{text-align:justify!important}.v-application .text-sm-start{text-align:start!important}.v-application .text-sm-end{text-align:end!important}.v-application .text-sm-h1{font-size:6rem!important;line-height:6rem;letter-spacing:-.015625em!important}.v-application .text-sm-h1,.v-application .text-sm-h2{font-weight:300;font-family:Roboto,sans-serif!important}.v-application .text-sm-h2{font-size:3.75rem!important;line-height:3.75rem;letter-spacing:-.0083333333em!important}.v-application .text-sm-h3{font-size:3rem!important;line-height:3.125rem;letter-spacing:normal!important}.v-application .text-sm-h3,.v-application .text-sm-h4{font-weight:400;font-family:Roboto,sans-serif!important}.v-application .text-sm-h4{font-size:2.125rem!important;line-height:2.5rem;letter-spacing:.0073529412em!important}.v-application .text-sm-h5{font-size:1.5rem!important;font-weight:400;letter-spacing:normal!important}.v-application .text-sm-h5,.v-application .text-sm-h6{line-height:2rem;font-family:Roboto,sans-serif!important}.v-application .text-sm-h6{font-size:1.25rem!important;font-weight:500;letter-spacing:.0125em!important}.v-application .text-sm-subtitle-1{font-size:1rem!important;font-weight:400;line-height:1.75rem;letter-spacing:.009375em!important;font-family:Roboto,sans-serif!important}.v-application .text-sm-subtitle-2{font-size:.875rem!important;font-weight:500;line-height:1.375rem;letter-spacing:.0071428571em!important;font-family:Roboto,sans-serif!important}.v-application .text-sm-body-1{font-size:1rem!important;font-weight:400;line-height:1.5rem;letter-spacing:.03125em!important;font-family:Roboto,sans-serif!important}.v-application .text-sm-body-2{font-weight:400;line-height:1.25rem;letter-spacing:.0178571429em!important}.v-application .text-sm-body-2,.v-application .text-sm-button{font-size:.875rem!important;font-family:Roboto,sans-serif!important}.v-application .text-sm-button{font-weight:500;line-height:2.25rem;letter-spacing:.0892857143em!important;text-transform:uppercase!important}.v-application .text-sm-caption{font-weight:400;line-height:1.25rem;letter-spacing:.0333333333em!important}.v-application .text-sm-caption,.v-application .text-sm-overline{font-size:.75rem!important;font-family:Roboto,sans-serif!important}.v-application .text-sm-overline{font-weight:500;line-height:2rem;letter-spacing:.1666666667em!important;text-transform:uppercase!important}}@media(min-width:960px){.v-application .d-md-none{display:none!important}.v-application .d-md-inline{display:inline!important}.v-application .d-md-inline-block{display:inline-block!important}.v-application .d-md-block{display:block!important}.v-application .d-md-table{display:table!important}.v-application .d-md-table-row{display:table-row!important}.v-application .d-md-table-cell{display:table-cell!important}.v-application .d-md-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.v-application .d-md-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}.v-application .float-md-none{float:none!important}.v-application .float-md-left{float:left!important}.v-application .float-md-right{float:right!important}.v-application--is-rtl .float-md-end{float:left!important}.v-application--is-ltr .float-md-end,.v-application--is-rtl .float-md-start{float:right!important}.v-application--is-ltr .float-md-start{float:left!important}.v-application .flex-md-fill{-webkit-box-flex:1!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.v-application .flex-md-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.v-application .flex-md-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.v-application .flex-md-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.v-application .flex-md-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.v-application .flex-md-grow-0{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.v-application .flex-md-grow-1{-webkit-box-flex:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.v-application .flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.v-application .flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.v-application .flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.v-application .flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.v-application .flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.v-application .justify-md-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.v-application .justify-md-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.v-application .justify-md-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.v-application .justify-md-space-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.v-application .justify-md-space-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.v-application .align-md-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.v-application .align-md-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.v-application .align-md-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.v-application .align-md-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.v-application .align-md-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.v-application .align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.v-application .align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.v-application .align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.v-application .align-content-md-space-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.v-application .align-content-md-space-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.v-application .align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.v-application .align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.v-application .align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.v-application .align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.v-application .align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.v-application .align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.v-application .align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}.v-application .order-md-first{-webkit-box-ordinal-group:0!important;-ms-flex-order:-1!important;order:-1!important}.v-application .order-md-0{-webkit-box-ordinal-group:1!important;-ms-flex-order:0!important;order:0!important}.v-application .order-md-1{-webkit-box-ordinal-group:2!important;-ms-flex-order:1!important;order:1!important}.v-application .order-md-2{-webkit-box-ordinal-group:3!important;-ms-flex-order:2!important;order:2!important}.v-application .order-md-3{-webkit-box-ordinal-group:4!important;-ms-flex-order:3!important;order:3!important}.v-application .order-md-4{-webkit-box-ordinal-group:5!important;-ms-flex-order:4!important;order:4!important}.v-application .order-md-5{-webkit-box-ordinal-group:6!important;-ms-flex-order:5!important;order:5!important}.v-application .order-md-6{-webkit-box-ordinal-group:7!important;-ms-flex-order:6!important;order:6!important}.v-application .order-md-7{-webkit-box-ordinal-group:8!important;-ms-flex-order:7!important;order:7!important}.v-application .order-md-8{-webkit-box-ordinal-group:9!important;-ms-flex-order:8!important;order:8!important}.v-application .order-md-9{-webkit-box-ordinal-group:10!important;-ms-flex-order:9!important;order:9!important}.v-application .order-md-10{-webkit-box-ordinal-group:11!important;-ms-flex-order:10!important;order:10!important}.v-application .order-md-11{-webkit-box-ordinal-group:12!important;-ms-flex-order:11!important;order:11!important}.v-application .order-md-12{-webkit-box-ordinal-group:13!important;-ms-flex-order:12!important;order:12!important}.v-application .order-md-last{-webkit-box-ordinal-group:14!important;-ms-flex-order:13!important;order:13!important}.v-application .ma-md-0{margin:0!important}.v-application .ma-md-1{margin:4px!important}.v-application .ma-md-2{margin:8px!important}.v-application .ma-md-3{margin:12px!important}.v-application .ma-md-4{margin:16px!important}.v-application .ma-md-5{margin:20px!important}.v-application .ma-md-6{margin:24px!important}.v-application .ma-md-7{margin:28px!important}.v-application .ma-md-8{margin:32px!important}.v-application .ma-md-9{margin:36px!important}.v-application .ma-md-10{margin:40px!important}.v-application .ma-md-11{margin:44px!important}.v-application .ma-md-12{margin:48px!important}.v-application .ma-md-13{margin:52px!important}.v-application .ma-md-14{margin:56px!important}.v-application .ma-md-15{margin:60px!important}.v-application .ma-md-16{margin:64px!important}.v-application .ma-md-auto{margin:auto!important}.v-application .mx-md-0{margin-right:0!important;margin-left:0!important}.v-application .mx-md-1{margin-right:4px!important;margin-left:4px!important}.v-application .mx-md-2{margin-right:8px!important;margin-left:8px!important}.v-application .mx-md-3{margin-right:12px!important;margin-left:12px!important}.v-application .mx-md-4{margin-right:16px!important;margin-left:16px!important}.v-application .mx-md-5{margin-right:20px!important;margin-left:20px!important}.v-application .mx-md-6{margin-right:24px!important;margin-left:24px!important}.v-application .mx-md-7{margin-right:28px!important;margin-left:28px!important}.v-application .mx-md-8{margin-right:32px!important;margin-left:32px!important}.v-application .mx-md-9{margin-right:36px!important;margin-left:36px!important}.v-application .mx-md-10{margin-right:40px!important;margin-left:40px!important}.v-application .mx-md-11{margin-right:44px!important;margin-left:44px!important}.v-application .mx-md-12{margin-right:48px!important;margin-left:48px!important}.v-application .mx-md-13{margin-right:52px!important;margin-left:52px!important}.v-application .mx-md-14{margin-right:56px!important;margin-left:56px!important}.v-application .mx-md-15{margin-right:60px!important;margin-left:60px!important}.v-application .mx-md-16{margin-right:64px!important;margin-left:64px!important}.v-application .mx-md-auto{margin-right:auto!important;margin-left:auto!important}.v-application .my-md-0{margin-top:0!important;margin-bottom:0!important}.v-application .my-md-1{margin-top:4px!important;margin-bottom:4px!important}.v-application .my-md-2{margin-top:8px!important;margin-bottom:8px!important}.v-application .my-md-3{margin-top:12px!important;margin-bottom:12px!important}.v-application .my-md-4{margin-top:16px!important;margin-bottom:16px!important}.v-application .my-md-5{margin-top:20px!important;margin-bottom:20px!important}.v-application .my-md-6{margin-top:24px!important;margin-bottom:24px!important}.v-application .my-md-7{margin-top:28px!important;margin-bottom:28px!important}.v-application .my-md-8{margin-top:32px!important;margin-bottom:32px!important}.v-application .my-md-9{margin-top:36px!important;margin-bottom:36px!important}.v-application .my-md-10{margin-top:40px!important;margin-bottom:40px!important}.v-application .my-md-11{margin-top:44px!important;margin-bottom:44px!important}.v-application .my-md-12{margin-top:48px!important;margin-bottom:48px!important}.v-application .my-md-13{margin-top:52px!important;margin-bottom:52px!important}.v-application .my-md-14{margin-top:56px!important;margin-bottom:56px!important}.v-application .my-md-15{margin-top:60px!important;margin-bottom:60px!important}.v-application .my-md-16{margin-top:64px!important;margin-bottom:64px!important}.v-application .my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.v-application .mt-md-0{margin-top:0!important}.v-application .mt-md-1{margin-top:4px!important}.v-application .mt-md-2{margin-top:8px!important}.v-application .mt-md-3{margin-top:12px!important}.v-application .mt-md-4{margin-top:16px!important}.v-application .mt-md-5{margin-top:20px!important}.v-application .mt-md-6{margin-top:24px!important}.v-application .mt-md-7{margin-top:28px!important}.v-application .mt-md-8{margin-top:32px!important}.v-application .mt-md-9{margin-top:36px!important}.v-application .mt-md-10{margin-top:40px!important}.v-application .mt-md-11{margin-top:44px!important}.v-application .mt-md-12{margin-top:48px!important}.v-application .mt-md-13{margin-top:52px!important}.v-application .mt-md-14{margin-top:56px!important}.v-application .mt-md-15{margin-top:60px!important}.v-application .mt-md-16{margin-top:64px!important}.v-application .mt-md-auto{margin-top:auto!important}.v-application .mr-md-0{margin-right:0!important}.v-application .mr-md-1{margin-right:4px!important}.v-application .mr-md-2{margin-right:8px!important}.v-application .mr-md-3{margin-right:12px!important}.v-application .mr-md-4{margin-right:16px!important}.v-application .mr-md-5{margin-right:20px!important}.v-application .mr-md-6{margin-right:24px!important}.v-application .mr-md-7{margin-right:28px!important}.v-application .mr-md-8{margin-right:32px!important}.v-application .mr-md-9{margin-right:36px!important}.v-application .mr-md-10{margin-right:40px!important}.v-application .mr-md-11{margin-right:44px!important}.v-application .mr-md-12{margin-right:48px!important}.v-application .mr-md-13{margin-right:52px!important}.v-application .mr-md-14{margin-right:56px!important}.v-application .mr-md-15{margin-right:60px!important}.v-application .mr-md-16{margin-right:64px!important}.v-application .mr-md-auto{margin-right:auto!important}.v-application .mb-md-0{margin-bottom:0!important}.v-application .mb-md-1{margin-bottom:4px!important}.v-application .mb-md-2{margin-bottom:8px!important}.v-application .mb-md-3{margin-bottom:12px!important}.v-application .mb-md-4{margin-bottom:16px!important}.v-application .mb-md-5{margin-bottom:20px!important}.v-application .mb-md-6{margin-bottom:24px!important}.v-application .mb-md-7{margin-bottom:28px!important}.v-application .mb-md-8{margin-bottom:32px!important}.v-application .mb-md-9{margin-bottom:36px!important}.v-application .mb-md-10{margin-bottom:40px!important}.v-application .mb-md-11{margin-bottom:44px!important}.v-application .mb-md-12{margin-bottom:48px!important}.v-application .mb-md-13{margin-bottom:52px!important}.v-application .mb-md-14{margin-bottom:56px!important}.v-application .mb-md-15{margin-bottom:60px!important}.v-application .mb-md-16{margin-bottom:64px!important}.v-application .mb-md-auto{margin-bottom:auto!important}.v-application .ml-md-0{margin-left:0!important}.v-application .ml-md-1{margin-left:4px!important}.v-application .ml-md-2{margin-left:8px!important}.v-application .ml-md-3{margin-left:12px!important}.v-application .ml-md-4{margin-left:16px!important}.v-application .ml-md-5{margin-left:20px!important}.v-application .ml-md-6{margin-left:24px!important}.v-application .ml-md-7{margin-left:28px!important}.v-application .ml-md-8{margin-left:32px!important}.v-application .ml-md-9{margin-left:36px!important}.v-application .ml-md-10{margin-left:40px!important}.v-application .ml-md-11{margin-left:44px!important}.v-application .ml-md-12{margin-left:48px!important}.v-application .ml-md-13{margin-left:52px!important}.v-application .ml-md-14{margin-left:56px!important}.v-application .ml-md-15{margin-left:60px!important}.v-application .ml-md-16{margin-left:64px!important}.v-application .ml-md-auto{margin-left:auto!important}.v-application--is-ltr .ms-md-0{margin-left:0!important}.v-application--is-rtl .ms-md-0{margin-right:0!important}.v-application--is-ltr .ms-md-1{margin-left:4px!important}.v-application--is-rtl .ms-md-1{margin-right:4px!important}.v-application--is-ltr .ms-md-2{margin-left:8px!important}.v-application--is-rtl .ms-md-2{margin-right:8px!important}.v-application--is-ltr .ms-md-3{margin-left:12px!important}.v-application--is-rtl .ms-md-3{margin-right:12px!important}.v-application--is-ltr .ms-md-4{margin-left:16px!important}.v-application--is-rtl .ms-md-4{margin-right:16px!important}.v-application--is-ltr .ms-md-5{margin-left:20px!important}.v-application--is-rtl .ms-md-5{margin-right:20px!important}.v-application--is-ltr .ms-md-6{margin-left:24px!important}.v-application--is-rtl .ms-md-6{margin-right:24px!important}.v-application--is-ltr .ms-md-7{margin-left:28px!important}.v-application--is-rtl .ms-md-7{margin-right:28px!important}.v-application--is-ltr .ms-md-8{margin-left:32px!important}.v-application--is-rtl .ms-md-8{margin-right:32px!important}.v-application--is-ltr .ms-md-9{margin-left:36px!important}.v-application--is-rtl .ms-md-9{margin-right:36px!important}.v-application--is-ltr .ms-md-10{margin-left:40px!important}.v-application--is-rtl .ms-md-10{margin-right:40px!important}.v-application--is-ltr .ms-md-11{margin-left:44px!important}.v-application--is-rtl .ms-md-11{margin-right:44px!important}.v-application--is-ltr .ms-md-12{margin-left:48px!important}.v-application--is-rtl .ms-md-12{margin-right:48px!important}.v-application--is-ltr .ms-md-13{margin-left:52px!important}.v-application--is-rtl .ms-md-13{margin-right:52px!important}.v-application--is-ltr .ms-md-14{margin-left:56px!important}.v-application--is-rtl .ms-md-14{margin-right:56px!important}.v-application--is-ltr .ms-md-15{margin-left:60px!important}.v-application--is-rtl .ms-md-15{margin-right:60px!important}.v-application--is-ltr .ms-md-16{margin-left:64px!important}.v-application--is-rtl .ms-md-16{margin-right:64px!important}.v-application--is-ltr .ms-md-auto{margin-left:auto!important}.v-application--is-rtl .ms-md-auto{margin-right:auto!important}.v-application--is-ltr .me-md-0{margin-right:0!important}.v-application--is-rtl .me-md-0{margin-left:0!important}.v-application--is-ltr .me-md-1{margin-right:4px!important}.v-application--is-rtl .me-md-1{margin-left:4px!important}.v-application--is-ltr .me-md-2{margin-right:8px!important}.v-application--is-rtl .me-md-2{margin-left:8px!important}.v-application--is-ltr .me-md-3{margin-right:12px!important}.v-application--is-rtl .me-md-3{margin-left:12px!important}.v-application--is-ltr .me-md-4{margin-right:16px!important}.v-application--is-rtl .me-md-4{margin-left:16px!important}.v-application--is-ltr .me-md-5{margin-right:20px!important}.v-application--is-rtl .me-md-5{margin-left:20px!important}.v-application--is-ltr .me-md-6{margin-right:24px!important}.v-application--is-rtl .me-md-6{margin-left:24px!important}.v-application--is-ltr .me-md-7{margin-right:28px!important}.v-application--is-rtl .me-md-7{margin-left:28px!important}.v-application--is-ltr .me-md-8{margin-right:32px!important}.v-application--is-rtl .me-md-8{margin-left:32px!important}.v-application--is-ltr .me-md-9{margin-right:36px!important}.v-application--is-rtl .me-md-9{margin-left:36px!important}.v-application--is-ltr .me-md-10{margin-right:40px!important}.v-application--is-rtl .me-md-10{margin-left:40px!important}.v-application--is-ltr .me-md-11{margin-right:44px!important}.v-application--is-rtl .me-md-11{margin-left:44px!important}.v-application--is-ltr .me-md-12{margin-right:48px!important}.v-application--is-rtl .me-md-12{margin-left:48px!important}.v-application--is-ltr .me-md-13{margin-right:52px!important}.v-application--is-rtl .me-md-13{margin-left:52px!important}.v-application--is-ltr .me-md-14{margin-right:56px!important}.v-application--is-rtl .me-md-14{margin-left:56px!important}.v-application--is-ltr .me-md-15{margin-right:60px!important}.v-application--is-rtl .me-md-15{margin-left:60px!important}.v-application--is-ltr .me-md-16{margin-right:64px!important}.v-application--is-rtl .me-md-16{margin-left:64px!important}.v-application--is-ltr .me-md-auto{margin-right:auto!important}.v-application--is-rtl .me-md-auto{margin-left:auto!important}.v-application .ma-md-n1{margin:-4px!important}.v-application .ma-md-n2{margin:-8px!important}.v-application .ma-md-n3{margin:-12px!important}.v-application .ma-md-n4{margin:-16px!important}.v-application .ma-md-n5{margin:-20px!important}.v-application .ma-md-n6{margin:-24px!important}.v-application .ma-md-n7{margin:-28px!important}.v-application .ma-md-n8{margin:-32px!important}.v-application .ma-md-n9{margin:-36px!important}.v-application .ma-md-n10{margin:-40px!important}.v-application .ma-md-n11{margin:-44px!important}.v-application .ma-md-n12{margin:-48px!important}.v-application .ma-md-n13{margin:-52px!important}.v-application .ma-md-n14{margin:-56px!important}.v-application .ma-md-n15{margin:-60px!important}.v-application .ma-md-n16{margin:-64px!important}.v-application .mx-md-n1{margin-right:-4px!important;margin-left:-4px!important}.v-application .mx-md-n2{margin-right:-8px!important;margin-left:-8px!important}.v-application .mx-md-n3{margin-right:-12px!important;margin-left:-12px!important}.v-application .mx-md-n4{margin-right:-16px!important;margin-left:-16px!important}.v-application .mx-md-n5{margin-right:-20px!important;margin-left:-20px!important}.v-application .mx-md-n6{margin-right:-24px!important;margin-left:-24px!important}.v-application .mx-md-n7{margin-right:-28px!important;margin-left:-28px!important}.v-application .mx-md-n8{margin-right:-32px!important;margin-left:-32px!important}.v-application .mx-md-n9{margin-right:-36px!important;margin-left:-36px!important}.v-application .mx-md-n10{margin-right:-40px!important;margin-left:-40px!important}.v-application .mx-md-n11{margin-right:-44px!important;margin-left:-44px!important}.v-application .mx-md-n12{margin-right:-48px!important;margin-left:-48px!important}.v-application .mx-md-n13{margin-right:-52px!important;margin-left:-52px!important}.v-application .mx-md-n14{margin-right:-56px!important;margin-left:-56px!important}.v-application .mx-md-n15{margin-right:-60px!important;margin-left:-60px!important}.v-application .mx-md-n16{margin-right:-64px!important;margin-left:-64px!important}.v-application .my-md-n1{margin-top:-4px!important;margin-bottom:-4px!important}.v-application .my-md-n2{margin-top:-8px!important;margin-bottom:-8px!important}.v-application .my-md-n3{margin-top:-12px!important;margin-bottom:-12px!important}.v-application .my-md-n4{margin-top:-16px!important;margin-bottom:-16px!important}.v-application .my-md-n5{margin-top:-20px!important;margin-bottom:-20px!important}.v-application .my-md-n6{margin-top:-24px!important;margin-bottom:-24px!important}.v-application .my-md-n7{margin-top:-28px!important;margin-bottom:-28px!important}.v-application .my-md-n8{margin-top:-32px!important;margin-bottom:-32px!important}.v-application .my-md-n9{margin-top:-36px!important;margin-bottom:-36px!important}.v-application .my-md-n10{margin-top:-40px!important;margin-bottom:-40px!important}.v-application .my-md-n11{margin-top:-44px!important;margin-bottom:-44px!important}.v-application .my-md-n12{margin-top:-48px!important;margin-bottom:-48px!important}.v-application .my-md-n13{margin-top:-52px!important;margin-bottom:-52px!important}.v-application .my-md-n14{margin-top:-56px!important;margin-bottom:-56px!important}.v-application .my-md-n15{margin-top:-60px!important;margin-bottom:-60px!important}.v-application .my-md-n16{margin-top:-64px!important;margin-bottom:-64px!important}.v-application .mt-md-n1{margin-top:-4px!important}.v-application .mt-md-n2{margin-top:-8px!important}.v-application .mt-md-n3{margin-top:-12px!important}.v-application .mt-md-n4{margin-top:-16px!important}.v-application .mt-md-n5{margin-top:-20px!important}.v-application .mt-md-n6{margin-top:-24px!important}.v-application .mt-md-n7{margin-top:-28px!important}.v-application .mt-md-n8{margin-top:-32px!important}.v-application .mt-md-n9{margin-top:-36px!important}.v-application .mt-md-n10{margin-top:-40px!important}.v-application .mt-md-n11{margin-top:-44px!important}.v-application .mt-md-n12{margin-top:-48px!important}.v-application .mt-md-n13{margin-top:-52px!important}.v-application .mt-md-n14{margin-top:-56px!important}.v-application .mt-md-n15{margin-top:-60px!important}.v-application .mt-md-n16{margin-top:-64px!important}.v-application .mr-md-n1{margin-right:-4px!important}.v-application .mr-md-n2{margin-right:-8px!important}.v-application .mr-md-n3{margin-right:-12px!important}.v-application .mr-md-n4{margin-right:-16px!important}.v-application .mr-md-n5{margin-right:-20px!important}.v-application .mr-md-n6{margin-right:-24px!important}.v-application .mr-md-n7{margin-right:-28px!important}.v-application .mr-md-n8{margin-right:-32px!important}.v-application .mr-md-n9{margin-right:-36px!important}.v-application .mr-md-n10{margin-right:-40px!important}.v-application .mr-md-n11{margin-right:-44px!important}.v-application .mr-md-n12{margin-right:-48px!important}.v-application .mr-md-n13{margin-right:-52px!important}.v-application .mr-md-n14{margin-right:-56px!important}.v-application .mr-md-n15{margin-right:-60px!important}.v-application .mr-md-n16{margin-right:-64px!important}.v-application .mb-md-n1{margin-bottom:-4px!important}.v-application .mb-md-n2{margin-bottom:-8px!important}.v-application .mb-md-n3{margin-bottom:-12px!important}.v-application .mb-md-n4{margin-bottom:-16px!important}.v-application .mb-md-n5{margin-bottom:-20px!important}.v-application .mb-md-n6{margin-bottom:-24px!important}.v-application .mb-md-n7{margin-bottom:-28px!important}.v-application .mb-md-n8{margin-bottom:-32px!important}.v-application .mb-md-n9{margin-bottom:-36px!important}.v-application .mb-md-n10{margin-bottom:-40px!important}.v-application .mb-md-n11{margin-bottom:-44px!important}.v-application .mb-md-n12{margin-bottom:-48px!important}.v-application .mb-md-n13{margin-bottom:-52px!important}.v-application .mb-md-n14{margin-bottom:-56px!important}.v-application .mb-md-n15{margin-bottom:-60px!important}.v-application .mb-md-n16{margin-bottom:-64px!important}.v-application .ml-md-n1{margin-left:-4px!important}.v-application .ml-md-n2{margin-left:-8px!important}.v-application .ml-md-n3{margin-left:-12px!important}.v-application .ml-md-n4{margin-left:-16px!important}.v-application .ml-md-n5{margin-left:-20px!important}.v-application .ml-md-n6{margin-left:-24px!important}.v-application .ml-md-n7{margin-left:-28px!important}.v-application .ml-md-n8{margin-left:-32px!important}.v-application .ml-md-n9{margin-left:-36px!important}.v-application .ml-md-n10{margin-left:-40px!important}.v-application .ml-md-n11{margin-left:-44px!important}.v-application .ml-md-n12{margin-left:-48px!important}.v-application .ml-md-n13{margin-left:-52px!important}.v-application .ml-md-n14{margin-left:-56px!important}.v-application .ml-md-n15{margin-left:-60px!important}.v-application .ml-md-n16{margin-left:-64px!important}.v-application--is-ltr .ms-md-n1{margin-left:-4px!important}.v-application--is-rtl .ms-md-n1{margin-right:-4px!important}.v-application--is-ltr .ms-md-n2{margin-left:-8px!important}.v-application--is-rtl .ms-md-n2{margin-right:-8px!important}.v-application--is-ltr .ms-md-n3{margin-left:-12px!important}.v-application--is-rtl .ms-md-n3{margin-right:-12px!important}.v-application--is-ltr .ms-md-n4{margin-left:-16px!important}.v-application--is-rtl .ms-md-n4{margin-right:-16px!important}.v-application--is-ltr .ms-md-n5{margin-left:-20px!important}.v-application--is-rtl .ms-md-n5{margin-right:-20px!important}.v-application--is-ltr .ms-md-n6{margin-left:-24px!important}.v-application--is-rtl .ms-md-n6{margin-right:-24px!important}.v-application--is-ltr .ms-md-n7{margin-left:-28px!important}.v-application--is-rtl .ms-md-n7{margin-right:-28px!important}.v-application--is-ltr .ms-md-n8{margin-left:-32px!important}.v-application--is-rtl .ms-md-n8{margin-right:-32px!important}.v-application--is-ltr .ms-md-n9{margin-left:-36px!important}.v-application--is-rtl .ms-md-n9{margin-right:-36px!important}.v-application--is-ltr .ms-md-n10{margin-left:-40px!important}.v-application--is-rtl .ms-md-n10{margin-right:-40px!important}.v-application--is-ltr .ms-md-n11{margin-left:-44px!important}.v-application--is-rtl .ms-md-n11{margin-right:-44px!important}.v-application--is-ltr .ms-md-n12{margin-left:-48px!important}.v-application--is-rtl .ms-md-n12{margin-right:-48px!important}.v-application--is-ltr .ms-md-n13{margin-left:-52px!important}.v-application--is-rtl .ms-md-n13{margin-right:-52px!important}.v-application--is-ltr .ms-md-n14{margin-left:-56px!important}.v-application--is-rtl .ms-md-n14{margin-right:-56px!important}.v-application--is-ltr .ms-md-n15{margin-left:-60px!important}.v-application--is-rtl .ms-md-n15{margin-right:-60px!important}.v-application--is-ltr .ms-md-n16{margin-left:-64px!important}.v-application--is-rtl .ms-md-n16{margin-right:-64px!important}.v-application--is-ltr .me-md-n1{margin-right:-4px!important}.v-application--is-rtl .me-md-n1{margin-left:-4px!important}.v-application--is-ltr .me-md-n2{margin-right:-8px!important}.v-application--is-rtl .me-md-n2{margin-left:-8px!important}.v-application--is-ltr .me-md-n3{margin-right:-12px!important}.v-application--is-rtl .me-md-n3{margin-left:-12px!important}.v-application--is-ltr .me-md-n4{margin-right:-16px!important}.v-application--is-rtl .me-md-n4{margin-left:-16px!important}.v-application--is-ltr .me-md-n5{margin-right:-20px!important}.v-application--is-rtl .me-md-n5{margin-left:-20px!important}.v-application--is-ltr .me-md-n6{margin-right:-24px!important}.v-application--is-rtl .me-md-n6{margin-left:-24px!important}.v-application--is-ltr .me-md-n7{margin-right:-28px!important}.v-application--is-rtl .me-md-n7{margin-left:-28px!important}.v-application--is-ltr .me-md-n8{margin-right:-32px!important}.v-application--is-rtl .me-md-n8{margin-left:-32px!important}.v-application--is-ltr .me-md-n9{margin-right:-36px!important}.v-application--is-rtl .me-md-n9{margin-left:-36px!important}.v-application--is-ltr .me-md-n10{margin-right:-40px!important}.v-application--is-rtl .me-md-n10{margin-left:-40px!important}.v-application--is-ltr .me-md-n11{margin-right:-44px!important}.v-application--is-rtl .me-md-n11{margin-left:-44px!important}.v-application--is-ltr .me-md-n12{margin-right:-48px!important}.v-application--is-rtl .me-md-n12{margin-left:-48px!important}.v-application--is-ltr .me-md-n13{margin-right:-52px!important}.v-application--is-rtl .me-md-n13{margin-left:-52px!important}.v-application--is-ltr .me-md-n14{margin-right:-56px!important}.v-application--is-rtl .me-md-n14{margin-left:-56px!important}.v-application--is-ltr .me-md-n15{margin-right:-60px!important}.v-application--is-rtl .me-md-n15{margin-left:-60px!important}.v-application--is-ltr .me-md-n16{margin-right:-64px!important}.v-application--is-rtl .me-md-n16{margin-left:-64px!important}.v-application .pa-md-0{padding:0!important}.v-application .pa-md-1{padding:4px!important}.v-application .pa-md-2{padding:8px!important}.v-application .pa-md-3{padding:12px!important}.v-application .pa-md-4{padding:16px!important}.v-application .pa-md-5{padding:20px!important}.v-application .pa-md-6{padding:24px!important}.v-application .pa-md-7{padding:28px!important}.v-application .pa-md-8{padding:32px!important}.v-application .pa-md-9{padding:36px!important}.v-application .pa-md-10{padding:40px!important}.v-application .pa-md-11{padding:44px!important}.v-application .pa-md-12{padding:48px!important}.v-application .pa-md-13{padding:52px!important}.v-application .pa-md-14{padding:56px!important}.v-application .pa-md-15{padding:60px!important}.v-application .pa-md-16{padding:64px!important}.v-application .px-md-0{padding-right:0!important;padding-left:0!important}.v-application .px-md-1{padding-right:4px!important;padding-left:4px!important}.v-application .px-md-2{padding-right:8px!important;padding-left:8px!important}.v-application .px-md-3{padding-right:12px!important;padding-left:12px!important}.v-application .px-md-4{padding-right:16px!important;padding-left:16px!important}.v-application .px-md-5{padding-right:20px!important;padding-left:20px!important}.v-application .px-md-6{padding-right:24px!important;padding-left:24px!important}.v-application .px-md-7{padding-right:28px!important;padding-left:28px!important}.v-application .px-md-8{padding-right:32px!important;padding-left:32px!important}.v-application .px-md-9{padding-right:36px!important;padding-left:36px!important}.v-application .px-md-10{padding-right:40px!important;padding-left:40px!important}.v-application .px-md-11{padding-right:44px!important;padding-left:44px!important}.v-application .px-md-12{padding-right:48px!important;padding-left:48px!important}.v-application .px-md-13{padding-right:52px!important;padding-left:52px!important}.v-application .px-md-14{padding-right:56px!important;padding-left:56px!important}.v-application .px-md-15{padding-right:60px!important;padding-left:60px!important}.v-application .px-md-16{padding-right:64px!important;padding-left:64px!important}.v-application .py-md-0{padding-top:0!important;padding-bottom:0!important}.v-application .py-md-1{padding-top:4px!important;padding-bottom:4px!important}.v-application .py-md-2{padding-top:8px!important;padding-bottom:8px!important}.v-application .py-md-3{padding-top:12px!important;padding-bottom:12px!important}.v-application .py-md-4{padding-top:16px!important;padding-bottom:16px!important}.v-application .py-md-5{padding-top:20px!important;padding-bottom:20px!important}.v-application .py-md-6{padding-top:24px!important;padding-bottom:24px!important}.v-application .py-md-7{padding-top:28px!important;padding-bottom:28px!important}.v-application .py-md-8{padding-top:32px!important;padding-bottom:32px!important}.v-application .py-md-9{padding-top:36px!important;padding-bottom:36px!important}.v-application .py-md-10{padding-top:40px!important;padding-bottom:40px!important}.v-application .py-md-11{padding-top:44px!important;padding-bottom:44px!important}.v-application .py-md-12{padding-top:48px!important;padding-bottom:48px!important}.v-application .py-md-13{padding-top:52px!important;padding-bottom:52px!important}.v-application .py-md-14{padding-top:56px!important;padding-bottom:56px!important}.v-application .py-md-15{padding-top:60px!important;padding-bottom:60px!important}.v-application .py-md-16{padding-top:64px!important;padding-bottom:64px!important}.v-application .pt-md-0{padding-top:0!important}.v-application .pt-md-1{padding-top:4px!important}.v-application .pt-md-2{padding-top:8px!important}.v-application .pt-md-3{padding-top:12px!important}.v-application .pt-md-4{padding-top:16px!important}.v-application .pt-md-5{padding-top:20px!important}.v-application .pt-md-6{padding-top:24px!important}.v-application .pt-md-7{padding-top:28px!important}.v-application .pt-md-8{padding-top:32px!important}.v-application .pt-md-9{padding-top:36px!important}.v-application .pt-md-10{padding-top:40px!important}.v-application .pt-md-11{padding-top:44px!important}.v-application .pt-md-12{padding-top:48px!important}.v-application .pt-md-13{padding-top:52px!important}.v-application .pt-md-14{padding-top:56px!important}.v-application .pt-md-15{padding-top:60px!important}.v-application .pt-md-16{padding-top:64px!important}.v-application .pr-md-0{padding-right:0!important}.v-application .pr-md-1{padding-right:4px!important}.v-application .pr-md-2{padding-right:8px!important}.v-application .pr-md-3{padding-right:12px!important}.v-application .pr-md-4{padding-right:16px!important}.v-application .pr-md-5{padding-right:20px!important}.v-application .pr-md-6{padding-right:24px!important}.v-application .pr-md-7{padding-right:28px!important}.v-application .pr-md-8{padding-right:32px!important}.v-application .pr-md-9{padding-right:36px!important}.v-application .pr-md-10{padding-right:40px!important}.v-application .pr-md-11{padding-right:44px!important}.v-application .pr-md-12{padding-right:48px!important}.v-application .pr-md-13{padding-right:52px!important}.v-application .pr-md-14{padding-right:56px!important}.v-application .pr-md-15{padding-right:60px!important}.v-application .pr-md-16{padding-right:64px!important}.v-application .pb-md-0{padding-bottom:0!important}.v-application .pb-md-1{padding-bottom:4px!important}.v-application .pb-md-2{padding-bottom:8px!important}.v-application .pb-md-3{padding-bottom:12px!important}.v-application .pb-md-4{padding-bottom:16px!important}.v-application .pb-md-5{padding-bottom:20px!important}.v-application .pb-md-6{padding-bottom:24px!important}.v-application .pb-md-7{padding-bottom:28px!important}.v-application .pb-md-8{padding-bottom:32px!important}.v-application .pb-md-9{padding-bottom:36px!important}.v-application .pb-md-10{padding-bottom:40px!important}.v-application .pb-md-11{padding-bottom:44px!important}.v-application .pb-md-12{padding-bottom:48px!important}.v-application .pb-md-13{padding-bottom:52px!important}.v-application .pb-md-14{padding-bottom:56px!important}.v-application .pb-md-15{padding-bottom:60px!important}.v-application .pb-md-16{padding-bottom:64px!important}.v-application .pl-md-0{padding-left:0!important}.v-application .pl-md-1{padding-left:4px!important}.v-application .pl-md-2{padding-left:8px!important}.v-application .pl-md-3{padding-left:12px!important}.v-application .pl-md-4{padding-left:16px!important}.v-application .pl-md-5{padding-left:20px!important}.v-application .pl-md-6{padding-left:24px!important}.v-application .pl-md-7{padding-left:28px!important}.v-application .pl-md-8{padding-left:32px!important}.v-application .pl-md-9{padding-left:36px!important}.v-application .pl-md-10{padding-left:40px!important}.v-application .pl-md-11{padding-left:44px!important}.v-application .pl-md-12{padding-left:48px!important}.v-application .pl-md-13{padding-left:52px!important}.v-application .pl-md-14{padding-left:56px!important}.v-application .pl-md-15{padding-left:60px!important}.v-application .pl-md-16{padding-left:64px!important}.v-application--is-ltr .ps-md-0{padding-left:0!important}.v-application--is-rtl .ps-md-0{padding-right:0!important}.v-application--is-ltr .ps-md-1{padding-left:4px!important}.v-application--is-rtl .ps-md-1{padding-right:4px!important}.v-application--is-ltr .ps-md-2{padding-left:8px!important}.v-application--is-rtl .ps-md-2{padding-right:8px!important}.v-application--is-ltr .ps-md-3{padding-left:12px!important}.v-application--is-rtl .ps-md-3{padding-right:12px!important}.v-application--is-ltr .ps-md-4{padding-left:16px!important}.v-application--is-rtl .ps-md-4{padding-right:16px!important}.v-application--is-ltr .ps-md-5{padding-left:20px!important}.v-application--is-rtl .ps-md-5{padding-right:20px!important}.v-application--is-ltr .ps-md-6{padding-left:24px!important}.v-application--is-rtl .ps-md-6{padding-right:24px!important}.v-application--is-ltr .ps-md-7{padding-left:28px!important}.v-application--is-rtl .ps-md-7{padding-right:28px!important}.v-application--is-ltr .ps-md-8{padding-left:32px!important}.v-application--is-rtl .ps-md-8{padding-right:32px!important}.v-application--is-ltr .ps-md-9{padding-left:36px!important}.v-application--is-rtl .ps-md-9{padding-right:36px!important}.v-application--is-ltr .ps-md-10{padding-left:40px!important}.v-application--is-rtl .ps-md-10{padding-right:40px!important}.v-application--is-ltr .ps-md-11{padding-left:44px!important}.v-application--is-rtl .ps-md-11{padding-right:44px!important}.v-application--is-ltr .ps-md-12{padding-left:48px!important}.v-application--is-rtl .ps-md-12{padding-right:48px!important}.v-application--is-ltr .ps-md-13{padding-left:52px!important}.v-application--is-rtl .ps-md-13{padding-right:52px!important}.v-application--is-ltr .ps-md-14{padding-left:56px!important}.v-application--is-rtl .ps-md-14{padding-right:56px!important}.v-application--is-ltr .ps-md-15{padding-left:60px!important}.v-application--is-rtl .ps-md-15{padding-right:60px!important}.v-application--is-ltr .ps-md-16{padding-left:64px!important}.v-application--is-rtl .ps-md-16{padding-right:64px!important}.v-application--is-ltr .pe-md-0{padding-right:0!important}.v-application--is-rtl .pe-md-0{padding-left:0!important}.v-application--is-ltr .pe-md-1{padding-right:4px!important}.v-application--is-rtl .pe-md-1{padding-left:4px!important}.v-application--is-ltr .pe-md-2{padding-right:8px!important}.v-application--is-rtl .pe-md-2{padding-left:8px!important}.v-application--is-ltr .pe-md-3{padding-right:12px!important}.v-application--is-rtl .pe-md-3{padding-left:12px!important}.v-application--is-ltr .pe-md-4{padding-right:16px!important}.v-application--is-rtl .pe-md-4{padding-left:16px!important}.v-application--is-ltr .pe-md-5{padding-right:20px!important}.v-application--is-rtl .pe-md-5{padding-left:20px!important}.v-application--is-ltr .pe-md-6{padding-right:24px!important}.v-application--is-rtl .pe-md-6{padding-left:24px!important}.v-application--is-ltr .pe-md-7{padding-right:28px!important}.v-application--is-rtl .pe-md-7{padding-left:28px!important}.v-application--is-ltr .pe-md-8{padding-right:32px!important}.v-application--is-rtl .pe-md-8{padding-left:32px!important}.v-application--is-ltr .pe-md-9{padding-right:36px!important}.v-application--is-rtl .pe-md-9{padding-left:36px!important}.v-application--is-ltr .pe-md-10{padding-right:40px!important}.v-application--is-rtl .pe-md-10{padding-left:40px!important}.v-application--is-ltr .pe-md-11{padding-right:44px!important}.v-application--is-rtl .pe-md-11{padding-left:44px!important}.v-application--is-ltr .pe-md-12{padding-right:48px!important}.v-application--is-rtl .pe-md-12{padding-left:48px!important}.v-application--is-ltr .pe-md-13{padding-right:52px!important}.v-application--is-rtl .pe-md-13{padding-left:52px!important}.v-application--is-ltr .pe-md-14{padding-right:56px!important}.v-application--is-rtl .pe-md-14{padding-left:56px!important}.v-application--is-ltr .pe-md-15{padding-right:60px!important}.v-application--is-rtl .pe-md-15{padding-left:60px!important}.v-application--is-ltr .pe-md-16{padding-right:64px!important}.v-application--is-rtl .pe-md-16{padding-left:64px!important}.v-application .text-md-left{text-align:left!important}.v-application .text-md-right{text-align:right!important}.v-application .text-md-center{text-align:center!important}.v-application .text-md-justify{text-align:justify!important}.v-application .text-md-start{text-align:start!important}.v-application .text-md-end{text-align:end!important}.v-application .text-md-h1{font-size:6rem!important;line-height:6rem;letter-spacing:-.015625em!important}.v-application .text-md-h1,.v-application .text-md-h2{font-weight:300;font-family:Roboto,sans-serif!important}.v-application .text-md-h2{font-size:3.75rem!important;line-height:3.75rem;letter-spacing:-.0083333333em!important}.v-application .text-md-h3{font-size:3rem!important;line-height:3.125rem;letter-spacing:normal!important}.v-application .text-md-h3,.v-application .text-md-h4{font-weight:400;font-family:Roboto,sans-serif!important}.v-application .text-md-h4{font-size:2.125rem!important;line-height:2.5rem;letter-spacing:.0073529412em!important}.v-application .text-md-h5{font-size:1.5rem!important;font-weight:400;letter-spacing:normal!important}.v-application .text-md-h5,.v-application .text-md-h6{line-height:2rem;font-family:Roboto,sans-serif!important}.v-application .text-md-h6{font-size:1.25rem!important;font-weight:500;letter-spacing:.0125em!important}.v-application .text-md-subtitle-1{font-size:1rem!important;font-weight:400;line-height:1.75rem;letter-spacing:.009375em!important;font-family:Roboto,sans-serif!important}.v-application .text-md-subtitle-2{font-size:.875rem!important;font-weight:500;line-height:1.375rem;letter-spacing:.0071428571em!important;font-family:Roboto,sans-serif!important}.v-application .text-md-body-1{font-size:1rem!important;font-weight:400;line-height:1.5rem;letter-spacing:.03125em!important;font-family:Roboto,sans-serif!important}.v-application .text-md-body-2{font-weight:400;line-height:1.25rem;letter-spacing:.0178571429em!important}.v-application .text-md-body-2,.v-application .text-md-button{font-size:.875rem!important;font-family:Roboto,sans-serif!important}.v-application .text-md-button{font-weight:500;line-height:2.25rem;letter-spacing:.0892857143em!important;text-transform:uppercase!important}.v-application .text-md-caption{font-weight:400;line-height:1.25rem;letter-spacing:.0333333333em!important}.v-application .text-md-caption,.v-application .text-md-overline{font-size:.75rem!important;font-family:Roboto,sans-serif!important}.v-application .text-md-overline{font-weight:500;line-height:2rem;letter-spacing:.1666666667em!important;text-transform:uppercase!important}}@media(min-width:1264px){.v-application .d-lg-none{display:none!important}.v-application .d-lg-inline{display:inline!important}.v-application .d-lg-inline-block{display:inline-block!important}.v-application .d-lg-block{display:block!important}.v-application .d-lg-table{display:table!important}.v-application .d-lg-table-row{display:table-row!important}.v-application .d-lg-table-cell{display:table-cell!important}.v-application .d-lg-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.v-application .d-lg-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}.v-application .float-lg-none{float:none!important}.v-application .float-lg-left{float:left!important}.v-application .float-lg-right{float:right!important}.v-application--is-rtl .float-lg-end{float:left!important}.v-application--is-ltr .float-lg-end,.v-application--is-rtl .float-lg-start{float:right!important}.v-application--is-ltr .float-lg-start{float:left!important}.v-application .flex-lg-fill{-webkit-box-flex:1!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.v-application .flex-lg-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.v-application .flex-lg-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.v-application .flex-lg-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.v-application .flex-lg-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.v-application .flex-lg-grow-0{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.v-application .flex-lg-grow-1{-webkit-box-flex:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.v-application .flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.v-application .flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.v-application .flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.v-application .flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.v-application .flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.v-application .justify-lg-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.v-application .justify-lg-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.v-application .justify-lg-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.v-application .justify-lg-space-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.v-application .justify-lg-space-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.v-application .align-lg-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.v-application .align-lg-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.v-application .align-lg-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.v-application .align-lg-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.v-application .align-lg-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.v-application .align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.v-application .align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.v-application .align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.v-application .align-content-lg-space-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.v-application .align-content-lg-space-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.v-application .align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.v-application .align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.v-application .align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.v-application .align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.v-application .align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.v-application .align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.v-application .align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}.v-application .order-lg-first{-webkit-box-ordinal-group:0!important;-ms-flex-order:-1!important;order:-1!important}.v-application .order-lg-0{-webkit-box-ordinal-group:1!important;-ms-flex-order:0!important;order:0!important}.v-application .order-lg-1{-webkit-box-ordinal-group:2!important;-ms-flex-order:1!important;order:1!important}.v-application .order-lg-2{-webkit-box-ordinal-group:3!important;-ms-flex-order:2!important;order:2!important}.v-application .order-lg-3{-webkit-box-ordinal-group:4!important;-ms-flex-order:3!important;order:3!important}.v-application .order-lg-4{-webkit-box-ordinal-group:5!important;-ms-flex-order:4!important;order:4!important}.v-application .order-lg-5{-webkit-box-ordinal-group:6!important;-ms-flex-order:5!important;order:5!important}.v-application .order-lg-6{-webkit-box-ordinal-group:7!important;-ms-flex-order:6!important;order:6!important}.v-application .order-lg-7{-webkit-box-ordinal-group:8!important;-ms-flex-order:7!important;order:7!important}.v-application .order-lg-8{-webkit-box-ordinal-group:9!important;-ms-flex-order:8!important;order:8!important}.v-application .order-lg-9{-webkit-box-ordinal-group:10!important;-ms-flex-order:9!important;order:9!important}.v-application .order-lg-10{-webkit-box-ordinal-group:11!important;-ms-flex-order:10!important;order:10!important}.v-application .order-lg-11{-webkit-box-ordinal-group:12!important;-ms-flex-order:11!important;order:11!important}.v-application .order-lg-12{-webkit-box-ordinal-group:13!important;-ms-flex-order:12!important;order:12!important}.v-application .order-lg-last{-webkit-box-ordinal-group:14!important;-ms-flex-order:13!important;order:13!important}.v-application .ma-lg-0{margin:0!important}.v-application .ma-lg-1{margin:4px!important}.v-application .ma-lg-2{margin:8px!important}.v-application .ma-lg-3{margin:12px!important}.v-application .ma-lg-4{margin:16px!important}.v-application .ma-lg-5{margin:20px!important}.v-application .ma-lg-6{margin:24px!important}.v-application .ma-lg-7{margin:28px!important}.v-application .ma-lg-8{margin:32px!important}.v-application .ma-lg-9{margin:36px!important}.v-application .ma-lg-10{margin:40px!important}.v-application .ma-lg-11{margin:44px!important}.v-application .ma-lg-12{margin:48px!important}.v-application .ma-lg-13{margin:52px!important}.v-application .ma-lg-14{margin:56px!important}.v-application .ma-lg-15{margin:60px!important}.v-application .ma-lg-16{margin:64px!important}.v-application .ma-lg-auto{margin:auto!important}.v-application .mx-lg-0{margin-right:0!important;margin-left:0!important}.v-application .mx-lg-1{margin-right:4px!important;margin-left:4px!important}.v-application .mx-lg-2{margin-right:8px!important;margin-left:8px!important}.v-application .mx-lg-3{margin-right:12px!important;margin-left:12px!important}.v-application .mx-lg-4{margin-right:16px!important;margin-left:16px!important}.v-application .mx-lg-5{margin-right:20px!important;margin-left:20px!important}.v-application .mx-lg-6{margin-right:24px!important;margin-left:24px!important}.v-application .mx-lg-7{margin-right:28px!important;margin-left:28px!important}.v-application .mx-lg-8{margin-right:32px!important;margin-left:32px!important}.v-application .mx-lg-9{margin-right:36px!important;margin-left:36px!important}.v-application .mx-lg-10{margin-right:40px!important;margin-left:40px!important}.v-application .mx-lg-11{margin-right:44px!important;margin-left:44px!important}.v-application .mx-lg-12{margin-right:48px!important;margin-left:48px!important}.v-application .mx-lg-13{margin-right:52px!important;margin-left:52px!important}.v-application .mx-lg-14{margin-right:56px!important;margin-left:56px!important}.v-application .mx-lg-15{margin-right:60px!important;margin-left:60px!important}.v-application .mx-lg-16{margin-right:64px!important;margin-left:64px!important}.v-application .mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.v-application .my-lg-0{margin-top:0!important;margin-bottom:0!important}.v-application .my-lg-1{margin-top:4px!important;margin-bottom:4px!important}.v-application .my-lg-2{margin-top:8px!important;margin-bottom:8px!important}.v-application .my-lg-3{margin-top:12px!important;margin-bottom:12px!important}.v-application .my-lg-4{margin-top:16px!important;margin-bottom:16px!important}.v-application .my-lg-5{margin-top:20px!important;margin-bottom:20px!important}.v-application .my-lg-6{margin-top:24px!important;margin-bottom:24px!important}.v-application .my-lg-7{margin-top:28px!important;margin-bottom:28px!important}.v-application .my-lg-8{margin-top:32px!important;margin-bottom:32px!important}.v-application .my-lg-9{margin-top:36px!important;margin-bottom:36px!important}.v-application .my-lg-10{margin-top:40px!important;margin-bottom:40px!important}.v-application .my-lg-11{margin-top:44px!important;margin-bottom:44px!important}.v-application .my-lg-12{margin-top:48px!important;margin-bottom:48px!important}.v-application .my-lg-13{margin-top:52px!important;margin-bottom:52px!important}.v-application .my-lg-14{margin-top:56px!important;margin-bottom:56px!important}.v-application .my-lg-15{margin-top:60px!important;margin-bottom:60px!important}.v-application .my-lg-16{margin-top:64px!important;margin-bottom:64px!important}.v-application .my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.v-application .mt-lg-0{margin-top:0!important}.v-application .mt-lg-1{margin-top:4px!important}.v-application .mt-lg-2{margin-top:8px!important}.v-application .mt-lg-3{margin-top:12px!important}.v-application .mt-lg-4{margin-top:16px!important}.v-application .mt-lg-5{margin-top:20px!important}.v-application .mt-lg-6{margin-top:24px!important}.v-application .mt-lg-7{margin-top:28px!important}.v-application .mt-lg-8{margin-top:32px!important}.v-application .mt-lg-9{margin-top:36px!important}.v-application .mt-lg-10{margin-top:40px!important}.v-application .mt-lg-11{margin-top:44px!important}.v-application .mt-lg-12{margin-top:48px!important}.v-application .mt-lg-13{margin-top:52px!important}.v-application .mt-lg-14{margin-top:56px!important}.v-application .mt-lg-15{margin-top:60px!important}.v-application .mt-lg-16{margin-top:64px!important}.v-application .mt-lg-auto{margin-top:auto!important}.v-application .mr-lg-0{margin-right:0!important}.v-application .mr-lg-1{margin-right:4px!important}.v-application .mr-lg-2{margin-right:8px!important}.v-application .mr-lg-3{margin-right:12px!important}.v-application .mr-lg-4{margin-right:16px!important}.v-application .mr-lg-5{margin-right:20px!important}.v-application .mr-lg-6{margin-right:24px!important}.v-application .mr-lg-7{margin-right:28px!important}.v-application .mr-lg-8{margin-right:32px!important}.v-application .mr-lg-9{margin-right:36px!important}.v-application .mr-lg-10{margin-right:40px!important}.v-application .mr-lg-11{margin-right:44px!important}.v-application .mr-lg-12{margin-right:48px!important}.v-application .mr-lg-13{margin-right:52px!important}.v-application .mr-lg-14{margin-right:56px!important}.v-application .mr-lg-15{margin-right:60px!important}.v-application .mr-lg-16{margin-right:64px!important}.v-application .mr-lg-auto{margin-right:auto!important}.v-application .mb-lg-0{margin-bottom:0!important}.v-application .mb-lg-1{margin-bottom:4px!important}.v-application .mb-lg-2{margin-bottom:8px!important}.v-application .mb-lg-3{margin-bottom:12px!important}.v-application .mb-lg-4{margin-bottom:16px!important}.v-application .mb-lg-5{margin-bottom:20px!important}.v-application .mb-lg-6{margin-bottom:24px!important}.v-application .mb-lg-7{margin-bottom:28px!important}.v-application .mb-lg-8{margin-bottom:32px!important}.v-application .mb-lg-9{margin-bottom:36px!important}.v-application .mb-lg-10{margin-bottom:40px!important}.v-application .mb-lg-11{margin-bottom:44px!important}.v-application .mb-lg-12{margin-bottom:48px!important}.v-application .mb-lg-13{margin-bottom:52px!important}.v-application .mb-lg-14{margin-bottom:56px!important}.v-application .mb-lg-15{margin-bottom:60px!important}.v-application .mb-lg-16{margin-bottom:64px!important}.v-application .mb-lg-auto{margin-bottom:auto!important}.v-application .ml-lg-0{margin-left:0!important}.v-application .ml-lg-1{margin-left:4px!important}.v-application .ml-lg-2{margin-left:8px!important}.v-application .ml-lg-3{margin-left:12px!important}.v-application .ml-lg-4{margin-left:16px!important}.v-application .ml-lg-5{margin-left:20px!important}.v-application .ml-lg-6{margin-left:24px!important}.v-application .ml-lg-7{margin-left:28px!important}.v-application .ml-lg-8{margin-left:32px!important}.v-application .ml-lg-9{margin-left:36px!important}.v-application .ml-lg-10{margin-left:40px!important}.v-application .ml-lg-11{margin-left:44px!important}.v-application .ml-lg-12{margin-left:48px!important}.v-application .ml-lg-13{margin-left:52px!important}.v-application .ml-lg-14{margin-left:56px!important}.v-application .ml-lg-15{margin-left:60px!important}.v-application .ml-lg-16{margin-left:64px!important}.v-application .ml-lg-auto{margin-left:auto!important}.v-application--is-ltr .ms-lg-0{margin-left:0!important}.v-application--is-rtl .ms-lg-0{margin-right:0!important}.v-application--is-ltr .ms-lg-1{margin-left:4px!important}.v-application--is-rtl .ms-lg-1{margin-right:4px!important}.v-application--is-ltr .ms-lg-2{margin-left:8px!important}.v-application--is-rtl .ms-lg-2{margin-right:8px!important}.v-application--is-ltr .ms-lg-3{margin-left:12px!important}.v-application--is-rtl .ms-lg-3{margin-right:12px!important}.v-application--is-ltr .ms-lg-4{margin-left:16px!important}.v-application--is-rtl .ms-lg-4{margin-right:16px!important}.v-application--is-ltr .ms-lg-5{margin-left:20px!important}.v-application--is-rtl .ms-lg-5{margin-right:20px!important}.v-application--is-ltr .ms-lg-6{margin-left:24px!important}.v-application--is-rtl .ms-lg-6{margin-right:24px!important}.v-application--is-ltr .ms-lg-7{margin-left:28px!important}.v-application--is-rtl .ms-lg-7{margin-right:28px!important}.v-application--is-ltr .ms-lg-8{margin-left:32px!important}.v-application--is-rtl .ms-lg-8{margin-right:32px!important}.v-application--is-ltr .ms-lg-9{margin-left:36px!important}.v-application--is-rtl .ms-lg-9{margin-right:36px!important}.v-application--is-ltr .ms-lg-10{margin-left:40px!important}.v-application--is-rtl .ms-lg-10{margin-right:40px!important}.v-application--is-ltr .ms-lg-11{margin-left:44px!important}.v-application--is-rtl .ms-lg-11{margin-right:44px!important}.v-application--is-ltr .ms-lg-12{margin-left:48px!important}.v-application--is-rtl .ms-lg-12{margin-right:48px!important}.v-application--is-ltr .ms-lg-13{margin-left:52px!important}.v-application--is-rtl .ms-lg-13{margin-right:52px!important}.v-application--is-ltr .ms-lg-14{margin-left:56px!important}.v-application--is-rtl .ms-lg-14{margin-right:56px!important}.v-application--is-ltr .ms-lg-15{margin-left:60px!important}.v-application--is-rtl .ms-lg-15{margin-right:60px!important}.v-application--is-ltr .ms-lg-16{margin-left:64px!important}.v-application--is-rtl .ms-lg-16{margin-right:64px!important}.v-application--is-ltr .ms-lg-auto{margin-left:auto!important}.v-application--is-rtl .ms-lg-auto{margin-right:auto!important}.v-application--is-ltr .me-lg-0{margin-right:0!important}.v-application--is-rtl .me-lg-0{margin-left:0!important}.v-application--is-ltr .me-lg-1{margin-right:4px!important}.v-application--is-rtl .me-lg-1{margin-left:4px!important}.v-application--is-ltr .me-lg-2{margin-right:8px!important}.v-application--is-rtl .me-lg-2{margin-left:8px!important}.v-application--is-ltr .me-lg-3{margin-right:12px!important}.v-application--is-rtl .me-lg-3{margin-left:12px!important}.v-application--is-ltr .me-lg-4{margin-right:16px!important}.v-application--is-rtl .me-lg-4{margin-left:16px!important}.v-application--is-ltr .me-lg-5{margin-right:20px!important}.v-application--is-rtl .me-lg-5{margin-left:20px!important}.v-application--is-ltr .me-lg-6{margin-right:24px!important}.v-application--is-rtl .me-lg-6{margin-left:24px!important}.v-application--is-ltr .me-lg-7{margin-right:28px!important}.v-application--is-rtl .me-lg-7{margin-left:28px!important}.v-application--is-ltr .me-lg-8{margin-right:32px!important}.v-application--is-rtl .me-lg-8{margin-left:32px!important}.v-application--is-ltr .me-lg-9{margin-right:36px!important}.v-application--is-rtl .me-lg-9{margin-left:36px!important}.v-application--is-ltr .me-lg-10{margin-right:40px!important}.v-application--is-rtl .me-lg-10{margin-left:40px!important}.v-application--is-ltr .me-lg-11{margin-right:44px!important}.v-application--is-rtl .me-lg-11{margin-left:44px!important}.v-application--is-ltr .me-lg-12{margin-right:48px!important}.v-application--is-rtl .me-lg-12{margin-left:48px!important}.v-application--is-ltr .me-lg-13{margin-right:52px!important}.v-application--is-rtl .me-lg-13{margin-left:52px!important}.v-application--is-ltr .me-lg-14{margin-right:56px!important}.v-application--is-rtl .me-lg-14{margin-left:56px!important}.v-application--is-ltr .me-lg-15{margin-right:60px!important}.v-application--is-rtl .me-lg-15{margin-left:60px!important}.v-application--is-ltr .me-lg-16{margin-right:64px!important}.v-application--is-rtl .me-lg-16{margin-left:64px!important}.v-application--is-ltr .me-lg-auto{margin-right:auto!important}.v-application--is-rtl .me-lg-auto{margin-left:auto!important}.v-application .ma-lg-n1{margin:-4px!important}.v-application .ma-lg-n2{margin:-8px!important}.v-application .ma-lg-n3{margin:-12px!important}.v-application .ma-lg-n4{margin:-16px!important}.v-application .ma-lg-n5{margin:-20px!important}.v-application .ma-lg-n6{margin:-24px!important}.v-application .ma-lg-n7{margin:-28px!important}.v-application .ma-lg-n8{margin:-32px!important}.v-application .ma-lg-n9{margin:-36px!important}.v-application .ma-lg-n10{margin:-40px!important}.v-application .ma-lg-n11{margin:-44px!important}.v-application .ma-lg-n12{margin:-48px!important}.v-application .ma-lg-n13{margin:-52px!important}.v-application .ma-lg-n14{margin:-56px!important}.v-application .ma-lg-n15{margin:-60px!important}.v-application .ma-lg-n16{margin:-64px!important}.v-application .mx-lg-n1{margin-right:-4px!important;margin-left:-4px!important}.v-application .mx-lg-n2{margin-right:-8px!important;margin-left:-8px!important}.v-application .mx-lg-n3{margin-right:-12px!important;margin-left:-12px!important}.v-application .mx-lg-n4{margin-right:-16px!important;margin-left:-16px!important}.v-application .mx-lg-n5{margin-right:-20px!important;margin-left:-20px!important}.v-application .mx-lg-n6{margin-right:-24px!important;margin-left:-24px!important}.v-application .mx-lg-n7{margin-right:-28px!important;margin-left:-28px!important}.v-application .mx-lg-n8{margin-right:-32px!important;margin-left:-32px!important}.v-application .mx-lg-n9{margin-right:-36px!important;margin-left:-36px!important}.v-application .mx-lg-n10{margin-right:-40px!important;margin-left:-40px!important}.v-application .mx-lg-n11{margin-right:-44px!important;margin-left:-44px!important}.v-application .mx-lg-n12{margin-right:-48px!important;margin-left:-48px!important}.v-application .mx-lg-n13{margin-right:-52px!important;margin-left:-52px!important}.v-application .mx-lg-n14{margin-right:-56px!important;margin-left:-56px!important}.v-application .mx-lg-n15{margin-right:-60px!important;margin-left:-60px!important}.v-application .mx-lg-n16{margin-right:-64px!important;margin-left:-64px!important}.v-application .my-lg-n1{margin-top:-4px!important;margin-bottom:-4px!important}.v-application .my-lg-n2{margin-top:-8px!important;margin-bottom:-8px!important}.v-application .my-lg-n3{margin-top:-12px!important;margin-bottom:-12px!important}.v-application .my-lg-n4{margin-top:-16px!important;margin-bottom:-16px!important}.v-application .my-lg-n5{margin-top:-20px!important;margin-bottom:-20px!important}.v-application .my-lg-n6{margin-top:-24px!important;margin-bottom:-24px!important}.v-application .my-lg-n7{margin-top:-28px!important;margin-bottom:-28px!important}.v-application .my-lg-n8{margin-top:-32px!important;margin-bottom:-32px!important}.v-application .my-lg-n9{margin-top:-36px!important;margin-bottom:-36px!important}.v-application .my-lg-n10{margin-top:-40px!important;margin-bottom:-40px!important}.v-application .my-lg-n11{margin-top:-44px!important;margin-bottom:-44px!important}.v-application .my-lg-n12{margin-top:-48px!important;margin-bottom:-48px!important}.v-application .my-lg-n13{margin-top:-52px!important;margin-bottom:-52px!important}.v-application .my-lg-n14{margin-top:-56px!important;margin-bottom:-56px!important}.v-application .my-lg-n15{margin-top:-60px!important;margin-bottom:-60px!important}.v-application .my-lg-n16{margin-top:-64px!important;margin-bottom:-64px!important}.v-application .mt-lg-n1{margin-top:-4px!important}.v-application .mt-lg-n2{margin-top:-8px!important}.v-application .mt-lg-n3{margin-top:-12px!important}.v-application .mt-lg-n4{margin-top:-16px!important}.v-application .mt-lg-n5{margin-top:-20px!important}.v-application .mt-lg-n6{margin-top:-24px!important}.v-application .mt-lg-n7{margin-top:-28px!important}.v-application .mt-lg-n8{margin-top:-32px!important}.v-application .mt-lg-n9{margin-top:-36px!important}.v-application .mt-lg-n10{margin-top:-40px!important}.v-application .mt-lg-n11{margin-top:-44px!important}.v-application .mt-lg-n12{margin-top:-48px!important}.v-application .mt-lg-n13{margin-top:-52px!important}.v-application .mt-lg-n14{margin-top:-56px!important}.v-application .mt-lg-n15{margin-top:-60px!important}.v-application .mt-lg-n16{margin-top:-64px!important}.v-application .mr-lg-n1{margin-right:-4px!important}.v-application .mr-lg-n2{margin-right:-8px!important}.v-application .mr-lg-n3{margin-right:-12px!important}.v-application .mr-lg-n4{margin-right:-16px!important}.v-application .mr-lg-n5{margin-right:-20px!important}.v-application .mr-lg-n6{margin-right:-24px!important}.v-application .mr-lg-n7{margin-right:-28px!important}.v-application .mr-lg-n8{margin-right:-32px!important}.v-application .mr-lg-n9{margin-right:-36px!important}.v-application .mr-lg-n10{margin-right:-40px!important}.v-application .mr-lg-n11{margin-right:-44px!important}.v-application .mr-lg-n12{margin-right:-48px!important}.v-application .mr-lg-n13{margin-right:-52px!important}.v-application .mr-lg-n14{margin-right:-56px!important}.v-application .mr-lg-n15{margin-right:-60px!important}.v-application .mr-lg-n16{margin-right:-64px!important}.v-application .mb-lg-n1{margin-bottom:-4px!important}.v-application .mb-lg-n2{margin-bottom:-8px!important}.v-application .mb-lg-n3{margin-bottom:-12px!important}.v-application .mb-lg-n4{margin-bottom:-16px!important}.v-application .mb-lg-n5{margin-bottom:-20px!important}.v-application .mb-lg-n6{margin-bottom:-24px!important}.v-application .mb-lg-n7{margin-bottom:-28px!important}.v-application .mb-lg-n8{margin-bottom:-32px!important}.v-application .mb-lg-n9{margin-bottom:-36px!important}.v-application .mb-lg-n10{margin-bottom:-40px!important}.v-application .mb-lg-n11{margin-bottom:-44px!important}.v-application .mb-lg-n12{margin-bottom:-48px!important}.v-application .mb-lg-n13{margin-bottom:-52px!important}.v-application .mb-lg-n14{margin-bottom:-56px!important}.v-application .mb-lg-n15{margin-bottom:-60px!important}.v-application .mb-lg-n16{margin-bottom:-64px!important}.v-application .ml-lg-n1{margin-left:-4px!important}.v-application .ml-lg-n2{margin-left:-8px!important}.v-application .ml-lg-n3{margin-left:-12px!important}.v-application .ml-lg-n4{margin-left:-16px!important}.v-application .ml-lg-n5{margin-left:-20px!important}.v-application .ml-lg-n6{margin-left:-24px!important}.v-application .ml-lg-n7{margin-left:-28px!important}.v-application .ml-lg-n8{margin-left:-32px!important}.v-application .ml-lg-n9{margin-left:-36px!important}.v-application .ml-lg-n10{margin-left:-40px!important}.v-application .ml-lg-n11{margin-left:-44px!important}.v-application .ml-lg-n12{margin-left:-48px!important}.v-application .ml-lg-n13{margin-left:-52px!important}.v-application .ml-lg-n14{margin-left:-56px!important}.v-application .ml-lg-n15{margin-left:-60px!important}.v-application .ml-lg-n16{margin-left:-64px!important}.v-application--is-ltr .ms-lg-n1{margin-left:-4px!important}.v-application--is-rtl .ms-lg-n1{margin-right:-4px!important}.v-application--is-ltr .ms-lg-n2{margin-left:-8px!important}.v-application--is-rtl .ms-lg-n2{margin-right:-8px!important}.v-application--is-ltr .ms-lg-n3{margin-left:-12px!important}.v-application--is-rtl .ms-lg-n3{margin-right:-12px!important}.v-application--is-ltr .ms-lg-n4{margin-left:-16px!important}.v-application--is-rtl .ms-lg-n4{margin-right:-16px!important}.v-application--is-ltr .ms-lg-n5{margin-left:-20px!important}.v-application--is-rtl .ms-lg-n5{margin-right:-20px!important}.v-application--is-ltr .ms-lg-n6{margin-left:-24px!important}.v-application--is-rtl .ms-lg-n6{margin-right:-24px!important}.v-application--is-ltr .ms-lg-n7{margin-left:-28px!important}.v-application--is-rtl .ms-lg-n7{margin-right:-28px!important}.v-application--is-ltr .ms-lg-n8{margin-left:-32px!important}.v-application--is-rtl .ms-lg-n8{margin-right:-32px!important}.v-application--is-ltr .ms-lg-n9{margin-left:-36px!important}.v-application--is-rtl .ms-lg-n9{margin-right:-36px!important}.v-application--is-ltr .ms-lg-n10{margin-left:-40px!important}.v-application--is-rtl .ms-lg-n10{margin-right:-40px!important}.v-application--is-ltr .ms-lg-n11{margin-left:-44px!important}.v-application--is-rtl .ms-lg-n11{margin-right:-44px!important}.v-application--is-ltr .ms-lg-n12{margin-left:-48px!important}.v-application--is-rtl .ms-lg-n12{margin-right:-48px!important}.v-application--is-ltr .ms-lg-n13{margin-left:-52px!important}.v-application--is-rtl .ms-lg-n13{margin-right:-52px!important}.v-application--is-ltr .ms-lg-n14{margin-left:-56px!important}.v-application--is-rtl .ms-lg-n14{margin-right:-56px!important}.v-application--is-ltr .ms-lg-n15{margin-left:-60px!important}.v-application--is-rtl .ms-lg-n15{margin-right:-60px!important}.v-application--is-ltr .ms-lg-n16{margin-left:-64px!important}.v-application--is-rtl .ms-lg-n16{margin-right:-64px!important}.v-application--is-ltr .me-lg-n1{margin-right:-4px!important}.v-application--is-rtl .me-lg-n1{margin-left:-4px!important}.v-application--is-ltr .me-lg-n2{margin-right:-8px!important}.v-application--is-rtl .me-lg-n2{margin-left:-8px!important}.v-application--is-ltr .me-lg-n3{margin-right:-12px!important}.v-application--is-rtl .me-lg-n3{margin-left:-12px!important}.v-application--is-ltr .me-lg-n4{margin-right:-16px!important}.v-application--is-rtl .me-lg-n4{margin-left:-16px!important}.v-application--is-ltr .me-lg-n5{margin-right:-20px!important}.v-application--is-rtl .me-lg-n5{margin-left:-20px!important}.v-application--is-ltr .me-lg-n6{margin-right:-24px!important}.v-application--is-rtl .me-lg-n6{margin-left:-24px!important}.v-application--is-ltr .me-lg-n7{margin-right:-28px!important}.v-application--is-rtl .me-lg-n7{margin-left:-28px!important}.v-application--is-ltr .me-lg-n8{margin-right:-32px!important}.v-application--is-rtl .me-lg-n8{margin-left:-32px!important}.v-application--is-ltr .me-lg-n9{margin-right:-36px!important}.v-application--is-rtl .me-lg-n9{margin-left:-36px!important}.v-application--is-ltr .me-lg-n10{margin-right:-40px!important}.v-application--is-rtl .me-lg-n10{margin-left:-40px!important}.v-application--is-ltr .me-lg-n11{margin-right:-44px!important}.v-application--is-rtl .me-lg-n11{margin-left:-44px!important}.v-application--is-ltr .me-lg-n12{margin-right:-48px!important}.v-application--is-rtl .me-lg-n12{margin-left:-48px!important}.v-application--is-ltr .me-lg-n13{margin-right:-52px!important}.v-application--is-rtl .me-lg-n13{margin-left:-52px!important}.v-application--is-ltr .me-lg-n14{margin-right:-56px!important}.v-application--is-rtl .me-lg-n14{margin-left:-56px!important}.v-application--is-ltr .me-lg-n15{margin-right:-60px!important}.v-application--is-rtl .me-lg-n15{margin-left:-60px!important}.v-application--is-ltr .me-lg-n16{margin-right:-64px!important}.v-application--is-rtl .me-lg-n16{margin-left:-64px!important}.v-application .pa-lg-0{padding:0!important}.v-application .pa-lg-1{padding:4px!important}.v-application .pa-lg-2{padding:8px!important}.v-application .pa-lg-3{padding:12px!important}.v-application .pa-lg-4{padding:16px!important}.v-application .pa-lg-5{padding:20px!important}.v-application .pa-lg-6{padding:24px!important}.v-application .pa-lg-7{padding:28px!important}.v-application .pa-lg-8{padding:32px!important}.v-application .pa-lg-9{padding:36px!important}.v-application .pa-lg-10{padding:40px!important}.v-application .pa-lg-11{padding:44px!important}.v-application .pa-lg-12{padding:48px!important}.v-application .pa-lg-13{padding:52px!important}.v-application .pa-lg-14{padding:56px!important}.v-application .pa-lg-15{padding:60px!important}.v-application .pa-lg-16{padding:64px!important}.v-application .px-lg-0{padding-right:0!important;padding-left:0!important}.v-application .px-lg-1{padding-right:4px!important;padding-left:4px!important}.v-application .px-lg-2{padding-right:8px!important;padding-left:8px!important}.v-application .px-lg-3{padding-right:12px!important;padding-left:12px!important}.v-application .px-lg-4{padding-right:16px!important;padding-left:16px!important}.v-application .px-lg-5{padding-right:20px!important;padding-left:20px!important}.v-application .px-lg-6{padding-right:24px!important;padding-left:24px!important}.v-application .px-lg-7{padding-right:28px!important;padding-left:28px!important}.v-application .px-lg-8{padding-right:32px!important;padding-left:32px!important}.v-application .px-lg-9{padding-right:36px!important;padding-left:36px!important}.v-application .px-lg-10{padding-right:40px!important;padding-left:40px!important}.v-application .px-lg-11{padding-right:44px!important;padding-left:44px!important}.v-application .px-lg-12{padding-right:48px!important;padding-left:48px!important}.v-application .px-lg-13{padding-right:52px!important;padding-left:52px!important}.v-application .px-lg-14{padding-right:56px!important;padding-left:56px!important}.v-application .px-lg-15{padding-right:60px!important;padding-left:60px!important}.v-application .px-lg-16{padding-right:64px!important;padding-left:64px!important}.v-application .py-lg-0{padding-top:0!important;padding-bottom:0!important}.v-application .py-lg-1{padding-top:4px!important;padding-bottom:4px!important}.v-application .py-lg-2{padding-top:8px!important;padding-bottom:8px!important}.v-application .py-lg-3{padding-top:12px!important;padding-bottom:12px!important}.v-application .py-lg-4{padding-top:16px!important;padding-bottom:16px!important}.v-application .py-lg-5{padding-top:20px!important;padding-bottom:20px!important}.v-application .py-lg-6{padding-top:24px!important;padding-bottom:24px!important}.v-application .py-lg-7{padding-top:28px!important;padding-bottom:28px!important}.v-application .py-lg-8{padding-top:32px!important;padding-bottom:32px!important}.v-application .py-lg-9{padding-top:36px!important;padding-bottom:36px!important}.v-application .py-lg-10{padding-top:40px!important;padding-bottom:40px!important}.v-application .py-lg-11{padding-top:44px!important;padding-bottom:44px!important}.v-application .py-lg-12{padding-top:48px!important;padding-bottom:48px!important}.v-application .py-lg-13{padding-top:52px!important;padding-bottom:52px!important}.v-application .py-lg-14{padding-top:56px!important;padding-bottom:56px!important}.v-application .py-lg-15{padding-top:60px!important;padding-bottom:60px!important}.v-application .py-lg-16{padding-top:64px!important;padding-bottom:64px!important}.v-application .pt-lg-0{padding-top:0!important}.v-application .pt-lg-1{padding-top:4px!important}.v-application .pt-lg-2{padding-top:8px!important}.v-application .pt-lg-3{padding-top:12px!important}.v-application .pt-lg-4{padding-top:16px!important}.v-application .pt-lg-5{padding-top:20px!important}.v-application .pt-lg-6{padding-top:24px!important}.v-application .pt-lg-7{padding-top:28px!important}.v-application .pt-lg-8{padding-top:32px!important}.v-application .pt-lg-9{padding-top:36px!important}.v-application .pt-lg-10{padding-top:40px!important}.v-application .pt-lg-11{padding-top:44px!important}.v-application .pt-lg-12{padding-top:48px!important}.v-application .pt-lg-13{padding-top:52px!important}.v-application .pt-lg-14{padding-top:56px!important}.v-application .pt-lg-15{padding-top:60px!important}.v-application .pt-lg-16{padding-top:64px!important}.v-application .pr-lg-0{padding-right:0!important}.v-application .pr-lg-1{padding-right:4px!important}.v-application .pr-lg-2{padding-right:8px!important}.v-application .pr-lg-3{padding-right:12px!important}.v-application .pr-lg-4{padding-right:16px!important}.v-application .pr-lg-5{padding-right:20px!important}.v-application .pr-lg-6{padding-right:24px!important}.v-application .pr-lg-7{padding-right:28px!important}.v-application .pr-lg-8{padding-right:32px!important}.v-application .pr-lg-9{padding-right:36px!important}.v-application .pr-lg-10{padding-right:40px!important}.v-application .pr-lg-11{padding-right:44px!important}.v-application .pr-lg-12{padding-right:48px!important}.v-application .pr-lg-13{padding-right:52px!important}.v-application .pr-lg-14{padding-right:56px!important}.v-application .pr-lg-15{padding-right:60px!important}.v-application .pr-lg-16{padding-right:64px!important}.v-application .pb-lg-0{padding-bottom:0!important}.v-application .pb-lg-1{padding-bottom:4px!important}.v-application .pb-lg-2{padding-bottom:8px!important}.v-application .pb-lg-3{padding-bottom:12px!important}.v-application .pb-lg-4{padding-bottom:16px!important}.v-application .pb-lg-5{padding-bottom:20px!important}.v-application .pb-lg-6{padding-bottom:24px!important}.v-application .pb-lg-7{padding-bottom:28px!important}.v-application .pb-lg-8{padding-bottom:32px!important}.v-application .pb-lg-9{padding-bottom:36px!important}.v-application .pb-lg-10{padding-bottom:40px!important}.v-application .pb-lg-11{padding-bottom:44px!important}.v-application .pb-lg-12{padding-bottom:48px!important}.v-application .pb-lg-13{padding-bottom:52px!important}.v-application .pb-lg-14{padding-bottom:56px!important}.v-application .pb-lg-15{padding-bottom:60px!important}.v-application .pb-lg-16{padding-bottom:64px!important}.v-application .pl-lg-0{padding-left:0!important}.v-application .pl-lg-1{padding-left:4px!important}.v-application .pl-lg-2{padding-left:8px!important}.v-application .pl-lg-3{padding-left:12px!important}.v-application .pl-lg-4{padding-left:16px!important}.v-application .pl-lg-5{padding-left:20px!important}.v-application .pl-lg-6{padding-left:24px!important}.v-application .pl-lg-7{padding-left:28px!important}.v-application .pl-lg-8{padding-left:32px!important}.v-application .pl-lg-9{padding-left:36px!important}.v-application .pl-lg-10{padding-left:40px!important}.v-application .pl-lg-11{padding-left:44px!important}.v-application .pl-lg-12{padding-left:48px!important}.v-application .pl-lg-13{padding-left:52px!important}.v-application .pl-lg-14{padding-left:56px!important}.v-application .pl-lg-15{padding-left:60px!important}.v-application .pl-lg-16{padding-left:64px!important}.v-application--is-ltr .ps-lg-0{padding-left:0!important}.v-application--is-rtl .ps-lg-0{padding-right:0!important}.v-application--is-ltr .ps-lg-1{padding-left:4px!important}.v-application--is-rtl .ps-lg-1{padding-right:4px!important}.v-application--is-ltr .ps-lg-2{padding-left:8px!important}.v-application--is-rtl .ps-lg-2{padding-right:8px!important}.v-application--is-ltr .ps-lg-3{padding-left:12px!important}.v-application--is-rtl .ps-lg-3{padding-right:12px!important}.v-application--is-ltr .ps-lg-4{padding-left:16px!important}.v-application--is-rtl .ps-lg-4{padding-right:16px!important}.v-application--is-ltr .ps-lg-5{padding-left:20px!important}.v-application--is-rtl .ps-lg-5{padding-right:20px!important}.v-application--is-ltr .ps-lg-6{padding-left:24px!important}.v-application--is-rtl .ps-lg-6{padding-right:24px!important}.v-application--is-ltr .ps-lg-7{padding-left:28px!important}.v-application--is-rtl .ps-lg-7{padding-right:28px!important}.v-application--is-ltr .ps-lg-8{padding-left:32px!important}.v-application--is-rtl .ps-lg-8{padding-right:32px!important}.v-application--is-ltr .ps-lg-9{padding-left:36px!important}.v-application--is-rtl .ps-lg-9{padding-right:36px!important}.v-application--is-ltr .ps-lg-10{padding-left:40px!important}.v-application--is-rtl .ps-lg-10{padding-right:40px!important}.v-application--is-ltr .ps-lg-11{padding-left:44px!important}.v-application--is-rtl .ps-lg-11{padding-right:44px!important}.v-application--is-ltr .ps-lg-12{padding-left:48px!important}.v-application--is-rtl .ps-lg-12{padding-right:48px!important}.v-application--is-ltr .ps-lg-13{padding-left:52px!important}.v-application--is-rtl .ps-lg-13{padding-right:52px!important}.v-application--is-ltr .ps-lg-14{padding-left:56px!important}.v-application--is-rtl .ps-lg-14{padding-right:56px!important}.v-application--is-ltr .ps-lg-15{padding-left:60px!important}.v-application--is-rtl .ps-lg-15{padding-right:60px!important}.v-application--is-ltr .ps-lg-16{padding-left:64px!important}.v-application--is-rtl .ps-lg-16{padding-right:64px!important}.v-application--is-ltr .pe-lg-0{padding-right:0!important}.v-application--is-rtl .pe-lg-0{padding-left:0!important}.v-application--is-ltr .pe-lg-1{padding-right:4px!important}.v-application--is-rtl .pe-lg-1{padding-left:4px!important}.v-application--is-ltr .pe-lg-2{padding-right:8px!important}.v-application--is-rtl .pe-lg-2{padding-left:8px!important}.v-application--is-ltr .pe-lg-3{padding-right:12px!important}.v-application--is-rtl .pe-lg-3{padding-left:12px!important}.v-application--is-ltr .pe-lg-4{padding-right:16px!important}.v-application--is-rtl .pe-lg-4{padding-left:16px!important}.v-application--is-ltr .pe-lg-5{padding-right:20px!important}.v-application--is-rtl .pe-lg-5{padding-left:20px!important}.v-application--is-ltr .pe-lg-6{padding-right:24px!important}.v-application--is-rtl .pe-lg-6{padding-left:24px!important}.v-application--is-ltr .pe-lg-7{padding-right:28px!important}.v-application--is-rtl .pe-lg-7{padding-left:28px!important}.v-application--is-ltr .pe-lg-8{padding-right:32px!important}.v-application--is-rtl .pe-lg-8{padding-left:32px!important}.v-application--is-ltr .pe-lg-9{padding-right:36px!important}.v-application--is-rtl .pe-lg-9{padding-left:36px!important}.v-application--is-ltr .pe-lg-10{padding-right:40px!important}.v-application--is-rtl .pe-lg-10{padding-left:40px!important}.v-application--is-ltr .pe-lg-11{padding-right:44px!important}.v-application--is-rtl .pe-lg-11{padding-left:44px!important}.v-application--is-ltr .pe-lg-12{padding-right:48px!important}.v-application--is-rtl .pe-lg-12{padding-left:48px!important}.v-application--is-ltr .pe-lg-13{padding-right:52px!important}.v-application--is-rtl .pe-lg-13{padding-left:52px!important}.v-application--is-ltr .pe-lg-14{padding-right:56px!important}.v-application--is-rtl .pe-lg-14{padding-left:56px!important}.v-application--is-ltr .pe-lg-15{padding-right:60px!important}.v-application--is-rtl .pe-lg-15{padding-left:60px!important}.v-application--is-ltr .pe-lg-16{padding-right:64px!important}.v-application--is-rtl .pe-lg-16{padding-left:64px!important}.v-application .text-lg-left{text-align:left!important}.v-application .text-lg-right{text-align:right!important}.v-application .text-lg-center{text-align:center!important}.v-application .text-lg-justify{text-align:justify!important}.v-application .text-lg-start{text-align:start!important}.v-application .text-lg-end{text-align:end!important}.v-application .text-lg-h1{font-size:6rem!important;line-height:6rem;letter-spacing:-.015625em!important}.v-application .text-lg-h1,.v-application .text-lg-h2{font-weight:300;font-family:Roboto,sans-serif!important}.v-application .text-lg-h2{font-size:3.75rem!important;line-height:3.75rem;letter-spacing:-.0083333333em!important}.v-application .text-lg-h3{font-size:3rem!important;line-height:3.125rem;letter-spacing:normal!important}.v-application .text-lg-h3,.v-application .text-lg-h4{font-weight:400;font-family:Roboto,sans-serif!important}.v-application .text-lg-h4{font-size:2.125rem!important;line-height:2.5rem;letter-spacing:.0073529412em!important}.v-application .text-lg-h5{font-size:1.5rem!important;font-weight:400;letter-spacing:normal!important}.v-application .text-lg-h5,.v-application .text-lg-h6{line-height:2rem;font-family:Roboto,sans-serif!important}.v-application .text-lg-h6{font-size:1.25rem!important;font-weight:500;letter-spacing:.0125em!important}.v-application .text-lg-subtitle-1{font-size:1rem!important;font-weight:400;line-height:1.75rem;letter-spacing:.009375em!important;font-family:Roboto,sans-serif!important}.v-application .text-lg-subtitle-2{font-size:.875rem!important;font-weight:500;line-height:1.375rem;letter-spacing:.0071428571em!important;font-family:Roboto,sans-serif!important}.v-application .text-lg-body-1{font-size:1rem!important;font-weight:400;line-height:1.5rem;letter-spacing:.03125em!important;font-family:Roboto,sans-serif!important}.v-application .text-lg-body-2{font-weight:400;line-height:1.25rem;letter-spacing:.0178571429em!important}.v-application .text-lg-body-2,.v-application .text-lg-button{font-size:.875rem!important;font-family:Roboto,sans-serif!important}.v-application .text-lg-button{font-weight:500;line-height:2.25rem;letter-spacing:.0892857143em!important;text-transform:uppercase!important}.v-application .text-lg-caption{font-weight:400;line-height:1.25rem;letter-spacing:.0333333333em!important}.v-application .text-lg-caption,.v-application .text-lg-overline{font-size:.75rem!important;font-family:Roboto,sans-serif!important}.v-application .text-lg-overline{font-weight:500;line-height:2rem;letter-spacing:.1666666667em!important;text-transform:uppercase!important}}@media(min-width:1904px){.v-application .d-xl-none{display:none!important}.v-application .d-xl-inline{display:inline!important}.v-application .d-xl-inline-block{display:inline-block!important}.v-application .d-xl-block{display:block!important}.v-application .d-xl-table{display:table!important}.v-application .d-xl-table-row{display:table-row!important}.v-application .d-xl-table-cell{display:table-cell!important}.v-application .d-xl-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.v-application .d-xl-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}.v-application .float-xl-none{float:none!important}.v-application .float-xl-left{float:left!important}.v-application .float-xl-right{float:right!important}.v-application--is-rtl .float-xl-end{float:left!important}.v-application--is-ltr .float-xl-end,.v-application--is-rtl .float-xl-start{float:right!important}.v-application--is-ltr .float-xl-start{float:left!important}.v-application .flex-xl-fill{-webkit-box-flex:1!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.v-application .flex-xl-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.v-application .flex-xl-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.v-application .flex-xl-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.v-application .flex-xl-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.v-application .flex-xl-grow-0{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.v-application .flex-xl-grow-1{-webkit-box-flex:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.v-application .flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.v-application .flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.v-application .flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.v-application .flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.v-application .flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.v-application .justify-xl-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.v-application .justify-xl-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.v-application .justify-xl-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.v-application .justify-xl-space-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.v-application .justify-xl-space-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.v-application .align-xl-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.v-application .align-xl-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.v-application .align-xl-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.v-application .align-xl-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.v-application .align-xl-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.v-application .align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.v-application .align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.v-application .align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.v-application .align-content-xl-space-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.v-application .align-content-xl-space-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.v-application .align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.v-application .align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.v-application .align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.v-application .align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.v-application .align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.v-application .align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.v-application .align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}.v-application .order-xl-first{-webkit-box-ordinal-group:0!important;-ms-flex-order:-1!important;order:-1!important}.v-application .order-xl-0{-webkit-box-ordinal-group:1!important;-ms-flex-order:0!important;order:0!important}.v-application .order-xl-1{-webkit-box-ordinal-group:2!important;-ms-flex-order:1!important;order:1!important}.v-application .order-xl-2{-webkit-box-ordinal-group:3!important;-ms-flex-order:2!important;order:2!important}.v-application .order-xl-3{-webkit-box-ordinal-group:4!important;-ms-flex-order:3!important;order:3!important}.v-application .order-xl-4{-webkit-box-ordinal-group:5!important;-ms-flex-order:4!important;order:4!important}.v-application .order-xl-5{-webkit-box-ordinal-group:6!important;-ms-flex-order:5!important;order:5!important}.v-application .order-xl-6{-webkit-box-ordinal-group:7!important;-ms-flex-order:6!important;order:6!important}.v-application .order-xl-7{-webkit-box-ordinal-group:8!important;-ms-flex-order:7!important;order:7!important}.v-application .order-xl-8{-webkit-box-ordinal-group:9!important;-ms-flex-order:8!important;order:8!important}.v-application .order-xl-9{-webkit-box-ordinal-group:10!important;-ms-flex-order:9!important;order:9!important}.v-application .order-xl-10{-webkit-box-ordinal-group:11!important;-ms-flex-order:10!important;order:10!important}.v-application .order-xl-11{-webkit-box-ordinal-group:12!important;-ms-flex-order:11!important;order:11!important}.v-application .order-xl-12{-webkit-box-ordinal-group:13!important;-ms-flex-order:12!important;order:12!important}.v-application .order-xl-last{-webkit-box-ordinal-group:14!important;-ms-flex-order:13!important;order:13!important}.v-application .ma-xl-0{margin:0!important}.v-application .ma-xl-1{margin:4px!important}.v-application .ma-xl-2{margin:8px!important}.v-application .ma-xl-3{margin:12px!important}.v-application .ma-xl-4{margin:16px!important}.v-application .ma-xl-5{margin:20px!important}.v-application .ma-xl-6{margin:24px!important}.v-application .ma-xl-7{margin:28px!important}.v-application .ma-xl-8{margin:32px!important}.v-application .ma-xl-9{margin:36px!important}.v-application .ma-xl-10{margin:40px!important}.v-application .ma-xl-11{margin:44px!important}.v-application .ma-xl-12{margin:48px!important}.v-application .ma-xl-13{margin:52px!important}.v-application .ma-xl-14{margin:56px!important}.v-application .ma-xl-15{margin:60px!important}.v-application .ma-xl-16{margin:64px!important}.v-application .ma-xl-auto{margin:auto!important}.v-application .mx-xl-0{margin-right:0!important;margin-left:0!important}.v-application .mx-xl-1{margin-right:4px!important;margin-left:4px!important}.v-application .mx-xl-2{margin-right:8px!important;margin-left:8px!important}.v-application .mx-xl-3{margin-right:12px!important;margin-left:12px!important}.v-application .mx-xl-4{margin-right:16px!important;margin-left:16px!important}.v-application .mx-xl-5{margin-right:20px!important;margin-left:20px!important}.v-application .mx-xl-6{margin-right:24px!important;margin-left:24px!important}.v-application .mx-xl-7{margin-right:28px!important;margin-left:28px!important}.v-application .mx-xl-8{margin-right:32px!important;margin-left:32px!important}.v-application .mx-xl-9{margin-right:36px!important;margin-left:36px!important}.v-application .mx-xl-10{margin-right:40px!important;margin-left:40px!important}.v-application .mx-xl-11{margin-right:44px!important;margin-left:44px!important}.v-application .mx-xl-12{margin-right:48px!important;margin-left:48px!important}.v-application .mx-xl-13{margin-right:52px!important;margin-left:52px!important}.v-application .mx-xl-14{margin-right:56px!important;margin-left:56px!important}.v-application .mx-xl-15{margin-right:60px!important;margin-left:60px!important}.v-application .mx-xl-16{margin-right:64px!important;margin-left:64px!important}.v-application .mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.v-application .my-xl-0{margin-top:0!important;margin-bottom:0!important}.v-application .my-xl-1{margin-top:4px!important;margin-bottom:4px!important}.v-application .my-xl-2{margin-top:8px!important;margin-bottom:8px!important}.v-application .my-xl-3{margin-top:12px!important;margin-bottom:12px!important}.v-application .my-xl-4{margin-top:16px!important;margin-bottom:16px!important}.v-application .my-xl-5{margin-top:20px!important;margin-bottom:20px!important}.v-application .my-xl-6{margin-top:24px!important;margin-bottom:24px!important}.v-application .my-xl-7{margin-top:28px!important;margin-bottom:28px!important}.v-application .my-xl-8{margin-top:32px!important;margin-bottom:32px!important}.v-application .my-xl-9{margin-top:36px!important;margin-bottom:36px!important}.v-application .my-xl-10{margin-top:40px!important;margin-bottom:40px!important}.v-application .my-xl-11{margin-top:44px!important;margin-bottom:44px!important}.v-application .my-xl-12{margin-top:48px!important;margin-bottom:48px!important}.v-application .my-xl-13{margin-top:52px!important;margin-bottom:52px!important}.v-application .my-xl-14{margin-top:56px!important;margin-bottom:56px!important}.v-application .my-xl-15{margin-top:60px!important;margin-bottom:60px!important}.v-application .my-xl-16{margin-top:64px!important;margin-bottom:64px!important}.v-application .my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.v-application .mt-xl-0{margin-top:0!important}.v-application .mt-xl-1{margin-top:4px!important}.v-application .mt-xl-2{margin-top:8px!important}.v-application .mt-xl-3{margin-top:12px!important}.v-application .mt-xl-4{margin-top:16px!important}.v-application .mt-xl-5{margin-top:20px!important}.v-application .mt-xl-6{margin-top:24px!important}.v-application .mt-xl-7{margin-top:28px!important}.v-application .mt-xl-8{margin-top:32px!important}.v-application .mt-xl-9{margin-top:36px!important}.v-application .mt-xl-10{margin-top:40px!important}.v-application .mt-xl-11{margin-top:44px!important}.v-application .mt-xl-12{margin-top:48px!important}.v-application .mt-xl-13{margin-top:52px!important}.v-application .mt-xl-14{margin-top:56px!important}.v-application .mt-xl-15{margin-top:60px!important}.v-application .mt-xl-16{margin-top:64px!important}.v-application .mt-xl-auto{margin-top:auto!important}.v-application .mr-xl-0{margin-right:0!important}.v-application .mr-xl-1{margin-right:4px!important}.v-application .mr-xl-2{margin-right:8px!important}.v-application .mr-xl-3{margin-right:12px!important}.v-application .mr-xl-4{margin-right:16px!important}.v-application .mr-xl-5{margin-right:20px!important}.v-application .mr-xl-6{margin-right:24px!important}.v-application .mr-xl-7{margin-right:28px!important}.v-application .mr-xl-8{margin-right:32px!important}.v-application .mr-xl-9{margin-right:36px!important}.v-application .mr-xl-10{margin-right:40px!important}.v-application .mr-xl-11{margin-right:44px!important}.v-application .mr-xl-12{margin-right:48px!important}.v-application .mr-xl-13{margin-right:52px!important}.v-application .mr-xl-14{margin-right:56px!important}.v-application .mr-xl-15{margin-right:60px!important}.v-application .mr-xl-16{margin-right:64px!important}.v-application .mr-xl-auto{margin-right:auto!important}.v-application .mb-xl-0{margin-bottom:0!important}.v-application .mb-xl-1{margin-bottom:4px!important}.v-application .mb-xl-2{margin-bottom:8px!important}.v-application .mb-xl-3{margin-bottom:12px!important}.v-application .mb-xl-4{margin-bottom:16px!important}.v-application .mb-xl-5{margin-bottom:20px!important}.v-application .mb-xl-6{margin-bottom:24px!important}.v-application .mb-xl-7{margin-bottom:28px!important}.v-application .mb-xl-8{margin-bottom:32px!important}.v-application .mb-xl-9{margin-bottom:36px!important}.v-application .mb-xl-10{margin-bottom:40px!important}.v-application .mb-xl-11{margin-bottom:44px!important}.v-application .mb-xl-12{margin-bottom:48px!important}.v-application .mb-xl-13{margin-bottom:52px!important}.v-application .mb-xl-14{margin-bottom:56px!important}.v-application .mb-xl-15{margin-bottom:60px!important}.v-application .mb-xl-16{margin-bottom:64px!important}.v-application .mb-xl-auto{margin-bottom:auto!important}.v-application .ml-xl-0{margin-left:0!important}.v-application .ml-xl-1{margin-left:4px!important}.v-application .ml-xl-2{margin-left:8px!important}.v-application .ml-xl-3{margin-left:12px!important}.v-application .ml-xl-4{margin-left:16px!important}.v-application .ml-xl-5{margin-left:20px!important}.v-application .ml-xl-6{margin-left:24px!important}.v-application .ml-xl-7{margin-left:28px!important}.v-application .ml-xl-8{margin-left:32px!important}.v-application .ml-xl-9{margin-left:36px!important}.v-application .ml-xl-10{margin-left:40px!important}.v-application .ml-xl-11{margin-left:44px!important}.v-application .ml-xl-12{margin-left:48px!important}.v-application .ml-xl-13{margin-left:52px!important}.v-application .ml-xl-14{margin-left:56px!important}.v-application .ml-xl-15{margin-left:60px!important}.v-application .ml-xl-16{margin-left:64px!important}.v-application .ml-xl-auto{margin-left:auto!important}.v-application--is-ltr .ms-xl-0{margin-left:0!important}.v-application--is-rtl .ms-xl-0{margin-right:0!important}.v-application--is-ltr .ms-xl-1{margin-left:4px!important}.v-application--is-rtl .ms-xl-1{margin-right:4px!important}.v-application--is-ltr .ms-xl-2{margin-left:8px!important}.v-application--is-rtl .ms-xl-2{margin-right:8px!important}.v-application--is-ltr .ms-xl-3{margin-left:12px!important}.v-application--is-rtl .ms-xl-3{margin-right:12px!important}.v-application--is-ltr .ms-xl-4{margin-left:16px!important}.v-application--is-rtl .ms-xl-4{margin-right:16px!important}.v-application--is-ltr .ms-xl-5{margin-left:20px!important}.v-application--is-rtl .ms-xl-5{margin-right:20px!important}.v-application--is-ltr .ms-xl-6{margin-left:24px!important}.v-application--is-rtl .ms-xl-6{margin-right:24px!important}.v-application--is-ltr .ms-xl-7{margin-left:28px!important}.v-application--is-rtl .ms-xl-7{margin-right:28px!important}.v-application--is-ltr .ms-xl-8{margin-left:32px!important}.v-application--is-rtl .ms-xl-8{margin-right:32px!important}.v-application--is-ltr .ms-xl-9{margin-left:36px!important}.v-application--is-rtl .ms-xl-9{margin-right:36px!important}.v-application--is-ltr .ms-xl-10{margin-left:40px!important}.v-application--is-rtl .ms-xl-10{margin-right:40px!important}.v-application--is-ltr .ms-xl-11{margin-left:44px!important}.v-application--is-rtl .ms-xl-11{margin-right:44px!important}.v-application--is-ltr .ms-xl-12{margin-left:48px!important}.v-application--is-rtl .ms-xl-12{margin-right:48px!important}.v-application--is-ltr .ms-xl-13{margin-left:52px!important}.v-application--is-rtl .ms-xl-13{margin-right:52px!important}.v-application--is-ltr .ms-xl-14{margin-left:56px!important}.v-application--is-rtl .ms-xl-14{margin-right:56px!important}.v-application--is-ltr .ms-xl-15{margin-left:60px!important}.v-application--is-rtl .ms-xl-15{margin-right:60px!important}.v-application--is-ltr .ms-xl-16{margin-left:64px!important}.v-application--is-rtl .ms-xl-16{margin-right:64px!important}.v-application--is-ltr .ms-xl-auto{margin-left:auto!important}.v-application--is-rtl .ms-xl-auto{margin-right:auto!important}.v-application--is-ltr .me-xl-0{margin-right:0!important}.v-application--is-rtl .me-xl-0{margin-left:0!important}.v-application--is-ltr .me-xl-1{margin-right:4px!important}.v-application--is-rtl .me-xl-1{margin-left:4px!important}.v-application--is-ltr .me-xl-2{margin-right:8px!important}.v-application--is-rtl .me-xl-2{margin-left:8px!important}.v-application--is-ltr .me-xl-3{margin-right:12px!important}.v-application--is-rtl .me-xl-3{margin-left:12px!important}.v-application--is-ltr .me-xl-4{margin-right:16px!important}.v-application--is-rtl .me-xl-4{margin-left:16px!important}.v-application--is-ltr .me-xl-5{margin-right:20px!important}.v-application--is-rtl .me-xl-5{margin-left:20px!important}.v-application--is-ltr .me-xl-6{margin-right:24px!important}.v-application--is-rtl .me-xl-6{margin-left:24px!important}.v-application--is-ltr .me-xl-7{margin-right:28px!important}.v-application--is-rtl .me-xl-7{margin-left:28px!important}.v-application--is-ltr .me-xl-8{margin-right:32px!important}.v-application--is-rtl .me-xl-8{margin-left:32px!important}.v-application--is-ltr .me-xl-9{margin-right:36px!important}.v-application--is-rtl .me-xl-9{margin-left:36px!important}.v-application--is-ltr .me-xl-10{margin-right:40px!important}.v-application--is-rtl .me-xl-10{margin-left:40px!important}.v-application--is-ltr .me-xl-11{margin-right:44px!important}.v-application--is-rtl .me-xl-11{margin-left:44px!important}.v-application--is-ltr .me-xl-12{margin-right:48px!important}.v-application--is-rtl .me-xl-12{margin-left:48px!important}.v-application--is-ltr .me-xl-13{margin-right:52px!important}.v-application--is-rtl .me-xl-13{margin-left:52px!important}.v-application--is-ltr .me-xl-14{margin-right:56px!important}.v-application--is-rtl .me-xl-14{margin-left:56px!important}.v-application--is-ltr .me-xl-15{margin-right:60px!important}.v-application--is-rtl .me-xl-15{margin-left:60px!important}.v-application--is-ltr .me-xl-16{margin-right:64px!important}.v-application--is-rtl .me-xl-16{margin-left:64px!important}.v-application--is-ltr .me-xl-auto{margin-right:auto!important}.v-application--is-rtl .me-xl-auto{margin-left:auto!important}.v-application .ma-xl-n1{margin:-4px!important}.v-application .ma-xl-n2{margin:-8px!important}.v-application .ma-xl-n3{margin:-12px!important}.v-application .ma-xl-n4{margin:-16px!important}.v-application .ma-xl-n5{margin:-20px!important}.v-application .ma-xl-n6{margin:-24px!important}.v-application .ma-xl-n7{margin:-28px!important}.v-application .ma-xl-n8{margin:-32px!important}.v-application .ma-xl-n9{margin:-36px!important}.v-application .ma-xl-n10{margin:-40px!important}.v-application .ma-xl-n11{margin:-44px!important}.v-application .ma-xl-n12{margin:-48px!important}.v-application .ma-xl-n13{margin:-52px!important}.v-application .ma-xl-n14{margin:-56px!important}.v-application .ma-xl-n15{margin:-60px!important}.v-application .ma-xl-n16{margin:-64px!important}.v-application .mx-xl-n1{margin-right:-4px!important;margin-left:-4px!important}.v-application .mx-xl-n2{margin-right:-8px!important;margin-left:-8px!important}.v-application .mx-xl-n3{margin-right:-12px!important;margin-left:-12px!important}.v-application .mx-xl-n4{margin-right:-16px!important;margin-left:-16px!important}.v-application .mx-xl-n5{margin-right:-20px!important;margin-left:-20px!important}.v-application .mx-xl-n6{margin-right:-24px!important;margin-left:-24px!important}.v-application .mx-xl-n7{margin-right:-28px!important;margin-left:-28px!important}.v-application .mx-xl-n8{margin-right:-32px!important;margin-left:-32px!important}.v-application .mx-xl-n9{margin-right:-36px!important;margin-left:-36px!important}.v-application .mx-xl-n10{margin-right:-40px!important;margin-left:-40px!important}.v-application .mx-xl-n11{margin-right:-44px!important;margin-left:-44px!important}.v-application .mx-xl-n12{margin-right:-48px!important;margin-left:-48px!important}.v-application .mx-xl-n13{margin-right:-52px!important;margin-left:-52px!important}.v-application .mx-xl-n14{margin-right:-56px!important;margin-left:-56px!important}.v-application .mx-xl-n15{margin-right:-60px!important;margin-left:-60px!important}.v-application .mx-xl-n16{margin-right:-64px!important;margin-left:-64px!important}.v-application .my-xl-n1{margin-top:-4px!important;margin-bottom:-4px!important}.v-application .my-xl-n2{margin-top:-8px!important;margin-bottom:-8px!important}.v-application .my-xl-n3{margin-top:-12px!important;margin-bottom:-12px!important}.v-application .my-xl-n4{margin-top:-16px!important;margin-bottom:-16px!important}.v-application .my-xl-n5{margin-top:-20px!important;margin-bottom:-20px!important}.v-application .my-xl-n6{margin-top:-24px!important;margin-bottom:-24px!important}.v-application .my-xl-n7{margin-top:-28px!important;margin-bottom:-28px!important}.v-application .my-xl-n8{margin-top:-32px!important;margin-bottom:-32px!important}.v-application .my-xl-n9{margin-top:-36px!important;margin-bottom:-36px!important}.v-application .my-xl-n10{margin-top:-40px!important;margin-bottom:-40px!important}.v-application .my-xl-n11{margin-top:-44px!important;margin-bottom:-44px!important}.v-application .my-xl-n12{margin-top:-48px!important;margin-bottom:-48px!important}.v-application .my-xl-n13{margin-top:-52px!important;margin-bottom:-52px!important}.v-application .my-xl-n14{margin-top:-56px!important;margin-bottom:-56px!important}.v-application .my-xl-n15{margin-top:-60px!important;margin-bottom:-60px!important}.v-application .my-xl-n16{margin-top:-64px!important;margin-bottom:-64px!important}.v-application .mt-xl-n1{margin-top:-4px!important}.v-application .mt-xl-n2{margin-top:-8px!important}.v-application .mt-xl-n3{margin-top:-12px!important}.v-application .mt-xl-n4{margin-top:-16px!important}.v-application .mt-xl-n5{margin-top:-20px!important}.v-application .mt-xl-n6{margin-top:-24px!important}.v-application .mt-xl-n7{margin-top:-28px!important}.v-application .mt-xl-n8{margin-top:-32px!important}.v-application .mt-xl-n9{margin-top:-36px!important}.v-application .mt-xl-n10{margin-top:-40px!important}.v-application .mt-xl-n11{margin-top:-44px!important}.v-application .mt-xl-n12{margin-top:-48px!important}.v-application .mt-xl-n13{margin-top:-52px!important}.v-application .mt-xl-n14{margin-top:-56px!important}.v-application .mt-xl-n15{margin-top:-60px!important}.v-application .mt-xl-n16{margin-top:-64px!important}.v-application .mr-xl-n1{margin-right:-4px!important}.v-application .mr-xl-n2{margin-right:-8px!important}.v-application .mr-xl-n3{margin-right:-12px!important}.v-application .mr-xl-n4{margin-right:-16px!important}.v-application .mr-xl-n5{margin-right:-20px!important}.v-application .mr-xl-n6{margin-right:-24px!important}.v-application .mr-xl-n7{margin-right:-28px!important}.v-application .mr-xl-n8{margin-right:-32px!important}.v-application .mr-xl-n9{margin-right:-36px!important}.v-application .mr-xl-n10{margin-right:-40px!important}.v-application .mr-xl-n11{margin-right:-44px!important}.v-application .mr-xl-n12{margin-right:-48px!important}.v-application .mr-xl-n13{margin-right:-52px!important}.v-application .mr-xl-n14{margin-right:-56px!important}.v-application .mr-xl-n15{margin-right:-60px!important}.v-application .mr-xl-n16{margin-right:-64px!important}.v-application .mb-xl-n1{margin-bottom:-4px!important}.v-application .mb-xl-n2{margin-bottom:-8px!important}.v-application .mb-xl-n3{margin-bottom:-12px!important}.v-application .mb-xl-n4{margin-bottom:-16px!important}.v-application .mb-xl-n5{margin-bottom:-20px!important}.v-application .mb-xl-n6{margin-bottom:-24px!important}.v-application .mb-xl-n7{margin-bottom:-28px!important}.v-application .mb-xl-n8{margin-bottom:-32px!important}.v-application .mb-xl-n9{margin-bottom:-36px!important}.v-application .mb-xl-n10{margin-bottom:-40px!important}.v-application .mb-xl-n11{margin-bottom:-44px!important}.v-application .mb-xl-n12{margin-bottom:-48px!important}.v-application .mb-xl-n13{margin-bottom:-52px!important}.v-application .mb-xl-n14{margin-bottom:-56px!important}.v-application .mb-xl-n15{margin-bottom:-60px!important}.v-application .mb-xl-n16{margin-bottom:-64px!important}.v-application .ml-xl-n1{margin-left:-4px!important}.v-application .ml-xl-n2{margin-left:-8px!important}.v-application .ml-xl-n3{margin-left:-12px!important}.v-application .ml-xl-n4{margin-left:-16px!important}.v-application .ml-xl-n5{margin-left:-20px!important}.v-application .ml-xl-n6{margin-left:-24px!important}.v-application .ml-xl-n7{margin-left:-28px!important}.v-application .ml-xl-n8{margin-left:-32px!important}.v-application .ml-xl-n9{margin-left:-36px!important}.v-application .ml-xl-n10{margin-left:-40px!important}.v-application .ml-xl-n11{margin-left:-44px!important}.v-application .ml-xl-n12{margin-left:-48px!important}.v-application .ml-xl-n13{margin-left:-52px!important}.v-application .ml-xl-n14{margin-left:-56px!important}.v-application .ml-xl-n15{margin-left:-60px!important}.v-application .ml-xl-n16{margin-left:-64px!important}.v-application--is-ltr .ms-xl-n1{margin-left:-4px!important}.v-application--is-rtl .ms-xl-n1{margin-right:-4px!important}.v-application--is-ltr .ms-xl-n2{margin-left:-8px!important}.v-application--is-rtl .ms-xl-n2{margin-right:-8px!important}.v-application--is-ltr .ms-xl-n3{margin-left:-12px!important}.v-application--is-rtl .ms-xl-n3{margin-right:-12px!important}.v-application--is-ltr .ms-xl-n4{margin-left:-16px!important}.v-application--is-rtl .ms-xl-n4{margin-right:-16px!important}.v-application--is-ltr .ms-xl-n5{margin-left:-20px!important}.v-application--is-rtl .ms-xl-n5{margin-right:-20px!important}.v-application--is-ltr .ms-xl-n6{margin-left:-24px!important}.v-application--is-rtl .ms-xl-n6{margin-right:-24px!important}.v-application--is-ltr .ms-xl-n7{margin-left:-28px!important}.v-application--is-rtl .ms-xl-n7{margin-right:-28px!important}.v-application--is-ltr .ms-xl-n8{margin-left:-32px!important}.v-application--is-rtl .ms-xl-n8{margin-right:-32px!important}.v-application--is-ltr .ms-xl-n9{margin-left:-36px!important}.v-application--is-rtl .ms-xl-n9{margin-right:-36px!important}.v-application--is-ltr .ms-xl-n10{margin-left:-40px!important}.v-application--is-rtl .ms-xl-n10{margin-right:-40px!important}.v-application--is-ltr .ms-xl-n11{margin-left:-44px!important}.v-application--is-rtl .ms-xl-n11{margin-right:-44px!important}.v-application--is-ltr .ms-xl-n12{margin-left:-48px!important}.v-application--is-rtl .ms-xl-n12{margin-right:-48px!important}.v-application--is-ltr .ms-xl-n13{margin-left:-52px!important}.v-application--is-rtl .ms-xl-n13{margin-right:-52px!important}.v-application--is-ltr .ms-xl-n14{margin-left:-56px!important}.v-application--is-rtl .ms-xl-n14{margin-right:-56px!important}.v-application--is-ltr .ms-xl-n15{margin-left:-60px!important}.v-application--is-rtl .ms-xl-n15{margin-right:-60px!important}.v-application--is-ltr .ms-xl-n16{margin-left:-64px!important}.v-application--is-rtl .ms-xl-n16{margin-right:-64px!important}.v-application--is-ltr .me-xl-n1{margin-right:-4px!important}.v-application--is-rtl .me-xl-n1{margin-left:-4px!important}.v-application--is-ltr .me-xl-n2{margin-right:-8px!important}.v-application--is-rtl .me-xl-n2{margin-left:-8px!important}.v-application--is-ltr .me-xl-n3{margin-right:-12px!important}.v-application--is-rtl .me-xl-n3{margin-left:-12px!important}.v-application--is-ltr .me-xl-n4{margin-right:-16px!important}.v-application--is-rtl .me-xl-n4{margin-left:-16px!important}.v-application--is-ltr .me-xl-n5{margin-right:-20px!important}.v-application--is-rtl .me-xl-n5{margin-left:-20px!important}.v-application--is-ltr .me-xl-n6{margin-right:-24px!important}.v-application--is-rtl .me-xl-n6{margin-left:-24px!important}.v-application--is-ltr .me-xl-n7{margin-right:-28px!important}.v-application--is-rtl .me-xl-n7{margin-left:-28px!important}.v-application--is-ltr .me-xl-n8{margin-right:-32px!important}.v-application--is-rtl .me-xl-n8{margin-left:-32px!important}.v-application--is-ltr .me-xl-n9{margin-right:-36px!important}.v-application--is-rtl .me-xl-n9{margin-left:-36px!important}.v-application--is-ltr .me-xl-n10{margin-right:-40px!important}.v-application--is-rtl .me-xl-n10{margin-left:-40px!important}.v-application--is-ltr .me-xl-n11{margin-right:-44px!important}.v-application--is-rtl .me-xl-n11{margin-left:-44px!important}.v-application--is-ltr .me-xl-n12{margin-right:-48px!important}.v-application--is-rtl .me-xl-n12{margin-left:-48px!important}.v-application--is-ltr .me-xl-n13{margin-right:-52px!important}.v-application--is-rtl .me-xl-n13{margin-left:-52px!important}.v-application--is-ltr .me-xl-n14{margin-right:-56px!important}.v-application--is-rtl .me-xl-n14{margin-left:-56px!important}.v-application--is-ltr .me-xl-n15{margin-right:-60px!important}.v-application--is-rtl .me-xl-n15{margin-left:-60px!important}.v-application--is-ltr .me-xl-n16{margin-right:-64px!important}.v-application--is-rtl .me-xl-n16{margin-left:-64px!important}.v-application .pa-xl-0{padding:0!important}.v-application .pa-xl-1{padding:4px!important}.v-application .pa-xl-2{padding:8px!important}.v-application .pa-xl-3{padding:12px!important}.v-application .pa-xl-4{padding:16px!important}.v-application .pa-xl-5{padding:20px!important}.v-application .pa-xl-6{padding:24px!important}.v-application .pa-xl-7{padding:28px!important}.v-application .pa-xl-8{padding:32px!important}.v-application .pa-xl-9{padding:36px!important}.v-application .pa-xl-10{padding:40px!important}.v-application .pa-xl-11{padding:44px!important}.v-application .pa-xl-12{padding:48px!important}.v-application .pa-xl-13{padding:52px!important}.v-application .pa-xl-14{padding:56px!important}.v-application .pa-xl-15{padding:60px!important}.v-application .pa-xl-16{padding:64px!important}.v-application .px-xl-0{padding-right:0!important;padding-left:0!important}.v-application .px-xl-1{padding-right:4px!important;padding-left:4px!important}.v-application .px-xl-2{padding-right:8px!important;padding-left:8px!important}.v-application .px-xl-3{padding-right:12px!important;padding-left:12px!important}.v-application .px-xl-4{padding-right:16px!important;padding-left:16px!important}.v-application .px-xl-5{padding-right:20px!important;padding-left:20px!important}.v-application .px-xl-6{padding-right:24px!important;padding-left:24px!important}.v-application .px-xl-7{padding-right:28px!important;padding-left:28px!important}.v-application .px-xl-8{padding-right:32px!important;padding-left:32px!important}.v-application .px-xl-9{padding-right:36px!important;padding-left:36px!important}.v-application .px-xl-10{padding-right:40px!important;padding-left:40px!important}.v-application .px-xl-11{padding-right:44px!important;padding-left:44px!important}.v-application .px-xl-12{padding-right:48px!important;padding-left:48px!important}.v-application .px-xl-13{padding-right:52px!important;padding-left:52px!important}.v-application .px-xl-14{padding-right:56px!important;padding-left:56px!important}.v-application .px-xl-15{padding-right:60px!important;padding-left:60px!important}.v-application .px-xl-16{padding-right:64px!important;padding-left:64px!important}.v-application .py-xl-0{padding-top:0!important;padding-bottom:0!important}.v-application .py-xl-1{padding-top:4px!important;padding-bottom:4px!important}.v-application .py-xl-2{padding-top:8px!important;padding-bottom:8px!important}.v-application .py-xl-3{padding-top:12px!important;padding-bottom:12px!important}.v-application .py-xl-4{padding-top:16px!important;padding-bottom:16px!important}.v-application .py-xl-5{padding-top:20px!important;padding-bottom:20px!important}.v-application .py-xl-6{padding-top:24px!important;padding-bottom:24px!important}.v-application .py-xl-7{padding-top:28px!important;padding-bottom:28px!important}.v-application .py-xl-8{padding-top:32px!important;padding-bottom:32px!important}.v-application .py-xl-9{padding-top:36px!important;padding-bottom:36px!important}.v-application .py-xl-10{padding-top:40px!important;padding-bottom:40px!important}.v-application .py-xl-11{padding-top:44px!important;padding-bottom:44px!important}.v-application .py-xl-12{padding-top:48px!important;padding-bottom:48px!important}.v-application .py-xl-13{padding-top:52px!important;padding-bottom:52px!important}.v-application .py-xl-14{padding-top:56px!important;padding-bottom:56px!important}.v-application .py-xl-15{padding-top:60px!important;padding-bottom:60px!important}.v-application .py-xl-16{padding-top:64px!important;padding-bottom:64px!important}.v-application .pt-xl-0{padding-top:0!important}.v-application .pt-xl-1{padding-top:4px!important}.v-application .pt-xl-2{padding-top:8px!important}.v-application .pt-xl-3{padding-top:12px!important}.v-application .pt-xl-4{padding-top:16px!important}.v-application .pt-xl-5{padding-top:20px!important}.v-application .pt-xl-6{padding-top:24px!important}.v-application .pt-xl-7{padding-top:28px!important}.v-application .pt-xl-8{padding-top:32px!important}.v-application .pt-xl-9{padding-top:36px!important}.v-application .pt-xl-10{padding-top:40px!important}.v-application .pt-xl-11{padding-top:44px!important}.v-application .pt-xl-12{padding-top:48px!important}.v-application .pt-xl-13{padding-top:52px!important}.v-application .pt-xl-14{padding-top:56px!important}.v-application .pt-xl-15{padding-top:60px!important}.v-application .pt-xl-16{padding-top:64px!important}.v-application .pr-xl-0{padding-right:0!important}.v-application .pr-xl-1{padding-right:4px!important}.v-application .pr-xl-2{padding-right:8px!important}.v-application .pr-xl-3{padding-right:12px!important}.v-application .pr-xl-4{padding-right:16px!important}.v-application .pr-xl-5{padding-right:20px!important}.v-application .pr-xl-6{padding-right:24px!important}.v-application .pr-xl-7{padding-right:28px!important}.v-application .pr-xl-8{padding-right:32px!important}.v-application .pr-xl-9{padding-right:36px!important}.v-application .pr-xl-10{padding-right:40px!important}.v-application .pr-xl-11{padding-right:44px!important}.v-application .pr-xl-12{padding-right:48px!important}.v-application .pr-xl-13{padding-right:52px!important}.v-application .pr-xl-14{padding-right:56px!important}.v-application .pr-xl-15{padding-right:60px!important}.v-application .pr-xl-16{padding-right:64px!important}.v-application .pb-xl-0{padding-bottom:0!important}.v-application .pb-xl-1{padding-bottom:4px!important}.v-application .pb-xl-2{padding-bottom:8px!important}.v-application .pb-xl-3{padding-bottom:12px!important}.v-application .pb-xl-4{padding-bottom:16px!important}.v-application .pb-xl-5{padding-bottom:20px!important}.v-application .pb-xl-6{padding-bottom:24px!important}.v-application .pb-xl-7{padding-bottom:28px!important}.v-application .pb-xl-8{padding-bottom:32px!important}.v-application .pb-xl-9{padding-bottom:36px!important}.v-application .pb-xl-10{padding-bottom:40px!important}.v-application .pb-xl-11{padding-bottom:44px!important}.v-application .pb-xl-12{padding-bottom:48px!important}.v-application .pb-xl-13{padding-bottom:52px!important}.v-application .pb-xl-14{padding-bottom:56px!important}.v-application .pb-xl-15{padding-bottom:60px!important}.v-application .pb-xl-16{padding-bottom:64px!important}.v-application .pl-xl-0{padding-left:0!important}.v-application .pl-xl-1{padding-left:4px!important}.v-application .pl-xl-2{padding-left:8px!important}.v-application .pl-xl-3{padding-left:12px!important}.v-application .pl-xl-4{padding-left:16px!important}.v-application .pl-xl-5{padding-left:20px!important}.v-application .pl-xl-6{padding-left:24px!important}.v-application .pl-xl-7{padding-left:28px!important}.v-application .pl-xl-8{padding-left:32px!important}.v-application .pl-xl-9{padding-left:36px!important}.v-application .pl-xl-10{padding-left:40px!important}.v-application .pl-xl-11{padding-left:44px!important}.v-application .pl-xl-12{padding-left:48px!important}.v-application .pl-xl-13{padding-left:52px!important}.v-application .pl-xl-14{padding-left:56px!important}.v-application .pl-xl-15{padding-left:60px!important}.v-application .pl-xl-16{padding-left:64px!important}.v-application--is-ltr .ps-xl-0{padding-left:0!important}.v-application--is-rtl .ps-xl-0{padding-right:0!important}.v-application--is-ltr .ps-xl-1{padding-left:4px!important}.v-application--is-rtl .ps-xl-1{padding-right:4px!important}.v-application--is-ltr .ps-xl-2{padding-left:8px!important}.v-application--is-rtl .ps-xl-2{padding-right:8px!important}.v-application--is-ltr .ps-xl-3{padding-left:12px!important}.v-application--is-rtl .ps-xl-3{padding-right:12px!important}.v-application--is-ltr .ps-xl-4{padding-left:16px!important}.v-application--is-rtl .ps-xl-4{padding-right:16px!important}.v-application--is-ltr .ps-xl-5{padding-left:20px!important}.v-application--is-rtl .ps-xl-5{padding-right:20px!important}.v-application--is-ltr .ps-xl-6{padding-left:24px!important}.v-application--is-rtl .ps-xl-6{padding-right:24px!important}.v-application--is-ltr .ps-xl-7{padding-left:28px!important}.v-application--is-rtl .ps-xl-7{padding-right:28px!important}.v-application--is-ltr .ps-xl-8{padding-left:32px!important}.v-application--is-rtl .ps-xl-8{padding-right:32px!important}.v-application--is-ltr .ps-xl-9{padding-left:36px!important}.v-application--is-rtl .ps-xl-9{padding-right:36px!important}.v-application--is-ltr .ps-xl-10{padding-left:40px!important}.v-application--is-rtl .ps-xl-10{padding-right:40px!important}.v-application--is-ltr .ps-xl-11{padding-left:44px!important}.v-application--is-rtl .ps-xl-11{padding-right:44px!important}.v-application--is-ltr .ps-xl-12{padding-left:48px!important}.v-application--is-rtl .ps-xl-12{padding-right:48px!important}.v-application--is-ltr .ps-xl-13{padding-left:52px!important}.v-application--is-rtl .ps-xl-13{padding-right:52px!important}.v-application--is-ltr .ps-xl-14{padding-left:56px!important}.v-application--is-rtl .ps-xl-14{padding-right:56px!important}.v-application--is-ltr .ps-xl-15{padding-left:60px!important}.v-application--is-rtl .ps-xl-15{padding-right:60px!important}.v-application--is-ltr .ps-xl-16{padding-left:64px!important}.v-application--is-rtl .ps-xl-16{padding-right:64px!important}.v-application--is-ltr .pe-xl-0{padding-right:0!important}.v-application--is-rtl .pe-xl-0{padding-left:0!important}.v-application--is-ltr .pe-xl-1{padding-right:4px!important}.v-application--is-rtl .pe-xl-1{padding-left:4px!important}.v-application--is-ltr .pe-xl-2{padding-right:8px!important}.v-application--is-rtl .pe-xl-2{padding-left:8px!important}.v-application--is-ltr .pe-xl-3{padding-right:12px!important}.v-application--is-rtl .pe-xl-3{padding-left:12px!important}.v-application--is-ltr .pe-xl-4{padding-right:16px!important}.v-application--is-rtl .pe-xl-4{padding-left:16px!important}.v-application--is-ltr .pe-xl-5{padding-right:20px!important}.v-application--is-rtl .pe-xl-5{padding-left:20px!important}.v-application--is-ltr .pe-xl-6{padding-right:24px!important}.v-application--is-rtl .pe-xl-6{padding-left:24px!important}.v-application--is-ltr .pe-xl-7{padding-right:28px!important}.v-application--is-rtl .pe-xl-7{padding-left:28px!important}.v-application--is-ltr .pe-xl-8{padding-right:32px!important}.v-application--is-rtl .pe-xl-8{padding-left:32px!important}.v-application--is-ltr .pe-xl-9{padding-right:36px!important}.v-application--is-rtl .pe-xl-9{padding-left:36px!important}.v-application--is-ltr .pe-xl-10{padding-right:40px!important}.v-application--is-rtl .pe-xl-10{padding-left:40px!important}.v-application--is-ltr .pe-xl-11{padding-right:44px!important}.v-application--is-rtl .pe-xl-11{padding-left:44px!important}.v-application--is-ltr .pe-xl-12{padding-right:48px!important}.v-application--is-rtl .pe-xl-12{padding-left:48px!important}.v-application--is-ltr .pe-xl-13{padding-right:52px!important}.v-application--is-rtl .pe-xl-13{padding-left:52px!important}.v-application--is-ltr .pe-xl-14{padding-right:56px!important}.v-application--is-rtl .pe-xl-14{padding-left:56px!important}.v-application--is-ltr .pe-xl-15{padding-right:60px!important}.v-application--is-rtl .pe-xl-15{padding-left:60px!important}.v-application--is-ltr .pe-xl-16{padding-right:64px!important}.v-application--is-rtl .pe-xl-16{padding-left:64px!important}.v-application .text-xl-left{text-align:left!important}.v-application .text-xl-right{text-align:right!important}.v-application .text-xl-center{text-align:center!important}.v-application .text-xl-justify{text-align:justify!important}.v-application .text-xl-start{text-align:start!important}.v-application .text-xl-end{text-align:end!important}.v-application .text-xl-h1{font-size:6rem!important;line-height:6rem;letter-spacing:-.015625em!important}.v-application .text-xl-h1,.v-application .text-xl-h2{font-weight:300;font-family:Roboto,sans-serif!important}.v-application .text-xl-h2{font-size:3.75rem!important;line-height:3.75rem;letter-spacing:-.0083333333em!important}.v-application .text-xl-h3{font-size:3rem!important;line-height:3.125rem;letter-spacing:normal!important}.v-application .text-xl-h3,.v-application .text-xl-h4{font-weight:400;font-family:Roboto,sans-serif!important}.v-application .text-xl-h4{font-size:2.125rem!important;line-height:2.5rem;letter-spacing:.0073529412em!important}.v-application .text-xl-h5{font-size:1.5rem!important;font-weight:400;letter-spacing:normal!important}.v-application .text-xl-h5,.v-application .text-xl-h6{line-height:2rem;font-family:Roboto,sans-serif!important}.v-application .text-xl-h6{font-size:1.25rem!important;font-weight:500;letter-spacing:.0125em!important}.v-application .text-xl-subtitle-1{font-size:1rem!important;font-weight:400;line-height:1.75rem;letter-spacing:.009375em!important;font-family:Roboto,sans-serif!important}.v-application .text-xl-subtitle-2{font-size:.875rem!important;font-weight:500;line-height:1.375rem;letter-spacing:.0071428571em!important;font-family:Roboto,sans-serif!important}.v-application .text-xl-body-1{font-size:1rem!important;font-weight:400;line-height:1.5rem;letter-spacing:.03125em!important;font-family:Roboto,sans-serif!important}.v-application .text-xl-body-2{font-weight:400;line-height:1.25rem;letter-spacing:.0178571429em!important}.v-application .text-xl-body-2,.v-application .text-xl-button{font-size:.875rem!important;font-family:Roboto,sans-serif!important}.v-application .text-xl-button{font-weight:500;line-height:2.25rem;letter-spacing:.0892857143em!important;text-transform:uppercase!important}.v-application .text-xl-caption{font-weight:400;line-height:1.25rem;letter-spacing:.0333333333em!important}.v-application .text-xl-caption,.v-application .text-xl-overline{font-size:.75rem!important;font-family:Roboto,sans-serif!important}.v-application .text-xl-overline{font-weight:500;line-height:2rem;letter-spacing:.1666666667em!important;text-transform:uppercase!important}}@media print{.v-application .d-print-none{display:none!important}.v-application .d-print-inline{display:inline!important}.v-application .d-print-inline-block{display:inline-block!important}.v-application .d-print-block{display:block!important}.v-application .d-print-table{display:table!important}.v-application .d-print-table-row{display:table-row!important}.v-application .d-print-table-cell{display:table-cell!important}.v-application .d-print-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.v-application .d-print-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}.v-application .float-print-none{float:none!important}.v-application .float-print-left{float:left!important}.v-application .float-print-right{float:right!important}.v-application--is-rtl .float-print-end{float:left!important}.v-application--is-ltr .float-print-end,.v-application--is-rtl .float-print-start{float:right!important}.v-application--is-ltr .float-print-start{float:left!important}}.v-btn:not(.v-btn--outlined).accent,.v-btn:not(.v-btn--outlined).error,.v-btn:not(.v-btn--outlined).info,.v-btn:not(.v-btn--outlined).primary,.v-btn:not(.v-btn--outlined).secondary,.v-btn:not(.v-btn--outlined).success,.v-btn:not(.v-btn--outlined).warning{color:#fff}.theme--light.v-btn{color:rgba(0,0,0,.87)}.theme--light.v-btn.v-btn--disabled,.theme--light.v-btn.v-btn--disabled .v-btn__loading,.theme--light.v-btn.v-btn--disabled .v-icon{color:rgba(0,0,0,.26)!important}.theme--light.v-btn.v-btn--disabled.v-btn--has-bg{background-color:rgba(0,0,0,.12)!important}.theme--light.v-btn.v-btn--has-bg{background-color:#f5f5f5}.theme--light.v-btn.v-btn--outlined.v-btn--text{border-color:rgba(0,0,0,.12)}.theme--light.v-btn.v-btn--icon{color:rgba(0,0,0,.54)}.theme--light.v-btn:hover:before{opacity:.08}.theme--light.v-btn:focus:before{opacity:.24}.theme--light.v-btn--active:before,.theme--light.v-btn--active:hover:before{opacity:.18}.theme--light.v-btn--active:focus:before{opacity:.16}.theme--dark.v-btn{color:#fff}.theme--dark.v-btn.v-btn--disabled,.theme--dark.v-btn.v-btn--disabled .v-btn__loading,.theme--dark.v-btn.v-btn--disabled .v-icon{color:hsla(0,0%,100%,.3)!important}.theme--dark.v-btn.v-btn--disabled.v-btn--has-bg{background-color:hsla(0,0%,100%,.12)!important}.theme--dark.v-btn.v-btn--has-bg{background-color:#272727}.theme--dark.v-btn.v-btn--outlined.v-btn--text{border-color:hsla(0,0%,100%,.12)}.theme--dark.v-btn.v-btn--icon{color:#fff}.theme--dark.v-btn:hover:before{opacity:.08}.theme--dark.v-btn:focus:before{opacity:.24}.theme--dark.v-btn--active:before,.theme--dark.v-btn--active:hover:before{opacity:.18}.theme--dark.v-btn--active:focus:before{opacity:.32}.v-btn{-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-radius:4px;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;font-weight:500;letter-spacing:.0892857143em;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;outline:0;position:relative;text-decoration:none;text-indent:.0892857143em;text-transform:uppercase;-webkit-transition-duration:.28s;transition-duration:.28s;-webkit-transition-property:opacity,-webkit-box-shadow,-webkit-transform;transition-property:opacity,-webkit-box-shadow,-webkit-transform;transition-property:box-shadow,transform,opacity;transition-property:box-shadow,transform,opacity,-webkit-box-shadow,-webkit-transform;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;white-space:nowrap}.v-btn.v-size--x-small{font-size:.625rem}.v-btn.v-size--small{font-size:.75rem}.v-btn.v-size--default,.v-btn.v-size--large{font-size:.875rem}.v-btn.v-size--x-large{font-size:1rem}.v-btn:before{background-color:currentColor;border-radius:inherit;bottom:0;color:inherit;content:"";left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:0;-webkit-transition:opacity .2s cubic-bezier(.4,0,.6,1);transition:opacity .2s cubic-bezier(.4,0,.6,1)}.v-btn:not(.v-btn--round).v-size--x-small{height:20px;min-width:36px;padding:0 8.8888888889px}.v-btn:not(.v-btn--round).v-size--small{height:28px;min-width:50px;padding:0 12.4444444444px}.v-btn:not(.v-btn--round).v-size--default{height:36px;min-width:64px;padding:0 16px}.v-btn:not(.v-btn--round).v-size--large{height:44px;min-width:78px;padding:0 19.5555555556px}.v-btn:not(.v-btn--round).v-size--x-large{height:52px;min-width:92px;padding:0 23.1111111111px}.v-btn>.v-btn__content .v-icon{color:inherit}.v-btn__content{-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:inherit;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;-webkit-box-pack:inherit;-ms-flex-pack:inherit;justify-content:inherit;line-height:normal;position:relative;-webkit-transition:inherit;transition:inherit;-webkit-transition-property:opacity;transition-property:opacity}.v-btn__content .v-icon.v-icon--left,.v-btn__content .v-icon.v-icon--right{font-size:18px;height:18px;width:18px}.v-application--is-ltr .v-btn__content .v-icon--left{margin-left:-4px;margin-right:8px}.v-application--is-ltr .v-btn__content .v-icon--right,.v-application--is-rtl .v-btn__content .v-icon--left{margin-left:8px;margin-right:-4px}.v-application--is-rtl .v-btn__content .v-icon--right{margin-left:-4px;margin-right:8px}.v-btn__loader{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;height:100%;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;left:0;position:absolute;top:0;width:100%}.v-btn--absolute.v-btn--right,.v-btn--fixed.v-btn--right{right:16px}.v-btn--absolute.v-btn--left,.v-btn--fixed.v-btn--left{left:16px}.v-btn--absolute.v-btn--top,.v-btn--fixed.v-btn--top{top:16px}.v-btn--absolute.v-btn--bottom,.v-btn--fixed.v-btn--bottom{bottom:16px}.v-btn--absolute{position:absolute}.v-btn--fixed{position:fixed}.v-btn--block{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;min-width:100%!important;max-width:auto}.v-btn--is-elevated{-webkit-box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12);box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.v-btn--is-elevated:after{-webkit-box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12);box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.v-btn--is-elevated:active{-webkit-box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12);box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.v-btn--is-elevated.v-btn--fab{-webkit-box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12);box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.v-btn--is-elevated.v-btn--fab:after{-webkit-box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12);box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.v-btn--is-elevated.v-btn--fab:active{-webkit-box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12);box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.v-btn--disabled{pointer-events:none}.v-btn--fab,.v-btn--icon{min-height:0;min-width:0;padding:0}.v-btn--fab.v-size--x-small .v-icon,.v-btn--icon.v-size--x-small .v-icon{height:18px;font-size:18px;width:18px}.v-btn--fab.v-size--default .v-icon,.v-btn--fab.v-size--small .v-icon,.v-btn--icon.v-size--default .v-icon,.v-btn--icon.v-size--small .v-icon{height:24px;font-size:24px;width:24px}.v-btn--fab.v-size--large .v-icon,.v-btn--icon.v-size--large .v-icon{height:28px;font-size:28px;width:28px}.v-btn--fab.v-size--x-large .v-icon,.v-btn--icon.v-size--x-large .v-icon{height:32px;font-size:32px;width:32px}.v-btn--icon.v-size--x-small{height:20px;width:20px}.v-btn--icon.v-size--small{height:28px;width:28px}.v-btn--icon.v-size--default{height:36px;width:36px}.v-btn--icon.v-size--large{height:44px;width:44px}.v-btn--icon.v-size--x-large{height:52px;width:52px}.v-btn--fab.v-btn--absolute,.v-btn--fab.v-btn--fixed{z-index:4}.v-btn--fab.v-size--x-small{height:32px;width:32px}.v-btn--fab.v-size--x-small.v-btn--absolute.v-btn--bottom{bottom:-16px}.v-btn--fab.v-size--x-small.v-btn--absolute.v-btn--top{top:-16px}.v-btn--fab.v-size--small{height:40px;width:40px}.v-btn--fab.v-size--small.v-btn--absolute.v-btn--bottom{bottom:-20px}.v-btn--fab.v-size--small.v-btn--absolute.v-btn--top{top:-20px}.v-btn--fab.v-size--default{height:56px;width:56px}.v-btn--fab.v-size--default.v-btn--absolute.v-btn--bottom{bottom:-28px}.v-btn--fab.v-size--default.v-btn--absolute.v-btn--top{top:-28px}.v-btn--fab.v-size--large{height:64px;width:64px}.v-btn--fab.v-size--large.v-btn--absolute.v-btn--bottom{bottom:-32px}.v-btn--fab.v-size--large.v-btn--absolute.v-btn--top{top:-32px}.v-btn--fab.v-size--x-large{height:72px;width:72px}.v-btn--fab.v-size--x-large.v-btn--absolute.v-btn--bottom{bottom:-36px}.v-btn--fab.v-size--x-large.v-btn--absolute.v-btn--top{top:-36px}.v-btn--loading{pointer-events:none;-webkit-transition:none;transition:none}.v-btn--loading .v-btn__content{opacity:0}.v-btn--outlined{border:thin solid currentColor}.v-btn--plain:before{display:none}.v-btn--plain:not(.v-btn--active):not(.v-btn--loading):not(:focus):not(:hover) .v-btn__content{opacity:.62}.v-btn--round{border-radius:50%}.v-btn--rounded{border-radius:28px}.v-btn--tile{border-radius:0}.theme--light.v-sheet{background-color:#fff;border-color:#fff;color:rgba(0,0,0,.87)}.theme--light.v-sheet--outlined{border:thin solid rgba(0,0,0,.12)}.theme--dark.v-sheet{background-color:#1e1e1e;border-color:#1e1e1e;color:#fff}.theme--dark.v-sheet--outlined{border:thin solid hsla(0,0%,100%,.12)}.v-sheet{border-radius:0}.v-sheet:not(.v-sheet--outlined){-webkit-box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12);box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.v-sheet.v-sheet--shaped{border-radius:24px 0}.v-ripple__container{border-radius:inherit;width:100%;height:100%;z-index:0;contain:strict}.v-ripple__animation,.v-ripple__container{color:inherit;position:absolute;left:0;top:0;overflow:hidden;pointer-events:none}.v-ripple__animation{border-radius:50%;background:currentColor;opacity:0;will-change:transform,opacity}.v-ripple__animation--enter{-webkit-transition:none;transition:none}.v-ripple__animation--in{-webkit-transition:opacity .1s cubic-bezier(.4,0,.2,1),-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:opacity .1s cubic-bezier(.4,0,.2,1),-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .1s cubic-bezier(.4,0,.2,1);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .1s cubic-bezier(.4,0,.2,1),-webkit-transform .25s cubic-bezier(.4,0,.2,1)}.v-ripple__animation--out{-webkit-transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity .3s cubic-bezier(.4,0,.2,1)}.v-progress-circular{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.v-progress-circular>svg{width:100%;height:100%;margin:auto;position:absolute;top:0;bottom:0;left:0;right:0;z-index:0}.v-progress-circular--indeterminate>svg{-webkit-animation:progress-circular-rotate 1.4s linear infinite;animation:progress-circular-rotate 1.4s linear infinite;-webkit-transform-origin:center center;transform-origin:center center;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.v-progress-circular--indeterminate .v-progress-circular__overlay{-webkit-animation:progress-circular-dash 1.4s ease-in-out infinite;animation:progress-circular-dash 1.4s ease-in-out infinite;stroke-linecap:round;stroke-dasharray:80,200;stroke-dashoffset:0px}.v-progress-circular--indeterminate:not(.v-progress-circular--visible) .v-progress-circular__overlay,.v-progress-circular--indeterminate:not(.v-progress-circular--visible)>svg{-webkit-animation-play-state:paused!important;animation-play-state:paused!important}.v-progress-circular__info{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.v-progress-circular__underlay{stroke:hsla(0,0%,62%,.4);z-index:1}.v-progress-circular__overlay{stroke:currentColor;z-index:2;-webkit-transition:all .6s ease-in-out;transition:all .6s ease-in-out}@-webkit-keyframes progress-circular-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0px}50%{stroke-dasharray:100,200;stroke-dashoffset:-15px}to{stroke-dasharray:100,200;stroke-dashoffset:-124px}}@keyframes progress-circular-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0px}50%{stroke-dasharray:100,200;stroke-dashoffset:-15px}to{stroke-dasharray:100,200;stroke-dashoffset:-124px}}@-webkit-keyframes progress-circular-rotate{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes progress-circular-rotate{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.theme--light.v-card{background-color:#fff;color:rgba(0,0,0,.87)}.theme--light.v-card>.v-card__subtitle,.theme--light.v-card>.v-card__text{color:rgba(0,0,0,.6)}.theme--dark.v-card{background-color:#1e1e1e;color:#fff}.theme--dark.v-card>.v-card__subtitle,.theme--dark.v-card>.v-card__text{color:hsla(0,0%,100%,.7)}.v-sheet.v-card{border-radius:4px}.v-sheet.v-card:not(.v-sheet--outlined){-webkit-box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12);box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.v-sheet.v-card.v-sheet--shaped{border-radius:24px 4px}.v-card{border-width:thin;display:block;max-width:100%;outline:none;text-decoration:none;-webkit-transition-property:opacity,-webkit-box-shadow;transition-property:opacity,-webkit-box-shadow;transition-property:box-shadow,opacity;transition-property:box-shadow,opacity,-webkit-box-shadow;overflow-wrap:break-word;position:relative;white-space:normal}.v-card>.v-card__progress+:not(.v-btn):not(.v-chip):not(.v-avatar),.v-card>:first-child:not(.v-btn):not(.v-chip):not(.v-avatar){border-top-left-radius:inherit;border-top-right-radius:inherit}.v-card>:last-child:not(.v-btn):not(.v-chip):not(.v-avatar){border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.v-card__progress{top:0;left:0;right:0;overflow:hidden}.v-card__subtitle+.v-card__text{padding-top:0}.v-card__subtitle,.v-card__text{font-size:.875rem;font-weight:400;line-height:1.375rem;letter-spacing:.0071428571em}.v-card__subtitle,.v-card__text,.v-card__title{padding:16px}.v-card__title{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;font-size:1.25rem;font-weight:500;letter-spacing:.0125em;line-height:2rem;word-break:break-all}.v-card__title+.v-card__subtitle,.v-card__title+.v-card__text{padding-top:0}.v-card__title+.v-card__subtitle{margin-top:-16px}.v-card__text{width:100%}.v-card__actions{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;padding:8px}.v-card__actions>.v-btn.v-btn{padding:0 8px}.v-application--is-ltr .v-card__actions>.v-btn.v-btn+.v-btn{margin-left:8px}.v-application--is-ltr .v-card__actions>.v-btn.v-btn .v-icon--left{margin-left:4px}.v-application--is-ltr .v-card__actions>.v-btn.v-btn .v-icon--right{margin-right:4px}.v-application--is-rtl .v-card__actions>.v-btn.v-btn+.v-btn{margin-right:8px}.v-application--is-rtl .v-card__actions>.v-btn.v-btn .v-icon--left{margin-right:4px}.v-application--is-rtl .v-card__actions>.v-btn.v-btn .v-icon--right{margin-left:4px}.v-card--flat{-webkit-box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)!important;box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)!important}.v-sheet.v-card--hover{cursor:pointer;-webkit-transition:-webkit-box-shadow .4s cubic-bezier(.25,.8,.25,1);transition:-webkit-box-shadow .4s cubic-bezier(.25,.8,.25,1);transition:box-shadow .4s cubic-bezier(.25,.8,.25,1);transition:box-shadow .4s cubic-bezier(.25,.8,.25,1),-webkit-box-shadow .4s cubic-bezier(.25,.8,.25,1)}.v-sheet.v-card--hover:focus,.v-sheet.v-card--hover:hover{-webkit-box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12);box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.v-card--link,.v-card--link .v-chip{cursor:pointer}.v-card--link:focus:before{opacity:.08}.v-card--link:before{background:currentColor;bottom:0;content:"";left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:0;-webkit-transition:opacity .2s;transition:opacity .2s}.v-card--disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.v-card--disabled>:not(.v-card__progress){opacity:.6;-webkit-transition:inherit;transition:inherit}.v-card--loading{overflow:hidden}.v-card--raised{-webkit-box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12);box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.theme--light.v-progress-linear{color:rgba(0,0,0,.87)}.theme--dark.v-progress-linear{color:#fff}.v-progress-linear{background:transparent;overflow:hidden;position:relative;-webkit-transition:.2s cubic-bezier(.4,0,.6,1);transition:.2s cubic-bezier(.4,0,.6,1);width:100%}.v-progress-linear__buffer{height:inherit;left:0;position:absolute;top:0;-webkit-transition:inherit;transition:inherit;width:100%}.v-progress-linear--reverse .v-progress-linear__buffer{left:auto;right:0}.v-progress-linear__background{bottom:0;left:0;position:absolute;top:0;-webkit-transition:inherit;transition:inherit}.v-progress-linear--reverse .v-progress-linear__background{left:auto;right:0}.v-progress-linear__content{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;height:100%;left:0;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;position:absolute;top:0;width:100%}.v-progress-linear--reverse .v-progress-linear__content{left:auto;right:0}.v-progress-linear__determinate{height:inherit;left:0;position:absolute;-webkit-transition:inherit;transition:inherit}.v-progress-linear--reverse .v-progress-linear__determinate{left:auto;right:0}.v-progress-linear .v-progress-linear__indeterminate .long,.v-progress-linear .v-progress-linear__indeterminate .short{-webkit-animation-play-state:paused;animation-play-state:paused;background-color:inherit;bottom:0;height:inherit;left:0;position:absolute;right:auto;top:0;width:auto;will-change:left,right}.v-progress-linear .v-progress-linear__indeterminate--active .long{-webkit-animation-name:indeterminate-ltr;animation-name:indeterminate-ltr;-webkit-animation-duration:2.2s;animation-duration:2.2s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.v-progress-linear .v-progress-linear__indeterminate--active .short{-webkit-animation-name:indeterminate-short-ltr;animation-name:indeterminate-short-ltr;-webkit-animation-duration:2.2s;animation-duration:2.2s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.v-progress-linear--reverse .v-progress-linear__indeterminate .long,.v-progress-linear--reverse .v-progress-linear__indeterminate .short{left:auto;right:0}.v-progress-linear--reverse .v-progress-linear__indeterminate--active .long{-webkit-animation-name:indeterminate-rtl;animation-name:indeterminate-rtl}.v-progress-linear--reverse .v-progress-linear__indeterminate--active .short{-webkit-animation-name:indeterminate-short-rtl;animation-name:indeterminate-short-rtl}.v-progress-linear__stream{-webkit-animation:stream-ltr .25s linear infinite;animation:stream-ltr .25s linear infinite;-webkit-animation-play-state:paused;animation-play-state:paused;border-color:currentColor;border-top:4px dotted;bottom:0;left:auto;right:-8px;opacity:.3;pointer-events:none;position:absolute;top:calc(50% - 2px);-webkit-transition:inherit;transition:inherit}.v-progress-linear--reverse .v-progress-linear__stream{-webkit-animation:stream-rtl .25s linear infinite;animation:stream-rtl .25s linear infinite;left:-8px;right:auto}.v-progress-linear__wrapper{overflow:hidden;position:relative;-webkit-transition:inherit;transition:inherit}.v-progress-linear--absolute,.v-progress-linear--fixed{left:0;z-index:1}.v-progress-linear--absolute{position:absolute}.v-progress-linear--fixed{position:fixed}.v-progress-linear--reactive .v-progress-linear__content{pointer-events:none}.v-progress-linear--rounded{border-radius:4px}.v-progress-linear--striped .v-progress-linear__determinate{background-image:linear-gradient(135deg,hsla(0,0%,100%,.25) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.25) 0,hsla(0,0%,100%,.25) 75%,transparent 0,transparent);background-size:40px 40px;background-repeat:repeat}.v-progress-linear--query .v-progress-linear__indeterminate--active .long{-webkit-animation-name:query-ltr;animation-name:query-ltr;-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.v-progress-linear--query .v-progress-linear__indeterminate--active .short{-webkit-animation-name:query-short-ltr;animation-name:query-short-ltr;-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.v-progress-linear--query.v-progress-linear--reverse .v-progress-linear__indeterminate--active .long{-webkit-animation-name:query-rtl;animation-name:query-rtl}.v-progress-linear--query.v-progress-linear--reverse .v-progress-linear__indeterminate--active .short{-webkit-animation-name:query-short-rtl;animation-name:query-short-rtl}.v-progress-linear--visible .v-progress-linear__indeterminate--active .long,.v-progress-linear--visible .v-progress-linear__indeterminate--active .short,.v-progress-linear--visible .v-progress-linear__stream{-webkit-animation-play-state:running;animation-play-state:running}@-webkit-keyframes indeterminate-ltr{0%{left:-90%;right:100%}60%{left:-90%;right:100%}to{left:100%;right:-35%}}@keyframes indeterminate-ltr{0%{left:-90%;right:100%}60%{left:-90%;right:100%}to{left:100%;right:-35%}}@-webkit-keyframes indeterminate-rtl{0%{left:100%;right:-90%}60%{left:100%;right:-90%}to{left:-35%;right:100%}}@keyframes indeterminate-rtl{0%{left:100%;right:-90%}60%{left:100%;right:-90%}to{left:-35%;right:100%}}@-webkit-keyframes indeterminate-short-ltr{0%{left:-200%;right:100%}60%{left:107%;right:-8%}to{left:107%;right:-8%}}@keyframes indeterminate-short-ltr{0%{left:-200%;right:100%}60%{left:107%;right:-8%}to{left:107%;right:-8%}}@-webkit-keyframes indeterminate-short-rtl{0%{left:100%;right:-200%}60%{left:-8%;right:107%}to{left:-8%;right:107%}}@keyframes indeterminate-short-rtl{0%{left:100%;right:-200%}60%{left:-8%;right:107%}to{left:-8%;right:107%}}@-webkit-keyframes query-ltr{0%{right:-90%;left:100%}60%{right:-90%;left:100%}to{right:100%;left:-35%}}@keyframes query-ltr{0%{right:-90%;left:100%}60%{right:-90%;left:100%}to{right:100%;left:-35%}}@-webkit-keyframes query-rtl{0%{right:100%;left:-90%}60%{right:100%;left:-90%}to{right:-35%;left:100%}}@keyframes query-rtl{0%{right:100%;left:-90%}60%{right:100%;left:-90%}to{right:-35%;left:100%}}@-webkit-keyframes query-short-ltr{0%{right:-200%;left:100%}60%{right:107%;left:-8%}to{right:107%;left:-8%}}@keyframes query-short-ltr{0%{right:-200%;left:100%}60%{right:107%;left:-8%}to{right:107%;left:-8%}}@-webkit-keyframes query-short-rtl{0%{right:100%;left:-200%}60%{right:-8%;left:107%}to{right:-8%;left:107%}}@keyframes query-short-rtl{0%{right:100%;left:-200%}60%{right:-8%;left:107%}to{right:-8%;left:107%}}@-webkit-keyframes stream-ltr{to{-webkit-transform:translateX(-8px);transform:translateX(-8px)}}@keyframes stream-ltr{to{-webkit-transform:translateX(-8px);transform:translateX(-8px)}}@-webkit-keyframes stream-rtl{to{-webkit-transform:translateX(8px);transform:translateX(8px)}}@keyframes stream-rtl{to{-webkit-transform:translateX(8px);transform:translateX(8px)}}.v-dialog{border-radius:4px;margin:24px;overflow-y:auto;pointer-events:auto;-webkit-transition:.3s cubic-bezier(.25,.8,.25,1);transition:.3s cubic-bezier(.25,.8,.25,1);width:100%;z-index:inherit;-webkit-box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12);box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12)}.v-dialog:not(.v-dialog--fullscreen){max-height:90%}.v-dialog>*{width:100%}.v-dialog>.v-card>.v-card__title{font-size:1.25rem;font-weight:500;letter-spacing:.0125em;padding:16px 24px 10px}.v-dialog>.v-card>.v-card__subtitle,.v-dialog>.v-card>.v-card__text{padding:0 24px 20px}.v-dialog>.v-card>.v-card__actions{padding:8px 16px}.v-dialog__content{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;height:100%;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;left:0;pointer-events:none;position:fixed;top:0;-webkit-transition:.2s cubic-bezier(.25,.8,.25,1),z-index 1ms;transition:.2s cubic-bezier(.25,.8,.25,1),z-index 1ms;width:100%;z-index:6;outline:none}.v-dialog__container{display:none}.v-dialog__container--attached{display:inline}.v-dialog--animated{-webkit-animation-duration:.15s;animation-duration:.15s;-webkit-animation-name:animate-dialog;animation-name:animate-dialog;-webkit-animation-timing-function:cubic-bezier(.25,.8,.25,1);animation-timing-function:cubic-bezier(.25,.8,.25,1)}.v-dialog--fullscreen{border-radius:0;margin:0;height:100%;position:fixed;overflow-y:auto;top:0;left:0}.v-dialog--fullscreen>.v-card{min-height:100%;min-width:100%;margin:0!important;padding:0!important}.v-dialog--scrollable,.v-dialog--scrollable>form{display:-webkit-box;display:-ms-flexbox;display:flex}.v-dialog--scrollable>.v-card,.v-dialog--scrollable>form>.v-card{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 1 100%;flex:1 1 100%;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;max-height:100%;max-width:100%}.v-dialog--scrollable>.v-card>.v-card__actions,.v-dialog--scrollable>.v-card>.v-card__title,.v-dialog--scrollable>form>.v-card>.v-card__actions,.v-dialog--scrollable>form>.v-card>.v-card__title{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.v-dialog--scrollable>.v-card>.v-card__text,.v-dialog--scrollable>form>.v-card>.v-card__text{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;overflow-y:auto}@-webkit-keyframes animate-dialog{0%{-webkit-transform:scale(1);transform:scale(1)}50%{-webkit-transform:scale(1.03);transform:scale(1.03)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes animate-dialog{0%{-webkit-transform:scale(1);transform:scale(1)}50%{-webkit-transform:scale(1.03);transform:scale(1.03)}to{-webkit-transform:scale(1);transform:scale(1)}}.theme--light.v-overlay{color:rgba(0,0,0,.87)}.theme--dark.v-overlay{color:#fff}.v-overlay{-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-radius:inherit;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;position:fixed;top:0;left:0;right:0;bottom:0;pointer-events:none;-webkit-transition:.3s cubic-bezier(.25,.8,.5,1),z-index 1ms;transition:.3s cubic-bezier(.25,.8,.5,1),z-index 1ms}.v-overlay__content{position:relative}.v-overlay__scrim{border-radius:inherit;bottom:0;height:100%;left:0;position:absolute;right:0;top:0;-webkit-transition:inherit;transition:inherit;width:100%;will-change:opacity}.v-overlay--absolute{position:absolute}.v-overlay--active{pointer-events:auto}.container.grow-shrink-0{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.container.fill-height{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.container.fill-height>.row{-webkit-box-flex:1;-ms-flex:1 1 100%;flex:1 1 100%;max-width:calc(100% + 24px)}.container.fill-height>.layout{height:100%;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.container.fill-height>.layout.grow-shrink-0{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.container.grid-list-xs .layout .flex{padding:1px}.container.grid-list-xs .layout:only-child{margin:-1px}.container.grid-list-xs .layout:not(:only-child){margin:auto -1px}.container.grid-list-xs :not(:only-child) .layout:first-child{margin-top:-1px}.container.grid-list-xs :not(:only-child) .layout:last-child{margin-bottom:-1px}.container.grid-list-sm .layout .flex{padding:2px}.container.grid-list-sm .layout:only-child{margin:-2px}.container.grid-list-sm .layout:not(:only-child){margin:auto -2px}.container.grid-list-sm :not(:only-child) .layout:first-child{margin-top:-2px}.container.grid-list-sm :not(:only-child) .layout:last-child{margin-bottom:-2px}.container.grid-list-md .layout .flex{padding:4px}.container.grid-list-md .layout:only-child{margin:-4px}.container.grid-list-md .layout:not(:only-child){margin:auto -4px}.container.grid-list-md :not(:only-child) .layout:first-child{margin-top:-4px}.container.grid-list-md :not(:only-child) .layout:last-child{margin-bottom:-4px}.container.grid-list-lg .layout .flex{padding:8px}.container.grid-list-lg .layout:only-child{margin:-8px}.container.grid-list-lg .layout:not(:only-child){margin:auto -8px}.container.grid-list-lg :not(:only-child) .layout:first-child{margin-top:-8px}.container.grid-list-lg :not(:only-child) .layout:last-child{margin-bottom:-8px}.container.grid-list-xl .layout .flex{padding:12px}.container.grid-list-xl .layout:only-child{margin:-12px}.container.grid-list-xl .layout:not(:only-child){margin:auto -12px}.container.grid-list-xl :not(:only-child) .layout:first-child{margin-top:-12px}.container.grid-list-xl :not(:only-child) .layout:last-child{margin-bottom:-12px}.layout{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;-ms-flex-wrap:nowrap;flex-wrap:nowrap;min-width:0}.layout.reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.layout.column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.layout.column.reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.layout.column>.flex{max-width:100%}.layout.wrap{-ms-flex-wrap:wrap;flex-wrap:wrap}.layout.grow-shrink-0{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}@media (min-width:0){.flex.xs12{-ms-flex-preferred-size:100%;flex-basis:100%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:100%}.flex.order-xs12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.flex.xs11{-ms-flex-preferred-size:91.6666666667%;flex-basis:91.6666666667%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:91.6666666667%}.flex.order-xs11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.flex.xs10{-ms-flex-preferred-size:83.3333333333%;flex-basis:83.3333333333%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:83.3333333333%}.flex.order-xs10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.flex.xs9{-ms-flex-preferred-size:75%;flex-basis:75%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:75%}.flex.order-xs9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.flex.xs8{-ms-flex-preferred-size:66.6666666667%;flex-basis:66.6666666667%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:66.6666666667%}.flex.order-xs8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.flex.xs7{-ms-flex-preferred-size:58.3333333333%;flex-basis:58.3333333333%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:58.3333333333%}.flex.order-xs7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.flex.xs6{-ms-flex-preferred-size:50%;flex-basis:50%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:50%}.flex.order-xs6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.flex.xs5{-ms-flex-preferred-size:41.6666666667%;flex-basis:41.6666666667%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:41.6666666667%}.flex.order-xs5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.flex.xs4{-ms-flex-preferred-size:33.3333333333%;flex-basis:33.3333333333%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:33.3333333333%}.flex.order-xs4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.flex.xs3{-ms-flex-preferred-size:25%;flex-basis:25%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:25%}.flex.order-xs3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.flex.xs2{-ms-flex-preferred-size:16.6666666667%;flex-basis:16.6666666667%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:16.6666666667%}.flex.order-xs2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.flex.xs1{-ms-flex-preferred-size:8.3333333333%;flex-basis:8.3333333333%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:8.3333333333%}.flex.order-xs1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.v-application--is-ltr .flex.offset-xs12{margin-left:100%}.v-application--is-rtl .flex.offset-xs12{margin-right:100%}.v-application--is-ltr .flex.offset-xs11{margin-left:91.6666666667%}.v-application--is-rtl .flex.offset-xs11{margin-right:91.6666666667%}.v-application--is-ltr .flex.offset-xs10{margin-left:83.3333333333%}.v-application--is-rtl .flex.offset-xs10{margin-right:83.3333333333%}.v-application--is-ltr .flex.offset-xs9{margin-left:75%}.v-application--is-rtl .flex.offset-xs9{margin-right:75%}.v-application--is-ltr .flex.offset-xs8{margin-left:66.6666666667%}.v-application--is-rtl .flex.offset-xs8{margin-right:66.6666666667%}.v-application--is-ltr .flex.offset-xs7{margin-left:58.3333333333%}.v-application--is-rtl .flex.offset-xs7{margin-right:58.3333333333%}.v-application--is-ltr .flex.offset-xs6{margin-left:50%}.v-application--is-rtl .flex.offset-xs6{margin-right:50%}.v-application--is-ltr .flex.offset-xs5{margin-left:41.6666666667%}.v-application--is-rtl .flex.offset-xs5{margin-right:41.6666666667%}.v-application--is-ltr .flex.offset-xs4{margin-left:33.3333333333%}.v-application--is-rtl .flex.offset-xs4{margin-right:33.3333333333%}.v-application--is-ltr .flex.offset-xs3{margin-left:25%}.v-application--is-rtl .flex.offset-xs3{margin-right:25%}.v-application--is-ltr .flex.offset-xs2{margin-left:16.6666666667%}.v-application--is-rtl .flex.offset-xs2{margin-right:16.6666666667%}.v-application--is-ltr .flex.offset-xs1{margin-left:8.3333333333%}.v-application--is-rtl .flex.offset-xs1{margin-right:8.3333333333%}.v-application--is-ltr .flex.offset-xs0{margin-left:0}.v-application--is-rtl .flex.offset-xs0{margin-right:0}}@media (min-width:600px){.flex.sm12{-ms-flex-preferred-size:100%;flex-basis:100%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:100%}.flex.order-sm12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.flex.sm11{-ms-flex-preferred-size:91.6666666667%;flex-basis:91.6666666667%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:91.6666666667%}.flex.order-sm11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.flex.sm10{-ms-flex-preferred-size:83.3333333333%;flex-basis:83.3333333333%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:83.3333333333%}.flex.order-sm10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.flex.sm9{-ms-flex-preferred-size:75%;flex-basis:75%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:75%}.flex.order-sm9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.flex.sm8{-ms-flex-preferred-size:66.6666666667%;flex-basis:66.6666666667%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:66.6666666667%}.flex.order-sm8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.flex.sm7{-ms-flex-preferred-size:58.3333333333%;flex-basis:58.3333333333%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:58.3333333333%}.flex.order-sm7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.flex.sm6{-ms-flex-preferred-size:50%;flex-basis:50%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:50%}.flex.order-sm6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.flex.sm5{-ms-flex-preferred-size:41.6666666667%;flex-basis:41.6666666667%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:41.6666666667%}.flex.order-sm5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.flex.sm4{-ms-flex-preferred-size:33.3333333333%;flex-basis:33.3333333333%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:33.3333333333%}.flex.order-sm4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.flex.sm3{-ms-flex-preferred-size:25%;flex-basis:25%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:25%}.flex.order-sm3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.flex.sm2{-ms-flex-preferred-size:16.6666666667%;flex-basis:16.6666666667%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:16.6666666667%}.flex.order-sm2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.flex.sm1{-ms-flex-preferred-size:8.3333333333%;flex-basis:8.3333333333%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:8.3333333333%}.flex.order-sm1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.v-application--is-ltr .flex.offset-sm12{margin-left:100%}.v-application--is-rtl .flex.offset-sm12{margin-right:100%}.v-application--is-ltr .flex.offset-sm11{margin-left:91.6666666667%}.v-application--is-rtl .flex.offset-sm11{margin-right:91.6666666667%}.v-application--is-ltr .flex.offset-sm10{margin-left:83.3333333333%}.v-application--is-rtl .flex.offset-sm10{margin-right:83.3333333333%}.v-application--is-ltr .flex.offset-sm9{margin-left:75%}.v-application--is-rtl .flex.offset-sm9{margin-right:75%}.v-application--is-ltr .flex.offset-sm8{margin-left:66.6666666667%}.v-application--is-rtl .flex.offset-sm8{margin-right:66.6666666667%}.v-application--is-ltr .flex.offset-sm7{margin-left:58.3333333333%}.v-application--is-rtl .flex.offset-sm7{margin-right:58.3333333333%}.v-application--is-ltr .flex.offset-sm6{margin-left:50%}.v-application--is-rtl .flex.offset-sm6{margin-right:50%}.v-application--is-ltr .flex.offset-sm5{margin-left:41.6666666667%}.v-application--is-rtl .flex.offset-sm5{margin-right:41.6666666667%}.v-application--is-ltr .flex.offset-sm4{margin-left:33.3333333333%}.v-application--is-rtl .flex.offset-sm4{margin-right:33.3333333333%}.v-application--is-ltr .flex.offset-sm3{margin-left:25%}.v-application--is-rtl .flex.offset-sm3{margin-right:25%}.v-application--is-ltr .flex.offset-sm2{margin-left:16.6666666667%}.v-application--is-rtl .flex.offset-sm2{margin-right:16.6666666667%}.v-application--is-ltr .flex.offset-sm1{margin-left:8.3333333333%}.v-application--is-rtl .flex.offset-sm1{margin-right:8.3333333333%}.v-application--is-ltr .flex.offset-sm0{margin-left:0}.v-application--is-rtl .flex.offset-sm0{margin-right:0}}@media (min-width:960px){.flex.md12{-ms-flex-preferred-size:100%;flex-basis:100%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:100%}.flex.order-md12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.flex.md11{-ms-flex-preferred-size:91.6666666667%;flex-basis:91.6666666667%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:91.6666666667%}.flex.order-md11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.flex.md10{-ms-flex-preferred-size:83.3333333333%;flex-basis:83.3333333333%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:83.3333333333%}.flex.order-md10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.flex.md9{-ms-flex-preferred-size:75%;flex-basis:75%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:75%}.flex.order-md9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.flex.md8{-ms-flex-preferred-size:66.6666666667%;flex-basis:66.6666666667%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:66.6666666667%}.flex.order-md8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.flex.md7{-ms-flex-preferred-size:58.3333333333%;flex-basis:58.3333333333%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:58.3333333333%}.flex.order-md7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.flex.md6{-ms-flex-preferred-size:50%;flex-basis:50%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:50%}.flex.order-md6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.flex.md5{-ms-flex-preferred-size:41.6666666667%;flex-basis:41.6666666667%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:41.6666666667%}.flex.order-md5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.flex.md4{-ms-flex-preferred-size:33.3333333333%;flex-basis:33.3333333333%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:33.3333333333%}.flex.order-md4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.flex.md3{-ms-flex-preferred-size:25%;flex-basis:25%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:25%}.flex.order-md3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.flex.md2{-ms-flex-preferred-size:16.6666666667%;flex-basis:16.6666666667%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:16.6666666667%}.flex.order-md2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.flex.md1{-ms-flex-preferred-size:8.3333333333%;flex-basis:8.3333333333%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:8.3333333333%}.flex.order-md1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.v-application--is-ltr .flex.offset-md12{margin-left:100%}.v-application--is-rtl .flex.offset-md12{margin-right:100%}.v-application--is-ltr .flex.offset-md11{margin-left:91.6666666667%}.v-application--is-rtl .flex.offset-md11{margin-right:91.6666666667%}.v-application--is-ltr .flex.offset-md10{margin-left:83.3333333333%}.v-application--is-rtl .flex.offset-md10{margin-right:83.3333333333%}.v-application--is-ltr .flex.offset-md9{margin-left:75%}.v-application--is-rtl .flex.offset-md9{margin-right:75%}.v-application--is-ltr .flex.offset-md8{margin-left:66.6666666667%}.v-application--is-rtl .flex.offset-md8{margin-right:66.6666666667%}.v-application--is-ltr .flex.offset-md7{margin-left:58.3333333333%}.v-application--is-rtl .flex.offset-md7{margin-right:58.3333333333%}.v-application--is-ltr .flex.offset-md6{margin-left:50%}.v-application--is-rtl .flex.offset-md6{margin-right:50%}.v-application--is-ltr .flex.offset-md5{margin-left:41.6666666667%}.v-application--is-rtl .flex.offset-md5{margin-right:41.6666666667%}.v-application--is-ltr .flex.offset-md4{margin-left:33.3333333333%}.v-application--is-rtl .flex.offset-md4{margin-right:33.3333333333%}.v-application--is-ltr .flex.offset-md3{margin-left:25%}.v-application--is-rtl .flex.offset-md3{margin-right:25%}.v-application--is-ltr .flex.offset-md2{margin-left:16.6666666667%}.v-application--is-rtl .flex.offset-md2{margin-right:16.6666666667%}.v-application--is-ltr .flex.offset-md1{margin-left:8.3333333333%}.v-application--is-rtl .flex.offset-md1{margin-right:8.3333333333%}.v-application--is-ltr .flex.offset-md0{margin-left:0}.v-application--is-rtl .flex.offset-md0{margin-right:0}}@media (min-width:1264px){.flex.lg12{-ms-flex-preferred-size:100%;flex-basis:100%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:100%}.flex.order-lg12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.flex.lg11{-ms-flex-preferred-size:91.6666666667%;flex-basis:91.6666666667%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:91.6666666667%}.flex.order-lg11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.flex.lg10{-ms-flex-preferred-size:83.3333333333%;flex-basis:83.3333333333%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:83.3333333333%}.flex.order-lg10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.flex.lg9{-ms-flex-preferred-size:75%;flex-basis:75%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:75%}.flex.order-lg9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.flex.lg8{-ms-flex-preferred-size:66.6666666667%;flex-basis:66.6666666667%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:66.6666666667%}.flex.order-lg8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.flex.lg7{-ms-flex-preferred-size:58.3333333333%;flex-basis:58.3333333333%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:58.3333333333%}.flex.order-lg7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.flex.lg6{-ms-flex-preferred-size:50%;flex-basis:50%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:50%}.flex.order-lg6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.flex.lg5{-ms-flex-preferred-size:41.6666666667%;flex-basis:41.6666666667%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:41.6666666667%}.flex.order-lg5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.flex.lg4{-ms-flex-preferred-size:33.3333333333%;flex-basis:33.3333333333%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:33.3333333333%}.flex.order-lg4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.flex.lg3{-ms-flex-preferred-size:25%;flex-basis:25%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:25%}.flex.order-lg3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.flex.lg2{-ms-flex-preferred-size:16.6666666667%;flex-basis:16.6666666667%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:16.6666666667%}.flex.order-lg2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.flex.lg1{-ms-flex-preferred-size:8.3333333333%;flex-basis:8.3333333333%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:8.3333333333%}.flex.order-lg1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.v-application--is-ltr .flex.offset-lg12{margin-left:100%}.v-application--is-rtl .flex.offset-lg12{margin-right:100%}.v-application--is-ltr .flex.offset-lg11{margin-left:91.6666666667%}.v-application--is-rtl .flex.offset-lg11{margin-right:91.6666666667%}.v-application--is-ltr .flex.offset-lg10{margin-left:83.3333333333%}.v-application--is-rtl .flex.offset-lg10{margin-right:83.3333333333%}.v-application--is-ltr .flex.offset-lg9{margin-left:75%}.v-application--is-rtl .flex.offset-lg9{margin-right:75%}.v-application--is-ltr .flex.offset-lg8{margin-left:66.6666666667%}.v-application--is-rtl .flex.offset-lg8{margin-right:66.6666666667%}.v-application--is-ltr .flex.offset-lg7{margin-left:58.3333333333%}.v-application--is-rtl .flex.offset-lg7{margin-right:58.3333333333%}.v-application--is-ltr .flex.offset-lg6{margin-left:50%}.v-application--is-rtl .flex.offset-lg6{margin-right:50%}.v-application--is-ltr .flex.offset-lg5{margin-left:41.6666666667%}.v-application--is-rtl .flex.offset-lg5{margin-right:41.6666666667%}.v-application--is-ltr .flex.offset-lg4{margin-left:33.3333333333%}.v-application--is-rtl .flex.offset-lg4{margin-right:33.3333333333%}.v-application--is-ltr .flex.offset-lg3{margin-left:25%}.v-application--is-rtl .flex.offset-lg3{margin-right:25%}.v-application--is-ltr .flex.offset-lg2{margin-left:16.6666666667%}.v-application--is-rtl .flex.offset-lg2{margin-right:16.6666666667%}.v-application--is-ltr .flex.offset-lg1{margin-left:8.3333333333%}.v-application--is-rtl .flex.offset-lg1{margin-right:8.3333333333%}.v-application--is-ltr .flex.offset-lg0{margin-left:0}.v-application--is-rtl .flex.offset-lg0{margin-right:0}}@media (min-width:1904px){.flex.xl12{-ms-flex-preferred-size:100%;flex-basis:100%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:100%}.flex.order-xl12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.flex.xl11{-ms-flex-preferred-size:91.6666666667%;flex-basis:91.6666666667%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:91.6666666667%}.flex.order-xl11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.flex.xl10{-ms-flex-preferred-size:83.3333333333%;flex-basis:83.3333333333%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:83.3333333333%}.flex.order-xl10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.flex.xl9{-ms-flex-preferred-size:75%;flex-basis:75%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:75%}.flex.order-xl9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.flex.xl8{-ms-flex-preferred-size:66.6666666667%;flex-basis:66.6666666667%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:66.6666666667%}.flex.order-xl8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.flex.xl7{-ms-flex-preferred-size:58.3333333333%;flex-basis:58.3333333333%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:58.3333333333%}.flex.order-xl7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.flex.xl6{-ms-flex-preferred-size:50%;flex-basis:50%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:50%}.flex.order-xl6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.flex.xl5{-ms-flex-preferred-size:41.6666666667%;flex-basis:41.6666666667%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:41.6666666667%}.flex.order-xl5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.flex.xl4{-ms-flex-preferred-size:33.3333333333%;flex-basis:33.3333333333%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:33.3333333333%}.flex.order-xl4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.flex.xl3{-ms-flex-preferred-size:25%;flex-basis:25%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:25%}.flex.order-xl3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.flex.xl2{-ms-flex-preferred-size:16.6666666667%;flex-basis:16.6666666667%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:16.6666666667%}.flex.order-xl2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.flex.xl1{-ms-flex-preferred-size:8.3333333333%;flex-basis:8.3333333333%;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;max-width:8.3333333333%}.flex.order-xl1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.v-application--is-ltr .flex.offset-xl12{margin-left:100%}.v-application--is-rtl .flex.offset-xl12{margin-right:100%}.v-application--is-ltr .flex.offset-xl11{margin-left:91.6666666667%}.v-application--is-rtl .flex.offset-xl11{margin-right:91.6666666667%}.v-application--is-ltr .flex.offset-xl10{margin-left:83.3333333333%}.v-application--is-rtl .flex.offset-xl10{margin-right:83.3333333333%}.v-application--is-ltr .flex.offset-xl9{margin-left:75%}.v-application--is-rtl .flex.offset-xl9{margin-right:75%}.v-application--is-ltr .flex.offset-xl8{margin-left:66.6666666667%}.v-application--is-rtl .flex.offset-xl8{margin-right:66.6666666667%}.v-application--is-ltr .flex.offset-xl7{margin-left:58.3333333333%}.v-application--is-rtl .flex.offset-xl7{margin-right:58.3333333333%}.v-application--is-ltr .flex.offset-xl6{margin-left:50%}.v-application--is-rtl .flex.offset-xl6{margin-right:50%}.v-application--is-ltr .flex.offset-xl5{margin-left:41.6666666667%}.v-application--is-rtl .flex.offset-xl5{margin-right:41.6666666667%}.v-application--is-ltr .flex.offset-xl4{margin-left:33.3333333333%}.v-application--is-rtl .flex.offset-xl4{margin-right:33.3333333333%}.v-application--is-ltr .flex.offset-xl3{margin-left:25%}.v-application--is-rtl .flex.offset-xl3{margin-right:25%}.v-application--is-ltr .flex.offset-xl2{margin-left:16.6666666667%}.v-application--is-rtl .flex.offset-xl2{margin-right:16.6666666667%}.v-application--is-ltr .flex.offset-xl1{margin-left:8.3333333333%}.v-application--is-rtl .flex.offset-xl1{margin-right:8.3333333333%}.v-application--is-ltr .flex.offset-xl0{margin-left:0}.v-application--is-rtl .flex.offset-xl0{margin-right:0}}.child-flex>*,.flex{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;max-width:100%}.child-flex>.grow-shrink-0,.flex.grow-shrink-0{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.grow,.spacer{-webkit-box-flex:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.grow{-ms-flex-negative:0!important;flex-shrink:0!important}.shrink{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important;-ms-flex-negative:1!important;flex-shrink:1!important}.fill-height{height:100%}.theme--light.v-text-field>.v-input__control>.v-input__slot:before{border-color:rgba(0,0,0,.42)}.theme--light.v-text-field:not(.v-input--has-state):hover>.v-input__control>.v-input__slot:before{border-color:rgba(0,0,0,.87)}.theme--light.v-text-field.v-input--is-disabled .v-input__slot:before{-o-border-image:repeating-linear-gradient(90deg,rgba(0,0,0,.38) 0,rgba(0,0,0,.38) 2px,transparent 0,transparent 4px) 1 repeat;border-image:repeating-linear-gradient(90deg,rgba(0,0,0,.38) 0,rgba(0,0,0,.38) 2px,transparent 0,transparent 4px) 1 repeat}.theme--light.v-text-field--filled>.v-input__control>.v-input__slot{background:rgba(0,0,0,.06)}.theme--light.v-text-field--filled:not(.v-input--is-focused):not(.v-input--has-state)>.v-input__control>.v-input__slot:hover{background:rgba(0,0,0,.12)}.theme--light.v-text-field--solo>.v-input__control>.v-input__slot{background:#fff}.theme--light.v-text-field--solo-inverted>.v-input__control>.v-input__slot{background:rgba(0,0,0,.06)}.theme--light.v-text-field--solo-inverted.v-input--is-focused>.v-input__control>.v-input__slot{background:#424242}.theme--light.v-text-field--solo-inverted.v-input--is-focused>.v-input__control>.v-input__slot input{color:#fff}.theme--light.v-text-field--solo-inverted.v-input--is-focused>.v-input__control>.v-input__slot input::-webkit-input-placeholder{color:hsla(0,0%,100%,.5)}.theme--light.v-text-field--solo-inverted.v-input--is-focused>.v-input__control>.v-input__slot input::-moz-placeholder{color:hsla(0,0%,100%,.5)}.theme--light.v-text-field--solo-inverted.v-input--is-focused>.v-input__control>.v-input__slot input:-ms-input-placeholder{color:hsla(0,0%,100%,.5)}.theme--light.v-text-field--solo-inverted.v-input--is-focused>.v-input__control>.v-input__slot input::-ms-input-placeholder{color:hsla(0,0%,100%,.5)}.theme--light.v-text-field--solo-inverted.v-input--is-focused>.v-input__control>.v-input__slot input::placeholder{color:hsla(0,0%,100%,.5)}.theme--light.v-text-field--solo-inverted.v-input--is-focused>.v-input__control>.v-input__slot .v-label{color:hsla(0,0%,100%,.7)}.theme--light.v-text-field--outlined:not(.v-input--is-focused):not(.v-input--has-state)>.v-input__control>.v-input__slot fieldset{color:rgba(0,0,0,.38)}.theme--light.v-text-field--outlined:not(.v-input--is-focused):not(.v-input--has-state):not(.v-input--is-disabled)>.v-input__control>.v-input__slot:hover fieldset{color:rgba(0,0,0,.86)}.theme--light.v-text-field--outlined:not(.v-input--is-focused).v-input--is-disabled>.v-input__control>.v-input__slot fieldset{color:rgba(0,0,0,.26)}.theme--dark.v-text-field>.v-input__control>.v-input__slot:before{border-color:hsla(0,0%,100%,.7)}.theme--dark.v-text-field:not(.v-input--has-state):hover>.v-input__control>.v-input__slot:before{border-color:#fff}.theme--dark.v-text-field.v-input--is-disabled .v-input__slot:before{-o-border-image:repeating-linear-gradient(90deg,hsla(0,0%,100%,.5) 0,hsla(0,0%,100%,.5) 2px,transparent 0,transparent 4px) 1 repeat;border-image:repeating-linear-gradient(90deg,hsla(0,0%,100%,.5) 0,hsla(0,0%,100%,.5) 2px,transparent 0,transparent 4px) 1 repeat}.theme--dark.v-text-field--filled>.v-input__control>.v-input__slot{background:hsla(0,0%,100%,.08)}.theme--dark.v-text-field--filled:not(.v-input--is-focused):not(.v-input--has-state)>.v-input__control>.v-input__slot:hover{background:hsla(0,0%,100%,.16)}.theme--dark.v-text-field--solo>.v-input__control>.v-input__slot{background:#1e1e1e}.theme--dark.v-text-field--solo-inverted>.v-input__control>.v-input__slot{background:hsla(0,0%,100%,.16)}.theme--dark.v-text-field--solo-inverted.v-input--is-focused>.v-input__control>.v-input__slot{background:#fff}.theme--dark.v-text-field--solo-inverted.v-input--is-focused>.v-input__control>.v-input__slot input{color:rgba(0,0,0,.87)}.theme--dark.v-text-field--solo-inverted.v-input--is-focused>.v-input__control>.v-input__slot input::-webkit-input-placeholder{color:rgba(0,0,0,.38)}.theme--dark.v-text-field--solo-inverted.v-input--is-focused>.v-input__control>.v-input__slot input::-moz-placeholder{color:rgba(0,0,0,.38)}.theme--dark.v-text-field--solo-inverted.v-input--is-focused>.v-input__control>.v-input__slot input:-ms-input-placeholder{color:rgba(0,0,0,.38)}.theme--dark.v-text-field--solo-inverted.v-input--is-focused>.v-input__control>.v-input__slot input::-ms-input-placeholder{color:rgba(0,0,0,.38)}.theme--dark.v-text-field--solo-inverted.v-input--is-focused>.v-input__control>.v-input__slot input::placeholder{color:rgba(0,0,0,.38)}.theme--dark.v-text-field--solo-inverted.v-input--is-focused>.v-input__control>.v-input__slot .v-label{color:rgba(0,0,0,.6)}.theme--dark.v-text-field--outlined:not(.v-input--is-focused):not(.v-input--has-state)>.v-input__control>.v-input__slot fieldset{color:hsla(0,0%,100%,.24)}.theme--dark.v-text-field--outlined:not(.v-input--is-focused):not(.v-input--has-state):not(.v-input--is-disabled)>.v-input__control>.v-input__slot:hover fieldset{color:#fff}.theme--dark.v-text-field--outlined:not(.v-input--is-focused).v-input--is-disabled>.v-input__control>.v-input__slot fieldset{color:hsla(0,0%,100%,.16)}.v-text-field{padding-top:12px;margin-top:4px}.v-text-field__prefix,.v-text-field__suffix{line-height:20px}.v-text-field input{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;line-height:20px;padding:8px 0 8px;max-width:100%;min-width:0;width:100%}.v-text-field .v-input__control,.v-text-field .v-input__slot,.v-text-field fieldset{border-radius:inherit}.v-text-field.v-input--has-state .v-input__control>.v-text-field__details>.v-counter,.v-text-field.v-input--is-disabled .v-input__control>.v-text-field__details>.v-counter,.v-text-field.v-input--is-disabled .v-input__control>.v-text-field__details>.v-messages,.v-text-field .v-input__control,.v-text-field fieldset{color:inherit}.v-text-field.v-input--dense{padding-top:0}.v-text-field.v-input--dense .v-label{top:4px}.v-text-field.v-input--dense:not(.v-text-field--outlined) .v-text-field__prefix,.v-text-field.v-input--dense:not(.v-text-field--outlined) .v-text-field__suffix,.v-text-field.v-input--dense:not(.v-text-field--outlined) input{padding:4px 0 2px}.v-text-field.v-input--dense:not(.v-text-field--outlined) .v-text-field__prefix{padding-right:4px}.v-text-field.v-input--dense:not(.v-text-field--outlined) .v-text-field__suffix{padding-left:4px}.v-text-field.v-input--dense[type=text]::-ms-clear{display:none}.v-text-field.v-input--dense .v-input__append-inner,.v-text-field.v-input--dense .v-input__prepend-inner{margin-top:0}.v-text-field .v-input__append-inner,.v-text-field .v-input__prepend-inner{-ms-flex-item-align:start;align-self:flex-start;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin-top:4px;line-height:1;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.v-application--is-ltr .v-text-field .v-input__prepend-inner{margin-right:auto;padding-right:4px}.v-application--is-ltr .v-text-field .v-input__append-inner,.v-application--is-rtl .v-text-field .v-input__prepend-inner{margin-left:auto;padding-left:4px}.v-application--is-rtl .v-text-field .v-input__append-inner{margin-right:auto;padding-right:4px}.v-text-field .v-counter{white-space:nowrap}.v-application--is-ltr .v-text-field .v-counter{margin-left:8px}.v-application--is-rtl .v-text-field .v-counter{margin-right:8px}.v-text-field .v-label{max-width:90%;overflow:hidden;text-overflow:ellipsis;top:6px;white-space:nowrap;pointer-events:none}.v-application--is-ltr .v-text-field .v-label{-webkit-transform-origin:top left;transform-origin:top left}.v-application--is-rtl .v-text-field .v-label{-webkit-transform-origin:top right;transform-origin:top right}.v-text-field .v-label--active{max-width:133%;-webkit-transform:translateY(-18px) scale(.75);transform:translateY(-18px) scale(.75);pointer-events:auto}.v-text-field>.v-input__control>.v-input__slot{cursor:text}.v-text-field>.v-input__control>.v-input__slot:after,.v-text-field>.v-input__control>.v-input__slot:before{bottom:-1px;content:"";left:0;position:absolute;-webkit-transition:.3s cubic-bezier(.25,.8,.5,1);transition:.3s cubic-bezier(.25,.8,.5,1);width:100%}.v-text-field>.v-input__control>.v-input__slot:before{border-color:inherit;border-style:solid;border-width:thin 0 0 0}.v-text-field>.v-input__control>.v-input__slot:after{background-color:currentColor;border-color:currentColor;border-style:solid;border-width:thin 0 thin 0;-webkit-transform:scaleX(0);transform:scaleX(0)}.v-text-field__details{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;max-width:100%;min-height:14px;overflow:hidden}.v-text-field__prefix,.v-text-field__suffix{-ms-flex-item-align:center;align-self:center;cursor:default;-webkit-transition:color .3s cubic-bezier(.25,.8,.5,1);transition:color .3s cubic-bezier(.25,.8,.5,1);white-space:nowrap}.v-application--is-ltr .v-text-field__prefix{text-align:right;padding-right:4px}.v-application--is-rtl .v-text-field__prefix{text-align:left;padding-left:4px}.v-text-field__suffix{white-space:nowrap}.v-application--is-ltr .v-text-field__suffix{padding-left:4px}.v-application--is-rtl .v-text-field__suffix{padding-right:4px}.v-application--is-ltr .v-text-field--reverse .v-text-field__prefix{text-align:left;padding-right:0;padding-left:4px}.v-application--is-rtl .v-text-field--reverse .v-text-field__prefix{text-align:right;padding-right:4px;padding-left:0}.v-application--is-ltr .v-text-field--reverse .v-text-field__suffix{padding-left:0;padding-right:4px}.v-application--is-rtl .v-text-field--reverse .v-text-field__suffix{padding-left:4px;padding-right:0}.v-text-field>.v-input__control>.v-input__slot>.v-text-field__slot{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;position:relative}.v-text-field:not(.v-text-field--is-booted) .v-label,.v-text-field:not(.v-text-field--is-booted) legend{-webkit-transition:none;transition:none}.v-text-field--filled,.v-text-field--full-width,.v-text-field--outlined{position:relative}.v-text-field--filled>.v-input__control>.v-input__slot,.v-text-field--full-width>.v-input__control>.v-input__slot,.v-text-field--outlined>.v-input__control>.v-input__slot{-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;min-height:56px}.v-text-field--filled.v-input--dense>.v-input__control>.v-input__slot,.v-text-field--full-width.v-input--dense>.v-input__control>.v-input__slot,.v-text-field--outlined.v-input--dense>.v-input__control>.v-input__slot{min-height:52px}.v-text-field--filled.v-input--dense.v-text-field--outlined.v-text-field--filled>.v-input__control>.v-input__slot,.v-text-field--filled.v-input--dense.v-text-field--outlined>.v-input__control>.v-input__slot,.v-text-field--filled.v-input--dense.v-text-field--single-line>.v-input__control>.v-input__slot,.v-text-field--full-width.v-input--dense.v-text-field--outlined.v-text-field--filled>.v-input__control>.v-input__slot,.v-text-field--full-width.v-input--dense.v-text-field--outlined>.v-input__control>.v-input__slot,.v-text-field--full-width.v-input--dense.v-text-field--single-line>.v-input__control>.v-input__slot,.v-text-field--outlined.v-input--dense.v-text-field--outlined.v-text-field--filled>.v-input__control>.v-input__slot,.v-text-field--outlined.v-input--dense.v-text-field--outlined>.v-input__control>.v-input__slot,.v-text-field--outlined.v-input--dense.v-text-field--single-line>.v-input__control>.v-input__slot{min-height:40px}.v-text-field--outlined{border-radius:4px}.v-text-field--enclosed .v-input__append-inner,.v-text-field--enclosed .v-input__append-outer,.v-text-field--enclosed .v-input__prepend-inner,.v-text-field--enclosed .v-input__prepend-outer,.v-text-field--full-width .v-input__append-inner,.v-text-field--full-width .v-input__append-outer,.v-text-field--full-width .v-input__prepend-inner,.v-text-field--full-width .v-input__prepend-outer{margin-top:17px}.v-text-field--enclosed.v-input--dense:not(.v-text-field--solo) .v-input__append-inner,.v-text-field--enclosed.v-input--dense:not(.v-text-field--solo) .v-input__append-outer,.v-text-field--enclosed.v-input--dense:not(.v-text-field--solo) .v-input__prepend-inner,.v-text-field--enclosed.v-input--dense:not(.v-text-field--solo) .v-input__prepend-outer,.v-text-field--full-width.v-input--dense:not(.v-text-field--solo) .v-input__append-inner,.v-text-field--full-width.v-input--dense:not(.v-text-field--solo) .v-input__append-outer,.v-text-field--full-width.v-input--dense:not(.v-text-field--solo) .v-input__prepend-inner,.v-text-field--full-width.v-input--dense:not(.v-text-field--solo) .v-input__prepend-outer{margin-top:14px}.v-text-field--enclosed.v-input--dense:not(.v-text-field--solo).v-text-field--single-line .v-input__append-inner,.v-text-field--enclosed.v-input--dense:not(.v-text-field--solo).v-text-field--single-line .v-input__append-outer,.v-text-field--enclosed.v-input--dense:not(.v-text-field--solo).v-text-field--single-line .v-input__prepend-inner,.v-text-field--enclosed.v-input--dense:not(.v-text-field--solo).v-text-field--single-line .v-input__prepend-outer,.v-text-field--full-width.v-input--dense:not(.v-text-field--solo).v-text-field--single-line .v-input__append-inner,.v-text-field--full-width.v-input--dense:not(.v-text-field--solo).v-text-field--single-line .v-input__append-outer,.v-text-field--full-width.v-input--dense:not(.v-text-field--solo).v-text-field--single-line .v-input__prepend-inner,.v-text-field--full-width.v-input--dense:not(.v-text-field--solo).v-text-field--single-line .v-input__prepend-outer{margin-top:9px}.v-text-field--enclosed.v-input--dense:not(.v-text-field--solo).v-text-field--outlined .v-input__append-inner,.v-text-field--enclosed.v-input--dense:not(.v-text-field--solo).v-text-field--outlined .v-input__append-outer,.v-text-field--enclosed.v-input--dense:not(.v-text-field--solo).v-text-field--outlined .v-input__prepend-inner,.v-text-field--enclosed.v-input--dense:not(.v-text-field--solo).v-text-field--outlined .v-input__prepend-outer,.v-text-field--full-width.v-input--dense:not(.v-text-field--solo).v-text-field--outlined .v-input__append-inner,.v-text-field--full-width.v-input--dense:not(.v-text-field--solo).v-text-field--outlined .v-input__append-outer,.v-text-field--full-width.v-input--dense:not(.v-text-field--solo).v-text-field--outlined .v-input__prepend-inner,.v-text-field--full-width.v-input--dense:not(.v-text-field--solo).v-text-field--outlined .v-input__prepend-outer{margin-top:8px}.v-text-field--filled .v-label,.v-text-field--full-width .v-label{top:18px}.v-text-field--filled .v-label--active,.v-text-field--full-width .v-label--active{-webkit-transform:translateY(-6px) scale(.75);transform:translateY(-6px) scale(.75)}.v-text-field--filled.v-input--dense .v-label,.v-text-field--full-width.v-input--dense .v-label{top:17px}.v-text-field--filled.v-input--dense .v-label--active,.v-text-field--full-width.v-input--dense .v-label--active{-webkit-transform:translateY(-10px) scale(.75);transform:translateY(-10px) scale(.75)}.v-text-field--filled.v-input--dense.v-text-field--single-line .v-label,.v-text-field--full-width.v-input--dense.v-text-field--single-line .v-label{top:11px}.v-text-field--filled{border-radius:4px 4px 0 0}.v-text-field--filled:not(.v-text-field--single-line) input{margin-top:22px}.v-text-field--filled.v-input--dense:not(.v-text-field--single-line).v-text-field--outlined input{margin-top:0}.v-text-field--filled .v-text-field__prefix,.v-text-field--filled .v-text-field__suffix{max-height:32px;margin-top:20px}.v-text-field--full-width{border-radius:0}.v-text-field--outlined .v-text-field__slot,.v-text-field--single-line .v-text-field__slot{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.v-text-field.v-text-field--enclosed{margin:0;padding:0}.v-text-field.v-text-field--enclosed.v-text-field--single-line .v-text-field__prefix,.v-text-field.v-text-field--enclosed.v-text-field--single-line .v-text-field__suffix{margin-top:0}.v-text-field.v-text-field--enclosed:not(.v-text-field--filled) .v-progress-linear__background{display:none}.v-text-field.v-text-field--enclosed .v-text-field__details,.v-text-field.v-text-field--enclosed:not(.v-text-field--rounded)>.v-input__control>.v-input__slot{padding:0 12px}.v-text-field.v-text-field--enclosed .v-text-field__details{padding-top:0;margin-bottom:8px}.v-application--is-ltr .v-text-field--reverse input{text-align:right}.v-application--is-rtl .v-text-field--reverse input{text-align:left}.v-application--is-ltr .v-text-field--reverse .v-label{-webkit-transform-origin:top right;transform-origin:top right}.v-application--is-rtl .v-text-field--reverse .v-label{-webkit-transform-origin:top left;transform-origin:top left}.v-text-field--reverse .v-text-field__slot,.v-text-field--reverse>.v-input__control>.v-input__slot{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.v-text-field--outlined>.v-input__control>.v-input__slot:after,.v-text-field--outlined>.v-input__control>.v-input__slot:before,.v-text-field--rounded>.v-input__control>.v-input__slot:after,.v-text-field--rounded>.v-input__control>.v-input__slot:before,.v-text-field--solo>.v-input__control>.v-input__slot:after,.v-text-field--solo>.v-input__control>.v-input__slot:before{display:none}.v-text-field--outlined,.v-text-field--solo{border-radius:4px}.v-text-field--outlined{margin-bottom:16px;-webkit-transition:border .3s cubic-bezier(.25,.8,.5,1);transition:border .3s cubic-bezier(.25,.8,.5,1)}.v-text-field--outlined .v-label{top:18px}.v-text-field--outlined .v-label--active{-webkit-transform:translateY(-24px) scale(.75);transform:translateY(-24px) scale(.75)}.v-text-field--outlined.v-input--dense .v-label{top:10px}.v-text-field--outlined.v-input--dense .v-label--active{-webkit-transform:translateY(-16px) scale(.75);transform:translateY(-16px) scale(.75)}.v-text-field--outlined fieldset{border-collapse:collapse;border-color:currentColor;border-style:solid;border-width:1px;bottom:0;left:0;pointer-events:none;position:absolute;right:0;top:-5px;-webkit-transition-duration:.15s;transition-duration:.15s;-webkit-transition-property:color;transition-property:color;-webkit-transition-timing-function:cubic-bezier(.25,.8,.25,1);transition-timing-function:cubic-bezier(.25,.8,.25,1)}.v-application--is-ltr .v-text-field--outlined fieldset{padding-left:8px}.v-application--is-ltr .v-text-field--outlined.v-text-field--reverse fieldset,.v-application--is-rtl .v-text-field--outlined fieldset{padding-right:8px}.v-application--is-rtl .v-text-field--outlined.v-text-field--reverse fieldset{padding-left:8px}.v-text-field--outlined legend{line-height:11px;padding:0;-webkit-transition:width .3s cubic-bezier(.25,.8,.5,1);transition:width .3s cubic-bezier(.25,.8,.5,1)}.v-application--is-ltr .v-text-field--outlined legend{text-align:left}.v-application--is-rtl .v-text-field--outlined legend{text-align:right}.v-application--is-ltr .v-text-field--outlined.v-text-field--reverse legend{margin-left:auto}.v-application--is-rtl .v-text-field--outlined.v-text-field--reverse legend{margin-right:auto}.v-application--is-ltr .v-text-field--outlined.v-text-field--rounded legend{margin-left:12px}.v-application--is-rtl .v-text-field--outlined.v-text-field--rounded legend{margin-right:12px}.v-text-field--outlined>.v-input__control>.v-input__slot{background:transparent}.v-text-field--outlined .v-text-field__prefix{max-height:32px}.v-text-field--outlined .v-input__append-outer,.v-text-field--outlined .v-input__prepend-outer{margin-top:18px}.v-text-field--outlined.v-input--has-state fieldset,.v-text-field--outlined.v-input--is-focused fieldset{border:2px solid currentColor}.v-text-field--rounded{border-radius:28px}.v-text-field--rounded>.v-input__control>.v-input__slot{padding:0 24px}.v-text-field--shaped{border-radius:16px 16px 0 0}.v-text-field.v-text-field--solo .v-label{top:calc(50% - 9px)}.v-text-field.v-text-field--solo .v-input__control{min-height:48px;padding:0}.v-text-field.v-text-field--solo .v-input__control input{caret-color:auto}.v-text-field.v-text-field--solo.v-input--dense>.v-input__control{min-height:38px}.v-text-field.v-text-field--solo:not(.v-text-field--solo-flat)>.v-input__control>.v-input__slot{-webkit-box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12);box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.v-text-field.v-text-field--solo .v-input__append-inner,.v-text-field.v-text-field--solo .v-input__prepend-inner{-ms-flex-item-align:center;align-self:center;margin-top:0}.v-text-field.v-text-field--solo .v-input__append-outer,.v-text-field.v-text-field--solo .v-input__prepend-outer{margin-top:12px}.v-text-field.v-text-field--solo.v-input--dense .v-input__append-outer,.v-text-field.v-text-field--solo.v-input--dense .v-input__prepend-outer{margin-top:7px}.v-text-field.v-input--is-focused>.v-input__control>.v-input__slot:after{-webkit-transform:scaleX(1);transform:scaleX(1)}.v-text-field.v-input--has-state>.v-input__control>.v-input__slot:before{border-color:currentColor}.theme--light.v-input,.theme--light.v-input input,.theme--light.v-input textarea{color:rgba(0,0,0,.87)}.theme--light.v-input input::-webkit-input-placeholder,.theme--light.v-input textarea::-webkit-input-placeholder{color:rgba(0,0,0,.38)}.theme--light.v-input input::-moz-placeholder,.theme--light.v-input textarea::-moz-placeholder{color:rgba(0,0,0,.38)}.theme--light.v-input input:-ms-input-placeholder,.theme--light.v-input textarea:-ms-input-placeholder{color:rgba(0,0,0,.38)}.theme--light.v-input input::-ms-input-placeholder,.theme--light.v-input textarea::-ms-input-placeholder{color:rgba(0,0,0,.38)}.theme--light.v-input input::placeholder,.theme--light.v-input textarea::placeholder{color:rgba(0,0,0,.38)}.theme--light.v-input--is-disabled,.theme--light.v-input--is-disabled input,.theme--light.v-input--is-disabled textarea{color:rgba(0,0,0,.38)}.theme--dark.v-input,.theme--dark.v-input input,.theme--dark.v-input textarea{color:#fff}.theme--dark.v-input input::-webkit-input-placeholder,.theme--dark.v-input textarea::-webkit-input-placeholder{color:hsla(0,0%,100%,.5)}.theme--dark.v-input input::-moz-placeholder,.theme--dark.v-input textarea::-moz-placeholder{color:hsla(0,0%,100%,.5)}.theme--dark.v-input input:-ms-input-placeholder,.theme--dark.v-input textarea:-ms-input-placeholder{color:hsla(0,0%,100%,.5)}.theme--dark.v-input input::-ms-input-placeholder,.theme--dark.v-input textarea::-ms-input-placeholder{color:hsla(0,0%,100%,.5)}.theme--dark.v-input input::placeholder,.theme--dark.v-input textarea::placeholder{color:hsla(0,0%,100%,.5)}.theme--dark.v-input--is-disabled,.theme--dark.v-input--is-disabled input,.theme--dark.v-input--is-disabled textarea{color:hsla(0,0%,100%,.5)}.v-input{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;font-size:16px;letter-spacing:normal;max-width:100%;text-align:left}.v-input .v-progress-linear{top:calc(100% - 1px);left:0}.v-input input{max-height:32px}.v-input input:invalid,.v-input textarea:invalid{-webkit-box-shadow:none;box-shadow:none}.v-input input:active,.v-input input:focus,.v-input textarea:active,.v-input textarea:focus{outline:none}.v-input .v-label{height:20px;line-height:20px;letter-spacing:normal}.v-input__append-outer,.v-input__prepend-outer{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin-bottom:4px;margin-top:4px;line-height:1}.v-input__append-outer .v-icon,.v-input__prepend-outer .v-icon{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.v-application--is-ltr .v-input__append-outer{margin-left:9px}.v-application--is-ltr .v-input__prepend-outer,.v-application--is-rtl .v-input__append-outer{margin-right:9px}.v-application--is-rtl .v-input__prepend-outer{margin-left:9px}.v-input__control{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:auto;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-wrap:wrap;flex-wrap:wrap;min-width:0;width:100%}.v-input__icon{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;height:24px;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;min-width:24px;width:24px}.v-input__icon--clear{border-radius:50%}.v-input__icon--clear .v-icon--disabled{visibility:hidden}.v-input__slot{-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:inherit;display:-webkit-box;display:-ms-flexbox;display:flex;margin-bottom:8px;min-height:inherit;position:relative;-webkit-transition:.3s cubic-bezier(.25,.8,.5,1);transition:.3s cubic-bezier(.25,.8,.5,1);width:100%}.v-input--dense>.v-input__control>.v-input__slot{margin-bottom:4px}.v-input--is-disabled:not(.v-input--is-readonly){pointer-events:none}.v-input--is-loading>.v-input__control>.v-input__slot:after,.v-input--is-loading>.v-input__control>.v-input__slot:before{display:none}.v-input--hide-details>.v-input__control>.v-input__slot{margin-bottom:0}.v-input--has-state.error--text .v-label{-webkit-animation:v-shake .6s cubic-bezier(.25,.8,.5,1);animation:v-shake .6s cubic-bezier(.25,.8,.5,1)}.theme--light.v-icon{color:rgba(0,0,0,.54)}.theme--light.v-icon:focus:after{opacity:.12}.theme--light.v-icon.v-icon.v-icon--disabled{color:rgba(0,0,0,.38)!important}.theme--dark.v-icon{color:#fff}.theme--dark.v-icon:focus:after{opacity:.24}.theme--dark.v-icon.v-icon.v-icon--disabled{color:hsla(0,0%,100%,.5)!important}.v-icon.v-icon{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-font-feature-settings:"liga";font-feature-settings:"liga";font-size:24px;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;letter-spacing:normal;line-height:1;position:relative;text-indent:0;-webkit-transition:.3s cubic-bezier(.25,.8,.5,1),visibility 0s;transition:.3s cubic-bezier(.25,.8,.5,1),visibility 0s;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.v-icon.v-icon:after{background-color:currentColor;border-radius:50%;content:"";display:inline-block;height:100%;left:0;opacity:0;pointer-events:none;position:absolute;top:0;-webkit-transform:scale(1.3);transform:scale(1.3);width:100%;-webkit-transition:opacity .2s cubic-bezier(.4,0,.6,1);transition:opacity .2s cubic-bezier(.4,0,.6,1)}.v-icon.v-icon--dense{font-size:20px}.v-icon--right{margin-left:8px}.v-icon--left{margin-right:8px}.v-icon.v-icon.v-icon--link{cursor:pointer;outline:none}.v-icon--disabled{pointer-events:none}.v-icon--dense__component,.v-icon--dense__svg{height:20px}.v-icon__component,.v-icon__svg{height:24px;width:24px}.v-icon__svg{fill:currentColor}.theme--light.v-label{color:rgba(0,0,0,.6)}.theme--light.v-label--is-disabled{color:rgba(0,0,0,.38)}.theme--dark.v-label{color:hsla(0,0%,100%,.7)}.theme--dark.v-label--is-disabled{color:hsla(0,0%,100%,.5)}.v-label{font-size:16px;line-height:1;min-height:8px;-webkit-transition:.3s cubic-bezier(.25,.8,.5,1);transition:.3s cubic-bezier(.25,.8,.5,1)}.theme--light.v-messages{color:rgba(0,0,0,.6)}.theme--dark.v-messages{color:hsla(0,0%,100%,.7)}.v-messages{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;font-size:12px;min-height:14px;min-width:1px;position:relative}.v-application--is-ltr .v-messages{text-align:left}.v-application--is-rtl .v-messages{text-align:right}.v-messages__message{line-height:12px;word-break:break-word;overflow-wrap:break-word;word-wrap:break-word;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto}.theme--light.v-counter{color:rgba(0,0,0,.6)}.theme--dark.v-counter{color:hsla(0,0%,100%,.7)}.v-counter{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;font-size:12px;min-height:12px;line-height:12px}.theme--light.v-snack__wrapper{color:rgba(0,0,0,.87)}.theme--dark.v-snack__wrapper{color:#fff}.v-sheet.v-snack__wrapper{border-radius:4px}.v-sheet.v-snack__wrapper:not(.v-sheet--outlined){-webkit-box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12);box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.v-sheet.v-snack__wrapper.v-sheet--shaped{border-radius:24px 4px}.v-snack{bottom:0;display:-webkit-box;display:-ms-flexbox;display:flex;font-size:.875rem;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;left:0;pointer-events:none;right:0;top:0;width:100%}.v-snack:not(.v-snack--absolute){height:100vh;position:fixed;z-index:1000}.v-snack:not(.v-snack--centered):not(.v-snack--top){-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}.v-snack__wrapper{-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-color:currentColor!important;display:-webkit-box;display:-ms-flexbox;display:flex;margin:8px;max-width:672px;min-height:48px;min-width:344px;padding:0;pointer-events:auto;position:relative;-webkit-transition-duration:.15s;transition-duration:.15s;-webkit-transition-property:opacity,-webkit-transform;transition-property:opacity,-webkit-transform;transition-property:opacity,transform;transition-property:opacity,transform,-webkit-transform;-webkit-transition-timing-function:cubic-bezier(0,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1)}.v-snack__wrapper.theme--dark{background-color:#333;color:hsla(0,0%,100%,.87)}.v-snack__content{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;font-size:.875rem;font-weight:400;letter-spacing:.0178571429em;line-height:1.25rem;margin-right:auto;padding:14px 16px;text-align:initial}.v-snack__action{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-item-align:center;align-self:center;display:-webkit-box;display:-ms-flexbox;display:flex}.v-snack__action .v-ripple__container{display:none}.v-application--is-ltr .v-snack__action{margin-right:8px}.v-application--is-rtl .v-snack__action{margin-left:8px}.v-snack__action>.v-snack__btn.v-btn{padding:0 8px}.v-snack__btn{margin-left:0;margin-right:0;margin:0;min-width:auto}.v-snack--absolute{height:100%;position:absolute;z-index:1}.v-snack--centered{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.v-snack--left{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;right:auto}.v-snack--multi-line .v-snack__wrapper{min-height:68px}.v-snack--right{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;left:auto}.v-snack:not(.v-snack--has-background) .v-snack__wrapper{-webkit-box-shadow:none;box-shadow:none}.v-snack--bottom{top:auto}.v-snack--text .v-snack__wrapper:before{background-color:currentColor;border-radius:inherit;bottom:0;content:"";left:0;opacity:.12;pointer-events:none;position:absolute;right:0;top:0}.v-snack--top{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;bottom:auto}.v-snack--vertical .v-snack__wrapper{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.v-snack--vertical .v-snack__wrapper .v-snack__action{-ms-flex-item-align:end;align-self:flex-end;margin-bottom:8px}.v-snack-transition-enter.v-snack__wrapper{-webkit-transform:scale(.8);transform:scale(.8)}.v-snack-transition-enter.v-snack__wrapper,.v-snack-transition-leave-to.v-snack__wrapper{opacity:0}.theme--light.v-alert .v-alert--prominent .v-alert__icon:after{background:rgba(0,0,0,.12)}.theme--dark.v-alert .v-alert--prominent .v-alert__icon:after{background:hsla(0,0%,100%,.12)}.v-sheet.v-alert{border-radius:4px}.v-sheet.v-alert:not(.v-sheet--outlined){-webkit-box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12);box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.v-sheet.v-alert.v-sheet--shaped{border-radius:24px 4px}.v-alert{display:block;font-size:16px;margin-bottom:16px;padding:16px;position:relative;-webkit-transition:.3s cubic-bezier(.25,.8,.5,1);transition:.3s cubic-bezier(.25,.8,.5,1)}.v-alert:not(.v-sheet--tile){border-radius:4px}.v-application--is-ltr .v-alert>.v-alert__content,.v-application--is-ltr .v-alert>.v-icon{margin-right:16px}.v-application--is-rtl .v-alert>.v-alert__content,.v-application--is-rtl .v-alert>.v-icon{margin-left:16px}.v-application--is-ltr .v-alert>.v-icon+.v-alert__content{margin-right:0}.v-application--is-rtl .v-alert>.v-icon+.v-alert__content{margin-left:0}.v-application--is-ltr .v-alert>.v-alert__content+.v-icon{margin-right:0}.v-application--is-rtl .v-alert>.v-alert__content+.v-icon{margin-left:0}.v-alert__border{border-style:solid;border-width:4px;content:"";position:absolute}.v-alert__border:not(.v-alert__border--has-color){opacity:.26}.v-alert__border--left,.v-alert__border--right{bottom:0;top:0}.v-alert__border--bottom,.v-alert__border--top{left:0;right:0}.v-alert__border--bottom{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;bottom:0}.v-application--is-ltr .v-alert__border--left{border-top-left-radius:inherit;border-bottom-left-radius:inherit;left:0}.v-application--is-ltr .v-alert__border--right,.v-application--is-rtl .v-alert__border--left{border-top-right-radius:inherit;border-bottom-right-radius:inherit;right:0}.v-application--is-rtl .v-alert__border--right{border-top-left-radius:inherit;border-bottom-left-radius:inherit;left:0}.v-alert__border--top{border-top-left-radius:inherit;border-top-right-radius:inherit;top:0}.v-alert__content{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.v-application--is-ltr .v-alert__dismissible{margin:-16px -8px -16px 8px}.v-application--is-rtl .v-alert__dismissible{margin:-16px 8px -16px -8px}.v-alert__icon{-ms-flex-item-align:start;align-self:flex-start;border-radius:50%;height:24px;min-width:24px;position:relative}.v-application--is-ltr .v-alert__icon{margin-right:16px}.v-application--is-rtl .v-alert__icon{margin-left:16px}.v-alert__icon.v-icon{font-size:24px}.v-alert__wrapper{-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-radius:inherit;display:-webkit-box;display:-ms-flexbox;display:flex}.v-application--is-ltr .v-alert--border.v-alert--prominent .v-alert__icon{margin-left:8px}.v-application--is-rtl .v-alert--border.v-alert--prominent .v-alert__icon{margin-right:8px}.v-alert--dense{padding-top:8px;padding-bottom:8px}.v-alert--dense .v-alert__border{border-width:medium}.v-alert--outlined{background:transparent!important;border:thin solid currentColor!important}.v-alert--outlined .v-alert__icon{color:inherit!important}.v-alert--prominent .v-alert__icon{-ms-flex-item-align:center;align-self:center;height:48px;min-width:48px}.v-alert--prominent .v-alert__icon.v-icon{font-size:32px}.v-alert--prominent .v-alert__icon.v-icon:after{background:currentColor!important;border-radius:50%;bottom:0;content:"";left:0;opacity:.16;position:absolute;right:0;top:0}.v-alert--prominent.v-alert--dense .v-alert__icon.v-icon:after{-webkit-transform:scale(1);transform:scale(1)}.v-alert--text{background:transparent!important}.v-alert--text:before{background-color:currentColor;border-radius:inherit;bottom:0;content:"";left:0;opacity:.12;position:absolute;pointer-events:none;right:0;top:0}.v-input--checkbox.v-input--indeterminate.v-input--is-disabled{opacity:.6}.v-input--checkbox.v-input--dense{margin-top:4px}.theme--light.v-input--selection-controls.v-input--is-disabled:not(.v-input--indeterminate) .v-icon{color:rgba(0,0,0,.26)!important}.theme--dark.v-input--selection-controls.v-input--is-disabled:not(.v-input--indeterminate) .v-icon{color:hsla(0,0%,100%,.3)!important}.v-input--selection-controls{margin-top:16px;padding-top:4px}.v-input--selection-controls>.v-input__append-outer,.v-input--selection-controls>.v-input__prepend-outer{margin-top:0;margin-bottom:0}.v-input--selection-controls:not(.v-input--hide-details)>.v-input__slot{margin-bottom:12px}.v-input--selection-controls .v-input__slot,.v-input--selection-controls .v-radio{cursor:pointer}.v-input--selection-controls .v-input__slot>.v-label,.v-input--selection-controls .v-radio>.v-label{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;height:auto}.v-input--selection-controls__input{color:inherit;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;height:24px;position:relative;-webkit-transition:.3s cubic-bezier(.25,.8,.5,1);transition:.3s cubic-bezier(.25,.8,.5,1);-webkit-transition-property:-webkit-transform;transition-property:-webkit-transform;transition-property:transform;transition-property:transform,-webkit-transform;width:24px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.v-input--selection-controls__input .v-icon{width:100%}.v-application--is-ltr .v-input--selection-controls__input{margin-right:8px}.v-application--is-rtl .v-input--selection-controls__input{margin-left:8px}.v-input--selection-controls__input input[role=checkbox],.v-input--selection-controls__input input[role=radio],.v-input--selection-controls__input input[role=switch]{position:absolute;opacity:0;width:100%;height:100%;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.v-input--selection-controls__input+.v-label{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.v-input--selection-controls__ripple{border-radius:50%;cursor:pointer;height:34px;position:absolute;-webkit-transition:inherit;transition:inherit;width:34px;left:-12px;top:calc(50% - 24px);margin:7px}.v-input--selection-controls__ripple:before{border-radius:inherit;bottom:0;content:"";position:absolute;opacity:.2;left:0;right:0;top:0;-webkit-transform-origin:center center;transform-origin:center center;-webkit-transform:scale(.2);transform:scale(.2);-webkit-transition:inherit;transition:inherit}.v-input--selection-controls__ripple>.v-ripple__container{-webkit-transform:scale(1.2);transform:scale(1.2)}.v-input--selection-controls.v-input--dense .v-input--selection-controls__ripple{width:28px;height:28px;left:-9px}.v-input--selection-controls.v-input--dense:not(.v-input--switch) .v-input--selection-controls__ripple{top:calc(50% - 21px)}.v-input--selection-controls.v-input{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto}.v-input--selection-controls.v-input--is-focused .v-input--selection-controls__ripple:before,.v-input--selection-controls .v-radio--is-focused .v-input--selection-controls__ripple:before{background:currentColor;-webkit-transform:scale(1.2);transform:scale(1.2)}.v-input--selection-controls__input:hover .v-input--selection-controls__ripple:before{background:currentColor;-webkit-transform:scale(1.2);transform:scale(1.2);-webkit-transition:none;transition:none}.container{width:100%;padding:12px;margin-right:auto;margin-left:auto}@media(min-width:960px){.container{max-width:900px}}@media(min-width:1264px){.container{max-width:1185px}}@media(min-width:1904px){.container{max-width:1785px}}.container--fluid{max-width:100%}.row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;margin:-12px}.row+.row{margin-top:12px}.row+.row--dense{margin-top:4px}.row--dense{margin:-4px}.row--dense>.col,.row--dense>[class*=col-]{padding:4px}.row.no-gutters{margin:0}.row.no-gutters>.col,.row.no-gutters>[class*=col-]{padding:0}.col,.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col-auto,.col-lg,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-auto,.col-md,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md-auto,.col-sm,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-auto{width:100%;padding:12px}.col{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1,.col-auto{-webkit-box-flex:0}.col-1{-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-2{-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-2,.col-3{-webkit-box-flex:0}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-4,.col-5{-webkit-box-flex:0}.col-5{-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-6,.col-7{-webkit-box-flex:0}.col-7{-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-8{-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-8,.col-9{-webkit-box-flex:0}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-10,.col-11{-webkit-box-flex:0}.col-11{-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.v-application--is-ltr .offset-1{margin-left:8.3333333333%}.v-application--is-rtl .offset-1{margin-right:8.3333333333%}.v-application--is-ltr .offset-2{margin-left:16.6666666667%}.v-application--is-rtl .offset-2{margin-right:16.6666666667%}.v-application--is-ltr .offset-3{margin-left:25%}.v-application--is-rtl .offset-3{margin-right:25%}.v-application--is-ltr .offset-4{margin-left:33.3333333333%}.v-application--is-rtl .offset-4{margin-right:33.3333333333%}.v-application--is-ltr .offset-5{margin-left:41.6666666667%}.v-application--is-rtl .offset-5{margin-right:41.6666666667%}.v-application--is-ltr .offset-6{margin-left:50%}.v-application--is-rtl .offset-6{margin-right:50%}.v-application--is-ltr .offset-7{margin-left:58.3333333333%}.v-application--is-rtl .offset-7{margin-right:58.3333333333%}.v-application--is-ltr .offset-8{margin-left:66.6666666667%}.v-application--is-rtl .offset-8{margin-right:66.6666666667%}.v-application--is-ltr .offset-9{margin-left:75%}.v-application--is-rtl .offset-9{margin-right:75%}.v-application--is-ltr .offset-10{margin-left:83.3333333333%}.v-application--is-rtl .offset-10{margin-right:83.3333333333%}.v-application--is-ltr .offset-11{margin-left:91.6666666667%}.v-application--is-rtl .offset-11{margin-right:91.6666666667%}@media(min-width:600px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-sm-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-sm-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-sm-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-sm-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-sm-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-sm-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-sm-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.v-application--is-ltr .offset-sm-0{margin-left:0}.v-application--is-rtl .offset-sm-0{margin-right:0}.v-application--is-ltr .offset-sm-1{margin-left:8.3333333333%}.v-application--is-rtl .offset-sm-1{margin-right:8.3333333333%}.v-application--is-ltr .offset-sm-2{margin-left:16.6666666667%}.v-application--is-rtl .offset-sm-2{margin-right:16.6666666667%}.v-application--is-ltr .offset-sm-3{margin-left:25%}.v-application--is-rtl .offset-sm-3{margin-right:25%}.v-application--is-ltr .offset-sm-4{margin-left:33.3333333333%}.v-application--is-rtl .offset-sm-4{margin-right:33.3333333333%}.v-application--is-ltr .offset-sm-5{margin-left:41.6666666667%}.v-application--is-rtl .offset-sm-5{margin-right:41.6666666667%}.v-application--is-ltr .offset-sm-6{margin-left:50%}.v-application--is-rtl .offset-sm-6{margin-right:50%}.v-application--is-ltr .offset-sm-7{margin-left:58.3333333333%}.v-application--is-rtl .offset-sm-7{margin-right:58.3333333333%}.v-application--is-ltr .offset-sm-8{margin-left:66.6666666667%}.v-application--is-rtl .offset-sm-8{margin-right:66.6666666667%}.v-application--is-ltr .offset-sm-9{margin-left:75%}.v-application--is-rtl .offset-sm-9{margin-right:75%}.v-application--is-ltr .offset-sm-10{margin-left:83.3333333333%}.v-application--is-rtl .offset-sm-10{margin-right:83.3333333333%}.v-application--is-ltr .offset-sm-11{margin-left:91.6666666667%}.v-application--is-rtl .offset-sm-11{margin-right:91.6666666667%}}@media(min-width:960px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-md-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-md-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-md-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-md-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-md-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-md-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-md-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.v-application--is-ltr .offset-md-0{margin-left:0}.v-application--is-rtl .offset-md-0{margin-right:0}.v-application--is-ltr .offset-md-1{margin-left:8.3333333333%}.v-application--is-rtl .offset-md-1{margin-right:8.3333333333%}.v-application--is-ltr .offset-md-2{margin-left:16.6666666667%}.v-application--is-rtl .offset-md-2{margin-right:16.6666666667%}.v-application--is-ltr .offset-md-3{margin-left:25%}.v-application--is-rtl .offset-md-3{margin-right:25%}.v-application--is-ltr .offset-md-4{margin-left:33.3333333333%}.v-application--is-rtl .offset-md-4{margin-right:33.3333333333%}.v-application--is-ltr .offset-md-5{margin-left:41.6666666667%}.v-application--is-rtl .offset-md-5{margin-right:41.6666666667%}.v-application--is-ltr .offset-md-6{margin-left:50%}.v-application--is-rtl .offset-md-6{margin-right:50%}.v-application--is-ltr .offset-md-7{margin-left:58.3333333333%}.v-application--is-rtl .offset-md-7{margin-right:58.3333333333%}.v-application--is-ltr .offset-md-8{margin-left:66.6666666667%}.v-application--is-rtl .offset-md-8{margin-right:66.6666666667%}.v-application--is-ltr .offset-md-9{margin-left:75%}.v-application--is-rtl .offset-md-9{margin-right:75%}.v-application--is-ltr .offset-md-10{margin-left:83.3333333333%}.v-application--is-rtl .offset-md-10{margin-right:83.3333333333%}.v-application--is-ltr .offset-md-11{margin-left:91.6666666667%}.v-application--is-rtl .offset-md-11{margin-right:91.6666666667%}}@media(min-width:1264px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-lg-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-lg-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-lg-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-lg-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-lg-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-lg-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-lg-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.v-application--is-ltr .offset-lg-0{margin-left:0}.v-application--is-rtl .offset-lg-0{margin-right:0}.v-application--is-ltr .offset-lg-1{margin-left:8.3333333333%}.v-application--is-rtl .offset-lg-1{margin-right:8.3333333333%}.v-application--is-ltr .offset-lg-2{margin-left:16.6666666667%}.v-application--is-rtl .offset-lg-2{margin-right:16.6666666667%}.v-application--is-ltr .offset-lg-3{margin-left:25%}.v-application--is-rtl .offset-lg-3{margin-right:25%}.v-application--is-ltr .offset-lg-4{margin-left:33.3333333333%}.v-application--is-rtl .offset-lg-4{margin-right:33.3333333333%}.v-application--is-ltr .offset-lg-5{margin-left:41.6666666667%}.v-application--is-rtl .offset-lg-5{margin-right:41.6666666667%}.v-application--is-ltr .offset-lg-6{margin-left:50%}.v-application--is-rtl .offset-lg-6{margin-right:50%}.v-application--is-ltr .offset-lg-7{margin-left:58.3333333333%}.v-application--is-rtl .offset-lg-7{margin-right:58.3333333333%}.v-application--is-ltr .offset-lg-8{margin-left:66.6666666667%}.v-application--is-rtl .offset-lg-8{margin-right:66.6666666667%}.v-application--is-ltr .offset-lg-9{margin-left:75%}.v-application--is-rtl .offset-lg-9{margin-right:75%}.v-application--is-ltr .offset-lg-10{margin-left:83.3333333333%}.v-application--is-rtl .offset-lg-10{margin-right:83.3333333333%}.v-application--is-ltr .offset-lg-11{margin-left:91.6666666667%}.v-application--is-rtl .offset-lg-11{margin-right:91.6666666667%}}@media(min-width:1904px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-xl-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-xl-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-xl-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-xl-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-xl-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-xl-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-xl-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.v-application--is-ltr .offset-xl-0{margin-left:0}.v-application--is-rtl .offset-xl-0{margin-right:0}.v-application--is-ltr .offset-xl-1{margin-left:8.3333333333%}.v-application--is-rtl .offset-xl-1{margin-right:8.3333333333%}.v-application--is-ltr .offset-xl-2{margin-left:16.6666666667%}.v-application--is-rtl .offset-xl-2{margin-right:16.6666666667%}.v-application--is-ltr .offset-xl-3{margin-left:25%}.v-application--is-rtl .offset-xl-3{margin-right:25%}.v-application--is-ltr .offset-xl-4{margin-left:33.3333333333%}.v-application--is-rtl .offset-xl-4{margin-right:33.3333333333%}.v-application--is-ltr .offset-xl-5{margin-left:41.6666666667%}.v-application--is-rtl .offset-xl-5{margin-right:41.6666666667%}.v-application--is-ltr .offset-xl-6{margin-left:50%}.v-application--is-rtl .offset-xl-6{margin-right:50%}.v-application--is-ltr .offset-xl-7{margin-left:58.3333333333%}.v-application--is-rtl .offset-xl-7{margin-right:58.3333333333%}.v-application--is-ltr .offset-xl-8{margin-left:66.6666666667%}.v-application--is-rtl .offset-xl-8{margin-right:66.6666666667%}.v-application--is-ltr .offset-xl-9{margin-left:75%}.v-application--is-rtl .offset-xl-9{margin-right:75%}.v-application--is-ltr .offset-xl-10{margin-left:83.3333333333%}.v-application--is-rtl .offset-xl-10{margin-right:83.3333333333%}.v-application--is-ltr .offset-xl-11{margin-left:91.6666666667%}.v-application--is-rtl .offset-xl-11{margin-right:91.6666666667%}}.v-autocomplete.v-input>.v-input__control>.v-input__slot{cursor:text}.v-autocomplete input{-ms-flex-item-align:center;align-self:center}.v-autocomplete.v-select.v-input--is-focused input{min-width:64px}.v-autocomplete:not(.v-input--is-focused).v-select--chips input{max-height:0;padding:0}.v-autocomplete--is-selecting-index input{opacity:0}.v-autocomplete.v-text-field--enclosed:not(.v-text-field--solo):not(.v-text-field--single-line):not(.v-text-field--outlined) .v-select__slot>input{margin-top:24px}.v-autocomplete.v-text-field--enclosed:not(.v-text-field--solo):not(.v-text-field--single-line):not(.v-text-field--outlined).v-input--dense .v-select__slot>input{margin-top:20px}.v-autocomplete:not(.v-input--is-disabled).v-select.v-text-field input{pointer-events:inherit}.v-autocomplete__content.v-menu__content,.v-autocomplete__content.v-menu__content .v-card{border-radius:0}.theme--light.v-select .v-select__selections{color:rgba(0,0,0,.87);min-height:10px}.theme--light.v-select.v-input--is-disabled .v-select__selections,.theme--light.v-select .v-select__selection--disabled{color:rgba(0,0,0,.38)}.theme--light.v-select.v-text-field--solo-inverted.v-input--is-focused .v-select__selections{color:#fff}.theme--dark.v-select .v-select__selections{color:#fff;min-height:10px}.theme--dark.v-select.v-input--is-disabled .v-select__selections,.theme--dark.v-select .v-select__selection--disabled{color:hsla(0,0%,100%,.5)}.theme--dark.v-select.v-text-field--solo-inverted.v-input--is-focused .v-select__selections{color:rgba(0,0,0,.87)}.v-select{position:relative}.v-select:not(.v-select--is-multi).v-text-field--single-line .v-select__selections{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.v-select>.v-input__control>.v-input__slot{cursor:pointer}.v-select .v-chip{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;margin:4px}.v-select .v-chip--selected:after{opacity:.22}.v-select .fade-transition-leave-active{position:absolute;left:0}.v-select.v-input--is-dirty ::-webkit-input-placeholder{color:transparent!important}.v-select.v-input--is-dirty ::-moz-placeholder{color:transparent!important}.v-select.v-input--is-dirty :-ms-input-placeholder{color:transparent!important}.v-select.v-input--is-dirty ::-ms-input-placeholder{color:transparent!important}.v-select.v-input--is-dirty ::placeholder{color:transparent!important}.v-select:not(.v-input--is-dirty):not(.v-input--is-focused) .v-text-field__prefix{line-height:20px;top:7px;-webkit-transition:.3s cubic-bezier(.25,.8,.5,1);transition:.3s cubic-bezier(.25,.8,.5,1)}.v-select.v-text-field--enclosed:not(.v-text-field--single-line):not(.v-text-field--outlined) .v-select__selections{padding-top:20px}.v-select.v-text-field--outlined:not(.v-text-field--single-line) .v-select__selections{padding:8px 0}.v-select.v-text-field--outlined:not(.v-text-field--single-line).v-input--dense .v-select__selections{padding:4px 0}.v-select.v-text-field input{-webkit-box-flex:1;-ms-flex:1 1;flex:1 1;min-width:0;pointer-events:none;position:relative}.v-select.v-text-field:not(.v-text-field--single-line) input{margin-top:0}.v-select.v-select--is-menu-active .v-input__icon--append .v-icon{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.v-select.v-select--chips input{margin:0}.v-select.v-select--chips .v-select__selections{min-height:42px}.v-select.v-select--chips.v-input--dense .v-select__selections{min-height:40px}.v-select.v-select--chips .v-chip--select.v-chip--active:before{opacity:.2}.v-select.v-select--chips.v-select--chips--small .v-select__selections{min-height:26px}.v-select.v-select--chips:not(.v-text-field--single-line).v-text-field--box .v-select__selections,.v-select.v-select--chips:not(.v-text-field--single-line).v-text-field--enclosed .v-select__selections{min-height:68px}.v-select.v-select--chips:not(.v-text-field--single-line).v-text-field--box.v-input--dense .v-select__selections,.v-select.v-select--chips:not(.v-text-field--single-line).v-text-field--enclosed.v-input--dense .v-select__selections{min-height:40px}.v-select.v-select--chips:not(.v-text-field--single-line).v-text-field--box.v-select--chips--small .v-select__selections,.v-select.v-select--chips:not(.v-text-field--single-line).v-text-field--enclosed.v-select--chips--small .v-select__selections{min-height:26px}.v-select.v-select--chips:not(.v-text-field--single-line).v-text-field--box.v-select--chips--small.v-input--dense .v-select__selections,.v-select.v-select--chips:not(.v-text-field--single-line).v-text-field--enclosed.v-select--chips--small.v-input--dense .v-select__selections{min-height:38px}.v-select.v-text-field--reverse .v-select__selections,.v-select.v-text-field--reverse .v-select__slot{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.v-select__selections{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 1;flex:1 1;-ms-flex-wrap:wrap;flex-wrap:wrap;line-height:18px;max-width:100%;min-width:0}.v-select__selection{max-width:90%}.v-select__selection--comma{margin:7px 4px 7px 0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.v-select.v-input--dense .v-select__selection--comma{margin:5px 4px 3px 0}.v-select.v-input--dense .v-chip{margin:0 4px 0 4px}.v-select__slot{position:relative;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;max-width:100%;min-width:0;width:100%}.v-select:not(.v-text-field--single-line):not(.v-text-field--outlined) .v-select__slot>input{-ms-flex-item-align:end;align-self:flex-end}.theme--light.v-list-item--disabled{color:rgba(0,0,0,.38)}.theme--light.v-list-item:not(.v-list-item--active):not(.v-list-item--disabled){color:rgba(0,0,0,.87)}.theme--light.v-list-item .v-list-item__mask{color:rgba(0,0,0,.38);background:#eee}.theme--light.v-list-item .v-list-item__action-text,.theme--light.v-list-item .v-list-item__subtitle{color:rgba(0,0,0,.6)}.theme--light.v-list-item:hover:before{opacity:.04}.theme--light.v-list-item--active:before,.theme--light.v-list-item--active:hover:before,.theme--light.v-list-item:focus:before{opacity:.12}.theme--light.v-list-item--active:focus:before,.theme--light.v-list-item.v-list-item--highlighted:before{opacity:.16}.theme--dark.v-list-item--disabled{color:hsla(0,0%,100%,.5)}.theme--dark.v-list-item:not(.v-list-item--active):not(.v-list-item--disabled){color:#fff}.theme--dark.v-list-item .v-list-item__mask{color:hsla(0,0%,100%,.5);background:#494949}.theme--dark.v-list-item .v-list-item__action-text,.theme--dark.v-list-item .v-list-item__subtitle{color:hsla(0,0%,100%,.7)}.theme--dark.v-list-item:hover:before{opacity:.08}.theme--dark.v-list-item--active:before,.theme--dark.v-list-item--active:hover:before,.theme--dark.v-list-item:focus:before{opacity:.24}.theme--dark.v-list-item--active:focus:before,.theme--dark.v-list-item.v-list-item--highlighted:before{opacity:.32}.v-list-item{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 1 100%;flex:1 1 100%;letter-spacing:normal;min-height:48px;outline:none;padding:0 16px;position:relative;text-decoration:none}.v-list-item--disabled{pointer-events:none}.v-list-item--selectable{-webkit-user-select:auto;-moz-user-select:auto;-ms-user-select:auto;user-select:auto}.v-list-item:after{content:"";min-height:inherit;font-size:0}.v-list-item__action{-ms-flex-item-align:center;align-self:center;margin:12px 0}.v-list-item__action .v-input,.v-list-item__action .v-input--selection-controls__input,.v-list-item__action .v-input__control,.v-list-item__action .v-input__slot{margin:0!important}.v-list-item__action .v-input{padding:0}.v-list-item__action .v-input .v-messages{display:none}.v-list-item__action-text{font-size:.75rem}.v-list-item__avatar{-ms-flex-item-align:center;align-self:center;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.v-list-item__avatar,.v-list-item__avatar.v-list-item__avatar--horizontal{margin-bottom:8px;margin-top:8px}.v-application--is-ltr .v-list-item__avatar.v-list-item__avatar--horizontal:first-child{margin-left:-16px}.v-application--is-rtl .v-list-item__avatar.v-list-item__avatar--horizontal:first-child{margin-right:-16px}.v-application--is-ltr .v-list-item__avatar.v-list-item__avatar--horizontal:last-child{margin-left:-16px}.v-application--is-rtl .v-list-item__avatar.v-list-item__avatar--horizontal:last-child{margin-right:-16px}.v-list-item__content{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-item-align:center;align-self:center;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-flex:1;-ms-flex:1 1;flex:1 1;overflow:hidden;padding:12px 0}.v-list-item__content>*{line-height:1.1;-webkit-box-flex:1;-ms-flex:1 0 100%;flex:1 0 100%}.v-list-item__content>:not(:last-child){margin-bottom:2px}.v-list-item__icon{-ms-flex-item-align:start;align-self:flex-start;margin:16px 0}.v-application--is-ltr .v-list-item__action:last-of-type:not(:only-child),.v-application--is-ltr .v-list-item__avatar:last-of-type:not(:only-child),.v-application--is-ltr .v-list-item__icon:last-of-type:not(:only-child){margin-left:16px}.v-application--is-ltr .v-list-item__avatar:first-child,.v-application--is-rtl .v-list-item__action:last-of-type:not(:only-child),.v-application--is-rtl .v-list-item__avatar:last-of-type:not(:only-child),.v-application--is-rtl .v-list-item__icon:last-of-type:not(:only-child){margin-right:16px}.v-application--is-rtl .v-list-item__avatar:first-child{margin-left:16px}.v-application--is-ltr .v-list-item__action:first-child,.v-application--is-ltr .v-list-item__icon:first-child{margin-right:32px}.v-application--is-rtl .v-list-item__action:first-child,.v-application--is-rtl .v-list-item__icon:first-child{margin-left:32px}.v-list-item__action,.v-list-item__avatar,.v-list-item__icon{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;min-width:24px}.v-list-item .v-list-item__subtitle,.v-list-item .v-list-item__title{line-height:1.2}.v-list-item__subtitle,.v-list-item__title{-webkit-box-flex:1;-ms-flex:1 1 100%;flex:1 1 100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.v-list-item__title{-ms-flex-item-align:center;align-self:center;font-size:1rem}.v-list-item__title>.v-badge{margin-top:16px}.v-list-item__subtitle{font-size:.875rem}.v-list--dense .v-list-item,.v-list-item--dense{min-height:40px}.v-list--dense .v-list-item .v-list-item__icon,.v-list-item--dense .v-list-item__icon{height:24px;margin-top:8px;margin-bottom:8px}.v-list--dense .v-list-item .v-list-item__content,.v-list-item--dense .v-list-item__content{padding:8px 0}.v-list--dense .v-list-item .v-list-item__subtitle,.v-list--dense .v-list-item .v-list-item__title,.v-list-item--dense .v-list-item__subtitle,.v-list-item--dense .v-list-item__title{font-size:.8125rem;font-weight:500;line-height:1rem}.v-list--dense .v-list-item.v-list-item--two-line,.v-list-item--dense.v-list-item--two-line{min-height:60px}.v-list--dense .v-list-item.v-list-item--three-line,.v-list-item--dense.v-list-item--three-line{min-height:76px}.v-list-item--link{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.v-list-item--link:before{background-color:currentColor;bottom:0;content:"";left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:0;-webkit-transition:.3s cubic-bezier(.25,.8,.5,1);transition:.3s cubic-bezier(.25,.8,.5,1)}.v-list .v-list-item--active,.v-list .v-list-item--active .v-icon{color:inherit}.v-list-item__action--stack{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end;-ms-flex-item-align:stretch;align-self:stretch;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;white-space:nowrap;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.v-list--three-line .v-list-item .v-list-item__avatar:not(.v-list-item__avatar--horizontal),.v-list--three-line .v-list-item .v-list-item__icon,.v-list--two-line .v-list-item .v-list-item__avatar:not(.v-list-item__avatar--horizontal),.v-list--two-line .v-list-item .v-list-item__icon,.v-list-item--three-line .v-list-item__avatar:not(.v-list-item__avatar--horizontal),.v-list-item--three-line .v-list-item__icon,.v-list-item--two-line .v-list-item__avatar:not(.v-list-item__avatar--horizontal),.v-list-item--two-line .v-list-item__icon{margin-bottom:16px;margin-top:16px}.v-list--two-line .v-list-item,.v-list-item--two-line{min-height:64px}.v-list--two-line .v-list-item .v-list-item__icon,.v-list-item--two-line .v-list-item__icon{margin-bottom:32px}.v-list--three-line .v-list-item,.v-list-item--three-line{min-height:88px}.v-list--three-line .v-list-item .v-list-item__action,.v-list--three-line .v-list-item .v-list-item__avatar,.v-list-item--three-line .v-list-item__action,.v-list-item--three-line .v-list-item__avatar{-ms-flex-item-align:start;align-self:flex-start;margin-top:16px;margin-bottom:16px}.v-list--three-line .v-list-item .v-list-item__content,.v-list-item--three-line .v-list-item__content{-ms-flex-item-align:stretch;align-self:stretch}.v-list--three-line .v-list-item .v-list-item__subtitle,.v-list-item--three-line .v-list-item__subtitle{white-space:normal;-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box}.v-simple-checkbox{-ms-flex-item-align:center;align-self:center;line-height:normal;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.v-simple-checkbox .v-icon{cursor:pointer}.v-simple-checkbox--disabled{cursor:default}.theme--light.v-divider{border-color:rgba(0,0,0,.12)}.theme--dark.v-divider{border-color:hsla(0,0%,100%,.12)}.v-divider{display:block;-webkit-box-flex:1;-ms-flex:1 1 0px;flex:1 1 0px;max-width:100%;height:0;max-height:0;border:solid;border-width:thin 0 0 0;-webkit-transition:inherit;transition:inherit}.v-divider--inset:not(.v-divider--vertical){max-width:calc(100% - 72px)}.v-application--is-ltr .v-divider--inset:not(.v-divider--vertical){margin-left:72px}.v-application--is-rtl .v-divider--inset:not(.v-divider--vertical){margin-right:72px}.v-divider--vertical{-ms-flex-item-align:stretch;align-self:stretch;border:solid;border-width:0 thin 0 0;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;height:inherit;min-height:100%;max-height:100%;max-width:0;width:0;vertical-align:text-bottom;margin:0 -1px}.v-divider--vertical.v-divider--inset{margin-top:8px;min-height:0;max-height:calc(100% - 16px)}.theme--light.v-subheader{color:rgba(0,0,0,.6)}.theme--dark.v-subheader{color:hsla(0,0%,100%,.7)}.v-subheader{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;height:48px;font-size:.875rem;font-weight:400;padding:0 16px 0 16px}.v-subheader--inset{margin-left:56px}.v-list.accent>.v-list-item,.v-list.error>.v-list-item,.v-list.info>.v-list-item,.v-list.primary>.v-list-item,.v-list.secondary>.v-list-item,.v-list.success>.v-list-item,.v-list.warning>.v-list-item{color:#fff}.theme--light.v-list{background:#fff;color:rgba(0,0,0,.87)}.theme--light.v-list .v-list--disabled{color:rgba(0,0,0,.38)}.theme--light.v-list .v-list-group--active:after,.theme--light.v-list .v-list-group--active:before{background:rgba(0,0,0,.12)}.theme--dark.v-list{background:#1e1e1e;color:#fff}.theme--dark.v-list .v-list--disabled{color:hsla(0,0%,100%,.5)}.theme--dark.v-list .v-list-group--active:after,.theme--dark.v-list .v-list-group--active:before{background:hsla(0,0%,100%,.12)}.v-sheet.v-list{border-radius:0}.v-sheet.v-list:not(.v-sheet--outlined){-webkit-box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12);box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.v-sheet.v-list.v-sheet--shaped{border-radius:0}.v-list{display:block;padding:8px 0;position:static;-webkit-transition:-webkit-box-shadow .28s cubic-bezier(.4,0,.2,1);transition:-webkit-box-shadow .28s cubic-bezier(.4,0,.2,1);transition:box-shadow .28s cubic-bezier(.4,0,.2,1);transition:box-shadow .28s cubic-bezier(.4,0,.2,1),-webkit-box-shadow .28s cubic-bezier(.4,0,.2,1)}.v-list--disabled{pointer-events:none}.v-list--flat .v-list-item:before{display:none}.v-list--dense .v-subheader{font-size:.75rem;height:40px;padding:0 8px}.v-list--nav .v-list-item:not(:last-child):not(:only-child),.v-list--rounded .v-list-item:not(:last-child):not(:only-child){margin-bottom:8px}.v-list--nav.v-list--dense .v-list-item:not(:last-child):not(:only-child),.v-list--nav .v-list-item--dense:not(:last-child):not(:only-child),.v-list--rounded.v-list--dense .v-list-item:not(:last-child):not(:only-child),.v-list--rounded .v-list-item--dense:not(:last-child):not(:only-child){margin-bottom:4px}.v-list--nav{padding-left:8px;padding-right:8px}.v-list--nav .v-list-item{padding:0 8px}.v-list--nav .v-list-item,.v-list--nav .v-list-item:before{border-radius:4px}.v-application--is-ltr .v-list.v-sheet--shaped .v-list-item,.v-application--is-ltr .v-list.v-sheet--shaped .v-list-item:before,.v-application--is-ltr .v-list.v-sheet--shaped .v-list-item>.v-ripple__container{border-bottom-right-radius:32px!important;border-top-right-radius:32px!important}.v-application--is-rtl .v-list.v-sheet--shaped .v-list-item,.v-application--is-rtl .v-list.v-sheet--shaped .v-list-item:before,.v-application--is-rtl .v-list.v-sheet--shaped .v-list-item>.v-ripple__container{border-bottom-left-radius:32px!important;border-top-left-radius:32px!important}.v-application--is-ltr .v-list.v-sheet--shaped.v-list--two-line .v-list-item,.v-application--is-ltr .v-list.v-sheet--shaped.v-list--two-line .v-list-item:before,.v-application--is-ltr .v-list.v-sheet--shaped.v-list--two-line .v-list-item>.v-ripple__container{border-bottom-right-radius:42.6666666667px!important;border-top-right-radius:42.6666666667px!important}.v-application--is-rtl .v-list.v-sheet--shaped.v-list--two-line .v-list-item,.v-application--is-rtl .v-list.v-sheet--shaped.v-list--two-line .v-list-item:before,.v-application--is-rtl .v-list.v-sheet--shaped.v-list--two-line .v-list-item>.v-ripple__container{border-bottom-left-radius:42.6666666667px!important;border-top-left-radius:42.6666666667px!important}.v-application--is-ltr .v-list.v-sheet--shaped.v-list--three-line .v-list-item,.v-application--is-ltr .v-list.v-sheet--shaped.v-list--three-line .v-list-item:before,.v-application--is-ltr .v-list.v-sheet--shaped.v-list--three-line .v-list-item>.v-ripple__container{border-bottom-right-radius:58.6666666667px!important;border-top-right-radius:58.6666666667px!important}.v-application--is-rtl .v-list.v-sheet--shaped.v-list--three-line .v-list-item,.v-application--is-rtl .v-list.v-sheet--shaped.v-list--three-line .v-list-item:before,.v-application--is-rtl .v-list.v-sheet--shaped.v-list--three-line .v-list-item>.v-ripple__container{border-bottom-left-radius:58.6666666667px!important;border-top-left-radius:58.6666666667px!important}.v-application--is-ltr .v-list.v-sheet--shaped{padding-right:8px}.v-application--is-rtl .v-list.v-sheet--shaped{padding-left:8px}.v-list--rounded{padding:8px}.v-list--rounded .v-list-item,.v-list--rounded .v-list-item:before,.v-list--rounded .v-list-item>.v-ripple__container{border-radius:32px!important}.v-list--rounded.v-list--two-line .v-list-item,.v-list--rounded.v-list--two-line .v-list-item:before,.v-list--rounded.v-list--two-line .v-list-item>.v-ripple__container{border-radius:42.6666666667px!important}.v-list--rounded.v-list--three-line .v-list-item,.v-list--rounded.v-list--three-line .v-list-item:before,.v-list--rounded.v-list--three-line .v-list-item>.v-ripple__container{border-radius:58.6666666667px!important}.v-list--subheader{padding-top:0}.v-list-group .v-list-group__header .v-list-item__icon.v-list-group__header__append-icon{-ms-flex-item-align:center;align-self:center;margin:0;min-width:48px;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.v-list-group--sub-group{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.v-list-group__header.v-list-item--active:not(:hover):not(:focus):before{opacity:0}.v-list-group__items{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.v-list-group__items .v-list-group__items,.v-list-group__items .v-list-item{overflow:hidden}.v-list-group--active>.v-list-group__header.v-list-group__header--sub-group>.v-list-group__header__prepend-icon .v-icon,.v-list-group--active>.v-list-group__header>.v-list-group__header__append-icon .v-icon{-webkit-transform:rotate(-180deg);transform:rotate(-180deg)}.v-list-group--active>.v-list-group__header .v-list-group__header__prepend-icon .v-icon,.v-list-group--active>.v-list-group__header .v-list-item,.v-list-group--active>.v-list-group__header .v-list-item__content{color:inherit}.v-application--is-ltr .v-list-group--sub-group .v-list-item__action:first-child,.v-application--is-ltr .v-list-group--sub-group .v-list-item__avatar:first-child,.v-application--is-ltr .v-list-group--sub-group .v-list-item__icon:first-child{margin-right:16px}.v-application--is-rtl .v-list-group--sub-group .v-list-item__action:first-child,.v-application--is-rtl .v-list-group--sub-group .v-list-item__avatar:first-child,.v-application--is-rtl .v-list-group--sub-group .v-list-item__icon:first-child{margin-left:16px}.v-application--is-ltr .v-list-group--sub-group .v-list-group__header{padding-left:32px}.v-application--is-rtl .v-list-group--sub-group .v-list-group__header{padding-right:32px}.v-application--is-ltr .v-list-group--sub-group .v-list-group__items .v-list-item{padding-left:40px}.v-application--is-rtl .v-list-group--sub-group .v-list-group__items .v-list-item{padding-right:40px}.v-list-group--sub-group.v-list-group--active .v-list-item__icon.v-list-group__header__prepend-icon .v-icon{-webkit-transform:rotate(-180deg);transform:rotate(-180deg)}.v-application--is-ltr .v-list-group--no-action>.v-list-group__items>.v-list-item{padding-left:72px}.v-application--is-rtl .v-list-group--no-action>.v-list-group__items>.v-list-item{padding-right:72px}.v-application--is-ltr .v-list-group--no-action.v-list-group--sub-group>.v-list-group__items>.v-list-item{padding-left:88px}.v-application--is-rtl .v-list-group--no-action.v-list-group--sub-group>.v-list-group__items>.v-list-item{padding-right:88px}.v-application--is-ltr .v-list--dense .v-list-group--sub-group .v-list-group__header{padding-left:24px}.v-application--is-rtl .v-list--dense .v-list-group--sub-group .v-list-group__header{padding-right:24px}.v-application--is-ltr .v-list--dense.v-list--nav .v-list-group--no-action>.v-list-group__items>.v-list-item{padding-left:64px}.v-application--is-rtl .v-list--dense.v-list--nav .v-list-group--no-action>.v-list-group__items>.v-list-item{padding-right:64px}.v-application--is-ltr .v-list--dense.v-list--nav .v-list-group--no-action.v-list-group--sub-group>.v-list-group__items>.v-list-item{padding-left:80px}.v-application--is-rtl .v-list--dense.v-list--nav .v-list-group--no-action.v-list-group--sub-group>.v-list-group__items>.v-list-item{padding-right:80px}.v-avatar{-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-radius:50%;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;line-height:normal;position:relative;text-align:center;vertical-align:middle;overflow:hidden}.v-avatar .v-icon,.v-avatar .v-image,.v-avatar .v-responsive__content,.v-avatar img,.v-avatar svg{border-radius:inherit;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;height:inherit;width:inherit}.v-list-item-group .v-list-item--active{color:inherit}.v-item-group{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;position:relative;max-width:100%;-webkit-transition:.3s cubic-bezier(.25,.8,.5,1);transition:.3s cubic-bezier(.25,.8,.5,1)}.v-chip:not(.v-chip--outlined).accent,.v-chip:not(.v-chip--outlined).error,.v-chip:not(.v-chip--outlined).info,.v-chip:not(.v-chip--outlined).primary,.v-chip:not(.v-chip--outlined).secondary,.v-chip:not(.v-chip--outlined).success,.v-chip:not(.v-chip--outlined).warning{color:#fff}.theme--light.v-chip{border-color:rgba(0,0,0,.12);color:rgba(0,0,0,.87)}.theme--light.v-chip:not(.v-chip--active){background:#e0e0e0}.theme--light.v-chip:hover:before{opacity:.04}.theme--light.v-chip--active:before,.theme--light.v-chip--active:hover:before,.theme--light.v-chip:focus:before{opacity:.12}.theme--light.v-chip--active:focus:before{opacity:.16}.theme--dark.v-chip{border-color:hsla(0,0%,100%,.12);color:#fff}.theme--dark.v-chip:not(.v-chip--active){background:#555}.theme--dark.v-chip:hover:before{opacity:.08}.theme--dark.v-chip--active:before,.theme--dark.v-chip--active:hover:before,.theme--dark.v-chip:focus:before{opacity:.24}.theme--dark.v-chip--active:focus:before{opacity:.32}.v-chip{-webkit-box-align:center;-ms-flex-align:center;align-items:center;cursor:default;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;line-height:20px;max-width:100%;outline:none;overflow:hidden;padding:0 12px;position:relative;text-decoration:none;-webkit-transition-duration:.28s;transition-duration:.28s;-webkit-transition-property:opacity,-webkit-box-shadow;transition-property:opacity,-webkit-box-shadow;transition-property:box-shadow,opacity;transition-property:box-shadow,opacity,-webkit-box-shadow;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);vertical-align:middle;white-space:nowrap}.v-chip:before{background-color:currentColor;bottom:0;border-radius:inherit;content:"";left:0;opacity:0;position:absolute;pointer-events:none;right:0;top:0}.v-chip .v-avatar{height:24px!important;min-width:24px!important;width:24px!important}.v-chip .v-icon{font-size:24px}.v-application--is-ltr .v-chip .v-avatar--left,.v-application--is-ltr .v-chip .v-icon--left{margin-left:-6px;margin-right:6px}.v-application--is-ltr .v-chip .v-avatar--right,.v-application--is-ltr .v-chip .v-icon--right,.v-application--is-rtl .v-chip .v-avatar--left,.v-application--is-rtl .v-chip .v-icon--left{margin-left:6px;margin-right:-6px}.v-application--is-rtl .v-chip .v-avatar--right,.v-application--is-rtl .v-chip .v-icon--right{margin-left:-6px;margin-right:6px}.v-chip:not(.v-chip--no-color) .v-icon{color:inherit}.v-chip .v-chip__close.v-icon{font-size:18px;max-height:18px;max-width:18px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.v-application--is-ltr .v-chip .v-chip__close.v-icon.v-icon--right{margin-right:-4px}.v-application--is-rtl .v-chip .v-chip__close.v-icon.v-icon--right{margin-left:-4px}.v-chip .v-chip__close.v-icon:active,.v-chip .v-chip__close.v-icon:focus,.v-chip .v-chip__close.v-icon:hover{opacity:.72}.v-chip .v-chip__content{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;height:100%;max-width:100%}.v-chip--active .v-icon{color:inherit}.v-chip--link:before{-webkit-transition:opacity .3s cubic-bezier(.25,.8,.5,1);transition:opacity .3s cubic-bezier(.25,.8,.5,1)}.v-chip--link:focus:before{opacity:.32}.v-chip--clickable{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.v-chip--clickable:active{-webkit-box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12);box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.v-chip--disabled{opacity:.4;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.v-chip__filter{max-width:24px}.v-chip__filter.v-icon{color:inherit}.v-chip__filter.expand-x-transition-enter,.v-chip__filter.expand-x-transition-leave-active{margin:0}.v-chip--pill .v-chip__filter{margin-right:0 16px 0 0}.v-chip--pill .v-avatar{height:32px!important;width:32px!important}.v-application--is-ltr .v-chip--pill .v-avatar--left{margin-left:-12px}.v-application--is-ltr .v-chip--pill .v-avatar--right,.v-application--is-rtl .v-chip--pill .v-avatar--left{margin-right:-12px}.v-application--is-rtl .v-chip--pill .v-avatar--right{margin-left:-12px}.v-chip--label{border-radius:4px!important}.v-chip.v-chip--outlined{border-width:thin;border-style:solid}.v-chip.v-chip--outlined.v-chip--active:before{opacity:.08}.v-chip.v-chip--outlined .v-icon{color:inherit}.v-chip.v-chip--outlined.v-chip.v-chip{background-color:transparent!important}.v-chip.v-chip--selected{background:transparent}.v-chip.v-chip--selected:after{opacity:.28}.v-chip.v-size--x-small{border-radius:8px;font-size:10px;height:16px}.v-chip.v-size--x-small .v-icon{font-size:10px;height:10px;width:10px}.v-chip.v-size--small{border-radius:12px;font-size:12px;height:24px}.v-chip.v-size--small .v-icon{font-size:12px;height:12px;width:12px}.v-chip.v-size--default{border-radius:16px;font-size:14px;height:32px}.v-chip.v-size--default .v-icon{font-size:14px;height:14px;width:14px}.v-chip.v-size--large{border-radius:27px;font-size:16px;height:54px}.v-chip.v-size--large .v-icon{font-size:16px;height:16px;width:16px}.v-chip.v-size--x-large{border-radius:33px;font-size:18px;height:66px}.v-chip.v-size--x-large .v-icon{font-size:18px;height:18px;width:18px}.v-menu{display:none}.v-menu--attached{display:inline}.v-menu__content{position:absolute;display:inline-block;max-width:80%;overflow-y:auto;overflow-x:hidden;contain:content;-webkit-box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12);box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12);border-radius:4px}.v-menu__content--active{pointer-events:none}.v-menu__content--auto .v-list-item{-webkit-transition-property:opacity,-webkit-transform;transition-property:opacity,-webkit-transform;transition-property:transform,opacity;transition-property:transform,opacity,-webkit-transform;-webkit-transition-duration:.3s;transition-duration:.3s;-webkit-transition-timing-function:cubic-bezier(.25,.8,.25,1);transition-timing-function:cubic-bezier(.25,.8,.25,1)}.v-menu__content--fixed{position:fixed}.v-menu__content>.card{contain:content;-webkit-backface-visibility:hidden;backface-visibility:hidden}.v-menu>.v-menu__content{max-width:none}.v-menu-transition-enter .v-list-item{min-width:0;pointer-events:none}.v-menu-transition-enter-to .v-list-item{-webkit-transition-delay:.1s;transition-delay:.1s}.v-menu-transition-leave-active,.v-menu-transition-leave-to{pointer-events:none}.v-menu-transition-enter,.v-menu-transition-leave-to{opacity:0}.v-menu-transition-enter-active,.v-menu-transition-leave-active{-webkit-transition:all .3s cubic-bezier(.25,.8,.25,1);transition:all .3s cubic-bezier(.25,.8,.25,1)}.v-menu-transition-enter.v-menu__content--auto{-webkit-transition:none!important;transition:none!important}.v-menu-transition-enter.v-menu__content--auto .v-list-item{opacity:0;-webkit-transform:translateY(-15px);transform:translateY(-15px)}.v-menu-transition-enter.v-menu__content--auto .v-list-item--active{opacity:1;-webkit-transform:none!important;transform:none!important;pointer-events:auto}.theme--light.v-file-input .v-file-input__text{color:rgba(0,0,0,.87)}.theme--light.v-file-input .v-file-input__text--placeholder{color:rgba(0,0,0,.6)}.theme--light.v-file-input.v-input--is-disabled .v-file-input__text,.theme--light.v-file-input.v-input--is-disabled .v-file-input__text .v-file-input__text--placeholder{color:rgba(0,0,0,.38)}.theme--dark.v-file-input .v-file-input__text{color:#fff}.theme--dark.v-file-input .v-file-input__text--placeholder{color:hsla(0,0%,100%,.7)}.theme--dark.v-file-input.v-input--is-disabled .v-file-input__text,.theme--dark.v-file-input.v-input--is-disabled .v-file-input__text .v-file-input__text--placeholder{color:hsla(0,0%,100%,.5)}.v-file-input input[type=file]{left:0;opacity:0;pointer-events:none;position:absolute;max-width:0;width:0}.v-file-input .v-file-input__text{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-item-align:stretch;align-self:stretch;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.v-file-input .v-file-input__text.v-file-input__text--chips{-ms-flex-wrap:wrap;flex-wrap:wrap}.v-file-input .v-file-input__text .v-chip{margin:4px}.v-file-input .v-text-field__slot{min-height:32px}.v-file-input.v-input--dense .v-text-field__slot{min-height:26px}.v-file-input.v-text-field--filled:not(.v-text-field--single-line) .v-file-input__text{padding-top:22px}.v-file-input.v-text-field--outlined .v-text-field__slot{padding:6px 0}.v-file-input.v-text-field--outlined.v-input--dense .v-text-field__slot{padding:3px 0}.v-textarea textarea{-ms-flex-item-align:stretch;align-self:stretch;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;line-height:1.75rem;max-width:100%;min-height:32px;outline:none;padding:0;width:100%}.v-textarea .v-text-field__prefix,.v-textarea .v-text-field__suffix{padding-top:2px;-ms-flex-item-align:start;align-self:start}.v-textarea.v-text-field--box .v-text-field__prefix,.v-textarea.v-text-field--box textarea,.v-textarea.v-text-field--enclosed .v-text-field__prefix,.v-textarea.v-text-field--enclosed textarea{margin-top:24px}.v-textarea.v-text-field--box.v-text-field--outlined:not(.v-input--dense) .v-text-field__prefix,.v-textarea.v-text-field--box.v-text-field--outlined:not(.v-input--dense) .v-text-field__suffix,.v-textarea.v-text-field--box.v-text-field--outlined:not(.v-input--dense) textarea,.v-textarea.v-text-field--box.v-text-field--single-line:not(.v-input--dense) .v-text-field__prefix,.v-textarea.v-text-field--box.v-text-field--single-line:not(.v-input--dense) .v-text-field__suffix,.v-textarea.v-text-field--box.v-text-field--single-line:not(.v-input--dense) textarea,.v-textarea.v-text-field--enclosed.v-text-field--outlined:not(.v-input--dense) .v-text-field__prefix,.v-textarea.v-text-field--enclosed.v-text-field--outlined:not(.v-input--dense) .v-text-field__suffix,.v-textarea.v-text-field--enclosed.v-text-field--outlined:not(.v-input--dense) textarea,.v-textarea.v-text-field--enclosed.v-text-field--single-line:not(.v-input--dense) .v-text-field__prefix,.v-textarea.v-text-field--enclosed.v-text-field--single-line:not(.v-input--dense) .v-text-field__suffix,.v-textarea.v-text-field--enclosed.v-text-field--single-line:not(.v-input--dense) textarea{margin-top:10px}.v-textarea.v-text-field--box.v-text-field--outlined:not(.v-input--dense) .v-label,.v-textarea.v-text-field--box.v-text-field--single-line:not(.v-input--dense) .v-label,.v-textarea.v-text-field--enclosed.v-text-field--outlined:not(.v-input--dense) .v-label,.v-textarea.v-text-field--enclosed.v-text-field--single-line:not(.v-input--dense) .v-label{top:18px}.v-textarea.v-text-field--box.v-text-field--outlined.v-input--dense .v-text-field__prefix,.v-textarea.v-text-field--box.v-text-field--outlined.v-input--dense .v-text-field__suffix,.v-textarea.v-text-field--box.v-text-field--outlined.v-input--dense textarea,.v-textarea.v-text-field--box.v-text-field--single-line.v-input--dense .v-text-field__prefix,.v-textarea.v-text-field--box.v-text-field--single-line.v-input--dense .v-text-field__suffix,.v-textarea.v-text-field--box.v-text-field--single-line.v-input--dense textarea,.v-textarea.v-text-field--enclosed.v-text-field--outlined.v-input--dense .v-text-field__prefix,.v-textarea.v-text-field--enclosed.v-text-field--outlined.v-input--dense .v-text-field__suffix,.v-textarea.v-text-field--enclosed.v-text-field--outlined.v-input--dense textarea,.v-textarea.v-text-field--enclosed.v-text-field--single-line.v-input--dense .v-text-field__prefix,.v-textarea.v-text-field--enclosed.v-text-field--single-line.v-input--dense .v-text-field__suffix,.v-textarea.v-text-field--enclosed.v-text-field--single-line.v-input--dense textarea{margin-top:6px}.v-textarea.v-text-field--box.v-text-field--outlined.v-input--dense .v-input__append-inner,.v-textarea.v-text-field--box.v-text-field--outlined.v-input--dense .v-input__append-outer,.v-textarea.v-text-field--box.v-text-field--outlined.v-input--dense .v-input__prepend-inner,.v-textarea.v-text-field--box.v-text-field--outlined.v-input--dense .v-input__prepend-outer,.v-textarea.v-text-field--box.v-text-field--single-line.v-input--dense .v-input__append-inner,.v-textarea.v-text-field--box.v-text-field--single-line.v-input--dense .v-input__append-outer,.v-textarea.v-text-field--box.v-text-field--single-line.v-input--dense .v-input__prepend-inner,.v-textarea.v-text-field--box.v-text-field--single-line.v-input--dense .v-input__prepend-outer,.v-textarea.v-text-field--enclosed.v-text-field--outlined.v-input--dense .v-input__append-inner,.v-textarea.v-text-field--enclosed.v-text-field--outlined.v-input--dense .v-input__append-outer,.v-textarea.v-text-field--enclosed.v-text-field--outlined.v-input--dense .v-input__prepend-inner,.v-textarea.v-text-field--enclosed.v-text-field--outlined.v-input--dense .v-input__prepend-outer,.v-textarea.v-text-field--enclosed.v-text-field--single-line.v-input--dense .v-input__append-inner,.v-textarea.v-text-field--enclosed.v-text-field--single-line.v-input--dense .v-input__append-outer,.v-textarea.v-text-field--enclosed.v-text-field--single-line.v-input--dense .v-input__prepend-inner,.v-textarea.v-text-field--enclosed.v-text-field--single-line.v-input--dense .v-input__prepend-outer{-ms-flex-item-align:start;align-self:flex-start;margin-top:8px}.v-textarea.v-text-field--solo{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.v-textarea.v-text-field--solo .v-input__append-inner,.v-textarea.v-text-field--solo .v-input__append-outer,.v-textarea.v-text-field--solo .v-input__prepend-inner,.v-textarea.v-text-field--solo .v-input__prepend-outer{-ms-flex-item-align:start;align-self:flex-start;margin-top:12px}.v-application--is-ltr .v-textarea.v-text-field--solo .v-input__append-inner{padding-left:12px}.v-application--is-rtl .v-textarea.v-text-field--solo .v-input__append-inner{padding-right:12px}.v-textarea--auto-grow textarea{overflow:hidden}.v-textarea--no-resize textarea{resize:none}.v-textarea.v-text-field--enclosed .v-text-field__slot{-ms-flex-item-align:stretch;align-self:stretch}.v-application--is-ltr .v-textarea.v-text-field--enclosed .v-text-field__slot{margin-right:-12px}.v-application--is-rtl .v-textarea.v-text-field--enclosed .v-text-field__slot{margin-left:-12px}.v-application--is-ltr .v-textarea.v-text-field--enclosed .v-text-field__slot textarea{padding-right:12px}.v-application--is-rtl .v-textarea.v-text-field--enclosed .v-text-field__slot textarea{padding-left:12px}.theme--light.v-image{color:rgba(0,0,0,.87)}.theme--dark.v-image{color:#fff}.v-image{z-index:0}.v-image__image,.v-image__placeholder{z-index:-1;position:absolute;top:0;left:0;width:100%;height:100%}.v-image__image{background-repeat:no-repeat}.v-image__image--preload{-webkit-filter:blur(2px);filter:blur(2px)}.v-image__image--contain{background-size:contain}.v-image__image--cover{background-size:cover}.v-responsive{position:relative;overflow:hidden;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;max-width:100%;display:-webkit-box;display:-ms-flexbox;display:flex}.v-responsive__content{-webkit-box-flex:1;-ms-flex:1 0 0px;flex:1 0 0px;max-width:100%}.v-application--is-ltr .v-responsive__sizer~.v-responsive__content{margin-left:-100%}.v-application--is-rtl .v-responsive__sizer~.v-responsive__content{margin-right:-100%}.v-responsive__sizer{-webkit-transition:padding-bottom .2s cubic-bezier(.25,.8,.5,1);transition:padding-bottom .2s cubic-bezier(.25,.8,.5,1);-webkit-box-flex:1;-ms-flex:1 0 0px;flex:1 0 0px}.theme--light.v-toolbar.v-sheet{background-color:#fff}.theme--dark.v-toolbar.v-sheet{background-color:#272727}.v-sheet.v-toolbar{border-radius:0}.v-sheet.v-toolbar:not(.v-sheet--outlined){-webkit-box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12);box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.v-sheet.v-toolbar.v-sheet--shaped{border-radius:24px 0}.v-toolbar{contain:layout;display:block;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;max-width:100%;-webkit-transition:transform .2s cubic-bezier(.4,0,.2,1),background-color .2s cubic-bezier(.4,0,.2,1),left .2s cubic-bezier(.4,0,.2,1),right .2s cubic-bezier(.4,0,.2,1),max-width .25s cubic-bezier(.4,0,.2,1),width .25s cubic-bezier(.4,0,.2,1),-webkit-box-shadow .28s cubic-bezier(.4,0,.2,1);transition:transform .2s cubic-bezier(.4,0,.2,1),background-color .2s cubic-bezier(.4,0,.2,1),left .2s cubic-bezier(.4,0,.2,1),right .2s cubic-bezier(.4,0,.2,1),max-width .25s cubic-bezier(.4,0,.2,1),width .25s cubic-bezier(.4,0,.2,1),-webkit-box-shadow .28s cubic-bezier(.4,0,.2,1);transition:transform .2s cubic-bezier(.4,0,.2,1),background-color .2s cubic-bezier(.4,0,.2,1),left .2s cubic-bezier(.4,0,.2,1),right .2s cubic-bezier(.4,0,.2,1),box-shadow .28s cubic-bezier(.4,0,.2,1),max-width .25s cubic-bezier(.4,0,.2,1),width .25s cubic-bezier(.4,0,.2,1);transition:transform .2s cubic-bezier(.4,0,.2,1),background-color .2s cubic-bezier(.4,0,.2,1),left .2s cubic-bezier(.4,0,.2,1),right .2s cubic-bezier(.4,0,.2,1),box-shadow .28s cubic-bezier(.4,0,.2,1),max-width .25s cubic-bezier(.4,0,.2,1),width .25s cubic-bezier(.4,0,.2,1),-webkit-box-shadow .28s cubic-bezier(.4,0,.2,1);position:relative;-webkit-box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12);box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.v-toolbar .v-input{padding-top:0;margin-top:0}.v-toolbar__content,.v-toolbar__extension{padding:4px 16px}.v-toolbar__content .v-btn.v-btn--icon.v-size--default,.v-toolbar__extension .v-btn.v-btn--icon.v-size--default{height:48px;width:48px}.v-application--is-ltr .v-toolbar__content>.v-btn.v-btn--icon:first-child,.v-application--is-ltr .v-toolbar__extension>.v-btn.v-btn--icon:first-child{margin-left:-12px}.v-application--is-rtl .v-toolbar__content>.v-btn.v-btn--icon:first-child,.v-application--is-rtl .v-toolbar__extension>.v-btn.v-btn--icon:first-child{margin-right:-12px}.v-application--is-ltr .v-toolbar__content>.v-btn.v-btn--icon:first-child+.v-toolbar__title,.v-application--is-ltr .v-toolbar__extension>.v-btn.v-btn--icon:first-child+.v-toolbar__title{padding-left:20px}.v-application--is-rtl .v-toolbar__content>.v-btn.v-btn--icon:first-child+.v-toolbar__title,.v-application--is-rtl .v-toolbar__extension>.v-btn.v-btn--icon:first-child+.v-toolbar__title{padding-right:20px}.v-application--is-ltr .v-toolbar__content>.v-btn.v-btn--icon:last-child,.v-application--is-ltr .v-toolbar__extension>.v-btn.v-btn--icon:last-child{margin-right:-12px}.v-application--is-rtl .v-toolbar__content>.v-btn.v-btn--icon:last-child,.v-application--is-rtl .v-toolbar__extension>.v-btn.v-btn--icon:last-child{margin-left:-12px}.v-toolbar__content>.v-tabs,.v-toolbar__extension>.v-tabs{height:inherit;margin-top:-4px;margin-bottom:-4px}.v-toolbar__content>.v-tabs>.v-slide-group.v-tabs-bar,.v-toolbar__extension>.v-tabs>.v-slide-group.v-tabs-bar{background-color:inherit;height:inherit}.v-toolbar__content>.v-tabs:first-child,.v-toolbar__extension>.v-tabs:first-child{margin-left:-16px}.v-toolbar__content>.v-tabs:last-child,.v-toolbar__extension>.v-tabs:last-child{margin-right:-16px}.v-toolbar__content,.v-toolbar__extension{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;position:relative;z-index:0}.v-toolbar__image{position:absolute;top:0;bottom:0;width:100%;z-index:0;contain:strict}.v-toolbar__image,.v-toolbar__image .v-image{border-radius:inherit}.v-toolbar__items{display:-webkit-box;display:-ms-flexbox;display:flex;height:inherit}.v-toolbar__items>.v-btn{border-radius:0;height:100%!important;max-height:none}.v-toolbar__title{font-size:1.25rem;line-height:1.5;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.v-toolbar.v-toolbar--absolute{position:absolute;top:0;z-index:1}.v-toolbar.v-toolbar--bottom{top:auto;bottom:0}.v-toolbar.v-toolbar--collapse .v-toolbar__title{white-space:nowrap}.v-toolbar.v-toolbar--collapsed{max-width:112px;overflow:hidden}.v-application--is-ltr .v-toolbar.v-toolbar--collapsed{border-bottom-right-radius:24px}.v-application--is-rtl .v-toolbar.v-toolbar--collapsed{border-bottom-left-radius:24px}.v-toolbar.v-toolbar--collapsed .v-toolbar__extension,.v-toolbar.v-toolbar--collapsed .v-toolbar__title{display:none}.v-toolbar--dense .v-toolbar__content,.v-toolbar--dense .v-toolbar__extension{padding-top:0;padding-bottom:0}.v-toolbar--flat{-webkit-box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)!important;box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)!important}.v-toolbar--floating{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex}.v-toolbar--prominent .v-toolbar__content{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.v-toolbar--prominent .v-toolbar__title{font-size:1.5rem;padding-top:6px}.v-toolbar--prominent:not(.v-toolbar--bottom) .v-toolbar__title{-ms-flex-item-align:end;align-self:flex-end;padding-bottom:6px;padding-top:0}.theme--light.v-app-bar.v-toolbar.v-sheet{background-color:#f5f5f5}.theme--dark.v-app-bar.v-toolbar.v-sheet{background-color:#272727}.v-sheet.v-app-bar.v-toolbar{border-radius:0}.v-sheet.v-app-bar.v-toolbar:not(.v-sheet--outlined){-webkit-box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12);box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.v-sheet.v-app-bar.v-toolbar.v-sheet--shaped{border-radius:24px 0}.v-app-bar:not([data-booted=true]){-webkit-transition:none!important;transition:none!important}.v-app-bar.v-app-bar--fixed{position:fixed;top:0;z-index:5}.v-app-bar.v-app-bar.v-app-bar--hide-shadow{-webkit-box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)!important;box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)!important}.v-app-bar--fade-img-on-scroll .v-toolbar__image .v-image__image{-webkit-transition:opacity .4s cubic-bezier(.4,0,.2,1);transition:opacity .4s cubic-bezier(.4,0,.2,1)}.v-app-bar.v-toolbar--prominent.v-app-bar--shrink-on-scroll .v-toolbar__image{will-change:opacity}.v-app-bar.v-toolbar--prominent.v-app-bar--shrink-on-scroll.v-app-bar--collapse-on-scroll .v-toolbar__extension{display:none}.v-app-bar.v-toolbar--prominent.v-app-bar--shrink-on-scroll.v-app-bar--is-scrolled .v-toolbar__title{padding-top:9px}.v-app-bar.v-toolbar--prominent.v-app-bar--shrink-on-scroll.v-app-bar--is-scrolled:not(.v-app-bar--bottom) .v-toolbar__title{padding-bottom:9px}.v-app-bar.v-app-bar--shrink-on-scroll .v-toolbar__title{font-size:inherit}.v-app-bar-title__content,.v-app-bar-title__placeholder{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.v-app-bar-title__content{position:absolute}.theme--light.v-stepper{background:#fff}.theme--light.v-stepper .v-stepper__step:not(.v-stepper__step--active):not(.v-stepper__step--complete):not(.v-stepper__step--error) .v-stepper__step__step{background:rgba(0,0,0,.38)}.theme--light.v-stepper .v-stepper__step__step,.theme--light.v-stepper .v-stepper__step__step .v-icon{color:#fff}.theme--light.v-stepper .v-stepper__header .v-divider{border-color:rgba(0,0,0,.12)}.theme--light.v-stepper .v-stepper__step--active .v-stepper__label{text-shadow:0 0 0 #000}.theme--light.v-stepper .v-stepper__step--editable:hover{background:rgba(0,0,0,.06)}.theme--light.v-stepper .v-stepper__step--editable:hover .v-stepper__label{text-shadow:0 0 0 #000}.theme--light.v-stepper .v-stepper__step--complete .v-stepper__label{color:rgba(0,0,0,.87)}.theme--light.v-stepper .v-stepper__step--inactive.v-stepper__step--editable:not(.v-stepper__step--error):hover .v-stepper__step__step{background:rgba(0,0,0,.54)}.theme--light.v-stepper .v-stepper__label{color:rgba(0,0,0,.38)}.theme--light.v-stepper--non-linear .v-stepper__step:not(.v-stepper__step--complete):not(.v-stepper__step--error) .v-stepper__label,.theme--light.v-stepper .v-stepper__label small{color:rgba(0,0,0,.6)}.v-application--is-ltr .theme--light.v-stepper--vertical .v-stepper__content:not(:last-child){border-left:1px solid rgba(0,0,0,.12)}.v-application--is-rtl .theme--light.v-stepper--vertical .v-stepper__content:not(:last-child){border-right:1px solid rgba(0,0,0,.12)}.theme--dark.v-stepper{background:#303030}.theme--dark.v-stepper .v-stepper__step:not(.v-stepper__step--active):not(.v-stepper__step--complete):not(.v-stepper__step--error) .v-stepper__step__step{background:hsla(0,0%,100%,.5)}.theme--dark.v-stepper .v-stepper__step__step,.theme--dark.v-stepper .v-stepper__step__step .v-icon{color:#fff}.theme--dark.v-stepper .v-stepper__header .v-divider{border-color:hsla(0,0%,100%,.12)}.theme--dark.v-stepper .v-stepper__step--active .v-stepper__label{text-shadow:0 0 0 #fff}.theme--dark.v-stepper .v-stepper__step--editable:hover{background:hsla(0,0%,100%,.06)}.theme--dark.v-stepper .v-stepper__step--editable:hover .v-stepper__label{text-shadow:0 0 0 #fff}.theme--dark.v-stepper .v-stepper__step--complete .v-stepper__label{color:hsla(0,0%,100%,.87)}.theme--dark.v-stepper .v-stepper__step--inactive.v-stepper__step--editable:not(.v-stepper__step--error):hover .v-stepper__step__step{background:hsla(0,0%,100%,.75)}.theme--dark.v-stepper .v-stepper__label{color:hsla(0,0%,100%,.5)}.theme--dark.v-stepper--non-linear .v-stepper__step:not(.v-stepper__step--complete):not(.v-stepper__step--error) .v-stepper__label,.theme--dark.v-stepper .v-stepper__label small{color:hsla(0,0%,100%,.7)}.v-application--is-ltr .theme--dark.v-stepper--vertical .v-stepper__content:not(:last-child){border-left:1px solid hsla(0,0%,100%,.12)}.v-application--is-rtl .theme--dark.v-stepper--vertical .v-stepper__content:not(:last-child){border-right:1px solid hsla(0,0%,100%,.12)}.v-sheet.v-stepper{border-radius:4px}.v-sheet.v-stepper:not(.v-sheet--outlined){-webkit-box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12);box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.v-sheet.v-stepper.v-sheet--shaped{border-radius:24px 4px}.v-stepper{border-radius:4px;overflow:hidden;position:relative}.v-stepper__header{height:72px;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12);box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.v-stepper__header .v-divider{-ms-flex-item-align:center;align-self:center;margin:0 -16px}.v-stepper__items{position:relative;overflow:hidden}.v-stepper__step__step{-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-radius:50%;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;font-size:.75rem;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;height:24px;min-width:24px;width:24px;-webkit-transition:.3s cubic-bezier(.25,.8,.25,1);transition:.3s cubic-bezier(.25,.8,.25,1)}.v-application--is-ltr .v-stepper__step__step{margin-right:8px}.v-application--is-rtl .v-stepper__step__step{margin-left:8px}.v-stepper__step__step .v-icon.v-icon{font-size:1.25rem}.v-stepper__step__step .v-icon.v-icon.v-icon--svg{height:1.25rem;width:1.25rem}.v-stepper__step{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;padding:24px;position:relative}.v-stepper__step--active .v-stepper__label{-webkit-transition:.3s cubic-bezier(.4,0,.6,1);transition:.3s cubic-bezier(.4,0,.6,1)}.v-stepper__step--editable{cursor:pointer}.v-stepper__step.v-stepper__step--error .v-stepper__step__step{background:transparent;color:inherit}.v-stepper__step.v-stepper__step--error .v-stepper__step__step .v-icon{font-size:1.5rem;color:inherit}.v-stepper__step.v-stepper__step--error .v-stepper__label{color:inherit;text-shadow:none;font-weight:500}.v-stepper__step.v-stepper__step--error .v-stepper__label small{color:inherit}.v-stepper__label{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;line-height:1}.v-application--is-ltr .v-stepper__label{text-align:left}.v-application--is-rtl .v-stepper__label{text-align:right}.v-stepper__label small{font-size:.75rem;font-weight:300;text-shadow:none}.v-stepper__wrapper{overflow:hidden;-webkit-transition:none;transition:none}.v-stepper__content{top:0;padding:24px 24px 16px 24px;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;width:100%}.v-stepper__content>.v-btn{margin:24px 8px 8px 0}.v-stepper--flat{-webkit-box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)!important;box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)!important}.v-stepper--is-booted .v-stepper__content,.v-stepper--is-booted .v-stepper__wrapper{-webkit-transition:.3s cubic-bezier(.25,.8,.5,1);transition:.3s cubic-bezier(.25,.8,.5,1)}.v-stepper--vertical{padding-bottom:36px}.v-stepper--vertical .v-stepper__content{padding:16px 60px 16px 23px;width:auto}.v-application--is-ltr .v-stepper--vertical .v-stepper__content{margin:-8px -36px -16px 36px}.v-application--is-rtl .v-stepper--vertical .v-stepper__content{margin:-8px 36px -16px -36px}.v-stepper--vertical .v-stepper__step{padding:24px 24px 16px}.v-application--is-ltr .v-stepper--vertical .v-stepper__step__step{margin-right:12px}.v-application--is-rtl .v-stepper--vertical .v-stepper__step__step{margin-left:12px}.v-stepper--alt-labels .v-stepper__header{height:auto}.v-stepper--alt-labels .v-stepper__header .v-divider{margin:35px -67px 0;-ms-flex-item-align:start;align-self:flex-start}.v-stepper--alt-labels .v-stepper__step{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-preferred-size:175px;flex-basis:175px}.v-stepper--alt-labels .v-stepper__step small{-ms-flex-item-align:center;align-self:center}.v-stepper--alt-labels .v-stepper__step__step{margin-bottom:11px;margin-left:0;margin-right:0}@media only screen and (max-width:959px){.v-stepper:not(.v-stepper--vertical) .v-stepper__label{display:none}.v-stepper:not(.v-stepper--vertical) .v-stepper__step__step{margin-left:0;margin-right:0}}.theme--light.v-treeview{color:rgba(0,0,0,.87)}.theme--light.v-treeview--hoverable .v-treeview-node__root:hover:before,.theme--light.v-treeview .v-treeview-node--click>.v-treeview-node__root:hover:before{opacity:.04}.theme--light.v-treeview--hoverable .v-treeview-node__root--active:before,.theme--light.v-treeview--hoverable .v-treeview-node__root--active:hover:before,.theme--light.v-treeview--hoverable .v-treeview-node__root:focus:before,.theme--light.v-treeview .v-treeview-node--click>.v-treeview-node__root--active:before,.theme--light.v-treeview .v-treeview-node--click>.v-treeview-node__root--active:hover:before,.theme--light.v-treeview .v-treeview-node--click>.v-treeview-node__root:focus:before{opacity:.12}.theme--light.v-treeview--hoverable .v-treeview-node__root--active:focus:before,.theme--light.v-treeview .v-treeview-node--click>.v-treeview-node__root--active:focus:before{opacity:.16}.theme--light.v-treeview .v-treeview-node__root.v-treeview-node--active:before,.theme--light.v-treeview .v-treeview-node__root.v-treeview-node--active:hover:before{opacity:.12}.theme--light.v-treeview .v-treeview-node__root.v-treeview-node--active:focus:before{opacity:.16}.theme--light.v-treeview .v-treeview-node--disabled>.v-treeview-node__root>.v-treeview-node__content{color:rgba(0,0,0,.38)!important}.theme--dark.v-treeview{color:#fff}.theme--dark.v-treeview--hoverable .v-treeview-node__root:hover:before,.theme--dark.v-treeview .v-treeview-node--click>.v-treeview-node__root:hover:before{opacity:.08}.theme--dark.v-treeview--hoverable .v-treeview-node__root--active:before,.theme--dark.v-treeview--hoverable .v-treeview-node__root--active:hover:before,.theme--dark.v-treeview--hoverable .v-treeview-node__root:focus:before,.theme--dark.v-treeview .v-treeview-node--click>.v-treeview-node__root--active:before,.theme--dark.v-treeview .v-treeview-node--click>.v-treeview-node__root--active:hover:before,.theme--dark.v-treeview .v-treeview-node--click>.v-treeview-node__root:focus:before{opacity:.24}.theme--dark.v-treeview--hoverable .v-treeview-node__root--active:focus:before,.theme--dark.v-treeview .v-treeview-node--click>.v-treeview-node__root--active:focus:before{opacity:.32}.theme--dark.v-treeview .v-treeview-node__root.v-treeview-node--active:before,.theme--dark.v-treeview .v-treeview-node__root.v-treeview-node--active:hover:before{opacity:.24}.theme--dark.v-treeview .v-treeview-node__root.v-treeview-node--active:focus:before{opacity:.32}.theme--dark.v-treeview .v-treeview-node--disabled>.v-treeview-node__root>.v-treeview-node__content{color:hsla(0,0%,100%,.5)!important}.v-treeview-node.v-treeview-node--shaped .v-treeview-node__root,.v-treeview-node.v-treeview-node--shaped .v-treeview-node__root:before{border-bottom-right-radius:24px!important;border-top-right-radius:24px!important}.v-treeview-node.v-treeview-node--shaped .v-treeview-node__root{margin-top:8px;margin-bottom:8px}.v-treeview-node.v-treeview-node--rounded .v-treeview-node__root,.v-treeview-node.v-treeview-node--rounded .v-treeview-node__root:before{border-radius:24px!important}.v-treeview-node.v-treeview-node--rounded .v-treeview-node__root{margin-top:8px;margin-bottom:8px}.v-treeview-node--click>.v-treeview-node__root,.v-treeview-node--click>.v-treeview-node__root>.v-treeview-node__content>*{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.v-treeview-node.v-treeview-node--active .v-treeview-node__content .v-icon{color:inherit}.v-treeview-node__root{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:48px;padding-left:8px;padding-right:8px;position:relative}.v-treeview-node__root:before{background-color:currentColor;bottom:0;content:"";left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:0;-webkit-transition:.3s cubic-bezier(.25,.8,.5,1);transition:.3s cubic-bezier(.25,.8,.5,1)}.v-treeview-node__root:after{content:"";font-size:0;min-height:inherit}.v-treeview-node__children{-webkit-transition:all .2s cubic-bezier(0,0,.2,1);transition:all .2s cubic-bezier(0,0,.2,1)}.v-treeview--dense .v-treeview-node__root{min-height:40px}.v-treeview--dense.v-treeview-node--shaped .v-treeview-node__root,.v-treeview--dense.v-treeview-node--shaped .v-treeview-node__root:before{border-bottom-right-radius:20px!important;border-top-right-radius:20px!important}.v-treeview--dense.v-treeview-node--shaped .v-treeview-node__root{margin-top:8px;margin-bottom:8px}.v-treeview--dense.v-treeview-node--rounded .v-treeview-node__root,.v-treeview--dense.v-treeview-node--rounded .v-treeview-node__root:before{border-radius:20px!important}.v-treeview--dense.v-treeview-node--rounded .v-treeview-node__root{margin-top:8px;margin-bottom:8px}.v-treeview-node__checkbox{width:24px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.v-application--is-ltr .v-treeview-node__checkbox{margin-left:6px}.v-application--is-rtl .v-treeview-node__checkbox{margin-right:6px}.v-treeview-node__toggle{width:24px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.v-treeview-node__toggle--loading{-webkit-animation:progress-circular-rotate 1s linear infinite;animation:progress-circular-rotate 1s linear infinite}.v-application--is-ltr .v-treeview-node__toggle{-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.v-application--is-ltr .v-treeview-node__toggle--open{-webkit-transform:none;transform:none}.v-application--is-rtl .v-treeview-node__toggle{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.v-application--is-rtl .v-treeview-node__toggle--open{-webkit-transform:none;transform:none}.v-treeview-node__prepend{min-width:24px}.v-application--is-ltr .v-treeview-node__prepend{margin-right:6px}.v-application--is-rtl .v-treeview-node__prepend{margin-left:6px}.v-treeview-node__append{min-width:24px}.v-application--is-ltr .v-treeview-node__append{margin-left:6px}.v-application--is-rtl .v-treeview-node__append{margin-right:6px}.v-treeview-node__level{width:24px}.v-treeview-node__label{-webkit-box-flex:1;-ms-flex:1;flex:1;font-size:inherit;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.v-treeview-node__content{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:0%;flex-basis:0%;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;min-width:0}.v-treeview-node__content .v-btn{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important;-ms-flex-negative:1!important;flex-shrink:1!important}.v-application--is-ltr .v-treeview-node__content{margin-left:6px}.v-application--is-rtl .v-treeview-node__content{margin-right:6px}.theme--light.v-data-table tbody tr.v-data-table__selected{background:#f5f5f5}.theme--light.v-data-table .v-row-group__header,.theme--light.v-data-table .v-row-group__summary{background:#eee}.theme--light.v-data-table .v-data-footer{border-top:thin solid rgba(0,0,0,.12)}.theme--light.v-data-table .v-data-table__empty-wrapper{color:rgba(0,0,0,.38)}.theme--dark.v-data-table tbody tr.v-data-table__selected{background:#505050}.theme--dark.v-data-table .v-row-group__header,.theme--dark.v-data-table .v-row-group__summary{background:#616161}.theme--dark.v-data-table .v-data-footer{border-top:thin solid hsla(0,0%,100%,.12)}.theme--dark.v-data-table .v-data-table__empty-wrapper{color:hsla(0,0%,100%,.5)}.v-data-table{border-radius:4px}.v-data-table--mobile>.v-data-table__wrapper tbody{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.v-data-table>.v-data-table__wrapper tbody tr.v-data-table__expanded{border-bottom:0}.v-data-table>.v-data-table__wrapper tbody tr.v-data-table__expanded__content{-webkit-box-shadow:inset 0 4px 8px -5px rgba(50,50,50,.75),inset 0 -4px 8px -5px rgba(50,50,50,.75);box-shadow:inset 0 4px 8px -5px rgba(50,50,50,.75),inset 0 -4px 8px -5px rgba(50,50,50,.75)}.v-data-table>.v-data-table__wrapper tbody tr:first-child:hover td:first-child{border-top-left-radius:4px}.v-data-table>.v-data-table__wrapper tbody tr:first-child:hover td:last-child{border-top-right-radius:4px}.v-data-table>.v-data-table__wrapper tbody tr:last-child:hover td:first-child{border-bottom-left-radius:4px}.v-data-table>.v-data-table__wrapper tbody tr:last-child:hover td:last-child{border-bottom-right-radius:4px}.v-data-table>.v-data-table__wrapper .v-data-table__mobile-table-row{display:initial}.v-data-table>.v-data-table__wrapper .v-data-table__mobile-row{height:auto;min-height:48px}.v-data-table__empty-wrapper{text-align:center}.v-data-table__mobile-row{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.v-data-table__mobile-row__header{font-weight:600}.v-application--is-ltr .v-data-table__mobile-row__header{padding-right:16px}.v-application--is-rtl .v-data-table__mobile-row__header{padding-left:16px}.v-application--is-ltr .v-data-table__mobile-row__cell{text-align:right}.v-application--is-rtl .v-data-table__mobile-row__cell{text-align:left}.v-row-group__header td,.v-row-group__summary td{height:35px}.v-data-table__expand-icon{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer}.v-data-table__expand-icon--active{-webkit-transform:rotate(-180deg);transform:rotate(-180deg)}.v-data-footer{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;font-size:.75rem;padding:0 8px}.v-data-footer .v-btn{color:inherit}.v-application--is-ltr .v-data-footer__icons-before .v-btn:last-child{margin-right:7px}.v-application--is-ltr .v-data-footer__icons-after .v-btn:first-child,.v-application--is-rtl .v-data-footer__icons-before .v-btn:last-child{margin-left:7px}.v-application--is-rtl .v-data-footer__icons-after .v-btn:first-child{margin-right:7px}.v-data-footer__pagination{display:block;text-align:center}.v-application--is-ltr .v-data-footer__pagination{margin:0 32px 0 24px}.v-application--is-rtl .v-data-footer__pagination{margin:0 24px 0 32px}.v-data-footer__select{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-flex:0;-ms-flex:0 0 0px;flex:0 0 0;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;white-space:nowrap}.v-application--is-ltr .v-data-footer__select{margin-left:auto;margin-right:14px}.v-application--is-rtl .v-data-footer__select{margin-left:14px;margin-right:auto}.v-data-footer__select .v-select{-webkit-box-flex:0;-ms-flex:0 1 0px;flex:0 1 0;padding:0;position:static}.v-application--is-ltr .v-data-footer__select .v-select{margin:13px 0 13px 34px}.v-application--is-rtl .v-data-footer__select .v-select{margin:13px 34px 13px 0}.v-data-footer__select .v-select__selections{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.v-data-footer__select .v-select__selections .v-select__selection--comma{font-size:.75rem}.theme--light.v-data-table .v-data-table-header th.sortable .v-data-table-header__icon{color:rgba(0,0,0,.38)}.theme--light.v-data-table .v-data-table-header th.sortable.active,.theme--light.v-data-table .v-data-table-header th.sortable.active .v-data-table-header__icon,.theme--light.v-data-table .v-data-table-header th.sortable:hover{color:rgba(0,0,0,.87)}.theme--light.v-data-table .v-data-table-header__sort-badge{background-color:rgba(0,0,0,.12);color:rgba(0,0,0,.87)}.theme--dark.v-data-table .v-data-table-header th.sortable .v-data-table-header__icon{color:hsla(0,0%,100%,.5)}.theme--dark.v-data-table .v-data-table-header th.sortable.active,.theme--dark.v-data-table .v-data-table-header th.sortable.active .v-data-table-header__icon,.theme--dark.v-data-table .v-data-table-header th.sortable:hover{color:#fff}.theme--dark.v-data-table .v-data-table-header__sort-badge{background-color:hsla(0,0%,100%,.12);color:#fff}.v-data-table-header th.sortable{pointer-events:auto;cursor:pointer;outline:0}.v-data-table-header th.sortable .v-data-table-header__icon{line-height:.9}.v-data-table-header th.active .v-data-table-header__icon,.v-data-table-header th:hover .v-data-table-header__icon{-webkit-transform:none;transform:none;opacity:1}.v-data-table-header th.desc .v-data-table-header__icon{-webkit-transform:rotate(-180deg);transform:rotate(-180deg)}.v-data-table-header__icon{display:inline-block;opacity:0;-webkit-transition:.3s cubic-bezier(.25,.8,.5,1);transition:.3s cubic-bezier(.25,.8,.5,1)}.v-data-table-header__sort-badge{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;border:0;border-radius:50%;min-width:18px;min-height:18px;height:18px;width:18px}.v-data-table-header-mobile th{height:auto}.v-data-table-header-mobile__wrapper{display:-webkit-box;display:-ms-flexbox;display:flex}.v-data-table-header-mobile__wrapper .v-select{margin-bottom:8px}.v-data-table-header-mobile__wrapper .v-select .v-chip{height:24px}.v-data-table-header-mobile__wrapper .v-select .v-chip__close.desc .v-icon{-webkit-transform:rotate(-180deg);transform:rotate(-180deg)}.v-data-table-header-mobile__select{min-width:56px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.theme--light.v-data-table{background-color:#fff;color:rgba(0,0,0,.87)}.theme--light.v-data-table .v-data-table__divider{border-right:thin solid rgba(0,0,0,.12)}.theme--light.v-data-table.v-data-table--fixed-header thead th{background:#fff;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.12);box-shadow:inset 0 -1px 0 rgba(0,0,0,.12)}.theme--light.v-data-table>.v-data-table__wrapper>table>thead>tr>th{color:rgba(0,0,0,.6)}.theme--light.v-data-table>.v-data-table__wrapper>table>tbody>tr:not(:last-child)>td:last-child,.theme--light.v-data-table>.v-data-table__wrapper>table>tbody>tr:not(:last-child)>td:not(.v-data-table__mobile-row),.theme--light.v-data-table>.v-data-table__wrapper>table>tbody>tr:not(:last-child)>th:last-child,.theme--light.v-data-table>.v-data-table__wrapper>table>tbody>tr:not(:last-child)>th:not(.v-data-table__mobile-row),.theme--light.v-data-table>.v-data-table__wrapper>table>thead>tr:last-child>th{border-bottom:thin solid rgba(0,0,0,.12)}.theme--light.v-data-table>.v-data-table__wrapper>table>tbody>tr.active{background:#f5f5f5}.theme--light.v-data-table>.v-data-table__wrapper>table>tbody>tr:hover:not(.v-data-table__expanded__content):not(.v-data-table__empty-wrapper){background:#eee}.theme--light.v-data-table>.v-data-table__wrapper>table>tfoot>tr>td:not(.v-data-table__mobile-row),.theme--light.v-data-table>.v-data-table__wrapper>table>tfoot>tr>th:not(.v-data-table__mobile-row){border-top:thin solid rgba(0,0,0,.12)}.theme--dark.v-data-table{background-color:#1e1e1e;color:#fff}.theme--dark.v-data-table .v-data-table__divider{border-right:thin solid hsla(0,0%,100%,.12)}.theme--dark.v-data-table.v-data-table--fixed-header thead th{background:#1e1e1e;-webkit-box-shadow:inset 0 -1px 0 hsla(0,0%,100%,.12);box-shadow:inset 0 -1px 0 hsla(0,0%,100%,.12)}.theme--dark.v-data-table>.v-data-table__wrapper>table>thead>tr>th{color:hsla(0,0%,100%,.7)}.theme--dark.v-data-table>.v-data-table__wrapper>table>tbody>tr:not(:last-child)>td:last-child,.theme--dark.v-data-table>.v-data-table__wrapper>table>tbody>tr:not(:last-child)>td:not(.v-data-table__mobile-row),.theme--dark.v-data-table>.v-data-table__wrapper>table>tbody>tr:not(:last-child)>th:last-child,.theme--dark.v-data-table>.v-data-table__wrapper>table>tbody>tr:not(:last-child)>th:not(.v-data-table__mobile-row),.theme--dark.v-data-table>.v-data-table__wrapper>table>thead>tr:last-child>th{border-bottom:thin solid hsla(0,0%,100%,.12)}.theme--dark.v-data-table>.v-data-table__wrapper>table>tbody>tr.active{background:#505050}.theme--dark.v-data-table>.v-data-table__wrapper>table>tbody>tr:hover:not(.v-data-table__expanded__content):not(.v-data-table__empty-wrapper){background:#616161}.theme--dark.v-data-table>.v-data-table__wrapper>table>tfoot>tr>td:not(.v-data-table__mobile-row),.theme--dark.v-data-table>.v-data-table__wrapper>table>tfoot>tr>th:not(.v-data-table__mobile-row){border-top:thin solid hsla(0,0%,100%,.12)}.v-data-table{line-height:1.5;max-width:100%}.v-data-table>.v-data-table__wrapper>table{width:100%;border-spacing:0}.v-data-table>.v-data-table__wrapper>table>tbody>tr>td,.v-data-table>.v-data-table__wrapper>table>tbody>tr>th,.v-data-table>.v-data-table__wrapper>table>tfoot>tr>td,.v-data-table>.v-data-table__wrapper>table>tfoot>tr>th,.v-data-table>.v-data-table__wrapper>table>thead>tr>td,.v-data-table>.v-data-table__wrapper>table>thead>tr>th{padding:0 16px;-webkit-transition:height .2s cubic-bezier(.4,0,.6,1);transition:height .2s cubic-bezier(.4,0,.6,1)}.v-data-table>.v-data-table__wrapper>table>tbody>tr>th,.v-data-table>.v-data-table__wrapper>table>tfoot>tr>th,.v-data-table>.v-data-table__wrapper>table>thead>tr>th{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-size:.75rem;height:48px}.v-application--is-ltr .v-data-table>.v-data-table__wrapper>table>tbody>tr>th,.v-application--is-ltr .v-data-table>.v-data-table__wrapper>table>tfoot>tr>th,.v-application--is-ltr .v-data-table>.v-data-table__wrapper>table>thead>tr>th{text-align:left}.v-application--is-rtl .v-data-table>.v-data-table__wrapper>table>tbody>tr>th,.v-application--is-rtl .v-data-table>.v-data-table__wrapper>table>tfoot>tr>th,.v-application--is-rtl .v-data-table>.v-data-table__wrapper>table>thead>tr>th{text-align:right}.v-data-table>.v-data-table__wrapper>table>tbody>tr>td,.v-data-table>.v-data-table__wrapper>table>tfoot>tr>td,.v-data-table>.v-data-table__wrapper>table>thead>tr>td{font-size:.875rem;height:48px}.v-data-table__wrapper{overflow-x:auto;overflow-y:hidden}.v-data-table__progress{height:auto!important}.v-data-table__progress th{height:auto!important;border:none!important;padding:0;position:relative}.v-data-table--dense>.v-data-table__wrapper>table>tbody>tr>td,.v-data-table--dense>.v-data-table__wrapper>table>tbody>tr>th,.v-data-table--dense>.v-data-table__wrapper>table>tfoot>tr>td,.v-data-table--dense>.v-data-table__wrapper>table>tfoot>tr>th,.v-data-table--dense>.v-data-table__wrapper>table>thead>tr>td,.v-data-table--dense>.v-data-table__wrapper>table>thead>tr>th{height:32px}.v-data-table--has-top>.v-data-table__wrapper>table>tbody>tr:first-child:hover>td:first-child{border-top-left-radius:0}.v-data-table--has-top>.v-data-table__wrapper>table>tbody>tr:first-child:hover>td:last-child{border-top-right-radius:0}.v-data-table--has-bottom>.v-data-table__wrapper>table>tbody>tr:last-child:hover>td:first-child{border-bottom-left-radius:0}.v-data-table--has-bottom>.v-data-table__wrapper>table>tbody>tr:last-child:hover>td:last-child{border-bottom-right-radius:0}.v-data-table--fixed-header>.v-data-table__wrapper,.v-data-table--fixed-height .v-data-table__wrapper{overflow-y:auto}.v-data-table--fixed-header>.v-data-table__wrapper>table>thead>tr>th{border-bottom:0!important;position:sticky;top:0;z-index:2}.v-data-table--fixed-header>.v-data-table__wrapper>table>thead>tr:nth-child(2)>th{top:48px}.v-application--is-ltr .v-data-table--fixed-header .v-data-footer{margin-right:17px}.v-application--is-rtl .v-data-table--fixed-header .v-data-footer{margin-left:17px}.v-data-table--fixed-header.v-data-table--dense>.v-data-table__wrapper>table>thead>tr:nth-child(2)>th{top:32px}.theme--light.v-tabs>.v-tabs-bar{background-color:#fff}.theme--light.v-tabs>.v-tabs-bar .v-tab--disabled,.theme--light.v-tabs>.v-tabs-bar .v-tab:not(.v-tab--active),.theme--light.v-tabs>.v-tabs-bar .v-tab:not(.v-tab--active)>.v-btn,.theme--light.v-tabs>.v-tabs-bar .v-tab:not(.v-tab--active)>.v-icon{color:rgba(0,0,0,.54)}.theme--light.v-tabs .v-tab:hover:before{opacity:.04}.theme--light.v-tabs .v-tab--active:before,.theme--light.v-tabs .v-tab--active:hover:before,.theme--light.v-tabs .v-tab:focus:before{opacity:.12}.theme--light.v-tabs .v-tab--active:focus:before{opacity:.16}.theme--dark.v-tabs>.v-tabs-bar{background-color:#1e1e1e}.theme--dark.v-tabs>.v-tabs-bar .v-tab--disabled,.theme--dark.v-tabs>.v-tabs-bar .v-tab:not(.v-tab--active),.theme--dark.v-tabs>.v-tabs-bar .v-tab:not(.v-tab--active)>.v-btn,.theme--dark.v-tabs>.v-tabs-bar .v-tab:not(.v-tab--active)>.v-icon{color:hsla(0,0%,100%,.6)}.theme--dark.v-tabs .v-tab:hover:before{opacity:.08}.theme--dark.v-tabs .v-tab--active:before,.theme--dark.v-tabs .v-tab--active:hover:before,.theme--dark.v-tabs .v-tab:focus:before{opacity:.24}.theme--dark.v-tabs .v-tab--active:focus:before{opacity:.32}.theme--light.v-tabs-items{background-color:#fff}.theme--dark.v-tabs-items{background-color:#1e1e1e}.v-tabs-bar.accent .v-tab,.v-tabs-bar.accent .v-tabs-slider,.v-tabs-bar.error .v-tab,.v-tabs-bar.error .v-tabs-slider,.v-tabs-bar.info .v-tab,.v-tabs-bar.info .v-tabs-slider,.v-tabs-bar.primary .v-tab,.v-tabs-bar.primary .v-tabs-slider,.v-tabs-bar.secondary .v-tab,.v-tabs-bar.secondary .v-tabs-slider,.v-tabs-bar.success .v-tab,.v-tabs-bar.success .v-tabs-slider,.v-tabs-bar.warning .v-tab,.v-tabs-bar.warning .v-tabs-slider{color:#fff}.v-tabs{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;width:100%}.v-tabs .v-menu__activator{height:100%}.v-tabs.v.tabs--vertical.v-tabs--right{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.v-tabs:not(.v-tabs--vertical) .v-tab{white-space:normal}.v-tabs:not(.v-tabs--vertical).v-tabs--right>.v-slide-group--is-overflowing.v-tabs-bar--is-mobile:not(.v-slide-group--has-affixes) .v-slide-group__next,.v-tabs:not(.v-tabs--vertical):not(.v-tabs--right)>.v-slide-group--is-overflowing.v-tabs-bar--is-mobile:not(.v-slide-group--has-affixes) .v-slide-group__prev{display:initial;visibility:hidden}.v-tabs-bar{border-radius:inherit;height:48px}.v-tabs-bar.v-item-group>*{cursor:auto}.v-tab{-webkit-box-align:center;-ms-flex-align:center;align-items:center;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;font-size:.875rem;font-weight:500;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;letter-spacing:.0892857143em;line-height:normal;min-width:90px;max-width:360px;outline:none;padding:0 16px;position:relative;text-align:center;text-decoration:none;text-transform:uppercase;-webkit-transition:none;transition:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.v-tab.v-tab{color:inherit}.v-tab:before{bottom:0;content:"";left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:0;-webkit-transition:.3s cubic-bezier(.25,.8,.5,1);transition:.3s cubic-bezier(.25,.8,.5,1)}.v-tab:before,.v-tabs-slider{background-color:currentColor}.v-tabs-slider{height:100%;width:100%}.v-tabs-slider-wrapper{bottom:0;margin:0!important;position:absolute;-webkit-transition:.3s cubic-bezier(.25,.8,.5,1);transition:.3s cubic-bezier(.25,.8,.5,1);z-index:1}.v-application--is-ltr .v-tabs--align-with-title>.v-tabs-bar:not(.v-tabs-bar--show-arrows):not(.v-slide-group--is-overflowing)>.v-slide-group__wrapper>.v-tabs-bar__content>.v-tab:first-child,.v-application--is-ltr .v-tabs--align-with-title>.v-tabs-bar:not(.v-tabs-bar--show-arrows):not(.v-slide-group--is-overflowing)>.v-slide-group__wrapper>.v-tabs-bar__content>.v-tabs-slider-wrapper+.v-tab{margin-left:42px}.v-application--is-rtl .v-tabs--align-with-title>.v-tabs-bar:not(.v-tabs-bar--show-arrows):not(.v-slide-group--is-overflowing)>.v-slide-group__wrapper>.v-tabs-bar__content>.v-tab:first-child,.v-application--is-rtl .v-tabs--align-with-title>.v-tabs-bar:not(.v-tabs-bar--show-arrows):not(.v-slide-group--is-overflowing)>.v-slide-group__wrapper>.v-tabs-bar__content>.v-tabs-slider-wrapper+.v-tab{margin-right:42px}.v-application--is-ltr .v-tabs--centered>.v-tabs-bar .v-tabs-bar__content>:last-child,.v-application--is-ltr .v-tabs--fixed-tabs>.v-tabs-bar .v-tabs-bar__content>:last-child{margin-right:auto}.v-application--is-ltr .v-tabs--centered>.v-tabs-bar .v-tabs-bar__content>:first-child:not(.v-tabs-slider-wrapper),.v-application--is-ltr .v-tabs--centered>.v-tabs-bar .v-tabs-slider-wrapper+*,.v-application--is-ltr .v-tabs--fixed-tabs>.v-tabs-bar .v-tabs-bar__content>:first-child:not(.v-tabs-slider-wrapper),.v-application--is-ltr .v-tabs--fixed-tabs>.v-tabs-bar .v-tabs-slider-wrapper+*,.v-application--is-rtl .v-tabs--centered>.v-tabs-bar .v-tabs-bar__content>:last-child,.v-application--is-rtl .v-tabs--fixed-tabs>.v-tabs-bar .v-tabs-bar__content>:last-child{margin-left:auto}.v-application--is-rtl .v-tabs--centered>.v-tabs-bar .v-tabs-bar__content>:first-child:not(.v-tabs-slider-wrapper),.v-application--is-rtl .v-tabs--centered>.v-tabs-bar .v-tabs-slider-wrapper+*,.v-application--is-rtl .v-tabs--fixed-tabs>.v-tabs-bar .v-tabs-bar__content>:first-child:not(.v-tabs-slider-wrapper),.v-application--is-rtl .v-tabs--fixed-tabs>.v-tabs-bar .v-tabs-slider-wrapper+*{margin-right:auto}.v-tabs--fixed-tabs>.v-tabs-bar .v-tab{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;width:100%}.v-tabs--grow>.v-tabs-bar .v-tab{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;max-width:none}.v-tabs--icons-and-text>.v-tabs-bar{height:72px}.v-tabs--icons-and-text>.v-tabs-bar .v-tab{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.v-tabs--icons-and-text>.v-tabs-bar .v-tab>:first-child{margin-bottom:6px}.v-tabs--overflow>.v-tabs-bar .v-tab{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto}.v-application--is-ltr .v-tabs--right>.v-tabs-bar .v-tab:first-child,.v-application--is-ltr .v-tabs--right>.v-tabs-bar .v-tabs-slider-wrapper+.v-tab{margin-left:auto}.v-application--is-rtl .v-tabs--right>.v-tabs-bar .v-tab:first-child,.v-application--is-rtl .v-tabs--right>.v-tabs-bar .v-tabs-slider-wrapper+.v-tab{margin-right:auto}.v-application--is-ltr .v-tabs--right>.v-tabs-bar .v-tab:last-child{margin-right:0}.v-application--is-rtl .v-tabs--right>.v-tabs-bar .v-tab:last-child{margin-left:0}.v-tabs--vertical{display:-webkit-box;display:-ms-flexbox;display:flex}.v-tabs--vertical>.v-tabs-bar{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;height:auto}.v-tabs--vertical>.v-tabs-bar .v-slide-group__next,.v-tabs--vertical>.v-tabs-bar .v-slide-group__prev{display:none}.v-tabs--vertical>.v-tabs-bar .v-tabs-bar__content{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.v-tabs--vertical>.v-tabs-bar .v-tab{height:48px}.v-tabs--vertical>.v-tabs-bar .v-tabs-slider{height:100%}.v-tabs--vertical>.v-window{-webkit-box-flex:0;-ms-flex:0 1 100%;flex:0 1 100%}.v-tabs--vertical.v-tabs--icons-and-text>.v-tabs-bar .v-tab{height:72px}.v-tab--active{color:inherit}.v-tab--active.v-tab:not(:focus):before{opacity:0}.v-tab--active .v-btn.v-btn--flat,.v-tab--active .v-icon{color:inherit}.v-tab--disabled{pointer-events:none;opacity:.5}.v-slide-group{display:-webkit-box;display:-ms-flexbox;display:flex}.v-slide-group:not(.v-slide-group--has-affixes)>.v-slide-group__next,.v-slide-group:not(.v-slide-group--has-affixes)>.v-slide-group__prev{display:none}.v-slide-group.v-item-group>.v-slide-group__next,.v-slide-group.v-item-group>.v-slide-group__prev{cursor:pointer}.v-slide-item{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto}.v-slide-group__next,.v-slide-group__prev{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 1 52px;flex:0 1 52px;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;min-width:52px}.v-slide-group__content{-ms-flex:1 0 auto;flex:1 0 auto;position:relative;-webkit-transition:.3s cubic-bezier(.25,.8,.5,1);transition:.3s cubic-bezier(.25,.8,.5,1);white-space:nowrap}.v-slide-group__content,.v-slide-group__wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1}.v-slide-group__wrapper{contain:content;-ms-flex:1 1 auto;flex:1 1 auto;overflow:hidden}.v-slide-group__next--disabled,.v-slide-group__prev--disabled{pointer-events:none}.v-window{overflow:hidden}.v-window__container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:inherit;position:relative;-webkit-transition:.3s cubic-bezier(.25,.8,.5,1);transition:.3s cubic-bezier(.25,.8,.5,1)}.v-window__container--is-active{overflow:hidden}.v-window__next,.v-window__prev{background:rgba(0,0,0,.3);border-radius:50%;position:absolute;margin:0 16px;top:calc(50% - 20px);z-index:1}.v-window__next .v-btn:hover,.v-window__prev .v-btn:hover{background:none}.v-application--is-ltr .v-window__prev{left:0}.v-application--is-ltr .v-window__next,.v-application--is-rtl .v-window__prev{right:0}.v-application--is-rtl .v-window__next{left:0}.v-window--show-arrows-on-hover{overflow:hidden}.v-window--show-arrows-on-hover .v-window__next,.v-window--show-arrows-on-hover .v-window__prev{-webkit-transition:transform .2s cubic-bezier(.25,.8,.5,1);transition:transform .2s cubic-bezier(.25,.8,.5,1)}.v-application--is-ltr .v-window--show-arrows-on-hover .v-window__prev{-webkit-transform:translateX(-200%);transform:translateX(-200%)}.v-application--is-ltr .v-window--show-arrows-on-hover .v-window__next,.v-application--is-rtl .v-window--show-arrows-on-hover .v-window__prev{-webkit-transform:translateX(200%);transform:translateX(200%)}.v-application--is-rtl .v-window--show-arrows-on-hover .v-window__next{-webkit-transform:translateX(-200%);transform:translateX(-200%)}.v-window--show-arrows-on-hover:hover .v-window__next,.v-window--show-arrows-on-hover:hover .v-window__prev{-webkit-transform:translateX(0);transform:translateX(0)}.v-window-x-reverse-transition-enter-active,.v-window-x-reverse-transition-leave-active,.v-window-x-transition-enter-active,.v-window-x-transition-leave-active,.v-window-y-reverse-transition-enter-active,.v-window-y-reverse-transition-leave-active,.v-window-y-transition-enter-active,.v-window-y-transition-leave-active{-webkit-transition:.3s cubic-bezier(.25,.8,.5,1);transition:.3s cubic-bezier(.25,.8,.5,1)}.v-window-x-reverse-transition-leave,.v-window-x-reverse-transition-leave-to,.v-window-x-transition-leave,.v-window-x-transition-leave-to,.v-window-y-reverse-transition-leave,.v-window-y-reverse-transition-leave-to,.v-window-y-transition-leave,.v-window-y-transition-leave-to{position:absolute!important;top:0;width:100%}.v-window-x-transition-enter{-webkit-transform:translateX(100%);transform:translateX(100%)}.v-window-x-reverse-transition-enter,.v-window-x-transition-leave-to{-webkit-transform:translateX(-100%);transform:translateX(-100%)}.v-window-x-reverse-transition-leave-to{-webkit-transform:translateX(100%);transform:translateX(100%)}.v-window-y-transition-enter{-webkit-transform:translateY(100%);transform:translateY(100%)}.v-window-y-reverse-transition-enter,.v-window-y-transition-leave-to{-webkit-transform:translateY(-100%);transform:translateY(-100%)}.v-window-y-reverse-transition-leave-to{-webkit-transform:translateY(100%);transform:translateY(100%)}.theme--light.v-input--switch .v-input--switch__thumb{color:#fff}.theme--light.v-input--switch .v-input--switch__track{color:rgba(0,0,0,.38)}.theme--light.v-input--switch.v-input--is-disabled:not(.v-input--is-dirty) .v-input--switch__thumb{color:#fafafa!important}.theme--light.v-input--switch.v-input--is-disabled:not(.v-input--is-dirty) .v-input--switch__track{color:rgba(0,0,0,.12)!important}.theme--dark.v-input--switch .v-input--switch__thumb{color:#bdbdbd}.theme--dark.v-input--switch .v-input--switch__track{color:hsla(0,0%,100%,.3)}.theme--dark.v-input--switch.v-input--is-disabled:not(.v-input--is-dirty) .v-input--switch__thumb{color:#424242!important}.theme--dark.v-input--switch.v-input--is-disabled:not(.v-input--is-dirty) .v-input--switch__track{color:hsla(0,0%,100%,.1)!important}.v-input--switch__thumb,.v-input--switch__track{background-color:currentColor;pointer-events:none;-webkit-transition:inherit;transition:inherit}.v-input--switch__track{border-radius:8px;width:36px;height:14px;left:2px;position:absolute;opacity:.6;right:2px;top:calc(50% - 7px)}.v-input--switch__thumb{border-radius:50%;top:calc(50% - 10px);height:20px;position:relative;width:20px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-transition:.3s cubic-bezier(.25,.8,.5,1);transition:.3s cubic-bezier(.25,.8,.5,1)}.v-input--switch .v-input--selection-controls__input{width:38px}.v-input--switch .v-input--selection-controls__ripple{top:calc(50% - 24px)}.v-input--switch.v-input--dense .v-input--switch__thumb{width:18px;height:18px}.v-input--switch.v-input--dense .v-input--switch__track{height:12px;width:32px}.v-input--switch.v-input--dense.v-input--switch--inset .v-input--switch__track{height:22px;width:44px;top:calc(50% - 12px);left:-3px}.v-input--switch.v-input--dense .v-input--selection-controls__ripple{top:calc(50% - 22px)}.v-input--switch.v-input--is-dirty.v-input--is-disabled{opacity:.6}.v-application--is-ltr .v-input--switch .v-input--selection-controls__ripple{left:-14px}.v-application--is-ltr .v-input--switch.v-input--dense .v-input--selection-controls__ripple{left:-12px}.v-application--is-ltr .v-input--switch.v-input--is-dirty .v-input--selection-controls__ripple,.v-application--is-ltr .v-input--switch.v-input--is-dirty .v-input--switch__thumb{-webkit-transform:translate(20px);transform:translate(20px)}.v-application--is-rtl .v-input--switch .v-input--selection-controls__ripple{right:-14px}.v-application--is-rtl .v-input--switch.v-input--dense .v-input--selection-controls__ripple{right:-12px}.v-application--is-rtl .v-input--switch.v-input--is-dirty .v-input--selection-controls__ripple,.v-application--is-rtl .v-input--switch.v-input--is-dirty .v-input--switch__thumb{-webkit-transform:translate(-20px);transform:translate(-20px)}.v-input--switch:not(.v-input--switch--flat):not(.v-input--switch--inset) .v-input--switch__thumb{-webkit-box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12);box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.v-input--switch--inset .v-input--selection-controls__input,.v-input--switch--inset .v-input--switch__track{width:48px}.v-input--switch--inset .v-input--switch__track{border-radius:14px;height:28px;left:-4px;opacity:.32;top:calc(50% - 14px)}.v-application--is-ltr .v-input--switch--inset .v-input--selection-controls__ripple,.v-application--is-ltr .v-input--switch--inset .v-input--switch__thumb{-webkit-transform:translate(0)!important;transform:translate(0)!important}.v-application--is-rtl .v-input--switch--inset .v-input--selection-controls__ripple,.v-application--is-rtl .v-input--switch--inset .v-input--switch__thumb{-webkit-transform:translate(-6px)!important;transform:translate(-6px)!important}.v-application--is-ltr .v-input--switch--inset.v-input--is-dirty .v-input--selection-controls__ripple,.v-application--is-ltr .v-input--switch--inset.v-input--is-dirty .v-input--switch__thumb{-webkit-transform:translate(20px)!important;transform:translate(20px)!important}.v-application--is-rtl .v-input--switch--inset.v-input--is-dirty .v-input--selection-controls__ripple,.v-application--is-rtl .v-input--switch--inset.v-input--is-dirty .v-input--switch__thumb{-webkit-transform:translate(-26px)!important;transform:translate(-26px)!important}.v-tooltip{display:none}.v-tooltip--attached{display:inline}.v-tooltip__content{background:rgba(97,97,97,.9);color:#fff;border-radius:4px;font-size:14px;line-height:22px;display:inline-block;padding:5px 16px;position:absolute;text-transform:none;width:auto;opacity:1;pointer-events:none}.v-tooltip__content--fixed{position:fixed}.v-tooltip__content[class*=-active]{-webkit-transition-timing-function:cubic-bezier(0,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1)}.v-tooltip__content[class*=enter-active]{-webkit-transition-duration:.15s;transition-duration:.15s}.v-tooltip__content[class*=leave-active]{-webkit-transition-duration:75ms;transition-duration:75ms}.bottom-sheet-transition-enter,.bottom-sheet-transition-leave-to{-webkit-transform:translateY(100%);transform:translateY(100%)}.v-bottom-sheet.v-dialog{-ms-flex-item-align:end;align-self:flex-end;border-radius:0;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;margin:0;overflow:visible}.v-bottom-sheet.v-dialog.v-bottom-sheet--inset{max-width:70%}@media only screen and (max-width:599px){.v-bottom-sheet.v-dialog.v-bottom-sheet--inset{max-width:none}}.theme--light.v-picker__title{background:#e0e0e0}.theme--dark.v-picker__title{background:#616161}.theme--light.v-picker__body{background:#fff}.theme--dark.v-picker__body{background:#424242}.v-picker{border-radius:4px;contain:layout style;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;font-size:1rem;vertical-align:top;position:relative}.v-picker--full-width{display:-webkit-box;display:-ms-flexbox;display:flex;width:100%}.v-picker--full-width>.v-picker__body{margin:initial}.v-picker__title{color:#fff;border-top-left-radius:4px;border-top-right-radius:4px;padding:16px}.v-picker__title__btn{-webkit-transition:.3s cubic-bezier(.25,.8,.5,1);transition:.3s cubic-bezier(.25,.8,.5,1)}.v-picker__title__btn:not(.v-picker__title__btn--active){opacity:.6;cursor:pointer}.v-picker__title__btn:not(.v-picker__title__btn--active):hover:not(:focus){opacity:1}.v-picker__title__btn--readonly{pointer-events:none}.v-picker__title__btn--active{opacity:1}.v-picker__body{height:auto;overflow:hidden;position:relative;z-index:0;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0 auto}.v-picker__body>div{width:100%}.v-picker__body>div.fade-transition-leave-active{position:absolute}.v-picker--landscape .v-picker__title{border-top-right-radius:0;border-bottom-right-radius:0;width:170px;position:absolute;top:0;height:100%;z-index:1}.v-application--is-ltr .v-picker--landscape .v-picker__title{left:0}.v-application--is-rtl .v-picker--landscape .v-picker__title{right:0}.v-application--is-ltr .v-picker--landscape .v-picker__actions:not(.v-picker__actions--no-title),.v-application--is-ltr .v-picker--landscape .v-picker__body:not(.v-picker__body--no-title){margin-left:170px;margin-right:0}.v-application--is-rtl .v-picker--landscape .v-picker__actions:not(.v-picker__actions--no-title),.v-application--is-rtl .v-picker--landscape .v-picker__body:not(.v-picker__body--no-title){margin-right:170px;margin-left:0}.v-picker--flat{-webkit-box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12);box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.theme--light.v-time-picker-clock{background:#e0e0e0}.theme--light.v-time-picker-clock .v-time-picker-clock__item--disabled{color:rgba(0,0,0,.26)}.theme--light.v-time-picker-clock .v-time-picker-clock__item--disabled.v-time-picker-clock__item--active{color:hsla(0,0%,100%,.3)}.theme--light.v-time-picker-clock--indeterminate .v-time-picker-clock__hand{background-color:#bdbdbd}.theme--light.v-time-picker-clock--indeterminate:after{color:#bdbdbd}.theme--light.v-time-picker-clock--indeterminate .v-time-picker-clock__item--active{background-color:#bdbdbd}.theme--dark.v-time-picker-clock{background:#616161}.theme--dark.v-time-picker-clock .v-time-picker-clock__item--disabled,.theme--dark.v-time-picker-clock .v-time-picker-clock__item--disabled.v-time-picker-clock__item--active{color:hsla(0,0%,100%,.3)}.theme--dark.v-time-picker-clock--indeterminate .v-time-picker-clock__hand{background-color:#757575}.theme--dark.v-time-picker-clock--indeterminate:after{color:#757575}.theme--dark.v-time-picker-clock--indeterminate .v-time-picker-clock__item--active{background-color:#757575}.v-time-picker-clock{border-radius:100%;position:relative;-webkit-transition:.3s cubic-bezier(.25,.8,.5,1);transition:.3s cubic-bezier(.25,.8,.5,1);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%;padding-top:100%;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto}.v-time-picker-clock__container{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;-ms-flex-preferred-size:290px;flex-basis:290px;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.v-time-picker-clock__ampm,.v-time-picker-clock__container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-direction:normal;padding:10px}.v-time-picker-clock__ampm{-webkit-box-orient:horizontal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end;position:absolute;width:100%;height:100%;top:0;left:0;margin:0}.v-time-picker-clock__hand{height:calc(50% - 4px);width:2px;bottom:50%;left:calc(50% - 1px);-webkit-transform-origin:center bottom;transform-origin:center bottom;position:absolute;will-change:transform;z-index:1}.v-time-picker-clock__hand:before{background:transparent;border-width:2px;width:10px;height:10px;top:-4px}.v-time-picker-clock__hand:after,.v-time-picker-clock__hand:before{border-style:solid;border-color:inherit;border-radius:100%;content:"";position:absolute;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.v-time-picker-clock__hand:after{height:8px;width:8px;top:100%;background-color:inherit}.v-time-picker-clock__hand--inner:after{height:14px}.v-picker--full-width .v-time-picker-clock__container{max-width:290px}.v-time-picker-clock__inner{position:absolute;bottom:27px;left:27px;right:27px;top:27px}.v-time-picker-clock__item{-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-radius:100%;cursor:default;display:-webkit-box;display:-ms-flexbox;display:flex;font-size:16px;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;height:40px;position:absolute;text-align:center;width:40px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.v-time-picker-clock__item>span{z-index:1}.v-time-picker-clock__item:after,.v-time-picker-clock__item:before{content:"";border-radius:100%;position:absolute;top:50%;left:50%;height:14px;width:14px;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);height:40px;width:40px}.v-time-picker-clock__item--active{color:#fff;cursor:default;z-index:2}.v-time-picker-clock__item--disabled{pointer-events:none}.v-picker--landscape .v-time-picker-clock__container{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.v-picker--landscape .v-time-picker-clock__ampm{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.v-time-picker-title{color:#fff;display:-webkit-box;display:-ms-flexbox;display:flex;line-height:1;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.v-time-picker-title__time{white-space:nowrap;direction:ltr}.v-time-picker-title__time .v-picker__title__btn,.v-time-picker-title__time span{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;height:70px;font-size:70px;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.v-time-picker-title__ampm{-ms-flex-item-align:end;align-self:flex-end;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;font-size:16px;text-transform:uppercase}.v-application--is-ltr .v-time-picker-title__ampm{margin:0 0 6px 8px}.v-application--is-rtl .v-time-picker-title__ampm{margin:0 8px 6px 0}.v-time-picker-title__ampm div:only-child{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.v-time-picker-title__ampm--readonly .v-picker__title__btn.v-picker__title__btn--active{opacity:.6}.v-picker__title--landscape .v-time-picker-title{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;height:100%}.v-picker__title--landscape .v-time-picker-title__time{text-align:right}.v-picker__title--landscape .v-time-picker-title__time .v-picker__title__btn,.v-picker__title--landscape .v-time-picker-title__time span{height:55px;font-size:55px}.v-picker__title--landscape .v-time-picker-title__ampm{margin:16px 0 0;-ms-flex-item-align:initial;align-self:auto;text-align:center}.v-picker--time .v-picker__title--landscape{padding:0}.v-picker--time .v-picker__title--landscape .v-time-picker-title__time{text-align:center}.theme--light.v-application{background:#fff;color:rgba(0,0,0,.87)}.theme--light.v-application .text--primary{color:rgba(0,0,0,.87)!important}.theme--light.v-application .text--secondary{color:rgba(0,0,0,.6)!important}.theme--light.v-application .text--disabled{color:rgba(0,0,0,.38)!important}.theme--dark.v-application{background:#121212;color:#fff}.theme--dark.v-application .text--primary{color:#fff!important}.theme--dark.v-application .text--secondary{color:hsla(0,0%,100%,.7)!important}.theme--dark.v-application .text--disabled{color:hsla(0,0%,100%,.5)!important}.v-application{display:-webkit-box;display:-ms-flexbox;display:flex;position:relative}.v-application a{cursor:pointer}.v-application--is-rtl{direction:rtl}.v-application--wrap{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-backface-visibility:hidden;backface-visibility:hidden;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;min-height:100vh;max-width:100%;position:relative}@-moz-document url-prefix(){@media print{.v-application,.v-application--wrap{display:block}}}.theme--light.v-footer{background-color:#f5f5f5;color:rgba(0,0,0,.87)}.theme--dark.v-footer{background-color:#272727;color:#fff}.v-sheet.v-footer{border-radius:0}.v-sheet.v-footer:not(.v-sheet--outlined){-webkit-box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12);box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.v-sheet.v-footer.v-sheet--shaped{border-radius:24px 0}.v-footer{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0!important;-ms-flex:0 1 auto!important;flex:0 1 auto!important;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:6px 16px;position:relative;-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-transition-property:background-color,left,right;transition-property:background-color,left,right;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1)}.v-footer:not([data-booted=true]){-webkit-transition:none!important;transition:none!important}.v-footer--absolute,.v-footer--fixed{z-index:3}.v-footer--absolute{position:absolute}.v-footer--absolute:not(.v-footer--inset){width:100%}.v-footer--fixed{position:fixed}.v-footer--padless{padding:0}.v-main{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;max-width:100%;-webkit-transition:.2s cubic-bezier(.4,0,.2,1);transition:.2s cubic-bezier(.4,0,.2,1)}.v-main:not([data-booted=true]){-webkit-transition:none!important;transition:none!important}.v-main__wrap{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;max-width:100%;position:relative}@-moz-document url-prefix(){@media print{.v-main{display:block}}}.theme--light.v-navigation-drawer{background-color:#fff}.theme--light.v-navigation-drawer:not(.v-navigation-drawer--floating) .v-navigation-drawer__border{background-color:rgba(0,0,0,.12)}.theme--light.v-navigation-drawer .v-divider{border-color:rgba(0,0,0,.12)}.theme--dark.v-navigation-drawer{background-color:#363636}.theme--dark.v-navigation-drawer:not(.v-navigation-drawer--floating) .v-navigation-drawer__border{background-color:hsla(0,0%,100%,.12)}.theme--dark.v-navigation-drawer .v-divider{border-color:hsla(0,0%,100%,.12)}.v-navigation-drawer{-webkit-overflow-scrolling:touch;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;left:0;max-width:100%;overflow:hidden;pointer-events:auto;top:0;-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-property:visibility,width,-webkit-transform;transition-property:visibility,width,-webkit-transform;transition-property:transform,visibility,width;transition-property:transform,visibility,width,-webkit-transform}.v-navigation-drawer:not([data-booted=true]){-webkit-transition:none!important;transition:none!important}.v-navigation-drawer.v-navigation-drawer--right:after{left:0;right:auto}.v-navigation-drawer .v-list:not(.v-select-list){background:inherit}.v-navigation-drawer__border{position:absolute;right:0;top:0;height:100%;width:1px}.v-navigation-drawer__content{height:100%;overflow-y:auto;overflow-x:hidden}.v-navigation-drawer__image{border-radius:inherit;height:100%;position:absolute;top:0;bottom:0;z-index:-1;contain:strict;width:100%}.v-navigation-drawer__image .v-image{border-radius:inherit}.v-navigation-drawer--bottom.v-navigation-drawer--is-mobile{max-height:50%;top:auto;bottom:0;min-width:100%}.v-navigation-drawer--right{left:auto;right:0}.v-navigation-drawer--right>.v-navigation-drawer__border{right:auto;left:0}.v-navigation-drawer--absolute{z-index:1}.v-navigation-drawer--fixed{z-index:6}.v-navigation-drawer--absolute{position:absolute}.v-navigation-drawer--clipped:not(.v-navigation-drawer--temporary):not(.v-navigation-drawer--is-mobile){z-index:4}.v-navigation-drawer--fixed{position:fixed}.v-navigation-drawer--floating:after{display:none}.v-navigation-drawer--mini-variant{overflow:hidden}.v-navigation-drawer--mini-variant .v-list-item>:first-child{margin-left:0;margin-right:0}.v-navigation-drawer--mini-variant .v-list-item>:not(:first-child){position:absolute!important;height:1px;width:1px;overflow:hidden;clip:rect(1px,1px,1px,1px);white-space:nowrap;display:initial}.v-navigation-drawer--mini-variant .v-list-group--no-action .v-list-group__items,.v-navigation-drawer--mini-variant .v-list-group--sub-group{display:none}.v-navigation-drawer--mini-variant.v-navigation-drawer--custom-mini-variant .v-list-item{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.v-navigation-drawer--temporary{z-index:7}.v-navigation-drawer--mobile{z-index:6}.v-navigation-drawer--close{visibility:hidden}.v-navigation-drawer--is-mobile:not(.v-navigation-drawer--close),.v-navigation-drawer--temporary:not(.v-navigation-drawer--close){-webkit-box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12);box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12)}@font-face{font-family:Roboto;src:url(../fonts/Roboto-Thin.ad538a69.woff2) format("woff2"),url(../fonts/Roboto-Thin.d3b47375.woff) format("woff");font-weight:100;font-style:normal}@font-face{font-family:Roboto-Thin;src:url(../fonts/Roboto-Thin.ad538a69.woff2) format("woff2"),url(../fonts/Roboto-Thin.d3b47375.woff) format("woff")}@font-face{font-family:Roboto;src:url(../fonts/Roboto-ThinItalic.5b4a33e1.woff2) format("woff2"),url(../fonts/Roboto-ThinItalic.8a96edbb.woff) format("woff");font-weight:100;font-style:italic}@font-face{font-family:Roboto-ThinItalic;src:url(../fonts/Roboto-ThinItalic.5b4a33e1.woff2) format("woff2"),url(../fonts/Roboto-ThinItalic.8a96edbb.woff) format("woff")}@font-face{font-family:Roboto;src:url(../fonts/Roboto-Light.d26871e8.woff2) format("woff2"),url(../fonts/Roboto-Light.c73eb1ce.woff) format("woff");font-weight:300;font-style:normal}@font-face{font-family:Roboto-Light;src:url(../fonts/Roboto-Light.d26871e8.woff2) format("woff2"),url(../fonts/Roboto-Light.c73eb1ce.woff) format("woff")}@font-face{font-family:Roboto;src:url(../fonts/Roboto-LightItalic.e8eaae90.woff2) format("woff2"),url(../fonts/Roboto-LightItalic.13efe6cb.woff) format("woff");font-weight:300;font-style:italic}@font-face{font-family:Roboto-LightItalic;src:url(../fonts/Roboto-LightItalic.e8eaae90.woff2) format("woff2"),url(../fonts/Roboto-LightItalic.13efe6cb.woff) format("woff")}@font-face{font-family:Roboto;src:url(../fonts/Roboto-Regular.73f0a88b.woff2) format("woff2"),url(../fonts/Roboto-Regular.35b07eb2.woff) format("woff");font-weight:400;font-style:normal}@font-face{font-family:Roboto-Regular;src:url(../fonts/Roboto-Regular.73f0a88b.woff2) format("woff2"),url(../fonts/Roboto-Regular.35b07eb2.woff) format("woff")}@font-face{font-family:Roboto;src:url(../fonts/Roboto-RegularItalic.4357beb8.woff2) format("woff2"),url(../fonts/Roboto-RegularItalic.f5902d5e.woff) format("woff");font-weight:400;font-style:italic}@font-face{font-family:Roboto-RegularItalic;src:url(../fonts/Roboto-RegularItalic.4357beb8.woff2) format("woff2"),url(../fonts/Roboto-RegularItalic.f5902d5e.woff) format("woff")}@font-face{font-family:Roboto;src:url(../fonts/Roboto-Medium.90d16760.woff2) format("woff2"),url(../fonts/Roboto-Medium.1d659482.woff) format("woff");font-weight:500;font-style:normal}@font-face{font-family:Roboto-Medium;src:url(../fonts/Roboto-Medium.90d16760.woff2) format("woff2"),url(../fonts/Roboto-Medium.1d659482.woff) format("woff")}@font-face{font-family:Roboto;src:url(../fonts/Roboto-MediumItalic.13ec0eb5.woff2) format("woff2"),url(../fonts/Roboto-MediumItalic.83e114c3.woff) format("woff");font-weight:500;font-style:italic}@font-face{font-family:Roboto-MediumItalic;src:url(../fonts/Roboto-MediumItalic.13ec0eb5.woff2) format("woff2"),url(../fonts/Roboto-MediumItalic.83e114c3.woff) format("woff")}@font-face{font-family:Roboto;src:url(../fonts/Roboto-Bold.b52fac2b.woff2) format("woff2"),url(../fonts/Roboto-Bold.50d75e48.woff) format("woff");font-weight:700;font-style:normal}@font-face{font-family:Roboto-Bold;src:url(../fonts/Roboto-Bold.b52fac2b.woff2) format("woff2"),url(../fonts/Roboto-Bold.50d75e48.woff) format("woff")}@font-face{font-family:Roboto;src:url(../fonts/Roboto-BoldItalic.94008e69.woff2) format("woff2"),url(../fonts/Roboto-BoldItalic.4fe0f73c.woff) format("woff");font-weight:700;font-style:italic}@font-face{font-family:Roboto-BoldItalic;src:url(../fonts/Roboto-BoldItalic.94008e69.woff2) format("woff2"),url(../fonts/Roboto-BoldItalic.4fe0f73c.woff) format("woff")}@font-face{font-family:Roboto;src:url(../fonts/Roboto-Black.59eb3601.woff2) format("woff2"),url(../fonts/Roboto-Black.313a6563.woff) format("woff");font-weight:900;font-style:normal}@font-face{font-family:Roboto-Black;src:url(../fonts/Roboto-Black.59eb3601.woff2) format("woff2"),url(../fonts/Roboto-Black.313a6563.woff) format("woff")}@font-face{font-family:Roboto;src:url(../fonts/Roboto-BlackItalic.f75569f8.woff2) format("woff2"),url(../fonts/Roboto-BlackItalic.cc2fadc3.woff) format("woff");font-weight:900;font-style:italic}@font-face{font-family:Roboto-BlackItalic;src:url(../fonts/Roboto-BlackItalic.f75569f8.woff2) format("woff2"),url(../fonts/Roboto-BlackItalic.cc2fadc3.woff) format("woff")}@font-face{font-family:Material Design Icons;src:url(../fonts/materialdesignicons-webfont.64d4cf64.eot);src:url(../fonts/materialdesignicons-webfont.64d4cf64.eot?#iefix&v=5.9.55) format("embedded-opentype"),url(../fonts/materialdesignicons-webfont.7a44ea19.woff2) format("woff2"),url(../fonts/materialdesignicons-webfont.147e3378.woff) format("woff"),url(../fonts/materialdesignicons-webfont.174c02fc.ttf) format("truetype");font-weight:400;font-style:normal}.mdi-set,.mdi:before{display:inline-block;font:normal normal normal 24px/1 Material Design Icons;font-size:inherit;text-rendering:auto;line-height:inherit;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.mdi-ab-testing:before{content:"\F01C9"}.mdi-abacus:before{content:"\F16E0"}.mdi-abjad-arabic:before{content:"\F1328"}.mdi-abjad-hebrew:before{content:"\F1329"}.mdi-abugida-devanagari:before{content:"\F132A"}.mdi-abugida-thai:before{content:"\F132B"}.mdi-access-point:before{content:"\F0003"}.mdi-access-point-check:before{content:"\F1538"}.mdi-access-point-minus:before{content:"\F1539"}.mdi-access-point-network:before{content:"\F0002"}.mdi-access-point-network-off:before{content:"\F0BE1"}.mdi-access-point-off:before{content:"\F1511"}.mdi-access-point-plus:before{content:"\F153A"}.mdi-access-point-remove:before{content:"\F153B"}.mdi-account:before{content:"\F0004"}.mdi-account-alert:before{content:"\F0005"}.mdi-account-alert-outline:before{content:"\F0B50"}.mdi-account-arrow-left:before{content:"\F0B51"}.mdi-account-arrow-left-outline:before{content:"\F0B52"}.mdi-account-arrow-right:before{content:"\F0B53"}.mdi-account-arrow-right-outline:before{content:"\F0B54"}.mdi-account-box:before{content:"\F0006"}.mdi-account-box-multiple:before{content:"\F0934"}.mdi-account-box-multiple-outline:before{content:"\F100A"}.mdi-account-box-outline:before{content:"\F0007"}.mdi-account-cancel:before{content:"\F12DF"}.mdi-account-cancel-outline:before{content:"\F12E0"}.mdi-account-cash:before{content:"\F1097"}.mdi-account-cash-outline:before{content:"\F1098"}.mdi-account-check:before{content:"\F0008"}.mdi-account-check-outline:before{content:"\F0BE2"}.mdi-account-child:before{content:"\F0A89"}.mdi-account-child-circle:before{content:"\F0A8A"}.mdi-account-child-outline:before{content:"\F10C8"}.mdi-account-circle:before{content:"\F0009"}.mdi-account-circle-outline:before{content:"\F0B55"}.mdi-account-clock:before{content:"\F0B56"}.mdi-account-clock-outline:before{content:"\F0B57"}.mdi-account-cog:before{content:"\F1370"}.mdi-account-cog-outline:before{content:"\F1371"}.mdi-account-convert:before{content:"\F000A"}.mdi-account-convert-outline:before{content:"\F1301"}.mdi-account-cowboy-hat:before{content:"\F0E9B"}.mdi-account-details:before{content:"\F0631"}.mdi-account-details-outline:before{content:"\F1372"}.mdi-account-edit:before{content:"\F06BC"}.mdi-account-edit-outline:before{content:"\F0FFB"}.mdi-account-group:before{content:"\F0849"}.mdi-account-group-outline:before{content:"\F0B58"}.mdi-account-hard-hat:before{content:"\F05B5"}.mdi-account-heart:before{content:"\F0899"}.mdi-account-heart-outline:before{content:"\F0BE3"}.mdi-account-key:before{content:"\F000B"}.mdi-account-key-outline:before{content:"\F0BE4"}.mdi-account-lock:before{content:"\F115E"}.mdi-account-lock-outline:before{content:"\F115F"}.mdi-account-minus:before{content:"\F000D"}.mdi-account-minus-outline:before{content:"\F0AEC"}.mdi-account-multiple:before{content:"\F000E"}.mdi-account-multiple-check:before{content:"\F08C5"}.mdi-account-multiple-check-outline:before{content:"\F11FE"}.mdi-account-multiple-minus:before{content:"\F05D3"}.mdi-account-multiple-minus-outline:before{content:"\F0BE5"}.mdi-account-multiple-outline:before{content:"\F000F"}.mdi-account-multiple-plus:before{content:"\F0010"}.mdi-account-multiple-plus-outline:before{content:"\F0800"}.mdi-account-multiple-remove:before{content:"\F120A"}.mdi-account-multiple-remove-outline:before{content:"\F120B"}.mdi-account-music:before{content:"\F0803"}.mdi-account-music-outline:before{content:"\F0CE9"}.mdi-account-network:before{content:"\F0011"}.mdi-account-network-outline:before{content:"\F0BE6"}.mdi-account-off:before{content:"\F0012"}.mdi-account-off-outline:before{content:"\F0BE7"}.mdi-account-outline:before{content:"\F0013"}.mdi-account-plus:before{content:"\F0014"}.mdi-account-plus-outline:before{content:"\F0801"}.mdi-account-question:before{content:"\F0B59"}.mdi-account-question-outline:before{content:"\F0B5A"}.mdi-account-reactivate:before{content:"\F152B"}.mdi-account-reactivate-outline:before{content:"\F152C"}.mdi-account-remove:before{content:"\F0015"}.mdi-account-remove-outline:before{content:"\F0AED"}.mdi-account-search:before{content:"\F0016"}.mdi-account-search-outline:before{content:"\F0935"}.mdi-account-settings:before{content:"\F0630"}.mdi-account-settings-outline:before{content:"\F10C9"}.mdi-account-star:before{content:"\F0017"}.mdi-account-star-outline:before{content:"\F0BE8"}.mdi-account-supervisor:before{content:"\F0A8B"}.mdi-account-supervisor-circle:before{content:"\F0A8C"}.mdi-account-supervisor-circle-outline:before{content:"\F14EC"}.mdi-account-supervisor-outline:before{content:"\F112D"}.mdi-account-switch:before{content:"\F0019"}.mdi-account-switch-outline:before{content:"\F04CB"}.mdi-account-tie:before{content:"\F0CE3"}.mdi-account-tie-outline:before{content:"\F10CA"}.mdi-account-tie-voice:before{content:"\F1308"}.mdi-account-tie-voice-off:before{content:"\F130A"}.mdi-account-tie-voice-off-outline:before{content:"\F130B"}.mdi-account-tie-voice-outline:before{content:"\F1309"}.mdi-account-voice:before{content:"\F05CB"}.mdi-adjust:before{content:"\F001A"}.mdi-adobe:before{content:"\F0936"}.mdi-adobe-acrobat:before{content:"\F0F9D"}.mdi-air-conditioner:before{content:"\F001B"}.mdi-air-filter:before{content:"\F0D43"}.mdi-air-horn:before{content:"\F0DAC"}.mdi-air-humidifier:before{content:"\F1099"}.mdi-air-humidifier-off:before{content:"\F1466"}.mdi-air-purifier:before{content:"\F0D44"}.mdi-airbag:before{content:"\F0BE9"}.mdi-airballoon:before{content:"\F001C"}.mdi-airballoon-outline:before{content:"\F100B"}.mdi-airplane:before{content:"\F001D"}.mdi-airplane-landing:before{content:"\F05D4"}.mdi-airplane-off:before{content:"\F001E"}.mdi-airplane-takeoff:before{content:"\F05D5"}.mdi-airport:before{content:"\F084B"}.mdi-alarm:before{content:"\F0020"}.mdi-alarm-bell:before{content:"\F078E"}.mdi-alarm-check:before{content:"\F0021"}.mdi-alarm-light:before{content:"\F078F"}.mdi-alarm-light-off:before{content:"\F171E"}.mdi-alarm-light-off-outline:before{content:"\F171F"}.mdi-alarm-light-outline:before{content:"\F0BEA"}.mdi-alarm-multiple:before{content:"\F0022"}.mdi-alarm-note:before{content:"\F0E71"}.mdi-alarm-note-off:before{content:"\F0E72"}.mdi-alarm-off:before{content:"\F0023"}.mdi-alarm-panel:before{content:"\F15C4"}.mdi-alarm-panel-outline:before{content:"\F15C5"}.mdi-alarm-plus:before{content:"\F0024"}.mdi-alarm-snooze:before{content:"\F068E"}.mdi-album:before{content:"\F0025"}.mdi-alert:before{content:"\F0026"}.mdi-alert-box:before{content:"\F0027"}.mdi-alert-box-outline:before{content:"\F0CE4"}.mdi-alert-circle:before{content:"\F0028"}.mdi-alert-circle-check:before{content:"\F11ED"}.mdi-alert-circle-check-outline:before{content:"\F11EE"}.mdi-alert-circle-outline:before{content:"\F05D6"}.mdi-alert-decagram:before{content:"\F06BD"}.mdi-alert-decagram-outline:before{content:"\F0CE5"}.mdi-alert-minus:before{content:"\F14BB"}.mdi-alert-minus-outline:before{content:"\F14BE"}.mdi-alert-octagon:before{content:"\F0029"}.mdi-alert-octagon-outline:before{content:"\F0CE6"}.mdi-alert-octagram:before{content:"\F0767"}.mdi-alert-octagram-outline:before{content:"\F0CE7"}.mdi-alert-outline:before{content:"\F002A"}.mdi-alert-plus:before{content:"\F14BA"}.mdi-alert-plus-outline:before{content:"\F14BD"}.mdi-alert-remove:before{content:"\F14BC"}.mdi-alert-remove-outline:before{content:"\F14BF"}.mdi-alert-rhombus:before{content:"\F11CE"}.mdi-alert-rhombus-outline:before{content:"\F11CF"}.mdi-alien:before{content:"\F089A"}.mdi-alien-outline:before{content:"\F10CB"}.mdi-align-horizontal-center:before{content:"\F11C3"}.mdi-align-horizontal-left:before{content:"\F11C2"}.mdi-align-horizontal-right:before{content:"\F11C4"}.mdi-align-vertical-bottom:before{content:"\F11C5"}.mdi-align-vertical-center:before{content:"\F11C6"}.mdi-align-vertical-top:before{content:"\F11C7"}.mdi-all-inclusive:before{content:"\F06BE"}.mdi-allergy:before{content:"\F1258"}.mdi-alpha:before{content:"\F002B"}.mdi-alpha-a:before{content:"\F0AEE"}.mdi-alpha-a-box:before{content:"\F0B08"}.mdi-alpha-a-box-outline:before{content:"\F0BEB"}.mdi-alpha-a-circle:before{content:"\F0BEC"}.mdi-alpha-a-circle-outline:before{content:"\F0BED"}.mdi-alpha-b:before{content:"\F0AEF"}.mdi-alpha-b-box:before{content:"\F0B09"}.mdi-alpha-b-box-outline:before{content:"\F0BEE"}.mdi-alpha-b-circle:before{content:"\F0BEF"}.mdi-alpha-b-circle-outline:before{content:"\F0BF0"}.mdi-alpha-c:before{content:"\F0AF0"}.mdi-alpha-c-box:before{content:"\F0B0A"}.mdi-alpha-c-box-outline:before{content:"\F0BF1"}.mdi-alpha-c-circle:before{content:"\F0BF2"}.mdi-alpha-c-circle-outline:before{content:"\F0BF3"}.mdi-alpha-d:before{content:"\F0AF1"}.mdi-alpha-d-box:before{content:"\F0B0B"}.mdi-alpha-d-box-outline:before{content:"\F0BF4"}.mdi-alpha-d-circle:before{content:"\F0BF5"}.mdi-alpha-d-circle-outline:before{content:"\F0BF6"}.mdi-alpha-e:before{content:"\F0AF2"}.mdi-alpha-e-box:before{content:"\F0B0C"}.mdi-alpha-e-box-outline:before{content:"\F0BF7"}.mdi-alpha-e-circle:before{content:"\F0BF8"}.mdi-alpha-e-circle-outline:before{content:"\F0BF9"}.mdi-alpha-f:before{content:"\F0AF3"}.mdi-alpha-f-box:before{content:"\F0B0D"}.mdi-alpha-f-box-outline:before{content:"\F0BFA"}.mdi-alpha-f-circle:before{content:"\F0BFB"}.mdi-alpha-f-circle-outline:before{content:"\F0BFC"}.mdi-alpha-g:before{content:"\F0AF4"}.mdi-alpha-g-box:before{content:"\F0B0E"}.mdi-alpha-g-box-outline:before{content:"\F0BFD"}.mdi-alpha-g-circle:before{content:"\F0BFE"}.mdi-alpha-g-circle-outline:before{content:"\F0BFF"}.mdi-alpha-h:before{content:"\F0AF5"}.mdi-alpha-h-box:before{content:"\F0B0F"}.mdi-alpha-h-box-outline:before{content:"\F0C00"}.mdi-alpha-h-circle:before{content:"\F0C01"}.mdi-alpha-h-circle-outline:before{content:"\F0C02"}.mdi-alpha-i:before{content:"\F0AF6"}.mdi-alpha-i-box:before{content:"\F0B10"}.mdi-alpha-i-box-outline:before{content:"\F0C03"}.mdi-alpha-i-circle:before{content:"\F0C04"}.mdi-alpha-i-circle-outline:before{content:"\F0C05"}.mdi-alpha-j:before{content:"\F0AF7"}.mdi-alpha-j-box:before{content:"\F0B11"}.mdi-alpha-j-box-outline:before{content:"\F0C06"}.mdi-alpha-j-circle:before{content:"\F0C07"}.mdi-alpha-j-circle-outline:before{content:"\F0C08"}.mdi-alpha-k:before{content:"\F0AF8"}.mdi-alpha-k-box:before{content:"\F0B12"}.mdi-alpha-k-box-outline:before{content:"\F0C09"}.mdi-alpha-k-circle:before{content:"\F0C0A"}.mdi-alpha-k-circle-outline:before{content:"\F0C0B"}.mdi-alpha-l:before{content:"\F0AF9"}.mdi-alpha-l-box:before{content:"\F0B13"}.mdi-alpha-l-box-outline:before{content:"\F0C0C"}.mdi-alpha-l-circle:before{content:"\F0C0D"}.mdi-alpha-l-circle-outline:before{content:"\F0C0E"}.mdi-alpha-m:before{content:"\F0AFA"}.mdi-alpha-m-box:before{content:"\F0B14"}.mdi-alpha-m-box-outline:before{content:"\F0C0F"}.mdi-alpha-m-circle:before{content:"\F0C10"}.mdi-alpha-m-circle-outline:before{content:"\F0C11"}.mdi-alpha-n:before{content:"\F0AFB"}.mdi-alpha-n-box:before{content:"\F0B15"}.mdi-alpha-n-box-outline:before{content:"\F0C12"}.mdi-alpha-n-circle:before{content:"\F0C13"}.mdi-alpha-n-circle-outline:before{content:"\F0C14"}.mdi-alpha-o:before{content:"\F0AFC"}.mdi-alpha-o-box:before{content:"\F0B16"}.mdi-alpha-o-box-outline:before{content:"\F0C15"}.mdi-alpha-o-circle:before{content:"\F0C16"}.mdi-alpha-o-circle-outline:before{content:"\F0C17"}.mdi-alpha-p:before{content:"\F0AFD"}.mdi-alpha-p-box:before{content:"\F0B17"}.mdi-alpha-p-box-outline:before{content:"\F0C18"}.mdi-alpha-p-circle:before{content:"\F0C19"}.mdi-alpha-p-circle-outline:before{content:"\F0C1A"}.mdi-alpha-q:before{content:"\F0AFE"}.mdi-alpha-q-box:before{content:"\F0B18"}.mdi-alpha-q-box-outline:before{content:"\F0C1B"}.mdi-alpha-q-circle:before{content:"\F0C1C"}.mdi-alpha-q-circle-outline:before{content:"\F0C1D"}.mdi-alpha-r:before{content:"\F0AFF"}.mdi-alpha-r-box:before{content:"\F0B19"}.mdi-alpha-r-box-outline:before{content:"\F0C1E"}.mdi-alpha-r-circle:before{content:"\F0C1F"}.mdi-alpha-r-circle-outline:before{content:"\F0C20"}.mdi-alpha-s:before{content:"\F0B00"}.mdi-alpha-s-box:before{content:"\F0B1A"}.mdi-alpha-s-box-outline:before{content:"\F0C21"}.mdi-alpha-s-circle:before{content:"\F0C22"}.mdi-alpha-s-circle-outline:before{content:"\F0C23"}.mdi-alpha-t:before{content:"\F0B01"}.mdi-alpha-t-box:before{content:"\F0B1B"}.mdi-alpha-t-box-outline:before{content:"\F0C24"}.mdi-alpha-t-circle:before{content:"\F0C25"}.mdi-alpha-t-circle-outline:before{content:"\F0C26"}.mdi-alpha-u:before{content:"\F0B02"}.mdi-alpha-u-box:before{content:"\F0B1C"}.mdi-alpha-u-box-outline:before{content:"\F0C27"}.mdi-alpha-u-circle:before{content:"\F0C28"}.mdi-alpha-u-circle-outline:before{content:"\F0C29"}.mdi-alpha-v:before{content:"\F0B03"}.mdi-alpha-v-box:before{content:"\F0B1D"}.mdi-alpha-v-box-outline:before{content:"\F0C2A"}.mdi-alpha-v-circle:before{content:"\F0C2B"}.mdi-alpha-v-circle-outline:before{content:"\F0C2C"}.mdi-alpha-w:before{content:"\F0B04"}.mdi-alpha-w-box:before{content:"\F0B1E"}.mdi-alpha-w-box-outline:before{content:"\F0C2D"}.mdi-alpha-w-circle:before{content:"\F0C2E"}.mdi-alpha-w-circle-outline:before{content:"\F0C2F"}.mdi-alpha-x:before{content:"\F0B05"}.mdi-alpha-x-box:before{content:"\F0B1F"}.mdi-alpha-x-box-outline:before{content:"\F0C30"}.mdi-alpha-x-circle:before{content:"\F0C31"}.mdi-alpha-x-circle-outline:before{content:"\F0C32"}.mdi-alpha-y:before{content:"\F0B06"}.mdi-alpha-y-box:before{content:"\F0B20"}.mdi-alpha-y-box-outline:before{content:"\F0C33"}.mdi-alpha-y-circle:before{content:"\F0C34"}.mdi-alpha-y-circle-outline:before{content:"\F0C35"}.mdi-alpha-z:before{content:"\F0B07"}.mdi-alpha-z-box:before{content:"\F0B21"}.mdi-alpha-z-box-outline:before{content:"\F0C36"}.mdi-alpha-z-circle:before{content:"\F0C37"}.mdi-alpha-z-circle-outline:before{content:"\F0C38"}.mdi-alphabet-aurebesh:before{content:"\F132C"}.mdi-alphabet-cyrillic:before{content:"\F132D"}.mdi-alphabet-greek:before{content:"\F132E"}.mdi-alphabet-latin:before{content:"\F132F"}.mdi-alphabet-piqad:before{content:"\F1330"}.mdi-alphabet-tengwar:before{content:"\F1337"}.mdi-alphabetical:before{content:"\F002C"}.mdi-alphabetical-off:before{content:"\F100C"}.mdi-alphabetical-variant:before{content:"\F100D"}.mdi-alphabetical-variant-off:before{content:"\F100E"}.mdi-altimeter:before{content:"\F05D7"}.mdi-amazon:before{content:"\F002D"}.mdi-amazon-alexa:before{content:"\F08C6"}.mdi-ambulance:before{content:"\F002F"}.mdi-ammunition:before{content:"\F0CE8"}.mdi-ampersand:before{content:"\F0A8D"}.mdi-amplifier:before{content:"\F0030"}.mdi-amplifier-off:before{content:"\F11B5"}.mdi-anchor:before{content:"\F0031"}.mdi-android:before{content:"\F0032"}.mdi-android-auto:before{content:"\F0A8E"}.mdi-android-debug-bridge:before{content:"\F0033"}.mdi-android-messages:before{content:"\F0D45"}.mdi-android-studio:before{content:"\F0034"}.mdi-angle-acute:before{content:"\F0937"}.mdi-angle-obtuse:before{content:"\F0938"}.mdi-angle-right:before{content:"\F0939"}.mdi-angular:before{content:"\F06B2"}.mdi-angularjs:before{content:"\F06BF"}.mdi-animation:before{content:"\F05D8"}.mdi-animation-outline:before{content:"\F0A8F"}.mdi-animation-play:before{content:"\F093A"}.mdi-animation-play-outline:before{content:"\F0A90"}.mdi-ansible:before{content:"\F109A"}.mdi-antenna:before{content:"\F1119"}.mdi-anvil:before{content:"\F089B"}.mdi-apache-kafka:before{content:"\F100F"}.mdi-api:before{content:"\F109B"}.mdi-api-off:before{content:"\F1257"}.mdi-apple:before{content:"\F0035"}.mdi-apple-airplay:before{content:"\F001F"}.mdi-apple-finder:before{content:"\F0036"}.mdi-apple-icloud:before{content:"\F0038"}.mdi-apple-ios:before{content:"\F0037"}.mdi-apple-keyboard-caps:before{content:"\F0632"}.mdi-apple-keyboard-command:before{content:"\F0633"}.mdi-apple-keyboard-control:before{content:"\F0634"}.mdi-apple-keyboard-option:before{content:"\F0635"}.mdi-apple-keyboard-shift:before{content:"\F0636"}.mdi-apple-safari:before{content:"\F0039"}.mdi-application:before{content:"\F0614"}.mdi-application-cog:before{content:"\F1577"}.mdi-application-export:before{content:"\F0DAD"}.mdi-application-import:before{content:"\F0DAE"}.mdi-application-settings:before{content:"\F1555"}.mdi-approximately-equal:before{content:"\F0F9E"}.mdi-approximately-equal-box:before{content:"\F0F9F"}.mdi-apps:before{content:"\F003B"}.mdi-apps-box:before{content:"\F0D46"}.mdi-arch:before{content:"\F08C7"}.mdi-archive:before{content:"\F003C"}.mdi-archive-alert:before{content:"\F14FD"}.mdi-archive-alert-outline:before{content:"\F14FE"}.mdi-archive-arrow-down:before{content:"\F1259"}.mdi-archive-arrow-down-outline:before{content:"\F125A"}.mdi-archive-arrow-up:before{content:"\F125B"}.mdi-archive-arrow-up-outline:before{content:"\F125C"}.mdi-archive-outline:before{content:"\F120E"}.mdi-arm-flex:before{content:"\F0FD7"}.mdi-arm-flex-outline:before{content:"\F0FD6"}.mdi-arrange-bring-forward:before{content:"\F003D"}.mdi-arrange-bring-to-front:before{content:"\F003E"}.mdi-arrange-send-backward:before{content:"\F003F"}.mdi-arrange-send-to-back:before{content:"\F0040"}.mdi-arrow-all:before{content:"\F0041"}.mdi-arrow-bottom-left:before{content:"\F0042"}.mdi-arrow-bottom-left-bold-outline:before{content:"\F09B7"}.mdi-arrow-bottom-left-thick:before{content:"\F09B8"}.mdi-arrow-bottom-left-thin-circle-outline:before{content:"\F1596"}.mdi-arrow-bottom-right:before{content:"\F0043"}.mdi-arrow-bottom-right-bold-outline:before{content:"\F09B9"}.mdi-arrow-bottom-right-thick:before{content:"\F09BA"}.mdi-arrow-bottom-right-thin-circle-outline:before{content:"\F1595"}.mdi-arrow-collapse:before{content:"\F0615"}.mdi-arrow-collapse-all:before{content:"\F0044"}.mdi-arrow-collapse-down:before{content:"\F0792"}.mdi-arrow-collapse-horizontal:before{content:"\F084C"}.mdi-arrow-collapse-left:before{content:"\F0793"}.mdi-arrow-collapse-right:before{content:"\F0794"}.mdi-arrow-collapse-up:before{content:"\F0795"}.mdi-arrow-collapse-vertical:before{content:"\F084D"}.mdi-arrow-decision:before{content:"\F09BB"}.mdi-arrow-decision-auto:before{content:"\F09BC"}.mdi-arrow-decision-auto-outline:before{content:"\F09BD"}.mdi-arrow-decision-outline:before{content:"\F09BE"}.mdi-arrow-down:before{content:"\F0045"}.mdi-arrow-down-bold:before{content:"\F072E"}.mdi-arrow-down-bold-box:before{content:"\F072F"}.mdi-arrow-down-bold-box-outline:before{content:"\F0730"}.mdi-arrow-down-bold-circle:before{content:"\F0047"}.mdi-arrow-down-bold-circle-outline:before{content:"\F0048"}.mdi-arrow-down-bold-hexagon-outline:before{content:"\F0049"}.mdi-arrow-down-bold-outline:before{content:"\F09BF"}.mdi-arrow-down-box:before{content:"\F06C0"}.mdi-arrow-down-circle:before{content:"\F0CDB"}.mdi-arrow-down-circle-outline:before{content:"\F0CDC"}.mdi-arrow-down-drop-circle:before{content:"\F004A"}.mdi-arrow-down-drop-circle-outline:before{content:"\F004B"}.mdi-arrow-down-thick:before{content:"\F0046"}.mdi-arrow-down-thin-circle-outline:before{content:"\F1599"}.mdi-arrow-expand:before{content:"\F0616"}.mdi-arrow-expand-all:before{content:"\F004C"}.mdi-arrow-expand-down:before{content:"\F0796"}.mdi-arrow-expand-horizontal:before{content:"\F084E"}.mdi-arrow-expand-left:before{content:"\F0797"}.mdi-arrow-expand-right:before{content:"\F0798"}.mdi-arrow-expand-up:before{content:"\F0799"}.mdi-arrow-expand-vertical:before{content:"\F084F"}.mdi-arrow-horizontal-lock:before{content:"\F115B"}.mdi-arrow-left:before{content:"\F004D"}.mdi-arrow-left-bold:before{content:"\F0731"}.mdi-arrow-left-bold-box:before{content:"\F0732"}.mdi-arrow-left-bold-box-outline:before{content:"\F0733"}.mdi-arrow-left-bold-circle:before{content:"\F004F"}.mdi-arrow-left-bold-circle-outline:before{content:"\F0050"}.mdi-arrow-left-bold-hexagon-outline:before{content:"\F0051"}.mdi-arrow-left-bold-outline:before{content:"\F09C0"}.mdi-arrow-left-box:before{content:"\F06C1"}.mdi-arrow-left-circle:before{content:"\F0CDD"}.mdi-arrow-left-circle-outline:before{content:"\F0CDE"}.mdi-arrow-left-drop-circle:before{content:"\F0052"}.mdi-arrow-left-drop-circle-outline:before{content:"\F0053"}.mdi-arrow-left-right:before{content:"\F0E73"}.mdi-arrow-left-right-bold:before{content:"\F0E74"}.mdi-arrow-left-right-bold-outline:before{content:"\F09C1"}.mdi-arrow-left-thick:before{content:"\F004E"}.mdi-arrow-left-thin-circle-outline:before{content:"\F159A"}.mdi-arrow-right:before{content:"\F0054"}.mdi-arrow-right-bold:before{content:"\F0734"}.mdi-arrow-right-bold-box:before{content:"\F0735"}.mdi-arrow-right-bold-box-outline:before{content:"\F0736"}.mdi-arrow-right-bold-circle:before{content:"\F0056"}.mdi-arrow-right-bold-circle-outline:before{content:"\F0057"}.mdi-arrow-right-bold-hexagon-outline:before{content:"\F0058"}.mdi-arrow-right-bold-outline:before{content:"\F09C2"}.mdi-arrow-right-box:before{content:"\F06C2"}.mdi-arrow-right-circle:before{content:"\F0CDF"}.mdi-arrow-right-circle-outline:before{content:"\F0CE0"}.mdi-arrow-right-drop-circle:before{content:"\F0059"}.mdi-arrow-right-drop-circle-outline:before{content:"\F005A"}.mdi-arrow-right-thick:before{content:"\F0055"}.mdi-arrow-right-thin-circle-outline:before{content:"\F1598"}.mdi-arrow-split-horizontal:before{content:"\F093B"}.mdi-arrow-split-vertical:before{content:"\F093C"}.mdi-arrow-top-left:before{content:"\F005B"}.mdi-arrow-top-left-bold-outline:before{content:"\F09C3"}.mdi-arrow-top-left-bottom-right:before{content:"\F0E75"}.mdi-arrow-top-left-bottom-right-bold:before{content:"\F0E76"}.mdi-arrow-top-left-thick:before{content:"\F09C4"}.mdi-arrow-top-left-thin-circle-outline:before{content:"\F1593"}.mdi-arrow-top-right:before{content:"\F005C"}.mdi-arrow-top-right-bold-outline:before{content:"\F09C5"}.mdi-arrow-top-right-bottom-left:before{content:"\F0E77"}.mdi-arrow-top-right-bottom-left-bold:before{content:"\F0E78"}.mdi-arrow-top-right-thick:before{content:"\F09C6"}.mdi-arrow-top-right-thin-circle-outline:before{content:"\F1594"}.mdi-arrow-up:before{content:"\F005D"}.mdi-arrow-up-bold:before{content:"\F0737"}.mdi-arrow-up-bold-box:before{content:"\F0738"}.mdi-arrow-up-bold-box-outline:before{content:"\F0739"}.mdi-arrow-up-bold-circle:before{content:"\F005F"}.mdi-arrow-up-bold-circle-outline:before{content:"\F0060"}.mdi-arrow-up-bold-hexagon-outline:before{content:"\F0061"}.mdi-arrow-up-bold-outline:before{content:"\F09C7"}.mdi-arrow-up-box:before{content:"\F06C3"}.mdi-arrow-up-circle:before{content:"\F0CE1"}.mdi-arrow-up-circle-outline:before{content:"\F0CE2"}.mdi-arrow-up-down:before{content:"\F0E79"}.mdi-arrow-up-down-bold:before{content:"\F0E7A"}.mdi-arrow-up-down-bold-outline:before{content:"\F09C8"}.mdi-arrow-up-drop-circle:before{content:"\F0062"}.mdi-arrow-up-drop-circle-outline:before{content:"\F0063"}.mdi-arrow-up-thick:before{content:"\F005E"}.mdi-arrow-up-thin-circle-outline:before{content:"\F1597"}.mdi-arrow-vertical-lock:before{content:"\F115C"}.mdi-artstation:before{content:"\F0B5B"}.mdi-aspect-ratio:before{content:"\F0A24"}.mdi-assistant:before{content:"\F0064"}.mdi-asterisk:before{content:"\F06C4"}.mdi-at:before{content:"\F0065"}.mdi-atlassian:before{content:"\F0804"}.mdi-atm:before{content:"\F0D47"}.mdi-atom:before{content:"\F0768"}.mdi-atom-variant:before{content:"\F0E7B"}.mdi-attachment:before{content:"\F0066"}.mdi-audio-video:before{content:"\F093D"}.mdi-audio-video-off:before{content:"\F11B6"}.mdi-augmented-reality:before{content:"\F0850"}.mdi-auto-download:before{content:"\F137E"}.mdi-auto-fix:before{content:"\F0068"}.mdi-auto-upload:before{content:"\F0069"}.mdi-autorenew:before{content:"\F006A"}.mdi-av-timer:before{content:"\F006B"}.mdi-aws:before{content:"\F0E0F"}.mdi-axe:before{content:"\F08C8"}.mdi-axis:before{content:"\F0D48"}.mdi-axis-arrow:before{content:"\F0D49"}.mdi-axis-arrow-info:before{content:"\F140E"}.mdi-axis-arrow-lock:before{content:"\F0D4A"}.mdi-axis-lock:before{content:"\F0D4B"}.mdi-axis-x-arrow:before{content:"\F0D4C"}.mdi-axis-x-arrow-lock:before{content:"\F0D4D"}.mdi-axis-x-rotate-clockwise:before{content:"\F0D4E"}.mdi-axis-x-rotate-counterclockwise:before{content:"\F0D4F"}.mdi-axis-x-y-arrow-lock:before{content:"\F0D50"}.mdi-axis-y-arrow:before{content:"\F0D51"}.mdi-axis-y-arrow-lock:before{content:"\F0D52"}.mdi-axis-y-rotate-clockwise:before{content:"\F0D53"}.mdi-axis-y-rotate-counterclockwise:before{content:"\F0D54"}.mdi-axis-z-arrow:before{content:"\F0D55"}.mdi-axis-z-arrow-lock:before{content:"\F0D56"}.mdi-axis-z-rotate-clockwise:before{content:"\F0D57"}.mdi-axis-z-rotate-counterclockwise:before{content:"\F0D58"}.mdi-babel:before{content:"\F0A25"}.mdi-baby:before{content:"\F006C"}.mdi-baby-bottle:before{content:"\F0F39"}.mdi-baby-bottle-outline:before{content:"\F0F3A"}.mdi-baby-buggy:before{content:"\F13E0"}.mdi-baby-carriage:before{content:"\F068F"}.mdi-baby-carriage-off:before{content:"\F0FA0"}.mdi-baby-face:before{content:"\F0E7C"}.mdi-baby-face-outline:before{content:"\F0E7D"}.mdi-backburger:before{content:"\F006D"}.mdi-backspace:before{content:"\F006E"}.mdi-backspace-outline:before{content:"\F0B5C"}.mdi-backspace-reverse:before{content:"\F0E7E"}.mdi-backspace-reverse-outline:before{content:"\F0E7F"}.mdi-backup-restore:before{content:"\F006F"}.mdi-bacteria:before{content:"\F0ED5"}.mdi-bacteria-outline:before{content:"\F0ED6"}.mdi-badge-account:before{content:"\F0DA7"}.mdi-badge-account-alert:before{content:"\F0DA8"}.mdi-badge-account-alert-outline:before{content:"\F0DA9"}.mdi-badge-account-horizontal:before{content:"\F0E0D"}.mdi-badge-account-horizontal-outline:before{content:"\F0E0E"}.mdi-badge-account-outline:before{content:"\F0DAA"}.mdi-badminton:before{content:"\F0851"}.mdi-bag-carry-on:before{content:"\F0F3B"}.mdi-bag-carry-on-check:before{content:"\F0D65"}.mdi-bag-carry-on-off:before{content:"\F0F3C"}.mdi-bag-checked:before{content:"\F0F3D"}.mdi-bag-personal:before{content:"\F0E10"}.mdi-bag-personal-off:before{content:"\F0E11"}.mdi-bag-personal-off-outline:before{content:"\F0E12"}.mdi-bag-personal-outline:before{content:"\F0E13"}.mdi-bag-suitcase:before{content:"\F158B"}.mdi-bag-suitcase-off:before{content:"\F158D"}.mdi-bag-suitcase-off-outline:before{content:"\F158E"}.mdi-bag-suitcase-outline:before{content:"\F158C"}.mdi-baguette:before{content:"\F0F3E"}.mdi-balloon:before{content:"\F0A26"}.mdi-ballot:before{content:"\F09C9"}.mdi-ballot-outline:before{content:"\F09CA"}.mdi-ballot-recount:before{content:"\F0C39"}.mdi-ballot-recount-outline:before{content:"\F0C3A"}.mdi-bandage:before{content:"\F0DAF"}.mdi-bandcamp:before{content:"\F0675"}.mdi-bank:before{content:"\F0070"}.mdi-bank-check:before{content:"\F1655"}.mdi-bank-minus:before{content:"\F0DB0"}.mdi-bank-off:before{content:"\F1656"}.mdi-bank-off-outline:before{content:"\F1657"}.mdi-bank-outline:before{content:"\F0E80"}.mdi-bank-plus:before{content:"\F0DB1"}.mdi-bank-remove:before{content:"\F0DB2"}.mdi-bank-transfer:before{content:"\F0A27"}.mdi-bank-transfer-in:before{content:"\F0A28"}.mdi-bank-transfer-out:before{content:"\F0A29"}.mdi-barcode:before{content:"\F0071"}.mdi-barcode-off:before{content:"\F1236"}.mdi-barcode-scan:before{content:"\F0072"}.mdi-barley:before{content:"\F0073"}.mdi-barley-off:before{content:"\F0B5D"}.mdi-barn:before{content:"\F0B5E"}.mdi-barrel:before{content:"\F0074"}.mdi-baseball:before{content:"\F0852"}.mdi-baseball-bat:before{content:"\F0853"}.mdi-baseball-diamond:before{content:"\F15EC"}.mdi-baseball-diamond-outline:before{content:"\F15ED"}.mdi-bash:before{content:"\F1183"}.mdi-basket:before{content:"\F0076"}.mdi-basket-fill:before{content:"\F0077"}.mdi-basket-minus:before{content:"\F1523"}.mdi-basket-minus-outline:before{content:"\F1524"}.mdi-basket-off:before{content:"\F1525"}.mdi-basket-off-outline:before{content:"\F1526"}.mdi-basket-outline:before{content:"\F1181"}.mdi-basket-plus:before{content:"\F1527"}.mdi-basket-plus-outline:before{content:"\F1528"}.mdi-basket-remove:before{content:"\F1529"}.mdi-basket-remove-outline:before{content:"\F152A"}.mdi-basket-unfill:before{content:"\F0078"}.mdi-basketball:before{content:"\F0806"}.mdi-basketball-hoop:before{content:"\F0C3B"}.mdi-basketball-hoop-outline:before{content:"\F0C3C"}.mdi-bat:before{content:"\F0B5F"}.mdi-battery:before{content:"\F0079"}.mdi-battery-10:before{content:"\F007A"}.mdi-battery-10-bluetooth:before{content:"\F093E"}.mdi-battery-20:before{content:"\F007B"}.mdi-battery-20-bluetooth:before{content:"\F093F"}.mdi-battery-30:before{content:"\F007C"}.mdi-battery-30-bluetooth:before{content:"\F0940"}.mdi-battery-40:before{content:"\F007D"}.mdi-battery-40-bluetooth:before{content:"\F0941"}.mdi-battery-50:before{content:"\F007E"}.mdi-battery-50-bluetooth:before{content:"\F0942"}.mdi-battery-60:before{content:"\F007F"}.mdi-battery-60-bluetooth:before{content:"\F0943"}.mdi-battery-70:before{content:"\F0080"}.mdi-battery-70-bluetooth:before{content:"\F0944"}.mdi-battery-80:before{content:"\F0081"}.mdi-battery-80-bluetooth:before{content:"\F0945"}.mdi-battery-90:before{content:"\F0082"}.mdi-battery-90-bluetooth:before{content:"\F0946"}.mdi-battery-alert:before{content:"\F0083"}.mdi-battery-alert-bluetooth:before{content:"\F0947"}.mdi-battery-alert-variant:before{content:"\F10CC"}.mdi-battery-alert-variant-outline:before{content:"\F10CD"}.mdi-battery-bluetooth:before{content:"\F0948"}.mdi-battery-bluetooth-variant:before{content:"\F0949"}.mdi-battery-charging:before{content:"\F0084"}.mdi-battery-charging-10:before{content:"\F089C"}.mdi-battery-charging-100:before{content:"\F0085"}.mdi-battery-charging-20:before{content:"\F0086"}.mdi-battery-charging-30:before{content:"\F0087"}.mdi-battery-charging-40:before{content:"\F0088"}.mdi-battery-charging-50:before{content:"\F089D"}.mdi-battery-charging-60:before{content:"\F0089"}.mdi-battery-charging-70:before{content:"\F089E"}.mdi-battery-charging-80:before{content:"\F008A"}.mdi-battery-charging-90:before{content:"\F008B"}.mdi-battery-charging-high:before{content:"\F12A6"}.mdi-battery-charging-low:before{content:"\F12A4"}.mdi-battery-charging-medium:before{content:"\F12A5"}.mdi-battery-charging-outline:before{content:"\F089F"}.mdi-battery-charging-wireless:before{content:"\F0807"}.mdi-battery-charging-wireless-10:before{content:"\F0808"}.mdi-battery-charging-wireless-20:before{content:"\F0809"}.mdi-battery-charging-wireless-30:before{content:"\F080A"}.mdi-battery-charging-wireless-40:before{content:"\F080B"}.mdi-battery-charging-wireless-50:before{content:"\F080C"}.mdi-battery-charging-wireless-60:before{content:"\F080D"}.mdi-battery-charging-wireless-70:before{content:"\F080E"}.mdi-battery-charging-wireless-80:before{content:"\F080F"}.mdi-battery-charging-wireless-90:before{content:"\F0810"}.mdi-battery-charging-wireless-alert:before{content:"\F0811"}.mdi-battery-charging-wireless-outline:before{content:"\F0812"}.mdi-battery-heart:before{content:"\F120F"}.mdi-battery-heart-outline:before{content:"\F1210"}.mdi-battery-heart-variant:before{content:"\F1211"}.mdi-battery-high:before{content:"\F12A3"}.mdi-battery-low:before{content:"\F12A1"}.mdi-battery-medium:before{content:"\F12A2"}.mdi-battery-minus:before{content:"\F008C"}.mdi-battery-negative:before{content:"\F008D"}.mdi-battery-off:before{content:"\F125D"}.mdi-battery-off-outline:before{content:"\F125E"}.mdi-battery-outline:before{content:"\F008E"}.mdi-battery-plus:before{content:"\F008F"}.mdi-battery-positive:before{content:"\F0090"}.mdi-battery-unknown:before{content:"\F0091"}.mdi-battery-unknown-bluetooth:before{content:"\F094A"}.mdi-battlenet:before{content:"\F0B60"}.mdi-beach:before{content:"\F0092"}.mdi-beaker:before{content:"\F0CEA"}.mdi-beaker-alert:before{content:"\F1229"}.mdi-beaker-alert-outline:before{content:"\F122A"}.mdi-beaker-check:before{content:"\F122B"}.mdi-beaker-check-outline:before{content:"\F122C"}.mdi-beaker-minus:before{content:"\F122D"}.mdi-beaker-minus-outline:before{content:"\F122E"}.mdi-beaker-outline:before{content:"\F0690"}.mdi-beaker-plus:before{content:"\F122F"}.mdi-beaker-plus-outline:before{content:"\F1230"}.mdi-beaker-question:before{content:"\F1231"}.mdi-beaker-question-outline:before{content:"\F1232"}.mdi-beaker-remove:before{content:"\F1233"}.mdi-beaker-remove-outline:before{content:"\F1234"}.mdi-bed:before{content:"\F02E3"}.mdi-bed-double:before{content:"\F0FD4"}.mdi-bed-double-outline:before{content:"\F0FD3"}.mdi-bed-empty:before{content:"\F08A0"}.mdi-bed-king:before{content:"\F0FD2"}.mdi-bed-king-outline:before{content:"\F0FD1"}.mdi-bed-outline:before{content:"\F0099"}.mdi-bed-queen:before{content:"\F0FD0"}.mdi-bed-queen-outline:before{content:"\F0FDB"}.mdi-bed-single:before{content:"\F106D"}.mdi-bed-single-outline:before{content:"\F106E"}.mdi-bee:before{content:"\F0FA1"}.mdi-bee-flower:before{content:"\F0FA2"}.mdi-beehive-off-outline:before{content:"\F13ED"}.mdi-beehive-outline:before{content:"\F10CE"}.mdi-beekeeper:before{content:"\F14E2"}.mdi-beer:before{content:"\F0098"}.mdi-beer-outline:before{content:"\F130C"}.mdi-bell:before{content:"\F009A"}.mdi-bell-alert:before{content:"\F0D59"}.mdi-bell-alert-outline:before{content:"\F0E81"}.mdi-bell-cancel:before{content:"\F13E7"}.mdi-bell-cancel-outline:before{content:"\F13E8"}.mdi-bell-check:before{content:"\F11E5"}.mdi-bell-check-outline:before{content:"\F11E6"}.mdi-bell-circle:before{content:"\F0D5A"}.mdi-bell-circle-outline:before{content:"\F0D5B"}.mdi-bell-minus:before{content:"\F13E9"}.mdi-bell-minus-outline:before{content:"\F13EA"}.mdi-bell-off:before{content:"\F009B"}.mdi-bell-off-outline:before{content:"\F0A91"}.mdi-bell-outline:before{content:"\F009C"}.mdi-bell-plus:before{content:"\F009D"}.mdi-bell-plus-outline:before{content:"\F0A92"}.mdi-bell-remove:before{content:"\F13EB"}.mdi-bell-remove-outline:before{content:"\F13EC"}.mdi-bell-ring:before{content:"\F009E"}.mdi-bell-ring-outline:before{content:"\F009F"}.mdi-bell-sleep:before{content:"\F00A0"}.mdi-bell-sleep-outline:before{content:"\F0A93"}.mdi-beta:before{content:"\F00A1"}.mdi-betamax:before{content:"\F09CB"}.mdi-biathlon:before{content:"\F0E14"}.mdi-bicycle:before{content:"\F109C"}.mdi-bicycle-basket:before{content:"\F1235"}.mdi-bicycle-electric:before{content:"\F15B4"}.mdi-bicycle-penny-farthing:before{content:"\F15E9"}.mdi-bike:before{content:"\F00A3"}.mdi-bike-fast:before{content:"\F111F"}.mdi-billboard:before{content:"\F1010"}.mdi-billiards:before{content:"\F0B61"}.mdi-billiards-rack:before{content:"\F0B62"}.mdi-binoculars:before{content:"\F00A5"}.mdi-bio:before{content:"\F00A6"}.mdi-biohazard:before{content:"\F00A7"}.mdi-bird:before{content:"\F15C6"}.mdi-bitbucket:before{content:"\F00A8"}.mdi-bitcoin:before{content:"\F0813"}.mdi-black-mesa:before{content:"\F00A9"}.mdi-blender:before{content:"\F0CEB"}.mdi-blender-software:before{content:"\F00AB"}.mdi-blinds:before{content:"\F00AC"}.mdi-blinds-open:before{content:"\F1011"}.mdi-block-helper:before{content:"\F00AD"}.mdi-blogger:before{content:"\F00AE"}.mdi-blood-bag:before{content:"\F0CEC"}.mdi-bluetooth:before{content:"\F00AF"}.mdi-bluetooth-audio:before{content:"\F00B0"}.mdi-bluetooth-connect:before{content:"\F00B1"}.mdi-bluetooth-off:before{content:"\F00B2"}.mdi-bluetooth-settings:before{content:"\F00B3"}.mdi-bluetooth-transfer:before{content:"\F00B4"}.mdi-blur:before{content:"\F00B5"}.mdi-blur-linear:before{content:"\F00B6"}.mdi-blur-off:before{content:"\F00B7"}.mdi-blur-radial:before{content:"\F00B8"}.mdi-bolnisi-cross:before{content:"\F0CED"}.mdi-bolt:before{content:"\F0DB3"}.mdi-bomb:before{content:"\F0691"}.mdi-bomb-off:before{content:"\F06C5"}.mdi-bone:before{content:"\F00B9"}.mdi-book:before{content:"\F00BA"}.mdi-book-account:before{content:"\F13AD"}.mdi-book-account-outline:before{content:"\F13AE"}.mdi-book-alert:before{content:"\F167C"}.mdi-book-alert-outline:before{content:"\F167D"}.mdi-book-alphabet:before{content:"\F061D"}.mdi-book-arrow-down:before{content:"\F167E"}.mdi-book-arrow-down-outline:before{content:"\F167F"}.mdi-book-arrow-left:before{content:"\F1680"}.mdi-book-arrow-left-outline:before{content:"\F1681"}.mdi-book-arrow-right:before{content:"\F1682"}.mdi-book-arrow-right-outline:before{content:"\F1683"}.mdi-book-arrow-up:before{content:"\F1684"}.mdi-book-arrow-up-outline:before{content:"\F1685"}.mdi-book-cancel:before{content:"\F1686"}.mdi-book-cancel-outline:before{content:"\F1687"}.mdi-book-check:before{content:"\F14F3"}.mdi-book-check-outline:before{content:"\F14F4"}.mdi-book-clock:before{content:"\F1688"}.mdi-book-clock-outline:before{content:"\F1689"}.mdi-book-cog:before{content:"\F168A"}.mdi-book-cog-outline:before{content:"\F168B"}.mdi-book-cross:before{content:"\F00A2"}.mdi-book-edit:before{content:"\F168C"}.mdi-book-edit-outline:before{content:"\F168D"}.mdi-book-education:before{content:"\F16C9"}.mdi-book-education-outline:before{content:"\F16CA"}.mdi-book-information-variant:before{content:"\F106F"}.mdi-book-lock:before{content:"\F079A"}.mdi-book-lock-open:before{content:"\F079B"}.mdi-book-lock-open-outline:before{content:"\F168E"}.mdi-book-lock-outline:before{content:"\F168F"}.mdi-book-marker:before{content:"\F1690"}.mdi-book-marker-outline:before{content:"\F1691"}.mdi-book-minus:before{content:"\F05D9"}.mdi-book-minus-multiple:before{content:"\F0A94"}.mdi-book-minus-multiple-outline:before{content:"\F090B"}.mdi-book-minus-outline:before{content:"\F1692"}.mdi-book-multiple:before{content:"\F00BB"}.mdi-book-multiple-outline:before{content:"\F0436"}.mdi-book-music:before{content:"\F0067"}.mdi-book-music-outline:before{content:"\F1693"}.mdi-book-off:before{content:"\F1694"}.mdi-book-off-outline:before{content:"\F1695"}.mdi-book-open:before{content:"\F00BD"}.mdi-book-open-blank-variant:before{content:"\F00BE"}.mdi-book-open-outline:before{content:"\F0B63"}.mdi-book-open-page-variant:before{content:"\F05DA"}.mdi-book-open-page-variant-outline:before{content:"\F15D6"}.mdi-book-open-variant:before{content:"\F14F7"}.mdi-book-outline:before{content:"\F0B64"}.mdi-book-play:before{content:"\F0E82"}.mdi-book-play-outline:before{content:"\F0E83"}.mdi-book-plus:before{content:"\F05DB"}.mdi-book-plus-multiple:before{content:"\F0A95"}.mdi-book-plus-multiple-outline:before{content:"\F0ADE"}.mdi-book-plus-outline:before{content:"\F1696"}.mdi-book-refresh:before{content:"\F1697"}.mdi-book-refresh-outline:before{content:"\F1698"}.mdi-book-remove:before{content:"\F0A97"}.mdi-book-remove-multiple:before{content:"\F0A96"}.mdi-book-remove-multiple-outline:before{content:"\F04CA"}.mdi-book-remove-outline:before{content:"\F1699"}.mdi-book-search:before{content:"\F0E84"}.mdi-book-search-outline:before{content:"\F0E85"}.mdi-book-settings:before{content:"\F169A"}.mdi-book-settings-outline:before{content:"\F169B"}.mdi-book-sync:before{content:"\F169C"}.mdi-book-sync-outline:before{content:"\F16C8"}.mdi-book-variant:before{content:"\F00BF"}.mdi-book-variant-multiple:before{content:"\F00BC"}.mdi-bookmark:before{content:"\F00C0"}.mdi-bookmark-check:before{content:"\F00C1"}.mdi-bookmark-check-outline:before{content:"\F137B"}.mdi-bookmark-minus:before{content:"\F09CC"}.mdi-bookmark-minus-outline:before{content:"\F09CD"}.mdi-bookmark-multiple:before{content:"\F0E15"}.mdi-bookmark-multiple-outline:before{content:"\F0E16"}.mdi-bookmark-music:before{content:"\F00C2"}.mdi-bookmark-music-outline:before{content:"\F1379"}.mdi-bookmark-off:before{content:"\F09CE"}.mdi-bookmark-off-outline:before{content:"\F09CF"}.mdi-bookmark-outline:before{content:"\F00C3"}.mdi-bookmark-plus:before{content:"\F00C5"}.mdi-bookmark-plus-outline:before{content:"\F00C4"}.mdi-bookmark-remove:before{content:"\F00C6"}.mdi-bookmark-remove-outline:before{content:"\F137A"}.mdi-bookshelf:before{content:"\F125F"}.mdi-boom-gate:before{content:"\F0E86"}.mdi-boom-gate-alert:before{content:"\F0E87"}.mdi-boom-gate-alert-outline:before{content:"\F0E88"}.mdi-boom-gate-down:before{content:"\F0E89"}.mdi-boom-gate-down-outline:before{content:"\F0E8A"}.mdi-boom-gate-outline:before{content:"\F0E8B"}.mdi-boom-gate-up:before{content:"\F0E8C"}.mdi-boom-gate-up-outline:before{content:"\F0E8D"}.mdi-boombox:before{content:"\F05DC"}.mdi-boomerang:before{content:"\F10CF"}.mdi-bootstrap:before{content:"\F06C6"}.mdi-border-all:before{content:"\F00C7"}.mdi-border-all-variant:before{content:"\F08A1"}.mdi-border-bottom:before{content:"\F00C8"}.mdi-border-bottom-variant:before{content:"\F08A2"}.mdi-border-color:before{content:"\F00C9"}.mdi-border-horizontal:before{content:"\F00CA"}.mdi-border-inside:before{content:"\F00CB"}.mdi-border-left:before{content:"\F00CC"}.mdi-border-left-variant:before{content:"\F08A3"}.mdi-border-none:before{content:"\F00CD"}.mdi-border-none-variant:before{content:"\F08A4"}.mdi-border-outside:before{content:"\F00CE"}.mdi-border-right:before{content:"\F00CF"}.mdi-border-right-variant:before{content:"\F08A5"}.mdi-border-style:before{content:"\F00D0"}.mdi-border-top:before{content:"\F00D1"}.mdi-border-top-variant:before{content:"\F08A6"}.mdi-border-vertical:before{content:"\F00D2"}.mdi-bottle-soda:before{content:"\F1070"}.mdi-bottle-soda-classic:before{content:"\F1071"}.mdi-bottle-soda-classic-outline:before{content:"\F1363"}.mdi-bottle-soda-outline:before{content:"\F1072"}.mdi-bottle-tonic:before{content:"\F112E"}.mdi-bottle-tonic-outline:before{content:"\F112F"}.mdi-bottle-tonic-plus:before{content:"\F1130"}.mdi-bottle-tonic-plus-outline:before{content:"\F1131"}.mdi-bottle-tonic-skull:before{content:"\F1132"}.mdi-bottle-tonic-skull-outline:before{content:"\F1133"}.mdi-bottle-wine:before{content:"\F0854"}.mdi-bottle-wine-outline:before{content:"\F1310"}.mdi-bow-tie:before{content:"\F0678"}.mdi-bowl:before{content:"\F028E"}.mdi-bowl-mix:before{content:"\F0617"}.mdi-bowl-mix-outline:before{content:"\F02E4"}.mdi-bowl-outline:before{content:"\F02A9"}.mdi-bowling:before{content:"\F00D3"}.mdi-box:before{content:"\F00D4"}.mdi-box-cutter:before{content:"\F00D5"}.mdi-box-cutter-off:before{content:"\F0B4A"}.mdi-box-shadow:before{content:"\F0637"}.mdi-boxing-glove:before{content:"\F0B65"}.mdi-braille:before{content:"\F09D0"}.mdi-brain:before{content:"\F09D1"}.mdi-bread-slice:before{content:"\F0CEE"}.mdi-bread-slice-outline:before{content:"\F0CEF"}.mdi-bridge:before{content:"\F0618"}.mdi-briefcase:before{content:"\F00D6"}.mdi-briefcase-account:before{content:"\F0CF0"}.mdi-briefcase-account-outline:before{content:"\F0CF1"}.mdi-briefcase-check:before{content:"\F00D7"}.mdi-briefcase-check-outline:before{content:"\F131E"}.mdi-briefcase-clock:before{content:"\F10D0"}.mdi-briefcase-clock-outline:before{content:"\F10D1"}.mdi-briefcase-download:before{content:"\F00D8"}.mdi-briefcase-download-outline:before{content:"\F0C3D"}.mdi-briefcase-edit:before{content:"\F0A98"}.mdi-briefcase-edit-outline:before{content:"\F0C3E"}.mdi-briefcase-minus:before{content:"\F0A2A"}.mdi-briefcase-minus-outline:before{content:"\F0C3F"}.mdi-briefcase-off:before{content:"\F1658"}.mdi-briefcase-off-outline:before{content:"\F1659"}.mdi-briefcase-outline:before{content:"\F0814"}.mdi-briefcase-plus:before{content:"\F0A2B"}.mdi-briefcase-plus-outline:before{content:"\F0C40"}.mdi-briefcase-remove:before{content:"\F0A2C"}.mdi-briefcase-remove-outline:before{content:"\F0C41"}.mdi-briefcase-search:before{content:"\F0A2D"}.mdi-briefcase-search-outline:before{content:"\F0C42"}.mdi-briefcase-upload:before{content:"\F00D9"}.mdi-briefcase-upload-outline:before{content:"\F0C43"}.mdi-briefcase-variant:before{content:"\F1494"}.mdi-briefcase-variant-off:before{content:"\F165A"}.mdi-briefcase-variant-off-outline:before{content:"\F165B"}.mdi-briefcase-variant-outline:before{content:"\F1495"}.mdi-brightness-1:before{content:"\F00DA"}.mdi-brightness-2:before{content:"\F00DB"}.mdi-brightness-3:before{content:"\F00DC"}.mdi-brightness-4:before{content:"\F00DD"}.mdi-brightness-5:before{content:"\F00DE"}.mdi-brightness-6:before{content:"\F00DF"}.mdi-brightness-7:before{content:"\F00E0"}.mdi-brightness-auto:before{content:"\F00E1"}.mdi-brightness-percent:before{content:"\F0CF2"}.mdi-broadcast:before{content:"\F1720"}.mdi-broadcast-off:before{content:"\F1721"}.mdi-broom:before{content:"\F00E2"}.mdi-brush:before{content:"\F00E3"}.mdi-bucket:before{content:"\F1415"}.mdi-bucket-outline:before{content:"\F1416"}.mdi-buddhism:before{content:"\F094B"}.mdi-buffer:before{content:"\F0619"}.mdi-buffet:before{content:"\F0578"}.mdi-bug:before{content:"\F00E4"}.mdi-bug-check:before{content:"\F0A2E"}.mdi-bug-check-outline:before{content:"\F0A2F"}.mdi-bug-outline:before{content:"\F0A30"}.mdi-bugle:before{content:"\F0DB4"}.mdi-bulldozer:before{content:"\F0B22"}.mdi-bullet:before{content:"\F0CF3"}.mdi-bulletin-board:before{content:"\F00E5"}.mdi-bullhorn:before{content:"\F00E6"}.mdi-bullhorn-outline:before{content:"\F0B23"}.mdi-bullseye:before{content:"\F05DD"}.mdi-bullseye-arrow:before{content:"\F08C9"}.mdi-bulma:before{content:"\F12E7"}.mdi-bunk-bed:before{content:"\F1302"}.mdi-bunk-bed-outline:before{content:"\F0097"}.mdi-bus:before{content:"\F00E7"}.mdi-bus-alert:before{content:"\F0A99"}.mdi-bus-articulated-end:before{content:"\F079C"}.mdi-bus-articulated-front:before{content:"\F079D"}.mdi-bus-clock:before{content:"\F08CA"}.mdi-bus-double-decker:before{content:"\F079E"}.mdi-bus-marker:before{content:"\F1212"}.mdi-bus-multiple:before{content:"\F0F3F"}.mdi-bus-school:before{content:"\F079F"}.mdi-bus-side:before{content:"\F07A0"}.mdi-bus-stop:before{content:"\F1012"}.mdi-bus-stop-covered:before{content:"\F1013"}.mdi-bus-stop-uncovered:before{content:"\F1014"}.mdi-butterfly:before{content:"\F1589"}.mdi-butterfly-outline:before{content:"\F158A"}.mdi-cable-data:before{content:"\F1394"}.mdi-cached:before{content:"\F00E8"}.mdi-cactus:before{content:"\F0DB5"}.mdi-cake:before{content:"\F00E9"}.mdi-cake-layered:before{content:"\F00EA"}.mdi-cake-variant:before{content:"\F00EB"}.mdi-calculator:before{content:"\F00EC"}.mdi-calculator-variant:before{content:"\F0A9A"}.mdi-calculator-variant-outline:before{content:"\F15A6"}.mdi-calendar:before{content:"\F00ED"}.mdi-calendar-account:before{content:"\F0ED7"}.mdi-calendar-account-outline:before{content:"\F0ED8"}.mdi-calendar-alert:before{content:"\F0A31"}.mdi-calendar-arrow-left:before{content:"\F1134"}.mdi-calendar-arrow-right:before{content:"\F1135"}.mdi-calendar-blank:before{content:"\F00EE"}.mdi-calendar-blank-multiple:before{content:"\F1073"}.mdi-calendar-blank-outline:before{content:"\F0B66"}.mdi-calendar-check:before{content:"\F00EF"}.mdi-calendar-check-outline:before{content:"\F0C44"}.mdi-calendar-clock:before{content:"\F00F0"}.mdi-calendar-clock-outline:before{content:"\F16E1"}.mdi-calendar-cursor:before{content:"\F157B"}.mdi-calendar-edit:before{content:"\F08A7"}.mdi-calendar-end:before{content:"\F166C"}.mdi-calendar-export:before{content:"\F0B24"}.mdi-calendar-heart:before{content:"\F09D2"}.mdi-calendar-import:before{content:"\F0B25"}.mdi-calendar-lock:before{content:"\F1641"}.mdi-calendar-lock-outline:before{content:"\F1642"}.mdi-calendar-minus:before{content:"\F0D5C"}.mdi-calendar-month:before{content:"\F0E17"}.mdi-calendar-month-outline:before{content:"\F0E18"}.mdi-calendar-multiple:before{content:"\F00F1"}.mdi-calendar-multiple-check:before{content:"\F00F2"}.mdi-calendar-multiselect:before{content:"\F0A32"}.mdi-calendar-outline:before{content:"\F0B67"}.mdi-calendar-plus:before{content:"\F00F3"}.mdi-calendar-question:before{content:"\F0692"}.mdi-calendar-range:before{content:"\F0679"}.mdi-calendar-range-outline:before{content:"\F0B68"}.mdi-calendar-refresh:before{content:"\F01E1"}.mdi-calendar-refresh-outline:before{content:"\F0203"}.mdi-calendar-remove:before{content:"\F00F4"}.mdi-calendar-remove-outline:before{content:"\F0C45"}.mdi-calendar-search:before{content:"\F094C"}.mdi-calendar-star:before{content:"\F09D3"}.mdi-calendar-start:before{content:"\F166D"}.mdi-calendar-sync:before{content:"\F0E8E"}.mdi-calendar-sync-outline:before{content:"\F0E8F"}.mdi-calendar-text:before{content:"\F00F5"}.mdi-calendar-text-outline:before{content:"\F0C46"}.mdi-calendar-today:before{content:"\F00F6"}.mdi-calendar-week:before{content:"\F0A33"}.mdi-calendar-week-begin:before{content:"\F0A34"}.mdi-calendar-weekend:before{content:"\F0ED9"}.mdi-calendar-weekend-outline:before{content:"\F0EDA"}.mdi-call-made:before{content:"\F00F7"}.mdi-call-merge:before{content:"\F00F8"}.mdi-call-missed:before{content:"\F00F9"}.mdi-call-received:before{content:"\F00FA"}.mdi-call-split:before{content:"\F00FB"}.mdi-camcorder:before{content:"\F00FC"}.mdi-camcorder-off:before{content:"\F00FF"}.mdi-camera:before{content:"\F0100"}.mdi-camera-account:before{content:"\F08CB"}.mdi-camera-burst:before{content:"\F0693"}.mdi-camera-control:before{content:"\F0B69"}.mdi-camera-enhance:before{content:"\F0101"}.mdi-camera-enhance-outline:before{content:"\F0B6A"}.mdi-camera-flip:before{content:"\F15D9"}.mdi-camera-flip-outline:before{content:"\F15DA"}.mdi-camera-front:before{content:"\F0102"}.mdi-camera-front-variant:before{content:"\F0103"}.mdi-camera-gopro:before{content:"\F07A1"}.mdi-camera-image:before{content:"\F08CC"}.mdi-camera-iris:before{content:"\F0104"}.mdi-camera-metering-center:before{content:"\F07A2"}.mdi-camera-metering-matrix:before{content:"\F07A3"}.mdi-camera-metering-partial:before{content:"\F07A4"}.mdi-camera-metering-spot:before{content:"\F07A5"}.mdi-camera-off:before{content:"\F05DF"}.mdi-camera-outline:before{content:"\F0D5D"}.mdi-camera-party-mode:before{content:"\F0105"}.mdi-camera-plus:before{content:"\F0EDB"}.mdi-camera-plus-outline:before{content:"\F0EDC"}.mdi-camera-rear:before{content:"\F0106"}.mdi-camera-rear-variant:before{content:"\F0107"}.mdi-camera-retake:before{content:"\F0E19"}.mdi-camera-retake-outline:before{content:"\F0E1A"}.mdi-camera-switch:before{content:"\F0108"}.mdi-camera-switch-outline:before{content:"\F084A"}.mdi-camera-timer:before{content:"\F0109"}.mdi-camera-wireless:before{content:"\F0DB6"}.mdi-camera-wireless-outline:before{content:"\F0DB7"}.mdi-campfire:before{content:"\F0EDD"}.mdi-cancel:before{content:"\F073A"}.mdi-candle:before{content:"\F05E2"}.mdi-candycane:before{content:"\F010A"}.mdi-cannabis:before{content:"\F07A6"}.mdi-cannabis-off:before{content:"\F166E"}.mdi-caps-lock:before{content:"\F0A9B"}.mdi-car:before{content:"\F010B"}.mdi-car-2-plus:before{content:"\F1015"}.mdi-car-3-plus:before{content:"\F1016"}.mdi-car-arrow-left:before{content:"\F13B2"}.mdi-car-arrow-right:before{content:"\F13B3"}.mdi-car-back:before{content:"\F0E1B"}.mdi-car-battery:before{content:"\F010C"}.mdi-car-brake-abs:before{content:"\F0C47"}.mdi-car-brake-alert:before{content:"\F0C48"}.mdi-car-brake-hold:before{content:"\F0D5E"}.mdi-car-brake-parking:before{content:"\F0D5F"}.mdi-car-brake-retarder:before{content:"\F1017"}.mdi-car-child-seat:before{content:"\F0FA3"}.mdi-car-clutch:before{content:"\F1018"}.mdi-car-cog:before{content:"\F13CC"}.mdi-car-connected:before{content:"\F010D"}.mdi-car-convertible:before{content:"\F07A7"}.mdi-car-coolant-level:before{content:"\F1019"}.mdi-car-cruise-control:before{content:"\F0D60"}.mdi-car-defrost-front:before{content:"\F0D61"}.mdi-car-defrost-rear:before{content:"\F0D62"}.mdi-car-door:before{content:"\F0B6B"}.mdi-car-door-lock:before{content:"\F109D"}.mdi-car-electric:before{content:"\F0B6C"}.mdi-car-electric-outline:before{content:"\F15B5"}.mdi-car-emergency:before{content:"\F160F"}.mdi-car-esp:before{content:"\F0C49"}.mdi-car-estate:before{content:"\F07A8"}.mdi-car-hatchback:before{content:"\F07A9"}.mdi-car-info:before{content:"\F11BE"}.mdi-car-key:before{content:"\F0B6D"}.mdi-car-lifted-pickup:before{content:"\F152D"}.mdi-car-light-dimmed:before{content:"\F0C4A"}.mdi-car-light-fog:before{content:"\F0C4B"}.mdi-car-light-high:before{content:"\F0C4C"}.mdi-car-limousine:before{content:"\F08CD"}.mdi-car-multiple:before{content:"\F0B6E"}.mdi-car-off:before{content:"\F0E1C"}.mdi-car-outline:before{content:"\F14ED"}.mdi-car-parking-lights:before{content:"\F0D63"}.mdi-car-pickup:before{content:"\F07AA"}.mdi-car-seat:before{content:"\F0FA4"}.mdi-car-seat-cooler:before{content:"\F0FA5"}.mdi-car-seat-heater:before{content:"\F0FA6"}.mdi-car-settings:before{content:"\F13CD"}.mdi-car-shift-pattern:before{content:"\F0F40"}.mdi-car-side:before{content:"\F07AB"}.mdi-car-sports:before{content:"\F07AC"}.mdi-car-tire-alert:before{content:"\F0C4D"}.mdi-car-traction-control:before{content:"\F0D64"}.mdi-car-turbocharger:before{content:"\F101A"}.mdi-car-wash:before{content:"\F010E"}.mdi-car-windshield:before{content:"\F101B"}.mdi-car-windshield-outline:before{content:"\F101C"}.mdi-carabiner:before{content:"\F14C0"}.mdi-caravan:before{content:"\F07AD"}.mdi-card:before{content:"\F0B6F"}.mdi-card-account-details:before{content:"\F05D2"}.mdi-card-account-details-outline:before{content:"\F0DAB"}.mdi-card-account-details-star:before{content:"\F02A3"}.mdi-card-account-details-star-outline:before{content:"\F06DB"}.mdi-card-account-mail:before{content:"\F018E"}.mdi-card-account-mail-outline:before{content:"\F0E98"}.mdi-card-account-phone:before{content:"\F0E99"}.mdi-card-account-phone-outline:before{content:"\F0E9A"}.mdi-card-bulleted:before{content:"\F0B70"}.mdi-card-bulleted-off:before{content:"\F0B71"}.mdi-card-bulleted-off-outline:before{content:"\F0B72"}.mdi-card-bulleted-outline:before{content:"\F0B73"}.mdi-card-bulleted-settings:before{content:"\F0B74"}.mdi-card-bulleted-settings-outline:before{content:"\F0B75"}.mdi-card-minus:before{content:"\F1600"}.mdi-card-minus-outline:before{content:"\F1601"}.mdi-card-off:before{content:"\F1602"}.mdi-card-off-outline:before{content:"\F1603"}.mdi-card-outline:before{content:"\F0B76"}.mdi-card-plus:before{content:"\F11FF"}.mdi-card-plus-outline:before{content:"\F1200"}.mdi-card-remove:before{content:"\F1604"}.mdi-card-remove-outline:before{content:"\F1605"}.mdi-card-search:before{content:"\F1074"}.mdi-card-search-outline:before{content:"\F1075"}.mdi-card-text:before{content:"\F0B77"}.mdi-card-text-outline:before{content:"\F0B78"}.mdi-cards:before{content:"\F0638"}.mdi-cards-club:before{content:"\F08CE"}.mdi-cards-diamond:before{content:"\F08CF"}.mdi-cards-diamond-outline:before{content:"\F101D"}.mdi-cards-heart:before{content:"\F08D0"}.mdi-cards-outline:before{content:"\F0639"}.mdi-cards-playing-outline:before{content:"\F063A"}.mdi-cards-spade:before{content:"\F08D1"}.mdi-cards-variant:before{content:"\F06C7"}.mdi-carrot:before{content:"\F010F"}.mdi-cart:before{content:"\F0110"}.mdi-cart-arrow-down:before{content:"\F0D66"}.mdi-cart-arrow-right:before{content:"\F0C4E"}.mdi-cart-arrow-up:before{content:"\F0D67"}.mdi-cart-check:before{content:"\F15EA"}.mdi-cart-minus:before{content:"\F0D68"}.mdi-cart-off:before{content:"\F066B"}.mdi-cart-outline:before{content:"\F0111"}.mdi-cart-plus:before{content:"\F0112"}.mdi-cart-remove:before{content:"\F0D69"}.mdi-cart-variant:before{content:"\F15EB"}.mdi-case-sensitive-alt:before{content:"\F0113"}.mdi-cash:before{content:"\F0114"}.mdi-cash-100:before{content:"\F0115"}.mdi-cash-check:before{content:"\F14EE"}.mdi-cash-lock:before{content:"\F14EA"}.mdi-cash-lock-open:before{content:"\F14EB"}.mdi-cash-marker:before{content:"\F0DB8"}.mdi-cash-minus:before{content:"\F1260"}.mdi-cash-multiple:before{content:"\F0116"}.mdi-cash-plus:before{content:"\F1261"}.mdi-cash-refund:before{content:"\F0A9C"}.mdi-cash-register:before{content:"\F0CF4"}.mdi-cash-remove:before{content:"\F1262"}.mdi-cash-usd:before{content:"\F1176"}.mdi-cash-usd-outline:before{content:"\F0117"}.mdi-cassette:before{content:"\F09D4"}.mdi-cast:before{content:"\F0118"}.mdi-cast-audio:before{content:"\F101E"}.mdi-cast-connected:before{content:"\F0119"}.mdi-cast-education:before{content:"\F0E1D"}.mdi-cast-off:before{content:"\F078A"}.mdi-castle:before{content:"\F011A"}.mdi-cat:before{content:"\F011B"}.mdi-cctv:before{content:"\F07AE"}.mdi-ceiling-light:before{content:"\F0769"}.mdi-cellphone:before{content:"\F011C"}.mdi-cellphone-android:before{content:"\F011D"}.mdi-cellphone-arrow-down:before{content:"\F09D5"}.mdi-cellphone-basic:before{content:"\F011E"}.mdi-cellphone-charging:before{content:"\F1397"}.mdi-cellphone-cog:before{content:"\F0951"}.mdi-cellphone-dock:before{content:"\F011F"}.mdi-cellphone-erase:before{content:"\F094D"}.mdi-cellphone-information:before{content:"\F0F41"}.mdi-cellphone-iphone:before{content:"\F0120"}.mdi-cellphone-key:before{content:"\F094E"}.mdi-cellphone-link:before{content:"\F0121"}.mdi-cellphone-link-off:before{content:"\F0122"}.mdi-cellphone-lock:before{content:"\F094F"}.mdi-cellphone-message:before{content:"\F08D3"}.mdi-cellphone-message-off:before{content:"\F10D2"}.mdi-cellphone-nfc:before{content:"\F0E90"}.mdi-cellphone-nfc-off:before{content:"\F12D8"}.mdi-cellphone-off:before{content:"\F0950"}.mdi-cellphone-play:before{content:"\F101F"}.mdi-cellphone-screenshot:before{content:"\F0A35"}.mdi-cellphone-settings:before{content:"\F0123"}.mdi-cellphone-sound:before{content:"\F0952"}.mdi-cellphone-text:before{content:"\F08D2"}.mdi-cellphone-wireless:before{content:"\F0815"}.mdi-celtic-cross:before{content:"\F0CF5"}.mdi-centos:before{content:"\F111A"}.mdi-certificate:before{content:"\F0124"}.mdi-certificate-outline:before{content:"\F1188"}.mdi-chair-rolling:before{content:"\F0F48"}.mdi-chair-school:before{content:"\F0125"}.mdi-charity:before{content:"\F0C4F"}.mdi-chart-arc:before{content:"\F0126"}.mdi-chart-areaspline:before{content:"\F0127"}.mdi-chart-areaspline-variant:before{content:"\F0E91"}.mdi-chart-bar:before{content:"\F0128"}.mdi-chart-bar-stacked:before{content:"\F076A"}.mdi-chart-bell-curve:before{content:"\F0C50"}.mdi-chart-bell-curve-cumulative:before{content:"\F0FA7"}.mdi-chart-box:before{content:"\F154D"}.mdi-chart-box-outline:before{content:"\F154E"}.mdi-chart-box-plus-outline:before{content:"\F154F"}.mdi-chart-bubble:before{content:"\F05E3"}.mdi-chart-donut:before{content:"\F07AF"}.mdi-chart-donut-variant:before{content:"\F07B0"}.mdi-chart-gantt:before{content:"\F066C"}.mdi-chart-histogram:before{content:"\F0129"}.mdi-chart-line:before{content:"\F012A"}.mdi-chart-line-stacked:before{content:"\F076B"}.mdi-chart-line-variant:before{content:"\F07B1"}.mdi-chart-multiline:before{content:"\F08D4"}.mdi-chart-multiple:before{content:"\F1213"}.mdi-chart-pie:before{content:"\F012B"}.mdi-chart-ppf:before{content:"\F1380"}.mdi-chart-sankey:before{content:"\F11DF"}.mdi-chart-sankey-variant:before{content:"\F11E0"}.mdi-chart-scatter-plot:before{content:"\F0E92"}.mdi-chart-scatter-plot-hexbin:before{content:"\F066D"}.mdi-chart-timeline:before{content:"\F066E"}.mdi-chart-timeline-variant:before{content:"\F0E93"}.mdi-chart-timeline-variant-shimmer:before{content:"\F15B6"}.mdi-chart-tree:before{content:"\F0E94"}.mdi-chat:before{content:"\F0B79"}.mdi-chat-alert:before{content:"\F0B7A"}.mdi-chat-alert-outline:before{content:"\F12C9"}.mdi-chat-minus:before{content:"\F1410"}.mdi-chat-minus-outline:before{content:"\F1413"}.mdi-chat-outline:before{content:"\F0EDE"}.mdi-chat-plus:before{content:"\F140F"}.mdi-chat-plus-outline:before{content:"\F1412"}.mdi-chat-processing:before{content:"\F0B7B"}.mdi-chat-processing-outline:before{content:"\F12CA"}.mdi-chat-question:before{content:"\F1738"}.mdi-chat-question-outline:before{content:"\F1739"}.mdi-chat-remove:before{content:"\F1411"}.mdi-chat-remove-outline:before{content:"\F1414"}.mdi-chat-sleep:before{content:"\F12D1"}.mdi-chat-sleep-outline:before{content:"\F12D2"}.mdi-check:before{content:"\F012C"}.mdi-check-all:before{content:"\F012D"}.mdi-check-bold:before{content:"\F0E1E"}.mdi-check-box-multiple-outline:before{content:"\F0C51"}.mdi-check-box-outline:before{content:"\F0C52"}.mdi-check-circle:before{content:"\F05E0"}.mdi-check-circle-outline:before{content:"\F05E1"}.mdi-check-decagram:before{content:"\F0791"}.mdi-check-decagram-outline:before{content:"\F1740"}.mdi-check-network:before{content:"\F0C53"}.mdi-check-network-outline:before{content:"\F0C54"}.mdi-check-outline:before{content:"\F0855"}.mdi-check-underline:before{content:"\F0E1F"}.mdi-check-underline-circle:before{content:"\F0E20"}.mdi-check-underline-circle-outline:before{content:"\F0E21"}.mdi-checkbook:before{content:"\F0A9D"}.mdi-checkbox-blank:before{content:"\F012E"}.mdi-checkbox-blank-circle:before{content:"\F012F"}.mdi-checkbox-blank-circle-outline:before{content:"\F0130"}.mdi-checkbox-blank-off:before{content:"\F12EC"}.mdi-checkbox-blank-off-outline:before{content:"\F12ED"}.mdi-checkbox-blank-outline:before{content:"\F0131"}.mdi-checkbox-intermediate:before{content:"\F0856"}.mdi-checkbox-marked:before{content:"\F0132"}.mdi-checkbox-marked-circle:before{content:"\F0133"}.mdi-checkbox-marked-circle-outline:before{content:"\F0134"}.mdi-checkbox-marked-outline:before{content:"\F0135"}.mdi-checkbox-multiple-blank:before{content:"\F0136"}.mdi-checkbox-multiple-blank-circle:before{content:"\F063B"}.mdi-checkbox-multiple-blank-circle-outline:before{content:"\F063C"}.mdi-checkbox-multiple-blank-outline:before{content:"\F0137"}.mdi-checkbox-multiple-marked:before{content:"\F0138"}.mdi-checkbox-multiple-marked-circle:before{content:"\F063D"}.mdi-checkbox-multiple-marked-circle-outline:before{content:"\F063E"}.mdi-checkbox-multiple-marked-outline:before{content:"\F0139"}.mdi-checkerboard:before{content:"\F013A"}.mdi-checkerboard-minus:before{content:"\F1202"}.mdi-checkerboard-plus:before{content:"\F1201"}.mdi-checkerboard-remove:before{content:"\F1203"}.mdi-cheese:before{content:"\F12B9"}.mdi-cheese-off:before{content:"\F13EE"}.mdi-chef-hat:before{content:"\F0B7C"}.mdi-chemical-weapon:before{content:"\F013B"}.mdi-chess-bishop:before{content:"\F085C"}.mdi-chess-king:before{content:"\F0857"}.mdi-chess-knight:before{content:"\F0858"}.mdi-chess-pawn:before{content:"\F0859"}.mdi-chess-queen:before{content:"\F085A"}.mdi-chess-rook:before{content:"\F085B"}.mdi-chevron-double-down:before{content:"\F013C"}.mdi-chevron-double-left:before{content:"\F013D"}.mdi-chevron-double-right:before{content:"\F013E"}.mdi-chevron-double-up:before{content:"\F013F"}.mdi-chevron-down:before{content:"\F0140"}.mdi-chevron-down-box:before{content:"\F09D6"}.mdi-chevron-down-box-outline:before{content:"\F09D7"}.mdi-chevron-down-circle:before{content:"\F0B26"}.mdi-chevron-down-circle-outline:before{content:"\F0B27"}.mdi-chevron-left:before{content:"\F0141"}.mdi-chevron-left-box:before{content:"\F09D8"}.mdi-chevron-left-box-outline:before{content:"\F09D9"}.mdi-chevron-left-circle:before{content:"\F0B28"}.mdi-chevron-left-circle-outline:before{content:"\F0B29"}.mdi-chevron-right:before{content:"\F0142"}.mdi-chevron-right-box:before{content:"\F09DA"}.mdi-chevron-right-box-outline:before{content:"\F09DB"}.mdi-chevron-right-circle:before{content:"\F0B2A"}.mdi-chevron-right-circle-outline:before{content:"\F0B2B"}.mdi-chevron-triple-down:before{content:"\F0DB9"}.mdi-chevron-triple-left:before{content:"\F0DBA"}.mdi-chevron-triple-right:before{content:"\F0DBB"}.mdi-chevron-triple-up:before{content:"\F0DBC"}.mdi-chevron-up:before{content:"\F0143"}.mdi-chevron-up-box:before{content:"\F09DC"}.mdi-chevron-up-box-outline:before{content:"\F09DD"}.mdi-chevron-up-circle:before{content:"\F0B2C"}.mdi-chevron-up-circle-outline:before{content:"\F0B2D"}.mdi-chili-hot:before{content:"\F07B2"}.mdi-chili-medium:before{content:"\F07B3"}.mdi-chili-mild:before{content:"\F07B4"}.mdi-chili-off:before{content:"\F1467"}.mdi-chip:before{content:"\F061A"}.mdi-christianity:before{content:"\F0953"}.mdi-christianity-outline:before{content:"\F0CF6"}.mdi-church:before{content:"\F0144"}.mdi-cigar:before{content:"\F1189"}.mdi-cigar-off:before{content:"\F141B"}.mdi-circle:before{content:"\F0765"}.mdi-circle-box:before{content:"\F15DC"}.mdi-circle-box-outline:before{content:"\F15DD"}.mdi-circle-double:before{content:"\F0E95"}.mdi-circle-edit-outline:before{content:"\F08D5"}.mdi-circle-expand:before{content:"\F0E96"}.mdi-circle-half:before{content:"\F1395"}.mdi-circle-half-full:before{content:"\F1396"}.mdi-circle-medium:before{content:"\F09DE"}.mdi-circle-multiple:before{content:"\F0B38"}.mdi-circle-multiple-outline:before{content:"\F0695"}.mdi-circle-off-outline:before{content:"\F10D3"}.mdi-circle-outline:before{content:"\F0766"}.mdi-circle-slice-1:before{content:"\F0A9E"}.mdi-circle-slice-2:before{content:"\F0A9F"}.mdi-circle-slice-3:before{content:"\F0AA0"}.mdi-circle-slice-4:before{content:"\F0AA1"}.mdi-circle-slice-5:before{content:"\F0AA2"}.mdi-circle-slice-6:before{content:"\F0AA3"}.mdi-circle-slice-7:before{content:"\F0AA4"}.mdi-circle-slice-8:before{content:"\F0AA5"}.mdi-circle-small:before{content:"\F09DF"}.mdi-circular-saw:before{content:"\F0E22"}.mdi-city:before{content:"\F0146"}.mdi-city-variant:before{content:"\F0A36"}.mdi-city-variant-outline:before{content:"\F0A37"}.mdi-clipboard:before{content:"\F0147"}.mdi-clipboard-account:before{content:"\F0148"}.mdi-clipboard-account-outline:before{content:"\F0C55"}.mdi-clipboard-alert:before{content:"\F0149"}.mdi-clipboard-alert-outline:before{content:"\F0CF7"}.mdi-clipboard-arrow-down:before{content:"\F014A"}.mdi-clipboard-arrow-down-outline:before{content:"\F0C56"}.mdi-clipboard-arrow-left:before{content:"\F014B"}.mdi-clipboard-arrow-left-outline:before{content:"\F0CF8"}.mdi-clipboard-arrow-right:before{content:"\F0CF9"}.mdi-clipboard-arrow-right-outline:before{content:"\F0CFA"}.mdi-clipboard-arrow-up:before{content:"\F0C57"}.mdi-clipboard-arrow-up-outline:before{content:"\F0C58"}.mdi-clipboard-check:before{content:"\F014E"}.mdi-clipboard-check-multiple:before{content:"\F1263"}.mdi-clipboard-check-multiple-outline:before{content:"\F1264"}.mdi-clipboard-check-outline:before{content:"\F08A8"}.mdi-clipboard-clock:before{content:"\F16E2"}.mdi-clipboard-clock-outline:before{content:"\F16E3"}.mdi-clipboard-edit:before{content:"\F14E5"}.mdi-clipboard-edit-outline:before{content:"\F14E6"}.mdi-clipboard-file:before{content:"\F1265"}.mdi-clipboard-file-outline:before{content:"\F1266"}.mdi-clipboard-flow:before{content:"\F06C8"}.mdi-clipboard-flow-outline:before{content:"\F1117"}.mdi-clipboard-list:before{content:"\F10D4"}.mdi-clipboard-list-outline:before{content:"\F10D5"}.mdi-clipboard-minus:before{content:"\F1618"}.mdi-clipboard-minus-outline:before{content:"\F1619"}.mdi-clipboard-multiple:before{content:"\F1267"}.mdi-clipboard-multiple-outline:before{content:"\F1268"}.mdi-clipboard-off:before{content:"\F161A"}.mdi-clipboard-off-outline:before{content:"\F161B"}.mdi-clipboard-outline:before{content:"\F014C"}.mdi-clipboard-play:before{content:"\F0C59"}.mdi-clipboard-play-multiple:before{content:"\F1269"}.mdi-clipboard-play-multiple-outline:before{content:"\F126A"}.mdi-clipboard-play-outline:before{content:"\F0C5A"}.mdi-clipboard-plus:before{content:"\F0751"}.mdi-clipboard-plus-outline:before{content:"\F131F"}.mdi-clipboard-pulse:before{content:"\F085D"}.mdi-clipboard-pulse-outline:before{content:"\F085E"}.mdi-clipboard-remove:before{content:"\F161C"}.mdi-clipboard-remove-outline:before{content:"\F161D"}.mdi-clipboard-search:before{content:"\F161E"}.mdi-clipboard-search-outline:before{content:"\F161F"}.mdi-clipboard-text:before{content:"\F014D"}.mdi-clipboard-text-multiple:before{content:"\F126B"}.mdi-clipboard-text-multiple-outline:before{content:"\F126C"}.mdi-clipboard-text-off:before{content:"\F1620"}.mdi-clipboard-text-off-outline:before{content:"\F1621"}.mdi-clipboard-text-outline:before{content:"\F0A38"}.mdi-clipboard-text-play:before{content:"\F0C5B"}.mdi-clipboard-text-play-outline:before{content:"\F0C5C"}.mdi-clipboard-text-search:before{content:"\F1622"}.mdi-clipboard-text-search-outline:before{content:"\F1623"}.mdi-clippy:before{content:"\F014F"}.mdi-clock:before{content:"\F0954"}.mdi-clock-alert:before{content:"\F0955"}.mdi-clock-alert-outline:before{content:"\F05CE"}.mdi-clock-check:before{content:"\F0FA8"}.mdi-clock-check-outline:before{content:"\F0FA9"}.mdi-clock-digital:before{content:"\F0E97"}.mdi-clock-end:before{content:"\F0151"}.mdi-clock-fast:before{content:"\F0152"}.mdi-clock-in:before{content:"\F0153"}.mdi-clock-out:before{content:"\F0154"}.mdi-clock-outline:before{content:"\F0150"}.mdi-clock-start:before{content:"\F0155"}.mdi-clock-time-eight:before{content:"\F1446"}.mdi-clock-time-eight-outline:before{content:"\F1452"}.mdi-clock-time-eleven:before{content:"\F1449"}.mdi-clock-time-eleven-outline:before{content:"\F1455"}.mdi-clock-time-five:before{content:"\F1443"}.mdi-clock-time-five-outline:before{content:"\F144F"}.mdi-clock-time-four:before{content:"\F1442"}.mdi-clock-time-four-outline:before{content:"\F144E"}.mdi-clock-time-nine:before{content:"\F1447"}.mdi-clock-time-nine-outline:before{content:"\F1453"}.mdi-clock-time-one:before{content:"\F143F"}.mdi-clock-time-one-outline:before{content:"\F144B"}.mdi-clock-time-seven:before{content:"\F1445"}.mdi-clock-time-seven-outline:before{content:"\F1451"}.mdi-clock-time-six:before{content:"\F1444"}.mdi-clock-time-six-outline:before{content:"\F1450"}.mdi-clock-time-ten:before{content:"\F1448"}.mdi-clock-time-ten-outline:before{content:"\F1454"}.mdi-clock-time-three:before{content:"\F1441"}.mdi-clock-time-three-outline:before{content:"\F144D"}.mdi-clock-time-twelve:before{content:"\F144A"}.mdi-clock-time-twelve-outline:before{content:"\F1456"}.mdi-clock-time-two:before{content:"\F1440"}.mdi-clock-time-two-outline:before{content:"\F144C"}.mdi-close:before{content:"\F0156"}.mdi-close-box:before{content:"\F0157"}.mdi-close-box-multiple:before{content:"\F0C5D"}.mdi-close-box-multiple-outline:before{content:"\F0C5E"}.mdi-close-box-outline:before{content:"\F0158"}.mdi-close-circle:before{content:"\F0159"}.mdi-close-circle-multiple:before{content:"\F062A"}.mdi-close-circle-multiple-outline:before{content:"\F0883"}.mdi-close-circle-outline:before{content:"\F015A"}.mdi-close-network:before{content:"\F015B"}.mdi-close-network-outline:before{content:"\F0C5F"}.mdi-close-octagon:before{content:"\F015C"}.mdi-close-octagon-outline:before{content:"\F015D"}.mdi-close-outline:before{content:"\F06C9"}.mdi-close-thick:before{content:"\F1398"}.mdi-closed-caption:before{content:"\F015E"}.mdi-closed-caption-outline:before{content:"\F0DBD"}.mdi-cloud:before{content:"\F015F"}.mdi-cloud-alert:before{content:"\F09E0"}.mdi-cloud-braces:before{content:"\F07B5"}.mdi-cloud-check:before{content:"\F0160"}.mdi-cloud-check-outline:before{content:"\F12CC"}.mdi-cloud-circle:before{content:"\F0161"}.mdi-cloud-download:before{content:"\F0162"}.mdi-cloud-download-outline:before{content:"\F0B7D"}.mdi-cloud-lock:before{content:"\F11F1"}.mdi-cloud-lock-outline:before{content:"\F11F2"}.mdi-cloud-off-outline:before{content:"\F0164"}.mdi-cloud-outline:before{content:"\F0163"}.mdi-cloud-print:before{content:"\F0165"}.mdi-cloud-print-outline:before{content:"\F0166"}.mdi-cloud-question:before{content:"\F0A39"}.mdi-cloud-refresh:before{content:"\F052A"}.mdi-cloud-search:before{content:"\F0956"}.mdi-cloud-search-outline:before{content:"\F0957"}.mdi-cloud-sync:before{content:"\F063F"}.mdi-cloud-sync-outline:before{content:"\F12D6"}.mdi-cloud-tags:before{content:"\F07B6"}.mdi-cloud-upload:before{content:"\F0167"}.mdi-cloud-upload-outline:before{content:"\F0B7E"}.mdi-clover:before{content:"\F0816"}.mdi-coach-lamp:before{content:"\F1020"}.mdi-coat-rack:before{content:"\F109E"}.mdi-code-array:before{content:"\F0168"}.mdi-code-braces:before{content:"\F0169"}.mdi-code-braces-box:before{content:"\F10D6"}.mdi-code-brackets:before{content:"\F016A"}.mdi-code-equal:before{content:"\F016B"}.mdi-code-greater-than:before{content:"\F016C"}.mdi-code-greater-than-or-equal:before{content:"\F016D"}.mdi-code-json:before{content:"\F0626"}.mdi-code-less-than:before{content:"\F016E"}.mdi-code-less-than-or-equal:before{content:"\F016F"}.mdi-code-not-equal:before{content:"\F0170"}.mdi-code-not-equal-variant:before{content:"\F0171"}.mdi-code-parentheses:before{content:"\F0172"}.mdi-code-parentheses-box:before{content:"\F10D7"}.mdi-code-string:before{content:"\F0173"}.mdi-code-tags:before{content:"\F0174"}.mdi-code-tags-check:before{content:"\F0694"}.mdi-codepen:before{content:"\F0175"}.mdi-coffee:before{content:"\F0176"}.mdi-coffee-maker:before{content:"\F109F"}.mdi-coffee-off:before{content:"\F0FAA"}.mdi-coffee-off-outline:before{content:"\F0FAB"}.mdi-coffee-outline:before{content:"\F06CA"}.mdi-coffee-to-go:before{content:"\F0177"}.mdi-coffee-to-go-outline:before{content:"\F130E"}.mdi-coffin:before{content:"\F0B7F"}.mdi-cog:before{content:"\F0493"}.mdi-cog-box:before{content:"\F0494"}.mdi-cog-clockwise:before{content:"\F11DD"}.mdi-cog-counterclockwise:before{content:"\F11DE"}.mdi-cog-off:before{content:"\F13CE"}.mdi-cog-off-outline:before{content:"\F13CF"}.mdi-cog-outline:before{content:"\F08BB"}.mdi-cog-refresh:before{content:"\F145E"}.mdi-cog-refresh-outline:before{content:"\F145F"}.mdi-cog-sync:before{content:"\F1460"}.mdi-cog-sync-outline:before{content:"\F1461"}.mdi-cog-transfer:before{content:"\F105B"}.mdi-cog-transfer-outline:before{content:"\F105C"}.mdi-cogs:before{content:"\F08D6"}.mdi-collage:before{content:"\F0640"}.mdi-collapse-all:before{content:"\F0AA6"}.mdi-collapse-all-outline:before{content:"\F0AA7"}.mdi-color-helper:before{content:"\F0179"}.mdi-comma:before{content:"\F0E23"}.mdi-comma-box:before{content:"\F0E2B"}.mdi-comma-box-outline:before{content:"\F0E24"}.mdi-comma-circle:before{content:"\F0E25"}.mdi-comma-circle-outline:before{content:"\F0E26"}.mdi-comment:before{content:"\F017A"}.mdi-comment-account:before{content:"\F017B"}.mdi-comment-account-outline:before{content:"\F017C"}.mdi-comment-alert:before{content:"\F017D"}.mdi-comment-alert-outline:before{content:"\F017E"}.mdi-comment-arrow-left:before{content:"\F09E1"}.mdi-comment-arrow-left-outline:before{content:"\F09E2"}.mdi-comment-arrow-right:before{content:"\F09E3"}.mdi-comment-arrow-right-outline:before{content:"\F09E4"}.mdi-comment-bookmark:before{content:"\F15AE"}.mdi-comment-bookmark-outline:before{content:"\F15AF"}.mdi-comment-check:before{content:"\F017F"}.mdi-comment-check-outline:before{content:"\F0180"}.mdi-comment-edit:before{content:"\F11BF"}.mdi-comment-edit-outline:before{content:"\F12C4"}.mdi-comment-eye:before{content:"\F0A3A"}.mdi-comment-eye-outline:before{content:"\F0A3B"}.mdi-comment-flash:before{content:"\F15B0"}.mdi-comment-flash-outline:before{content:"\F15B1"}.mdi-comment-minus:before{content:"\F15DF"}.mdi-comment-minus-outline:before{content:"\F15E0"}.mdi-comment-multiple:before{content:"\F085F"}.mdi-comment-multiple-outline:before{content:"\F0181"}.mdi-comment-off:before{content:"\F15E1"}.mdi-comment-off-outline:before{content:"\F15E2"}.mdi-comment-outline:before{content:"\F0182"}.mdi-comment-plus:before{content:"\F09E5"}.mdi-comment-plus-outline:before{content:"\F0183"}.mdi-comment-processing:before{content:"\F0184"}.mdi-comment-processing-outline:before{content:"\F0185"}.mdi-comment-question:before{content:"\F0817"}.mdi-comment-question-outline:before{content:"\F0186"}.mdi-comment-quote:before{content:"\F1021"}.mdi-comment-quote-outline:before{content:"\F1022"}.mdi-comment-remove:before{content:"\F05DE"}.mdi-comment-remove-outline:before{content:"\F0187"}.mdi-comment-search:before{content:"\F0A3C"}.mdi-comment-search-outline:before{content:"\F0A3D"}.mdi-comment-text:before{content:"\F0188"}.mdi-comment-text-multiple:before{content:"\F0860"}.mdi-comment-text-multiple-outline:before{content:"\F0861"}.mdi-comment-text-outline:before{content:"\F0189"}.mdi-compare:before{content:"\F018A"}.mdi-compare-horizontal:before{content:"\F1492"}.mdi-compare-vertical:before{content:"\F1493"}.mdi-compass:before{content:"\F018B"}.mdi-compass-off:before{content:"\F0B80"}.mdi-compass-off-outline:before{content:"\F0B81"}.mdi-compass-outline:before{content:"\F018C"}.mdi-compass-rose:before{content:"\F1382"}.mdi-concourse-ci:before{content:"\F10A0"}.mdi-connection:before{content:"\F1616"}.mdi-console:before{content:"\F018D"}.mdi-console-line:before{content:"\F07B7"}.mdi-console-network:before{content:"\F08A9"}.mdi-console-network-outline:before{content:"\F0C60"}.mdi-consolidate:before{content:"\F10D8"}.mdi-contactless-payment:before{content:"\F0D6A"}.mdi-contactless-payment-circle:before{content:"\F0321"}.mdi-contactless-payment-circle-outline:before{content:"\F0408"}.mdi-contacts:before{content:"\F06CB"}.mdi-contacts-outline:before{content:"\F05B8"}.mdi-contain:before{content:"\F0A3E"}.mdi-contain-end:before{content:"\F0A3F"}.mdi-contain-start:before{content:"\F0A40"}.mdi-content-copy:before{content:"\F018F"}.mdi-content-cut:before{content:"\F0190"}.mdi-content-duplicate:before{content:"\F0191"}.mdi-content-paste:before{content:"\F0192"}.mdi-content-save:before{content:"\F0193"}.mdi-content-save-alert:before{content:"\F0F42"}.mdi-content-save-alert-outline:before{content:"\F0F43"}.mdi-content-save-all:before{content:"\F0194"}.mdi-content-save-all-outline:before{content:"\F0F44"}.mdi-content-save-cog:before{content:"\F145B"}.mdi-content-save-cog-outline:before{content:"\F145C"}.mdi-content-save-edit:before{content:"\F0CFB"}.mdi-content-save-edit-outline:before{content:"\F0CFC"}.mdi-content-save-move:before{content:"\F0E27"}.mdi-content-save-move-outline:before{content:"\F0E28"}.mdi-content-save-off:before{content:"\F1643"}.mdi-content-save-off-outline:before{content:"\F1644"}.mdi-content-save-outline:before{content:"\F0818"}.mdi-content-save-settings:before{content:"\F061B"}.mdi-content-save-settings-outline:before{content:"\F0B2E"}.mdi-contrast:before{content:"\F0195"}.mdi-contrast-box:before{content:"\F0196"}.mdi-contrast-circle:before{content:"\F0197"}.mdi-controller-classic:before{content:"\F0B82"}.mdi-controller-classic-outline:before{content:"\F0B83"}.mdi-cookie:before{content:"\F0198"}.mdi-cookie-alert:before{content:"\F16D0"}.mdi-cookie-alert-outline:before{content:"\F16D1"}.mdi-cookie-check:before{content:"\F16D2"}.mdi-cookie-check-outline:before{content:"\F16D3"}.mdi-cookie-clock:before{content:"\F16E4"}.mdi-cookie-clock-outline:before{content:"\F16E5"}.mdi-cookie-cog:before{content:"\F16D4"}.mdi-cookie-cog-outline:before{content:"\F16D5"}.mdi-cookie-edit:before{content:"\F16E6"}.mdi-cookie-edit-outline:before{content:"\F16E7"}.mdi-cookie-lock:before{content:"\F16E8"}.mdi-cookie-lock-outline:before{content:"\F16E9"}.mdi-cookie-minus:before{content:"\F16DA"}.mdi-cookie-minus-outline:before{content:"\F16DB"}.mdi-cookie-off:before{content:"\F16EA"}.mdi-cookie-off-outline:before{content:"\F16EB"}.mdi-cookie-outline:before{content:"\F16DE"}.mdi-cookie-plus:before{content:"\F16D6"}.mdi-cookie-plus-outline:before{content:"\F16D7"}.mdi-cookie-refresh:before{content:"\F16EC"}.mdi-cookie-refresh-outline:before{content:"\F16ED"}.mdi-cookie-remove:before{content:"\F16D8"}.mdi-cookie-remove-outline:before{content:"\F16D9"}.mdi-cookie-settings:before{content:"\F16DC"}.mdi-cookie-settings-outline:before{content:"\F16DD"}.mdi-coolant-temperature:before{content:"\F03C8"}.mdi-copyright:before{content:"\F05E6"}.mdi-cordova:before{content:"\F0958"}.mdi-corn:before{content:"\F07B8"}.mdi-corn-off:before{content:"\F13EF"}.mdi-cosine-wave:before{content:"\F1479"}.mdi-counter:before{content:"\F0199"}.mdi-cow:before{content:"\F019A"}.mdi-cpu-32-bit:before{content:"\F0EDF"}.mdi-cpu-64-bit:before{content:"\F0EE0"}.mdi-crane:before{content:"\F0862"}.mdi-creation:before{content:"\F0674"}.mdi-creative-commons:before{content:"\F0D6B"}.mdi-credit-card:before{content:"\F0FEF"}.mdi-credit-card-check:before{content:"\F13D0"}.mdi-credit-card-check-outline:before{content:"\F13D1"}.mdi-credit-card-clock:before{content:"\F0EE1"}.mdi-credit-card-clock-outline:before{content:"\F0EE2"}.mdi-credit-card-marker:before{content:"\F06A8"}.mdi-credit-card-marker-outline:before{content:"\F0DBE"}.mdi-credit-card-minus:before{content:"\F0FAC"}.mdi-credit-card-minus-outline:before{content:"\F0FAD"}.mdi-credit-card-multiple:before{content:"\F0FF0"}.mdi-credit-card-multiple-outline:before{content:"\F019C"}.mdi-credit-card-off:before{content:"\F0FF1"}.mdi-credit-card-off-outline:before{content:"\F05E4"}.mdi-credit-card-outline:before{content:"\F019B"}.mdi-credit-card-plus:before{content:"\F0FF2"}.mdi-credit-card-plus-outline:before{content:"\F0676"}.mdi-credit-card-refresh:before{content:"\F1645"}.mdi-credit-card-refresh-outline:before{content:"\F1646"}.mdi-credit-card-refund:before{content:"\F0FF3"}.mdi-credit-card-refund-outline:before{content:"\F0AA8"}.mdi-credit-card-remove:before{content:"\F0FAE"}.mdi-credit-card-remove-outline:before{content:"\F0FAF"}.mdi-credit-card-scan:before{content:"\F0FF4"}.mdi-credit-card-scan-outline:before{content:"\F019D"}.mdi-credit-card-search:before{content:"\F1647"}.mdi-credit-card-search-outline:before{content:"\F1648"}.mdi-credit-card-settings:before{content:"\F0FF5"}.mdi-credit-card-settings-outline:before{content:"\F08D7"}.mdi-credit-card-sync:before{content:"\F1649"}.mdi-credit-card-sync-outline:before{content:"\F164A"}.mdi-credit-card-wireless:before{content:"\F0802"}.mdi-credit-card-wireless-off:before{content:"\F057A"}.mdi-credit-card-wireless-off-outline:before{content:"\F057B"}.mdi-credit-card-wireless-outline:before{content:"\F0D6C"}.mdi-cricket:before{content:"\F0D6D"}.mdi-crop:before{content:"\F019E"}.mdi-crop-free:before{content:"\F019F"}.mdi-crop-landscape:before{content:"\F01A0"}.mdi-crop-portrait:before{content:"\F01A1"}.mdi-crop-rotate:before{content:"\F0696"}.mdi-crop-square:before{content:"\F01A2"}.mdi-crosshairs:before{content:"\F01A3"}.mdi-crosshairs-gps:before{content:"\F01A4"}.mdi-crosshairs-off:before{content:"\F0F45"}.mdi-crosshairs-question:before{content:"\F1136"}.mdi-crown:before{content:"\F01A5"}.mdi-crown-outline:before{content:"\F11D0"}.mdi-cryengine:before{content:"\F0959"}.mdi-crystal-ball:before{content:"\F0B2F"}.mdi-cube:before{content:"\F01A6"}.mdi-cube-off:before{content:"\F141C"}.mdi-cube-off-outline:before{content:"\F141D"}.mdi-cube-outline:before{content:"\F01A7"}.mdi-cube-scan:before{content:"\F0B84"}.mdi-cube-send:before{content:"\F01A8"}.mdi-cube-unfolded:before{content:"\F01A9"}.mdi-cup:before{content:"\F01AA"}.mdi-cup-off:before{content:"\F05E5"}.mdi-cup-off-outline:before{content:"\F137D"}.mdi-cup-outline:before{content:"\F130F"}.mdi-cup-water:before{content:"\F01AB"}.mdi-cupboard:before{content:"\F0F46"}.mdi-cupboard-outline:before{content:"\F0F47"}.mdi-cupcake:before{content:"\F095A"}.mdi-curling:before{content:"\F0863"}.mdi-currency-bdt:before{content:"\F0864"}.mdi-currency-brl:before{content:"\F0B85"}.mdi-currency-btc:before{content:"\F01AC"}.mdi-currency-cny:before{content:"\F07BA"}.mdi-currency-eth:before{content:"\F07BB"}.mdi-currency-eur:before{content:"\F01AD"}.mdi-currency-eur-off:before{content:"\F1315"}.mdi-currency-gbp:before{content:"\F01AE"}.mdi-currency-ils:before{content:"\F0C61"}.mdi-currency-inr:before{content:"\F01AF"}.mdi-currency-jpy:before{content:"\F07BC"}.mdi-currency-krw:before{content:"\F07BD"}.mdi-currency-kzt:before{content:"\F0865"}.mdi-currency-mnt:before{content:"\F1512"}.mdi-currency-ngn:before{content:"\F01B0"}.mdi-currency-php:before{content:"\F09E6"}.mdi-currency-rial:before{content:"\F0E9C"}.mdi-currency-rub:before{content:"\F01B1"}.mdi-currency-sign:before{content:"\F07BE"}.mdi-currency-try:before{content:"\F01B2"}.mdi-currency-twd:before{content:"\F07BF"}.mdi-currency-usd:before{content:"\F01C1"}.mdi-currency-usd-circle:before{content:"\F116B"}.mdi-currency-usd-circle-outline:before{content:"\F0178"}.mdi-currency-usd-off:before{content:"\F067A"}.mdi-current-ac:before{content:"\F1480"}.mdi-current-dc:before{content:"\F095C"}.mdi-cursor-default:before{content:"\F01C0"}.mdi-cursor-default-click:before{content:"\F0CFD"}.mdi-cursor-default-click-outline:before{content:"\F0CFE"}.mdi-cursor-default-gesture:before{content:"\F1127"}.mdi-cursor-default-gesture-outline:before{content:"\F1128"}.mdi-cursor-default-outline:before{content:"\F01BF"}.mdi-cursor-move:before{content:"\F01BE"}.mdi-cursor-pointer:before{content:"\F01BD"}.mdi-cursor-text:before{content:"\F05E7"}.mdi-dance-ballroom:before{content:"\F15FB"}.mdi-dance-pole:before{content:"\F1578"}.mdi-data-matrix:before{content:"\F153C"}.mdi-data-matrix-edit:before{content:"\F153D"}.mdi-data-matrix-minus:before{content:"\F153E"}.mdi-data-matrix-plus:before{content:"\F153F"}.mdi-data-matrix-remove:before{content:"\F1540"}.mdi-data-matrix-scan:before{content:"\F1541"}.mdi-database:before{content:"\F01BC"}.mdi-database-alert:before{content:"\F163A"}.mdi-database-alert-outline:before{content:"\F1624"}.mdi-database-arrow-down:before{content:"\F163B"}.mdi-database-arrow-down-outline:before{content:"\F1625"}.mdi-database-arrow-left:before{content:"\F163C"}.mdi-database-arrow-left-outline:before{content:"\F1626"}.mdi-database-arrow-right:before{content:"\F163D"}.mdi-database-arrow-right-outline:before{content:"\F1627"}.mdi-database-arrow-up:before{content:"\F163E"}.mdi-database-arrow-up-outline:before{content:"\F1628"}.mdi-database-check:before{content:"\F0AA9"}.mdi-database-check-outline:before{content:"\F1629"}.mdi-database-clock:before{content:"\F163F"}.mdi-database-clock-outline:before{content:"\F162A"}.mdi-database-cog:before{content:"\F164B"}.mdi-database-cog-outline:before{content:"\F164C"}.mdi-database-edit:before{content:"\F0B86"}.mdi-database-edit-outline:before{content:"\F162B"}.mdi-database-export:before{content:"\F095E"}.mdi-database-export-outline:before{content:"\F162C"}.mdi-database-import:before{content:"\F095D"}.mdi-database-import-outline:before{content:"\F162D"}.mdi-database-lock:before{content:"\F0AAA"}.mdi-database-lock-outline:before{content:"\F162E"}.mdi-database-marker:before{content:"\F12F6"}.mdi-database-marker-outline:before{content:"\F162F"}.mdi-database-minus:before{content:"\F01BB"}.mdi-database-minus-outline:before{content:"\F1630"}.mdi-database-off:before{content:"\F1640"}.mdi-database-off-outline:before{content:"\F1631"}.mdi-database-outline:before{content:"\F1632"}.mdi-database-plus:before{content:"\F01BA"}.mdi-database-plus-outline:before{content:"\F1633"}.mdi-database-refresh:before{content:"\F05C2"}.mdi-database-refresh-outline:before{content:"\F1634"}.mdi-database-remove:before{content:"\F0D00"}.mdi-database-remove-outline:before{content:"\F1635"}.mdi-database-search:before{content:"\F0866"}.mdi-database-search-outline:before{content:"\F1636"}.mdi-database-settings:before{content:"\F0D01"}.mdi-database-settings-outline:before{content:"\F1637"}.mdi-database-sync:before{content:"\F0CFF"}.mdi-database-sync-outline:before{content:"\F1638"}.mdi-death-star:before{content:"\F08D8"}.mdi-death-star-variant:before{content:"\F08D9"}.mdi-deathly-hallows:before{content:"\F0B87"}.mdi-debian:before{content:"\F08DA"}.mdi-debug-step-into:before{content:"\F01B9"}.mdi-debug-step-out:before{content:"\F01B8"}.mdi-debug-step-over:before{content:"\F01B7"}.mdi-decagram:before{content:"\F076C"}.mdi-decagram-outline:before{content:"\F076D"}.mdi-decimal:before{content:"\F10A1"}.mdi-decimal-comma:before{content:"\F10A2"}.mdi-decimal-comma-decrease:before{content:"\F10A3"}.mdi-decimal-comma-increase:before{content:"\F10A4"}.mdi-decimal-decrease:before{content:"\F01B6"}.mdi-decimal-increase:before{content:"\F01B5"}.mdi-delete:before{content:"\F01B4"}.mdi-delete-alert:before{content:"\F10A5"}.mdi-delete-alert-outline:before{content:"\F10A6"}.mdi-delete-circle:before{content:"\F0683"}.mdi-delete-circle-outline:before{content:"\F0B88"}.mdi-delete-clock:before{content:"\F1556"}.mdi-delete-clock-outline:before{content:"\F1557"}.mdi-delete-empty:before{content:"\F06CC"}.mdi-delete-empty-outline:before{content:"\F0E9D"}.mdi-delete-forever:before{content:"\F05E8"}.mdi-delete-forever-outline:before{content:"\F0B89"}.mdi-delete-off:before{content:"\F10A7"}.mdi-delete-off-outline:before{content:"\F10A8"}.mdi-delete-outline:before{content:"\F09E7"}.mdi-delete-restore:before{content:"\F0819"}.mdi-delete-sweep:before{content:"\F05E9"}.mdi-delete-sweep-outline:before{content:"\F0C62"}.mdi-delete-variant:before{content:"\F01B3"}.mdi-delta:before{content:"\F01C2"}.mdi-desk:before{content:"\F1239"}.mdi-desk-lamp:before{content:"\F095F"}.mdi-deskphone:before{content:"\F01C3"}.mdi-desktop-classic:before{content:"\F07C0"}.mdi-desktop-mac:before{content:"\F01C4"}.mdi-desktop-mac-dashboard:before{content:"\F09E8"}.mdi-desktop-tower:before{content:"\F01C5"}.mdi-desktop-tower-monitor:before{content:"\F0AAB"}.mdi-details:before{content:"\F01C6"}.mdi-dev-to:before{content:"\F0D6E"}.mdi-developer-board:before{content:"\F0697"}.mdi-deviantart:before{content:"\F01C7"}.mdi-devices:before{content:"\F0FB0"}.mdi-diabetes:before{content:"\F1126"}.mdi-dialpad:before{content:"\F061C"}.mdi-diameter:before{content:"\F0C63"}.mdi-diameter-outline:before{content:"\F0C64"}.mdi-diameter-variant:before{content:"\F0C65"}.mdi-diamond:before{content:"\F0B8A"}.mdi-diamond-outline:before{content:"\F0B8B"}.mdi-diamond-stone:before{content:"\F01C8"}.mdi-dice-1:before{content:"\F01CA"}.mdi-dice-1-outline:before{content:"\F114A"}.mdi-dice-2:before{content:"\F01CB"}.mdi-dice-2-outline:before{content:"\F114B"}.mdi-dice-3:before{content:"\F01CC"}.mdi-dice-3-outline:before{content:"\F114C"}.mdi-dice-4:before{content:"\F01CD"}.mdi-dice-4-outline:before{content:"\F114D"}.mdi-dice-5:before{content:"\F01CE"}.mdi-dice-5-outline:before{content:"\F114E"}.mdi-dice-6:before{content:"\F01CF"}.mdi-dice-6-outline:before{content:"\F114F"}.mdi-dice-d10:before{content:"\F1153"}.mdi-dice-d10-outline:before{content:"\F076F"}.mdi-dice-d12:before{content:"\F1154"}.mdi-dice-d12-outline:before{content:"\F0867"}.mdi-dice-d20:before{content:"\F1155"}.mdi-dice-d20-outline:before{content:"\F05EA"}.mdi-dice-d4:before{content:"\F1150"}.mdi-dice-d4-outline:before{content:"\F05EB"}.mdi-dice-d6:before{content:"\F1151"}.mdi-dice-d6-outline:before{content:"\F05ED"}.mdi-dice-d8:before{content:"\F1152"}.mdi-dice-d8-outline:before{content:"\F05EC"}.mdi-dice-multiple:before{content:"\F076E"}.mdi-dice-multiple-outline:before{content:"\F1156"}.mdi-digital-ocean:before{content:"\F1237"}.mdi-dip-switch:before{content:"\F07C1"}.mdi-directions:before{content:"\F01D0"}.mdi-directions-fork:before{content:"\F0641"}.mdi-disc:before{content:"\F05EE"}.mdi-disc-alert:before{content:"\F01D1"}.mdi-disc-player:before{content:"\F0960"}.mdi-discord:before{content:"\F066F"}.mdi-dishwasher:before{content:"\F0AAC"}.mdi-dishwasher-alert:before{content:"\F11B8"}.mdi-dishwasher-off:before{content:"\F11B9"}.mdi-disqus:before{content:"\F01D2"}.mdi-distribute-horizontal-center:before{content:"\F11C9"}.mdi-distribute-horizontal-left:before{content:"\F11C8"}.mdi-distribute-horizontal-right:before{content:"\F11CA"}.mdi-distribute-vertical-bottom:before{content:"\F11CB"}.mdi-distribute-vertical-center:before{content:"\F11CC"}.mdi-distribute-vertical-top:before{content:"\F11CD"}.mdi-diving-flippers:before{content:"\F0DBF"}.mdi-diving-helmet:before{content:"\F0DC0"}.mdi-diving-scuba:before{content:"\F0DC1"}.mdi-diving-scuba-flag:before{content:"\F0DC2"}.mdi-diving-scuba-tank:before{content:"\F0DC3"}.mdi-diving-scuba-tank-multiple:before{content:"\F0DC4"}.mdi-diving-snorkel:before{content:"\F0DC5"}.mdi-division:before{content:"\F01D4"}.mdi-division-box:before{content:"\F01D5"}.mdi-dlna:before{content:"\F0A41"}.mdi-dna:before{content:"\F0684"}.mdi-dns:before{content:"\F01D6"}.mdi-dns-outline:before{content:"\F0B8C"}.mdi-do-not-disturb:before{content:"\F0698"}.mdi-do-not-disturb-off:before{content:"\F0699"}.mdi-dock-bottom:before{content:"\F10A9"}.mdi-dock-left:before{content:"\F10AA"}.mdi-dock-right:before{content:"\F10AB"}.mdi-dock-top:before{content:"\F1513"}.mdi-dock-window:before{content:"\F10AC"}.mdi-docker:before{content:"\F0868"}.mdi-doctor:before{content:"\F0A42"}.mdi-dog:before{content:"\F0A43"}.mdi-dog-service:before{content:"\F0AAD"}.mdi-dog-side:before{content:"\F0A44"}.mdi-dog-side-off:before{content:"\F16EE"}.mdi-dolby:before{content:"\F06B3"}.mdi-dolly:before{content:"\F0E9E"}.mdi-domain:before{content:"\F01D7"}.mdi-domain-off:before{content:"\F0D6F"}.mdi-domain-plus:before{content:"\F10AD"}.mdi-domain-remove:before{content:"\F10AE"}.mdi-dome-light:before{content:"\F141E"}.mdi-domino-mask:before{content:"\F1023"}.mdi-donkey:before{content:"\F07C2"}.mdi-door:before{content:"\F081A"}.mdi-door-closed:before{content:"\F081B"}.mdi-door-closed-lock:before{content:"\F10AF"}.mdi-door-open:before{content:"\F081C"}.mdi-doorbell:before{content:"\F12E6"}.mdi-doorbell-video:before{content:"\F0869"}.mdi-dot-net:before{content:"\F0AAE"}.mdi-dots-grid:before{content:"\F15FC"}.mdi-dots-hexagon:before{content:"\F15FF"}.mdi-dots-horizontal:before{content:"\F01D8"}.mdi-dots-horizontal-circle:before{content:"\F07C3"}.mdi-dots-horizontal-circle-outline:before{content:"\F0B8D"}.mdi-dots-square:before{content:"\F15FD"}.mdi-dots-triangle:before{content:"\F15FE"}.mdi-dots-vertical:before{content:"\F01D9"}.mdi-dots-vertical-circle:before{content:"\F07C4"}.mdi-dots-vertical-circle-outline:before{content:"\F0B8E"}.mdi-douban:before{content:"\F069A"}.mdi-download:before{content:"\F01DA"}.mdi-download-box:before{content:"\F1462"}.mdi-download-box-outline:before{content:"\F1463"}.mdi-download-circle:before{content:"\F1464"}.mdi-download-circle-outline:before{content:"\F1465"}.mdi-download-lock:before{content:"\F1320"}.mdi-download-lock-outline:before{content:"\F1321"}.mdi-download-multiple:before{content:"\F09E9"}.mdi-download-network:before{content:"\F06F4"}.mdi-download-network-outline:before{content:"\F0C66"}.mdi-download-off:before{content:"\F10B0"}.mdi-download-off-outline:before{content:"\F10B1"}.mdi-download-outline:before{content:"\F0B8F"}.mdi-drag:before{content:"\F01DB"}.mdi-drag-horizontal:before{content:"\F01DC"}.mdi-drag-horizontal-variant:before{content:"\F12F0"}.mdi-drag-variant:before{content:"\F0B90"}.mdi-drag-vertical:before{content:"\F01DD"}.mdi-drag-vertical-variant:before{content:"\F12F1"}.mdi-drama-masks:before{content:"\F0D02"}.mdi-draw:before{content:"\F0F49"}.mdi-drawing:before{content:"\F01DE"}.mdi-drawing-box:before{content:"\F01DF"}.mdi-dresser:before{content:"\F0F4A"}.mdi-dresser-outline:before{content:"\F0F4B"}.mdi-drone:before{content:"\F01E2"}.mdi-dropbox:before{content:"\F01E3"}.mdi-drupal:before{content:"\F01E4"}.mdi-duck:before{content:"\F01E5"}.mdi-dumbbell:before{content:"\F01E6"}.mdi-dump-truck:before{content:"\F0C67"}.mdi-ear-hearing:before{content:"\F07C5"}.mdi-ear-hearing-off:before{content:"\F0A45"}.mdi-earth:before{content:"\F01E7"}.mdi-earth-arrow-right:before{content:"\F1311"}.mdi-earth-box:before{content:"\F06CD"}.mdi-earth-box-minus:before{content:"\F1407"}.mdi-earth-box-off:before{content:"\F06CE"}.mdi-earth-box-plus:before{content:"\F1406"}.mdi-earth-box-remove:before{content:"\F1408"}.mdi-earth-minus:before{content:"\F1404"}.mdi-earth-off:before{content:"\F01E8"}.mdi-earth-plus:before{content:"\F1403"}.mdi-earth-remove:before{content:"\F1405"}.mdi-egg:before{content:"\F0AAF"}.mdi-egg-easter:before{content:"\F0AB0"}.mdi-egg-off:before{content:"\F13F0"}.mdi-egg-off-outline:before{content:"\F13F1"}.mdi-egg-outline:before{content:"\F13F2"}.mdi-eiffel-tower:before{content:"\F156B"}.mdi-eight-track:before{content:"\F09EA"}.mdi-eject:before{content:"\F01EA"}.mdi-eject-outline:before{content:"\F0B91"}.mdi-electric-switch:before{content:"\F0E9F"}.mdi-electric-switch-closed:before{content:"\F10D9"}.mdi-electron-framework:before{content:"\F1024"}.mdi-elephant:before{content:"\F07C6"}.mdi-elevation-decline:before{content:"\F01EB"}.mdi-elevation-rise:before{content:"\F01EC"}.mdi-elevator:before{content:"\F01ED"}.mdi-elevator-down:before{content:"\F12C2"}.mdi-elevator-passenger:before{content:"\F1381"}.mdi-elevator-up:before{content:"\F12C1"}.mdi-ellipse:before{content:"\F0EA0"}.mdi-ellipse-outline:before{content:"\F0EA1"}.mdi-email:before{content:"\F01EE"}.mdi-email-alert:before{content:"\F06CF"}.mdi-email-alert-outline:before{content:"\F0D42"}.mdi-email-box:before{content:"\F0D03"}.mdi-email-check:before{content:"\F0AB1"}.mdi-email-check-outline:before{content:"\F0AB2"}.mdi-email-edit:before{content:"\F0EE3"}.mdi-email-edit-outline:before{content:"\F0EE4"}.mdi-email-lock:before{content:"\F01F1"}.mdi-email-mark-as-unread:before{content:"\F0B92"}.mdi-email-minus:before{content:"\F0EE5"}.mdi-email-minus-outline:before{content:"\F0EE6"}.mdi-email-multiple:before{content:"\F0EE7"}.mdi-email-multiple-outline:before{content:"\F0EE8"}.mdi-email-newsletter:before{content:"\F0FB1"}.mdi-email-off:before{content:"\F13E3"}.mdi-email-off-outline:before{content:"\F13E4"}.mdi-email-open:before{content:"\F01EF"}.mdi-email-open-multiple:before{content:"\F0EE9"}.mdi-email-open-multiple-outline:before{content:"\F0EEA"}.mdi-email-open-outline:before{content:"\F05EF"}.mdi-email-outline:before{content:"\F01F0"}.mdi-email-plus:before{content:"\F09EB"}.mdi-email-plus-outline:before{content:"\F09EC"}.mdi-email-receive:before{content:"\F10DA"}.mdi-email-receive-outline:before{content:"\F10DB"}.mdi-email-remove:before{content:"\F1661"}.mdi-email-remove-outline:before{content:"\F1662"}.mdi-email-search:before{content:"\F0961"}.mdi-email-search-outline:before{content:"\F0962"}.mdi-email-send:before{content:"\F10DC"}.mdi-email-send-outline:before{content:"\F10DD"}.mdi-email-sync:before{content:"\F12C7"}.mdi-email-sync-outline:before{content:"\F12C8"}.mdi-email-variant:before{content:"\F05F0"}.mdi-ember:before{content:"\F0B30"}.mdi-emby:before{content:"\F06B4"}.mdi-emoticon:before{content:"\F0C68"}.mdi-emoticon-angry:before{content:"\F0C69"}.mdi-emoticon-angry-outline:before{content:"\F0C6A"}.mdi-emoticon-confused:before{content:"\F10DE"}.mdi-emoticon-confused-outline:before{content:"\F10DF"}.mdi-emoticon-cool:before{content:"\F0C6B"}.mdi-emoticon-cool-outline:before{content:"\F01F3"}.mdi-emoticon-cry:before{content:"\F0C6C"}.mdi-emoticon-cry-outline:before{content:"\F0C6D"}.mdi-emoticon-dead:before{content:"\F0C6E"}.mdi-emoticon-dead-outline:before{content:"\F069B"}.mdi-emoticon-devil:before{content:"\F0C6F"}.mdi-emoticon-devil-outline:before{content:"\F01F4"}.mdi-emoticon-excited:before{content:"\F0C70"}.mdi-emoticon-excited-outline:before{content:"\F069C"}.mdi-emoticon-frown:before{content:"\F0F4C"}.mdi-emoticon-frown-outline:before{content:"\F0F4D"}.mdi-emoticon-happy:before{content:"\F0C71"}.mdi-emoticon-happy-outline:before{content:"\F01F5"}.mdi-emoticon-kiss:before{content:"\F0C72"}.mdi-emoticon-kiss-outline:before{content:"\F0C73"}.mdi-emoticon-lol:before{content:"\F1214"}.mdi-emoticon-lol-outline:before{content:"\F1215"}.mdi-emoticon-neutral:before{content:"\F0C74"}.mdi-emoticon-neutral-outline:before{content:"\F01F6"}.mdi-emoticon-outline:before{content:"\F01F2"}.mdi-emoticon-poop:before{content:"\F01F7"}.mdi-emoticon-poop-outline:before{content:"\F0C75"}.mdi-emoticon-sad:before{content:"\F0C76"}.mdi-emoticon-sad-outline:before{content:"\F01F8"}.mdi-emoticon-sick:before{content:"\F157C"}.mdi-emoticon-sick-outline:before{content:"\F157D"}.mdi-emoticon-tongue:before{content:"\F01F9"}.mdi-emoticon-tongue-outline:before{content:"\F0C77"}.mdi-emoticon-wink:before{content:"\F0C78"}.mdi-emoticon-wink-outline:before{content:"\F0C79"}.mdi-engine:before{content:"\F01FA"}.mdi-engine-off:before{content:"\F0A46"}.mdi-engine-off-outline:before{content:"\F0A47"}.mdi-engine-outline:before{content:"\F01FB"}.mdi-epsilon:before{content:"\F10E0"}.mdi-equal:before{content:"\F01FC"}.mdi-equal-box:before{content:"\F01FD"}.mdi-equalizer:before{content:"\F0EA2"}.mdi-equalizer-outline:before{content:"\F0EA3"}.mdi-eraser:before{content:"\F01FE"}.mdi-eraser-variant:before{content:"\F0642"}.mdi-escalator:before{content:"\F01FF"}.mdi-escalator-box:before{content:"\F1399"}.mdi-escalator-down:before{content:"\F12C0"}.mdi-escalator-up:before{content:"\F12BF"}.mdi-eslint:before{content:"\F0C7A"}.mdi-et:before{content:"\F0AB3"}.mdi-ethereum:before{content:"\F086A"}.mdi-ethernet:before{content:"\F0200"}.mdi-ethernet-cable:before{content:"\F0201"}.mdi-ethernet-cable-off:before{content:"\F0202"}.mdi-ev-plug-ccs1:before{content:"\F1519"}.mdi-ev-plug-ccs2:before{content:"\F151A"}.mdi-ev-plug-chademo:before{content:"\F151B"}.mdi-ev-plug-tesla:before{content:"\F151C"}.mdi-ev-plug-type1:before{content:"\F151D"}.mdi-ev-plug-type2:before{content:"\F151E"}.mdi-ev-station:before{content:"\F05F1"}.mdi-evernote:before{content:"\F0204"}.mdi-excavator:before{content:"\F1025"}.mdi-exclamation:before{content:"\F0205"}.mdi-exclamation-thick:before{content:"\F1238"}.mdi-exit-run:before{content:"\F0A48"}.mdi-exit-to-app:before{content:"\F0206"}.mdi-expand-all:before{content:"\F0AB4"}.mdi-expand-all-outline:before{content:"\F0AB5"}.mdi-expansion-card:before{content:"\F08AE"}.mdi-expansion-card-variant:before{content:"\F0FB2"}.mdi-exponent:before{content:"\F0963"}.mdi-exponent-box:before{content:"\F0964"}.mdi-export:before{content:"\F0207"}.mdi-export-variant:before{content:"\F0B93"}.mdi-eye:before{content:"\F0208"}.mdi-eye-check:before{content:"\F0D04"}.mdi-eye-check-outline:before{content:"\F0D05"}.mdi-eye-circle:before{content:"\F0B94"}.mdi-eye-circle-outline:before{content:"\F0B95"}.mdi-eye-minus:before{content:"\F1026"}.mdi-eye-minus-outline:before{content:"\F1027"}.mdi-eye-off:before{content:"\F0209"}.mdi-eye-off-outline:before{content:"\F06D1"}.mdi-eye-outline:before{content:"\F06D0"}.mdi-eye-plus:before{content:"\F086B"}.mdi-eye-plus-outline:before{content:"\F086C"}.mdi-eye-remove:before{content:"\F15E3"}.mdi-eye-remove-outline:before{content:"\F15E4"}.mdi-eye-settings:before{content:"\F086D"}.mdi-eye-settings-outline:before{content:"\F086E"}.mdi-eyedropper:before{content:"\F020A"}.mdi-eyedropper-minus:before{content:"\F13DD"}.mdi-eyedropper-off:before{content:"\F13DF"}.mdi-eyedropper-plus:before{content:"\F13DC"}.mdi-eyedropper-remove:before{content:"\F13DE"}.mdi-eyedropper-variant:before{content:"\F020B"}.mdi-face:before{content:"\F0643"}.mdi-face-agent:before{content:"\F0D70"}.mdi-face-mask:before{content:"\F1586"}.mdi-face-mask-outline:before{content:"\F1587"}.mdi-face-outline:before{content:"\F0B96"}.mdi-face-profile:before{content:"\F0644"}.mdi-face-profile-woman:before{content:"\F1076"}.mdi-face-recognition:before{content:"\F0C7B"}.mdi-face-shimmer:before{content:"\F15CC"}.mdi-face-shimmer-outline:before{content:"\F15CD"}.mdi-face-woman:before{content:"\F1077"}.mdi-face-woman-outline:before{content:"\F1078"}.mdi-face-woman-shimmer:before{content:"\F15CE"}.mdi-face-woman-shimmer-outline:before{content:"\F15CF"}.mdi-facebook:before{content:"\F020C"}.mdi-facebook-gaming:before{content:"\F07DD"}.mdi-facebook-messenger:before{content:"\F020E"}.mdi-facebook-workplace:before{content:"\F0B31"}.mdi-factory:before{content:"\F020F"}.mdi-family-tree:before{content:"\F160E"}.mdi-fan:before{content:"\F0210"}.mdi-fan-alert:before{content:"\F146C"}.mdi-fan-auto:before{content:"\F171D"}.mdi-fan-chevron-down:before{content:"\F146D"}.mdi-fan-chevron-up:before{content:"\F146E"}.mdi-fan-minus:before{content:"\F1470"}.mdi-fan-off:before{content:"\F081D"}.mdi-fan-plus:before{content:"\F146F"}.mdi-fan-remove:before{content:"\F1471"}.mdi-fan-speed-1:before{content:"\F1472"}.mdi-fan-speed-2:before{content:"\F1473"}.mdi-fan-speed-3:before{content:"\F1474"}.mdi-fast-forward:before{content:"\F0211"}.mdi-fast-forward-10:before{content:"\F0D71"}.mdi-fast-forward-30:before{content:"\F0D06"}.mdi-fast-forward-5:before{content:"\F11F8"}.mdi-fast-forward-60:before{content:"\F160B"}.mdi-fast-forward-outline:before{content:"\F06D2"}.mdi-fax:before{content:"\F0212"}.mdi-feather:before{content:"\F06D3"}.mdi-feature-search:before{content:"\F0A49"}.mdi-feature-search-outline:before{content:"\F0A4A"}.mdi-fedora:before{content:"\F08DB"}.mdi-fencing:before{content:"\F14C1"}.mdi-ferris-wheel:before{content:"\F0EA4"}.mdi-ferry:before{content:"\F0213"}.mdi-file:before{content:"\F0214"}.mdi-file-account:before{content:"\F073B"}.mdi-file-account-outline:before{content:"\F1028"}.mdi-file-alert:before{content:"\F0A4B"}.mdi-file-alert-outline:before{content:"\F0A4C"}.mdi-file-cabinet:before{content:"\F0AB6"}.mdi-file-cad:before{content:"\F0EEB"}.mdi-file-cad-box:before{content:"\F0EEC"}.mdi-file-cancel:before{content:"\F0DC6"}.mdi-file-cancel-outline:before{content:"\F0DC7"}.mdi-file-certificate:before{content:"\F1186"}.mdi-file-certificate-outline:before{content:"\F1187"}.mdi-file-chart:before{content:"\F0215"}.mdi-file-chart-outline:before{content:"\F1029"}.mdi-file-check:before{content:"\F0216"}.mdi-file-check-outline:before{content:"\F0E29"}.mdi-file-clock:before{content:"\F12E1"}.mdi-file-clock-outline:before{content:"\F12E2"}.mdi-file-cloud:before{content:"\F0217"}.mdi-file-cloud-outline:before{content:"\F102A"}.mdi-file-code:before{content:"\F022E"}.mdi-file-code-outline:before{content:"\F102B"}.mdi-file-cog:before{content:"\F107B"}.mdi-file-cog-outline:before{content:"\F107C"}.mdi-file-compare:before{content:"\F08AA"}.mdi-file-delimited:before{content:"\F0218"}.mdi-file-delimited-outline:before{content:"\F0EA5"}.mdi-file-document:before{content:"\F0219"}.mdi-file-document-edit:before{content:"\F0DC8"}.mdi-file-document-edit-outline:before{content:"\F0DC9"}.mdi-file-document-multiple:before{content:"\F1517"}.mdi-file-document-multiple-outline:before{content:"\F1518"}.mdi-file-document-outline:before{content:"\F09EE"}.mdi-file-download:before{content:"\F0965"}.mdi-file-download-outline:before{content:"\F0966"}.mdi-file-edit:before{content:"\F11E7"}.mdi-file-edit-outline:before{content:"\F11E8"}.mdi-file-excel:before{content:"\F021B"}.mdi-file-excel-box:before{content:"\F021C"}.mdi-file-excel-box-outline:before{content:"\F102C"}.mdi-file-excel-outline:before{content:"\F102D"}.mdi-file-export:before{content:"\F021D"}.mdi-file-export-outline:before{content:"\F102E"}.mdi-file-eye:before{content:"\F0DCA"}.mdi-file-eye-outline:before{content:"\F0DCB"}.mdi-file-find:before{content:"\F021E"}.mdi-file-find-outline:before{content:"\F0B97"}.mdi-file-hidden:before{content:"\F0613"}.mdi-file-image:before{content:"\F021F"}.mdi-file-image-outline:before{content:"\F0EB0"}.mdi-file-import:before{content:"\F0220"}.mdi-file-import-outline:before{content:"\F102F"}.mdi-file-key:before{content:"\F1184"}.mdi-file-key-outline:before{content:"\F1185"}.mdi-file-link:before{content:"\F1177"}.mdi-file-link-outline:before{content:"\F1178"}.mdi-file-lock:before{content:"\F0221"}.mdi-file-lock-outline:before{content:"\F1030"}.mdi-file-move:before{content:"\F0AB9"}.mdi-file-move-outline:before{content:"\F1031"}.mdi-file-multiple:before{content:"\F0222"}.mdi-file-multiple-outline:before{content:"\F1032"}.mdi-file-music:before{content:"\F0223"}.mdi-file-music-outline:before{content:"\F0E2A"}.mdi-file-outline:before{content:"\F0224"}.mdi-file-pdf:before{content:"\F0225"}.mdi-file-pdf-box:before{content:"\F0226"}.mdi-file-pdf-box-outline:before{content:"\F0FB3"}.mdi-file-pdf-outline:before{content:"\F0E2D"}.mdi-file-percent:before{content:"\F081E"}.mdi-file-percent-outline:before{content:"\F1033"}.mdi-file-phone:before{content:"\F1179"}.mdi-file-phone-outline:before{content:"\F117A"}.mdi-file-plus:before{content:"\F0752"}.mdi-file-plus-outline:before{content:"\F0EED"}.mdi-file-powerpoint:before{content:"\F0227"}.mdi-file-powerpoint-box:before{content:"\F0228"}.mdi-file-powerpoint-box-outline:before{content:"\F1034"}.mdi-file-powerpoint-outline:before{content:"\F1035"}.mdi-file-presentation-box:before{content:"\F0229"}.mdi-file-question:before{content:"\F086F"}.mdi-file-question-outline:before{content:"\F1036"}.mdi-file-refresh:before{content:"\F0918"}.mdi-file-refresh-outline:before{content:"\F0541"}.mdi-file-remove:before{content:"\F0B98"}.mdi-file-remove-outline:before{content:"\F1037"}.mdi-file-replace:before{content:"\F0B32"}.mdi-file-replace-outline:before{content:"\F0B33"}.mdi-file-restore:before{content:"\F0670"}.mdi-file-restore-outline:before{content:"\F1038"}.mdi-file-search:before{content:"\F0C7C"}.mdi-file-search-outline:before{content:"\F0C7D"}.mdi-file-send:before{content:"\F022A"}.mdi-file-send-outline:before{content:"\F1039"}.mdi-file-settings:before{content:"\F1079"}.mdi-file-settings-outline:before{content:"\F107A"}.mdi-file-star:before{content:"\F103A"}.mdi-file-star-outline:before{content:"\F103B"}.mdi-file-swap:before{content:"\F0FB4"}.mdi-file-swap-outline:before{content:"\F0FB5"}.mdi-file-sync:before{content:"\F1216"}.mdi-file-sync-outline:before{content:"\F1217"}.mdi-file-table:before{content:"\F0C7E"}.mdi-file-table-box:before{content:"\F10E1"}.mdi-file-table-box-multiple:before{content:"\F10E2"}.mdi-file-table-box-multiple-outline:before{content:"\F10E3"}.mdi-file-table-box-outline:before{content:"\F10E4"}.mdi-file-table-outline:before{content:"\F0C7F"}.mdi-file-tree:before{content:"\F0645"}.mdi-file-tree-outline:before{content:"\F13D2"}.mdi-file-undo:before{content:"\F08DC"}.mdi-file-undo-outline:before{content:"\F103C"}.mdi-file-upload:before{content:"\F0A4D"}.mdi-file-upload-outline:before{content:"\F0A4E"}.mdi-file-video:before{content:"\F022B"}.mdi-file-video-outline:before{content:"\F0E2C"}.mdi-file-word:before{content:"\F022C"}.mdi-file-word-box:before{content:"\F022D"}.mdi-file-word-box-outline:before{content:"\F103D"}.mdi-file-word-outline:before{content:"\F103E"}.mdi-film:before{content:"\F022F"}.mdi-filmstrip:before{content:"\F0230"}.mdi-filmstrip-box:before{content:"\F0332"}.mdi-filmstrip-box-multiple:before{content:"\F0D18"}.mdi-filmstrip-off:before{content:"\F0231"}.mdi-filter:before{content:"\F0232"}.mdi-filter-menu:before{content:"\F10E5"}.mdi-filter-menu-outline:before{content:"\F10E6"}.mdi-filter-minus:before{content:"\F0EEE"}.mdi-filter-minus-outline:before{content:"\F0EEF"}.mdi-filter-off:before{content:"\F14EF"}.mdi-filter-off-outline:before{content:"\F14F0"}.mdi-filter-outline:before{content:"\F0233"}.mdi-filter-plus:before{content:"\F0EF0"}.mdi-filter-plus-outline:before{content:"\F0EF1"}.mdi-filter-remove:before{content:"\F0234"}.mdi-filter-remove-outline:before{content:"\F0235"}.mdi-filter-variant:before{content:"\F0236"}.mdi-filter-variant-minus:before{content:"\F1112"}.mdi-filter-variant-plus:before{content:"\F1113"}.mdi-filter-variant-remove:before{content:"\F103F"}.mdi-finance:before{content:"\F081F"}.mdi-find-replace:before{content:"\F06D4"}.mdi-fingerprint:before{content:"\F0237"}.mdi-fingerprint-off:before{content:"\F0EB1"}.mdi-fire:before{content:"\F0238"}.mdi-fire-alert:before{content:"\F15D7"}.mdi-fire-extinguisher:before{content:"\F0EF2"}.mdi-fire-hydrant:before{content:"\F1137"}.mdi-fire-hydrant-alert:before{content:"\F1138"}.mdi-fire-hydrant-off:before{content:"\F1139"}.mdi-fire-off:before{content:"\F1722"}.mdi-fire-truck:before{content:"\F08AB"}.mdi-firebase:before{content:"\F0967"}.mdi-firefox:before{content:"\F0239"}.mdi-fireplace:before{content:"\F0E2E"}.mdi-fireplace-off:before{content:"\F0E2F"}.mdi-firework:before{content:"\F0E30"}.mdi-firework-off:before{content:"\F1723"}.mdi-fish:before{content:"\F023A"}.mdi-fish-off:before{content:"\F13F3"}.mdi-fishbowl:before{content:"\F0EF3"}.mdi-fishbowl-outline:before{content:"\F0EF4"}.mdi-fit-to-page:before{content:"\F0EF5"}.mdi-fit-to-page-outline:before{content:"\F0EF6"}.mdi-flag:before{content:"\F023B"}.mdi-flag-checkered:before{content:"\F023C"}.mdi-flag-minus:before{content:"\F0B99"}.mdi-flag-minus-outline:before{content:"\F10B2"}.mdi-flag-outline:before{content:"\F023D"}.mdi-flag-plus:before{content:"\F0B9A"}.mdi-flag-plus-outline:before{content:"\F10B3"}.mdi-flag-remove:before{content:"\F0B9B"}.mdi-flag-remove-outline:before{content:"\F10B4"}.mdi-flag-triangle:before{content:"\F023F"}.mdi-flag-variant:before{content:"\F0240"}.mdi-flag-variant-outline:before{content:"\F023E"}.mdi-flare:before{content:"\F0D72"}.mdi-flash:before{content:"\F0241"}.mdi-flash-alert:before{content:"\F0EF7"}.mdi-flash-alert-outline:before{content:"\F0EF8"}.mdi-flash-auto:before{content:"\F0242"}.mdi-flash-circle:before{content:"\F0820"}.mdi-flash-off:before{content:"\F0243"}.mdi-flash-outline:before{content:"\F06D5"}.mdi-flash-red-eye:before{content:"\F067B"}.mdi-flashlight:before{content:"\F0244"}.mdi-flashlight-off:before{content:"\F0245"}.mdi-flask:before{content:"\F0093"}.mdi-flask-empty:before{content:"\F0094"}.mdi-flask-empty-minus:before{content:"\F123A"}.mdi-flask-empty-minus-outline:before{content:"\F123B"}.mdi-flask-empty-off:before{content:"\F13F4"}.mdi-flask-empty-off-outline:before{content:"\F13F5"}.mdi-flask-empty-outline:before{content:"\F0095"}.mdi-flask-empty-plus:before{content:"\F123C"}.mdi-flask-empty-plus-outline:before{content:"\F123D"}.mdi-flask-empty-remove:before{content:"\F123E"}.mdi-flask-empty-remove-outline:before{content:"\F123F"}.mdi-flask-minus:before{content:"\F1240"}.mdi-flask-minus-outline:before{content:"\F1241"}.mdi-flask-off:before{content:"\F13F6"}.mdi-flask-off-outline:before{content:"\F13F7"}.mdi-flask-outline:before{content:"\F0096"}.mdi-flask-plus:before{content:"\F1242"}.mdi-flask-plus-outline:before{content:"\F1243"}.mdi-flask-remove:before{content:"\F1244"}.mdi-flask-remove-outline:before{content:"\F1245"}.mdi-flask-round-bottom:before{content:"\F124B"}.mdi-flask-round-bottom-empty:before{content:"\F124C"}.mdi-flask-round-bottom-empty-outline:before{content:"\F124D"}.mdi-flask-round-bottom-outline:before{content:"\F124E"}.mdi-fleur-de-lis:before{content:"\F1303"}.mdi-flip-horizontal:before{content:"\F10E7"}.mdi-flip-to-back:before{content:"\F0247"}.mdi-flip-to-front:before{content:"\F0248"}.mdi-flip-vertical:before{content:"\F10E8"}.mdi-floor-lamp:before{content:"\F08DD"}.mdi-floor-lamp-dual:before{content:"\F1040"}.mdi-floor-lamp-variant:before{content:"\F1041"}.mdi-floor-plan:before{content:"\F0821"}.mdi-floppy:before{content:"\F0249"}.mdi-floppy-variant:before{content:"\F09EF"}.mdi-flower:before{content:"\F024A"}.mdi-flower-outline:before{content:"\F09F0"}.mdi-flower-poppy:before{content:"\F0D08"}.mdi-flower-tulip:before{content:"\F09F1"}.mdi-flower-tulip-outline:before{content:"\F09F2"}.mdi-focus-auto:before{content:"\F0F4E"}.mdi-focus-field:before{content:"\F0F4F"}.mdi-focus-field-horizontal:before{content:"\F0F50"}.mdi-focus-field-vertical:before{content:"\F0F51"}.mdi-folder:before{content:"\F024B"}.mdi-folder-account:before{content:"\F024C"}.mdi-folder-account-outline:before{content:"\F0B9C"}.mdi-folder-alert:before{content:"\F0DCC"}.mdi-folder-alert-outline:before{content:"\F0DCD"}.mdi-folder-clock:before{content:"\F0ABA"}.mdi-folder-clock-outline:before{content:"\F0ABB"}.mdi-folder-cog:before{content:"\F107F"}.mdi-folder-cog-outline:before{content:"\F1080"}.mdi-folder-download:before{content:"\F024D"}.mdi-folder-download-outline:before{content:"\F10E9"}.mdi-folder-edit:before{content:"\F08DE"}.mdi-folder-edit-outline:before{content:"\F0DCE"}.mdi-folder-google-drive:before{content:"\F024E"}.mdi-folder-heart:before{content:"\F10EA"}.mdi-folder-heart-outline:before{content:"\F10EB"}.mdi-folder-home:before{content:"\F10B5"}.mdi-folder-home-outline:before{content:"\F10B6"}.mdi-folder-image:before{content:"\F024F"}.mdi-folder-information:before{content:"\F10B7"}.mdi-folder-information-outline:before{content:"\F10B8"}.mdi-folder-key:before{content:"\F08AC"}.mdi-folder-key-network:before{content:"\F08AD"}.mdi-folder-key-network-outline:before{content:"\F0C80"}.mdi-folder-key-outline:before{content:"\F10EC"}.mdi-folder-lock:before{content:"\F0250"}.mdi-folder-lock-open:before{content:"\F0251"}.mdi-folder-marker:before{content:"\F126D"}.mdi-folder-marker-outline:before{content:"\F126E"}.mdi-folder-move:before{content:"\F0252"}.mdi-folder-move-outline:before{content:"\F1246"}.mdi-folder-multiple:before{content:"\F0253"}.mdi-folder-multiple-image:before{content:"\F0254"}.mdi-folder-multiple-outline:before{content:"\F0255"}.mdi-folder-multiple-plus:before{content:"\F147E"}.mdi-folder-multiple-plus-outline:before{content:"\F147F"}.mdi-folder-music:before{content:"\F1359"}.mdi-folder-music-outline:before{content:"\F135A"}.mdi-folder-network:before{content:"\F0870"}.mdi-folder-network-outline:before{content:"\F0C81"}.mdi-folder-open:before{content:"\F0770"}.mdi-folder-open-outline:before{content:"\F0DCF"}.mdi-folder-outline:before{content:"\F0256"}.mdi-folder-plus:before{content:"\F0257"}.mdi-folder-plus-outline:before{content:"\F0B9D"}.mdi-folder-pound:before{content:"\F0D09"}.mdi-folder-pound-outline:before{content:"\F0D0A"}.mdi-folder-refresh:before{content:"\F0749"}.mdi-folder-refresh-outline:before{content:"\F0542"}.mdi-folder-remove:before{content:"\F0258"}.mdi-folder-remove-outline:before{content:"\F0B9E"}.mdi-folder-search:before{content:"\F0968"}.mdi-folder-search-outline:before{content:"\F0969"}.mdi-folder-settings:before{content:"\F107D"}.mdi-folder-settings-outline:before{content:"\F107E"}.mdi-folder-star:before{content:"\F069D"}.mdi-folder-star-multiple:before{content:"\F13D3"}.mdi-folder-star-multiple-outline:before{content:"\F13D4"}.mdi-folder-star-outline:before{content:"\F0B9F"}.mdi-folder-swap:before{content:"\F0FB6"}.mdi-folder-swap-outline:before{content:"\F0FB7"}.mdi-folder-sync:before{content:"\F0D0B"}.mdi-folder-sync-outline:before{content:"\F0D0C"}.mdi-folder-table:before{content:"\F12E3"}.mdi-folder-table-outline:before{content:"\F12E4"}.mdi-folder-text:before{content:"\F0C82"}.mdi-folder-text-outline:before{content:"\F0C83"}.mdi-folder-upload:before{content:"\F0259"}.mdi-folder-upload-outline:before{content:"\F10ED"}.mdi-folder-zip:before{content:"\F06EB"}.mdi-folder-zip-outline:before{content:"\F07B9"}.mdi-font-awesome:before{content:"\F003A"}.mdi-food:before{content:"\F025A"}.mdi-food-apple:before{content:"\F025B"}.mdi-food-apple-outline:before{content:"\F0C84"}.mdi-food-croissant:before{content:"\F07C8"}.mdi-food-drumstick:before{content:"\F141F"}.mdi-food-drumstick-off:before{content:"\F1468"}.mdi-food-drumstick-off-outline:before{content:"\F1469"}.mdi-food-drumstick-outline:before{content:"\F1420"}.mdi-food-fork-drink:before{content:"\F05F2"}.mdi-food-halal:before{content:"\F1572"}.mdi-food-kosher:before{content:"\F1573"}.mdi-food-off:before{content:"\F05F3"}.mdi-food-steak:before{content:"\F146A"}.mdi-food-steak-off:before{content:"\F146B"}.mdi-food-turkey:before{content:"\F171C"}.mdi-food-variant:before{content:"\F025C"}.mdi-food-variant-off:before{content:"\F13E5"}.mdi-foot-print:before{content:"\F0F52"}.mdi-football:before{content:"\F025D"}.mdi-football-australian:before{content:"\F025E"}.mdi-football-helmet:before{content:"\F025F"}.mdi-forklift:before{content:"\F07C9"}.mdi-form-dropdown:before{content:"\F1400"}.mdi-form-select:before{content:"\F1401"}.mdi-form-textarea:before{content:"\F1095"}.mdi-form-textbox:before{content:"\F060E"}.mdi-form-textbox-lock:before{content:"\F135D"}.mdi-form-textbox-password:before{content:"\F07F5"}.mdi-format-align-bottom:before{content:"\F0753"}.mdi-format-align-center:before{content:"\F0260"}.mdi-format-align-justify:before{content:"\F0261"}.mdi-format-align-left:before{content:"\F0262"}.mdi-format-align-middle:before{content:"\F0754"}.mdi-format-align-right:before{content:"\F0263"}.mdi-format-align-top:before{content:"\F0755"}.mdi-format-annotation-minus:before{content:"\F0ABC"}.mdi-format-annotation-plus:before{content:"\F0646"}.mdi-format-bold:before{content:"\F0264"}.mdi-format-clear:before{content:"\F0265"}.mdi-format-color-fill:before{content:"\F0266"}.mdi-format-color-highlight:before{content:"\F0E31"}.mdi-format-color-marker-cancel:before{content:"\F1313"}.mdi-format-color-text:before{content:"\F069E"}.mdi-format-columns:before{content:"\F08DF"}.mdi-format-float-center:before{content:"\F0267"}.mdi-format-float-left:before{content:"\F0268"}.mdi-format-float-none:before{content:"\F0269"}.mdi-format-float-right:before{content:"\F026A"}.mdi-format-font:before{content:"\F06D6"}.mdi-format-font-size-decrease:before{content:"\F09F3"}.mdi-format-font-size-increase:before{content:"\F09F4"}.mdi-format-header-1:before{content:"\F026B"}.mdi-format-header-2:before{content:"\F026C"}.mdi-format-header-3:before{content:"\F026D"}.mdi-format-header-4:before{content:"\F026E"}.mdi-format-header-5:before{content:"\F026F"}.mdi-format-header-6:before{content:"\F0270"}.mdi-format-header-decrease:before{content:"\F0271"}.mdi-format-header-equal:before{content:"\F0272"}.mdi-format-header-increase:before{content:"\F0273"}.mdi-format-header-pound:before{content:"\F0274"}.mdi-format-horizontal-align-center:before{content:"\F061E"}.mdi-format-horizontal-align-left:before{content:"\F061F"}.mdi-format-horizontal-align-right:before{content:"\F0620"}.mdi-format-indent-decrease:before{content:"\F0275"}.mdi-format-indent-increase:before{content:"\F0276"}.mdi-format-italic:before{content:"\F0277"}.mdi-format-letter-case:before{content:"\F0B34"}.mdi-format-letter-case-lower:before{content:"\F0B35"}.mdi-format-letter-case-upper:before{content:"\F0B36"}.mdi-format-letter-ends-with:before{content:"\F0FB8"}.mdi-format-letter-matches:before{content:"\F0FB9"}.mdi-format-letter-starts-with:before{content:"\F0FBA"}.mdi-format-line-spacing:before{content:"\F0278"}.mdi-format-line-style:before{content:"\F05C8"}.mdi-format-line-weight:before{content:"\F05C9"}.mdi-format-list-bulleted:before{content:"\F0279"}.mdi-format-list-bulleted-square:before{content:"\F0DD0"}.mdi-format-list-bulleted-triangle:before{content:"\F0EB2"}.mdi-format-list-bulleted-type:before{content:"\F027A"}.mdi-format-list-checkbox:before{content:"\F096A"}.mdi-format-list-checks:before{content:"\F0756"}.mdi-format-list-numbered:before{content:"\F027B"}.mdi-format-list-numbered-rtl:before{content:"\F0D0D"}.mdi-format-list-text:before{content:"\F126F"}.mdi-format-overline:before{content:"\F0EB3"}.mdi-format-page-break:before{content:"\F06D7"}.mdi-format-paint:before{content:"\F027C"}.mdi-format-paragraph:before{content:"\F027D"}.mdi-format-pilcrow:before{content:"\F06D8"}.mdi-format-quote-close:before{content:"\F027E"}.mdi-format-quote-close-outline:before{content:"\F11A8"}.mdi-format-quote-open:before{content:"\F0757"}.mdi-format-quote-open-outline:before{content:"\F11A7"}.mdi-format-rotate-90:before{content:"\F06AA"}.mdi-format-section:before{content:"\F069F"}.mdi-format-size:before{content:"\F027F"}.mdi-format-strikethrough:before{content:"\F0280"}.mdi-format-strikethrough-variant:before{content:"\F0281"}.mdi-format-subscript:before{content:"\F0282"}.mdi-format-superscript:before{content:"\F0283"}.mdi-format-text:before{content:"\F0284"}.mdi-format-text-rotation-angle-down:before{content:"\F0FBB"}.mdi-format-text-rotation-angle-up:before{content:"\F0FBC"}.mdi-format-text-rotation-down:before{content:"\F0D73"}.mdi-format-text-rotation-down-vertical:before{content:"\F0FBD"}.mdi-format-text-rotation-none:before{content:"\F0D74"}.mdi-format-text-rotation-up:before{content:"\F0FBE"}.mdi-format-text-rotation-vertical:before{content:"\F0FBF"}.mdi-format-text-variant:before{content:"\F0E32"}.mdi-format-text-variant-outline:before{content:"\F150F"}.mdi-format-text-wrapping-clip:before{content:"\F0D0E"}.mdi-format-text-wrapping-overflow:before{content:"\F0D0F"}.mdi-format-text-wrapping-wrap:before{content:"\F0D10"}.mdi-format-textbox:before{content:"\F0D11"}.mdi-format-textdirection-l-to-r:before{content:"\F0285"}.mdi-format-textdirection-r-to-l:before{content:"\F0286"}.mdi-format-title:before{content:"\F05F4"}.mdi-format-underline:before{content:"\F0287"}.mdi-format-vertical-align-bottom:before{content:"\F0621"}.mdi-format-vertical-align-center:before{content:"\F0622"}.mdi-format-vertical-align-top:before{content:"\F0623"}.mdi-format-wrap-inline:before{content:"\F0288"}.mdi-format-wrap-square:before{content:"\F0289"}.mdi-format-wrap-tight:before{content:"\F028A"}.mdi-format-wrap-top-bottom:before{content:"\F028B"}.mdi-forum:before{content:"\F028C"}.mdi-forum-outline:before{content:"\F0822"}.mdi-forward:before{content:"\F028D"}.mdi-forwardburger:before{content:"\F0D75"}.mdi-fountain:before{content:"\F096B"}.mdi-fountain-pen:before{content:"\F0D12"}.mdi-fountain-pen-tip:before{content:"\F0D13"}.mdi-freebsd:before{content:"\F08E0"}.mdi-frequently-asked-questions:before{content:"\F0EB4"}.mdi-fridge:before{content:"\F0290"}.mdi-fridge-alert:before{content:"\F11B1"}.mdi-fridge-alert-outline:before{content:"\F11B2"}.mdi-fridge-bottom:before{content:"\F0292"}.mdi-fridge-industrial:before{content:"\F15EE"}.mdi-fridge-industrial-alert:before{content:"\F15EF"}.mdi-fridge-industrial-alert-outline:before{content:"\F15F0"}.mdi-fridge-industrial-off:before{content:"\F15F1"}.mdi-fridge-industrial-off-outline:before{content:"\F15F2"}.mdi-fridge-industrial-outline:before{content:"\F15F3"}.mdi-fridge-off:before{content:"\F11AF"}.mdi-fridge-off-outline:before{content:"\F11B0"}.mdi-fridge-outline:before{content:"\F028F"}.mdi-fridge-top:before{content:"\F0291"}.mdi-fridge-variant:before{content:"\F15F4"}.mdi-fridge-variant-alert:before{content:"\F15F5"}.mdi-fridge-variant-alert-outline:before{content:"\F15F6"}.mdi-fridge-variant-off:before{content:"\F15F7"}.mdi-fridge-variant-off-outline:before{content:"\F15F8"}.mdi-fridge-variant-outline:before{content:"\F15F9"}.mdi-fruit-cherries:before{content:"\F1042"}.mdi-fruit-cherries-off:before{content:"\F13F8"}.mdi-fruit-citrus:before{content:"\F1043"}.mdi-fruit-citrus-off:before{content:"\F13F9"}.mdi-fruit-grapes:before{content:"\F1044"}.mdi-fruit-grapes-outline:before{content:"\F1045"}.mdi-fruit-pineapple:before{content:"\F1046"}.mdi-fruit-watermelon:before{content:"\F1047"}.mdi-fuel:before{content:"\F07CA"}.mdi-fullscreen:before{content:"\F0293"}.mdi-fullscreen-exit:before{content:"\F0294"}.mdi-function:before{content:"\F0295"}.mdi-function-variant:before{content:"\F0871"}.mdi-furigana-horizontal:before{content:"\F1081"}.mdi-furigana-vertical:before{content:"\F1082"}.mdi-fuse:before{content:"\F0C85"}.mdi-fuse-alert:before{content:"\F142D"}.mdi-fuse-blade:before{content:"\F0C86"}.mdi-fuse-off:before{content:"\F142C"}.mdi-gamepad:before{content:"\F0296"}.mdi-gamepad-circle:before{content:"\F0E33"}.mdi-gamepad-circle-down:before{content:"\F0E34"}.mdi-gamepad-circle-left:before{content:"\F0E35"}.mdi-gamepad-circle-outline:before{content:"\F0E36"}.mdi-gamepad-circle-right:before{content:"\F0E37"}.mdi-gamepad-circle-up:before{content:"\F0E38"}.mdi-gamepad-down:before{content:"\F0E39"}.mdi-gamepad-left:before{content:"\F0E3A"}.mdi-gamepad-right:before{content:"\F0E3B"}.mdi-gamepad-round:before{content:"\F0E3C"}.mdi-gamepad-round-down:before{content:"\F0E3D"}.mdi-gamepad-round-left:before{content:"\F0E3E"}.mdi-gamepad-round-outline:before{content:"\F0E3F"}.mdi-gamepad-round-right:before{content:"\F0E40"}.mdi-gamepad-round-up:before{content:"\F0E41"}.mdi-gamepad-square:before{content:"\F0EB5"}.mdi-gamepad-square-outline:before{content:"\F0EB6"}.mdi-gamepad-up:before{content:"\F0E42"}.mdi-gamepad-variant:before{content:"\F0297"}.mdi-gamepad-variant-outline:before{content:"\F0EB7"}.mdi-gamma:before{content:"\F10EE"}.mdi-gantry-crane:before{content:"\F0DD1"}.mdi-garage:before{content:"\F06D9"}.mdi-garage-alert:before{content:"\F0872"}.mdi-garage-alert-variant:before{content:"\F12D5"}.mdi-garage-open:before{content:"\F06DA"}.mdi-garage-open-variant:before{content:"\F12D4"}.mdi-garage-variant:before{content:"\F12D3"}.mdi-gas-cylinder:before{content:"\F0647"}.mdi-gas-station:before{content:"\F0298"}.mdi-gas-station-off:before{content:"\F1409"}.mdi-gas-station-off-outline:before{content:"\F140A"}.mdi-gas-station-outline:before{content:"\F0EB8"}.mdi-gate:before{content:"\F0299"}.mdi-gate-and:before{content:"\F08E1"}.mdi-gate-arrow-right:before{content:"\F1169"}.mdi-gate-nand:before{content:"\F08E2"}.mdi-gate-nor:before{content:"\F08E3"}.mdi-gate-not:before{content:"\F08E4"}.mdi-gate-open:before{content:"\F116A"}.mdi-gate-or:before{content:"\F08E5"}.mdi-gate-xnor:before{content:"\F08E6"}.mdi-gate-xor:before{content:"\F08E7"}.mdi-gatsby:before{content:"\F0E43"}.mdi-gauge:before{content:"\F029A"}.mdi-gauge-empty:before{content:"\F0873"}.mdi-gauge-full:before{content:"\F0874"}.mdi-gauge-low:before{content:"\F0875"}.mdi-gavel:before{content:"\F029B"}.mdi-gender-female:before{content:"\F029C"}.mdi-gender-male:before{content:"\F029D"}.mdi-gender-male-female:before{content:"\F029E"}.mdi-gender-male-female-variant:before{content:"\F113F"}.mdi-gender-non-binary:before{content:"\F1140"}.mdi-gender-transgender:before{content:"\F029F"}.mdi-gentoo:before{content:"\F08E8"}.mdi-gesture:before{content:"\F07CB"}.mdi-gesture-double-tap:before{content:"\F073C"}.mdi-gesture-pinch:before{content:"\F0ABD"}.mdi-gesture-spread:before{content:"\F0ABE"}.mdi-gesture-swipe:before{content:"\F0D76"}.mdi-gesture-swipe-down:before{content:"\F073D"}.mdi-gesture-swipe-horizontal:before{content:"\F0ABF"}.mdi-gesture-swipe-left:before{content:"\F073E"}.mdi-gesture-swipe-right:before{content:"\F073F"}.mdi-gesture-swipe-up:before{content:"\F0740"}.mdi-gesture-swipe-vertical:before{content:"\F0AC0"}.mdi-gesture-tap:before{content:"\F0741"}.mdi-gesture-tap-box:before{content:"\F12A9"}.mdi-gesture-tap-button:before{content:"\F12A8"}.mdi-gesture-tap-hold:before{content:"\F0D77"}.mdi-gesture-two-double-tap:before{content:"\F0742"}.mdi-gesture-two-tap:before{content:"\F0743"}.mdi-ghost:before{content:"\F02A0"}.mdi-ghost-off:before{content:"\F09F5"}.mdi-ghost-off-outline:before{content:"\F165C"}.mdi-ghost-outline:before{content:"\F165D"}.mdi-gif:before{content:"\F0D78"}.mdi-gift:before{content:"\F0E44"}.mdi-gift-off:before{content:"\F16EF"}.mdi-gift-off-outline:before{content:"\F16F0"}.mdi-gift-open:before{content:"\F16F1"}.mdi-gift-open-outline:before{content:"\F16F2"}.mdi-gift-outline:before{content:"\F02A1"}.mdi-git:before{content:"\F02A2"}.mdi-github:before{content:"\F02A4"}.mdi-gitlab:before{content:"\F0BA0"}.mdi-glass-cocktail:before{content:"\F0356"}.mdi-glass-cocktail-off:before{content:"\F15E6"}.mdi-glass-flute:before{content:"\F02A5"}.mdi-glass-mug:before{content:"\F02A6"}.mdi-glass-mug-off:before{content:"\F15E7"}.mdi-glass-mug-variant:before{content:"\F1116"}.mdi-glass-mug-variant-off:before{content:"\F15E8"}.mdi-glass-pint-outline:before{content:"\F130D"}.mdi-glass-stange:before{content:"\F02A7"}.mdi-glass-tulip:before{content:"\F02A8"}.mdi-glass-wine:before{content:"\F0876"}.mdi-glasses:before{content:"\F02AA"}.mdi-globe-light:before{content:"\F12D7"}.mdi-globe-model:before{content:"\F08E9"}.mdi-gmail:before{content:"\F02AB"}.mdi-gnome:before{content:"\F02AC"}.mdi-go-kart:before{content:"\F0D79"}.mdi-go-kart-track:before{content:"\F0D7A"}.mdi-gog:before{content:"\F0BA1"}.mdi-gold:before{content:"\F124F"}.mdi-golf:before{content:"\F0823"}.mdi-golf-cart:before{content:"\F11A4"}.mdi-golf-tee:before{content:"\F1083"}.mdi-gondola:before{content:"\F0686"}.mdi-goodreads:before{content:"\F0D7B"}.mdi-google:before{content:"\F02AD"}.mdi-google-ads:before{content:"\F0C87"}.mdi-google-analytics:before{content:"\F07CC"}.mdi-google-assistant:before{content:"\F07CD"}.mdi-google-cardboard:before{content:"\F02AE"}.mdi-google-chrome:before{content:"\F02AF"}.mdi-google-circles:before{content:"\F02B0"}.mdi-google-circles-communities:before{content:"\F02B1"}.mdi-google-circles-extended:before{content:"\F02B2"}.mdi-google-circles-group:before{content:"\F02B3"}.mdi-google-classroom:before{content:"\F02C0"}.mdi-google-cloud:before{content:"\F11F6"}.mdi-google-controller:before{content:"\F02B4"}.mdi-google-controller-off:before{content:"\F02B5"}.mdi-google-downasaur:before{content:"\F1362"}.mdi-google-drive:before{content:"\F02B6"}.mdi-google-earth:before{content:"\F02B7"}.mdi-google-fit:before{content:"\F096C"}.mdi-google-glass:before{content:"\F02B8"}.mdi-google-hangouts:before{content:"\F02C9"}.mdi-google-home:before{content:"\F0824"}.mdi-google-keep:before{content:"\F06DC"}.mdi-google-lens:before{content:"\F09F6"}.mdi-google-maps:before{content:"\F05F5"}.mdi-google-my-business:before{content:"\F1048"}.mdi-google-nearby:before{content:"\F02B9"}.mdi-google-photos:before{content:"\F06DD"}.mdi-google-play:before{content:"\F02BC"}.mdi-google-plus:before{content:"\F02BD"}.mdi-google-podcast:before{content:"\F0EB9"}.mdi-google-spreadsheet:before{content:"\F09F7"}.mdi-google-street-view:before{content:"\F0C88"}.mdi-google-translate:before{content:"\F02BF"}.mdi-gradient:before{content:"\F06A0"}.mdi-grain:before{content:"\F0D7C"}.mdi-graph:before{content:"\F1049"}.mdi-graph-outline:before{content:"\F104A"}.mdi-graphql:before{content:"\F0877"}.mdi-grass:before{content:"\F1510"}.mdi-grave-stone:before{content:"\F0BA2"}.mdi-grease-pencil:before{content:"\F0648"}.mdi-greater-than:before{content:"\F096D"}.mdi-greater-than-or-equal:before{content:"\F096E"}.mdi-grid:before{content:"\F02C1"}.mdi-grid-large:before{content:"\F0758"}.mdi-grid-off:before{content:"\F02C2"}.mdi-grill:before{content:"\F0E45"}.mdi-grill-outline:before{content:"\F118A"}.mdi-group:before{content:"\F02C3"}.mdi-guitar-acoustic:before{content:"\F0771"}.mdi-guitar-electric:before{content:"\F02C4"}.mdi-guitar-pick:before{content:"\F02C5"}.mdi-guitar-pick-outline:before{content:"\F02C6"}.mdi-guy-fawkes-mask:before{content:"\F0825"}.mdi-hail:before{content:"\F0AC1"}.mdi-hair-dryer:before{content:"\F10EF"}.mdi-hair-dryer-outline:before{content:"\F10F0"}.mdi-halloween:before{content:"\F0BA3"}.mdi-hamburger:before{content:"\F0685"}.mdi-hammer:before{content:"\F08EA"}.mdi-hammer-screwdriver:before{content:"\F1322"}.mdi-hammer-wrench:before{content:"\F1323"}.mdi-hand:before{content:"\F0A4F"}.mdi-hand-heart:before{content:"\F10F1"}.mdi-hand-heart-outline:before{content:"\F157E"}.mdi-hand-left:before{content:"\F0E46"}.mdi-hand-okay:before{content:"\F0A50"}.mdi-hand-peace:before{content:"\F0A51"}.mdi-hand-peace-variant:before{content:"\F0A52"}.mdi-hand-pointing-down:before{content:"\F0A53"}.mdi-hand-pointing-left:before{content:"\F0A54"}.mdi-hand-pointing-right:before{content:"\F02C7"}.mdi-hand-pointing-up:before{content:"\F0A55"}.mdi-hand-right:before{content:"\F0E47"}.mdi-hand-saw:before{content:"\F0E48"}.mdi-hand-wash:before{content:"\F157F"}.mdi-hand-wash-outline:before{content:"\F1580"}.mdi-hand-water:before{content:"\F139F"}.mdi-handball:before{content:"\F0F53"}.mdi-handcuffs:before{content:"\F113E"}.mdi-handshake:before{content:"\F1218"}.mdi-handshake-outline:before{content:"\F15A1"}.mdi-hanger:before{content:"\F02C8"}.mdi-hard-hat:before{content:"\F096F"}.mdi-harddisk:before{content:"\F02CA"}.mdi-harddisk-plus:before{content:"\F104B"}.mdi-harddisk-remove:before{content:"\F104C"}.mdi-hat-fedora:before{content:"\F0BA4"}.mdi-hazard-lights:before{content:"\F0C89"}.mdi-hdr:before{content:"\F0D7D"}.mdi-hdr-off:before{content:"\F0D7E"}.mdi-head:before{content:"\F135E"}.mdi-head-alert:before{content:"\F1338"}.mdi-head-alert-outline:before{content:"\F1339"}.mdi-head-check:before{content:"\F133A"}.mdi-head-check-outline:before{content:"\F133B"}.mdi-head-cog:before{content:"\F133C"}.mdi-head-cog-outline:before{content:"\F133D"}.mdi-head-dots-horizontal:before{content:"\F133E"}.mdi-head-dots-horizontal-outline:before{content:"\F133F"}.mdi-head-flash:before{content:"\F1340"}.mdi-head-flash-outline:before{content:"\F1341"}.mdi-head-heart:before{content:"\F1342"}.mdi-head-heart-outline:before{content:"\F1343"}.mdi-head-lightbulb:before{content:"\F1344"}.mdi-head-lightbulb-outline:before{content:"\F1345"}.mdi-head-minus:before{content:"\F1346"}.mdi-head-minus-outline:before{content:"\F1347"}.mdi-head-outline:before{content:"\F135F"}.mdi-head-plus:before{content:"\F1348"}.mdi-head-plus-outline:before{content:"\F1349"}.mdi-head-question:before{content:"\F134A"}.mdi-head-question-outline:before{content:"\F134B"}.mdi-head-remove:before{content:"\F134C"}.mdi-head-remove-outline:before{content:"\F134D"}.mdi-head-snowflake:before{content:"\F134E"}.mdi-head-snowflake-outline:before{content:"\F134F"}.mdi-head-sync:before{content:"\F1350"}.mdi-head-sync-outline:before{content:"\F1351"}.mdi-headphones:before{content:"\F02CB"}.mdi-headphones-bluetooth:before{content:"\F0970"}.mdi-headphones-box:before{content:"\F02CC"}.mdi-headphones-off:before{content:"\F07CE"}.mdi-headphones-settings:before{content:"\F02CD"}.mdi-headset:before{content:"\F02CE"}.mdi-headset-dock:before{content:"\F02CF"}.mdi-headset-off:before{content:"\F02D0"}.mdi-heart:before{content:"\F02D1"}.mdi-heart-box:before{content:"\F02D2"}.mdi-heart-box-outline:before{content:"\F02D3"}.mdi-heart-broken:before{content:"\F02D4"}.mdi-heart-broken-outline:before{content:"\F0D14"}.mdi-heart-circle:before{content:"\F0971"}.mdi-heart-circle-outline:before{content:"\F0972"}.mdi-heart-cog:before{content:"\F1663"}.mdi-heart-cog-outline:before{content:"\F1664"}.mdi-heart-flash:before{content:"\F0EF9"}.mdi-heart-half:before{content:"\F06DF"}.mdi-heart-half-full:before{content:"\F06DE"}.mdi-heart-half-outline:before{content:"\F06E0"}.mdi-heart-minus:before{content:"\F142F"}.mdi-heart-minus-outline:before{content:"\F1432"}.mdi-heart-multiple:before{content:"\F0A56"}.mdi-heart-multiple-outline:before{content:"\F0A57"}.mdi-heart-off:before{content:"\F0759"}.mdi-heart-off-outline:before{content:"\F1434"}.mdi-heart-outline:before{content:"\F02D5"}.mdi-heart-plus:before{content:"\F142E"}.mdi-heart-plus-outline:before{content:"\F1431"}.mdi-heart-pulse:before{content:"\F05F6"}.mdi-heart-remove:before{content:"\F1430"}.mdi-heart-remove-outline:before{content:"\F1433"}.mdi-heart-settings:before{content:"\F1665"}.mdi-heart-settings-outline:before{content:"\F1666"}.mdi-helicopter:before{content:"\F0AC2"}.mdi-help:before{content:"\F02D6"}.mdi-help-box:before{content:"\F078B"}.mdi-help-circle:before{content:"\F02D7"}.mdi-help-circle-outline:before{content:"\F0625"}.mdi-help-network:before{content:"\F06F5"}.mdi-help-network-outline:before{content:"\F0C8A"}.mdi-help-rhombus:before{content:"\F0BA5"}.mdi-help-rhombus-outline:before{content:"\F0BA6"}.mdi-hexadecimal:before{content:"\F12A7"}.mdi-hexagon:before{content:"\F02D8"}.mdi-hexagon-multiple:before{content:"\F06E1"}.mdi-hexagon-multiple-outline:before{content:"\F10F2"}.mdi-hexagon-outline:before{content:"\F02D9"}.mdi-hexagon-slice-1:before{content:"\F0AC3"}.mdi-hexagon-slice-2:before{content:"\F0AC4"}.mdi-hexagon-slice-3:before{content:"\F0AC5"}.mdi-hexagon-slice-4:before{content:"\F0AC6"}.mdi-hexagon-slice-5:before{content:"\F0AC7"}.mdi-hexagon-slice-6:before{content:"\F0AC8"}.mdi-hexagram:before{content:"\F0AC9"}.mdi-hexagram-outline:before{content:"\F0ACA"}.mdi-high-definition:before{content:"\F07CF"}.mdi-high-definition-box:before{content:"\F0878"}.mdi-highway:before{content:"\F05F7"}.mdi-hiking:before{content:"\F0D7F"}.mdi-hinduism:before{content:"\F0973"}.mdi-history:before{content:"\F02DA"}.mdi-hockey-puck:before{content:"\F0879"}.mdi-hockey-sticks:before{content:"\F087A"}.mdi-hololens:before{content:"\F02DB"}.mdi-home:before{content:"\F02DC"}.mdi-home-account:before{content:"\F0826"}.mdi-home-alert:before{content:"\F087B"}.mdi-home-alert-outline:before{content:"\F15D0"}.mdi-home-analytics:before{content:"\F0EBA"}.mdi-home-assistant:before{content:"\F07D0"}.mdi-home-automation:before{content:"\F07D1"}.mdi-home-circle:before{content:"\F07D2"}.mdi-home-circle-outline:before{content:"\F104D"}.mdi-home-city:before{content:"\F0D15"}.mdi-home-city-outline:before{content:"\F0D16"}.mdi-home-currency-usd:before{content:"\F08AF"}.mdi-home-edit:before{content:"\F1159"}.mdi-home-edit-outline:before{content:"\F115A"}.mdi-home-export-outline:before{content:"\F0F9B"}.mdi-home-flood:before{content:"\F0EFA"}.mdi-home-floor-0:before{content:"\F0DD2"}.mdi-home-floor-1:before{content:"\F0D80"}.mdi-home-floor-2:before{content:"\F0D81"}.mdi-home-floor-3:before{content:"\F0D82"}.mdi-home-floor-a:before{content:"\F0D83"}.mdi-home-floor-b:before{content:"\F0D84"}.mdi-home-floor-g:before{content:"\F0D85"}.mdi-home-floor-l:before{content:"\F0D86"}.mdi-home-floor-negative-1:before{content:"\F0DD3"}.mdi-home-group:before{content:"\F0DD4"}.mdi-home-heart:before{content:"\F0827"}.mdi-home-import-outline:before{content:"\F0F9C"}.mdi-home-lightbulb:before{content:"\F1251"}.mdi-home-lightbulb-outline:before{content:"\F1252"}.mdi-home-lock:before{content:"\F08EB"}.mdi-home-lock-open:before{content:"\F08EC"}.mdi-home-map-marker:before{content:"\F05F8"}.mdi-home-minus:before{content:"\F0974"}.mdi-home-minus-outline:before{content:"\F13D5"}.mdi-home-modern:before{content:"\F02DD"}.mdi-home-outline:before{content:"\F06A1"}.mdi-home-plus:before{content:"\F0975"}.mdi-home-plus-outline:before{content:"\F13D6"}.mdi-home-remove:before{content:"\F1247"}.mdi-home-remove-outline:before{content:"\F13D7"}.mdi-home-roof:before{content:"\F112B"}.mdi-home-search:before{content:"\F13B0"}.mdi-home-search-outline:before{content:"\F13B1"}.mdi-home-thermometer:before{content:"\F0F54"}.mdi-home-thermometer-outline:before{content:"\F0F55"}.mdi-home-variant:before{content:"\F02DE"}.mdi-home-variant-outline:before{content:"\F0BA7"}.mdi-hook:before{content:"\F06E2"}.mdi-hook-off:before{content:"\F06E3"}.mdi-hops:before{content:"\F02DF"}.mdi-horizontal-rotate-clockwise:before{content:"\F10F3"}.mdi-horizontal-rotate-counterclockwise:before{content:"\F10F4"}.mdi-horse:before{content:"\F15BF"}.mdi-horse-human:before{content:"\F15C0"}.mdi-horse-variant:before{content:"\F15C1"}.mdi-horseshoe:before{content:"\F0A58"}.mdi-hospital:before{content:"\F0FF6"}.mdi-hospital-box:before{content:"\F02E0"}.mdi-hospital-box-outline:before{content:"\F0FF7"}.mdi-hospital-building:before{content:"\F02E1"}.mdi-hospital-marker:before{content:"\F02E2"}.mdi-hot-tub:before{content:"\F0828"}.mdi-hours-24:before{content:"\F1478"}.mdi-hubspot:before{content:"\F0D17"}.mdi-hulu:before{content:"\F0829"}.mdi-human:before{content:"\F02E6"}.mdi-human-baby-changing-table:before{content:"\F138B"}.mdi-human-cane:before{content:"\F1581"}.mdi-human-capacity-decrease:before{content:"\F159B"}.mdi-human-capacity-increase:before{content:"\F159C"}.mdi-human-child:before{content:"\F02E7"}.mdi-human-edit:before{content:"\F14E8"}.mdi-human-female:before{content:"\F0649"}.mdi-human-female-boy:before{content:"\F0A59"}.mdi-human-female-dance:before{content:"\F15C9"}.mdi-human-female-female:before{content:"\F0A5A"}.mdi-human-female-girl:before{content:"\F0A5B"}.mdi-human-greeting:before{content:"\F064A"}.mdi-human-greeting-proximity:before{content:"\F159D"}.mdi-human-handsdown:before{content:"\F064B"}.mdi-human-handsup:before{content:"\F064C"}.mdi-human-male:before{content:"\F064D"}.mdi-human-male-boy:before{content:"\F0A5C"}.mdi-human-male-child:before{content:"\F138C"}.mdi-human-male-female:before{content:"\F02E8"}.mdi-human-male-girl:before{content:"\F0A5D"}.mdi-human-male-height:before{content:"\F0EFB"}.mdi-human-male-height-variant:before{content:"\F0EFC"}.mdi-human-male-male:before{content:"\F0A5E"}.mdi-human-pregnant:before{content:"\F05CF"}.mdi-human-queue:before{content:"\F1571"}.mdi-human-scooter:before{content:"\F11E9"}.mdi-human-wheelchair:before{content:"\F138D"}.mdi-humble-bundle:before{content:"\F0744"}.mdi-hvac:before{content:"\F1352"}.mdi-hvac-off:before{content:"\F159E"}.mdi-hydraulic-oil-level:before{content:"\F1324"}.mdi-hydraulic-oil-temperature:before{content:"\F1325"}.mdi-hydro-power:before{content:"\F12E5"}.mdi-ice-cream:before{content:"\F082A"}.mdi-ice-cream-off:before{content:"\F0E52"}.mdi-ice-pop:before{content:"\F0EFD"}.mdi-id-card:before{content:"\F0FC0"}.mdi-identifier:before{content:"\F0EFE"}.mdi-ideogram-cjk:before{content:"\F1331"}.mdi-ideogram-cjk-variant:before{content:"\F1332"}.mdi-iframe:before{content:"\F0C8B"}.mdi-iframe-array:before{content:"\F10F5"}.mdi-iframe-array-outline:before{content:"\F10F6"}.mdi-iframe-braces:before{content:"\F10F7"}.mdi-iframe-braces-outline:before{content:"\F10F8"}.mdi-iframe-outline:before{content:"\F0C8C"}.mdi-iframe-parentheses:before{content:"\F10F9"}.mdi-iframe-parentheses-outline:before{content:"\F10FA"}.mdi-iframe-variable:before{content:"\F10FB"}.mdi-iframe-variable-outline:before{content:"\F10FC"}.mdi-image:before{content:"\F02E9"}.mdi-image-album:before{content:"\F02EA"}.mdi-image-area:before{content:"\F02EB"}.mdi-image-area-close:before{content:"\F02EC"}.mdi-image-auto-adjust:before{content:"\F0FC1"}.mdi-image-broken:before{content:"\F02ED"}.mdi-image-broken-variant:before{content:"\F02EE"}.mdi-image-edit:before{content:"\F11E3"}.mdi-image-edit-outline:before{content:"\F11E4"}.mdi-image-filter-black-white:before{content:"\F02F0"}.mdi-image-filter-center-focus:before{content:"\F02F1"}.mdi-image-filter-center-focus-strong:before{content:"\F0EFF"}.mdi-image-filter-center-focus-strong-outline:before{content:"\F0F00"}.mdi-image-filter-center-focus-weak:before{content:"\F02F2"}.mdi-image-filter-drama:before{content:"\F02F3"}.mdi-image-filter-frames:before{content:"\F02F4"}.mdi-image-filter-hdr:before{content:"\F02F5"}.mdi-image-filter-none:before{content:"\F02F6"}.mdi-image-filter-tilt-shift:before{content:"\F02F7"}.mdi-image-filter-vintage:before{content:"\F02F8"}.mdi-image-frame:before{content:"\F0E49"}.mdi-image-minus:before{content:"\F1419"}.mdi-image-move:before{content:"\F09F8"}.mdi-image-multiple:before{content:"\F02F9"}.mdi-image-multiple-outline:before{content:"\F02EF"}.mdi-image-off:before{content:"\F082B"}.mdi-image-off-outline:before{content:"\F11D1"}.mdi-image-outline:before{content:"\F0976"}.mdi-image-plus:before{content:"\F087C"}.mdi-image-remove:before{content:"\F1418"}.mdi-image-search:before{content:"\F0977"}.mdi-image-search-outline:before{content:"\F0978"}.mdi-image-size-select-actual:before{content:"\F0C8D"}.mdi-image-size-select-large:before{content:"\F0C8E"}.mdi-image-size-select-small:before{content:"\F0C8F"}.mdi-image-text:before{content:"\F160D"}.mdi-import:before{content:"\F02FA"}.mdi-inbox:before{content:"\F0687"}.mdi-inbox-arrow-down:before{content:"\F02FB"}.mdi-inbox-arrow-down-outline:before{content:"\F1270"}.mdi-inbox-arrow-up:before{content:"\F03D1"}.mdi-inbox-arrow-up-outline:before{content:"\F1271"}.mdi-inbox-full:before{content:"\F1272"}.mdi-inbox-full-outline:before{content:"\F1273"}.mdi-inbox-multiple:before{content:"\F08B0"}.mdi-inbox-multiple-outline:before{content:"\F0BA8"}.mdi-inbox-outline:before{content:"\F1274"}.mdi-inbox-remove:before{content:"\F159F"}.mdi-inbox-remove-outline:before{content:"\F15A0"}.mdi-incognito:before{content:"\F05F9"}.mdi-incognito-circle:before{content:"\F1421"}.mdi-incognito-circle-off:before{content:"\F1422"}.mdi-incognito-off:before{content:"\F0075"}.mdi-infinity:before{content:"\F06E4"}.mdi-information:before{content:"\F02FC"}.mdi-information-outline:before{content:"\F02FD"}.mdi-information-variant:before{content:"\F064E"}.mdi-instagram:before{content:"\F02FE"}.mdi-instrument-triangle:before{content:"\F104E"}.mdi-invert-colors:before{content:"\F0301"}.mdi-invert-colors-off:before{content:"\F0E4A"}.mdi-iobroker:before{content:"\F12E8"}.mdi-ip:before{content:"\F0A5F"}.mdi-ip-network:before{content:"\F0A60"}.mdi-ip-network-outline:before{content:"\F0C90"}.mdi-ipod:before{content:"\F0C91"}.mdi-islam:before{content:"\F0979"}.mdi-island:before{content:"\F104F"}.mdi-iv-bag:before{content:"\F10B9"}.mdi-jabber:before{content:"\F0DD5"}.mdi-jeepney:before{content:"\F0302"}.mdi-jellyfish:before{content:"\F0F01"}.mdi-jellyfish-outline:before{content:"\F0F02"}.mdi-jira:before{content:"\F0303"}.mdi-jquery:before{content:"\F087D"}.mdi-jsfiddle:before{content:"\F0304"}.mdi-judaism:before{content:"\F097A"}.mdi-jump-rope:before{content:"\F12FF"}.mdi-kabaddi:before{content:"\F0D87"}.mdi-kangaroo:before{content:"\F1558"}.mdi-karate:before{content:"\F082C"}.mdi-keg:before{content:"\F0305"}.mdi-kettle:before{content:"\F05FA"}.mdi-kettle-alert:before{content:"\F1317"}.mdi-kettle-alert-outline:before{content:"\F1318"}.mdi-kettle-off:before{content:"\F131B"}.mdi-kettle-off-outline:before{content:"\F131C"}.mdi-kettle-outline:before{content:"\F0F56"}.mdi-kettle-pour-over:before{content:"\F173C"}.mdi-kettle-steam:before{content:"\F1319"}.mdi-kettle-steam-outline:before{content:"\F131A"}.mdi-kettlebell:before{content:"\F1300"}.mdi-key:before{content:"\F0306"}.mdi-key-arrow-right:before{content:"\F1312"}.mdi-key-chain:before{content:"\F1574"}.mdi-key-chain-variant:before{content:"\F1575"}.mdi-key-change:before{content:"\F0307"}.mdi-key-link:before{content:"\F119F"}.mdi-key-minus:before{content:"\F0308"}.mdi-key-outline:before{content:"\F0DD6"}.mdi-key-plus:before{content:"\F0309"}.mdi-key-remove:before{content:"\F030A"}.mdi-key-star:before{content:"\F119E"}.mdi-key-variant:before{content:"\F030B"}.mdi-key-wireless:before{content:"\F0FC2"}.mdi-keyboard:before{content:"\F030C"}.mdi-keyboard-backspace:before{content:"\F030D"}.mdi-keyboard-caps:before{content:"\F030E"}.mdi-keyboard-close:before{content:"\F030F"}.mdi-keyboard-esc:before{content:"\F12B7"}.mdi-keyboard-f1:before{content:"\F12AB"}.mdi-keyboard-f10:before{content:"\F12B4"}.mdi-keyboard-f11:before{content:"\F12B5"}.mdi-keyboard-f12:before{content:"\F12B6"}.mdi-keyboard-f2:before{content:"\F12AC"}.mdi-keyboard-f3:before{content:"\F12AD"}.mdi-keyboard-f4:before{content:"\F12AE"}.mdi-keyboard-f5:before{content:"\F12AF"}.mdi-keyboard-f6:before{content:"\F12B0"}.mdi-keyboard-f7:before{content:"\F12B1"}.mdi-keyboard-f8:before{content:"\F12B2"}.mdi-keyboard-f9:before{content:"\F12B3"}.mdi-keyboard-off:before{content:"\F0310"}.mdi-keyboard-off-outline:before{content:"\F0E4B"}.mdi-keyboard-outline:before{content:"\F097B"}.mdi-keyboard-return:before{content:"\F0311"}.mdi-keyboard-settings:before{content:"\F09F9"}.mdi-keyboard-settings-outline:before{content:"\F09FA"}.mdi-keyboard-space:before{content:"\F1050"}.mdi-keyboard-tab:before{content:"\F0312"}.mdi-keyboard-variant:before{content:"\F0313"}.mdi-khanda:before{content:"\F10FD"}.mdi-kickstarter:before{content:"\F0745"}.mdi-klingon:before{content:"\F135B"}.mdi-knife:before{content:"\F09FB"}.mdi-knife-military:before{content:"\F09FC"}.mdi-koala:before{content:"\F173F"}.mdi-kodi:before{content:"\F0314"}.mdi-kubernetes:before{content:"\F10FE"}.mdi-label:before{content:"\F0315"}.mdi-label-multiple:before{content:"\F1375"}.mdi-label-multiple-outline:before{content:"\F1376"}.mdi-label-off:before{content:"\F0ACB"}.mdi-label-off-outline:before{content:"\F0ACC"}.mdi-label-outline:before{content:"\F0316"}.mdi-label-percent:before{content:"\F12EA"}.mdi-label-percent-outline:before{content:"\F12EB"}.mdi-label-variant:before{content:"\F0ACD"}.mdi-label-variant-outline:before{content:"\F0ACE"}.mdi-ladder:before{content:"\F15A2"}.mdi-ladybug:before{content:"\F082D"}.mdi-lambda:before{content:"\F0627"}.mdi-lamp:before{content:"\F06B5"}.mdi-lamps:before{content:"\F1576"}.mdi-lan:before{content:"\F0317"}.mdi-lan-check:before{content:"\F12AA"}.mdi-lan-connect:before{content:"\F0318"}.mdi-lan-disconnect:before{content:"\F0319"}.mdi-lan-pending:before{content:"\F031A"}.mdi-language-c:before{content:"\F0671"}.mdi-language-cpp:before{content:"\F0672"}.mdi-language-csharp:before{content:"\F031B"}.mdi-language-css3:before{content:"\F031C"}.mdi-language-fortran:before{content:"\F121A"}.mdi-language-go:before{content:"\F07D3"}.mdi-language-haskell:before{content:"\F0C92"}.mdi-language-html5:before{content:"\F031D"}.mdi-language-java:before{content:"\F0B37"}.mdi-language-javascript:before{content:"\F031E"}.mdi-language-kotlin:before{content:"\F1219"}.mdi-language-lua:before{content:"\F08B1"}.mdi-language-markdown:before{content:"\F0354"}.mdi-language-markdown-outline:before{content:"\F0F5B"}.mdi-language-php:before{content:"\F031F"}.mdi-language-python:before{content:"\F0320"}.mdi-language-r:before{content:"\F07D4"}.mdi-language-ruby:before{content:"\F0D2D"}.mdi-language-ruby-on-rails:before{content:"\F0ACF"}.mdi-language-rust:before{content:"\F1617"}.mdi-language-swift:before{content:"\F06E5"}.mdi-language-typescript:before{content:"\F06E6"}.mdi-language-xaml:before{content:"\F0673"}.mdi-laptop:before{content:"\F0322"}.mdi-laptop-chromebook:before{content:"\F0323"}.mdi-laptop-mac:before{content:"\F0324"}.mdi-laptop-off:before{content:"\F06E7"}.mdi-laptop-windows:before{content:"\F0325"}.mdi-laravel:before{content:"\F0AD0"}.mdi-laser-pointer:before{content:"\F1484"}.mdi-lasso:before{content:"\F0F03"}.mdi-lastpass:before{content:"\F0446"}.mdi-latitude:before{content:"\F0F57"}.mdi-launch:before{content:"\F0327"}.mdi-lava-lamp:before{content:"\F07D5"}.mdi-layers:before{content:"\F0328"}.mdi-layers-minus:before{content:"\F0E4C"}.mdi-layers-off:before{content:"\F0329"}.mdi-layers-off-outline:before{content:"\F09FD"}.mdi-layers-outline:before{content:"\F09FE"}.mdi-layers-plus:before{content:"\F0E4D"}.mdi-layers-remove:before{content:"\F0E4E"}.mdi-layers-search:before{content:"\F1206"}.mdi-layers-search-outline:before{content:"\F1207"}.mdi-layers-triple:before{content:"\F0F58"}.mdi-layers-triple-outline:before{content:"\F0F59"}.mdi-lead-pencil:before{content:"\F064F"}.mdi-leaf:before{content:"\F032A"}.mdi-leaf-maple:before{content:"\F0C93"}.mdi-leaf-maple-off:before{content:"\F12DA"}.mdi-leaf-off:before{content:"\F12D9"}.mdi-leak:before{content:"\F0DD7"}.mdi-leak-off:before{content:"\F0DD8"}.mdi-led-off:before{content:"\F032B"}.mdi-led-on:before{content:"\F032C"}.mdi-led-outline:before{content:"\F032D"}.mdi-led-strip:before{content:"\F07D6"}.mdi-led-strip-variant:before{content:"\F1051"}.mdi-led-variant-off:before{content:"\F032E"}.mdi-led-variant-on:before{content:"\F032F"}.mdi-led-variant-outline:before{content:"\F0330"}.mdi-leek:before{content:"\F117D"}.mdi-less-than:before{content:"\F097C"}.mdi-less-than-or-equal:before{content:"\F097D"}.mdi-library:before{content:"\F0331"}.mdi-library-shelves:before{content:"\F0BA9"}.mdi-license:before{content:"\F0FC3"}.mdi-lifebuoy:before{content:"\F087E"}.mdi-light-switch:before{content:"\F097E"}.mdi-lightbulb:before{content:"\F0335"}.mdi-lightbulb-cfl:before{content:"\F1208"}.mdi-lightbulb-cfl-off:before{content:"\F1209"}.mdi-lightbulb-cfl-spiral:before{content:"\F1275"}.mdi-lightbulb-cfl-spiral-off:before{content:"\F12C3"}.mdi-lightbulb-group:before{content:"\F1253"}.mdi-lightbulb-group-off:before{content:"\F12CD"}.mdi-lightbulb-group-off-outline:before{content:"\F12CE"}.mdi-lightbulb-group-outline:before{content:"\F1254"}.mdi-lightbulb-multiple:before{content:"\F1255"}.mdi-lightbulb-multiple-off:before{content:"\F12CF"}.mdi-lightbulb-multiple-off-outline:before{content:"\F12D0"}.mdi-lightbulb-multiple-outline:before{content:"\F1256"}.mdi-lightbulb-off:before{content:"\F0E4F"}.mdi-lightbulb-off-outline:before{content:"\F0E50"}.mdi-lightbulb-on:before{content:"\F06E8"}.mdi-lightbulb-on-outline:before{content:"\F06E9"}.mdi-lightbulb-outline:before{content:"\F0336"}.mdi-lighthouse:before{content:"\F09FF"}.mdi-lighthouse-on:before{content:"\F0A00"}.mdi-lightning-bolt:before{content:"\F140B"}.mdi-lightning-bolt-outline:before{content:"\F140C"}.mdi-lingerie:before{content:"\F1476"}.mdi-link:before{content:"\F0337"}.mdi-link-box:before{content:"\F0D1A"}.mdi-link-box-outline:before{content:"\F0D1B"}.mdi-link-box-variant:before{content:"\F0D1C"}.mdi-link-box-variant-outline:before{content:"\F0D1D"}.mdi-link-lock:before{content:"\F10BA"}.mdi-link-off:before{content:"\F0338"}.mdi-link-plus:before{content:"\F0C94"}.mdi-link-variant:before{content:"\F0339"}.mdi-link-variant-minus:before{content:"\F10FF"}.mdi-link-variant-off:before{content:"\F033A"}.mdi-link-variant-plus:before{content:"\F1100"}.mdi-link-variant-remove:before{content:"\F1101"}.mdi-linkedin:before{content:"\F033B"}.mdi-linux:before{content:"\F033D"}.mdi-linux-mint:before{content:"\F08ED"}.mdi-lipstick:before{content:"\F13B5"}.mdi-list-status:before{content:"\F15AB"}.mdi-litecoin:before{content:"\F0A61"}.mdi-loading:before{content:"\F0772"}.mdi-location-enter:before{content:"\F0FC4"}.mdi-location-exit:before{content:"\F0FC5"}.mdi-lock:before{content:"\F033E"}.mdi-lock-alert:before{content:"\F08EE"}.mdi-lock-alert-outline:before{content:"\F15D1"}.mdi-lock-check:before{content:"\F139A"}.mdi-lock-check-outline:before{content:"\F16A8"}.mdi-lock-clock:before{content:"\F097F"}.mdi-lock-minus:before{content:"\F16A9"}.mdi-lock-minus-outline:before{content:"\F16AA"}.mdi-lock-off:before{content:"\F1671"}.mdi-lock-off-outline:before{content:"\F1672"}.mdi-lock-open:before{content:"\F033F"}.mdi-lock-open-alert:before{content:"\F139B"}.mdi-lock-open-alert-outline:before{content:"\F15D2"}.mdi-lock-open-check:before{content:"\F139C"}.mdi-lock-open-check-outline:before{content:"\F16AB"}.mdi-lock-open-minus:before{content:"\F16AC"}.mdi-lock-open-minus-outline:before{content:"\F16AD"}.mdi-lock-open-outline:before{content:"\F0340"}.mdi-lock-open-plus:before{content:"\F16AE"}.mdi-lock-open-plus-outline:before{content:"\F16AF"}.mdi-lock-open-remove:before{content:"\F16B0"}.mdi-lock-open-remove-outline:before{content:"\F16B1"}.mdi-lock-open-variant:before{content:"\F0FC6"}.mdi-lock-open-variant-outline:before{content:"\F0FC7"}.mdi-lock-outline:before{content:"\F0341"}.mdi-lock-pattern:before{content:"\F06EA"}.mdi-lock-plus:before{content:"\F05FB"}.mdi-lock-plus-outline:before{content:"\F16B2"}.mdi-lock-question:before{content:"\F08EF"}.mdi-lock-remove:before{content:"\F16B3"}.mdi-lock-remove-outline:before{content:"\F16B4"}.mdi-lock-reset:before{content:"\F0773"}.mdi-lock-smart:before{content:"\F08B2"}.mdi-locker:before{content:"\F07D7"}.mdi-locker-multiple:before{content:"\F07D8"}.mdi-login:before{content:"\F0342"}.mdi-login-variant:before{content:"\F05FC"}.mdi-logout:before{content:"\F0343"}.mdi-logout-variant:before{content:"\F05FD"}.mdi-longitude:before{content:"\F0F5A"}.mdi-looks:before{content:"\F0344"}.mdi-lotion:before{content:"\F1582"}.mdi-lotion-outline:before{content:"\F1583"}.mdi-lotion-plus:before{content:"\F1584"}.mdi-lotion-plus-outline:before{content:"\F1585"}.mdi-loupe:before{content:"\F0345"}.mdi-lumx:before{content:"\F0346"}.mdi-lungs:before{content:"\F1084"}.mdi-magnet:before{content:"\F0347"}.mdi-magnet-on:before{content:"\F0348"}.mdi-magnify:before{content:"\F0349"}.mdi-magnify-close:before{content:"\F0980"}.mdi-magnify-minus:before{content:"\F034A"}.mdi-magnify-minus-cursor:before{content:"\F0A62"}.mdi-magnify-minus-outline:before{content:"\F06EC"}.mdi-magnify-plus:before{content:"\F034B"}.mdi-magnify-plus-cursor:before{content:"\F0A63"}.mdi-magnify-plus-outline:before{content:"\F06ED"}.mdi-magnify-remove-cursor:before{content:"\F120C"}.mdi-magnify-remove-outline:before{content:"\F120D"}.mdi-magnify-scan:before{content:"\F1276"}.mdi-mail:before{content:"\F0EBB"}.mdi-mailbox:before{content:"\F06EE"}.mdi-mailbox-open:before{content:"\F0D88"}.mdi-mailbox-open-outline:before{content:"\F0D89"}.mdi-mailbox-open-up:before{content:"\F0D8A"}.mdi-mailbox-open-up-outline:before{content:"\F0D8B"}.mdi-mailbox-outline:before{content:"\F0D8C"}.mdi-mailbox-up:before{content:"\F0D8D"}.mdi-mailbox-up-outline:before{content:"\F0D8E"}.mdi-manjaro:before{content:"\F160A"}.mdi-map:before{content:"\F034D"}.mdi-map-check:before{content:"\F0EBC"}.mdi-map-check-outline:before{content:"\F0EBD"}.mdi-map-clock:before{content:"\F0D1E"}.mdi-map-clock-outline:before{content:"\F0D1F"}.mdi-map-legend:before{content:"\F0A01"}.mdi-map-marker:before{content:"\F034E"}.mdi-map-marker-alert:before{content:"\F0F05"}.mdi-map-marker-alert-outline:before{content:"\F0F06"}.mdi-map-marker-check:before{content:"\F0C95"}.mdi-map-marker-check-outline:before{content:"\F12FB"}.mdi-map-marker-circle:before{content:"\F034F"}.mdi-map-marker-distance:before{content:"\F08F0"}.mdi-map-marker-down:before{content:"\F1102"}.mdi-map-marker-left:before{content:"\F12DB"}.mdi-map-marker-left-outline:before{content:"\F12DD"}.mdi-map-marker-minus:before{content:"\F0650"}.mdi-map-marker-minus-outline:before{content:"\F12F9"}.mdi-map-marker-multiple:before{content:"\F0350"}.mdi-map-marker-multiple-outline:before{content:"\F1277"}.mdi-map-marker-off:before{content:"\F0351"}.mdi-map-marker-off-outline:before{content:"\F12FD"}.mdi-map-marker-outline:before{content:"\F07D9"}.mdi-map-marker-path:before{content:"\F0D20"}.mdi-map-marker-plus:before{content:"\F0651"}.mdi-map-marker-plus-outline:before{content:"\F12F8"}.mdi-map-marker-question:before{content:"\F0F07"}.mdi-map-marker-question-outline:before{content:"\F0F08"}.mdi-map-marker-radius:before{content:"\F0352"}.mdi-map-marker-radius-outline:before{content:"\F12FC"}.mdi-map-marker-remove:before{content:"\F0F09"}.mdi-map-marker-remove-outline:before{content:"\F12FA"}.mdi-map-marker-remove-variant:before{content:"\F0F0A"}.mdi-map-marker-right:before{content:"\F12DC"}.mdi-map-marker-right-outline:before{content:"\F12DE"}.mdi-map-marker-star:before{content:"\F1608"}.mdi-map-marker-star-outline:before{content:"\F1609"}.mdi-map-marker-up:before{content:"\F1103"}.mdi-map-minus:before{content:"\F0981"}.mdi-map-outline:before{content:"\F0982"}.mdi-map-plus:before{content:"\F0983"}.mdi-map-search:before{content:"\F0984"}.mdi-map-search-outline:before{content:"\F0985"}.mdi-mapbox:before{content:"\F0BAA"}.mdi-margin:before{content:"\F0353"}.mdi-marker:before{content:"\F0652"}.mdi-marker-cancel:before{content:"\F0DD9"}.mdi-marker-check:before{content:"\F0355"}.mdi-mastodon:before{content:"\F0AD1"}.mdi-material-design:before{content:"\F0986"}.mdi-material-ui:before{content:"\F0357"}.mdi-math-compass:before{content:"\F0358"}.mdi-math-cos:before{content:"\F0C96"}.mdi-math-integral:before{content:"\F0FC8"}.mdi-math-integral-box:before{content:"\F0FC9"}.mdi-math-log:before{content:"\F1085"}.mdi-math-norm:before{content:"\F0FCA"}.mdi-math-norm-box:before{content:"\F0FCB"}.mdi-math-sin:before{content:"\F0C97"}.mdi-math-tan:before{content:"\F0C98"}.mdi-matrix:before{content:"\F0628"}.mdi-medal:before{content:"\F0987"}.mdi-medal-outline:before{content:"\F1326"}.mdi-medical-bag:before{content:"\F06EF"}.mdi-meditation:before{content:"\F117B"}.mdi-memory:before{content:"\F035B"}.mdi-menu:before{content:"\F035C"}.mdi-menu-down:before{content:"\F035D"}.mdi-menu-down-outline:before{content:"\F06B6"}.mdi-menu-left:before{content:"\F035E"}.mdi-menu-left-outline:before{content:"\F0A02"}.mdi-menu-open:before{content:"\F0BAB"}.mdi-menu-right:before{content:"\F035F"}.mdi-menu-right-outline:before{content:"\F0A03"}.mdi-menu-swap:before{content:"\F0A64"}.mdi-menu-swap-outline:before{content:"\F0A65"}.mdi-menu-up:before{content:"\F0360"}.mdi-menu-up-outline:before{content:"\F06B7"}.mdi-merge:before{content:"\F0F5C"}.mdi-message:before{content:"\F0361"}.mdi-message-alert:before{content:"\F0362"}.mdi-message-alert-outline:before{content:"\F0A04"}.mdi-message-arrow-left:before{content:"\F12F2"}.mdi-message-arrow-left-outline:before{content:"\F12F3"}.mdi-message-arrow-right:before{content:"\F12F4"}.mdi-message-arrow-right-outline:before{content:"\F12F5"}.mdi-message-bookmark:before{content:"\F15AC"}.mdi-message-bookmark-outline:before{content:"\F15AD"}.mdi-message-bulleted:before{content:"\F06A2"}.mdi-message-bulleted-off:before{content:"\F06A3"}.mdi-message-cog:before{content:"\F06F1"}.mdi-message-cog-outline:before{content:"\F1172"}.mdi-message-draw:before{content:"\F0363"}.mdi-message-flash:before{content:"\F15A9"}.mdi-message-flash-outline:before{content:"\F15AA"}.mdi-message-image:before{content:"\F0364"}.mdi-message-image-outline:before{content:"\F116C"}.mdi-message-lock:before{content:"\F0FCC"}.mdi-message-lock-outline:before{content:"\F116D"}.mdi-message-minus:before{content:"\F116E"}.mdi-message-minus-outline:before{content:"\F116F"}.mdi-message-off:before{content:"\F164D"}.mdi-message-off-outline:before{content:"\F164E"}.mdi-message-outline:before{content:"\F0365"}.mdi-message-plus:before{content:"\F0653"}.mdi-message-plus-outline:before{content:"\F10BB"}.mdi-message-processing:before{content:"\F0366"}.mdi-message-processing-outline:before{content:"\F1170"}.mdi-message-question:before{content:"\F173A"}.mdi-message-question-outline:before{content:"\F173B"}.mdi-message-reply:before{content:"\F0367"}.mdi-message-reply-outline:before{content:"\F173D"}.mdi-message-reply-text:before{content:"\F0368"}.mdi-message-reply-text-outline:before{content:"\F173E"}.mdi-message-settings:before{content:"\F06F0"}.mdi-message-settings-outline:before{content:"\F1171"}.mdi-message-text:before{content:"\F0369"}.mdi-message-text-clock:before{content:"\F1173"}.mdi-message-text-clock-outline:before{content:"\F1174"}.mdi-message-text-lock:before{content:"\F0FCD"}.mdi-message-text-lock-outline:before{content:"\F1175"}.mdi-message-text-outline:before{content:"\F036A"}.mdi-message-video:before{content:"\F036B"}.mdi-meteor:before{content:"\F0629"}.mdi-metronome:before{content:"\F07DA"}.mdi-metronome-tick:before{content:"\F07DB"}.mdi-micro-sd:before{content:"\F07DC"}.mdi-microphone:before{content:"\F036C"}.mdi-microphone-minus:before{content:"\F08B3"}.mdi-microphone-off:before{content:"\F036D"}.mdi-microphone-outline:before{content:"\F036E"}.mdi-microphone-plus:before{content:"\F08B4"}.mdi-microphone-settings:before{content:"\F036F"}.mdi-microphone-variant:before{content:"\F0370"}.mdi-microphone-variant-off:before{content:"\F0371"}.mdi-microscope:before{content:"\F0654"}.mdi-microsoft:before{content:"\F0372"}.mdi-microsoft-access:before{content:"\F138E"}.mdi-microsoft-azure:before{content:"\F0805"}.mdi-microsoft-azure-devops:before{content:"\F0FD5"}.mdi-microsoft-bing:before{content:"\F00A4"}.mdi-microsoft-dynamics-365:before{content:"\F0988"}.mdi-microsoft-edge:before{content:"\F01E9"}.mdi-microsoft-edge-legacy:before{content:"\F1250"}.mdi-microsoft-excel:before{content:"\F138F"}.mdi-microsoft-internet-explorer:before{content:"\F0300"}.mdi-microsoft-office:before{content:"\F03C6"}.mdi-microsoft-onedrive:before{content:"\F03CA"}.mdi-microsoft-onenote:before{content:"\F0747"}.mdi-microsoft-outlook:before{content:"\F0D22"}.mdi-microsoft-powerpoint:before{content:"\F1390"}.mdi-microsoft-sharepoint:before{content:"\F1391"}.mdi-microsoft-teams:before{content:"\F02BB"}.mdi-microsoft-visual-studio:before{content:"\F0610"}.mdi-microsoft-visual-studio-code:before{content:"\F0A1E"}.mdi-microsoft-windows:before{content:"\F05B3"}.mdi-microsoft-windows-classic:before{content:"\F0A21"}.mdi-microsoft-word:before{content:"\F1392"}.mdi-microsoft-xbox:before{content:"\F05B9"}.mdi-microsoft-xbox-controller:before{content:"\F05BA"}.mdi-microsoft-xbox-controller-battery-alert:before{content:"\F074B"}.mdi-microsoft-xbox-controller-battery-charging:before{content:"\F0A22"}.mdi-microsoft-xbox-controller-battery-empty:before{content:"\F074C"}.mdi-microsoft-xbox-controller-battery-full:before{content:"\F074D"}.mdi-microsoft-xbox-controller-battery-low:before{content:"\F074E"}.mdi-microsoft-xbox-controller-battery-medium:before{content:"\F074F"}.mdi-microsoft-xbox-controller-battery-unknown:before{content:"\F0750"}.mdi-microsoft-xbox-controller-menu:before{content:"\F0E6F"}.mdi-microsoft-xbox-controller-off:before{content:"\F05BB"}.mdi-microsoft-xbox-controller-view:before{content:"\F0E70"}.mdi-microsoft-yammer:before{content:"\F0789"}.mdi-microwave:before{content:"\F0C99"}.mdi-microwave-off:before{content:"\F1423"}.mdi-middleware:before{content:"\F0F5D"}.mdi-middleware-outline:before{content:"\F0F5E"}.mdi-midi:before{content:"\F08F1"}.mdi-midi-port:before{content:"\F08F2"}.mdi-mine:before{content:"\F0DDA"}.mdi-minecraft:before{content:"\F0373"}.mdi-mini-sd:before{content:"\F0A05"}.mdi-minidisc:before{content:"\F0A06"}.mdi-minus:before{content:"\F0374"}.mdi-minus-box:before{content:"\F0375"}.mdi-minus-box-multiple:before{content:"\F1141"}.mdi-minus-box-multiple-outline:before{content:"\F1142"}.mdi-minus-box-outline:before{content:"\F06F2"}.mdi-minus-circle:before{content:"\F0376"}.mdi-minus-circle-multiple:before{content:"\F035A"}.mdi-minus-circle-multiple-outline:before{content:"\F0AD3"}.mdi-minus-circle-off:before{content:"\F1459"}.mdi-minus-circle-off-outline:before{content:"\F145A"}.mdi-minus-circle-outline:before{content:"\F0377"}.mdi-minus-network:before{content:"\F0378"}.mdi-minus-network-outline:before{content:"\F0C9A"}.mdi-minus-thick:before{content:"\F1639"}.mdi-mirror:before{content:"\F11FD"}.mdi-mixed-martial-arts:before{content:"\F0D8F"}.mdi-mixed-reality:before{content:"\F087F"}.mdi-molecule:before{content:"\F0BAC"}.mdi-molecule-co:before{content:"\F12FE"}.mdi-molecule-co2:before{content:"\F07E4"}.mdi-monitor:before{content:"\F0379"}.mdi-monitor-cellphone:before{content:"\F0989"}.mdi-monitor-cellphone-star:before{content:"\F098A"}.mdi-monitor-clean:before{content:"\F1104"}.mdi-monitor-dashboard:before{content:"\F0A07"}.mdi-monitor-edit:before{content:"\F12C6"}.mdi-monitor-eye:before{content:"\F13B4"}.mdi-monitor-lock:before{content:"\F0DDB"}.mdi-monitor-multiple:before{content:"\F037A"}.mdi-monitor-off:before{content:"\F0D90"}.mdi-monitor-screenshot:before{content:"\F0E51"}.mdi-monitor-share:before{content:"\F1483"}.mdi-monitor-speaker:before{content:"\F0F5F"}.mdi-monitor-speaker-off:before{content:"\F0F60"}.mdi-monitor-star:before{content:"\F0DDC"}.mdi-moon-first-quarter:before{content:"\F0F61"}.mdi-moon-full:before{content:"\F0F62"}.mdi-moon-last-quarter:before{content:"\F0F63"}.mdi-moon-new:before{content:"\F0F64"}.mdi-moon-waning-crescent:before{content:"\F0F65"}.mdi-moon-waning-gibbous:before{content:"\F0F66"}.mdi-moon-waxing-crescent:before{content:"\F0F67"}.mdi-moon-waxing-gibbous:before{content:"\F0F68"}.mdi-moped:before{content:"\F1086"}.mdi-moped-electric:before{content:"\F15B7"}.mdi-moped-electric-outline:before{content:"\F15B8"}.mdi-moped-outline:before{content:"\F15B9"}.mdi-more:before{content:"\F037B"}.mdi-mother-heart:before{content:"\F1314"}.mdi-mother-nurse:before{content:"\F0D21"}.mdi-motion:before{content:"\F15B2"}.mdi-motion-outline:before{content:"\F15B3"}.mdi-motion-pause:before{content:"\F1590"}.mdi-motion-pause-outline:before{content:"\F1592"}.mdi-motion-play:before{content:"\F158F"}.mdi-motion-play-outline:before{content:"\F1591"}.mdi-motion-sensor:before{content:"\F0D91"}.mdi-motion-sensor-off:before{content:"\F1435"}.mdi-motorbike:before{content:"\F037C"}.mdi-motorbike-electric:before{content:"\F15BA"}.mdi-mouse:before{content:"\F037D"}.mdi-mouse-bluetooth:before{content:"\F098B"}.mdi-mouse-move-down:before{content:"\F1550"}.mdi-mouse-move-up:before{content:"\F1551"}.mdi-mouse-move-vertical:before{content:"\F1552"}.mdi-mouse-off:before{content:"\F037E"}.mdi-mouse-variant:before{content:"\F037F"}.mdi-mouse-variant-off:before{content:"\F0380"}.mdi-move-resize:before{content:"\F0655"}.mdi-move-resize-variant:before{content:"\F0656"}.mdi-movie:before{content:"\F0381"}.mdi-movie-check:before{content:"\F16F3"}.mdi-movie-check-outline:before{content:"\F16F4"}.mdi-movie-cog:before{content:"\F16F5"}.mdi-movie-cog-outline:before{content:"\F16F6"}.mdi-movie-edit:before{content:"\F1122"}.mdi-movie-edit-outline:before{content:"\F1123"}.mdi-movie-filter:before{content:"\F1124"}.mdi-movie-filter-outline:before{content:"\F1125"}.mdi-movie-minus:before{content:"\F16F7"}.mdi-movie-minus-outline:before{content:"\F16F8"}.mdi-movie-off:before{content:"\F16F9"}.mdi-movie-off-outline:before{content:"\F16FA"}.mdi-movie-open:before{content:"\F0FCE"}.mdi-movie-open-check:before{content:"\F16FB"}.mdi-movie-open-check-outline:before{content:"\F16FC"}.mdi-movie-open-cog:before{content:"\F16FD"}.mdi-movie-open-cog-outline:before{content:"\F16FE"}.mdi-movie-open-edit:before{content:"\F16FF"}.mdi-movie-open-edit-outline:before{content:"\F1700"}.mdi-movie-open-minus:before{content:"\F1701"}.mdi-movie-open-minus-outline:before{content:"\F1702"}.mdi-movie-open-off:before{content:"\F1703"}.mdi-movie-open-off-outline:before{content:"\F1704"}.mdi-movie-open-outline:before{content:"\F0FCF"}.mdi-movie-open-play:before{content:"\F1705"}.mdi-movie-open-play-outline:before{content:"\F1706"}.mdi-movie-open-plus:before{content:"\F1707"}.mdi-movie-open-plus-outline:before{content:"\F1708"}.mdi-movie-open-remove:before{content:"\F1709"}.mdi-movie-open-remove-outline:before{content:"\F170A"}.mdi-movie-open-settings:before{content:"\F170B"}.mdi-movie-open-settings-outline:before{content:"\F170C"}.mdi-movie-open-star:before{content:"\F170D"}.mdi-movie-open-star-outline:before{content:"\F170E"}.mdi-movie-outline:before{content:"\F0DDD"}.mdi-movie-play:before{content:"\F170F"}.mdi-movie-play-outline:before{content:"\F1710"}.mdi-movie-plus:before{content:"\F1711"}.mdi-movie-plus-outline:before{content:"\F1712"}.mdi-movie-remove:before{content:"\F1713"}.mdi-movie-remove-outline:before{content:"\F1714"}.mdi-movie-roll:before{content:"\F07DE"}.mdi-movie-search:before{content:"\F11D2"}.mdi-movie-search-outline:before{content:"\F11D3"}.mdi-movie-settings:before{content:"\F1715"}.mdi-movie-settings-outline:before{content:"\F1716"}.mdi-movie-star:before{content:"\F1717"}.mdi-movie-star-outline:before{content:"\F1718"}.mdi-mower:before{content:"\F166F"}.mdi-mower-bag:before{content:"\F1670"}.mdi-muffin:before{content:"\F098C"}.mdi-multiplication:before{content:"\F0382"}.mdi-multiplication-box:before{content:"\F0383"}.mdi-mushroom:before{content:"\F07DF"}.mdi-mushroom-off:before{content:"\F13FA"}.mdi-mushroom-off-outline:before{content:"\F13FB"}.mdi-mushroom-outline:before{content:"\F07E0"}.mdi-music:before{content:"\F075A"}.mdi-music-accidental-double-flat:before{content:"\F0F69"}.mdi-music-accidental-double-sharp:before{content:"\F0F6A"}.mdi-music-accidental-flat:before{content:"\F0F6B"}.mdi-music-accidental-natural:before{content:"\F0F6C"}.mdi-music-accidental-sharp:before{content:"\F0F6D"}.mdi-music-box:before{content:"\F0384"}.mdi-music-box-multiple:before{content:"\F0333"}.mdi-music-box-multiple-outline:before{content:"\F0F04"}.mdi-music-box-outline:before{content:"\F0385"}.mdi-music-circle:before{content:"\F0386"}.mdi-music-circle-outline:before{content:"\F0AD4"}.mdi-music-clef-alto:before{content:"\F0F6E"}.mdi-music-clef-bass:before{content:"\F0F6F"}.mdi-music-clef-treble:before{content:"\F0F70"}.mdi-music-note:before{content:"\F0387"}.mdi-music-note-bluetooth:before{content:"\F05FE"}.mdi-music-note-bluetooth-off:before{content:"\F05FF"}.mdi-music-note-eighth:before{content:"\F0388"}.mdi-music-note-eighth-dotted:before{content:"\F0F71"}.mdi-music-note-half:before{content:"\F0389"}.mdi-music-note-half-dotted:before{content:"\F0F72"}.mdi-music-note-off:before{content:"\F038A"}.mdi-music-note-off-outline:before{content:"\F0F73"}.mdi-music-note-outline:before{content:"\F0F74"}.mdi-music-note-plus:before{content:"\F0DDE"}.mdi-music-note-quarter:before{content:"\F038B"}.mdi-music-note-quarter-dotted:before{content:"\F0F75"}.mdi-music-note-sixteenth:before{content:"\F038C"}.mdi-music-note-sixteenth-dotted:before{content:"\F0F76"}.mdi-music-note-whole:before{content:"\F038D"}.mdi-music-note-whole-dotted:before{content:"\F0F77"}.mdi-music-off:before{content:"\F075B"}.mdi-music-rest-eighth:before{content:"\F0F78"}.mdi-music-rest-half:before{content:"\F0F79"}.mdi-music-rest-quarter:before{content:"\F0F7A"}.mdi-music-rest-sixteenth:before{content:"\F0F7B"}.mdi-music-rest-whole:before{content:"\F0F7C"}.mdi-mustache:before{content:"\F15DE"}.mdi-nail:before{content:"\F0DDF"}.mdi-nas:before{content:"\F08F3"}.mdi-nativescript:before{content:"\F0880"}.mdi-nature:before{content:"\F038E"}.mdi-nature-people:before{content:"\F038F"}.mdi-navigation:before{content:"\F0390"}.mdi-navigation-outline:before{content:"\F1607"}.mdi-near-me:before{content:"\F05CD"}.mdi-necklace:before{content:"\F0F0B"}.mdi-needle:before{content:"\F0391"}.mdi-netflix:before{content:"\F0746"}.mdi-network:before{content:"\F06F3"}.mdi-network-off:before{content:"\F0C9B"}.mdi-network-off-outline:before{content:"\F0C9C"}.mdi-network-outline:before{content:"\F0C9D"}.mdi-network-strength-1:before{content:"\F08F4"}.mdi-network-strength-1-alert:before{content:"\F08F5"}.mdi-network-strength-2:before{content:"\F08F6"}.mdi-network-strength-2-alert:before{content:"\F08F7"}.mdi-network-strength-3:before{content:"\F08F8"}.mdi-network-strength-3-alert:before{content:"\F08F9"}.mdi-network-strength-4:before{content:"\F08FA"}.mdi-network-strength-4-alert:before{content:"\F08FB"}.mdi-network-strength-off:before{content:"\F08FC"}.mdi-network-strength-off-outline:before{content:"\F08FD"}.mdi-network-strength-outline:before{content:"\F08FE"}.mdi-new-box:before{content:"\F0394"}.mdi-newspaper:before{content:"\F0395"}.mdi-newspaper-minus:before{content:"\F0F0C"}.mdi-newspaper-plus:before{content:"\F0F0D"}.mdi-newspaper-variant:before{content:"\F1001"}.mdi-newspaper-variant-multiple:before{content:"\F1002"}.mdi-newspaper-variant-multiple-outline:before{content:"\F1003"}.mdi-newspaper-variant-outline:before{content:"\F1004"}.mdi-nfc:before{content:"\F0396"}.mdi-nfc-search-variant:before{content:"\F0E53"}.mdi-nfc-tap:before{content:"\F0397"}.mdi-nfc-variant:before{content:"\F0398"}.mdi-nfc-variant-off:before{content:"\F0E54"}.mdi-ninja:before{content:"\F0774"}.mdi-nintendo-game-boy:before{content:"\F1393"}.mdi-nintendo-switch:before{content:"\F07E1"}.mdi-nintendo-wii:before{content:"\F05AB"}.mdi-nintendo-wiiu:before{content:"\F072D"}.mdi-nix:before{content:"\F1105"}.mdi-nodejs:before{content:"\F0399"}.mdi-noodles:before{content:"\F117E"}.mdi-not-equal:before{content:"\F098D"}.mdi-not-equal-variant:before{content:"\F098E"}.mdi-note:before{content:"\F039A"}.mdi-note-minus:before{content:"\F164F"}.mdi-note-minus-outline:before{content:"\F1650"}.mdi-note-multiple:before{content:"\F06B8"}.mdi-note-multiple-outline:before{content:"\F06B9"}.mdi-note-outline:before{content:"\F039B"}.mdi-note-plus:before{content:"\F039C"}.mdi-note-plus-outline:before{content:"\F039D"}.mdi-note-remove:before{content:"\F1651"}.mdi-note-remove-outline:before{content:"\F1652"}.mdi-note-search:before{content:"\F1653"}.mdi-note-search-outline:before{content:"\F1654"}.mdi-note-text:before{content:"\F039E"}.mdi-note-text-outline:before{content:"\F11D7"}.mdi-notebook:before{content:"\F082E"}.mdi-notebook-check:before{content:"\F14F5"}.mdi-notebook-check-outline:before{content:"\F14F6"}.mdi-notebook-edit:before{content:"\F14E7"}.mdi-notebook-edit-outline:before{content:"\F14E9"}.mdi-notebook-minus:before{content:"\F1610"}.mdi-notebook-minus-outline:before{content:"\F1611"}.mdi-notebook-multiple:before{content:"\F0E55"}.mdi-notebook-outline:before{content:"\F0EBF"}.mdi-notebook-plus:before{content:"\F1612"}.mdi-notebook-plus-outline:before{content:"\F1613"}.mdi-notebook-remove:before{content:"\F1614"}.mdi-notebook-remove-outline:before{content:"\F1615"}.mdi-notification-clear-all:before{content:"\F039F"}.mdi-npm:before{content:"\F06F7"}.mdi-nuke:before{content:"\F06A4"}.mdi-null:before{content:"\F07E2"}.mdi-numeric:before{content:"\F03A0"}.mdi-numeric-0:before{content:"\F0B39"}.mdi-numeric-0-box:before{content:"\F03A1"}.mdi-numeric-0-box-multiple:before{content:"\F0F0E"}.mdi-numeric-0-box-multiple-outline:before{content:"\F03A2"}.mdi-numeric-0-box-outline:before{content:"\F03A3"}.mdi-numeric-0-circle:before{content:"\F0C9E"}.mdi-numeric-0-circle-outline:before{content:"\F0C9F"}.mdi-numeric-1:before{content:"\F0B3A"}.mdi-numeric-1-box:before{content:"\F03A4"}.mdi-numeric-1-box-multiple:before{content:"\F0F0F"}.mdi-numeric-1-box-multiple-outline:before{content:"\F03A5"}.mdi-numeric-1-box-outline:before{content:"\F03A6"}.mdi-numeric-1-circle:before{content:"\F0CA0"}.mdi-numeric-1-circle-outline:before{content:"\F0CA1"}.mdi-numeric-10:before{content:"\F0FE9"}.mdi-numeric-10-box:before{content:"\F0F7D"}.mdi-numeric-10-box-multiple:before{content:"\F0FEA"}.mdi-numeric-10-box-multiple-outline:before{content:"\F0FEB"}.mdi-numeric-10-box-outline:before{content:"\F0F7E"}.mdi-numeric-10-circle:before{content:"\F0FEC"}.mdi-numeric-10-circle-outline:before{content:"\F0FED"}.mdi-numeric-2:before{content:"\F0B3B"}.mdi-numeric-2-box:before{content:"\F03A7"}.mdi-numeric-2-box-multiple:before{content:"\F0F10"}.mdi-numeric-2-box-multiple-outline:before{content:"\F03A8"}.mdi-numeric-2-box-outline:before{content:"\F03A9"}.mdi-numeric-2-circle:before{content:"\F0CA2"}.mdi-numeric-2-circle-outline:before{content:"\F0CA3"}.mdi-numeric-3:before{content:"\F0B3C"}.mdi-numeric-3-box:before{content:"\F03AA"}.mdi-numeric-3-box-multiple:before{content:"\F0F11"}.mdi-numeric-3-box-multiple-outline:before{content:"\F03AB"}.mdi-numeric-3-box-outline:before{content:"\F03AC"}.mdi-numeric-3-circle:before{content:"\F0CA4"}.mdi-numeric-3-circle-outline:before{content:"\F0CA5"}.mdi-numeric-4:before{content:"\F0B3D"}.mdi-numeric-4-box:before{content:"\F03AD"}.mdi-numeric-4-box-multiple:before{content:"\F0F12"}.mdi-numeric-4-box-multiple-outline:before{content:"\F03B2"}.mdi-numeric-4-box-outline:before{content:"\F03AE"}.mdi-numeric-4-circle:before{content:"\F0CA6"}.mdi-numeric-4-circle-outline:before{content:"\F0CA7"}.mdi-numeric-5:before{content:"\F0B3E"}.mdi-numeric-5-box:before{content:"\F03B1"}.mdi-numeric-5-box-multiple:before{content:"\F0F13"}.mdi-numeric-5-box-multiple-outline:before{content:"\F03AF"}.mdi-numeric-5-box-outline:before{content:"\F03B0"}.mdi-numeric-5-circle:before{content:"\F0CA8"}.mdi-numeric-5-circle-outline:before{content:"\F0CA9"}.mdi-numeric-6:before{content:"\F0B3F"}.mdi-numeric-6-box:before{content:"\F03B3"}.mdi-numeric-6-box-multiple:before{content:"\F0F14"}.mdi-numeric-6-box-multiple-outline:before{content:"\F03B4"}.mdi-numeric-6-box-outline:before{content:"\F03B5"}.mdi-numeric-6-circle:before{content:"\F0CAA"}.mdi-numeric-6-circle-outline:before{content:"\F0CAB"}.mdi-numeric-7:before{content:"\F0B40"}.mdi-numeric-7-box:before{content:"\F03B6"}.mdi-numeric-7-box-multiple:before{content:"\F0F15"}.mdi-numeric-7-box-multiple-outline:before{content:"\F03B7"}.mdi-numeric-7-box-outline:before{content:"\F03B8"}.mdi-numeric-7-circle:before{content:"\F0CAC"}.mdi-numeric-7-circle-outline:before{content:"\F0CAD"}.mdi-numeric-8:before{content:"\F0B41"}.mdi-numeric-8-box:before{content:"\F03B9"}.mdi-numeric-8-box-multiple:before{content:"\F0F16"}.mdi-numeric-8-box-multiple-outline:before{content:"\F03BA"}.mdi-numeric-8-box-outline:before{content:"\F03BB"}.mdi-numeric-8-circle:before{content:"\F0CAE"}.mdi-numeric-8-circle-outline:before{content:"\F0CAF"}.mdi-numeric-9:before{content:"\F0B42"}.mdi-numeric-9-box:before{content:"\F03BC"}.mdi-numeric-9-box-multiple:before{content:"\F0F17"}.mdi-numeric-9-box-multiple-outline:before{content:"\F03BD"}.mdi-numeric-9-box-outline:before{content:"\F03BE"}.mdi-numeric-9-circle:before{content:"\F0CB0"}.mdi-numeric-9-circle-outline:before{content:"\F0CB1"}.mdi-numeric-9-plus:before{content:"\F0FEE"}.mdi-numeric-9-plus-box:before{content:"\F03BF"}.mdi-numeric-9-plus-box-multiple:before{content:"\F0F18"}.mdi-numeric-9-plus-box-multiple-outline:before{content:"\F03C0"}.mdi-numeric-9-plus-box-outline:before{content:"\F03C1"}.mdi-numeric-9-plus-circle:before{content:"\F0CB2"}.mdi-numeric-9-plus-circle-outline:before{content:"\F0CB3"}.mdi-numeric-negative-1:before{content:"\F1052"}.mdi-numeric-positive-1:before{content:"\F15CB"}.mdi-nut:before{content:"\F06F8"}.mdi-nutrition:before{content:"\F03C2"}.mdi-nuxt:before{content:"\F1106"}.mdi-oar:before{content:"\F067C"}.mdi-ocarina:before{content:"\F0DE0"}.mdi-oci:before{content:"\F12E9"}.mdi-ocr:before{content:"\F113A"}.mdi-octagon:before{content:"\F03C3"}.mdi-octagon-outline:before{content:"\F03C4"}.mdi-octagram:before{content:"\F06F9"}.mdi-octagram-outline:before{content:"\F0775"}.mdi-odnoklassniki:before{content:"\F03C5"}.mdi-offer:before{content:"\F121B"}.mdi-office-building:before{content:"\F0991"}.mdi-office-building-marker:before{content:"\F1520"}.mdi-office-building-marker-outline:before{content:"\F1521"}.mdi-office-building-outline:before{content:"\F151F"}.mdi-oil:before{content:"\F03C7"}.mdi-oil-lamp:before{content:"\F0F19"}.mdi-oil-level:before{content:"\F1053"}.mdi-oil-temperature:before{content:"\F0FF8"}.mdi-omega:before{content:"\F03C9"}.mdi-one-up:before{content:"\F0BAD"}.mdi-onepassword:before{content:"\F0881"}.mdi-opacity:before{content:"\F05CC"}.mdi-open-in-app:before{content:"\F03CB"}.mdi-open-in-new:before{content:"\F03CC"}.mdi-open-source-initiative:before{content:"\F0BAE"}.mdi-openid:before{content:"\F03CD"}.mdi-opera:before{content:"\F03CE"}.mdi-orbit:before{content:"\F0018"}.mdi-orbit-variant:before{content:"\F15DB"}.mdi-order-alphabetical-ascending:before{content:"\F020D"}.mdi-order-alphabetical-descending:before{content:"\F0D07"}.mdi-order-bool-ascending:before{content:"\F02BE"}.mdi-order-bool-ascending-variant:before{content:"\F098F"}.mdi-order-bool-descending:before{content:"\F1384"}.mdi-order-bool-descending-variant:before{content:"\F0990"}.mdi-order-numeric-ascending:before{content:"\F0545"}.mdi-order-numeric-descending:before{content:"\F0546"}.mdi-origin:before{content:"\F0B43"}.mdi-ornament:before{content:"\F03CF"}.mdi-ornament-variant:before{content:"\F03D0"}.mdi-outdoor-lamp:before{content:"\F1054"}.mdi-overscan:before{content:"\F1005"}.mdi-owl:before{content:"\F03D2"}.mdi-pac-man:before{content:"\F0BAF"}.mdi-package:before{content:"\F03D3"}.mdi-package-down:before{content:"\F03D4"}.mdi-package-up:before{content:"\F03D5"}.mdi-package-variant:before{content:"\F03D6"}.mdi-package-variant-closed:before{content:"\F03D7"}.mdi-page-first:before{content:"\F0600"}.mdi-page-last:before{content:"\F0601"}.mdi-page-layout-body:before{content:"\F06FA"}.mdi-page-layout-footer:before{content:"\F06FB"}.mdi-page-layout-header:before{content:"\F06FC"}.mdi-page-layout-header-footer:before{content:"\F0F7F"}.mdi-page-layout-sidebar-left:before{content:"\F06FD"}.mdi-page-layout-sidebar-right:before{content:"\F06FE"}.mdi-page-next:before{content:"\F0BB0"}.mdi-page-next-outline:before{content:"\F0BB1"}.mdi-page-previous:before{content:"\F0BB2"}.mdi-page-previous-outline:before{content:"\F0BB3"}.mdi-pail:before{content:"\F1417"}.mdi-pail-minus:before{content:"\F1437"}.mdi-pail-minus-outline:before{content:"\F143C"}.mdi-pail-off:before{content:"\F1439"}.mdi-pail-off-outline:before{content:"\F143E"}.mdi-pail-outline:before{content:"\F143A"}.mdi-pail-plus:before{content:"\F1436"}.mdi-pail-plus-outline:before{content:"\F143B"}.mdi-pail-remove:before{content:"\F1438"}.mdi-pail-remove-outline:before{content:"\F143D"}.mdi-palette:before{content:"\F03D8"}.mdi-palette-advanced:before{content:"\F03D9"}.mdi-palette-outline:before{content:"\F0E0C"}.mdi-palette-swatch:before{content:"\F08B5"}.mdi-palette-swatch-outline:before{content:"\F135C"}.mdi-palm-tree:before{content:"\F1055"}.mdi-pan:before{content:"\F0BB4"}.mdi-pan-bottom-left:before{content:"\F0BB5"}.mdi-pan-bottom-right:before{content:"\F0BB6"}.mdi-pan-down:before{content:"\F0BB7"}.mdi-pan-horizontal:before{content:"\F0BB8"}.mdi-pan-left:before{content:"\F0BB9"}.mdi-pan-right:before{content:"\F0BBA"}.mdi-pan-top-left:before{content:"\F0BBB"}.mdi-pan-top-right:before{content:"\F0BBC"}.mdi-pan-up:before{content:"\F0BBD"}.mdi-pan-vertical:before{content:"\F0BBE"}.mdi-panda:before{content:"\F03DA"}.mdi-pandora:before{content:"\F03DB"}.mdi-panorama:before{content:"\F03DC"}.mdi-panorama-fisheye:before{content:"\F03DD"}.mdi-panorama-horizontal:before{content:"\F03DE"}.mdi-panorama-vertical:before{content:"\F03DF"}.mdi-panorama-wide-angle:before{content:"\F03E0"}.mdi-paper-cut-vertical:before{content:"\F03E1"}.mdi-paper-roll:before{content:"\F1157"}.mdi-paper-roll-outline:before{content:"\F1158"}.mdi-paperclip:before{content:"\F03E2"}.mdi-parachute:before{content:"\F0CB4"}.mdi-parachute-outline:before{content:"\F0CB5"}.mdi-parking:before{content:"\F03E3"}.mdi-party-popper:before{content:"\F1056"}.mdi-passport:before{content:"\F07E3"}.mdi-passport-biometric:before{content:"\F0DE1"}.mdi-pasta:before{content:"\F1160"}.mdi-patio-heater:before{content:"\F0F80"}.mdi-patreon:before{content:"\F0882"}.mdi-pause:before{content:"\F03E4"}.mdi-pause-circle:before{content:"\F03E5"}.mdi-pause-circle-outline:before{content:"\F03E6"}.mdi-pause-octagon:before{content:"\F03E7"}.mdi-pause-octagon-outline:before{content:"\F03E8"}.mdi-paw:before{content:"\F03E9"}.mdi-paw-off:before{content:"\F0657"}.mdi-paw-off-outline:before{content:"\F1676"}.mdi-paw-outline:before{content:"\F1675"}.mdi-pdf-box:before{content:"\F0E56"}.mdi-peace:before{content:"\F0884"}.mdi-peanut:before{content:"\F0FFC"}.mdi-peanut-off:before{content:"\F0FFD"}.mdi-peanut-off-outline:before{content:"\F0FFF"}.mdi-peanut-outline:before{content:"\F0FFE"}.mdi-pen:before{content:"\F03EA"}.mdi-pen-lock:before{content:"\F0DE2"}.mdi-pen-minus:before{content:"\F0DE3"}.mdi-pen-off:before{content:"\F0DE4"}.mdi-pen-plus:before{content:"\F0DE5"}.mdi-pen-remove:before{content:"\F0DE6"}.mdi-pencil:before{content:"\F03EB"}.mdi-pencil-box:before{content:"\F03EC"}.mdi-pencil-box-multiple:before{content:"\F1144"}.mdi-pencil-box-multiple-outline:before{content:"\F1145"}.mdi-pencil-box-outline:before{content:"\F03ED"}.mdi-pencil-circle:before{content:"\F06FF"}.mdi-pencil-circle-outline:before{content:"\F0776"}.mdi-pencil-lock:before{content:"\F03EE"}.mdi-pencil-lock-outline:before{content:"\F0DE7"}.mdi-pencil-minus:before{content:"\F0DE8"}.mdi-pencil-minus-outline:before{content:"\F0DE9"}.mdi-pencil-off:before{content:"\F03EF"}.mdi-pencil-off-outline:before{content:"\F0DEA"}.mdi-pencil-outline:before{content:"\F0CB6"}.mdi-pencil-plus:before{content:"\F0DEB"}.mdi-pencil-plus-outline:before{content:"\F0DEC"}.mdi-pencil-remove:before{content:"\F0DED"}.mdi-pencil-remove-outline:before{content:"\F0DEE"}.mdi-pencil-ruler:before{content:"\F1353"}.mdi-penguin:before{content:"\F0EC0"}.mdi-pentagon:before{content:"\F0701"}.mdi-pentagon-outline:before{content:"\F0700"}.mdi-pentagram:before{content:"\F1667"}.mdi-percent:before{content:"\F03F0"}.mdi-percent-outline:before{content:"\F1278"}.mdi-periodic-table:before{content:"\F08B6"}.mdi-perspective-less:before{content:"\F0D23"}.mdi-perspective-more:before{content:"\F0D24"}.mdi-pharmacy:before{content:"\F03F1"}.mdi-phone:before{content:"\F03F2"}.mdi-phone-alert:before{content:"\F0F1A"}.mdi-phone-alert-outline:before{content:"\F118E"}.mdi-phone-bluetooth:before{content:"\F03F3"}.mdi-phone-bluetooth-outline:before{content:"\F118F"}.mdi-phone-cancel:before{content:"\F10BC"}.mdi-phone-cancel-outline:before{content:"\F1190"}.mdi-phone-check:before{content:"\F11A9"}.mdi-phone-check-outline:before{content:"\F11AA"}.mdi-phone-classic:before{content:"\F0602"}.mdi-phone-classic-off:before{content:"\F1279"}.mdi-phone-dial:before{content:"\F1559"}.mdi-phone-dial-outline:before{content:"\F155A"}.mdi-phone-forward:before{content:"\F03F4"}.mdi-phone-forward-outline:before{content:"\F1191"}.mdi-phone-hangup:before{content:"\F03F5"}.mdi-phone-hangup-outline:before{content:"\F1192"}.mdi-phone-in-talk:before{content:"\F03F6"}.mdi-phone-in-talk-outline:before{content:"\F1182"}.mdi-phone-incoming:before{content:"\F03F7"}.mdi-phone-incoming-outline:before{content:"\F1193"}.mdi-phone-lock:before{content:"\F03F8"}.mdi-phone-lock-outline:before{content:"\F1194"}.mdi-phone-log:before{content:"\F03F9"}.mdi-phone-log-outline:before{content:"\F1195"}.mdi-phone-message:before{content:"\F1196"}.mdi-phone-message-outline:before{content:"\F1197"}.mdi-phone-minus:before{content:"\F0658"}.mdi-phone-minus-outline:before{content:"\F1198"}.mdi-phone-missed:before{content:"\F03FA"}.mdi-phone-missed-outline:before{content:"\F11A5"}.mdi-phone-off:before{content:"\F0DEF"}.mdi-phone-off-outline:before{content:"\F11A6"}.mdi-phone-outgoing:before{content:"\F03FB"}.mdi-phone-outgoing-outline:before{content:"\F1199"}.mdi-phone-outline:before{content:"\F0DF0"}.mdi-phone-paused:before{content:"\F03FC"}.mdi-phone-paused-outline:before{content:"\F119A"}.mdi-phone-plus:before{content:"\F0659"}.mdi-phone-plus-outline:before{content:"\F119B"}.mdi-phone-remove:before{content:"\F152F"}.mdi-phone-remove-outline:before{content:"\F1530"}.mdi-phone-return:before{content:"\F082F"}.mdi-phone-return-outline:before{content:"\F119C"}.mdi-phone-ring:before{content:"\F11AB"}.mdi-phone-ring-outline:before{content:"\F11AC"}.mdi-phone-rotate-landscape:before{content:"\F0885"}.mdi-phone-rotate-portrait:before{content:"\F0886"}.mdi-phone-settings:before{content:"\F03FD"}.mdi-phone-settings-outline:before{content:"\F119D"}.mdi-phone-voip:before{content:"\F03FE"}.mdi-pi:before{content:"\F03FF"}.mdi-pi-box:before{content:"\F0400"}.mdi-pi-hole:before{content:"\F0DF1"}.mdi-piano:before{content:"\F067D"}.mdi-pickaxe:before{content:"\F08B7"}.mdi-picture-in-picture-bottom-right:before{content:"\F0E57"}.mdi-picture-in-picture-bottom-right-outline:before{content:"\F0E58"}.mdi-picture-in-picture-top-right:before{content:"\F0E59"}.mdi-picture-in-picture-top-right-outline:before{content:"\F0E5A"}.mdi-pier:before{content:"\F0887"}.mdi-pier-crane:before{content:"\F0888"}.mdi-pig:before{content:"\F0401"}.mdi-pig-variant:before{content:"\F1006"}.mdi-pig-variant-outline:before{content:"\F1678"}.mdi-piggy-bank:before{content:"\F1007"}.mdi-piggy-bank-outline:before{content:"\F1679"}.mdi-pill:before{content:"\F0402"}.mdi-pillar:before{content:"\F0702"}.mdi-pin:before{content:"\F0403"}.mdi-pin-off:before{content:"\F0404"}.mdi-pin-off-outline:before{content:"\F0930"}.mdi-pin-outline:before{content:"\F0931"}.mdi-pine-tree:before{content:"\F0405"}.mdi-pine-tree-box:before{content:"\F0406"}.mdi-pine-tree-fire:before{content:"\F141A"}.mdi-pinterest:before{content:"\F0407"}.mdi-pinwheel:before{content:"\F0AD5"}.mdi-pinwheel-outline:before{content:"\F0AD6"}.mdi-pipe:before{content:"\F07E5"}.mdi-pipe-disconnected:before{content:"\F07E6"}.mdi-pipe-leak:before{content:"\F0889"}.mdi-pipe-wrench:before{content:"\F1354"}.mdi-pirate:before{content:"\F0A08"}.mdi-pistol:before{content:"\F0703"}.mdi-piston:before{content:"\F088A"}.mdi-pitchfork:before{content:"\F1553"}.mdi-pizza:before{content:"\F0409"}.mdi-play:before{content:"\F040A"}.mdi-play-box:before{content:"\F127A"}.mdi-play-box-multiple:before{content:"\F0D19"}.mdi-play-box-multiple-outline:before{content:"\F13E6"}.mdi-play-box-outline:before{content:"\F040B"}.mdi-play-circle:before{content:"\F040C"}.mdi-play-circle-outline:before{content:"\F040D"}.mdi-play-network:before{content:"\F088B"}.mdi-play-network-outline:before{content:"\F0CB7"}.mdi-play-outline:before{content:"\F0F1B"}.mdi-play-pause:before{content:"\F040E"}.mdi-play-protected-content:before{content:"\F040F"}.mdi-play-speed:before{content:"\F08FF"}.mdi-playlist-check:before{content:"\F05C7"}.mdi-playlist-edit:before{content:"\F0900"}.mdi-playlist-minus:before{content:"\F0410"}.mdi-playlist-music:before{content:"\F0CB8"}.mdi-playlist-music-outline:before{content:"\F0CB9"}.mdi-playlist-play:before{content:"\F0411"}.mdi-playlist-plus:before{content:"\F0412"}.mdi-playlist-remove:before{content:"\F0413"}.mdi-playlist-star:before{content:"\F0DF2"}.mdi-plex:before{content:"\F06BA"}.mdi-plus:before{content:"\F0415"}.mdi-plus-box:before{content:"\F0416"}.mdi-plus-box-multiple:before{content:"\F0334"}.mdi-plus-box-multiple-outline:before{content:"\F1143"}.mdi-plus-box-outline:before{content:"\F0704"}.mdi-plus-circle:before{content:"\F0417"}.mdi-plus-circle-multiple:before{content:"\F034C"}.mdi-plus-circle-multiple-outline:before{content:"\F0418"}.mdi-plus-circle-outline:before{content:"\F0419"}.mdi-plus-minus:before{content:"\F0992"}.mdi-plus-minus-box:before{content:"\F0993"}.mdi-plus-minus-variant:before{content:"\F14C9"}.mdi-plus-network:before{content:"\F041A"}.mdi-plus-network-outline:before{content:"\F0CBA"}.mdi-plus-one:before{content:"\F041B"}.mdi-plus-outline:before{content:"\F0705"}.mdi-plus-thick:before{content:"\F11EC"}.mdi-podcast:before{content:"\F0994"}.mdi-podium:before{content:"\F0D25"}.mdi-podium-bronze:before{content:"\F0D26"}.mdi-podium-gold:before{content:"\F0D27"}.mdi-podium-silver:before{content:"\F0D28"}.mdi-point-of-sale:before{content:"\F0D92"}.mdi-pokeball:before{content:"\F041D"}.mdi-pokemon-go:before{content:"\F0A09"}.mdi-poker-chip:before{content:"\F0830"}.mdi-polaroid:before{content:"\F041E"}.mdi-police-badge:before{content:"\F1167"}.mdi-police-badge-outline:before{content:"\F1168"}.mdi-poll:before{content:"\F041F"}.mdi-poll-box:before{content:"\F0420"}.mdi-poll-box-outline:before{content:"\F127B"}.mdi-polo:before{content:"\F14C3"}.mdi-polymer:before{content:"\F0421"}.mdi-pool:before{content:"\F0606"}.mdi-popcorn:before{content:"\F0422"}.mdi-post:before{content:"\F1008"}.mdi-post-outline:before{content:"\F1009"}.mdi-postage-stamp:before{content:"\F0CBB"}.mdi-pot:before{content:"\F02E5"}.mdi-pot-mix:before{content:"\F065B"}.mdi-pot-mix-outline:before{content:"\F0677"}.mdi-pot-outline:before{content:"\F02FF"}.mdi-pot-steam:before{content:"\F065A"}.mdi-pot-steam-outline:before{content:"\F0326"}.mdi-pound:before{content:"\F0423"}.mdi-pound-box:before{content:"\F0424"}.mdi-pound-box-outline:before{content:"\F117F"}.mdi-power:before{content:"\F0425"}.mdi-power-cycle:before{content:"\F0901"}.mdi-power-off:before{content:"\F0902"}.mdi-power-on:before{content:"\F0903"}.mdi-power-plug:before{content:"\F06A5"}.mdi-power-plug-off:before{content:"\F06A6"}.mdi-power-plug-off-outline:before{content:"\F1424"}.mdi-power-plug-outline:before{content:"\F1425"}.mdi-power-settings:before{content:"\F0426"}.mdi-power-sleep:before{content:"\F0904"}.mdi-power-socket:before{content:"\F0427"}.mdi-power-socket-au:before{content:"\F0905"}.mdi-power-socket-de:before{content:"\F1107"}.mdi-power-socket-eu:before{content:"\F07E7"}.mdi-power-socket-fr:before{content:"\F1108"}.mdi-power-socket-it:before{content:"\F14FF"}.mdi-power-socket-jp:before{content:"\F1109"}.mdi-power-socket-uk:before{content:"\F07E8"}.mdi-power-socket-us:before{content:"\F07E9"}.mdi-power-standby:before{content:"\F0906"}.mdi-powershell:before{content:"\F0A0A"}.mdi-prescription:before{content:"\F0706"}.mdi-presentation:before{content:"\F0428"}.mdi-presentation-play:before{content:"\F0429"}.mdi-pretzel:before{content:"\F1562"}.mdi-printer:before{content:"\F042A"}.mdi-printer-3d:before{content:"\F042B"}.mdi-printer-3d-nozzle:before{content:"\F0E5B"}.mdi-printer-3d-nozzle-alert:before{content:"\F11C0"}.mdi-printer-3d-nozzle-alert-outline:before{content:"\F11C1"}.mdi-printer-3d-nozzle-outline:before{content:"\F0E5C"}.mdi-printer-alert:before{content:"\F042C"}.mdi-printer-check:before{content:"\F1146"}.mdi-printer-eye:before{content:"\F1458"}.mdi-printer-off:before{content:"\F0E5D"}.mdi-printer-pos:before{content:"\F1057"}.mdi-printer-search:before{content:"\F1457"}.mdi-printer-settings:before{content:"\F0707"}.mdi-printer-wireless:before{content:"\F0A0B"}.mdi-priority-high:before{content:"\F0603"}.mdi-priority-low:before{content:"\F0604"}.mdi-professional-hexagon:before{content:"\F042D"}.mdi-progress-alert:before{content:"\F0CBC"}.mdi-progress-check:before{content:"\F0995"}.mdi-progress-clock:before{content:"\F0996"}.mdi-progress-close:before{content:"\F110A"}.mdi-progress-download:before{content:"\F0997"}.mdi-progress-question:before{content:"\F1522"}.mdi-progress-upload:before{content:"\F0998"}.mdi-progress-wrench:before{content:"\F0CBD"}.mdi-projector:before{content:"\F042E"}.mdi-projector-screen:before{content:"\F042F"}.mdi-projector-screen-outline:before{content:"\F1724"}.mdi-propane-tank:before{content:"\F1357"}.mdi-propane-tank-outline:before{content:"\F1358"}.mdi-protocol:before{content:"\F0FD8"}.mdi-publish:before{content:"\F06A7"}.mdi-pulse:before{content:"\F0430"}.mdi-pump:before{content:"\F1402"}.mdi-pumpkin:before{content:"\F0BBF"}.mdi-purse:before{content:"\F0F1C"}.mdi-purse-outline:before{content:"\F0F1D"}.mdi-puzzle:before{content:"\F0431"}.mdi-puzzle-check:before{content:"\F1426"}.mdi-puzzle-check-outline:before{content:"\F1427"}.mdi-puzzle-edit:before{content:"\F14D3"}.mdi-puzzle-edit-outline:before{content:"\F14D9"}.mdi-puzzle-heart:before{content:"\F14D4"}.mdi-puzzle-heart-outline:before{content:"\F14DA"}.mdi-puzzle-minus:before{content:"\F14D1"}.mdi-puzzle-minus-outline:before{content:"\F14D7"}.mdi-puzzle-outline:before{content:"\F0A66"}.mdi-puzzle-plus:before{content:"\F14D0"}.mdi-puzzle-plus-outline:before{content:"\F14D6"}.mdi-puzzle-remove:before{content:"\F14D2"}.mdi-puzzle-remove-outline:before{content:"\F14D8"}.mdi-puzzle-star:before{content:"\F14D5"}.mdi-puzzle-star-outline:before{content:"\F14DB"}.mdi-qi:before{content:"\F0999"}.mdi-qqchat:before{content:"\F0605"}.mdi-qrcode:before{content:"\F0432"}.mdi-qrcode-edit:before{content:"\F08B8"}.mdi-qrcode-minus:before{content:"\F118C"}.mdi-qrcode-plus:before{content:"\F118B"}.mdi-qrcode-remove:before{content:"\F118D"}.mdi-qrcode-scan:before{content:"\F0433"}.mdi-quadcopter:before{content:"\F0434"}.mdi-quality-high:before{content:"\F0435"}.mdi-quality-low:before{content:"\F0A0C"}.mdi-quality-medium:before{content:"\F0A0D"}.mdi-quora:before{content:"\F0D29"}.mdi-rabbit:before{content:"\F0907"}.mdi-racing-helmet:before{content:"\F0D93"}.mdi-racquetball:before{content:"\F0D94"}.mdi-radar:before{content:"\F0437"}.mdi-radiator:before{content:"\F0438"}.mdi-radiator-disabled:before{content:"\F0AD7"}.mdi-radiator-off:before{content:"\F0AD8"}.mdi-radio:before{content:"\F0439"}.mdi-radio-am:before{content:"\F0CBE"}.mdi-radio-fm:before{content:"\F0CBF"}.mdi-radio-handheld:before{content:"\F043A"}.mdi-radio-off:before{content:"\F121C"}.mdi-radio-tower:before{content:"\F043B"}.mdi-radioactive:before{content:"\F043C"}.mdi-radioactive-off:before{content:"\F0EC1"}.mdi-radiobox-blank:before{content:"\F043D"}.mdi-radiobox-marked:before{content:"\F043E"}.mdi-radiology-box:before{content:"\F14C5"}.mdi-radiology-box-outline:before{content:"\F14C6"}.mdi-radius:before{content:"\F0CC0"}.mdi-radius-outline:before{content:"\F0CC1"}.mdi-railroad-light:before{content:"\F0F1E"}.mdi-rake:before{content:"\F1544"}.mdi-raspberry-pi:before{content:"\F043F"}.mdi-ray-end:before{content:"\F0440"}.mdi-ray-end-arrow:before{content:"\F0441"}.mdi-ray-start:before{content:"\F0442"}.mdi-ray-start-arrow:before{content:"\F0443"}.mdi-ray-start-end:before{content:"\F0444"}.mdi-ray-start-vertex-end:before{content:"\F15D8"}.mdi-ray-vertex:before{content:"\F0445"}.mdi-react:before{content:"\F0708"}.mdi-read:before{content:"\F0447"}.mdi-receipt:before{content:"\F0449"}.mdi-record:before{content:"\F044A"}.mdi-record-circle:before{content:"\F0EC2"}.mdi-record-circle-outline:before{content:"\F0EC3"}.mdi-record-player:before{content:"\F099A"}.mdi-record-rec:before{content:"\F044B"}.mdi-rectangle:before{content:"\F0E5E"}.mdi-rectangle-outline:before{content:"\F0E5F"}.mdi-recycle:before{content:"\F044C"}.mdi-recycle-variant:before{content:"\F139D"}.mdi-reddit:before{content:"\F044D"}.mdi-redhat:before{content:"\F111B"}.mdi-redo:before{content:"\F044E"}.mdi-redo-variant:before{content:"\F044F"}.mdi-reflect-horizontal:before{content:"\F0A0E"}.mdi-reflect-vertical:before{content:"\F0A0F"}.mdi-refresh:before{content:"\F0450"}.mdi-refresh-circle:before{content:"\F1377"}.mdi-regex:before{content:"\F0451"}.mdi-registered-trademark:before{content:"\F0A67"}.mdi-reiterate:before{content:"\F1588"}.mdi-relation-many-to-many:before{content:"\F1496"}.mdi-relation-many-to-one:before{content:"\F1497"}.mdi-relation-many-to-one-or-many:before{content:"\F1498"}.mdi-relation-many-to-only-one:before{content:"\F1499"}.mdi-relation-many-to-zero-or-many:before{content:"\F149A"}.mdi-relation-many-to-zero-or-one:before{content:"\F149B"}.mdi-relation-one-or-many-to-many:before{content:"\F149C"}.mdi-relation-one-or-many-to-one:before{content:"\F149D"}.mdi-relation-one-or-many-to-one-or-many:before{content:"\F149E"}.mdi-relation-one-or-many-to-only-one:before{content:"\F149F"}.mdi-relation-one-or-many-to-zero-or-many:before{content:"\F14A0"}.mdi-relation-one-or-many-to-zero-or-one:before{content:"\F14A1"}.mdi-relation-one-to-many:before{content:"\F14A2"}.mdi-relation-one-to-one:before{content:"\F14A3"}.mdi-relation-one-to-one-or-many:before{content:"\F14A4"}.mdi-relation-one-to-only-one:before{content:"\F14A5"}.mdi-relation-one-to-zero-or-many:before{content:"\F14A6"}.mdi-relation-one-to-zero-or-one:before{content:"\F14A7"}.mdi-relation-only-one-to-many:before{content:"\F14A8"}.mdi-relation-only-one-to-one:before{content:"\F14A9"}.mdi-relation-only-one-to-one-or-many:before{content:"\F14AA"}.mdi-relation-only-one-to-only-one:before{content:"\F14AB"}.mdi-relation-only-one-to-zero-or-many:before{content:"\F14AC"}.mdi-relation-only-one-to-zero-or-one:before{content:"\F14AD"}.mdi-relation-zero-or-many-to-many:before{content:"\F14AE"}.mdi-relation-zero-or-many-to-one:before{content:"\F14AF"}.mdi-relation-zero-or-many-to-one-or-many:before{content:"\F14B0"}.mdi-relation-zero-or-many-to-only-one:before{content:"\F14B1"}.mdi-relation-zero-or-many-to-zero-or-many:before{content:"\F14B2"}.mdi-relation-zero-or-many-to-zero-or-one:before{content:"\F14B3"}.mdi-relation-zero-or-one-to-many:before{content:"\F14B4"}.mdi-relation-zero-or-one-to-one:before{content:"\F14B5"}.mdi-relation-zero-or-one-to-one-or-many:before{content:"\F14B6"}.mdi-relation-zero-or-one-to-only-one:before{content:"\F14B7"}.mdi-relation-zero-or-one-to-zero-or-many:before{content:"\F14B8"}.mdi-relation-zero-or-one-to-zero-or-one:before{content:"\F14B9"}.mdi-relative-scale:before{content:"\F0452"}.mdi-reload:before{content:"\F0453"}.mdi-reload-alert:before{content:"\F110B"}.mdi-reminder:before{content:"\F088C"}.mdi-remote:before{content:"\F0454"}.mdi-remote-desktop:before{content:"\F08B9"}.mdi-remote-off:before{content:"\F0EC4"}.mdi-remote-tv:before{content:"\F0EC5"}.mdi-remote-tv-off:before{content:"\F0EC6"}.mdi-rename-box:before{content:"\F0455"}.mdi-reorder-horizontal:before{content:"\F0688"}.mdi-reorder-vertical:before{content:"\F0689"}.mdi-repeat:before{content:"\F0456"}.mdi-repeat-off:before{content:"\F0457"}.mdi-repeat-once:before{content:"\F0458"}.mdi-replay:before{content:"\F0459"}.mdi-reply:before{content:"\F045A"}.mdi-reply-all:before{content:"\F045B"}.mdi-reply-all-outline:before{content:"\F0F1F"}.mdi-reply-circle:before{content:"\F11AE"}.mdi-reply-outline:before{content:"\F0F20"}.mdi-reproduction:before{content:"\F045C"}.mdi-resistor:before{content:"\F0B44"}.mdi-resistor-nodes:before{content:"\F0B45"}.mdi-resize:before{content:"\F0A68"}.mdi-resize-bottom-right:before{content:"\F045D"}.mdi-responsive:before{content:"\F045E"}.mdi-restart:before{content:"\F0709"}.mdi-restart-alert:before{content:"\F110C"}.mdi-restart-off:before{content:"\F0D95"}.mdi-restore:before{content:"\F099B"}.mdi-restore-alert:before{content:"\F110D"}.mdi-rewind:before{content:"\F045F"}.mdi-rewind-10:before{content:"\F0D2A"}.mdi-rewind-30:before{content:"\F0D96"}.mdi-rewind-5:before{content:"\F11F9"}.mdi-rewind-60:before{content:"\F160C"}.mdi-rewind-outline:before{content:"\F070A"}.mdi-rhombus:before{content:"\F070B"}.mdi-rhombus-medium:before{content:"\F0A10"}.mdi-rhombus-medium-outline:before{content:"\F14DC"}.mdi-rhombus-outline:before{content:"\F070C"}.mdi-rhombus-split:before{content:"\F0A11"}.mdi-rhombus-split-outline:before{content:"\F14DD"}.mdi-ribbon:before{content:"\F0460"}.mdi-rice:before{content:"\F07EA"}.mdi-rickshaw:before{content:"\F15BB"}.mdi-rickshaw-electric:before{content:"\F15BC"}.mdi-ring:before{content:"\F07EB"}.mdi-rivet:before{content:"\F0E60"}.mdi-road:before{content:"\F0461"}.mdi-road-variant:before{content:"\F0462"}.mdi-robber:before{content:"\F1058"}.mdi-robot:before{content:"\F06A9"}.mdi-robot-angry:before{content:"\F169D"}.mdi-robot-angry-outline:before{content:"\F169E"}.mdi-robot-confused:before{content:"\F169F"}.mdi-robot-confused-outline:before{content:"\F16A0"}.mdi-robot-dead:before{content:"\F16A1"}.mdi-robot-dead-outline:before{content:"\F16A2"}.mdi-robot-excited:before{content:"\F16A3"}.mdi-robot-excited-outline:before{content:"\F16A4"}.mdi-robot-happy:before{content:"\F1719"}.mdi-robot-happy-outline:before{content:"\F171A"}.mdi-robot-industrial:before{content:"\F0B46"}.mdi-robot-love:before{content:"\F16A5"}.mdi-robot-love-outline:before{content:"\F16A6"}.mdi-robot-mower:before{content:"\F11F7"}.mdi-robot-mower-outline:before{content:"\F11F3"}.mdi-robot-off:before{content:"\F16A7"}.mdi-robot-off-outline:before{content:"\F167B"}.mdi-robot-outline:before{content:"\F167A"}.mdi-robot-vacuum:before{content:"\F070D"}.mdi-robot-vacuum-variant:before{content:"\F0908"}.mdi-rocket:before{content:"\F0463"}.mdi-rocket-launch:before{content:"\F14DE"}.mdi-rocket-launch-outline:before{content:"\F14DF"}.mdi-rocket-outline:before{content:"\F13AF"}.mdi-rodent:before{content:"\F1327"}.mdi-roller-skate:before{content:"\F0D2B"}.mdi-roller-skate-off:before{content:"\F0145"}.mdi-rollerblade:before{content:"\F0D2C"}.mdi-rollerblade-off:before{content:"\F002E"}.mdi-rollupjs:before{content:"\F0BC0"}.mdi-roman-numeral-1:before{content:"\F1088"}.mdi-roman-numeral-10:before{content:"\F1091"}.mdi-roman-numeral-2:before{content:"\F1089"}.mdi-roman-numeral-3:before{content:"\F108A"}.mdi-roman-numeral-4:before{content:"\F108B"}.mdi-roman-numeral-5:before{content:"\F108C"}.mdi-roman-numeral-6:before{content:"\F108D"}.mdi-roman-numeral-7:before{content:"\F108E"}.mdi-roman-numeral-8:before{content:"\F108F"}.mdi-roman-numeral-9:before{content:"\F1090"}.mdi-room-service:before{content:"\F088D"}.mdi-room-service-outline:before{content:"\F0D97"}.mdi-rotate-3d:before{content:"\F0EC7"}.mdi-rotate-3d-variant:before{content:"\F0464"}.mdi-rotate-left:before{content:"\F0465"}.mdi-rotate-left-variant:before{content:"\F0466"}.mdi-rotate-orbit:before{content:"\F0D98"}.mdi-rotate-right:before{content:"\F0467"}.mdi-rotate-right-variant:before{content:"\F0468"}.mdi-rounded-corner:before{content:"\F0607"}.mdi-router:before{content:"\F11E2"}.mdi-router-network:before{content:"\F1087"}.mdi-router-wireless:before{content:"\F0469"}.mdi-router-wireless-off:before{content:"\F15A3"}.mdi-router-wireless-settings:before{content:"\F0A69"}.mdi-routes:before{content:"\F046A"}.mdi-routes-clock:before{content:"\F1059"}.mdi-rowing:before{content:"\F0608"}.mdi-rss:before{content:"\F046B"}.mdi-rss-box:before{content:"\F046C"}.mdi-rss-off:before{content:"\F0F21"}.mdi-rug:before{content:"\F1475"}.mdi-rugby:before{content:"\F0D99"}.mdi-ruler:before{content:"\F046D"}.mdi-ruler-square:before{content:"\F0CC2"}.mdi-ruler-square-compass:before{content:"\F0EBE"}.mdi-run:before{content:"\F070E"}.mdi-run-fast:before{content:"\F046E"}.mdi-rv-truck:before{content:"\F11D4"}.mdi-sack:before{content:"\F0D2E"}.mdi-sack-percent:before{content:"\F0D2F"}.mdi-safe:before{content:"\F0A6A"}.mdi-safe-square:before{content:"\F127C"}.mdi-safe-square-outline:before{content:"\F127D"}.mdi-safety-goggles:before{content:"\F0D30"}.mdi-sail-boat:before{content:"\F0EC8"}.mdi-sale:before{content:"\F046F"}.mdi-salesforce:before{content:"\F088E"}.mdi-sass:before{content:"\F07EC"}.mdi-satellite:before{content:"\F0470"}.mdi-satellite-uplink:before{content:"\F0909"}.mdi-satellite-variant:before{content:"\F0471"}.mdi-sausage:before{content:"\F08BA"}.mdi-saw-blade:before{content:"\F0E61"}.mdi-sawtooth-wave:before{content:"\F147A"}.mdi-saxophone:before{content:"\F0609"}.mdi-scale:before{content:"\F0472"}.mdi-scale-balance:before{content:"\F05D1"}.mdi-scale-bathroom:before{content:"\F0473"}.mdi-scale-off:before{content:"\F105A"}.mdi-scan-helper:before{content:"\F13D8"}.mdi-scanner:before{content:"\F06AB"}.mdi-scanner-off:before{content:"\F090A"}.mdi-scatter-plot:before{content:"\F0EC9"}.mdi-scatter-plot-outline:before{content:"\F0ECA"}.mdi-school:before{content:"\F0474"}.mdi-school-outline:before{content:"\F1180"}.mdi-scissors-cutting:before{content:"\F0A6B"}.mdi-scooter:before{content:"\F15BD"}.mdi-scooter-electric:before{content:"\F15BE"}.mdi-scoreboard:before{content:"\F127E"}.mdi-scoreboard-outline:before{content:"\F127F"}.mdi-screen-rotation:before{content:"\F0475"}.mdi-screen-rotation-lock:before{content:"\F0478"}.mdi-screw-flat-top:before{content:"\F0DF3"}.mdi-screw-lag:before{content:"\F0DF4"}.mdi-screw-machine-flat-top:before{content:"\F0DF5"}.mdi-screw-machine-round-top:before{content:"\F0DF6"}.mdi-screw-round-top:before{content:"\F0DF7"}.mdi-screwdriver:before{content:"\F0476"}.mdi-script:before{content:"\F0BC1"}.mdi-script-outline:before{content:"\F0477"}.mdi-script-text:before{content:"\F0BC2"}.mdi-script-text-key:before{content:"\F1725"}.mdi-script-text-key-outline:before{content:"\F1726"}.mdi-script-text-outline:before{content:"\F0BC3"}.mdi-script-text-play:before{content:"\F1727"}.mdi-script-text-play-outline:before{content:"\F1728"}.mdi-sd:before{content:"\F0479"}.mdi-seal:before{content:"\F047A"}.mdi-seal-variant:before{content:"\F0FD9"}.mdi-search-web:before{content:"\F070F"}.mdi-seat:before{content:"\F0CC3"}.mdi-seat-flat:before{content:"\F047B"}.mdi-seat-flat-angled:before{content:"\F047C"}.mdi-seat-individual-suite:before{content:"\F047D"}.mdi-seat-legroom-extra:before{content:"\F047E"}.mdi-seat-legroom-normal:before{content:"\F047F"}.mdi-seat-legroom-reduced:before{content:"\F0480"}.mdi-seat-outline:before{content:"\F0CC4"}.mdi-seat-passenger:before{content:"\F1249"}.mdi-seat-recline-extra:before{content:"\F0481"}.mdi-seat-recline-normal:before{content:"\F0482"}.mdi-seatbelt:before{content:"\F0CC5"}.mdi-security:before{content:"\F0483"}.mdi-security-network:before{content:"\F0484"}.mdi-seed:before{content:"\F0E62"}.mdi-seed-off:before{content:"\F13FD"}.mdi-seed-off-outline:before{content:"\F13FE"}.mdi-seed-outline:before{content:"\F0E63"}.mdi-seesaw:before{content:"\F15A4"}.mdi-segment:before{content:"\F0ECB"}.mdi-select:before{content:"\F0485"}.mdi-select-all:before{content:"\F0486"}.mdi-select-color:before{content:"\F0D31"}.mdi-select-compare:before{content:"\F0AD9"}.mdi-select-drag:before{content:"\F0A6C"}.mdi-select-group:before{content:"\F0F82"}.mdi-select-inverse:before{content:"\F0487"}.mdi-select-marker:before{content:"\F1280"}.mdi-select-multiple:before{content:"\F1281"}.mdi-select-multiple-marker:before{content:"\F1282"}.mdi-select-off:before{content:"\F0488"}.mdi-select-place:before{content:"\F0FDA"}.mdi-select-search:before{content:"\F1204"}.mdi-selection:before{content:"\F0489"}.mdi-selection-drag:before{content:"\F0A6D"}.mdi-selection-ellipse:before{content:"\F0D32"}.mdi-selection-ellipse-arrow-inside:before{content:"\F0F22"}.mdi-selection-marker:before{content:"\F1283"}.mdi-selection-multiple:before{content:"\F1285"}.mdi-selection-multiple-marker:before{content:"\F1284"}.mdi-selection-off:before{content:"\F0777"}.mdi-selection-search:before{content:"\F1205"}.mdi-semantic-web:before{content:"\F1316"}.mdi-send:before{content:"\F048A"}.mdi-send-check:before{content:"\F1161"}.mdi-send-check-outline:before{content:"\F1162"}.mdi-send-circle:before{content:"\F0DF8"}.mdi-send-circle-outline:before{content:"\F0DF9"}.mdi-send-clock:before{content:"\F1163"}.mdi-send-clock-outline:before{content:"\F1164"}.mdi-send-lock:before{content:"\F07ED"}.mdi-send-lock-outline:before{content:"\F1166"}.mdi-send-outline:before{content:"\F1165"}.mdi-serial-port:before{content:"\F065C"}.mdi-server:before{content:"\F048B"}.mdi-server-minus:before{content:"\F048C"}.mdi-server-network:before{content:"\F048D"}.mdi-server-network-off:before{content:"\F048E"}.mdi-server-off:before{content:"\F048F"}.mdi-server-plus:before{content:"\F0490"}.mdi-server-remove:before{content:"\F0491"}.mdi-server-security:before{content:"\F0492"}.mdi-set-all:before{content:"\F0778"}.mdi-set-center:before{content:"\F0779"}.mdi-set-center-right:before{content:"\F077A"}.mdi-set-left:before{content:"\F077B"}.mdi-set-left-center:before{content:"\F077C"}.mdi-set-left-right:before{content:"\F077D"}.mdi-set-merge:before{content:"\F14E0"}.mdi-set-none:before{content:"\F077E"}.mdi-set-right:before{content:"\F077F"}.mdi-set-split:before{content:"\F14E1"}.mdi-set-square:before{content:"\F145D"}.mdi-set-top-box:before{content:"\F099F"}.mdi-settings-helper:before{content:"\F0A6E"}.mdi-shaker:before{content:"\F110E"}.mdi-shaker-outline:before{content:"\F110F"}.mdi-shape:before{content:"\F0831"}.mdi-shape-circle-plus:before{content:"\F065D"}.mdi-shape-outline:before{content:"\F0832"}.mdi-shape-oval-plus:before{content:"\F11FA"}.mdi-shape-plus:before{content:"\F0495"}.mdi-shape-polygon-plus:before{content:"\F065E"}.mdi-shape-rectangle-plus:before{content:"\F065F"}.mdi-shape-square-plus:before{content:"\F0660"}.mdi-shape-square-rounded-plus:before{content:"\F14FA"}.mdi-share:before{content:"\F0496"}.mdi-share-all:before{content:"\F11F4"}.mdi-share-all-outline:before{content:"\F11F5"}.mdi-share-circle:before{content:"\F11AD"}.mdi-share-off:before{content:"\F0F23"}.mdi-share-off-outline:before{content:"\F0F24"}.mdi-share-outline:before{content:"\F0932"}.mdi-share-variant:before{content:"\F0497"}.mdi-share-variant-outline:before{content:"\F1514"}.mdi-shark-fin:before{content:"\F1673"}.mdi-shark-fin-outline:before{content:"\F1674"}.mdi-sheep:before{content:"\F0CC6"}.mdi-shield:before{content:"\F0498"}.mdi-shield-account:before{content:"\F088F"}.mdi-shield-account-outline:before{content:"\F0A12"}.mdi-shield-account-variant:before{content:"\F15A7"}.mdi-shield-account-variant-outline:before{content:"\F15A8"}.mdi-shield-airplane:before{content:"\F06BB"}.mdi-shield-airplane-outline:before{content:"\F0CC7"}.mdi-shield-alert:before{content:"\F0ECC"}.mdi-shield-alert-outline:before{content:"\F0ECD"}.mdi-shield-bug:before{content:"\F13DA"}.mdi-shield-bug-outline:before{content:"\F13DB"}.mdi-shield-car:before{content:"\F0F83"}.mdi-shield-check:before{content:"\F0565"}.mdi-shield-check-outline:before{content:"\F0CC8"}.mdi-shield-cross:before{content:"\F0CC9"}.mdi-shield-cross-outline:before{content:"\F0CCA"}.mdi-shield-edit:before{content:"\F11A0"}.mdi-shield-edit-outline:before{content:"\F11A1"}.mdi-shield-half:before{content:"\F1360"}.mdi-shield-half-full:before{content:"\F0780"}.mdi-shield-home:before{content:"\F068A"}.mdi-shield-home-outline:before{content:"\F0CCB"}.mdi-shield-key:before{content:"\F0BC4"}.mdi-shield-key-outline:before{content:"\F0BC5"}.mdi-shield-link-variant:before{content:"\F0D33"}.mdi-shield-link-variant-outline:before{content:"\F0D34"}.mdi-shield-lock:before{content:"\F099D"}.mdi-shield-lock-outline:before{content:"\F0CCC"}.mdi-shield-off:before{content:"\F099E"}.mdi-shield-off-outline:before{content:"\F099C"}.mdi-shield-outline:before{content:"\F0499"}.mdi-shield-plus:before{content:"\F0ADA"}.mdi-shield-plus-outline:before{content:"\F0ADB"}.mdi-shield-refresh:before{content:"\F00AA"}.mdi-shield-refresh-outline:before{content:"\F01E0"}.mdi-shield-remove:before{content:"\F0ADC"}.mdi-shield-remove-outline:before{content:"\F0ADD"}.mdi-shield-search:before{content:"\F0D9A"}.mdi-shield-star:before{content:"\F113B"}.mdi-shield-star-outline:before{content:"\F113C"}.mdi-shield-sun:before{content:"\F105D"}.mdi-shield-sun-outline:before{content:"\F105E"}.mdi-shield-sync:before{content:"\F11A2"}.mdi-shield-sync-outline:before{content:"\F11A3"}.mdi-ship-wheel:before{content:"\F0833"}.mdi-shoe-ballet:before{content:"\F15CA"}.mdi-shoe-cleat:before{content:"\F15C7"}.mdi-shoe-formal:before{content:"\F0B47"}.mdi-shoe-heel:before{content:"\F0B48"}.mdi-shoe-print:before{content:"\F0DFA"}.mdi-shoe-sneaker:before{content:"\F15C8"}.mdi-shopping:before{content:"\F049A"}.mdi-shopping-music:before{content:"\F049B"}.mdi-shopping-outline:before{content:"\F11D5"}.mdi-shopping-search:before{content:"\F0F84"}.mdi-shore:before{content:"\F14F9"}.mdi-shovel:before{content:"\F0710"}.mdi-shovel-off:before{content:"\F0711"}.mdi-shower:before{content:"\F09A0"}.mdi-shower-head:before{content:"\F09A1"}.mdi-shredder:before{content:"\F049C"}.mdi-shuffle:before{content:"\F049D"}.mdi-shuffle-disabled:before{content:"\F049E"}.mdi-shuffle-variant:before{content:"\F049F"}.mdi-shuriken:before{content:"\F137F"}.mdi-sigma:before{content:"\F04A0"}.mdi-sigma-lower:before{content:"\F062B"}.mdi-sign-caution:before{content:"\F04A1"}.mdi-sign-direction:before{content:"\F0781"}.mdi-sign-direction-minus:before{content:"\F1000"}.mdi-sign-direction-plus:before{content:"\F0FDC"}.mdi-sign-direction-remove:before{content:"\F0FDD"}.mdi-sign-pole:before{content:"\F14F8"}.mdi-sign-real-estate:before{content:"\F1118"}.mdi-sign-text:before{content:"\F0782"}.mdi-signal:before{content:"\F04A2"}.mdi-signal-2g:before{content:"\F0712"}.mdi-signal-3g:before{content:"\F0713"}.mdi-signal-4g:before{content:"\F0714"}.mdi-signal-5g:before{content:"\F0A6F"}.mdi-signal-cellular-1:before{content:"\F08BC"}.mdi-signal-cellular-2:before{content:"\F08BD"}.mdi-signal-cellular-3:before{content:"\F08BE"}.mdi-signal-cellular-outline:before{content:"\F08BF"}.mdi-signal-distance-variant:before{content:"\F0E64"}.mdi-signal-hspa:before{content:"\F0715"}.mdi-signal-hspa-plus:before{content:"\F0716"}.mdi-signal-off:before{content:"\F0783"}.mdi-signal-variant:before{content:"\F060A"}.mdi-signature:before{content:"\F0DFB"}.mdi-signature-freehand:before{content:"\F0DFC"}.mdi-signature-image:before{content:"\F0DFD"}.mdi-signature-text:before{content:"\F0DFE"}.mdi-silo:before{content:"\F0B49"}.mdi-silverware:before{content:"\F04A3"}.mdi-silverware-clean:before{content:"\F0FDE"}.mdi-silverware-fork:before{content:"\F04A4"}.mdi-silverware-fork-knife:before{content:"\F0A70"}.mdi-silverware-spoon:before{content:"\F04A5"}.mdi-silverware-variant:before{content:"\F04A6"}.mdi-sim:before{content:"\F04A7"}.mdi-sim-alert:before{content:"\F04A8"}.mdi-sim-alert-outline:before{content:"\F15D3"}.mdi-sim-off:before{content:"\F04A9"}.mdi-sim-off-outline:before{content:"\F15D4"}.mdi-sim-outline:before{content:"\F15D5"}.mdi-simple-icons:before{content:"\F131D"}.mdi-sina-weibo:before{content:"\F0ADF"}.mdi-sine-wave:before{content:"\F095B"}.mdi-sitemap:before{content:"\F04AA"}.mdi-size-l:before{content:"\F13A6"}.mdi-size-m:before{content:"\F13A5"}.mdi-size-s:before{content:"\F13A4"}.mdi-size-xl:before{content:"\F13A7"}.mdi-size-xs:before{content:"\F13A3"}.mdi-size-xxl:before{content:"\F13A8"}.mdi-size-xxs:before{content:"\F13A2"}.mdi-size-xxxl:before{content:"\F13A9"}.mdi-skate:before{content:"\F0D35"}.mdi-skateboard:before{content:"\F14C2"}.mdi-skew-less:before{content:"\F0D36"}.mdi-skew-more:before{content:"\F0D37"}.mdi-ski:before{content:"\F1304"}.mdi-ski-cross-country:before{content:"\F1305"}.mdi-ski-water:before{content:"\F1306"}.mdi-skip-backward:before{content:"\F04AB"}.mdi-skip-backward-outline:before{content:"\F0F25"}.mdi-skip-forward:before{content:"\F04AC"}.mdi-skip-forward-outline:before{content:"\F0F26"}.mdi-skip-next:before{content:"\F04AD"}.mdi-skip-next-circle:before{content:"\F0661"}.mdi-skip-next-circle-outline:before{content:"\F0662"}.mdi-skip-next-outline:before{content:"\F0F27"}.mdi-skip-previous:before{content:"\F04AE"}.mdi-skip-previous-circle:before{content:"\F0663"}.mdi-skip-previous-circle-outline:before{content:"\F0664"}.mdi-skip-previous-outline:before{content:"\F0F28"}.mdi-skull:before{content:"\F068C"}.mdi-skull-crossbones:before{content:"\F0BC6"}.mdi-skull-crossbones-outline:before{content:"\F0BC7"}.mdi-skull-outline:before{content:"\F0BC8"}.mdi-skull-scan:before{content:"\F14C7"}.mdi-skull-scan-outline:before{content:"\F14C8"}.mdi-skype:before{content:"\F04AF"}.mdi-skype-business:before{content:"\F04B0"}.mdi-slack:before{content:"\F04B1"}.mdi-slash-forward:before{content:"\F0FDF"}.mdi-slash-forward-box:before{content:"\F0FE0"}.mdi-sleep:before{content:"\F04B2"}.mdi-sleep-off:before{content:"\F04B3"}.mdi-slide:before{content:"\F15A5"}.mdi-slope-downhill:before{content:"\F0DFF"}.mdi-slope-uphill:before{content:"\F0E00"}.mdi-slot-machine:before{content:"\F1114"}.mdi-slot-machine-outline:before{content:"\F1115"}.mdi-smart-card:before{content:"\F10BD"}.mdi-smart-card-outline:before{content:"\F10BE"}.mdi-smart-card-reader:before{content:"\F10BF"}.mdi-smart-card-reader-outline:before{content:"\F10C0"}.mdi-smog:before{content:"\F0A71"}.mdi-smoke-detector:before{content:"\F0392"}.mdi-smoking:before{content:"\F04B4"}.mdi-smoking-off:before{content:"\F04B5"}.mdi-smoking-pipe:before{content:"\F140D"}.mdi-smoking-pipe-off:before{content:"\F1428"}.mdi-snail:before{content:"\F1677"}.mdi-snake:before{content:"\F150E"}.mdi-snapchat:before{content:"\F04B6"}.mdi-snowboard:before{content:"\F1307"}.mdi-snowflake:before{content:"\F0717"}.mdi-snowflake-alert:before{content:"\F0F29"}.mdi-snowflake-melt:before{content:"\F12CB"}.mdi-snowflake-off:before{content:"\F14E3"}.mdi-snowflake-variant:before{content:"\F0F2A"}.mdi-snowman:before{content:"\F04B7"}.mdi-soccer:before{content:"\F04B8"}.mdi-soccer-field:before{content:"\F0834"}.mdi-social-distance-2-meters:before{content:"\F1579"}.mdi-social-distance-6-feet:before{content:"\F157A"}.mdi-sofa:before{content:"\F04B9"}.mdi-sofa-outline:before{content:"\F156D"}.mdi-sofa-single:before{content:"\F156E"}.mdi-sofa-single-outline:before{content:"\F156F"}.mdi-solar-panel:before{content:"\F0D9B"}.mdi-solar-panel-large:before{content:"\F0D9C"}.mdi-solar-power:before{content:"\F0A72"}.mdi-soldering-iron:before{content:"\F1092"}.mdi-solid:before{content:"\F068D"}.mdi-sony-playstation:before{content:"\F0414"}.mdi-sort:before{content:"\F04BA"}.mdi-sort-alphabetical-ascending:before{content:"\F05BD"}.mdi-sort-alphabetical-ascending-variant:before{content:"\F1148"}.mdi-sort-alphabetical-descending:before{content:"\F05BF"}.mdi-sort-alphabetical-descending-variant:before{content:"\F1149"}.mdi-sort-alphabetical-variant:before{content:"\F04BB"}.mdi-sort-ascending:before{content:"\F04BC"}.mdi-sort-bool-ascending:before{content:"\F1385"}.mdi-sort-bool-ascending-variant:before{content:"\F1386"}.mdi-sort-bool-descending:before{content:"\F1387"}.mdi-sort-bool-descending-variant:before{content:"\F1388"}.mdi-sort-calendar-ascending:before{content:"\F1547"}.mdi-sort-calendar-descending:before{content:"\F1548"}.mdi-sort-clock-ascending:before{content:"\F1549"}.mdi-sort-clock-ascending-outline:before{content:"\F154A"}.mdi-sort-clock-descending:before{content:"\F154B"}.mdi-sort-clock-descending-outline:before{content:"\F154C"}.mdi-sort-descending:before{content:"\F04BD"}.mdi-sort-numeric-ascending:before{content:"\F1389"}.mdi-sort-numeric-ascending-variant:before{content:"\F090D"}.mdi-sort-numeric-descending:before{content:"\F138A"}.mdi-sort-numeric-descending-variant:before{content:"\F0AD2"}.mdi-sort-numeric-variant:before{content:"\F04BE"}.mdi-sort-reverse-variant:before{content:"\F033C"}.mdi-sort-variant:before{content:"\F04BF"}.mdi-sort-variant-lock:before{content:"\F0CCD"}.mdi-sort-variant-lock-open:before{content:"\F0CCE"}.mdi-sort-variant-remove:before{content:"\F1147"}.mdi-soundcloud:before{content:"\F04C0"}.mdi-source-branch:before{content:"\F062C"}.mdi-source-branch-check:before{content:"\F14CF"}.mdi-source-branch-minus:before{content:"\F14CB"}.mdi-source-branch-plus:before{content:"\F14CA"}.mdi-source-branch-refresh:before{content:"\F14CD"}.mdi-source-branch-remove:before{content:"\F14CC"}.mdi-source-branch-sync:before{content:"\F14CE"}.mdi-source-commit:before{content:"\F0718"}.mdi-source-commit-end:before{content:"\F0719"}.mdi-source-commit-end-local:before{content:"\F071A"}.mdi-source-commit-local:before{content:"\F071B"}.mdi-source-commit-next-local:before{content:"\F071C"}.mdi-source-commit-start:before{content:"\F071D"}.mdi-source-commit-start-next-local:before{content:"\F071E"}.mdi-source-fork:before{content:"\F04C1"}.mdi-source-merge:before{content:"\F062D"}.mdi-source-pull:before{content:"\F04C2"}.mdi-source-repository:before{content:"\F0CCF"}.mdi-source-repository-multiple:before{content:"\F0CD0"}.mdi-soy-sauce:before{content:"\F07EE"}.mdi-soy-sauce-off:before{content:"\F13FC"}.mdi-spa:before{content:"\F0CD1"}.mdi-spa-outline:before{content:"\F0CD2"}.mdi-space-invaders:before{content:"\F0BC9"}.mdi-space-station:before{content:"\F1383"}.mdi-spade:before{content:"\F0E65"}.mdi-sparkles:before{content:"\F1545"}.mdi-speaker:before{content:"\F04C3"}.mdi-speaker-bluetooth:before{content:"\F09A2"}.mdi-speaker-multiple:before{content:"\F0D38"}.mdi-speaker-off:before{content:"\F04C4"}.mdi-speaker-wireless:before{content:"\F071F"}.mdi-speedometer:before{content:"\F04C5"}.mdi-speedometer-medium:before{content:"\F0F85"}.mdi-speedometer-slow:before{content:"\F0F86"}.mdi-spellcheck:before{content:"\F04C6"}.mdi-spider:before{content:"\F11EA"}.mdi-spider-thread:before{content:"\F11EB"}.mdi-spider-web:before{content:"\F0BCA"}.mdi-spirit-level:before{content:"\F14F1"}.mdi-spoon-sugar:before{content:"\F1429"}.mdi-spotify:before{content:"\F04C7"}.mdi-spotlight:before{content:"\F04C8"}.mdi-spotlight-beam:before{content:"\F04C9"}.mdi-spray:before{content:"\F0665"}.mdi-spray-bottle:before{content:"\F0AE0"}.mdi-sprinkler:before{content:"\F105F"}.mdi-sprinkler-variant:before{content:"\F1060"}.mdi-sprout:before{content:"\F0E66"}.mdi-sprout-outline:before{content:"\F0E67"}.mdi-square:before{content:"\F0764"}.mdi-square-circle:before{content:"\F1500"}.mdi-square-edit-outline:before{content:"\F090C"}.mdi-square-medium:before{content:"\F0A13"}.mdi-square-medium-outline:before{content:"\F0A14"}.mdi-square-off:before{content:"\F12EE"}.mdi-square-off-outline:before{content:"\F12EF"}.mdi-square-outline:before{content:"\F0763"}.mdi-square-root:before{content:"\F0784"}.mdi-square-root-box:before{content:"\F09A3"}.mdi-square-rounded:before{content:"\F14FB"}.mdi-square-rounded-outline:before{content:"\F14FC"}.mdi-square-small:before{content:"\F0A15"}.mdi-square-wave:before{content:"\F147B"}.mdi-squeegee:before{content:"\F0AE1"}.mdi-ssh:before{content:"\F08C0"}.mdi-stack-exchange:before{content:"\F060B"}.mdi-stack-overflow:before{content:"\F04CC"}.mdi-stackpath:before{content:"\F0359"}.mdi-stadium:before{content:"\F0FF9"}.mdi-stadium-variant:before{content:"\F0720"}.mdi-stairs:before{content:"\F04CD"}.mdi-stairs-box:before{content:"\F139E"}.mdi-stairs-down:before{content:"\F12BE"}.mdi-stairs-up:before{content:"\F12BD"}.mdi-stamper:before{content:"\F0D39"}.mdi-standard-definition:before{content:"\F07EF"}.mdi-star:before{content:"\F04CE"}.mdi-star-box:before{content:"\F0A73"}.mdi-star-box-multiple:before{content:"\F1286"}.mdi-star-box-multiple-outline:before{content:"\F1287"}.mdi-star-box-outline:before{content:"\F0A74"}.mdi-star-check:before{content:"\F1566"}.mdi-star-check-outline:before{content:"\F156A"}.mdi-star-circle:before{content:"\F04CF"}.mdi-star-circle-outline:before{content:"\F09A4"}.mdi-star-cog:before{content:"\F1668"}.mdi-star-cog-outline:before{content:"\F1669"}.mdi-star-face:before{content:"\F09A5"}.mdi-star-four-points:before{content:"\F0AE2"}.mdi-star-four-points-outline:before{content:"\F0AE3"}.mdi-star-half:before{content:"\F0246"}.mdi-star-half-full:before{content:"\F04D0"}.mdi-star-minus:before{content:"\F1564"}.mdi-star-minus-outline:before{content:"\F1568"}.mdi-star-off:before{content:"\F04D1"}.mdi-star-off-outline:before{content:"\F155B"}.mdi-star-outline:before{content:"\F04D2"}.mdi-star-plus:before{content:"\F1563"}.mdi-star-plus-outline:before{content:"\F1567"}.mdi-star-remove:before{content:"\F1565"}.mdi-star-remove-outline:before{content:"\F1569"}.mdi-star-settings:before{content:"\F166A"}.mdi-star-settings-outline:before{content:"\F166B"}.mdi-star-shooting:before{content:"\F1741"}.mdi-star-shooting-outline:before{content:"\F1742"}.mdi-star-three-points:before{content:"\F0AE4"}.mdi-star-three-points-outline:before{content:"\F0AE5"}.mdi-state-machine:before{content:"\F11EF"}.mdi-steam:before{content:"\F04D3"}.mdi-steering:before{content:"\F04D4"}.mdi-steering-off:before{content:"\F090E"}.mdi-step-backward:before{content:"\F04D5"}.mdi-step-backward-2:before{content:"\F04D6"}.mdi-step-forward:before{content:"\F04D7"}.mdi-step-forward-2:before{content:"\F04D8"}.mdi-stethoscope:before{content:"\F04D9"}.mdi-sticker:before{content:"\F1364"}.mdi-sticker-alert:before{content:"\F1365"}.mdi-sticker-alert-outline:before{content:"\F1366"}.mdi-sticker-check:before{content:"\F1367"}.mdi-sticker-check-outline:before{content:"\F1368"}.mdi-sticker-circle-outline:before{content:"\F05D0"}.mdi-sticker-emoji:before{content:"\F0785"}.mdi-sticker-minus:before{content:"\F1369"}.mdi-sticker-minus-outline:before{content:"\F136A"}.mdi-sticker-outline:before{content:"\F136B"}.mdi-sticker-plus:before{content:"\F136C"}.mdi-sticker-plus-outline:before{content:"\F136D"}.mdi-sticker-remove:before{content:"\F136E"}.mdi-sticker-remove-outline:before{content:"\F136F"}.mdi-stocking:before{content:"\F04DA"}.mdi-stomach:before{content:"\F1093"}.mdi-stop:before{content:"\F04DB"}.mdi-stop-circle:before{content:"\F0666"}.mdi-stop-circle-outline:before{content:"\F0667"}.mdi-store:before{content:"\F04DC"}.mdi-store-24-hour:before{content:"\F04DD"}.mdi-store-minus:before{content:"\F165E"}.mdi-store-outline:before{content:"\F1361"}.mdi-store-plus:before{content:"\F165F"}.mdi-store-remove:before{content:"\F1660"}.mdi-storefront:before{content:"\F07C7"}.mdi-storefront-outline:before{content:"\F10C1"}.mdi-stove:before{content:"\F04DE"}.mdi-strategy:before{content:"\F11D6"}.mdi-stretch-to-page:before{content:"\F0F2B"}.mdi-stretch-to-page-outline:before{content:"\F0F2C"}.mdi-string-lights:before{content:"\F12BA"}.mdi-string-lights-off:before{content:"\F12BB"}.mdi-subdirectory-arrow-left:before{content:"\F060C"}.mdi-subdirectory-arrow-right:before{content:"\F060D"}.mdi-submarine:before{content:"\F156C"}.mdi-subtitles:before{content:"\F0A16"}.mdi-subtitles-outline:before{content:"\F0A17"}.mdi-subway:before{content:"\F06AC"}.mdi-subway-alert-variant:before{content:"\F0D9D"}.mdi-subway-variant:before{content:"\F04DF"}.mdi-summit:before{content:"\F0786"}.mdi-sunglasses:before{content:"\F04E0"}.mdi-surround-sound:before{content:"\F05C5"}.mdi-surround-sound-2-0:before{content:"\F07F0"}.mdi-surround-sound-2-1:before{content:"\F1729"}.mdi-surround-sound-3-1:before{content:"\F07F1"}.mdi-surround-sound-5-1:before{content:"\F07F2"}.mdi-surround-sound-5-1-2:before{content:"\F172A"}.mdi-surround-sound-7-1:before{content:"\F07F3"}.mdi-svg:before{content:"\F0721"}.mdi-swap-horizontal:before{content:"\F04E1"}.mdi-swap-horizontal-bold:before{content:"\F0BCD"}.mdi-swap-horizontal-circle:before{content:"\F0FE1"}.mdi-swap-horizontal-circle-outline:before{content:"\F0FE2"}.mdi-swap-horizontal-variant:before{content:"\F08C1"}.mdi-swap-vertical:before{content:"\F04E2"}.mdi-swap-vertical-bold:before{content:"\F0BCE"}.mdi-swap-vertical-circle:before{content:"\F0FE3"}.mdi-swap-vertical-circle-outline:before{content:"\F0FE4"}.mdi-swap-vertical-variant:before{content:"\F08C2"}.mdi-swim:before{content:"\F04E3"}.mdi-switch:before{content:"\F04E4"}.mdi-sword:before{content:"\F04E5"}.mdi-sword-cross:before{content:"\F0787"}.mdi-syllabary-hangul:before{content:"\F1333"}.mdi-syllabary-hiragana:before{content:"\F1334"}.mdi-syllabary-katakana:before{content:"\F1335"}.mdi-syllabary-katakana-halfwidth:before{content:"\F1336"}.mdi-symbol:before{content:"\F1501"}.mdi-symfony:before{content:"\F0AE6"}.mdi-sync:before{content:"\F04E6"}.mdi-sync-alert:before{content:"\F04E7"}.mdi-sync-circle:before{content:"\F1378"}.mdi-sync-off:before{content:"\F04E8"}.mdi-tab:before{content:"\F04E9"}.mdi-tab-minus:before{content:"\F0B4B"}.mdi-tab-plus:before{content:"\F075C"}.mdi-tab-remove:before{content:"\F0B4C"}.mdi-tab-unselected:before{content:"\F04EA"}.mdi-table:before{content:"\F04EB"}.mdi-table-account:before{content:"\F13B9"}.mdi-table-alert:before{content:"\F13BA"}.mdi-table-arrow-down:before{content:"\F13BB"}.mdi-table-arrow-left:before{content:"\F13BC"}.mdi-table-arrow-right:before{content:"\F13BD"}.mdi-table-arrow-up:before{content:"\F13BE"}.mdi-table-border:before{content:"\F0A18"}.mdi-table-cancel:before{content:"\F13BF"}.mdi-table-chair:before{content:"\F1061"}.mdi-table-check:before{content:"\F13C0"}.mdi-table-clock:before{content:"\F13C1"}.mdi-table-cog:before{content:"\F13C2"}.mdi-table-column:before{content:"\F0835"}.mdi-table-column-plus-after:before{content:"\F04EC"}.mdi-table-column-plus-before:before{content:"\F04ED"}.mdi-table-column-remove:before{content:"\F04EE"}.mdi-table-column-width:before{content:"\F04EF"}.mdi-table-edit:before{content:"\F04F0"}.mdi-table-eye:before{content:"\F1094"}.mdi-table-eye-off:before{content:"\F13C3"}.mdi-table-furniture:before{content:"\F05BC"}.mdi-table-headers-eye:before{content:"\F121D"}.mdi-table-headers-eye-off:before{content:"\F121E"}.mdi-table-heart:before{content:"\F13C4"}.mdi-table-key:before{content:"\F13C5"}.mdi-table-large:before{content:"\F04F1"}.mdi-table-large-plus:before{content:"\F0F87"}.mdi-table-large-remove:before{content:"\F0F88"}.mdi-table-lock:before{content:"\F13C6"}.mdi-table-merge-cells:before{content:"\F09A6"}.mdi-table-minus:before{content:"\F13C7"}.mdi-table-multiple:before{content:"\F13C8"}.mdi-table-network:before{content:"\F13C9"}.mdi-table-of-contents:before{content:"\F0836"}.mdi-table-off:before{content:"\F13CA"}.mdi-table-picnic:before{content:"\F1743"}.mdi-table-plus:before{content:"\F0A75"}.mdi-table-refresh:before{content:"\F13A0"}.mdi-table-remove:before{content:"\F0A76"}.mdi-table-row:before{content:"\F0837"}.mdi-table-row-height:before{content:"\F04F2"}.mdi-table-row-plus-after:before{content:"\F04F3"}.mdi-table-row-plus-before:before{content:"\F04F4"}.mdi-table-row-remove:before{content:"\F04F5"}.mdi-table-search:before{content:"\F090F"}.mdi-table-settings:before{content:"\F0838"}.mdi-table-split-cell:before{content:"\F142A"}.mdi-table-star:before{content:"\F13CB"}.mdi-table-sync:before{content:"\F13A1"}.mdi-table-tennis:before{content:"\F0E68"}.mdi-tablet:before{content:"\F04F6"}.mdi-tablet-android:before{content:"\F04F7"}.mdi-tablet-cellphone:before{content:"\F09A7"}.mdi-tablet-dashboard:before{content:"\F0ECE"}.mdi-tablet-ipad:before{content:"\F04F8"}.mdi-taco:before{content:"\F0762"}.mdi-tag:before{content:"\F04F9"}.mdi-tag-arrow-down:before{content:"\F172B"}.mdi-tag-arrow-down-outline:before{content:"\F172C"}.mdi-tag-arrow-left:before{content:"\F172D"}.mdi-tag-arrow-left-outline:before{content:"\F172E"}.mdi-tag-arrow-right:before{content:"\F172F"}.mdi-tag-arrow-right-outline:before{content:"\F1730"}.mdi-tag-arrow-up:before{content:"\F1731"}.mdi-tag-arrow-up-outline:before{content:"\F1732"}.mdi-tag-faces:before{content:"\F04FA"}.mdi-tag-heart:before{content:"\F068B"}.mdi-tag-heart-outline:before{content:"\F0BCF"}.mdi-tag-minus:before{content:"\F0910"}.mdi-tag-minus-outline:before{content:"\F121F"}.mdi-tag-multiple:before{content:"\F04FB"}.mdi-tag-multiple-outline:before{content:"\F12F7"}.mdi-tag-off:before{content:"\F1220"}.mdi-tag-off-outline:before{content:"\F1221"}.mdi-tag-outline:before{content:"\F04FC"}.mdi-tag-plus:before{content:"\F0722"}.mdi-tag-plus-outline:before{content:"\F1222"}.mdi-tag-remove:before{content:"\F0723"}.mdi-tag-remove-outline:before{content:"\F1223"}.mdi-tag-text:before{content:"\F1224"}.mdi-tag-text-outline:before{content:"\F04FD"}.mdi-tailwind:before{content:"\F13FF"}.mdi-tank:before{content:"\F0D3A"}.mdi-tanker-truck:before{content:"\F0FE5"}.mdi-tape-drive:before{content:"\F16DF"}.mdi-tape-measure:before{content:"\F0B4D"}.mdi-target:before{content:"\F04FE"}.mdi-target-account:before{content:"\F0BD0"}.mdi-target-variant:before{content:"\F0A77"}.mdi-taxi:before{content:"\F04FF"}.mdi-tea:before{content:"\F0D9E"}.mdi-tea-outline:before{content:"\F0D9F"}.mdi-teach:before{content:"\F0890"}.mdi-teamviewer:before{content:"\F0500"}.mdi-telegram:before{content:"\F0501"}.mdi-telescope:before{content:"\F0B4E"}.mdi-television:before{content:"\F0502"}.mdi-television-ambient-light:before{content:"\F1356"}.mdi-television-box:before{content:"\F0839"}.mdi-television-classic:before{content:"\F07F4"}.mdi-television-classic-off:before{content:"\F083A"}.mdi-television-clean:before{content:"\F1110"}.mdi-television-guide:before{content:"\F0503"}.mdi-television-off:before{content:"\F083B"}.mdi-television-pause:before{content:"\F0F89"}.mdi-television-play:before{content:"\F0ECF"}.mdi-television-stop:before{content:"\F0F8A"}.mdi-temperature-celsius:before{content:"\F0504"}.mdi-temperature-fahrenheit:before{content:"\F0505"}.mdi-temperature-kelvin:before{content:"\F0506"}.mdi-tennis:before{content:"\F0DA0"}.mdi-tennis-ball:before{content:"\F0507"}.mdi-tent:before{content:"\F0508"}.mdi-terraform:before{content:"\F1062"}.mdi-terrain:before{content:"\F0509"}.mdi-test-tube:before{content:"\F0668"}.mdi-test-tube-empty:before{content:"\F0911"}.mdi-test-tube-off:before{content:"\F0912"}.mdi-text:before{content:"\F09A8"}.mdi-text-account:before{content:"\F1570"}.mdi-text-box:before{content:"\F021A"}.mdi-text-box-check:before{content:"\F0EA6"}.mdi-text-box-check-outline:before{content:"\F0EA7"}.mdi-text-box-minus:before{content:"\F0EA8"}.mdi-text-box-minus-outline:before{content:"\F0EA9"}.mdi-text-box-multiple:before{content:"\F0AB7"}.mdi-text-box-multiple-outline:before{content:"\F0AB8"}.mdi-text-box-outline:before{content:"\F09ED"}.mdi-text-box-plus:before{content:"\F0EAA"}.mdi-text-box-plus-outline:before{content:"\F0EAB"}.mdi-text-box-remove:before{content:"\F0EAC"}.mdi-text-box-remove-outline:before{content:"\F0EAD"}.mdi-text-box-search:before{content:"\F0EAE"}.mdi-text-box-search-outline:before{content:"\F0EAF"}.mdi-text-recognition:before{content:"\F113D"}.mdi-text-search:before{content:"\F13B8"}.mdi-text-shadow:before{content:"\F0669"}.mdi-text-short:before{content:"\F09A9"}.mdi-text-subject:before{content:"\F09AA"}.mdi-text-to-speech:before{content:"\F050A"}.mdi-text-to-speech-off:before{content:"\F050B"}.mdi-texture:before{content:"\F050C"}.mdi-texture-box:before{content:"\F0FE6"}.mdi-theater:before{content:"\F050D"}.mdi-theme-light-dark:before{content:"\F050E"}.mdi-thermometer:before{content:"\F050F"}.mdi-thermometer-alert:before{content:"\F0E01"}.mdi-thermometer-chevron-down:before{content:"\F0E02"}.mdi-thermometer-chevron-up:before{content:"\F0E03"}.mdi-thermometer-high:before{content:"\F10C2"}.mdi-thermometer-lines:before{content:"\F0510"}.mdi-thermometer-low:before{content:"\F10C3"}.mdi-thermometer-minus:before{content:"\F0E04"}.mdi-thermometer-off:before{content:"\F1531"}.mdi-thermometer-plus:before{content:"\F0E05"}.mdi-thermostat:before{content:"\F0393"}.mdi-thermostat-box:before{content:"\F0891"}.mdi-thought-bubble:before{content:"\F07F6"}.mdi-thought-bubble-outline:before{content:"\F07F7"}.mdi-thumb-down:before{content:"\F0511"}.mdi-thumb-down-outline:before{content:"\F0512"}.mdi-thumb-up:before{content:"\F0513"}.mdi-thumb-up-outline:before{content:"\F0514"}.mdi-thumbs-up-down:before{content:"\F0515"}.mdi-ticket:before{content:"\F0516"}.mdi-ticket-account:before{content:"\F0517"}.mdi-ticket-confirmation:before{content:"\F0518"}.mdi-ticket-confirmation-outline:before{content:"\F13AA"}.mdi-ticket-outline:before{content:"\F0913"}.mdi-ticket-percent:before{content:"\F0724"}.mdi-ticket-percent-outline:before{content:"\F142B"}.mdi-tie:before{content:"\F0519"}.mdi-tilde:before{content:"\F0725"}.mdi-timelapse:before{content:"\F051A"}.mdi-timeline:before{content:"\F0BD1"}.mdi-timeline-alert:before{content:"\F0F95"}.mdi-timeline-alert-outline:before{content:"\F0F98"}.mdi-timeline-check:before{content:"\F1532"}.mdi-timeline-check-outline:before{content:"\F1533"}.mdi-timeline-clock:before{content:"\F11FB"}.mdi-timeline-clock-outline:before{content:"\F11FC"}.mdi-timeline-help:before{content:"\F0F99"}.mdi-timeline-help-outline:before{content:"\F0F9A"}.mdi-timeline-minus:before{content:"\F1534"}.mdi-timeline-minus-outline:before{content:"\F1535"}.mdi-timeline-outline:before{content:"\F0BD2"}.mdi-timeline-plus:before{content:"\F0F96"}.mdi-timeline-plus-outline:before{content:"\F0F97"}.mdi-timeline-remove:before{content:"\F1536"}.mdi-timeline-remove-outline:before{content:"\F1537"}.mdi-timeline-text:before{content:"\F0BD3"}.mdi-timeline-text-outline:before{content:"\F0BD4"}.mdi-timer:before{content:"\F13AB"}.mdi-timer-10:before{content:"\F051C"}.mdi-timer-3:before{content:"\F051D"}.mdi-timer-off:before{content:"\F13AC"}.mdi-timer-off-outline:before{content:"\F051E"}.mdi-timer-outline:before{content:"\F051B"}.mdi-timer-sand:before{content:"\F051F"}.mdi-timer-sand-empty:before{content:"\F06AD"}.mdi-timer-sand-full:before{content:"\F078C"}.mdi-timetable:before{content:"\F0520"}.mdi-toaster:before{content:"\F1063"}.mdi-toaster-off:before{content:"\F11B7"}.mdi-toaster-oven:before{content:"\F0CD3"}.mdi-toggle-switch:before{content:"\F0521"}.mdi-toggle-switch-off:before{content:"\F0522"}.mdi-toggle-switch-off-outline:before{content:"\F0A19"}.mdi-toggle-switch-outline:before{content:"\F0A1A"}.mdi-toilet:before{content:"\F09AB"}.mdi-toolbox:before{content:"\F09AC"}.mdi-toolbox-outline:before{content:"\F09AD"}.mdi-tools:before{content:"\F1064"}.mdi-tooltip:before{content:"\F0523"}.mdi-tooltip-account:before{content:"\F000C"}.mdi-tooltip-check:before{content:"\F155C"}.mdi-tooltip-check-outline:before{content:"\F155D"}.mdi-tooltip-edit:before{content:"\F0524"}.mdi-tooltip-edit-outline:before{content:"\F12C5"}.mdi-tooltip-image:before{content:"\F0525"}.mdi-tooltip-image-outline:before{content:"\F0BD5"}.mdi-tooltip-minus:before{content:"\F155E"}.mdi-tooltip-minus-outline:before{content:"\F155F"}.mdi-tooltip-outline:before{content:"\F0526"}.mdi-tooltip-plus:before{content:"\F0BD6"}.mdi-tooltip-plus-outline:before{content:"\F0527"}.mdi-tooltip-remove:before{content:"\F1560"}.mdi-tooltip-remove-outline:before{content:"\F1561"}.mdi-tooltip-text:before{content:"\F0528"}.mdi-tooltip-text-outline:before{content:"\F0BD7"}.mdi-tooth:before{content:"\F08C3"}.mdi-tooth-outline:before{content:"\F0529"}.mdi-toothbrush:before{content:"\F1129"}.mdi-toothbrush-electric:before{content:"\F112C"}.mdi-toothbrush-paste:before{content:"\F112A"}.mdi-torch:before{content:"\F1606"}.mdi-tortoise:before{content:"\F0D3B"}.mdi-toslink:before{content:"\F12B8"}.mdi-tournament:before{content:"\F09AE"}.mdi-tow-truck:before{content:"\F083C"}.mdi-tower-beach:before{content:"\F0681"}.mdi-tower-fire:before{content:"\F0682"}.mdi-toy-brick:before{content:"\F1288"}.mdi-toy-brick-marker:before{content:"\F1289"}.mdi-toy-brick-marker-outline:before{content:"\F128A"}.mdi-toy-brick-minus:before{content:"\F128B"}.mdi-toy-brick-minus-outline:before{content:"\F128C"}.mdi-toy-brick-outline:before{content:"\F128D"}.mdi-toy-brick-plus:before{content:"\F128E"}.mdi-toy-brick-plus-outline:before{content:"\F128F"}.mdi-toy-brick-remove:before{content:"\F1290"}.mdi-toy-brick-remove-outline:before{content:"\F1291"}.mdi-toy-brick-search:before{content:"\F1292"}.mdi-toy-brick-search-outline:before{content:"\F1293"}.mdi-track-light:before{content:"\F0914"}.mdi-trackpad:before{content:"\F07F8"}.mdi-trackpad-lock:before{content:"\F0933"}.mdi-tractor:before{content:"\F0892"}.mdi-tractor-variant:before{content:"\F14C4"}.mdi-trademark:before{content:"\F0A78"}.mdi-traffic-cone:before{content:"\F137C"}.mdi-traffic-light:before{content:"\F052B"}.mdi-train:before{content:"\F052C"}.mdi-train-car:before{content:"\F0BD8"}.mdi-train-car-passenger:before{content:"\F1733"}.mdi-train-car-passenger-door:before{content:"\F1734"}.mdi-train-car-passenger-door-open:before{content:"\F1735"}.mdi-train-car-passenger-variant:before{content:"\F1736"}.mdi-train-variant:before{content:"\F08C4"}.mdi-tram:before{content:"\F052D"}.mdi-tram-side:before{content:"\F0FE7"}.mdi-transcribe:before{content:"\F052E"}.mdi-transcribe-close:before{content:"\F052F"}.mdi-transfer:before{content:"\F1065"}.mdi-transfer-down:before{content:"\F0DA1"}.mdi-transfer-left:before{content:"\F0DA2"}.mdi-transfer-right:before{content:"\F0530"}.mdi-transfer-up:before{content:"\F0DA3"}.mdi-transit-connection:before{content:"\F0D3C"}.mdi-transit-connection-horizontal:before{content:"\F1546"}.mdi-transit-connection-variant:before{content:"\F0D3D"}.mdi-transit-detour:before{content:"\F0F8B"}.mdi-transit-skip:before{content:"\F1515"}.mdi-transit-transfer:before{content:"\F06AE"}.mdi-transition:before{content:"\F0915"}.mdi-transition-masked:before{content:"\F0916"}.mdi-translate:before{content:"\F05CA"}.mdi-translate-off:before{content:"\F0E06"}.mdi-transmission-tower:before{content:"\F0D3E"}.mdi-trash-can:before{content:"\F0A79"}.mdi-trash-can-outline:before{content:"\F0A7A"}.mdi-tray:before{content:"\F1294"}.mdi-tray-alert:before{content:"\F1295"}.mdi-tray-full:before{content:"\F1296"}.mdi-tray-minus:before{content:"\F1297"}.mdi-tray-plus:before{content:"\F1298"}.mdi-tray-remove:before{content:"\F1299"}.mdi-treasure-chest:before{content:"\F0726"}.mdi-tree:before{content:"\F0531"}.mdi-tree-outline:before{content:"\F0E69"}.mdi-trello:before{content:"\F0532"}.mdi-trending-down:before{content:"\F0533"}.mdi-trending-neutral:before{content:"\F0534"}.mdi-trending-up:before{content:"\F0535"}.mdi-triangle:before{content:"\F0536"}.mdi-triangle-outline:before{content:"\F0537"}.mdi-triangle-wave:before{content:"\F147C"}.mdi-triforce:before{content:"\F0BD9"}.mdi-trophy:before{content:"\F0538"}.mdi-trophy-award:before{content:"\F0539"}.mdi-trophy-broken:before{content:"\F0DA4"}.mdi-trophy-outline:before{content:"\F053A"}.mdi-trophy-variant:before{content:"\F053B"}.mdi-trophy-variant-outline:before{content:"\F053C"}.mdi-truck:before{content:"\F053D"}.mdi-truck-check:before{content:"\F0CD4"}.mdi-truck-check-outline:before{content:"\F129A"}.mdi-truck-delivery:before{content:"\F053E"}.mdi-truck-delivery-outline:before{content:"\F129B"}.mdi-truck-fast:before{content:"\F0788"}.mdi-truck-fast-outline:before{content:"\F129C"}.mdi-truck-outline:before{content:"\F129D"}.mdi-truck-trailer:before{content:"\F0727"}.mdi-trumpet:before{content:"\F1096"}.mdi-tshirt-crew:before{content:"\F0A7B"}.mdi-tshirt-crew-outline:before{content:"\F053F"}.mdi-tshirt-v:before{content:"\F0A7C"}.mdi-tshirt-v-outline:before{content:"\F0540"}.mdi-tumble-dryer:before{content:"\F0917"}.mdi-tumble-dryer-alert:before{content:"\F11BA"}.mdi-tumble-dryer-off:before{content:"\F11BB"}.mdi-tune:before{content:"\F062E"}.mdi-tune-variant:before{content:"\F1542"}.mdi-tune-vertical:before{content:"\F066A"}.mdi-tune-vertical-variant:before{content:"\F1543"}.mdi-turkey:before{content:"\F171B"}.mdi-turnstile:before{content:"\F0CD5"}.mdi-turnstile-outline:before{content:"\F0CD6"}.mdi-turtle:before{content:"\F0CD7"}.mdi-twitch:before{content:"\F0543"}.mdi-twitter:before{content:"\F0544"}.mdi-twitter-retweet:before{content:"\F0547"}.mdi-two-factor-authentication:before{content:"\F09AF"}.mdi-typewriter:before{content:"\F0F2D"}.mdi-ubisoft:before{content:"\F0BDA"}.mdi-ubuntu:before{content:"\F0548"}.mdi-ufo:before{content:"\F10C4"}.mdi-ufo-outline:before{content:"\F10C5"}.mdi-ultra-high-definition:before{content:"\F07F9"}.mdi-umbraco:before{content:"\F0549"}.mdi-umbrella:before{content:"\F054A"}.mdi-umbrella-closed:before{content:"\F09B0"}.mdi-umbrella-closed-outline:before{content:"\F13E2"}.mdi-umbrella-closed-variant:before{content:"\F13E1"}.mdi-umbrella-outline:before{content:"\F054B"}.mdi-undo:before{content:"\F054C"}.mdi-undo-variant:before{content:"\F054D"}.mdi-unfold-less-horizontal:before{content:"\F054E"}.mdi-unfold-less-vertical:before{content:"\F0760"}.mdi-unfold-more-horizontal:before{content:"\F054F"}.mdi-unfold-more-vertical:before{content:"\F0761"}.mdi-ungroup:before{content:"\F0550"}.mdi-unicode:before{content:"\F0ED0"}.mdi-unicorn:before{content:"\F15C2"}.mdi-unicorn-variant:before{content:"\F15C3"}.mdi-unicycle:before{content:"\F15E5"}.mdi-unity:before{content:"\F06AF"}.mdi-unreal:before{content:"\F09B1"}.mdi-untappd:before{content:"\F0551"}.mdi-update:before{content:"\F06B0"}.mdi-upload:before{content:"\F0552"}.mdi-upload-lock:before{content:"\F1373"}.mdi-upload-lock-outline:before{content:"\F1374"}.mdi-upload-multiple:before{content:"\F083D"}.mdi-upload-network:before{content:"\F06F6"}.mdi-upload-network-outline:before{content:"\F0CD8"}.mdi-upload-off:before{content:"\F10C6"}.mdi-upload-off-outline:before{content:"\F10C7"}.mdi-upload-outline:before{content:"\F0E07"}.mdi-usb:before{content:"\F0553"}.mdi-usb-flash-drive:before{content:"\F129E"}.mdi-usb-flash-drive-outline:before{content:"\F129F"}.mdi-usb-port:before{content:"\F11F0"}.mdi-valve:before{content:"\F1066"}.mdi-valve-closed:before{content:"\F1067"}.mdi-valve-open:before{content:"\F1068"}.mdi-van-passenger:before{content:"\F07FA"}.mdi-van-utility:before{content:"\F07FB"}.mdi-vanish:before{content:"\F07FC"}.mdi-vanish-quarter:before{content:"\F1554"}.mdi-vanity-light:before{content:"\F11E1"}.mdi-variable:before{content:"\F0AE7"}.mdi-variable-box:before{content:"\F1111"}.mdi-vector-arrange-above:before{content:"\F0554"}.mdi-vector-arrange-below:before{content:"\F0555"}.mdi-vector-bezier:before{content:"\F0AE8"}.mdi-vector-circle:before{content:"\F0556"}.mdi-vector-circle-variant:before{content:"\F0557"}.mdi-vector-combine:before{content:"\F0558"}.mdi-vector-curve:before{content:"\F0559"}.mdi-vector-difference:before{content:"\F055A"}.mdi-vector-difference-ab:before{content:"\F055B"}.mdi-vector-difference-ba:before{content:"\F055C"}.mdi-vector-ellipse:before{content:"\F0893"}.mdi-vector-intersection:before{content:"\F055D"}.mdi-vector-line:before{content:"\F055E"}.mdi-vector-link:before{content:"\F0FE8"}.mdi-vector-point:before{content:"\F055F"}.mdi-vector-polygon:before{content:"\F0560"}.mdi-vector-polyline:before{content:"\F0561"}.mdi-vector-polyline-edit:before{content:"\F1225"}.mdi-vector-polyline-minus:before{content:"\F1226"}.mdi-vector-polyline-plus:before{content:"\F1227"}.mdi-vector-polyline-remove:before{content:"\F1228"}.mdi-vector-radius:before{content:"\F074A"}.mdi-vector-rectangle:before{content:"\F05C6"}.mdi-vector-selection:before{content:"\F0562"}.mdi-vector-square:before{content:"\F0001"}.mdi-vector-triangle:before{content:"\F0563"}.mdi-vector-union:before{content:"\F0564"}.mdi-vhs:before{content:"\F0A1B"}.mdi-vibrate:before{content:"\F0566"}.mdi-vibrate-off:before{content:"\F0CD9"}.mdi-video:before{content:"\F0567"}.mdi-video-3d:before{content:"\F07FD"}.mdi-video-3d-off:before{content:"\F13D9"}.mdi-video-3d-variant:before{content:"\F0ED1"}.mdi-video-4k-box:before{content:"\F083E"}.mdi-video-account:before{content:"\F0919"}.mdi-video-box:before{content:"\F00FD"}.mdi-video-box-off:before{content:"\F00FE"}.mdi-video-check:before{content:"\F1069"}.mdi-video-check-outline:before{content:"\F106A"}.mdi-video-high-definition:before{content:"\F152E"}.mdi-video-image:before{content:"\F091A"}.mdi-video-input-antenna:before{content:"\F083F"}.mdi-video-input-component:before{content:"\F0840"}.mdi-video-input-hdmi:before{content:"\F0841"}.mdi-video-input-scart:before{content:"\F0F8C"}.mdi-video-input-svideo:before{content:"\F0842"}.mdi-video-minus:before{content:"\F09B2"}.mdi-video-minus-outline:before{content:"\F02BA"}.mdi-video-off:before{content:"\F0568"}.mdi-video-off-outline:before{content:"\F0BDB"}.mdi-video-outline:before{content:"\F0BDC"}.mdi-video-plus:before{content:"\F09B3"}.mdi-video-plus-outline:before{content:"\F01D3"}.mdi-video-stabilization:before{content:"\F091B"}.mdi-video-switch:before{content:"\F0569"}.mdi-video-switch-outline:before{content:"\F0790"}.mdi-video-vintage:before{content:"\F0A1C"}.mdi-video-wireless:before{content:"\F0ED2"}.mdi-video-wireless-outline:before{content:"\F0ED3"}.mdi-view-agenda:before{content:"\F056A"}.mdi-view-agenda-outline:before{content:"\F11D8"}.mdi-view-array:before{content:"\F056B"}.mdi-view-array-outline:before{content:"\F1485"}.mdi-view-carousel:before{content:"\F056C"}.mdi-view-carousel-outline:before{content:"\F1486"}.mdi-view-column:before{content:"\F056D"}.mdi-view-column-outline:before{content:"\F1487"}.mdi-view-comfy:before{content:"\F0E6A"}.mdi-view-comfy-outline:before{content:"\F1488"}.mdi-view-compact:before{content:"\F0E6B"}.mdi-view-compact-outline:before{content:"\F0E6C"}.mdi-view-dashboard:before{content:"\F056E"}.mdi-view-dashboard-outline:before{content:"\F0A1D"}.mdi-view-dashboard-variant:before{content:"\F0843"}.mdi-view-dashboard-variant-outline:before{content:"\F1489"}.mdi-view-day:before{content:"\F056F"}.mdi-view-day-outline:before{content:"\F148A"}.mdi-view-grid:before{content:"\F0570"}.mdi-view-grid-outline:before{content:"\F11D9"}.mdi-view-grid-plus:before{content:"\F0F8D"}.mdi-view-grid-plus-outline:before{content:"\F11DA"}.mdi-view-headline:before{content:"\F0571"}.mdi-view-list:before{content:"\F0572"}.mdi-view-list-outline:before{content:"\F148B"}.mdi-view-module:before{content:"\F0573"}.mdi-view-module-outline:before{content:"\F148C"}.mdi-view-parallel:before{content:"\F0728"}.mdi-view-parallel-outline:before{content:"\F148D"}.mdi-view-quilt:before{content:"\F0574"}.mdi-view-quilt-outline:before{content:"\F148E"}.mdi-view-sequential:before{content:"\F0729"}.mdi-view-sequential-outline:before{content:"\F148F"}.mdi-view-split-horizontal:before{content:"\F0BCB"}.mdi-view-split-vertical:before{content:"\F0BCC"}.mdi-view-stream:before{content:"\F0575"}.mdi-view-stream-outline:before{content:"\F1490"}.mdi-view-week:before{content:"\F0576"}.mdi-view-week-outline:before{content:"\F1491"}.mdi-vimeo:before{content:"\F0577"}.mdi-violin:before{content:"\F060F"}.mdi-virtual-reality:before{content:"\F0894"}.mdi-virus:before{content:"\F13B6"}.mdi-virus-outline:before{content:"\F13B7"}.mdi-vk:before{content:"\F0579"}.mdi-vlc:before{content:"\F057C"}.mdi-voice-off:before{content:"\F0ED4"}.mdi-voicemail:before{content:"\F057D"}.mdi-volleyball:before{content:"\F09B4"}.mdi-volume-high:before{content:"\F057E"}.mdi-volume-low:before{content:"\F057F"}.mdi-volume-medium:before{content:"\F0580"}.mdi-volume-minus:before{content:"\F075E"}.mdi-volume-mute:before{content:"\F075F"}.mdi-volume-off:before{content:"\F0581"}.mdi-volume-plus:before{content:"\F075D"}.mdi-volume-source:before{content:"\F1120"}.mdi-volume-variant-off:before{content:"\F0E08"}.mdi-volume-vibrate:before{content:"\F1121"}.mdi-vote:before{content:"\F0A1F"}.mdi-vote-outline:before{content:"\F0A20"}.mdi-vpn:before{content:"\F0582"}.mdi-vuejs:before{content:"\F0844"}.mdi-vuetify:before{content:"\F0E6D"}.mdi-walk:before{content:"\F0583"}.mdi-wall:before{content:"\F07FE"}.mdi-wall-sconce:before{content:"\F091C"}.mdi-wall-sconce-flat:before{content:"\F091D"}.mdi-wall-sconce-flat-variant:before{content:"\F041C"}.mdi-wall-sconce-round:before{content:"\F0748"}.mdi-wall-sconce-round-variant:before{content:"\F091E"}.mdi-wallet:before{content:"\F0584"}.mdi-wallet-giftcard:before{content:"\F0585"}.mdi-wallet-membership:before{content:"\F0586"}.mdi-wallet-outline:before{content:"\F0BDD"}.mdi-wallet-plus:before{content:"\F0F8E"}.mdi-wallet-plus-outline:before{content:"\F0F8F"}.mdi-wallet-travel:before{content:"\F0587"}.mdi-wallpaper:before{content:"\F0E09"}.mdi-wan:before{content:"\F0588"}.mdi-wardrobe:before{content:"\F0F90"}.mdi-wardrobe-outline:before{content:"\F0F91"}.mdi-warehouse:before{content:"\F0F81"}.mdi-washing-machine:before{content:"\F072A"}.mdi-washing-machine-alert:before{content:"\F11BC"}.mdi-washing-machine-off:before{content:"\F11BD"}.mdi-watch:before{content:"\F0589"}.mdi-watch-export:before{content:"\F058A"}.mdi-watch-export-variant:before{content:"\F0895"}.mdi-watch-import:before{content:"\F058B"}.mdi-watch-import-variant:before{content:"\F0896"}.mdi-watch-variant:before{content:"\F0897"}.mdi-watch-vibrate:before{content:"\F06B1"}.mdi-watch-vibrate-off:before{content:"\F0CDA"}.mdi-water:before{content:"\F058C"}.mdi-water-alert:before{content:"\F1502"}.mdi-water-alert-outline:before{content:"\F1503"}.mdi-water-boiler:before{content:"\F0F92"}.mdi-water-boiler-alert:before{content:"\F11B3"}.mdi-water-boiler-off:before{content:"\F11B4"}.mdi-water-check:before{content:"\F1504"}.mdi-water-check-outline:before{content:"\F1505"}.mdi-water-minus:before{content:"\F1506"}.mdi-water-minus-outline:before{content:"\F1507"}.mdi-water-off:before{content:"\F058D"}.mdi-water-off-outline:before{content:"\F1508"}.mdi-water-outline:before{content:"\F0E0A"}.mdi-water-percent:before{content:"\F058E"}.mdi-water-percent-alert:before{content:"\F1509"}.mdi-water-plus:before{content:"\F150A"}.mdi-water-plus-outline:before{content:"\F150B"}.mdi-water-polo:before{content:"\F12A0"}.mdi-water-pump:before{content:"\F058F"}.mdi-water-pump-off:before{content:"\F0F93"}.mdi-water-remove:before{content:"\F150C"}.mdi-water-remove-outline:before{content:"\F150D"}.mdi-water-well:before{content:"\F106B"}.mdi-water-well-outline:before{content:"\F106C"}.mdi-watering-can:before{content:"\F1481"}.mdi-watering-can-outline:before{content:"\F1482"}.mdi-watermark:before{content:"\F0612"}.mdi-wave:before{content:"\F0F2E"}.mdi-waveform:before{content:"\F147D"}.mdi-waves:before{content:"\F078D"}.mdi-waze:before{content:"\F0BDE"}.mdi-weather-cloudy:before{content:"\F0590"}.mdi-weather-cloudy-alert:before{content:"\F0F2F"}.mdi-weather-cloudy-arrow-right:before{content:"\F0E6E"}.mdi-weather-fog:before{content:"\F0591"}.mdi-weather-hail:before{content:"\F0592"}.mdi-weather-hazy:before{content:"\F0F30"}.mdi-weather-hurricane:before{content:"\F0898"}.mdi-weather-lightning:before{content:"\F0593"}.mdi-weather-lightning-rainy:before{content:"\F067E"}.mdi-weather-night:before{content:"\F0594"}.mdi-weather-night-partly-cloudy:before{content:"\F0F31"}.mdi-weather-partly-cloudy:before{content:"\F0595"}.mdi-weather-partly-lightning:before{content:"\F0F32"}.mdi-weather-partly-rainy:before{content:"\F0F33"}.mdi-weather-partly-snowy:before{content:"\F0F34"}.mdi-weather-partly-snowy-rainy:before{content:"\F0F35"}.mdi-weather-pouring:before{content:"\F0596"}.mdi-weather-rainy:before{content:"\F0597"}.mdi-weather-snowy:before{content:"\F0598"}.mdi-weather-snowy-heavy:before{content:"\F0F36"}.mdi-weather-snowy-rainy:before{content:"\F067F"}.mdi-weather-sunny:before{content:"\F0599"}.mdi-weather-sunny-alert:before{content:"\F0F37"}.mdi-weather-sunny-off:before{content:"\F14E4"}.mdi-weather-sunset:before{content:"\F059A"}.mdi-weather-sunset-down:before{content:"\F059B"}.mdi-weather-sunset-up:before{content:"\F059C"}.mdi-weather-tornado:before{content:"\F0F38"}.mdi-weather-windy:before{content:"\F059D"}.mdi-weather-windy-variant:before{content:"\F059E"}.mdi-web:before{content:"\F059F"}.mdi-web-box:before{content:"\F0F94"}.mdi-web-clock:before{content:"\F124A"}.mdi-webcam:before{content:"\F05A0"}.mdi-webcam-off:before{content:"\F1737"}.mdi-webhook:before{content:"\F062F"}.mdi-webpack:before{content:"\F072B"}.mdi-webrtc:before{content:"\F1248"}.mdi-wechat:before{content:"\F0611"}.mdi-weight:before{content:"\F05A1"}.mdi-weight-gram:before{content:"\F0D3F"}.mdi-weight-kilogram:before{content:"\F05A2"}.mdi-weight-lifter:before{content:"\F115D"}.mdi-weight-pound:before{content:"\F09B5"}.mdi-whatsapp:before{content:"\F05A3"}.mdi-wheel-barrow:before{content:"\F14F2"}.mdi-wheelchair-accessibility:before{content:"\F05A4"}.mdi-whistle:before{content:"\F09B6"}.mdi-whistle-outline:before{content:"\F12BC"}.mdi-white-balance-auto:before{content:"\F05A5"}.mdi-white-balance-incandescent:before{content:"\F05A6"}.mdi-white-balance-iridescent:before{content:"\F05A7"}.mdi-white-balance-sunny:before{content:"\F05A8"}.mdi-widgets:before{content:"\F072C"}.mdi-widgets-outline:before{content:"\F1355"}.mdi-wifi:before{content:"\F05A9"}.mdi-wifi-alert:before{content:"\F16B5"}.mdi-wifi-arrow-down:before{content:"\F16B6"}.mdi-wifi-arrow-left:before{content:"\F16B7"}.mdi-wifi-arrow-left-right:before{content:"\F16B8"}.mdi-wifi-arrow-right:before{content:"\F16B9"}.mdi-wifi-arrow-up:before{content:"\F16BA"}.mdi-wifi-arrow-up-down:before{content:"\F16BB"}.mdi-wifi-cancel:before{content:"\F16BC"}.mdi-wifi-check:before{content:"\F16BD"}.mdi-wifi-cog:before{content:"\F16BE"}.mdi-wifi-lock:before{content:"\F16BF"}.mdi-wifi-lock-open:before{content:"\F16C0"}.mdi-wifi-marker:before{content:"\F16C1"}.mdi-wifi-minus:before{content:"\F16C2"}.mdi-wifi-off:before{content:"\F05AA"}.mdi-wifi-plus:before{content:"\F16C3"}.mdi-wifi-refresh:before{content:"\F16C4"}.mdi-wifi-remove:before{content:"\F16C5"}.mdi-wifi-settings:before{content:"\F16C6"}.mdi-wifi-star:before{content:"\F0E0B"}.mdi-wifi-strength-1:before{content:"\F091F"}.mdi-wifi-strength-1-alert:before{content:"\F0920"}.mdi-wifi-strength-1-lock:before{content:"\F0921"}.mdi-wifi-strength-1-lock-open:before{content:"\F16CB"}.mdi-wifi-strength-2:before{content:"\F0922"}.mdi-wifi-strength-2-alert:before{content:"\F0923"}.mdi-wifi-strength-2-lock:before{content:"\F0924"}.mdi-wifi-strength-2-lock-open:before{content:"\F16CC"}.mdi-wifi-strength-3:before{content:"\F0925"}.mdi-wifi-strength-3-alert:before{content:"\F0926"}.mdi-wifi-strength-3-lock:before{content:"\F0927"}.mdi-wifi-strength-3-lock-open:before{content:"\F16CD"}.mdi-wifi-strength-4:before{content:"\F0928"}.mdi-wifi-strength-4-alert:before{content:"\F0929"}.mdi-wifi-strength-4-lock:before{content:"\F092A"}.mdi-wifi-strength-4-lock-open:before{content:"\F16CE"}.mdi-wifi-strength-alert-outline:before{content:"\F092B"}.mdi-wifi-strength-lock-open-outline:before{content:"\F16CF"}.mdi-wifi-strength-lock-outline:before{content:"\F092C"}.mdi-wifi-strength-off:before{content:"\F092D"}.mdi-wifi-strength-off-outline:before{content:"\F092E"}.mdi-wifi-strength-outline:before{content:"\F092F"}.mdi-wifi-sync:before{content:"\F16C7"}.mdi-wikipedia:before{content:"\F05AC"}.mdi-wind-turbine:before{content:"\F0DA5"}.mdi-window-close:before{content:"\F05AD"}.mdi-window-closed:before{content:"\F05AE"}.mdi-window-closed-variant:before{content:"\F11DB"}.mdi-window-maximize:before{content:"\F05AF"}.mdi-window-minimize:before{content:"\F05B0"}.mdi-window-open:before{content:"\F05B1"}.mdi-window-open-variant:before{content:"\F11DC"}.mdi-window-restore:before{content:"\F05B2"}.mdi-window-shutter:before{content:"\F111C"}.mdi-window-shutter-alert:before{content:"\F111D"}.mdi-window-shutter-open:before{content:"\F111E"}.mdi-windsock:before{content:"\F15FA"}.mdi-wiper:before{content:"\F0AE9"}.mdi-wiper-wash:before{content:"\F0DA6"}.mdi-wizard-hat:before{content:"\F1477"}.mdi-wordpress:before{content:"\F05B4"}.mdi-wrap:before{content:"\F05B6"}.mdi-wrap-disabled:before{content:"\F0BDF"}.mdi-wrench:before{content:"\F05B7"}.mdi-wrench-outline:before{content:"\F0BE0"}.mdi-xamarin:before{content:"\F0845"}.mdi-xamarin-outline:before{content:"\F0846"}.mdi-xing:before{content:"\F05BE"}.mdi-xml:before{content:"\F05C0"}.mdi-xmpp:before{content:"\F07FF"}.mdi-y-combinator:before{content:"\F0624"}.mdi-yahoo:before{content:"\F0B4F"}.mdi-yeast:before{content:"\F05C1"}.mdi-yin-yang:before{content:"\F0680"}.mdi-yoga:before{content:"\F117C"}.mdi-youtube:before{content:"\F05C3"}.mdi-youtube-gaming:before{content:"\F0848"}.mdi-youtube-studio:before{content:"\F0847"}.mdi-youtube-subscription:before{content:"\F0D40"}.mdi-youtube-tv:before{content:"\F0448"}.mdi-yurt:before{content:"\F1516"}.mdi-z-wave:before{content:"\F0AEA"}.mdi-zend:before{content:"\F0AEB"}.mdi-zigbee:before{content:"\F0D41"}.mdi-zip-box:before{content:"\F05C4"}.mdi-zip-box-outline:before{content:"\F0FFA"}.mdi-zip-disk:before{content:"\F0A23"}.mdi-zodiac-aquarius:before{content:"\F0A7D"}.mdi-zodiac-aries:before{content:"\F0A7E"}.mdi-zodiac-cancer:before{content:"\F0A7F"}.mdi-zodiac-capricorn:before{content:"\F0A80"}.mdi-zodiac-gemini:before{content:"\F0A81"}.mdi-zodiac-leo:before{content:"\F0A82"}.mdi-zodiac-libra:before{content:"\F0A83"}.mdi-zodiac-pisces:before{content:"\F0A84"}.mdi-zodiac-sagittarius:before{content:"\F0A85"}.mdi-zodiac-scorpio:before{content:"\F0A86"}.mdi-zodiac-taurus:before{content:"\F0A87"}.mdi-zodiac-virgo:before{content:"\F0A88"}.mdi-blank:before{content:"\F68C";visibility:hidden}.mdi-18px.mdi-set,.mdi-18px.mdi:before{font-size:18px}.mdi-24px.mdi-set,.mdi-24px.mdi:before{font-size:24px}.mdi-36px.mdi-set,.mdi-36px.mdi:before{font-size:36px}.mdi-48px.mdi-set,.mdi-48px.mdi:before{font-size:48px}.mdi-dark:before{color:rgba(0,0,0,.54)}.mdi-dark.mdi-inactive:before{color:rgba(0,0,0,.26)}.mdi-light:before{color:#fff}.mdi-light.mdi-inactive:before{color:hsla(0,0%,100%,.3)}.mdi-rotate-45:before{-webkit-transform:rotate(45deg);transform:rotate(45deg)}.mdi-rotate-90:before{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.mdi-rotate-135:before{-webkit-transform:rotate(135deg);transform:rotate(135deg)}.mdi-rotate-180:before{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.mdi-rotate-225:before{-webkit-transform:rotate(225deg);transform:rotate(225deg)}.mdi-rotate-270:before{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.mdi-rotate-315:before{-webkit-transform:rotate(315deg);transform:rotate(315deg)}.mdi-flip-h:before{-webkit-transform:scaleX(-1);transform:scaleX(-1);-webkit-filter:FlipH;filter:FlipH;-ms-filter:"FlipH"}.mdi-flip-v:before{-webkit-transform:scaleY(-1);transform:scaleY(-1);-webkit-filter:FlipV;filter:FlipV;-ms-filter:"FlipV"}.mdi-spin:before{-webkit-animation:mdi-spin 2s linear infinite;animation:mdi-spin 2s linear infinite}@-webkit-keyframes mdi-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes mdi-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}} \ No newline at end of file diff --git a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-Black.313a6563.woff b/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-Black.313a6563.woff deleted file mode 100644 index b1ddac3..0000000 Binary files a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-Black.313a6563.woff and /dev/null differ diff --git a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-Black.59eb3601.woff2 b/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-Black.59eb3601.woff2 deleted file mode 100644 index 41186d0..0000000 Binary files a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-Black.59eb3601.woff2 and /dev/null differ diff --git a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-BlackItalic.cc2fadc3.woff b/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-BlackItalic.cc2fadc3.woff deleted file mode 100644 index b97efea..0000000 Binary files a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-BlackItalic.cc2fadc3.woff and /dev/null differ diff --git a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-BlackItalic.f75569f8.woff2 b/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-BlackItalic.f75569f8.woff2 deleted file mode 100644 index df3c3f4..0000000 Binary files a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-BlackItalic.f75569f8.woff2 and /dev/null differ diff --git a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-Bold.50d75e48.woff b/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-Bold.50d75e48.woff deleted file mode 100644 index 6e0f562..0000000 Binary files a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-Bold.50d75e48.woff and /dev/null differ diff --git a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-Bold.b52fac2b.woff2 b/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-Bold.b52fac2b.woff2 deleted file mode 100644 index 76817cc..0000000 Binary files a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-Bold.b52fac2b.woff2 and /dev/null differ diff --git a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-BoldItalic.4fe0f73c.woff b/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-BoldItalic.4fe0f73c.woff deleted file mode 100644 index ea90d71..0000000 Binary files a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-BoldItalic.4fe0f73c.woff and /dev/null differ diff --git a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-BoldItalic.94008e69.woff2 b/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-BoldItalic.94008e69.woff2 deleted file mode 100644 index 45c9ef7..0000000 Binary files a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-BoldItalic.94008e69.woff2 and /dev/null differ diff --git a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-Light.c73eb1ce.woff b/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-Light.c73eb1ce.woff deleted file mode 100644 index b9e9918..0000000 Binary files a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-Light.c73eb1ce.woff and /dev/null differ diff --git a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-Light.d26871e8.woff2 b/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-Light.d26871e8.woff2 deleted file mode 100644 index ddbf4a9..0000000 Binary files a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-Light.d26871e8.woff2 and /dev/null differ diff --git a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-LightItalic.13efe6cb.woff b/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-LightItalic.13efe6cb.woff deleted file mode 100644 index 329ec9b..0000000 Binary files a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-LightItalic.13efe6cb.woff and /dev/null differ diff --git a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-LightItalic.e8eaae90.woff2 b/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-LightItalic.e8eaae90.woff2 deleted file mode 100644 index ba70c2a..0000000 Binary files a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-LightItalic.e8eaae90.woff2 and /dev/null differ diff --git a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-Medium.1d659482.woff b/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-Medium.1d659482.woff deleted file mode 100644 index 005e928..0000000 Binary files a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-Medium.1d659482.woff and /dev/null differ diff --git a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-Medium.90d16760.woff2 b/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-Medium.90d16760.woff2 deleted file mode 100644 index 6a88805..0000000 Binary files a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-Medium.90d16760.woff2 and /dev/null differ diff --git a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-MediumItalic.13ec0eb5.woff2 b/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-MediumItalic.13ec0eb5.woff2 deleted file mode 100644 index cf21729..0000000 Binary files a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-MediumItalic.13ec0eb5.woff2 and /dev/null differ diff --git a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-MediumItalic.83e114c3.woff b/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-MediumItalic.83e114c3.woff deleted file mode 100644 index 01eba14..0000000 Binary files a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-MediumItalic.83e114c3.woff and /dev/null differ diff --git a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-Regular.35b07eb2.woff b/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-Regular.35b07eb2.woff deleted file mode 100644 index 96c1986..0000000 Binary files a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-Regular.35b07eb2.woff and /dev/null differ diff --git a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-Regular.73f0a88b.woff2 b/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-Regular.73f0a88b.woff2 deleted file mode 100644 index 9a0064e..0000000 Binary files a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-Regular.73f0a88b.woff2 and /dev/null differ diff --git a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-RegularItalic.4357beb8.woff2 b/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-RegularItalic.4357beb8.woff2 deleted file mode 100644 index e7f173b..0000000 Binary files a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-RegularItalic.4357beb8.woff2 and /dev/null differ diff --git a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-RegularItalic.f5902d5e.woff b/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-RegularItalic.f5902d5e.woff deleted file mode 100644 index 818233d..0000000 Binary files a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-RegularItalic.f5902d5e.woff and /dev/null differ diff --git a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-Thin.ad538a69.woff2 b/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-Thin.ad538a69.woff2 deleted file mode 100644 index 2fb9b5f..0000000 Binary files a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-Thin.ad538a69.woff2 and /dev/null differ diff --git a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-Thin.d3b47375.woff b/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-Thin.d3b47375.woff deleted file mode 100644 index e1cee8f..0000000 Binary files a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-Thin.d3b47375.woff and /dev/null differ diff --git a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-ThinItalic.5b4a33e1.woff2 b/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-ThinItalic.5b4a33e1.woff2 deleted file mode 100644 index 67c4240..0000000 Binary files a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-ThinItalic.5b4a33e1.woff2 and /dev/null differ diff --git a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-ThinItalic.8a96edbb.woff b/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-ThinItalic.8a96edbb.woff deleted file mode 100644 index d337378..0000000 Binary files a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/Roboto-ThinItalic.8a96edbb.woff and /dev/null differ diff --git a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/materialdesignicons-webfont.147e3378.woff b/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/materialdesignicons-webfont.147e3378.woff deleted file mode 100644 index a5ee623..0000000 Binary files a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/materialdesignicons-webfont.147e3378.woff and /dev/null differ diff --git a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/materialdesignicons-webfont.7a44ea19.woff2 b/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/materialdesignicons-webfont.7a44ea19.woff2 deleted file mode 100644 index 384ae57..0000000 Binary files a/config/qbittorrent/webui/qb-web-nightly/dist/public/fonts/materialdesignicons-webfont.7a44ea19.woff2 and /dev/null differ diff --git a/config/qbittorrent/webui/qb-web-nightly/dist/public/img/icons/apple-touch-icon.png b/config/qbittorrent/webui/qb-web-nightly/dist/public/img/icons/apple-touch-icon.png deleted file mode 100644 index 0929fef..0000000 Binary files a/config/qbittorrent/webui/qb-web-nightly/dist/public/img/icons/apple-touch-icon.png and /dev/null differ diff --git a/config/qbittorrent/webui/qb-web-nightly/dist/public/img/icons/favicon-16x16.png b/config/qbittorrent/webui/qb-web-nightly/dist/public/img/icons/favicon-16x16.png deleted file mode 100644 index c879869..0000000 Binary files a/config/qbittorrent/webui/qb-web-nightly/dist/public/img/icons/favicon-16x16.png and /dev/null differ diff --git a/config/qbittorrent/webui/qb-web-nightly/dist/public/img/icons/favicon-192x192.png b/config/qbittorrent/webui/qb-web-nightly/dist/public/img/icons/favicon-192x192.png deleted file mode 100644 index 44eb9d7..0000000 Binary files a/config/qbittorrent/webui/qb-web-nightly/dist/public/img/icons/favicon-192x192.png and /dev/null differ diff --git a/config/qbittorrent/webui/qb-web-nightly/dist/public/img/icons/favicon-32x32.png b/config/qbittorrent/webui/qb-web-nightly/dist/public/img/icons/favicon-32x32.png deleted file mode 100644 index e3e2c32..0000000 Binary files a/config/qbittorrent/webui/qb-web-nightly/dist/public/img/icons/favicon-32x32.png and /dev/null differ diff --git a/config/qbittorrent/webui/qb-web-nightly/dist/public/img/keepfrds.e602522e.png b/config/qbittorrent/webui/qb-web-nightly/dist/public/img/keepfrds.e602522e.png deleted file mode 100644 index d4bb088..0000000 Binary files a/config/qbittorrent/webui/qb-web-nightly/dist/public/img/keepfrds.e602522e.png and /dev/null differ diff --git a/config/qbittorrent/webui/qb-web-nightly/dist/public/index.html b/config/qbittorrent/webui/qb-web-nightly/dist/public/index.html deleted file mode 100644 index 2d1ba4b..0000000 --- a/config/qbittorrent/webui/qb-web-nightly/dist/public/index.html +++ /dev/null @@ -1 +0,0 @@ -qBittorrent Web UI
    \ No newline at end of file diff --git a/config/qbittorrent/webui/qb-web-nightly/dist/public/js/app.36412398.js b/config/qbittorrent/webui/qb-web-nightly/dist/public/js/app.36412398.js deleted file mode 100644 index c3aa947..0000000 --- a/config/qbittorrent/webui/qb-web-nightly/dist/public/js/app.36412398.js +++ /dev/null @@ -1,2 +0,0 @@ -(function(e){function t(t){for(var a,i,o=t[0],c=t[1],l=t[2],d=0,p=[];d1&&void 0!==arguments[1]?arguments[1]:"",a={url:t,path:n},r=new URLSearchParams(a);return this.axios.post("/rss/addFeed",r).then(e.handleResponse)}},{key:"removeRssFeed",value:function(t){var n={path:t},a=new URLSearchParams(n);return this.axios.post("/rss/removeItem",a).then(e.handleResponse)}},{key:"refreshRssFeed",value:function(t){var n={itemPath:t},a=new URLSearchParams(n);return this.axios.post("/rss/refreshItem",a).then(e.handleResponse)}},{key:"moveRssFeed",value:function(t,n){var a={itemPath:t,destPath:n},r=new URLSearchParams(a);return this.axios.post("/rss/moveItem",r).then(e.handleResponse)}},{key:"getRssRules",value:function(){return this.axios.get("/rss/rules").then(e.handleResponse)}},{key:"setRssRule",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a={ruleName:t,ruleDef:JSON.stringify(n)},r=new URLSearchParams(a);return this.axios.post("/rss/setRule",r).then(e.handleResponse)}},{key:"removeRssRule",value:function(t){var n={ruleName:t},a=new URLSearchParams(n);return this.axios.post("/rss/removeRule",a).then(e.handleResponse)}},{key:"updateSearchPlugins",value:function(){return this.axios.post("/search/updatePlugins").then(e.handleResponse)}},{key:"getSearchPlugins",value:function(){return this.axios.get("/search/plugins").then(e.handleResponse)}},{key:"getSearchCategories",value:function(){return this.axios.get("/torrents/categories").then(e.handleResponse)}},{key:"startSearch",value:function(t,n,a){var r=new URLSearchParams({pattern:t||"",category:a||"all",plugins:n||"all"});return this.axios.post("/search/start",r).then(e.handleResponse)}},{key:"stopSearch",value:function(t){var n=new URLSearchParams({id:t.toString()});return this.axios.post("/search/stop",n).then(e.handleResponse)}},{key:"getSearchResults",value:function(t){return this.axios.get("/search/results?id=".concat(t)).then(e.handleResponse)}},{key:"enablePlugin",value:function(t,n){var a=new URLSearchParams({names:t.name,enable:JSON.stringify(n)});return this.axios.post("/search/enablePlugin",a).then(e.handleResponse)}},{key:"actionTorrent",value:function(t,n,a){var r=Object(X["a"])({hash:n},a),s=new URLSearchParams(r);return this.axios.post("/torrents/".concat(t),s).then(e.handleResponse)}},{key:"actionTorrents",value:function(t,n,a){var r=Object(X["a"])({hashes:n.join("|")},a),s=new URLSearchParams(r);return this.axios.post("/torrents/".concat(t),s).then(e.handleResponse)}}],[{key:"handleResponse",value:function(e){return e.data}}]),e}(),se=new re,ie=se,oe={state:{searchPlugins:[],isPluginManagerOpen:!1},mutations:{setSearchPlugins:function(e,t){e.searchPlugins=t},openPluginManager:function(e){e.isPluginManagerOpen=!0},closePluginManager:function(e){e.isPluginManagerOpen=!1}},getters:{allSearchPlugins:function(e){return e.searchPlugins}},actions:{fetchSearchPlugins:function(e){var t=e.dispatch;t("getSearchPluginsRequest")},getSearchPluginsRequest:function(e){return Object(B["a"])(regeneratorRuntime.mark((function t(){var n,a;return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:return n=e.dispatch,t.prev=1,t.next=4,ie.getSearchPlugins();case 4:a=t.sent,n("getSearchPluginRequestSuccess",a),t.next=11;break;case 8:t.prev=8,t.t0=t["catch"](1),n("getSearchPluginsRequestFailure");case 11:case"end":return t.stop()}}),t,null,[[1,8]])})))()},getSearchPluginRequestSuccess:function(e,t){var n=e.commit;n("setSearchPlugins",void 0),n("setSearchPlugins",t)},getSearchPluginRequestFailure:function(e){var t=e.commit;t("setSearchPlugins",null)},togglePluginAvailability:function(e,t){var n=e.dispatch;n("togglePluginEnableRequest",t)},togglePluginEnableRequest:function(e,t){return Object(B["a"])(regeneratorRuntime.mark((function n(){var a;return regeneratorRuntime.wrap((function(n){while(1)switch(n.prev=n.next){case 0:return a=e.dispatch,n.prev=1,n.next=4,ie.enablePlugin(t,!t.enabled);case 4:a("enablePluginRequestSuccess",t),n.next=9;break;case 7:n.prev=7,n.t0=n["catch"](1);case 9:case"end":return n.stop()}}),n,null,[[1,7]])})))()},enablePluginRequestSuccess:function(e){var t=e.dispatch;t("fetchSearchPlugins")},updatePluginsRequest:function(e){return Object(B["a"])(regeneratorRuntime.mark((function t(){var n;return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:return n=e.dispatch,t.prev=1,t.next=4,ie.updateSearchPlugins();case 4:n("updatePluginsRequestSuccess"),t.next=10;break;case 7:t.prev=7,t.t0=t["catch"](1),n("updatePluginsRequestFailure");case 10:case"end":return t.stop()}}),t,null,[[1,7]])})))()},updatePluginsRequestSuccess:function(e){return Object(B["a"])(regeneratorRuntime.mark((function t(){var n;return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:return n=e.dispatch,t.next=3,n("getSearchPluginsRequest");case 3:case"end":return t.stop()}}),t)})))()},updatePluginsRequestFailure:function(){}}},ce=function e(t,n,r,s){if(Object(h["isPlainObject"])(t)&&(null==r||r in t)){var i=null==r?t:t[r];if(null!=i&&Object(h["isPlainObject"])(n)){for(var o in n)e(i,n[o],o,s);return}}return s&&null===n||a["default"].set(t,r,n),t},le=ce;a["default"].use(U["a"]);var ue=new U["a"].Store({modules:{config:b,dialog:E,snackBar:F,addForm:z,searchEngine:oe},state:{rid:0,mainData:void 0,preferences:null,pasteUrl:null,needAuth:!1},mutations:{updateMainData:function(e,t){if(e.rid=t.rid,delete t.rid,t.full_update)delete t.full_update,e.mainData=t;else{var n=e.mainData;if(t.torrents_removed){var r,s=Object(i["a"])(t.torrents_removed);try{for(s.s();!(r=s.n()).done;){var o=r.value;a["default"].delete(n.torrents,o)}}catch(h){s.e(h)}finally{s.f()}delete t.torrents_removed}if(t.categories_removed){var c,l=Object(i["a"])(t.categories_removed);try{for(l.s();!(c=l.n()).done;){var u=c.value;a["default"].delete(n,u)}}catch(h){l.e(h)}finally{l.f()}delete t.categories_removed}if(t.tags_removed){var d,p=Object(i["a"])(t.tags_removed);try{for(p.s();!(d=p.n()).done;){var f=d.value;a["default"].delete(n,f)}}catch(h){p.e(h)}finally{p.f()}delete t.categories_removed}le(n,t)}},updatePreferences:function(e,t){e.preferences=t},setPasteUrl:function(e,t){var n=t.url;e.pasteUrl=n},updateNeedAuth:function(e,t){e.needAuth=t}},getters:{allPreferences:function(e){return e.preferences},savePath:function(e){return e.preferences["save_path"]},isDataReady:function(e){return!!e.mainData},allTorrents:function(e){return e.mainData?Object(h["map"])(e.mainData.torrents,(function(e,t){return Object(h["merge"])({},e,{hash:t})})):[]},allCategories:function(e){if(!e.mainData)return[];var t=Object(h["map"])(e.mainData.categories,(function(e,t){return Object(h["merge"])({},e,{key:t})}));return Object(h["sortBy"])(t,"name")},allTags:function(e){if(!e.mainData)return[];var t,n=[],a=Object(i["a"])(e.mainData.tags);try{for(a.s();!(t=a.n()).done;){var r=t.value;n.push({key:r,name:r})}}catch(s){a.e(s)}finally{a.f()}return Object(h["sortBy"])(n,"name")},torrentGroupByCategory:function(e,t){return Object(h["groupBy"])(t.allTorrents,(function(e){return e.category}))},torrentGroupByTag:function(e,t){var n,a={},r=Object(i["a"])(t.allTorrents);try{var s=function(){var e=n.value,t=e.tags.split(",");t.forEach((function(t){var n=a[t];n||(n=[],a[t]=n),n.push(e)}))};for(r.s();!(n=r.n()).done;)s()}catch(o){r.e(o)}finally{r.f()}return a},torrentGroupBySite:function(e,t){return Object(h["groupBy"])(t.allTorrents,(function(e){if(!e.tracker)return"";var t=new URL(e.tracker);return t.hostname}))},torrentGroupByState:function(e,t){var n,a={},r=function(e,t){var n=a[e];n||(n=[],a[e]=n),n.push(t)},s=Object(i["a"])(t.allTorrents);try{for(s.s();!(n=s.n()).done;){var o,c=n.value,l=Object(i["a"])(q);try{for(l.s();!(o=l.n()).done;){var u=o.value;K(u,c.state)&&r(u,c)}}catch(d){l.e(d)}finally{l.f()}}}catch(d){s.e(d)}finally{s.f()}return a}},actions:{updatePreferencesRequest:function(e,t){return Object(B["a"])(regeneratorRuntime.mark((function n(){var a,r;return regeneratorRuntime.wrap((function(n){while(1)switch(n.prev=n.next){case 0:return a=e.dispatch,n.prev=1,n.next=4,ie.setPreferences(t);case 4:return n.next=6,ie.getAppPreferences();case 6:r=n.sent,a("updatePreferencesRequestSuccess",r.data),n.next=13;break;case 10:n.prev=10,n.t0=n["catch"](1),a("updatePreferencesRequestFailure");case 13:case"end":return n.stop()}}),n,null,[[1,10]])})))()},updatePreferencesRequestSuccess:function(e,t){var n=e.commit;n("updatePreferences",t)},updatePreferencesRequestFailure:function(){alert("Preferences failed to update")}}}),de=ue;function pe(){return ue}function fe(e,t){var n={};return e.forEach((function(e){var a=t?"".concat(t,"/").concat(e):e;n[e]=function(){for(var e=arguments.length,t=new Array(e),n=0;n=n?e.toString():e>=1?e>=n-1?n.toString():e.toPrecision(t):e.toFixed(t-1)}function _e(e){var t="KMGTP",n=e?Math.floor(Math.log2(e)/10):0;e/=Math.pow(1024,n),e>=999&&(e/=1024,n++);var a=0===n?"B":"".concat(t[n-1],"iB");return 0===n?"".concat(e," ").concat(a):"".concat(ge(e,3)," ").concat(a)}function be(e,t){var n=60,a=60*n,r=24*a,s=365*r,i=[s,r,a,n,1],o="ydhms",c=0,l=0,u=[],d={maxUnitSize:2,dayLimit:0,minUnit:0},p=t?Object.assign(d,t):d;if(p.dayLimit&&e>=p.dayLimit*r)return"∞";while((!p.maxUnitSize||l!==p.maxUnitSize)&&c!==i.length){var f=i[c];if(e5},on:{click:function(t){return e.showInfo()}}},[n("v-icon",[e._v("mdi-alert-circle")])],1),n("v-menu",{attrs:{"offset-y":""},scopedSlots:e._u([{key:"activator",fn:function(t){var a=t.on;return[n("v-btn",e._g({attrs:{icon:"",title:e.$t("title.set_category"),disabled:!e.hasSelected}},a),[n("v-icon",[e._v("mdi-folder-star")])],1)]}}])},[n("v-list",{staticClass:"category-actions"},[n("v-subheader",{on:{click:function(e){e.stopPropagation()}}},[e._v(" "+e._s(e.$t("title.set_category"))+" ")]),e._l(e.allCategories,(function(t,a){return n("v-list-item",{key:a,on:{click:function(n){return e.setTorrentsCategory(t.key)}}},[n("v-list-item-action",[n("v-icon",[e._v("mdi-folder")])],1),n("v-list-item-content",[n("v-list-item-title",[e._v(" "+e._s(t.name)+" ")])],1)],1)})),n("v-divider"),n("v-list-item",{on:{click:function(t){return e.setTorrentsCategory("")}}},[n("v-list-item-action",[n("v-icon",[e._v("mdi-folder-remove")])],1),n("v-list-item-content",[n("v-list-item-title",[e._v(" "+e._s(e.$t("reset"))+" ")])],1)],1)],2)],1),e.$vuetify.breakpoint.xsOnly?e._e():[n("v-divider",{attrs:{vertical:"",inset:""}}),n("v-btn",{attrs:{icon:"",title:e.$t("toggle_sequential"),disabled:!e.hasSelected},on:{click:e.toggleSequentialTorrents}},[n("v-icon",[e._v("mdi-transit-connection-variant")])],1),n("v-btn",{attrs:{icon:"",title:e.$t("title.set_location"),disabled:0===e.selectedRows.length},on:{click:e.setTorrentLocation}},[n("v-icon",[e._v("mdi-folder-marker")])],1),n("v-btn",{attrs:{icon:"",title:e.$t("reannounce")},on:{click:e.reannounceTorrents}},[n("v-icon",[e._v("mdi-bullhorn")])],1),n("v-btn",{attrs:{icon:"",title:e.$t("title.edit_tracker")},on:{click:e.editTracker}},[n("v-icon",[e._v("mdi-server")])],1),n("v-btn",{attrs:{icon:"",title:e.$t("recheck"),disabled:0===e.selectedRows.length},on:{click:e.recheckTorrents}},[n("v-icon",[e._v("mdi-backup-restore")])],1)]],2),n("v-divider")],1),n("div",{staticClass:"table-wrapper"},[n("v-data-table",{directives:[{name:"class",rawName:"v-class:hide-headers",value:e.hasSelected,expression:"hasSelected",arg:"hide-headers"}],attrs:{headers:e.headers,items:e.torrents,"item-key":"hash","fixed-header":"","show-select":"",options:e.pageOptions,loading:e.loading,dense:"","footer-props":e.footerProps,"mobile-breakpoint":0},on:{"update:options":function(t){e.pageOptions=t}},scopedSlots:e._u([{key:"item",fn:function(t){return[n("tr",{key:t.item.hash,on:{dblclick:function(n){return n.preventDefault(),e.showInfo(t.item)}}},[n("td",[n("v-checkbox",{attrs:{value:t.isSelected,"hide-details":""},on:{change:t.select}})],1),n("td",{staticClass:"icon-label",attrs:{title:t.item.name}},[n("v-icon",{attrs:{color:e._f("stateColor")(t.item.state)}},[e._v(" "+e._s(e._f("stateIcon")(t.item.state))+" ")]),n("span",{staticClass:"torrent-title"},[e._v(" "+e._s(t.item.name)+" ")])],1),n("td",[e._v(e._s(e._f("formatSize")(t.item.size)))]),n("td",[n("v-progress-linear",{staticClass:"text-center ma-0",attrs:{height:"1.4em",value:100*t.item.progress,color:e._f("stateColor")(t.item.state,!0,t.item.seq_dl)}},[n("span",{class:e.getProgressColorClass(t.item.progress)},[e._v(" "+e._s(e._f("progress")(t.item.progress))+" ")])])],1),n("td",[e._v(e._s(e.$t("torrent_state."+t.item.state)))]),n("td",[e._v(e._s(t.item.num_seeds)+"/"+e._s(t.item.num_complete))]),n("td",[e._v(e._s(t.item.num_leechs)+"/"+e._s(t.item.num_incomplete))]),n("td",[e._v(e._s(e._f("formatNetworkSpeed")(t.item.dlspeed)))]),n("td",[e._v(e._s(e._f("formatNetworkSpeed")(t.item.upspeed)))]),n("td",[e._v(e._s(e._f("formatDuration")(t.item.eta,{dayLimit:100})))]),n("td",[e._v(e._s(t.item.ratio.toFixed(2)))]),n("td",[n("span",{attrs:{title:e._f("formatTimestamp")(t.item.added_on)}},[e._v(" "+e._s(e._f("formatAsDuration")(t.item.added_on))+" ago ")])])])]}}]),model:{value:e.selectedRows,callback:function(t){e.selectedRows=t},expression:"selectedRows"}})],1),e.toDelete.length?n("confirm-delete-dialog",{model:{value:e.toDelete,callback:function(t){e.toDelete=t},expression:"toDelete"}}):e._e(),e.toSetCategory.length?n("confirm-set-category-dialog",{attrs:{category:e.categoryToSet},model:{value:e.toSetCategory,callback:function(t){e.toSetCategory=t},expression:"toSetCategory"}}):e._e(),e.toEditTracker.length?n("edit-tracker-dialog",{model:{value:e.toEditTracker,callback:function(t){e.toEditTracker=t},expression:"toEditTracker"}}):e._e(),e.toShowInfo.length?n("info-dialog",{attrs:{tab:e.infoTab},on:{"update:tab":function(t){e.infoTab=t}},model:{value:e.toShowInfo,callback:function(t){e.toShowInfo=t},expression:"toShowInfo"}}):e._e()],1)},gn=[],_n=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("v-dialog",{attrs:{value:!0,fullscreen:e.phoneLayout,width:"40em"},on:{input:e.closeDialog}},[n("v-card",[n("v-card-title",{staticClass:"headline"},[n("v-icon",{staticClass:"mr-2"},[e._v("mdi-delete")]),n("span",[e._v(e._s(e.$t("title.delete_torrents")))])],1),n("v-card-text",{staticClass:"pb-0"},[e._v(" "+e._s(e.$t("dialog.delete_torrents.msg"))+" "),n("ol",{staticClass:"torrents pt-6"},e._l(e.torrents,(function(t,a){return n("li",{key:a},[e._v(" "+e._s(t.name)+" ")])})),0),n("v-checkbox",{attrs:{"prepend-icon":"mdi-file-cancel",label:e.$t("label.also_delete_files")},model:{value:e.deleteFiles,callback:function(t){e.deleteFiles=t},expression:"deleteFiles"}}),e.sameNamedTorrents.length>0?n("v-checkbox",{staticClass:"mt-0",attrs:{"prepend-icon":"mdi-file-multiple",label:e.$t("dialog.delete_torrents.also_delete_same_name_torrents",e.sameNamedTorrents.length)},model:{value:e.deleteSameNamed,callback:function(t){e.deleteSameNamed=t},expression:"deleteSameNamed"}}):e._e()],1),n("v-card-actions",[n("v-spacer"),n("v-btn",{attrs:{text:""},on:{click:e.closeDialog}},[e._v(" "+e._s(e.$t("cancel"))+" ")]),n("v-btn",{attrs:{color:"warning",disabled:e.submitting,loading:e.submitting},on:{click:e.submit}},[e._v(" "+e._s(e.$t("delete"))+" ")])],1)],1)],1)},bn=[],yn=function(e){Object(Re["a"])(n,e);var t=Object(Ce["a"])(n);function n(){var e;return Object(r["a"])(this,n),e=t.apply(this,arguments),e.deleteFiles=!1,e.deleteSameNamed=!1,e.moveSameNamed=!1,e.submitting=!1,e.torrents=[],e.sameNamedTorrents=[],e}return Object(s["a"])(n,[{key:"created",value:function(){this.torrents=this.value,this.sameNamedTorrents=Z(this.allTorrents,this.torrents)}},{key:"phoneLayout",get:function(){return this.$vuetify.breakpoint.xsOnly}},{key:"closeDialog",value:function(){return[]}},{key:"submit",value:function(){var e=Object(B["a"])(regeneratorRuntime.mark((function e(){var t,n;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:if(!this.submitting){e.next=2;break}return e.abrupt("return");case 2:return this.submitting=!0,t=this.deleteSameNamed?this.torrents.concat(this.sameNamedTorrents):this.torrents,n=t.map((function(e){return e.hash})),e.next=7,ie.deleteTorrents(n,this.deleteFiles);case 7:this.closeDialog();case 8:case"end":return e.stop()}}),e,this)})));function t(){return e.apply(this,arguments)}return t}()}]),n}(a["default"]);Object(Pe["a"])([Object(dt["c"])(Array)],yn.prototype,"value",void 0),Object(Pe["a"])([Object(dt["b"])("input")],yn.prototype,"closeDialog",null),yn=Object(Pe["a"])([Object(ut["b"])({computed:Object(X["a"])({},Object(U["c"])(["allTorrents"]))})],yn);var kn=yn,wn=kn,On=(n("1807"),Object(Me["a"])(wn,_n,bn,!1,null,"a01eaf30",null)),xn=On.exports;He()(On,{VBtn:We["a"],VCard:Ke["a"],VCardActions:Qe["a"],VCardText:Qe["b"],VCardTitle:Qe["c"],VCheckbox:gt["a"],VDialog:Je["a"],VIcon:Ot["a"],VSpacer:Ye["a"]});var jn=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("v-dialog",{attrs:{value:!0,fullscreen:e.phoneLayout,width:"40em"},on:{input:e.closeDialog}},[n("v-card",[n("v-card-title",{staticClass:"headline"},[n("v-icon",{staticClass:"mr-2"},[e._v("mdi-folder")]),n("span",[e._v(e._s(e.$t("title.set_category")))])],1),n("v-card-text",{staticClass:"pb-0"},[e.category?[e._v(" "+e._s(e.$t("dialog.set_category.move",{category:e.category}))+" ")]:[e._v(" "+e._s(e.$t("dialog.set_category.reset"))+" ")],n("ol",{staticClass:"torrents pt-6"},e._l(e.torrents,(function(t,a){return n("li",{key:a},[e._v(" "+e._s(t.name)+" ")])})),0),e.sameNamedTorrents.length>0?n("v-checkbox",{staticClass:"mt-0",attrs:{"prepend-icon":"mdi-file-multiple",label:e.$t("dialog.set_category.also_move_same_name_torrents",e.sameNamedTorrents.length)},model:{value:e.moveSameNamed,callback:function(t){e.moveSameNamed=t},expression:"moveSameNamed"}}):e._e()],2),n("v-card-actions",[n("v-spacer"),n("v-btn",{attrs:{text:""},on:{click:e.closeDialog}},[e._v(" "+e._s(e.$t("cancel"))+" ")]),n("v-btn",{attrs:{color:"warning",disabled:e.submitting,loading:e.submitting},on:{click:e.submit}},[e._v(" "+e._s(e.$t("submit"))+" ")])],1)],1)],1)},Sn=[],An=function(e){Object(Re["a"])(n,e);var t=Object(Ce["a"])(n);function n(){var e;return Object(r["a"])(this,n),e=t.apply(this,arguments),e.moveSameNamed=!1,e.submitting=!1,e.torrents=[],e.sameNamedTorrents=[],e}return Object(s["a"])(n,[{key:"created",value:function(){this.torrents=this.value,this.sameNamedTorrents=Z(this.allTorrents,this.torrents)}},{key:"phoneLayout",get:function(){return this.$vuetify.breakpoint.xsOnly}},{key:"closeDialog",value:function(){return[]}},{key:"submit",value:function(){var e=Object(B["a"])(regeneratorRuntime.mark((function e(){var t,n;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:if(!this.submitting){e.next=2;break}return e.abrupt("return");case 2:return this.submitting=!0,t=this.moveSameNamed?this.torrents.concat(this.sameNamedTorrents):this.torrents,n=t.map((function(e){return e.hash})),e.next=7,ie.setTorrentsCategory(n,this.category);case 7:this.closeDialog();case 8:case"end":return e.stop()}}),e,this)})));function t(){return e.apply(this,arguments)}return t}()}]),n}(a["default"]);Object(Pe["a"])([Object(dt["c"])(Array)],An.prototype,"value",void 0),Object(Pe["a"])([Object(dt["c"])(String)],An.prototype,"category",void 0),Object(Pe["a"])([Object(dt["b"])("input")],An.prototype,"closeDialog",null),An=Object(Pe["a"])([Object(ut["b"])({computed:Object(X["a"])({},Object(U["c"])(["allTorrents"]))})],An);var Rn=An,Cn=Rn,Pn=(n("94c9"),Object(Me["a"])(Cn,jn,Sn,!1,null,"dfcb35ec",null)),Tn=Pn.exports;He()(Pn,{VBtn:We["a"],VCard:Ke["a"],VCardActions:Qe["a"],VCardText:Qe["b"],VCardTitle:Qe["c"],VCheckbox:gt["a"],VDialog:Je["a"],VIcon:Ot["a"],VSpacer:Ye["a"]});var Dn=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("v-dialog",{attrs:{value:!0,fullscreen:e.phoneLayout,persistent:"",width:"40em"},on:{input:e.closeDialog}},[n("v-card",[n("v-card-title",{staticClass:"headline"},[n("v-icon",{staticClass:"mr-2"},[e._v("mdi-server")]),n("span",[e._v("Edit tracker")])],1),n("v-card-text",{staticClass:"pa-0"},[n("v-stepper",{model:{value:e.step,callback:function(t){e.step=t},expression:"step"}},[n("v-stepper-header",[n("v-stepper-step",{attrs:{complete:e.step>1,step:"1"}},[e._v(" Search ")]),n("v-divider"),n("v-stepper-step",{attrs:{complete:e.step>2,step:"2"}},[e._v(" Preview ")]),n("v-divider"),n("v-stepper-step",{attrs:{complete:e.step>3,step:"3"}},[e._v(" Result ")])],1),n("v-stepper-items",[n("v-stepper-content",{attrs:{step:"1"}},[n("v-form",{model:{value:e.valid,callback:function(t){e.valid=t},expression:"valid"}},[n("v-text-field",{attrs:{label:"Search",rules:[function(e){return!!e||"Required"}],placeholder:"Regex format",required:""},model:{value:e.search,callback:function(t){e.search=t},expression:"search"}}),n("v-text-field",{attrs:{label:"Replace"},model:{value:e.replace,callback:function(t){e.replace=t},expression:"replace"}})],1)],1),n("v-stepper-content",{attrs:{step:"2"}},[e._v(" "+e._s(e.toEdit.length)+" torrent(s) to update. "),n("ol",{staticClass:"torrents pt-6"},e._l(e.toEdit,(function(t,a){return n("li",{key:a},[e._v(" "+e._s(t.name)+" "),n("br"),e._v(" "+e._s(t.origUrl)+" "),n("br"),e._v(" "+e._s(t.newUrl)+" ")])})),0)]),n("v-stepper-content",{attrs:{step:"3"}},[e.submitting&&e.currentIndex!=e.toEdit.length?n("v-progress-linear",{attrs:{value:e.currentIndex/e.toEdit.length*100}}):[e._v(" "+e._s(e.currentIndex)+" torrent(s) updated. ")]],2)],1)],1)],1),n("v-card-actions",[n("v-spacer"),e.step<3?n("v-btn",{attrs:{text:""},domProps:{textContent:e._s(1==e.step?e.$t("cancel"):e.$t("back"))},on:{click:e.back}},[e._v(" Back ")]):e._e(),n("v-btn",{attrs:{color:"warning",disabled:!e.canNext,loading:e.submitting},domProps:{textContent:e._s([null,e.$t("next"),e.$t("confirm"),e.$t("close")][e.step])},on:{click:e.foward}})],1)],1)],1)},Ln=[],Vn=(n("841c"),n("5319"),n("4d63"),function(e){Object(Re["a"])(n,e);var t=Object(Ce["a"])(n);function n(){var e;return Object(r["a"])(this,n),e=t.apply(this,arguments),e.step=1,e.valid=!1,e.submitting=!1,e.torrents=[],e.search="",e.replace="",e.toEdit=[],e.currentIndex=0,e}return Object(s["a"])(n,[{key:"created",value:function(){this.torrents=this.value}},{key:"phoneLayout",get:function(){return this.$vuetify.breakpoint.xsOnly}},{key:"canNext",get:function(){return!(1!==this.step||!this.valid)||(2===this.step&&this.toEdit.length>0||3===this.step&&!this.submitting)}},{key:"closeDialog",value:function(){return[]}},{key:"calcResults",value:function(){var e=this,t=new RegExp(this.search);return Object(h["chain"])(this.torrents).map((function(n){var a=n.tracker,r=n.hash,s=n.name,i=a.replace(t,e.replace);return i===a?null:{hash:r,name:s,origUrl:a,newUrl:i}})).compact().value()}},{key:"back",value:function(){1!==this.step?this.step--:this.closeDialog()}},{key:"foward",value:function(){var e=Object(B["a"])(regeneratorRuntime.mark((function e(){var t,n,a;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:if(1!==this.step){e.next=4;break}return this.toEdit=this.calcResults(),this.step++,e.abrupt("return");case 4:if(3!==this.step){e.next=7;break}return this.closeDialog(),e.abrupt("return");case 7:if(!this.submitting){e.next=9;break}return e.abrupt("return");case 9:this.submitting=!0,this.step++,this.currentIndex=0,t=Object(i["a"])(this.toEdit),e.prev=13,t.s();case 15:if((n=t.n()).done){e.next=22;break}return a=n.value,e.next=19,ie.editTracker(a.hash,a.origUrl,a.newUrl);case 19:this.currentIndex++;case 20:e.next=15;break;case 22:e.next=27;break;case 24:e.prev=24,e.t0=e["catch"](13),t.e(e.t0);case 27:return e.prev=27,t.f(),e.finish(27);case 30:this.submitting=!1;case 31:case"end":return e.stop()}}),e,this,[[13,24,27,30]])})));function t(){return e.apply(this,arguments)}return t}()}]),n}(a["default"]));Object(Pe["a"])([Object(dt["c"])(Array)],Vn.prototype,"value",void 0),Object(Pe["a"])([Object(dt["b"])("input")],Vn.prototype,"closeDialog",null),Vn=Object(Pe["a"])([Object(ut["b"])({computed:Object(X["a"])({},Object(U["c"])(["allTorrents"]))})],Vn);var In=Vn,Bn=In,Un=(n("2255"),n("ce7e")),En=n("8e36"),Fn=n("7e85"),zn=n("e516"),qn=n("9c54"),Nn=n("56a4"),$n=Object(Me["a"])(Bn,Dn,Ln,!1,null,"24122721",null),Mn=$n.exports;He()($n,{VBtn:We["a"],VCard:Ke["a"],VCardActions:Qe["a"],VCardText:Qe["b"],VCardTitle:Qe["c"],VDialog:Je["a"],VDivider:Un["a"],VForm:wt["a"],VIcon:Ot["a"],VProgressLinear:En["a"],VSpacer:Ye["a"],VStepper:Fn["a"],VStepperContent:zn["a"],VStepperHeader:qn["a"],VStepperItems:qn["b"],VStepperStep:Nn["a"],VTextField:Ze["a"]});var Gn=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("v-dialog",{attrs:{value:!0,width:e.dialogWidth,fullscreen:e.phoneLayout},on:{input:e.closeDialog}},[n("v-card",[n("v-card-title",{staticClass:"headline"},[n("v-icon",{staticClass:"mr-2"},[e._v(" mdi-alert-circle ")]),n("span",{domProps:{textContent:e._s(e.$t("info"))}})],1),n("v-card-text",[n("v-tabs",{model:{value:e.tabSync,callback:function(t){e.tabSync=t},expression:"tabSync"}},[n("v-tab",{attrs:{href:"#general"}},[e._v(" General ")]),n("v-tab",{attrs:{href:"#trackers"}},[e._v(" Trackers ")]),n("v-tab",{attrs:{href:"#peers"}},[e._v(" Peers ")]),n("v-tab",{attrs:{href:"#content"}},[e._v(" Content ")])],1),n("v-tabs-items",{attrs:{value:e.tab,touchless:""}},[n("v-tab-item",{attrs:{value:"general"}},e._l(e.torrents,(function(t){return n("panel",{key:t.hash,attrs:{title:t.name,single:1===e.torrents.length}},[n("torrent-info",{attrs:{torrent:t,"is-active":"general"===e.tab}})],1)})),1),n("v-tab-item",{attrs:{value:"trackers"}},e._l(e.torrents,(function(t){return n("panel",{key:t.hash,attrs:{title:t.name,single:1===e.torrents.length}},[n("trackers",{attrs:{hash:t.hash,"is-active":"trackers"===e.tab}})],1)})),1),n("v-tab-item",{attrs:{value:"peers"}},e._l(e.torrents,(function(t){return n("panel",{key:t.hash,attrs:{title:t.name,single:1===e.torrents.length}},[n("peers",{attrs:{hash:t.hash,"is-active":"peers"===e.tab}})],1)})),1),n("v-tab-item",{attrs:{value:"content"}},e._l(e.torrents,(function(t){return n("panel",{key:t.hash,attrs:{title:t.name,single:1===e.torrents.length}},[n("torrent-content",{attrs:{hash:t.hash,"is-active":"content"===e.tab}})],1)})),1)],1)],1),n("v-card-actions",[n("v-spacer"),n("v-btn",{attrs:{text:""},domProps:{textContent:e._s(e.$t("close"))},on:{click:e.closeDialog}})],1)],1)],1)},Hn=[],Wn=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"torrent-info"},[n("div",{staticClass:"progress"},[n("span",[e._v("Progress:")]),n("canvas",{ref:"canvas",staticClass:"progress-inner"}),n("span",[e._v(e._s(e._f("progress")(e.torrent.progress)))])]),n("fieldset",[n("legend",[e._v("Transfer")]),e.properties?n("v-container",{staticClass:"pa-1"},[n("v-row",{attrs:{"no-gutters":""}},[e._l(e.transfer,(function(t){return[n("v-col",{key:t.label+"_l",staticClass:"label",attrs:{cols:"3",sm:"2",md:"1"}},[e._v(" "+e._s(t.label)+": ")]),n("v-col",{key:t.label+"_v",staticClass:"value",attrs:{cols:"9",sm:"4",md:"2"}},[e._v(" "+e._s(t.value(e.properties))+" ")])]}))],2)],1):e._e()],1),n("fieldset",[n("legend",[e._v("Information")]),e.properties?n("v-container",{staticClass:"pa-1"},[n("v-row",{attrs:{"no-gutters":""}},[e._l(e.information,(function(t){return[n("v-col",{key:t.label+"_l",staticClass:"label",attrs:{cols:"3",sm:"2",md:"1"}},[e._v(" "+e._s(t.label)+": ")]),n("v-col",{key:t.label+"_v",staticClass:"value",attrs:{cols:"9",sm:"4",md:"3"}},[e._v(" "+e._s(t.value(e.properties))+" ")])]}))],2)],1):e._e()],1)])},Kn=[],Qn=function(e){Object(Re["a"])(n,e);var t=Object(Ce["a"])(n);function n(){var e;return Object(r["a"])(this,n),e=t.apply(this,arguments),e.interval=2e3,e}return Object(s["a"])(n,[{key:"setTaskAndRun",value:function(e,t){this.call=e,t&&(this.interval=t),this.runTask()}},{key:"runTask",value:function(){var e=Object(B["a"])(regeneratorRuntime.mark((function e(){var t;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:if(this.cancelTask(),t=this.call(),!(t instanceof Promise)){e.next=6;break}return e.next=5,t;case 5:t=e.sent;case 6:if(!this.destroy&&!t){e.next=8;break}return e.abrupt("return");case 8:this.taskId=setTimeout(this.runTask,this.interval);case 9:case"end":return e.stop()}}),e,this)})));function t(){return e.apply(this,arguments)}return t}()},{key:"cancelTask",value:function(){this.taskId&&(clearTimeout(this.taskId),this.taskId=0)}},{key:"beforeDestroy",value:function(){this.destroy=!0,this.cancelTask()}}]),n}(a["default"]);Qn=Object(Pe["a"])([ut["b"]],Qn);var Jn=Qn,Yn=function(e){Object(Re["a"])(n,e);var t=Object(Ce["a"])(n);function n(){return Object(r["a"])(this,n),t.apply(this,arguments)}return Object(s["a"])(n,[{key:"fetchInfo",value:function(){throw"Not implement"}},{key:"doTask",value:function(){var e=Object(B["a"])(regeneratorRuntime.mark((function e(){return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return e.next=2,this.fetchInfo();case 2:return e.abrupt("return",!this.isActive);case 3:case"end":return e.stop()}}),e,this)})));function t(){return e.apply(this,arguments)}return t}()},{key:"startTask",value:function(){this.setTaskAndRun(this.doTask,5e3)}},{key:"created",value:function(){this.isActive&&this.startTask()}},{key:"onActived",value:function(){var e=Object(B["a"])(regeneratorRuntime.mark((function e(t){return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:t?this.startTask():this.cancelTask();case 1:case"end":return e.stop()}}),e,this)})));function t(t){return e.apply(this,arguments)}return t}()}]),n}(Jn);Object(Pe["a"])([Object(dt["c"])(Boolean)],Yn.prototype,"isActive",void 0),Object(Pe["a"])([Object(dt["e"])("isActive")],Yn.prototype,"onActived",null),Yn=Object(Pe["a"])([dt["a"]],Yn);var Zn,Xn=Yn;(function(e){e[e["Empty"]=0]="Empty",e[e["Downloading"]=1]="Downloading",e[e["Downloaded"]=2]="Downloaded"})(Zn||(Zn={}));var ea=function(e){Object(Re["a"])(n,e);var t=Object(Ce["a"])(n);function n(){var e;return Object(r["a"])(this,n),e=t.apply(this,arguments),e.properties=null,e.transfer=[{label:"Time active",value:function(e){return be(e.time_elapsed)+(e.seeding_time?" (seeded ".concat(be(e.seeding_time),")"):"")}},{label:"ETA",value:function(e){return be(e.eta,{dayLimit:100})}},{label:"Connections",value:function(e){return"".concat(e.nb_connections," (").concat(e.nb_connections_limit," max)")}},{label:"Downloaded",value:function(e){return"".concat(_e(e.total_downloaded_session),"/").concat(_e(e.total_downloaded))}},{label:"Uploaded",value:function(e){return"".concat(_e(e.total_uploaded_session),"/").concat(_e(e.total_uploaded))}},{label:"Seeds",value:function(e){return"".concat(e.seeds," (").concat(e.seeds_total," total)")}},{label:"DL speed",value:function(e){return"".concat(_e(e.dl_speed),"/s")}},{label:"UP speed",value:function(e){return"".concat(_e(e.up_speed),"/s")}},{label:"Peers",value:function(e){return"".concat(e.peers," (").concat(e.peers_total," total)")}},{label:"Wasted",value:function(e){return _e(e.total_wasted)}},{label:"Share ratio",value:function(e){return ge(e.share_ratio,3)}},{label:"Reannounce",value:function(e){return be(e.reannounce)}},{label:"Last seen",value:function(e){return ye(e.last_seen)}}],e.information=[{label:"Total size",value:function(e){return _e(e.total_size)}},{label:"Pieces",value:function(e){return"".concat(e.pieces_num," x ").concat(_e(e.piece_size)," (have ").concat(e.pieces_have,")")}},{label:"Created by",value:function(e){return e.created_by}},{label:"Created on",value:function(e){return ye(e.creation_date)}},{label:"Added on",value:function(e){return ye(e.addition_date)}},{label:"Completed on",value:function(e){return ye(e.completion_date)}},{label:"Torrent hash",value:function(){return e.torrent.hash}},{label:"Save path",value:function(e){return e.save_path}},{label:"Comment",value:function(e){return e.comment}}],e.pieces=[],e.canvas=null,e}return Object(s["a"])(n,[{key:"getData",value:function(){var e=Object(B["a"])(regeneratorRuntime.mark((function e(){return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return e.next=2,ie.getTorrentProperties(this.torrent.hash);case 2:return this.properties=e.sent,e.next=5,ie.getTorrentPieceStates(this.torrent.hash);case 5:this.pieces=e.sent;case 6:case"end":return e.stop()}}),e,this)})));function t(){return e.apply(this,arguments)}return t}()},{key:"initCanvas",value:function(e){var t=e.clientWidth,n=e.clientHeight;return e.width=t,e.height=n,e.getContext("2d")}},{key:"fetchInfo",value:function(){return this.getData()}},{key:"onPiecesChanged",value:function(e){var t;this.canvas?t=this.canvas:(t=this.initCanvas(this.$refs.canvas),this.canvas=t);var n=t.canvas,a=n.clientHeight,r=n.clientWidth;t.clearRect(0,0,r,a);for(var s=r/2,i=r/s,o=Math.floor(e.length/s),c=Object(h["chunk"])(e,o),l=0;l=p))continue;v="lightblue"}t.fillStyle=v,t.fillRect(l*i,0,i,a)}}}]),n}(Xn);Object(Pe["a"])([Object(dt["c"])()],ea.prototype,"torrent",void 0),Object(Pe["a"])([Object(dt["e"])("pieces")],ea.prototype,"onPiecesChanged",null),ea=Object(Pe["a"])([Object(ut["b"])({})],ea);var ta=ea,na=ta,aa=(n("3778"),Object(Me["a"])(na,Wn,Kn,!1,null,"7f833448",null)),ra=aa.exports;He()(aa,{VCol:_t["a"],VContainer:yt["a"],VRow:xt["a"]});var sa,ia=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"torrent-content"},[n("v-treeview",{attrs:{"open-on-click":"",items:e.fileTree,value:e.selected,selectable:""},on:{input:e.selectChanged},scopedSlots:e._u([{key:"prepend",fn:function(t){return[e.inChanging.includes(t.item.id)?n("v-progress-circular",{attrs:{size:"24",width:"2",indeterminate:""}}):n("v-icon",{domProps:{textContent:e._s(e.getRowIcon(t))}})]}},{key:"append",fn:function(t){return[n("span",[e._v(" ["+e._s(e._f("size")(t.item.size))+"] ")]),n("span",{staticClass:"progress"},[e._v(" "+e._s(e._f("progress")(t.item.progress))+" ")])]}}])})],1)},oa=[];n("4e827");(function(e){e[e["notDownload"]=0]="notDownload",e[e["normal"]=1]="normal",e[e["high"]=6]="high",e[e["maximal"]=7]="maximal"})(sa||(sa={}));var ca="/FILE/",la=".unwanted",ua=function(e){Object(Re["a"])(n,e);var t=Object(Ce["a"])(n);function n(){var e;return Object(r["a"])(this,n),e=t.apply(this,arguments),e.files=[],e.inChanging=[],e}return Object(s["a"])(n,[{key:"fileTree",get:function(){return this.buildTree(this.files,0)}},{key:"selected",get:function(){return this.files.filter((function(e){return e.priority!==sa.notDownload})).map((function(e){return e.id}))}},{key:"getFiles",value:function(){var e=Object(B["a"])(regeneratorRuntime.mark((function e(){var t;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return e.next=2,ie.getTorrentFiles(this.hash);case 2:t=e.sent,t.forEach((function(e,t){return e.id=t})),t.sort((function(e,t){return e.name.localeCompare(t.name)})),this.files=t,this.folderIndex=0,this.inChanging=[];case 8:case"end":return e.stop()}}),e,this)})));function t(){return e.apply(this,arguments)}return t}()},{key:"getRowIcon",value:function(e){return e.item.item?"mdi-file":e.open?"mdi-folder-open":"mdi-folder"}},{key:"selectChanged",value:function(){var e=Object(B["a"])(regeneratorRuntime.mark((function e(t){var n,a,r;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:if(a=this.selected,r=Object(h["xor"])(a,t),0!=r.length){e.next=4;break}return e.abrupt("return");case 4:return(n=this.inChanging).push.apply(n,Object(N["a"])(r)),e.next=7,ie.setTorrentFilePriority(this.hash,r,t.length>a.length?sa.normal:sa.notDownload);case 7:case"end":return e.stop()}}),e,this)})));function t(t){return e.apply(this,arguments)}return t}()},{key:"getFileFolder",value:function(e,t){var n=e.name,a=n.indexOf("/",t);return-1===a?ca:n.substring(t,a)}},{key:"buildTree",value:function(e,t){var n=this;if(!e.length)return[];for(var a=Object(h["groupBy"])(e,(function(e){return n.getFileFolder(e,t)})),r=[],s=0,o=Object.entries(a);s=.5||this.$vuetify.theme.dark?"white":"black";return"".concat(t,"--text")}},{key:"created",value:function(){this.pageOptions=this.$store.getters.config.pageOptions}},{key:"confirmDelete",value:function(){this.toDelete=this.selectedRows}},{key:"showInfo",value:function(e){this.toShowInfo=e?[e]:this.selectedRows}},{key:"resumeTorrents",value:function(){var e=Object(B["a"])(regeneratorRuntime.mark((function e(){return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return e.next=2,ie.resumeTorrents(this.selectedHashes);case 2:case"end":return e.stop()}}),e,this)})));function t(){return e.apply(this,arguments)}return t}()},{key:"forceStartTorrents",value:function(){var e=Object(B["a"])(regeneratorRuntime.mark((function e(){return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return e.next=2,ie.setForceStartTorrents(this.selectedHashes);case 2:case"end":return e.stop()}}),e,this)})));function t(){return e.apply(this,arguments)}return t}()},{key:"toggleSequentialTorrents",value:function(){var e=Object(B["a"])(regeneratorRuntime.mark((function e(){return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return e.next=2,ie.toggleSequentialTorrents(this.selectedHashes);case 2:case"end":return e.stop()}}),e,this)})));function t(){return e.apply(this,arguments)}return t}()},{key:"pauseTorrents",value:function(){var e=Object(B["a"])(regeneratorRuntime.mark((function e(){return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return e.next=2,ie.pauseTorrents(this.selectedHashes);case 2:case"end":return e.stop()}}),e,this)})));function t(){return e.apply(this,arguments)}return t}()},{key:"reannounceTorrents",value:function(){var e=Object(B["a"])(regeneratorRuntime.mark((function e(){return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return this.hasSelected||(this.selectedRows=this.allTorrents),e.next=3,ie.reannounceTorrents(this.selectedHashes);case 3:this.showSnackBar({text:S("label.reannounced")});case 4:case"end":return e.stop()}}),e,this)})));function t(){return e.apply(this,arguments)}return t}()},{key:"recheckTorrents",value:function(){var e=Object(B["a"])(regeneratorRuntime.mark((function e(){var t;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return e.next=2,this.asyncShowDialog({title:S("title.recheck_torrents"),text:S("dialog.recheck_torrents.msg"),type:Be.OkCancel});case 2:if(t=e.sent,t){e.next=5;break}return e.abrupt("return");case 5:return e.next=7,ie.recheckTorrents(this.selectedHashes);case 7:this.showSnackBar({text:S("label.rechecking")});case 8:case"end":return e.stop()}}),e,this)})));function t(){return e.apply(this,arguments)}return t}()},{key:"setTorrentLocation",value:function(){var e=Object(B["a"])(regeneratorRuntime.mark((function e(){var t,n,a;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return t=Object(h["uniqBy"])(this.selectedRows,"save_path"),n=t.length>1?"":t[0].save_path,e.next=4,this.asyncShowDialog({title:S("title.set_location"),text:"",type:Be.Input,value:n});case 4:if(a=e.sent,a){e.next=7;break}return e.abrupt("return");case 7:return this.showSnackBar({text:S("label.moving")}),e.prev=8,e.next=11,ie.setTorrentLocation(this.selectedHashes,a);case 11:e.next=17;break;case 13:return e.prev=13,e.t0=e["catch"](8),this.showSnackBar({text:e.t0}),e.abrupt("return");case 17:this.showSnackBar({text:S("label.moved")});case 18:case"end":return e.stop()}}),e,this,[[8,13]])})));function t(){return e.apply(this,arguments)}return t}()},{key:"setTorrentsCategory",value:function(e){this.categoryToSet=e,this.toSetCategory=this.selectedRows}},{key:"editTracker",value:function(){this.hasSelected&&(this.selectedRows=this.allTorrents),this.toEditTracker=this.selectedRows}},{key:"onPageOptionsChanged",value:function(){this.updateConfig({key:"pageOptions",value:this.pageOptions})}},{key:"onFilterChanged",value:function(){this.selectedRows=[]}},{key:"onTorrentsChanged",value:function(e){if(this.hasSelected){var t=e.map((function(e){return e.hash})),n=Object(h["difference"])(this.selectedHashes,t);n&&(this.selectedRows=this.selectedRows.filter((function(e){return!n.includes(e.hash)})))}}}]),n}(a["default"]);Object(Pe["a"])([Object(dt["e"])("pageOptions",{deep:!0})],Ka.prototype,"onPageOptionsChanged",null),Object(Pe["a"])([Object(dt["e"])("filter")],Ka.prototype,"onFilterChanged",null),Object(Pe["a"])([Object(dt["e"])("torrents")],Ka.prototype,"onTorrentsChanged",null),Ka=Object(Pe["a"])([Object(ut["b"])({components:{ConfirmDeleteDialog:xn,ConfirmSetCategoryDialog:Tn,EditTrackerDialog:Mn,InfoDialog:Ha},computed:Object(X["a"])(Object(X["a"])({},Object(U["c"])(["isDataReady","allTorrents","allTags","allCategories","torrentGroupByCategory","torrentGroupByTag","torrentGroupBySite","torrentGroupByState"])),Object(U["e"])({filter:function(e,t){return t.config.filter}})),filters:{formatNetworkSpeed:function(e){return 0===e?null:"".concat(_e(e),"/s")},stateIcon:function(e){var t=Wa(e);return"mdi-".concat(t.icon)},stateColor:function(e,t,n){var a=Wa(e);return t?n?"#e33371":a.color||"#0008":a.color}},methods:Object(X["a"])(Object(X["a"])({},Object(U["d"])(["updateConfig","showSnackBar"])),Object(U["b"])(["asyncShowDialog"]))})],Ka);var Qa=Ka,Ja=Qa,Ya=(n("9fa4"),n("1800")),Za=n("e449"),Xa=n("e0c7"),er=Object(Me["a"])(Ja,mn,gn,!1,null,"c7d208ac",null),tr=er.exports;He()(er,{VBtn:We["a"],VCheckbox:gt["a"],VDataTable:wa["a"],VDivider:Un["a"],VIcon:Ot["a"],VList:Qt["a"],VListItem:Ut["a"],VListItemAction:Ya["a"],VListItemContent:Et["a"],VListItemTitle:Et["b"],VMenu:Za["a"],VProgressLinear:En["a"],VSubheader:Xa["a"]});var nr=function(){var e=this,t=e.$createElement,n=e._self._c||t;return e.isDataReady?n("div",{staticClass:"footer d-flex",class:e.topLayoutClass},[e.app?n("div",{staticClass:"d-flex shrink",class:e.phoneLayout?"flex-column":"align-center"},[e.phoneLayout?e._e():n("div",[n("v-tooltip",{attrs:{top:""},scopedSlots:e._u([{key:"activator",fn:function(t){var a=t.on;return[n("span",e._g({},a),[e._v(" qBittorrent "+e._s(e.app.version)+" ")])]}}],null,!1,3135644960)},[n("span",[e._v(" API version: "+e._s(e.app.apiVersion)+" ")]),n("br"),n("span",[e._v(" qb-web version: "+e._s(e.buildInfo)+" ")])])],1),e.phoneLayout?e._e():n("v-divider",{staticClass:"mx-2",attrs:{vertical:""}}),n("div",{staticClass:"icon-label"},[n("v-icon",[e._v("mdi-sprout")]),e._v(" "+e._s(e.allTorrents.length)+" ["+e._s(e._f("formatSize")(e.totalSize))+"] ")],1),e.phoneLayout?e._e():n("v-divider",{staticClass:"mx-2",attrs:{vertical:""}}),n("v-tooltip",{attrs:{top:""},scopedSlots:e._u([{key:"activator",fn:function(t){var a=t.on;return[n("div",e._g({staticClass:"icon-label"},a),[n("v-icon",[e._v("mdi-nas")]),e._v(" "+e._s(e._f("formatSize")(e.info.free_space_on_disk))+" ")],1)]}}],null,!1,3909253775)},[n("span",[e._v(" Queued I/O jobs: "+e._s(e.info.queued_io_jobs)+" ")]),n("br"),n("span",[e._v(" Avg queue time: "+e._s(e.info.average_time_queue)+" ms ")])]),e.phoneLayout?e._e():n("v-divider",{staticClass:"mx-2",attrs:{vertical:""}}),e.phoneLayout?e._e():n("div",{staticClass:"icon-label"},[n("v-icon",{staticClass:"icon-upload-download"},[e._v(" mdi-swap-vertical-bold ")]),n("span",[e._v(" "+e._s(e._f("formatSize")(e.info.alltime_dl))+"/"+e._s(e._f("formatSize")(e.info.alltime_ul))+" ")])],1)],1):e._e(),e.info?n("div",{staticClass:"d-flex shrink",class:e.phoneLayout?"flex-column":"align-center"},[e.phoneLayout?e._e():n("div",{staticClass:"icon-label"},[n("v-icon",[e._v("mdi-lan")]),e._v(" "+e._s(e.$t("label.dht_nodes",e.info.dht_nodes))+" ")],1),e.phoneLayout?e._e():n("v-divider",{staticClass:"mx-2",attrs:{vertical:""}}),n("div",{staticClass:"icon-label"},[n("v-tooltip",{attrs:{top:""},scopedSlots:e._u([{key:"activator",fn:function(t){var a=t.on;return[n("v-icon",e._g({attrs:{color:e._f("connectionIconColor")(e.info.connection_status)}},a),[e._v(" mdi-"+e._s(e._f("connectionIcon")(e.info.connection_status))+" ")]),e.phoneLayout?n("span",[e._v(" Network "+e._s(e.info.connection_status)+" ")]):e._e()]}}],null,!1,452698304)},[n("span",[e._v(" Network "+e._s(e.info.connection_status)+" ")])])],1),e.phoneLayout?e._e():n("v-divider",{staticClass:"mx-2",attrs:{vertical:""}}),n("div",{staticClass:"icon-label"},[e.phoneLayout?n("v-switch",{staticClass:"mt-0 pt-0 speed-switch",attrs:{"hide-details":"",value:e.speedLimited,label:"Alternative speed limits"},on:{change:e.toggleSpeedLimitsMode},scopedSlots:e._u([{key:"prepend",fn:function(){return[n("v-icon",e._b({},"v-icon",e.speedModeBind,!1),[e._v(" mdi-speedometer ")])]},proxy:!0}],null,!1,2672072414)}):n("v-tooltip",{attrs:{top:""},scopedSlots:e._u([{key:"activator",fn:function(t){var a=t.on;return[n("v-icon",e._g(e._b({on:{click:e.toggleSpeedLimitsMode}},"v-icon",e.speedModeBind,!1),a),[e._v(" mdi-speedometer ")])]}}],null,!1,3284983233)},[n("span",[e._v(" Alternative speed limits "+e._s(e.speedLimited?"enabled":"disabled")+" ")])])],1),e.phoneLayout?e._e():n("v-divider",{staticClass:"mx-2",attrs:{vertical:""}}),n("div",{staticClass:"icon-label"},[n("v-icon",{attrs:{color:e.info.dl_info_speed>0?"success":null}},[e._v(" mdi-download ")]),n("span",[e._v(" "+e._s(e._f("formatSize")(e.info.dl_info_speed))+"/s "),e.info.dl_rate_limit?[e._v(" ("+e._s(e._f("formatSize")(e.info.dl_rate_limit))+"/s) ")]:e._e(),e.phoneLayout?e._e():[e._v(" ["+e._s(e._f("formatSize")(e.info.dl_info_data))+"] ")]],2)],1),e.phoneLayout?e._e():n("v-divider",{staticClass:"mx-2",attrs:{vertical:""}}),n("div",{staticClass:"icon-label"},[n("v-icon",{attrs:{color:e.info.up_info_speed>0?"warning":null}},[e._v(" mdi-upload ")]),n("span",[e._v(" "+e._s(e._f("formatSize")(e.info.up_info_speed))+"/s "),e.info.up_rate_limit?[e._v(" ("+e._s(e._f("formatSize")(e.info.up_rate_limit))+"/s) ")]:e._e(),e.phoneLayout?e._e():[e._v(" ["+e._s(e._f("formatSize")(e.info.up_info_data))+"] ")]],2)],1)],1):e._e()]):e._e()},ar=[],rr=function(e){Object(Re["a"])(n,e);var t=Object(Ce["a"])(n);function n(){var e;return Object(r["a"])(this,n),e=t.apply(this,arguments),e.app=null,e.speedLimited=!1,e.buildInfo=je,e}return Object(s["a"])(n,[{key:"totalSize",get:function(){return Object(h["sumBy"])(this.allTorrents,"size")}},{key:"speedModeBind",get:function(){return this.speedLimited?{class:"speed-limited",color:"warning"}:{class:null,color:"success"}}},{key:"topLayoutClass",get:function(){var e=this.phoneLayout;return e?["in-drawer","flex-column"]:["mx-4","justify-space-between"]}},{key:"getAppInfo",value:function(){var e=Object(B["a"])(regeneratorRuntime.mark((function e(){var t,n,a;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return e.next=2,ie.getAppVersion();case 2:return t=e.sent,n=t.data,e.next=6,ie.getApiVersion();case 6:t=e.sent,a=t.data,this.app={version:n,apiVersion:a};case 9:case"end":return e.stop()}}),e,this)})));function t(){return e.apply(this,arguments)}return t}()},{key:"toggleSpeedLimitsMode",value:function(){var e=Object(B["a"])(regeneratorRuntime.mark((function e(){return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return this.speedLimited=!this.speedLimited,e.next=3,ie.toggleSpeedLimitsMode();case 3:case"end":return e.stop()}}),e,this)})));function t(){return e.apply(this,arguments)}return t}()},{key:"created",value:function(){this.isDataReady&&(this.speedLimited=this.info.use_alt_speed_limits,this.getAppInfo())}},{key:"onDataReady",value:function(e){e&&null===this.app&&this.getAppInfo()}},{key:"onSpeedLimitChanged",value:function(e){this.speedLimited=e}}]),n}(a["default"]);Object(Pe["a"])([Object(dt["c"])(Boolean)],rr.prototype,"phoneLayout",void 0),Object(Pe["a"])([Object(dt["e"])("isDataReady")],rr.prototype,"onDataReady",null),Object(Pe["a"])([Object(dt["e"])("info.use_alt_speed_limits")],rr.prototype,"onSpeedLimitChanged",null),rr=Object(Pe["a"])([Object(ut["b"])({filters:{connectionIcon:function(e){var t={connected:"check-network",firewalled:"minus-network",disconnected:"close-network"};return t[e]},connectionIconColor:function(e){var t={connected:"success",firewalled:"warning",disconnected:"error"};return t[e]}},computed:Object(X["a"])(Object(X["a"])({},Object(U["e"])({info:function(e){return this.isDataReady?e.mainData.server_state:null}})),Object(U["c"])(["isDataReady","allTorrents"]))})],rr);var sr=rr,ir=sr,or=(n("a364"),n("b73d")),cr=n("3a2f"),lr=Object(Me["a"])(ir,nr,ar,!1,null,"335591ac",null),ur=lr.exports;He()(lr,{VDivider:Un["a"],VIcon:Ot["a"],VSwitch:or["a"],VTooltip:cr["a"]});var dr=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("v-dialog",{attrs:{value:e.value,scrollable:"",fullscreen:e.phoneLayout,width:e.dialogWidth},on:{input:function(t){return e.$emit("input",t)}}},[n("v-card",[n("v-card-title",{staticClass:"headline"},[n("v-icon",{staticClass:"mr-2"},[e._v("mdi-delta")]),n("span",{domProps:{textContent:e._s(e.$t("logs"))}})],1),n("v-card-text",[e.logs.length?e._e():n("v-progress-linear",{staticClass:"mt-4",attrs:{indeterminate:!0}}),n("ol",{staticClass:"logs caption"},e._l(e.logs,(function(t,a){return n("li",{key:a,staticClass:"log-item",class:e._f("typeColor")(t.type)},[n("span",{staticClass:"tag"},[e._v("["+e._s(e._f("formatType")(t.type))+" "+e._s(e._f("formatTimestamp")(t.timestamp/1e3))+"]")]),n("span",{domProps:{innerHTML:e._s(t.message)}})])})),0),n("div",{ref:"end"})],1),n("v-card-actions",[n("v-spacer"),n("v-btn",{attrs:{text:""},domProps:{textContent:e._s(e.$t("close"))},on:{click:e.closeDialog}})],1)],1)],1)},pr=[],fr=function(e){Object(Re["a"])(n,e);var t=Object(Ce["a"])(n);function n(){var e;return Object(r["a"])(this,n),e=t.apply(this,arguments),e.logs=[],e}return Object(s["a"])(n,[{key:"dialogWidth",get:function(){return this.$vuetify.breakpoint.smAndDown?"100%":"70%"}},{key:"phoneLayout",get:function(){return this.$vuetify.breakpoint.xsOnly}},{key:"closeDialog",value:function(){return!1}},{key:"getLogs",value:function(){var e=Object(B["a"])(regeneratorRuntime.mark((function e(){var t,n;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return t=this.logs.length?this.logs[this.logs.length-1].id:-1,e.next=3,ie.getLogs(t);case 3:if(n=e.sent,!this.destroy){e.next=6;break}return e.abrupt("return");case 6:if(!n.length){e.next=11;break}return this.logs=this.logs.concat(n),e.next=10,this.$nextTick();case 10:this.$refs.end.scrollIntoView();case 11:case"end":return e.stop()}}),e,this)})));function t(){return e.apply(this,arguments)}return t}()},{key:"created",value:function(){this.setTaskAndRun(this.getLogs)}}]),n}(Jn);Object(Pe["a"])([Object(dt["c"])(Boolean)],fr.prototype,"value",void 0),Object(Pe["a"])([Object(dt["b"])("input")],fr.prototype,"closeDialog",null),fr=Object(Pe["a"])([Object(ut["b"])({filters:{formatType:function(e){var t={1:"N",2:"I",4:"W",8:"C"};return t[e]},typeColor:function(e){var t={1:null,2:"info--text",4:"warning--text",8:"error--text"};return t[e]}}})],fr);var hr=fr,vr=hr,mr=(n("1d3e"),Object(Me["a"])(vr,dr,pr,!1,null,"25ee86f6",null)),gr=mr.exports;He()(mr,{VBtn:We["a"],VCard:Ke["a"],VCardActions:Qe["a"],VCardText:Qe["b"],VCardTitle:Qe["c"],VDialog:Je["a"],VIcon:Ot["a"],VProgressLinear:En["a"],VSpacer:Ye["a"]});var _r=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("v-dialog",{attrs:{value:e.value,fullscreen:"",persistent:""},on:{input:function(t){return e.$emit("input",t)}}},[n("v-card",[n("v-card-title",{staticClass:"headline"},[n("v-icon",{staticClass:"mr-2"},[e._v("mdi-rss-box")]),n("span",[e._v("RSS")]),n("v-spacer"),n("v-btn",{attrs:{icon:""},on:{click:e.closeDialog}},[n("v-icon",[e._v("mdi-close")])],1)],1),n("v-card-text",[n("div",{staticClass:"toolbar"},[n("v-btn",{attrs:{icon:"",title:e.$t("dialog.rss.add_feed")},on:{click:e.addRssItem}},[n("v-icon",[e._v("mdi-link-plus")])],1),n("v-btn",{attrs:{icon:"",disabled:!e.selectNode,title:e.$t("delete")},on:{click:e.deleteRssItem}},[n("v-icon",[e._v("mdi-delete")])],1),n("v-btn",{attrs:{icon:"",disabled:!e.selectNode,title:e.$t("rename")},on:{click:e.renameRssItem}},[n("v-icon",[e._v("mdi-file-move")])],1),n("v-divider",{attrs:{vertical:""}}),n("v-btn",{attrs:{icon:"",disabled:!e.selectNode,title:e.$t("refresh")},on:{click:e.refreshRssItem}},[n("v-icon",[e._v("mdi-refresh")])],1),n("v-spacer"),n("v-divider",{attrs:{vertical:""}}),n("v-switch",{attrs:{"input-value":e.preferences.rss_processing_enabled,label:e.$t("dialog.rss.auto_refresh"),"hide-details":""},on:{change:function(t){return e.changePreference("rss_processing_enabled",t)}}}),n("v-divider",{attrs:{vertical:""}}),n("v-switch",{attrs:{"input-value":e.preferences.rss_auto_downloading_enabled,label:e.$t("dialog.rss.auto_download"),"hide-details":""},on:{change:function(t){return e.changePreference("rss_auto_downloading_enabled",t)}}}),n("v-divider",{attrs:{vertical:""}}),n("v-btn",{attrs:{icon:"",title:e.$t("settings")},on:{click:function(t){e.showRulesDialog=!0}}},[n("v-icon",[e._v("mdi-cog-box")])],1)],1),n("v-divider"),n("div",{staticClass:"content"},[n("div",{staticClass:"content-inner"},[e.rssNode?[n("div",{staticClass:"rss-items"},[n("v-treeview",{attrs:{"open-on-click":"","open-all":"",items:e.rssTree,"item-key":"path",activatable:"",dense:""},on:{"update:active":function(t){e.selectNode=t[0]}},scopedSlots:e._u([{key:"prepend",fn:function(t){return[e.isItemLoading(t)?n("v-progress-circular",{attrs:{indeterminate:"",size:"22",width:"2"}}):n("v-icon",{domProps:{textContent:e._s(e.getRowIcon(t))}})]}},{key:"label",fn:function(t){return[e._v(" "+e._s(t.item.name)+" "),t.item.children?[e._v(" ("+e._s(t.item.children.length)+") ")]:e._e()]}}])})],1),n("v-divider",{attrs:{vertical:""}}),n("div",{staticClass:"rss-details"},[n("div",{staticClass:"rss-info"},[n("p",[e._v(" "+e._s(e.$t("title._"))+": "),e.selectItem?n("a",{attrs:{target:"_blank",href:e.selectItem.url}},[e._v(e._s(e.selectItem.title))]):e._e()]),n("p",[e._v(e._s(e.$t("date"))+": "+e._s(e._f("date")(e.selectItem?e.selectItem.lastBuildDate:null)))])]),n("v-divider"),n("div",{staticClass:"list-wrapper"},[e.selectItem?n("v-list",{attrs:{dense:""}},[n("v-list-item-group",{attrs:{color:"primary"},model:{value:e.selectArticle,callback:function(t){e.selectArticle=t},expression:"selectArticle"}},e._l(e.sortArticles(e.selectItem.articles),(function(t){return n("v-list-item",{key:t.id,attrs:{value:t}},[n("v-list-item-content",[n("v-list-item-title",[n("span",{attrs:{title:t.title},domProps:{textContent:e._s(t.title)}})])],1),n("v-list-item-action",[n("v-btn",{attrs:{icon:""},on:{click:function(n){return n.stopPropagation(),e.downloadTorrent(t)}}},[n("v-icon",[e._v("mdi-download")])],1)],1)],1)})),1)],1):e._e()],1)],1),n("v-divider",{attrs:{vertical:""}}),n("div",{staticClass:"rss-desc"},[n("div",{staticClass:"rss-info"},[n("p",[e._v(" "+e._s(e.$t("title._"))+": "),e.selectArticle?n("a",{attrs:{target:"_blank",href:e.selectArticle.link}},[e._v(e._s(e.selectArticle.title))]):e._e()]),n("p",[e._v(e._s(e.$t("category",1)+": "+(e.selectArticle?e.selectArticle.category:"")))]),n("p",[e._v(e._s(e.$t("date"))+": "+e._s(e._f("date")(e.selectArticle?e.selectArticle.date:null)))])]),n("v-divider"),e.selectArticle?n("iframe",{directives:[{name:"body",rawName:"v-body",value:e.selectArticle.description,expression:"selectArticle.description"}],staticClass:"iframe",attrs:{sandbox:"allow-same-origin"}}):e._e()],1)]:n("div",{staticClass:"loading"},[n("v-progress-circular",{attrs:{indeterminate:""}})],1)],2)])],1)],1),e.showRulesDialog?n("RssRulesDialog",{attrs:{"rss-node":e.rssNode},model:{value:e.showRulesDialog,callback:function(t){e.showRulesDialog=t},expression:"showRulesDialog"}}):e._e()],1)},br=[],yr=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("v-dialog",{attrs:{value:e.value,persistent:"",width:"50%"},on:{input:function(t){return e.$emit("input",t)}}},[n("v-card",[n("v-card-title",{staticClass:"headline"},[n("v-icon",{staticClass:"mr-2"},[e._v("mdi-filter")]),n("span",{domProps:{textContent:e._s(e.$t("dialog.rss_rule.title"))}}),n("v-spacer"),n("v-btn",{attrs:{icon:""},on:{click:e.closeDialog}},[n("v-icon",[e._v("mdi-close")])],1)],1),n("v-card-text",[n("div",{staticClass:"toolbar"},[n("v-btn",{attrs:{icon:"",title:e.$t("dialog.rss_rule.add_rule")},on:{click:e.addRssRule}},[n("v-icon",[e._v("mdi-plus")])],1),n("v-btn",{attrs:{icon:"",disabled:!e.selectedRuleName,title:e.$t("delete")},on:{click:e.deleteRssRule}},[n("v-icon",[e._v("mdi-delete")])],1)],1),n("v-divider"),n("div",{staticClass:"content"},[e.rssRules?[n("div",{staticClass:"rss-rules"},[n("v-list",{attrs:{dense:""}},[n("v-list-item-group",{attrs:{color:"primary"},model:{value:e.selectedRuleName,callback:function(t){e.selectedRuleName=t},expression:"selectedRuleName"}},e._l(e.rssRules,(function(t,a){return n("v-list-item",{key:a,attrs:{value:a}},[n("v-list-item-action",[n("v-checkbox",{attrs:{dense:""},model:{value:t.enabled,callback:function(n){e.$set(t,"enabled",n)},expression:"value.enabled"}})],1),n("v-list-item-content",[n("v-list-item-title",{domProps:{textContent:e._s(a)}})],1)],1)})),1)],1)],1),n("v-divider",{attrs:{vertical:""}}),n("div",{staticClass:"rule-details"},[n("v-form",{staticClass:"rule-form"},[n("p",{staticClass:"form-title",domProps:{textContent:e._s(e.$t("dialog.rss_rule.rule_settings"))}}),n("v-checkbox",{attrs:{dense:"",label:e.$t("dialog.rss_rule.use_regex"),disabled:!e.selectedRule.enabled,value:e.selectedRule.useRegex},on:{change:function(t){return e.editRule("useRegex",t)}}}),n("v-text-field",{attrs:{dense:"",label:e.$t("dialog.rss_rule.must_contain"),disabled:!e.selectedRule.enabled,value:e.selectedRule.mustContain},on:{change:function(t){return e.editRule("mustContain",t)}}}),n("v-text-field",{attrs:{dense:"",label:e.$t("dialog.rss_rule.must_not_contain"),disabled:!e.selectedRule.enabled,value:e.selectedRule.mustNotContain},on:{change:function(t){return e.editRule("mustNotContain",t)}}}),n("v-text-field",{attrs:{dense:"",label:e.$t("dialog.rss_rule.episode_filter"),disabled:!e.selectedRule.enabled,value:e.selectedRule.episodeFilter},on:{change:function(t){return e.editRule("episodeFilter",t)}}}),n("v-checkbox",{attrs:{dense:"",label:e.$t("dialog.rss_rule.smart_episode"),disabled:!e.selectedRule.enabled,value:e.selectedRule.smartFilter},on:{change:function(t){return e.editRule("smartFilter",t)}}}),n("v-select",{attrs:{dense:"",label:e.$t("dialog.rss_rule.assign_category"),items:e.categoryItems,disabled:!e.selectedRule.enabled,value:e.selectedRule.assignedCategory},on:{change:function(t){return e.editRule("assignedCategory",t)}}}),n("v-text-field",{attrs:{dense:"",label:e.$t("location"),disabled:!e.selectedRule.enabled,value:e.selectedRule.savePath},on:{change:function(t){return e.editRule("savePath",t)}}})],1),n("v-divider"),n("p",{staticClass:"feeds-title",domProps:{textContent:e._s(e.$t("dialog.rss_rule.apply_to_feeds"))}}),e.selectedRule.enabled?n("v-list",{attrs:{dense:""}},e._l(e.rssItems,(function(t){return n("v-list-item",{key:t.value},[n("v-list-item-action",[n("v-checkbox",{attrs:{dense:"","input-value":e.hasSelectSite(t.value)},on:{change:function(n){return e.selectSite(t.value,n)}}})],1),n("v-list-item-content",[n("v-list-item-title",{domProps:{textContent:e._s(t.text)}})],1)],1)})),1):e._e()],1)]:n("div",{staticClass:"loading"},[n("v-progress-circular",{attrs:{indeterminate:""}})],1)],2)],1)],1)],1)},kr=[],wr=function(e){Object(Re["a"])(n,e);var t=Object(Ce["a"])(n);function n(){var e;return Object(r["a"])(this,n),e=t.apply(this,arguments),e.rssRules=null,e.selectedRuleName=null,e}return Object(s["a"])(n,[{key:"selectedRule",get:function(){return this.selectedRuleName&&this.selectedRuleName in this.rssRules?this.rssRules[this.selectedRuleName]:{}},set:function(e){this.rssRules[this.selectedRuleName]=e}},{key:"categoryItems",get:function(){var e={key:"",name:S("uncategorized")};return[e].concat(Object(N["a"])(this.allCategories)).map((function(e){return{text:e.name,value:e.key}}))}},{key:"rssItems",get:function(){return this.buildRssItems(this.rssNode)}},{key:"hasSelectSite",value:function(e){return this.selectedRule.affectedFeeds.includes(e)}},{key:"selectSite",value:function(e,t){var n=Object(h["cloneDeep"])(this.selectedRule),a=n.affectedFeeds;t?a.push(e):Object(h["pull"])(a,e),this.selectedRule=n}},{key:"editRule",value:function(e,t){var n=Object(h["cloneDeep"])(this.selectedRule);n[e]=t,this.selectedRule=n}},{key:"buildRssItems",value:function(e){for(var t=[],n=0,a=Object.entries(e);n");n.head.insertAdjacentHTML("beforeend",r),n.body.innerHTML=t.value},update:function(e,t){if(t.oldValue!==t.value){var n=e.contentDocument.body;n.innerHTML=t.value,n.scrollTo({top:0})}}}}})],Pr);var Tr=Pr,Dr=Tr,Lr=(n("7c77"),Object(Me["a"])(Dr,_r,br,!1,null,"763d8c6c",null)),Vr=Lr.exports;He()(Lr,{VBtn:We["a"],VCard:Ke["a"],VCardText:Qe["b"],VCardTitle:Qe["c"],VDialog:Je["a"],VDivider:Un["a"],VIcon:Ot["a"],VList:Qt["a"],VListItem:Ut["a"],VListItemAction:Ya["a"],VListItemContent:Et["a"],VListItemGroup:Sr["a"],VListItemTitle:Et["b"],VProgressCircular:fa["a"],VSpacer:Ye["a"],VSwitch:or["a"],VTreeview:ha["a"]});var Ir=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("v-dialog",{attrs:{value:e.value,scrollable:"",fullscreen:"",persistent:""},on:{input:function(t){return e.$emit("input",t)}}},[n("v-card",[n("v-card-title",{staticClass:"headline"},[n("v-icon",{staticClass:"mr-2"},[e._v("mdi-card-search-outline")]),n("span",{domProps:{textContent:e._s(e.$t("search"))}}),n("v-spacer"),n("v-btn",{attrs:{icon:""},on:{click:e.closeDialog}},[n("v-icon",[e._v("mdi-close")])],1)],1),n("v-card-text",[n("SearchDialogForm",{attrs:{loading:e.loading},on:{triggerSearch:e.triggerSearch,stopSearch:e.stopSearch}}),n("v-data-table",{staticClass:"elevation-1",attrs:{headers:e.grid.headers,items:e.grid.searchItems,"items-per-page":10,loading:e.loading},scopedSlots:e._u([{key:"item.fileName",fn:function(t){var a=t.item;return[n("a",{attrs:{href:a.descrLink,target:"_blank"},domProps:{textContent:e._s(a.fileName)}})]}},{key:"item.fileSize",fn:function(t){var n=t.item;return[e._v(" "+e._s(e._f("formatSize")(n.fileSize))+" ")]}},{key:"item.actions",fn:function(t){var a=t.item;return[n("v-icon",{on:{click:function(t){return e.downloadTorrent(a)}}},[e._v("mdi-download")])]}}],null,!0)})],1),n("v-card-actions",[n("v-btn",{on:{click:e.openPluginManager}},[n("v-icon",[e._v("mdi-cog")]),e._v(" "+e._s(e.$t("plugin_manager"))+" ")],1)],1)],1)],1),n("PluginManager")],1)},Br=[],Ur=(n("a434"),n("fb6a"),function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("v-form",{ref:"form",model:{value:e.searchForm.valid,callback:function(t){e.$set(e.searchForm,"valid",t)},expression:"searchForm.valid"}},[n("v-container",{attrs:{fluid:""}},[n("v-row",[n("v-col",{staticClass:"col-12 col-sm-6 col-md-9"},[n("v-text-field",{attrs:{"prepend-inner-icon":"mdi-magnify",label:e.$t("search"),rules:[function(t){return!!t||e.$t("msg.item_is_required",{item:e.$t("query")})}],clearable:""},on:{keypress:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"enter",13,t.key,"Enter")?null:e.$refs.searchButton.click.apply(null,arguments)}},model:{value:e.searchForm.pattern,callback:function(t){e.$set(e.searchForm,"pattern",t)},expression:"searchForm.pattern"}}),n("v-btn",{ref:"searchButton",attrs:{disabled:!e.searchForm.valid,color:e.loading?"warning":"primary"},on:{click:function(t){e.loading?e.stopSearch():e.triggerSearch()}}},[e._v(" "+e._s(e.loading?e.$t("stop"):e.$t("search"))+" ")])],1),n("v-col",{staticClass:"col__plugins"},[n("v-btn",{staticClass:"btn",attrs:{loading:void 0===e.searchPlugins,disabled:null===e.searchPlugins,type:"button"},on:{click:function(t){e.plugginSelectorOpen=!0}}},[e._v(" "+e._s(e.$t("plugin",2))+" ")]),this.$vuetify.breakpoint.mobile?e._e():n("v-dialog",{attrs:{"max-width":"20rem"},model:{value:e.plugginSelectorOpen,callback:function(t){e.plugginSelectorOpen=t},expression:"plugginSelectorOpen"}},[n("v-card",[n("v-card-title",[e._v(" "+e._s(e.$t("plugin",1))+" "+e._s(e.$t("usage"))+" "),n("v-spacer"),n("v-btn",{attrs:{small:"",color:e.searchForm.plugins.length>0?"primary":""},on:{click:e.toggleSelectAll}},[e._v(" "+e._s(e.$t("all"))+" ")])],1),n("v-divider"),n("v-card-text",e._l(e.availablePlugins,(function(t,a){return n("v-checkbox",{key:a,attrs:{label:t.fullName,value:t},model:{value:e.searchForm.plugins,callback:function(t){e.$set(e.searchForm,"plugins",t)},expression:"searchForm.plugins"}})})),1)],1)],1),this.$vuetify.breakpoint.mobile?n("v-bottom-sheet",{attrs:{scrollable:"",inset:""},model:{value:e.plugginSelectorOpen,callback:function(t){e.plugginSelectorOpen=t},expression:"plugginSelectorOpen"}},[n("v-sheet",{staticClass:"text-center"},[n("v-card",[n("v-card-title",[e._v(" "+e._s(e.$t("plugin",1))+" "+e._s(e.$t("usage"))+" "),n("v-spacer"),n("v-btn",{attrs:{small:"",color:e.searchForm.plugins.length>0?"primary":""},on:{click:e.toggleSelectAll}},[e._v(" "+e._s(e.$t("all"))+" ")])],1),n("v-divider"),n("v-card-text",e._l(e.availablePlugins,(function(t,a){return n("v-checkbox",{key:a,attrs:{label:t.fullName,value:t},model:{value:e.searchForm.plugins,callback:function(t){e.$set(e.searchForm,"plugins",t)},expression:"searchForm.plugins"}})})),1)],1)],1)],1):e._e()],1),n("v-col",{attrs:{"align-self":"center"}},[n("v-autocomplete",{attrs:{items:e.availableCategories,"item-text":"name","item-value":"key",label:e.$t("category",1)},model:{value:e.searchForm.category,callback:function(t){e.$set(e.searchForm,"category",t)},expression:"searchForm.category"}})],1)],1)],1)],1)}),Er=[],Fr="all",zr={key:Fr,name:S("all")},qr=function(e){Object(Re["a"])(n,e);var t=Object(Ce["a"])(n);function n(){var e;return Object(r["a"])(this,n),e=t.apply(this,arguments),e.loading=!1,e.plugginSelectorOpen=!1,e.availablePlugins=[],e.searchForm={valid:!1,category:Fr,pattern:"",plugins:[]},e}return Object(s["a"])(n,[{key:"hasSelectAllPlugins",get:function(){var e;return this.searchForm.plugins.length===(null===(e=this.availablePlugins)||void 0===e?void 0:e.length)}},{key:"availableCategories",get:function(){if(this.hasSelectAllPlugins)return[zr];var e=[zr,{divider:!0}],t=h["intersection"].apply(void 0,Object(N["a"])(this.searchForm.plugins.map((function(e){return e.supportedCategories})))).map((function(e){return{key:e,name:e}}));return e.push.apply(e,Object(N["a"])(t)),e}},{key:"toggleSelectAll",value:function(){this.searchForm.plugins=this.hasSelectAllPlugins?[]:this.availablePlugins.slice()}},{key:"searchPluginsUpdated",value:function(e){e?(this.availablePlugins=this.searchPlugins.filter((function(e){return e.enabled})),this.toggleSelectAll()):this.availablePlugins=[]}},{key:"triggerSearch",value:function(){if(this.searchForm.valid){var e=this.hasSelectAllPlugins?Fr:this.searchForm.plugins.map((function(e){return e.name})).join("|"),t=Object.assign({},this.searchForm,{plugins:e});return t}}},{key:"stopSearch",value:function(){}},{key:"onPluginChanged",value:function(){var e=this;this.availableCategories.find((function(t){return t.key===e.searchForm.category}))||(this.searchForm.category=Fr)}}]),n}(a["default"]);Object(Pe["a"])([Object(dt["c"])(Boolean)],qr.prototype,"loading",void 0),Object(Pe["a"])([Object(dt["e"])("searchPlugins")],qr.prototype,"searchPluginsUpdated",null),Object(Pe["a"])([Object(dt["b"])("triggerSearch")],qr.prototype,"triggerSearch",null),Object(Pe["a"])([Object(dt["b"])("stopSearch")],qr.prototype,"stopSearch",null),Object(Pe["a"])([Object(dt["e"])("searchForm.plugins")],qr.prototype,"onPluginChanged",null),qr=Object(Pe["a"])([Object(dt["a"])({computed:Object(X["a"])({},Object(U["c"])({searchPlugins:"allSearchPlugins"}))})],qr);var Nr=qr,$r=Nr,Mr=(n("4284"),n("c6a6")),Gr=n("288c"),Hr=n("8dd9"),Wr=Object(Me["a"])($r,Ur,Er,!1,null,"50ebf5de",null),Kr=Wr.exports;He()(Wr,{VAutocomplete:Mr["a"],VBottomSheet:Gr["a"],VBtn:We["a"],VCard:Ke["a"],VCardText:Qe["b"],VCardTitle:Qe["c"],VCheckbox:gt["a"],VCol:_t["a"],VContainer:yt["a"],VDialog:Je["a"],VDivider:Un["a"],VForm:wt["a"],VRow:xt["a"],VSheet:Hr["a"],VSpacer:Ye["a"],VTextField:Ze["a"]});var Qr=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("v-dialog",{attrs:{"max-width":"20rem",scrollable:""},model:{value:e.searchEngineState.isPluginManagerOpen,callback:function(t){e.$set(e.searchEngineState,"isPluginManagerOpen",t)},expression:"searchEngineState.isPluginManagerOpen"}},[n("v-card",[n("v-card-title",[n("v-icon",[e._v("mdi-toy-brick")]),e._v(" "+e._s(e.$t("plugin_manager"))+" ")],1),n("v-card-text",e._l(e.searchEngineState.searchPlugins,(function(t,a){return n("v-switch",{key:a,attrs:{"input-value":t.enabled,label:t.fullName},on:{change:function(n){return e.togglePluginAvailability(t)}}})})),1),n("v-card-actions",[n("v-btn",{attrs:{color:"warning"},on:{click:function(t){return e.updatePlugins()}}},[e._v(" "+e._s(e.$t("update_plugins"))+" ")])],1)],1)],1)},Jr=[],Yr=function(e){Object(Re["a"])(n,e);var t=Object(Ce["a"])(n);function n(){return Object(r["a"])(this,n),t.apply(this,arguments)}return Object(s["a"])(n,[{key:"togglePluginAvailability",value:function(e){this.togglePluginAvailabilityAction(e)}},{key:"updatePlugins",value:function(){this.updatePluginsRequest()}}]),n}(a["default"]);Yr=Object(Pe["a"])([Object(ut["b"])({computed:Object(X["a"])({},Object(U["e"])({searchEngineState:"searchEngine"})),methods:Object(X["a"])({},Object(U["b"])({togglePluginAvailabilityAction:"togglePluginAvailability",updatePluginsRequest:"updatePluginsRequest"}))})],Yr);var Zr=Yr,Xr=Zr,es=Object(Me["a"])(Xr,Qr,Jr,!1,null,null,null),ts=es.exports;He()(es,{VBtn:We["a"],VCard:Ke["a"],VCardActions:Qe["a"],VCardText:Qe["b"],VCardTitle:Qe["c"],VDialog:Je["a"],VIcon:Ot["a"],VSwitch:or["a"]});var ns=function(e){Object(Re["a"])(n,e);var t=Object(Ce["a"])(n);function n(){var e;return Object(r["a"])(this,n),e=t.apply(this,arguments),e._searchId=0,e.grid={searchItems:[],downloadItem:{descrLink:"",fileName:"",fileSize:0,fileUrl:"",nbLeechers:0,nbSeeders:0,siteUrl:""},headers:[{text:S("name"),value:"fileName"},{text:S("size"),value:"fileSize"},{text:S("seeds"),value:"nbSeeders"},{text:S("peers"),value:"nbLeechers"},{text:S("search_engine"),value:"siteUrl"},{text:S("action",2),value:"actions",sortable:!1}]},e.loading=!1,e}return Object(s["a"])(n,[{key:"mounted",value:function(){this.loadSearchPlugins()}},{key:"downloadTorrent",value:function(){var e=Object(B["a"])(regeneratorRuntime.mark((function e(t){return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:this.addFormDownloadItem({downloadItem:{title:t.fileName,url:t.fileUrl}}),this.openAddForm();case 2:case"end":return e.stop()}}),e,this)})));function t(t){return e.apply(this,arguments)}return t}()},{key:"stopSearch",value:function(){var e=Object(B["a"])(regeneratorRuntime.mark((function e(){return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return this.cancelTask(),e.next=3,this._stopSearch(this._searchId);case 3:this.loading=!1;case 4:case"end":return e.stop()}}),e,this)})));function t(){return e.apply(this,arguments)}return t}()},{key:"closeDialog",value:function(){return!1}},{key:"triggerSearch",value:function(){var e=Object(B["a"])(regeneratorRuntime.mark((function e(t){var n;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return this.grid.searchItems=[],this.loading=!0,e.prev=2,e.next=5,this._startSearch(t);case 5:n=e.sent,this._searchId=n.id,this.setTaskAndRun(this.task(n.id)),e.next=12;break;case 10:e.prev=10,e.t0=e["catch"](2);case 12:case"end":return e.stop()}}),e,this,[[2,10]])})));function t(t){return e.apply(this,arguments)}return t}()},{key:"_startSearch",value:function(){var e=Object(B["a"])(regeneratorRuntime.mark((function e(t){var n;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return e.next=2,ie.startSearch(t.pattern,t.plugins,t.category);case 2:return n=e.sent,e.abrupt("return",n);case 4:case"end":return e.stop()}}),e)})));function t(t){return e.apply(this,arguments)}return t}()},{key:"_stopSearch",value:function(){var e=Object(B["a"])(regeneratorRuntime.mark((function e(t){return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return e.next=2,ie.stopSearch(t);case 2:this._searchId=0;case 3:case"end":return e.stop()}}),e,this)})));function t(t){return e.apply(this,arguments)}return t}()},{key:"task",value:function(e){var t=this;return Object(B["a"])(regeneratorRuntime.mark((function n(){var a,r,s;return regeneratorRuntime.wrap((function(n){while(1)switch(n.prev=n.next){case 0:return n.next=2,ie.getSearchResults(e);case 2:return a=n.sent,r="Stopped"===a.status,s=t.grid.searchItems,s.splice.apply(s,[s.length,0].concat(Object(N["a"])(a.results.slice(s.length)))),r&&(t.loading=!1),n.abrupt("return",r);case 8:case"end":return n.stop()}}),n)})))}}]),n}(Jn);Object(Pe["a"])([Object(dt["c"])(Boolean)],ns.prototype,"value",void 0),Object(Pe["a"])([Object(dt["b"])("input")],ns.prototype,"closeDialog",null),ns=Object(Pe["a"])([Object(dt["a"])({components:{SearchDialogForm:Kr,PluginManager:ts},computed:Object(X["a"])({},Object(U["c"])({allCategories:"allCategories",preferences:"preferences"})),methods:Object(X["a"])(Object(X["a"])({},Object(U["d"])(["openAddForm","setPasteUrl","addFormDownloadItem","openPluginManager"])),Object(U["b"])({loadSearchPlugins:"fetchSearchPlugins"}))})],ns);var as=ns,rs=as,ss=(n("d935"),Object(Me["a"])(rs,Ir,Br,!1,null,"2425d8a7",null)),is=ss.exports;He()(ss,{VBtn:We["a"],VCard:Ke["a"],VCardActions:Qe["a"],VCardText:Qe["b"],VCardTitle:Qe["c"],VDataTable:wa["a"],VDialog:Je["a"],VIcon:Ot["a"],VSpacer:Ye["a"]});var os=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("v-dialog",{attrs:{value:e.value,scrollable:"",persistent:"","max-width":"720px"},on:{input:function(t){return e.$emit("input",t)}}},[n("v-card",[n("v-card-title",{staticClass:"headline"},[n("v-icon",{staticClass:"mr-2"},[e._v("mdi-cog")]),n("span",{domProps:{textContent:e._s(e.$t("settings"))}}),n("v-spacer"),n("v-btn",{attrs:{icon:""},on:{click:e.closeDialog}},[n("v-icon",[e._v("mdi-close")])],1)],1),n("v-card-text",[n("v-tabs",{model:{value:e.tab,callback:function(t){e.tab=t},expression:"tab"}},e._l(e.tabList,(function(t){return n("v-tab",{key:t},[e._v(" "+e._s(e.$t("preferences."+t))+" ")])})),1),n("v-fade-transition",[n("v-alert",{directives:[{name:"show",rawName:"v-show",value:e.preferenceUpdated,expression:"preferenceUpdated"}],attrs:{dense:"",text:"",type:"success"}},[e._v(" "+e._s(e.$t("preferences.change_applied"))+" ")])],1),n("v-tabs-items",{model:{value:e.tab,callback:function(t){e.tab=t},expression:"tab"}},[n("v-tab-item",{key:"downloads"},[n("download-settings")],1),n("v-tab-item",{key:"speed"},[n("speed-settings")],1),n("v-tab-item",{key:"rss"},[n("rss-settings")],1),n("v-tab-item",{key:"webui"},[n("web-u-i-settings")],1)],1)],1)],1)],1)],1)},cs=[],ls=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("v-container",[n("h4",[e._v(e._s(e.$t("preferences.adding_torrent")))]),n("v-divider"),n("v-container",{staticClass:"px-0",attrs:{fluid:""}},[n("v-switch",{attrs:{"input-value":e.preferences.create_subfolder_enabled,label:e.$t("preferences.create_subfolder_enabled")},on:{change:function(t){return e.changeSettings("create_subfolder_enabled",!e.preferences.create_subfolder_enabled)}}}),n("v-switch",{attrs:{"input-value":e.preferences.start_paused_enabled,label:e.$t("preferences.start_paused_enabled")},on:{change:function(t){return e.changeSettings("start_paused_enabled",!e.preferences.start_paused_enabled)}}}),n("v-switch",{attrs:{"input-value":e.preferences.auto_delete_mode,label:e.$t("preferences.auto_delete_mode")},on:{change:function(t){return e.changeSettings("auto_delete_mode",!e.preferences.auto_delete_mode)}}})],1),n("v-divider"),n("v-container",{staticClass:"px-0",attrs:{fluid:""}},[n("v-switch",{attrs:{"input-value":e.preferences.preallocate_all,label:e.$t("preferences.preallocate_all")},on:{change:function(t){return e.changeSettings("preallocate_all",!e.preferences.preallocate_all)}}}),n("v-switch",{attrs:{"input-value":e.preferences.incomplete_files_ext,label:e.$t("preferences.incomplete_files_ext")},on:{change:function(t){return e.changeSettings("incomplete_files_ext",!e.preferences.incomplete_files_ext)}}})],1),n("h4",[e._v(e._s(e.$t("preferences.saving_management")))]),n("v-divider"),n("v-container",{staticClass:"px-0",attrs:{fluid:""}},[n("preference-row",{attrs:{"i18n-key":"auto_tmm_enabled"}},[n("v-select",{attrs:{items:e.torrentMode,value:e.preferences.auto_tmm_enabled?e.torrentMode[0]:e.torrentMode[1]},on:{change:function(t){return e.changeSettings("auto_tmm_enabled",t==e.torrentMode[0])}}})],1),n("preference-row",{attrs:{"i18n-key":"torrent_changed_tmm_enabled"}},[n("v-select",{attrs:{items:e.torrentAction,value:e.preferences.category_changed_tmm_enabled?e.torrentAction[1]:e.torrentAction[0]},on:{change:function(t){return e.changeSettings("torrent_changed_tmm_enabled",t==e.torrentAction[1])}}})],1),n("preference-row",{attrs:{"i18n-key":"save_path_changed_tmm_enabled"}},[n("v-select",{attrs:{items:e.torrentAction,value:e.preferences.category_changed_tmm_enabled?e.torrentAction[1]:e.torrentAction[0]},on:{change:function(t){return e.changeSettings("save_path_changed_tmm_enabled",t==e.torrentAction[1])}}})],1),n("preference-row",{attrs:{"i18n-key":"category_changed_tmm_enabled"}},[n("v-select",{attrs:{items:e.torrentAction,value:e.preferences.category_changed_tmm_enabled?e.torrentAction[1]:e.torrentAction[0]},on:{change:function(t){return e.changeSettings("category_changed_tmm_enabled",t==e.torrentAction[1])}}})],1),n("preference-row",{attrs:{"i18n-key":"save_path"}},[n("v-text-field",{attrs:{value:e.preferences.save_path,lazy:""},on:{change:function(t){return e.changeSettings("save_path",t)}}})],1),n("preference-row",{attrs:{"i18n-key":"temp_path"},scopedSlots:e._u([{key:"header",fn:function(){return[n("v-checkbox",{attrs:{value:e.preferences.temp_path_enabled},on:{change:function(t){return e.changeSettings("temp_path_enabled",t)}}})]},proxy:!0}])},[n("v-text-field",{attrs:{disabled:!e.preferences.temp_path_enabled,value:e.preferences.temp_path,lazy:""},on:{change:function(t){return e.changeSettings("temp_path",t)}}})],1),n("preference-row",{attrs:{"i18n-key":"export_dir","can-be-enabled":"true"}},[n("v-text-field",{attrs:{value:e.preferences.export_dir,lazy:"",clearable:""},on:{change:function(t){return e.changeSettings("export_dir",t)}}})],1),n("preference-row",{attrs:{"i18n-key":"export_dir_fin","can-be-enabled":"true"}},[n("v-text-field",{attrs:{value:e.preferences.export_dir_fin,lazy:"",clearable:""},on:{change:function(t){return e.changeSettings("export_dir_fin",t)}}})],1)],1)],1)},us=[],ds=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("v-row",{attrs:{align:"center",dense:""}},[n("v-col",{attrs:{cols:"3"}},[n("v-subheader",{domProps:{textContent:e._s(e.$t("preferences."+this.$props.i18nKey))}})],1),n("v-col",{attrs:{cols:"4"}},[e._t("default")],2),e.$slots.header?n("v-col",{attrs:{cols:"auto"}},[e._t("header")],2):e._e()],1)},ps=[],fs=function(e){Object(Re["a"])(n,e);var t=Object(Ce["a"])(n);function n(){return Object(r["a"])(this,n),t.apply(this,arguments)}return n}(a["default"]);Object(Pe["a"])([Object(dt["c"])(String)],fs.prototype,"i18nKey",void 0),fs=Object(Pe["a"])([dt["a"]],fs);var hs=fs,vs=hs,ms=Object(Me["a"])(vs,ds,ps,!1,null,null,null),gs=ms.exports;He()(ms,{VCol:_t["a"],VRow:xt["a"],VSubheader:Xa["a"]});var _s=function(e){Object(Re["a"])(n,e);var t=Object(Ce["a"])(n);function n(){var e;return Object(r["a"])(this,n),e=t.apply(this,arguments),e.torrentAction=[S("preferences.switch_torrent_mode_to_manual"),S("preferences.move_affected_torrent")],e.torrentMode=[S("preferences.auto_mode"),S("preferences.manual_mode")],e}return Object(s["a"])(n,[{key:"changeSettings",value:function(e,t){this.updatePreferencesRequest(Object(C["a"])({},e,t))}}]),n}(a["default"]);_s=Object(Pe["a"])([Object(dt["a"])({components:{PreferenceRow:gs},computed:Object(X["a"])({},Object(U["c"])({preferences:"allPreferences"})),methods:Object(X["a"])({},Object(U["b"])({updatePreferencesRequest:"updatePreferencesRequest"}))})],_s);var bs=_s,ys=bs,ks=(n("d602"),Object(Me["a"])(ys,ls,us,!1,null,"2e1e1380",null)),ws=ks.exports;He()(ks,{VCheckbox:gt["a"],VContainer:yt["a"],VDivider:Un["a"],VSelect:Ar["a"],VSwitch:or["a"],VTextField:Ze["a"]});var Os=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("v-container",[n("v-container",{attrs:{fluid:""}},[n("v-container",[n("v-row",{attrs:{justify:"center"}},[n("v-col",{attrs:{cols:"12",md:"4"}},[n("h4",[e._v(" "+e._s(e.$t("preferences.global_rate_limits")))]),n("v-text-field",{attrs:{label:e.$t("preferences.dl_limit"),placeholder:e.convertToKB(e.preferences.dl_limit),lazy:""},on:{change:function(t){e.changeSettings("dl_limit",e.convertToBytes(t))}}}),n("v-text-field",{attrs:{label:e.$t("preferences.up_limit"),placeholder:e.convertToKB(e.preferences.up_limit),lazy:""},on:{change:function(t){e.changeSettings("up_limit",e.convertToBytes(t))}}})],1),n("v-col",{attrs:{cols:"12",md:"4"}},[n("h4",[e._v(" "+e._s(e.$t("preferences.alternate_rate_limits")))]),n("v-text-field",{attrs:{type:"number",label:e.$t("preferences.dl_limit"),placeholder:e.convertToKB(e.preferences.alt_dl_limit),lazy:""},on:{change:function(t){e.changeSettings("alt_dl_limit",e.convertToBytes(t))}}}),n("v-text-field",{attrs:{type:"number",label:e.$t("preferences.up_limit"),placeholder:e.convertToKB(e.preferences.alt_up_limit),lazy:""},on:{change:function(t){e.changeSettings("alt_up_limit",e.convertToBytes(t))}}}),n("v-checkbox",{attrs:{label:e.$t("preferences.alternate_schedule_enable_time"),"input-value":e.preferences.scheduler_enabled},on:{change:function(t){return e.changeSettings("scheduler_enabled",t)}}})],1)],1),e.preferences.scheduler_enabled?n("v-row",{staticClass:"justify-center"},[n("v-col",{attrs:{cols:"auto"}},[n("v-time-picker",{attrs:{value:e.preferences.schedule_from_hour+":"+e.preferences.schedule_from_min,color:"green lighten-1",format:"24hr","header-color":"primary"},on:{input:function(t){return e.updateSchedulerFrom(t)}}})],1),n("v-col",{attrs:{cols:"auto"}},[n("v-time-picker",{attrs:{value:e.preferences.schedule_to_hour+":"+e.preferences.schedule_to_min,color:"green lighten-1",format:"24hr"},on:{input:function(t){return e.updateSchedulerTo(t)}}})],1)],1):e._e()],1)],1),n("v-container",{staticClass:"px-0",attrs:{fluid:""}},[n("v-switch",{attrs:{"input-value":e.preferences.limit_utp_rate,label:e.$t("preferences.limit_utp_rate")},on:{change:function(t){return e.changeSettings("limit_utp_rate",!e.preferences.limit_utp_rate)}}}),n("v-switch",{attrs:{"input-value":e.preferences.limit_tcp_overhead,label:e.$t("preferences.limit_tcp_overhead")},on:{change:function(t){return e.changeSettings("limit_tcp_overhead",!e.preferences.limit_tcp_overhead)}}}),n("v-switch",{attrs:{"input-value":e.preferences.limit_lan_peers,label:e.$t("preferences.limit_lan_peers")},on:{change:function(t){return e.changeSettings("limit_lan_peers",!e.preferences.limit_lan_peers)}}})],1)],1)},xs=[],js=function(e){Object(Re["a"])(n,e);var t=Object(Ce["a"])(n);function n(){return Object(r["a"])(this,n),t.apply(this,arguments)}return Object(s["a"])(n,[{key:"changeSettings",value:function(e,t){this.updatePreferencesRequest(Object(C["a"])({},e,t))}},{key:"updateSchedulerFrom",value:function(e){var t=e.split(":");this.updatePreferencesRequest({schedule_from_hour:t[0],schedule_from_min:t[1]})}},{key:"updateSchedulerTo",value:function(e){var t=e.split(":");this.updatePreferencesRequest({schedule_to_hour:t[0],schedule_to_min:t[1]})}}]),n}(a["default"]);js=Object(Pe["a"])([Object(dt["a"])({components:{},computed:Object(X["a"])({},Object(U["c"])({preferences:"allPreferences"})),methods:Object(X["a"])(Object(X["a"])({},Object(U["b"])({updatePreferencesRequest:"updatePreferencesRequest"})),{},{convertToKB:function(e){return(e/1024).toString()},convertToBytes:function(e){return 1024*e}})})],js);var Ss=js,As=Ss,Rs=(n("54fe"),n("c964")),Cs=Object(Me["a"])(As,Os,xs,!1,null,"6257e5f6",null),Ps=Cs.exports;He()(Cs,{VCheckbox:gt["a"],VCol:_t["a"],VContainer:yt["a"],VRow:xt["a"],VSwitch:or["a"],VTextField:Ze["a"],VTimePicker:Rs["a"]});var Ts=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("v-container",[n("h4",[e._v(e._s(e.$t("preferences.webui_remote_control"))+"}")]),n("v-divider"),n("v-row",{attrs:{dense:"",align:"center"}},[n("v-col",{attrs:{cols:"2"}},[n("v-subheader",[e._v(e._s(e.$t("preferences.data_update_interval")))])],1),n("v-col",{attrs:{cols:"4"}},[n("v-text-field",{attrs:{value:e.config.updateInterval,type:"number",lazy:""},on:{change:function(t){return e.updateConfig({key:"updateInterval",value:t})}}})],1)],1),n("v-row",{attrs:{dense:"",align:"center"}},[n("v-col",{attrs:{cols:"2"}},[n("v-subheader",[e._v(e._s(e.$t("preferences.ip_address")))])],1),n("v-col",{attrs:{cols:"4"}},[n("v-text-field",{attrs:{value:e.preferences.web_ui_address,lazy:""},on:{change:function(t){return e.changeSettings("web_ui_address",t)}}})],1),n("v-col",{attrs:{cols:"1"}},[n("v-subheader",[e._v(e._s(e.$t("preferences.ip_port")))])],1),n("v-col",{attrs:{cols:"1"}},[n("v-text-field",{attrs:{value:e.preferences.web_ui_port,lazy:""},on:{change:function(t){return e.changeSettings("web_ui_port",t)}}})],1)],1),n("v-row",{attrs:{dense:""}},[n("v-col",[n("v-checkbox",{attrs:{label:e.$t("preferences.display_speed_in_title"),"input-value":e.config.displaySpeedInTitle},on:{change:function(t){return e.updateTitleSpeedConfig(t)}}})],1)],1),n("h4",[e._v(e._s(e.$t("preferences.authentication")))]),n("v-divider"),n("preference-row",{attrs:{"i18n-key":"web_ui_username"}},[n("v-text-field",{attrs:{value:e.preferences.web_ui_username,lazy:""},on:{change:function(t){return e.changeSettings("web_ui_username",t)}}})],1),n("preference-row",{attrs:{"i18n-key":"web_ui_password"}},[n("v-text-field",{attrs:{value:e.preferences.web_ui_password,placeholder:e.$t("preferences.new_password"),lazy:""},on:{change:function(t){return e.changeSettings("web_ui_password",t)}}})],1),n("v-row",{attrs:{dense:""}},[n("v-col",{attrs:{cols:"auto"}},[e._v(" "+e._s(e.$t("preferences.web_ui_max_auth_fail_count"))+" ")]),n("v-col",{attrs:{cols:"1"}},[n("v-text-field",{attrs:{value:e.preferences.web_ui_max_auth_fail_count,lazy:""},on:{change:function(t){return e.changeSettings("web_ui_max_auth_fail_count",t)}}})],1),n("v-col",{attrs:{cols:"auto"}},[e._v(" "+e._s(e.$t("preferences.web_ui_ban_duration"))+" ")]),n("v-col",{attrs:{cols:"1"}},[n("v-text-field",{attrs:{value:e.preferences.web_ui_ban_duration,lazy:""},on:{change:function(t){return e.changeSettings("web_ui_ban_duration",t)}}})],1),n("v-col",{attrs:{cols:"auto"}},[e._v(" "+e._s(e.$t("preferences.web_ui_seconds"))+" ")])],1),n("v-row",{attrs:{dense:""}},[n("v-col",[n("v-checkbox",{attrs:{"input-value":e.preferences.bypass_auth_subnet_whitelist_enabled,label:e.$t("preferences.bypass_auth_subnet_whitelist")},on:{change:function(t){return e.changeSettings("bypass_auth_subnet_whitelist_enabled",t)}}})],1),n("v-col",[n("v-checkbox",{attrs:{"input-value":e.preferences.bypass_local_auth,label:e.$t("preferences.bypass_local_auth")},on:{change:function(t){return e.changeSettings("bypass_local_auth",t)}}})],1)],1),n("v-row",{attrs:{dense:""}},[n("v-col",{attrs:{cols:"4"}},[n("v-textarea",{attrs:{value:e.preferences.bypass_auth_subnet_whitelist,lazy:""},on:{change:function(t){return e.changeSettings("bypass_auth_subnet_whitelist",t)}}})],1)],1)],1)},Ds=[],Ls=function(e){Object(Re["a"])(n,e);var t=Object(Ce["a"])(n);function n(){return Object(r["a"])(this,n),t.apply(this,arguments)}return Object(s["a"])(n,[{key:"changeSettings",value:function(e,t){this.updatePreferencesRequest(Object(C["a"])({},e,t))}},{key:"updateTitleSpeedConfig",value:function(e){this.updateConfig({key:"displaySpeedInTitle",value:e}),e||(document.title="qBittorrent Web UI")}}]),n}(a["default"]);Ls=Object(Pe["a"])([Object(dt["a"])({components:{PreferenceRow:gs},computed:Object(X["a"])({},Object(U["c"])({config:"config",preferences:"allPreferences"})),methods:Object(X["a"])(Object(X["a"])({},Object(U["d"])(["updateConfig"])),Object(U["b"])({updatePreferencesRequest:"updatePreferencesRequest"}))})],Ls);var Vs=Ls,Is=Vs,Bs=Object(Me["a"])(Is,Ts,Ds,!1,null,null,null),Us=Bs.exports;He()(Bs,{VCheckbox:gt["a"],VCol:_t["a"],VContainer:yt["a"],VDivider:Un["a"],VRow:xt["a"],VSubheader:Xa["a"],VTextField:Ze["a"],VTextarea:jt["a"]});var Es=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("v-container",[n("v-switch",{attrs:{"input-value":e.preferences.rss_processing_enabled,label:e.$t("preferences.rss_processing_enabled")},on:{change:function(t){return e.changeSettings("rss_processing_enabled",!e.preferences.rss_processing_enabled)}}}),n("v-switch",{attrs:{"input-value":e.preferences.rss_auto_downloading_enabled,label:e.$t("preferences.rss_auto_downloading_enabled")},on:{change:function(t){return e.changeSettings("rss_auto_downloading_enabled",!e.preferences.rss_auto_downloading_enabled)}}}),n("v-text-field",{attrs:{suffix:"min",type:"number",value:e.preferences.rss_refresh_interval,label:e.$t("preferences.rss_refresh_interval")},on:{change:function(t){return e.changeSettings("rss_refresh_interval",t)}}})],1)},Fs=[],zs=function(e){Object(Re["a"])(n,e);var t=Object(Ce["a"])(n);function n(){return Object(r["a"])(this,n),t.apply(this,arguments)}return Object(s["a"])(n,[{key:"changeSettings",value:function(e,t){this.updatePreferencesRequest(Object(C["a"])({},e,t))}}]),n}(a["default"]);zs=Object(Pe["a"])([Object(dt["a"])({components:{},computed:Object(X["a"])({},Object(U["c"])({preferences:"allPreferences"})),methods:Object(X["a"])({},Object(U["b"])({updatePreferencesRequest:"updatePreferencesRequest"}))})],zs);var qs=zs,Ns=qs,$s=(n("ab12"),Object(Me["a"])(Ns,Es,Fs,!1,null,"0418c586",null)),Ms=$s.exports;He()($s,{VContainer:yt["a"],VSwitch:or["a"],VTextField:Ze["a"]});var Gs=function(e){Object(Re["a"])(n,e);var t=Object(Ce["a"])(n);function n(){var e;return Object(r["a"])(this,n),e=t.apply(this,arguments),e.preferenceUpdated=!1,e.tabList=["downloads","speed","rss","webui"],e.tab="download",e}return Object(s["a"])(n,[{key:"onPreferenceUpdate",value:function(){var e=Object(B["a"])(regeneratorRuntime.mark((function e(){return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return this.preferenceUpdated=!0,e.next=3,Q(3e3);case 3:this.preferenceUpdated=!1;case 4:case"end":return e.stop()}}),e,this)})));function t(){return e.apply(this,arguments)}return t}()},{key:"closeDialog",value:function(){return!1}}]),n}(a["default"]);Object(Pe["a"])([Object(dt["c"])(Boolean)],Gs.prototype,"value",void 0),Object(Pe["a"])([Object(dt["e"])("preferences"),Object(dt["e"])("config")],Gs.prototype,"onPreferenceUpdate",null),Object(Pe["a"])([Object(dt["b"])("input")],Gs.prototype,"closeDialog",null),Gs=Object(Pe["a"])([Object(dt["a"])({components:{DownloadSettings:ws,SpeedSettings:Ps,WebUISettings:Us,RssSettings:Ms},computed:Object(X["a"])({},Object(U["c"])({config:"config",preferences:"allPreferences"})),methods:{}})],Gs);var Hs=Gs,Ws=Hs,Ks=(n("3018"),n("0789")),Qs=Object(Me["a"])(Ws,os,cs,!1,null,"3eb994fd",null),Js=Qs.exports;He()(Qs,{VAlert:mt["a"],VBtn:We["a"],VCard:Ke["a"],VCardText:Qe["b"],VCardTitle:Qe["c"],VDialog:Je["a"],VFadeTransition:Ks["d"],VIcon:Ot["a"],VSpacer:Ye["a"],VTab:qa["a"],VTabItem:Na["a"],VTabs:$a["a"],VTabsItems:Ma["a"]});var Ys=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"drawer-footer"},[e.showInfo?n("v-expand-transition",[n("div",[n("v-divider"),n("AppFooter",{attrs:{"phone-layout":""}})],1)]):e._e(),n("v-divider"),n("div",{staticClass:"button-bar"},[e.phoneLayout?[n("v-btn",{attrs:{icon:""},on:{click:function(t){e.showInfo=!e.showInfo}}},[n("v-icon",[e._v("mdi-information")])],1)]:e._e(),n("v-spacer"),n("v-menu",{scopedSlots:e._u([{key:"activator",fn:function(t){var a=t.on;return[n("v-btn",e._g({attrs:{icon:""}},a),[n("v-icon",[e._v("mdi-translate")])],1)]}}])},[n("v-list",[n("v-list-item-group",{attrs:{color:"primary"},model:{value:e.currentLocale,callback:function(t){e.currentLocale=t},expression:"currentLocale"}},e._l(e.locales,(function(t){return n("v-list-item",{key:t.value,attrs:{value:t.value}},[n("v-list-item-title",[e._v(e._s(t.text))])],1)})),1)],1)],1),n("v-menu",{scopedSlots:e._u([{key:"activator",fn:function(t){var a=t.on;return[n("v-btn",e._g({attrs:{icon:""}},a),[n("v-icon",{domProps:{textContent:e._s(e.darkModeIcon)}})],1)]}}])},[n("v-list",[n("v-list-item-group",{attrs:{color:"primary"},model:{value:e.currentDarkMode,callback:function(t){e.currentDarkMode=t},expression:"currentDarkMode"}},e._l(e.darkModes,(function(t){return n("v-list-item",{key:t[0],attrs:{value:t[0]}},[n("v-list-item-title",[e._v(e._s(t[1]))])],1)})),1)],1)],1),n("v-btn",{attrs:{icon:"",title:e.$t("trigger_application_shutdown")},on:{click:e.triggerApplicationShutdown}},[n("v-icon",[e._v("mdi-power-plug-off")])],1)],2)],1)},Zs=[],Xs="auto",ei=function(e){Object(Re["a"])(n,e);var t=Object(Ce["a"])(n);function n(){var e;return Object(r["a"])(this,n),e=t.apply(this,arguments),e.locales=e.buildLocales(),e.currentLocale=e.$store.getters.config.locale||Xs,e.currentDarkMode=e.$store.getters.config.darkMode||Xs,e.oldLocale=e.currentLocale,e.showInfo=!1,e.darkModes=[[!1,S("light")],[!0,S("dark")],[Xs,S("auto")]],e}return Object(s["a"])(n,[{key:"darkModeIcon",get:function(){return 1==this.currentDarkMode?"mdi-brightness-4":0==this.currentDarkMode?"mdi-brightness-7":"mdi-brightness-auto"}},{key:"phoneLayout",get:function(){return this.$vuetify.breakpoint.xsOnly}},{key:"buildLocales",value:function(){var e=Object.entries(y).map((function(e){var t=Object(ee["a"])(e,2),n=t[0],a=t[1];return{text:a.lang,value:n}}));return[{text:S("auto"),value:"auto"}].concat(Object(N["a"])(e))}},{key:"onCurrentLocaleChanged",value:function(){var e=Object(B["a"])(regeneratorRuntime.mark((function e(t){var n,a;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:if(t!==this.oldLocale){e.next=2;break}return e.abrupt("return");case 2:return n=t===Xs?O:t,e.next=5,this.asyncShowDialog({text:S("dialog.switch_locale.msg",{lang:y[n].lang}),type:Be.OkCancel});case 5:if(a=e.sent,a){e.next=9;break}return this.currentLocale=this.oldLocale,e.abrupt("return");case 9:this.updateConfig({key:"locale",value:t===Xs?null:t}),this.showSnackBar({text:S("label.reloading")}),location.reload();case 12:case"end":return e.stop()}}),e,this)})));function t(t){return e.apply(this,arguments)}return t}()},{key:"onDarkModeChanged",value:function(e){this.updateConfig({key:"darkMode",value:e==Xs?null:e})}},{key:"triggerApplicationShutdown",value:function(){var e=Object(B["a"])(regeneratorRuntime.mark((function e(){var t;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return e.next=2,this.asyncShowDialog({title:S("dialog.trigger_exit_qb.title"),text:S("dialog.trigger_exit_qb.text"),type:Be.OkCancel});case 2:if(t=e.sent,t){e.next=5;break}return e.abrupt("return");case 5:return e.next=7,ie.shutdownApplication();case 7:case"end":return e.stop()}}),e,this)})));function t(){return e.apply(this,arguments)}return t}()}]),n}(a["default"]);Object(Pe["a"])([Object(dt["e"])("currentLocale")],ei.prototype,"onCurrentLocaleChanged",null),Object(Pe["a"])([Object(dt["e"])("currentDarkMode")],ei.prototype,"onDarkModeChanged",null),ei=Object(Pe["a"])([Object(ut["b"])({components:{AppFooter:ur},methods:Object(X["a"])(Object(X["a"])({},Object(U["d"])(["showSnackBar","updateConfig"])),Object(U["b"])(["asyncShowDialog"]))})],ei);var ti,ni=ei,ai=ni,ri=(n("8992"),Object(Me["a"])(ai,Ys,Zs,!1,null,"521b95f4",null)),si=ri.exports;He()(ri,{VBtn:We["a"],VDivider:Un["a"],VExpandTransition:Ks["a"],VIcon:Ot["a"],VList:Qt["a"],VListItem:Ut["a"],VListItemGroup:Sr["a"],VListItemTitle:Et["b"],VMenu:Za["a"],VSpacer:Ye["a"]});var ii=function(e){Object(Re["a"])(n,e);var t=Object(Ce["a"])(n);function n(){var e;return Object(r["a"])(this,n),e=t.apply(this,arguments),e.drawer=!e.phoneLayout,e.drawerOptions={showLogs:!1,showRss:!1,showSettings:!1},e.task=0,e}return Object(s["a"])(n,[{key:"phoneLayout",get:function(){return this.$vuetify.breakpoint.xsOnly}},{key:"initProtocolHandler",value:function(){Ve();var e=Ie();e&&this.setPasteUrl({url:e})}},{key:"created",value:function(){var e=Object(B["a"])(regeneratorRuntime.mark((function e(){return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return this.initProtocolHandler(),e.next=3,this.getInitData();case 3:ti=this.$refs.app.$el.querySelector(".v-application--wrap"),ti.addEventListener("paste",this.onPaste);case 5:case"end":return e.stop()}}),e,this)})));function t(){return e.apply(this,arguments)}return t}()},{key:"beforeDestroy",value:function(){this.task&&clearTimeout(this.task),ti.removeEventListener("paste",this.onPaste)}},{key:"getInitData",value:function(){var e=Object(B["a"])(regeneratorRuntime.mark((function e(){var t;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:if(t=location.href,this.config.baseUrl){e.next=10;break}if(!t.includes("czbix.github.io")&&!t.includes("localhost")){e.next=7;break}return this.updateNeedAuth(!0),e.abrupt("return");case 7:ie.changeBaseUrl(t);case 8:e.next=11;break;case 10:ie.changeBaseUrl(this.config.baseUrl);case 11:return e.prev=11,e.next=14,this.getMainData();case 14:e.next=20;break;case 16:return e.prev=16,e.t0=e["catch"](11),this.updateNeedAuth(!0),e.abrupt("return");case 20:return e.next=22,this.getPreferences();case 22:case"end":return e.stop()}}),e,this,[[11,16]])})));function t(){return e.apply(this,arguments)}return t}()},{key:"getPreferences",value:function(){var e=Object(B["a"])(regeneratorRuntime.mark((function e(){var t;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return e.next=2,ie.getAppPreferences();case 2:t=e.sent,this.updatePreferences(t.data);case 4:case"end":return e.stop()}}),e,this)})));function t(){return e.apply(this,arguments)}return t}()},{key:"getMainData",value:function(){var e=Object(B["a"])(regeneratorRuntime.mark((function e(){var t,n,a,r,s,i,o;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return t=this.rid?this.rid:void 0,e.next=3,ie.getMainData(t);case 3:n=e.sent,a=n.data,this.updateMainData(a),this.config.displaySpeedInTitle&&(r=a.server_state.up_info_speed,s=a.server_state.dl_info_speed,i="",o="",s>1024&&(i="D ".concat(_e(s),"/s")),r>1024&&(o="U ".concat(_e(r),"/s")),document.title="[".concat(o," ").concat(i,"] qBittorrent Web UI")),this.task=setTimeout(this.getMainData,this.config.updateInterval);case 8:case"end":return e.stop()}}),e,this)})));function t(){return e.apply(this,arguments)}return t}()},{key:"onPaste",value:function(e){if("INPUT"!==e.target.tagName){var t=e.clipboardData.getData("text");t&&this.setPasteUrl({url:t})}}},{key:"onNeedAuth",value:function(e){e||this.getInitData()}},{key:"onDarkMode",value:function(e){var t=this.$vuetify.theme;if(null!=e)return this.mql&&(this.mql.removeListener(null),this.mql=void 0),void(t.dark=e);this.mql=window.matchMedia("(prefers-color-scheme: dark)"),this.mql.addListener((function(e){t.dark=e.matches})),t.dark=this.mql.matches}}]),n}(a["default"]);Object(Pe["a"])([Object(dt["e"])("needAuth")],ii.prototype,"onNeedAuth",null),Object(Pe["a"])([Object(dt["e"])("config.darkMode",{immediate:!0})],ii.prototype,"onDarkMode",null),ii=Object(Pe["a"])([Object(ut["b"])({components:{AddForm:At,Drawer:Yt,LoginForm:sn,Torrents:tr,AppFooter:ur,LogsDialog:gr,MainToolbar:vn,GlobalDialog:et,GlobalSnackBar:ot,RssDialog:Vr,SearchDialog:is,DrawerFooter:si,SettingsDialog:Js},computed:Object(X["a"])(Object(X["a"])({},Object(U["e"])(["mainData","rid","preferences","needAuth"])),Object(U["c"])(["config"])),methods:Object(X["a"])({},Object(U["d"])(["updateMainData","updatePreferences","setPasteUrl","updateNeedAuth"]))})],ii);var oi=ii,ci=oi,li=(n("28d1"),n("5c64"),n("7496")),ui=n("553a"),di=n("f6c4"),pi=n("f774"),fi=Object(Me["a"])(ci,Se,Ae,!1,null,"0d9d7390",null),hi=fi.exports;He()(fi,{VApp:li["a"],VFooter:ui["a"],VMain:di["a"],VNavigationDrawer:pi["a"]});n("d5e8"),n("5363");var vi=n("9483");Object(vi["a"])("".concat("","service-worker.js"),{ready:function(){console.log("App is being served from cache by a service worker.\nFor more details, visit https://goo.gl/AFskqB")},registered:function(){console.log("Service worker has been registered.")},cached:function(){console.log("Content has been cached for offline use.")},updatefound:function(){console.log("New content is downloading.")},updated:function(){console.log("New content is available; please refresh.")},offline:function(){console.log("No internet connection found. App is running in offline mode.")},error:function(e){console.error("Error during service worker registration:",e)}}),a["default"].config.productionTip=!1,new a["default"]({store:de,vuetify:I,render:function(e){return e(hi)}}).$mount("#app")},d32a:function(e,t,n){},d602:function(e,t,n){"use strict";n("67e1")},d935:function(e,t,n){"use strict";n("3bf7")},e01e:function(e,t,n){},e250:function(e,t,n){},e794:function(e,t,n){},ed4e:function(e,t,n){},f000:function(e,t,n){},f480:function(e,t,n){"use strict";n("5173")}}); -//# sourceMappingURL=app.36412398.js.map \ No newline at end of file diff --git a/config/qbittorrent/webui/qb-web-nightly/dist/public/js/app.36412398.js.map b/config/qbittorrent/webui/qb-web-nightly/dist/public/js/app.36412398.js.map deleted file mode 100644 index c1661a3..0000000 --- a/config/qbittorrent/webui/qb-web-nightly/dist/public/js/app.36412398.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/components/dialogs/InfoDialog.vue?ecfe","webpack:///./src/components/dialogs/ConfirmDeleteDialog.vue?1d2a","webpack:///./src/assets/site_icons/u2.png","webpack:///./src/components/dialogs/LogsDialog.vue?4076","webpack:///./src/components/dialogs/EditTrackerDialog.vue?c026","webpack:///./src/App.vue?60cb","webpack:///./src/components/dialogs/settingsDialog/SettingsDialog.vue?7222","webpack:///./src/components/dialogs/TorrentInfo.vue?7d4d","webpack:///./src/assets/site_icons/chdbits.png","webpack:///./src/assets/site_icons sync ^\\.\\/.*\\.png$","webpack:///./src/components/dialogs/searchDialog/SearchDialogForm.vue?e30d","webpack:///./src/components/dialogs/RssRulesDialog.vue?ed90","webpack:///./node_modules/vuetify/src/locale sync ^\\.\\/.*$","webpack:///./src/components/dialogs/settingsDialog/SpeedSettings.vue?c37e","webpack:///./src/assets/site_icons/hdhome.png","webpack:///./src/App.vue?de19","webpack:///./src/assets/site_icons/keepfrds.png","webpack:///./src/components/Drawer.vue?abc1","webpack:///./src/assets/site_icons/hdchina.png","webpack:///./src/assets/site_icons/m-team.png","webpack:///./src/components/dialogs/RssDialog.vue?6d3c","webpack:///./src/components/drawer/FilterGroup.vue?26ba","webpack:///./src/assets/site_icons/springsunday.png","webpack:///./src/components/dialogs/Panel.vue?4b13","webpack:///./src/components/drawer/DrawerFooter.vue?78bb","webpack:///./src/components/dialogs/ConfirmSetCategoryDialog.vue?4d75","webpack:///./src/components/AddForm.vue?8fde","webpack:///./src/components/Torrents.vue?246d","webpack:///./src/components/Footer.vue?43b6","webpack:///./src/components/dialogs/settingsDialog/RssSettings.vue?a786","webpack:///./src/components/dialogs/TorrentContent.vue?e3c6","webpack:///./src/components/GlobalDialog.vue?3a8d","webpack:///./src/components/dialogs/Peers.vue?6f43","webpack:///./src/locale/en.ts","webpack:///./src/locale/ru.ts","webpack:///./src/locale/tr.ts","webpack:///./src/locale/zh-CN.ts","webpack:///./src/locale/zh-TW.ts","webpack:///./src/store/config.ts","webpack:///./src/locale/index.ts","webpack:///./src/plugins/i18n.ts","webpack:///./src/plugins/composition-api.ts","webpack:///./src/plugins/vuetify.ts","webpack:///./src/consts.ts","webpack:///./src/store/dialog.ts","webpack:///./src/store/snackBar.ts","webpack:///./src/store/addForm.ts","webpack:///./src/utils/index.ts","webpack:///./src/Api.ts","webpack:///./src/store/searchEngine.ts","webpack:///./src/utils/vue-object-merge.ts","webpack:///./src/store/index.ts","webpack:///./src/filters.ts","webpack:///./src/directives.ts","webpack:///./src/buildInfo.ts","webpack:///./src/App.vue?26fe","webpack:///./src/protocolHandler.ts","webpack:///./src/components/GlobalDialog.vue?fad5","webpack:///./src/store/types.ts","webpack:///./src/components/GlobalDialog.vue","webpack:///./src/components/GlobalDialog.vue?368a","webpack:///./src/components/GlobalDialog.vue?e3bd","webpack:///./src/components/GlobalSnackBar.vue?dd96","webpack:///src/components/GlobalSnackBar.vue","webpack:///./src/components/GlobalSnackBar.vue?12a4","webpack:///./src/components/GlobalSnackBar.vue","webpack:///./src/components/AddForm.vue?b45e","webpack:///./src/components/AddForm.vue","webpack:///./src/components/AddForm.vue?c09d","webpack:///./src/components/AddForm.vue?d11d","webpack:///./src/components/Drawer.vue?b88d","webpack:///./src/components/drawer/FilterGroup.vue?f8af","webpack:///./src/components/drawer/FilterGroup.vue","webpack:///./src/components/drawer/FilterGroup.vue?6e09","webpack:///./src/components/drawer/FilterGroup.vue?9d5f","webpack:///./src/sites.ts","webpack:///./src/components/Drawer.vue","webpack:///./src/components/Drawer.vue?9c56","webpack:///./src/components/Drawer.vue?4451","webpack:///./src/components/LoginForm.vue?8435","webpack:///./src/components/LoginForm.vue","webpack:///./src/components/LoginForm.vue?28a3","webpack:///./src/components/LoginForm.vue?fe07","webpack:///./src/components/MainToolbar.vue?ce68","webpack:///./src/components/MainToolbar.vue","webpack:///./src/components/MainToolbar.vue?c2e9","webpack:///./src/components/MainToolbar.vue?9fa0","webpack:///./src/components/Torrents.vue?b50d","webpack:///./src/components/dialogs/ConfirmDeleteDialog.vue?087a","webpack:///./src/components/dialogs/ConfirmDeleteDialog.vue","webpack:///./src/components/dialogs/ConfirmDeleteDialog.vue?0859","webpack:///./src/components/dialogs/ConfirmDeleteDialog.vue?fc79","webpack:///./src/components/dialogs/ConfirmSetCategoryDialog.vue?bbe8","webpack:///./src/components/dialogs/ConfirmSetCategoryDialog.vue","webpack:///./src/components/dialogs/ConfirmSetCategoryDialog.vue?c399","webpack:///./src/components/dialogs/ConfirmSetCategoryDialog.vue?6e2f","webpack:///./src/components/dialogs/EditTrackerDialog.vue?2e89","webpack:///./src/components/dialogs/EditTrackerDialog.vue","webpack:///./src/components/dialogs/EditTrackerDialog.vue?6bfc","webpack:///./src/components/dialogs/EditTrackerDialog.vue?f44d","webpack:///./src/components/dialogs/InfoDialog.vue?40da","webpack:///./src/components/dialogs/TorrentInfo.vue?a859","webpack:///./src/mixins/hasTask.ts","webpack:///./src/components/dialogs/baseTorrentInfo.ts","webpack:///./src/components/dialogs/TorrentInfo.vue","webpack:///./src/components/dialogs/TorrentInfo.vue?cfc9","webpack:///./src/components/dialogs/TorrentInfo.vue?2aad","webpack:///./src/components/dialogs/TorrentContent.vue?2318","webpack:///./src/components/dialogs/TorrentContent.vue","webpack:///./src/components/dialogs/TorrentContent.vue?99db","webpack:///./src/components/dialogs/TorrentContent.vue?47b1","webpack:///./src/components/dialogs/Trackers.vue?628f","webpack:///./src/components/dialogs/Trackers.vue","webpack:///./src/components/dialogs/Trackers.vue?6401","webpack:///./src/components/dialogs/Trackers.vue?7dad","webpack:///./src/components/dialogs/Peers.vue?a9de","webpack:///./src/components/dialogs/Peers.vue","webpack:///./src/components/dialogs/Peers.vue?da61","webpack:///./src/components/dialogs/Peers.vue?3c05","webpack:///./src/components/dialogs/Panel.vue?3308","webpack:///./src/components/dialogs/Panel.vue","webpack:///./src/components/dialogs/Panel.vue?4e95","webpack:///./src/components/dialogs/Panel.vue?37bd","webpack:///./src/components/dialogs/InfoDialog.vue","webpack:///./src/components/dialogs/InfoDialog.vue?1d22","webpack:///./src/components/dialogs/InfoDialog.vue?5531","webpack:///./src/components/Torrents.vue","webpack:///./src/components/Torrents.vue?0b24","webpack:///./src/components/Torrents.vue?fbfa","webpack:///./src/components/Footer.vue?8088","webpack:///./src/components/Footer.vue","webpack:///./src/components/Footer.vue?b3e0","webpack:///./src/components/Footer.vue?6c9a","webpack:///./src/components/dialogs/LogsDialog.vue?3ba4","webpack:///./src/components/dialogs/LogsDialog.vue","webpack:///./src/components/dialogs/LogsDialog.vue?5e91","webpack:///./src/components/dialogs/LogsDialog.vue?1a5d","webpack:///./src/components/dialogs/RssDialog.vue?acb7","webpack:///./src/components/dialogs/RssRulesDialog.vue?7605","webpack:///./src/components/dialogs/RssRulesDialog.vue","webpack:///./src/components/dialogs/RssDialog.vue","webpack:///./src/components/dialogs/RssRulesDialog.vue?6e4e","webpack:///./src/components/dialogs/RssRulesDialog.vue?563c","webpack:///./src/components/dialogs/RssDialog.vue?5779","webpack:///./src/components/dialogs/RssDialog.vue?0eaf","webpack:///./src/components/dialogs/searchDialog/SearchDialog.vue?f50a","webpack:///./src/components/dialogs/searchDialog/SearchDialogForm.vue?9a81","webpack:///./src/components/dialogs/searchDialog/SearchDialogForm.vue","webpack:///./src/components/dialogs/searchDialog/SearchDialogForm.vue?6a48","webpack:///./src/components/dialogs/searchDialog/SearchDialogForm.vue?0211","webpack:///./src/components/dialogs/searchDialog/PluginsManager.vue?63fd","webpack:///./src/components/dialogs/searchDialog/PluginsManager.vue","webpack:///./src/components/dialogs/searchDialog/PluginsManager.vue?39bb","webpack:///./src/components/dialogs/searchDialog/PluginsManager.vue?e38c","webpack:///./src/components/dialogs/searchDialog/SearchDialog.vue","webpack:///./src/components/dialogs/searchDialog/SearchDialog.vue?1b7e","webpack:///./src/components/dialogs/searchDialog/SearchDialog.vue?be62","webpack:///./src/components/dialogs/settingsDialog/SettingsDialog.vue?46aa","webpack:///./src/components/dialogs/settingsDialog/DownloadSettings.vue?af0f","webpack:///./src/components/dialogs/settingsDialog/PreferenceRow.vue?b207","webpack:///./src/components/dialogs/settingsDialog/PreferenceRow.vue","webpack:///./src/components/dialogs/settingsDialog/PreferenceRow.vue?e231","webpack:///./src/components/dialogs/settingsDialog/PreferenceRow.vue?8268","webpack:///./src/components/dialogs/settingsDialog/DownloadSettings.vue","webpack:///./src/components/dialogs/settingsDialog/DownloadSettings.vue?f4e5","webpack:///./src/components/dialogs/settingsDialog/DownloadSettings.vue?761e","webpack:///./src/components/dialogs/settingsDialog/SpeedSettings.vue?9226","webpack:///./src/components/dialogs/settingsDialog/SpeedSettings.vue","webpack:///./src/components/dialogs/settingsDialog/SpeedSettings.vue?c041","webpack:///./src/components/dialogs/settingsDialog/SpeedSettings.vue?adb5","webpack:///./src/components/dialogs/settingsDialog/WebUISettings.vue?c766","webpack:///./src/components/dialogs/settingsDialog/WebUISettings.vue","webpack:///./src/components/dialogs/settingsDialog/WebUISettings.vue?c75a","webpack:///./src/components/dialogs/settingsDialog/WebUISettings.vue?eb27","webpack:///./src/components/dialogs/settingsDialog/RssSettings.vue?d44b","webpack:///./src/components/dialogs/settingsDialog/RssSettings.vue","webpack:///./src/components/dialogs/settingsDialog/RssSettings.vue?955b","webpack:///./src/components/dialogs/settingsDialog/RssSettings.vue?7f27","webpack:///./src/components/dialogs/settingsDialog/SettingsDialog.vue","webpack:///./src/components/dialogs/settingsDialog/SettingsDialog.vue?ab79","webpack:///./src/components/dialogs/settingsDialog/SettingsDialog.vue?446f","webpack:///./src/components/drawer/DrawerFooter.vue?48ee","webpack:///./src/components/drawer/DrawerFooter.vue","webpack:///./src/App.vue","webpack:///./src/components/drawer/DrawerFooter.vue?4ec3","webpack:///./src/components/drawer/DrawerFooter.vue?43bb","webpack:///./src/App.vue?0ab4","webpack:///./src/App.vue?4195","webpack:///./src/registerServiceWorker.ts","webpack:///./src/main.ts","webpack:///./src/components/dialogs/settingsDialog/DownloadSettings.vue?6c95","webpack:///./src/components/dialogs/searchDialog/SearchDialog.vue?a306","webpack:///./src/components/MainToolbar.vue?8900"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","window","oldJsonpFunction","slice","map","webpackContext","req","id","webpackContextResolve","e","Error","code","keys","resolve","lang","auto","close","no","yes","cancel","ok","start","stop","submit","edit","delete","todo","resume","pause","force_start","toggle_sequential","info","reset","login","search","refresh","location","rename","trigger_application_shutdown","reannounce","recheck","username","password","size","progress","status","seeds","peers","dl_speed","up_speed","eta","ratio","added_on","settings","logs","light","dark","all","category","uncategorized","tag","untagged","others","sites","files","less","more","feed","date","query","plugin","action","search_engine","usage","plugin_manager","update_plugins","preferences","change_applied","downloads","adding_torrent","create_subfolder_enabled","start_paused_enabled","auto_delete_mode","preallocate_all","incomplete_files_ext","saving_management","auto_tmm_enabled","torrent_changed_tmm_enabled","save_path_changed_tmm_enabled","category_changed_tmm_enabled","auto_mode","manual_mode","switch_torrent_mode_to_manual","move_affected_torrent","save_path","temp_path","export_dir","export_dir_fin","speed","global_rate_limits","alternate_rate_limits","alternate_schedule_enable_time","apply_speed_limit","dl_limit","up_limit","zero_for_unlimited","schedule_from","schedule_to","scheduler_days","limit_utp_rate","limit_tcp_overhead","limit_lan_peers","connection","bittorrent","rss","rss_processing_enabled","rss_auto_downloading_enabled","rss_refresh_interval","webui","data_update_interval","webui_remote_control","ip_address","ip_port","enable_upnp","authentication","web_ui_username","web_ui_password","bypass_local_auth","bypass_auth_subnet_whitelist","web_ui_session_timeout","web_ui_max_auth_fail_count","web_ui_ban_duration","web_ui_seconds","new_password","display_speed_in_title","title","_","add_torrents","delete_torrents","set_category","edit_tracker","set_location","recheck_torrents","label","switch_to_old_ui","create_subfolder","start_torrent","skip_hash_check","in_sequential_order","first_and_last_pieces_first","also_delete_files","auto_tmm","adding","reloading","deleting","moving","moved","next","back","confirm","reannounced","rechecking","dht_nodes","base_url","msg","item_is_required","dialog","trigger_exit_qb","text","placeholder","hint","also_delete_same_name_torrents","move","also_move_same_name_torrents","switch_locale","add_feed","feed_url","auto_refresh","auto_download","delete_feeds","date_format","rss_rule","add_rule","new_rule_name","delete_rule","rule_settings","use_regex","must_contain","must_not_contain","episode_filter","smart_episode","assign_category","apply_to_feeds","category_state","downloading","seeding","completed","resumed","paused","active","inactive","errored","torrent_state","error","missingFiles","uploading","pausedUP","queuedUP","stalledUP","checkingUP","forcedUP","allocating","metaDL","pausedDL","queuedDL","stalledDL","checkingDL","forceDL","checkingResumeData","unknown","state","configKey","defaultConfig","baseUrl","updateInterval","pageOptions","itemsPerPage","filter","site","locale","darkMode","displaySpeedInTitle","saveConfig","obj","localStorage","setItem","JSON","stringify","loadConfig","tmp","getItem","parse","configStore","userConfig","mutations","updateConfig","payload","set","getters","config","translations","en","polyglot","phrases","matchLocale","navigator","languages","defaultLocale","updateLocale","extend","$t","use","split","StateType","default","locales","current","icons","iconfont","dialogStore","showDialog","closeDialog","actions","asyncShowDialog","commit","Promise","options","callback","snackBarStore","showSnackBar","closeSnackBar","addFormStore","isOpen","downloadItem","openAddForm","closeAddForm","addFormDownloadItem","AllStateTypes","Downloading","Seeding","Completed","Resumed","Paused","Active","Inactive","Errored","dlState","upState","completeState","activeState","errorState","torrentIsState","type","includes","startsWith","timeout","ms","setTimeout","magicNumber","toUpperCase","codePoints","charCodeAt","char","String","fromCodePoint","url","toString","isWindows","userAgent","findSameNamedTorrents","allTorrents","torrents","hashes","hash","t1","t2","apiEndpoint","this","axios","baseURL","withCredentials","defaults","headers","post","endsWith","normalizeBaseUrl","params","URLSearchParams","validateStatus","then","Api","handleResponse","rid","formData","FormData","entries","append","torrent","alternative_webui_enabled","setPreferences","json","idList","priority","idListStr","join","lastId","last_known_id","deleteFiles","actionTorrents","actionTorrent","origUrl","newUrl","withData","path","itemPath","newPath","destPath","def","ruleName","ruleDef","pattern","pluginName","categoryName","body","plugins","enable","names","extra","resp","api","searchPlugins","isPluginManagerOpen","setSearchPlugins","openPluginManager","closePluginManager","allSearchPlugins","fetchSearchPlugins","dispatch","getSearchPluginsRequest","getSearchPlugins","getSearchPluginRequestSuccess","undefined","getSearchPluginRequestFailure","togglePluginAvailability","togglePluginEnableRequest","enablePlugin","enabled","enablePluginRequestSuccess","updatePluginsRequest","updateSearchPlugins","updatePluginsRequestSuccess","updatePluginsRequestFailure","stateMerge","propName","ignoreNull","prop","Store","snackBar","addForm","searchEngine","mainData","pasteUrl","needAuth","updateMainData","full_update","torrents_removed","categories_removed","tags_removed","updatePreferences","setPasteUrl","updateNeedAuth","allPreferences","savePath","isDataReady","allCategories","categories","allTags","finalTags","tags","torrentGroupByCategory","torrentGroupByTag","forEach","list","torrentGroupBySite","tracker","URL","hostname","torrentGroupByState","__","put","updatePreferencesRequest","getAppPreferences","preferenceRes","updatePreferencesRequestSuccess","updatePreferencesRequestFailure","alert","useStore","useMutations","namespace","method","_args","useState","states","toPrecision","precision","limit","toFixed","formatSize","units","index","Math","floor","log2","unit","formatDuration","minute","hour","day","year","durations","unitSize","parts","defaultOptions","maxUnitSize","dayLimit","minUnit","opt","assign","duration","formatTimestamp","timestamp","unix","format","formatAsDuration","Date","now","formatProgress","parseDate","str","directive","el","binding","clsName","arg","classList","toggle","buildInfo","console","log","_vm","_h","$createElement","_c","_self","ref","directives","rawName","expression","attrs","$vuetify","breakpoint","lgAndUp","scopedSlots","_u","fn","proxy","model","$$v","drawer","drawerOptions","_e","$set","on","$event","staticClass","staticRenderFns","registerProtocolHandler","origin","pathname","document","checkDownloadUrl","substring","DialogType","_b","domProps","_s","class","isInput","rules","input","_v","_l","btn","clickBtn","BUTTONS","Alert","YesNo","OkCancel","Input","DefaultDialogWidth","setup","ctx","width","root","smAndDown","btnValue","cb","v","btns","dialogType","Custom","buttons","component","VBtn","VCard","VCardActions","VCardText","VCardTitle","VDialog","VSpacer","VTextField","changed","btnText","VSnackbar","smAndUp","phoneLayout","valid","item","xsOnly","urls","setParams","selectFiles","autoTMM","categoryItems","showMore","defaultPath","userParams","savepath","skip_checking","sequentialDownload","firstLastPiecePrio","submitting","defaultParams","root_path","find","prefs","$refs","fileZone","addEventListener","onDrop","removeEventListener","addTorrents","message","form","resetValidation","file","$el","querySelector","click","transfer","dataTransfer","preventDefault","validate","deep","immediate","computed","methods","VAlert","VCheckbox","VCol","VCombobox","VContainer","VFileInput","VForm","VIcon","VRow","VTextarea","icon","child","group","selected","stopPropagation","select","isFontIcon","$store","children","some","getSiteIcon","VImg","VListGroup","VListItem","VListItemContent","VList","VListItemIcon","VListItemTitle","stateList","endItems","updateOptions","pcItems","switchUi","concat","filterGroups","totalSize","buildStateGroup","buildCategoryGroup","buildTagGroup","buildSiteGroup","switchToOldUi","reload","components","FilterGroup","_obj","indexOf","_k","keyCode","arguments","showPassword","loginError","emit","store","href","changeBaseUrl","VToolbar","VToolbarTitle","searchBarExpanded","focusedSearch","searchQuery","onSearch","$nextTick","Boolean","VAppBar","VAppBarNavIcon","hasSelected","confirmDelete","resumeTorrents","pauseTorrents","forceStartTorrents","selectedRows","showInfo","_g","setTorrentsCategory","toggleSequentialTorrents","setTorrentLocation","reannounceTorrents","editTracker","recheckTorrents","loading","footerProps","row","isSelected","_f","seq_dl","getProgressColorClass","num_seeds","num_complete","num_leechs","num_incomplete","dlspeed","upspeed","toDelete","toSetCategory","categoryToSet","toEditTracker","toShowInfo","infoTab","sameNamedTorrents","deleteSameNamed","moveSameNamed","torrentsToDelete","deleteTorrents","Array","torrentsToMove","step","replace","toEdit","currentIndex","canNext","foward","regex","RegExp","compact","calcResults","VDivider","VProgressLinear","VStepper","VStepperContent","VStepperHeader","VStepperItems","VStepperStep","dialogWidth","tabSync","tab","properties","interval","runTask","cancelTask","destroy","taskId","clearTimeout","fetchInfo","isActive","setTaskAndRun","doTask","startTask","PieceState","time_elapsed","seeding_time","nb_connections","nb_connections_limit","total_downloaded_session","total_downloaded","total_uploaded_session","total_uploaded","seeds_total","peers_total","total_wasted","share_ratio","last_seen","information","total_size","pieces_num","piece_size","pieces_have","created_by","creation_date","addition_date","completion_date","comment","pieces","canvas","getTorrentProperties","getTorrentPieceStates","clientWidth","clientHeight","height","getContext","getData","initCanvas","clearRect","partNum","offset","chunkSize","chunks","empty","Empty","downloaded","Downloaded","color","fillStyle","fillRect","EFilePriority","fileTree","selectChanged","inChanging","getRowIcon","FILE_KEY","UNWANTED_FILE","buildTree","notDownload","getTorrentFiles","sort","a","b","localeCompare","folderIndex","open","items","previous","diff","setTorrentFilePriority","normal","getFileFolder","folder","values","subTree","getFiles","VProgressCircular","VTreeview","trackers","tier","num_peers","num_leeches","num_downloaded","getTorrentTracker","getTracker","filters","formatTrackerStatus","formatTrackerNum","num","VDataTable","country","codeToFlag","country_code","ip","port","flags_desc","flags","client","uploaded","relevance","peersObj","getTorrentPeers","peers_removed","getPeers","networkSpeed","networkSize","single","_t","props","required","TorrentInfo","TorrentContent","Trackers","Peers","Panel","getStateInfo","VTab","VTabItem","VTabs","VTabsItems","q","toLowerCase","min","rowsPerPage","theme","selectedHashes","setForceStartTorrents","savePaths","oldPath","torrentHashs","toRemove","ConfirmDeleteDialog","ConfirmSetCategoryDialog","EditTrackerDialog","InfoDialog","formatNetworkSpeed","stateIcon","stateColor","isProgress","isSeqDL","VListItemAction","VMenu","VSubheader","topLayoutClass","app","version","apiVersion","free_space_on_disk","queued_io_jobs","average_time_queue","alltime_dl","alltime_ul","connection_status","speedLimited","toggleSpeedLimitsMode","speedModeBind","dl_info_speed","dl_rate_limit","dl_info_data","up_info_speed","up_rate_limit","up_info_data","getAppVersion","getApiVersion","use_alt_speed_limits","getAppInfo","connectionIcon","statusMap","connected","firewalled","disconnected","connectionIconColor","server_state","VSwitch","VTooltip","$emit","getLogs","end","scrollIntoView","formatType","1","2","4","8","typeColor","addRssItem","selectNode","deleteRssItem","renameRssItem","refreshRssItem","changePreference","showRulesDialog","rssNode","rssTree","isItemLoading","selectItem","lastBuildDate","selectArticle","sortArticles","articles","article","downloadTorrent","link","addRssRule","selectedRuleName","deleteRssRule","rssRules","selectedRule","useRegex","editRule","mustContain","mustNotContain","episodeFilter","smartFilter","assignedCategory","hasSelectSite","selectSite","uncategory","buildRssItems","affectedFeeds","rule","feeds","node","getRssRules","setRssRule","fetchRssRules","removeRssRule","old","VListItemGroup","VSelect","buildRssTree","it","reverse","isLoading","hasError","parent","escapeKey","escaped","addRssFeed","response","selectedPath","moveRssFeed","removeRssFeed","refreshRssFeed","getRssItems","torrentURL","fetchRssItems","RssRulesDialog","time","inserted","doc","contentDocument","darkCss","css","head","insertAdjacentHTML","innerHTML","update","oldValue","scrollTo","top","triggerSearch","stopSearch","grid","searchItems","descrLink","fileName","fileSize","searchForm","searchButton","plugginSelectorOpen","mobile","toggleSelectAll","fullName","availableCategories","ALL_KEY","ALL_CATEGORY","availablePlugins","hasSelectAllPlugins","divider","supportedCategories","x","VAutocomplete","VBottomSheet","VSheet","searchEngineState","updatePlugins","togglePluginAvailabilityAction","_searchId","fileUrl","nbLeechers","nbSeeders","siteUrl","sortable","loadSearchPlugins","_stopSearch","_startSearch","task","startSearch","responseId","getSearchResults","isStopped","results","SearchDialogForm","PluginManager","changeSettings","torrentMode","torrentAction","temp_path_enabled","$props","i18nKey","$slots","PreferenceRow","convertToKB","convertToBytes","alt_dl_limit","alt_up_limit","scheduler_enabled","schedule_from_hour","schedule_from_min","updateSchedulerFrom","schedule_to_hour","schedule_to_min","updateSchedulerTo","event","strings","VTimePicker","web_ui_address","web_ui_port","updateTitleSpeedConfig","bypass_auth_subnet_whitelist_enabled","preferenceUpdated","tabList","DownloadSettings","SpeedSettings","WebUISettings","RssSettings","VFadeTransition","currentLocale","darkModeIcon","currentDarkMode","triggerApplicationShutdown","AUTO_KEY","buildLocales","oldLocale","darkModes","translation","localeKey","shutdownApplication","AppFooter","appWrapEl","VExpandTransition","showLogs","showRss","showSettings","initProtocolHandler","getInitData","onPaste","getMainData","getPreferences","upInfoSpeed","dlInfoSpeed","dl","up","target","tagName","clipboardData","mql","removeListener","matchMedia","addListener","matches","AddForm","Drawer","LoginForm","Torrents","LogsDialog","MainToolbar","GlobalDialog","GlobalSnackBar","RssDialog","SearchDialog","DrawerFooter","SettingsDialog","VApp","VFooter","VMain","VNavigationDrawer","ready","registered","cached","updatefound","updated","offline","productionTip","vuetify","render","h","$mount"],"mappings":"aACE,SAASA,EAAqBC,GAQ7B,IAPA,IAMIC,EAAUC,EANVC,EAAWH,EAAK,GAChBI,EAAcJ,EAAK,GACnBK,EAAiBL,EAAK,GAIHM,EAAI,EAAGC,EAAW,GACpCD,EAAIH,EAASK,OAAQF,IACzBJ,EAAUC,EAASG,GAChBG,OAAOC,UAAUC,eAAeC,KAAKC,EAAiBX,IAAYW,EAAgBX,IACpFK,EAASO,KAAKD,EAAgBX,GAAS,IAExCW,EAAgBX,GAAW,EAE5B,IAAID,KAAYG,EACZK,OAAOC,UAAUC,eAAeC,KAAKR,EAAaH,KACpDc,EAAQd,GAAYG,EAAYH,IAG/Be,GAAqBA,EAAoBhB,GAE5C,MAAMO,EAASC,OACdD,EAASU,OAATV,GAOD,OAHAW,EAAgBJ,KAAKK,MAAMD,EAAiBb,GAAkB,IAGvDe,IAER,SAASA,IAER,IADA,IAAIC,EACIf,EAAI,EAAGA,EAAIY,EAAgBV,OAAQF,IAAK,CAG/C,IAFA,IAAIgB,EAAiBJ,EAAgBZ,GACjCiB,GAAY,EACRC,EAAI,EAAGA,EAAIF,EAAed,OAAQgB,IAAK,CAC9C,IAAIC,EAAQH,EAAeE,GACG,IAA3BX,EAAgBY,KAAcF,GAAY,GAE3CA,IACFL,EAAgBQ,OAAOpB,IAAK,GAC5Be,EAASM,EAAoBA,EAAoBC,EAAIN,EAAe,KAItE,OAAOD,EAIR,IAAIQ,EAAmB,GAKnBhB,EAAkB,CACrB,IAAO,GAGJK,EAAkB,GAGtB,SAASS,EAAoB1B,GAG5B,GAAG4B,EAAiB5B,GACnB,OAAO4B,EAAiB5B,GAAU6B,QAGnC,IAAIC,EAASF,EAAiB5B,GAAY,CACzCK,EAAGL,EACH+B,GAAG,EACHF,QAAS,IAUV,OANAf,EAAQd,GAAUW,KAAKmB,EAAOD,QAASC,EAAQA,EAAOD,QAASH,GAG/DI,EAAOC,GAAI,EAGJD,EAAOD,QAKfH,EAAoBM,EAAIlB,EAGxBY,EAAoBO,EAAIL,EAGxBF,EAAoBQ,EAAI,SAASL,EAASM,EAAMC,GAC3CV,EAAoBW,EAAER,EAASM,IAClC3B,OAAO8B,eAAeT,EAASM,EAAM,CAAEI,YAAY,EAAMC,IAAKJ,KAKhEV,EAAoBe,EAAI,SAASZ,GACX,qBAAXa,QAA0BA,OAAOC,aAC1CnC,OAAO8B,eAAeT,EAASa,OAAOC,YAAa,CAAEC,MAAO,WAE7DpC,OAAO8B,eAAeT,EAAS,aAAc,CAAEe,OAAO,KAQvDlB,EAAoBmB,EAAI,SAASD,EAAOE,GAEvC,GADU,EAAPA,IAAUF,EAAQlB,EAAoBkB,IAC/B,EAAPE,EAAU,OAAOF,EACpB,GAAW,EAAPE,GAA8B,kBAAVF,GAAsBA,GAASA,EAAMG,WAAY,OAAOH,EAChF,IAAII,EAAKxC,OAAOyC,OAAO,MAGvB,GAFAvB,EAAoBe,EAAEO,GACtBxC,OAAO8B,eAAeU,EAAI,UAAW,CAAET,YAAY,EAAMK,MAAOA,IACtD,EAAPE,GAA4B,iBAATF,EAAmB,IAAI,IAAIM,KAAON,EAAOlB,EAAoBQ,EAAEc,EAAIE,EAAK,SAASA,GAAO,OAAON,EAAMM,IAAQC,KAAK,KAAMD,IAC9I,OAAOF,GAIRtB,EAAoB0B,EAAI,SAAStB,GAChC,IAAIM,EAASN,GAAUA,EAAOiB,WAC7B,WAAwB,OAAOjB,EAAO,YACtC,WAA8B,OAAOA,GAEtC,OADAJ,EAAoBQ,EAAEE,EAAQ,IAAKA,GAC5BA,GAIRV,EAAoBW,EAAI,SAASgB,EAAQC,GAAY,OAAO9C,OAAOC,UAAUC,eAAeC,KAAK0C,EAAQC,IAGzG5B,EAAoB6B,EAAI,GAExB,IAAIC,EAAaC,OAAO,gBAAkBA,OAAO,iBAAmB,GAChEC,EAAmBF,EAAW3C,KAAKsC,KAAKK,GAC5CA,EAAW3C,KAAOf,EAClB0D,EAAaA,EAAWG,QACxB,IAAI,IAAItD,EAAI,EAAGA,EAAImD,EAAWjD,OAAQF,IAAKP,EAAqB0D,EAAWnD,IAC3E,IAAIU,EAAsB2C,EAI1BzC,EAAgBJ,KAAK,CAAC,EAAE,kBAEjBM,K,6ECvJT,W,kFCAA,W,qBCAAW,EAAOD,QAAU,0/B,oCCAjB,W,kCCAA,W,6DCAA,W,kCCAA,W,2DCAA,W,mBCAAC,EAAOD,QAAU,kN,gDCAjB,IAAI+B,EAAM,CACT,gBAAiB,OACjB,gBAAiB,OACjB,eAAgB,OAChB,iBAAkB,OAClB,eAAgB,OAChB,qBAAsB,OACtB,WAAY,QAIb,SAASC,EAAeC,GACvB,IAAIC,EAAKC,EAAsBF,GAC/B,OAAOpC,EAAoBqC,GAE5B,SAASC,EAAsBF,GAC9B,IAAIpC,EAAoBW,EAAEuB,EAAKE,GAAM,CACpC,IAAIG,EAAI,IAAIC,MAAM,uBAAyBJ,EAAM,KAEjD,MADAG,EAAEE,KAAO,mBACHF,EAEP,OAAOL,EAAIE,GAEZD,EAAeO,KAAO,WACrB,OAAO5D,OAAO4D,KAAKR,IAEpBC,EAAeQ,QAAUL,EACzBlC,EAAOD,QAAUgC,EACjBA,EAAeE,GAAK,Q,yDC5BpB,W,oCCAA,W,qHCAA,IAAIH,EAAM,CACT,KAAM,OACN,yBAA0B,QAC1B,4BAA6B,QAC7B,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,QAAS,OACT,WAAY,OACZ,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,UAAW,OACX,aAAc,OACd,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,YAAa,OACb,eAAgB,OAChB,YAAa,OACb,eAAgB,OAChB,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,YAAa,OACb,eAAgB,OAChB,YAAa,OACb,eAAgB,QAIjB,SAASC,EAAeC,GACvB,IAAIC,EAAKC,EAAsBF,GAC/B,OAAOpC,EAAoBqC,GAE5B,SAASC,EAAsBF,GAC9B,IAAIpC,EAAoBW,EAAEuB,EAAKE,GAAM,CACpC,IAAIG,EAAI,IAAIC,MAAM,uBAAyBJ,EAAM,KAEjD,MADAG,EAAEE,KAAO,mBACHF,EAEP,OAAOL,EAAIE,GAEZD,EAAeO,KAAO,WACrB,OAAO5D,OAAO4D,KAAKR,IAEpBC,EAAeQ,QAAUL,EACzBlC,EAAOD,QAAUgC,EACjBA,EAAeE,GAAK,Q,oCC5GpB,W,0CCAAjC,EAAOD,QAAU,sqD,oCCAjB,W,qBCAAC,EAAOD,QAAU,IAA0B,6B,6DCA3C,W,qBCAAC,EAAOD,QAAU,kR,qBCAjBC,EAAOD,QAAU,suF,wICAjB,W,kCCAA,W,qBCAAC,EAAOD,QAAU,kgF,oCCAjB,W,kCCAA,W,6DCAA,W,oCCAA,W,6DCAA,W,yDCAA,W,kCCAA,W,yDCAA,W,kCCAA,W,kCCAA,W,iLCCe,GACbyC,KAAM,UACNC,KAAM,OAENC,MAAO,QACPC,GAAI,KACJC,IAAK,MACLC,OAAQ,SACRC,GAAI,KAEJC,MAAO,QACPC,KAAM,OACNC,OAAQ,SACRC,KAAM,OACNC,OAAQ,SACRC,KAAM,QACNC,OAAQ,SACRC,MAAO,QACPC,YAAa,cACbC,kBAAmB,6BACnBC,KAAM,OACNC,MAAO,QACPC,MAAO,QACPC,OAAQ,SACRC,QAAS,UACTC,SAAU,WACVC,OAAQ,SACRC,6BAA8B,mBAC9BC,WAAY,aACZC,QAAS,UAETC,SAAU,WACVC,SAAU,WAEV/D,KAAM,OACNgE,KAAM,OACNC,SAAU,WACVC,OAAQ,SACRC,MAAO,QACPC,MAAO,QACPC,SAAU,WACVC,SAAU,WACVC,IAAK,MACLC,MAAO,QACPC,SAAU,WAEVC,SAAU,WACVC,KAAM,OACNC,MAAO,QACPC,KAAM,OAENC,IAAK,MACLC,SAAU,2BACVC,cAAe,gBACfC,IAAK,MACLC,SAAU,WACVC,OAAQ,SACRC,MAAO,QACPC,MAAO,QACPC,KAAM,OACNC,KAAM,OACNC,KAAM,OACNC,KAAM,OACNC,MAAO,QACPC,OAAQ,sBACRC,OAAQ,sBACRC,cAAe,gBACfC,MAAO,QACPC,eAAgB,iBAChBC,eAAgB,iBAEhBC,YAAa,CACXC,eAAgB,wBAChBC,UAAW,YACXC,eAAgB,wBAChBC,yBAA0B,oDAC1BC,qBAAsB,0CACtBC,iBAAkB,mCAClBC,gBAAiB,wCACjBC,qBAAsB,4CACtBC,kBAAmB,oBACnBC,iBAAkB,kCAClBC,4BAA6B,gCAC7BC,8BAA+B,iCAC/BC,6BAA8B,kCAC9BC,UAAW,YACXC,YAAa,SACbC,8BAA+B,yCAC/BC,sBAAuB,6BACvBC,UAAW,oBACXC,UAAW,8BACXC,WAAY,yBACZC,eAAgB,gDAEhBC,MAAO,QACPC,mBAAoB,qBACpBC,sBAAuB,0BACvBC,+BAAgC,8CAChCC,kBAAmB,uBACnBC,SAAU,mBACVC,SAAU,iBACVC,mBAAoB,oBACpBC,cAAe,OACfC,YAAa,KACbC,eAAgB,OAChBC,eAAgB,mCAChBC,mBAAoB,yCACpBC,gBAAiB,mCAEjBC,WAAY,cACZC,WAAY,aAEZC,IAAK,MACLC,uBAAwB,4BACxBC,6BAA8B,0CAC9BC,qBAAsB,yBAEtBC,MAAO,SACPC,qBAAsB,4BACtBC,qBAAsB,sCACtBC,WAAY,aACZC,QAAS,OACTC,YAAa,wDACbC,eAAgB,iBAChBC,gBAAiB,WACjBC,gBAAiB,WACjBC,kBAAmB,iDACnBC,6BAA8B,8DAC9BC,uBAAwB,kBACxBC,2BAA4B,wCAC5BC,oBAAqB,UACrBC,eAAgB,UAChBC,aAAc,6BAEdC,uBAAwB,wCAG1BC,MAAO,CACLC,EAAG,QACHC,aAAc,eACdC,gBAAiB,kBACjBC,aAAc,eACdC,aAAc,eACdC,aAAc,eACdC,iBAAkB,oBAGpBC,MAAO,CACLC,iBAAkB,mBAClBC,iBAAkB,mBAClBC,cAAe,gBACfC,gBAAiB,kBACjBC,oBAAqB,sBACrBC,4BAA6B,8BAE7BC,kBAAmB,oBAEnBC,SAAU,WAEVC,OAAQ,UACRC,UAAW,aACXC,SAAU,YACVC,OAAQ,UACRC,MAAO,QACPC,KAAM,OACNC,KAAM,OACNC,QAAS,UACTC,YAAa,cACbC,WAAY,cACZC,UAAW,gDACXC,SAAU,YAGZC,IAAK,CACHC,iBAAkB,uBAGpBC,OAAQ,CACNC,gBAAiB,CACfhC,MAAO,mBACPiC,KAAM,8CAER/B,aAAc,CACZgC,YAAa,qFACbC,KAAM,qBAERhC,gBAAiB,CACf0B,IAAK,+DACLO,+BAAgC,0FAElChC,aAAc,CACZiC,KAAM,kEACN5I,MAAO,uDACP6I,6BAA8B,sFAEhCC,cAAe,CACbV,IAAK,8EAEPtB,iBAAkB,CAChBsB,IAAK,0CAEPlD,IAAK,CACH6D,SAAU,WACVC,SAAU,WACVC,aAAc,eACdC,cAAe,gBACfC,aAAc,yCACdC,YAAa,6BAEfC,SAAU,CACRC,SAAU,WACVC,cAAe,2BACfC,YAAa,wCACbjD,MAAO,iBACPkD,cAAe,gBAEfC,UAAW,YACXC,aAAc,eACdC,iBAAkB,mBAClBC,eAAgB,iBAChBC,cAAe,2BACfC,gBAAiB,kBAEjBC,eAAgB,wBAIpBC,eAAgB,CACdzD,EAAG,QAEH0D,YAAa,cACbC,QAAS,UACTC,UAAW,YACXC,QAAS,UACTC,OAAQ,SACRC,OAAQ,SACRC,SAAU,WACVC,QAAS,WAGXC,cAAe,CACbC,MAAO,QACPC,aAAc,eACdC,UAAW,YACXC,SAAU,WACVC,SAAU,WACVC,UAAW,YACXC,WAAY,aACZC,SAAU,WACVC,WAAY,aACZjB,YAAa,cACbkB,OAAQ,SACRC,SAAU,WACVC,SAAU,WACVC,UAAW,YACXC,WAAY,aACZC,QAAS,UACTC,mBAAoB,qBACpB/D,OAAQ,SACRgE,QAAS,YCnQE,GACb7M,KAAM,UACNC,KAAM,gBAENC,MAAO,UACPC,GAAI,MACJC,IAAK,KACLC,OAAQ,SACRC,GAAI,KAEJC,MAAO,YACPC,KAAM,aACNC,OAAQ,YACRC,KAAM,WACNC,OAAQ,UACRC,KAAM,aACNC,OAAQ,aACRC,MAAO,gBACPC,YAAa,0BACbE,KAAM,aACNC,MAAO,QACPC,MAAO,OACPC,OAAQ,QACRC,QAAS,WACTC,SAAU,eACVC,OAAQ,gBACRC,6BAA8B,uBAC9BC,WAAY,oBACZC,QAAS,gBAETC,SAAU,mBACVC,SAAU,SAEV/D,KAAM,WACNgE,KAAM,SACNC,SAAU,WACVC,OAAQ,SACRC,MAAO,OACPC,MAAO,OACPC,SAAU,SACVC,SAAU,UACVC,IAAK,WACLC,MAAO,QACPC,SAAU,WAEVC,SAAU,YACVC,KAAM,OACNC,MAAO,UACPC,KAAM,SAENC,IAAK,MACLC,SAAU,2BACVC,cAAe,gBACfG,OAAQ,SACRC,MAAO,QACPC,MAAO,QACPC,KAAM,SACNC,KAAM,SACNC,KAAM,OACNC,KAAM,OACNC,MAAO,SACPC,OAAQ,sBACRC,OAAQ,yBACRC,cAAe,mBACfC,MAAO,aACPC,eAAgB,uBAChBC,eAAgB,mBAEhBC,YAAa,CACXC,eAAgB,sBAChBC,UAAW,WACXC,eAAgB,0BAChBC,yBAA0B,wDAC1BC,qBAAsB,qCACtBC,iBAAkB,yCAClBC,gBAAiB,qDACjBC,qBAAsB,mDACtBC,kBAAmB,yBACnBC,iBAAkB,0CAClBC,4BAA6B,mCAC7BC,8BAA+B,6CAC/BC,6BAA8B,0CAC9BC,UAAW,iBACXC,YAAa,SACbC,8BAA+B,iDAC/BC,sBAAuB,kCACvBC,UAAW,+BACXC,UAAW,mCACXC,WAAY,6BACZC,eAAgB,kDAEhBC,MAAO,WACPC,mBAAoB,6BACpBC,sBAAuB,sCACvBC,+BAAgC,0DAChCE,SAAU,mBACVC,SAAU,iBACVC,mBAAoB,wBACpBC,cAAe,IACfC,YAAa,KACbC,eAAgB,QAChBC,eAAgB,iDAChBC,mBAAoB,sDACpBC,gBAAiB,mDAEjBO,MAAO,gBACPC,qBAAsB,2BACtBC,qBAAsB,uCACtBC,WAAY,WACZC,QAAS,OACTC,YAAa,kEACbC,eAAgB,iBAChBC,gBAAiB,mBACjBC,gBAAiB,SACjBC,kBAAmB,mDACnBC,6BAA8B,8DAC9BC,uBAAwB,iBACxBC,2BAA4B,wCAC5BC,oBAAqB,mBACrBC,eAAgB,SAChBC,aAAc,6BAEdC,uBAAwB,iDAG1BC,MAAO,CACLC,EAAG,YACHC,aAAc,mBACdC,gBAAiB,kBACjBC,aAAc,uBACdC,aAAc,kBACdC,aAAc,0BACdC,iBAAkB,0BAGpBC,MAAO,CACLC,iBAAkB,oCAClBC,iBAAkB,mBAClBC,cAAe,oBACfC,gBAAiB,2BACjBC,oBAAqB,6BACrBC,4BAA6B,mCAE7BC,kBAAmB,sBAEnBC,SAAU,2BAEVC,OAAQ,cACRC,UAAW,gBACXC,SAAU,YACVC,OAAQ,eACRC,MAAO,aACPC,KAAM,QACNC,KAAM,QACNC,QAAS,cACTC,YAAa,oBACbC,WAAY,gBACZC,UAAW,iDACXC,SAAU,eAGZC,IAAK,CACHC,iBAAkB,qBAGpBC,OAAQ,CACNC,gBAAiB,CACfhC,MAAO,uBACPiC,KAAM,yBAER/B,aAAc,CACZgC,YAAa,sGACbC,KAAM,yBAERhC,gBAAiB,CACf0B,IAAK,iDACLO,+BAAgC,iHAElChC,aAAc,CACZiC,KAAM,0DACN5I,MAAO,iEACP6I,6BAA8B,yHAEhCC,cAAe,CACbV,IAAK,qEAEPtB,iBAAkB,CAChBsB,IAAK,2BAEPlD,IAAK,CACH6D,SAAU,gBACVC,SAAU,cACVC,aAAc,iBACdC,cAAe,iBACfC,aAAc,4BACdC,YAAa,+BAEfC,SAAU,CACRC,SAAU,mBACVC,cAAe,0BACfC,YAAa,6BACbjD,MAAO,gBACPkD,cAAe,oBAEfC,UAAW,oCACXC,aAAc,mBACdC,iBAAkB,sBAClBC,eAAgB,kBAChBC,cAAe,qCACfC,gBAAiB,sBAEjBC,eAAgB,6BAIpBC,eAAgB,CACdzD,EAAG,aAEH0D,YAAa,cACbC,QAAS,YACTC,UAAW,YACXC,QAAS,cACTC,OAAQ,gBACRC,OAAQ,WACRC,SAAU,cACVC,QAAS,aAGXC,cAAe,CACbC,MAAO,QACPC,aAAc,eACdC,UAAW,YACXC,SAAU,WACVC,SAAU,WACVC,UAAW,YACXC,WAAY,aACZC,SAAU,WACVC,WAAY,aACZjB,YAAa,cACbkB,OAAQ,SACRC,SAAU,WACVC,SAAU,WACVC,UAAW,YACXC,WAAY,aACZC,QAAS,UACTC,mBAAoB,qBACpB/D,OAAQ,SACRgE,QAAS,YCvPE,GACb7M,KAAM,SACNC,KAAM,WAENC,MAAO,QACPC,GAAI,QACJC,IAAK,OACLC,OAAQ,QACRC,GAAI,QAEJC,MAAO,SACPC,KAAM,SACNC,OAAQ,QACRC,KAAM,UACNC,OAAQ,MACRC,KAAM,YACNC,OAAQ,WACRC,MAAO,WACPC,YAAa,eACbE,KAAM,QACNC,MAAO,UACPC,MAAO,YACPC,OAAQ,MACRC,QAAS,SACTC,SAAU,gBACVC,OAAQ,mBACRC,6BAA8B,sBAC9BC,WAAY,gBACZC,QAAS,kBAETC,SAAU,gBACVC,SAAU,SAEV/D,KAAM,MACNgE,KAAM,QACNC,SAAU,WACVC,OAAQ,QACRC,MAAO,WACPC,MAAO,OACPC,SAAU,YACVC,SAAU,YACVC,IAAK,MACLC,MAAO,OACPC,SAAU,UAEVC,SAAU,UACVC,KAAM,YACNC,MAAO,WACPC,KAAM,WAENC,IAAK,OACLC,SAAU,4BACVC,cAAe,mBACfG,OAAQ,YACRC,MAAO,UACPC,MAAO,WACPC,KAAM,UACNC,KAAM,WACNC,KAAM,WACNC,KAAM,QACNC,MAAO,QACPC,OAAQ,0BACRC,OAAQ,sBACRC,cAAe,eACfC,MAAO,WACPC,eAAgB,qBAEhB6D,MAAO,CACLC,EAAG,SACHC,aAAc,eACdC,gBAAiB,mBACjBC,aAAc,mBACdC,aAAc,uBACdC,aAAc,iBACdC,iBAAkB,gCAGpBC,MAAO,CACLC,iBAAkB,2BAClBC,iBAAkB,qBAClBC,cAAe,mBACfC,gBAAiB,4BACjBC,oBAAqB,uBACrBC,4BAA6B,kCAE7BC,kBAAmB,+CAEnBC,SAAU,4BAEVC,OAAQ,aACRC,UAAW,sBACXC,SAAU,aACVC,OAAQ,aACRC,MAAO,WACPC,KAAM,QACNC,KAAM,OACNC,QAAS,SACTC,YAAa,qBACbC,WAAY,wBACZC,UAAW,iDACXC,SAAU,kBAGZC,IAAK,CACHC,iBAAkB,oBAGpBC,OAAQ,CACNC,gBAAiB,CACfhC,MAAO,sBACPiC,KAAM,gEAER/B,aAAc,CACZgC,YAAa,qGACbC,KAAM,kCAERhC,gBAAiB,CACf0B,IAAK,6EACLO,+BAAgC,oHAElChC,aAAc,CACZiC,KAAM,kGACN5I,MAAO,6EACP6I,6BAA8B,sHAEhCC,cAAe,CACbV,IAAK,oGAEPtB,iBAAkB,CAChBsB,IAAK,6DAEPlD,IAAK,CACH6D,SAAU,gBACVC,SAAU,kBACVC,aAAc,kBACdC,cAAe,iBACfC,aAAc,2DACdC,YAAa,8BAEfC,SAAU,CACRC,SAAU,kBACVC,cAAe,iBACfC,YAAa,uDACbjD,MAAO,eACPkD,cAAe,iBAEfC,UAAW,eACXC,aAAc,WACdC,iBAAkB,aAClBC,eAAgB,gBAChBC,cAAe,8BACfC,gBAAiB,eAEjBC,eAAgB,+BAIpB4B,MAAO,CACLpF,EAAG,QAEH0D,YAAa,cACbC,QAAS,eACTC,UAAW,aACXC,QAAS,eACTC,OAAQ,eACRC,OAAQ,QACRC,SAAU,cACVC,QAAS,cCvKE,GACb3L,KAAM,OACNC,KAAM,KAENC,MAAO,KACPC,GAAI,IACJC,IAAK,IACLC,OAAQ,KACRC,GAAI,KAEJC,MAAO,KACPC,KAAM,KACNC,OAAQ,KACRC,KAAM,KACNC,OAAQ,KACRC,KAAM,KACNC,OAAQ,KACRC,MAAO,KACPC,YAAa,OACbE,KAAM,KACNC,MAAO,KACPC,MAAO,KACPC,OAAQ,KACRC,QAAS,KACTC,SAAU,KACVC,OAAQ,MACRC,6BAA8B,gBAC9BC,WAAY,OACZC,QAAS,OAETC,SAAU,MACVC,SAAU,KAEV/D,KAAM,KACNgE,KAAM,KACNC,SAAU,KACVC,OAAQ,KACRC,MAAO,KACPC,MAAO,KACPC,SAAU,OACVC,SAAU,OACVC,IAAK,OACLC,MAAO,KACPC,SAAU,OAEVC,SAAU,KAEVC,KAAM,KACNC,MAAO,KACPC,KAAM,KAENC,IAAK,KACLC,SAAU,KACVC,cAAe,MACfC,IAAK,KACLC,SAAU,MACVC,OAAQ,KACRC,MAAO,KACPC,MAAO,KACPC,KAAM,KACNC,KAAM,KACNC,KAAM,KACNC,KAAM,KACNC,MAAO,KACPC,OAAQ,KACRC,OAAQ,KACRC,cAAe,OAEfI,YAAa,CACXC,eAAgB,QAChBC,UAAW,KACXC,eAAgB,eAChBC,yBAA0B,uBAC1BC,qBAAsB,WACtBC,iBAAkB,oBAClBC,gBAAiB,eACjBC,qBAAsB,oBACtBC,kBAAmB,OACnBC,iBAAkB,kBAClBC,4BAA6B,kBAC7BC,8BAA+B,aAC/BC,6BAA8B,aAC9BC,UAAW,KACXC,YAAa,KACbC,8BAA+B,uBAC/BC,sBAAuB,mBACvBC,UAAW,SACXC,UAAW,mBACXC,WAAY,kBACZC,eAAgB,uBAEhBC,MAAO,KACPC,mBAAoB,SACpBC,sBAAuB,SACvBC,+BAAgC,gBAChCC,kBAAmB,SACnBC,SAAU,aACVC,SAAU,aACVC,mBAAoB,SACpBC,cAAe,IACfC,YAAa,IACbC,eAAgB,KAChBC,eAAgB,iBAChBC,mBAAoB,eACpBC,gBAAiB,gBAEjBC,WAAY,KACZC,WAAY,aAEZE,uBAAwB,SACxBC,6BAA8B,WAC9BC,qBAAsB,SAEtBC,MAAO,SACPC,qBAAsB,aACtBC,qBAAsB,iBACtBC,WAAY,QACZC,QAAS,KACTC,YAAa,kCACbC,eAAgB,KAChBC,gBAAiB,MACjBC,gBAAiB,KACjBC,kBAAmB,mBACnBC,6BAA8B,wBAC9BC,uBAAwB,OACxBE,oBAAqB,KACrBD,2BAA4B,eAC5BE,eAAgB,IAChBC,aAAc,aAEdC,uBAAwB,eAG1BC,MAAO,CACLC,EAAG,KACHC,aAAc,OACdC,gBAAiB,OACjBC,aAAc,OACdC,aAAc,aACdC,aAAc,SACdC,iBAAkB,UAGpBC,MAAO,CACLC,iBAAkB,WAClBC,iBAAkB,SAClBC,cAAe,OACfC,gBAAiB,SACjBC,oBAAqB,QACrBC,4BAA6B,WAE7BC,kBAAmB,SAEnBC,SAAU,SAEVC,OAAQ,MACRC,UAAW,OACXC,SAAU,OACVC,OAAQ,OACRC,MAAO,MACPC,KAAM,MACNC,KAAM,KACNC,QAAS,KACTC,YAAa,QACbC,WAAY,SACZC,UAAW,qBAGbE,IAAK,CACH,iBAAoB,eAGtBE,OAAQ,CACNC,gBAAiB,CACfhC,MAAO,iBACPiC,KAAM,uBAER/B,aAAc,CACZgC,YAAa,8BACbC,KAAM,UAERhC,gBAAiB,CACf0B,IAAK,eACLO,+BAAgC,8BAElChC,aAAc,CACZiC,KAAM,+BACN5I,MAAO,iBACP6I,6BAA8B,8BAEhCC,cAAe,CACbV,IAAK,iCAEPtB,iBAAkB,CAChBsB,IAAK,kBAEPlD,IAAK,CACH6D,SAAU,OACVC,SAAU,SACVC,aAAc,OACdC,cAAe,OACfC,aAAc,eACdC,YAAa,2BAEfC,SAAU,CACRC,SAAU,OACVC,cAAe,SACfC,YAAa,eACbjD,MAAO,WACPkD,cAAe,OAEfC,UAAW,OACXC,aAAc,OACdC,iBAAkB,OAClBC,eAAgB,OAChBC,cAAe,WACfC,gBAAiB,OAEjBC,eAAgB,UAIpBC,eAAgB,CACdzD,EAAG,KAEH0D,YAAa,KACbC,QAAS,KACTC,UAAW,KACXC,QAAS,KACTC,OAAQ,KACRC,OAAQ,KACRC,SAAU,KACVC,QAAS,MAGXC,cAAe,CACbC,MAAO,KACPC,aAAc,OACdC,UAAW,MACXC,SAAU,KACVC,SAAU,OACVC,UAAW,KACXC,WAAY,OACZC,SAAU,OACVC,WAAY,OACZjB,YAAa,MACbkB,OAAQ,OACRC,SAAU,OACVC,SAAU,OACVC,UAAW,KACXC,WAAY,OACZC,QAAS,OACTC,mBAAoB,OACpB/D,OAAQ,MACRgE,QAAS,OC9PE,GACb7M,KAAM,OACNC,KAAM,KAENC,MAAO,KACPC,GAAI,IACJC,IAAK,IACLC,OAAQ,KACRC,GAAI,KAEJC,MAAO,KACPC,KAAM,KACNC,OAAQ,KACRC,KAAM,KACNC,OAAQ,KACRC,KAAM,KACNC,OAAQ,KACRC,MAAO,KACPC,YAAa,OACbE,KAAM,KACNC,MAAO,KACPC,MAAO,KACPC,OAAQ,KACRC,QAAS,KACTC,SAAU,KACVC,OAAQ,OACRC,6BAA8B,gBAC9BC,WAAY,OACZC,QAAS,OAETC,SAAU,QACVC,SAAU,KAEV/D,KAAM,KACNgE,KAAM,KACNC,SAAU,KACVC,OAAQ,KACRC,MAAO,KACPC,MAAO,KACPC,SAAU,OACVC,SAAU,OACVC,IAAK,OACLC,MAAO,MACPC,SAAU,OAEVC,SAAU,KAEVC,KAAM,KACNC,MAAO,KACPC,KAAM,KAENC,IAAK,KACLC,SAAU,KACVC,cAAe,MACfG,OAAQ,KACRC,MAAO,KACPC,MAAO,KACPC,KAAM,KACNC,KAAM,KACNC,KAAM,KACNC,KAAM,KACNC,MAAO,KACPC,OAAQ,KACRC,OAAQ,KACRC,cAAe,OAEfI,YAAa,CACXC,eAAgB,QAChBC,UAAW,KACXC,eAAgB,eAChBC,yBAA0B,uBAC1BC,qBAAsB,WACtBC,iBAAkB,oBAClBC,gBAAiB,eACjBC,qBAAsB,oBACtBC,kBAAmB,OACnBC,iBAAkB,kBAClBC,4BAA6B,kBAC7BC,8BAA+B,aAC/BC,6BAA8B,aAC9BC,UAAW,KACXC,YAAa,KACbC,8BAA+B,uBAC/BC,sBAAuB,mBACvBC,UAAW,SACXC,UAAW,mBACXC,WAAY,kBACZC,eAAgB,uBAEhBC,MAAO,KACPC,mBAAoB,SACpBC,sBAAuB,SACvBC,+BAAgC,gBAChCC,kBAAmB,SACnBC,SAAU,aACVC,SAAU,aACVC,mBAAoB,SACpBC,cAAe,IACfC,YAAa,IACbC,eAAgB,KAChBC,eAAgB,iBAChBC,mBAAoB,eACpBC,gBAAiB,gBAEjBC,WAAY,KACZC,WAAY,aAEZK,MAAO,SACPC,qBAAsB,aACtBC,qBAAsB,iBACtBC,WAAY,QACZC,QAAS,IACTC,YAAa,iCACbC,eAAgB,KAChBC,gBAAiB,QACjBC,gBAAiB,KACjBC,kBAAmB,mBACnBC,6BAA8B,wBAC9BC,uBAAwB,OACxBE,oBAAqB,KACrBD,2BAA4B,eAC5BE,eAAgB,IAChBC,aAAc,aAEdC,uBAAwB,eAG1BC,MAAO,CACLC,EAAG,KACHC,aAAc,OACdC,gBAAiB,OACjBC,aAAc,OACdC,aAAc,aACdC,aAAc,SACdC,iBAAkB,UAGpBC,MAAO,CACLC,iBAAkB,WAClBC,iBAAkB,SAClBC,cAAe,OACfC,gBAAiB,SACjBC,oBAAqB,QACrBC,4BAA6B,WAE7BC,kBAAmB,SAEnBC,SAAU,SAEVC,OAAQ,MACRC,UAAW,OACXC,SAAU,OACVC,OAAQ,OACRC,MAAO,MACPC,KAAM,MACNC,KAAM,KACNC,QAAS,KACTC,YAAa,QACbC,WAAY,SACZC,UAAW,qBAGbE,IAAK,CACH,iBAAoB,eAGtBE,OAAQ,CACNC,gBAAiB,CACfhC,MAAO,iBACPiC,KAAM,uBAER/B,aAAc,CACZgC,YAAa,8BACbC,KAAM,UAERhC,gBAAiB,CACf0B,IAAK,eACLO,+BAAgC,8BAElChC,aAAc,CACZiC,KAAM,+BACN5I,MAAO,iBACP6I,6BAA8B,8BAEhCC,cAAe,CACbV,IAAK,iCAEPtB,iBAAkB,CAChBsB,IAAK,kBAEPlD,IAAK,CACH6D,SAAU,OACVC,SAAU,SACVC,aAAc,OACdC,cAAe,OACfC,aAAc,eACdC,YAAa,2BAEfC,SAAU,CACRC,SAAU,OACVC,cAAe,SACfC,YAAa,eACbjD,MAAO,WACPkD,cAAe,OAEfC,UAAW,OACXC,aAAc,OACdC,iBAAkB,OAClBC,eAAgB,OAChBC,cAAe,WACfC,gBAAiB,OAEjBC,eAAgB,UAIpBC,eAAgB,CACdzD,EAAG,KAEH0D,YAAa,KACbC,QAAS,KACTC,UAAW,KACXC,QAAS,KACTC,OAAQ,KACRC,OAAQ,KACRC,SAAU,KACVC,QAAS,MAGXC,cAAe,CACbC,MAAO,KACPC,aAAc,OACdC,UAAW,MACXC,SAAU,KACVC,SAAU,OACVC,UAAW,KACXC,WAAY,OACZC,SAAU,OACVC,WAAY,OACZjB,YAAa,MACbkB,OAAQ,OACRC,SAAU,OACVC,SAAU,OACVC,UAAW,KACXC,WAAY,OACZC,QAAS,OACTC,mBAAoB,OACpB/D,OAAQ,MACRgE,QAAS,O,YCpPPE,EAAY,YAiBZC,EAAgB,CACpBC,QAAS,KACTC,eAAgB,IAChBC,YAAa,CACXC,aAAc,IAEhBC,OAAQ,CACNP,MAAO,KACPlK,SAAU,KACV0K,KAAM,KACN/J,MAAO,MAETgK,OAAQ,KACRC,SAAU,KACVC,qBAAqB,GAGvB,SAASC,EAAWC,GAClBC,aAAaC,QAAQd,EAAWe,KAAKC,UAAUJ,IAG3C,SAAUK,IACd,IAAMC,EAAML,aAAaM,QAAQnB,GACjC,OAAKkB,EAIEH,KAAKK,MAAMF,GAHT,GAMJ,IAAMG,EAAwC,CACnDtB,MADmD,WAEjD,MAAO,CACLuB,WAAYL,MAGhBM,UAAW,CACTC,aADS,SACIzB,EAAO0B,GAClB,IAAQ5P,EAAe4P,EAAf5P,IAAKN,EAAUkQ,EAAVlQ,MACb,GAAI,2BAAcA,GAAQ,CACxB,IAAM2P,EAAM,mBAAM,GAAInB,EAAMuB,WAAWzP,GAAMN,GAC7C,aAAImQ,IAAI3B,EAAMuB,WAAYzP,EAAKqP,QAE/B,aAAIQ,IAAI3B,EAAMuB,WAAYzP,EAAKN,GAGjCoP,EAAWZ,EAAMuB,cAGrBK,QAAS,CACPC,OADO,SACA7B,GACL,OAAO,mBAAM,GAAIE,EAAeF,EAAMuB,eChE/BO,EAAe,CAC1BC,GAAI,EACJ,GAAM,EACN,GAAM,EACN,QAAS,EACT,QAAS,GAKLC,EAAW,IAAI,IAAS,CAC5BC,QAASH,EAAaC,KAGxB,SAASG,IACP,IADkB,EAClB,EAAsBC,UAAdC,EAAR,EAAQA,UADU,iBAGCA,GAHD,IAGlB,2BAA8B,KAAnBrP,EAAmB,QAC5B,GAAIA,KAAQ+O,EACV,OAAQ/O,GALM,8BASlB,MAAO,KAGF,IAAMsP,EAAgBH,IAE7B,SAASI,IACP,IAAI7B,EAASS,IAAa,UAErBT,IACHA,EAAS4B,GAGP5B,IAAWuB,EAASvB,WAIxBuB,EAASvB,OAAOA,GAChBuB,EAASO,OAAOT,EAAarB,KAG/B6B,IAEe,QACF,EAAKN,EAASvQ,EAAEM,KAAKiQ,GCpD5B,E,kGACJ,WACE,aAAI3S,UAAUmT,GAAK,M,KAIvB,aAAIC,IAAI,G,gBCNR,aAAIA,IAAI,Q,kDCCR,aAAIA,IAAI,QAER,IAAI,EAAS,EAAKhC,SAClB,OAAQ,GACN,IAAK,QACH,EAAS,UACT,MACF,IAAK,QACH,EAAS,UACT,MACF,QACE,EAAS,EAAOiC,MAAM,IAAK,GAAG,GAC9B,MAIJ,ICpBkBC,EDoBlB,EAAiC,UAAQ,KAAwB,GAAhD,EAAjB,EAAQC,QAEO,MAAI,OAAQ,CACzB1P,KAAM,CACJ2P,QAAS,kBAAG,EAAS,GACrBC,QAAS,GAEXC,MAAO,CACLC,SAAU,S,gGExBDC,EAAwC,CACnDjD,MADmD,WAEjD,MAAO,CACL6B,OAAQ,OAGZL,UAAW,CACT0B,WADS,SACElD,EAAO0B,GAChB1B,EAAM6B,OAAS,uBAAUH,IAE3ByB,YAJS,SAIGnD,GACVA,EAAM6B,OAAS,OAGnBuB,QAAS,CACPC,gBADO,WACqB3B,GAAO,IAAjB4B,EAAiB,EAAjBA,OAChB,OAAO,IAAIC,SAAQ,SAACtQ,GAClB,IAAMuQ,EAAU,mBAAM,GAAI9B,EAAS,CACjC+B,SAAUxQ,IAGZqQ,EAAO,aAAcE,SCrBhBE,EAA4C,CACvD1D,MADuD,WAErD,MAAO,CACL6B,OAAQ,OAGZL,UAAW,CACTmC,aADS,SACI3D,EAAO0B,GACd,sBAASA,GACX1B,EAAM6B,OAAS,CACbjF,KAAM8E,GAGR1B,EAAM6B,OAAS,uBAAUH,IAG7BkC,cAVS,SAUK5D,GACZA,EAAM6B,OAAS,QClBRgC,EAA0C,CACrD7D,MADqD,WAEnD,MAAO,CACL8D,QAAQ,EACRC,aAAc,OAGlBnC,QAAS,CACPkC,OADO,SACA9D,GACL,OAAOA,EAAM8D,SAGjBtC,UAAW,CACTwC,YADS,SACGhE,GACVA,EAAM8D,QAAS,GAEjBG,aAJS,SAIIjE,GACXA,EAAM8D,QAAS,EACf9D,EAAM+D,aAAe,MAEvBG,oBARS,SAQWlE,EAAO0B,GACzB,IAAQqC,EAAiBrC,EAAjBqC,aACR/D,EAAM+D,aAAeA,MHzB3B,SAAkBpB,GAChB,+BACA,uBACA,2BACA,uBACA,qBACA,qBACA,yBACA,wBARF,CAAkBA,MAAS,KAWpB,IAAMwB,EAAgB,CAC3BxB,EAAUyB,YACVzB,EAAU0B,QACV1B,EAAU2B,UACV3B,EAAU4B,QACV5B,EAAU6B,OACV7B,EAAU8B,OACV9B,EAAU+B,SACV/B,EAAUgC,S,YIhBNC,G,sEAAU,CAAC,cAAe,SAAU,YAAa,aAAc,WAAY,WAAY,WAAY,eACnGC,EAAU,CAAC,YAAa,YAAa,aAAc,WAAY,YAC/DC,EAAgB,CAAC,YAAa,YAAa,aAAc,WAAY,WAAY,YACjFC,EAAc,CAAC,SAAU,cAAe,WAAY,YAAa,WAAY,UAC7EC,EAAa,CAAC,QAAS,gBAEvB,SAAUC,EAAeC,EAAiBlF,GAC9C,IAAIhQ,EACJ,OAAQkV,GACN,KAAKvC,EAAUyB,YACbpU,EAAS4U,EAAQO,SAASnF,GAC1B,MAEF,KAAK2C,EAAU0B,QACbrU,EAAS6U,EAAQM,SAASnF,GAC1B,MAEF,KAAK2C,EAAU2B,UACbtU,EAAS8U,EAAcK,SAASnF,GAChC,MAEF,KAAK2C,EAAU4B,QACf,KAAK5B,EAAU6B,OACb,IAAM9F,EAASsB,EAAMoF,WAAW,UAChCpV,EAASkV,IAASvC,EAAU6B,OAAS9F,GAAUA,EAC/C,MAEF,KAAKiE,EAAU8B,OACf,KAAK9B,EAAU+B,SACb,IAAM/F,EAASoG,EAAYI,SAASnF,GACpChQ,EAASkV,IAASvC,EAAU8B,OAAS9F,GAAUA,EAC/C,MAEF,KAAKgE,EAAUgC,QACb3U,EAASgV,EAAWG,SAASnF,GAC7B,MAEF,QACE,MAAMlN,MAAM,gBAGhB,OAAO9C,EAGH,SAAUqV,EAAQC,GACtB,OAAO,IAAI/B,SAAQ,SAAAtQ,GAAO,OAAIsS,WAAWtS,EAASqS,MAO9C,SAAU,EAAWvS,GACzB,IAAMyS,EAAc,OAGpBzS,EAAOA,EAAK0S,cACZ,IAAMC,EAAa,eAAI3S,GAAMP,KAAI,SAAA3B,GAAC,OAAI2U,EAAc3U,EAAE8U,WAAW,MAC3DC,EAAOC,OAAOC,cAAP,MAAAD,OAAM,eAAkBH,IAC/BK,EAAM,wDACLL,EAAW,GAAGM,SAAS,IADlB,YACyBN,EAAW,GAAGM,SAAS,IADhD,QAGZ,MAAO,CACLJ,OACAG,OAIG,IAAME,EAAY9D,UAAU+D,UAAUf,SAAS,WAEhD,SAAUgB,EAAsBC,EAAwBC,GAC5D,IAD+E,EACzEC,EAASD,EAAS7T,KAAI,SAAAf,GAAC,OAAIA,EAAE8U,QAC7BvW,EAAS,GAFgE,iBAG9DqW,GAH8D,IAG/E,2BAA2B,OAAhBG,EAAgB,yBACRJ,GADQ,IACzB,2BAA8B,KAAnBK,EAAmB,QACxBH,EAAOnB,SAASsB,EAAGF,OAInBC,EAAGzV,OAAS0V,EAAG1V,OAInBf,EAAOP,KAAKgX,GACZH,EAAO7W,KAAKgX,EAAGF,QAXQ,gCAHoD,8BAkB/E,OAAOvW,E,qFC/EH0W,GAAc,SAEd,G,WAGJ,oCACEC,KAAKC,MAAQ,KAAM/U,OAAO,CACxBgV,QAASH,GACTI,iBAAiB,IAGnBH,KAAKC,MAAMG,SAASC,QAAQC,KAAK,gBAAkB,oC,uDAG7C,SAAiB9G,GACvB,OAAKA,GAIAA,EAAQ+G,SAAS,OACpB/G,GAAW,KAGNA,EAAUuG,IAPRA,K,2BAUJ,SAAcvG,GACnBwG,KAAKC,MAAMG,SAASF,QAAUF,KAAKQ,iBAAiBhH,K,2BAG/C,WACL,OAAOwG,KAAKC,MAAMxV,IAAI,kB,2BAGjB,WACL,OAAOuV,KAAKC,MAAMxV,IAAI,wB,mBAGjB,SAAMgW,EAAajH,GACxB,IAAMxR,EAAO,IAAI0Y,gBAAgBD,GACjC,OAAOT,KAAKC,MAAMK,KAAK,cAAetY,EAAM,CAC1C2Y,eAD0C,SAC3BrS,GACb,OAAkB,MAAXA,GAA6B,MAAXA,GAE3B4R,QAASF,KAAKQ,iBAAiBhH,KAC9BoH,KAAKC,EAAIC,kB,mCAGP,WACL,OAAOd,KAAKC,MAAMxV,IAAI,oB,+BAGjB,WACL,OAAOuV,KAAKC,MAAMxV,IAAI,sB,iCAGjB,WACL,OAAOuV,KAAKC,MAAMK,KAAK,mB,yBAGlB,SAAYS,GACjB,IAAMN,EAAS,CACbM,OAEF,OAAOf,KAAKC,MAAMxV,IAAI,iBAAkB,CACtCgW,a,yBAIG,SAAYA,EAA6Bf,GAC9C,IAAI1X,EACJ,GAAI0X,EAAU,CAEZ,IADA,IAAMsB,EAAW,IAAIC,SACrB,MAA2BxY,OAAOyY,QAAQT,GAA1C,eAAmD,CAA9C,8BAAOtV,EAAP,KAAYN,EAAZ,KAEHmW,EAASG,OAAOhW,EAAKN,GAJX,uBAOU6U,GAPV,IAOZ,2BAAgC,KAArB0B,EAAqB,QAC9BJ,EAASG,OAAO,WAAYC,IARlB,8BAWZpZ,EAAOgZ,OAEPhZ,EAAO,IAAI0Y,gBAAgBD,GAE7B,OAAOT,KAAKC,MAAMK,KAAK,gBAAiBtY,GAAM4Y,KAAKC,EAAIC,kB,2BAGlD,WACL,IAAML,EAAS,CACbY,2BAA2B,GAG7B,OAAOrB,KAAKsB,eAAeb,K,4BAGtB,SAAeA,GACpB,IAAMzY,EAAO,IAAI0Y,gBAAgB,CAC/Ba,KAAMlH,KAAKC,UAAUmG,KAGvB,OAAOT,KAAKC,MAAMK,KAAK,sBAAuBtY,K,oCAGzC,SAAuB4X,EAAc4B,EAAuBC,GACjE,IAAMC,EAAYF,EAAOG,KAAK,KACxBlB,EAAc,CAClBb,OACA5T,GAAI0V,EACJD,YAGIzZ,EAAO,IAAI0Y,gBAAgBD,GACjC,OAAOT,KAAKC,MAAMK,KAAX,qBAAsCtY,GAAM4Y,KAAKC,EAAIC,kB,qBAGvD,SAAQc,GACb,IAAMnB,EAAS,CACboB,cAAeD,GAGjB,OAAO5B,KAAKC,MAAMxV,IAAI,YAAa,CACjCgW,WACCG,KAAKC,EAAIC,kB,mCAGP,WACL,OAAOd,KAAKC,MAAMK,KAAK,qC,4BAGlB,SAAeX,EAAkBmC,GACtC,OAAO9B,KAAK+B,eAAe,SAAUpC,EAAQ,CAAEmC,kB,2BAG1C,SAAcnC,GACnB,OAAOK,KAAK+B,eAAe,QAASpC,K,4BAG/B,SAAeA,GACpB,OAAOK,KAAK+B,eAAe,SAAUpC,K,mCAGhC,SAAsBA,GAC3B,OAAOK,KAAK+B,eAAe,gBAAiBpC,EAAQ,CAAE9U,MAAO,W,sCAGxD,SAAyB8U,GAC9B,OAAOK,KAAK+B,eAAe,2BAA4BpC,K,gCAGlD,SAAmBA,GACxB,OAAOK,KAAK+B,eAAe,aAAcpC,K,6BAGpC,SAAgBA,GACrB,OAAOK,KAAK+B,eAAe,UAAWpC,K,iCAGjC,SAAoBA,EAAkBxQ,GAC3C,OAAO6Q,KAAK+B,eAAe,cAAepC,EAAQ,CAAExQ,e,+BAG/C,SAAkByQ,GACvB,OAAOI,KAAKgC,cAAc,WAAYpC,K,6BAGjC,SAAgBA,EAAcmB,GACnC,IAAMN,EAAS,CACbb,OACAmB,OAGF,OAAOf,KAAKC,MAAMxV,IAAI,qBAAsB,CAC1CgW,WACCG,KAAKC,EAAIC,kB,yBAGP,SAAYlB,EAAcqC,EAAiBC,GAChD,OAAOlC,KAAKgC,cAAc,cAAepC,EAAM,CAAEqC,UAASC,a,gCAGrD,SAAmBvC,EAAkB9R,GAC1C,OAAOmS,KAAK+B,eAAe,cAAepC,EAAQ,CAAE9R,e,kCAG/C,SAAqB+R,GAC1B,IAAMa,EAAS,CACbb,QAGF,OAAOI,KAAKC,MAAMxV,IAAI,uBAAwB,CAC5CgW,WACCG,KAAKC,EAAIC,kB,mCAGP,SAAsBlB,GAC3B,IAAMa,EAAS,CACbb,QAGF,OAAOI,KAAKC,MAAMxV,IAAI,wBAAyB,CAC7CgW,WACCG,KAAKC,EAAIC,kB,6BAGP,SAAgBlB,GACrB,IAAMa,EAAS,CACbb,QAGF,OAAOI,KAAKC,MAAMxV,IAAI,kBAAmB,CACvCgW,WACCG,KAAKC,EAAIC,kB,yBAGP,WACL,IAAML,EAAS,CACb0B,UAAU,GAGZ,OAAOnC,KAAKC,MAAMxV,IAAI,aAAc,CAClCgW,WACCG,KAAKC,EAAIC,kB,wBAGP,SAAW1B,GAAsB,IAATgD,EAAS,uDAAF,GAC9B3B,EAAc,CAClBrB,MACAgD,QAGIpa,EAAO,IAAI0Y,gBAAgBD,GACjC,OAAOT,KAAKC,MAAMK,KAAK,eAAgBtY,GAAM4Y,KAAKC,EAAIC,kB,2BAGjD,SAAcsB,GACnB,IAAM3B,EAAc,CAClB2B,QAGIpa,EAAO,IAAI0Y,gBAAgBD,GACjC,OAAOT,KAAKC,MAAMK,KAAK,kBAAmBtY,GAAM4Y,KAAKC,EAAIC,kB,4BAGpD,SAAesB,GACpB,IAAM3B,EAAc,CAClB4B,SAAUD,GAGNpa,EAAO,IAAI0Y,gBAAgBD,GACjC,OAAOT,KAAKC,MAAMK,KAAK,mBAAoBtY,GAAM4Y,KAAKC,EAAIC,kB,yBAGrD,SAAYsB,EAAcE,GAC/B,IAAM7B,EAAc,CAClB4B,SAAUD,EACVG,SAAUD,GAGNta,EAAO,IAAI0Y,gBAAgBD,GACjC,OAAOT,KAAKC,MAAMK,KAAK,gBAAiBtY,GAAM4Y,KAAKC,EAAIC,kB,yBAGlD,WACL,OAAOd,KAAKC,MAAMxV,IAAI,cAAcmW,KAAKC,EAAIC,kB,wBAGxC,SAAW1W,GAA2B,IAAboY,EAAa,uDAAF,GACnC/B,EAAc,CAClBgC,SAAUrY,EACVsY,QAASrI,KAAKC,UAAUkI,IAGpBxa,EAAO,IAAI0Y,gBAAgBD,GACjC,OAAOT,KAAKC,MAAMK,KAAK,eAAgBtY,GAAM4Y,KAAKC,EAAIC,kB,2BAGjD,SAAc1W,GACnB,IAAMqW,EAAc,CAClBgC,SAAUrY,GAGNpC,EAAO,IAAI0Y,gBAAgBD,GACjC,OAAOT,KAAKC,MAAMK,KAAK,kBAAmBtY,GAAM4Y,KAAKC,EAAIC,kB,iCAKpD,WACL,OAAOd,KAAKC,MAAMK,KAAK,yBAAyBM,KAAKC,EAAIC,kB,8BAGpD,WACL,OAAOd,KAAKC,MAAMxV,IAAI,mBAAmBmW,KAAKC,EAAIC,kB,iCAQ7C,WACL,OAAOd,KAAKC,MAAMxV,IAAI,wBAAwBmW,KAAKC,EAAIC,kB,yBAGlD,SAAY6B,EAAwBC,EAA2BC,GACpE,IAAMC,EAAO,IAAIpC,gBACf,CACEiC,QAASA,GAAW,GACpBxT,SAAU0T,GAAgB,MAC1BE,QAASH,GAAc,QAE3B,OAAO5C,KAAKC,MAAMK,KAAK,gBAAiBwC,GAAMlC,KAAKC,EAAIC,kB,wBAGlD,SAAW9U,GAChB,IAAM8W,EAAO,IAAIpC,gBAAgB,CAAE1U,GAAIA,EAAGqT,aAC1C,OAAOW,KAAKC,MAAMK,KAAK,eAAgBwC,GAAMlC,KAAKC,EAAIC,kB,8BAGjD,SAAiB9U,GAEtB,OAAOgU,KAAKC,MAAMxV,IAAX,6BAAqCuB,IAAM4U,KAAKC,EAAIC,kB,0BAGtD,SAAa/Q,EAAsBiT,GACxC,IAAMF,EAAO,IAAIpC,gBAAgB,CAC/BuC,MAAOlT,EAAO3F,KACd4Y,OAAQ3I,KAAKC,UAAU0I,KAGzB,OAAOhD,KAAKC,MAAMK,KAAK,uBAAwBwC,GAAMlC,KAAKC,EAAIC,kB,2BAGxD,SAAc9Q,EAAgB4P,EAAcsD,GAClD,IAAMzC,EAAM,gBACVb,QACGsD,GAEClb,EAAO,IAAI0Y,gBAAgBD,GACjC,OAAOT,KAAKC,MAAMK,KAAX,oBAA6BtQ,GAAUhI,GAAM4Y,KAAKC,EAAIC,kB,4BAGvD,SAAe9Q,EAAgB2P,EAAkBuD,GACvD,IAAMzC,EAAM,gBACVd,OAAQA,EAAOgC,KAAK,MACjBuB,GAEClb,EAAO,IAAI0Y,gBAAgBD,GACjC,OAAOT,KAAKC,MAAMK,KAAX,oBAA6BtQ,GAAUhI,GAAM4Y,KAAKC,EAAIC,mB,6BAGvD,SAAsBqC,GAC5B,OAAOA,EAAKnb,S,KAIVob,GAAM,IAAI,GACD,MC9WA,IACb/J,MAAO,CACLgK,cAAe,GACfC,qBAAqB,GAEvBzI,UAAW,CACT0I,iBADS,SACQlK,EAAO0J,GACtB1J,EAAMgK,cAAgBN,GAExBS,kBAJS,SAISnK,GAChBA,EAAMiK,qBAAsB,GAE9BG,mBAPS,SAOUpK,GACjBA,EAAMiK,qBAAsB,IAGhCrI,QAAS,CACPyI,iBADO,SACUrK,GACf,OAAOA,EAAMgK,gBAGjB5G,QAAS,CACPkH,mBADO,YACwB,IAAVC,EAAU,EAAVA,SAEnBA,EAAS,4BAELC,wBALC,YAKmC,4JAAVD,EAAU,EAAVA,SAAU,kBAEV,GAAIE,mBAFM,OAEhCT,EAFgC,OAItCO,EAAS,gCAAiCP,GAJJ,mDAMtCO,EAAS,kCAN6B,4DAS1CG,8BAdO,WAcmCV,GAAa,IAAvB1G,EAAuB,EAAvBA,OAC9BA,EAAO,wBAAoBqH,GAE3BrH,EAAO,mBAAoB0G,IAE7BY,8BAnBO,YAmBiC,IAARtH,EAAQ,EAARA,OAC9BA,EAAO,mBAAoB,OAE7BuH,yBAtBO,WAsBgCnU,GAAM,IAAlB6T,EAAkB,EAAlBA,SACzBA,EAAS,4BAA6B7T,IAElCoU,0BAzBC,WAyBuCpU,GAAoB,0JAAhC6T,EAAgC,EAAhCA,SAAgC,kBAExD,GAAIQ,aAAarU,GAASA,EAAOsU,SAFuB,OAI9DT,EAAS,6BAA8B7T,GAJuB,6GASlEuU,2BAlCO,YAkCgC,IAAVV,EAAU,EAAVA,SAC3BA,EAAS,uBAELW,qBArCC,YAqCgC,0JAAVX,EAAU,EAAVA,SAAU,kBAE7B,GAAIY,sBAFyB,OAInCZ,EAAS,+BAJ0B,mDAMnCA,EAAS,+BAN0B,4DASjCa,4BA9CC,YA8CuC,0JAAVb,EAAU,EAAVA,SAAU,SACtCA,EAAS,2BAD6B,8CAG9Cc,4BAjDO,eCrBE,GAAa,SAAbC,EAAsBtL,EAAYxO,EAAY+Z,EAAmBC,GAC7E,GAAI,2BAAcxL,KAAuB,MAAZuL,GAAoBA,KAAYvL,GAAQ,CACpE,IAAM/O,EAAgB,MAAZsa,EAAmBvL,EAAQA,EAAMuL,GAC3C,GAAS,MAALta,GAAa,2BAAcO,GAAQ,CACtC,IAAK,IAAMia,KAAQja,EAClB8Z,EAAWra,EAAGO,EAAMia,GAAOA,EAAMD,GAElC,QAKC,OAFEA,GAAwB,OAAVha,GAAgB,aAAImQ,IAAI3B,EAAOuL,EAAW/Z,GAEnDwO,GAGI,MCJf,aAAIyC,IAAI,QAER,IAAM,GAAQ,IAAI,OAAKiJ,MAAiB,CACtChc,QAAS,CACPmS,OAAQP,EACR5E,OAAQuG,EACR0I,SAAUjI,EACVkI,QAAS/H,EACTgI,aAAcA,IAEhB7L,MAAO,CACL0H,IAAK,EACLoE,cAAUnB,EACV3T,YAAa,KACb+U,SAAU,KACVC,UAAU,GAEZxK,UAAW,CAETyK,eAFS,SAEMjM,EAAO0B,GAGpB,GAFA1B,EAAM0H,IAAMhG,EAAQgG,WACbhG,EAAQgG,IACXhG,EAAQwK,mBACHxK,EAAQwK,YACflM,EAAM8L,SAAWpK,MACZ,CACL,IAAMoK,EAAW9L,EAAM8L,SACvB,GAAIpK,EAAQyK,iBAAkB,wBACTzK,EAAQyK,kBADC,IAC5B,2BAA6C,KAAlC5F,EAAkC,QAC3C,aAAI1S,OAAOiY,EAASzF,SAAUE,IAFJ,qCAIrB7E,EAAQyK,iBAEjB,GAAIzK,EAAQ0K,mBAAoB,wBACZ1K,EAAQ0K,oBADI,IAC9B,2BAA8C,KAAnCta,EAAmC,QAC5C,aAAI+B,OAAOiY,EAAUha,IAFO,qCAIvB4P,EAAQ0K,mBAEjB,GAAI1K,EAAQ2K,aAAc,wBACN3K,EAAQ2K,cADF,IACxB,2BAAwC,KAA7B,EAA6B,QACtC,aAAIxY,OAAOiY,EAAU,IAFC,qCAIjBpK,EAAQ0K,mBAEjB,GAAWN,EAAUpK,KAGzB4K,kBA/BS,SA+BStM,EAAO0B,GACvB1B,EAAMhJ,YAAc0K,GAEtB6K,YAlCS,SAkCGvM,EAAO0B,GACjB,IAAQqE,EAAQrE,EAARqE,IACR/F,EAAM+L,SAAWhG,GAEnByG,eAtCS,SAsCMxM,EAAO0B,GACpB1B,EAAMgM,SAAWtK,IAIrBE,QAAS,CACP6K,eADO,SACQzM,GACb,OAAOA,EAAMhJ,aAEf0V,SAJO,SAIE1M,GACP,OAAOA,EAAMhJ,YAAY,cAE3B2V,YAPO,SAOK3M,GACV,QAASA,EAAM8L,UAEjB1F,YAVO,SAUKpG,GACV,OAAKA,EAAM8L,SAIJ,iBAAI9L,EAAM8L,SAASzF,UAAU,SAAC7U,EAAOM,GAAR,OAAgB,mBAAM,GAAIN,EAAO,CAAE+U,KAAMzU,OAHpE,IAKX8a,cAjBO,SAiBO5M,GACZ,IAAKA,EAAM8L,SACT,MAAO,GAGT,IAAMe,EAAa,iBAAI7M,EAAM8L,SAASe,YACpC,SAACrb,EAAOM,GAAR,OAAgB,mBAAM,GAAIN,EAAO,CAAEM,WACrC,OAAO,oBAAO+a,EAAY,SAE5BC,QA1BO,SA0BC9M,GACN,IAAKA,EAAM8L,SACT,MAAO,GAGT,IALW,EAKLiB,EAAmB,GALd,iBAMO/M,EAAM8L,SAASkB,MANtB,IAMX,2BAAuC,KAA5BhX,EAA4B,QACrC+W,EAAUtd,KAAK,CACb,IAAOuG,EACP,KAAQA,KATD,8BAYX,OAAO,oBAAO+W,EAAW,SAE3BE,uBAxCO,SAwCgBjN,EAAO4B,GAC5B,OAAO,qBAAQA,EAAQwE,aAAa,SAAA2B,GAAO,OAAIA,EAAQjS,aAEzDoX,kBA3CO,SA2CWlN,EAAO4B,GACvB,IAD8B,EACxB5R,EAAc,GADU,iBAER4R,EAAQwE,aAFA,yBAEnB2B,EAFmB,QAGtBiF,EAAcjF,EAAQiF,KAAKtK,MAAM,KACvCsK,EAAKG,SAAQ,SAAAnX,GACX,IAAIoX,EAAcpd,EAAOgG,GACpBoX,IACHA,EAAO,GACPpd,EAAOgG,GAAOoX,GAEhBA,EAAK3d,KAAKsY,OARd,2BAA2C,IAFb,8BAa9B,OAAO/X,GAETqd,mBA1DO,SA0DYrN,EAAO4B,GACxB,OAAO,qBAAQA,EAAQwE,aAAa,SAAC2B,GACnC,IAAKA,EAAQuF,QACX,MAAO,GAGT,IAAMvH,EAAM,IAAIwH,IAAIxF,EAAQuF,SAC5B,OAAOvH,EAAIyH,aAGfC,oBApEO,SAoEaC,EAAI9L,GACtB,IAD6B,EACvB5R,EAAc,GACd2d,EAAM,SAAC3N,EAAY+H,GACvB,IAAIqF,EAAcpd,EAAOgQ,GACpBoN,IACHA,EAAO,GACPpd,EAAOgQ,GAASoN,GAElBA,EAAK3d,KAAKsY,IARiB,iBAWPnG,EAAQwE,aAXD,IAW7B,2BAA2C,OAAhC2B,EAAgC,yBACtB5D,GADsB,IACzC,2BAAkC,KAAvBe,EAAuB,QAC5BD,EAAeC,EAAM6C,EAAQ/H,QAC/B2N,EAAIzI,EAAM6C,IAH2B,gCAXd,8BAmB7B,OAAO/X,IAGXoT,QAAS,CACDwK,yBADC,WACsC5W,GAAW,4JAAvBuT,EAAuB,EAAvBA,SAAuB,kBAE9C,GAAItC,eAAejR,GAF2B,uBAIxB,GAAI6W,oBAJoB,OAI9CC,EAJ8C,OAKpDvD,EAAS,kCAAmCuD,EAAcnf,MALN,qDAOpD4b,EAAS,mCAP2C,6DAUxDwD,gCAXO,WAWqC/W,GAAW,IAArBsM,EAAqB,EAArBA,OAChCA,EAAO,oBAAqBtM,IAE9BgX,gCAdO,WAeLC,MAAM,oCAKG,MAET,SAAUC,KACd,OAAO,GAGH,SAAUC,GAAa3M,EAAqB4M,GAChD,IAAMpe,EAAqC,GAO3C,OALAwR,EAAU2L,SAAQ,SAACvc,GACjB,IAAMyd,EAASD,EAAY,GAAH,OAAMA,EAAN,YAAmBxd,GAAMA,EACjDZ,EAAOY,GAAK,sCAAI0d,EAAJ,yBAAIA,EAAJ,uBAAc,GAAMhL,OAAN,SAAK,CAAQ+K,GAAR,OAAmBC,QAG7Cte,EAGH,SAAUue,GAASC,EAAkBJ,GACzC,IAAMpO,EAAQoO,EAAa,GAAMpO,MAAcoO,GAAa,GAAMpO,MAE5DhQ,EAAwD,GAM9D,OAJAwe,EAAOrB,SAAQ,SAAC5c,GACdP,EAAOO,GAAK,gBAAS,kBAAMyP,EAAMzP,SAG5BP,E,0DChNH,SAAUye,GAAYjd,EAAekd,GACzC,IAAMC,EAAQ,KAAH,IAAG,GAAMD,GACpB,OAAIld,GAASmd,EACJnd,EAAMwU,WAEXxU,GAAS,EACPA,GAASmd,EAAQ,EACZA,EAAM3I,WAGRxU,EAAMid,YAAYC,GAGpBld,EAAMod,QAAQF,EAAY,GAG7B,SAAUG,GAAWrd,GACzB,IAAMsd,EAAQ,QACVC,EAAQvd,EAAQwd,KAAKC,MAAMD,KAAKE,KAAK1d,GAAS,IAAM,EAExDA,GAAgB,KAAH,IAAI,KAAQud,GACrBvd,GAAS,MACXA,GAAS,KACTud,KAGF,IAAMI,EAAiB,IAAVJ,EAAc,IAAd,UAAuBD,EAAMC,EAAQ,GAArC,MAEb,OAAc,IAAVA,EACF,UAAUvd,EAAV,YAAmB2d,GAGrB,UAAUV,GAAYjd,EAAO,GAA7B,YAAmC2d,GAY/B,SAAUC,GAAe5d,EAAegS,GAC5C,IAAM6L,EAAS,GACTC,EAAgB,GAATD,EACPE,EAAa,GAAPD,EACNE,EAAa,IAAND,EAEPE,EAAY,CAACD,EAAMD,EAAKD,EAAMD,EAAQ,GACtCP,EAAQ,QAEVC,EAAQ,EACRW,EAAW,EACTC,EAAQ,GAERC,EAAkC,CACtCC,YAAa,EACbC,SAAU,EACVC,QAAS,GAGLC,EAAMxM,EAAUpU,OAAO6gB,OAAOL,EAAgBpM,GAAWoM,EAE/D,GAAII,EAAIF,UAAYte,GAASwe,EAAIF,SAAWP,EAC1C,MAAO,IAGT,QAASS,EAAIH,aAAeH,IAAaM,EAAIH,cAAgBd,IAAUU,EAAUtgB,OAAQ,CACvF,IAAM+gB,EAAWT,EAAUV,GAC3B,GAAIvd,EAAQ0e,EACVnB,QADF,CAGO,GAAIiB,EAAID,SAAYN,EAAUtgB,OAAS4f,GAAUiB,EAAID,QAC1D,MAGF,IAAM/f,EAASgf,KAAKC,MAAMzd,EAAQ0e,GAClCP,EAAMlgB,KAAKO,EAAS8e,EAAMC,IAG1Bvd,GAAS0e,EACTnB,IACAW,KAQF,OAAKC,EAAMxgB,OAIJwgB,EAAMrH,KAAK,KAHT,IAAMwG,EAAMW,EAAUtgB,OAAS,EAAI6gB,EAAID,SAQ5C,SAAUI,GAAgBC,GAC9B,GAAiB,MAAbA,IAAoC,IAAfA,EACvB,MAAO,GAGT,IAAMxf,EAAI,KAAMyf,KAAKD,GACrB,OAAOxf,EAAE0f,OAAO,uBAKZ,SAAUC,GAAiBH,EAAmB5M,GAClD,IAAM0M,EAAYM,KAAKC,MAAQ,IAAQL,EACvC,OAAOhB,GAAec,EAAU1M,GAK5B,SAAUkN,GAAe1b,GAG7B,OADAA,GAAY,IACZ,UAAUyZ,GAAYzZ,EAAU,GAAhC,KAKI,SAAU2b,GAAUC,GACxB,OAAKA,EAIEJ,KAAKnP,MAAMuP,GAAO,IAHhB,KA9FX,aAAIrQ,OAAO,aAAcsO,IACzB,aAAItO,OAAO,OAAQsO,IA+DnB,aAAItO,OAAO,iBAAkB6O,IAW7B,aAAI7O,OAAO,kBAAmB4P,IAO9B,aAAI5P,OAAO,mBAAoBgQ,IAQ/B,aAAIhQ,OAAO,WAAYmQ,IAUvB,aAAInQ,OAAO,YAAaoQ,ICzIxB,aAAIE,UAAU,SAAS,SAACC,EAAIC,GAC1B,IAAMC,EAAUD,EAAQE,IACxBH,EAAGI,UAAUC,OAAOH,EAASD,EAAQvf,UCJvC,IAAI4f,QAAY,EAEXA,KACHA,GAAY,OAIdC,QAAQC,IAAR,6BAAkCF,GAAlC,KACE,mEACA,uEAGa,UCZX,GAAS,WAAa,IAAIG,EAAI5K,KAAS6K,EAAGD,EAAIE,eAAmBC,EAAGH,EAAII,MAAMD,IAAIF,EAAG,OAAOE,EAAG,QAAQ,CAACE,IAAI,OAAO,CAACF,EAAG,sBAAsB,CAACG,WAAW,CAAC,CAAC9gB,KAAK,QAAQ+gB,QAAQ,uBAAuBtgB,MAAO+f,EAAe,YAAEQ,WAAW,cAAcd,IAAI,iBAAiBe,MAAM,CAAC,IAAM,GAAG,QAAUT,EAAIU,SAASC,WAAWC,QAAQ,MAAQ,OAAOC,YAAYb,EAAIc,GAAG,CAAC,CAACvgB,IAAI,SAASwgB,GAAG,WAAW,MAAO,CAACZ,EAAG,kBAAkBa,OAAM,KAAQC,MAAM,CAAChhB,MAAO+f,EAAU,OAAE9N,SAAS,SAAUgP,GAAMlB,EAAImB,OAAOD,GAAKV,WAAW,WAAW,CAACL,EAAG,SAAS,CAACc,MAAM,CAAChhB,MAAO+f,EAAiB,cAAE9N,SAAS,SAAUgP,GAAMlB,EAAIoB,cAAcF,GAAKV,WAAW,oBAAoB,GAAGL,EAAG,eAAe,CAACc,MAAM,CAAChhB,MAAO+f,EAAU,OAAE9N,SAAS,SAAUgP,GAAMlB,EAAImB,OAAOD,GAAKV,WAAW,YAAYL,EAAG,SAAS,CAACA,EAAG,aAAa,GAAIH,EAAe,YAAEG,EAAG,YAAYH,EAAIqB,KAAMrB,EAAY,SAAEG,EAAG,cAAcH,EAAIqB,KAAMrB,EAAIoB,cAAsB,SAAEjB,EAAG,cAAc,CAACc,MAAM,CAAChhB,MAAO+f,EAAIoB,cAAsB,SAAElP,SAAS,SAAUgP,GAAMlB,EAAIsB,KAAKtB,EAAIoB,cAAe,WAAYF,IAAMV,WAAW,4BAA4BR,EAAIqB,KAAMrB,EAAIoB,cAAqB,QAAEjB,EAAG,YAAY,CAACoB,GAAG,CAAC,mBAAmB,SAASC,GAAQ,OAAOxB,EAAIhF,YAAY,CAACxG,IAAKgN,MAAWP,MAAM,CAAChhB,MAAO+f,EAAIoB,cAAqB,QAAElP,SAAS,SAAUgP,GAAMlB,EAAIsB,KAAKtB,EAAIoB,cAAe,UAAWF,IAAMV,WAAW,2BAA2BR,EAAIqB,KAAMrB,EAAIoB,cAAwB,WAAEjB,EAAG,eAAe,CAACc,MAAM,CAAChhB,MAAO+f,EAAIoB,cAAwB,WAAElP,SAAS,SAAUgP,GAAMlB,EAAIsB,KAAKtB,EAAIoB,cAAe,aAAcF,IAAMV,WAAW,8BAA8BR,EAAIqB,KAAMrB,EAAIoB,cAA0B,aAAEjB,EAAG,iBAAiB,CAACc,MAAM,CAAChhB,MAAO+f,EAAIoB,cAA0B,aAAElP,SAAS,SAAUgP,GAAMlB,EAAIsB,KAAKtB,EAAIoB,cAAe,eAAgBF,IAAMV,WAAW,gCAAgCR,EAAIqB,KAAMrB,EAAIU,SAASC,WAAkB,QAAER,EAAG,WAAW,CAACsB,YAAY,cAAchB,MAAM,CAAC,IAAM,GAAG,QAAU,KAAK,CAACN,EAAG,eAAe,GAAGH,EAAIqB,KAAKlB,EAAG,gBAAgBA,EAAG,mBAAmB,IACn8DuB,GAAkB,G,+DCChB3B,GAAM,KAAM,uBAElB,SAAS4B,KACP,GAAM,4BAA6B/Q,UAAnC,CAIA,IAAMhC,EAAU3L,SAAS2e,OAAS3e,SAAS4e,SAE3C,IACEjR,UAAU+Q,wBAAwB,SAAU/S,EAAU,eAAgBkT,SAAS1Y,OAC/E,MAAO9H,GACPye,GAAI,oCAAqCze,KAI7C,SAASygB,KACP,IAAK9e,SAAS+R,KACZ,OAAO,KAGT,IAAMa,EAAS,IAAIC,gBAAgB7S,SAAS+R,KAAKgN,UAAU,IACrDxN,EAAMqB,EAAOhW,IAAI,YACvB,OAAK2U,GAILqB,EAAOvT,OAAO,YACdW,SAAS+R,KAAO,IAAMa,EAAOpB,WACtBD,GALE,KC1BX,ICyCYyN,G,GDzCR,GAAS,WAAa,IAAIjC,EAAI5K,KAAS6K,EAAGD,EAAIE,eAAmBC,EAAGH,EAAII,MAAMD,IAAIF,EAAG,OAAOE,EAAG,WAAWH,EAAIkC,GAAG,CAACjB,MAAM,CAAChhB,MAAO+f,EAAS,MAAE9N,SAAS,SAAUgP,GAAMlB,EAAI/f,MAAMihB,GAAKV,WAAW,UAAU,WAAWR,EAAI1P,OAAS0P,EAAI1P,OAAOnF,OAAS,MAAK,GAAO,CAAI6U,EAAI1P,OAAQ6P,EAAG,SAAS,CAACA,EAAG,eAAe,CAACgC,SAAS,CAAC,YAAcnC,EAAIoC,GAAGpC,EAAI1P,OAAOlH,UAAU+W,EAAG,cAAc,CAACsB,YAAY,UAAUY,MAAM,CAAC,WAAYrC,EAAIsC,UAAU,CAAEtC,EAAW,QAAEG,EAAG,eAAe,CAACM,MAAM,CAAC,MAAQT,EAAI1P,OAAOjF,KAAK,MAAQ2U,EAAI1P,OAAOiS,MAAM,YAAcvC,EAAI1P,OAAOhF,YAAY,gBAAgB0U,EAAI1P,OAAOiS,MAAM,UAAY,IAAItB,MAAM,CAAChhB,MAAO+f,EAAS,MAAE9N,SAAS,SAAUgP,GAAMlB,EAAIwC,MAAMtB,GAAKV,WAAW,WAAW,CAACR,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAI1P,OAAOjF,MAAM,OAAO,GAAG8U,EAAG,iBAAiB,CAACA,EAAG,YAAYH,EAAI0C,GAAI1C,EAAQ,MAAE,SAAS2C,EAAInF,GAAO,OAAO2C,EAAG,QAAQ,CAAC5f,IAAIid,EAAMiD,MAAM,CAAC,MAAQ,OAAO,KAAO,IAAIc,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOxB,EAAI4C,SAASD,EAAI,OAAO,CAAC3C,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGO,EAAI,IAAI,WAAU,IAAI,GAAG3C,EAAIqB,MAAM,IAC59B,GAAkB,ICwCtB,SAAYY,GACV,wBACA,wBACA,8BACA,wBACA,2BALF,CAAYA,QAAU,KCMtB,IAAMY,IAAO,wBACVZ,GAAWa,MAAQ,CAClB,CAAC,EAAG,UAAU,KAFL,kBAIVb,GAAWc,MAAQ,CAClB,CAAC,EAAG,OAAO,GACX,CAAC,EAAG,QAAQ,KANH,kBAQVd,GAAWe,SAAW,CACrB,CAAC,EAAG,WAAW,GACf,CAAC,EAAG,OAAO,KAVF,kBAYVf,GAAWgB,MAAQ,CAClB,CAAC,EAAG,WAAW,GACf,CAAC,EAAG,OAAO,KAdF,IAkBPC,GAAqB,MAEZ,IACbC,MADa,SACP9Z,EAAQ+Z,GACZ,IAAMnT,EAAY2M,GAAa,CAAC,gBAChC,EAA+BI,GAAS,CAAC,UAAW,UAApChN,EAAhB,EAAQM,OACFA,EAAS,gBAAS,WACtB,IAAKN,EAAW/P,MACd,OAAO,KAET,IAAMP,EAAI7B,OAAO6gB,OAAO,CAACvT,OAAQ,IAAK6E,EAAW/P,OAMjD,MAJM,UAAWP,EAAEyL,SACjBzL,EAAEyL,OAAOkY,MAAQD,EAAIE,KAAK5C,SAASC,WAAW4C,UAAY,KAAOL,IAG5DxjB,KAEHO,EAAQ,iBACRuiB,EAAQ,iBAERF,EAAU,gBAAS,WACvB,IAAM3O,EAAOrD,EAAOrQ,MAAO0T,KAC3B,OAAOA,IAASsO,GAAWgB,SApBT,SAuBLL,EAvBK,gGAuBpB,WAAwBY,GAAxB,uFACQC,EAAKnT,EAAOrQ,MAAOiS,SAErBuR,IACEnB,EAAQriB,MACVwjB,EAAGD,EAAWhB,EAAMviB,WAAQmZ,GAE5BqK,EAAGD,IAIPvT,EAAU2B,cAXZ,2CAvBoB,wBAqCpB,eAAMtB,GAAQ,SAACoT,GACbzjB,EAAMA,QAAUyjB,EAIdlB,EAAMviB,MAHHyjB,EAGWA,EAAEzjB,WAFFmZ,KAKlB,eAAMnZ,GAAO,SAACyjB,IACRA,GAAMpT,EAAOrQ,OAIjB2iB,EAAS,SAGX,IAAMe,EAAO,gBAAS,WACpB,IAAMrkB,EAAIgR,EAAOrQ,MACX2jB,EAActkB,GAAKA,EAAEqU,KAAQrU,EAAEqU,KAAOsO,GAAWa,MAEvD,OAAIc,IAAe3B,GAAW4B,OACrBvkB,EAAGwkB,QAGLjB,GAAQe,MAGjB,MAAO,CACLtT,SACArQ,QACAuiB,QACAF,UACAqB,OACAf,cC1IiY,M,+HCQnYmB,GAAY,gBACd,GACA,GACA,IACA,EACA,KACA,WACA,MAIa,GAAAA,GAAiB,QAYhC,KAAkBA,GAAW,CAACC,QAAA,KAAKC,SAAA,KAAMC,aAAA,QAAaC,UAAA,QAAUC,WAAA,QAAWC,WAAA,KAAQC,WAAA,KAAQC,cAAA,OC/B3F,IAAI,GAAS,WAAa,IAAIvE,EAAI5K,KAAS6K,EAAGD,EAAIE,eAAmBC,EAAGH,EAAII,MAAMD,IAAIF,EAAG,OAAOE,EAAG,aAAaH,EAAIkC,GAAG,CAACzB,MAAM,CAAC,MAAQT,EAAI1P,QAAQiR,GAAG,CAAC,MAAQvB,EAAIwE,UAAU,aAAaxE,EAAI1P,QAAO,GAAO,CAAE0P,EAAU,OAAE,CAACA,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAI1P,OAAOjF,MAAM,KAAM2U,EAAI1P,OAAe,SAAE6P,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,GAAG,MAAQ,QAAQc,GAAG,CAAC,MAAQvB,EAAI4C,WAAW,CAAC5C,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAI1P,OAAOmU,QAAUzE,EAAI1P,OAAOmU,QAAUzE,EAAI/O,GAAG,UAAU,OAAO+O,EAAIqB,MAAMrB,EAAIqB,MAAM,IACtc,GAAkB,GCsBtB,IACE8B,MADF,WAEI,IAAJ,wBACA,uCAFA,SAIA,EAJA,gGAIA,mGACA,EADA,iDAKA,kBALA,2CAJA,wBAYI,SAASP,IACP,IAAN,mBAEM4B,GAAQ,GAEJf,GACFA,IAIJ,MAAO,CACLnT,OAAN,EACMkU,QAAN,EACM5B,SAAN,KCjDwV,M,aCOpV,GAAY,gBACd,GACA,GACA,IACA,EACA,KACA,KACA,MAIa,MAAiB,QAMhC,KAAkB,GAAW,CAACoB,QAAA,KAAKU,aAAA,OCxBnC,IAAI,GAAS,WAAa,IAAI1E,EAAI5K,KAAS6K,EAAGD,EAAIE,eAAmBC,EAAGH,EAAII,MAAMD,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACsB,YAAY,YAAY,CAACtB,EAAG,QAAQ,CAACsB,YAAY,UAAUY,MAAM,CAAC,cAAerC,EAAIU,SAASC,WAAWgE,SAASlE,MAAM,CAAC,IAAM,GAAG,OAAS,GAAG,MAAQ,UAAU,MAAQ,GAAG,MAAQ,GAAG,MAAQ,IAAIc,GAAG,CAAC,MAAQvB,EAAIvN,cAAc,CAAC0N,EAAG,SAAS,CAACH,EAAIyC,GAAG,oBAAoB,GAAGtC,EAAG,WAAW,CAACM,MAAM,CAAC,MAAQ,GAAG,WAAa,GAAG,WAAa,GAAG,MAAQT,EAAI4E,YAAc,OAAS,QAAQ3D,MAAM,CAAChhB,MAAO+f,EAAIvR,MAAY,OAAEyD,SAAS,SAAUgP,GAAMlB,EAAIsB,KAAKtB,EAAIvR,MAAO,SAAUyS,IAAMV,WAAW,iBAAiB,CAACL,EAAG,SAAS,CAACA,EAAG,eAAe,CAACsB,YAAY,YAAY,CAACtB,EAAG,SAAS,CAACsB,YAAY,QAAQ,CAACzB,EAAIyC,GAAG,mBAAmBtC,EAAG,OAAO,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAGpC,EAAIvR,MAAM+D,cAAgBwN,EAAIvR,MAAM+D,aAAapJ,OAAS4W,EAAI/O,GAAG,2BAA2B,GAAGkP,EAAG,cAAc,CAACsB,YAAY,QAAQ,CAACtB,EAAG,SAAS,CAACE,IAAI,OAAOY,MAAM,CAAChhB,MAAO+f,EAAS,MAAE9N,SAAS,SAAUgP,GAAMlB,EAAI6E,MAAM3D,GAAKV,WAAW,UAAU,CAACL,EAAG,cAAc,CAACA,EAAG,QAAQ,CAACM,MAAM,CAAC,aAAa,KAAK,CAACN,EAAG,QAAQ,CAACE,IAAI,YAAY,CAACF,EAAG,eAAe,CAACG,WAAW,CAAC,CAAC9gB,KAAK,OAAO+gB,QAAQ,SAAStgB,MAAO+f,EAAInb,MAAY,OAAE2b,WAAW,iBAAiBH,IAAI,OAAOI,MAAM,CAAC,SAAW,GAAG,MAAQ,GAAG,SAAW,GAAG,MAAQT,EAAI/O,GAAG,UAAUgQ,MAAM,CAAChhB,MAAO+f,EAAS,MAAE9N,SAAS,SAAUgP,GAAMlB,EAAInb,MAAMqc,GAAKV,WAAW,WAAWL,EAAG,aAAa,CAACG,WAAW,CAAC,CAAC9gB,KAAK,OAAO+gB,QAAQ,SAAStgB,OAAQ+f,EAAInb,MAAMjH,OAAQ4iB,WAAW,kBAAkBC,MAAM,CAAC,MAAQ,MAAM,KAAOT,EAAI/O,GAAG,4BAA4B,YAAc+O,EAAI/O,GAAG,mCAAmC,eAAe,WAAW,oBAAoB,iBAAiB,MAAQ,CAAC,SAAUyS,GAAK,QAAU1D,EAAInb,MAAMjH,UAAY8lB,GAAK1D,EAAI/O,GAAG,uBAAwB,CAAE6T,KAAM,UAAc,KAAO9E,EAAIU,SAASC,WAAWoE,OAAS,EAAI,EAAE,SAAW,GAAG,WAAa/E,EAAI4E,YAAY,MAAQ5E,EAAInK,OAAOmP,KAAK,SAAsC,OAA3BhF,EAAIvR,MAAM+D,cAAuB+O,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOxB,EAAIiF,UAAU,OAAQzD,IAAS,qBAAqBxB,EAAIkF,gBAAgB,IAAI,GAAG/E,EAAG,QAAQ,CAACM,MAAM,CAAC,aAAa,KAAK,CAAET,EAAY,SAAE,CAACG,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,KAAK,GAAK,MAAM,CAACN,EAAG,aAAa,CAACM,MAAM,CAAC,eAAe,gBAAgB,MAAQT,EAAI/O,GAAG,0BAA0B,eAAc,GAAMsQ,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAIiF,UAAU,YAAazD,QAAa,GAAGrB,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,KAAK,GAAK,MAAM,CAACN,EAAG,aAAa,CAACM,MAAM,CAAC,eAAe,wBAAwB,MAAQT,EAAI/O,GAAG,kBAAkB,cAAc+O,EAAInK,OAAOsP,SAAS5D,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAIiF,UAAU,UAAWzD,QAAa,IAAIxB,EAAIqB,KAAKlB,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,KAAK,GAAK,MAAM,CAACN,EAAG,aAAa,CAACM,MAAM,CAAC,MAAQT,EAAI/O,GAAG,WAAY,GAAG,eAAe,aAAa,UAAY,GAAG,eAAe,GAAG,MAAQ+O,EAAIoF,cAAc,MAAQpF,EAAInK,OAAOtR,SAAS,iBAAgB,GAAOgd,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOxB,EAAIiF,UAAU,WAAYzD,QAAa,IAAKxB,EAAI4E,aAAe5E,EAAIqF,SAAUlF,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,KAAK,GAAK,MAAM,CAACN,EAAG,eAAe,CAACM,MAAM,CAAC,MAAQT,EAAI/O,GAAG,YAAY,eAAe,oBAAoB,UAAY,GAAG,SAAW+O,EAAInK,OAAOsP,QAAQ,YAAcnF,EAAIsF,YAAY,MAAQtF,EAAInK,OAAOsP,QAAU,KAAOnF,EAAIuF,WAAWC,UAAUjE,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAIiF,UAAU,WAAYzD,QAAa,GAAGxB,EAAIqB,KAAKlB,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,KAAK,GAAK,MAAM,CAACN,EAAG,aAAa,CAACM,MAAM,CAAC,MAAQT,EAAI/O,GAAG,uBAAuB,eAAe,iBAAiB,eAAe+O,EAAInK,OAAO1I,QAAQoU,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAIiF,UAAU,UAAWzD,QAAa,IAAKxB,EAAI4E,aAAe5E,EAAIqF,SAAUlF,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,KAAK,GAAK,MAAM,CAACN,EAAG,aAAa,CAACM,MAAM,CAAC,eAAe,qBAAqB,MAAQT,EAAI/O,GAAG,yBAAyB,cAAc+O,EAAInK,OAAO4P,eAAelE,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAIiF,UAAU,gBAAiBzD,QAAa,GAAGxB,EAAIqB,KAAMrB,EAAY,SAAE,CAACG,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,KAAK,GAAK,MAAM,CAACN,EAAG,aAAa,CAACM,MAAM,CAAC,MAAQT,EAAI/O,GAAG,6BAA6B,eAAe,sBAAsB,cAAc+O,EAAInK,OAAO6P,oBAAoBnE,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAIiF,UAAU,qBAAsBzD,QAAa,GAAGrB,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,KAAK,GAAK,MAAM,CAACN,EAAG,aAAa,CAACM,MAAM,CAAC,eAAe,oBAAoB,MAAQT,EAAI/O,GAAG,qCAAqC,cAAc+O,EAAInK,OAAO8P,oBAAoBpE,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAIiF,UAAU,qBAAsBzD,QAAa,IAAIxB,EAAIqB,MAAM,IAAI,IAAI,GAAGlB,EAAG,UAAU,CAACM,MAAM,CAAC,KAAO,UAAU,MAAQT,EAAIxS,OAAO2U,SAAS,CAAC,YAAcnC,EAAIoC,GAAGpC,EAAIxS,WAAW,GAAG2S,EAAG,iBAAiB,CAACA,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,IAAI0B,SAAS,CAAC,YAAcnC,EAAIoC,GAAGpC,EAAIqF,SAAWrF,EAAI/O,GAAG,QAAU+O,EAAI/O,GAAG,UAAUsQ,GAAG,CAAC,MAAQ,SAASC,GAAQxB,EAAIqF,UAAYrF,EAAIqF,aAAalF,EAAG,YAAYA,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,IAAIc,GAAG,CAAC,MAAQvB,EAAItN,eAAe,CAACsN,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAI/O,GAAG,WAAW,OAAOkP,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,GAAG,MAAQ,UAAU,UAAYT,EAAI6E,MAAM,QAAU7E,EAAI4F,YAAYrE,GAAG,CAAC,MAAQvB,EAAI5d,SAAS,CAAC4d,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAI/O,GAAG,WAAW,QAAQ,IAAI,IAAI,IAAI,IACl8J,GAAkB,G,sCCoNhB4U,GAAgB,CACpBb,KAAM,GACNzgB,SAAU,GACV4I,QAAQ,EACRqY,SAAU,GACVC,eAAe,EACfK,WAAW,EACXJ,oBAAoB,EACpBC,oBAAoB,EACpBR,SAAS,GAsBU,GAArB,2G,0BACE,EAAAN,OAAQ,EACR,EAAAhgB,MAAuB,GACvB,EAAAghB,cAAgBA,GAChB,EAAAN,WAAa,GACb,EAAA/X,MAAuB,KACvB,EAAAoY,YAAa,EACb,EAAAP,UAAW,EAPb,6CAuBE,WACE,OAAOxnB,OAAO6gB,OAAO,GAAImH,GAAezQ,KAAKmQ,cAxBjD,uBA0BE,WACE,OAAOnQ,KAAKsL,SAASC,WAAWoE,SA3BpC,yBA6BE,WACE,OAAO3P,KAAKiG,cAAcpa,KAAI,SAAA3B,GAAC,MAAK,CAAE+L,KAAM/L,EAAEE,KAAMS,MAAOX,EAAEiB,UA9BjE,uBAgCE,WAAe,WACb,GAAI6U,KAAKS,OAAOsP,SAAW/P,KAAKS,OAAOtR,SAAU,CAC/C,IAAMA,EAAW6Q,KAAKiG,cAAc0K,MAAK,SAAAzmB,GACvC,OAAOA,EAAEiB,MAAQ,EAAKsV,OAAOtR,YAG/B,OAAKA,EAIEA,EAAS4W,UAAY5W,EAAS/E,KAH5B4V,KAAKS,OAAOtR,SAMvB,OAAO6Q,KAAKyQ,cAAcL,WA7C9B,qBAgDE,WACEK,GAAc1Y,OAASiI,KAAK4Q,MAAMlgB,qBAElC+f,GAAcC,UAAY1Q,KAAK4Q,MAAMngB,yBACrCggB,GAAcL,SAAWpQ,KAAK4Q,MAAMrf,UACpCkf,GAAcV,QAAU/P,KAAK4Q,MAAM7f,mBArDvC,qBAwDE,WACEiP,KAAK6Q,MAAMC,SAASC,iBAAiB,OAAQ/Q,KAAKgR,QAAQ,KAzD9D,2BA6DE,SAAc3X,GACRA,EAAM+D,cACR4C,KAAK6P,UAAU,OAAQxW,EAAM+D,aAAagC,OA/DhD,2BAmEE,WACEY,KAAK6Q,MAAMC,SAASG,oBAAoB,OAAQjR,KAAKgR,QAAQ,KApEjE,uBAuEE,SAAU7lB,EAAiCN,GACrC,mBAAMA,IAAUA,IAAU4lB,GAActlB,GAC1C,aAAI+B,OAAO8S,KAAKmQ,WAAYhlB,GAE5B,aAAI6P,IAAIgF,KAAKmQ,WAAYhlB,EAAKN,KA3EpC,6EA+EE,0GACMmV,KAAKwQ,WADX,wDAKExQ,KAAKwQ,YAAa,EAClBxQ,KAAK5H,MAAQ,KAET4H,KAAKvQ,MAAMjH,QACViH,EAAUuQ,KAAVvQ,MACH,aAAIvC,OAAO8S,KAAKmQ,WAAY,SAE5B1gB,EAAQ,KAZZ,kBAgBuB,GAAIyhB,YAAYlR,KAAKmQ,WAAY1gB,GAhBxD,OAgBU0T,EAhBV,OAkBiB,QAATA,IACFnD,KAAK5H,MAAQ+K,GAnBnB,qDAsBInD,KAAK5H,MAAQ,KAAE+Y,QAtBnB,WAyBEnR,KAAKwQ,YAAa,GAEdxQ,KAAK5H,MA3BX,mDA+BE4H,KAAK1C,eAEL,aAAIpQ,OAAO8S,KAAKmQ,WAAY,QAC5BnQ,KAAKvQ,MAAQ,GAEbuQ,KAAK6Q,MAAMO,KAAKC,kBApClB,0DA/EF,kFAsHE,WACE,IAAMjE,EAAQpN,KAAK6Q,MAAMS,KAAKC,IAAIC,cAAc,oBAChDpE,EAAMqE,UAxHV,oBA2HE,SAAOvlB,GACL,IAAMwlB,EAAWxlB,EAAEylB,aACXliB,EAAUiiB,EAAVjiB,MACHA,EAAMjH,SAIX0D,EAAE0lB,iBACF5R,KAAKvQ,MAAQA,KAnIjB,wBAuIE,SAAW6e,GACJA,IAIAtO,KAAK3G,MAAM8D,SACd,aAAInC,IAAIgF,KAAKmQ,WAAY,OAAQ7B,GACjCtO,KAAK3C,kBA9IX,2BAmJE,WACE2C,KAAK6Q,MAAMO,KAAKS,eApJpB,GAAqC,cA6DnC,iBADC,gBAAM,QAAS,CAACC,MAAM,K,6BAKtB,MAsED,iBADC,gBAAM,WAAY,CAACC,WAAW,K,0BAU9B,MAGD,iBADC,gBAAM,U,6BAGN,MArJkB,GAAO,iBAlB3B,gBAAU,CACTC,SAAU,iCACL,eAAS,CACV5M,SAAU,WACVwL,MAAO,cACPvX,MAAO,aAEN,eAAW,CACZ4M,cAAe,mBAGlBgM,QAAS,kBACL,eAAa,CACd,eACA,oBAIe,cCpP6W,M,8ICQ9X,GAAY,gBACd,GACA,GACA,IACA,EACA,KACA,WACA,MAIa,MAAiB,QAsBhC,KAAkB,GAAW,CAACC,UAAA,KAAOtD,QAAA,KAAKC,SAAA,KAAMC,aAAA,QAAaC,UAAA,QAAUC,WAAA,QAAWmD,aAAA,KAAUC,QAAA,KAAKC,aAAA,KAAUC,cAAA,KAAWrD,WAAA,KAAQsD,cAAA,KAAWC,SAAA,KAAMC,SAAA,KAAMC,QAAA,KAAKxD,WAAA,KAAQC,cAAA,KAAWwD,aAAA,OCzC7K,IAAI,GAAS,WAAa,IAAI/H,EAAI5K,KAAS6K,EAAGD,EAAIE,eAAmBC,EAAGH,EAAII,MAAMD,IAAIF,EAAG,OAAOE,EAAG,SAAS,CAACsB,YAAY,SAAShB,MAAM,CAAC,MAAQ,GAAG,OAAS,KAAK,CAACT,EAAI0C,GAAI1C,EAAS,OAAE,SAAS8E,GAAM,MAAO,CAAEA,EAAa,SAAE3E,EAAG,eAAe,CAAC5f,IAAIukB,EAAK1b,MAAMqX,MAAM,CAAC,eAAeqE,EAAK7D,MAAQ6D,EAAKkD,KAAOlD,EAAK,YAAY,cAAc,IAAIjE,YAAYb,EAAIc,GAAG,CAAC,CAACvgB,IAAI,YAAYwgB,GAAG,WAAW,MAAO,CAACZ,EAAG,sBAAsB,CAACA,EAAG,oBAAoB,CAACH,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAG0C,EAAK1b,OAAO,QAAQ,KAAK4X,OAAM,IAAO,MAAK,GAAMC,MAAM,CAAChhB,MAAO6kB,EAAU,MAAE5S,SAAS,SAAUgP,GAAMlB,EAAIsB,KAAKwD,EAAM,QAAS5D,IAAMV,WAAW,eAAeR,EAAI0C,GAAIoC,EAAa,UAAE,SAASmD,EAAMvqB,GAAG,OAAOyiB,EAAG,cAAc,CAAC5f,IAAI7C,EAAE6jB,GAAG,CAAC,MAAQ,SAASC,GAAQsD,EAAK+B,OAAQ/B,EAAK+B,MAAMoB,EAAMhoB,UAAiB,CAAEgoB,EAAU,KAAE9H,EAAG,mBAAmB,CAACA,EAAG,SAAS,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAG6F,EAAMD,UAAU,GAAGhI,EAAIqB,KAAKlB,EAAG,sBAAsB,CAACA,EAAG,oBAAoB,CAACH,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAG6F,EAAM7e,OAAO,QAAQ,IAAI,MAAK,GAAI0b,EAAiB,aAAE9E,EAAI0C,GAAIoC,EAAiB,cAAE,SAASmD,EAAMvqB,GAAG,OAAOyiB,EAAG,eAAe,CAAC5f,IAAI7C,EAAE+iB,MAAM,CAAC,MAAQwH,QAAW9H,EAAG,cAAc,CAAC5f,IAAIukB,EAAK1b,MAAMmY,GAAG,CAAC,MAAQ,SAASC,GAAQsD,EAAK+B,OAAQ/B,EAAK+B,WAAkB,CAAC1G,EAAG,mBAAmB,CAACA,EAAG,SAAS,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAG0C,EAAKkD,UAAU,GAAG7H,EAAG,sBAAsB,CAACA,EAAG,oBAAoB,CAACH,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAG0C,EAAK1b,OAAO,QAAQ,IAAI,QAAO,IACl0C,GAAkB,GCDlB,GAAS,WAAa,IAAI4W,EAAI5K,KAAS6K,EAAGD,EAAIE,eAAmBC,EAAGH,EAAII,MAAMD,IAAIF,EAAG,OAAOE,EAAG,eAAe,CAACsB,YAAY,eAAehB,MAAM,CAAC,eAAeT,EAAIiB,MAAQjB,EAAIkI,MAAMF,KAAOhI,EAAIkI,MAAM,aAAarH,YAAYb,EAAIc,GAAG,CAAC,CAACvgB,IAAI,YAAYwgB,GAAG,WAAW,MAAO,CAACZ,EAAG,sBAAsB,CAACA,EAAG,oBAAoB,CAACG,WAAW,CAAC,CAAC9gB,KAAK,QAAQ+gB,QAAQ,wBAAwBtgB,MAAwB,OAAjB+f,EAAImI,SAAmB3H,WAAW,oBAAoBd,IAAI,mBAAmB,CAACM,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAIkI,MAAM9e,OAAO,QAAQ,KAAK4X,OAAM,KAAQC,MAAM,CAAChhB,MAAO+f,EAAS,MAAE9N,SAAS,SAAUgP,GAAMlB,EAAIiB,MAAMC,GAAKV,WAAW,UAAUR,EAAI0C,GAAI1C,EAAIkI,MAAc,UAAE,SAASD,EAAMvqB,GAAG,OAAOyiB,EAAG,cAAc,CAACG,WAAW,CAAC,CAAC9gB,KAAK,QAAQ+gB,QAAQ,8BAA8BtgB,MAAO+f,EAAImI,WAAaF,EAAM1nB,IAAKigB,WAAW,yBAAyBd,IAAI,wBAAwBnf,IAAI7C,EAAE6jB,GAAG,CAAC,MAAQ,SAASC,GAAiC,OAAzBA,EAAO4G,kBAAyBpI,EAAIqI,OAAOJ,EAAM1nB,QAAQ,CAAC4f,EAAG,mBAAmB,CAAEH,EAAIsI,WAAWL,EAAMD,MAAO7H,EAAG,SAAS,CAACH,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAG6F,EAAMD,MAAM,OAAO7H,EAAG,MAAM,CAACA,EAAG,QAAQ,CAACM,MAAM,CAAC,IAAMwH,EAAMD,KAAK,MAAQ,OAAO,OAAS,WAAW,IAAI,GAAG7H,EAAG,sBAAsB,CAACA,EAAG,oBAAoB,CAAE8H,EAAY,OAAE,CAAC9H,EAAG,MAAM,CAACsB,YAAY,UAAU,CAACzB,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAG6F,EAAM7e,OAAO,KAAK+W,EAAG,YAAYH,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAG6F,EAAM1R,QAAQ,MAAM,IAAI,CAACyJ,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAG6F,EAAM7e,OAAO,OAAO,IAAI,IAAI,MAAK,IAC71C,GAAkB,GCuDD,GAArB,2G,0BAIE,EAAA6X,MAAQ,EAAKiH,MAAMjH,MACnB,EAAAkH,SAA0B,KAL5B,gDAOE,WACE,IAAMnpB,EAAIoW,KAAKmT,OAAOlY,QAAQC,OAAOtB,OAAOoG,KAAK8S,MAAMG,QACnDjT,KAAK8S,MAAMM,SAASC,MAAK,SAAAR,GAAK,OAAIA,EAAM1nB,MAAQvB,KAClDoW,KAAK+S,SAAWnpB,EAEhBoW,KAAKiT,OAAO,MAEI,MAAdjT,KAAK6L,QACP7L,KAAK6L,MAAyB,MAAjB7L,KAAK+S,YAfxB,oBAmBE,SAAO5nB,GACL6U,KAAK+S,SAAW/S,KAAK+S,WAAa5nB,EAAM,KAAOA,EAC/C6U,KAAKmT,OAAOxW,OAAO,eAAgB,CACjCxR,IAAK,SACLN,MAAO,kBACJmV,KAAK8S,MAAMG,OAASjT,KAAK+S,cAxBlC,wBA6BE,SAAWH,GACT,OAAOA,EAAKnU,WAAW,YA9B3B,GAAyC,cAEvC,iBADC,mB,6BADkB,GAAW,iBAD/B,SACoB,cCxDmY,M,6ECQpZ,GAAY,gBACd,GACA,GACA,IACA,EACA,KACA,WACA,MAIa,MAAiB,QCnBhC,SAAS6U,GAAYlpB,GACnB,OAAO,UAAQ,YAAuBA,EAAxB,SD8BhB,KAAkB,GAAW,CAACqoB,SAAA,KAAMc,QAAA,KAAKC,cAAA,KAAWC,aAAA,KAAUC,iBAAAC,GAAA,KAAiBC,iBAAA,KAAcC,eAAAF,GAAA,KAAezE,WAAA,OCtB5G,IAAM1f,GAAmC,CACvC,oBAAqB,CACnBpF,KAAM,SACNwoB,KAAMU,GAAY,WAEpB,uBAAwB,CACtBlpB,KAAM,OACNwoB,KAAMU,GAAY,aAEpB,mBAAoB,CAClBlpB,KAAM,MACNwoB,KAAMU,GAAY,iBAEpB,cAAe,CACblpB,KAAM,UACNwoB,KAAMU,GAAY,YAEpB,aAAc,CACZlpB,KAAM,UACNwoB,KAAMU,GAAY,YAEpB,aAAc,CACZlpB,KAAM,SACNwoB,KAAMU,GAAY,WAEpB,cAAe,CACblpB,KAAM,KACNwoB,KAAMU,GAAY,QAIP,MCoCTQ,GAAY,CAChB,CACE9f,MAAO,EAAG,8BACVqF,MAAO2C,EAAUyB,YACjBmV,KAAM,YAER,CACE5e,MAAO,EAAG,0BACVqF,MAAO2C,EAAU0B,QACjBkV,KAAM,UAER,CACE5e,MAAO,EAAG,4BACVqF,MAAO2C,EAAU2B,UACjBiV,KAAM,SAER,CACE5e,MAAO,EAAG,0BACVqF,MAAO2C,EAAU4B,QACjBgV,KAAM,QAER,CACE5e,MAAO,EAAG,yBACVqF,MAAO2C,EAAU6B,OACjB+U,KAAM,SAER,CACE5e,MAAO,EAAG,yBACVqF,MAAO2C,EAAU8B,OACjB8U,KAAM,UAER,CACE5e,MAAO,EAAG,2BACVqF,MAAO2C,EAAU+B,SACjB6U,KAAM,kBAER,CACE5e,MAAO,EAAG,0BACVqF,MAAO2C,EAAUgC,QACjB4U,KAAM,UAoCW,GAArB,2G,0BAIE,EAAAmB,SAAuB,CACrB,CAAEnB,KAAM,YAAa5e,MAAO,EAAG,QAASyd,MAAO,kBAAM,EAAKuC,cAAc,YAAY,KACpF,CAAEpB,KAAM,0BAA2B5e,MAAO,EAAG,UAAWyd,MAAO,kBAAM,EAAKuC,cAAc,cAAc,MAGxG,EAAAC,QAAsB,CACpB,CAAErB,KAAM,cAAe5e,MAAO,MAAOyd,MAAO,kBAAM,EAAKuC,cAAc,WAAW,KAChF,CAAEpB,KAAM,cAAe5e,MAAO,EAAG,YAAayd,MAAO,kBAAM,EAAKuC,cAAc,gBAAgB,KAC9F,CAAEpB,KAAM,cAAe5e,MAAO,EAAG,0BAA2Byd,MAAO,EAAKyC,WAZ5E,gDAwBE,WACKlU,KAAKwP,cAIRxP,KAAK+T,SAAW/T,KAAK+T,SAASI,OAAOnU,KAAKiU,YA7B9C,uBAgCE,WACE,OAAOjU,KAAKsL,SAASC,WAAW4C,YAjCpC,6BAoCE,WAAe,WACb,OAAO2F,GAAUjoB,KAAI,SAAC6jB,GACpB,IAAI7kB,EAAQ,EAAKic,oBAAoB4I,EAAKrW,OACtC,yBAAYxO,KACdA,EAAQ,IAEV,IAAMuD,EAAO8Z,GAAW,mBAAMrd,EAAO,SAC/BmJ,EAAQ,GAAH,OAAM0b,EAAK1b,MAAX,aAAqBnJ,EAAMrC,OAA3B,KACL2Y,EAAS,IAAH,OAAO/S,EAAP,KACZ,MAAO,CACLwkB,KAAM,OAAF,OAASlD,EAAKkD,MAAQ5e,QAAO7I,IAAKukB,EAAKrW,MAAO8H,eA9C1D,gCAmDE,WAAkB,WAChB,MAAO,CAAC,CACNhW,IAAK,GACLf,KAAM,EAAG,mBACR+pB,OAAOnU,KAAKiG,eAAepa,KAAI,SAACsD,GACjC,IAAItE,EAAQ,EAAKyb,uBAAuBnX,EAAShE,KAC7C,yBAAYN,KACdA,EAAQ,IAEV,IAAMuD,EAAO8Z,GAAW,mBAAMrd,EAAO,SAC/BmJ,EAAQ,GAAH,OAAM7E,EAAS/E,KAAf,aAAwBS,EAAMrC,OAA9B,KACL2Y,EAAS,IAAH,OAAO/S,EAAP,KACZ,MAAO,CACLwkB,KAAM,aAAc5e,QAAO7I,IAAKgE,EAAShE,IAAKgW,eAhEtD,2BAqEE,WAAa,WACX,MAAO,CAAC,CACNhW,IAAK,GACLf,KAAM,EAAG,cACR+pB,OAAOnU,KAAKmG,SAASta,KAAI,SAACwD,GAC3B,IAAIxE,EAAQ,EAAK0b,kBAAkBlX,EAAIlE,KACnC,yBAAYN,KACdA,EAAQ,IAEV,IAAMuD,EAAO8Z,GAAW,mBAAMrd,EAAO,SAC/BmJ,EAAQ,GAAH,OAAM3E,EAAIjF,KAAV,aAAmBS,EAAMrC,OAAzB,KACL2Y,EAAS,IAAH,OAAO/S,EAAP,KACZ,MAAO,CACLwkB,KAAM,aAAc5e,QAAO7I,IAAKkE,EAAIlE,IAAKgW,eAlFjD,4BAuFE,WACE,OAAO,oBAAO1Y,OAAOyY,QAAQlB,KAAK0G,oBAAoB7a,KAAI,YAAiB,2BAAfV,EAAe,KAAVN,EAAU,KACnEuD,EAAO8Z,GAAW,mBAAMrd,EAAO,SAC/BgP,EAAO,GAAQ1O,GACf6I,EAAQ,GAAH,OAAM6F,EAAOA,EAAKzP,KAAQe,GAAO,EAAG,UAApC,aAAmDN,EAAMrC,OAAzD,KACLoqB,EAAO,uBAAU/Y,EAAOA,EAAK+Y,KAAO,KAAM,cAC1CzR,EAAS,IAAH,OAAO/S,EAAP,KACZ,MAAO,CACLwkB,OAAM5e,QAAO7I,MAAKgW,aAElB,WAjGR,iBAoGE,WACE,IAAKnB,KAAKgG,YACR,OAAOhG,KAAK+T,SAGd,IAAMK,EAA2B,GAC3BC,EAAYnM,GAAW,mBAAMlI,KAAKP,YAAa,SA0DrD,OAxDA2U,EAAatrB,KAAK,CAChB8pB,KAAM,cACN,WAAY,gBACZ5e,MAAO,EAAG,oBACV6X,MAAO,KACPoH,OAAQ,QACRG,SAAU,CACR,CACER,KAAM,oBAAqB5e,MAAO,GAAF,OAAK,EAAG,OAAR,aAAmBgM,KAAKP,YAAYjX,OAApC,KAA+C2C,IAAK,KAAMgW,OAAQ,IAAF,OAAMkT,EAAN,OAF5F,sBAIHrU,KAAKsU,sBAIZF,EAAatrB,KAAK,CAChB8pB,KAAM,cACN,WAAY,gBACZ5e,MAAO,EAAG,WAAY,GACtB6X,MAAO,KACPoH,OAAQ,WACRG,SAAU,CACR,CACER,KAAM,aAAc5e,MAAO,GAAF,OAAK,EAAG,OAAR,aAAmBgM,KAAKP,YAAYjX,OAApC,KAA+C2C,IAAK,KAAMgW,OAAQ,IAAF,OAAMkT,EAAN,OAFrF,sBAIHrU,KAAKuU,yBAIZH,EAAatrB,KAAK,CAChB8pB,KAAM,cACN,WAAY,gBACZ5e,MAAO,EAAG,MAAO,GACjB6X,MAAO,KACPoH,OAAQ,MACRG,SAAU,CACR,CACER,KAAM,aAAc5e,MAAO,GAAF,OAAK,EAAG,OAAR,aAAmBgM,KAAKP,YAAYjX,OAApC,KAA+C2C,IAAK,KAAMgW,OAAQ,IAAF,OAAMkT,EAAN,OAFrF,sBAIHrU,KAAKwU,oBAIZJ,EAAatrB,KAAK,CAChB8pB,KAAM,cACN,WAAY,gBACZ5e,MAAO,EAAG,SACV6X,MAAO,KACPoH,OAAQ,OACRG,SAAU,CACR,CACER,KAAM,aAAc5e,MAAO,GAAF,OAAK,EAAG,OAAR,aAAmBgM,KAAKP,YAAYjX,OAApC,KAA+C2C,IAAK,KAAMgW,OAAQ,IAAF,OAAMkT,EAAN,OAFrF,sBAIHrU,KAAKyU,qBAIJ,GAAkBN,OAAO,CAAC,CAACC,iBAAuBpU,KAAK+T,YApKnE,+EAuKE,8GACQ,GAAIW,gBADZ,OAGEhpB,OAAOmC,SAAS8mB,QAAO,GAHzB,2CAvKF,oFA8KE,SAAcxpB,EAAaN,GACzB,OAAOpC,OAAO6gB,OAAO,GAAItJ,KAAKnV,MAAvBpC,OAAA,OAAAA,CAAA,GAAiC0C,EAAMN,QA/KlD,GAAoC,cAElC,iBADC,mB,6BA6KD,iBADC,gBAAK,U,6BAGL,MAhLkB,GAAM,iBAjB1B,gBAAU,CACT+pB,WAAY,CACVC,YAAA,IAEF7C,SAAU,kBACL,eAAW,CACZ,cACA,cACA,gBACA,UACA,yBACA,oBACA,qBACA,4BAIe,cCvJ4W,M,yBCQ7X,GAAY,gBACd,GACA,GACA,IACA,EACA,KACA,WACA,MAIa,MAAiB,QAWhC,KAAkB,GAAW,CAACS,SAAA,KAAMkB,MAAA,QAAMH,cAAA,KAAWC,aAAA,KAAUC,iBAAAC,GAAA,KAAiBC,iBAAA,KAAcC,eAAAF,GAAA,OC9B9F,IAAI,GAAS,WACb,IAAImB,EACAlK,EAAI5K,KAAS6K,EAAGD,EAAIE,eAAmBC,EAAGH,EAAII,MAAMD,IAAIF,EAAG,OAAOE,EAAG,WAAW,CAACM,MAAM,CAAC,OAAQ,EAAK,WAAa,GAAG,MAAQ,SAAS,CAACN,EAAG,SAAS,CAACA,EAAG,YAAY,CAACM,MAAM,CAAC,KAAO,GAAG,MAAQ,YAAY,CAACN,EAAG,kBAAkB,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAGpC,EAAI/O,GAAG,cAAc,GAAGkP,EAAG,cAAc,CAACA,EAAG,SAAS,CAACE,IAAI,OAAOY,MAAM,CAAChhB,MAAO+f,EAAS,MAAE9N,SAAS,SAAUgP,GAAMlB,EAAI6E,MAAM3D,GAAKV,WAAW,UAAU,CAACL,EAAG,MAAMH,EAAIkC,GAAG,CAACT,YAAY,OAAOF,GAAG,CAAC,SAAS,SAASC,GAAQ,OAAIA,EAAO7N,KAAKwW,QAAQ,QAAQnK,EAAIoK,GAAG5I,EAAO6I,QAAQ,QAAQ,GAAG7I,EAAOjhB,IAAI,SAAkB,KAAcyf,EAAI5d,OAAO7D,MAAM,KAAM+rB,cAAc,OAAQJ,EAAO,GAAIA,EAAM,aAAgBlK,EAAIU,SAASC,WAAe,OAAM,EAAMuJ,IAAO,GAAO,CAAC/J,EAAG,eAAe,CAACM,MAAM,CAAC,eAAe,cAAc,MAAQT,EAAI/O,GAAG,kBAAkB,UAAY,GAAG,SAAW,IAAIgQ,MAAM,CAAChhB,MAAO+f,EAAW,QAAE9N,SAAS,SAAUgP,GAAMlB,EAAIpR,QAAQsS,GAAKV,WAAW,aAAaL,EAAG,eAAe,CAACM,MAAM,CAAC,eAAe,cAAc,MAAQT,EAAI/O,GAAG,YAAY,UAAY,GAAG,SAAW,IAAIgQ,MAAM,CAAChhB,MAAO+f,EAAInK,OAAe,SAAE3D,SAAS,SAAUgP,GAAMlB,EAAIsB,KAAKtB,EAAInK,OAAQ,WAAYqL,IAAMV,WAAW,qBAAqBL,EAAG,eAAe,CAACM,MAAM,CAAC,eAAe,WAAW,cAAcT,EAAIuK,aAAe,UAAY,cAAc,MAAQvK,EAAI/O,GAAG,YAAY,KAAO+O,EAAIuK,aAAe,OAAS,WAAW,SAAW,IAAIhJ,GAAG,CAAC,eAAe,SAASC,GAAQxB,EAAIuK,cAAgBvK,EAAIuK,eAAetJ,MAAM,CAAChhB,MAAO+f,EAAInK,OAAe,SAAE3D,SAAS,SAAUgP,GAAMlB,EAAIsB,KAAKtB,EAAInK,OAAQ,WAAYqL,IAAMV,WAAW,sBAAsB,KAAKL,EAAG,UAAU,CAACM,MAAM,CAAC,KAAO,UAAU,MAAQT,EAAIwK,YAAYrI,SAAS,CAAC,YAAcnC,EAAIoC,GAAGpC,EAAIwK,gBAAgB,GAAGrK,EAAG,iBAAiB,CAACA,EAAG,YAAYA,EAAG,QAAQ,CAACM,MAAM,CAAC,MAAQ,UAAU,UAAYT,EAAI6E,OAAS7E,EAAI4F,WAAW,QAAU5F,EAAI4F,YAAYrE,GAAG,CAAC,MAAQvB,EAAI5d,SAAS,CAAC4d,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAI/O,GAAG,WAAW,QAAQ,IAAI,IAAI,IACx2D,GAAkB,GCwEP,kBAAgB,CAC7BkS,MAD6B,SACvB9Z,EADuB,GACZ,IAANohB,EAAM,EAANA,KACHC,EAAQ/N,KACRvf,EAAO,eAAS,CACpBynB,OAAO,EACPe,YAAY,EACZ2E,cAAc,EACdC,WAAY,KACZ5b,QAAS8b,EAAMra,QAAQC,OAAO1B,SAAW3L,SAAS0nB,KAClD9U,OAAQ,CACNvS,SAAU,GACVC,SAAU,IAEZijB,KAAM,OAGFpkB,EAAM,yDAAG,wGACThF,EAAKwoB,WADI,oDAKPxoB,EAAKopB,KAAaS,WALX,wDASb7pB,EAAKwoB,YAAa,EATL,kBAWQ,GAAI9iB,MAAM1F,EAAKyY,OAAQzY,EAAKwR,SAXpC,UAWL2J,EAXK,OAaE,QAATA,EAbO,wBAcT,GAAIqS,cAAcxtB,EAAKwR,SAEvB8b,EAAM3Y,OAAO,eAAgB,CAC3BxR,IAAK,UACLN,MAAO7C,EAAKwR,UAEd8b,EAAM3Y,OAAO,kBAAkB,GAE/B0Y,EAAK,SAAS,GAtBL,2BA0BXrtB,EAAKotB,WAAajS,EA1BP,qDA4BXnb,EAAKotB,WAAa,KAAEjE,QA5BT,QA+BbnpB,EAAKwoB,YAAa,EA/BL,0DAAH,qDAkCZ,wCACK,eAAOxoB,IADZ,IAEEgF,cC/H8X,M,0BCOhY,GAAY,gBACd,GACA,GACA,IACA,EACA,KACA,KACA,MAIa,MAAiB,QAehC,KAAkB,GAAW,CAACklB,UAAA,KAAOtD,QAAA,KAAKC,SAAA,KAAMC,aAAA,QAAaC,UAAA,QAAUE,WAAA,KAAQuD,SAAA,KAAMtD,WAAA,KAAQC,cAAA,KAAWsG,YAAA,KAASC,cAAA,UCjCjH,IAAI,GAAS,WAAa,IAAI9K,EAAI5K,KAAS6K,EAAGD,EAAIE,eAAmBC,EAAGH,EAAII,MAAMD,IAAIF,EAAG,OAAOE,EAAG,YAAY,CAACsB,YAAY,eAAeY,MAAM,CAAC,eAAgBrC,EAAI4E,aAAanE,MAAM,CAAC,eAAeT,EAAIU,SAASC,WAAWC,QAAQ,qBAAqBZ,EAAIU,SAASC,WAAWC,QAAQ,IAAM,KAAK,CAACT,EAAG,qBAAqB,CAACoB,GAAG,CAAC,MAAQvB,EAAIJ,UAAUO,EAAG,kBAAkB,CAACG,WAAW,CAAC,CAAC9gB,KAAK,OAAO+gB,QAAQ,SAAStgB,OAAQ+f,EAAI+K,kBAAmBvK,WAAW,uBAAuBiB,YAAY,aAAa,CAACtB,EAAG,MAAM,CAACsB,YAAY,OAAOhB,MAAM,CAAC,IAAM,mCAAmCN,EAAG,OAAO,CAACsB,YAAY,sCAAsC,CAACzB,EAAIyC,GAAG,4BAA8BzC,EAAI4E,YAA4B5E,EAAIqB,KAAnBlB,EAAG,YAAqBA,EAAG,eAAe,CAACsB,YAAY,aAAahB,MAAM,CAAC,MAAQT,EAAIgL,cAAc,KAAOhL,EAAIgL,cAAc,iBAAiBhL,EAAIgL,cAAc,eAAe,GAAG,WAAahL,EAAI4E,aAAe5E,EAAI+K,kBAAkB,qBAAqB,cAAc,MAAQ/K,EAAI/O,GAAG,UAAU,MAAQ+O,EAAIiL,aAAa1J,GAAG,CAAC,MAAQ,SAASC,GAAQxB,EAAIgL,eAAgB,GAAM,KAAO,SAASxJ,GAAQxB,EAAIgL,eAAgB,GAAO,MAAQhL,EAAIkL,YAAclL,EAAI4E,YAA4B5E,EAAIqB,KAAnBlB,EAAG,aAAsB,IACjqC,GAAkB,GCuDD,GAArB,2G,0BAME,EAAA6K,eAAgB,EAmBhB,EAAAE,SAAW,sBAAQ,yDAAC,WAAOxH,GAAP,iGAEZ,EAAKyH,YAFO,OAGlB,EAAKjb,aAAa,CAChB3P,IAAK,SACLN,MAAO,CACLiF,MAAOwe,KANO,2CAAD,sDAShB,KAlCL,kDAQE,WACE,OAAOtO,KAAKmT,OAAOlY,QAAQC,OAAOtB,OAAO9J,QAT7C,uBAYE,WACE,OAAOkQ,KAAKsL,SAASC,WAAW4C,YAbpC,6BAgBE,WACE,OAAOnO,KAAKwP,cAAgBxP,KAAK4V,iBAAmB5V,KAAK6V,eAjB7D,oBAqBE,WACE,OAAQ7V,KAAKnV,UAtBjB,GAAyC,cAEvC,iBADC,gBAAKmrB,U,6BAoBN,iBADC,gBAAK,U,sBAGL,MAvBkB,GAAW,iBAP/B,gBAAU,CACT/D,QAAS,kBACJ,eAAa,CACd,qBAIe,cCxDiX,M,sCCQlY,GAAY,gBACd,GACA,GACA,IACA,EACA,KACA,WACA,MAIa,MAAiB,QAShC,KAAkB,GAAW,CAACgE,WAAA,KAAQC,kBAAA,KAAehH,WAAA,KAAQC,cAAA,KAAWuG,cAAA,UC5BxE,IAAI,GAAS,WAAa,IAAI9K,EAAI5K,KAAS6K,EAAGD,EAAIE,eAAmBC,EAAGH,EAAII,MAAMD,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACG,WAAW,CAAC,CAAC9gB,KAAK,QAAQ+gB,QAAQ,uBAAuBtgB,MAAO+f,EAAIU,SAASC,WAAiB,OAAEH,WAAW,6BAA6Bd,IAAI,iBAAiB+B,YAAY,YAAY,CAACtB,EAAG,MAAM,CAACsB,YAAY,mBAAmB,CAACtB,EAAG,MAAM,CAACsB,YAAY,WAAW,CAACtB,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,GAAG,MAAQT,EAAI/O,GAAG,UAAU,UAAY+O,EAAIuL,aAAahK,GAAG,CAAC,MAAQvB,EAAIwL,gBAAgB,CAACrL,EAAG,SAAS,CAACH,EAAIyC,GAAG,iBAAiB,GAAGtC,EAAG,YAAY,CAACM,MAAM,CAAC,SAAW,GAAG,MAAQ,MAAMN,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,GAAG,MAAQT,EAAI/O,GAAG,UAAU,UAAY+O,EAAIuL,aAAahK,GAAG,CAAC,MAAQvB,EAAIyL,iBAAiB,CAACtL,EAAG,SAAS,CAACH,EAAIyC,GAAG,eAAe,GAAGtC,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,GAAG,MAAQT,EAAI/O,GAAG,SAAS,UAAY+O,EAAIuL,aAAahK,GAAG,CAAC,MAAQvB,EAAI0L,gBAAgB,CAACvL,EAAG,SAAS,CAACH,EAAIyC,GAAG,gBAAgB,GAAGtC,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,GAAG,MAAQT,EAAI/O,GAAG,eAAe,UAAY+O,EAAIuL,aAAahK,GAAG,CAAC,MAAQvB,EAAI2L,qBAAqB,CAACxL,EAAG,SAAS,CAACH,EAAIyC,GAAG,qBAAqB,GAAGtC,EAAG,YAAY,CAACM,MAAM,CAAC,SAAW,GAAG,MAAQ,MAAMN,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,GAAG,MAAQT,EAAI/O,GAAG,QAAQ,UAAY+O,EAAIuL,aAAevL,EAAI4L,aAAahuB,OAAS,GAAG2jB,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOxB,EAAI6L,cAAc,CAAC1L,EAAG,SAAS,CAACH,EAAIyC,GAAG,uBAAuB,GAAGtC,EAAG,SAAS,CAACM,MAAM,CAAC,WAAW,IAAII,YAAYb,EAAIc,GAAG,CAAC,CAACvgB,IAAI,YAAYwgB,GAAG,SAASV,GACt3C,IAAIkB,EAAKlB,EAAIkB,GACb,MAAO,CAACpB,EAAG,QAAQH,EAAI8L,GAAG,CAACrL,MAAM,CAAC,KAAO,GAAG,MAAQT,EAAI/O,GAAG,sBAAsB,UAAY+O,EAAIuL,cAAchK,GAAI,CAACpB,EAAG,SAAS,CAACH,EAAIyC,GAAG,sBAAsB,SAAS,CAACtC,EAAG,SAAS,CAACsB,YAAY,oBAAoB,CAACtB,EAAG,cAAc,CAACoB,GAAG,CAAC,MAAQ,SAASC,GAAQA,EAAO4G,qBAAsB,CAACpI,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAI/O,GAAG,uBAAuB,OAAO+O,EAAI0C,GAAI1C,EAAiB,eAAE,SAAS8E,EAAKpnB,GAAG,OAAOyiB,EAAG,cAAc,CAAC5f,IAAI7C,EAAE6jB,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOxB,EAAI+L,oBAAoBjH,EAAKvkB,QAAQ,CAAC4f,EAAG,qBAAqB,CAACA,EAAG,SAAS,CAACH,EAAIyC,GAAG,iBAAiB,GAAGtC,EAAG,sBAAsB,CAACA,EAAG,oBAAoB,CAACH,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAG0C,EAAKtlB,MAAM,QAAQ,IAAI,MAAK2gB,EAAG,aAAaA,EAAG,cAAc,CAACoB,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOxB,EAAI+L,oBAAoB,OAAO,CAAC5L,EAAG,qBAAqB,CAACA,EAAG,SAAS,CAACH,EAAIyC,GAAG,wBAAwB,GAAGtC,EAAG,sBAAsB,CAACA,EAAG,oBAAoB,CAACH,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAI/O,GAAG,UAAU,QAAQ,IAAI,IAAI,IAAI,GAAK+O,EAAIU,SAASC,WAAWoE,OAA64B/E,EAAIqB,KAAz4B,CAAClB,EAAG,YAAY,CAACM,MAAM,CAAC,SAAW,GAAG,MAAQ,MAAMN,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,GAAG,MAAQT,EAAI/O,GAAG,qBAAqB,UAAY+O,EAAIuL,aAAahK,GAAG,CAAC,MAAQvB,EAAIgM,2BAA2B,CAAC7L,EAAG,SAAS,CAACH,EAAIyC,GAAG,qCAAqC,GAAGtC,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,GAAG,MAAQT,EAAI/O,GAAG,sBAAsB,SAAuC,IAA5B+O,EAAI4L,aAAahuB,QAAc2jB,GAAG,CAAC,MAAQvB,EAAIiM,qBAAqB,CAAC9L,EAAG,SAAS,CAACH,EAAIyC,GAAG,wBAAwB,GAAGtC,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,GAAG,MAAQT,EAAI/O,GAAG,eAAesQ,GAAG,CAAC,MAAQvB,EAAIkM,qBAAqB,CAAC/L,EAAG,SAAS,CAACH,EAAIyC,GAAG,mBAAmB,GAAGtC,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,GAAG,MAAQT,EAAI/O,GAAG,uBAAuBsQ,GAAG,CAAC,MAAQvB,EAAImM,cAAc,CAAChM,EAAG,SAAS,CAACH,EAAIyC,GAAG,iBAAiB,GAAGtC,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,GAAG,MAAQT,EAAI/O,GAAG,WAAW,SAAuC,IAA5B+O,EAAI4L,aAAahuB,QAAc2jB,GAAG,CAAC,MAAQvB,EAAIoM,kBAAkB,CAACjM,EAAG,SAAS,CAACH,EAAIyC,GAAG,yBAAyB,KAAc,GAAGtC,EAAG,cAAc,GAAGA,EAAG,MAAM,CAACsB,YAAY,iBAAiB,CAACtB,EAAG,eAAe,CAACG,WAAW,CAAC,CAAC9gB,KAAK,QAAQ+gB,QAAQ,uBAAuBtgB,MAAO+f,EAAe,YAAEQ,WAAW,cAAcd,IAAI,iBAAiBe,MAAM,CAAC,QAAUT,EAAIvK,QAAQ,MAAQuK,EAAIlL,SAAS,WAAW,OAAO,eAAe,GAAG,cAAc,GAAG,QAAUkL,EAAIlR,YAAY,QAAUkR,EAAIqM,QAAQ,MAAQ,GAAG,eAAerM,EAAIsM,YAAY,oBAAoB,GAAG/K,GAAG,CAAC,iBAAiB,SAASC,GAAQxB,EAAIlR,YAAY0S,IAASX,YAAYb,EAAIc,GAAG,CAAC,CAACvgB,IAAI,OAAOwgB,GAAG,SAASwL,GAAK,MAAO,CAACpM,EAAG,KAAK,CAAC5f,IAAIgsB,EAAIzH,KAAK9P,KAAKuM,GAAG,CAAC,SAAW,SAASC,GAAgC,OAAxBA,EAAOwF,iBAAwBhH,EAAI6L,SAASU,EAAIzH,SAAS,CAAC3E,EAAG,KAAK,CAACA,EAAG,aAAa,CAACM,MAAM,CAAC,MAAQ8L,EAAIC,WAAW,eAAe,IAAIjL,GAAG,CAAC,OAASgL,EAAIlE,WAAW,GAAGlI,EAAG,KAAK,CAACsB,YAAY,aAAahB,MAAM,CAAC,MAAQ8L,EAAIzH,KAAKtlB,OAAO,CAAC2gB,EAAG,SAAS,CAACM,MAAM,CAAC,MAAQT,EAAIyM,GAAG,aAAPzM,CAAqBuM,EAAIzH,KAAKrW,SAAS,CAACuR,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAIyM,GAAG,YAAPzM,CAAoBuM,EAAIzH,KAAKrW,QAAQ,OAAO0R,EAAG,OAAO,CAACsB,YAAY,iBAAiB,CAACzB,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGmK,EAAIzH,KAAKtlB,MAAM,QAAQ,GAAG2gB,EAAG,KAAK,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAGpC,EAAIyM,GAAG,aAAPzM,CAAqBuM,EAAIzH,KAAKthB,UAAU2c,EAAG,KAAK,CAACA,EAAG,oBAAoB,CAACsB,YAAY,mBAAmBhB,MAAM,CAAC,OAAS,QAAQ,MAA4B,IAApB8L,EAAIzH,KAAKrhB,SAAe,MAAQuc,EAAIyM,GAAG,aAAPzM,CAAqBuM,EAAIzH,KAAKrW,OAAM,EAAM8d,EAAIzH,KAAK4H,UAAU,CAACvM,EAAG,OAAO,CAACkC,MAAMrC,EAAI2M,sBAAsBJ,EAAIzH,KAAKrhB,WAAW,CAACuc,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAIyM,GAAG,WAAPzM,CAAmBuM,EAAIzH,KAAKrhB,WAAW,UAAU,GAAG0c,EAAG,KAAK,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAGpC,EAAI/O,GAAG,iBAAmBsb,EAAIzH,KAAKrW,WAAW0R,EAAG,KAAK,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAGmK,EAAIzH,KAAK8H,WAAW,IAAI5M,EAAIoC,GAAGmK,EAAIzH,KAAK+H,iBAAiB1M,EAAG,KAAK,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAGmK,EAAIzH,KAAKgI,YAAY,IAAI9M,EAAIoC,GAAGmK,EAAIzH,KAAKiI,mBAAmB5M,EAAG,KAAK,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAGpC,EAAIyM,GAAG,qBAAPzM,CAA6BuM,EAAIzH,KAAKkI,aAAa7M,EAAG,KAAK,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAGpC,EAAIyM,GAAG,qBAAPzM,CAA6BuM,EAAIzH,KAAKmI,aAAa9M,EAAG,KAAK,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAGpC,EAAIyM,GAAG,iBAAPzM,CAAyBuM,EAAIzH,KAAK/gB,IAAI,CAACwa,SAAU,UAAU4B,EAAG,KAAK,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAGmK,EAAIzH,KAAK9gB,MAAMqZ,QAAQ,OAAO8C,EAAG,KAAK,CAACA,EAAG,OAAO,CAACM,MAAM,CAAC,MAAQT,EAAIyM,GAAG,kBAAPzM,CAA0BuM,EAAIzH,KAAK7gB,YAAY,CAAC+b,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAIyM,GAAG,mBAAPzM,CAA2BuM,EAAIzH,KAAK7gB,WAAW,oBAAoBgd,MAAM,CAAChhB,MAAO+f,EAAgB,aAAE9N,SAAS,SAAUgP,GAAMlB,EAAI4L,aAAa1K,GAAKV,WAAW,mBAAmB,GAAIR,EAAIkN,SAAe,OAAE/M,EAAG,wBAAwB,CAACc,MAAM,CAAChhB,MAAO+f,EAAY,SAAE9N,SAAS,SAAUgP,GAAMlB,EAAIkN,SAAShM,GAAKV,WAAW,cAAcR,EAAIqB,KAAMrB,EAAImN,cAAoB,OAAEhN,EAAG,8BAA8B,CAACM,MAAM,CAAC,SAAWT,EAAIoN,eAAenM,MAAM,CAAChhB,MAAO+f,EAAiB,cAAE9N,SAAS,SAAUgP,GAAMlB,EAAImN,cAAcjM,GAAKV,WAAW,mBAAmBR,EAAIqB,KAAMrB,EAAIqN,cAAoB,OAAElN,EAAG,sBAAsB,CAACc,MAAM,CAAChhB,MAAO+f,EAAiB,cAAE9N,SAAS,SAAUgP,GAAMlB,EAAIqN,cAAcnM,GAAKV,WAAW,mBAAmBR,EAAIqB,KAAMrB,EAAIsN,WAAiB,OAAEnN,EAAG,cAAc,CAACM,MAAM,CAAC,IAAMT,EAAIuN,SAAShM,GAAG,CAAC,aAAa,SAASC,GAAQxB,EAAIuN,QAAQ/L,IAASP,MAAM,CAAChhB,MAAO+f,EAAc,WAAE9N,SAAS,SAAUgP,GAAMlB,EAAIsN,WAAWpM,GAAKV,WAAW,gBAAgBR,EAAIqB,MAAM,IAC3xJ,GAAkB,GCHlB,GAAS,WAAa,IAAIrB,EAAI5K,KAAS6K,EAAGD,EAAIE,eAAmBC,EAAGH,EAAII,MAAMD,IAAIF,EAAG,OAAOE,EAAG,WAAW,CAACM,MAAM,CAAC,OAAQ,EAAK,WAAaT,EAAI4E,YAAY,MAAQ,QAAQrD,GAAG,CAAC,MAAQvB,EAAIpO,cAAc,CAACuO,EAAG,SAAS,CAACA,EAAG,eAAe,CAACsB,YAAY,YAAY,CAACtB,EAAG,SAAS,CAACsB,YAAY,QAAQ,CAACzB,EAAIyC,GAAG,gBAAgBtC,EAAG,OAAO,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAGpC,EAAI/O,GAAG,8BAA8B,GAAGkP,EAAG,cAAc,CAACsB,YAAY,QAAQ,CAACzB,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAI/O,GAAG,+BAA+B,KAAKkP,EAAG,KAAK,CAACsB,YAAY,iBAAiBzB,EAAI0C,GAAI1C,EAAY,UAAE,SAASuM,EAAI7uB,GAAG,OAAOyiB,EAAG,KAAK,CAAC5f,IAAI7C,GAAG,CAACsiB,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGmK,EAAI/sB,MAAM,UAAS,GAAG2gB,EAAG,aAAa,CAACM,MAAM,CAAC,eAAe,kBAAkB,MAAQT,EAAI/O,GAAG,4BAA4BgQ,MAAM,CAAChhB,MAAO+f,EAAe,YAAE9N,SAAS,SAAUgP,GAAMlB,EAAI9I,YAAYgK,GAAKV,WAAW,iBAAkBR,EAAIwN,kBAAkB5vB,OAAS,EAAGuiB,EAAG,aAAa,CAACsB,YAAY,OAAOhB,MAAM,CAAC,eAAe,oBAAoB,MAAQT,EAAI/O,GAAG,wDAAyD+O,EAAIwN,kBAAkB5vB,SAASqjB,MAAM,CAAChhB,MAAO+f,EAAmB,gBAAE9N,SAAS,SAAUgP,GAAMlB,EAAIyN,gBAAgBvM,GAAKV,WAAW,qBAAqBR,EAAIqB,MAAM,GAAGlB,EAAG,iBAAiB,CAACA,EAAG,YAAYA,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,IAAIc,GAAG,CAAC,MAAQvB,EAAIpO,cAAc,CAACoO,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAI/O,GAAG,WAAW,OAAOkP,EAAG,QAAQ,CAACM,MAAM,CAAC,MAAQ,UAAU,SAAWT,EAAI4F,WAAW,QAAU5F,EAAI4F,YAAYrE,GAAG,CAAC,MAAQvB,EAAI5d,SAAS,CAAC4d,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAI/O,GAAG,WAAW,QAAQ,IAAI,IAAI,IACx8C,GAAkB,GCuED,GAArB,2G,0BAIE,EAAAiG,aAAc,EACd,EAAAuW,iBAAkB,EAClB,EAAAC,eAAgB,EAChB,EAAA9H,YAAa,EACb,EAAA9Q,SAAsB,GACtB,EAAA0Y,kBAA+B,GATjC,gDAaE,WACEpY,KAAKN,SAAWM,KAAKnV,MACrBmV,KAAKoY,kBAAoB5Y,EAAsBQ,KAAKP,YAAaO,KAAKN,YAf1E,uBAkBE,WACE,OAAOM,KAAKsL,SAASC,WAAWoE,SAnBpC,yBAuBE,WACE,MAAO,KAxBX,6EA2BE,0GACM3P,KAAKwQ,WADX,wDAKExQ,KAAKwQ,YAAa,EAIhB+H,EADEvY,KAAKqY,gBACYrY,KAAKN,SAASyU,OAAOnU,KAAKoY,mBAE1BpY,KAAKN,SAEpBC,EAAS4Y,EAAiB1sB,KAAI,SAACf,GAAD,OAAYA,EAAE8U,QAbpD,SAcQ,GAAI4Y,eAAe7Y,EAAQK,KAAK8B,aAdxC,OAgBE9B,KAAKxD,cAhBP,gDA3BF,8DAAiD,cAE/C,iBADC,gBAAKic,Q,6BAsBN,iBADC,gBAAK,U,2BAGL,MAzBkB,GAAmB,iBALvC,gBAAU,CACTzG,SAAU,kBACL,eAAW,CAAC,oBAGE,cCxE2Y,MCQ5Z,I,UAAY,gBACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,MAAiB,QAahC,KAAkB,GAAW,CAACpD,QAAA,KAAKC,SAAA,KAAMC,aAAA,QAAaC,UAAA,QAAUC,WAAA,QAAWmD,aAAA,KAAUlD,WAAA,KAAQwD,SAAA,KAAMvD,WAAA,OChCnG,IAAI,GAAS,WAAa,IAAItE,EAAI5K,KAAS6K,EAAGD,EAAIE,eAAmBC,EAAGH,EAAII,MAAMD,IAAIF,EAAG,OAAOE,EAAG,WAAW,CAACM,MAAM,CAAC,OAAQ,EAAK,WAAaT,EAAI4E,YAAY,MAAQ,QAAQrD,GAAG,CAAC,MAAQvB,EAAIpO,cAAc,CAACuO,EAAG,SAAS,CAACA,EAAG,eAAe,CAACsB,YAAY,YAAY,CAACtB,EAAG,SAAS,CAACsB,YAAY,QAAQ,CAACzB,EAAIyC,GAAG,gBAAgBtC,EAAG,OAAO,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAGpC,EAAI/O,GAAG,2BAA2B,GAAGkP,EAAG,cAAc,CAACsB,YAAY,QAAQ,CAAEzB,EAAY,SAAE,CAACA,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAI/O,GAAG,2BAA4B,CAAE1M,SAAUyb,EAAIzb,YAAa,MAAM,CAACyb,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAI/O,GAAG,8BAA8B,MAAMkP,EAAG,KAAK,CAACsB,YAAY,iBAAiBzB,EAAI0C,GAAI1C,EAAY,UAAE,SAASuM,EAAI7uB,GAAG,OAAOyiB,EAAG,KAAK,CAAC5f,IAAI7C,GAAG,CAACsiB,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGmK,EAAI/sB,MAAM,UAAS,GAAIwgB,EAAIwN,kBAAkB5vB,OAAS,EAAGuiB,EAAG,aAAa,CAACsB,YAAY,OAAOhB,MAAM,CAAC,eAAe,oBAAoB,MAAQT,EAAI/O,GAAG,mDAAoD+O,EAAIwN,kBAAkB5vB,SAASqjB,MAAM,CAAChhB,MAAO+f,EAAiB,cAAE9N,SAAS,SAAUgP,GAAMlB,EAAI0N,cAAcxM,GAAKV,WAAW,mBAAmBR,EAAIqB,MAAM,GAAGlB,EAAG,iBAAiB,CAACA,EAAG,YAAYA,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,IAAIc,GAAG,CAAC,MAAQvB,EAAIpO,cAAc,CAACoO,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAI/O,GAAG,WAAW,OAAOkP,EAAG,QAAQ,CAACM,MAAM,CAAC,MAAQ,UAAU,SAAWT,EAAI4F,WAAW,QAAU5F,EAAI4F,YAAYrE,GAAG,CAAC,MAAQvB,EAAI5d,SAAS,CAAC4d,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAI/O,GAAG,WAAW,QAAQ,IAAI,IAAI,IACt1C,GAAkB,GCuED,GAArB,2G,0BAOE,EAAAyc,eAAgB,EAChB,EAAA9H,YAAa,EACb,EAAA9Q,SAAsB,GACtB,EAAA0Y,kBAA+B,GAVjC,gDAcE,WACEpY,KAAKN,SAAWM,KAAKnV,MACrBmV,KAAKoY,kBAAoB5Y,EAAsBQ,KAAKP,YAAaO,KAAKN,YAhB1E,uBAmBE,WACE,OAAOM,KAAKsL,SAASC,WAAWoE,SApBpC,yBAwBE,WACE,MAAO,KAzBX,6EA4BE,0GACM3P,KAAKwQ,WADX,wDAKExQ,KAAKwQ,YAAa,EAIhBkI,EADE1Y,KAAKsY,cACUtY,KAAKN,SAASyU,OAAOnU,KAAKoY,mBAE1BpY,KAAKN,SAElBC,EAAS+Y,EAAe7sB,KAAI,SAACf,GAAD,OAAYA,EAAE8U,QAblD,SAcQ,GAAI+W,oBAAoBhX,EAAQK,KAAK7Q,UAd7C,OAgBE6Q,KAAKxD,cAhBP,gDA5BF,8DAAsD,cAEpD,iBADC,gBAAKic,Q,6BAIN,iBADC,gBAAKvZ,S,gCAoBN,iBADC,gBAAK,U,2BAGL,MA1BkB,GAAwB,iBAL5C,gBAAU,CACT8S,SAAU,kBACL,eAAW,CAAC,oBAGE,cCxEgZ,MCQja,I,UAAY,gBACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,MAAiB,QAahC,KAAkB,GAAW,CAACpD,QAAA,KAAKC,SAAA,KAAMC,aAAA,QAAaC,UAAA,QAAUC,WAAA,QAAWmD,aAAA,KAAUlD,WAAA,KAAQwD,SAAA,KAAMvD,WAAA,OChCnG,IAAI,GAAS,WAAa,IAAItE,EAAI5K,KAAS6K,EAAGD,EAAIE,eAAmBC,EAAGH,EAAII,MAAMD,IAAIF,EAAG,OAAOE,EAAG,WAAW,CAACM,MAAM,CAAC,OAAQ,EAAK,WAAaT,EAAI4E,YAAY,WAAa,GAAG,MAAQ,QAAQrD,GAAG,CAAC,MAAQvB,EAAIpO,cAAc,CAACuO,EAAG,SAAS,CAACA,EAAG,eAAe,CAACsB,YAAY,YAAY,CAACtB,EAAG,SAAS,CAACsB,YAAY,QAAQ,CAACzB,EAAIyC,GAAG,gBAAgBtC,EAAG,OAAO,CAACH,EAAIyC,GAAG,mBAAmB,GAAGtC,EAAG,cAAc,CAACsB,YAAY,QAAQ,CAACtB,EAAG,YAAY,CAACc,MAAM,CAAChhB,MAAO+f,EAAQ,KAAE9N,SAAS,SAAUgP,GAAMlB,EAAI+N,KAAK7M,GAAKV,WAAW,SAAS,CAACL,EAAG,mBAAmB,CAACA,EAAG,iBAAiB,CAACM,MAAM,CAAC,SAAWT,EAAI+N,KAAO,EAAE,KAAO,MAAM,CAAC/N,EAAIyC,GAAG,cAActC,EAAG,aAAaA,EAAG,iBAAiB,CAACM,MAAM,CAAC,SAAWT,EAAI+N,KAAO,EAAE,KAAO,MAAM,CAAC/N,EAAIyC,GAAG,eAAetC,EAAG,aAAaA,EAAG,iBAAiB,CAACM,MAAM,CAAC,SAAWT,EAAI+N,KAAO,EAAE,KAAO,MAAM,CAAC/N,EAAIyC,GAAG,eAAe,GAAGtC,EAAG,kBAAkB,CAACA,EAAG,oBAAoB,CAACM,MAAM,CAAC,KAAO,MAAM,CAACN,EAAG,SAAS,CAACc,MAAM,CAAChhB,MAAO+f,EAAS,MAAE9N,SAAS,SAAUgP,GAAMlB,EAAI6E,MAAM3D,GAAKV,WAAW,UAAU,CAACL,EAAG,eAAe,CAACM,MAAM,CAAC,MAAQ,SAAS,MAAQ,CAAC,SAAUiD,GAAK,QAASA,GAAK,aAAe,YAAc,eAAe,SAAW,IAAIzC,MAAM,CAAChhB,MAAO+f,EAAU,OAAE9N,SAAS,SAAUgP,GAAMlB,EAAIjd,OAAOme,GAAKV,WAAW,YAAYL,EAAG,eAAe,CAACM,MAAM,CAAC,MAAQ,WAAWQ,MAAM,CAAChhB,MAAO+f,EAAW,QAAE9N,SAAS,SAAUgP,GAAMlB,EAAIgO,QAAQ9M,GAAKV,WAAW,cAAc,IAAI,GAAGL,EAAG,oBAAoB,CAACM,MAAM,CAAC,KAAO,MAAM,CAACT,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAIiO,OAAOrwB,QAAQ,2BAA2BuiB,EAAG,KAAK,CAACsB,YAAY,iBAAiBzB,EAAI0C,GAAI1C,EAAU,QAAE,SAASuM,EAAI7uB,GAAG,OAAOyiB,EAAG,KAAK,CAAC5f,IAAI7C,GAAG,CAACsiB,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGmK,EAAI/sB,MAAM,KAAK2gB,EAAG,MAAMH,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGmK,EAAIlV,SAAS,KAAK8I,EAAG,MAAMH,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGmK,EAAIjV,QAAQ,UAAS,KAAK6I,EAAG,oBAAoB,CAACM,MAAM,CAAC,KAAO,MAAM,CAAET,EAAI4F,YAAc5F,EAAIkO,cAAgBlO,EAAIiO,OAAOrwB,OAAQuiB,EAAG,oBAAoB,CAACM,MAAM,CAAC,MAAQT,EAAIkO,aAAelO,EAAIiO,OAAOrwB,OAAS,OAAO,CAACoiB,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAIkO,cAAc,2BAA2B,IAAI,IAAI,IAAI,GAAG/N,EAAG,iBAAiB,CAACA,EAAG,YAAaH,EAAI+N,KAAO,EAAG5N,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,IAAI0B,SAAS,CAAC,YAAcnC,EAAIoC,GAAe,GAAZpC,EAAI+N,KAAY/N,EAAI/O,GAAG,UAAY+O,EAAI/O,GAAG,UAAUsQ,GAAG,CAAC,MAAQvB,EAAIrV,OAAO,CAACqV,EAAIyC,GAAG,YAAYzC,EAAIqB,KAAKlB,EAAG,QAAQ,CAACM,MAAM,CAAC,MAAQ,UAAU,UAAYT,EAAImO,QAAQ,QAAUnO,EAAI4F,YAAYzD,SAAS,CAAC,YAAcnC,EAAIoC,GAAG,CAAC,KAAMpC,EAAI/O,GAAG,QAAS+O,EAAI/O,GAAG,WAAY+O,EAAI/O,GAAG,UAAU+O,EAAI+N,QAAQxM,GAAG,CAAC,MAAQvB,EAAIoO,WAAW,IAAI,IAAI,IACr3E,GAAkB,GCqHD,I,8BAArB,2G,0BAIE,EAAAL,KAAO,EACP,EAAAlJ,OAAQ,EACR,EAAAe,YAAa,EACb,EAAA9Q,SAAsB,GACtB,EAAA/R,OAAS,GACT,EAAAirB,QAAU,GACV,EAAAC,OAAgB,GAChB,EAAAC,aAAe,EAXjB,gDAeE,WACE9Y,KAAKN,SAAWM,KAAKnV,QAhBzB,uBAmBE,WACE,OAAOmV,KAAKsL,SAASC,WAAWoE,SApBpC,mBAsBE,WACE,QAAkB,IAAd3P,KAAK2Y,OAAc3Y,KAAKyP,SAGV,IAAdzP,KAAK2Y,MAAc3Y,KAAK6Y,OAAOrwB,OAAS,GAG1B,IAAdwX,KAAK2Y,OAAe3Y,KAAKwQ,cA7BjC,yBAoCE,WACE,MAAO,KArCX,yBAwCE,WAAW,WACHyI,EAAQ,IAAIC,OAAOlZ,KAAKrS,QAE9B,OAAO,mBAAMqS,KAAKN,UACf7T,KAAI,YAA4B,IAAzB8a,EAAyB,EAAzBA,QAAS/G,EAAgB,EAAhBA,KAAMxV,EAAU,EAAVA,KACf8X,EAASyE,EAAQiS,QAAQK,EAAO,EAAKL,SAC3C,OAAO1W,IAAWyE,EAAU,KAAO,CACjC/G,OACAxV,OACA6X,QAAS0E,EACTzE,aAEDiX,UAAUtuB,UApDnB,kBAuDE,WACoB,IAAdmV,KAAK2Y,KAIT3Y,KAAK2Y,OAHH3Y,KAAKxD,gBAzDX,6EA+DE,2GACoB,IAAdwD,KAAK2Y,KADX,uBAEI3Y,KAAK6Y,OAAS7Y,KAAKoZ,cACnBpZ,KAAK2Y,OAHT,6BAMoB,IAAd3Y,KAAK2Y,KANX,uBAOI3Y,KAAKxD,cAPT,8BAWMwD,KAAKwQ,WAXX,iDAeExQ,KAAKwQ,YAAa,EAClBxQ,KAAK2Y,OAEL3Y,KAAK8Y,aAAe,EAlBtB,iBAoBqB9Y,KAAK6Y,QApB1B,kEAoBanJ,EApBb,kBAqBU,GAAIqH,YAAYrH,EAAK9P,KAAM8P,EAAKzN,QAASyN,EAAKxN,QArBxD,QAsBIlC,KAAK8Y,eAtBT,oJAyBE9Y,KAAKwQ,YAAa,EAzBpB,iEA/DF,8DAA+C,eAE7C,iBADC,gBAAKiI,Q,6BAmCN,iBADC,gBAAK,U,2BAGL,MAtCkB,GAAiB,iBALrC,gBAAU,CACTzG,SAAU,kBACL,eAAW,CAAC,oBAGE,cCtHyY,M,0FCQ1Z,GAAY,gBACd,GACA,GACA,IACA,EACA,KACA,WACA,MAIa,MAAiB,QAqBhC,KAAkB,GAAW,CAACpD,QAAA,KAAKC,SAAA,KAAMC,aAAA,QAAaC,UAAA,QAAUC,WAAA,QAAWC,WAAA,KAAQoK,YAAA,KAAS7G,SAAA,KAAMC,SAAA,KAAM6G,mBAAA,KAAgBpK,WAAA,KAAQqK,YAAA,KAASC,mBAAA,KAAgBC,eAAA,QAAeC,cAAA,QAAcC,gBAAA,KAAaxK,cAAA,OCxCnM,IAAI,GAAS,WAAa,IAAIvE,EAAI5K,KAAS6K,EAAGD,EAAIE,eAAmBC,EAAGH,EAAII,MAAMD,IAAIF,EAAG,OAAOE,EAAG,WAAW,CAACM,MAAM,CAAC,OAAQ,EAAK,MAAQT,EAAIgP,YAAY,WAAahP,EAAI4E,aAAarD,GAAG,CAAC,MAAQvB,EAAIpO,cAAc,CAACuO,EAAG,SAAS,CAACA,EAAG,eAAe,CAACsB,YAAY,YAAY,CAACtB,EAAG,SAAS,CAACsB,YAAY,QAAQ,CAACzB,EAAIyC,GAAG,wBAAwBtC,EAAG,OAAO,CAACgC,SAAS,CAAC,YAAcnC,EAAIoC,GAAGpC,EAAI/O,GAAG,aAAa,GAAGkP,EAAG,cAAc,CAACA,EAAG,SAAS,CAACc,MAAM,CAAChhB,MAAO+f,EAAW,QAAE9N,SAAS,SAAUgP,GAAMlB,EAAIiP,QAAQ/N,GAAKV,WAAW,YAAY,CAACL,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,aAAa,CAACT,EAAIyC,GAAG,eAAetC,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,cAAc,CAACT,EAAIyC,GAAG,gBAAgBtC,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,WAAW,CAACT,EAAIyC,GAAG,aAAatC,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,aAAa,CAACT,EAAIyC,GAAG,gBAAgB,GAAGtC,EAAG,eAAe,CAACM,MAAM,CAAC,MAAQT,EAAIkP,IAAI,UAAY,KAAK,CAAC/O,EAAG,aAAa,CAACM,MAAM,CAAC,MAAQ,YAAYT,EAAI0C,GAAI1C,EAAY,UAAE,SAASxJ,GAAS,OAAO2J,EAAG,QAAQ,CAAC5f,IAAIiW,EAAQxB,KAAKyL,MAAM,CAAC,MAAQjK,EAAQhX,KAAK,OAAiC,IAAxBwgB,EAAIlL,SAASlX,SAAe,CAACuiB,EAAG,eAAe,CAACM,MAAM,CAAC,QAAUjK,EAAQ,YAAwB,YAAZwJ,EAAIkP,QAAsB,MAAK,GAAG/O,EAAG,aAAa,CAACM,MAAM,CAAC,MAAQ,aAAaT,EAAI0C,GAAI1C,EAAY,UAAE,SAASxJ,GAAS,OAAO2J,EAAG,QAAQ,CAAC5f,IAAIiW,EAAQxB,KAAKyL,MAAM,CAAC,MAAQjK,EAAQhX,KAAK,OAAiC,IAAxBwgB,EAAIlL,SAASlX,SAAe,CAACuiB,EAAG,WAAW,CAACM,MAAM,CAAC,KAAOjK,EAAQxB,KAAK,YAAwB,aAAZgL,EAAIkP,QAAuB,MAAK,GAAG/O,EAAG,aAAa,CAACM,MAAM,CAAC,MAAQ,UAAUT,EAAI0C,GAAI1C,EAAY,UAAE,SAASxJ,GAAS,OAAO2J,EAAG,QAAQ,CAAC5f,IAAIiW,EAAQxB,KAAKyL,MAAM,CAAC,MAAQjK,EAAQhX,KAAK,OAAiC,IAAxBwgB,EAAIlL,SAASlX,SAAe,CAACuiB,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAOjK,EAAQxB,KAAK,YAAwB,UAAZgL,EAAIkP,QAAoB,MAAK,GAAG/O,EAAG,aAAa,CAACM,MAAM,CAAC,MAAQ,YAAYT,EAAI0C,GAAI1C,EAAY,UAAE,SAASxJ,GAAS,OAAO2J,EAAG,QAAQ,CAAC5f,IAAIiW,EAAQxB,KAAKyL,MAAM,CAAC,MAAQjK,EAAQhX,KAAK,OAAiC,IAAxBwgB,EAAIlL,SAASlX,SAAe,CAACuiB,EAAG,kBAAkB,CAACM,MAAM,CAAC,KAAOjK,EAAQxB,KAAK,YAAwB,YAAZgL,EAAIkP,QAAsB,MAAK,IAAI,IAAI,GAAG/O,EAAG,iBAAiB,CAACA,EAAG,YAAYA,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,IAAI0B,SAAS,CAAC,YAAcnC,EAAIoC,GAAGpC,EAAI/O,GAAG,WAAWsQ,GAAG,CAAC,MAAQvB,EAAIpO,gBAAgB,IAAI,IAAI,IAChjE,GAAkB,GCDlB,GAAS,WAAa,IAAIoO,EAAI5K,KAAS6K,EAAGD,EAAIE,eAAmBC,EAAGH,EAAII,MAAMD,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACsB,YAAY,gBAAgB,CAACtB,EAAG,MAAM,CAACsB,YAAY,YAAY,CAACtB,EAAG,OAAO,CAACH,EAAIyC,GAAG,eAAetC,EAAG,SAAS,CAACE,IAAI,SAASoB,YAAY,mBAAmBtB,EAAG,OAAO,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAGpC,EAAIyM,GAAG,WAAPzM,CAAmBA,EAAIxJ,QAAQ/S,gBAAgB0c,EAAG,WAAW,CAACA,EAAG,SAAS,CAACH,EAAIyC,GAAG,cAAezC,EAAc,WAAEG,EAAG,cAAc,CAACsB,YAAY,QAAQ,CAACtB,EAAG,QAAQ,CAACM,MAAM,CAAC,aAAa,KAAK,CAACT,EAAI0C,GAAI1C,EAAY,UAAE,SAAS8E,GAAM,MAAO,CAAC3E,EAAG,QAAQ,CAAC5f,IAAIukB,EAAKlb,MAAQ,KAAK6X,YAAY,QAAQhB,MAAM,CAAC,KAAO,IAAI,GAAK,IAAI,GAAK,MAAM,CAACT,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAG0C,EAAKlb,OAAO,QAAQuW,EAAG,QAAQ,CAAC5f,IAAIukB,EAAKlb,MAAQ,KAAK6X,YAAY,QAAQhB,MAAM,CAAC,KAAO,IAAI,GAAK,IAAI,GAAK,MAAM,CAACT,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAG0C,EAAK7kB,MAAM+f,EAAImP,aAAa,YAAW,IAAI,GAAGnP,EAAIqB,MAAM,GAAGlB,EAAG,WAAW,CAACA,EAAG,SAAS,CAACH,EAAIyC,GAAG,iBAAkBzC,EAAc,WAAEG,EAAG,cAAc,CAACsB,YAAY,QAAQ,CAACtB,EAAG,QAAQ,CAACM,MAAM,CAAC,aAAa,KAAK,CAACT,EAAI0C,GAAI1C,EAAe,aAAE,SAAS8E,GAAM,MAAO,CAAC3E,EAAG,QAAQ,CAAC5f,IAAIukB,EAAKlb,MAAQ,KAAK6X,YAAY,QAAQhB,MAAM,CAAC,KAAO,IAAI,GAAK,IAAI,GAAK,MAAM,CAACT,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAG0C,EAAKlb,OAAO,QAAQuW,EAAG,QAAQ,CAAC5f,IAAIukB,EAAKlb,MAAQ,KAAK6X,YAAY,QAAQhB,MAAM,CAAC,KAAO,IAAI,GAAK,IAAI,GAAK,MAAM,CAACT,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAG0C,EAAK7kB,MAAM+f,EAAImP,aAAa,YAAW,IAAI,GAAGnP,EAAIqB,MAAM,MAC7xC,GAAkB,GCGD,GAArB,2G,0BAIE,EAAA+N,SAAW,IAJb,sDAME,SAAcpxB,EAAwBoxB,GACpCha,KAAKpX,KAAOA,EAERoxB,IACFha,KAAKga,SAAWA,GAGlBha,KAAKia,YAbT,8EAgBE,uGACEja,KAAKka,aAEDxvB,EAAIsV,KAAKpX,SACT8B,aAAakS,SAJnB,gCAKclS,EALd,OAKIA,EALJ,kBAQMsV,KAAKma,UAAWzvB,EARtB,iDAYEsV,KAAKoa,OAASxb,WAAWoB,KAAKia,QAASja,KAAKga,UAZ9C,gDAhBF,iFA+BE,WACMha,KAAKoa,SACPC,aAAara,KAAKoa,QAClBpa,KAAKoa,OAAS,KAlCpB,2BAsCE,WACEpa,KAAKma,SAAU,EACfna,KAAKka,iBAxCT,GAAqC,cAAhB,GAAO,iBAD3B,SACoB,cCAA,GAArB,6KAIY,WACR,KAAM,kBALV,6EAQY,8GACFla,KAAKsa,YADH,iCAGAta,KAAKua,UAHL,gDARZ,gFAcE,WACEva,KAAKwa,cAAcxa,KAAKya,OAAQ,OAfpC,qBAkBE,WACMza,KAAKua,UACPva,KAAK0a,cApBX,gFAyBE,WAAgBpM,GAAhB,iFACMA,EACFtO,KAAK0a,YAEL1a,KAAKka,aAJT,gDAzBF,+DAA6C,IAE3C,iBADC,gBAAKlE,U,gCAwBN,iBADC,gBAAM,a,yBAON,MA/BkB,GAAe,iBADnC,SACoB,QCyFhB2E,GDzFgB,OCyFrB,SAAKA,GACH,wBACA,oCACA,mCAHF,CAAKA,QAAU,KASf,IAAqB,GAArB,2G,0BAIE,EAAAZ,WAAuC,KAEvC,EAAArI,SAAmB,CACjB,CACEld,MAAO,cACP3J,MAAO,SAAAia,GAAI,OAAI2D,GAAe3D,EAAK8V,eAAiB9V,EAAK+V,aAAL,mBAAgCpS,GAAe3D,EAAK+V,cAApD,KAAuE,MAE7H,CAAErmB,MAAO,MAAO3J,MAAO,SAAAia,GAAI,OAAI2D,GAAe3D,EAAKnW,IAAK,CAAEwa,SAAU,QACpE,CAAE3U,MAAO,cAAe3J,MAAO,SAAAia,GAAI,gBAAOA,EAAKgW,eAAZ,aAA+BhW,EAAKiW,qBAApC,WACnC,CAAEvmB,MAAO,aAAc3J,MAAO,SAAAia,GAAI,gBAAOoD,GAAWpD,EAAKkW,0BAAvB,YAAoD9S,GAAWpD,EAAKmW,qBACtG,CAAEzmB,MAAO,WAAY3J,MAAO,SAAAia,GAAI,gBAAOoD,GAAWpD,EAAKoW,wBAAvB,YAAkDhT,GAAWpD,EAAKqW,mBAClG,CAAE3mB,MAAO,QAAS3J,MAAO,SAAAia,GAAI,gBAAOA,EAAKvW,MAAZ,aAAsBuW,EAAKsW,YAA3B,aAC7B,CAAE5mB,MAAO,WAAY3J,MAAO,SAAAia,GAAI,gBAAOoD,GAAWpD,EAAKrW,UAAvB,QAChC,CAAE+F,MAAO,WAAY3J,MAAO,SAAAia,GAAI,gBAAOoD,GAAWpD,EAAKpW,UAAvB,QAChC,CAAE8F,MAAO,QAAS3J,MAAO,SAAAia,GAAI,gBAAOA,EAAKtW,MAAZ,aAAsBsW,EAAKuW,YAA3B,aAC7B,CAAE7mB,MAAO,SAAU3J,MAAO,SAAAia,GAAI,OAAIoD,GAAWpD,EAAKwW,gBAClD,CAAE9mB,MAAO,cAAe3J,MAAO,SAAAia,GAAI,OAAIgD,GAAYhD,EAAKyW,YAAa,KACrE,CAAE/mB,MAAO,aAAc3J,MAAO,SAAAia,GAAI,OAAI2D,GAAe3D,EAAK9W,cAC1D,CAAEwG,MAAO,YAAa3J,MAAO,SAAAia,GAAI,OAAI0E,GAAgB1E,EAAK0W,cAG5D,EAAAC,YAAsB,CACpB,CAAEjnB,MAAO,aAAc3J,MAAO,SAAAia,GAAI,OAAIoD,GAAWpD,EAAK4W,cACtD,CAAElnB,MAAO,SAAU3J,MAAO,SAAAia,GAAI,gBAAOA,EAAK6W,WAAZ,cAA4BzT,GAAWpD,EAAK8W,YAA5C,kBAAiE9W,EAAK+W,YAAtE,OAC9B,CAAErnB,MAAO,aAAc3J,MAAO,SAAAia,GAAI,OAAIA,EAAKgX,aAC3C,CAAEtnB,MAAO,aAAc3J,MAAO,SAAAia,GAAI,OAAI0E,GAAgB1E,EAAKiX,iBAC3D,CAAEvnB,MAAO,WAAY3J,MAAO,SAAAia,GAAI,OAAI0E,GAAgB1E,EAAKkX,iBACzD,CAAExnB,MAAO,eAAgB3J,MAAO,SAAAia,GAAI,OAAI0E,GAAgB1E,EAAKmX,mBAC7D,CAAEznB,MAAO,eAAgB3J,MAAO,kBAAM,EAAKuW,QAAQxB,OACnD,CAAEpL,MAAO,YAAa3J,MAAO,SAAAia,GAAI,OAAIA,EAAKvT,YAC1C,CAAEiD,MAAO,UAAW3J,MAAO,SAAAia,GAAI,OAAIA,EAAKoX,WAE1C,EAAAC,OAAuB,GACvB,EAAAC,OAA0C,KArC5C,yGAuCE,8GAC0B,GAAIC,qBAAqBrc,KAAKoB,QAAQxB,MADhE,cACEI,KAAK+Z,WADP,gBAEsB,GAAIuC,sBAAsBtc,KAAKoB,QAAQxB,MAF7D,OAEEI,KAAKmc,OAFP,uDAvCF,iFA4CE,SAAWhS,GACT,IAAQoS,EAA8BpS,EAA9BoS,YAAaC,EAAiBrS,EAAjBqS,aAMrB,OAJArS,EAAG8D,MAAQsO,EACXpS,EAAGsS,OAASD,EAGLrS,EAAGuS,WAAW,QAnDzB,uBAsDE,WACE,OAAO1c,KAAK2c,YAvDhB,6BA2DE,SAAgBrO,GACd,IAAIN,EACAhO,KAAKoc,OACPpO,EAAMhO,KAAKoc,QAEXpO,EAAMhO,KAAK4c,WAAW5c,KAAK6Q,MAAMuL,QACjCpc,KAAKoc,OAASpO,GAGhB,MAAsCA,EAAIoO,OAAlCI,EAAR,EAAQA,aAAcD,EAAtB,EAAsBA,YACtBvO,EAAI6O,UAAU,EAAG,EAAGN,EAAaC,GAOjC,IALA,IAAMM,EAAUP,EAAc,EACxBQ,EAASR,EAAcO,EACvBE,EAAY3U,KAAKC,MAAMgG,EAAE9lB,OAASs0B,GAElCG,EAAS,mBAAM3O,EAAG0O,GACf10B,EAAI,EAAGA,EAAIw0B,EAASx0B,IAAK,CAChC,IAAMuf,EAAS,qBAAQoV,EAAO30B,IACxBqP,EAAckQ,EAAO8S,GAAWld,aAChCyf,EAAQrV,EAAO8S,GAAWwC,QAAU,EACpCC,EAAavV,EAAO8S,GAAW0C,YACjCC,OAAK,EACT,GAAI3lB,EACF2lB,EAAQ,iBACH,MAAIF,GAAcF,GAGvB,SAFAI,EAAQ,YAKVtP,EAAIuP,UAAYD,EAChBtP,EAAIwP,SAASl1B,EAAIy0B,EAAQ,EAAGA,EAAQP,QA3F1C,GAAyC,IAEvC,iBADC,mB,+BA0DD,iBADC,gBAAM,W,+BAmCN,MA7FkB,GAAW,iBAH/B,gBAAU,KAGU,cCtGmY,MCQpZ,I,UAAY,gBACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,MAAiB,QAOhC,KAAkB,GAAW,CAACpK,QAAA,KAAKE,cAAA,KAAWI,QAAA,OC1B9C,ICwCK+K,GDxCD,GAAS,WAAa,IAAI7S,EAAI5K,KAAS6K,EAAGD,EAAIE,eAAmBC,EAAGH,EAAII,MAAMD,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACsB,YAAY,mBAAmB,CAACtB,EAAG,aAAa,CAACM,MAAM,CAAC,gBAAgB,GAAG,MAAQT,EAAI8S,SAAS,MAAQ9S,EAAImI,SAAS,WAAa,IAAI5G,GAAG,CAAC,MAAQvB,EAAI+S,eAAelS,YAAYb,EAAIc,GAAG,CAAC,CAACvgB,IAAI,UAAUwgB,GAAG,SAASwL,GAAK,MAAO,CAAEvM,EAAIgT,WAAWpf,SAAS2Y,EAAIzH,KAAK1jB,IAAK+e,EAAG,sBAAsB,CAACM,MAAM,CAAC,KAAO,KAAK,MAAQ,IAAI,cAAgB,MAAMN,EAAG,SAAS,CAACgC,SAAS,CAAC,YAAcnC,EAAIoC,GAAGpC,EAAIiT,WAAW1G,UAAY,CAAChsB,IAAI,SAASwgB,GAAG,SAASwL,GAAK,MAAO,CAACpM,EAAG,OAAO,CAACH,EAAIyC,GAAG,KAAKzC,EAAIoC,GAAGpC,EAAIyM,GAAG,OAAPzM,CAAeuM,EAAIzH,KAAKthB,OAAO,QAAQ2c,EAAG,OAAO,CAACsB,YAAY,YAAY,CAACzB,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAIyM,GAAG,WAAPzM,CAAmBuM,EAAIzH,KAAKrhB,WAAW,eAAe,IAC5tB,GAAkB,G,YCuCtB,SAAKovB,GACH,oCACA,0BACA,sBACA,6BAJF,CAAKA,QAAa,KAiClB,IAAMK,GAAW,SAEXC,GAAgB,YAGD,GAArB,2G,0BAIE,EAAAtuB,MAAgB,GAEhB,EAAAmuB,WAAuB,GANzB,+CAQE,WACE,OAAO5d,KAAKge,UAAUhe,KAAKvQ,MAAO,KATtC,oBAYE,WACE,OAAOuQ,KAAKvQ,MAAMmK,QAAO,SAAC8V,GACxB,OAAOA,EAAKjO,WAAagc,GAAcQ,eACtCpyB,KAAI,SAAA6jB,GAAI,OAAIA,EAAK1jB,QAfxB,+EAkBE,oHACsB,GAAIkyB,gBAAgBle,KAAKJ,MAD/C,OACQnQ,EADR,OAEEA,EAAM+W,SAAQ,SAAC8H,EAAGhmB,GAAJ,OAAUgmB,EAAEtiB,GAAK1D,KAC/BmH,EAAM0uB,MAAK,SAACC,EAAGC,GAAJ,OAAUD,EAAEh0B,KAAKk0B,cAAcD,EAAEj0B,SAE5C4V,KAAKvQ,MAAQA,EACbuQ,KAAKue,YAAc,EAEnBve,KAAK4d,WAAa,GARpB,gDAlBF,iFA6BE,SAAWzG,GACT,OAAIA,EAAIzH,KAAKA,KACJ,WAGFyH,EAAIqH,KAAO,kBAAoB,eAlC1C,oFAqCE,WAAoBC,GAApB,8FACQC,EAAW1e,KAAK+S,SAChB4L,EAAO,iBAAID,EAAUD,GAET,GAAfE,EAAKn2B,OAJV,wDAME,EAAAwX,KAAK4d,YAAW90B,KAAhB,uBAAwB61B,IAN1B,SAQQ,GAAIC,uBAAuB5e,KAAKJ,KAAM+e,EAAMF,EAAMj2B,OAASk2B,EAASl2B,OACxEi1B,GAAcoB,OAASpB,GAAcQ,aATzC,gDArCF,qFAiDE,SAAcvO,EAAY5iB,GACxB,IAAQ1C,EAASslB,EAATtlB,KACFge,EAAQhe,EAAK2qB,QAAQ,IAAKjoB,GAChC,OAAe,IAAXsb,EACK0V,GAGF1zB,EAAKwiB,UAAU9f,EAAOsb,KAxDjC,uBA2DE,SAAU3Y,EAAoB3C,GAAa,WACzC,IAAK2C,EAAMjH,OACT,MAAO,GAMT,IAHA,IAAM0Y,EAAU,qBAAQzR,GAAO,SAAAigB,GAAI,OAAI,EAAKoP,cAAcpP,EAAM5iB,MAE1DzD,EAAS,GACf,MAA+BZ,OAAOyY,QAAQA,GAA9C,eAAwD,CAAnD,8BAAO6d,EAAP,KAAeC,EAAf,KAEH,GAAGD,IAAWhB,GAad,GAAIgB,IAAWjB,GAAf,CAfsD,uBA4BnCkB,GA5BmC,IA4BtD,2BAA2B,KAAhB,EAAgB,QACzB31B,EAAOP,KAAK,CACVkD,GAAI,EAAKA,GACT5B,KAAM,EAAKA,KAAKwiB,UAAU9f,GAC1B4iB,KAAA,EACAthB,KAAM,EAAKA,KACXC,SAAU,EAAKA,YAlCmC,mCAetD,CACE,IAAM4wB,EAAUjf,KAAKge,UAAUgB,EAAQlyB,EAAQiyB,EAAOv2B,OAAS,GAE/Da,EAAOP,KAAK,CACVkD,GAAIgU,KAAKvQ,MAAMjH,OAASwX,KAAKue,cAC7Bn0B,KAAM20B,EACN3L,SAAU6L,EACV7wB,KAAM,mBAAM6wB,EAAS,QACrB5wB,SAAU,mBAAM4wB,EAAS,YAAcA,EAAQz2B,aArBnD,CAA6B,uBACRw2B,GADQ,IAC3B,2BAA2B,KAAhBtP,EAAgB,QACzBrmB,EAAOP,KAAK,CACVkD,GAAI0jB,EAAK1jB,GACT5B,KAAMslB,EAAKtlB,KAAKwiB,UAAU9f,EAAQiyB,EAAOv2B,OAAS,GAClDknB,OACAthB,KAAMshB,EAAKthB,KACXC,SAAUqhB,EAAKrhB,YAPQ,gCAqC/B,OAAOhF,IA1GX,uBA6GE,WACE,OAAO2W,KAAKkf,eA9GhB,GAA4C,IAE1C,iBADC,gBAAKhgB,S,4BADa,GAAc,iBADlC,SACoB,cC9EsY,M,sCCQvZ,GAAY,gBACd,GACA,GACA,IACA,EACA,KACA,WACA,MAIa,MAAiB,QAOhC,KAAkB,GAAW,CAACuT,SAAA,KAAM0M,qBAAA,KAAkBC,aAAA,OC1BtD,IAAI,GAAS,WAAa,IAAIxU,EAAI5K,KAAS6K,EAAGD,EAAIE,eAAmBC,EAAGH,EAAII,MAAMD,IAAIF,EAAG,OAAOE,EAAG,eAAe,CAACM,MAAM,CAAC,QAAUT,EAAIvK,QAAQ,MAAQuK,EAAIyU,SAAS,kBAAkB,EAAE,uBAAsB,GAAM5T,YAAYb,EAAIc,GAAG,CAAC,CAACvgB,IAAI,OAAOwgB,GAAG,SAASwL,GAAK,MAAO,CAACpM,EAAG,KAAK,CAACA,EAAG,KAAK,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAGmK,EAAIzH,KAAK4P,SAASvU,EAAG,KAAK,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAGmK,EAAIzH,KAAKtQ,QAAQ2L,EAAG,KAAK,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAGpC,EAAIyM,GAAG,sBAAPzM,CAA8BuM,EAAIzH,KAAKphB,YAAYyc,EAAG,KAAK,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAGpC,EAAIyM,GAAG,mBAAPzM,CAA2BuM,EAAIzH,KAAK6P,eAAexU,EAAG,KAAK,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAGpC,EAAIyM,GAAG,mBAAPzM,CAA2BuM,EAAIzH,KAAK8H,eAAezM,EAAG,KAAK,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAGpC,EAAIyM,GAAG,mBAAPzM,CAA2BuM,EAAIzH,KAAK8P,iBAAiBzU,EAAG,KAAK,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAGpC,EAAIyM,GAAG,mBAAPzM,CAA2BuM,EAAIzH,KAAK+P,oBAAoB1U,EAAG,KAAK,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAGmK,EAAIzH,KAAK7Z,kBAC7vB,GAAkB,GCiDD,GAArB,2G,0BAIW,EAAAwK,QAAU,CACjB,CAAEpK,KAAM,IAAKpL,MAAO,QACpB,CAAEoL,KAAM,MAAOpL,MAAO,OACtB,CAAEoL,KAAM,SAAUpL,MAAO,UACzB,CAAEoL,KAAM,QAASpL,MAAO,aACxB,CAAEoL,KAAM,QAASpL,MAAO,aACxB,CAAEoL,KAAM,UAAWpL,MAAO,eAC1B,CAAEoL,KAAM,aAAcpL,MAAO,kBAC7B,CAAEoL,KAAM,UAAWpL,MAAO,QAG5B,EAAAw0B,SAAW,GAfb,4GAiBE,8GACwB,GAAIK,kBAAkB1f,KAAKJ,MADnD,OACEI,KAAKqf,SADP,uDAjBF,gFAqBE,WACE,OAAOrf,KAAK2f,iBAtBhB,GAAsC,IAEpC,iBADC,gBAAKzgB,S,4BADa,GAAQ,iBAtB5B,gBAAU,CACT0gB,QAAS,CACPC,oBADO,SACavxB,GAClB,IAAMzC,EAAM,CACV,WACA,gBACA,UACA,WACA,eAGF,OAAOA,EAAIyC,IAEbwxB,iBAZO,SAYUC,GACf,OAAa,IAATA,EACK,MAGFA,EAAI1gB,gBAII,cClDgY,M,aCOjZ,GAAY,gBACd,GACA,GACA,IACA,EACA,KACA,KACA,MAIa,MAAiB,QAKhC,KAAkB,GAAW,CAAC2gB,cAAA,OCvB9B,IAAI,GAAS,WAAa,IAAIpV,EAAI5K,KAAS6K,EAAGD,EAAIE,eAAmBC,EAAGH,EAAII,MAAMD,IAAIF,EAAG,OAAOE,EAAG,eAAe,CAACM,MAAM,CAAC,QAAUT,EAAIvK,QAAQ,MAAQuK,EAAIpc,MAAM,kBAAkB,EAAE,uBAAsB,GAAMid,YAAYb,EAAIc,GAAG,CAAC,CAACvgB,IAAI,OAAOwgB,GAAG,SAASwL,GAAK,MAAO,CAACpM,EAAG,KAAK,CAACA,EAAG,KAAK,CAACsB,YAAY,MAAM,CAAE8K,EAAIzH,KAAiB,aAAE,CAAE9E,EAAa,UAAEG,EAAG,MAAM,CAACsB,YAAY,eAAehB,MAAM,CAAC,MAAQ8L,EAAIzH,KAAKuQ,QAAQ,IAAMrV,EAAIsV,WAAW/I,EAAIzH,KAAKyQ,cAAclhB,KAAK,IAAM2L,EAAIsV,WAAW/I,EAAIzH,KAAKyQ,cAAc/gB,OAAO,CAACwL,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAIsV,WAAW/I,EAAIzH,KAAKyQ,cAAclhB,MAAM,OAAO2L,EAAIqB,KAAKrB,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGmK,EAAIzH,KAAK0Q,IAAI,KAAKrV,EAAG,OAAO,CAACsB,YAAY,cAAc,CAACzB,EAAIyC,GAAG,KAAKzC,EAAIoC,GAAGmK,EAAIzH,KAAK2Q,MAAM,QAAQ,GAAGtV,EAAG,KAAK,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAGmK,EAAIzH,KAAKjd,eAAesY,EAAG,KAAK,CAACM,MAAM,CAAC,MAAQ8L,EAAIzH,KAAK4Q,aAAa,CAAC1V,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGmK,EAAIzH,KAAK6Q,OAAO,OAAOxV,EAAG,KAAK,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAGmK,EAAIzH,KAAK8Q,WAAWzV,EAAG,KAAK,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAGpC,EAAIyM,GAAG,WAAPzM,CAAmBuM,EAAIzH,KAAKrhB,cAAc0c,EAAG,KAAK,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAGpC,EAAIyM,GAAG,eAAPzM,CAAuBuM,EAAIzH,KAAKjhB,cAAcsc,EAAG,KAAK,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAGpC,EAAIyM,GAAG,cAAPzM,CAAsBuM,EAAIzH,KAAK0N,gBAAgBrS,EAAG,KAAK,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAGpC,EAAIyM,GAAG,eAAPzM,CAAuBuM,EAAIzH,KAAKhhB,cAAcqc,EAAG,KAAK,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAGpC,EAAIyM,GAAG,cAAPzM,CAAsBuM,EAAIzH,KAAK+Q,cAAc1V,EAAG,KAAK,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAGpC,EAAIyM,GAAG,WAAPzM,CAAmBuM,EAAIzH,KAAKgR,eAAe3V,EAAG,KAAK,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAGmK,EAAIzH,KAAKjgB,oBAC7yC,GAAkB,GCsED,GAArB,2G,0BAIE,EAAA4Q,QAAU,CACR,CAAEpK,KAAM,KAAMpL,MAAO,MACrB,CAAEoL,KAAM,aAAcpL,MAAO,cAC7B,CAAEoL,KAAM,QAASpL,MAAO,SACxB,CAAEoL,KAAM,SAAUpL,MAAO,UACzB,CAAEoL,KAAM,WAAYpL,MAAO,YAC3B,CAAEoL,KAAM,WAAYpL,MAAO,YAC3B,CAAEoL,KAAM,aAAcpL,MAAO,cAC7B,CAAEoL,KAAM,WAAYpL,MAAO,YAC3B,CAAEoL,KAAM,WAAYpL,MAAO,YAC3B,CAAEoL,KAAM,YAAapL,MAAO,aAC5B,CAAEoL,KAAM,QAASpL,MAAO,UAG1B,EAAA81B,SAAgB,KAChB,EAAA5f,IAAqB,KACrB,EAAAzB,UAAqBA,EApBvB,4CAsBE,WACE,OAAO,iBAAIU,KAAK2gB,UAAU,SAAC91B,EAAOM,GAAR,OAAgB,mBAAM,GAAIN,EAAO,CAAEM,aAvBjE,wBA0BE,SAAWiB,GACT,OAAIA,EACK,EAAWA,GAGb,KA/BX,+EAkCE,4HACqB,GAAIw0B,gBAAgB5gB,KAAKJ,KAAMI,KAAKe,UAAOiD,GADhE,OAIE,GAHMb,EADR,OAEEnD,KAAKe,IAAMoC,EAAKpC,IAEZoC,EAAKoC,YACPvF,KAAK2gB,SAAWxd,EAAK3U,UAChB,CAEL,GADMgM,EAAW,uBAAUwF,KAAK2gB,UAC5Bxd,EAAK0d,cAAe,kBACJ1d,EAAK0d,eADD,IACtB,2BAAW11B,EAA2B,eAC7BqP,EAAIrP,GAFS,+BAKxB6U,KAAK2gB,SAAW,mBAAMnmB,EAAK2I,EAAK3U,OAbpC,gDAlCF,gFAmDE,WACE,OAAOwR,KAAK8gB,aApDhB,uBAuDE,WACE9gB,KAAKwa,cAAcxa,KAAKya,OAAQ,SAxDpC,GAAmC,IAEjC,iBADC,gBAAKvb,S,4BADa,GAAK,iBAlBzB,gBAAU,CACT0gB,QAAS,CACPmB,aADO,SACMpvB,GACX,OAAc,IAAVA,EACK,KAGT,UAAUuW,GAAWvW,GAArB,OAEFqvB,YARO,SAQK5yB,GACV,OAAa,IAATA,EACK,KAGF8Z,GAAW9Z,QAIH,cCvE6X,MCQ9Y,I,UAAY,gBACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,MAAiB,QAKhC,KAAkB,GAAW,CAAC4xB,cAAA,OCxB9B,IAAI,GAAS,WAAa,IAAIpV,EAAI5K,KAAS6K,EAAGD,EAAIE,eAAmBC,EAAGH,EAAII,MAAMD,IAAIF,EAAG,OAASD,EAAIqW,OAA+JlW,EAAG,MAAM,CAACsB,YAAY,SAAS,CAACzB,EAAIsW,GAAG,YAAY,GAA1MnW,EAAG,WAAW,CAACsB,YAAY,SAAS,CAACtB,EAAG,SAAS,CAACgC,SAAS,CAAC,YAAcnC,EAAIoC,GAAGpC,EAAI5W,UAAU+W,EAAG,MAAM,CAACsB,YAAY,SAAS,CAACzB,EAAIsW,GAAG,YAAY,MAC5P,GAAkB,GCoBP,gBAAItlB,OAAO,CACxBulB,MAAO,CACLF,OAAQjL,QACRhiB,MAAO,CACLuK,KAAMW,OACNkiB,UAAU,MC1BkY,MCQ9Y,I,UAAY,gBACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,M,QCoGM,GAArB,2KASE,WACEphB,KAAKN,SAAWM,KAAKnV,QAVzB,uBAaE,WACE,OAAOmV,KAAKsL,SAASC,WAAWoE,SAdpC,uBAgBE,WACE,OAAO3P,KAAKwP,YAAc,OAAS,QAjBvC,yBAqBE,WACE,OAAO,MAtBX,GAAwC,cAEtC,iBADC,gBAAKiJ,Q,6BAIN,iBADC,gBAAS,MAAOvZ,S,+BAiBjB,iBADC,gBAAK,U,2BAGL,MAvBkB,GAAU,iBAT9B,gBAAU,CACT0V,WAAY,CACVyM,YAAA,GACAC,eAAA,GACAC,SAAA,GACAC,MAAA,GACAC,aAGiB,cCvHkY,M,gECQnZ,GAAY,gBACd,GACA,GACA,IACA,EACA,KACA,WACA,MAIa,MAAiB,QC0OhC,SAASC,GAAaroB,GACpB,IAAIuZ,EACJ,OAAQvZ,GACN,IAAK,SACL,IAAK,aACL,IAAK,cACL,IAAK,WACHuZ,EAAO,CACLA,KAAM,WACN0K,MAAO,QAET,MACF,IAAK,YACL,IAAK,WACH1K,EAAO,CACLA,KAAM,SACN0K,MAAO,QAET,MACF,IAAK,YACH1K,EAAO,CACLA,KAAM,WACN0K,MAAO,MAET,MACF,IAAK,YACH1K,EAAO,CACLA,KAAM,SACN0K,MAAO,MAET,MACF,IAAK,WACH1K,EAAO,CACLA,KAAM,QACN0K,MAAO,WAET,MACF,IAAK,WACH1K,EAAO,CACLA,KAAM,QACN0K,MAAO,MAET,MACF,IAAK,WACL,IAAK,WACH1K,EAAO,CACLA,KAAM,aACN0K,MAAO,QAET,MACF,IAAK,aACL,IAAK,aACL,IAAK,oBACL,IAAK,qBACL,IAAK,SACH1K,EAAO,CACLA,KAAM,iBACN0K,MAAO,QAET,MACF,IAAK,QACL,IAAK,UACL,IAAK,eACH1K,EAAO,CACLA,KAAM,QACN0K,MAAO,SAET,MACF,QACE,MAAMnxB,MAAM,iBAGhB,OAAOymB,EDlST,KAAkB,GAAW,CAAChE,QAAA,KAAKC,SAAA,KAAMC,aAAA,QAAaC,UAAA,QAAUC,WAAA,QAAWC,WAAA,KAAQwD,SAAA,KAAMvD,WAAA,KAAQyS,QAAA,KAAKC,YAAA,KAASC,SAAA,KAAMC,cAAA,OC+VrH,IAAqB,GAArB,2G,0BACW,EAAAzhB,QAAU,CACjB,CAAEpK,KAAM,EAAG,QAASpL,MAAO,QAC3B,CAAEoL,KAAM,EAAG,QAASpL,MAAO,QAC3B,CAAEoL,KAAM,EAAG,YAAapL,MAAO,YAC/B,CAAEoL,KAAM,EAAG,UAAWpL,MAAO,SAC7B,CAAEoL,KAAM,EAAG,SAAUpL,MAAO,gBAC5B,CAAEoL,KAAM,EAAG,SAAUpL,MAAO,kBAC5B,CAAEoL,KAAM,EAAG,YAAapL,MAAO,WAC/B,CAAEoL,KAAM,EAAG,YAAapL,MAAO,WAC/B,CAAEoL,KAAM,EAAG,OAAQpL,MAAO,OAC1B,CAAEoL,KAAM,EAAG,SAAUpL,MAAO,SAC5B,CAAEoL,KAAM,EAAG,YAAapL,MAAO,aAGxB,EAAAqsB,YAAc,CACrB,yBAA0B,CAAC,GAAI,GAAI,IAAK,IAG1C,EAAAV,aAA0B,GAC1B,EAAAsB,SAAsB,GACtB,EAAAC,cAA2B,GAC3B,EAAAC,cAA+B,KAC/B,EAAAE,WAAwB,GACxB,EAAAD,cAA2B,GAC3B,EAAAE,QAAU,KACV,EAAAze,YAAmB,KA1BrB,8CA0CE,WACE,OAAQsG,KAAKgG,cA3CjB,uBA6CE,WACE,QAAShG,KAAKwW,aAAahuB,SA9C/B,0BAgDE,WACE,OAAOwX,KAAKwW,aAAa3qB,KAAI,SAAAnB,GAAC,OAAIA,EAAEkV,UAjDxC,oBAoDE,WACE,IAAKI,KAAKgG,YACR,MAAO,GAGT,IAAIS,EAAOzG,KAAKP,YAahB,GAZyB,OAArBO,KAAKpG,OAAOC,OACd4M,EAAO,0BAAaA,EAAMzG,KAAK0G,mBAAmB1G,KAAKpG,OAAOC,QAEnC,OAAzBmG,KAAKpG,OAAOzK,WACdsX,EAAO,0BAAaA,EAAMzG,KAAKsG,uBAAuBtG,KAAKpG,OAAOzK,YAE5C,OAApB6Q,KAAKpG,OAAOvK,MACdoX,EAAO,0BAAaA,EAAMzG,KAAKuG,kBAAkBvG,KAAKpG,OAAOvK,OAErC,OAAtB2Q,KAAKpG,OAAOP,QACdoN,EAAO,0BAAaA,EAAMzG,KAAK8G,oBAAoB9G,KAAKpG,OAAOP,SAE7D2G,KAAKpG,OAAO9J,MAAO,CACrB,IAAMiyB,EAAI/hB,KAAKpG,OAAO9J,MAAMkyB,cAE5Bvb,EAAOA,EAAK7M,QAAO,SAAA9O,GACjB,OAAOA,EAAEV,KAAK43B,cAAcxjB,SAASujB,IACnCj3B,EAAE6b,QAAQqb,cAAcxjB,SAASujB,IACjCj3B,EAAEqE,SAAS6yB,cAAcxjB,SAASujB,MAIxC,OAAOtb,IAhFX,0BAmFE,WACE,OAAOzG,KAAKmW,aAAenW,KAAKwW,aAAahuB,SACvC6f,KAAK4Z,IAAIjiB,KAAKN,SAASlX,OAAQwX,KAAKtG,YAAYwoB,eArF1D,mCAwFE,SAAsB7zB,GACpB,IAAMivB,EAASjvB,GAAY,IAAQ2R,KAAasL,SAAS6W,MAAMlzB,KAC3D,QAAU,QACd,gBAAUquB,EAAV,YA3FJ,qBA8FE,WACEtd,KAAKtG,YAAcsG,KAAKmT,OAAOlY,QAAQC,OAAOxB,cA/FlD,2BAkGE,WACEsG,KAAK8X,SAAW9X,KAAKwW,eAnGzB,sBAsGE,SAASW,GACPnX,KAAKkY,WAAaf,EAAM,CAACA,GAAOnX,KAAKwW,eAvGzC,qFA0GE,8GACQ,GAAIH,eAAerW,KAAKoiB,gBADhC,gDA1GF,kJA8GE,8GACQ,GAAIC,sBAAsBriB,KAAKoiB,gBADvC,gDA9GF,wJAkHE,8GACQ,GAAIxL,yBAAyB5W,KAAKoiB,gBAD1C,gDAlHF,6IAqHE,8GACQ,GAAI9L,cAActW,KAAKoiB,gBAD/B,gDArHF,kJAyHE,qGACOpiB,KAAKmW,cACRnW,KAAKwW,aAAexW,KAAKP,aAF7B,SAKQ,GAAIqX,mBAAmB9W,KAAKoiB,gBALpC,OAOEpiB,KAAKhD,aAAa,CAAC/G,KAAM,EAAG,uBAP9B,gDAzHF,+IAmIE,oHACkB+J,KAAKtD,gBAAgB,CACnC1I,MAAO,EAAG,0BACViC,KAAM,EAAG,+BACTsI,KAAMsO,GAAWe,WAJrB,UACQU,EADR,OAOOA,EAPP,iEAUQ,GAAI0I,gBAAgBhX,KAAKoiB,gBAVjC,OAYEpiB,KAAKhD,aAAa,CAAC/G,KAAM,EAAG,sBAZ9B,gDAnIF,kJAkJE,+GACQqsB,EAAY,oBAAOtiB,KAAKwW,aAAc,aAEtC+L,EAAUD,EAAU95B,OAAS,EAAI,GAAK85B,EAAU,GAAG/wB,UAH3D,SAIkByO,KAAKtD,gBAAgB,CACnC1I,MAAO,EAAG,sBACViC,KAAM,GACNsI,KAAMsO,GAAWgB,MACjBhjB,MAAO03B,IARX,UAIQjU,EAJR,OAWOA,EAXP,wDAeEtO,KAAKhD,aAAa,CAAC/G,KAAM,EAAG,kBAf9B,mBAkBU,GAAI4gB,mBAAmB7W,KAAKoiB,eAAgB9T,GAlBtD,oEAoBItO,KAAKhD,aAAa,CAAC/G,KAAM,EAAF,KApB3B,2BAwBE+J,KAAKhD,aAAa,CAAC/G,KAAM,EAAG,iBAxB9B,0DAlJF,0FA6KE,SAAoB9G,GAClB6Q,KAAKgY,cAAgB7oB,EACrB6Q,KAAK+X,cAAgB/X,KAAKwW,eA/K9B,yBAkLE,WACMxW,KAAKmW,cACPnW,KAAKwW,aAAexW,KAAKP,aAE3BO,KAAKiY,cAAgBjY,KAAKwW,eAtL9B,kCA0LE,WACExW,KAAKlF,aAAa,CAChB3P,IAAK,cACLN,MAAOmV,KAAKtG,gBA7LlB,6BAkME,WACEsG,KAAKwW,aAAe,KAnMxB,+BAuME,SAAkBlI,GAChB,GAAKtO,KAAKmW,YAAV,CAIA,IAAMqM,EAAelU,EAAEziB,KAAI,SAAAf,GAAC,OAAIA,EAAE8U,QAC5B6iB,EAAW,wBAAWziB,KAAKoiB,eAAgBI,GAC5CC,IAILziB,KAAKwW,aAAexW,KAAKwW,aAAa5c,QAAO,SAAAlP,GAAC,OAAK+3B,EAASjkB,SAAS9T,EAAEkV,eAlN3E,GAAsC,cA0LpC,iBADC,gBAAM,cAAe,CAAEkS,MAAM,K,oCAM7B,MAGD,iBADC,gBAAM,W,+BAGN,MAGD,iBADC,gBAAM,a,iCAaN,MAnNkB,GAAQ,iBA1D5B,gBAAU,CACT8C,WAAY,CACV8N,oBAAA,GACAC,yBAAA,GACAC,kBAAA,GACAC,WAAA,IAEF7Q,SAAU,iCACL,eAAW,CACZ,cACA,cACA,UACA,gBACA,yBACA,oBACA,qBACA,yBAEC,eAAS,CACVpY,OADU,SACHP,EAAO4B,GACZ,OAAOA,EAAQC,OAAOtB,WAI5BgmB,QAAS,CACPkD,mBADO,SACYnxB,GACjB,OAAc,IAAVA,EACK,KAGT,UAAUuW,GAAWvW,GAArB,OAEFoxB,UARO,SAQG1pB,GACR,IAAMqW,EAAOgS,GAAaroB,GAC1B,oBAAcqW,EAAKkD,OAErBoQ,WAZO,SAYI3pB,EAAe4pB,EAAsBC,GAC9C,IAAMxT,EAAOgS,GAAaroB,GAC1B,OAAK4pB,EAGDC,EACK,UAGFxT,EAAK4N,OAAS,QANZ5N,EAAK4N,QASlBrL,QAAS,iCACJ,eAAa,CACd,eACA,kBAEC,eAAW,CACZ,wBAIe,cClY8W,M,mDCQ/X,GAAY,gBACd,GACA,GACA,IACA,EACA,KACA,WACA,MAIa,MAAiB,QAiBhC,KAAkB,GAAW,CAACrD,QAAA,KAAKuD,aAAA,KAAU6N,cAAA,KAAW3G,YAAA,KAAS5G,SAAA,KAAMkB,MAAA,QAAMF,aAAA,KAAU0P,mBAAA,KAAgBzP,iBAAAC,GAAA,KAAiBE,eAAAF,GAAA,KAAeyP,SAAA,KAAM9J,mBAAA,KAAgB+J,cAAA,OCpC7J,IAAI,GAAS,WAAa,IAAIzY,EAAI5K,KAAS6K,EAAGD,EAAIE,eAAmBC,EAAGH,EAAII,MAAMD,IAAIF,EAAG,OAAQD,EAAe,YAAEG,EAAG,MAAM,CAACsB,YAAY,gBAAgBY,MAAMrC,EAAI0Y,gBAAgB,CAAE1Y,EAAO,IAAEG,EAAG,MAAM,CAACsB,YAAY,gBAAgBY,MAAMrC,EAAI4E,YAAc,cAAgB,gBAAgB,CAAG5E,EAAI4E,YAEvB5E,EAAIqB,KAFgClB,EAAG,MAAM,CAACA,EAAG,YAAY,CAACM,MAAM,CAAC,IAAM,IAAII,YAAYb,EAAIc,GAAG,CAAC,CAACvgB,IAAI,YAAYwgB,GAAG,SAASV,GAC3Y,IAAIkB,EAAKlB,EAAIkB,GACb,MAAO,CAACpB,EAAG,OAAOH,EAAI8L,GAAG,GAAGvK,GAAI,CAACvB,EAAIyC,GAAG,gBAAgBzC,EAAIoC,GAAGpC,EAAI2Y,IAAIC,SAAS,WAAW,MAAK,EAAM,aAAa,CAACzY,EAAG,OAAO,CAACH,EAAIyC,GAAG,iBAAiBzC,EAAIoC,GAAGpC,EAAI2Y,IAAIE,YAAY,OAAO1Y,EAAG,MAAMA,EAAG,OAAO,CAACH,EAAIyC,GAAG,oBAAoBzC,EAAIoC,GAAGpC,EAAIH,WAAW,UAAU,GAAcG,EAAI4E,YAAwE5E,EAAIqB,KAA/DlB,EAAG,YAAY,CAACsB,YAAY,OAAOhB,MAAM,CAAC,SAAW,MAAeN,EAAG,MAAM,CAACsB,YAAY,cAAc,CAACtB,EAAG,SAAS,CAACH,EAAIyC,GAAG,gBAAgBzC,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAInL,YAAYjX,QAAQ,KAAKoiB,EAAIoC,GAAGpC,EAAIyM,GAAG,aAAPzM,CAAqBA,EAAIyJ,YAAY,OAAO,GAAKzJ,EAAI4E,YAAwE5E,EAAIqB,KAA/DlB,EAAG,YAAY,CAACsB,YAAY,OAAOhB,MAAM,CAAC,SAAW,MAAeN,EAAG,YAAY,CAACM,MAAM,CAAC,IAAM,IAAII,YAAYb,EAAIc,GAAG,CAAC,CAACvgB,IAAI,YAAYwgB,GAAG,SAASV,GAClsB,IAAIkB,EAAKlB,EAAIkB,GACb,MAAO,CAACpB,EAAG,MAAMH,EAAI8L,GAAG,CAACrK,YAAY,cAAcF,GAAI,CAACpB,EAAG,SAAS,CAACH,EAAIyC,GAAG,aAAazC,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAIyM,GAAG,aAAPzM,CAAqBA,EAAIpd,KAAKk2B,qBAAqB,MAAM,OAAO,MAAK,EAAM,aAAa,CAAC3Y,EAAG,OAAO,CAACH,EAAIyC,GAAG,qBAAqBzC,EAAIoC,GAAGpC,EAAIpd,KAAKm2B,gBAAgB,OAAO5Y,EAAG,MAAMA,EAAG,OAAO,CAACH,EAAIyC,GAAG,oBAAoBzC,EAAIoC,GAAGpC,EAAIpd,KAAKo2B,oBAAoB,YAAchZ,EAAI4E,YAAwE5E,EAAIqB,KAA/DlB,EAAG,YAAY,CAACsB,YAAY,OAAOhB,MAAM,CAAC,SAAW,MAAiBT,EAAI4E,YAAkR5E,EAAIqB,KAAzQlB,EAAG,MAAM,CAACsB,YAAY,cAAc,CAACtB,EAAG,SAAS,CAACsB,YAAY,wBAAwB,CAACzB,EAAIyC,GAAG,8BAA8BtC,EAAG,OAAO,CAACH,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAIyM,GAAG,aAAPzM,CAAqBA,EAAIpd,KAAKq2B,aAAa,IAAIjZ,EAAIoC,GAAGpC,EAAIyM,GAAG,aAAPzM,CAAqBA,EAAIpd,KAAKs2B,aAAa,QAAQ,IAAa,GAAGlZ,EAAIqB,KAAMrB,EAAQ,KAAEG,EAAG,MAAM,CAACsB,YAAY,gBAAgBY,MAAMrC,EAAI4E,YAAc,cAAgB,gBAAgB,CAAG5E,EAAI4E,YAA6J5E,EAAIqB,KAApJlB,EAAG,MAAM,CAACsB,YAAY,cAAc,CAACtB,EAAG,SAAS,CAACH,EAAIyC,GAAG,aAAazC,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAI/O,GAAG,kBAAmB+O,EAAIpd,KAAKmI,YAAY,MAAM,GAAciV,EAAI4E,YAAwE5E,EAAIqB,KAA/DlB,EAAG,YAAY,CAACsB,YAAY,OAAOhB,MAAM,CAAC,SAAW,MAAeN,EAAG,MAAM,CAACsB,YAAY,cAAc,CAACtB,EAAG,YAAY,CAACM,MAAM,CAAC,IAAM,IAAII,YAAYb,EAAIc,GAAG,CAAC,CAACvgB,IAAI,YAAYwgB,GAAG,SAASV,GAC1tC,IAAIkB,EAAKlB,EAAIkB,GACb,MAAO,CAACpB,EAAG,SAASH,EAAI8L,GAAG,CAACrL,MAAM,CAAC,MAAQT,EAAIyM,GAAG,sBAAPzM,CAA8BA,EAAIpd,KAAKu2B,qBAAqB5X,GAAI,CAACvB,EAAIyC,GAAG,QAAQzC,EAAIoC,GAAGpC,EAAIyM,GAAG,iBAAPzM,CAAyBA,EAAIpd,KAAKu2B,oBAAoB,OAAQnZ,EAAe,YAAEG,EAAG,OAAO,CAACH,EAAIyC,GAAG,YAAYzC,EAAIoC,GAAGpC,EAAIpd,KAAKu2B,mBAAmB,OAAOnZ,EAAIqB,SAAS,MAAK,EAAM,YAAY,CAAClB,EAAG,OAAO,CAACH,EAAIyC,GAAG,YAAYzC,EAAIoC,GAAGpC,EAAIpd,KAAKu2B,mBAAmB,UAAU,GAAKnZ,EAAI4E,YAAwE5E,EAAIqB,KAA/DlB,EAAG,YAAY,CAACsB,YAAY,OAAOhB,MAAM,CAAC,SAAW,MAAeN,EAAG,MAAM,CAACsB,YAAY,cAAc,CAAEzB,EAAe,YAAEG,EAAG,WAAW,CAACsB,YAAY,yBAAyBhB,MAAM,CAAC,eAAe,GAAG,MAAQT,EAAIoZ,aAAa,MAAQ,4BAA4B7X,GAAG,CAAC,OAASvB,EAAIqZ,uBAAuBxY,YAAYb,EAAIc,GAAG,CAAC,CAACvgB,IAAI,UAAUwgB,GAAG,WAAW,MAAO,CAACZ,EAAG,SAASH,EAAIkC,GAAG,GAAG,SAASlC,EAAIsZ,eAAc,GAAO,CAACtZ,EAAIyC,GAAG,yBAAyBzB,OAAM,IAAO,MAAK,EAAM,cAAcb,EAAG,YAAY,CAACM,MAAM,CAAC,IAAM,IAAII,YAAYb,EAAIc,GAAG,CAAC,CAACvgB,IAAI,YAAYwgB,GAAG,SAASV,GACt9B,IAAIkB,EAAKlB,EAAIkB,GACb,MAAO,CAACpB,EAAG,SAASH,EAAI8L,GAAG9L,EAAIkC,GAAG,CAACX,GAAG,CAAC,MAAQvB,EAAIqZ,wBAAwB,SAASrZ,EAAIsZ,eAAc,GAAO/X,GAAI,CAACvB,EAAIyC,GAAG,2BAA2B,MAAK,EAAM,aAAa,CAACtC,EAAG,OAAO,CAACH,EAAIyC,GAAG,6BAA6BzC,EAAIoC,GAAGpC,EAAIoZ,aAAe,UAAY,YAAY,UAAU,GAAKpZ,EAAI4E,YAAwE5E,EAAIqB,KAA/DlB,EAAG,YAAY,CAACsB,YAAY,OAAOhB,MAAM,CAAC,SAAW,MAAeN,EAAG,MAAM,CAACsB,YAAY,cAAc,CAACtB,EAAG,SAAS,CAACM,MAAM,CAAC,MAAQT,EAAIpd,KAAK22B,cAAgB,EAAI,UAAY,OAAO,CAACvZ,EAAIyC,GAAG,oBAAoBtC,EAAG,OAAO,CAACH,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAIyM,GAAG,aAAPzM,CAAqBA,EAAIpd,KAAK22B,gBAAgB,OAAQvZ,EAAIpd,KAAkB,cAAE,CAACod,EAAIyC,GAAG,KAAKzC,EAAIoC,GAAGpC,EAAIyM,GAAG,aAAPzM,CAAqBA,EAAIpd,KAAK42B,gBAAgB,SAASxZ,EAAIqB,KAAOrB,EAAI4E,YAAqF5E,EAAIqB,KAA5E,CAACrB,EAAIyC,GAAG,KAAKzC,EAAIoC,GAAGpC,EAAIyM,GAAG,aAAPzM,CAAqBA,EAAIpd,KAAK62B,eAAe,QAAiB,IAAI,GAAKzZ,EAAI4E,YAAwE5E,EAAIqB,KAA/DlB,EAAG,YAAY,CAACsB,YAAY,OAAOhB,MAAM,CAAC,SAAW,MAAeN,EAAG,MAAM,CAACsB,YAAY,cAAc,CAACtB,EAAG,SAAS,CAACM,MAAM,CAAC,MAAQT,EAAIpd,KAAK82B,cAAgB,EAAI,UAAY,OAAO,CAAC1Z,EAAIyC,GAAG,kBAAkBtC,EAAG,OAAO,CAACH,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAIyM,GAAG,aAAPzM,CAAqBA,EAAIpd,KAAK82B,gBAAgB,OAAQ1Z,EAAIpd,KAAkB,cAAE,CAACod,EAAIyC,GAAG,KAAKzC,EAAIoC,GAAGpC,EAAIyM,GAAG,aAAPzM,CAAqBA,EAAIpd,KAAK+2B,gBAAgB,SAAS3Z,EAAIqB,KAAOrB,EAAI4E,YAAqF5E,EAAIqB,KAA5E,CAACrB,EAAIyC,GAAG,KAAKzC,EAAIoC,GAAGpC,EAAIyM,GAAG,aAAPzM,CAAqBA,EAAIpd,KAAKg3B,eAAe,QAAiB,IAAI,IAAI,GAAG5Z,EAAIqB,OAAOrB,EAAIqB,MACt0C,GAAkB,GCsOD,GAArB,2G,0BAIE,EAAAsX,IAAW,KACX,EAAAS,cAAe,EAEf,EAAAvZ,UAAY,GAPd,gDAaE,WACE,OAAO,mBAAMzK,KAAKP,YAAa,UAdnC,yBAiBE,WACE,OAAIO,KAAKgkB,aACA,CACL/W,MAAO,gBACPqQ,MAAO,WAIJ,CACLrQ,MAAO,KACPqQ,MAAO,aA3Bb,0BA+BE,WACE,IAAMhP,EAAItO,KAAKwP,YACf,OAAIlB,EACK,CAAC,YAAa,eAGhB,CAAC,OAAQ,2BArCpB,iFAwCE,wHACmB,GAAImW,gBADvB,cACMthB,EADN,OAEQqgB,EAAUrgB,EAAKnb,KAFvB,SAIe,GAAI08B,gBAJnB,OAIEvhB,EAJF,OAKQsgB,EAAatgB,EAAKnb,KAExBgY,KAAKujB,IAAM,CACTC,UAASC,cARb,gDAxCF,qJAoDE,qGACEzjB,KAAKgkB,cAAgBhkB,KAAKgkB,aAD5B,SAEQ,GAAIC,wBAFZ,gDApDF,8EAyDE,WACOjkB,KAAKgG,cAIVhG,KAAKgkB,aAAehkB,KAAKxS,KAAKm3B,qBAC9B3kB,KAAK4kB,gBA/DT,yBAmEE,SAAYtW,GACNA,GAAkB,OAAbtO,KAAKujB,KACZvjB,KAAK4kB,eArEX,iCA0EE,SAAqBtW,GACnBtO,KAAKgkB,aAAe1V,MA3ExB,GAAoC,cAElC,iBADC,gBAAK0H,U,mCAkEN,iBADC,gBAAM,gB,2BAKN,MAGD,iBADC,gBAAM,8B,mCAGN,MA5EkB,GAAM,iBA/B1B,gBAAU,CACT4J,QAAS,CACPiF,eADO,SACQv2B,GACb,IAAMw2B,EAAiB,CACrBC,UAAW,gBACXC,WAAY,gBACZC,aAAc,iBAEhB,OAAOH,EAAUx2B,IAEnB42B,oBATO,SASa52B,GAClB,IAAMw2B,EAAiB,CACrBC,UAAW,UACXC,WAAY,UACZC,aAAc,SAEhB,OAAOH,EAAUx2B,KAGrB0jB,SAAU,iCACL,eAAS,CACVxkB,KADU,SACL6L,GACH,OAAO2G,KAAKgG,YAAc3M,EAAM8L,SAASggB,aAAe,SAGzD,eAAW,CACZ,cACA,oBAIe,cC/O4W,M,sCCQ7X,GAAY,gBACd,GACA,GACA,IACA,EACA,KACA,WACA,MAIa,MAAiB,QAQhC,KAAkB,GAAW,CAAC9L,YAAA,KAAS5G,SAAA,KAAM2S,WAAA,KAAQC,YAAA,OC3BrD,IAAI,GAAS,WAAa,IAAIza,EAAI5K,KAAS6K,EAAGD,EAAIE,eAAmBC,EAAGH,EAAII,MAAMD,IAAIF,EAAG,OAAOE,EAAG,WAAW,CAACM,MAAM,CAAC,MAAQT,EAAI/f,MAAM,WAAa,GAAG,WAAa+f,EAAI4E,YAAY,MAAQ5E,EAAIgP,aAAazN,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOxB,EAAI0a,MAAM,QAASlZ,MAAW,CAACrB,EAAG,SAAS,CAACA,EAAG,eAAe,CAACsB,YAAY,YAAY,CAACtB,EAAG,SAAS,CAACsB,YAAY,QAAQ,CAACzB,EAAIyC,GAAG,eAAetC,EAAG,OAAO,CAACgC,SAAS,CAAC,YAAcnC,EAAIoC,GAAGpC,EAAI/O,GAAG,aAAa,GAAGkP,EAAG,cAAc,CAAGH,EAAI7b,KAAKvG,OAAkFoiB,EAAIqB,KAA9ElB,EAAG,oBAAoB,CAACsB,YAAY,OAAOhB,MAAM,CAAC,eAAgB,KAAiBN,EAAG,KAAK,CAACsB,YAAY,gBAAgBzB,EAAI0C,GAAI1C,EAAQ,MAAE,SAASuM,EAAI7uB,GAAG,OAAOyiB,EAAG,KAAK,CAAC5f,IAAI7C,EAAE+jB,YAAY,WAAWY,MAAMrC,EAAIyM,GAAG,YAAPzM,CAAoBuM,EAAI5Y,OAAO,CAACwM,EAAG,OAAO,CAACsB,YAAY,OAAO,CAACzB,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAIyM,GAAG,aAAPzM,CAAqBuM,EAAI5Y,OAAO,IAAIqM,EAAIoC,GAAGpC,EAAIyM,GAAG,kBAAPzM,CAA0BuM,EAAI1N,UAAY,MAAO,OAAOsB,EAAG,OAAO,CAACgC,SAAS,CAAC,UAAYnC,EAAIoC,GAAGmK,EAAIhG,iBAAgB,GAAGpG,EAAG,MAAM,CAACE,IAAI,SAAS,GAAGF,EAAG,iBAAiB,CAACA,EAAG,YAAYA,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,IAAI0B,SAAS,CAAC,YAAcnC,EAAIoC,GAAGpC,EAAI/O,GAAG,WAAWsQ,GAAG,CAAC,MAAQvB,EAAIpO,gBAAgB,IAAI,IAAI,IACzlC,GAAkB,GCuED,GAArB,2G,0BAIE,EAAAzN,KAAc,GAJhB,kDAME,WACE,OAAOiR,KAAKsL,SAASC,WAAW4C,UAAY,OAAS,QAPzD,uBASE,WACE,OAAOnO,KAAKsL,SAASC,WAAWoE,SAVpC,yBAcE,WACE,OAAO,IAfX,8EAkBE,6GACQ/N,EAAS5B,KAAKjR,KAAKvG,OAASwX,KAAKjR,KAAKiR,KAAKjR,KAAKvG,OAAS,GAAGwD,IAAM,EAD1E,SAEqB,GAAIu5B,QAAQ3jB,GAFjC,UAEQ7S,EAFR,QAIMiR,KAAKma,QAJX,qDAQMprB,EAAKvG,OARX,wBASIwX,KAAKjR,KAAOiR,KAAKjR,KAAKolB,OAAOplB,GATjC,UAWUiR,KAAK+V,YAXf,QAaK/V,KAAK6Q,MAAM2U,IAAoBC,iBAbpC,iDAlBF,8EAmCE,WACEzlB,KAAKwa,cAAcxa,KAAKulB,aApC5B,GAAwC,IAEtC,iBADC,gBAAKvP,U,6BAaN,iBADC,gBAAK,U,2BAGL,MAhBkB,GAAU,iBAtB9B,gBAAU,CACT4J,QAAS,CACP8F,WADO,SACInnB,GACT,IAAM1S,EAAW,CACf85B,EAAG,IACHC,EAAG,IACHC,EAAG,IACHC,EAAG,KAEL,OAAOj6B,EAAI0S,IAEbwnB,UAVO,SAUGxnB,GACR,IAAM1S,EAAW,CACf85B,EAAG,KACHC,EAAG,aACHC,EAAG,gBACHC,EAAG,eAEL,OAAOj6B,EAAI0S,QAII,cCxEkY,MCQnZ,I,UAAY,gBACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,MAAiB,QAahC,KAAkB,GAAW,CAACqQ,QAAA,KAAKC,SAAA,KAAMC,aAAA,QAAaC,UAAA,QAAUC,WAAA,QAAWC,WAAA,KAAQwD,SAAA,KAAM6G,mBAAA,KAAgBpK,WAAA,OChCzG,IAAI,GAAS,WAAa,IAAItE,EAAI5K,KAAS6K,EAAGD,EAAIE,eAAmBC,EAAGH,EAAII,MAAMD,IAAIF,EAAG,OAAOE,EAAG,WAAW,CAACM,MAAM,CAAC,MAAQT,EAAI/f,MAAM,WAAa,GAAG,WAAa,IAAIshB,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOxB,EAAI0a,MAAM,QAASlZ,MAAW,CAACrB,EAAG,SAAS,CAACA,EAAG,eAAe,CAACsB,YAAY,YAAY,CAACtB,EAAG,SAAS,CAACsB,YAAY,QAAQ,CAACzB,EAAIyC,GAAG,iBAAiBtC,EAAG,OAAO,CAACH,EAAIyC,GAAG,SAAStC,EAAG,YAAYA,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,IAAIc,GAAG,CAAC,MAAQvB,EAAIpO,cAAc,CAACuO,EAAG,SAAS,CAACH,EAAIyC,GAAG,gBAAgB,IAAI,GAAGtC,EAAG,cAAc,CAACA,EAAG,MAAM,CAACsB,YAAY,WAAW,CAACtB,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,GAAG,MAAQT,EAAI/O,GAAG,wBAAwBsQ,GAAG,CAAC,MAAQvB,EAAIob,aAAa,CAACjb,EAAG,SAAS,CAACH,EAAIyC,GAAG,oBAAoB,GAAGtC,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,GAAG,UAAYT,EAAIqb,WAAW,MAAQrb,EAAI/O,GAAG,WAAWsQ,GAAG,CAAC,MAAQvB,EAAIsb,gBAAgB,CAACnb,EAAG,SAAS,CAACH,EAAIyC,GAAG,iBAAiB,GAAGtC,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,GAAG,UAAYT,EAAIqb,WAAW,MAAQrb,EAAI/O,GAAG,WAAWsQ,GAAG,CAAC,MAAQvB,EAAIub,gBAAgB,CAACpb,EAAG,SAAS,CAACH,EAAIyC,GAAG,oBAAoB,GAAGtC,EAAG,YAAY,CAACM,MAAM,CAAC,SAAW,MAAMN,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,GAAG,UAAYT,EAAIqb,WAAW,MAAQrb,EAAI/O,GAAG,YAAYsQ,GAAG,CAAC,MAAQvB,EAAIwb,iBAAiB,CAACrb,EAAG,SAAS,CAACH,EAAIyC,GAAG,kBAAkB,GAAGtC,EAAG,YAAYA,EAAG,YAAY,CAACM,MAAM,CAAC,SAAW,MAAMN,EAAG,WAAW,CAACM,MAAM,CAAC,cAAcT,EAAIva,YAAYuC,uBAAuB,MAAQgY,EAAI/O,GAAG,2BAA2B,eAAe,IAAIsQ,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAIyb,iBAAiB,yBAA0Bja,OAAYrB,EAAG,YAAY,CAACM,MAAM,CAAC,SAAW,MAAMN,EAAG,WAAW,CAACM,MAAM,CAAC,cAAcT,EAAIva,YAAYwC,6BAA6B,MAAQ+X,EAAI/O,GAAG,4BAA4B,eAAe,IAAIsQ,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAIyb,iBAAiB,+BAAgCja,OAAYrB,EAAG,YAAY,CAACM,MAAM,CAAC,SAAW,MAAMN,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,GAAG,MAAQT,EAAI/O,GAAG,aAAasQ,GAAG,CAAC,MAAQ,SAASC,GAAQxB,EAAI0b,iBAAkB,KAAQ,CAACvb,EAAG,SAAS,CAACH,EAAIyC,GAAG,kBAAkB,IAAI,GAAGtC,EAAG,aAAaA,EAAG,MAAM,CAACsB,YAAY,WAAW,CAACtB,EAAG,MAAM,CAACsB,YAAY,iBAAiB,CAAGzB,EAAI2b,QAAsG,CAACxb,EAAG,MAAM,CAACsB,YAAY,aAAa,CAACtB,EAAG,aAAa,CAACM,MAAM,CAAC,gBAAgB,GAAG,WAAW,GAAG,MAAQT,EAAI4b,QAAQ,WAAW,OAAO,YAAc,GAAG,MAAQ,IAAIra,GAAG,CAAC,gBAAgB,SAASC,GAAQxB,EAAIqb,WAAa7Z,EAAO,KAAKX,YAAYb,EAAIc,GAAG,CAAC,CAACvgB,IAAI,UAAUwgB,GAAG,SAASwL,GAAK,MAAO,CAAEvM,EAAI6b,cAActP,GAAMpM,EAAG,sBAAsB,CAACM,MAAM,CAAC,cAAgB,GAAG,KAAO,KAAK,MAAQ,OAAON,EAAG,SAAS,CAACgC,SAAS,CAAC,YAAcnC,EAAIoC,GAAGpC,EAAIiT,WAAW1G,UAAY,CAAChsB,IAAI,QAAQwgB,GAAG,SAASwL,GAAK,MAAO,CAACvM,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGmK,EAAIzH,KAAKtlB,MAAM,KAAM+sB,EAAIzH,KAAa,SAAE,CAAC9E,EAAIyC,GAAG,KAAKzC,EAAIoC,GAAGmK,EAAIzH,KAAK0D,SAAS5qB,QAAQ,OAAOoiB,EAAIqB,aAAa,GAAGlB,EAAG,YAAY,CAACM,MAAM,CAAC,SAAW,MAAMN,EAAG,MAAM,CAACsB,YAAY,eAAe,CAACtB,EAAG,MAAM,CAACsB,YAAY,YAAY,CAACtB,EAAG,IAAI,CAACH,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAI/O,GAAG,YAAY,MAAO+O,EAAc,WAAEG,EAAG,IAAI,CAACM,MAAM,CAAC,OAAS,SAAS,KAAOT,EAAI8b,WAAWtnB,MAAM,CAACwL,EAAIyC,GAAGzC,EAAIoC,GAAGpC,EAAI8b,WAAW1yB,UAAU4W,EAAIqB,OAAOlB,EAAG,IAAI,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAGpC,EAAI/O,GAAG,SAAS,KAAK+O,EAAIoC,GAAGpC,EAAIyM,GAAG,OAAPzM,CAAgBA,EAAI8b,WAAa9b,EAAI8b,WAAWC,cAAgB,YAAa5b,EAAG,aAAaA,EAAG,MAAM,CAACsB,YAAY,gBAAgB,CAAEzB,EAAc,WAAEG,EAAG,SAAS,CAACM,MAAM,CAAC,MAAQ,KAAK,CAACN,EAAG,oBAAoB,CAACM,MAAM,CAAC,MAAQ,WAAWQ,MAAM,CAAChhB,MAAO+f,EAAiB,cAAE9N,SAAS,SAAUgP,GAAMlB,EAAIgc,cAAc9a,GAAKV,WAAW,kBAAkBR,EAAI0C,GAAI1C,EAAIic,aAAajc,EAAI8b,WAAWI,WAAW,SAASC,GAAS,OAAOhc,EAAG,cAAc,CAAC5f,IAAI47B,EAAQ/6B,GAAGqf,MAAM,CAAC,MAAQ0b,IAAU,CAAChc,EAAG,sBAAsB,CAACA,EAAG,oBAAoB,CAACA,EAAG,OAAO,CAACM,MAAM,CAAC,MAAQ0b,EAAQ/yB,OAAO+Y,SAAS,CAAC,YAAcnC,EAAIoC,GAAG+Z,EAAQ/yB,aAAa,GAAG+W,EAAG,qBAAqB,CAACA,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,IAAIc,GAAG,CAAC,MAAQ,SAASC,GAAiC,OAAzBA,EAAO4G,kBAAyBpI,EAAIoc,gBAAgBD,MAAY,CAAChc,EAAG,SAAS,CAACH,EAAIyC,GAAG,mBAAmB,IAAI,IAAI,MAAK,IAAI,GAAGzC,EAAIqB,MAAM,IAAI,GAAGlB,EAAG,YAAY,CAACM,MAAM,CAAC,SAAW,MAAMN,EAAG,MAAM,CAACsB,YAAY,YAAY,CAACtB,EAAG,MAAM,CAACsB,YAAY,YAAY,CAACtB,EAAG,IAAI,CAACH,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAI/O,GAAG,YAAY,MAAO+O,EAAiB,cAAEG,EAAG,IAAI,CAACM,MAAM,CAAC,OAAS,SAAS,KAAOT,EAAIgc,cAAcK,OAAO,CAACrc,EAAIyC,GAAGzC,EAAIoC,GAAGpC,EAAIgc,cAAc5yB,UAAU4W,EAAIqB,OAAOlB,EAAG,IAAI,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAKpC,EAAI/O,GAAG,WAAY,GAAM,MAAQ+O,EAAIgc,cAAgBhc,EAAIgc,cAAcz3B,SAAU,QAAS4b,EAAG,IAAI,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAGpC,EAAI/O,GAAG,SAAS,KAAK+O,EAAIoC,GAAGpC,EAAIyM,GAAG,OAAPzM,CAAgBA,EAAIgc,cAAgBhc,EAAIgc,cAAc/2B,KAAM,YAAakb,EAAG,aAAcH,EAAiB,cAAEG,EAAG,SAAS,CAACG,WAAW,CAAC,CAAC9gB,KAAK,OAAO+gB,QAAQ,SAAStgB,MAAO+f,EAAIgc,cAAyB,YAAExb,WAAW,8BAA8BiB,YAAY,SAAShB,MAAM,CAAC,QAAU,uBAAuBT,EAAIqB,MAAM,IAAtoFlB,EAAG,MAAM,CAACsB,YAAY,WAAW,CAACtB,EAAG,sBAAsB,CAACM,MAAM,CAAC,cAAgB,OAAO,IAAijF,MAAM,IAAI,GAAIT,EAAmB,gBAAEG,EAAG,iBAAiB,CAACM,MAAM,CAAC,WAAWT,EAAI2b,SAAS1a,MAAM,CAAChhB,MAAO+f,EAAmB,gBAAE9N,SAAS,SAAUgP,GAAMlB,EAAI0b,gBAAgBxa,GAAKV,WAAW,qBAAqBR,EAAIqB,MAAM,IAC73J,GAAkB,GCDlB,GAAS,WAAa,IAAIrB,EAAI5K,KAAS6K,EAAGD,EAAIE,eAAmBC,EAAGH,EAAII,MAAMD,IAAIF,EAAG,OAAOE,EAAG,WAAW,CAACM,MAAM,CAAC,MAAQT,EAAI/f,MAAM,WAAa,GAAG,MAAQ,OAAOshB,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOxB,EAAI0a,MAAM,QAASlZ,MAAW,CAACrB,EAAG,SAAS,CAACA,EAAG,eAAe,CAACsB,YAAY,YAAY,CAACtB,EAAG,SAAS,CAACsB,YAAY,QAAQ,CAACzB,EAAIyC,GAAG,gBAAgBtC,EAAG,OAAO,CAACgC,SAAS,CAAC,YAAcnC,EAAIoC,GAAGpC,EAAI/O,GAAG,6BAA6BkP,EAAG,YAAYA,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,IAAIc,GAAG,CAAC,MAAQvB,EAAIpO,cAAc,CAACuO,EAAG,SAAS,CAACH,EAAIyC,GAAG,gBAAgB,IAAI,GAAGtC,EAAG,cAAc,CAACA,EAAG,MAAM,CAACsB,YAAY,WAAW,CAACtB,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,GAAG,MAAQT,EAAI/O,GAAG,6BAA6BsQ,GAAG,CAAC,MAAQvB,EAAIsc,aAAa,CAACnc,EAAG,SAAS,CAACH,EAAIyC,GAAG,eAAe,GAAGtC,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,GAAG,UAAYT,EAAIuc,iBAAiB,MAAQvc,EAAI/O,GAAG,WAAWsQ,GAAG,CAAC,MAAQvB,EAAIwc,gBAAgB,CAACrc,EAAG,SAAS,CAACH,EAAIyC,GAAG,iBAAiB,IAAI,GAAGtC,EAAG,aAAaA,EAAG,MAAM,CAACsB,YAAY,WAAW,CAAGzB,EAAIyc,SAAuG,CAACtc,EAAG,MAAM,CAACsB,YAAY,aAAa,CAACtB,EAAG,SAAS,CAACM,MAAM,CAAC,MAAQ,KAAK,CAACN,EAAG,oBAAoB,CAACM,MAAM,CAAC,MAAQ,WAAWQ,MAAM,CAAChhB,MAAO+f,EAAoB,iBAAE9N,SAAS,SAAUgP,GAAMlB,EAAIuc,iBAAiBrb,GAAKV,WAAW,qBAAqBR,EAAI0C,GAAI1C,EAAY,UAAE,SAAS/f,EAAMM,GAAK,OAAO4f,EAAG,cAAc,CAAC5f,IAAIA,EAAIkgB,MAAM,CAAC,MAAQlgB,IAAM,CAAC4f,EAAG,qBAAqB,CAACA,EAAG,aAAa,CAACM,MAAM,CAAC,MAAQ,IAAIQ,MAAM,CAAChhB,MAAOA,EAAa,QAAEiS,SAAS,SAAUgP,GAAMlB,EAAIsB,KAAKrhB,EAAO,UAAWihB,IAAMV,WAAW,oBAAoB,GAAGL,EAAG,sBAAsB,CAACA,EAAG,oBAAoB,CAACgC,SAAS,CAAC,YAAcnC,EAAIoC,GAAG7hB,OAAS,IAAI,MAAK,IAAI,IAAI,GAAG4f,EAAG,YAAY,CAACM,MAAM,CAAC,SAAW,MAAMN,EAAG,MAAM,CAACsB,YAAY,gBAAgB,CAACtB,EAAG,SAAS,CAACsB,YAAY,aAAa,CAACtB,EAAG,IAAI,CAACsB,YAAY,aAAaU,SAAS,CAAC,YAAcnC,EAAIoC,GAAGpC,EAAI/O,GAAG,qCAAqCkP,EAAG,aAAa,CAACM,MAAM,CAAC,MAAQ,GAAG,MAAQT,EAAI/O,GAAG,6BAA6B,UAAY+O,EAAI0c,aAAajjB,QAAQ,MAAQuG,EAAI0c,aAAaC,UAAUpb,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAI4c,SAAS,WAAYpb,OAAYrB,EAAG,eAAe,CAACM,MAAM,CAAC,MAAQ,GAAG,MAAQT,EAAI/O,GAAG,gCAAgC,UAAY+O,EAAI0c,aAAajjB,QAAQ,MAAQuG,EAAI0c,aAAaG,aAAatb,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAI4c,SAAS,cAAepb,OAAYrB,EAAG,eAAe,CAACM,MAAM,CAAC,MAAQ,GAAG,MAAQT,EAAI/O,GAAG,oCAAoC,UAAY+O,EAAI0c,aAAajjB,QAAQ,MAAQuG,EAAI0c,aAAaI,gBAAgBvb,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAI4c,SAAS,iBAAkBpb,OAAYrB,EAAG,eAAe,CAACM,MAAM,CAAC,MAAQ,GAAG,MAAQT,EAAI/O,GAAG,kCAAkC,UAAY+O,EAAI0c,aAAajjB,QAAQ,MAAQuG,EAAI0c,aAAaK,eAAexb,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAI4c,SAAS,gBAAiBpb,OAAYrB,EAAG,aAAa,CAACM,MAAM,CAAC,MAAQ,GAAG,MAAQT,EAAI/O,GAAG,iCAAiC,UAAY+O,EAAI0c,aAAajjB,QAAQ,MAAQuG,EAAI0c,aAAaM,aAAazb,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAI4c,SAAS,cAAepb,OAAYrB,EAAG,WAAW,CAACM,MAAM,CAAC,MAAQ,GAAG,MAAQT,EAAI/O,GAAG,mCAAmC,MAAQ+O,EAAIoF,cAAc,UAAYpF,EAAI0c,aAAajjB,QAAQ,MAAQuG,EAAI0c,aAAaO,kBAAkB1b,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAI4c,SAAS,mBAAoBpb,OAAYrB,EAAG,eAAe,CAACM,MAAM,CAAC,MAAQ,GAAG,MAAQT,EAAI/O,GAAG,YAAY,UAAY+O,EAAI0c,aAAajjB,QAAQ,MAAQuG,EAAI0c,aAAavhB,UAAUoG,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAI4c,SAAS,WAAYpb,QAAa,GAAGrB,EAAG,aAAaA,EAAG,IAAI,CAACsB,YAAY,cAAcU,SAAS,CAAC,YAAcnC,EAAIoC,GAAGpC,EAAI/O,GAAG,sCAAuC+O,EAAI0c,aAAoB,QAAEvc,EAAG,SAAS,CAACM,MAAM,CAAC,MAAQ,KAAKT,EAAI0C,GAAI1C,EAAY,UAAE,SAAS8E,GAAM,OAAO3E,EAAG,cAAc,CAAC5f,IAAIukB,EAAK7kB,OAAO,CAACkgB,EAAG,qBAAqB,CAACA,EAAG,aAAa,CAACM,MAAM,CAAC,MAAQ,GAAG,cAAcT,EAAIkd,cAAcpY,EAAK7kB,QAAQshB,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAImd,WAAWrY,EAAK7kB,MAAOuhB,QAAa,GAAGrB,EAAG,sBAAsB,CAACA,EAAG,oBAAoB,CAACgC,SAAS,CAAC,YAAcnC,EAAIoC,GAAG0C,EAAKzZ,UAAU,IAAI,MAAK,GAAG2U,EAAIqB,MAAM,IAAjnGlB,EAAG,MAAM,CAACsB,YAAY,WAAW,CAACtB,EAAG,sBAAsB,CAACM,MAAM,CAAC,cAAgB,OAAO,IAA4hG,IAAI,IAAI,IAAI,IACvkI,GAAkB,GCkMD,GAArB,2G,0BAME,EAAAgc,SAA4C,KAC5C,EAAAF,iBAAkC,KAPpC,mDAeE,WACE,OAAKnnB,KAAKmnB,kBAAsBnnB,KAAKmnB,oBAAoBnnB,KAAKqnB,SAIvDrnB,KAAKqnB,SAAUrnB,KAAKmnB,kBAHlB,IAjBb,IAsBE,SAAiB7Y,GACftO,KAAKqnB,SAAUrnB,KAAKmnB,kBAAqB7Y,IAvB7C,yBA0BE,WACE,IAAM0Z,EAAuB,CAC3B78B,IAAK,GACLf,KAAM,EAAG,kBAGX,MAAO,CAAC49B,GAAD,sBAAgBhoB,KAAKiG,gBAAepa,KAAI,SAAA3B,GAC7C,MAAO,CACL+L,KAAM/L,EAAEE,KACRS,MAAOX,EAAEiB,UAnCjB,oBAuCE,WACE,OAAO6U,KAAKioB,cAAcjoB,KAAKumB,WAxCnC,2BA2CE,SAAcnnB,GACZ,OAAOY,KAAKsnB,aAAaY,cAAc1pB,SAASY,KA5CpD,wBA+CE,SAAWA,EAAaiF,GACtB,IAAM8jB,EAAO,uBAAUnoB,KAAKsnB,cACtBc,EAAQD,EAAKD,cAEf7jB,EACF+jB,EAAMt/B,KAAKsW,GAEX,kBAAKgpB,EAAOhpB,GAGdY,KAAKsnB,aAAea,IAzDxB,sBA4DE,SAASh9B,EAAoBN,GAC3B,IAAMs9B,EAAY,uBAAUnoB,KAAKsnB,cACjCa,EAAKh9B,GAAON,EAEZmV,KAAKsnB,aAAea,IAhExB,2BAmEE,SAAcE,GAGZ,IAFA,IAAIh/B,EAAgB,GAEpB,MAA2BZ,OAAOyY,QAAQmnB,GAA1C,eAAiD,CAA5C,8BAAOl9B,EAAP,KAAYN,EAAZ,KACC,QAASA,EACXxB,EAAOP,KAAK,CACVmN,KAAM9K,EACNN,MAAOA,EAAMuU,MAGf/V,EAASA,EAAO8qB,OAAOnU,KAAKioB,cAAcp9B,IAI9C,OAAOxB,IAjFX,oFAoFE,8GACwB,GAAIi/B,cAD5B,OACEtoB,KAAKqnB,SADP,uDApFF,0IAwFE,oHACqBrnB,KAAKtD,gBAAgB,CACtCzG,KAAM,EAAG,iCACTsI,KAAMsO,GAAWgB,QAHrB,UACQzjB,EADR,OAMOA,EANP,wDAUE4V,KAAKhD,aAAa,CAChB/G,KAAM,EAAG,kBAXb,SAcQ,GAAIsyB,WAAWn+B,GAdvB,OAeE4V,KAAKwoB,gBAELxoB,KAAK/C,gBAjBP,iDAxFF,6IA4GE,oHACsB+C,KAAKtD,gBAAgB,CACvCzG,KAAM,EAAG,+BACTsI,KAAMsO,GAAWe,WAHrB,UACQR,EADR,OAMOA,EANP,wDAUEpN,KAAKhD,aAAa,CAChB/G,KAAM,EAAG,oBAXb,SAcQ,GAAIwyB,cAAczoB,KAAKmnB,kBAd/B,OAeEnnB,KAAKwoB,gBAELxoB,KAAK/C,gBAjBP,iDA5GF,kFAiIE,WACE,OAAO,IAlIX,qBAqIE,WACE+C,KAAKwoB,kBAtIT,4FA0IE,WAA4Bla,EAAYoa,GAAxC,qFACM,qBAAQA,KAAQ,qBAAQpa,GAD9B,qDAMM,qBAAQA,EAAGoa,GANjB,iEAUQ,GAAIH,WAAWvoB,KAAKmnB,iBAAmB7Y,GAV/C,uBAWQtO,KAAKwoB,gBAXb,gDA1IF,iEAA4C,cAE1C,iBADC,gBAAKxS,U,6BAGN,iBADC,mB,+BA8HD,iBADC,gBAAK,U,2BAGL,MAOD,iBADC,gBAAM,eAAgB,CAAClE,MAAM,K,qCAa7B,MAtJkB,GAAc,iBAhBlC,gBAAU,CACTE,SAAU,kBACL,eAAW,CACZ,mBAGJC,QAAS,iCACJ,eAAa,CACd,eACA,mBAEC,eAAW,CACZ,wBAIe,QCqBjBlY,GDrBiB,MEnMsY,M,sCCQvZ,GAAY,gBACd,GACA,GACA,IACA,EACA,KACA,WACA,MAIa,MAAiB,QAuBhC,KAAkB,GAAW,CAAC6U,QAAA,KAAKC,SAAA,KAAME,UAAA,QAAUC,WAAA,QAAWmD,aAAA,KAAUlD,WAAA,KAAQoK,YAAA,KAAS7G,SAAA,KAAMC,SAAA,KAAMkB,MAAA,QAAMF,aAAA,KAAU0P,mBAAA,KAAgBzP,iBAAAC,GAAA,KAAiBgV,kBAAA,KAAe9U,eAAAF,GAAA,KAAewL,qBAAA,KAAkByJ,WAAA,KAAQ1Z,WAAA,KAAQC,cAAA,OF2OtN,IAAqB,GAArB,2G,0BAIE,EAAAoX,QAA0B,KAC1B,EAAAN,WAA4B,KAC5B,EAAAW,cAAmC,KACnC,EAAAN,iBAAkB,EAPpB,8CAcE,WACE,OAAKtmB,KAAKumB,QAIHvmB,KAAK6oB,aAAa7oB,KAAKumB,SAHrB,KAhBb,sBAqBE,WACE,IAAKvmB,KAAKimB,WACR,OAAO,KAGT,IAAMvW,EAAO,iBAAI1P,KAAKumB,QAASvmB,KAAKimB,YACpC,OAAKvW,GAKD,QAASA,EACJA,EAJA,OA7Bb,wBAwCE,WACE,OAAK1P,KAAKimB,WAIH,oBAAOjmB,KAAKimB,YAAap6B,KAAI,SAAAL,GAClC,OAAOA,EAAEotB,QAAQ,MAAQ,KAAMA,QAAQ,OAAQ,SAC9CjX,KAAK,MALC,OA1Cb,0BAkDE,SAAamlB,GACX,OAAO,oBAAOA,GAAU,SAACgC,GAAD,OAAQ,IAAIjf,KAAKif,EAAGj5B,MAAQ,MAAIk5B,YAnD5D,2BAsDE,SAAc5R,GACZ,IAAMzH,EAAOyH,EAAIzH,KAAKA,KACtB,OAAOA,GAAQA,EAAKsZ,YAxDxB,wBA2DE,SAAW7R,GACT,IAAMzH,EAAOyH,EAAIzH,KAAKA,KACtB,OAAIA,EACEA,EAAKsZ,UACA,cACEtZ,EAAKuZ,SACP,YAGF,UAGF9R,EAAIqH,KAAO,kBAAoB,eAvE1C,0BA0EE,SAAa6J,EAAea,GAC1B,IAAM7/B,EAAc,GACpB,SAAS8/B,EAAUh+B,GACjB,IAAMi+B,EAAUj+B,EAAIytB,QAAQ,KAAM,QAAQA,QAAQ,IAAM,OACxD,kBAAYwQ,EAAZ,MAGF,cAA2B3gC,OAAOyY,QAAQmnB,GAA1C,eAAiD,CAA5C,8BAAOl9B,EAAP,KAAYN,EAAZ,KACGuX,EAAO8mB,EAAUA,EAASC,EAAUh+B,GAAQg+B,EAAUh+B,GAExD,QAASN,EACXxB,EAAOP,KAAK,CACVsZ,OACAhY,KAAMe,EACNukB,KAAM7kB,IAGRxB,EAAOP,KAAK,CACVsZ,OACAhY,KAAMe,EACNioB,SAAUpT,KAAK6oB,aAAah+B,EAAOuX,KAKzC,OAAO/Y,IAnGX,iFAsGE,oHACsB2W,KAAKtD,gBAAgB,CACvCzG,KAAM,EAAG,uBACTsI,KAAMsO,GAAWgB,QAHrB,UACQT,EADR,OAMOA,EANP,wDAUEpN,KAAKhD,aAAa,CAChB/G,KAAM,EAAG,kBAXb,kBAeU,GAAIozB,WAAWjc,GAfzB,mEAiBIpN,KAAKhD,aAAa,CAChB/G,KAAM,KAAEqzB,SAAW,KAAEA,SAASthC,KAAO,KAAEmpB,UAlB7C,4CAsBQnR,KAAKia,UAtBb,QAwBEja,KAAK/C,gBAxBP,0DAtGF,6IAiIE,oHACsB+C,KAAKtD,gBAAgB,CACvCzG,KAAM,EAAG,QACTsI,KAAMsO,GAAWgB,MACjBhjB,MAAOmV,KAAKupB,eAJhB,UACQnc,EADR,OAOOA,EAPP,wDAWEpN,KAAKhD,aAAa,CAChB/G,KAAM,EAAG,kBAZb,kBAgBU,GAAIuzB,YAAYxpB,KAAKupB,aAAenc,GAhB9C,mEAkBIpN,KAAKhD,aAAa,CAChB/G,KAAM,KAAEqzB,SAAW,KAAEA,SAASthC,KAAO,KAAEmpB,UAnB7C,4CAuBQnR,KAAKia,UAvBb,QAyBEja,KAAK/C,gBAzBP,0DAjIF,6IA6JE,oHACwB+C,KAAKtD,gBAAgB,CACzCzG,KAAM,EAAG,2BACTsI,KAAMsO,GAAWe,WAHrB,UACQpY,EADR,OAMOA,EANP,wDAUEwK,KAAKhD,aAAa,CAChB/G,KAAM,EAAG,oBAXb,kBAeU,GAAIwzB,cAAczpB,KAAKupB,cAfjC,mEAiBIvpB,KAAKhD,aAAa,CAChB/G,KAAM,KAAEqzB,SAAW,KAAEA,SAASthC,KAAO,KAAEmpB,UAlB7C,4CAsBQnR,KAAKia,UAtBb,QAwBEja,KAAK/C,gBAxBP,0DA7JF,8IAwLE,8GACQ,GAAIysB,eAAe1pB,KAAKupB,cADhC,uBAEQvpB,KAAKia,UAFb,gDAxLF,gJA6LE,WAAuB9uB,EAAaN,GAApC,iGACQ,GAAIyW,eAAJ,kBACHnW,EAAMN,IAFX,2CA7LF,gJAmME,8GACuB,GAAI8+B,cAD3B,OACE3pB,KAAKumB,QADP,uDAnMF,sFAwME,SAAgBQ,GACd,OAAOA,EAAQ6C,aAzMnB,iCA6ME,WACE5pB,KAAK4mB,cAAgB,OA9MzB,qBAiNE,WACE7sB,GAAWiG,KAAKsL,SAAS6W,MAAMlzB,KAC/B+Q,KAAKwa,cAAcxa,KAAK6pB,cAAe,OAnN3C,yBAuNE,WACE,OAAO,MAxNX,GAAuC,IAErC,iBADC,gBAAK7T,U,6BAuMN,iBADC,mB,+BAGA,MAGD,iBADC,gBAAM,e,mCAGN,MAQD,iBADC,gBAAK,U,2BAGL,MAzNkB,GAAS,iBA3D7B,gBAAU,CACTpB,WAAY,CACVkV,eAAA,IAEF9X,SAAU,eAAS,CACjB,gBAEFC,QAAS,iCACJ,eAAW,CACZ,qBAEC,eAAa,CACd,eACA,mBAGJ2N,QAAS,CACP/vB,KADO,SACFoa,GACH,IAAKA,EACH,OAAO,KAGT,IAAM8f,EAAO/f,GAAUC,GACvB,OAAO,EAAG,yBAA0B,CAClCpa,KAAM2Z,GAAgBugB,GACtBxgB,SAAUK,GAAiBmgB,EAAM,CAAC3gB,QAAS,QAIjD8B,WAAY,CACVpI,KAAM,CACJknB,SADI,SACK7f,EAAIC,GACX,IAAM6f,EAAO9f,EAAyB+f,gBAEhCC,EAAUpwB,GAAW,oBAAsB,KAE3CqwB,EAAM,2FAAH,OAGLD,EAHK,sBAMTF,EAAII,KAAKC,mBAAmB,YAAaF,GACzCH,EAAInnB,KAAKynB,UAAYngB,EAAQvf,OAE/B2/B,OAfI,SAeGrgB,EAAIC,GACT,GAAIA,EAAQqgB,WAAargB,EAAQvf,MAAjC,CAIA,IAAMiY,EAAQqH,EAAyB+f,gBAAiBpnB,KACxDA,EAAKynB,UAAYngB,EAAQvf,MACzBiY,EAAK4nB,SAAS,CACZC,IAAK,WAMM,cGrRiY,MCQlZ,I,UAAY,gBACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,MAAiB,QAqBhC,KAAkB,GAAW,CAAC/b,QAAA,KAAKC,SAAA,KAAME,UAAA,QAAUC,WAAA,QAAWC,WAAA,KAAQoK,YAAA,KAAS5G,SAAA,KAAMkB,MAAA,QAAMF,aAAA,KAAU0P,mBAAA,KAAgBzP,iBAAAC,GAAA,KAAiBgV,kBAAA,KAAe9U,eAAAF,GAAA,KAAewL,qBAAA,KAAkBjQ,WAAA,KAAQkW,WAAA,KAAQhG,aAAA,OCxCtM,IAAI,GAAS,WAAa,IAAIxU,EAAI5K,KAAS6K,EAAGD,EAAIE,eAAmBC,EAAGH,EAAII,MAAMD,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACA,EAAG,WAAW,CAACM,MAAM,CAAC,MAAQT,EAAI/f,MAAM,WAAa,GAAG,WAAa,GAAG,WAAa,IAAIshB,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOxB,EAAI0a,MAAM,QAASlZ,MAAW,CAACrB,EAAG,SAAS,CAACA,EAAG,eAAe,CAACsB,YAAY,YAAY,CAACtB,EAAG,SAAS,CAACsB,YAAY,QAAQ,CAACzB,EAAIyC,GAAG,6BAA6BtC,EAAG,OAAO,CAACgC,SAAS,CAAC,YAAcnC,EAAIoC,GAAGpC,EAAI/O,GAAG,cAAckP,EAAG,YAAYA,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,IAAIc,GAAG,CAAC,MAAQvB,EAAIpO,cAAc,CAACuO,EAAG,SAAS,CAACH,EAAIyC,GAAG,gBAAgB,IAAI,GAAGtC,EAAG,cAAc,CAACA,EAAG,mBAAmB,CAACM,MAAM,CAAC,QAAUT,EAAIqM,SAAS9K,GAAG,CAAC,cAAgBvB,EAAIggB,cAAc,WAAahgB,EAAIigB,cAAc9f,EAAG,eAAe,CAACsB,YAAY,cAAchB,MAAM,CAAC,QAAUT,EAAIkgB,KAAKzqB,QAAQ,MAAQuK,EAAIkgB,KAAKC,YAAY,iBAAiB,GAAG,QAAUngB,EAAIqM,SAASxL,YAAYb,EAAIc,GAAG,CAAC,CAACvgB,IAAI,gBAAgBwgB,GAAG,SAASV,GACn5B,IAAIyE,EAAOzE,EAAIyE,KACf,MAAO,CAAC3E,EAAG,IAAI,CAACM,MAAM,CAAC,KAAOqE,EAAKsb,UAAU,OAAS,UAAUje,SAAS,CAAC,YAAcnC,EAAIoC,GAAG0C,EAAKub,gBAAgB,CAAC9/B,IAAI,gBAAgBwgB,GAAG,SAASV,GACrJ,IAAIyE,EAAOzE,EAAIyE,KACf,MAAO,CAAC9E,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAIyM,GAAG,aAAPzM,CAAqB8E,EAAKwb,WAAW,QAAQ,CAAC//B,IAAI,eAAewgB,GAAG,SAASV,GACvG,IAAIyE,EAAOzE,EAAIyE,KACf,MAAO,CAAC3E,EAAG,SAAS,CAACoB,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOxB,EAAIoc,gBAAgBtX,MAAS,CAAC9E,EAAIyC,GAAG,sBAAsB,MAAK,MAAS,GAAGtC,EAAG,iBAAiB,CAACA,EAAG,QAAQ,CAACoB,GAAG,CAAC,MAAQvB,EAAIpH,oBAAoB,CAACuH,EAAG,SAAS,CAACH,EAAIyC,GAAG,aAAazC,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAI/O,GAAG,mBAAmB,MAAM,IAAI,IAAI,IAAI,GAAGkP,EAAG,kBAAkB,IAC9T,GAAkB,GCPlB,I,oBAAS,WAAa,IAAIH,EAAI5K,KAAS6K,EAAGD,EAAIE,eAAmBC,EAAGH,EAAII,MAAMD,IAAIF,EAAG,OAAOE,EAAG,SAAS,CAACE,IAAI,OAAOY,MAAM,CAAChhB,MAAO+f,EAAIugB,WAAgB,MAAEruB,SAAS,SAAUgP,GAAMlB,EAAIsB,KAAKtB,EAAIugB,WAAY,QAASrf,IAAMV,WAAW,qBAAqB,CAACL,EAAG,cAAc,CAACM,MAAM,CAAC,MAAQ,KAAK,CAACN,EAAG,QAAQ,CAACA,EAAG,QAAQ,CAACsB,YAAY,4BAA4B,CAACtB,EAAG,eAAe,CAACM,MAAM,CAAC,qBAAqB,cAAc,MAAQT,EAAI/O,GAAG,UAAU,MAAQ,CAAC,SAAUyS,GAAK,QAASA,GAAK1D,EAAI/O,GAAG,uBAAwB,CAAE6T,KAAM9E,EAAI/O,GAAG,aAAgB,UAAY,IAAIsQ,GAAG,CAAC,SAAW,SAASC,GAAQ,OAAIA,EAAO7N,KAAKwW,QAAQ,QAAQnK,EAAIoK,GAAG5I,EAAO6I,QAAQ,QAAQ,GAAG7I,EAAOjhB,IAAI,SAAkB,KAAcyf,EAAIiG,MAAMua,aAAa3Z,MAAMtoB,MAAM,KAAM+rB,aAAarJ,MAAM,CAAChhB,MAAO+f,EAAIugB,WAAkB,QAAEruB,SAAS,SAAUgP,GAAMlB,EAAIsB,KAAKtB,EAAIugB,WAAY,UAAWrf,IAAMV,WAAW,wBAAwBL,EAAG,QAAQ,CAACE,IAAI,eAAeI,MAAM,CAAC,UAAYT,EAAIugB,WAAW1b,MAAM,MAAQ7E,EAAIqM,QAAU,UAAY,WAAW9K,GAAG,CAAC,MAAQ,SAASC,GAAQxB,EAAIqM,QAAUrM,EAAIigB,aAAejgB,EAAIggB,mBAAmB,CAAChgB,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAIqM,QAAUrM,EAAI/O,GAAG,QAAU+O,EAAI/O,GAAG,WAAW,QAAQ,GAAGkP,EAAG,QAAQ,CAACsB,YAAY,gBAAgB,CAACtB,EAAG,QAAQ,CAACsB,YAAY,MAAMhB,MAAM,CAAC,aAAgCrH,IAAtB4G,EAAIvH,cAA4B,SAAiC,OAAtBuH,EAAIvH,cAAuB,KAAO,UAAU8I,GAAG,CAAC,MAAQ,SAASC,GAAQxB,EAAIygB,qBAAsB,KAAQ,CAACzgB,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAI/O,GAAG,SAAU,IAAI,OAASmE,KAAKsL,SAASC,WAAW+f,OAAgxB1gB,EAAIqB,KAA5wBlB,EAAG,WAAW,CAACM,MAAM,CAAC,YAAY,SAASQ,MAAM,CAAChhB,MAAO+f,EAAuB,oBAAE9N,SAAS,SAAUgP,GAAMlB,EAAIygB,oBAAoBvf,GAAKV,WAAW,wBAAwB,CAACL,EAAG,SAAS,CAACA,EAAG,eAAe,CAACH,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAI/O,GAAG,SAAU,IAAI,IAAI+O,EAAIoC,GAAGpC,EAAI/O,GAAG,UAAU,KAAKkP,EAAG,YAAYA,EAAG,QAAQ,CAACM,MAAM,CAAC,MAAQ,GAAG,MAAQT,EAAIugB,WAAWpoB,QAAQva,OAAS,EAAI,UAAY,IAAI2jB,GAAG,CAAC,MAAQvB,EAAI2gB,kBAAkB,CAAC3gB,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAI/O,GAAG,QAAQ,QAAQ,GAAGkP,EAAG,aAAaA,EAAG,cAAcH,EAAI0C,GAAI1C,EAAoB,kBAAE,SAAS7a,EAAO5E,GAAK,OAAO4f,EAAG,aAAa,CAAC5f,IAAIA,EAAIkgB,MAAM,CAAC,MAAQtb,EAAOy7B,SAAS,MAAQz7B,GAAQ8b,MAAM,CAAChhB,MAAO+f,EAAIugB,WAAkB,QAAEruB,SAAS,SAAUgP,GAAMlB,EAAIsB,KAAKtB,EAAIugB,WAAY,UAAWrf,IAAMV,WAAW,2BAA0B,IAAI,IAAI,GAAapL,KAAKsL,SAASC,WAAiB,OAAER,EAAG,iBAAiB,CAACM,MAAM,CAAC,WAAa,GAAG,MAAQ,IAAIQ,MAAM,CAAChhB,MAAO+f,EAAuB,oBAAE9N,SAAS,SAAUgP,GAAMlB,EAAIygB,oBAAoBvf,GAAKV,WAAW,wBAAwB,CAACL,EAAG,UAAU,CAACsB,YAAY,eAAe,CAACtB,EAAG,SAAS,CAACA,EAAG,eAAe,CAACH,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAI/O,GAAG,SAAU,IAAI,IAAI+O,EAAIoC,GAAGpC,EAAI/O,GAAG,UAAU,KAAKkP,EAAG,YAAYA,EAAG,QAAQ,CAACM,MAAM,CAAC,MAAQ,GAAG,MAAQT,EAAIugB,WAAWpoB,QAAQva,OAAS,EAAI,UAAY,IAAI2jB,GAAG,CAAC,MAAQvB,EAAI2gB,kBAAkB,CAAC3gB,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAI/O,GAAG,QAAQ,QAAQ,GAAGkP,EAAG,aAAaA,EAAG,cAAcH,EAAI0C,GAAI1C,EAAoB,kBAAE,SAAS7a,EAAO5E,GAAK,OAAO4f,EAAG,aAAa,CAAC5f,IAAIA,EAAIkgB,MAAM,CAAC,MAAQtb,EAAOy7B,SAAS,MAAQz7B,GAAQ8b,MAAM,CAAChhB,MAAO+f,EAAIugB,WAAkB,QAAEruB,SAAS,SAAUgP,GAAMlB,EAAIsB,KAAKtB,EAAIugB,WAAY,UAAWrf,IAAMV,WAAW,2BAA0B,IAAI,IAAI,IAAI,GAAGR,EAAIqB,MAAM,GAAGlB,EAAG,QAAQ,CAACM,MAAM,CAAC,aAAa,WAAW,CAACN,EAAG,iBAAiB,CAACM,MAAM,CAAC,MAAQT,EAAI6gB,oBAAoB,YAAY,OAAO,aAAa,MAAM,MAAQ7gB,EAAI/O,GAAG,WAAY,IAAIgQ,MAAM,CAAChhB,MAAO+f,EAAIugB,WAAmB,SAAEruB,SAAS,SAAUgP,GAAMlB,EAAIsB,KAAKtB,EAAIugB,WAAY,WAAYrf,IAAMV,WAAW,0BAA0B,IAAI,IAAI,IAAI,KAC95G,GAAkB,GCuHhBsgB,GAAU,MAEVC,GAAyB,CAC7BxgC,IAAKugC,GACLthC,KAAM,EAAG,QAsBU,GAArB,2G,0BAKW,EAAA6sB,SAAmB,EAE5B,EAAAoU,qBAAsB,EAEtB,EAAAO,iBAAmC,GAEnC,EAAAT,WAAyB,CACvB1b,OAAO,EACPtgB,SAAUu8B,GACV/oB,QAAS,GACTI,QAAS,IAfb,0DAkBE,WAAuB,MACrB,OAAO/C,KAAKmrB,WAAWpoB,QAAQva,UAAxB,UAAmCwX,KAAK4rB,wBAAxC,aAAmC,EAAuBpjC,UAnBrE,+BAsBE,WACE,GAAIwX,KAAK6rB,oBACP,MAAO,CAACF,IAGV,IAAMtiC,EAAqB,CAACsiC,GAAc,CAAEG,SAAS,IAE/C5lB,EAAa,kBAAY,WAAZ,iBACdlG,KAAKmrB,WAAWpoB,QAAQlX,KAAI,SAAAL,GAAC,OAAIA,EAAEugC,yBACtClgC,KAAI,SAAA3B,GAAC,MAAK,CAAEiB,IAAKjB,EAAGE,KAAMF,MAG5B,OAFAb,EAAOP,KAAP,MAAAO,EAAM,eAAS6c,IAER7c,IAlCX,6BAqCE,WACE2W,KAAKmrB,WAAWpoB,QAAU/C,KAAK6rB,oBAAsB,GAAK7rB,KAAK4rB,iBAAiBhgC,UAtCpF,kCA0CE,SAAqBmX,GACdA,GAGH/C,KAAK4rB,iBAAmB5rB,KAAKqD,cAAczJ,QAAO,SAAAoyB,GAAC,OAAIA,EAAE3nB,WACzDrE,KAAKurB,mBAHLvrB,KAAK4rB,iBAAmB,KA5C9B,2BAoDE,WACE,GAAK5rB,KAAKmrB,WAAW1b,MAArB,CAIA,IAAM1M,EAAU/C,KAAK6rB,oBACjBH,GACA1rB,KAAKmrB,WAAWpoB,QAAQlX,KAAI,SAAAL,GAAC,OAAIA,EAAEpB,QAAMuX,KAAK,KAE5CwpB,EAAa1iC,OAAO6gB,OAAO,GAAItJ,KAAKmrB,WAAY,CACpDpoB,YAGF,OAAOooB,KAjEX,wBAqEE,cArEF,6BA0EE,WAAe,WACRnrB,KAAKyrB,oBAAoB9a,MAAK,SAAAzmB,GAAC,OAAIA,EAAEiB,MAAQ,EAAKggC,WAAWh8B,cAChE6Q,KAAKmrB,WAAWh8B,SAAWu8B,QA5EjC,GAA8C,cAK5C,iBADC,gBAAK1V,U,+BAsCN,iBADC,gBAAM,kB,oCAQN,MAGD,iBADC,gBAAK,kB,6BAeL,MAGD,iBADC,gBAAK,e,0BAGL,MAGD,iBADC,gBAAM,uB,+BAKN,MA9EkB,GAAgB,iBAPpC,gBAAU,CACThE,SAAU,kBACL,eAAW,CACZ3O,cAAe,yBAIA,cClJ0Z,M,mDCQ3a,GAAY,gBACd,GACA,GACA,IACA,EACA,KACA,WACA,MAIa,MAAiB,QAoBhC,KAAkB,GAAW,CAAC4oB,iBAAA,KAAcC,gBAAA,KAAatd,QAAA,KAAKC,SAAA,KAAME,UAAA,QAAUC,WAAA,QAAWmD,aAAA,KAAUC,QAAA,KAAKE,cAAA,KAAWrD,WAAA,KAAQoK,YAAA,KAAS7G,SAAA,KAAME,QAAA,KAAKyZ,UAAA,KAAOjd,WAAA,KAAQC,cAAA,OCvC9J,IAAI,GAAS,WAAa,IAAIvE,EAAI5K,KAAS6K,EAAGD,EAAIE,eAAmBC,EAAGH,EAAII,MAAMD,IAAIF,EAAG,OAAOE,EAAG,WAAW,CAACM,MAAM,CAAC,YAAY,QAAQ,WAAa,IAAIQ,MAAM,CAAChhB,MAAO+f,EAAIwhB,kBAAqC,oBAAEtvB,SAAS,SAAUgP,GAAMlB,EAAIsB,KAAKtB,EAAIwhB,kBAAmB,sBAAuBtgB,IAAMV,WAAW,0CAA0C,CAACL,EAAG,SAAS,CAACA,EAAG,eAAe,CAACA,EAAG,SAAS,CAACH,EAAIyC,GAAG,mBAAmBzC,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAI/O,GAAG,mBAAmB,MAAM,GAAGkP,EAAG,cAAcH,EAAI0C,GAAI1C,EAAIwhB,kBAA+B,eAAE,SAASr8B,EAAO5E,GAAK,OAAO4f,EAAG,WAAW,CAAC5f,IAAIA,EAAIkgB,MAAM,CAAC,cAActb,EAAOsU,QAAQ,MAAQtU,EAAOy7B,UAAUrf,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAI1G,yBAAyBnU,UAAc,GAAGgb,EAAG,iBAAiB,CAACA,EAAG,QAAQ,CAACM,MAAM,CAAC,MAAQ,WAAWc,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOxB,EAAIyhB,mBAAmB,CAACzhB,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAI/O,GAAG,mBAAmB,QAAQ,IAAI,IAAI,IAC54B,GAAkB,GCgDD,GAArB,4LAKE,SAAyB9L,GACvBiQ,KAAKssB,+BAA+Bv8B,KANxC,2BASE,WACEiQ,KAAKuE,2BAVT,GAA4C,cAAvB,GAAc,iBAblC,gBAAU,CACTyN,SAAU,kBACL,eAAS,CACVoa,kBAAmB,kBAGvBna,QAAS,kBACJ,eAAW,CACZqa,+BAAgC,2BAChC/nB,qBAAsB,6BAIP,cCjDwZ,MCOza,GAAY,gBACd,GACA,GACA,IACA,EACA,KACA,KACA,MAIa,MAAiB,QAYhC,KAAkB,GAAW,CAACqK,QAAA,KAAKC,SAAA,KAAMC,aAAA,QAAaC,UAAA,QAAUC,WAAA,QAAWC,WAAA,KAAQwD,SAAA,KAAM2S,WAAA,OCiEzF,IAAqB,GAArB,2G,0BACU,EAAAmH,UAAY,EAKpB,EAAAzB,KAAmB,CACjBC,YAAa,GACb3tB,aAAc,CACZ4tB,UAAW,GACXC,SAAU,GACVC,SAAU,EACVsB,QAAS,GACTC,WAAY,EACZC,UAAW,EACXC,QAAS,IAEXtsB,QAAS,CACP,CAAEpK,KAAM,EAAG,QAASpL,MAAO,YAC3B,CAAEoL,KAAM,EAAG,QAASpL,MAAO,YAC3B,CAAEoL,KAAM,EAAG,SAAUpL,MAAO,aAC5B,CAAEoL,KAAM,EAAG,SAAUpL,MAAO,cAC5B,CAAEoL,KAAM,EAAG,iBAAkBpL,MAAO,WACpC,CAAEoL,KAAM,EAAG,SAAU,GAAIpL,MAAO,UAAW+hC,UAAU,KAIzD,EAAA3V,SAAU,EA3BZ,gDAmCE,WACEjX,KAAK6sB,sBApCT,sFAuCE,WAAsBnd,GAAtB,iFACE1P,KAAKzC,oBAAoB,CACvBH,aAAc,CACZpJ,MAAO0b,EAAKub,SACZ7rB,IAAKsQ,EAAK8c,WAGdxsB,KAAK3C,cAPP,gDAvCF,2IAiDE,qGACE2C,KAAKka,aADP,SAEQla,KAAK8sB,YAAY9sB,KAAKusB,WAF9B,OAGEvsB,KAAKiX,SAAU,EAHjB,gDAjDF,kFAwDE,WACE,OAAO,IAzDX,oFA4DE,WAAoBkU,GAApB,8FACEnrB,KAAK8qB,KAAKC,YAAc,GACxB/qB,KAAKiX,SAAU,EAFjB,kBAK2BjX,KAAK+sB,aAAa5B,GAL7C,OAKU7B,EALV,OAMItpB,KAAKusB,UAAYjD,EAASt9B,GAE1BgU,KAAKwa,cAAcxa,KAAKgtB,KAAK1D,EAASt9B,KAR1C,+GA5DF,6IA0EU,WAAmBm/B,GAAnB,uGACe,GAAI8B,YACvB9B,EAAWxoB,QACXwoB,EAAWpoB,QACXooB,EAAWh8B,UAJP,cACA9F,EADA,yBAOCA,GAPD,2CA1EV,4IAoFU,WAAkB2C,GAAlB,iGACA,GAAI6+B,WAAW7+B,GADf,OAENgU,KAAKusB,UAAY,EAFX,gDApFV,4EA4FU,SAAKW,GAAkB,WAC7B,+CAAO,wHACkB,GAAIC,iBAAiBD,GADvC,cACC5D,EADD,OAEC8D,EAAgC,YAApB9D,EAASh7B,OAErBmwB,EAAQ,EAAKqM,KAAKC,YACxBtM,EAAM/0B,OAAN,MAAA+0B,EAAK,CAAQA,EAAMj2B,OAAQ,GAAtB,sBAA4B8gC,EAAS+D,QAAQzhC,MAAM6yB,EAAMj2B,WAE1D4kC,IACF,EAAKnW,SAAU,GARZ,kBAWEmW,GAXF,+CA7FX,GAA0C,IAIxC,iBADC,gBAAKpX,U,6BAqDN,iBADC,gBAAK,U,2BAGL,MA1DkB,GAAY,iBAlBhC,gBAAU,CACTpB,WAAY,CACV0Y,iBAAA,GACAC,cAAA,IAEFvb,SAAU,kBACL,eAAW,CACZ/L,cAAe,gBACf5V,YAAa,iBAGjB4hB,QAAS,iCACJ,eAAa,CAAC,cAAe,cAAe,sBAAuB,uBACnE,eAAW,CACZ4a,kBAAmB,2BAIJ,cC/FsZ,MCQva,I,UAAY,gBACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,MAAiB,QAahC,KAAkB,GAAW,CAACje,QAAA,KAAKC,SAAA,KAAMC,aAAA,QAAaC,UAAA,QAAUC,WAAA,QAAWgR,cAAA,KAAW/Q,WAAA,KAAQwD,SAAA,KAAMvD,WAAA,OChCpG,IAAI,GAAS,WAAa,IAAItE,EAAI5K,KAAS6K,EAAGD,EAAIE,eAAmBC,EAAGH,EAAII,MAAMD,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACA,EAAG,WAAW,CAACM,MAAM,CAAC,MAAQT,EAAI/f,MAAM,WAAa,GAAG,WAAa,GAAG,YAAY,SAASshB,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOxB,EAAI0a,MAAM,QAASlZ,MAAW,CAACrB,EAAG,SAAS,CAACA,EAAG,eAAe,CAACsB,YAAY,YAAY,CAACtB,EAAG,SAAS,CAACsB,YAAY,QAAQ,CAACzB,EAAIyC,GAAG,aAAatC,EAAG,OAAO,CAACgC,SAAS,CAAC,YAAcnC,EAAIoC,GAAGpC,EAAI/O,GAAG,gBAAgBkP,EAAG,YAAYA,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,IAAIc,GAAG,CAAC,MAAQvB,EAAIpO,cAAc,CAACuO,EAAG,SAAS,CAACH,EAAIyC,GAAG,gBAAgB,IAAI,GAAGtC,EAAG,cAAc,CAACA,EAAG,SAAS,CAACc,MAAM,CAAChhB,MAAO+f,EAAO,IAAE9N,SAAS,SAAUgP,GAAMlB,EAAIkP,IAAIhO,GAAKV,WAAW,QAAQR,EAAI0C,GAAI1C,EAAW,SAAE,SAAS8E,GAAM,OAAO3E,EAAG,QAAQ,CAAC5f,IAAIukB,GAAM,CAAC9E,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAI/O,GAAG,eAAiB6T,IAAO,UAAS,GAAG3E,EAAG,oBAAoB,CAACA,EAAG,UAAU,CAACG,WAAW,CAAC,CAAC9gB,KAAK,OAAO+gB,QAAQ,SAAStgB,MAAO+f,EAAqB,kBAAEQ,WAAW,sBAAsBC,MAAM,CAAC,MAAQ,GAAG,KAAO,GAAG,KAAO,YAAY,CAACT,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAI/O,GAAG,+BAA+B,QAAQ,GAAGkP,EAAG,eAAe,CAACc,MAAM,CAAChhB,MAAO+f,EAAO,IAAE9N,SAAS,SAAUgP,GAAMlB,EAAIkP,IAAIhO,GAAKV,WAAW,QAAQ,CAACL,EAAG,aAAa,CAAC5f,IAAI,aAAa,CAAC4f,EAAG,sBAAsB,GAAGA,EAAG,aAAa,CAAC5f,IAAI,SAAS,CAAC4f,EAAG,mBAAmB,GAAGA,EAAG,aAAa,CAAC5f,IAAI,OAAO,CAAC4f,EAAG,iBAAiB,GAAGA,EAAG,aAAa,CAAC5f,IAAI,SAAS,CAAC4f,EAAG,qBAAqB,IAAI,IAAI,IAAI,IAAI,IAAI,IACv3C,GAAkB,GCDlB,GAAS,WAAa,IAAIH,EAAI5K,KAAS6K,EAAGD,EAAIE,eAAmBC,EAAGH,EAAII,MAAMD,IAAIF,EAAG,OAAOE,EAAG,cAAc,CAACA,EAAG,KAAK,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAGpC,EAAI/O,GAAG,kCAAkCkP,EAAG,aAAaA,EAAG,cAAc,CAACsB,YAAY,OAAOhB,MAAM,CAAC,MAAQ,KAAK,CAACN,EAAG,WAAW,CAACM,MAAM,CAAC,cAAcT,EAAIva,YAAYI,yBAAyB,MAAQma,EAAI/O,GAAG,yCAAyCsQ,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAI4iB,eAAe,4BAA6B5iB,EAAIva,YAAYI,8BAA8Bsa,EAAG,WAAW,CAACM,MAAM,CAAC,cAAcT,EAAIva,YAAYK,qBAAqB,MAAQka,EAAI/O,GAAG,qCAAqCsQ,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAI4iB,eAAe,wBAAyB5iB,EAAIva,YAAYK,0BAA0Bqa,EAAG,WAAW,CAACM,MAAM,CAAC,cAAcT,EAAIva,YAAYM,iBAAiB,MAAQia,EAAI/O,GAAG,iCAAiCsQ,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAI4iB,eAAe,oBAAqB5iB,EAAIva,YAAYM,uBAAuB,GAAGoa,EAAG,aAAaA,EAAG,cAAc,CAACsB,YAAY,OAAOhB,MAAM,CAAC,MAAQ,KAAK,CAACN,EAAG,WAAW,CAACM,MAAM,CAAC,cAAcT,EAAIva,YAAYO,gBAAgB,MAAQga,EAAI/O,GAAG,gCAAgCsQ,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAI4iB,eAAe,mBAAoB5iB,EAAIva,YAAYO,qBAAqBma,EAAG,WAAW,CAACM,MAAM,CAAC,cAAcT,EAAIva,YAAYQ,qBAAqB,MAAQ+Z,EAAI/O,GAAG,qCAAqCsQ,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAI4iB,eAAe,wBAAyB5iB,EAAIva,YAAYQ,2BAA2B,GAAGka,EAAG,KAAK,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAGpC,EAAI/O,GAAG,qCAAqCkP,EAAG,aAAaA,EAAG,cAAc,CAACsB,YAAY,OAAOhB,MAAM,CAAC,MAAQ,KAAK,CAACN,EAAG,iBAAiB,CAACM,MAAM,CAAC,WAAW,qBAAqB,CAACN,EAAG,WAAW,CAACM,MAAM,CAAC,MAAQT,EAAI6iB,YAAY,MAAQ7iB,EAAIva,YAAYU,iBAAmB6Z,EAAI6iB,YAAY,GAAK7iB,EAAI6iB,YAAY,IAAIthB,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAI4iB,eAAe,mBAAoBphB,GAAUxB,EAAI6iB,YAAY,SAAS,GAAG1iB,EAAG,iBAAiB,CAACM,MAAM,CAAC,WAAW,gCAAgC,CAACN,EAAG,WAAW,CAACM,MAAM,CAAC,MAAQT,EAAI8iB,cAAc,MAAQ9iB,EAAIva,YAAYa,6BAA+B0Z,EAAI8iB,cAAc,GAAK9iB,EAAI8iB,cAAc,IAAIvhB,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAI4iB,eAAe,8BAA+BphB,GAAUxB,EAAI8iB,cAAc,SAAS,GAAG3iB,EAAG,iBAAiB,CAACM,MAAM,CAAC,WAAW,kCAAkC,CAACN,EAAG,WAAW,CAACM,MAAM,CAAC,MAAQT,EAAI8iB,cAAc,MAAQ9iB,EAAIva,YAAYa,6BAA+B0Z,EAAI8iB,cAAc,GAAK9iB,EAAI8iB,cAAc,IAAIvhB,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAI4iB,eAAe,gCAAiCphB,GAAUxB,EAAI8iB,cAAc,SAAS,GAAG3iB,EAAG,iBAAiB,CAACM,MAAM,CAAC,WAAW,iCAAiC,CAACN,EAAG,WAAW,CAACM,MAAM,CAAC,MAAQT,EAAI8iB,cAAc,MAAQ9iB,EAAIva,YAAYa,6BAA+B0Z,EAAI8iB,cAAc,GAAK9iB,EAAI8iB,cAAc,IAAIvhB,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAI4iB,eAAe,+BAAgCphB,GAAUxB,EAAI8iB,cAAc,SAAS,GAAG3iB,EAAG,iBAAiB,CAACM,MAAM,CAAC,WAAW,cAAc,CAACN,EAAG,eAAe,CAACM,MAAM,CAAC,MAAQT,EAAIva,YAAYkB,UAAU,KAAO,IAAI4a,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAI4iB,eAAe,YAAaphB,QAAa,GAAGrB,EAAG,iBAAiB,CAACM,MAAM,CAAC,WAAW,aAAaI,YAAYb,EAAIc,GAAG,CAAC,CAACvgB,IAAI,SAASwgB,GAAG,WAAW,MAAO,CAACZ,EAAG,aAAa,CAACM,MAAM,CAAC,MAAQT,EAAIva,YAAYs9B,mBAAmBxhB,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAI4iB,eAAe,oBAAqBphB,SAAcR,OAAM,MAAS,CAACb,EAAG,eAAe,CAACM,MAAM,CAAC,UAAYT,EAAIva,YAAYs9B,kBAAkB,MAAQ/iB,EAAIva,YAAYmB,UAAU,KAAO,IAAI2a,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAI4iB,eAAe,YAAaphB,QAAa,GAAGrB,EAAG,iBAAiB,CAACM,MAAM,CAAC,WAAW,aAAa,iBAAiB,SAAS,CAACN,EAAG,eAAe,CAACM,MAAM,CAAC,MAAQT,EAAIva,YAAYoB,WAAW,KAAO,GAAG,UAAY,IAAI0a,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAI4iB,eAAe,aAAcphB,QAAa,GAAGrB,EAAG,iBAAiB,CAACM,MAAM,CAAC,WAAW,iBAAiB,iBAAiB,SAAS,CAACN,EAAG,eAAe,CAACM,MAAM,CAAC,MAAQT,EAAIva,YAAYqB,eAAe,KAAO,GAAG,UAAY,IAAIya,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAI4iB,eAAe,iBAAkBphB,QAAa,IAAI,IAAI,IAClqI,GAAkB,GCDlB,GAAS,WAAa,IAAIxB,EAAI5K,KAAS6K,EAAGD,EAAIE,eAAmBC,EAAGH,EAAII,MAAMD,IAAIF,EAAG,OAAOE,EAAG,QAAQ,CAACM,MAAM,CAAC,MAAQ,SAAS,MAAQ,KAAK,CAACN,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,MAAM,CAACN,EAAG,cAAc,CAACgC,SAAS,CAAC,YAAcnC,EAAIoC,GAAGpC,EAAI/O,GAAG,eAAiBmE,KAAK4tB,OAAOC,cAAc,GAAG9iB,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,MAAM,CAACT,EAAIsW,GAAG,YAAY,GAAItW,EAAIkjB,OAAa,OAAE/iB,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,SAAS,CAACT,EAAIsW,GAAG,WAAW,GAAGtW,EAAIqB,MAAM,IACna,GAAkB,GCwBD,GAArB,uIAA2C,cAEzC,iBADC,gBAAK/M,S,+BADa,GAAa,iBADjC,SACoB,cCzBuZ,MCOxa,GAAY,gBACd,GACA,GACA,IACA,EACA,KACA,KACA,MAIa,MAAiB,QAOhC,KAAkB,GAAW,CAACkT,QAAA,KAAKM,QAAA,KAAK2Q,cAAA,OCuHxC,IAAqB,GAArB,2G,0BAEE,EAAAqK,cAAgB,CAAC,EAAG,6CAA8C,EAAG,sCACrE,EAAAD,YAAc,CAAC,EAAG,yBAA0B,EAAG,4BAHjD,uDAOE,SAAeliC,EAAkBV,GAC/BmV,KAAKiH,yBAAL,kBAAgC1b,EAAWV,QAR/C,GAA8C,cAAzB,GAAgB,iBAfpC,gBAAU,CACT+pB,WAAY,CACVmZ,cAAA,IAEF/b,SAAU,kBACL,eAAW,CACZ3hB,YAAa,oBAGjB4hB,QAAS,kBACJ,eAAW,CACZhL,yBAA0B,iCAIX,cChJ0Z,MCQ3a,I,UAAY,gBACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,MAAiB,QAUhC,KAAkB,GAAW,CAACkL,aAAA,KAAUG,cAAA,KAAW+G,YAAA,KAASuP,WAAA,KAAQxD,WAAA,KAAQjW,cAAA,OC7B5E,IAAI,GAAS,WAAa,IAAIvE,EAAI5K,KAAS6K,EAAGD,EAAIE,eAAmBC,EAAGH,EAAII,MAAMD,IAAIF,EAAG,OAAOE,EAAG,cAAc,CAACA,EAAG,cAAc,CAACM,MAAM,CAAC,MAAQ,KAAK,CAACN,EAAG,cAAc,CAACA,EAAG,QAAQ,CAACM,MAAM,CAAC,QAAU,WAAW,CAACN,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,KAAK,GAAK,MAAM,CAACN,EAAG,KAAK,CAACH,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAI/O,GAAG,sCAAsCkP,EAAG,eAAe,CAACM,MAAM,CAAC,MAAQT,EAAI/O,GAAG,wBAAwB,YAAc+O,EAAIojB,YAAYpjB,EAAIva,YAAY2B,UAAU,KAAO,IAAIma,GAAG,CAAC,OAAS,SAASC,GAAQxB,EAAI4iB,eAAe,WAAY5iB,EAAIqjB,eAAe7hB,QAAarB,EAAG,eAAe,CAACM,MAAM,CAAC,MAAQT,EAAI/O,GAAG,wBAAwB,YAAc+O,EAAIojB,YAAYpjB,EAAIva,YAAY4B,UAAU,KAAO,IAAIka,GAAG,CAAC,OAAS,SAASC,GAAQxB,EAAI4iB,eAAe,WAAY5iB,EAAIqjB,eAAe7hB,SAAc,GAAGrB,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,KAAK,GAAK,MAAM,CAACN,EAAG,KAAK,CAACH,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAI/O,GAAG,yCAAyCkP,EAAG,eAAe,CAACM,MAAM,CAAC,KAAO,SAAS,MAAQT,EAAI/O,GAAG,wBAAwB,YAAc+O,EAAIojB,YAAYpjB,EAAIva,YAAY69B,cAAc,KAAO,IAAI/hB,GAAG,CAAC,OAAS,SAASC,GAAQxB,EAAI4iB,eAAe,eAAgB5iB,EAAIqjB,eAAe7hB,QAAarB,EAAG,eAAe,CAACM,MAAM,CAAC,KAAO,SAAS,MAAQT,EAAI/O,GAAG,wBAAwB,YAAc+O,EAAIojB,YAAYpjB,EAAIva,YAAY89B,cAAc,KAAO,IAAIhiB,GAAG,CAAC,OAAS,SAASC,GAAQxB,EAAI4iB,eAAe,eAAgB5iB,EAAIqjB,eAAe7hB,QAAarB,EAAG,aAAa,CAACM,MAAM,CAAC,MAAQT,EAAI/O,GAAG,8CAA8C,cAAc+O,EAAIva,YAAY+9B,mBAAmBjiB,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAI4iB,eAAe,oBAAqBphB,QAAa,IAAI,GAAIxB,EAAIva,YAA6B,kBAAE0a,EAAG,QAAQ,CAACsB,YAAY,kBAAkB,CAACtB,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,SAAS,CAACN,EAAG,gBAAgB,CAACM,MAAM,CAAC,MAAQT,EAAIva,YAAYg+B,mBAAqB,IAAMzjB,EAAIva,YAAYi+B,kBAAkB,MAAQ,kBAAkB,OAAS,OAAO,eAAe,WAAWniB,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOxB,EAAI2jB,oBAAoBniB,QAAa,GAAGrB,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,SAAS,CAACN,EAAG,gBAAgB,CAACM,MAAM,CAAC,MAAQT,EAAIva,YAAYm+B,iBAAmB,IAAM5jB,EAAIva,YAAYo+B,gBAAgB,MAAQ,kBAAkB,OAAS,QAAQtiB,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOxB,EAAI8jB,kBAAkBtiB,QAAa,IAAI,GAAGxB,EAAIqB,MAAM,IAAI,GAAGlB,EAAG,cAAc,CAACsB,YAAY,OAAOhB,MAAM,CAAC,MAAQ,KAAK,CAACN,EAAG,WAAW,CAACM,MAAM,CAAC,cAAcT,EAAIva,YAAYiC,eAAe,MAAQsY,EAAI/O,GAAG,+BAA+BsQ,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAI4iB,eAAe,kBAAmB5iB,EAAIva,YAAYiC,oBAAoByY,EAAG,WAAW,CAACM,MAAM,CAAC,cAAcT,EAAIva,YAAYkC,mBAAmB,MAAQqY,EAAI/O,GAAG,mCAAmCsQ,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAI4iB,eAAe,sBAAuB5iB,EAAIva,YAAYkC,wBAAwBwY,EAAG,WAAW,CAACM,MAAM,CAAC,cAAcT,EAAIva,YAAYmC,gBAAgB,MAAQoY,EAAI/O,GAAG,gCAAgCsQ,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAI4iB,eAAe,mBAAoB5iB,EAAIva,YAAYmC,sBAAsB,IAAI,IACx9F,GAAkB,GC8HD,GAArB,kLAKE,SAAejH,EAAkBV,GAC/BmV,KAAKiH,yBAAL,kBAAgC1b,EAAWV,MAN/C,iCASE,SAAoB8jC,GAClB,IAAMC,EAAUD,EAAM5yB,MAAM,KAC5BiE,KAAKiH,yBAAyB,CAAC,mBAAsB2nB,EAAQ,GAAI,kBAAqBA,EAAQ,OAXlG,+BAcE,SAAkBD,GAChB,IAAMC,EAAUD,EAAM5yB,MAAM,KAC5BiE,KAAKiH,yBAAyB,CAAC,iBAAoB2nB,EAAQ,GAAI,gBAAmBA,EAAQ,SAhB9F,GAA2C,cAAtB,GAAa,iBAnBjC,gBAAU,CACTha,WAAY,GACZ5C,SAAU,kBACL,eAAW,CACZ3hB,YAAa,oBAGjB4hB,QAAS,iCACJ,eAAW,CACZhL,yBAA0B,8BAFvB,IAIL+mB,YAJO,SAIKnjC,GACV,OAAQA,EAAQ,MAAMwU,YAExB4uB,eAPO,SAOQpjC,GACb,OAAe,KAARA,QAIQ,cC/HuZ,M,yBCQxa,GAAY,gBACd,GACA,GACA,IACA,EACA,KACA,WACA,MAIa,MAAiB,QAWhC,KAAkB,GAAW,CAACsnB,aAAA,KAAUC,QAAA,KAAKE,cAAA,KAAWI,QAAA,KAAK0S,WAAA,KAAQjW,cAAA,KAAW0f,eAAA,OC9BhF,IAAI,GAAS,WAAa,IAAIjkB,EAAI5K,KAAS6K,EAAGD,EAAIE,eAAmBC,EAAGH,EAAII,MAAMD,IAAIF,EAAG,OAAOE,EAAG,cAAc,CAACA,EAAG,KAAK,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAGpC,EAAI/O,GAAG,qCAAqC,OAAOkP,EAAG,aAAaA,EAAG,QAAQ,CAACM,MAAM,CAAC,MAAQ,GAAG,MAAQ,WAAW,CAACN,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,MAAM,CAACN,EAAG,cAAc,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAGpC,EAAI/O,GAAG,yCAAyC,GAAGkP,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,MAAM,CAACN,EAAG,eAAe,CAACM,MAAM,CAAC,MAAQT,EAAI1P,OAAOzB,eAAe,KAAO,SAAS,KAAO,IAAI0S,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAI9P,aAAa,CAAC3P,IAAK,iBAAkBN,MAAOuhB,SAAc,IAAI,GAAGrB,EAAG,QAAQ,CAACM,MAAM,CAAC,MAAQ,GAAG,MAAQ,WAAW,CAACN,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,MAAM,CAACN,EAAG,cAAc,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAGpC,EAAI/O,GAAG,+BAA+B,GAAGkP,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,MAAM,CAACN,EAAG,eAAe,CAACM,MAAM,CAAC,MAAQT,EAAIva,YAAYy+B,eAAe,KAAO,IAAI3iB,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAI4iB,eAAe,iBAAkBphB,QAAa,GAAGrB,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,MAAM,CAACN,EAAG,cAAc,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAGpC,EAAI/O,GAAG,4BAA4B,GAAGkP,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,MAAM,CAACN,EAAG,eAAe,CAACM,MAAM,CAAC,MAAQT,EAAIva,YAAY0+B,YAAY,KAAO,IAAI5iB,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAI4iB,eAAe,cAAephB,QAAa,IAAI,GAAGrB,EAAG,QAAQ,CAACM,MAAM,CAAC,MAAQ,KAAK,CAACN,EAAG,QAAQ,CAACA,EAAG,aAAa,CAACM,MAAM,CAAC,MAAQT,EAAI/O,GAAG,sCAAsC,cAAc+O,EAAI1P,OAAOlB,qBAAqBmS,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAIokB,uBAAuB5iB,QAAa,IAAI,GAAGrB,EAAG,KAAK,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAGpC,EAAI/O,GAAG,kCAAkCkP,EAAG,aAAaA,EAAG,iBAAiB,CAACM,MAAM,CAAC,WAAW,oBAAoB,CAACN,EAAG,eAAe,CAACM,MAAM,CAAC,MAAQT,EAAIva,YAAYiD,gBAAgB,KAAO,IAAI6Y,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAI4iB,eAAe,kBAAmBphB,QAAa,GAAGrB,EAAG,iBAAiB,CAACM,MAAM,CAAC,WAAW,oBAAoB,CAACN,EAAG,eAAe,CAACM,MAAM,CAAC,MAAQT,EAAIva,YAAYkD,gBAAgB,YAAcqX,EAAI/O,GAAG,4BAA4B,KAAO,IAAIsQ,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAI4iB,eAAe,kBAAmBphB,QAAa,GAAGrB,EAAG,QAAQ,CAACM,MAAM,CAAC,MAAQ,KAAK,CAACN,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,SAAS,CAACT,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAI/O,GAAG,2CAA2C,OAAOkP,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,MAAM,CAACN,EAAG,eAAe,CAACM,MAAM,CAAC,MAAQT,EAAIva,YAAYsD,2BAA2B,KAAO,IAAIwY,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAI4iB,eAAe,6BAA8BphB,QAAa,GAAGrB,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,SAAS,CAACT,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAI/O,GAAG,oCAAoC,OAAOkP,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,MAAM,CAACN,EAAG,eAAe,CAACM,MAAM,CAAC,MAAQT,EAAIva,YAAYuD,oBAAoB,KAAO,IAAIuY,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAI4iB,eAAe,sBAAuBphB,QAAa,GAAGrB,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,SAAS,CAACT,EAAIyC,GAAG,IAAIzC,EAAIoC,GAAGpC,EAAI/O,GAAG,+BAA+B,QAAQ,GAAGkP,EAAG,QAAQ,CAACM,MAAM,CAAC,MAAQ,KAAK,CAACN,EAAG,QAAQ,CAACA,EAAG,aAAa,CAACM,MAAM,CAAC,cAAcT,EAAIva,YAAY4+B,qCAAqC,MAAQrkB,EAAI/O,GAAG,6CAA6CsQ,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAI4iB,eAAe,uCAAwCphB,QAAa,GAAGrB,EAAG,QAAQ,CAACA,EAAG,aAAa,CAACM,MAAM,CAAC,cAAcT,EAAIva,YAAYmD,kBAAkB,MAAQoX,EAAI/O,GAAG,kCAAkCsQ,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAI4iB,eAAe,oBAAqBphB,QAAa,IAAI,GAAGrB,EAAG,QAAQ,CAACM,MAAM,CAAC,MAAQ,KAAK,CAACN,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,MAAM,CAACN,EAAG,aAAa,CAACM,MAAM,CAAC,MAAQT,EAAIva,YAAYoD,6BAA6B,KAAO,IAAI0Y,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAI4iB,eAAe,+BAAgCphB,QAAa,IAAI,IAAI,IACplH,GAAkB,GCqJD,GAArB,kLAOE,SAAe7gB,EAAkBV,GAC/BmV,KAAKiH,yBAAL,kBAAgC1b,EAAWV,MAR/C,oCAWE,SAAuB8jC,GACrB3uB,KAAKlF,aAAa,CAChB3P,IAAK,sBACLN,MAAO8jC,IAELA,IACFjiB,SAAS1Y,MAAQ,0BAjBvB,GAA2C,cAAtB,GAAa,iBAjBjC,gBAAU,CACT4gB,WAAY,CAACmZ,cAAA,IACb/b,SAAU,kBACL,eAAW,CACZ9W,OAAQ,SACR7K,YAAa,oBAGjB4hB,QAAS,iCACJ,eAAa,CACd,kBAEC,eAAW,CACZhL,yBAA0B,iCAIX,cCtJuZ,MCOxa,GAAY,gBACd,GACA,GACA,IACA,EACA,KACA,KACA,MAIa,MAAiB,QAYhC,KAAkB,GAAW,CAACkL,aAAA,KAAUC,QAAA,KAAKE,cAAA,KAAW+G,YAAA,KAAS3G,QAAA,KAAK2Q,cAAA,KAAWlU,cAAA,KAAWwD,aAAA,OC9B5F,IAAI,GAAS,WAAa,IAAI/H,EAAI5K,KAAS6K,EAAGD,EAAIE,eAAmBC,EAAGH,EAAII,MAAMD,IAAIF,EAAG,OAAOE,EAAG,cAAc,CAACA,EAAG,WAAW,CAACM,MAAM,CAAC,cAAcT,EAAIva,YAAYuC,uBAAuB,MAAQgY,EAAI/O,GAAG,uCAAuCsQ,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAI4iB,eAAe,0BAA2B5iB,EAAIva,YAAYuC,4BAA4BmY,EAAG,WAAW,CAACM,MAAM,CAAC,cAAcT,EAAIva,YAAYwC,6BAA6B,MAAQ+X,EAAI/O,GAAG,6CAA6CsQ,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAI4iB,eAAe,gCAAiC5iB,EAAIva,YAAYwC,kCAAkCkY,EAAG,eAAe,CAACM,MAAM,CAAC,OAAS,MAAM,KAAO,SAAS,MAAQT,EAAIva,YAAYyC,qBAAqB,MAAQ8X,EAAI/O,GAAG,qCAAqCsQ,GAAG,CAAC,OAAS,SAASC,GAAQ,OAAOxB,EAAI4iB,eAAe,uBAAwBphB,QAAa,IAC73B,GAAkB,GCwCD,GAArB,kLAKE,SAAe7gB,EAAkBV,GAC/BmV,KAAKiH,yBAAL,kBAAgC1b,EAAWV,QAN/C,GAA2C,cAAtB,GAAa,iBAbjC,gBAAU,CACT+pB,WAAY,GACZ5C,SAAU,kBACL,eAAW,CACZ3hB,YAAa,oBAGjB4hB,QAAS,kBACJ,eAAW,CACZhL,yBAA0B,iCAIX,cCzCqZ,MCQta,I,UAAY,gBACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,MAAiB,QAOhC,KAAkB,GAAW,CAACqL,cAAA,KAAW8S,WAAA,KAAQjW,cAAA,OC6DjD,IAAqB,GAArB,2G,0BAME,EAAA+f,mBAAoB,EACpB,EAAAC,QAAU,CAAC,YAAa,QAAS,MAAO,SACxC,EAAArV,IAAM,WARR,oHAYE,qGACE9Z,KAAKkvB,mBAAoB,EAD3B,SAEQxwB,EAAQ,KAFhB,OAGEsB,KAAKkvB,mBAAoB,EAH3B,gDAZF,kFAmBE,WACE,OAAO,MApBX,GAA4C,cAE1C,iBADC,gBAAKlZ,U,6BAWN,iBAFC,gBAAM,eACN,gBAAM,W,kCAKN,MAGD,iBADC,gBAAK,U,2BAGL,MArBkB,GAAc,iBAflC,gBAAU,CACTpB,WAAY,CACVwa,iBAAA,GACAC,cAAA,GACAC,cAAA,GACAC,gBAEFvd,SAAU,kBACL,eAAW,CACZ9W,OAAQ,SACR7K,YAAa,oBAGjB4hB,QAAS,MAEU,cCvFwZ,M,yBCQza,GAAY,gBACd,GACA,GACA,IACA,EACA,KACA,WACA,MAIa,MAAiB,QAiBhC,KAAkB,GAAW,CAACC,UAAA,KAAOtD,QAAA,KAAKC,SAAA,KAAME,UAAA,QAAUC,WAAA,QAAWC,WAAA,KAAQugB,gBAAA,QAAgB/c,SAAA,KAAMvD,WAAA,KAAQyS,QAAA,KAAKC,YAAA,KAASC,SAAA,KAAMC,cAAA,OCpC/H,IAAI,GAAS,WAAa,IAAIlX,EAAI5K,KAAS6K,EAAGD,EAAIE,eAAmBC,EAAGH,EAAII,MAAMD,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACsB,YAAY,iBAAiB,CAAEzB,EAAY,SAAEG,EAAG,sBAAsB,CAACA,EAAG,MAAM,CAACA,EAAG,aAAaA,EAAG,YAAY,CAACM,MAAM,CAAC,eAAe,OAAO,KAAKT,EAAIqB,KAAKlB,EAAG,aAAaA,EAAG,MAAM,CAACsB,YAAY,cAAc,CAAEzB,EAAe,YAAE,CAACG,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,IAAIc,GAAG,CAAC,MAAQ,SAASC,GAAQxB,EAAI6L,UAAY7L,EAAI6L,YAAY,CAAC1L,EAAG,SAAS,CAACH,EAAIyC,GAAG,sBAAsB,IAAIzC,EAAIqB,KAAKlB,EAAG,YAAYA,EAAG,SAAS,CAACU,YAAYb,EAAIc,GAAG,CAAC,CAACvgB,IAAI,YAAYwgB,GAAG,SAASV,GAC9iB,IAAIkB,EAAKlB,EAAIkB,GACb,MAAO,CAACpB,EAAG,QAAQH,EAAI8L,GAAG,CAACrL,MAAM,CAAC,KAAO,KAAKc,GAAI,CAACpB,EAAG,SAAS,CAACH,EAAIyC,GAAG,oBAAoB,SAAS,CAACtC,EAAG,SAAS,CAACA,EAAG,oBAAoB,CAACM,MAAM,CAAC,MAAQ,WAAWQ,MAAM,CAAChhB,MAAO+f,EAAiB,cAAE9N,SAAS,SAAUgP,GAAMlB,EAAI6kB,cAAc3jB,GAAKV,WAAW,kBAAkBR,EAAI0C,GAAI1C,EAAW,SAAE,SAAS8E,GAAM,OAAO3E,EAAG,cAAc,CAAC5f,IAAIukB,EAAK7kB,MAAMwgB,MAAM,CAAC,MAAQqE,EAAK7kB,QAAQ,CAACkgB,EAAG,oBAAoB,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAG0C,EAAKzZ,UAAU,MAAK,IAAI,IAAI,GAAG8U,EAAG,SAAS,CAACU,YAAYb,EAAIc,GAAG,CAAC,CAACvgB,IAAI,YAAYwgB,GAAG,SAASV,GAC9f,IAAIkB,EAAKlB,EAAIkB,GACb,MAAO,CAACpB,EAAG,QAAQH,EAAI8L,GAAG,CAACrL,MAAM,CAAC,KAAO,KAAKc,GAAI,CAACpB,EAAG,SAAS,CAACgC,SAAS,CAAC,YAAcnC,EAAIoC,GAAGpC,EAAI8kB,kBAAkB,SAAS,CAAC3kB,EAAG,SAAS,CAACA,EAAG,oBAAoB,CAACM,MAAM,CAAC,MAAQ,WAAWQ,MAAM,CAAChhB,MAAO+f,EAAmB,gBAAE9N,SAAS,SAAUgP,GAAMlB,EAAI+kB,gBAAgB7jB,GAAKV,WAAW,oBAAoBR,EAAI0C,GAAI1C,EAAa,WAAE,SAAS8E,GAAM,OAAO3E,EAAG,cAAc,CAAC5f,IAAIukB,EAAK,GAAGrE,MAAM,CAAC,MAAQqE,EAAK,KAAK,CAAC3E,EAAG,oBAAoB,CAACH,EAAIyC,GAAGzC,EAAIoC,GAAG0C,EAAK,QAAQ,MAAK,IAAI,IAAI,GAAG3E,EAAG,QAAQ,CAACM,MAAM,CAAC,KAAO,GAAG,MAAQT,EAAI/O,GAAG,iCAAiCsQ,GAAG,CAAC,MAAQvB,EAAIglB,6BAA6B,CAAC7kB,EAAG,SAAS,CAACH,EAAIyC,GAAG,yBAAyB,IAAI,IAAI,IACtoB,GAAkB,GC8FhBwiB,GAAW,OAmBI,GAArB,2G,0BACE,EAAA3zB,QAAU,EAAK4zB,eACf,EAAAL,cAAgB,EAAKtc,OAAOlY,QAAQC,OAAOpB,QAAU+1B,GACrD,EAAAF,gBAAkB,EAAKxc,OAAOlY,QAAQC,OAAOnB,UAAY81B,GACzD,EAAAE,UAAY,EAAKN,cACjB,EAAAhZ,UAAW,EAEX,EAAAuZ,UAAY,CACV,EAAC,EAAO,EAAG,UACX,EAAC,EAAM,EAAG,SACV,CAACH,GAAU,EAAG,UAVlB,mDAiBE,WACE,OAA4B,GAAxB7vB,KAAK2vB,gBACA,mBAC0B,GAAxB3vB,KAAK2vB,gBACP,mBAEA,wBAvBb,uBA2BE,WACE,OAAO3vB,KAAKsL,SAASC,WAAWoE,SA5BpC,0BA+BE,WACE,IAAMzT,EAAgBzT,OAAOyY,QAAQ/F,GAActP,KAAI,YAAwB,2BAAtBU,EAAsB,KAAhB0jC,EAAgB,KAC7E,MAAO,CACLh6B,KAAMg6B,EAAY1jC,KAClB1B,MAAO0B,MAIX,OACE,CACE0J,KAAM,EAAG,QACTpL,MAAO,SAHX,sBAKKqR,MA5CT,6FAiDE,WAA6BpC,GAA7B,4FACMA,IAAWkG,KAAK+vB,UADtB,wDAKQG,EAAYp2B,IAAW+1B,GAAWn0B,EAAgB5B,EAL1D,SAMwBkG,KAAKtD,gBAAgB,CACzCzG,KAAM,EAAG,2BAA4B,CAAE1J,KAAM4O,EAAa+0B,GAAW3jC,OACrEgS,KAAMsO,GAAWe,WARrB,UAMQpY,EANR,OAWOA,EAXP,uBAYIwK,KAAKyvB,cAAgBzvB,KAAK+vB,UAZ9B,0BAgBE/vB,KAAKlF,aAAa,CAChB3P,IAAK,SACLN,MAAOiP,IAAW+1B,GAAW,KAAO/1B,IAGtCkG,KAAKhD,aAAa,CAChB/G,KAAM,EAAG,qBAGXpI,SAAS8mB,SAzBX,iDAjDF,yFA8EE,SAAkB5pB,GAChBiV,KAAKlF,aAAa,CAChB3P,IAAK,WACLN,MAAOE,GAAQ8kC,GAAW,KAAO9kC,MAjFvC,iGAqFE,oHACkBiV,KAAKtD,gBAAgB,CACnC1I,MAAQ,EAAG,gCACXiC,KAAO,EAAG,+BACVsI,KAAMsO,GAAWe,WAJrB,UACQU,EADR,OAOOA,EAPP,iEAUQ,GAAI6hB,sBAVZ,gDArFF,8DAA0C,cAiDxC,iBADC,gBAAM,kB,sCA2BN,MAGD,iBADC,gBAAM,oB,iCAMN,MAnFkB,GAAY,iBAdhC,gBAAU,CACTvb,WAAY,CACVwb,UAAA,IAEFne,QAAS,iCACJ,eAAa,CACd,eACA,kBAEC,eAAW,CACZ,wBAIe,QChCjBoe,GDgCiB,MEtHoY,MCQrZ,I,UAAY,gBACd,GACA,GACA,IACA,EACA,KACA,WACA,OAIa,MAAiB,QAchC,KAAkB,GAAW,CAACzhB,QAAA,KAAKyK,YAAA,KAASiX,kBAAA,QAAkB7d,SAAA,KAAMkB,MAAA,QAAMF,aAAA,KAAUkV,kBAAA,KAAe9U,eAAAF,GAAA,KAAeyP,SAAA,KAAMlU,WAAA,OFyFxH,IAAqB,GAArB,2G,0BACE,EAAAnD,QAAU,EAAKyD,YACf,EAAAxD,cAAgB,CACdukB,UAAU,EACVC,SAAS,EACTC,cAAc,GAEhB,EAAAzD,KAAO,EAPT,kDAqBE,WACE,OAAOhtB,KAAKsL,SAASC,WAAWoE,SAtBpC,iCAyBE,WACEpD,KACA,IAAMnN,EAAMuN,KAERvN,GACFY,KAAK4F,YAAY,CACfxG,UA/BR,8EAoCE,qGACEY,KAAK0wB,sBADP,SAGQ1wB,KAAK2wB,cAHb,OAIEN,GAAarwB,KAAK6Q,MAAM0S,IAAYhS,IAAIC,cAAc,wBACtD6e,GAAUtf,iBAAiB,QAAS/Q,KAAK4wB,SAL3C,gDApCF,oFA4CE,WACM5wB,KAAKgtB,MACP3S,aAAara,KAAKgtB,MAEpBqD,GAAUpf,oBAAoB,QAASjR,KAAK4wB,WAhDhD,kFAmDE,uGACQrb,EAAO1nB,SAAS0nB,KACjBvV,KAAK9E,OAAO1B,QAFnB,qBAGQ+b,EAAK/W,SAAS,qBAAsB+W,EAAK/W,SAAS,aAH1D,uBAIMwB,KAAK6F,gBAAe,GAJ1B,0BAOM,GAAI2P,cAAcD,GAPxB,+BAUI,GAAIC,cAAcxV,KAAK9E,OAAO1B,SAVlC,mCAcUwG,KAAK6wB,cAdf,qEAgBI7wB,KAAK6F,gBAAe,GAhBxB,4CAoBQ7F,KAAK8wB,iBApBb,2DAnDF,8IA0EE,oHACqB,GAAI5pB,oBADzB,OACQ/D,EADR,OAGEnD,KAAK2F,kBAAkBxC,EAAKnb,MAH9B,gDA1EF,2IAgFE,uHACQ+Y,EAAMf,KAAKe,IAAMf,KAAKe,SAAMiD,EADpC,SAEqB,GAAI6sB,YAAY9vB,GAFrC,OAEQoC,EAFR,OAGQgC,EAAWhC,EAAKnb,KAEtBgY,KAAKsF,eAAeH,GACjBnF,KAAK9E,OAAOlB,sBACP+2B,EAAc5rB,EAASggB,aAAab,cACpC0M,EAAc7rB,EAASggB,aAAahB,cACtC8M,EAAK,GAAIC,EAAK,GACdF,EAAc,OAChBC,EAAK,KAAH,OAAQ/oB,GAAW8oB,GAAnB,OAEAD,EAAc,OAChBG,EAAK,KAAH,OAAQhpB,GAAW6oB,GAAnB,OAEJrkB,SAAS1Y,MAAT,WAAqBk9B,EAArB,YAA2BD,EAA3B,yBAEFjxB,KAAKgtB,KAAOpuB,WAAWoB,KAAK6wB,YAAa7wB,KAAK9E,OAAOzB,gBAlBvD,gDAhFF,8EAqGE,SAAQvN,GACN,GAA0C,UAArCA,EAAEilC,OAAuBC,QAA9B,CAIA,IAAMn7B,EAAO/J,EAAEmlC,cAAe1U,QAAQ,QAClC1mB,GACF+J,KAAK4F,YAAY,CACfxG,IAAKnJ,OA7Gb,wBAmHE,SAAWqY,GACJA,GACHtO,KAAK2wB,gBArHX,wBA0HE,SAAW5lC,GACT,IAAQo3B,EAAUniB,KAAKsL,SAAf6W,MAER,GAAY,MAARp3B,EAMF,OALIiV,KAAKsxB,MACPtxB,KAAKsxB,IAAIC,eAAe,MACxBvxB,KAAKsxB,SAAMttB,QAEbme,EAAMlzB,KAAOlE,GAIfiV,KAAKsxB,IAAM5lC,OAAO8lC,WAAW,gCAC7BxxB,KAAKsxB,IAAIG,aAAY,SAACvlC,GACpBi2B,EAAMlzB,KAAO/C,EAAEwlC,WAEjBvP,EAAMlzB,KAAO+Q,KAAKsxB,IAAII,YA1I1B,GAAiC,cAmH/B,iBADC,gBAAM,a,0BAKN,MAGD,iBADC,gBAAM,kBAAmB,CAAC3f,WAAW,K,0BAkBrC,MA3IkB,GAAG,iBAlCvB,gBAAU,CACT6C,WAAY,CACV+c,QAAA,GACAC,OAAA,GACAC,aACAC,SAAA,GACA1B,UAAA,GACA2B,WAAA,GACAC,YAAA,GACAC,gBACAC,kBACAC,UAAA,GACAC,aAAA,GACAC,aAAA,GACAC,eAAA,IAEFtgB,SAAU,iCACL,eAAS,CACV,WACA,MACA,cACA,cAEC,eAAW,CAAC,YAEjBC,QAAS,kBACJ,eAAa,CACd,iBACA,oBACA,cACA,uBAIe,cG1HuV,M,0ECSxW,GAAY,gBACd,GACA,GACA3F,IACA,EACA,KACA,WACA,MAIa,MAAiB,QAQhC,KAAkB,GAAW,CAACimB,QAAA,KAAKC,WAAA,KAAQC,SAAA,KAAMC,qBAAA,O,qCCvB/C,gBAAS,GAAD,OAAI,GAAJ,qBAA6C,CACnDC,MADmD,WAEjDjoB,QAAQC,IACN,uGAIJioB,WAPmD,WAQjDloB,QAAQC,IAAI,wCAEdkoB,OAVmD,WAWjDnoB,QAAQC,IAAI,6CAEdmoB,YAbmD,WAcjDpoB,QAAQC,IAAI,gCAEdooB,QAhBmD,WAiBjDroB,QAAQC,IAAI,8CAEdqoB,QAnBmD,WAoBjDtoB,QAAQC,IAAI,kEAEdvS,MAtBmD,SAsB5C,GACLsS,QAAQtS,MAAM,4CAA6C,MCTjE,aAAI8C,OAAO+3B,eAAgB,EAE3B,IAAI,aAAI,CACN3d,MAAA,GACA4d,UACAC,OAAQ,SAAAC,GAAC,OAAIA,EAAE,OACdC,OAAO,S,yDCzBV,W,kCCAA,W,qJCAA","file":"js/app.36412398.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"app\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([0,\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./InfoDialog.vue?vue&type=style&index=0&id=35c58977&lang=scss&scoped=true&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ConfirmDeleteDialog.vue?vue&type=style&index=0&id=a01eaf30&lang=scss&scoped=true&\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAACm0lEQVQ4y6XQS3IbVQCF4f8++qmW3FJky/gRA+WECgMoqjJhwDYo1sRS2APzDMiACcSUUy7HVmTZLSO5W1J333v7MpB3wFnAV3V++J8Tv101fvIyZHoLTQujCGaPICIIBMxLSBT88gNMgMpDJuAB+P0e5M9fReLmM1x+2DCfPjHotYSJ4dNsTVFYUt8wCjruCwve4TY167ajuG+5vgENcDUFrwRRGjBbKCIh+e5LjcIjpMaYjqs1pImnH0Q467isNOX2GfCd49V5gsSxrkDahiYOsa3kqbb0laRUsLRg1w2J9lgV4U23AzYNvHs/5+ggZ9gL0YT8edkwnxus6PjxTcZRrri7d7z/e4uWioOxxPUCJECaKyqbcHFrMZ2gdZa7xYo4h/OjPiIQXBcNF1c1KgwZ5JJ/t1uigdwB0sNwGOPEFitACMEoTXlzmvD9a2jbjj8+rJiVNecnip/eJuznkDbsACtgsSjJI0kWW9KepFPw8dMG66Hfl2SJ5uuzlNODEG9rjid7GPMcsXzoONsPeXmSkSrH41JQrCwvBiHtRqKt5e3rIf0ckFCblMeixcbRDnh1LBlFfcqNoZGSZemxJmB/ECGsR3lFlEjapuFuZVAupFhsyE+fASlAdA7baazpkLGCsCHRGq01d08tHy8dlbXUy5ZvvxEcnmSs2+cLf916EmdIMslhP0B3Di8FKlTgBdut47GssKrH5EXG2YEkTgL+mfodEPUE1xcbxmPB0WiPJBKEQrPeCuQIjicpo1GAtbDX0wwig5WgtNgB4xzWw5gw7shyMLYjlYqbac0gsxzuJ+wRIL3D4Kk7zWLl6LxC/fqu86NDQWMCaqMZ9CTVkwAd0BvHzB4Mq0rjpKBsJUUl+LwUVBvBF8eC/wA/Ni8XXFblvgAAAABJRU5ErkJggg==\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LogsDialog.vue?vue&type=style&index=0&id=25ee86f6&lang=scss&scoped=true&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditTrackerDialog.vue?vue&type=style&index=0&id=24122721&lang=scss&scoped=true&\"","export * from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=style&index=0&id=0d9d7390&lang=scss&scoped=true&\"","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SettingsDialog.vue?vue&type=style&index=0&id=3eb994fd&lang=scss&scoped=true&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TorrentInfo.vue?vue&type=style&index=0&id=7f833448&lang=scss&scoped=true&\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAUUlEQVQoz7WSWwoAIAgEZ6P7X9l+InpQaNF+yo6rqADAcEkgv7syNjY4yCbg7G5KkXEA8hBqNU/SrvKWsEZ5gXWk+6XDwP87xF+D6PP1tMddAGcxFhjSGYG/AAAAAElFTkSuQmCC\"","var map = {\n\t\"./chdbits.png\": \"3893\",\n\t\"./hdchina.png\": \"6e14\",\n\t\"./hdhome.png\": \"5918\",\n\t\"./keepfrds.png\": \"6376\",\n\t\"./m-team.png\": \"6e33\",\n\t\"./springsunday.png\": \"83eb\",\n\t\"./u2.png\": \"194e\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"3c9e\";","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SearchDialogForm.vue?vue&type=style&index=0&id=50ebf5de&lang=scss&scoped=true&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RssRulesDialog.vue?vue&type=style&index=0&id=0220a15a&lang=scss&scoped=true&\"","var map = {\n\t\"./\": \"1f11\",\n\t\"./__tests__/index.spec\": \"58dfb\",\n\t\"./__tests__/index.spec.ts\": \"58dfb\",\n\t\"./af\": \"4428\",\n\t\"./af.ts\": \"4428\",\n\t\"./ar\": \"4720\",\n\t\"./ar.ts\": \"4720\",\n\t\"./az\": \"64dc\",\n\t\"./az.ts\": \"64dc\",\n\t\"./bg\": \"3bd4\",\n\t\"./bg.ts\": \"3bd4\",\n\t\"./ca\": \"a8de\",\n\t\"./ca.ts\": \"a8de\",\n\t\"./ckb\": \"ef60\",\n\t\"./ckb.ts\": \"ef60\",\n\t\"./cs\": \"83af\",\n\t\"./cs.ts\": \"83af\",\n\t\"./de\": \"8e29\",\n\t\"./de.ts\": \"8e29\",\n\t\"./el\": \"98c0\",\n\t\"./el.ts\": \"98c0\",\n\t\"./en\": \"4b41\",\n\t\"./en.ts\": \"4b41\",\n\t\"./es\": \"f950\",\n\t\"./es.ts\": \"f950\",\n\t\"./et\": \"ead6\",\n\t\"./et.ts\": \"ead6\",\n\t\"./fa\": \"03fd\",\n\t\"./fa.ts\": \"03fd\",\n\t\"./fi\": \"43a3\",\n\t\"./fi.ts\": \"43a3\",\n\t\"./fr\": \"ea1f\",\n\t\"./fr.ts\": \"ea1f\",\n\t\"./he\": \"131b\",\n\t\"./he.ts\": \"131b\",\n\t\"./hr\": \"0924\",\n\t\"./hr.ts\": \"0924\",\n\t\"./hu\": \"573e\",\n\t\"./hu.ts\": \"573e\",\n\t\"./id\": \"6dfc\",\n\t\"./id.ts\": \"6dfc\",\n\t\"./index\": \"1f11\",\n\t\"./index.ts\": \"1f11\",\n\t\"./it\": \"c2a1\",\n\t\"./it.ts\": \"c2a1\",\n\t\"./ja\": \"1902\",\n\t\"./ja.ts\": \"1902\",\n\t\"./ko\": \"f5e4\",\n\t\"./ko.ts\": \"f5e4\",\n\t\"./lt\": \"e184\",\n\t\"./lt.ts\": \"e184\",\n\t\"./lv\": \"07ae\",\n\t\"./lv.ts\": \"07ae\",\n\t\"./nl\": \"4642\",\n\t\"./nl.ts\": \"4642\",\n\t\"./no\": \"800a\",\n\t\"./no.ts\": \"800a\",\n\t\"./pl\": \"7597\",\n\t\"./pl.ts\": \"7597\",\n\t\"./pt\": \"df7f\",\n\t\"./pt.ts\": \"df7f\",\n\t\"./ro\": \"fa37\",\n\t\"./ro.ts\": \"fa37\",\n\t\"./ru\": \"0879\",\n\t\"./ru.ts\": \"0879\",\n\t\"./sk\": \"b854\",\n\t\"./sk.ts\": \"b854\",\n\t\"./sl\": \"ae0b\",\n\t\"./sl.ts\": \"ae0b\",\n\t\"./sr-Cyrl\": \"af68\",\n\t\"./sr-Cyrl.ts\": \"af68\",\n\t\"./sr-Latn\": \"5a1b\",\n\t\"./sr-Latn.ts\": \"5a1b\",\n\t\"./sv\": \"035c\",\n\t\"./sv.ts\": \"035c\",\n\t\"./th\": \"aef1\",\n\t\"./th.ts\": \"aef1\",\n\t\"./tr\": \"659a\",\n\t\"./tr.ts\": \"659a\",\n\t\"./uk\": \"ea76\",\n\t\"./uk.ts\": \"ea76\",\n\t\"./vi\": \"18a6\",\n\t\"./vi.ts\": \"18a6\",\n\t\"./zh-Hans\": \"25a2\",\n\t\"./zh-Hans.ts\": \"25a2\",\n\t\"./zh-Hant\": \"582c\",\n\t\"./zh-Hant.ts\": \"582c\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"5493\";","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SpeedSettings.vue?vue&type=style&index=0&id=6257e5f6&lang=scss&scoped=true&\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAEnUlEQVRYw8VXTWhdRRT+ztz7fpKXpkkN9adNsVKS+APBGmzEqmCDihQRjFDEUkVcSReCigsXirta6k8suuiiripUcWEFbcVuClIUopVqaqmlCZU0JmnyTF7MuzPnuJj7++68EKzQAwfuzJw559zvfDP3XBIRXE/xn/7k6jU5OLqnMzfX6NNlEwkNH579396GiKToAwWf4PuAIkKgBX/XGEf3dJITgWupQMEniYL5HsFTgFIEpQAVhisWCQJg+PBVfPZcHgl/tfGVsm/n+xQHiwKSAhpfj1OOfd8m4USAHStvDLXJDRWFOgtYrHMiACCcn9H46vfl2FYgELbPg90F3NddzPkTEZR9EuTzzCQglRZCwSfMLjPWtyv0rPNzznq6PIxOakzMG0cgoKUAbGz3MvNLgeDyPMOwRS0ttPOQJWF7RUm5ROGbWunt8vHq9tZcoHPTBu+cWmxaru61Hl7b3oqWAmEpELz53SLGZzUWakJfvpDlgWIWKAUhEhgWaJPo2StBbDj2l04l5mFwYyFjm9aLsxqX5ixCl+YMrizYZ3bUWxkGtAYCA2iHRvL52WVM1zgeP9NfRlGRc482iEn365SBNpaUzHkuKsNAXQvVA0Gg8xqJNoKD39ficWuB8OQdJeeeQAui481sx4ZdFASUsEBYoLXAmLxGwkbwy58BfphIyvJ4bwl9XZ57X5SAAMbYGARg6OBMngPMgiBwJxEnwNbRodOLqNWT+ecHWp0JRAgI27Gtv+R4oETs8Ql0YpjWOAGx48mqwZHRpBS3rvOw8/ZSbp+EEIgg46vx5o0R0FpoRQRSc1+cWcLFmeRU7Lq7FWUPTUqQRkUgDZ9fxWzhZYYtQYNmEkjNf3xqIV6rFAkvDlYy60kJkMylEsshwLw6DkQ6OlHHibF/4vWh3jLuuqmQ4wBzyl/Ig/v3T7kTCLRAB24EjMmj8+HJKhaXE5tXdqxJISA5BDhEIc2thhIgd6vFCXD+xpurMUZOVmObG9s97N5WgTYSI82S3WPJnC6BEURqTEjEVXAg0mM/1/DTRD22G95awfqKSkiYQiBGgRMiZhCwxmiSAJwJGC048M18bNdWIux9uD17D6Ttw0vpnrcnAQB+48WgIVCO9sEYS1KX/Ha5jk9PL2DXtjYAwIM9ZSwsc4xA4z4O1SZgsosCwNUpRyVoJh99W8VDvS24ucMLkVDJKdD5GEzNShBpwzE0LM4rN9K5RYN9x/IdtjQc3+S2DRGQ/DeajBGBCNa0JO1LxIGV5MSZGn78YxkDt5WSfQ4EoAAocSPAKQSe2FqJ9wxsLq2IQKSvH5nOIhB+DQ3bT7IRAoMSBFxdyltPdWJzl497t5TjuZceWYsdd7agusR4dmSyKQrjUwFGvp7D3sc6UqQjECjq1UkYGNu3oXkC/ZtK6LulkJvv22A73jQ3QLDOw9aZCPjgeBW7H2hHR0Xh0f5WvH+8Suf2dzsTpi0vjzsXTN2IGG6wzgcjZd+MKGlnzx9wB3OJz81+jTyCMEFEQGSDxsFCKAF7pC68u2nVAXMJNPtlISLyil4UI9vNpfZceO+/BwcAut6/5/8CTr58VufmCM0AAAAASUVORK5CYII=\"","export * from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=style&index=1&lang=scss&\"","module.exports = __webpack_public_path__ + \"img/keepfrds.e602522e.png\";","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Drawer.vue?vue&type=style&index=0&id=333e2f85&lang=scss&scoped=true&\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAgUlEQVQoz51RwQ3AIAhE4gB1Of9lB6dwB/5lua7QBw0lqTHoxRgOOTwxHecFK0AAuLkq0eDmqsuKPMVhm0JSSEzvKUIYhQQAsjcTfYN5WBBEoC7y5Mzu9DTt/MOOgFodBn7/BNQqd/HZkCXus7FaO/ynhjAL75TUlZdphU9qvDzWB/mJRjPcDSP/AAAAAElFTkSuQmCC\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABmJLR0QA/wD/AP+gvaeTAAAHzUlEQVR42u2ba2wU1xmGnzM7e/NefFlnbWNjY7C5g8EmEhCR0ihgN20RaUubpmlQEaUpUiK1SRU1TatEatOoUVK1hVYlvRDRhlCaKk0EBNHQVGmV2AoJFFLsErATswZ8xbf17s7OnP6YXTBR1nhsnFHJvj8srffMt+95zsyZ+b5zRmCqGGgAVgI3cP1KA1qAg0AjoAlgJvA4cJsQ5DgUIex2OVWSEnRDJoGzwI+B3wlgG7Clbl7IuWFtJaE8t90+p0y6Ljna0svuA2foH0q0Al9VgfrCfI/z0a21rFlZmkJlt9UpkoDhqIZuSJ5+vqUMWKMC4VDQRVV5EMOQGIZEXL9XAf4cJwur8gCcwAwFEAhBusvXc+fBPLkv9xZFGf3Fx1BSmXyM/29lAdhtwG5lAdhtwG5lAdhtwG5lAdhtwG5lAdhtwG5lAdhtwG5lAdhtwG6p1zKYEGZBRQBSSiRmIVJK87tJx0/9kdeweDEpAFKa5TNFwEhc51x3lPbzw8QTOgW5bsqL/YTy3CiKSIEYf7kt3TbdPBbXGR5JohsSr9uBz6viUASGxbjXDICUEkUI4prO68c62X3gDE0nuujsjZHUDXwelcrSAA03lbFhbSUV0/wIIcZldnSbSGeUV97o4B9HzvH+uWESmk4oz8PSuSHqV5ZSM6cAt8uBYUzsLJsQgHTn+4cSbN9zkh17m7nQG0vX208DIwNDWtG57pGqxhNdefteaxc/uGcJq5eVpCBkNpvuvK4bHHqjgyefOc6b/+kmnjDiQD+QBPwv/+ts4JkXT4m7Pj2LrV+aRzjkxZBglYFlAKZ5wUhC5+fPvsNPd73DSFzvAH4L7AXaUyZ9QK2uy280Hu9quP+JJve2h1Zw09KiMeMLITAMyd5DrXx/21tEOqMx4FXgz8BJIA6USElDpDN6+1O7TkxrvzDMY/cuo6jQa7mqbRmAOdHB4cYOfr23hZG43g58G3gh1fG0hoADwJvAI81t/Vue2Hlcra7IJVzgyTiRKQKONPfwo6ePEemMDgK/AH4GdF7hAw5K2K8l5WN/OthaU1bk43tfX4JTtXZjm9BtcCiq8cd9p+npj2vAL4G/fKDzo9WFuQz1+mtvnefvTR1jnqbRuM7Ov57idPugBJ5LHdv5wXbSXOfbDzyY1GX77v1nONbSi2LxGrAMQBHQFhniyMlugHeB5wHjKoedBfZEY7p2uOkcsYSRMfZ7kUEON3UAtAG/wjyTxtJh4IX2C8O80hhBN6zdIy0DEELQ1jFEd18czGvy7DgPPQr0tUYGGYpqH34WCDjVPsCFnhGAt4HmccTVgL8B0WP/7SWeuNpYTBIAAkbiSbSkARBNGRiPooAWi+skdePDp2sJ3X1xtKQEOG8hdhcQ6+tPkND0KQYgIeh34XE7AAoA7ziPzAe8Qb8Tt9ORcRL0ehzp9aocC/7cgOp2KTgc1iYBywAMKZlVFqCk0AuwAKi62jHCHO+bgby5lXn4fc4MDQUzpvnx5zgB5qagjUdLgZyZZUHcLsfUApASphf7uLmuGGA6sBkIjHkM3AjckR90KfUrSnFmGCVpSKqmB1lYlQ+wEHPXytVUAWzweVV1VW0Rro/iNuh2Obj7s1VUlQcV4G7gATKPVi3wuBDMuf2WClbUhMk0UUsglOfhy5+aic+r+oHvAJ8g8wNeGPgucOOq2iJW1RVfSr6mFICUUDe/kIc211Bc6PWnAOwA1mHOC7lAHfAtYKcQrL51+TTu37gIv8+Z0aCUEgGs/2QFdzTMRHWIBam43wTKRvkNYl5S24GvVVcE1Qc2LuKGfI+5/G1hGphwLiCE4Au3zsDjcvCT3/875/ipvs/rhqwHDqWarQAKgz6nc93qch7ctJiZZYEx8wAhBIaU5AZcPLxlCS6nwh/2nZ49OKw9CWzCfNTWgDXAUkUQXjovJB65p5YVNeEJpd4TApDO6lRVYf0tFSyqzufFV98Xu156N9Dc1r8eEHNmBMXyxWFuWzWd1ctKCPqd4zKYzgWKC708urWW5YvDPLv/tKfpRFdd30BiMSD9OaornWne9ZlZVJfnXjEwVjThdHh0altdHuS+r8wn0jlMc1u/ogi4784FbFxXjeowc/Z0pjYef2kI/hwnX6yvpH5lKT/ccZRtz510AmxaP5t775xPcciLqiqWaw2jNamSWPoHDQlIUNIP4gJ8XhWXU7k04Vm1lk6bpYTcgItQnif1f6gsDVBR4sfhUDCMK718pADGkpST33aT7lN6hNMypLwMdpKlto99UTQLwG4DdisLwG4DdisLwG4DdisLwG4DdisLwG4DdisLwG4DdisLwG4DdisLwG4DdusSgOv8ZTFgVFXpcl+FCgyOxJKBgSENhyIsLy+n4xmKGP06GkKAIgSGmPyWLnOzlLjisyJAWt0LIATSkHT1xcBc0u9VgbcjXdFp2/ecZPPnZlOQ67ZcwATQDcnAUCKFGrr6YrRGBtF1a8vVGQjQNxC/9LH3ohnbsDhYSV1ytKWHvQdbAS4C/xTAWuAphyLmh0MeEchxWgo6Wl29MfoGExogigu9aq7fec329PX0x+m5GNcBwgUeR17AZTmGrpujPzCsxYDfAA8LzHlgNbAVcx2vYBI+L2C+ml6Cuabn5tq8kymAXuDlVMx6wD+B2BrwHvAS5u6Tzv8Bq/7VWDM7GawAAAAASUVORK5CYII=\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RssDialog.vue?vue&type=style&index=0&id=763d8c6c&lang=scss&scoped=true&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilterGroup.vue?vue&type=style&index=0&id=26ced1bd&lang=scss&scoped=true&\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABmJLR0QA/wD/AP+gvaeTAAAHIUlEQVRo3sVZy3IkRxU9J6taGodZeM0woCoR/AYr82h1SzDBgh0RdhhjxvJosL+AJeGxnoPGRECwJoLBI7U0jvC3TLVkPoFweGR15mGRWV1VXdWtrlZj7kbqqszKe+7NvI+TxBIk2dgDIAAQJ94JIACQEbLBB7W5af8IciMAwvDsUeu149sonvaPIXcFQpo2hgEZZJFs7JHmNWSn7xYDnA3zGYa3E7Oo8kl3F3CvpijPRl0ICe5rJL1D/42NXQDOz2dr3ccrtZa13r5HLqfKp8gmTQQ55I4oQSGNAWQDAAPAMBtst9JloS1ECShbngQQUSSGp+9XxqZbTwk38or6eQAEkgFY6bsLeKE1gLR/CDhbtbxI3bmL4T/v18Znz3/n520eE+5akA1vqjtvsQ3U8gx898d/hNxIlcVNBMR3GpWvADl5D5IjGC2o6hIArH7nDXDCVnKO2fN355o/PNuB32+L2vuWAGjqwzXeEvNJNtgGTLQ0EO3OgFx1+5AwjJD2DjC5pyege8Pn516o/s4f3bD8Wv8JTFgnC8FiJoCk/wSUzcMj4EYTIwwlC4ITESmoNH7aAK6WPgTJYb3/BCIxwiq+PHm7agZ3DZCCioRfA31v8wAdx7CoX4UgJHGcdMazDULwU/G1gMBPndBSeVqeAo6FscKv8XhGQBFAmIWyo+KBZOMAdADgSjEbmBo55GAFXJ4/4vqbH+PlFx9VXq+/+ZiA8PKLj/DDzaeQRvCxv3wEyvtIKOcG5fqT8OG37kn6rfIpqKtgIlcfaGLIjQpLV2xK+uiymNz72SeIowgggy+Dl8sGrEvVA8S1nzGRGXOMUl5vNdQ3xijdOmb2/L2FAPz78z9Ufn//pweMO/nmkRqBqDjzTHr7oKTpaInsbIdJ9xOf/hveAyTjO3g5Zz6YV5L+ISgHNOhnLXj5+SMY0mh2CATW+ke1BFY2ByDJXintHyENleYyZHi6Day8gSbX509M87apipGEqAPMAiELaCRAHsjWn5cCInv2G1g3ChGvLnMksqAcqJuHCoAF4ARLrPcPfeHKCNnp7xcGcfniQyS9Q/qDWDrjHsA8KV2Y0XRNASJILnRaDmn/gICBuILhyW9bg7AjiygSfYYqwjCTjb2ZLeHypJSkSAIG1lpcnn9wu6/+4Cd/QtRZQTsTLwMMivwdgAkCGIOMkZ3MF9EIAGn3EKAFqjn+WxYWfwIwXzQYyAoXLx7OmuUl6e4F43yb3pgHmC9fBWJ49rD2tiZJ9zHICIU3WPIM8f/zEjwQRhiG5n+uruLexj4iJxgSMGGKXI6lqVb+X4OAGHE42L59W7TW3UNkDDTO1SqXKqgGhxt6hLYgJNKTS/4BCAwHO0u1lSexHGBWYOCgPPP7vxPgWoKi8fmZgAiJoJLN46UCgBwIA7prz4E6C7kR5BycdRQjwnRI0yEZEzQtWDoq5qS37VXj0LXeE0gO0erryJ69Nbf+zo0Qd14LlpcAh3xNEoC7BgC6cKBoVglZgE431WlErRYSCCjt7RMwKNN8BtZTctdftTo3ly8+HP+f9I5IE3tirNo4ieNz45gNtpH2D4mZZT4gcgqtIm+ppHdQRScHOKuku4tFZDh4H9nJA8B02LxNNM5Bss0t5ISeU2pUf6BESWnvAHc3jlBQ/7cPkZ6lqzTGNfEc1LT3BBhBzs4itgTAAXJapa32dVyYlS/k9buelmyQdGMfngFpagDp1zcdDs8fTQNQRh6YgtKBIqm0d3Qr/Yf/+FVuytrikq2H1FxxRmS8yuzE9+D1hoYGoOFMdkAOoJT29kH4RpnBK+XEbJ3F5dkOvvfzx1iJVyvfIWM4903zJimfD4atRM+pZhP0PdPurq9kx8rHzE4feI7IRKEby1cOYHTDoo3eLCkPAjR0blQrHGk6BFcBvZKkYExh2sVHrJyPCal5OHjgXXxWNBrJL/9Gjr4uAIxru3lSpxqeKFyS5ACL/wUgO3kH6/f/SjiH7LN3Zn499j0rCUbIlZ+U4b/eCgRusLQ4phXdCDCxm85Sl/Us+cBZwURjDxfDA7CXz97GPBJfnO/MNRB5HsjzTaAIacTs9OG83xhL+uvnwFdfqupEwdUI5Nkydzz0Wzw/A3lksiCN0s2nrQHgPxeAK1vfn4vL83Z3xbcP6LKA+wbrW5/OPWX9F38J232CmTYrrZdfQkYSIDdm5m6SdOsYGr2aOP+EoHFsbyML3tSHZoIGyMkmT38r7R1SkL/4+8zzPz+6/3eM7JWvdO11jQEXDYeDxeiVuSvL9f6BlO9ZGjiz6lOXfYWqOfPkalBPgA1JkYbZoH0QaO2BSmMo8eIk3P/6e+PqBZgATzHOtp0gDm+hfCsAIfj7K3Z7PX6anfoMmfT26buv2eVqfucDELe5GCnMMKck3d1QUBWURuO4jb3w4eKOTPmlHA0k4aJlqJwl/wV2l25vFMV9qQAAAABJRU5ErkJggg==\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Panel.vue?vue&type=style&index=0&id=1e23acca&lang=scss&scoped=true&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DrawerFooter.vue?vue&type=style&index=0&id=521b95f4&lang=scss&scoped=true&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ConfirmSetCategoryDialog.vue?vue&type=style&index=0&id=dfcb35ec&lang=scss&scoped=true&\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AddForm.vue?vue&type=style&index=0&id=f8274abe&lang=scss&scoped=true&\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Torrents.vue?vue&type=style&index=0&id=c7d208ac&lang=scss&scoped=true&\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Footer.vue?vue&type=style&index=0&id=335591ac&lang=scss&scoped=true&\"","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RssSettings.vue?vue&type=style&index=0&id=0418c586&lang=scss&scoped=true&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TorrentContent.vue?vue&type=style&index=0&id=360390b3&lang=scss&scoped=true&\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./GlobalDialog.vue?vue&type=style&index=0&id=299a15fc&lang=scss&scoped=true&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Peers.vue?vue&type=style&index=0&id=a834147c&lang=scss&scoped=true&\"","/* eslint-disable @typescript-eslint/camelcase */\nexport default {\n lang: 'English',\n auto: 'Auto',\n\n close: 'Close',\n no: 'No',\n yes: 'Yes',\n cancel: 'Cancel',\n ok: 'OK',\n\n start: 'Start',\n stop: 'Stop',\n submit: 'Submit',\n edit: 'Edit',\n delete: 'Delete',\n todo: 'To Do',\n resume: 'Resume',\n pause: 'Pause',\n force_start: 'Force Start',\n toggle_sequential: 'Toggle Sequential Download',\n info: 'Info',\n reset: 'Reset',\n login: 'Login',\n search: 'Search',\n refresh: 'Refresh',\n location: 'Location',\n rename: 'Rename',\n trigger_application_shutdown: 'Exit qBittorrent',\n reannounce: 'Reannounce',\n recheck: 'Recheck',\n\n username: 'Username',\n password: 'Password',\n\n name: 'Name',\n size: 'Size',\n progress: 'Progress',\n status: 'Status',\n seeds: 'Seeds',\n peers: 'Peers',\n dl_speed: 'DL Speed',\n up_speed: 'UP Speed',\n eta: 'ETA',\n ratio: 'Ratio',\n added_on: 'Added On',\n\n settings: 'Settings',\n logs: 'Logs',\n light: 'Light',\n dark: 'Dark',\n\n all: 'All',\n category: 'Category |||| Categories',\n uncategorized: 'Uncategorized',\n tag: 'Tag',\n untagged: 'Untagged',\n others: 'Others',\n sites: 'Sites',\n files: 'Files',\n less: 'Less',\n more: 'More',\n feed: 'Feed',\n date: 'Date',\n query: 'Query',\n plugin: 'Plugin |||| Plugins',\n action: 'Action |||| Actions',\n search_engine: 'Search engine',\n usage: 'usage',\n plugin_manager: 'Plugin manager',\n update_plugins: 'Update plugins',\n\n preferences: {\n change_applied: 'New preferences saved',\n downloads: 'Downloads',\n adding_torrent: 'When adding a torrent',\n create_subfolder_enabled: 'Create subfolder for torrents with multiple files',\n start_paused_enabled: 'Do not start the download automatically',\n auto_delete_mode: 'Delete .torrent files afterwards',\n preallocate_all: 'Pre-allocate disk space for all files',\n incomplete_files_ext: 'Append .!qB extension to incomplete files',\n saving_management: 'Saving Management',\n auto_tmm_enabled: 'Default Torrent Management Mode',\n torrent_changed_tmm_enabled: 'When Torrent Category changed',\n save_path_changed_tmm_enabled: 'When Default Save Path changed',\n category_changed_tmm_enabled: 'When Category Save Path changed',\n auto_mode: 'Automatic',\n manual_mode: 'Manual',\n switch_torrent_mode_to_manual: 'Switch affected torrent to manual mode',\n move_affected_torrent: 'Relocate affected torrents',\n save_path: 'Default Save Path',\n temp_path: 'Keep incomplete torrents in',\n export_dir: 'Copy .torrent files to',\n export_dir_fin: 'Copy .torrent files for finished downloads to',\n\n speed: 'Speed',\n global_rate_limits: 'Global Rate Limits',\n alternate_rate_limits: 'Alternative Rate Limits',\n alternate_schedule_enable_time: 'Schedule the use of alternative rate limits',\n apply_speed_limit: 'Rate Limits Settings',\n dl_limit: 'Download (KiB/s)',\n up_limit: 'Upload (KiB/s)',\n zero_for_unlimited: '0 means unlimited',\n schedule_from: 'From',\n schedule_to: 'To',\n scheduler_days: 'When',\n limit_utp_rate: 'Apply rate limit to µTP protocol',\n limit_tcp_overhead: 'Apply rate limit to transport overhead',\n limit_lan_peers: 'Apply rate limit to peers on LAN',\n\n connection: 'Connections',\n bittorrent: 'BitTorrent',\n\n rss: 'RSS',\n rss_processing_enabled: 'Enable fetching RSS feeds',\n rss_auto_downloading_enabled: 'Enable auto downloading of RSS torrents',\n rss_refresh_interval: 'Feeds refresh interval',\n\n webui: 'Web UI',\n data_update_interval: 'Data Update Interval (ms)',\n webui_remote_control: 'Web User Interface (Remote control)',\n ip_address: 'IP address',\n ip_port: 'Port',\n enable_upnp: 'Use UPnP / NAT-PMP to forward the port from my router',\n authentication: 'Authentication',\n web_ui_username: 'Username',\n web_ui_password: 'Password',\n bypass_local_auth: 'Bypass authentication for clients on localhost',\n bypass_auth_subnet_whitelist: 'Bypass authentication for clients in whitelisted IP subnets',\n web_ui_session_timeout: 'Session timeout',\n web_ui_max_auth_fail_count: 'Ban client after consecutive failures',\n web_ui_ban_duration: 'ban for',\n web_ui_seconds: 'seconds',\n new_password: 'Change current password...',\n\n display_speed_in_title: 'Display download speed in page title',\n },\n\n title: {\n _: 'Title',\n add_torrents: 'Add Torrents',\n delete_torrents: 'Delete Torrents',\n set_category: 'Set Category',\n edit_tracker: 'Edit Tracker',\n set_location: 'Set Location',\n recheck_torrents: 'Recheck Torrents',\n },\n\n label: {\n switch_to_old_ui: 'Switch to old UI',\n create_subfolder: 'Create subfolder',\n start_torrent: 'Start torrent',\n skip_hash_check: 'Skip hash check',\n in_sequential_order: 'In sequential order',\n first_and_last_pieces_first: 'First and last pieces first',\n\n also_delete_files: 'Also delete files',\n\n auto_tmm: 'Auto TMM',\n\n adding: 'Adding…',\n reloading: 'Reloading…',\n deleting: 'Deleting…',\n moving: 'Moving…',\n moved: 'Moved',\n next: 'Next',\n back: 'Back',\n confirm: 'Confirm',\n reannounced: 'Reannounced',\n rechecking: 'Rechecking…',\n dht_nodes: '%{smart_count} node |||| %{smart_count} nodes',\n base_url: 'Base URL',\n },\n\n msg: {\n item_is_required: '%{item} is required',\n },\n\n dialog: {\n trigger_exit_qb: {\n title: 'Exit qBittorrent',\n text: 'Are you sure you want to exit qBittorrent?',\n },\n add_torrents: {\n placeholder: 'Upload torrents by drop them here,\\nor click attachment button at right to select.',\n hint: 'One link per line',\n },\n delete_torrents: {\n msg: 'Are you sure to delete selected torrents from transfer list?',\n also_delete_same_name_torrents: 'Also delete one same named torrent |||| Also delete %{smart_count} same named torrents',\n },\n set_category: {\n move: 'Are you sure to move selected torrents to category %{category}?',\n reset: 'Are you sure to reset category of selected torrents?',\n also_move_same_name_torrents: 'Also move one same named torrent |||| Also move %{smart_count} same named torrents',\n },\n switch_locale: {\n msg: 'Are you sure to switch language to %{lang}?\\nThis action will reload page.',\n },\n recheck_torrents: {\n msg: 'Are you sure want to recheck torrents?',\n },\n rss: {\n add_feed: 'Add Feed',\n feed_url: 'Feed URL',\n auto_refresh: 'Auto Refresh',\n auto_download: 'Auto Download',\n delete_feeds: 'Are you sure to delete selected feeds?',\n date_format: '%{date} (%{duration} ago)',\n },\n rss_rule: {\n add_rule: 'Add Rule',\n new_rule_name: 'The name of the new rule',\n delete_rule: 'Are you sure to delete selected rule?',\n title: 'RSS Downloader',\n rule_settings: 'Rule Settings',\n\n use_regex: 'Use Regex',\n must_contain: 'Must Contain',\n must_not_contain: 'Must Not Contain',\n episode_filter: 'Episode Filter',\n smart_episode: 'Use Smart Episode Filter',\n assign_category: 'Assign Category',\n\n apply_to_feeds: 'Apply Rule to Feeds',\n },\n },\n\n category_state: {\n _: 'State',\n\n downloading: 'Downloading',\n seeding: 'Seeding',\n completed: 'Completed',\n resumed: 'Resumed',\n paused: 'Paused',\n active: 'Active',\n inactive: 'Inactive',\n errored: 'Errored',\n },\n\n torrent_state: {\n error: 'error',\n missingFiles: 'missingFiles',\n uploading: 'uploading',\n pausedUP: 'pausedUP',\n queuedUP: 'queuedUP',\n stalledUP: 'stalledUP',\n checkingUP: 'checkingUP',\n forcedUP: 'forcedUP',\n allocating: 'allocating',\n downloading: 'downloading',\n metaDL: 'metaDL',\n pausedDL: 'pausedDL',\n queuedDL: 'queuedDL',\n stalledDL: 'stalledDL',\n checkingDL: 'checkingDL',\n forceDL: 'forceDL',\n checkingResumeData: 'checkingResumeData',\n moving: 'moving',\n unknown: 'unknown',\n },\n}\n","/* eslint-disable @typescript-eslint/camelcase */\nexport default {\n lang: 'Русский',\n auto: 'Автоматически',\n\n close: 'Закрыть',\n no: 'Нет',\n yes: 'Да',\n cancel: 'Отмена',\n ok: 'ОК',\n\n start: 'Запустить',\n stop: 'Остановить',\n submit: 'Отправить',\n edit: 'Изменить',\n delete: 'Удалить',\n todo: 'Список дел',\n resume: 'Продолжить',\n pause: 'Приостановить',\n force_start: 'Запустить принудительно',\n info: 'Информация',\n reset: 'Сброс',\n login: 'Вход',\n search: 'Поиск',\n refresh: 'Обновить',\n location: 'Расположение',\n rename: 'Переименовать',\n trigger_application_shutdown: 'Выйти из qBittorrent',\n reannounce: 'Объявить повторно',\n recheck: 'Перепроверить',\n\n username: 'Имя пользователя',\n password: 'Пароль',\n\n name: 'Название',\n size: 'Размер',\n progress: 'Прогресс',\n status: 'Статус',\n seeds: 'Сиды',\n peers: 'Пиры',\n dl_speed: 'Качает',\n up_speed: 'Раздаёт',\n eta: 'Осталось',\n ratio: 'Ратио',\n added_on: 'Добавлен',\n\n settings: 'Настройки',\n logs: 'Логи',\n light: 'Светлый',\n dark: 'Тёмный',\n\n all: 'Все',\n category: 'Категория |||| Категории',\n uncategorized: 'Без категории',\n others: 'Другие',\n sites: 'Сайты',\n files: 'Файлы',\n less: 'Меньше',\n more: 'Больше',\n feed: 'Feed',\n date: 'Дата',\n query: 'Запрос',\n plugin: 'Плагин |||| Плагины',\n action: 'Действие |||| Действия',\n search_engine: 'Поисковый движок',\n usage: 'применение',\n plugin_manager: 'Управление плагинами',\n update_plugins: 'Обновить плагины',\n\n preferences: {\n change_applied: 'Настройки сохранены',\n downloads: 'Загрузки',\n adding_torrent: 'При добавлении торрента',\n create_subfolder_enabled: 'Создавать подпапку для торрентов со множеством файлов',\n start_paused_enabled: 'Не начинать загрузку автоматически',\n auto_delete_mode: 'Удалять торрент-файлы после добавления',\n preallocate_all: 'Предварительно резервировать место для всех файлов',\n incomplete_files_ext: 'Добавлять расширение .!qB к незавершённым файлам',\n saving_management: 'Управление сохранением',\n auto_tmm_enabled: 'Режим управления торрентом по умолчанию',\n torrent_changed_tmm_enabled: 'При изменении категории торрента',\n save_path_changed_tmm_enabled: 'При изменении пути сохранения по умолчанию',\n category_changed_tmm_enabled: 'При изменении пути сохранения категории',\n auto_mode: 'Автоматический',\n manual_mode: 'Ручной',\n switch_torrent_mode_to_manual: 'Переключить затронутые торренты в Ручной режим',\n move_affected_torrent: 'Переместить затронутые торренты',\n save_path: 'Путь сохранения по умолчанию',\n temp_path: 'Хранить незавершённые торренты в',\n export_dir: 'Копировать торрент-файлы в',\n export_dir_fin: 'Копировать торрент-файлы завершённых загрузок в',\n\n speed: 'Скорость',\n global_rate_limits: 'Общие ограничения скорости',\n alternate_rate_limits: 'Альтернативные ограничения скорости',\n alternate_schedule_enable_time: 'Запланировать использование особых ограничений скорости',\n dl_limit: 'Загрузка (KiB/s)',\n up_limit: 'Отдача (KiB/s)',\n zero_for_unlimited: '«0» — без ограничений',\n schedule_from: 'С',\n schedule_to: 'До',\n scheduler_days: 'Когда',\n limit_utp_rate: 'Применять ограничения скорости к протоколу µTP',\n limit_tcp_overhead: 'Применять ограничения скорости к служебному трафику',\n limit_lan_peers: 'Применять ограничения скорости к локальным пирам',\n\n webui: 'Веб-интерфейс',\n data_update_interval: 'Интервал обновления (ms)',\n webui_remote_control: 'Веб-интерфейс (удалённое управление)',\n ip_address: 'IP-адрес',\n ip_port: 'Порт',\n enable_upnp: 'Использовать UPnP / NAT-PMP для проброса порта через мой роутер',\n authentication: 'Аутентификация',\n web_ui_username: 'Имя пользователя',\n web_ui_password: 'Пароль',\n bypass_local_auth: 'Пропускать аутентификацию клиентов для localhost',\n bypass_auth_subnet_whitelist: 'Пропускать аутентификацию клиентов для разрешённых подсетей',\n web_ui_session_timeout: 'Таймаут сессии',\n web_ui_max_auth_fail_count: 'Блокировать клиента после серии сбоев',\n web_ui_ban_duration: 'заблокировать на',\n web_ui_seconds: 'секунд',\n new_password: 'Изменить текущий пароль...',\n\n display_speed_in_title: 'Показывать скорость загрузки в заголовке окна',\n },\n\n title: {\n _: 'Заголовок',\n add_torrents: 'Добавить торрент',\n delete_torrents: 'Удалить торрент',\n set_category: 'Установить категорию',\n edit_tracker: 'Изменить трекер',\n set_location: 'Установить расположение',\n recheck_torrents: 'Перепроверить торренты',\n },\n\n label: {\n switch_to_old_ui: 'Переключиться на старый интерфейс',\n create_subfolder: 'Создать подпапку',\n start_torrent: 'Запустить торрент',\n skip_hash_check: 'Пропустить проверку хеша',\n in_sequential_order: 'В последовательном порядке',\n first_and_last_pieces_first: 'Сначала первая и последняя часть',\n\n also_delete_files: 'Также удалить файлы',\n\n auto_tmm: 'Автоуправление торрентом',\n\n adding: 'Добавление…',\n reloading: 'Перезагрузка…',\n deleting: 'Удаление…',\n moving: 'Перемещение…',\n moved: 'Перемещено',\n next: 'Далее',\n back: 'Назад',\n confirm: 'Подтвердить',\n reannounced: 'Объявлен повторно',\n rechecking: 'Перепроверка…',\n dht_nodes: '%{smart_count} узел |||| Узлов: %{smart_count}',\n base_url: 'Базовый URL',\n },\n\n msg: {\n item_is_required: 'Требуется %{item}',\n },\n\n dialog: {\n trigger_exit_qb: {\n title: 'Выйти из qBittorrent',\n text: 'Выйти из qBittorrent?',\n },\n add_torrents: {\n placeholder: 'Начните скачивать торренты, переместив их сюда,\\nили нажмите кнопку вложения справа, чтобы выбрать.',\n hint: 'Одна ссылка на строку',\n },\n delete_torrents: {\n msg: 'Удалить выбранные торренты из списка передачи?',\n also_delete_same_name_torrents: 'Также удалить один торрент с тем же именем |||| Также удалить торренты с тем же именем (всего %{smart_count})',\n },\n set_category: {\n move: 'Переместить выбранные торренты в категорию %{category}?',\n reset: 'Вы уверены, что хотите сбросить категорию выбранных торрентов?',\n also_move_same_name_torrents: 'Также переместить один торрент с тем же именем |||| Также переместить торренты с тем же именем (всего %{smart_count})',\n },\n switch_locale: {\n msg: 'Переключить язык на %{lang}?\\nЭто действие перезагрузит страницу.',\n },\n recheck_torrents: {\n msg: 'Перепроверить торренты?',\n },\n rss: {\n add_feed: 'Добавить Feed',\n feed_url: 'Ссылка Feed',\n auto_refresh: 'Автообновление',\n auto_download: 'Автоскачивание',\n delete_feeds: 'Удалить выбранные каналы?',\n date_format: '%{date} (%{duration} назад)',\n },\n rss_rule: {\n add_rule: 'Добавить правило',\n new_rule_name: 'Название нового правила',\n delete_rule: 'Удалить выбранное правило?',\n title: 'Загрузчик RSS',\n rule_settings: 'Настройки правила',\n\n use_regex: 'Использовать регулярное выражение',\n must_contain: 'Должен содержать',\n must_not_contain: 'Не должен содержать',\n episode_filter: 'Фильтр эпизодов',\n smart_episode: 'Использовать умный фильтр эпизодов',\n assign_category: 'Назначить категорию',\n\n apply_to_feeds: 'Применить правило к Feed',\n },\n },\n\n category_state: {\n _: 'Статистика',\n\n downloading: 'Скачивается',\n seeding: 'Раздаётся',\n completed: 'Завершено',\n resumed: 'Возобновлён',\n paused: 'Приостановлен',\n active: 'Активный',\n inactive: 'Не активный',\n errored: 'Ошибочный',\n },\n\n torrent_state: {\n error: 'error',\n missingFiles: 'missingFiles',\n uploading: 'uploading',\n pausedUP: 'pausedUP',\n queuedUP: 'queuedUP',\n stalledUP: 'stalledUP',\n checkingUP: 'checkingUP',\n forcedUP: 'forcedUP',\n allocating: 'allocating',\n downloading: 'downloading',\n metaDL: 'metaDL',\n pausedDL: 'pausedDL',\n queuedDL: 'queuedDL',\n stalledDL: 'stalledDL',\n checkingDL: 'checkingDL',\n forceDL: 'forceDL',\n checkingResumeData: 'checkingResumeData',\n moving: 'moving',\n unknown: 'unknown',\n },\n}\n","/* eslint-disable @typescript-eslint/camelcase */\nexport default {\n lang: 'Türkçe',\n auto: 'Otomatik',\n\n close: 'Kapat',\n no: 'Hayır',\n yes: 'Evet',\n cancel: 'İptal',\n ok: 'Tamam',\n\n start: 'Başlat',\n stop: 'Durdur',\n submit: 'Tamam',\n edit: 'Düzenle',\n delete: 'Sil',\n todo: 'Yapılacak',\n resume: 'Devam Et',\n pause: 'Duraklat',\n force_start: 'Zorla Başlat',\n info: 'Bilgi',\n reset: 'Sıfırla',\n login: 'Oturum Aç',\n search: 'Ara',\n refresh: 'Yenile',\n location: 'Kaydetme yeri',\n rename: 'Yeniden adlandır',\n trigger_application_shutdown: 'qBittorrent\\'ten çık',\n reannounce: 'Yeniden Duyur',\n recheck: 'Yeniden Denetle',\n\n username: 'Kullanıcı Adı',\n password: 'Parola',\n\n name: 'Adı',\n size: 'Boyut',\n progress: 'İlerleme',\n status: 'Durum',\n seeds: 'Gönderim',\n peers: 'Kişi',\n dl_speed: 'İnd. Hızı',\n up_speed: 'Gön. Hızı',\n eta: 'TBS',\n ratio: 'Oran',\n added_on: 'Eklenme',\n\n settings: 'Ayarlar',\n logs: 'Günlükler',\n light: 'Aydınlık',\n dark: 'Karanlık',\n\n all: 'Tümü',\n category: 'Kategori |||| Kategoriler',\n uncategorized: 'Kategorilenmemiş',\n others: 'Diğerleri',\n sites: 'Siteler',\n files: 'Dosyalar',\n less: 'Daha Az',\n more: 'Daha Çok',\n feed: 'Bildirim',\n date: 'Tarih',\n query: 'Sorgu',\n plugin: 'Eklenti |||| Eklentiler',\n action: 'Eylem |||| Eylemler',\n search_engine: 'Arama motoru',\n usage: 'Kullanım',\n plugin_manager: 'Eklenti yöneticisi',\n\n title: {\n _: 'Başlık',\n add_torrents: 'Torrent ekle',\n delete_torrents: 'Torrent\\'leri sil',\n set_category: 'Kategtori ayarla',\n edit_tracker: 'İzleyicileri Düzenle',\n set_location: 'Yeri ayarla...',\n recheck_torrents: 'Torrent\\'leri yeniden denetle',\n },\n\n label: {\n switch_to_old_ui: 'Resmi Web Arayüzü\\'ne geç',\n create_subfolder: 'Alt klasör oluştur',\n start_torrent: 'Torrent\\'i başlat',\n skip_hash_check: 'Adresleme denetimini atla',\n in_sequential_order: 'Sıralı düzende indir',\n first_and_last_pieces_first: 'Önce ilk ve son parçaları indir',\n\n also_delete_files: 'Aynı zamanda sabit diskteki dosyaları da sil',\n\n auto_tmm: 'Otomatik Torrent Yönetimi',\n\n adding: 'Ekleniyor…',\n reloading: 'Yeniden yükleniyor…',\n deleting: 'Siliniyor…',\n moving: 'Taşınıyor…',\n moved: 'Taşındı.',\n next: 'İleri',\n back: 'Geri',\n confirm: 'Onayla',\n reannounced: 'Yeniden duyuruldu.',\n rechecking: 'Yeniden denetleniyor…',\n dht_nodes: '%{smart_count} düğüm |||| %{smart_count} düğüm',\n base_url: 'Ana makine URL',\n },\n\n msg: {\n item_is_required: '%{item} gerekli!',\n },\n\n dialog: {\n trigger_exit_qb: {\n title: 'qBittorrent\\'ten Çık',\n text: 'qBittorrent uygulamasından çıkmak istediğinize emin misiniz?',\n },\n add_torrents: {\n placeholder: 'Torrentleri yüklemek için\\nlinkleri buraya girin\\nveya sağdaki ataç butonuna tıklayıp seçim yapın.',\n hint: 'Her satıra sadece bir bağlantı',\n },\n delete_torrents: {\n msg: 'Seçilen torrent\\'leri aktarım listesinden silmek istediğinize emin misiniz?',\n also_delete_same_name_torrents: 'Aynı zamanda, aynı isimli bir torrenti de sil. |||| Aynı zamanda, aynı isimli %{smart_count} torrentleri de sil.',\n },\n set_category: {\n move: 'Seçilmiş torrentlerin kategorilerini, %{category} olarak değiştirmek istediğinize emin misiniz?',\n reset: 'Seçilmiş torrentlerin kategorilerini sıfırlamak istediğinize emin misiniz?',\n also_move_same_name_torrents: 'Aynı zamanda, aynı isimli bir torrenti de taşı. |||| Aynı zamanda, aynı isimli %{smart_count} torrentleri de taşı.',\n },\n switch_locale: {\n msg: 'Dili %{lang} olarak değiştirmek istediğinize emin misiniz?\\nBu eylem sayfayı yeniden yükleyecek.',\n },\n recheck_torrents: {\n msg: 'Torrentleri yeniden denetlemek istediğinize emin misiniz?',\n },\n rss: {\n add_feed: 'Bildirim ekle',\n feed_url: 'Bildirim URL\\'si',\n auto_refresh: 'Otomatik yenile',\n auto_download: 'Otomatik indir',\n delete_feeds: 'Seçilmiş bildirimlerin silmek istediğinize emin misiniz?',\n date_format: '%{date} (%{duration} önce)',\n },\n rss_rule: {\n add_rule: 'Yeni kural ekle',\n new_rule_name: 'Yeni kural adı',\n delete_rule: 'Seçilmiş kuralları silmek istediğinize emin misiniz?',\n title: 'RSS indirici',\n rule_settings: 'Kural ayarları',\n\n use_regex: 'Regex kullan',\n must_contain: 'İçermeli',\n must_not_contain: 'İçermemeli',\n episode_filter: 'Bölüm süzgeci',\n smart_episode: 'Akıllı bölüm süzgeci kullan',\n assign_category: 'Kategori ata',\n\n apply_to_feeds: 'Kuralı bildirimlere uygula',\n },\n },\n\n state: {\n _: 'Durum',\n\n downloading: 'İndiriliyor',\n seeding: 'Gönderiliyor',\n completed: 'Tamamlandı',\n resumed: 'Devam Edildi',\n paused: 'Duraklatıldı',\n active: 'Etkin',\n inactive: 'Etkin Değil',\n errored: 'Hata Oldu',\n },\n}\n","/* eslint-disable @typescript-eslint/camelcase */\nexport default {\n lang: '简体中文',\n auto: '自动',\n\n close: '关闭',\n no: '否',\n yes: '是',\n cancel: '取消',\n ok: '确定',\n\n start: '开始',\n stop: '停止',\n submit: '提交',\n edit: '编辑',\n delete: '删除',\n todo: '待办',\n resume: '恢复',\n pause: '暂停',\n force_start: '强制继续',\n info: '信息',\n reset: '重置',\n login: '登录',\n search: '搜索',\n refresh: '刷新',\n location: '位置',\n rename: '重命名',\n trigger_application_shutdown: '退出qBittorrent',\n reannounce: '重新通告',\n recheck: '重新检查',\n\n username: '用户名',\n password: '密码',\n\n name: '名称',\n size: '大小',\n progress: '进度',\n status: '状态',\n seeds: '做种',\n peers: '用户',\n dl_speed: '下载速度',\n up_speed: '上传速度',\n eta: '剩余时间',\n ratio: '比率',\n added_on: '添加时间',\n\n settings: '设置',\n\n logs: '日志',\n light: '亮色',\n dark: '暗色',\n\n all: '全部',\n category: '分类',\n uncategorized: '未分类',\n tag: '标签',\n untagged: '无标签',\n others: '其他',\n sites: '站点',\n files: '文件',\n less: '更少',\n more: '更多',\n feed: '订阅',\n date: '日期',\n query: '查询',\n plugin: '插件',\n action: '操作',\n search_engine: '搜索引擎',\n\n preferences: {\n change_applied: '配置已保存',\n downloads: '下载',\n adding_torrent: '添加 torrent 时',\n create_subfolder_enabled: '为多个文件的 Torrent 创建子目录',\n start_paused_enabled: '不要自动开始下载',\n auto_delete_mode: '完成后删除 .torrent 文件',\n preallocate_all: '为所有文件预分配磁盘空间',\n incomplete_files_ext: '为不完整的文件添加扩展名 .!qB',\n saving_management: '保存管理',\n auto_tmm_enabled: '默认 Torrent 管理模式',\n torrent_changed_tmm_enabled: '当 Torrent 分类修改时',\n save_path_changed_tmm_enabled: '当默认保存路径修改时',\n category_changed_tmm_enabled: '当分类保存路径修改时',\n auto_mode: '自动',\n manual_mode: '手动',\n switch_torrent_mode_to_manual: '切换受影响的 Torrent 至手动模式',\n move_affected_torrent: '重新定位受影响的 Torrent',\n save_path: '默认保存路径',\n temp_path: '保存未完成的 torrent 到',\n export_dir: '复制 .torrent 文件到',\n export_dir_fin: '复制下载完成的 .torrent 文件到',\n\n speed: '速度',\n global_rate_limits: '全局速度限制',\n alternate_rate_limits: '备用速度限制',\n alternate_schedule_enable_time: '设置备用速度限制的启用时间',\n apply_speed_limit: '设置速度限制',\n dl_limit: '下载 (KiB/s)',\n up_limit: '上传 (KiB/s)',\n zero_for_unlimited: '0 为无限制',\n schedule_from: '从',\n schedule_to: '到',\n scheduler_days: '时间',\n limit_utp_rate: '对 µTP 协议进行速度限制',\n limit_tcp_overhead: '对传送总开销进行速度限制',\n limit_lan_peers: '对本地网络用户进行速度限制',\n\n connection: '连接',\n bittorrent: 'BitTorrent',\n\n rss_processing_enabled: '启用自动刷新',\n rss_auto_downloading_enabled: '启用自动下载种子',\n rss_refresh_interval: '订阅刷新间隔',\n\n webui: 'Web UI',\n data_update_interval: '数据更新频率(ms)',\n webui_remote_control: 'Web 用户界面(远程控制)',\n ip_address: 'IP 地址',\n ip_port: '端口',\n enable_upnp: '使用我的路由器的 UPnP / NAT-PMP 功能来转发端口',\n authentication: '验证',\n web_ui_username: '用户名',\n web_ui_password: '密码',\n bypass_local_auth: '对本地主机上的客户端跳过身份验证',\n bypass_auth_subnet_whitelist: '对 IP 子网白名单中的客户端跳过身份验证',\n web_ui_session_timeout: '会话超时',\n web_ui_ban_duration: '禁止',\n web_ui_max_auth_fail_count: '连续失败后禁止客户端次数',\n web_ui_seconds: '秒',\n new_password: '更改当前的密码...',\n\n display_speed_in_title: '在网页标题显示当前速度',\n },\n\n title: {\n _: '标题',\n add_torrents: '添加种子',\n delete_torrents: '删除种子',\n set_category: '设置分类',\n edit_tracker: '编辑 Tracker',\n set_location: '修改文件位置',\n recheck_torrents: '重新检查种子',\n },\n\n label: {\n switch_to_old_ui: '切换到原版 UI',\n create_subfolder: '创建子文件夹',\n start_torrent: '开始种子',\n skip_hash_check: '跳过哈希校验',\n in_sequential_order: '按顺序下载',\n first_and_last_pieces_first: '先下载首尾文件块',\n\n also_delete_files: '同时删除文件',\n\n auto_tmm: '自动种子管理',\n\n adding: '添加…',\n reloading: '刷新中…',\n deleting: '删除中…',\n moving: '移动中…',\n moved: '已移动',\n next: '下一步',\n back: '返回',\n confirm: '确定',\n reannounced: '已重新通告',\n rechecking: '重新检查中…',\n dht_nodes: '%{smart_count} 节点',\n },\n\n msg: {\n 'item_is_required': '%{item}不能为空',\n },\n\n dialog: {\n trigger_exit_qb: {\n title: '退出 qBittorrent',\n text: '您确定要退出qBittorrent吗?',\n },\n add_torrents: {\n placeholder: '将种子拖到这里上传,\\n或者点击右边的附件图标来选择。',\n hint: '每行一个链接',\n },\n delete_torrents: {\n msg: '确定要删除选中的种子吗?',\n also_delete_same_name_torrents: '同时删除 %{smart_count} 个同名的种子',\n },\n set_category: {\n move: '确定要移动选中的种子到分类 %{category} 吗?',\n reset: '确定重置选中的种子的分类吗?',\n also_move_same_name_torrents: '同时移动 %{smart_count} 个同名的种子',\n },\n switch_locale: {\n msg: '确定要切换语言为 %{lang} 吗?\\n这将会刷新页面。',\n },\n recheck_torrents: {\n msg: '确定要重新检查选中的种子吗?',\n },\n rss: {\n add_feed: '添加订阅',\n feed_url: '订阅 URL',\n auto_refresh: '自动刷新',\n auto_download: '自动下载',\n delete_feeds: '确定要删除选中的订阅吗?',\n date_format: '%{date}(%{duration} 之前)',\n },\n rss_rule: {\n add_rule: '添加规则',\n new_rule_name: '新规则的名称',\n delete_rule: '确定要删除选中的规则吗?',\n title: 'RSS 自动下载',\n rule_settings: '规则设置',\n\n use_regex: '使用正则',\n must_contain: '必须包含',\n must_not_contain: '必须排除',\n episode_filter: '剧集过滤',\n smart_episode: '使用智能剧集过滤',\n assign_category: '分配分类',\n\n apply_to_feeds: '应用到订阅',\n },\n },\n\n category_state: {\n _: '状态',\n\n downloading: '下载',\n seeding: '做种',\n completed: '完成',\n resumed: '恢复',\n paused: '暂停',\n active: '活动',\n inactive: '空闲',\n errored: '错误',\n },\n\n torrent_state: {\n error: '错误',\n missingFiles: '文件丢失',\n uploading: '上传中',\n pausedUP: '完成',\n queuedUP: '排队上传',\n stalledUP: '上传',\n checkingUP: '上传校验',\n forcedUP: '强制上传',\n allocating: '分配空间',\n downloading: '下载中',\n metaDL: '获取信息',\n pausedDL: '暂停下载',\n queuedDL: '排队下载',\n stalledDL: '下载',\n checkingDL: '下载校验',\n forceDL: '强制下载',\n checkingResumeData: '快速校验',\n moving: '移动中',\n unknown: '未知',\n },\n}\n","/* eslint-disable @typescript-eslint/camelcase */\nexport default {\n lang: '繁體中文',\n auto: '自動',\n\n close: '關閉',\n no: '否',\n yes: '是',\n cancel: '取消',\n ok: '確定',\n\n start: '開始',\n stop: '停止',\n submit: '提交',\n edit: '編輯',\n delete: '刪除',\n todo: '待辦',\n resume: '恢復',\n pause: '暫停',\n force_start: '強制繼續',\n info: '資訊',\n reset: '重置',\n login: '登入',\n search: '搜索',\n refresh: '刷新',\n location: '位置',\n rename: '重新命名',\n trigger_application_shutdown: '退出qBittorrent',\n reannounce: '重新通告',\n recheck: '重新檢查',\n\n username: '使用者名稱',\n password: '密碼',\n\n name: '名稱',\n size: '大小',\n progress: '進度',\n status: '狀態',\n seeds: '做種',\n peers: '用戶',\n dl_speed: '下載速度',\n up_speed: '上傳速度',\n eta: '剩餘時間',\n ratio: '分享率',\n added_on: '添加時間',\n\n settings: '設定',\n\n logs: '日誌',\n light: '亮色',\n dark: '暗色',\n\n all: '全部',\n category: '分類',\n uncategorized: '未分類',\n others: '其他',\n sites: '站點',\n files: '文件',\n less: '更少',\n more: '更多',\n feed: '訂閱',\n date: '日期',\n query: '查詢',\n plugin: '插件',\n action: '操作',\n search_engine: '搜尋引擎',\n\n preferences: {\n change_applied: '設定已保存',\n downloads: '下載',\n adding_torrent: '添加 Torrent 時',\n create_subfolder_enabled: '為多個文件的 Torrent 創建子目錄',\n start_paused_enabled: '不要自動開始下載',\n auto_delete_mode: '完成後刪除 .torrent 文件',\n preallocate_all: '為所有文件預分配磁碟空間',\n incomplete_files_ext: '為不完整的文件添加副檔名 .!qB',\n saving_management: '保存管理',\n auto_tmm_enabled: '默認 Torrent 管理模式',\n torrent_changed_tmm_enabled: '當 Torrent 分類修改時',\n save_path_changed_tmm_enabled: '當默認保存路徑修改時',\n category_changed_tmm_enabled: '當分類保存路徑修改時',\n auto_mode: '自動',\n manual_mode: '手動',\n switch_torrent_mode_to_manual: '切換受影響的 Torrent 至手動模式',\n move_affected_torrent: '重新定位受影響的 Torrent',\n save_path: '默認保存路徑',\n temp_path: '保存未完成的 torrent 到',\n export_dir: '複製 .torrent 文件到',\n export_dir_fin: '複製下載完成的 .torrent 文件到',\n\n speed: '速度',\n global_rate_limits: '全局速度限制',\n alternate_rate_limits: '備用速度限制',\n alternate_schedule_enable_time: '設定備用速度限制的啟用時間',\n apply_speed_limit: '設定速度限制',\n dl_limit: '下載 (KiB/s)',\n up_limit: '上傳 (KiB/s)',\n zero_for_unlimited: '0 為無限制',\n schedule_from: '從',\n schedule_to: '到',\n scheduler_days: '時間',\n limit_utp_rate: '對 µTP 協議進行速度限制',\n limit_tcp_overhead: '對傳送總開銷進行速度限制',\n limit_lan_peers: '對本地網路用戶進行速度限制',\n\n connection: '連接',\n bittorrent: 'BitTorrent',\n\n webui: 'Web UI',\n data_update_interval: '數據更新頻率(ms)',\n webui_remote_control: 'Web 用戶界面(遠端控制)',\n ip_address: 'IP 地址',\n ip_port: '埠',\n enable_upnp: '使用我的路由器的 UPnP / NAT-PMP 功能來轉發埠',\n authentication: '驗證',\n web_ui_username: '使用者名稱',\n web_ui_password: '密碼',\n bypass_local_auth: '對本地主機上的用戶端跳過身份驗證',\n bypass_auth_subnet_whitelist: '對 IP 子網白名單中的用戶端跳過身份驗證',\n web_ui_session_timeout: '會話超時',\n web_ui_ban_duration: '禁止',\n web_ui_max_auth_fail_count: '連續失敗後禁止用戶端次數',\n web_ui_seconds: '秒',\n new_password: '更改當前的密碼...',\n\n display_speed_in_title: '在網頁標題顯示當前速度',\n },\n\n title: {\n _: '標題',\n add_torrents: '添加種子',\n delete_torrents: '刪除種子',\n set_category: '設定分類',\n edit_tracker: '編輯 Tracker',\n set_location: '修改檔案位置',\n recheck_torrents: '重新檢查種子',\n },\n\n label: {\n switch_to_old_ui: '切換到原版 UI',\n create_subfolder: '創建子文件夾',\n start_torrent: '開始種子',\n skip_hash_check: '跳過哈希校驗',\n in_sequential_order: '按順序下載',\n first_and_last_pieces_first: '先下載首尾文件塊',\n\n also_delete_files: '同時刪除文件',\n\n auto_tmm: '自動種子管理',\n\n adding: '添加…',\n reloading: '刷新中…',\n deleting: '刪除中…',\n moving: '移動中…',\n moved: '已移動',\n next: '下一步',\n back: '返回',\n confirm: '確定',\n reannounced: '已重新通告',\n rechecking: '重新檢查中…',\n dht_nodes: '%{smart_count} 節點',\n },\n\n msg: {\n 'item_is_required': '%{item}不能為空',\n },\n\n dialog: {\n trigger_exit_qb: {\n title: '退出 qBittorrent',\n text: '您確定要退出qBittorrent嗎?',\n },\n add_torrents: {\n placeholder: '將種子拖到這裡上傳,\\n或者點擊右邊的附件圖示來選擇。',\n hint: '每行一個連結',\n },\n delete_torrents: {\n msg: '確定要刪除選中的種子嗎?',\n also_delete_same_name_torrents: '同時刪除 %{smart_count} 個同名的種子',\n },\n set_category: {\n move: '確定要移動選中的種子到分類 %{category} 嗎?',\n reset: '確定重置選中的種子的分類嗎?',\n also_move_same_name_torrents: '同時移動 %{smart_count} 個同名的種子',\n },\n switch_locale: {\n msg: '確定要切換语言為 %{lang} 嗎?\\n這將會刷新頁面。',\n },\n recheck_torrents: {\n msg: '確定要重新檢查選中的種子嗎?',\n },\n rss: {\n add_feed: '添加訂閱',\n feed_url: '訂閱 URL',\n auto_refresh: '自動刷新',\n auto_download: '自動下載',\n delete_feeds: '確定要刪除選中的訂閱嗎?',\n date_format: '%{date}(%{duration} 之前)',\n },\n rss_rule: {\n add_rule: '添加規則',\n new_rule_name: '新規則的名稱',\n delete_rule: '確定要刪除選中的規則嗎?',\n title: 'RSS 自動下載',\n rule_settings: '規則設定',\n\n use_regex: '使用正則',\n must_contain: '必須包含',\n must_not_contain: '必須排除',\n episode_filter: '劇集過濾',\n smart_episode: '使用智慧劇集過濾',\n assign_category: '分配分類',\n\n apply_to_feeds: '應用到訂閱',\n },\n },\n\n category_state: {\n _: '狀態',\n\n downloading: '下載',\n seeding: '做種',\n completed: '完成',\n resumed: '恢復',\n paused: '暫停',\n active: '活動',\n inactive: '空閒',\n errored: '錯誤',\n },\n\n torrent_state: {\n error: '錯誤',\n missingFiles: '文件遺失',\n uploading: '上傳中',\n pausedUP: '完成',\n queuedUP: '排隊上傳',\n stalledUP: '上傳',\n checkingUP: '上傳校驗',\n forcedUP: '強制上傳',\n allocating: '分配空間',\n downloading: '下載中',\n metaDL: '獲取資訊',\n pausedDL: '暫停下載',\n queuedDL: '排隊下載',\n stalledDL: '下載',\n checkingDL: '下載校驗',\n forceDL: '強制下載',\n checkingResumeData: '快速校驗',\n moving: '移動中',\n unknown: '未知',\n },\n}\n","import { isPlainObject, merge } from 'lodash';\nimport Vue from 'vue';\nimport { Module } from 'vuex';\nimport { ConfigState, ConfigPayload } from './types';\n\nconst configKey = 'qb-config';\n\nexport interface Config {\n baseUrl: string | null;\n updateInterval: number;\n pageOptions: any;\n filter: {\n state: string | null;\n category: string | null;\n site: string | null;\n query: string | null;\n };\n locale: string | null;\n darkMode: string | null;\n displaySpeedInTitle: boolean | null;\n}\n\nconst defaultConfig = {\n baseUrl: null,\n updateInterval: 2000,\n pageOptions: {\n itemsPerPage: 50,\n },\n filter: {\n state: null,\n category: null,\n site: null,\n query: null,\n },\n locale: null,\n darkMode: null,\n displaySpeedInTitle: false,\n};\n\nfunction saveConfig(obj: any) {\n localStorage.setItem(configKey, JSON.stringify(obj));\n}\n\nexport function loadConfig(): Partial {\n const tmp = localStorage.getItem(configKey);\n if (!tmp) {\n return {};\n }\n\n return JSON.parse(tmp);\n}\n\nexport const configStore: Module = {\n state() {\n return {\n userConfig: loadConfig(),\n };\n },\n mutations: {\n updateConfig(state, payload: ConfigPayload) {\n const { key, value } = payload;\n if (isPlainObject(value)) {\n const tmp = merge({}, state.userConfig[key], value);\n Vue.set(state.userConfig, key, tmp);\n } else {\n Vue.set(state.userConfig, key, value);\n }\n\n saveConfig(state.userConfig);\n },\n },\n getters: {\n config(state) {\n return merge({}, defaultConfig, state.userConfig);\n },\n },\n};\n","import Polyglot from 'node-polyglot';\nimport langEn from './en';\nimport langRu from './ru';\nimport langTr from './tr';\nimport langZhCn from './zh-CN';\nimport langZhTw from './zh-TW';\n\nimport { loadConfig } from '@/store/config';\n\nexport const translations = {\n en: langEn,\n 'ru': langRu,\n 'tr': langTr,\n 'zh-CN': langZhCn,\n 'zh-TW': langZhTw,\n}\n\nexport type LocaleKey = keyof typeof translations | null;\n\nconst polyglot = new Polyglot({\n phrases: translations.en,\n});\n\nfunction matchLocale() {\n const { languages } = navigator;\n\n for (const code of languages) {\n if (code in translations) {\n return (code as LocaleKey)!;\n }\n }\n\n return 'en'\n}\n\nexport const defaultLocale = matchLocale()\n\nfunction updateLocale() {\n let locale = loadConfig()['locale'] as LocaleKey;\n\n if (!locale) {\n locale = defaultLocale;\n }\n\n if (locale === polyglot.locale()) {\n return;\n }\n\n polyglot.locale(locale);\n polyglot.extend(translations[locale]);\n}\n\nupdateLocale();\n\nexport default polyglot;\nexport const tr = polyglot.t.bind(polyglot);\nexport { updateLocale };\n","import Vue from 'vue';\nimport { tr } from '@/locale';\n\nclass I18n {\n static install() {\n Vue.prototype.$t = tr;\n }\n}\n\nVue.use(I18n);\n","import Vue from 'vue';\nimport VueCompositionApi from '@vue/composition-api';\n\nVue.use(VueCompositionApi);\n","import Vue from 'vue';\nimport Vuetify from 'vuetify/lib';\nimport i18n from '@/locale';\n\nVue.use(Vuetify);\n\nlet locale = i18n.locale();\nswitch (locale) {\n case 'zh-CN':\n locale = 'zh-Hans';\n break;\n case 'zh-TW':\n locale = 'zh-Hant';\n break;\n default:\n locale = locale.split('-', 1)[0];\n break;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst { default: translation } = require('vuetify/src/locale/' + locale);\n\nexport default new Vuetify({\n lang: {\n locales: { [locale]: translation },\n current: locale,\n },\n icons: {\n iconfont: 'mdi',\n },\n});\n","export const enum StateType {\n Downloading = 'downloading',\n Seeding = 'seeding',\n Completed = 'completed',\n Resumed = 'resumed',\n Paused = 'pasued',\n Active = 'active',\n Inactive = 'inactive',\n Errored = 'errored',\n}\n\nexport const AllStateTypes = [\n StateType.Downloading,\n StateType.Seeding,\n StateType.Completed,\n StateType.Resumed,\n StateType.Paused,\n StateType.Active,\n StateType.Inactive,\n StateType.Errored,\n];\n","import { merge, cloneDeep } from 'lodash'\nimport { Module } from 'vuex';\nimport { DialogState } from './types';\n\nexport const dialogStore: Module = {\n state() {\n return {\n config: null,\n };\n },\n mutations: {\n showDialog(state, payload) {\n state.config = cloneDeep(payload);\n },\n closeDialog(state) {\n state.config = null;\n },\n },\n actions: {\n asyncShowDialog({ commit }, payload) {\n return new Promise((resolve) => {\n const options = merge({}, payload, {\n callback: resolve,\n })\n\n commit('showDialog', options);\n })\n },\n },\n};\n","import { cloneDeep, isString } from 'lodash';\nimport { Module } from 'vuex';\nimport { SnackBarState } from './types';\n\nexport const snackBarStore: Module = {\n state() {\n return {\n config: null,\n };\n },\n mutations: {\n showSnackBar(state, payload) {\n if (isString(payload)) {\n state.config = {\n text: payload,\n };\n } else {\n state.config = cloneDeep(payload);\n }\n },\n closeSnackBar(state) {\n state.config = null;\n },\n },\n};\n","import { Module } from 'vuex';\nimport { AddFormState } from './types';\n\nexport const addFormStore: Module = {\n state() {\n return {\n isOpen: false,\n downloadItem: null,\n };\n },\n getters: {\n isOpen(state) {\n return state.isOpen;\n },\n },\n mutations: {\n openAddForm(state) {\n state.isOpen = true;\n },\n closeAddForm(state) {\n state.isOpen = false;\n state.downloadItem = null;\n },\n addFormDownloadItem(state, payload) {\n const { downloadItem } = payload;\n state.downloadItem = downloadItem;\n },\n },\n};\n","import { StateType } from '@/consts';\nimport { Torrent } from '@/types';\n\nconst dlState = ['downloading', 'metaDL', 'stalledDL', 'checkingDL', 'pausedDL', 'queuedDL', 'forcedDL', 'allocating'];\nconst upState = ['uploading', 'stalledUP', 'checkingUP', 'queuedUP', 'forcedUP'];\nconst completeState = ['uploading', 'stalledUP', 'checkingUP', 'pausedUP', 'queuedUP', 'forcedUP'];\nconst activeState = ['metaDL', 'downloading', 'forcedDL', 'uploading', 'forcedUP', 'moving'];\nconst errorState = ['error', 'missingFiles'];\n\nexport function torrentIsState(type: StateType, state: string) {\n let result;\n switch (type) {\n case StateType.Downloading: {\n result = dlState.includes(state);\n break;\n }\n case StateType.Seeding: {\n result = upState.includes(state);\n break;\n }\n case StateType.Completed: {\n result = completeState.includes(state);\n break;\n }\n case StateType.Resumed:\n case StateType.Paused: {\n const paused = state.startsWith('paused');\n result = type === StateType.Paused ? paused : !paused;\n break;\n }\n case StateType.Active:\n case StateType.Inactive: {\n const active = activeState.includes(state);\n result = type === StateType.Active ? active : !active;\n break;\n }\n case StateType.Errored: {\n result = errorState.includes(state);\n break;\n }\n default:\n throw Error('Invalid type');\n }\n\n return result;\n}\n\nexport function timeout(ms: number) {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n/**\n * @deprecated renamed to `timeout`\n */\nexport const sleep = timeout;\n\nexport function codeToFlag(code: string) {\n const magicNumber = 0x1F1A5;\n\n // eslint-disable-next-line\n code = code.toUpperCase();\n const codePoints = [...code].map(c => magicNumber + c.charCodeAt(0));\n const char = String.fromCodePoint(...codePoints);\n const url = 'https://cdn.jsdelivr.net/npm/twemoji/2/svg/'\n + `${codePoints[0].toString(16)}-${codePoints[1].toString(16)}.svg`;\n\n return {\n char,\n url,\n };\n}\n\nexport const isWindows = navigator.userAgent.includes('Windows');\n\nexport function findSameNamedTorrents(allTorrents: Torrent[], torrents: Torrent[]) {\n const hashes = torrents.map(t => t.hash);\n const result = [];\n for (const t1 of torrents) {\n for (const t2 of allTorrents) {\n if (hashes.includes(t2.hash)) {\n continue;\n }\n\n if (t1.name !== t2.name) {\n continue;\n }\n\n result.push(t2);\n hashes.push(t2.hash);\n }\n }\n\n return result;\n}\n\nexport function typed(value: T): T {\n return value;\n}\n","/* eslint-disable @typescript-eslint/camelcase */\nimport Axios, { AxiosInstance, AxiosPromise, AxiosResponse } from 'axios';\nimport {\n RssNode,\n RssRule,\n SearchPlugin,\n ApiCategory,\n SearchTaskResponse,\n Preferences,\n MainData,\n} from '@/types'\n\nconst apiEndpoint = 'api/v2';\n\nclass Api {\n private axios: AxiosInstance;\n\n constructor() {\n this.axios = Axios.create({\n baseURL: apiEndpoint,\n withCredentials: true,\n });\n\n this.axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';\n }\n\n private normalizeBaseUrl(baseUrl?: string) {\n if (!baseUrl) {\n return apiEndpoint;\n }\n\n if (!baseUrl.endsWith('/')) {\n baseUrl += '/';\n }\n\n return baseUrl + apiEndpoint;\n }\n\n public changeBaseUrl(baseUrl: string) {\n this.axios.defaults.baseURL = this.normalizeBaseUrl(baseUrl);\n }\n\n public getAppVersion() {\n return this.axios.get('/app/version');\n }\n\n public getApiVersion() {\n return this.axios.get('/app/webapiVersion');\n }\n\n public login(params: any, baseUrl?: string) {\n const data = new URLSearchParams(params);\n return this.axios.post('/auth/login', data, {\n validateStatus(status) {\n return status === 200 || status === 403;\n },\n baseURL: this.normalizeBaseUrl(baseUrl),\n }).then(Api.handleResponse);\n }\n\n public getGlobalTransferInfo() {\n return this.axios.get('/transfer/info');\n }\n\n public getAppPreferences(): AxiosPromise {\n return this.axios.get('/app/preferences');\n }\n\n public shutdownApplication() {\n return this.axios.post('/app/shutdown');\n }\n\n public getMainData(rid?: number): AxiosPromise {\n const params = {\n rid,\n };\n return this.axios.get('/sync/maindata', {\n params,\n });\n }\n\n public addTorrents(params: Record, torrents?: any) {\n let data: any;\n if (torrents) {\n const formData = new FormData();\n for (const [key, value] of Object.entries(params)) {\n // eslint-disable-next-line\n formData.append(key, value);\n }\n\n for (const torrent of torrents) {\n formData.append('torrents', torrent);\n }\n\n data = formData;\n } else {\n data = new URLSearchParams(params);\n }\n return this.axios.post('/torrents/add', data).then(Api.handleResponse);\n }\n\n public switchToOldUi() {\n const params = {\n alternative_webui_enabled: false,\n };\n\n return this.setPreferences(params)\n }\n\n public setPreferences(params: any) {\n const data = new URLSearchParams({\n json: JSON.stringify(params),\n });\n\n return this.axios.post('/app/setPreferences', data);\n }\n\n public setTorrentFilePriority(hash: string, idList: Array, priority: number) {\n const idListStr = idList.join('|');\n const params: any = {\n hash,\n id: idListStr,\n priority,\n }\n\n const data = new URLSearchParams(params);\n return this.axios.post(`/torrents/filePrio`, data).then(Api.handleResponse);\n }\n\n public getLogs(lastId?: number) {\n const params = {\n last_known_id: lastId,\n };\n\n return this.axios.get('/log/main', {\n params,\n }).then(Api.handleResponse);\n }\n\n public toggleSpeedLimitsMode() {\n return this.axios.post('/transfer/toggleSpeedLimitsMode');\n }\n\n public deleteTorrents(hashes: string[], deleteFiles: boolean) {\n return this.actionTorrents('delete', hashes, { deleteFiles });\n }\n\n public pauseTorrents(hashes: string[]) {\n return this.actionTorrents('pause', hashes);\n }\n\n public resumeTorrents(hashes: string[]) {\n return this.actionTorrents('resume', hashes);\n }\n\n public setForceStartTorrents(hashes: string[]) {\n return this.actionTorrents('setForceStart', hashes, { value: 'true' });\n }\n\n public toggleSequentialTorrents(hashes: string[]) {\n return this.actionTorrents('toggleSequentialDownload', hashes);\n }\n\n public reannounceTorrents(hashes: string[]) {\n return this.actionTorrents('reannounce', hashes);\n }\n\n public recheckTorrents(hashes: string[]) {\n return this.actionTorrents('recheck', hashes);\n }\n\n public setTorrentsCategory(hashes: string[], category: string) {\n return this.actionTorrents('setCategory', hashes, { category });\n }\n\n public getTorrentTracker(hash: string) {\n return this.actionTorrent('trackers', hash);\n }\n\n public getTorrentPeers(hash: string, rid?: number) {\n const params = {\n hash,\n rid,\n };\n\n return this.axios.get('/sync/torrentPeers', {\n params,\n }).then(Api.handleResponse);\n }\n\n public editTracker(hash: string, origUrl: string, newUrl: string) {\n return this.actionTorrent('editTracker', hash, { origUrl, newUrl });\n }\n\n public setTorrentLocation(hashes: string[], location: string) {\n return this.actionTorrents('setLocation', hashes, { location });\n }\n\n public getTorrentProperties(hash: string) {\n const params = {\n hash,\n };\n\n return this.axios.get('/torrents/properties', {\n params,\n }).then(Api.handleResponse);\n }\n\n public getTorrentPieceStates(hash: string) {\n const params = {\n hash,\n };\n\n return this.axios.get('/torrents/pieceStates', {\n params,\n }).then(Api.handleResponse);\n }\n\n public getTorrentFiles(hash: string) {\n const params = {\n hash,\n };\n\n return this.axios.get('/torrents/files', {\n params,\n }).then(Api.handleResponse);\n }\n\n public getRssItems(): Promise {\n const params = {\n withData: true,\n }\n\n return this.axios.get('/rss/items', {\n params,\n }).then(Api.handleResponse);\n }\n\n public addRssFeed(url: string, path = '') {\n const params: any = {\n url,\n path,\n }\n\n const data = new URLSearchParams(params)\n return this.axios.post('/rss/addFeed', data).then(Api.handleResponse);\n }\n\n public removeRssFeed(path: string) {\n const params: any = {\n path,\n }\n\n const data = new URLSearchParams(params)\n return this.axios.post('/rss/removeItem', data).then(Api.handleResponse);\n }\n\n public refreshRssFeed(path: string) {\n const params: any = {\n itemPath: path,\n }\n\n const data = new URLSearchParams(params)\n return this.axios.post('/rss/refreshItem', data).then(Api.handleResponse);\n }\n\n public moveRssFeed(path: string, newPath: string) {\n const params: any = {\n itemPath: path,\n destPath: newPath,\n }\n\n const data = new URLSearchParams(params)\n return this.axios.post('/rss/moveItem', data).then(Api.handleResponse);\n }\n\n public getRssRules(): Promise<{ [key: string]: RssRule }> {\n return this.axios.get('/rss/rules').then(Api.handleResponse);\n }\n\n public setRssRule(name: string, def: any = {}) {\n const params: any = {\n ruleName: name,\n ruleDef: JSON.stringify(def),\n }\n\n const data = new URLSearchParams(params)\n return this.axios.post('/rss/setRule', data).then(Api.handleResponse);\n }\n\n public removeRssRule(name: string) {\n const params: any = {\n ruleName: name,\n }\n\n const data = new URLSearchParams(params)\n return this.axios.post('/rss/removeRule', data).then(Api.handleResponse);\n }\n\n // Search page\n\n public updateSearchPlugins(): Promise {\n return this.axios.post('/search/updatePlugins').then(Api.handleResponse);\n }\n\n public getSearchPlugins(): Promise {\n return this.axios.get('/search/plugins').then(Api.handleResponse);\n }\n\n /**\n * @see getSearchCategories\n * When there are no categories available/set\n * @returns a Promise<{}> instead of Promise<[]>.\n */\n public getSearchCategories(): Promise {\n return this.axios.get('/torrents/categories').then(Api.handleResponse);\n }\n\n public startSearch(pattern: string | null, pluginName: string | null, categoryName: string | null): Promise<{ id: number }> {\n const body = new URLSearchParams(\n {\n pattern: pattern || '',\n category: categoryName || 'all',\n plugins: pluginName || 'all',\n });\n return this.axios.post('/search/start', body).then(Api.handleResponse);\n }\n\n public stopSearch(id: number) {\n const body = new URLSearchParams({ id: id.toString() });\n return this.axios.post('/search/stop', body).then(Api.handleResponse)\n }\n\n public getSearchResults(id: number): Promise {\n\n return this.axios.get(`/search/results?id=${id}`).then(Api.handleResponse);\n }\n\n public enablePlugin(plugin: SearchPlugin, enable: boolean) {\n const body = new URLSearchParams({\n names: plugin.name,\n enable: JSON.stringify(enable),\n });\n\n return this.axios.post('/search/enablePlugin', body).then(Api.handleResponse);\n }\n\n private actionTorrent(action: string, hash: string, extra?: any) {\n const params: any = {\n hash,\n ...extra,\n };\n const data = new URLSearchParams(params);\n return this.axios.post(`/torrents/${action}`, data).then(Api.handleResponse);\n }\n\n private actionTorrents(action: string, hashes: string[], extra?: any) {\n const params: any = {\n hashes: hashes.join('|'),\n ...extra,\n };\n const data = new URLSearchParams(params);\n return this.axios.post(`/torrents/${action}`, data).then(Api.handleResponse);\n }\n\n private static handleResponse(resp: AxiosResponse) {\n return resp.data;\n }\n}\n\nconst api = new Api();\nexport default api;\n","import { Module } from \"vuex\";\nimport { SearchPlugin } from \"@/types\";\nimport { SearchEnginePage } from \"./types\";\nimport api from \"@/Api\";\n\nexport default {\n state: {\n searchPlugins: [],\n isPluginManagerOpen: false,\n },\n mutations: {\n setSearchPlugins(state, plugins: SearchPlugin[] | undefined | null) {\n state.searchPlugins = plugins;\n },\n openPluginManager(state) {\n state.isPluginManagerOpen = true;\n },\n closePluginManager(state) {\n state.isPluginManagerOpen = false;\n },\n },\n getters: {\n allSearchPlugins(state): SearchPlugin[] | undefined | null {\n return state.searchPlugins;\n },\n },\n actions: {\n fetchSearchPlugins({ dispatch }) {\n // semantic helper\n dispatch(\"getSearchPluginsRequest\");\n },\n async getSearchPluginsRequest({ dispatch }) {\n try {\n const searchPlugins = await api.getSearchPlugins();\n\n dispatch(\"getSearchPluginRequestSuccess\", searchPlugins);\n } catch {\n dispatch(\"getSearchPluginsRequestFailure\");\n }\n },\n getSearchPluginRequestSuccess({ commit }, searchPlugins) {\n commit(\"setSearchPlugins\", undefined);\n\n commit(\"setSearchPlugins\", searchPlugins);\n },\n getSearchPluginRequestFailure({ commit }) {\n commit(\"setSearchPlugins\", null);\n },\n togglePluginAvailability({ dispatch }, plugin) {\n dispatch(\"togglePluginEnableRequest\", plugin);\n },\n async togglePluginEnableRequest({ dispatch }, plugin: SearchPlugin) {\n try {\n await api.enablePlugin(plugin, !plugin.enabled); // switch plugin enable state\n\n dispatch(\"enablePluginRequestSuccess\", plugin);\n } catch {\n // Do nothing\n }\n },\n enablePluginRequestSuccess({ dispatch }) {\n dispatch('fetchSearchPlugins'); // refresh the plugins\n },\n async updatePluginsRequest({ dispatch }) {\n try {\n await api.updateSearchPlugins();\n\n dispatch(\"updatePluginsRequestSuccess\");\n } catch {\n dispatch(\"updatePluginsRequestFailure\");\n }\n },\n async updatePluginsRequestSuccess({ dispatch }) {\n await dispatch('getSearchPluginsRequest');\n },\n updatePluginsRequestFailure() {\n // Do nothing\n },\n },\n} as Module;\n","import Vue from 'vue';\nimport { isPlainObject } from 'lodash';\n\n// based on https://github.com/richardtallent/vue-object-merge/blob/main/index.js\n\nexport const stateMerge = function(state: any, value: any, propName?: string, ignoreNull?: boolean) {\n\tif (isPlainObject(state) && (propName == null || propName in state)) {\n\t\tconst o = propName == null ? state : state[propName];\n\t\tif (o != null && isPlainObject(value)) {\n\t\t\tfor (const prop in value) {\n\t\t\t\tstateMerge(o, value[prop], prop, ignoreNull);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t}\n\tif (!ignoreNull || value !== null) Vue.set(state, propName!, value);\n\n return state;\n};\n\nexport default stateMerge;","import { merge, map, groupBy, sortBy } from 'lodash';\nimport Vue from 'vue';\nimport Vuex from 'vuex';\nimport { computed, Ref } from '@vue/composition-api';\n\nimport { configStore } from './config';\nimport { dialogStore } from './dialog';\nimport { snackBarStore } from './snackBar';\nimport { addFormStore } from './addForm';\nimport { AllStateTypes } from '../consts';\nimport { torrentIsState } from '../utils';\nimport searchEngineStore from './searchEngine';\nimport { RootState } from './types';\nimport stateMerge from '@/utils/vue-object-merge';\nimport api from '@/Api';\n\nVue.use(Vuex);\n\nconst store = new Vuex.Store({\n modules: {\n config: configStore,\n dialog: dialogStore,\n snackBar: snackBarStore,\n addForm: addFormStore,\n searchEngine: searchEngineStore,\n },\n state: {\n rid: 0,\n mainData: undefined,\n preferences: null,\n pasteUrl: null,\n needAuth: false,\n },\n mutations: {\n /* eslint-disable no-param-reassign */\n updateMainData(state, payload) {\n state.rid = payload.rid;\n delete payload.rid;\n if (payload.full_update) {\n delete payload.full_update;\n state.mainData = payload;\n } else {\n const mainData = state.mainData!;\n if (payload.torrents_removed) {\n for (const hash of payload.torrents_removed) {\n Vue.delete(mainData.torrents, hash);\n }\n delete payload.torrents_removed;\n }\n if (payload.categories_removed) {\n for (const key of payload.categories_removed) {\n Vue.delete(mainData, key);\n }\n delete payload.categories_removed;\n }\n if (payload.tags_removed) {\n for (const key of payload.tags_removed) {\n Vue.delete(mainData, key);\n }\n delete payload.categories_removed;\n }\n stateMerge(mainData, payload);\n }\n },\n updatePreferences(state, payload) {\n state.preferences = payload;\n },\n setPasteUrl(state, payload) {\n const { url } = payload;\n state.pasteUrl = url;\n },\n updateNeedAuth(state, payload) {\n state.needAuth = payload;\n },\n /* eslint-enable no-param-reassign */\n },\n getters: {\n allPreferences(state) {\n return state.preferences;\n },\n savePath(state) {\n return state.preferences['save_path'];\n },\n isDataReady(state) {\n return !!state.mainData;\n },\n allTorrents(state) {\n if (!state.mainData) {\n return [];\n }\n\n return map(state.mainData.torrents, (value, key) => merge({}, value, { hash: key }));\n },\n allCategories(state) {\n if (!state.mainData) {\n return [];\n }\n\n const categories = map(state.mainData.categories,\n (value, key) => merge({}, value, { key }));\n return sortBy(categories, 'name');\n },\n allTags(state) {\n if (!state.mainData) {\n return [];\n }\n\n const finalTags: any[] = []\n for (const tag of state.mainData.tags) {\n finalTags.push({\n \"key\": tag,\n \"name\": tag,\n });\n }\n return sortBy(finalTags, 'name');\n },\n torrentGroupByCategory(state, getters) {\n return groupBy(getters.allTorrents, torrent => torrent.category);\n },\n torrentGroupByTag(state, getters) {\n const result: any = {}\n for (const torrent of getters.allTorrents) {\n const tags: any[] = torrent.tags.split(\",\");\n tags.forEach(tag => {\n let list: any[] = result[tag]\n if (!list) {\n list = []\n result[tag] = list;\n }\n list.push(torrent);\n });\n }\n return result;\n },\n torrentGroupBySite(state, getters) {\n return groupBy(getters.allTorrents, (torrent) => {\n if (!torrent.tracker) {\n return '';\n }\n\n const url = new URL(torrent.tracker);\n return url.hostname;\n });\n },\n torrentGroupByState(__, getters) {\n const result: any = {};\n const put = (state: any, torrent: any) => {\n let list: any[] = result[state];\n if (!list) {\n list = [];\n result[state] = list;\n }\n list.push(torrent);\n };\n\n for (const torrent of getters.allTorrents) {\n for (const type of AllStateTypes) {\n if (torrentIsState(type, torrent.state)) {\n put(type, torrent);\n }\n }\n }\n\n return result;\n },\n },\n actions: {\n async updatePreferencesRequest({ dispatch }, preferences) {\n try {\n await api.setPreferences(preferences);\n //setPreference api return a empty response. Need to update preference by another request.\n const preferenceRes = await api.getAppPreferences();\n dispatch(\"updatePreferencesRequestSuccess\", preferenceRes.data);\n } catch {\n dispatch(\"updatePreferencesRequestFailure\");\n }\n },\n updatePreferencesRequestSuccess({ commit }, preferences) {\n commit(\"updatePreferences\", preferences);\n },\n updatePreferencesRequestFailure() {\n alert('Preferences failed to update');\n },\n },\n});\n\nexport default store;\n\nexport function useStore() {\n return store;\n}\n\nexport function useMutations(mutations: [string], namespace?: string) {\n const result: {[key: string]: () => any} = {};\n\n mutations.forEach((m) => {\n const method = namespace ? `${namespace}/${m}` : m;\n result[m] = (..._args) => store.commit(method, ..._args);\n });\n\n return result;\n}\n\nexport function useState(states: [string], namespace?: string) {\n const state = namespace ? (store.state as any)[namespace] : store.state;\n\n const result: {[key: string]: Readonly>>} = {};\n\n states.forEach((s) => {\n result[s] = computed(() => state[s]);\n });\n\n return result;\n}\n","import dayjs from 'dayjs';\nimport Vue from 'vue';\n\n/* eslint-disable no-param-reassign */\nexport function toPrecision(value: number, precision: number) {\n const limit = 10 ** precision;\n if (value >= limit) {\n return value.toString();\n }\n if (value >= 1) {\n if (value >= limit - 1) {\n return limit.toString();\n }\n\n return value.toPrecision(precision);\n }\n\n return value.toFixed(precision - 1);\n}\n\nexport function formatSize(value: number): string {\n const units = 'KMGTP';\n let index = value ? Math.floor(Math.log2(value) / 10) : 0;\n\n value = value / (1024 ** index);\n if (value >= 999) {\n value /= 1024;\n index++;\n }\n\n const unit = index === 0 ? 'B' : `${units[index - 1]}iB`;\n\n if (index === 0) {\n return `${value} ${unit}`;\n }\n\n return `${toPrecision(value, 3)} ${unit}`;\n}\n\nVue.filter('formatSize', formatSize);\nVue.filter('size', formatSize);\n\nexport interface DurationOptions {\n dayLimit?: number;\n maxUnitSize?: number;\n minUnit?: number;\n}\n\nexport function formatDuration(value: number, options?: DurationOptions) {\n const minute = 60;\n const hour = minute * 60;\n const day = hour * 24;\n const year = day * 365;\n\n const durations = [year, day, hour, minute, 1];\n const units = 'ydhms';\n\n let index = 0;\n let unitSize = 0;\n const parts = [];\n\n const defaultOptions: DurationOptions = {\n maxUnitSize: 2,\n dayLimit: 0,\n minUnit: 0,\n };\n\n const opt = options ? Object.assign(defaultOptions, options) : defaultOptions;\n\n if (opt.dayLimit && value >= opt.dayLimit * day) {\n return '∞';\n }\n\n while ((!opt.maxUnitSize || unitSize !== opt.maxUnitSize) && index !== durations.length) {\n const duration = durations[index];\n if (value < duration) {\n index++;\n continue;\n } else if (opt.minUnit && (durations.length - index) <= opt.minUnit) {\n break\n }\n\n const result = Math.floor(value / duration);\n parts.push(result + units[index]);\n\n // eslint-disable-next-line\n value %= duration;\n index++;\n unitSize++;\n }\n\n // if (unitSize < 2 && index !== durations.length) {\n // const result = Math.floor(value / durations[index]);\n // parts.push(result + units[index]);\n // }\n\n if (!parts.length) {\n return '0' + units[durations.length - 1 - opt.minUnit!];\n }\n\n return parts.join(' ');\n}\n\nVue.filter('formatDuration', formatDuration);\n\nexport function formatTimestamp(timestamp: number | null) {\n if (timestamp == null || timestamp === -1) {\n return '';\n }\n\n const m = dayjs.unix(timestamp);\n return m.format('YYYY-MM-DD HH:mm:ss');\n}\n\nVue.filter('formatTimestamp', formatTimestamp);\n\nexport function formatAsDuration(timestamp: number, options?: DurationOptions) {\n const duration = (Date.now() / 1000) - timestamp;\n return formatDuration(duration, options);\n}\n\nVue.filter('formatAsDuration', formatAsDuration);\n\nexport function formatProgress(progress: number) {\n // eslint-disable-next-line\n progress *= 100;\n return `${toPrecision(progress, 3)}%`;\n}\n\nVue.filter('progress', formatProgress);\n\nexport function parseDate(str: string) {\n if (!str) {\n return null\n }\n\n return Date.parse(str) / 1000\n}\n\nVue.filter('parseDate', parseDate)\n","import Vue from 'vue';\n\nVue.directive('class', (el, binding) => {\n const clsName = binding.arg!;\n el.classList.toggle(clsName, binding.value);\n});\n","let buildInfo = process.env.GIT_TAG\n\nif (!buildInfo) {\n buildInfo = 'dev'\n}\n\n// eslint-disable-next-line no-console\nconsole.log(`%c qb-web Build %c ${buildInfo} `, \n 'background-color: #555; color: #fff; border-radius: 3px 0 0 3px;',\n 'background-color: #1976d2; color: #fff; border-radius: 0 3px 3px 0;',\n)\n\nexport default buildInfo","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-app',{ref:\"app\"},[_c('v-navigation-drawer',{directives:[{name:\"class\",rawName:\"v-class:phone-layout\",value:(_vm.phoneLayout),expression:\"phoneLayout\",arg:\"phone-layout\"}],attrs:{\"app\":\"\",\"clipped\":_vm.$vuetify.breakpoint.lgAndUp,\"width\":\"300\"},scopedSlots:_vm._u([{key:\"append\",fn:function(){return [_c('DrawerFooter')]},proxy:true}]),model:{value:(_vm.drawer),callback:function ($$v) {_vm.drawer=$$v},expression:\"drawer\"}},[_c('drawer',{model:{value:(_vm.drawerOptions),callback:function ($$v) {_vm.drawerOptions=$$v},expression:\"drawerOptions\"}})],1),_c('main-toolbar',{model:{value:(_vm.drawer),callback:function ($$v) {_vm.drawer=$$v},expression:\"drawer\"}}),_c('v-main',[_c('torrents')],1),(_vm.preferences)?_c('add-form'):_vm._e(),(_vm.needAuth)?_c('login-form'):_vm._e(),(_vm.drawerOptions.showLogs)?_c('logs-dialog',{model:{value:(_vm.drawerOptions.showLogs),callback:function ($$v) {_vm.$set(_vm.drawerOptions, \"showLogs\", $$v)},expression:\"drawerOptions.showLogs\"}}):_vm._e(),(_vm.drawerOptions.showRss)?_c('RssDialog',{on:{\"download-torrent\":function($event){return _vm.setPasteUrl({url: $event})}},model:{value:(_vm.drawerOptions.showRss),callback:function ($$v) {_vm.$set(_vm.drawerOptions, \"showRss\", $$v)},expression:\"drawerOptions.showRss\"}}):_vm._e(),(_vm.drawerOptions.showSearch)?_c('SearchDialog',{model:{value:(_vm.drawerOptions.showSearch),callback:function ($$v) {_vm.$set(_vm.drawerOptions, \"showSearch\", $$v)},expression:\"drawerOptions.showSearch\"}}):_vm._e(),(_vm.drawerOptions.showSettings)?_c('SettingsDialog',{model:{value:(_vm.drawerOptions.showSettings),callback:function ($$v) {_vm.$set(_vm.drawerOptions, \"showSettings\", $$v)},expression:\"drawerOptions.showSettings\"}}):_vm._e(),(_vm.$vuetify.breakpoint.smAndUp)?_c('v-footer',{staticClass:\"elevation-4\",attrs:{\"app\":\"\",\"padless\":\"\"}},[_c('app-footer')],1):_vm._e(),_c('GlobalDialog'),_c('GlobalSnackBar')],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import debug from 'debug';\n\nconst log = debug('app:protocolHandler');\n\nfunction registerProtocolHandler() {\n if (!('registerProtocolHandler' in navigator)) {\n return;\n }\n\n const baseUrl = location.origin + location.pathname;\n\n try {\n navigator.registerProtocolHandler('magnet', baseUrl + '#download=%s', document.title);\n } catch (e) {\n log('Register protocol handler failed.', e);\n }\n}\n\nfunction checkDownloadUrl() {\n if (!location.hash) {\n return null\n }\n\n const params = new URLSearchParams(location.hash.substring(1));\n const url = params.get('download')\n if (!url) {\n return null;\n }\n\n params.delete('download');\n location.hash = '#' + params.toString()\n return url\n}\n\nexport { registerProtocolHandler, checkDownloadUrl };\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-dialog',_vm._b({model:{value:(_vm.value),callback:function ($$v) {_vm.value=$$v},expression:\"value\"}},'v-dialog',_vm.config ? _vm.config.dialog : null,false),[(!!_vm.config)?_c('v-card',[_c('v-card-title',{domProps:{\"textContent\":_vm._s(_vm.config.title)}}),_c('v-card-text',{staticClass:\"content\",class:{'is-input': _vm.isInput}},[(_vm.isInput)?_c('v-text-field',{attrs:{\"label\":_vm.config.text,\"rules\":_vm.config.rules,\"placeholder\":_vm.config.placeholder,\"hide-details\":!_vm.config.rules,\"autofocus\":\"\"},model:{value:(_vm.input),callback:function ($$v) {_vm.input=$$v},expression:\"input\"}}):[_vm._v(\" \"+_vm._s(_vm.config.text)+\" \")]],2),_c('v-card-actions',[_c('v-spacer'),_vm._l((_vm.btns),function(btn,index){return _c('v-btn',{key:index,attrs:{\"color\":\"info\",\"text\":\"\"},on:{\"click\":function($event){return _vm.clickBtn(btn[1])}}},[_vm._v(\" \"+_vm._s(btn[0])+\" \")])})],2)],1):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { MainData, SearchPlugin } from '@/types';\nimport { Config } from './config';\n\nexport interface RootState {\n rid: number;\n mainData?: MainData;\n preferences: any;\n pasteUrl: string | null;\n needAuth: boolean;\n}\n\nexport interface SearchEnginePage {\n searchPlugins: SearchPlugin[] | null | undefined;\n isPluginManagerOpen: boolean;\n}\n\nexport interface AddFormState {\n isOpen: boolean;\n downloadItem: {\n title: string;\n url: string;\n } | null;\n}\n\nexport interface TorrentFilter {\n state: string;\n category: string;\n tag: string;\n site: string;\n query: string;\n}\n\nexport interface ConfigState {\n userConfig: any;\n}\n\nexport interface ConfigPayload {\n key: keyof Config;\n value: any;\n}\n\nexport enum DialogType {\n Alert,\n YesNo,\n OkCancel,\n Input,\n Custom,\n}\n\nexport interface DialogConfig {\n dialog?: any;\n\n title?: string;\n text: string;\n callback?: CallableFunction;\n type?: DialogType;\n buttons?: any;\n\n rules?: CallableFunction[];\n placeholder?: string;\n value?: string;\n}\n\nexport interface DialogState {\n config: DialogConfig | null;\n}\n\nexport interface SnackBarConfig {\n text: string;\n btnText?: string;\n callback?: CallableFunction;\n}\n\nexport interface SnackBarState {\n config: SnackBarConfig | null;\n}\n","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport { computed, ref, watch } from '@vue/composition-api';\n\nimport { tr } from '@/locale';\nimport { DialogType, DialogConfig } from '@/store/types';\nimport { useMutations, useState } from '@/store';\n\nconst BUTTONS = {\n [DialogType.Alert]: [\n [tr('close'), false],\n ],\n [DialogType.YesNo]: [\n [tr('no'), false],\n [tr('yes'), true],\n ],\n [DialogType.OkCancel]: [\n [tr('cancel'), false],\n [tr('ok'), true],\n ],\n [DialogType.Input]: [\n [tr('cancel'), false],\n [tr('ok'), true],\n ],\n};\n\nconst DefaultDialogWidth = '25%'\n\nexport default {\n setup(_: any, ctx: any) {\n const mutations = useMutations(['closeDialog']);\n const { config: userConfig } = useState(['config'], 'dialog');\n const config = computed(() => {\n if (!userConfig.value) {\n return null;\n }\n const o = Object.assign({dialog: {}}, userConfig.value) as DialogConfig;\n\n if (!('width' in o.dialog)) {\n o.dialog.width = ctx.root.$vuetify.breakpoint.smAndDown ? null : DefaultDialogWidth\n }\n\n return o\n });\n const value = ref();\n const input = ref();\n\n const isInput = computed(() => {\n const type = config.value!.type\n return type === DialogType.Input\n })\n\n async function clickBtn(btnValue: any) {\n const cb = config.value!.callback;\n\n if (cb) {\n if (isInput.value) {\n cb(btnValue ? input.value : undefined)\n } else {\n cb(btnValue);\n }\n }\n\n mutations.closeDialog();\n }\n\n watch(config, (v) => {\n value.value = !!v;\n if (!v) {\n input.value = undefined\n } else {\n input.value = v.value\n }\n });\n watch(value, (v) => {\n if (v || !config.value) {\n return\n }\n\n clickBtn(null);\n });\n\n const btns = computed(() => {\n const c = config.value;\n const dialogType = (c && c.type) ? c.type : DialogType.Alert;\n\n if (dialogType === DialogType.Custom) {\n return c!.buttons;\n }\n\n return BUTTONS[dialogType];\n });\n\n return {\n config,\n value,\n input,\n isInput,\n btns,\n clickBtn,\n };\n },\n};\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??ref--14-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./GlobalDialog.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??ref--14-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./GlobalDialog.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./GlobalDialog.vue?vue&type=template&id=299a15fc&scoped=true&\"\nimport script from \"./GlobalDialog.vue?vue&type=script&lang=ts&\"\nexport * from \"./GlobalDialog.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./GlobalDialog.vue?vue&type=style&index=0&id=299a15fc&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"299a15fc\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VCardActions } from 'vuetify/lib/components/VCard';\nimport { VCardText } from 'vuetify/lib/components/VCard';\nimport { VCardTitle } from 'vuetify/lib/components/VCard';\nimport { VDialog } from 'vuetify/lib/components/VDialog';\nimport { VSpacer } from 'vuetify/lib/components/VGrid';\nimport { VTextField } from 'vuetify/lib/components/VTextField';\ninstallComponents(component, {VBtn,VCard,VCardActions,VCardText,VCardTitle,VDialog,VSpacer,VTextField})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-snackbar',_vm._b({attrs:{\"value\":_vm.config},on:{\"input\":_vm.changed}},'v-snackbar',_vm.config,false),[(_vm.config)?[_vm._v(\" \"+_vm._s(_vm.config.text)+\" \"),(_vm.config.callback)?_c('v-btn',{attrs:{\"text\":\"\",\"color\":\"info\"},on:{\"click\":_vm.clickBtn}},[_vm._v(\" \"+_vm._s(_vm.config.btnText ? _vm.config.btnText : _vm.$t('close'))+\" \")]):_vm._e()]:_vm._e()],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./GlobalSnackBar.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./GlobalSnackBar.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./GlobalSnackBar.vue?vue&type=template&id=047403fe&\"\nimport script from \"./GlobalSnackBar.vue?vue&type=script&lang=js&\"\nexport * from \"./GlobalSnackBar.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VSnackbar } from 'vuetify/lib/components/VSnackbar';\ninstallComponents(component, {VBtn,VSnackbar})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"add-form\"},[_c('v-btn',{staticClass:\"btn-add\",class:{'with-footer': _vm.$vuetify.breakpoint.smAndUp},attrs:{\"fab\":\"\",\"bottom\":\"\",\"color\":\"primary\",\"fixed\":\"\",\"right\":\"\",\"small\":\"\"},on:{\"click\":_vm.openAddForm}},[_c('v-icon',[_vm._v(\"mdi-link-plus\")])],1),_c('v-dialog',{attrs:{\"eager\":\"\",\"persistent\":\"\",\"scrollable\":\"\",\"width\":_vm.phoneLayout ? '100%' : '40em'},model:{value:(_vm.state.isOpen),callback:function ($$v) {_vm.$set(_vm.state, \"isOpen\", $$v)},expression:\"state.isOpen\"}},[_c('v-card',[_c('v-card-title',{staticClass:\"headline\"},[_c('v-icon',{staticClass:\"mr-2\"},[_vm._v(\"mdi-link-plus\")]),_c('span',[_vm._v(_vm._s(_vm.state.downloadItem && _vm.state.downloadItem.title || _vm.$t('title.add_torrents')))])],1),_c('v-card-text',{staticClass:\"pb-0\"},[_c('v-form',{ref:\"form\",model:{value:(_vm.valid),callback:function ($$v) {_vm.valid=$$v},expression:\"valid\"}},[_c('v-container',[_c('v-row',{attrs:{\"no-gutters\":\"\"}},[_c('v-col',{ref:\"fileZone\"},[_c('v-file-input',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.files.length),expression:\"files.length\"}],ref:\"file\",attrs:{\"multiple\":\"\",\"chips\":\"\",\"outlined\":\"\",\"label\":_vm.$t('files')},model:{value:(_vm.files),callback:function ($$v) {_vm.files=$$v},expression:\"files\"}}),_c('v-textarea',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.files.length),expression:\"!files.length\"}],attrs:{\"label\":\"URL\",\"hint\":_vm.$t('dialog.add_torrents.hint'),\"placeholder\":_vm.$t('dialog.add_torrents.placeholder'),\"prepend-icon\":\"mdi-link\",\"append-outer-icon\":\"mdi-attachment\",\"rules\":[function (v) { return (!!_vm.files.length || !!v || _vm.$t('msg.item_is_required', { item: 'URL' })); }],\"rows\":_vm.$vuetify.breakpoint.xsOnly ? 1 : 3,\"required\":\"\",\"autofocus\":!_vm.phoneLayout,\"value\":_vm.params.urls,\"readonly\":_vm.state.downloadItem !== null},on:{\"input\":function($event){return _vm.setParams('urls', $event)},\"click:append-outer\":_vm.selectFiles}})],1)],1),_c('v-row',{attrs:{\"no-gutters\":\"\"}},[(_vm.showMore)?[_c('v-col',{attrs:{\"cols\":\"12\",\"sm\":\"6\"}},[_c('v-checkbox',{attrs:{\"prepend-icon\":\"mdi-file-tree\",\"label\":_vm.$t('label.create_subfolder'),\"input-value\":true},on:{\"change\":function($event){return _vm.setParams('root_path', $event)}}})],1),_c('v-col',{attrs:{\"cols\":\"12\",\"sm\":\"6\"}},[_c('v-checkbox',{attrs:{\"prepend-icon\":\"mdi-car-shift-pattern\",\"label\":_vm.$t('label.auto_tmm'),\"input-value\":_vm.params.autoTMM},on:{\"change\":function($event){return _vm.setParams('autoTMM', $event)}}})],1)]:_vm._e(),_c('v-col',{attrs:{\"cols\":\"12\",\"sm\":\"6\"}},[_c('v-combobox',{attrs:{\"label\":_vm.$t('category', 1),\"prepend-icon\":\"mdi-folder\",\"clearable\":\"\",\"hide-no-data\":\"\",\"items\":_vm.categoryItems,\"value\":_vm.params.category,\"return-object\":false},on:{\"input\":function($event){return _vm.setParams('category', $event)}}})],1),(!_vm.phoneLayout || _vm.showMore)?_c('v-col',{attrs:{\"cols\":\"12\",\"sm\":\"6\"}},[_c('v-text-field',{attrs:{\"label\":_vm.$t('location'),\"prepend-icon\":\"mdi-folder-marker\",\"clearable\":\"\",\"disabled\":_vm.params.autoTMM,\"placeholder\":_vm.defaultPath,\"value\":_vm.params.autoTMM ? null : _vm.userParams.savepath},on:{\"change\":function($event){return _vm.setParams('savepath', $event)}}})],1):_vm._e(),_c('v-col',{attrs:{\"cols\":\"12\",\"sm\":\"6\"}},[_c('v-checkbox',{attrs:{\"label\":_vm.$t('label.start_torrent'),\"prepend-icon\":\"mdi-play-pause\",\"input-value\":!_vm.params.paused},on:{\"change\":function($event){return _vm.setParams('paused', !$event)}}})],1),(!_vm.phoneLayout || _vm.showMore)?_c('v-col',{attrs:{\"cols\":\"12\",\"sm\":\"6\"}},[_c('v-checkbox',{attrs:{\"prepend-icon\":\"mdi-progress-check\",\"label\":_vm.$t('label.skip_hash_check'),\"input-value\":_vm.params.skip_checking},on:{\"change\":function($event){return _vm.setParams('skip_checking', $event)}}})],1):_vm._e(),(_vm.showMore)?[_c('v-col',{attrs:{\"cols\":\"12\",\"sm\":\"6\"}},[_c('v-checkbox',{attrs:{\"label\":_vm.$t('label.in_sequential_order'),\"prepend-icon\":\"mdi-sort-descending\",\"ipnut-value\":_vm.params.sequentialDownload},on:{\"change\":function($event){return _vm.setParams('sequentialDownload', $event)}}})],1),_c('v-col',{attrs:{\"cols\":\"12\",\"sm\":\"6\"}},[_c('v-checkbox',{attrs:{\"prepend-icon\":\"mdi-ray-start-end\",\"label\":_vm.$t('label.first_and_last_pieces_first'),\"input-value\":_vm.params.firstLastPiecePrio},on:{\"change\":function($event){return _vm.setParams('firstLastPiecePrio', $event)}}})],1)]:_vm._e()],2)],1)],1),_c('v-alert',{attrs:{\"type\":\"warning\",\"value\":_vm.error},domProps:{\"textContent\":_vm._s(_vm.error)}})],1),_c('v-card-actions',[_c('v-btn',{attrs:{\"text\":\"\"},domProps:{\"textContent\":_vm._s(_vm.showMore ? _vm.$t('less') : _vm.$t('more'))},on:{\"click\":function($event){_vm.showMore = !_vm.showMore}}}),_c('v-spacer'),_c('v-btn',{attrs:{\"text\":\"\"},on:{\"click\":_vm.closeAddForm}},[_vm._v(\" \"+_vm._s(_vm.$t('cancel'))+\" \")]),_c('v-btn',{attrs:{\"text\":\"\",\"color\":\"primary\",\"disabled\":!_vm.valid,\"loading\":_vm.submitting},on:{\"click\":_vm.submit}},[_vm._v(\" \"+_vm._s(_vm.$t('submit'))+\" \")])],1)],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport { isNil } from 'lodash';\nimport Vue from 'vue';\nimport { mapState, mapGetters, mapMutations } from 'vuex';\n\nimport api from '../Api';\nimport Component from 'vue-class-component';\nimport { Watch } from 'vue-property-decorator';\nimport { Preferences, Category } from '../types';\nimport { AddFormState } from '@/store/types';\n\n/* eslint-disable @typescript-eslint/camelcase */\nconst defaultParams = {\n urls: '',\n category: '',\n paused: false,\n savepath: '',\n skip_checking: false,\n root_path: false,\n sequentialDownload: false,\n firstLastPiecePrio: false,\n autoTMM: false,\n};\n/* eslint-enable @typescript-eslint/camelcase */\n\n@Component({\n computed: {\n ...mapState({\n pasteUrl: 'pasteUrl',\n prefs: 'preferences',\n state: 'addForm',\n }),\n ...mapGetters({\n allCategories: 'allCategories',\n }),\n },\n methods: {\n ...mapMutations([\n 'closeAddForm',\n 'openAddForm',\n ]),\n },\n})\nexport default class AddForm extends Vue {\n valid = false\n files: FileList | [] = []\n defaultParams = defaultParams\n userParams = {}\n error: string | null = null\n submitting = false\n showMore = false\n\n state!: AddFormState;\n pasteUrl!: string | null\n prefs!: Preferences\n allCategories!: Category[]\n\n $refs!: {\n form: any;\n file: any;\n fileZone: HTMLElement;\n }\n\n openAddForm!: () => void;\n closeAddForm!: () => void;\n\n get params() {\n return Object.assign({}, defaultParams, this.userParams);\n }\n get phoneLayout() {\n return this.$vuetify.breakpoint.xsOnly;\n }\n get categoryItems() {\n return this.allCategories.map(c => ({ text: c.name, value: c.key }));\n }\n get defaultPath() {\n if (this.params.autoTMM && this.params.category) {\n const category = this.allCategories.find(c => {\n return c.key === this.params.category;\n });\n \n if (!category) {\n return this.params.category;\n }\n\n return category.savePath || category.name\n }\n\n return this.defaultParams.savepath;\n }\n\n created() {\n defaultParams.paused = this.prefs.start_paused_enabled;\n /* eslint-disable-next-line @typescript-eslint/camelcase */\n defaultParams.root_path = this.prefs.create_subfolder_enabled;\n defaultParams.savepath = this.prefs.save_path;\n defaultParams.autoTMM = this.prefs.auto_tmm_enabled;\n }\n\n mounted() {\n this.$refs.fileZone.addEventListener('drop', this.onDrop, true);\n }\n\n @Watch('state', {deep: true})\n onStateUpdate(state: AddFormState) {\n if (state.downloadItem) {\n this.setParams('urls', state.downloadItem.url);\n }\n }\n\n beforeDestroy() {\n this.$refs.fileZone.removeEventListener('drop', this.onDrop, true);\n }\n\n setParams(key: keyof typeof defaultParams, value: any) {\n if (isNil(value) || value === defaultParams[key]) {\n Vue.delete(this.userParams, key);\n } else {\n Vue.set(this.userParams, key, value);\n }\n }\n\n async submit() {\n if (this.submitting) {\n return;\n }\n\n this.submitting = true;\n this.error = null;\n let files;\n if (this.files.length) {\n ({ files } = this);\n Vue.delete(this.userParams, 'urls');\n } else {\n files = null;\n }\n\n try {\n const resp = await api.addTorrents(this.userParams, files);\n\n if (resp !== 'Ok.') {\n this.error = resp;\n }\n } catch (e) {\n this.error = e.message;\n }\n\n this.submitting = false;\n\n if (this.error) {\n return;\n }\n\n this.closeAddForm();\n\n Vue.delete(this.userParams, 'urls');\n this.files = [];\n\n this.$refs.form.resetValidation();\n }\n\n selectFiles() {\n const input = this.$refs.file.$el.querySelector('input[type=file]');\n input.click();\n }\n\n onDrop(e: DragEvent) {\n const transfer = e.dataTransfer!;\n const { files } = transfer;\n if (!files.length) {\n return;\n }\n\n e.preventDefault();\n this.files = files;\n }\n\n @Watch('pasteUrl', {immediate: true})\n onPasteUrl(v: string) {\n if (!v) {\n return;\n }\n\n if (!this.state.isOpen) {\n Vue.set(this.userParams, 'urls', v);\n this.openAddForm();\n }\n }\n\n @Watch('files')\n onFilesChange() {\n this.$refs.form.validate();\n }\n}\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??ref--14-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AddForm.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??ref--14-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AddForm.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./AddForm.vue?vue&type=template&id=f8274abe&scoped=true&\"\nimport script from \"./AddForm.vue?vue&type=script&lang=ts&\"\nexport * from \"./AddForm.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./AddForm.vue?vue&type=style&index=0&id=f8274abe&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"f8274abe\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VAlert } from 'vuetify/lib/components/VAlert';\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VCardActions } from 'vuetify/lib/components/VCard';\nimport { VCardText } from 'vuetify/lib/components/VCard';\nimport { VCardTitle } from 'vuetify/lib/components/VCard';\nimport { VCheckbox } from 'vuetify/lib/components/VCheckbox';\nimport { VCol } from 'vuetify/lib/components/VGrid';\nimport { VCombobox } from 'vuetify/lib/components/VCombobox';\nimport { VContainer } from 'vuetify/lib/components/VGrid';\nimport { VDialog } from 'vuetify/lib/components/VDialog';\nimport { VFileInput } from 'vuetify/lib/components/VFileInput';\nimport { VForm } from 'vuetify/lib/components/VForm';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VRow } from 'vuetify/lib/components/VGrid';\nimport { VSpacer } from 'vuetify/lib/components/VGrid';\nimport { VTextField } from 'vuetify/lib/components/VTextField';\nimport { VTextarea } from 'vuetify/lib/components/VTextarea';\ninstallComponents(component, {VAlert,VBtn,VCard,VCardActions,VCardText,VCardTitle,VCheckbox,VCol,VCombobox,VContainer,VDialog,VFileInput,VForm,VIcon,VRow,VSpacer,VTextField,VTextarea})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-list',{staticClass:\"drawer\",attrs:{\"dense\":\"\",\"expand\":\"\"}},[_vm._l((_vm.items),function(item){return [(item.children)?_c('v-list-group',{key:item.title,attrs:{\"prepend-icon\":item.model ? item.icon : item['icon-alt'],\"append-icon\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(){return [_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\" \"+_vm._s(item.title)+\" \")])],1)]},proxy:true}],null,true),model:{value:(item.model),callback:function ($$v) {_vm.$set(item, \"model\", $$v)},expression:\"item.model\"}},_vm._l((item.children),function(child,i){return _c('v-list-item',{key:i,on:{\"click\":function($event){item.click ? item.click(child.value) : null}}},[(child.icon)?_c('v-list-item-icon',[_c('v-icon',[_vm._v(_vm._s(child.icon))])],1):_vm._e(),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\" \"+_vm._s(child.title)+\" \")])],1)],1)}),1):(item.filterGroups)?_vm._l((item.filterGroups),function(child,i){return _c('filter-group',{key:i,attrs:{\"group\":child}})}):_c('v-list-item',{key:item.title,on:{\"click\":function($event){item.click ? item.click() : null}}},[_c('v-list-item-icon',[_c('v-icon',[_vm._v(_vm._s(item.icon))])],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\" \"+_vm._s(item.title)+\" \")])],1)],1)]})],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-list-group',{staticClass:\"filter-group\",attrs:{\"prepend-icon\":_vm.model ? _vm.group.icon : _vm.group['icon-alt']},scopedSlots:_vm._u([{key:\"activator\",fn:function(){return [_c('v-list-item-content',[_c('v-list-item-title',{directives:[{name:\"class\",rawName:\"v-class:primary--text\",value:(_vm.selected !== null),expression:\"selected !== null\",arg:\"primary--text\"}]},[_vm._v(\" \"+_vm._s(_vm.group.title)+\" \")])],1)]},proxy:true}]),model:{value:(_vm.model),callback:function ($$v) {_vm.model=$$v},expression:\"model\"}},_vm._l((_vm.group.children),function(child,i){return _c('v-list-item',{directives:[{name:\"class\",rawName:\"v-class:v-list-item--active\",value:(_vm.selected === child.key),expression:\"selected === child.key\",arg:\"v-list-item--active\"}],key:i,on:{\"click\":function($event){$event.stopPropagation();return _vm.select(child.key)}}},[_c('v-list-item-icon',[(_vm.isFontIcon(child.icon))?_c('v-icon',[_vm._v(\" \"+_vm._s(child.icon)+\" \")]):_c('div',[_c('v-img',{attrs:{\"src\":child.icon,\"width\":\"20px\",\"height\":\"20px\"}})],1)],1),_c('v-list-item-content',[_c('v-list-item-title',[(child.append)?[_c('div',{staticClass:\"d-flex\"},[_vm._v(\" \"+_vm._s(child.title)+\" \"),_c('v-spacer'),_vm._v(\" \"+_vm._s(child.append)+\" \")],1)]:[_vm._v(\" \"+_vm._s(child.title)+\" \")]],2)],1)],1)}),1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport Vue from 'vue';\nimport Component from 'vue-class-component';\nimport { Prop } from 'vue-property-decorator';\nimport { Group } from '../types'\n\n@Component\nexport default class FilterGroup extends Vue {\n @Prop()\n readonly group!: Group\n\n model = this.group.model\n selected: string | null = null\n\n created() {\n const s = this.$store.getters.config.filter[this.group.select];\n if (this.group.children.some(child => child.key === s)) {\n this.selected = s;\n } else {\n this.select(null);\n }\n if (this.model == null) {\n this.model = this.selected != null;\n }\n }\n\n select(key: string | null) {\n this.selected = this.selected === key ? null : key;\n this.$store.commit('updateConfig', {\n key: 'filter',\n value: {\n [this.group.select]: this.selected,\n },\n });\n }\n\n isFontIcon(icon: string) {\n return icon.startsWith('mdi-');\n }\n}\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??ref--14-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilterGroup.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??ref--14-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./FilterGroup.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./FilterGroup.vue?vue&type=template&id=26ced1bd&scoped=true&\"\nimport script from \"./FilterGroup.vue?vue&type=script&lang=ts&\"\nexport * from \"./FilterGroup.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./FilterGroup.vue?vue&type=style&index=0&id=26ced1bd&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"26ced1bd\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VImg } from 'vuetify/lib/components/VImg';\nimport { VListGroup } from 'vuetify/lib/components/VList';\nimport { VListItem } from 'vuetify/lib/components/VList';\nimport { VListItemContent } from 'vuetify/lib/components/VList';\nimport { VListItemIcon } from 'vuetify/lib/components/VList';\nimport { VListItemTitle } from 'vuetify/lib/components/VList';\nimport { VSpacer } from 'vuetify/lib/components/VGrid';\ninstallComponents(component, {VIcon,VImg,VListGroup,VListItem,VListItemContent,VListItemIcon,VListItemTitle,VSpacer})\n","function getSiteIcon(name: string): string {\n return require(`@/assets/site_icons/${name}.png`);\n}\n\nexport interface SiteInfo {\n name: string;\n icon: string;\n}\n\nconst sites: {[key: string]: SiteInfo} = {\n 'tracker.m-team.cc': {\n name: 'M-Team',\n icon: getSiteIcon('m-team'),\n },\n 'tracker.keepfrds.com': {\n name: 'FRDS',\n icon: getSiteIcon('keepfrds'),\n },\n 'springsunday.net': {\n name: 'SSD',\n icon: getSiteIcon('springsunday'),\n },\n 'hdchina.org': {\n name: 'HDChina',\n icon: getSiteIcon('hdchina'),\n },\n 'chdbits.co': {\n name: 'CHDBits',\n icon: getSiteIcon('chdbits'),\n },\n 'hdhome.org': {\n name: 'HDHome',\n icon: getSiteIcon('hdhome'),\n },\n 'u2.dmhy.org': {\n name: 'U2',\n icon: getSiteIcon('u2'),\n },\n};\n\nexport default sites;\n","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport { sortBy, sumBy, defaultTo, isUndefined } from 'lodash';\nimport Vue from 'vue';\nimport { mapGetters } from 'vuex';\n\nimport { tr } from '@/locale';\nimport { Torrent, Category, Tag } from '@/types';\nimport FilterGroup from './drawer/FilterGroup.vue';\nimport api from '../Api';\nimport { formatSize } from '@/filters';\nimport { StateType } from '@/consts';\nimport SiteMap from '@/sites'\nimport Component from 'vue-class-component';\nimport { Prop, Emit } from 'vue-property-decorator';\n\nconst stateList = [\n {\n title: tr('category_state.downloading'),\n state: StateType.Downloading,\n icon: 'download',\n },\n {\n title: tr('category_state.seeding'),\n state: StateType.Seeding,\n icon: 'upload',\n },\n {\n title: tr('category_state.completed'),\n state: StateType.Completed,\n icon: 'check',\n },\n {\n title: tr('category_state.resumed'),\n state: StateType.Resumed,\n icon: 'play',\n },\n {\n title: tr('category_state.paused'),\n state: StateType.Paused,\n icon: 'pause',\n },\n {\n title: tr('category_state.active'),\n state: StateType.Active,\n icon: 'filter',\n },\n {\n title: tr('category_state.inactive'),\n state: StateType.Inactive,\n icon: 'filter-outline',\n },\n {\n title: tr('category_state.errored'),\n state: StateType.Errored,\n icon: 'alert',\n },\n];\n\ninterface MenuItem {\n icon: string;\n 'icon-alt'?: string;\n title: string;\n model?: boolean | null;\n select?: string;\n click?: () => void;\n children?: MenuChildrenItem[];\n}\n\ninterface MenuChildrenItem extends MenuItem {\n key: string | null;\n append?: string;\n}\n\n@Component({\n components: {\n FilterGroup,\n },\n computed: {\n ...mapGetters([\n 'isDataReady',\n 'allTorrents',\n 'allCategories',\n 'allTags',\n 'torrentGroupByCategory',\n 'torrentGroupByTag',\n 'torrentGroupBySite',\n 'torrentGroupByState',\n ]),\n },\n})\nexport default class Drawer extends Vue {\n @Prop()\n readonly value: any\n\n endItems: MenuItem[] = [\n { icon: 'mdi-delta', title: tr('logs'), click: () => this.updateOptions('showLogs', true) },\n { icon: 'mdi-card-search-outline', title: tr('search'), click: () => this.updateOptions('showSearch', true) },\n ]\n\n pcItems: MenuItem[] = [\n { icon: 'mdi-rss-box', title: 'RSS', click: () => this.updateOptions('showRss', true) },\n { icon: 'mdi-cog-box', title: tr('settings'), click: () => this.updateOptions('showSettings', true) },\n { icon: 'mdi-history', title: tr('label.switch_to_old_ui'), click: this.switchUi },\n ]\n\n isDataReady!: boolean\n allTorrents!: Torrent[]\n allCategories!: Category[]\n allTags!: Tag[]\n torrentGroupByCategory!: {[category: string]: Torrent[]}\n torrentGroupByTag!: {[tag: string]: Torrent[]}\n torrentGroupBySite!: {[site: string]: Torrent[]}\n torrentGroupByState!: {[state: string]: Torrent[]}\n\n created() {\n if (this.phoneLayout) {\n return;\n }\n\n this.endItems = this.endItems.concat(this.pcItems)\n }\n\n get phoneLayout() {\n return this.$vuetify.breakpoint.smAndDown;\n }\n\n buildStateGroup(): MenuChildrenItem[] {\n return stateList.map((item) => {\n let value = this.torrentGroupByState[item.state];\n if (isUndefined(value)) {\n value = [];\n }\n const size = formatSize(sumBy(value, 'size'));\n const title = `${item.title} (${value.length})`;\n const append = `[${size}]`;\n return {\n icon: `mdi-${item.icon}`, title, key: item.state, append,\n };\n })\n }\n\n buildCategoryGroup(): MenuChildrenItem[] {\n return [{\n key: '',\n name: tr('uncategorized'),\n }].concat(this.allCategories).map((category) => {\n let value = this.torrentGroupByCategory[category.key];\n if (isUndefined(value)) {\n value = [];\n }\n const size = formatSize(sumBy(value, 'size'));\n const title = `${category.name} (${value.length})`;\n const append = `[${size}]`;\n return {\n icon: 'mdi-folder', title, key: category.key, append,\n };\n });\n }\n\n buildTagGroup(): MenuChildrenItem[] {\n return [{\n key: '',\n name: tr('untagged'),\n }].concat(this.allTags).map((tag) => {\n let value = this.torrentGroupByTag[tag.key];\n if (isUndefined(value)) {\n value = [];\n }\n const size = formatSize(sumBy(value, 'size'));\n const title = `${tag.name} (${value.length})`;\n const append = `[${size}]`;\n return {\n icon: 'mdi-folder', title, key: tag.key, append,\n };\n });\n }\n\n buildSiteGroup(): MenuChildrenItem[] {\n return sortBy(Object.entries(this.torrentGroupBySite).map(([key, value]) => {\n const size = formatSize(sumBy(value, 'size'));\n const site = SiteMap[key];\n const title = `${site ? site.name : (key || tr('others'))} (${value.length})`;\n const icon = defaultTo(site ? site.icon : null, 'mdi-server');\n const append = `[${size}]`;\n return {\n icon, title, key, append,\n };\n }), 'title');\n }\n\n get items() {\n if (!this.isDataReady) {\n return this.endItems\n }\n\n const filterGroups: MenuItem[] = [];\n const totalSize = formatSize(sumBy(this.allTorrents, 'size'));\n\n filterGroups.push({\n icon: 'mdi-menu-up',\n 'icon-alt': 'mdi-menu-down',\n title: tr('category_state._'),\n model: null,\n select: 'state',\n children: [\n {\n icon: 'mdi-filter-remove', title: `${tr('all')} (${this.allTorrents.length})`, key: null, append: `[${totalSize}]`,\n },\n ...this.buildStateGroup(),\n ],\n });\n\n filterGroups.push({\n icon: 'mdi-menu-up',\n 'icon-alt': 'mdi-menu-down',\n title: tr('category', 0),\n model: null,\n select: 'category',\n children: [\n {\n icon: 'mdi-folder', title: `${tr('all')} (${this.allTorrents.length})`, key: null, append: `[${totalSize}]`,\n },\n ...this.buildCategoryGroup(),\n ],\n });\n\n filterGroups.push({\n icon: 'mdi-menu-up',\n 'icon-alt': 'mdi-menu-down',\n title: tr('tag', 0),\n model: null,\n select: 'tag',\n children: [\n {\n icon: 'mdi-folder', title: `${tr('all')} (${this.allTorrents.length})`, key: null, append: `[${totalSize}]`,\n },\n ...this.buildTagGroup(),\n ],\n });\n\n filterGroups.push({\n icon: 'mdi-menu-up',\n 'icon-alt': 'mdi-menu-down',\n title: tr('sites'),\n model: null,\n select: 'site',\n children: [\n {\n icon: 'mdi-server', title: `${tr('all')} (${this.allTorrents.length})`, key: null, append: `[${totalSize}]`,\n },\n ...this.buildSiteGroup(),\n ],\n });\n\n return ([] as MenuItem[]).concat([{filterGroups}] as any, this.endItems);\n }\n\n async switchUi() {\n await api.switchToOldUi();\n\n window.location.reload(true);\n }\n\n @Emit('input')\n updateOptions(key: string, value: any) {\n return Object.assign({}, this.value, { [key]: value })\n }\n}\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??ref--14-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Drawer.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??ref--14-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Drawer.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Drawer.vue?vue&type=template&id=333e2f85&scoped=true&\"\nimport script from \"./Drawer.vue?vue&type=script&lang=ts&\"\nexport * from \"./Drawer.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./Drawer.vue?vue&type=style&index=0&id=333e2f85&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"333e2f85\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VList } from 'vuetify/lib/components/VList';\nimport { VListGroup } from 'vuetify/lib/components/VList';\nimport { VListItem } from 'vuetify/lib/components/VList';\nimport { VListItemContent } from 'vuetify/lib/components/VList';\nimport { VListItemIcon } from 'vuetify/lib/components/VList';\nimport { VListItemTitle } from 'vuetify/lib/components/VList';\ninstallComponents(component, {VIcon,VList,VListGroup,VListItem,VListItemContent,VListItemIcon,VListItemTitle})\n","var render = function () {\nvar _obj;\nvar _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-dialog',{attrs:{\"value\":true,\"persistent\":\"\",\"width\":\"25em\"}},[_c('v-card',[_c('v-toolbar',{attrs:{\"dark\":\"\",\"color\":\"primary\"}},[_c('v-toolbar-title',[_vm._v(_vm._s(_vm.$t('login')))])],1),_c('v-card-text',[_c('v-form',{ref:\"form\",model:{value:(_vm.valid),callback:function ($$v) {_vm.valid=$$v},expression:\"valid\"}},[_c('div',_vm._b({staticClass:\"pa-0\",on:{\"!keyup\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }return _vm.submit.apply(null, arguments)}}},'div',( _obj = {}, _obj[(\"grid-list-\" + (_vm.$vuetify.breakpoint.name))] = true, _obj ),false),[_c('v-text-field',{attrs:{\"prepend-icon\":\"mdi-network\",\"label\":_vm.$t('label.base_url'),\"autofocus\":\"\",\"required\":\"\"},model:{value:(_vm.baseUrl),callback:function ($$v) {_vm.baseUrl=$$v},expression:\"baseUrl\"}}),_c('v-text-field',{attrs:{\"prepend-icon\":\"mdi-account\",\"label\":_vm.$t('username'),\"autofocus\":\"\",\"required\":\"\"},model:{value:(_vm.params.username),callback:function ($$v) {_vm.$set(_vm.params, \"username\", $$v)},expression:\"params.username\"}}),_c('v-text-field',{attrs:{\"prepend-icon\":\"mdi-lock\",\"append-icon\":_vm.showPassword ? 'mdi-eye' : 'mdi-eye-off',\"label\":_vm.$t('password'),\"type\":_vm.showPassword ? 'text' : 'password',\"required\":\"\"},on:{\"click:append\":function($event){_vm.showPassword = !_vm.showPassword}},model:{value:(_vm.params.password),callback:function ($$v) {_vm.$set(_vm.params, \"password\", $$v)},expression:\"params.password\"}})],1)]),_c('v-alert',{attrs:{\"type\":\"warning\",\"value\":_vm.loginError},domProps:{\"textContent\":_vm._s(_vm.loginError)}})],1),_c('v-card-actions',[_c('v-spacer'),_c('v-btn',{attrs:{\"color\":\"primary\",\"disabled\":!_vm.valid || _vm.submitting,\"loading\":_vm.submitting},on:{\"click\":_vm.submit}},[_vm._v(\" \"+_vm._s(_vm.$t('submit'))+\" \")])],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport { defineComponent, reactive, toRefs } from '@vue/composition-api';\n\nimport api from '@/Api';\nimport { useStore } from '@/store';\n\nexport default defineComponent({\n setup(_, { emit }) {\n const store = useStore();\n const data = reactive({\n valid: false,\n submitting: false,\n showPassword: false,\n loginError: null,\n baseUrl: store.getters.config.baseUrl || location.href,\n params: {\n username: '',\n password: '',\n },\n form: null,\n });\n\n const submit = async () => {\n if (data.submitting) {\n return;\n }\n\n if (!(data.form as any).validate()) {\n return;\n }\n\n data.submitting = true;\n try {\n const resp = await api.login(data.params, data.baseUrl);\n\n if (resp === 'Ok.') {\n api.changeBaseUrl(data.baseUrl);\n\n store.commit('updateConfig', {\n key: 'baseUrl',\n value: data.baseUrl,\n });\n store.commit('updateNeedAuth', false);\n\n emit('input', false);\n return;\n }\n\n data.loginError = resp;\n } catch (e) {\n data.loginError = e.message;\n }\n\n data.submitting = false;\n }\n\n return {\n ...toRefs(data),\n submit,\n }\n },\n});\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??ref--14-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LoginForm.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??ref--14-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LoginForm.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./LoginForm.vue?vue&type=template&id=007a016c&\"\nimport script from \"./LoginForm.vue?vue&type=script&lang=ts&\"\nexport * from \"./LoginForm.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VAlert } from 'vuetify/lib/components/VAlert';\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VCardActions } from 'vuetify/lib/components/VCard';\nimport { VCardText } from 'vuetify/lib/components/VCard';\nimport { VDialog } from 'vuetify/lib/components/VDialog';\nimport { VForm } from 'vuetify/lib/components/VForm';\nimport { VSpacer } from 'vuetify/lib/components/VGrid';\nimport { VTextField } from 'vuetify/lib/components/VTextField';\nimport { VToolbar } from 'vuetify/lib/components/VToolbar';\nimport { VToolbarTitle } from 'vuetify/lib/components/VToolbar';\ninstallComponents(component, {VAlert,VBtn,VCard,VCardActions,VCardText,VDialog,VForm,VSpacer,VTextField,VToolbar,VToolbarTitle})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-app-bar',{staticClass:\"app-bar pl-2\",class:{'phone-layout': _vm.phoneLayout},attrs:{\"clipped-left\":_vm.$vuetify.breakpoint.lgAndUp,\"scroll-off-screen\":!_vm.$vuetify.breakpoint.lgAndUp,\"app\":\"\"}},[_c('v-app-bar-nav-icon',{on:{\"click\":_vm.toggle}}),_c('v-toolbar-title',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.searchBarExpanded),expression:\"!searchBarExpanded\"}],staticClass:\"bar-title\"},[_c('img',{staticClass:\"icon\",attrs:{\"src\":\"img/icons/favicon-192x192.png\"}}),_c('span',{staticClass:\"title hidden-sm-and-down ml-3 mr-5\"},[_vm._v(\" qBittorrent Web UI \")])]),(!_vm.phoneLayout)?_c('v-spacer'):_vm._e(),_c('v-text-field',{staticClass:\"search-bar\",attrs:{\"flat\":!_vm.focusedSearch,\"solo\":_vm.focusedSearch,\"solo-inverted\":!_vm.focusedSearch,\"hide-details\":\"\",\"clearable\":!_vm.phoneLayout || _vm.searchBarExpanded,\"prepend-inner-icon\":\"mdi-magnify\",\"label\":_vm.$t('search'),\"value\":_vm.searchQuery},on:{\"focus\":function($event){_vm.focusedSearch = true},\"blur\":function($event){_vm.focusedSearch = false},\"input\":_vm.onSearch}}),(!_vm.phoneLayout)?_c('v-spacer'):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport { throttle } from 'lodash';\nimport Vue from 'vue';\nimport { mapMutations } from 'vuex';\n\nimport Component from 'vue-class-component';\nimport { Prop, Emit } from 'vue-property-decorator';\nimport { ConfigPayload } from '@/store/types';\n\n@Component({\n methods: {\n ...mapMutations([\n 'updateConfig',\n ]),\n },\n})\nexport default class MainToolbar extends Vue {\n @Prop(Boolean)\n readonly value!: boolean\n\n updateConfig!: (_: ConfigPayload) => void\n\n focusedSearch = false\n\n get searchQuery() {\n return this.$store.getters.config.filter.query;\n }\n\n get phoneLayout() {\n return this.$vuetify.breakpoint.smAndDown;\n }\n\n get searchBarExpanded() {\n return this.phoneLayout && (this.focusedSearch || !!this.searchQuery);\n }\n\n @Emit('input')\n toggle() {\n return !this.value;\n }\n\n onSearch = throttle(async (v: string) => {\n // avoid input lag\n await this.$nextTick();\n this.updateConfig({\n key: 'filter',\n value: {\n query: v,\n },\n });\n }, 400)\n}\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??ref--14-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MainToolbar.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??ref--14-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MainToolbar.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./MainToolbar.vue?vue&type=template&id=d37eb7d4&scoped=true&\"\nimport script from \"./MainToolbar.vue?vue&type=script&lang=ts&\"\nexport * from \"./MainToolbar.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./MainToolbar.vue?vue&type=style&index=0&id=d37eb7d4&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"d37eb7d4\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VAppBar } from 'vuetify/lib/components/VAppBar';\nimport { VAppBarNavIcon } from 'vuetify/lib/components/VAppBar';\nimport { VSpacer } from 'vuetify/lib/components/VGrid';\nimport { VTextField } from 'vuetify/lib/components/VTextField';\nimport { VToolbarTitle } from 'vuetify/lib/components/VToolbar';\ninstallComponents(component, {VAppBar,VAppBarNavIcon,VSpacer,VTextField,VToolbarTitle})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{directives:[{name:\"class\",rawName:\"v-class:phone-layout\",value:(_vm.$vuetify.breakpoint.xsOnly),expression:\"$vuetify.breakpoint.xsOnly\",arg:\"phone-layout\"}],staticClass:\"torrents\"},[_c('div',{staticClass:\"toolbar-wrapper\"},[_c('div',{staticClass:\"toolbar\"},[_c('v-btn',{attrs:{\"icon\":\"\",\"title\":_vm.$t('delete'),\"disabled\":!_vm.hasSelected},on:{\"click\":_vm.confirmDelete}},[_c('v-icon',[_vm._v(\"mdi-delete\")])],1),_c('v-divider',{attrs:{\"vertical\":\"\",\"inset\":\"\"}}),_c('v-btn',{attrs:{\"icon\":\"\",\"title\":_vm.$t('resume'),\"disabled\":!_vm.hasSelected},on:{\"click\":_vm.resumeTorrents}},[_c('v-icon',[_vm._v(\"mdi-play\")])],1),_c('v-btn',{attrs:{\"icon\":\"\",\"title\":_vm.$t('pause'),\"disabled\":!_vm.hasSelected},on:{\"click\":_vm.pauseTorrents}},[_c('v-icon',[_vm._v(\"mdi-pause\")])],1),_c('v-btn',{attrs:{\"icon\":\"\",\"title\":_vm.$t('force_start'),\"disabled\":!_vm.hasSelected},on:{\"click\":_vm.forceStartTorrents}},[_c('v-icon',[_vm._v(\"mdi-play-speed\")])],1),_c('v-divider',{attrs:{\"vertical\":\"\",\"inset\":\"\"}}),_c('v-btn',{attrs:{\"icon\":\"\",\"title\":_vm.$t('info'),\"disabled\":!_vm.hasSelected || _vm.selectedRows.length > 5},on:{\"click\":function($event){return _vm.showInfo()}}},[_c('v-icon',[_vm._v(\"mdi-alert-circle\")])],1),_c('v-menu',{attrs:{\"offset-y\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-btn',_vm._g({attrs:{\"icon\":\"\",\"title\":_vm.$t('title.set_category'),\"disabled\":!_vm.hasSelected}},on),[_c('v-icon',[_vm._v(\"mdi-folder-star\")])],1)]}}])},[_c('v-list',{staticClass:\"category-actions\"},[_c('v-subheader',{on:{\"click\":function($event){$event.stopPropagation();}}},[_vm._v(\" \"+_vm._s(_vm.$t('title.set_category'))+\" \")]),_vm._l((_vm.allCategories),function(item,i){return _c('v-list-item',{key:i,on:{\"click\":function($event){return _vm.setTorrentsCategory(item.key)}}},[_c('v-list-item-action',[_c('v-icon',[_vm._v(\"mdi-folder\")])],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\" \"+_vm._s(item.name)+\" \")])],1)],1)}),_c('v-divider'),_c('v-list-item',{on:{\"click\":function($event){return _vm.setTorrentsCategory('')}}},[_c('v-list-item-action',[_c('v-icon',[_vm._v(\"mdi-folder-remove\")])],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\" \"+_vm._s(_vm.$t('reset'))+\" \")])],1)],1)],2)],1),(!_vm.$vuetify.breakpoint.xsOnly)?[_c('v-divider',{attrs:{\"vertical\":\"\",\"inset\":\"\"}}),_c('v-btn',{attrs:{\"icon\":\"\",\"title\":_vm.$t('toggle_sequential'),\"disabled\":!_vm.hasSelected},on:{\"click\":_vm.toggleSequentialTorrents}},[_c('v-icon',[_vm._v(\"mdi-transit-connection-variant\")])],1),_c('v-btn',{attrs:{\"icon\":\"\",\"title\":_vm.$t('title.set_location'),\"disabled\":_vm.selectedRows.length === 0},on:{\"click\":_vm.setTorrentLocation}},[_c('v-icon',[_vm._v(\"mdi-folder-marker\")])],1),_c('v-btn',{attrs:{\"icon\":\"\",\"title\":_vm.$t('reannounce')},on:{\"click\":_vm.reannounceTorrents}},[_c('v-icon',[_vm._v(\"mdi-bullhorn\")])],1),_c('v-btn',{attrs:{\"icon\":\"\",\"title\":_vm.$t('title.edit_tracker')},on:{\"click\":_vm.editTracker}},[_c('v-icon',[_vm._v(\"mdi-server\")])],1),_c('v-btn',{attrs:{\"icon\":\"\",\"title\":_vm.$t('recheck'),\"disabled\":_vm.selectedRows.length === 0},on:{\"click\":_vm.recheckTorrents}},[_c('v-icon',[_vm._v(\"mdi-backup-restore\")])],1)]:_vm._e()],2),_c('v-divider')],1),_c('div',{staticClass:\"table-wrapper\"},[_c('v-data-table',{directives:[{name:\"class\",rawName:\"v-class:hide-headers\",value:(_vm.hasSelected),expression:\"hasSelected\",arg:\"hide-headers\"}],attrs:{\"headers\":_vm.headers,\"items\":_vm.torrents,\"item-key\":\"hash\",\"fixed-header\":\"\",\"show-select\":\"\",\"options\":_vm.pageOptions,\"loading\":_vm.loading,\"dense\":\"\",\"footer-props\":_vm.footerProps,\"mobile-breakpoint\":0},on:{\"update:options\":function($event){_vm.pageOptions=$event}},scopedSlots:_vm._u([{key:\"item\",fn:function(row){return [_c('tr',{key:row.item.hash,on:{\"dblclick\":function($event){$event.preventDefault();return _vm.showInfo(row.item)}}},[_c('td',[_c('v-checkbox',{attrs:{\"value\":row.isSelected,\"hide-details\":\"\"},on:{\"change\":row.select}})],1),_c('td',{staticClass:\"icon-label\",attrs:{\"title\":row.item.name}},[_c('v-icon',{attrs:{\"color\":_vm._f(\"stateColor\")(row.item.state)}},[_vm._v(\" \"+_vm._s(_vm._f(\"stateIcon\")(row.item.state))+\" \")]),_c('span',{staticClass:\"torrent-title\"},[_vm._v(\" \"+_vm._s(row.item.name)+\" \")])],1),_c('td',[_vm._v(_vm._s(_vm._f(\"formatSize\")(row.item.size)))]),_c('td',[_c('v-progress-linear',{staticClass:\"text-center ma-0\",attrs:{\"height\":\"1.4em\",\"value\":row.item.progress * 100,\"color\":_vm._f(\"stateColor\")(row.item.state,true, row.item.seq_dl)}},[_c('span',{class:_vm.getProgressColorClass(row.item.progress)},[_vm._v(\" \"+_vm._s(_vm._f(\"progress\")(row.item.progress))+\" \")])])],1),_c('td',[_vm._v(_vm._s(_vm.$t('torrent_state.' + row.item.state)))]),_c('td',[_vm._v(_vm._s(row.item.num_seeds)+\"/\"+_vm._s(row.item.num_complete))]),_c('td',[_vm._v(_vm._s(row.item.num_leechs)+\"/\"+_vm._s(row.item.num_incomplete))]),_c('td',[_vm._v(_vm._s(_vm._f(\"formatNetworkSpeed\")(row.item.dlspeed)))]),_c('td',[_vm._v(_vm._s(_vm._f(\"formatNetworkSpeed\")(row.item.upspeed)))]),_c('td',[_vm._v(_vm._s(_vm._f(\"formatDuration\")(row.item.eta,{dayLimit: 100})))]),_c('td',[_vm._v(_vm._s(row.item.ratio.toFixed(2)))]),_c('td',[_c('span',{attrs:{\"title\":_vm._f(\"formatTimestamp\")(row.item.added_on)}},[_vm._v(\" \"+_vm._s(_vm._f(\"formatAsDuration\")(row.item.added_on))+\" ago \")])])])]}}]),model:{value:(_vm.selectedRows),callback:function ($$v) {_vm.selectedRows=$$v},expression:\"selectedRows\"}})],1),(_vm.toDelete.length)?_c('confirm-delete-dialog',{model:{value:(_vm.toDelete),callback:function ($$v) {_vm.toDelete=$$v},expression:\"toDelete\"}}):_vm._e(),(_vm.toSetCategory.length)?_c('confirm-set-category-dialog',{attrs:{\"category\":_vm.categoryToSet},model:{value:(_vm.toSetCategory),callback:function ($$v) {_vm.toSetCategory=$$v},expression:\"toSetCategory\"}}):_vm._e(),(_vm.toEditTracker.length)?_c('edit-tracker-dialog',{model:{value:(_vm.toEditTracker),callback:function ($$v) {_vm.toEditTracker=$$v},expression:\"toEditTracker\"}}):_vm._e(),(_vm.toShowInfo.length)?_c('info-dialog',{attrs:{\"tab\":_vm.infoTab},on:{\"update:tab\":function($event){_vm.infoTab=$event}},model:{value:(_vm.toShowInfo),callback:function ($$v) {_vm.toShowInfo=$$v},expression:\"toShowInfo\"}}):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-dialog',{attrs:{\"value\":true,\"fullscreen\":_vm.phoneLayout,\"width\":\"40em\"},on:{\"input\":_vm.closeDialog}},[_c('v-card',[_c('v-card-title',{staticClass:\"headline\"},[_c('v-icon',{staticClass:\"mr-2\"},[_vm._v(\"mdi-delete\")]),_c('span',[_vm._v(_vm._s(_vm.$t('title.delete_torrents')))])],1),_c('v-card-text',{staticClass:\"pb-0\"},[_vm._v(\" \"+_vm._s(_vm.$t('dialog.delete_torrents.msg'))+\" \"),_c('ol',{staticClass:\"torrents pt-6\"},_vm._l((_vm.torrents),function(row,i){return _c('li',{key:i},[_vm._v(\" \"+_vm._s(row.name)+\" \")])}),0),_c('v-checkbox',{attrs:{\"prepend-icon\":\"mdi-file-cancel\",\"label\":_vm.$t('label.also_delete_files')},model:{value:(_vm.deleteFiles),callback:function ($$v) {_vm.deleteFiles=$$v},expression:\"deleteFiles\"}}),(_vm.sameNamedTorrents.length > 0)?_c('v-checkbox',{staticClass:\"mt-0\",attrs:{\"prepend-icon\":\"mdi-file-multiple\",\"label\":_vm.$t('dialog.delete_torrents.also_delete_same_name_torrents', _vm.sameNamedTorrents.length)},model:{value:(_vm.deleteSameNamed),callback:function ($$v) {_vm.deleteSameNamed=$$v},expression:\"deleteSameNamed\"}}):_vm._e()],1),_c('v-card-actions',[_c('v-spacer'),_c('v-btn',{attrs:{\"text\":\"\"},on:{\"click\":_vm.closeDialog}},[_vm._v(\" \"+_vm._s(_vm.$t('cancel'))+\" \")]),_c('v-btn',{attrs:{\"color\":\"warning\",\"disabled\":_vm.submitting,\"loading\":_vm.submitting},on:{\"click\":_vm.submit}},[_vm._v(\" \"+_vm._s(_vm.$t('delete'))+\" \")])],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport Vue from 'vue';\nimport { mapGetters } from 'vuex';\n\nimport api from '@/Api';\nimport { findSameNamedTorrents } from '@/utils';\nimport { Torrent } from '../../types';\nimport Component from 'vue-class-component';\nimport { Emit, Prop } from 'vue-property-decorator';\n\n@Component({\n computed: {\n ...mapGetters(['allTorrents']),\n },\n})\nexport default class ConfirmDeleteDialog extends Vue {\n @Prop(Array)\n readonly value!: Torrent[]\n\n deleteFiles = false\n deleteSameNamed = false\n moveSameNamed = false\n submitting = false\n torrents: Torrent[] = []\n sameNamedTorrents: Torrent[] = []\n\n allTorrents!: Torrent[]\n\n created() {\n this.torrents = this.value;\n this.sameNamedTorrents = findSameNamedTorrents(this.allTorrents, this.torrents);\n }\n\n get phoneLayout() {\n return this.$vuetify.breakpoint.xsOnly;\n }\n\n @Emit('input')\n closeDialog() {\n return []\n }\n\n async submit() {\n if (this.submitting) {\n return;\n }\n\n this.submitting = true;\n\n let torrentsToDelete;\n if (this.deleteSameNamed) {\n torrentsToDelete = this.torrents.concat(this.sameNamedTorrents);\n } else {\n torrentsToDelete = this.torrents;\n }\n const hashes = torrentsToDelete.map((t: any) => t.hash);\n await api.deleteTorrents(hashes, this.deleteFiles);\n\n this.closeDialog();\n }\n}\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??ref--14-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ConfirmDeleteDialog.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??ref--14-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ConfirmDeleteDialog.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./ConfirmDeleteDialog.vue?vue&type=template&id=a01eaf30&scoped=true&\"\nimport script from \"./ConfirmDeleteDialog.vue?vue&type=script&lang=ts&\"\nexport * from \"./ConfirmDeleteDialog.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./ConfirmDeleteDialog.vue?vue&type=style&index=0&id=a01eaf30&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"a01eaf30\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VCardActions } from 'vuetify/lib/components/VCard';\nimport { VCardText } from 'vuetify/lib/components/VCard';\nimport { VCardTitle } from 'vuetify/lib/components/VCard';\nimport { VCheckbox } from 'vuetify/lib/components/VCheckbox';\nimport { VDialog } from 'vuetify/lib/components/VDialog';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VSpacer } from 'vuetify/lib/components/VGrid';\ninstallComponents(component, {VBtn,VCard,VCardActions,VCardText,VCardTitle,VCheckbox,VDialog,VIcon,VSpacer})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-dialog',{attrs:{\"value\":true,\"fullscreen\":_vm.phoneLayout,\"width\":\"40em\"},on:{\"input\":_vm.closeDialog}},[_c('v-card',[_c('v-card-title',{staticClass:\"headline\"},[_c('v-icon',{staticClass:\"mr-2\"},[_vm._v(\"mdi-folder\")]),_c('span',[_vm._v(_vm._s(_vm.$t('title.set_category')))])],1),_c('v-card-text',{staticClass:\"pb-0\"},[(_vm.category)?[_vm._v(\" \"+_vm._s(_vm.$t('dialog.set_category.move', { category: _vm.category }))+\" \")]:[_vm._v(\" \"+_vm._s(_vm.$t('dialog.set_category.reset'))+\" \")],_c('ol',{staticClass:\"torrents pt-6\"},_vm._l((_vm.torrents),function(row,i){return _c('li',{key:i},[_vm._v(\" \"+_vm._s(row.name)+\" \")])}),0),(_vm.sameNamedTorrents.length > 0)?_c('v-checkbox',{staticClass:\"mt-0\",attrs:{\"prepend-icon\":\"mdi-file-multiple\",\"label\":_vm.$t('dialog.set_category.also_move_same_name_torrents', _vm.sameNamedTorrents.length)},model:{value:(_vm.moveSameNamed),callback:function ($$v) {_vm.moveSameNamed=$$v},expression:\"moveSameNamed\"}}):_vm._e()],2),_c('v-card-actions',[_c('v-spacer'),_c('v-btn',{attrs:{\"text\":\"\"},on:{\"click\":_vm.closeDialog}},[_vm._v(\" \"+_vm._s(_vm.$t('cancel'))+\" \")]),_c('v-btn',{attrs:{\"color\":\"warning\",\"disabled\":_vm.submitting,\"loading\":_vm.submitting},on:{\"click\":_vm.submit}},[_vm._v(\" \"+_vm._s(_vm.$t('submit'))+\" \")])],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport Vue from 'vue';\nimport { mapGetters } from 'vuex';\n\nimport api from '@/Api';\nimport { findSameNamedTorrents } from '@/utils';\nimport Component from 'vue-class-component';\nimport { Prop, Emit } from 'vue-property-decorator';\nimport { Torrent } from '../../types';\n\n@Component({\n computed: {\n ...mapGetters(['allTorrents']),\n },\n})\nexport default class ConfirmSetCategoryDialog extends Vue {\n @Prop(Array)\n readonly value!: Torrent[]\n\n @Prop(String)\n readonly category!: string\n\n moveSameNamed = false\n submitting = false\n torrents: Torrent[] = []\n sameNamedTorrents: Torrent[] = []\n\n allTorrents!: Torrent[]\n\n created() {\n this.torrents = this.value;\n this.sameNamedTorrents = findSameNamedTorrents(this.allTorrents, this.torrents);\n }\n\n get phoneLayout() {\n return this.$vuetify.breakpoint.xsOnly;\n }\n\n @Emit('input')\n closeDialog() {\n return []\n }\n\n async submit() {\n if (this.submitting) {\n return;\n }\n\n this.submitting = true;\n\n let torrentsToMove;\n if (this.moveSameNamed) {\n torrentsToMove = this.torrents.concat(this.sameNamedTorrents);\n } else {\n torrentsToMove = this.torrents;\n }\n const hashes = torrentsToMove.map((t: any) => t.hash);\n await api.setTorrentsCategory(hashes, this.category);\n\n this.closeDialog();\n }\n}\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??ref--14-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ConfirmSetCategoryDialog.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??ref--14-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ConfirmSetCategoryDialog.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./ConfirmSetCategoryDialog.vue?vue&type=template&id=dfcb35ec&scoped=true&\"\nimport script from \"./ConfirmSetCategoryDialog.vue?vue&type=script&lang=ts&\"\nexport * from \"./ConfirmSetCategoryDialog.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./ConfirmSetCategoryDialog.vue?vue&type=style&index=0&id=dfcb35ec&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"dfcb35ec\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VCardActions } from 'vuetify/lib/components/VCard';\nimport { VCardText } from 'vuetify/lib/components/VCard';\nimport { VCardTitle } from 'vuetify/lib/components/VCard';\nimport { VCheckbox } from 'vuetify/lib/components/VCheckbox';\nimport { VDialog } from 'vuetify/lib/components/VDialog';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VSpacer } from 'vuetify/lib/components/VGrid';\ninstallComponents(component, {VBtn,VCard,VCardActions,VCardText,VCardTitle,VCheckbox,VDialog,VIcon,VSpacer})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-dialog',{attrs:{\"value\":true,\"fullscreen\":_vm.phoneLayout,\"persistent\":\"\",\"width\":\"40em\"},on:{\"input\":_vm.closeDialog}},[_c('v-card',[_c('v-card-title',{staticClass:\"headline\"},[_c('v-icon',{staticClass:\"mr-2\"},[_vm._v(\"mdi-server\")]),_c('span',[_vm._v(\"Edit tracker\")])],1),_c('v-card-text',{staticClass:\"pa-0\"},[_c('v-stepper',{model:{value:(_vm.step),callback:function ($$v) {_vm.step=$$v},expression:\"step\"}},[_c('v-stepper-header',[_c('v-stepper-step',{attrs:{\"complete\":_vm.step > 1,\"step\":\"1\"}},[_vm._v(\" Search \")]),_c('v-divider'),_c('v-stepper-step',{attrs:{\"complete\":_vm.step > 2,\"step\":\"2\"}},[_vm._v(\" Preview \")]),_c('v-divider'),_c('v-stepper-step',{attrs:{\"complete\":_vm.step > 3,\"step\":\"3\"}},[_vm._v(\" Result \")])],1),_c('v-stepper-items',[_c('v-stepper-content',{attrs:{\"step\":\"1\"}},[_c('v-form',{model:{value:(_vm.valid),callback:function ($$v) {_vm.valid=$$v},expression:\"valid\"}},[_c('v-text-field',{attrs:{\"label\":\"Search\",\"rules\":[function (v) { return !!v || 'Required'; }],\"placeholder\":\"Regex format\",\"required\":\"\"},model:{value:(_vm.search),callback:function ($$v) {_vm.search=$$v},expression:\"search\"}}),_c('v-text-field',{attrs:{\"label\":\"Replace\"},model:{value:(_vm.replace),callback:function ($$v) {_vm.replace=$$v},expression:\"replace\"}})],1)],1),_c('v-stepper-content',{attrs:{\"step\":\"2\"}},[_vm._v(\" \"+_vm._s(_vm.toEdit.length)+\" torrent(s) to update. \"),_c('ol',{staticClass:\"torrents pt-6\"},_vm._l((_vm.toEdit),function(row,i){return _c('li',{key:i},[_vm._v(\" \"+_vm._s(row.name)+\" \"),_c('br'),_vm._v(\" \"+_vm._s(row.origUrl)+\" \"),_c('br'),_vm._v(\" \"+_vm._s(row.newUrl)+\" \")])}),0)]),_c('v-stepper-content',{attrs:{\"step\":\"3\"}},[(_vm.submitting && _vm.currentIndex != _vm.toEdit.length)?_c('v-progress-linear',{attrs:{\"value\":_vm.currentIndex / _vm.toEdit.length * 100}}):[_vm._v(\" \"+_vm._s(_vm.currentIndex)+\" torrent(s) updated. \")]],2)],1)],1)],1),_c('v-card-actions',[_c('v-spacer'),(_vm.step < 3)?_c('v-btn',{attrs:{\"text\":\"\"},domProps:{\"textContent\":_vm._s(_vm.step == 1 ? _vm.$t('cancel') : _vm.$t('back'))},on:{\"click\":_vm.back}},[_vm._v(\" Back \")]):_vm._e(),_c('v-btn',{attrs:{\"color\":\"warning\",\"disabled\":!_vm.canNext,\"loading\":_vm.submitting},domProps:{\"textContent\":_vm._s([null, _vm.$t('next'), _vm.$t('confirm'), _vm.$t('close')][_vm.step])},on:{\"click\":_vm.foward}})],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport { chain } from 'lodash';\nimport Vue from 'vue';\nimport { mapGetters } from 'vuex';\n\nimport api from '@/Api';\nimport Component from 'vue-class-component';\nimport { Prop, Emit } from 'vue-property-decorator';\nimport { Torrent } from '../../types';\n\n\n@Component({\n computed: {\n ...mapGetters(['allTorrents']),\n },\n})\nexport default class EditTrackerDialog extends Vue {\n @Prop(Array)\n readonly value!: Torrent[]\n\n step = 1\n valid = false\n submitting = false\n torrents: Torrent[] = []\n search = ''\n replace = ''\n toEdit: any[] = []\n currentIndex = 0\n\n allTorrents!: Torrent[]\n\n created() {\n this.torrents = this.value\n }\n\n get phoneLayout() {\n return this.$vuetify.breakpoint.xsOnly;\n }\n get canNext() {\n if (this.step === 1 && this.valid) {\n return true;\n }\n if (this.step === 2 && this.toEdit.length > 0) {\n return true;\n }\n if (this.step === 3 && !this.submitting) {\n return true;\n }\n return false;\n }\n\n @Emit('input')\n closeDialog() {\n return []\n }\n\n calcResults(): any[] {\n const regex = new RegExp(this.search);\n\n return chain(this.torrents)\n .map(({ tracker, hash, name }) => {\n const newUrl = tracker.replace(regex, this.replace);\n return newUrl === tracker ? null : {\n hash,\n name,\n origUrl: tracker,\n newUrl,\n };\n }).compact().value();\n }\n\n back() {\n if (this.step === 1) {\n this.closeDialog();\n return;\n }\n this.step--;\n }\n\n async foward() {\n if (this.step === 1) {\n this.toEdit = this.calcResults();\n this.step++;\n return;\n }\n if (this.step === 3) {\n this.closeDialog();\n return;\n }\n\n if (this.submitting) {\n return;\n }\n\n this.submitting = true;\n this.step++;\n\n this.currentIndex = 0;\n\n for (const item of this.toEdit) {\n await api.editTracker(item.hash, item.origUrl, item.newUrl);\n this.currentIndex++;\n }\n\n this.submitting = false;\n }\n}\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??ref--14-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditTrackerDialog.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??ref--14-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditTrackerDialog.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./EditTrackerDialog.vue?vue&type=template&id=24122721&scoped=true&\"\nimport script from \"./EditTrackerDialog.vue?vue&type=script&lang=ts&\"\nexport * from \"./EditTrackerDialog.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./EditTrackerDialog.vue?vue&type=style&index=0&id=24122721&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"24122721\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VCardActions } from 'vuetify/lib/components/VCard';\nimport { VCardText } from 'vuetify/lib/components/VCard';\nimport { VCardTitle } from 'vuetify/lib/components/VCard';\nimport { VDialog } from 'vuetify/lib/components/VDialog';\nimport { VDivider } from 'vuetify/lib/components/VDivider';\nimport { VForm } from 'vuetify/lib/components/VForm';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VProgressLinear } from 'vuetify/lib/components/VProgressLinear';\nimport { VSpacer } from 'vuetify/lib/components/VGrid';\nimport { VStepper } from 'vuetify/lib/components/VStepper';\nimport { VStepperContent } from 'vuetify/lib/components/VStepper';\nimport { VStepperHeader } from 'vuetify/lib/components/VStepper';\nimport { VStepperItems } from 'vuetify/lib/components/VStepper';\nimport { VStepperStep } from 'vuetify/lib/components/VStepper';\nimport { VTextField } from 'vuetify/lib/components/VTextField';\ninstallComponents(component, {VBtn,VCard,VCardActions,VCardText,VCardTitle,VDialog,VDivider,VForm,VIcon,VProgressLinear,VSpacer,VStepper,VStepperContent,VStepperHeader,VStepperItems,VStepperStep,VTextField})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-dialog',{attrs:{\"value\":true,\"width\":_vm.dialogWidth,\"fullscreen\":_vm.phoneLayout},on:{\"input\":_vm.closeDialog}},[_c('v-card',[_c('v-card-title',{staticClass:\"headline\"},[_c('v-icon',{staticClass:\"mr-2\"},[_vm._v(\" mdi-alert-circle \")]),_c('span',{domProps:{\"textContent\":_vm._s(_vm.$t('info'))}})],1),_c('v-card-text',[_c('v-tabs',{model:{value:(_vm.tabSync),callback:function ($$v) {_vm.tabSync=$$v},expression:\"tabSync\"}},[_c('v-tab',{attrs:{\"href\":\"#general\"}},[_vm._v(\" General \")]),_c('v-tab',{attrs:{\"href\":\"#trackers\"}},[_vm._v(\" Trackers \")]),_c('v-tab',{attrs:{\"href\":\"#peers\"}},[_vm._v(\" Peers \")]),_c('v-tab',{attrs:{\"href\":\"#content\"}},[_vm._v(\" Content \")])],1),_c('v-tabs-items',{attrs:{\"value\":_vm.tab,\"touchless\":\"\"}},[_c('v-tab-item',{attrs:{\"value\":\"general\"}},_vm._l((_vm.torrents),function(torrent){return _c('panel',{key:torrent.hash,attrs:{\"title\":torrent.name,\"single\":_vm.torrents.length === 1}},[_c('torrent-info',{attrs:{\"torrent\":torrent,\"is-active\":_vm.tab === 'general'}})],1)}),1),_c('v-tab-item',{attrs:{\"value\":\"trackers\"}},_vm._l((_vm.torrents),function(torrent){return _c('panel',{key:torrent.hash,attrs:{\"title\":torrent.name,\"single\":_vm.torrents.length === 1}},[_c('trackers',{attrs:{\"hash\":torrent.hash,\"is-active\":_vm.tab === 'trackers'}})],1)}),1),_c('v-tab-item',{attrs:{\"value\":\"peers\"}},_vm._l((_vm.torrents),function(torrent){return _c('panel',{key:torrent.hash,attrs:{\"title\":torrent.name,\"single\":_vm.torrents.length === 1}},[_c('peers',{attrs:{\"hash\":torrent.hash,\"is-active\":_vm.tab === 'peers'}})],1)}),1),_c('v-tab-item',{attrs:{\"value\":\"content\"}},_vm._l((_vm.torrents),function(torrent){return _c('panel',{key:torrent.hash,attrs:{\"title\":torrent.name,\"single\":_vm.torrents.length === 1}},[_c('torrent-content',{attrs:{\"hash\":torrent.hash,\"is-active\":_vm.tab === 'content'}})],1)}),1)],1)],1),_c('v-card-actions',[_c('v-spacer'),_c('v-btn',{attrs:{\"text\":\"\"},domProps:{\"textContent\":_vm._s(_vm.$t('close'))},on:{\"click\":_vm.closeDialog}})],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"torrent-info\"},[_c('div',{staticClass:\"progress\"},[_c('span',[_vm._v(\"Progress:\")]),_c('canvas',{ref:\"canvas\",staticClass:\"progress-inner\"}),_c('span',[_vm._v(_vm._s(_vm._f(\"progress\")(_vm.torrent.progress)))])]),_c('fieldset',[_c('legend',[_vm._v(\"Transfer\")]),(_vm.properties)?_c('v-container',{staticClass:\"pa-1\"},[_c('v-row',{attrs:{\"no-gutters\":\"\"}},[_vm._l((_vm.transfer),function(item){return [_c('v-col',{key:item.label + '_l',staticClass:\"label\",attrs:{\"cols\":\"3\",\"sm\":\"2\",\"md\":\"1\"}},[_vm._v(\" \"+_vm._s(item.label)+\": \")]),_c('v-col',{key:item.label + '_v',staticClass:\"value\",attrs:{\"cols\":\"9\",\"sm\":\"4\",\"md\":\"2\"}},[_vm._v(\" \"+_vm._s(item.value(_vm.properties))+\" \")])]})],2)],1):_vm._e()],1),_c('fieldset',[_c('legend',[_vm._v(\"Information\")]),(_vm.properties)?_c('v-container',{staticClass:\"pa-1\"},[_c('v-row',{attrs:{\"no-gutters\":\"\"}},[_vm._l((_vm.information),function(item){return [_c('v-col',{key:item.label + '_l',staticClass:\"label\",attrs:{\"cols\":\"3\",\"sm\":\"2\",\"md\":\"1\"}},[_vm._v(\" \"+_vm._s(item.label)+\": \")]),_c('v-col',{key:item.label + '_v',staticClass:\"value\",attrs:{\"cols\":\"9\",\"sm\":\"4\",\"md\":\"3\"}},[_vm._v(\" \"+_vm._s(item.value(_vm.properties))+\" \")])]})],2)],1):_vm._e()],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import Vue from 'vue'\nimport Component from 'vue-class-component'\n\n@Component\nexport default class HasTask extends Vue {\n destroy?: boolean\n call?: CallableFunction\n taskId?: number\n interval = 2000\n\n setTaskAndRun(call: CallableFunction, interval?: number) {\n this.call = call\n\n if (interval) {\n this.interval = interval\n }\n\n this.runTask()\n }\n\n async runTask() {\n this.cancelTask()\n\n let r = this.call!()\n if (r instanceof Promise) {\n r = await r\n }\n\n if (this.destroy || r) {\n return\n }\n\n this.taskId = setTimeout(this.runTask, this.interval)\n }\n\n cancelTask() {\n if (this.taskId) {\n clearTimeout(this.taskId);\n this.taskId = 0;\n }\n }\n\n beforeDestroy() {\n this.destroy = true;\n this.cancelTask();\n }\n}\n","import { Prop, Watch, Component } from 'vue-property-decorator'\nimport HasTask from '@/mixins/hasTask'\n\n@Component\nexport default class BaseTorrentInfo extends HasTask {\n @Prop(Boolean)\n readonly isActive!: boolean\n\n protected fetchInfo(): Promise {\n throw 'Not implement'\n }\n\n protected async doTask() {\n await this.fetchInfo()\n \n return !this.isActive\n }\n\n startTask() {\n this.setTaskAndRun(this.doTask, 5000)\n }\n\n created() {\n if (this.isActive) {\n this.startTask()\n }\n }\n\n @Watch('isActive')\n async onActived(v: boolean) {\n if (v) {\n this.startTask()\n } else {\n this.cancelTask();\n }\n }\n}\n","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport {chunk, countBy} from 'lodash'\n\nimport api from '../../Api'\nimport {formatDuration, formatSize, formatTimestamp, toPrecision} from '@/filters'\n\nimport {Torrent, TorrentProperties} from '@/types'\nimport Component from 'vue-class-component'\nimport {Prop, Watch} from 'vue-property-decorator'\nimport BaseTorrentInfo from './baseTorrentInfo'\n\ninterface Item {\n label: string;\n value: (prop: TorrentProperties) => string;\n}\n\nenum PieceState {\n Empty,\n Downloading,\n Downloaded,\n}\n\n@Component({\n\n})\nexport default class TorrentInfo extends BaseTorrentInfo {\n @Prop()\n readonly torrent!: Torrent\n\n properties: TorrentProperties | null = null\n\n transfer: Item[] = [\n {\n label: 'Time active',\n value: prop => formatDuration(prop.time_elapsed) + (prop.seeding_time ? ` (seeded ${formatDuration(prop.seeding_time)})` : ''),\n },\n { label: 'ETA', value: prop => formatDuration(prop.eta, { dayLimit: 100 }) },\n { label: 'Connections', value: prop => `${prop.nb_connections} (${prop.nb_connections_limit} max)` },\n { label: 'Downloaded', value: prop => `${formatSize(prop.total_downloaded_session)}/${formatSize(prop.total_downloaded)}` },\n { label: 'Uploaded', value: prop => `${formatSize(prop.total_uploaded_session)}/${formatSize(prop.total_uploaded)}` },\n { label: 'Seeds', value: prop => `${prop.seeds} (${prop.seeds_total} total)` },\n { label: 'DL speed', value: prop => `${formatSize(prop.dl_speed)}/s` },\n { label: 'UP speed', value: prop => `${formatSize(prop.up_speed)}/s` },\n { label: 'Peers', value: prop => `${prop.peers} (${prop.peers_total} total)` },\n { label: 'Wasted', value: prop => formatSize(prop.total_wasted) },\n { label: 'Share ratio', value: prop => toPrecision(prop.share_ratio, 3) },\n { label: 'Reannounce', value: prop => formatDuration(prop.reannounce) },\n { label: 'Last seen', value: prop => formatTimestamp(prop.last_seen) },\n ]\n\n information: Item[] = [\n { label: 'Total size', value: prop => formatSize(prop.total_size) },\n { label: 'Pieces', value: prop => `${prop.pieces_num} x ${formatSize(prop.piece_size)} (have ${prop.pieces_have})` },\n { label: 'Created by', value: prop => prop.created_by },\n { label: 'Created on', value: prop => formatTimestamp(prop.creation_date) },\n { label: 'Added on', value: prop => formatTimestamp(prop.addition_date) },\n { label: 'Completed on', value: prop => formatTimestamp(prop.completion_date) },\n { label: 'Torrent hash', value: () => this.torrent.hash },\n { label: 'Save path', value: prop => prop.save_path },\n { label: 'Comment', value: prop => prop.comment },\n ]\n pieces: PieceState[] = []\n canvas: CanvasRenderingContext2D | null = null\n\n async getData() {\n this.properties = await api.getTorrentProperties(this.torrent.hash);\n this.pieces = await api.getTorrentPieceStates(this.torrent.hash);\n }\n\n initCanvas(el: HTMLCanvasElement) {\n const { clientWidth, clientHeight } = el;\n /* eslint-disable no-param-reassign */\n el.width = clientWidth;\n el.height = clientHeight;\n /* eslint-enable no-param-reassign */\n\n return el.getContext('2d')!;\n }\n\n fetchInfo() {\n return this.getData()\n }\n\n @Watch('pieces')\n onPiecesChanged(v: PieceState[]) {\n let ctx;\n if (this.canvas) {\n ctx = this.canvas\n } else {\n ctx = this.initCanvas(this.$refs.canvas as HTMLCanvasElement)\n this.canvas = ctx\n }\n\n const { clientHeight, clientWidth } = ctx.canvas;\n ctx.clearRect(0, 0, clientWidth, clientHeight);\n\n const partNum = clientWidth / 2;\n const offset = clientWidth / partNum;\n const chunkSize = Math.floor(v.length / partNum);\n\n const chunks = chunk(v, chunkSize);\n for (let i = 0; i < partNum; i++) {\n const states = countBy(chunks[i]);\n const downloading = states[PieceState.Downloading];\n const empty = states[PieceState.Empty] || 0;\n const downloaded = states[PieceState.Downloaded];\n let color;\n if (downloading) {\n color = 'lightgreen';\n } else if (downloaded >= empty) {\n color = 'lightblue';\n } else {\n continue;\n }\n\n ctx.fillStyle = color;\n ctx.fillRect(i * offset, 0, offset, clientHeight);\n }\n }\n}\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??ref--14-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TorrentInfo.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??ref--14-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TorrentInfo.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./TorrentInfo.vue?vue&type=template&id=7f833448&scoped=true&\"\nimport script from \"./TorrentInfo.vue?vue&type=script&lang=ts&\"\nexport * from \"./TorrentInfo.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./TorrentInfo.vue?vue&type=style&index=0&id=7f833448&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"7f833448\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VCol } from 'vuetify/lib/components/VGrid';\nimport { VContainer } from 'vuetify/lib/components/VGrid';\nimport { VRow } from 'vuetify/lib/components/VGrid';\ninstallComponents(component, {VCol,VContainer,VRow})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"torrent-content\"},[_c('v-treeview',{attrs:{\"open-on-click\":\"\",\"items\":_vm.fileTree,\"value\":_vm.selected,\"selectable\":\"\"},on:{\"input\":_vm.selectChanged},scopedSlots:_vm._u([{key:\"prepend\",fn:function(row){return [(_vm.inChanging.includes(row.item.id))?_c('v-progress-circular',{attrs:{\"size\":\"24\",\"width\":\"2\",\"indeterminate\":\"\"}}):_c('v-icon',{domProps:{\"textContent\":_vm._s(_vm.getRowIcon(row))}})]}},{key:\"append\",fn:function(row){return [_c('span',[_vm._v(\" [\"+_vm._s(_vm._f(\"size\")(row.item.size))+\"] \")]),_c('span',{staticClass:\"progress\"},[_vm._v(\" \"+_vm._s(_vm._f(\"progress\")(row.item.progress))+\" \")])]}}])})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport { groupBy, xor, sumBy } from 'lodash';\nimport api from '../../Api';\nimport BaseTorrentInfo from './baseTorrentInfo'\nimport Component from 'vue-class-component';\nimport { Prop } from 'vue-property-decorator';\n\nenum EFilePriority {\n notDownload = 0,\n normal = 1,\n high = 6,\n maximal = 7\n}\n\n/* eslint-disable camelcase */\ninterface File {\n id: number;\n name: string;\n size: number;\n progress: number;\n priority: EFilePriority;\n is_seed: boolean;\n piece_range: Array;\n availability: number;\n}\n/* eslint-disable camelcase */\n\ninterface TreeItem {\n id: number;\n name: string;\n item?: File;\n children?: Array;\n size: number;\n progress: number;\n}\n\ninterface Data {\n files: Array;\n}\n\nconst FILE_KEY = '/FILE/';\n\nconst UNWANTED_FILE = '.unwanted';\n\n@Component\nexport default class TorrentContent extends BaseTorrentInfo {\n @Prop(String)\n readonly hash!: string\n\n files: File[] = []\n folderIndex!: number\n inChanging: number[] = []\n\n get fileTree(): TreeItem[] {\n return this.buildTree(this.files, 0);\n }\n\n get selected(): number[] {\n return this.files.filter((item) => {\n return item.priority !== EFilePriority.notDownload;\n }).map(item => item.id);\n }\n\n async getFiles() {\n const files = await api.getTorrentFiles(this.hash) as File[]\n files.forEach((v, i) => v.id = i)\n files.sort((a, b) => a.name.localeCompare(b.name))\n\n this.files = files\n this.folderIndex = 0\n\n this.inChanging = [];\n }\n\n getRowIcon(row: any) {\n if (row.item.item) {\n return 'mdi-file';\n }\n\n return row.open ? 'mdi-folder-open' : 'mdi-folder';\n }\n\n async selectChanged(items: Array) {\n const previous = this.selected;\n const diff = xor(previous, items);\n\n if(diff.length == 0) return;\n\n this.inChanging.push(...diff);\n\n await api.setTorrentFilePriority(this.hash, diff, items.length > previous.length ?\n EFilePriority.normal : EFilePriority.notDownload);\n }\n\n getFileFolder(item: File, start: number) {\n const { name } = item;\n const index = name.indexOf('/', start);\n if (index === -1) {\n return FILE_KEY;\n }\n\n return name.substring(start, index);\n }\n\n buildTree(files: Array, start: number): TreeItem[] {\n if (!files.length) {\n return [];\n }\n\n const entries = groupBy(files, item => this.getFileFolder(item, start));\n\n const result = [];\n for (const [folder, values] of Object.entries(entries)) {\n // Push .unwanted file to current folder, just like original web ui\n if(folder === UNWANTED_FILE) {\n for (const item of values) {\n result.push({\n id: item.id,\n name: item.name.substring(start + folder.length + 1),\n item,\n size: item.size,\n progress: item.progress,\n });\n }\n continue;\n }\n\n if (folder !== FILE_KEY) {\n const subTree = this.buildTree(values, start + folder.length + 1);\n // Offset folder id to making sure it will not influence array content\n result.push({\n id: this.files.length + this.folderIndex++,\n name: folder,\n children: subTree,\n size: sumBy(subTree, 'size'),\n progress: sumBy(subTree, 'progress') / subTree.length,\n });\n continue;\n }\n\n for (const item of values) {\n result.push({\n id: item.id,\n name: item.name.substring(start),\n item,\n size: item.size,\n progress: item.progress,\n });\n }\n }\n\n return result;\n }\n\n fetchInfo() {\n return this.getFiles()\n }\n}\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??ref--14-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TorrentContent.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??ref--14-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TorrentContent.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./TorrentContent.vue?vue&type=template&id=360390b3&scoped=true&\"\nimport script from \"./TorrentContent.vue?vue&type=script&lang=ts&\"\nexport * from \"./TorrentContent.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./TorrentContent.vue?vue&type=style&index=0&id=360390b3&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"360390b3\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VProgressCircular } from 'vuetify/lib/components/VProgressCircular';\nimport { VTreeview } from 'vuetify/lib/components/VTreeview';\ninstallComponents(component, {VIcon,VProgressCircular,VTreeview})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-data-table',{attrs:{\"headers\":_vm.headers,\"items\":_vm.trackers,\"items-per-page\":-1,\"hide-default-footer\":true},scopedSlots:_vm._u([{key:\"item\",fn:function(row){return [_c('tr',[_c('td',[_vm._v(_vm._s(row.item.tier))]),_c('td',[_vm._v(_vm._s(row.item.url))]),_c('td',[_vm._v(_vm._s(_vm._f(\"formatTrackerStatus\")(row.item.status)))]),_c('td',[_vm._v(_vm._s(_vm._f(\"formatTrackerNum\")(row.item.num_peers)))]),_c('td',[_vm._v(_vm._s(_vm._f(\"formatTrackerNum\")(row.item.num_seeds)))]),_c('td',[_vm._v(_vm._s(_vm._f(\"formatTrackerNum\")(row.item.num_leeches)))]),_c('td',[_vm._v(_vm._s(_vm._f(\"formatTrackerNum\")(row.item.num_downloaded)))]),_c('td',[_vm._v(_vm._s(row.item.msg))])])]}}])})}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport api from '../../Api';\nimport Component from 'vue-class-component';\nimport { Prop } from 'vue-property-decorator';\nimport BaseTorrentInfo from './baseTorrentInfo';\n\n@Component({\n filters: {\n formatTrackerStatus(status: number) {\n const map = [\n 'Disabled',\n 'Not contacted',\n 'Working',\n 'Updating',\n 'Not working',\n ];\n\n return map[status];\n },\n formatTrackerNum(num: number) {\n if (num === -1) {\n return 'N/A';\n }\n\n return num.toString();\n },\n },\n})\nexport default class Trackers extends BaseTorrentInfo {\n @Prop(String)\n readonly hash!: string\n\n readonly headers = [\n { text: '#', value: 'tier' },\n { text: 'URL', value: 'url' },\n { text: 'Status', value: 'status' },\n { text: 'Peers', value: 'num_peers' },\n { text: 'Seeds', value: 'num_seeds' },\n { text: 'Leeches', value: 'num_leeches' },\n { text: 'Downloaded', value: 'num_downloaded' },\n { text: 'Message', value: 'msg' },\n ]\n\n trackers = []\n\n async getTracker() {\n this.trackers = await api.getTorrentTracker(this.hash);\n }\n\n fetchInfo() {\n return this.getTracker()\n }\n}\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??ref--14-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Trackers.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??ref--14-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Trackers.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Trackers.vue?vue&type=template&id=4101a5a8&\"\nimport script from \"./Trackers.vue?vue&type=script&lang=ts&\"\nexport * from \"./Trackers.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VDataTable } from 'vuetify/lib/components/VDataTable';\ninstallComponents(component, {VDataTable})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-data-table',{attrs:{\"headers\":_vm.headers,\"items\":_vm.peers,\"items-per-page\":-1,\"hide-default-footer\":true},scopedSlots:_vm._u([{key:\"item\",fn:function(row){return [_c('tr',[_c('td',{staticClass:\"ip\"},[(row.item.country_code)?[(_vm.isWindows)?_c('img',{staticClass:\"country-flag\",attrs:{\"title\":row.item.country,\"alt\":_vm.codeToFlag(row.item.country_code).char,\"src\":_vm.codeToFlag(row.item.country_code).url}}):[_vm._v(\" \"+_vm._s(_vm.codeToFlag(row.item.country_code).char)+\" \")]]:_vm._e(),_vm._v(\" \"+_vm._s(row.item.ip)+\" \"),_c('span',{staticClass:\"grey--text\"},[_vm._v(\" :\"+_vm._s(row.item.port)+\" \")])],2),_c('td',[_vm._v(_vm._s(row.item.connection))]),_c('td',{attrs:{\"title\":row.item.flags_desc}},[_vm._v(\" \"+_vm._s(row.item.flags)+\" \")]),_c('td',[_vm._v(_vm._s(row.item.client))]),_c('td',[_vm._v(_vm._s(_vm._f(\"progress\")(row.item.progress)))]),_c('td',[_vm._v(_vm._s(_vm._f(\"networkSpeed\")(row.item.dl_speed)))]),_c('td',[_vm._v(_vm._s(_vm._f(\"networkSize\")(row.item.downloaded)))]),_c('td',[_vm._v(_vm._s(_vm._f(\"networkSpeed\")(row.item.up_speed)))]),_c('td',[_vm._v(_vm._s(_vm._f(\"networkSize\")(row.item.uploaded)))]),_c('td',[_vm._v(_vm._s(_vm._f(\"progress\")(row.item.relevance)))]),_c('td',[_vm._v(_vm._s(row.item.files))])])]}}])})}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport { map, merge, cloneDeep } from 'lodash';\nimport { codeToFlag, isWindows } from '../../utils';\nimport api from '../../Api';\nimport { formatSize } from '../../filters';\nimport BaseTorrentInfo from './baseTorrentInfo';\nimport Component from 'vue-class-component';\nimport { Prop } from 'vue-property-decorator';\n\n@Component({\n filters: {\n networkSpeed(speed: number) {\n if (speed === 0) {\n return null;\n }\n\n return `${formatSize(speed)}/s`;\n },\n networkSize(size: number) {\n if (size === 0) {\n return null;\n }\n\n return formatSize(size);\n },\n },\n})\nexport default class Peers extends BaseTorrentInfo {\n @Prop(String)\n readonly hash!: string\n\n headers = [\n { text: 'IP', value: 'ip' },\n { text: 'Connection', value: 'connection' },\n { text: 'Flags', value: 'flags' },\n { text: 'Client', value: 'client' },\n { text: 'Progress', value: 'progress' },\n { text: 'DL Speed', value: 'dl_speed' },\n { text: 'Downloaded', value: 'downloaded' },\n { text: 'UP Speed', value: 'up_speed' },\n { text: 'Uploaded', value: 'uploaded' },\n { text: 'Relevance', value: 'relevance' },\n { text: 'Files', value: 'files' },\n ]\n\n peersObj: any = null\n rid: number | null = null\n isWindows: boolean = isWindows\n\n get peers() {\n return map(this.peersObj, (value, key) => merge({}, value, { key }));\n }\n\n codeToFlag(code: string) {\n if (code) {\n return codeToFlag(code);\n }\n\n return {};\n }\n\n async getPeers() {\n const resp = await api.getTorrentPeers(this.hash, this.rid || undefined);\n this.rid = resp.rid;\n\n if (resp.full_update) {\n this.peersObj = resp.peers;\n } else {\n const tmp: any = cloneDeep(this.peersObj);\n if (resp.peers_removed) {\n for (const key of resp.peers_removed) {\n delete tmp[key];\n }\n }\n this.peersObj = merge(tmp, resp.peers);\n }\n }\n\n fetchInfo() {\n return this.getPeers()\n }\n\n startTask() {\n this.setTaskAndRun(this.doTask, 2000)\n }\n}\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??ref--14-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Peers.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??ref--14-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Peers.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Peers.vue?vue&type=template&id=a834147c&scoped=true&\"\nimport script from \"./Peers.vue?vue&type=script&lang=ts&\"\nexport * from \"./Peers.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./Peers.vue?vue&type=style&index=0&id=a834147c&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"a834147c\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VDataTable } from 'vuetify/lib/components/VDataTable';\ninstallComponents(component, {VDataTable})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.single)?_c('fieldset',{staticClass:\"panel\"},[_c('legend',{domProps:{\"textContent\":_vm._s(_vm.title)}}),_c('div',{staticClass:\"inner\"},[_vm._t(\"default\")],2)]):_c('div',{staticClass:\"inner\"},[_vm._t(\"default\")],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport Vue from 'vue';\n\nexport default Vue.extend({\n props: {\n single: Boolean,\n title: {\n type: String,\n required: true,\n },\n },\n});\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??ref--14-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Panel.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??ref--14-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Panel.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Panel.vue?vue&type=template&id=1e23acca&scoped=true&\"\nimport script from \"./Panel.vue?vue&type=script&lang=ts&\"\nexport * from \"./Panel.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./Panel.vue?vue&type=style&index=0&id=1e23acca&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"1e23acca\",\n null\n \n)\n\nexport default component.exports","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport Vue from 'vue';\nimport TorrentInfo from './TorrentInfo.vue';\nimport TorrentContent from './TorrentContent.vue';\nimport Trackers from './Trackers.vue';\nimport Peers from './Peers.vue';\nimport Panel from './Panel.vue';\nimport Component from 'vue-class-component';\nimport { Prop, Emit, PropSync } from 'vue-property-decorator';\nimport { Torrent } from '../../types';\n\n@Component({\n components: {\n TorrentInfo,\n TorrentContent,\n Trackers,\n Peers,\n Panel,\n },\n})\nexport default class InfoDialog extends Vue {\n @Prop(Array)\n readonly value!: Torrent[]\n\n @PropSync('tab', String)\n tabSync!: string\n\n torrents!: Torrent[]\n\n created() {\n this.torrents = this.value\n }\n\n get phoneLayout() {\n return this.$vuetify.breakpoint.xsOnly;\n }\n get dialogWidth() {\n return this.phoneLayout ? '100%' : '80%';\n }\n\n @Emit('input')\n closeDialog() {\n return false\n }\n}\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??ref--14-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./InfoDialog.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??ref--14-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./InfoDialog.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./InfoDialog.vue?vue&type=template&id=35c58977&scoped=true&\"\nimport script from \"./InfoDialog.vue?vue&type=script&lang=ts&\"\nexport * from \"./InfoDialog.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./InfoDialog.vue?vue&type=style&index=0&id=35c58977&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"35c58977\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VCardActions } from 'vuetify/lib/components/VCard';\nimport { VCardText } from 'vuetify/lib/components/VCard';\nimport { VCardTitle } from 'vuetify/lib/components/VCard';\nimport { VDialog } from 'vuetify/lib/components/VDialog';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VSpacer } from 'vuetify/lib/components/VGrid';\nimport { VTab } from 'vuetify/lib/components/VTabs';\nimport { VTabItem } from 'vuetify/lib/components/VTabs';\nimport { VTabs } from 'vuetify/lib/components/VTabs';\nimport { VTabsItems } from 'vuetify/lib/components/VTabs';\ninstallComponents(component, {VBtn,VCard,VCardActions,VCardText,VCardTitle,VDialog,VIcon,VSpacer,VTab,VTabItem,VTabs,VTabsItems})\n","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport Vue from 'vue'\nimport { mapState, mapGetters, mapMutations, mapActions } from 'vuex'\nimport { intersection, difference, uniqBy } from 'lodash'\n\nimport { tr } from '@/locale'\nimport ConfirmDeleteDialog from './dialogs/ConfirmDeleteDialog.vue'\nimport ConfirmSetCategoryDialog from './dialogs/ConfirmSetCategoryDialog.vue'\nimport EditTrackerDialog from './dialogs/EditTrackerDialog.vue'\nimport InfoDialog from './dialogs/InfoDialog.vue'\nimport api from '../Api'\nimport { formatSize } from '@/filters'\nimport { DialogType, TorrentFilter, ConfigPayload, DialogConfig, SnackBarConfig } from '@/store/types'\nimport Component from 'vue-class-component'\nimport { Torrent, Category, Tag } from '@/types'\nimport { Watch } from 'vue-property-decorator'\n\nfunction getStateInfo(state: string) {\n let icon;\n switch (state) {\n case 'metaDL':\n case 'allocating':\n case 'downloading':\n case 'forcedDL':\n icon = {\n icon: 'download',\n color: 'info',\n };\n break;\n case 'uploading':\n case 'forcedUP':\n icon = {\n icon: 'upload',\n color: 'info',\n };\n break;\n case 'stalledDL':\n icon = {\n icon: 'download',\n color: null,\n };\n break;\n case 'stalledUP':\n icon = {\n icon: 'upload',\n color: null,\n };\n break;\n case 'pausedDL':\n icon = {\n icon: 'pause',\n color: 'warning',\n };\n break;\n case 'pausedUP':\n icon = {\n icon: 'check',\n color: null,\n };\n break;\n case 'queuedDL':\n case 'queuedUP':\n icon = {\n icon: 'timer-sand',\n color: 'info',\n };\n break;\n case 'checkingDL':\n case 'checkingUP':\n case 'queuedForChecking':\n case 'checkingResumeData':\n case 'moving':\n icon = {\n icon: 'backup-restore',\n color: 'info',\n };\n break;\n case 'error':\n case 'unknown':\n case 'missingFiles':\n icon = {\n icon: 'alert',\n color: 'error',\n };\n break;\n default:\n throw Error('Unknown state');\n }\n\n return icon;\n}\n\n@Component({\n components: {\n ConfirmDeleteDialog,\n ConfirmSetCategoryDialog,\n EditTrackerDialog,\n InfoDialog,\n },\n computed: {\n ...mapGetters([\n 'isDataReady',\n 'allTorrents',\n 'allTags',\n 'allCategories',\n 'torrentGroupByCategory',\n 'torrentGroupByTag',\n 'torrentGroupBySite',\n 'torrentGroupByState',\n ]),\n ...mapState({\n filter(state, getters) {\n return getters.config.filter;\n },\n }),\n },\n filters: {\n formatNetworkSpeed(speed: number) {\n if (speed === 0) {\n return null;\n }\n\n return `${formatSize(speed)}/s`;\n },\n stateIcon(state: string) {\n const item = getStateInfo(state);\n return `mdi-${item.icon}`;\n },\n stateColor(state: string, isProgress?: boolean, isSeqDL?: boolean) {\n const item = getStateInfo(state);\n if (!isProgress) {\n return item.color;\n }\n if (isSeqDL) {\n return '#e33371' // icon.color.secondary;\n }\n\n return item.color || '#0008';\n },\n },\n methods: {\n ...mapMutations([\n 'updateConfig',\n 'showSnackBar',\n ]),\n ...mapActions([\n 'asyncShowDialog',\n ]),\n },\n})\nexport default class Torrents extends Vue {\n readonly headers = [\n { text: tr('name'), value: 'name' },\n { text: tr('size'), value: 'size' },\n { text: tr('progress'), value: 'progress' },\n { text: tr('status'), value: 'state' },\n { text: tr('seeds'), value: 'num_complete' },\n { text: tr('peers'), value: 'num_incomplete' },\n { text: tr('dl_speed'), value: 'dlspeed' },\n { text: tr('up_speed'), value: 'upspeed' },\n { text: tr('eta'), value: 'eta' },\n { text: tr('ratio'), value: 'ratio' },\n { text: tr('added_on'), value: 'added_on' },\n ]\n\n readonly footerProps = {\n 'items-per-page-options': [10, 20, 50, -1],\n }\n\n selectedRows: Torrent[] = []\n toDelete: Torrent[] = []\n toSetCategory: Torrent[] = []\n categoryToSet: string | null = null\n toShowInfo: Torrent[] = []\n toEditTracker: Torrent[] = []\n infoTab = null\n pageOptions: any = null\n\n isDataReady!: boolean\n allTorrents!: Torrent[]\n allCategories!: Category[]\n allTags!: Tag[]\n torrentGroupByCategory!: {[category: string]: Torrent[]}\n torrentGroupByTag!: {[tag: string]: Torrent[]}\n torrentGroupBySite!: {[site: string]: Torrent[]}\n torrentGroupByState!: {[state: string]: Torrent[]}\n filter!: TorrentFilter\n\n updateConfig!: (_: ConfigPayload) => void\n showSnackBar!: (_: SnackBarConfig) => void\n asyncShowDialog!: (_: DialogConfig) => Promise\n\n get loading() {\n return !this.isDataReady;\n }\n get hasSelected() {\n return !!this.selectedRows.length;\n }\n get selectedHashes() {\n return this.selectedRows.map(r => r.hash);\n }\n\n get torrents() {\n if (!this.isDataReady) {\n return [];\n }\n\n let list = this.allTorrents;\n if (this.filter.site !== null) {\n list = intersection(list, this.torrentGroupBySite[this.filter.site]);\n }\n if (this.filter.category !== null) {\n list = intersection(list, this.torrentGroupByCategory[this.filter.category]);\n }\n if (this.filter.tag !== null) {\n list = intersection(list, this.torrentGroupByTag[this.filter.tag]);\n }\n if (this.filter.state !== null) {\n list = intersection(list, this.torrentGroupByState[this.filter.state]);\n }\n if (this.filter.query) {\n const q = this.filter.query.toLowerCase();\n\n list = list.filter(t => {\n return t.name.toLowerCase().includes(q) ||\n t.tracker.toLowerCase().includes(q) ||\n t.category.toLowerCase().includes(q);\n });\n }\n\n return list;\n }\n\n get hasSelectedAll() {\n return this.hasSelected && this.selectedRows.length\n === Math.min(this.torrents.length, this.pageOptions.rowsPerPage);\n }\n\n getProgressColorClass(progress: number) {\n const color = (progress >= 0.5 || (this as any).$vuetify.theme.dark)\n ? 'white' : 'black';\n return `${color}--text`;\n }\n\n created() {\n this.pageOptions = this.$store.getters.config.pageOptions;\n }\n\n confirmDelete() {\n this.toDelete = this.selectedRows;\n }\n\n showInfo(row?: any) {\n this.toShowInfo = row ? [row] : this.selectedRows;\n }\n\n async resumeTorrents() {\n await api.resumeTorrents(this.selectedHashes);\n }\n\n async forceStartTorrents() {\n await api.setForceStartTorrents(this.selectedHashes);\n }\n\n async toggleSequentialTorrents() {\n await api.toggleSequentialTorrents(this.selectedHashes);\n }\n async pauseTorrents() {\n await api.pauseTorrents(this.selectedHashes);\n }\n\n async reannounceTorrents() {\n if (!this.hasSelected) {\n this.selectedRows = this.allTorrents;\n }\n\n await api.reannounceTorrents(this.selectedHashes);\n\n this.showSnackBar({text: tr('label.reannounced')});\n }\n\n async recheckTorrents() {\n const v = await this.asyncShowDialog({\n title: tr('title.recheck_torrents'),\n text: tr('dialog.recheck_torrents.msg'),\n type: DialogType.OkCancel,\n });\n\n if (!v) {\n return;\n }\n await api.recheckTorrents(this.selectedHashes);\n\n this.showSnackBar({text: tr('label.rechecking')});\n }\n\n async setTorrentLocation() {\n const savePaths = uniqBy(this.selectedRows, 'save_path');\n\n const oldPath = savePaths.length > 1 ? '' : savePaths[0].save_path\n const v = await this.asyncShowDialog({\n title: tr('title.set_location'),\n text: '',\n type: DialogType.Input,\n value: oldPath,\n });\n\n if (!v) {\n return;\n }\n\n this.showSnackBar({text: tr('label.moving')});\n\n try {\n await api.setTorrentLocation(this.selectedHashes, v);\n } catch (e) {\n this.showSnackBar({text: e});\n return;\n }\n\n this.showSnackBar({text: tr('label.moved')});\n }\n\n setTorrentsCategory(category: string) {\n this.categoryToSet = category;\n this.toSetCategory = this.selectedRows;\n }\n\n editTracker() {\n if (this.hasSelected) {\n this.selectedRows = this.allTorrents;\n }\n this.toEditTracker = this.selectedRows;\n }\n\n @Watch('pageOptions', { deep: true})\n onPageOptionsChanged() {\n this.updateConfig({\n key: 'pageOptions',\n value: this.pageOptions,\n })\n }\n\n @Watch('filter')\n onFilterChanged() {\n this.selectedRows = []\n }\n\n @Watch('torrents')\n onTorrentsChanged(v: Torrent[]) {\n if (!this.hasSelected) {\n return;\n }\n\n const torrentHashs = v.map(t => t.hash);\n const toRemove = difference(this.selectedHashes, torrentHashs);\n if (!toRemove) {\n return;\n }\n\n this.selectedRows = this.selectedRows.filter(r => !toRemove.includes(r.hash));\n }\n}\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??ref--14-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Torrents.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??ref--14-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Torrents.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Torrents.vue?vue&type=template&id=c7d208ac&scoped=true&\"\nimport script from \"./Torrents.vue?vue&type=script&lang=ts&\"\nexport * from \"./Torrents.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./Torrents.vue?vue&type=style&index=0&id=c7d208ac&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"c7d208ac\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VCheckbox } from 'vuetify/lib/components/VCheckbox';\nimport { VDataTable } from 'vuetify/lib/components/VDataTable';\nimport { VDivider } from 'vuetify/lib/components/VDivider';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VList } from 'vuetify/lib/components/VList';\nimport { VListItem } from 'vuetify/lib/components/VList';\nimport { VListItemAction } from 'vuetify/lib/components/VList';\nimport { VListItemContent } from 'vuetify/lib/components/VList';\nimport { VListItemTitle } from 'vuetify/lib/components/VList';\nimport { VMenu } from 'vuetify/lib/components/VMenu';\nimport { VProgressLinear } from 'vuetify/lib/components/VProgressLinear';\nimport { VSubheader } from 'vuetify/lib/components/VSubheader';\ninstallComponents(component, {VBtn,VCheckbox,VDataTable,VDivider,VIcon,VList,VListItem,VListItemAction,VListItemContent,VListItemTitle,VMenu,VProgressLinear,VSubheader})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.isDataReady)?_c('div',{staticClass:\"footer d-flex\",class:_vm.topLayoutClass},[(_vm.app)?_c('div',{staticClass:\"d-flex shrink\",class:_vm.phoneLayout ? 'flex-column' : 'align-center'},[(!_vm.phoneLayout)?_c('div',[_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('span',_vm._g({},on),[_vm._v(\" qBittorrent \"+_vm._s(_vm.app.version)+\" \")])]}}],null,false,3135644960)},[_c('span',[_vm._v(\" API version: \"+_vm._s(_vm.app.apiVersion)+\" \")]),_c('br'),_c('span',[_vm._v(\" qb-web version: \"+_vm._s(_vm.buildInfo)+\" \")])])],1):_vm._e(),(!_vm.phoneLayout)?_c('v-divider',{staticClass:\"mx-2\",attrs:{\"vertical\":\"\"}}):_vm._e(),_c('div',{staticClass:\"icon-label\"},[_c('v-icon',[_vm._v(\"mdi-sprout\")]),_vm._v(\" \"+_vm._s(_vm.allTorrents.length)+\" [\"+_vm._s(_vm._f(\"formatSize\")(_vm.totalSize))+\"] \")],1),(!_vm.phoneLayout)?_c('v-divider',{staticClass:\"mx-2\",attrs:{\"vertical\":\"\"}}):_vm._e(),_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('div',_vm._g({staticClass:\"icon-label\"},on),[_c('v-icon',[_vm._v(\"mdi-nas\")]),_vm._v(\" \"+_vm._s(_vm._f(\"formatSize\")(_vm.info.free_space_on_disk))+\" \")],1)]}}],null,false,3909253775)},[_c('span',[_vm._v(\" Queued I/O jobs: \"+_vm._s(_vm.info.queued_io_jobs)+\" \")]),_c('br'),_c('span',[_vm._v(\" Avg queue time: \"+_vm._s(_vm.info.average_time_queue)+\" ms \")])]),(!_vm.phoneLayout)?_c('v-divider',{staticClass:\"mx-2\",attrs:{\"vertical\":\"\"}}):_vm._e(),(!_vm.phoneLayout)?_c('div',{staticClass:\"icon-label\"},[_c('v-icon',{staticClass:\"icon-upload-download\"},[_vm._v(\" mdi-swap-vertical-bold \")]),_c('span',[_vm._v(\" \"+_vm._s(_vm._f(\"formatSize\")(_vm.info.alltime_dl))+\"/\"+_vm._s(_vm._f(\"formatSize\")(_vm.info.alltime_ul))+\" \")])],1):_vm._e()],1):_vm._e(),(_vm.info)?_c('div',{staticClass:\"d-flex shrink\",class:_vm.phoneLayout ? 'flex-column' : 'align-center'},[(!_vm.phoneLayout)?_c('div',{staticClass:\"icon-label\"},[_c('v-icon',[_vm._v(\"mdi-lan\")]),_vm._v(\" \"+_vm._s(_vm.$t('label.dht_nodes', _vm.info.dht_nodes))+\" \")],1):_vm._e(),(!_vm.phoneLayout)?_c('v-divider',{staticClass:\"mx-2\",attrs:{\"vertical\":\"\"}}):_vm._e(),_c('div',{staticClass:\"icon-label\"},[_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g({attrs:{\"color\":_vm._f(\"connectionIconColor\")(_vm.info.connection_status)}},on),[_vm._v(\" mdi-\"+_vm._s(_vm._f(\"connectionIcon\")(_vm.info.connection_status))+\" \")]),(_vm.phoneLayout)?_c('span',[_vm._v(\" Network \"+_vm._s(_vm.info.connection_status)+\" \")]):_vm._e()]}}],null,false,452698304)},[_c('span',[_vm._v(\" Network \"+_vm._s(_vm.info.connection_status)+\" \")])])],1),(!_vm.phoneLayout)?_c('v-divider',{staticClass:\"mx-2\",attrs:{\"vertical\":\"\"}}):_vm._e(),_c('div',{staticClass:\"icon-label\"},[(_vm.phoneLayout)?_c('v-switch',{staticClass:\"mt-0 pt-0 speed-switch\",attrs:{\"hide-details\":\"\",\"value\":_vm.speedLimited,\"label\":\"Alternative speed limits\"},on:{\"change\":_vm.toggleSpeedLimitsMode},scopedSlots:_vm._u([{key:\"prepend\",fn:function(){return [_c('v-icon',_vm._b({},'v-icon',_vm.speedModeBind,false),[_vm._v(\" mdi-speedometer \")])]},proxy:true}],null,false,2672072414)}):_c('v-tooltip',{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-icon',_vm._g(_vm._b({on:{\"click\":_vm.toggleSpeedLimitsMode}},'v-icon',_vm.speedModeBind,false),on),[_vm._v(\" mdi-speedometer \")])]}}],null,false,3284983233)},[_c('span',[_vm._v(\" Alternative speed limits \"+_vm._s(_vm.speedLimited ? 'enabled' : 'disabled')+\" \")])])],1),(!_vm.phoneLayout)?_c('v-divider',{staticClass:\"mx-2\",attrs:{\"vertical\":\"\"}}):_vm._e(),_c('div',{staticClass:\"icon-label\"},[_c('v-icon',{attrs:{\"color\":_vm.info.dl_info_speed > 0 ? 'success' : null}},[_vm._v(\" mdi-download \")]),_c('span',[_vm._v(\" \"+_vm._s(_vm._f(\"formatSize\")(_vm.info.dl_info_speed))+\"/s \"),(_vm.info.dl_rate_limit)?[_vm._v(\" (\"+_vm._s(_vm._f(\"formatSize\")(_vm.info.dl_rate_limit))+\"/s) \")]:_vm._e(),(!_vm.phoneLayout)?[_vm._v(\" [\"+_vm._s(_vm._f(\"formatSize\")(_vm.info.dl_info_data))+\"] \")]:_vm._e()],2)],1),(!_vm.phoneLayout)?_c('v-divider',{staticClass:\"mx-2\",attrs:{\"vertical\":\"\"}}):_vm._e(),_c('div',{staticClass:\"icon-label\"},[_c('v-icon',{attrs:{\"color\":_vm.info.up_info_speed > 0 ? 'warning' : null}},[_vm._v(\" mdi-upload \")]),_c('span',[_vm._v(\" \"+_vm._s(_vm._f(\"formatSize\")(_vm.info.up_info_speed))+\"/s \"),(_vm.info.up_rate_limit)?[_vm._v(\" (\"+_vm._s(_vm._f(\"formatSize\")(_vm.info.up_rate_limit))+\"/s) \")]:_vm._e(),(!_vm.phoneLayout)?[_vm._v(\" [\"+_vm._s(_vm._f(\"formatSize\")(_vm.info.up_info_data))+\"] \")]:_vm._e()],2)],1)],1):_vm._e()]):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport { sumBy } from 'lodash';\nimport Vue from 'vue';\nimport { mapState, mapGetters } from 'vuex';\nimport api from '../Api';\nimport buildInfo from '@/buildInfo';\nimport Component from 'vue-class-component';\nimport { Prop, Watch } from 'vue-property-decorator';\nimport { Torrent, ServerState } from '@/types';\n\n\n@Component({\n filters: {\n connectionIcon(status: string) {\n const statusMap: any = {\n connected: 'check-network',\n firewalled: 'minus-network',\n disconnected: 'close-network',\n };\n return statusMap[status];\n },\n connectionIconColor(status: string) {\n const statusMap: any = {\n connected: 'success',\n firewalled: 'warning',\n disconnected: 'error',\n };\n return statusMap[status];\n },\n },\n computed: {\n ...mapState({\n info(state: any) {\n return this.isDataReady ? state.mainData.server_state : null;\n },\n }),\n ...mapGetters([\n 'isDataReady',\n 'allTorrents',\n ]),\n },\n})\nexport default class Footer extends Vue {\n @Prop(Boolean)\n readonly phoneLayout!: boolean\n\n app: any = null\n speedLimited = false\n\n buildInfo = buildInfo\n\n info!: ServerState\n isDataReady!: boolean\n allTorrents!: Torrent[]\n\n get totalSize() {\n return sumBy(this.allTorrents, 'size');\n }\n\n get speedModeBind() {\n if (this.speedLimited) {\n return {\n class: 'speed-limited',\n color: 'warning',\n };\n }\n\n return {\n class: null,\n color: 'success',\n };\n }\n\n get topLayoutClass() {\n const v = this.phoneLayout;\n if (v) {\n return ['in-drawer', 'flex-column'];\n }\n\n return ['mx-4', 'justify-space-between'];\n }\n\n async getAppInfo() {\n let resp = await api.getAppVersion();\n const version = resp.data;\n\n resp = await api.getApiVersion();\n const apiVersion = resp.data;\n\n this.app = {\n version, apiVersion,\n };\n }\n\n async toggleSpeedLimitsMode() {\n this.speedLimited = !this.speedLimited;\n await api.toggleSpeedLimitsMode();\n }\n\n created() {\n if (!this.isDataReady) {\n return;\n }\n\n this.speedLimited = this.info.use_alt_speed_limits;\n this.getAppInfo();\n }\n\n @Watch('isDataReady')\n onDataReady(v: boolean) {\n if (v && this.app === null) {\n this.getAppInfo();\n }\n }\n\n @Watch('info.use_alt_speed_limits')\n onSpeedLimitChanged (v: boolean) {\n this.speedLimited = v;\n }\n}\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??ref--14-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Footer.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/ts-loader/index.js??ref--14-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Footer.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./Footer.vue?vue&type=template&id=335591ac&scoped=true&\"\nimport script from \"./Footer.vue?vue&type=script&lang=ts&\"\nexport * from \"./Footer.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./Footer.vue?vue&type=style&index=0&id=335591ac&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"335591ac\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VDivider } from 'vuetify/lib/components/VDivider';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VSwitch } from 'vuetify/lib/components/VSwitch';\nimport { VTooltip } from 'vuetify/lib/components/VTooltip';\ninstallComponents(component, {VDivider,VIcon,VSwitch,VTooltip})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-dialog',{attrs:{\"value\":_vm.value,\"scrollable\":\"\",\"fullscreen\":_vm.phoneLayout,\"width\":_vm.dialogWidth},on:{\"input\":function($event){return _vm.$emit('input', $event)}}},[_c('v-card',[_c('v-card-title',{staticClass:\"headline\"},[_c('v-icon',{staticClass:\"mr-2\"},[_vm._v(\"mdi-delta\")]),_c('span',{domProps:{\"textContent\":_vm._s(_vm.$t('logs'))}})],1),_c('v-card-text',[(!_vm.logs.length)?_c('v-progress-linear',{staticClass:\"mt-4\",attrs:{\"indeterminate\":true}}):_vm._e(),_c('ol',{staticClass:\"logs caption\"},_vm._l((_vm.logs),function(row,i){return _c('li',{key:i,staticClass:\"log-item\",class:_vm._f(\"typeColor\")(row.type)},[_c('span',{staticClass:\"tag\"},[_vm._v(\"[\"+_vm._s(_vm._f(\"formatType\")(row.type))+\" \"+_vm._s(_vm._f(\"formatTimestamp\")(row.timestamp / 1000))+\"]\")]),_c('span',{domProps:{\"innerHTML\":_vm._s(row.message)}})])}),0),_c('div',{ref:\"end\"})],1),_c('v-card-actions',[_c('v-spacer'),_c('v-btn',{attrs:{\"text\":\"\"},domProps:{\"textContent\":_vm._s(_vm.$t('close'))},on:{\"click\":_vm.closeDialog}})],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport api from '@/Api';\nimport Component from 'vue-class-component';\nimport HasTask from '../../mixins/hasTask';\nimport { Prop, Emit } from 'vue-property-decorator';\n\n@Component({\n filters: {\n formatType(type: number) {\n const map: any = {\n 1: 'N',\n 2: 'I',\n 4: 'W',\n 8: 'C',\n };\n return map[type];\n },\n typeColor(type: number) {\n const map: any = {\n 1: null,\n 2: 'info--text',\n 4: 'warning--text',\n 8: 'error--text',\n };\n return map[type];\n },\n },\n})\nexport default class LogsDialog extends HasTask {\n @Prop(Boolean)\n readonly value!: boolean\n\n logs: any[] = []\n\n get dialogWidth() {\n return this.$vuetify.breakpoint.smAndDown ? '100%' : '70%';\n }\n get phoneLayout() {\n return this.$vuetify.breakpoint.xsOnly;\n }\n\n @Emit('input')\n closeDialog() {\n return false\n }\n\n async getLogs() {\n const lastId = this.logs.length ? this.logs[this.logs.length - 1].id : -1;\n const logs = await api.getLogs(lastId);\n\n if (this.destroy) {\n return;\n }\n\n if (logs.length) {\n this.logs = this.logs.concat(logs);\n\n await this.$nextTick();\n\n (this.$refs.end as HTMLElement).scrollIntoView();\n }\n }\n\n created() {\n this.setTaskAndRun(this.getLogs)\n }\n}\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??ref--14-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LogsDialog.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??ref--14-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LogsDialog.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./LogsDialog.vue?vue&type=template&id=25ee86f6&scoped=true&\"\nimport script from \"./LogsDialog.vue?vue&type=script&lang=ts&\"\nexport * from \"./LogsDialog.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./LogsDialog.vue?vue&type=style&index=0&id=25ee86f6&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"25ee86f6\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VCardActions } from 'vuetify/lib/components/VCard';\nimport { VCardText } from 'vuetify/lib/components/VCard';\nimport { VCardTitle } from 'vuetify/lib/components/VCard';\nimport { VDialog } from 'vuetify/lib/components/VDialog';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VProgressLinear } from 'vuetify/lib/components/VProgressLinear';\nimport { VSpacer } from 'vuetify/lib/components/VGrid';\ninstallComponents(component, {VBtn,VCard,VCardActions,VCardText,VCardTitle,VDialog,VIcon,VProgressLinear,VSpacer})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-dialog',{attrs:{\"value\":_vm.value,\"fullscreen\":\"\",\"persistent\":\"\"},on:{\"input\":function($event){return _vm.$emit('input', $event)}}},[_c('v-card',[_c('v-card-title',{staticClass:\"headline\"},[_c('v-icon',{staticClass:\"mr-2\"},[_vm._v(\"mdi-rss-box\")]),_c('span',[_vm._v(\"RSS\")]),_c('v-spacer'),_c('v-btn',{attrs:{\"icon\":\"\"},on:{\"click\":_vm.closeDialog}},[_c('v-icon',[_vm._v(\"mdi-close\")])],1)],1),_c('v-card-text',[_c('div',{staticClass:\"toolbar\"},[_c('v-btn',{attrs:{\"icon\":\"\",\"title\":_vm.$t('dialog.rss.add_feed')},on:{\"click\":_vm.addRssItem}},[_c('v-icon',[_vm._v(\"mdi-link-plus\")])],1),_c('v-btn',{attrs:{\"icon\":\"\",\"disabled\":!_vm.selectNode,\"title\":_vm.$t('delete')},on:{\"click\":_vm.deleteRssItem}},[_c('v-icon',[_vm._v(\"mdi-delete\")])],1),_c('v-btn',{attrs:{\"icon\":\"\",\"disabled\":!_vm.selectNode,\"title\":_vm.$t('rename')},on:{\"click\":_vm.renameRssItem}},[_c('v-icon',[_vm._v(\"mdi-file-move\")])],1),_c('v-divider',{attrs:{\"vertical\":\"\"}}),_c('v-btn',{attrs:{\"icon\":\"\",\"disabled\":!_vm.selectNode,\"title\":_vm.$t('refresh')},on:{\"click\":_vm.refreshRssItem}},[_c('v-icon',[_vm._v(\"mdi-refresh\")])],1),_c('v-spacer'),_c('v-divider',{attrs:{\"vertical\":\"\"}}),_c('v-switch',{attrs:{\"input-value\":_vm.preferences.rss_processing_enabled,\"label\":_vm.$t('dialog.rss.auto_refresh'),\"hide-details\":\"\"},on:{\"change\":function($event){return _vm.changePreference('rss_processing_enabled', $event)}}}),_c('v-divider',{attrs:{\"vertical\":\"\"}}),_c('v-switch',{attrs:{\"input-value\":_vm.preferences.rss_auto_downloading_enabled,\"label\":_vm.$t('dialog.rss.auto_download'),\"hide-details\":\"\"},on:{\"change\":function($event){return _vm.changePreference('rss_auto_downloading_enabled', $event)}}}),_c('v-divider',{attrs:{\"vertical\":\"\"}}),_c('v-btn',{attrs:{\"icon\":\"\",\"title\":_vm.$t('settings')},on:{\"click\":function($event){_vm.showRulesDialog = true}}},[_c('v-icon',[_vm._v(\"mdi-cog-box\")])],1)],1),_c('v-divider'),_c('div',{staticClass:\"content\"},[_c('div',{staticClass:\"content-inner\"},[(!_vm.rssNode)?_c('div',{staticClass:\"loading\"},[_c('v-progress-circular',{attrs:{\"indeterminate\":\"\"}})],1):[_c('div',{staticClass:\"rss-items\"},[_c('v-treeview',{attrs:{\"open-on-click\":\"\",\"open-all\":\"\",\"items\":_vm.rssTree,\"item-key\":\"path\",\"activatable\":\"\",\"dense\":\"\"},on:{\"update:active\":function($event){_vm.selectNode = $event[0]}},scopedSlots:_vm._u([{key:\"prepend\",fn:function(row){return [(_vm.isItemLoading(row))?_c('v-progress-circular',{attrs:{\"indeterminate\":\"\",\"size\":\"22\",\"width\":\"2\"}}):_c('v-icon',{domProps:{\"textContent\":_vm._s(_vm.getRowIcon(row))}})]}},{key:\"label\",fn:function(row){return [_vm._v(\" \"+_vm._s(row.item.name)+\" \"),(row.item.children)?[_vm._v(\" (\"+_vm._s(row.item.children.length)+\") \")]:_vm._e()]}}])})],1),_c('v-divider',{attrs:{\"vertical\":\"\"}}),_c('div',{staticClass:\"rss-details\"},[_c('div',{staticClass:\"rss-info\"},[_c('p',[_vm._v(\" \"+_vm._s(_vm.$t('title._'))+\": \"),(_vm.selectItem)?_c('a',{attrs:{\"target\":\"_blank\",\"href\":_vm.selectItem.url}},[_vm._v(_vm._s(_vm.selectItem.title))]):_vm._e()]),_c('p',[_vm._v(_vm._s(_vm.$t('date'))+\": \"+_vm._s(_vm._f(\"date\")((_vm.selectItem ? _vm.selectItem.lastBuildDate : null))))])]),_c('v-divider'),_c('div',{staticClass:\"list-wrapper\"},[(_vm.selectItem)?_c('v-list',{attrs:{\"dense\":\"\"}},[_c('v-list-item-group',{attrs:{\"color\":\"primary\"},model:{value:(_vm.selectArticle),callback:function ($$v) {_vm.selectArticle=$$v},expression:\"selectArticle\"}},_vm._l((_vm.sortArticles(_vm.selectItem.articles)),function(article){return _c('v-list-item',{key:article.id,attrs:{\"value\":article}},[_c('v-list-item-content',[_c('v-list-item-title',[_c('span',{attrs:{\"title\":article.title},domProps:{\"textContent\":_vm._s(article.title)}})])],1),_c('v-list-item-action',[_c('v-btn',{attrs:{\"icon\":\"\"},on:{\"click\":function($event){$event.stopPropagation();return _vm.downloadTorrent(article)}}},[_c('v-icon',[_vm._v(\"mdi-download\")])],1)],1)],1)}),1)],1):_vm._e()],1)],1),_c('v-divider',{attrs:{\"vertical\":\"\"}}),_c('div',{staticClass:\"rss-desc\"},[_c('div',{staticClass:\"rss-info\"},[_c('p',[_vm._v(\" \"+_vm._s(_vm.$t('title._'))+\": \"),(_vm.selectArticle)?_c('a',{attrs:{\"target\":\"_blank\",\"href\":_vm.selectArticle.link}},[_vm._v(_vm._s(_vm.selectArticle.title))]):_vm._e()]),_c('p',[_vm._v(_vm._s(((_vm.$t('category', 1)) + \": \" + (_vm.selectArticle ? _vm.selectArticle.category: ''))))]),_c('p',[_vm._v(_vm._s(_vm.$t('date'))+\": \"+_vm._s(_vm._f(\"date\")((_vm.selectArticle ? _vm.selectArticle.date: null))))])]),_c('v-divider'),(_vm.selectArticle)?_c('iframe',{directives:[{name:\"body\",rawName:\"v-body\",value:(_vm.selectArticle.description),expression:\"selectArticle.description\"}],staticClass:\"iframe\",attrs:{\"sandbox\":\"allow-same-origin\"}}):_vm._e()],1)]],2)])],1)],1),(_vm.showRulesDialog)?_c('RssRulesDialog',{attrs:{\"rss-node\":_vm.rssNode},model:{value:(_vm.showRulesDialog),callback:function ($$v) {_vm.showRulesDialog=$$v},expression:\"showRulesDialog\"}}):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-dialog',{attrs:{\"value\":_vm.value,\"persistent\":\"\",\"width\":\"50%\"},on:{\"input\":function($event){return _vm.$emit('input', $event)}}},[_c('v-card',[_c('v-card-title',{staticClass:\"headline\"},[_c('v-icon',{staticClass:\"mr-2\"},[_vm._v(\"mdi-filter\")]),_c('span',{domProps:{\"textContent\":_vm._s(_vm.$t('dialog.rss_rule.title'))}}),_c('v-spacer'),_c('v-btn',{attrs:{\"icon\":\"\"},on:{\"click\":_vm.closeDialog}},[_c('v-icon',[_vm._v(\"mdi-close\")])],1)],1),_c('v-card-text',[_c('div',{staticClass:\"toolbar\"},[_c('v-btn',{attrs:{\"icon\":\"\",\"title\":_vm.$t('dialog.rss_rule.add_rule')},on:{\"click\":_vm.addRssRule}},[_c('v-icon',[_vm._v(\"mdi-plus\")])],1),_c('v-btn',{attrs:{\"icon\":\"\",\"disabled\":!_vm.selectedRuleName,\"title\":_vm.$t('delete')},on:{\"click\":_vm.deleteRssRule}},[_c('v-icon',[_vm._v(\"mdi-delete\")])],1)],1),_c('v-divider'),_c('div',{staticClass:\"content\"},[(!_vm.rssRules)?_c('div',{staticClass:\"loading\"},[_c('v-progress-circular',{attrs:{\"indeterminate\":\"\"}})],1):[_c('div',{staticClass:\"rss-rules\"},[_c('v-list',{attrs:{\"dense\":\"\"}},[_c('v-list-item-group',{attrs:{\"color\":\"primary\"},model:{value:(_vm.selectedRuleName),callback:function ($$v) {_vm.selectedRuleName=$$v},expression:\"selectedRuleName\"}},_vm._l((_vm.rssRules),function(value,key){return _c('v-list-item',{key:key,attrs:{\"value\":key}},[_c('v-list-item-action',[_c('v-checkbox',{attrs:{\"dense\":\"\"},model:{value:(value.enabled),callback:function ($$v) {_vm.$set(value, \"enabled\", $$v)},expression:\"value.enabled\"}})],1),_c('v-list-item-content',[_c('v-list-item-title',{domProps:{\"textContent\":_vm._s(key)}})],1)],1)}),1)],1)],1),_c('v-divider',{attrs:{\"vertical\":\"\"}}),_c('div',{staticClass:\"rule-details\"},[_c('v-form',{staticClass:\"rule-form\"},[_c('p',{staticClass:\"form-title\",domProps:{\"textContent\":_vm._s(_vm.$t('dialog.rss_rule.rule_settings'))}}),_c('v-checkbox',{attrs:{\"dense\":\"\",\"label\":_vm.$t('dialog.rss_rule.use_regex'),\"disabled\":!_vm.selectedRule.enabled,\"value\":_vm.selectedRule.useRegex},on:{\"change\":function($event){return _vm.editRule('useRegex', $event)}}}),_c('v-text-field',{attrs:{\"dense\":\"\",\"label\":_vm.$t('dialog.rss_rule.must_contain'),\"disabled\":!_vm.selectedRule.enabled,\"value\":_vm.selectedRule.mustContain},on:{\"change\":function($event){return _vm.editRule('mustContain', $event)}}}),_c('v-text-field',{attrs:{\"dense\":\"\",\"label\":_vm.$t('dialog.rss_rule.must_not_contain'),\"disabled\":!_vm.selectedRule.enabled,\"value\":_vm.selectedRule.mustNotContain},on:{\"change\":function($event){return _vm.editRule('mustNotContain', $event)}}}),_c('v-text-field',{attrs:{\"dense\":\"\",\"label\":_vm.$t('dialog.rss_rule.episode_filter'),\"disabled\":!_vm.selectedRule.enabled,\"value\":_vm.selectedRule.episodeFilter},on:{\"change\":function($event){return _vm.editRule('episodeFilter', $event)}}}),_c('v-checkbox',{attrs:{\"dense\":\"\",\"label\":_vm.$t('dialog.rss_rule.smart_episode'),\"disabled\":!_vm.selectedRule.enabled,\"value\":_vm.selectedRule.smartFilter},on:{\"change\":function($event){return _vm.editRule('smartFilter', $event)}}}),_c('v-select',{attrs:{\"dense\":\"\",\"label\":_vm.$t('dialog.rss_rule.assign_category'),\"items\":_vm.categoryItems,\"disabled\":!_vm.selectedRule.enabled,\"value\":_vm.selectedRule.assignedCategory},on:{\"change\":function($event){return _vm.editRule('assignedCategory', $event)}}}),_c('v-text-field',{attrs:{\"dense\":\"\",\"label\":_vm.$t('location'),\"disabled\":!_vm.selectedRule.enabled,\"value\":_vm.selectedRule.savePath},on:{\"change\":function($event){return _vm.editRule('savePath', $event)}}})],1),_c('v-divider'),_c('p',{staticClass:\"feeds-title\",domProps:{\"textContent\":_vm._s(_vm.$t('dialog.rss_rule.apply_to_feeds'))}}),(_vm.selectedRule.enabled)?_c('v-list',{attrs:{\"dense\":\"\"}},_vm._l((_vm.rssItems),function(item){return _c('v-list-item',{key:item.value},[_c('v-list-item-action',[_c('v-checkbox',{attrs:{\"dense\":\"\",\"input-value\":_vm.hasSelectSite(item.value)},on:{\"change\":function($event){return _vm.selectSite(item.value, $event)}}})],1),_c('v-list-item-content',[_c('v-list-item-title',{domProps:{\"textContent\":_vm._s(item.text)}})],1)],1)}),1):_vm._e()],1)]],2)],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport { isEmpty, isEqual, pull, cloneDeep } from 'lodash'\nimport Vue from 'vue'\nimport Component from 'vue-class-component';\n\nimport { tr } from '@/locale'\nimport { Prop, Emit, Watch } from 'vue-property-decorator';\nimport { RssRule, Category, RssNode } from '../../types';\nimport api from '../../Api';\nimport { mapActions, mapMutations, mapGetters } from 'vuex';\nimport { DialogConfig, DialogType, SnackBarConfig } from '../../store/types';\n\n@Component({\n computed: {\n ...mapGetters([\n 'allCategories',\n ]),\n },\n methods: {\n ...mapMutations([\n 'showSnackBar',\n 'closeSnackBar',\n ]),\n ...mapActions([\n 'asyncShowDialog',\n ]),\n },\n})\nexport default class RssRulesDialog extends Vue {\n @Prop(Boolean)\n readonly value!: boolean\n @Prop()\n readonly rssNode!: RssNode\n\n rssRules: {[key: string]: RssRule} | null = null\n selectedRuleName: string | null = null\n\n allCategories!: Category[]\n\n asyncShowDialog!: (_: DialogConfig) => Promise\n showSnackBar!: (_: SnackBarConfig) => void\n closeSnackBar!: () => void\n\n get selectedRule(): RssRule {\n if (!this.selectedRuleName || !(this.selectedRuleName in this.rssRules!)) {\n return {} as RssRule\n }\n\n return this.rssRules![this.selectedRuleName]\n }\n set selectedRule(v: RssRule) {\n this.rssRules![this.selectedRuleName!] = v\n }\n\n get categoryItems() {\n const uncategory: Category = {\n key: '',\n name: tr('uncategorized'),\n }\n\n return [uncategory, ...this.allCategories].map(c => {\n return {\n text: c.name,\n value: c.key,\n }\n })\n }\n get rssItems() {\n return this.buildRssItems(this.rssNode)\n }\n\n hasSelectSite(url: string) {\n return this.selectedRule.affectedFeeds.includes(url)\n }\n\n selectSite(url: string, enabled: boolean) {\n const rule = cloneDeep(this.selectedRule)\n const feeds = rule.affectedFeeds\n\n if (enabled) {\n feeds.push(url)\n } else {\n pull(feeds, url)\n }\n\n this.selectedRule = rule\n }\n\n editRule(key: keyof RssRule, value: any) {\n const rule: any = cloneDeep(this.selectedRule)\n rule[key] = value\n\n this.selectedRule = rule\n }\n\n buildRssItems(node: RssNode) {\n let result: any[] = []\n\n for (const [key, value] of Object.entries(node)) {\n if ('uid' in value) {\n result.push({\n text: key,\n value: value.url,\n })\n } else {\n result = result.concat(this.buildRssItems(value))\n }\n }\n\n return result\n }\n\n async fetchRssRules() {\n this.rssRules = await api.getRssRules()\n }\n\n async addRssRule() {\n const name = await this.asyncShowDialog({\n text: tr('dialog.rss_rule.new_rule_name'),\n type: DialogType.Input,\n })\n\n if (!name) {\n return\n }\n\n this.showSnackBar({\n text: tr('label.adding'),\n })\n\n await api.setRssRule(name);\n this.fetchRssRules()\n\n this.closeSnackBar();\n }\n\n async deleteRssRule() {\n const input = await this.asyncShowDialog({\n text: tr('dialog.rss_rule.delete_rule'),\n type: DialogType.OkCancel,\n })\n\n if (!input) {\n return\n }\n\n this.showSnackBar({\n text: tr('label.deleting'),\n })\n\n await api.removeRssRule(this.selectedRuleName!);\n this.fetchRssRules()\n\n this.closeSnackBar();\n }\n\n @Emit('input')\n closeDialog() {\n return false\n }\n\n created() {\n this.fetchRssRules()\n }\n\n @Watch('selectedRule', {deep: true})\n async onSelectedRuleChanged(v: RssRule, old: RssRule) {\n if (isEmpty(old) || isEmpty(v)) {\n // just select rule\n return\n }\n\n if (isEqual(v, old)) {\n return\n }\n\n await api.setRssRule(this.selectedRuleName!, v)\n await this.fetchRssRules()\n }\n}\n","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport { get, toPath, sortBy } from 'lodash'\nimport { mapActions, mapMutations, mapState } from 'vuex'\nimport Component from 'vue-class-component'\nimport { Prop, Watch, Emit } from 'vue-property-decorator'\n\nimport HasTask from '@/mixins/hasTask'\nimport api from '@/Api';\nimport { tr } from '@/locale'\nimport { RssItem, RssNode, RssTorrent } from '@/types';\nimport { DialogType, DialogConfig, SnackBarConfig } from '@/store/types'\nimport { parseDate, formatTimestamp, formatAsDuration } from '../../filters'\nimport RssRulesDialog from './RssRulesDialog.vue'\n\nlet darkMode: boolean;\n\n@Component({\n components: {\n RssRulesDialog,\n },\n computed: mapState([\n 'preferences',\n ]),\n methods: {\n ...mapActions([\n 'asyncShowDialog',\n ]),\n ...mapMutations([\n 'showSnackBar',\n 'closeSnackBar',\n ]),\n },\n filters: {\n date(str: string) {\n if (!str) {\n return null\n }\n\n const time = parseDate(str)!\n return tr('dialog.rss.date_format', {\n date: formatTimestamp(time),\n duration: formatAsDuration(time, {minUnit: 1}),\n })\n },\n },\n directives: {\n body: {\n inserted(el, binding) {\n const doc = (el as HTMLIFrameElement).contentDocument!\n\n const darkCss = darkMode ? 'body{color: #fff}' : null;\n\n const css = ``\n\n doc.head.insertAdjacentHTML('beforeend', css)\n doc.body.innerHTML = binding.value\n },\n update(el, binding) {\n if (binding.oldValue === binding.value) {\n return\n }\n\n const body = (el as HTMLIFrameElement).contentDocument!.body\n body.innerHTML = binding.value\n body.scrollTo({\n top: 0,\n })\n },\n },\n },\n})\nexport default class RssDialog extends HasTask {\n @Prop(Boolean)\n readonly value!: boolean\n\n rssNode: RssNode | null = null\n selectNode: string | null = null\n selectArticle: RssTorrent | null = null\n showRulesDialog = false\n\n preferences!: any\n asyncShowDialog!: (_: DialogConfig) => Promise\n showSnackBar!: (_: SnackBarConfig) => void\n closeSnackBar!: () => void\n\n get rssTree() {\n if (!this.rssNode) {\n return [];\n }\n\n return this.buildRssTree(this.rssNode!)\n }\n get selectItem() {\n if (!this.selectNode) {\n return null\n }\n\n const item = get(this.rssNode, this.selectNode)\n if (!item) {\n // deleted\n return null\n }\n\n if ('uid' in item) {\n return item as RssItem\n }\n\n // Folder\n return null\n }\n\n get selectedPath() {\n if (!this.selectNode) {\n return null\n }\n\n return toPath(this.selectNode!).map(p => {\n return p.replace('\\\\\\'', '\\'').replace('\\\\\\\\', '\\\\');\n }).join('\\\\');\n }\n\n sortArticles(articles: RssTorrent[]) {\n return sortBy(articles, (it) => new Date(it.date || 0)).reverse();\n }\n\n isItemLoading(row: any) {\n const item = row.item.item\n return item && item.isLoading\n }\n \n getRowIcon(row: any) {\n const item = row.item.item\n if (item) {\n if (item.isLoading) {\n return 'mdi-refresh'\n } else if (item.hasError) {\n return 'mdi-alert'\n }\n\n return 'mdi-rss'\n }\n\n return row.open ? 'mdi-folder-open' : 'mdi-folder';\n }\n\n buildRssTree(node: RssNode, parent?: string) {\n const result: any = [];\n function escapeKey(key: string) {\n const escaped = key.replace('\\\\', '\\\\\\\\').replace('\\'', '\\\\\\'');\n return `['${escaped}']`\n }\n\n for (const [key, value] of Object.entries(node)) {\n const path = parent ? (parent + escapeKey(key)) : escapeKey(key)\n\n if ('uid' in value) {\n result.push({\n path,\n name: key,\n item: value,\n })\n } else {\n result.push({\n path,\n name: key,\n children: this.buildRssTree(value, path),\n })\n }\n }\n\n return result;\n }\n\n async addRssItem() {\n const input = await this.asyncShowDialog({\n text: tr('dialog.rss.feed_url'),\n type: DialogType.Input,\n })\n\n if (!input) {\n return\n }\n\n this.showSnackBar({\n text: tr('label.adding'),\n })\n\n try {\n await api.addRssFeed(input);\n } catch (e) {\n this.showSnackBar({\n text: e.response ? e.response.data : e.message,\n })\n return\n }\n await this.runTask();\n\n this.closeSnackBar();\n }\n\n async renameRssItem() {\n const input = await this.asyncShowDialog({\n text: tr('name'),\n type: DialogType.Input,\n value: this.selectedPath!,\n })\n\n if (!input) {\n return\n }\n\n this.showSnackBar({\n text: tr('label.moving'),\n })\n\n try {\n await api.moveRssFeed(this.selectedPath!, input);\n } catch (e) {\n this.showSnackBar({\n text: e.response ? e.response.data : e.message,\n })\n return\n }\n await this.runTask();\n\n this.closeSnackBar();\n }\n\n async deleteRssItem() {\n const confirm = await this.asyncShowDialog({\n text: tr('dialog.rss.delete_feeds'),\n type: DialogType.OkCancel,\n })\n\n if (!confirm) {\n return\n }\n\n this.showSnackBar({\n text: tr('label.deleting'),\n })\n\n try {\n await api.removeRssFeed(this.selectedPath!);\n } catch (e) {\n this.showSnackBar({\n text: e.response ? e.response.data : e.message,\n })\n return\n }\n await this.runTask();\n\n this.closeSnackBar();\n }\n\n async refreshRssItem() {\n await api.refreshRssFeed(this.selectedPath!);\n await this.runTask();\n }\n\n async changePreference(key: string, value: any) {\n await api.setPreferences({\n [key]: value,\n })\n }\n\n async fetchRssItems() {\n this.rssNode = await api.getRssItems()\n }\n\n @Emit()\n downloadTorrent(article: RssTorrent) {\n return article.torrentURL\n }\n\n @Watch('selectNode')\n onSelectNodeChanged() {\n this.selectArticle = null\n }\n\n created() {\n darkMode = this.$vuetify.theme.dark\n this.setTaskAndRun(this.fetchRssItems, 5000)\n }\n\n @Emit('input')\n closeDialog() {\n return false\n }\n}\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??ref--14-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RssRulesDialog.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??ref--14-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RssRulesDialog.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./RssRulesDialog.vue?vue&type=template&id=0220a15a&scoped=true&\"\nimport script from \"./RssRulesDialog.vue?vue&type=script&lang=ts&\"\nexport * from \"./RssRulesDialog.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./RssRulesDialog.vue?vue&type=style&index=0&id=0220a15a&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"0220a15a\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VCardText } from 'vuetify/lib/components/VCard';\nimport { VCardTitle } from 'vuetify/lib/components/VCard';\nimport { VCheckbox } from 'vuetify/lib/components/VCheckbox';\nimport { VDialog } from 'vuetify/lib/components/VDialog';\nimport { VDivider } from 'vuetify/lib/components/VDivider';\nimport { VForm } from 'vuetify/lib/components/VForm';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VList } from 'vuetify/lib/components/VList';\nimport { VListItem } from 'vuetify/lib/components/VList';\nimport { VListItemAction } from 'vuetify/lib/components/VList';\nimport { VListItemContent } from 'vuetify/lib/components/VList';\nimport { VListItemGroup } from 'vuetify/lib/components/VList';\nimport { VListItemTitle } from 'vuetify/lib/components/VList';\nimport { VProgressCircular } from 'vuetify/lib/components/VProgressCircular';\nimport { VSelect } from 'vuetify/lib/components/VSelect';\nimport { VSpacer } from 'vuetify/lib/components/VGrid';\nimport { VTextField } from 'vuetify/lib/components/VTextField';\ninstallComponents(component, {VBtn,VCard,VCardText,VCardTitle,VCheckbox,VDialog,VDivider,VForm,VIcon,VList,VListItem,VListItemAction,VListItemContent,VListItemGroup,VListItemTitle,VProgressCircular,VSelect,VSpacer,VTextField})\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??ref--14-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RssDialog.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??ref--14-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RssDialog.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./RssDialog.vue?vue&type=template&id=763d8c6c&scoped=true&\"\nimport script from \"./RssDialog.vue?vue&type=script&lang=ts&\"\nexport * from \"./RssDialog.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./RssDialog.vue?vue&type=style&index=0&id=763d8c6c&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"763d8c6c\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VCardText } from 'vuetify/lib/components/VCard';\nimport { VCardTitle } from 'vuetify/lib/components/VCard';\nimport { VDialog } from 'vuetify/lib/components/VDialog';\nimport { VDivider } from 'vuetify/lib/components/VDivider';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VList } from 'vuetify/lib/components/VList';\nimport { VListItem } from 'vuetify/lib/components/VList';\nimport { VListItemAction } from 'vuetify/lib/components/VList';\nimport { VListItemContent } from 'vuetify/lib/components/VList';\nimport { VListItemGroup } from 'vuetify/lib/components/VList';\nimport { VListItemTitle } from 'vuetify/lib/components/VList';\nimport { VProgressCircular } from 'vuetify/lib/components/VProgressCircular';\nimport { VSpacer } from 'vuetify/lib/components/VGrid';\nimport { VSwitch } from 'vuetify/lib/components/VSwitch';\nimport { VTreeview } from 'vuetify/lib/components/VTreeview';\ninstallComponents(component, {VBtn,VCard,VCardText,VCardTitle,VDialog,VDivider,VIcon,VList,VListItem,VListItemAction,VListItemContent,VListItemGroup,VListItemTitle,VProgressCircular,VSpacer,VSwitch,VTreeview})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('v-dialog',{attrs:{\"value\":_vm.value,\"scrollable\":\"\",\"fullscreen\":\"\",\"persistent\":\"\"},on:{\"input\":function($event){return _vm.$emit('input', $event)}}},[_c('v-card',[_c('v-card-title',{staticClass:\"headline\"},[_c('v-icon',{staticClass:\"mr-2\"},[_vm._v(\"mdi-card-search-outline\")]),_c('span',{domProps:{\"textContent\":_vm._s(_vm.$t('search'))}}),_c('v-spacer'),_c('v-btn',{attrs:{\"icon\":\"\"},on:{\"click\":_vm.closeDialog}},[_c('v-icon',[_vm._v(\"mdi-close\")])],1)],1),_c('v-card-text',[_c('SearchDialogForm',{attrs:{\"loading\":_vm.loading},on:{\"triggerSearch\":_vm.triggerSearch,\"stopSearch\":_vm.stopSearch}}),_c('v-data-table',{staticClass:\"elevation-1\",attrs:{\"headers\":_vm.grid.headers,\"items\":_vm.grid.searchItems,\"items-per-page\":10,\"loading\":_vm.loading},scopedSlots:_vm._u([{key:\"item.fileName\",fn:function(ref){\nvar item = ref.item;\nreturn [_c('a',{attrs:{\"href\":item.descrLink,\"target\":\"_blank\"},domProps:{\"textContent\":_vm._s(item.fileName)}})]}},{key:\"item.fileSize\",fn:function(ref){\nvar item = ref.item;\nreturn [_vm._v(\" \"+_vm._s(_vm._f(\"formatSize\")(item.fileSize))+\" \")]}},{key:\"item.actions\",fn:function(ref){\nvar item = ref.item;\nreturn [_c('v-icon',{on:{\"click\":function($event){return _vm.downloadTorrent(item)}}},[_vm._v(\"mdi-download\")])]}}],null,true)})],1),_c('v-card-actions',[_c('v-btn',{on:{\"click\":_vm.openPluginManager}},[_c('v-icon',[_vm._v(\"mdi-cog\")]),_vm._v(\" \"+_vm._s(_vm.$t(\"plugin_manager\"))+\" \")],1)],1)],1)],1),_c('PluginManager')],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-form',{ref:\"form\",model:{value:(_vm.searchForm.valid),callback:function ($$v) {_vm.$set(_vm.searchForm, \"valid\", $$v)},expression:\"searchForm.valid\"}},[_c('v-container',{attrs:{\"fluid\":\"\"}},[_c('v-row',[_c('v-col',{staticClass:\"col-12 col-sm-6 col-md-9\"},[_c('v-text-field',{attrs:{\"prepend-inner-icon\":\"mdi-magnify\",\"label\":_vm.$t('search'),\"rules\":[function (v) { return !!v || _vm.$t('msg.item_is_required', { item: _vm.$t('query') }); }],\"clearable\":\"\"},on:{\"keypress\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }return _vm.$refs.searchButton.click.apply(null, arguments)}},model:{value:(_vm.searchForm.pattern),callback:function ($$v) {_vm.$set(_vm.searchForm, \"pattern\", $$v)},expression:\"searchForm.pattern\"}}),_c('v-btn',{ref:\"searchButton\",attrs:{\"disabled\":!_vm.searchForm.valid,\"color\":_vm.loading ? 'warning' : 'primary'},on:{\"click\":function($event){_vm.loading ? _vm.stopSearch() : _vm.triggerSearch()}}},[_vm._v(\" \"+_vm._s(_vm.loading ? _vm.$t(\"stop\") : _vm.$t(\"search\"))+\" \")])],1),_c('v-col',{staticClass:\"col__plugins\"},[_c('v-btn',{staticClass:\"btn\",attrs:{\"loading\":_vm.searchPlugins === undefined,\"disabled\":_vm.searchPlugins === null,\"type\":\"button\"},on:{\"click\":function($event){_vm.plugginSelectorOpen = true}}},[_vm._v(\" \"+_vm._s(_vm.$t(\"plugin\", 2))+\" \")]),(!this.$vuetify.breakpoint.mobile)?_c('v-dialog',{attrs:{\"max-width\":\"20rem\"},model:{value:(_vm.plugginSelectorOpen),callback:function ($$v) {_vm.plugginSelectorOpen=$$v},expression:\"plugginSelectorOpen\"}},[_c('v-card',[_c('v-card-title',[_vm._v(\" \"+_vm._s(_vm.$t(\"plugin\", 1))+\" \"+_vm._s(_vm.$t(\"usage\"))+\" \"),_c('v-spacer'),_c('v-btn',{attrs:{\"small\":\"\",\"color\":_vm.searchForm.plugins.length > 0 ? 'primary' : ''},on:{\"click\":_vm.toggleSelectAll}},[_vm._v(\" \"+_vm._s(_vm.$t(\"all\"))+\" \")])],1),_c('v-divider'),_c('v-card-text',_vm._l((_vm.availablePlugins),function(plugin,key){return _c('v-checkbox',{key:key,attrs:{\"label\":plugin.fullName,\"value\":plugin},model:{value:(_vm.searchForm.plugins),callback:function ($$v) {_vm.$set(_vm.searchForm, \"plugins\", $$v)},expression:\"searchForm.plugins\"}})}),1)],1)],1):_vm._e(),(this.$vuetify.breakpoint.mobile)?_c('v-bottom-sheet',{attrs:{\"scrollable\":\"\",\"inset\":\"\"},model:{value:(_vm.plugginSelectorOpen),callback:function ($$v) {_vm.plugginSelectorOpen=$$v},expression:\"plugginSelectorOpen\"}},[_c('v-sheet',{staticClass:\"text-center\"},[_c('v-card',[_c('v-card-title',[_vm._v(\" \"+_vm._s(_vm.$t(\"plugin\", 1))+\" \"+_vm._s(_vm.$t(\"usage\"))+\" \"),_c('v-spacer'),_c('v-btn',{attrs:{\"small\":\"\",\"color\":_vm.searchForm.plugins.length > 0 ? 'primary' : ''},on:{\"click\":_vm.toggleSelectAll}},[_vm._v(\" \"+_vm._s(_vm.$t(\"all\"))+\" \")])],1),_c('v-divider'),_c('v-card-text',_vm._l((_vm.availablePlugins),function(plugin,key){return _c('v-checkbox',{key:key,attrs:{\"label\":plugin.fullName,\"value\":plugin},model:{value:(_vm.searchForm.plugins),callback:function ($$v) {_vm.$set(_vm.searchForm, \"plugins\", $$v)},expression:\"searchForm.plugins\"}})}),1)],1)],1)],1):_vm._e()],1),_c('v-col',{attrs:{\"align-self\":\"center\"}},[_c('v-autocomplete',{attrs:{\"items\":_vm.availableCategories,\"item-text\":\"name\",\"item-value\":\"key\",\"label\":_vm.$t('category', 1)},model:{value:(_vm.searchForm.category),callback:function ($$v) {_vm.$set(_vm.searchForm, \"category\", $$v)},expression:\"searchForm.category\"}})],1)],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport Vue from \"vue\";\nimport { Component, Emit, Prop, Watch } from \"vue-property-decorator\";\nimport { SearchPlugin } from \"@/types\";\nimport { tr } from \"@/locale\";\nimport { intersection } from \"lodash\";\nimport { mapGetters } from \"vuex\";\nimport { SearchEnginePage } from '@/store/types';\n\nconst ALL_KEY = \"all\";\n\nconst ALL_CATEGORY: Category = {\n key: ALL_KEY,\n name: tr(\"all\"),\n};\n\ninterface Category {\n key: string;\n name: string;\n}\n\nexport interface SearchForm {\n valid: boolean;\n category: string;\n pattern: string;\n plugins: SearchPlugin[];\n}\n\n@Component({\n computed: {\n ...mapGetters({\n searchPlugins: \"allSearchPlugins\",\n }),\n },\n})\nexport default class SearchDialogForm extends Vue {\n searchEngineState!: SearchEnginePage;\n searchPlugins!: SearchPlugin[];\n\n @Prop(Boolean)\n readonly loading: boolean = false;\n\n plugginSelectorOpen = false;\n\n availablePlugins: SearchPlugin[] = [];\n\n searchForm: SearchForm = {\n valid: false,\n category: ALL_KEY,\n pattern: \"\",\n plugins: [],\n };\n\n get hasSelectAllPlugins() {\n return this.searchForm.plugins.length === this.availablePlugins?.length;\n }\n\n get availableCategories() {\n if (this.hasSelectAllPlugins) {\n return [ALL_CATEGORY];\n }\n\n const result: Category[] = [ALL_CATEGORY, { divider: true } as any];\n\n const categories = intersection(\n ...this.searchForm.plugins.map(p => p.supportedCategories),\n ).map(c => ({ key: c, name: c }));\n result.push(...categories);\n\n return result;\n }\n\n toggleSelectAll() {\n this.searchForm.plugins = this.hasSelectAllPlugins ? [] : this.availablePlugins.slice();\n }\n\n @Watch(\"searchPlugins\")\n searchPluginsUpdated(plugins: SearchPlugin[] | undefined | null) {\n if (!plugins) {\n this.availablePlugins = [];\n } else {\n this.availablePlugins = this.searchPlugins.filter(x => x.enabled);\n this.toggleSelectAll();\n }\n }\n\n @Emit(\"triggerSearch\")\n triggerSearch(): SearchForm | void {\n if (!this.searchForm.valid) {\n return;\n }\n\n const plugins = this.hasSelectAllPlugins\n ? ALL_KEY\n : this.searchForm.plugins.map(p => p.name).join(\"|\");\n\n const searchForm = Object.assign({}, this.searchForm, {\n plugins,\n });\n\n return searchForm;\n }\n\n @Emit(\"stopSearch\")\n stopSearch() {\n //\n }\n\n @Watch(\"searchForm.plugins\")\n onPluginChanged() {\n if (!this.availableCategories.find(c => c.key === this.searchForm.category)) {\n this.searchForm.category = ALL_KEY;\n }\n }\n}\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??ref--14-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SearchDialogForm.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??ref--14-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SearchDialogForm.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./SearchDialogForm.vue?vue&type=template&id=50ebf5de&scoped=true&\"\nimport script from \"./SearchDialogForm.vue?vue&type=script&lang=ts&\"\nexport * from \"./SearchDialogForm.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./SearchDialogForm.vue?vue&type=style&index=0&id=50ebf5de&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"50ebf5de\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VAutocomplete } from 'vuetify/lib/components/VAutocomplete';\nimport { VBottomSheet } from 'vuetify/lib/components/VBottomSheet';\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VCardText } from 'vuetify/lib/components/VCard';\nimport { VCardTitle } from 'vuetify/lib/components/VCard';\nimport { VCheckbox } from 'vuetify/lib/components/VCheckbox';\nimport { VCol } from 'vuetify/lib/components/VGrid';\nimport { VContainer } from 'vuetify/lib/components/VGrid';\nimport { VDialog } from 'vuetify/lib/components/VDialog';\nimport { VDivider } from 'vuetify/lib/components/VDivider';\nimport { VForm } from 'vuetify/lib/components/VForm';\nimport { VRow } from 'vuetify/lib/components/VGrid';\nimport { VSheet } from 'vuetify/lib/components/VSheet';\nimport { VSpacer } from 'vuetify/lib/components/VGrid';\nimport { VTextField } from 'vuetify/lib/components/VTextField';\ninstallComponents(component, {VAutocomplete,VBottomSheet,VBtn,VCard,VCardText,VCardTitle,VCheckbox,VCol,VContainer,VDialog,VDivider,VForm,VRow,VSheet,VSpacer,VTextField})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-dialog',{attrs:{\"max-width\":\"20rem\",\"scrollable\":\"\"},model:{value:(_vm.searchEngineState.isPluginManagerOpen),callback:function ($$v) {_vm.$set(_vm.searchEngineState, \"isPluginManagerOpen\", $$v)},expression:\"searchEngineState.isPluginManagerOpen\"}},[_c('v-card',[_c('v-card-title',[_c('v-icon',[_vm._v(\"mdi-toy-brick\")]),_vm._v(\" \"+_vm._s(_vm.$t(\"plugin_manager\"))+\" \")],1),_c('v-card-text',_vm._l((_vm.searchEngineState.searchPlugins),function(plugin,key){return _c('v-switch',{key:key,attrs:{\"input-value\":plugin.enabled,\"label\":plugin.fullName},on:{\"change\":function($event){return _vm.togglePluginAvailability(plugin)}}})}),1),_c('v-card-actions',[_c('v-btn',{attrs:{\"color\":\"warning\"},on:{\"click\":function($event){return _vm.updatePlugins()}}},[_vm._v(\" \"+_vm._s(_vm.$t(\"update_plugins\"))+\" \")])],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport { SearchEnginePage } from \"@/store/types\";\nimport { SearchPlugin } from \"@/types\";\nimport Vue from \"vue\";\nimport Component from \"vue-class-component\";\nimport { mapActions, mapState } from \"vuex\";\n\n@Component({\n computed: {\n ...mapState({\n searchEngineState: \"searchEngine\",\n }),\n },\n methods: {\n ...mapActions({\n togglePluginAvailabilityAction: \"togglePluginAvailability\",\n updatePluginsRequest: \"updatePluginsRequest\",\n }),\n },\n})\nexport default class PluginsManager extends Vue {\n searchEngineState!: SearchEnginePage;\n togglePluginAvailabilityAction!: (_: any) => void;\n updatePluginsRequest!: () => void;\n\n togglePluginAvailability(plugin: SearchPlugin) {\n this.togglePluginAvailabilityAction(plugin);\n }\n\n updatePlugins() {\n this.updatePluginsRequest();\n }\n}\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??ref--14-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PluginsManager.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??ref--14-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PluginsManager.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./PluginsManager.vue?vue&type=template&id=19e33dd6&\"\nimport script from \"./PluginsManager.vue?vue&type=script&lang=ts&\"\nexport * from \"./PluginsManager.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VCardActions } from 'vuetify/lib/components/VCard';\nimport { VCardText } from 'vuetify/lib/components/VCard';\nimport { VCardTitle } from 'vuetify/lib/components/VCard';\nimport { VDialog } from 'vuetify/lib/components/VDialog';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VSwitch } from 'vuetify/lib/components/VSwitch';\ninstallComponents(component, {VBtn,VCard,VCardActions,VCardText,VCardTitle,VDialog,VIcon,VSwitch})\n","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport api from \"@/Api\";\nimport HasTask from \"@/mixins/hasTask\";\nimport { Component, Prop, Emit } from \"vue-property-decorator\";\nimport { SearchTaskTorrent } from \"@/types\";\nimport { mapActions, mapGetters, mapMutations } from \"vuex\";\nimport { tr } from \"@/locale\";\nimport SearchDialogForm from \"./SearchDialogForm.vue\";\nimport PluginManager from \"./PluginsManager.vue\";\n\ninterface GridConfig {\n searchItems: SearchTaskTorrent[];\n downloadItem: SearchTaskTorrent | null;\n headers: { [key: string]: any }[];\n}\n\n@Component({\n components: {\n SearchDialogForm,\n PluginManager,\n },\n computed: {\n ...mapGetters({\n allCategories: \"allCategories\",\n preferences: \"preferences\",\n }),\n },\n methods: {\n ...mapMutations([\"openAddForm\", \"setPasteUrl\", \"addFormDownloadItem\", \"openPluginManager\"]),\n ...mapActions({\n loadSearchPlugins: 'fetchSearchPlugins',\n }),\n },\n})\nexport default class SearchDialog extends HasTask {\n private _searchId = 0;\n\n @Prop(Boolean)\n readonly value!: boolean;\n\n grid: GridConfig = {\n searchItems: [],\n downloadItem: {\n descrLink: \"\",\n fileName: \"\",\n fileSize: 0,\n fileUrl: \"\",\n nbLeechers: 0,\n nbSeeders: 0,\n siteUrl: \"\",\n },\n headers: [\n { text: tr(\"name\"), value: \"fileName\" },\n { text: tr(\"size\"), value: \"fileSize\" },\n { text: tr(\"seeds\"), value: \"nbSeeders\" },\n { text: tr(\"peers\"), value: \"nbLeechers\" },\n { text: tr(\"search_engine\"), value: \"siteUrl\" },\n { text: tr(\"action\", 2), value: \"actions\", sortable: false },\n ],\n };\n\n loading = false;\n\n setPasteUrl!: (_: any) => void;\n openAddForm!: () => void;\n addFormDownloadItem!: (_: any) => void;\n loadSearchPlugins!: () => void;\n openPluginManager!: () => void;\n\n mounted() {\n this.loadSearchPlugins(); // load the plugins so they are available in the entire module\n }\n\n async downloadTorrent(item: SearchTaskTorrent) {\n this.addFormDownloadItem({\n downloadItem: {\n title: item.fileName,\n url: item.fileUrl,\n },\n });\n this.openAddForm();\n }\n\n async stopSearch() {\n this.cancelTask();\n await this._stopSearch(this._searchId);\n this.loading = false;\n }\n\n @Emit(\"input\")\n closeDialog() {\n return false;\n }\n\n async triggerSearch(searchForm: any) { // TODO: find a good way to type the form.\n this.grid.searchItems = []; // Clear the table\n this.loading = true;\n\n try {\n const response = await this._startSearch(searchForm);\n this._searchId = response.id;\n\n this.setTaskAndRun(this.task(response.id));\n } catch {\n //\n }\n }\n\n private async _startSearch(searchForm: any): Promise<{ id: number }> {\n const result = await api.startSearch(\n searchForm.pattern,\n searchForm.plugins,\n searchForm.category,\n );\n\n return result;\n }\n\n private async _stopSearch(id: number) {\n await api.stopSearch(id);\n this._searchId = 0;\n }\n\n /**\n * Does request until the plugins return data\n */\n private task(responseId: number): CallableFunction {\n return async () => {\n const response = await api.getSearchResults(responseId);\n const isStopped = response.status === \"Stopped\";\n\n const items = this.grid.searchItems\n items.splice(items.length, 0, ...response.results.slice(items.length))\n\n if (isStopped) {\n this.loading = false;\n }\n\n return isStopped;\n };\n }\n}\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??ref--14-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SearchDialog.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??ref--14-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SearchDialog.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./SearchDialog.vue?vue&type=template&id=2425d8a7&scoped=true&\"\nimport script from \"./SearchDialog.vue?vue&type=script&lang=ts&\"\nexport * from \"./SearchDialog.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./SearchDialog.vue?vue&type=style&index=0&id=2425d8a7&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"2425d8a7\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VCardActions } from 'vuetify/lib/components/VCard';\nimport { VCardText } from 'vuetify/lib/components/VCard';\nimport { VCardTitle } from 'vuetify/lib/components/VCard';\nimport { VDataTable } from 'vuetify/lib/components/VDataTable';\nimport { VDialog } from 'vuetify/lib/components/VDialog';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VSpacer } from 'vuetify/lib/components/VGrid';\ninstallComponents(component, {VBtn,VCard,VCardActions,VCardText,VCardTitle,VDataTable,VDialog,VIcon,VSpacer})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('v-dialog',{attrs:{\"value\":_vm.value,\"scrollable\":\"\",\"persistent\":\"\",\"max-width\":\"720px\"},on:{\"input\":function($event){return _vm.$emit('input', $event)}}},[_c('v-card',[_c('v-card-title',{staticClass:\"headline\"},[_c('v-icon',{staticClass:\"mr-2\"},[_vm._v(\"mdi-cog\")]),_c('span',{domProps:{\"textContent\":_vm._s(_vm.$t('settings'))}}),_c('v-spacer'),_c('v-btn',{attrs:{\"icon\":\"\"},on:{\"click\":_vm.closeDialog}},[_c('v-icon',[_vm._v(\"mdi-close\")])],1)],1),_c('v-card-text',[_c('v-tabs',{model:{value:(_vm.tab),callback:function ($$v) {_vm.tab=$$v},expression:\"tab\"}},_vm._l((_vm.tabList),function(item){return _c('v-tab',{key:item},[_vm._v(\" \"+_vm._s(_vm.$t('preferences.' + item))+\" \")])}),1),_c('v-fade-transition',[_c('v-alert',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.preferenceUpdated),expression:\"preferenceUpdated\"}],attrs:{\"dense\":\"\",\"text\":\"\",\"type\":\"success\"}},[_vm._v(\" \"+_vm._s(_vm.$t('preferences.change_applied'))+\" \")])],1),_c('v-tabs-items',{model:{value:(_vm.tab),callback:function ($$v) {_vm.tab=$$v},expression:\"tab\"}},[_c('v-tab-item',{key:\"downloads\"},[_c('download-settings')],1),_c('v-tab-item',{key:\"speed\"},[_c('speed-settings')],1),_c('v-tab-item',{key:\"rss\"},[_c('rss-settings')],1),_c('v-tab-item',{key:\"webui\"},[_c('web-u-i-settings')],1)],1)],1)],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-container',[_c('h4',[_vm._v(_vm._s(_vm.$t('preferences.adding_torrent')))]),_c('v-divider'),_c('v-container',{staticClass:\"px-0\",attrs:{\"fluid\":\"\"}},[_c('v-switch',{attrs:{\"input-value\":_vm.preferences.create_subfolder_enabled,\"label\":_vm.$t('preferences.create_subfolder_enabled')},on:{\"change\":function($event){return _vm.changeSettings('create_subfolder_enabled', !_vm.preferences.create_subfolder_enabled)}}}),_c('v-switch',{attrs:{\"input-value\":_vm.preferences.start_paused_enabled,\"label\":_vm.$t('preferences.start_paused_enabled')},on:{\"change\":function($event){return _vm.changeSettings('start_paused_enabled', !_vm.preferences.start_paused_enabled)}}}),_c('v-switch',{attrs:{\"input-value\":_vm.preferences.auto_delete_mode,\"label\":_vm.$t('preferences.auto_delete_mode')},on:{\"change\":function($event){return _vm.changeSettings('auto_delete_mode', !_vm.preferences.auto_delete_mode)}}})],1),_c('v-divider'),_c('v-container',{staticClass:\"px-0\",attrs:{\"fluid\":\"\"}},[_c('v-switch',{attrs:{\"input-value\":_vm.preferences.preallocate_all,\"label\":_vm.$t('preferences.preallocate_all')},on:{\"change\":function($event){return _vm.changeSettings('preallocate_all', !_vm.preferences.preallocate_all)}}}),_c('v-switch',{attrs:{\"input-value\":_vm.preferences.incomplete_files_ext,\"label\":_vm.$t('preferences.incomplete_files_ext')},on:{\"change\":function($event){return _vm.changeSettings('incomplete_files_ext', !_vm.preferences.incomplete_files_ext)}}})],1),_c('h4',[_vm._v(_vm._s(_vm.$t('preferences.saving_management')))]),_c('v-divider'),_c('v-container',{staticClass:\"px-0\",attrs:{\"fluid\":\"\"}},[_c('preference-row',{attrs:{\"i18n-key\":\"auto_tmm_enabled\"}},[_c('v-select',{attrs:{\"items\":_vm.torrentMode,\"value\":_vm.preferences.auto_tmm_enabled ? _vm.torrentMode[0] : _vm.torrentMode[1]},on:{\"change\":function($event){return _vm.changeSettings('auto_tmm_enabled', $event == _vm.torrentMode[0])}}})],1),_c('preference-row',{attrs:{\"i18n-key\":\"torrent_changed_tmm_enabled\"}},[_c('v-select',{attrs:{\"items\":_vm.torrentAction,\"value\":_vm.preferences.category_changed_tmm_enabled ? _vm.torrentAction[1] : _vm.torrentAction[0]},on:{\"change\":function($event){return _vm.changeSettings('torrent_changed_tmm_enabled', $event == _vm.torrentAction[1])}}})],1),_c('preference-row',{attrs:{\"i18n-key\":\"save_path_changed_tmm_enabled\"}},[_c('v-select',{attrs:{\"items\":_vm.torrentAction,\"value\":_vm.preferences.category_changed_tmm_enabled ? _vm.torrentAction[1] : _vm.torrentAction[0]},on:{\"change\":function($event){return _vm.changeSettings('save_path_changed_tmm_enabled', $event == _vm.torrentAction[1])}}})],1),_c('preference-row',{attrs:{\"i18n-key\":\"category_changed_tmm_enabled\"}},[_c('v-select',{attrs:{\"items\":_vm.torrentAction,\"value\":_vm.preferences.category_changed_tmm_enabled ? _vm.torrentAction[1] : _vm.torrentAction[0]},on:{\"change\":function($event){return _vm.changeSettings('category_changed_tmm_enabled', $event == _vm.torrentAction[1])}}})],1),_c('preference-row',{attrs:{\"i18n-key\":\"save_path\"}},[_c('v-text-field',{attrs:{\"value\":_vm.preferences.save_path,\"lazy\":\"\"},on:{\"change\":function($event){return _vm.changeSettings('save_path', $event)}}})],1),_c('preference-row',{attrs:{\"i18n-key\":\"temp_path\"},scopedSlots:_vm._u([{key:\"header\",fn:function(){return [_c('v-checkbox',{attrs:{\"value\":_vm.preferences.temp_path_enabled},on:{\"change\":function($event){return _vm.changeSettings('temp_path_enabled', $event)}}})]},proxy:true}])},[_c('v-text-field',{attrs:{\"disabled\":!_vm.preferences.temp_path_enabled,\"value\":_vm.preferences.temp_path,\"lazy\":\"\"},on:{\"change\":function($event){return _vm.changeSettings('temp_path', $event)}}})],1),_c('preference-row',{attrs:{\"i18n-key\":\"export_dir\",\"can-be-enabled\":\"true\"}},[_c('v-text-field',{attrs:{\"value\":_vm.preferences.export_dir,\"lazy\":\"\",\"clearable\":\"\"},on:{\"change\":function($event){return _vm.changeSettings('export_dir', $event)}}})],1),_c('preference-row',{attrs:{\"i18n-key\":\"export_dir_fin\",\"can-be-enabled\":\"true\"}},[_c('v-text-field',{attrs:{\"value\":_vm.preferences.export_dir_fin,\"lazy\":\"\",\"clearable\":\"\"},on:{\"change\":function($event){return _vm.changeSettings('export_dir_fin', $event)}}})],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-row',{attrs:{\"align\":\"center\",\"dense\":\"\"}},[_c('v-col',{attrs:{\"cols\":\"3\"}},[_c('v-subheader',{domProps:{\"textContent\":_vm._s(_vm.$t('preferences.' + this.$props.i18nKey))}})],1),_c('v-col',{attrs:{\"cols\":\"4\"}},[_vm._t(\"default\")],2),(_vm.$slots.header)?_c('v-col',{attrs:{\"cols\":\"auto\"}},[_vm._t(\"header\")],2):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport {Component, Prop} from 'vue-property-decorator'\nimport Vue from 'vue'\n\n@Component\nexport default class PreferenceRow extends Vue {\n @Prop(String)\n readonly i18nKey?: string\n}\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??ref--14-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PreferenceRow.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??ref--14-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PreferenceRow.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./PreferenceRow.vue?vue&type=template&id=6d08c8e6&\"\nimport script from \"./PreferenceRow.vue?vue&type=script&lang=ts&\"\nexport * from \"./PreferenceRow.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VCol } from 'vuetify/lib/components/VGrid';\nimport { VRow } from 'vuetify/lib/components/VGrid';\nimport { VSubheader } from 'vuetify/lib/components/VSubheader';\ninstallComponents(component, {VCol,VRow,VSubheader})\n","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport Vue from 'vue'\nimport {Preferences} from '@/types'\nimport {Component} from 'vue-property-decorator'\nimport {mapActions, mapGetters} from 'vuex'\nimport PreferenceRow from './PreferenceRow.vue'\nimport { tr } from '@/locale'\n\n@Component({\n components: {\n PreferenceRow,\n },\n computed: {\n ...mapGetters({\n preferences: 'allPreferences',\n }),\n },\n methods: {\n ...mapActions({\n updatePreferencesRequest: 'updatePreferencesRequest',\n }),\n },\n})\nexport default class DownloadSettings extends Vue {\n preferences!: Preferences\n torrentAction = [tr('preferences.switch_torrent_mode_to_manual'), tr('preferences.move_affected_torrent')]\n torrentMode = [tr('preferences.auto_mode'), tr('preferences.manual_mode')]\n\n updatePreferencesRequest!: (_: any) => void\n\n changeSettings(property: string, value: string | boolean) {\n this.updatePreferencesRequest({[property]: value})\n }\n}\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??ref--14-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DownloadSettings.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??ref--14-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DownloadSettings.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./DownloadSettings.vue?vue&type=template&id=2e1e1380&scoped=true&\"\nimport script from \"./DownloadSettings.vue?vue&type=script&lang=ts&\"\nexport * from \"./DownloadSettings.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./DownloadSettings.vue?vue&type=style&index=0&id=2e1e1380&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"2e1e1380\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VCheckbox } from 'vuetify/lib/components/VCheckbox';\nimport { VContainer } from 'vuetify/lib/components/VGrid';\nimport { VDivider } from 'vuetify/lib/components/VDivider';\nimport { VSelect } from 'vuetify/lib/components/VSelect';\nimport { VSwitch } from 'vuetify/lib/components/VSwitch';\nimport { VTextField } from 'vuetify/lib/components/VTextField';\ninstallComponents(component, {VCheckbox,VContainer,VDivider,VSelect,VSwitch,VTextField})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-container',[_c('v-container',{attrs:{\"fluid\":\"\"}},[_c('v-container',[_c('v-row',{attrs:{\"justify\":\"center\"}},[_c('v-col',{attrs:{\"cols\":\"12\",\"md\":\"4\"}},[_c('h4',[_vm._v(\" \"+_vm._s(_vm.$t('preferences.global_rate_limits')))]),_c('v-text-field',{attrs:{\"label\":_vm.$t('preferences.dl_limit'),\"placeholder\":_vm.convertToKB(_vm.preferences.dl_limit),\"lazy\":\"\"},on:{\"change\":function($event){_vm.changeSettings('dl_limit', _vm.convertToBytes($event))}}}),_c('v-text-field',{attrs:{\"label\":_vm.$t('preferences.up_limit'),\"placeholder\":_vm.convertToKB(_vm.preferences.up_limit),\"lazy\":\"\"},on:{\"change\":function($event){_vm.changeSettings('up_limit', _vm.convertToBytes($event))}}})],1),_c('v-col',{attrs:{\"cols\":\"12\",\"md\":\"4\"}},[_c('h4',[_vm._v(\" \"+_vm._s(_vm.$t('preferences.alternate_rate_limits')))]),_c('v-text-field',{attrs:{\"type\":\"number\",\"label\":_vm.$t('preferences.dl_limit'),\"placeholder\":_vm.convertToKB(_vm.preferences.alt_dl_limit),\"lazy\":\"\"},on:{\"change\":function($event){_vm.changeSettings('alt_dl_limit', _vm.convertToBytes($event))}}}),_c('v-text-field',{attrs:{\"type\":\"number\",\"label\":_vm.$t('preferences.up_limit'),\"placeholder\":_vm.convertToKB(_vm.preferences.alt_up_limit),\"lazy\":\"\"},on:{\"change\":function($event){_vm.changeSettings('alt_up_limit', _vm.convertToBytes($event))}}}),_c('v-checkbox',{attrs:{\"label\":_vm.$t('preferences.alternate_schedule_enable_time'),\"input-value\":_vm.preferences.scheduler_enabled},on:{\"change\":function($event){return _vm.changeSettings('scheduler_enabled', $event)}}})],1)],1),(_vm.preferences.scheduler_enabled)?_c('v-row',{staticClass:\"justify-center\"},[_c('v-col',{attrs:{\"cols\":\"auto\"}},[_c('v-time-picker',{attrs:{\"value\":_vm.preferences.schedule_from_hour + ':' + _vm.preferences.schedule_from_min,\"color\":\"green lighten-1\",\"format\":\"24hr\",\"header-color\":\"primary\"},on:{\"input\":function($event){return _vm.updateSchedulerFrom($event)}}})],1),_c('v-col',{attrs:{\"cols\":\"auto\"}},[_c('v-time-picker',{attrs:{\"value\":_vm.preferences.schedule_to_hour + ':' + _vm.preferences.schedule_to_min,\"color\":\"green lighten-1\",\"format\":\"24hr\"},on:{\"input\":function($event){return _vm.updateSchedulerTo($event)}}})],1)],1):_vm._e()],1)],1),_c('v-container',{staticClass:\"px-0\",attrs:{\"fluid\":\"\"}},[_c('v-switch',{attrs:{\"input-value\":_vm.preferences.limit_utp_rate,\"label\":_vm.$t('preferences.limit_utp_rate')},on:{\"change\":function($event){return _vm.changeSettings('limit_utp_rate', !_vm.preferences.limit_utp_rate)}}}),_c('v-switch',{attrs:{\"input-value\":_vm.preferences.limit_tcp_overhead,\"label\":_vm.$t('preferences.limit_tcp_overhead')},on:{\"change\":function($event){return _vm.changeSettings('limit_tcp_overhead', !_vm.preferences.limit_tcp_overhead)}}}),_c('v-switch',{attrs:{\"input-value\":_vm.preferences.limit_lan_peers,\"label\":_vm.$t('preferences.limit_lan_peers')},on:{\"change\":function($event){return _vm.changeSettings('limit_lan_peers', !_vm.preferences.limit_lan_peers)}}})],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport Vue from 'vue'\nimport {Preferences} from '@/types'\nimport {Component} from 'vue-property-decorator'\nimport {mapActions, mapGetters} from 'vuex'\n\n@Component({\n components: {},\n computed: {\n ...mapGetters({\n preferences: 'allPreferences',\n }),\n },\n methods: {\n ...mapActions({\n updatePreferencesRequest: 'updatePreferencesRequest',\n }),\n convertToKB(value: number): string {\n return (value / 1024).toString()\n },\n convertToBytes(value: number): number {\n return value * 1024\n },\n },\n})\nexport default class SpeedSettings extends Vue {\n preferences!: Preferences\n\n updatePreferencesRequest!: (_: any) => void\n\n changeSettings(property: string, value: string | boolean | number) {\n this.updatePreferencesRequest({[property]: value})\n }\n\n updateSchedulerFrom(event: string) {\n const strings = event.split(':')\n this.updatePreferencesRequest({'schedule_from_hour': strings[0], 'schedule_from_min': strings[1]})\n }\n\n updateSchedulerTo(event: string) {\n const strings = event.split(':')\n this.updatePreferencesRequest({'schedule_to_hour': strings[0], 'schedule_to_min': strings[1]})\n }\n}\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??ref--14-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SpeedSettings.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??ref--14-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SpeedSettings.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./SpeedSettings.vue?vue&type=template&id=6257e5f6&scoped=true&\"\nimport script from \"./SpeedSettings.vue?vue&type=script&lang=ts&\"\nexport * from \"./SpeedSettings.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./SpeedSettings.vue?vue&type=style&index=0&id=6257e5f6&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"6257e5f6\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VCheckbox } from 'vuetify/lib/components/VCheckbox';\nimport { VCol } from 'vuetify/lib/components/VGrid';\nimport { VContainer } from 'vuetify/lib/components/VGrid';\nimport { VRow } from 'vuetify/lib/components/VGrid';\nimport { VSwitch } from 'vuetify/lib/components/VSwitch';\nimport { VTextField } from 'vuetify/lib/components/VTextField';\nimport { VTimePicker } from 'vuetify/lib/components/VTimePicker';\ninstallComponents(component, {VCheckbox,VCol,VContainer,VRow,VSwitch,VTextField,VTimePicker})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-container',[_c('h4',[_vm._v(_vm._s(_vm.$t(\"preferences.webui_remote_control\"))+\"}\")]),_c('v-divider'),_c('v-row',{attrs:{\"dense\":\"\",\"align\":\"center\"}},[_c('v-col',{attrs:{\"cols\":\"2\"}},[_c('v-subheader',[_vm._v(_vm._s(_vm.$t(\"preferences.data_update_interval\")))])],1),_c('v-col',{attrs:{\"cols\":\"4\"}},[_c('v-text-field',{attrs:{\"value\":_vm.config.updateInterval,\"type\":\"number\",\"lazy\":\"\"},on:{\"change\":function($event){return _vm.updateConfig({key: 'updateInterval', value: $event})}}})],1)],1),_c('v-row',{attrs:{\"dense\":\"\",\"align\":\"center\"}},[_c('v-col',{attrs:{\"cols\":\"2\"}},[_c('v-subheader',[_vm._v(_vm._s(_vm.$t(\"preferences.ip_address\")))])],1),_c('v-col',{attrs:{\"cols\":\"4\"}},[_c('v-text-field',{attrs:{\"value\":_vm.preferences.web_ui_address,\"lazy\":\"\"},on:{\"change\":function($event){return _vm.changeSettings('web_ui_address', $event)}}})],1),_c('v-col',{attrs:{\"cols\":\"1\"}},[_c('v-subheader',[_vm._v(_vm._s(_vm.$t(\"preferences.ip_port\")))])],1),_c('v-col',{attrs:{\"cols\":\"1\"}},[_c('v-text-field',{attrs:{\"value\":_vm.preferences.web_ui_port,\"lazy\":\"\"},on:{\"change\":function($event){return _vm.changeSettings('web_ui_port', $event)}}})],1)],1),_c('v-row',{attrs:{\"dense\":\"\"}},[_c('v-col',[_c('v-checkbox',{attrs:{\"label\":_vm.$t('preferences.display_speed_in_title'),\"input-value\":_vm.config.displaySpeedInTitle},on:{\"change\":function($event){return _vm.updateTitleSpeedConfig($event)}}})],1)],1),_c('h4',[_vm._v(_vm._s(_vm.$t(\"preferences.authentication\")))]),_c('v-divider'),_c('preference-row',{attrs:{\"i18n-key\":\"web_ui_username\"}},[_c('v-text-field',{attrs:{\"value\":_vm.preferences.web_ui_username,\"lazy\":\"\"},on:{\"change\":function($event){return _vm.changeSettings('web_ui_username', $event)}}})],1),_c('preference-row',{attrs:{\"i18n-key\":\"web_ui_password\"}},[_c('v-text-field',{attrs:{\"value\":_vm.preferences.web_ui_password,\"placeholder\":_vm.$t('preferences.new_password'),\"lazy\":\"\"},on:{\"change\":function($event){return _vm.changeSettings('web_ui_password', $event)}}})],1),_c('v-row',{attrs:{\"dense\":\"\"}},[_c('v-col',{attrs:{\"cols\":\"auto\"}},[_vm._v(\" \"+_vm._s(_vm.$t(\"preferences.web_ui_max_auth_fail_count\"))+\" \")]),_c('v-col',{attrs:{\"cols\":\"1\"}},[_c('v-text-field',{attrs:{\"value\":_vm.preferences.web_ui_max_auth_fail_count,\"lazy\":\"\"},on:{\"change\":function($event){return _vm.changeSettings('web_ui_max_auth_fail_count', $event)}}})],1),_c('v-col',{attrs:{\"cols\":\"auto\"}},[_vm._v(\" \"+_vm._s(_vm.$t(\"preferences.web_ui_ban_duration\"))+\" \")]),_c('v-col',{attrs:{\"cols\":\"1\"}},[_c('v-text-field',{attrs:{\"value\":_vm.preferences.web_ui_ban_duration,\"lazy\":\"\"},on:{\"change\":function($event){return _vm.changeSettings('web_ui_ban_duration', $event)}}})],1),_c('v-col',{attrs:{\"cols\":\"auto\"}},[_vm._v(\" \"+_vm._s(_vm.$t(\"preferences.web_ui_seconds\"))+\" \")])],1),_c('v-row',{attrs:{\"dense\":\"\"}},[_c('v-col',[_c('v-checkbox',{attrs:{\"input-value\":_vm.preferences.bypass_auth_subnet_whitelist_enabled,\"label\":_vm.$t('preferences.bypass_auth_subnet_whitelist')},on:{\"change\":function($event){return _vm.changeSettings('bypass_auth_subnet_whitelist_enabled', $event)}}})],1),_c('v-col',[_c('v-checkbox',{attrs:{\"input-value\":_vm.preferences.bypass_local_auth,\"label\":_vm.$t('preferences.bypass_local_auth')},on:{\"change\":function($event){return _vm.changeSettings('bypass_local_auth', $event)}}})],1)],1),_c('v-row',{attrs:{\"dense\":\"\"}},[_c('v-col',{attrs:{\"cols\":\"4\"}},[_c('v-textarea',{attrs:{\"value\":_vm.preferences.bypass_auth_subnet_whitelist,\"lazy\":\"\"},on:{\"change\":function($event){return _vm.changeSettings('bypass_auth_subnet_whitelist', $event)}}})],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport Vue from 'vue'\nimport {Preferences} from '@/types'\nimport {Component} from 'vue-property-decorator'\nimport {mapActions, mapGetters, mapMutations} from 'vuex'\nimport {Config} from '@/store/config'\nimport { ConfigPayload } from '@/store/types';\nimport PreferenceRow from '@/components/dialogs/settingsDialog/PreferenceRow.vue'\n\n@Component({\n components: {PreferenceRow},\n computed: {\n ...mapGetters({\n config: 'config',\n preferences: 'allPreferences',\n }),\n },\n methods: {\n ...mapMutations([\n 'updateConfig',\n ]),\n ...mapActions({\n updatePreferencesRequest: 'updatePreferencesRequest',\n }),\n },\n})\nexport default class WebUISettings extends Vue {\n preferences!: Preferences\n config!: Config\n\n updateConfig!: (_: ConfigPayload) => void\n updatePreferencesRequest!: (_: any) => void\n\n changeSettings(property: string, value: string | boolean) {\n this.updatePreferencesRequest({[property]: value})\n }\n\n updateTitleSpeedConfig(event: boolean) {\n this.updateConfig({\n key: 'displaySpeedInTitle',\n value: event,\n })\n if(!event) {\n document.title = 'qBittorrent Web UI'\n }\n }\n}\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??ref--14-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./WebUISettings.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??ref--14-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./WebUISettings.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./WebUISettings.vue?vue&type=template&id=e3db92b0&\"\nimport script from \"./WebUISettings.vue?vue&type=script&lang=ts&\"\nexport * from \"./WebUISettings.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VCheckbox } from 'vuetify/lib/components/VCheckbox';\nimport { VCol } from 'vuetify/lib/components/VGrid';\nimport { VContainer } from 'vuetify/lib/components/VGrid';\nimport { VDivider } from 'vuetify/lib/components/VDivider';\nimport { VRow } from 'vuetify/lib/components/VGrid';\nimport { VSubheader } from 'vuetify/lib/components/VSubheader';\nimport { VTextField } from 'vuetify/lib/components/VTextField';\nimport { VTextarea } from 'vuetify/lib/components/VTextarea';\ninstallComponents(component, {VCheckbox,VCol,VContainer,VDivider,VRow,VSubheader,VTextField,VTextarea})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-container',[_c('v-switch',{attrs:{\"input-value\":_vm.preferences.rss_processing_enabled,\"label\":_vm.$t('preferences.rss_processing_enabled')},on:{\"change\":function($event){return _vm.changeSettings('rss_processing_enabled', !_vm.preferences.rss_processing_enabled)}}}),_c('v-switch',{attrs:{\"input-value\":_vm.preferences.rss_auto_downloading_enabled,\"label\":_vm.$t('preferences.rss_auto_downloading_enabled')},on:{\"change\":function($event){return _vm.changeSettings('rss_auto_downloading_enabled', !_vm.preferences.rss_auto_downloading_enabled)}}}),_c('v-text-field',{attrs:{\"suffix\":\"min\",\"type\":\"number\",\"value\":_vm.preferences.rss_refresh_interval,\"label\":_vm.$t('preferences.rss_refresh_interval')},on:{\"change\":function($event){return _vm.changeSettings('rss_refresh_interval', $event)}}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport Vue from 'vue'\nimport {Preferences} from '@/types'\nimport {Component} from 'vue-property-decorator'\nimport {mapActions, mapGetters} from 'vuex'\n\n@Component({\n components: {},\n computed: {\n ...mapGetters({\n preferences: 'allPreferences',\n }),\n },\n methods: {\n ...mapActions({\n updatePreferencesRequest: 'updatePreferencesRequest',\n }),\n },\n})\nexport default class SpeedSettings extends Vue {\n preferences!: Preferences\n\n updatePreferencesRequest!: (_: any) => void\n\n changeSettings(property: string, value: string | boolean | number) {\n this.updatePreferencesRequest({[property]: value})\n }\n}\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??ref--14-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RssSettings.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??ref--14-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RssSettings.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./RssSettings.vue?vue&type=template&id=0418c586&scoped=true&\"\nimport script from \"./RssSettings.vue?vue&type=script&lang=ts&\"\nexport * from \"./RssSettings.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./RssSettings.vue?vue&type=style&index=0&id=0418c586&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"0418c586\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VContainer } from 'vuetify/lib/components/VGrid';\nimport { VSwitch } from 'vuetify/lib/components/VSwitch';\nimport { VTextField } from 'vuetify/lib/components/VTextField';\ninstallComponents(component, {VContainer,VSwitch,VTextField})\n","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport Vue from 'vue'\nimport {Component, Emit, Prop, Watch} from 'vue-property-decorator'\nimport DownloadSettings from './DownloadSettings.vue'\nimport SpeedSettings from './SpeedSettings.vue'\nimport {mapGetters} from 'vuex'\nimport {Preferences} from '@/types'\nimport WebUISettings from './WebUISettings.vue'\nimport RssSettings from './RssSettings.vue'\nimport {Config} from '@/store/config'\nimport { timeout } from '@/utils'\n\n@Component({\n components: {\n DownloadSettings,\n SpeedSettings,\n WebUISettings,\n RssSettings,\n },\n computed: {\n ...mapGetters({\n config: 'config',\n preferences: 'allPreferences',\n }),\n },\n methods: {},\n})\nexport default class SettingsDialog extends Vue {\n @Prop(Boolean)\n readonly value!: boolean\n preferences!: Preferences\n config!: Config\n\n preferenceUpdated = false\n tabList = ['downloads', 'speed', 'rss', 'webui']\n tab = 'download'\n\n @Watch('preferences')\n @Watch('config')\n async onPreferenceUpdate() {\n this.preferenceUpdated = true\n await timeout(3000)\n this.preferenceUpdated = false\n }\n\n @Emit('input')\n closeDialog() {\n return false\n }\n}\n","import mod from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??ref--14-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SettingsDialog.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/ts-loader/index.js??ref--14-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SettingsDialog.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./SettingsDialog.vue?vue&type=template&id=3eb994fd&scoped=true&\"\nimport script from \"./SettingsDialog.vue?vue&type=script&lang=ts&\"\nexport * from \"./SettingsDialog.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./SettingsDialog.vue?vue&type=style&index=0&id=3eb994fd&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"3eb994fd\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VAlert } from 'vuetify/lib/components/VAlert';\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VCardText } from 'vuetify/lib/components/VCard';\nimport { VCardTitle } from 'vuetify/lib/components/VCard';\nimport { VDialog } from 'vuetify/lib/components/VDialog';\nimport { VFadeTransition } from 'vuetify/lib/components/transitions';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VSpacer } from 'vuetify/lib/components/VGrid';\nimport { VTab } from 'vuetify/lib/components/VTabs';\nimport { VTabItem } from 'vuetify/lib/components/VTabs';\nimport { VTabs } from 'vuetify/lib/components/VTabs';\nimport { VTabsItems } from 'vuetify/lib/components/VTabs';\ninstallComponents(component, {VAlert,VBtn,VCard,VCardText,VCardTitle,VDialog,VFadeTransition,VIcon,VSpacer,VTab,VTabItem,VTabs,VTabsItems})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"drawer-footer\"},[(_vm.showInfo)?_c('v-expand-transition',[_c('div',[_c('v-divider'),_c('AppFooter',{attrs:{\"phone-layout\":\"\"}})],1)]):_vm._e(),_c('v-divider'),_c('div',{staticClass:\"button-bar\"},[(_vm.phoneLayout)?[_c('v-btn',{attrs:{\"icon\":\"\"},on:{\"click\":function($event){_vm.showInfo = !_vm.showInfo}}},[_c('v-icon',[_vm._v(\"mdi-information\")])],1)]:_vm._e(),_c('v-spacer'),_c('v-menu',{scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-btn',_vm._g({attrs:{\"icon\":\"\"}},on),[_c('v-icon',[_vm._v(\"mdi-translate\")])],1)]}}])},[_c('v-list',[_c('v-list-item-group',{attrs:{\"color\":\"primary\"},model:{value:(_vm.currentLocale),callback:function ($$v) {_vm.currentLocale=$$v},expression:\"currentLocale\"}},_vm._l((_vm.locales),function(item){return _c('v-list-item',{key:item.value,attrs:{\"value\":item.value}},[_c('v-list-item-title',[_vm._v(_vm._s(item.text))])],1)}),1)],1)],1),_c('v-menu',{scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-btn',_vm._g({attrs:{\"icon\":\"\"}},on),[_c('v-icon',{domProps:{\"textContent\":_vm._s(_vm.darkModeIcon)}})],1)]}}])},[_c('v-list',[_c('v-list-item-group',{attrs:{\"color\":\"primary\"},model:{value:(_vm.currentDarkMode),callback:function ($$v) {_vm.currentDarkMode=$$v},expression:\"currentDarkMode\"}},_vm._l((_vm.darkModes),function(item){return _c('v-list-item',{key:item[0],attrs:{\"value\":item[0]}},[_c('v-list-item-title',[_vm._v(_vm._s(item[1]))])],1)}),1)],1)],1),_c('v-btn',{attrs:{\"icon\":\"\",\"title\":_vm.$t('trigger_application_shutdown')},on:{\"click\":_vm.triggerApplicationShutdown}},[_c('v-icon',[_vm._v(\"mdi-power-plug-off\")])],1)],2)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport Vue from 'vue'\nimport Component from 'vue-class-component';\nimport { mapMutations, mapActions } from 'vuex';\nimport { Watch } from 'vue-property-decorator';\nimport api from '../../Api';\n\nimport { tr, translations, defaultLocale, LocaleKey } from '@/locale';\nimport { DialogType, DialogConfig, SnackBarConfig, ConfigPayload } from '@/store/types';\nimport AppFooter from '@/components/Footer.vue';\n\nconst AUTO_KEY = 'auto';\n\ntype AllLocaleKey = NonNullable | typeof AUTO_KEY;\ntype DarkModeKey = true | false | null;\n\n@Component({\n components: {\n AppFooter,\n },\n methods: {\n ...mapMutations([\n 'showSnackBar',\n 'updateConfig',\n ]),\n ...mapActions([\n 'asyncShowDialog',\n ]),\n },\n})\nexport default class DrawerFooter extends Vue {\n locales = this.buildLocales()\n currentLocale = this.$store.getters.config.locale || AUTO_KEY\n currentDarkMode = this.$store.getters.config.darkMode || AUTO_KEY\n oldLocale = this.currentLocale\n showInfo = false\n\n darkModes = [\n [false, tr('light')],\n [true, tr('dark')],\n [AUTO_KEY, tr('auto')],\n ]\n\n asyncShowDialog!: (_: DialogConfig) => Promise\n showSnackBar!: (_: SnackBarConfig) => void\n updateConfig!: (_: ConfigPayload) => void\n\n get darkModeIcon() {\n if (this.currentDarkMode == true) {\n return 'mdi-brightness-4'\n } else if (this.currentDarkMode == false) {\n return 'mdi-brightness-7'\n } else {\n return 'mdi-brightness-auto'\n }\n }\n\n get phoneLayout() {\n return this.$vuetify.breakpoint.xsOnly;\n }\n\n buildLocales() {\n const locales: {}[] = Object.entries(translations).map(([lang, translation]) => {\n return {\n text: translation.lang,\n value: lang,\n };\n });\n\n return [\n {\n text: tr('auto'),\n value: 'auto',\n },\n ...locales,\n ]\n }\n\n @Watch('currentLocale')\n async onCurrentLocaleChanged(locale: AllLocaleKey) {\n if (locale === this.oldLocale) {\n return;\n }\n\n const localeKey = locale === AUTO_KEY ? defaultLocale : locale\n const confirm = await this.asyncShowDialog({\n text: tr('dialog.switch_locale.msg', { lang: translations[localeKey].lang }),\n type: DialogType.OkCancel,\n });\n\n if (!confirm) {\n this.currentLocale = this.oldLocale;\n return;\n }\n\n this.updateConfig({\n key: 'locale',\n value: locale === AUTO_KEY ? null : locale,\n });\n\n this.showSnackBar({\n text: tr('label.reloading'),\n })\n\n location.reload();\n }\n\n @Watch('currentDarkMode')\n onDarkModeChanged(mode: DarkModeKey | typeof AUTO_KEY) {\n this.updateConfig({\n key: 'darkMode',\n value: mode == AUTO_KEY ? null : mode,\n });\n }\n\n async triggerApplicationShutdown() {\n const v = await this.asyncShowDialog({\n title: tr('dialog.trigger_exit_qb.title'),\n text: tr('dialog.trigger_exit_qb.text'),\n type: DialogType.OkCancel,\n });\n\n if (!v) {\n return;\n }\n await api.shutdownApplication();\n }\n}\n","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport Vue from 'vue';\nimport { mapGetters, mapState, mapMutations } from 'vuex';\nimport { registerProtocolHandler, checkDownloadUrl } from './protocolHandler';\n\nimport GlobalDialog from './components/GlobalDialog.vue';\nimport GlobalSnackBar from './components/GlobalSnackBar.vue';\n\nimport AddForm from './components/AddForm.vue';\nimport Drawer from './components/Drawer.vue';\nimport LoginForm from './components/LoginForm.vue';\nimport MainToolbar from './components/MainToolbar.vue';\nimport Torrents from './components/Torrents.vue';\nimport AppFooter from './components/Footer.vue';\nimport LogsDialog from './components/dialogs/LogsDialog.vue';\nimport RssDialog from './components/dialogs/RssDialog.vue';\nimport SearchDialog from './components/dialogs/searchDialog/SearchDialog.vue';\nimport SettingsDialog from './components/dialogs/settingsDialog/SettingsDialog.vue';\nimport DrawerFooter from './components/drawer/DrawerFooter.vue';\n\n\nimport api from './Api';\nimport Component from 'vue-class-component';\nimport { Watch } from 'vue-property-decorator';\nimport { MainData } from './types';\nimport { Config } from './store/config';\nimport Api from './Api';\nimport {formatSize} from '@/filters'\n\nlet appWrapEl: HTMLElement;\n\n@Component({\n components: {\n AddForm,\n Drawer,\n LoginForm,\n Torrents,\n AppFooter,\n LogsDialog,\n MainToolbar,\n GlobalDialog,\n GlobalSnackBar,\n RssDialog,\n SearchDialog,\n DrawerFooter,\n SettingsDialog,\n },\n computed: {\n ...mapState([\n 'mainData',\n 'rid',\n 'preferences',\n 'needAuth',\n ]),\n ...mapGetters(['config']),\n },\n methods: {\n ...mapMutations([\n 'updateMainData',\n 'updatePreferences',\n 'setPasteUrl',\n 'updateNeedAuth',\n ]),\n },\n})\nexport default class App extends Vue {\n drawer = !this.phoneLayout\n drawerOptions = {\n showLogs: false,\n showRss: false,\n showSettings: false,\n }\n task = 0\n mql?: MediaQueryList\n\n mainData!: MainData\n rid!: number\n preferences!: any\n config!: Config\n needAuth!: boolean\n\n updateMainData!: (_: any) => void\n updatePreferences!: (_: any) => void\n setPasteUrl!: (_: any) => void\n updateNeedAuth!: (_: boolean) => void\n\n get phoneLayout() {\n return this.$vuetify.breakpoint.xsOnly;\n }\n\n initProtocolHandler() {\n registerProtocolHandler();\n const url = checkDownloadUrl();\n\n if (url) {\n this.setPasteUrl({\n url,\n });\n }\n }\n\n async created() {\n this.initProtocolHandler();\n\n await this.getInitData();\n appWrapEl = (this.$refs.app as any).$el.querySelector('.v-application--wrap');\n appWrapEl.addEventListener('paste', this.onPaste);\n }\n\n beforeDestroy() {\n if (this.task) {\n clearTimeout(this.task);\n }\n appWrapEl.removeEventListener('paste', this.onPaste);\n }\n\n async getInitData() {\n const href = location.href;\n if (!this.config.baseUrl) {\n if (href.includes(\"czbix.github.io\") || href.includes(\"localhost\")) {\n this.updateNeedAuth(true);\n return;\n } else {\n Api.changeBaseUrl(href);\n }\n } else {\n Api.changeBaseUrl(this.config.baseUrl);\n }\n\n try {\n await this.getMainData();\n } catch (e) {\n this.updateNeedAuth(true);\n return;\n }\n\n await this.getPreferences();\n }\n\n async getPreferences() {\n const resp = await api.getAppPreferences();\n\n this.updatePreferences(resp.data);\n }\n\n async getMainData() {\n const rid = this.rid ? this.rid : undefined;\n const resp = await api.getMainData(rid);\n const mainData = resp.data;\n\n this.updateMainData(mainData);\n if(this.config.displaySpeedInTitle) {\n const upInfoSpeed = mainData.server_state.up_info_speed\n const dlInfoSpeed = mainData.server_state.dl_info_speed\n let dl = '', up = ''\n if (dlInfoSpeed > 1024) {\n dl = `D ${formatSize(dlInfoSpeed)}/s`\n }\n if (upInfoSpeed > 1024) {\n up = `U ${formatSize(upInfoSpeed)}/s`\n }\n document.title = `[${up} ${dl}] qBittorrent Web UI`\n }\n this.task = setTimeout(this.getMainData, this.config.updateInterval);\n }\n\n onPaste(e: ClipboardEvent) {\n if ((e.target as HTMLElement).tagName === 'INPUT') {\n return;\n }\n\n const text = e.clipboardData!.getData('text');\n if (text) {\n this.setPasteUrl({\n url: text,\n });\n }\n }\n\n @Watch('needAuth')\n onNeedAuth(v: boolean) {\n if (!v) {\n this.getInitData();\n }\n }\n\n @Watch('config.darkMode', {immediate: true})\n onDarkMode(mode: any) {\n const { theme } = this.$vuetify;\n\n if (mode != null) {\n if (this.mql) {\n this.mql.removeListener(null)\n this.mql = undefined\n }\n theme.dark = mode\n return\n }\n\n this.mql = window.matchMedia('(prefers-color-scheme: dark)');\n this.mql.addListener((e: MediaQueryListEvent) => {\n theme.dark = e.matches\n })\n theme.dark = this.mql.matches\n }\n}\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??ref--14-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DrawerFooter.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--14-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/ts-loader/index.js??ref--14-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DrawerFooter.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./DrawerFooter.vue?vue&type=template&id=521b95f4&scoped=true&\"\nimport script from \"./DrawerFooter.vue?vue&type=script&lang=ts&\"\nexport * from \"./DrawerFooter.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./DrawerFooter.vue?vue&type=style&index=0&id=521b95f4&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"521b95f4\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VDivider } from 'vuetify/lib/components/VDivider';\nimport { VExpandTransition } from 'vuetify/lib/components/transitions';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VList } from 'vuetify/lib/components/VList';\nimport { VListItem } from 'vuetify/lib/components/VList';\nimport { VListItemGroup } from 'vuetify/lib/components/VList';\nimport { VListItemTitle } from 'vuetify/lib/components/VList';\nimport { VMenu } from 'vuetify/lib/components/VMenu';\nimport { VSpacer } from 'vuetify/lib/components/VGrid';\ninstallComponents(component, {VBtn,VDivider,VExpandTransition,VIcon,VList,VListItem,VListItemGroup,VListItemTitle,VMenu,VSpacer})\n","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--14-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/ts-loader/index.js??ref--14-3!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--14-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/ts-loader/index.js??ref--14-3!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=0d9d7390&scoped=true&\"\nimport script from \"./App.vue?vue&type=script&lang=ts&\"\nexport * from \"./App.vue?vue&type=script&lang=ts&\"\nimport style0 from \"./App.vue?vue&type=style&index=0&id=0d9d7390&lang=scss&scoped=true&\"\nimport style1 from \"./App.vue?vue&type=style&index=1&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"0d9d7390\",\n null\n \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VApp } from 'vuetify/lib/components/VApp';\nimport { VFooter } from 'vuetify/lib/components/VFooter';\nimport { VMain } from 'vuetify/lib/components/VMain';\nimport { VNavigationDrawer } from 'vuetify/lib/components/VNavigationDrawer';\ninstallComponents(component, {VApp,VFooter,VMain,VNavigationDrawer})\n","/* eslint-disable no-console */\n\nimport { register } from 'register-service-worker'\n\nif (process.env.NODE_ENV === 'production') {\n register(`${process.env.BASE_URL}service-worker.js`, {\n ready () {\n console.log(\n 'App is being served from cache by a service worker.\\n' +\n 'For more details, visit https://goo.gl/AFskqB',\n )\n },\n registered () {\n console.log('Service worker has been registered.')\n },\n cached () {\n console.log('Content has been cached for offline use.')\n },\n updatefound () {\n console.log('New content is downloading.')\n },\n updated () {\n console.log('New content is available; please refresh.')\n },\n offline () {\n console.log('No internet connection found. App is running in offline mode.')\n },\n error (error) {\n console.error('Error during service worker registration:', error)\n },\n })\n}\n","import Vue from 'vue';\nimport './plugins/i18n';\nimport './plugins/composition-api';\nimport vuetify from './plugins/vuetify';\n\nimport store from './store';\n// import router from './router';\nimport './filters';\nimport './directives';\nimport './locale';\n\nimport './buildInfo';\n\nimport App from './App.vue';\n\nimport 'roboto-fontface/css/roboto/roboto-fontface.css';\nimport '@mdi/font/css/materialdesignicons.css';\nimport './registerServiceWorker';\n\nVue.config.productionTip = false;\n\nnew Vue({\n store,\n vuetify,\n render: h => h(App),\n}).$mount('#app');\n","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DownloadSettings.vue?vue&type=style&index=0&id=2e1e1380&lang=scss&scoped=true&\"","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SearchDialog.vue?vue&type=style&index=0&id=2425d8a7&lang=scss&scoped=true&\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MainToolbar.vue?vue&type=style&index=0&id=d37eb7d4&lang=scss&scoped=true&\""],"sourceRoot":""} \ No newline at end of file diff --git a/config/qbittorrent/webui/qb-web-nightly/dist/public/js/chunk-vendors.d5c7eb57.js b/config/qbittorrent/webui/qb-web-nightly/dist/public/js/chunk-vendors.d5c7eb57.js deleted file mode 100644 index 192f6c5..0000000 --- a/config/qbittorrent/webui/qb-web-nightly/dist/public/js/chunk-vendors.d5c7eb57.js +++ /dev/null @@ -1,41 +0,0 @@ -(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-vendors"],{"00ce":function(t,e,n){"use strict";var i,r=SyntaxError,s=Function,a=TypeError,o=function(t){try{return s('"use strict"; return ('+t+").constructor;")()}catch(e){}},l=Object.getOwnPropertyDescriptor;if(l)try{l({},"")}catch($){l=null}var c=function(){throw new a},u=l?function(){try{return c}catch(t){try{return l(arguments,"callee").get}catch(e){return c}}}():c,h=n("5156")(),d=Object.getPrototypeOf||function(t){return t.__proto__},p={},f="undefined"===typeof Uint8Array?i:d(Uint8Array),v={"%AggregateError%":"undefined"===typeof AggregateError?i:AggregateError,"%Array%":Array,"%ArrayBuffer%":"undefined"===typeof ArrayBuffer?i:ArrayBuffer,"%ArrayIteratorPrototype%":h?d([][Symbol.iterator]()):i,"%AsyncFromSyncIteratorPrototype%":i,"%AsyncFunction%":p,"%AsyncGenerator%":p,"%AsyncGeneratorFunction%":p,"%AsyncIteratorPrototype%":p,"%Atomics%":"undefined"===typeof Atomics?i:Atomics,"%BigInt%":"undefined"===typeof BigInt?i:BigInt,"%Boolean%":Boolean,"%DataView%":"undefined"===typeof DataView?i:DataView,"%Date%":Date,"%decodeURI%":decodeURI,"%decodeURIComponent%":decodeURIComponent,"%encodeURI%":encodeURI,"%encodeURIComponent%":encodeURIComponent,"%Error%":Error,"%eval%":eval,"%EvalError%":EvalError,"%Float32Array%":"undefined"===typeof Float32Array?i:Float32Array,"%Float64Array%":"undefined"===typeof Float64Array?i:Float64Array,"%FinalizationRegistry%":"undefined"===typeof FinalizationRegistry?i:FinalizationRegistry,"%Function%":s,"%GeneratorFunction%":p,"%Int8Array%":"undefined"===typeof Int8Array?i:Int8Array,"%Int16Array%":"undefined"===typeof Int16Array?i:Int16Array,"%Int32Array%":"undefined"===typeof Int32Array?i:Int32Array,"%isFinite%":isFinite,"%isNaN%":isNaN,"%IteratorPrototype%":h?d(d([][Symbol.iterator]())):i,"%JSON%":"object"===typeof JSON?JSON:i,"%Map%":"undefined"===typeof Map?i:Map,"%MapIteratorPrototype%":"undefined"!==typeof Map&&h?d((new Map)[Symbol.iterator]()):i,"%Math%":Math,"%Number%":Number,"%Object%":Object,"%parseFloat%":parseFloat,"%parseInt%":parseInt,"%Promise%":"undefined"===typeof Promise?i:Promise,"%Proxy%":"undefined"===typeof Proxy?i:Proxy,"%RangeError%":RangeError,"%ReferenceError%":ReferenceError,"%Reflect%":"undefined"===typeof Reflect?i:Reflect,"%RegExp%":RegExp,"%Set%":"undefined"===typeof Set?i:Set,"%SetIteratorPrototype%":"undefined"!==typeof Set&&h?d((new Set)[Symbol.iterator]()):i,"%SharedArrayBuffer%":"undefined"===typeof SharedArrayBuffer?i:SharedArrayBuffer,"%String%":String,"%StringIteratorPrototype%":h?d(""[Symbol.iterator]()):i,"%Symbol%":h?Symbol:i,"%SyntaxError%":r,"%ThrowTypeError%":u,"%TypedArray%":f,"%TypeError%":a,"%Uint8Array%":"undefined"===typeof Uint8Array?i:Uint8Array,"%Uint8ClampedArray%":"undefined"===typeof Uint8ClampedArray?i:Uint8ClampedArray,"%Uint16Array%":"undefined"===typeof Uint16Array?i:Uint16Array,"%Uint32Array%":"undefined"===typeof Uint32Array?i:Uint32Array,"%URIError%":URIError,"%WeakMap%":"undefined"===typeof WeakMap?i:WeakMap,"%WeakRef%":"undefined"===typeof WeakRef?i:WeakRef,"%WeakSet%":"undefined"===typeof WeakSet?i:WeakSet},g=function t(e){var n;if("%AsyncFunction%"===e)n=o("async function () {}");else if("%GeneratorFunction%"===e)n=o("function* () {}");else if("%AsyncGeneratorFunction%"===e)n=o("async function* () {}");else if("%AsyncGenerator%"===e){var i=t("%AsyncGeneratorFunction%");i&&(n=i.prototype)}else if("%AsyncIteratorPrototype%"===e){var r=t("%AsyncGenerator%");r&&(n=d(r.prototype))}return v[e]=n,n},m={"%ArrayBufferPrototype%":["ArrayBuffer","prototype"],"%ArrayPrototype%":["Array","prototype"],"%ArrayProto_entries%":["Array","prototype","entries"],"%ArrayProto_forEach%":["Array","prototype","forEach"],"%ArrayProto_keys%":["Array","prototype","keys"],"%ArrayProto_values%":["Array","prototype","values"],"%AsyncFunctionPrototype%":["AsyncFunction","prototype"],"%AsyncGenerator%":["AsyncGeneratorFunction","prototype"],"%AsyncGeneratorPrototype%":["AsyncGeneratorFunction","prototype","prototype"],"%BooleanPrototype%":["Boolean","prototype"],"%DataViewPrototype%":["DataView","prototype"],"%DatePrototype%":["Date","prototype"],"%ErrorPrototype%":["Error","prototype"],"%EvalErrorPrototype%":["EvalError","prototype"],"%Float32ArrayPrototype%":["Float32Array","prototype"],"%Float64ArrayPrototype%":["Float64Array","prototype"],"%FunctionPrototype%":["Function","prototype"],"%Generator%":["GeneratorFunction","prototype"],"%GeneratorPrototype%":["GeneratorFunction","prototype","prototype"],"%Int8ArrayPrototype%":["Int8Array","prototype"],"%Int16ArrayPrototype%":["Int16Array","prototype"],"%Int32ArrayPrototype%":["Int32Array","prototype"],"%JSONParse%":["JSON","parse"],"%JSONStringify%":["JSON","stringify"],"%MapPrototype%":["Map","prototype"],"%NumberPrototype%":["Number","prototype"],"%ObjectPrototype%":["Object","prototype"],"%ObjProto_toString%":["Object","prototype","toString"],"%ObjProto_valueOf%":["Object","prototype","valueOf"],"%PromisePrototype%":["Promise","prototype"],"%PromiseProto_then%":["Promise","prototype","then"],"%Promise_all%":["Promise","all"],"%Promise_reject%":["Promise","reject"],"%Promise_resolve%":["Promise","resolve"],"%RangeErrorPrototype%":["RangeError","prototype"],"%ReferenceErrorPrototype%":["ReferenceError","prototype"],"%RegExpPrototype%":["RegExp","prototype"],"%SetPrototype%":["Set","prototype"],"%SharedArrayBufferPrototype%":["SharedArrayBuffer","prototype"],"%StringPrototype%":["String","prototype"],"%SymbolPrototype%":["Symbol","prototype"],"%SyntaxErrorPrototype%":["SyntaxError","prototype"],"%TypedArrayPrototype%":["TypedArray","prototype"],"%TypeErrorPrototype%":["TypeError","prototype"],"%Uint8ArrayPrototype%":["Uint8Array","prototype"],"%Uint8ClampedArrayPrototype%":["Uint8ClampedArray","prototype"],"%Uint16ArrayPrototype%":["Uint16Array","prototype"],"%Uint32ArrayPrototype%":["Uint32Array","prototype"],"%URIErrorPrototype%":["URIError","prototype"],"%WeakMapPrototype%":["WeakMap","prototype"],"%WeakSetPrototype%":["WeakSet","prototype"]},b=n("0f7c"),y=n("a0d3"),x=b.call(Function.call,Array.prototype.concat),w=b.call(Function.apply,Array.prototype.splice),_=b.call(Function.call,String.prototype.replace),S=b.call(Function.call,String.prototype.slice),A=/[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g,k=/\\(\\)?/g,C=function(t){var e=S(t,0,1),n=S(t,-1);if("%"===e&&"%"!==n)throw new r("invalid intrinsic syntax, expected closing `%`");if("%"===n&&"%"!==e)throw new r("invalid intrinsic syntax, expected opening `%`");var i=[];return _(t,A,(function(t,e,n,r){i[i.length]=n?_(r,k,"$1"):e||t})),i},O=function(t,e){var n,i=t;if(y(m,i)&&(n=m[i],i="%"+n[0]+"%"),y(v,i)){var s=v[i];if(s===p&&(s=g(i)),"undefined"===typeof s&&!e)throw new a("intrinsic "+t+" exists, but is not available. Please file an issue!");return{alias:n,name:i,value:s}}throw new r("intrinsic "+t+" does not exist!")};t.exports=function(t,e){if("string"!==typeof t||0===t.length)throw new a("intrinsic name must be a non-empty string");if(arguments.length>1&&"boolean"!==typeof e)throw new a('"allowMissing" argument must be a boolean');var n=C(t),i=n.length>0?n[0]:"",s=O("%"+i+"%",e),o=s.name,c=s.value,u=!1,h=s.alias;h&&(i=h[0],w(n,x([0,1],h)));for(var d=1,p=!0;d=n.length){var b=l(c,f);p=!!b,c=p&&"get"in b&&!("originalValue"in b.get)?b.get:c[f]}else p=y(c,f),c=c[f];p&&!u&&(v[o]=c)}}return c}},"00ee":function(t,e,n){var i=n("b622"),r=i("toStringTag"),s={};s[r]="z",t.exports="[object z]"===String(s)},"035c":function(t,e,n){"use strict";n.r(e),e["default"]={badge:"Bricka",close:"Stäng",dataIterator:{noResultsText:"Inga poster funna",loadingText:"Laddar data..."},dataTable:{itemsPerPageText:"Rader per sida:",ariaLabel:{sortDescending:"Sorterat fallande.",sortAscending:"Sorterat stigande.",sortNone:"Osorterat.",activateNone:"Aktivera för att ta bort sortering.",activateDescending:"Aktivera för sortering fallande.",activateAscending:"Aktivera för sortering stigande."},sortBy:"Sortera efter"},dataFooter:{itemsPerPageText:"Objekt per sida:",itemsPerPageAll:"Alla",nextPage:"Nästa sida",prevPage:"Föregående sida",firstPage:"Första sidan",lastPage:"Sista sidan",pageText:"{0}-{1} av {2}"},datePicker:{itemsSelected:"{0} markerade",nextMonthAriaLabel:"Nästa månad",nextYearAriaLabel:"Nästa år",prevMonthAriaLabel:"Förra månaden",prevYearAriaLabel:"Förra året"},noDataText:"Ingen data tillgänglig",carousel:{prev:"Föregående vy",next:"Nästa vy",ariaLabel:{delimiter:"Carousel slide {0} of {1}"}},calendar:{moreEvents:"{0} fler"},fileInput:{counter:"{0} filer",counterSize:"{0} filer (av {1} totalt)"},timePicker:{am:"AM",pm:"PM"},pagination:{ariaLabel:{wrapper:"Pagination Navigation",next:"Nästa sida",previous:"Föregående sida",page:"Gå till sidan {0}",currentPage:"Aktuell sida, sida {0}"}},rating:{ariaLabel:{icon:"Rating {0} of {1}"}}}},"0366":function(t,e,n){var i=n("1c0b");t.exports=function(t,e,n){if(i(t),void 0===e)return t;switch(n){case 0:return function(){return t.call(e)};case 1:return function(n){return t.call(e,n)};case 2:return function(n,i){return t.call(e,n,i)};case 3:return function(n,i,r){return t.call(e,n,i,r)}}return function(){return t.apply(e,arguments)}}},"03fd":function(t,e,n){"use strict";n.r(e),e["default"]={badge:"نشان",close:"بستن",dataIterator:{noResultsText:"نتیجه‌ای یافت نشد",loadingText:"در حال بارگذاری..."},dataTable:{itemsPerPageText:"ردیف در صفحه:",ariaLabel:{sortDescending:"مرتب‌سازی نزولی",sortAscending:"مرتب‌سازی صعودی",sortNone:"بدون مرتب‌سازی",activateNone:"غیرفعال‌سازی مرتب‌سازی",activateDescending:"غیرفعال‌سازی مرتب‌سازی نزولی",activateAscending:"غیرفعال‌سازی مرتب‌سازی صعودی"},sortBy:"مرتب‌سازی براساس"},dataFooter:{itemsPerPageText:"ردیف در صفحه:",itemsPerPageAll:"همه",nextPage:"صفحه‌ی بعد",prevPage:"صفحه‌ی قبل",firstPage:"صفحه‌ی یکم",lastPage:"صفحه‌ی آخر",pageText:"{0} تا {1} از {2}"},datePicker:{itemsSelected:"{0} انتخاب شده",nextMonthAriaLabel:"ماه بعد",nextYearAriaLabel:"سال بعد",prevMonthAriaLabel:"ماه قبل",prevYearAriaLabel:"سال قبل"},noDataText:"داده‌ای موجود نیست",carousel:{prev:"اسلاید قبلی",next:"اسلاید بعدی",ariaLabel:{delimiter:"اسلاید {0} از {1}"}},calendar:{moreEvents:"{بیشتر {0"},fileInput:{counter:"{0} پرونده",counterSize:"{0} پرونده ({1} در کل)"},timePicker:{am:"قبل از ظهر",pm:"بعد از ظهر"},pagination:{ariaLabel:{wrapper:"جهت یابی صفحه",next:"صفحه بعد",previous:"صفحه قبلی",page:"برو صفحه {0}",currentPage:"{0} صفحه فعلی ، صفحه"}},rating:{ariaLabel:{icon:"Rating {0} of {1}"}}}},"0427":function(t,e,n){"use strict";t.exports=n("4d52")},"04d1":function(t,e,n){var i=n("342f"),r=i.match(/firefox\/(\d+)/i);t.exports=!!r&&+r[1]},"0538":function(t,e,n){"use strict";var i=n("1c0b"),r=n("861d"),s=[].slice,a={},o=function(t,e,n){if(!(e in a)){for(var i=[],r=0;r{const{offsetTop:e,offsetLeft:n,offsetWidth:i,offsetHeight:r}=t;t._transitionInitialStyles={position:t.style.position,top:t.style.top,left:t.style.left,width:t.style.width,height:t.style.height},t.style.position="absolute",t.style.top=e+"px",t.style.left=n+"px",t.style.width=i+"px",t.style.height=r+"px"}),a.on.afterLeave=r(a.on.afterLeave,t=>{if(t&&t._transitionInitialStyles){const{position:e,top:n,left:i,width:r,height:s}=t._transitionInitialStyles;delete t._transitionInitialStyles,t.style.position=e||"",t.style.top=n||"",t.style.left=i||"",t.style.width=r||"",t.style.height=s||""}})),n.props.hideOnLeave&&(a.on.leave=r(a.on.leave,t=>{t._initialDisplay=t.style.display,t.style.display="none"}),a.on.afterLeave=r(a.on.afterLeave,t=>{t&&(t.style.display=t._initialDisplay||"")})),e(s,Object(i["a"])(n.data,a),n.children)}}}function a(t,e,n="in-out"){return{name:t,functional:!0,props:{mode:{type:String,default:n}},render(n,r){return n("transition",Object(i["a"])(r.data,{props:{name:t},on:e}),r.children)}}}var o=n("80d2"),l=function(t="",e=!1){const n=e?"width":"height",i="offset"+Object(o["G"])(n);return{beforeEnter(t){t._parent=t.parentNode,t._initialStyle={transition:t.style.transition,overflow:t.style.overflow,[n]:t.style[n]}},enter(e){const r=e._initialStyle;e.style.setProperty("transition","none","important"),e.style.overflow="hidden";const s=e[i]+"px";e.style[n]="0",e.offsetHeight,e.style.transition=r.transition,t&&e._parent&&e._parent.classList.add(t),requestAnimationFrame(()=>{e.style[n]=s})},afterEnter:s,enterCancelled:s,leave(t){t._initialStyle={transition:"",overflow:t.style.overflow,[n]:t.style[n]},t.style.overflow="hidden",t.style[n]=t[i]+"px",t.offsetHeight,requestAnimationFrame(()=>t.style[n]="0")},afterLeave:r,leaveCancelled:r};function r(e){t&&e._parent&&e._parent.classList.remove(t),s(e)}function s(t){const e=t._initialStyle[n];t.style.overflow=t._initialStyle.overflow,null!=e&&(t.style[n]=e),delete t._initialStyle}};s("carousel-transition"),s("carousel-reverse-transition");const c=s("tab-transition"),u=s("tab-reverse-transition"),h=(s("menu-transition"),s("fab-transition","center center","out-in")),d=(s("dialog-transition"),s("dialog-bottom-transition"),s("dialog-top-transition"),s("fade-transition")),p=(s("scale-transition"),s("scroll-x-transition"),s("scroll-x-reverse-transition"),s("scroll-y-transition"),s("scroll-y-reverse-transition"),s("slide-x-transition")),f=(s("slide-x-reverse-transition"),s("slide-y-transition"),s("slide-y-reverse-transition"),a("expand-transition",l())),v=a("expand-x-transition",l("",!0))},"0798":function(t,e,n){"use strict";n("0c18");var i=n("10d2"),r=n("afdd"),s=n("9d26"),a=n("f2e7"),o=n("7560"),l=n("2b0e"),c=l["default"].extend({name:"transitionable",props:{mode:String,origin:String,transition:String}}),u=n("58df"),h=n("d9bd");e["a"]=Object(u["a"])(i["a"],a["a"],c).extend({name:"v-alert",props:{border:{type:String,validator(t){return["top","right","bottom","left"].includes(t)}},closeLabel:{type:String,default:"$vuetify.close"},coloredBorder:Boolean,dense:Boolean,dismissible:Boolean,closeIcon:{type:String,default:"$cancel"},icon:{default:"",type:[Boolean,String],validator(t){return"string"===typeof t||!1===t}},outlined:Boolean,prominent:Boolean,text:Boolean,type:{type:String,validator(t){return["info","error","success","warning"].includes(t)}},value:{type:Boolean,default:!0}},computed:{__cachedBorder(){if(!this.border)return null;let t={staticClass:"v-alert__border",class:{["v-alert__border--"+this.border]:!0}};return this.coloredBorder&&(t=this.setBackgroundColor(this.computedColor,t),t.class["v-alert__border--has-color"]=!0),this.$createElement("div",t)},__cachedDismissible(){if(!this.dismissible)return null;const t=this.iconColor;return this.$createElement(r["a"],{staticClass:"v-alert__dismissible",props:{color:t,icon:!0,small:!0},attrs:{"aria-label":this.$vuetify.lang.t(this.closeLabel)},on:{click:()=>this.isActive=!1}},[this.$createElement(s["a"],{props:{color:t}},this.closeIcon)])},__cachedIcon(){return this.computedIcon?this.$createElement(s["a"],{staticClass:"v-alert__icon",props:{color:this.iconColor}},this.computedIcon):null},classes(){const t={...i["a"].options.computed.classes.call(this),"v-alert--border":Boolean(this.border),"v-alert--dense":this.dense,"v-alert--outlined":this.outlined,"v-alert--prominent":this.prominent,"v-alert--text":this.text};return this.border&&(t["v-alert--border-"+this.border]=!0),t},computedColor(){return this.color||this.type},computedIcon(){return!1!==this.icon&&("string"===typeof this.icon&&this.icon?this.icon:!!["error","info","success","warning"].includes(this.type)&&"$"+this.type)},hasColoredIcon(){return this.hasText||Boolean(this.border)&&this.coloredBorder},hasText(){return this.text||this.outlined},iconColor(){return this.hasColoredIcon?this.computedColor:void 0},isDark(){return!(!this.type||this.coloredBorder||this.outlined)||o["a"].options.computed.isDark.call(this)}},created(){this.$attrs.hasOwnProperty("outline")&&Object(h["a"])("outline","outlined",this)},methods:{genWrapper(){const t=[this.$slots.prepend||this.__cachedIcon,this.genContent(),this.__cachedBorder,this.$slots.append,this.$scopedSlots.close?this.$scopedSlots.close({toggle:this.toggle}):this.__cachedDismissible],e={staticClass:"v-alert__wrapper"};return this.$createElement("div",e,t)},genContent(){return this.$createElement("div",{staticClass:"v-alert__content"},this.$slots.default)},genAlert(){let t={staticClass:"v-alert",attrs:{role:"alert"},on:this.listeners$,class:this.classes,style:this.styles,directives:[{name:"show",value:this.isActive}]};if(!this.coloredBorder){const e=this.hasText?this.setTextColor:this.setBackgroundColor;t=e(this.computedColor,t)}return this.$createElement("div",t,[this.genWrapper()])},toggle(){this.isActive=!this.isActive}},render(t){const e=this.genAlert();return this.transition?t("transition",{props:{name:this.transition,origin:this.origin,mode:this.mode}},[e]):e}})},"07ac":function(t,e,n){var i=n("23e7"),r=n("6f53").values;i({target:"Object",stat:!0},{values:function(t){return r(t)}})},"07ae":function(t,e,n){"use strict";n.r(e),e["default"]={badge:"Žetons",close:"Aizvērt",dataIterator:{noResultsText:"Nekas netika atrasts",loadingText:"Ielādē..."},dataTable:{itemsPerPageText:"Rādīt lapā:",ariaLabel:{sortDescending:"Sakārtots dilstošā secībā.",sortAscending:"Sakārtots augošā secībā.",sortNone:"Nav sakārtots.",activateNone:"Aktivizēt, lai noņemtu kārtošanu.",activateDescending:"Aktivizēt, lai sakārtotu dilstošā secībā.",activateAscending:"Aktivizēt, lai sakārtotu augošā secībā."},sortBy:"Sort by"},dataFooter:{itemsPerPageText:"Rādīt lapā:",itemsPerPageAll:"Visu",nextPage:"Nākamā lapa",prevPage:"Iepriekšējā lapa",firstPage:"Pirmā lapa",lastPage:"Pēdējā lapa",pageText:"{0}-{1} no {2}"},datePicker:{itemsSelected:"{0} izvēlēts",nextMonthAriaLabel:"Nākammēnes",nextYearAriaLabel:"Nākamgad",prevMonthAriaLabel:"Iepriekšējais mēnesis",prevYearAriaLabel:"Iepriekšējais gads"},noDataText:"Nav pieejamu datu",carousel:{prev:"Iepriekšējais slaids",next:"Nākamais slaids",ariaLabel:{delimiter:"Carousel slide {0} of {1}"}},calendar:{moreEvents:"Vēl {0}"},fileInput:{counter:"{0} files",counterSize:"{0} files ({1} in total)"},timePicker:{am:"AM",pm:"PM"},pagination:{ariaLabel:{wrapper:"Navigācija paginationā",next:"Nākamā lapa",previous:"Iepriekšējā lapa",page:"Iet uz lapu {0}",currentPage:"Pašreizējā lapa, lapa {0}"}},rating:{ariaLabel:{icon:"Rating {0} of {1}"}}}},"0879":function(t,e,n){"use strict";n.r(e),e["default"]={badge:"знак",close:"Закрыть",dataIterator:{noResultsText:"Не найдено подходящих записей",loadingText:"Запись загружается..."},dataTable:{itemsPerPageText:"Строк на странице:",ariaLabel:{sortDescending:"Упорядочено по убыванию.",sortAscending:"Упорядочено по возрастанию.",sortNone:"Не упорядочено.",activateNone:"Активируйте, чтобы убрать сортировку.",activateDescending:"Активируйте для упорядочивания убыванию.",activateAscending:"Активируйте для упорядочивания по возрастанию."},sortBy:"Сортировать по"},dataFooter:{itemsPerPageText:"Записей на странице:",itemsPerPageAll:"Все",nextPage:"Следующая страница",prevPage:"Предыдущая страница",firstPage:"Первая страница",lastPage:"Последняя страница",pageText:"{0}-{1} из {2}"},datePicker:{itemsSelected:"{0} выбран",nextMonthAriaLabel:"Следующий месяц",nextYearAriaLabel:"Следующий год",prevMonthAriaLabel:"Прошлый месяц",prevYearAriaLabel:"Предыдущий год"},noDataText:"Отсутствуют данные",carousel:{prev:"Предыдущий слайд",next:"Следующий слайд",ariaLabel:{delimiter:"Слайд {0} из {1}"}},calendar:{moreEvents:"Еще {0}"},fileInput:{counter:"Файлов: {0}",counterSize:"Файлов: {0} (всего {1})"},timePicker:{am:"AM",pm:"PM"},pagination:{ariaLabel:{wrapper:"Навигация по страницам",next:"Следующая страница",previous:"Предыдущая страница",page:"Перейти на страницу {0}",currentPage:"Текущая страница, Страница {0}"}},rating:{ariaLabel:{icon:"Rating {0} of {1}"}}}},"0924":function(t,e,n){"use strict";n.r(e),e["default"]={badge:"Bedž",close:"Zatvori",dataIterator:{noResultsText:"Nisu pronađene odgovarajuće stavke",loadingText:"Učitavanje..."},dataTable:{itemsPerPageText:"Redaka po stranici:",ariaLabel:{sortDescending:"Sortirano silazno.",sortAscending:"Sortirano uzlazno.",sortNone:"Nije sortirano.",activateNone:"Odaberite za uklanjanje sortiranja.",activateDescending:"Odaberite za silazno sortiranje.",activateAscending:"Odaberite za uzlazno sortiranje."},sortBy:"Sortirajte po"},dataFooter:{itemsPerPageText:"Stavki po stranici:",itemsPerPageAll:"Sve",nextPage:"Sljedeća stranica",prevPage:"Prethodna stranica",firstPage:"Prva stranica",lastPage:"Posljednja stranica",pageText:"{0}-{1} od {2}"},datePicker:{itemsSelected:"{0} odabrano",nextMonthAriaLabel:"Sljedeći mjesec",nextYearAriaLabel:"Slijedeće godine",prevMonthAriaLabel:"Prethodni mjesec",prevYearAriaLabel:"Prošla godina"},noDataText:"Nema dostupnih podataka",carousel:{prev:"Prethodno",next:"Sljedeće",ariaLabel:{delimiter:"Carousel slide {0} of {1}"}},calendar:{moreEvents:"Još {0}"},fileInput:{counter:"Odabranih datoteka: {0}",counterSize:"Odabranih datoteka: {0} ({1} ukupno)"},timePicker:{am:"AM",pm:"PM"},pagination:{ariaLabel:{wrapper:"Navigacija stranicama",next:"Sljedeća stranica",previous:"Prethodna stranica",page:"Idi na stranicu {0}",currentPage:"Trenutna stranica, stranica {0}"}},rating:{ariaLabel:{icon:"Rating {0} of {1}"}}}},"0a06":function(t,e,n){"use strict";var i=n("c532"),r=n("30b5"),s=n("f6b4"),a=n("5270"),o=n("4a7b");function l(t){this.defaults=t,this.interceptors={request:new s,response:new s}}l.prototype.request=function(t){"string"===typeof t?(t=arguments[1]||{},t.url=arguments[0]):t=t||{},t=o(this.defaults,t),t.method?t.method=t.method.toLowerCase():this.defaults.method?t.method=this.defaults.method.toLowerCase():t.method="get";var e=[a,void 0],n=Promise.resolve(t);this.interceptors.request.forEach((function(t){e.unshift(t.fulfilled,t.rejected)})),this.interceptors.response.forEach((function(t){e.push(t.fulfilled,t.rejected)}));while(e.length)n=n.then(e.shift(),e.shift());return n},l.prototype.getUri=function(t){return t=o(this.defaults,t),r(t.url,t.params,t.paramsSerializer).replace(/^\?/,"")},i.forEach(["delete","get","head","options"],(function(t){l.prototype[t]=function(e,n){return this.request(o(n||{},{method:t,url:e,data:(n||{}).data}))}})),i.forEach(["post","put","patch"],(function(t){l.prototype[t]=function(e,n,i){return this.request(o(i||{},{method:t,url:e,data:n}))}})),t.exports=l},"0b42":function(t,e,n){var i=n("861d"),r=n("e8b5"),s=n("b622"),a=s("species");t.exports=function(t){var e;return r(t)&&(e=t.constructor,"function"!=typeof e||e!==Array&&!r(e.prototype)?i(e)&&(e=e[a],null===e&&(e=void 0)):e=void 0),void 0===e?Array:e}},"0bc6":function(t,e,n){},"0c18":function(t,e,n){},"0cb2":function(t,e,n){var i=n("7b0b"),r=Math.floor,s="".replace,a=/\$([$&'`]|\d{1,2}|<[^>]*>)/g,o=/\$([$&'`]|\d{1,2})/g;t.exports=function(t,e,n,l,c,u){var h=n+t.length,d=l.length,p=o;return void 0!==c&&(c=i(c),p=a),s.call(u,p,(function(i,s){var a;switch(s.charAt(0)){case"$":return"$";case"&":return t;case"`":return e.slice(0,n);case"'":return e.slice(h);case"<":a=c[s.slice(1,-1)];break;default:var o=+s;if(0===o)return i;if(o>d){var u=r(o/10);return 0===u?i:u<=d?void 0===l[u-1]?s.charAt(1):l[u-1]+s.charAt(1):i}a=l[o-1]}return void 0===a?"":a}))}},"0cfb":function(t,e,n){var i=n("83ab"),r=n("d039"),s=n("cc12");t.exports=!i&&!r((function(){return 7!=Object.defineProperty(s("div"),"a",{get:function(){return 7}}).a}))},"0d3b":function(t,e,n){var i=n("d039"),r=n("b622"),s=n("c430"),a=r("iterator");t.exports=!i((function(){var t=new URL("b?a=1&b=2&c=3","http://a"),e=t.searchParams,n="";return t.pathname="c%20d",e.forEach((function(t,i){e["delete"]("b"),n+=i+t})),s&&!t.toJSON||!e.sort||"http://a/c%20d?a=1&c=3"!==t.href||"3"!==e.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!e[a]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("http://тест").host||"#%D0%B1"!==new URL("http://a#б").hash||"a1c3"!==n||"x"!==new URL("http://x",void 0).host}))},"0df6":function(t,e,n){"use strict";t.exports=function(t){return function(e){return t.apply(null,e)}}},"0f7c":function(t,e,n){"use strict";var i=n("688e");t.exports=Function.prototype.bind||i},"0fd9":function(t,e,n){"use strict";n("4b85");var i=n("2b0e"),r=n("d9f7"),s=n("80d2");const a=["sm","md","lg","xl"],o=["start","end","center"];function l(t,e){return a.reduce((n,i)=>(n[t+Object(s["G"])(i)]=e(),n),{})}const c=t=>[...o,"baseline","stretch"].includes(t),u=l("align",()=>({type:String,default:null,validator:c})),h=t=>[...o,"space-between","space-around"].includes(t),d=l("justify",()=>({type:String,default:null,validator:h})),p=t=>[...o,"space-between","space-around","stretch"].includes(t),f=l("alignContent",()=>({type:String,default:null,validator:p})),v={align:Object.keys(u),justify:Object.keys(d),alignContent:Object.keys(f)},g={align:"align",justify:"justify",alignContent:"align-content"};function m(t,e,n){let i=g[t];if(null!=n){if(e){const n=e.replace(t,"");i+="-"+n}return i+="-"+n,i.toLowerCase()}}const b=new Map;e["a"]=i["default"].extend({name:"v-row",functional:!0,props:{tag:{type:String,default:"div"},dense:Boolean,noGutters:Boolean,align:{type:String,default:null,validator:c},...u,justify:{type:String,default:null,validator:h},...d,alignContent:{type:String,default:null,validator:p},...f},render(t,{props:e,data:n,children:i}){let s="";for(const r in e)s+=String(e[r]);let a=b.get(s);if(!a){let t;for(t in a=[],v)v[t].forEach(n=>{const i=e[n],r=m(t,n,i);r&&a.push(r)});a.push({"no-gutters":e.noGutters,"row--dense":e.dense,["align-"+e.align]:e.align,["justify-"+e.justify]:e.justify,["align-content-"+e.alignContent]:e.alignContent}),b.set(s,a)}return t(e.tag,Object(r["a"])(n,{staticClass:"row",class:a}),i)}})},"107c":function(t,e,n){var i=n("d039");t.exports=i((function(){var t=RegExp("(?b)","string".charAt(5));return"b"!==t.exec("b").groups.a||"bc"!=="b".replace(t,"$c")}))},"10d2":function(t,e,n){"use strict";var i=n("8dd9");e["a"]=i["a"]},1148:function(t,e,n){"use strict";var i=n("a691"),r=n("577e"),s=n("1d80");t.exports=function(t){var e=r(s(this)),n="",a=i(t);if(a<0||a==1/0)throw RangeError("Wrong number of repetitions");for(;a>0;(a>>>=1)&&(e+=e))1&a&&(n+=e);return n}},1276:function(t,e,n){"use strict";var i=n("d784"),r=n("44e7"),s=n("825a"),a=n("1d80"),o=n("4840"),l=n("8aa5"),c=n("50c4"),u=n("577e"),h=n("14c3"),d=n("9263"),p=n("9f7f"),f=n("d039"),v=p.UNSUPPORTED_Y,g=[].push,m=Math.min,b=4294967295,y=!f((function(){var t=/(?:)/,e=t.exec;t.exec=function(){return e.apply(this,arguments)};var n="ab".split(t);return 2!==n.length||"a"!==n[0]||"b"!==n[1]}));i("split",(function(t,e,n){var i;return i="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(t,n){var i=u(a(this)),s=void 0===n?b:n>>>0;if(0===s)return[];if(void 0===t)return[i];if(!r(t))return e.call(i,t,s);var o,l,c,h=[],p=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),f=0,v=new RegExp(t.source,p+"g");while(o=d.call(v,i)){if(l=v.lastIndex,l>f&&(h.push(i.slice(f,o.index)),o.length>1&&o.index=s))break;v.lastIndex===o.index&&v.lastIndex++}return f===i.length?!c&&v.test("")||h.push(""):h.push(i.slice(f)),h.length>s?h.slice(0,s):h}:"0".split(void 0,0).length?function(t,n){return void 0===t&&0===n?[]:e.call(this,t,n)}:e,[function(e,n){var r=a(this),s=void 0==e?void 0:e[t];return void 0!==s?s.call(e,r,n):i.call(u(r),e,n)},function(t,r){var a=s(this),d=u(t),p=n(i,a,d,r,i!==e);if(p.done)return p.value;var f=o(a,RegExp),g=a.unicode,y=(a.ignoreCase?"i":"")+(a.multiline?"m":"")+(a.unicode?"u":"")+(v?"g":"y"),x=new f(v?"^(?:"+a.source+")":a,y),w=void 0===r?b:r>>>0;if(0===w)return[];if(0===d.length)return null===h(x,d)?[d]:[];var _=0,S=0,A=[];while(St.includes(e))}function d(t){return/^[mzlhvcsqta]\s*[-+.0-9][^mlhvzcsqta]+/i.test(t)&&/[\dz]$/i.test(t)&&t.length>4}(function(t){t["xSmall"]="12px",t["small"]="16px",t["default"]="24px",t["medium"]="28px",t["large"]="36px",t["xLarge"]="40px"})(i||(i={}));const p=Object(u["a"])(r["a"],s["a"],a["a"],o["a"]).extend({name:"v-icon",props:{dense:Boolean,disabled:Boolean,left:Boolean,right:Boolean,size:[Number,String],tag:{type:String,required:!1,default:"i"}},computed:{medium(){return!1},hasClickListener(){return Boolean(this.listeners$.click||this.listeners$["!click"])}},methods:{getIcon(){let t="";return this.$slots.default&&(t=this.$slots.default[0].text.trim()),Object(l["D"])(this,t)},getSize(){const t={xSmall:this.xSmall,small:this.small,medium:this.medium,large:this.large,xLarge:this.xLarge},e=Object(l["A"])(t).find(e=>t[e]);return e&&i[e]||Object(l["h"])(this.size)},getDefaultData(){return{staticClass:"v-icon notranslate",class:{"v-icon--disabled":this.disabled,"v-icon--left":this.left,"v-icon--link":this.hasClickListener,"v-icon--right":this.right,"v-icon--dense":this.dense},attrs:{"aria-hidden":!this.hasClickListener,disabled:this.hasClickListener&&this.disabled,type:this.hasClickListener?"button":void 0,...this.attrs$},on:this.listeners$}},getSvgWrapperData(){const t=this.getSize(),e={...this.getDefaultData(),style:t?{fontSize:t,height:t,width:t}:void 0};return this.applyColors(e),e},applyColors(t){t.class={...t.class,...this.themeClasses},this.setTextColor(this.color,t)},renderFontIcon(t,e){const n=[],i=this.getDefaultData();let r="material-icons";const s=t.indexOf("-"),a=s<=-1;a?n.push(t):(r=t.slice(0,s),h(r)&&(r="")),i.class[r]=!0,i.class[t]=!a;const o=this.getSize();return o&&(i.style={fontSize:o}),this.applyColors(i),e(this.hasClickListener?"button":this.tag,i,n)},renderSvgIcon(t,e){const n={class:"v-icon__svg",attrs:{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",role:"img","aria-hidden":!0}},i=this.getSize();return i&&(n.style={fontSize:i,height:i,width:i}),e(this.hasClickListener?"button":"span",this.getSvgWrapperData(),[e("svg",n,[e("path",{attrs:{d:t}})])])},renderSvgIconComponent(t,e){const n={class:{"v-icon__component":!0}},i=this.getSize();i&&(n.style={fontSize:i,height:i,width:i}),this.applyColors(n);const r=t.component;return n.props=t.props,n.nativeOn=n.on,e(this.hasClickListener?"button":"span",this.getSvgWrapperData(),[e(r,n)])}},render(t){const e=this.getIcon();return"string"===typeof e?d(e)?this.renderSvgIcon(e,t):this.renderFontIcon(e,t):this.renderSvgIconComponent(e,t)}});e["a"]=c["default"].extend({name:"v-icon",$_wrapperFor:p,functional:!0,render(t,{data:e,children:n}){let i="";return e.domProps&&(i=e.domProps.textContent||e.domProps.innerHTML||i,delete e.domProps.textContent,delete e.domProps.innerHTML),t(p,e,i?[i]:n)}})},"13b3":function(t,e,n){},1468:function(t,e){var n=1e3,i=60*n,r=60*i,s=24*r,a=7*s,o=365.25*s;function l(t){if(t=String(t),!(t.length>100)){var e=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(t);if(e){var l=parseFloat(e[1]),c=(e[2]||"ms").toLowerCase();switch(c){case"years":case"year":case"yrs":case"yr":case"y":return l*o;case"weeks":case"week":case"w":return l*a;case"days":case"day":case"d":return l*s;case"hours":case"hour":case"hrs":case"hr":case"h":return l*r;case"minutes":case"minute":case"mins":case"min":case"m":return l*i;case"seconds":case"second":case"secs":case"sec":case"s":return l*n;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return l;default:return}}}}function c(t){var e=Math.abs(t);return e>=s?Math.round(t/s)+"d":e>=r?Math.round(t/r)+"h":e>=i?Math.round(t/i)+"m":e>=n?Math.round(t/n)+"s":t+"ms"}function u(t){var e=Math.abs(t);return e>=s?h(t,e,s,"day"):e>=r?h(t,e,r,"hour"):e>=i?h(t,e,i,"minute"):e>=n?h(t,e,n,"second"):t+" ms"}function h(t,e,n,i){var r=e>=1.5*n;return Math.round(t/n)+" "+i+(r?"s":"")}t.exports=function(t,e){e=e||{};var n=typeof t;if("string"===n&&t.length>0)return l(t);if("number"===n&&isFinite(t))return e.long?u(t):c(t);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(t))}},"14c3":function(t,e,n){var i=n("c6b6"),r=n("9263");t.exports=function(t,e){var n=t.exec;if("function"===typeof n){var s=n.call(t,e);if("object"!==typeof s)throw TypeError("RegExp exec method returned something other than an Object or null");return s}if("RegExp"!==i(t))throw TypeError("RegExp#exec called on incompatible receiver");return r.call(t,e)}},"159b":function(t,e,n){var i=n("da84"),r=n("fdbc"),s=n("17c2"),a=n("9112");for(var o in r){var l=i[o],c=l&&l.prototype;if(c&&c.forEach!==s)try{a(c,"forEach",s)}catch(u){c.forEach=s}}},"166a":function(t,e,n){},1681:function(t,e,n){},1696:function(t,e,n){"use strict";t.exports=function(){if("function"!==typeof Symbol||"function"!==typeof Object.getOwnPropertySymbols)return!1;if("symbol"===typeof Symbol.iterator)return!0;var t={},e=Symbol("test"),n=Object(e);if("string"===typeof e)return!1;if("[object Symbol]"!==Object.prototype.toString.call(e))return!1;if("[object Symbol]"!==Object.prototype.toString.call(n))return!1;var i=42;for(e in t[e]=i,t)return!1;if("function"===typeof Object.keys&&0!==Object.keys(t).length)return!1;if("function"===typeof Object.getOwnPropertyNames&&0!==Object.getOwnPropertyNames(t).length)return!1;var r=Object.getOwnPropertySymbols(t);if(1!==r.length||r[0]!==e)return!1;if(!Object.prototype.propertyIsEnumerable.call(t,e))return!1;if("function"===typeof Object.getOwnPropertyDescriptor){var s=Object.getOwnPropertyDescriptor(t,e);if(s.value!==i||!0!==s.enumerable)return!1}return!0}},"169a":function(t,e,n){"use strict";n("368e");var i=n("480e"),r=n("4ad4"),s=n("b848"),a=n("75eb"),o=n("e707"),l=n("e4d3"),c=n("21be"),u=n("f2e7"),h=n("a293"),d=n("58df"),p=n("d9bd"),f=n("80d2");const v=Object(d["a"])(r["a"],s["a"],a["a"],o["a"],l["a"],c["a"],u["a"]);e["a"]=v.extend({name:"v-dialog",directives:{ClickOutside:h["a"]},props:{dark:Boolean,disabled:Boolean,fullscreen:Boolean,light:Boolean,maxWidth:{type:[String,Number],default:"none"},noClickAnimation:Boolean,origin:{type:String,default:"center center"},persistent:Boolean,retainFocus:{type:Boolean,default:!0},scrollable:Boolean,transition:{type:[String,Boolean],default:"dialog-transition"},width:{type:[String,Number],default:"auto"}},data(){return{activatedBy:null,animate:!1,animateTimeout:-1,isActive:!!this.value,stackMinZIndex:200,previousActiveElement:null}},computed:{classes(){return{[("v-dialog "+this.contentClass).trim()]:!0,"v-dialog--active":this.isActive,"v-dialog--persistent":this.persistent,"v-dialog--fullscreen":this.fullscreen,"v-dialog--scrollable":this.scrollable,"v-dialog--animated":this.animate}},contentClasses(){return{"v-dialog__content":!0,"v-dialog__content--active":this.isActive}},hasActivator(){return Boolean(!!this.$slots.activator||!!this.$scopedSlots.activator)}},watch:{isActive(t){var e;t?(this.show(),this.hideScroll()):(this.removeOverlay(),this.unbind(),null==(e=this.previousActiveElement)||e.focus())},fullscreen(t){this.isActive&&(t?(this.hideScroll(),this.removeOverlay(!1)):(this.showScroll(),this.genOverlay()))}},created(){this.$attrs.hasOwnProperty("full-width")&&Object(p["e"])("full-width",this)},beforeMount(){this.$nextTick(()=>{this.isBooted=this.isActive,this.isActive&&this.show()})},beforeDestroy(){"undefined"!==typeof window&&this.unbind()},methods:{animateClick(){this.animate=!1,this.$nextTick(()=>{this.animate=!0,window.clearTimeout(this.animateTimeout),this.animateTimeout=window.setTimeout(()=>this.animate=!1,150)})},closeConditional(t){const e=t.target;return!(this._isDestroyed||!this.isActive||this.$refs.content.contains(e)||this.overlay&&e&&!this.overlay.$el.contains(e))&&this.activeZIndex>=this.getMaxZIndex()},hideScroll(){this.fullscreen?document.documentElement.classList.add("overflow-y-hidden"):o["a"].options.methods.hideScroll.call(this)},show(){!this.fullscreen&&!this.hideOverlay&&this.genOverlay(),this.$nextTick(()=>{this.$nextTick(()=>{this.previousActiveElement=document.activeElement,this.$refs.content.focus(),this.bind()})})},bind(){window.addEventListener("focusin",this.onFocusin)},unbind(){window.removeEventListener("focusin",this.onFocusin)},onClickOutside(t){this.$emit("click:outside",t),this.persistent?this.noClickAnimation||this.animateClick():this.isActive=!1},onKeydown(t){if(t.keyCode===f["z"].esc&&!this.getOpenDependents().length)if(this.persistent)this.noClickAnimation||this.animateClick();else{this.isActive=!1;const t=this.getActivator();this.$nextTick(()=>t&&t.focus())}this.$emit("keydown",t)},onFocusin(t){if(!t||!this.retainFocus)return;const e=t.target;if(e&&![document,this.$refs.content].includes(e)&&!this.$refs.content.contains(e)&&this.activeZIndex>=this.getMaxZIndex()&&!this.getOpenDependentElements().some(t=>t.contains(e))){const t=this.$refs.content.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'),e=[...t].find(t=>!t.hasAttribute("disabled"));e&&e.focus()}},genContent(){return this.showLazyContent(()=>[this.$createElement(i["a"],{props:{root:!0,light:this.light,dark:this.dark}},[this.$createElement("div",{class:this.contentClasses,attrs:{role:"document",tabindex:this.isActive?0:void 0,...this.getScopeIdAttrs()},on:{keydown:this.onKeydown},style:{zIndex:this.activeZIndex},ref:"content"},[this.genTransition()])])])},genTransition(){const t=this.genInnerContent();return this.transition?this.$createElement("transition",{props:{name:this.transition,origin:this.origin,appear:!0}},[t]):t},genInnerContent(){const t={class:this.classes,ref:"dialog",directives:[{name:"click-outside",value:{handler:this.onClickOutside,closeConditional:this.closeConditional,include:this.getOpenDependentElements}},{name:"show",value:this.isActive}],style:{transformOrigin:this.origin}};return this.fullscreen||(t.style={...t.style,maxWidth:"none"===this.maxWidth?void 0:Object(f["h"])(this.maxWidth),width:"auto"===this.width?void 0:Object(f["h"])(this.width)}),this.$createElement("div",t,this.getContentSlot())}},render(t){return t("div",{staticClass:"v-dialog__container",class:{"v-dialog__container--attached":""===this.attach||!0===this.attach||"attach"===this.attach},attrs:{role:"dialog"}},[this.genActivator(),this.genContent()])}})},"16b7":function(t,e,n){"use strict";var i=n("2b0e");e["a"]=i["default"].extend().extend({name:"delayable",props:{openDelay:{type:[Number,String],default:0},closeDelay:{type:[Number,String],default:0}},data:()=>({openTimeout:void 0,closeTimeout:void 0}),methods:{clearDelay(){clearTimeout(this.openTimeout),clearTimeout(this.closeTimeout)},runDelay(t,e){this.clearDelay();const n=parseInt(this[t+"Delay"],10);this[t+"Timeout"]=setTimeout(e||(()=>{this.isActive={open:!0,close:!1}[t]}),n)}}})},"17c2":function(t,e,n){"use strict";var i=n("b727").forEach,r=n("a640"),s=r("forEach");t.exports=s?[].forEach:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}},1800:function(t,e,n){"use strict";var i=n("2b0e");e["a"]=i["default"].extend({name:"v-list-item-action",functional:!0,render(t,{data:e,children:n=[]}){e.staticClass=e.staticClass?"v-list-item__action "+e.staticClass:"v-list-item__action";const i=n.filter(t=>!1===t.isComment&&" "!==t.text);return i.length>1&&(e.staticClass+=" v-list-item__action--stack"),t("div",e,n)}})},"18a6":function(t,e,n){"use strict";n.r(e),e["default"]={badge:"Huy hiệu",close:"Đóng",dataIterator:{noResultsText:"Không tìm thấy kết quả nào",loadingText:"Đang tải..."},dataTable:{itemsPerPageText:"Số hàng mỗi trang:",ariaLabel:{sortDescending:"Sắp xếp giảm dần.",sortAscending:"Sắp xếp tăng dần.",sortNone:"Không sắp xếp.",activateNone:"Kích hoạt để bỏ sắp xếp.",activateDescending:"Kích hoạt để sắp xếp giảm dần.",activateAscending:"Kích hoạt để sắp xếp tăng dần."},sortBy:"Sắp xếp"},dataFooter:{itemsPerPageText:"Số mục mỗi trang:",itemsPerPageAll:"Toàn bộ",nextPage:"Trang tiếp theo",prevPage:"Trang trước",firstPage:"Trang đầu",lastPage:"Trang cuối",pageText:"{0}-{1} trên {2}"},datePicker:{itemsSelected:"{0} được chọn",nextMonthAriaLabel:"Tháng sau",nextYearAriaLabel:"Năm sau",prevMonthAriaLabel:"Tháng trước",prevYearAriaLabel:"Năm trước"},noDataText:"Không có dữ liệu",carousel:{prev:"Ảnh tiếp theo",next:"Ảnh trước",ariaLabel:{delimiter:"Carousel slide {0} trên {1}"}},calendar:{moreEvents:"{0} nữa"},fileInput:{counter:"{0} tệp",counterSize:"{0} tệp (tổng cộng {1})"},timePicker:{am:"SA",pm:"CH"},pagination:{ariaLabel:{wrapper:"Điều hướng phân trang",next:"Trang tiếp theo",previous:"Trang trước",page:"Đến trang {0}",currentPage:"Trang hiện tại, Trang {0}"}},rating:{ariaLabel:{icon:"Đánh giá {0} trên {1}"}}}},1902:function(t,e,n){"use strict";n.r(e),e["default"]={badge:"バッジ",close:"閉じる",dataIterator:{noResultsText:"検索結果が見つかりません。",loadingText:"項目をロード中です..."},dataTable:{itemsPerPageText:"1ページあたりの行数:",ariaLabel:{sortDescending:"降順の並び替え。",sortAscending:"昇順の並び替え。",sortNone:"ソートされていません。",activateNone:"ソートを削除するには有効にしてください。",activateDescending:"降順の並び替えのためには有効にしてください。",activateAscending:"昇順のソートのためには有効にしてください。"},sortBy:"ソート方式"},dataFooter:{itemsPerPageText:"1ページあたりの件数:",itemsPerPageAll:"すべて",nextPage:"次のページ",prevPage:"前のページ",firstPage:"最初のページ",lastPage:"最後のページ",pageText:"{0}-{1} 件目 / {2}件"},datePicker:{itemsSelected:"{0}日付選択",nextMonthAriaLabel:"来月",nextYearAriaLabel:"来年",prevMonthAriaLabel:"前月",prevYearAriaLabel:"前年"},noDataText:"データはありません。",carousel:{prev:"前のビジュアル",next:"次のビジュアル",ariaLabel:{delimiter:"カルーセルのスライド {0}件目 / {1}件"}},calendar:{moreEvents:"さらに{0}"},fileInput:{counter:"{0} ファイル",counterSize:"{0} ファイル (合計 {1})"},timePicker:{am:"AM",pm:"PM"},pagination:{ariaLabel:{wrapper:"ページネーションナビゲーション",next:"次のページ",previous:"前のページ",page:"{0}ページ目に移動",currentPage:"現在のページ、ページ {0}"}},rating:{ariaLabel:{icon:"評価 {1} のうち {0}"}}}},"19aa":function(t,e){t.exports=function(t,e,n){if(!(t instanceof e))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return t}},"1b2c":function(t,e,n){},"1b40":function(t,e,n){"use strict";n.d(e,"a",(function(){return i["b"]})),n.d(e,"b",(function(){return o})),n.d(e,"c",(function(){return h})),n.d(e,"d",(function(){return d})),n.d(e,"e",(function(){return p}));var i=n("2fe1"),r=function(){for(var t=0,e=0,n=arguments.length;e({isActive:!1,proxyClass:""}),computed:{classes(){const t={};return this.to||(this.activeClass&&(t[this.activeClass]=this.isActive),this.proxyClass&&(t[this.proxyClass]=this.isActive)),t},computedRipple(){var t;return null!=(t=this.ripple)?t:!this.disabled&&this.isClickable},isClickable(){return!this.disabled&&Boolean(this.isLink||this.$listeners.click||this.$listeners["!click"]||this.$attrs.tabindex)},isLink(){return this.to||this.href||this.link},styles:()=>({})},watch:{$route:"onRouteChange"},methods:{click(t){this.$emit("click",t)},generateRouteLink(){let t,e=this.exact;const n={attrs:{tabindex:"tabindex"in this.$attrs?this.$attrs.tabindex:void 0},class:this.classes,style:this.styles,props:{},directives:[{name:"ripple",value:this.computedRipple}],[this.to?"nativeOn":"on"]:{...this.$listeners,click:this.click},ref:"link"};if("undefined"===typeof this.exact&&(e="/"===this.to||this.to===Object(this.to)&&"/"===this.to.path),this.to){let i=this.activeClass,r=this.exactActiveClass||i;this.proxyClass&&(i=`${i} ${this.proxyClass}`.trim(),r=`${r} ${this.proxyClass}`.trim()),t=this.nuxt?"nuxt-link":"router-link",Object.assign(n.props,{to:this.to,exact:e,exactPath:this.exactPath,activeClass:i,exactActiveClass:r,append:this.append,replace:this.replace})}else t=(this.href?"a":this.tag)||"div","a"===t&&this.href&&(n.attrs.href=this.href);return this.target&&(n.attrs.target=this.target),{tag:t,data:n}},onRouteChange(){if(!this.to||!this.$refs.link||!this.$route)return;const t=`${this.activeClass} ${this.proxyClass||""}`.trim(),e="_vnode.data.class."+t;this.$nextTick(()=>{Object(s["q"])(this.$refs.link,e)&&this.toggle()})},toggle:()=>{}}})},"1cdc":function(t,e,n){var i=n("342f");t.exports=/(?:iphone|ipod|ipad).*applewebkit/i.test(i)},"1d2b":function(t,e,n){"use strict";t.exports=function(t,e){return function(){for(var n=new Array(arguments.length),i=0;i=51||!i((function(){var e=[],n=e.constructor={};return n[a]=function(){return{foo:1}},1!==e[t](Boolean).foo}))}},"1f11":function(t,e,n){"use strict";n.r(e);var i=n("4428");n.d(e,"af",(function(){return i["default"]}));var r=n("4720");n.d(e,"ar",(function(){return r["default"]}));var s=n("3bd4");n.d(e,"bg",(function(){return s["default"]}));var a=n("a8de");n.d(e,"ca",(function(){return a["default"]}));var o=n("ef60");n.d(e,"ckb",(function(){return o["default"]}));var l=n("83af");n.d(e,"cs",(function(){return l["default"]}));var c=n("8e29");n.d(e,"de",(function(){return c["default"]}));var u=n("98c0");n.d(e,"el",(function(){return u["default"]}));var h=n("4b41");n.d(e,"en",(function(){return h["default"]}));var d=n("f950");n.d(e,"es",(function(){return d["default"]}));var p=n("ead6");n.d(e,"et",(function(){return p["default"]}));var f=n("03fd");n.d(e,"fa",(function(){return f["default"]}));var v=n("43a3");n.d(e,"fi",(function(){return v["default"]}));var g=n("ea1f");n.d(e,"fr",(function(){return g["default"]}));var m=n("0924");n.d(e,"hr",(function(){return m["default"]}));var b=n("573e");n.d(e,"hu",(function(){return b["default"]}));var y=n("131b");n.d(e,"he",(function(){return y["default"]}));var x=n("6dfc");n.d(e,"id",(function(){return x["default"]}));var w=n("c2a1");n.d(e,"it",(function(){return w["default"]}));var _=n("1902");n.d(e,"ja",(function(){return _["default"]}));var S=n("f5e4");n.d(e,"ko",(function(){return S["default"]}));var A=n("07ae");n.d(e,"lv",(function(){return A["default"]}));var k=n("e184");n.d(e,"lt",(function(){return k["default"]}));var C=n("4642");n.d(e,"nl",(function(){return C["default"]}));var O=n("800a");n.d(e,"no",(function(){return O["default"]}));var $=n("7597");n.d(e,"pl",(function(){return $["default"]}));var P=n("df7f");n.d(e,"pt",(function(){return P["default"]}));var j=n("fa37");n.d(e,"ro",(function(){return j["default"]}));var I=n("0879");n.d(e,"ru",(function(){return I["default"]}));var L=n("b854");n.d(e,"sk",(function(){return L["default"]}));var T=n("ae0b");n.d(e,"sl",(function(){return T["default"]}));var E=n("af68");n.d(e,"srCyrl",(function(){return E["default"]}));var M=n("5a1b");n.d(e,"srLatn",(function(){return M["default"]}));var B=n("035c");n.d(e,"sv",(function(){return B["default"]}));var D=n("aef1");n.d(e,"th",(function(){return D["default"]}));var N=n("659a");n.d(e,"tr",(function(){return N["default"]}));var R=n("64dc");n.d(e,"az",(function(){return R["default"]}));var z=n("ea76");n.d(e,"uk",(function(){return z["default"]}));var F=n("18a6");n.d(e,"vi",(function(){return F["default"]}));var V=n("25a2");n.d(e,"zhHans",(function(){return V["default"]}));var H=n("582c");n.d(e,"zhHant",(function(){return H["default"]}))},"20f6":function(t,e,n){},"21be":function(t,e,n){"use strict";var i=n("2b0e"),r=n("80d2");e["a"]=i["default"].extend().extend({name:"stackable",data(){return{stackElement:null,stackExclude:null,stackMinZIndex:0,isActive:!1}},computed:{activeZIndex(){if("undefined"===typeof window)return 0;const t=this.stackElement||this.$refs.content,e=this.isActive?this.getMaxZIndex(this.stackExclude||[t])+2:Object(r["v"])(t);return null==e?e:parseInt(e)}},methods:{getMaxZIndex(t=[]){const e=this.$el,n=[this.stackMinZIndex,Object(r["v"])(e)],i=[...document.getElementsByClassName("v-menu__content--active"),...document.getElementsByClassName("v-dialog__content--active")];for(let s=0;sd;d++)if(f=S(t[d]),f&&f instanceof c)return f;return new c(!1)}u=h.call(t)}v=u.next;while(!(g=v.call(u)).done){try{f=S(g.value)}catch(A){throw l(u),A}if("object"==typeof f&&f&&f instanceof c)return f}return new c(!1)}},"22da":function(t,e,n){"use strict";var i=n("490a");e["a"]=i["a"]},"23a7":function(t,e,n){"use strict";n("5803");var i=n("2677"),r=n("cc20"),s=n("80d2"),a=n("d9bd"),o=n("d9f7");e["a"]=i["a"].extend({name:"v-file-input",model:{prop:"value",event:"change"},props:{chips:Boolean,clearable:{type:Boolean,default:!0},counterSizeString:{type:String,default:"$vuetify.fileInput.counterSize"},counterString:{type:String,default:"$vuetify.fileInput.counter"},hideInput:Boolean,multiple:Boolean,placeholder:String,prependIcon:{type:String,default:"$file"},readonly:{type:Boolean,default:!1},showSize:{type:[Boolean,Number],default:!1,validator:t=>"boolean"===typeof t||[1e3,1024].includes(t)},smallChips:Boolean,truncateLength:{type:[Number,String],default:22},type:{type:String,default:"file"},value:{default:void 0,validator:t=>Object(s["H"])(t).every(t=>null!=t&&"object"===typeof t)}},computed:{classes(){return{...i["a"].options.computed.classes.call(this),"v-file-input":!0}},computedCounterValue(){const t=this.multiple&&this.lazyValue?this.lazyValue.length:this.lazyValue instanceof File?1:0;if(!this.showSize)return this.$vuetify.lang.t(this.counterString,t);const e=this.internalArrayValue.reduce((t,{size:e=0})=>t+e,0);return this.$vuetify.lang.t(this.counterSizeString,t,Object(s["x"])(e,1024===this.base))},internalArrayValue(){return Object(s["H"])(this.internalValue)},internalValue:{get(){return this.lazyValue},set(t){this.lazyValue=t,this.$emit("change",this.lazyValue)}},isDirty(){return this.internalArrayValue.length>0},isLabelActive(){return this.isDirty},text(){return this.isDirty||!this.isFocused&&this.hasLabel?this.internalArrayValue.map(t=>{const{name:e="",size:n=0}=t,i=this.truncateText(e);return this.showSize?`${i} (${Object(s["x"])(n,1024===this.base)})`:i}):[this.placeholder]},base(){return"boolean"!==typeof this.showSize?this.showSize:void 0},hasChips(){return this.chips||this.smallChips}},watch:{readonly:{handler(t){!0===t&&Object(a["b"])("readonly is not supported on ",this)},immediate:!0},value(t){const e=this.multiple?t:t?[t]:[];Object(s["k"])(e,this.$refs.input.files)||(this.$refs.input.value="")}},methods:{clearableCallback(){this.internalValue=this.multiple?[]:null,this.$refs.input.value=""},genChips(){return this.isDirty?this.text.map((t,e)=>this.$createElement(r["a"],{props:{small:this.smallChips},on:{"click:close":()=>{const t=this.internalValue;t.splice(e,1),this.internalValue=t}}},[t])):[]},genControl(){const t=i["a"].options.methods.genControl.call(this);return this.hideInput&&(t.data.style=Object(o["c"])(t.data.style,{display:"none"})),t},genInput(){const t=i["a"].options.methods.genInput.call(this);return t.data.attrs.multiple=this.multiple,delete t.data.domProps.value,delete t.data.on.input,t.data.on.change=this.onInput,[this.genSelections(),t]},genPrependSlot(){if(!this.prependIcon)return null;const t=this.genIcon("prepend",()=>{this.$refs.input.click()});return this.genSlot("prepend","outer",[t])},genSelectionText(){const t=this.text.length;return t<2?this.text:this.showSize&&!this.counter?[this.computedCounterValue]:[this.$vuetify.lang.t(this.counterString,t)]},genSelections(){const t=[];return this.isDirty&&this.$scopedSlots.selection?this.internalArrayValue.forEach((e,n)=>{this.$scopedSlots.selection&&t.push(this.$scopedSlots.selection({text:this.text[n],file:e,index:n}))}):t.push(this.hasChips&&this.isDirty?this.genChips():this.genSelectionText()),this.$createElement("div",{staticClass:"v-file-input__text",class:{"v-file-input__text--placeholder":this.placeholder&&!this.isDirty,"v-file-input__text--chips":this.hasChips&&!this.$scopedSlots.selection}},t)},genTextFieldSlot(){const t=i["a"].options.methods.genTextFieldSlot.call(this);return t.data.on={...t.data.on||{},click:()=>this.$refs.input.click()},t},onInput(t){const e=[...t.target.files||[]];this.internalValue=this.multiple?e:e[0],this.initialValue=this.internalValue},onKeyDown(t){this.$emit("keydown",t)},truncateText(t){if(t.length=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};i.forEach(["delete","get","head"],(function(t){l.headers[t]={}})),i.forEach(["post","put","patch"],(function(t){l.headers[t]=i.merge(s)})),t.exports=l}).call(this,n("4362"))},"24b2":function(t,e,n){"use strict";var i=n("80d2"),r=n("2b0e");e["a"]=r["default"].extend({name:"measurable",props:{height:[Number,String],maxHeight:[Number,String],maxWidth:[Number,String],minHeight:[Number,String],minWidth:[Number,String],width:[Number,String]},computed:{measurableStyles(){const t={},e=Object(i["h"])(this.height),n=Object(i["h"])(this.minHeight),r=Object(i["h"])(this.minWidth),s=Object(i["h"])(this.maxHeight),a=Object(i["h"])(this.maxWidth),o=Object(i["h"])(this.width);return e&&(t.height=e),n&&(t.minHeight=n),r&&(t.minWidth=r),s&&(t.maxHeight=s),a&&(t.maxWidth=a),o&&(t.width=o),t}}})},"24e2":function(t,e,n){"use strict";var i=n("e0c7");e["a"]=i["a"]},2532:function(t,e,n){"use strict";var i=n("23e7"),r=n("5a34"),s=n("1d80"),a=n("577e"),o=n("ab13");i({target:"String",proto:!0,forced:!o("includes")},{includes:function(t){return!!~a(s(this)).indexOf(a(r(t)),arguments.length>1?arguments[1]:void 0)}})},"25a2":function(t,e,n){"use strict";n.r(e),e["default"]={badge:"徽章",close:"关闭",dataIterator:{noResultsText:"没有符合条件的结果",loadingText:"加载中……"},dataTable:{itemsPerPageText:"每页数目:",ariaLabel:{sortDescending:":降序排列。",sortAscending:":升序排列。",sortNone:":未排序。",activateNone:"点击以移除排序。",activateDescending:"点击以降序排列。",activateAscending:"点击以升序排列。"},sortBy:"排序方式"},dataFooter:{itemsPerPageText:"每页数目:",itemsPerPageAll:"全部",nextPage:"下一页",prevPage:"上一页",firstPage:"首页",lastPage:"尾页",pageText:"{0}-{1} 共 {2}"},datePicker:{itemsSelected:"已选择 {0}",nextMonthAriaLabel:"下个月",nextYearAriaLabel:"明年",prevMonthAriaLabel:"前一个月",prevYearAriaLabel:"前一年"},noDataText:"没有数据",carousel:{prev:"上一张",next:"下一张",ariaLabel:{delimiter:"Carousel slide {0} of {1}"}},calendar:{moreEvents:"还有 {0} 项"},fileInput:{counter:"{0} 个文件",counterSize:"{0} 个文件(共 {1})"},timePicker:{am:"AM",pm:"PM"},pagination:{ariaLabel:{wrapper:"分页导航",next:"下一页",previous:"上一页",page:"转到页面 {0}",currentPage:"当前页 {0}"}},rating:{ariaLabel:{icon:"Rating {0} of {1}"}}}},"25a8":function(t,e,n){},"25f0":function(t,e,n){"use strict";var i=n("6eeb"),r=n("825a"),s=n("577e"),a=n("d039"),o=n("ad6d"),l="toString",c=RegExp.prototype,u=c[l],h=a((function(){return"/a/b"!=u.call({source:"a",flags:"b"})})),d=u.name!=l;(h||d)&&i(RegExp.prototype,l,(function(){var t=r(this),e=s(t.source),n=t.flags,i=s(void 0===n&&t instanceof RegExp&&!("flags"in c)?o.call(t):n);return"/"+e+"/"+i}),{unsafe:!0})},2626:function(t,e,n){"use strict";var i=n("d066"),r=n("9bf2"),s=n("b622"),a=n("83ab"),o=s("species");t.exports=function(t){var e=i(t),n=r.f;a&&e&&!e[o]&&n(e,o,{configurable:!0,get:function(){return this}})}},"262e":function(t,e,n){"use strict";n.d(e,"a",(function(){return r}));n("131a");function i(t,e){return i=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t},i(t,e)}function r(t,e){if("function"!==typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&&i(t,e)}},2677:function(t,e,n){"use strict";var i=n("8654");e["a"]=i["a"]},2877:function(t,e,n){"use strict";function i(t,e,n,i,r,s,a,o){var l,c="function"===typeof t?t.options:t;if(e&&(c.render=e,c.staticRenderFns=n,c._compiled=!0),i&&(c.functional=!0),s&&(c._scopeId="data-v-"+s),a?(l=function(t){t=t||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,t||"undefined"===typeof __VUE_SSR_CONTEXT__||(t=__VUE_SSR_CONTEXT__),r&&r.call(this,t),t&&t._registeredComponents&&t._registeredComponents.add(a)},c._ssrRegister=l):r&&(l=o?function(){r.call(this,(c.functional?this.parent:this).$root.$options.shadowRoot)}:r),l)if(c.functional){c._injectStyles=l;var u=c.render;c.render=function(t,e){return l.call(e),u(t,e)}}else{var h=c.beforeCreate;c.beforeCreate=h?[].concat(h,l):[l]}return{exports:t,options:c}}n.d(e,"a",(function(){return i}))},"288a":function(t,e,n){"use strict";var i=n("d024"),r=n("d96e"),s=n("a0d3"),a=n("ca9f"),o=function(t){r(!1,t)},l=String.prototype.replace,c=String.prototype.split,u="||||",h=function(t){var e=t%100,n=e%10;return 11!==e&&1===n?0:2<=n&&n<=4&&!(e>=12&&e<=14)?1:2},d={pluralTypes:{arabic:function(t){if(t<3)return t;var e=t%100;return e>=3&&e<=10?3:e>=11?4:5},bosnian_serbian:h,chinese:function(){return 0},croatian:h,french:function(t){return t>1?1:0},german:function(t){return 1!==t?1:0},russian:h,lithuanian:function(t){return t%10===1&&t%100!==11?0:t%10>=2&&t%10<=9&&(t%100<11||t%100>19)?1:2},czech:function(t){return 1===t?0:t>=2&&t<=4?1:2},polish:function(t){if(1===t)return 0;var e=t%10;return 2<=e&&e<=4&&(t%100<10||t%100>=20)?1:2},icelandic:function(t){return t%10!==1||t%100===11?1:0},slovenian:function(t){var e=t%100;return 1===e?0:2===e?1:3===e||4===e?2:3}},pluralTypeToLanguages:{arabic:["ar"],bosnian_serbian:["bs-Latn-BA","bs-Cyrl-BA","srl-RS","sr-RS"],chinese:["id","id-ID","ja","ko","ko-KR","lo","ms","th","th-TH","zh"],croatian:["hr","hr-HR"],german:["fa","da","de","en","es","fi","el","he","hi-IN","hu","hu-HU","it","nl","no","pt","sv","tr"],french:["fr","tl","pt-br"],russian:["ru","ru-RU"],lithuanian:["lt"],czech:["cs","cs-CZ","sk"],polish:["pl"],icelandic:["is"],slovenian:["sl-SL"]}};function p(t){var e={};return i(t,(function(t,n){i(t,(function(t){e[t]=n}))})),e}function f(t,e){var n=p(t.pluralTypeToLanguages);return n[e]||n[c.call(e,/-/,1)[0]]||n.en}function v(t,e,n){return t.pluralTypes[f(t,e)](n)}function g(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function m(t){var e=t&&t.prefix||"%{",n=t&&t.suffix||"}";if(e===u||n===u)throw new RangeError('"'+u+'" token is reserved for pluralization');return new RegExp(g(e)+"(.*?)"+g(n),"g")}var b=/%\{(.*?)\}/g;function y(t,e,n,i,r){if("string"!==typeof t)throw new TypeError("Polyglot.transformPhrase expects argument #1 to be string");if(null==e)return t;var o=t,h=i||b,p=r||d,f="number"===typeof e?{smart_count:e}:e;if(null!=f.smart_count&&o){var g=c.call(o,u);o=a(g[v(p,n||"en",f.smart_count)]||g[0])}return o=l.call(o,h,(function(t,e){return s(f,e)&&null!=f[e]?f[e]:t})),o}function x(t){var e=t||{};this.phrases={},this.extend(e.phrases||{}),this.currentLocale=e.locale||"en";var n=e.allowMissing?y:null;this.onMissingKey="function"===typeof e.onMissingKey?e.onMissingKey:n,this.warn=e.warn||o,this.tokenRegex=m(e.interpolation),this.pluralRules=e.pluralRules||d}x.prototype.locale=function(t){return t&&(this.currentLocale=t),this.currentLocale},x.prototype.extend=function(t,e){i(t,(function(t,n){var i=e?e+"."+n:n;"object"===typeof t?this.extend(t,i):this.phrases[i]=t}),this)},x.prototype.unset=function(t,e){"string"===typeof t?delete this.phrases[t]:i(t,(function(t,n){var i=e?e+"."+n:n;"object"===typeof t?this.unset(t,i):delete this.phrases[i]}),this)},x.prototype.clear=function(){this.phrases={}},x.prototype.replace=function(t){this.clear(),this.extend(t)},x.prototype.t=function(t,e){var n,i,r=null==e?{}:e;if("string"===typeof this.phrases[t])n=this.phrases[t];else if("string"===typeof r._)n=r._;else if(this.onMissingKey){var s=this.onMissingKey;i=s(t,r,this.currentLocale,this.tokenRegex,this.pluralRules)}else this.warn('Missing translation for key: "'+t+'"'),i=t;return"string"===typeof n&&(i=y(n,r,this.currentLocale,this.tokenRegex,this.pluralRules)),i},x.prototype.has=function(t){return s(this.phrases,t)},x.transformPhrase=function(t,e,n){return y(t,e,n)},t.exports=x},"288c":function(t,e,n){"use strict";n("d0cd");var i=n("169a");e["a"]=i["a"].extend({name:"v-bottom-sheet",props:{inset:Boolean,maxWidth:{type:[String,Number],default:"auto"},transition:{type:String,default:"bottom-sheet-transition"}},computed:{classes(){return{...i["a"].options.computed.classes.call(this),"v-bottom-sheet":!0,"v-bottom-sheet--inset":this.inset}}}})},2909:function(t,e,n){"use strict";n.d(e,"a",(function(){return l}));var i=n("6b75");function r(t){if(Array.isArray(t))return Object(i["a"])(t)}n("a4d3"),n("e01a"),n("d3b7"),n("d28b"),n("3ca3"),n("ddb0"),n("a630");function s(t){if("undefined"!==typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}var a=n("06c5");function o(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function l(t){return r(t)||s(t)||Object(a["a"])(t)||o()}},"297c":function(t,e,n){"use strict";var i=n("2b0e"),r=n("37c6");e["a"]=i["default"].extend().extend({name:"loadable",props:{loading:{type:[Boolean,String],default:!1},loaderHeight:{type:[Number,String],default:2}},methods:{genProgress(){return!1===this.loading?null:this.$slots.progress||this.$createElement(r["a"],{props:{absolute:!0,color:!0===this.loading||""===this.loading?this.color||"primary":this.loading,height:this.loaderHeight,indeterminate:!0}})}}})},"2a62":function(t,e,n){var i=n("825a");t.exports=function(t){var e=t["return"];if(void 0!==e)return i(e.call(t)).value}},"2a7f":function(t,e,n){"use strict";n.d(e,"a",(function(){return s}));var i=n("71d9"),r=n("80d2");const s=Object(r["j"])("v-toolbar__title"),a=Object(r["j"])("v-toolbar__items");i["a"]},"2b0e":function(t,e,n){"use strict";n.r(e),function(t){ -/*! - * Vue.js v2.6.14 - * (c) 2014-2021 Evan You - * Released under the MIT License. - */ -var n=Object.freeze({});function i(t){return void 0===t||null===t}function r(t){return void 0!==t&&null!==t}function s(t){return!0===t}function a(t){return!1===t}function o(t){return"string"===typeof t||"number"===typeof t||"symbol"===typeof t||"boolean"===typeof t}function l(t){return null!==t&&"object"===typeof t}var c=Object.prototype.toString;function u(t){return"[object Object]"===c.call(t)}function h(t){return"[object RegExp]"===c.call(t)}function d(t){var e=parseFloat(String(t));return e>=0&&Math.floor(e)===e&&isFinite(t)}function p(t){return r(t)&&"function"===typeof t.then&&"function"===typeof t.catch}function f(t){return null==t?"":Array.isArray(t)||u(t)&&t.toString===c?JSON.stringify(t,null,2):String(t)}function v(t){var e=parseFloat(t);return isNaN(e)?t:e}function g(t,e){for(var n=Object.create(null),i=t.split(","),r=0;r-1)return t.splice(n,1)}}var y=Object.prototype.hasOwnProperty;function x(t,e){return y.call(t,e)}function w(t){var e=Object.create(null);return function(n){var i=e[n];return i||(e[n]=t(n))}}var _=/-(\w)/g,S=w((function(t){return t.replace(_,(function(t,e){return e?e.toUpperCase():""}))})),A=w((function(t){return t.charAt(0).toUpperCase()+t.slice(1)})),k=/\B([A-Z])/g,C=w((function(t){return t.replace(k,"-$1").toLowerCase()}));function O(t,e){function n(n){var i=arguments.length;return i?i>1?t.apply(e,arguments):t.call(e,n):t.call(e)}return n._length=t.length,n}function $(t,e){return t.bind(e)}var P=Function.prototype.bind?$:O;function j(t,e){e=e||0;var n=t.length-e,i=new Array(n);while(n--)i[n]=t[n+e];return i}function I(t,e){for(var n in e)t[n]=e[n];return t}function L(t){for(var e={},n=0;n0,nt=Q&&Q.indexOf("edge/")>0,it=(Q&&Q.indexOf("android"),Q&&/iphone|ipad|ipod|ios/.test(Q)||"ios"===J),rt=(Q&&/chrome\/\d+/.test(Q),Q&&/phantomjs/.test(Q),Q&&Q.match(/firefox\/(\d+)/)),st={}.watch,at=!1;if(Z)try{var ot={};Object.defineProperty(ot,"passive",{get:function(){at=!0}}),window.addEventListener("test-passive",null,ot)}catch(Sa){}var lt=function(){return void 0===G&&(G=!Z&&!X&&"undefined"!==typeof t&&(t["process"]&&"server"===t["process"].env.VUE_ENV)),G},ct=Z&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function ut(t){return"function"===typeof t&&/native code/.test(t.toString())}var ht,dt="undefined"!==typeof Symbol&&ut(Symbol)&&"undefined"!==typeof Reflect&&ut(Reflect.ownKeys);ht="undefined"!==typeof Set&&ut(Set)?Set:function(){function t(){this.set=Object.create(null)}return t.prototype.has=function(t){return!0===this.set[t]},t.prototype.add=function(t){this.set[t]=!0},t.prototype.clear=function(){this.set=Object.create(null)},t}();var pt=T,ft=0,vt=function(){this.id=ft++,this.subs=[]};vt.prototype.addSub=function(t){this.subs.push(t)},vt.prototype.removeSub=function(t){b(this.subs,t)},vt.prototype.depend=function(){vt.target&&vt.target.addDep(this)},vt.prototype.notify=function(){var t=this.subs.slice();for(var e=0,n=t.length;e-1)if(s&&!x(r,"default"))a=!1;else if(""===a||a===C(t)){var l=ee(String,r.type);(l<0||o0&&(a=$e(a,(e||"")+"_"+n),Oe(a[0])&&Oe(c)&&(u[l]=_t(c.text+a[0].text),a.shift()),u.push.apply(u,a)):o(a)?Oe(c)?u[l]=_t(c.text+a):""!==a&&u.push(_t(a)):Oe(a)&&Oe(c)?u[l]=_t(c.text+a.text):(s(t._isVList)&&r(a.tag)&&i(a.key)&&r(e)&&(a.key="__vlist"+e+"_"+n+"__"),u.push(a)));return u}function Pe(t){var e=t.$options.provide;e&&(t._provided="function"===typeof e?e.call(t):e)}function je(t){var e=Ie(t.$options.inject,t);e&&(Pt(!1),Object.keys(e).forEach((function(n){Et(t,n,e[n])})),Pt(!0))}function Ie(t,e){if(t){for(var n=Object.create(null),i=dt?Reflect.ownKeys(t):Object.keys(t),r=0;r0,a=t?!!t.$stable:!s,o=t&&t.$key;if(t){if(t._normalized)return t._normalized;if(a&&i&&i!==n&&o===i.$key&&!s&&!i.$hasNormal)return i;for(var l in r={},t)t[l]&&"$"!==l[0]&&(r[l]=Be(e,l,t[l]))}else r={};for(var c in e)c in r||(r[c]=De(e,c));return t&&Object.isExtensible(t)&&(t._normalized=r),U(r,"$stable",a),U(r,"$key",o),U(r,"$hasNormal",s),r}function Be(t,e,n){var i=function(){var t=arguments.length?n.apply(null,arguments):n({});t=t&&"object"===typeof t&&!Array.isArray(t)?[t]:Ce(t);var e=t&&t[0];return t&&(!e||1===t.length&&e.isComment&&!Ee(e))?void 0:t};return n.proxy&&Object.defineProperty(t,e,{get:i,enumerable:!0,configurable:!0}),i}function De(t,e){return function(){return t[e]}}function Ne(t,e){var n,i,s,a,o;if(Array.isArray(t)||"string"===typeof t)for(n=new Array(t.length),i=0,s=t.length;i1?j(n):n;for(var i=j(arguments,1),r='event handler for "'+t+'"',s=0,a=n.length;sdocument.createEvent("Event").timeStamp&&(Kn=function(){return Zn.now()})}function Xn(){var t,e;for(Gn=Kn(),Un=!0,Fn.sort((function(t,e){return t.id-e.id})),qn=0;qnqn&&Fn[n].id>t.id)n--;Fn.splice(n+1,0,t)}else Fn.push(t);Wn||(Wn=!0,ve(Xn))}}var ni=0,ii=function(t,e,n,i,r){this.vm=t,r&&(t._watcher=this),t._watchers.push(this),i?(this.deep=!!i.deep,this.user=!!i.user,this.lazy=!!i.lazy,this.sync=!!i.sync,this.before=i.before):this.deep=this.user=this.lazy=this.sync=!1,this.cb=n,this.id=++ni,this.active=!0,this.dirty=this.lazy,this.deps=[],this.newDeps=[],this.depIds=new ht,this.newDepIds=new ht,this.expression="","function"===typeof e?this.getter=e:(this.getter=Y(e),this.getter||(this.getter=T)),this.value=this.lazy?void 0:this.get()};ii.prototype.get=function(){var t;mt(this);var e=this.vm;try{t=this.getter.call(e,e)}catch(Sa){if(!this.user)throw Sa;ne(Sa,e,'getter for watcher "'+this.expression+'"')}finally{this.deep&&me(t),bt(),this.cleanupDeps()}return t},ii.prototype.addDep=function(t){var e=t.id;this.newDepIds.has(e)||(this.newDepIds.add(e),this.newDeps.push(t),this.depIds.has(e)||t.addSub(this))},ii.prototype.cleanupDeps=function(){var t=this.deps.length;while(t--){var e=this.deps[t];this.newDepIds.has(e.id)||e.removeSub(this)}var n=this.depIds;this.depIds=this.newDepIds,this.newDepIds=n,this.newDepIds.clear(),n=this.deps,this.deps=this.newDeps,this.newDeps=n,this.newDeps.length=0},ii.prototype.update=function(){this.lazy?this.dirty=!0:this.sync?this.run():ei(this)},ii.prototype.run=function(){if(this.active){var t=this.get();if(t!==this.value||l(t)||this.deep){var e=this.value;if(this.value=t,this.user){var n='callback for watcher "'+this.expression+'"';ie(this.cb,this.vm,[t,e],this.vm,n)}else this.cb.call(this.vm,t,e)}}},ii.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},ii.prototype.depend=function(){var t=this.deps.length;while(t--)this.deps[t].depend()},ii.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||b(this.vm._watchers,this);var t=this.deps.length;while(t--)this.deps[t].removeSub(this);this.active=!1}};var ri={enumerable:!0,configurable:!0,get:T,set:T};function si(t,e,n){ri.get=function(){return this[e][n]},ri.set=function(t){this[e][n]=t},Object.defineProperty(t,n,ri)}function ai(t){t._watchers=[];var e=t.$options;e.props&&oi(t,e.props),e.methods&&vi(t,e.methods),e.data?li(t):Tt(t._data={},!0),e.computed&&hi(t,e.computed),e.watch&&e.watch!==st&&gi(t,e.watch)}function oi(t,e){var n=t.$options.propsData||{},i=t._props={},r=t.$options._propKeys=[],s=!t.$parent;s||Pt(!1);var a=function(s){r.push(s);var a=Zt(s,e,n,t);Et(i,s,a),s in t||si(t,"_props",s)};for(var o in e)a(o);Pt(!0)}function li(t){var e=t.$options.data;e=t._data="function"===typeof e?ci(e,t):e||{},u(e)||(e={});var n=Object.keys(e),i=t.$options.props,r=(t.$options.methods,n.length);while(r--){var s=n[r];0,i&&x(i,s)||W(s)||si(t,"_data",s)}Tt(e,!0)}function ci(t,e){mt();try{return t.call(e,e)}catch(Sa){return ne(Sa,e,"data()"),{}}finally{bt()}}var ui={lazy:!0};function hi(t,e){var n=t._computedWatchers=Object.create(null),i=lt();for(var r in e){var s=e[r],a="function"===typeof s?s:s.get;0,i||(n[r]=new ii(t,a||T,T,ui)),r in t||di(t,r,s)}}function di(t,e,n){var i=!lt();"function"===typeof n?(ri.get=i?pi(e):fi(n),ri.set=T):(ri.get=n.get?i&&!1!==n.cache?pi(e):fi(n.get):T,ri.set=n.set||T),Object.defineProperty(t,e,ri)}function pi(t){return function(){var e=this._computedWatchers&&this._computedWatchers[t];if(e)return e.dirty&&e.evaluate(),vt.target&&e.depend(),e.value}}function fi(t){return function(){return t.call(this,this)}}function vi(t,e){t.$options.props;for(var n in e)t[n]="function"!==typeof e[n]?T:P(e[n],t)}function gi(t,e){for(var n in e){var i=e[n];if(Array.isArray(i))for(var r=0;r-1)return this;var n=j(arguments,1);return n.unshift(this),"function"===typeof t.install?t.install.apply(t,n):"function"===typeof t&&t.apply(null,n),e.push(t),this}}function Ci(t){t.mixin=function(t){return this.options=Gt(this.options,t),this}}function Oi(t){t.cid=0;var e=1;t.extend=function(t){t=t||{};var n=this,i=n.cid,r=t._Ctor||(t._Ctor={});if(r[i])return r[i];var s=t.name||n.options.name;var a=function(t){this._init(t)};return a.prototype=Object.create(n.prototype),a.prototype.constructor=a,a.cid=e++,a.options=Gt(n.options,t),a["super"]=n,a.options.props&&$i(a),a.options.computed&&Pi(a),a.extend=n.extend,a.mixin=n.mixin,a.use=n.use,z.forEach((function(t){a[t]=n[t]})),s&&(a.options.components[s]=a),a.superOptions=n.options,a.extendOptions=t,a.sealedOptions=I({},a.options),r[i]=a,a}}function $i(t){var e=t.options.props;for(var n in e)si(t.prototype,"_props",n)}function Pi(t){var e=t.options.computed;for(var n in e)di(t.prototype,n,e[n])}function ji(t){z.forEach((function(e){t[e]=function(t,n){return n?("component"===e&&u(n)&&(n.name=n.name||t,n=this.options._base.extend(n)),"directive"===e&&"function"===typeof n&&(n={bind:n,update:n}),this.options[e+"s"][t]=n,n):this.options[e+"s"][t]}}))}function Ii(t){return t&&(t.Ctor.options.name||t.tag)}function Li(t,e){return Array.isArray(t)?t.indexOf(e)>-1:"string"===typeof t?t.split(",").indexOf(e)>-1:!!h(t)&&t.test(e)}function Ti(t,e){var n=t.cache,i=t.keys,r=t._vnode;for(var s in n){var a=n[s];if(a){var o=a.name;o&&!e(o)&&Ei(n,s,i,r)}}}function Ei(t,e,n,i){var r=t[e];!r||i&&r.tag===i.tag||r.componentInstance.$destroy(),t[e]=null,b(n,e)}xi(Ai),bi(Ai),jn(Ai),En(Ai),xn(Ai);var Mi=[String,RegExp,Array],Bi={name:"keep-alive",abstract:!0,props:{include:Mi,exclude:Mi,max:[String,Number]},methods:{cacheVNode:function(){var t=this,e=t.cache,n=t.keys,i=t.vnodeToCache,r=t.keyToCache;if(i){var s=i.tag,a=i.componentInstance,o=i.componentOptions;e[r]={name:Ii(o),tag:s,componentInstance:a},n.push(r),this.max&&n.length>parseInt(this.max)&&Ei(e,n[0],n,this._vnode),this.vnodeToCache=null}}},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var t in this.cache)Ei(this.cache,t,this.keys)},mounted:function(){var t=this;this.cacheVNode(),this.$watch("include",(function(e){Ti(t,(function(t){return Li(e,t)}))})),this.$watch("exclude",(function(e){Ti(t,(function(t){return!Li(e,t)}))}))},updated:function(){this.cacheVNode()},render:function(){var t=this.$slots.default,e=An(t),n=e&&e.componentOptions;if(n){var i=Ii(n),r=this,s=r.include,a=r.exclude;if(s&&(!i||!Li(s,i))||a&&i&&Li(a,i))return e;var o=this,l=o.cache,c=o.keys,u=null==e.key?n.Ctor.cid+(n.tag?"::"+n.tag:""):e.key;l[u]?(e.componentInstance=l[u].componentInstance,b(c,u),c.push(u)):(this.vnodeToCache=e,this.keyToCache=u),e.data.keepAlive=!0}return e||t&&t[0]}},Di={KeepAlive:Bi};function Ni(t){var e={get:function(){return V}};Object.defineProperty(t,"config",e),t.util={warn:pt,extend:I,mergeOptions:Gt,defineReactive:Et},t.set=Mt,t.delete=Bt,t.nextTick=ve,t.observable=function(t){return Tt(t),t},t.options=Object.create(null),z.forEach((function(e){t.options[e+"s"]=Object.create(null)})),t.options._base=t,I(t.options.components,Di),ki(t),Ci(t),Oi(t),ji(t)}Ni(Ai),Object.defineProperty(Ai.prototype,"$isServer",{get:lt}),Object.defineProperty(Ai.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(Ai,"FunctionalRenderContext",{value:Qe}),Ai.version="2.6.14";var Ri=g("style,class"),zi=g("input,textarea,option,select,progress"),Fi=function(t,e,n){return"value"===n&&zi(t)&&"button"!==e||"selected"===n&&"option"===t||"checked"===n&&"input"===t||"muted"===n&&"video"===t},Vi=g("contenteditable,draggable,spellcheck"),Hi=g("events,caret,typing,plaintext-only"),Wi=function(t,e){return Ki(e)||"false"===e?"false":"contenteditable"===t&&Hi(e)?e:"true"},Ui=g("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,truespeed,typemustmatch,visible"),qi="http://www.w3.org/1999/xlink",Yi=function(t){return":"===t.charAt(5)&&"xlink"===t.slice(0,5)},Gi=function(t){return Yi(t)?t.slice(6,t.length):""},Ki=function(t){return null==t||!1===t};function Zi(t){var e=t.data,n=t,i=t;while(r(i.componentInstance))i=i.componentInstance._vnode,i&&i.data&&(e=Xi(i.data,e));while(r(n=n.parent))n&&n.data&&(e=Xi(e,n.data));return Ji(e.staticClass,e.class)}function Xi(t,e){return{staticClass:Qi(t.staticClass,e.staticClass),class:r(t.class)?[t.class,e.class]:e.class}}function Ji(t,e){return r(t)||r(e)?Qi(t,tr(e)):""}function Qi(t,e){return t?e?t+" "+e:t:e||""}function tr(t){return Array.isArray(t)?er(t):l(t)?nr(t):"string"===typeof t?t:""}function er(t){for(var e,n="",i=0,s=t.length;i-1?lr[t]=e.constructor===window.HTMLUnknownElement||e.constructor===window.HTMLElement:lr[t]=/HTMLUnknownElement/.test(e.toString())}var ur=g("text,number,password,search,email,tel,url");function hr(t){if("string"===typeof t){var e=document.querySelector(t);return e||document.createElement("div")}return t}function dr(t,e){var n=document.createElement(t);return"select"!==t||e.data&&e.data.attrs&&void 0!==e.data.attrs.multiple&&n.setAttribute("multiple","multiple"),n}function pr(t,e){return document.createElementNS(ir[t],e)}function fr(t){return document.createTextNode(t)}function vr(t){return document.createComment(t)}function gr(t,e,n){t.insertBefore(e,n)}function mr(t,e){t.removeChild(e)}function br(t,e){t.appendChild(e)}function yr(t){return t.parentNode}function xr(t){return t.nextSibling}function wr(t){return t.tagName}function _r(t,e){t.textContent=e}function Sr(t,e){t.setAttribute(e,"")}var Ar=Object.freeze({createElement:dr,createElementNS:pr,createTextNode:fr,createComment:vr,insertBefore:gr,removeChild:mr,appendChild:br,parentNode:yr,nextSibling:xr,tagName:wr,setTextContent:_r,setStyleScope:Sr}),kr={create:function(t,e){Cr(e)},update:function(t,e){t.data.ref!==e.data.ref&&(Cr(t,!0),Cr(e))},destroy:function(t){Cr(t,!0)}};function Cr(t,e){var n=t.data.ref;if(r(n)){var i=t.context,s=t.componentInstance||t.elm,a=i.$refs;e?Array.isArray(a[n])?b(a[n],s):a[n]===s&&(a[n]=void 0):t.data.refInFor?Array.isArray(a[n])?a[n].indexOf(s)<0&&a[n].push(s):a[n]=[s]:a[n]=s}}var Or=new yt("",{},[]),$r=["create","activate","update","remove","destroy"];function Pr(t,e){return t.key===e.key&&t.asyncFactory===e.asyncFactory&&(t.tag===e.tag&&t.isComment===e.isComment&&r(t.data)===r(e.data)&&jr(t,e)||s(t.isAsyncPlaceholder)&&i(e.asyncFactory.error))}function jr(t,e){if("input"!==t.tag)return!0;var n,i=r(n=t.data)&&r(n=n.attrs)&&n.type,s=r(n=e.data)&&r(n=n.attrs)&&n.type;return i===s||ur(i)&&ur(s)}function Ir(t,e,n){var i,s,a={};for(i=e;i<=n;++i)s=t[i].key,r(s)&&(a[s]=i);return a}function Lr(t){var e,n,a={},l=t.modules,c=t.nodeOps;for(e=0;e<$r.length;++e)for(a[$r[e]]=[],n=0;nv?(h=i(n[b+1])?null:n[b+1].elm,S(t,h,n,f,b,s)):f>b&&k(e,d,v)}function $(t,e,n,i){for(var s=n;s-1?Hr(t,e,n):Ui(e)?Ki(n)?t.removeAttribute(e):(n="allowfullscreen"===e&&"EMBED"===t.tagName?"true":e,t.setAttribute(e,n)):Vi(e)?t.setAttribute(e,Wi(e,n)):Yi(e)?Ki(n)?t.removeAttributeNS(qi,Gi(e)):t.setAttributeNS(qi,e,n):Hr(t,e,n)}function Hr(t,e,n){if(Ki(n))t.removeAttribute(e);else{if(tt&&!et&&"TEXTAREA"===t.tagName&&"placeholder"===e&&""!==n&&!t.__ieph){var i=function(e){e.stopImmediatePropagation(),t.removeEventListener("input",i)};t.addEventListener("input",i),t.__ieph=!0}t.setAttribute(e,n)}}var Wr={create:Fr,update:Fr};function Ur(t,e){var n=e.elm,s=e.data,a=t.data;if(!(i(s.staticClass)&&i(s.class)&&(i(a)||i(a.staticClass)&&i(a.class)))){var o=Zi(e),l=n._transitionClasses;r(l)&&(o=Qi(o,tr(l))),o!==n._prevClass&&(n.setAttribute("class",o),n._prevClass=o)}}var qr,Yr={create:Ur,update:Ur},Gr="__r",Kr="__c";function Zr(t){if(r(t[Gr])){var e=tt?"change":"input";t[e]=[].concat(t[Gr],t[e]||[]),delete t[Gr]}r(t[Kr])&&(t.change=[].concat(t[Kr],t.change||[]),delete t[Kr])}function Xr(t,e,n){var i=qr;return function r(){var s=e.apply(null,arguments);null!==s&&ts(t,r,n,i)}}var Jr=oe&&!(rt&&Number(rt[1])<=53);function Qr(t,e,n,i){if(Jr){var r=Gn,s=e;e=s._wrapper=function(t){if(t.target===t.currentTarget||t.timeStamp>=r||t.timeStamp<=0||t.target.ownerDocument!==document)return s.apply(this,arguments)}}qr.addEventListener(t,e,at?{capture:n,passive:i}:n)}function ts(t,e,n,i){(i||qr).removeEventListener(t,e._wrapper||e,n)}function es(t,e){if(!i(t.data.on)||!i(e.data.on)){var n=e.data.on||{},r=t.data.on||{};qr=e.elm,Zr(n),we(n,r,Qr,ts,Xr,e.context),qr=void 0}}var ns,is={create:es,update:es};function rs(t,e){if(!i(t.data.domProps)||!i(e.data.domProps)){var n,s,a=e.elm,o=t.data.domProps||{},l=e.data.domProps||{};for(n in r(l.__ob__)&&(l=e.data.domProps=I({},l)),o)n in l||(a[n]="");for(n in l){if(s=l[n],"textContent"===n||"innerHTML"===n){if(e.children&&(e.children.length=0),s===o[n])continue;1===a.childNodes.length&&a.removeChild(a.childNodes[0])}if("value"===n&&"PROGRESS"!==a.tagName){a._value=s;var c=i(s)?"":String(s);ss(a,c)&&(a.value=c)}else if("innerHTML"===n&&sr(a.tagName)&&i(a.innerHTML)){ns=ns||document.createElement("div"),ns.innerHTML=""+s+"";var u=ns.firstChild;while(a.firstChild)a.removeChild(a.firstChild);while(u.firstChild)a.appendChild(u.firstChild)}else if(s!==o[n])try{a[n]=s}catch(Sa){}}}}function ss(t,e){return!t.composing&&("OPTION"===t.tagName||as(t,e)||os(t,e))}function as(t,e){var n=!0;try{n=document.activeElement!==t}catch(Sa){}return n&&t.value!==e}function os(t,e){var n=t.value,i=t._vModifiers;if(r(i)){if(i.number)return v(n)!==v(e);if(i.trim)return n.trim()!==e.trim()}return n!==e}var ls={create:rs,update:rs},cs=w((function(t){var e={},n=/;(?![^(]*\))/g,i=/:(.+)/;return t.split(n).forEach((function(t){if(t){var n=t.split(i);n.length>1&&(e[n[0].trim()]=n[1].trim())}})),e}));function us(t){var e=hs(t.style);return t.staticStyle?I(t.staticStyle,e):e}function hs(t){return Array.isArray(t)?L(t):"string"===typeof t?cs(t):t}function ds(t,e){var n,i={};if(e){var r=t;while(r.componentInstance)r=r.componentInstance._vnode,r&&r.data&&(n=us(r.data))&&I(i,n)}(n=us(t.data))&&I(i,n);var s=t;while(s=s.parent)s.data&&(n=us(s.data))&&I(i,n);return i}var ps,fs=/^--/,vs=/\s*!important$/,gs=function(t,e,n){if(fs.test(e))t.style.setProperty(e,n);else if(vs.test(n))t.style.setProperty(C(e),n.replace(vs,""),"important");else{var i=bs(e);if(Array.isArray(n))for(var r=0,s=n.length;r-1?e.split(ws).forEach((function(e){return t.classList.add(e)})):t.classList.add(e);else{var n=" "+(t.getAttribute("class")||"")+" ";n.indexOf(" "+e+" ")<0&&t.setAttribute("class",(n+e).trim())}}function Ss(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(" ")>-1?e.split(ws).forEach((function(e){return t.classList.remove(e)})):t.classList.remove(e),t.classList.length||t.removeAttribute("class");else{var n=" "+(t.getAttribute("class")||"")+" ",i=" "+e+" ";while(n.indexOf(i)>=0)n=n.replace(i," ");n=n.trim(),n?t.setAttribute("class",n):t.removeAttribute("class")}}function As(t){if(t){if("object"===typeof t){var e={};return!1!==t.css&&I(e,ks(t.name||"v")),I(e,t),e}return"string"===typeof t?ks(t):void 0}}var ks=w((function(t){return{enterClass:t+"-enter",enterToClass:t+"-enter-to",enterActiveClass:t+"-enter-active",leaveClass:t+"-leave",leaveToClass:t+"-leave-to",leaveActiveClass:t+"-leave-active"}})),Cs=Z&&!et,Os="transition",$s="animation",Ps="transition",js="transitionend",Is="animation",Ls="animationend";Cs&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(Ps="WebkitTransition",js="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(Is="WebkitAnimation",Ls="webkitAnimationEnd"));var Ts=Z?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(t){return t()};function Es(t){Ts((function(){Ts(t)}))}function Ms(t,e){var n=t._transitionClasses||(t._transitionClasses=[]);n.indexOf(e)<0&&(n.push(e),_s(t,e))}function Bs(t,e){t._transitionClasses&&b(t._transitionClasses,e),Ss(t,e)}function Ds(t,e,n){var i=Rs(t,e),r=i.type,s=i.timeout,a=i.propCount;if(!r)return n();var o=r===Os?js:Ls,l=0,c=function(){t.removeEventListener(o,u),n()},u=function(e){e.target===t&&++l>=a&&c()};setTimeout((function(){l0&&(n=Os,u=a,h=s.length):e===$s?c>0&&(n=$s,u=c,h=l.length):(u=Math.max(a,c),n=u>0?a>c?Os:$s:null,h=n?n===Os?s.length:l.length:0);var d=n===Os&&Ns.test(i[Ps+"Property"]);return{type:n,timeout:u,propCount:h,hasTransform:d}}function zs(t,e){while(t.length1}function qs(t,e){!0!==e.data.show&&Vs(e)}var Ys=Z?{create:qs,activate:qs,remove:function(t,e){!0!==t.data.show?Hs(t,e):e()}}:{},Gs=[Wr,Yr,is,ls,xs,Ys],Ks=Gs.concat(zr),Zs=Lr({nodeOps:Ar,modules:Ks});et&&document.addEventListener("selectionchange",(function(){var t=document.activeElement;t&&t.vmodel&&ra(t,"input")}));var Xs={inserted:function(t,e,n,i){"select"===n.tag?(i.elm&&!i.elm._vOptions?_e(n,"postpatch",(function(){Xs.componentUpdated(t,e,n)})):Js(t,e,n.context),t._vOptions=[].map.call(t.options,ea)):("textarea"===n.tag||ur(t.type))&&(t._vModifiers=e.modifiers,e.modifiers.lazy||(t.addEventListener("compositionstart",na),t.addEventListener("compositionend",ia),t.addEventListener("change",ia),et&&(t.vmodel=!0)))},componentUpdated:function(t,e,n){if("select"===n.tag){Js(t,e,n.context);var i=t._vOptions,r=t._vOptions=[].map.call(t.options,ea);if(r.some((function(t,e){return!B(t,i[e])}))){var s=t.multiple?e.value.some((function(t){return ta(t,r)})):e.value!==e.oldValue&&ta(e.value,r);s&&ra(t,"change")}}}};function Js(t,e,n){Qs(t,e,n),(tt||nt)&&setTimeout((function(){Qs(t,e,n)}),0)}function Qs(t,e,n){var i=e.value,r=t.multiple;if(!r||Array.isArray(i)){for(var s,a,o=0,l=t.options.length;o-1,a.selected!==s&&(a.selected=s);else if(B(ea(a),i))return void(t.selectedIndex!==o&&(t.selectedIndex=o));r||(t.selectedIndex=-1)}}function ta(t,e){return e.every((function(e){return!B(e,t)}))}function ea(t){return"_value"in t?t._value:t.value}function na(t){t.target.composing=!0}function ia(t){t.target.composing&&(t.target.composing=!1,ra(t.target,"input"))}function ra(t,e){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0),t.dispatchEvent(n)}function sa(t){return!t.componentInstance||t.data&&t.data.transition?t:sa(t.componentInstance._vnode)}var aa={bind:function(t,e,n){var i=e.value;n=sa(n);var r=n.data&&n.data.transition,s=t.__vOriginalDisplay="none"===t.style.display?"":t.style.display;i&&r?(n.data.show=!0,Vs(n,(function(){t.style.display=s}))):t.style.display=i?s:"none"},update:function(t,e,n){var i=e.value,r=e.oldValue;if(!i!==!r){n=sa(n);var s=n.data&&n.data.transition;s?(n.data.show=!0,i?Vs(n,(function(){t.style.display=t.__vOriginalDisplay})):Hs(n,(function(){t.style.display="none"}))):t.style.display=i?t.__vOriginalDisplay:"none"}},unbind:function(t,e,n,i,r){r||(t.style.display=t.__vOriginalDisplay)}},oa={model:Xs,show:aa},la={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function ca(t){var e=t&&t.componentOptions;return e&&e.Ctor.options.abstract?ca(An(e.children)):t}function ua(t){var e={},n=t.$options;for(var i in n.propsData)e[i]=t[i];var r=n._parentListeners;for(var s in r)e[S(s)]=r[s];return e}function ha(t,e){if(/\d-keep-alive$/.test(e.tag))return t("keep-alive",{props:e.componentOptions.propsData})}function da(t){while(t=t.parent)if(t.data.transition)return!0}function pa(t,e){return e.key===t.key&&e.tag===t.tag}var fa=function(t){return t.tag||Ee(t)},va=function(t){return"show"===t.name},ga={name:"transition",props:la,abstract:!0,render:function(t){var e=this,n=this.$slots.default;if(n&&(n=n.filter(fa),n.length)){0;var i=this.mode;0;var r=n[0];if(da(this.$vnode))return r;var s=ca(r);if(!s)return r;if(this._leaving)return ha(t,r);var a="__transition-"+this._uid+"-";s.key=null==s.key?s.isComment?a+"comment":a+s.tag:o(s.key)?0===String(s.key).indexOf(a)?s.key:a+s.key:s.key;var l=(s.data||(s.data={})).transition=ua(this),c=this._vnode,u=ca(c);if(s.data.directives&&s.data.directives.some(va)&&(s.data.show=!0),u&&u.data&&!pa(s,u)&&!Ee(u)&&(!u.componentInstance||!u.componentInstance._vnode.isComment)){var h=u.data.transition=I({},l);if("out-in"===i)return this._leaving=!0,_e(h,"afterLeave",(function(){e._leaving=!1,e.$forceUpdate()})),ha(t,r);if("in-out"===i){if(Ee(s))return c;var d,p=function(){d()};_e(l,"afterEnter",p),_e(l,"enterCancelled",p),_e(h,"delayLeave",(function(t){d=t}))}}return r}}},ma=I({tag:String,moveClass:String},la);delete ma.mode;var ba={props:ma,beforeMount:function(){var t=this,e=this._update;this._update=function(n,i){var r=Ln(t);t.__patch__(t._vnode,t.kept,!1,!0),t._vnode=t.kept,r(),e.call(t,n,i)}},render:function(t){for(var e=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),i=this.prevChildren=this.children,r=this.$slots.default||[],s=this.children=[],a=ua(this),o=0;o?@[\\\]^|]/,R=/[\0\t\n\r #/:<>?@[\\\]^|]/,z=/^[\u0000-\u0020]+|[\u0000-\u0020]+$/g,F=/[\t\n\r]/g,V=function(t,e){var n,i,r;if("["==e.charAt(0)){if("]"!=e.charAt(e.length-1))return P;if(n=W(e.slice(1,-1)),!n)return P;t.host=n}else if(Q(t)){if(e=v(e),N.test(e))return P;if(n=H(e),null===n)return P;t.host=n}else{if(R.test(e))return P;for(n="",i=p(e),r=0;r4)return t;for(n=[],i=0;i1&&"0"==r.charAt(0)&&(s=E.test(r)?16:8,r=r.slice(8==s?1:2)),""===r)a=0;else{if(!(10==s?B:8==s?M:D).test(r))return t;a=parseInt(r,s)}n.push(a)}for(i=0;i=C(256,5-e))return null}else if(a>255)return null;for(o=n.pop(),i=0;i6)return;i=0;while(d()){if(r=null,i>0){if(!("."==d()&&i<4))return;h++}if(!T.test(d()))return;while(T.test(d())){if(s=parseInt(d(),10),null===r)r=s;else{if(0==r)return;r=10*r+s}if(r>255)return;h++}l[c]=256*l[c]+r,i++,2!=i&&4!=i||c++}if(4!=i)return;break}if(":"==d()){if(h++,!d())return}else if(d())return;l[c++]=e}else{if(null!==u)return;h++,c++,u=c}}if(null!==u){a=c-u,c=7;while(0!=c&&a>0)o=l[c],l[c--]=l[u+a-1],l[u+--a]=o}else if(8!=c)return;return l},U=function(t){for(var e=null,n=1,i=null,r=0,s=0;s<8;s++)0!==t[s]?(r>n&&(e=i,n=r),i=null,r=0):(null===i&&(i=s),++r);return r>n&&(e=i,n=r),e},q=function(t){var e,n,i,r;if("number"==typeof t){for(e=[],n=0;n<4;n++)e.unshift(t%256),t=k(t/256);return e.join(".")}if("object"==typeof t){for(e="",i=U(t),n=0;n<8;n++)r&&0===t[n]||(r&&(r=!1),i===n?(e+=n?":":"::",r=!0):(e+=t[n].toString(16),n<7&&(e+=":")));return"["+e+"]"}return t},Y={},G=d({},Y,{" ":1,'"':1,"<":1,">":1,"`":1}),K=d({},G,{"#":1,"?":1,"{":1,"}":1}),Z=d({},K,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),X=function(t,e){var n=f(t,0);return n>32&&n<127&&!h(e,t)?t:encodeURIComponent(t)},J={ftp:21,file:null,http:80,https:443,ws:80,wss:443},Q=function(t){return h(J,t.scheme)},tt=function(t){return""!=t.username||""!=t.password},et=function(t){return!t.host||t.cannotBeABaseURL||"file"==t.scheme},nt=function(t,e){var n;return 2==t.length&&I.test(t.charAt(0))&&(":"==(n=t.charAt(1))||!e&&"|"==n)},it=function(t){var e;return t.length>1&&nt(t.slice(0,2))&&(2==t.length||"/"===(e=t.charAt(2))||"\\"===e||"?"===e||"#"===e)},rt=function(t){var e=t.path,n=e.length;!n||"file"==t.scheme&&1==n&&nt(e[0],!0)||e.pop()},st=function(t){return"."===t||"%2e"===t.toLowerCase()},at=function(t){return t=t.toLowerCase(),".."===t||"%2e."===t||".%2e"===t||"%2e%2e"===t},ot={},lt={},ct={},ut={},ht={},dt={},pt={},ft={},vt={},gt={},mt={},bt={},yt={},xt={},wt={},_t={},St={},At={},kt={},Ct={},Ot={},$t=function(t,e,n,r){var s,a,o,l,c=n||ot,u=0,d="",f=!1,v=!1,g=!1;n||(t.scheme="",t.username="",t.password="",t.host=null,t.port=null,t.path=[],t.query=null,t.fragment=null,t.cannotBeABaseURL=!1,e=e.replace(z,"")),e=e.replace(F,""),s=p(e);while(u<=s.length){switch(a=s[u],c){case ot:if(!a||!I.test(a)){if(n)return $;c=ct;continue}d+=a.toLowerCase(),c=lt;break;case lt:if(a&&(L.test(a)||"+"==a||"-"==a||"."==a))d+=a.toLowerCase();else{if(":"!=a){if(n)return $;d="",c=ct,u=0;continue}if(n&&(Q(t)!=h(J,d)||"file"==d&&(tt(t)||null!==t.port)||"file"==t.scheme&&!t.host))return;if(t.scheme=d,n)return void(Q(t)&&J[t.scheme]==t.port&&(t.port=null));d="","file"==t.scheme?c=xt:Q(t)&&r&&r.scheme==t.scheme?c=ut:Q(t)?c=ft:"/"==s[u+1]?(c=ht,u++):(t.cannotBeABaseURL=!0,t.path.push(""),c=kt)}break;case ct:if(!r||r.cannotBeABaseURL&&"#"!=a)return $;if(r.cannotBeABaseURL&&"#"==a){t.scheme=r.scheme,t.path=r.path.slice(),t.query=r.query,t.fragment="",t.cannotBeABaseURL=!0,c=Ot;break}c="file"==r.scheme?xt:dt;continue;case ut:if("/"!=a||"/"!=s[u+1]){c=dt;continue}c=vt,u++;break;case ht:if("/"==a){c=gt;break}c=At;continue;case dt:if(t.scheme=r.scheme,a==i)t.username=r.username,t.password=r.password,t.host=r.host,t.port=r.port,t.path=r.path.slice(),t.query=r.query;else if("/"==a||"\\"==a&&Q(t))c=pt;else if("?"==a)t.username=r.username,t.password=r.password,t.host=r.host,t.port=r.port,t.path=r.path.slice(),t.query="",c=Ct;else{if("#"!=a){t.username=r.username,t.password=r.password,t.host=r.host,t.port=r.port,t.path=r.path.slice(),t.path.pop(),c=At;continue}t.username=r.username,t.password=r.password,t.host=r.host,t.port=r.port,t.path=r.path.slice(),t.query=r.query,t.fragment="",c=Ot}break;case pt:if(!Q(t)||"/"!=a&&"\\"!=a){if("/"!=a){t.username=r.username,t.password=r.password,t.host=r.host,t.port=r.port,c=At;continue}c=gt}else c=vt;break;case ft:if(c=vt,"/"!=a||"/"!=d.charAt(u+1))continue;u++;break;case vt:if("/"!=a&&"\\"!=a){c=gt;continue}break;case gt:if("@"==a){f&&(d="%40"+d),f=!0,o=p(d);for(var m=0;m65535)return j;t.port=Q(t)&&x===J[t.scheme]?null:x,d=""}if(n)return;c=St;continue}return j}d+=a;break;case xt:if(t.scheme="file","/"==a||"\\"==a)c=wt;else{if(!r||"file"!=r.scheme){c=At;continue}if(a==i)t.host=r.host,t.path=r.path.slice(),t.query=r.query;else if("?"==a)t.host=r.host,t.path=r.path.slice(),t.query="",c=Ct;else{if("#"!=a){it(s.slice(u).join(""))||(t.host=r.host,t.path=r.path.slice(),rt(t)),c=At;continue}t.host=r.host,t.path=r.path.slice(),t.query=r.query,t.fragment="",c=Ot}}break;case wt:if("/"==a||"\\"==a){c=_t;break}r&&"file"==r.scheme&&!it(s.slice(u).join(""))&&(nt(r.path[0],!0)?t.path.push(r.path[0]):t.host=r.host),c=At;continue;case _t:if(a==i||"/"==a||"\\"==a||"?"==a||"#"==a){if(!n&&nt(d))c=At;else if(""==d){if(t.host="",n)return;c=St}else{if(l=V(t,d),l)return l;if("localhost"==t.host&&(t.host=""),n)return;d="",c=St}continue}d+=a;break;case St:if(Q(t)){if(c=At,"/"!=a&&"\\"!=a)continue}else if(n||"?"!=a)if(n||"#"!=a){if(a!=i&&(c=At,"/"!=a))continue}else t.fragment="",c=Ot;else t.query="",c=Ct;break;case At:if(a==i||"/"==a||"\\"==a&&Q(t)||!n&&("?"==a||"#"==a)){if(at(d)?(rt(t),"/"==a||"\\"==a&&Q(t)||t.path.push("")):st(d)?"/"==a||"\\"==a&&Q(t)||t.path.push(""):("file"==t.scheme&&!t.path.length&&nt(d)&&(t.host&&(t.host=""),d=d.charAt(0)+":"),t.path.push(d)),d="","file"==t.scheme&&(a==i||"?"==a||"#"==a))while(t.path.length>1&&""===t.path[0])t.path.shift();"?"==a?(t.query="",c=Ct):"#"==a&&(t.fragment="",c=Ot)}else d+=X(a,K);break;case kt:"?"==a?(t.query="",c=Ct):"#"==a?(t.fragment="",c=Ot):a!=i&&(t.path[0]+=X(a,Y));break;case Ct:n||"#"!=a?a!=i&&("'"==a&&Q(t)?t.query+="%27":t.query+="#"==a?"%23":X(a,Y)):(t.fragment="",c=Ot);break;case Ot:a!=i&&(t.fragment+=X(a,G));break}u++}},Pt=function(t){var e,n,i=u(this,Pt,"URL"),r=arguments.length>1?arguments[1]:void 0,a=g(t),o=S(i,{type:"URL"});if(void 0!==r)if(r instanceof Pt)e=A(r);else if(n=$t(e={},g(r)),n)throw TypeError(n);if(n=$t(o,a,null,e),n)throw TypeError(n);var l=o.searchParams=new w,c=_(l);c.updateSearchParams(o.query),c.updateURL=function(){o.query=String(l)||null},s||(i.href=It.call(i),i.origin=Lt.call(i),i.protocol=Tt.call(i),i.username=Et.call(i),i.password=Mt.call(i),i.host=Bt.call(i),i.hostname=Dt.call(i),i.port=Nt.call(i),i.pathname=Rt.call(i),i.search=zt.call(i),i.searchParams=Ft.call(i),i.hash=Vt.call(i))},jt=Pt.prototype,It=function(){var t=A(this),e=t.scheme,n=t.username,i=t.password,r=t.host,s=t.port,a=t.path,o=t.query,l=t.fragment,c=e+":";return null!==r?(c+="//",tt(t)&&(c+=n+(i?":"+i:"")+"@"),c+=q(r),null!==s&&(c+=":"+s)):"file"==e&&(c+="//"),c+=t.cannotBeABaseURL?a[0]:a.length?"/"+a.join("/"):"",null!==o&&(c+="?"+o),null!==l&&(c+="#"+l),c},Lt=function(){var t=A(this),e=t.scheme,n=t.port;if("blob"==e)try{return new Pt(e.path[0]).origin}catch(i){return"null"}return"file"!=e&&Q(t)?e+"://"+q(t.host)+(null!==n?":"+n:""):"null"},Tt=function(){return A(this).scheme+":"},Et=function(){return A(this).username},Mt=function(){return A(this).password},Bt=function(){var t=A(this),e=t.host,n=t.port;return null===e?"":null===n?q(e):q(e)+":"+n},Dt=function(){var t=A(this).host;return null===t?"":q(t)},Nt=function(){var t=A(this).port;return null===t?"":String(t)},Rt=function(){var t=A(this),e=t.path;return t.cannotBeABaseURL?e[0]:e.length?"/"+e.join("/"):""},zt=function(){var t=A(this).query;return t?"?"+t:""},Ft=function(){return A(this).searchParams},Vt=function(){var t=A(this).fragment;return t?"#"+t:""},Ht=function(t,e){return{get:t,set:e,configurable:!0,enumerable:!0}};if(s&&l(jt,{href:Ht(It,(function(t){var e=A(this),n=g(t),i=$t(e,n);if(i)throw TypeError(i);_(e.searchParams).updateSearchParams(e.query)})),origin:Ht(Lt),protocol:Ht(Tt,(function(t){var e=A(this);$t(e,g(t)+":",ot)})),username:Ht(Et,(function(t){var e=A(this),n=p(g(t));if(!et(e)){e.username="";for(var i=0;i[]},returnObject:{type:Boolean,default:!0}},data:()=>({editingIndex:-1}),computed:{computedCounterValue(){return this.multiple?this.selectedItems.length:(this.internalSearch||"").toString().length},hasSlot(){return i["a"].options.computed.hasSlot.call(this)||this.multiple},isAnyValueAllowed(){return!0},menuCanShow(){return!!this.isFocused&&(this.hasDisplayedItems||!!this.$slots["no-data"]&&!this.hideNoData)},searchIsDirty(){return null!=this.internalSearch}},methods:{onInternalSearchChanged(t){if(t&&this.multiple&&this.delimiters.length){const e=this.delimiters.find(e=>t.endsWith(e));null!=e&&(this.internalSearch=t.slice(0,t.length-e.length),this.updateTags())}this.updateMenuDimensions()},genInput(){const t=r["a"].options.methods.genInput.call(this);return delete t.data.attrs.name,t.data.on.paste=this.onPaste,t},genChipSelection(t,e){const n=i["a"].options.methods.genChipSelection.call(this,t,e);return this.multiple&&(n.componentOptions.listeners={...n.componentOptions.listeners,dblclick:()=>{this.editingIndex=e,this.internalSearch=this.getText(t),this.selectedIndex=-1}}),n},onChipInput(t){i["a"].options.methods.onChipInput.call(this,t),this.editingIndex=-1},onEnterDown(t){t.preventDefault(),this.getMenuIndex()>-1||this.$nextTick(this.updateSelf)},onFilteredItemsChanged(t,e){this.autoSelectFirst&&r["a"].options.methods.onFilteredItemsChanged.call(this,t,e)},onKeyDown(t){const e=t.keyCode;!t.ctrlKey&&[s["z"].home,s["z"].end].includes(e)||i["a"].options.methods.onKeyDown.call(this,t),this.multiple&&e===s["z"].left&&0===this.$refs.input.selectionStart?this.updateSelf():e===s["z"].enter&&this.onEnterDown(t),this.changeSelectedIndex(e)},onTabDown(t){if(this.multiple&&this.internalSearch&&-1===this.getMenuIndex())return t.preventDefault(),t.stopPropagation(),this.updateTags();r["a"].options.methods.onTabDown.call(this,t)},selectItem(t){this.editingIndex>-1?this.updateEditing():(r["a"].options.methods.selectItem.call(this,t),this.internalSearch&&this.multiple&&this.getText(t).toLocaleLowerCase().includes(this.internalSearch.toLocaleLowerCase())&&(this.internalSearch=null))},setSelectedItems(){null==this.internalValue||""===this.internalValue?this.selectedItems=[]:this.selectedItems=this.multiple?this.internalValue:[this.internalValue]},setValue(t){i["a"].options.methods.setValue.call(this,null!=t?t:this.internalSearch)},updateEditing(){const t=this.internalValue.slice(),e=this.selectedItems.findIndex(t=>this.getText(t)===this.internalSearch);if(e>-1){const n="object"===typeof t[e]?Object.assign({},t[e]):t[e];t.splice(e,1),t.push(n)}else t[this.editingIndex]=this.internalSearch;this.setValue(t),this.editingIndex=-1,this.internalSearch=null},updateCombobox(){if(!this.searchIsDirty)return;this.internalSearch!==this.getText(this.internalValue)&&this.setValue();const t=Boolean(this.$scopedSlots.selection)||this.hasChips;t&&(this.internalSearch=null)},updateSelf(){this.multiple?this.updateTags():this.updateCombobox()},updateTags(){const t=this.getMenuIndex();if(t<0&&!this.searchIsDirty||!this.internalSearch)return;if(this.editingIndex>-1)return this.updateEditing();const e=this.selectedItems.findIndex(t=>this.internalSearch===this.getText(t)),n=e>-1&&"object"===typeof this.selectedItems[e]?Object.assign({},this.selectedItems[e]):this.internalSearch;if(e>-1){const t=this.internalValue.slice();t.splice(e,1),this.setValue(t)}if(t>-1)return this.internalSearch=null;this.selectItem(n),this.internalSearch=null},onPaste(t){var e;if(!this.multiple||this.searchIsDirty)return;const n=null==(e=t.clipboardData)?void 0:e.getData("text/vnd.vuetify.autocomplete.item+plain");n&&-1===this.findExistingIndex(n)&&(t.preventDefault(),i["a"].options.methods.selectItem.call(this,n))},clearableCallback(){this.editingIndex=-1,r["a"].options.methods.clearableCallback.call(this)}}})},"2bfd":function(t,e,n){},"2ca0":function(t,e,n){"use strict";var i=n("23e7"),r=n("06cf").f,s=n("50c4"),a=n("577e"),o=n("5a34"),l=n("1d80"),c=n("ab13"),u=n("c430"),h="".startsWith,d=Math.min,p=c("startsWith"),f=!u&&!p&&!!function(){var t=r(String.prototype,"startsWith");return t&&!t.writable}();i({target:"String",proto:!0,forced:!f&&!p},{startsWith:function(t){var e=a(l(this));o(t);var n=s(d(arguments.length>1?arguments[1]:void 0,e.length)),i=a(t);return h?h.call(e,i,n):e.slice(n,n+i.length)===i}})},"2caf":function(t,e,n){"use strict";n.d(e,"a",(function(){return c}));n("4ae1"),n("131a"),n("3410");function i(t){return i=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)},i(t)}function r(){if("undefined"===typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"===typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}var s=n("7037"),a=n.n(s);function o(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}function l(t,e){return!e||"object"!==a()(e)&&"function"!==typeof e?o(t):e}function c(t){var e=r();return function(){var n,r=i(t);if(e){var s=i(this).constructor;n=Reflect.construct(r,arguments,s)}else n=r.apply(this,arguments);return l(this,n)}}},"2cf4":function(t,e,n){var i,r,s,a,o=n("da84"),l=n("d039"),c=n("0366"),u=n("1be4"),h=n("cc12"),d=n("1cdc"),p=n("605d"),f=o.setImmediate,v=o.clearImmediate,g=o.process,m=o.MessageChannel,b=o.Dispatch,y=0,x={},w="onreadystatechange";try{i=o.location}catch(C){}var _=function(t){if(x.hasOwnProperty(t)){var e=x[t];delete x[t],e()}},S=function(t){return function(){_(t)}},A=function(t){_(t.data)},k=function(t){o.postMessage(String(t),i.protocol+"//"+i.host)};f&&v||(f=function(t){var e=[],n=arguments.length,i=1;while(n>i)e.push(arguments[i++]);return x[++y]=function(){("function"==typeof t?t:Function(t)).apply(void 0,e)},r(y),y},v=function(t){delete x[t]},p?r=function(t){g.nextTick(S(t))}:b&&b.now?r=function(t){b.now(S(t))}:m&&!d?(s=new m,a=s.port2,s.port1.onmessage=A,r=c(a.postMessage,a,1)):o.addEventListener&&"function"==typeof postMessage&&!o.importScripts&&i&&"file:"!==i.protocol&&!l(k)?(r=k,o.addEventListener("message",A,!1)):r=w in h("script")?function(t){u.appendChild(h("script"))[w]=function(){u.removeChild(this),_(t)}}:function(t){setTimeout(S(t),0)}),t.exports={set:f,clear:v}},"2d00":function(t,e,n){var i,r,s=n("da84"),a=n("342f"),o=s.process,l=s.Deno,c=o&&o.versions||l&&l.version,u=c&&c.v8;u?(i=u.split("."),r=i[0]<4?1:i[0]+i[1]):a&&(i=a.match(/Edge\/(\d+)/),(!i||i[1]>=74)&&(i=a.match(/Chrome\/(\d+)/),i&&(r=i[1]))),t.exports=r&&+r},"2d83":function(t,e,n){"use strict";var i=n("387f");t.exports=function(t,e,n,r,s){var a=new Error(t);return i(a,e,n,r,s)}},"2db4":function(t,e,n){"use strict";n("ca71");var i=n("8dd9"),r=n("a9ad"),s=n("7560"),a=n("f2e7"),o=n("fe6c"),l=n("58df"),c=n("80d2"),u=n("d9bd");e["a"]=Object(l["a"])(i["a"],r["a"],a["a"],Object(o["b"])(["absolute","bottom","left","right","top"])).extend({name:"v-snackbar",props:{app:Boolean,centered:Boolean,contentClass:{type:String,default:""},multiLine:Boolean,text:Boolean,timeout:{type:[Number,String],default:5e3},transition:{type:[Boolean,String],default:"v-snack-transition",validator:t=>"string"===typeof t||!1===t},vertical:Boolean},data:()=>({activeTimeout:-1}),computed:{classes(){return{"v-snack--absolute":this.absolute,"v-snack--active":this.isActive,"v-snack--bottom":this.bottom||!this.top,"v-snack--centered":this.centered,"v-snack--has-background":this.hasBackground,"v-snack--left":this.left,"v-snack--multi-line":this.multiLine&&!this.vertical,"v-snack--right":this.right,"v-snack--text":this.text,"v-snack--top":this.top,"v-snack--vertical":this.vertical}},hasBackground(){return!this.text&&!this.outlined},isDark(){return this.hasBackground?!this.light:s["a"].options.computed.isDark.call(this)},styles(){if(this.absolute)return{};const{bar:t,bottom:e,footer:n,insetFooter:i,left:r,right:s,top:a}=this.$vuetify.application;return{paddingBottom:Object(c["h"])(e+n+i),paddingLeft:this.app?Object(c["h"])(r):void 0,paddingRight:this.app?Object(c["h"])(s):void 0,paddingTop:Object(c["h"])(t+a)}}},watch:{isActive:"setTimeout",timeout:"setTimeout"},mounted(){this.isActive&&this.setTimeout()},created(){this.$attrs.hasOwnProperty("auto-height")&&Object(u["e"])("auto-height",this),0==this.timeout&&Object(u["d"])('timeout="0"',"-1",this)},methods:{genActions(){return this.$createElement("div",{staticClass:"v-snack__action "},[Object(c["t"])(this,"action",{attrs:{class:"v-snack__btn"}})])},genContent(){return this.$createElement("div",{staticClass:"v-snack__content",class:{[this.contentClass]:!0},attrs:{role:"status","aria-live":"polite"}},[Object(c["t"])(this)])},genWrapper(){const t=this.hasBackground?this.setBackgroundColor:this.setTextColor,e=t(this.color,{staticClass:"v-snack__wrapper",class:i["a"].options.computed.classes.call(this),style:i["a"].options.computed.styles.call(this),directives:[{name:"show",value:this.isActive}],on:{pointerenter:()=>window.clearTimeout(this.activeTimeout),pointerleave:this.setTimeout}});return this.$createElement("div",e,[this.genContent(),this.genActions()])},genTransition(){return this.$createElement("transition",{props:{name:this.transition}},[this.genWrapper()])},setTimeout(){window.clearTimeout(this.activeTimeout);const t=Number(this.timeout);this.isActive&&![0,-1].includes(t)&&(this.activeTimeout=window.setTimeout(()=>{this.isActive=!1},t))}},render(t){return t("div",{staticClass:"v-snack",class:this.classes,style:this.styles},[!1!==this.transition?this.genTransition():this.genWrapper()])}})},"2e67":function(t,e,n){"use strict";t.exports=function(t){return!(!t||!t.__CANCEL__)}},"2ef0":function(t,e,n){(function(t,i){var r; -/** - * @license - * Lodash - * Copyright OpenJS Foundation and other contributors - * Released under MIT license - * Based on Underscore.js 1.8.3 - * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - */(function(){var s,a="4.17.21",o=200,l="Unsupported core-js use. Try https://npms.io/search?q=ponyfill.",c="Expected a function",u="Invalid `variable` option passed into `_.template`",h="__lodash_hash_undefined__",d=500,p="__lodash_placeholder__",f=1,v=2,g=4,m=1,b=2,y=1,x=2,w=4,_=8,S=16,A=32,k=64,C=128,O=256,$=512,P=30,j="...",I=800,L=16,T=1,E=2,M=3,B=1/0,D=9007199254740991,N=17976931348623157e292,R=NaN,z=4294967295,F=z-1,V=z>>>1,H=[["ary",C],["bind",y],["bindKey",x],["curry",_],["curryRight",S],["flip",$],["partial",A],["partialRight",k],["rearg",O]],W="[object Arguments]",U="[object Array]",q="[object AsyncFunction]",Y="[object Boolean]",G="[object Date]",K="[object DOMException]",Z="[object Error]",X="[object Function]",J="[object GeneratorFunction]",Q="[object Map]",tt="[object Number]",et="[object Null]",nt="[object Object]",it="[object Promise]",rt="[object Proxy]",st="[object RegExp]",at="[object Set]",ot="[object String]",lt="[object Symbol]",ct="[object Undefined]",ut="[object WeakMap]",ht="[object WeakSet]",dt="[object ArrayBuffer]",pt="[object DataView]",ft="[object Float32Array]",vt="[object Float64Array]",gt="[object Int8Array]",mt="[object Int16Array]",bt="[object Int32Array]",yt="[object Uint8Array]",xt="[object Uint8ClampedArray]",wt="[object Uint16Array]",_t="[object Uint32Array]",St=/\b__p \+= '';/g,At=/\b(__p \+=) '' \+/g,kt=/(__e\(.*?\)|\b__t\)) \+\n'';/g,Ct=/&(?:amp|lt|gt|quot|#39);/g,Ot=/[&<>"']/g,$t=RegExp(Ct.source),Pt=RegExp(Ot.source),jt=/<%-([\s\S]+?)%>/g,It=/<%([\s\S]+?)%>/g,Lt=/<%=([\s\S]+?)%>/g,Tt=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Et=/^\w*$/,Mt=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Bt=/[\\^$.*+?()[\]{}|]/g,Dt=RegExp(Bt.source),Nt=/^\s+/,Rt=/\s/,zt=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Ft=/\{\n\/\* \[wrapped with (.+)\] \*/,Vt=/,? & /,Ht=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,Wt=/[()=,{}\[\]\/\s]/,Ut=/\\(\\)?/g,qt=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,Yt=/\w*$/,Gt=/^[-+]0x[0-9a-f]+$/i,Kt=/^0b[01]+$/i,Zt=/^\[object .+?Constructor\]$/,Xt=/^0o[0-7]+$/i,Jt=/^(?:0|[1-9]\d*)$/,Qt=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,te=/($^)/,ee=/['\n\r\u2028\u2029\\]/g,ne="\\ud800-\\udfff",ie="\\u0300-\\u036f",re="\\ufe20-\\ufe2f",se="\\u20d0-\\u20ff",ae=ie+re+se,oe="\\u2700-\\u27bf",le="a-z\\xdf-\\xf6\\xf8-\\xff",ce="\\xac\\xb1\\xd7\\xf7",ue="\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf",he="\\u2000-\\u206f",de=" \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",pe="A-Z\\xc0-\\xd6\\xd8-\\xde",fe="\\ufe0e\\ufe0f",ve=ce+ue+he+de,ge="['’]",me="["+ne+"]",be="["+ve+"]",ye="["+ae+"]",xe="\\d+",we="["+oe+"]",_e="["+le+"]",Se="[^"+ne+ve+xe+oe+le+pe+"]",Ae="\\ud83c[\\udffb-\\udfff]",ke="(?:"+ye+"|"+Ae+")",Ce="[^"+ne+"]",Oe="(?:\\ud83c[\\udde6-\\uddff]){2}",$e="[\\ud800-\\udbff][\\udc00-\\udfff]",Pe="["+pe+"]",je="\\u200d",Ie="(?:"+_e+"|"+Se+")",Le="(?:"+Pe+"|"+Se+")",Te="(?:"+ge+"(?:d|ll|m|re|s|t|ve))?",Ee="(?:"+ge+"(?:D|LL|M|RE|S|T|VE))?",Me=ke+"?",Be="["+fe+"]?",De="(?:"+je+"(?:"+[Ce,Oe,$e].join("|")+")"+Be+Me+")*",Ne="\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",Re="\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])",ze=Be+Me+De,Fe="(?:"+[we,Oe,$e].join("|")+")"+ze,Ve="(?:"+[Ce+ye+"?",ye,Oe,$e,me].join("|")+")",He=RegExp(ge,"g"),We=RegExp(ye,"g"),Ue=RegExp(Ae+"(?="+Ae+")|"+Ve+ze,"g"),qe=RegExp([Pe+"?"+_e+"+"+Te+"(?="+[be,Pe,"$"].join("|")+")",Le+"+"+Ee+"(?="+[be,Pe+Ie,"$"].join("|")+")",Pe+"?"+Ie+"+"+Te,Pe+"+"+Ee,Re,Ne,xe,Fe].join("|"),"g"),Ye=RegExp("["+je+ne+ae+fe+"]"),Ge=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Ke=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],Ze=-1,Xe={};Xe[ft]=Xe[vt]=Xe[gt]=Xe[mt]=Xe[bt]=Xe[yt]=Xe[xt]=Xe[wt]=Xe[_t]=!0,Xe[W]=Xe[U]=Xe[dt]=Xe[Y]=Xe[pt]=Xe[G]=Xe[Z]=Xe[X]=Xe[Q]=Xe[tt]=Xe[nt]=Xe[st]=Xe[at]=Xe[ot]=Xe[ut]=!1;var Je={};Je[W]=Je[U]=Je[dt]=Je[pt]=Je[Y]=Je[G]=Je[ft]=Je[vt]=Je[gt]=Je[mt]=Je[bt]=Je[Q]=Je[tt]=Je[nt]=Je[st]=Je[at]=Je[ot]=Je[lt]=Je[yt]=Je[xt]=Je[wt]=Je[_t]=!0,Je[Z]=Je[X]=Je[ut]=!1;var Qe={"À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","Ç":"C","ç":"c","Ð":"D","ð":"d","È":"E","É":"E","Ê":"E","Ë":"E","è":"e","é":"e","ê":"e","ë":"e","Ì":"I","Í":"I","Î":"I","Ï":"I","ì":"i","í":"i","î":"i","ï":"i","Ñ":"N","ñ":"n","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","Ù":"U","Ú":"U","Û":"U","Ü":"U","ù":"u","ú":"u","û":"u","ü":"u","Ý":"Y","ý":"y","ÿ":"y","Æ":"Ae","æ":"ae","Þ":"Th","þ":"th","ß":"ss","Ā":"A","Ă":"A","Ą":"A","ā":"a","ă":"a","ą":"a","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","ć":"c","ĉ":"c","ċ":"c","č":"c","Ď":"D","Đ":"D","ď":"d","đ":"d","Ē":"E","Ĕ":"E","Ė":"E","Ę":"E","Ě":"E","ē":"e","ĕ":"e","ė":"e","ę":"e","ě":"e","Ĝ":"G","Ğ":"G","Ġ":"G","Ģ":"G","ĝ":"g","ğ":"g","ġ":"g","ģ":"g","Ĥ":"H","Ħ":"H","ĥ":"h","ħ":"h","Ĩ":"I","Ī":"I","Ĭ":"I","Į":"I","İ":"I","ĩ":"i","ī":"i","ĭ":"i","į":"i","ı":"i","Ĵ":"J","ĵ":"j","Ķ":"K","ķ":"k","ĸ":"k","Ĺ":"L","Ļ":"L","Ľ":"L","Ŀ":"L","Ł":"L","ĺ":"l","ļ":"l","ľ":"l","ŀ":"l","ł":"l","Ń":"N","Ņ":"N","Ň":"N","Ŋ":"N","ń":"n","ņ":"n","ň":"n","ŋ":"n","Ō":"O","Ŏ":"O","Ő":"O","ō":"o","ŏ":"o","ő":"o","Ŕ":"R","Ŗ":"R","Ř":"R","ŕ":"r","ŗ":"r","ř":"r","Ś":"S","Ŝ":"S","Ş":"S","Š":"S","ś":"s","ŝ":"s","ş":"s","š":"s","Ţ":"T","Ť":"T","Ŧ":"T","ţ":"t","ť":"t","ŧ":"t","Ũ":"U","Ū":"U","Ŭ":"U","Ů":"U","Ű":"U","Ų":"U","ũ":"u","ū":"u","ŭ":"u","ů":"u","ű":"u","ų":"u","Ŵ":"W","ŵ":"w","Ŷ":"Y","ŷ":"y","Ÿ":"Y","Ź":"Z","Ż":"Z","Ž":"Z","ź":"z","ż":"z","ž":"z","IJ":"IJ","ij":"ij","Œ":"Oe","œ":"oe","ʼn":"'n","ſ":"s"},tn={"&":"&","<":"<",">":">",'"':""","'":"'"},en={"&":"&","<":"<",">":">",""":'"',"'":"'"},nn={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},rn=parseFloat,sn=parseInt,an="object"==typeof t&&t&&t.Object===Object&&t,on="object"==typeof self&&self&&self.Object===Object&&self,ln=an||on||Function("return this")(),cn=e&&!e.nodeType&&e,un=cn&&"object"==typeof i&&i&&!i.nodeType&&i,hn=un&&un.exports===cn,dn=hn&&an.process,pn=function(){try{var t=un&&un.require&&un.require("util").types;return t||dn&&dn.binding&&dn.binding("util")}catch(e){}}(),fn=pn&&pn.isArrayBuffer,vn=pn&&pn.isDate,gn=pn&&pn.isMap,mn=pn&&pn.isRegExp,bn=pn&&pn.isSet,yn=pn&&pn.isTypedArray;function xn(t,e,n){switch(n.length){case 0:return t.call(e);case 1:return t.call(e,n[0]);case 2:return t.call(e,n[0],n[1]);case 3:return t.call(e,n[0],n[1],n[2])}return t.apply(e,n)}function wn(t,e,n,i){var r=-1,s=null==t?0:t.length;while(++r-1}function On(t,e,n){var i=-1,r=null==t?0:t.length;while(++i-1);return n}function ti(t,e){var n=t.length;while(n--&&Nn(e,t[n],0)>-1);return n}function ei(t,e){var n=t.length,i=0;while(n--)t[n]===e&&++i;return i}var ni=Hn(Qe),ii=Hn(tn);function ri(t){return"\\"+nn[t]}function si(t,e){return null==t?s:t[e]}function ai(t){return Ye.test(t)}function oi(t){return Ge.test(t)}function li(t){var e,n=[];while(!(e=t.next()).done)n.push(e.value);return n}function ci(t){var e=-1,n=Array(t.size);return t.forEach((function(t,i){n[++e]=[i,t]})),n}function ui(t,e){return function(n){return t(e(n))}}function hi(t,e){var n=-1,i=t.length,r=0,s=[];while(++n-1}function Vi(t,e){var n=this.__data__,i=ur(n,t);return i<0?(++this.size,n.push([t,e])):n[i][1]=e,this}function Hi(t){var e=-1,n=null==t?0:t.length;this.clear();while(++e=e?t:e)),t}function mr(t,e,n,i,r,a){var o,l=e&f,c=e&v,u=e&g;if(n&&(o=r?n(t,i,r,a):n(t)),o!==s)return o;if(!Au(t))return t;var h=lu(t);if(h){if(o=to(t),!l)return ia(t,o)}else{var d=Za(t),p=d==X||d==J;if(pu(t))return Ys(t,l);if(d==nt||d==W||p&&!r){if(o=c||p?{}:eo(t),!l)return c?aa(t,pr(o,t)):sa(t,dr(o,t))}else{if(!Je[d])return r?t:{};o=no(t,d,l)}}a||(a=new Ji);var m=a.get(t);if(m)return m;a.set(t,o),Du(t)?t.forEach((function(i){o.add(mr(i,e,n,i,t,a))})):Cu(t)&&t.forEach((function(i,r){o.set(r,mr(i,e,n,r,t,a))}));var b=u?c?Ra:Na:c?Sh:_h,y=h?s:b(t);return _n(y||t,(function(i,r){y&&(r=i,i=t[r]),cr(o,r,mr(i,e,n,r,t,a))})),o}function br(t){var e=_h(t);return function(n){return yr(n,t,e)}}function yr(t,e,n){var i=n.length;if(null==t)return!i;t=ne(t);while(i--){var r=n[i],a=e[r],o=t[r];if(o===s&&!(r in t)||!a(o))return!1}return!0}function xr(t,e,n){if("function"!=typeof t)throw new se(c);return ko((function(){t.apply(s,n)}),e)}function wr(t,e,n,i){var r=-1,s=Cn,a=!0,l=t.length,c=[],u=e.length;if(!l)return c;n&&(e=$n(e,Zn(n))),i?(s=On,a=!1):e.length>=o&&(s=Jn,a=!1,e=new Ki(e));t:while(++rr?0:r+n),i=i===s||i>r?r:Gu(i),i<0&&(i+=r),i=n>i?0:Ku(i);while(n0&&n(o)?e>1?$r(o,e-1,n,i,r):Pn(r,o):i||(r[r.length]=o)}return r}var Pr=ua(),jr=ua(!0);function Ir(t,e){return t&&Pr(t,e,_h)}function Lr(t,e){return t&&jr(t,e,_h)}function Tr(t,e){return kn(e,(function(e){return wu(t[e])}))}function Er(t,e){e=Hs(e,t);var n=0,i=e.length;while(null!=t&&ne}function Nr(t,e){return null!=t&&he.call(t,e)}function Rr(t,e){return null!=t&&e in ne(t)}function zr(t,e,n){return t>=Fe(e,n)&&t=120&&d.length>=120)?new Ki(l&&d):s}d=t[0];var p=-1,f=c[0];t:while(++p-1)o!==t&&ke.call(o,l,1),ke.call(t,l,1)}return t}function gs(t,e){var n=t?e.length:0,i=n-1;while(n--){var r=e[n];if(n==i||r!==s){var s=r;so(r)?ke.call(t,r,1):Ms(t,r)}}return t}function ms(t,e){return t+Ee(qe()*(e-t+1))}function bs(t,e,i,r){var s=-1,a=ze(Te((e-t)/(i||1)),0),o=n(a);while(a--)o[r?a:++s]=t,t+=i;return o}function ys(t,e){var n="";if(!t||e<1||e>D)return n;do{e%2&&(n+=t),e=Ee(e/2),e&&(t+=t)}while(e);return n}function xs(t,e){return Co(xo(t,e,jd),t+"")}function ws(t){return sr(Fh(t))}function _s(t,e){var n=Fh(t);return Po(n,gr(e,0,n.length))}function Ss(t,e,n,i){if(!Au(t))return t;e=Hs(e,t);var r=-1,a=e.length,o=a-1,l=t;while(null!=l&&++rs?0:s+e),i=i>s?s:i,i<0&&(i+=s),s=e>i?0:i-e>>>0,e>>>=0;var a=n(s);while(++r>>1,a=t[s];null!==a&&!Ru(a)&&(n?a<=e:a=o){var u=e?null:$a(t);if(u)return di(u);a=!1,r=Jn,c=new Ki}else c=e?[]:l;t:while(++i=i?t:Os(t,e,n)}var qs=je||function(t){return ln.clearTimeout(t)};function Ys(t,e){if(e)return t.slice();var n=t.length,i=we?we(n):new t.constructor(n);return t.copy(i),i}function Gs(t){var e=new t.constructor(t.byteLength);return new xe(e).set(new xe(t)),e}function Ks(t,e){var n=e?Gs(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.byteLength)}function Zs(t){var e=new t.constructor(t.source,Yt.exec(t));return e.lastIndex=t.lastIndex,e}function Xs(t){return fi?ne(fi.call(t)):{}}function Js(t,e){var n=e?Gs(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.length)}function Qs(t,e){if(t!==e){var n=t!==s,i=null===t,r=t===t,a=Ru(t),o=e!==s,l=null===e,c=e===e,u=Ru(e);if(!l&&!u&&!a&&t>e||a&&o&&c&&!l&&!u||i&&o&&c||!n&&c||!r)return 1;if(!i&&!a&&!u&&t=o)return l;var c=n[i];return l*("desc"==c?-1:1)}}return t.index-e.index}function ea(t,e,i,r){var s=-1,a=t.length,o=i.length,l=-1,c=e.length,u=ze(a-o,0),h=n(c+u),d=!r;while(++l1?n[r-1]:s,o=r>2?n[2]:s;a=t.length>3&&"function"==typeof a?(r--,a):s,o&&ao(n[0],n[1],o)&&(a=r<3?s:a,r=1),e=ne(e);while(++i-1?r[a?e[o]:o]:s}}function ma(t){return Da((function(e){var n=e.length,i=n,r=Ci.prototype.thru;t&&e.reverse();while(i--){var a=e[i];if("function"!=typeof a)throw new se(c);if(r&&!o&&"wrapper"==Fa(a))var o=new Ci([],!0)}i=o?i:n;while(++i1&&y.reverse(),d&&ul))return!1;var u=a.get(t),h=a.get(e);if(u&&h)return u==e&&h==t;var d=-1,p=!0,f=n&b?new Ki:s;a.set(t,e),a.set(e,t);while(++d1?"& ":"")+e[i],e=e.join(n>2?", ":" "),t.replace(zt,"{\n/* [wrapped with "+e+"] */\n")}function ro(t){return lu(t)||ou(t)||!!(Ce&&t&&t[Ce])}function so(t,e){var n=typeof t;return e=null==e?D:e,!!e&&("number"==n||"symbol"!=n&&Jt.test(t))&&t>-1&&t%1==0&&t0){if(++e>=I)return arguments[0]}else e=0;return t.apply(s,arguments)}}function Po(t,e){var n=-1,i=t.length,r=i-1;e=e===s?i:e;while(++n1?t[e-1]:s;return n="function"==typeof n?(t.pop(),n):s,Bl(t,n)}));function Ul(t){var e=wi(t);return e.__chain__=!0,e}function ql(t,e){return e(t),t}function Yl(t,e){return e(t)}var Gl=Da((function(t){var e=t.length,n=e?t[0]:0,i=this.__wrapped__,r=function(e){return vr(e,t)};return!(e>1||this.__actions__.length)&&i instanceof Oi&&so(n)?(i=i.slice(n,+n+(e?1:0)),i.__actions__.push({func:Yl,args:[r],thisArg:s}),new Ci(i,this.__chain__).thru((function(t){return e&&!t.length&&t.push(s),t}))):this.thru(r)}));function Kl(){return Ul(this)}function Zl(){return new Ci(this.value(),this.__chain__)}function Xl(){this.__values__===s&&(this.__values__=qu(this.value()));var t=this.__index__>=this.__values__.length,e=t?s:this.__values__[this.__index__++];return{done:t,value:e}}function Jl(){return this}function Ql(t){var e,n=this;while(n instanceof ki){var i=Eo(n);i.__index__=0,i.__values__=s,e?r.__wrapped__=i:e=i;var r=i;n=n.__wrapped__}return r.__wrapped__=t,e}function tc(){var t=this.__wrapped__;if(t instanceof Oi){var e=t;return this.__actions__.length&&(e=new Oi(this)),e=e.reverse(),e.__actions__.push({func:Yl,args:[fl],thisArg:s}),new Ci(e,this.__chain__)}return this.thru(fl)}function ec(){return Ns(this.__wrapped__,this.__actions__)}var nc=oa((function(t,e,n){he.call(t,n)?++t[n]:fr(t,n,1)}));function ic(t,e,n){var i=lu(t)?An:Ar;return n&&ao(t,e,n)&&(e=s),i(t,Ha(e,3))}function rc(t,e){var n=lu(t)?kn:Or;return n(t,Ha(e,3))}var sc=ga(qo),ac=ga(Yo);function oc(t,e){return $r(gc(t,e),1)}function lc(t,e){return $r(gc(t,e),B)}function cc(t,e,n){return n=n===s?1:Gu(n),$r(gc(t,e),n)}function uc(t,e){var n=lu(t)?_n:_r;return n(t,Ha(e,3))}function hc(t,e){var n=lu(t)?Sn:Sr;return n(t,Ha(e,3))}var dc=oa((function(t,e,n){he.call(t,n)?t[n].push(e):fr(t,n,[e])}));function pc(t,e,n,i){t=uu(t)?t:Fh(t),n=n&&!i?Gu(n):0;var r=t.length;return n<0&&(n=ze(r+n,0)),Nu(t)?n<=r&&t.indexOf(e,n)>-1:!!r&&Nn(t,e,n)>-1}var fc=xs((function(t,e,i){var r=-1,s="function"==typeof e,a=uu(t)?n(t.length):[];return _r(t,(function(t){a[++r]=s?xn(e,t,i):Hr(t,e,i)})),a})),vc=oa((function(t,e,n){fr(t,n,e)}));function gc(t,e){var n=lu(t)?$n:ss;return n(t,Ha(e,3))}function mc(t,e,n,i){return null==t?[]:(lu(e)||(e=null==e?[]:[e]),n=i?s:n,lu(n)||(n=null==n?[]:[n]),hs(t,e,n))}var bc=oa((function(t,e,n){t[n?0:1].push(e)}),(function(){return[[],[]]}));function yc(t,e,n){var i=lu(t)?jn:Wn,r=arguments.length<3;return i(t,Ha(e,4),n,r,_r)}function xc(t,e,n){var i=lu(t)?In:Wn,r=arguments.length<3;return i(t,Ha(e,4),n,r,Sr)}function wc(t,e){var n=lu(t)?kn:Or;return n(t,Fc(Ha(e,3)))}function _c(t){var e=lu(t)?sr:ws;return e(t)}function Sc(t,e,n){e=(n?ao(t,e,n):e===s)?1:Gu(e);var i=lu(t)?ar:_s;return i(t,e)}function Ac(t){var e=lu(t)?or:Cs;return e(t)}function kc(t){if(null==t)return 0;if(uu(t))return Nu(t)?gi(t):t.length;var e=Za(t);return e==Q||e==at?t.size:ns(t).length}function Cc(t,e,n){var i=lu(t)?Ln:$s;return n&&ao(t,e,n)&&(e=s),i(t,Ha(e,3))}var Oc=xs((function(t,e){if(null==t)return[];var n=e.length;return n>1&&ao(t,e[0],e[1])?e=[]:n>2&&ao(e[0],e[1],e[2])&&(e=[e[0]]),hs(t,$r(e,1),[])})),$c=Ie||function(){return ln.Date.now()};function Pc(t,e){if("function"!=typeof e)throw new se(c);return t=Gu(t),function(){if(--t<1)return e.apply(this,arguments)}}function jc(t,e,n){return e=n?s:e,e=t&&null==e?t.length:e,ja(t,C,s,s,s,s,e)}function Ic(t,e){var n;if("function"!=typeof e)throw new se(c);return t=Gu(t),function(){return--t>0&&(n=e.apply(this,arguments)),t<=1&&(e=s),n}}var Lc=xs((function(t,e,n){var i=y;if(n.length){var r=hi(n,Va(Lc));i|=A}return ja(t,i,e,n,r)})),Tc=xs((function(t,e,n){var i=y|x;if(n.length){var r=hi(n,Va(Tc));i|=A}return ja(e,i,t,n,r)}));function Ec(t,e,n){e=n?s:e;var i=ja(t,_,s,s,s,s,s,e);return i.placeholder=Ec.placeholder,i}function Mc(t,e,n){e=n?s:e;var i=ja(t,S,s,s,s,s,s,e);return i.placeholder=Mc.placeholder,i}function Bc(t,e,n){var i,r,a,o,l,u,h=0,d=!1,p=!1,f=!0;if("function"!=typeof t)throw new se(c);function v(e){var n=i,a=r;return i=r=s,h=e,o=t.apply(a,n),o}function g(t){return h=t,l=ko(y,e),d?v(t):o}function m(t){var n=t-u,i=t-h,r=e-n;return p?Fe(r,a-i):r}function b(t){var n=t-u,i=t-h;return u===s||n>=e||n<0||p&&i>=a}function y(){var t=$c();if(b(t))return x(t);l=ko(y,m(t))}function x(t){return l=s,f&&i?v(t):(i=r=s,o)}function w(){l!==s&&qs(l),h=0,i=u=r=l=s}function _(){return l===s?o:x($c())}function S(){var t=$c(),n=b(t);if(i=arguments,r=this,u=t,n){if(l===s)return g(u);if(p)return qs(l),l=ko(y,e),v(u)}return l===s&&(l=ko(y,e)),o}return e=Zu(e)||0,Au(n)&&(d=!!n.leading,p="maxWait"in n,a=p?ze(Zu(n.maxWait)||0,e):a,f="trailing"in n?!!n.trailing:f),S.cancel=w,S.flush=_,S}var Dc=xs((function(t,e){return xr(t,1,e)})),Nc=xs((function(t,e,n){return xr(t,Zu(e)||0,n)}));function Rc(t){return ja(t,$)}function zc(t,e){if("function"!=typeof t||null!=e&&"function"!=typeof e)throw new se(c);var n=function(){var i=arguments,r=e?e.apply(this,i):i[0],s=n.cache;if(s.has(r))return s.get(r);var a=t.apply(this,i);return n.cache=s.set(r,a)||s,a};return n.cache=new(zc.Cache||Hi),n}function Fc(t){if("function"!=typeof t)throw new se(c);return function(){var e=arguments;switch(e.length){case 0:return!t.call(this);case 1:return!t.call(this,e[0]);case 2:return!t.call(this,e[0],e[1]);case 3:return!t.call(this,e[0],e[1],e[2])}return!t.apply(this,e)}}function Vc(t){return Ic(2,t)}zc.Cache=Hi;var Hc=Ws((function(t,e){e=1==e.length&&lu(e[0])?$n(e[0],Zn(Ha())):$n($r(e,1),Zn(Ha()));var n=e.length;return xs((function(i){var r=-1,s=Fe(i.length,n);while(++r=e})),ou=Wr(function(){return arguments}())?Wr:function(t){return ku(t)&&he.call(t,"callee")&&!Ae.call(t,"callee")},lu=n.isArray,cu=fn?Zn(fn):Ur;function uu(t){return null!=t&&Su(t.length)&&!wu(t)}function hu(t){return ku(t)&&uu(t)}function du(t){return!0===t||!1===t||ku(t)&&Br(t)==Y}var pu=Be||Gd,fu=vn?Zn(vn):qr;function vu(t){return ku(t)&&1===t.nodeType&&!Eu(t)}function gu(t){if(null==t)return!0;if(uu(t)&&(lu(t)||"string"==typeof t||"function"==typeof t.splice||pu(t)||zu(t)||ou(t)))return!t.length;var e=Za(t);if(e==Q||e==at)return!t.size;if(po(t))return!ns(t).length;for(var n in t)if(he.call(t,n))return!1;return!0}function mu(t,e){return Yr(t,e)}function bu(t,e,n){n="function"==typeof n?n:s;var i=n?n(t,e):s;return i===s?Yr(t,e,s,n):!!i}function yu(t){if(!ku(t))return!1;var e=Br(t);return e==Z||e==K||"string"==typeof t.message&&"string"==typeof t.name&&!Eu(t)}function xu(t){return"number"==typeof t&&De(t)}function wu(t){if(!Au(t))return!1;var e=Br(t);return e==X||e==J||e==q||e==rt}function _u(t){return"number"==typeof t&&t==Gu(t)}function Su(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=D}function Au(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}function ku(t){return null!=t&&"object"==typeof t}var Cu=gn?Zn(gn):Kr;function Ou(t,e){return t===e||Zr(t,e,Ua(e))}function $u(t,e,n){return n="function"==typeof n?n:s,Zr(t,e,Ua(e),n)}function Pu(t){return Tu(t)&&t!=+t}function ju(t){if(ho(t))throw new r(l);return Xr(t)}function Iu(t){return null===t}function Lu(t){return null==t}function Tu(t){return"number"==typeof t||ku(t)&&Br(t)==tt}function Eu(t){if(!ku(t)||Br(t)!=nt)return!1;var e=_e(t);if(null===e)return!0;var n=he.call(e,"constructor")&&e.constructor;return"function"==typeof n&&n instanceof n&&ue.call(n)==ve}var Mu=mn?Zn(mn):Jr;function Bu(t){return _u(t)&&t>=-D&&t<=D}var Du=bn?Zn(bn):Qr;function Nu(t){return"string"==typeof t||!lu(t)&&ku(t)&&Br(t)==ot}function Ru(t){return"symbol"==typeof t||ku(t)&&Br(t)==lt}var zu=yn?Zn(yn):ts;function Fu(t){return t===s}function Vu(t){return ku(t)&&Za(t)==ut}function Hu(t){return ku(t)&&Br(t)==ht}var Wu=ka(rs),Uu=ka((function(t,e){return t<=e}));function qu(t){if(!t)return[];if(uu(t))return Nu(t)?mi(t):ia(t);if(Oe&&t[Oe])return li(t[Oe]());var e=Za(t),n=e==Q?ci:e==at?di:Fh;return n(t)}function Yu(t){if(!t)return 0===t?t:0;if(t=Zu(t),t===B||t===-B){var e=t<0?-1:1;return e*N}return t===t?t:0}function Gu(t){var e=Yu(t),n=e%1;return e===e?n?e-n:e:0}function Ku(t){return t?gr(Gu(t),0,z):0}function Zu(t){if("number"==typeof t)return t;if(Ru(t))return R;if(Au(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=Au(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=Kn(t);var n=Kt.test(t);return n||Xt.test(t)?sn(t.slice(2),n?2:8):Gt.test(t)?R:+t}function Xu(t){return ra(t,Sh(t))}function Ju(t){return t?gr(Gu(t),-D,D):0===t?t:0}function Qu(t){return null==t?"":Ts(t)}var th=la((function(t,e){if(po(e)||uu(e))ra(e,_h(e),t);else for(var n in e)he.call(e,n)&&cr(t,n,e[n])})),eh=la((function(t,e){ra(e,Sh(e),t)})),nh=la((function(t,e,n,i){ra(e,Sh(e),t,i)})),ih=la((function(t,e,n,i){ra(e,_h(e),t,i)})),rh=Da(vr);function sh(t,e){var n=Si(t);return null==e?n:dr(n,e)}var ah=xs((function(t,e){t=ne(t);var n=-1,i=e.length,r=i>2?e[2]:s;r&&ao(e[0],e[1],r)&&(i=1);while(++n1),e})),ra(t,Ra(t),n),i&&(n=mr(n,f|v|g,Ta));var r=e.length;while(r--)Ms(n,e[r]);return n}));function Ph(t,e){return Ih(t,Fc(Ha(e)))}var jh=Da((function(t,e){return null==t?{}:ds(t,e)}));function Ih(t,e){if(null==t)return{};var n=$n(Ra(t),(function(t){return[t]}));return e=Ha(e),ps(t,n,(function(t,n){return e(t,n[0])}))}function Lh(t,e,n){e=Hs(e,t);var i=-1,r=e.length;r||(r=1,t=s);while(++ie){var i=t;t=e,e=i}if(n||t%1||e%1){var r=qe();return Fe(t+r*(e-t+rn("1e-"+((r+"").length-1))),e)}return ms(t,e)}var qh=pa((function(t,e,n){return e=e.toLowerCase(),t+(n?Yh(e):e)}));function Yh(t){return xd(Qu(t).toLowerCase())}function Gh(t){return t=Qu(t),t&&t.replace(Qt,ni).replace(We,"")}function Kh(t,e,n){t=Qu(t),e=Ts(e);var i=t.length;n=n===s?i:gr(Gu(n),0,i);var r=n;return n-=e.length,n>=0&&t.slice(n,r)==e}function Zh(t){return t=Qu(t),t&&Pt.test(t)?t.replace(Ot,ii):t}function Xh(t){return t=Qu(t),t&&Dt.test(t)?t.replace(Bt,"\\$&"):t}var Jh=pa((function(t,e,n){return t+(n?"-":"")+e.toLowerCase()})),Qh=pa((function(t,e,n){return t+(n?" ":"")+e.toLowerCase()})),td=da("toLowerCase");function ed(t,e,n){t=Qu(t),e=Gu(e);var i=e?gi(t):0;if(!e||i>=e)return t;var r=(e-i)/2;return _a(Ee(r),n)+t+_a(Te(r),n)}function nd(t,e,n){t=Qu(t),e=Gu(e);var i=e?gi(t):0;return e&&i>>0,n?(t=Qu(t),t&&("string"==typeof e||null!=e&&!Mu(e))&&(e=Ts(e),!e&&ai(t))?Us(mi(t),0,n):t.split(e,n)):[]}var cd=pa((function(t,e,n){return t+(n?" ":"")+xd(e)}));function ud(t,e,n){return t=Qu(t),n=null==n?0:gr(Gu(n),0,t.length),e=Ts(e),t.slice(n,n+e.length)==e}function hd(t,e,n){var i=wi.templateSettings;n&&ao(t,e,n)&&(e=s),t=Qu(t),e=nh({},e,i,Ia);var a,o,l=nh({},e.imports,i.imports,Ia),c=_h(l),h=Xn(l,c),d=0,p=e.interpolate||te,f="__p += '",v=ie((e.escape||te).source+"|"+p.source+"|"+(p===Lt?qt:te).source+"|"+(e.evaluate||te).source+"|$","g"),g="//# sourceURL="+(he.call(e,"sourceURL")?(e.sourceURL+"").replace(/\s/g," "):"lodash.templateSources["+ ++Ze+"]")+"\n";t.replace(v,(function(e,n,i,r,s,l){return i||(i=r),f+=t.slice(d,l).replace(ee,ri),n&&(a=!0,f+="' +\n__e("+n+") +\n'"),s&&(o=!0,f+="';\n"+s+";\n__p += '"),i&&(f+="' +\n((__t = ("+i+")) == null ? '' : __t) +\n'"),d=l+e.length,e})),f+="';\n";var m=he.call(e,"variable")&&e.variable;if(m){if(Wt.test(m))throw new r(u)}else f="with (obj) {\n"+f+"\n}\n";f=(o?f.replace(St,""):f).replace(At,"$1").replace(kt,"$1;"),f="function("+(m||"obj")+") {\n"+(m?"":"obj || (obj = {});\n")+"var __t, __p = ''"+(a?", __e = _.escape":"")+(o?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+f+"return __p\n}";var b=_d((function(){return Rt(c,g+"return "+f).apply(s,h)}));if(b.source=f,yu(b))throw b;return b}function dd(t){return Qu(t).toLowerCase()}function pd(t){return Qu(t).toUpperCase()}function fd(t,e,n){if(t=Qu(t),t&&(n||e===s))return Kn(t);if(!t||!(e=Ts(e)))return t;var i=mi(t),r=mi(e),a=Qn(i,r),o=ti(i,r)+1;return Us(i,a,o).join("")}function vd(t,e,n){if(t=Qu(t),t&&(n||e===s))return t.slice(0,bi(t)+1);if(!t||!(e=Ts(e)))return t;var i=mi(t),r=ti(i,mi(e))+1;return Us(i,0,r).join("")}function gd(t,e,n){if(t=Qu(t),t&&(n||e===s))return t.replace(Nt,"");if(!t||!(e=Ts(e)))return t;var i=mi(t),r=Qn(i,mi(e));return Us(i,r).join("")}function md(t,e){var n=P,i=j;if(Au(e)){var r="separator"in e?e.separator:r;n="length"in e?Gu(e.length):n,i="omission"in e?Ts(e.omission):i}t=Qu(t);var a=t.length;if(ai(t)){var o=mi(t);a=o.length}if(n>=a)return t;var l=n-gi(i);if(l<1)return i;var c=o?Us(o,0,l).join(""):t.slice(0,l);if(r===s)return c+i;if(o&&(l+=c.length-l),Mu(r)){if(t.slice(l).search(r)){var u,h=c;r.global||(r=ie(r.source,Qu(Yt.exec(r))+"g")),r.lastIndex=0;while(u=r.exec(h))var d=u.index;c=c.slice(0,d===s?l:d)}}else if(t.indexOf(Ts(r),l)!=l){var p=c.lastIndexOf(r);p>-1&&(c=c.slice(0,p))}return c+i}function bd(t){return t=Qu(t),t&&$t.test(t)?t.replace(Ct,yi):t}var yd=pa((function(t,e,n){return t+(n?" ":"")+e.toUpperCase()})),xd=da("toUpperCase");function wd(t,e,n){return t=Qu(t),e=n?s:e,e===s?oi(t)?_i(t):Mn(t):t.match(e)||[]}var _d=xs((function(t,e){try{return xn(t,s,e)}catch(n){return yu(n)?n:new r(n)}})),Sd=Da((function(t,e){return _n(e,(function(e){e=Io(e),fr(t,e,Lc(t[e],t))})),t}));function Ad(t){var e=null==t?0:t.length,n=Ha();return t=e?$n(t,(function(t){if("function"!=typeof t[1])throw new se(c);return[n(t[0]),t[1]]})):[],xs((function(n){var i=-1;while(++iD)return[];var n=z,i=Fe(t,z);e=Ha(e),t-=z;var r=Yn(i,e);while(++n0||e<0)?new Oi(n):(t<0?n=n.takeRight(-t):t&&(n=n.drop(t)),e!==s&&(e=Gu(e),n=e<0?n.dropRight(-e):n.take(e-t)),n)},Oi.prototype.takeRightWhile=function(t){return this.reverse().takeWhile(t).reverse()},Oi.prototype.toArray=function(){return this.take(z)},Ir(Oi.prototype,(function(t,e){var n=/^(?:filter|find|map|reject)|While$/.test(e),i=/^(?:head|last)$/.test(e),r=wi[i?"take"+("last"==e?"Right":""):e],a=i||/^find/.test(e);r&&(wi.prototype[e]=function(){var e=this.__wrapped__,o=i?[1]:arguments,l=e instanceof Oi,c=o[0],u=l||lu(e),h=function(t){var e=r.apply(wi,Pn([t],o));return i&&d?e[0]:e};u&&n&&"function"==typeof c&&1!=c.length&&(l=u=!1);var d=this.__chain__,p=!!this.__actions__.length,f=a&&!d,v=l&&!p;if(!a&&u){e=v?e:new Oi(this);var g=t.apply(e,o);return g.__actions__.push({func:Yl,args:[h],thisArg:s}),new Ci(g,d)}return f&&v?t.apply(this,o):(g=this.thru(h),f?i?g.value()[0]:g.value():g)})})),_n(["pop","push","shift","sort","splice","unshift"],(function(t){var e=ae[t],n=/^(?:push|sort|unshift)$/.test(t)?"tap":"thru",i=/^(?:pop|shift)$/.test(t);wi.prototype[t]=function(){var t=arguments;if(i&&!this.__chain__){var r=this.value();return e.apply(lu(r)?r:[],t)}return this[n]((function(n){return e.apply(lu(n)?n:[],t)}))}})),Ir(Oi.prototype,(function(t,e){var n=wi[e];if(n){var i=n.name+"";he.call(cn,i)||(cn[i]=[]),cn[i].push({name:e,func:n})}})),cn[ba(s,x).name]=[{name:"wrapper",func:s}],Oi.prototype.clone=$i,Oi.prototype.reverse=Pi,Oi.prototype.value=ji,wi.prototype.at=Gl,wi.prototype.chain=Kl,wi.prototype.commit=Zl,wi.prototype.next=Xl,wi.prototype.plant=Ql,wi.prototype.reverse=tc,wi.prototype.toJSON=wi.prototype.valueOf=wi.prototype.value=ec,wi.prototype.first=wi.prototype.head,Oe&&(wi.prototype[Oe]=Jl),wi},Ai=Si();ln._=Ai,r=function(){return Ai}.call(e,n,e,i),r===s||(i.exports=r)}).call(this)}).call(this,n("c8ba"),n("62e4")(t))},"2f62":function(t,e,n){"use strict";(function(t){ -/*! - * vuex v3.6.2 - * (c) 2021 Evan You - * @license MIT - */ -function i(t){var e=Number(t.version.split(".")[0]);if(e>=2)t.mixin({beforeCreate:i});else{var n=t.prototype._init;t.prototype._init=function(t){void 0===t&&(t={}),t.init=t.init?[i].concat(t.init):i,n.call(this,t)}}function i(){var t=this.$options;t.store?this.$store="function"===typeof t.store?t.store():t.store:t.parent&&t.parent.$store&&(this.$store=t.parent.$store)}}n.d(e,"b",(function(){return B})),n.d(e,"c",(function(){return M})),n.d(e,"d",(function(){return E})),n.d(e,"e",(function(){return T}));var r="undefined"!==typeof window?window:"undefined"!==typeof t?t:{},s=r.__VUE_DEVTOOLS_GLOBAL_HOOK__;function a(t){s&&(t._devtoolHook=s,s.emit("vuex:init",t),s.on("vuex:travel-to-state",(function(e){t.replaceState(e)})),t.subscribe((function(t,e){s.emit("vuex:mutation",t,e)}),{prepend:!0}),t.subscribeAction((function(t,e){s.emit("vuex:action",t,e)}),{prepend:!0}))}function o(t,e){return t.filter(e)[0]}function l(t,e){if(void 0===e&&(e=[]),null===t||"object"!==typeof t)return t;var n=o(e,(function(e){return e.original===t}));if(n)return n.copy;var i=Array.isArray(t)?[]:{};return e.push({original:t,copy:i}),Object.keys(t).forEach((function(n){i[n]=l(t[n],e)})),i}function c(t,e){Object.keys(t).forEach((function(n){return e(t[n],n)}))}function u(t){return null!==t&&"object"===typeof t}function h(t){return t&&"function"===typeof t.then}function d(t,e){return function(){return t(e)}}var p=function(t,e){this.runtime=e,this._children=Object.create(null),this._rawModule=t;var n=t.state;this.state=("function"===typeof n?n():n)||{}},f={namespaced:{configurable:!0}};f.namespaced.get=function(){return!!this._rawModule.namespaced},p.prototype.addChild=function(t,e){this._children[t]=e},p.prototype.removeChild=function(t){delete this._children[t]},p.prototype.getChild=function(t){return this._children[t]},p.prototype.hasChild=function(t){return t in this._children},p.prototype.update=function(t){this._rawModule.namespaced=t.namespaced,t.actions&&(this._rawModule.actions=t.actions),t.mutations&&(this._rawModule.mutations=t.mutations),t.getters&&(this._rawModule.getters=t.getters)},p.prototype.forEachChild=function(t){c(this._children,t)},p.prototype.forEachGetter=function(t){this._rawModule.getters&&c(this._rawModule.getters,t)},p.prototype.forEachAction=function(t){this._rawModule.actions&&c(this._rawModule.actions,t)},p.prototype.forEachMutation=function(t){this._rawModule.mutations&&c(this._rawModule.mutations,t)},Object.defineProperties(p.prototype,f);var v=function(t){this.register([],t,!1)};function g(t,e,n){if(e.update(n),n.modules)for(var i in n.modules){if(!e.getChild(i))return void 0;g(t.concat(i),e.getChild(i),n.modules[i])}}v.prototype.get=function(t){return t.reduce((function(t,e){return t.getChild(e)}),this.root)},v.prototype.getNamespace=function(t){var e=this.root;return t.reduce((function(t,n){return e=e.getChild(n),t+(e.namespaced?n+"/":"")}),"")},v.prototype.update=function(t){g([],this.root,t)},v.prototype.register=function(t,e,n){var i=this;void 0===n&&(n=!0);var r=new p(e,n);if(0===t.length)this.root=r;else{var s=this.get(t.slice(0,-1));s.addChild(t[t.length-1],r)}e.modules&&c(e.modules,(function(e,r){i.register(t.concat(r),e,n)}))},v.prototype.unregister=function(t){var e=this.get(t.slice(0,-1)),n=t[t.length-1],i=e.getChild(n);i&&i.runtime&&e.removeChild(n)},v.prototype.isRegistered=function(t){var e=this.get(t.slice(0,-1)),n=t[t.length-1];return!!e&&e.hasChild(n)};var m;var b=function(t){var e=this;void 0===t&&(t={}),!m&&"undefined"!==typeof window&&window.Vue&&L(window.Vue);var n=t.plugins;void 0===n&&(n=[]);var i=t.strict;void 0===i&&(i=!1),this._committing=!1,this._actions=Object.create(null),this._actionSubscribers=[],this._mutations=Object.create(null),this._wrappedGetters=Object.create(null),this._modules=new v(t),this._modulesNamespaceMap=Object.create(null),this._subscribers=[],this._watcherVM=new m,this._makeLocalGettersCache=Object.create(null);var r=this,s=this,o=s.dispatch,l=s.commit;this.dispatch=function(t,e){return o.call(r,t,e)},this.commit=function(t,e,n){return l.call(r,t,e,n)},this.strict=i;var c=this._modules.root.state;S(this,c,[],this._modules.root),_(this,c),n.forEach((function(t){return t(e)}));var u=void 0!==t.devtools?t.devtools:m.config.devtools;u&&a(this)},y={state:{configurable:!0}};function x(t,e,n){return e.indexOf(t)<0&&(n&&n.prepend?e.unshift(t):e.push(t)),function(){var n=e.indexOf(t);n>-1&&e.splice(n,1)}}function w(t,e){t._actions=Object.create(null),t._mutations=Object.create(null),t._wrappedGetters=Object.create(null),t._modulesNamespaceMap=Object.create(null);var n=t.state;S(t,n,[],t._modules.root,!0),_(t,n,e)}function _(t,e,n){var i=t._vm;t.getters={},t._makeLocalGettersCache=Object.create(null);var r=t._wrappedGetters,s={};c(r,(function(e,n){s[n]=d(e,t),Object.defineProperty(t.getters,n,{get:function(){return t._vm[n]},enumerable:!0})}));var a=m.config.silent;m.config.silent=!0,t._vm=new m({data:{$$state:e},computed:s}),m.config.silent=a,t.strict&&P(t),i&&(n&&t._withCommit((function(){i._data.$$state=null})),m.nextTick((function(){return i.$destroy()})))}function S(t,e,n,i,r){var s=!n.length,a=t._modules.getNamespace(n);if(i.namespaced&&(t._modulesNamespaceMap[a],t._modulesNamespaceMap[a]=i),!s&&!r){var o=j(e,n.slice(0,-1)),l=n[n.length-1];t._withCommit((function(){m.set(o,l,i.state)}))}var c=i.context=A(t,a,n);i.forEachMutation((function(e,n){var i=a+n;C(t,i,e,c)})),i.forEachAction((function(e,n){var i=e.root?n:a+n,r=e.handler||e;O(t,i,r,c)})),i.forEachGetter((function(e,n){var i=a+n;$(t,i,e,c)})),i.forEachChild((function(i,s){S(t,e,n.concat(s),i,r)}))}function A(t,e,n){var i=""===e,r={dispatch:i?t.dispatch:function(n,i,r){var s=I(n,i,r),a=s.payload,o=s.options,l=s.type;return o&&o.root||(l=e+l),t.dispatch(l,a)},commit:i?t.commit:function(n,i,r){var s=I(n,i,r),a=s.payload,o=s.options,l=s.type;o&&o.root||(l=e+l),t.commit(l,a,o)}};return Object.defineProperties(r,{getters:{get:i?function(){return t.getters}:function(){return k(t,e)}},state:{get:function(){return j(t.state,n)}}}),r}function k(t,e){if(!t._makeLocalGettersCache[e]){var n={},i=e.length;Object.keys(t.getters).forEach((function(r){if(r.slice(0,i)===e){var s=r.slice(i);Object.defineProperty(n,s,{get:function(){return t.getters[r]},enumerable:!0})}})),t._makeLocalGettersCache[e]=n}return t._makeLocalGettersCache[e]}function C(t,e,n,i){var r=t._mutations[e]||(t._mutations[e]=[]);r.push((function(e){n.call(t,i.state,e)}))}function O(t,e,n,i){var r=t._actions[e]||(t._actions[e]=[]);r.push((function(e){var r=n.call(t,{dispatch:i.dispatch,commit:i.commit,getters:i.getters,state:i.state,rootGetters:t.getters,rootState:t.state},e);return h(r)||(r=Promise.resolve(r)),t._devtoolHook?r.catch((function(e){throw t._devtoolHook.emit("vuex:error",e),e})):r}))}function $(t,e,n,i){t._wrappedGetters[e]||(t._wrappedGetters[e]=function(t){return n(i.state,i.getters,t.state,t.getters)})}function P(t){t._vm.$watch((function(){return this._data.$$state}),(function(){0}),{deep:!0,sync:!0})}function j(t,e){return e.reduce((function(t,e){return t[e]}),t)}function I(t,e,n){return u(t)&&t.type&&(n=e,e=t,t=t.type),{type:t,payload:e,options:n}}function L(t){m&&t===m||(m=t,i(m))}y.state.get=function(){return this._vm._data.$$state},y.state.set=function(t){0},b.prototype.commit=function(t,e,n){var i=this,r=I(t,e,n),s=r.type,a=r.payload,o=(r.options,{type:s,payload:a}),l=this._mutations[s];l&&(this._withCommit((function(){l.forEach((function(t){t(a)}))})),this._subscribers.slice().forEach((function(t){return t(o,i.state)})))},b.prototype.dispatch=function(t,e){var n=this,i=I(t,e),r=i.type,s=i.payload,a={type:r,payload:s},o=this._actions[r];if(o){try{this._actionSubscribers.slice().filter((function(t){return t.before})).forEach((function(t){return t.before(a,n.state)}))}catch(c){0}var l=o.length>1?Promise.all(o.map((function(t){return t(s)}))):o[0](s);return new Promise((function(t,e){l.then((function(e){try{n._actionSubscribers.filter((function(t){return t.after})).forEach((function(t){return t.after(a,n.state)}))}catch(c){0}t(e)}),(function(t){try{n._actionSubscribers.filter((function(t){return t.error})).forEach((function(e){return e.error(a,n.state,t)}))}catch(c){0}e(t)}))}))}},b.prototype.subscribe=function(t,e){return x(t,this._subscribers,e)},b.prototype.subscribeAction=function(t,e){var n="function"===typeof t?{before:t}:t;return x(n,this._actionSubscribers,e)},b.prototype.watch=function(t,e,n){var i=this;return this._watcherVM.$watch((function(){return t(i.state,i.getters)}),e,n)},b.prototype.replaceState=function(t){var e=this;this._withCommit((function(){e._vm._data.$$state=t}))},b.prototype.registerModule=function(t,e,n){void 0===n&&(n={}),"string"===typeof t&&(t=[t]),this._modules.register(t,e),S(this,this.state,t,this._modules.get(t),n.preserveState),_(this,this.state)},b.prototype.unregisterModule=function(t){var e=this;"string"===typeof t&&(t=[t]),this._modules.unregister(t),this._withCommit((function(){var n=j(e.state,t.slice(0,-1));m.delete(n,t[t.length-1])})),w(this)},b.prototype.hasModule=function(t){return"string"===typeof t&&(t=[t]),this._modules.isRegistered(t)},b.prototype.hotUpdate=function(t){this._modules.update(t),w(this,!0)},b.prototype._withCommit=function(t){var e=this._committing;this._committing=!0,t(),this._committing=e},Object.defineProperties(b.prototype,y);var T=z((function(t,e){var n={};return N(e).forEach((function(e){var i=e.key,r=e.val;n[i]=function(){var e=this.$store.state,n=this.$store.getters;if(t){var i=F(this.$store,"mapState",t);if(!i)return;e=i.context.state,n=i.context.getters}return"function"===typeof r?r.call(this,e,n):e[r]},n[i].vuex=!0})),n})),E=z((function(t,e){var n={};return N(e).forEach((function(e){var i=e.key,r=e.val;n[i]=function(){var e=[],n=arguments.length;while(n--)e[n]=arguments[n];var i=this.$store.commit;if(t){var s=F(this.$store,"mapMutations",t);if(!s)return;i=s.context.commit}return"function"===typeof r?r.apply(this,[i].concat(e)):i.apply(this.$store,[r].concat(e))}})),n})),M=z((function(t,e){var n={};return N(e).forEach((function(e){var i=e.key,r=e.val;r=t+r,n[i]=function(){if(!t||F(this.$store,"mapGetters",t))return this.$store.getters[r]},n[i].vuex=!0})),n})),B=z((function(t,e){var n={};return N(e).forEach((function(e){var i=e.key,r=e.val;n[i]=function(){var e=[],n=arguments.length;while(n--)e[n]=arguments[n];var i=this.$store.dispatch;if(t){var s=F(this.$store,"mapActions",t);if(!s)return;i=s.context.dispatch}return"function"===typeof r?r.apply(this,[i].concat(e)):i.apply(this.$store,[r].concat(e))}})),n})),D=function(t){return{mapState:T.bind(null,t),mapGetters:M.bind(null,t),mapMutations:E.bind(null,t),mapActions:B.bind(null,t)}};function N(t){return R(t)?Array.isArray(t)?t.map((function(t){return{key:t,val:t}})):Object.keys(t).map((function(e){return{key:e,val:t[e]}})):[]}function R(t){return Array.isArray(t)||u(t)}function z(t){return function(e,n){return"string"!==typeof e?(n=e,e=""):"/"!==e.charAt(e.length-1)&&(e+="/"),t(e,n)}}function F(t,e,n){var i=t._modulesNamespaceMap[n];return i}function V(t){void 0===t&&(t={});var e=t.collapsed;void 0===e&&(e=!0);var n=t.filter;void 0===n&&(n=function(t,e,n){return!0});var i=t.transformer;void 0===i&&(i=function(t){return t});var r=t.mutationTransformer;void 0===r&&(r=function(t){return t});var s=t.actionFilter;void 0===s&&(s=function(t,e){return!0});var a=t.actionTransformer;void 0===a&&(a=function(t){return t});var o=t.logMutations;void 0===o&&(o=!0);var c=t.logActions;void 0===c&&(c=!0);var u=t.logger;return void 0===u&&(u=console),function(t){var h=l(t.state);"undefined"!==typeof u&&(o&&t.subscribe((function(t,s){var a=l(s);if(n(t,h,a)){var o=U(),c=r(t),d="mutation "+t.type+o;H(u,d,e),u.log("%c prev state","color: #9E9E9E; font-weight: bold",i(h)),u.log("%c mutation","color: #03A9F4; font-weight: bold",c),u.log("%c next state","color: #4CAF50; font-weight: bold",i(a)),W(u)}h=a})),c&&t.subscribeAction((function(t,n){if(s(t,n)){var i=U(),r=a(t),o="action "+t.type+i;H(u,o,e),u.log("%c action","color: #03A9F4; font-weight: bold",r),W(u)}})))}}function H(t,e,n){var i=n?t.groupCollapsed:t.group;try{i.call(t,e)}catch(r){t.log(e)}}function W(t){try{t.groupEnd()}catch(e){t.log("—— log end ——")}}function U(){var t=new Date;return" @ "+Y(t.getHours(),2)+":"+Y(t.getMinutes(),2)+":"+Y(t.getSeconds(),2)+"."+Y(t.getMilliseconds(),3)}function q(t,e){return new Array(e+1).join(t)}function Y(t,e){return q("0",e-t.toString().length)+t}var G={Store:b,install:L,version:"3.6.2",mapState:T,mapMutations:E,mapGetters:M,mapActions:B,createNamespacedHelpers:D,createLogger:V};e["a"]=G}).call(this,n("c8ba"))},"2fa4":function(t,e,n){"use strict";n("20f6");var i=n("80d2");e["a"]=Object(i["j"])("spacer","div","v-spacer")},"2fe1":function(t,e,n){"use strict";n.d(e,"a",(function(){return v}));var i=n("2b0e"); -/** - * vue-class-component v7.2.6 - * (c) 2015-present Evan You - * @license MIT - */function r(t){return r="function"===typeof Symbol&&"symbol"===typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"===typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function a(t){return o(t)||l(t)||c()}function o(t){if(Array.isArray(t)){for(var e=0,n=new Array(t.length);e1&&void 0!==arguments[1]?arguments[1]:{};e.name=e.name||t._componentTag||t.name;var n=t.prototype;Object.getOwnPropertyNames(n).forEach((function(t){if("constructor"!==t)if(b.indexOf(t)>-1)e[t]=n[t];else{var i=Object.getOwnPropertyDescriptor(n,t);void 0!==i.value?"function"===typeof i.value?(e.methods||(e.methods={}))[t]=i.value:(e.mixins||(e.mixins=[])).push({data:function(){return s({},t,i.value)}}):(i.get||i.set)&&((e.computed||(e.computed={}))[t]={get:i.get,set:i.set})}})),(e.mixins||(e.mixins=[])).push({data:function(){return m(this,t)}});var r=t.__decorators__;r&&(r.forEach((function(t){return t(e)})),delete t.__decorators__);var a=Object.getPrototypeOf(t.prototype),o=a instanceof i["default"]?a.constructor:i["default"],l=o.extend(e);return w(l,t,o),u()&&h(l,t),l}var x={prototype:!0,arguments:!0,callee:!0,caller:!0};function w(t,e,n){Object.getOwnPropertyNames(e).forEach((function(i){if(!x[i]){var r=Object.getOwnPropertyDescriptor(t,i);if(!r||r.configurable){var s=Object.getOwnPropertyDescriptor(e,i);if(!f){if("cid"===i)return;var a=Object.getOwnPropertyDescriptor(n,i);if(!g(s.value)&&a&&a.value===s.value)return}0,Object.defineProperty(t,i,s)}}}))}function _(t){return"function"===typeof t?y(t):function(e){return y(e,t)}}_.registerHooks=function(t){b.push.apply(b,a(t))},e["b"]=_},"30b5":function(t,e,n){"use strict";var i=n("c532");function r(t){return encodeURIComponent(t).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}t.exports=function(t,e,n){if(!e)return t;var s;if(n)s=n(e);else if(i.isURLSearchParams(e))s=e.toString();else{var a=[];i.forEach(e,(function(t,e){null!==t&&"undefined"!==typeof t&&(i.isArray(t)?e+="[]":t=[t],i.forEach(t,(function(t){i.isDate(t)?t=t.toISOString():i.isObject(t)&&(t=JSON.stringify(t)),a.push(r(e)+"="+r(t))})))})),s=a.join("&")}if(s){var o=t.indexOf("#");-1!==o&&(t=t.slice(0,o)),t+=(-1===t.indexOf("?")?"?":"&")+s}return t}},3206:function(t,e,n){"use strict";n.d(e,"a",(function(){return a})),n.d(e,"b",(function(){return o}));var i=n("2b0e"),r=n("d9bd");function s(t,e){return()=>Object(r["c"])(`The ${t} component must be used inside a ${e}`)}function a(t,e,n){const r=e&&n?{register:s(e,n),unregister:s(e,n)}:null;return i["default"].extend({name:"registrable-inject",inject:{[t]:{default:r}}})}function o(t,e=!1){return i["default"].extend({name:"registrable-provide",provide(){return{[t]:e?this:{register:this.register,unregister:this.unregister}}}})}},"326d":function(t,e,n){"use strict";var i=n("e449");e["a"]=i["a"]},3408:function(t,e,n){},3410:function(t,e,n){var i=n("23e7"),r=n("d039"),s=n("7b0b"),a=n("e163"),o=n("e177"),l=r((function(){a(1)}));i({target:"Object",stat:!0,forced:l,sham:!o},{getPrototypeOf:function(t){return a(s(t))}})},"342f":function(t,e,n){var i=n("d066");t.exports=i("navigator","userAgent")||""},"34c3":function(t,e,n){"use strict";var i=n("2b0e");e["a"]=i["default"].extend({name:"v-list-item-icon",functional:!0,render(t,{data:e,children:n}){return e.staticClass=("v-list-item__icon "+(e.staticClass||"")).trim(),t("div",e,n)}})},"34eb":function(t,e,n){(function(i){function r(){return!("undefined"===typeof window||!window.process||"renderer"!==window.process.type&&!window.process.__nwjs)||("undefined"===typeof navigator||!navigator.userAgent||!navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))&&("undefined"!==typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||"undefined"!==typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||"undefined"!==typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||"undefined"!==typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/))}function s(e){if(e[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+e[0]+(this.useColors?"%c ":" ")+"+"+t.exports.humanize(this.diff),!this.useColors)return;const n="color: "+this.color;e.splice(1,0,n,"color: inherit");let i=0,r=0;e[0].replace(/%[a-zA-Z%]/g,t=>{"%%"!==t&&(i++,"%c"===t&&(r=i))}),e.splice(r,0,n)}function a(t){try{t?e.storage.setItem("debug",t):e.storage.removeItem("debug")}catch(n){}}function o(){let t;try{t=e.storage.getItem("debug")}catch(n){}return!t&&"undefined"!==typeof i&&"env"in i&&(t=Object({NODE_ENV:"production",BASE_URL:""}).DEBUG),t}function l(){try{return localStorage}catch(t){}}e.formatArgs=s,e.save=a,e.load=o,e.useColors=r,e.storage=l(),e.destroy=(()=>{let t=!1;return()=>{t||(t=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})(),e.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"],e.log=console.debug||console.log||(()=>{}),t.exports=n("dc90")(e);const{formatters:c}=t.exports;c.j=function(t){try{return JSON.stringify(t)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}}).call(this,n("4362"))},"34ef":function(t,e,n){"use strict";var i=n("cc20");e["a"]=i["a"]},"35a1":function(t,e,n){var i=n("f5df"),r=n("3f8c"),s=n("b622"),a=s("iterator");t.exports=function(t){if(void 0!=t)return t[a]||t["@@iterator"]||r[i(t)]}},"368e":function(t,e,n){},"36a7":function(t,e,n){},"37c6":function(t,e,n){"use strict";var i=n("8e36");e["a"]=i["a"]},"37e8":function(t,e,n){var i=n("83ab"),r=n("9bf2"),s=n("825a"),a=n("df75");t.exports=i?Object.defineProperties:function(t,e){s(t);var n,i=a(e),o=i.length,l=0;while(o>l)r.f(t,n=i[l++],e[n]);return t}},3835:function(t,e,n){"use strict";function i(t){if(Array.isArray(t))return t}n.d(e,"a",(function(){return o}));n("a4d3"),n("e01a"),n("d3b7"),n("d28b"),n("3ca3"),n("ddb0");function r(t,e){var n=null==t?null:"undefined"!==typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,r,s=[],a=!0,o=!1;try{for(n=n.call(t);!(a=(i=n.next()).done);a=!0)if(s.push(i.value),e&&s.length===e)break}catch(l){o=!0,r=l}finally{try{a||null==n["return"]||n["return"]()}finally{if(o)throw r}}return s}}var s=n("06c5");function a(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function o(t,e){return i(t)||r(t,e)||Object(s["a"])(t,e)||a()}},"387f":function(t,e,n){"use strict";t.exports=function(t,e,n,i,r){return t.config=e,n&&(t.code=n),t.request=i,t.response=r,t.isAxiosError=!0,t.toJSON=function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code}},t}},"38cb":function(t,e,n){"use strict";var i=n("a9ad"),r=n("7560"),s=n("3206"),a=n("80d2"),o=n("d9bd"),l=n("58df");const c=Object(l["a"])(i["a"],Object(s["a"])("form"),r["a"]);e["a"]=c.extend({name:"validatable",props:{disabled:Boolean,error:Boolean,errorCount:{type:[Number,String],default:1},errorMessages:{type:[String,Array],default:()=>[]},messages:{type:[String,Array],default:()=>[]},readonly:Boolean,rules:{type:Array,default:()=>[]},success:Boolean,successMessages:{type:[String,Array],default:()=>[]},validateOnBlur:Boolean,value:{required:!1}},data(){return{errorBucket:[],hasColor:!1,hasFocused:!1,hasInput:!1,isFocused:!1,isResetting:!1,lazyValue:this.value,valid:!1}},computed:{computedColor(){if(!this.isDisabled)return this.color?this.color:this.isDark&&!this.appIsDark?"white":"primary"},hasError(){return this.internalErrorMessages.length>0||this.errorBucket.length>0||this.error},hasSuccess(){return this.internalSuccessMessages.length>0||this.success},externalError(){return this.internalErrorMessages.length>0||this.error},hasMessages(){return this.validationTarget.length>0},hasState(){return!this.isDisabled&&(this.hasSuccess||this.shouldValidate&&this.hasError)},internalErrorMessages(){return this.genInternalMessages(this.errorMessages)},internalMessages(){return this.genInternalMessages(this.messages)},internalSuccessMessages(){return this.genInternalMessages(this.successMessages)},internalValue:{get(){return this.lazyValue},set(t){this.lazyValue=t,this.$emit("input",t)}},isDisabled(){return this.disabled||!!this.form&&this.form.disabled},isInteractive(){return!this.isDisabled&&!this.isReadonly},isReadonly(){return this.readonly||!!this.form&&this.form.readonly},shouldValidate(){return!!this.externalError||!this.isResetting&&(this.validateOnBlur?this.hasFocused&&!this.isFocused:this.hasInput||this.hasFocused)},validations(){return this.validationTarget.slice(0,Number(this.errorCount))},validationState(){if(!this.isDisabled)return this.hasError&&this.shouldValidate?"error":this.hasSuccess?"success":this.hasColor?this.computedColor:void 0},validationTarget(){return this.internalErrorMessages.length>0?this.internalErrorMessages:this.successMessages&&this.successMessages.length>0?this.internalSuccessMessages:this.messages&&this.messages.length>0?this.internalMessages:this.shouldValidate?this.errorBucket:[]}},watch:{rules:{handler(t,e){Object(a["k"])(t,e)||this.validate()},deep:!0},internalValue(){this.hasInput=!0,this.validateOnBlur||this.$nextTick(this.validate)},isFocused(t){t||this.isDisabled||(this.hasFocused=!0,this.validateOnBlur&&this.$nextTick(this.validate))},isResetting(){setTimeout(()=>{this.hasInput=!1,this.hasFocused=!1,this.isResetting=!1,this.validate()},0)},hasError(t){this.shouldValidate&&this.$emit("update:error",t)},value(t){this.lazyValue=t}},beforeMount(){this.validate()},created(){this.form&&this.form.register(this)},beforeDestroy(){this.form&&this.form.unregister(this)},methods:{genInternalMessages(t){return t?Array.isArray(t)?t:[t]:[]},reset(){this.isResetting=!0,this.internalValue=Array.isArray(this.internalValue)?[]:null},resetValidation(){this.isResetting=!0},validate(t=!1,e){const n=[];e=e||this.internalValue,t&&(this.hasInput=this.hasFocused=!0);for(let i=0;i({calculatedMinWidth:0,closeDependents:!1}),computed:{calculatedLeft(){const{activator:t,content:e}=this.dimensions,n=!this.bottom&&!this.left&&!this.top&&!this.right,i=!1!==this.attach?t.offsetLeft:t.left;let r=0;return this.top||this.bottom||n?r=i+t.width/2-e.width/2:(this.left||this.right)&&(r=i+(this.right?t.width:-e.width)+(this.right?10:-10)),this.nudgeLeft&&(r-=parseInt(this.nudgeLeft)),this.nudgeRight&&(r+=parseInt(this.nudgeRight)),this.calcXOverflow(r,this.dimensions.content.width)+"px"},calculatedTop(){const{activator:t,content:e}=this.dimensions,n=!1!==this.attach?t.offsetTop:t.top;let i=0;return this.top||this.bottom?i=n+(this.bottom?t.height:-e.height)+(this.bottom?10:-10):(this.left||this.right)&&(i=n+t.height/2-e.height/2),this.nudgeTop&&(i-=parseInt(this.nudgeTop)),this.nudgeBottom&&(i+=parseInt(this.nudgeBottom)),this.calcYOverflow(i+this.pageYOffset)+"px"},classes(){return{"v-tooltip--top":this.top,"v-tooltip--right":this.right,"v-tooltip--bottom":this.bottom,"v-tooltip--left":this.left,"v-tooltip--attached":""===this.attach||!0===this.attach||"attach"===this.attach}},computedTransition(){return this.transition?this.transition:this.isActive?"scale-transition":"fade-transition"},offsetY(){return this.top||this.bottom},offsetX(){return this.left||this.right},styles(){return{left:this.calculatedLeft,maxWidth:Object(c["h"])(this.maxWidth),minWidth:Object(c["h"])(this.minWidth),opacity:this.isActive?.9:0,top:this.calculatedTop,zIndex:this.zIndex||this.activeZIndex}}},beforeMount(){this.$nextTick(()=>{this.value&&this.callActivate()})},mounted(){"v-slot"===Object(c["u"])(this,"activator",!0)&&Object(u["b"])("v-tooltip's activator slot must be bound, try '