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

49 lines
1.5 KiB
Python

#!/usr/bin/env python3
# -*- encoding: utf-8 -*-
import filetype
import shutil
import json
import os
class DownloadedData(object):
def __init__(self):
self.control = list()
self.fb = dict()
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)