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
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:134.0) Gecko/20100101 Firefox/134.0", "Referer": "https://www.camsoda.com" } @pluginmatcher(_url_re) class Camsoda(Plugin): API_URL_VIDEO = "https://www.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
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:134.0) Gecko/20100101 Firefox/134.0", "Referer": "https://www.camsoda.com" } proxies = { "http": "http://127.0.0.1:2080", "https": "http://127.0.0.1:2080" } @pluginmatcher(_url_re) class Camsoda(Plugin): API_URL_VIDEO = "https://www.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, proxies=proxies) 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
Сегодня, 02:02
Сегодня, 00:58
Вчера, 15:48
Вчера, 15:20
Вчера, 13:46
Вчера, 12:51
Вчера, 08:42
8 марта 2026 23:28
8 марта 2026 18:42
8 марта 2026 18:10
7 марта 2026 19:37
7 марта 2026 17:59
7 марта 2026 08:54
7 марта 2026 02:47
25 февраля 2026 18:39
19 февраля 2026 20:48
16 февраля 2026 15:27
14 февраля 2026 16:33
5 февраля 2026 01:07
3 февраля 2026 18:18
20 января 2026 21:11
20 января 2026 16:37
20 января 2026 10:47
19 января 2026 00:38
15 января 2026 22:17
15 января 2026 18:49
14 января 2026 02:49
12 января 2026 23:18
4 января 2026 09:47
3 января 2026 14:32
30 декабря 2025 03:05
26 декабря 2025 21:29
22 декабря 2025 21:38
13 декабря 2025 14:51
11 декабря 2025 19:56
4 декабря 2025 03:37
3 декабря 2025 16:48
2 декабря 2025 15:12
1 декабря 2025 12:23
30 ноября 2025 03:07
28 ноября 2025 14:44
27 ноября 2025 08:24
25 ноября 2025 11:09
25 ноября 2025 10:53