diff --git a/.gitignore b/.gitignore index 014f76683..543b00e04 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,19 @@ updates_key.pem +*~ +*.pyc +*.pyo +*.DS_Store +wine-py2exe/ +py2exe.log +*.kate-swp +build/ +dist/ +MANIFEST +README.txt +youtube-dl.1 +youtube-dl.bash-completion +youtube-dl +youtube-dl.exe +youtube-dl.tar.gz +.coverage +cover/ diff --git a/cover/coverage_html.js b/cover/coverage_html.js deleted file mode 100644 index b24006d25..000000000 --- a/cover/coverage_html.js +++ /dev/null @@ -1,376 +0,0 @@ -// Coverage.py HTML report browser code. -/*jslint browser: true, sloppy: true, vars: true, plusplus: true, maxerr: 50, indent: 4 */ -/*global coverage: true, document, window, $ */ - -coverage = {}; - -// Find all the elements with shortkey_* class, and use them to assign a shotrtcut key. -coverage.assign_shortkeys = function () { - $("*[class*='shortkey_']").each(function (i, e) { - $.each($(e).attr("class").split(" "), function (i, c) { - if (/^shortkey_/.test(c)) { - $(document).bind('keydown', c.substr(9), function () { - $(e).click(); - }); - } - }); - }); -}; - -// Create the events for the help panel. -coverage.wire_up_help_panel = function () { - $("#keyboard_icon").click(function () { - // Show the help panel, and position it so the keyboard icon in the - // panel is in the same place as the keyboard icon in the header. - $(".help_panel").show(); - var koff = $("#keyboard_icon").offset(); - var poff = $("#panel_icon").position(); - $(".help_panel").offset({ - top: koff.top-poff.top, - left: koff.left-poff.left - }); - }); - $("#panel_icon").click(function () { - $(".help_panel").hide(); - }); -}; - -// Loaded on index.html -coverage.index_ready = function ($) { - // Look for a cookie containing previous sort settings: - var sort_list = []; - var cookie_name = "COVERAGE_INDEX_SORT"; - var i; - - // This almost makes it worth installing the jQuery cookie plugin: - if (document.cookie.indexOf(cookie_name) > -1) { - var cookies = document.cookie.split(";"); - for (i = 0; i < cookies.length; i++) { - var parts = cookies[i].split("="); - - if ($.trim(parts[0]) === cookie_name && parts[1]) { - sort_list = eval("[[" + parts[1] + "]]"); - break; - } - } - } - - // Create a new widget which exists only to save and restore - // the sort order: - $.tablesorter.addWidget({ - id: "persistentSort", - - // Format is called by the widget before displaying: - format: function (table) { - if (table.config.sortList.length === 0 && sort_list.length > 0) { - // This table hasn't been sorted before - we'll use - // our stored settings: - $(table).trigger('sorton', [sort_list]); - } - else { - // This is not the first load - something has - // already defined sorting so we'll just update - // our stored value to match: - sort_list = table.config.sortList; - } - } - }); - - // Configure our tablesorter to handle the variable number of - // columns produced depending on report options: - var headers = []; - var col_count = $("table.index > thead > tr > th").length; - - headers[0] = { sorter: 'text' }; - for (i = 1; i < col_count-1; i++) { - headers[i] = { sorter: 'digit' }; - } - headers[col_count-1] = { sorter: 'percent' }; - - // Enable the table sorter: - $("table.index").tablesorter({ - widgets: ['persistentSort'], - headers: headers - }); - - coverage.assign_shortkeys(); - coverage.wire_up_help_panel(); - - // Watch for page unload events so we can save the final sort settings: - $(window).unload(function () { - document.cookie = cookie_name + "=" + sort_list.toString() + "; path=/"; - }); -}; - -// -- pyfile stuff -- - -coverage.pyfile_ready = function ($) { - // If we're directed to a particular line number, highlight the line. - var frag = location.hash; - if (frag.length > 2 && frag[1] === 'n') { - $(frag).addClass('highlight'); - coverage.set_sel(parseInt(frag.substr(2), 10)); - } - else { - coverage.set_sel(0); - } - - $(document) - .bind('keydown', 'j', coverage.to_next_chunk_nicely) - .bind('keydown', 'k', coverage.to_prev_chunk_nicely) - .bind('keydown', '0', coverage.to_top) - .bind('keydown', '1', coverage.to_first_chunk) - ; - - $(".button_toggle_run").click(function (evt) {coverage.toggle_lines(evt.target, "run");}); - $(".button_toggle_exc").click(function (evt) {coverage.toggle_lines(evt.target, "exc");}); - $(".button_toggle_mis").click(function (evt) {coverage.toggle_lines(evt.target, "mis");}); - $(".button_toggle_par").click(function (evt) {coverage.toggle_lines(evt.target, "par");}); - - coverage.assign_shortkeys(); - coverage.wire_up_help_panel(); -}; - -coverage.toggle_lines = function (btn, cls) { - btn = $(btn); - var hide = "hide_"+cls; - if (btn.hasClass(hide)) { - $("#source ."+cls).removeClass(hide); - btn.removeClass(hide); - } - else { - $("#source ."+cls).addClass(hide); - btn.addClass(hide); - } -}; - -// Return the nth line div. -coverage.line_elt = function (n) { - return $("#t" + n); -}; - -// Return the nth line number div. -coverage.num_elt = function (n) { - return $("#n" + n); -}; - -// Return the container of all the code. -coverage.code_container = function () { - return $(".linenos"); -}; - -// Set the selection. b and e are line numbers. -coverage.set_sel = function (b, e) { - // The first line selected. - coverage.sel_begin = b; - // The next line not selected. - coverage.sel_end = (e === undefined) ? b+1 : e; -}; - -coverage.to_top = function () { - coverage.set_sel(0, 1); - coverage.scroll_window(0); -}; - -coverage.to_first_chunk = function () { - coverage.set_sel(0, 1); - coverage.to_next_chunk(); -}; - -coverage.is_transparent = function (color) { - // Different browsers return different colors for "none". - return color === "transparent" || color === "rgba(0, 0, 0, 0)"; -}; - -coverage.to_next_chunk = function () { - var c = coverage; - - // Find the start of the next colored chunk. - var probe = c.sel_end; - while (true) { - var probe_line = c.line_elt(probe); - if (probe_line.length === 0) { - return; - } - var color = probe_line.css("background-color"); - if (!c.is_transparent(color)) { - break; - } - probe++; - } - - // There's a next chunk, `probe` points to it. - var begin = probe; - - // Find the end of this chunk. - var next_color = color; - while (next_color === color) { - probe++; - probe_line = c.line_elt(probe); - next_color = probe_line.css("background-color"); - } - c.set_sel(begin, probe); - c.show_selection(); -}; - -coverage.to_prev_chunk = function () { - var c = coverage; - - // Find the end of the prev colored chunk. - var probe = c.sel_begin-1; - var probe_line = c.line_elt(probe); - if (probe_line.length === 0) { - return; - } - var color = probe_line.css("background-color"); - while (probe > 0 && c.is_transparent(color)) { - probe--; - probe_line = c.line_elt(probe); - if (probe_line.length === 0) { - return; - } - color = probe_line.css("background-color"); - } - - // There's a prev chunk, `probe` points to its last line. - var end = probe+1; - - // Find the beginning of this chunk. - var prev_color = color; - while (prev_color === color) { - probe--; - probe_line = c.line_elt(probe); - prev_color = probe_line.css("background-color"); - } - c.set_sel(probe+1, end); - c.show_selection(); -}; - -// Return the line number of the line nearest pixel position pos -coverage.line_at_pos = function (pos) { - var l1 = coverage.line_elt(1), - l2 = coverage.line_elt(2), - result; - if (l1.length && l2.length) { - var l1_top = l1.offset().top, - line_height = l2.offset().top - l1_top, - nlines = (pos - l1_top) / line_height; - if (nlines < 1) { - result = 1; - } - else { - result = Math.ceil(nlines); - } - } - else { - result = 1; - } - return result; -}; - -// Returns 0, 1, or 2: how many of the two ends of the selection are on -// the screen right now? -coverage.selection_ends_on_screen = function () { - if (coverage.sel_begin === 0) { - return 0; - } - - var top = coverage.line_elt(coverage.sel_begin); - var next = coverage.line_elt(coverage.sel_end-1); - - return ( - (top.isOnScreen() ? 1 : 0) + - (next.isOnScreen() ? 1 : 0) - ); -}; - -coverage.to_next_chunk_nicely = function () { - coverage.finish_scrolling(); - if (coverage.selection_ends_on_screen() === 0) { - // The selection is entirely off the screen: select the top line on - // the screen. - var win = $(window); - coverage.select_line_or_chunk(coverage.line_at_pos(win.scrollTop())); - } - coverage.to_next_chunk(); -}; - -coverage.to_prev_chunk_nicely = function () { - coverage.finish_scrolling(); - if (coverage.selection_ends_on_screen() === 0) { - var win = $(window); - coverage.select_line_or_chunk(coverage.line_at_pos(win.scrollTop() + win.height())); - } - coverage.to_prev_chunk(); -}; - -// Select line number lineno, or if it is in a colored chunk, select the -// entire chunk -coverage.select_line_or_chunk = function (lineno) { - var c = coverage; - var probe_line = c.line_elt(lineno); - if (probe_line.length === 0) { - return; - } - var the_color = probe_line.css("background-color"); - if (!c.is_transparent(the_color)) { - // The line is in a highlighted chunk. - // Search backward for the first line. - var probe = lineno; - var color = the_color; - while (probe > 0 && color === the_color) { - probe--; - probe_line = c.line_elt(probe); - if (probe_line.length === 0) { - break; - } - color = probe_line.css("background-color"); - } - var begin = probe + 1; - - // Search forward for the last line. - probe = lineno; - color = the_color; - while (color === the_color) { - probe++; - probe_line = c.line_elt(probe); - color = probe_line.css("background-color"); - } - - coverage.set_sel(begin, probe); - } - else { - coverage.set_sel(lineno); - } -}; - -coverage.show_selection = function () { - var c = coverage; - - // Highlight the lines in the chunk - c.code_container().find(".highlight").removeClass("highlight"); - for (var probe = c.sel_begin; probe > 0 && probe < c.sel_end; probe++) { - c.num_elt(probe).addClass("highlight"); - } - - c.scroll_to_selection(); -}; - -coverage.scroll_to_selection = function () { - // Scroll the page if the chunk isn't fully visible. - if (coverage.selection_ends_on_screen() < 2) { - // Need to move the page. The html,body trick makes it scroll in all - // browsers, got it from http://stackoverflow.com/questions/3042651 - var top = coverage.line_elt(coverage.sel_begin); - var top_pos = parseInt(top.offset().top, 10); - coverage.scroll_window(top_pos - 30); - } -}; - -coverage.scroll_window = function (to_pos) { - $("html,body").animate({scrollTop: to_pos}, 200); -}; - -coverage.finish_scrolling = function () { - $("html,body").stop(true, true); -}; diff --git a/cover/index.html b/cover/index.html deleted file mode 100644 index 3527ed1a5..000000000 --- a/cover/index.html +++ /dev/null @@ -1,135 +0,0 @@ - - -
- -Hot-keys on this page
-- n - s - m - x - - c change column sorting -
-Module | -statements | -missing | -excluded | - -coverage | -
---|---|---|---|---|
Total | -3474 | -1568 | -0 | - -55% | -
youtube_dl | -330 | -303 | -0 | - -8% | -
youtube_dl.FileDownloader | -477 | -209 | -0 | - -56% | -
youtube_dl.InfoExtractors | -2213 | -923 | -0 | - -58% | -
youtube_dl.PostProcessor | -130 | -111 | -0 | - -15% | -
youtube_dl.utils | -323 | -22 | -0 | - -93% | -
youtube_dl.version | -1 | -0 | -0 | - -100% | -
t |
":function(g,j){var o=typeof j==="string",m,p=0,q=g.length;if(o&&!/\W/.test(j))for(j=j.toLowerCase();p=0))o||m.push(t);else if(o)j[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var j=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=j[1]+(j[2]||1)-0;g[3]=j[3]-0}g[0]=e++;return g},ATTR:function(g,j,o, -m,p,q){j=g[1].replace(/\\/g,"");if(!q&&n.attrMap[j])g[1]=n.attrMap[j];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,j,o,m,p){if(g[1]==="not")if((d.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=l(g[3],null,null,j);else{g=l.filter(g[3],j,o,true^p);o||m.push.apply(m,g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled=== -true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,j,o){return!!l(o[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"=== -g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,j){return j===0},last:function(g,j,o,m){return j===m.length-1},even:function(g,j){return j%2===0},odd:function(g,j){return j%2===1},lt:function(g,j,o){return jo[3]-0},nth:function(g,j,o){return o[3]- -0===j},eq:function(g,j,o){return o[3]-0===j}},filter:{PSEUDO:function(g,j,o,m){var p=j[1],q=n.filters[p];if(q)return q(g,o,j,m);else if(p==="contains")return(g.textContent||g.innerText||l.getText([g])||"").indexOf(j[3])>=0;else if(p==="not"){j=j[3];o=0;for(m=j.length;o =0}},ID:function(g,j){return g.nodeType===1&&g.getAttribute("id")===j},TAG:function(g,j){return j==="*"&&g.nodeType===1||g.nodeName.toLowerCase()=== -j},CLASS:function(g,j){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(j)>-1},ATTR:function(g,j){var o=j[1];o=n.attrHandle[o]?n.attrHandle[o](g):g[o]!=null?g[o]:g.getAttribute(o);var m=o+"",p=j[2],q=j[4];return o==null?p==="!=":p==="="?m===q:p==="*="?m.indexOf(q)>=0:p==="~="?(" "+m+" ").indexOf(q)>=0:!q?m&&o!==false:p==="!="?m!==q:p==="^="?m.indexOf(q)===0:p==="$="?m.substr(m.length-q.length)===q:p==="|="?m===q||m.substr(0,q.length+1)===q+"-":false},POS:function(g,j,o,m){var p=n.setFilters[j[2]]; -if(p)return p(g,o,j,m)}}},s=n.match.POS,v=function(g,j){return"\\"+(j-0+1)},B;for(B in n.match){n.match[B]=RegExp(n.match[B].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[B]=RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[B].source.replace(/\\(\d+)/g,v))}var D=function(g,j){g=Array.prototype.slice.call(g,0);if(j){j.push.apply(j,g);return j}return g};try{Array.prototype.slice.call(u.documentElement.childNodes,0)}catch(H){D=function(g,j){var o=j||[],m=0;if(f.call(g)==="[object Array]")Array.prototype.push.apply(o, -g);else if(typeof g.length==="number")for(var p=g.length;m";var o=u.documentElement;o.insertBefore(g,o.firstChild);if(u.getElementById(j)){n.find.ID=function(m,p,q){if(typeof p.getElementById!=="undefined"&&!q)return(p=p.getElementById(m[1]))?p.id===m[1]||typeof p.getAttributeNode!=="undefined"&&p.getAttributeNode("id").nodeValue===m[1]?[p]:A:[]};n.filter.ID=function(m,p){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===p}}o.removeChild(g); -o=g=null})();(function(){var g=u.createElement("div");g.appendChild(u.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(j,o){var m=o.getElementsByTagName(j[1]);if(j[1]==="*"){for(var p=[],q=0;m[q];q++)m[q].nodeType===1&&p.push(m[q]);m=p}return m};g.innerHTML="";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(j){return j.getAttribute("href",2)};g=null})();u.querySelectorAll&& -function(){var g=l,j=u.createElement("div");j.innerHTML="";if(!(j.querySelectorAll&&j.querySelectorAll(".TEST").length===0)){l=function(m,p,q,t){p=p||u;if(!t&&!l.isXML(p))if(p.nodeType===9)try{return D(p.querySelectorAll(m),q)}catch(x){}else if(p.nodeType===1&&p.nodeName.toLowerCase()!=="object"){var C=p.id,P=p.id="__sizzle__";try{return D(p.querySelectorAll("#"+P+" "+m),q)}catch(N){}finally{if(C)p.id=C;else p.removeAttribute("id")}}return g(m,p,q,t)};for(var o in g)l[o]=g[o]; -j=null}}();(function(){var g=u.documentElement,j=g.matchesSelector||g.mozMatchesSelector||g.webkitMatchesSelector||g.msMatchesSelector,o=false;try{j.call(u.documentElement,":sizzle")}catch(m){o=true}if(j)l.matchesSelector=function(p,q){try{if(o||!n.match.PSEUDO.test(q))return j.call(p,q)}catch(t){}return l(q,null,null,[p]).length>0}})();(function(){var g=u.createElement("div");g.innerHTML="";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length=== -0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(j,o,m){if(typeof o.getElementsByClassName!=="undefined"&&!m)return o.getElementsByClassName(j[1])};g=null}}})();l.contains=u.documentElement.contains?function(g,j){return g!==j&&(g.contains?g.contains(j):true)}:function(g,j){return!!(g.compareDocumentPosition(j)&16)};l.isXML=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false};var M=function(g, -j){for(var o=[],m="",p,q=j.nodeType?[j]:j;p=n.match.PSEUDO.exec(g);){m+=p[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;p=0;for(var t=q.length;p 0)for(var h=d;h 0},closest:function(a, -b){var d=[],e,f,h=this[0];if(c.isArray(a)){var k={},l,n=1;if(h&&a.length){e=0;for(f=a.length;e -1:c(h).is(e))d.push({selector:l,elem:h,level:n})}h=h.parentNode;n++}}return d}k=$a.test(a)?c(a,b||this.context):null;e=0;for(f=this.length;e -1:c.find.matchesSelector(h,a)){d.push(h);break}else{h=h.parentNode;if(!h|| -!h.ownerDocument||h===b)break}d=d.length>1?c.unique(d):d;return this.pushStack(d,"closest",a)},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var d=typeof a==="string"?c(a,b||this.context):c.makeArray(a),e=c.merge(this.get(),d);return this.pushStack(!d[0]||!d[0].parentNode||d[0].parentNode.nodeType===11||!e[0]||!e[0].parentNode||e[0].parentNode.nodeType===11?e:c.unique(e))},andSelf:function(){return this.add(this.prevObject)}}); -c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling", -d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,e){var f=c.map(this,b,d);Wa.test(a)||(e=d);if(e&&typeof e==="string")f=c.filter(e,f);f=this.length>1?c.unique(f):f;if((this.length>1||Ya.test(e))&&Xa.test(a))f=f.reverse();return this.pushStack(f,a,Za.call(arguments).join(","))}}); -c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return b.length===1?c.find.matchesSelector(b[0],a)?[b[0]]:[]:c.find.matches(a,b)},dir:function(a,b,d){var e=[];for(a=a[b];a&&a.nodeType!==9&&(d===A||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&&e.push(a);a=a[b]}return e},nth:function(a,b,d){b=b||1;for(var e=0;a;a=a[d])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var xa=/ jQuery\d+="(?:\d+|null)"/g, -$=/^\s+/,ya=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,za=/<([\w:]+)/,ab=/\s]+\/)>/g,O={option:[1,""],legend:[1,""],thead:[1," ","
"],tr:[2,"","
"],td:[3,""],col:[2,"
"," "], -area:[1,""],_default:[0,"",""]};O.optgroup=O.option;O.tbody=O.tfoot=O.colgroup=O.caption=O.thead;O.th=O.td;if(!c.support.htmlSerialize)O._default=[1,"div
"," ",""];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==A)return this.empty().append((this[0]&&this[0].ownerDocument||u).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this, -d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})}, -unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a= -c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,e;(e=this[d])!=null;d++)if(!a||c.filter(a,[e]).length){if(!b&&e.nodeType===1){c.cleanData(e.getElementsByTagName("*")); -c.cleanData([e])}e.parentNode&&e.parentNode.removeChild(e)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,e=this.ownerDocument;if(!d){d=e.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(xa,"").replace(cb,'="$1">').replace($, -"")],e)[0]}else return this.cloneNode(true)});if(a===true){la(this,b);la(this.find("*"),b.find("*"))}return b},html:function(a){if(a===A)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(xa,""):null;else if(typeof a==="string"&&!Aa.test(a)&&(c.support.leadingWhitespace||!$.test(a))&&!O[(za.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(ya,"<$1>$2>");try{for(var b=0,d=this.length;b0||e.cacheable||this.length>1?l.cloneNode(true):l)}k.length&&c.each(k,Ka)}return this}});c.buildFragment=function(a,b,d){var e,f,h;b=b&&b[0]?b[0].ownerDocument||b[0]:u;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===u&&!Aa.test(a[0])&&(c.support.checkClone|| -!Ba.test(a[0]))){f=true;if(h=c.fragments[a[0]])if(h!==1)e=h}if(!e){e=b.createDocumentFragment();c.clean(a,b,e,d)}if(f)c.fragments[a[0]]=h?e:1;return{fragment:e,cacheable:f}};c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var e=[];d=c(d);var f=this.length===1&&this[0].parentNode;if(f&&f.nodeType===11&&f.childNodes.length===1&&d.length===1){d[b](this[0]);return this}else{f=0;for(var h= -d.length;f 0?this.clone(true):this).get();c(d[f])[b](k);e=e.concat(k)}return this.pushStack(e,a,d.selector)}}});c.extend({clean:function(a,b,d,e){b=b||u;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||u;for(var f=[],h=0,k;(k=a[h])!=null;h++){if(typeof k==="number")k+="";if(k){if(typeof k==="string"&&!bb.test(k))k=b.createTextNode(k);else if(typeof k==="string"){k=k.replace(ya,"<$1>$2>");var l=(za.exec(k)||["",""])[1].toLowerCase(),n=O[l]||O._default, -s=n[0],v=b.createElement("div");for(v.innerHTML=n[1]+k+n[2];s--;)v=v.lastChild;if(!c.support.tbody){s=ab.test(k);l=l==="table"&&!s?v.firstChild&&v.firstChild.childNodes:n[1]===" "&&!s?v.childNodes:[];for(n=l.length-1;n>=0;--n)c.nodeName(l[n],"tbody")&&!l[n].childNodes.length&&l[n].parentNode.removeChild(l[n])}!c.support.leadingWhitespace&&$.test(k)&&v.insertBefore(b.createTextNode($.exec(k)[0]),v.firstChild);k=v.childNodes}if(k.nodeType)f.push(k);else f=c.merge(f,k)}}if(d)for(h=0;f[h];h++)if(e&& -c.nodeName(f[h],"script")&&(!f[h].type||f[h].type.toLowerCase()==="text/javascript"))e.push(f[h].parentNode?f[h].parentNode.removeChild(f[h]):f[h]);else{f[h].nodeType===1&&f.splice.apply(f,[h+1,0].concat(c.makeArray(f[h].getElementsByTagName("script"))));d.appendChild(f[h])}return f},cleanData:function(a){for(var b,d,e=c.cache,f=c.event.special,h=c.support.deleteExpando,k=0,l;(l=a[k])!=null;k++)if(!(l.nodeName&&c.noData[l.nodeName.toLowerCase()]))if(d=l[c.expando]){if((b=e[d])&&b.events)for(var n in b.events)f[n]? -c.event.remove(l,n):c.removeEvent(l,n,b.handle);if(h)delete l[c.expando];else l.removeAttribute&&l.removeAttribute(c.expando);delete e[d]}}});var Ca=/alpha\([^)]*\)/i,db=/opacity=([^)]*)/,eb=/-([a-z])/ig,fb=/([A-Z])/g,Da=/^-?\d+(?:px)?$/i,gb=/^-?\d/,hb={position:"absolute",visibility:"hidden",display:"block"},La=["Left","Right"],Ma=["Top","Bottom"],W,ib=u.defaultView&&u.defaultView.getComputedStyle,jb=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){if(arguments.length===2&&b===A)return this; -return c.access(this,a,b,true,function(d,e,f){return f!==A?c.style(d,e,f):c.css(d,e)})};c.extend({cssHooks:{opacity:{get:function(a,b){if(b){var d=W(a,"opacity","opacity");return d===""?"1":d}else return a.style.opacity}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true,zoom:true,lineHeight:true},cssProps:{"float":c.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,d,e){if(!(!a||a.nodeType===3||a.nodeType===8||!a.style)){var f,h=c.camelCase(b),k=a.style,l=c.cssHooks[h];b=c.cssProps[h]|| -h;if(d!==A){if(!(typeof d==="number"&&isNaN(d)||d==null)){if(typeof d==="number"&&!c.cssNumber[h])d+="px";if(!l||!("set"in l)||(d=l.set(a,d))!==A)try{k[b]=d}catch(n){}}}else{if(l&&"get"in l&&(f=l.get(a,false,e))!==A)return f;return k[b]}}},css:function(a,b,d){var e,f=c.camelCase(b),h=c.cssHooks[f];b=c.cssProps[f]||f;if(h&&"get"in h&&(e=h.get(a,true,d))!==A)return e;else if(W)return W(a,b,f)},swap:function(a,b,d){var e={},f;for(f in b){e[f]=a.style[f];a.style[f]=b[f]}d.call(a);for(f in b)a.style[f]= -e[f]},camelCase:function(a){return a.replace(eb,jb)}});c.curCSS=c.css;c.each(["height","width"],function(a,b){c.cssHooks[b]={get:function(d,e,f){var h;if(e){if(d.offsetWidth!==0)h=ma(d,b,f);else c.swap(d,hb,function(){h=ma(d,b,f)});return h+"px"}},set:function(d,e){if(Da.test(e)){e=parseFloat(e);if(e>=0)return e+"px"}else return e}}});if(!c.support.opacity)c.cssHooks.opacity={get:function(a,b){return db.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"": -b?"1":""},set:function(a,b){var d=a.style;d.zoom=1;var e=c.isNaN(b)?"":"alpha(opacity="+b*100+")",f=d.filter||"";d.filter=Ca.test(f)?f.replace(Ca,e):d.filter+" "+e}};if(ib)W=function(a,b,d){var e;d=d.replace(fb,"-$1").toLowerCase();if(!(b=a.ownerDocument.defaultView))return A;if(b=b.getComputedStyle(a,null)){e=b.getPropertyValue(d);if(e===""&&!c.contains(a.ownerDocument.documentElement,a))e=c.style(a,d)}return e};else if(u.documentElement.currentStyle)W=function(a,b){var d,e,f=a.currentStyle&&a.currentStyle[b], -h=a.style;if(!Da.test(f)&&gb.test(f)){d=h.left;e=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;h.left=b==="fontSize"?"1em":f||0;f=h.pixelLeft+"px";h.left=d;a.runtimeStyle.left=e}return f};if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetHeight;return a.offsetWidth===0&&b===0||!c.support.reliableHiddenOffsets&&(a.style.display||c.css(a,"display"))==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var kb=c.now(),lb=/ - - - - - - - -
-- ---Coverage for youtube_dl : - 8% -
- -- 330 statements -
- - - - -- -- -Hot-keys on this page
---- r - m - x - p toggle line displays -
-- j - k next/prev highlighted chunk -
-- 0 (zero) top of page -
-- 1 (one) first highlighted chunk -
--- - - - --
-- -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- -#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-- - -
- -
'Ricardo Garcia Gonzalez',
-'Danny Colligan',
-'Benjamin Johnson',
-'Vasyl\' Vavrychuk',
-'Witold Baryluk',
-'Paweł Paprota',
-'Gergely Imreh',
-'Rogério Brito',
-'Philipp Hagemeister',
-'Sören Schulze',
-'Kevin Ngo',
-'Ori Avtalion',
-'shizeeg',
-'Filippo Valsorda',
-'Christian Albrecht',
-'Dave Vasilevsky',
-)
-- -
- - - - - - - - - -
- - - - - -
- -
"""Update the program file with the latest version from the repository"""
--
# TODO: at least, check https certificates
--
from zipimport import zipimporter
--
API_URL = "https://api.github.com/repos/rg3/youtube-dl/downloads"
-BIN_URL = "https://github.com/downloads/rg3/youtube-dl/youtube-dl"
-EXE_URL = "https://github.com/downloads/rg3/youtube-dl/youtube-dl.exe"
--
if hasattr(sys, "frozen"): # PY2EXE
-if not os.access(filename, os.W_OK):
-sys.exit('ERROR: no write permissions on %s' % filename)
--
downloader.to_screen(u'Updating to latest version...')
--
urla = compat_urllib_request.urlopen(API_URL)
-download = filter(lambda x: x["name"] == "youtube-dl.exe", json.loads(urla.read()))
-if not download:
-downloader.to_screen(u'ERROR: can\'t find the current version. Please try again later.')
-return
-newversion = download[0]["description"].strip()
-if newversion == __version__:
-downloader.to_screen(u'youtube-dl is up-to-date (' + __version__ + ')')
-return
-urla.close()
--
exe = os.path.abspath(filename)
-directory = os.path.dirname(exe)
-if not os.access(directory, os.W_OK):
-sys.exit('ERROR: no write permissions on %s' % directory)
--
try:
-urlh = compat_urllib_request.urlopen(EXE_URL)
-newcontent = urlh.read()
-urlh.close()
-with open(exe + '.new', 'wb') as outf:
-outf.write(newcontent)
-except (IOError, OSError) as err:
-sys.exit('ERROR: unable to download latest version')
--
try:
-bat = os.path.join(directory, 'youtube-dl-updater.bat')
-b = open(bat, 'w')
-b.write("""
-echo Updating youtube-dl...
-ping 127.0.0.1 -n 5 -w 1000 > NUL
-move /Y "%s.new" "%s"
-del "%s"
-\n""" %(exe, exe, bat))
-b.close()
--
os.startfile(bat)
-except (IOError, OSError) as err:
-sys.exit('ERROR: unable to overwrite current version')
--
elif isinstance(globals().get('__loader__'), zipimporter): # UNIX ZIP
-if not os.access(filename, os.W_OK):
-sys.exit('ERROR: no write permissions on %s' % filename)
--
downloader.to_screen(u'Updating to latest version...')
--
urla = compat_urllib_request.urlopen(API_URL)
-download = [x for x in json.loads(urla.read().decode('utf8')) if x["name"] == "youtube-dl"]
-if not download:
-downloader.to_screen(u'ERROR: can\'t find the current version. Please try again later.')
-return
-newversion = download[0]["description"].strip()
-if newversion == __version__:
-downloader.to_screen(u'youtube-dl is up-to-date (' + __version__ + ')')
-return
-urla.close()
--
try:
-urlh = compat_urllib_request.urlopen(BIN_URL)
-newcontent = urlh.read()
-urlh.close()
-except (IOError, OSError) as err:
-sys.exit('ERROR: unable to download latest version')
--
try:
-with open(filename, 'wb') as outf:
-outf.write(newcontent)
-except (IOError, OSError) as err:
-sys.exit('ERROR: unable to overwrite current version')
--
else:
-downloader.to_screen(u'It looks like you installed youtube-dl with pip or setup.py. Please use that to update.')
-return
--
downloader.to_screen(u'Updated youtube-dl. Restart youtube-dl to use the new version.')
-- -
def _readOptions(filename_bytes):
-try:
-optionf = open(filename_bytes)
-except IOError:
-return [] # silently skip if file is not present
-try:
-res = []
-for l in optionf:
-res += shlex.split(l, comments=True)
-finally:
-optionf.close()
-return res
--
def _format_option_string(option):
-''' ('-o', '--option') -> -o, --format METAVAR'''
--
opts = []
--
if option._short_opts:
-opts.append(option._short_opts[0])
-if option._long_opts:
-opts.append(option._long_opts[0])
-if len(opts) > 1:
-opts.insert(1, ', ')
--
if option.takes_value(): opts.append(' %s' % option.metavar)
--
return "".join(opts)
--
def _find_term_columns():
-columns = os.environ.get('COLUMNS', None)
-if columns:
-return int(columns)
--
try:
-sp = subprocess.Popen(['stty', 'size'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-out,err = sp.communicate()
-return int(out.split()[1])
-except:
-pass
-return None
--
max_width = 80
-max_help_position = 80
--
# No need to wrap help messages if we're on a wide console
-columns = _find_term_columns()
-if columns: max_width = columns
--
fmt = optparse.IndentedHelpFormatter(width=max_width, max_help_position=max_help_position)
-fmt.format_option_strings = _format_option_string
--
kw = {
-'version' : __version__,
-'formatter' : fmt,
-'usage' : '%prog [options] url [url...]',
-'conflict_handler' : 'resolve',
-}
--
parser = optparse.OptionParser(**kw)
--
# option groups
-general = optparse.OptionGroup(parser, 'General Options')
-selection = optparse.OptionGroup(parser, 'Video Selection')
-authentication = optparse.OptionGroup(parser, 'Authentication Options')
-video_format = optparse.OptionGroup(parser, 'Video Format Options')
-postproc = optparse.OptionGroup(parser, 'Post-processing Options')
-filesystem = optparse.OptionGroup(parser, 'Filesystem Options')
-verbosity = optparse.OptionGroup(parser, 'Verbosity / Simulation Options')
--
general.add_option('-h', '--help',
-action='help', help='print this help text and exit')
-general.add_option('-v', '--version',
-action='version', help='print program version and exit')
-general.add_option('-U', '--update',
-action='store_true', dest='update_self', help='update this program to latest version')
-general.add_option('-i', '--ignore-errors',
-action='store_true', dest='ignoreerrors', help='continue on download errors', default=False)
-general.add_option('-r', '--rate-limit',
-dest='ratelimit', metavar='LIMIT', help='download rate limit (e.g. 50k or 44.6m)')
-general.add_option('-R', '--retries',
-dest='retries', metavar='RETRIES', help='number of retries (default is %default)', default=10)
-general.add_option('--buffer-size',
-dest='buffersize', metavar='SIZE', help='size of download buffer (e.g. 1024 or 16k) (default is %default)', default="1024")
-general.add_option('--no-resize-buffer',
-action='store_true', dest='noresizebuffer',
-help='do not automatically adjust the buffer size. By default, the buffer size is automatically resized from an initial value of SIZE.', default=False)
-general.add_option('--dump-user-agent',
-action='store_true', dest='dump_user_agent',
-help='display the current browser identification', default=False)
-general.add_option('--user-agent',
-dest='user_agent', help='specify a custom user agent', metavar='UA')
-general.add_option('--list-extractors',
-action='store_true', dest='list_extractors',
-help='List all supported extractors and the URLs they would handle', default=False)
-general.add_option('--test', action='store_true', dest='test', default=False, help=optparse.SUPPRESS_HELP)
--
selection.add_option('--playlist-start',
-dest='playliststart', metavar='NUMBER', help='playlist video to start at (default is %default)', default=1)
-selection.add_option('--playlist-end',
-dest='playlistend', metavar='NUMBER', help='playlist video to end at (default is last)', default=-1)
-selection.add_option('--match-title', dest='matchtitle', metavar='REGEX',help='download only matching titles (regex or caseless sub-string)')
-selection.add_option('--reject-title', dest='rejecttitle', metavar='REGEX',help='skip download for matching titles (regex or caseless sub-string)')
-selection.add_option('--max-downloads', metavar='NUMBER', dest='max_downloads', help='Abort after downloading NUMBER files', default=None)
--
authentication.add_option('-u', '--username',
-dest='username', metavar='USERNAME', help='account username')
-authentication.add_option('-p', '--password',
-dest='password', metavar='PASSWORD', help='account password')
-authentication.add_option('-n', '--netrc',
-action='store_true', dest='usenetrc', help='use .netrc authentication data', default=False)
--
-
video_format.add_option('-f', '--format',
-action='store', dest='format', metavar='FORMAT', help='video format code')
-video_format.add_option('--all-formats',
-action='store_const', dest='format', help='download all available video formats', const='all')
-video_format.add_option('--prefer-free-formats',
-action='store_true', dest='prefer_free_formats', default=False, help='prefer free video formats unless a specific one is requested')
-video_format.add_option('--max-quality',
-action='store', dest='format_limit', metavar='FORMAT', help='highest quality format to download')
-video_format.add_option('-F', '--list-formats',
-action='store_true', dest='listformats', help='list all available formats (currently youtube only)')
-video_format.add_option('--write-srt',
-action='store_true', dest='writesubtitles',
-help='write video closed captions to a .srt file (currently youtube only)', default=False)
-video_format.add_option('--srt-lang',
-action='store', dest='subtitleslang', metavar='LANG',
-help='language of the closed captions to download (optional) use IETF language tags like \'en\'')
--
-
verbosity.add_option('-q', '--quiet',
-action='store_true', dest='quiet', help='activates quiet mode', default=False)
-verbosity.add_option('-s', '--simulate',
-action='store_true', dest='simulate', help='do not download the video and do not write anything to disk', default=False)
-verbosity.add_option('--skip-download',
-action='store_true', dest='skip_download', help='do not download the video', default=False)
-verbosity.add_option('-g', '--get-url',
-action='store_true', dest='geturl', help='simulate, quiet but print URL', default=False)
-verbosity.add_option('-e', '--get-title',
-action='store_true', dest='gettitle', help='simulate, quiet but print title', default=False)
-verbosity.add_option('--get-thumbnail',
-action='store_true', dest='getthumbnail',
-help='simulate, quiet but print thumbnail URL', default=False)
-verbosity.add_option('--get-description',
-action='store_true', dest='getdescription',
-help='simulate, quiet but print video description', default=False)
-verbosity.add_option('--get-filename',
-action='store_true', dest='getfilename',
-help='simulate, quiet but print output filename', default=False)
-verbosity.add_option('--get-format',
-action='store_true', dest='getformat',
-help='simulate, quiet but print output format', default=False)
-verbosity.add_option('--no-progress',
-action='store_true', dest='noprogress', help='do not print progress bar', default=False)
-verbosity.add_option('--console-title',
-action='store_true', dest='consoletitle',
-help='display progress in console titlebar', default=False)
-verbosity.add_option('-v', '--verbose',
-action='store_true', dest='verbose', help='print various debugging information', default=False)
--
-
filesystem.add_option('-t', '--title',
-action='store_true', dest='usetitle', help='use title in file name', default=False)
-filesystem.add_option('--id',
-action='store_true', dest='useid', help='use video ID in file name', default=False)
-filesystem.add_option('-l', '--literal',
-action='store_true', dest='usetitle', help='[deprecated] alias of --title', default=False)
-filesystem.add_option('-A', '--auto-number',
-action='store_true', dest='autonumber',
-help='number downloaded files starting from 00000', default=False)
-filesystem.add_option('-o', '--output',
-dest='outtmpl', metavar='TEMPLATE', help='output filename template. Use %(title)s to get the title, %(uploader)s for the uploader name, %(autonumber)s to get an automatically incremented number, %(ext)s for the filename extension, %(upload_date)s for the upload date (YYYYMMDD), %(extractor)s for the provider (youtube, metacafe, etc), %(id)s for the video id and %% for a literal percent. Use - to output to stdout. Can also be used to download to a different directory, for example with -o \'/my/downloads/%(uploader)s/%(title)s-%(id)s.%(ext)s\' .')
-filesystem.add_option('--restrict-filenames',
-action='store_true', dest='restrictfilenames',
-help='Restrict filenames to only ASCII characters, and avoid "&" and spaces in filenames', default=False)
-filesystem.add_option('-a', '--batch-file',
-dest='batchfile', metavar='FILE', help='file containing URLs to download (\'-\' for stdin)')
-filesystem.add_option('-w', '--no-overwrites',
-action='store_true', dest='nooverwrites', help='do not overwrite files', default=False)
-filesystem.add_option('-c', '--continue',
-action='store_true', dest='continue_dl', help='resume partially downloaded files', default=True)
-filesystem.add_option('--no-continue',
-action='store_false', dest='continue_dl',
-help='do not resume partially downloaded files (restart from beginning)')
-filesystem.add_option('--cookies',
-dest='cookiefile', metavar='FILE', help='file to read cookies from and dump cookie jar in')
-filesystem.add_option('--no-part',
-action='store_true', dest='nopart', help='do not use .part files', default=False)
-filesystem.add_option('--no-mtime',
-action='store_false', dest='updatetime',
-help='do not use the Last-modified header to set the file modification time', default=True)
-filesystem.add_option('--write-description',
-action='store_true', dest='writedescription',
-help='write video description to a .description file', default=False)
-filesystem.add_option('--write-info-json',
-action='store_true', dest='writeinfojson',
-help='write video metadata to a .info.json file', default=False)
--
-
postproc.add_option('-x', '--extract-audio', action='store_true', dest='extractaudio', default=False,
-help='convert video files to audio-only files (requires ffmpeg or avconv and ffprobe or avprobe)')
-postproc.add_option('--audio-format', metavar='FORMAT', dest='audioformat', default='best',
-help='"best", "aac", "vorbis", "mp3", "m4a", or "wav"; best by default')
-postproc.add_option('--audio-quality', metavar='QUALITY', dest='audioquality', default='5',
-help='ffmpeg/avconv audio quality specification, insert a value between 0 (better) and 9 (worse) for VBR or a specific bitrate like 128K (default 5)')
-postproc.add_option('-k', '--keep-video', action='store_true', dest='keepvideo', default=False,
-help='keeps the video file on disk after the post-processing; the video is erased by default')
--
-
parser.add_option_group(general)
-parser.add_option_group(selection)
-parser.add_option_group(filesystem)
-parser.add_option_group(verbosity)
-parser.add_option_group(video_format)
-parser.add_option_group(authentication)
-parser.add_option_group(postproc)
--
xdg_config_home = os.environ.get('XDG_CONFIG_HOME')
-if xdg_config_home:
-userConf = os.path.join(xdg_config_home, 'youtube-dl.conf')
-else:
-userConf = os.path.join(os.path.expanduser('~'), '.config', 'youtube-dl.conf')
-argv = _readOptions('/etc/youtube-dl.conf') + _readOptions(userConf) + sys.argv[1:]
-opts, args = parser.parse_args(argv)
--
return parser, opts, args
-- -
""" Return a list of an instance of every supported extractor.
-The order does matter; the first extractor matched is the one handling the URL.
-"""
- -YoutubePlaylistIE(),
-YoutubeChannelIE(),
-YoutubeUserIE(),
-YoutubeSearchIE(),
-YoutubeIE(),
-MetacafeIE(),
-DailymotionIE(),
-GoogleSearchIE(),
-PhotobucketIE(),
-YahooIE(),
-YahooSearchIE(),
-DepositFilesIE(),
-FacebookIE(),
-BlipTVUserIE(),
-BlipTVIE(),
-VimeoIE(),
-MyVideoIE(),
-ComedyCentralIE(),
-EscapistIE(),
-CollegeHumorIE(),
-XVideosIE(),
-SoundcloudIE(),
-InfoQIE(),
-MixcloudIE(),
-StanfordOpenClassroomIE(),
-MTVIE(),
-YoukuIE(),
-XNXXIE(),
-GooglePlusIE(),
-ArteTvIE(),
-NBAIE(),
-JustinTVIE(),
-GenericIE()
-]
-- - -
-
# Open appropriate CookieJar
-if opts.cookiefile is None:
-jar = compat_cookiejar.CookieJar()
-else:
-try:
-jar = compat_cookiejar.MozillaCookieJar(opts.cookiefile)
-if os.path.isfile(opts.cookiefile) and os.access(opts.cookiefile, os.R_OK):
-jar.load()
-except (IOError, OSError) as err:
-sys.exit(u'ERROR: unable to open cookie file')
-# Set user agent
-if opts.user_agent is not None:
-std_headers['User-Agent'] = opts.user_agent
--
# Dump user agent
-if opts.dump_user_agent:
-print(std_headers['User-Agent'])
-sys.exit(0)
--
# Batch file verification
-batchurls = []
-if opts.batchfile is not None:
-try:
-if opts.batchfile == '-':
-batchfd = sys.stdin
-else:
-batchfd = open(opts.batchfile, 'r')
-batchurls = batchfd.readlines()
-batchurls = [x.strip() for x in batchurls]
-batchurls = [x for x in batchurls if len(x) > 0 and not re.search(r'^[#/;]', x)]
-except IOError:
-sys.exit(u'ERROR: batch file could not be read')
-all_urls = batchurls + args
-all_urls = [url.strip() for url in all_urls]
--
# General configuration
-cookie_processor = compat_urllib_request.HTTPCookieProcessor(jar)
-proxy_handler = compat_urllib_request.ProxyHandler()
-opener = compat_urllib_request.build_opener(proxy_handler, cookie_processor, YoutubeDLHandler())
-compat_urllib_request.install_opener(opener)
-socket.setdefaulttimeout(300) # 5 minutes should be enough (famous last words)
--
extractors = gen_extractors()
--
if opts.list_extractors:
-for ie in extractors:
-print(ie.IE_NAME + (' (CURRENTLY BROKEN)' if not ie._WORKING else ''))
-matchedUrls = filter(lambda url: ie.suitable(url), all_urls)
-all_urls = filter(lambda url: url not in matchedUrls, all_urls)
-for mu in matchedUrls:
-print(u' ' + mu)
-sys.exit(0)
--
# Conflicting, missing and erroneous options
-if opts.usenetrc and (opts.username is not None or opts.password is not None):
-parser.error(u'using .netrc conflicts with giving username/password')
-if opts.password is not None and opts.username is None:
-parser.error(u'account username missing')
-if opts.outtmpl is not None and (opts.usetitle or opts.autonumber or opts.useid):
-parser.error(u'using output template conflicts with using title, video ID or auto number')
-if opts.usetitle and opts.useid:
-parser.error(u'using title conflicts with using video ID')
-if opts.username is not None and opts.password is None:
-opts.password = getpass.getpass(u'Type account password and press return:')
-if opts.ratelimit is not None:
-numeric_limit = FileDownloader.parse_bytes(opts.ratelimit)
-if numeric_limit is None:
-parser.error(u'invalid rate limit specified')
-opts.ratelimit = numeric_limit
-if opts.retries is not None:
-try:
-opts.retries = int(opts.retries)
-except (TypeError, ValueError) as err:
-parser.error(u'invalid retry count specified')
-if opts.buffersize is not None:
-numeric_buffersize = FileDownloader.parse_bytes(opts.buffersize)
-if numeric_buffersize is None:
-parser.error(u'invalid buffer size specified')
-opts.buffersize = numeric_buffersize
-try:
-opts.playliststart = int(opts.playliststart)
-if opts.playliststart <= 0:
-raise ValueError(u'Playlist start must be positive')
-except (TypeError, ValueError) as err:
-parser.error(u'invalid playlist start number specified')
-try:
-opts.playlistend = int(opts.playlistend)
-if opts.playlistend != -1 and (opts.playlistend <= 0 or opts.playlistend < opts.playliststart):
-raise ValueError(u'Playlist end must be greater than playlist start')
-except (TypeError, ValueError) as err:
-parser.error(u'invalid playlist end number specified')
-if opts.extractaudio:
-if opts.audioformat not in ['best', 'aac', 'mp3', 'vorbis', 'm4a', 'wav']:
-parser.error(u'invalid audio format specified')
-if opts.audioquality:
-opts.audioquality = opts.audioquality.strip('k').strip('K')
-if not opts.audioquality.isdigit():
-parser.error(u'invalid audio quality specified')
--
if sys.version_info < (3,):
-# In Python 2, sys.argv is a bytestring (also note http://bugs.python.org/issue2128 for Windows systems)
-if opts.outtmpl is not None:
-opts.outtmpl = opts.outtmpl.decode(preferredencoding())
-outtmpl =((opts.outtmpl is not None and opts.outtmpl)
-or (opts.format == '-1' and opts.usetitle and u'%(title)s-%(id)s-%(format)s.%(ext)s')
-or (opts.format == '-1' and u'%(id)s-%(format)s.%(ext)s')
-or (opts.usetitle and opts.autonumber and u'%(autonumber)s-%(title)s-%(id)s.%(ext)s')
-or (opts.usetitle and u'%(title)s-%(id)s.%(ext)s')
-or (opts.useid and u'%(id)s.%(ext)s')
-or (opts.autonumber and u'%(autonumber)s-%(id)s.%(ext)s')
-or u'%(id)s.%(ext)s')
-# File downloader
-fd = FileDownloader({
-'usenetrc': opts.usenetrc,
-'username': opts.username,
-'password': opts.password,
-'quiet': (opts.quiet or opts.geturl or opts.gettitle or opts.getthumbnail or opts.getdescription or opts.getfilename or opts.getformat),
-'forceurl': opts.geturl,
-'forcetitle': opts.gettitle,
-'forcethumbnail': opts.getthumbnail,
-'forcedescription': opts.getdescription,
-'forcefilename': opts.getfilename,
-'forceformat': opts.getformat,
-'simulate': opts.simulate,
-'skip_download': (opts.skip_download or opts.simulate or opts.geturl or opts.gettitle or opts.getthumbnail or opts.getdescription or opts.getfilename or opts.getformat),
-'format': opts.format,
-'format_limit': opts.format_limit,
-'listformats': opts.listformats,
-'outtmpl': outtmpl,
-'restrictfilenames': opts.restrictfilenames,
-'ignoreerrors': opts.ignoreerrors,
-'ratelimit': opts.ratelimit,
-'nooverwrites': opts.nooverwrites,
-'retries': opts.retries,
-'buffersize': opts.buffersize,
-'noresizebuffer': opts.noresizebuffer,
-'continuedl': opts.continue_dl,
-'noprogress': opts.noprogress,
-'playliststart': opts.playliststart,
-'playlistend': opts.playlistend,
-'logtostderr': opts.outtmpl == '-',
-'consoletitle': opts.consoletitle,
-'nopart': opts.nopart,
-'updatetime': opts.updatetime,
-'writedescription': opts.writedescription,
-'writeinfojson': opts.writeinfojson,
-'writesubtitles': opts.writesubtitles,
-'subtitleslang': opts.subtitleslang,
-'matchtitle': opts.matchtitle,
-'rejecttitle': opts.rejecttitle,
-'max_downloads': opts.max_downloads,
-'prefer_free_formats': opts.prefer_free_formats,
-'verbose': opts.verbose,
-'test': opts.test,
-})
--
if opts.verbose:
-fd.to_screen(u'[debug] Proxy map: ' + str(proxy_handler.proxies))
--
for extractor in extractors:
-fd.add_info_extractor(extractor)
--
# PostProcessors
-if opts.extractaudio:
-fd.add_post_processor(FFmpegExtractAudioPP(preferredcodec=opts.audioformat, preferredquality=opts.audioquality, keepvideo=opts.keepvideo))
--
# Update version
-if opts.update_self:
-updateSelf(fd, sys.argv[0])
--
# Maybe do nothing
-if len(all_urls) < 1:
-if not opts.update_self:
-parser.error(u'you must provide at least one URL')
-else:
-sys.exit()
--
try:
-retcode = fd.download(all_urls)
-except MaxDownloadsReached:
-fd.to_screen(u'--max-download limit reached, aborting.')
-retcode = 101
--
# Dump cookie jar if requested
-if opts.cookiefile is not None:
- -jar.save()
-except (IOError, OSError) as err:
-sys.exit(u'ERROR: unable to save cookie jar')
--
sys.exit(retcode)
-- - -
_real_main()
-except DownloadError:
-sys.exit(1)
-except SameFileError:
-sys.exit(u'ERROR: fixed output name but more than one file to download')
-except KeyboardInterrupt:
-sys.exit(u'\nERROR: Interrupted by user')
- -