clipper/backend/media/youtube.go

67 lines
2.0 KiB
Go

package media
import (
"sort"
"strings"
youtubev2 "github.com/kkdai/youtube/v2"
)
// FilterYoutubeAudio returns the provided formats ordered in descending preferred
// order. It may have fewer items than the original slice, or none at all.
func FilterYoutubeAudio(inFormats youtubev2.FormatList) youtubev2.FormatList {
var formats youtubev2.FormatList
for _, format := range inFormats {
if format.FPS == 0 && format.AudioChannels > 0 {
formats = append(formats, format)
}
}
sort.SliceStable(formats, func(i, j int) bool {
isOpusI := strings.Contains(formats[i].MimeType, "opus")
isOpusJ := strings.Contains(formats[j].MimeType, "opus")
if isOpusI && isOpusJ {
isStereoI := formats[i].AudioChannels == 2
isStereoJ := formats[j].AudioChannels == 2
if isStereoI && isStereoJ {
return formats[i].ContentLength < formats[j].ContentLength
}
return isStereoI
}
return isOpusI
})
return formats
}
// FilterYoutubeVideo returns the provided formats ordered in descending preferred
// order. It may have fewer items than the original slice, or none at all.
func FilterYoutubeVideo(inFormats youtubev2.FormatList) youtubev2.FormatList {
var formats youtubev2.FormatList
for _, format := range inFormats {
if format.FPS > 0 && format.ContentLength > 0 {
formats = append(formats, format)
}
}
sort.SliceStable(formats, func(i, j int) bool {
isMP4I := strings.Contains(formats[i].MimeType, "mp4")
isMP4J := strings.Contains(formats[j].MimeType, "mp4")
if isMP4I && isMP4J {
return formats[i].ContentLength < formats[j].ContentLength
}
return isMP4I
})
return formats
}
// SortYoutubeThumbnails sorts the provided thumbnails ordered in descending preferred order.
func SortYoutubeThumbnails(thumbnails youtubev2.Thumbnails) {
sort.SliceStable(thumbnails, func(i, j int) bool {
// TODO: get rid of these magic 177s.
isMinSizeI := thumbnails[i].Width >= 177
isMinSizeJ := thumbnails[j].Width >= 177
if isMinSizeI && isMinSizeJ {
return thumbnails[i].Width < thumbnails[j].Width
}
return isMinSizeI
})
}