Move to QNetwork
This commit is contained in:
@@ -1,13 +1,25 @@
|
|||||||
from typing import Optional, Self, Type, cast
|
from typing import Optional, Self, Type, cast
|
||||||
|
|
||||||
from PyQt6.QtCore import QObject, Qt, QUrl, pyqtSlot
|
from PyQt6.QtCore import (
|
||||||
|
QBuffer,
|
||||||
|
QByteArray,
|
||||||
|
QDir,
|
||||||
|
QObject,
|
||||||
|
QStandardPaths,
|
||||||
|
QUrl,
|
||||||
|
pyqtSlot,
|
||||||
|
)
|
||||||
from PyQt6.QtMultimedia import (
|
from PyQt6.QtMultimedia import (
|
||||||
QAudioDevice,
|
|
||||||
QAudioOutput,
|
QAudioOutput,
|
||||||
QMediaDevices,
|
QMediaDevices,
|
||||||
QMediaPlayer,
|
QMediaPlayer,
|
||||||
QSoundEffect,
|
QSoundEffect,
|
||||||
)
|
)
|
||||||
|
from PyQt6.QtNetwork import (
|
||||||
|
QNetworkAccessManager,
|
||||||
|
QNetworkDiskCache,
|
||||||
|
QNetworkRequest,
|
||||||
|
)
|
||||||
|
|
||||||
# from PyQt6.QtWidgets import QWidget
|
# from PyQt6.QtWidgets import QWidget
|
||||||
|
|
||||||
@@ -62,20 +74,28 @@ class SoundOff(QObject):
|
|||||||
self.virtualPlayer.errorOccurred.connect(self.mediaError)
|
self.virtualPlayer.errorOccurred.connect(self.mediaError)
|
||||||
self.virtualPlayer.mediaStatusChanged.connect(self.mediaStatus)
|
self.virtualPlayer.mediaStatusChanged.connect(self.mediaStatus)
|
||||||
self.virtualPlayer.playbackStateChanged.connect(self.playbackState)
|
self.virtualPlayer.playbackStateChanged.connect(self.playbackState)
|
||||||
|
cacheDir = QDir(
|
||||||
@pyqtSlot()
|
QStandardPaths.writableLocation(
|
||||||
def alert(self) -> None:
|
QStandardPaths.StandardLocation.GenericCacheLocation
|
||||||
self.alertEffect.play()
|
)
|
||||||
|
)
|
||||||
|
cacheDir.mkdir("Troglodite")
|
||||||
|
cacheDir = QDir(cacheDir.path() + QDir.separator() + "Troglodite")
|
||||||
|
netCache = QNetworkDiskCache()
|
||||||
|
netCache.setCacheDirectory(cacheDir.path())
|
||||||
|
self.nam = QNetworkAccessManager()
|
||||||
|
self.nam.setCache(netCache)
|
||||||
return
|
return
|
||||||
|
|
||||||
@pyqtSlot(QMediaPlayer.Error, str)
|
@pyqtSlot(QMediaPlayer.Error, str)
|
||||||
def mediaError(self, error: QMediaPlayer.Error, string: str) -> None:
|
def mediaError(self, error: QMediaPlayer.Error, msg: str) -> None:
|
||||||
print(error)
|
print(error)
|
||||||
print(str)
|
print(msg)
|
||||||
return
|
return
|
||||||
|
|
||||||
@pyqtSlot(QMediaPlayer.MediaStatus)
|
@pyqtSlot(QMediaPlayer.MediaStatus)
|
||||||
def mediaStatus(self, status: QMediaPlayer.MediaStatus) -> None:
|
def mediaStatus(self, status: QMediaPlayer.MediaStatus) -> None:
|
||||||
|
print(f"mediaStatus: {status}")
|
||||||
if status == QMediaPlayer.MediaStatus.LoadedMedia:
|
if status == QMediaPlayer.MediaStatus.LoadedMedia:
|
||||||
player: Optional[QMediaPlayer] = cast(QMediaPlayer, self.sender())
|
player: Optional[QMediaPlayer] = cast(QMediaPlayer, self.sender())
|
||||||
assert player is not None
|
assert player is not None
|
||||||
@@ -84,6 +104,7 @@ class SoundOff(QObject):
|
|||||||
|
|
||||||
@pyqtSlot(QMediaPlayer.PlaybackState)
|
@pyqtSlot(QMediaPlayer.PlaybackState)
|
||||||
def playbackState(self, state: QMediaPlayer.PlaybackState) -> None:
|
def playbackState(self, state: QMediaPlayer.PlaybackState) -> None:
|
||||||
|
print(f"playbackState: {state}")
|
||||||
return
|
return
|
||||||
|
|
||||||
#
|
#
|
||||||
@@ -95,20 +116,46 @@ class SoundOff(QObject):
|
|||||||
return
|
return
|
||||||
|
|
||||||
@pyqtSlot(str)
|
@pyqtSlot(str)
|
||||||
def playSound(self, url: str) -> None:
|
def playSound(self, url: str | QUrl) -> None:
|
||||||
src = QUrl(url)
|
if isinstance(url, str):
|
||||||
|
url = QUrl(url)
|
||||||
if not self.localPlayer.audioOutput():
|
if not self.localPlayer.audioOutput():
|
||||||
self.localPlayer.setAudioOutput(self.localOutput)
|
self.localPlayer.setAudioOutput(self.localOutput)
|
||||||
self.localPlayer.setSource(src)
|
request = QNetworkRequest(url)
|
||||||
|
self.reply = self.nam.get(request)
|
||||||
|
assert self.reply is not None
|
||||||
|
self.reply.finished.connect(self.finished)
|
||||||
|
return
|
||||||
|
|
||||||
|
@pyqtSlot()
|
||||||
|
def alert(self) -> None:
|
||||||
|
self.alertEffect.play()
|
||||||
|
return
|
||||||
|
|
||||||
|
#
|
||||||
|
# Network slots
|
||||||
|
#
|
||||||
|
_buffer = QBuffer()
|
||||||
|
_storage = QByteArray()
|
||||||
|
|
||||||
|
@pyqtSlot()
|
||||||
|
def finished(self) -> None:
|
||||||
|
assert self.reply is not None
|
||||||
|
self._storage = self.reply.readAll()
|
||||||
|
if self.localPlayer.sourceDevice() != self._buffer:
|
||||||
|
self._buffer.setBuffer(self._storage)
|
||||||
|
self.localPlayer.setSourceDevice(self._buffer)
|
||||||
self.localPlayer.setPosition(0)
|
self.localPlayer.setPosition(0)
|
||||||
if (
|
if (
|
||||||
self.localPlayer.mediaStatus()
|
self.localPlayer.mediaStatus()
|
||||||
== QMediaPlayer.MediaStatus.LoadedMedia
|
== QMediaPlayer.MediaStatus.LoadedMedia
|
||||||
):
|
):
|
||||||
self.localPlayer.play()
|
self.localPlayer.play()
|
||||||
|
print("play")
|
||||||
if not self.virtualDevice:
|
if not self.virtualDevice:
|
||||||
return
|
return
|
||||||
self.virtualPlayer.setSource(src)
|
if self.virtualPlayer.sourceDevice() != self._buffer:
|
||||||
|
self.virtualPlayer.setSourceDevice(self._buffer)
|
||||||
self.virtualPlayer.setPosition(0)
|
self.virtualPlayer.setPosition(0)
|
||||||
if not self.virtualPlayer.audioOutput():
|
if not self.virtualPlayer.audioOutput():
|
||||||
self.virtualPlayer.setAudioOutput(self.virtualOutput)
|
self.virtualPlayer.setAudioOutput(self.virtualOutput)
|
||||||
|
|||||||
23
lib/words.py
23
lib/words.py
@@ -18,6 +18,11 @@ from PyQt6.QtGui import (
|
|||||||
QTextOption,
|
QTextOption,
|
||||||
QTransform,
|
QTransform,
|
||||||
)
|
)
|
||||||
|
from PyQt6.QtNetwork import (
|
||||||
|
QNetworkAccessManager,
|
||||||
|
QNetworkReply,
|
||||||
|
QNetworkRequest,
|
||||||
|
)
|
||||||
from PyQt6.QtSql import QSqlQuery
|
from PyQt6.QtSql import QSqlQuery
|
||||||
from PyQt6.QtWidgets import QScrollArea, QWidget
|
from PyQt6.QtWidgets import QScrollArea, QWidget
|
||||||
|
|
||||||
@@ -537,12 +542,18 @@ class Word:
|
|||||||
# The code should look at our settings to see if we have an API
|
# The code should look at our settings to see if we have an API
|
||||||
# key for MW to decide on the source to use.
|
# key for MW to decide on the source to use.
|
||||||
#
|
#
|
||||||
source = 'mw'
|
source = "mw"
|
||||||
response = requests.get(MWAPI.format(word=word))
|
manager = QNetworkAccessManager()
|
||||||
if response.status_code != 200:
|
request = QNetworkRequest()
|
||||||
self.current = {}
|
url = QUrl(MWAPI.format(word=word))
|
||||||
return
|
request.setUrl(url)
|
||||||
data = json.loads(response.content.decode("utf-8"))
|
reply = manager.get(request)
|
||||||
|
assert reply is not None
|
||||||
|
loop = QEventLoop()
|
||||||
|
reply.finished.connect(loop.quit)
|
||||||
|
loop.exec()
|
||||||
|
content = reply.readAll()
|
||||||
|
data = json.loads(content.data().decode("utf-8"))
|
||||||
print(data)
|
print(data)
|
||||||
self._words[word] = {
|
self._words[word] = {
|
||||||
'word': word,
|
'word': word,
|
||||||
|
|||||||
Reference in New Issue
Block a user