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 }) }