Giter VIP home page Giter VIP logo

broadcast's Introduction

NUCOSen / Broadcast

お知らせ

2024年1月18日時点では、このソフトウェアは正常に作動しません。

このソフトウェアを本番環境で使用しないでください。 ライセンスに基づき、このソフトウェアの動作は保証しておりません。 開発者によるホットフィックス(臨時のバグ修正対応)を実施中です。

「同人音楽のトレンドをほぼ最速でキャッチできる生放送」

NUCOSenで使用されている、自動放送システムのソースコードです。

Codacy Badge Github license GitHub Pipenv locked Python version GitHub Release Date Website

Tags

niconico nicolive nico-nico-douga

Advantages

  • 自動枠取り
  • REST APIを備えたデータベースでリクエスト受付ができる
  • 枠の終了時間を確認し、音楽が途切れそうならば次枠に繰り越す

Installation

Pipを用いてリリースのtar.gzファイルを展開してください。

Python3.10以降必須

Minimal Example

nucosenコマンドで起動します

Contributors

LICENSE

See also LICENSE file.

Copyright 2022 NUCOSen運営会議

AGPLv3

broadcast's People

Contributors

dependabot[bot] avatar komatti365 avatar sitting-cat avatar

Stargazers

 avatar  avatar

Watchers

 avatar

broadcast's Issues

スナップショット検索APIが止まるとランダム放送ができない

デバッグ時でも2枠確保を強制してくる

@retry(NotExpectedResult, delay=1, backoff=2, logger=getLogger(__name__))
def sGetLives(session: Session) -> Tuple[str, str]:
result = getLives(session)
if result[0] is None or result[1] is None:
raise NotExpectedResult(
"取得した枠情報が期待される値ではありませんでした。{0} {1}".format(result[0], result[1]))
else:
return (str(result[0]), str(result[1]))

デバッグモードを実装する必要がありそうです

エラー発出の基準を統一する

WARNING:想定外のことが起こった、もしくは問題が近く起こりそうである
ERROR:より重大な問題により、ソフトウェアがある機能の実行を諦めた
CRITICAL:プログラム全体が実行を続けることができない、重大なエラー

エラー発生時にレスポンスコンテンツをロギングするようにする

@retry(NetworkErrors, delay=1, backoff=2, logger=getLogger(__name__))
def takeReservation(liveDict: Dict[Any, Any], startTime: datetime, duration: int, session: Session) -> Response:
# TODO - This function SHOULD returns JSON decodable response ONLY.
url = "https://live2.nicovideo.jp/unama/api/v2/programs"
header = {
"User-Agent": UserAgent,
"X-niconico-session": session.getSessionString()
}
payload = liveDict
payload["reservationBeginTime"] = startTime.strftime("%Y-%m-%dT%H:%M:%SZ")
payload["durationMinutes"] = duration
response = post(url=url, headers=header, json=payload)
if response.status_code == 401:
session.login()
raise ReLoggedIn("ログインセッション更新。連続してこのエラーが出た場合は異常です")
return response

ほかにも必要箇所があるかもしれませんがこのIssueではこの箇所のみ扱います

リトライを繰り返すとタグがなくなる

CRITICAL @ nucosen.nucosen (run)
例外がキャッチされませんでした
Traceback (most recent call last):
File "/home/manager/.local/lib/python3.10/site-packages/nucosen/nucosen.py", line 107, in run
selection = personality.randomSelection(
File "/home/manager/.local/lib/python3.10/site-packages/decorator.py", line 232, in fun
return caller(func, *(extras + args), **kw)
File "/home/manager/.local/lib/python3.10/site-packages/retry/api.py", line 73, in retry_decorator
return __retry_internal(partial(f, *args, **kwargs), exceptions, tries, delay, max_delay, backoff, jitter,
File "/home/manager/.local/lib/python3.10/site-packages/retry/api.py", line 33, in __retry_internal
return f()
File "/home/manager/.local/lib/python3.10/site-packages/nucosen/personality.py", line 40, in randomSelection
"q": tags.pop(),
IndexError: pop from empty list

メンテ前後の予約がうまくいかない

WARNING @ nucosen.live (reserveLiveToGetOverMaintenance)
メンテ前の枠が取得できなかったかもしれません。

ERROR @ nucosen.live (getStartTimeOfNextLive)
次枠の適切な開始時刻が見つかりませんでした

認証は正しいはずなのに401が返される

@retry(NetworkErrors, delay=1, backoff=2, logger=getLogger(__name__))
def showMessage(liveId: str, msg: str, session: Session, *, permanent: bool = False):
url = "http://live2.nicovideo.jp/watch/{0}/operator_comment".format(liveId)
payload = {"text": msg, "isPermanent": permanent}
header = {"User-Agent": UserAgent}
resp = put(url, json=payload, headers=header, cookies=session.cookie)
if resp.status_code in (403, 401):
session.login()
raise ReLoggedIn("ログインセッション更新。連続してこのエラーが出た場合は異常です")
resp.raise_for_status()

API側のバグである可能性も含めて検討する必要があります。

通信エラー発生

WARNING @ nucosen.db.getAndResetRequests (__retry_internal)
HTTPSConnectionPool(host='nucosen-8fe7.restdb.io', port=443): Max retries exceeded with url: /rest/request01 (Caused by ConnectTimeoutError(<urllib3.connection.HTTPSConnection object at 0x7ff0fd941a50>, 'Connection to nucosen-8fe7.restdb.io timed out. (connect timeout=None)')), retrying in 1 seconds...

例外エラー発生報告:引用不可能な動画を引用しようとした

logger.critical(
"キューに引用不能な動画が含まれていました:{0}".format(nextVideoId))
raise Exception(
"引用不能な動画を引用しようとした:{0} at {1}".format(nextVideoId, currentLiveId))

エラーメッセージ

CRITICAL @ nucosen.nucosen (run)
キューに引用不能な動画が含まれていました:sm39897958

CRITICAL @ nucosen.nucosen (run)
例外がキャッチされませんでした
Traceback (most recent call last):
File "/home/manager/.local/lib/python3.10/site-packages/nucosen/nucosen.py", line 117, in run
raise Exception(
Exception: 引用不能な動画を引用しようとした:sm39897958 at lv337350171

エラー発生記録

WARNING @ nucosen.personality.randomSelection (__retry_internal)
503 Server Error: Service Temporarily Unavailable for url: https://api.search.nicovideo.jp/api/v2/snapshot/video/contents/search?q=%E6%9D%B1%E6%96%B9%E3%82%92%E6%AD%8C%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F&targets=tagsExact&fields=contentId&filters%5BlengthSeconds%5D%5Bgte%5D=45&filters%5BlengthSeconds%5D%5Blte%5D=600&_sort=-lastCommentTime&_context=NUCOSen+backend&_limit=10&_offset=35, retrying in 16 seconds...
CRITICAL @ nucosen.nucosen (run)
例外がキャッチされませんでした
Traceback (most recent call last):
File "/home/manager/.local/lib/python3.10/site-packages/nucosen/nucosen.py", line 126, in run
selection = personality.randomSelection(
File "/home/manager/.local/lib/python3.10/site-packages/decorator.py", line 232, in fun
return caller(func, *(extras + args), **kw)
File "/home/manager/.local/lib/python3.10/site-packages/retry/api.py", line 73, in retry_decorator
return __retry_internal(partial(f, *args, **kwargs), exceptions, tries, delay, max_delay, backoff, jitter,
File "/home/manager/.local/lib/python3.10/site-packages/retry/api.py", line 33, in __retry_internal
return f()
File "/home/manager/.local/lib/python3.10/site-packages/nucosen/personality.py", line 59, in randomSelection
"q": tags.pop(),
IndexError: pop from empty list

現枠次枠どちらも見つからない状態で、偶然にも現枠のほうの時間で予約が取れてしまった場合に次枠がなくエラーになる

エラーメッセージ

— 今日 04:00
WARNING @ nucosen.nucosen (run)
オンエア枠も次枠も見つかりませんでした。

— 今日 10:00
WARNING @ nucosen.live.sGetLives (__retry_internal)
取得した枠情報が期待される値ではありませんでした。lv337453413 None, retrying in 1 seconds...
WARNING @ nucosen.live.sGetLives (__retry_internal)
取得した枠情報が期待される値ではありませんでした。lv337453413 None, retrying in 2 seconds...
WARNING @ nucosen.live.sGetLives (__retry_internal)
取得した枠情報が期待される値ではありませんでした。lv337453413 None, retrying in 4 seconds...
WARNING @ nucosen.live.sGetLives (__retry_internal)
取得した枠情報が期待される値ではありませんでした。lv337453413 None, retrying in 8 seconds...

存在しない放送のinfoを取得しようとすることがある

CRITICAL @ nucosen.nucosen (run)
例外がキャッチされませんでした
Traceback (most recent call last):
File "/home/manager/.local/lib/python3.10/site-packages/nucosen/nucosen.py", line 131, in run
currentLiveEnd = live.getEndTime(currentLiveId, session)
File "/home/manager/.local/lib/python3.10/site-packages/nucosen/live.py", line 237, in getEndTime
response.raise_for_status()
File "/home/manager/.local/lib/python3.10/site-packages/requests/models.py", line 960, in raise_for_status
raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 404 Client Error: Not Found for url: https://live2.nicovideo.jp/unama/watch/lv337806192/programinfo

その他、軽微な修正

バージョン番号はv4.0.0になる見込みです。quote.getVideoInfoに互換性がありません。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.