def do_init(self): ''' 本来这些代码是放在 __init__ 里面的,但是在 picasasync.py 里面, 需要用到这个类的实例来格式化出错信息,于是就单独提出来了…… 尽情地吐嘈我的渣设计吧 OTZ .... ''' # 直接拉取相册的所有信息 ret = self.gclient.GetPhotos(self.userid, self.albumid) self.user = uni(ret['user']) self.name = uni(ret['name']) self.title = uni(ret['title']) self.photos = ret['photos'] self.count = len(self.photos) # 计算相册路径 self.path = os.path.join(self.user, filter_fs_name( u'%s-%s' % (self.name, self.title) )) self.fullpath = os.path.join(self.basepath, self.path) if not os.path.isdir(self.fullpath): os.makedirs(self.fullpath, mode=0755) # 建立数据库对象 self.db = HashDB(os.path.join(self.fullpath, '.picasaalbum'))
def __init__(self, basepath, userid, albumid, gclient): self.gclient = gclient # 记录相册信息 self.userid = uni(userid) self.albumid = uni(albumid) # 检查路径是否存在 self.basepath = uni(basepath) # 我们假定配置文件一定是 UTF-8
def do_init(self): ''' 本来这些代码是放在 __init__ 里面的,但是在 picasasync.py 里面, 需要用到这个类的实例来格式化出错信息,于是就单独提出来了…… 尽情地吐嘈我的渣设计吧 OTZ .... ''' # 直接拉取相册的所有信息 ret = self.gclient.GetPhotos(self.userid, self.albumid) self.user = uni(ret['user']) self.name = uni(ret['name']) self.title = uni(ret['title']) self.photos = ret['photos'] self.count = len(self.photos) # 计算相册路径 self.path = os.path.join( self.user, filter_fs_name(u'%s-%s' % (self.name, self.title))) self.fullpath = os.path.join(self.basepath, self.path) if not os.path.isdir(self.fullpath): os.makedirs(self.fullpath, mode=0755) # 建立数据库对象 self.db = HashDB(os.path.join(self.fullpath, '.picasaalbum'))
def discover(self, feed, gclient, inverse = False): ''' 解析 feed 所包含的相册列表。 feed 应该是一个包含 userid 与 (optional) albumid 的 字符串,或者是一个元组。其中,元组的第二项是用以过滤相册名 的正则表达式。 返回列表,每个元素是一个包含了 (userid, albumid) 的元组. ''' gclient = gclient.photo # 检查参数 m_test = lambda nm: True if isinstance(feed, list) or isinstance(feed,tuple): regex = re.compile(uni(feed[1])) m_test = lambda nm: regex.search(nm) if len(feed) > 2: inverse = not not feed[2] feed = feed[0] feed = uni(feed) # 解析 feed 来源 feed = self.parse(feed) if feed is None: raise ValueError(u'Invalid feed %s.' % feed) # 如果指定了 albumid,则直接返回 if feed[1] is not None: return ( tuple(feed), ) # 读取所有 Albums ret = [] albums = gclient.GetUserFeed(user=feed[0]) for album in albums.entry: title = uni(album.title.text) pass_test = m_test(title) if inverse: pass_test = not pass_test if pass_test: mid = uni(album.id.text) ret.append( (feed[0], mid[mid.rfind(u'/')+1:]) ) return tuple(ret)
def discover(self, feed, gclient, inverse=False): ''' 解析 feed 所包含的相册列表。 feed 应该是一个包含 userid 与 (optional) albumid 的 字符串,或者是一个元组。其中,元组的第二项是用以过滤相册名 的正则表达式。 返回列表,每个元素是一个包含了 (userid, albumid) 的元组. ''' gclient = gclient.photo # 检查参数 m_test = lambda nm: True if isinstance(feed, list) or isinstance(feed, tuple): regex = re.compile(uni(feed[1])) m_test = lambda nm: regex.search(nm) if len(feed) > 2: inverse = not not feed[2] feed = feed[0] feed = uni(feed) # 解析 feed 来源 feed = self.parse(feed) if feed is None: raise ValueError(u'Invalid feed %s.' % feed) # 如果指定了 albumid,则直接返回 if feed[1] is not None: return (tuple(feed), ) # 读取所有 Albums ret = [] albums = gclient.GetUserFeed(user=feed[0]) for album in albums.entry: title = uni(album.title.text) pass_test = m_test(title) if inverse: pass_test = not pass_test if pass_test: mid = uni(album.id.text) ret.append((feed[0], mid[mid.rfind(u'/') + 1:])) return tuple(ret)
def sync(self): prog_id = 0 gclient = self.gclient for photo in self.photos: prog_id += 1 photo[0] = uni(photo[0]) # 注意我们把 picasa 文件名(utf-8)转换为 unicode # 如若不然,则 Windows 必定会出错! # 检查文件名是否已经下载 if self.db.get(['PIC', photo[1]]) is not None: console.photo_skip(self, photo, prog_id) continue fname = self._get_next_available_filename(filter_fs_name(photo[0])) photo[2] = uni(fname) # 下载文件 try: photo[3] = gclient.DownPhoto(photo[1], os.path.join(self.fullpath, fname) ) except gdata.service.Error: console.photo_load_error(self, photo, prog_id) continue except gdata.photos.service.GooglePhotosException: console.photo_load_error(self, photo, prog_id) continue except IOError: console.photo_io_error(self, photo, prog_id) continue except ValueError: console.photo_zero_error(self, photo, prog_id) continue # 存储文件信息 self.db.put([u'PIC', photo[1]], (time.time(), fname)) self.db.save() console.photo_ok(self, photo, prog_id)
def sync(self): prog_id = 0 gclient = self.gclient for photo in self.photos: prog_id += 1 photo[0] = uni(photo[0]) # 注意我们把 picasa 文件名(utf-8)转换为 unicode # 如若不然,则 Windows 必定会出错! # 检查文件名是否已经下载 if self.db.get(['PIC', photo[1]]) is not None: console.photo_skip(self, photo, prog_id) continue fname = self._get_next_available_filename(filter_fs_name(photo[0])) photo[2] = uni(fname) # 下载文件 try: photo[3] = gclient.DownPhoto( photo[1], os.path.join(self.fullpath, fname)) except gdata.service.Error: console.photo_load_error(self, photo, prog_id) continue except gdata.photos.service.GooglePhotosException: console.photo_load_error(self, photo, prog_id) continue except IOError: console.photo_io_error(self, photo, prog_id) continue except ValueError: console.photo_zero_error(self, photo, prog_id) continue # 存储文件信息 self.db.put([u'PIC', photo[1]], (time.time(), fname)) self.db.save() console.photo_ok(self, photo, prog_id)