def getTags(fileName, verbose): expectedTags = ["artist", "album", "title", "track-number", "audio-codec"] if not os.path.exists(fileName): raise Exception('File does not exist: "', fileName, '"') player = Gst.parse_launch("filesrc name=src ! decodebin ! fakesink") bus = player.get_bus() src = player.get_by_name("src") src.set_property("location", fileName) tags = dict() player.set_state(Gst.State.PLAYING) while True: message = bus.pop() if not message: continue t = message.type if t == Gst.MessageType.TAG: taglist = message.parse_tag() for key in expectedTags: typeName = Gst.tag_get_type(key).name if typeName == "gchararray": isValid, value = taglist.get_string(key) if isValid: value = value.decode("utf-8", errors="ignore") elif typeName == "guint": isValid, value = taglist.get_uint(key) if verbose: print key, value if isValid: tags[key] = unicode(value) # got all required tags if not verbose and len(tags) == len(expectedTags): break elif t == Gst.MessageType.EOS: break elif t == Gst.MessageType.ERROR: err, debug = message.parse_error() tags.clear() tags["Error"] = err print "in MessageType Error: ", err break player.set_state(Gst.State.NULL) if len(tags) != len(expectedTags): raise Exception("Could not find all tags") return tags
def _append_tag(self, taglist, tag, tags): if tag in ACCEPTABLE_TAGS: name = Gst.tag_get_nick(tag) type = Gst.tag_get_type(tag) type_getters = {GObject.TYPE_STRING: 'get_string', GObject.TYPE_DOUBLE: 'get_double', GObject.TYPE_FLOAT: 'get_float', GObject.TYPE_INT: 'get_int', GObject.TYPE_UINT: 'get_uint'} if type in type_getters: res, value = getattr(taglist, type_getters[type])(tag) assert res if not type == GObject.TYPE_STRING: value = str(value) tags[name] = value
def _appendTag(self, taglist, tag, unused_udata): if tag in acceptable_tags: name = Gst.tag_get_nick(tag) type = Gst.tag_get_type(tag) type_getters = {GObject.TYPE_STRING: 'get_string', GObject.TYPE_DOUBLE: 'get_double', GObject.TYPE_FLOAT: 'get_float', GObject.TYPE_INT: 'get_int', GObject.TYPE_UINT: 'get_uint'} if type in type_getters: if type == GObject.TYPE_STRING: value = getattr(taglist, type_getters[type])(tag)[1] value = value.replace('<', ' ').replace('>', ' ') else: value = str(getattr(taglist, type_getters[type])(tag)[1]) self.tags[name] = value
def _append_tag(self, taglist, tag, tags): if tag in ACCEPTABLE_TAGS: tag_name = Gst.tag_get_nick(tag) tag_type = Gst.tag_get_type(tag) type_getters = { GObject.TYPE_STRING: 'get_string', GObject.TYPE_DOUBLE: 'get_double', GObject.TYPE_FLOAT: 'get_float', GObject.TYPE_INT: 'get_int', GObject.TYPE_UINT: 'get_uint' } if tag_type in type_getters: res, value = getattr(taglist, type_getters[tag_type])(tag) assert res if not tag_type == GObject.TYPE_STRING: value = str(value) tags[tag_name] = value