Add Provider object and update the UI to use
This currently uses localhost:8080 hosted providers to facilitate testing.
This commit is contained in:
@@ -1,4 +1,8 @@
|
|||||||
from typing import Type
|
from typing import Type
|
||||||
|
|
||||||
|
import sys
|
||||||
|
from urllib import parse
|
||||||
|
|
||||||
from PyQt5.QtWidgets import QApplication
|
from PyQt5.QtWidgets import QApplication
|
||||||
from PyQt5.QtQml import qmlRegisterType, QQmlApplicationEngine
|
from PyQt5.QtQml import qmlRegisterType, QQmlApplicationEngine
|
||||||
from PyQt5.QtQuick import QQuickView
|
from PyQt5.QtQuick import QQuickView
|
||||||
@@ -6,24 +10,62 @@ from PyQt5.QtCore import QObject, QUrl, pyqtProperty
|
|||||||
|
|
||||||
from .qtmpv import MpvObject
|
from .qtmpv import MpvObject
|
||||||
|
|
||||||
import sys
|
import requests
|
||||||
|
|
||||||
|
|
||||||
|
class Show(QObject):
|
||||||
|
def __init__(self, name, parent=None):
|
||||||
|
super().__init__(parent)
|
||||||
|
self._name = name
|
||||||
|
|
||||||
|
@pyqtProperty("QString")
|
||||||
|
def name(self):
|
||||||
|
return self._name
|
||||||
|
|
||||||
|
|
||||||
|
def getUrl(base: str, path: str) -> dict:
|
||||||
|
url: str = parse.urljoin(base, path)
|
||||||
|
r: requests.Response = requests.get(url)
|
||||||
|
return r.json()
|
||||||
|
|
||||||
|
|
||||||
class Provider(QObject):
|
class Provider(QObject):
|
||||||
def __init__(self, name, parent=None):
|
def __init__(self, ip: str, port: int, parent=None):
|
||||||
super().__init__(parent)
|
super().__init__(parent)
|
||||||
self.name = name
|
self.url: str = f"http://{ip}:{port}"
|
||||||
# self.ip = ip
|
|
||||||
# self.port = port
|
describe: dict = getUrl(self.url, "describe")
|
||||||
|
self._name: str = describe["name"]
|
||||||
|
|
||||||
|
shows: dict = getUrl(self.url, "shows")
|
||||||
|
self._shows: dict[int, dict] = {e["id"]: e for e in shows["data"]}
|
||||||
|
|
||||||
|
recently_added: dict = getUrl(self.url, "recently_added")
|
||||||
|
self._recently_added: list[int] = recently_added["data"]
|
||||||
|
|
||||||
|
in_progress: dict = getUrl(self.url, "in_progress")
|
||||||
|
self._in_progress: list[int] = in_progress["data"]
|
||||||
|
|
||||||
@pyqtProperty("QString")
|
@pyqtProperty("QString")
|
||||||
def Name(self):
|
def name(self) -> str:
|
||||||
return self.name
|
return self._name
|
||||||
|
|
||||||
|
@pyqtProperty("QObject")
|
||||||
|
def getShow(self, id) -> dict:
|
||||||
|
return self._shows[id]
|
||||||
|
|
||||||
|
@pyqtProperty(list)
|
||||||
|
def recentlyAdded(self) -> list[int]:
|
||||||
|
return self._recently_added
|
||||||
|
|
||||||
|
@pyqtProperty(list)
|
||||||
|
def inProgress(self) -> list:
|
||||||
|
return self._in_progress
|
||||||
|
|
||||||
|
|
||||||
class DataSource:
|
class DataSource:
|
||||||
def __init__(self, providers=[]):
|
def __init__(self, providers=[]):
|
||||||
self.providers = [Provider(name) for name in providers]
|
self.providers = [Provider(ip, port) for (ip, port) in providers]
|
||||||
|
|
||||||
|
|
||||||
def DatabaseType(data_source) -> Type:
|
def DatabaseType(data_source) -> Type:
|
||||||
@@ -43,7 +85,10 @@ def DatabaseType(data_source) -> Type:
|
|||||||
def main():
|
def main():
|
||||||
app = QApplication(sys.argv)
|
app = QApplication(sys.argv)
|
||||||
|
|
||||||
data_source = DataSource(["Anime", "TV", "Movies", "Settings"])
|
# data_source = DataSource(["Anime", "TV", "Movies", "Settings"])
|
||||||
|
data_source = DataSource(
|
||||||
|
[("127.0.0.1", "8080"), ("127.0.0.1", "8080"), ("127.0.0.1", "8080")]
|
||||||
|
)
|
||||||
|
|
||||||
qmlRegisterType(DatabaseType(data_source), "Ikinuki.Client", 1, 0, "Database")
|
qmlRegisterType(DatabaseType(data_source), "Ikinuki.Client", 1, 0, "Database")
|
||||||
# qmlRegisterType(Provider, "Ikinuki.Client", 1, 0, "Provider")
|
# qmlRegisterType(Provider, "Ikinuki.Client", 1, 0, "Provider")
|
||||||
|
|||||||
@@ -0,0 +1,42 @@
|
|||||||
|
import QtQuick 2.12
|
||||||
|
|
||||||
|
import Ikinuki.Client 1.0
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
property var providers
|
||||||
|
//default property int selectedElement: 0
|
||||||
|
//property var max_elements: providers.length
|
||||||
|
width: parent.width * 0.7
|
||||||
|
height: parent.height
|
||||||
|
color: "#22282A"
|
||||||
|
Column {
|
||||||
|
Row {
|
||||||
|
height: parent.parent.height * 0.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// anchors.fill: parent
|
||||||
|
// // header
|
||||||
|
// SidebarHeader {}
|
||||||
|
// Repeater {
|
||||||
|
// model: providers
|
||||||
|
// SidebarElement {
|
||||||
|
// name: modelData.name
|
||||||
|
// selected: (index == selectedElement) ? true : false
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
//}
|
||||||
|
//function mod(n, m) {
|
||||||
|
// return ((n % m) + m) % m;
|
||||||
|
//}
|
||||||
|
//Keys.onPressed: (event)=> {
|
||||||
|
// // Handle scrolling
|
||||||
|
// if (event.key == Qt.Key_Down) {
|
||||||
|
// selectedElement = mod(selectedElement + 1, max_elements);
|
||||||
|
// }
|
||||||
|
// else if (event.key == Qt.Key_Up) {
|
||||||
|
// selectedElement = mod(selectedElement - 1, max_elements);
|
||||||
|
// }
|
||||||
|
// event.accepted = true;
|
||||||
|
//}
|
||||||
|
}
|
||||||
@@ -4,7 +4,7 @@ import Ikinuki.Client 1.0
|
|||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
property var providers
|
property var providers
|
||||||
default property int selectedElement: 2
|
default property int selectedElement: 0
|
||||||
property var max_elements: providers.length
|
property var max_elements: providers.length
|
||||||
width: parent.width * 0.3
|
width: parent.width * 0.3
|
||||||
height: parent.height
|
height: parent.height
|
||||||
@@ -16,7 +16,7 @@ Rectangle {
|
|||||||
Repeater {
|
Repeater {
|
||||||
model: providers
|
model: providers
|
||||||
SidebarElement {
|
SidebarElement {
|
||||||
name: modelData.Name
|
name: modelData.name
|
||||||
selected: (index == selectedElement) ? true : false
|
selected: (index == selectedElement) ? true : false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -26,13 +26,13 @@ Rectangle {
|
|||||||
return ((n % m) + m) % m;
|
return ((n % m) + m) % m;
|
||||||
}
|
}
|
||||||
Keys.onPressed: (event)=> {
|
Keys.onPressed: (event)=> {
|
||||||
|
// Handle scrolling
|
||||||
if (event.key == Qt.Key_Down) {
|
if (event.key == Qt.Key_Down) {
|
||||||
selectedElement = mod(selectedElement + 1, max_elements);
|
selectedElement = mod(selectedElement + 1, max_elements);
|
||||||
}
|
}
|
||||||
else if (event.key == Qt.Key_Up) {
|
else if (event.key == Qt.Key_Up) {
|
||||||
selectedElement = mod(selectedElement - 1, max_elements);
|
selectedElement = mod(selectedElement - 1, max_elements);
|
||||||
}
|
}
|
||||||
console.log(selectedElement)
|
|
||||||
event.accepted = true;
|
event.accepted = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+22
-14
@@ -17,24 +17,32 @@ ApplicationWindow {
|
|||||||
Database {
|
Database {
|
||||||
id: database
|
id: database
|
||||||
}
|
}
|
||||||
//Column {
|
|
||||||
// Repeater {
|
|
||||||
// model: database.Providers
|
|
||||||
// Text {
|
|
||||||
// text: modelData.Name
|
|
||||||
// //text: database.getString[0]
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
Row {
|
Row {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
Sidebar {
|
|
||||||
providers: database.Providers
|
|
||||||
focus: true
|
focus: true
|
||||||
|
default property int selectedView: 0
|
||||||
|
Sidebar {
|
||||||
|
id: sidebar
|
||||||
|
providers: database.Providers
|
||||||
}
|
}
|
||||||
Column {
|
ContentView {
|
||||||
width: parent.width * 0.7
|
id: view
|
||||||
height: parent.height
|
providers: database.Providers
|
||||||
|
}
|
||||||
|
function mod(n, m) {
|
||||||
|
return ((n % m) + m) % m;
|
||||||
|
}
|
||||||
|
Keys.onPressed: (event)=> {
|
||||||
|
if (selectedView == 0) {
|
||||||
|
if (event.key == Qt.Key_Right) {
|
||||||
|
selectedView = 1;
|
||||||
|
}
|
||||||
|
sidebar.Keys.pressed(event);
|
||||||
|
event.accepted = true;
|
||||||
|
} else {
|
||||||
|
|
||||||
|
}
|
||||||
|
event.accepted = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Generated
+79
-1
@@ -1,3 +1,30 @@
|
|||||||
|
[[package]]
|
||||||
|
name = "certifi"
|
||||||
|
version = "2022.6.15"
|
||||||
|
description = "Python package for providing Mozilla's CA Bundle."
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.6"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "charset-normalizer"
|
||||||
|
version = "2.1.0"
|
||||||
|
description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.6.0"
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
unicode_backport = ["unicodedata2"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "idna"
|
||||||
|
version = "3.3"
|
||||||
|
description = "Internationalized Domain Names in Applications (IDNA)"
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.5"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pyqt5"
|
name = "pyqt5"
|
||||||
version = "5.15.6"
|
version = "5.15.6"
|
||||||
@@ -37,12 +64,55 @@ python-versions = ">=3.5"
|
|||||||
[package.extras]
|
[package.extras]
|
||||||
screenshot_raw = ["pillow"]
|
screenshot_raw = ["pillow"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "requests"
|
||||||
|
version = "2.28.1"
|
||||||
|
description = "Python HTTP for Humans."
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.7, <4"
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
certifi = ">=2017.4.17"
|
||||||
|
charset-normalizer = ">=2,<3"
|
||||||
|
idna = ">=2.5,<4"
|
||||||
|
urllib3 = ">=1.21.1,<1.27"
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
socks = ["PySocks (>=1.5.6,!=1.5.7)"]
|
||||||
|
use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "urllib3"
|
||||||
|
version = "1.26.11"
|
||||||
|
description = "HTTP library with thread-safe connection pooling, file post, and more."
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, <4"
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"]
|
||||||
|
secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"]
|
||||||
|
socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
|
||||||
|
|
||||||
[metadata]
|
[metadata]
|
||||||
lock-version = "1.1"
|
lock-version = "1.1"
|
||||||
python-versions = "^3.10"
|
python-versions = "^3.10"
|
||||||
content-hash = "78b366b3ef924bc35630263d1f60d58493b2c5eb494cafc5943285e443d42dc3"
|
content-hash = "7e77956c19bb0148f37be8283857fbd29805184149d6f2c1027daab624c66b80"
|
||||||
|
|
||||||
[metadata.files]
|
[metadata.files]
|
||||||
|
certifi = [
|
||||||
|
{file = "certifi-2022.6.15-py3-none-any.whl", hash = "sha256:fe86415d55e84719d75f8b69414f6438ac3547d2078ab91b67e779ef69378412"},
|
||||||
|
{file = "certifi-2022.6.15.tar.gz", hash = "sha256:84c85a9078b11105f04f3036a9482ae10e4621616db313fe045dd24743a0820d"},
|
||||||
|
]
|
||||||
|
charset-normalizer = [
|
||||||
|
{file = "charset-normalizer-2.1.0.tar.gz", hash = "sha256:575e708016ff3a5e3681541cb9d79312c416835686d054a23accb873b254f413"},
|
||||||
|
{file = "charset_normalizer-2.1.0-py3-none-any.whl", hash = "sha256:5189b6f22b01957427f35b6a08d9a0bc45b46d3788ef5a92e978433c7a35f8a5"},
|
||||||
|
]
|
||||||
|
idna = [
|
||||||
|
{file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"},
|
||||||
|
{file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"},
|
||||||
|
]
|
||||||
pyqt5 = [
|
pyqt5 = [
|
||||||
{file = "PyQt5-5.15.6-cp36-abi3-macosx_10_13_x86_64.whl", hash = "sha256:33ced1c876f6a26e7899615a5a4efef2167c263488837c7beed023a64cebd051"},
|
{file = "PyQt5-5.15.6-cp36-abi3-macosx_10_13_x86_64.whl", hash = "sha256:33ced1c876f6a26e7899615a5a4efef2167c263488837c7beed023a64cebd051"},
|
||||||
{file = "PyQt5-5.15.6-cp36-abi3-manylinux1_x86_64.whl", hash = "sha256:9d6efad0377aa78bf081a20ac752ce86096ded18f04c592d98f5b92dc879ad0a"},
|
{file = "PyQt5-5.15.6-cp36-abi3-manylinux1_x86_64.whl", hash = "sha256:9d6efad0377aa78bf081a20ac752ce86096ded18f04c592d98f5b92dc879ad0a"},
|
||||||
@@ -78,3 +148,11 @@ pyqt5-sip = [
|
|||||||
python-mpv = [
|
python-mpv = [
|
||||||
{file = "python-mpv-0.5.2.tar.gz", hash = "sha256:10c7ae61eff441602c7188595108391cdede153c15454772d8811c2bcb9e6823"},
|
{file = "python-mpv-0.5.2.tar.gz", hash = "sha256:10c7ae61eff441602c7188595108391cdede153c15454772d8811c2bcb9e6823"},
|
||||||
]
|
]
|
||||||
|
requests = [
|
||||||
|
{file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"},
|
||||||
|
{file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"},
|
||||||
|
]
|
||||||
|
urllib3 = [
|
||||||
|
{file = "urllib3-1.26.11-py2.py3-none-any.whl", hash = "sha256:c33ccba33c819596124764c23a97d25f32b28433ba0dedeb77d873a38722c9bc"},
|
||||||
|
{file = "urllib3-1.26.11.tar.gz", hash = "sha256:ea6e8fb210b19d950fab93b60c9009226c63a28808bc8386e05301e25883ac0a"},
|
||||||
|
]
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ license = "GPLv3"
|
|||||||
python = "^3.10"
|
python = "^3.10"
|
||||||
python-mpv = "^0.5.2"
|
python-mpv = "^0.5.2"
|
||||||
PyQt5 = "^5.15.1"
|
PyQt5 = "^5.15.1"
|
||||||
|
requests = "^2.28.1"
|
||||||
|
|
||||||
|
|
||||||
[tool.poetry.scripts]
|
[tool.poetry.scripts]
|
||||||
|
|||||||
Reference in New Issue
Block a user