download, thumbnail, sub API에 headers 키 추가

This commit is contained in:
joyfuI
2022-07-24 21:56:46 +09:00
parent 26e4f96d49
commit 3410ddd73c
4 changed files with 32 additions and 6 deletions

View File

@@ -15,7 +15,7 @@ SJVA에서 "시스템 → 플러그인 → 플러그인 수동 설치" 칸에
API를 제공합니다. 다른 플러그인에서 동영상 정보나 다운로드를 요청할 수 있습니다.
다른 플러그인이 멋대로 다운로드를 중지할 수 없도록 다운로드를 요청할 때 임의의 키를 넘겨받습니다. 중지 요청 시 키가 일치해야 요청이 실행됩니다.
[youtube-dl](https://github.com/ytdl-org/youtube-dl)의 DMCA 테이크다운 사태 이후, 비슷한 상황을 대비하기 위해 youtube-dl의 포크 프로젝트 [youtube-dlc](https://github.com/blackjack4494/yt-dlc)의 포크 프로젝트(...)인 [yt-dlp](https://github.com/pukkandan/yt-dlp)를 추가했습니다.
[youtube-dl](https://github.com/ytdl-org/youtube-dl)의 DMCA 테이크다운 사태 이후, 비슷한 상황을 대비하기 위해 youtube-dl의 포크 프로젝트 [youtube-dlc](https://github.com/blackjack4494/yt-dlc)의 포크 프로젝트(...)인 [yt-dlp](https://github.com/yt-dlp/yt-dlp)를 추가했습니다.
설정에서 취향껏 골라서 사용하시면 되며 youtube-dl가 우선 지원됩니다.
## API
@@ -93,8 +93,10 @@ API를 제공합니다. 다른 플러그인에서 동영상 정보나 다운로
| `archive` | 다운로드한 동영상의 ID를 기록할 파일 경로. 파일이 이미 있으면 이미 다운로드한 동영상은 다운로드 하지 않음. 미지정 시 기록하지 않음 | X | String |
| `start` | 다운로드 준비 후 바로 다운로드를 시작할지 여부. 기본값: `false` | X | Boolean |
| `cookiefile` | 다운로드 시 필요한 쿠키 파일 경로 | X | String |
| `headers` | 다운로드 시 사용할 HTTP 헤더 정보 | X | String |
`dateafter` 키에 넣을 수 있는 날짜는 `"YYYYMMDD"` 또는 `"(now|today)[+-][0-9](day|week|month|year)(s)?"` 형식의 문자열입니다.
`dateafter` 키에 넣을 수 있는 날짜는 `"YYYYMMDD"` 또는 `"(now|today)[+-][0-9](day|week|month|year)(s)?"` 형식의 문자열입니다.
`headers` 키에 넣는 값은 `json` 형식의 문자열입니다.
`playlist` 키에 넣을 수 있는 값은 `"1-3,7,10-13"` 형식의 범위 또는 `"reverse"`, `"random"`입니다.
범위를 넣으면 플레이리스트에서 선택한 것만 다운로드합니다.
@@ -127,8 +129,10 @@ API를 제공합니다. 다른 플러그인에서 동영상 정보나 다운로
| `archive` | 다운로드한 동영상의 ID를 기록할 파일 경로. 파일이 이미 있으면 이미 다운로드한 동영상은 다운로드 하지 않음. 미지정 시 기록하지 않음 | X | String |
| `start` | 다운로드 준비 후 바로 다운로드를 시작할지 여부. 기본값: `false` | X | Boolean |
| `cookiefile` | 다운로드 시 필요한 쿠키 파일 경로 | X | String |
| `headers` | 다운로드 시 사용할 HTTP 헤더 정보 | X | String |
`dateafter` 키에 넣을 수 있는 날짜는 `"YYYYMMDD"` 또는 `"(now|today)[+-][0-9](day|week|month|year)(s)?"` 형식의 문자열입니다.
`dateafter` 키에 넣을 수 있는 날짜는 `"YYYYMMDD"` 또는 `"(now|today)[+-][0-9](day|week|month|year)(s)?"` 형식의 문자열입니다.
`headers` 키에 넣는 값은 `json` 형식의 문자열입니다.
`playlist` 키에 넣을 수 있는 값은 `"1-3,7,10-13"` 형식의 범위 또는 `"reverse"`, `"random"`입니다.
범위를 넣으면 플레이리스트에서 선택한 것만 다운로드합니다.
@@ -163,8 +167,10 @@ API를 제공합니다. 다른 플러그인에서 동영상 정보나 다운로
| `archive` | 다운로드한 동영상의 ID를 기록할 파일 경로. 파일이 이미 있으면 이미 다운로드한 동영상은 다운로드 하지 않음. 미지정 시 기록하지 않음 | X | String |
| `start` | 다운로드 준비 후 바로 다운로드를 시작할지 여부. 기본값: `false` | X | Boolean |
| `cookiefile` | 다운로드 시 필요한 쿠키 파일 경로 | X | String |
| `headers` | 다운로드 시 사용할 HTTP 헤더 정보 | X | String |
`dateafter` 키에 넣을 수 있는 날짜는 `"YYYYMMDD"` 또는 `"(now|today)[+-][0-9](day|week|month|year)(s)?"` 형식의 문자열입니다.
`dateafter` 키에 넣을 수 있는 날짜는 `"YYYYMMDD"` 또는 `"(now|today)[+-][0-9](day|week|month|year)(s)?"` 형식의 문자열입니다.
`headers` 키에 넣는 값은 `json` 형식의 문자열입니다.
`playlist` 키에 넣을 수 있는 값은 `"1-3,7,10-13"` 형식의 범위 또는 `"reverse"`, `"random"`입니다.
범위를 넣으면 플레이리스트에서 선택한 것만 다운로드합니다.
@@ -248,6 +254,8 @@ API를 제공합니다. 다른 플러그인에서 동영상 정보나 다운로
v4.0.0
- 최신 플러그인 구조로 변경
- download, thumbnail, sub API에 headers 키 추가
http 헤더 수정이 필요한 경우 활용할 수 있습니다.
v3.1.1

View File

@@ -333,6 +333,8 @@ class LogicMain(LogicModuleBase):
opts["ffmpeg_location"] = kwagrs["ffmpeg_path"]
if "cookiefile" in kwagrs and kwagrs["cookiefile"]:
opts["cookiefile"] = kwagrs["cookiefile"]
if "headers" in kwagrs and kwagrs["headers"]:
opts["http_headers"] = kwagrs["headers"]
dateafter = kwagrs.get("dateafter")
youtube_dl = MyYoutubeDL(
plugin, "video", url, filename, temp_path, save_path, opts, dateafter
@@ -377,6 +379,8 @@ class LogicMain(LogicModuleBase):
opts["ffmpeg_location"] = kwagrs["ffmpeg_path"]
if "cookiefile" in kwagrs and kwagrs["cookiefile"]:
opts["cookiefile"] = kwagrs["cookiefile"]
if "headers" in kwagrs and kwagrs["headers"]:
opts["http_headers"] = kwagrs["headers"]
dateafter = kwagrs.get("dateafter")
youtube_dl = MyYoutubeDL(
plugin,
@@ -432,6 +436,8 @@ class LogicMain(LogicModuleBase):
opts["ffmpeg_location"] = kwagrs["ffmpeg_path"]
if "cookiefile" in kwagrs and kwagrs["cookiefile"]:
opts["cookiefile"] = kwagrs["cookiefile"]
if "headers" in kwagrs and kwagrs["headers"]:
opts["http_headers"] = kwagrs["headers"]
dateafter = kwagrs.get("dateafter")
youtube_dl = MyYoutubeDL(
plugin, "subtitle", url, filename, temp_path, save_path, opts, dateafter

View File

@@ -118,7 +118,10 @@ class MyYoutubeDL:
self.status = Status.START
# 동영상 정보 가져오기
info_dict = MyYoutubeDL.get_info_dict(
self.url, self.opts.get("proxy"), self.opts.get("cookiefile")
self.url,
self.opts.get("proxy"),
self.opts.get("cookiefile"),
self.opts.get("http_headers"),
)
if info_dict is None:
self.status = Status.ERROR
@@ -174,7 +177,7 @@ class MyYoutubeDL:
return __version__
@staticmethod
def get_info_dict(url, proxy=None, cookiefile=None):
def get_info_dict(url, proxy=None, cookiefile=None, http_headers=None):
# import youtube_dl
youtube_dl = __import__(youtube_dl_package)
@@ -184,6 +187,8 @@ class MyYoutubeDL:
ydl_opts["proxy"] = proxy
if cookiefile:
ydl_opts["cookiefile"] = cookiefile
if http_headers:
ydl_opts["http_headers"] = http_headers
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
info = ydl.extract_info(url, download=False)
except Exception as error:

View File

@@ -1,5 +1,6 @@
import os
import traceback
import json
from flask import Blueprint, request, jsonify, abort
@@ -121,6 +122,7 @@ def api(sub):
archive = request.values.get("archive", None)
start = request.values.get("start", False)
cookiefile = request.values.get("cookiefile", None)
headers = request.values.get("headers", None)
ret = {"errorCode": 0, "index": None}
if None in (key, url):
return LogicAbort.abort(ret, 1) # 필수 요청 변수가 없음
@@ -157,6 +159,7 @@ def api(sub):
ffmpeg_path=Plugin.ModelSetting.get("ffmpeg_path"),
key=key,
cookiefile=cookiefile,
headers=json.loads(headers),
)
if youtube_dl is None:
return LogicAbort.abort(ret, 10) # 실패
@@ -181,6 +184,7 @@ def api(sub):
archive = request.values.get("archive", None)
start = request.values.get("start", False)
cookiefile = request.values.get("cookiefile", None)
headers = request.values.get("headers", None)
ret = {"errorCode": 0, "index": None}
if None in (key, url):
return LogicAbort.abort(ret, 1) # 필수 요청 변수가 없음
@@ -202,6 +206,7 @@ def api(sub):
ffmpeg_path=Plugin.ModelSetting.get("ffmpeg_path"),
key=key,
cookiefile=cookiefile,
headers=json.loads(headers),
)
if youtube_dl is None:
return LogicAbort.abort(ret, 10) # 실패
@@ -228,6 +233,7 @@ def api(sub):
archive = request.values.get("archive", None)
start = request.values.get("start", False)
cookiefile = request.values.get("cookiefile", None)
headers = request.values.get("headers", None)
ret = {"errorCode": 0, "index": None}
if None in (key, url):
return LogicAbort.abort(ret, 1) # 필수 요청 변수가 없음
@@ -251,6 +257,7 @@ def api(sub):
ffmpeg_path=Plugin.ModelSetting.get("ffmpeg_path"),
key=key,
cookiefile=cookiefile,
headers=json.loads(headers),
)
if youtube_dl is None:
return LogicAbort.abort(ret, 10) # 실패