├── .gitattributes ├── jackett-rss-processor-ui ├── src │ ├── app │ │ ├── modules │ │ │ └── home │ │ │ │ ├── pages │ │ │ │ ├── feed │ │ │ │ │ ├── feed.component.scss │ │ │ │ │ ├── feed.component.html │ │ │ │ │ └── feed.component.ts │ │ │ │ ├── default │ │ │ │ │ ├── default.component.scss │ │ │ │ │ ├── default.component.html │ │ │ │ │ └── default.component.ts │ │ │ │ └── snatch │ │ │ │ │ ├── snatch.component.scss │ │ │ │ │ ├── snatch.component.html │ │ │ │ │ └── snatch.component.ts │ │ │ │ ├── home.module.ts │ │ │ │ └── home.routing.ts │ │ ├── app.component.html │ │ ├── layout │ │ │ ├── content-layout │ │ │ │ ├── content-layout.component.scss │ │ │ │ ├── content-layout.component.html │ │ │ │ └── content-layout.component.ts │ │ │ └── navbar │ │ │ │ ├── navbar.component.scss │ │ │ │ ├── navbar.component.html │ │ │ │ └── navbar.component.ts │ │ ├── shared │ │ │ ├── components │ │ │ │ ├── _lists │ │ │ │ │ ├── item-list │ │ │ │ │ │ ├── item-list.component.scss │ │ │ │ │ │ ├── item-list.component.ts │ │ │ │ │ │ └── item-list.component.html │ │ │ │ │ ├── pattern-list │ │ │ │ │ │ ├── pattern-list.component.scss │ │ │ │ │ │ ├── pattern-list.component.ts │ │ │ │ │ │ └── pattern-list.component.html │ │ │ │ │ ├── snatch-list │ │ │ │ │ │ ├── snatch-list.component.scss │ │ │ │ │ │ ├── snatch-list.component.html │ │ │ │ │ │ └── snatch-list.component.ts │ │ │ │ │ └── feed-list │ │ │ │ │ │ ├── feed-list.component.scss │ │ │ │ │ │ ├── feed-list.component.html │ │ │ │ │ │ └── feed-list.component.ts │ │ │ │ ├── _dialogs │ │ │ │ │ ├── feed-dialog │ │ │ │ │ │ ├── feed-dialog.component.scss │ │ │ │ │ │ ├── feed-dialog.component.html │ │ │ │ │ │ └── feed-dialog.component.ts │ │ │ │ │ ├── confirm-dialog │ │ │ │ │ │ ├── confirm-dialog.component.scss │ │ │ │ │ │ ├── confirm-dialog.component.html │ │ │ │ │ │ └── confirm-dialog.component.ts │ │ │ │ │ └── pattern-dialog │ │ │ │ │ │ ├── pattern-dialog.component.scss │ │ │ │ │ │ ├── pattern-dialog.component.html │ │ │ │ │ │ └── pattern-dialog.component.ts │ │ │ │ ├── theme-switcher │ │ │ │ │ ├── theme-switcher.component.scss │ │ │ │ │ ├── theme-switcher.component.html │ │ │ │ │ └── theme-switcher.component.ts │ │ │ │ └── action-button │ │ │ │ │ ├── action-button.component.scss │ │ │ │ │ ├── action-button.component.html │ │ │ │ │ └── action-button.component.ts │ │ │ ├── index.ts │ │ │ ├── routes │ │ │ │ └── content-layout.routes.ts │ │ │ ├── pipes │ │ │ │ └── file-size.pipe.ts │ │ │ ├── shared.module.ts │ │ │ └── material.module.ts │ │ ├── app.component.ts │ │ ├── core │ │ │ ├── guards │ │ │ │ └── module-import.guard.ts │ │ │ ├── domain │ │ │ │ └── modules.ts │ │ │ └── services │ │ │ │ ├── snatch.service.ts │ │ │ │ ├── style-manager.service.ts │ │ │ │ ├── theme.service.ts │ │ │ │ ├── item.service.ts │ │ │ │ ├── pattern.service.ts │ │ │ │ └── feed.service.ts │ │ ├── app-routing.module.ts │ │ └── app.module.ts │ ├── scss │ │ ├── _global.scss │ │ ├── _utils.scss │ │ ├── _table.scss │ │ └── _material-override.scss │ ├── favicon.ico │ ├── environments │ │ ├── environment.prod.ts │ │ └── environment.ts │ ├── styles.scss │ ├── main.ts │ ├── index.html │ ├── test.ts │ ├── assets │ │ ├── img │ │ │ └── homepage │ │ │ │ └── github-circle-white-transparent.svg │ │ └── options.json │ └── polyfills.ts ├── proxy.config.json ├── .prettierrc ├── tsconfig.app.json ├── .editorconfig ├── tsconfig.spec.json ├── tsconfig.json ├── tsconfig.base.json ├── build.gradle ├── .gitignore ├── .browserslistrc ├── .stylelintrc ├── karma.conf.js ├── package.json ├── tslint.json └── angular.json ├── .github ├── FUNDING.yml ├── dependabot.yml └── workflows │ ├── dependabot-integration.yml │ ├── continuous-integration-core.yml │ ├── continuous-integration-ui.yml │ └── release_to_dockerhub.yml ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── settings.gradle ├── gradle.properties ├── jackett-rss-processor-core ├── src │ └── main │ │ ├── java │ │ └── space │ │ │ └── forloop │ │ │ └── rss │ │ │ ├── services │ │ │ ├── TorrentService.java │ │ │ ├── JackettService.java │ │ │ ├── ItemService.java │ │ │ ├── FeedService.java │ │ │ ├── JackettServiceImpl.java │ │ │ ├── FeedServiceImpl.java │ │ │ ├── TorrentServiceImpl.java │ │ │ └── ItemServiceImpl.java │ │ │ ├── exceptions │ │ │ └── MagnetException.java │ │ │ ├── domain │ │ │ ├── jackett │ │ │ │ ├── JackettIndexer.java │ │ │ │ ├── TorznabAttribute.java │ │ │ │ ├── AtomLink.java │ │ │ │ ├── Enclosure.java │ │ │ │ ├── Image.java │ │ │ │ ├── JacketRoot.java │ │ │ │ ├── Channel.java │ │ │ │ └── Item.java │ │ │ ├── Pattern.java │ │ │ └── Feed.java │ │ │ ├── repositories │ │ │ ├── FeedRepository.java │ │ │ └── ItemRepository.java │ │ │ ├── Application.java │ │ │ ├── controllers │ │ │ ├── ExceptionController.java │ │ │ ├── SnatchController.java │ │ │ ├── FeedController.java │ │ │ └── ItemController.java │ │ │ ├── utils │ │ │ └── DateUtils.java │ │ │ ├── filters │ │ │ └── ResourceWebFilter.java │ │ │ ├── configuration │ │ │ ├── WebClientConfig.java │ │ │ └── CacheConfig.java │ │ │ ├── tasks │ │ │ └── SyncWithJackett.java │ │ │ └── properties │ │ │ └── ApplicationProperties.java │ │ └── resources │ │ └── application.yml └── build.gradle ├── .dev └── docker-compose.yml ├── .gitignore ├── README.md ├── gradlew.bat └── gradlew /.gitattributes: -------------------------------------------------------------------------------- 1 | *.css linguist-vendored -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/app/modules/home/pages/feed/feed.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/app/modules/home/pages/default/default.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/app/modules/home/pages/snatch/snatch.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/app/layout/content-layout/content-layout.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/app/shared/components/_lists/item-list/item-list.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [peavers] 4 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/app/shared/components/_dialogs/feed-dialog/feed-dialog.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/app/shared/components/_lists/pattern-list/pattern-list.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/app/shared/components/_lists/snatch-list/snatch-list.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/app/shared/components/theme-switcher/theme-switcher.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/app/shared/components/_dialogs/confirm-dialog/confirm-dialog.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/app/shared/components/_dialogs/pattern-dialog/pattern-dialog.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/scss/_global.scss: -------------------------------------------------------------------------------- 1 | html, 2 | body { 3 | height: 100%; 4 | margin: 0; 5 | } 6 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peavers/jackett-rss-processor/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/app/shared/index.ts: -------------------------------------------------------------------------------- 1 | export * from './shared.module'; 2 | 3 | export * from './routes/content-layout.routes'; 4 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peavers/jackett-rss-processor/HEAD/jackett-rss-processor-ui/src/favicon.ico -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'jackett-rss-processor' 2 | 3 | include 'jackett-rss-processor-core' 4 | include 'jackett-rss-processor-ui' 5 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/scss/_utils.scss: -------------------------------------------------------------------------------- 1 | .blurry-text { 2 | text-shadow: 0 0 16px white !important; 3 | color: transparent !important; 4 | } 5 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | group=space.forloop.jackett-rss-processor 2 | version=0.0.1-SNAPSHOT 3 | sourceCompatibility=15 4 | targetCompatibility=15 5 | 6 | ngArtifact=webapp 7 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true, 3 | 4 | blur: false, 5 | 6 | api: '/api', 7 | }; 8 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/proxy.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "/api/*": { 3 | "target": "http://localhost:8080", 4 | "secure": false, 5 | "logLevel": "debug" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/app/layout/navbar/navbar.component.scss: -------------------------------------------------------------------------------- 1 | .spacer { 2 | flex: 1 1 auto; 3 | } 4 | 5 | .github-icon { 6 | height: 26px; 7 | margin: 0 4px 3px 0; 8 | } 9 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/environments/environment.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: false, 3 | 4 | blur: false, 5 | 6 | api: 'http://localhost:8080/api', 7 | }; 8 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/app/shared/components/action-button/action-button.component.scss: -------------------------------------------------------------------------------- 1 | .action-button-container { 2 | bottom: 27px; 3 | right: 27px; 4 | position: fixed; 5 | z-index: 999; 6 | } 7 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/styles.scss: -------------------------------------------------------------------------------- 1 | @import '~bulma'; 2 | 3 | @import 'src/scss/global'; 4 | 5 | @import 'src/scss/table'; 6 | 7 | @import 'src/scss/material-override'; 8 | 9 | @import 'src/scss/utils'; 10 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-root', 5 | templateUrl: './app.component.html', 6 | }) 7 | export class AppComponent {} 8 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/app/layout/content-layout/content-layout.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | 5 |
6 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 120, 3 | "singleQuote": true, 4 | "useTabs": false, 5 | "tabWidth": 2, 6 | "semi": true, 7 | "bracketSpacing": true, 8 | "jsxBracketSameLine": true 9 | } 10 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/app/shared/components/action-button/action-button.component.html: -------------------------------------------------------------------------------- 1 |
2 | 5 |
6 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/app/core/guards/module-import.guard.ts: -------------------------------------------------------------------------------- 1 | export function throwIfAlreadyLoaded(parentModule: any, moduleName: string) { 2 | if (parentModule) { 3 | throw new Error(`${moduleName} has already been loaded. Import ${moduleName} modules in the AppModule only.`); 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/app/shared/routes/content-layout.routes.ts: -------------------------------------------------------------------------------- 1 | import { Routes } from '@angular/router'; 2 | 3 | export const CONTENT_ROUTES: Routes = [ 4 | { 5 | path: '', 6 | loadChildren: () => import('../../modules/home/home.module').then((m) => m.HomeModule), 7 | }, 8 | ]; 9 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/scss/_table.scss: -------------------------------------------------------------------------------- 1 | table { 2 | width: 100%; 3 | } 4 | 5 | th { 6 | font-size: 13px; 7 | font-weight: 400; 8 | } 9 | 10 | th, 11 | td { 12 | display: table-cell !important; 13 | vertical-align: middle !important; 14 | } 15 | 16 | .is-editable { 17 | &:hover { 18 | cursor: pointer; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /jackett-rss-processor-core/src/main/java/space/forloop/rss/services/TorrentService.java: -------------------------------------------------------------------------------- 1 | /* Licensed under Apache-2.0 */ 2 | package space.forloop.rss.services; 3 | 4 | import reactor.core.publisher.Mono; 5 | import space.forloop.rss.domain.jackett.Item; 6 | 7 | public interface TorrentService { 8 | 9 | Mono getTorrentFile(Item item); 10 | } 11 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.base.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/app", 6 | "types": [] 7 | }, 8 | "files": ["src/main.ts", "src/polyfills.ts"], 9 | "include": ["src/**/*.d.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /jackett-rss-processor-core/src/main/java/space/forloop/rss/services/JackettService.java: -------------------------------------------------------------------------------- 1 | /* Licensed under Apache-2.0 */ 2 | package space.forloop.rss.services; 3 | 4 | import reactor.core.publisher.Mono; 5 | import space.forloop.rss.domain.jackett.JacketRoot; 6 | 7 | public interface JackettService { 8 | 9 | Mono getRemoteFeed(String feed); 10 | } 11 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.ts] 12 | quote_type = single 13 | 14 | [*.md] 15 | max_line_length = off 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.base.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/spec", 6 | "types": ["jasmine"] 7 | }, 8 | "files": ["src/test.ts", "src/polyfills.ts"], 9 | "include": ["src/**/*.spec.ts", "src/**/*.d.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /jackett-rss-processor-core/src/main/java/space/forloop/rss/exceptions/MagnetException.java: -------------------------------------------------------------------------------- 1 | /* Licensed under Apache-2.0 */ 2 | package space.forloop.rss.exceptions; 3 | 4 | public class MagnetException extends Exception { 5 | 6 | private static final String MESSAGE = "Magnet links are not supported"; 7 | 8 | public MagnetException() { 9 | 10 | super(MESSAGE); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/scss/_material-override.scss: -------------------------------------------------------------------------------- 1 | .mat-app-background { 2 | min-height: 100% !important; 3 | } 4 | 5 | .mat-dialog-content { 6 | max-height: 100vh !important; 7 | overflow: visible !important; 8 | } 9 | 10 | .mat-dialog-actions { 11 | padding: 20px 0 !important; 12 | float: right !important; 13 | } 14 | 15 | .mat-form-field { 16 | width: 100% !important; 17 | } 18 | -------------------------------------------------------------------------------- /.dev/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.7' 2 | services: 3 | 4 | jackett-rss-mongo: 5 | image: mongo:latest 6 | container_name: jackett-rss-mongo 7 | restart: unless-stopped 8 | ports: 9 | - "27017:27017" 10 | volumes: 11 | - mongo-data:/data/db 12 | logging: 13 | options: 14 | max-size: "2m" 15 | max-file: "5" 16 | 17 | volumes: 18 | mongo-data: 19 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/app/layout/content-layout/content-layout.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-content-layout', 5 | templateUrl: './content-layout.component.html', 6 | styleUrls: ['./content-layout.component.scss'], 7 | }) 8 | export class ContentLayoutComponent implements OnInit { 9 | constructor() {} 10 | 11 | ngOnInit() {} 12 | } 13 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/app/shared/components/theme-switcher/theme-switcher.component.html: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /jackett-rss-processor-core/src/main/java/space/forloop/rss/domain/jackett/JackettIndexer.java: -------------------------------------------------------------------------------- 1 | /* Licensed under Apache-2.0 */ 2 | package space.forloop.rss.domain.jackett; 3 | 4 | import lombok.AllArgsConstructor; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | @Data 9 | @AllArgsConstructor 10 | @NoArgsConstructor 11 | public class JackettIndexer { 12 | 13 | private String id; 14 | 15 | private String content; 16 | } 17 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/app/modules/home/pages/snatch/snatch.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |

Snatches

6 |
7 | 8 |
9 |
10 |
11 |
12 |
13 | -------------------------------------------------------------------------------- /jackett-rss-processor-core/src/main/java/space/forloop/rss/domain/jackett/TorznabAttribute.java: -------------------------------------------------------------------------------- 1 | /* Licensed under Apache-2.0 */ 2 | package space.forloop.rss.domain.jackett; 3 | 4 | import lombok.AllArgsConstructor; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | @Data 9 | @AllArgsConstructor 10 | @NoArgsConstructor 11 | public class TorznabAttribute { 12 | 13 | private String name; 14 | 15 | private String value; 16 | } 17 | -------------------------------------------------------------------------------- /jackett-rss-processor-core/src/main/java/space/forloop/rss/repositories/FeedRepository.java: -------------------------------------------------------------------------------- 1 | /* Licensed under Apache-2.0 */ 2 | package space.forloop.rss.repositories; 3 | 4 | import org.springframework.data.mongodb.repository.ReactiveMongoRepository; 5 | import org.springframework.stereotype.Repository; 6 | import space.forloop.rss.domain.Feed; 7 | 8 | @Repository 9 | public interface FeedRepository extends ReactiveMongoRepository {} 10 | -------------------------------------------------------------------------------- /jackett-rss-processor-core/src/main/java/space/forloop/rss/domain/jackett/AtomLink.java: -------------------------------------------------------------------------------- 1 | /* Licensed under Apache-2.0 */ 2 | package space.forloop.rss.domain.jackett; 3 | 4 | import lombok.AllArgsConstructor; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | @Data 9 | @AllArgsConstructor 10 | @NoArgsConstructor 11 | public class AtomLink { 12 | 13 | private String rel; 14 | 15 | private String href; 16 | 17 | private String type; 18 | } 19 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/main.ts: -------------------------------------------------------------------------------- 1 | import { enableProdMode } from '@angular/core'; 2 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 3 | 4 | import { AppModule } from './app/app.module'; 5 | import { environment } from './environments/environment'; 6 | 7 | if (environment.production) { 8 | enableProdMode(); 9 | } 10 | 11 | platformBrowserDynamic() 12 | .bootstrapModule(AppModule) 13 | .catch((err) => console.error(err)); 14 | -------------------------------------------------------------------------------- /jackett-rss-processor-core/src/main/java/space/forloop/rss/domain/jackett/Enclosure.java: -------------------------------------------------------------------------------- 1 | /* Licensed under Apache-2.0 */ 2 | package space.forloop.rss.domain.jackett; 3 | 4 | import lombok.AllArgsConstructor; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | @Data 9 | @AllArgsConstructor 10 | @NoArgsConstructor 11 | public class Enclosure { 12 | 13 | private String length; 14 | 15 | private String type; 16 | 17 | private String url; 18 | } 19 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/app/modules/home/pages/default/default.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |

Feeds

5 |
6 | 7 |
8 |
9 |
10 |
11 | 12 | 13 | -------------------------------------------------------------------------------- /jackett-rss-processor-core/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | application: 3 | name: jackett-rss-process 4 | 5 | application: 6 | blackHole: "/tmp" 7 | max-results: 10 8 | sync-delay: 300000 9 | local-cache: 1 10 | 11 | logging: 12 | level: 13 | org: 14 | springframework: 15 | cache: TRACE 16 | 17 | --- 18 | spring: 19 | profiles: production 20 | 21 | application: 22 | blackHole: "/watched" 23 | max-results: 100 24 | local-cache: 5 25 | -------------------------------------------------------------------------------- /jackett-rss-processor-core/src/main/java/space/forloop/rss/domain/jackett/Image.java: -------------------------------------------------------------------------------- 1 | /* Licensed under Apache-2.0 */ 2 | package space.forloop.rss.domain.jackett; 3 | 4 | import lombok.AllArgsConstructor; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | @Data 9 | @AllArgsConstructor 10 | @NoArgsConstructor 11 | public class Image { 12 | 13 | private String link; 14 | 15 | private String description; 16 | 17 | private String title; 18 | 19 | private String url; 20 | } 21 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/app/shared/components/_dialogs/confirm-dialog/confirm-dialog.component.html: -------------------------------------------------------------------------------- 1 |

Are you sure

2 | 3 |
4 |
5 |
This will delete it forever.
6 |
7 |
8 | 9 |
10 | 11 | 12 | 13 |
14 | -------------------------------------------------------------------------------- /jackett-rss-processor-core/src/main/java/space/forloop/rss/domain/jackett/JacketRoot.java: -------------------------------------------------------------------------------- 1 | /* Licensed under Apache-2.0 */ 2 | package space.forloop.rss.domain.jackett; 3 | 4 | import javax.xml.bind.annotation.XmlRootElement; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | 9 | @Data 10 | @AllArgsConstructor 11 | @NoArgsConstructor 12 | @XmlRootElement(name = "rss") 13 | public class JacketRoot { 14 | 15 | private Channel channel; 16 | 17 | private String version; 18 | } 19 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/tsconfig.json: -------------------------------------------------------------------------------- 1 | /* 2 | This is a "Solution Style" tsconfig.json file, and is used by editors and TypeScript’s language server to improve development experience. 3 | It is not intended to be used to perform a compilation. 4 | 5 | To learn more about this file see: https://angular.io/config/solution-tsconfig. 6 | */ 7 | { 8 | "files": [], 9 | "references": [ 10 | { 11 | "path": "./tsconfig.app.json" 12 | }, 13 | { 14 | "path": "./tsconfig.spec.json" 15 | } 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | RSS 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /jackett-rss-processor-core/src/main/java/space/forloop/rss/repositories/ItemRepository.java: -------------------------------------------------------------------------------- 1 | /* Licensed under Apache-2.0 */ 2 | package space.forloop.rss.repositories; 3 | 4 | import org.springframework.data.mongodb.repository.ReactiveMongoRepository; 5 | import org.springframework.stereotype.Repository; 6 | import reactor.core.publisher.Mono; 7 | import space.forloop.rss.domain.jackett.Item; 8 | 9 | @Repository 10 | public interface ItemRepository extends ReactiveMongoRepository { 11 | 12 | Mono existsByGuid(String guid); 13 | } 14 | -------------------------------------------------------------------------------- /jackett-rss-processor-core/src/main/java/space/forloop/rss/services/ItemService.java: -------------------------------------------------------------------------------- 1 | /* Licensed under Apache-2.0 */ 2 | package space.forloop.rss.services; 3 | 4 | import reactor.core.publisher.Flux; 5 | import reactor.core.publisher.Mono; 6 | import space.forloop.rss.domain.Feed; 7 | import space.forloop.rss.domain.jackett.Item; 8 | 9 | public interface ItemService { 10 | 11 | Flux findByPatternAndNotSnatched(Feed feed); 12 | 13 | Flux findAll(Feed feed); 14 | 15 | Flux findAllLocal(); 16 | 17 | Mono save(Item item); 18 | } 19 | -------------------------------------------------------------------------------- /jackett-rss-processor-core/src/main/java/space/forloop/rss/services/FeedService.java: -------------------------------------------------------------------------------- 1 | /* Licensed under Apache-2.0 */ 2 | package space.forloop.rss.services; 3 | 4 | import reactor.core.publisher.Flux; 5 | import reactor.core.publisher.Mono; 6 | import space.forloop.rss.domain.Feed; 7 | import space.forloop.rss.domain.jackett.Channel; 8 | 9 | public interface FeedService { 10 | 11 | Flux findAll(); 12 | 13 | Mono findById(String id); 14 | 15 | Mono save(Feed feed); 16 | 17 | Mono delete(String id); 18 | 19 | Mono findChannel(Feed feed); 20 | } 21 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/tsconfig.base.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "compileOnSave": false, 4 | "compilerOptions": { 5 | "baseUrl": "./", 6 | "outDir": "./dist/out-tsc", 7 | "sourceMap": true, 8 | "declaration": false, 9 | "downlevelIteration": true, 10 | "experimentalDecorators": true, 11 | "allowSyntheticDefaultImports": true, 12 | "moduleResolution": "node", 13 | "importHelpers": true, 14 | "target": "es2015", 15 | "module": "es2020", 16 | "lib": ["es2018", "dom"] 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /jackett-rss-processor-core/src/main/java/space/forloop/rss/domain/Pattern.java: -------------------------------------------------------------------------------- 1 | /* Licensed under Apache-2.0 */ 2 | package space.forloop.rss.domain; 3 | 4 | import java.util.UUID; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | 9 | @Data 10 | @AllArgsConstructor 11 | @NoArgsConstructor 12 | public class Pattern { 13 | 14 | private String id = UUID.randomUUID().toString(); 15 | 16 | private boolean isEnabled = true; 17 | 18 | private String displayName; 19 | 20 | private String regex; 21 | 22 | private String testEndpoint; 23 | } 24 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/app/shared/components/action-button/action-button.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, EventEmitter, Input, Output } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-action-button', 5 | templateUrl: './action-button.component.html', 6 | styleUrls: ['./action-button.component.scss'], 7 | }) 8 | export class ActionButtonComponent { 9 | @Input() 10 | tooltip: string; 11 | 12 | @Output() 13 | clickedEvent: EventEmitter = new EventEmitter(); 14 | 15 | constructor() {} 16 | 17 | clicked() { 18 | this.clickedEvent.emit(true); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/app/modules/home/home.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { SharedModule } from '../../shared'; 3 | import { DefaultComponent } from './pages/default/default.component'; 4 | import { RoutingModule } from './home.routing'; 5 | import { FeedComponent } from './pages/feed/feed.component'; 6 | import { SnatchComponent } from './pages/snatch/snatch.component'; 7 | 8 | @NgModule({ 9 | declarations: [DefaultComponent, FeedComponent, SnatchComponent], 10 | imports: [SharedModule, RoutingModule], 11 | exports: [] 12 | }) 13 | export class HomeModule {} 14 | -------------------------------------------------------------------------------- /jackett-rss-processor-core/src/main/java/space/forloop/rss/domain/jackett/Channel.java: -------------------------------------------------------------------------------- 1 | /* Licensed under Apache-2.0 */ 2 | package space.forloop.rss.domain.jackett; 3 | 4 | import java.util.List; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | 9 | @Data 10 | @AllArgsConstructor 11 | @NoArgsConstructor 12 | public class Channel { 13 | 14 | private Image image; 15 | 16 | private List item; 17 | 18 | private String link; 19 | 20 | private String description; 21 | 22 | private String language; 23 | 24 | private String title; 25 | 26 | private String category; 27 | } 28 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/app/shared/components/_dialogs/confirm-dialog/confirm-dialog.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { MatDialogRef } from '@angular/material/dialog'; 3 | 4 | @Component({ 5 | selector: 'app-confirm-dialog', 6 | templateUrl: './confirm-dialog.component.html', 7 | styleUrls: ['./confirm-dialog.component.scss'], 8 | }) 9 | export class ConfirmDialogComponent { 10 | constructor(private dialogRef: MatDialogRef) {} 11 | 12 | submit() { 13 | this.dialogRef.close(true); 14 | } 15 | 16 | onNoClick() { 17 | this.dialogRef.close(false); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/app/core/domain/modules.ts: -------------------------------------------------------------------------------- 1 | export interface Feed { 2 | id?: string; 3 | displayName?: string; 4 | url?: string; 5 | patterns?: Pattern[]; 6 | } 7 | 8 | export interface Pattern { 9 | id?: string; 10 | enabled?: boolean; 11 | displayName?: string; 12 | regex?: string; 13 | } 14 | 15 | export interface Item { 16 | title?: string; 17 | size?: number; 18 | pubDate?: string; 19 | guid?: string; 20 | match?: boolean; 21 | } 22 | 23 | export interface Option { 24 | backgroundColor: string; 25 | buttonColor: string; 26 | headingColor: string; 27 | label: string; 28 | value: string; 29 | } 30 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | build/ 3 | !gradle/wrapper/gradle-wrapper.jar 4 | !**/src/main/**/build/ 5 | !**/src/test/**/build/ 6 | 7 | ### STS ### 8 | .apt_generated 9 | .classpath 10 | .factorypath 11 | .project 12 | .settings 13 | .springBeans 14 | .sts4-cache 15 | 16 | ### IntelliJ IDEA ### 17 | .idea 18 | *.iws 19 | *.iml 20 | *.ipr 21 | out/ 22 | !**/src/main/**/out/ 23 | !**/src/test/**/out/ 24 | 25 | ### NetBeans ### 26 | /nbproject/private/ 27 | /nbbuild/ 28 | /dist/ 29 | /nbdist/ 30 | /.nb-gradle/ 31 | 32 | ### VS Code ### 33 | .vscode/ 34 | 35 | ### Webapp ### 36 | ./webapp/build 37 | ./webapp/node_modules 38 | ./webapp/dist 39 | ./webapp/.gradle 40 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/app/shared/components/_dialogs/feed-dialog/feed-dialog.component.html: -------------------------------------------------------------------------------- 1 |

Add Jackett RSS Feed

2 | 3 |
4 |

5 | 6 | Jackett RSS Feed 7 | 8 | Use the "Copy RSS Feed" button in Jackett 9 | 10 |

11 |
12 | 13 |
14 | 15 | 16 |
17 | -------------------------------------------------------------------------------- /jackett-rss-processor-core/src/main/java/space/forloop/rss/Application.java: -------------------------------------------------------------------------------- 1 | /* Licensed under Apache-2.0 */ 2 | package space.forloop.rss; 3 | 4 | import org.springframework.boot.SpringApplication; 5 | import org.springframework.boot.autoconfigure.SpringBootApplication; 6 | import org.springframework.boot.context.properties.ConfigurationPropertiesScan; 7 | import org.springframework.scheduling.annotation.EnableScheduling; 8 | 9 | @EnableScheduling 10 | @SpringBootApplication 11 | @ConfigurationPropertiesScan 12 | public class Application { 13 | 14 | public static void main(final String[] args) { 15 | 16 | SpringApplication.run(Application.class, args); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/app/core/services/snatch.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { HttpClient } from '@angular/common/http'; 3 | import { environment } from '../../../environments/environment'; 4 | import { Item } from '../domain/modules'; 5 | import { Observable } from 'rxjs'; 6 | 7 | @Injectable({ 8 | providedIn: 'root', 9 | }) 10 | export class SnatchService { 11 | private readonly endpoint; 12 | 13 | constructor(private httpClient: HttpClient) { 14 | this.endpoint = `${environment.api}/snatches`; 15 | } 16 | 17 | findAll(): Observable { 18 | return this.httpClient.get(`${this.endpoint}`); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /jackett-rss-processor-ui/src/app/shared/components/theme-switcher/theme-switcher.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, EventEmitter, Input, Output } from '@angular/core'; 2 | import { Option } from '../../../core/domain/modules'; 3 | 4 | @Component({ 5 | selector: 'app-theme-switcher', 6 | templateUrl: './theme-switcher.component.html', 7 | styleUrls: ['./theme-switcher.component.scss'], 8 | }) 9 | export class ThemeSwitcherComponent { 10 | @Input() options: Array