68 lines
2.2 KiB
Python
68 lines
2.2 KiB
Python
#! /usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
# vim:fenc=utf-8
|
|
#
|
|
# Copyright © 2018 jpk <jpk+dev@goatpr0n.de>
|
|
#
|
|
# Distributed under terms of the MIT license.
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
import os
|
|
import requests
|
|
from progress.spinner import Spinner
|
|
from progress.bar import FillingSquaresBar as Bar
|
|
|
|
|
|
class SbeamReceiver(object):
|
|
|
|
def __init__(self, host):
|
|
self.host = host
|
|
self._headers = {'User-Agent': 'sbeam'}
|
|
self.url = f'http://{host}:8080'
|
|
self.superlist()
|
|
|
|
def superlist(self):
|
|
url = f'{self.url}/superlist'
|
|
with requests.get(f'{self.url}/superlist',
|
|
headers=self._headers) as response:
|
|
assert response.status_code == 200
|
|
self.filelist = response.text.split('\n')
|
|
try:
|
|
self._total_bytes = 0
|
|
for item in self.filelist:
|
|
self._total_bytes += int(item.split('||')[1])
|
|
finally:
|
|
return len(self.filelist) - 1
|
|
|
|
def save_stream(self, filename, chunk_size=16392):
|
|
with requests.get(f'{self.url}/getstream', stream=True,
|
|
headers=self._headers) as response:
|
|
assert response.status_code == 200
|
|
with open(filename, 'wb') as handle:
|
|
for chunk in Bar('Downloading',
|
|
max=self._total_bytes/chunk_size) \
|
|
.iter(response.iter_content(chunk_size=chunk_size)):
|
|
handle.write(chunk)
|
|
|
|
|
|
def split_stream(self, data, directory):
|
|
with open(data, 'rb') as blob:
|
|
for item in self.filelist:
|
|
if not item:
|
|
break
|
|
filename, filesize, filepath, timestamp = item.split('||')
|
|
fullpath = os.path.join(directory, filepath[1:])
|
|
os.makedirs(fullpath, exist_ok=True)
|
|
print(f'Unpacking {filename} ({filesize} bytes)...')
|
|
with open(os.path.join(fullpath, filename), 'wb') as handle:
|
|
handle.write(blob.read(int(filesize)))
|
|
|
|
|
|
if __name__ == '__main__':
|
|
sbeam_rec = SbeamReceiver('192.168.178.50')
|
|
sbeam_rec.save_stream('data.gz')
|
|
sbeam_rec.split_stream('data.gz', 'received')
|