本日作業分
このコミットが含まれているのは:
+143
-24
@@ -16,6 +16,23 @@ def main (
|
|||||||
user = os.environ['MYSQL_USER'],
|
user = os.environ['MYSQL_USER'],
|
||||||
password = os.environ['MYSQL_PASS'])
|
password = os.environ['MYSQL_PASS'])
|
||||||
|
|
||||||
|
video_dao = VideoDao (conn)
|
||||||
|
|
||||||
|
api_data = search_nico_by_tags (['伊地知ニジカ', 'ぼざろクリーチャーシリーズ'])
|
||||||
|
|
||||||
|
update_video_table (video_dao, api_data)
|
||||||
|
|
||||||
|
# TODO: 書くこと
|
||||||
|
|
||||||
|
|
||||||
|
def update_video_table (
|
||||||
|
video_dao,
|
||||||
|
api_data: list[dict],
|
||||||
|
) -> None:
|
||||||
|
videos = video_dao.fetch_all ()
|
||||||
|
|
||||||
|
# TODO: 書くこと
|
||||||
|
|
||||||
|
|
||||||
def fetch_comments (
|
def fetch_comments (
|
||||||
video_id: str,
|
video_id: str,
|
||||||
@@ -36,7 +53,7 @@ def fetch_comments (
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
nv_comment = res['data']['comment']['nvComment']
|
nv_comment = res['data']['comment']['nvComment']
|
||||||
except (NameError, AttributeError):
|
except KeyError:
|
||||||
return []
|
return []
|
||||||
if nv_comment is None:
|
if nv_comment is None:
|
||||||
return []
|
return []
|
||||||
@@ -58,7 +75,7 @@ def fetch_comments (
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
return res['data']['threads'][1]['comments']
|
return res['data']['threads'][1]['comments']
|
||||||
except (NameError, AttributeError):
|
except (IndexError, KeyError):
|
||||||
return []
|
return []
|
||||||
|
|
||||||
|
|
||||||
@@ -74,6 +91,8 @@ def search_nico_by_tags (
|
|||||||
url = ('https://snapshot.search.nicovideo.jp'
|
url = ('https://snapshot.search.nicovideo.jp'
|
||||||
+ '/api/v2/snapshot/video/contents/search')
|
+ '/api/v2/snapshot/video/contents/search')
|
||||||
|
|
||||||
|
# TODO: 年月日の設定ができてゐなぃのと,100 件までしか取得できなぃので何とかすること
|
||||||
|
|
||||||
query_filter = json.dumps ({ 'type': 'or',
|
query_filter = json.dumps ({ 'type': 'or',
|
||||||
'filters': [
|
'filters': [
|
||||||
{ 'type': 'range',
|
{ 'type': 'range',
|
||||||
@@ -102,7 +121,33 @@ class VideoDao:
|
|||||||
):
|
):
|
||||||
self.conn = conn
|
self.conn = conn
|
||||||
|
|
||||||
|
def fetch (
|
||||||
|
self,
|
||||||
|
video_id: int,
|
||||||
|
with_relation_tables: bool = True,
|
||||||
|
) -> VideoDto | None:
|
||||||
|
with self.conn.cursor () as c:
|
||||||
|
c.execute ("""
|
||||||
|
SELECT
|
||||||
|
id,
|
||||||
|
code,
|
||||||
|
title,
|
||||||
|
description,
|
||||||
|
uploaded_at,
|
||||||
|
deleted_at
|
||||||
|
FROM
|
||||||
|
videos
|
||||||
|
WHERE
|
||||||
|
id = %s
|
||||||
|
ORDER BY
|
||||||
|
id""", video_id)
|
||||||
|
row = c.fetchone ()
|
||||||
|
if row is None:
|
||||||
|
return None
|
||||||
|
return self._create_dto_from_row (row, with_relation_tables)
|
||||||
|
|
||||||
def fetch_all (
|
def fetch_all (
|
||||||
|
self,
|
||||||
with_relation_tables: bool = True,
|
with_relation_tables: bool = True,
|
||||||
) -> list[VideoDto]:
|
) -> list[VideoDto]:
|
||||||
with self.conn.cursor () as c:
|
with self.conn.cursor () as c:
|
||||||
@@ -115,25 +160,39 @@ class VideoDao:
|
|||||||
uploaded_at,
|
uploaded_at,
|
||||||
deleted_at
|
deleted_at
|
||||||
FROM
|
FROM
|
||||||
videos""")
|
videos
|
||||||
for video in c.fetchall ():
|
ORDER BY
|
||||||
if with_relation_tables:
|
id""")
|
||||||
video_tags = VideoTagDao (conn).fetch_all (False)
|
videos: list[VideoDto] = []
|
||||||
comments = CommentDao (conn).fetch_all (False)
|
for row in c.fetchall ():
|
||||||
video_histories = VideoHistoryDao (conn).fetch_all (False)
|
videos.append (self._create_dto_from_row (row, with_relation_tables))
|
||||||
else:
|
return videos
|
||||||
video_tags = None
|
|
||||||
comments = None
|
def _create_dto_from_row (
|
||||||
video_histories = None
|
self,
|
||||||
return VideoDto (id_ = video['id'],
|
row,
|
||||||
code = video['code'],
|
with_relation_tables: bool,
|
||||||
title = video['title'],
|
) -> VideoDto:
|
||||||
description = video['description'],
|
video = VideoDto (id_ = row['id'],
|
||||||
uploaded_at = video['uploaded_at'],
|
code = row['code'],
|
||||||
deleted_at = video['deleted_at'],
|
title = row['title'],
|
||||||
video_tags = video_tags,
|
description = row['description'],
|
||||||
comments = comments,
|
uploaded_at = row['uploaded_at'],
|
||||||
video_histories = video_histories)
|
deleted_at = row['deleted_at'],
|
||||||
|
video_tags = None,
|
||||||
|
comments = None,
|
||||||
|
video_histories = None)
|
||||||
|
if with_relation_tables:
|
||||||
|
video.video_tags = VideoTagDao (self.conn).fetch_by_video_id (video.id_, False)
|
||||||
|
for i in range (len (video.video_tags)):
|
||||||
|
video.video_tags[i].video = video
|
||||||
|
video.comments = CommentDao (self.conn).fetch_by_video_id (video.id_, False)
|
||||||
|
for i in range (len (video.comments)):
|
||||||
|
video.comments[i].video = video
|
||||||
|
video.video_histories = VideoHistoryDao (self.conn).fetch_by_video_id (video.id_, False)
|
||||||
|
for i in range (len (video.video_histories)):
|
||||||
|
video.video_histories[i].video = video
|
||||||
|
return video
|
||||||
|
|
||||||
|
|
||||||
@dataclass (slots = True)
|
@dataclass (slots = True)
|
||||||
@@ -144,9 +203,69 @@ class VideoDto:
|
|||||||
description: str
|
description: str
|
||||||
uploaded_at: datetime
|
uploaded_at: datetime
|
||||||
deleted_at: datetime | None
|
deleted_at: datetime | None
|
||||||
video_tags: VideoTagDto | None
|
video_tags: list[VideoTagDto] | None
|
||||||
comments: CommentDto | None
|
comments: list[CommentDto] | None
|
||||||
video_histories: VideoHistoryDto | None
|
video_histories: list[VideoHistoryDto] | None
|
||||||
|
|
||||||
|
|
||||||
|
class VideoTagDao:
|
||||||
|
def __init__ (
|
||||||
|
self,
|
||||||
|
conn,
|
||||||
|
):
|
||||||
|
self.conn = conn
|
||||||
|
|
||||||
|
def fetch_by_video_id (
|
||||||
|
self,
|
||||||
|
video_id: int,
|
||||||
|
with_relation_tables: bool = True,
|
||||||
|
) -> list[VideoTagDto]:
|
||||||
|
with self.conn.cursor () as c:
|
||||||
|
c.execute ("""
|
||||||
|
SELECT
|
||||||
|
id,
|
||||||
|
video_id,
|
||||||
|
tag_id,
|
||||||
|
tagged_at,
|
||||||
|
untagged_at
|
||||||
|
FROM
|
||||||
|
video_tags
|
||||||
|
WHERE
|
||||||
|
video_id = %s
|
||||||
|
ORDER BY
|
||||||
|
id""", video_id)
|
||||||
|
video_tags: list[VideoTagDto] = []
|
||||||
|
for row in c.fetchall ():
|
||||||
|
video_tags.append (self._create_dto_from_row (row, with_relation_tables))
|
||||||
|
return video_tags
|
||||||
|
|
||||||
|
def _create_dto_from_row (
|
||||||
|
self,
|
||||||
|
row,
|
||||||
|
with_relation_tables: bool,
|
||||||
|
) -> VideoTagDto:
|
||||||
|
video_tag = VideoTagDto (id_ = row['id'],
|
||||||
|
video_id = row['video_id'],
|
||||||
|
tag_id = row['tag_id'],
|
||||||
|
tagged_at = row['tagged_at'],
|
||||||
|
untagged_at = row['untagged_at'],
|
||||||
|
video = None,
|
||||||
|
tag = None)
|
||||||
|
if with_relation_tables:
|
||||||
|
video_tag.video = VideoDao (self.conn).fetch (video_tag.video_id, True)
|
||||||
|
video_tag.tag = TagDao (self.conn).fetch (video_tag.tag_id, True)
|
||||||
|
return video_tag
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass (slots = True)
|
||||||
|
class VideoTagDto:
|
||||||
|
id_: int
|
||||||
|
video_id: int
|
||||||
|
tag_id: int
|
||||||
|
tagged_at: datetime
|
||||||
|
untagged_at: datetime
|
||||||
|
video: VideoDto
|
||||||
|
tag: TagDto
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|||||||
新しい課題から参照
ユーザをブロックする