diff options
Diffstat (limited to 'plugin.video.mediathekview/resources/lib/updater.py')
-rw-r--r-- | plugin.video.mediathekview/resources/lib/updater.py | 48 |
1 files changed, 26 insertions, 22 deletions
diff --git a/plugin.video.mediathekview/resources/lib/updater.py b/plugin.video.mediathekview/resources/lib/updater.py index afdf840..95c99d0 100644 --- a/plugin.video.mediathekview/resources/lib/updater.py +++ b/plugin.video.mediathekview/resources/lib/updater.py @@ -2,9 +2,15 @@ # Copyright (c) 2017-2018, Leo Moll # -- Imports ------------------------------------------------ -import os, urllib2, subprocess, ijson, datetime, time -import xml.etree.ElementTree as etree - +import os +import time +import ijson +import random +import urllib2 +import datetime +import subprocess + +import defusedxml.ElementTree as etree import resources.lib.mvutils as mvutils from operator import itemgetter @@ -12,6 +18,7 @@ from operator import itemgetter from resources.lib.store import Store from resources.lib.exceptions import DatabaseCorrupted from resources.lib.exceptions import DatabaseLost +from resources.lib.exceptions import ExitRequested # -- Unpacker support --------------------------------------- upd_can_bz2 = False @@ -106,7 +113,7 @@ class MediathekViewUpdater( object ): self.Import( full ) def Import( self, full ): - ( _, compfile, destfile, avgrecsize ) = self._get_update_info( full ) + ( _, _, destfile, avgrecsize ) = self._get_update_info( full ) if not mvutils.file_exists( destfile ): self.logger.error( 'File {} does not exists', destfile ) return False @@ -178,14 +185,14 @@ class MediathekViewUpdater( object ): except DatabaseLost as err: self.logger.error( '{}', err ) self.notifier.CloseUpdateProgress() - except IOError as err: + except Exception as err: self.logger.error( 'Error {} wile processing {}', err, destfile ) self._update_end( full, 'ABORTED' ) self.notifier.CloseUpdateProgress() return False def GetNewestList( self, full ): - ( url, compfile, destfile, avgrecsize ) = self._get_update_info( full ) + ( url, compfile, destfile, _ ) = self._get_update_info( full ) if url is None: self.logger.error( 'No suitable archive extractor available for this system' ) self.notifier.ShowMissingExtractorError() @@ -199,20 +206,18 @@ class MediathekViewUpdater( object ): self.logger.error( 'Failure opening {}', url ) self.notifier.ShowDownloadError( url, err ) return False - root = etree.fromstring ( data ) urls = [] for server in root.findall( 'Server' ): try: URL = server.find( 'URL' ).text Prio = server.find( 'Prio' ).text - urls.append( ( self._get_update_url( URL ), Prio ) ) + urls.append( ( self._get_update_url( URL ), float( Prio ) + random.random() * 1.2 ) ) self.logger.info( 'Found mirror {} (Priority {})', URL, Prio ) except AttributeError: pass urls = sorted( urls, key = itemgetter( 1 ) ) urls = [ url[0] for url in urls ] - result = None # cleanup downloads self.logger.info( 'Cleaning up old downloads...' ) @@ -227,17 +232,23 @@ class MediathekViewUpdater( object ): lasturl = url self.logger.info( 'Trying to download {} from {}...', os.path.basename( compfile ), url ) self.notifier.UpdateDownloadProgress( 0, url ) - result = mvutils.url_retrieve( url, filename = compfile, reporthook = self._reporthook ) + mvutils.url_retrieve( url, filename = compfile, reporthook = self.notifier.HookDownloadProgress, aborthook = self.monitor.abortRequested ) break except urllib2.URLError as err: self.logger.error( 'Failure downloading {}', url ) + self.notifier.CloseDownloadProgress() + self.notifier.ShowDownloadError( lasturl, err ) + return False + except ExitRequested as err: + self.logger.error( 'Immediate exit requested. Aborting download of {}', url ) + self.notifier.CloseDownloadProgress() + self.notifier.ShowDownloadError( lasturl, err ) + return False except Exception as err: self.logger.error( 'Failure writng {}', url ) - if result is None: - self.logger.info( 'No file downloaded' ) - self.notifier.CloseDownloadProgress() - self.notifier.ShowDownloadError( lasturl, err ) - return False + self.notifier.CloseDownloadProgress() + self.notifier.ShowDownloadError( lasturl, err ) + return False # decompress filmliste if self.use_xz is True: @@ -304,13 +315,6 @@ class MediathekViewUpdater( object ): self.logger.error( 'Failed to remove {}: error {}', name, err ) return False - def _reporthook( self, blockcount, blocksize, totalsize ): - downloaded = blockcount * blocksize - if totalsize > 0: - percent = int( (downloaded * 100) / totalsize ) - self.notifier.UpdateDownloadProgress( percent ) - self.logger.debug( 'Downloading blockcount={}, blocksize={}, totalsize={}', blockcount, blocksize, totalsize ) - def _update_start( self, full ): self.logger.info( 'Initializing update...' ) self.add_chn = 0 |