├── .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 |
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 |
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 |
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 |
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 | Cancel
11 |
12 | Delete
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 | Cancel
15 | Save
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