Generate a Steven Lu list to be used in Radarr based on your plex watchlist. (as the plex watchlist feature is not yet added to the stable Radarr release)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

135 lines
3.0 KiB

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))
}