PlexKodiConnect/resources/lib/library_sync/process_metadata.py

114 lines
4.2 KiB
Python
Raw Normal View History

2017-04-03 01:02:41 +10:00
# -*- coding: utf-8 -*-
from __future__ import absolute_import, division, unicode_literals
2017-04-03 01:02:41 +10:00
from logging import getLogger
2018-10-20 23:49:04 +11:00
import xbmcgui
2017-04-03 01:02:41 +10:00
2018-10-20 23:49:04 +11:00
from . import common
2018-10-24 19:57:52 +11:00
from .. import backgroundthread, utils, variables as v
2017-04-03 01:02:41 +10:00
2018-10-20 23:49:04 +11:00
LOG = getLogger('PLEX.library_sync.process_metadata')
2017-04-03 01:02:41 +10:00
2018-10-21 21:03:21 +11:00
class InitNewSection(object):
"""
Throw this into the queue used for ProcessMetadata to tell it which
Plex library section we're looking at
context: itemtypes.Movie, itemtypes.Episode, etc.
"""
def __init__(self, context, total_number_of_items, section_name,
2018-10-24 19:57:52 +11:00
section_id, plex_type):
2018-10-21 21:03:21 +11:00
self.context = context
self.total = total_number_of_items
self.name = section_name
self.id = section_id
2018-10-24 19:57:52 +11:00
self.plex_type = plex_type
2018-10-21 21:03:21 +11:00
2018-10-20 23:49:04 +11:00
class ProcessMetadata(backgroundthread.KillableThread, common.libsync_mixin):
2017-04-03 01:02:41 +10:00
"""
Not yet implemented for more than 1 thread - if ever. Only to be called by
ONE thread!
Processes the XML metadata in the queue
Input:
queue: Queue.Queue() object that you'll need to fill up with
the downloaded XML eTree objects
item_class: as used to call functions in itemtypes.py e.g. 'Movies' =>
2017-04-03 01:02:41 +10:00
itemtypes.Movies()
"""
2018-10-24 16:08:32 +11:00
def __init__(self, queue, last_sync, show_dialog):
self._canceled = False
2017-04-03 01:02:41 +10:00
self.queue = queue
2018-10-21 21:03:21 +11:00
self.last_sync = last_sync
2018-10-24 16:08:32 +11:00
self.show_dialog = show_dialog
2018-10-21 21:03:21 +11:00
self.total = 0
2018-10-20 23:49:04 +11:00
self.current = 0
self.title = None
2018-10-21 21:03:21 +11:00
self.section_name = None
2018-10-24 16:08:32 +11:00
self.dialog = None
2018-10-20 23:49:04 +11:00
super(ProcessMetadata, self).__init__()
2017-04-03 01:02:41 +10:00
2018-10-24 16:08:32 +11:00
def update(self):
2017-04-03 01:02:41 +10:00
"""
"""
2018-10-24 16:08:32 +11:00
if self.show_dialog:
try:
progress = int(float(self.current) / float(self.total) * 100.0)
except ZeroDivisionError:
progress = 0
self.dialog.update(progress,
self.section_name,
'%s/%s: %s'
% (self.current, self.total, self.title))
2018-10-24 19:57:52 +11:00
common.update_kodi_library(video=self.is_video,
music=not self.is_video)
2017-04-03 01:02:41 +10:00
def run(self):
"""
Do the work
"""
LOG.debug('Processing thread started')
2018-10-24 16:08:32 +11:00
if self.show_dialog:
self.dialog = xbmcgui.DialogProgressBG()
self.dialog.create(utils.lang(39714))
2018-10-21 21:03:21 +11:00
try:
# Init with the very first library section. This will block!
section = self.queue.get()
self.queue.task_done()
if section is None:
return
2018-10-20 23:49:04 +11:00
while self.isCanceled() is False:
2018-10-21 21:03:21 +11:00
if section is None:
2018-10-20 23:49:04 +11:00
break
2018-10-22 03:32:11 +11:00
self.current = 0
2018-10-21 21:03:21 +11:00
self.total = section.total
self.section_name = section.name
2018-10-26 00:55:46 +11:00
self.is_video = section.plex_type in v.PLEX_VIDEOTYPES
2018-10-21 21:03:21 +11:00
with section.context(self.last_sync) as context:
while self.isCanceled() is False:
2018-10-22 03:32:11 +11:00
# grabs item from queue. This will block!
2018-10-26 03:14:35 +11:00
item = self.queue.get()
if item is InitNewSection or item is None:
section = item
2018-10-23 22:54:09 +11:00
self.queue.task_done()
2018-10-21 21:03:21 +11:00
break
try:
2018-10-26 03:14:35 +11:00
context.add_update(item['xml'][0],
section_name=section.name,
section_id=section.id,
children=item['children'])
2018-10-21 21:03:21 +11:00
except:
utils.ERROR(txt='process_metadata crashed',
2018-10-24 16:08:32 +11:00
notify=True,
cancel_sync=True)
2018-10-21 21:03:21 +11:00
if self.current % 20 == 0:
2018-10-26 03:28:41 +11:00
self.title = item['xml'][0].get('title')
2018-10-24 16:08:32 +11:00
self.update()
2018-10-22 03:32:11 +11:00
self.current += 1
2018-10-23 22:54:09 +11:00
self.queue.task_done()
2018-10-21 21:03:21 +11:00
finally:
2018-10-24 16:08:32 +11:00
if self.dialog:
self.dialog.close()
2018-10-21 21:03:21 +11:00
LOG.debug('Processing thread terminated')