#!/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)