Ejemplo n.º 1
0
 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'))
Ejemplo n.º 2
0
 def __init__(self, basepath, userid, albumid, gclient):
     self.gclient = gclient
     # 记录相册信息
     self.userid = uni(userid)
     self.albumid = uni(albumid)
     # 检查路径是否存在
     self.basepath = uni(basepath)   # 我们假定配置文件一定是 UTF-8
Ejemplo n.º 3
0
    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'))
Ejemplo n.º 4
0
 def __init__(self, basepath, userid, albumid, gclient):
     self.gclient = gclient
     # 记录相册信息
     self.userid = uni(userid)
     self.albumid = uni(albumid)
     # 检查路径是否存在
     self.basepath = uni(basepath)  # 我们假定配置文件一定是 UTF-8
Ejemplo n.º 5
0
 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)
Ejemplo n.º 6
0
    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)
Ejemplo n.º 7
0
 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)
Ejemplo n.º 8
0
    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)