Implement comment convert for Acfun

This commit is contained in:
Star Brilliant 2013-09-20 16:28:19 +08:00
parent 9101a1fe1d
commit 9773269ece

View File

@ -2,6 +2,7 @@
import argparse import argparse
import colorsys import colorsys
import json
import logging import logging
import math import math
import sys import sys
@ -82,7 +83,7 @@ def WriteComment(f, c, row, width, height, bottomReserved, fontsize, lifetime):
def ProbeCommentFormat(f): def ProbeCommentFormat(f):
f.seek(0) f.seek(0)
tmp = f.read(1) tmp = f.read(1)
if tmp == '{': if tmp == '[':
f.seek(0) f.seek(0)
return 'Acfun' return 'Acfun'
elif tmp == '<': elif tmp == '<':
@ -106,7 +107,6 @@ def ReadCommentsNiconico(f, fontsize):
'Output format: [(timeline, timestamp, no, comment, pos, color, size, height, width)]' 'Output format: [(timeline, timestamp, no, comment, pos, color, size, height, width)]'
dom = xml.dom.minidom.parse(f) dom = xml.dom.minidom.parse(f)
comment_element = dom.getElementsByTagName('chat') comment_element = dom.getElementsByTagName('chat')
i = 0
for comment in comment_element: for comment in comment_element:
try: try:
c = str(comment.childNodes[0].wholeText) c = str(comment.childNodes[0].wholeText)
@ -125,14 +125,31 @@ def ReadCommentsNiconico(f, fontsize):
elif mailstyle in NiconicoColorMap: elif mailstyle in NiconicoColorMap:
color = NiconicoColorMap[mailstyle] color = NiconicoColorMap[mailstyle]
yield (max(int(comment.getAttribute('vpos')), 0)*0.01, int(comment.getAttribute('date')), int(comment.getAttribute('no')), c, pos, color, size, (c.count('\n')+1)*size, CalculateLength(c)*size) yield (max(int(comment.getAttribute('vpos')), 0)*0.01, int(comment.getAttribute('date')), int(comment.getAttribute('no')), c, pos, color, size, (c.count('\n')+1)*size, CalculateLength(c)*size)
i += 1
except (AssertionError, AttributeError, IndexError, TypeError, ValueError): except (AssertionError, AttributeError, IndexError, TypeError, ValueError):
logging.warning('Invalid comment: %s' % comment.toxml()) logging.warning('Invalid comment: %s' % comment.toxml())
continue continue
def ReadCommentsAcfun(f, fontsize):
'Output format: [(timeline, timestamp, no, comment, pos, color, size, height, width)]'
comment_element = json.load(f)
i = 0
for comment in comment_element:
try:
p = str(comment['c']).split(',')
assert len(p) >= 6
assert p[2] in ('1', '2', '4', '5')
c = str(comment['m'])
size = int(p[3])*fontsize/25.0
yield (float(p[0]), int(p[5]), i, c, {'1': 0, '2': 0, '4': 2, '5': 1}[p[2]], int(p[1]), size, (c.count('\n')+1)*size, CalculateLength(c)*size)
i += 1
except (AssertionError, AttributeError, IndexError, TypeError, ValueError):
logging.warning('Invalid comment: %r' % comment)
continue
def ReadCommentsBilibili(f, fontsize): def ReadCommentsBilibili(f, fontsize):
'Output format: [(timeline, timestamp, no, comment, type, color, size, height, width)]' 'Output format: [(timeline, timestamp, no, comment, pos, color, size, height, width)]'
dom = xml.dom.minidom.parse(f) dom = xml.dom.minidom.parse(f)
comment_element = dom.getElementsByTagName('d') comment_element = dom.getElementsByTagName('d')
i = 0 i = 0
@ -210,7 +227,7 @@ if __name__ == '__main__':
comments = [] comments = []
for i in args.file: for i in args.file:
with open(i, 'r', encoding='utf-8') as f: with open(i, 'r', encoding='utf-8') as f:
CommentProcesser = {None: None, 'Niconico': ReadCommentsNiconico, 'Bilibili': ReadCommentsBilibili}[ProbeCommentFormat(f)] CommentProcesser = {None: None, 'Niconico': ReadCommentsNiconico, 'Acfun': ReadCommentsAcfun, 'Bilibili': ReadCommentsBilibili}[ProbeCommentFormat(f)]
if not CommentProcesser: if not CommentProcesser:
raise ValueError('Unknown comment file format: %s' % i) raise ValueError('Unknown comment file format: %s' % i)
for comment in CommentProcesser(f, args.fontsize): for comment in CommentProcesser(f, args.fontsize):