mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-31 06:42:25 -05:00 
			
		
		
		
	* 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
		
	
			
		
			
				
	
	
		
			314 lines
		
	
	
	
		
			6.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			314 lines
		
	
	
	
		
			6.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package wasip1
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 
 | |
| 	"github.com/tetratelabs/wazero/experimental/sys"
 | |
| )
 | |
| 
 | |
| // Errno is neither uint16 nor an alias for parity with wasm.ValueType.
 | |
| type Errno = uint32
 | |
| 
 | |
| // ErrnoName returns the POSIX error code name, except ErrnoSuccess, which is
 | |
| // not an error. e.g. Errno2big -> "E2BIG"
 | |
| func ErrnoName(errno uint32) string {
 | |
| 	if int(errno) < len(errnoToString) {
 | |
| 		return errnoToString[errno]
 | |
| 	}
 | |
| 	return fmt.Sprintf("errno(%d)", errno)
 | |
| }
 | |
| 
 | |
| // Note: Below prefers POSIX symbol names over WASI ones, even if the docs are from WASI.
 | |
| // See https://linux.die.net/man/3/errno
 | |
| // See https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#variants-1
 | |
| const (
 | |
| 	// ErrnoSuccess No error occurred. System call completed successfully.
 | |
| 	ErrnoSuccess Errno = iota
 | |
| 	// Errno2big Argument list too long.
 | |
| 	Errno2big
 | |
| 	// ErrnoAcces Permission denied.
 | |
| 	ErrnoAcces
 | |
| 	// ErrnoAddrinuse Address in use.
 | |
| 	ErrnoAddrinuse
 | |
| 	// ErrnoAddrnotavail Address not available.
 | |
| 	ErrnoAddrnotavail
 | |
| 	// ErrnoAfnosupport Address family not supported.
 | |
| 	ErrnoAfnosupport
 | |
| 	// ErrnoAgain Resource unavailable, or operation would block.
 | |
| 	ErrnoAgain
 | |
| 	// ErrnoAlready Connection already in progress.
 | |
| 	ErrnoAlready
 | |
| 	// ErrnoBadf Bad file descriptor.
 | |
| 	ErrnoBadf
 | |
| 	// ErrnoBadmsg Bad message.
 | |
| 	ErrnoBadmsg
 | |
| 	// ErrnoBusy Device or resource busy.
 | |
| 	ErrnoBusy
 | |
| 	// ErrnoCanceled Operation canceled.
 | |
| 	ErrnoCanceled
 | |
| 	// ErrnoChild No child processes.
 | |
| 	ErrnoChild
 | |
| 	// ErrnoConnaborted Connection aborted.
 | |
| 	ErrnoConnaborted
 | |
| 	// ErrnoConnrefused Connection refused.
 | |
| 	ErrnoConnrefused
 | |
| 	// ErrnoConnreset Connection reset.
 | |
| 	ErrnoConnreset
 | |
| 	// ErrnoDeadlk Resource deadlock would occur.
 | |
| 	ErrnoDeadlk
 | |
| 	// ErrnoDestaddrreq Destination address required.
 | |
| 	ErrnoDestaddrreq
 | |
| 	// ErrnoDom Mathematics argument out of domain of function.
 | |
| 	ErrnoDom
 | |
| 	// ErrnoDquot Reserved.
 | |
| 	ErrnoDquot
 | |
| 	// ErrnoExist File exists.
 | |
| 	ErrnoExist
 | |
| 	// ErrnoFault Bad address.
 | |
| 	ErrnoFault
 | |
| 	// ErrnoFbig File too large.
 | |
| 	ErrnoFbig
 | |
| 	// ErrnoHostunreach Host is unreachable.
 | |
| 	ErrnoHostunreach
 | |
| 	// ErrnoIdrm Identifier removed.
 | |
| 	ErrnoIdrm
 | |
| 	// ErrnoIlseq Illegal byte sequence.
 | |
| 	ErrnoIlseq
 | |
| 	// ErrnoInprogress Operation in progress.
 | |
| 	ErrnoInprogress
 | |
| 	// ErrnoIntr Interrupted function.
 | |
| 	ErrnoIntr
 | |
| 	// ErrnoInval Invalid argument.
 | |
| 	ErrnoInval
 | |
| 	// ErrnoIo I/O error.
 | |
| 	ErrnoIo
 | |
| 	// ErrnoIsconn Socket is connected.
 | |
| 	ErrnoIsconn
 | |
| 	// ErrnoIsdir Is a directory.
 | |
| 	ErrnoIsdir
 | |
| 	// ErrnoLoop Too many levels of symbolic links.
 | |
| 	ErrnoLoop
 | |
| 	// ErrnoMfile File descriptor value too large.
 | |
| 	ErrnoMfile
 | |
| 	// ErrnoMlink Too many links.
 | |
| 	ErrnoMlink
 | |
| 	// ErrnoMsgsize Message too large.
 | |
| 	ErrnoMsgsize
 | |
| 	// ErrnoMultihop Reserved.
 | |
| 	ErrnoMultihop
 | |
| 	// ErrnoNametoolong Filename too long.
 | |
| 	ErrnoNametoolong
 | |
| 	// ErrnoNetdown Network is down.
 | |
| 	ErrnoNetdown
 | |
| 	// ErrnoNetreset Connection aborted by network.
 | |
| 	ErrnoNetreset
 | |
| 	// ErrnoNetunreach Network unreachable.
 | |
| 	ErrnoNetunreach
 | |
| 	// ErrnoNfile Too many files open in system.
 | |
| 	ErrnoNfile
 | |
| 	// ErrnoNobufs No buffer space available.
 | |
| 	ErrnoNobufs
 | |
| 	// ErrnoNodev No such device.
 | |
| 	ErrnoNodev
 | |
| 	// ErrnoNoent No such file or directory.
 | |
| 	ErrnoNoent
 | |
| 	// ErrnoNoexec Executable file format error.
 | |
| 	ErrnoNoexec
 | |
| 	// ErrnoNolck No locks available.
 | |
| 	ErrnoNolck
 | |
| 	// ErrnoNolink Reserved.
 | |
| 	ErrnoNolink
 | |
| 	// ErrnoNomem Not enough space.
 | |
| 	ErrnoNomem
 | |
| 	// ErrnoNomsg No message of the desired type.
 | |
| 	ErrnoNomsg
 | |
| 	// ErrnoNoprotoopt No message of the desired type.
 | |
| 	ErrnoNoprotoopt
 | |
| 	// ErrnoNospc No space left on device.
 | |
| 	ErrnoNospc
 | |
| 	// ErrnoNosys function not supported.
 | |
| 	ErrnoNosys
 | |
| 	// ErrnoNotconn The socket is not connected.
 | |
| 	ErrnoNotconn
 | |
| 	// ErrnoNotdir Not a directory or a symbolic link to a directory.
 | |
| 	ErrnoNotdir
 | |
| 	// ErrnoNotempty Directory not empty.
 | |
| 	ErrnoNotempty
 | |
| 	// ErrnoNotrecoverable State not recoverable.
 | |
| 	ErrnoNotrecoverable
 | |
| 	// ErrnoNotsock Not a socket.
 | |
| 	ErrnoNotsock
 | |
| 	// ErrnoNotsup Not supported, or operation not supported on socket.
 | |
| 	ErrnoNotsup
 | |
| 	// ErrnoNotty Inappropriate I/O control operation.
 | |
| 	ErrnoNotty
 | |
| 	// ErrnoNxio No such device or address.
 | |
| 	ErrnoNxio
 | |
| 	// ErrnoOverflow Value too large to be stored in data type.
 | |
| 	ErrnoOverflow
 | |
| 	// ErrnoOwnerdead Previous owner died.
 | |
| 	ErrnoOwnerdead
 | |
| 	// ErrnoPerm Operation not permitted.
 | |
| 	ErrnoPerm
 | |
| 	// ErrnoPipe Broken pipe.
 | |
| 	ErrnoPipe
 | |
| 	// ErrnoProto Protocol error.
 | |
| 	ErrnoProto
 | |
| 	// ErrnoProtonosupport Protocol error.
 | |
| 	ErrnoProtonosupport
 | |
| 	// ErrnoPrototype Protocol wrong type for socket.
 | |
| 	ErrnoPrototype
 | |
| 	// ErrnoRange Result too large.
 | |
| 	ErrnoRange
 | |
| 	// ErrnoRofs Read-only file system.
 | |
| 	ErrnoRofs
 | |
| 	// ErrnoSpipe Invalid seek.
 | |
| 	ErrnoSpipe
 | |
| 	// ErrnoSrch No such process.
 | |
| 	ErrnoSrch
 | |
| 	// ErrnoStale Reserved.
 | |
| 	ErrnoStale
 | |
| 	// ErrnoTimedout Connection timed out.
 | |
| 	ErrnoTimedout
 | |
| 	// ErrnoTxtbsy Text file busy.
 | |
| 	ErrnoTxtbsy
 | |
| 	// ErrnoXdev Cross-device link.
 | |
| 	ErrnoXdev
 | |
| 
 | |
| 	// Note: ErrnoNotcapable was removed by WASI maintainers.
 | |
| 	// See https://github.com/WebAssembly/wasi-libc/pull/294
 | |
| )
 | |
| 
 | |
| var errnoToString = [...]string{
 | |
| 	"ESUCCESS",
 | |
| 	"E2BIG",
 | |
| 	"EACCES",
 | |
| 	"EADDRINUSE",
 | |
| 	"EADDRNOTAVAIL",
 | |
| 	"EAFNOSUPPORT",
 | |
| 	"EAGAIN",
 | |
| 	"EALREADY",
 | |
| 	"EBADF",
 | |
| 	"EBADMSG",
 | |
| 	"EBUSY",
 | |
| 	"ECANCELED",
 | |
| 	"ECHILD",
 | |
| 	"ECONNABORTED",
 | |
| 	"ECONNREFUSED",
 | |
| 	"ECONNRESET",
 | |
| 	"EDEADLK",
 | |
| 	"EDESTADDRREQ",
 | |
| 	"EDOM",
 | |
| 	"EDQUOT",
 | |
| 	"EEXIST",
 | |
| 	"EFAULT",
 | |
| 	"EFBIG",
 | |
| 	"EHOSTUNREACH",
 | |
| 	"EIDRM",
 | |
| 	"EILSEQ",
 | |
| 	"EINPROGRESS",
 | |
| 	"EINTR",
 | |
| 	"EINVAL",
 | |
| 	"EIO",
 | |
| 	"EISCONN",
 | |
| 	"EISDIR",
 | |
| 	"ELOOP",
 | |
| 	"EMFILE",
 | |
| 	"EMLINK",
 | |
| 	"EMSGSIZE",
 | |
| 	"EMULTIHOP",
 | |
| 	"ENAMETOOLONG",
 | |
| 	"ENETDOWN",
 | |
| 	"ENETRESET",
 | |
| 	"ENETUNREACH",
 | |
| 	"ENFILE",
 | |
| 	"ENOBUFS",
 | |
| 	"ENODEV",
 | |
| 	"ENOENT",
 | |
| 	"ENOEXEC",
 | |
| 	"ENOLCK",
 | |
| 	"ENOLINK",
 | |
| 	"ENOMEM",
 | |
| 	"ENOMSG",
 | |
| 	"ENOPROTOOPT",
 | |
| 	"ENOSPC",
 | |
| 	"ENOSYS",
 | |
| 	"ENOTCONN",
 | |
| 	"ENOTDIR",
 | |
| 	"ENOTEMPTY",
 | |
| 	"ENOTRECOVERABLE",
 | |
| 	"ENOTSOCK",
 | |
| 	"ENOTSUP",
 | |
| 	"ENOTTY",
 | |
| 	"ENXIO",
 | |
| 	"EOVERFLOW",
 | |
| 	"EOWNERDEAD",
 | |
| 	"EPERM",
 | |
| 	"EPIPE",
 | |
| 	"EPROTO",
 | |
| 	"EPROTONOSUPPORT",
 | |
| 	"EPROTOTYPE",
 | |
| 	"ERANGE",
 | |
| 	"EROFS",
 | |
| 	"ESPIPE",
 | |
| 	"ESRCH",
 | |
| 	"ESTALE",
 | |
| 	"ETIMEDOUT",
 | |
| 	"ETXTBSY",
 | |
| 	"EXDEV",
 | |
| 	"ENOTCAPABLE",
 | |
| }
 | |
| 
 | |
| // ToErrno coerces the error to a WASI Errno.
 | |
| //
 | |
| // Note: Coercion isn't centralized in sys.FSContext because ABI use different
 | |
| // error codes. For example, wasi-filesystem doesn't map to these
 | |
| // Errno.
 | |
| func ToErrno(errno sys.Errno) Errno {
 | |
| 	switch errno {
 | |
| 	case 0:
 | |
| 		return ErrnoSuccess
 | |
| 	case sys.EACCES:
 | |
| 		return ErrnoAcces
 | |
| 	case sys.EAGAIN:
 | |
| 		return ErrnoAgain
 | |
| 	case sys.EBADF:
 | |
| 		return ErrnoBadf
 | |
| 	case sys.EEXIST:
 | |
| 		return ErrnoExist
 | |
| 	case sys.EFAULT:
 | |
| 		return ErrnoFault
 | |
| 	case sys.EINTR:
 | |
| 		return ErrnoIntr
 | |
| 	case sys.EINVAL:
 | |
| 		return ErrnoInval
 | |
| 	case sys.EIO:
 | |
| 		return ErrnoIo
 | |
| 	case sys.EISDIR:
 | |
| 		return ErrnoIsdir
 | |
| 	case sys.ELOOP:
 | |
| 		return ErrnoLoop
 | |
| 	case sys.ENAMETOOLONG:
 | |
| 		return ErrnoNametoolong
 | |
| 	case sys.ENOENT:
 | |
| 		return ErrnoNoent
 | |
| 	case sys.ENOSYS:
 | |
| 		return ErrnoNosys
 | |
| 	case sys.ENOTDIR:
 | |
| 		return ErrnoNotdir
 | |
| 	case sys.ERANGE:
 | |
| 		return ErrnoRange
 | |
| 	case sys.ENOTEMPTY:
 | |
| 		return ErrnoNotempty
 | |
| 	case sys.ENOTSOCK:
 | |
| 		return ErrnoNotsock
 | |
| 	case sys.ENOTSUP:
 | |
| 		return ErrnoNotsup
 | |
| 	case sys.EPERM:
 | |
| 		return ErrnoPerm
 | |
| 	case sys.EROFS:
 | |
| 		return ErrnoRofs
 | |
| 	default:
 | |
| 		return ErrnoIo
 | |
| 	}
 | |
| }
 |