70 lines
1.6 KiB
Go
70 lines
1.6 KiB
Go
|
package ytsync
|
||
|
|
||
|
import (
|
||
|
"regexp"
|
||
|
"strings"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
type video struct {
|
||
|
id string
|
||
|
channelID string
|
||
|
channelTitle string
|
||
|
title string
|
||
|
description string
|
||
|
playlistPosition int64
|
||
|
publishedAt time.Time
|
||
|
dir string
|
||
|
}
|
||
|
|
||
|
func (v video) getFilename() string {
|
||
|
return v.dir + "/" + v.id + ".mp4"
|
||
|
}
|
||
|
|
||
|
func (v video) getClaimName() string {
|
||
|
maxLen := 40
|
||
|
reg := regexp.MustCompile(`[^a-zA-Z0-9]+`)
|
||
|
|
||
|
chunks := strings.Split(strings.ToLower(strings.Trim(reg.ReplaceAllString(v.title, "-"), "-")), "-")
|
||
|
|
||
|
name := chunks[0]
|
||
|
if len(name) > maxLen {
|
||
|
return name[:maxLen]
|
||
|
}
|
||
|
|
||
|
for _, chunk := range chunks[1:] {
|
||
|
tmpName := name + "-" + chunk
|
||
|
if len(tmpName) > maxLen {
|
||
|
if len(name) < 20 {
|
||
|
name = tmpName[:maxLen]
|
||
|
}
|
||
|
break
|
||
|
}
|
||
|
name = tmpName
|
||
|
}
|
||
|
|
||
|
return name
|
||
|
}
|
||
|
|
||
|
func (v video) getAbbrevDescription() string {
|
||
|
maxLines := 10
|
||
|
description := strings.TrimSpace(v.description)
|
||
|
if strings.Count(description, "\n") < maxLines {
|
||
|
return description
|
||
|
}
|
||
|
return strings.Join(strings.Split(description, "\n")[:maxLines], "\n") + "\n..."
|
||
|
}
|
||
|
|
||
|
// sorting videos
|
||
|
type byPublishedAt []video
|
||
|
|
||
|
func (a byPublishedAt) Len() int { return len(a) }
|
||
|
func (a byPublishedAt) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
|
||
|
func (a byPublishedAt) Less(i, j int) bool { return a[i].publishedAt.Before(a[j].publishedAt) }
|
||
|
|
||
|
type byPlaylistPosition []video
|
||
|
|
||
|
func (a byPlaylistPosition) Len() int { return len(a) }
|
||
|
func (a byPlaylistPosition) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
|
||
|
func (a byPlaylistPosition) Less(i, j int) bool { return a[i].playlistPosition < a[j].playlistPosition }
|