64 lines
2.1 KiB
Python
64 lines
2.1 KiB
Python
#!/usr/bin/env python3
|
|
# -*- encoding: utf-8 -*-
|
|
|
|
import filetype
|
|
import shutil
|
|
import json
|
|
import os
|
|
|
|
class DownloadedData(object):
|
|
def __init__(self, loadfrom = None):
|
|
self.initialize()
|
|
self.loadfrom(loadfrom)
|
|
def initialize(self):
|
|
self.control = list()
|
|
self.fb = dict()
|
|
def loadfrom(self,loadfrom):
|
|
if loadfrom:
|
|
with open(os.path.join(loadfrom,'meta.json')) as f:
|
|
self.control = json.loads(f.read())
|
|
for ctrl in self.control:
|
|
fnm = ctrl['dname']
|
|
cnt = b''
|
|
with open(os.path.join(loadfrom,fnm),'rb') as f:
|
|
cnt = f.read()
|
|
self.fb[fnm] = cnt
|
|
def storedLinks(self):
|
|
return [ctrl['link'] for ctrl in self.control]
|
|
def put(self, link, downloaded, ext=None):
|
|
if ext is None:
|
|
try:
|
|
ext = link.rsplit('/',1)[-1].rsplit('.',1)[-1]
|
|
if ext not in ['jpg','png','gif','webp']:
|
|
raise Exception
|
|
except:
|
|
ext = filetype.guess_extension(downloaded)
|
|
if ext is None:
|
|
ext = 'unk'
|
|
fnm = '%04d.%s'%(len(self.control),ext)
|
|
self.control.append({
|
|
'dname': fnm,
|
|
'link':link,
|
|
'ext':ext,
|
|
})
|
|
self.fb[fnm] = downloaded
|
|
def into(self, directory):
|
|
directory = os.path.abspath(directory)
|
|
if not os.path.exists(directory):
|
|
os.makedirs(directory)
|
|
try:
|
|
with open(os.path.join(directory,'meta.json'),'w') as f:
|
|
f.write(json.dumps(self.control, sort_keys=True, indent=2))
|
|
for fnm, dtb in self.fb.items():
|
|
with open(os.path.join(directory,fnm),'wb') as f:
|
|
f.write(dtb)
|
|
except KeyboardInterrupt as e:
|
|
shutil.rmtree(directory)
|
|
raise e
|
|
def merge(self, other):
|
|
for oitem in other.control:
|
|
self.put(oitem['link'], other.fb[oitem['dname']], oitem['ext'])
|
|
def bulk_merge(self, others):
|
|
for other in others:
|
|
self.merge(other)
|