Skip to content
This repository was archived by the owner on Oct 5, 2023. It is now read-only.

Commit 7f82fb3

Browse files
authored
5ch DAT Support (#20)
* Update README.md * Mirakurun の導入しなくても動作するように設計変更 * 資格情報などが設定されず連携機能を提供できない場合にログを出力 * URL を Pages に変更 * Update README.md * PR 時に走る CI を修正 * ci7lus/elaina:latest に関する記述を追加 * ログレベルを変更可能にした * バッジの CI 名を修正 * 不要なライブラリを一時的に無効化 * イメージを JRE 17 に更新 * ReadOnlyContainer の update が走るときにログを出力 * Kotlin 1.4.30 に更新 * Update README.md * 不要な pluginManagement を削除 * イメージ名を修正 * mirakc-arib と連携して TS ファイルの EPG 情報を提供するエンドポイントを追加 * Update README * Update README * MIRAKURUN_HOST 未設定時にスタックするバグを修正 * 勢いリストを実装 * /channels を追加 * Mirakurun オブジェクトにプレフィックスを追加 * CommentInfo オブジェクトに service, channel フィールドを追加 * ログに表示されるクラス名を修正 * 各 Client の初期化を lazy で行うように変更 * 内部データの更新間隔を設定できるようにした * jk フィールドを削除 * LiveCommentProvider を再実装 * Twitter Streaming に失敗した際に REST API による検索にフォールバックするようにした * Penicillin のログレベルを INFO に変更 * ログにレートリミットを表示 * COPY するタイミングを修正 * コメント取得 Job が失敗した際にリトライするようにした * ストリーミング API を優先使用するオプションを追加 * Update README.md * ツイートのミリ秒フィールドを乱数にした * RT を除外 * ベースイメージに ffmpeg を追加 * 長すぎる Twitter のツイートログを修正 * Job が多重に生成されてしまうバグを修正 * Penicillin => 6.0.3 * ストリームAPIの問題解消のため Twitter API に Apache Client を使用するようにした * Twitter コメントのユーザ名にスクリーンネームを追加 * 通常ユーザで実行するように改善 * Twitter ストリーミングAPIでタイムアウトが発生する問題を修正 * REST API 経由での取得で何度も同じツイートが表示されるバグを修正 * ストリーミングAPiと検索APIで取得された結果を区別するようにした * チャンネル定義を yml からロードするように変更 * definitions に改名 * definitions.yml の内容を提供するエンドポイント /definitions/{channels,boards} を追加 * 5ch API クライアントを実装 * Update README.md * trivy-action を追加 * Docker Build を master/dev ブランチに制限 * スターチャンネルの実況板を追加 (仮) * 板 URL を HTTPS に変更 * 板 URL の指定方法を変更 * normalize を移動 * 潜在的に資格情報が未設定の CommentProvider が無限ループに陥るバグを修正 * LiveCommentProvider の命名規則を変更 * 5ch DAT 取得による CommentProvider を実装 * Update README.md * ハードウェアエンコーディングを有効にしたイメージを追加 * fix typo * 試験的に板キーワードを無効化 * スレッド数のリミットを引き上げ * 一部のキャンセルが伝搬しないバグを修正 * ニコニコ生放送ソースに番組名を含めるようにした * ニコニコ生放送のコメントが重複するバグを修正 * 依存関係を更新, Bintray 廃止に向け準備 * ffmpeg ビルドステージを削除しプレビルドのイメージを使用するようにした * Update README.md * Job がキャンセルできなくなっていたバグを修正 * エンコーディングエラーを修正 ref: https://qiita.com/csharpisthebest/items/2cd61661dbc42d81aa45 * twitterKeywords にハッシュタグではないキーワードも登録可能にした * sourceUrl フィールドを追加した * JSON API でデフォルト値が出力されるように修正 * Filter Stream のレートリミット時以外リトライをするように変更 * 5ch レス取得時に滝になるのを緩和するためランダムに遅延を挟むようにした * 不要な distinctBy を削除 * 5ch URL を修正 * スレッド一覧取得時のエンコーディングエラーを修正
1 parent fa5ed65 commit 7f82fb3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+3319
-1709
lines changed

.github/workflows/docker.yml

+33-12
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,14 @@ on:
66
- .gitignore
77
- LICENSE
88
- '**.md'
9-
branches-ignore:
10-
- 'releases/**'
9+
branches:
10+
- master
11+
- dev
1112

1213
release:
1314
types:
1415
- published
1516

16-
workflow_dispatch:
17-
1817
env:
1918
DOCKER_BASE_NAME: slashnephy/saya
2019

@@ -32,26 +31,48 @@ jobs:
3231
username: ${{ secrets.DOCKERHUB_USERNAME }}
3332
password: ${{ secrets.DOCKERHUB_TOKEN }}
3433

35-
- name: Build & Push (master)
34+
- name: Prepare image tag (master)
3635
if: github.event_name == 'push' && github.ref == 'refs/heads/master'
36+
run: echo "DOCKER_TAG=latest" >> $GITHUB_ENV
37+
- name: Prepare image tag (dev)
38+
if: github.event_name == 'push' && github.ref == 'refs/heads/dev'
39+
run: echo "DOCKER_TAG=dev" >> $GITHUB_ENV
40+
- name: Prepare image tag (Release)
41+
if: github.event_name == 'release'
42+
run: echo "DOCKER_TAG=${{ github.event.release.tag_name }}" >> $GITHUB_ENV
43+
44+
- name: Build & Push
3745
uses: docker/build-push-action@v2
3846
with:
3947
push: true
40-
tags: ${{ env.DOCKER_BASE_NAME }}:latest
48+
tags: ${{ env.DOCKER_BASE_NAME }}:${{ env.DOCKER_TAG }}
4149

42-
- name: Build & Push (dev)
43-
if: github.event_name == 'push' && github.ref == 'refs/heads/dev'
50+
- name: Build & Push (vaapi)
4451
uses: docker/build-push-action@v2
4552
with:
53+
file: ./vaapi.Dockerfile
4654
push: true
47-
tags: ${{ env.DOCKER_BASE_NAME }}:dev
55+
tags: ${{ env.DOCKER_BASE_NAME }}:${{ env.DOCKER_TAG }}-vaapi
4856

49-
- name: Build & Push (Release)
50-
if: github.event_name == 'release'
57+
- name: Build & Push (nvenc)
5158
uses: docker/build-push-action@v2
5259
with:
60+
file: ./nvenc.Dockerfile
5361
push: true
54-
tags: ${{ env.DOCKER_BASE_NAME }}:${{ github.event.release.tag_name }}
62+
tags: ${{ env.DOCKER_BASE_NAME }}:${{ env.DOCKER_TAG }}-nvenc
63+
64+
- name: Run Trivy vulnerability scanner
65+
uses: aquasecurity/trivy-action@master
66+
with:
67+
image-ref: ${{ env.DOCKER_BASE_NAME }}:${{ env.DOCKER_TAG }}
68+
format: 'template'
69+
template: '@/contrib/sarif.tpl'
70+
output: 'trivy-results.sarif'
71+
72+
- name: Upload Trivy scan results to GitHub Security tab
73+
uses: github/codeql-action/upload-sarif@v1
74+
with:
75+
sarif_file: 'trivy-results.sarif'
5576

5677
# 2FA を無効化する必要がある
5778
# https://github.com/peter-evans/dockerhub-description#action-inputs

Dockerfile

+24-7
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,46 @@
11
# Gradle Cache Dependencies Stage
2-
# This stage caches plugin/project dependencies from *.gradle.kts and gradle.properties.
3-
# Gradle image erases GRADLE_USER_HOME each layer. So we need COPY GRADLE_USER_HOME.
4-
# Refer https://stackoverflow.com/a/59022743
2+
## This stage caches plugin/project dependencies from *.gradle.kts and gradle.properties.
3+
## Gradle image erases GRADLE_USER_HOME each layer. So we need COPY GRADLE_USER_HOME.
4+
## Refer https://stackoverflow.com/a/59022743
55
FROM gradle:jdk8 AS cache
66
WORKDIR /app
77
ENV GRADLE_USER_HOME /app/gradle
88
COPY *.gradle.kts gradle.properties /app/
9-
# Full build if there are any deps changes
9+
## Full build if there are any deps changes
1010
RUN gradle shadowJar --parallel --no-daemon --quiet
1111

1212
# Gradle Build Stage
13-
# This stage builds and generates fat jar.
13+
## This stage builds and generates fat jar.
1414
FROM gradle:jdk8 AS build
1515
WORKDIR /app
1616
COPY --from=cache /app/gradle /home/gradle/.gradle
1717
COPY *.gradle.kts gradle.properties /app/
1818
COPY src/main/ /app/src/main/
19-
# Stop printing Welcome
19+
## Stop printing Welcome
2020
RUN gradle -version > /dev/null \
2121
&& gradle shadowJar --parallel --no-daemon
2222

23+
# For mirakc-arib
24+
FROM mirakc/mirakc:alpine AS mirakc-image
25+
2326
# Final Stage
24-
FROM openjdk:8-jre-alpine
27+
FROM slashnephy/dtv-ffmpeg-build:alpine
28+
29+
## Add user
30+
RUN addgroup -S saya \
31+
&& adduser -S saya -G saya
32+
33+
## Install JRE 11
34+
RUN apk add --update --no-cache openjdk11-jre-headless
35+
36+
## Copy mirakc-arib binary
37+
COPY --from=mirakc-image /usr/local/bin/mirakc-arib /usr/local/bin/
38+
## Install gcc runtime
39+
RUN apk add --update --no-cache libgcc libstdc++
40+
2541
COPY --from=build /app/build/libs/saya-all.jar /app/saya.jar
2642
COPY docs/ /app/docs/
2743

44+
USER saya
2845
WORKDIR /app
2946
ENTRYPOINT ["java", "-jar", "/app/saya.jar"]

README.md

+81-12
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
# saya: Japanese DTV backend service with powerful features
22

3-
[![Kotlin](https://img.shields.io/badge/Kotlin-1.4.21-blue)](https://kotlinlang.org)
3+
[![Kotlin](https://img.shields.io/badge/Kotlin-1.4.30-blue)](https://kotlinlang.org)
44
[![GitHub release (latest by date)](https://img.shields.io/github/v/release/SlashNephy/saya)](https://github.com/SlashNephy/saya/releases)
55
[![GitHub Workflow Status](https://img.shields.io/github/workflow/status/SlashNephy/saya/Docker)](https://hub.docker.com/r/slashnephy/saya)
6-
[![Docker Image Size (latest by date)](https://img.shields.io/docker/image-size/slashnephy/saya)](https://hub.docker.com/r/slashnephy/saya)
6+
[![Docker Image Size (tag)](https://img.shields.io/docker/image-size/slashnephy/saya/latest)](https://hub.docker.com/r/slashnephy/saya)
77
[![Docker Pulls](https://img.shields.io/docker/pulls/slashnephy/saya)](https://hub.docker.com/r/slashnephy/saya)
88
[![license](https://img.shields.io/github/license/SlashNephy/saya)](https://github.com/SlashNephy/saya/blob/master/LICENSE)
99
[![issues](https://img.shields.io/github/issues/SlashNephy/saya)](https://github.com/SlashNephy/saya/issues)
@@ -27,8 +27,16 @@ saya is still in heavy development.
2727
次の機能を現在実装しています。
2828

2929
- ライブ再生 / 録画番組再生での実況コメントの配信
30-
- ライブ再生時には [ニコニコ実況](https://jk.nicovideo.jp/) の公式放送およびコミュニティ放送 / Twitter ハッシュタグから取得します。
31-
- 録画番組再生時には [ニコニコ実況 過去ログ API](https://jikkyo.tsukumijima.net/) / 5ch 過去ログから取得します。
30+
- ライブ再生時には次のソースから取得します。
31+
+ [ニコニコ実況](https://jk.nicovideo.jp/) の公式放送およびコミュニティ放送
32+
+ Twitter ハッシュタグ (Filter ストリーム or 検索 API)
33+
+ 5ch DAT
34+
35+
- 録画番組再生時には次のソースから取得します。
36+
+ [ニコニコ実況 過去ログ API](https://jikkyo.tsukumijima.net/)
37+
+ 5ch 過去ログ
38+
39+
- TS ファイルから EPG 情報を抽出
3240
- and more, coming soon...
3341

3442
その他実装予定の機能などは [Roadmap](https://github.com/SlashNephy/saya/projects/1) をご覧ください。
@@ -42,18 +50,22 @@ saya is still in heavy development.
4250
- [ci7lus/elaina](https://github.com/ci7lus/elaina)
4351
- EPGStation を介した番組プレイヤーです。saya の API をフロントエンドで利用しています。
4452

45-
# Docker
53+
# Get Started
4654

47-
環境構築が容易なので Docker で導入することをおすすめします。
55+
## Docker
4856

49-
現在のベースイメージは `alpine` です。いくつかタグを用意しています
57+
環境構築が容易なので Docker で導入することをおすすめします
5058

51-
- `:latest`
59+
- `slashnephy/saya:latest`
5260
master ブランチへのプッシュの際にビルドされます。安定しています。
53-
- `:dev`
61+
- `slashnephy/saya:dev`
5462
dev ブランチへのプッシュの際にビルドされます。開発版のため, 不安定である可能性があります。
55-
- `:v<tag>`
63+
- `slashnephy/saya:<version>`
5664
GitHub 上のリリースに対応します。
65+
- `slashnephy/saya:***-vaapi`
66+
VAAPI によるハードウェアエンコーディングを有効化した ffmpeg を同梱しています。
67+
- `slashnephy/saya:***-nvenc`
68+
NVEnc によるハードウェアエンコーディングを有効化した ffmpeg を同梱しています。
5769

5870
`docker-compose.yml`
5971

@@ -65,6 +77,8 @@ services:
6577
container_name: saya
6678
image: slashnephy/saya:latest
6779
restart: always
80+
# nvenc イメージを使用する場合に必要
81+
# runtime: nvidia
6882
ports:
6983
- 1017:1017/tcp # いれいな
7084
# 環境変数で各種設定を行います
@@ -80,17 +94,46 @@ services:
8094
# ログレベル ("INFO")
8195
# 利用可能な値: ALL, TRACE, DEBUG, INFO, WARN, ERROR, OFF
8296
SAYA_LOG: DEBUG
97+
# 内部データ 更新間隔 [分] (15)
98+
SAYA_UPDATE_INTERVAL_MINS: 15
8399
# Mirakurun のホスト, ポート番号 ("mirakurun", 40772)
84100
MIRAKURUN_HOST: mirakurun
85101
MIRAKURUN_PORT: 40772
86102
# Annict のアクセストークン (null)
87103
# 以下, 未設定でも動作します
88104
ANNICT_TOKEN: xxx
89-
# Twitter の資格情報 (null, ...)
105+
# Twitter の資格情報 (null, null, null, null)
90106
TWITTER_CK: xxx
91107
TWITTER_CS: xxx
92108
TWITTER_AT: xxx
93109
TWITTER_ATS: xxx
110+
# Twitter からツイートを取得する際にストリーミング API を使用するか (false)
111+
# 接続に失敗した場合には通常の検索 API にフォールバックします。
112+
# 試験的な機能のため, 一部の環境で動作しない可能性があります。
113+
TWITTER_PREFER_STREAMING_API: 'true'
114+
# 5ch API への接続情報 (null, null, null, null, null)
115+
GOCHAN_HM_KEY: xxx
116+
GOCHAN_APP_KEY: xxx
117+
GOCHAN_AUTH_UA: xxx
118+
GOCHAN_AUTH_X_2CH_UA: xxx
119+
GOCHAN_UA: xxx
120+
# モリタポアカウントの資格情報 (null, null)
121+
MORITAPO_EMAIL: xxx
122+
MORITAPO_PASSWORD: xxx
123+
# /files エンドポイントで TS ファイルを検索するパス (null)
124+
# 別途 volume マウントが必要です
125+
MOUNT_POINT: /mnt
126+
# mirakc-arib へのパス ("/usr/local/bin/mirakc-arib")
127+
# Docker イメージを使用している場合は指定不要です
128+
MIRAKC_ARIB_PATH: /path/to/mirakc-arib
129+
# ffmpeg へのパス ("/usr/local/bin/ffmpeg")
130+
# Docker イメージを使用している場合は指定不要です
131+
FFMPEG_PATH: /path/to/ffmpeg
132+
volumes:
133+
# 録画 TS ファイルの置き場所
134+
- /mnt:/mnt:ro
135+
# definitions.yml を書き換えて使用したい場合
136+
# - ./definitions.yml:/app/docs/definitions.yml:ro
94137

95138
elaina:
96139
container_name: elaina
@@ -121,16 +164,42 @@ docker-compose down
121164

122165
up すると `http://localhost:1017/` に saya が, `http://localhost:1234/` に elaina が起動しているはずです。
123166

167+
## 直接実行
168+
169+
リリースから Jar を取ってきて実行するか, `./gradlew run` で実行できます。
170+
171+
設定値の変更は現在, 環境変数経由でしか行なえません。ご了承ください。
172+
173+
```console
174+
SAYA_LOG=DEBUG java -jar /path/to/saya.jar
175+
```
176+
124177
# Endpoints
125178

126-
TODO...
179+
saya が提供する API は [endpoints.md](https://github.com/SlashNephy/saya/blob/master/docs/endpoints.md) に一覧があります。
180+
181+
# Contribution
182+
183+
開発には IntelliJ IDEA をおすすめします。
184+
185+
不安定なプロジェクトにつき, 互換性のない変更や方針変更が発生する可能性があります。ご了承ください。
186+
187+
```console
188+
# ビルド
189+
./gradlew build
190+
191+
# 実行
192+
./gradlew run
193+
```
127194

128195
# Acknowledgments
129196

130197
saya および [ci7lus/elaina](https://github.com/ci7lus/elaina) は次のプロジェクトを利用 / 参考にして実装しています。
131198

132199
- [tsukumijima/TVRemotePlus](https://github.com/tsukumijima/TVRemotePlus)
133200
- [tsukumijima/jikkyo-api](https://github.com/tsukumijima/jikkyo-api)
201+
- [asannou/namami](https://github.com/asannou/namami)
202+
- [silane/TVTComment](https://github.com/silane/TVTComment)
134203

135204
DTV 実況コミュニティの皆さまに感謝します。
136205

0 commit comments

Comments
 (0)