Skip to content

Commit 12d187e

Browse files
committed
Test piramidetv.py
1 parent b4fd4ca commit 12d187e

File tree

2 files changed

+56
-80
lines changed

2 files changed

+56
-80
lines changed

yt_dlp/extractor/_extractors.py

-1
Original file line numberDiff line numberDiff line change
@@ -1567,7 +1567,6 @@
15671567
)
15681568
from .piramidetv import (
15691569
PiramideTVChannelIE,
1570-
PiramideTVChannelURLIE,
15711570
PiramideTVIE,
15721571
)
15731572
from .pixivsketch import (

yt_dlp/extractor/piramidetv.py

+56-79
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,6 @@
1-
import re
2-
3-
from .common import InfoExtractor, SearchInfoExtractor
4-
from ..utils import (
5-
parse_iso8601,
6-
traverse_obj,
7-
url_or_none,
8-
)
1+
from .common import InfoExtractor
2+
from ..utils import parse_iso8601, smuggle_url, unsmuggle_url, url_or_none
3+
from ..utils.traversal import traverse_obj
94

105

116
class PiramideTVIE(InfoExtractor):
@@ -27,101 +22,83 @@ class PiramideTVIE(InfoExtractor):
2722
'url': 'https://piramide.tv/video/wcYn6li79NgN',
2823
'info_dict': {
2924
'id': 'wcYn6li79NgN',
30-
'title': 'ACEPTO TENER UN BEBE CON MI NOVIA\u2026?',
25+
'ext': 'mp4',
26+
'title': 'ACEPTO TENER UN BEBE CON MI NOVIA\u2026? | Parte 1',
3127
'description': '',
3228
'channel': 'ARTA GAME',
3329
'channel_id': 'arta_game',
30+
'thumbnail': 'https://cdn.jwplayer.com/v2/media/cnEdGp5X/thumbnails/rHAaWfP7.jpg',
31+
'timestamp': 1703434976,
32+
'upload_date': '20231224',
3433
},
35-
'playlist_count': 4,
3634
}]
3735

38-
def _extract_video(self, video_id, fatal=True):
39-
video_data = self._download_json(
40-
f'https://hermes.piramide.tv/video/data/{video_id}', video_id, fatal=fatal)
41-
formats, subtitles = self._extract_m3u8_formats_and_subtitles(
42-
f'https://cdn.piramide.tv/video/{video_id}/manifest.m3u8', video_id, fatal=fatal)
43-
video_dict = {
44-
'id': video_id,
45-
**traverse_obj(video_data, ('video', {
46-
'id': ('id', {str}),
47-
'title': ('title', {str}),
48-
'description': ('description', {str}),
49-
'thumbnail': ('media', 'thumbnail', {url_or_none}),
50-
'channel': ('channel', 'name', {str}),
51-
'channel_id': ('channel', 'id', {str}),
52-
'timestamp': ('date', {parse_iso8601}),
53-
})),
54-
'formats': formats,
55-
'subtitles': subtitles,
56-
'webpage_url': f'https://piramide.tv/video/{video_id}',
57-
'webpage_url_basename': video_id,
58-
}
59-
next_video_id = traverse_obj(video_data, ('video', 'next_video', 'id', {str}))
60-
return video_dict, next_video_id
36+
def _extract_video(self, video_id):
37+
if video_data := self._download_json(
38+
f'https://hermes.piramide.tv/video/data/{video_id}', video_id, fatal=False):
39+
formats, subtitles = self._extract_m3u8_formats_and_subtitles(
40+
f'https://cdn.piramide.tv/video/{video_id}/manifest.m3u8', video_id, fatal=False)
41+
next_video = traverse_obj(video_data, ('video', 'next_video', 'id', {str}))
42+
return next_video, {
43+
'id': video_id,
44+
'formats': formats,
45+
'subtitles': subtitles,
46+
'webpage_url': f'https://piramide.tv/video/{video_id}',
47+
'original_url': f'https://piramide.tv/video/{video_id}',
48+
**traverse_obj(video_data, ('video', {
49+
'id': ('id', {str}),
50+
'title': ('title', {str}),
51+
'description': ('description', {str}),
52+
'thumbnail': ('media', 'thumbnail', {url_or_none}),
53+
'channel': ('channel', 'name', {str}),
54+
'channel_id': ('channel', 'id', {str}),
55+
'timestamp': ('date', {parse_iso8601}),
56+
})),
57+
}
58+
return None, {'id': video_id}
6159

62-
def _entries(self, video, video_id):
63-
if video:
64-
yield video
65-
while video_id is not None:
66-
video, next_video_id = self._extract_video(video_id, False)
67-
if video.get('formats'):
68-
yield video
69-
video_id = next_video_id if next_video_id != video_id else None
60+
def _entries(self, video_id):
61+
visited = set()
62+
while True:
63+
next_video, info = self._extract_video(video_id)
64+
yield info
65+
if not next_video or next_video in visited:
66+
break
67+
visited.add(next_video)
68+
video_id = next_video
7069

7170
def _real_extract(self, url):
71+
url, smuggled_data = unsmuggle_url(url, {})
7272
video_id = self._match_id(url)
73-
video, next_video_id = self._extract_video(video_id)
74-
if next_video_id and self._yes_playlist(video_id, video_id):
75-
return self.playlist_result(self._entries(video, next_video_id),
76-
**traverse_obj(video, {
77-
'id': ('id', {str}),
78-
'title': ('title', {str}, {lambda x: re.split(r'\s+\|?\s*Parte\s*\d', x,
79-
flags=re.IGNORECASE)[0]}),
80-
'description': ('description', {str}),
81-
'channel': ('channel', {str}),
82-
'channel_id': ('channel_id', {str}),
83-
}))
84-
return video
73+
if self._yes_playlist(video_id, video_id, smuggled_data):
74+
return self.playlist_result(self._entries(video_id), video_id)
75+
return self._extract_video(video_id)[1]
8576

8677

87-
class PiramideTVChannelURLIE(InfoExtractor):
78+
class PiramideTVChannelIE(InfoExtractor):
8879
_VALID_URL = r'https?://piramide\.tv/channel/(?P<id>[\w-]+)'
8980
_TESTS = [{
9081
'url': 'https://piramide.tv/channel/thekalo',
91-
'playlist_count': 10,
82+
'playlist_mincount': 10,
9283
'info_dict': {
9384
'id': 'thekalo',
94-
'title': 'thekalo',
95-
},
96-
}]
97-
98-
def _real_extract(self, url):
99-
if channel_id := self._match_id(url):
100-
return self.url_result(url=f'piramidetvall:{channel_id}', url_transparent=True)
101-
102-
103-
class PiramideTVChannelIE(SearchInfoExtractor):
104-
IE_NAME = 'PiramideTV:channel'
105-
_SEARCH_KEY = 'piramidetv'
106-
_TESTS = [{
107-
'url': 'piramidetv5:bobicraft',
108-
'playlist_count': 5,
109-
'info_dict': {
110-
'id': 'bobicraft',
111-
'title': 'bobicraft',
11285
},
11386
}]
11487

115-
def _search_results(self, channel_id):
88+
def _entries(self, channel_name):
11689
videos = self._download_json(
117-
f'https://hermes.piramide.tv/channel/list/{channel_id}/date/100000', channel_id)
90+
f'https://hermes.piramide.tv/channel/list/{channel_name}/date/100000', channel_name)
11891
for video in videos.get('videos', []):
11992
if video_id := video.get('id'):
120-
yield self.url_result(f'https://piramide.tv/video/{video_id}',
93+
yield self.url_result(smuggle_url(
94+
f'https://piramide.tv/video/{video_id}', {'force_noplaylist': True}),
12195
**traverse_obj(video, {
96+
'id': ('id', {str}),
12297
'title': ('title', {str}),
12398
'description': ('description', {str}),
124-
'thumbnail': ('media', 'thumbnail', {url_or_none}),
125-
'channel': ('channel', 'name', {str}),
126-
'channel_id': ('channel', 'id', {str}),
99+
'webpage_url': ('id', {str}, {lambda v: f'https://piramide.tv/video/{v}'}),
127100
}))
101+
102+
def _real_extract(self, url):
103+
channel_name = self._match_id(url)
104+
return self.playlist_result(self._entries(channel_name), channel_name)

0 commit comments

Comments
 (0)