Simplify simplify_title
authorPhilipp Hagemeister <phihag@phihag.de>
Mon, 21 Nov 2011 19:15:32 +0000 (20:15 +0100)
committerPhilipp Hagemeister <phihag@phihag.de>
Mon, 21 Nov 2011 19:17:07 +0000 (20:17 +0100)
test/test_div.py
youtube-dl
youtube_dl/__init__.py

index 367780ed3a9e391e0838b46a1043d5693f869dda..4525c8be6abc6e884c5d1ba4f1d5614d3c7b6375 100644 (file)
@@ -8,14 +8,21 @@ sys.path.append(os.path.dirname(os.path.dirname(__file__)))
 import youtube_dl
 
 def test_simplify_title():
-       assert youtube_dl._simplify_title('abc') == 'abc'
-       assert youtube_dl._simplify_title('abc_d-e') == 'abc_d-e'
+       assert youtube_dl._simplify_title(u'abc') == u'abc'
+       assert youtube_dl._simplify_title(u'abc_d-e') == u'abc_d-e'
 
-       assert '/' not in youtube_dl._simplify_title('abc/de')
-       assert 'abc' in youtube_dl._simplify_title('abc/de')
-       assert 'de' in youtube_dl._simplify_title('abc/de')
+       assert youtube_dl._simplify_title(u'123') == u'123'
 
-       assert '\\' not in youtube_dl._simplify_title('abc\\de')
-       assert 'abc' in youtube_dl._simplify_title('abc\\de')
-       assert 'de' in youtube_dl._simplify_title('abc\\de')
+       assert u'/' not in youtube_dl._simplify_title(u'abc/de')
+       assert u'abc' in youtube_dl._simplify_title(u'abc/de')
+       assert u'de' in youtube_dl._simplify_title(u'abc/de')
 
+       assert u'\\' not in youtube_dl._simplify_title(u'abc\\de')
+       assert u'abc' in youtube_dl._simplify_title(u'abc\\de')
+       assert u'de' in youtube_dl._simplify_title(u'abc\\de')
+
+       # TODO: Fix #220
+       #assert youtube_dl._simplify_title(u'ä') == u'ä'
+
+       # Strip underlines
+       assert youtube_dl._simplify_title(u'\'a_') == u'a'
index 8fc320cbf73890aff89de3a9f93aaa823007335e..d4eadc9059d36a2f396bc207cfb13826eb4f15b4 100755 (executable)
@@ -79,8 +79,6 @@ std_headers = {
        'Accept-Language': 'en-us,en;q=0.5',
 }
 
-simple_title_chars = string.ascii_letters.decode('ascii') + string.digits.decode('ascii')
-
 try:
        import json
 except ImportError: # Python <2.6, use trivialjson (https://github.com/phihag/trivialjson):
@@ -280,7 +278,7 @@ def timeconvert(timestr):
        return timestamp
 
 def _simplify_title(title):
-       return re.sub(ur'[^\w\d_\-]+', u'_', title)
+       return re.sub(ur'[^\w\d_\-]+', u'_', title).strip(u'_')
 
 class DownloadError(Exception):
        """Download Error exception.
@@ -1293,8 +1291,7 @@ class YoutubeIE(InfoExtractor):
                video_title = sanitize_title(video_title)
 
                # simplified title
-               simple_title = re.sub(ur'(?u)([^%s]+)' % simple_title_chars, ur'_', video_title)
-               simple_title = simple_title.strip(ur'_')
+               simple_title = _simplify_title(video_title)
 
                # thumbnail image
                if 'thumbnail_url' not in video_info:
@@ -1695,7 +1692,7 @@ class GoogleIE(InfoExtractor):
                        return
                video_title = mobj.group(1).decode('utf-8')
                video_title = sanitize_title(video_title)
-               simple_title = re.sub(ur'(?u)([^%s]+)' % simple_title_chars, ur'_', video_title)
+               simple_title = _simplify_title(video_title)
 
                # Extract video description
                mobj = re.search(r'<span id=short-desc-content>([^<]*)</span>', webpage)
@@ -1794,7 +1791,7 @@ class PhotobucketIE(InfoExtractor):
                        return
                video_title = mobj.group(1).decode('utf-8')
                video_title = sanitize_title(video_title)
-               simple_title = re.sub(ur'(?u)([^%s]+)' % simple_title_chars, ur'_', video_title)
+               simple_title = _simplify_title(vide_title)
 
                video_uploader = mobj.group(2).decode('utf-8')
 
@@ -1888,7 +1885,7 @@ class YahooIE(InfoExtractor):
                        self._downloader.trouble(u'ERROR: unable to extract video title')
                        return
                video_title = mobj.group(1).decode('utf-8')
-               simple_title = re.sub(ur'(?u)([^%s]+)' % simple_title_chars, ur'_', video_title)
+               simple_title = _simplify_title(video_title)
 
                mobj = re.search(r'<h2 class="ti-5"><a href="http://video\.yahoo\.com/(people|profile)/[0-9]+" beacon=".*">(.*)</a></h2>', webpage)
                if mobj is None:
@@ -2016,7 +2013,7 @@ class VimeoIE(InfoExtractor):
                        self._downloader.trouble(u'ERROR: unable to extract video title')
                        return
                video_title = mobj.group(1).decode('utf-8')
-               simple_title = re.sub(ur'(?u)([^%s]+)' % simple_title_chars, ur'_', video_title)
+               simple_title = _simple_title(video_title)
 
                # Extract uploader
                mobj = re.search(r'<uploader_url>http://vimeo.com/(.*?)</uploader_url>', webpage)
@@ -2160,7 +2157,7 @@ class GenericIE(InfoExtractor):
                        return
                video_title = mobj.group(1).decode('utf-8')
                video_title = sanitize_title(video_title)
-               simple_title = re.sub(ur'(?u)([^%s]+)' % simple_title_chars, ur'_', video_title)
+               simple_title = _simplify_title(video_title)
 
                # video uploader is domain name
                mobj = re.match(r'(?:https?://)?([^/]*)/.*', url)
@@ -2830,9 +2827,7 @@ class FacebookIE(InfoExtractor):
                video_title = video_title.decode('utf-8')
                video_title = sanitize_title(video_title)
 
-               # simplified title
-               simple_title = re.sub(ur'(?u)([^%s]+)' % simple_title_chars, ur'_', video_title)
-               simple_title = simple_title.strip(ur'_')
+               simple_title = _simplify_title(video_title)
 
                # thumbnail image
                if 'thumbnail' not in video_info:
@@ -2923,11 +2918,6 @@ class BlipTVIE(InfoExtractor):
                """Report information extraction."""
                self._downloader.to_screen(u'[%s] %s: Direct download detected' % (self.IE_NAME, title))
 
-       def _simplify_title(self, title):
-               res = re.sub(ur'(?u)([^%s]+)' % simple_title_chars, ur'_', title)
-               res = res.strip(ur'_')
-               return res
-
        def _real_extract(self, url):
                mobj = re.match(self._VALID_URL, url)
                if mobj is None:
@@ -2953,7 +2943,7 @@ class BlipTVIE(InfoExtractor):
                                        'id': title,
                                        'url': url,
                                        'title': title,
-                                       'stitle': self._simplify_title(title),
+                                       'stitle': _simplify_title(title),
                                        'ext': ext,
                                        'urlhandle': urlh
                                }
@@ -2987,7 +2977,7 @@ class BlipTVIE(InfoExtractor):
                                        'uploader': data['display_name'],
                                        'upload_date': upload_date,
                                        'title': data['title'],
-                                       'stitle': self._simplify_title(data['title']),
+                                       'stitle': _simplify_title(data['title']),
                                        'ext': ext,
                                        'format': data['media']['mimeType'],
                                        'thumbnail': data['thumbnailUrl'],
@@ -3030,10 +3020,6 @@ class MyVideoIE(InfoExtractor):
                        return
 
                video_id = mobj.group(1)
-               simple_title = mobj.group(2).decode('utf-8')
-               # should actually not be necessary
-               simple_title = sanitize_title(simple_title)
-               simple_title = re.sub(ur'(?u)([^%s]+)' % simple_title_chars, ur'_', simple_title)
 
                # Get video webpage
                request = urllib2.Request('http://www.myvideo.de/watch/%s' % video_id)
@@ -3060,6 +3046,8 @@ class MyVideoIE(InfoExtractor):
                video_title = mobj.group(1)
                video_title = sanitize_title(video_title)
 
+               simple_title = _simplify_title(video_title)
+
                try:
                        self._downloader.process_info({
                                'id':           video_id,
@@ -3093,11 +3081,6 @@ class ComedyCentralIE(InfoExtractor):
        def report_player_url(self, episode_id):
                self._downloader.to_screen(u'[comedycentral] %s: Determining player URL' % episode_id)
 
-       def _simplify_title(self, title):
-               res = re.sub(ur'(?u)([^%s]+)' % simple_title_chars, ur'_', title)
-               res = res.strip(ur'_')
-               return res
-
        def _real_extract(self, url):
                mobj = re.match(self._VALID_URL, url)
                if mobj is None:
@@ -3228,11 +3211,6 @@ class EscapistIE(InfoExtractor):
        def report_config_download(self, showName):
                self._downloader.to_screen(u'[escapist] %s: Downloading configuration' % showName)
 
-       def _simplify_title(self, title):
-               res = re.sub(ur'(?u)([^%s]+)' % simple_title_chars, ur'_', title)
-               res = res.strip(ur'_')
-               return res
-
        def _real_extract(self, url):
                htmlParser = HTMLParser.HTMLParser()
 
@@ -3285,7 +3263,7 @@ class EscapistIE(InfoExtractor):
                        'uploader': showName,
                        'upload_date': None,
                        'title': showName,
-                       'stitle': self._simplify_title(showName),
+                       'stitle': _simplify_title(showName),
                        'ext': 'flv',
                        'format': 'flv',
                        'thumbnail': imgUrl,
@@ -3313,11 +3291,6 @@ class CollegeHumorIE(InfoExtractor):
                """Report information extraction."""
                self._downloader.to_screen(u'[%s] %s: Extracting information' % (self.IE_NAME, video_id))
 
-       def _simplify_title(self, title):
-               res = re.sub(ur'(?u)([^%s]+)' % simple_title_chars, ur'_', title)
-               res = res.strip(ur'_')
-               return res
-
        def _real_extract(self, url):
                htmlParser = HTMLParser.HTMLParser()
 
@@ -3359,7 +3332,7 @@ class CollegeHumorIE(InfoExtractor):
                        videoNode = mdoc.findall('./video')[0]
                        info['description'] = videoNode.findall('./description')[0].text
                        info['title'] = videoNode.findall('./caption')[0].text
-                       info['stitle'] = self._simplify_title(info['title'])
+                       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]
@@ -3390,11 +3363,6 @@ class XVideosIE(InfoExtractor):
                """Report information extraction."""
                self._downloader.to_screen(u'[%s] %s: Extracting information' % (self.IE_NAME, video_id))
 
-       def _simplify_title(self, title):
-               res = re.sub(ur'(?u)([^%s]+)' % simple_title_chars, ur'_', title)
-               res = res.strip(ur'_')
-               return res
-
        def _real_extract(self, url):
                htmlParser = HTMLParser.HTMLParser()
 
@@ -3448,7 +3416,7 @@ class XVideosIE(InfoExtractor):
                        'uploader': None,
                        'upload_date': None,
                        'title': video_title,
-                       'stitle': self._simplify_title(video_title),
+                       'stitle': _simplify_title(video_title),
                        'ext': 'flv',
                        'format': 'flv',
                        'thumbnail': video_thumbnail,
@@ -3574,11 +3542,6 @@ class InfoQIE(InfoExtractor):
                """Report information extraction."""
                self._downloader.to_screen(u'[%s] %s: Extracting information' % (self.IE_NAME, video_id))
 
-       def _simplify_title(self, title):
-               res = re.sub(ur'(?u)([^%s]+)' % simple_title_chars, ur'_', title)
-               res = res.strip(ur'_')
-               return res
-
        def _real_extract(self, url):
                htmlParser = HTMLParser.HTMLParser()
 
@@ -3630,7 +3593,7 @@ class InfoQIE(InfoExtractor):
                        'uploader': None,
                        'upload_date': None,
                        'title': video_title,
-                       'stitle': self._simplify_title(video_title),
+                       'stitle': _simplify_title(video_title),
                        'ext': extension,
                        'format': extension, # Extension is always(?) mp4, but seems to be flv
                        'thumbnail': None,
index 8fc320cbf73890aff89de3a9f93aaa823007335e..d4eadc9059d36a2f396bc207cfb13826eb4f15b4 100755 (executable)
@@ -79,8 +79,6 @@ std_headers = {
        'Accept-Language': 'en-us,en;q=0.5',
 }
 
-simple_title_chars = string.ascii_letters.decode('ascii') + string.digits.decode('ascii')
-
 try:
        import json
 except ImportError: # Python <2.6, use trivialjson (https://github.com/phihag/trivialjson):
@@ -280,7 +278,7 @@ def timeconvert(timestr):
        return timestamp
 
 def _simplify_title(title):
-       return re.sub(ur'[^\w\d_\-]+', u'_', title)
+       return re.sub(ur'[^\w\d_\-]+', u'_', title).strip(u'_')
 
 class DownloadError(Exception):
        """Download Error exception.
@@ -1293,8 +1291,7 @@ class YoutubeIE(InfoExtractor):
                video_title = sanitize_title(video_title)
 
                # simplified title
-               simple_title = re.sub(ur'(?u)([^%s]+)' % simple_title_chars, ur'_', video_title)
-               simple_title = simple_title.strip(ur'_')
+               simple_title = _simplify_title(video_title)
 
                # thumbnail image
                if 'thumbnail_url' not in video_info:
@@ -1695,7 +1692,7 @@ class GoogleIE(InfoExtractor):
                        return
                video_title = mobj.group(1).decode('utf-8')
                video_title = sanitize_title(video_title)
-               simple_title = re.sub(ur'(?u)([^%s]+)' % simple_title_chars, ur'_', video_title)
+               simple_title = _simplify_title(video_title)
 
                # Extract video description
                mobj = re.search(r'<span id=short-desc-content>([^<]*)</span>', webpage)
@@ -1794,7 +1791,7 @@ class PhotobucketIE(InfoExtractor):
                        return
                video_title = mobj.group(1).decode('utf-8')
                video_title = sanitize_title(video_title)
-               simple_title = re.sub(ur'(?u)([^%s]+)' % simple_title_chars, ur'_', video_title)
+               simple_title = _simplify_title(vide_title)
 
                video_uploader = mobj.group(2).decode('utf-8')
 
@@ -1888,7 +1885,7 @@ class YahooIE(InfoExtractor):
                        self._downloader.trouble(u'ERROR: unable to extract video title')
                        return
                video_title = mobj.group(1).decode('utf-8')
-               simple_title = re.sub(ur'(?u)([^%s]+)' % simple_title_chars, ur'_', video_title)
+               simple_title = _simplify_title(video_title)
 
                mobj = re.search(r'<h2 class="ti-5"><a href="http://video\.yahoo\.com/(people|profile)/[0-9]+" beacon=".*">(.*)</a></h2>', webpage)
                if mobj is None:
@@ -2016,7 +2013,7 @@ class VimeoIE(InfoExtractor):
                        self._downloader.trouble(u'ERROR: unable to extract video title')
                        return
                video_title = mobj.group(1).decode('utf-8')
-               simple_title = re.sub(ur'(?u)([^%s]+)' % simple_title_chars, ur'_', video_title)
+               simple_title = _simple_title(video_title)
 
                # Extract uploader
                mobj = re.search(r'<uploader_url>http://vimeo.com/(.*?)</uploader_url>', webpage)
@@ -2160,7 +2157,7 @@ class GenericIE(InfoExtractor):
                        return
                video_title = mobj.group(1).decode('utf-8')
                video_title = sanitize_title(video_title)
-               simple_title = re.sub(ur'(?u)([^%s]+)' % simple_title_chars, ur'_', video_title)
+               simple_title = _simplify_title(video_title)
 
                # video uploader is domain name
                mobj = re.match(r'(?:https?://)?([^/]*)/.*', url)
@@ -2830,9 +2827,7 @@ class FacebookIE(InfoExtractor):
                video_title = video_title.decode('utf-8')
                video_title = sanitize_title(video_title)
 
-               # simplified title
-               simple_title = re.sub(ur'(?u)([^%s]+)' % simple_title_chars, ur'_', video_title)
-               simple_title = simple_title.strip(ur'_')
+               simple_title = _simplify_title(video_title)
 
                # thumbnail image
                if 'thumbnail' not in video_info:
@@ -2923,11 +2918,6 @@ class BlipTVIE(InfoExtractor):
                """Report information extraction."""
                self._downloader.to_screen(u'[%s] %s: Direct download detected' % (self.IE_NAME, title))
 
-       def _simplify_title(self, title):
-               res = re.sub(ur'(?u)([^%s]+)' % simple_title_chars, ur'_', title)
-               res = res.strip(ur'_')
-               return res
-
        def _real_extract(self, url):
                mobj = re.match(self._VALID_URL, url)
                if mobj is None:
@@ -2953,7 +2943,7 @@ class BlipTVIE(InfoExtractor):
                                        'id': title,
                                        'url': url,
                                        'title': title,
-                                       'stitle': self._simplify_title(title),
+                                       'stitle': _simplify_title(title),
                                        'ext': ext,
                                        'urlhandle': urlh
                                }
@@ -2987,7 +2977,7 @@ class BlipTVIE(InfoExtractor):
                                        'uploader': data['display_name'],
                                        'upload_date': upload_date,
                                        'title': data['title'],
-                                       'stitle': self._simplify_title(data['title']),
+                                       'stitle': _simplify_title(data['title']),
                                        'ext': ext,
                                        'format': data['media']['mimeType'],
                                        'thumbnail': data['thumbnailUrl'],
@@ -3030,10 +3020,6 @@ class MyVideoIE(InfoExtractor):
                        return
 
                video_id = mobj.group(1)
-               simple_title = mobj.group(2).decode('utf-8')
-               # should actually not be necessary
-               simple_title = sanitize_title(simple_title)
-               simple_title = re.sub(ur'(?u)([^%s]+)' % simple_title_chars, ur'_', simple_title)
 
                # Get video webpage
                request = urllib2.Request('http://www.myvideo.de/watch/%s' % video_id)
@@ -3060,6 +3046,8 @@ class MyVideoIE(InfoExtractor):
                video_title = mobj.group(1)
                video_title = sanitize_title(video_title)
 
+               simple_title = _simplify_title(video_title)
+
                try:
                        self._downloader.process_info({
                                'id':           video_id,
@@ -3093,11 +3081,6 @@ class ComedyCentralIE(InfoExtractor):
        def report_player_url(self, episode_id):
                self._downloader.to_screen(u'[comedycentral] %s: Determining player URL' % episode_id)
 
-       def _simplify_title(self, title):
-               res = re.sub(ur'(?u)([^%s]+)' % simple_title_chars, ur'_', title)
-               res = res.strip(ur'_')
-               return res
-
        def _real_extract(self, url):
                mobj = re.match(self._VALID_URL, url)
                if mobj is None:
@@ -3228,11 +3211,6 @@ class EscapistIE(InfoExtractor):
        def report_config_download(self, showName):
                self._downloader.to_screen(u'[escapist] %s: Downloading configuration' % showName)
 
-       def _simplify_title(self, title):
-               res = re.sub(ur'(?u)([^%s]+)' % simple_title_chars, ur'_', title)
-               res = res.strip(ur'_')
-               return res
-
        def _real_extract(self, url):
                htmlParser = HTMLParser.HTMLParser()
 
@@ -3285,7 +3263,7 @@ class EscapistIE(InfoExtractor):
                        'uploader': showName,
                        'upload_date': None,
                        'title': showName,
-                       'stitle': self._simplify_title(showName),
+                       'stitle': _simplify_title(showName),
                        'ext': 'flv',
                        'format': 'flv',
                        'thumbnail': imgUrl,
@@ -3313,11 +3291,6 @@ class CollegeHumorIE(InfoExtractor):
                """Report information extraction."""
                self._downloader.to_screen(u'[%s] %s: Extracting information' % (self.IE_NAME, video_id))
 
-       def _simplify_title(self, title):
-               res = re.sub(ur'(?u)([^%s]+)' % simple_title_chars, ur'_', title)
-               res = res.strip(ur'_')
-               return res
-
        def _real_extract(self, url):
                htmlParser = HTMLParser.HTMLParser()
 
@@ -3359,7 +3332,7 @@ class CollegeHumorIE(InfoExtractor):
                        videoNode = mdoc.findall('./video')[0]
                        info['description'] = videoNode.findall('./description')[0].text
                        info['title'] = videoNode.findall('./caption')[0].text
-                       info['stitle'] = self._simplify_title(info['title'])
+                       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]
@@ -3390,11 +3363,6 @@ class XVideosIE(InfoExtractor):
                """Report information extraction."""
                self._downloader.to_screen(u'[%s] %s: Extracting information' % (self.IE_NAME, video_id))
 
-       def _simplify_title(self, title):
-               res = re.sub(ur'(?u)([^%s]+)' % simple_title_chars, ur'_', title)
-               res = res.strip(ur'_')
-               return res
-
        def _real_extract(self, url):
                htmlParser = HTMLParser.HTMLParser()
 
@@ -3448,7 +3416,7 @@ class XVideosIE(InfoExtractor):
                        'uploader': None,
                        'upload_date': None,
                        'title': video_title,
-                       'stitle': self._simplify_title(video_title),
+                       'stitle': _simplify_title(video_title),
                        'ext': 'flv',
                        'format': 'flv',
                        'thumbnail': video_thumbnail,
@@ -3574,11 +3542,6 @@ class InfoQIE(InfoExtractor):
                """Report information extraction."""
                self._downloader.to_screen(u'[%s] %s: Extracting information' % (self.IE_NAME, video_id))
 
-       def _simplify_title(self, title):
-               res = re.sub(ur'(?u)([^%s]+)' % simple_title_chars, ur'_', title)
-               res = res.strip(ur'_')
-               return res
-
        def _real_extract(self, url):
                htmlParser = HTMLParser.HTMLParser()
 
@@ -3630,7 +3593,7 @@ class InfoQIE(InfoExtractor):
                        'uploader': None,
                        'upload_date': None,
                        'title': video_title,
-                       'stitle': self._simplify_title(video_title),
+                       'stitle': _simplify_title(video_title),
                        'ext': extension,
                        'format': extension, # Extension is always(?) mp4, but seems to be flv
                        'thumbnail': None,