1
0
Fork 0
scripts/nico_comment.py

83 lines
2.1 KiB
Python
Executable file

#!/usr/bin/python3
import asyncio
import argparse
from datetime import datetime
import netrc
import os
from urllib.parse import urlparse
import pandas as pd
from nicotools.download import Comment, Info, utils
import simplejson as json
def process_element(element):
element = element["chat"]
video_pos = element["vpos"] * 10
comment = element["content"]
video_time = datetime.fromtimestamp(video_pos / 1000).strftime("%M:%S.%f")
return (video_time, comment)
def extract_ids(urls):
video_ids = list()
for url in urls:
parsed = urlparse(url)
nico_id = os.path.split(parsed.path)[-1]
video_ids.append(nico_id)
return nico_id
class CommentStream(Comment):
def saver(self, video_id: str, is_xml: bool,
coroutine: asyncio.Task) -> bool:
comment_data = coroutine.result()
conts = list()
if not is_xml:
data = json.loads(comment_data)
contents = [process_element(item)
for item in data if "chat" in item]
file_path = utils.make_name(self.glossary[video_id], "",
extention="txt")
df = pd.DataFrame.from_records(contents,
columns=["Time", "Comment"])
df["Time"] = pd.to_datetime(df["Time"],
format="%M:%S.%f").dt.time
df = df.sort_values(by="Time")
with file_path.open("w", encoding="utf-8") as f:
df.to_csv(f, sep="\t", index=False)
return True
def main():
parser = argparse.ArgumentParser()
parser.add_argument("video", help="Video URL(s)", nargs="+")
parser.add_argument("-d", "--destination", help="Destination directory",
default="./")
options = parser.parse_args()
user, _, password = netrc.netrc().hosts["niconico"]
video_ids = extract_ids(options.video)
database = Info(video_ids, mail=user, password=password).info
com = CommentStream(database, user, password, save_dir=options.destination)
com.start()
if __name__ == "__main__":
main()