feat: nfo support backend

This commit is contained in:
Simon Ding
2024-08-13 10:05:38 +08:00
parent 7017f32fe3
commit 19c6308a81
4 changed files with 134 additions and 43 deletions

View File

@@ -11,6 +11,7 @@ const (
SettingLogLevel = "log_level" SettingLogLevel = "log_level"
SettingProxy = "proxy" SettingProxy = "proxy"
SettingPlexMatchEnabled = "plexmatch_enabled" SettingPlexMatchEnabled = "plexmatch_enabled"
SettingNfoSupportEnabled = "nfo_support_enabled"
SettingAllowQiangban = "filter_qiangban" SettingAllowQiangban = "filter_qiangban"
) )

View File

@@ -2,6 +2,7 @@ package core
import ( import (
"bytes" "bytes"
"encoding/xml"
"fmt" "fmt"
"github.com/pkg/errors" "github.com/pkg/errors"
"os" "os"
@@ -15,9 +16,95 @@ import (
"polaris/pkg/storage" "polaris/pkg/storage"
"polaris/pkg/utils" "polaris/pkg/utils"
"slices" "slices"
"strconv"
"strings" "strings"
) )
func (c *Client) writeNfoFile(historyId int) error {
if !c.nfoSupportEnabled() {
return nil
}
his := c.db.GetHistory(historyId)
md, err := c.db.GetMedia(his.MediaID)
if err != nil {
return err
}
if md.MediaType == media.MediaTypeTv { //tvshow.nfo
st, err := c.getStorage(md.StorageID, media.MediaTypeTv)
if err != nil {
return errors.Wrap(err, "get storage")
}
nfoPath := filepath.Join(md.TargetDir, "tvshow.nfo")
_, err = st.ReadFile(nfoPath)
if err != nil {
log.Infof("tvshow.nfo file missing, create new one, tv series name: %s", md.NameEn)
show := Tvshow{
Title: md.NameCn,
Originaltitle: md.OriginalName,
Showtitle: md.NameCn,
Plot: md.Overview,
ID: strconv.Itoa(md.TmdbID),
Uniqueid: []UniqueId{
{
Text: strconv.Itoa(md.TmdbID),
Type: "tmdb",
Default: "true",
},
{
Text: md.ImdbID,
Type: "imdb",
},
},
}
data, err := xml.Marshal(&show)
if err != nil {
return errors.Wrap(err, "xml marshal")
}
return st.WriteFile(nfoPath, data)
}
} else if md.MediaType == media.MediaTypeMovie { //movie.nfo
st, err := c.getStorage(md.StorageID, media.MediaTypeMovie)
if err != nil {
return errors.Wrap(err, "get storage")
}
nfoPath := filepath.Join(md.TargetDir, "movie.nfo")
_, err = st.ReadFile(nfoPath)
if err != nil {
log.Infof("movie.nfo file missing, create new one, tv series name: %s", md.NameEn)
nfoData := Movie{
Title: md.NameCn,
Originaltitle: md.OriginalName,
Sorttitle: md.NameCn,
Plot: md.Overview,
ID: strconv.Itoa(md.TmdbID),
Uniqueid: []UniqueId{
{
Text: strconv.Itoa(md.TmdbID),
Type: "tmdb",
Default: "true",
},
{
Text: md.ImdbID,
Type: "imdb",
},
},
}
data, err := xml.Marshal(&nfoData)
if err != nil {
return errors.Wrap(err, "xml marshal")
}
return st.WriteFile(nfoPath, data)
}
}
return nil
}
func (c *Client) writePlexmatch(historyId int) error { func (c *Client) writePlexmatch(historyId int) error {
if !c.plexmatchEnabled() { if !c.plexmatchEnabled() {
@@ -30,7 +117,7 @@ func (c *Client) writePlexmatch(historyId int) error {
if err != nil { if err != nil {
return err return err
} }
if series.MediaType != media.MediaTypeTv { if series.MediaType != media.MediaTypeTv { //.plexmatch only support tv series
return nil return nil
} }
st, err := c.getStorage(series.StorageID, media.MediaTypeTv) st, err := c.getStorage(series.StorageID, media.MediaTypeTv)
@@ -104,6 +191,10 @@ func (c *Client) plexmatchEnabled() bool {
return c.db.GetSetting(db.SettingPlexMatchEnabled) == "true" return c.db.GetSetting(db.SettingPlexMatchEnabled) == "true"
} }
func (c *Client) nfoSupportEnabled() bool {
return c.db.GetSetting(db.SettingNfoSupportEnabled) == "true"
}
func (c *Client) getStorage(storageId int, mediaType media.MediaType) (storage.Storage, error) { func (c *Client) getStorage(storageId int, mediaType media.MediaType) (storage.Storage, error) {
st := c.db.GetStorage(storageId) st := c.db.GetStorage(storageId)
targetPath := st.TvPath targetPath := st.TvPath

View File

@@ -50,11 +50,7 @@ type Tvshow struct {
Playcount string `xml:"playcount"` Playcount string `xml:"playcount"`
Lastplayed string `xml:"lastplayed"` Lastplayed string `xml:"lastplayed"`
ID string `xml:"id"` ID string `xml:"id"`
Uniqueid []struct { Uniqueid []UniqueId `xml:"uniqueid"`
Text string `xml:",chardata"`
Type string `xml:"type,attr"`
Default string `xml:"default,attr"`
} `xml:"uniqueid"`
Genre string `xml:"genre"` Genre string `xml:"genre"`
Premiered string `xml:"premiered"` Premiered string `xml:"premiered"`
Year string `xml:"year"` Year string `xml:"year"`
@@ -82,6 +78,11 @@ type Tvshow struct {
Dateadded string `xml:"dateadded"` Dateadded string `xml:"dateadded"`
} }
type UniqueId struct {
Text string `xml:",chardata"`
Type string `xml:"type,attr"`
Default string `xml:"default,attr"`
}
type Episodedetails struct { type Episodedetails struct {
XMLName xml.Name `xml:"episodedetails"` XMLName xml.Name `xml:"episodedetails"`
@@ -150,7 +151,6 @@ type Episodedetails struct {
Dateadded string `xml:"dateadded"` Dateadded string `xml:"dateadded"`
} }
type Movie struct { type Movie struct {
XMLName xml.Name `xml:"movie"` XMLName xml.Name `xml:"movie"`
Text string `xml:",chardata"` Text string `xml:",chardata"`
@@ -193,11 +193,7 @@ type Movie struct {
Playcount string `xml:"playcount"` Playcount string `xml:"playcount"`
Lastplayed string `xml:"lastplayed"` Lastplayed string `xml:"lastplayed"`
ID string `xml:"id"` ID string `xml:"id"`
Uniqueid []struct { Uniqueid []UniqueId `xml:"uniqueid"`
Text string `xml:",chardata"`
Type string `xml:"type,attr"`
Default string `xml:"default,attr"`
} `xml:"uniqueid"`
Genre string `xml:"genre"` Genre string `xml:"genre"`
Country []string `xml:"country"` Country []string `xml:"country"`
Set struct { Set struct {

View File

@@ -74,6 +74,9 @@ func (c *Client) postTaskProcessing(id int) {
if err := c.writePlexmatch(id); err != nil { if err := c.writePlexmatch(id); err != nil {
log.Errorf("write plexmatch file error: %v", err) log.Errorf("write plexmatch file error: %v", err)
} }
if err := c.writeNfoFile(id); err != nil {
log.Errorf("write nfo file error: %v", err)
}
} }
if err := c.moveCompletedTask(id); err != nil { if err := c.moveCompletedTask(id); err != nil {
log.Infof("post tasks for id %v fail: %v", id, err) log.Infof("post tasks for id %v fail: %v", id, err)