|
@@ -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""") |
|
|
|
|
|
for video in c.fetchall (): |
|
|
|
|
|
if with_relation_tables: |
|
|
|
|
|
video_tags = VideoTagDao (conn).fetch_all (False) |
|
|
|
|
|
comments = CommentDao (conn).fetch_all (False) |
|
|
|
|
|
video_histories = VideoHistoryDao (conn).fetch_all (False) |
|
|
|
|
|
else: |
|
|
|
|
|
video_tags = None |
|
|
|
|
|
comments = None |
|
|
|
|
|
video_histories = None |
|
|
|
|
|
return VideoDto (id_ = video['id'], |
|
|
|
|
|
code = video['code'], |
|
|
|
|
|
title = video['title'], |
|
|
|
|
|
description = video['description'], |
|
|
|
|
|
uploaded_at = video['uploaded_at'], |
|
|
|
|
|
deleted_at = video['deleted_at'], |
|
|
|
|
|
video_tags = video_tags, |
|
|
|
|
|
comments = comments, |
|
|
|
|
|
video_histories = video_histories) |
|
|
|
|
|
|
|
|
videos |
|
|
|
|
|
ORDER BY |
|
|
|
|
|
id""") |
|
|
|
|
|
videos: list[VideoDto] = [] |
|
|
|
|
|
for row in c.fetchall (): |
|
|
|
|
|
videos.append (self._create_dto_from_row (row, with_relation_tables)) |
|
|
|
|
|
return videos |
|
|
|
|
|
|
|
|
|
|
|
def _create_dto_from_row ( |
|
|
|
|
|
self, |
|
|
|
|
|
row, |
|
|
|
|
|
with_relation_tables: bool, |
|
|
|
|
|
) -> VideoDto: |
|
|
|
|
|
video = VideoDto (id_ = row['id'], |
|
|
|
|
|
code = row['code'], |
|
|
|
|
|
title = row['title'], |
|
|
|
|
|
description = row['description'], |
|
|
|
|
|
uploaded_at = row['uploaded_at'], |
|
|
|
|
|
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 |
|
|
|
|
|
comments: CommentDto | None |
|
|
|
|
|
video_histories: VideoHistoryDto | None |
|
|
|
|
|
|
|
|
video_tags: list[VideoTagDto] | None |
|
|
|
|
|
comments: list[CommentDto] | 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__': |
|
|