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 02/05/2013, à 07:30

k3c

[script Python] script AdobeHDS.php en Python

Certaines vidéos utilisant le Http Dynamic Streaming, et un dénommé KSV a fait un script en php, qui à partir du manifest, récupère les fragments et les colle ensemble.
https://github.com/K-S-V/Scripts/wiki

Voici un script pour M6, qui n'a pas grand intérêt, vu que presque toutes les vidéos sont maintenant chiffrées, mais qui peut être utile pour d'autres.

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# M6 version 0.1 par k3c
import binascii
import struct
import sys
import os
import base64 
import math
import xml.etree.ElementTree
import xml.sax
import re
from urlparse import urlparse, urlunparse
import string
import unicodedata
import Queue
import threading, thread
import time
try:
    import urllib3
    from urllib3.exceptions import HTTPError
    hasUrllib3 = True
except ImportError:
    import urllib2
    from urllib2 import HTTPError
    hasUrllib3 = False

NumWorkerThreads = None

class GetUrl(object):
    def __init__(self, url, fragnum):
        self.url = url
        self.fragNum = fragnum
        self.data = None
        self.errCount = 0

QueueUrl = Queue.PriorityQueue()
QueueUrlDone = Queue.PriorityQueue()

M6Item = None

def workerRun():
    global QueueUrl, QueueUrlDone, M6Item
    while not QueueUrl.empty() and M6Item.status == 'DOWNLOADING':
        item = QueueUrl.get()[1]
        fragUrl = item.url
        try:
            item.data = M6Item.getFile(fragUrl)
            QueueUrlDone.put((item.fragNum, item))
        except HTTPError, e:
            print sys.exc_info()
            if item.errCount > 3:
                M6Item.status = 'STOPPED'
                # raise
            else:
                item.errCount += 1
                QueueUrl.put((item.fragNum, item))
        QueueUrl.task_done()
    # If we have exited the previous loop with error
    while not QueueUrl.empty():
        # print 'Ignore fragment', QueueUrl.get()[1].fragNum
        QueueUrl.get()

def worker():
    try:
        workerRun()
    except Exception, e:
        print sys.exc_info()
        M6Item.status = 'STOPPED'
        thread.interrupt_main()

def workerqdRun():
    global QueueUrlDone, M6Item
    currentFrag = 1
    outFile = open(M6Item.localfilename, "wb")
    while currentFrag <= M6Item.nbFragments and M6Item.status == 'DOWNLOADING':
        item = QueueUrlDone.get()[1]
        if currentFrag == item.fragNum:
            # M6Item.verifyFragment(item.data)
            if not M6Item.decodeFragment(item.fragNum, item.data):
                raise Exception('decodeFrament')
            M6Item.videoFragment(item.fragNum, item.data, outFile)
            print 'Fragment', currentFrag, 'OK'
            currentFrag += 1  
            requeue = False
        else:
            print 'Requeue', item.fragNum
            QueueUrlDone.put((item.fragNum, item))
            requeue = True
        QueueUrlDone.task_done()
        if requeue:
            time.sleep(1)
    outFile.close()
    # If we have exited the previous loop with error
    if currentFrag > M6Item.nbFragments:
        M6Item.status = 'COMPLETED'
    else:
        while not QueueUrlDone.empty():
            print 'Ignore fragment', QueueUrlDone.get()[1].fragNum

def workerqd():
    try:
        workerqdRun()
    except Exception, e:
        print sys.exc_info()
        M6Item.status = 'STOPPED'
        thread.interrupt_main()

validFilenameChars = "-_.() %s%s" % (string.ascii_letters, string.digits)

def removeDisallowedFilenameChars(filename):
    "Remove invalid filename characters" 
    filename = filename.decode('ASCII', 'ignore')
    cleanedFilename = unicodedata.normalize('NFKD', filename).encode('ASCII', 'ignore')
    cleanedFilename = cleanedFilename.replace(' ', '_')
    return ''.join(c for c in cleanedFilename if c in validFilenameChars)              

class M6(object):
    def __init__(self, url, dest = '', proxy=None):
        self.status = 'INIT'
        self.url = url
        self.proxy = proxy
        self.bitrate = 0
        self.duration = 0                        
        self.nbFragments = 0
        self.tagHeaderLen = 11
        self.prevTagSize = 4
        urlp = urlparse(url)
        fn = os.path.basename(urlp.path)
        self.localfilename = \
            os.path.join(dest, os.path.splitext(fn)[0]) + '.flv'
        self.localfilename = removeDisallowedFilenameChars(self.localfilename)
        self.urlbootstrap = ''
        self.bootstrapInfoId = ''
        self.baseUrl = urlunparse((urlp.scheme, urlp.netloc, 
                                   os.path.dirname(urlp.path), 
                                            '', '', ''))
        if hasUrllib3:
            self.pm = urllib3.PoolManager(num_pools=100)
            # self.pm = urllib3.connection_from_url(self.baseUrl)
        self.manifest = self.getManifest(self.url)
        self.parseManifest()        
        # self.pm = urllib3.connection_from_url(self.urlbootstrap)
      
    def download(self):
        global QueueUrl, QueueUrlDone, M6Item
        M6Item = self
        self.status = 'DOWNLOADING'
        # self.outFile = open(self.localfilename, "wb")

        for i in range(self.nbFragments):
            fragUrl = self.urlbootstrap + 'Seg1-Frag'+str(i + 1)
            QueueUrl.put((i + 1, GetUrl(fragUrl, i + 1)))

        t = threading.Thread(target=workerqd)
        # t.daemon = True
        t.start()

        for i in range(NumWorkerThreads):
            t = threading.Thread(target=worker)
            # t.daemon = True
            t.start()

        # QueueUrl.join()
        # QueueUrlDone.join()
        while self.status == 'DOWNLOADING':
            try:
                time.sleep(3)
            except (KeyboardInterrupt, Exception), e:
                print sys.exc_info()
                self.status = 'STOPPED'
        # self.outFile.close()
        if self.status != 'STOPPED':
            self.status = 'COMPLETED'

    def getInfos(self):
        infos = {}
        infos['status']        = self.status
        infos['localfilename'] = self.localfilename
        infos['proxy']         = self.proxy
        infos['url']           = self.url
        infos['bitrate']       = self.bitrate
        infos['duration']      = self.duration
        infos['nbFragments']   = self.nbFragments
        infos['urlbootstrap']  = self.urlbootstrap
        infos['baseUrl']       = self.baseUrl
        infos['drmId']         = self.drmAdditionalHeaderId
        return infos

    if hasUrllib3:
        def getFile(self, url):
            headers = urllib3.make_headers(
                keep_alive=True,
                user_agent='Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:17.0) Gecko/20100101 Firefox/17.0',
                accept_encoding=True)
            r = self.pm.request('GET', url, headers=headers)
            if r.status != 200:
                print 'Error downloading', r.status, url
                # sys.exit(1)
            return r.data
    else:
        def getFile(self, url):
            txheaders = {'User-Agent':
                             'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:17.0) Gecko/20100101 Firefox/17.0',
                         'Keep-Alive' : '600',
                         'Connection' : 'keep-alive'
                         }
            request = urllib2.Request(url, None, txheaders)
            response = urllib2.urlopen(request)
            return response.read()

    def getManifest(self, url):
        self.status = 'GETTING MANIFEST'
        return xml.etree.ElementTree.fromstring(self.getFile(url))

    def parseManifest(self):
        self.status = 'PARSING MANIFEST'
        try:
            root = self.manifest
            # Duration
            self.duration = float(root.find("{http://ns.adobe.com/f4m/1.0}duration").text)
            # nombre de fragment
            self.nbFragments = int(math.ceil(self.duration/3))
            # streamid
            self.streamid = root.findall("{http://ns.adobe.com/f4m/1.0}media")[-1]
            # media
            self.media = None
            for media in root.findall('{http://ns.adobe.com/f4m/1.0}media'):
                if int(media.attrib['bitrate']) > self.bitrate:
                    self.media = media
                    self.bitrate = int(media.attrib['bitrate'])
                    self.bootstrapInfoId = media.attrib['bootstrapInfoId']
                    self.drmAdditionalHeaderId = media.attrib['drmAdditionalHeaderId']
                    self.flvHeader = base64.b64decode(media.find("{http://ns.adobe.com/f4m/1.0}metadata").text)
            # Bootstrap URL
            self.urlbootstrap = self.media.attrib["url"]
            # urlbootstrap
            self.urlbootstrap = self.baseUrl + "/" + self.urlbootstrap
        except Exception, e:
            print("Not possible to parse the manifest")
            print e
            sys.exit(-1)

    def stop(self):
        self.status = 'STOPPED'
    
    def videoFragment(self, fragNum, data, fout):
        start = M6Item.videostart(fragNum, data)
        if fragNum == 1:
            self.videoBootstrap(fout)
        fout.write(data[start:])

    def videoBootstrap(self, fout):
        # Ajout de l'en-tête FLV
        # fout.write(binascii.a2b_hex("464c560105000000090000000012"))
        # fout.write(binascii.a2b_hex("00018700000000000000")) 
        bootstrap = "464c560105000000090000000012"
        bootstrap += "%06X" % (len(self.flvHeader),)
        bootstrap += "%06X%08X" % (0, 0)
        fout.write(binascii.a2b_hex(bootstrap))
        # Ajout de l'header du fichier
        fout.write(self.flvHeader)
        fout.write(binascii.a2b_hex("00019209"))

    def videostart(self, fragNum, fragData):
        """
        Trouve le debut de la video dans un fragment
        """
        start = fragData.find("mdat") + 12
        # print "start ", start
        # For all fragment (except frag1)
        if (fragNum == 1):
            start += 0
        else:
            # Skip 2 FLV tags
            for dummy in range(2):
                tagLen, = struct.unpack_from(">L", fragData, start)  # Read 32 bits (big endian)
                # print 'tagLen = %X' % tagLen
                tagLen &= 0x00ffffff  # Take the last 24 bits
                # print 'tagLen2 = %X' % tagLen
                start += tagLen + self.tagHeaderLen + 4  # 11 = tag header len ; 4 = tag footer len
        return start           

    def readBoxHeader(self, data, pos=0):
        boxSize, = struct.unpack_from(">L", data, pos)  # Read 32 bits (big endian)struct.unpack_from(">L", data, pos)  # Read 32 bits (big endian)
        boxType = data[pos + 4 : pos + 8]
        if boxSize == 1:
            boxSize, = struct.unpack_from(">Q", data, pos + 8)  # Read 64 bits (big endian)
            boxSize -= 16
            pos += 16
        else:
            boxSize -= 8
            pos += 8
        if boxSize <= 0:
            boxSize = 0
        return (pos, boxType, boxSize)

    def verifyFragment(self, data):
        pos = 0
        fragLen = len(data)
        while pos < fragLen:
            pos, boxType, boxSize = self.readBoxHeader(data, pos)
            if boxType == 'mdat':
                slen = len(data[pos:])
                # print 'mdat %s' % (slen,)
                if boxSize and slen == boxSize:
                    return True
                else:
                    boxSize = fraglen - pos
            pos += boxSize
        return False

    def decodeFragment(self, fragNum, data):
        fragPos = 0
        fragLen = len(data)
        if not self.verifyFragment(data):
            print "Skipping fragment number", fragNum
            return false
        while fragPos < fragLen:
            fragPos, boxType, boxSize = self.readBoxHeader(data, fragPos)
            if boxType == 'mdat':
                fragLen = fragPos + boxSize
                break
            fragPos += boxSize
        while fragPos < fragLen:
            packetType = self.readInt8(data, fragPos)
            packetSize = self.readInt24(data, fragPos + 1)
            packetTS = self.readInt24(data, fragPos + 4)
            packetTS |= self.readInt8(data, fragPos + 7) << 24
            if packetTS & 0x80000000:
                packetTS &= 0x7FFFFFFF
            totalTagLen = self.tagHeaderLen + packetSize + self.prevTagSize
            # print 'decodeFragment', fragNum, packetType, packetSize, packetTS, totalTagLen
            # time.sleep(1)
            if packetType in (10, 11):
                print "This stream is encrypted with Akamai DRM. Decryption of such streams isn't currently possible with this script."
                return False
            if packetType in (40, 41):
                print "This stream is encrypted with FlashAccess DRM. Decryption of such streams isn't currently possible with this script."
                return False
            fragPos += totalTagLen
        return True

    def readInt8(self, data, pos):
        return ord(struct.unpack_from(">c", data, pos)[0])

    def readInt24(self, data, pos):
        return struct.unpack_from(">L", "\0" + data[pos:pos + 3], 0)[0]

def main():
    global NumWorkerThreads
    if len(sys.argv) > 2:
        NumWorkerThreads = int(sys.argv[2])
    else:
        NumWorkerThreads = 7
    st = time.time()
    x = M6(sys.argv[1])
    infos = x.getInfos()
    for item in infos.items():
        print item[0]+' : '+str(item[1])
    x.download()
    print 'Download time:', time.time() - st

if __name__ == "__main__":
    main()

Debian 12 sur Thinkpad reconditionné

Hors ligne

#2 Le 21/05/2013, à 20:18

dubis22

Re : [script Python] script AdobeHDS.php en Python

Bonjour,

Pourrais tu en dire plus j'ai essayé de lancer le script mais j'ai plein d'erreur. Je pense qu'il me manque des modules mais lesquels...?

Traceback (most recent call last):
  File "./m6.py", line 365, in <module>
    main()
  File "./m6.py", line 357, in main
    x = M6(sys.argv[1])
  File "./m6.py", line 141, in __init__
    self.manifest = self.getManifest(self.url)
  File "./m6.py", line 214, in getManifest
    return xml.etree.ElementTree.fromstring(self.getFile(url))
  File "/usr/lib/python2.7/xml/etree/ElementTree.py", line 1301, in XML
    parser.feed(text)
  File "/usr/lib/python2.7/xml/etree/ElementTree.py", line 1643, in feed
    self._raiseerror(v)
  File "/usr/lib/python2.7/xml/etree/ElementTree.py", line 1507, in _raiseerror
    raise err
xml.etree.ElementTree.ParseError: undefined entity: line 13, column 39

Pensez à passer vos sujets en [Résolu] lorsque ceux-ci le sont.

Hors ligne

#3 Le 24/05/2013, à 20:07

k3c

Re : [script Python] script AdobeHDS.php en Python

Il faut passer le manifest en paramètre.

Avec l'extension Firefox de KSV (HDS Link Detector); tu copies la ligne de commande dans ton historique de commandes

gg@gg-SATELLITE-L755:~$ #php AdobeHDS.php --manifest "http://lb.cdn.m6web.fr/s/cgd/5/d5cb8a6ad9b6500b2c656c80504601ad/519fff7e/RlI%3D/hds/e/0/a/Pekin-Express_c11293096_Ils-ne-vous-ont-pas-/Pekin-Express_c11293096_Ils-ne-vous-ont-pas-.f4m" --delete

Puis tu lances le programme avec le manifest en paramètre (évidemment ça causerait plus avec une vidéo non chiffrée)


gg@gg-SATELLITE-L755:~$ python m6/m6_7.py "http://lb.cdn.m6web.fr/s/cgd/5/d5cb8a6ad9b6500b2c656c80504601ad/519fff7e/RlI%3D/hds/e/0/a/Pekin-Express_c11293096_Ils-ne-vous-ont-pas-/Pekin-Express_c11293096_Ils-ne-vous-ont-pas-.f4m"
status : PARSING MANIFEST
nbFragments : 782
urlbootstrap : http://lb.cdn.m6web.fr/s/cgd/5/d5cb8a6ad9b6500b2c656c80504601ad/519fff7e/RlI%3D/hds/e/0/a/Pekin-Express_c11293096_Ils-ne-vous-ont-pas-/Pekin-Express_c11293096_Ils-ne-vous-ont-pas-_800k
drmId : drmMetadata3753
url : http://lb.cdn.m6web.fr/s/cgd/5/d5cb8a6ad9b6500b2c656c80504601ad/519fff7e/RlI%3D/hds/e/0/a/Pekin-Express_c11293096_Ils-ne-vous-ont-pas-/Pekin-Express_c11293096_Ils-ne-vous-ont-pas-.f4m
baseUrl : http://lb.cdn.m6web.fr/s/cgd/5/d5cb8a6ad9b6500b2c656c80504601ad/519fff7e/RlI%3D/hds/e/0/a/Pekin-Express_c11293096_Ils-ne-vous-ont-pas-
localfilename : Pekin-Express_c11293096_Ils-ne-vous-ont-pas-.flv
proxy : None
duration : 2344.384
bitrate : 800
Requeue 5
This stream is encrypted with FlashAccess DRM. Decryption of such streams isn't currently possible with this script.
(<type 'exceptions.Exception'>, Exception('decodeFrament',), <traceback object at 0xb6590eb4>)
(<type 'exceptions.KeyboardInterrupt'>, KeyboardInterrupt(), <traceback object at 0xb6ea8f04>)
Download time: 3.12997698784
gg@gg-SATELLITE-L755:~$ 

Debian 12 sur Thinkpad reconditionné

Hors ligne

#4 Le 24/05/2013, à 21:06

k3c

Re : [script Python] script AdobeHDS.php en Python

Tiens j'ai retrouvé un affichage avec une ancienne vidéo de M6

gg@gg-SATELLITE-L755:~/m6$ python m6_6.py
"http://lb.cdn.m6web.fr/s/cgd/5/1437c505f7d7b4a8985bf26b35c2d348/516fd27b/RlI%3D/hds/b/0/d/Pekin-Express_c11284682_Ils-ne-vous-ont-pas-/Pekin-Express_c11284682_Ils-ne-vous-ont-pas-.f4m"
status : PARSING MANIFEST
nbFragments : 746
urlbootstrap : http://lb.cdn.m6web.fr/s/cgd/5/1437c505f7d7b4a8985bf26b35c2d348/516fd27b/RlI%3D/hds/b/0/d/Pekin-Express_c11284682_Ils-ne-vous-ont-pas-/Pekin-Express_c11284682_Ils-ne-vous-ont-pas-_800k
drmId : drmMetadata6976
url : http://lb.cdn.m6web.fr/s/cgd/5/1437c505f7d7b4a8985bf26b35c2d348/516fd27b/RlI%3D/hds/b/0/d/Pekin-Express_c11284682_Ils-ne-vous-ont-pas-/Pekin-Express_c11284682_Ils-ne-vous-ont-pas-.f4m
baseUrl : http://lb.cdn.m6web.fr/s/cgd/5/1437c505f7d7b4a8985bf26b35c2d348/516fd27b/RlI%3D/hds/b/0/d/Pekin-Express_c11284682_Ils-ne-vous-ont-pas-
localfilename : Pekin-Express_c11284682_Ils-ne-vous-ont-pas-.flv
proxy : None
duration : 2235.62666667
bitrate : 800
Requeue 2
Fragment 1 OK
Fragment 2 OK
Fragment 3 OK
Fragment 4 OK
Fragment 5 OK
Fragment 6 OK
Fragment 7 OK
Fragment 8 OK
Fragment 9 OK
Fragment 10 OK
Fragment 11 OK
Requeue 13
Fragment 12 OK
Fragment 13 OK
Fragment 14 OK
Fragment 15 OK
Requeue 17
Requeue 17
Requeue 17
Requeue 17
Requeue 17
Fragment 16 OK
Fragment 17 OK
Fragment 18 OK
Fragment 19 OK
Fragment 20 OK
Fragment 21 OK
Fragment 22 OK
Fragment 23 OK
Fragment 24 OK
Fragment 25 OK
Fragment 26 OK
Fragment 27 OK
Fragment 28 OK
Fragment 29 OK
Fragment 30 OK
Fragment 31 OK
Fragment 32 OK
Fragment 33 OK
Fragment 34 OK
Fragment 35 OK
Fragment 36 OK
Fragment 37 OK
Fragment 38 OK
Requeue 40
Requeue 40
Fragment 39 OK
Fragment 40 OK
Fragment 41 OK
Fragment 42 OK
Fragment 43 OK
Fragment 44 OK
Fragment 45 OK
Fragment 46 OK
Fragment 47 OK
Fragment 48 OK
Fragment 49 OK
Fragment 50 OK
Fragment 51 OK
Fragment 52 OK
Requeue 54
Fragment 53 OK
Fragment 54 OK
Fragment 55 OK
Fragment 56 OK
Fragment 57 OK
Fragment 58 OK
Fragment 59 OK
Fragment 60 OK
Fragment 61 OK
Fragment 62 OK
Fragment 63 OK
Fragment 64 OK
Fragment 65 OK
Fragment 66 OK
Fragment 67 OK
Fragment 68 OK
Fragment 69 OK
Fragment 70 OK
Fragment 71 OK
Fragment 72 OK
Fragment 73 OK
Fragment 74 OK
Fragment 75 OK
Fragment 76 OK
Fragment 77 OK
Fragment 78 OK
Fragment 79 OK
Fragment 80 OK
Fragment 81 OK
Fragment 82 OK
Fragment 83 OK
Fragment 84 OK
Fragment 85 OK
Fragment 86 OK
Fragment 87 OK
Fragment 88 OK
Fragment 89 OK
Fragment 90 OK
Fragment 91 OK
Fragment 92 OK
Fragment 93 OK
Fragment 94 OK
Fragment 95 OK
Fragment 96 OK
Fragment 97 OK
Fragment 98 OK
Fragment 99 OK
Fragment 100 OK
Fragment 101 OK
Fragment 102 OK
Fragment 103 OK
Fragment 104 OK
Fragment 105 OK
Fragment 106 OK
Fragment 107 OK
Fragment 108 OK
Fragment 109 OK
Fragment 110 OK
Fragment 111 OK
Fragment 112 OK
Fragment 113 OK
Fragment 114 OK
Fragment 115 OK
Fragment 116 OK
Fragment 117 OK
Requeue 119
Fragment 118 OK
Fragment 119 OK
Fragment 120 OK
Fragment 121 OK
Fragment 122 OK
Fragment 123 OK
Fragment 124 OK
Fragment 125 OK
Fragment 126 OK
Fragment 127 OK
Fragment 128 OK
Fragment 129 OK
Fragment 130 OK
Requeue 132
Fragment 131 OK
Fragment 132 OK
Fragment 133 OK
Fragment 134 OK
Fragment 135 OK
Fragment 136 OK
Fragment 137 OK
Requeue 139
Fragment 138 OK
Fragment 139 OK
Fragment 140 OK
Fragment 141 OK
Fragment 142 OK
Fragment 143 OK
Fragment 144 OK
Fragment 145 OK
Fragment 146 OK
Fragment 147 OK
Fragment 148 OK
Fragment 149 OK
Fragment 150 OK
Fragment 151 OK
Fragment 152 OK
Fragment 153 OK
Fragment 154 OK
Fragment 155 OK
Requeue 157
Fragment 156 OK
Fragment 157 OK
Fragment 158 OK
Fragment 159 OK
Fragment 160 OK
Fragment 161 OK
Fragment 162 OK
Fragment 163 OK
Fragment 164 OK
Fragment 165 OK
Fragment 166 OK
Fragment 167 OK
Requeue 169
Fragment 168 OK
Fragment 169 OK
Fragment 170 OK
Fragment 171 OK
Fragment 172 OK
Fragment 173 OK
Fragment 174 OK
Fragment 175 OK
Fragment 176 OK
Fragment 177 OK
Fragment 178 OK
Fragment 179 OK
Fragment 180 OK
Fragment 181 OK
Fragment 182 OK
Fragment 183 OK
Fragment 184 OK
Requeue 186
Fragment 185 OK
Fragment 186 OK
Fragment 187 OK
Fragment 188 OK
Fragment 189 OK
Fragment 190 OK
Fragment 191 OK
Fragment 192 OK
Fragment 193 OK
Fragment 194 OK
Fragment 195 OK
Fragment 196 OK
Fragment 197 OK
Fragment 198 OK
Fragment 199 OK
Requeue 201
Fragment 200 OK
Fragment 201 OK
Fragment 202 OK
Fragment 203 OK
Fragment 204 OK
Fragment 205 OK
Fragment 206 OK
Fragment 207 OK
Fragment 208 OK
Fragment 209 OK
Fragment 210 OK
Fragment 211 OK
Fragment 212 OK
Fragment 213 OK
Fragment 214 OK
Fragment 215 OK
Requeue 217
Fragment 216 OK
Fragment 217 OK
Fragment 218 OK
Fragment 219 OK
Fragment 220 OK
Fragment 221 OK
Fragment 222 OK
Fragment 223 OK
Fragment 224 OK
Fragment 225 OK
Fragment 226 OK
Fragment 227 OK
Fragment 228 OK
Fragment 229 OK
Fragment 230 OK
Fragment 231 OK
Fragment 232 OK
Fragment 233 OK
Fragment 234 OK
Fragment 235 OK
Fragment 236 OK
Fragment 237 OK
Requeue 239
Fragment 238 OK
Fragment 239 OK
Fragment 240 OK
Fragment 241 OK
Fragment 242 OK
Fragment 243 OK
Fragment 244 OK
Fragment 245 OK
Fragment 246 OK
Fragment 247 OK
Fragment 248 OK
Fragment 249 OK
Fragment 250 OK
Fragment 251 OK
Requeue 253
Requeue 253
Requeue 253
Requeue 253
Requeue 253
Requeue 253
Fragment 252 OK
Fragment 253 OK
Fragment 254 OK
Fragment 255 OK
Fragment 256 OK
Fragment 257 OK
Fragment 258 OK
Fragment 259 OK
Fragment 260 OK
Fragment 261 OK
Fragment 262 OK
Fragment 263 OK
Fragment 264 OK
Fragment 265 OK
Fragment 266 OK
Fragment 267 OK
Fragment 268 OK
Fragment 269 OK
Fragment 270 OK
Requeue 272
Fragment 271 OK
Fragment 272 OK
Fragment 273 OK
Fragment 274 OK
Fragment 275 OK
Fragment 276 OK
Fragment 277 OK
Fragment 278 OK
Fragment 279 OK
Fragment 280 OK
Fragment 281 OK
Fragment 282 OK
Fragment 283 OK
Fragment 284 OK
Fragment 285 OK
Fragment 286 OK
Fragment 287 OK
Fragment 288 OK
Fragment 289 OK
Fragment 290 OK
Fragment 291 OK
Fragment 292 OK
Fragment 293 OK
Fragment 294 OK
Fragment 295 OK
Fragment 296 OK
Fragment 297 OK
Fragment 298 OK
Fragment 299 OK
Fragment 300 OK
Fragment 301 OK
Fragment 302 OK
Fragment 303 OK
Fragment 304 OK
Fragment 305 OK
Fragment 306 OK
Fragment 307 OK
Fragment 308 OK
Fragment 309 OK
Fragment 310 OK
Fragment 311 OK
Fragment 312 OK
Fragment 313 OK
Fragment 314 OK
Fragment 315 OK
Fragment 316 OK
Fragment 317 OK
Fragment 318 OK
Fragment 319 OK
Fragment 320 OK
Fragment 321 OK
Fragment 322 OK
Fragment 323 OK
Fragment 324 OK
Fragment 325 OK
Fragment 326 OK
Fragment 327 OK
Fragment 328 OK
Fragment 329 OK
Fragment 330 OK
Fragment 331 OK
Fragment 332 OK
Fragment 333 OK
Fragment 334 OK
Fragment 335 OK
Fragment 336 OK
Fragment 337 OK
Fragment 338 OK
Fragment 339 OK
Fragment 340 OK
Fragment 341 OK
Fragment 342 OK
Fragment 343 OK
Fragment 344 OK
Fragment 345 OK
Requeue 348
Fragment 346 OK
Fragment 347 OK
Fragment 348 OK
Fragment 349 OK
Fragment 350 OK
Requeue 353
Requeue 352
Requeue 352
Requeue 352
Fragment 351 OK
Fragment 352 OK
Fragment 353 OK
Fragment 354 OK
Fragment 355 OK
Requeue 358
Fragment 356 OK
Fragment 357 OK
Fragment 358 OK
Requeue 360
Fragment 359 OK
Fragment 360 OK
Fragment 361 OK
Fragment 362 OK
Fragment 363 OK
Fragment 364 OK
Fragment 365 OK
Fragment 366 OK
Fragment 367 OK
Fragment 368 OK
Fragment 369 OK
Fragment 370 OK
Fragment 371 OK
Fragment 372 OK
Fragment 373 OK
Fragment 374 OK
Fragment 375 OK
Fragment 376 OK
Fragment 377 OK
Fragment 378 OK
Fragment 379 OK
Fragment 380 OK
Fragment 381 OK
Fragment 382 OK
Fragment 383 OK
Fragment 384 OK
Fragment 385 OK
Fragment 386 OK
Fragment 387 OK
Fragment 388 OK
Fragment 389 OK
Fragment 390 OK
Fragment 391 OK
Fragment 392 OK
Fragment 393 OK
Requeue 395
Fragment 394 OK
Fragment 395 OK
Fragment 396 OK
Fragment 397 OK
Fragment 398 OK
Fragment 399 OK
Fragment 400 OK
Fragment 401 OK
Fragment 402 OK
Fragment 403 OK
Fragment 404 OK
Fragment 405 OK
Fragment 406 OK
Fragment 407 OK
Fragment 408 OK
Fragment 409 OK
Fragment 410 OK
Requeue 412
Fragment 411 OK
Fragment 412 OK
Fragment 413 OK
Fragment 414 OK
Fragment 415 OK
Fragment 416 OK
Fragment 417 OK
Fragment 418 OK
Fragment 419 OK
Fragment 420 OK
Fragment 421 OK
Fragment 422 OK
Fragment 423 OK
Requeue 425
Fragment 424 OK
Fragment 425 OK
Fragment 426 OK
Fragment 427 OK
Fragment 428 OK
Fragment 429 OK
Fragment 430 OK
Fragment 431 OK
Fragment 432 OK
Fragment 433 OK
Fragment 434 OK
Fragment 435 OK
Fragment 436 OK
Fragment 437 OK
Fragment 438 OK
Fragment 439 OK
Requeue 441
Fragment 440 OK
Fragment 441 OK
Fragment 442 OK
Fragment 443 OK
Fragment 444 OK
Fragment 445 OK
Fragment 446 OK
Fragment 447 OK
Fragment 448 OK
Fragment 449 OK
Fragment 450 OK
Fragment 451 OK
Fragment 452 OK
Requeue 454
Fragment 453 OK
Fragment 454 OK
Fragment 455 OK
Fragment 456 OK
Fragment 457 OK
Fragment 458 OK
Fragment 459 OK
Fragment 460 OK
Fragment 461 OK
Fragment 462 OK
Fragment 463 OK
Fragment 464 OK
Fragment 465 OK
Fragment 466 OK
Fragment 467 OK
Fragment 468 OK
Fragment 469 OK
Requeue 471
Fragment 470 OK
Fragment 471 OK
Fragment 472 OK
Fragment 473 OK
Fragment 474 OK
Fragment 475 OK
Fragment 476 OK
Fragment 477 OK
Fragment 478 OK
Fragment 479 OK
Fragment 480 OK
Fragment 481 OK
Fragment 482 OK
Fragment 483 OK
Requeue 485
Fragment 484 OK
Fragment 485 OK
Fragment 486 OK
Fragment 487 OK
Fragment 488 OK
Fragment 489 OK
Fragment 490 OK
Fragment 491 OK
Fragment 492 OK
Fragment 493 OK
Fragment 494 OK
Fragment 495 OK
Fragment 496 OK
Fragment 497 OK
Fragment 498 OK
Fragment 499 OK
Fragment 500 OK
Fragment 501 OK
Fragment 502 OK
Fragment 503 OK
Fragment 504 OK
Requeue 507
Fragment 505 OK
Fragment 506 OK
Fragment 507 OK
Fragment 508 OK
Fragment 509 OK
Fragment 510 OK
Fragment 511 OK
Fragment 512 OK
Fragment 513 OK
Fragment 514 OK
Fragment 515 OK
Fragment 516 OK
Fragment 517 OK
Fragment 518 OK
Fragment 519 OK
Fragment 520 OK
Fragment 521 OK
Fragment 522 OK
Fragment 523 OK
Fragment 524 OK
Fragment 525 OK
Fragment 526 OK
Fragment 527 OK
Requeue 529
Fragment 528 OK
Fragment 529 OK
Fragment 530 OK
Fragment 531 OK
Fragment 532 OK
Fragment 533 OK
Fragment 534 OK
Fragment 535 OK
Fragment 536 OK
Fragment 537 OK
Fragment 538 OK
Fragment 539 OK
Fragment 540 OK
Fragment 541 OK
Fragment 542 OK
Fragment 543 OK
Fragment 544 OK
Fragment 545 OK
Fragment 546 OK
Fragment 547 OK
Fragment 548 OK
Fragment 549 OK
Fragment 550 OK
Fragment 551 OK
Requeue 553
Fragment 552 OK
Fragment 553 OK
Fragment 554 OK
Fragment 555 OK
Fragment 556 OK
Fragment 557 OK
Fragment 558 OK
Fragment 559 OK
Fragment 560 OK
Fragment 561 OK
Fragment 562 OK
Fragment 563 OK
Fragment 564 OK
Fragment 565 OK
Fragment 566 OK
Requeue 568
Fragment 567 OK
Fragment 568 OK
Fragment 569 OK
Fragment 570 OK
Fragment 571 OK
Fragment 572 OK
Fragment 573 OK
Fragment 574 OK
Fragment 575 OK
Fragment 576 OK
Fragment 577 OK
Fragment 578 OK
Fragment 579 OK
Fragment 580 OK
Requeue 582
Fragment 581 OK
Fragment 582 OK
Fragment 583 OK
Fragment 584 OK
Fragment 585 OK
Fragment 586 OK
Fragment 587 OK
Fragment 588 OK
Fragment 589 OK
Fragment 590 OK
Fragment 591 OK
Fragment 592 OK
Fragment 593 OK
Fragment 594 OK
Fragment 595 OK
Requeue 597
Fragment 596 OK
Fragment 597 OK
Fragment 598 OK
Fragment 599 OK
Fragment 600 OK
Fragment 601 OK
Fragment 602 OK
Fragment 603 OK
Fragment 604 OK
Fragment 605 OK
Fragment 606 OK
Fragment 607 OK
Fragment 608 OK
Requeue 610
Fragment 609 OK
Fragment 610 OK
Fragment 611 OK
Fragment 612 OK
Fragment 613 OK
Fragment 614 OK
Fragment 615 OK
Fragment 616 OK
Fragment 617 OK
Fragment 618 OK
Fragment 619 OK
Fragment 620 OK
Fragment 621 OK
Fragment 622 OK
Fragment 623 OK
Fragment 624 OK
Fragment 625 OK
Requeue 628
Fragment 626 OK
Fragment 627 OK
Fragment 628 OK
Fragment 629 OK
Fragment 630 OK
Fragment 631 OK
Fragment 632 OK
Fragment 633 OK
Fragment 634 OK
Fragment 635 OK
Fragment 636 OK
Fragment 637 OK
Fragment 638 OK
Fragment 639 OK
Fragment 640 OK
Fragment 641 OK
Fragment 642 OK
Fragment 643 OK
Requeue 645
Fragment 644 OK
Fragment 645 OK
Fragment 646 OK
Fragment 647 OK
Fragment 648 OK
Fragment 649 OK
Fragment 650 OK
Fragment 651 OK
Fragment 652 OK
Fragment 653 OK
Fragment 654 OK
Fragment 655 OK
Requeue 659
Fragment 656 OK
Fragment 657 OK
Fragment 658 OK
Fragment 659 OK
Fragment 660 OK
Fragment 661 OK
Fragment 662 OK
Requeue 664
Requeue 664
Requeue 664
Requeue 664
Requeue 664
Fragment 663 OK
Fragment 664 OK
Fragment 665 OK
Fragment 666 OK
Fragment 667 OK
Fragment 668 OK
Fragment 669 OK
Fragment 670 OK
Fragment 671 OK
Fragment 672 OK
Fragment 673 OK
Fragment 674 OK
Fragment 675 OK
Fragment 676 OK
Fragment 677 OK
Fragment 678 OK
Fragment 679 OK
Fragment 680 OK
Fragment 681 OK
Fragment 682 OK
Fragment 683 OK
Fragment 684 OK
Fragment 685 OK
Fragment 686 OK
Fragment 687 OK
Fragment 688 OK
Fragment 689 OK
Fragment 690 OK
Fragment 691 OK
Fragment 692 OK
Fragment 693 OK
Fragment 694 OK
Fragment 695 OK
Fragment 696 OK
Fragment 697 OK
Fragment 698 OK
Fragment 699 OK
Fragment 700 OK
Fragment 701 OK
Fragment 702 OK
Fragment 703 OK
Fragment 704 OK
Fragment 705 OK
Fragment 706 OK
Fragment 707 OK
Fragment 708 OK
Fragment 709 OK
Fragment 710 OK
Fragment 711 OK
Fragment 712 OK
Fragment 713 OK
Fragment 714 OK
Fragment 715 OK
Fragment 716 OK
Fragment 717 OK
Fragment 718 OK
Fragment 719 OK
Fragment 720 OK
Fragment 721 OK
Fragment 722 OK
Fragment 723 OK
Fragment 724 OK
Fragment 725 OK
Fragment 726 OK
Fragment 727 OK
Fragment 728 OK
Fragment 729 OK
Fragment 730 OK
Fragment 731 OK
Fragment 732 OK
Fragment 733 OK
Fragment 734 OK
Fragment 735 OK
Fragment 736 OK
Fragment 737 OK
Requeue 740
Fragment 738 OK
Fragment 739 OK
Fragment 740 OK
Fragment 741 OK
Fragment 742 OK
Fragment 743 OK
Fragment 744 OK
Fragment 745 OK
Fragment 746 OK
Download time: 63.1088309288
gg@gg-SATELLITE-L755:~/m6$ ls -alrt
Pekin-Express_c11284682_Ils-ne-vous-ont-pas-.flv
-rw-rw-r-- 1 gg gg 265908240 avril 18 08:03

Debian 12 sur Thinkpad reconditionné

Hors ligne