فهرست منبع

Add configuration file, make script installable

Cammy 7 سال پیش
والد
کامیت
d5f07e0bcd
10فایلهای تغییر یافته به همراه89 افزوده شده و 136 حذف شده
  1. 0 49
      cComments.py
  2. 0 31
      cMain.py
  3. 0 5
      looper.sh
  4. 0 0
      pyinstalive/__init__.py
  5. 9 0
      pyinstalive/__main__.py
  6. 11 12
      pyinstalive/auth.py
  7. 30 39
      pyinstalive/downloader.py
  8. 0 0
      pyinstalive/logger.py
  9. 4 0
      pyinstalive/pyinstalive.ini
  10. 35 0
      pyinstalive/pyinstalive.py

+ 0 - 49
cComments.py

@@ -1,49 +0,0 @@
-import time
-import json
-import codecs
-from socket import timeout, error as SocketError
-from ssl import SSLError
-from urllib2 import URLError
-from httplib import HTTPException
-from instagram_private_api import ClientError
-
-import cLogger
-
-
-def get_live(api, broadcast, record, first_comment_created_at=0):
-		comments_collected = comments
-
-		before_count = len(comments_collected)
-		try:
-			comments_res = api.broadcast_comments(
-				broadcast['id'], last_comment_ts=first_comment_created_at)
-			comments = comments_res.get('comments', [])
-			first_comment_created_at = (
-				comments[0]['created_at_utc'] if comments else int(time.time() - 5))
-
-			after_count = len(comments_collected)
-			if after_count > before_count:
-				# save intermediately to avoid losing comments due to unexpected errors
-				broadcast = broadcast.copy()
-				broadcast.pop('segments', None)     # save space
-				broadcast['comments'] = comments_collected
-				with open((record + "_" + str(broadcast['id']) + "_" + str(int(t)) + '.json'), 'w') as outfile:
-					json.dump(broadcast, outfile, indent=2)
-			comments = comments_collected
-
-		except (SSLError, timeout, URLError, HTTPException, SocketError) as e:
-			cLogger.log("Error", "RED")
-			# Probably transient network error, ignore and continue
-			# self.logger.warning('Comment collection error: %s' % e)
-		except ClientError as e:
-			if e.code == 500:
-				cLogger.log("500" "RED")
-				# self.logger.warning('Comment collection ClientError: %d %s' % (e.code, e.error_response))
-			elif e.code == 400 and not e.msg:   # 400 error fail but no error message
-				cLogger.log("400 no msg" "RED")
-				# self.logger.warning('Comment collection ClientError: %d %s' % (e.code, e.error_response))
-			else:
-				raise e
-		finally:
-			time.sleep(4)
-		return first_comment_created_at

+ 0 - 31
cMain.py

@@ -1,31 +0,0 @@
-import argparse
-import codecs
-import datetime
-import logging
-import os.path
-import sys, os, time, json
-
-import cAuthCookie, cLogger, cDownloader, cComments
-
-from httplib import HTTPException
-from instagram_private_api_extensions import live
-from socket import error as SocketError
-from socket import timeout
-from ssl import SSLError
-from urllib2 import URLError
-
-logging.disable(logging.CRITICAL)
-
-global api, args, seperator
-
-parser = argparse.ArgumentParser(description='Login')
-parser.add_argument('-u', '--username', dest='username', type=str, required=True)
-parser.add_argument('-p', '--password', dest='password', type=str, required=True)
-parser.add_argument('-r', '--record', dest='record', type=str, required=True)
-
-args = parser.parse_args()
-
-api = cAuthCookie.login(args.username, args.password)
-
-
-cDownloader.main(api, args.record)

+ 0 - 5
looper.sh

@@ -1,5 +0,0 @@
-while true
-do
-python cMain.py -u "naxunaw" -p "pyinstalive" -r "milliebobbybrown"
-sleep 10
-done

+ 0 - 0
pyinstalive/__init__.py


+ 9 - 0
pyinstalive/__main__.py

@@ -0,0 +1,9 @@
+import pyinstalive
+
+
+def main():
+    pyinstalive.run()
+
+
+if __name__ == '__main__':
+    pyinstalive.run()

+ 11 - 12
cAuthCookie.py → pyinstalive/auth.py

@@ -1,9 +1,8 @@
 import codecs
 import codecs
-import datetime
 import json
 import json
 import os.path
 import os.path
 
 
-import cLogger
+import logger
 
 
 try:
 try:
     from instagram_private_api import (
     from instagram_private_api import (
@@ -39,12 +38,12 @@ def onlogin_callback(api, settings_file):
     cache_settings = api.settings
     cache_settings = api.settings
     with open(settings_file, 'w') as outfile:
     with open(settings_file, 'w') as outfile:
         json.dump(cache_settings, outfile, default=to_json)
         json.dump(cache_settings, outfile, default=to_json)
-        cLogger.log('[I] New settings file was made: {0!s}'.format(settings_file), "GREEN")
+        logger.log('[I] New settings file was made: {0!s}'.format(settings_file), "GREEN")
 
 
 
 
 def login(username, password):
 def login(username, password):
-    cLogger.log('PYINSTALIVE DOWNLOADER (SCRIPT v{0!s})'.format(scriptVersion), "GREEN")
-    cLogger.seperator("GREEN")
+    logger.log('PYINSTALIVE DOWNLOADER (SCRIPT v{0!s})'.format(scriptVersion), "GREEN")
+    logger.seperator("GREEN")
 
 
     device_id = None
     device_id = None
     try:
     try:
@@ -52,7 +51,7 @@ def login(username, password):
         settings_file = "credentials.json"
         settings_file = "credentials.json"
         if not os.path.isfile(settings_file):
         if not os.path.isfile(settings_file):
             # settings file does not exist
             # settings file does not exist
-            cLogger.log('[W] Unable to find settings file: {0!s}'.format(settings_file), "YELLOW")
+            logger.log('[W] Unable to find settings file: {0!s}'.format(settings_file), "YELLOW")
 
 
             # login new
             # login new
             api = Client(
             api = Client(
@@ -61,7 +60,7 @@ def login(username, password):
         else:
         else:
             with open(settings_file) as file_data:
             with open(settings_file) as file_data:
                 cached_settings = json.load(file_data, object_hook=from_json)
                 cached_settings = json.load(file_data, object_hook=from_json)
-            # cLogger.log('[I] Using settings file: {0!s}'.format(settings_file), "GREEN")
+            # logger.log('[I] Using settings file: {0!s}'.format(settings_file), "GREEN")
 
 
             device_id = cached_settings.get('device_id')
             device_id = cached_settings.get('device_id')
             # reuse auth settings
             # reuse auth settings
@@ -70,7 +69,7 @@ def login(username, password):
                 settings=cached_settings)
                 settings=cached_settings)
 
 
     except (ClientCookieExpiredError, ClientLoginRequiredError) as e:
     except (ClientCookieExpiredError, ClientLoginRequiredError) as e:
-        cLogger.log('[E] ClientCookieExpiredError/ClientLoginRequiredError: {0!s}'.format(e), "RED")
+        logger.log('[E] ClientCookieExpiredError/ClientLoginRequiredError: {0!s}'.format(e), "RED")
 
 
         # Login expired
         # Login expired
         # Do relogin but use default ua, keys and such
         # Do relogin but use default ua, keys and such
@@ -80,17 +79,17 @@ def login(username, password):
             on_login=lambda x: onlogin_callback(x, settings))
             on_login=lambda x: onlogin_callback(x, settings))
 
 
     except ClientLoginError as e:
     except ClientLoginError as e:
-        cLogger.log('[E] ClientLoginError: {0!s}'.format(e), "RED")
+        logger.log('[E] ClientLoginError: {0!s}'.format(e), "RED")
         sys.exit(9)
         sys.exit(9)
     except ClientError as e:
     except ClientError as e:
-        cLogger.log('[E] ClientError: {0!s}'.format(e), "RED")
+        logger.log('[E] ClientError: {0!s}'.format(e), "RED")
         sys.exit(9)
         sys.exit(9)
     except Exception as e:
     except Exception as e:
-        cLogger.log('[E] Unexpected Exception: {0!s}'.format(e), "RED")
+        logger.log('[E] Unexpected Exception: {0!s}'.format(e), "RED")
         sys.exit(99)
         sys.exit(99)
 
 
     # Show when login expires
     # Show when login expires
     # cookie_expiry = api.cookie_jar.expires_earliest
     # cookie_expiry = api.cookie_jar.expires_earliest
     # print('[I] Cookie Expiry: {0!s}'.format(datetime.datetime.fromtimestamp(cookie_expiry).strftime('%Y-%m-%dT%H:%M:%S')), "WHITE")
     # print('[I] Cookie Expiry: {0!s}'.format(datetime.datetime.fromtimestamp(cookie_expiry).strftime('%Y-%m-%dT%H:%M:%S')), "WHITE")
-    cLogger.log('[I] Login to "' + username + '" OK!', "GREEN")
+    logger.log('[I] Login to "' + username + '" OK!', "GREEN")
     return api
     return api

+ 30 - 39
cDownloader.py → pyinstalive/downloader.py

@@ -1,28 +1,18 @@
-import argparse
 import codecs
 import codecs
-import datetime
-import json
 import logging
 import logging
-import os.path
-import threading
-
-from socket import error as SocketError
+import sys, time
 from socket import timeout
 from socket import timeout
-from ssl import SSLError
-from urllib2 import URLError
-
-import cLogger, cComments
-import sys, os, time
-
-from httplib import HTTPException
 from instagram_private_api_extensions import live
 from instagram_private_api_extensions import live
 
 
+import logger
+
 class NoBroadcastException(Exception):
 class NoBroadcastException(Exception):
 	pass
 	pass
 
 
-def main(apiArg, recordArg):
+def main(apiArg, recordArg, savePathArg):
 	global api
 	global api
 	global record
 	global record
+	global savePath
 	global isRecording
 	global isRecording
 	global currentDate
 	global currentDate
 	global currentTime
 	global currentTime
@@ -33,6 +23,7 @@ def main(apiArg, recordArg):
 	isRecording = False
 	isRecording = False
 	api = apiArg
 	api = apiArg
 	record = recordArg
 	record = recordArg
+	savePath = savePathArg
 	getUserInfo(record)
 	getUserInfo(record)
 
 
 def recordStream(broadcast):
 def recordStream(broadcast):
@@ -45,7 +36,7 @@ def recordStream(broadcast):
 				   or broadcast.get('dash_abr_playback_url')
 				   or broadcast.get('dash_abr_playback_url')
 				   or broadcast['dash_playback_url'])
 				   or broadcast['dash_playback_url'])
 
 
-		outputDir = '{}_{}_{}_{}_downloads/'.format(currentDate ,record, broadcast['id'], currentTime)
+		outputDir = savePath + '\{}_{}_{}_{}_downloads'.format(currentDate ,record, broadcast['id'], currentTime)
 
 
 		dl = live.Downloader(
 		dl = live.Downloader(
 			mpd=mpd_url,
 			mpd=mpd_url,
@@ -57,8 +48,8 @@ def recordStream(broadcast):
 			mpd_download_timeout=10,
 			mpd_download_timeout=10,
 			download_timeout=10)
 			download_timeout=10)
 	except Exception as e:
 	except Exception as e:
-		cLogger.log('[E] Could not start recording broadcast: ' + str(e), "RED")
-		cLogger.seperator("GREEN")
+		logger.log('[E] Could not start recording broadcast: ' + str(e), "RED")
+		logger.seperator("GREEN")
 		sys.exit(0)
 		sys.exit(0)
 
 
 	try:
 	try:
@@ -67,31 +58,31 @@ def recordStream(broadcast):
 		started_label = '%d minutes and ' % started_mins
 		started_label = '%d minutes and ' % started_mins
 		if started_secs:
 		if started_secs:
 			started_label += '%d seconds' % started_secs
 			started_label += '%d seconds' % started_secs
-		cLogger.log('[I] Starting broadcast recording:', "GREEN")
+		logger.log('[I] Starting broadcast recording:', "GREEN")
 		last_stream = open("last_stream.html", "w")
 		last_stream = open("last_stream.html", "w")
 		last_stream.write('<b>Username:</b> {}<br><b>MPD URL:</b> <a href="{}">LINK</a><br><b>Viewers:</b> {}<br><b>Missing:</b> {}'
 		last_stream.write('<b>Username:</b> {}<br><b>MPD URL:</b> <a href="{}">LINK</a><br><b>Viewers:</b> {}<br><b>Missing:</b> {}'
 			.format(record, mpd_url, str(int(viewers)), started_label))
 			.format(record, mpd_url, str(int(viewers)), started_label))
 		last_stream.close()
 		last_stream.close()
-		cLogger.log('[I] Username    : ' + record, "GREEN")
-		cLogger.log('[I] MPD URL     : ' + mpd_url, "GREEN")
+		logger.log('[I] Username    : ' + record, "GREEN")
+		logger.log('[I] MPD URL     : ' + mpd_url, "GREEN")
 		printStatus(api, broadcast)
 		printStatus(api, broadcast)
-		cLogger.log('[I] Recording broadcast...', "GREEN")
+		logger.log('[I] Recording broadcast...', "GREEN")
 		dl.run()
 		dl.run()
 		stitchVideo(dl, broadcast)
 		stitchVideo(dl, broadcast)
 	except KeyboardInterrupt:
 	except KeyboardInterrupt:
-		cLogger.log('', "GREEN")
-		cLogger.log('[I] Aborting broadcast recording...', "GREEN")
+		logger.log('', "GREEN")
+		logger.log('[I] Aborting broadcast recording...', "GREEN")
 		if not dl.is_aborted:
 		if not dl.is_aborted:
 			dl.stop()
 			dl.stop()
 			stitchVideo(dl, broadcast)
 			stitchVideo(dl, broadcast)
 
 
 def stitchVideo(dl, broadcast):
 def stitchVideo(dl, broadcast):
 		isRecording = False
 		isRecording = False
-		cLogger.log('[I] Stitching downloaded files into video...', "GREEN")
-		output_file = '{}_{}_{}_{}.mp4'.format(currentDate ,record, broadcast['id'], currentTime)
+		logger.log('[I] Stitching downloaded files into video...', "GREEN")
+		output_file = savePath + '\{}_{}_{}_{}.mp4'.format(currentDate ,record, broadcast['id'], currentTime)
 		dl.stitch(output_file, cleartempfiles=False)
 		dl.stitch(output_file, cleartempfiles=False)
-		cLogger.log('[I] Successfully stitched downloaded files!', "GREEN")
-		cLogger.seperator("GREEN")
+		logger.log('[I] Successfully stitched downloaded files!', "GREEN")
+		logger.seperator("GREEN")
 		sys.exit(0)
 		sys.exit(0)
 
 
 def getUserInfo(record):
 def getUserInfo(record):
@@ -100,27 +91,27 @@ def getUserInfo(record):
 		user_id = user_res['user']['pk']
 		user_id = user_res['user']['pk']
 		getBroadcast(user_id)
 		getBroadcast(user_id)
 	except Exception as e:
 	except Exception as e:
-		cLogger.log('[E] Could not get user info for "' + record + '" : ' + str(e), "RED")
-		cLogger.seperator("GREEN")
+		logger.log('[E] Could not get user info for "' + record + '" : ' + str(e), "RED")
+		logger.seperator("GREEN")
 		sys.exit(0)
 		sys.exit(0)
 
 
 
 
 def getBroadcast(user_id):
 def getBroadcast(user_id):
 	try:
 	try:
-		cLogger.log('[I] Checking broadcast for "' + record + '"...', "GREEN")
+		logger.log('[I] Checking broadcast for "' + record + '"...', "GREEN")
 		broadcast = api.user_broadcast(user_id)
 		broadcast = api.user_broadcast(user_id)
 		if (broadcast is None):
 		if (broadcast is None):
 			raise NoBroadcastException('No broadcast available.')
 			raise NoBroadcastException('No broadcast available.')
 		else:
 		else:
 			recordStream(broadcast)
 			recordStream(broadcast)
 	except NoBroadcastException as e:
 	except NoBroadcastException as e:
-		cLogger.log('[W] ' + str(e), "YELLOW")
-		cLogger.seperator("GREEN")
+		logger.log('[W] ' + str(e), "YELLOW")
+		logger.seperator("GREEN")
 		sys.exit(0)
 		sys.exit(0)
 	except Exception as e:
 	except Exception as e:
 		if (e.__name__ is not NoBroadcastException):
 		if (e.__name__ is not NoBroadcastException):
-			cLogger.log('[E] Could not get broadcast info: ' + str(e), "RED")
-			cLogger.seperator("GREEN")
+			logger.log('[E] Could not get broadcast info: ' + str(e), "RED")
+			logger.seperator("GREEN")
 			sys.exit(0)
 			sys.exit(0)
 
 
 def printStatus(api, broadcast):
 def printStatus(api, broadcast):
@@ -130,7 +121,7 @@ def printStatus(api, broadcast):
 	started_label = '%d minutes and ' % started_mins
 	started_label = '%d minutes and ' % started_mins
 	if started_secs:
 	if started_secs:
 		started_label += '%d seconds' % started_secs
 		started_label += '%d seconds' % started_secs
-	cLogger.log('[I] Viewers     : ' + str(int(viewers)) + " watching", "GREEN")
-	cLogger.log('[I] Airing time : ' + started_label, "GREEN")
-	cLogger.log('[I] Status      : ' + heartbeat_info['broadcast_status'].title(), "GREEN")
-	cLogger.log('', "GREEN")
+	logger.log('[I] Viewers     : ' + str(int(viewers)) + " watching", "GREEN")
+	logger.log('[I] Airing time : ' + started_label, "GREEN")
+	logger.log('[I] Status      : ' + heartbeat_info['broadcast_status'].title(), "GREEN")
+	logger.log('', "GREEN")

+ 0 - 0
cLogger.py → pyinstalive/logger.py


+ 4 - 0
pyinstalive/pyinstalive.ini

@@ -0,0 +1,4 @@
+[pyinstalive]
+username = naxunaw
+password = pyinstalive
+save_path = C:\Users\Hopper\Documents\Git\PyInstaLive\.downloads

+ 35 - 0
pyinstalive/pyinstalive.py

@@ -0,0 +1,35 @@
+import argparse
+import logging
+import os.path
+import configparser
+import sys
+import auth, downloader, logger
+
+
+def run():
+	logging.disable(logging.CRITICAL)
+	config = configparser.ConfigParser()
+
+	if os.path.exists('pyinstalive.ini'):
+		try:
+			config.read('pyinstalive.ini')
+		except Exception as e:
+			logger.log("[E] Could not read configuration file! Try passing the required arguments manually.", "RED")
+	else:
+		logger.log("[E] Could not find configuration file! Exiting...", "RED")
+		sys.exit(0)
+
+
+	parser = argparse.ArgumentParser(description='Login')
+	parser.add_argument('-u', '--username', dest='username', type=str, required=False)
+	parser.add_argument('-p', '--password', dest='password', type=str, required=False)
+	parser.add_argument('-r', '--record', dest='record', type=str, required=True)
+
+	args = parser.parse_args()
+
+	if (args.username is not None) and (args.password is not None):
+		api = auth.login(args.username, args.password)
+	else:
+		api = auth.login(config['pyinstalive']['username'], config['pyinstalive']['password'])
+
+	downloader.main(api, args.record, config['pyinstalive']['save_path'])