Пример #1
0
    def send_request(self):
        if self.status:
            dp = Datapack(head={'from': __name__})
            dp.method = 'get'
            dp.app = 'ffmpeg'
            dp.head['to'] = self.server

            send_queue.put(dp)
Пример #2
0
    def check_id(self):
        '''
        check id package must like
        -------------------------------
        post handshake msw/0.1
        id: [yourID]
        listen_port: [3900]
        length: 0
        
        -------------------------------
        error code list:
        1: not get "id" in head
        2: receive data failed
        3: appname is not handshake
        4: id is yourself
        '''
        data = None
        if self.positive:
            self.send_id()
        try:
            data = self.conn.recv(BUFFSIZE)
        except ConnectionResetError:
            print('One connection failed before ID check')

        if not data:
            return 2, ''

        self.buff += data
        dp = Datapack()
        dp.encode_data = self.buff # maybe here needs to use copy.copy(self.buff)
        self.buff = dp.decode(only_head=True)
        if not dp.head.get('id'):
            return 1, dp.head.get('flag')

        if not dp.app == 'handshake':
            return 3, dp.head.get('flag')

        self.id = dp.head['id']
        self.listen_port = int(dp.head.get('listen_port'))

        if self.id == ID:
            #print('you connect to your self')
            return 4, dp.head.get('flag')

        if ONLYPROXY and not self.id == MYPROXY: # refuce not proxy connection
            return 5, dp.head.get('flag')

        if dp.head.get('onlyuseproxy'):
            if not dp.head['onlyuseproxy'] == ID:
                return 6, dp.head.get('flag')

        if not self.positive:
            self.send_id()

        return 0, dp.head.get('flag')
Пример #3
0
def _main():
    last = ''
    file_flag = False
    while True:
        file_flag = False
        raw_data = input()

        if raw_data == 'restart':
            msw_queue.put(0)
            break
        if raw_data == 'exit':
            msw_queue.put(1)
            break
        if raw_data == 'update':
            raw_data = 'update:compress;update_to:*'
        if raw_data == '1':
            raw_data = 'ffmpeg:autostart'
        if raw_data == '2':
            raw_data = 'ffmpeg:enable;to:*,server:miku'
        if raw_data == 'r':
            raw_data = last

        last = raw_data

        if raw_data[:6] == '(file)':  # like "(file)log: filename.exe"
            raw_data = raw_data[6:]
            file_flag = True

        first_index, last_index = find_index(raw_data)
        app = raw_data[:first_index]
        body = raw_data[last_index:]

        ihead = {}
        if ';' in body and ':' in body:
            ihead_index = body.index(';')
            ihead_str = body[ihead_index + 1:]
            body = body[:ihead_index]

            ihead_list = ihead_str.split(',')
            for key_value in ihead_list:
                key, value = key_value.split(':')
                ihead[key] = value

        app = app.replace(' ', '')
        dp = Datapack(head={'from': __name__})

        dp.head.update(ihead)

        dp.app = app

        if file_flag:
            dp.method = 'file'
            dp.body = b''
            dp.head['filename'] = body

        else:
            dp.body = body.encode()

        send_queue.put(dp)
        print('Command has been sent', dp)
Пример #4
0
 def send_id(self):
     dp = Datapack(head={'from': __name__})
     dp.app = 'handshake'
     if ONLYPROXY:
         dp.head['onlyuseproxy'] = MYPROXY
     dp.head['listen_port'] = str(jsondata.try_to_read_jsondata('listen_port', 3900))
     dp.encode()
     self.conn.sendall(dp.encode_data)
Пример #5
0
    def start_mht(self):
        while True:
            dp = Datapack(head={'from': __name__})
            dp.head['to'] = '*'
            dp.app = 'net'
            dp.method = 'get'
            dp.body = b'mht'

            #print('Send mht request', dp)
            
            send_queue.put(dp)

            time.sleep(10)
Пример #6
0
def main():
    while True:
        dp = receive_queue.get()

        if dp.method == 'post':
            if dp.body == b'compress':
                # compressing file
                print('Starting update')
                compress = Compresser()
                compress.start_compress()
                print('Compress finished')
                
                # getting to destination
                to = dp.head.get('update_to')
                if not to:
                    print('unable to locate update_to')
                    continue

                # sending file
                ndp = Datapack(head={'from':__name__})
                ndp.method = 'file'
                ndp.app = 'update'
                ndp.head['filename'] = 'res/update.tar.xz'
                ndp.head['to'] = to

                send_queue.put(ndp)


        elif dp.method == 'file':
            print('Starting update local file')
            with tarfile.open(dp.head['filename'], 'r:xz') as f:
                f.extractall()
            #os.remove(dp.head['filename'])

            # restart msw program
            msw_queue.put(0)
Пример #7
0
    def receive(self):
        still_need = 0

        while True:
            try:
                data = self.conn.recv(BUFFSIZE)
            except ConnectionResetError:
                break
            except Exception as e:
                print('Connection recv error %s: %s' % (type(e), str(e)))
                break
            if not data:
                break
            self.buff += data
            
            if not still_need:
                dp = Datapack()
                dp.encode_data = self.buff
                try:
                    self.buff = dp.decode(only_head=True)
                    
                    if dp.method == 'file':
                        create_floder(dp.head['filename'])
                        create_floder('tmp/' + dp.head['filename'])
                        self.f = open('tmp/' + dp.head['filename'], 'ab')
                    if dp.method == 'file' and os.path.exists(dp.head['filename']):
                        os.remove(dp.head['filename'])
                        
                except Exception as e:
                    print('Decode head failed %s: %s' % (type(e), str(e)))
                    print(self.buff)
                    break

                length = int(dp.head.get('length'))
                still_need = length
            
            if still_need > len(self.buff):
                # writing tmp data
                if dp.method == 'file':
                    still_need -= self.f.write(self.buff)
                else:
                    dp.body += self.buff
                    still_need -= len(self.buff)
                self.buff = b'' # empty buff because all tmp data has been write

            else: # download complete setuation
                if dp.method == 'file':
                    self.f.write(self.buff[:still_need])
                    self.f.close()
                    self.f = None
                else:
                    dp.body = self.buff[:still_need]
                self.buff = self.buff[still_need:]
                still_need = 0
            
                # bleow code are using to process datapack
                if dp.method == 'file':
                    os.rename('tmp/' + dp.head['filename'], dp.head['filename'])
                    print('Received file %s from %s' % (dp.head['filename'], self.id), dp)
                send_queue.put(dp)

        
        # below code are using to closed connection
        if self.f:
            self.f.close()
            self.f = None
        self.conn.close()
        self.netowrk_controller.del_connection(self)
Пример #8
0
    def mainloop(self):
        _create_floder('res/ffmpeg_tmp')
        _create_floder('res/ffmpeg_finished')
        _create_floder('res/ffmpeg_task')
        _create_floder('res/ffmpeg_old')
        _create_floder('res/ffmpeg_complet')

        while True:
            dp = receive_queue.get()

            if dp.method == 'post' and dp.body == b'concat':
                self.org_filename = dp.head['filename']
                self.object_filename = self.org_filename[:-4] + '.mkv'
                self.concat_func()

            if dp.method == 'post' and dp.body == b'autostart':
                filelist = os.listdir('res/ffmpeg_task')
                self.tasklist = []
                for file in filelist:
                    if len(file) > 3:
                        ext = file[-4:]
                        if ext in ['.mp4', '.MP4', '.mkv', '.MKV']:
                            self.tasklist.append('res/ffmpeg_task/' + file)
                dp = Datapack()
                dp.app = 'ffmpeg'
                dp.body = b'start'
                dp.head['filename'] = self.tasklist.pop(0)
                self.autostart = dp.head['filename']
                send_queue.put(dp)

            if dp.method == 'post' and dp.body == b'start':  # config ffmpeg is server or client
                if dp.head.get('concat'):
                    if dp.head['concat'] == 'true':
                        self.concat = True
                    elif dp.head['concat'] == 'false':
                        self.concat = False
                    else:
                        print('unknown concat value')
                        continue
                else:
                    self.concat = True

                if self.concat:
                    self.org_filename = dp.head['filename']
                    self.object_filename = 'res/ffmpeg_complet/' + os.path.basename(
                        self.org_filename)[:-4] + '.mkv'

                if self.concat:
                    ndp = dp.reply()
                    ndp.body = 'Spliting file %s' % dp.head['filename']
                    ndp.body = ndp.body.encode()
                    send_queue.put(ndp)

                    cmd = 'ffmpeg -i "' + os.path.normpath(
                        dp.head['filename']) + '" -c copy \
                        -f segment -segment_time 20 -reset_timestamps 1 -y \
                        "res/ffmpeg_tmp/' + '%d' + '.mkv"'

                    os.system(cmd)

                self.run_as_server()

                if self.concat:
                    self.concat_func()

                print('All process finished')

            elif dp.method == 'post' and dp.body == b'enable':  # clinet mode
                self.status = 1
                self.server = dp.head['server']
                self.convert_func()

            elif dp.method == 'post' and dp.body == b'status':
                result = 'ffmpeg not working'
                ndp = dp.reply()
                ndp.body = result.encode()

                send_queue.put(ndp)

            elif dp.method == 'get':  # let other client disable
                ndp = dp.reply()
                ndp.method = 'post'
                ndp.body = b'disable'
                print('let %s disabled' % dp.head['id'])

                send_queue.put(ndp)