from typing import Any, Dict, Optional
from lib.domain.torrent import TorrentStream
from lib.gui.source_pack_window import SourcePackWindow
from lib.utils.general.utils import DebridType
from lib.utils.player.utils import resolve_playback_url
class SourcePackSelect(SourcePackWindow):
def __init__(
self,
xml_file: str,
location: str,
source: Optional[TorrentStream] = None,
pack_info: Optional[Dict[str, Any]] = None,
item_information: Optional[Dict[str, Any]] = None,
) -> None:
super().__init__(xml_file, location, pack_info=pack_info, item_information=item_information)
self.source: Optional[TorrentStream] = source
self.pack_info: Optional[Dict[str, Any]] = pack_info
self.position: int = -1
self.playback_info: Optional[Dict[str, Any]] = None
self.setProperty("instant_close", "false")
self.setProperty("resolving", "false")
def doModal(self) -> Optional[Dict[str, Any]]:
super().doModal()
return self.playback_info
def handle_action(self, action_id: int, control_id: Optional[int] = None) -> None:
self.position = self.display_list.getSelectedPosition()
if action_id == 7 and control_id == 1000:
self._resolve_item()
def _resolve_item(self) -> None:
self.setProperty("resolving", "true")
if self.source and self.pack_info:
common_data = {
"type": self.source.type,
"debrid_type": self.source.debridType,
"is_torrent": False,
"is_pack": True,
"mode": self.item_information.get("mode"),
"ids": self.item_information.get("ids"),
"tv_data": self.item_information.get("tv_data"),
}
if self.source.debridType in [DebridType.RD, DebridType.TB]:
file_id, title = self.pack_info["files"][self.position]
data = {
**common_data,
"title": title,
"pack_info": {
"file_id": file_id,
"file_position": self.position,
"torrent_id": self.pack_info["torrent_id"],
},
}
else:
url, title = self.pack_info["files"][self.position]
data = {
**common_data,
"title": title,
"pack_info": {
"file_position": self.position,
"url": url,
},
}
self.playback_info = resolve_playback_url(data)
if not self.playback_info:
self.setProperty("resolving", "false")
self.close()
return
self.setProperty("instant_close", "true")
self.close()