summaryrefslogtreecommitdiff
path: root/python/examples/kaitai/id3v1_1.py
diff options
context:
space:
mode:
authorAndrew Lamoureux <andrew@vector35.com>2019-03-19 17:32:44 -0400
committerRusty Wagner <rusty@vector35.com>2019-03-20 13:00:17 -0400
commit24ead55316ac8497df5842caf4e1d51f2b799787 (patch)
tree3dfdfae8a076445c9d24bf6d1b40e57f36ebf94a /python/examples/kaitai/id3v1_1.py
parent411acbaa4a1d217e731d3df0b189445117be3b26 (diff)
kaitai: adjustments and rearrangements for python2/3 compat
Diffstat (limited to 'python/examples/kaitai/id3v1_1.py')
-rw-r--r--python/examples/kaitai/id3v1_1.py217
1 files changed, 217 insertions, 0 deletions
diff --git a/python/examples/kaitai/id3v1_1.py b/python/examples/kaitai/id3v1_1.py
new file mode 100644
index 00000000..41b2e880
--- /dev/null
+++ b/python/examples/kaitai/id3v1_1.py
@@ -0,0 +1,217 @@
+# This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild
+
+from pkg_resources import parse_version
+from .kaitaistruct import __version__ as ks_version, KaitaiStruct, KaitaiStream, BytesIO
+import collections
+from enum import Enum
+
+
+if parse_version(ks_version) < parse_version('0.7'):
+ raise Exception("Incompatible Kaitai Struct Python API: 0.7 or later is required, but you have %s" % (ks_version))
+
+class Id3v11(KaitaiStruct):
+ """ID3v1.1 tag is a method to store simple metadata in .mp3 files. The
+ tag is appended to the end of file and spans exactly 128 bytes.
+
+ This type is supposed to be used on full .mp3 files, seeking to
+ proper position automatically. If you're interesting in parsing only
+ the tag itself, please use `id3v1_1::id3_v1_1_tag` subtype.
+
+ .. seealso::
+ Source - http://id3.org/ID3v1
+ """
+ SEQ_FIELDS = []
+ def __init__(self, _io, _parent=None, _root=None):
+ self._io = _io
+ self._parent = _parent
+ self._root = _root if _root else self
+ self._debug = collections.defaultdict(dict)
+
+ def _read(self):
+ pass
+
+ class Id3V11Tag(KaitaiStruct):
+ """ID3v1.1 tag itself, a fixed size 128 byte structure. Contains
+ several metadata fields as fixed-size strings.
+
+ Note that string encoding is not specified by standard, so real
+ encoding used would vary a lot from one implementation to
+ another. Most Windows-based applications tend to use "ANSI"
+ (i.e. locale-dependent encoding, usually one byte per
+ character). Some embedded applications allow selection of
+ charset.
+ """
+
+ class GenreEnum(Enum):
+ blues = 0
+ classic_rock = 1
+ country = 2
+ dance = 3
+ disco = 4
+ funk = 5
+ grunge = 6
+ hip_hop = 7
+ jazz = 8
+ metal = 9
+ new_age = 10
+ oldies = 11
+ other = 12
+ pop = 13
+ rnb = 14
+ rap = 15
+ reggae = 16
+ rock = 17
+ techno = 18
+ industrial = 19
+ alternative = 20
+ ska = 21
+ death_metal = 22
+ pranks = 23
+ soundtrack = 24
+ euro_techno = 25
+ ambient = 26
+ trip_hop = 27
+ vocal = 28
+ jazz_funk = 29
+ fusion = 30
+ trance = 31
+ classical = 32
+ instrumental = 33
+ acid = 34
+ house = 35
+ game = 36
+ sound_clip = 37
+ gospel = 38
+ noise = 39
+ alternrock = 40
+ bass = 41
+ soul = 42
+ punk = 43
+ space = 44
+ meditative = 45
+ instrumental_pop = 46
+ instrumental_rock = 47
+ ethnic = 48
+ gothic = 49
+ darkwave = 50
+ techno_industrial = 51
+ electronic = 52
+ pop_folk = 53
+ eurodance = 54
+ dream = 55
+ southern_rock = 56
+ comedy = 57
+ cult = 58
+ gangsta = 59
+ top_40 = 60
+ christian_rap = 61
+ pop_funk = 62
+ jungle = 63
+ native_american = 64
+ cabaret = 65
+ new_wave = 66
+ psychadelic = 67
+ rave = 68
+ showtunes = 69
+ trailer = 70
+ lo_fi = 71
+ tribal = 72
+ acid_punk = 73
+ acid_jazz = 74
+ polka = 75
+ retro = 76
+ musical = 77
+ rock_n_roll = 78
+ hard_rock = 79
+ folk = 80
+ folk_rock = 81
+ national_folk = 82
+ swing = 83
+ fast_fusion = 84
+ bebob = 85
+ latin = 86
+ revival = 87
+ celtic = 88
+ bluegrass = 89
+ avantgarde = 90
+ gothic_rock = 91
+ progressive_rock = 92
+ psychedelic_rock = 93
+ symphonic_rock = 94
+ slow_rock = 95
+ big_band = 96
+ chorus = 97
+ easy_listening = 98
+ acoustic = 99
+ humour = 100
+ speech = 101
+ chanson = 102
+ opera = 103
+ chamber_music = 104
+ sonata = 105
+ symphony = 106
+ booty_bass = 107
+ primus = 108
+ porn_groove = 109
+ satire = 110
+ slow_jam = 111
+ club = 112
+ tango = 113
+ samba = 114
+ folklore = 115
+ ballad = 116
+ power_ballad = 117
+ rhythmic_soul = 118
+ freestyle = 119
+ duet = 120
+ punk_rock = 121
+ drum_solo = 122
+ a_capella = 123
+ euro_house = 124
+ dance_hall = 125
+ SEQ_FIELDS = ["magic", "title", "artist", "album", "year", "comment", "genre"]
+ def __init__(self, _io, _parent=None, _root=None):
+ self._io = _io
+ self._parent = _parent
+ self._root = _root if _root else self
+ self._debug = collections.defaultdict(dict)
+
+ def _read(self):
+ self._debug['magic']['start'] = self._io.pos()
+ self.magic = self._io.ensure_fixed_contents(b"\x54\x41\x47")
+ self._debug['magic']['end'] = self._io.pos()
+ self._debug['title']['start'] = self._io.pos()
+ self.title = self._io.read_bytes(30)
+ self._debug['title']['end'] = self._io.pos()
+ self._debug['artist']['start'] = self._io.pos()
+ self.artist = self._io.read_bytes(30)
+ self._debug['artist']['end'] = self._io.pos()
+ self._debug['album']['start'] = self._io.pos()
+ self.album = self._io.read_bytes(30)
+ self._debug['album']['end'] = self._io.pos()
+ self._debug['year']['start'] = self._io.pos()
+ self.year = (self._io.read_bytes(4)).decode(u"ASCII")
+ self._debug['year']['end'] = self._io.pos()
+ self._debug['comment']['start'] = self._io.pos()
+ self.comment = self._io.read_bytes(30)
+ self._debug['comment']['end'] = self._io.pos()
+ self._debug['genre']['start'] = self._io.pos()
+ self.genre = KaitaiStream.resolve_enum(self._root.Id3V11Tag.GenreEnum, self._io.read_u1())
+ self._debug['genre']['end'] = self._io.pos()
+
+
+ @property
+ def id3v1_tag(self):
+ if hasattr(self, '_m_id3v1_tag'):
+ return self._m_id3v1_tag if hasattr(self, '_m_id3v1_tag') else None
+
+ _pos = self._io.pos()
+ self._io.seek((self._io.size() - 128))
+ self._debug['_m_id3v1_tag']['start'] = self._io.pos()
+ self._m_id3v1_tag = self._root.Id3V11Tag(self._io, self, self._root)
+ self._m_id3v1_tag._read()
+ self._debug['_m_id3v1_tag']['end'] = self._io.pos()
+ self._io.seek(_pos)
+ return self._m_id3v1_tag if hasattr(self, '_m_id3v1_tag') else None
+
+