Files
go-mp4tag/objects.go
Sorrow446 8773ee4341 https://github.com/Sorrow446/go-mp4tag/issues/11
- Issue #11 implemented.
- Fixed assignment to nil map error for the custom field.
- UpperCustom func, pass false to disable uppercasing custom tags' names for read & write.
2024-01-30 22:02:06 +00:00

309 lines
5.5 KiB
Go

package mp4tag
import "os"
type ErrBoxNotPresent struct {
Msg string
}
type ErrUnsupportedFtyp struct {
Msg string
}
type ErrInvalidStcoSize struct {}
type ErrInvalidMagic struct {}
func (e *ErrBoxNotPresent) Error() string {
return e.Msg
}
func (e *ErrUnsupportedFtyp) Error() string {
return e.Msg
}
func (_ *ErrInvalidStcoSize) Error() string {
return "stco size is invalid"
}
func (_ *ErrInvalidMagic) Error() string {
return "file header is corrupted or not an mp4 file"
}
var ftyps = [8][]byte{
{0x4D, 0x34, 0x41, 0x20}, // M4A
{0x4D, 0x34, 0x42, 0x20}, // M4B
{0x64, 0x61, 0x73, 0x68}, // dash
{0x6D, 0x70, 0x34, 0x31}, // mp41
{0x6D, 0x70, 0x34, 0x32}, // mp42
{0x69, 0x73, 0x6F, 0x6D}, // isom
{0x69, 0x73, 0x6F, 0x32}, // iso2
{0x61, 0x76, 0x63, 0x31}, // avc1
}
var containers = []string{
"moov", "udta", "meta", "ilst", "----", "(c)alb",
"aART", "(c)art", "(c)nam", "(c)cmt", "(c)gen", "gnre",
"(c)wrt", "(c)con", "cprt", "desc", "(c)lyr", "(c)nrt",
"(c)pub", "trkn", "covr", "(c)day", "disk", "(c)too",
"trak", "mdia", "minf", "stbl", "rtng", "plID",
"atID", "tmpo", "sonm", "soal", "soar", "soco",
"soaa",
}
// 0-9
var numbers = []rune{
0x30, 0x31, 0x32, 0x33, 0x34,
0x35, 0x36, 0x37, 0x38, 0x39,
}
type MP4 struct {
f *os.File
path string
size int64
upperCustom bool
}
type MP4Box struct {
StartOffset int64
EndOffset int64
BoxSize int64
Path string
}
type MP4Boxes struct {
Boxes []*MP4Box
}
type ImageType int8
const (
ImageTypeJPEG ImageType = iota + 13
ImageTypePNG
ImageTypeAuto
)
var resolveImageType = map[uint8]ImageType{
13: ImageTypeJPEG,
14: ImageTypePNG,
}
type ItunesAdvisory int8
const (
ItunesAdvisoryNone ItunesAdvisory = iota
ItunesAdvisoryExplicit
ItunesAdvisoryClean
)
var resolveItunesAdvisory = map[uint8]ItunesAdvisory{
1: ItunesAdvisoryExplicit,
2: ItunesAdvisoryClean,
}
// GenreNone
type Genre int8
const (
GenreNone Genre = iota
GenreBlues
GenreClassicRock
GenreCountry
GenreDance
GenreDisco
GenreFunk
GenreGrunge
GenreHipHop
GenreJazz
GenreMetal
GenreNewAge
GenreOldies
GenreOther
GenrePop
GenreRhythmAndBlues
GenreRap
GenreReggae
GenreRock
GenreTechno
GenreIndustrial
GenreAlternative
GenreSka
GenreDeathMetal
GenrePranks
GenreSoundtrack
GenreEurotechno
GenreAmbient
GenreTripHop
GenreVocal
GenreJassAndFunk
GenreFusion
GenreTrance
GenreClassical
GenreInstrumental
GenreAcid
GenreHouse
GenreGame
GenreSoundClip
GenreGospel
GenreNoise
GenreAlternativeRock
GenreBass
GenreSoul
GenrePunk
GenreSpace
GenreMeditative
GenreInstrumentalPop
GenreInstrumentalRock
GenreEthnic
GenreGothic
GenreDarkwave
GenreTechnoindustrial
GenreElectronic
GenrePopFolk
GenreEurodance
GenreSouthernRock
GenreComedy
GenreCull
GenreGangsta
GenreTop40
GenreChristianRap
GenrePopSlashFunk
GenreJungleMusic
GenreNativeUS
GenreCabaret
GenreNewWave
GenrePsychedelic
GenreRave
GenreShowtunes
GenreTrailer
GenreLofi
GenreTribal
GenreAcidPunk
GenreAcidJazz
GenrePolka
GenreRetro
GenreMusical
GenreRockNRoll
GenreHardRock
)
var resolveGenre = map[uint8]Genre{
1: GenreBlues,
2: GenreClassicRock,
3: GenreCountry,
4: GenreDance,
5: GenreDisco,
6: GenreFunk,
7: GenreGrunge,
8: GenreHipHop,
9: GenreJazz,
10: GenreMetal,
11: GenreNewAge,
12: GenreOldies,
13: GenreOther,
14: GenrePop,
15: GenreRhythmAndBlues,
16: GenreRap,
17: GenreReggae,
18: GenreRock,
19: GenreTechno,
20: GenreIndustrial,
21: GenreAlternative,
22: GenreSka,
23: GenreDeathMetal,
24: GenrePranks,
25: GenreSoundtrack,
26: GenreEurotechno,
27: GenreAmbient,
28: GenreTripHop,
29: GenreVocal,
30: GenreJassAndFunk,
31: GenreFusion,
32: GenreTrance,
33: GenreClassical,
34: GenreInstrumental,
35: GenreAcid,
36: GenreHouse,
37: GenreGame,
38: GenreSoundClip,
39: GenreGospel,
40: GenreNoise,
41: GenreAlternativeRock,
42: GenreBass,
43: GenreSoul,
44: GenrePunk,
45: GenreSpace,
46: GenreMeditative,
47: GenreInstrumentalPop,
48: GenreInstrumentalRock,
49: GenreEthnic,
50: GenreGothic,
51: GenreDarkwave,
52: GenreTechnoindustrial,
53: GenreElectronic,
54: GenrePopFolk,
55: GenreEurodance,
56: GenreSouthernRock,
57: GenreComedy,
58: GenreCull,
59: GenreGangsta,
60: GenreTop40,
61: GenreChristianRap,
62: GenrePopSlashFunk,
63: GenreJungleMusic,
64: GenreNativeUS,
65: GenreCabaret,
66: GenreNewWave,
67: GenrePsychedelic,
68: GenreRave,
69: GenreShowtunes,
70: GenreTrailer,
71: GenreLofi,
72: GenreTribal,
73: GenreAcidPunk,
74: GenreAcidJazz,
75: GenrePolka,
76: GenreRetro,
77: GenreMusical,
78: GenreRockNRoll,
79: GenreHardRock,
}
type MP4Picture struct {
Format ImageType
Data []byte
}
type MP4Tags struct {
Album string
AlbumSort string
AlbumArtist string
AlbumArtistSort string
Artist string
ArtistSort string
BPM int16
Comment string
Composer string
ComposerSort string
Conductor string
Copyright string
Custom map[string]string
CustomGenre string
Date string
Description string
Director string
DiscNumber int16
DiscTotal int16
Genre Genre
ItunesAdvisory ItunesAdvisory
ItunesAlbumID int32
ItunesArtistID int32
Lyrics string
Narrator string
OtherCustom map[string][]string
Pictures []*MP4Picture
Publisher string
Title string
TitleSort string
TrackNumber int16
TrackTotal int16
Year int32
}