Compare commits

...

4 Commits

Author SHA1 Message Date
Aaron Tan 0c195f84bc
Merge e1dc38319c into e0727e4ab6 2024-04-21 14:09:24 +02:00
dirkf e0727e4ab6 [postprocessor/ffmpeg] Fix finding ffprobe (bug in 21792b8)
Fixes 21792b88b7 (commitcomment-140705274), thx: vonProteus
2024-04-07 15:33:30 +01:00
Ori Avtalion 4ea59c6107
[utils] Fix crash in _report_ignoring_subs from c58b655 (#32762)
Align `utils.bug_reports_message()` with yt-dlp https://github.com/yt-dlp/yt-dlp/commit/5873d4ccdd, thanks fstirlitz

---------

Co-authored-by: dirkf <fieldhouse@gmx.net>
2024-04-05 15:25:29 +01:00
Aaron Tan e1dc38319c [erocast] Update erocast
Build on code from PR #31631.
- Add playlist info extractor to download playlists
- Refactor code from suggestions by @dirkf
2023-08-16 16:24:46 +10:00
4 changed files with 129 additions and 11 deletions

View File

@ -0,0 +1,99 @@
# coding: utf-8
from __future__ import unicode_literals
from .common import InfoExtractor
from ..utils import traverse_obj
import re
class ErocastIE(InfoExtractor):
IE_NAME = 'erocast'
_VALID_URL = r'https?://(?:www\.)?erocast\.me/track/(?P<id>[0-9]+)/(?P<display_id>[0-9a-zA-Z_-]+)'
_TESTS = [{
'url': 'https://erocast.me/track/6508/piano-sample-by-ytdl',
'md5': '6764726b2d19161e93c9cf3a9a69800a',
'info_dict': {
'id': '6508',
'ext': 'mp4',
'title': 'Piano sample by ytdl',
'uploader': 'ytdl',
}
}, {
'url': 'https://erocast.me/track/4254/intimate-morning-with-your-wife',
'md5': '45b06c21cf93612dd72a3d764c0bb362',
'info_dict': {
'id': '4254',
'ext': 'mp4',
'title': 'Intimate morning with your wife',
'uploader': 'ZLOY_ASMR',
}
}, {
'url': 'https://erocast.me/playlist/2278/rough-hot-and-dirty',
'only_matching': True
}]
def _real_extract(self, url):
video_id = self._match_id(url)
webpage = self._download_webpage(url, video_id)
# The Song data is in a script tag with the following format:
# (see https://github.com/ytdl-org/youtube-dl/issues/31203#issuecomment-1259867716)
searchPattern = r'<script\b[^>]*>var\s+song_data_%s\s*=\s*(.+?)</script>' % re.escape(video_id)
jsonString = self._html_search_regex(searchPattern, webpage, 'song_data')
# The data is in JSON format, so we convert the JSON String to a python object
# and read the data from this json object
jsonObject = self._parse_json(jsonString, None, fatal=False)
audio_url = jsonObject['stream_url']
title = jsonObject['title']
user_name = traverse_obj(jsonObject, ('user', 'name'), expected_type=lambda x: x.strip() or None)
# The audio url is a m3u8 playlist, so we extract the audio url from this playlist
formats = self._extract_m3u8_formats(
audio_url, video_id, 'mp4', 'm3u8_native',
m3u8_id='hls', fatal=False)
self._sort_formats(formats)
return {
'id': video_id,
'formats': formats,
'title': title,
'uploader': user_name,
}
class ErocastPlaylistIE(InfoExtractor):
_VALID_URL = r'https?://(?:www\.)?erocast\.me/playlist/(?P<playlist_id>[0-9]+)/(?P<playlist_title>[0-9a-zA-Z_-]+)'
_TESTS = [{
'url': 'https://erocast.me/playlist/2278/rough-hot-and-dirty',
'info_dict': {
'id': '2278',
'title': 'rough-hot-and-dirty',
},
'playlist_mincount': 3,
}, {
'url': 'https://erocast.me/playlist/1841/dilf',
'info_dict': {
'id': '1841',
'title': 'dilf',
},
'playlist_mincount': 7,
}]
def _real_extract(self, url):
mobj = re.match(self._VALID_URL, url)
playlist_id = mobj.group('playlist_id')
title = mobj.group('playlist_title')
webpage = self._download_webpage(url, playlist_id)
# Get URL for each track in the playlist
entries = [self.url_result(
'https://erocast.me/track/' + mobj.group('song_id') + '/' + mobj.group('track_url'),
ie=ErocastIE.ie_key(), video_id=mobj.group('song_id'))
for mobj in re.finditer(
r'<script\b[^>]*>var\s+song_data_(?P<song_id>[0-9]+)\s*=\s*.+?\\/track\\/[0-9]+\\/(?P<track_url>.+)\"\,\"stream_url.+?</script>', webpage)]
return self.playlist_result(entries, playlist_id, title)

View File

@ -360,6 +360,10 @@ from .embedly import EmbedlyIE
from .engadget import EngadgetIE from .engadget import EngadgetIE
from .epidemicsound import EpidemicSoundIE from .epidemicsound import EpidemicSoundIE
from .eporner import EpornerIE from .eporner import EpornerIE
from .erocast import (
ErocastIE,
ErocastPlaylistIE,
)
from .eroprofile import EroProfileIE from .eroprofile import EroProfileIE
from .escapist import EscapistIE from .escapist import EscapistIE
from .espn import ( from .espn import (

View File

@ -74,8 +74,11 @@ class FFmpegPostProcessor(PostProcessor):
return FFmpegPostProcessor(downloader)._versions return FFmpegPostProcessor(downloader)._versions
def _determine_executables(self): def _determine_executables(self):
programs = ['avprobe', 'avconv', 'ffmpeg', 'ffprobe'] # ordered to match prefer_ffmpeg!
convs = ['ffmpeg', 'avconv']
probes = ['ffprobe', 'avprobe']
prefer_ffmpeg = True prefer_ffmpeg = True
programs = convs + probes
def get_ffmpeg_version(path): def get_ffmpeg_version(path):
ver = get_exe_version(path, args=['-version']) ver = get_exe_version(path, args=['-version'])
@ -127,10 +130,13 @@ class FFmpegPostProcessor(PostProcessor):
(p, get_ffmpeg_version(self._paths[p])) for p in programs) (p, get_ffmpeg_version(self._paths[p])) for p in programs)
if x[1] is not None) if x[1] is not None)
for p in ('ffmpeg', 'avconv')[::-1 if prefer_ffmpeg is False else 1]: basenames = [None, None]
if self._versions.get(p): for i, progs in enumerate((convs, probes)):
self.basename = self.probe_basename = p for p in progs[::-1 if prefer_ffmpeg is False else 1]:
break if self._versions.get(p):
basenames[i] = p
break
self.basename, self.probe_basename = basenames
@property @property
def available(self): def available(self):

View File

@ -2371,15 +2371,24 @@ def make_HTTPS_handler(params, **kwargs):
return YoutubeDLHTTPSHandler(params, context=context, **kwargs) return YoutubeDLHTTPSHandler(params, context=context, **kwargs)
def bug_reports_message(): def bug_reports_message(before=';'):
if ytdl_is_updateable(): if ytdl_is_updateable():
update_cmd = 'type youtube-dl -U to update' update_cmd = 'type youtube-dl -U to update'
else: else:
update_cmd = 'see https://yt-dl.org/update on how to update' update_cmd = 'see https://github.com/ytdl-org/youtube-dl/#user-content-installation on how to update'
msg = '; please report this issue on https://yt-dl.org/bug .'
msg += ' Make sure you are using the latest version; %s.' % update_cmd msg = (
msg += ' Be sure to call youtube-dl with the --verbose flag and include its complete output.' 'please report this issue on https://github.com/ytdl-org/youtube-dl/issues ,'
return msg ' using the appropriate issue template.'
' Make sure you are using the latest version; %s.'
' Be sure to call youtube-dl with the --verbose option and include the complete output.'
) % update_cmd
before = (before or '').rstrip()
if not before or before.endswith(('.', '!', '?')):
msg = msg[0].title() + msg[1:]
return (before + ' ' if before else '') + msg
class YoutubeDLError(Exception): class YoutubeDLError(Exception):