From 2c288bda4235bed6927d88d9bf53ecaec18f7904 Mon Sep 17 00:00:00 2001 From: Filippo Valsorda Date: Wed, 9 May 2012 14:47:28 +0200 Subject: [PATCH] reorganized the titles sanitizing: now title is the untouched title and stitle is created in process_info() and is cross-filesystem sanitized by sanitize_filename(); closes #164 --- youtube-dl | Bin 41751 -> 40223 bytes youtube_dl/FileDownloader.py | 2 ++ youtube_dl/InfoExtractors.py | 60 ++++------------------------------- youtube_dl/utils.py | 18 +++++------ 4 files changed, 17 insertions(+), 63 deletions(-) diff --git a/youtube-dl b/youtube-dl index 56f5b289bdc021a725a94b4e5d0a26615915e42a..3fc77f206861fcf4523be9d3e7c3d0ec69107b49 100755 GIT binary patch delta 26910 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

-$Pf&WUg@h6Wxy+k_AK^*sjejJb5{kRkK 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 AF8}}l diff --git a/youtube_dl/FileDownloader.py b/youtube_dl/FileDownloader.py index 2bc0b0d4e9..14e872a98a 100644 --- a/youtube_dl/FileDownloader.py +++ b/youtube_dl/FileDownloader.py @@ -344,6 +344,8 @@ def _match_entry(self, info_dict): def process_info(self, info_dict): """Process a single dictionary returned by an InfoExtractor.""" + info_dict['stitle'] = sanitize_filename(info_dict['title']) + reason = self._match_entry(info_dict) if reason is not None: self.to_screen(u'[download] ' + reason) diff --git a/youtube_dl/InfoExtractors.py b/youtube_dl/InfoExtractors.py index be6b0cb085..ee8783ffd6 100644 --- a/youtube_dl/InfoExtractors.py +++ b/youtube_dl/InfoExtractors.py @@ -39,7 +39,6 @@ class InfoExtractor(object): url: Final video URL. uploader: Nickname of the video uploader. title: Literal title. - stitle: Simplified title. ext: Video filename extension. format: Video format. player_url: SWF Player URL (may be None). @@ -327,10 +326,6 @@ def _real_extract(self, url): return video_title = urllib.unquote_plus(video_info['title'][0]) video_title = video_title.decode('utf-8') - video_title = sanitize_title(video_title) - - # simplified title - simple_title = simplify_title(video_title) # thumbnail image if 'thumbnail_url' not in video_info: @@ -447,7 +442,6 @@ def _real_extract(self, url): 'uploader': video_uploader.decode('utf-8'), 'upload_date': upload_date, 'title': video_title, - 'stitle': simple_title, 'ext': video_extension.decode('utf-8'), 'format': (format_param is None and u'NA' or format_param.decode('utf-8')), 'thumbnail': video_thumbnail.decode('utf-8'), @@ -523,8 +517,6 @@ def _real_extract(self, url): self._downloader.download(['http://www.youtube.com/watch?v=%s' % mobj2.group(1)]) return - simple_title = mobj.group(2).decode('utf-8') - # Retrieve video webpage to extract further information request = urllib2.Request('http://www.metacafe.com/watch/%s/' % video_id) try: @@ -570,7 +562,6 @@ def _real_extract(self, url): self._downloader.trouble(u'ERROR: unable to extract title') return video_title = mobj.group(1).decode('utf-8') - video_title = sanitize_title(video_title) mobj = re.search(r'(?ms)By:\s*(.+?)<', webpage) if mobj is None: @@ -584,7 +575,6 @@ def _real_extract(self, url): 'uploader': video_uploader.decode('utf-8'), 'upload_date': u'NA', 'title': video_title, - 'stitle': simple_title, 'ext': video_extension.decode('utf-8'), 'format': u'NA', 'player_url': None, @@ -651,8 +641,6 @@ def _real_extract(self, url): self._downloader.trouble(u'ERROR: unable to extract title') return video_title = unescapeHTML(mobj.group('title').decode('utf-8')) - video_title = sanitize_title(video_title) - simple_title = simplify_title(video_title) mobj = re.search(r'(?im)[^<]+?]+?>([^<]+?)', webpage) if mobj is None: @@ -666,7 +654,6 @@ def _real_extract(self, url): 'uploader': video_uploader.decode('utf-8'), 'upload_date': u'NA', 'title': video_title, - 'stitle': simple_title, 'ext': video_extension.decode('utf-8'), 'format': u'NA', 'player_url': None, @@ -730,8 +717,6 @@ def _real_extract(self, url): self._downloader.trouble(u'ERROR: unable to extract title') return video_title = mobj.group(1).decode('utf-8') - video_title = sanitize_title(video_title) - simple_title = simplify_title(video_title) # Extract video description mobj = re.search(r'([^<]*)', webpage) @@ -764,7 +749,6 @@ def _real_extract(self, url): 'uploader': u'NA', 'upload_date': u'NA', 'title': video_title, - 'stitle': simple_title, 'ext': video_extension.decode('utf-8'), 'format': u'NA', 'player_url': None, @@ -823,8 +807,6 @@ def _real_extract(self, url): self._downloader.trouble(u'ERROR: unable to extract title') return video_title = mobj.group(1).decode('utf-8') - video_title = sanitize_title(video_title) - simple_title = simplify_title(video_title) video_uploader = mobj.group(2).decode('utf-8') @@ -834,7 +816,6 @@ def _real_extract(self, url): 'uploader': video_uploader, 'upload_date': u'NA', 'title': video_title, - 'stitle': simple_title, 'ext': video_extension.decode('utf-8'), 'format': u'NA', 'player_url': None, @@ -912,7 +893,6 @@ def _real_extract(self, url, new_video=True): self._downloader.trouble(u'ERROR: unable to extract video title') return video_title = mobj.group(1).decode('utf-8') - simple_title = simplify_title(video_title) mobj = re.search(r'

(.*)

', webpage) if mobj is None: @@ -978,7 +958,6 @@ def _real_extract(self, url, new_video=True): 'uploader': video_uploader, 'upload_date': u'NA', 'title': video_title, - 'stitle': simple_title, 'ext': video_extension.decode('utf-8'), 'thumbnail': video_thumbnail.decode('utf-8'), 'description': video_description, @@ -1038,7 +1017,6 @@ def _real_extract(self, url, new_video=True): # Extract title video_title = config["video"]["title"] - simple_title = simplify_title(video_title) # Extract uploader video_uploader = config["video"]["owner"]["name"] @@ -1084,7 +1062,6 @@ def _real_extract(self, url, new_video=True): 'uploader': video_uploader, 'upload_date': video_upload_date, 'title': video_title, - 'stitle': simple_title, 'ext': video_extension, 'thumbnail': video_thumbnail, 'description': video_description, @@ -1219,8 +1196,6 @@ def _real_extract(self, url): self._downloader.trouble(u'ERROR: unable to extract title') return video_title = mobj.group(1).decode('utf-8') - video_title = sanitize_title(video_title) - simple_title = simplify_title(video_title) # video uploader is domain name mobj = re.match(r'(?:https?://)?([^/]*)/.*', url) @@ -1235,7 +1210,6 @@ def _real_extract(self, url): 'uploader': video_uploader, 'upload_date': u'NA', 'title': video_title, - 'stitle': simple_title, 'ext': video_extension.decode('utf-8'), 'format': u'NA', 'player_url': None, @@ -1700,7 +1674,6 @@ def _real_extract(self, url): 'uploader': u'NA', 'upload_date': u'NA', 'title': file_title, - 'stitle': file_title, 'ext': file_extension.decode('utf-8'), 'format': u'NA', 'player_url': None, @@ -1845,9 +1818,6 @@ def _real_extract(self, url): return video_title = video_info['title'] video_title = video_title.decode('utf-8') - video_title = sanitize_title(video_title) - - simple_title = simplify_title(video_title) # thumbnail image if 'thumbnail' not in video_info: @@ -1908,7 +1878,6 @@ def _real_extract(self, url): 'uploader': video_uploader.decode('utf-8'), 'upload_date': upload_date, 'title': video_title, - 'stitle': simple_title, 'ext': video_extension.decode('utf-8'), 'format': (format_param is None and u'NA' or format_param.decode('utf-8')), 'thumbnail': video_thumbnail.decode('utf-8'), @@ -1958,7 +1927,6 @@ def _real_extract(self, url): 'id': title, 'url': url, 'title': title, - 'stitle': simplify_title(title), 'ext': ext, 'urlhandle': urlh } @@ -1992,7 +1960,6 @@ def _real_extract(self, url): 'uploader': data['display_name'], 'upload_date': upload_date, 'title': data['title'], - 'stitle': simplify_title(data['title']), 'ext': ext, 'format': data['media']['mimeType'], 'thumbnail': data['thumbnailUrl'], @@ -2054,9 +2021,6 @@ def _real_extract(self,url): return video_title = mobj.group(1) - video_title = sanitize_title(video_title) - - simple_title = simplify_title(video_title) return [{ 'id': video_id, @@ -2064,7 +2028,6 @@ def _real_extract(self,url): 'uploader': u'NA', 'upload_date': u'NA', 'title': video_title, - 'stitle': simple_title, 'ext': u'flv', 'format': u'NA', 'player_url': None, @@ -2191,7 +2154,6 @@ def _real_extract(self, url): 'uploader': showId, 'upload_date': officialDate, 'title': effTitle, - 'stitle': simplify_title(effTitle), 'ext': 'mp4', 'format': format, 'thumbnail': None, @@ -2265,7 +2227,6 @@ def _real_extract(self, url): 'uploader': showName, 'upload_date': None, 'title': showName, - 'stitle': simplify_title(showName), 'ext': 'flv', 'format': 'flv', 'thumbnail': imgUrl, @@ -2329,7 +2290,6 @@ def _real_extract(self, url): videoNode = mdoc.findall('./video')[0] info['description'] = videoNode.findall('./description')[0].text info['title'] = videoNode.findall('./caption')[0].text - info['stitle'] = simplify_title(info['title']) info['url'] = videoNode.findall('./file')[0].text info['thumbnail'] = videoNode.findall('./thumbnail')[0].text info['ext'] = info['url'].rpartition('.')[2] @@ -2403,7 +2363,6 @@ def _real_extract(self, url): 'uploader': None, 'upload_date': None, 'title': video_title, - 'stitle': simplify_title(video_title), 'ext': 'flv', 'format': 'flv', 'thumbnail': video_thumbnail, @@ -2447,7 +2406,7 @@ def _real_extract(self, url): uploader = mobj.group(1).decode('utf-8') # extract simple title (uploader + slug of song title) slug_title = mobj.group(2).decode('utf-8') - simple_title = uploader + '-' + slug_title + simple_title = uploader + u'-' + slug_title self.report_webpage('%s/%s' % (uploader, slug_title)) @@ -2469,7 +2428,9 @@ def _real_extract(self, url): # extract unsimplified title mobj = re.search('"title":"(.*?)",', webpage) if mobj: - title = mobj.group(1) + title = mobj.group(1).decode('utf-8') + else: + title = simple_title # construct media url (with uid/token) mediaURL = "http://media.soundcloud.com/stream/%s?stream_token=%s" @@ -2498,8 +2459,7 @@ def _real_extract(self, url): 'url': mediaURL, 'uploader': uploader.decode('utf-8'), 'upload_date': upload_date, - 'title': simple_title.decode('utf-8'), - 'stitle': simple_title.decode('utf-8'), + 'title': title, 'ext': u'mp3', 'format': u'NA', 'player_url': None, @@ -2569,7 +2529,6 @@ def _real_extract(self, url): 'uploader': None, 'upload_date': None, 'title': video_title, - 'stitle': simplify_title(video_title), 'ext': extension, 'format': extension, # Extension is always(?) mp4, but seems to be flv 'thumbnail': None, @@ -2685,7 +2644,6 @@ def _real_extract(self, url): 'uploader': uploader.decode('utf-8'), 'upload_date': u'NA', 'title': json_data['name'], - 'stitle': simplify_title(json_data['name']), 'ext': file_url.split('.')[-1].decode('utf-8'), 'format': (format_param is None and u'NA' or format_param.decode('utf-8')), 'thumbnail': json_data['thumbnail_url'], @@ -2717,7 +2675,7 @@ def _real_extract(self, url): course = mobj.group('course') video = mobj.group('video') info = { - 'id': simplify_title(course + '_' + video), + 'id': course + '_' + video, } self.report_extraction(info['id']) @@ -2735,14 +2693,13 @@ def _real_extract(self, url): except IndexError: self._downloader.trouble(u'\nERROR: Invalid metadata XML file') return - info['stitle'] = simplify_title(info['title']) info['ext'] = info['url'].rpartition('.')[2] info['format'] = info['ext'] return [info] elif mobj.group('course'): # A course page course = mobj.group('course') info = { - 'id': simplify_title(course), + 'id': course, 'type': 'playlist', } @@ -2758,7 +2715,6 @@ def _real_extract(self, url): info['title'] = unescapeHTML(m.group(1)) else: info['title'] = info['id'] - info['stitle'] = simplify_title(info['title']) m = re.search('([^<]+)', coursepage) if m: @@ -2792,7 +2748,6 @@ def _real_extract(self, url): return info['title'] = info['id'] - info['stitle'] = simplify_title(info['title']) links = orderedSet(re.findall('', rootpage)) info['list'] = [ @@ -2891,7 +2846,6 @@ def _real_extract(self, url): 'url': video_url, 'uploader': performer, 'title': video_title, - 'stitle': simplify_title(video_title), 'ext': ext, 'format': format, } diff --git a/youtube_dl/utils.py b/youtube_dl/utils.py index d18073d728..ae30da53e3 100644 --- a/youtube_dl/utils.py +++ b/youtube_dl/utils.py @@ -156,12 +156,6 @@ def clean_html(html): return html -def sanitize_title(utitle): - """Sanitizes a video title so it could be used as part of a filename.""" - utitle = unescapeHTML(utitle) - return utitle.replace(unicode(os.sep), u'%') - - def sanitize_open(filename, open_mode): """Try to open the given filename, and slightly tweak it if this fails. @@ -196,10 +190,14 @@ def timeconvert(timestr): if timetuple is not None: timestamp = email.utils.mktime_tz(timetuple) return timestamp - -def simplify_title(title): - expr = re.compile(ur'[^\w\d_\-]+', flags=re.UNICODE) - return expr.sub(u'_', title).strip(u'_') + +def sanitize_filename(s): + """Sanitizes a string so it could be used as part of a filename.""" + def replace_insane(char): + if char in u' .\\/|?*<>:"' or ord(char) < 32: + return '_' + return char + return u''.join(map(replace_insane, s)).strip('_') def orderedSet(iterable): """ Remove all duplicates from the input iterable """