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:
  1. Elite User and above will not have their account deleted after parking (in the Control Panel)
  2. Users who do not log in for 400 consecutive days will be disabled.
  3. Users with a parked account will be disabled if they do not log in for 150 consecutive days
  4. Users who have no traffic (i.e., uploading/downloading data is 0) within 7 days of new registration will be disabled
  5. 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 +