[naver] support video downloads (#7395)

and fix 'date' for posts newer than 24h

- fix naver blogposts directory error for posts created less than 24 hours ago
- add support for videos on naver blogs
- refactor to remove unnecessary imports
- fix video url scraping method
- rework date handling
- rework video extraction
- add 'videos' option
- add test
This commit is contained in:
noxibow
2023-10-18 20:50:56 +09:00
committed by Mike Fährmann
parent abf39b60ef
commit 4c974debf5
4 changed files with 119 additions and 6 deletions

View File

@@ -9,7 +9,9 @@
"""Extractors for https://blog.naver.com/"""
from .common import GalleryExtractor, Extractor, Message
from .. import text
from .. import text, util
import datetime
import time
class NaverBase():
@@ -59,19 +61,66 @@ class NaverPostExtractor(NaverBase, GalleryExtractor):
"user" : extr("var nickName = '", "'"),
},
}
data["post"]["date"] = text.parse_datetime(
data["post"]["date"] = self._parse_datetime(
extr('se_publishDate pcol2">', '<') or
extr('_postAddDate">', '<'), "%Y. %m. %d. %H:%M")
extr('_postAddDate">', '<'))
return data
def _parse_datetime(self, date_string):
if "" in date_string:
ts = time.gmtime()
return datetime.datetime(ts.tm_year, ts.tm_mon, ts.tm_mday)
return text.parse_datetime(date_string, "%Y. %m. %d. %H:%M")
def images(self, page):
results = []
files = []
self._extract_images(files, page)
if self.config("videos", True):
self._extract_videos(files, page)
return files
def _extract_images(self, files, page):
for url in text.extract_iter(page, 'data-lazy-src="', '"'):
url = url.replace("://post", "://blog", 1).partition("?")[0]
if "\ufffd" in text.unquote(url):
url = text.unquote(url, encoding="EUC-KR")
results.append((url, None))
return results
files.append((url, None))
def _extract_videos(self, files, page):
for module in text.extract_iter(page, " data-module='", "'></"):
if '"v2_video"' not in module:
continue
media = util.json_loads(module)["data"]
try:
self._extract_media(files, media)
except Exception as exc:
self.log.warning("%s: Failed to extract video '%s' (%s: %s)",
self.post_id, media.get("vid"),
exc.__class__.__name__, exc)
def _extract_media(self, files, media):
url = ("https://apis.naver.com/rmcnmv/rmcnmv/vod/play/v2.0/" +
media["vid"])
params = {
"key" : media["inkey"],
"sid" : "2",
# "pid": "00000000-0000-0000-0000-000000000000",
"nonce": int(time.time()),
"devt" : "html5_pc",
"prv" : "N",
"aup" : "N",
"stpb" : "N",
"cpl" : "ko_KR",
"providerEnv": "real",
"adt" : "glad",
"lc" : "ko_KR",
}
data = self.request(url, params=params).json()
video = max(data["videos"]["list"],
key=lambda v: v.get("size") or 0)
files.append((video["source"], video))
class NaverBlogExtractor(NaverBase, Extractor):