Created dedicated radarr and prowlarr demo images and pushed them up to DockerHub, and updated the script to be a true one liner

This commit is contained in:
2024-03-18 15:28:05 -06:00
parent 41f1be92ee
commit 1e67bd8fa7
18 changed files with 259 additions and 57 deletions
+21 -9
View File
@@ -15,19 +15,31 @@ To run this demo, simply run the [demo script](./managarr-demo.sh):
./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 ## 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 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. 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 ## Creator
* [Alex Clarke](https://github.com/Dark-Alex-17) * [Alex Clarke](https://github.com/Dark-Alex-17)
Executable
+6
View File
@@ -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
+3 -22
View File
@@ -1,32 +1,13 @@
--- ---
services: services:
radarr: radarr:
image: lscr.io/linuxserver/radarr:latest image: darkalex17/radarr-mock:latest
container_name: radarr 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 restart: unless-stopped
prowlarr: prowlarr:
image: lscr.io/linuxserver/prowlarr:latest image: darkalex17/prowlarr-mock:latest
container_name: prowlarr container_name: prowlarr
environment:
- PUID=1000
- PGID=1000
- TZ=Etc/UTC
volumes:
- ./mock-htpc/prowlarr:/config
ports:
- 9696:9696
restart: unless-stopped restart: unless-stopped
managarr: managarr:
@@ -34,7 +15,7 @@ services:
stdin_open: true stdin_open: true
tty: true tty: true
volumes: volumes:
- ./mock-htpc/managarr:/root/.config/managarr/ - "${MANAGARR_CONFIG:-./mock-htpc/managarr/config.yml}:/root/.config/managarr/config.yml:ro"
depends_on: depends_on:
radarr: radarr:
condition: service_started condition: service_started
+24 -8
View File
@@ -1,21 +1,37 @@
#!/bin/bash #!/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() { fail() {
result=$? result=$?
cleanup
if [ "$result" != "0" ]; then if [ "$result" != "0" ]; then
echo "Fail to run the Managarr demo" echo "Failed to run the Managarr demo"
fi fi
exit $result 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 trap "fail" EXIT
set -e 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
+3 -3
View File
@@ -7,6 +7,7 @@ type: private
encoding: UTF-8 encoding: UTF-8
requestDelay: 2 requestDelay: 2
links: links:
- https://www.agsvpt.com/
- https://abroad.agsvpt.com/ - https://abroad.agsvpt.com/
caps: caps:
@@ -80,9 +81,8 @@ settings:
default: "Account retention rules:<ol><li>Elite User and above will not have their account deleted after parking (in the Control Panel)</li><li>Users who do not log in for 400 consecutive days will be disabled.</li><li>Users with a parked account will be disabled if they do not log in for 150 consecutive days</li><li>Users who have no traffic (i.e., uploading/downloading data is 0) within 7 days of new registration will be disabled</li><li>Users with no traffic (i.e. both upload/download data is 0) who do not log in for 30 consecutive days will be disabled.</li></ol>" default: "Account retention rules:<ol><li>Elite User and above will not have their account deleted after parking (in the Control Panel)</li><li>Users who do not log in for 400 consecutive days will be disabled.</li><li>Users with a parked account will be disabled if they do not log in for 150 consecutive days</li><li>Users who have no traffic (i.e., uploading/downloading data is 0) within 7 days of new registration will be disabled</li><li>Users with no traffic (i.e. both upload/download data is 0) who do not log in for 30 consecutive days will be disabled.</li></ol>"
login: login:
path: agsvpt path: takelogin.php
method: form method: post
form: form[action="takelogin.php"]
inputs: inputs:
secret: "" secret: ""
username: "{{ .Config.username }}" username: "{{ .Config.username }}"
@@ -157,5 +157,5 @@ search:
False: 1 # normal False: 1 # normal
True: 2 # double True: 2 # double
minimumratio: minimumratio:
text: 0.4 text: 1.0
# json UNIT3D 7.0.3 # json UNIT3D 7.0.3
@@ -102,6 +102,10 @@ settings:
type: info type: info
label: Results Per Page label: Results Per Page
default: For best results, change the <b>Anzahl der Torrents beim Durchsuchen:</b> setting to <b>60</b> on your Control Panel. The default is <i>15</i>. default: For best results, change the <b>Anzahl der Torrents beim Durchsuchen:</b> setting to <b>60</b> on your Control Panel. The default is <i>15</i>.
- name: info_activity
type: info
label: Account Inactivity
default: "Inactive accounts will be deactivated after 7 weeks and deleted after another 3 weeks."
login: login:
path: login.php path: login.php
+142
View File
@@ -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 <a href=\"https://h-p2p.cam/\" target=\"_blank\">H-P2P</a> account <i>My Security</i> page and clicking on the <b>API Token</b> 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
@@ -10,13 +10,14 @@ links:
caps: caps:
categorymappings: categorymappings:
- {id: 10, cat: Movies, desc: "MOVIES"} - {id: 1, cat: Movies, desc: "MOVIES"}
- {id: 2, cat: TV, desc: "TV"} - {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: 5, cat: Audio, desc: "MUSIC"}
- {id: 8, cat: XXX, desc: "XXX"} - {id: 6, cat: XXX, desc: "XXX"}
- {id: 12, cat: Books, desc: "EBOOKS"} - {id: 7, cat: Console, desc: "GAMES"}
- {id: 9, cat: Console, desc: "GAMES"} - {id: 8, cat: Books, desc: "EBOOKS"}
modes: modes:
search: [q] search: [q]
@@ -144,6 +144,7 @@ caps:
- {id: 252, cat: Books, desc: "Yachting, sailing, boating-Projects, design, construction"} - {id: 252, cat: Books, desc: "Yachting, sailing, boating-Projects, design, construction"}
- {id: 251, cat: Books, desc: "Diving"} - {id: 251, cat: Books, desc: "Diving"}
- {id: 177, cat: Books, desc: "Shipmodeling"} - {id: 177, cat: Books, desc: "Shipmodeling"}
- {id: 352, cat: Books, desc: "Shipmodeling-Paper models"}
- {id: 293, cat: Books, desc: "Shipmodeling-Radio controlled models"} - {id: 293, cat: Books, desc: "Shipmodeling-Radio controlled models"}
- {id: 292, cat: Books, desc: "Shipmodeling-Marine Modelling Magazines"} - {id: 292, cat: Books, desc: "Shipmodeling-Marine Modelling Magazines"}
- {id: 291, cat: Books, desc: "Shipmodeling-Drawings and models of ships (CAD, 3D)"} - {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: 280, cat: Books, desc: "Marine History-Historic ships"}
- {id: 279, cat: Books, desc: "Marine History-Marine vessels"} - {id: 279, cat: Books, desc: "Marine History-Marine vessels"}
- {id: 278, cat: Books, desc: "Marine History-Warships"} - {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: 259, cat: Books, desc: "Marine History-Shipbuilding history"}
- {id: 277, cat: Books, desc: "Marine History-Wars at Sea"} - {id: 277, cat: Books, desc: "Marine History-Wars at Sea"}
- {id: 276, cat: Books, desc: "Marine History-War at sea (World War I)"} - {id: 276, cat: Books, desc: "Marine History-War at sea (World War I)"}
@@ -6,6 +6,8 @@ language: el-GR
type: private type: private
encoding: UTF-8 encoding: UTF-8
links: links:
- https://oldgreektracker.xyz/
legacylinks:
- http://oldgreektracker.xyz/ - http://oldgreektracker.xyz/
caps: caps:
@@ -134,6 +136,16 @@ login:
path: index.php path: index.php
selector: a[href*="/logout.php?logouthash="] 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: search:
paths: paths:
- path: browse.php - path: browse.php
@@ -154,28 +166,28 @@ search:
order: "{{ if .Config.freeleech }}asc{{ else }}{{ .Config.type }}{{ end }}" order: "{{ if .Config.freeleech }}asc{{ else }}{{ .Config.type }}{{ end }}"
rows: 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: fields:
category: category:
selector: a[href*="/torrent-category-"] selector: a[href*="/browse.php?category="]
attribute: href attribute: href
filters: filters:
- name: regexp - name: querystring
args: /torrent-category-(.+?)/ args: category
title_default: title_default:
# is usually abbreaviated # is usually abbreaviated
selector: a[href*="/torrent-details-"] selector: a[href*="/details.php?id="]
title: title:
# while still abbreviated, is usually longer than the default # while still abbreviated, is usually longer than the default
selector: div.tooltip-content div selector: div.tooltip-content div
optional: true optional: true
default: "{{ .Result.title_default }}" default: "{{ .Result.title_default }}"
details: details:
selector: a[href*="/torrent-details-"] selector: a[href*="/details.php?id="]
attribute: href attribute: href
download: download:
selector: a[href*="/download-torrent-"] selector: a[href*="/details.php?id="]
attribute: href attribute: href
magnet: magnet:
selector: a[href^="magnet:?xt="] selector: a[href^="magnet:?xt="]
@@ -184,11 +196,15 @@ search:
selector: img[src*="/torrents/images/"] selector: img[src*="/torrents/images/"]
attribute: src attribute: src
date: date:
selector: td:nth-child(2) > div:last-child selector: td:nth-child(2)
# auto adjusted by site account profile # auto adjusted by site account profile
filters: 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 - name: dateparse
args: "dd-MM-yyyy HH:mm" args: "d:MMMM:yyyy HH:mm"
size: size:
selector: td:nth-last-child(5) selector: td:nth-last-child(5)
grabs: grabs:
@@ -5,6 +5,8 @@ description: "sharewood is a Semi-Private FRENCH Torrent Tracker for GENERAL"
language: fr-FR language: fr-FR
type: semi-private type: semi-private
encoding: UTF-8 encoding: UTF-8
certificates:
- 023A091295E81813D040DFA0FA842DF9892BF0F5 # expired 10-March-2024 note: despite a new CA issued this one still pops up occasionally
links: links:
- https://www.sharewood.tv/ - https://www.sharewood.tv/
+2
View File
@@ -200,6 +200,8 @@ search:
":contains(\"Divers\"):contains(\"1080p\")": "5GB" ":contains(\"Divers\"):contains(\"1080p\")": "5GB"
":contains(\"Divers\"):contains(\"720p\")": "4GB" ":contains(\"Divers\"):contains(\"720p\")": "4GB"
"*": "" "*": ""
date:
text: now
download: download:
selector: div.download-item > a selector: div.download-item > a
attribute: href attribute: href
Binary file not shown.
Binary file not shown.
Binary file not shown.
+8
View File
@@ -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
+10
View File
@@ -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