diff --git a/README.md b/README.md
index 134fb67..44132cb 100644
--- a/README.md
+++ b/README.md
@@ -15,19 +15,31 @@ To run this demo, simply run the [demo script](./managarr-demo.sh):
./managarr-demo.sh
```
-## Cleanup
-This demo will download a handful of docker images. To clean up after this demo, run the following command:
-
-```shell
-docker image rm lscr.io/linuxserver/radarr &&\
- docker image rm lscr.io/linuxserver/prowlarr &&\
- rm -rf /tmp/managarr*
-```
-
## Limitations
This demo has no download functionality. It is an eventual goal to have a mock API for one of the BitTorrent clients like Transmission
to emulate this functionality for a full demo experience.
+## Building
+To build and push both the [prowlarr](./prowlarr.Dockerfile) and [radarr](./radarr.Dockerfile) images, it is easiest to just use the [build script](./build.sh):
+
+```shell
+./build.sh
+```
+
+## Running directly with docker compose
+If you wish to run the demo directly from the [docker-compose.yml](./docker-compose.yml),
+you can either run it simply with
+
+```shell
+docker compose run --rm managarr
+```
+
+which will use the [default managarr configuration file](./mock-htpc/managarr/config.yml), or you can specify it manually with the `MANAGARR_CONFIG` environment variable:
+
+```shell
+MANAGARR_CONFIG=/tmp/managarr.yml docker compose run --rm managarr
+```
+
## Creator
* [Alex Clarke](https://github.com/Dark-Alex-17)
diff --git a/build.sh b/build.sh
new file mode 100755
index 0000000..d351b58
--- /dev/null
+++ b/build.sh
@@ -0,0 +1,6 @@
+#!/bin/bash
+docker build -f radarr.Dockerfile -t darkalex17/radarr-mock:latest .
+docker push darkalex17/radarr-mock:latest
+
+docker build -f prowlarr.Dockerfile -t darkalex17/prowlarr-mock:latest .
+docker push darkalex17/prowlarr-mock:latest
diff --git a/docker-compose.yml b/docker-compose.yml
index 41ff0c8..bb53010 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,32 +1,13 @@
---
services:
radarr:
- image: lscr.io/linuxserver/radarr:latest
+ image: darkalex17/radarr-mock:latest
container_name: radarr
- environment:
- - PUID=1000
- - PGID=1000
- - TZ=Etc/UTC
- volumes:
- - ./mock-htpc/movies:/movies
- - ./mock-htpc/films:/films
- - ./mock-htpc/downloads:/downloads
- - ./mock-htpc/radarr:/config
- ports:
- - 7878:7878
restart: unless-stopped
prowlarr:
- image: lscr.io/linuxserver/prowlarr:latest
+ image: darkalex17/prowlarr-mock:latest
container_name: prowlarr
- environment:
- - PUID=1000
- - PGID=1000
- - TZ=Etc/UTC
- volumes:
- - ./mock-htpc/prowlarr:/config
- ports:
- - 9696:9696
restart: unless-stopped
managarr:
@@ -34,7 +15,7 @@ services:
stdin_open: true
tty: true
volumes:
- - ./mock-htpc/managarr:/root/.config/managarr/
+ - "${MANAGARR_CONFIG:-./mock-htpc/managarr/config.yml}:/root/.config/managarr/config.yml:ro"
depends_on:
radarr:
condition: service_started
diff --git a/managarr-demo.sh b/managarr-demo.sh
index 4ede887..20c6b2d 100755
--- a/managarr-demo.sh
+++ b/managarr-demo.sh
@@ -1,21 +1,37 @@
#!/bin/bash
-DEMO_TEMP_DIR=/tmp/managarr-demo
+DEMO_TEMP_COMPOSE_FILE=/tmp/docker-compose.yml
+DEMO_TEMP_CONFIG_FILE=/tmp/config.yml
+
+cleanup() {
+ docker compose -f "$DEMO_TEMP_COMPOSE_FILE" down
+
+ docker rmi -f $(docker images | grep "darkalex17" | awk '{print $3}')
+
+ rm -f "$DEMO_TEMP_COMPOSE_FILE"
+ rm -f "$DEMO_TEMP_CONFIG_FILE"
+ rm -f /tmp/managarr-demo.sh
+}
fail() {
result=$?
+ cleanup
if [ "$result" != "0" ]; then
- echo "Fail to run the Managarr demo"
+ echo "Failed to run the Managarr demo"
fi
exit $result
}
+main() {
+ [ -f "$DEMO_TEMP_COMPOSE_FILE" ] || curl https://raw.githubusercontent.com/Dark-Alex-17/managarr-demo/main/docker-compose.yml > "$DEMO_TEMP_COMPOSE_FILE"
+ [ -f "$DEMO_TEMP_CONFIG_FILE" ] || curl https://raw.githubusercontent.com/Dark-Alex-17/managarr-demo/main/mock-htpc/managarr/config.yml > "$DEMO_TEMP_CONFIG_FILE"
+
+ MANAGARR_CONFIG="$DEMO_TEMP_CONFIG_FILE" docker compose -f "$DEMO_TEMP_COMPOSE_FILE" run --rm managarr
+
+ cleanup
+}
+
trap "fail" EXIT
set -e
+main
-[ -d "$DEMO_TEMP_DIR" ] || git clone git@github.com:Dark-Alex-17/managarr-demo.git "$DEMO_TEMP_DIR"
-
-docker compose -f "$DEMO_TEMP_DIR/docker-compose.yml" run --rm managarr &&\
- docker compose -f "$DEMO_TEMP_DIR/docker-compose.yml" down &&\
- docker image rm darkalex17/managarr &&\
- rm -rf /tmp/managarr-demo.sh
diff --git a/mock-htpc/prowlarr/Definitions/agsvpt.yml b/mock-htpc/prowlarr/Definitions/agsvpt.yml
index e540699..2167d9d 100644
--- a/mock-htpc/prowlarr/Definitions/agsvpt.yml
+++ b/mock-htpc/prowlarr/Definitions/agsvpt.yml
@@ -7,6 +7,7 @@ type: private
encoding: UTF-8
requestDelay: 2
links:
+ - https://www.agsvpt.com/
- https://abroad.agsvpt.com/
caps:
@@ -80,9 +81,8 @@ settings:
default: "Account retention rules:
- Elite User and above will not have their account deleted after parking (in the Control Panel)
- Users who do not log in for 400 consecutive days will be disabled.
- Users with a parked account will be disabled if they do not log in for 150 consecutive days
- Users who have no traffic (i.e., uploading/downloading data is 0) within 7 days of new registration will be disabled
- Users with no traffic (i.e. both upload/download data is 0) who do not log in for 30 consecutive days will be disabled.
"
login:
- path: agsvpt
- method: form
- form: form[action="takelogin.php"]
+ path: takelogin.php
+ method: post
inputs:
secret: ""
username: "{{ .Config.username }}"
diff --git a/mock-htpc/prowlarr/Definitions/at12project.yml b/mock-htpc/prowlarr/Definitions/at12project.yml
index 2a02540..5495b91 100644
--- a/mock-htpc/prowlarr/Definitions/at12project.yml
+++ b/mock-htpc/prowlarr/Definitions/at12project.yml
@@ -157,5 +157,5 @@ search:
False: 1 # normal
True: 2 # double
minimumratio:
- text: 0.4
+ text: 1.0
# json UNIT3D 7.0.3
diff --git a/mock-htpc/prowlarr/Definitions/dasunerwartete.yml b/mock-htpc/prowlarr/Definitions/dasunerwartete.yml
index 6338ccf..5a37132 100644
--- a/mock-htpc/prowlarr/Definitions/dasunerwartete.yml
+++ b/mock-htpc/prowlarr/Definitions/dasunerwartete.yml
@@ -102,6 +102,10 @@ settings:
type: info
label: Results Per Page
default: For best results, change the Anzahl der Torrents beim Durchsuchen: setting to 60 on your Control Panel. The default is 15.
+ - name: info_activity
+ type: info
+ label: Account Inactivity
+ default: "Inactive accounts will be deactivated after 7 weeks and deleted after another 3 weeks."
login:
path: login.php
diff --git a/mock-htpc/prowlarr/Definitions/h-p2p.yml b/mock-htpc/prowlarr/Definitions/h-p2p.yml
new file mode 100644
index 0000000..870b6dc
--- /dev/null
+++ b/mock-htpc/prowlarr/Definitions/h-p2p.yml
@@ -0,0 +1,142 @@
+---
+id: h-p2p
+name: H-P2P
+description: "H-P2P is a Private Torrent Tracker for OnlyFans XXX"
+language: en-US
+type: private
+encoding: UTF-8
+links:
+ - https://h-p2p.cam/
+
+caps:
+ categorymappings:
+ - {id: 6, cat: XXX/WEB-DL, desc: "OnlyFans"}
+
+ modes:
+ search: [q]
+ tv-search: [q]
+ movie-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 H-P2P 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 }}"
+ 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
+ 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", ""]
+ 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
+ minimumseedtime:
+ # 7 days (as seconds = 7 x 24 x 60 x 60)
+ text: 604800
+# json UNIT3D 6.3.0
diff --git a/mock-htpc/prowlarr/Definitions/lilleskyorg.yml b/mock-htpc/prowlarr/Definitions/lilleskyorg.yml
index 182f9fe..16c1d3e 100644
--- a/mock-htpc/prowlarr/Definitions/lilleskyorg.yml
+++ b/mock-htpc/prowlarr/Definitions/lilleskyorg.yml
@@ -10,13 +10,14 @@ links:
caps:
categorymappings:
- - {id: 10, cat: Movies, desc: "MOVIES"}
+ - {id: 1, cat: Movies, desc: "MOVIES"}
- {id: 2, cat: TV, desc: "TV"}
- - {id: 3, cat: PC, desc: "APPZ"}
+ - {id: 3, cat: TV/Foreign, desc: "TV-FOREIGN"}
+ - {id: 4, cat: PC, desc: "APPS"}
- {id: 5, cat: Audio, desc: "MUSIC"}
- - {id: 8, cat: XXX, desc: "XXX"}
- - {id: 12, cat: Books, desc: "EBOOKS"}
- - {id: 9, cat: Console, desc: "GAMES"}
+ - {id: 6, cat: XXX, desc: "XXX"}
+ - {id: 7, cat: Console, desc: "GAMES"}
+ - {id: 8, cat: Books, desc: "EBOOKS"}
modes:
search: [q]
diff --git a/mock-htpc/prowlarr/Definitions/marinetracker.yml b/mock-htpc/prowlarr/Definitions/marinetracker.yml
index c2124b6..8e66010 100644
--- a/mock-htpc/prowlarr/Definitions/marinetracker.yml
+++ b/mock-htpc/prowlarr/Definitions/marinetracker.yml
@@ -144,6 +144,7 @@ caps:
- {id: 252, cat: Books, desc: "Yachting, sailing, boating-Projects, design, construction"}
- {id: 251, cat: Books, desc: "Diving"}
- {id: 177, cat: Books, desc: "Shipmodeling"}
+ - {id: 352, cat: Books, desc: "Shipmodeling-Paper models"}
- {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)"}
@@ -159,6 +160,7 @@ caps:
- {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: 351, cat: Books, desc: "Marine History-Battleships"}
- {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)"}
diff --git a/mock-htpc/prowlarr/Definitions/oldgreektracker.yml b/mock-htpc/prowlarr/Definitions/oldgreektracker.yml
index 33d4546..f7de5ab 100644
--- a/mock-htpc/prowlarr/Definitions/oldgreektracker.yml
+++ b/mock-htpc/prowlarr/Definitions/oldgreektracker.yml
@@ -6,6 +6,8 @@ language: el-GR
type: private
encoding: UTF-8
links:
+ - https://oldgreektracker.xyz/
+legacylinks:
- http://oldgreektracker.xyz/
caps:
@@ -134,6 +136,16 @@ login:
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
@@ -154,28 +166,28 @@ search:
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 }}"
+ 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*="/torrent-category-"]
+ selector: a[href*="/browse.php?category="]
attribute: href
filters:
- - name: regexp
- args: /torrent-category-(.+?)/
+ - name: querystring
+ args: category
title_default:
# is usually abbreaviated
- selector: a[href*="/torrent-details-"]
+ 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*="/torrent-details-"]
+ selector: a[href*="/details.php?id="]
attribute: href
download:
- selector: a[href*="/download-torrent-"]
+ selector: a[href*="/details.php?id="]
attribute: href
magnet:
selector: a[href^="magnet:?xt="]
@@ -184,11 +196,15 @@ search:
selector: img[src*="/torrents/images/"]
attribute: src
date:
- selector: td:nth-child(2) > div:last-child
+ selector: td:nth-child(2)
# auto adjusted by site account profile
filters:
+ - name: regexp
+ args: "(\\d{1,2}(?:st|nd|rd|th):\\w{3,9}:\\d{4} \\d{2}:\\d{2})"
+ - name: re_replace
+ args: ["^(\\d{1,2})(?:st|nd|rd|th):", "$1:"]
- name: dateparse
- args: "dd-MM-yyyy HH:mm"
+ args: "d:MMMM:yyyy HH:mm"
size:
selector: td:nth-last-child(5)
grabs:
diff --git a/mock-htpc/prowlarr/Definitions/sharewood.yml b/mock-htpc/prowlarr/Definitions/sharewood.yml
index e6f0f74..434ed18 100644
--- a/mock-htpc/prowlarr/Definitions/sharewood.yml
+++ b/mock-htpc/prowlarr/Definitions/sharewood.yml
@@ -5,6 +5,8 @@ description: "sharewood is a Semi-Private FRENCH Torrent Tracker for GENERAL"
language: fr-FR
type: semi-private
encoding: UTF-8
+certificates:
+ - 023A091295E81813D040DFA0FA842DF9892BF0F5 # expired 10-March-2024 note: despite a new CA issued this one still pops up occasionally
links:
- https://www.sharewood.tv/
diff --git a/mock-htpc/prowlarr/Definitions/wihd.yml b/mock-htpc/prowlarr/Definitions/wihd.yml
index beac9da..2f8af45 100644
--- a/mock-htpc/prowlarr/Definitions/wihd.yml
+++ b/mock-htpc/prowlarr/Definitions/wihd.yml
@@ -200,6 +200,8 @@ search:
":contains(\"Divers\"):contains(\"1080p\")": "5GB"
":contains(\"Divers\"):contains(\"720p\")": "4GB"
"*": ""
+ date:
+ text: now
download:
selector: div.download-item > a
attribute: href
diff --git a/mock-htpc/prowlarr/logs.db b/mock-htpc/prowlarr/logs.db
index a1fe2e0..4a653fc 100644
Binary files a/mock-htpc/prowlarr/logs.db and b/mock-htpc/prowlarr/logs.db differ
diff --git a/mock-htpc/prowlarr/logs.db-shm b/mock-htpc/prowlarr/logs.db-shm
index d90439d..d958e73 100644
Binary files a/mock-htpc/prowlarr/logs.db-shm and b/mock-htpc/prowlarr/logs.db-shm differ
diff --git a/mock-htpc/prowlarr/logs.db-wal b/mock-htpc/prowlarr/logs.db-wal
index a8215d6..43eda93 100644
Binary files a/mock-htpc/prowlarr/logs.db-wal and b/mock-htpc/prowlarr/logs.db-wal differ
diff --git a/prowlarr.Dockerfile b/prowlarr.Dockerfile
new file mode 100644
index 0000000..0b98a17
--- /dev/null
+++ b/prowlarr.Dockerfile
@@ -0,0 +1,8 @@
+FROM lscr.io/linuxserver/prowlarr:latest
+
+ENV PUID=1000
+ENV PGID=1000
+ENV TZ=Etc/UTC
+
+COPY ./mock-htpc/prowlarr/ /config
+
diff --git a/radarr.Dockerfile b/radarr.Dockerfile
new file mode 100644
index 0000000..b059564
--- /dev/null
+++ b/radarr.Dockerfile
@@ -0,0 +1,10 @@
+FROM lscr.io/linuxserver/radarr:latest
+
+ENV PUID=1000
+ENV PGID=1000
+ENV TZ=Etc/UTC
+
+COPY ./mock-htpc/radarr/ /config
+COPY ./mock-htpc/movies /movies
+COPY ./mock-htpc/films /films
+