summaryrefslogtreecommitdiff
path: root/plugin.video.mediathekview/resources/lib/mvupdate.py
blob: 75954171ddc5edb71dda800b56a5178a3603e464 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
# -*- coding: utf-8 -*-
# Copyright (c) 2017-2018, Leo Moll

# -- Imports ------------------------------------------------
import os
import sys
import argparse
import datetime
import xml.etree.ElementTree as ET

from resources.lib.base.Logger import Logger
from resources.lib.updater import MediathekViewUpdater

# -- Classes ------------------------------------------------
class Settings( object ):
	def __init__( self, args ):
		self.datapath		= args.path if args.dbtype == 'sqlite' else './'
		self.type			= { 'sqlite' : '0', 'mysql' : '1' }.get( args.dbtype, '0' )
		if self.type == '1':
			self.host			= args.host
			self.port			= int( args.port )
			self.user			= args.user
			self.password		= args.password
			self.database		= args.database
		self.nofuture		= True
		self.minlength		= 0
		self.groupshows		= False
		self.updenabled		= True
		self.updinterval	= 3600

class AppLogger( Logger ):

	def __init__( self, name, version, topic = None, verbosity = 0 ):
		super( AppLogger, self ).__init__( name, version, topic )
		self.verbosity = verbosity

	def getNewLogger( self, topic = None ):
		return AppLogger( self.name, self.version, topic, self.verbosity )

	def debug( self, message, *args ):
		self._log( 2, message, *args )

	def info( self, message, *args ):
		self._log( 1, message, *args )

	def warn( self, message, *args ):
		self._log( 0, message, *args )

	def error( self, message, *args ):
		self._log( -1, message, *args )

	def _log( self, level, message, *args ):
		parts = []
		for arg in args:
			part = arg
			if isinstance( arg, basestring ):
				part = arg # arg.decode('utf-8')
			parts.append( part )
		output = '{} {} {}{}'.format(
			datetime.datetime.now(),
			{ -1: 'ERROR', 0: 'WARNING', 1: 'NOTICE', 2: 'DEBUG' }.get( level, 2 ),
			self.prefix,
			message.format( *parts )
		)

		if level < 0:
			# error
			sys.stderr.write( output + '\n' )
			sys.stderr.flush()
		elif self.verbosity >= level:
			# other message
			print( output )

class Notifier( object ):
	def __init__( self ):
		pass
	def GetEnteredText( self, deftext = '', heading = '', hidden = False ):
		pass
	def ShowNotification( self, heading, message, icon = None, time = 5000, sound = True ):
		pass
	def ShowWarning( self, heading, message, time = 5000, sound = True ):
		pass
	def ShowError( self, heading, message, time = 5000, sound = True ):
		pass
	def ShowBGDialog( self, heading = None, message = None ):
		pass
	def UpdateBGDialog( self, percent, heading = None, message = None ):
		pass
	def CloseBGDialog( self ):
		pass
	def ShowDatabaseError( self, err ):
		pass
	def ShowDownloadError( self, name, err ):
		pass
	def ShowMissingExtractorError( self ):
		pass
	def ShowDownloadProgress( self ):
		pass
	def UpdateDownloadProgress( self, percent, message = None ):
		pass
	def CloseDownloadProgress( self ):
		pass
	def ShowUpdateProgress( self ):
		pass
	def UpdateUpdateProgress( self, percent, count, channels, shows, movies ):
		pass
	def CloseUpdateProgress( self ):
		pass

class MediathekViewMonitor( object ):
	def abortRequested( self ):
		return False

class UpdateApp( AppLogger ):
	def __init__( self ):
		try:
			self.mypath = os.path.dirname( sys.argv[0] )
			tree = ET.parse( self.mypath + '/addon.xml' )
			version = tree.getroot().attrib['version']
			AppLogger.__init__( self, os.path.basename( sys.argv[0] ), version )
		except Exception:
			AppLogger.__init__( self, os.path.basename( sys.argv[0] ), '0.0' )

	def Init( self ):
		parser = argparse.ArgumentParser(
			formatter_class = argparse.ArgumentDefaultsHelpFormatter,
			description = 'This is the standalone database updater. It downloads the current database update from mediathekview.de and integrates it in a local database'
		)
		parser.add_argument(
			'-v', '--verbose',
			default = 0,
			action = 'count',
			help = 'Show progress messages'
		)
		subparsers = parser.add_subparsers(
			dest = 'dbtype',
			help = 'target database'
		)
		sqliteopts = subparsers.add_parser( 'sqlite', formatter_class = argparse.ArgumentDefaultsHelpFormatter )
		sqliteopts.add_argument(
			'-p', '--path',
			dest = 'path',
			help = 'alternative path for the sqlite database',
			default = './'
		)
		mysqlopts = subparsers.add_parser( 'mysql', formatter_class = argparse.ArgumentDefaultsHelpFormatter )
		mysqlopts.add_argument(
			'-H', '--host',
			dest = 'host',
			help = 'hostname or ip address',
			default = 'localhost'
		)
		mysqlopts.add_argument(
			'-P', '--port',
			dest = 'port',
			help = 'connection port',
			default = '3306'
		)
		mysqlopts.add_argument(
			'-u', '--user',
			dest = 'user',
			help = 'connection username',
			default = 'mediathekview'
		)
		mysqlopts.add_argument(
			'-p', '--password',
			dest = 'password',
			help = 'connection password',
			default = None
		)
		mysqlopts.add_argument(
			'-d', '--database',
			dest = 'database',
			default = 'mediathekview',
			help = 'database name'
		)
		self.args		= parser.parse_args()
		self.verbosity	= self.args.verbose

		self.info( 'Startup' )
		self.settings	= Settings( self.args )
		self.notifier	= Notifier()
		self.monitor	= MediathekViewMonitor()
		self.updater	= MediathekViewUpdater( self.getNewLogger( 'MediathekViewUpdater' ), self.notifier, self.settings, self.monitor )
		self.updater.Init()

	def Run( self ):
		self.info( 'Starting up...' )
		updateop = self.updater.GetCurrentUpdateOperation()
		if updateop == 1:
			# full update
			self.info( 'Initiating full update...' )
			self.updater.Update( True )
		elif updateop == 2:
			# differential update
			self.info( 'Initiating differential update...' )
			self.updater.Update( False )
		self.info( 'Exiting...' )

	def Exit( self ):
		self.updater.Exit()