# Cam4 Remote Anonymous STREAMLINK Recorder v.1.0.8 by horacio9a for Python 2.7.14 import sys, os, urllib, urllib3, ssl, re, time, datetime, command urllib3.disable_warnings() from urllib3 import PoolManager reload(sys) sys.setdefaultencoding('utf-8') from colorama import init, Fore, Back, Style from termcolor import colored import ConfigParser config = ConfigParser.ConfigParser() config.read('config.cfg') init() print(colored('\n => START <=', 'yellow', 'on_blue')) if __name__=='__main__': import sys model = sys.argv[1] url ='https://www.cam4.com/{}'.format(model) user_agent = {'user-agent': 'Mozilla/5.0 (Android; Mobile; rv:14.0) ..'} http = urllib3.PoolManager(10, headers=user_agent) r = http.urlopen('GET',url) enc = (r.data) dec=urllib.unquote(enc).decode() state0 = dec.split("showState: '")[1] state = state0.split("'")[0] if len(state) > 0: try: age0 = dec.split('Age:</')[1] age1 = age0.split('</')[0] age = age1.split('">')[1] except: age = '-' try: loc0 = dec.split('Location:</')[1] loc1 = loc0.split('</')[0] loc2 = loc1.split('">')[1] loc3 = re.sub(',', '', loc2) loc = re.sub(' ', '', loc3) except: loc = '-' try: sta0 = dec.split('Status:</')[1] sta1 = sta0.split('</')[0] sta = sta1.split('">')[1] except: sta = '-' try: room0 = dec.split('room":"')[1] room = room0.split('"')[0] except: room = '-' try: ms0 = dec.split('Member since:</')[1] ms1 = ms0.split('</')[0] ms2 = ms1.split('">')[1] ms3 = re.sub(' ', '-', ms2) ms = re.sub(',', '', ms3) except: ms = '-' try: eth0 = dec.split('Ethnicity:</')[1] eth1 = eth0.split('</')[0] eth2 = eth1.split('">')[1] eth = re.sub(' ', '', eth2) except: eth = '-' vpu0 = dec.split('videoPlayUrl":"')[1] vpu = vpu0.split('"')[0] if len(vpu) > 80: print(colored('\n => TRY AGAIN <=', 'yellow','on_blue')) time.sleep(3) print(colored('\n => END <=', 'yellow','on_blue')) time.sleep(1) sys.exit() else: pass wcdn = vpu.split('-')[1] print (colored('\n => Room: ({}) * State: ({}) * Member since: ({}) <=', 'white', 'on_blue')).format(room,state,ms) print (colored('\n => Age: ({}) * Location: ({}) * Status: ({}) * Ethnic: ({}) <=', 'yellow', 'on_blue')).format(age,loc,sta,eth) hlsurl1 = 'https://lwcdn-{}.cam4.com/cam4-origin-live/ngrp:{}_all/playlist.m3u8'.format(wcdn,vpu) hlsurl2 = 'https://lwcdn-{}.cam4.com/cam4-origin-live/amlst:{}_aac/playlist.m3u8'.format(wcdn,vpu) hlsurl = 'https://lwcdn-{}.cam4.com/cam4-origin-live/{}_aac/playlist.m3u8'.format(wcdn,vpu) hls_url0 = dec.split("hlsUrl: '")[1] hls_url1 = hls_url0.split("'")[0] hls_url2 = hls_url1.split('live/')[1] hls_url = hls_url2.split('/')[0] print (colored('\n => Play URL => {} <=', 'yellow', 'on_blue')).format(hls_url) timestamp = str(time.strftime('%d%m%Y-%H%M%S')) path = config.get('folders', 'output_folder') streamlink = config.get('files', 'streamlink') filename = room + '_C4_' + timestamp + '.mp4' pf = path + filename print (colored('\n => SL-REC >>> {} <<<', 'yellow', 'on_red')).format(filename) print command = ('{} hls://"{}" best -Q -o "{}"'.format(streamlink,hlsurl,pf)) os.system(command) print(colored('\n => END <=', 'yellow','on_blue')) sys.exit() else: print (colored('\n => Model ({}) is OFFLINE or ERROR name <=', 'white', 'on_red')).format(model) time.sleep(3) print(colored('\n => END <=', 'yellow','on_blue')) time.sleep(1) sys.exit()