jellyfixer/main.go

140 lines
3.3 KiB
Go
Raw Permalink Normal View History

2020-12-03 11:42:25 +01:00
// nolint:gomnd,exhaustivestruct
package main
import (
"context"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"os"
"time"
"git.xsfx.dev/xsteadfastx/logginghandler"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"github.com/spf13/viper"
2020-12-03 11:42:25 +01:00
)
2020-12-09 08:38:00 +01:00
// Logic Jellyfin URL.
2020-12-03 11:42:25 +01:00
type Logic struct {
InternalURL string
ExternalURL string
2020-12-03 11:42:25 +01:00
}
2020-12-09 08:38:00 +01:00
// PublicInfo Chromecast configuration Payload.
2020-12-08 12:46:52 +01:00
type PublicInfo struct {
LocalAddress string `json:"LocalAddress,omitempty"`
2021-04-09 14:02:13 +02:00
ServerName string `json:"ServerName"`
Version string `json:"Version"`
ProductName string `json:"ProductName"`
OperatingSystem string `json:"OperatingSystem"`
ID string `json:"Id"`
StartupWizardCompleted bool `json:"StartupWizardCompleted"`
2020-12-08 12:46:52 +01:00
}
// nolint:funlen
2020-12-03 11:42:25 +01:00
func (l Logic) ServeHTTP(w http.ResponseWriter, r *http.Request) {
logger := logginghandler.Logger(r)
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) // nolint:gomnd
defer cancel()
req, err := http.NewRequestWithContext(ctx, http.MethodGet, fmt.Sprintf("%s/System/Info/Public", l.InternalURL), nil)
2020-12-03 11:42:25 +01:00
if err != nil {
logger.Error().Msg(err.Error())
http.Error(w, "could not create request jellyfin", http.StatusInternalServerError)
return
}
resp, err := http.DefaultClient.Do(req)
if err != nil {
logger.Error().Msg(err.Error())
http.Error(w, "could not access jellyfin", http.StatusInternalServerError)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
logger.Error().Msg(err.Error())
http.Error(w, "could not read body", http.StatusInternalServerError)
return
}
2021-04-09 14:02:13 +02:00
logger.Debug().Str("body", string(body)).Msg("read body")
2020-12-08 12:46:52 +01:00
var jd PublicInfo
2021-05-06 10:19:39 +02:00
2020-12-03 11:42:25 +01:00
if err := json.Unmarshal(body, &jd); err != nil {
logger.Error().Msg(err.Error())
http.Error(w, "could not unmarshal body", http.StatusInternalServerError)
return
}
2020-12-09 08:38:00 +01:00
var nd PublicInfo
2021-05-06 10:19:39 +02:00
nd.ServerName = jd.ServerName
nd.Version = jd.Version
nd.ProductName = jd.ProductName
nd.OperatingSystem = jd.OperatingSystem
nd.ID = jd.ID
nd.StartupWizardCompleted = jd.StartupWizardCompleted
// When there is no external url defined, it wont include it in the response.
if l.ExternalURL != "" {
nd.LocalAddress = l.ExternalURL
}
2020-12-09 08:38:00 +01:00
bd, err := json.Marshal(nd)
2020-12-03 11:42:25 +01:00
if err != nil {
logger.Error().Msg(err.Error())
http.Error(w, "could not marshal body", http.StatusInternalServerError)
return
}
if _, err := w.Write(bd); err != nil {
2020-12-03 11:42:25 +01:00
logger.Error().Msg(err.Error())
}
}
func main() {
log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr})
log.Logger = log.Logger.With().Caller().Logger()
viper.SetEnvPrefix("jellyfixer")
if err := viper.BindEnv("internal_url"); err != nil {
log.Fatal().Msg(err.Error())
}
if err := viper.BindEnv("external_url"); err != nil {
log.Fatal().Msg(err.Error())
2020-12-03 11:42:25 +01:00
}
if len(os.Args) == 2 {
viper.SetConfigFile(os.Args[1])
}
viper.AutomaticEnv()
if viper.GetString("internal_url") == "" {
log.Fatal().Msg("needs key 'internal_url'")
}
l := Logic{
InternalURL: viper.GetString("internal_url"),
ExternalURL: viper.GetString("external_url"),
}
2020-12-03 11:42:25 +01:00
handler := logginghandler.Handler(l)
2020-12-08 12:46:52 +01:00
2020-12-03 11:42:25 +01:00
http.Handle("/", handler)
log.Info().Msg("starting server...")
log.Fatal().Msg(http.ListenAndServe("0.0.0.0:8088", nil).Error())
}