FirefoxのProfileをRefresh後元通りに作り直したい

FirefoxのProfileをRefreshして元通りに作り直すべくまずは情報収集。

Addonの移行

Addon本体
Profiles\Profile名\extensions
Addon設定
Profiles\Profile名\storage\default\moz-extension~~~

まずAddon本体のxpiを新しいProfileに放り込んでやればAddonが権限無許可の無効状態ではあるが認識する。あとはポチポチ有効化してやればいい。

最大の問題はAddonの設定を何とか移せないかという事。まずAddon設定の
moz-extension~~~というのを移せばいいのかと言うと全くそんな事はない。まず設定ファイルらしきものはplain textではないが中身を見るとどうもAddonのUUIDが見える。つまり移行元と移行先のUUIDが違うので認識しないんだろう。Addonの認証状態ごと移してUUIDを一緒にしてしまえばいいんだろうがRefreshしたいので無理。設定は難しそうなので諦めた。

about:profilesに「プロファイルを別のプロセスで起動」というのがあるのでこれで移行元と移行先のWindowを並べて設定をポチポチ地道に揃えていくしかないが、最近の大型Addonは設定のエクスポートインポートが大体あるので割となんとかなる。

ブラウザ本体の設定

本体はprefs.jsだがこれを移してしまうとこんな事始めた意味がなくなるのでAddonの設定同様地道にポチポチする。

ツールバーのカスタマイズ

prefs.jsのbrowser.uiCustomization.stateというのがそれ。

Bookmark及び各種Password

Refreshしてるだけなのでこれは最初から保持している。

cookies.sqliteを移してやればいい。

LocalStorage

設定項目名でいうとサイトデータになる。中々の量があるはずなので重要ならstorage\default下にドメインごとに分かれているので必要なものを移せばいい。

MIME TYPE

設定/一般/プログラム。MIMEタイプごとの挙動。handlers.jsonを移してやればいい。

Google Calendar APIをPythonで叩く

昔作ったGoogle Calendar Event登録ScriptをPythonで全面的に書き換えるべく作業を始めようと思ったはいいがもう何年も前なので完全にやり方を忘れた。またどうせ忘れるのでここにメモしておこうと思う。

大まかな流れは以下のようになる。

  1. プロジェクトの作成
  2. 認証情報を作成
  3. 認証情報を使ってAPIを叩く

認証情報を作成

まずGoogle Cloud Platformにアクセスして認証情報の項目を開く。ちなみにこのGoogle Cloud Platformという名前も昔はGoogle Developer Consoleとかだったのでまた必要になった頃には変わってる可能性もある。さてプロジェクトの作成は特に問題ないだろう。次に認証情報を作成というボタンを押したら以下の3種類が出てくる。昔はOAuth一択だった気がするが現状では3種類あるようだ。認証の概要に詳細な説明があるが難しい事はさておいて要するにAPIを叩くにあたってユーザー認証が必要になるがそれをどうするかの違い。

API キー
一般公開データにユーザー認証なしでアクセスする。逆に言うとユーザー認証が必要なデータにはアクセス出来ない。
OAuth2.0クライアント
何処のサービスでもよく見る奴。トークンでユーザー認証する。何かするたびにこのトークンが必要。しかしこのOAuth同意画面の通過がいつの間にか非常に面倒臭くなった。個人でちょっと使うようなレベルの面倒さじゃない。どうも個人データを扱うAPIを有効にしてるとGoogle側の審査を求められるようになったらしい。公開ステータスをテストのままにしとけば一応使えはするが、ユーザーの種類が外部でかつ公開ステータスをテストのままにしておくとReflesh Tokenの有効期限が7日となる。ちょっと放っておくとすぐ期限切れになって面倒臭い。ユーザーの種類を内部に変えればいいんだろうがGoogle Workspaceユーザーしか出来ない。じゃあ対処法はと言うと一旦token.jsonを削除して取得し直ししかないようだ。
サービスアカウント
API専用のGoogleアカウントを作ってアクセスする。こいつはパスワードがないので通常のアカウントとしては使えない。アクセス先に認証ユーザー登録してもらう事が必要。今回の場合カレンダーごとに共有アカウントとしてサービスアカウントを予め手動で追加してやらねばならない。

OAuth2.0とサービスアカウントを併用する場合はcalendarのアクセス権限にくれぐれも注意する事。サービスアカウント権限で作成したcalendarはOAuth2権限からは見えないしその逆もある。考えてみれば当然の話。要するにサービスアカウントとはAccess Control Ruleで明示的に許可された事しか出来ない単なる一般ユーザー。Settingsの取得はおろかCalendarListの取得すらできない。

準備としてまず

OAuth2.0

使う言語はPythonなのでPython Quickstartを参考にする。サンプル読めば大体分かる。

if os.path.exists("token.json"):
	creds = Credentials.from_authorized_user_file("token.json", SCOPES)
if not creds or not creds.valid:
	if creds and creds.expired and creds.refresh_token:
		creds.refresh(Request())
	else:
		flow = InstalledAppFlow.from_client_secrets_file("credentials.json", SCOPES)
		creds = flow.run_local_server(port=0)
	with open("token.json", "w") as token:
		token.write(creds.to_json())

まあ要するに有効なrefresh_tokenを持っているかどうかで分岐させている。

サービスアカウント

こいつがquickstartに全く載ってないのであちこち探してなにやらこんな感じでいいらしいことを知る。

creds = Credentials.from_service_account_file("credentials.json")
creds = creds.with_scopes(["https://www.googleapis.com/auth/calendar"])

シンプルだし楽でいいね。ちなみにこれだとcreds.validがFalseを返す。どうもtokenを持ってないかららしい。OAuth2.0同様

creds.refresh(Request())

とやってやればいいだけなんだけど別にtokenがなくてもvalidがFalseでも立派に使える。

APIを叩く

サンプルを読むとまずservice とやらを作ってる。

service = build("calendar", "v3", credentials=creds)

これが何をしてるのかまず分からん。仕方ないのでgoogleapiclientのcodeを読んでみると細かい途中経過はさておいてこいつはResourceオブジェクトとやらを返すらしい。

now = datetime.datetime.utcnow().isoformat() + "Z"
print("Getting the upcoming 10 events")
events_result = service.events().list(calendarId="primary", timeMin=now, maxResults=10, singleEvents=True, orderBy="startTime").execute()

events()ってなんなんと1時間ほど悩んでgoogleapiclientのcodeを検索しまくったが分かってしまえばなんて事ない。Google CalendarAPIを叩いてるだけだった。という事は上記のResourceオブジェクトとやらはAPIを叩くインターフェイスであって中身を理解する必要は特になさげ。
ちなみにこれはquickstartに載ってる物なのでOAuth2.0の物だがサービスアカウントでやる場合calendarIdはprimaryではなくちゃんと指定する事。

サービスアカウントで出来ない事

  • 当然だがaclへのサービスアカウント追加はサービスアカウントでは出来ない。OAuth2が必要。
  • calendarListの取得はOAuth2じゃないと出来ないらしい。実行自体は出来るがちゃんとcalendarのaclにサービスアカウントを追加してるのにitemsが空で返ってくる。

結局サービスアカウントというのは要するに単なる一般ユーザーアカウントの域を出ないんだろう。

Google Calendar API

  • event作成を一度に大量にやるとたまに404が返ってくる事がある。アクセス拒否という訳ではなくすぐに問題なく実行できる。
  • calendar作成を一度に大量にやるとアクセス拒否されるようになる。たぶん丸一日ぐらい?しきい値は25ぐらいというのも見たが未確認。テスト実行中はくれぐれも注意する事。
Acl

Access Control Rule。設定項目でいう所の「特定のユーザーとの共有」の事。

delete
Access Control Ruleを削除する。

service.acl().delete(calendarId="primary", ruleId="ruleId").execute()

get
指定したruleIdのAccess Control Ruleを取得する。

service.acl().get(calendarId="primary", ruleId="ruleId").execute()

insert
Access Control Ruleを作成する。

rule = {
    "scope": {
        "type": "scopeType",
        "value": "scopeEmail",
    },
    "role": "role"
}
service.acl().insert(calendarId="primary", body=rule).execute()

list
Access Control RuleのListを取得する。

service.acl().list(calendarId="primary").execute()

patch
指定したruleIdのAccess Control RuleをPATCH Methodで更新する。

rule = service.acl().get(calendarId="primary", ruleId="ruleId").execute()
service.acl().update(calendarId="primary", ruleId=rule["id"], body={"role":"newRole"}).execute()

update
指定したruleIdのAccess Control RuleをPUTMethodで更新する。

rule = service.acl().get(calendarId="primary", ruleId="ruleId").execute()
rule["role"] = "newRole"
service.acl().update(calendarId="primary", ruleId=rule["id"], body=rule).execute()

watch
Access Control Ruleの変更を監視する。

calendarList

delete
calendarListからcalendarを削除する。あくまでListから消すのであってcalendar自体を消すのではない。

service.calendarList().delete(calendarId="hoge").execute()

get
calendarのListとそのmeta dataを取得する。

service.calendarList().get(calendarId="primary").execute()

insert
calendarListに既存のcalendarを追加する。新しく作成するのはcalendarsのinsert method。

body = {
	"id": "hoge"
}
service.calendarList().insert(body=body).execute()

list
calendarListをmeta dataと共に取得する。引数のpageTokenはいわゆる次のページという奴。calendarListの数が大きい時に使うはずだがそんな大きな数には普通はならない。使うとすればeventsのlistだろう。

page_token = None
while True:
	calendar_list = service.calendarList().list(pageToken=page_token).execute()
	for calendar_list_entry in calendar_list["items"]:
		print(calendar_list_entry["summary"])
	page_token = calendar_list.get("nextPageToken")
	if not page_token:
		break

patch
calendarList上のcalendarをPATCH Methodで更新する。

calendar_list_entry = service.calendarList().get(calendarId="calendarId").execute()
service.calendarList().patch(calendarId=calendar_list_entry["id"], body={"colorId":17}).execute()

update
calendarList上のcalendarをPUT Methodで更新する。patchもupdateも挙動は似てるがpatchはPATCH MethodでupdateはPUT Methodを使用している。従ってupdateは全ての要素を指定しないと指定したもの以外はクリアされてdefaultに戻る。patchとupdate共にcalendarIdがprimaryでは通らない。primaryでもきちんと指定する必要がある。

calendar_list_entry = service.calendarList().get(calendarId="calendarId").execute()
calendar_list_entry["colorId"] = "newColorId"

service.calendarList().update(calendarId=calendar_list_entry["id"], body=calendar_list_entry).execute()

watch
CalendarListの変更を監視する。

calendars

clear
primary calendar(アカウント紐付けcalendar)内のeventを全消去する。primary専用のMethodであってsecondary calendar(ユーザー作成calendar)には使えない。primary専用にも関わらずcalendarIdを指定しなければならない。

service.calendars().clear(calendarId="primary").execute()

delete
secondary calendar自体を削除する。当然だがsecondary calendar専用のMethod。

service.calendars().delete(calendarId="hoge@group.calendar.google.com").execute()

get
calendarのmeta dataを取得する。

service.calendars().get(calendarId="primary").execute()

insert
calendarを作成する。

body= {
	"summary": "hoge",
	"timeZone": "Asia/Tokyo"
}
service.calendars().insert(body=body).execute()

patch
calendarをPATCH Methodで更新する。

calendar = service.calendars().get(calendarId="primary").execute()
service.calendars().patch(calendarId=calendar["id"], body={"summary":"hoge"}).execute()

update
calendarをPUT Methodで更新する。

calendar = service.calendars().get(calendarId="primary").execute()
calendar["summary"] = "hoge"
service.calendars().update(calendarId=calendar["id"], body=calendar).execute()

channels

stop
watchで設定した監視Channelを停止する。

colors

get
calendarとeventのcolor設定を取得する。

service.colors().get().execute()

events

eventのidはbase32hexつまり0-9およびa-vで作成できる5〜1024文字の文字列。これを指定しないと実行するごとに重複eventを作成してしまう。似たような物にiCalUIDがあるがidはcalendar内で一意であればよいが、iCalUIDはcalendar system全体で一意でなければならない。また繰り返しeventは同一のiCalUIDとそれぞれ違うidを持つ。event作成にはどちらか一方があればよいがimportにはiCalUIDが必要。

delete
eventを削除するというかeventのstatusをcancelledにする。これを実行してもeventが完全に削除されたわけではない。これを理解しておかないとid指定でevent作成をする時idが重複してエラーとなる。

service.events().delete(calendarId="primary", eventId="hoge").execute()

get
eventのmeta dataを取得する。

service.events().get(calendarId="primary", eventId="hoge").execute()

import
eventをimportする。

event = {
	"summary": "Appointment",
	"location": "Somewhere",
	"organizer": {
		"email": "organizerEmail",
		"displayName": "organizerDisplayName"
	},
	"start": {
		"dateTime": "2011-06-03T10:00:00.000-07:00"
	},
	"end": {
		"dateTime": "2011-06-03T10:25:00.000-07:00"
	},
	"attendees": [
		{
		"email": "attendeeEmail",
		"displayName": "attendeeDisplayName",
		},
		# ...
	],
	"iCalUID": "originalUID"
}

service.events().import_(calendarId="primary", body=event).execute()

insert
eventを作成する。

body = {
	"summary": "hoge",
	"start": {
		"dateTime": "2022-06-01T09:00:00+09:00",
		"timeZone": "Asia/Tokyo",
	},
	"end": {
		"dateTime": "2022-06-01T10:00:00+09:00",
		"timeZone": "Asia/Tokyo",
	}
}

service.events().insert(calendarId="primary", body=body).execute()

instances
繰り返しeventの展開した各eventを取得する。

page_token = None
while True:
	events = service.events().instances(calendarId="primary", eventId="eventId", pageToken=page_token).execute()
	for event in events["items"]:
		print event["summary"]
	page_token = events.get("nextPageToken")
	if not page_token:
		break

list
eventのlistを取得する。取得数はデフォルトだと250。これで足りない場合はmaxResultsで2500まで増やすことが出来るが問題はstartを降順でなどと出来ない事。大体大昔のeventなどどうでもよくて欲しいのは最新のeventなのでその時はtimeMaxもしくはtimeMinで時間指定するしかない。

service.events().list(calendarId="primary").execute()

move
別のcalendarにeventを移動する。

service.events().move(calendarId="primary", eventId="hoge", destination="secondary@group.calendar.google.com").execute()

patch
eventをPATCH Methodで更新する。

event = service.events().get(calendarId="primary", eventId="eventId").execute()
service.events().update(calendarId="primary", eventId=event["id"], body={"summary":"Appointment at Somewhere"}).execute()

quickAdd
簡単な文字列のみでeventを作成する。文字列をパースしてeventを作成するのだがそんな事わざわざせずともscriptからinsertを叩く分にはそう面倒じゃないので公式の解説もいまいち不親切。

service.events().quickAdd(calendarId="primary", text="Appointment at Somewhere on June 3rd 10am-10:25am").execute()

update
eventをPUT Methodで更新する。

event = service.events().get(calendarId="primary", eventId="eventId").execute()
event["summary"] = "Appointment at Somewhere"
service.events().update(calendarId="primary", eventId=event["id"], body=event).execute()

watch
eventの追加またはeventの変更を監視する。

freebusy

query
calendarのlistから空き時間を取得する。

settings

get
指定された設定を取得する。

service.settings().get(setting="settingId").execute()

list
全設定を取得する。

service.settings().list().execute()

watch
設定の変更を監視する。

PythonでWinHTTPRequestを叩くのだ

別に好き好んでこんな面倒な事してる訳ではもちろんない。Requestsでどうしても上手くいかなかったから仕方なくやってるのだ。テメエの事だよe-h〇n!なにやら302で2回リダイレクトさせてる上にcookie制御も相当厳密にやってる。まあそれだけならRequestsでも出来るはずなんだけど何故か上手くいかない。結局出来なかったので推測でしかないがブラウザで見るとSessionStorageを使ってるのでたぶん原因はこれじゃないか。しかし昔々大昔に作ったJScriptの奴は今でも元気に動いてるぞ?ひょっとしてWinHTTPRequestなら上手くいくのか?

WinHTTPRequestの叩き方

pywin32 libraryを使えばいいらしい。しかしlibrary名はpywin32なのにmodule名はwin32com.clientなのな。後はWinHTTPRequestのmethodを叩けばいいだけだ。

import win32com.client
winhttp = win32com.client.Dispatch("WinHTTP.WinHTTPRequest.5.1")
winhttp.Open("GET", url, False)
winhttp.SetRequestHeader("Content-Type", "text/plain;charset=Shift_JIS")
winhttp.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:100.0) Gecko/20100101 Firefox/100.0 ")
winhttp.Send()

おーちゃんと200が返ってきた。後はこれをパースしてやればいいだけだ。ここはcharsetが今時Shift_JISなので一旦ResponseBodyでbyte列を取得しておいてそれをtextにしてやらねばならない。しかしこのResponseBodyがなにやらmemoryview型とやらで返ってくる。byte型じゃないのか。

<memory at 0x000001A96428CF40>

必死に検索すると要するにCのポインタを返してるのね。つまりこれメモリのアドレスか。しかしサラッと書いたけど調べて理解するのに半日程かかったよ。memoryview() in Python辺りが英語だけど分かりやすかった。

html = winhttp.ResponseBody.tobytes().decode("shift_jis")

後はこのhtmlをBeautifulSoupに食わせて処理するだけ。しかしそもそも何故ResponseBodyがmemoryview型で返るのかは不明。

SwitchBot Hub Miniのネットワーク仕様 ~MQTTプロトコル~

Echo Dotを買った。アラームが好きなだけ登録できる高性能目覚まし時計ぐらいのつもりで買ったんだけど中々便利。SwitchBot Hub Mini(以下面倒なのでHub)もあれば灯りやエアコンをベッドに寝たまま操作できるとかお外から操作出来るとか色々便利そうなので欲しいなーと思ってたところ、タイムセール+プロモーションコードで1000円程度で買えるので即ポチした。確かにお外からエアコン操作出来たし真夏は便利。だがしかしちょっと待て。そもそもなんでそんな事出来るんや。今お前どうやってルーター超えた。

ヒルに聞いたはいいが検索ワードが悪かったらしく設定方法しか出てこない。しかし公式のQ&Aに

プロトコルとポートの情報は「MQTT OVER TCP PORT 8883」となります

と書いてあるのを見つけた。OVER TCP PORT 8883は分かるがMQTTってなんだ。

MQTTプロトコル

MQTTとは何の略だというとMQプロトコルの発展形でMQ Telemetry Transportの略らしいが、そのMQプロトコルも聞いた事ないので別にどうでもよかった。
さて、通常のクライアントサーバーモデルだと直接かつ同期的にアクセスしていた。しかしMQTTプロトコル
Publisher---------->Broker---------->Subscriber
という形態をとりかつ非同期。Publisherつまりデータ送信者、Subscriberつまりデータ受信者、間にあるBrokerというのはプロキシみたいな中間サーバー。PublisherもSubscriberもお互いの通信先なんか知る必要はなくBrokerの通信先さえ知っておけばいい。HubとスマホはPublisherとSubscriberのどちらにもなり得る。Hubからのデータ取得とスマホからのコマンド送信で方向違うからね。そしてHubが定期的にBrokerに通信してアクセス先を通知してるんだろう。じゃないとスマホからHubのアドレスなんか分かる訳ないし。

Edge(Chromium) + Selenium(Python)を使ってみる ~導入編~

我が家のIEちゃんが余命いくばくもないのでブラウザ自動運転の後継を確保するべく簡単に調べた結果Seleniumとかいうのが今のところ一番メジャーらしい。ActiveX叩けば簡単に動かせてたIEに比べれば面倒臭いんだけど仕方ないね。もっと簡単なのがあればそっちがメジャーになってるだろうし。
なお資料は

を参照した。

まずは必要な物の確認

ブラウザ
これはEdge(Chromium)を使うものとする。Chromeは入れてないしFirefoxはなんだか面倒そうなので。
WebDriver
Windowsの設定からインストールすることが出来るらしい。なんと便利な。「設定→アプリ→オプション機能→機能の追加」からMicrosoft WebDriverを選ぶ。しかし後で問題発覚。素直にWebDriverを手動で落として来る事。
Selenium本体
言語はPythonとする。現在まだβのVer4推奨らしいがanaconda上にVer4が上がってない。公式推奨にも関わらず使う奴いないんだろうなたぶん。よく読むと「The Selenium Tools for Microsoft Edge」とやらを使えば同等の事が出来るらしい。仕方ないのでVer3に決定。

色々読むと基本これだけでいいらしい。

取り敢えずやってみるがWebDriverがおかしい

from selenium import webdriver
driver = webdriver.Edge(r"C:\windows\system32\MicrosoftWebDriver.exe")
driver.get("https://www.google.com")

こんな感じのコードをパクってきていざ実行・・・おい動かねーぞ!ブラウザは立ち上がるがぐぐるを開いてくれない。try-exceptでエラーコードを見るとどうもモジュール自体がエラーを吐いてる。WebDriverExceptionとか見えるが自動で落ちてくる奴がおかしいのか。仕方ないので検索して手動で探してきた奴を指定すると無事動いた。よく見ると自動で落ちてくる奴はMicrosoftWebDriver.exeだが手動で探してきた奴はmsedgedriver.exe。Selenium DocumentationによるとMicrosoftWebDriver.exeはLegacyつまり旧版Edge用でmsedgedriver.exeはChromium用だと。という事なので設定から自動で落ちてくる奴は使わない事。

The Selenium Tools for Microsoft Edge

Ver3の拡張パック的な物。これがあればVer4と同等の事が出来るらしい。

from msedge.selenium_tools import Edge, EdgeOptions
driver = Edge(executable_path="", capabilities=None, port=0, verbose=False, service_log_path=None, log_path=None, keep_alive=False, desired_capabilities=None, service_args=None, options=None)
WebDriver Class

インスタンス

引数 概要
executable_path string Edge用WebDriverのPathを指定する。未指定だとPathを通せば探しに行くらしい。
capabilities
desired_capabilities
dict 各ブラウザ共通の設定情報をdictで指定する。capabilitiesはLegacy Edge用でdesired_capabilitiesはChromium Edge用。だがちゃんと中でcapabilitiesとdesired_capabilitiesが振り分けれてるのでどっちでも問題ない。
port number サービスの実行ポートを指定する。defaultの0だと空きポートを適当に使う。
verbose boolean 詳細なログを吐く。
service_log_path string LogのPathを指定する。
log_path string 非推奨。service_log_pathを使う事。
keep_alive boolean EdgeRemoteConnectionでHTTP keep-aliveを有効にする。
service_args list serviceに渡す引数のListを指定する。
options object EdgeOptionsのインスタンスを指定する。

メソッド

メソッド名 引数 概要
launch_app id 指定したIDでEdgeアプリを起動する。オリジナルであるChromiumのドキュメントを読むと非公式のコマンドらしい。
get_network_conditions ネットワークの状態をdictで返す。
set_network_conditions offline
latency
download_throughput
upload_throughput
ネットワークの状態を設定する。
execute_cdp_cmd cmd
cmd_args
Edge Devtools Protocol commandを実行する。詳細はChrome DevTools Protocol参照。
quit ブラウザを閉じる。
create_options optionsのインスタンスを作る。後述するEdgeOptionsと全く一緒なのでどちらを使ってもいい。
Options Class

プロパティ

プロパティ名 概要
use_chromium boolean chromium版を使うかどうか。現状ほぼ必須。
use_webview boolean capabilityのbrowserNameにwebview2を設定する。Edgeアプリのレンダリングエンジンの事か。詳細不明。
page_load_strategy string capabilitiesのpageLoadStrategyを変更する。
capabilities read only、writeはset_capabilityを使う。
binary_location string ブラウザバイナリのpathを返す。
debugger_address string Devtoolsインスタンスのアドレスを返す。
arguments read only、writeはadd_argumentを使う。
extensions read only、writeはadd_extensionまたはadd_encoded_extensionを使う。
experimental_options read only、writeはadd_experimental_optionを使う。
headless boolean headlessモードを有効にするかどうか。GUIを表示せずに実行できるようになる。add_argumentで「--headless」を追加しても内部的には全く一緒だがheadlessプロパティはWindowsの場合「--disable-gpu」も一緒に追加しているので手間が一つ省ける。

メソッド

メソッド名 引数 概要
set_capability name
value
capabilitiesのブラウザ共通部分に項目を追加する。
to_capabilities capabilitiesオブジェクトを作成する。
add_argument argument capabilitiesのargsに追加する。
add_extension extension capabilitiesのextensionsに追加する。拡張機能のファイルPathを指定する事。
add_encoded_extension extension capabilitiesのextensionsに追加する。拡張機能のファイルをBase64エンコードした文字列を指定する事。
add_experimental_option name
value
capabilitiesのブラウザ固有部分に項目を追加する。
set_headless 廃止。headlessプロパティを使う事。
各ブラウザ共通capability

参考は下記。しかしW3Cにはproxyがあるのにseleniumの実装にはない。コマンドラインオプションにproxy関連があるからそっちでやれという事なんだろうか。

名前 概要
browserName string ブラウザ名。
browserVersion string ブラウザVer。
pageLoadStrategy string ページ読み込みの手順。使用可能な値は「normal, eager, none」の3つ。結局document.readyStateを見てるだけ。defaultのnormalはcomplete、eagerはeagerはinteractive、noneはAnyつまり何もしない。
platformName string 要はOS名。
acceptInsecureCerts boolean 名前通りでセキュアでない証明書を受け入れるかどうか。falseだとエラーを返す。
timeouts object タイムアウトを指定する。Script Timeout, Page Load Timeout, Implicit Wait TimeoutのObjectを指定する。
unhandledPromptBehavior string ブラウザがダイアログを出した場合の処理を指定する。
setWindowRect string ウィンドウのサイズと位置を変更する。内部でgetWindowRectを叩いてるだけ。
strictFileInteractability boolean type=fileのinput要素に厳密なチェックを行うかどうか。厳密なチェックとやらが何をするのか知らないが。
Edge固有capability

参考は下記。というかいちいち見に行くのが面倒なのでコピーしただけ。

ちなみにargsで指定できる値の一覧は下記。Chromiumの一覧だが「--headless」も「--disable-gpu」もちゃんとあるので大体あってるだろうたぶんきっと。

EdgeOptions オブジェクト

名前 概要
args list Microsoft Edge を起動するときに使用するコマンドライン引数の一覧です。 値が関連付けられた引数は、= 記号で区切る必要があります (['start-maximized', 'user-data-dir=/tmp/temp_profile'] など)。
binary string 使用する Microsoft Edge バイナリのパス (macOS では、アプリだけでなく実際のバイナリである必要があります。 例: /Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge)。
debuggerAddress string たとえば、接続先のデバッガー サーバーのアドレスを、次の hostname/ip:port 形式で指定します 127.0.0.1:38947 。
detach false WebDriver Microsoft Edgeがセッションを閉じていなくても、WebDriver サービスがシャットダウンすると終了します false 。 場合は、Microsoft Edge WebDriver ローカル エンドがセッションを閉じる場合 true にのみ終了します。 WebDriver ローカル エンドがセッションを閉じない場合は、ユーザー インスタンスで使用される一時的なユーザー true EdgeDriver データ フォルダー Microsoft Edgeされません。
excludeSwitches list Microsoft Edge の起動時に、既定で EdgeDriver によって除外される Microsoft Edge コマンド ライン スイッチの一覧。 スイッチの -- プレフィックスは使用しないようにします。
extensions list 起動時にインストールする拡張機能の一覧。 リスト内の各項目は、base-64 でエンコードされたパック拡張 (.crx) である必要があります。
localState dict 基本設定の名前と値で構成される各エントリを持つ辞書。 ユーザー設定は、ユーザー データ フォルダー内のローカル状態ファイルに適用されます。
minidumpPath string Microsoft Edge ミニダンプを保存するディレクトリ。 (Linux でのみサポートされています。)
mobileEmulation dict deviceName の値、または deviceMetrics および userAgent の値を含むディクショナリ。
perfLoggingPrefs dict パフォーマンス ログの設定を指定するオプションのディクショナリ。 詳細については、「perfLoggingPrefs オブジェクト」を参照してください。
prefs dict 基本設定の名前と値で構成される各エントリを持つ辞書。 ユーザー設定は、使用中のユーザー プロファイルにのみ適用されます。 たとえば、ファイルのユーザー データ Preferences フォルダー内のファイルに移動Microsoft Edge
wdpAddress string 接続先の Windowsバイス ポータル サーバーのアドレス。hostname/ip:port の形式で指定します。例: 127.0.0.1:50080。 詳細については、「リモート デバッグ-Windows 10 デバイス」を参照してください。
wdpPassword string Windowsバイス ポータル サーバーに接続するときに使用するオプションのパスワードです。 サーバーで認証が有効になっている場合は必須です。
wdpUsername string バイス ポータル サーバーへの接続時に使用Windowsオプションのユーザー名。 サーバーで認証が有効になっている場合は必須です。
windowsApp string 起動する Microsoft Edge アプリ パッケージのアプリケーション ユーザー モデル ID。例: Microsoft.MicrosoftEdge.Stable_8wekyb3d8bbwe!MSEDGE。 Windowsバイス ポータルを使って Windows 10X デバイスまたはエミュレーターに接続する場合は、binary の代わりに windowsApp を使います。
windowTypes list ウィンドウ ハンドルの一覧に表示されるウィンドウの型の一覧。 Android webview 要素にアクセスするには、一覧に webview を含めます。

perfLoggingPrefs オブジェクト

キー 既定値 詳細
bufferUsageReportingInterval 正の整数 1000 DevTools トレース バッファー使用量イベント間の要求されたミリ秒数。 たとえば、1000 の場合は 1 秒に 1 回、すべてのトレースバッファーの量が報告されます。 レポートにバッファー使用量が 100% と示されている場合は、警告が発生します。
enableNetwork ブール値 true ネットワーク ドメインからイベントを収集します (または収集しません)。
enablePage ブール値 true ページ ドメインからイベントを収集します (または収集しません)。
traceCategories 文字列 (空) トレース イベントを収集する Microsoft Edge トレース カテゴリのコンマ区切り文字列。 未指定または空の文字列は、トレースを無効にします。

Webdriver Manager for Python

ブラウザのVerとWebDriverのVerは合わせる必要がある。しかしEdgeは知らないうちにUpdateしてるので面倒臭い。とか思ってたらその辺をいい感じに解決してくれる便利アイテムがあるらしい。それはいいんだけど各ブラウザの公式からじゃなくてどのブラウザもWebDriverを置いておくスペースを別途用意してそこから落とすんだな。あとよくエラーを吐くがたぶんサーバーが不安定なんだろう。

from msedge.selenium_tools import Edge, EdgeOptions
from webdriver_manager.microsoft import EdgeChromiumDriverManager
options = EdgeOptions()
options.use_chromium = True
driver = Edge(executable_path = EdgeChromiumDriverManager().install(), options = options)
driver.get("https://www.google.co.jp")

こんな感じでWebDriverがなければ勝手に落としてきてくれあまつさえVerチェックまでしてくれる。特に何も指定しなければWebDriverのPathは「C:\Users\user名\.wdm\drivers\edgedriver\win64\Ver\msedgedriver.exe」となるが場所を指定したければ

from msedge.selenium_tools import Edge, EdgeOptions
from webdriver_manager.microsoft import EdgeChromiumDriverManager
options = EdgeOptions()
options.use_chromium = True
driver = Edge(executable_path = EdgeChromiumDriverManager(path="C:\webdriver").install(), options = options)
driver.get("https://www.google.co.jp")

とEdgeChromiumDriverManagerでpathを指定すればいい。

今月の読書日記

民主主義の基本的な仕組みを解説した本。保守リベラルには全く言及されておらずあくまで政治の構造一本。それでも政治学の素養が低い俺さんにはまあまあ難しかった。マネロンって具体的にナニをドウするのか解説してある珍しい本。だがこれが正しいのかどうなのかよく分からない。アフガンの紆余曲折を解説してある本。確かに詳細で分かりやすいのだが、筆者の名前で検索するとすぐに出てくるがIS大好きタリバン大好きっ子なので話を割り引いてどころか話半分で聞かざるを得ない。西洋史または中国史と比較して日本史を俯瞰するというのは歴史本の定番だがむしろ日本史を語る視点が面白くてよかった。江戸時代の経済政策辺りなんて目から鱗

yt-dlp オプション一覧及びそのメモ

youtube-dlの開発が止まっておりfork版のyt-dlpに移る事にした。yt-dlpyoutube-dlのforkであるyoutube-dlcのそのまたforkになる。オリジナルであるyoutube-dlのオプション解説はyoutube-dl オプション一覧及びそのメモ

  • 2022/06/19更新
  • 2022/09/06更新


OPTIONS

-h, --help
ヘルプを表示する。
--version
プログラムのVerを表示する。
-U, --update
--no-update (default)
プログラムのupdateを実行するかどうか。
-i, --ignore-errors
ダウンロードエラーを無視する。プレイリストごとダウンロードするような時に使う。エラーで失敗してもダウンロードは成功したとみなされる。
--no-abort-on-error (default)
--abort-on-error, --no-ignore-errors
ダウンロードエラー発生時に処理を中止するかどうか。--ignore-errorsは成功したとみなすが--no-abort-on-errorはスキップするだけ。
--dump-user-agent
userAgentを表示する。
--list-extractors
extractor一覧を表示する。
--extractor-descriptions
extractor一覧を説明付きで表示する。が、説明なしの物が殆ど。
--force-generic-extractor 非推奨
汎用extractorでのダウンロードを強制する。
--use-extractors NAMES 追加
エイリアスは--ies。カンマで区切ったextractor名、all、default、endあるいは正規表現を指定する。なおendはURLマッチング。「-」を付けて除外する事も出来る。

--ies "holodex.*,end,youtube"
--ies default,-generic

--default-search PREFIX
URLでない値をURLとして与えられた場合の処理方法。"auto"を指定したらyt-dlpが適当に推測して処理しようとするが大抵巧くいかない。「error」を指定したらただエラーを返すだけ。「auto_warning」は推測時に警告を出す。「fixup_error」を指定したらURLとして与えられた引数を修正しようとするが巧くいかなかったらやっぱりエラーを返す。「gvsearch2:python」だとGoogleの「python」での動画検索結果から2つをダウンロードする。
--ignore-config, --no-config
--config-locationで指定された設定ファイル以外を無視する。設定ファイル内で指定された場合はそれ以上の設定ファイルのロードを無視する。
--config-location PATH
設定ファイルもしくはフォルダPATHを指定する。
--no-config-locations (default)
--ignore-configは--config-location以外の設定ファイルを無視するがこちらは全ての設定ファイルを無視する。設定ファイル内で指定された場合は他の設定ファイルを無視する。
--flat-playlist
--no-flat-playlist
プレイリスト展開をするかどうか。
--live-from-start 実験的
--no-live-from-start (default)
live streamダウンロードのスタートを放送開始時からにするかどうか。--live-from-startはYouTubeのみのサポート。
--wait-for-video MIN[-MAX]
--no-wait-for-video (default)
たぶんlive streamの予約ダウンロードの待機中の再試行間の秒数、MAXも同時に指定した場合は範囲。範囲で指定したらどうなるのかいまいち分からないが。
--mark-watched
--no-mark-watched (default)
要するに再生履歴に残すか残さないかの事。当然ユーザ名パスワードを一緒に指定しないと意味ない。
--no-color
出力にカラーコードを生成しない。
--compat-options OPTS
yt-dlpでの各オプションのデフォルト動作の違いを元に戻す。
--alias ALIASES OPTIONS
オプション文字列のエイリアスを作成する。エイリアスが「-」で始まってない場合は「--」を追加する。エイリアスオプションの引数はPythonの文字列フォーマットに従ってパースされる。

--alias get-audio,-X "-S=aext:{0},abr -x --audio-format {0}

を例にとるとまず「--get-audio」と「-X」オプションを作成し{0}に引数を展開する。
とまあ長々と書いたがexe版だとそんなオプションねーですと言われる。Python版はいざ知らずexe版はまだ実装されてないらしい。

Network Options

--proxy URL
プロキシを設定する。HTTP/HTTPS及びSOCKS。SOCKSは

socks5://user:pass@127.0.0.1:1080/

のような感じで指定する。

--socket-timeout SECONDS
タイムアウトの秒数を指定。単位は秒。
--source-address IP
恐らくはクライアント側からのパケットのソースアドレス偽装。つまり--proxyと似たような機能だろう。公式の説明がシンプル過ぎて推測でしかないが。
-4, --force-ipv4
-6, --force-ipv6
IPv4, IPv6を強制それぞれ強制

Geo Restriction

--geo-verification-proxy URL
--proxyと違うのはサイトへのアクセス時のみの適用で動画のダウンロード時は未適用と言う点。ChinaのProxyは回線が不安定な物が多いのでそういうときはこれを使う。
--geo-bypass (default)
--no-geo-bypass
X-Forwarded-Forヘッダ偽装による地域制限回避をするかしないか。
--geo-bypass-country CODE
ISO 3166-2で規定されたコードを指定して地域制限を回避する。
--geo-bypass-ip-block IP_BLOCK
CIDR表記で指定されたIPレンジを地域制限を回避する。

Video Selection

--playlist-start NUMBER 冗長
--playlist-end NUMBER 冗長
例えば2を指定するとプレイリスト内の2番目の動画から処理を開始もしくは処理を終える。
--I, --playlist-items ITEM_SPEC
ダウンロードする動画のプレイリストインデックスをカンマ区切りで指定する。「[START]:[STOP][:STEP]」で範囲も指定できる。STEPに負の整数を指定すると逆順となる。下位互換として「START-STOP」も有効。サイズ15のプレイリストで

-I 1:3,7,-5::2

と指定するとダウンロードされるのは「1,2,3,7,11,13,15」となる。

--match-title REGEX 冗長
--reject-title REGEX 冗長
正規表現にマッチした物をダウンロードするかもしくは除外してダウンロードする。
--max-downloads NUMBER
最大ダウンロード数を指定する。
--min-filesize SIZE
--max-filesize SIZE
最大最小ファイルサイズをそれぞれ指定する。
--date DATE
動画のアップロード日時を指定する。YYYYMMDD形式または「 [now|today|yesterday][-N[day|week|month|year]]」のようなフォーマットを指定する。

--date today-2weeks

--datebefore DATE
--dateafter DATE
指定した日時より以前もしくは以後の物をそれぞれ処理する。フォーマットは--dateと同様。
--min-views COUNT 冗長
--max-views COUNT 冗長
最大最小視聴回数をそれぞれ指定する。
--match-filter FILTER
--no-match-filter (default)
ダウンロードする動画をフィルタするかどうか。単純にfield名を指定すればそのfieldが存在するかどうか。!fieldとすれば反転。「~=」を使用してpython互換の正規表現を使用する事も出来る。

--match-filter !is_live --match-filter "like_count>?100 & description~='(?i)\bcats \& dogs\b

はis_live が存在しないつまり生放送ではない、like_countが100以上、descriptionが「\bcats & dogs\b」と一致する動画がヒットする。

--no-playlist
--yes-playlist
プレイリストを無視するかどうかのフラグ。
--age-limit YEARS
年齢制限の事。
--download-archive FILE
--no-download-archive (default)
ダウンロードした動画のIDを自動で記録するかどうか。そして記録された動画は次回実行時にダウンロードをスキップする。
--break-on-existing
--break-on-reject
ほぼ同じ機能だがexistingはarchiveにヒットしたらrejectはfilterにヒットしなかったらダウンロードを停止する。
--break-per-input
--no-break-per-input
--break-on-existing、--break-on-reject、--max-downloadsを現在のURLのみに適用する。つまりダウンロードスキップして次のURLに処理を進める。--no-break-per-inputはqueueingされたURL全体の処理を打ち切る。
--skip-playlist-after-errors N
指定されたエラー数を超えるとプレイリスト自体がスキップされる。
--include-ads 非サポート
広告もダウンロードする。

Download Options

-N, --concurrent-fragments N
fragmentの同時ダウンロード数。デフォルトは1。
-r, --limit-rate RATE
最大ダウンロード速度を指定する(例 50K, 4.2M)。
--throttled-rate RATE
最低ダウンロード速度を指定しこれを下回ると再ダウンロードする。
-R, --retries RETRIES
リトライ数を指定する。infiniteという値も一応用意されているがこんな値使うな。
--file-access-retries RETRIES
ファイルアクセスエラーの許容回数を指定する。infiniteもちゃんとあるがこれ削っていいのではなかろうか。
--fragment-retries RETRIES
fragmentのリトライ数。
--retry-sleep [TYPE:]EXPR
再試行間のsleep時間を秒で指定する。TYPEは「file_access、fragment、http」の3種類。EXPRは「linear=START[:END[:STEP=1]]」と「exp=START[:END[:BASE=2]]」の2種類。
--skip-unavailable-fragments, --no-abort-on-unavailable-fragment (default)
有効でないfragmentをskipする。
--abort-on-unavailable-fragment, --no-skip-unavailable-fragments
有効でないfragmentがあるときダウンロード処理を中断する。
--keep-fragments
--no-keep-fragments (default)
ダウンロード後fragmentを残すかどうか。
--buffer-size SIZE
ダウンロードバッファを指定する。
--resize-buffer (default)
--no-resize-buffer
ダウンロードバッファを自動調整するかどうか。
--http-chunk-size SIZE 実験的
チャンクサイズを指定する。サーバー側で指定されている帯域制限回避に役立つかもしれない。
--playlist-reverse 冗長
--no-playlist-reverse (default) 冗長
プレイリスト上の動画のダウンロード順を逆からにするかどうか。
--playlist-random
プレイリスト上の動画をランダムにダウンロードする。
---lazy-playlist
---no-lazy-playlist (default)
プレイリストをパースし終えてからプレイリスト内動画を処理するかどうか。---lazy-playlistだとたぶんパースしながら同時に動画を処理するんだろう。%(n_entries)s、--playlist-random、--playlist-reverseが無効。
--xattr-set-filesize
拡張ファイル属性に予想されるファイルサイズを書き込む。
--hls-prefer-native 非推奨
--hls-prefer-ffmpeg 非推奨
HLSの処理方法のオプション。nativeは自前で処理する。HLSというのはHttp Live Streamingの事でストリーミング配信用のプロトコル
--hls-use-mpegts
--no-hls-use-mpegts
HLSでMPEG TSを使うかどうか。
--download-sections REGEX
指定された正規表現にマッチしたtitleのchapterのみをダウンロードする。「*」で指定された時間の範囲をダウンロードする事も出来る。ただしffmpegが必要。

--download-sections "*10:15-15:00
--download-sections "intro"

また複数回使用する事が出来る。

--downloader [PROTO:]NAME, --external-downloader [PROTO:]NAME
PROTOはプロトコル。要はプロトコルごとに使用する外部ダウンローダーを指定することが出来る。PROTOで使用出来るのはhttp、 ftp、m3u8、dash、rstp、rtmp、mms。NAMEで使用できるのはnative、aria2c、avconv、axel、curlffmpeg、httpie、wget。例えば

--downloader aria2c --downloader "dash,m3u8:native"

のようにプロトコルごとに複数指定してもよい。

--downloader-args NAME:ARGS, --external-downloader-args NAME:ARGS
外部ダウンローダーに引数を渡す。エイリアスとして --external-downloader-args。

Filesystem Options

-a, --batch-file FILE
--no-batch-file
動画URLを記述したファイルを指定してまとめてダウンロードする。--no-batch-fileはbatch fileを無視する
--id 削除
ファイル名を動画IDのみとする。後述の-oと併用するとconflictで停止する。
-P, --paths [TYPES:]PATH
ファイルのダウンロード先を指定する。--outputで絶対パスが指定された時は無効となる。TYPESでファイルタイプを指定する事も出来るので-Pオプションを複数指定してタイプごとに振り分ける事も可能。サポートされているタイプはsubtitle、thumbnail、description、infojson、pl_thumbnail、pl_description、pl_infojson、chapter。homeとtempを指定する事も出来る。「temp:PATH」で指定したフォルダに一時ファイルを展開し「home:PATH」に最終ファイルを格納する。
-o, --output [TYPES:]TEMPLATE
ファイル名を指定する。TYPESの使い方は--pathsと一緒。使用できる変数は後述のOUTPUT TEMPLATEを参照。
--output-na-placeholder TEXT
OUTPUT TEMPLATEの各変数はサイトによっては当然存在しない物も多い。その時は「NA」が出力されるがこのオプションでそれを書き換えることが出来る。
--autonumber-start NUMBER 非推奨
%(autonumber)sの初期値を指定する。
--restrict-filenames
--no-restrict-filenames (default)
ファイル名をASCIIコードに制限するかどうか。
--windows-filenames
--no-windows-filenames (default)
Windows互換のファイル名に置き換える。要は駄目文字対策。--windows-filenamesは使ってるOSに関係なく実行されるが--no-windows-filenamesはWindowsの場合のみでこれがデフォルト。Windowsユーザーには関係ないオプション。
--trim-filenames LENGTH
拡張子を除いたファイル名の文字数を指定値に制限する。
-w, --no-overwrites
どんなファイルも上書きしないというオプション。
--force-overwrites
--no-force-overwrites (default)
--force-overwritesは動画とメタデータファイルを上書きし、それに対して--no-force-overwritesは動画は上書きしないがメタデータファイルは上書きする。
-c, --continue (default)
--no-continue
ダウンロードのリジュームをするかどうか。
--part (default)
--no-part
.partファイルを使わないというからメモリ上に読み込むとかそんな事かと思ったら単にpart拡張子の話。
--mtime (default)
--no-mtime
HTTPのLast-Modifiedヘッダをファイルの更新日時に使うかどうか。
--write-description
--no-write-description (default)
descriptionファイルを別途作成するかどうか。
--write-info-json
--no-write-info-json (default)
メタデータを記述したJSONファイルを別途作成するかどうか。
--write-playlist-metafiles (default)
--no-write-playlist-metafiles
--write-info-jsonや--write-descriptionを指定する場合、プレイリストのメタデータを追記するかどうか。
--clean-infojson (default)
--no-clean-infojson
JSONファイルからファイル名のようなプライベートな項目を削除する。このオプションを使ったからと言ってプライベートな項目を全て削除したとは限らない事に注意する事。
--write-comments, --get-comments
--no-write-comments, --no-get-comments
動画コメントを取得しJSONファイルに書き込む。
--write-annotations 非サポート
アノテーションxmlで作成する。
--load-info-json FILE
JSONファイルから動画情報をロードする。書き込みは--write-info-jsonで行う。
--cookies FILE
--no-cookies (default)
ファイルからcookieをロードするかどうか。
--cookies-from-browser BROWSER[+KEYRING][:PROFILE][::CONTAINER] 変更
--no-cookies-from-browser (default)
ブラウザのプロファイルからcookieを取得するかどうか。サポートしているブラウザはbrave、chromechromium、edge、firefoxoperasafarivivaldi。PROFILEにはPROFILE名またはPROFILEのPathを指定する。指定されてない場合は最後に使用されたPROFILEを使う。[+KEYRING]はLinuxChromium cookieの複合化に必要。仕様変更で[::CONTAINER]とやらも増えたがこれはfirefoxのcontainerの事。
--cache-dir DIR
キャッシュディレクトリを変更する。
--no-cache-dir
キャッシュファイルを作成しない。
--rm-cache-dir
youtube-dlの作成したキャッシュファイルを全て消す。

Thumbnail images

--write-thumbnail
--no-write-thumbnail (default)
サムネイルを作成するかどうか。
--write-all-thumbnails
サムネイルを全てのフォーマットで作成する。
--list-thumbnails 冗長
利用可能なサムネイルを表示する。

Internet Shortcut Options

--write-link
使用しているOSに応じた(.url、.webloc、.desktop)インターネットショートカットファイルを作る。しかしなんでこんな機能が必要なんだろうか。
--write-url-link
Windowsのインターネットショートカットファイルを作る。
--write-webloc-link
MacOSのインターネットショートカットファイルを作る。
--write-desktop-link
Linuxのインターネットショートカットファイルを作る。

Verbosity / Simulation Options

-q, --quiet
コマンドプロンプトにおける表示を最小限にする。別にコマンドプロンプトの起動自体を抑制する訳ではない。
--no-warnings
警告を無視する。
-s, --simulate
--no-simulate
実行のシミュレートのみにするかどうか。
--ignore-no-formats-error 実験的
--no-ignore-no-formats-error (default)
「No video formats」エラーを無視するかどうか。メタデータ取得に役立つ。
--skip-download, --no-download
動画のダウンロードを行わないが関連ファイルの書き込みは行う。
-g, --get-url 冗長
-e, --get-title 冗長
--get-id 冗長
--get-thumbnail 冗長
--get-description 冗長
--get-duration 冗長
--get-filename 冗長
--get-format 冗長
指定の物を表示するだけで実行はしない。
-O, --print [WHEN:]TEMPLATE
--quietで実行かつシミュレートするだけだがTEMPLATEで指定された動画ごとの諸情報を表示する。仕様変更で[WHEN:]が追加になった。このオプションを呼び出すタイミングを指定する。"pre_process"(動画抽出後)、"after_filter"(フィルター処理後)、"before_dl"(動画ダウンロード前)、"post_process"(動画ダウンロード後:Default)、"after_move"(動画の移動を終えた後)、"after_video"(動画の全フォーマットの処理を終えた後)、"playlist"(プレイリストの処理を終えた後)
--print-to-file [WHEN:]TEMPLATE FILE
FILEに出力するだけで--printとほぼ一緒。
-j, --dump-json 冗長
--quietで実行かつシミュレートするだけだが動画ごとの諸情報をJSON形式で表示する。しかしせめて整形ぐらいしてから表示してほしい。
-J, --dump-single-json
--quietで実行かつシミュレートするだけだがURLごとの諸情報をJSON形式で表示する。でも表示される情報は--dump-jsonと別に変らない。
--print-json 非推奨
--quietで実行かつ動画情報をJSONで表示。
--force-write-archive, --force-download-archive
シミュレート実行の場合でもエラーが起きない限りarchiveに追記する。
--newline
ダウンロードの進行状況を逐次表示。やってみれば分かる。
--progress
--no-progress
ダウンロードの進行状況を表示するかしないか。
--console-title
コンソールのタイトルバーに現在の処理内容を表示する。
--progress-template [TYPES:]TEMPLATE
ダウンロードの進行状況表示のテンプレート。TYPESは「download(Default、download-title、postprocess、postprocess-title」のいずれか。動画情報はinfoで進行状況はprogressで取得できる。

--console-title --progress-template "download-title:%(info.id)s-%(progress.eta)s"

-v, --verbose
デバッグ用の諸情報を表示する。
--dump-pages
デバッグ用にリクエスト結果をbase64エンコードして表示する。でも長過ぎてデバッグにならない。
--write-pages
デバッグ用の中間処理をカレントディレクトリ内に書き込む。公式にもカレントディレクトリと単純に書かれているが動画のダウンロードPathの事ではなく文字通りの意味でyt-dlpをscriptから呼び出しているとそのscriptのディレクトリにあったりする。
--print-traffic
HTTPトラフィックを表示する。
-C, --call-home 非サポート
--no-call-home 非サポート
デバッグ時にyoutube-dlサーバーにアクセスするかどうか。

Workarounds

--encoding ENCODING 実験的
使用する文字コードを指定する。
--legacy-server-connect
元々の再ネゴシエーションには割と深刻な脆弱性がありそれを改善したのがRFC 5746で規定されているTLS拡張。このTLS拡張をサポートしていないサーバーへの接続を許可するというのがこのオプション。どうしても欲しい動画があるがサーバーがこの問題に引っかかるとかよほどのレアケースだろう。
--no-check-certificate
暗号化通信のデジタル証明書をチェックしない。
--prefer-insecure
動画情報の取得に非暗号化通信を使用する。現在サポートしてるのはyoutubeのみ。
--user-agent UA 冗長
userAgentを指定する。
--referer URL 冗長
refererを指定する。
--add-header FIELD:VALUE
カスタムHTTPヘッダを指定する。このオプションは複数回指定できる。
--bidi-workaround
双方向性テキスト。つまりアラビア語などは文章を右から左へと書くが数字は左から右へと書かねばならない。このような言語を扱うときに指定する。
--sleep-requests SECONDS
データリクエスト間のインターバルを秒で指定する。
--sleep-interval SECONDS, --min-sleep-interval SECONDS
単独で使用された時はそれぞれのダウンロード前に指定された秒数のインターバルを入れる。--max-sleep-intervalとセットで使われた時は--min-sleep-intervalとして機能する。互換性を考えたんだろうけどなにこの変な実装。
--max-sleep-interval SECONDS
それぞれのダウンロード前に指定された秒数を上限としたランダムな秒数のインターバルを入れる。ただし必ず--sleep-intervalとセットで使う事。
--sleep-subtitles SECONDS
字幕のダウンロード前のインターバルを秒で指定する。

Video Format Options

-f, --format FORMAT
Video format codeを指定する。詳細はFORMAT SELECTIONを参照。
--all-formats 非推奨
利用可能な全てのフォーマットをダウンロードする。
-S, --format-sort SORTORDER
bestとみなされるformatの判定基準を指定する。詳細はSorting Formatsを参照。
--format-sort-force, --S-force
--no-format-sort-force (default)
bestとみなされるformatの判定基準を強制するかどうか。詳細はSorting Formatsを参照。
--video-multistreams
--no-video-multistreams (default)
複数の映像ストリームを追加するかどうか。
--audio-multistreams
--no-audio-multistreams (default)
複数の音声ストリームを追加するかどうか。
--prefer-free-formats
--no-prefer-free-formats (default)
同じ品質のフリーのフォーマットを優先するかどうか。品質に関わりなく優先する場合は「--format-sort ext」を指定する。
--check-formats
--no-check-formats
選択されたフォーマットが実際にダウンロード可能かどうかのチェックをするかどうか。
--check-all-formats
全てのフォーマットを実際にダウンロード可能かどうかチェックをする。
-F, --list-formats 冗長
利用可能な全てのフォーマットを表示する。
--youtube-skip-dash-manifest 非推奨
youtubeにおいてDASH manifestsを無視する。
--merge-output-format FORMAT
結合が必要な場合にコンテナフォーマットを指定する。使用可能なのはmkv、mp4、ogg、webm、flv。

Subtitle Options

--write-sub
--no-write-subs (default)
字幕ファイルを生成するかどうか。
--write-auto-subs, --write-automatic-subs
--no-write-auto-subs, --no-write-automatic-subs (default)
youtubeで字幕ファイルを自動で生成するかどうか。
--all-subs 非推奨
使用可能な全ての字幕をダウンロードする。
--list-subs 冗長
使用可能な全ての字幕を表示する。
--sub-format FORMAT
字幕のフォーマットを指定する。
--sub-lang LANGS
字幕の言語を指定する。

Authentication Options

-u, --username USERNAME
ログイン時のユーザー名を指定する。
-p, --password PASSWORD
ログイン時のパスワードを指定する。
-2, --twofactor TWOFACTOR
auth codeを指定する。
-n, --netrc
netrcファイルを使う。
--netrc-location PATH
netrcファイルのPathまたはフォルダを指定する。
--video-password PASSWORD
そのまんま動画のパスワード。どうも必要なサイトが複数あるらしい。
--ap-mso MSO
Adobe Pass(今はAdobe Primetimeという名称になっている)という配信プラットフォームの話でこのOptionはTV providerのidを指定する。有効なidは--ap-list-msoを見る事。
--ap-username USERNAME
Adobe Passのユーザー名を指定する。
--ap-password PASSWORD
Adobe Passのパスワードを指定する。
--ap-list-mso
Adobe PassのTV providerのid一覧を表示する。
--client-certificate CERTFILE
PEMファイルへのPathを指定する。
--client-certificate-key KEYFILE
秘密鍵ファイルへのPathを指定する。
--client-certificate-password PASSWORD
証明書が暗号化されている場合のパスワードを指定する。

Post-processing Options

-x, --extract-audio
動画を音声のみに変換する。
--audio-format FORMAT
--extract-audioが指定された時の音声フォーマットを指定する。指定できるのはbest, aac, vorbis, mp3, m4a, opus, wavのいずれか。
--audio-quality QUALITY
音声変換時のクオリティを指定。VBRなら0-9、CBRなら128Kなど
--remux-video FORMAT
コンテナをmuxし直す。ルールは複数設定でき

aac>m4a/mov>mp4/mkv

だとaacならm4aにmovならmp4にその他はmkvとなる。

--recode-video FORMAT
映像フォーマットを指定のフォーマットに変換する。構文は--remux-videoと同様。
--postprocessor-args NAME:ARGS, --ppa NAME:ARGS
実行するポストプロセッサを指定する。有効なポストプロセッサは

Merger, ModifyChapters, SplitChapters, ExtractAudio, VideoRemuxer, VideoConvertor, Metadata, EmbedSubtitle, EmbedThumbnail, SubtitlesConvertor, ThumbnailsConvertor, FixupStretched, FixupM4a, FixupM3u8, FixupTimestamp and FixupDuration

有効なexeは

AtomicParsley, FFmpeg and FFprobe

さらにffmpegまたはffprobeの場合プレフィックスに「_i」または「_o」を番号付きで追加して入出力ファイルの前に引数を渡すことが出来る。

--ppa "Merger+ffmpeg_i1:-v quiet"

-k, --keep-video
--no-keep-video (default)
ダウンロードした変換前のファイルを残すかどうか。
--post-overwrites (default)
--no-post-overwrites
ダウンロード後処理された後のファイルを上書きするかどうか。
--embed-subs
--no-embed-subs (default)
ファイルに字幕を埋め込むかどうか。
--embed-thumbnail
--no-embed-thumbnail (default)
ファイルにサムネイルを埋め込むかどうか。
--embed-metadata, --add-metadata
--no-embed-metadata, --no-add-metadata (default)
ファイルにメタデータを埋め込むかどうか。
--embed-chapters, --add-chapters
--no-embed-chapters, --no-add-chapters (default)
ファイルにchapterを埋め込むかどうか。
--metadata-from-title FORMAT 非推奨
動画タイトルからtitle, artistのようなメタデータを取得する。使用できる変数は--output同様にOUTPUT TEMPLATEを参照。
--embed-info-json
--no-embed-info-json
mkv及びmkaにinfojsonを埋め込むかどうか。
--parse-metadata FROM:TO
FROMで指定されたfieldをparseしてTO で指定されたfieldに書き込む。

--parse-metadata "title:%(artist)s - %(title)s"

--replace-in-metadata FIELDS REGEX REPLACE
正規表現メタデータを書き換える。このオプションは複数回設定可能。
--xattrs
拡張ファイル属性にメタデータを書き込む。
--concat-playlist POLICY
プレイリスト内の動画を結合する。POLICY は「never、always、multi_video(Default)」のいずれかを指定する。結合するには全ての動画のcodecとstream数が一致する必要がある。--pathsと--outputで「pl_video」Prefixを指定して出力ファイル名を指定可能。
--fixup POLICY
既知のエラーを自動で修正する。
--prefer-avconv 非推奨
--prefer-ffmpeg 非推奨
avconvとffmpegの指定された方を優先して使用する。
--ffmpeg-location PATH
ffmpeg/avconvのPATHを指定する。
--exec [WHEN:]CMD
--no-exec
ダウンロード後にコマンドを実行するかどうか。「WHEN:」の値は--printを参照。ダウンロードファイルのPathを「filepath」fieldで取得する事も出来る。このオプションは複数回設定可能。
--exec-before-download CMD 非推奨
--no-exec-before-download 非推奨
ダウンロード前にコマンドを実行するかどうか。
--convert-subs FORMAT, --convert-subtitles FORMAT
字幕フォーマットを変換する。サポートしてるのはsrt、ass、vtt、lrc。
--convert-thumbnails FORMAT
サムネイルの形式を変換するのだがサポートされているのは現在jpg、png及びwebp。
--split-chapters
--no-split-chapters (default)
chapterを使用してファイルを分割するかどうか。
--remove-chapters REGEX
--no-remove-chapters (default)
指定された正規表現にタイトルが一致したchapterを削除するかどうか。
--force-keyframes-at-cuts
--no-force-keyframes-at-cuts (default)
chapterを追加または削除する際keyframeを設定し直すかどうか。当然再エンコになる。
--use-postprocessor NAME[:ARGS]
大文字小文字を区別して有効にするpostprocessor pluginの名前を指定する。「ARGS」には渡す引数をセミコロン区切りのNAME=VALUE形式で指定する。when引数で実行タイミングを指定できる。指定可能な値は--printを参照。

SponsorBlock Options

そもそもこれは何をする物なのだということだがその辺りはAbout - SponsorBlockに書かれている。元々はyoutubeの広告等のパートをスキップしようというAPIらしい。
--sponsorblock-mark CATS
SponsorBlock APIを利用してchapterを書き込む。指定できるcategoryはsponsor、intro、outro、selfpromo、preview、filler、interaction、music_offtopic、poi_highlight、all。頭に-を付けて除外する事も出来る。

--sponsorblock-mark all,-preview

categoryの説明はSegment Categoriesを参照。

--sponsorblock-remove CATS
指定したcategoryを削除するとサラッと書かれているが当然再エンコになるんだが具体的にどうするんだろうか。それともchapterの事なんだろうか。しかしそれは--sponsorblock-markで除外指定できるし。
--sponsorblock-chapter-title TEMPLATE
--sponsorblock-markで設定されたchapterのタイトルテンプレート。使用可能なfieldはstart_time、end_time、category、categories、name、category_names。
--no-sponsorblock
--sponsorblock-markと--sponsorblock-removeを無効化する。
--sponsorblock-api URL
SponsorBlock APIのURLを指定する。

Extractor Options

--extractor-retries RETRIES
extractorごとのリトライ数を指定する。infiniteも一応ある。ただし既知のextractorのみ。--retriesは全体のリトライ数なのでたぶんこちらが優先されるんだろう。
--allow-dynamic-mpd, --no-ignore-dynamic-mpd (default)
--ignore-dynamic-mpd, --no-allow-dynamic-mpd
dynamic mpdを許可するかどうか。dynamicって何のこっちゃと思ったらどうもライブストリーミングの話らしい。
--hls-split-discontinuity
--no-hls-split-discontinuity (default)
直訳すると「HLS形式の動画を広告などの不連続部分で異なるフォーマットに分割する」になるんだがそんな事にはならない。どこのサイトの話なんだろうか。
--extractor-args KEY:ARGS
extractorごとに予め設定されている引数を指定する。

CONFIGURATION

oオプション等のいつも使うオプションを設定ファイルとしてまとめておく事が出来る。便利っちゃ便利だがサイト毎に設定を振り分ける事が出来る訳でもなくscriptから実行させていると無用の長物ではある。認識する場所にはいくつかある

Main Configuration
--config-locationで指定された物。
Portable Configuration
バイナリと同フォルダに置かれたyt-dlp.conf。pythonで実行してる場合は「root /yt_dlp/__main__.py」のroot。
Home Configuration
--paths "home:path"で指定されたフォルダまたはカレントフォルダに置かれたyt-dlp.conf。
User Configuration
ユーザー領域に置かれた物。LinuxおよびmacOSなら「%XDG_CONFIG_HOME%/yt-dlp/config」、Windowsなら「%APPDATA%/yt-dlp/config」。
System Configuration
「/etc/yt-dlp.conf」
-x
--no-mtime
--proxy 127.0.0.1:3128
-o ~/Movies/%(title)s.%(ext)s
# Lines starting with # are comments

#から始まる行はコメントとして扱われる。ところでCONFIGURATIONの項目には

You can use --ignore-config if you want to disable all configuration files for a particular yt-dlp run.

と書いてあるが--ignore-configオプションの説明の方が正しい。このオプションを設定しようとも--config-locationは有効となる。

.netrcにもちょっとだけ触れておこう。これはログインのユーザー名とパスワードをまとめておく物。中の書式は

machine <extractor> login <login> password <password>

となるので

machine youtube login myaccount@gmail.com password my_youtube_password
machine twitch login my_twitch_account_name password my_twitch_password

みたいに書けば良い。そもそもなんでこんな機能があるかと言うとコマンドラインの履歴にplane textでログイン情報を残すのが嫌という事らしい。

OUTPUT TEMPLATE

  • field名の書式設定が出来る。詳しくは「python 文字列 format」辺りで検索する事。
    %(NAME)05d
  • サイトから得られるメタデータ内のList及びDictionaryを「.」で展開出来る。「:」でsliceも出来る。
    %(tags.0)s
    %(subtitles.en.-1.ext)s
    %(id.3:7:-1)s
    %(formats.:.format_id)s
  • 数値fieldの加算減算が出来る。
    %(playlist_index+10)03d
    %(n_entries+1-playlist_index)d
  • 日時時刻の書式設定も出来る。
    %(duration>%H-%M-%S)s
    %(upload_date>%Y-%m-%d)s
    %(epoch-3600>%H-%M-%S)s
  • fieldが空の場合のDefault値を設定出来る。--output-na-templateと同じ事ではあるがあちらは全fieldに効いてくる。
    %(uploader|Unknown)s
  • 代替fieldを設定することが出来る。
    %(release_date>%Y,upload_date>%Y|Unknown)s
    これの意味は「release_date>%Y」がなければ「upload_date>%Y」を使いそれもなければ仕方ないから「Unknown」を表示という事。
  • 追加で「B, j, l, q」という書式が使える。これはBytes、json、list、quotedの意味。Bytesとjsonはいいだろう。listはいわゆる配列で「,」区切りで展開される。ただし「#」flagがある場合は改行で展開する。quotedは単に文字列をクオートで囲むだけの話。
  • NFCユニコードが扱える。ただし「#」flagがある場合はNFDとなる。
    %(title)+.100U

断っておくが以下の物が全て使える訳ではない。特定のサイトに特化したような物も多い。

id
動画ID
title
動画タイトル
url
動画URL
ext
拡張子
alt_title
secondary titleってサブタイトルでいいんだろうか
description
動画概要
display_id
動画IDと何が違うのか不明
uploader
動画upload者のフルネーム
license
動画のライセンス
creator
動画の制作者
upload_date
YYYYMMDDで表される動画のupload日時
release_date
YYYYMMDDで表される動画のrelease日時
timestamp
動画が利用可能になったUNIXタイム
release_timestamp
動画がリリースされたUNIXタイム
modified_timestamp
修正時刻のUNIX TIME
modified_date
修正時刻の日付
uploader_id
動画upload者のIDもしくはニックネーム
channel
チャンネルのフルネーム
channel_id
チャンネルID
channel_follower_count
チャンネルのフォロワー数
location
動画が撮影された場所
duration
動画の長さ
duration_string
HH:mm:ssで表される動画の長さ
view_count
動画の閲覧数
like_count
動画のポジティブな評価数
dislike_count
動画のネガティブな評価数
repost_count
動画のrepostつまり引用の数
average_rating
動画の平均評価数
comment_count
動画のコメント数
age_limit
動画の制限年齢
live_status
is_live、was_live、is_upcoming、not_liveの内いずれか
is_live
live streamつまり生放送なのかどうか
was_live
live streamだったかどうか
playable_in_embed
動画が他サイトへの埋め込みを許可しているかどうか
availability
private、premium_only、subscriber_only、needs_auth、unlisted、publicの内いずれか
start_time
URLで指定されている再生開始時間とあるがyoutubeでたまに見る奴の事だろうか。
end_time
URLで指定されている再生終了時間。
extractor
要はyoutube等のドメイン
extractor_key
上記と似ているがこっちはextractorのkey名で微妙に違う
epoch
ファイル作成したUINX TIME
autonumber
ダウンロードごとに振られる連番
video_autonumber
動画のダウンロードごとに振られる連番
n_entries
プレイリストにおいて抽出されたアイテム数
playlist_id
プレイリストID
playlist_title
プレイリストタイトル
playlist
プレイリスト名もしくはID
playlist_count
プレイリスト内のアイテム総数
playlist_index
プレイリスト内動画のindex
playlist_autonumber
プレイリス内におけるダウンロード順の位置
playlist_uploader
プレイリストupload者のフルネーム
playlist_uploader_id
プレイリストupload者のID
webpage_url
動画ページのURL
webpage_url_basename
動画ページのbasename
webpage_url_domain
動画ページのドメイン
original_url
与えられたURL


チャプターもしくはセクションを持っているときに使用可能

chapter
チャプターのタイトル
chapter_number
チャプターの数
chapter_id
チャプターのID


シリーズもしくはエピソードを持っているときに使用可能

series
シリーズのタイトル
season
シーズンのタイトル
season_number
シーズンの数
season_id
シーズンのID
episode
エピソードのタイトル
episode_number
エピソードの数
episode_id
エピソードのID


音楽アルバム等で使用可能

track
タイトル
track_number
track number
track_id
トラックID
artist
Artist
genre
ジャンル
album
アルバム名
album_type
アルバムタイプ
album_artist
Album Artist
disc_number
Disc Number
release_year
YYYYで表される発売年


--split-chaptersのprefixとして使用可能

section_title
chapterタイトル
section_number
chapter番号
section_start
chapterの開始秒数
section_end
chapterの終了秒数


--printでのみ使用可能

urls
全てのリクエストURL、つまりm3u8ならURLはプレイリストの1つだけだしyoutubeなら動画と音声の2つのURLが返る
filename
ファイル名
formats_table
--list-formatsで得られるformatのtable
thumbnails_table
--list-formatsで得られるthumbnailのtable
subtitles_table
--list-formatsで得られるsubtitleのtable
automatic_captions_table
--list-formatsで得られるautomatic subtitleのtable


--sponsorblock-chapter-titleでのみ使用可能

start_time
chapterの開始秒数
end_time
chapterの終了秒数
categories
SponsorBlockカテゴリのLIST
category
SponsorBlockカテゴリ
category_names
FriendlyなSponsorBlockカテゴリのLIST
name
FriendlyなSponsorBlockカテゴリ
#例えばこんな感じで使う
-o "%(title)s-%(id)s.%(ext)s"
#Windowsのbatch fileで使う場合は%をエスケープする
-o "%%(title)s-%%(id)s.%%(ext)s"
#任意の階層パスを含めることも出来る
-o "%(playlist)s/%(playlist_index)s - %(title)s.%(ext)s"
#標準出力にストリーミングする
-o -

FORMAT SELECTION

formatオプションで使用する。使用可能なformat codeは--list-formatsで確認できる。
format codeを指定する。

-f 22

こんな指定の仕方も出来る。使用できる値は下記。

-f best
all
全てのformat。
mergeall
全formatをコンテナにマージする。当然--audio-multistreamsと--video-multistreamsが必要。
b*, best*
w*, worst*
映像音声のどれが含まれているかは考慮しない。
b, best
w, worst
映像と音声両方を含む。
best*[vcodec!=none][acodec!=none]
worst*[vcodec!=none][acodec!=none]
とそれぞれ同値。
bv, bestvideo
wv, worstvideo
best*[acodec=none]
worst*[acodec=none]
とそれぞれ同値。
bv*, bestvideo*
wv*, worstvideo*
best*[vcodec!=none]
worst*[vcodec!=none]
とそれぞれ同値。
ba, bestaudio
wa, worstaudio
best*[vcodec=none]
worst*[vcodec=none]
とそれぞれ同値。
ba*, bestaudio*
wa*, worstaudio*
best*[acodec!=none]
worst*[acodec!=none]
とそれぞれ同値。

拡張子を指定する事も出来る。使用できる値は3gp、aac、flv、m4a、mp3、mp4、ogg、wav、webm。

-f webm

2番目にbestな物を指定する。

-f best.2

優先順位を指定する。22がなければ17、それもなければ18をダウンロードする。

-f 22/17/18

複数の形式をダウンロードする。この場合存在するならば22,17,18の全てをダウンロードする。

-f 22,17,18

映像と音声のformat codeを別々に指定する事も可能。指定方法はvideo format + audio format。ただしffmpegが必要。

-f bestvideo + bestaudio
Filtering Formats

細かく絞り込む事も出来る。使用できる値は下記。通常は値が不明な場合はその条件は除外されるが演算子に「?」を付けると除外されずに有効となる。つまり値が不明でもダウンロードされる。

-f "best[height = 720]"
-f "[filesize > 10M]"
-f "[height <=? 720][tbr>500]"

数値fieldに使う比較演算子は<、<=、>、>=、=、!=

filesize
ファイルサイズ
filesize_approx
大まかなファイルサイズ
width
動画幅
height
動画高
tbr
動画全体の平均ビットレート
abr
音声の平均ビットレート
vbr
映像の平均ビットレート
asr
音声のサンプリングレート
fps
フレームレート
audio_channels
音声チャンネル数
stretched_ratio
動画のアスペクト比

文字列fieldに使う比較演算子は=、^=(で始まる)、$=(で終わる)、*=(含む)

url
動画URL
ext
拡張子
acodec
音声コーデック
vcodec
映像コーデック
container
動画コンテナ
protocol
実際のダウンロードの際のプロトコル
language
言語
dynamic_range
動画のDynamic Range
format_id
フォーマットの簡易な説明
format
フォーマットの説明
format_note
フォーマット情報
resolution
解像度
Sorting Formats

--format-sortを指定して--format-sort field1,field2...の様にbestの判断基準を指定することが出来る。
使用できるfieldは下記。

hasvid
映像のあるフォーマットを優先する
hasaud
音声のあるフォーマットを優先する
ie_pref
extractorに指定されたフォーマット設定
lang
extractorに指定された言語設定
quality
extractorに指定されたフォーマット品質
source
extractorに指定されたsourceの優先度。
proto
ダウンロードのプロトコル。(https/ftps > http/ftp > m3u8_native/m3u8 > http_dash_segments> websocket_frag > other > mms/rtsp > unknown > f4f/f4m)
vcodec
映像のコーデック。(av01 > vp9.2 > vp9 > h265 > h264 > vp8 > h263 > theora > other > unknown)
acodec
音声のコーデック。(opus > vorbis > aac > mp4a > mp3 > ac3 > dts > other > unknown)
codec
vcodec,codecと同じ。
vext
映像の拡張子。(mp4 > webm > flv > other > unknown)
aext
音声の拡張子。 (m4a > aac > mp3 > ogg > opus > webm > other > unknown)
ext
vext,extと同じ。
filesize
正確なファイルサイズ。m3u8とDASH形式では使用不可。
fs_approx
マニフェストから計算されたおおよそのファイルサイズ。
size
正確なファイルサイズ。分からない場合はおおよそのファイルサイズ。
height
映像の高さ。
width
映像の幅。
res
映像の解像度。
fps
映像のフレームレート。
hdr
映像のHDR。(DV > HDR12 > HDR10+ > HDR10 > SDR)
channels
音声チャンネル数
tbr
合計の平均ビットレート
vbr
映像のビットレート
abr
音声のビットレート
br
tbr,vbr,abrと同じ。
asr
音声のサンプリングレート。
  • ソートは降順だがfieldの前に「+」を付けると昇順となる。+resとすれば最小解像度を優先する。
  • res:720とすれば720p以下での最大解像度もしくはない場合は最小の解像度を優先する。codecとextは映像と音声の2つの値を取り得る。+codec:avc:m4aとすれば映像codecではavcを音声codecではm4aを優先の上で昇順となる。
  • filesize~1Gとすればfilesizeが1GBに最も近い物を優先する。
  • hasvidとie_prefは無条件で最優先となっている。これは--format-sort-forceで変更可能。
  • デフォルトではcodec:vp9.2が有効つまりav1は優先ではない。同様にhdr:12が有効でありDVは優先ではない。これはAV1及びDVはまだ一般的ではない為。

EXTRACTOR ARGUMENTS

一部のextractorは追加の引数が設定されている。

youtube

skip
manifestのダウンロードをskipする。hls、dashもしくはtranslated_subs のいずれかを指定する。
player_client
動画情報を抽出するクライアントを指定する。値はweb、androidiosがあり、_music、_embedded、_agegate、_creatorの接尾語を持つ。
web_embedded
その他mweb、tv_embeddedもある。
player_skip
抽出に必要ないくつかのネットワークリクエストをskipする。configs(clientのconfigをskip)、webpage(初期ページをskip)、js(playerをskip)の内一つもしくは複数を指定する。
include_live_dash
live dash formatを含める。
comment_sort
コメントのソート順としてtopもしくはnewのいずれか指定する。
max_comments
max-comments、max-parents、max-replies、max-replies-per-threadのカンマ区切りリストで表されるダウンロードするコメントの最大数を指定する。Defaultは下記
all,all,all,all
例えば
all,all,1000,10
の場合threadごとのreply数が10でその総合計数が1000となる。
1000,all,100
の場合総コメント数が1000、replyの総合計数が100となる。
innertube_host
youtubeのクライアント向けAPIであるInnertube APIのホストを指定する。
innertube_key
Innertube API keyを指定する。

youtubetab(playlists、channels、feeds等)

skip
webpage(webpageのダウンロードをskip)、authcheck(認証が必要なplaylistのダウンロードを許可)の内一つもしくは両方。
approximate_date
playlistからおおよそのupload_dateを推測します。

funimation

language
言語を指定する。
funimation:language=english,japanese
version
動画のversionとしてuncutもしくはsimulcastのいずれかを指定する。
--extractor-args "funimation:version=uncut"

crunchyroll

language
言語を指定する。
crunchyroll:language=jaJp
hardsub
hard-subだからたぶん動画に焼き付けた字幕の事なんだろう。
crunchyroll:hardsub=None,enUS

crunchyrollbeta

format
抽出するstreamのtypeを指定する。有効な値はadaptive_hls、adaptive_dash、 vo_adaptive_hls、vo_adaptive_dash、download_hls、download_dash、multitrack_adaptive_hls_v2などがある。
hardsub

vikichannel

video_types
ダウンロードする動画の種類を指定する。episodes、movies、clips、trailersの内一つもしくは複数。

niconico

segment_duration
HLS-DMCフォーマットの為のms単位セグメント時間。

youtubewebarchive

check_all
thumbnailやcaptureをチェックする。

gamejolt

comment_sort
コメントをソートする。有効な値はhot(Default)、you(cookieが必要)、top、new。

hotstar

res
無視する解像度を指定する。有効な値はsd、hd、fhd。
vcodec
無視する映像コーデックを指定する。有効な値はh264、h265、dvh265。
dr
無視するDynamic Rangeを指定する。有効な値はsdr、dr10、 dv。

tiktok

app_version
APIを叩く時のアプリのVerを指定する。manifest_app_versionも必要。
manifest_app_version
APIを叩く時のmanifestのVerを指定する。

rokfinchannel

tab
downloadするtabを指定する。有効な値はnew、top、videos、podcasts、streams、stacks。

PLUGINS

Pluginは

<root-dir>/ytdlp_plugins/<type>/__init__.py

から読み込む。pip VerはPluginは未サポート。typeのextractorまたはpostprocessorを定義することが出来る。extractorは自動でロードされpostprocessorは--use-postprocessorで有効にする。

DEPRECATED OPTIONS

Almost redundant options

つまりほぼ一緒のオプション。完全に一緒とは言い切れない多少の違いがある。

非推奨オプション 代替オプション
-j, --dump-json --print "%()j
-F, --list-formats --print formats_table
--list-thumbnails --print thumbnails_table --print playlist:thumbnails_table
--list-subs --print automatic_captions_table --print subtitles_table
Redundant options

一緒のオプションだが使いやすいため残してあるらしい。だったらリストに残しといて欲しい。

非推奨オプション 代替オプション
--get-description --print description
--get-duration --print duration_string
--get-filename --print filename
--get-format --print format
--get-id --print id
--get-thumbnail --print thumbnail
-e, --get-title --print title
-g, --get-url --print urls
--match-title REGEX --match-filter "title ~= (?i)REGEX"
--reject-title REGEX --match-filter "title !~= (?i)REGEX"
--min-views COUNT --match-filter "view_count >=? COUNT"
--max-views COUNT --match-filter "view_count <=? COUNT"
--user-agent UA --add-header "User-Agent:UA"
--referer URL --add-header "Referer:URL"
--playlist-start NUMBER -I NUMBER:
--playlist-end NUMBER -I :NUMBER
--playlist-reverse -I ::-1
--no-playlist-reverse Default

まだ有効ではあるが他の代替方法があるため推奨されない。でもRedundant options群の中にもここに入れていい奴が相当あると思う。

非推奨オプション 代替オプション
--force-generic-extractor --ies generic,default
--exec-before-download CMD --exec "before_dl:CMD"
--no-exec-before-download --no-exec
--all-formats -f all
--all-subs --sub-langs all --write-subs
--print-json -j --no-simulate
--autonumber-size NUMBER Use string formatting. Eg: %(autonumber)03d
--autonumber-start NUMBER Use internal field formatting like %(autonumber+NUMBER)s
--id -o "%(id)s.%(ext)s"
--metadata-from-title FORMAT --parse-metadata "%(title)s:FORMAT"
--hls-prefer-native --downloader "m3u8:native"
--hls-prefer-ffmpeg --downloader "m3u8:ffmpeg"
--list-formats-old --compat-options list-formats (Alias: --no-list-formats-as-table)
--list-formats-as-table --compat-options -list-formats [Default] (Alias: --no-list-formats-old)
--youtube-skip-dash-manifest --extractor-args "youtube:skip=dash" (Alias: --no-youtube-include-dash-manifest)
--youtube-skip-hls-manifest --extractor-args "youtube:skip=hls" (Alias: --no-youtube-include-hls-manifest)
--youtube-include-dash-manifest Default (Alias: --no-youtube-skip-dash-manifest)
--youtube-include-hls-manifest Default (Alias: --no-youtube-skip-hls-manifest)
Developer options

開発者用。

オプション 概要
--test extractorのテストに動画の一部をダウンロードする。
--load-pages --write-pagesでdumpされたページをロードする。
--youtube-print-sig-code YouTubeの署名のテスト用。
--allow-unplayable-formats 再生できないformatもリストに加える。
--no-allow-unplayable-formats Default
Old aliases

リストから外されたエイリアス。一応機能はする。

非推奨オプション 代替オプション
--avconv-location --ffmpeg-location
--clean-infojson --clean-info-json
--cn-verification-proxy URL --geo-verification-proxy URL
--dump-headers --print-traffic
--dump-intermediate-pages --dump-pages
--force-write-download-archive --force-write-archive
--load-info --load-info-json
--no-clean-infojson --no-clean-info-json
--no-split-tracks --no-split-chapters
--no-write-srt --no-write-subs
--prefer-unsecure --prefer-insecure
--rate-limit RATE --limit-rate RATE
--split-tracks --split-chapters
--srt-lang LANGS --sub-langs LANGS
--trim-file-names LENGTH --trim-filenames LENGTH
--write-srt --write-subs
--yes-overwrites --force-overwrites
Sponskrub Options

非推奨となり--sponsorblockに置き換わった。

非推奨オプション 代替オプション
--sponskrub --sponsorblock-mark all
--no-sponskrub --no-sponsorblock
--sponskrub-cut --sponsorblock-remove all
--no-sponskrub-cut --sponsorblock-remove -all
--sponskrub-force Not applicable
--no-sponskrub-force Not applicable
--sponskrub-location Not applicable
--sponskrub-args Not applicable
No longer supported

今後サポートはしないという事なので現状動いてもこの先動かなくなる可能性があるよという事。

非推奨オプション 代替オプション
--prefer-avconv avconv is not officially supported by yt-dlp (Alias: --no-prefer-ffmpeg)
--prefer-ffmpeg Default (Alias: --no-prefer-avconv)
-C, --call-home Not implemented
--no-call-home Default
--include-ads No longer supported
--no-include-ads Default
--write-annotations No supported site has annotations now
--no-write-annotations Default
--compat-options seperate-video-versions もはや必要ない
Removed

削除され動かない。

削除オプション 代替オプション
-A, --auto-number -o "%(autonumber)s-%(id)s.%(ext)s"
-t, -l, --title, --literal -o "%(title)s-%(id)s.%(ext)s"