[feature] support processing of (many) more media types (#3090)

* initial work replacing our media decoding / encoding pipeline with ffprobe + ffmpeg

* specify the video codec to use when generating static image from emoji

* update go-storage library (fixes incompatibility after updating go-iotools)

* maintain image aspect ratio when generating a thumbnail for it

* update readme to show go-ffmpreg

* fix a bunch of media tests, move filesize checking to callers of media manager for more flexibility

* remove extra debug from error message

* fix up incorrect function signatures

* update PutFile to just use regular file copy, as changes are file is on separate partition

* fix remaining tests, remove some unneeded tests now we're working with ffmpeg/ffprobe

* update more tests, add more code comments

* add utilities to generate processed emoji / media outputs

* fix remaining tests

* add test for opus media file, add license header to utility cmds

* limit the number of concurrently available ffmpeg / ffprobe instances

* reduce number of instances

* further reduce number of instances

* fix envparsing test with configuration variables

* update docs and configuration with new media-{local,remote}-max-size variables
This commit is contained in:
kim
2024-07-12 09:39:47 +00:00
committed by GitHub
parent 5bc567196b
commit cde2fb6244
376 changed files with 8026 additions and 54091 deletions

View File

@ -1,77 +0,0 @@
////////////////////////////////////////////////////////////////////////////
// Porgram: xmlfmt.go
// Purpose: Go XML Beautify from XML string using pure string manipulation
// Authors: Antonio Sun (c) 2016-2021, All rights reserved
////////////////////////////////////////////////////////////////////////////
package xmlfmt
import (
"html"
"regexp"
"strings"
)
var (
reg = regexp.MustCompile(`<([/!]?)([^>]+?)(/?)>`)
// NL is the newline string used in XML output, define for DOS-convenient.
NL = "\r\n"
)
// FormatXML will (purly) reformat the XML string in a readable way, without any rewriting/altering the structure.
// If your XML Comments have nested tags in them, or you're not 100% sure otherwise, pass `true` as the third parameter to this function. But don't turn it on blindly, as the code has become ten times more complicated because of it.
func FormatXML(xmls, prefix, indent string, nestedTagsInComments ...bool) string {
nestedTagsInComment := false
if len(nestedTagsInComments) > 0 {
nestedTagsInComment = nestedTagsInComments[0]
}
reXmlComments := regexp.MustCompile(`(?s)(<!--)(.*?)(-->)`)
src := regexp.MustCompile(`(?s)>\s+<`).ReplaceAllString(xmls, "><")
if nestedTagsInComment {
src = reXmlComments.ReplaceAllStringFunc(src, func(m string) string {
parts := reXmlComments.FindStringSubmatch(m)
p2 := regexp.MustCompile(`\r*\n`).ReplaceAllString(parts[2], " ")
return parts[1] + html.EscapeString(p2) + parts[3]
})
}
rf := replaceTag(prefix, indent)
r := prefix + reg.ReplaceAllStringFunc(src, rf)
if nestedTagsInComment {
r = reXmlComments.ReplaceAllStringFunc(r, func(m string) string {
parts := reXmlComments.FindStringSubmatch(m)
return parts[1] + html.UnescapeString(parts[2]) + parts[3]
})
}
return r
}
// replaceTag returns a closure function to do 's/(?<=>)\s+(?=<)//g; s(<(/?)([^>]+?)(/?)>)($indent+=$3?0:$1?-1:1;"<$1$2$3>"."\n".(" "x$indent))ge' as in Perl
// and deal with comments as well
func replaceTag(prefix, indent string) func(string) string {
indentLevel := 0
return func(m string) string {
// head elem
if strings.HasPrefix(m, "<?xml") {
return NL + prefix + strings.Repeat(indent, indentLevel) + m
}
// empty elem
if strings.HasSuffix(m, "/>") {
return NL + prefix + strings.Repeat(indent, indentLevel) + m
}
// comment elem
if strings.HasPrefix(m, "<!") {
return NL + prefix + strings.Repeat(indent, indentLevel) + m
}
// end elem
if strings.HasPrefix(m, "</") {
indentLevel--
return NL + prefix + strings.Repeat(indent, indentLevel) + m
}
defer func() {
indentLevel++
}()
return NL + prefix + strings.Repeat(indent, indentLevel) + m
}
}