# coding=utf-8 from __future__ import absolute_import import datetime import logging import traceback import types from subzero.language import Language from .constants import mode_map import six logger = logging.getLogger(__name__) class SubtitleHistoryItem(object): item_title = None section_title = None rating_key = None provider_name = None lang_name = None lang_data = None score = None thumb = None time = None mode = "a" def __init__(self, item_title, rating_key, section_title=None, subtitle=None, thumb=None, mode="a", time=None): self.item_title = item_title self.section_title = section_title self.rating_key = str(rating_key) self.provider_name = subtitle.provider_name self.lang_name = str(subtitle.language.name) self.lang_data = str(subtitle.language.alpha3), \ str(subtitle.language.country) if subtitle.language.country else None, \ str(subtitle.language.script) if subtitle.language.script else None self.score = subtitle.score self.thumb = thumb self.time = time or datetime.datetime.now() self.mode = mode @property def title(self): return u"%s: %s" % (self.section_title, self.item_title) @property def language(self): if self.lang_data: lang_data = [s if s != "None" else None for s in self.lang_data] if lang_data[0]: return Language(lang_data[0], country=lang_data[1], script=lang_data[2]) @property def mode_verbose(self): return mode_map.get(self.mode, "Unknown") def __repr__(self): return six.text_type(self) def __unicode__(self): return u"%s (Score: %s)" % (six.text_type(self.item_title), self.score) def __str__(self): return str(self.rating_key) def __hash__(self): return hash((self.rating_key, self.score)) def __eq__(self, other): return (self.rating_key, self.score) == (other.rating_key, other.score) def __ne__(self, other): # Not strictly necessary, but to avoid having both x==y and x!=y # True at the same time return not (self == other) class SubtitleHistory(object): size = 100 storage = None threadkit = None def __init__(self, storage, threadkit, size=100): self.size = size self.storage = storage self.threadkit = threadkit def add(self, item_title, rating_key, section_title=None, subtitle=None, thumb=None, mode="a", time=None): with self.threadkit.Lock(key="sub_history_add"): items = self.items item = SubtitleHistoryItem(item_title, rating_key, section_title=section_title, subtitle=subtitle, thumb=thumb, mode=mode, time=time) # insert item items.insert(0, item) # clamp item amount items = items[:self.size] # store items self.storage.SaveObject("subtitle_history", items) @property def items(self): try: items = self.storage.LoadObject("subtitle_history") or [] except: items = [] logger.error("Failed to load history storage: %s" % traceback.format_exc()) if not isinstance(items, list): items = [] else: items = items[:] return items def destroy(self): self.storage = None self.threadkit = None