package ytdlp import ( "context" "fmt" "strings" "time" "codeberg.org/danjones000/my-log/files" "codeberg.org/danjones000/my-log/models" ytd "github.com/lrstanley/go-ytdlp" ) // Drop adds the URL specified by the url to the watched log. func Drop(ctx context.Context, url string) (models.Log, error) { var ent models.Entry var log models.Log if ctx.Err() != nil { return log, context.Cause(ctx) } info, err := Fetch(ctx, url) if err != nil { return log, err } now := time.Now() ent.Date = now metas := &ent.Fields *metas = metas.Set("id", getID(now, info)) source := FirstNonZero(info.ExtractorKey, info.WebpageURLDomain, new("Web Video")) *metas = metas.Set("source", source) ent.Title = FirstNonZero(info.Title, info.AltTitle, new(fmt.Sprintf("%s %s", source, info.ID))) setNote(metas, info) setArtist(metas, info) setTags(metas, info) setUrl(metas, info, url) // TODO Add show info log = models.Log{Name: "watched", Entries: []models.Entry{ent}} if err := files.Append(log); err != nil { return log, err } return log, nil } func getID(now time.Time, info *ytd.ExtractedInfo) string { id := new(strings.Builder) id.WriteString("tag:") id.WriteString(FirstNonZero(info.WebpageURLDomain, new("goodevilgenius.org"))) id.WriteByte(',') id.WriteString(now.Format("2006")) id.WriteRune(':') id.WriteString(info.ID) id.WriteRune('/') fmt.Fprintf(id, "%d", now.Unix()) return id.String() } func setNote(metas *models.Metas, info *ytd.ExtractedInfo) { desc := FirstNonZero(info.Description) if desc != "" { desc = strings.SplitN(desc, "\n", 2)[0] *metas = metas.Set("note", desc) } } func setArtist(metas *models.Metas, info *ytd.ExtractedInfo) { art := FirstNonZero(info.Artist, info.AlbumArtist, info.Uploader) if art != "" { *metas = metas.Set("artist", art) } } func setTags(metas *models.Metas, info *ytd.ExtractedInfo) { tags := make([]any, 0, len(info.Tags)+len(info.Categories)) for _, t := range info.Tags { tags = append(tags, t) } for _, c := range info.Categories { tags = append(tags, c) } if len(tags) > 0 { *metas = metas.Set("tags", tags) } } func setDuration(metas *models.Metas, info *ytd.ExtractedInfo) { dur := FirstNonZero(info.Duration) if dur > 0 { *metas = metas.Set("duration", dur) } } func setUrl(metas *models.Metas, info *ytd.ExtractedInfo, origUrl string) { url := FirstNonZero(info.WebpageURL, info.PageURL, info.URL, &origUrl) *metas = metas.Set("url", url) } func FirstNonZero[T comparable](vals ...*T) T { var z T for _, v := range vals { if v != nil && *v != z { return *v } } return z }