Initial commit
0 parents
Showing
16 changed files
with
432 additions
and
0 deletions
push/__init__.py
0 → 100644
File mode changed
push/__pycache__/config.cpython-36.pyc
0 → 100644
No preview for this file type
push/__pycache__/taskmanage.cpython-36.pyc
0 → 100644
No preview for this file type
push/config.py
0 → 100644
| 1 | #!/x/app/python3/bin/python3 | ||
| 2 | # -*- coding: utf-8 -*- | ||
| 3 | |||
| 4 | PATH={ | ||
| 5 | 'SLICE_OUTPUT': "/storage/SliceFiles/m3u8/", | ||
| 6 | 'CDN_SOURCE': "/storage/m3u8/", | ||
| 7 | 'LOG_PATH': "task.log" | ||
| 8 | } | ||
| 9 | |||
| 10 | URL={ | ||
| 11 | 'GET': "http://172.0.31.15:9085/leviathan.admin/FileTask/getTask", | ||
| 12 | 'SLICE_POST': "http://172.0.31.15:9085/leviathan.admin/FileTask/sliceNotify", | ||
| 13 | 'PUSH_POST':"http://172.0.31.15:9085/leviathan.admin/FileTask/sourceCdnPublishNotify" | ||
| 14 | } | ||
| 15 | |||
| 16 | SERVERID={ | ||
| 17 | 'ID':"1" | ||
| 18 | } |
push/keepfree.sh
0 → 100644
| 1 | #!/bin/bash | ||
| 2 | |||
| 3 | #保留文件数 | ||
| 4 | ReservedNum=7 | ||
| 5 | FileDir="/data/bak /data/bak2" | ||
| 6 | date=$(date "+%Y%m%d-%H%M%S") | ||
| 7 | |||
| 8 | |||
| 9 | for i in $FileDir | ||
| 10 | do | ||
| 11 | FileNum=$(ls -l $i|grep ^d |wc -l) | ||
| 12 | while(( $FileNum > $ReservedNum)) | ||
| 13 | do | ||
| 14 | OldFile=$(ls -rt $i| head -1) | ||
| 15 | echo $date "Delete File:"$OldFile | ||
| 16 | rm -rf $i/$OldFile | ||
| 17 | let "FileNum--" | ||
| 18 | done | ||
| 19 | |||
| 20 | done |
push/pushott.py
0 → 100644
| 1 | #!/x/app/python3/bin/python3 | ||
| 2 | # -*- coding: utf-8 -*- | ||
| 3 | import os | ||
| 4 | import re | ||
| 5 | import config | ||
| 6 | import socket | ||
| 7 | import taskmanage | ||
| 8 | import logging | ||
| 9 | |||
| 10 | logging.basicConfig(level=logging.DEBUG, | ||
| 11 | format='%(asctime)s %(filename)s %(levelname)s %(message)s', | ||
| 12 | datefmt='%a, %d %b %Y %H:%M:%S', | ||
| 13 | filename=config.PATH["LOG_PATH"], | ||
| 14 | filemode='a+') | ||
| 15 | |||
| 16 | class PushTasks: | ||
| 17 | #初始化属性,导入配置 | ||
| 18 | def __init__(self): | ||
| 19 | self.__GetUrl=config.URL["GET"] | ||
| 20 | self.__Post_Push_Url=config.URL["PUSH_POST"] | ||
| 21 | self.__outPath = config.PATH["SLICE_OUTPUT"] | ||
| 22 | self.__CDNPath = config.PATH["CDN_SOURCE"] | ||
| 23 | self.__serverID = config.SERVERID["ID"] | ||
| 24 | self.__header = {"Content-Type": "application/json-rpc"} | ||
| 25 | |||
| 26 | #判断奇偶,判断运行主机 | ||
| 27 | def job_balance(self,num): | ||
| 28 | int(num) | ||
| 29 | if (num % 2 == self.__serverID): | ||
| 30 | return True | ||
| 31 | else: | ||
| 32 | return False | ||
| 33 | |||
| 34 | |||
| 35 | |||
| 36 | #检查输入文件是否存在 | ||
| 37 | def check_file(self,inputfile): | ||
| 38 | if os.path.exists(inputfile): | ||
| 39 | return (True,"") | ||
| 40 | else: | ||
| 41 | return (False,"丢失切片文件:{0}.".format(inputfile)) | ||
| 42 | |||
| 43 | #复制迁移 | ||
| 44 | def mv_CDN(self,url): | ||
| 45 | base=os.path.basename(url) | ||
| 46 | fileName=os.path.splitext(base)[0] | ||
| 47 | pattern=re.compile(r'\d+-\d+-\d+') | ||
| 48 | directory = pattern.findall(url) | ||
| 49 | pushPath=config.PATH["SLICE_OUTPUT"]+directory[0]+"/"+fileName | ||
| 50 | CDNPath=config.PATH["CDN_SOURCE"]+directory[0]+"/"+fileName | ||
| 51 | try: | ||
| 52 | os.makedirs(CDNPath) | ||
| 53 | except Exception as e: | ||
| 54 | logging.debug(str(e)) | ||
| 55 | logging.debug("cp -vrf {0} {1}".format(pushPath,CDNPath)) | ||
| 56 | os.system("cp -vrf {0} {1}".format(pushPath,CDNPath)) | ||
| 57 | |||
| 58 | |||
| 59 | #主程序 | ||
| 60 | def main(address): | ||
| 61 | while 1<2: | ||
| 62 | Job=PushTasks() | ||
| 63 | pushJob=taskmanage.TaskManage() | ||
| 64 | #get方法接任务 | ||
| 65 | try: | ||
| 66 | ResponseGet=pushJob.get_request(config.URL["GET"],"?start=0&limit=1&status=500&source_cdn_status=0") | ||
| 67 | except Exception as e: | ||
| 68 | logging.error(str(e)) | ||
| 69 | continue | ||
| 70 | resultSet=ResponseGet['resultSet'] | ||
| 71 | if resultSet: | ||
| 72 | pass | ||
| 73 | else: | ||
| 74 | continue | ||
| 75 | #获取任务ID,待发布文件目录 | ||
| 76 | TaskId=ResponseGet['resultSet'][0]['task_id'] | ||
| 77 | url=ResponseGet['resultSet'][0]['url'] | ||
| 78 | resultm3u8=Job.check_file(config.PATH["SLICE_OUTPUT"]+os.path.splitext(url)[0]) | ||
| 79 | if resultm3u8[0]: | ||
| 80 | pass | ||
| 81 | else: | ||
| 82 | try: | ||
| 83 | pushJob.change_push_status(config.URL["PUSH_POST"],TaskId,-1,address,resultm3u8[1]) | ||
| 84 | logging.error(resultm3u8[1]) | ||
| 85 | except Exception as e: | ||
| 86 | logging.error(str(e)) | ||
| 87 | continue | ||
| 88 | continue | ||
| 89 | #改任务状态为发布中 | ||
| 90 | try: | ||
| 91 | pushJob.change_push_status(config.URL["PUSH_POST"],TaskId,10,address,"") | ||
| 92 | except Exception as e: | ||
| 93 | logging.error(str(e)) | ||
| 94 | continue | ||
| 95 | Job.mv_CDN(url) | ||
| 96 | #改任务状态为发布完成 | ||
| 97 | try: | ||
| 98 | pushJob.change_push_status(config.URL["PUSH_POST"],TaskId,100,address,"") | ||
| 99 | except Exception as e: | ||
| 100 | logging.error(str(e)) | ||
| 101 | continue | ||
| 102 | |||
| 103 | #实例化 | ||
| 104 | if __name__ == '__main__': | ||
| 105 | address=socket.gethostbyname(socket.getfqdn(socket.gethostname())) | ||
| 106 | try: | ||
| 107 | main(address) | ||
| 108 | except Exception as e: | ||
| 109 | pushJob.change_push_status(config.URL["PUSH_POST"],TaskId,-1,address,str(e)) | ||
| 110 | logging.error(str(e)) |
push/taskmanage.py
0 → 100644
| 1 | #!/x/app/python3/bin/python3 | ||
| 2 | # -*- coding: utf-8 -*- | ||
| 3 | import urllib.request | ||
| 4 | import urllib.parse | ||
| 5 | import urllib.error | ||
| 6 | import json | ||
| 7 | |||
| 8 | |||
| 9 | class TaskManage: | ||
| 10 | |||
| 11 | def __init__(self): | ||
| 12 | self.__header = {"Content-Type": "application/json-rpc"} | ||
| 13 | |||
| 14 | |||
| 15 | #get请求 | ||
| 16 | def get_request(self,GetUrl,Param): | ||
| 17 | request = urllib.request.Request(GetUrl+Param) | ||
| 18 | result = urllib.request.urlopen(request).read().decode('utf-8') | ||
| 19 | json=eval(result) | ||
| 20 | return json | ||
| 21 | |||
| 22 | #post请求 | ||
| 23 | def post_request(self,PostUrl,data): | ||
| 24 | request = urllib.request.Request(PostUrl,json.dumps(data).encode('utf-8'),self.__header) | ||
| 25 | result = urllib.request.urlopen(request).read().decode('utf-8') | ||
| 26 | |||
| 27 | #改切片状态 | ||
| 28 | def change_slice_status(self,PostUrl,TaskId,Status,slice_server,slice_error_desc): | ||
| 29 | data={"task_id" : TaskId, "status": Status, "slice_server": slice_server, "slice_error_desc": slice_error_desc} | ||
| 30 | return self.post_request(PostUrl,data) | ||
| 31 | |||
| 32 | #改发布状态 | ||
| 33 | def change_push_status(self,PostUrl,TaskId,Status,slice_server,source_cdn_error_desc): | ||
| 34 | data={"task_id" : TaskId, "source_cdn_status": Status, "source_cdn_server": slice_server,"source_cdn_error_desc":source_cdn_error_desc} | ||
| 35 | return self.post_request(PostUrl,data) |
sliceJob/__init__.py
0 → 100644
File mode changed
sliceJob/__pycache__/config.cpython-36.pyc
0 → 100644
No preview for this file type
No preview for this file type
sliceJob/config.py
0 → 100644
| 1 | #!/x/app/python3/bin/python3 | ||
| 2 | # -*- coding: utf-8 -*- | ||
| 3 | |||
| 4 | PATH={ | ||
| 5 | 'SLICE_OUTPUT': "/storage/SliceFiles/m3u8/", | ||
| 6 | 'SLICE_INPUT': "/storage/smp/download/ts/", | ||
| 7 | 'ZIP_PACKAGE': "/storage/SliceFiles/zip/", | ||
| 8 | 'LOG_PATH': "task.log" | ||
| 9 | } | ||
| 10 | |||
| 11 | URL={ | ||
| 12 | 'GET': "http://172.0.31.15:9085/leviathan.admin/FileTask/getTask", | ||
| 13 | 'SLICE_POST': "http://172.0.31.15:9085/leviathan.admin/FileTask/sliceNotify", | ||
| 14 | 'PUSH_POST':"http://172.0.31.15:9085/leviathan.admin/FileTask/sourceCdnPublishNotify" | ||
| 15 | } | ||
| 16 | |||
| 17 | SERVERID={ | ||
| 18 | 'ID':"1" | ||
| 19 | } |
sliceJob/keepfree.sh
0 → 100644
| 1 | #!/bin/bash | ||
| 2 | |||
| 3 | #保留文件数 | ||
| 4 | ReservedNum=7 | ||
| 5 | FileDir="/data/bak /data/bak2" | ||
| 6 | date=$(date "+%Y%m%d-%H%M%S") | ||
| 7 | |||
| 8 | |||
| 9 | for i in $FileDir | ||
| 10 | do | ||
| 11 | FileNum=$(ls -l $i|grep ^d |wc -l) | ||
| 12 | while(( $FileNum > $ReservedNum)) | ||
| 13 | do | ||
| 14 | OldFile=$(ls -rt $i| head -1) | ||
| 15 | echo $date "Delete File:"$OldFile | ||
| 16 | rm -rf $i/$OldFile | ||
| 17 | let "FileNum--" | ||
| 18 | done | ||
| 19 | |||
| 20 | done |
sliceJob/slice.log
0 → 100644
File mode changed
sliceJob/slice.py
0 → 100644
| 1 | #!/x/app/python3/bin/python3 | ||
| 2 | # -*- coding: utf-8 -*- | ||
| 3 | import taskmanage | ||
| 4 | import os | ||
| 5 | import re | ||
| 6 | import ffmpy3 | ||
| 7 | import socket | ||
| 8 | import config | ||
| 9 | import logging | ||
| 10 | import time | ||
| 11 | |||
| 12 | logging.basicConfig(level=logging.DEBUG, | ||
| 13 | format='%(asctime)s %(filename)s %(levelname)s %(message)s', | ||
| 14 | datefmt='%a, %d %b %Y %H:%M:%S', | ||
| 15 | filename=config.PATH["LOG_PATH"], | ||
| 16 | filemode='a+') | ||
| 17 | |||
| 18 | |||
| 19 | class FfmpegTasks: | ||
| 20 | #初始化属性,导入配置 | ||
| 21 | def __init__(self): | ||
| 22 | self.__GetUrl=config.URL["GET"] | ||
| 23 | self.__Post_Slice_Url=config.URL["SLICE_POST"] | ||
| 24 | self.__Post_Push_Url=config.URL["PUSH_POST"] | ||
| 25 | self.__outputPath = config.PATH["SLICE_OUTPUT"] | ||
| 26 | self.__inputPath = config.PATH["SLICE_INPUT"] | ||
| 27 | self.__zipPath = config.PATH["ZIP_PACKAGE"] | ||
| 28 | self.__serverID = int(config.SERVERID["ID"]) | ||
| 29 | |||
| 30 | #判断奇偶,判断运行主机 | ||
| 31 | def job_balance(self,num): | ||
| 32 | int(num) | ||
| 33 | if (num % 2 == self.__serverID): | ||
| 34 | return True | ||
| 35 | else: | ||
| 36 | return False | ||
| 37 | |||
| 38 | #检查输入文件是否存在 | ||
| 39 | def check_file(self,filetype,inputfile): | ||
| 40 | if os.path.isfile(inputfile): | ||
| 41 | return (True,"") | ||
| 42 | else: | ||
| 43 | return (False,"丢失{0}文件:{1}.".format(filetype,inputfile)) | ||
| 44 | |||
| 45 | |||
| 46 | #切片 | ||
| 47 | def slice_task(self,inputfile): | ||
| 48 | #get方法获取输入文件名,去后缀 | ||
| 49 | base=os.path.basename(inputfile) | ||
| 50 | fileName=os.path.splitext(base)[0] | ||
| 51 | #正则匹配日期字符 | ||
| 52 | pattern=re.compile(r'\d+-\d+-\d+') | ||
| 53 | directory = pattern.findall(inputfile) | ||
| 54 | #拼接输出目录 | ||
| 55 | outputPath=self.__outputPath + directory[0] +'/'+ fileName +'/' | ||
| 56 | #拼接打包目录 | ||
| 57 | zipPath=self.__zipPath+directory[0] +'/' | ||
| 58 | #创建输出目录 | ||
| 59 | try: | ||
| 60 | os.makedirs(outputPath) | ||
| 61 | except Exception as e: | ||
| 62 | logging.debug(str(e)) | ||
| 63 | #创建zip包目录 | ||
| 64 | try: | ||
| 65 | os.makedirs(zipPath) | ||
| 66 | except Exception as e: | ||
| 67 | logging.debug(str(e)) | ||
| 68 | #拼接输出文件名 | ||
| 69 | outputfile=outputPath+fileName+'%03d.ts' | ||
| 70 | #封装ffmpeg 命令 | ||
| 71 | ff = ffmpy3.FFmpeg( | ||
| 72 | inputs={self.__inputPath+inputfile: None}, | ||
| 73 | outputs={outputfile: '-c copy -map 0 -f segment -segment_list {0} -segment_time 10'.format(outputPath + "playlist.m3u8")}) | ||
| 74 | #执行命令 | ||
| 75 | logging.info("start slice {0}".format(self.__inputPath+inputfile)) | ||
| 76 | ff.run() | ||
| 77 | logging.info("finish slice {0}".format(self.__inputPath+inputfile)) | ||
| 78 | #返回输出打包目录,输出目录 | ||
| 79 | return (self.__zipPath+directory[0] +'/'+ fileName+".zip",outputPath) | ||
| 80 | |||
| 81 | #打zip包 | ||
| 82 | def zip_m3u8(self,Pathzip,outputPath): | ||
| 83 | logging.info("start zip {0}".format(outputPath)) | ||
| 84 | os.system("zip -jr {0} {1}".format(Pathzip,outputPath)) | ||
| 85 | logging.info("finish zip {0}".format(outputPath)) | ||
| 86 | |||
| 87 | |||
| 88 | #主程序 | ||
| 89 | def main(address): | ||
| 90 | while 1<2: | ||
| 91 | Job=FfmpegTasks() | ||
| 92 | pushJob=taskmanage.TaskManage() | ||
| 93 | #改200状态: 200=待切片 300=切片中 301=切片失败 500=全部完成 | ||
| 94 | #get方法接任务 | ||
| 95 | try: | ||
| 96 | ResponseGet=pushJob.get_request(config.URL["GET"],"?start=0&limit=1&status=200") | ||
| 97 | except Exception as e: | ||
| 98 | logging.error(str(e)) | ||
| 99 | continue | ||
| 100 | #获取任务ID,待切片文件目录 | ||
| 101 | resultSet=ResponseGet['resultSet'] | ||
| 102 | if resultSet: | ||
| 103 | pass | ||
| 104 | else: | ||
| 105 | time.sleep(30) | ||
| 106 | continue | ||
| 107 | TaskId=ResponseGet['resultSet'][0]['task_id'] | ||
| 108 | inputfile=ResponseGet['resultSet'][0]['url'] | ||
| 109 | #检查download文件状态 | ||
| 110 | resultDownload=Job.check_file("download",config.PATH["SLICE_INPUT"]+inputfile) | ||
| 111 | if resultDownload[0]: | ||
| 112 | pass | ||
| 113 | else: | ||
| 114 | try: | ||
| 115 | pushJob.change_slice_status(config.URL["SLICE_POST"],TaskId,305,address,resultDownload[1]) | ||
| 116 | logging.error(resultDownload[1]) | ||
| 117 | except Exception as e: | ||
| 118 | logging.error(str(e),resultDownload[1]) | ||
| 119 | break | ||
| 120 | continue | ||
| 121 | #改任务状态为切片中 | ||
| 122 | try: | ||
| 123 | pushJob.change_slice_status(config.URL["SLICE_POST"],TaskId,300,address,'') | ||
| 124 | except Exception as e: | ||
| 125 | logging.error(str(e)) | ||
| 126 | continue | ||
| 127 | #执行切片 | ||
| 128 | try: | ||
| 129 | outPut=Job.slice_task(inputfile) | ||
| 130 | #改任务状态为切片完成 | ||
| 131 | #try: | ||
| 132 | # pushJob.change_slice_status(config.URL["SLICE_POST"],TaskId,500,address,'') | ||
| 133 | #except Exception as e: | ||
| 134 | # logging.error(str(e)) | ||
| 135 | # break | ||
| 136 | except Exception as e: | ||
| 137 | try: | ||
| 138 | pushJob.change_slice_status(config.URL["SLICE_POST"],TaskId,305,address,'') | ||
| 139 | except Exception as e: | ||
| 140 | logging.error(str(e)) | ||
| 141 | continue | ||
| 142 | |||
| 143 | #打包 | ||
| 144 | try: | ||
| 145 | Job.zip_m3u8(outPut[0],outPut[1]) | ||
| 146 | #改任务状态为待发布 | ||
| 147 | try: | ||
| 148 | pushJob.change_slice_status(config.URL["SLICE_POST"],TaskId,500,address,'') | ||
| 149 | except Exception as e: | ||
| 150 | logging.error(str(e)) | ||
| 151 | continue | ||
| 152 | except Exception as e: | ||
| 153 | try: | ||
| 154 | pushJob.change_slice_status(config.URL["SLICE_POST"],TaskId,305,address,'') | ||
| 155 | except Exception as e: | ||
| 156 | logging.error(str(e)) | ||
| 157 | continue | ||
| 158 | |||
| 159 | #检查zip文件状态 | ||
| 160 | resultZip=Job.check_file("zip",outPut[0]) | ||
| 161 | if resultZip[0]: | ||
| 162 | pass | ||
| 163 | else: | ||
| 164 | try: | ||
| 165 | pushJob.change_slice_status(config.URL["SLICE_POST"],TaskId,305,address,resultZip[1]) | ||
| 166 | logging.error(resultZip[1]) | ||
| 167 | except Exception as e: | ||
| 168 | logging.error(str(e)) | ||
| 169 | continue | ||
| 170 | continue | ||
| 171 | |||
| 172 | #实例化 | ||
| 173 | if __name__ == '__main__': | ||
| 174 | address="172.25.50.2" | ||
| 175 | main(address) |
sliceJob/task.log
0 → 100644
This diff could not be displayed because it is too large.
sliceJob/taskmanage.py
0 → 100644
| 1 | #!/x/app/python3/bin/python3 | ||
| 2 | # -*- coding: utf-8 -*- | ||
| 3 | import urllib.request | ||
| 4 | import urllib.parse | ||
| 5 | import urllib.error | ||
| 6 | import json | ||
| 7 | |||
| 8 | |||
| 9 | class TaskManage: | ||
| 10 | |||
| 11 | def __init__(self): | ||
| 12 | self.__header = {"Content-Type": "application/json-rpc"} | ||
| 13 | |||
| 14 | |||
| 15 | #get请求 | ||
| 16 | def get_request(self,GetUrl,Param): | ||
| 17 | request = urllib.request.Request(GetUrl+Param) | ||
| 18 | result = urllib.request.urlopen(request).read().decode('utf-8') | ||
| 19 | json=eval(result) | ||
| 20 | return json | ||
| 21 | |||
| 22 | #post请求 | ||
| 23 | def post_request(self,PostUrl,data): | ||
| 24 | request = urllib.request.Request(PostUrl,json.dumps(data).encode('utf-8'),self.__header) | ||
| 25 | result = urllib.request.urlopen(request).read().decode('utf-8') | ||
| 26 | |||
| 27 | #改切片状态 | ||
| 28 | def change_slice_status(self,PostUrl,TaskId,Status,slice_server,slice_error_desc): | ||
| 29 | data={"task_id" : TaskId, "status": Status, "slice_server": slice_server, "slice_error_desc": slice_error_desc} | ||
| 30 | return self.post_request(PostUrl,data) | ||
| 31 | |||
| 32 | #改发布状态 | ||
| 33 | def change_push_status(self,PostUrl,TaskId,Status,slice_server,source_cdn_error_desc): | ||
| 34 | data={"task_id" : TaskId, "source_cdn_status": Status, "source_cdn_server": slice_server,"source_cdn_error_desc":source_cdn_error_desc} | ||
| 35 | return self.post_request(PostUrl,data) |
-
Please register or sign in to post a comment