copy playlist from camsites

Play video from stripchat, chaturbate and many other cam sites in vlc, potplayer or a streamrecorder

  1. // ==UserScript==
  2. // @name copy playlist from camsites
  3. // @namespace everywhere
  4. // @version 1.0.7
  5. // @description Play video from stripchat, chaturbate and many other cam sites in vlc, potplayer or a streamrecorder
  6. // @author ladroop
  7. // @match https://*.stripchat.com/*
  8. // @match https://*.camsoda.com/*
  9. // @match https://*streamray.com/*
  10. // @match https://*cams.com/*
  11. // @match https://www.streamate.com/cam/*
  12. // @match https://streamate.com/cam/*
  13. // @match https://*.cam4.com/*
  14. // @match https://*.bongacams.com/*
  15. // @match https://www.flirt4free.com/*
  16. // @match https://www.xlovecam.com/*
  17. // @match https://www.myfreecams.com/*
  18. // @match https://dreamcam.com/*
  19. // @match https://www.olecams.com/*
  20. // @match https://*showup.tv/*
  21. // @match https://www.eplay.com/*
  22. // @match https://*chaturbate.com/*
  23. // @match https://*sinparty.com/*
  24. // @license MIT
  25. // @grant none
  26. // ==/UserScript==
  27.  
  28.  
  29.  
  30. (function() {
  31. 'use strict';
  32.  
  33. makepopitup();
  34. var pageurl=document.location.href;
  35. var n=0;
  36. var playlist="";
  37. var reload=false;
  38. var needreload=false;
  39. var observer= new MutationObserver(pagechange);
  40. var observerConfig = {subtree: true, characterData: true, childList: true };
  41.  
  42. if (pageurl.indexOf("xlovecam.com")!=-1){
  43. needreload=true;
  44. }
  45. if (pageurl.indexOf("eplay.com")!=-1){
  46. needreload=true;
  47. }
  48. if (pageurl.indexOf("camsoda")!=-1){
  49. needreload=true;
  50. localStorage.clear();
  51. }
  52. if (pageurl.indexOf("bongacams")!=-1){
  53. needreload=true;
  54. localStorage.clear();
  55. }
  56. pagechange1();
  57.  
  58. observer.observe(document.getElementsByTagName("head")[0],observerConfig);
  59.  
  60. function pagechange(){
  61. if (pageurl.split("?")[1]=="flow=join"){return;}
  62. if (document.location.href.split("?")[1]=="flow=join"){return;}
  63. if (pageurl!= document.location.href){
  64. pageurl=document.location.href;
  65. pagechange1();
  66. }
  67. }
  68.  
  69. function pagechange1(){
  70. if(needreload&&reload){
  71. document.location.reload();
  72. }
  73. reload=true;
  74. playlist="";
  75. document.getElementById("popitup1").style.display="none";
  76. document.getElementById("popitup").innerHTML="";
  77. setTimeout(selectsite,5000);
  78. }
  79.  
  80. function selectsite(){
  81. n=0;
  82. if (pageurl.indexOf("sinparty")!=-1){
  83. sinparty();
  84. return;
  85. }
  86. if (pageurl.indexOf("showup")!=-1){
  87. showup();
  88. return;
  89. }
  90. if (pageurl.indexOf("olecams")!=-1){
  91. olecams();
  92. return;
  93. }
  94. if (pageurl.indexOf("dreamcam")!=-1){
  95. dreamcam();
  96. return;
  97. }
  98. if (pageurl.indexOf("chaturbate")!=-1){
  99. chaturbate();
  100. return;
  101. }
  102. if (pageurl.indexOf("myfreecams")!=-1){
  103. mfc();
  104. return;
  105. }
  106. if (pageurl.indexOf("stripchat")!=-1){
  107. stripchat();
  108. return;
  109. }
  110. if (pageurl.indexOf("camsoda")!=-1){
  111. camsoda();
  112. return;
  113. }
  114. if (pageurl.indexOf("bongacams")!=-1){
  115. bongacams();
  116. return;
  117. }
  118. if (pageurl.indexOf("streamray")!=-1){
  119. streamray();
  120. return;
  121. }
  122. if (pageurl.indexOf("cams.com")!=-1){
  123. streamray();
  124. return;
  125. }
  126. if (pageurl.indexOf("streamate")!=-1){
  127. streamate();
  128. return;
  129. }
  130. if (pageurl.indexOf("cam4")!=-1){
  131. cam4();
  132. return;
  133. }
  134. if (pageurl.indexOf("flirt4free.com")!=-1){
  135. f4f();
  136. return;
  137. }
  138. if (pageurl.indexOf("xlovecam.com")!=-1){
  139. xlovecam();
  140. return;
  141. }
  142. if (pageurl.indexOf("eplay.com")!=-1){
  143. eplay();
  144. return;
  145. }
  146. }
  147.  
  148. function sinparty(){
  149. var scripts=document.getElementsByTagName("script");
  150. var preload="";
  151. for (n=0; n<scripts.length; n++){
  152. if (scripts[n].innerHTML.indexOf("var CREATOR_DATA =")!=-1){
  153. preload=scripts[n].innerHTML;
  154. break;
  155. }
  156. }
  157. if (preload==""){streamate();return;}
  158. var user=preload.split('user_hash":"')[1].split('"')[0];
  159. var url="https://api.sinparty.com/v2/web/live-cams/web-rtc/"+user;
  160. fetch(url,{ credentials: "same-origin"}).then(
  161. function(response){
  162. if (response.status !== 200){
  163. return;
  164. }
  165. response.json().then(function(roomdata) {
  166. playlist=roomdata.data.playback_url;
  167. document.getElementById("popitup1").style.display="block";
  168. document.getElementById("popitup").innerHTML=playlist;
  169. });
  170. });
  171. }
  172.  
  173. function eplay(){
  174. if(pageurl.split("/")[3]==""){return;}
  175. if(pageurl.split("/")[3]=="cams"){return;}
  176. var initial=document.getElementById("__NEXT_DATA__").innerHTML;
  177. var url=initial.split('manifest":"')[1].split('"')[0];
  178. fetch(url,{ credentials: "same-origin"}).then(
  179. function(response) {
  180. if (response.status !== 200){
  181. return;
  182. }
  183. response.json().then(function(roomdata) {
  184. playlist=roomdata.formats["mp4-hls"].manifest;
  185. document.getElementById("popitup1").style.display="block";
  186. document.getElementById("popitup").innerHTML="<div style='font-size:10px'>"+playlist+"</div>";
  187. });
  188. });
  189. }
  190.  
  191. function showup(){
  192. var scripts=document.getElementsByTagName("script");
  193. var preload="";
  194. for (n=0; n<scripts.length; n++){
  195. if (scripts[n].innerHTML.indexOf("var csrfToken =")==0){
  196. preload=scripts[n].innerHTML;
  197. break;
  198. }
  199. }
  200. var cdn1=preload.split("stormStreamingAddr = '")[1].split("'")[0];
  201. var cdn2=preload.split("transcoderAddr = '")[1].split("'")[0];
  202. var id=preload.split("streamID = '")[1].split("'")[0];
  203. playlist="https://"+cdn1+"/h5live/http/playlist.m3u8?url=rtmp%3A%2F%2F"+cdn2+"%3A1935%2Fwebrtc&stream="+id+"_aac&cid=713.675&pid=9.281.485.628";
  204. document.getElementById("popitup1").style.display="block";
  205. document.getElementById("popitup").innerHTML=playlist;
  206. }
  207.  
  208. function olecams(){
  209. var modelnr=parseInt(document.querySelector('[property="og:image"]').getAttribute("content").split("/")[5]);
  210. var url="https://apiv2.olecams.com/rooms/connect";
  211. fetch(url,{
  212. headers: {"Content-Type": "application/json",},
  213. credentials: "same-origin",
  214. method: "POST",
  215. body: JSON.stringify({"id":modelnr,"mode":"free","nick":null,"afno":null,"sitemode":"REGISTERED","paymenttype":null,"ttl":1800})
  216. }).then(
  217. function(response) {
  218. if (response.status !== 200){
  219. return;
  220. }
  221. response.json().then(function(roomdata) {
  222. var manifesturl=roomdata.message.manifest+"?&accessToken="+roomdata.message.accessToken;
  223. olecams2(manifesturl);
  224. });
  225. });
  226. }
  227. function olecams2(url){
  228. fetch(url,{ credentials: "same-origin"}).then(
  229. function(response) {
  230. if (response.status !== 200){
  231. return;
  232. }
  233. response.json().then(function(roomdata) {
  234. playlist=roomdata.formats["mp4-hls"].encodings[2].pageurl;
  235. document.getElementById("popitup1").style.display="block";
  236. document.getElementById("popitup").innerHTML=playlist;
  237. });
  238. });
  239. }
  240.  
  241. function dreamcam(){
  242. var model=pageurl.split("/")[4];
  243. var url="https://bss.dreamcamtrue.com/api/clients/v1/broadcasts/models/"+model+"?partnerId=dreamcam_oauth2&show-hidden=true&stream-types=video2D";
  244. fetch(url,{ credentials: "same-origin"}).then(
  245. function(response) {
  246. if (response.status !== 200){
  247. return;
  248. }
  249. response.json().then(function(roomdata) {
  250. playlist=roomdata.streams[1].url;
  251. if (playlist==null){return;}
  252. document.getElementById("popitup1").style.display="block";
  253. document.getElementById("popitup").innerHTML=playlist;
  254. });
  255. });
  256. }
  257.  
  258. function chaturbate(){
  259. var model=pageurl.split("/")[3];
  260. if (model==""){return;}
  261. var url="https://chaturbate.com/api/chatvideocontext/"+model+"/";
  262. fetch(url,{ credentials: "same-origin"}).then(
  263. function(response) {
  264. if (response.status !== 200){
  265. return;
  266. }
  267. response.json().then(function(roomdata) {
  268. playlist=roomdata.hls_source.split("?")[0];
  269. if (playlist==""){return;}
  270. if (roomdata.cmaf_edge){
  271. playlist=playlist.replace(".m3u8","_sfm4s.m3u8");
  272. playlist=playlist.replace("live-edge","live-fhls");
  273. }
  274. document.getElementById("popitup1").style.display="block";
  275. document.getElementById("popitup").innerHTML=playlist;
  276. });
  277. });
  278.  
  279. }
  280.  
  281. function mfc(){
  282. var model=pageurl.split("#")[1];
  283. var jsonfile="https://api-edge.myfreecams.com/usernameLookup/"+model;
  284. fetch(jsonfile,{ credentials: "same-origin"}).then(
  285. function(response){
  286. if (response.status !== 200){
  287. return;
  288. }
  289. response.json().then(function(roomdata) {
  290. var modelnr=roomdata.result.user.id;
  291. var videoserver=roomdata.result.user.sessions[0].server_name;
  292. var phase=roomdata.result.user.sessions[0].phase;
  293. mfc2(modelnr,videoserver,phase);
  294. });
  295. });
  296. }
  297. function mfc2(modelnr,videoserver,phase){
  298. modelnr=modelnr+100000000;
  299. var servernr=videoserver.split("ideo")[1];
  300. playlist="https://edgevideo.myfreecams.com/llhls/NxServer/"+servernr+"/ngrp:mfc_"+phase+modelnr+".f4v_cmaf/playlist.m3u8?nc=0.6190622874050598&v=1.97.23";
  301. fetch(playlist,{ credentials: "same-origin"}).then(
  302. function(response) {
  303. if (response.status !== 200) {
  304. return;
  305. }
  306. response.text().then(function(data) {
  307. var chunk="chunklist"+data.split("chunklist")[1].split("m3u8")[0]+"m3u8";
  308. playlist="https://"+videoserver+".myfreecams.com/NxServer/ngrp:mfc_"+phase+modelnr+".f4v_cmaf/"+chunk+"?nc=0.813118007341&v=1.96";
  309. document.getElementById("popitup1").style.display="block";
  310. document.getElementById("popitup").innerHTML=playlist;
  311. });
  312. });
  313. }
  314.  
  315. function xlovecam(){
  316. var initial =document.getElementById("app-data").innerHTML;
  317. var playdata=initial.split('"hlsPlaylistFree":"')[1].split('"')[0];
  318. var playdatachop=playdata.split("\\");
  319. playlist=playdatachop.join("");
  320. document.getElementById("popitup1").style.display="block";
  321. document.getElementById("popitup").innerHTML=playlist;
  322. }
  323.  
  324. function f4f(){
  325. var modelnr=document.getElementById("bodyTag").getAttribute("data-current-model-id");
  326. var jsonfile="https://www.flirt4free.com/ws/chat/get-stream-urls.php?model_id="+modelnr;
  327. fetch(jsonfile,{ credentials: "same-origin"}).then(
  328. function(response){
  329. if (response.status !== 200){
  330. return;
  331. }
  332. response.json().then(function(roomdata) {
  333. playlist="https:"+roomdata.data.hls[0].url;
  334. document.getElementById("popitup1").style.display="block";
  335. document.getElementById("popitup").innerHTML=playlist;
  336. });
  337. });
  338.  
  339. }
  340.  
  341. function bongacams(){
  342. var initial=document.querySelector('[data-type="initialState"]').innerHTML;
  343. var model=initial.split('"username":"')[1].split('"')[0];
  344. var edge="live-"+initial.split("mobile-")[1].split(".com")[0];
  345. playlist="https://"+edge+".com/hls/stream_"+model+"/playlist.m3u8";
  346. document.getElementById("popitup1").style.display="block";
  347. document.getElementById("popitup").innerHTML=playlist;
  348. }
  349.  
  350. function cam4(){
  351. var model=pageurl.split("/")[3];
  352. var jsonfile="https://cam4.com/rest/v1.0/profile/"+model+"/streamInfo";
  353. fetch(jsonfile,{ credentials: "same-origin"}).then(
  354. function(response){
  355. if (response.status !== 200){
  356. return;
  357. }
  358. response.json().then(function(roomdata) {
  359. playlist=roomdata.cdnURL;
  360. document.getElementById("popitup1").style.display="block";
  361. document.getElementById("popitup").innerHTML=playlist;
  362. });
  363. });
  364. }
  365.  
  366. function streamate(){
  367. var model=pageurl.split("/")[4];
  368. var jsonfile="https://manifest-server.naiadsystems.com/live/s:"+model+".json";
  369. fetch(jsonfile,{ credentials: "same-origin"}).then(
  370. function(response){
  371. if (response.status !== 200){
  372. return;
  373. }
  374. response.json().then(function(roomdata) {
  375. playlist=roomdata.formats["mp4-hls"].manifest.split("?")[0];
  376. document.getElementById("popitup1").style.display="block";
  377. document.getElementById("popitup").innerHTML=playlist;
  378. });
  379. });
  380. }
  381.  
  382. function streamray(){
  383. if (document.getElementsByTagName("video").length==0){return;}
  384. var model=pageurl.split("/")[3].split("#")[0].toLowerCase();
  385. if (model==""){return;}
  386. if (model=="webcam"){return;}
  387. playlist="https://camscdn.cams.com/camscdn/cdn-"+model+".m3u8";
  388. document.getElementById("popitup1").style.display="block";
  389. document.getElementById("popitup").innerHTML=playlist;
  390. }
  391.  
  392. function camsoda(){
  393. var scripts=document.getElementsByTagName("script");
  394. var preload="";
  395. for (n=0; n<scripts.length; n++){
  396. if (scripts[n].innerHTML.indexOf("window.__PRELOADED_STATE__ =")==0){
  397. preload=scripts[n].innerHTML;
  398. break;
  399. }
  400. }
  401. var edge=preload.split('"edge_servers":["')[1].split('"')[0];
  402. var streamname=preload.split('"stream_name":"')[1].split('"')[0];
  403. var token=preload.split('"token":"')[1].split('"')[0];
  404. playlist="https://"+edge+"/"+streamname+"_v1/index.m3u8?token="+token;
  405. document.getElementById("popitup1").style.display="block";
  406. document.getElementById("popitup").innerHTML=playlist;
  407. }
  408.  
  409. function stripchat(){
  410. var modelnumber=parseInt(document.querySelector('[property="og:image"]').getAttribute("content").split("/")[5].split("_webp")[0]);
  411. if (isNaN(modelnumber)){return;}
  412. if (modelnumber < 1000){return;}
  413. playlist="https://edge-hls.doppiocdn.com/hls/"+modelnumber+"/master/"+modelnumber+"_auto.m3u8";
  414. document.getElementById("popitup1").style.display="block";
  415. document.getElementById("popitup").innerHTML=playlist;
  416. }
  417.  
  418. function makepopitup(){
  419. var popstyle="color:black;z-index:100000;top:10px;left:10px;box-shadow:0px 0px 32px rgba(0, 0, 0, 0.32);border-radius:4px;border:1px solid rgb(221, 221, 221);background-color:rgb(200, 200, 200);position:fixed; display:none; white-space: pre-line; text-align: left; line-height: 1.4; height: auto; width:500px; padding: 10px 10px 10px 10px; box-sizing: border-box; overflow-wrap: break-word; word-break: break-word; padding: 15px;";
  420. var newelem=document.createElement('span');
  421. newelem.setAttribute("style", popstyle);
  422. newelem.id="popitup1";
  423. var newdiv=document.createElement('div');
  424. newdiv.id="popitup";
  425. newelem.appendChild(newdiv);
  426. newdiv=document.createElement('div');
  427. newdiv.innerHTML="\n(Close)";
  428. newdiv.style.float="left";
  429. newdiv.style.cursor="pointer";
  430. newdiv.addEventListener("click", close );
  431. newelem.appendChild(newdiv);
  432. newdiv=document.createElement('div');
  433. newdiv.id="closecopy";
  434. newdiv.innerHTML="\n(Close and copy to clipbord)";
  435. newdiv.style.float="right";
  436. newdiv.style.cursor="pointer";
  437. newdiv.addEventListener("click", closecopy );
  438. newelem.appendChild(newdiv);
  439. document.getElementsByTagName("body")[0].appendChild(newelem);
  440. }
  441.  
  442. function closecopy(){
  443. navigator.clipboard.writeText(playlist);
  444. document.getElementById("popitup1").style.display="none";
  445. }
  446.  
  447. function close(){
  448. document.getElementById("popitup1").style.display="none";
  449. }
  450.  
  451. })();