Source code for pynga.forum

from pynga.default_config import FORUM_PAGE_SLOW_QUERY_LIMIT, HOST
from pynga.thread import Thread


[docs]class Forum(object): """NGA 版面基础类. Parameters -------- fid: int 版面 FID. session: :class:`Session <pynga.session.Session>` 获取数据所使用的 session. page_limit: int 最大页面数量. 默认: 20. Attributes -------- page_limit: int 最大页面数量. """ def __init__(self, fid, session=None, page_limit=20): self.fid = fid self.page_limit = page_limit if page_limit > FORUM_PAGE_SLOW_QUERY_LIMIT: raise NotImplementedError('Slow query is now supported yet.') if session is not None: self.session = session else: raise ValueError('session should be specified.') def __repr__(self): return f'<pynga.forum.Forum, fid={self.fid}>' @property def _raw(self): """原始 JSON 数据.""" from math import ceil raw_all = {} page = 1 while True: raw = self.session.get_json( f'{HOST}/thread.php?fid={self.fid}&lite=js&page={page}&order_by=postdatedesc&nounion=1' ) raw_all[page] = raw n_pages = ceil(raw['data']['__ROWS'] / raw['data']['__T__ROWS_PAGE']) if page < n_pages and page < self.page_limit: page += 1 else: break return raw_all @property def threads(self): """获取当前版面的帖子, 按照发帖时间降序排列. Returns -------- OrderedDict(tid, :class:`Thread <pynga.thread.Thread>`) 当前版面的帖子. 最多不超过 :attr:`page_limit <pynga.forum.Forum.page_limit>`. """ from collections import OrderedDict threads = OrderedDict([]) for page, raw in self._raw.items(): # process threads for _, thread_raw in raw['data']['__T'].items(): if 'quote_from' in thread_raw and thread_raw['quote_from']: threads[thread_raw['quote_from']] = Thread(thread_raw['quote_from'], session=self.session) else: threads[thread_raw['tid']] = Thread(thread_raw['tid'], session=self.session) return threads
[docs]class SubForum(object): """NGA 合集基础类. Parameters -------- fid: int 版面 FID. session: :class:`Session <pynga.session.Session>` 获取数据所使用的 session. page_limit: int 最大页面数量. 默认: 20. Attributes -------- page_limit: int 最大页面数量. """ def __init__(self, stid, session=None, page_limit=20): self.stid = stid self.page_limit = page_limit if page_limit > FORUM_PAGE_SLOW_QUERY_LIMIT: raise NotImplementedError('Slow query is now supported yet.') if session is not None: self.session = session else: raise ValueError('session should be specified.') def __repr__(self): return f'<pynga.forum.SubForum, stid={self.stid}>' @property def _raw(self): """原始 JSON 数据.""" from math import ceil raw_all = {} page = 1 while True: raw = self.session.get_json( f'{HOST}/thread.php?stid={self.stid}&lite=js&page={page}&order_by=postdatedesc&nounion=1' ) raw_all[page] = raw n_pages = ceil(raw['data']['__ROWS'] / raw['data']['__T__ROWS_PAGE']) if page < n_pages and page < self.page_limit: page += 1 else: break return raw_all @property def threads(self): """获取当前合集的帖子, 按照发帖时间降序排列. Returns -------- OrderedDict(tid, :class:`Thread <pynga.thread.Thread>`) 当前版面的帖子. 最多不超过 :attr:`page_limit <pynga.forum.SubForum.page_limit>`. """ from collections import OrderedDict threads = OrderedDict([]) for page, raw in self._raw.items(): # process threads for _, thread_raw in raw['data']['__T'].items(): threads[thread_raw['tid']] = Thread(thread_raw['tid'], session=self.session) return threads