Skip to content

Commit

Permalink
first commit
Browse files Browse the repository at this point in the history
  • Loading branch information
ajmandourah committed May 28, 2024
0 parents commit 6c5641c
Show file tree
Hide file tree
Showing 14 changed files with 724 additions and 0 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
build/
cmd/bazarr-sync/config.yaml

2 changes: 2 additions & 0 deletions build.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
$Env:GOOS = "linux"; $Env:GOARCH = "amd64"; go build -o .\build\ .\cmd\bazarr-sync\
$Env:GOOS = "windows"; $Env:GOARCH = "amd64"; go build -o .\build\ .\cmd\bazarr-sync\
9 changes: 9 additions & 0 deletions cmd/bazarr-sync/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package main

import (
"ajmandourah/bazarr-sync/internal/cli"
)

func main() {
cli.Execute()
}
16 changes: 16 additions & 0 deletions example/config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#config file example, please don't use quotes
###########################
#
#Address: the address of your bazarr instance. this can be either an ip address or a url (if you reverse proxy bazarr),
#this can also be bazarr's container name if you use docker, make sure bazarr-sync instance is in the same network as bazarr and the network not the default
#docker network as name resolution won't happen there.
Address: <bazarr_address>
#
#Port: bazarrs port. by default bazarr uses 6767. in case of reverse proxy, you can use 443 or 80 as per your configuration
Port: <port>
#
#protocol: this can be http or https
Protocol: https
#
#ApiToken: you can get this from bazarr setting>general . no quotes needed.
ApiToken: <Bazarr_api_token>
35 changes: 35 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
module ajmandourah/bazarr-sync

go 1.22.3

require (
github.com/schollz/progressbar/v3 v3.14.3
github.com/spf13/cobra v1.8.0
github.com/spf13/viper v1.18.2
)

require (
github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/magiconair/properties v1.8.7 // indirect
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/pelletier/go-toml/v2 v2.1.0 // indirect
github.com/rivo/uniseg v0.4.7 // indirect
github.com/sagikazarmark/locafero v0.4.0 // indirect
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
github.com/sourcegraph/conc v0.3.0 // indirect
github.com/spf13/afero v1.11.0 // indirect
github.com/spf13/cast v1.6.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/subosito/gotenv v1.6.0 // indirect
go.uber.org/atomic v1.9.0 // indirect
go.uber.org/multierr v1.9.0 // indirect
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect
golang.org/x/sys v0.20.0 // indirect
golang.org/x/term v0.20.0 // indirect
golang.org/x/text v0.14.0 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
86 changes: 86 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1e29fT/6vq2aBdFsgNPmy8qMdSay1npru+Sw=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ=
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw=
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4=
github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ=
github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4=
github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ=
github.com/schollz/progressbar/v3 v3.14.3 h1:oOuWW19ka12wxYU1XblR4n16wF/2Y1dBLMarMo6p4xU=
github.com/schollz/progressbar/v3 v3.14.3/go.mod h1:aT3UQ7yGm+2ZjeXPqsjTenwL3ddUiuZ0kfQ/2tHlyNI=
github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8=
github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY=
github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0=
github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0=
github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ=
github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI=
go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ=
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g=
golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw=
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
169 changes: 169 additions & 0 deletions internal/bazarr/bazarr.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
package bazarr

import (
"ajmandourah/bazarr-sync/internal/client"
"ajmandourah/bazarr-sync/internal/config"
"encoding/json"
"errors"
"fmt"
"io"
"net/url"
"os"
"strconv"
)

var cfg config.Config

func QueryMovies(cfg config.Config) (movies_info, error) {
c := client.GetClient(cfg.ApiToken)
url , _ := url.JoinPath(cfg.ApiUrl, "movies")
resp, err := c.Get(url)
if err != nil{
fmt.Fprintln(os.Stderr, "Connection Error: ", err)
return movies_info{},err
}
defer resp.Body.Close()

if resp.StatusCode != 200 {
fmt.Fprintln(os.Stderr, "Connection Error: ", "Response status is not 200. Are you sure the address/port are correct?")
return movies_info{}, errors.New("Error: Status code not 200")
}

body, err := io.ReadAll(resp.Body)
if err != nil {
fmt.Fprintln(os.Stderr, "Reading Url Error: ", err)
return movies_info{},err
}
var data movies_info
err = json.Unmarshal(body, &data)
if err != nil {
fmt.Println("Error in Unmarshaling json body", err)
return movies_info{},err
}
return data, nil
}

func QuerySeries(cfg config.Config) (shows_info, error){
c := client.GetClient(cfg.ApiToken)
url , _ := url.JoinPath(cfg.ApiUrl, "series")
resp, err := c.Get(url)
if err != nil{
fmt.Fprintln(os.Stderr, "Connection Error: ", err)
return shows_info{},err
}
defer resp.Body.Close()

if resp.StatusCode != 200 {
fmt.Fprintln(os.Stderr, "Connection Error: ", "Response status is not 200. Are you sure the address/port are correct?")
return shows_info{}, errors.New("Error: Status code not 200")
}

body, err := io.ReadAll(resp.Body)
if err != nil {
fmt.Fprintln(os.Stderr, "Reading Url Error: ", err)
return shows_info{},err
}
var data shows_info
err = json.Unmarshal(body, &data)
if err != nil {
fmt.Println("Error in Unmarshaling json body", err)
return shows_info{},err
}
return data, nil
}

func QueryEpisodes(cfg config.Config, seriesId int) (episodes_info,error){
c := client.GetClient(cfg.ApiToken)
u , _ := url.JoinPath(cfg.ApiUrl, "episodes")
_url,_ := url.Parse(u)
queryUrl := _url.Query()
queryUrl.Set("seriesid[]", strconv.Itoa(seriesId))
_url.RawQuery = queryUrl.Encode()

resp, err := c.Get(_url.String())
if err != nil{
fmt.Fprintln(os.Stderr, "Connection Error: ", err)
return episodes_info{},err
}
defer resp.Body.Close()

if resp.StatusCode != 200 {
fmt.Fprintln(os.Stderr, "Connection Error: ", "Response status is not 200. Are you sure the address/port are correct?")
return episodes_info{}, errors.New("Error: Status code not 200")
}

body, err := io.ReadAll(resp.Body)
if err != nil {
fmt.Fprintln(os.Stderr, "Reading Url Error: ", err)
return episodes_info{},err
}
var data episodes_info
err = json.Unmarshal(body, &data)
if err != nil {
fmt.Println("Error in Unmarshaling json body", err)
return episodes_info{},err
}
return data, nil


}

func GetSyncParams(_type string, id int, subtitleInfo subtitle_info) Sync_params{
var params Sync_params
params.Action = "sync"
params.Path = subtitleInfo.Path
params.Id = id
params.Lang = subtitleInfo.Code2
params.Type = _type
params.Gss = "False"
params.No_framerate_fix = "False"
return params
}

func Sync(cfg config.Config, params Sync_params) bool {
c := client.GetClient(cfg.ApiToken)
u , _ := url.JoinPath(cfg.ApiUrl, "subtitles")

_url,_ := url.Parse(u)
queryUrl := _url.Query()
queryUrl.Set("path", params.Path)
queryUrl.Set("id", strconv.Itoa(params.Id))
queryUrl.Set("action", "sync")
queryUrl.Set("language", params.Lang)
queryUrl.Set("type", params.Type)
_url.RawQuery = queryUrl.Encode()
resp, err := c.Patch(_url.String())
if err != nil{
fmt.Fprintln(os.Stderr, "Connection Error: ", err)
return false
}
if resp.StatusCode != 204 {
return false
}
return true

}

func HealthCheck(cfg config.Config) {
c := client.GetClient(cfg.ApiToken)
url , _ := url.JoinPath(cfg.ApiUrl, "system/status")
resp, err := c.Get(url)
if err != nil{
fmt.Fprintln(os.Stderr, "Connection Error: ", err)
}
defer resp.Body.Close()

if resp.StatusCode != 200 {
fmt.Fprintln(os.Stderr, "Connection Error: ", "Response status is not 200. Are you sure the address/port are correct?")
return
}

body, err := io.ReadAll(resp.Body)
if err != nil {
fmt.Fprintln(os.Stderr, "Reading Url Error: ", err)
}
var data version
json.Unmarshal(body,&data)
fmt.Println("Bazarr version: ", data.Data.Bazarr_version)
return
}
53 changes: 53 additions & 0 deletions internal/bazarr/structs.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package bazarr

type version struct {
Data struct {
Bazarr_version string `json:"bazarr_version"`
} `json:"data"`
}

type Sync_params struct {
Path string `json:"path"` //subtitle path, could be null??
Id int `json:"id"` //radarrId or episodeId
Action string `json:"action"` //sync, translate
Lang string `json:"language"` //code2
Type string `json:"type"` //"episode", "movie"
Gss string `json:"gss"`
No_framerate_fix string `json:"no_fix_framerate"`
}

type movies_info struct {
Data []movie `json:"data"`
}

type shows_info struct {
Data []struct{
Title string `json:"title"`
Monitored bool `json:"monitored"`
SonarrSeriesId int `json:"sonarrSeriesId"`
} `json:"data"`
}

type episodes_info struct {
Data []episode `json:"data"`
}

type episode struct {
Title string `json:"title"`
Monitored bool `json:"monitored"`
SonarrEpisodeId int `json:"sonarrEpisodeId"`
Subtitles []subtitle_info `json:"subtitles"`
}

type movie struct{
Title string `json:"title"`
Monitored bool `json:"monitored"`
RadarrId int `json:"radarrId"`
Subtitles []subtitle_info `json:"subtitles"`
}

type subtitle_info struct {
Path string `json:"path"`
Code2 string `json:"code2"`
File_size int `json:"file_size"`
}
Loading

0 comments on commit 6c5641c

Please sign in to comment.