Browse Source

init

master
Kristof Vandam 4 years ago
commit
325af97b63
  1. 1
      .gitignore
  2. 7
      README.md
  3. 3
      go.mod
  4. 135
      main.go

1
.gitignore vendored

@ -0,0 +1 @@
main

7
README.md

@ -0,0 +1,7 @@
# Usage
```
curl http://127.0.0.1:3478?token=plext0ken
```
Add the request in Radarr under 'lists' > 'steven lu custom'

3
go.mod

@ -0,0 +1,3 @@
module plex-watchlist
go 1.16

135
main.go

@ -0,0 +1,135 @@
package main
import (
"log"
"fmt"
"sync"
"regexp"
"strings"
"encoding/json"
"encoding/xml"
"io/ioutil"
"net/http"
)
var (
urlBase string = "https://metadata.provider.plex.tv"
urlType string = "movie"
urlToken string = "pass_as_get_param:token"
)
type Watchlist struct {
Videos []struct {
Key string `xml:"key,attr"`
Type string `xml:"type,attr"`
Url string `xml:"publicPagesURL,attr"`
Title string `xml:"title,attr"`
Year int `xml:"year,attr"`
ImdbId string
} `xml:"Video"`
}
type Metadata struct {
Video struct {
Title string `xml:"title,attr"`
Guid []struct {
Text string `xml:",chardata"`
ID string `xml:"id,attr"`
} `xml:"Guid"`
} `xml:"Video"`
}
type StevenLuJson struct {
Title string `json:"title"`
ImdbId string `json:"imdb_id"`
}
func urlTypeInt() string {
switch urlType {
case "movie":
return "1"
case "serie":
return "2"
default:
return "1"
}
}
func generateUrl(get string) string {
return urlBase + get + "?type=" + urlTypeInt() + "&X-Plex-Token=" + urlToken
}
func requestWatchlist() Watchlist {
log.Println(generateUrl("/library/sections/watchlist/all"))
resp, err := http.Get(generateUrl("/library/sections/watchlist/all"))
if err != nil {
log.Fatalln(err)
}
byteWatchlist, _ := ioutil.ReadAll(resp.Body)
watchlist := Watchlist{}
xml.Unmarshal(byteWatchlist, &watchlist)
return watchlist
}
func requestMetadata(watchlist Watchlist) []Metadata {
sliceMetadata := []Metadata{}
var wg sync.WaitGroup
wg.Add(len(watchlist.Videos))
for i := 0; i < len(watchlist.Videos); i++ {
go (func(url string) {
log.Println(url)
resp, err := http.Get(url)
if err != nil {
log.Fatalln(err)
}
byteImdb, _ := ioutil.ReadAll(resp.Body)
metadata := Metadata{}
xml.Unmarshal(byteImdb, &metadata)
sliceMetadata = append(sliceMetadata, metadata)
wg.Done()
})(generateUrl(watchlist.Videos[i].Key))
}
wg.Wait()
return sliceMetadata
}
func responseStevenLu(metadata []Metadata) string {
sliceStevenLu := []StevenLuJson{}
for _, data := range metadata {
munged := StevenLuJson{}
munged.Title = data.Video.Title
for _, v := range data.Video.Guid {
matched, _ := regexp.MatchString("imdb://", v.ID)
if matched {
munged.ImdbId = strings.Replace(v.ID, "imdb://", "", 1)
}
}
sliceStevenLu = append(sliceStevenLu, munged)
}
b, err := json.Marshal(sliceStevenLu)
if err != nil {
log.Println(err)
}
return string(b)
}
func RequestHandler(w http.ResponseWriter, r *http.Request) {
query := r.URL.Query()
urlToken = query["token"][0]
log.Println("token:", urlToken)
log.Println("type:", urlType)
watchlist := requestWatchlist()
metadata := requestMetadata(watchlist)
fmt.Fprintf(w, responseStevenLu(metadata))
}
func main() {
http.HandleFunc("/", RequestHandler)
log.Println("Listening...")
log.Fatal(http.ListenAndServe(":3478", nil))
}
Loading…
Cancel
Save