/IPTVPlayer/tools/iptvmoviemetadata.py

https://gitlab.com/kamoula77/iptvplayer-for-e2
Python | 296 lines | 219 code | 28 blank | 49 comment | 45 complexity | d8ddfb9b31442b319f305aaebb8044bb MD5 | raw file
  1. # -*- coding: utf-8 -*-
  2. #
  3. ###################################################
  4. # LOCAL import
  5. ###################################################
  6. from Plugins.Extensions.IPTVPlayer.tools.iptvtools import printDBG, printExc, byteify, RemoveDisallowedFilenameChars, GetMovieMetaDataDir
  7. ###################################################
  8. ###################################################
  9. # FOREIGN import
  10. ###################################################
  11. import codecs
  12. try: import json
  13. except: import simplejson as json
  14. from copy import deepcopy
  15. ###################################################
  16. #{
  17. #"host":"",
  18. #"title":"",
  19. #"file_path":"",
  20. #
  21. #"tracks":
  22. # {
  23. # "audio":-1,
  24. # "video":-1,
  25. # "subtitles":
  26. # {
  27. # "idx":-1,
  28. #
  29. # "tracks":[
  30. # {"title":"", "id":"126", "provider":"opensubtitles.org", "lang":"pl", "delay_ms":0, "path":"/ole/sub_pl.srt"},
  31. # {"title":"", "id":"123", "provider":"opensubtitles.org", "lang":"en", "delay_ms":0, "path":"/ole/sub_en.srt"},
  32. # ]
  33. # }
  34. # },
  35. #"aspect_ratio":-1,
  36. #"video_options":{"aspect":"4:3", "policy":None, "policy2":None}
  37. #"last_position":0
  38. #}
  39. def localPrintDBG(txt):
  40. #printDBG(txt)
  41. pass
  42. class IPTVMovieMetaDataHandler():
  43. META_DATA = {"host":"", "title":"", "file_path":"", "aspect_ratio":-1, "last_position":-1,"tracks":{"audio":-1, "video":-1, "subtitle":-1, "subtitles":{"idx":-1, "tracks":[]} } }
  44. SUBTITLE_TRACK = {"title":"", "id":"", "provider":"", "lang":"", "delay_ms":0, "path":""}
  45. EXTENSION = 'iptv'
  46. ENCODING = 'utf-8'
  47. def __init__(self, host="", title="", filePath=""):
  48. printDBG(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>... [%s]\n" % self.META_DATA)
  49. localPrintDBG("IPTVMovieMetaDataHandler.__init__ host[%s], title[%s], filePath[%s]" % (host, title, filePath))
  50. if "" != host:
  51. fileName = "{0}_{1}.{2}".format(host, title, self.EXTENSION)
  52. else:
  53. fileName = filePath.split('/')[-1]+'.' + self.EXTENSION
  54. self.filePath = GetMovieMetaDataDir( RemoveDisallowedFilenameChars( fileName ) )
  55. self.data = deepcopy( self.META_DATA )
  56. self.data.update( {"host":host, "title":title, "file_path":filePath} )
  57. self.isModified = False
  58. def load(self):
  59. localPrintDBG("IPTVMovieMetaDataHandler.load")
  60. sts = False
  61. try:
  62. try:
  63. with codecs.open(self.filePath, 'r', self.ENCODING, 'replace') as fp:
  64. data = byteify( json.loads(fp.read()) )
  65. if data != {}:
  66. sts = True
  67. self.data.update(data)
  68. except:
  69. printExc()
  70. except:
  71. printExc()
  72. return sts
  73. def save(self, force=False):
  74. localPrintDBG("IPTVMovieMetaDataHandler.save force[%s]" % force)
  75. sts = False
  76. if not force:
  77. force = self.isModified
  78. if force:
  79. try:
  80. with codecs.open(self.filePath, 'w', self.ENCODING) as fp:
  81. fp.write(json.dumps(self.data))
  82. sts = True
  83. except:
  84. printExc()
  85. return sts
  86. ##################################################
  87. # AUDIO
  88. ##################################################
  89. def getAudioTrackIdx(self):
  90. localPrintDBG("IPTVMovieMetaDataHandler.getAudioTrackIdx")
  91. idx = -1
  92. try:
  93. idx = int(self.data['tracks']['audio'])
  94. except:
  95. printExc()
  96. return idx
  97. def setAudioTrackIdx(self, idx):
  98. localPrintDBG("IPTVMovieMetaDataHandler.setAudioTrackIdx id[%s]" % idx)
  99. sts = False
  100. try:
  101. self.data['tracks']['audio'] = int(idx)
  102. sts = True
  103. except:
  104. printExc()
  105. if sts: self.isModified = True
  106. return sts
  107. ##################################################
  108. # SUBTITLES EMBEDED
  109. ##################################################
  110. def getEmbeddedSubtileTrackIdx(self):
  111. localPrintDBG("IPTVMovieMetaDataHandler.getEmbeddedSubtileTrackIdx")
  112. idx = -1
  113. try:
  114. idx = int(self.data['tracks'].get('subtitle', -1))
  115. except:
  116. printExc()
  117. return idx
  118. def setEmbeddedSubtileTrackIdx(self, idx):
  119. localPrintDBG("IPTVMovieMetaDataHandler.setEmbeddedSubtileTrackIdx id[%s]" % idx)
  120. sts = False
  121. try:
  122. self.data['tracks']['subtitle'] = int(idx)
  123. sts = True
  124. except:
  125. printExc()
  126. if sts: self.isModified = True
  127. return sts
  128. ##################################################
  129. # SUBTITLES
  130. ##################################################
  131. def hasSubtitlesTracks(self):
  132. localPrintDBG("IPTVMovieMetaDataHandler.hasSubtitlesTracks")
  133. ret = False
  134. try:
  135. if len(self.data['tracks']['subtitles']['tracks']):
  136. ret = True
  137. except:
  138. printExc()
  139. return ret
  140. def getSubtitlesTracks(self):
  141. localPrintDBG("IPTVMovieMetaDataHandler.getSubtitlesTracks")
  142. tracks = []
  143. try:
  144. for item in self.data['tracks']['subtitles']['tracks']:
  145. track = deepcopy( self.SUBTITLE_TRACK )
  146. track.update(item)
  147. tracks.append(track)
  148. except:
  149. printExc()
  150. return tracks
  151. def getSubtitleTrack(self):
  152. localPrintDBG("IPTVMovieMetaDataHandler.getSubtitleTrack")
  153. track = None
  154. try:
  155. if self.getSubtitleIdx() > -1:
  156. track = self.getSubtitlesTracks()[self.getSubtitleIdx()]
  157. except:
  158. printExc()
  159. return track
  160. def setSubtitleTrackDelay(self, delay_ms):
  161. localPrintDBG("IPTVMovieMetaDataHandler.setSubtitleTrackDelay")
  162. sts = False
  163. try:
  164. if self.getSubtitleIdx() > -1:
  165. self.data['tracks']['subtitles']['tracks'][self.getSubtitleIdx()]['delay_ms'] = delay_ms
  166. sts = True
  167. except:
  168. printExc()
  169. if sts: self.isModified = True
  170. return sts
  171. def getSubtitleTrackDelay(self):
  172. delay_ms = 0
  173. try:
  174. delay_ms = self.data['tracks']['subtitles']['tracks'][self.getSubtitleIdx()]['delay_ms']
  175. except:
  176. printExc()
  177. return delay_ms
  178. def getSubtitleIdx(self):
  179. localPrintDBG("IPTVMovieMetaDataHandler.getSubtitleIdx")
  180. idx = -1
  181. try:
  182. idx = self.data['tracks']['subtitles']['idx']
  183. if idx >= len( self.getSubtitlesTracks() ):
  184. idx = -1
  185. except:
  186. printExc()
  187. return idx
  188. def setSubtitleIdx(self, idx):
  189. localPrintDBG("IPTVMovieMetaDataHandler.setSubtitleIdx idx[%s]" % idx)
  190. sts = False
  191. try:
  192. if idx < len( self.getSubtitlesTracks() ):
  193. self.data['tracks']['subtitles']['idx'] = idx
  194. sts = True
  195. except:
  196. printExc()
  197. if sts: self.isModified = True
  198. return sts
  199. def addSubtitleTrack(self, subtitlesTrack):
  200. localPrintDBG("IPTVMovieMetaDataHandler.addSubtitleTrack")
  201. idx = -1
  202. try:
  203. track = deepcopy( self.SUBTITLE_TRACK )
  204. track.update(subtitlesTrack)
  205. localPrintDBG(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> track[%s]" % track)
  206. self.data['tracks']['subtitles']['tracks'].append(track)
  207. idx = len(self.data['tracks']['subtitles']['tracks']) - 1
  208. except:
  209. printExc()
  210. if idx > -1: self.isModified = True
  211. return idx
  212. def removeSubtitleTrack(self, idx):
  213. localPrintDBG("IPTVMovieMetaDataHandler.removeSubtitleTrack")
  214. sts = False
  215. currIdx = self.getSubtitleIdx()
  216. try:
  217. del self.data['tracks']['subtitles']['tracks'][idx]
  218. if currIdx == idx:
  219. self.setSubtitleIdx(-1)
  220. except:
  221. printExc()
  222. if sts: self.isModified = True
  223. return sts
  224. ##################################################
  225. # SUBTITLES
  226. ##################################################
  227. def getVideoOption(self, option):
  228. localPrintDBG("IPTVMovieMetaDataHandler.getVideoOption")
  229. ret = None
  230. if 'video_options' in self.data:
  231. try:
  232. return self.data['video_options'][option]
  233. except:
  234. printExc()
  235. return ret
  236. def setVideoOption(self, option, value):
  237. localPrintDBG("IPTVMovieMetaDataHandler.getVideoOption")
  238. sts = False
  239. try:
  240. if 'video_options' not in self.data:
  241. self.data['video_options'] = {}
  242. self.data['video_options'][option] = value
  243. sts = True
  244. except:
  245. printExc()
  246. if sts: self.isModified = True
  247. return sts
  248. ##################################################
  249. # LAST POSITION
  250. ##################################################
  251. def getLastPosition(self):
  252. localPrintDBG("IPTVMovieMetaDataHandler.getLastPosition")
  253. lastPosition = -1
  254. try:
  255. lastPosition = self.data['last_position']
  256. except:
  257. printExc()
  258. return lastPosition
  259. def setLastPosition(self, lastPosition):
  260. localPrintDBG("IPTVMovieMetaDataHandler.setLastPosition")
  261. sts = False
  262. try:
  263. self.data['last_position'] = lastPosition
  264. sts = True
  265. except:
  266. printExc()
  267. if sts: self.isModified = True
  268. return sts