|
@@ -1,16 +1,17 @@ |
|
|
|
|
|
from __future__ import annotations |
|
|
|
|
|
|
|
|
import json |
|
|
import json |
|
|
import os |
|
|
import os |
|
|
import random |
|
|
import random |
|
|
import string |
|
|
import string |
|
|
import time |
|
|
import time |
|
|
from dataclasses import dataclass |
|
|
from dataclasses import dataclass |
|
|
from datetime import datetime |
|
|
|
|
|
|
|
|
from datetime import datetime, timedelta |
|
|
from typing import TypedDict, cast |
|
|
from typing import TypedDict, cast |
|
|
|
|
|
|
|
|
import mysql.connector |
|
|
import mysql.connector |
|
|
import requests |
|
|
import requests |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DbNull = (None,) |
|
|
DbNull = (None,) |
|
|
DbNullType = tuple[None] |
|
|
DbNullType = tuple[None] |
|
|
|
|
|
|
|
@@ -69,7 +70,7 @@ def update_tables ( |
|
|
video = VideoDto (code = datum['contentId'], |
|
|
video = VideoDto (code = datum['contentId'], |
|
|
title = datum['title'], |
|
|
title = datum['title'], |
|
|
description = datum['description'], |
|
|
description = datum['description'], |
|
|
uploaded_at = datum['startTime']) |
|
|
|
|
|
|
|
|
uploaded_at = datetime.fromisoformat (datum['startTime'])) |
|
|
video_dao.upsert (video, False) |
|
|
video_dao.upsert (video, False) |
|
|
if video.id_ is not None: |
|
|
if video.id_ is not None: |
|
|
video_history = VideoHistoryDto (video_id = video.id_, |
|
|
video_history = VideoHistoryDto (video_id = video.id_, |
|
@@ -160,30 +161,42 @@ def search_nico_by_tag ( |
|
|
def search_nico_by_tags ( |
|
|
def search_nico_by_tags ( |
|
|
tags: list[str], |
|
|
tags: list[str], |
|
|
) -> list[VideoResult]: |
|
|
) -> list[VideoResult]: |
|
|
|
|
|
today = datetime.now () |
|
|
|
|
|
|
|
|
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', |
|
|
|
|
|
'filters': [ |
|
|
|
|
|
{ 'type': 'range', |
|
|
|
|
|
'field': 'startTime', |
|
|
|
|
|
'from': f"{year}-{start}T00:00:00+09:00", |
|
|
|
|
|
'to': f"{year}-{end}T23:59:59+09:00", |
|
|
|
|
|
'include_lower': True }] }) |
|
|
|
|
|
|
|
|
|
|
|
params: VideoSearchParam |
|
|
|
|
|
params = { 'q': ' OR '.join (tags), |
|
|
|
|
|
'targets': 'tagsExact', |
|
|
|
|
|
'_sort': '-viewCounter', |
|
|
|
|
|
'fields': 'contentId,title,tags,description,viewCounter,startTime', |
|
|
|
|
|
'_limit': 100, |
|
|
|
|
|
'jsonFilter': query_filter } |
|
|
|
|
|
|
|
|
|
|
|
res = requests.get (url, params = cast (dict[str, int | str], params), timeout = 60).json () |
|
|
|
|
|
|
|
|
|
|
|
return res['data'] |
|
|
|
|
|
|
|
|
result_data: list[VideoResult] = [] |
|
|
|
|
|
to = datetime (2022, 12, 3) |
|
|
|
|
|
while to <= today: |
|
|
|
|
|
time.sleep (1.2) |
|
|
|
|
|
until = to + timedelta (days = 14) |
|
|
|
|
|
query_filter = json.dumps ({ 'type': 'or', |
|
|
|
|
|
'filters': [ |
|
|
|
|
|
{ 'type': 'range', |
|
|
|
|
|
'field': 'startTime', |
|
|
|
|
|
'from': '%04d-%02d-%02dT00:00:00+09:00' % (to.year, to.month, to.day), |
|
|
|
|
|
'to': '%04d-%02d-%02dT23:59:59+09:00' % (until.year, until.month, until.day), |
|
|
|
|
|
'include_lower': True }] }) |
|
|
|
|
|
params: VideoSearchParam = { 'q': ' OR '.join (tags), |
|
|
|
|
|
'targets': 'tagsExact', |
|
|
|
|
|
'_sort': '-viewCounter', |
|
|
|
|
|
'fields': ('contentId,' |
|
|
|
|
|
'title,' |
|
|
|
|
|
'tags,' |
|
|
|
|
|
'description,' |
|
|
|
|
|
'viewCounter,' |
|
|
|
|
|
'startTime'), |
|
|
|
|
|
'_limit': 100, |
|
|
|
|
|
'jsonFilter': query_filter } |
|
|
|
|
|
res = requests.get (url, params = cast (dict[str, int | str], params), timeout = 60).json () |
|
|
|
|
|
try: |
|
|
|
|
|
result_data += res['data'] |
|
|
|
|
|
except KeyError: |
|
|
|
|
|
pass |
|
|
|
|
|
to = until + timedelta (days = 1) |
|
|
|
|
|
|
|
|
|
|
|
return result_data |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class VideoDao: |
|
|
class VideoDao: |
|
|