def restart(self, dlmode, vodeventfunc, finished_func, failed_func):
        self.dlmode = dlmode
        self.fileinfo['usercallback'] = vodeventfunc
        self.finished_func = finished_func
        self.failed_func = failed_func
        if self.storage is None:
            try:
                self.init()
            except Exception as e:
                if DEBUG:
                    print_exc()
                self.failed(e)
                return

        if dlmode == DLMODE_VOD:
            if self.storage.is_finished():
                if DEBUG:
                    log(
                        self.log_prefix +
                        'restart: restart in vod mode requested, but download is finished: fileinfo',
                        self.fileinfo)
                self.vodeventcallback(
                    self.fileinfo, VODEVENT_START, {
                        'complete': True,
                        'filename': self.storage.get_dest_path(),
                        'mimetype': self.fileinfo['mimetype'],
                        'stream': None,
                        'length': self.storage.get_content_length(),
                        'bitrate': self.fileinfo['bitrate']
                    })
            else:
                if self.voddownload is not None:
                    self.storage.remove_got_data_observer(
                        self.voddownload.got_data_observer)
                    self.voddownload.shutdown()
                    self.voddownload = None
                    if DEBUG:
                        log(self.log_prefix +
                            'restart: voddownload is not None, stop current download'
                            )
                self.voddownload = VODTransporter(self, self.dlhash,
                                                  self.fileinfo,
                                                  self.vodeventcallback)
                self.storage.add_got_data_observer(
                    self.voddownload.got_data_observer)
                if not self.downloader.is_running():
                    if DEBUG:
                        log(self.log_prefix +
                            'restart: downloader is not running, start it')
                    self.downloader.start()
 def init(self, resumedata=None, content_length=None, mimetype=None):
     if DEBUG:
         log(self.log_prefix + 'init: resumedata', resumedata,
             'content_length', content_length, 'mimetype', mimetype)
     if self.dldoneflag.is_set():
         if DEBUG:
             log(self.log_prefix + 'init: done flag is set, exit')
         return
     if content_length is None:
         content_length, mimetype = self.downloader.init()
     if resumedata is not None:
         if content_length != resumedata['size']:
             raise Exception('content length differs from resumedata')
         if mimetype != resumedata['mimetype']:
             raise Exception('mime type differs from resumedata')
         filename = resumedata['filename']
         duration = resumedata.get('duration', None)
         if duration:
             bitrate = content_length / duration
             self.fileinfo['duration'] = duration
             self.fileinfo['bitrate'] = bitrate
             if DEBUG:
                 log(
                     self.log_prefix +
                     '__init__: got duration from resumedata: main_url',
                     self.main_url, 'duration', duration, 'bitrate',
                     bitrate)
     else:
         ext = self.guess_extension_from_mimetype(mimetype)
         filename = binascii.hexlify(self.dlhash)
         if len(ext):
             filename += '.' + ext
     self.fileinfo['filename'] = filename
     self.fileinfo['size'] = content_length
     self.fileinfo['mimetype'] = mimetype
     temp_dir = os.path.join(self.config['buffer_dir'],
                             binascii.hexlify(self.dlhash))
     if not os.path.isdir(temp_dir):
         os.mkdir(temp_dir)
     self.storage = Storage(self.dlhash, self.config, self.fileinfo,
                            temp_dir, resumedata, self.finished_callback)
     self.downloader.set_storage(self.storage)
     completed = self.storage.is_finished()
     if completed:
         self.finished_callback()
     if self.dlmode == DLMODE_VOD:
         if completed:
             if DEBUG:
                 log(
                     self.log_prefix +
                     '__init__: starting in vod mode, but download is finished: fileinfo',
                     self.fileinfo)
             self.vodeventcallback(
                 self.fileinfo, VODEVENT_START, {
                     'complete': True,
                     'filename': self.storage.get_dest_path(),
                     'mimetype': self.fileinfo['mimetype'],
                     'stream': None,
                     'length': self.storage.get_content_length(),
                     'bitrate': self.fileinfo['bitrate']
                 })
         else:
             if DEBUG:
                 log(
                     self.log_prefix +
                     '__init__: starting in vod mode: fileinfo',
                     self.fileinfo)
             self.voddownload = VODTransporter(self, self.dlhash,
                                               self.fileinfo,
                                               self.vodeventcallback)
             self.storage.add_got_data_observer(
                 self.voddownload.got_data_observer)
     if not completed:
         self.downloader.start()