reddit-image-wall-getter/reddit_imgs/system/downloader/downloadedData.py

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)