Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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()

Archlinux sur Xiaomi Air 13

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()

Archlinux sur Xiaomi Air 13

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()

Archlinux sur Xiaomi Air 13

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)


Archlinux sur Xiaomi Air 13

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).


Archlinux sur Xiaomi Air 13

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)


Archlinux sur Xiaomi Air 13

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

Archlinux sur Xiaomi Air 13

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$ 

Archlinux sur Xiaomi Air 13

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.


Archlinux sur Xiaomi Air 13

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.


Archlinux sur Xiaomi Air 13

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)


Archlinux sur Xiaomi Air 13

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 big_smile 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) tongue  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 smile

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)


Archlinux sur Xiaomi Air 13

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...


Archlinux sur Xiaomi Air 13

Hors ligne