浏览代码

Add new --default-search option (#2193)

Philipp Hagemeister 11 年之前
父节点
当前提交
04b4d394d9
共有 3 个文件被更改,包括 21 次插入3 次删除
  1. 2 0
      youtube_dl/YoutubeDL.py
  2. 6 1
      youtube_dl/__init__.py
  3. 13 2
      youtube_dl/extractor/generic.py

+ 2 - 0
youtube_dl/YoutubeDL.py

@@ -152,6 +152,8 @@ class YoutubeDL(object):
                        support, using fridibi
                        support, using fridibi
     debug_printtraffic:Print out sent and received HTTP traffic
     debug_printtraffic:Print out sent and received HTTP traffic
     include_ads:       Download ads as well
     include_ads:       Download ads as well
+    default_search:    Prepend this string if an input url is not valid.
+                       'auto' for elaborate guessing
 
 
     The following parameters are not used by YoutubeDL itself, they are used by
     The following parameters are not used by YoutubeDL itself, they are used by
     the FileDownloader:
     the FileDownloader:

+ 6 - 1
youtube_dl/__init__.py

@@ -199,7 +199,9 @@ def parseOpts(overrideArguments=None):
     general.add_option(
     general.add_option(
         '--bidi-workaround', dest='bidi_workaround', action='store_true',
         '--bidi-workaround', dest='bidi_workaround', action='store_true',
         help=u'Work around terminals that lack bidirectional text support. Requires bidiv or fribidi executable in PATH')
         help=u'Work around terminals that lack bidirectional text support. Requires bidiv or fribidi executable in PATH')
-
+    general.add_option('--default-search',
+            dest='default_search', metavar='PREFIX',
+            help='Use this prefix for unqualified URLs. For example "gvsearch2:" downloads two videos from google videos for  youtube-dl "large apple". By default (with value "auto") youtube-dl guesses.')
 
 
     selection.add_option(
     selection.add_option(
         '--playlist-start',
         '--playlist-start',
@@ -619,6 +621,8 @@ def _real_main(argv=None):
         date = DateRange.day(opts.date)
         date = DateRange.day(opts.date)
     else:
     else:
         date = DateRange(opts.dateafter, opts.datebefore)
         date = DateRange(opts.dateafter, opts.datebefore)
+    if opts.default_search not in ('auto', None) and ':' not in opts.default_search:
+        parser.error(u'--default-search invalid; did you forget a colon (:) at the end?')
 
 
     # --all-sub automatically sets --write-sub if --write-auto-sub is not given
     # --all-sub automatically sets --write-sub if --write-auto-sub is not given
     # this was the old behaviour if only --all-sub was given.
     # this was the old behaviour if only --all-sub was given.
@@ -720,6 +724,7 @@ def _real_main(argv=None):
         'debug_printtraffic': opts.debug_printtraffic,
         'debug_printtraffic': opts.debug_printtraffic,
         'prefer_ffmpeg': opts.prefer_ffmpeg,
         'prefer_ffmpeg': opts.prefer_ffmpeg,
         'include_ads': opts.include_ads,
         'include_ads': opts.include_ads,
+        'default_search': opts.default_search,
     }
     }
 
 
     with YoutubeDL(ydl_opts) as ydl:
     with YoutubeDL(ydl_opts) as ydl:

+ 13 - 2
youtube_dl/extractor/generic.py

@@ -162,8 +162,19 @@ class GenericIE(InfoExtractor):
     def _real_extract(self, url):
     def _real_extract(self, url):
         parsed_url = compat_urlparse.urlparse(url)
         parsed_url = compat_urlparse.urlparse(url)
         if not parsed_url.scheme:
         if not parsed_url.scheme:
-            self._downloader.report_warning('The url doesn\'t specify the protocol, trying with http')
-            return self.url_result('http://' + url)
+            default_search = self._downloader.params.get('default_search')
+            if default_search is None:
+                default_search = 'auto'
+
+            if default_search == 'auto':
+                if '/' in url:
+                    self._downloader.report_warning('The url doesn\'t specify the protocol, trying with http')
+                    return self.url_result('http://' + url)
+                else:
+                    return self.url_result('ytsearch:' + url)
+            else:
+                assert ':' in default_search
+                return self.url_result(default_search + url)
         video_id = os.path.splitext(url.split('/')[-1])[0]
         video_id = os.path.splitext(url.split('/')[-1])[0]
 
 
         self.to_screen('%s: Requesting header' % video_id)
         self.to_screen('%s: Requesting header' % video_id)