Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Bower components Debian packages RPM packages NuGet packages

dream-alpha / enigma2-plugin-extensions-tmdbcockpit   deb

Repository URL to install this package:

Version: 8.9.8 

/ usr / lib / enigma2 / python / Plugins / Extensions / TMDBCockpit / ScreenMain.py

#!/usr/bin/python
# coding=utf-8
#
# Copyright (C) 2018-2025 by dream-alpha
#
# In case of reuse of this source code please do not remove this copyright.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# For more information on the GNU General Public License see:
# <http://www.gnu.org/licenses/>.

import os
from twisted.internet import threads, reactor
from Components.ActionMap import HelpableActionMap
from Components.Label import Label
from Components.Pixmap import Pixmap
from Components.config import config
from enigma import eServiceCenter
from Screens.VirtualKeyBoard import VirtualKeyBoard
from Screens.HelpMenu import HelpableScreen
from Screens.ChoiceBox import ChoiceBox
from Screens.Screen import Screen
from . import tmdbsimple as tmdb
from .__init__ import _
from .List import List
from .ScreenConfig import ScreenConfig
from .ScreenMovie import ScreenMovie
from .ScreenPerson import ScreenPerson
from .Utils import temp_dir, cleanText
from .Picture import Picture
from .FileUtils import createDirectory, deleteDirectory
from .Debug import logger
from .DelayTimer import DelayTimer
from .Json import Json
from .SearchMain import SearchMain
from .Utils import getApiKey


class ScreenMain(Picture, Json, Screen, HelpableScreen):
	def __init__(self, session, service, mode):
		Screen.__init__(self, session)
		Picture.__init__(self)
		Json.__init__(self)
		self.session = session

		tmdb.API_KEY = getApiKey()

		self.title = "TMDB - The Movie Database - " + _("Overview")
		self.menu_selection = 0
		self.search_title = ""
		self.service_title = ""
		self.direction_up = False
		self.page = 1
		self.total_pages = 0
		self.ident = 0
		self.count = 0
		self.service_path = ""
		self.files_saved = False
		self.result = []

		self['searchinfo'] = Label()
		self['key_red'] = Label(_("Cancel"))
		self['key_green'] = Label(_("Details"))
		self['key_yellow'] = Label(_("Edit search"))
		self['key_blue'] = Label(_("more ..."))
		self['list'] = List()
		self['cover'] = Pixmap()
		self['backdrop'] = Pixmap()

		HelpableScreen.__init__(self)
		self["actions"] = HelpableActionMap(
			self,
			"TMDBActions",
			{
				"ok": (self.ok, _("Show details")),
				"cancel": (self.exit, _("Exit")),
				"down": (self.moveDown, _("Up")),
				"up": (self.moveUp, _("Down")),
				"nextBouquet": (self.nextBouquet, _("Details down")),
				"prevBouquet": (self.prevBouquet, _("Details up")),
				"red": (self.exit, _("Cancel")),
				"green": (self.ok, _("Show details")),
				"yellow": (self.searchString, _("Edit search")),
				"blue": (self.menu, _("more ...")),
				"menu": (self.setup, _("Setup")),
				"eventview": (self.searchString, _("Edit search"))
			},
			-1,
		)

		if mode == 1:
			self.service_path = service.getPath()
			self.service_name = service.getName()
			if self.service_name:
				self.text = cleanText(self.service_name)
			else:
				if os.path.isdir(self.service_path):
					self.service_path = os.path.normpath(self.service_path)
					self.text = cleanText(os.path.basename(self.service_path))
				else:
					info = eServiceCenter.getInstance().info(service)
					name = info.getName(service)
					self.text = cleanText(os.path.splitext(name)[0])
		elif mode == 2:
			name = service
			self.text = cleanText(name)
		else:
			self.text = ""
			self.menu_selection = 1
			self.search_title = _("Current movies in cinemas")

		logger.debug("text: %s", self.text)

		createDirectory(temp_dir)
		self.onLayoutFinish.append(self.onDialogShow)
		self["list"].onSelectionChanged.append(self.onSelectionChanged)

	def onSelectionChanged(self):
		DelayTimer.stopAll()
		self.displayPicture(self["cover"], None)
		self.displayPicture(self["backdrop"], None)
		if config.plugins.tmdb.skip_to_movie.value and self.count == 1:
			DelayTimer(10, self.ok)
		else:
			DelayTimer(100, self.showPictures)

	def onDialogShow(self):
		logger.info("...")
		if self.menu_selection or self.text:
			self.searchData()
		else:
			logger.debug("no search string specified")
			self["searchinfo"].setText(_("No search string specified."))

	def searchData(self):
		logger.debug("menu_selection: %s, text: %s", self.menu_selection, self.text)
		self.result = []
		if self.menu_selection:
			self["searchinfo"].setText(self.search_title)
			threads.deferToThread(self.getData, self.menu_selection, self.text, self.ident, self.page, self.gotData)
		else:
			self.search_iteration = 0
			self.search_words = self.text.split(" ")
			self.last_text = self.text
			self["searchinfo"].setText(_("Looking up: %s ...") % self.text)
			self.search(0, [])

	def search(self, totalpages, result):
		if self.search_iteration and self.search_words:
			del self.search_words[-1]
			text = " ".join(self.search_words)
		else:
			text = self.text
		if not result and text:
			self["searchinfo"].setText(_("Looking up: %s ...") % text)
			self.search_iteration += 1
			self.last_text = text
			logger.debug("iteration: %s, text: %s", self.search_iteration, text)
			threads.deferToThread(self.getData, self.menu_selection, text, self.ident, self.page, self.search)
		else:
			self.gotData(totalpages, result, self.last_text)

	def getData(self, menu_selection, text, ident, page, callback):
		totalpages, result = SearchMain().getResult(self.result, menu_selection, text, ident, page)
		reactor.callFromThread(callback, totalpages, result)  # pylint: disable=E1101

	def gotData(self, totalpages, result, text=""):
		logger.info("text: %s", text)
		logger.info("len(result): %s", len(result))
		self.count = len(result)
		self.totalpages = totalpages
		if self.menu_selection:
			if result:
				self["searchinfo"].setText("%s (%s %s/%s)" % (self.search_title, _("page"), self.page, totalpages))
			else:
				self['searchinfo'].setText(_("No results for: %s") % self.search_title)
		else:
			if result:
				if text != self.text:
					self['searchinfo'].setText("%s (%s)" % (text, self.text))
				else:
					self['searchinfo'].setText(self.text)
			else:
				self['searchinfo'].setText(_("No results for: %s") % self.text)
		self["list"].setList(result)
		if result:
			if self.direction_up:
				self["list"].moveToIndex(len(self.result) - 1)
			else:
				self["list"].moveToIndex(0)

	def showPictures(self):
		current = self["list"].getCurrent()
		if current:
			ident = current[1]
			cover_url = current[3]
			backdrop_url = current[4]
			self.showPicture(self["cover"], "cover", ident, cover_url)
			self.showPicture(self["backdrop"], "backdrop", ident, backdrop_url)
		else:
			self.showPicture(self["cover"], "cover", "", None)
			self.showPicture(self["backdrop"], "backdrop", "", None)

	def ok(self):
		current = self['list'].getCurrent()
		logger.info("current: %s", current)
		if current:
			title = current[0]
			ident = current[1]
			media = current[2]
			cover_url = current[3]
			backdrop_url = current[4]
			if media in ["movie", "tv"]:
				self.session.openWithCallback(self.screenMovieCallback, ScreenMovie, title, media, cover_url, ident, self.service_path, backdrop_url)
			elif media == "person":
				self.session.openWithCallback(self.screenPersonCallback, ScreenPerson, title, ident, "")
			else:
				logger.debug("unsupported media: %s", media)

	def screenMovieCallback(self, do_exit, files_saved):
		logger.info("files_saved: %s", files_saved)
		self.files_saved = files_saved
		if do_exit:
			self.exit()
		elif self.count == 1:
			self.showPictures()

	def screenPersonCallback(self, do_exit):
		if do_exit:
			self.exit()

	def menu(self):
		logger.info("...")
		self.direction_up = False
		options = [
			(_("TMDB Infos"), 0),
			(_("Current movies in cinemas"), 1),
			(_("Upcoming movies"), 2),
			(_("Popular movies"), 3),
			(_("Similar movies"), 4),
			(_("Recommendations"), 5),
			(_("Best rated movies"), 6)
		]
		self.session.openWithCallback(
			self.menuCallback,
			ChoiceBox,
			windowTitle=_("TMDB categories"),
			title=_("Please select a category"),
			list=options
		)

	def menuCallback(self, ret):
		logger.info("ret: %s", ret)
		if ret is not None:
			self.page = 1
			self.search_title = ret[0]
			self.menu_selection = ret[1]
			current = self['list'].getCurrent()
			if current:
				self.service_title = current[0]
				self.ident = current[1]
				self.searchData()

	def moveUp(self):
		logger.info("SelectionIndex: %s, len(self.result): %s", self["list"].getSelectionIndex(), len(self.result))
		if self["list"].getSelectionIndex() == 0:
			self.nextBouquet()
		else:
			self["list"].moveUp()

	def moveDown(self):
		logger.info("SelectionIndex: %s, len(self.result): %s", self["list"].getSelectionIndex(), len(self.result))
		if self["list"].getSelectionIndex() == len(self.result) - 1:
			self.prevBouquet()
		else:
			self["list"].moveDown()

	def prevBouquet(self):
		logger.info("...")
		if self.menu_selection:
			self.direction_up = False
			self.page += 1
			if self.page > self.totalpages:
				self.page = 1
			self.searchData()

	def nextBouquet(self):
		logger.info("...")
		if self.menu_selection:
			self.direction_up = True
			self.page -= 1
			if self.page <= 0:
				self.page = self.totalpages
			self.searchData()

	def setup(self):
		self.session.open(ScreenConfig)

	def searchString(self):
		self.menu_selection = 0
		current = self['list'].getCurrent()
		logger.info("current: %s", current)
		if current:
			search_title = current[5]
			self.text = search_title
		self.session.openWithCallback(self.goSearch, VirtualKeyBoard, title=(_("Search for Movie:")), text=self.text)

	def goSearch(self, text):
		if text:
			self.text = text
			self.searchData()

	def exit(self):
		logger.info("files_saved: %s", self.files_saved)
		DelayTimer.stopAll()
		self["list"].onSelectionChanged.remove(self.onSelectionChanged)
		deleteDirectory(temp_dir)
		self.close(self.files_saved)