mirror of
https://github.com/HeyPuter/thumbnailer.git
synced 2026-11-13 18:35:04 -10:00
90 lines
2.3 KiB
Go
90 lines
2.3 KiB
Go
package thumbnailer
|
|
|
|
// #include "ffmpeg.h"
|
|
import "C"
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"io"
|
|
)
|
|
|
|
// Thumbnailing errors
|
|
var (
|
|
ErrTooWide = ErrInvalidImage("image too wide")
|
|
ErrTooTall = ErrInvalidImage("image too tall")
|
|
ErrThumbnailingUnknown = errors.New("unknown thumbnailing error")
|
|
|
|
// ErrCantThumbnail denotes the input file was valid but no thumbnail could
|
|
// be generated for it (example: audio file with no cover art).
|
|
ErrCantThumbnail = errors.New("thumbnail can't be generated")
|
|
|
|
// ErrGetFrame denotes an unknown failure to retrieve a video frame
|
|
ErrGetFrame = errors.New("failed to get frame")
|
|
|
|
// ErrStreamNotFound denotes no steam of this media type was found
|
|
ErrStreamNotFound = errors.New("no stream of this type found")
|
|
)
|
|
|
|
// Indicates the MIME type of the file could not be detected as a supported type
|
|
// or was not in the AcceptedMimeTypes list, if defined.
|
|
type ErrUnsupportedMIME string
|
|
|
|
func (e ErrUnsupportedMIME) Error() string {
|
|
return fmt.Sprintf("unsupported MIME type: %s", string(e))
|
|
}
|
|
|
|
// Indicates and invalid image has been passed for processing
|
|
type ErrInvalidImage string
|
|
|
|
func (e ErrInvalidImage) Error() string {
|
|
return fmt.Sprintf("invalid image: %s", string(e))
|
|
}
|
|
|
|
// ErrorCovert wraps an error that happened during cover art thumbnailing
|
|
type ErrCoverArt struct {
|
|
Err error
|
|
}
|
|
|
|
func (e ErrCoverArt) Error() string {
|
|
return "cover art: " + e.Err.Error()
|
|
}
|
|
|
|
// ErrArchive wraps an error that happened during thumbnailing a file in zip
|
|
// archive
|
|
type ErrArchive struct {
|
|
Err error
|
|
}
|
|
|
|
func (e ErrArchive) Error() string {
|
|
return "archive: " + e.Err.Error()
|
|
}
|
|
|
|
// Cast FFmpeg error to Go error
|
|
func castError(err C.int) error {
|
|
switch err {
|
|
case C.AVERROR_EOF:
|
|
return io.EOF
|
|
case C.AVERROR_STREAM_NOT_FOUND:
|
|
return ErrStreamNotFound
|
|
default:
|
|
return AVError(err)
|
|
}
|
|
}
|
|
|
|
// AVError converts an FFmpeg error code to a Go error with a human-readable
|
|
// error message
|
|
type AVError C.int
|
|
|
|
// Error formats the FFmpeg error in human-readable format
|
|
func (f AVError) Error() string {
|
|
buf := C.malloc(1024)
|
|
defer C.free(buf)
|
|
C.av_strerror(C.int(f), (*C.char)(buf), 1024)
|
|
return fmt.Sprintf("ffmpeg: %s", C.GoString((*C.char)(buf)))
|
|
}
|
|
|
|
// Code returns the underlying AVERROR error code
|
|
func (f AVError) Code() C.int {
|
|
return C.int(f)
|
|
}
|