diff --git a/yyetsweb/databases/grafana.py b/yyetsweb/databases/grafana.py index bb1460b85..e176aea19 100644 --- a/yyetsweb/databases/grafana.py +++ b/yyetsweb/databases/grafana.py @@ -16,17 +16,30 @@ def get_grafana_data(self, date_series) -> str: class Metrics(Mongo): - def set_metrics(self, metrics_type: str): + def set_metrics(self, metrics_type: str, data: str): today = time.strftime("%Y-%m-%d", time.localtime()) - self.db["metrics"].update_one({"date": today}, {"$inc": {metrics_type: 1}}, upsert=True) + if metrics_type == "viewSubtitle": + self.db["subtitle"].find_one_and_update( + {"_id": data}, {"$inc": {"views": 1}} + ) + else: + self.db["metrics"].update_one( + {"date": today}, {"$inc": {metrics_type: 1}}, upsert=True + ) def get_metrics(self, from_date: str, to_date: str) -> dict: start_int = [int(i) for i in from_date.split("-")] end_int = [int(i) for i in to_date.split("-")] sdate = date(*start_int) # start date edate = date(*end_int) # end date - date_range = [str(sdate + timedelta(days=x)) for x in range((edate - sdate).days + 1)] + date_range = [ + str(sdate + timedelta(days=x)) for x in range((edate - sdate).days + 1) + ] condition = {"date": {"$in": date_range}} - result = self.db["metrics"].find(condition, {"_id": False}).sort("date", pymongo.DESCENDING) + result = ( + self.db["metrics"] + .find(condition, {"_id": False}) + .sort("date", pymongo.DESCENDING) + ) return dict(metrics=list(result)) diff --git a/yyetsweb/databases/resources.py b/yyetsweb/databases/resources.py index acc699b04..f7461dbe9 100644 --- a/yyetsweb/databases/resources.py +++ b/yyetsweb/databases/resources.py @@ -14,6 +14,13 @@ from databases.comment import CommentSearch +class SubtitleDownload(Mongo): + def add_download(self, _id): + self.db["subtitle"].find_one_and_update( + {"_id": _id}, {"$inc": {"downloads": 1}} + ) + + class Resource(SearchEngine): def fansub_search(self, class_name: str, kw: str): class_ = globals().get(class_name) @@ -79,8 +86,18 @@ def search_resource(): data = self.db["yyets"].find( { "$or": [ - {"data.info.cnname": {"$regex": f".*{keyword}.*", "$options": "i"}}, - {"data.info.enname": {"$regex": f".*{keyword}.*", "$options": "i"}}, + { + "data.info.cnname": { + "$regex": f".*{keyword}.*", + "$options": "i", + } + }, + { + "data.info.enname": { + "$regex": f".*{keyword}.*", + "$options": "i", + } + }, { "data.info.aliasname": { "$regex": f".*{keyword}.*", @@ -113,7 +130,9 @@ def search_comment(): hide_phone(comments.get("data", [])) for c in comments.get("data", []): comment_rid = c["resource_id"] - res = self.db["yyets"].find_one({"data.info.id": comment_rid}, projection={"data.info": True}) + res = self.db["yyets"].find_one( + {"data.info.id": comment_rid}, projection={"data.info": True} + ) if res: comment_data.append( { @@ -227,11 +246,17 @@ def get_most(self) -> list: most_like[_id] = most_like.get(_id, 0) + 1 most = sorted(most_like, key=most_like.get) most.reverse() - most_like_data = self.db["yyets"].find({"data.info.id": {"$in": most}}, self.projection).limit(15) + most_like_data = ( + self.db["yyets"] + .find({"data.info.id": {"$in": most}}, self.projection) + .limit(15) + ) return list(most_like_data) def get_top_resource(self) -> dict: - area_dict = dict(ALL={"$regex": ".*"}, US="美国", JP="日本", KR="韩国", UK="英国") + area_dict = dict( + ALL={"$regex": ".*"}, US="美国", JP="日本", KR="韩国", UK="英国" + ) all_data = {"ALL": "全部"} for abbr, area in area_dict.items(): data = ( @@ -283,7 +308,9 @@ def query_db(self) -> dict: "date": ts_date(int(ts)), } - sorted_res: list = sorted(episode_data.items(), key=lambda x: x[1]["timestamp"], reverse=True) + sorted_res: list = sorted( + episode_data.items(), key=lambda x: x[1]["timestamp"], reverse=True + ) limited_res = dict(sorted_res[:100]) ok = [] for k, v in limited_res.items(): diff --git a/yyetsweb/handlers/grafana.py b/yyetsweb/handlers/grafana.py index b092a87a5..04aebcbbb 100644 --- a/yyetsweb/handlers/grafana.py +++ b/yyetsweb/handlers/grafana.py @@ -21,8 +21,9 @@ class MetricsHandler(BaseHandler): def set_metrics(self): payload = self.json metrics_type = payload.get("type", self.get_query_argument("type", "unknown")) + metrics_data = payload.get("data" ) - self.instance.set_metrics(metrics_type) + self.instance.set_metrics(metrics_type,metrics_data) self.set_status(HTTPStatus.CREATED) return {} diff --git a/yyetsweb/handlers/resources.py b/yyetsweb/handlers/resources.py index 5831f1c41..1ddd6f1c9 100644 --- a/yyetsweb/handlers/resources.py +++ b/yyetsweb/handlers/resources.py @@ -13,14 +13,18 @@ class SubtitleDownloadHandler(BaseHandler): + filename = filename + @run_on_executor() def find_and_download(self): file = self.json.get("file") + _id = self.json.get("_id") self.set_header("x-filename", Path(file).name) p = Path(__file__).parent.parent.joinpath("subtitle_data", file) self.set_header("Content-Type", "application/bin") try: data = p.read_bytes() + self.instance.add_download(_id) return data except FileNotFoundError: self.set_status(HTTPStatus.NOT_FOUND) @@ -52,7 +56,9 @@ def get_resource_data(self): def search_resource(self): kw = self.get_query_argument("keyword").lower() search_type = self.get_query_argument("type", "default") - self.set_header("search-engine", "Meilisearch" if os.getenv("MEILISEARCH") else "MongoDB") + self.set_header( + "search-engine", "Meilisearch" if os.getenv("MEILISEARCH") else "MongoDB" + ) return self.instance.search_resource(kw, search_type) @gen.coroutine