mirror of
https://github.com/JackDallas/Premiumizearr.git
synced 2026-01-05 04:13:48 +01:00
Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3dff845fd2 | ||
|
|
74c49799eb | ||
|
|
d19606c4dd | ||
|
|
f1d66d9532 | ||
|
|
5d02813066 | ||
|
|
226b2067ff | ||
|
|
27037a9621 | ||
|
|
fd371c38d9 | ||
|
|
26c9a5e07a | ||
|
|
dfe64f0c56 | ||
|
|
8f112500cc | ||
|
|
395083f32f | ||
|
|
8dd342a7a5 |
11
.github/workflows/build.yml
vendored
11
.github/workflows/build.yml
vendored
@@ -28,7 +28,7 @@ jobs:
|
||||
|
||||
- name: Build
|
||||
uses: goreleaser/goreleaser-action@v2
|
||||
if: ! startsWith(github.ref, 'refs/tags/')
|
||||
if: startsWith(github.ref, 'refs/tags/') == false
|
||||
with:
|
||||
distribution: goreleaser
|
||||
version: latest
|
||||
@@ -44,4 +44,11 @@ jobs:
|
||||
version: latest
|
||||
args: release --rm-dist
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
|
||||
- name: Upload assets
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: artifacts
|
||||
path: dist/
|
||||
|
||||
@@ -48,6 +48,8 @@ nfpms:
|
||||
# Defaults to `ProjectName`.
|
||||
package_name: premiumizearr
|
||||
|
||||
bindir: /opt/premiumizearrd
|
||||
|
||||
# Your app's vendor.
|
||||
# Default is empty.
|
||||
vendor: Jack Dallas.
|
||||
@@ -75,6 +77,8 @@ nfpms:
|
||||
contents:
|
||||
# Basic file that applies to all packagers
|
||||
- src: build/static/*
|
||||
dst: /usr/local/bin/static/
|
||||
dst: /opt/premiumizearrd/static/
|
||||
- src: init/premiumizearrd.service
|
||||
dst: /etc/systemd/system/
|
||||
dst: /etc/systemd/system/premiumizearrd.service
|
||||
scripts:
|
||||
postinstall: "scripts/postinstall.sh"
|
||||
|
||||
63
README.md
63
README.md
@@ -1,11 +1,64 @@
|
||||
# premiumizearr
|
||||
# Premiumizearr
|
||||
|
||||
## Features
|
||||
|
||||
- Monitor blackhole directory to push `.magnet` and `.nzb` to Premiumize.me
|
||||
- Monitor and download Premiumize.me transfers
|
||||
- Mark transfers as failed in sonarr
|
||||
- Monitor and download Premiumize.me transfers (web ui on default port 8182)
|
||||
- Mark transfers as failed in Radarr & Sonarr
|
||||
|
||||
## Up Next
|
||||
## Support the project by using my invite code
|
||||
|
||||
- Radarr support
|
||||
[Invite Code](https://www.premiumize.me/ref/446038083)
|
||||
|
||||
## Install
|
||||
|
||||
[Grab the latest release artifact links here](https://github.com/JackDallas/Premiumizearr/releases/)
|
||||
|
||||
### Binary
|
||||
|
||||
```
|
||||
wget https://github.com/JackDallas/Premiumizearr/releases/download/x.x.x/Premiumizearr_x.x.x_linux_amd64.tar.gz
|
||||
tar xf Premiumizearr_x.x.x.x_linux_amd64.tar.gz
|
||||
cd Premiumizearr_x.x.x.x_linux_amd64
|
||||
sudo mkdir /opt/premiumizearrd/
|
||||
sudo cp -r premiumizearrd static/ /opt/premiumizearrd/
|
||||
sudo cp premiumizearrd /etc/systemd/system/
|
||||
sudo systemctl-reload
|
||||
sudo systemctl enable premiumizearrd.service
|
||||
sudo systemctl start premiumizearrd.service
|
||||
```
|
||||
|
||||
### deb file
|
||||
|
||||
```
|
||||
wget https://github.com/JackDallas/Premiumizearr/releases/download/x.x.x/premiumizearr_x.x.x._linux_amd64.deb
|
||||
sudo dpkg -i premiumizearr_x.x.x.x_linux_amd64.deb
|
||||
```
|
||||
|
||||
## Setup
|
||||
|
||||
### Premiumizearrd
|
||||
|
||||
Edit the config file at `/opt/premiumizearrd/config.yml`
|
||||
|
||||
`RadarrURL,SonarrURL` Url the Arr can be accessed on
|
||||
|
||||
`RadarrAPIKey,SonarrAPIKey` API key for the Arr
|
||||
|
||||
`PremiumizemeAPIKey` API key for your [premiumize.me](https://www.premiumize.me) account
|
||||
|
||||
`BlackholeDirectory` Path to Directory the Arr's will put magnet/torrent/nzb files in
|
||||
|
||||
`DownloadsDirectory` Path for Premiumizearr to download media files to, that the Arr's watch for new media
|
||||
|
||||
`bindIP` IP the web server binds to
|
||||
|
||||
`bindPort` Port the web server binds to
|
||||
|
||||
### Sonarr/Radarr
|
||||
|
||||
- Go to your Arr's `Download Client` settings page
|
||||
|
||||
- Add a new Torrent Blackhole client, set the `Torrent Folder` to the previously set `BlackholeDirectory` location, set the `Watch Folder` to the previously set `DownloadsDirectory` location
|
||||
|
||||
- Add a new Usenet Blackhole client, set the `Nzb Folder` to the previously set `BlackholeDirectory` location, set the `Watch Folder` to the previously set `DownloadsDirectory` location
|
||||
|
||||
@@ -2,8 +2,6 @@ package main
|
||||
|
||||
import (
|
||||
"flag"
|
||||
"io"
|
||||
"os"
|
||||
"time"
|
||||
|
||||
"github.com/jackdallas/premiumizearr/internal/arr"
|
||||
@@ -11,6 +9,7 @@ import (
|
||||
"github.com/jackdallas/premiumizearr/internal/service"
|
||||
"github.com/jackdallas/premiumizearr/internal/web_service"
|
||||
"github.com/jackdallas/premiumizearr/pkg/premiumizeme"
|
||||
"github.com/orandin/lumberjackrus"
|
||||
log "github.com/sirupsen/logrus"
|
||||
"golift.io/starr"
|
||||
"golift.io/starr/radarr"
|
||||
@@ -33,15 +32,43 @@ func main() {
|
||||
lvl = log.InfoLevel
|
||||
}
|
||||
log.SetLevel(lvl)
|
||||
hook, err := lumberjackrus.NewHook(
|
||||
&lumberjackrus.LogFile{
|
||||
Filename: "/opt/premiumizearrd/premiumizearr.general.log",
|
||||
MaxSize: 100,
|
||||
MaxBackups: 1,
|
||||
MaxAge: 1,
|
||||
Compress: false,
|
||||
LocalTime: false,
|
||||
},
|
||||
log.InfoLevel,
|
||||
&log.TextFormatter{},
|
||||
&lumberjackrus.LogFileOpts{
|
||||
log.InfoLevel: &lumberjackrus.LogFile{
|
||||
Filename: "/opt/premiumizearrd/premiumizearr.info.log",
|
||||
MaxSize: 100,
|
||||
MaxBackups: 1,
|
||||
MaxAge: 1,
|
||||
Compress: false,
|
||||
LocalTime: false,
|
||||
},
|
||||
log.ErrorLevel: &lumberjackrus.LogFile{
|
||||
Filename: "/opt/premiumizearrd/premiumizearr.error.log",
|
||||
MaxSize: 100, // optional
|
||||
MaxBackups: 1, // optional
|
||||
MaxAge: 1, // optional
|
||||
Compress: false, // optional
|
||||
LocalTime: false, // optional
|
||||
},
|
||||
},
|
||||
)
|
||||
|
||||
logFile, err := os.OpenFile("premiumizearr.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
|
||||
if err != nil {
|
||||
log.Error(err)
|
||||
} else {
|
||||
log.SetOutput(io.MultiWriter(logFile, os.Stdout))
|
||||
panic(err)
|
||||
}
|
||||
|
||||
log.Info("")
|
||||
log.AddHook(hook)
|
||||
|
||||
log.Info("---------- Starting premiumizearr daemon ----------")
|
||||
log.Info("")
|
||||
|
||||
|
||||
3
go.mod
3
go.mod
@@ -6,12 +6,15 @@ require (
|
||||
github.com/dustin/go-humanize v1.0.0
|
||||
github.com/fsnotify/fsnotify v1.5.1
|
||||
github.com/gorilla/mux v1.8.0
|
||||
github.com/orandin/lumberjackrus v1.0.1
|
||||
github.com/sirupsen/logrus v1.8.1
|
||||
golift.io/starr v0.13.0
|
||||
gopkg.in/yaml.v2 v2.4.0
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/BurntSushi/toml v1.0.0 // indirect
|
||||
golang.org/x/net v0.0.0-20220114011407-0dd24b26b47d // indirect
|
||||
golang.org/x/sys v0.0.0-20211110154304-99a53858aa08 // indirect
|
||||
gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect
|
||||
)
|
||||
|
||||
6
go.sum
6
go.sum
@@ -1,3 +1,5 @@
|
||||
github.com/BurntSushi/toml v1.0.0 h1:dtDWrepsVPfW9H/4y7dDgFc2MBUSeJhlaDtK13CxFlU=
|
||||
github.com/BurntSushi/toml v1.0.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
|
||||
@@ -7,6 +9,8 @@ github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5
|
||||
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
|
||||
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
|
||||
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
|
||||
github.com/orandin/lumberjackrus v1.0.1 h1:7ysDQ0MHD79zIFN9/EiDHjUcgopNi5ehtxFDy8rUkWo=
|
||||
github.com/orandin/lumberjackrus v1.0.1/go.mod h1:xYLt6H8W93pKnQgUQaxsApS0Eb4BwHLOkxk5DVzf5H0=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
|
||||
@@ -48,5 +52,7 @@ golift.io/starr v0.13.0 h1:LoihBAH3DQ0ikPNHTVg47tUU+475mzbr1ahMcY5gdno=
|
||||
golift.io/starr v0.13.0/go.mod h1:IZIzdT5/NBdhM08xAEO5R1INgGN+Nyp4vCwvgHrbKVs=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=
|
||||
gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
|
||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
Description=Premiumizearr Daemon
|
||||
After=network.target
|
||||
[Service]
|
||||
User=$USER
|
||||
Group=$USER
|
||||
User=1000
|
||||
Group=1000
|
||||
UMask=0002
|
||||
Type=simple
|
||||
ExecStart=/opt/premiumizearrd/premiumizearrd
|
||||
|
||||
@@ -28,6 +28,8 @@ type Config struct {
|
||||
|
||||
BindIP string `yaml:"bindIP"`
|
||||
BindPort string `yaml:"bindPort"`
|
||||
|
||||
WebRoot string `yaml:"WebRoot"`
|
||||
}
|
||||
|
||||
func loadConfigFromDisk() (Config, error) {
|
||||
@@ -57,6 +59,7 @@ func createDefaultConfig() error {
|
||||
DownloadsDirectory: "",
|
||||
BindIP: "0.0.0.0",
|
||||
BindPort: "8182",
|
||||
WebRoot: "",
|
||||
}
|
||||
|
||||
file, err := yaml.Marshal(config)
|
||||
|
||||
@@ -146,7 +146,7 @@ func (dw *DirectoryWatcherService) processUploads() {
|
||||
log.Trace("File already uploaded, removing from Disk")
|
||||
os.Remove(filePath)
|
||||
default:
|
||||
log.Error(err)
|
||||
log.Error("Error creating transfer: %s", err)
|
||||
}
|
||||
} else {
|
||||
dw.status = "Okay"
|
||||
|
||||
@@ -77,7 +77,7 @@ func (manager *TransferManagerService) TaskUpdateTransfersList() {
|
||||
log.Debug("Running Task UpdateTransfersList")
|
||||
transfers, err := manager.premiumizemeClient.GetTransfers()
|
||||
if err != nil {
|
||||
log.Error(err)
|
||||
log.Error("Error getting transfers: %s", err.Error())
|
||||
return
|
||||
}
|
||||
manager.updateTransfers(transfers)
|
||||
@@ -109,7 +109,7 @@ func (manager *TransferManagerService) TaskCheckPremiumizeDownloadsFolder() {
|
||||
log.Debug("Running Task CheckPremiumizeDownloadsFolder")
|
||||
items, err := manager.premiumizemeClient.ListFolder(manager.downloadsFolderID)
|
||||
if err != nil {
|
||||
log.Error(err)
|
||||
log.Error("Error listing downloads folder: %s", err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
@@ -178,7 +178,7 @@ func (manager *TransferManagerService) HandleFinishedItem(item premiumizeme.Item
|
||||
return
|
||||
}
|
||||
if err != nil {
|
||||
log.Error(err)
|
||||
log.Error("Error generating download link: %s", err)
|
||||
manager.removeDownload(item.Name)
|
||||
return
|
||||
}
|
||||
@@ -230,7 +230,7 @@ func (manager *TransferManagerService) HandleFinishedItem(item premiumizeme.Item
|
||||
err = manager.premiumizemeClient.DeleteFolder(item.ID)
|
||||
if err != nil {
|
||||
manager.removeDownload(item.Name)
|
||||
log.Error(err)
|
||||
log.Error("Error deleting folder on premiumuze.me: %s", err)
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
@@ -25,8 +25,6 @@ type IndexTemplates struct {
|
||||
|
||||
var indexBytes []byte
|
||||
|
||||
const webRoot = "premiumizearr"
|
||||
|
||||
type server struct {
|
||||
transferManager *service.TransferManagerService
|
||||
directoryWatcherService *service.DirectoryWatcherService
|
||||
@@ -40,7 +38,7 @@ func StartWebServer(transferManager *service.TransferManagerService, directoryWa
|
||||
}
|
||||
|
||||
var ibytes bytes.Buffer
|
||||
err = tmpl.Execute(&ibytes, &IndexTemplates{webRoot})
|
||||
err = tmpl.Execute(&ibytes, &IndexTemplates{config.WebRoot})
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
@@ -53,18 +51,24 @@ func StartWebServer(transferManager *service.TransferManagerService, directoryWa
|
||||
spa := spaHandler{
|
||||
staticPath: "static",
|
||||
indexPath: "index.html",
|
||||
webRoot: config.WebRoot,
|
||||
}
|
||||
|
||||
r := mux.NewRouter()
|
||||
|
||||
log.Infof("Creating route: %s", webRoot+"/api/transfers")
|
||||
r.HandleFunc("/"+webRoot+"/api/transfers", s.TransfersHandler)
|
||||
transferPath := "/api/transfers"
|
||||
downloadsPath := "/api/downloads"
|
||||
blackholePath := "/api/blackhole"
|
||||
|
||||
log.Infof("Creating route: %s", webRoot+"/api/downloads")
|
||||
r.HandleFunc("/"+webRoot+"/api/downloads", s.DownloadsHandler)
|
||||
if config.WebRoot != "" {
|
||||
transferPath = path.Join(config.WebRoot, transferPath)
|
||||
downloadsPath = path.Join(config.WebRoot, downloadsPath)
|
||||
blackholePath = path.Join(config.WebRoot, blackholePath)
|
||||
}
|
||||
|
||||
log.Infof("Creating route: %s", webRoot+"/api/blackhole")
|
||||
r.HandleFunc("/"+webRoot+"/api/blackhole", s.BlackholeHandler)
|
||||
r.HandleFunc(transferPath, s.TransfersHandler)
|
||||
r.HandleFunc(downloadsPath, s.DownloadsHandler)
|
||||
r.HandleFunc(blackholePath, s.BlackholeHandler)
|
||||
|
||||
r.PathPrefix("/").Handler(spa)
|
||||
|
||||
@@ -163,6 +167,7 @@ func (s *server) BlackholeHandler(w http.ResponseWriter, r *http.Request) {
|
||||
type spaHandler struct {
|
||||
staticPath string
|
||||
indexPath string
|
||||
webRoot string
|
||||
}
|
||||
|
||||
func (h spaHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||
@@ -175,8 +180,9 @@ func (h spaHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
|
||||
path = strings.Replace(path, webRoot, "", 1)
|
||||
|
||||
if h.webRoot != "" {
|
||||
path = strings.Replace(path, h.webRoot, "", 1)
|
||||
}
|
||||
// prepend the path with the path to the static directory
|
||||
path = filepath.Join(h.staticPath, path)
|
||||
|
||||
|
||||
6
scripts/postinstall.sh
Normal file
6
scripts/postinstall.sh
Normal file
@@ -0,0 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
chown -R 1000:1000 /opt/premiumizearrd/
|
||||
systemctl enable premiumizearrd.service
|
||||
systemctl daemon-reload
|
||||
systemctl start premiumizearrd.service
|
||||
@@ -6,13 +6,13 @@
|
||||
|
||||
<title>Premiumizearr</title>
|
||||
|
||||
<link rel='icon' type='image/png' href='/favicon.png'>
|
||||
<link rel='stylesheet' href='/{{.RootPath}}/bundle.css'>
|
||||
<link rel='icon' type='image/png' href='./{{.RootPath}}/favicon.png'>
|
||||
<link rel='stylesheet' href='./{{.RootPath}}/bundle.css'>
|
||||
<!-- Material Icons -->
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons" />
|
||||
<!-- Roboto -->
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,600,700" />
|
||||
<script defer src='/{{.RootPath}}/bundle.js'></script>
|
||||
<script defer src='./{{.RootPath}}/bundle.js'></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
let dlSpeed = 0;
|
||||
|
||||
let webRoot = new URL(window.location.href).pathname;
|
||||
let webRoot = window.location.href;
|
||||
|
||||
function parseDLSpeedFromMessage(m) {
|
||||
if (m == "Loading..." || m == undefined) return 0;
|
||||
@@ -37,7 +37,7 @@
|
||||
case "GB":
|
||||
return speed * 1024 * 1024 * 1024;
|
||||
default:
|
||||
console.log("Unknown unit: " + unit);
|
||||
console.log("Unknown unit: " + unit + " in message '" + m + "'");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -106,7 +106,7 @@
|
||||
{ key: "name", value: "Name", sort: false },
|
||||
]}
|
||||
{webRoot}
|
||||
APIpath="/api/blackhole"
|
||||
APIpath="api/blackhole"
|
||||
zebra={true}
|
||||
totalName="In Queue: "
|
||||
/>
|
||||
@@ -122,7 +122,7 @@
|
||||
]}
|
||||
updateTimeSeconds={2}
|
||||
{webRoot}
|
||||
APIpath="/api/downloads"
|
||||
APIpath="api/downloads"
|
||||
zebra={true}
|
||||
totalName="Downloading: "
|
||||
/>
|
||||
@@ -140,7 +140,7 @@
|
||||
{ key: "message", value: "Message", sort: false },
|
||||
]}
|
||||
{webRoot}
|
||||
APIpath="/api/transfers"
|
||||
APIpath="api/transfers"
|
||||
zebra={true}
|
||||
{dataToRows}
|
||||
/>
|
||||
|
||||
@@ -61,7 +61,7 @@ module.exports = {
|
||||
devServer: {
|
||||
hot: true,
|
||||
proxy: {
|
||||
'/api': 'https://projectmouseion.com/premiumizearr/api'
|
||||
'/api': 'https://yourinstance.com/api'
|
||||
}
|
||||
},
|
||||
optimization: {
|
||||
|
||||
Reference in New Issue
Block a user