#1 Le 21/09/2013, à 21:31
- k3c
[script Python] Récupérer les vidéos de la BBC avec get_iplayer
get_iplayer est un excellent programme pour récupérer des vidéos de la BBC
http://www.infradead.org/get_iplayer/ht … layer.html
Il a besoin d'une adresse IP anglaise, donc il faut lui passer un proxy anglais.
Exemple, je veux récupérer une vidéo de Doctor Who.
Je cherche la vidéo avec un simple
gg@vientiane:~$ get_iplayer "Doctor Who"
get_iplayer v2.82, Copyright (C) 2008-2010 Phil Lewis
This program comes with ABSOLUTELY NO WARRANTY; for details use --warranty.
This is free software, and you are welcome to redistribute it under certain
conditions; use --conditions for details.
Matches:
223: Doctor Who: Series 7 Part 2 - 6. The Crimson Horror, BBC One, Drama,SciFi & Fantasy,TV, default
INFO: 1 Matching Programmes
gg@vientiane:~$
Donc l'identifiant de cette vidéo est 223, il me faut donc lancer une commande du type
get_iplayer --get 223 --subtitles -p 'http://1.2.3.4:3128'
vu que je veux les sous-titres, et que j'utilise le proxy 1.2.3.4:3128
Je récupère les proxys sur le site
http://free-proxy-list.net/uk-proxy.html
Je teste les proxys, dans la première boucle, je ne prends que les proxys qui répondent en moins de 3 secondes.
Exemple de fonctionnement
gg@vientiane:~$ python bbc.py 223
Timeout = 3
Trying 149.255.103.23:8080
149.255.103.23 8080 anonymous
get_iplayer --get 223 --subtitles -p 'http://149.255.103.23:8080'
get_iplayer v2.82, Copyright (C) 2008-2010 Phil Lewis
This program comes with ABSOLUTELY NO WARRANTY; for details use --warranty.
This is free software, and you are welcome to redistribute it under certain
conditions; use --conditions for details.
INFO: Using Proxy http://149.255.103.23:8080
Matches:
223: Doctor Who: Series 7 Part 2 - 6. The Crimson Horror, BBC One, Drama,SciFi & Fantasy,TV, default
INFO: 1 Matching Programmes
INFO: Checking existence of default version
INFO: flashhigh1,flashhigh2,flashstd1,flashstd2 modes will be tried for version default
INFO: Trying flashhigh1 mode to record tv: Doctor Who: Series 7 Part 2 - 6. The Crimson Horror
INFO: File name prefix = Doctor_Who_Series_7_Part_2_-_6._The_Crimson_Horror_b01sfhyp_default
INFO: Downloading Subtitles to '/home/gg/Doctor_Who_Series_7_Part_2_-_6._The_Crimson_Horror_b01sfhyp_default.srt'
RTMPDump v2.4
(c) 2010 Andrej Stepanchuk, Howard Chu, The Flvstreamer Team; license: GPL
WARNING: gnome-keyring:: couldn't connect to: /run/user/gg/keyring-vJ3RJb/pkcs11: No such file or directory
Connecting ...
INFO: Connected...
ERROR: rtmp server sent error
ERROR: rtmp server requested close
INFO: Command exit code 1 (raw code = 256)
WARNING: Failed to stream file /home/gg/Doctor_Who_Series_7_Part_2_-_6._The_Crimson_Horror_b01sfhyp_default.partial.mp4.flv via RTMP
INFO: skipping flashhigh1 mode
INFO: Trying flashhigh2 mode to record tv: Doctor Who: Series 7 Part 2 - 6. The Crimson Horror
INFO: File name prefix = Doctor_Who_Series_7_Part_2_-_6._The_Crimson_Horror_b01sfhyp_default
RTMPDump v2.4
(c) 2010 Andrej Stepanchuk, Howard Chu, The Flvstreamer Team; license: GPL
WARNING: gnome-keyring:: couldn't connect to: /run/user/gg/keyring-vJ3RJb/pkcs11: No such file or directory
Connecting ...
INFO: Connected...
Starting download at: 0.000 kB
INFO: Metadata:
INFO: duration 2684.64
INFO: moovPosition 36.00
INFO: width 640.00
INFO: height 360.00
INFO: videocodecid avc1
INFO: audiocodecid mp4a
INFO: avcprofile 77.00
INFO: avclevel 30.00
INFO: aacaot 2.00
INFO: videoframerate 25.00
INFO: audiosamplerate 48000.00
INFO: audiochannels 2.00
INFO: trackinfo:
INFO: length 67116000.00
INFO: timescale 25000.00
INFO: language und
INFO: sampledescription:
INFO: sampletype avc1
INFO: length 128862208.00
INFO: timescale 48000.00
INFO: language und
INFO: sampledescription:
INFO: sampletype mp4a
4385.211 kB / 44.64 sec (1.6%)
Le code est largement améliorable car il reste plein de choses à enlever (je repars d'autres .py), et dans le cas où une vidéo a déjà été téléchargée, au lieu de sortir complètement je reste dans la boucle, et donc re-essaye les proxys alors que c'est inutile.
Mais le code fonctionne.
Si j'ai du temps je me passerai de get_iplayer en proposant un script Python qui fait tout.
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# bbc_proxy version 0.1 par k3c
# passage de proxy en 2 ème parametre
import subprocess, optparse, re, sys, shlex
import socket, random
import urllib2
from urllib2 import ProxyHandler, Request, urlopen, URLError, HTTPError
import bs4 as BeautifulSoup
from lxml import objectify
from lxml import etree
from pprint import pprint
import socket
from threading import Thread
ON_POSIX = 'posix' in sys.builtin_module_names
Finished = False
listeUserAgents = [ 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_5; fr-fr) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1',
'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.186 Safari/535.1',
'Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13\
',
'Mozilla/5.0 (X11; U; Linux x86_64; en-us) AppleWebKit/528.5+ (KHTML, like Gecko, Safari/528.5+) midori',
'Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.107 Safari/535.1',
'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/312.1 (KHTML, like Gecko) Safari/312',
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.12 Safari/535.11',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.8 (KHTML, like Gecko) Chrome/17.0.940.0 Safari/535.8' ]
allTimeouts = (3, 10, 15, 20)
def start_thread(func, *args):
t = Thread(target=func, args=args)
t.daemon = True
t.start()
return t
def consume(infile):
for line in iter(infile.readline, ''):
if 'Finished writing to temp file.' in line:
Finished = True
print line,
infile.close()
def getProxy():
opener = urllib2.build_opener()
opener.addheaders = [('User-agent', random.choice(listeUserAgents))]
data = opener.open('http://free-proxy-list.net/uk-proxy.html').read()
opener.close()
soup = BeautifulSoup.BeautifulSoup(data)
lst = []
for tr in soup.tbody.findAll('tr'):
i = 0
slst = []
for td in tr.find_all('td'):
i += 1
if i in (1, 2, 5):
slst.append(td.contents[0])
elif i == 8:
i = 0
lst.append(slst)
slst = []
# pprint(lst)
for href in lst:
yield href
# href = random.choice(lst)
# return href
def getValidProxy():
for timeout in allTimeouts:
print 'Timeout =', timeout
socket.setdefaulttimeout(timeout)
for host, port, typeproxy in getProxy():
try:
print 'Trying %s:%s' % (host, port)
params = (host, int(port))
buffer_size = 1024
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(params)
s.close()
# urlopen('http://%s:%s' % (host, port)).read()
yield host, port, typeproxy
# except urllib2.URLError:
# pass
except socket.timeout:
pass
except socket.error:
pass
def main():
global Finished
idvideo = sys.argv[1]
for host, port, typeproxy in getValidProxy():
print host, port, typeproxy
cmds = "get_iplayer --get "+idvideo + " --subtitles -p 'http://"+host+":"+port+"'"
arguments = shlex.split(cmds)
print cmds
Finished = False
process = subprocess.Popen(arguments, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
thread1 = start_thread(consume, process.stdout)
thread2 = start_thread(consume, process.stderr)
thread1.join() # wait for IO completion
thread2.join() # wait for IO completion
retcode = process.wait()
print retcode
if Finished:
break
if __name__ == "__main__":
main()
Debian 12 sur Thinkpad reconditionné
Hors ligne
#2 Le 24/09/2013, à 10:23
- k3c
Re : [script Python] Récupérer les vidéos de la BBC avec get_iplayer
Version avec une sortie directe quand la vidéo a déjà été téléchargée, sans re-essayer tous les proxys :-)
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# bbc_proxy version 0.2 par k3c, sortie quand deja telecharge
# passage de proxy en 2 ème parametre
import subprocess, sys, shlex
import random
import urllib2
import bs4 as BeautifulSoup
import socket
from threading import Thread
ON_POSIX = 'posix' in sys.builtin_module_names
Finished = False
listeUserAgents = [ 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_5; fr-fr) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1',
'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.186 Safari/535.1',
'Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13\
',
'Mozilla/5.0 (X11; U; Linux x86_64; en-us) AppleWebKit/528.5+ (KHTML, like Gecko, Safari/528.5+) midori',
'Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.107 Safari/535.1',
'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/312.1 (KHTML, like Gecko) Safari/312',
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.12 Safari/535.11',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.8 (KHTML, like Gecko) Chrome/17.0.940.0 Safari/535.8' ]
allTimeouts = (3, 10, 15, 20)
def start_thread(func, *args):
t = Thread(target=func, args=args)
t.daemon = True
t.start()
return t
def consume(infile):
global Finished
for line in iter(infile.readline, ''):
if 'Finished writing to temp file.' in line:
Finished = True
if 'Already in history' in line:
Finished = True
print line,
infile.close()
def getProxy():
opener = urllib2.build_opener()
opener.addheaders = [('User-agent', random.choice(listeUserAgents))]
data = opener.open('http://free-proxy-list.net/uk-proxy.html').read()
opener.close()
soup = BeautifulSoup.BeautifulSoup(data)
lst = []
for tr in soup.tbody.findAll('tr'):
i = 0
slst = []
for td in tr.find_all('td'):
i += 1
if i in (1, 2, 5):
slst.append(td.contents[0])
elif i == 8:
i = 0
lst.append(slst)
slst = []
for href in lst:
yield href
def getValidProxy():
for timeout in allTimeouts:
print 'Timeout =', timeout
socket.setdefaulttimeout(timeout)
for host, port, typeproxy in getProxy():
try:
print 'Trying %s:%s' % (host, port)
params = (host, int(port))
# buffer_size = 1024
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(params)
s.close()
yield host, port, typeproxy
# except urllib2.URLError:
# pass
except socket.timeout:
pass
except socket.error:
pass
def main():
global Finished
idvideo = sys.argv[1]
for host, port, typeproxy in getValidProxy():
print host, port, typeproxy
cmds = "get_iplayer --get "+idvideo + " --subtitles -p 'http://"+host+":"+port+"'"
arguments = shlex.split(cmds)
print cmds
Finished = False
process = subprocess.Popen(arguments, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
thread1 = start_thread(consume, process.stdout)
thread2 = start_thread(consume, process.stderr)
thread1.join() # wait for IO completion
thread2.join() # wait for IO completion
retcode = process.wait()
print retcode
if Finished:
break
if __name__ == "__main__":
main()
Debian 12 sur Thinkpad reconditionné
Hors ligne
#3 Le 26/09/2013, à 20:57
- 11gjm
Re : [script Python] Récupérer les vidéos de la BBC avec get_iplayer
Bonjour ,
@k3c : Merci .
Je testerai ultérieurement .
En ce moment , je suis branché sur un "Herbier" qui me prend du temps .
Cordialement .
Hors ligne
#4 Le 15/10/2013, à 06:42
- k3c
Re : [script Python] Récupérer les vidéos de la BBC avec get_iplayer
Nouvelle version, j'affiche maintenant la taille cumulée des 2 fichiers téléchargés, le fichier de sous-titres (.srt, tout petit) et la vidéo.
#!/usr/bin/python
#-*- coding:utf-8 -*-
# v0.2 par k3c
import os
import os.path
from os import stat
import posixpath
import shutil
import re
import StringIO
import ConfigParser
import subprocess
import glob
from threading import Thread
try:
from tkinter import *
except:
from Tkinter import *
from ScrolledText import ScrolledText
import tkMessageBox
from tkColorChooser import askcolor
import tkFileDialog
import distutils.dir_util
from Queue import Queue, Empty
ON_POSIX = 'posix' in sys.builtin_module_names
Finished = False
thread1 = None
force = None
root = None
process = None
queue = Queue()
manager = None
txt = None
df = None
snom = None
filesSize = None
def busy():
global manager, df
txt.config(cursor="watch")
df.config(cursor="watch")
root.config(cursor="watch")
def notbusy():
global manager, df
txt.config(cursor="")
df.config(cursor="")
root.config(cursor="")
def start_thread(func, *args):
t = Thread(target=func, args=args)
t.daemon = True
t.start()
return t
def consume(infile):
for line in iter(infile.readline, ''):
queue.put(line)
infile.close()
def callback0():
global dirfilms, lsb, thread1, txt, nom
lsb.delete(0, END)
txt.delete(1.0, END)
args = ["get_iplayer", dirfilms.get()]
if refresh.get():
args.append('-f')
app = subprocess.Popen(args=args, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
(stdout, stderr) = app.communicate()
notbusy()
if app.returncode == 1: # sortie en erreur →
txt.insert(END, 'get_iplayer fail\n')
else:
lines = stdout.split('\n')
for line in lines:
txt.insert(END, line + '\n')
n = 1
for line in lines:
if line.startswith('Matches:'):
break
n += 1
lines = lines[n:-3] if n <= len(lines) else []
n = 0
for line in lines:
line = line.replace('\t', ' ')
line = line.replace('Added: ','')
n += 1
lsb.insert(END, line)
txt.insert(END, 'get_iplayed success, %s founds\n' % (n,))
def callback1():
global root
busy()
root.after_idle(callback0)
def callback3():
global lsb, process
sel = lsb.curselection()
sel = None if len(sel) == 0 else sel[0]
# print 'callback3', sel,
if sel:
# print lsb.get(sel)
# print 'force=', force.get()
nom = lsb.get(sel).split(':')[1].split(',')[0].strip().replace(' ', '_').replace('/', '_')
print nom
global snom,x
snom ='./'+nom+'*'
args = ["python", "/home/gg/bbc33.py", lsb.get(sel).split(':')[0], str(force.get())]
process = subprocess.Popen(args=args, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, close_fds=ON_POSIX)
thread1 = start_thread(consume, process.stdout)
else:
print
def on_delete():
global root, process
if process:
process.kill()
print "sortie du programme"
root.destroy()
def on_after():
global queue, txt, root
while True:
try:
v = queue.get_nowait()
except Empty:
break;
txt.insert(END, v)
root.after(200, on_after)
def on_after2():
global snom, filesSize
print snom
if snom is not None:
sz = 0
for fn in glob.glob(snom):
sz += os.stat(fn).st_size
filesSize.set('{: }'.format(sz))
root.after(10000, on_after2)
root = Tk(root)
fr = Frame()
bt1 = Button(fr, text='Films/Séries', command=callback1)
dirfilms = StringVar()
refresh = IntVar()
refresh.set(0)
df = Entry(fr, textvariable=dirfilms, width=100)
df.pack(side=LEFT)
bt1.pack(side=LEFT)
Checkbutton(fr, text="refresh du cache de la BBC", variable=refresh).pack(side=LEFT)
fr.pack()
fr = Frame(root)
scrollbar = Scrollbar(fr)
scrollbar.pack(side=RIGHT, fill=Y)
lsb = Listbox(fr)
lsb.pack(fill=X)
fr.pack(fill=X)
# attach listbox to scrollbar
lsb.config(yscrollcommand=scrollbar.set)
scrollbar.config(command=lsb.yview)
fr = Frame(root)
bt2 = Button(fr, text='Download', command=callback3)
bt2.pack(side=LEFT)
force = IntVar()
force.set(0)
Checkbutton(fr, text="Force", variable=force).pack(side=LEFT)
fr.pack()
fr1 = Frame(fr)
filesSize = StringVar()
filesSize.set('')
Label(fr1,text=' Taille : ').pack(side=LEFT)
Label(fr1, textvariable=filesSize).pack(side=LEFT)
fr1.pack(fill=X,side=RIGHT)
fr = Frame(root)
txt = ScrolledText(fr, width=100,height=50)
txt.pack(fill=X)
fr.pack(fill=X)
root.wm_protocol ("WM_DELETE_WINDOW", on_delete)
root.after(1000, on_after)
root.after(10000, on_after2)
root.mainloop()
Debian 12 sur Thinkpad reconditionné
Hors ligne
#5 Le 21/11/2013, à 13:03
- pguimier
Re : [script Python] Récupérer les vidéos de la BBC avec get_iplayer
Magnifique, superbe, merci !
Ayant des obligations samedi je manquerai "The Day of the Doctor".
Ton script est impeccable !
Merci
Hors ligne
#6 Le 21/11/2013, à 13:46
- k3c
Re : [script Python] Récupérer les vidéos de la BBC avec get_iplayer
Merci pour ton retour :-)
J'ai une version graphique en Tkinter (moche) et je veux la refaire avec kivy (http://kivy.org/#home) ou wxpython.
Je veux aussi indiquer quand le téléchargement est terminé et complet, que cela soit Mme Michu compliant :-)
La version graphique (je pensais l'avoir postée), qui appelle le script que tu utilises
Le bouton Film/Séries cherche dans toutes les catégories de bbc.co.uk/tv
#!/usr/bin/python
#-*- coding:utf-8 -*-
#
import os
import os.path
from os import stat
import posixpath
import shutil
import re
import StringIO
import ConfigParser
import subprocess
import glob
from threading import Thread
try:
from tkinter import *
except:
from Tkinter import *
from ScrolledText import ScrolledText
import tkMessageBox
from tkColorChooser import askcolor
import tkFileDialog
import distutils.dir_util
from Queue import Queue, Empty
ON_POSIX = 'posix' in sys.builtin_module_names
Finished = False
thread1 = None
force = None
root = None
process = None
queue = Queue()
manager = None
txt = None
df = None
snom = None
filesSize = None
def busy():
global manager, df
txt.config(cursor="watch")
df.config(cursor="watch")
root.config(cursor="watch")
def notbusy():
global manager, df
txt.config(cursor="")
df.config(cursor="")
root.config(cursor="")
def start_thread(func, *args):
t = Thread(target=func, args=args)
t.daemon = True
t.start()
return t
def consume(infile):
for line in iter(infile.readline, ''):
queue.put(line)
infile.close()
def callback0():
global dirfilms, lsb, thread1, txt, nom
# print 'callback1', dirfilms.get()
lsb.delete(0, END)
txt.delete(1.0, END)
args = ["get_iplayer", dirfilms.get()]
if refresh.get():
args.append('-f')
app = subprocess.Popen(args=args, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
(stdout, stderr) = app.communicate()
notbusy()
if app.returncode == 1: # sortie en erreur →
txt.insert(END, 'get_iplayer fail\n')
else:
lines = stdout.split('\n')
for line in lines:
txt.insert(END, line + '\n')
n = 1
for line in lines:
if line.startswith('Matches:'):
break
n += 1
lines = lines[n:-3] if n <= len(lines) else []
n = 0
for line in lines:
line = line.replace('\t', ' ')
line = line.replace('Added: ','')
n += 1
lsb.insert(END, line)
txt.insert(END, 'get_iplayed success, %s founds\n' % (n,))
def callback1():
global root
busy()
root.after_idle(callback0)
def callback3():
global lsb, process
sel = lsb.curselection()
sel = None if len(sel) == 0 else sel[0]
# print 'callback3', sel,
if sel:
# print lsb.get(sel)
# print 'force=', force.get()
nom = lsb.get(sel).split(':')[1].split(',')[0].strip().replace(' ', '_').replace('/', '_').replace("'",'')
print nom
global snom,x
snom ='./'+nom+'*'
args = ["python", "/home/gg/bbc33.py", lsb.get(sel).split(':')[0], str(force.get())]
process = subprocess.Popen(args=args, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, close_fds=ON_POSIX)
thread1 = start_thread(consume, process.stdout)
# thread1.join() # wait for IO completion
# if app.returncode == 1: # sortie en erreur →
# print 'ko'
# else:
# print 'ok', stdout
else:
print
def on_delete():
global root, process
if process:
process.kill()
print "sortie du programme"
root.destroy()
def on_after():
global queue, txt, root
while True:
try:
v = queue.get_nowait()
except Empty:
break;
txt.insert(END, v)
root.after(200, on_after)
def on_after2():
global snom, filesSize
print snom
if snom is not None:
sz = 0
for fn in glob.glob(snom):
sz += os.stat(fn).st_size
filesSize.set('{:,}'.format(sz))
root.after(10000, on_after2)
root = Tk(root)
fr = Frame()
bt1 = Button(fr, text='Films/Séries', command=callback1)
dirfilms = StringVar()
refresh = IntVar()
refresh.set(0)
df = Entry(fr, textvariable=dirfilms, width=100)
df.pack(side=LEFT)
bt1.pack(side=LEFT)
Checkbutton(fr, text="refresh du cache de la BBC", variable=refresh).pack(side=LEFT)
fr.pack()
fr = Frame(root)
scrollbar = Scrollbar(fr)
scrollbar.pack(side=RIGHT, fill=Y)
lsb = Listbox(fr)
lsb.pack(fill=X)
fr.pack(fill=X)
# attach listbox to scrollbar
lsb.config(yscrollcommand=scrollbar.set)
scrollbar.config(command=lsb.yview)
fr = Frame(root)
bt2 = Button(fr, text='Download', command=callback3)
bt2.pack(side=LEFT)
force = IntVar()
force.set(0)
Checkbutton(fr, text="Force", variable=force).pack(side=LEFT)
fr.pack()
fr1 = Frame(fr)
filesSize = StringVar()
filesSize.set('')
Label(fr1, textvariable=filesSize,text=' *********************Taille : **********************',anchor=W, justify=LEFT).pack(side=RIGHT)
fr1.pack(fill=X)
fr = Frame(root)
txt = ScrolledText(fr, width=100,height=50)
txt.pack(fill=X)
fr.pack(fill=X)
root.wm_protocol ("WM_DELETE_WINDOW", on_delete)
root.after(1000, on_after)
root.after(10000, on_after2)
root.mainloop()
et l'autre
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# bbc_proxy version 0.2 par k3c, sortie quand deja telecharge
# passage de proxy en 2 ème parametre
import subprocess, sys, shlex
import random
import urllib2
import bs4 as BeautifulSoup
import socket
from threading import Thread
ON_POSIX = 'posix' in sys.builtin_module_names
Finished = False
listeUserAgents = [ 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_5; fr-fr) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1',
'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.186 Safari/535.1',
'Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13\
',
'Mozilla/5.0 (X11; U; Linux x86_64; en-us) AppleWebKit/528.5+ (KHTML, like Gecko, Safari/528.5+) midori',
'Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.107 Safari/535.1',
'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/312.1 (KHTML, like Gecko) Safari/312',
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.12 Safari/535.11',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.8 (KHTML, like Gecko) Chrome/17.0.940.0 Safari/535.8' ]
allTimeouts = (3, 10, 15, 20)
class FlushFile(object):
"""Write-only flushing wrapper for file-type objects."""
def __init__(self, f):
self.f = f
def write(self, x):
self.f.write(x)
self.f.flush()
def start_thread(func, *args):
t = Thread(target=func, args=args)
t.daemon = True
t.start()
return t
def consume(infile):
global Finished
for line in iter(infile.readline, ''):
if 'Finished writing to temp file.' in line:
Finished = True
if 'Already in history' in line:
Finished = True
print line,
infile.close()
def getProxy():
opener = urllib2.build_opener()
opener.addheaders = [('User-agent', random.choice(listeUserAgents))]
data = opener.open('http://free-proxy-list.net/uk-proxy.html').read()
opener.close()
soup = BeautifulSoup.BeautifulSoup(data)
lst = []
for tr in soup.tbody.findAll('tr'):
i = 0
slst = []
for td in tr.find_all('td'):
i += 1
if i in (1, 2, 5):
slst.append(td.contents[0])
elif i == 8:
i = 0
lst.append(slst)
slst = []
for href in lst:
yield href
def getValidProxy():
for timeout in allTimeouts:
print 'Timeout =', timeout
socket.setdefaulttimeout(timeout)
for host, port, typeproxy in getProxy():
try:
print 'Trying %s:%s' % (host, port)
params = (host, int(port))
# buffer_size = 1024
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(params)
s.close()
yield host, port, typeproxy
# except urllib2.URLError:
# pass
except socket.timeout:
pass
except socket.error:
pass
def main():
global Finished
# Replace stdout with an automatically flushing version
sys.stdout = FlushFile(sys.__stdout__)
idvideo = sys.argv[1]
for host, port, typeproxy in getValidProxy():
print host, port, typeproxy
if len(sys.argv) > 1 and sys.argv[2] == '1':
cmds = "get_iplayer --get "+idvideo + " --nopurge --subtitles --force -p 'http://"+host+":"+port+"'"
else:
cmds = "get_iplayer --get "+idvideo + " --nopurge --subtitles -p 'http://"+host+":"+port+"'"
arguments = shlex.split(cmds)
print cmds
Finished = False
process = subprocess.Popen(arguments, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
pid = process.pid
print 'le pid de get_iplayer est ', pid
thread1 = start_thread(consume, process.stdout)
thread2 = start_thread(consume, process.stderr)
thread1.join() # wait for IO completion
thread2.join() # wait for IO completion
retcode = process.wait()
print retcode
if Finished:
break
if __name__ == "__main__":
main()
Dernière modification par k3c (Le 21/11/2013, à 14:09)
Debian 12 sur Thinkpad reconditionné
Hors ligne
#7 Le 13/01/2014, à 14:02
- BobW
Re : [script Python] Récupérer les vidéos de la BBC avec get_iplayer
J´avais l´habitude d'employer les DSN Tunlr pour eviter l´adresse IP anglaise.
Mais ca ne fonctionne plus bien.
Votre solution me semble beaucoup mieux. Je l'ai essayé , je peux regarder l'index mais quand je pousse sur Download
je vois seulement le nom du programme dans l'écran terminal qui reste affiché dans un boucle.
Mais je suppose que je l´ai fait de mauvaise facon. Il me manque peut etre encore une petite explication.
Hors ligne
#8 Le 13/01/2014, à 17:20
- k3c
Re : [script Python] Récupérer les vidéos de la BBC avec get_iplayer
@ bobW
si tu fais dans un terminal
get_iplayer news
ça te renvoie quoi ?
(vu que mon programme ne fait qu'appeler get_iplayer).
Debian 12 sur Thinkpad reconditionné
Hors ligne
#9 Le 13/01/2014, à 20:47
- BobW
Re : [script Python] Récupérer les vidéos de la BBC avec get_iplayer
bob@bob-desktop ~ $ get_iplayer news
get_iplayer v2.82, Copyright (C) 2008-2010 Phil Lewis
This program comes with ABSOLUTELY NO WARRANTY; for details use --warranty.
This is free software, and you are welcome to redistribute it under certain
conditions; use --conditions for details.
INFO: Getting tv Index Feeds
.................
Added: 48: Andy's Wild Adventures: Series 2 - 11. Lemurs, CBeebies, Children's,Factual,TV, default
Added: 59: Antiques Road Trip: S
etcetera....
Hors ligne
#10 Le 13/01/2014, à 21:19
- k3c
Re : [script Python] Récupérer les vidéos de la BBC avec get_iplayer
quand je recherche
get_iplayer magician
j'ai juste
281: Dynamo: Magician Impossible: Series 1 - Episode 1, BBC One, Audio Described,Entertainment,Highlights,Popular,TV, default,audiodescribed,
quand je télécharge, j'ai les process
get_iplayer
et rtmpdump
gg 8519 8517 1 21:13 pts/1 00:00:00 /usr/bin/perl /usr/bin/get_iplayer --get 281 --nopurge --subtitles -p http://185.17.148.40:7808
gg 8522 1942 0 21:13 pts/5 00:00:00 /bin/bash
gg 8577 8519 0 21:13 pts/1 00:00:00 rtmpdump --port 1935 --protocol 0 --playpath mp4:iplayerstream/secure_auth/800kbps/modav/bUnknown-854ba3ee-0475-4cf1-95a
en fait si tu lances le process avec en paramètre 281 et 1
tu feras la même chose que la partie graphique.
donc tu lances juste
python bbc33.py 281 1
et tu me dis si tu obtiens des process get_iplayer et rtmdump ensuite
Dernière modification par k3c (Le 13/01/2014, à 21:20)
Debian 12 sur Thinkpad reconditionné
Hors ligne
#11 Le 13/01/2014, à 22:08
- BobW
Re : [script Python] Récupérer les vidéos de la BBC avec get_iplayer
il me manque la connaissance de python
quand je lance
python bbc33.py 274 1 (le 281 est remplacé par autre valeur)
bob@bob-desktop /usr/bin $ python bbc33.py 274 1
Traceback (most recent call last):
File "bbc33.py", line 11, in <module>
import bs4 as BeautifulSoup
ImportError: No module named bs4
Hors ligne
#12 Le 13/01/2014, à 23:24
- k3c
Re : [script Python] Récupérer les vidéos de la BBC avec get_iplayer
Il te faut installer BeautifulSoup 4
$ sudo apt-get install python-bs4
et tu recommences, ça devrait être bon.
faut que je traite ce cas, c'est tout simple
try:
import bs4 as beautifulSoup
except:
baratin installez BeautifulSoup4
Debian 12 sur Thinkpad reconditionné
Hors ligne
#13 Le 14/01/2014, à 00:11
- BobW
Re : [script Python] Récupérer les vidéos de la BBC avec get_iplayer
apres installation de bs4 ca va mieux,
plusieurs proxys passent le revue maintenant,
mais pas encore un resultat, toujours des erreurs (INFO: Command exit code 1 (raw code = 256))(ERROR: Failed to get version pid metadata from iplayer site)
mais je continue le test..
je ne comprend pas bien votre try: import bs4.....et except..
Hors ligne
#14 Le 14/01/2014, à 07:29
- k3c
Re : [script Python] Récupérer les vidéos de la BBC avec get_iplayer
C'est quoi le titre de ton émission ? Je te donnerai la ligne de commande à passer.
La BBC, c'est comme tou.tv et plein d'autres. Il faut le proxy anglais pour avoir l'adresse de la vidéo.
Ensuite, la commande à passer n'a pas besoin de proxy.
Question, as-tu rtmpdump ?
Que donne
rtmpdump -version
chez moi, c'est 2.4
rtmpdump -version
RTMPDump v2.4
(c) 2010 Andrej Stepanchuk, Howard Chu, The Flvstreamer Team; license: GPL
WARNING: gnome-keyring:: couldn't connect to: /run/user/gg/keyring-ypZlqE/pkcs11: No such file or directory
ERROR: RTMP URL: No :// in url!
WARNING: Couldn't parse the specified url (sion)!
ERROR: You must specify a hostname (--host) or url (-r "rtmp://host[:port]/playpath") containing a hostname
gg@vientiane:~/bbc1$
Debian 12 sur Thinkpad reconditionné
Hors ligne
#15 Le 14/01/2014, à 12:04
- BobW
Re : [script Python] Récupérer les vidéos de la BBC avec get_iplayer
c´est également 2.4.
Et.. bonne nouvelle, votre programme fonctionne chez moi. Je vais encore ajouter un parametre output =.. au niveau du get_iplayer en puis encore tester línterface graphique
merci beaucoup pour le support
cordialement
Hors ligne
#16 Le 16/01/2014, à 17:05
- rodryg
Re : [script Python] Récupérer les vidéos de la BBC avec get_iplayer
Bonjour,
Loin de vouloir m'immiscer dans vos échanges, je trouve l'idée intéressante et j'ai une question à poser. Est-ce que get_iplayer cherche le fichier vidéo demandé (ex: Magician) sur plusieurs sites Internet se trouvant en Angleterre (ex: BBC News, BBC Entertainement, Sky,...) ou seulement sur un site dont l'adresse Url est déjà paramétrée dans le script python? Dans ce cas, peut-on paramétrer à volonté ces adresses Url?
Merci de votre réponse.
Rodryg
Hors ligne
#17 Le 16/01/2014, à 17:13
- k3c
Re : [script Python] Récupérer les vidéos de la BBC avec get_iplayer
@ rodryg
get_iplayer cherche le fichier demandé sur le site de BBC, comme le ferait iplayer dans un navigateur.
http://iplayer.bbcworldwide.com/
Le script Python se contente d'envoyer des commandes get_iplayer, mais comme nous ne sommes pas en UK, le script passe un proxy, et si ça ne marche pas, en essaye un autre.
Debian 12 sur Thinkpad reconditionné
Hors ligne
#18 Le 16/01/2014, à 17:20
- rodryg
Re : [script Python] Récupérer les vidéos de la BBC avec get_iplayer
@ k3c
Merci pour cette réponse. Est-t-il possible d'interroger d'autres sites que celui de la BBC avec get_iplayer ou un autre script?
Hors ligne
#19 Le 16/01/2014, à 18:10
- k3c
Re : [script Python] Récupérer les vidéos de la BBC avec get_iplayer
get_iplayer est fait pour la BBC et rien d'autre.
Tu penses à quel site ?
Si tu cherches des scripts pour télécharger des replays de TV étrangères, va sur
stream-recorder.com ou bien tu cherches
machaineTV xbmc
et tu trouveras des scripts qui te montreront la méthode.
Debian 12 sur Thinkpad reconditionné
Hors ligne
#20 Le 16/01/2014, à 19:12
- rodryg
Re : [script Python] Récupérer les vidéos de la BBC avec get_iplayer
Je cherche pour BBC Entertainement. http://iplayer.bbcworldwide.com/ n'en reprend qu'une partie je pense.
Merci pour l'info. Je vais voir sur stream-recorder.com. En effet le problème est de trouver un proxy selon les pays qui m'intéresse.
Hors ligne
#21 Le 10/09/2014, à 22:49
- dzecniv
Re : [script Python] Récupérer les vidéos de la BBC avec get_iplayer
@K3c, ça a l'air vraiment trop bien ce script, mais quelle galère de copier-coller les sources ! Tu ne veux pas utiliser disons gitlab (libre et gratuit et très bien fait) ? J'ai des modifs que j'aimerais proposer !
https://gitlab.com/users/sign_in
Merci !
Hors ligne
#22 Le 11/09/2014, à 08:03
- k3c
Re : [script Python] Récupérer les vidéos de la BBC avec get_iplayer
@ dzecniv
Ok je vais migrer tout ça, quel est l'avantage de gitlab sur github ou bitbucket ?
J'ai une modif à faire (le proxy ne se récupère pas bien actuellement, le site a bougé, et ça serait bien d'essayer plusieurs sites de proxys).
Edit: et aussi avoir un look moins moche que le Tkinter de base, je pensais à WxPython
et le re-écrire en Python pur, pour s'affranchir de l'installation de get_iplayer
Juste créé, vide pour l'instant
https://gitlab.com/k3ck3c/recup_bbc_replay
visible par toute personne ayant un compte sur gitlab, reste à l'alimenter
edit2 : je ne connais rien à git pour l'instant
edit3: remplacer les appels à urllib2 par l'excellent requests
http://fr.python-requests.org/en/latest/
Dernière modification par k3c (Le 11/09/2014, à 09:13)
Debian 12 sur Thinkpad reconditionné
Hors ligne
#23 Le 14/09/2014, à 23:08
- dzecniv
Re : [script Python] Récupérer les vidéos de la BBC avec get_iplayer
Merci pour ce premier effort !
et il t'en faudra encore un peu pour git alors Ne t'inquiète pas si ça te parait un peu abscons au début (c'est normal), prends ton temps mais apprend-le, ça te sera tellement utile vu que tu écris déjà des putains de scripts.
Avec git il faut comprendre les commandes de base (init, add, commit, push, pull; le reste viendra petit à petit), et c'est utile -une fois ces bases apprises- de se trouver une interface graphique qui permette de visualiser un peu mieux son dépot (git gui, gitk, http://www.git-scm.com/downloads/guis ou magit pour emacs).
Gitlab (ainsi que gitorious) sont des logiciels libres, alors que github ou bitbucket sont propriétaires. gitlab est aussi bien mieux que gitorious niveau fonctionnalités, interface et responsivité du site. L'entreprise derrière gitlab vend de l'hébergement privé et vend une version de gitlab propriétaire avec quelques fonctionnalités et service en plus.
Note que je t'ai poussé sur git alors qu'on aurait pu débattre pendant des années entre git et mercurial (hg) Mais un truc est clair c'est qu'il y a plus d'outils autour de git.
J'ai une remarque sur le nom du repo, il est peut être un peu long ? bbc_replay me paraît déjà parfait, mais c'est toi qui vois
j'attends ton premier commit, à bientôt !
ps: tu connais SVN ou un autre, au moins ?
pps: pourquoi pas en Gtk+3 tout simplement ? https://python-gtk-3-tutorial.readthedo … stall.html (vois le chap. 20 sur l'outil Glade).
Dernière modification par dzecniv (Le 14/09/2014, à 23:13)
Hors ligne
#24 Le 18/09/2014, à 13:11
- k3c
Re : [script Python] Récupérer les vidéos de la BBC avec get_iplayer
Je vais ajouter les fichiers Python aujourd'hui ou demain, par contre j'ai commencé à documenter dans le wiki
https://gitlab.com/k3ck3c/recup_bbc_replay/wikis/home
Dernière modification par k3c (Le 18/09/2014, à 13:11)
Debian 12 sur Thinkpad reconditionné
Hors ligne
#25 Le 19/09/2014, à 22:05
- k3c
Re : [script Python] Récupérer les vidéos de la BBC avec get_iplayer
bon j'ai fait plein de commandes git comme indiqué sur gitlab
et aussi
git add
bbc33.py
tk2.py
tstpsutil.py
et j'ai créé un fichier README
mais je ne les vois pas sur gitlab
Je vais étudier git...
Debian 12 sur Thinkpad reconditionné
Hors ligne