115 lines
3 KiB
Go
115 lines
3 KiB
Go
|
|
package tmdb
|
||
|
|
|
||
|
|
import (
|
||
|
|
"context"
|
||
|
|
"fmt"
|
||
|
|
"math/rand/v2"
|
||
|
|
"time"
|
||
|
|
|
||
|
|
"codeberg.org/danjones000/my-log/files"
|
||
|
|
"codeberg.org/danjones000/my-log/models"
|
||
|
|
sdk "github.com/cyruzin/golang-tmdb"
|
||
|
|
)
|
||
|
|
|
||
|
|
func Drop(ctx context.Context, url string, now time.Time) (models.Log, error) {
|
||
|
|
var log models.Log
|
||
|
|
select {
|
||
|
|
case <-ctx.Done():
|
||
|
|
return log, context.Cause(ctx)
|
||
|
|
default:
|
||
|
|
}
|
||
|
|
|
||
|
|
inf, err := Parse(url)
|
||
|
|
if err != nil {
|
||
|
|
return log, err
|
||
|
|
}
|
||
|
|
|
||
|
|
var entry models.Entry
|
||
|
|
|
||
|
|
if inf.Type == Movie {
|
||
|
|
det, err := FetchMovieDetails(inf)
|
||
|
|
if err != nil {
|
||
|
|
return log, err
|
||
|
|
}
|
||
|
|
entry, err = GetLogEntryForMovie(det)
|
||
|
|
if err != nil {
|
||
|
|
return log, err
|
||
|
|
}
|
||
|
|
} else if inf.Type == Series {
|
||
|
|
det, err := FetchEpisodeDetails(inf)
|
||
|
|
if err != nil {
|
||
|
|
return log, err
|
||
|
|
}
|
||
|
|
entry, err = GetLogEntryForEpisode(det)
|
||
|
|
if err != nil {
|
||
|
|
return log, err
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
return log, fmt.Errorf("unknown type: %s", inf.Type)
|
||
|
|
}
|
||
|
|
|
||
|
|
log.Name = "watched"
|
||
|
|
log.Entries = []models.Entry{entry}
|
||
|
|
|
||
|
|
files.Append(log)
|
||
|
|
|
||
|
|
return log, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func GetLogEntryForEpisode(det TVDetails) (ent models.Entry, err error) {
|
||
|
|
ent.Title = fmt.Sprintf("%s - %s %dx%02d", det.Episode.Name, det.Series.Name, det.Episode.SeasonNumber, det.Episode.EpisodeNumber)
|
||
|
|
ent.Date = time.Now().Local()
|
||
|
|
|
||
|
|
fields := &models.Metas{}
|
||
|
|
fields.AppendTo("tmdb", det.Series.ID)
|
||
|
|
fields.AppendTo("show", det.Series.Name)
|
||
|
|
fields.AppendTo("episode", det.Episode.Name)
|
||
|
|
fields.AppendTo("air_date", det.Episode.AirDate)
|
||
|
|
fields.AppendTo("id", fmt.Sprintf("tag:themoviedborg,%s:Episode/%d/season/%d/episode/%d/%d", det.Episode.AirDate, det.Series.ID, det.Episode.SeasonNumber, det.Episode.EpisodeNumber, rand.Int()))
|
||
|
|
fields.AppendTo("url", fmt.Sprintf("https://themoviedb.org/tv/%d/season/%d/episode/%d", det.Series.ID, det.Episode.SeasonNumber, det.Episode.EpisodeNumber))
|
||
|
|
fields.AppendTo("episode_num", det.Episode.EpisodeNumber)
|
||
|
|
fields.AppendTo("season_num", det.Episode.SeasonNumber)
|
||
|
|
fields.AppendTo("via", "drop-tmdb")
|
||
|
|
if det.Episode.Overview != "" {
|
||
|
|
fields.AppendTo("note", det.Episode.Overview)
|
||
|
|
}
|
||
|
|
|
||
|
|
ent.Fields = *fields
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
func GetLogEntryForMovie(det *sdk.MovieDetails) (ent models.Entry, err error) {
|
||
|
|
ent.Title = fmt.Sprintf("%s (%s)", det.Title, det.ReleaseDate)
|
||
|
|
ent.Date = time.Now().Local()
|
||
|
|
|
||
|
|
fields := &models.Metas{}
|
||
|
|
fields.AppendTo("tmdb", det.ID)
|
||
|
|
fields.AppendTo("id", fmt.Sprintf("tag:themoviedborg,%s:Movie/%d/%d", det.ReleaseDate, det.ID, rand.Int()))
|
||
|
|
fields.AppendTo("url", fmt.Sprintf("https://themoviedb.org/movie/%d", det.ID))
|
||
|
|
// url https://www.themoviedb.org/movie/776503
|
||
|
|
fields.AppendTo("release_date", det.ReleaseDate)
|
||
|
|
cts := det.OriginCountry
|
||
|
|
if len(cts) == 1 {
|
||
|
|
fields.AppendTo("country", cts[0])
|
||
|
|
} else if len(cts) > 1 {
|
||
|
|
fields.AppendTo("country", cts)
|
||
|
|
}
|
||
|
|
|
||
|
|
gens := make([]string, len(det.Genres))
|
||
|
|
for idx, g := range det.Genres {
|
||
|
|
gens[idx] = g.Name
|
||
|
|
}
|
||
|
|
if len(gens) == 1 {
|
||
|
|
fields.AppendTo("genre", gens[0])
|
||
|
|
} else if len(gens) > 1 {
|
||
|
|
fields.AppendTo("genre", gens)
|
||
|
|
}
|
||
|
|
|
||
|
|
// fields.AppendTo("mpaa")
|
||
|
|
if det.Overview != "" {
|
||
|
|
fields.AppendTo("note", det.Overview)
|
||
|
|
}
|
||
|
|
|
||
|
|
ent.Fields = *fields
|
||
|
|
return
|
||
|
|
}
|