def _inspect_mp3(self):
        "Cracks open the mp3 file and determines what is inside."
        self._fileobj.seek(0)
        infoobj = MPEGInfo(self._fileobj)
        self._fileobj.seek(0)
        id3obj = ID3File(self._fileobj)

        self.album = id3obj.get('TALB').text[0] if 'TALB' in id3obj else None
        self.artist = id3obj.get('TPE1').text[0] if 'TPE1' in id3obj else None
        self.band = id3obj.get('TPE2').text[0] if 'TPE2' in id3obj else None
        self.bitrate = infoobj.bitrate
        try:
            self.disc = +id3obj.get('TPOS') if 'TPOS' in id3obj else None
        except:
            self.disc = None
        self.genre = id3obj.get('TCON').text[0] if 'TCON' in id3obj else None
        self.is_sketchy = infoobj.sketchy
        self.length = infoobj.length
        self.lossy = True
        self.name = id3obj.get('TIT2').text[0] if 'TIT2' in id3obj else None
        self.samplerate = infoobj.sample_rate
        try:
            self.track = +id3obj.get('TRCK') if 'TRCK' in id3obj else None
        except:
            self.track = None
        self.year = int(id3obj['TDRC'].text[0].year) if 'TDRC' in id3obj else None

        self.artwork = []
        for apic in id3obj.getall('APIC'):
            # We have a picture!  Extract it onto its own AssetFile.
            self.artwork.append({'data': apic.data, 'mimetype': apic.mime})
Example #2
0
 def test_xing_unknown_framecount(self):
     frame = (
         b'\xff\xfb\xe4\x0c\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00'
         b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
         b'\x00\x00\x00\x00Info\x00\x00\x00\x02\x00\xb4V@\x00\xb4R\x80\x00'
         b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
     fileobj = cBytesIO(frame)
     info = MPEGInfo(fileobj)
     assert info.bitrate == 320000
     assert info.length > 0
Example #3
0
    def test_length(self):
        # http://code.google.com/p/mutagen/issues/detail?id=125
        # easyid3, normal id3 and mpeg loading without tags should skip
        # the tags and get the right offset of the first frame
        easy = self.mp3.info
        noneasy = MP3(self.filename).info
        nonid3 = MPEGInfo(open(self.filename, "rb"))

        self.failUnlessEqual(easy.length, noneasy.length)
        self.failUnlessEqual(noneasy.length, nonid3.length)
Example #4
0
def get_bitrate(url):
    response = urlopen(url)
    buff = response.read(10)
    header = unpack('!3sBBBBBBB', buff)
    if header[0] == 'ID3':
        response.read(get_tags_len(header[-4:]) - 10)
        buff = response.read(32)
    else:
        buff += response.read(22)
    try:
        bitrate = MPEGInfo(StringIO(buff)).bitrate
    except Exception, exc:
        print exc
        try:
            bitrate = MPEGInfo(StringIO(buff +
                                        response.read(512 - 32))).bitrate
        except Exception, exc:
            print exc
            bitrate = 0
Example #5
0
    def test_length(self):
        # https://github.com/quodlibet/mutagen/issues/125
        # easyid3, normal id3 and mpeg loading without tags should skip
        # the tags and get the right offset of the first frame
        easy = self.mp3.info
        noneasy = MP3(self.filename).info
        with open(self.filename, "rb") as h:
            nonid3 = MPEGInfo(h)

        self.failUnlessEqual(easy.length, noneasy.length)
        self.failUnlessEqual(noneasy.length, nonid3.length)
def parsed_show_page(show_page_url):
    """
    Takes a Sound Portraits episode and finds out some salient information
    This entails downloading the episode to get duration data, so it is _slow_
    :param str show_page_url:
    :returns tuple: Data about this Sound Portraits episode, None if no MP3
    """
    r = requests.get(show_page_url)
    bs = BeautifulSoup(r.text, 'lxml')

    title = html.unescape(bs.title.contents[0].split(':')[0]).strip()

    if show_page_url in air_dict:
        premiere = air_dict[show_page_url]

    else:
        premiere = sub_string(r.text, '<!-- Start premiere info -->',
                              '<!-- Start premiere info -->').strip()
        premiere = sub_string(premiere, 'Premiered ', ', on').strip()
        premiere = datetime.strptime(premiere, '%B %d, %Y')

    body = sub_string(r.text, '<!-- Start body text -->',
                      '<!--End body text -->').strip()
    body = ' '.join(body.split())
    body = body.replace(' </p> <p> ', '\n')
    body = body.replace('</p> <p>', '\n')
    body = body.replace('<p>', '')
    body = BeautifulSoup(html.unescape(body), 'lxml').text.strip()

    if show_page_url[-1] == '/':
        audio_page_url = '{}audio.php'.format(show_page_url)
    else:
        audio_page_url = '{}/audio.php'.format(show_page_url)

    try:
        r = requests.get(audio_page_url)
        bs = BeautifulSoup(r.text, 'lxml')
        flashvars = bs.find('param', {'name': 'FlashVars'})['value']
        soundfile = sub_string(flashvars, 'soundFile=', '.mp3') + '.mp3'
        soundfile = soundfile.replace('%2F', '/').replace('%3A', ':')

        r = requests.get(soundfile)
        temp = NamedTemporaryFile()
        temp.write(r.content)
        duration = MPEGInfo(temp).length
        size = os.stat(temp.name).st_size
        temp.close()

    except:
        # If we can't find the sound file page, forget it.
        return None

    return (premiere, title, body, soundfile, duration, size)
async def get_mp3_file_duration(path: str) -> int:
    if not path:
        return 0

    try:
        async with async_open(path, 'rb') as afp:
            data = await afp.read()

        return MPEGInfo(BytesIO(data)).length
    except Exception as err:
        logger.warning(f'Error on read mp3 file: {err}')

    return 0
Example #8
0
def get_duration(url):
    "返回音频时长"
    try:
        f = urllib.urlopen(url)
        data = f.read()
        f.close()
        f = StringIO(data)
        info = MPEGInfo(f)
        duration = math.ceil(info.length)
        f.close()
        return duration
    except:
        return 0
Example #9
0
def get_duration(url):
    """
    返回音频时长
    :param url: 绝对路径
    :return:
    """
    try:
        if url:
            with urllib.request.urlopen(url) as response:
                data = response.read()
                f = BytesIO(data)
                info = MPEGInfo(f)
                duration = math.ceil(info.length)
                f.close()
        else:
            duration = 0
        return duration
    except Exception as e:
        logging.error(e)
    return 0
Example #10
0
 def test_not_real_file(self):
     filename = os.path.join("tests", "data", "silence-44-s-v1.mp3")
     fileobj = cBytesIO(open(filename, "rb").read(20))
     MPEGInfo(fileobj)
Example #11
0
    def do_update_file_info(self, file):
        info = FileExtensionInfo()

        # strip file:// to get absolute path
        filename = urllib.unquote(file.get_uri()[7:])

        # mp3 handling
        if file.is_mime_type('audio/mpeg'):
            # attempt to read ID3 tag
            try:
                audio = EasyID3(filename)
                # sometimes the audio variable will not have one of these items defined, that's why
                # there is this long try / except attempt
                try:
                    info.title = audio["title"][0]
                except:
                    pass
                try:
                    info.album = audio["album"][0]
                except:
                    pass
                try:
                    info.artist = audio["artist"][0]
                except:
                    pass
                try:
                    info.tracknumber = audio["tracknumber"][0]
                except:
                    pass
                try:
                    info.genre = audio["genre"][0]
                except:
                    pass
                try:
                    info.date = audio["date"][0]
                except:
                    pass
            except:
                pass

            # try to read MP3 information (bitrate, length, samplerate)
            try:
                mpfile = open(filename)
                mpinfo = MPEGInfo(mpfile)
                info.bitrate = str(mpinfo.bitrate / 1000) + " Kbps"
                info.samplerate = str(mpinfo.sample_rate) + " Hz"
                # [SabreWolfy] added consistent formatting of times in format hh:mm:ss
                # [SabreWolfy[ to allow for correct column sorting by length
                mp3length = "%02i:%02i:%02i" % ((int(mpinfo.length / 3600)),
                                                (int(mpinfo.length / 60 % 60)),
                                                (int(mpinfo.length % 60)))
                mpfile.close()
                info.length = mp3length
            except:
                try:
                    mpfile.close()
                except:
                    pass

        # image handling
        elif file.is_mime_type('image/jpeg') or file.is_mime_type(
                'image/png') or file.is_mime_type(
                    'image/gif') or file.is_mime_type('image/bmp'):
            # EXIF handling routines
            try:
                metadata = pyexiv2.ImageMetadata(filename)
                metadata.read()
                try:
                    exif_datetimeoriginal = metadata[
                        'Exif.Photo.DateTimeOriginal']
                    info.exif_datetime_original = str(
                        exif_datetimeoriginal.raw_value)
                except:
                    pass
                try:
                    exif_imagesoftware = metadata['Exif.Image.Software']
                    info.exif_software = str(exif_imagesoftware.raw_value)
                except:
                    pass
                try:
                    exif_photoflash = metadata['Exif.Photo.Flash']
                    info.exif_flash = str(exif_photoflash.raw_value)
                except:
                    pass
                try:
                    exif_rating = metadata['Xmp.xmp.Rating']
                    info.exif_rating = str(exif_rating.raw_value)
                except:
                    pass
            except:
                pass
            # try read image info directly
            try:
                im = Image.open(filename)
                info.pixeldimensions = str(im.size[0]) + 'x' + str(im.size[1])
            except error as e:
                print e
                pass

        # video/flac handling
        elif file.is_mime_type('video/x-msvideo') | file.is_mime_type(
                'video/mpeg'
        ) | file.is_mime_type('video/x-ms-wmv') | file.is_mime_type(
                'video/mp4'
        ) | file.is_mime_type('audio/x-flac') | file.is_mime_type(
                'video/x-flv') | file.is_mime_type(
                    'video/x-matroska') | file.is_mime_type('audio/x-wav'):
            try:
                metadata = kaa.metadata.parse(filename)
                try:
                    info.length = "%02i:%02i:%02i" % (
                        (int(metadata.length / 3600)),
                        (int(metadata.length / 60 % 60)),
                        (int(metadata.length % 60)))
                except:
                    pass
                try:
                    info.pixeldimensions = str(
                        metadata.video[0].width) + 'x' + str(
                            metadata.video[0].height)
                except:
                    pass
                try:
                    info.bitrate = str(round(metadata.audio[0].bitrate / 1000))
                except:
                    pass
                try:
                    info.samplerate = str(int(
                        metadata.audio[0].samplerate)) + ' Hz'
                except:
                    pass
                try:
                    info.title = metadata.title
                except:
                    pass
                try:
                    info.artist = metadata.artist
                except:
                    pass
                try:
                    info.genre = metadata.genre
                except:
                    pass
                try:
                    info.tracknumber = metadata.trackno
                except:
                    pass
                try:
                    info.date = metadata.userdate
                except:
                    pass
                try:
                    info.album = metadata.album
                except:
                    pass
            except:
                pass

        # pdf handling
        elif file.is_mime_type('application/pdf'):
            try:
                f = open(filename, "rb")
                pdf = PdfFileReader(f)
                try:
                    info.title = pdf.getDocumentInfo().title
                except:
                    pass
                try:
                    info.artist = pdf.getDocumentInfo().author
                except:
                    pass
                f.close()
            except:
                pass

        self.set_file_attributes(file, info)

        del info
Example #12
0
	def update_file_info(self, file):
		# set defaults to blank
		file.add_string_attribute('title', '')
		file.add_string_attribute('album', '')
		file.add_string_attribute('artist', '')
		file.add_string_attribute('tracknumber', '')
		file.add_string_attribute('genre', '')
		file.add_string_attribute('date', '')
		file.add_string_attribute('bitrate', '')
		file.add_string_attribute('samplerate', '')
		file.add_string_attribute('length', '')
		file.add_string_attribute('exif_datetime_original', '')
		file.add_string_attribute('exif_software', '')
		file.add_string_attribute('exif_flash', '')
		file.add_string_attribute('exif_pixeldimensions', '')
		file.add_string_attribute('exif_rating','')
		file.add_string_attribute('pixeldimensions', '')

		if file.get_uri_scheme() != 'file':
			return

		# strip file:// to get absolute path
		filename = urllib.unquote(file.get_uri()[7:])
		
		# mp3 handling
		if file.is_mime_type('audio/mpeg'):
			# attempt to read ID3 tag
			try:
				audio = EasyID3(filename)
				# sometimes the audio variable will not have one of these items defined, that's why
				# there is this long try / except attempt
				try: file.add_string_attribute('title', audio["title"][0])
				except: file.add_string_attribute('title', "[n/a]")
				try: file.add_string_attribute('album', audio["album"][0])
				except: file.add_string_attribute('album', "[n/a]")
				try: file.add_string_attribute('artist', audio["artist"][0])
				except: file.add_string_attribute('artist', "[n/a]")
				try: file.add_string_attribute('tracknumber', audio["tracknumber"][0])
				except: file.add_string_attribute('tracknumber', "[n/a]")
				try: file.add_string_attribute('genre', audio["genre"][0])
				except: file.add_string_attribute('genre', "[n/a]")
				try: file.add_string_attribute('date', audio["date"][0])
				except: file.add_string_attribute('date', "[n/a]")
			except:
				# [SabreWolfy] some files have no ID3 tag and will throw this exception:
				file.add_string_attribute('title', "[no ID3]")
				file.add_string_attribute('album', "[no ID3]")
				file.add_string_attribute('artist', "[no ID3]")
				file.add_string_attribute('tracknumber', "[no ID3]")
				file.add_string_attribute('genre', "[no ID3]")
				file.add_string_attribute('date', "[no ID3]")
				
			# try to read MP3 information (bitrate, length, samplerate)
			try:
				mpfile = open (filename)
				mpinfo = MPEGInfo (mpfile)
				file.add_string_attribute('bitrate', str(mpinfo.bitrate/1000) + " Kbps")
				file.add_string_attribute('samplerate', str(mpinfo.sample_rate) + " Hz")
				# [SabreWolfy] added consistent formatting of times in format hh:mm:ss
				# [SabreWolfy[ to allow for correct column sorting by length
				mp3length = "%02i:%02i:%02i" % ((int(mpinfo.length/3600)), (int(mpinfo.length/60%60)), (int(mpinfo.length%60)))
				mpfile.close()
				file.add_string_attribute('length', mp3length)
			except:
				file.add_string_attribute('bitrate', "[n/a]")
				file.add_string_attribute('length', "[n/a]")
				file.add_string_attribute('samplerate', "[n/a]")
				try:
					mpfile.close()
				except:	pass
	
		# image handling
		if file.is_mime_type('image/jpeg') or file.is_mime_type('image/png') or file.is_mime_type('image/gif') or file.is_mime_type('image/bmp'):
			# EXIF handling routines
			try:
				metadata = pyexiv2.ImageMetadata(filename)
				metadata.read()
				try:
					exif_datetimeoriginal = metadata['Exif.Photo.DateTimeOriginal']
					file.add_string_attribute('exif_datetime_original',str(exif_datetimeoriginal.raw_value))
				except:
					file.add_string_attribute('exif_datetime_original',"")
				try:
					exif_imagesoftware = metadata['Exif.Image.Software']
					file.add_string_attribute('exif_software',str(exif_imagesoftware.raw_value))
				except:
					file.add_string_attribute('exif_software',"")
				try:
					exif_photoflash = metadata['Exif.Photo.Flash']
					file.add_string_attribute('exif_flash',str(exif_photoflash.raw_value))
				except:
					file.add_string_attribute('exif_flash',"")
				try:
					exif_pixelydimension = metadata['Exif.Photo.PixelYDimension']
					exif_pixelxdimension = metadata['Exif.Photo.PixelXDimension']
					file.add_string_attribute('exif_pixeldimensions',str(exif_pixelydimension.raw_value)+'x'+str(exif_pixelxdimension.raw_value))
				except:
					file.add_string_attribute('exif_pixeldimensions',"")
				try:
					exif_rating = metadata['Xmp.xmp.Rating']
					stars = ""
					for i in range(1,6):
						if i <= int(exif_rating.raw_value):
							stars += u"\u2605"
						else:
							stars += u"\u2606"
					file.add_string_attribute('exif_rating',stars)
				except:
					file.add_string_attribute('exif_rating',u"\u2606\u2606\u2606\u2606\u2606")
			except:
				# no exif data?
				file.add_string_attribute('exif_datetime_original',"")
				file.add_string_attribute('exif_software',"")
				file.add_string_attribute('exif_flash',"")
				file.add_string_attribute('exif_pixeldimensions',"")
				file.add_string_attribute('exif_rating',u"\u2606\u2606\u2606\u2606\u2606")
			# try read image info directly
			try:
				im = Image.open(filename)
				file.add_string_attribute('pixeldimensions',str(im.size[0])+'x'+str(im.size[1]))
			except:
				file.add_string_attribute('pixeldimensions',"[image read error]")

		# video/flac handling
		if file.is_mime_type('video/x-msvideo') | file.is_mime_type('video/mpeg') | file.is_mime_type('video/x-ms-wmv') | file.is_mime_type('video/mp4') | file.is_mime_type('audio/x-flac') | file.is_mime_type('video/x-flv') | file.is_mime_type('video/x-matroska') | file.is_mime_type('audio/x-wav'):
			try:
				info=kaa.metadata.parse(filename)
				try: file.add_string_attribute('length',"%02i:%02i:%02i" % ((int(info.length/3600)), (int(info.length/60%60)), (int(info.length%60))))
				except: file.add_string_attribute('length','[n/a]')
				try: file.add_string_attribute('pixeldimensions', str(info.video[0].width) + 'x'+ str(info.video[0].height))
				except: file.add_string_attribute('pixeldimensions','[n/a]')
				try: file.add_string_attribute('bitrate',str(round(info.audio[0].bitrate/1000)))
				except: file.add_string_attribute('bitrate','[n/a]')
				try: file.add_string_attribute('samplerate',str(int(info.audio[0].samplerate))+' Hz')
				except: file.add_string_attribute('samplerate','[n/a]')
				try: file.add_string_attribute('title', info.title)
				except: file.add_string_attribute('title', '[n/a]')
				try: file.add_string_attribute('artist', info.artist)
				except: file.add_string_attribute('artist', '[n/a]')
				try: file.add_string_attribute('genre', info.genre)
				except: file.add_string_attribute('genre', '[n/a]')
				try: file.add_string_attribute('tracknumber',info.trackno)
				except: file.add_string_attribute('tracknumber', '[n/a]')
				try: file.add_string_attribute('date',info.userdate)
				except: file.add_string_attribute('date', '[n/a]')					
				try: file.add_string_attribute('album',info.album)
				except: file.add_string_attribute('album', '[n/a]')
			except:
				file.add_string_attribute('length','error')
				file.add_string_attribute('pixeldimensions','error')
				file.add_string_attribute('bitrate','error')
				file.add_string_attribute('samplerate','error')
				file.add_string_attribute('title','error')
				file.add_string_attribute('artist','error')
				file.add_string_attribute('genre','error')
				file.add_string_attribute('track','error')
				file.add_string_attribute('date','error')
				file.add_string_attribute('album','error')
		# pdf handling
		if file.is_mime_type('application/pdf'):
			try:
				f = open(filename, "rb")
				pdf = PdfFileReader(f)
				try: file.add_string_attribute('title', pdf.getDocumentInfo().title)
				except: file.add_string_attribute('title', "[n/a]")
				try: file.add_string_attribute('artist', pdf.getDocumentInfo().author)
				except: file.add_string_attribute('artist', "[n/a]")
				f.close()
			except:
				file.add_string_attribute('title', "[no info]")
				file.add_string_attribute('artist', "[no info]")
					
		self.get_columns()
    def get_property_pages(self, files):
        # files: list of NemoVFSFile
        if len(files) != 1:
            return
        
        file = files[0]
        if file.get_uri_scheme() != 'file':
            return
        
        filename = urllib.unquote(file.get_uri()[7:])
        
        #GUI
        locale.setlocale(locale.LC_ALL, '')
        _ = gettext.gettext
        self.property_label = Gtk.Label(_('Audio'))
        self.property_label.show()
        
        self.builder = Gtk.Builder()
        self.builder.add_from_file("/usr/share/nemo-python/extensions/nemo-audio-tab.glade")
        
        #connect signals to python methods
        self.builder.connect_signals(self)
        
        #connect gtk objects to python variables
        for obj in self.builder.get_objects():
            if issubclass(type(obj), Gtk.Buildable):
                name = Gtk.Buildable.get_name(obj)
                setattr(self, name, obj)
        
        # set defaults to blank to prevent nonetype errors
        file.add_string_attribute('title', '')
        file.add_string_attribute('album', '')
        file.add_string_attribute('artist', '')
        file.add_string_attribute('albumartist', '')
        file.add_string_attribute('tracknumber', '')
        file.add_string_attribute('genre', '')
        file.add_string_attribute('date', '')
        file.add_string_attribute('bitrate', '')
        file.add_string_attribute('samplerate', '')
        file.add_string_attribute('length', '')
        file.add_string_attribute('encodedby', '')
        file.add_string_attribute('copyright', '')
        
        no_info = _("No Info")
        mutaFile = mutagen.File(filename)

        #MP3
        if file.is_mime_type('audio/mpeg'):
            # attempt to read ID3 tag
            try:
                audio = EasyID3(filename)
                # sometimes the audio variable will not have one of these items defined, that's why
                # there is this long try / except attempt
                try: file.add_string_attribute('title', audio["title"][0])
                except: file.add_string_attribute('title', no_info)
                try: file.add_string_attribute('album', audio["album"][0])
                except: file.add_string_attribute('album', no_info)
                try: file.add_string_attribute('artist', audio["artist"][0])
                except: file.add_string_attribute('artist', no_info)
                try: file.add_string_attribute('albumartist', audio["performer"][0])
                except: file.add_string_attribute('albumartist', no_info)
                try: file.add_string_attribute('tracknumber', audio["tracknumber"][0])
                except: file.add_string_attribute('tracknumber', no_info)
                try: file.add_string_attribute('genre', audio["genre"][0])
                except: file.add_string_attribute('genre', no_info)
                try: file.add_string_attribute('date', audio["date"][0])
                except: file.add_string_attribute('date', no_info)
                try: file.add_string_attribute('encodedby', audio["encodedby"][0])
                except: file.add_string_attribute('encodedby', no_info)
                try: file.add_string_attribute('copyright', audio["copyright"][0])
                except: file.add_string_attribute('copyright', no_info)
            except:
                # [SabreWolfy] some files have no ID3 tag and will throw this exception:
                file.add_string_attribute('title', no_info)
                file.add_string_attribute('album', no_info)
                file.add_string_attribute('artist', no_info)
                file.add_string_attribute('albumartist', no_info)
                file.add_string_attribute('tracknumber', no_info)
                file.add_string_attribute('genre', no_info)
                file.add_string_attribute('date', no_info)
                file.add_string_attribute('encodedby', no_info)
                file.add_string_attribute('copyright', no_info)
                
                # try to read MP3 information (bitrate, length, samplerate)
            try:
                mpinfo = MPEGInfo (filename)
                file.add_string_attribute('bitrate', str(mpinfo.bitrate/1000) + " Kbps")

                file.add_string_attribute('samplerate', str(mpinfo.sample_rate) + " Hz")
                # [SabreWolfy] added consistent formatting of times in format hh:mm:ss
                mp3length = "%02i:%02i:%02i" % ((int(mpinfo.length/3600)), (int(mpinfo.length/60%60)), (int(mpinfo.length%60)))
                file.add_string_attribute('length', mp3length)
            except:
                file.add_string_attribute('bitrate', no_info)
                file.add_string_attribute('length', no_info)
                file.add_string_attribute('samplerate', no_info)

        #FLAC
        if file.is_mime_type('audio/flac'):
            try:
                audio = FLAC(filename)
                # sometimes the audio variable will not have one of these items defined, that's why
                # there is this long try / except attempt
                try: file.add_string_attribute('title', audio["title"][0])
                except: file.add_string_attribute('title', no_info)
                try: file.add_string_attribute('album', audio["album"][0])
                except: file.add_string_attribute('album', no_info)
                try: file.add_string_attribute('artist', audio["artist"][0])
                except: file.add_string_attribute('artist', no_info)
                try: file.add_string_attribute('albumartist', audio["albumartist"][0]) # this tag is different then mp3s
                except: file.add_string_attribute('albumartist', no_info)
                try: file.add_string_attribute('tracknumber', audio["tracknumber"][0])
                except: file.add_string_attribute('tracknumber', no_info)
                try: file.add_string_attribute('genre', audio["genre"][0])
                except: file.add_string_attribute('genre', no_info)
                try: file.add_string_attribute('date', audio["date"][0])
                except: file.add_string_attribute('date', no_info)
                try: file.add_string_attribute('encodedby', audio["encoded-by"][0]) # this tag is different then mp3s
                except: file.add_string_attribute('encodedby', no_info)
                try: file.add_string_attribute('copyright', audio["copyright"][0])
                except: file.add_string_attribute('copyright', no_info)
            except:
                # [SabreWolfy] some files have no ID3 tag and will throw this exception:
                file.add_string_attribute('title', no_info)
                file.add_string_attribute('album', no_info)
                file.add_string_attribute('artist', no_info)
                file.add_string_attribute('albumartist', no_info)
                file.add_string_attribute('tracknumber', no_info)
                file.add_string_attribute('genre', no_info)
                file.add_string_attribute('date', no_info)
                file.add_string_attribute('encodedby', no_info)
                file.add_string_attribute('copyright', no_info)
                
                # try to read the FLAC information (length, samplerate)
            try:
                fcinfo = StreamInfo (filename)
                
                file.add_string_attribute('samplerate', str(fcinfo.sample_rate) + " Hz")
                
                # [SabreWolfy] added consistent formatting of times in format hh:mm:ss
                flaclength = "%02i:%02i:%02i" % ((int(mutaFile.info.length/3600)), (int(mutaFile.info.length/60%60)), (int(mutaFile.info.length%60)))
                file.add_string_attribute('length', flaclength)
                file.add_string_attribute('bitrate', no_info) # flac doesn't really have a bitrate
            except:
                file.add_string_attribute('bitrate', no_info)
                file.add_string_attribute('length', no_info)
                file.add_string_attribute('samplerate', no_info)

        self.builder.get_object("title_text").set_label(file.get_string_attribute('title'))
        self.builder.get_object("album_text").set_label(file.get_string_attribute('album'))
        self.builder.get_object("album_artist_text").set_label(file.get_string_attribute('albumartist'))
        self.builder.get_object("artist_text").set_label(file.get_string_attribute('artist'))
        self.builder.get_object("genre_text").set_label(file.get_string_attribute('genre'))
        self.builder.get_object("year_text").set_label(file.get_string_attribute('date'))
        self.builder.get_object("track_number_text").set_label(file.get_string_attribute('tracknumber'))
        self.builder.get_object("sample_rate_text").set_label(file.get_string_attribute('samplerate'))
        self.builder.get_object("length_number").set_label(file.get_string_attribute('length'))
        self.builder.get_object("bitrate_number").set_label(file.get_string_attribute('bitrate'))
        self.builder.get_object("encoded_by_text").set_label(file.get_string_attribute('encodedby'))
        self.builder.get_object("copyright_text").set_label(file.get_string_attribute('copyright'))

        if file.is_mime_type('audio/mpeg') or file.is_mime_type('audio/flac'):
            return Nemo.PropertyPage(name="NemoPython::audio", label=self.property_label, page=self.mainWindow),
Example #14
0
    def update_file_info(self, file):
        # set defaults to blank
        file.add_string_attribute('title', '')
        file.add_string_attribute('description', '')
        file.add_string_attribute('album', '')
        file.add_string_attribute('creator', '')
        file.add_string_attribute('tracknumber', '')
        file.add_string_attribute('genre', '')
        file.add_string_attribute('date', '')
        file.add_string_attribute('bitrate', '')
        file.add_string_attribute('samplerate', '')
        file.add_string_attribute('length', '')
        file.add_string_attribute('datetime_original', '')
        file.add_string_attribute('exposure_time', '')
        file.add_string_attribute('fnumber', '')
        file.add_string_attribute('focal_length', '')
        file.add_string_attribute('gps_altitude', '')
        file.add_string_attribute('gps_latitude', '')
        file.add_string_attribute('gps_longitude', '')
        file.add_string_attribute('iso_speed', '')
        file.add_string_attribute('get_orientation', '')
        file.add_string_attribute('model', '')
        file.add_string_attribute('resolution_unit', '')
        file.add_string_attribute('xresolution', '')
        file.add_string_attribute('yresolution', '')
        file.add_string_attribute('shutter_speed_value', '')
        file.add_string_attribute('aperture_value', '')
        file.add_string_attribute('brightness_value', '')
        file.add_string_attribute('exposure_bias_value', '')
        file.add_string_attribute('max_aperture_value', '')
        file.add_string_attribute('metering_mode', '')
        file.add_string_attribute('light_source', '')
        file.add_string_attribute('flash', '')
        file.add_string_attribute('exposure_mode', '')
        file.add_string_attribute('gain_control', '')
        file.add_string_attribute('width', '')
        file.add_string_attribute('height', '')
        file.add_string_attribute('pages', '')

        if file.get_uri_scheme() != 'file':
            return

        # strip file:// to get absolute path
        filename = urllib.parse.unquote_plus(file.get_uri()[7:])

        # mp3 handling
        if file.is_mime_type('audio/mpeg'):
            # attempt to read ID3 tag
            try:
                audio = EasyID3(filename)
                # sometimes the audio variable will not have one of these items
                # defined, that's why there is this long try / except attempt
                try:
                    if 'title' in audio.keys():
                        file.add_string_attribute('title', audio['title'][0])
                    else:
                        file.add_string_attribute('title', '')
                except Exception:
                    file.add_string_attribute('title', _('Error'))
                try:
                    file.add_string_attribute('album', audio['album'][0])
                except Exception:
                    file.add_string_attribute('album', _('Error'))
                try:
                    file.add_string_attribute('creator', audio['artist'][0])
                except Exception:
                    file.add_string_attribute('creator', _('Error'))
                try:
                    file.add_string_attribute('tracknumber',
                                              audio['tracknumber'][0])
                except Exception:
                    file.add_string_attribute('tracknumber', _('Error'))
                try:
                    file.add_string_attribute('genre', audio['genre'][0])
                except Exception:
                    file.add_string_attribute('genre', _('Error'))
                try:
                    file.add_string_attribute('date', audio['date'][0])
                except Exception:
                    file.add_string_attribute('date', _('Error'))
            except Exception:
                # [SabreWolfy] some files have no ID3 tag and will throw this
                # exception:
                file.add_string_attribute('title', '')
                file.add_string_attribute('description', '')
                file.add_string_attribute('album', '')
                file.add_string_attribute('creator', '')
                file.add_string_attribute('tracknumber', '')
                file.add_string_attribute('genre', '')
                file.add_string_attribute('date', '')
            # try to read MP3 information (bitrate, length, samplerate)
            try:
                mpfile = open(filename)
                mpinfo = MPEGInfo(mpfile)
                file.add_string_attribute('bitrate',
                                          str(mpinfo.bitrate / 1000) + ' Kbps')
                file.add_string_attribute('samplerate',
                                          str(mpinfo.sample_rate) + ' Hz')
                # [SabreWolfy] added consistent formatting of times in format
                # hh:mm:ss
                # [SabreWolfy[ to allow for correct column sorting by length
                mp3length = '%02i:%02i:%02i' % ((int(mpinfo.length / 3600)),
                                                (int(mpinfo.length / 60 % 60)),
                                                (int(mpinfo.length % 60)))
                mpfile.close()
                file.add_string_attribute('length', mp3length)
            except Exception:
                file.add_string_attribute('bitrate', _('Error'))
                file.add_string_attribute('length', _('Error'))
                file.add_string_attribute('samplerate', _('Error'))
                try:
                    mpfile.close()
                except Exception:
                    pass

        # image handling
        if file.get_mime_type().split('/')[0] in ('image'):
            # EXIF handling routines
            try:
                metadata = GExiv2.Metadata(filename)
                try:
                    file.add_string_attribute(
                        'datetime_original',
                        metadata.get_tag_string('Exif.Image.DateTime'))
                except Exception:
                    file.add_string_attribute('datetime_original', '')
                try:
                    file.add_string_attribute(
                        'creator', metadata.get_tag_string('Xmp.dc.creator'))
                except Exception:
                    file.add_string_attribute('creator', '')
                try:
                    file.add_string_attribute(
                        'description',
                        metadata.get_tag_string('Exif.Image.ImageDescription'))
                except Exception:
                    file.add_string_attribute('description', '')
                try:
                    x = str(metadata.get_tag_string('Xmp.dc.title'))
                    file.add_string_attribute('title', x[17:])
                except Exception:
                    file.add_string_attribute('title', '')
                try:
                    file.add_string_attribute('exposure_time',
                                              metadata.get_exposure_time())
                except Exception:
                    file.add_string_attribute('exposure_time', '')
                try:
                    file.add_string_attribute('fnumber',
                                              metadata.get_fnumber())
                except Exception:
                    file.add_string_attribute('fnumber', '')
                try:
                    file.add_string_attribute('focal_length',
                                              metadata.get_focal_length())
                except Exception:
                    file.add_string_attribute('focal_length', '')
                try:
                    file.add_string_attribute('gps_altitude',
                                              metadata.get_gps_altitude())
                except Exception:
                    file.add_string_attribute('gps_altitude', '')
                try:
                    file.add_string_attribute('gps_latitude',
                                              metadata.get_gps_latitude())
                except Exception:
                    file.add_string_attribute('gps_latitude', '')
                try:
                    file.add_string_attribute('gps_longitude',
                                              metadata.get_gps_longitude())
                except Exception:
                    file.add_string_attribute('gps_longitude', '')
                try:
                    file.add_string_attribute('iso_speed',
                                              metadata.get_iso_speed())
                except Exception:
                    file.add_string_attribute('iso_speed', '')
                file.add_string_attribute('orientation',
                                          get_orientation(metadata))
                try:
                    file.add_string_attribute(
                        'model', metadata.get_tag_string('Exif.Image.Model'))
                except Exception:
                    file.add_string_attribute('model', '')
                file.add_string_attribute('resolution_unit',
                                          get_resolution_unit(metadata))
                try:
                    file.add_string_attribute(
                        'xresolution',
                        metadata.get_tag_string('Exif.Image.XResolution'))
                except Exception:
                    file.add_string_attribute('xresolution', '')
                try:
                    file.add_string_attribute(
                        'yresolution',
                        metadata.get_tag_string('Exif.Image.YResolution'))
                except Exception:
                    file.add_string_attribute('yresolution', '')
                try:
                    file.add_string_attribute(
                        'shutter_speed_value',
                        metadata.get_tag_string(
                            'Exif.Photo.ShutterSpeedValue'))
                except Exception:
                    file.add_string_attribute('shutter_speed_value', '')
                try:
                    file.add_string_attribute(
                        'aperture_value',
                        metadata.get_tag_string('Exif.Photo.ApertureValue'))
                except Exception:
                    file.add_string_attribute('aperture_value', '')
                try:
                    file.add_string_attribute(
                        'brightness_value',
                        metadata.get_tag_string('Exif.Photo.BrightnessValue'))
                except Exception:
                    file.add_string_attribute('brightness_value', '')
                try:
                    file.add_string_attribute(
                        'brightness_value',
                        metadata.get_tag_string('Exif.Photo.BrightnessValue'))
                except Exception:
                    file.add_string_attribute('brightness_value', '')
                try:
                    file.add_string_attribute(
                        'exposure_bias_value',
                        metadata.get_tag_string(
                            'Exif.Photo.ExposureBiasValue'))
                except Exception:
                    file.add_string_attribute('exposure_bias_value', '')
                try:
                    file.add_string_attribute(
                        'max_aperture_value',
                        metadata.get_tag_string('Exif.Photo.MaxApertureValue'))
                except Exception:
                    file.add_string_attribute('max_aperture_value', '')
                file.add_string_attribute('metering_mode',
                                          get_metering_mode(metadata))
                file.add_string_attribute('light_source',
                                          get_light_source(metadata))
                file.add_string_attribute('flash', get_flash(metadata))
                file.add_string_attribute('exposure_mode',
                                          get_exposure_mode(metadata))
                file.add_string_attribute('gain_control',
                                          get_gain_control(metadata))
            except Exception:
                file.add_string_attribute('datetime_original', '')
                file.add_string_attribute('creator', '')
                file.add_string_attribute('title', '')
                file.add_string_attribute('description', '')
                file.add_string_attribute('exposure_time', '')
                file.add_string_attribute('fnumber', '')
                file.add_string_attribute('focal_length', '')
                file.add_string_attribute('gps_altitude', '')
                file.add_string_attribute('gps_latitude', '')
                file.add_string_attribute('gps_longitude', '')
                file.add_string_attribute('iso_speed', '')
                file.add_string_attribute('get_orientation', '')
                file.add_string_attribute('model', '')
                file.add_string_attribute('resolution_unit', '')
                file.add_string_attribute('xresolution', '')
                file.add_string_attribute('yresolution', '')
                file.add_string_attribute('shutter_speed_value', '')
                file.add_string_attribute('aperture_value', '')
                file.add_string_attribute('brightness_value', '')
                file.add_string_attribute('exposure_bias_value', '')
                file.add_string_attribute('max_aperture_value', '')
                file.add_string_attribute('metering_mode', '')
                file.add_string_attribute('light_source', '')
                file.add_string_attribute('flash', '')
                file.add_string_attribute('exposure_mode', '')
                file.add_string_attribute('gain_control', '')
            try:
                im = Image.open(filename)
                try:
                    file.add_string_attribute('width', str(im.size[0]))
                except Exception:
                    file.add_string_attribute('width', _('Error'))
                try:
                    file.add_string_attribute('height', str(im.size[1]))
                except Exception:
                    file.add_string_attribute('height', _('Error'))
            except Exception:
                file.add_string_attribute('width', '')
                file.add_string_attribute('height', '')

        # video/flac handling
        if file.is_mime_type('video/x-msvideo') or\
                file.is_mime_type('video/mpeg') or\
                file.is_mime_type('video/x-ms-wmv') or\
                file.is_mime_type('video/mp4') or\
                file.is_mime_type('audio/x-flac') or\
                file.is_mime_type('video/x-flv') or\
                file.is_mime_type('video/x-matroska') or\
                file.is_mime_type('audio/x-wav'):
            metadata = MediaInfo(filename)
            file.add_string_attribute('format', metadata.get_format())
            file.add_string_attribute('duration',
                                      metadata.get_duration_string())
            file.add_string_attribute('overall_bitrate',
                                      metadata.get_overallbitrate())
            file.add_string_attribute('frame_count', metadata.get_framecount())
            file.add_string_attribute('video_format',
                                      metadata.get_videoformat())
            file.add_string_attribute('width', metadata.get_width())
            file.add_string_attribute('height', metadata.get_height())
            file.add_string_attribute('bit_depth', metadata.get_bitdepth())
            file.add_string_attribute('audio_format',
                                      metadata.get_audioformat())
            file.add_string_attribute('title', metadata.get_title())
            file.add_string_attribute('description',
                                      metadata.get_description())
        # pdf handling
        if file.is_mime_type('application/pdf'):
            try:
                f = open(filename, 'rb')
                pdf = PdfFileReader(f)
                info = pdf.getDocumentInfo()
                try:
                    file.add_string_attribute(
                        'title', info.title if info.title is not None else '')
                except Exception:
                    file.add_string_attribute('title', _('Error'))
                try:
                    file.add_string_attribute(
                        'description',
                        info.subject if info.subject is not None else '')
                except Exception:
                    file.add_string_attribute('description', _('Error'))
                try:
                    file.add_string_attribute(
                        'creator',
                        info.author if info.author is not None else '')
                except Exception:
                    file.add_string_attribute('creator', _('Error'))
                try:
                    file.add_string_attribute('pages', str(pdf.getNumPages()))
                except Exception:
                    file.add_string_attribute('pages', _('Error'))
                if pdf.getNumPages() > 0:
                    try:
                        width = abs(
                            pdf.getPage(0).mediaBox.upperRight[0] -
                            pdf.getPage(0).mediaBox.lowerLeft[0])
                        file.add_string_attribute(
                            'width',
                            str(int(float(width) * math.sqrt(2.0) / 4.0)))
                    except Exception:
                        file.add_string_attribute('width', '')
                    try:
                        height = abs(
                            pdf.getPage(0).mediaBox.upperRight[1] -
                            pdf.getPage(0).mediaBox.lowerLeft[1])
                        file.add_string_attribute(
                            'height',
                            str(int(float(height) * math.sqrt(2.0) / 4.0)))
                    except Exception:
                        file.add_string_attribute('height', '')
                else:
                    file.add_string_attribute('width', '')
                    file.add_string_attribute('height', '')
                f.close()
            except Exception:
                file.add_string_attribute('title', _('Error'))
                file.add_string_attribute('description', _('Error'))
                file.add_string_attribute('creator', _('Error'))
                file.add_string_attribute('pages', _('Error'))
                file.add_string_attribute('width', _('Error'))
                file.add_string_attribute('height', _('Error'))
        self.get_columns()
Example #15
0
    def update_file_info(self, file, **kwargs):
        if file.get_uri_scheme() != 'file':
            return

        # Set defaults to blank, else values are showing 'unknown' instead.
        [file.add_string_attribute(column.get('name'), '') for column in COLUMN_DEFINITIONS]

        # strip file:// to get absolute path
        filename = urllib.parse.unquote_plus(file.get_uri()[7:])

        ################
        # mp3 handling #
        ################
        if file.is_mime_type('audio/mpeg'):
            # attempt to read ID3 tag
            try:
                audio = EasyID3(filename)
                map_audio(file, audio, 'title')
                map_audio(file, audio, 'album')
                map_audio(file, audio, 'artist')
                map_audio(file, audio, 'tracknumber')
                map_audio(file, audio, 'genre')
                map_audio(file, audio, 'date')
            except Exception:
                pass

            # try to read MP3 information (bitrate, length, samplerate)
            with open(filename) as mpfile:
                try:
                    mpinfo = MPEGInfo(mpfile)
                    map_any(file, mpinfo, 'bitrate',    f=lambda m: m.bitrate / 1000, c=lambda v: v + ' Kbps')
                    map_any(file, mpinfo, 'samplerate', f=lambda m: m.sample_rate,    c=lambda v: v + ' Hz')
                    map_any(file, mpinfo, 'length',     f=lambda m: m.length,         c=secToTimeFormat)
                except Exception:
                    pass

        ##################
        # image handling #
        ##################
        if file.get_mime_type().split('/')[0] in ('image'):
            try:
                metadata = GExiv2.Metadata(filename)
            except Exception:
                metadata = GExiv2.Metadata()

            map_exif(file, metadata, 'aperture_value', 'Exif.Photo.ApertureValue')
            map_exif(file, metadata, 'artist', 'Exif.Image.Artist')
            map_exif(file, metadata, 'brightness_value', 'Exif.Photo.BrightnessValue')
            map_exif(file, metadata, 'datetime_original', 'Exif.Image.DateTime')
            map_exif(file, metadata, 'exposure_bias_value', 'Exif.Photo.ExposureBiasValue')
            map_exif(file, metadata, 'exposure_mode', 'Exif.Photo.ExposureMode', c=lambda v: convert(EXPOSURE_MODE, v))
            map_exif(file, metadata, 'exposure_time', f=lambda m,t: m.get_exposure_time())
            map_exif(file, metadata, 'flash', 'Exif.Photo.Flash', c=lambda v: convert(FLASH, v))
            map_exif(file, metadata, 'fnumber',       f=lambda m,t: m.get_fnumber())
            map_exif(file, metadata, 'focal_length',  f=lambda m,t: m.get_focal_length())
            map_exif(file, metadata, 'gain_control', 'Exif.Photo.GainControl', c=lambda v: convert(GAIN_CONTROL, v))
            map_exif(file, metadata, 'gps_altitude',  f=lambda m,t: m.get_gps_altitude())
            map_exif(file, metadata, 'gps_latitude',  f=lambda m,t: m.get_gps_latitude())
            map_exif(file, metadata, 'gps_longitude', f=lambda m,t: m.get_gps_longitude())
            map_exif(file, metadata, 'iso_speed',     f=lambda m,t: m.get_iso_speed())
            map_exif(file, metadata, 'light_source', 'Exif.Photo.LightSource', c=lambda v: convert(LIGHT_SOURCE, v))
            map_exif(file, metadata, 'max_aperture_value', 'Exif.Photo.MaxApertureValue')
            map_exif(file, metadata, 'metering_mode', 'Exif.Photo.MeteringMode', c=lambda v: convert(METERING_MODE, v))
            map_exif(file, metadata, 'model', 'Exif.Image.Model')
            map_exif(file, metadata, 'orientation',   f=lambda m,t:m.get_orientation(), c=lambda v: convert(ORIENTATION, v))
            map_exif(file, metadata, 'resolution_unit', 'Exif.Image.ResolutionUnit', c=lambda v: convert(RESOLUTION_UNIT, v))
            map_exif(file, metadata, 'shutter_speed_value', 'Exif.Photo.ShutterSpeedValue')
            map_exif(file, metadata, 'title', 'Exif.Image.ImageDescription')
            map_exif(file, metadata, 'xresolution', 'Exif.Image.XResolution')
            map_exif(file, metadata, 'yresolution', 'Exif.Image.YResolution')

            try:
                im = Image.open(filename)
                map_any(file, im, 'width', f=lambda i: i.size[0])
                map_any(file, im, 'height', f=lambda i: i.size[1])
            except Exception:
                pass

        #######################
        # video/flac handling #
        #######################
        if file.is_mime_type('video/x-msvideo') or\
                file.is_mime_type('video/mpeg') or\
                file.is_mime_type('video/x-ms-wmv') or\
                file.is_mime_type('audio/x-ms-wma') or\
                file.is_mime_type('video/mp4') or\
                file.is_mime_type('audio/x-flac') or\
                file.is_mime_type('video/x-flv') or\
                file.is_mime_type('video/x-matroska') or\
                file.is_mime_type('audio/x-wav'):
            try:
                mediainfo = MediaInfo(filename)
                map_mediainfo(file, mediainfo, 'format', 'Format')
                map_mediainfo(file, mediainfo, 'duration', 'Duration', c=secToTimeFormat)
                map_mediainfo(file, mediainfo, 'overall_bitrate', 'OverallBitRate')
                map_mediainfo(file, mediainfo, 'frame_count', 'FrameCount')
                map_mediainfo(file, mediainfo, 'video_format', 'VideoFormat')
                map_mediainfo(file, mediainfo, 'width', 'Width')
                map_mediainfo(file, mediainfo, 'height', 'Height')
                map_mediainfo(file, mediainfo, 'bit_depth', 'BitDepth')
                map_mediainfo(file, mediainfo, 'audio_format', 'AudioFormat')
            except Exception:
                pass

        ################
        # pdf handling #
        ################
        if file.is_mime_type('application/pdf'):
            try:
                with open(filename, 'rb') as f:
                    pdf = PdfFileReader(f)
                    map_any(file, pdf, 'pages', f=lambda i:i.getNumPages())

                    info = pdf.getDocumentInfo()
                    map_any(file, info, 'title', f=lambda i:i.title)
                    map_any(file, info, 'artist', f=lambda i:i.author)

                    if pdf.getNumPages() > 0:
                        bbox = pdf.getPage(0).mediaBox
                        map_any(file, bbox, 'width', f=lambda b: self.points_from_bbox(b, 0), c=self.points_to_mm)
                        map_any(file, bbox, 'height', f=lambda b: self.points_from_bbox(b, 1), c=self.points_to_mm)
            except Exception:
                pass