#!/usr/bin/python # thingiverse ripper # 201029091824 # Simon Kirkby # tigger@interthingy.com from threading import Thread,Lock import os,string,re,uuid,urllib import random,time import sqlite3 #fields for the database columns = ['ftype','timestamp','uuid','id','name','author','path','url','sha','parent','container','antecendant','status','processed','description','fsize','colsize'] values = ['',0.0,'','','','','','','','','','',0,0,'',0,''] class thing: def __init__(self,sdb,parent=''): self.timestamp = time.time() self.uuid = str(uuid.uuid4()) self.id = 0 self.name = '' self.author = '' self.url = '' self.path = '' self.processed = 0 self.parent = parent self.container = '' self.sha = '' self.antecendant = '' self.ftype = '' self.children = [] self.loaded = 0 self.data = None self.thumbnail = None self.status = 0 self.description = '' self.fsize = 0 self.colsize = '00FF00101010' self.sdb = sdb self.thumbnail = None def load_data(self,entry): v = vars(self) for i in range(len(columns)): v[columns[i]] = entry[i] def get_table(self): sql = 'create table if not exists things (' for i in range(len(values)): sql = sql+columns[i]+' ' if type(values[i]) == type(''): sql = sql + 'text' if type(values[i]) == type(0): sql = sql + 'int' if type(values[i]) == type(0.0): sql = sql + 'float' sql = sql + ',' sql = sql[:-1] + ');' return sql def check(self,sdb): li = sdb.query('select uuid from things where url ="'+self.url+'";') if len(li) > 0: return False else: return True def insert_line(self,sdb): if self.check(sdb): sql = 'insert into things (' print(self.name), print(self.uuid), print(self.ftype) v = vars(self) k = columns val = v.values() sql = sql + k[0] for i in k[1:]: sql = sql+ ',' + i sql = sql + ') values (' sql = sql + '"'+ v[k[0]] + '"' for i in range(1,len(k)): sql = sql+ ',"' + str(v[k[i]])+'"' sql = sql+');' sdb.query(sql) return True else: #print('\t'+self.name+' exists'), #print(self.url) return False def fetch(self): " override me " if self.path != '': try: os.stat(self.path) print('already have ' + self.path) return True except: if self.url != '': print('get '+self.url) try: u = urllib.urlopen(self.url) d = u.read() f2 = open(self.path,'w') f2.write(d) f2.close() except: return False return True def process(self): " override me " print('process override me'), print(self.ftype) return False def clean(self): " override me " print('clean override me') def preview(self): " override me " if self.processed== 0: rr = '
' elif self.processed== 1: rr = '
' else: rr = '
' if len(self.name) < 30: rr = rr + ''+self.name+'
' else: rr = rr + ''+self.name[:30]+'…
' #if 'jpg' in self.children: if self.thumbnail != None: rr = rr + '' rr = rr + str(self.thumbnail.preview()) rr = rr + '
' if self.author != '': rr = rr + 'by '+self.author+'' rr = rr + ' (' + self.ftype + ')
' rr = rr + '
\n' return rr def view(self): " override me " rr = '

'+str(self.name)+'

' #rr = rr + self.html_list() if self.author !='': rr = rr + '
by '+str(self.author)+'' rr = rr + '
' if 'jpg' in self.children: rr = rr + str(self.children['jpg'][0].preview()) rr = rr + '
' for i in self.children.keys(): rr = rr + '
'+str(i)+'
' for j in self.children[i]: rr = rr + str(j.preview()) rr = rr + '
' rr = rr + '
' if self.url !='': rr = rr + ''+str(self.url)+'' return rr def html_list(self): s = '' v = vars(self) rr = '
    \n' for i in v.keys(): key = str(i) value = str(v[i]) rr = rr + '
  1. '+key+' : '+value+'
  2. \n' rr = rr + '

' return str(rr) def get(self): if self.data == None: try: os.stat(self.path) f = open(self.path) self.data = f.read() f.close() return self.data except: return '' return self.data def __str__(self): s = '' v = vars(self) for i in v.keys(): if i != 'data': key = str(i) value = str(v[i]) s = str(s)+'\t'+key+' : '+value+'\n' return str(s)