Skip to content

Instantly share code, notes, and snippets.

@leilux
Last active August 29, 2015 14:06
Show Gist options
  • Save leilux/d166810db3b1f4baf58b to your computer and use it in GitHub Desktop.
Save leilux/d166810db3b1f4baf58b to your computer and use it in GitHub Desktop.
适用于Github Pages的相册模块 http://xpx.droprest.com/lab/Blog.Image/
#!/usr/bin/env python
#coding: utf-8
from fabric.api import local, lcd
from functools import wraps
from urllib2 import quote
from os import path
import json
import time
import osscmd
_bucket = 's-3'
_user = 'blog-photos'
_photos = 'oss://s-3/blog-photos'
def check_res(res, msg=""):
if res.status / 100 == 2:
print '\n'
print "%s OK" % msg
print '\n'
else:
print '\n'
print "%s FAIL" % msg
print "ret:%s" % res.status
print "request-id:%s" % res.getheader("x-oss-request-id")
print "reason:%s" % res.read()
print '\n'
exit(-1)
def update(action=''):
def deco(f):
@wraps(f)
def _(*args, **kwargs):
f(*args, **kwargs)
if action == 'albums':
update_albums()
else:
update_album(args[0])
return _
return deco
@update('albums')
def create_album(name, local_dir=None):
"""create album <usage: create_album:name,local_dir[default=None]>
"""
# create album
# mkdir oss://bucket/dirname/name
local("./osscmd mkdir oss://%s/%s/%s" % (_bucket, _user, name) )
# add_photos to album
if local_dir: add_photo(name, local_dir)
@update('albums')
def delete_album(name):
"""delete album <usage: delete_album:name>
"""
# deleteallobject oss://bucket/[prefix]
local("./osscmd deleteallobject oss://%s/%s/%s" % (_bucket, _user, name) )
# delete album.json
local("./osscmd deleteallobject oss://%s/%s_json/album/%.json" % (_bucket,_user, name) )
@update()
def add_photo(album_name, local_obj):
"""add photo to album <usage: add_photo:album_name, pic|dir>
"""
# TODO 重复处理
if path.isdir(local_obj):
# uploadfromdir localdir oss://bucket/[prefix] --check_point=check_point_file
local('./osscmd uploadfromdir "%s" oss://%s/%s/%s' %\
(local_obj, _bucket,_user,album_name) )
else:
# upload localfile oss://bucket/object --content-type=[content_type]
local('./osscmd multiupload "%s" oss://%s/%s/%s' % \
(local_obj, _bucket,_user,album_name) )
#@update()
#def delete_photo(album, photo):
# """delete photo from album //需要web界面
# """
# # rm oss://bucket/dirname
# local("rm oss://%s/%s/%s/%s" % \
# (_bucket, _user, album, photo) )
#
#
#@update()
#def delete_photos(album, photos):
# """delete photo from album //需要web界面
# """
# pass
#
#@update()
#def delete_all_photos(album):
# """delete photo from album //需要web界面
# """
# # deleteallobject oss://bucket/[prefix]
# local("deleteallobject oss://%s/%s/%s" % \
# (_bucket, _user, album) )
def update_albums():
"""<usage update_album>
update albums.json -> create, delete album
[
{ /* 相册1 */
name: 'web-design',
cover: 'http://xxx.com/d354dfgr.jpg',
intro: '相册描述',
tags: ['design', 'website'],
created: '2014-09-06',
last_update: null,
},
...
]
"""
# listalldir oss://bucket/[prefix]
albums_json = []
oss = osscmd.get_oss()
(object_list, dir_list, marker) = osscmd.GetAllObjects().get_object_dir_in_bucket(
oss, _bucket, '', '%s/'%_user, '/') # unicode
# TODO marker != ''
for album in dir_list:
print 'album: ',album
albums_json.append({
u'name': album.split('/')[1],
u'cover': None,
u'intro': '',
u'tags': [],
u'created': '',
u'last_update': time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()),
})
# upload name.json to oss
res = oss.put_object_from_string(
_bucket,
'%s_json/albums.json'%_user,
json.dumps(albums_json,ensure_ascii=False).encode('utf-8'),
content_type='application/json; charset=utf-8',
headers={'Expires':'max'}
)
check_res(res, 'update albums.json')
def update_album(name):
"""<usage update_album:name>
update album.json -> add, delete photo
[
{ /* 图片1 */
url: 'http://dafdfsa/dsfajl.jpg',
intro: '截图1.jpg',
tags: [],
},
...
]
"""
# listallobject oss://bucket/[prefix]
album_json = []
oss = osscmd.get_oss()
(object_list, marker) = osscmd.GetAllObjects().get_object_in_bucket(
oss, _bucket, '', '/'.join([_user, name]))
# TODO marker != ''
for photo in object_list[1:]:
album_json.append({
'url': 'http://s3.url2io.com/%s'%(quote(photo)),
'intro': '',
'tags': [],
})
# upload name.json to oss
res = oss.put_object_from_string(
_bucket,
'%s_json/album/%s.json'%(_user,name),
json.dumps(album_json),
content_type='application/json; charset=utf-8',
headers={'Expires':'max'}
)
check_res(res, 'update %s.json'%name)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment