dropped the support for Python 2.5
let's elaborate the decision: Python 2.5 is a 6 years old release and "under the current release policy, no security issues in Python 2.5 will be fixed anymore" (!!); also, it doesn't support the new zipfile distribution format.
This commit is contained in:
		@@ -6,7 +6,7 @@ youtube-dl [options] url [url...]
 | 
				
			|||||||
## DESCRIPTION
 | 
					## DESCRIPTION
 | 
				
			||||||
**youtube-dl** is a small command-line program to download videos from
 | 
					**youtube-dl** is a small command-line program to download videos from
 | 
				
			||||||
YouTube.com and a few more sites. It requires the Python interpreter, version
 | 
					YouTube.com and a few more sites. It requires the Python interpreter, version
 | 
				
			||||||
2.x (x being at least 5), and it is not platform specific. It should work in
 | 
					2.x (x being at least 6), and it is not platform specific. It should work in
 | 
				
			||||||
your Unix box, in Windows or in Mac OS X. It is released to the public domain,
 | 
					your Unix box, in Windows or in Mac OS X. It is released to the public domain,
 | 
				
			||||||
which means you can modify it, redistribute it or use it however you like.
 | 
					which means you can modify it, redistribute it or use it however you like.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										
											BIN
										
									
								
								youtube-dl
									
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								youtube-dl
									
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							@@ -12,23 +12,14 @@ import time
 | 
				
			|||||||
import urllib
 | 
					import urllib
 | 
				
			||||||
import urllib2
 | 
					import urllib2
 | 
				
			||||||
import email.utils
 | 
					import email.utils
 | 
				
			||||||
 | 
					import xml.etree.ElementTree
 | 
				
			||||||
 | 
					from urlparse import parse_qs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
try:
 | 
					try:
 | 
				
			||||||
	import cStringIO as StringIO
 | 
						import cStringIO as StringIO
 | 
				
			||||||
except ImportError:
 | 
					except ImportError:
 | 
				
			||||||
	import StringIO
 | 
						import StringIO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# parse_qs was moved from the cgi module to the urlparse module recently.
 | 
					 | 
				
			||||||
try:
 | 
					 | 
				
			||||||
	from urlparse import parse_qs
 | 
					 | 
				
			||||||
except ImportError:
 | 
					 | 
				
			||||||
	from cgi import parse_qs
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
try:
 | 
					 | 
				
			||||||
	import xml.etree.ElementTree
 | 
					 | 
				
			||||||
except ImportError: # Python<2.5: Not officially supported, but let it slip
 | 
					 | 
				
			||||||
	warnings.warn('xml.etree.ElementTree support is missing. Consider upgrading to Python >= 2.5 if you get related errors.')
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
from utils import *
 | 
					from utils import *
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,109 +0,0 @@
 | 
				
			|||||||
"""trivialjson (https://github.com/phihag/trivialjson)"""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import re
 | 
					 | 
				
			||||||
def loads(s):
 | 
					 | 
				
			||||||
	s = s.decode('UTF-8')
 | 
					 | 
				
			||||||
	def raiseError(msg, i):
 | 
					 | 
				
			||||||
		raise ValueError(msg + ' at position ' + str(i) + ' of ' + repr(s) + ': ' + repr(s[i:]))
 | 
					 | 
				
			||||||
	def skipSpace(i, expectMore=True):
 | 
					 | 
				
			||||||
		while i < len(s) and s[i] in ' \t\r\n':
 | 
					 | 
				
			||||||
			i += 1
 | 
					 | 
				
			||||||
		if expectMore:
 | 
					 | 
				
			||||||
			if i >= len(s):
 | 
					 | 
				
			||||||
				raiseError('Premature end', i)
 | 
					 | 
				
			||||||
		return i
 | 
					 | 
				
			||||||
	def decodeEscape(match):
 | 
					 | 
				
			||||||
		esc = match.group(1)
 | 
					 | 
				
			||||||
		_STATIC = {
 | 
					 | 
				
			||||||
			'"': '"',
 | 
					 | 
				
			||||||
			'\\': '\\',
 | 
					 | 
				
			||||||
			'/': '/',
 | 
					 | 
				
			||||||
			'b': unichr(0x8),
 | 
					 | 
				
			||||||
			'f': unichr(0xc),
 | 
					 | 
				
			||||||
			'n': '\n',
 | 
					 | 
				
			||||||
			'r': '\r',
 | 
					 | 
				
			||||||
			't': '\t',
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if esc in _STATIC:
 | 
					 | 
				
			||||||
			return _STATIC[esc]
 | 
					 | 
				
			||||||
		if esc[0] == 'u':
 | 
					 | 
				
			||||||
			if len(esc) == 1+4:
 | 
					 | 
				
			||||||
				return unichr(int(esc[1:5], 16))
 | 
					 | 
				
			||||||
			if len(esc) == 5+6 and esc[5:7] == '\\u':
 | 
					 | 
				
			||||||
				hi = int(esc[1:5], 16)
 | 
					 | 
				
			||||||
				low = int(esc[7:11], 16)
 | 
					 | 
				
			||||||
				return unichr((hi - 0xd800) * 0x400 + low - 0xdc00 + 0x10000)
 | 
					 | 
				
			||||||
		raise ValueError('Unknown escape ' + str(esc))
 | 
					 | 
				
			||||||
	def parseString(i):
 | 
					 | 
				
			||||||
		i += 1
 | 
					 | 
				
			||||||
		e = i
 | 
					 | 
				
			||||||
		while True:
 | 
					 | 
				
			||||||
			e = s.index('"', e)
 | 
					 | 
				
			||||||
			bslashes = 0
 | 
					 | 
				
			||||||
			while s[e-bslashes-1] == '\\':
 | 
					 | 
				
			||||||
				bslashes += 1
 | 
					 | 
				
			||||||
			if bslashes % 2 == 1:
 | 
					 | 
				
			||||||
				e += 1
 | 
					 | 
				
			||||||
				continue
 | 
					 | 
				
			||||||
			break
 | 
					 | 
				
			||||||
		rexp = re.compile(r'\\(u[dD][89aAbB][0-9a-fA-F]{2}\\u[0-9a-fA-F]{4}|u[0-9a-fA-F]{4}|.|$)')
 | 
					 | 
				
			||||||
		stri = rexp.sub(decodeEscape, s[i:e])
 | 
					 | 
				
			||||||
		return (e+1,stri)
 | 
					 | 
				
			||||||
	def parseObj(i):
 | 
					 | 
				
			||||||
		i += 1
 | 
					 | 
				
			||||||
		res = {}
 | 
					 | 
				
			||||||
		i = skipSpace(i)
 | 
					 | 
				
			||||||
		if s[i] == '}': # Empty dictionary
 | 
					 | 
				
			||||||
			return (i+1,res)
 | 
					 | 
				
			||||||
		while True:
 | 
					 | 
				
			||||||
			if s[i] != '"':
 | 
					 | 
				
			||||||
				raiseError('Expected a string object key', i)
 | 
					 | 
				
			||||||
			i,key = parseString(i)
 | 
					 | 
				
			||||||
			i = skipSpace(i)
 | 
					 | 
				
			||||||
			if i >= len(s) or s[i] != ':':
 | 
					 | 
				
			||||||
				raiseError('Expected a colon', i)
 | 
					 | 
				
			||||||
			i,val = parse(i+1)
 | 
					 | 
				
			||||||
			res[key] = val
 | 
					 | 
				
			||||||
			i = skipSpace(i)
 | 
					 | 
				
			||||||
			if s[i] == '}':
 | 
					 | 
				
			||||||
				return (i+1, res)
 | 
					 | 
				
			||||||
			if s[i] != ',':
 | 
					 | 
				
			||||||
				raiseError('Expected comma or closing curly brace', i)
 | 
					 | 
				
			||||||
			i = skipSpace(i+1)
 | 
					 | 
				
			||||||
	def parseArray(i):
 | 
					 | 
				
			||||||
		res = []
 | 
					 | 
				
			||||||
		i = skipSpace(i+1)
 | 
					 | 
				
			||||||
		if s[i] == ']': # Empty array
 | 
					 | 
				
			||||||
			return (i+1,res)
 | 
					 | 
				
			||||||
		while True:
 | 
					 | 
				
			||||||
			i,val = parse(i)
 | 
					 | 
				
			||||||
			res.append(val)
 | 
					 | 
				
			||||||
			i = skipSpace(i) # Raise exception if premature end
 | 
					 | 
				
			||||||
			if s[i] == ']':
 | 
					 | 
				
			||||||
				return (i+1, res)
 | 
					 | 
				
			||||||
			if s[i] != ',':
 | 
					 | 
				
			||||||
				raiseError('Expected a comma or closing bracket', i)
 | 
					 | 
				
			||||||
			i = skipSpace(i+1)
 | 
					 | 
				
			||||||
	def parseDiscrete(i):
 | 
					 | 
				
			||||||
		for k,v in {'true': True, 'false': False, 'null': None}.items():
 | 
					 | 
				
			||||||
			if s.startswith(k, i):
 | 
					 | 
				
			||||||
				return (i+len(k), v)
 | 
					 | 
				
			||||||
		raiseError('Not a boolean (or null)', i)
 | 
					 | 
				
			||||||
	def parseNumber(i):
 | 
					 | 
				
			||||||
		mobj = re.match('^(-?(0|[1-9][0-9]*)(\.[0-9]*)?([eE][+-]?[0-9]+)?)', s[i:])
 | 
					 | 
				
			||||||
		if mobj is None:
 | 
					 | 
				
			||||||
			raiseError('Not a number', i)
 | 
					 | 
				
			||||||
		nums = mobj.group(1)
 | 
					 | 
				
			||||||
		if '.' in nums or 'e' in nums or 'E' in nums:
 | 
					 | 
				
			||||||
			return (i+len(nums), float(nums))
 | 
					 | 
				
			||||||
		return (i+len(nums), int(nums))
 | 
					 | 
				
			||||||
	CHARMAP = {'{': parseObj, '[': parseArray, '"': parseString, 't': parseDiscrete, 'f': parseDiscrete, 'n': parseDiscrete}
 | 
					 | 
				
			||||||
	def parse(i):
 | 
					 | 
				
			||||||
		i = skipSpace(i)
 | 
					 | 
				
			||||||
		i,res = CHARMAP.get(s[i], parseNumber)(i)
 | 
					 | 
				
			||||||
		i = skipSpace(i, False)
 | 
					 | 
				
			||||||
		return (i,res)
 | 
					 | 
				
			||||||
	i,res = parse(0)
 | 
					 | 
				
			||||||
	if i < len(s):
 | 
					 | 
				
			||||||
		raise ValueError('Extra data at end of input (index ' + str(i) + ' of ' + repr(s) + ': ' + repr(s[i:]) + ')')
 | 
					 | 
				
			||||||
	return res
 | 
					 | 
				
			||||||
@@ -11,16 +11,12 @@ import sys
 | 
				
			|||||||
import zlib
 | 
					import zlib
 | 
				
			||||||
import urllib2
 | 
					import urllib2
 | 
				
			||||||
import email.utils
 | 
					import email.utils
 | 
				
			||||||
 | 
					import json
 | 
				
			||||||
 | 
					
 | 
				
			||||||
try:
 | 
					try:
 | 
				
			||||||
	import cStringIO as StringIO
 | 
						import cStringIO as StringIO
 | 
				
			||||||
except ImportError:
 | 
					except ImportError:
 | 
				
			||||||
	import StringIO
 | 
						import StringIO
 | 
				
			||||||
		
 | 
					 | 
				
			||||||
try:
 | 
					 | 
				
			||||||
	import json
 | 
					 | 
				
			||||||
except ImportError: # Python <2.6, use trivialjson (https://github.com/phihag/trivialjson):
 | 
					 | 
				
			||||||
	import trivialjson as json
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
std_headers = {
 | 
					std_headers = {
 | 
				
			||||||
	'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:5.0.1) Gecko/20100101 Firefox/5.0.1',
 | 
						'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:5.0.1) Gecko/20100101 Firefox/5.0.1',
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user