import random import re import json import cloudscraper import time from streamlink.plugin import Plugin, pluginmatcher from streamlink.plugin.api import validate from streamlink.stream import HLSStream username = "katerinetailor" _url_re = re.compile(r"http(s)?://(www\.)?camsoda\.com/(?P<username>[^\"\']+)") scraper = cloudscraper.create_scraper() headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:135.0) Gecko/20100101 Firefox/135.0", "Referer": "https://www.camsoda.com", "Host": "www.camsoda.com" } API_URL_VIDEO = "https://camsoda.com/api/v1/video/vtoken/{0}?username=guest_{1}" url = API_URL_VIDEO.format(username, str(random.randint(1000, 99999))) print("URL:", url) response = scraper.get(url, headers=headers) status = response.status_code print("Status code:", status) data_video = response.json() print("Result:", data_video) time.sleep(300)
import random import re import json import cloudscraper from streamlink.plugin import Plugin, pluginmatcher from streamlink.plugin.api import validate from streamlink.stream import HLSStream _url_re = re.compile(r"http(s)?://(www\.)?camsoda\.com/(?P<username>[^\"\']+)") _api_video_schema = validate.Schema( { "token": str, "edge_servers": [str], "stream_name": str } ) scraper = cloudscraper.create_scraper() headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:135.0) Gecko/20100101 Firefox/135.0", "Referer": "https://www.camsoda.com", "Host": "www.camsoda.com" } @pluginmatcher(_url_re) class Camsoda(Plugin): API_URL_VIDEO = "https://camsoda.com/api/v1/video/vtoken/{0}?username=guest_{1}" HLS_URL_VIDEO_EDGE = "https://{server}/{stream_name}_v1/index.m3u8?token={token}" HLS_URL_VIDEO = "https://{server}/mp4:{stream_name}_aac/playlist.m3u8?token={token}" def _get_api_video(self, username): url = self.API_URL_VIDEO.format(username, str(random.randint(1000, 99999))) response = scraper.get(url, headers=headers) if response.status_code != 200: self.logger.error(f"Failed to get video API data, status code: {response.status_code}") return None try: data_video = response.json() if "status" in data_video and data_video["status"] == 0: self.logger.info(f"Nickname '{username}' is invalid") return None if "edge_servers" in data_video and not data_video["edge_servers"]: if "stream_name" in data_video: if not data_video["stream_name"]: self.logger.info(f"OFFLINE") else: self.logger.info(f"*****PRIVATE*****") return None validate.validate(_api_video_schema, data_video) except Exception as e: self.logger.error(f"Error parsing API response: {e}") return None return data_video def _get_streams(self): match = _url_re.match(self.url) username = match.group("username").replace("/", "") data_video = self._get_api_video(username) if not data_video: return hls_url = self.HLS_URL_VIDEO.format( server=data_video["edge_servers"][0], stream_name=data_video["stream_name"], token=data_video["token"] ) if "edge" in data_video["edge_servers"][0]: hls_url = self.HLS_URL_VIDEO_EDGE.format( server=data_video["edge_servers"][0], stream_name=data_video["stream_name"], token=data_video["token"] ) for s in HLSStream.parse_variant_playlist(self.session, hls_url).items(): yield s __plugin__ = Camsoda
Вчера, 22:43
Вчера, 20:07
Вчера, 08:33
4 сентября 2026 20:18
4 сентября 2026 19:47
2 сентября 2026 18:41
2 сентября 2026 17:53
2 сентября 2026 13:25
2 сентября 2026 11:48
2 сентября 2026 10:10
2 сентября 2026 03:40
2 сентября 2026 03:23
31 августа 2026 23:57
3 сентября 2026 20:39
27 августа 2026 08:06
24 августа 2026 01:42
23 августа 2026 19:13
23 августа 2026 15:41
23 августа 2026 13:53
22 августа 2026 22:59
18 августа 2026 20:47
14 августа 2026 19:19
14 августа 2026 11:54
13 августа 2026 10:36
9 августа 2026 08:38
23 июля 2026 07:29
13 июля 2026 14:28
13 июля 2026 10:34
9 июля 2026 06:04
8 июля 2026 22:47
8 июля 2026 22:03
8 июля 2026 22:00
8 июля 2026 20:56
8 июля 2026 20:19
8 июля 2026 05:07
2 июля 2026 18:17
14 июня 2026 09:59
10 июня 2026 16:15
31 мая 2026 23:34
31 мая 2026 16:13
30 мая 2026 10:33
29 мая 2026 18:20
29 мая 2026 16:17