diff options
| -rw-r--r-- | test/test_utils.py | 2 | ||||
| -rw-r--r-- | youtube_dl/compat.py | 2240 | ||||
| -rw-r--r-- | youtube_dl/extractor/audiomack.py | 3 | ||||
| -rw-r--r-- | youtube_dl/extractor/dw.py | 2 | ||||
| -rw-r--r-- | youtube_dl/extractor/extractors.py | 3 | ||||
| -rw-r--r-- | youtube_dl/extractor/generic.py | 35 | ||||
| -rw-r--r-- | youtube_dl/extractor/godtv.py | 66 | ||||
| -rw-r--r-- | youtube_dl/extractor/lynda.py | 131 | ||||
| -rw-r--r-- | youtube_dl/extractor/nbc.py | 22 | ||||
| -rw-r--r-- | youtube_dl/extractor/openload.py | 7 | ||||
| -rw-r--r-- | youtube_dl/extractor/voicerepublic.py | 11 | ||||
| -rw-r--r-- | youtube_dl/extractor/vporn.py | 10 | ||||
| -rw-r--r-- | youtube_dl/extractor/vulture.py | 69 | ||||
| -rw-r--r-- | youtube_dl/extractor/wdr.py | 6 | ||||
| -rw-r--r-- | youtube_dl/extractor/weibo.py | 49 | ||||
| -rw-r--r-- | youtube_dl/extractor/xfileshare.py | 3 | ||||
| -rw-r--r-- | youtube_dl/extractor/xuite.py | 1 | ||||
| -rw-r--r-- | youtube_dl/extractor/yahoo.py | 2 | ||||
| -rw-r--r-- | youtube_dl/extractor/youtube.py | 5 | ||||
| -rw-r--r-- | youtube_dl/utils.py | 12 | 
20 files changed, 2454 insertions, 225 deletions
diff --git a/test/test_utils.py b/test/test_utils.py index feef80465..0e25de6b7 100644 --- a/test/test_utils.py +++ b/test/test_utils.py @@ -249,6 +249,8 @@ class TestUtil(unittest.TestCase):          self.assertEqual(unescapeHTML('/'), '/')          self.assertEqual(unescapeHTML('é'), 'é')          self.assertEqual(unescapeHTML('�'), '�') +        # HTML5 entities +        self.assertEqual(unescapeHTML('.''), '.\'')      def test_date_from_str(self):          self.assertEqual(date_from_str('yesterday'), date_from_str('now-1day')) diff --git a/youtube_dl/compat.py b/youtube_dl/compat.py index e3cab4dd0..67db1c7c6 100644 --- a/youtube_dl/compat.py +++ b/youtube_dl/compat.py @@ -63,6 +63,2244 @@ try:  except ImportError:  # Python 2      import htmlentitydefs as compat_html_entities +try:  # Python >= 3.3 +    compat_html_entities_html5 = compat_html_entities.html5 +except AttributeError: +    # Copied from CPython 3.5.1 html/entities.py +    compat_html_entities_html5 = { +        'Aacute': '\xc1', +        'aacute': '\xe1', +        'Aacute;': '\xc1', +        'aacute;': '\xe1', +        'Abreve;': '\u0102', +        'abreve;': '\u0103', +        'ac;': '\u223e', +        'acd;': '\u223f', +        'acE;': '\u223e\u0333', +        'Acirc': '\xc2', +        'acirc': '\xe2', +        'Acirc;': '\xc2', +        'acirc;': '\xe2', +        'acute': '\xb4', +        'acute;': '\xb4', +        'Acy;': '\u0410', +        'acy;': '\u0430', +        'AElig': '\xc6', +        'aelig': '\xe6', +        'AElig;': '\xc6', +        'aelig;': '\xe6', +        'af;': '\u2061', +        'Afr;': '\U0001d504', +        'afr;': '\U0001d51e', +        'Agrave': '\xc0', +        'agrave': '\xe0', +        'Agrave;': '\xc0', +        'agrave;': '\xe0', +        'alefsym;': '\u2135', +        'aleph;': '\u2135', +        'Alpha;': '\u0391', +        'alpha;': '\u03b1', +        'Amacr;': '\u0100', +        'amacr;': '\u0101', +        'amalg;': '\u2a3f', +        'AMP': '&', +        'amp': '&', +        'AMP;': '&', +        'amp;': '&', +        'And;': '\u2a53', +        'and;': '\u2227', +        'andand;': '\u2a55', +        'andd;': '\u2a5c', +        'andslope;': '\u2a58', +        'andv;': '\u2a5a', +        'ang;': '\u2220', +        'ange;': '\u29a4', +        'angle;': '\u2220', +        'angmsd;': '\u2221', +        'angmsdaa;': '\u29a8', +        'angmsdab;': '\u29a9', +        'angmsdac;': '\u29aa', +        'angmsdad;': '\u29ab', +        'angmsdae;': '\u29ac', +        'angmsdaf;': '\u29ad', +        'angmsdag;': '\u29ae', +        'angmsdah;': '\u29af', +        'angrt;': '\u221f', +        'angrtvb;': '\u22be', +        'angrtvbd;': '\u299d', +        'angsph;': '\u2222', +        'angst;': '\xc5', +        'angzarr;': '\u237c', +        'Aogon;': '\u0104', +        'aogon;': '\u0105', +        'Aopf;': '\U0001d538', +        'aopf;': '\U0001d552', +        'ap;': '\u2248', +        'apacir;': '\u2a6f', +        'apE;': '\u2a70', +        'ape;': '\u224a', +        'apid;': '\u224b', +        'apos;': "'", +        'ApplyFunction;': '\u2061', +        'approx;': '\u2248', +        'approxeq;': '\u224a', +        'Aring': '\xc5', +        'aring': '\xe5', +        'Aring;': '\xc5', +        'aring;': '\xe5', +        'Ascr;': '\U0001d49c', +        'ascr;': '\U0001d4b6', +        'Assign;': '\u2254', +        'ast;': '*', +        'asymp;': '\u2248', +        'asympeq;': '\u224d', +        'Atilde': '\xc3', +        'atilde': '\xe3', +        'Atilde;': '\xc3', +        'atilde;': '\xe3', +        'Auml': '\xc4', +        'auml': '\xe4', +        'Auml;': '\xc4', +        'auml;': '\xe4', +        'awconint;': '\u2233', +        'awint;': '\u2a11', +        'backcong;': '\u224c', +        'backepsilon;': '\u03f6', +        'backprime;': '\u2035', +        'backsim;': '\u223d', +        'backsimeq;': '\u22cd', +        'Backslash;': '\u2216', +        'Barv;': '\u2ae7', +        'barvee;': '\u22bd', +        'Barwed;': '\u2306', +        'barwed;': '\u2305', +        'barwedge;': '\u2305', +        'bbrk;': '\u23b5', +        'bbrktbrk;': '\u23b6', +        'bcong;': '\u224c', +        'Bcy;': '\u0411', +        'bcy;': '\u0431', +        'bdquo;': '\u201e', +        'becaus;': '\u2235', +        'Because;': '\u2235', +        'because;': '\u2235', +        'bemptyv;': '\u29b0', +        'bepsi;': '\u03f6', +        'bernou;': '\u212c', +        'Bernoullis;': '\u212c', +        'Beta;': '\u0392', +        'beta;': '\u03b2', +        'beth;': '\u2136', +        'between;': '\u226c', +        'Bfr;': '\U0001d505', +        'bfr;': '\U0001d51f', +        'bigcap;': '\u22c2', +        'bigcirc;': '\u25ef', +        'bigcup;': '\u22c3', +        'bigodot;': '\u2a00', +        'bigoplus;': '\u2a01', +        'bigotimes;': '\u2a02', +        'bigsqcup;': '\u2a06', +        'bigstar;': '\u2605', +        'bigtriangledown;': '\u25bd', +        'bigtriangleup;': '\u25b3', +        'biguplus;': '\u2a04', +        'bigvee;': '\u22c1', +        'bigwedge;': '\u22c0', +        'bkarow;': '\u290d', +        'blacklozenge;': '\u29eb', +        'blacksquare;': '\u25aa', +        'blacktriangle;': '\u25b4', +        'blacktriangledown;': '\u25be', +        'blacktriangleleft;': '\u25c2', +        'blacktriangleright;': '\u25b8', +        'blank;': '\u2423', +        'blk12;': '\u2592', +        'blk14;': '\u2591', +        'blk34;': '\u2593', +        'block;': '\u2588', +        'bne;': '=\u20e5', +        'bnequiv;': '\u2261\u20e5', +        'bNot;': '\u2aed', +        'bnot;': '\u2310', +        'Bopf;': '\U0001d539', +        'bopf;': '\U0001d553', +        'bot;': '\u22a5', +        'bottom;': '\u22a5', +        'bowtie;': '\u22c8', +        'boxbox;': '\u29c9', +        'boxDL;': '\u2557', +        'boxDl;': '\u2556', +        'boxdL;': '\u2555', +        'boxdl;': '\u2510', +        'boxDR;': '\u2554', +        'boxDr;': '\u2553', +        'boxdR;': '\u2552', +        'boxdr;': '\u250c', +        'boxH;': '\u2550', +        'boxh;': '\u2500', +        'boxHD;': '\u2566', +        'boxHd;': '\u2564', +        'boxhD;': '\u2565', +        'boxhd;': '\u252c', +        'boxHU;': '\u2569', +        'boxHu;': '\u2567', +        'boxhU;': '\u2568', +        'boxhu;': '\u2534', +        'boxminus;': '\u229f', +        'boxplus;': '\u229e', +        'boxtimes;': '\u22a0', +        'boxUL;': '\u255d', +        'boxUl;': '\u255c', +        'boxuL;': '\u255b', +        'boxul;': '\u2518', +        'boxUR;': '\u255a', +        'boxUr;': '\u2559', +        'boxuR;': '\u2558', +        'boxur;': '\u2514', +        'boxV;': '\u2551', +        'boxv;': '\u2502', +        'boxVH;': '\u256c', +        'boxVh;': '\u256b', +        'boxvH;': '\u256a', +        'boxvh;': '\u253c', +        'boxVL;': '\u2563', +        'boxVl;': '\u2562', +        'boxvL;': '\u2561', +        'boxvl;': '\u2524', +        'boxVR;': '\u2560', +        'boxVr;': '\u255f', +        'boxvR;': '\u255e', +        'boxvr;': '\u251c', +        'bprime;': '\u2035', +        'Breve;': '\u02d8', +        'breve;': '\u02d8', +        'brvbar': '\xa6', +        'brvbar;': '\xa6', +        'Bscr;': '\u212c', +        'bscr;': '\U0001d4b7', +        'bsemi;': '\u204f', +        'bsim;': '\u223d', +        'bsime;': '\u22cd', +        'bsol;': '\\', +        'bsolb;': '\u29c5', +        'bsolhsub;': '\u27c8', +        'bull;': '\u2022', +        'bullet;': '\u2022', +        'bump;': '\u224e', +        'bumpE;': '\u2aae', +        'bumpe;': '\u224f', +        'Bumpeq;': '\u224e', +        'bumpeq;': '\u224f', +        'Cacute;': '\u0106', +        'cacute;': '\u0107', +        'Cap;': '\u22d2', +        'cap;': '\u2229', +        'capand;': '\u2a44', +        'capbrcup;': '\u2a49', +        'capcap;': '\u2a4b', +        'capcup;': '\u2a47', +        'capdot;': '\u2a40', +        'CapitalDifferentialD;': '\u2145', +        'caps;': '\u2229\ufe00', +        'caret;': '\u2041', +        'caron;': '\u02c7', +        'Cayleys;': '\u212d', +        'ccaps;': '\u2a4d', +        'Ccaron;': '\u010c', +        'ccaron;': '\u010d', +        'Ccedil': '\xc7', +        'ccedil': '\xe7', +        'Ccedil;': '\xc7', +        'ccedil;': '\xe7', +        'Ccirc;': '\u0108', +        'ccirc;': '\u0109', +        'Cconint;': '\u2230', +        'ccups;': '\u2a4c', +        'ccupssm;': '\u2a50', +        'Cdot;': '\u010a', +        'cdot;': '\u010b', +        'cedil': '\xb8', +        'cedil;': '\xb8', +        'Cedilla;': '\xb8', +        'cemptyv;': '\u29b2', +        'cent': '\xa2', +        'cent;': '\xa2', +        'CenterDot;': '\xb7', +        'centerdot;': '\xb7', +        'Cfr;': '\u212d', +        'cfr;': '\U0001d520', +        'CHcy;': '\u0427', +        'chcy;': '\u0447', +        'check;': '\u2713', +        'checkmark;': '\u2713', +        'Chi;': '\u03a7', +        'chi;': '\u03c7', +        'cir;': '\u25cb', +        'circ;': '\u02c6', +        'circeq;': '\u2257', +        'circlearrowleft;': '\u21ba', +        'circlearrowright;': '\u21bb', +        'circledast;': '\u229b', +        'circledcirc;': '\u229a', +        'circleddash;': '\u229d', +        'CircleDot;': '\u2299', +        'circledR;': '\xae', +        'circledS;': '\u24c8', +        'CircleMinus;': '\u2296', +        'CirclePlus;': '\u2295', +        'CircleTimes;': '\u2297', +        'cirE;': '\u29c3', +        'cire;': '\u2257', +        'cirfnint;': '\u2a10', +        'cirmid;': '\u2aef', +        'cirscir;': '\u29c2', +        'ClockwiseContourIntegral;': '\u2232', +        'CloseCurlyDoubleQuote;': '\u201d', +        'CloseCurlyQuote;': '\u2019', +        'clubs;': '\u2663', +        'clubsuit;': '\u2663', +        'Colon;': '\u2237', +        'colon;': ':', +        'Colone;': '\u2a74', +        'colone;': '\u2254', +        'coloneq;': '\u2254', +        'comma;': ',', +        'commat;': '@', +        'comp;': '\u2201', +        'compfn;': '\u2218', +        'complement;': '\u2201', +        'complexes;': '\u2102', +        'cong;': '\u2245', +        'congdot;': '\u2a6d', +        'Congruent;': '\u2261', +        'Conint;': '\u222f', +        'conint;': '\u222e', +        'ContourIntegral;': '\u222e', +        'Copf;': '\u2102', +        'copf;': '\U0001d554', +        'coprod;': '\u2210', +        'Coproduct;': '\u2210', +        'COPY': '\xa9', +        'copy': '\xa9', +        'COPY;': '\xa9', +        'copy;': '\xa9', +        'copysr;': '\u2117', +        'CounterClockwiseContourIntegral;': '\u2233', +        'crarr;': '\u21b5', +        'Cross;': '\u2a2f', +        'cross;': '\u2717', +        'Cscr;': '\U0001d49e', +        'cscr;': '\U0001d4b8', +        'csub;': '\u2acf', +        'csube;': '\u2ad1', +        'csup;': '\u2ad0', +        'csupe;': '\u2ad2', +        'ctdot;': '\u22ef', +        'cudarrl;': '\u2938', +        'cudarrr;': '\u2935', +        'cuepr;': '\u22de', +        'cuesc;': '\u22df', +        'cularr;': '\u21b6', +        'cularrp;': '\u293d', +        'Cup;': '\u22d3', +        'cup;': '\u222a', +        'cupbrcap;': '\u2a48', +        'CupCap;': '\u224d', +        'cupcap;': '\u2a46', +        'cupcup;': '\u2a4a', +        'cupdot;': '\u228d', +        'cupor;': '\u2a45', +        'cups;': '\u222a\ufe00', +        'curarr;': '\u21b7', +        'curarrm;': '\u293c', +        'curlyeqprec;': '\u22de', +        'curlyeqsucc;': '\u22df', +        'curlyvee;': '\u22ce', +        'curlywedge;': '\u22cf', +        'curren': '\xa4', +        'curren;': '\xa4', +        'curvearrowleft;': '\u21b6', +        'curvearrowright;': '\u21b7', +        'cuvee;': '\u22ce', +        'cuwed;': '\u22cf', +        'cwconint;': '\u2232', +        'cwint;': '\u2231', +        'cylcty;': '\u232d', +        'Dagger;': '\u2021', +        'dagger;': '\u2020', +        'daleth;': '\u2138', +        'Darr;': '\u21a1', +        'dArr;': '\u21d3', +        'darr;': '\u2193', +        'dash;': '\u2010', +        'Dashv;': '\u2ae4', +        'dashv;': '\u22a3', +        'dbkarow;': '\u290f', +        'dblac;': '\u02dd', +        'Dcaron;': '\u010e', +        'dcaron;': '\u010f', +        'Dcy;': '\u0414', +        'dcy;': '\u0434', +        'DD;': '\u2145', +        'dd;': '\u2146', +        'ddagger;': '\u2021', +        'ddarr;': '\u21ca', +        'DDotrahd;': '\u2911', +        'ddotseq;': '\u2a77', +        'deg': '\xb0', +        'deg;': '\xb0', +        'Del;': '\u2207', +        'Delta;': '\u0394', +        'delta;': '\u03b4', +        'demptyv;': '\u29b1', +        'dfisht;': '\u297f', +        'Dfr;': '\U0001d507', +        'dfr;': '\U0001d521', +        'dHar;': '\u2965', +        'dharl;': '\u21c3', +        'dharr;': '\u21c2', +        'DiacriticalAcute;': '\xb4', +        'DiacriticalDot;': '\u02d9', +        'DiacriticalDoubleAcute;': '\u02dd', +        'DiacriticalGrave;': '`', +        'DiacriticalTilde;': '\u02dc', +        'diam;': '\u22c4', +        'Diamond;': '\u22c4', +        'diamond;': '\u22c4', +        'diamondsuit;': '\u2666', +        'diams;': '\u2666', +        'die;': '\xa8', +        'DifferentialD;': '\u2146', +        'digamma;': '\u03dd', +        'disin;': '\u22f2', +        'div;': '\xf7', +        'divide': '\xf7', +        'divide;': '\xf7', +        'divideontimes;': '\u22c7', +        'divonx;': '\u22c7', +        'DJcy;': '\u0402', +        'djcy;': '\u0452', +        'dlcorn;': '\u231e', +        'dlcrop;': '\u230d', +        'dollar;': '$', +        'Dopf;': '\U0001d53b', +        'dopf;': '\U0001d555', +        'Dot;': '\xa8', +        'dot;': '\u02d9', +        'DotDot;': '\u20dc', +        'doteq;': '\u2250', +        'doteqdot;': '\u2251', +        'DotEqual;': '\u2250', +        'dotminus;': '\u2238', +        'dotplus;': '\u2214', +        'dotsquare;': '\u22a1', +        'doublebarwedge;': '\u2306', +        'DoubleContourIntegral;': '\u222f', +        'DoubleDot;': '\xa8', +        'DoubleDownArrow;': '\u21d3', +        'DoubleLeftArrow;': '\u21d0', +        'DoubleLeftRightArrow;': '\u21d4', +        'DoubleLeftTee;': '\u2ae4', +        'DoubleLongLeftArrow;': '\u27f8', +        'DoubleLongLeftRightArrow;': '\u27fa', +        'DoubleLongRightArrow;': '\u27f9', +        'DoubleRightArrow;': '\u21d2', +        'DoubleRightTee;': '\u22a8', +        'DoubleUpArrow;': '\u21d1', +        'DoubleUpDownArrow;': '\u21d5', +        'DoubleVerticalBar;': '\u2225', +        'DownArrow;': '\u2193', +        'Downarrow;': '\u21d3', +        'downarrow;': '\u2193', +        'DownArrowBar;': '\u2913', +        'DownArrowUpArrow;': '\u21f5', +        'DownBreve;': '\u0311', +        'downdownarrows;': '\u21ca', +        'downharpoonleft;': '\u21c3', +        'downharpoonright;': '\u21c2', +        'DownLeftRightVector;': '\u2950', +        'DownLeftTeeVector;': '\u295e', +        'DownLeftVector;': '\u21bd', +        'DownLeftVectorBar;': '\u2956', +        'DownRightTeeVector;': '\u295f', +        'DownRightVector;': '\u21c1', +        'DownRightVectorBar;': '\u2957', +        'DownTee;': '\u22a4', +        'DownTeeArrow;': '\u21a7', +        'drbkarow;': '\u2910', +        'drcorn;': '\u231f', +        'drcrop;': '\u230c', +        'Dscr;': '\U0001d49f', +        'dscr;': '\U0001d4b9', +        'DScy;': '\u0405', +        'dscy;': '\u0455', +        'dsol;': '\u29f6', +        'Dstrok;': '\u0110', +        'dstrok;': '\u0111', +        'dtdot;': '\u22f1', +        'dtri;': '\u25bf', +        'dtrif;': '\u25be', +        'duarr;': '\u21f5', +        'duhar;': '\u296f', +        'dwangle;': '\u29a6', +        'DZcy;': '\u040f', +        'dzcy;': '\u045f', +        'dzigrarr;': '\u27ff', +        'Eacute': '\xc9', +        'eacute': '\xe9', +        'Eacute;': '\xc9', +        'eacute;': '\xe9', +        'easter;': '\u2a6e', +        'Ecaron;': '\u011a', +        'ecaron;': '\u011b', +        'ecir;': '\u2256', +        'Ecirc': '\xca', +        'ecirc': '\xea', +        'Ecirc;': '\xca', +        'ecirc;': '\xea', +        'ecolon;': '\u2255', +        'Ecy;': '\u042d', +        'ecy;': '\u044d', +        'eDDot;': '\u2a77', +        'Edot;': '\u0116', +        'eDot;': '\u2251', +        'edot;': '\u0117', +        'ee;': '\u2147', +        'efDot;': '\u2252', +        'Efr;': '\U0001d508', +        'efr;': '\U0001d522', +        'eg;': '\u2a9a', +        'Egrave': '\xc8', +        'egrave': '\xe8', +        'Egrave;': '\xc8', +        'egrave;': '\xe8', +        'egs;': '\u2a96', +        'egsdot;': '\u2a98', +        'el;': '\u2a99', +        'Element;': '\u2208', +        'elinters;': '\u23e7', +        'ell;': '\u2113', +        'els;': '\u2a95', +        'elsdot;': '\u2a97', +        'Emacr;': '\u0112', +        'emacr;': '\u0113', +        'empty;': '\u2205', +        'emptyset;': '\u2205', +        'EmptySmallSquare;': '\u25fb', +        'emptyv;': '\u2205', +        'EmptyVerySmallSquare;': '\u25ab', +        'emsp13;': '\u2004', +        'emsp14;': '\u2005', +        'emsp;': '\u2003', +        'ENG;': '\u014a', +        'eng;': '\u014b', +        'ensp;': '\u2002', +        'Eogon;': '\u0118', +        'eogon;': '\u0119', +        'Eopf;': '\U0001d53c', +        'eopf;': '\U0001d556', +        'epar;': '\u22d5', +        'eparsl;': '\u29e3', +        'eplus;': '\u2a71', +        'epsi;': '\u03b5', +        'Epsilon;': '\u0395', +        'epsilon;': '\u03b5', +        'epsiv;': '\u03f5', +        'eqcirc;': '\u2256', +        'eqcolon;': '\u2255', +        'eqsim;': '\u2242', +        'eqslantgtr;': '\u2a96', +        'eqslantless;': '\u2a95', +        'Equal;': '\u2a75', +        'equals;': '=', +        'EqualTilde;': '\u2242', +        'equest;': '\u225f', +        'Equilibrium;': '\u21cc', +        'equiv;': '\u2261', +        'equivDD;': '\u2a78', +        'eqvparsl;': '\u29e5', +        'erarr;': '\u2971', +        'erDot;': '\u2253', +        'Escr;': '\u2130', +        'escr;': '\u212f', +        'esdot;': '\u2250', +        'Esim;': '\u2a73', +        'esim;': '\u2242', +        'Eta;': '\u0397', +        'eta;': '\u03b7', +        'ETH': '\xd0', +        'eth': '\xf0', +        'ETH;': '\xd0', +        'eth;': '\xf0', +        'Euml': '\xcb', +        'euml': '\xeb', +        'Euml;': '\xcb', +        'euml;': '\xeb', +        'euro;': '\u20ac', +        'excl;': '!', +        'exist;': '\u2203', +        'Exists;': '\u2203', +        'expectation;': '\u2130', +        'ExponentialE;': '\u2147', +        'exponentiale;': '\u2147', +        'fallingdotseq;': '\u2252', +        'Fcy;': '\u0424', +        'fcy;': '\u0444', +        'female;': '\u2640', +        'ffilig;': '\ufb03', +        'fflig;': '\ufb00', +        'ffllig;': '\ufb04', +        'Ffr;': '\U0001d509', +        'ffr;': '\U0001d523', +        'filig;': '\ufb01', +        'FilledSmallSquare;': '\u25fc', +        'FilledVerySmallSquare;': '\u25aa', +        'fjlig;': 'fj', +        'flat;': '\u266d', +        'fllig;': '\ufb02', +        'fltns;': '\u25b1', +        'fnof;': '\u0192', +        'Fopf;': '\U0001d53d', +        'fopf;': '\U0001d557', +        'ForAll;': '\u2200', +        'forall;': '\u2200', +        'fork;': '\u22d4', +        'forkv;': '\u2ad9', +        'Fouriertrf;': '\u2131', +        'fpartint;': '\u2a0d', +        'frac12': '\xbd', +        'frac12;': '\xbd', +        'frac13;': '\u2153', +        'frac14': '\xbc', +        'frac14;': '\xbc', +        'frac15;': '\u2155', +        'frac16;': '\u2159', +        'frac18;': '\u215b', +        'frac23;': '\u2154', +        'frac25;': '\u2156', +        'frac34': '\xbe', +        'frac34;': '\xbe', +        'frac35;': '\u2157', +        'frac38;': '\u215c', +        'frac45;': '\u2158', +        'frac56;': '\u215a', +        'frac58;': '\u215d', +        'frac78;': '\u215e', +        'frasl;': '\u2044', +        'frown;': '\u2322', +        'Fscr;': '\u2131', +        'fscr;': '\U0001d4bb', +        'gacute;': '\u01f5', +        'Gamma;': '\u0393', +        'gamma;': '\u03b3', +        'Gammad;': '\u03dc', +        'gammad;': '\u03dd', +        'gap;': '\u2a86', +        'Gbreve;': '\u011e', +        'gbreve;': '\u011f', +        'Gcedil;': '\u0122', +        'Gcirc;': '\u011c', +        'gcirc;': '\u011d', +        'Gcy;': '\u0413', +        'gcy;': '\u0433', +        'Gdot;': '\u0120', +        'gdot;': '\u0121', +        'gE;': '\u2267', +        'ge;': '\u2265', +        'gEl;': '\u2a8c', +        'gel;': '\u22db', +        'geq;': '\u2265', +        'geqq;': '\u2267', +        'geqslant;': '\u2a7e', +        'ges;': '\u2a7e', +        'gescc;': '\u2aa9', +        'gesdot;': '\u2a80', +        'gesdoto;': '\u2a82', +        'gesdotol;': '\u2a84', +        'gesl;': '\u22db\ufe00', +        'gesles;': '\u2a94', +        'Gfr;': '\U0001d50a', +        'gfr;': '\U0001d524', +        'Gg;': '\u22d9', +        'gg;': '\u226b', +        'ggg;': '\u22d9', +        'gimel;': '\u2137', +        'GJcy;': '\u0403', +        'gjcy;': '\u0453', +        'gl;': '\u2277', +        'gla;': '\u2aa5', +        'glE;': '\u2a92', +        'glj;': '\u2aa4', +        'gnap;': '\u2a8a', +        'gnapprox;': '\u2a8a', +        'gnE;': '\u2269', +        'gne;': '\u2a88', +        'gneq;': '\u2a88', +        'gneqq;': '\u2269', +        'gnsim;': '\u22e7', +        'Gopf;': '\U0001d53e', +        'gopf;': '\U0001d558', +        'grave;': '`', +        'GreaterEqual;': '\u2265', +        'GreaterEqualLess;': '\u22db', +        'GreaterFullEqual;': '\u2267', +        'GreaterGreater;': '\u2aa2', +        'GreaterLess;': '\u2277', +        'GreaterSlantEqual;': '\u2a7e', +        'GreaterTilde;': '\u2273', +        'Gscr;': '\U0001d4a2', +        'gscr;': '\u210a', +        'gsim;': '\u2273', +        'gsime;': '\u2a8e', +        'gsiml;': '\u2a90', +        'GT': '>', +        'gt': '>', +        'GT;': '>', +        'Gt;': '\u226b', +        'gt;': '>', +        'gtcc;': '\u2aa7', +        'gtcir;': '\u2a7a', +        'gtdot;': '\u22d7', +        'gtlPar;': '\u2995', +        'gtquest;': '\u2a7c', +        'gtrapprox;': '\u2a86', +        'gtrarr;': '\u2978', +        'gtrdot;': '\u22d7', +        'gtreqless;': '\u22db', +        'gtreqqless;': '\u2a8c', +        'gtrless;': '\u2277', +        'gtrsim;': '\u2273', +        'gvertneqq;': '\u2269\ufe00', +        'gvnE;': '\u2269\ufe00', +        'Hacek;': '\u02c7', +        'hairsp;': '\u200a', +        'half;': '\xbd', +        'hamilt;': '\u210b', +        'HARDcy;': '\u042a', +        'hardcy;': '\u044a', +        'hArr;': '\u21d4', +        'harr;': '\u2194', +        'harrcir;': '\u2948', +        'harrw;': '\u21ad', +        'Hat;': '^', +        'hbar;': '\u210f', +        'Hcirc;': '\u0124', +        'hcirc;': '\u0125', +        'hearts;': '\u2665', +        'heartsuit;': '\u2665', +        'hellip;': '\u2026', +        'hercon;': '\u22b9', +        'Hfr;': '\u210c', +        'hfr;': '\U0001d525', +        'HilbertSpace;': '\u210b', +        'hksearow;': '\u2925', +        'hkswarow;': '\u2926', +        'hoarr;': '\u21ff', +        'homtht;': '\u223b', +        'hookleftarrow;': '\u21a9', +        'hookrightarrow;': '\u21aa', +        'Hopf;': '\u210d', +        'hopf;': '\U0001d559', +        'horbar;': '\u2015', +        'HorizontalLine;': '\u2500', +        'Hscr;': '\u210b', +        'hscr;': '\U0001d4bd', +        'hslash;': '\u210f', +        'Hstrok;': '\u0126', +        'hstrok;': '\u0127', +        'HumpDownHump;': '\u224e', +        'HumpEqual;': '\u224f', +        'hybull;': '\u2043', +        'hyphen;': '\u2010', +        'Iacute': '\xcd', +        'iacute': '\xed', +        'Iacute;': '\xcd', +        'iacute;': '\xed', +        'ic;': '\u2063', +        'Icirc': '\xce', +        'icirc': '\xee', +        'Icirc;': '\xce', +        'icirc;': '\xee', +        'Icy;': '\u0418', +        'icy;': '\u0438', +        'Idot;': '\u0130', +        'IEcy;': '\u0415', +        'iecy;': '\u0435', +        'iexcl': '\xa1', +        'iexcl;': '\xa1', +        'iff;': '\u21d4', +        'Ifr;': '\u2111', +        'ifr;': '\U0001d526', +        'Igrave': '\xcc', +        'igrave': '\xec', +        'Igrave;': '\xcc', +        'igrave;': '\xec', +        'ii;': '\u2148', +        'iiiint;': '\u2a0c', +        'iiint;': '\u222d', +        'iinfin;': '\u29dc', +        'iiota;': '\u2129', +        'IJlig;': '\u0132', +        'ijlig;': '\u0133', +        'Im;': '\u2111', +        'Imacr;': '\u012a', +        'imacr;': '\u012b', +        'image;': '\u2111', +        'ImaginaryI;': '\u2148', +        'imagline;': '\u2110', +        'imagpart;': '\u2111', +        'imath;': '\u0131', +        'imof;': '\u22b7', +        'imped;': '\u01b5', +        'Implies;': '\u21d2', +        'in;': '\u2208', +        'incare;': '\u2105', +        'infin;': '\u221e', +        'infintie;': '\u29dd', +        'inodot;': '\u0131', +        'Int;': '\u222c', +        'int;': '\u222b', +        'intcal;': '\u22ba', +        'integers;': '\u2124', +        'Integral;': '\u222b', +        'intercal;': '\u22ba', +        'Intersection;': '\u22c2', +        'intlarhk;': '\u2a17', +        'intprod;': '\u2a3c', +        'InvisibleComma;': '\u2063', +        'InvisibleTimes;': '\u2062', +        'IOcy;': '\u0401', +        'iocy;': '\u0451', +        'Iogon;': '\u012e', +        'iogon;': '\u012f', +        'Iopf;': '\U0001d540', +        'iopf;': '\U0001d55a', +        'Iota;': '\u0399', +        'iota;': '\u03b9', +        'iprod;': '\u2a3c', +        'iquest': '\xbf', +        'iquest;': '\xbf', +        'Iscr;': '\u2110', +        'iscr;': '\U0001d4be', +        'isin;': '\u2208', +        'isindot;': '\u22f5', +        'isinE;': '\u22f9', +        'isins;': '\u22f4', +        'isinsv;': '\u22f3', +        'isinv;': '\u2208', +        'it;': '\u2062', +        'Itilde;': '\u0128', +        'itilde;': '\u0129', +        'Iukcy;': '\u0406', +        'iukcy;': '\u0456', +        'Iuml': '\xcf', +        'iuml': '\xef', +        'Iuml;': '\xcf', +        'iuml;': '\xef', +        'Jcirc;': '\u0134', +        'jcirc;': '\u0135', +        'Jcy;': '\u0419', +        'jcy;': '\u0439', +        'Jfr;': '\U0001d50d', +        'jfr;': '\U0001d527', +        'jmath;': '\u0237', +        'Jopf;': '\U0001d541', +        'jopf;': '\U0001d55b', +        'Jscr;': '\U0001d4a5', +        'jscr;': '\U0001d4bf', +        'Jsercy;': '\u0408', +        'jsercy;': '\u0458', +        'Jukcy;': '\u0404', +        'jukcy;': '\u0454', +        'Kappa;': '\u039a', +        'kappa;': '\u03ba', +        'kappav;': '\u03f0', +        'Kcedil;': '\u0136', +        'kcedil;': '\u0137', +        'Kcy;': '\u041a', +        'kcy;': '\u043a', +        'Kfr;': '\U0001d50e', +        'kfr;': '\U0001d528', +        'kgreen;': '\u0138', +        'KHcy;': '\u0425', +        'khcy;': '\u0445', +        'KJcy;': '\u040c', +        'kjcy;': '\u045c', +        'Kopf;': '\U0001d542', +        'kopf;': '\U0001d55c', +        'Kscr;': '\U0001d4a6', +        'kscr;': '\U0001d4c0', +        'lAarr;': '\u21da', +        'Lacute;': '\u0139', +        'lacute;': '\u013a', +        'laemptyv;': '\u29b4', +        'lagran;': '\u2112', +        'Lambda;': '\u039b', +        'lambda;': '\u03bb', +        'Lang;': '\u27ea', +        'lang;': '\u27e8', +        'langd;': '\u2991', +        'langle;': '\u27e8', +        'lap;': '\u2a85', +        'Laplacetrf;': '\u2112', +        'laquo': '\xab', +        'laquo;': '\xab', +        'Larr;': '\u219e', +        'lArr;': '\u21d0', +        'larr;': '\u2190', +        'larrb;': '\u21e4', +        'larrbfs;': '\u291f', +        'larrfs;': '\u291d', +        'larrhk;': '\u21a9', +        'larrlp;': '\u21ab', +        'larrpl;': '\u2939', +        'larrsim;': '\u2973', +        'larrtl;': '\u21a2', +        'lat;': '\u2aab', +        'lAtail;': '\u291b', +        'latail;': '\u2919', +        'late;': '\u2aad', +        'lates;': '\u2aad\ufe00', +        'lBarr;': '\u290e', +        'lbarr;': '\u290c', +        'lbbrk;': '\u2772', +        'lbrace;': '{', +        'lbrack;': '[', +        'lbrke;': '\u298b', +        'lbrksld;': '\u298f', +        'lbrkslu;': '\u298d', +        'Lcaron;': '\u013d', +        'lcaron;': '\u013e', +        'Lcedil;': '\u013b', +        'lcedil;': '\u013c', +        'lceil;': '\u2308', +        'lcub;': '{', +        'Lcy;': '\u041b', +        'lcy;': '\u043b', +        'ldca;': '\u2936', +        'ldquo;': '\u201c', +        'ldquor;': '\u201e', +        'ldrdhar;': '\u2967', +        'ldrushar;': '\u294b', +        'ldsh;': '\u21b2', +        'lE;': '\u2266', +        'le;': '\u2264', +        'LeftAngleBracket;': '\u27e8', +        'LeftArrow;': '\u2190', +        'Leftarrow;': '\u21d0', +        'leftarrow;': '\u2190', +        'LeftArrowBar;': '\u21e4', +        'LeftArrowRightArrow;': '\u21c6', +        'leftarrowtail;': '\u21a2', +        'LeftCeiling;': '\u2308', +        'LeftDoubleBracket;': '\u27e6', +        'LeftDownTeeVector;': '\u2961', +        'LeftDownVector;': '\u21c3', +        'LeftDownVectorBar;': '\u2959', +        'LeftFloor;': '\u230a', +        'leftharpoondown;': '\u21bd', +        'leftharpoonup;': '\u21bc', +        'leftleftarrows;': '\u21c7', +        'LeftRightArrow;': '\u2194', +        'Leftrightarrow;': '\u21d4', +        'leftrightarrow;': '\u2194', +        'leftrightarrows;': '\u21c6', +        'leftrightharpoons;': '\u21cb', +        'leftrightsquigarrow;': '\u21ad', +        'LeftRightVector;': '\u294e', +        'LeftTee;': '\u22a3', +        'LeftTeeArrow;': '\u21a4', +        'LeftTeeVector;': '\u295a', +        'leftthreetimes;': '\u22cb', +        'LeftTriangle;': '\u22b2', +        'LeftTriangleBar;': '\u29cf', +        'LeftTriangleEqual;': '\u22b4', +        'LeftUpDownVector;': '\u2951', +        'LeftUpTeeVector;': '\u2960', +        'LeftUpVector;': '\u21bf', +        'LeftUpVectorBar;': '\u2958', +        'LeftVector;': '\u21bc', +        'LeftVectorBar;': '\u2952', +        'lEg;': '\u2a8b', +        'leg;': '\u22da', +        'leq;': '\u2264', +        'leqq;': '\u2266', +        'leqslant;': '\u2a7d', +        'les;': '\u2a7d', +        'lescc;': '\u2aa8', +        'lesdot;': '\u2a7f', +        'lesdoto;': '\u2a81', +        'lesdotor;': '\u2a83', +        'lesg;': '\u22da\ufe00', +        'lesges;': '\u2a93', +        'lessapprox;': '\u2a85', +        'lessdot;': '\u22d6', +        'lesseqgtr;': '\u22da', +        'lesseqqgtr;': '\u2a8b', +        'LessEqualGreater;': '\u22da', +        'LessFullEqual;': '\u2266', +        'LessGreater;': '\u2276', +        'lessgtr;': '\u2276', +        'LessLess;': '\u2aa1', +        'lesssim;': '\u2272', +        'LessSlantEqual;': '\u2a7d', +        'LessTilde;': '\u2272', +        'lfisht;': '\u297c', +        'lfloor;': '\u230a', +        'Lfr;': '\U0001d50f', +        'lfr;': '\U0001d529', +        'lg;': '\u2276', +        'lgE;': '\u2a91', +        'lHar;': '\u2962', +        'lhard;': '\u21bd', +        'lharu;': '\u21bc', +        'lharul;': '\u296a', +        'lhblk;': '\u2584', +        'LJcy;': '\u0409', +        'ljcy;': '\u0459', +        'Ll;': '\u22d8', +        'll;': '\u226a', +        'llarr;': '\u21c7', +        'llcorner;': '\u231e', +        'Lleftarrow;': '\u21da', +        'llhard;': '\u296b', +        'lltri;': '\u25fa', +        'Lmidot;': '\u013f', +        'lmidot;': '\u0140', +        'lmoust;': '\u23b0', +        'lmoustache;': '\u23b0', +        'lnap;': '\u2a89', +        'lnapprox;': '\u2a89', +        'lnE;': '\u2268', +        'lne;': '\u2a87', +        'lneq;': '\u2a87', +        'lneqq;': '\u2268', +        'lnsim;': '\u22e6', +        'loang;': '\u27ec', +        'loarr;': '\u21fd', +        'lobrk;': '\u27e6', +        'LongLeftArrow;': '\u27f5', +        'Longleftarrow;': '\u27f8', +        'longleftarrow;': '\u27f5', +        'LongLeftRightArrow;': '\u27f7', +        'Longleftrightarrow;': '\u27fa', +        'longleftrightarrow;': '\u27f7', +        'longmapsto;': '\u27fc', +        'LongRightArrow;': '\u27f6', +        'Longrightarrow;': '\u27f9', +        'longrightarrow;': '\u27f6', +        'looparrowleft;': '\u21ab', +        'looparrowright;': '\u21ac', +        'lopar;': '\u2985', +        'Lopf;': '\U0001d543', +        'lopf;': '\U0001d55d', +        'loplus;': '\u2a2d', +        'lotimes;': '\u2a34', +        'lowast;': '\u2217', +        'lowbar;': '_', +        'LowerLeftArrow;': '\u2199', +        'LowerRightArrow;': '\u2198', +        'loz;': '\u25ca', +        'lozenge;': '\u25ca', +        'lozf;': '\u29eb', +        'lpar;': '(', +        'lparlt;': '\u2993', +        'lrarr;': '\u21c6', +        'lrcorner;': '\u231f', +        'lrhar;': '\u21cb', +        'lrhard;': '\u296d', +        'lrm;': '\u200e', +        'lrtri;': '\u22bf', +        'lsaquo;': '\u2039', +        'Lscr;': '\u2112', +        'lscr;': '\U0001d4c1', +        'Lsh;': '\u21b0', +        'lsh;': '\u21b0', +        'lsim;': '\u2272', +        'lsime;': '\u2a8d', +        'lsimg;': '\u2a8f', +        'lsqb;': '[', +        'lsquo;': '\u2018', +        'lsquor;': '\u201a', +        'Lstrok;': '\u0141', +        'lstrok;': '\u0142', +        'LT': '<', +        'lt': '<', +        'LT;': '<', +        'Lt;': '\u226a', +        'lt;': '<', +        'ltcc;': '\u2aa6', +        'ltcir;': '\u2a79', +        'ltdot;': '\u22d6', +        'lthree;': '\u22cb', +        'ltimes;': '\u22c9', +        'ltlarr;': '\u2976', +        'ltquest;': '\u2a7b', +        'ltri;': '\u25c3', +        'ltrie;': '\u22b4', +        'ltrif;': '\u25c2', +        'ltrPar;': '\u2996', +        'lurdshar;': '\u294a', +        'luruhar;': '\u2966', +        'lvertneqq;': '\u2268\ufe00', +        'lvnE;': '\u2268\ufe00', +        'macr': '\xaf', +        'macr;': '\xaf', +        'male;': '\u2642', +        'malt;': '\u2720', +        'maltese;': '\u2720', +        'Map;': '\u2905', +        'map;': '\u21a6', +        'mapsto;': '\u21a6', +        'mapstodown;': '\u21a7', +        'mapstoleft;': '\u21a4', +        'mapstoup;': '\u21a5', +        'marker;': '\u25ae', +        'mcomma;': '\u2a29', +        'Mcy;': '\u041c', +        'mcy;': '\u043c', +        'mdash;': '\u2014', +        'mDDot;': '\u223a', +        'measuredangle;': '\u2221', +        'MediumSpace;': '\u205f', +        'Mellintrf;': '\u2133', +        'Mfr;': '\U0001d510', +        'mfr;': '\U0001d52a', +        'mho;': '\u2127', +        'micro': '\xb5', +        'micro;': '\xb5', +        'mid;': '\u2223', +        'midast;': '*', +        'midcir;': '\u2af0', +        'middot': '\xb7', +        'middot;': '\xb7', +        'minus;': '\u2212', +        'minusb;': '\u229f', +        'minusd;': '\u2238', +        'minusdu;': '\u2a2a', +        'MinusPlus;': '\u2213', +        'mlcp;': '\u2adb', +        'mldr;': '\u2026', +        'mnplus;': '\u2213', +        'models;': '\u22a7', +        'Mopf;': '\U0001d544', +        'mopf;': '\U0001d55e', +        'mp;': '\u2213', +        'Mscr;': '\u2133', +        'mscr;': '\U0001d4c2', +        'mstpos;': '\u223e', +        'Mu;': '\u039c', +        'mu;': '\u03bc', +        'multimap;': '\u22b8', +        'mumap;': '\u22b8', +        'nabla;': '\u2207', +        'Nacute;': '\u0143', +        'nacute;': '\u0144', +        'nang;': '\u2220\u20d2', +        'nap;': '\u2249', +        'napE;': '\u2a70\u0338', +        'napid;': '\u224b\u0338', +        'napos;': '\u0149', +        'napprox;': '\u2249', +        'natur;': '\u266e', +        'natural;': '\u266e', +        'naturals;': '\u2115', +        'nbsp': '\xa0', +        'nbsp;': '\xa0', +        'nbump;': '\u224e\u0338', +        'nbumpe;': '\u224f\u0338', +        'ncap;': '\u2a43', +        'Ncaron;': '\u0147', +        'ncaron;': '\u0148', +        'Ncedil;': '\u0145', +        'ncedil;': '\u0146', +        'ncong;': '\u2247', +        'ncongdot;': '\u2a6d\u0338', +        'ncup;': '\u2a42', +        'Ncy;': '\u041d', +        'ncy;': '\u043d', +        'ndash;': '\u2013', +        'ne;': '\u2260', +        'nearhk;': '\u2924', +        'neArr;': '\u21d7', +        'nearr;': '\u2197', +        'nearrow;': '\u2197', +        'nedot;': '\u2250\u0338', +        'NegativeMediumSpace;': '\u200b', +        'NegativeThickSpace;': '\u200b', +        'NegativeThinSpace;': '\u200b', +        'NegativeVeryThinSpace;': '\u200b', +        'nequiv;': '\u2262', +        'nesear;': '\u2928', +        'nesim;': '\u2242\u0338', +        'NestedGreaterGreater;': '\u226b', +        'NestedLessLess;': '\u226a', +        'NewLine;': '\n', +        'nexist;': '\u2204', +        'nexists;': '\u2204', +        'Nfr;': '\U0001d511', +        'nfr;': '\U0001d52b', +        'ngE;': '\u2267\u0338', +        'nge;': '\u2271', +        'ngeq;': '\u2271', +        'ngeqq;': '\u2267\u0338', +        'ngeqslant;': '\u2a7e\u0338', +        'nges;': '\u2a7e\u0338', +        'nGg;': '\u22d9\u0338', +        'ngsim;': '\u2275', +        'nGt;': '\u226b\u20d2', +        'ngt;': '\u226f', +        'ngtr;': '\u226f', +        'nGtv;': '\u226b\u0338', +        'nhArr;': '\u21ce', +        'nharr;': '\u21ae', +        'nhpar;': '\u2af2', +        'ni;': '\u220b', +        'nis;': '\u22fc', +        'nisd;': '\u22fa', +        'niv;': '\u220b', +        'NJcy;': '\u040a', +        'njcy;': '\u045a', +        'nlArr;': '\u21cd', +        'nlarr;': '\u219a', +        'nldr;': '\u2025', +        'nlE;': '\u2266\u0338', +        'nle;': '\u2270', +        'nLeftarrow;': '\u21cd', +        'nleftarrow;': '\u219a', +        'nLeftrightarrow;': '\u21ce', +        'nleftrightarrow;': '\u21ae', +        'nleq;': '\u2270', +        'nleqq;': '\u2266\u0338', +        'nleqslant;': '\u2a7d\u0338', +        'nles;': '\u2a7d\u0338', +        'nless;': '\u226e', +        'nLl;': '\u22d8\u0338', +        'nlsim;': '\u2274', +        'nLt;': '\u226a\u20d2', +        'nlt;': '\u226e', +        'nltri;': '\u22ea', +        'nltrie;': '\u22ec', +        'nLtv;': '\u226a\u0338', +        'nmid;': '\u2224', +        'NoBreak;': '\u2060', +        'NonBreakingSpace;': '\xa0', +        'Nopf;': '\u2115', +        'nopf;': '\U0001d55f', +        'not': '\xac', +        'Not;': '\u2aec', +        'not;': '\xac', +        'NotCongruent;': '\u2262', +        'NotCupCap;': '\u226d', +        'NotDoubleVerticalBar;': '\u2226', +        'NotElement;': '\u2209', +        'NotEqual;': '\u2260', +        'NotEqualTilde;': '\u2242\u0338', +        'NotExists;': '\u2204', +        'NotGreater;': '\u226f', +        'NotGreaterEqual;': '\u2271', +        'NotGreaterFullEqual;': '\u2267\u0338', +        'NotGreaterGreater;': '\u226b\u0338', +        'NotGreaterLess;': '\u2279', +        'NotGreaterSlantEqual;': '\u2a7e\u0338', +        'NotGreaterTilde;': '\u2275', +        'NotHumpDownHump;': '\u224e\u0338', +        'NotHumpEqual;': '\u224f\u0338', +        'notin;': '\u2209', +        'notindot;': '\u22f5\u0338', +        'notinE;': '\u22f9\u0338', +        'notinva;': '\u2209', +        'notinvb;': '\u22f7', +        'notinvc;': '\u22f6', +        'NotLeftTriangle;': '\u22ea', +        'NotLeftTriangleBar;': '\u29cf\u0338', +        'NotLeftTriangleEqual;': '\u22ec', +        'NotLess;': '\u226e', +        'NotLessEqual;': '\u2270', +        'NotLessGreater;': '\u2278', +        'NotLessLess;': '\u226a\u0338', +        'NotLessSlantEqual;': '\u2a7d\u0338', +        'NotLessTilde;': '\u2274', +        'NotNestedGreaterGreater;': '\u2aa2\u0338', +        'NotNestedLessLess;': '\u2aa1\u0338', +        'notni;': '\u220c', +        'notniva;': '\u220c', +        'notnivb;': '\u22fe', +        'notnivc;': '\u22fd', +        'NotPrecedes;': '\u2280', +        'NotPrecedesEqual;': '\u2aaf\u0338', +        'NotPrecedesSlantEqual;': '\u22e0', +        'NotReverseElement;': '\u220c', +        'NotRightTriangle;': '\u22eb', +        'NotRightTriangleBar;': '\u29d0\u0338', +        'NotRightTriangleEqual;': '\u22ed', +        'NotSquareSubset;': '\u228f\u0338', +        'NotSquareSubsetEqual;': '\u22e2', +        'NotSquareSuperset;': '\u2290\u0338', +        'NotSquareSupersetEqual;': '\u22e3', +        'NotSubset;': '\u2282\u20d2', +        'NotSubsetEqual;': '\u2288', +        'NotSucceeds;': '\u2281', +        'NotSucceedsEqual;': '\u2ab0\u0338', +        'NotSucceedsSlantEqual;': '\u22e1', +        'NotSucceedsTilde;': '\u227f\u0338', +        'NotSuperset;': '\u2283\u20d2', +        'NotSupersetEqual;': '\u2289', +        'NotTilde;': '\u2241', +        'NotTildeEqual;': '\u2244', +        'NotTildeFullEqual;': '\u2247', +        'NotTildeTilde;': '\u2249', +        'NotVerticalBar;': '\u2224', +        'npar;': '\u2226', +        'nparallel;': '\u2226', +        'nparsl;': '\u2afd\u20e5', +        'npart;': '\u2202\u0338', +        'npolint;': '\u2a14', +        'npr;': '\u2280', +        'nprcue;': '\u22e0', +        'npre;': '\u2aaf\u0338', +        'nprec;': '\u2280', +        'npreceq;': '\u2aaf\u0338', +        'nrArr;': '\u21cf', +        'nrarr;': '\u219b', +        'nrarrc;': '\u2933\u0338', +        'nrarrw;': '\u219d\u0338', +        'nRightarrow;': '\u21cf', +        'nrightarrow;': '\u219b', +        'nrtri;': '\u22eb', +        'nrtrie;': '\u22ed', +        'nsc;': '\u2281', +        'nsccue;': '\u22e1', +        'nsce;': '\u2ab0\u0338', +        'Nscr;': '\U0001d4a9', +        'nscr;': '\U0001d4c3', +        'nshortmid;': '\u2224', +        'nshortparallel;': '\u2226', +        'nsim;': '\u2241', +        'nsime;': '\u2244', +        'nsimeq;': '\u2244', +        'nsmid;': '\u2224', +        'nspar;': '\u2226', +        'nsqsube;': '\u22e2', +        'nsqsupe;': '\u22e3', +        'nsub;': '\u2284', +        'nsubE;': '\u2ac5\u0338', +        'nsube;': '\u2288', +        'nsubset;': '\u2282\u20d2', +        'nsubseteq;': '\u2288', +        'nsubseteqq;': '\u2ac5\u0338', +        'nsucc;': '\u2281', +        'nsucceq;': '\u2ab0\u0338', +        'nsup;': '\u2285', +        'nsupE;': '\u2ac6\u0338', +        'nsupe;': '\u2289', +        'nsupset;': '\u2283\u20d2', +        'nsupseteq;': '\u2289', +        'nsupseteqq;': '\u2ac6\u0338', +        'ntgl;': '\u2279', +        'Ntilde': '\xd1', +        'ntilde': '\xf1', +        'Ntilde;': '\xd1', +        'ntilde;': '\xf1', +        'ntlg;': '\u2278', +        'ntriangleleft;': '\u22ea', +        'ntrianglelefteq;': '\u22ec', +        'ntriangleright;': '\u22eb', +        'ntrianglerighteq;': '\u22ed', +        'Nu;': '\u039d', +        'nu;': '\u03bd', +        'num;': '#', +        'numero;': '\u2116', +        'numsp;': '\u2007', +        'nvap;': '\u224d\u20d2', +        'nVDash;': '\u22af', +        'nVdash;': '\u22ae', +        'nvDash;': '\u22ad', +        'nvdash;': '\u22ac', +        'nvge;': '\u2265\u20d2', +        'nvgt;': '>\u20d2', +        'nvHarr;': '\u2904', +        'nvinfin;': '\u29de', +        'nvlArr;': '\u2902', +        'nvle;': '\u2264\u20d2', +        'nvlt;': '<\u20d2', +        'nvltrie;': '\u22b4\u20d2', +        'nvrArr;': '\u2903', +        'nvrtrie;': '\u22b5\u20d2', +        'nvsim;': '\u223c\u20d2', +        'nwarhk;': '\u2923', +        'nwArr;': '\u21d6', +        'nwarr;': '\u2196', +        'nwarrow;': '\u2196', +        'nwnear;': '\u2927', +        'Oacute': '\xd3', +        'oacute': '\xf3', +        'Oacute;': '\xd3', +        'oacute;': '\xf3', +        'oast;': '\u229b', +        'ocir;': '\u229a', +        'Ocirc': '\xd4', +        'ocirc': '\xf4', +        'Ocirc;': '\xd4', +        'ocirc;': '\xf4', +        'Ocy;': '\u041e', +        'ocy;': '\u043e', +        'odash;': '\u229d', +        'Odblac;': '\u0150', +        'odblac;': '\u0151', +        'odiv;': '\u2a38', +        'odot;': '\u2299', +        'odsold;': '\u29bc', +        'OElig;': '\u0152', +        'oelig;': '\u0153', +        'ofcir;': '\u29bf', +        'Ofr;': '\U0001d512', +        'ofr;': '\U0001d52c', +        'ogon;': '\u02db', +        'Ograve': '\xd2', +        'ograve': '\xf2', +        'Ograve;': '\xd2', +        'ograve;': '\xf2', +        'ogt;': '\u29c1', +        'ohbar;': '\u29b5', +        'ohm;': '\u03a9', +        'oint;': '\u222e', +        'olarr;': '\u21ba', +        'olcir;': '\u29be', +        'olcross;': '\u29bb', +        'oline;': '\u203e', +        'olt;': '\u29c0', +        'Omacr;': '\u014c', +        'omacr;': '\u014d', +        'Omega;': '\u03a9', +        'omega;': '\u03c9', +        'Omicron;': '\u039f', +        'omicron;': '\u03bf', +        'omid;': '\u29b6', +        'ominus;': '\u2296', +        'Oopf;': '\U0001d546', +        'oopf;': '\U0001d560', +        'opar;': '\u29b7', +        'OpenCurlyDoubleQuote;': '\u201c', +        'OpenCurlyQuote;': '\u2018', +        'operp;': '\u29b9', +        'oplus;': '\u2295', +        'Or;': '\u2a54', +        'or;': '\u2228', +        'orarr;': '\u21bb', +        'ord;': '\u2a5d', +        'order;': '\u2134', +        'orderof;': '\u2134', +        'ordf': '\xaa', +        'ordf;': '\xaa', +        'ordm': '\xba', +        'ordm;': '\xba', +        'origof;': '\u22b6', +        'oror;': '\u2a56', +        'orslope;': '\u2a57', +        'orv;': '\u2a5b', +        'oS;': '\u24c8', +        'Oscr;': '\U0001d4aa', +        'oscr;': '\u2134', +        'Oslash': '\xd8', +        'oslash': '\xf8', +        'Oslash;': '\xd8', +        'oslash;': '\xf8', +        'osol;': '\u2298', +        'Otilde': '\xd5', +        'otilde': '\xf5', +        'Otilde;': '\xd5', +        'otilde;': '\xf5', +        'Otimes;': '\u2a37', +        'otimes;': '\u2297', +        'otimesas;': '\u2a36', +        'Ouml': '\xd6', +        'ouml': '\xf6', +        'Ouml;': '\xd6', +        'ouml;': '\xf6', +        'ovbar;': '\u233d', +        'OverBar;': '\u203e', +        'OverBrace;': '\u23de', +        'OverBracket;': '\u23b4', +        'OverParenthesis;': '\u23dc', +        'par;': '\u2225', +        'para': '\xb6', +        'para;': '\xb6', +        'parallel;': '\u2225', +        'parsim;': '\u2af3', +        'parsl;': '\u2afd', +        'part;': '\u2202', +        'PartialD;': '\u2202', +        'Pcy;': '\u041f', +        'pcy;': '\u043f', +        'percnt;': '%', +        'period;': '.', +        'permil;': '\u2030', +        'perp;': '\u22a5', +        'pertenk;': '\u2031', +        'Pfr;': '\U0001d513', +        'pfr;': '\U0001d52d', +        'Phi;': '\u03a6', +        'phi;': '\u03c6', +        'phiv;': '\u03d5', +        'phmmat;': '\u2133', +        'phone;': '\u260e', +        'Pi;': '\u03a0', +        'pi;': '\u03c0', +        'pitchfork;': '\u22d4', +        'piv;': '\u03d6', +        'planck;': '\u210f', +        'planckh;': '\u210e', +        'plankv;': '\u210f', +        'plus;': '+', +        'plusacir;': '\u2a23', +        'plusb;': '\u229e', +        'pluscir;': '\u2a22', +        'plusdo;': '\u2214', +        'plusdu;': '\u2a25', +        'pluse;': '\u2a72', +        'PlusMinus;': '\xb1', +        'plusmn': '\xb1', +        'plusmn;': '\xb1', +        'plussim;': '\u2a26', +        'plustwo;': '\u2a27', +        'pm;': '\xb1', +        'Poincareplane;': '\u210c', +        'pointint;': '\u2a15', +        'Popf;': '\u2119', +        'popf;': '\U0001d561', +        'pound': '\xa3', +        'pound;': '\xa3', +        'Pr;': '\u2abb', +        'pr;': '\u227a', +        'prap;': '\u2ab7', +        'prcue;': '\u227c', +        'prE;': '\u2ab3', +        'pre;': '\u2aaf', +        'prec;': '\u227a', +        'precapprox;': '\u2ab7', +        'preccurlyeq;': '\u227c', +        'Precedes;': '\u227a', +        'PrecedesEqual;': '\u2aaf', +        'PrecedesSlantEqual;': '\u227c', +        'PrecedesTilde;': '\u227e', +        'preceq;': '\u2aaf', +        'precnapprox;': '\u2ab9', +        'precneqq;': '\u2ab5', +        'precnsim;': '\u22e8', +        'precsim;': '\u227e', +        'Prime;': '\u2033', +        'prime;': '\u2032', +        'primes;': '\u2119', +        'prnap;': '\u2ab9', +        'prnE;': '\u2ab5', +        'prnsim;': '\u22e8', +        'prod;': '\u220f', +        'Product;': '\u220f', +        'profalar;': '\u232e', +        'profline;': '\u2312', +        'profsurf;': '\u2313', +        'prop;': '\u221d', +        'Proportion;': '\u2237', +        'Proportional;': '\u221d', +        'propto;': '\u221d', +        'prsim;': '\u227e', +        'prurel;': '\u22b0', +        'Pscr;': '\U0001d4ab', +        'pscr;': '\U0001d4c5', +        'Psi;': '\u03a8', +        'psi;': '\u03c8', +        'puncsp;': '\u2008', +        'Qfr;': '\U0001d514', +        'qfr;': '\U0001d52e', +        'qint;': '\u2a0c', +        'Qopf;': '\u211a', +        'qopf;': '\U0001d562', +        'qprime;': '\u2057', +        'Qscr;': '\U0001d4ac', +        'qscr;': '\U0001d4c6', +        'quaternions;': '\u210d', +        'quatint;': '\u2a16', +        'quest;': '?', +        'questeq;': '\u225f', +        'QUOT': '"', +        'quot': '"', +        'QUOT;': '"', +        'quot;': '"', +        'rAarr;': '\u21db', +        'race;': '\u223d\u0331', +        'Racute;': '\u0154', +        'racute;': '\u0155', +        'radic;': '\u221a', +        'raemptyv;': '\u29b3', +        'Rang;': '\u27eb', +        'rang;': '\u27e9', +        'rangd;': '\u2992', +        'range;': '\u29a5', +        'rangle;': '\u27e9', +        'raquo': '\xbb', +        'raquo;': '\xbb', +        'Rarr;': '\u21a0', +        'rArr;': '\u21d2', +        'rarr;': '\u2192', +        'rarrap;': '\u2975', +        'rarrb;': '\u21e5', +        'rarrbfs;': '\u2920', +        'rarrc;': '\u2933', +        'rarrfs;': '\u291e', +        'rarrhk;': '\u21aa', +        'rarrlp;': '\u21ac', +        'rarrpl;': '\u2945', +        'rarrsim;': '\u2974', +        'Rarrtl;': '\u2916', +        'rarrtl;': '\u21a3', +        'rarrw;': '\u219d', +        'rAtail;': '\u291c', +        'ratail;': '\u291a', +        'ratio;': '\u2236', +        'rationals;': '\u211a', +        'RBarr;': '\u2910', +        'rBarr;': '\u290f', +        'rbarr;': '\u290d', +        'rbbrk;': '\u2773', +        'rbrace;': '}', +        'rbrack;': ']', +        'rbrke;': '\u298c', +        'rbrksld;': '\u298e', +        'rbrkslu;': '\u2990', +        'Rcaron;': '\u0158', +        'rcaron;': '\u0159', +        'Rcedil;': '\u0156', +        'rcedil;': '\u0157', +        'rceil;': '\u2309', +        'rcub;': '}', +        'Rcy;': '\u0420', +        'rcy;': '\u0440', +        'rdca;': '\u2937', +        'rdldhar;': '\u2969', +        'rdquo;': '\u201d', +        'rdquor;': '\u201d', +        'rdsh;': '\u21b3', +        'Re;': '\u211c', +        'real;': '\u211c', +        'realine;': '\u211b', +        'realpart;': '\u211c', +        'reals;': '\u211d', +        'rect;': '\u25ad', +        'REG': '\xae', +        'reg': '\xae', +        'REG;': '\xae', +        'reg;': '\xae', +        'ReverseElement;': '\u220b', +        'ReverseEquilibrium;': '\u21cb', +        'ReverseUpEquilibrium;': '\u296f', +        'rfisht;': '\u297d', +        'rfloor;': '\u230b', +        'Rfr;': '\u211c', +        'rfr;': '\U0001d52f', +        'rHar;': '\u2964', +        'rhard;': '\u21c1', +        'rharu;': '\u21c0', +        'rharul;': '\u296c', +        'Rho;': '\u03a1', +        'rho;': '\u03c1', +        'rhov;': '\u03f1', +        'RightAngleBracket;': '\u27e9', +        'RightArrow;': '\u2192', +        'Rightarrow;': '\u21d2', +        'rightarrow;': '\u2192', +        'RightArrowBar;': '\u21e5', +        'RightArrowLeftArrow;': '\u21c4', +        'rightarrowtail;': '\u21a3', +        'RightCeiling;': '\u2309', +        'RightDoubleBracket;': '\u27e7', +        'RightDownTeeVector;': '\u295d', +        'RightDownVector;': '\u21c2', +        'RightDownVectorBar;': '\u2955', +        'RightFloor;': '\u230b', +        'rightharpoondown;': '\u21c1', +        'rightharpoonup;': '\u21c0', +        'rightleftarrows;': '\u21c4', +        'rightleftharpoons;': '\u21cc', +        'rightrightarrows;': '\u21c9', +        'rightsquigarrow;': '\u219d', +        'RightTee;': '\u22a2', +        'RightTeeArrow;': '\u21a6', +        'RightTeeVector;': '\u295b', +        'rightthreetimes;': '\u22cc', +        'RightTriangle;': '\u22b3', +        'RightTriangleBar;': '\u29d0', +        'RightTriangleEqual;': '\u22b5', +        'RightUpDownVector;': '\u294f', +        'RightUpTeeVector;': '\u295c', +        'RightUpVector;': '\u21be', +        'RightUpVectorBar;': '\u2954', +        'RightVector;': '\u21c0', +        'RightVectorBar;': '\u2953', +        'ring;': '\u02da', +        'risingdotseq;': '\u2253', +        'rlarr;': '\u21c4', +        'rlhar;': '\u21cc', +        'rlm;': '\u200f', +        'rmoust;': '\u23b1', +        'rmoustache;': '\u23b1', +        'rnmid;': '\u2aee', +        'roang;': '\u27ed', +        'roarr;': '\u21fe', +        'robrk;': '\u27e7', +        'ropar;': '\u2986', +        'Ropf;': '\u211d', +        'ropf;': '\U0001d563', +        'roplus;': '\u2a2e', +        'rotimes;': '\u2a35', +        'RoundImplies;': '\u2970', +        'rpar;': ')', +        'rpargt;': '\u2994', +        'rppolint;': '\u2a12', +        'rrarr;': '\u21c9', +        'Rrightarrow;': '\u21db', +        'rsaquo;': '\u203a', +        'Rscr;': '\u211b', +        'rscr;': '\U0001d4c7', +        'Rsh;': '\u21b1', +        'rsh;': '\u21b1', +        'rsqb;': ']', +        'rsquo;': '\u2019', +        'rsquor;': '\u2019', +        'rthree;': '\u22cc', +        'rtimes;': '\u22ca', +        'rtri;': '\u25b9', +        'rtrie;': '\u22b5', +        'rtrif;': '\u25b8', +        'rtriltri;': '\u29ce', +        'RuleDelayed;': '\u29f4', +        'ruluhar;': '\u2968', +        'rx;': '\u211e', +        'Sacute;': '\u015a', +        'sacute;': '\u015b', +        'sbquo;': '\u201a', +        'Sc;': '\u2abc', +        'sc;': '\u227b', +        'scap;': '\u2ab8', +        'Scaron;': '\u0160', +        'scaron;': '\u0161', +        'sccue;': '\u227d', +        'scE;': '\u2ab4', +        'sce;': '\u2ab0', +        'Scedil;': '\u015e', +        'scedil;': '\u015f', +        'Scirc;': '\u015c', +        'scirc;': '\u015d', +        'scnap;': '\u2aba', +        'scnE;': '\u2ab6', +        'scnsim;': '\u22e9', +        'scpolint;': '\u2a13', +        'scsim;': '\u227f', +        'Scy;': '\u0421', +        'scy;': '\u0441', +        'sdot;': '\u22c5', +        'sdotb;': '\u22a1', +        'sdote;': '\u2a66', +        'searhk;': '\u2925', +        'seArr;': '\u21d8', +        'searr;': '\u2198', +        'searrow;': '\u2198', +        'sect': '\xa7', +        'sect;': '\xa7', +        'semi;': ';', +        'seswar;': '\u2929', +        'setminus;': '\u2216', +        'setmn;': '\u2216', +        'sext;': '\u2736', +        'Sfr;': '\U0001d516', +        'sfr;': '\U0001d530', +        'sfrown;': '\u2322', +        'sharp;': '\u266f', +        'SHCHcy;': '\u0429', +        'shchcy;': '\u0449', +        'SHcy;': '\u0428', +        'shcy;': '\u0448', +        'ShortDownArrow;': '\u2193', +        'ShortLeftArrow;': '\u2190', +        'shortmid;': '\u2223', +        'shortparallel;': '\u2225', +        'ShortRightArrow;': '\u2192', +        'ShortUpArrow;': '\u2191', +        'shy': '\xad', +        'shy;': '\xad', +        'Sigma;': '\u03a3', +        'sigma;': '\u03c3', +        'sigmaf;': '\u03c2', +        'sigmav;': '\u03c2', +        'sim;': '\u223c', +        'simdot;': '\u2a6a', +        'sime;': '\u2243', +        'simeq;': '\u2243', +        'simg;': '\u2a9e', +        'simgE;': '\u2aa0', +        'siml;': '\u2a9d', +        'simlE;': '\u2a9f', +        'simne;': '\u2246', +        'simplus;': '\u2a24', +        'simrarr;': '\u2972', +        'slarr;': '\u2190', +        'SmallCircle;': '\u2218', +        'smallsetminus;': '\u2216', +        'smashp;': '\u2a33', +        'smeparsl;': '\u29e4', +        'smid;': '\u2223', +        'smile;': '\u2323', +        'smt;': '\u2aaa', +        'smte;': '\u2aac', +        'smtes;': '\u2aac\ufe00', +        'SOFTcy;': '\u042c', +        'softcy;': '\u044c', +        'sol;': '/', +        'solb;': '\u29c4', +        'solbar;': '\u233f', +        'Sopf;': '\U0001d54a', +        'sopf;': '\U0001d564', +        'spades;': '\u2660', +        'spadesuit;': '\u2660', +        'spar;': '\u2225', +        'sqcap;': '\u2293', +        'sqcaps;': '\u2293\ufe00', +        'sqcup;': '\u2294', +        'sqcups;': '\u2294\ufe00', +        'Sqrt;': '\u221a', +        'sqsub;': '\u228f', +        'sqsube;': '\u2291', +        'sqsubset;': '\u228f', +        'sqsubseteq;': '\u2291', +        'sqsup;': '\u2290', +        'sqsupe;': '\u2292', +        'sqsupset;': '\u2290', +        'sqsupseteq;': '\u2292', +        'squ;': '\u25a1', +        'Square;': '\u25a1', +        'square;': '\u25a1', +        'SquareIntersection;': '\u2293', +        'SquareSubset;': '\u228f', +        'SquareSubsetEqual;': '\u2291', +        'SquareSuperset;': '\u2290', +        'SquareSupersetEqual;': '\u2292', +        'SquareUnion;': '\u2294', +        'squarf;': '\u25aa', +        'squf;': '\u25aa', +        'srarr;': '\u2192', +        'Sscr;': '\U0001d4ae', +        'sscr;': '\U0001d4c8', +        'ssetmn;': '\u2216', +        'ssmile;': '\u2323', +        'sstarf;': '\u22c6', +        'Star;': '\u22c6', +        'star;': '\u2606', +        'starf;': '\u2605', +        'straightepsilon;': '\u03f5', +        'straightphi;': '\u03d5', +        'strns;': '\xaf', +        'Sub;': '\u22d0', +        'sub;': '\u2282', +        'subdot;': '\u2abd', +        'subE;': '\u2ac5', +        'sube;': '\u2286', +        'subedot;': '\u2ac3', +        'submult;': '\u2ac1', +        'subnE;': '\u2acb', +        'subne;': '\u228a', +        'subplus;': '\u2abf', +        'subrarr;': '\u2979', +        'Subset;': '\u22d0', +        'subset;': '\u2282', +        'subseteq;': '\u2286', +        'subseteqq;': '\u2ac5', +        'SubsetEqual;': '\u2286', +        'subsetneq;': '\u228a', +        'subsetneqq;': '\u2acb', +        'subsim;': '\u2ac7', +        'subsub;': '\u2ad5', +        'subsup;': '\u2ad3', +        'succ;': '\u227b', +        'succapprox;': '\u2ab8', +        'succcurlyeq;': '\u227d', +        'Succeeds;': '\u227b', +        'SucceedsEqual;': '\u2ab0', +        'SucceedsSlantEqual;': '\u227d', +        'SucceedsTilde;': '\u227f', +        'succeq;': '\u2ab0', +        'succnapprox;': '\u2aba', +        'succneqq;': '\u2ab6', +        'succnsim;': '\u22e9', +        'succsim;': '\u227f', +        'SuchThat;': '\u220b', +        'Sum;': '\u2211', +        'sum;': '\u2211', +        'sung;': '\u266a', +        'sup1': '\xb9', +        'sup1;': '\xb9', +        'sup2': '\xb2', +        'sup2;': '\xb2', +        'sup3': '\xb3', +        'sup3;': '\xb3', +        'Sup;': '\u22d1', +        'sup;': '\u2283', +        'supdot;': '\u2abe', +        'supdsub;': '\u2ad8', +        'supE;': '\u2ac6', +        'supe;': '\u2287', +        'supedot;': '\u2ac4', +        'Superset;': '\u2283', +        'SupersetEqual;': '\u2287', +        'suphsol;': '\u27c9', +        'suphsub;': '\u2ad7', +        'suplarr;': '\u297b', +        'supmult;': '\u2ac2', +        'supnE;': '\u2acc', +        'supne;': '\u228b', +        'supplus;': '\u2ac0', +        'Supset;': '\u22d1', +        'supset;': '\u2283', +        'supseteq;': '\u2287', +        'supseteqq;': '\u2ac6', +        'supsetneq;': '\u228b', +        'supsetneqq;': '\u2acc', +        'supsim;': '\u2ac8', +        'supsub;': '\u2ad4', +        'supsup;': '\u2ad6', +        'swarhk;': '\u2926', +        'swArr;': '\u21d9', +        'swarr;': '\u2199', +        'swarrow;': '\u2199', +        'swnwar;': '\u292a', +        'szlig': '\xdf', +        'szlig;': '\xdf', +        'Tab;': '\t', +        'target;': '\u2316', +        'Tau;': '\u03a4', +        'tau;': '\u03c4', +        'tbrk;': '\u23b4', +        'Tcaron;': '\u0164', +        'tcaron;': '\u0165', +        'Tcedil;': '\u0162', +        'tcedil;': '\u0163', +        'Tcy;': '\u0422', +        'tcy;': '\u0442', +        'tdot;': '\u20db', +        'telrec;': '\u2315', +        'Tfr;': '\U0001d517', +        'tfr;': '\U0001d531', +        'there4;': '\u2234', +        'Therefore;': '\u2234', +        'therefore;': '\u2234', +        'Theta;': '\u0398', +        'theta;': '\u03b8', +        'thetasym;': '\u03d1', +        'thetav;': '\u03d1', +        'thickapprox;': '\u2248', +        'thicksim;': '\u223c', +        'ThickSpace;': '\u205f\u200a', +        'thinsp;': '\u2009', +        'ThinSpace;': '\u2009', +        'thkap;': '\u2248', +        'thksim;': '\u223c', +        'THORN': '\xde', +        'thorn': '\xfe', +        'THORN;': '\xde', +        'thorn;': '\xfe', +        'Tilde;': '\u223c', +        'tilde;': '\u02dc', +        'TildeEqual;': '\u2243', +        'TildeFullEqual;': '\u2245', +        'TildeTilde;': '\u2248', +        'times': '\xd7', +        'times;': '\xd7', +        'timesb;': '\u22a0', +        'timesbar;': '\u2a31', +        'timesd;': '\u2a30', +        'tint;': '\u222d', +        'toea;': '\u2928', +        'top;': '\u22a4', +        'topbot;': '\u2336', +        'topcir;': '\u2af1', +        'Topf;': '\U0001d54b', +        'topf;': '\U0001d565', +        'topfork;': '\u2ada', +        'tosa;': '\u2929', +        'tprime;': '\u2034', +        'TRADE;': '\u2122', +        'trade;': '\u2122', +        'triangle;': '\u25b5', +        'triangledown;': '\u25bf', +        'triangleleft;': '\u25c3', +        'trianglelefteq;': '\u22b4', +        'triangleq;': '\u225c', +        'triangleright;': '\u25b9', +        'trianglerighteq;': '\u22b5', +        'tridot;': '\u25ec', +        'trie;': '\u225c', +        'triminus;': '\u2a3a', +        'TripleDot;': '\u20db', +        'triplus;': '\u2a39', +        'trisb;': '\u29cd', +        'tritime;': '\u2a3b', +        'trpezium;': '\u23e2', +        'Tscr;': '\U0001d4af', +        'tscr;': '\U0001d4c9', +        'TScy;': '\u0426', +        'tscy;': '\u0446', +        'TSHcy;': '\u040b', +        'tshcy;': '\u045b', +        'Tstrok;': '\u0166', +        'tstrok;': '\u0167', +        'twixt;': '\u226c', +        'twoheadleftarrow;': '\u219e', +        'twoheadrightarrow;': '\u21a0', +        'Uacute': '\xda', +        'uacute': '\xfa', +        'Uacute;': '\xda', +        'uacute;': '\xfa', +        'Uarr;': '\u219f', +        'uArr;': '\u21d1', +        'uarr;': '\u2191', +        'Uarrocir;': '\u2949', +        'Ubrcy;': '\u040e', +        'ubrcy;': '\u045e', +        'Ubreve;': '\u016c', +        'ubreve;': '\u016d', +        'Ucirc': '\xdb', +        'ucirc': '\xfb', +        'Ucirc;': '\xdb', +        'ucirc;': '\xfb', +        'Ucy;': '\u0423', +        'ucy;': '\u0443', +        'udarr;': '\u21c5', +        'Udblac;': '\u0170', +        'udblac;': '\u0171', +        'udhar;': '\u296e', +        'ufisht;': '\u297e', +        'Ufr;': '\U0001d518', +        'ufr;': '\U0001d532', +        'Ugrave': '\xd9', +        'ugrave': '\xf9', +        'Ugrave;': '\xd9', +        'ugrave;': '\xf9', +        'uHar;': '\u2963', +        'uharl;': '\u21bf', +        'uharr;': '\u21be', +        'uhblk;': '\u2580', +        'ulcorn;': '\u231c', +        'ulcorner;': '\u231c', +        'ulcrop;': '\u230f', +        'ultri;': '\u25f8', +        'Umacr;': '\u016a', +        'umacr;': '\u016b', +        'uml': '\xa8', +        'uml;': '\xa8', +        'UnderBar;': '_', +        'UnderBrace;': '\u23df', +        'UnderBracket;': '\u23b5', +        'UnderParenthesis;': '\u23dd', +        'Union;': '\u22c3', +        'UnionPlus;': '\u228e', +        'Uogon;': '\u0172', +        'uogon;': '\u0173', +        'Uopf;': '\U0001d54c', +        'uopf;': '\U0001d566', +        'UpArrow;': '\u2191', +        'Uparrow;': '\u21d1', +        'uparrow;': '\u2191', +        'UpArrowBar;': '\u2912', +        'UpArrowDownArrow;': '\u21c5', +        'UpDownArrow;': '\u2195', +        'Updownarrow;': '\u21d5', +        'updownarrow;': '\u2195', +        'UpEquilibrium;': '\u296e', +        'upharpoonleft;': '\u21bf', +        'upharpoonright;': '\u21be', +        'uplus;': '\u228e', +        'UpperLeftArrow;': '\u2196', +        'UpperRightArrow;': '\u2197', +        'Upsi;': '\u03d2', +        'upsi;': '\u03c5', +        'upsih;': '\u03d2', +        'Upsilon;': '\u03a5', +        'upsilon;': '\u03c5', +        'UpTee;': '\u22a5', +        'UpTeeArrow;': '\u21a5', +        'upuparrows;': '\u21c8', +        'urcorn;': '\u231d', +        'urcorner;': '\u231d', +        'urcrop;': '\u230e', +        'Uring;': '\u016e', +        'uring;': '\u016f', +        'urtri;': '\u25f9', +        'Uscr;': '\U0001d4b0', +        'uscr;': '\U0001d4ca', +        'utdot;': '\u22f0', +        'Utilde;': '\u0168', +        'utilde;': '\u0169', +        'utri;': '\u25b5', +        'utrif;': '\u25b4', +        'uuarr;': '\u21c8', +        'Uuml': '\xdc', +        'uuml': '\xfc', +        'Uuml;': '\xdc', +        'uuml;': '\xfc', +        'uwangle;': '\u29a7', +        'vangrt;': '\u299c', +        'varepsilon;': '\u03f5', +        'varkappa;': '\u03f0', +        'varnothing;': '\u2205', +        'varphi;': '\u03d5', +        'varpi;': '\u03d6', +        'varpropto;': '\u221d', +        'vArr;': '\u21d5', +        'varr;': '\u2195', +        'varrho;': '\u03f1', +        'varsigma;': '\u03c2', +        'varsubsetneq;': '\u228a\ufe00', +        'varsubsetneqq;': '\u2acb\ufe00', +        'varsupsetneq;': '\u228b\ufe00', +        'varsupsetneqq;': '\u2acc\ufe00', +        'vartheta;': '\u03d1', +        'vartriangleleft;': '\u22b2', +        'vartriangleright;': '\u22b3', +        'Vbar;': '\u2aeb', +        'vBar;': '\u2ae8', +        'vBarv;': '\u2ae9', +        'Vcy;': '\u0412', +        'vcy;': '\u0432', +        'VDash;': '\u22ab', +        'Vdash;': '\u22a9', +        'vDash;': '\u22a8', +        'vdash;': '\u22a2', +        'Vdashl;': '\u2ae6', +        'Vee;': '\u22c1', +        'vee;': '\u2228', +        'veebar;': '\u22bb', +        'veeeq;': '\u225a', +        'vellip;': '\u22ee', +        'Verbar;': '\u2016', +        'verbar;': '|', +        'Vert;': '\u2016', +        'vert;': '|', +        'VerticalBar;': '\u2223', +        'VerticalLine;': '|', +        'VerticalSeparator;': '\u2758', +        'VerticalTilde;': '\u2240', +        'VeryThinSpace;': '\u200a', +        'Vfr;': '\U0001d519', +        'vfr;': '\U0001d533', +        'vltri;': '\u22b2', +        'vnsub;': '\u2282\u20d2', +        'vnsup;': '\u2283\u20d2', +        'Vopf;': '\U0001d54d', +        'vopf;': '\U0001d567', +        'vprop;': '\u221d', +        'vrtri;': '\u22b3', +        'Vscr;': '\U0001d4b1', +        'vscr;': '\U0001d4cb', +        'vsubnE;': '\u2acb\ufe00', +        'vsubne;': '\u228a\ufe00', +        'vsupnE;': '\u2acc\ufe00', +        'vsupne;': '\u228b\ufe00', +        'Vvdash;': '\u22aa', +        'vzigzag;': '\u299a', +        'Wcirc;': '\u0174', +        'wcirc;': '\u0175', +        'wedbar;': '\u2a5f', +        'Wedge;': '\u22c0', +        'wedge;': '\u2227', +        'wedgeq;': '\u2259', +        'weierp;': '\u2118', +        'Wfr;': '\U0001d51a', +        'wfr;': '\U0001d534', +        'Wopf;': '\U0001d54e', +        'wopf;': '\U0001d568', +        'wp;': '\u2118', +        'wr;': '\u2240', +        'wreath;': '\u2240', +        'Wscr;': '\U0001d4b2', +        'wscr;': '\U0001d4cc', +        'xcap;': '\u22c2', +        'xcirc;': '\u25ef', +        'xcup;': '\u22c3', +        'xdtri;': '\u25bd', +        'Xfr;': '\U0001d51b', +        'xfr;': '\U0001d535', +        'xhArr;': '\u27fa', +        'xharr;': '\u27f7', +        'Xi;': '\u039e', +        'xi;': '\u03be', +        'xlArr;': '\u27f8', +        'xlarr;': '\u27f5', +        'xmap;': '\u27fc', +        'xnis;': '\u22fb', +        'xodot;': '\u2a00', +        'Xopf;': '\U0001d54f', +        'xopf;': '\U0001d569', +        'xoplus;': '\u2a01', +        'xotime;': '\u2a02', +        'xrArr;': '\u27f9', +        'xrarr;': '\u27f6', +        'Xscr;': '\U0001d4b3', +        'xscr;': '\U0001d4cd', +        'xsqcup;': '\u2a06', +        'xuplus;': '\u2a04', +        'xutri;': '\u25b3', +        'xvee;': '\u22c1', +        'xwedge;': '\u22c0', +        'Yacute': '\xdd', +        'yacute': '\xfd', +        'Yacute;': '\xdd', +        'yacute;': '\xfd', +        'YAcy;': '\u042f', +        'yacy;': '\u044f', +        'Ycirc;': '\u0176', +        'ycirc;': '\u0177', +        'Ycy;': '\u042b', +        'ycy;': '\u044b', +        'yen': '\xa5', +        'yen;': '\xa5', +        'Yfr;': '\U0001d51c', +        'yfr;': '\U0001d536', +        'YIcy;': '\u0407', +        'yicy;': '\u0457', +        'Yopf;': '\U0001d550', +        'yopf;': '\U0001d56a', +        'Yscr;': '\U0001d4b4', +        'yscr;': '\U0001d4ce', +        'YUcy;': '\u042e', +        'yucy;': '\u044e', +        'yuml': '\xff', +        'Yuml;': '\u0178', +        'yuml;': '\xff', +        'Zacute;': '\u0179', +        'zacute;': '\u017a', +        'Zcaron;': '\u017d', +        'zcaron;': '\u017e', +        'Zcy;': '\u0417', +        'zcy;': '\u0437', +        'Zdot;': '\u017b', +        'zdot;': '\u017c', +        'zeetrf;': '\u2128', +        'ZeroWidthSpace;': '\u200b', +        'Zeta;': '\u0396', +        'zeta;': '\u03b6', +        'Zfr;': '\u2128', +        'zfr;': '\U0001d537', +        'ZHcy;': '\u0416', +        'zhcy;': '\u0436', +        'zigrarr;': '\u21dd', +        'Zopf;': '\u2124', +        'zopf;': '\U0001d56b', +        'Zscr;': '\U0001d4b5', +        'zscr;': '\U0001d4cf', +        'zwj;': '\u200d', +        'zwnj;': '\u200c', +    } +  try:      import http.client as compat_http_client  except ImportError:  # Python 2 @@ -83,7 +2321,6 @@ try:  except ImportError:  # Python 2      from HTMLParser import HTMLParser as compat_HTMLParser -  try:      from subprocess import DEVNULL      compat_subprocess_get_DEVNULL = lambda: DEVNULL @@ -626,6 +2863,7 @@ __all__ = [      'compat_getenv',      'compat_getpass',      'compat_html_entities', +    'compat_html_entities_html5',      'compat_http_client',      'compat_http_server',      'compat_input', diff --git a/youtube_dl/extractor/audiomack.py b/youtube_dl/extractor/audiomack.py index a52d26cec..f3bd4d444 100644 --- a/youtube_dl/extractor/audiomack.py +++ b/youtube_dl/extractor/audiomack.py @@ -6,6 +6,7 @@ import time  from .common import InfoExtractor  from .soundcloud import SoundcloudIE +from ..compat import compat_str  from ..utils import (      ExtractorError,      url_basename, @@ -136,7 +137,7 @@ class AudiomackAlbumIE(InfoExtractor):                          result[resultkey] = api_response[apikey]                  song_id = url_basename(api_response['url']).rpartition('.')[0]                  result['entries'].append({ -                    'id': api_response.get('id', song_id), +                    'id': compat_str(api_response.get('id', song_id)),                      'uploader': api_response.get('artist'),                      'title': api_response.get('title', song_id),                      'url': api_response['url'], diff --git a/youtube_dl/extractor/dw.py b/youtube_dl/extractor/dw.py index 0f0f0b8d3..d740652f1 100644 --- a/youtube_dl/extractor/dw.py +++ b/youtube_dl/extractor/dw.py @@ -35,6 +35,7 @@ class DWIE(InfoExtractor):              'upload_date': '20160311',          }      }, { +        # DW documentaries, only last for one or two weeks          'url': 'http://www.dw.com/en/documentaries-welcome-to-the-90s-2016-05-21/e-19220158-9798',          'md5': '56b6214ef463bfb9a3b71aeb886f3cf1',          'info_dict': { @@ -44,6 +45,7 @@ class DWIE(InfoExtractor):              'description': 'Welcome to the 90s - The Golden Decade of Hip Hop',              'upload_date': '20160521',          }, +        'skip': 'Video removed',      }]      def _real_extract(self, url): diff --git a/youtube_dl/extractor/extractors.py b/youtube_dl/extractor/extractors.py index aa98782a5..38708294a 100644 --- a/youtube_dl/extractor/extractors.py +++ b/youtube_dl/extractor/extractors.py @@ -292,6 +292,7 @@ from .globo import (      GloboArticleIE,  )  from .godtube import GodTubeIE +from .godtv import GodTVIE  from .goldenmoustache import GoldenMoustacheIE  from .golem import GolemIE  from .googledrive import GoogleDriveIE @@ -957,7 +958,6 @@ from .vporn import VpornIE  from .vrt import VRTIE  from .vube import VubeIE  from .vuclip import VuClipIE -from .vulture import VultureIE  from .walla import WallaIE  from .washingtonpost import (      WashingtonPostIE, @@ -973,7 +973,6 @@ from .webofstories import (      WebOfStoriesIE,      WebOfStoriesPlaylistIE,  ) -from .weibo import WeiboIE  from .weiqitv import WeiqiTVIE  from .wimp import WimpIE  from .wistia import WistiaIE diff --git a/youtube_dl/extractor/generic.py b/youtube_dl/extractor/generic.py index 90575ab0e..ef18ce3dc 100644 --- a/youtube_dl/extractor/generic.py +++ b/youtube_dl/extractor/generic.py @@ -627,13 +627,13 @@ class GenericIE(InfoExtractor):          },          # MTVSercices embed          { -            'url': 'http://www.gametrailers.com/news-post/76093/north-america-europe-is-getting-that-mario-kart-8-mercedes-dlc-too', -            'md5': '35727f82f58c76d996fc188f9755b0d5', +            'url': 'http://www.vulture.com/2016/06/new-key-peele-sketches-released.html', +            'md5': 'ca1aef97695ef2c1d6973256a57e5252',              'info_dict': { -                'id': '0306a69b-8adf-4fb5-aace-75f8e8cbfca9', +                'id': '769f7ec0-0692-4d62-9b45-0d88074bffc1',                  'ext': 'mp4', -                'title': 'Review', -                'description': 'Mario\'s life in the fast lane has never looked so good.', +                'title': 'Key and Peele|October 10, 2012|2|203|Liam Neesons - Uncensored', +                'description': 'Two valets share their love for movie star Liam Neesons.',              },          },          # YouTube embed via <data-embed-url=""> @@ -1032,6 +1032,17 @@ class GenericIE(InfoExtractor):                  'timestamp': 1389118457,              },          }, +        # NBC News embed +        { +            'url': 'http://www.vulture.com/2016/06/letterman-couldnt-care-less-about-late-night.html', +            'md5': '1aa589c675898ae6d37a17913cf68d66', +            'info_dict': { +                'id': '701714499682', +                'ext': 'mp4', +                'title': 'PREVIEW: On Assignment: David Letterman', +                'description': 'A preview of Tom Brokaw\'s interview with David Letterman as part of the On Assignment series powered by Dateline. Airs Sunday June 12 at 7/6c.', +            }, +        },          # UDN embed          {              'url': 'https://video.udn.com/news/300346', @@ -1846,14 +1857,6 @@ class GenericIE(InfoExtractor):              url = unescapeHTML(mobj.group('url'))              return self.url_result(url) -        # Look for embedded vulture.com player -        mobj = re.search( -            r'<iframe src="(?P<url>https?://video\.vulture\.com/[^"]+)"', -            webpage) -        if mobj is not None: -            url = unescapeHTML(mobj.group('url')) -            return self.url_result(url, ie='Vulture') -          # Look for embedded mtvservices player          mtvservices_url = MTVServicesEmbeddedIE._extract_url(webpage)          if mtvservices_url: @@ -1966,6 +1969,12 @@ class GenericIE(InfoExtractor):          if nbc_sports_url:              return self.url_result(nbc_sports_url, 'NBCSportsVPlayer') +        # Look for NBC News embeds +        nbc_news_embed_url = re.search( +            r'<iframe[^>]+src=(["\'])(?P<url>(?:https?:)?//www\.nbcnews\.com/widget/video-embed/[^"\']+)\1', webpage) +        if nbc_news_embed_url: +            return self.url_result(nbc_news_embed_url.group('url'), 'NBCNews') +          # Look for Google Drive embeds          google_drive_url = GoogleDriveIE._extract_url(webpage)          if google_drive_url: diff --git a/youtube_dl/extractor/godtv.py b/youtube_dl/extractor/godtv.py new file mode 100644 index 000000000..c5d3b4e6a --- /dev/null +++ b/youtube_dl/extractor/godtv.py @@ -0,0 +1,66 @@ +from __future__ import unicode_literals + +from .common import InfoExtractor +from .ooyala import OoyalaIE +from ..utils import js_to_json + + +class GodTVIE(InfoExtractor): +    _VALID_URL = r'https?://(?:www\.)?god\.tv(?:/[^/]+)*/(?P<id>[^/?#&]+)' +    _TESTS = [{ +        'url': 'http://god.tv/jesus-image/video/jesus-conference-2016/randy-needham', +        'info_dict': { +            'id': 'lpd3g2MzE6D1g8zFAKz8AGpxWcpu6o_3', +            'ext': 'mp4', +            'title': 'Randy Needham', +            'duration': 3615.08, +        }, +        'params': { +            'skip_download': True, +        } +    }, { +        'url': 'http://god.tv/playlist/bible-study', +        'info_dict': { +            'id': 'bible-study', +        }, +        'playlist_mincount': 37, +    }, { +        'url': 'http://god.tv/node/15097', +        'only_matching': True, +    }, { +        'url': 'http://god.tv/live/africa', +        'only_matching': True, +    }, { +        'url': 'http://god.tv/liveevents', +        'only_matching': True, +    }] + +    def _real_extract(self, url): +        display_id = self._match_id(url) + +        webpage = self._download_webpage(url, display_id) + +        settings = self._parse_json( +            self._search_regex( +                r'jQuery\.extend\(Drupal\.settings\s*,\s*({.+?})\);', +                webpage, 'settings', default='{}'), +            display_id, transform_source=js_to_json, fatal=False) + +        ooyala_id = None + +        if settings: +            playlist = settings.get('playlist') +            if playlist and isinstance(playlist, list): +                entries = [ +                    OoyalaIE._build_url_result(video['content_id']) +                    for video in playlist if video.get('content_id')] +                if entries: +                    return self.playlist_result(entries, display_id) +            ooyala_id = settings.get('ooyala', {}).get('content_id') + +        if not ooyala_id: +            ooyala_id = self._search_regex( +                r'["\']content_id["\']\s*:\s*(["\'])(?P<id>[\w-]+)\1', +                webpage, 'ooyala id', group='id') + +        return OoyalaIE._build_url_result(ooyala_id) diff --git a/youtube_dl/extractor/lynda.py b/youtube_dl/extractor/lynda.py index c1bca5678..5b458d9bc 100644 --- a/youtube_dl/extractor/lynda.py +++ b/youtube_dl/extractor/lynda.py @@ -1,93 +1,94 @@  from __future__ import unicode_literals  import re -import json  from .common import InfoExtractor -from ..compat import compat_str +from ..compat import ( +    compat_HTTPError, +    compat_str, +    compat_urlparse, +)  from ..utils import (      ExtractorError, -    clean_html,      int_or_none, -    sanitized_Request,      urlencode_postdata,  )  class LyndaBaseIE(InfoExtractor): -    _LOGIN_URL = 'https://www.lynda.com/login/login.aspx' +    _SIGNIN_URL = 'https://www.lynda.com/signin' +    _PASSWORD_URL = 'https://www.lynda.com/signin/password' +    _USER_URL = 'https://www.lynda.com/signin/user'      _ACCOUNT_CREDENTIALS_HINT = 'Use --username and --password options to provide lynda.com account credentials.'      _NETRC_MACHINE = 'lynda'      def _real_initialize(self):          self._login() +    @staticmethod +    def _check_error(json_string, key_or_keys): +        keys = [key_or_keys] if isinstance(key_or_keys, compat_str) else key_or_keys +        for key in keys: +            error = json_string.get(key) +            if error: +                raise ExtractorError('Unable to login: %s' % error, expected=True) + +    def _login_step(self, form_html, fallback_action_url, extra_form_data, note, referrer_url): +        action_url = self._search_regex( +            r'<form[^>]+action=(["\'])(?P<url>.+?)\1', form_html, +            'post url', default=fallback_action_url, group='url') + +        if not action_url.startswith('http'): +            action_url = compat_urlparse.urljoin(self._SIGNIN_URL, action_url) + +        form_data = self._hidden_inputs(form_html) +        form_data.update(extra_form_data) + +        try: +            response = self._download_json( +                action_url, None, note, +                data=urlencode_postdata(form_data), +                headers={ +                    'Referer': referrer_url, +                    'X-Requested-With': 'XMLHttpRequest', +                }) +        except ExtractorError as e: +            if isinstance(e.cause, compat_HTTPError) and e.cause.code == 500: +                response = self._parse_json(e.cause.read().decode('utf-8'), None) +                self._check_error(response, ('email', 'password')) +            raise + +        self._check_error(response, 'ErrorMessage') + +        return response, action_url +      def _login(self):          username, password = self._get_login_info()          if username is None:              return -        login_form = { -            'username': username, -            'password': password, -            'remember': 'false', -            'stayPut': 'false' -        } -        request = sanitized_Request( -            self._LOGIN_URL, urlencode_postdata(login_form)) -        login_page = self._download_webpage( -            request, None, 'Logging in as %s' % username) - -        # Not (yet) logged in -        m = re.search(r'loginResultJson\s*=\s*\'(?P<json>[^\']+)\';', login_page) -        if m is not None: -            response = m.group('json') -            response_json = json.loads(response) -            state = response_json['state'] - -            if state == 'notlogged': -                raise ExtractorError( -                    'Unable to login, incorrect username and/or password', -                    expected=True) - -            # This is when we get popup: -            # > You're already logged in to lynda.com on two devices. -            # > If you log in here, we'll log you out of another device. -            # So, we need to confirm this. -            if state == 'conflicted': -                confirm_form = { -                    'username': '', -                    'password': '', -                    'resolve': 'true', -                    'remember': 'false', -                    'stayPut': 'false', -                } -                request = sanitized_Request( -                    self._LOGIN_URL, urlencode_postdata(confirm_form)) -                login_page = self._download_webpage( -                    request, None, -                    'Confirming log in and log out from another device') - -        if all(not re.search(p, login_page) for p in ('isLoggedIn\s*:\s*true', r'logout\.aspx', r'>Log out<')): -            if 'login error' in login_page: -                mobj = re.search( -                    r'(?s)<h1[^>]+class="topmost">(?P<title>[^<]+)</h1>\s*<div>(?P<description>.+?)</div>', -                    login_page) -                if mobj: -                    raise ExtractorError( -                        'lynda returned error: %s - %s' -                        % (mobj.group('title'), clean_html(mobj.group('description'))), -                        expected=True) -            raise ExtractorError('Unable to log in') - -    def _logout(self): -        username, _ = self._get_login_info() -        if username is None: +        # Step 1: download signin page +        signin_page = self._download_webpage( +            self._SIGNIN_URL, None, 'Downloading signin page') + +        # Already logged in +        if any(re.search(p, signin_page) for p in ( +                'isLoggedIn\s*:\s*true', r'logout\.aspx', r'>Log out<')):              return -        self._download_webpage( -            'http://www.lynda.com/ajax/logout.aspx', None, -            'Logging out', 'Unable to log out', fatal=False) +        # Step 2: submit email +        signin_form = self._search_regex( +            r'(?s)(<form[^>]+data-form-name=["\']signin["\'][^>]*>.+?</form>)', +            signin_page, 'signin form') +        signin_page, signin_url = self._login_step( +            signin_form, self._PASSWORD_URL, {'email': username}, +            'Submitting email', self._SIGNIN_URL) + +        # Step 3: submit password +        password_form = signin_page['body'] +        self._login_step( +            password_form, self._USER_URL, {'email': username, 'password': password}, +            'Submitting password', signin_url)  class LyndaIE(LyndaBaseIE): @@ -212,8 +213,6 @@ class LyndaCourseIE(LyndaBaseIE):              'http://www.lynda.com/ajax/player?courseId=%s&type=course' % course_id,              course_id, 'Downloading course JSON') -        self._logout() -          if course.get('Status') == 'NotFound':              raise ExtractorError(                  'Course %s does not exist' % course_id, expected=True) diff --git a/youtube_dl/extractor/nbc.py b/youtube_dl/extractor/nbc.py index f27c7f139..6b7da1149 100644 --- a/youtube_dl/extractor/nbc.py +++ b/youtube_dl/extractor/nbc.py @@ -266,6 +266,11 @@ class NBCNewsIE(ThePlatformIE):              'url': 'http://www.nbcnews.com/watch/dateline/full-episode--deadly-betrayal-386250819952',              'only_matching': True,          }, +        { +            # From http://www.vulture.com/2016/06/letterman-couldnt-care-less-about-late-night.html +            'url': 'http://www.nbcnews.com/widget/video-embed/701714499682', +            'only_matching': True, +        },      ]      def _real_extract(self, url): @@ -289,18 +294,17 @@ class NBCNewsIE(ThePlatformIE):              webpage = self._download_webpage(url, display_id)              info = None              bootstrap_json = self._search_regex( -                r'(?m)var\s+(?:bootstrapJson|playlistData)\s*=\s*({.+});?\s*$', +                [r'(?m)(?:var\s+(?:bootstrapJson|playlistData)|NEWS\.videoObj)\s*=\s*({.+});?\s*$', +                 r'videoObj\s*:\s*({.+})', r'data-video="([^"]+)"'],                  webpage, 'bootstrap json', default=None) -            if bootstrap_json: -                bootstrap = self._parse_json(bootstrap_json, display_id) +            bootstrap = self._parse_json( +                bootstrap_json, display_id, transform_source=unescapeHTML) +            if 'results' in bootstrap:                  info = bootstrap['results'][0]['video'] +            elif 'video' in bootstrap: +                info = bootstrap['video']              else: -                player_instance_json = self._search_regex( -                    r'videoObj\s*:\s*({.+})', webpage, 'player instance', default=None) -                if not player_instance_json: -                    player_instance_json = self._html_search_regex( -                        r'data-video="([^"]+)"', webpage, 'video json') -                info = self._parse_json(player_instance_json, display_id) +                info = bootstrap              video_id = info['mpxId']              title = info['title'] diff --git a/youtube_dl/extractor/openload.py b/youtube_dl/extractor/openload.py index 5049b870e..6415b8fdc 100644 --- a/youtube_dl/extractor/openload.py +++ b/youtube_dl/extractor/openload.py @@ -14,7 +14,7 @@ from ..utils import (  class OpenloadIE(InfoExtractor): -    _VALID_URL = r'https://openload.(?:co|io)/(?:f|embed)/(?P<id>[a-zA-Z0-9-]+)' +    _VALID_URL = r'https://openload.(?:co|io)/(?:f|embed)/(?P<id>[a-zA-Z0-9-_]+)'      _TESTS = [{          'url': 'https://openload.co/f/kUEfGclsU9o', @@ -32,6 +32,9 @@ class OpenloadIE(InfoExtractor):          'url': 'https://openload.io/f/ZAn6oz-VZGE/',          'only_matching': True,      }, { +        'url': 'https://openload.co/f/_-ztPaZtMhM/', +        'only_matching': True, +    }, {          # unavailable via https://openload.co/f/Sxz5sADo82g/, different layout          # for title and ext          'url': 'https://openload.co/embed/Sxz5sADo82g/', @@ -100,7 +103,7 @@ class OpenloadIE(InfoExtractor):              raise ExtractorError('File not found', expected=True)          code = self._search_regex( -            r'</video>\s*</div>\s*<script[^>]+>([^<]+)</script>', +            r'</video>\s*</div>\s*<script[^>]+>[^>]+</script>\s*<script[^>]+>([^<]+)</script>',              webpage, 'JS code')          decoded = self.openload_decode(code) diff --git a/youtube_dl/extractor/voicerepublic.py b/youtube_dl/extractor/voicerepublic.py index 93d15a556..4f1a99a89 100644 --- a/youtube_dl/extractor/voicerepublic.py +++ b/youtube_dl/extractor/voicerepublic.py @@ -3,7 +3,10 @@ from __future__ import unicode_literals  import re  from .common import InfoExtractor -from ..compat import compat_urlparse +from ..compat import ( +    compat_str, +    compat_urlparse, +)  from ..utils import (      ExtractorError,      determine_ext, @@ -16,13 +19,13 @@ class VoiceRepublicIE(InfoExtractor):      _VALID_URL = r'https?://voicerepublic\.com/(?:talks|embed)/(?P<id>[0-9a-z-]+)'      _TESTS = [{          'url': 'http://voicerepublic.com/talks/watching-the-watchers-building-a-sousveillance-state', -        'md5': '0554a24d1657915aa8e8f84e15dc9353', +        'md5': 'b9174d651323f17783000876347116e3',          'info_dict': {              'id': '2296',              'display_id': 'watching-the-watchers-building-a-sousveillance-state',              'ext': 'm4a',              'title': 'Watching the Watchers: Building a Sousveillance State', -            'description': 'md5:715ba964958afa2398df615809cfecb1', +            'description': 'Secret surveillance programs have metadata too. The people and companies that operate secret surveillance programs can be surveilled.',              'thumbnail': 're:^https?://.*\.(?:png|jpg)$',              'duration': 1800,              'view_count': int, @@ -52,7 +55,7 @@ class VoiceRepublicIE(InfoExtractor):          if data:              title = data['title']              description = data.get('teaser') -            talk_id = data.get('talk_id') or display_id +            talk_id = compat_str(data.get('talk_id') or display_id)              talk = data['talk']              duration = int_or_none(talk.get('duration'))              formats = [{ diff --git a/youtube_dl/extractor/vporn.py b/youtube_dl/extractor/vporn.py index 92c90e517..1557a0e04 100644 --- a/youtube_dl/extractor/vporn.py +++ b/youtube_dl/extractor/vporn.py @@ -4,6 +4,7 @@ import re  from .common import InfoExtractor  from ..utils import ( +    ExtractorError,      parse_duration,      str_to_int,  ) @@ -27,7 +28,8 @@ class VpornIE(InfoExtractor):                  'duration': 393,                  'age_limit': 18,                  'view_count': int, -            } +            }, +            'skip': 'video removed',          },          {              'url': 'http://www.vporn.com/female/hana-shower/523564/', @@ -40,7 +42,7 @@ class VpornIE(InfoExtractor):                  'description': 'Hana showers at the bathroom.',                  'thumbnail': 're:^https?://.*\.jpg$',                  'uploader': 'Hmmmmm', -                'categories': ['Big Boobs', 'Erotic', 'Teen', 'Female'], +                'categories': ['Big Boobs', 'Erotic', 'Teen', 'Female', '720p'],                  'duration': 588,                  'age_limit': 18,                  'view_count': int, @@ -55,6 +57,10 @@ class VpornIE(InfoExtractor):          webpage = self._download_webpage(url, display_id) +        errmsg = 'This video has been deleted due to Copyright Infringement or by the account owner!' +        if errmsg in webpage: +            raise ExtractorError('%s said: %s' % (self.IE_NAME, errmsg), expected=True) +          title = self._html_search_regex(              r'videoname\s*=\s*\'([^\']+)\'', webpage, 'title').strip()          description = self._html_search_regex( diff --git a/youtube_dl/extractor/vulture.py b/youtube_dl/extractor/vulture.py deleted file mode 100644 index faa167e65..000000000 --- a/youtube_dl/extractor/vulture.py +++ /dev/null @@ -1,69 +0,0 @@ -from __future__ import unicode_literals - -import json -import os.path -import re - -from .common import InfoExtractor -from ..utils import ( -    int_or_none, -    parse_iso8601, -) - - -class VultureIE(InfoExtractor): -    IE_NAME = 'vulture.com' -    _VALID_URL = r'https?://video\.vulture\.com/video/(?P<display_id>[^/]+)/' -    _TEST = { -        'url': 'http://video.vulture.com/video/Mindy-Kaling-s-Harvard-Speech/player?layout=compact&read_more=1', -        'md5': '8d997845642a2b5152820f7257871bc8', -        'info_dict': { -            'id': '6GHRQL3RV7MSD1H4', -            'ext': 'mp4', -            'title': 'kaling-speech-2-MAGNIFY STANDARD CONTAINER REVISED', -            'uploader_id': 'Sarah', -            'thumbnail': 're:^http://.*\.jpg$', -            'timestamp': 1401288564, -            'upload_date': '20140528', -            'description': 'Uplifting and witty, as predicted.', -            'duration': 1015, -        } -    } - -    def _real_extract(self, url): -        mobj = re.match(self._VALID_URL, url) -        display_id = mobj.group('display_id') - -        webpage = self._download_webpage(url, display_id) -        query_string = self._search_regex( -            r"queryString\s*=\s*'([^']+)'", webpage, 'query string') -        video_id = self._search_regex( -            r'content=([^&]+)', query_string, 'video ID') -        query_url = 'http://video.vulture.com/embed/player/container/1000/1000/?%s' % query_string - -        query_webpage = self._download_webpage( -            query_url, display_id, note='Downloading query page') -        params_json = self._search_regex( -            r'(?sm)new MagnifyEmbeddablePlayer\({.*?contentItem:\s*(\{.*?\})\n?,\n', -            query_webpage, -            'player params') -        params = json.loads(params_json) - -        upload_timestamp = parse_iso8601(params['posted'].replace(' ', 'T')) -        uploader_id = params.get('user', {}).get('handle') - -        media_item = params['media_item'] -        title = os.path.splitext(media_item['title'])[0] -        duration = int_or_none(media_item.get('duration_seconds')) - -        return { -            'id': video_id, -            'display_id': display_id, -            'url': media_item['pipeline_xid'], -            'title': title, -            'timestamp': upload_timestamp, -            'thumbnail': params.get('thumbnail_url'), -            'uploader_id': uploader_id, -            'description': params.get('description'), -            'duration': duration, -        } diff --git a/youtube_dl/extractor/wdr.py b/youtube_dl/extractor/wdr.py index a9238cbeb..6b83a2a04 100644 --- a/youtube_dl/extractor/wdr.py +++ b/youtube_dl/extractor/wdr.py @@ -34,7 +34,8 @@ class WDRIE(InfoExtractor):                  'description': 'md5:87be8ff14d8dfd7a7ee46f0299b52318',                  'is_live': False,                  'subtitles': {'de': [{ -                    'url': 'http://ondemand-ww.wdr.de/medp/fsk0/105/1058683/1058683_12220974.xml' +                    'url': 'http://ondemand-ww.wdr.de/medp/fsk0/105/1058683/1058683_12220974.xml', +                    'ext': 'ttml',                  }]},              },          }, @@ -190,7 +191,8 @@ class WDRIE(InfoExtractor):          caption_url = metadata_media_resource.get('captionURL')          if caption_url:              subtitles['de'] = [{ -                'url': caption_url +                'url': caption_url, +                'ext': 'ttml',              }]          title = metadata_tracker_data.get('trackerClipTitle') diff --git a/youtube_dl/extractor/weibo.py b/youtube_dl/extractor/weibo.py deleted file mode 100644 index 20bb039d3..000000000 --- a/youtube_dl/extractor/weibo.py +++ /dev/null @@ -1,49 +0,0 @@ -# coding: utf-8 -from __future__ import unicode_literals - -import re - -from .common import InfoExtractor - - -class WeiboIE(InfoExtractor): -    """ -    The videos in Weibo come from different sites, this IE just finds the link -    to the external video and returns it. -    """ -    _VALID_URL = r'https?://video\.weibo\.com/v/weishipin/t_(?P<id>.+?)\.htm' - -    _TEST = { -        'url': 'http://video.weibo.com/v/weishipin/t_zjUw2kZ.htm', -        'info_dict': { -            'id': '98322879', -            'ext': 'flv', -            'title': '魔声耳机最新广告“All Eyes On Us”', -        }, -        'params': { -            'skip_download': True, -        }, -        'add_ie': ['Sina'], -    } - -    # Additional example videos from different sites -    # Youku: http://video.weibo.com/v/weishipin/t_zQGDWQ8.htm -    # 56.com: http://video.weibo.com/v/weishipin/t_zQ44HxN.htm - -    def _real_extract(self, url): -        mobj = re.match(self._VALID_URL, url, flags=re.VERBOSE) -        video_id = mobj.group('id') -        info_url = 'http://video.weibo.com/?s=v&a=play_list&format=json&mix_video_id=t_%s' % video_id -        info = self._download_json(info_url, video_id) - -        videos_urls = map(lambda v: v['play_page_url'], info['result']['data']) -        # Prefer sina video since they have thumbnails -        videos_urls = sorted(videos_urls, key=lambda u: 'video.sina.com' in u) -        player_url = videos_urls[-1] -        m_sina = re.match(r'https?://video\.sina\.com\.cn/v/b/(\d+)-\d+\.html', -                          player_url) -        if m_sina is not None: -            self.to_screen('Sina video detected') -            sina_id = m_sina.group(1) -            player_url = 'http://you.video.sina.com.cn/swf/quotePlayer.swf?vid=%s' % sina_id -        return self.url_result(player_url) diff --git a/youtube_dl/extractor/xfileshare.py b/youtube_dl/extractor/xfileshare.py index 769003735..ee4d04c20 100644 --- a/youtube_dl/extractor/xfileshare.py +++ b/youtube_dl/extractor/xfileshare.py @@ -62,7 +62,8 @@ class XFileShareIE(InfoExtractor):              'ext': 'mp4',              'title': 'youtube-dl test video \'äBaW_jenozKc.mp4.mp4',              'thumbnail': 're:http://.*\.jpg', -        } +        }, +        'skip': 'Video removed',      }, {          'url': 'http://vidto.me/ku5glz52nqe1.html',          'info_dict': { diff --git a/youtube_dl/extractor/xuite.py b/youtube_dl/extractor/xuite.py index 2466410fa..0be8932ad 100644 --- a/youtube_dl/extractor/xuite.py +++ b/youtube_dl/extractor/xuite.py @@ -66,6 +66,7 @@ class XuiteIE(InfoExtractor):              'uploader_id': '242127761',              'categories': ['電玩動漫'],          }, +        'skip': 'Video removed',      }, {          'url': 'http://vlog.xuite.net/play/S1dDUjdyLTMyOTc3NjcuZmx2/%E5%AD%AB%E7%87%95%E5%A7%BF-%E7%9C%BC%E6%B7%9A%E6%88%90%E8%A9%A9',          'only_matching': True, diff --git a/youtube_dl/extractor/yahoo.py b/youtube_dl/extractor/yahoo.py index b376f2b93..927a964a4 100644 --- a/youtube_dl/extractor/yahoo.py +++ b/youtube_dl/extractor/yahoo.py @@ -343,7 +343,7 @@ class YahooIE(InfoExtractor):              webpage, 'region', fatal=False, default='US')          data = compat_urllib_parse_urlencode({              'protocol': 'http', -            'region': region, +            'region': region.upper(),          })          query_url = (              'https://video.media.yql.yahoo.com/v1/video/sapi/streams/' diff --git a/youtube_dl/extractor/youtube.py b/youtube_dl/extractor/youtube.py index 6c9f77d95..00dd602ff 100644 --- a/youtube_dl/extractor/youtube.py +++ b/youtube_dl/extractor/youtube.py @@ -1988,7 +1988,7 @@ class YoutubeChannelIE(YoutubePlaylistBaseInfoExtractor):  class YoutubeUserIE(YoutubeChannelIE):      IE_DESC = 'YouTube.com user videos (URL or "ytuser" keyword)' -    _VALID_URL = r'(?:(?:https?://(?:\w+\.)?youtube\.com/(?:user/)?(?!(?:attribution_link|watch|results)(?:$|[^a-z_A-Z0-9-])))|ytuser:)(?!feed/)(?P<id>[A-Za-z0-9_-]+)' +    _VALID_URL = r'(?:(?:https?://(?:\w+\.)?youtube\.com/(?:user/|c/)?(?!(?:attribution_link|watch|results)(?:$|[^a-z_A-Z0-9-])))|ytuser:)(?!feed/)(?P<id>[A-Za-z0-9_-]+)'      _TEMPLATE_URL = 'https://www.youtube.com/user/%s/videos'      IE_NAME = 'youtube:user' @@ -2001,6 +2001,9 @@ class YoutubeUserIE(YoutubeChannelIE):      }, {          'url': 'ytuser:phihag',          'only_matching': True, +    }, { +        'url': 'https://www.youtube.com/c/gametrailers', +        'only_matching': True,      }]      @classmethod diff --git a/youtube_dl/utils.py b/youtube_dl/utils.py index 229de4b39..f77ab8650 100644 --- a/youtube_dl/utils.py +++ b/youtube_dl/utils.py @@ -39,6 +39,7 @@ from .compat import (      compat_chr,      compat_etree_fromstring,      compat_html_entities, +    compat_html_entities_html5,      compat_http_client,      compat_kwargs,      compat_parse_qs, @@ -456,12 +457,19 @@ def orderedSet(iterable):      return res -def _htmlentity_transform(entity): +def _htmlentity_transform(entity_with_semicolon):      """Transforms an HTML entity to a character.""" +    entity = entity_with_semicolon[:-1] +      # Known non-numeric HTML entity      if entity in compat_html_entities.name2codepoint:          return compat_chr(compat_html_entities.name2codepoint[entity]) +    # TODO: HTML5 allows entities without a semicolon. For example, +    # 'Éric' should be decoded as 'Éric'. +    if entity_with_semicolon in compat_html_entities_html5: +        return compat_html_entities_html5[entity_with_semicolon] +      mobj = re.match(r'#(x[0-9a-fA-F]+|[0-9]+)', entity)      if mobj is not None:          numstr = mobj.group(1) @@ -486,7 +494,7 @@ def unescapeHTML(s):      assert type(s) == compat_str      return re.sub( -        r'&([^;]+);', lambda m: _htmlentity_transform(m.group(1)), s) +        r'&([^;]+;)', lambda m: _htmlentity_transform(m.group(1)), s)  def get_subprocess_encoding():  | 
