Files
shikimori_list_viewer/search_dialog.py

113 lines
4.7 KiB
Python

#!/usr/bin/python3
# -*- coding: utf-8 -*-
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QDialog, QMessageBox, QListWidgetItem
from requests import post, get
from jsonIO import jsonIO
from search import Ui_SearchDialog
header = {
"User-Agent": "",
"Authorization": ""
}
tokens_filename = "tokens.json"
class SearchDialog(QDialog, Ui_SearchDialog):
def __init__(self, parent=None):
QDialog.__init__(self, parent, flags=(Qt.Window | Qt.WindowTitleHint | Qt.WindowCloseButtonHint))
Ui_SearchDialog.__init__(self)
self.ui = Ui_SearchDialog()
self.ui.setupUi(self)
self.parent = parent
# import tokens from tokens_filename
if not jsonIO.is_valid_json(tokens_filename):
jsonIO.save_json(tokens_filename, {
"oauth_app_name": "",
"client_id": "",
"client_secret": "",
"authorization_code": "",
"access_token": "",
"refresh_token": ""
})
QMessageBox.critical(self, "Ошибка", "Заполните 'tokens.json' своими данными чтобы поиск работал "
"корректно!")
self.close()
else:
self.tokens = jsonIO.load_json(tokens_filename)
for key, value in self.tokens.items():
if (key != "access_token" or key != "refresh_token") and value == "":
QMessageBox.critical(self, "Ошибка", "Заполните 'tokens.json' своими данными чтобы поиск работал "
"корректно!")
self.close()
if self.tokens["access_token"] == "":
self.get_new_access_token()
self.update_headers()
self.ui.search.clicked.connect(self.search_titles)
def update_headers(self):
header["User-Agent"] = self.tokens["oauth_app_name"]
header["Authorization"] = "Bearer {}".format(self.tokens["access_token"])
def get_new_access_token(self):
response = post("https://shikimori.one/oauth/token", headers=header, data={
"grant_type": "authorization_code",
"client_id": self.tokens["client_id"],
"client_secret": self.tokens["client_secret"],
"code": self.tokens["authorization_code"],
})
if response.status_code == 200:
new_tokens = response.json()
self.tokens["access_token"] = new_tokens["access_token"]
self.tokens["refresh_token"] = new_tokens["refresh_token"]
jsonIO.save_json(tokens_filename, self.tokens)
self.update_headers()
print("got new tokens")
def refresh_access_token(self):
response = post("https://shikimori.one/oauth/token", headers=header, data={
"grant_type": "refresh_token",
"client_id": self.tokens["client_id"],
"client_secret": self.tokens["client_secret"],
"refresh_token": self.tokens["refresh_token"],
})
if response.status_code == 200:
new_tokens = response.json()
self.tokens["access_token"] = new_tokens["access_token"]
self.tokens["refresh_token"] = new_tokens["refresh_token"]
jsonIO.save_json(tokens_filename, self.tokens)
self.update_headers()
print("tokens updated", new_tokens)
def search_titles(self):
title_name = self.ui.to_search.text()
if len(title_name) == 0:
QMessageBox.critical(self, "Ошибка", "Введите название тайтла.")
return
response = get("https://shikimori.one/api/animes", headers=header, params={"search": title_name, "limit": 25})
# print(response.json())
if response.status_code == 401:
if response.json()["error"] == "invalid_token":
self.refresh_access_token()
# self.search_titles()
return
if response.status_code == 200:
found_titles = response.json()
if len(found_titles) == 0:
QMessageBox.information(self, "Информация", "Ничего не найдено. Попробуйте еще раз.")
return
self.ui.search_list.clear()
for data in found_titles:
item = QListWidgetItem()
if data["russian"] != "":
item.setText("{} | {}".format(data["russian"], data["name"]))
else:
item.setText(data["name"])
item.setData(1, data["id"])
self.ui.search_list.addItem(item)