diff --git a/devscripts/buildserver.py b/devscripts/buildserver.py deleted file mode 100644 index e06f26498..000000000 --- a/devscripts/buildserver.py +++ /dev/null @@ -1,433 +0,0 @@ -#!/usr/bin/python3 - -import argparse -import ctypes -import functools -import shutil -import subprocess -import sys -import tempfile -import threading -import traceback -import os.path - -sys.path.insert(0, os.path.dirname(os.path.dirname((os.path.abspath(__file__))))) -from haruhi_dl.compat import ( - compat_input, - compat_http_server, - compat_str, - compat_urlparse, -) - -# These are not used outside of buildserver.py thus not in compat.py - -try: - import winreg as compat_winreg -except ImportError: # Python 2 - import _winreg as compat_winreg - -try: - import socketserver as compat_socketserver -except ImportError: # Python 2 - import SocketServer as compat_socketserver - - -class BuildHTTPServer(compat_socketserver.ThreadingMixIn, compat_http_server.HTTPServer): - allow_reuse_address = True - - -advapi32 = ctypes.windll.advapi32 - -SC_MANAGER_ALL_ACCESS = 0xf003f -SC_MANAGER_CREATE_SERVICE = 0x02 -SERVICE_WIN32_OWN_PROCESS = 0x10 -SERVICE_AUTO_START = 0x2 -SERVICE_ERROR_NORMAL = 0x1 -DELETE = 0x00010000 -SERVICE_STATUS_START_PENDING = 0x00000002 -SERVICE_STATUS_RUNNING = 0x00000004 -SERVICE_ACCEPT_STOP = 0x1 - -SVCNAME = 'youtubedl_builder' - -LPTSTR = ctypes.c_wchar_p -START_CALLBACK = ctypes.WINFUNCTYPE(None, ctypes.c_int, ctypes.POINTER(LPTSTR)) - - -class SERVICE_TABLE_ENTRY(ctypes.Structure): - _fields_ = [ - ('lpServiceName', LPTSTR), - ('lpServiceProc', START_CALLBACK) - ] - - -HandlerEx = ctypes.WINFUNCTYPE( - ctypes.c_int, # return - ctypes.c_int, # dwControl - ctypes.c_int, # dwEventType - ctypes.c_void_p, # lpEventData, - ctypes.c_void_p, # lpContext, -) - - -def _ctypes_array(c_type, py_array): - ar = (c_type * len(py_array))() - ar[:] = py_array - return ar - - -def win_OpenSCManager(): - res = advapi32.OpenSCManagerW(None, None, SC_MANAGER_ALL_ACCESS) - if not res: - raise Exception('Opening service manager failed - ' - 'are you running this as administrator?') - return res - - -def win_install_service(service_name, cmdline): - manager = win_OpenSCManager() - try: - h = advapi32.CreateServiceW( - manager, service_name, None, - SC_MANAGER_CREATE_SERVICE, SERVICE_WIN32_OWN_PROCESS, - SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, - cmdline, None, None, None, None, None) - if not h: - raise OSError('Service creation failed: %s' % ctypes.FormatError()) - - advapi32.CloseServiceHandle(h) - finally: - advapi32.CloseServiceHandle(manager) - - -def win_uninstall_service(service_name): - manager = win_OpenSCManager() - try: - h = advapi32.OpenServiceW(manager, service_name, DELETE) - if not h: - raise OSError('Could not find service %s: %s' % ( - service_name, ctypes.FormatError())) - - try: - if not advapi32.DeleteService(h): - raise OSError('Deletion failed: %s' % ctypes.FormatError()) - finally: - advapi32.CloseServiceHandle(h) - finally: - advapi32.CloseServiceHandle(manager) - - -def win_service_report_event(service_name, msg, is_error=True): - with open('C:/sshkeys/log', 'a', encoding='utf-8') as f: - f.write(msg + '\n') - - event_log = advapi32.RegisterEventSourceW(None, service_name) - if not event_log: - raise OSError('Could not report event: %s' % ctypes.FormatError()) - - try: - type_id = 0x0001 if is_error else 0x0004 - event_id = 0xc0000000 if is_error else 0x40000000 - lines = _ctypes_array(LPTSTR, [msg]) - - if not advapi32.ReportEventW( - event_log, type_id, 0, event_id, None, len(lines), 0, - lines, None): - raise OSError('Event reporting failed: %s' % ctypes.FormatError()) - finally: - advapi32.DeregisterEventSource(event_log) - - -def win_service_handler(stop_event, *args): - try: - raise ValueError('Handler called with args ' + repr(args)) - TODO - except Exception as e: - tb = traceback.format_exc() - msg = str(e) + '\n' + tb - win_service_report_event(service_name, msg, is_error=True) - raise - - -def win_service_set_status(handle, status_code): - svcStatus = SERVICE_STATUS() - svcStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS - svcStatus.dwCurrentState = status_code - svcStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP - - svcStatus.dwServiceSpecificExitCode = 0 - - if not advapi32.SetServiceStatus(handle, ctypes.byref(svcStatus)): - raise OSError('SetServiceStatus failed: %r' % ctypes.FormatError()) - - -def win_service_main(service_name, real_main, argc, argv_raw): - try: - # args = [argv_raw[i].value for i in range(argc)] - stop_event = threading.Event() - handler = HandlerEx(functools.partial(stop_event, win_service_handler)) - h = advapi32.RegisterServiceCtrlHandlerExW(service_name, handler, None) - if not h: - raise OSError('Handler registration failed: %s' % - ctypes.FormatError()) - - TODO - except Exception as e: - tb = traceback.format_exc() - msg = str(e) + '\n' + tb - win_service_report_event(service_name, msg, is_error=True) - raise - - -def win_service_start(service_name, real_main): - try: - cb = START_CALLBACK( - functools.partial(win_service_main, service_name, real_main)) - dispatch_table = _ctypes_array(SERVICE_TABLE_ENTRY, [ - SERVICE_TABLE_ENTRY( - service_name, - cb - ), - SERVICE_TABLE_ENTRY(None, ctypes.cast(None, START_CALLBACK)) - ]) - - if not advapi32.StartServiceCtrlDispatcherW(dispatch_table): - raise OSError('ctypes start failed: %s' % ctypes.FormatError()) - except Exception as e: - tb = traceback.format_exc() - msg = str(e) + '\n' + tb - win_service_report_event(service_name, msg, is_error=True) - raise - - -def main(args=None): - parser = argparse.ArgumentParser() - parser.add_argument('-i', '--install', - action='store_const', dest='action', const='install', - help='Launch at Windows startup') - parser.add_argument('-u', '--uninstall', - action='store_const', dest='action', const='uninstall', - help='Remove Windows service') - parser.add_argument('-s', '--service', - action='store_const', dest='action', const='service', - help='Run as a Windows service') - parser.add_argument('-b', '--bind', metavar='', - action='store', default='0.0.0.0:8142', - help='Bind to host:port (default %default)') - options = parser.parse_args(args=args) - - if options.action == 'install': - fn = os.path.abspath(__file__).replace('v:', '\\\\vboxsrv\\vbox') - cmdline = '%s %s -s -b %s' % (sys.executable, fn, options.bind) - win_install_service(SVCNAME, cmdline) - return - - if options.action == 'uninstall': - win_uninstall_service(SVCNAME) - return - - if options.action == 'service': - win_service_start(SVCNAME, main) - return - - host, port_str = options.bind.split(':') - port = int(port_str) - - print('Listening on %s:%d' % (host, port)) - srv = BuildHTTPServer((host, port), BuildHTTPRequestHandler) - thr = threading.Thread(target=srv.serve_forever) - thr.start() - compat_input('Press ENTER to shut down') - srv.shutdown() - thr.join() - - -def rmtree(path): - for name in os.listdir(path): - fname = os.path.join(path, name) - if os.path.isdir(fname): - rmtree(fname) - else: - os.chmod(fname, 0o666) - os.remove(fname) - os.rmdir(path) - - -class BuildError(Exception): - def __init__(self, output, code=500): - self.output = output - self.code = code - - def __str__(self): - return self.output - - -class HTTPError(BuildError): - pass - - -class PythonBuilder(object): - def __init__(self, **kwargs): - python_version = kwargs.pop('python', '3.4') - python_path = None - for node in ('Wow6432Node\\', ''): - try: - key = compat_winreg.OpenKey( - compat_winreg.HKEY_LOCAL_MACHINE, - r'SOFTWARE\%sPython\PythonCore\%s\InstallPath' % (node, python_version)) - try: - python_path, _ = compat_winreg.QueryValueEx(key, '') - finally: - compat_winreg.CloseKey(key) - break - except Exception: - pass - - if not python_path: - raise BuildError('No such Python version: %s' % python_version) - - self.pythonPath = python_path - - super(PythonBuilder, self).__init__(**kwargs) - - -class GITInfoBuilder(object): - def __init__(self, **kwargs): - try: - self.user, self.repoName = kwargs['path'][:2] - self.rev = kwargs.pop('rev') - except ValueError: - raise BuildError('Invalid path') - except KeyError as e: - raise BuildError('Missing mandatory parameter "%s"' % e.args[0]) - - path = os.path.join(os.environ['APPDATA'], 'Build archive', self.repoName, self.user) - if not os.path.exists(path): - os.makedirs(path) - self.basePath = tempfile.mkdtemp(dir=path) - self.buildPath = os.path.join(self.basePath, 'build') - - super(GITInfoBuilder, self).__init__(**kwargs) - - -class GITBuilder(GITInfoBuilder): - def build(self): - try: - subprocess.check_output(['git', 'clone', 'git://github.com/%s/%s.git' % (self.user, self.repoName), self.buildPath]) - subprocess.check_output(['git', 'checkout', self.rev], cwd=self.buildPath) - except subprocess.CalledProcessError as e: - raise BuildError(e.output) - - super(GITBuilder, self).build() - - -class HaruhiDLBuilder(object): - authorizedUsers = ['fraca7', 'phihag', 'rg3', 'FiloSottile', 'ytdl-org'] - - def __init__(self, **kwargs): - if self.repoName != 'haruhi-dl': - raise BuildError('Invalid repository "%s"' % self.repoName) - if self.user not in self.authorizedUsers: - raise HTTPError('Unauthorized user "%s"' % self.user, 401) - - super(HaruhiDLBuilder, self).__init__(**kwargs) - - def build(self): - try: - proc = subprocess.Popen([os.path.join(self.pythonPath, 'python.exe'), 'setup.py', 'py2exe'], stdin=subprocess.PIPE, cwd=self.buildPath) - proc.wait() - #subprocess.check_output([os.path.join(self.pythonPath, 'python.exe'), 'setup.py', 'py2exe'], - # cwd=self.buildPath) - except subprocess.CalledProcessError as e: - raise BuildError(e.output) - - super(HaruhiDLBuilder, self).build() - - -class DownloadBuilder(object): - def __init__(self, **kwargs): - self.handler = kwargs.pop('handler') - self.srcPath = os.path.join(self.buildPath, *tuple(kwargs['path'][2:])) - self.srcPath = os.path.abspath(os.path.normpath(self.srcPath)) - if not self.srcPath.startswith(self.buildPath): - raise HTTPError(self.srcPath, 401) - - super(DownloadBuilder, self).__init__(**kwargs) - - def build(self): - if not os.path.exists(self.srcPath): - raise HTTPError('No such file', 404) - if os.path.isdir(self.srcPath): - raise HTTPError('Is a directory: %s' % self.srcPath, 401) - - self.handler.send_response(200) - self.handler.send_header('Content-Type', 'application/octet-stream') - self.handler.send_header('Content-Disposition', 'attachment; filename=%s' % os.path.split(self.srcPath)[-1]) - self.handler.send_header('Content-Length', str(os.stat(self.srcPath).st_size)) - self.handler.end_headers() - - with open(self.srcPath, 'rb') as src: - shutil.copyfileobj(src, self.handler.wfile) - - super(DownloadBuilder, self).build() - - -class CleanupTempDir(object): - def build(self): - try: - rmtree(self.basePath) - except Exception as e: - print('WARNING deleting "%s": %s' % (self.basePath, e)) - - super(CleanupTempDir, self).build() - - -class Null(object): - def __init__(self, **kwargs): - pass - - def start(self): - pass - - def close(self): - pass - - def build(self): - pass - - -class Builder(PythonBuilder, GITBuilder, HaruhiDLBuilder, DownloadBuilder, CleanupTempDir, Null): - pass - - -class BuildHTTPRequestHandler(compat_http_server.BaseHTTPRequestHandler): - actionDict = {'build': Builder, 'download': Builder} # They're the same, no more caching. - - def do_GET(self): - path = compat_urlparse.urlparse(self.path) - paramDict = dict([(key, value[0]) for key, value in compat_urlparse.parse_qs(path.query).items()]) - action, _, path = path.path.strip('/').partition('/') - if path: - path = path.split('/') - if action in self.actionDict: - try: - builder = self.actionDict[action](path=path, handler=self, **paramDict) - builder.start() - try: - builder.build() - finally: - builder.close() - except BuildError as e: - self.send_response(e.code) - msg = compat_str(e).encode('UTF-8') - self.send_header('Content-Type', 'text/plain; charset=UTF-8') - self.send_header('Content-Length', len(msg)) - self.end_headers() - self.wfile.write(msg) - else: - self.send_response(500, 'Unknown build method "%s"' % action) - else: - self.send_response(500, 'Malformed URL') - -if __name__ == '__main__': - main() diff --git a/devscripts/install_jython.sh b/devscripts/install_jython.sh deleted file mode 100755 index 5daa8cd32..000000000 --- a/devscripts/install_jython.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -wget https://repo1.maven.org/maven2/org/python/jython-installer/2.7.2/jython-installer-2.7.2.jar -java -jar jython-installer-2.7.2.jar -s -d "$HOME/jython" -$HOME/jython/bin/jython -m pip install nose diff --git a/devscripts/make_contributing.py b/devscripts/make_contributing.py deleted file mode 100755 index 226d1a5d6..000000000 --- a/devscripts/make_contributing.py +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env python -from __future__ import unicode_literals - -import io -import optparse -import re - - -def main(): - parser = optparse.OptionParser(usage='%prog INFILE OUTFILE') - options, args = parser.parse_args() - if len(args) != 2: - parser.error('Expected an input and an output filename') - - infile, outfile = args - - with io.open(infile, encoding='utf-8') as inf: - readme = inf.read() - - bug_text = re.search( - r'(?s)#\s*BUGS\s*[^\n]*\s*(.*?)#\s*COPYRIGHT', readme).group(1) - dev_text = re.search( - r'(?s)(#\s*DEVELOPER INSTRUCTIONS.*?)#\s*EMBEDDING YOUTUBE-DL', - readme).group(1) - - out = bug_text + dev_text - - with io.open(outfile, 'w', encoding='utf-8') as outf: - outf.write(out) - - -if __name__ == '__main__': - main() diff --git a/devscripts/make_issue_template.py b/devscripts/make_issue_template.py deleted file mode 100644 index 72b082346..000000000 --- a/devscripts/make_issue_template.py +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env python -from __future__ import unicode_literals - -import io -import optparse - - -def main(): - parser = optparse.OptionParser(usage='%prog INFILE OUTFILE') - options, args = parser.parse_args() - if len(args) != 2: - parser.error('Expected an input and an output filename') - - infile, outfile = args - - with io.open(infile, encoding='utf-8') as inf: - issue_template_tmpl = inf.read() - - # Get the version from haruhi_dl/version.py without importing the package - exec(compile(open('haruhi_dl/version.py').read(), - 'haruhi_dl/version.py', 'exec')) - - out = issue_template_tmpl % {'version': locals()['__version__']} - - with io.open(outfile, 'w', encoding='utf-8') as outf: - outf.write(out) - -if __name__ == '__main__': - main() diff --git a/devscripts/make_readme.py b/devscripts/make_readme.py deleted file mode 100755 index 827fdfd23..000000000 --- a/devscripts/make_readme.py +++ /dev/null @@ -1,26 +0,0 @@ -from __future__ import unicode_literals - -import io -import sys -import re - -README_FILE = 'README.md' -helptext = sys.stdin.read() - -if isinstance(helptext, bytes): - helptext = helptext.decode('utf-8') - -with io.open(README_FILE, encoding='utf-8') as f: - oldreadme = f.read() - -header = oldreadme[:oldreadme.index('# OPTIONS')] -footer = oldreadme[oldreadme.index('# CONFIGURATION'):] - -options = helptext[helptext.index(' General Options:') + 19:] -options = re.sub(r'(?m)^ (\w.+)$', r'## \1', options) -options = '# OPTIONS\n' + options + '\n' - -with io.open(README_FILE, 'w', encoding='utf-8') as f: - f.write(header) - f.write(options) - f.write(footer) \ No newline at end of file diff --git a/devscripts/make_supportedsites.py b/devscripts/make_supportedsites.py deleted file mode 100644 index d0ac7c1eb..000000000 --- a/devscripts/make_supportedsites.py +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/env python -from __future__ import unicode_literals - -import io -import optparse -import os -import sys - - -# Import haruhi_dl -ROOT_DIR = os.path.join(os.path.dirname(__file__), '..') -sys.path.insert(0, ROOT_DIR) -import haruhi_dl - - -def main(): - parser = optparse.OptionParser(usage='%prog OUTFILE.md') - options, args = parser.parse_args() - if len(args) != 1: - parser.error('Expected an output filename') - - outfile, = args - - def gen_ies_md(ies): - for ie in ies: - ie_md = '**{0}**'.format(ie.IE_NAME) - ie_desc = getattr(ie, 'IE_DESC', None) - if ie_desc is False: - continue - if ie_desc is not None: - ie_md += ': {0}'.format(ie.IE_DESC) - if not ie.working(): - ie_md += ' (Currently broken)' - yield ie_md - - ies = sorted(haruhi_dl.gen_extractors(), key=lambda i: i.IE_NAME.lower()) - out = '# Supported sites\n' + ''.join( - ' - ' + md + '\n' - for md in gen_ies_md(ies)) - - with io.open(outfile, 'w', encoding='utf-8') as outf: - outf.write(out) - - -if __name__ == '__main__': - main() diff --git a/docs/.gitignore b/docs/.gitignore deleted file mode 100644 index 69fa449dd..000000000 --- a/docs/.gitignore +++ /dev/null @@ -1 +0,0 @@ -_build/ diff --git a/docs/Makefile b/docs/Makefile deleted file mode 100644 index 9d83f413c..000000000 --- a/docs/Makefile +++ /dev/null @@ -1,177 +0,0 @@ -# Makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -PAPER = -BUILDDIR = _build - -# User-friendly check for sphinx-build -ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) -$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) -endif - -# Internal variables. -PAPEROPT_a4 = -D latex_paper_size=a4 -PAPEROPT_letter = -D latex_paper_size=letter -ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . -# the i18n builder cannot share the environment and doctrees with the others -I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . - -.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext - -help: - @echo "Please use \`make ' where is one of" - @echo " html to make standalone HTML files" - @echo " dirhtml to make HTML files named index.html in directories" - @echo " singlehtml to make a single large HTML file" - @echo " pickle to make pickle files" - @echo " json to make JSON files" - @echo " htmlhelp to make HTML files and a HTML help project" - @echo " qthelp to make HTML files and a qthelp project" - @echo " devhelp to make HTML files and a Devhelp project" - @echo " epub to make an epub" - @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" - @echo " latexpdf to make LaTeX files and run them through pdflatex" - @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" - @echo " text to make text files" - @echo " man to make manual pages" - @echo " texinfo to make Texinfo files" - @echo " info to make Texinfo files and run them through makeinfo" - @echo " gettext to make PO message catalogs" - @echo " changes to make an overview of all changed/added/deprecated items" - @echo " xml to make Docutils-native XML files" - @echo " pseudoxml to make pseudoxml-XML files for display purposes" - @echo " linkcheck to check all external links for integrity" - @echo " doctest to run all doctests embedded in the documentation (if enabled)" - -clean: - rm -rf $(BUILDDIR)/* - -html: - $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." - -dirhtml: - $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." - -singlehtml: - $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml - @echo - @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." - -pickle: - $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle - @echo - @echo "Build finished; now you can process the pickle files." - -json: - $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json - @echo - @echo "Build finished; now you can process the JSON files." - -htmlhelp: - $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp - @echo - @echo "Build finished; now you can run HTML Help Workshop with the" \ - ".hhp project file in $(BUILDDIR)/htmlhelp." - -qthelp: - $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp - @echo - @echo "Build finished; now you can run "qcollectiongenerator" with the" \ - ".qhcp project file in $(BUILDDIR)/qthelp, like this:" - @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/haruhi-dl.qhcp" - @echo "To view the help file:" - @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/haruhi-dl.qhc" - -devhelp: - $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp - @echo - @echo "Build finished." - @echo "To view the help file:" - @echo "# mkdir -p $$HOME/.local/share/devhelp/haruhi-dl" - @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/haruhi-dl" - @echo "# devhelp" - -epub: - $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub - @echo - @echo "Build finished. The epub file is in $(BUILDDIR)/epub." - -latex: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo - @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." - @echo "Run \`make' in that directory to run these through (pdf)latex" \ - "(use \`make latexpdf' here to do that automatically)." - -latexpdf: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo "Running LaTeX files through pdflatex..." - $(MAKE) -C $(BUILDDIR)/latex all-pdf - @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." - -latexpdfja: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo "Running LaTeX files through platex and dvipdfmx..." - $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja - @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." - -text: - $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text - @echo - @echo "Build finished. The text files are in $(BUILDDIR)/text." - -man: - $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man - @echo - @echo "Build finished. The manual pages are in $(BUILDDIR)/man." - -texinfo: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo - @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." - @echo "Run \`make' in that directory to run these through makeinfo" \ - "(use \`make info' here to do that automatically)." - -info: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo "Running Texinfo files through makeinfo..." - make -C $(BUILDDIR)/texinfo info - @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." - -gettext: - $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale - @echo - @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." - -changes: - $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes - @echo - @echo "The overview file is in $(BUILDDIR)/changes." - -linkcheck: - $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck - @echo - @echo "Link check complete; look for any errors in the above output " \ - "or in $(BUILDDIR)/linkcheck/output.txt." - -doctest: - $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest - @echo "Testing of doctests in the sources finished, look at the " \ - "results in $(BUILDDIR)/doctest/output.txt." - -xml: - $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml - @echo - @echo "Build finished. The XML files are in $(BUILDDIR)/xml." - -pseudoxml: - $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml - @echo - @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." diff --git a/docs/conf.py b/docs/conf.py deleted file mode 100644 index bdd2d7583..000000000 --- a/docs/conf.py +++ /dev/null @@ -1,71 +0,0 @@ -# coding: utf-8 -# -# haruhi-dl documentation build configuration file, created by -# sphinx-quickstart on Fri Mar 14 21:05:43 2014. -# -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -import sys -import os -# Allows to import haruhi_dl -sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) - -# -- General configuration ------------------------------------------------ - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [ - 'sphinx.ext.autodoc', -] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# The suffix of source filenames. -source_suffix = '.rst' - -# The master toctree document. -master_doc = 'index' - -# General information about the project. -project = u'haruhi-dl' -copyright = u'2014, Ricardo Garcia Gonzalez' - -# The version info for the project you're documenting, acts as replacement for -# |version| and |release|, also used in various other places throughout the -# built documents. -# -# The short X.Y version. -from haruhi_dl.version import __version__ -version = __version__ -# The full version, including alpha/beta/rc tags. -release = version - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -exclude_patterns = ['_build'] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - -# -- Options for HTML output ---------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -html_theme = 'default' - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] - -# Output file base name for HTML help builder. -htmlhelp_basename = 'haruhi-dldoc' diff --git a/docs/index.rst b/docs/index.rst deleted file mode 100644 index b81202c45..000000000 --- a/docs/index.rst +++ /dev/null @@ -1,23 +0,0 @@ -Welcome to haruhi-dl's documentation! -====================================== - -*haruhi-dl* is a command-line program to download videos from YouTube.com and more sites. -It can also be used in Python code. - -Developer guide ---------------- - -This section contains information for using *haruhi-dl* from Python programs. - -.. toctree:: - :maxdepth: 2 - - module_guide - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` - diff --git a/docs/module_guide.rst b/docs/module_guide.rst deleted file mode 100644 index 31e1d0c86..000000000 --- a/docs/module_guide.rst +++ /dev/null @@ -1,67 +0,0 @@ -Using the ``haruhi_dl`` module -=============================== - -When using the ``haruhi_dl`` module, you start by creating an instance of :class:`HaruhiDL` and adding all the available extractors: - -.. code-block:: python - - >>> from haruhi_dl import HaruhiDL - >>> hdl = HaruhiDL() - >>> hdl.add_default_info_extractors() - -Extracting video information ----------------------------- - -You use the :meth:`HaruhiDL.extract_info` method for getting the video information, which returns a dictionary: - -.. code-block:: python - - >>> info = hdl.extract_info('http://www.youtube.com/watch?v=BaW_jenozKc', download=False) - [youtube] Setting language - [youtube] BaW_jenozKc: Downloading webpage - [youtube] BaW_jenozKc: Downloading video info webpage - [youtube] BaW_jenozKc: Extracting video information - >>> info['title'] - 'haruhi-dl test video "\'/\\ä↭𝕐' - >>> info['height'], info['width'] - (720, 1280) - -If you want to download or play the video you can get its url: - -.. code-block:: python - - >>> info['url'] - 'https://...' - -Extracting playlist information -------------------------------- - -The playlist information is extracted in a similar way, but the dictionary is a bit different: - -.. code-block:: python - - >>> playlist = hdl.extract_info('http://www.ted.com/playlists/13/open_source_open_world', download=False) - [TED] open_source_open_world: Downloading playlist webpage - ... - >>> playlist['title'] - 'Open-source, open world' - - - -You can access the videos in the playlist with the ``entries`` field: - -.. code-block:: python - - >>> for video in playlist['entries']: - ... print('Video #%d: %s' % (video['playlist_index'], video['title'])) - - Video #1: How Arduino is open-sourcing imagination - Video #2: The year open data went worldwide - Video #3: Massive-scale online collaboration - Video #4: The art of asking - Video #5: How cognitive surplus will change the world - Video #6: The birth of Wikipedia - Video #7: Coding a better government - Video #8: The era of open innovation - Video #9: The currency of the new economy is trust - diff --git a/docs/supportedsites.md b/docs/supportedsites.md deleted file mode 100644 index 2ee72e321..000000000 --- a/docs/supportedsites.md +++ /dev/null @@ -1,1156 +0,0 @@ -# Supported sites - - **1tv**: Первый канал - - **1up.com** - - **20min** - - **220.ro** - - **23video** - - **24video** - - **3qsdn**: 3Q SDN - - **3sat** - - **4tube** - - **56.com** - - **5min** - - **6play** - - **7plus** - - **8tracks** - - **91porn** - - **9c9media** - - **9gag** - - **9now.com.au** - - **abc.net.au** - - **abc.net.au:iview** - - **abcnews** - - **abcnews:video** - - **abcotvs**: ABC Owned Television Stations - - **abcotvs:clips** - - **AcademicEarth:Course** - - **acast** - - **acast:channel** - - **ADN**: Anime Digital Network - - **AdobeConnect** - - **adobetv** - - **adobetv:channel** - - **adobetv:embed** - - **adobetv:show** - - **adobetv:video** - - **AdultSwim** - - **aenetworks**: A+E Networks: A&E, Lifetime, History.com, FYI Network and History Vault - - **afreecatv**: afreecatv.com - - **AirMozilla** - - **AliExpressLive** - - **AlJazeera** - - **Allocine** - - **AlphaPorno** - - **AMCNetworks** - - **AmericasTestKitchen** - - **anderetijden**: npo.nl, ntr.nl, omroepwnl.nl, zapp.nl and npo3.nl - - **AnimeOnDemand** - - **Anvato** - - **aol.com** - - **APA** - - **Aparat** - - **AppleConnect** - - **AppleDaily**: 臺灣蘋果日報 - - **appletrailers** - - **appletrailers:section** - - **archive.org**: archive.org videos - - **ARD** - - **ARD:mediathek** - - **ARDBetaMediathek** - - **Arkena** - - **arte.tv:+7** - - **arte.tv:embed** - - **arte.tv:playlist** - - **AsianCrush** - - **AsianCrushPlaylist** - - **AtresPlayer** - - **ATTTechChannel** - - **ATVAt** - - **AudiMedia** - - **AudioBoom** - - **audiomack** - - **audiomack:album** - - **AWAAN** - - **awaan:live** - - **awaan:season** - - **awaan:video** - - **AZMedien**: AZ Medien videos - - **BaiduVideo**: 百度视频 - - **Bandcamp** - - **Bandcamp:album** - - **Bandcamp:weekly** - - **bangumi.bilibili.com**: BiliBili番剧 - - **bbc**: BBC - - **bbc.co.uk**: BBC iPlayer - - **bbc.co.uk:article**: BBC articles - - **bbc.co.uk:iplayer:playlist** - - **bbc.co.uk:playlist** - - **BBVTV** - - **Beatport** - - **Beeg** - - **BehindKink** - - **Bellator** - - **BellMedia** - - **Bet** - - **bfi:player** - - **Bigflix** - - **Bild**: Bild.de - - **BiliBili** - - **BilibiliAudio** - - **BilibiliAudioAlbum** - - **BiliBiliPlayer** - - **BioBioChileTV** - - **BIQLE** - - **BitChute** - - **BitChuteChannel** - - **BleacherReport** - - **BleacherReportCMS** - - **blinkx** - - **Bloomberg** - - **BokeCC** - - **BostonGlobe** - - **Bpb**: Bundeszentrale für politische Bildung - - **BR**: Bayerischer Rundfunk - - **BravoTV** - - **Break** - - **brightcove:legacy** - - **brightcove:new** - - **BRMediathek**: Bayerischer Rundfunk Mediathek - - **bt:article**: Bergens Tidende Articles - - **bt:vestlendingen**: Bergens Tidende - Vestlendingen - - **BusinessInsider** - - **BuzzFeed** - - **BYUtv** - - **Camdemy** - - **CamdemyFolder** - - **CamModels** - - **CamTube** - - **CamWithHer** - - **canalc2.tv** - - **Canalplus**: mycanal.fr and piwiplus.fr - - **Canvas** - - **CanvasEen**: canvas.be and een.be - - **CarambaTV** - - **CarambaTVPage** - - **CartoonNetwork** - - **cbc.ca** - - **cbc.ca:olympics** - - **cbc.ca:player** - - **cbc.ca:watch** - - **cbc.ca:watch:video** - - **CBS** - - **CBSInteractive** - - **CBSLocal** - - **cbsnews**: CBS News - - **cbsnews:embed** - - **cbsnews:livevideo**: CBS News Live Videos - - **CBSSports** - - **CCMA** - - **CCTV**: 央视网 - - **CDA** - - **CeskaTelevize** - - **CeskaTelevizePorady** - - **channel9**: Channel 9 - - **CharlieRose** - - **Chaturbate** - - **Chilloutzone** - - **chirbit** - - **chirbit:profile** - - **Cinchcast** - - **Cinemax** - - **CiscoLiveSearch** - - **CiscoLiveSession** - - **CJSW** - - **cliphunter** - - **Clippit** - - **ClipRs** - - **Clipsyndicate** - - **CloserToTruth** - - **CloudflareStream** - - **Cloudy** - - **Clubic** - - **Clyp** - - **cmt.com** - - **CNBC** - - **CNBCVideo** - - **CNN** - - **CNNArticle** - - **CNNBlogs** - - **ComedyCentral** - - **ComedyCentralFullEpisodes** - - **ComedyCentralShortname** - - **ComedyCentralTV** - - **CondeNast**: Condé Nast media group: Allure, Architectural Digest, Ars Technica, Bon Appétit, Brides, Condé Nast, Condé Nast Traveler, Details, Epicurious, GQ, Glamour, Golf Digest, SELF, Teen Vogue, The New Yorker, Vanity Fair, Vogue, W Magazine, WIRED - - **CONtv** - - **Corus** - - **Coub** - - **Cracked** - - **Crackle** - - **CrooksAndLiars** - - **crunchyroll** - - **crunchyroll:playlist** - - **CSNNE** - - **CSpan**: C-SPAN - - **CtsNews**: 華視新聞 - - **CTVNews** - - **cu.ntv.co.jp**: Nippon Television Network - - **Culturebox** - - **CultureUnplugged** - - **curiositystream** - - **curiositystream:collection** - - **CWTV** - - **DailyMail** - - **dailymotion** - - **dailymotion:playlist** - - **dailymotion:user** - - **daum.net** - - **daum.net:clip** - - **daum.net:playlist** - - **daum.net:user** - - **DBTV** - - **DctpTv** - - **DeezerPlaylist** - - **defense.gouv.fr** - - **democracynow** - - **DHM**: Filmarchiv - Deutsches Historisches Museum - - **Digg** - - **DigitallySpeaking** - - **Digiteka** - - **Discovery** - - **DiscoveryGo** - - **DiscoveryGoPlaylist** - - **DiscoveryNetworksDe** - - **DiscoveryVR** - - **Disney** - - **dlive:stream** - - **dlive:vod** - - **Dotsub** - - **DouyuShow** - - **DouyuTV**: 斗鱼 - - **DPlay** - - **DRBonanza** - - **Dropbox** - - **DrTuber** - - **drtv** - - **drtv:live** - - **DTube** - - **Dumpert** - - **dvtv**: http://video.aktualne.cz/ - - **dw** - - **dw:article** - - **EaglePlatform** - - **EbaumsWorld** - - **EchoMsk** - - **egghead:course**: egghead.io course - - **egghead:lesson**: egghead.io lesson - - **ehftv** - - **eHow** - - **EinsUndEinsTV** - - **Einthusan** - - **eitb.tv** - - **EllenTube** - - **EllenTubePlaylist** - - **EllenTubeVideo** - - **ElPais**: El País - - **Embedly** - - **EMPFlix** - - **Engadget** - - **Eporner** - - **EroProfile** - - **Escapist** - - **ESPN** - - **ESPNArticle** - - **EsriVideo** - - **Europa** - - **EveryonesMixtape** - - **EWETV** - - **ExpoTV** - - **Expressen** - - **ExtremeTube** - - **EyedoTV** - - **facebook** - - **FacebookPluginsVideo** - - **faz.net** - - **fc2** - - **fc2:embed** - - **Fczenit** - - **filmon** - - **filmon:channel** - - **Filmweb** - - **FiveThirtyEight** - - **FiveTV** - - **Flickr** - - **Folketinget**: Folketinget (ft.dk; Danish parliament) - - **FootyRoom** - - **Formula1** - - **FOX** - - **FOX9** - - **FOX9News** - - **Foxgay** - - **foxnews**: Fox News and Fox Business Video - - **foxnews:article** - - **FoxSports** - - **france2.fr:generation-what** - - **FranceCulture** - - **FranceInter** - - **FranceTV** - - **FranceTVEmbed** - - **francetvinfo.fr** - - **FranceTVJeunesse** - - **FranceTVSite** - - **Freesound** - - **freespeech.org** - - **FreshLive** - - **FrontendMasters** - - **FrontendMastersCourse** - - **FrontendMastersLesson** - - **Funimation** - - **Funk** - - **Fusion** - - **Fux** - - **FXNetworks** - - **Gaia** - - **GameInformer** - - **GameSpot** - - **GameStar** - - **Gaskrank** - - **Gazeta** - - **GDCVault** - - **generic**: Generic downloader that works on some sites - - **Gfycat** - - **GiantBomb** - - **Giga** - - **GlattvisionTV** - - **Glide**: Glide mobile video messages (glide.me) - - **Globo** - - **GloboArticle** - - **Go** - - **GodTube** - - **Golem** - - **GoogleDrive** - - **Goshgay** - - **GPUTechConf** - - **Groupon** - - **hbo** - - **HearThisAt** - - **Heise** - - **HellPorno** - - **Helsinki**: helsinki.fi - - **HentaiStigma** - - **hetklokhuis** - - **hgtv.com:show** - - **HiDive** - - **HistoricFilms** - - **history:topic**: History.com Topic - - **hitbox** - - **hitbox:live** - - **HitRecord** - - **hketv**: 香港教育局教育電視 (HKETV) Educational Television, Hong Kong Educational Bureau - - **HornBunny** - - **HotNewHipHop** - - **hotstar** - - **hotstar:playlist** - - **Howcast** - - **HowStuffWorks** - - **HRTi** - - **HRTiPlaylist** - - **Huajiao**: 花椒直播 - - **HuffPost**: Huffington Post - - **Hungama** - - **HungamaSong** - - **Hypem** - - **ign.com** - - **imdb**: Internet Movie Database trailers - - **imdb:list**: Internet Movie Database lists - - **Imgur** - - **imgur:album** - - **imgur:gallery** - - **Ina** - - **Inc** - - **IndavideoEmbed** - - **InfoQ** - - **Instagram** - - **instagram:tag**: Instagram hashtag search - - **instagram:user**: Instagram user profile - - **Internazionale** - - **InternetVideoArchive** - - **IPrima** - - **iqiyi**: 爱奇艺 - - **Ir90Tv** - - **ITTF** - - **ITV** - - **ITVBTCC** - - **ivi**: ivi.ru - - **ivi:compilation**: ivi.ru compilations - - **ivideon**: Ivideon TV - - **Iwara** - - **Izlesene** - - **Jamendo** - - **JamendoAlbum** - - **JeuxVideo** - - **Joj** - - **Jove** - - **JWPlatform** - - **Kakao** - - **Kaltura** - - **KanalPlay**: Kanal 5/9/11 Play - - **Kankan** - - **Karaoketv** - - **KarriereVideos** - - **Katsomo** - - **KeezMovies** - - **Ketnet** - - **KhanAcademy** - - **KickStarter** - - **KinjaEmbed** - - **KinoPoisk** - - **KonserthusetPlay** - - **KrasView**: Красвью - - **Ku6** - - **KUSI** - - **kuwo:album**: 酷我音乐 - 专辑 - - **kuwo:category**: 酷我音乐 - 分类 - - **kuwo:chart**: 酷我音乐 - 排行榜 - - **kuwo:mv**: 酷我音乐 - MV - - **kuwo:singer**: 酷我音乐 - 歌手 - - **kuwo:song**: 酷我音乐 - - **la7.it** - - **laola1tv** - - **laola1tv:embed** - - **LCI** - - **Lcp** - - **LcpPlay** - - **Le**: 乐视网 - - **Lecture2Go** - - **Lecturio** - - **LecturioCourse** - - **LecturioDeCourse** - - **LEGO** - - **Lemonde** - - **Lenta** - - **LePlaylist** - - **LetvCloud**: 乐视云 - - **Libsyn** - - **life**: Life.ru - - **life:embed** - - **limelight** - - **limelight:channel** - - **limelight:channel_list** - - **LineTV** - - **linkedin:learning** - - **linkedin:learning:course** - - **LinuxAcademy** - - **LiTV** - - **LiveJournal** - - **LiveLeak** - - **LiveLeakEmbed** - - **livestream** - - **livestream:original** - - **LnkGo** - - **loc**: Library of Congress - - **LocalNews8** - - **LoveHomePorn** - - **lrt.lt** - - **lynda**: lynda.com videos - - **lynda:course**: lynda.com online courses - - **m6** - - **mailru**: Видео@Mail.Ru - - **mailru:music**: Музыка@Mail.Ru - - **mailru:music:search**: Музыка@Mail.Ru - - **MallTV** - - **mangomolo:live** - - **mangomolo:video** - - **ManyVids** - - **Markiza** - - **MarkizaPage** - - **massengeschmack.tv** - - **MatchTV** - - **MDR**: MDR.DE and KiKA - - **media.ccc.de** - - **media.ccc.de:lists** - - **Medialaan** - - **Mediaset** - - **Mediasite** - - **MediasiteCatalog** - - **MediasiteNamedCatalog** - - **Medici** - - **megaphone.fm**: megaphone.fm embedded players - - **Meipai**: 美拍 - - **MelonVOD** - - **META** - - **metacafe** - - **Metacritic** - - **Mgoon** - - **MGTV**: 芒果TV - - **MiaoPai** - - **MinistryGrid** - - **Minoto** - - **miomio.tv** - - **MiTele**: mitele.es - - **mixcloud** - - **mixcloud:playlist** - - **mixcloud:user** - - **Mixer:live** - - **Mixer:vod** - - **MLB** - - **Mnet** - - **MNetTV** - - **MoeVideo**: LetitBit video services: moevideo.net, playreplay.net and videochart.net - - **Mofosex** - - **MofosexEmbed** - - **Mojvideo** - - **Morningstar**: morningstar.com - - **Motherless** - - **MotherlessGroup** - - **Motorsport**: motorsport.com - - **MovieClips** - - **MovieFap** - - **Moviezine** - - **MovingImage** - - **MSN** - - **mtg**: MTG services - - **mtv** - - **mtv.de** - - **mtv:video** - - **mtvjapan** - - **mtvservices:embedded** - - **MuenchenTV**: münchen.tv - - **mva**: Microsoft Virtual Academy videos - - **mva:course**: Microsoft Virtual Academy courses - - **Mwave** - - **MwaveMeetGreet** - - **MyChannels** - - **MySpace** - - **MySpace:album** - - **MySpass** - - **Myvi** - - **MyVidster** - - **MyviEmbed** - - **MyVisionTV** - - **n-tv.de** - - **natgeo:video** - - **NationalGeographicTV** - - **Naver** - - **NBA** - - **NBC** - - **NBCNews** - - **nbcolympics** - - **nbcolympics:stream** - - **NBCSports** - - **NBCSportsStream** - - **NBCSportsVPlayer** - - **ndr**: NDR.de - Norddeutscher Rundfunk - - **ndr:embed** - - **ndr:embed:base** - - **NDTV** - - **NerdCubedFeed** - - **netease:album**: 网易云音乐 - 专辑 - - **netease:djradio**: 网易云音乐 - 电台 - - **netease:mv**: 网易云音乐 - MV - - **netease:playlist**: 网易云音乐 - 歌单 - - **netease:program**: 网易云音乐 - 电台节目 - - **netease:singer**: 网易云音乐 - 歌手 - - **netease:song**: 网易云音乐 - - **NetPlus** - - **Netzkino** - - **Newgrounds** - - **NewgroundsPlaylist** - - **Newstube** - - **NextMedia**: 蘋果日報 - - **NextMediaActionNews**: 蘋果日報 - 動新聞 - - **NextTV**: 壹電視 - - **Nexx** - - **NexxEmbed** - - **nfl.com** - - **NhkVod** - - **nhl.com** - - **nick.com** - - **nick.de** - - **nickelodeon:br** - - **nickelodeonru** - - **nicknight** - - **niconico**: ニコニコ動画 - - **NiconicoPlaylist** - - **Nintendo** - - **Nitter** - - **njoy**: N-JOY - - **njoy:embed** - - **NJPWWorld**: 新日本プロレスワールド - - **NobelPrize** - - **Noco** - - **NonkTube** - - **Noovo** - - **Normalboots** - - **NosVideo** - - **Nova**: TN.cz, Prásk.tv, Nova.cz, Novaplus.cz, FANDA.tv, Krásná.cz and Doma.cz - - **NovaEmbed** - - **nowness** - - **nowness:playlist** - - **nowness:series** - - **Noz** - - **npo**: npo.nl, ntr.nl, omroepwnl.nl, zapp.nl and npo3.nl - - **npo.nl:live** - - **npo.nl:radio** - - **npo.nl:radio:fragment** - - **Npr** - - **NRK** - - **NRKPlaylist** - - **NRKSkole**: NRK Skole - - **NRKTV**: NRK TV and NRK Radio - - **NRKTVDirekte**: NRK TV Direkte and NRK Radio Direkte - - **NRKTVEpisode** - - **NRKTVEpisodes** - - **NRKTVSeason** - - **NRKTVSeries** - - **NRLTV** - - **ntv.ru** - - **Nuvid** - - **NYTimes** - - **NYTimesArticle** - - **NZZ** - - **ocw.mit.edu** - - **OdaTV** - - **Odnoklassniki** - - **OktoberfestTV** - - **OnDemandKorea** - - **onet.pl** - - **onet.tv** - - **onet.tv:channel** - - **OnetMVP** - - **OnionStudios** - - **Ooyala** - - **OoyalaExternal** - - **OraTV** - - **orf:burgenland**: Radio Burgenland - - **orf:fm4**: radio FM4 - - **orf:fm4:story**: fm4.orf.at stories - - **orf:iptv**: iptv.ORF.at - - **orf:kaernten**: Radio Kärnten - - **orf:noe**: Radio Niederösterreich - - **orf:oberoesterreich**: Radio Oberösterreich - - **orf:oe1**: Radio Österreich 1 - - **orf:oe3**: Radio Österreich 3 - - **orf:salzburg**: Radio Salzburg - - **orf:steiermark**: Radio Steiermark - - **orf:tirol**: Radio Tirol - - **orf:tvthek**: ORF TVthek - - **orf:vorarlberg**: Radio Vorarlberg - - **orf:wien**: Radio Wien - - **OsnatelTV** - - **OutsideTV** - - **PacktPub** - - **PacktPubCourse** - - **pandora.tv**: 판도라TV - - **ParamountNetwork** - - **parliamentlive.tv**: UK parliament videos - - **Patreon** - - **pbs**: Public Broadcasting Service (PBS) and member stations: PBS: Public Broadcasting Service, APT - Alabama Public Television (WBIQ), GPB/Georgia Public Broadcasting (WGTV), Mississippi Public Broadcasting (WMPN), Nashville Public Television (WNPT), WFSU-TV (WFSU), WSRE (WSRE), WTCI (WTCI), WPBA/Channel 30 (WPBA), Alaska Public Media (KAKM), Arizona PBS (KAET), KNME-TV/Channel 5 (KNME), Vegas PBS (KLVX), AETN/ARKANSAS ETV NETWORK (KETS), KET (WKLE), WKNO/Channel 10 (WKNO), LPB/LOUISIANA PUBLIC BROADCASTING (WLPB), OETA (KETA), Ozarks Public Television (KOZK), WSIU Public Broadcasting (WSIU), KEET TV (KEET), KIXE/Channel 9 (KIXE), KPBS San Diego (KPBS), KQED (KQED), KVIE Public Television (KVIE), PBS SoCal/KOCE (KOCE), ValleyPBS (KVPT), CONNECTICUT PUBLIC TELEVISION (WEDH), KNPB Channel 5 (KNPB), SOPTV (KSYS), Rocky Mountain PBS (KRMA), KENW-TV3 (KENW), KUED Channel 7 (KUED), Wyoming PBS (KCWC), Colorado Public Television / KBDI 12 (KBDI), KBYU-TV (KBYU), Thirteen/WNET New York (WNET), WGBH/Channel 2 (WGBH), WGBY (WGBY), NJTV Public Media NJ (WNJT), WLIW21 (WLIW), mpt/Maryland Public Television (WMPB), WETA Television and Radio (WETA), WHYY (WHYY), PBS 39 (WLVT), WVPT - Your Source for PBS and More! (WVPT), Howard University Television (WHUT), WEDU PBS (WEDU), WGCU Public Media (WGCU), WPBT2 (WPBT), WUCF TV (WUCF), WUFT/Channel 5 (WUFT), WXEL/Channel 42 (WXEL), WLRN/Channel 17 (WLRN), WUSF Public Broadcasting (WUSF), ETV (WRLK), UNC-TV (WUNC), PBS Hawaii - Oceanic Cable Channel 10 (KHET), Idaho Public Television (KAID), KSPS (KSPS), OPB (KOPB), KWSU/Channel 10 & KTNW/Channel 31 (KWSU), WILL-TV (WILL), Network Knowledge - WSEC/Springfield (WSEC), WTTW11 (WTTW), Iowa Public Television/IPTV (KDIN), Nine Network (KETC), PBS39 Fort Wayne (WFWA), WFYI Indianapolis (WFYI), Milwaukee Public Television (WMVS), WNIN (WNIN), WNIT Public Television (WNIT), WPT (WPNE), WVUT/Channel 22 (WVUT), WEIU/Channel 51 (WEIU), WQPT-TV (WQPT), WYCC PBS Chicago (WYCC), WIPB-TV (WIPB), WTIU (WTIU), CET (WCET), ThinkTVNetwork (WPTD), WBGU-TV (WBGU), WGVU TV (WGVU), NET1 (KUON), Pioneer Public Television (KWCM), SDPB Television (KUSD), TPT (KTCA), KSMQ (KSMQ), KPTS/Channel 8 (KPTS), KTWU/Channel 11 (KTWU), East Tennessee PBS (WSJK), WCTE-TV (WCTE), WLJT, Channel 11 (WLJT), WOSU TV (WOSU), WOUB/WOUC (WOUB), WVPB (WVPB), WKYU-PBS (WKYU), KERA 13 (KERA), MPBN (WCBB), Mountain Lake PBS (WCFE), NHPTV (WENH), Vermont PBS (WETK), witf (WITF), WQED Multimedia (WQED), WMHT Educational Telecommunications (WMHT), Q-TV (WDCQ), WTVS Detroit Public TV (WTVS), CMU Public Television (WCMU), WKAR-TV (WKAR), WNMU-TV Public TV 13 (WNMU), WDSE - WRPT (WDSE), WGTE TV (WGTE), Lakeland Public Television (KAWE), KMOS-TV - Channels 6.1, 6.2 and 6.3 (KMOS), MontanaPBS (KUSM), KRWG/Channel 22 (KRWG), KACV (KACV), KCOS/Channel 13 (KCOS), WCNY/Channel 24 (WCNY), WNED (WNED), WPBS (WPBS), WSKG Public TV (WSKG), WXXI (WXXI), WPSU (WPSU), WVIA Public Media Studios (WVIA), WTVI (WTVI), Western Reserve PBS (WNEO), WVIZ/PBS ideastream (WVIZ), KCTS 9 (KCTS), Basin PBS (KPBT), KUHT / Channel 8 (KUHT), KLRN (KLRN), KLRU (KLRU), WTJX Channel 12 (WTJX), WCVE PBS (WCVE), KBTC Public Television (KBTC) - - **pcmag** - - **PearVideo** - - **PeerTube** - - **People** - - **PerformGroup** - - **periscope**: Periscope - - **periscope:user**: Periscope user videos - - **PhilharmonieDeParis**: Philharmonie de Paris - - **phoenix.de** - - **Photobucket** - - **Picarto** - - **PicartoVod** - - **Piksel** - - **Pinkbike** - - **Pladform** - - **Platzi** - - **PlatziCourse** - - **play.fm** - - **PlayPlusTV** - - **PlaysTV** - - **Playtvak**: Playtvak.cz, iDNES.cz and Lidovky.cz - - **Playvid** - - **Playwire** - - **pluralsight** - - **pluralsight:course** - - **plus.google**: Google Plus - - **podomatic** - - **Pokemon** - - **PolskieRadio** - - **PolskieRadioCategory** - - **Popcorntimes** - - **PopcornTV** - - **PornCom** - - **PornerBros** - - **PornHd** - - **PornHub**: PornHub and Thumbzilla - - **PornHubPagedVideoList** - - **PornHubUser** - - **PornHubUserVideosUpload** - - **Pornotube** - - **PornoVoisines** - - **PornoXO** - - **PornTube** - - **PressTV** - - **prosiebensat1**: ProSiebenSat.1 Digital - - **puhutv** - - **puhutv:serie** - - **Puls4** - - **Pyvideo** - - **qqmusic**: QQ音乐 - - **qqmusic:album**: QQ音乐 - 专辑 - - **qqmusic:playlist**: QQ音乐 - 歌单 - - **qqmusic:singer**: QQ音乐 - 歌手 - - **qqmusic:toplist**: QQ音乐 - 排行榜 - - **QuantumTV** - - **Quickline** - - **QuicklineLive** - - **R7** - - **R7Article** - - **radio.de** - - **radiobremen** - - **radiocanada** - - **radiocanada:audiovideo** - - **radiofrance** - - **RadioJavan** - - **Rai** - - **RaiPlay** - - **RaiPlayLive** - - **RaiPlayPlaylist** - - **RayWenderlich** - - **RayWenderlichCourse** - - **RBMARadio** - - **RDS**: RDS.ca - - **RedBull** - - **RedBullEmbed** - - **RedBullTV** - - **RedBullTVRrnContent** - - **Reddit** - - **RedditR** - - **RedTube** - - **RegioTV** - - **RENTV** - - **RENTVArticle** - - **Restudy** - - **Reuters** - - **ReverbNation** - - **RICE** - - **RMCDecouverte** - - **RockstarGames** - - **RoosterTeeth** - - **RottenTomatoes** - - **Roxwel** - - **Rozhlas** - - **RTBF** - - **rte**: Raidió Teilifís Éireann TV - - **rte:radio**: Raidió Teilifís Éireann radio - - **rtl.nl**: rtl.nl and rtlxl.nl - - **rtl2** - - **rtl2:you** - - **rtl2:you:series** - - **RTP** - - **RTS**: RTS.ch - - **rtve.es:alacarta**: RTVE a la carta - - **rtve.es:infantil**: RTVE infantil - - **rtve.es:live**: RTVE.es live streams - - **rtve.es:television** - - **RTVNH** - - **RTVS** - - **RUHD** - - **rutube**: Rutube videos - - **rutube:channel**: Rutube channels - - **rutube:embed**: Rutube embedded videos - - **rutube:movie**: Rutube movies - - **rutube:person**: Rutube person videos - - **rutube:playlist**: Rutube playlists - - **RUTV**: RUTV.RU - - **Ruutu** - - **Ruv** - - **safari**: safaribooksonline.com online video - - **safari:api** - - **safari:course**: safaribooksonline.com online courses - - **SAKTV** - - **SaltTV** - - **Sapo**: SAPO Vídeos - - **savefrom.net** - - **SBS**: sbs.com.au - - **schooltv** - - **screen.yahoo:search**: Yahoo screen search - - **Screencast** - - **ScreencastOMatic** - - **ScrippsNetworks** - - **scrippsnetworks:watch** - - **SCTE** - - **SCTECourse** - - **Seeker** - - **SenateISVP** - - **SendtoNews** - - **Servus** - - **Sexu** - - **SeznamZpravy** - - **SeznamZpravyArticle** - - **Shahid** - - **ShahidShow** - - **Shared**: shared.sx - - **ShowRoomLive** - - **Sina** - - **SkylineWebcams** - - **SkyNews** - - **skynewsarabia:article** - - **skynewsarabia:video** - - **SkySports** - - **Slideshare** - - **SlidesLive** - - **Slutload** - - **smotri**: Smotri.com - - **smotri:broadcast**: Smotri.com broadcasts - - **smotri:community**: Smotri.com community videos - - **smotri:user**: Smotri.com user videos - - **Snotr** - - **Sohu** - - **SonyLIV** - - **soundcloud** - - **soundcloud:playlist** - - **soundcloud:search**: Soundcloud search - - **soundcloud:set** - - **soundcloud:trackstation** - - **soundcloud:user** - - **SoundcloudEmbed** - - **soundgasm** - - **soundgasm:profile** - - **southpark.cc.com** - - **southpark.cc.com:español** - - **southpark.de** - - **southpark.nl** - - **southparkstudios.dk** - - **SpankBang** - - **SpankBangPlaylist** - - **Spankwire** - - **Spiegel** - - **Spiegel:Article**: Articles on spiegel.de - - **Spiegeltv** - - **sport.francetvinfo.fr** - - **Sport5** - - **SportBox** - - **SportDeutschland** - - **SpringboardPlatform** - - **Sprout** - - **sr:mediathek**: Saarländischer Rundfunk - - **SRGSSR** - - **SRGSSRPlay**: srf.ch, rts.ch, rsi.ch, rtr.ch and swissinfo.ch play sites - - **stanfordoc**: Stanford Open ClassRoom - - **Steam** - - **Stitcher** - - **Streamable** - - **streamcloud.eu** - - **StreamCZ** - - **StreetVoice** - - **StretchInternet** - - **stv:player** - - **SunPorno** - - **sverigesradio:episode** - - **sverigesradio:publication** - - **SVT** - - **SVTPage** - - **SVTPlay**: SVT Play and Öppet arkiv - - **SVTSeries** - - **SWRMediathek** - - **Syfy** - - **SztvHu** - - **t-online.de** - - **Tagesschau** - - **tagesschau:player** - - **Tass** - - **TastyTrade** - - **TBS** - - **TDSLifeway** - - **Teachable** - - **TeachableCourse** - - **teachertube**: teachertube.com videos - - **teachertube:user:collection**: teachertube.com user and collection videos - - **TeachingChannel** - - **Teamcoco** - - **TeamTreeHouse** - - **TechTalks** - - **techtv.mit.edu** - - **ted** - - **Tele13** - - **Tele5** - - **TeleBruxelles** - - **Telecinco**: telecinco.es, cuatro.com and mediaset.es - - **Telegraaf** - - **TeleMB** - - **TeleQuebec** - - **TeleQuebecEmission** - - **TeleQuebecLive** - - **TeleQuebecSquat** - - **TeleTask** - - **Telewebion** - - **TennisTV** - - **TenPlay** - - **TF1** - - **TFO** - - **TheIntercept** - - **ThePlatform** - - **ThePlatformFeed** - - **TheScene** - - **TheStar** - - **TheSun** - - **TheWeatherChannel** - - **ThisAmericanLife** - - **ThisAV** - - **ThisOldHouse** - - **TikTok** - - **TikTokUser** - - **tinypic**: tinypic.com videos - - **TMZ** - - **TMZArticle** - - **TNAFlix** - - **TNAFlixNetworkEmbed** - - **toggle** - - **ToonGoggles** - - **Tosh**: Tosh.0 - - **tou.tv** - - **Toypics**: Toypics video - - **ToypicsUser**: Toypics user profile - - **TrailerAddict** (Currently broken) - - **Trilulilu** - - **TruNews** - - **TruTV** - - **Tube8** - - **TubiTv** - - **Tumblr** - - **tunein:clip** - - **tunein:program** - - **tunein:station** - - **tunein:topic** - - **TunePk** - - **Turbo** - - **tv.dfb.de** - - **TV2** - - **tv2.hu** - - **TV2Article** - - **TV2DK** - - **TV2DKBornholmPlay** - - **TV4**: tv4.se and tv4play.se - - **TV5MondePlus**: TV5MONDE+ - - **TVA** - - **TVANouvelles** - - **TVANouvellesArticle** - - **TVC** - - **TVCArticle** - - **tvigle**: Интернет-телевидение Tvigle.ru - - **tvland.com** - - **TVN24** - - **TVNet** - - **TVNoe** - - **TVNow** - - **TVNowAnnual** - - **TVNowNew** - - **TVNowSeason** - - **TVNowShow** - - **tvp**: Telewizja Polska - - **tvp:embed**: Telewizja Polska - - **tvp:series** - - **TVPlayer** - - **TVPlayHome** - - **Tweakers** - - **TwitCasting** - - **twitch:clips** - - **twitch:stream** - - **twitch:vod** - - **TwitchCollection** - - **TwitchVideos** - - **TwitchVideosClips** - - **TwitchVideosCollections** - - **twitter** - - **twitter:amplify** - - **twitter:broadcast** - - **twitter:card** - - **udemy** - - **udemy:course** - - **UDNEmbed**: 聯合影音 - - **UFCArabia** - - **UFCTV** - - **UKTVPlay** - - **umg:de**: Universal Music Deutschland - - **Unistra** - - **Unity** - - **uol.com.br** - - **uplynk** - - **uplynk:preplay** - - **Urort**: NRK P3 Urørt - - **URPlay** - - **USANetwork** - - **USAToday** - - **ustream** - - **ustream:channel** - - **ustudio** - - **ustudio:embed** - - **Varzesh3** - - **Vbox7** - - **VeeHD** - - **Veoh** - - **Vesti**: Вести.Ru - - **Vevo** - - **VevoPlaylist** - - **VGTV**: VGTV, BTTV, FTV, Aftenposten and Aftonbladet - - **vh1.com** - - **vhx:embed** - - **Viafree** - - **vice** - - **vice:article** - - **vice:show** - - **Vidbit** - - **Viddler** - - **Videa** - - **video.google:search**: Google Video search - - **VideoDetective** - - **videofy.me** - - **videomore** - - **videomore:season** - - **videomore:video** - - **VideoPress** - - **Vidio** - - **VidLii** - - **vidme** - - **vidme:user** - - **vidme:user:likes** - - **Vidzi** - - **vier**: vier.be and vijf.be - - **vier:videos** - - **viewlift** - - **viewlift:embed** - - **Viidea** - - **viki** - - **viki:channel** - - **vimeo** - - **vimeo:album** - - **vimeo:channel** - - **vimeo:group** - - **vimeo:likes**: Vimeo user likes - - **vimeo:ondemand** - - **vimeo:review**: Review pages on vimeo - - **vimeo:user** - - **vimeo:watchlater**: Vimeo watch later list, "vimeowatchlater" keyword (requires authentication) - - **Vimple**: Vimple - one-click video hosting - - **Vine** - - **vine:user** - - **Viqeo** - - **Viu** - - **viu:ott** - - **viu:playlist** - - **Vivo**: vivo.sx - - **vk**: VK - - **vk:uservideos**: VK - User's Videos - - **vk:wallpost** - - **vlive** - - **vlive:channel** - - **vlive:playlist** - - **Vodlocker** - - **VODPl** - - **VODPlatform** - - **VoiceRepublic** - - **Voot** - - **VoxMedia** - - **VoxMediaVolume** - - **vpro**: npo.nl, ntr.nl, omroepwnl.nl, zapp.nl and npo3.nl - - **Vrak** - - **VRT**: VRT NWS, Flanders News, Flandern Info and Sporza - - **VrtNU**: VrtNU.be - - **vrv** - - **vrv:series** - - **VShare** - - **VTXTV** - - **vube**: Vube.com - - **VuClip** - - **VVVVID** - - **VyboryMos** - - **Vzaar** - - **Wakanim** - - **Walla** - - **WalyTV** - - **washingtonpost** - - **washingtonpost:article** - - **wat.tv** - - **WatchBox** - - **WatchIndianPorn**: Watch Indian Porn - - **WDR** - - **wdr:mobile** - - **WDRElefant** - - **WDRPage** - - **Webcaster** - - **WebcasterFeed** - - **WebOfStories** - - **WebOfStoriesPlaylist** - - **Weibo** - - **WeiboMobile** - - **WeiqiTV**: WQTV - - **Wistia** - - **wnl**: npo.nl, ntr.nl, omroepwnl.nl, zapp.nl and npo3.nl - - **WorldStarHipHop** - - **WSJ**: Wall Street Journal - - **WSJArticle** - - **WWE** - - **XBef** - - **XboxClips** - - **XFileShare**: XFileShare based sites: ClipWatching, GoUnlimited, GoVid, HolaVid, Streamty, TheVideoBee, Uqload, VidBom, vidlo, VidLocker, VidShare, VUp, XVideoSharing - - **XHamster** - - **XHamsterEmbed** - - **XHamsterUser** - - **xiami:album**: 虾米音乐 - 专辑 - - **xiami:artist**: 虾米音乐 - 歌手 - - **xiami:collection**: 虾米音乐 - 精选集 - - **xiami:song**: 虾米音乐 - - **ximalaya**: 喜马拉雅FM - - **ximalaya:album**: 喜马拉雅FM 专辑 - - **XMinus** - - **XNXX** - - **Xstream** - - **XTube** - - **XTubeUser**: XTube user profile - - **Xuite**: 隨意窩Xuite影音 - - **XVideos** - - **XXXYMovies** - - **Yahoo**: Yahoo screen and movies - - **yahoo:gyao** - - **yahoo:gyao:player** - - **yahoo:japannews**: Yahoo! Japan News - - **YandexDisk** - - **yandexmusic:album**: Яндекс.Музыка - Альбом - - **yandexmusic:playlist**: Яндекс.Музыка - Плейлист - - **yandexmusic:track**: Яндекс.Музыка - Трек - - **YandexVideo** - - **YapFiles** - - **YesJapan** - - **yinyuetai:video**: 音悦Tai - - **Ynet** - - **YouJizz** - - **youku**: 优酷 - - **youku:show** - - **YouNowChannel** - - **YouNowLive** - - **YouNowMoment** - - **YouPorn** - - **YourPorn** - - **YourUpload** - - **youtube**: YouTube.com - - **youtube:channel**: YouTube.com channels - - **youtube:favorites**: YouTube.com favourite videos, ":ytfav" for short (requires authentication) - - **youtube:history**: Youtube watch history, ":ythistory" for short (requires authentication) - - **youtube:live**: YouTube.com live streams - - **youtube:playlist**: YouTube.com playlists - - **youtube:playlists**: YouTube.com user/channel playlists - - **youtube:recommended**: YouTube.com recommended videos, ":ytrec" for short (requires authentication) - - **youtube:search**: YouTube.com searches - - **youtube:search:date**: YouTube.com searches, newest videos first - - **youtube:search_url**: YouTube.com search URLs - - **youtube:show**: YouTube.com (multi-season) shows - - **youtube:subscriptions**: YouTube.com subscriptions feed, "ytsubs" keyword (requires authentication) - - **youtube:user**: YouTube.com user videos (URL or "ytuser" keyword) - - **youtube:watchlater**: Youtube watch later list, ":ytwatchlater" for short (requires authentication) - - **Zapiks** - - **Zaq1** - - **Zattoo** - - **ZattooLive** - - **ZDF** - - **ZDFChannel** - - **zingmp3**: mp3.zing.vn - - **Zype**