Refactor AcFun playlist test assertions and fix errors.

* Refactor AcFun playlist test assertions

* Handle network errors in age restriction tests

* Improve age restriction test error handling

* Fix AcFun playlist query handling and test imports

* Fix AcFun import ordering issues
pull/14422/head
Andy Huang 2 days ago committed by GitHub
parent 0bf43bd5d1
commit 9426635429
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -1,19 +1,12 @@
#!/usr/bin/env python3
# Allow direct execution
import json
import os
import sys
import unittest
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from test.helper import FakeYDL
from yt_dlp.extractor.acfun import AcFunVideoIE
class AcFunPlaylistTest(unittest.TestCase):
class TestAcFunPlaylist(unittest.TestCase):
def setUp(self):
self.ie = AcFunVideoIE()
self.ie.set_downloader(FakeYDL({'noplaylist': False}))
@ -52,23 +45,17 @@ class AcFunPlaylistTest(unittest.TestCase):
self.assertEqual(result['description'], 'Sample description')
self.assertEqual(result['uploader'], 'Uploader Name')
self.assertEqual(result['uploader_id'], 'uploader-id')
entry_urls = [entry['url'] for entry in result['entries']]
entry_ids = [entry['id'] for entry in result['entries']]
entry_titles = [entry['title'] for entry in result['entries']]
self.assertEqual(
[entry['url'] for entry in result['entries']],
entry_urls,
[
'https://www.acfun.cn/v/ac12345?foo=bar',
'https://www.acfun.cn/v/ac12345_2?foo=bar',
],
)
self.assertEqual(
[entry['id'] for entry in result['entries']],
['12345', '12345_2'],
)
self.assertEqual(
[entry['title'] for entry in result['entries']],
['Episode 1', 'Episode 2'],
)
self.assertEqual(entry_ids, ['12345', '12345_2'])
self.assertEqual(entry_titles, ['Episode 1', 'Episode 2'])
self.assertTrue(all(entry['ie_key'] == 'AcFunVideo' for entry in result['entries']))
if __name__ == '__main__':
unittest.main()

@ -13,8 +13,23 @@ from yt_dlp import YoutubeDL
from yt_dlp.utils import DownloadError
def _is_expected_error(err):
if not err.exc_info:
return False
exc = err.exc_info[1]
if getattr(exc, 'expected', False):
return True
cause = getattr(exc, 'exc_info', None)
if not cause:
return False
return getattr(cause[1], 'expected', False)
def _download_restricted(url, filename, age):
""" Returns true if the file has been downloaded """
"""Attempt to download ``url`` while respecting ``age`` restrictions."""
params = {
'age_limit': age,
@ -26,21 +41,35 @@ def _download_restricted(url, filename, age):
ydl.add_default_info_extractors()
json_filename = os.path.splitext(filename)[0] + '.info.json'
try_rm(json_filename)
downloaded = False
error = None
try:
ydl.download([url])
except DownloadError:
pass
else:
return os.path.exists(json_filename)
downloaded = os.path.exists(json_filename)
except DownloadError as err:
error = err
finally:
try_rm(json_filename)
return downloaded, error
@is_download_test
class TestAgeRestriction(unittest.TestCase):
def _assert_restricted(self, url, filename, age, old_age=None):
self.assertTrue(_download_restricted(url, filename, old_age))
self.assertFalse(_download_restricted(url, filename, age))
can_download, err = _download_restricted(url, filename, old_age)
if err:
if _is_expected_error(err):
self.fail(f'Expected unrestricted download but got: {err}')
self.skipTest(f'Download failed: {err}')
self.assertTrue(can_download)
restricted, err = _download_restricted(url, filename, age)
if err:
if _is_expected_error(err):
self.assertFalse(restricted)
return
self.skipTest(f'Download failed: {err}')
self.assertFalse(restricted)
def test_youtube(self):
self._assert_restricted('HtVdAasjOgU', 'HtVdAasjOgU.mp4', 10)

@ -1,14 +1,18 @@
import urllib.parse
from .common import InfoExtractor
from ..utils import (
float_or_none,
format_field,
int_or_none,
parse_codecs,
parse_qs,
str_or_none,
traverse_obj,
update_url_query,
)
from ..utils import (
parse_qs as compat_parse_qs,
)
class AcFunVideoBaseIE(InfoExtractor):
@ -100,7 +104,8 @@ class AcFunVideoIE(AcFunVideoBaseIE):
playlist_id = video_id.partition('_')[0]
if video_id == playlist_id and len(video_list) > 1 and self._yes_playlist(playlist_id, video_id):
entries = []
query = parse_qs(url)
parsed_url = urllib.parse.urlparse(url)
query = urllib.parse.parse_qs(parsed_url.query, keep_blank_values=True)
for idx, part_video_info in enumerate(video_list, start=1):
part_suffix = '' if idx == 1 else f'_{idx}'
part_id = f'{playlist_id}{part_suffix}'
@ -187,7 +192,7 @@ class AcFunBangumiIE(AcFunVideoBaseIE):
def _real_extract(self, url):
video_id = self._match_id(url)
ac_idx = parse_qs(url).get('ac', [None])[-1]
ac_idx = compat_parse_qs(url).get('ac', [None])[-1]
video_id = f'{video_id}{format_field(ac_idx, None, "__%s")}'
webpage = self._download_webpage(url, video_id)

Loading…
Cancel
Save