#!/usr/bin/env python3 # -*- encoding: utf-8 -*- import os import re import json import shutil import datetime def readAllFile(s): with open(s) as f: return f.read() def slugify(dat): return re.sub(r'[^\w\s\.\-\(\)\[\]]', '-', dat) wdir = os.path.abspath('.') def main(): idir = os.path.join(wdir, 'i') ddir = os.path.join(wdir, 'd') subreddits = sorted(filter(lambda sr: os.path.isdir(os.path.join(wdir,'r',sr)), os.listdir(os.path.join(wdir,'r')))) subreddits = list(zip( subreddits, map( lambda a: a['links'], map( json.loads, map( readAllFile, map( lambda sr: os.path.join(wdir,'r',sr,'subreddit.json'), subreddits )))), map( lambda sr: os.path.join(wdir,'d',sr), subreddits ) )) copyfiles = list() print('\r'+' '*79+'\r'+'Calculating changes...',end='') for subreddit, links, target in subreddits: sdir = os.path.join(ddir,subreddit) for link in links: imgd = os.path.join(idir, link['datakey']) meta = os.path.join(imgd, 'meta.json') if os.path.exists(meta): files = json.loads(readAllFile(meta)) for seq, file in enumerate(files): imgfrom = os.path.join(imgd, file['dname']) imgfn = '' imgfn+= subreddit imgfn+= '__' imgfn+= datetime.datetime.fromtimestamp(int(link['timestamp'])).isoformat().replace('T','_').replace(':','-') imgfn+= '_' imgfn+= 'nsfw' if link['nsfw'] else 'safe' imgfn+= '___' imgfn+= '-' if link['flair'] is None else slugify(link['flair']) imgfn+= '___' imgfn+= '-' if link['sharer'] is None else slugify(link['sharer']) imgfn+= '___' imgfn+= slugify(link['title'][:50]) imgfn+= '___' imgfn+= slugify(link['datakey']) imgfn+= '___' imgfn+= str('%04d'%seq) imgfn+= '.'+file['ext'] imgto = os.path.join(sdir,imgfn) copyfiles.append((imgfrom,imgto)) del links lcf = len(copyfiles) for (cnt, (src, dst)) in enumerate(copyfiles): if os.path.exists(dst): continue container = os.path.dirname(os.path.abspath(dst)) if not os.path.exists(container): os.makedirs(container) print('\r'+' '*79+'\r'+'%03d%% copied: %05d of %05d'%((((cnt+1)/lcf)*100)//1, cnt+1, lcf),end='') try: shutil.copyfile(src, dst) except KeyboardInterrupt as e: print() print('\r'+' '*79+'\r'+'Deleting interrupted file...',end='') os.remove(dst) print('\r'+' '*79+'\r'+'Aborted safely',end='') print() raise e print('\r'+' '*79+'\r'+'Done.',end='') print() if __name__ == '__main__': main()