def get_file_details(urlObj): ''' Function fetches information about media files. The output may be used as init parameters for a Main.Song object. @param urlObj: A metaUrl Object. @return url, filesize, SupportsHTTPRange, bitrate, title, artist, source, quality, videoid ''' if urlObj.isVideo: SupportsHTTPRange = True title, artist = utils.parse_title_from_filename(urlObj.title) ID3TagsToEdit = {} ID3TagsToEdit['TIT2'] = TIT2(encoding=3, text=title) ID3TagsToEdit['TPE1'] = TPE1(encoding=3, text=artist) dummyMP3 = utils.makeDummyMP3(config.temp_dir) utils.setID3Tags(ID3TagsToEdit, dummyMP3) ID3Info = [ config.itag_audio_bitrates[urlObj.itag.quality], title, artist, dummyMP3 ] elif urlObj.source.lower() in ["soundcloud", 'bandcamp']: SupportsHTTPRange = True ID3Info = get_id3info(urlObj.url) if not ID3Info[1] and not ID3Info[ 2]: # if there is no title and artist data in ID3 title, artist = utils.parse_title_from_filename(urlObj.title) ID3TagsToEdit = {} ID3TagsToEdit['TIT2'] = TIT2(encoding=3, text=title) ID3TagsToEdit['TPE1'] = TPE1(encoding=3, text=artist) dummyMP3 = utils.makeDummyMP3(config.temp_dir) utils.setID3Tags(ID3TagsToEdit, dummyMP3) ID3Info = [ID3Info[0], title, artist, dummyMP3] else: SupportsHTTPRange = is_ServerSupportHTTPRange(urlObj.url) ID3Info = get_id3info(urlObj.url) filesize = get_filesize(urlObj.url) bitrate, title, artist, ID3File = ID3Info # if file didn't have id3 tags, or if the 'title' and 'artist' values were empty if not ID3File or (not title and not artist): fn = ".".join(urlObj.url.split('/')[-1].split('.')[:-1]) title, artist = utils.parse_title_from_filename(fn) ID3TagsToEdit = {} ID3TagsToEdit['TIT2'] = TIT2(encoding=3, text=title) ID3TagsToEdit['TPE1'] = TPE1(encoding=3, text=artist) ID3File = utils.makeDummyMP3(config.temp_dir) utils.setID3Tags(ID3TagsToEdit, ID3File) return urlObj.url, filesize, SupportsHTTPRange, bitrate, title, artist, ID3File, \ urlObj.source, urlObj.duration, urlObj.itag, urlObj.videoid, \ urlObj.webpage_url, urlObj.view_count, urlObj.description
def get_file_details(urlObj): ''' Function fetches information about media files. The output may be used as init parameters for a Main.Song object. @param urlObj: A metaUrl Object. @return url, filesize, SupportsHTTPRange, bitrate, title, artist, source, quality, videoid ''' if urlObj.isVideo: SupportsHTTPRange = True title, artist = utils.parse_title_from_filename(urlObj.title) ID3TagsToEdit = {} ID3TagsToEdit['TIT2'] = TIT2(encoding=3, text=title) ID3TagsToEdit['TPE1'] = TPE1(encoding=3, text=artist) dummyMP3 = utils.makeDummyMP3(config.temp_dir) utils.setID3Tags(ID3TagsToEdit, dummyMP3) ID3Info = [config.itag_audio_bitrates[urlObj.itag.quality], title, artist, dummyMP3] elif urlObj.source.lower() in ["soundcloud", 'bandcamp']: SupportsHTTPRange = True ID3Info = get_id3info(urlObj.url) if not ID3Info[1] and not ID3Info[2]: # if there is no title and artist data in ID3 title, artist = utils.parse_title_from_filename(urlObj.title) ID3TagsToEdit = {} ID3TagsToEdit['TIT2'] = TIT2(encoding=3, text=title) ID3TagsToEdit['TPE1'] = TPE1(encoding=3, text=artist) dummyMP3 = utils.makeDummyMP3(config.temp_dir) utils.setID3Tags(ID3TagsToEdit, dummyMP3) ID3Info = [ID3Info[0], title, artist, dummyMP3] else: SupportsHTTPRange = is_ServerSupportHTTPRange(urlObj.url) ID3Info = get_id3info(urlObj.url) filesize = get_filesize(urlObj.url) bitrate, title, artist, ID3File = ID3Info # if file didn't have id3 tags, or if the 'title' and 'artist' values were empty if not ID3File or (not title and not artist): fn = ".".join(urlObj.url.split('/')[-1].split('.')[:-1]) title, artist = utils.parse_title_from_filename(fn) ID3TagsToEdit = {} ID3TagsToEdit['TIT2'] = TIT2(encoding=3, text=title) ID3TagsToEdit['TPE1'] = TPE1(encoding=3, text=artist) ID3File = utils.makeDummyMP3(config.temp_dir) utils.setID3Tags(ID3TagsToEdit, ID3File) return urlObj.url, filesize, SupportsHTTPRange, bitrate, title, artist, ID3File, \ urlObj.source, urlObj.duration, urlObj.itag, urlObj.videoid, \ urlObj.webpage_url, urlObj.view_count, urlObj.description
def __init__(self, songPath, id3_action="", parent=None): super(MainWin, self).__init__(parent) self.isValid = True self.path = songPath self.id3_action = id3_action if id3_action else config.id3_action self.changed_AlbumArt = False self.pix_path = "" self.albumArt_task = "nothing" ''' albumArt_task may be 'nothing', 'add' and 'delete': 'nothing': Do not touch the APIC tag. 'add': creates an APIC tag with self.pix_path. 'delete': deletes an APIC tag, if exists. ''' self.lyricsList = [] # The lyrics list self.lyricsListIndex = -1 # Will be enabled when the last value of lyricsList will be fetched # and the servers will return EOF. # Until then, the lyrics groupbox will look like: # Lyrics (4/7+) (showing lyrics num. 4 out of seven, and more are available but not fetched yet) # When that switch will be enabled, the plus sign will get disappeared. self.lyricsList_EOF = False # If value is 0, notfound errors won't be suppressed. Any other value will suppress all errors. self.suppress_notfound_errors = 0 self.setWindowTitle(tr("ID3 Editor")) self.resize(650, 430) self.setWindowIcon(QtGui.QIcon(r'pics\id3edit.png')) self.empty_cdbox_path = r"pics\empty_cdbox_%s.png" % config.lang if os.path.exists( "pics\empty_cdbox_%s.png" % config.lang) else r"pics\empty_cdbox.png" log.debug("Initializing SetID3Window Widgets...") self.init_threads() self.init_id3data() if not self.isValid: return if not [ x for x in self.easyID3Obj.values() if x[0] ]: # If all values are actually blank, we shall attemp to parse it from the filename. fn = os.path.splitext(os.path.basename(self.path))[0] title, artist = utils.parse_title_from_filename(fn) self.easyID3Obj['title'] = [title] self.easyID3Obj['artist'] = [artist] self.init_widgets() if self.id3_action == 'ask_albumart': self.fetch_all(autochoose_albumart=False) if self.id3_action == 'ask': self.fetch_all(autochoose_albumart=True) if self.id3_action == 'noask': self.close_with_timeout() self.fetch_all(autochoose_albumart=True)
def __init__(self, songPath, id3_action="", parent=None): super(MainWin, self).__init__(parent) self.isValid = True self.path = songPath self.id3_action = id3_action if id3_action else config.id3_action self.changed_AlbumArt = False self.pix_path = "" self.albumArt_task = "nothing" ''' albumArt_task may be 'nothing', 'add' and 'delete': 'nothing': Do not touch the APIC tag. 'add': creates an APIC tag with self.pix_path. 'delete': deletes an APIC tag, if exists. ''' self.lyricsList = [] # The lyrics list self.lyricsListIndex = -1 # Will be enabled when the last value of lyricsList will be fetched # and the servers will return EOF. # Until then, the lyrics groupbox will look like: # Lyrics (4/7+) (showing lyrics num. 4 out of seven, and more are available but not fetched yet) # When that switch will be enabled, the plus sign will get disappeared. self.lyricsList_EOF = False # If value is 0, notfound errors won't be suppressed. Any other value will suppress all errors. self.suppress_notfound_errors = 0 self.setWindowTitle(tr("ID3 Editor")) self.resize(650, 430) self.setWindowIcon(QtGui.QIcon(r'pics\id3edit.png')) self.empty_cdbox_path = r"pics\empty_cdbox_%s.png" % config.lang if os.path.exists("pics\empty_cdbox_%s.png" % config.lang) else r"pics\empty_cdbox.png" log.debug("Initializing SetID3Window Widgets...") self.init_threads() self.init_id3data() if not self.isValid: return if not [x for x in self.easyID3Obj.values() if x[0]]: # If all values are actually blank, we shall attemp to parse it from the filename. fn = os.path.splitext(os.path.basename(self.path))[0] title, artist = utils.parse_title_from_filename(fn) self.easyID3Obj['title'] = [title] self.easyID3Obj['artist'] = [artist] self.init_widgets() if self.id3_action == 'ask_albumart': self.fetch_all(autochoose_albumart=False) if self.id3_action == 'ask': self.fetch_all(autochoose_albumart=True) if self.id3_action == 'noask': self.close_with_timeout() self.fetch_all(autochoose_albumart=True)
def parse(song, artist): "Function searches the web for song lyrics. returns a generator." s = '%s - %s' % (artist.strip(), song.strip()) if utils.isHebrew(song) or utils.isHebrew(artist): log.debug("Grabbing lyrics for %s from shironet.co.il..." % s) gen = parse_shironet(s) for lyrics in gen: yield lyrics else: # if english log.debug("Grabbing lyrics for %s from LyricsMode..." % song) gen = parse_LyricsMode(song, artist) for lyrics in gen: yield lyrics # lets try trim the ()'s or []'s _song = song _artist = artist song = utils.trim_between(_song) song = utils.trim_between(song, '[', ']') if song != _song: log.debug("Trimming %s --> %s" % (_song, song)) artist = utils.trim_between(_artist) artist = utils.trim_between(artist, '[', ']') if artist != _artist: log.debug("Trimming %s --> %s" % (_artist, artist)) ''' The following situation may happen: >>> song = "Train - 50 Ways To Say Goodbye" >>> artist = "Train" ''' x, y = utils.parse_title_from_filename(song) if artist: if artist.lower() == x.lower(): log.debug("Trimming %s --> %s" % (song, y)) song = y if artist.lower() == y.lower(): log.debug("Trimming %s --> %s" % (song, x)) song = x else: log.debug("Setting artist name from nothing to %s" % y) song, artist = x, y if artist != _artist or song != _song: s = '%s - %s' % (artist.strip(), song.strip()) log.debug("Grabbing lyrics for %s from LyricsMode..." % song) gen = parse_LyricsMode(song, artist) for lyrics in gen: yield lyrics log.debug("Grabbing lyrics for %s from OnlyLyrics..." % song) try: gen = parse_onlylyrics(song, artist) except socket.error: return for lyrics in gen: yield lyrics if len(artist.split()) == 2: flipped_artist = " ".join(artist.split(' ')[::-1]) log.debug("Grabbing lyrics for %s from OnlyLyrics (flipping last and first name)..." % song) try: gen = parse_onlylyrics(song, flipped_artist) except socket.error: return for lyrics in gen: yield lyrics log.debug("Grabbing lyrics for %s from ChartLyrics..." % song) try: gen = parse_ChartLyrics(song, artist) except socket.error: return for lyrics in gen: yield lyrics return
def parse(song, artist): "Function searches the web for song lyrics. returns a generator." s = '%s - %s' % (artist.strip(), song.strip()) if utils.isHebrew(song) or utils.isHebrew(artist): log.debug("Grabbing lyrics for %s from shironet.co.il..." % s) gen = parse_shironet(s) for lyrics in gen: yield lyrics else: # if english log.debug("Grabbing lyrics for %s from LyricsMode..." % song) gen = parse_LyricsMode(song, artist) for lyrics in gen: yield lyrics # lets try trim the ()'s or []'s _song = song _artist = artist song = utils.trim_between(_song) song = utils.trim_between(song, '[', ']') if song != _song: log.debug("Trimming %s --> %s" % (_song, song)) artist = utils.trim_between(_artist) artist = utils.trim_between(artist, '[', ']') if artist != _artist: log.debug("Trimming %s --> %s" % (_artist, artist)) ''' The following situation may happen: >>> song = "Train - 50 Ways To Say Goodbye" >>> artist = "Train" ''' x, y = utils.parse_title_from_filename(song) if artist: if artist.lower() == x.lower(): log.debug("Trimming %s --> %s" % (song, y)) song = y if artist.lower() == y.lower(): log.debug("Trimming %s --> %s" % (song, x)) song = x else: log.debug("Setting artist name from nothing to %s" % y) song, artist = x, y if artist != _artist or song != _song: s = '%s - %s' % (artist.strip(), song.strip()) log.debug("Grabbing lyrics for %s from LyricsMode..." % song) gen = parse_LyricsMode(song, artist) for lyrics in gen: yield lyrics log.debug("Grabbing lyrics for %s from OnlyLyrics..." % song) try: gen = parse_onlylyrics(song, artist) except socket.error: return for lyrics in gen: yield lyrics if len(artist.split()) == 2: flipped_artist = " ".join(artist.split(' ')[::-1]) log.debug( "Grabbing lyrics for %s from OnlyLyrics (flipping last and first name)..." % song) try: gen = parse_onlylyrics(song, flipped_artist) except socket.error: return for lyrics in gen: yield lyrics log.debug("Grabbing lyrics for %s from ChartLyrics..." % song) try: gen = parse_ChartLyrics(song, artist) except socket.error: return for lyrics in gen: yield lyrics return