Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[fix add]All patches released on 5ch and all new features nnn-revo2012 added/fixed #57

Open
wants to merge 39 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
bdbf3ed
built 20210516.36
nnn-revo2012 May 23, 2021
6cfc894
Add self-chasing playback function and others
nnn-revo2012 May 23, 2021
4906b20
Update changelog.txt and options.go
nnn-revo2012 May 23, 2021
13947cc
Add stop time-shift recording at specified time
nnn-revo2012 May 23, 2021
7aa45ed
Update changelog.txt and -h (help menu)
nnn-revo2012 May 23, 2021
2345ded
fix to save the name attribute of XML comments (used when performers …
nnn-revo2012 May 6, 2021
f076c74
Update changelog.txt
nnn-revo2012 May 23, 2021
9f4d7ac
Add -http-timeout option: http connect and read timeout (Default is: 5)
nnn-revo2012 May 23, 2021
4d9067a
Update changelog.txt and -h(help menu)
nnn-revo2012 May 23, 2021
b7a4fda
livedl で YouTube Live を扱えるようにするためのパッチ(リビジョン1)
nnn-revo2012 Dec 13, 2020
14241ce
Update changelog.txt
nnn-revo2012 Dec 13, 2020
6c5aaab
fix to be able to save some comments that failed to save
nnn-revo2012 May 6, 2021
596c383
Remove VPOS > 0 (Commit 03417972d920cce0af92221583fc42bc559ef469)
nnn-revo2012 Jan 1, 2021
eaf9b70
built 20210524.37
nnn-revo2012 May 23, 2021
0d29132
livedl で YouTubeLive リプレイのコメントが取れるよう直したよ
nnn-revo2012 Jan 27, 2021
aee9ca2
金額のフォーマットの要望ないみたいだからこっちで勝手に決めさせてもらったよ
nnn-revo2012 Jan 27, 2021
5059159
Update changelog.txt
nnn-revo2012 Jan 27, 2021
7a89f0b
livedl を YouTube Live の直近の仕様変更に対応
nnn-revo2012 Jan 31, 2021
272e717
livedl で-yt-no-streamlink=on -yt-no-youtube-dl=on が指定されたとき、YouTube Li…
nnn-revo2012 Jan 31, 2021
249e1a2
livedl で YouTube Live のアーカイブコメントの取得開始時刻を指定するオプション
nnn-revo2012 Jun 6, 2021
4b07ee8
built 20210607.38
nnn-revo2012 Jun 7, 2021
9bdb336
livedlのあるディレクトリ以外から実行する時カレントディレクトリにconf.dbが作成されるのを修正
nnn-revo2012 Oct 14, 2021
be005a3
built 20211017.39
nnn-revo2012 Oct 16, 2021
79e4cab
Replace live2.* -> live.*
nnn-revo2012 May 15, 2022
cb515c9
音声のみ録画対応、-http-timeout設定保存
nnn-revo2012 May 31, 2022
e327b7d
音声のみ録画対応
nnn-revo2012 Jun 19, 2022
3ea12f4
コメント出力時にvposを補正する機能追加
nnn-revo2012 Aug 30, 2022
d1bb03e
ニコ生およびYoutubeコメント関連の修正
nnn-revo2012 Aug 30, 2022
eb9eaaf
ニコ生およびYoutubeのコメント関連の修正
nnn-revo2012 Sep 1, 2022
9a3a0ce
ニコ生のコメント関連の修正
nnn-revo2012 Sep 4, 2022
716cdc4
built 20220905.40
nnn-revo2012 Sep 6, 2022
b628079
2段階認証機能(MFA)追加
nnn-revo2012 Oct 28, 2022
6048f4e
ブラウザのcookie読込機能追加
nnn-revo2012 Nov 3, 2022
eb9131c
built 20221108.41
nnn-revo2012 Nov 7, 2022
fe6421c
録画データーベース(sqlite3)のkvs/media/comment情報を表示するコマンド(dbinfo)追加
nnn-revo2012 Nov 13, 2022
f39a35e
Refactoring
nnn-revo2012 Nov 16, 2022
c901c81
Refactoring
nnn-revo2012 Nov 19, 2022
1c2912e
Refactoring
nnn-revo2012 Nov 22, 2022
46887ab
built 20221122.42
nnn-revo2012 Nov 22, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
173 changes: 173 additions & 0 deletions changelog.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,178 @@
更新履歴

20221122.42
・録画済みのデータベース(sqlite3)の各種情報を表示するコマンド(-dbinfo)追加
$ livedl -dbinfo -- 'database filename(.sqlite3) with fullpath'
- youtubeのデーターベースはcomment情報のみ表示
- データベース情報表示、データベースextractの際DBをreadonlyで開くように修正
- データベースファイルの存在チェックを追加
・Refactoring
- 旧配信(RTMP)、実験放送のロジックを削除
- 不要なオプションの削除(options.go)
-nico-hls-only
-nico-rtmp-only
-nico-rtmp-max-conn <num>
-nico-rtmp-index <num>[,<num>]
- 不要な変数(wsapi、broadcastId他)の削除、ソース整形(nico_hls.go、nico.go)
- ログインチェック及びページエラー処理を現状のニコ生に合わせて修正 getProps()
- -nico-loginを指定した場合-nico-login-only=onにしてconf.dbに保存するよう修正
・録画時強制予約機能(-nico-force-reservation)修正
- タイムシフト録画時に予約されていない場合自動的に予約する(プレミア)
- 予約しているタイムシフト放送を録画時に自動的にチケット使用する
- TS予約/チケット使用APIのendpointを変更
・httpbase内の全関数をcookiejar対応に変更
・httpbase.SetTimeout()追加

20221108.41
・直接ログインの2段階認証(MFA)対応
・上記に伴うlogin APIのendpoint、cookie取得方法の変更
・firefoxからのcookie取得機能追加
-nico-cookies firefox[:profile|cookiefile]
e.g.
- profile default-release のcookieを取得
./livedl -nico-cookies firefox
- profile NicoTaro のcookieを取得
./livedl -nico-cookies firefox:NicoTaro
- 直接cookiefileを指定
./livedl -nico-cookies firefox:'C:/Users/*******/AppData/Roaming/Mozilla/Firefox/Profiles/*****/cookies.sqlite'
※Mac/Linuxで `cookies from browser failed: firefox profiles not found`が 表示される場合は報告おねがいします
※直接cookiefile指定の場合は必ず'か"で囲ってください
※プロファイルにspaceを含む場合は'か"で囲ってください

20220905.40
・ニコ生のコメントのvposを補正
-nico-adjust-vpos=on
コメント書き出し時にvposの値を補正する
vposの値が-1000より小さい場合はコメント出力しない
-nico-adjust-vpos=off
コメント書き出し時にvposの値をそのまま出力する(デフォルト)
※ExtractChunks()もコメントvposを補正するように修正
※ニコ生の生放送を録画する際、再接続してもkvsテーブルは更新されません
・Youtubeのコメントにemojiを出力する/しない
-yt-emoji=on
コメントにemojiを表示する(デフォルト)
-yt-emoji=off
コメントにemojiを表示しない
・音声のみ録画対応
 -nico-limit-bw に audio_high または audio_only を指定してください
・-http-timeout の設定を保存するように修正
・live2.* -> live.* に修正
・その他主にコメント関連の修正
- livedl.exeとsqlite3ファイルが別のフォルダーにある場合、コメント出力時にxmlファイルに
-数字が付かなかったのを修正
- ニコ生の生放送の最初に取得するコメント数を1000から100に変更した(サーバー側の仕様による)

20211017.39
・livedlのあるディレクトリ以外から実行する時カレントディレクトリにconf.dbが作成されるのを修正
https://egg.5ch.net/test/read.cgi/software/1595715643/922
例: C:\bin\livedl\livedl.exe を D:\home\tmp をカレントディレクトリとして実行した場合、conf.dbは D:\home\tmp に作成されてしまう

仕様:conf.dbは実行するlivedlと同じディレクトリに作成する
ただし、オプション -no-chdir が指定された場合はカレントディレクトリにconf.dbを作成する
(livedl実行ファイルがユーザ書き込み権限のないディレクトリにある場合を想定)

20210607.38
・livedl で YouTube Live のアーカイブコメントの取得開始時刻を指定するオプション
https://egg.5ch.net/test/read.cgi/software/1595715643/789

使用例:
 livedl -yt-comment-start 3:21:06 https://~
特殊例 0:続きからコメント取得 1:最初からコメント取得

・livedl で-yt-no-streamlink=on -yt-no-youtube-dl=on が指定されたとき、YouTube Live のコメントを永久に取得し続けるパッチ
https://egg.5ch.net/test/read.cgi/software/1595715643/567

・livedl を YouTube Live の直近の仕様変更に対応
https://egg.5ch.net/test/read.cgi/software/1595715643/559

・金額のフォーマットの要望ないみたいだからこっちで勝手に決めさせてもらったよ
https://egg.5ch.net/test/read.cgi/software/1595715643/543

Youtube Liveのコメントにamount属性を追加

・livedl で YouTubeLive リプレイのコメントが取れるよう直したよ
https://egg.5ch.net/test/read.cgi/software/1595715643/523

Youtube Liveのコメントが途中で切れるのを修正
Youtube liveのアーカイブダウンロード中に`json decode error'となり中断するのを修正
(404エラーになる場合は少しwaitする)

20210524.37
・2021/01/01までに5chで公開されたniconico関係の全てのパッチを適用

・livedl で一部コメントが保存されないのを修正するパッチ
https://egg.5ch.net/test/read.cgi/software/1595715643/457
 vposが0またはdate_usecが0の場合その要素自体が存在しないのでエラーになりコメントが保存されないのを修正

・livedl で YouTube Live を扱えるようにするためのパッチ(リビジョン1)
patch は livedl.youtube-r1.patch のみ適用
https://egg.5ch.net/test/read.cgi/software/1595715643/402
https://egg.5ch.net/test/read.cgi/software/1595715643/406

・livedl で HTTP のタイムアウト時間を変更できるようにするパッチ
https://egg.5ch.net/test/read.cgi/software/1595715643/272

・XMLコメントのname属性(出演者が名前付きのコメントする時に使用)を保存するように修正
https://egg.5ch.net/test/read.cgi/software/1595715643/174
patch は livedl.comment-name-attribute-r1.patch.gz のみ適用
https://egg.5ch.net/test/read.cgi/software/1595715643/194

・指定時間でタイムシフト録画を停止するためのパッチ(+α)
https://egg.5ch.net/test/read.cgi/software/1595715643/163

オプション
 -nico-ts-start <num>
  タイムシフトの録画を指定した再生時間(秒)から開始する
 -nico-ts-stop <num>
  タイムシフトの録画を指定した再生時間(秒)で停止する
 上記2つは <分>:<秒> | <時>:<分>:<秒> の形式でも指定可能

 -nico-ts-start-min <num>
  タイムシフトの録画を指定した再生時間(分)から開始する
 -nico-ts-stop-min <num>
  タイムシフトの録画を指定した再生時間(分)で停止する
 上記2つは <時>:<分> の形式でも指定可能

・セルフ追っかけ再生機能その他
https://egg.5ch.net/test/read.cgi/software/1595715643/57
 例:http://127.0.0.1:12345/m3u8/2/1200/index.m3u8
  現在のシーケンス番号から1200セグメント(リアルタイムの場合30分)戻ったところを再生

・追加オプション
 -nico-conv-seqno-start <num>
  MP4への変換を指定したセグメント番号から開始する
 -nico-conv-seqno-end <num>
  MP4への変換を指定したセグメント番号で終了する
 -nico-conv-force-concat
  MP4への変換で画質変更または抜けがあっても分割しないように設定
 -nico-conv-force-concat=on
  (+) 上記を有効に設定
 -nico-conv-force-concat=off
  (+) 上記を無効に設定(デフォルト)

・ -d2h
  [実験的] 録画済みのdb(.sqlite3)を視聴するためのHLSサーバを立てる(-db-to-hls)
   開始シーケンス番号は(変換ではないが) -nico-conv-seqno-start で指定
    使用例:$ livedl lvXXXXXXXXX.sqlite3 -d2h -nico-hls-port 12345 -nico-conv-seqno-start 2780

20210516.36
・fix タイムシフト録画時に'getwaybackkey: waybackkey not found' と表示されコメントが保存されない(nnn-revo2012 PR#54)
 - コメントサーバー仕様変更に対応(threadId、waybackkey廃止など)(2020/07/27)
  5chで公開されたID:jM/9Q+5+0作成のpatchを適用
  https://egg.5ch.net/test/read.cgi/software/1570634489/932
 - livedl で waybackkey の取得方法を変更するパッチ
  https://egg.5ch.net/test/read.cgi/software/1595715643/424

・ニコニコ仕様変更を反映(#49 5chボランティア (sangwon-jung-work PR#51)
 - 放送情報取得時のwebsocketプロトコルが変わって録画できなくなったのを修正(2020/06/02)
  5chで公開されたID:jM/9Q+5+0作成のpatchを適用
  http://egg.5ch.net/test/read.cgi/software/1570634489/535
 - fix broadcastId not found error, add debug log

・20181215.35以降の修正を追加
・TS録画時にセグメント抜けが起こるのを修正 (PR#47)
・http -> httpsに修正 (PR#39)

20181215.35
・-nico-ts-start-minオプションの追加
・win32bit版のビルドを追加
Expand Down
4 changes: 2 additions & 2 deletions src/buildno/buildno.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@

package buildno

var BuildDate = "20181215"
var BuildNo = "35"
var BuildDate = "20221122"
var BuildNo = "42"
40 changes: 25 additions & 15 deletions src/httpbase/httpbase.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
"io/ioutil"
"net/http"
"net/url"
"net/http/cookiejar"
"os"
"strings"
"time"
Expand Down Expand Up @@ -136,8 +137,13 @@ func SetProxy(rawurl string) (err error) {
Client.Transport.(*http.Transport).Proxy = http.ProxyURL(u)
return
}
func SetTimeout(timeout int) (err error) {
err = nil
Client.Timeout = time.Duration(timeout) * time.Second
return
}

func httpBase(method, uri string, header map[string]string, body io.Reader) (resp *http.Response, err, neterr error) {
func httpBase(method, uri string, header map[string]string, jar *cookiejar.Jar, body io.Reader) (resp *http.Response, err, neterr error) {
req, err := http.NewRequest(method, uri, body)
if err != nil {
return
Expand All @@ -149,6 +155,10 @@ func httpBase(method, uri string, header map[string]string, body io.Reader) (res
req.Header.Set(k, v)
}

if (jar != nil) {
Client.Jar = jar
}

resp, neterr = Client.Do(req)
if neterr != nil {
if strings.Contains(neterr.Error(), "x509: certificate signed by unknown") {
Expand All @@ -159,17 +169,17 @@ func httpBase(method, uri string, header map[string]string, body io.Reader) (res
}
return
}
func Get(uri string, header map[string]string) (*http.Response, error, error) {
return httpBase("GET", uri, header, nil)
func Get(uri string, header map[string]string, jar *cookiejar.Jar) (*http.Response, error, error) {
return httpBase("GET", uri, header, jar, nil)
}
func PostForm(uri string, header map[string]string, val url.Values) (*http.Response, error, error) {
func PostForm(uri string, header map[string]string, jar *cookiejar.Jar, val url.Values) (*http.Response, error, error) {
if header == nil {
header = make(map[string]string)
}
header["Content-Type"] = "application/x-www-form-urlencoded; charset=utf-8"
return httpBase("POST", uri, header, strings.NewReader(val.Encode()))
return httpBase("POST", uri, header, jar, strings.NewReader(val.Encode()))
}
func reqJson(method, uri string, header map[string]string, data interface{}) (
func reqJson(method, uri string, header map[string]string, jar *cookiejar.Jar, data interface{}) (
*http.Response, error, error) {
encoded, err := json.Marshal(data)
if err != nil {
Expand All @@ -181,22 +191,22 @@ func reqJson(method, uri string, header map[string]string, data interface{}) (
}
header["Content-Type"] = "application/json"

return httpBase(method, uri, header, bytes.NewReader(encoded))
return httpBase(method, uri, header, jar, bytes.NewReader(encoded))
}
func PostJson(uri string, header map[string]string, data interface{}) (*http.Response, error, error) {
return reqJson("POST", uri, header, data)
func PostJson(uri string, header map[string]string, jar *cookiejar.Jar, data interface{}) (*http.Response, error, error) {
return reqJson("POST", uri, header, jar, data)
}
func PutJson(uri string, header map[string]string, data interface{}) (*http.Response, error, error) {
return reqJson("PUT", uri, header, data)
func PutJson(uri string, header map[string]string, jar *cookiejar.Jar, data interface{}) (*http.Response, error, error) {
return reqJson("PUT", uri, header, jar, data)
}
func PostData(uri string, header map[string]string, data io.Reader) (*http.Response, error, error) {
func PostData(uri string, header map[string]string, jar *cookiejar.Jar, data io.Reader) (*http.Response, error, error) {
if header == nil {
header = make(map[string]string)
}
return httpBase("POST", uri, header, data)
return httpBase("POST", uri, header, jar, data)
}
func GetBytes(uri string, header map[string]string) (code int, buff []byte, err, neterr error) {
resp, err, neterr := Get(uri, header)
func GetBytes(uri string, header map[string]string, jar *cookiejar.Jar) (code int, buff []byte, err, neterr error) {
resp, err, neterr := Get(uri, header, jar)
if err != nil {
return
}
Expand Down
62 changes: 53 additions & 9 deletions src/livedl.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,17 +45,36 @@ func main() {
baseDir = filepath.Dir(pa)
}

opt := options.ParseArgs()
// check option only -no-chdir
args := os.Args[1:]
nochdir := false
r := regexp.MustCompile(`\A(?i)--?no-?chdir\z`)
for _, s := range args {
if r.MatchString(s) {
nochdir = true
break
}
}

// chdir if not disabled
if !opt.NoChdir {
if !nochdir {
fmt.Printf("chdir: %s\n", baseDir)
if e := os.Chdir(baseDir); e != nil {
fmt.Println(e)
return
}
} else {
fmt.Printf("no chdir\n")
pwd, e := os.Getwd()
if e != nil {
fmt.Println(e)
return
}
fmt.Printf("read %s\n", filepath.FromSlash(pwd+"/conf.db"))
}

opt := options.ParseArgs()

// http
if opt.HttpRootCA != "" {
if err := httpbase.SetRootCA(opt.HttpRootCA); err != nil {
Expand Down Expand Up @@ -129,7 +148,7 @@ func main() {
}

case "YOUTUBE":
err := youtube.Record(opt.YoutubeId, opt.YtNoStreamlink, opt.YtNoYoutubeDl)
err := youtube.Record(opt.YoutubeId, opt.YtNoStreamlink, opt.YtNoYoutubeDl, opt.YtCommentStart)
if err != nil {
fmt.Println(err)
}
Expand All @@ -141,17 +160,17 @@ func main() {
os.Exit(1)
}
if hlsPlaylistEnd && opt.NicoAutoConvert {
done, nMp4s, err := zip2mp4.ConvertDB(dbname, opt.ConvExt, opt.NicoSkipHb)
done, nMp4s, skipped, err := zip2mp4.ConvertDB(dbname, opt.ConvExt, opt.NicoSkipHb, opt.NicoAdjustVpos, opt.NicoConvForceConcat, opt.NicoConvSeqnoStart, opt.NicoConvSeqnoEnd)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
if done {
if nMp4s == 1 {
if nMp4s == 1 && (! skipped) {
if 1 <= opt.NicoAutoDeleteDBMode {
os.Remove(dbname)
}
} else if 1 < nMp4s {
} else if 1 < nMp4s || (nMp4s == 1 && skipped) {
if 2 <= opt.NicoAutoDeleteDBMode {
os.Remove(dbname)
}
Expand All @@ -172,20 +191,45 @@ func main() {

case "DB2MP4":
if strings.HasSuffix(opt.DBFile, ".yt.sqlite3") {
zip2mp4.YtComment(opt.DBFile)
zip2mp4.YtComment(opt.DBFile, opt.YtEmoji)

} else if opt.ExtractChunks {
if _, err := zip2mp4.ExtractChunks(opt.DBFile, opt.NicoSkipHb); err != nil {
if _, err := zip2mp4.ExtractChunks(opt.DBFile, opt.NicoSkipHb, opt.NicoAdjustVpos, opt.NicoConvSeqnoStart, opt.NicoConvSeqnoEnd); err != nil {
fmt.Println(err)
os.Exit(1)
}

} else {
if _, _, err := zip2mp4.ConvertDB(opt.DBFile, opt.ConvExt, opt.NicoSkipHb); err != nil {
if _, _, _, err := zip2mp4.ConvertDB(opt.DBFile, opt.ConvExt, opt.NicoSkipHb, opt.NicoAdjustVpos, opt.NicoConvForceConcat, opt.NicoConvSeqnoStart, opt.NicoConvSeqnoEnd); err != nil {
fmt.Println(err)
os.Exit(1)
}
}

case "DB2HLS":
if opt.NicoHlsPort == 0 {
fmt.Println("HLS port not specified")
os.Exit(1)
}
if err := zip2mp4.ReplayDB(opt.DBFile, opt.NicoHlsPort, opt.NicoConvSeqnoStart); err != nil {
fmt.Println(err)
os.Exit(1)
}

case "DBINFO":
if strings.HasSuffix(opt.DBFile, ".yt.sqlite3") {
if _, err := youtube.ShowDbInfo(opt.DBFile); err != nil {
fmt.Println(err)
os.Exit(1)
}

} else {
if _, err := niconico.ShowDbInfo(opt.DBFile, opt.ConvExt); err != nil {
fmt.Println(err)
os.Exit(1)
}
}

}

return
Expand Down
Loading